ZGlmZiAtLWdpdCBhL0NNYWtlTGlzdHMudHh0IGIvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQxYzY0NQotLS0gL2Rldi9udWxsCisrKyBiL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTEyIEBACisjIFRoaXMgZmlsZSBpcyB0aGUgc291cmNlIGZvciBnZW5lcmF0aW5nIHRoZSBNYWtlZmlsZSBmb3IgdGhlIHByb2plY3QsIHVzaW5nIGNtYWtlIHRvb2wgKGNtYWtlLm9yZykKKworIyBOYW1lIG9mIHRoZSBwcm9qZWN0CitQUk9KRUNUKCJmcmVlRGlhbWV0ZXIiKQorCisjIEluZm9ybWF0aW9ucyB0byBkaXNwbGF5IGluIGRhZW1vbidzIGhlbHAKK1NFVChGRF9QUk9KRUNUX05BTUUgZnJlZURpYW1ldGVyKQorU0VUKEZEX1BST0pFQ1RfQklOQVJZIGZyZWVEaWFtZXRlcmQpCitTRVQoRkRfUFJPSkVDVF9DT1BZUklHSFQgIkNvcHlyaWdodCAoYykgMjAwOC0yMDE1LCBXSURFIFByb2plY3QgKHd3dy53aWRlLmFkLmpwKSBhbmQgTklDVCAod3d3Lm5pY3QuZ28uanApIikKKworIyBWZXJzaW9uIG9mIHRoZSBzb3VyY2UgY29kZQorU0VUKEZEX1BST0pFQ1RfVkVSU0lPTl9NQUpPUiAxKQorU0VUKEZEX1BST0pFQ1RfVkVSU0lPTl9NSU5PUiAyKQorU0VUKEZEX1BST0pFQ1RfVkVSU0lPTl9SRVYgMSkKKworIyBWZXJzaW9uIG9mIHRoZSBBUEkgd2l0aCB0aGUgbGlicmFyeQorU0VUKEZEX1BST0pFQ1RfVkVSU0lPTl9BUEkgNikKKworIyBUaGUgdGVzdCBmcmFtZXdvcmssIHVzaW5nIENUZXN0IGFuZCBDRGFzaC4KK0lOQ0xVREUoQ1Rlc3QpCisKKyMgQ01ha2UgdmVyc2lvbgorQ01BS0VfTUlOSU1VTV9SRVFVSVJFRChWRVJTSU9OIDIuNikKKworIyBMb2NhdGlvbiBvZiBhZGRpdGlvbmFsIENNYWtlIG1vZHVsZXMKK1NFVChDTUFLRV9NT0RVTEVfUEFUSCAke0NNQUtFX01PRFVMRV9QQVRIfSAiJHtDTUFLRV9TT1VSQ0VfRElSfS9jbWFrZS9Nb2R1bGVzLyIpCisKKyMgVGhlIGRlZmF1bHQgZGlyZWN0b3JpZXMKK1NFVChERUZBVUxUX0NPTkZfUEFUSCAke0NNQUtFX0lOU1RBTExfUFJFRklYfS9ldGMvZnJlZURpYW1ldGVyIENBQ0hFIFBBVEggIkRlZmF1bHQgbG9jYXRpb24gb2YgZnJlZURpYW1ldGVyIGNvbmZpZ3VyYXRpb24gZmlsZXMiKQorCitJRiAoTk9UIERFRklORUQgTElCX0lOU1RBTExfRElSKQorU0VUKExJQl9JTlNUQUxMX0RJUiBsaWIgQ0FDSEUgUEFUSCAiRGVmYXVsdCBsaWJyYXJ5IHBhdGggbmFtZSBvbiB0aGUgc3lzdGVtLCB0byBhY2NvbW9kYXRlIFJQTS1iYXNlZCBzeXN0ZW1zIHRoYXQgdXNlIGxpYjY0IikKK0VORElGIChOT1QgREVGSU5FRCBMSUJfSU5TVEFMTF9ESVIpCisKK1NFVChJTlNUQUxMX0hFQURFUlNfU1VGRklYIAkJaW5jbHVkZS9mcmVlRGlhbWV0ZXIgCUNBQ0hFIFBBVEggIkRpcmVjdG9yeSB3aGVyZSB0aGUgaGVhZGVycyBhcmUgaW5zdGFsbGVkIChyZWxhdGl2ZSB0byBDTUFLRV9JTlNUQUxMX1BSRUZJWCkuIikKK1NFVChJTlNUQUxMX0RBRU1PTl9TVUZGSVggCQliaW4gCQkJQ0FDSEUgUEFUSCAiRGlyZWN0b3J5IHdoZXJlIHRoZSBkYWVtb24gYmluYXJ5IGlzIGluc3RhbGxlZCAocmVsYXRpdmUgdG8gQ01BS0VfSU5TVEFMTF9QUkVGSVgpLiIpCitTRVQoSU5TVEFMTF9MSUJSQVJZX1NVRkZJWCAJCSR7TElCX0lOU1RBTExfRElSfSAJCQlDQUNIRSBQQVRIICJEaXJlY3Rvcnkgd2hlcmUgdGhlIGZyZWVEaWFtZXRlciBsaWJyYXJpZXMgYXJlIGluc3RhbGxlZCAocmVsYXRpdmUgdG8gQ01BS0VfSU5TVEFMTF9QUkVGSVgpLiIpCitTRVQoSU5TVEFMTF9FWFRFTlNJT05TX1NVRkZJWCAJJHtMSUJfSU5TVEFMTF9ESVJ9L2ZyZWVEaWFtZXRlcglDQUNIRSBQQVRIICJEaXJlY3Rvcnkgd2hlcmUgdGhlIGV4dGVuc2lvbnMgYXJlIGluc3RhbGxlZCAvIHNlYXJjaGVkIChyZWxhdGl2ZSB0byBDTUFLRV9JTlNUQUxMX1BSRUZJWCkuIikKKworIyBBbGwgc291cmNlIGNvZGUgc2hvdWxkIGJlIFBPU0lYIDIwMDExMkwgY29tcGF0aWJsZSwgYnV0IHNvbWUgb3RoZXIgZXh0ZW5zaW9ucyBtaWdodCBiZSB1c2VkLCBzbzoKK0FERF9ERUZJTklUSU9OUygtRF9HTlVfU09VUkNFKQorCisjIFNldCBhIGRlZmF1bHQgYnVpbGQgdHlwZSBpZiBub25lIHdhcyBzcGVjaWZpZWQKK2lmKE5PVCBDTUFLRV9CVUlMRF9UWVBFIEFORCBOT1QgQ01BS0VfQ09ORklHVVJBVElPTl9UWVBFUykKKyAgbWVzc2FnZShTVEFUVVMgIlNldHRpbmcgYnVpbGQgdHlwZSB0byAnRGVidWcnIGFzIG5vbmUgd2FzIHNwZWNpZmllZC4iKQorICBzZXQoQ01BS0VfQlVJTERfVFlQRSBEZWJ1ZyBDQUNIRSBTVFJJTkcgIkNob29zZSB0aGUgdHlwZSBvZiBidWlsZC4iIEZPUkNFKQorICAjIFNldCB0aGUgcG9zc2libGUgdmFsdWVzIG9mIGJ1aWxkIHR5cGUgZm9yIGNtYWtlLWd1aQorICBzZXRfcHJvcGVydHkoQ0FDSEUgQ01BS0VfQlVJTERfVFlQRSBQUk9QRVJUWSBTVFJJTkdTICJEZWJ1ZyIgIlJlbGVhc2UiCisgICAgIk1pblNpemVSZWwiICJSZWxXaXRoRGViSW5mbyIgIlByb2ZpbGluZyIgIk1heFBlcmZvcm1hbmNlIiAiRGViaWFuUGFja2FnZSIgIkRlYnVnVmFsZ3JpbmQiKQorZW5kaWYoKQorCisjIEFkZCBhICJQcm9maWxpbmciIGJ1aWxkIHR5cGUKKyMgU0VUKENNQUtFX0JVSUxEX1RZUEUgUHJvZmlsaW5nKQorU0VUKENNQUtFX0NfRkxBR1NfUFJPRklMSU5HICItZnByb2ZpbGUtYXJjcyAtZnRlc3QtY292ZXJhZ2UgLWZzdGFjay1wcm90ZWN0b3IgLWcgLVdhbGwiKQorCisjIEFkZCBhICJNYXhQZXJmb3JtYW5jZSIgYnVpbGQgdHlwZSAtLSB0aGlzIGlzIHZlcnkgc2lsZW50Li4uCisjIFNFVChDTUFLRV9CVUlMRF9UWVBFIE1heFBlcmZvcm1hbmNlKQorU0VUKENNQUtFX0NfRkxBR1NfTUFYUEVSRk9STUFOQ0UgIiR7Q01BS0VfQ19GTEFHU19SRUxFQVNFfSAtRFNUUklQX0RFQlVHX0NPREUiKQorCisjIEFkZCBhICJEZWJpYW5QYWNrYWdlIiBidWlsZCB0eXBlIHVzZWQgd2hlbiBjcmVhdGluZyB0aGUgRGViaWFuIHBhY2thZ2VzCitTRVQoQ01BS0VfQ19GTEFHU19ERUJJQU5QQUNLQUdFICIke0NNQUtFX0NfRkxBR1NfUkVMV0lUSERFQklORk99IikKKworIyBTZXQgdGhlICJEZWJ1ZyIgZmxhZ3MKK1NFVChDTUFLRV9DX0ZMQUdTX0RFQlVHICItV2FsbCAtZyAtTzAiKQorCisjIEFkZCBhICJEZWJ1Z1ZhbGdyaW5kIiBidWlsZCB0eXBlIHVzZWQgZm9yIGNoZWNraW5nIGV4ZWN1dGlvbiB3aXRoIFZhbGdyaW5kIHRvb2wKK1NFVChDTUFLRV9DX0ZMQUdTX0RFQlVHVkFMR1JJTkQgIi1XYWxsIC1nIC1PMCIpCisKKyMgU2V0IHRoZSBERUJVRyBmbGFnIGZvciBEZWJ1ZyBhbmQgUHJvZmlsaW5nIGJ1aWxkcworSUYgKENNQUtFX0JVSUxEX1RZUEUgTUFUQ0hFUyAiRGVidWd8UHJvZmlsaW5nfERlYnVnVmFsZ3JpbmQiKQorICBTRVQoREVCVUcgMSkKK0VORElGIChDTUFLRV9CVUlMRF9UWVBFIE1BVENIRVMgIkRlYnVnfFByb2ZpbGluZ3xEZWJ1Z1ZhbGdyaW5kIikKKworIyBzb21lIHN1YmZvbGRlcnMgdXNlIHlhY2MgYW5kIGxleCBwYXJzZXJzCitTRVQoQklTT05fR0VORVJBVEVfREVGSU5FUyBUUlVFKQorU0VUKEJJU09OX1BSRUZJWF9PVVRQVVRTIFRSVUUpCitJTkNMVURFKENNYWtlVXNlclVzZUJpc29uKQorU0VUKEZMRVhfUFJFRklYX09VVFBVVFMgVFJVRSkKK0lOQ0xVREUoQ01ha2VVc2VyVXNlRmxleCkKK0lGKCBOT1QgQklTT05fRVhFQ1VUQUJMRSBPUiBOT1QgRkxFWF9FWEVDVVRBQkxFICkKKyAgTUVTU0FHRSggU0VORF9FUlJPUiAiQmlzb24gYW5kIEZsZXggYXJlIHJlcXVpcmVkIiApCitFTkRJRiggTk9UIEJJU09OX0VYRUNVVEFCTEUgT1IgTk9UIEZMRVhfRVhFQ1VUQUJMRSApCisjIENoZWNrIHRoYXQgZmxleCBpcyBhdCBsZWFzdCAyLjUuMjAgdG8gc3VwcG9ydCBiaXNvbi1icmlkZ2UKKyMgaG93IHRvIGRvIHRoZSBjaGVjayB3aXRoIGNtYWtlPz8/CisKKyMgQWRkIHRoaXMgdG8gd29ya2Fyb3VuZCBhbiBhcHBhcmVudCBidWcgaW4gRnJlZUJTRCBjbWFrZSAoYWxyZWFkeSBkZWZpbmVkIGluIExpbnV4KQorU0VUKENNQUtFX1NIQVJFRF9MSUJSQVJZX0xJTktfQ19GTEFHUyAiLXJkeW5hbWljIikKKworIyBGb3IgRGFyd2luIHN5c3RlbXMKK0lGKEFQUExFKQorICAgU0VUKENNQUtFX1NIQVJFRF9NT0RVTEVfQ1JFQVRFX0NfRkxBR1MgIiR7Q01BS0VfU0hBUkVEX01PRFVMRV9DUkVBVEVfQ19GTEFHU30gLWZsYXRfbmFtZXNwYWNlIC11bmRlZmluZWQgZHluYW1pY19sb29rdXAiKQorICAgU0VUKENNQUtFX1NIQVJFRF9NT0RVTEVfQ1JFQVRFX0NYWF9GTEFHUyAiJHtDTUFLRV9TSEFSRURfTU9EVUxFX0NSRUFURV9DWFhfRkxBR1N9IC1mbGF0X25hbWVzcGFjZSAtdW5kZWZpbmVkIGR5bmFtaWNfbG9va3VwIikKK0VORElGKEFQUExFKSAKKworIyBMb2NhdGlvbiBmb3IgdGhlIGluY2x1ZGUgZmlsZXMKK0lOQ0xVREVfRElSRUNUT1JJRVMoaW5jbHVkZSkKK0lOQ0xVREVfRElSRUNUT1JJRVMoJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2luY2x1ZGUpCitTVUJESVJTKGluY2x1ZGUvZnJlZURpYW1ldGVyKQorCisjIExvY2F0aW9uIGZvciB0aGUgc291cmNlIGNvZGUKK1NVQkRJUlMobGliZmRwcm90bykKK1NVQkRJUlMobGliZmRjb3JlKQorU1VCRElSUyhmcmVlRGlhbWV0ZXJkKQorCisjIEV4dGVuc2lvbnMgKHRoZXJlIGlzIG5vIHVzZSBvZiBmcmVlRGlhbWV0ZXIgd2l0aG91dCBhbnkgZXh0ZW5zaW9uKQorU1VCRElSUyhleHRlbnNpb25zKQorCisjIFRoZSB1bmFyeSB0ZXN0cyBkaXJlY3RvcnkKK0lGICggQlVJTERfVEVTVElORyApCisJU1VCRElSUyh0ZXN0cykKK0VORElGICggQlVJTERfVEVTVElORyApCisKZGlmZiAtLWdpdCBhL0NUZXN0Q29uZmlnLmNtYWtlIGIvQ1Rlc3RDb25maWcuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFmZWYzMwotLS0gL2Rldi9udWxsCisrKyBiL0NUZXN0Q29uZmlnLmNtYWtlCkBAIC0wLDAgKzEsMTAgQEAKKyMgQ29uZmlndXJhdGlvbiBmb3Igc3VtaXR0aW5nIHRoZSB0ZXN0IHJlc3VsdC4KKyMgQ2hlY2sgaHR0cDovL3d3dy5mcmVlZGlhbWV0ZXIubmV0L0NEYXNoIGZvciBkZXRhaWwuCisKK3NldChDVEVTVF9QUk9KRUNUX05BTUUgImZyZWVEaWFtZXRlciIpCitzZXQoQ1RFU1RfTklHSFRMWV9TVEFSVF9USU1FICIwMDowMDowMCBKU1QiKQorCitzZXQoQ1RFU1RfRFJPUF9NRVRIT0QgImh0dHAiKQorc2V0KENURVNUX0RST1BfU0lURSAid3d3LmZyZWVkaWFtZXRlci5uZXQiKQorc2V0KENURVNUX0RST1BfTE9DQVRJT04gIi9DRGFzaC9zdWJtaXQucGhwP3Byb2plY3Q9ZnJlZURpYW1ldGVyIikKK3NldChDVEVTVF9EUk9QX1NJVEVfQ0RBU0ggVFJVRSkKZGlmZiAtLWdpdCBhL0lOU1RBTEwgYi9JTlNUQUxMCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyYmNiOGUKLS0tIC9kZXYvbnVsbAorKysgYi9JTlNUQUxMCkBAIC0wLDAgKzEsMzkgQEAKK1RoaXMgcGFja2FnZSB1c2VzIENNYWtlIChjbWFrZS5vcmcpIGFzIGJ1aWxkaW5nIHN5c3RlbS4gWW91J2xsIG5lZWQgdGhlIGNtYWtlIHRvb2wgaW4gb3JkZXIgCit0byBnZW5lcmF0ZSB0aGUgTWFrZWZpbGVzIGZvciB5b3VyIHBsYXRmb3JtLiBZb3UgY2FuIGFsc28gc2VsZWN0IHdoaWNoIGV4dGVuc2lvbnMgbXVzdCBiZSBidWlsdAord2l0aCBjbWFrZS4gQWZ0ZXIgdGhlIGluaXRpYWwgY21ha2UgY29uZmlndXJhdGlvbiwgeW91IHdpbGwgbmVlZCBzZXZlcmFsIHRvb2xzIHN1Y2ggYXMgbWFrZSwgYSAKK0MgY29tcGlsZXIgKHRlc3RlZCBtb3N0bHkgd2l0aCBnY2MpLCBmbGV4ICg+IDIuNS40KSwgYmlzb24sIC4uLgorCitZb3UgbWF5IHJldHJpZXZlIHRoZSBzb3VyY2UgcGFja2FnZSBpbiBzZXZlcmFsIHdheXM6CisgLSBhcyBhIHByZS1wYWNrYWdlZCB2ZXJzaW9uIGZvciB5b3VyIHBsYXRmb3JtLiBDaGVjayB0aGUgd2Vic2l0ZSBmb3Igc3VwcG9ydGVkIHBsYXRmb3Jtcy4KKyAtIGFzIGEgdGFyYmFsbCBjb250YWluaW5nIHRoZSBzb3VyY2UuCisgLSBkaXJlY3RseSBmcm9tIHRoZSByZXBvc2l0b3J5IHVzaW5nIE1lcmN1cmlhbCB0b29sOgorICAgICAgaGcgY2xvbmUgaHR0cDovL3d3dy5mcmVlZGlhbWV0ZXIubmV0L2hnL2ZyZWVEaWFtZXRlcgorICAgSW4gb3JkZXIgdG8gdXBkYXRlIGxhdGVyOgorICAgICAgaGcgcHVsbCAtdQorCitCdWlsZGluZyBpbiBhIHNlcGFyYXRlIGRpcmVjdG9yeSBpcyByZWNvbW1lbmRlZDoKKyMgbWtkaXIgYnVpbGQKKyMgY2QgYnVpbGQKKyMgY21ha2UgLi4vCisjIG1ha2UKKworWW91IGNhbiBwYXNzIG9wdGlvbnMgdG8gaW5zdHJ1Y3QgY21ha2UgYWJvdXQgd2hpY2ggY29tcG9uZW50cyB0byBjb21waWxlIG9uIHRoZSBjb21tYW5kLWxpbmUuCitZb3UgY2FuIGFsc28gdXNlIGEgQ01ha2UgZnJvbnQtZW5kIChmb3IgZXhhbXBsZSBjY21ha2Ugb3IgY21ha2UtZ3VpKS4gCitJZiB5b3VyIGNtYWtlIGluc3RhbGxhdGlvbiBpcyByZWNlbnQsIHRoZSBlZGl0X2NhY2hlIHRhcmdldCBpcyBhIGdvb2QgaGVscCBhcyB3ZWxsOgorIyBta2RpciBidWlsZAorIyBjZCBidWlsZAorIyBjbWFrZSAuLi8KKyMgbWFrZSBoZWxwCisjIG1ha2UgZWRpdF9jYWNoZQorIyBtYWtlCisKK1lvdSBjYW4gZGlzYWJsZSB0aGUgdW5pdCB0ZXN0cyBieSBkb2luZzoKKyMgY21ha2UgLURCVUlMRF9URVNUSU5HOkJPT0w9T0ZGIC4uLworIyBtYWtlCisKK1doZW4gdGhlIHRlc3RzIGFyZSBlbmFibGVkLCB5b3UgY2FuIHJ1biB0aGVtIHdpdGg6CisjIG1ha2UgdGVzdAorCitTZWUgdGhlIElOU1RBTEwuKiBmaWxlcyBmb3IgYWRkaXRpb25hbCBwbGF0Zm9ybS1zcGVjaWZpYyBpbmZvcm1hdGlvbi4KK05vdGUgdGhhdCB0aGUgbW9zdCB1cC10by1kYXRlIElOU1RBTEwgZmlsZSBpcyB0aGUgVWJ1bnR1IG9uZS4gWW91IG1heSB3YW50IHRvIHJlYWQgdGhlcmUKK2luIGFkZGl0aW9uIHRvIHlvdXIgb3duIHBsYXRmb3JtIGZpbGUuCmRpZmYgLS1naXQgYS9JTlNUQUxMLkZlZG9yYSBiL0lOU1RBTEwuRmVkb3JhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjODgxYzIKLS0tIC9kZXYvbnVsbAorKysgYi9JTlNUQUxMLkZlZG9yYQpAQCAtMCwwICsxLDM3IEBACisjIyMgVmVyeSBzaG9ydCBpbnN0YWxsIG5vdGVzIGZvciBGZWRvcmEgKHRlc3RlZCBvbiBGZWRvcmEgMTMgYW5kIDE0KQorIyBQbGVhc2UgcmVmZXIgdG8gb3RoZXIgSU5TVEFMTCBmaWxlcyBmb3IgbW9yZSBkZXRhaWxlZCBpbnN0cnVjdGlvbnMgKGUuZy4gZXh0ZW5zaW9uLXNwZWNpZmljIG5vdGVzKS4KKworCitEZXBlbmRlbmNpZXMgb24gRmVkb3JhIDEzIChmcm9tIG1pbmltYWwgc3lzdGVtKToKKyMgeXVtIGluc3RhbGwgY21ha2UgbWFrZSBnY2MgZ2NjLWMrKyBmbGV4IGJpc29uIGxrc2N0cC10b29scy1kZXZlbCBnbnV0bHMtZGV2ZWwgbGliZ2NyeXB0LWRldmVsIGxpYmlkbi1kZXZlbAorCitJbiBhZGRpdGlvbiwgaWYgeW91IGhhdmUgbm90IGFscmVhZHkgcmV0cmlldmVkIHRoZSBsYXRlc3Qgc291cmNlOgorIyB5dW0gaW5zdGFsbCBtZXJjdXJpYWwKKworRm9sbG93aW5nIGRlcGVuZGVuY2llcyBhcmUgb3B0aW9uYWwsIGRlcGVuZGluZyBvbiB3aGljaCBleHRlbnNpb25zIHlvdSBwbGFuIHRvIGNvbXBpbGUKKyBhcHBfYWNjdDoKKwkjIHl1bSBpbnN0YWxsIHBvc3RncmVzcWwtZGV2ZWwKKwlvcHRpb25hbDoKKwkjIHl1bSBpbnN0YWxsIHBvc3RncmVzcWwtc2VydmVyCisKKyBhcHBfc2lwOgorIGFwcF9kaWFtZWFwOgorCSMgeXVtIGluc3RhbGwgbXlzcWwtZGV2ZWwKKwlvcHRpb25hbDoKKwkjIHl1bSBpbnN0YWxsIG15c3FsLXNlcnZlciAKKwkKKyBkaWN0X2xlZ2FjeV94bWw6CisJIyB5dW0gaW5zdGFsbCBsaWJ4bWwyIGxpYnhtbDItZGV2ZWwKKwkKKyBkYmdfaW50ZXJhY3RpdmU6CisJIyB5dW0gaW5zdGFsbCBzd2lnIHB5dGhvbi1kZXZlbAorCisKK05PVEU6IFlvdSBtYXkgbmVlZCB0byBjaGFuZ2Ugc29tZXRoaW5nIGluIFNFTGludXggdG8gYWxsb3cgYmluZGluZyB0aGUgU0NUUCBzb2NrZXQgb24gRGlhbWV0ZXIgcG9ydC4KK1RoZSBmb2xsb3dpbmcgY29tbWFuZCBpcyB0aGUgdmVyeSBuYWl2ZSB3YXkgdG8gZG8gaXQsIHlvdSBjYW4gcHJvYmFibHkgZG8gYmV0dGVyIChmZWVkYmFjayBhcHByZWNpYXRlZCEpCisjIHNldGVuZm9yY2UgUGVybWlzc2l2ZQorCisKK1RoZXJlIGlzIGN1cnJlbnRseSBubyBGZWRvcmEtc3BlY2lmaWMgcGFja2FnZSBmb3IgZnJlZURpYW1ldGVyLgorWW91IGFyZSB3ZWxjb21lIHRvIGNvbnRyaWJ1dGUgcGFja2FnaW5nIHNjcmlwdHMuIAorUGxlYXNlIGNvbnRhY3QgZGV2QGZyZWVkaWFtZXRlci5uZXQgZm9yIG1vcmUgZGV0YWlscy4KZGlmZiAtLWdpdCBhL0lOU1RBTEwuRnJlZUJTRCBiL0lOU1RBTEwuRnJlZUJTRApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjI1ZDhhCi0tLSAvZGV2L251bGwKKysrIGIvSU5TVEFMTC5GcmVlQlNECkBAIC0wLDAgKzEsMTI1IEBACitTZWUgSU5TVEFMTCBmaWxlIGZvciBnZW5lcmFsIGluc3RydWN0aW9ucyBvbiBidWlsZGluZyBmcmVlRGlhbWV0ZXIuCisKKy0tLS0tLS0tLS0tLS0tLS0tLQorUVVJQ0sgSU5TVFJVQ1RJT05TCistLS0tLS0tLS0tLS0tLS0tLS0KKworT24gRnJlZUJTRC04LjAgYXQgbGVhc3QgdGhlIGZvbGxvd2luZyBwb3J0cyBwYWNrYWdlcyB3ZXJlIHJlcXVpcmVkIChzaG91bGQgYmUgc2FtZSBvbiBGcmVlQlNELTcueCk6CisgY21ha2UgZmxleCBiaXNvbiBnbnV0bHMKKworVGhlbiB0aGUgY21ha2UgY29tbWFuZCBoYWQgdG8gbG9vayBsaWtlOgorIGNtYWtlIC1ERkxFWF9FWEVDVVRBQkxFOkZJTEVQQVRIPS91c3IvbG9jYWwvYmluL2ZsZXggLURTQ1RQX1VTRV9NQVBQRURfQUREUkVTU0VTOkJPT0w9T04gLi4uCisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitDT01QTEVURSBJTlNUUlVDVElPTlMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisxKSBJZiB5b3UgZG9uJ3QgaGF2ZSBmcmVlQlNEIHlldDoKKyAgIEluc3RhbGwgbWluaW1hbCBzeXN0ZW0gKyBwb3J0cyB1c2luZyBpbml0aWFsIGluc3RhbGxlciAvdXNyL3NiaW4vc3lzaW5zdGFsbAorCisKKzIpIEluc3RhbGwgJ2NtYWtlJworCisgYSkgZnJvbSBzb3VyY2VzOgorICAgICMgY2QgL3Vzci9wb3J0cy9kZXZlbC9jbWFrZQorICAgICMgbWFrZSBpbnN0YWxsCisgICAgCisgYikgb3IgZnJvbSBwYWNrYWdlIChkb24ndCBmb3JnZXQgdG8gc2V0IHlvdXIgUEFDS0FHRVJPT1QgYXBwcm9wcmlhdGVseS4gRXg6IHNldCBQQUNLQUdFUk9PVD1mdHA6Ly9mdHAuanAuZnJlZWJzZC5vcmcpOgorICAgICMgcGtnX2FkZCAtdiAtciBjbWFrZQorCQorIAorMykgSW5zdGFsbCAnbWVyY3VyaWFsJyAob3B0aW9uYWwpCisgIChyZXBsYWNlICdjbWFrZScgYnkgJ21lcmN1cmlhbCcgaW4gdGhlIHByZXZpb3VzIGNvbW1hbmQpIAorCis0KSBJbnN0YWxsICdmbGV4JyBhbmQgJ2Jpc29uJywgc2FtZSB3YXkuCisKKzUpIEluc3RhbGwgJ2dudXRscycgYW5kICdsaWJpZG4nLCBzYW1lIHdheSBhbHNvLgorCis2KSBSZXRyaWV2ZSBmcmVlRGlhbWV0ZXIgc291cmNlIGNvZGU6CisgICAjIGNkIH4KKyAgICMgL3Vzci9sb2NhbC9iaW4vaGcgY2xvbmUgaHR0cDovL3d3dy5mcmVlZGlhbWV0ZXIubmV0L2hnL2ZyZWVEaWFtZXRlci8KKyAgIAorNmIpIE1ha2UgYSBidWlsZCBkaXJlY3RvcnkKKyAgICMgbWtkaXIgZkQtYnVpbGQKKyAgICMgY2QgZkQtYnVpbGQKKyAgIAorNykgUnVuIGNtYWtlIGZvciBmcmVlRGlhbWV0ZXIgKGFkZCBvdGhlciBmbGFncyBhcyB5b3Ugc2VlIGZpdCwgc2VlIElOU1RBTEwgZm9yIG1vcmUgZGV0YWlscykKKyAgICMgL3Vzci9sb2NhbC9iaW4vY21ha2UgLURGTEVYX0VYRUNVVEFCTEU6RklMRVBBVEg9L3Vzci9sb2NhbC9iaW4vZmxleCAtRFNDVFBfVVNFX01BUFBFRF9BRERSRVNTRVM6Qk9PTD1PTiAuLi9mcmVlRGlhbWV0ZXIKKworOCkgQ29tcGlsZSwgb3B0aW9ubmFseSB0ZXN0CisgICAjIG1ha2UKKyAgICMgbWFrZSB0ZXN0CisKKzkpIEluc3RhbGwKKyAgICMgbWFrZSBpbnN0YWxsCisgICAKKzEwKSBSdW4gKHRoZSBpbnN0YWxsIHBhdGggY2FuIGJlIGNoYW5nZWQgZHVyaW5nIGNtYWtlIHN0ZXApOgorICAgIyAvdXNyL2xvY2FsL2Jpbi9mcmVlRGlhbWV0ZXJkIC0taGVscAorCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorYXBwX2FjY3QgdGVzdCBBRERJVElPTkFMIFNURVBTCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0hlcmUgaXMgYWRkaXRpb25hbCBzdGVwcyBpbiBvcmRlciB0byBydW4gdGhlIHRlc3QgZm9yIGFwcF9hY2N0CisKKzEpIEluc3RhbGwgdGhlIHJlcXVpcmVkIHBhY2thZ2VzCisgICMgcGtnX2FkZCAtdiAtciBwb3N0Z3Jlc3FsODQtY2xpZW50CisgICMgcGtnX2FkZCAtdiAtciBwb3N0Z3Jlc3FsODQtc2VydmVyCisKKzIpIFByZXBhcmUgYWNjZXNzIHRvIHRoZSBkYXRhYmFzZToKKyAgIyBlY2hvIHBvc3RncmVzcWxfZW5hYmxlPVlFUyA+PiAvZXRjL3JjLmNvbmYKKyAgIyAvdXNyL2xvY2FsL2V0Yy9yYy5kL3Bvc3RncmVzcWwgaW5pdGRiCisgICMgc3UgLSBwZ3NxbAorICA+IC91c3IvbG9jYWwvYmluL3BnX2N0bCAtRCAvdXNyL2xvY2FsL3Bnc3FsL2RhdGEgLWwgbG9nZmlsZSBzdGFydAorICA+IC91c3IvbG9jYWwvYmluL2NyZWF0ZXVzZXIgcm9vdAorICBTaGFsbCB0aGUgbmV3IHVzZXIgYmUgYWxsb3dlZCB0byBjcmVhdGUgZGF0YWJhc2VzPyAoeS9uKSB5CisgID4gbG9nb3V0CisgICMgL3Vzci9sb2NhbC9iaW4vY3JlYXRlZGIgcm9vdAorICAjIC91c3IvbG9jYWwvYmluL3BzcWwgcm9vdAorICByb290PSMgQ1JFQVRFIFRBQkxFIGluY29taW5nX3Rlc3QgKAorICByb290KCMgcmVjb3JkZWRfb24gdGltZXN0YW1wIHdpdGggdGltZSB6b25lIE5PVCBOVUxMLAorICByb290KCMgIkFjY291bnRpbmctUmVjb3JkLVR5cGUiIGludGVnZXIsCisgIHJvb3QoIyAiU2Vzc2lvbi1JZCIgYnl0ZWEsCisgIHJvb3QoIyAiQWNjb3VudGluZy1SZWNvcmQtTnVtYmVyIiBpbnRlZ2VyLAorICByb290KCMgIlJvdXRlLVJlY29yZDEiIGJ5dGVhLAorICByb290KCMgIlJvdXRlLVJlY29yZDIiIGJ5dGVhLAorICByb290KCMgIlJvdXRlLVJlY29yZDMiIGJ5dGVhLAorICByb290KCMgIlJvdXRlLVJlY29yZDQiIGJ5dGVhICk7CisgIHJvb3Q9IyBccQorCiszKSBjb25maWd1cmUgdGhlIHNvdXJjZXMKKyAgIyBtYWtlIGVkaXRfY2FjaGUKKyAgIEJVSUxEX0FQUF9BQ0NUOkJPT0w9T04KKyAgIFRFU1RfQVBQX0FDQ1Q6Qk9PTD1PTgorICAgVEVTVF9BUFBfQUNDVF9DT05OSU5GTzpTVFJJTkc9InVzZXI9cm9vdCBkYm5hbWU9cm9vdCIKKyAgIAorNCkgcnVuIHRoZSB0ZXN0CisgICMgdGVzdHMvdGVzdGFwcGFjY3QgLWQKKyAgb3IKKyAgIyBtYWtlIHRlc3QKKyAgCisgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU2VnbWVudGF0aW9uIGZhdWx0IG9uIHByb2dyYW0gZXhpdAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJbiBjYXNlIHlvdSBlbmNvdW50ZXIgYSBzZWdtZW50YXRpb24gZmF1bHQgb24gcHJvZ3JhbSB0ZXJtaW5hdGlvbiBsaWtlIHRoaXM6CisgIFsuLi5dCisgIGZyZWVEaWFtZXRlcmQgZnJhbWV3b3JrIGlzIHRlcm1pbmF0ZWQuCisgIFNlZ21lbnRhdGlvbiBmYXVsdDogMTEgKGNvcmUgZHVtcGVkKQorCit3aXRoIGEgYmFja3RyYWNlIGxpa2UgdGhpczoKKyAgIzAgIDB4MDAwMDAwMDgwMWE0MTRhMCBpbiA/PyAoKQorICAjMSAgMHgwMDAwMDAwODAwZjk5Mjc0IGluIF9fY3hhX2ZpbmFsaXplICgpIGZyb20gL2xpYi9saWJjLnNvLjcKKyAgIzIgIDB4MDAwMDAwMDgwMGY0NjBiNyBpbiBleGl0ICgpIGZyb20gL2xpYi9saWJjLnNvLjcKKyAgCitZb3UgbWF5IHRyeSB0byBhZGQgdGhlIGZvbGxvd2luZyBjb21waWxhdGlvbiBkaXJlY3RpdmUgaW4gY21ha2U6CisgIC1EU0tJUF9ETENMT1NFOkJPT0w9T04KKworTm90ZTogdGhpcyBzZWdtZW50YXRpb24gZmF1bHQgd2FzIGV4cGVyaWVuY2VkIHdpdGg6CisgLSBGcmVlQlNEIDguMQorIC0gNjQgYml0cyBhcmNoaXRlY3R1cmUgb25seS4KKyAtIFByb2ZpbGluZyBtb2RlIG9ubHkuCisKKwpkaWZmIC0tZ2l0IGEvSU5TVEFMTC5PU1ggYi9JTlNUQUxMLk9TWApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTZkYzY1Ci0tLSAvZGV2L251bGwKKysrIGIvSU5TVEFMTC5PU1gKQEAgLTAsMCArMSw4NSBAQAorU2VlIElOU1RBTEwgZmlsZSBmb3IgZ2VuZXJhbCBpbnN0cnVjdGlvbnMgb24gYnVpbGRpbmcgZnJlZURpYW1ldGVyLgorCistLS0tLS0tLS0tLS0tLS0tLS0KK1FVSUNLIElOU1RSVUNUSU9OUworLS0tLS0tLS0tLS0tLS0tLS0tCisKK1N0YXJ0aW5nIGZyb20gdmVyc2lvbiAxLjEuNSwgZnJlZURpYW1ldGVyIGlzIGF2YWlsYWJsZSB0aHJvdWdoIEhvbWVicmV3OgorCisxKSBJbnN0YWxsIEhvbWVicmV3CisgICBhKSBJbnN0YWxsIENvbW1hbmQgTGluZSBUb29scyBmb3IgWGNvZGUgb3IgWGNvZGU6CisgICAgICAtIENvbW1hbmQgTGluZSBUb29scyAoeW91ciBPUyBYIFZlcnNpb24pIGZvciBYY29kZToKKyAgICAgICAgIGh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9kb3dubG9hZHMgKEZyZWUgQXBwbGUgRGV2ZWxvcGVyIElEIFJlZ2lzdHJhdGlvbiBSZXF1aXJlZCkKKyAgICAgIC0gb3IgWGNvZGU6CisgICAgICAgICBodHRwczovL2l0dW5lcy5hcHBsZS5jb20vdXMvYXBwL3hjb2RlL2lkNDk3Nzk5ODM1IChGcmVlIEFwcCBTdG9yZSBBY2NvdW50IFJlcXVpcmVkKQorCisgICBiKSBJbnN0YWxsIEhvbWVicmV3CisgICAgICQgcnVieSAtZSAiJChjdXJsIC1mc1NrTCByYXcuZ2l0aHViLmNvbS9teGNsL2hvbWVicmV3L2dvKSIKKworMikgSW5zdGFsbCBmcmVlRGlhbWV0ZXI6CisgICAgICQgYnJldyBpbnN0YWxsIGZyZWVkaWFtZXRlcgorCisgICBBZnRlciBpbnN0YWxsYXRpb24gaXMgZG9uZSAiQ2F2ZWF0cyIgc2VjdGlvbiB3aWxsIHByb3ZpZGUgaW5mb3JtYXRpb24KKyAgIGhvdyB0byBzdGFydCBmcmVlRGlhbWV0ZXJkIHRocm91Z2ggbGF1bmNoZCBhdCBzeXN0ZW0gc3RhcnR1cC4KKworICAgVG8gdmlldyB0aGlzIGluZm9ybWF0aW9uIGFnYWluOgorICAgICAkIGJyZXcgaW5mbyBmcmVlZGlhbWV0ZXIKKworICAgVG8gbGVhcm4gbW9yZSBhYm91dCBmcmVlRGlhbWV0ZXIgY29uZmlndXJhdGlvbiBvcHRpb25zLCByZWFkOgorICAgICAgaHR0cDovL3d3dy5mcmVlZGlhbWV0ZXIubmV0L3RyYWMvd2lraS9Db25maWd1cmF0aW9uCisKKyAgIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGF2YWlsYWJsZSBleHRlbnNpb24gYW5kIGhvdyB0byBjb25maWd1cmUgdGhlbSwgcmVhZDoKKyAgICAgIGh0dHA6Ly93d3cuZnJlZWRpYW1ldGVyLm5ldC90cmFjL3dpa2kvRXh0ZW5zaW9ucworCistLS0tLS0tLS0tLS0KK0ZST00gU09VUkNFUworLS0tLS0tLS0tLS0tCisKKzEpIEluc3RhbGwgSG9tZWJyZXc6CisgICBTZWUgUVVJQ0sgSU5TVFJVQ1RJT05TIFN0ZXAgIzEgYWJvdmUuCisKKzIpIEluc3RhbGwgZGVwZW5kZW5jaWVzOgorICAgICQgYnJldyBpbnN0YWxsIG1lcmN1cmlhbCBjbWFrZSBnbnV0bHMgbGliZ2NyeXB0IHBvc3RncmVzIG15c3FsIGxpYmlkbgorCisgICBOb3RlczoKKyAgICAqIEdOVSBJRE4gKGxpYmlkbikgaXMgb3B0aW9uYWwsIHNlZSBiZWxvdworICAgICogV2hlbiBsaWJ1c3JzY3RwIHBhY2thZ2UgaXMgYXZhaWxhYmxlLCB5b3UgY2FuIHVzZSBpdCBhcyB3ZWxsLgorICAgICAgICBIb3dldmVyLCBpdCByZXF1aXJlcyBzb21lIHJld29yayBvbiB0aGUgc291cmNlIGNvZGUgYXMgbGlidXNyc2N0cCBpcyBub3QgZnVsbHkKKyAgICAgICAgY29tcGxpYW50IHdpdGggdGhlIG90aGVyIFNDVFAgc3RhY2suCisKKzMpIFJldHJpZXZlIHNvdXJjZSBjb2RlOgorICAgICQgaGcgY2xvbmUgaHR0cDovL3d3dy5mcmVlZGlhbWV0ZXIubmV0L2hnL2ZyZWVEaWFtZXRlcgorCis0KSBFbnRlciBzb3VyY2UgZm9sZGVyOgorICAgICQgY2QgZnJlZURpYW1ldGVyCisKKzUpIENyZWF0ZSBidWlsZCBmb2xkZXI6CisgICAgJCBta2RpciBmcmVlRGlhbWV0ZXItYnVpbGQKKworNikgRW50ZXIgYnVpbGQgZm9sZGVyOgorICAgICQgY2QgZnJlZURpYW1ldGVyLWJ1aWxkCisKKzcpIENvbmZpZ3VyZToKKyAgICAkIGNtYWtlIC4uIC1ERElTQUJMRV9TQ1RQOkJPT0w9T04KKworICAgb3IgZm9yIG5jdXJzZXMtYmFzZWQgY29uZmlndXJhdGlvbjoKKyAgICAkIGNjbWFrZSAuLiAtRERJU0FCTEVfU0NUUDpCT09MPU9OCisKKyAgIE5vdGVzOgorICAgICogR05VIElETiAoU3VwcG9ydCBmb3IgSW50ZXJuYXRpb25hbCBEb21haW4gTmFtZXMpIGNhbiBiZSBkaXNhYmxlZCB3aXRoOgorICAgICAgIC1ERElBTUlEX0lETkFfSUdOT1JFPU9OIG9yIC1ERElBTUlEX0lETkFfUkVKRUNUPU9OCisgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBhdmFpbGFibGUgY29uZmlndXJhdGlvbiBvcHRpb25zLCByZWFkOgorICAgICAgIGh0dHA6Ly93d3cuZnJlZWRpYW1ldGVyLm5ldC90cmFjL3dpa2kvSW5zdGFsbGF0aW9uCisKKzgpIENvbXBpbGU6CisgICAgJCBtYWtlCisKKzkpIEluc3RhbGwgKG1pZ2h0IHJlcXVpcmUgdG8gYmUgcm9vdCk6CisgICAgJCBtYWtlIGluc3RhbGwKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZXNlIGluc3RydWN0aW9ucyBoYXZlIGJlZW4gdGVzdGVkIG9uIE9TIFg6CisgICAtIDEwLjYuOCAoU25vdyBMZW9wYXJkKQorICAgLSAxMC43LjUgKExpb24pCisgICAtIDEwLjguMiAoTW91bnRhaW4gTGlvbikKZGlmZiAtLWdpdCBhL0lOU1RBTEwuT3BlblNVU0UgYi9JTlNUQUxMLk9wZW5TVVNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3YWY3NDIKLS0tIC9kZXYvbnVsbAorKysgYi9JTlNUQUxMLk9wZW5TVVNFCkBAIC0wLDAgKzEsMjkgQEAKKyMjIyBWZXJ5IHNob3J0IGluc3RhbGwgbm90ZXMgZm9yIE9wZW5TVVNFICh0ZXN0ZWQgb24gT3BlblNVU0UgMTEuMykKKyMgUGxlYXNlIHJlZmVyIHRvIG90aGVyIElOU1RBTEwgZmlsZXMgZm9yIG1vcmUgZGV0YWlsZWQgaW5zdHJ1Y3Rpb25zIChlLmcuIGV4dGVuc2lvbi1zcGVjaWZpYyBub3RlcykuCisKKworRGVwZW5kZW5jaWVzIG9uIE9wZW5TVVNFIDExLjMgKGZyb20gbWluaW1hbCBzZXJ2ZXIgc3lzdGVtIGluc3RhbGxhdGlvbik6CisjIHp5cHBlciBpbnN0YWxsIGNtYWtlIG1ha2UgZ2NjIGdjYy1jKysgZmxleCBiaXNvbiBsa3NjdHAtdG9vbHMtZGV2ZWwgbGliZ251dGxzLWRldmVsIGxpYmdjcnlwdC1kZXZlbCBsaWJpZG4tZGV2ZWwKKyMgenlwcGVyIGluc3RhbGwgbWVyY3VyaWFsCisKK0ZvbGxvd2luZyBkZXBlbmRlbmNpZXMgYXJlIG9wdGlvbmFsLCBkZXBlbmRpbmcgb24gd2hpY2ggZXh0ZW5zaW9ucyB5b3UgcGxhbiB0byBjb21waWxlCisgYXBwX2FjY3Q6CisJIyB6eXBwZXIgaW5zdGFsbCBwb3N0Z3Jlc3FsLXNlcnZlciBwb3N0Z3Jlc3FsLWRldmVsCisKKyBhcHBfc2lwOgorIGFwcF9kaWFtZWFwOgorIAkjIHp5cHBlciBpbnN0YWxsIGxpYm15c3FsY2xpZW50LWRldmVsIAorCSh3b3VsZCBhbHNvIG5lZWQgYSBzZXJ2ZXIsIG5vdCBzdXJlIHdoaWNoIHBhY2thZ2UgaXMgYXBwcm9wcmlhdGUpCisJCisgZGljdF9sZWdhY3lfeG1sOgorCSMgenlwcGVyIGluc3RhbGwgbGlieG1sMiBsaWJ4bWwyLWRldmVsCisJCisgZGJnX2ludGVyYWN0aXZlOgorCSMgenlwcGVyIGluc3RhbGwgc3dpZyBweXRob24tZGV2ZWwKKworIHNhbXBsZToKKwkjIHp5cHBlciBpbnN0YWxsIGdjYy1jKysKKworVGhlcmUgaXMgY3VycmVudGx5IG5vIE9wZW5TVVNFLXNwZWNpZmljIHBhY2thZ2UgZm9yIGZyZWVEaWFtZXRlci4KK1lvdSBhcmUgd2VsY29tZSB0byBjb250cmlidXRlIHBhY2thZ2luZyBzY3JpcHRzISBQbGVhc2UgY29udGFjdCB3aXRoCitkZXZAZnJlZWRpYW1ldGVyLm5ldCBmb3IgbW9yZSBkZXRhaWxzLgpkaWZmIC0tZ2l0IGEvSU5TVEFMTC5PcGVuV1JUIGIvSU5TVEFMTC5PcGVuV1JUCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjOWY5OTcKLS0tIC9kZXYvbnVsbAorKysgYi9JTlNUQUxMLk9wZW5XUlQKQEAgLTAsMCArMSwzIEBACitUaGVyZSBpcyBhIHBhY2thZ2Ugc2NyaXB0IGF2YWlsYWJsZSBmb3IgdGhlIE9wZW5XUlQgcGxhdGZvcm0uCisKK1BsZWFzZSByZWZlciB0byBjb250cmliL09wZW5XUlQvSE9XVE8gZm9yIG1vcmUgaW5mb3JtYXRpb24uCmRpZmYgLS1naXQgYS9JTlNUQUxMLlVidW50dSBiL0lOU1RBTEwuVWJ1bnR1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNjMzMzUKLS0tIC9kZXYvbnVsbAorKysgYi9JTlNUQUxMLlVidW50dQpAQCAtMCwwICsxLDEyMyBAQAorU2VlIGh0dHA6Ly93d3cuZnJlZWRpYW1ldGVyLm5ldC90cmFjL3dpa2kvRGViUmVwb3NpdG9yeSBmb3IgaW5zdHJ1Y3Rpb25zIG9uIGhvdyB0bworaW5zdGFsbCBmcmVlRGlhbWV0ZXIgZnJvbSBleGlzdGluZyBwYWNrYWdlLgorCitTZWUgSU5TVEFMTCBmaWxlIGZvciBnZW5lcmFsIGluc3RydWN0aW9ucyBvbiBidWlsZGluZyBmcmVlRGlhbWV0ZXIgZnJvbSBzb3VyY2VzLgorCitUaGUgcmVtYWluaW5nIG9mIHRoaXMgZmlsZSBjb250YWlucyBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgZm9yIGJ1aWxkaW5nIHRoZSBmcmVlRGlhbWV0ZXIgCitwYWNrYWdlIGZpbGVzIGZvciBEZWJpYW4gYW5kIFVidW50dSBzeXN0ZW1zLgorCisKKworCitmcmVlRGlhbWV0ZXIgaXMgc2hpcHBlZCB3aXRoIHRoZSBuZWNlc3NhcnkgZmlsZXMgdG8gZ2VuZXJhdGUgdGhlIERlYmlhbiBwYWNrYWdlLiAKK0FsbCByZWxhdGVkIGZpbGVzIGFyZSBpbiB0aGUgZGlyZWN0b3J5ICJjb250cmliL2RlYmlhbiIgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KK0FzIGEgZmlyc3Qgc3RlcCwgeW91IGhhdmUgdG8gbGluayB0aGlzIGRpcmVjdG9yeSBmcm9tIHlvdXIgdG9wLWxldmVsIGRpcjoKKyAgbG4gLXMgY29udHJpYi9kZWJpYW4KKyAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBmb2xsb3dpbmcgcGFja2FnZXMgYXJlIHJlcXVpcmVkIHRvIGNvbXBpbGUgZnJlZURpYW1ldGVyIGZyb20gc291cmNlOgorIGNtYWtlIG1ha2UgZ2NjIGcrKyBmbGV4IGJpc29uIGxpYnNjdHAxIGxpYnNjdHAtZGV2IGxpYmdudXRscy1kZXYgbGliZ2NyeXB0LWRldiBsaWJpZG4xMS1kZXYKKyAKKyhub3RlIHRoYXQgbGliaWRuIGFuZCBsaWJzY3RwIGNhbiBiZSBhdm9pZGVkIGJ5IGRlZmluaW5nIERJU0FCTEVfU0NUUCBhbmQgRElBTUlEX0lETkFfUkVKRUNUKQorIAorQWRkaXRpb25uYWx5LCB0aGVzZSBvbmVzIG1heSBiZSB1c2VmdWw6CisgbWVyY3VyaWFsIGdkYgorIAorRXh0ZW5zaW9ucyBhZGRpdGlvbmFsIGRlcGVuZGVuY2llczoKKyBhcHBfYWNjdDoKKwlsaWJwcS1kZXYKKworIGFwcF9zaXA6CisgYXBwX2RpYW1lYXA6CisgCWxpYm15c3FsY2xpZW50LWRldgorCQorIGRpY3RfbGVnYWN5X3htbDoKKyAJbGlieG1sMi1kZXYKKwkKKyBkYmdfaW50ZXJhY3RpdmU6CisgCXN3aWcgcHl0aG9uLWRldgorCQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworSWYgeW91ciBkZWJoZWxwZXIgZW52aXJvbm1lbnQgaXMgcmVjZW50ICg+IDcuMy45IGZvciBjbWFrZSBzdXBwb3J0KSwgCit0aGUgZm9sbG93aW5nIGNvbW1hbmRzIHNob3VsZCBnZW5lcmF0ZSB0aGUgZnJlZURpYW1ldGVyIHBhY2thZ2VzIGZvciB5b3U6CisKKyMgSW5zdGFsbCB0aGUgZGVwZW5kZW5jaWVzIGZvciBidWlsZGluZyB0aGUgc291cmNlOgorc3VkbyBhcHQtZ2V0IC15IGluc3RhbGwgbWVyY3VyaWFsIGNtYWtlIG1ha2UgZ2NjIGcrKyBiaXNvbiBmbGV4IGxpYnNjdHAtZGV2IGxpYmdudXRscy1kZXYgbGliZ2NyeXB0LWRldiBsaWJpZG4xMS1kZXYgc3NsLWNlcnQgZGViaGVscGVyIGZha2Vyb290IFwKKyAgIGxpYnBxLWRldiBsaWJteXNxbGNsaWVudC1kZXYgbGlieG1sMi1kZXYgc3dpZyBweXRob24tZGV2CisKKyMgUmV0cmlldmUgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBzb3VyY2UgcGFja2FnZQorY2QgCitoZyBjbG9uZSBodHRwOi8vd3d3LmZyZWVkaWFtZXRlci5uZXQvaGcvZnJlZURpYW1ldGVyCitjZCBmcmVlRGlhbWV0ZXIKKworIyBQcmVwYXJlIGZvciBEZWJpYW4gcGFja2FnZQorbG4gLXMgY29udHJpYi9kZWJpYW4KKworIyBCdWlsZCB0aGUgcGFja2FnZXMKK2Zha2Vyb290IGRoIGJpbmFyeQorCisjIEluc3RhbGwgdGhlIHBhY2thZ2VzCitjZCAuLgorc3VkbyBkcGtnIC1pICouZGViCisKKworIyBUaGUgZm9sbG93aW5nIGxpbmVzIG1heSBoZWxwIHlvdSBnZXR0aW5nIHN0YXJ0ZWQuLi4uIChleGVjdXRlIGFzIHJvb3QpCitsbiAtcyAvZXRjL3NzbC9jZXJ0cy9zc2wtY2VydC1zbmFrZW9pbC5wZW0gL2V0Yy9zc2wvY2VydHMvZnJlZURpYW1ldGVyLnBlbQorbG4gLXMgL2V0Yy9zc2wvcHJpdmF0ZS9zc2wtY2VydC1zbmFrZW9pbC5rZXkgL2V0Yy9zc2wvcHJpdmF0ZS9mcmVlRGlhbWV0ZXIua2V5Cit6Y2F0IC91c3Ivc2hhcmUvZG9jL2ZyZWVkaWFtZXRlci1kYWVtb24vZXhhbXBsZXMvZnJlZWRpYW1ldGVyLmNvbmYuc2FtcGxlLmd6ID4gL2V0Yy9mcmVlRGlhbWV0ZXIvZnJlZURpYW1ldGVyLmNvbmYKK2VjaG8gIklkZW50aXR5PVwibG9jYWxob3N0LmxvY2FsZG9tYWluXCI7IiA+PiAvZXRjL2ZyZWVEaWFtZXRlci9mcmVlRGlhbWV0ZXIuY29uZgorZnJlZURpYW1ldGVyZAorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2ZyZWVEaWFtZXRlciBpcyB0ZXN0ZWQgcmVndWxhcmx5IG9uIGFsbCBjdXJyZW50IFVidW50dSBkaXN0cmlidXRpb25zIHNpbmNlIEludHJlcGlkIChjb21waWxlZCBmcm9tIHNvdXJjZSBhcyBkZXNjcmliZWQgYmVsb3cpCitVYnVudHUgSGFyZHkgc3VwcG9ydCBpcyBrbm93biB0byBiZSBicm9rZW4uCisKK1RoZSBEZWJpYW4gcGFja2FnZSBoYXMgYmVlbiBnZW5lcmF0ZWQgd2l0aCBzdWNjZXNzIG9uIERlYmlhbiAoPj1TcXVlZXplKSBhbmQgVWJ1bnR1ICg+PUthcm1pYykuCisKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0KK1N0ZXAgYnkgc3RlcCBpbnN0cnVjdGlvbnMgd2l0aG91dCB1c2luZyB0aGUgZGViaGVscGVyIHRvb2xzOgorCisxKSBJbnN0YWxsIGFsbCBwYWNrYWdlcyBkZXBlbmRlbmNpZXMKKyMgc3VkbyBhcHQtZ2V0IGluc3RhbGwgbWVyY3VyaWFsIGNtYWtlIG1ha2UgZ2NjIGcrKyBiaXNvbiBmbGV4IGxpYnNjdHAtZGV2IGxpYmdudXRscy1kZXYgbGliZ2NyeXB0LWRldiBsaWJpZG4xMS1kZXYKKworMikgKE9QVElPTikgSWYgeW91IHdpbGwgY29tcGlsZSBtb2R1bGVzIHRoYXQgcmVxdWlyZSBwb3N0Z3Jlc3FsLCBhbHNvIGluc3RhbGw6CisjIHN1ZG8gYXB0LWdldCBpbnN0YWxsIGxpYnBxLWRldgorICAgYW5kIGZvciBteXNxbDoKKyMgc3VkbyBhcHQtZ2V0IGluc3RhbGwgbGlibXlzcWxjbGllbnQtZGV2CisKKzMpIChPUFRJT04pIElmIHlvdSB3YW50IGEgbW9yZSB1c2VyLWZyaWVuZGx5IGludGVyZmFjZSwgaW5zdGFsbCB0aGlzOgorIyBzdWRvIGFwdC1nZXQgaW5zdGFsbCBjbWFrZS1jdXJzZXMtZ3VpCisKKzQpIFJldHJpZXZlIHRoZSBzb3VyY2UgZmlsZXMKKyMgaGcgY2xvbmUgaHR0cDovL3d3dy5mcmVlZGlhbWV0ZXIubmV0L2hnL2ZyZWVEaWFtZXRlcgorCis1KSBDcmVhdGUgYSBidWlsZCBkaXJlY3RvcnksIGFuZCBlbnRlciBpdAorIyBta2RpciBmRGJ1aWxkCisjIGNkIGZEYnVpbGQKKworNikgQ29uZmlndXJlIGFuZCBnZW5lcmF0ZSB0aGUgTWFrZWZpbGVzCisjIGNtYWtlIC4uL2ZyZWVEaWFtZXRlcgorIyBtYWtlIGVkaXRfY2FjaGUKKworNykgQ29tcGlsZSBhbGwgZmlsZXM6CisjIG1ha2UKKworOCkgKE9QVElPTikgU2VlIGF2YWlsYWJsZSB0YXJnZXRzOgorIyBtYWtlIGhlbHAKKworOSkgKE9QVElPTikgQ2hlY2sgdGhlIHNvZnR3YXJlIGhhcyBhIGNvcnJlY3QgYmFzaWMgYmVoYXZpb3Igb24geW91ciBlbnZpcm9ubWVudC4gLS0gb25seSBpZiB5b3UgZGlkIG5vdCBkaXNhYmxlIHRoZSB0ZXN0cyBpbiBzdGVwIDYKKyMgbWFrZSB0ZXN0CisKKzEwKSAoT1BUSU9OKSBJbnN0YWxsIHRoZSBzb2Z0d2FyZSBpbiBjb25maWd1cmVkIGxvY2F0aW9uczoKKyMgc3VkbyBtYWtlIGluc3RhbGwKKworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK05vdGU6IE9uIFVidW50dSBRdWFudGFsIFF1ZXR6YWwsIHlvdSBtYXkgaGF2ZSB0byBmb3JjZSB1c2Ugb2YgcHl0aG9uIDIuNyAKK2xpYnJhcnkgZm9yIHRoZSBkYmdfaW50ZXJhY3RpdmUgZXh0ZW5zaW9uLCBhcyBvbiBzb21lIHN5c3RlbXMgQ01ha2Ugc2VsZWN0cyB0aGUgMy4yIGxpYnJhcnkKK2J5IGRlZmF1bHQuCmRpZmYgLS1naXQgYS9JTlNUQUxMLnBrZ3NyYyBiL0lOU1RBTEwucGtnc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZGY5YjUKLS0tIC9kZXYvbnVsbAorKysgYi9JTlNUQUxMLnBrZ3NyYwpAQCAtMCwwICsxLDIxIEBACitUaGUgc2ltcGxlc3Qgd2F5IHRvIGluc3RhbGwgb24gTmV0QlNELCBEcmFnb25GbHksIE1pckJTRCBvciBvdGhlcgorcGtnc3JjIHBsYXRmb3JtcyBpczoKKwlwa2dfYWRkIGZyZWVEaWFtZXRlcgorCitJZiBubyBiaW5hcnkgcGFja2FnZSBleGlzdHM6CisJY2QgL3Vzci9wa2dzcmMvbmV0L2ZyZWVEaWFtZXRlcgorCW1ha2UgaW5zdGFsbAorCitJZiB5b3Ugd2FudCB0byBidWlsZCBhbmQgaW5zdGFsbCBmcmVlRGlhbWV0ZXIgZnJvbSB0aGUgcmVwb3NpdG9yeSwKK3lvdSdsbCBuZWVkIHRvIGluc3RhbGw6CisJcGtnX2FkZCBiaXNvbiBwa2ctY29uZmlnIGxpYmlkbiBnbnV0bHMgbGliZ2NyeXB0IG1lcmN1cmlhbAorYW5kIGZvbGxvdyB0aGUgdXN1YWwgaW5zdGFsbGF0aW9uIG5vdGUuCisKK05ldEJTRCBkb2VzIG5vdCBzdXBwb3J0IFNDVFAsIHNvIHlvdSBoYXZlIHRvIGFkZAorCS1ERElTQUJMRV9TQ1RQOkJPT0w9T04KK3RvIHRoZSBjbWFrZSBjb21tYW5kIGxpbmUuCisKK0ZvciB0aGUgb3B0aW9uYWwgZXh0ZW5zaW9ucywgeW91IG5lZWQgbXlzcWwqLWNsaWVudCwgcG9zdGdyZXMqLWNsaWVudCwKK2xpYnhtbDIuICBGb3IgdGhlIGRlYnVnZ2luZyBleHRlbnNpb25zLCB5b3UgYWxzbyBuZWVkIHN3aWcgYW5kIGEKK3B5dGhvbiAtLSBpbnN0YWxsIGFzIHVzdWFsLgorCmRpZmYgLS1naXQgYS9MSUNFTlNFIGIvTElDRU5TRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWQ1MGE4Ci0tLSAvZGV2L251bGwKKysrIGIvTElDRU5TRQpAQCAtMCwwICsxLDUxIEBACitVbmxlc3Mgc3BlY2lmaWVkIG90aGVyd2lzZSwgdGhpcyBzb2Z0d2FyZSBwYWNrYWdlIGlzIGNvcHlyaWdodGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQlNEIGxpY2Vuc2UsIGFzIGZvbGxvdzoKKworU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKQorCitDb3B5cmlnaHQgKGMpIDIwMDgtMjAxMSwgV0lERSBQcm9qZWN0IGFuZCBOSUNUCitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAKK3Blcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCisgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCisgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAgCisqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCisgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCisgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgorICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFdJREUgUHJvamVjdCBvciBOSUNUIG5vciB0aGUgCisgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAKKyAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAorICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgV0lERSBQcm9qZWN0IGFuZCAKKyAgTklDVC4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIAorV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIAorUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIAorQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCitMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCitJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgCitUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIAorQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKworCitUaGUgZm9sbG93aW5nIGF1dGhvcnMgaGF2ZSBjb250cmlidXRlZCB0aGUgZm9sbG93aW5nIGZpbGVzLiBTZWUgc291cmNlIGZpbGVzIGZvciBjb3B5cmlnaHQgaW5mb3JtYXRpb24uCisKKyAqIEFsZXhhbmRyZSBXZXN0ZmFobDoKKyAgZXh0ZW5zaW9ucy9kaWN0X3NpcC8qCisgIGV4dGVuc2lvbnMvYXBwX3NpcC8qCisgIGV4dGVuc2lvbnMvYXBwX3JhZGd3L3Jnd3hfc2lwLmMKKworICogU291aGVpbCBCZW4gQXllZDoKKyAgZXh0ZW5zaW9ucy9hcHBfZGlhbWVhcC8qCisKKyAqIEZyYW5jb2lzIEJhcmQ6CisgIGV4dGVuc2lvbnMvZGljdF9taXA2YS8qCisgIGV4dGVuc2lvbnMvZGljdF9taXA2aS8qCisgIGV4dGVuc2lvbnMvZGljdF9uYXNfbWlwdjYvKgorICBleHRlbnNpb25zL2RpY3RfcmZjNTc3Ny8qCmRpZmYgLS1naXQgYS9ORVdTIGIvTkVXUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjFiZjE4Ci0tLSAvZGV2L251bGwKKysrIGIvTkVXUwpAQCAtMCwwICsxLDUgQEAKK1RoZSBkaWdlc3RlZCBjaGFuZ2Vsb2cgY2FuIGJlIGZvdW5kIHVuZGVyOgorIGNvbnRyaWIvZGViaWFuL2NoYW5nZWxvZworIAorWW91IGNhbiBhbHNvIGZpbmQgdGhlIGV4aGF1c3RpdmUgbGlzdCBvZiBjaGFuZ2UgdXNpbmcgbWVyY3VyaWFsIGhpc3RvcnksIAorb3IgYXQgdGhlIGZvbGxvd2luZyBVUkw6IGh0dHA6Ly93d3cuZnJlZWRpYW1ldGVyLm5ldC9oZy9mcmVlRGlhbWV0ZXIvc2hvcnRsb2cKZGlmZiAtLWdpdCBhL1BSRVJFUVVJU0lURVMgYi9QUkVSRVFVSVNJVEVTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNjg3YzYKLS0tIC9kZXYvbnVsbAorKysgYi9QUkVSRVFVSVNJVEVTCkBAIC0wLDAgKzEgQEAKK3N1ZG8gYXB0LWdldCBpbnN0YWxsIGNtYWtlIGNtYWtlLWN1cnNlcy1ndWkgbWFrZSBnY2MgZysrIGJpc29uIGZsZXggbGlic2N0cC1kZXYgbGliZ251dGxzLWRldiBsaWJnY3J5cHQtZGV2IGxpYmlkbjExLWRldgpkaWZmIC0tZ2l0IGEvUkVBRE1FIGIvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NTVlYzUKLS0tIC9kZXYvbnVsbAorKysgYi9SRUFETUUKQEAgLTAsMCArMSw0MyBAQAorZnJlZURpYW1ldGVyIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBEaWFtZXRlciBwcm90b2NvbC4KKworRGlhbWV0ZXIgaXMgYSBwcm90b2NvbCBkZXNpZ25lZCB0byBjYXJyeSBBdXRoZW50aWNhdGlvbiwgQXV0aG9yaXphdGlvbiBhbmQKK0FjY291bnRpbmcgKEFBQSkgcGF5bG9hZC4gSXQgaXMgYW4gZXZvbHV0aW9uIG9mIHRoZSBSQURJVVMgcHJvdG9jb2wgKGFzIHRoZSAKK25hbWUgc3VnZ2VzdHMpLgorCitEaWFtZXRlciBpcyBhbiBleHRlbnNpYmxlIHByb3RvY29sLiBSRkMzNTg4IChjdXJyZW50bHkgdW5kZXIgcmV2aXNpb24pIGRlZmluZXMgdGhlCitCYXNlIFByb3RvY29sIHRoYXQgYWxsIERpYW1ldGVyIG5vZGVzIG11c3Qgc3VwcG9ydCwgd2hpbGUgb3RoZXIgZG9jdW1lbnRzIGRlZmluZQordGhlIGFkZGl0aW9uYWwgcHJvdG9jb2wgc3VwcG9ydCBmb3Igc3BlY2lmaWMgYXBwbGljYXRpb25zLiBTdWNoIGFwcGxpY2F0aW9ucyBpbmNsdWRlIAorZm9yIGV4YW1wbGUgTmV0d29yayBBY2Nlc3MgU2VydmVycyAoUkZDNDAwNSksIEVBUCAoUkZDNDA3MiksIC4uLgorCisKK1RoZSBpbXBsZW1lbnRhdGlvbiBjb25zaXN0cyBpbiBzZXZlcmFsIGNvbXBvbmVudHM6CisgLSBsaWJmZHByb3RvIDogdGhpcyBzaGFyZWQgbGlicmFyeSBwcm92aWRlcyB0aGUgZnVuY3Rpb25zIHRvIG1hbmlwdWxhdGUgRGlhbWV0ZXIKKyAgICAgIG1lc3NhZ2VzIGFuZCBkaWN0aW9uYXJ5LiBUaGlzIGxpYnJhcnkgaXMgbWVhbnQgdG8gYmUgcmUtdXNlZCBieSBvdGhlciBwcm9qZWN0cworICAgICAgdGhhdCB3b3VsZCByZXF1aXJlIHBhcnNpbmcgb3IgbWFuaXB1bGF0aW5nIERpYW1ldGVyIG1lc3NhZ2VzLgorICAgICAgCisgLSBsaWJmZGNvcmUgOiB0aGlzIHNoYXJlZCBsaWJyYXJ5IGNvbnRhaW5zIHRoZSBjb3JlIG9mIHRoZSBmcmFtZXdvcmsuIEl0IGVzdGFibGlzaGVzIAorICAgICAgdGhlIG5ldHdvcmsgY29ubmVjdGlvbnMgd2l0aCBvdGhlciBEaWFtZXRlciBwZWVycyBhbmQgcGVyZm9ybXMgdGhlIHRhc2tzIGRlc2NyaWJlZCAKKyAgICAgIGluIERpYW1ldGVyIEJhc2UgUHJvdG9jb2wsIHN1Y2ggYXMgd2F0Y2hkb2dzLCBiYXNpYyByb3V0aW5nLCAuLi4gSXQgYWxzbyBoYW5kbGVzIAorICAgICAgdGhlIGxvYWRpbmcgb2YgZXh0ZW5zaW9ucyAoc2VlIGJlbG93KS4KKyAgICAgIAorIC0gZnJlZURpYW1ldGVyZCA6IHRoaXMgc2ltcGxlIGRhZW1vbiBwYXJzZXMgdGhlIGNvbW1hbmQgbGluZSBhbmQgaW5pdGlhbGl6ZXMgdGhlCisgICAgICBmcmVlRGlhbWV0ZXIgZnJhbWV3b3JrLiBVc2UgaXQgZm9yIHlvdXIgRGlhbWV0ZXIgc2VydmVyICYgYWdlbnQgY29tcG9uZW50cy4KKyAgICAgIEluIGNhc2Ugb2YgRGlhbWV0ZXIgY2xpZW50cywgeW91IHByb2JhYmx5IHdpbGwgcHJlZmVyIGxpbmtpbmcgdGhlIGxpYmZkY29yZSAKKyAgICAgIGRpcmVjdGx5IHdpdGggeW91ciBjbGllbnQgYXBwbGljYXRpb24gdGhhdCBtdXN0IGJlIG1hZGUgRGlhbWV0ZXItYXdhcmUuCisgICAgICAKKyAtIGV4dGVuc2lvbnMgOiB0aGUgZXh0ZW5zaW9ucyBwcm92aWRlIHRoZSBtZWFuIHRvIGF1Z21lbnQgdGhlIGZlYXR1cmVzIG9mIHRoZQorICAgICAgZnJlZURpYW1ldGVyZCBmcmFtZXdvcmsuIEV4dGVuc2lvbnMgY2FuIHByb3ZpZGUgdGhlIGhhbmRsaW5nIG9mIGEgRGlhbWV0ZXIgCisgICAgICBzZXJ2ZXIgYXBwbGljYXRpb24sIGJ1dCBhbHNvIGFkdmFuY2VkIHJvdXRpbmcgZmVhdHVyZXMsIHBlZXIgbWFuYWdlbWVudCwgZXRjLgorCisKK1NlZSBodHRwOi8vd3d3LmZyZWVkaWFtZXRlci5uZXQvIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBwcm9qZWN0LgorCitmcmVlRGlhbWV0ZXIgd2FzIHByZXZpb3VzbHkga25vd24gYXMgdGhlICJ3YWFhZCIgcHJvamVjdCAoV0lERSBBQUEgRGFlbW9uKQorCitUaGlzIHByb2plY3QgaXMgbm90IHJlbGF0ZWQgdG8gdGhlICJmcmVlZGlhbWV0ZXIiIHByb2plY3QgZnJvbSBTdW4gb24gc291cmNlZm9yZ2UuCisKK0F1dGhvcjogU2ViYXN0aWVuIERlY3VnaXMuCisKK1NlZSBMSUNFTlNFIGZpbGUgZm9yIGxlZ2FsIGluZm9ybWF0aW9uIG9uIHRoaXMgc29mdHdhcmUuCisKK1NlZSBJTlNUQUxMIGZvciBpbmZvcm1hdGlvbiBvbiBidWlsZGluZyBhbmQgdXNpbmcgdGhpcyBzb2Z0d2FyZS4KZGlmZiAtLWdpdCBhL2NtYWtlL01vZHVsZXMvQ01ha2VVc2VyVXNlQmlzb24uY21ha2UgYi9jbWFrZS9Nb2R1bGVzL0NNYWtlVXNlclVzZUJpc29uLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNTc1NDUKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFrZS9Nb2R1bGVzL0NNYWtlVXNlclVzZUJpc29uLmNtYWtlCkBAIC0wLDAgKzEsNzIgQEAKKyMgLSBMb29rIGZvciBHTlUgQmlzb24sIHRoZSBwYXJzZXIgZ2VuZXJhdG9yCisjIEJhc2VkIG9mZiBhIG5ld3MgcG9zdCBmcm9tIEFuZHkgQ2VkaWxuaWsgYXQgS2l0d2FyZQorIyBEZWZpbmVzIHRoZSBmb2xsb3dpbmc6CisjICBCSVNPTl9FWEVDVVRBQkxFIC0gcGF0aCB0byB0aGUgYmlzb24gZXhlY3V0YWJsZQorIyAgQklTT05fRklMRSAtIHBhcnNlIGEgZmlsZSB3aXRoIGJpc29uCisjICBCSVNPTl9QUkVGSVhfT1VUUFVUUyAtIFNldCB0byB0cnVlIHRvIG1ha2UgQklTT05fRklMRSBwcm9kdWNlIHByZWZpeGVkCisjICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbHMgaW4gdGhlIGdlbmVyYXRlZCBvdXRwdXQgYmFzZWQgb24gZmlsZW5hbWUuCisjICAgICAgICAgICAgICAgICAgICAgICAgIFNvIGZvciAke2ZpbGVuYW1lfS55LCB5b3UnbGwgZ2V0ICR7ZmlsZW5hbWV9cGFyc2UoKSwgZXRjLgorIyAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0ZWFkIG9mIHl5cGFyc2UoKS4KKyMgIEJJU09OX0dFTkVSQVRFX0RFRklORVMgLSBTZXQgdG8gdHJ1ZSB0byBtYWtlIEJJU09OX0ZJTEUgb3V0cHV0IHRoZSBtYXRjaGluZworIyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5oIGZpbGUgZm9yIGEgLmMgZmlsZS4gWW91IHdhbnQgdGhpcyBpZiB5b3UncmUgdXNpbmcKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGV4LgorCitJRihOT1QgREVGSU5FRCBCSVNPTl9QUkVGSVhfT1VUUFVUUykKKyBTRVQoQklTT05fUFJFRklYX09VVFBVVFMgRkFMU0UpCitFTkRJRihOT1QgREVGSU5FRCBCSVNPTl9QUkVGSVhfT1VUUFVUUykKKworSUYoTk9UIERFRklORUQgQklTT05fR0VORVJBVEVfREVGSU5FUykKKyBTRVQoQklTT05fR0VORVJBVEVfREVGSU5FUyBGQUxTRSkKK0VORElGKE5PVCBERUZJTkVEIEJJU09OX0dFTkVSQVRFX0RFRklORVMpCisKK0lGKE5PVCBCSVNPTl9FWEVDVVRBQkxFKQorIE1FU1NBR0UoU1RBVFVTICJMb29raW5nIGZvciBiaXNvbiIpCisgRklORF9QUk9HUkFNKEJJU09OX0VYRUNVVEFCTEUgYmlzb24pCisgSUYoQklTT05fRVhFQ1VUQUJMRSkKKyAgIE1FU1NBR0UoU1RBVFVTICJMb29raW5nIGZvciBiaXNvbiAtLSAke0JJU09OX0VYRUNVVEFCTEV9IikKKyBFTkRJRihCSVNPTl9FWEVDVVRBQkxFKQorIE1BUktfQVNfQURWQU5DRUQoQklTT05fRVhFQ1VUQUJMRSkKK0VORElGKE5PVCBCSVNPTl9FWEVDVVRBQkxFKQorCitJRihCSVNPTl9FWEVDVVRBQkxFKQorIE1BQ1JPKEJJU09OX0ZJTEUgRklMRU5BTUUpCisgICBHRVRfRklMRU5BTUVfQ09NUE9ORU5UKFBBVEggIiR7RklMRU5BTUV9IiBQQVRIKQorICAgSUYoIiR7UEFUSH0iIFNUUkVRVUFMICIiKQorICAgICBTRVQoUEFUSF9PUFQgIiIpCisgICBFTFNFKCIke1BBVEh9IiBTVFJFUVVBTCAiIikKKyAgICAgU0VUKFBBVEhfT1BUICIvJHtQQVRIfSIpCisgICBFTkRJRigiJHtQQVRIfSIgU1RSRVFVQUwgIiIpCisgICBHRVRfRklMRU5BTUVfQ09NUE9ORU5UKEhFQUQgIiR7RklMRU5BTUV9IiBOQU1FX1dFKQorICAgSUYoTk9UIEVYSVNUUyAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9JHtQQVRIX09QVH0iKQorICAgICBGSUxFKE1BS0VfRElSRUNUT1JZICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0ke1BBVEhfT1BUfSIpCisgICBFTkRJRihOT1QgRVhJU1RTICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0ke1BBVEhfT1BUfSIpCisgICBJRihCSVNPTl9QUkVGSVhfT1VUUFVUUykKKyAgICAgU0VUKFBSRUZJWCAiJHtIRUFEfSIpCisgICBFTFNFKEJJU09OX1BSRUZJWF9PVVRQVVRTKQorICAgICBTRVQoUFJFRklYICJ5eSIpCisgICBFTkRJRihCSVNPTl9QUkVGSVhfT1VUUFVUUykKKyAgIFNFVChPVVRGSUxFICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0ke1BBVEhfT1BUfS8ke0hFQUR9LnRhYi5jIikKKyAgIElGKEJJU09OX0dFTkVSQVRFX0RFRklORVMpCisgICAgIFNFVChIRUFERVIgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfSR7UEFUSF9PUFR9LyR7SEVBRH0udGFiLmgiKQorICAgICBBRERfQ1VTVE9NX0NPTU1BTkQoCisgICAgICAgT1VUUFVUICIke09VVEZJTEV9IiAiJHtIRUFERVJ9IgorICAgICAgIENPTU1BTkQgIiR7QklTT05fRVhFQ1VUQUJMRX0iCisgICAgICAgQVJHUyAiLS1uYW1lLXByZWZpeD0ke1BSRUZJWH0iCisgICAgICAgIi0tZGVmaW5lcyIKKyAgICAgICAiLS1vdXRwdXQtZmlsZT0ke09VVEZJTEV9IgorICAgICAgICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vJHtGSUxFTkFNRX0iCisgICAgICAgREVQRU5EUyAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9LyR7RklMRU5BTUV9IikKKyAgICAgU0VUX1NPVVJDRV9GSUxFU19QUk9QRVJUSUVTKCIke09VVEZJTEV9IiAiJHtIRUFERVJ9IiBQUk9QRVJUSUVTIEdFTkVSQVRFRCBUUlVFKQorICAgICBTRVRfU09VUkNFX0ZJTEVTX1BST1BFUlRJRVMoIiR7SEVBREVSfSIgUFJPUEVSVElFUyBIRUFERVJfRklMRV9PTkxZIFRSVUUpCisgICBFTFNFKEJJU09OX0dFTkVSQVRFX0RFRklORVMpCisgICAgIEFERF9DVVNUT01fQ09NTUFORCgKKyAgICAgICBPVVRQVVQgIiR7T1VURklMRX0iCisgICAgICAgQ09NTUFORCAiJHtCSVNPTl9FWEVDVVRBQkxFfSIKKyAgICAgICBBUkdTICItLW5hbWUtcHJlZml4PSR7UFJFRklYfSIKKyAgICAgICAiLS1vdXRwdXQtZmlsZT0ke09VVEZJTEV9IgorICAgICAgICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vJHtGSUxFTkFNRX0iCisgICAgICAgREVQRU5EUyAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9LyR7RklMRU5BTUV9IikKKyAgICAgU0VUX1NPVVJDRV9GSUxFU19QUk9QRVJUSUVTKCIke09VVEZJTEV9IiBQUk9QRVJUSUVTIEdFTkVSQVRFRCBUUlVFKQorICAgRU5ESUYoQklTT05fR0VORVJBVEVfREVGSU5FUykKKyBFTkRNQUNSTyhCSVNPTl9GSUxFKSAKK0VORElGKEJJU09OX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9jbWFrZS9Nb2R1bGVzL0NNYWtlVXNlclVzZUZsZXguY21ha2UgYi9jbWFrZS9Nb2R1bGVzL0NNYWtlVXNlclVzZUZsZXguY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QwMzk0ZgotLS0gL2Rldi9udWxsCisrKyBiL2NtYWtlL01vZHVsZXMvQ01ha2VVc2VyVXNlRmxleC5jbWFrZQpAQCAtMCwwICsxLDQ3IEBACisjIC0gTG9vayBmb3IgR05VIGZsZXgsIHRoZSBsZXhlciBnZW5lcmF0b3IuCisjIERlZmluZXMgdGhlIGZvbGxvd2luZzoKKyMgIEZMRVhfRVhFQ1VUQUJMRSAtIHBhdGggdG8gdGhlIGZsZXggZXhlY3V0YWJsZQorIyAgRkxFWF9GSUxFIC0gcGFyc2UgYSBmaWxlIHdpdGggZmxleAorIyAgRkxFWF9QUkVGSVhfT1VUUFVUUyAtIFNldCB0byB0cnVlIHRvIG1ha2UgRkxFWF9GSUxFIHByb2R1Y2Ugb3V0cHV0cyBvZgorIyAgICAgICAgICAgICAgICAgICAgICAgIGxleC4ke2ZpbGVuYW1lfS5jLCBub3QgbGV4Lnl5LmMgLiBQYXNzZXMgLVAgdG8gZmxleC4gCisKK0lGKE5PVCBERUZJTkVEIEZMRVhfUFJFRklYX09VVFBVVFMpCisgIFNFVChGTEVYX1BSRUZJWF9PVVRQVVRTIEZBTFNFKQorRU5ESUYoTk9UIERFRklORUQgRkxFWF9QUkVGSVhfT1VUUFVUUykgCisKK0lGKE5PVCBGTEVYX0VYRUNVVEFCTEUpCisgIE1FU1NBR0UoU1RBVFVTICJMb29raW5nIGZvciBmbGV4IikKKyAgRklORF9QUk9HUkFNKEZMRVhfRVhFQ1VUQUJMRSBmbGV4KQorICBJRihGTEVYX0VYRUNVVEFCTEUpCisgICAgTUVTU0FHRShTVEFUVVMgIkxvb2tpbmcgZm9yIGZsZXggLS0gJHtGTEVYX0VYRUNVVEFCTEV9IikKKyAgRU5ESUYoRkxFWF9FWEVDVVRBQkxFKQorIE1BUktfQVNfQURWQU5DRUQoRkxFWF9FWEVDVVRBQkxFKQorRU5ESUYoTk9UIEZMRVhfRVhFQ1VUQUJMRSkgCisKK0lGKEZMRVhfRVhFQ1VUQUJMRSkKKyAgTUFDUk8oRkxFWF9GSUxFIEZJTEVOQU1FKQorICAgIEdFVF9GSUxFTkFNRV9DT01QT05FTlQoUEFUSCAiJHtGSUxFTkFNRX0iIFBBVEgpCisgICAgSUYoIiR7UEFUSH0iIFNUUkVRVUFMICIiKQorICAgICAgU0VUKFBBVEhfT1BUICIiKQorICAgIEVMU0UoIiR7UEFUSH0iIFNUUkVRVUFMICIiKQorICAgICAgU0VUKFBBVEhfT1BUICIvJHtQQVRIfSIpCisgICAgRU5ESUYoIiR7UEFUSH0iIFNUUkVRVUFMICIiKQorICAgIElGKE5PVCBFWElTVFMgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfSR7UEFUSF9PUFR9IikKKyAgICAgIEZJTEUoTUFLRV9ESVJFQ1RPUlkgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfSR7UEFUSF9PUFR9IikKKyAgICBFTkRJRihOT1QgRVhJU1RTICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0ke1BBVEhfT1BUfSIpCisgICAgSUYoRkxFWF9QUkVGSVhfT1VUUFVUUykKKyAgICAgIEdFVF9GSUxFTkFNRV9DT01QT05FTlQoUFJFRklYICIke0ZJTEVOQU1FfSIgTkFNRV9XRSkKKyAgICBFTFNFKEZMRVhfUFJFRklYX09VVFBVVFMpCisgICAgICBTRVQoUFJFRklYICJ5eSIpCisgICAgRU5ESUYoRkxFWF9QUkVGSVhfT1VUUFVUUykKKyAgICBTRVQoT1VURklMRSAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9JHtQQVRIX09QVH0vbGV4LiR7UFJFRklYfS5jIikKKyAgICBBRERfQ1VTVE9NX0NPTU1BTkQoCisgICAgICBPVVRQVVQgIiR7T1VURklMRX0iCisgICAgICBDT01NQU5EICIke0ZMRVhfRVhFQ1VUQUJMRX0iCisgICAgICBBUkdTICItUCR7UFJFRklYfSIKKyAgICAgICItbyR7T1VURklMRX0iCisgICAgICAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9LyR7RklMRU5BTUV9IgorICAgICAgREVQRU5EUyAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9LyR7RklMRU5BTUV9IikKKyAgICBTRVRfU09VUkNFX0ZJTEVTX1BST1BFUlRJRVMoIiR7T1VURklMRX0iIFBST1BFUlRJRVMgR0VORVJBVEVEIFRSVUUpCisgIEVORE1BQ1JPKEZMRVhfRklMRSkKK0VORElGKEZMRVhfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL2NtYWtlL01vZHVsZXMvRmluZEdjcnlwdC5jbWFrZSBiL2NtYWtlL01vZHVsZXMvRmluZEdjcnlwdC5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDQ1MTdkCi0tLSAvZGV2L251bGwKKysrIGIvY21ha2UvTW9kdWxlcy9GaW5kR2NyeXB0LmNtYWtlCkBAIC0wLDAgKzEsMzYgQEAKKyMgLSBGaW5kIGdudXRscworIyBGaW5kIHRoZSBuYXRpdmUgR0NSWVBUIGluY2x1ZGVzIGFuZCBsaWJyYXJ5CisjCisjICBHQ1JZUFRfRk9VTkQgLSBUcnVlIGlmIGdudXRscyBmb3VuZC4KKyMgIEdDUllQVF9JTkNMVURFX0RJUiAtIHdoZXJlIHRvIGZpbmQgZ251dGxzLmgsIGV0Yy4KKyMgIEdDUllQVF9MSUJSQVJJRVMgLSBMaXN0IG9mIGxpYnJhcmllcyB3aGVuIHVzaW5nIGdudXRscy4KKworaWYgKEdDUllQVF9JTkNMVURFX0RJUiBBTkQgR0NSWVBUX0xJQlJBUklFUykKKyAgc2V0KEdDUllQVF9GSU5EX1FVSUVUTFkgVFJVRSkKK2VuZGlmIChHQ1JZUFRfSU5DTFVERV9ESVIgQU5EIEdDUllQVF9MSUJSQVJJRVMpCisKKyMgSW5jbHVkZSBkaXIKK2ZpbmRfcGF0aChHQ1JZUFRfSU5DTFVERV9ESVIKKwlOQU1FUworCSAgZ2NyeXB0LmgKKykKKworIyBMaWJyYXJ5CitmaW5kX2xpYnJhcnkoR0NSWVBUX0xJQlJBUlkgCisgIE5BTUVTIGdjcnlwdAorKQorCisjIGhhbmRsZSB0aGUgUVVJRVRMWSBhbmQgUkVRVUlSRUQgYXJndW1lbnRzIGFuZCBzZXQgR0NSWVBUX0ZPVU5EIHRvIFRSVUUgaWYgCisjIGFsbCBsaXN0ZWQgdmFyaWFibGVzIGFyZSBUUlVFCitJTkNMVURFKEZpbmRQYWNrYWdlSGFuZGxlU3RhbmRhcmRBcmdzKQorRklORF9QQUNLQUdFX0hBTkRMRV9TVEFOREFSRF9BUkdTKEdDUllQVCBERUZBVUxUX01TRyBHQ1JZUFRfTElCUkFSWSBHQ1JZUFRfSU5DTFVERV9ESVIpCisKK0lGKEdDUllQVF9GT1VORCkKKyAgU0VUKCBHQ1JZUFRfTElCUkFSSUVTICR7R0NSWVBUX0xJQlJBUll9ICkKK0VMU0UoR0NSWVBUX0ZPVU5EKQorICBTRVQoIEdDUllQVF9MSUJSQVJJRVMgKQorRU5ESUYoR0NSWVBUX0ZPVU5EKQorCisjIExhc3RseSBtYWtlIGl0IHNvIHRoYXQgdGhlIEdDUllQVF9MSUJSQVJZIGFuZCBHQ1JZUFRfSU5DTFVERV9ESVIgdmFyaWFibGVzCisjIG9ubHkgc2hvdyB1cCB1bmRlciB0aGUgYWR2YW5jZWQgb3B0aW9ucyBpbiB0aGUgZ3VpIGNtYWtlIGFwcGxpY2F0aW9ucy4KK01BUktfQVNfQURWQU5DRUQoIEdDUllQVF9MSUJSQVJZIEdDUllQVF9JTkNMVURFX0RJUiApCmRpZmYgLS1naXQgYS9jbWFrZS9Nb2R1bGVzL0ZpbmRHbnVUTFMuY21ha2UgYi9jbWFrZS9Nb2R1bGVzL0ZpbmRHbnVUTFMuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTljNGZmZgotLS0gL2Rldi9udWxsCisrKyBiL2NtYWtlL01vZHVsZXMvRmluZEdudVRMUy5jbWFrZQpAQCAtMCwwICsxLDY0IEBACisjIC0gRmluZCBnbnV0bHMKKyMgRmluZCB0aGUgbmF0aXZlIEdOVVRMUyBpbmNsdWRlcyBhbmQgbGlicmFyeQorIworIyAgR05VVExTX0ZPVU5EIC0gVHJ1ZSBpZiBnbnV0bHMgZm91bmQuCisjICBHTlVUTFNfSU5DTFVERV9ESVIgLSB3aGVyZSB0byBmaW5kIGdudXRscy5oLCBldGMuCisjICBHTlVUTFNfTElCUkFSSUVTIC0gTGlzdCBvZiBsaWJyYXJpZXMgd2hlbiB1c2luZyBnbnV0bHMuCisjICBHTlVUTFNfVkVSU0lPTl8yMTAgLSB0cnVlIGlmIEdudVRMUyB2ZXJzaW9uIGlzID49IDIuMTAuMCAoZG9lcyBub3QgcmVxdWlyZSBhZGRpdGlvbmFsIHNlcGFyYXRlIGdjcnlwdCBpbml0aWFsaXphdGlvbikKKyMgIEdOVVRMU19WRVJTSU9OXzIxMiAtIHRydWUgaWYgR251VExTIHZlcnNpb24gaXMgPj0gMi4xMi4wIChzdXBwb3J0cyBnbnV0bHNfdHJhbnNwb3J0X3NldF92ZWNfcHVzaF9mdW5jdGlvbikKKyMgIEdOVVRMU19WRVJTSU9OXzMwMCAtIHRydWUgaWYgR251VExTIHZlcnNpb24gaXMgPj0gMy4wMC4wICh4NTA5IHZlcmlmaWNhdGlvbiBmdW5jdGlvbnMgY2hhbmdlZCkKKyMgIEdOVVRMU19WRVJTSU9OXzMxMCAtIHRydWUgaWYgR251VExTIHZlcnNpb24gaXMgPj0gMy4wMS4wIChzdGFiaWxpemF0aW9uIGJyYW5jaCB3aXRoIG5ldyBBUElzKQorCitpZiAoR05VVExTX0lOQ0xVREVfRElSIEFORCBHTlVUTFNfTElCUkFSSUVTKQorICBzZXQoR05VVExTX0ZJTkRfUVVJRVRMWSBUUlVFKQorZW5kaWYgKEdOVVRMU19JTkNMVURFX0RJUiBBTkQgR05VVExTX0xJQlJBUklFUykKKworIyBJbmNsdWRlIGRpcgorZmluZF9wYXRoKEdOVVRMU19JTkNMVURFX0RJUgorCU5BTUVTCisJICBnbnV0bHMuaAorCSAgZ251dGxzL2dudXRscy5oCispCisKKyMgTGlicmFyeQorZmluZF9saWJyYXJ5KEdOVVRMU19MSUJSQVJZIAorICBOQU1FUyBnbnV0bHMKKykKKworIyBoYW5kbGUgdGhlIFFVSUVUTFkgYW5kIFJFUVVJUkVEIGFyZ3VtZW50cyBhbmQgc2V0IEdOVVRMU19GT1VORCB0byBUUlVFIGlmIAorIyBhbGwgbGlzdGVkIHZhcmlhYmxlcyBhcmUgVFJVRQorSU5DTFVERShGaW5kUGFja2FnZUhhbmRsZVN0YW5kYXJkQXJncykKK0ZJTkRfUEFDS0FHRV9IQU5ETEVfU1RBTkRBUkRfQVJHUyhHTlVUTFMgREVGQVVMVF9NU0cgR05VVExTX0xJQlJBUlkgR05VVExTX0lOQ0xVREVfRElSKQorCitJRihHTlVUTFNfRk9VTkQpCisgIFNFVCggR05VVExTX0xJQlJBUklFUyAke0dOVVRMU19MSUJSQVJZfSApCitFTFNFKEdOVVRMU19GT1VORCkKKyAgU0VUKCBHTlVUTFNfTElCUkFSSUVTICkKK0VORElGKEdOVVRMU19GT1VORCkKKworIyBMYXN0bHkgbWFrZSBpdCBzbyB0aGF0IHRoZSBHTlVUTFNfTElCUkFSWSBhbmQgR05VVExTX0lOQ0xVREVfRElSIHZhcmlhYmxlcworIyBvbmx5IHNob3cgdXAgdW5kZXIgdGhlIGFkdmFuY2VkIG9wdGlvbnMgaW4gdGhlIGd1aSBjbWFrZSBhcHBsaWNhdGlvbnMuCitNQVJLX0FTX0FEVkFOQ0VEKCBHTlVUTFNfTElCUkFSWSBHTlVUTFNfSU5DTFVERV9ESVIgKQorCisjIE5vdyBjaGVjayBpZiB0aGUgbGlicmFyeSBpcyByZWNlbnQuIGdudXRsc19oYXNoIHdhcyBhZGRlZCBpbiAyLjEwLjAuCisjIEFsc28gdGVzdCBsaWJyYXJ5IGlzIGV2ZW4gbW9yZSByZWNlbnQuIGdudXRsc194NTA5X3RydXN0X2xpc3RfdmVyaWZ5X2NydCB3YXMgYWRkZWQgaW4gMy4wMC4wLgorSUYoR05VVExTX0ZPVU5EKQorICBJRiggTk9UKCAiJHtHTlVUTFNfVkVSU0lPTl9URVNUX0ZPUn0iIFNUUkVRVUFMICIke0dOVVRMU19MSUJSQVJZfSIgKSkKKyAgICBJTkNMVURFIChDaGVja0xpYnJhcnlFeGlzdHMpIAorICAgIE1FU1NBR0UoU1RBVFVTICJDaGVja2luZyBHTlVUTFMgdmVyc2lvbiIpCisgICAgVU5TRVQoR05VVExTX1ZFUlNJT05fMjEwKQorICAgIFVOU0VUKEdOVVRMU19WRVJTSU9OXzIxMCBDQUNIRSkKKyAgICBVTlNFVChHTlVUTFNfVkVSU0lPTl8yMTIpCisgICAgVU5TRVQoR05VVExTX1ZFUlNJT05fMjEyIENBQ0hFKQorICAgIFVOU0VUKEdOVVRMU19WRVJTSU9OXzMwMCkKKyAgICBVTlNFVChHTlVUTFNfVkVSU0lPTl8zMDAgQ0FDSEUpCisgICAgVU5TRVQoR05VVExTX1ZFUlNJT05fMzEwKQorICAgIFVOU0VUKEdOVVRMU19WRVJTSU9OXzMxMCBDQUNIRSkKKyAgICBHRVRfRklMRU5BTUVfQ09NUE9ORU5UKEdOVVRMU19QQVRIICR7R05VVExTX0xJQlJBUll9IFBBVEgpCisgICAgQ0hFQ0tfTElCUkFSWV9FWElTVFMoZ251dGxzIGdudXRsc19oYXNoICR7R05VVExTX1BBVEh9IEdOVVRMU19WRVJTSU9OXzIxMCkgCisgICAgQ0hFQ0tfTElCUkFSWV9FWElTVFMoZ251dGxzIGdudXRsc190cmFuc3BvcnRfc2V0X3ZlY19wdXNoX2Z1bmN0aW9uICR7R05VVExTX1BBVEh9IEdOVVRMU19WRVJTSU9OXzIxMikgCisgICAgQ0hFQ0tfTElCUkFSWV9FWElTVFMoZ251dGxzIGdudXRsc194NTA5X3RydXN0X2xpc3RfdmVyaWZ5X2NydCAke0dOVVRMU19QQVRIfSBHTlVUTFNfVkVSU0lPTl8zMDApIAorICAgIENIRUNLX0xJQlJBUllfRVhJU1RTKGdudXRscyBnbnV0bHNfaGFuZHNoYWtlX3NldF90aW1lb3V0ICR7R05VVExTX1BBVEh9IEdOVVRMU19WRVJTSU9OXzMxMCkgCisgICAgU0VUKCBHTlVUTFNfVkVSU0lPTl9URVNUX0ZPUiAke0dOVVRMU19MSUJSQVJZfSBDQUNIRSBJTlRFUk5BTCAiVmVyc2lvbiB0aGUgdGVzdCB3YXMgbWFkZSBhZ2FpbnN0IiApCisgIEVORElGIChOT1QoICIke0dOVVRMU19WRVJTSU9OX1RFU1RfRk9SfSIgU1RSRVFVQUwgIiR7R05VVExTX0xJQlJBUll9IiApKQorRU5ESUYoR05VVExTX0ZPVU5EKQpkaWZmIC0tZ2l0IGEvY21ha2UvTW9kdWxlcy9GaW5kSUROQS5jbWFrZSBiL2NtYWtlL01vZHVsZXMvRmluZElETkEuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU0NjNiNAotLS0gL2Rldi9udWxsCisrKyBiL2NtYWtlL01vZHVsZXMvRmluZElETkEuY21ha2UKQEAgLTAsMCArMSw0MCBAQAorIyAtIFRyeSB0byBmaW5kIEdOVSBJRE4gbGlicmFyeSBhbmQgaGVhZGVycworIyBPbmNlIGRvbmUsIHRoaXMgd2lsbCBkZWZpbmUKKyMKKyMgIElETkFfRk9VTkQgLSBzeXN0ZW0gaGFzIElETkEKKyMgIElETkFfSU5DTFVERV9ESVIgLSB0aGUgSUROQSBpbmNsdWRlIGRpcmVjdG9yaWVzICg8aWRuYS5oPikKKyMgIElETkFfTElCUkFSSUVTIC0gbGluayB0aGVzZSB0byB1c2UgSUROQSAoaWRuYV90b19hc2NpaV84eikKKworaWYgKElETkFfSU5DTFVERV9ESVIgQU5EIElETkFfTElCUkFSSUVTKQorICBzZXQoSUROQV9GSU5EX1FVSUVUTFkgVFJVRSkKK2VuZGlmIChJRE5BX0lOQ0xVREVfRElSIEFORCBJRE5BX0xJQlJBUklFUykKKworIyBJbmNsdWRlIGRpcgorZmluZF9wYXRoKElETkFfSU5DTFVERV9ESVIKKyAgTkFNRVMgaWRuYS5oCispCisKKyMgTGlicmFyeQorZmluZF9saWJyYXJ5KElETkFfTElCUkFSWQorICBOQU1FUyBpZG4KKykKKworCisjIGhhbmRsZSB0aGUgUVVJRVRMWSBhbmQgUkVRVUlSRUQgYXJndW1lbnRzIGFuZCBzZXQgSUROQV9GT1VORCB0byBUUlVFIGlmCisjIGFsbCBsaXN0ZWQgdmFyaWFibGVzIGFyZSBUUlVFCitJTkNMVURFKEZpbmRQYWNrYWdlSGFuZGxlU3RhbmRhcmRBcmdzKQorRklORF9QQUNLQUdFX0hBTkRMRV9TVEFOREFSRF9BUkdTKElETkEgREVGQVVMVF9NU0cgSUROQV9MSUJSQVJZIElETkFfSU5DTFVERV9ESVIpCisKKyMgSWYgd2Ugc3VjY2Vzc2Z1bGx5IGZvdW5kIHRoZSBpZG4gbGlicmFyeSB0aGVuIGFkZCB0aGUgbGlicmFyeSB0byB0aGUKKyMgSUROQV9MSUJSQVJJRVMgY21ha2UgdmFyaWFibGUgb3RoZXJ3aXNlIHNldCBJRE5BX0xJQlJBUklFUyB0byBub3RoaW5nLgorSUYoSUROQV9GT1VORCkKKyAgIFNFVCggSUROQV9MSUJSQVJJRVMgJHtJRE5BX0xJQlJBUll9ICkKK0VMU0UoSUROQV9GT1VORCkKKyAgIFNFVCggSUROQV9MSUJSQVJJRVMgKQorRU5ESUYoSUROQV9GT1VORCkKKworCisjIExhc3RseSBtYWtlIGl0IHNvIHRoYXQgdGhlIElETkFfTElCUkFSWSBhbmQgSUROQV9JTkNMVURFX0RJUiB2YXJpYWJsZXMKKyMgb25seSBzaG93IHVwIHVuZGVyIHRoZSBhZHZhbmNlZCBvcHRpb25zIGluIHRoZSBndWkgY21ha2UgYXBwbGljYXRpb25zLgorTUFSS19BU19BRFZBTkNFRCggSUROQV9MSUJSQVJZIElETkFfSU5DTFVERV9ESVIgKQorCmRpZmYgLS1naXQgYS9jbWFrZS9Nb2R1bGVzL0ZpbmRMaWJYbWwyLmNtYWtlIGIvY21ha2UvTW9kdWxlcy9GaW5kTGliWG1sMi5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMThkYzJlCi0tLSAvZGV2L251bGwKKysrIGIvY21ha2UvTW9kdWxlcy9GaW5kTGliWG1sMi5jbWFrZQpAQCAtMCwwICsxLDUzIEBACisjIC0gVHJ5IHRvIGZpbmQgdGhlIExpYlhtbDIgeG1sIHByb2Nlc3NpbmcgbGlicmFyeQorIyBPbmNlIGRvbmUgdGhpcyB3aWxsIGRlZmluZQorIworIyAgTElCWE1MMl9GT1VORCAtIFN5c3RlbSBoYXMgTGliWG1sMgorIyAgTElCWE1MMl9JTkNMVURFX0RJUiAtIFRoZSBMaWJYbWwyIGluY2x1ZGUgZGlyZWN0b3J5CisjICBMSUJYTUwyX0xJQlJBUklFUyAtIFRoZSBsaWJyYXJpZXMgbmVlZGVkIHRvIHVzZSBMaWJYbWwyCisjICBMSUJYTUwyX0RFRklOSVRJT05TIC0gQ29tcGlsZXIgc3dpdGNoZXMgcmVxdWlyZWQgZm9yIHVzaW5nIExpYlhtbDIKKyMgIExJQlhNTDJfWE1MTElOVF9FWEVDVVRBQkxFIC0gVGhlIFhNTCBjaGVja2luZyB0b29sIHhtbGxpbnQgY29taW5nIHdpdGggTGliWG1sMgorCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgQ29weXJpZ2h0IDIwMDYtMjAwOSBLaXR3YXJlLCBJbmMuCisjIENvcHlyaWdodCAyMDA2IEFsZXhhbmRlciBOZXVuZG9yZiA8bmV1bmRvcmZAa2RlLm9yZz4KKyMKKyMgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIE9TSS1hcHByb3ZlZCBCU0QgTGljZW5zZSAodGhlICJMaWNlbnNlIik7CisjIHNlZSBhY2NvbXBhbnlpbmcgZmlsZSBDb3B5cmlnaHQudHh0IGZvciBkZXRhaWxzLgorIworIyBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlCisjIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgKFRvIGRpc3RyaWJ1dGVkIHRoaXMgZmlsZSBvdXRzaWRlIG9mIENNYWtlLCBzdWJzdGl0dXRlIHRoZSBmdWxsCisjICBMaWNlbnNlIHRleHQgZm9yIHRoZSBhYm92ZSByZWZlcmVuY2UuKQorCisjIHVzZSBwa2ctY29uZmlnIHRvIGdldCB0aGUgZGlyZWN0b3JpZXMgYW5kIHRoZW4gdXNlIHRoZXNlIHZhbHVlcworIyBpbiB0aGUgRklORF9QQVRIKCkgYW5kIEZJTkRfTElCUkFSWSgpIGNhbGxzCitGSU5EX1BBQ0tBR0UoUGtnQ29uZmlnKQorUEtHX0NIRUNLX01PRFVMRVMoUENfTElCWE1MIGxpYnhtbC0yLjApCitTRVQoTElCWE1MMl9ERUZJTklUSU9OUyAke1BDX0xJQlhNTF9DRkxBR1NfT1RIRVJ9KQorCitGSU5EX1BBVEgoTElCWE1MMl9JTkNMVURFX0RJUiBOQU1FUyBsaWJ4bWwveHBhdGguaAorICAgSElOVFMKKyAgICR7UENfTElCWE1MX0lOQ0xVREVESVJ9CisgICAke1BDX0xJQlhNTF9JTkNMVURFX0RJUlN9CisgICBQQVRIX1NVRkZJWEVTIGxpYnhtbDIKKyAgICkKKworRklORF9MSUJSQVJZKExJQlhNTDJfTElCUkFSSUVTIE5BTUVTIHhtbDIgbGlieG1sMgorICAgSElOVFMKKyAgICR7UENfTElCWE1MX0xJQkRJUn0KKyAgICR7UENfTElCWE1MX0xJQlJBUllfRElSU30KKyAgICkKKworRklORF9QUk9HUkFNKExJQlhNTDJfWE1MTElOVF9FWEVDVVRBQkxFIHhtbGxpbnQpCisjIGZvciBiYWNrd2FyZHMgY29tcGF0LiB3aXRoIEtERSA0LjAueDoKK1NFVChYTUxMSU5UX0VYRUNVVEFCTEUgIiR7TElCWE1MMl9YTUxMSU5UX0VYRUNVVEFCTEV9IikKKworIyBoYW5kbGUgdGhlIFFVSUVUTFkgYW5kIFJFUVVJUkVEIGFyZ3VtZW50cyBhbmQgc2V0IExJQlhNTDJfRk9VTkQgdG8gVFJVRSBpZiAKKyMgYWxsIGxpc3RlZCB2YXJpYWJsZXMgYXJlIFRSVUUKK0lOQ0xVREUoRmluZFBhY2thZ2VIYW5kbGVTdGFuZGFyZEFyZ3MpCitGSU5EX1BBQ0tBR0VfSEFORExFX1NUQU5EQVJEX0FSR1MoTGliWG1sMiBERUZBVUxUX01TRyBMSUJYTUwyX0xJQlJBUklFUyBMSUJYTUwyX0lOQ0xVREVfRElSKQorCitNQVJLX0FTX0FEVkFOQ0VEKExJQlhNTDJfSU5DTFVERV9ESVIgTElCWE1MMl9MSUJSQVJJRVMgTElCWE1MMl9YTUxMSU5UX0VYRUNVVEFCTEUpCisKZGlmZiAtLWdpdCBhL2NtYWtlL01vZHVsZXMvRmluZE15U1FMLmNtYWtlIGIvY21ha2UvTW9kdWxlcy9GaW5kTXlTUUwuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI3MjIyYgotLS0gL2Rldi9udWxsCisrKyBiL2NtYWtlL01vZHVsZXMvRmluZE15U1FMLmNtYWtlCkBAIC0wLDAgKzEsNTYgQEAKKyMgLSBGaW5kIG15c3FsY2xpZW50CisjCisjIC0qLSBjbWFrZSAtKi0KKyMKKyMgRmluZCB0aGUgbmF0aXZlIE15U1FMIGluY2x1ZGVzIGFuZCBsaWJyYXJ5CisjCisjICBNeVNRTF9JTkNMVURFX0RJUiAtIHdoZXJlIHRvIGZpbmQgbXlzcWwuaCwgZXRjLgorIyAgTXlTUUxfTElCUkFSSUVTICAgLSBMaXN0IG9mIGxpYnJhcmllcyB3aGVuIHVzaW5nIE15U1FMLgorIyAgTXlTUUxfRk9VTkQgICAgICAgLSBUcnVlIGlmIE15U1FMIGZvdW5kLgorCitJRiAoTXlTUUxfSU5DTFVERV9ESVIgQU5EIE15U1FMX0xJQlJBUlkpCisgICMgQWxyZWFkeSBpbiBjYWNoZSwgYmUgc2lsZW50CisgIFNFVChNeVNRTF9GSU5EX1FVSUVUTFkgVFJVRSkKK0VORElGIChNeVNRTF9JTkNMVURFX0RJUiBBTkQgTXlTUUxfTElCUkFSWSkKKworIyBJbmNsdWRlIGRpcgorRklORF9QQVRIKE15U1FMX0lOQ0xVREVfRElSIAorICBOQU1FUyBteXNxbC5oCisgIFBBVEhfU1VGRklYRVMgbXlzcWwKKykKKworIyBMaWJyYXJ5CisjU0VUKE15U1FMX05BTUVTIG15c3FsY2xpZW50IG15c3FsY2xpZW50X3IpCisjU0VUKE15U1FMX05BTUVTIG15c3FsY2xpZW50X3IpCitTRVQoTXlTUUxfTkFNRVMgbXlzcWxjbGllbnRfciBteXNxbGNsaWVudCkKK0ZJTkRfTElCUkFSWShNeVNRTF9MSUJSQVJZCisgIE5BTUVTICR7TXlTUUxfTkFNRVN9CisgIFBBVEhTIC91c3IvbGliIC91c3IvbG9jYWwvbGliCisgIFBBVEhfU1VGRklYRVMgbXlzcWwKKykKKworSUYgKE15U1FMX0lOQ0xVREVfRElSIEFORCBNeVNRTF9MSUJSQVJZKQorICBTRVQoTXlTUUxfRk9VTkQgVFJVRSkKKyAgU0VUKCBNeVNRTF9MSUJSQVJJRVMgJHtNeVNRTF9MSUJSQVJZfSApCitFTFNFIChNeVNRTF9JTkNMVURFX0RJUiBBTkQgTXlTUUxfTElCUkFSWSkKKyAgU0VUKE15U1FMX0ZPVU5EIEZBTFNFKQorICBTRVQoIE15U1FMX0xJQlJBUklFUyApCitFTkRJRiAoTXlTUUxfSU5DTFVERV9ESVIgQU5EIE15U1FMX0xJQlJBUlkpCisKKworSUYgKE15U1FMX0ZPVU5EKQorICBJRiAoTk9UIE15U1FMX0ZJTkRfUVVJRVRMWSkKKyAgICBNRVNTQUdFKFNUQVRVUyAiRm91bmQgTXlTUUw6ICR7TXlTUUxfTElCUkFSWX0iKQorICBFTkRJRiAoTk9UIE15U1FMX0ZJTkRfUVVJRVRMWSkKK0VMU0UgKE15U1FMX0ZPVU5EKQorICBJRiAoTXlTUUxfRklORF9SRVFVSVJFRCkKKyAgICBNRVNTQUdFKFNUQVRVUyAiTG9va2VkIGZvciBNeVNRTCBsaWJyYXJpZXMgbmFtZWQgJHtNeVNRTF9OQU1FU30uIikKKyAgICBNRVNTQUdFKEZBVEFMX0VSUk9SICJDb3VsZCBOT1QgZmluZCBNeVNRTCBsaWJyYXJ5IikKKyAgRU5ESUYgKE15U1FMX0ZJTkRfUkVRVUlSRUQpCitFTkRJRiAoTXlTUUxfRk9VTkQpCisKK01BUktfQVNfQURWQU5DRUQoCisgIE15U1FMX0xJQlJBUlkKKyAgTXlTUUxfSU5DTFVERV9ESVIKKyAgKQorCmRpZmYgLS1naXQgYS9jbWFrZS9Nb2R1bGVzL0ZpbmRQb3N0Z3JlU1FMLmNtYWtlIGIvY21ha2UvTW9kdWxlcy9GaW5kUG9zdGdyZVNRTC5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjM5YTI2Ci0tLSAvZGV2L251bGwKKysrIGIvY21ha2UvTW9kdWxlcy9GaW5kUG9zdGdyZVNRTC5jbWFrZQpAQCAtMCwwICsxLDM2IEBACisjIC0gRmluZCBQb3N0Z3JlU1FMIGxpYnJhcnkKKyMKKyMgVGhpcyBtb2R1bGUgZGVmaW5lczoKKyMgIFBPU1RHUkVTUUxfRk9VTkQgLSBUcnVlIGlmIHRoZSBwYWNrYWdlIGlzIGZvdW5kCisjICBQT1NUR1JFU1FMX0lOQ0xVREVfRElSIC0gY29udGFpbmluZyBsaWJwcS1mZS5oCisjICBQT1NUR1JFU1FMX0xJQlJBUklFUyAtIExpYnJhcmllcyB0byBsaW5rIHRvIHVzZSBQUSBmdW5jdGlvbnMuCisKK2lmIChQT1NUR1JFU1FMX0lOQ0xVREVfRElSIEFORCBQT1NUR1JFU1FMX0xJQlJBUklFUykKKyAgc2V0KFBPU1RHUkVTUUxfRklORF9RVUlFVExZIFRSVUUpCitlbmRpZiAoUE9TVEdSRVNRTF9JTkNMVURFX0RJUiBBTkQgUE9TVEdSRVNRTF9MSUJSQVJJRVMpCisKKyMgSW5jbHVkZSBkaXIKK2ZpbmRfcGF0aChQT1NUR1JFU1FMX0lOQ0xVREVfRElSIAorCU5BTUVTIGxpYnBxLWZlLmgKKwlQQVRIX1NVRkZJWEVTIHBnc3FsIHBvc3RncmVzcWwKKykKKworIyBMaWJyYXJ5CitmaW5kX2xpYnJhcnkoUE9TVEdSRVNRTF9MSUJSQVJZIAorICBOQU1FUyBwcQorKQorCisjIGhhbmRsZSB0aGUgUVVJRVRMWSBhbmQgUkVRVUlSRUQgYXJndW1lbnRzIGFuZCBzZXQgUE9TVEdSRVNRTF9GT1VORCB0byBUUlVFIGlmIAorIyBhbGwgbGlzdGVkIHZhcmlhYmxlcyBhcmUgVFJVRQorSU5DTFVERShGaW5kUGFja2FnZUhhbmRsZVN0YW5kYXJkQXJncykKK0ZJTkRfUEFDS0FHRV9IQU5ETEVfU1RBTkRBUkRfQVJHUyhQT1NUR1JFU1FMIERFRkFVTFRfTVNHIFBPU1RHUkVTUUxfTElCUkFSWSBQT1NUR1JFU1FMX0lOQ0xVREVfRElSKQorCitJRihQT1NUR1JFU1FMX0ZPVU5EKQorICBTRVQoIFBPU1RHUkVTUUxfTElCUkFSSUVTICR7UE9TVEdSRVNRTF9MSUJSQVJZfSApCitFTFNFKFBPU1RHUkVTUUxfRk9VTkQpCisgIFNFVCggUE9TVEdSRVNRTF9MSUJSQVJJRVMgKQorRU5ESUYoUE9TVEdSRVNRTF9GT1VORCkKKworIyBMYXN0bHkgbWFrZSBpdCBzbyB0aGF0IHRoZSBQT1NUR1JFU1FMX0xJQlJBUlkgYW5kIFBPU1RHUkVTUUxfSU5DTFVERV9ESVIgdmFyaWFibGVzCisjIG9ubHkgc2hvdyB1cCB1bmRlciB0aGUgYWR2YW5jZWQgb3B0aW9ucyBpbiB0aGUgZ3VpIGNtYWtlIGFwcGxpY2F0aW9ucy4KK01BUktfQVNfQURWQU5DRUQoIFBPU1RHUkVTUUxfTElCUkFSWSBQT1NUR1JFU1FMX0lOQ0xVREVfRElSICkKZGlmZiAtLWdpdCBhL2NtYWtlL01vZHVsZXMvRmluZFNDVFAuY21ha2UgYi9jbWFrZS9Nb2R1bGVzL0ZpbmRTQ1RQLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlOGU4NzgKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFrZS9Nb2R1bGVzL0ZpbmRTQ1RQLmNtYWtlCkBAIC0wLDAgKzEsNDYgQEAKKyMgLSBUcnkgdG8gZmluZCBTQ1RQIGxpYnJhcnkgYW5kIGhlYWRlcnMKKyMgT25jZSBkb25lLCB0aGlzIHdpbGwgZGVmaW5lCisjCisjICBTQ1RQX0ZPVU5EIC0gc3lzdGVtIGhhcyBTQ1RQCisjICBTQ1RQX0lOQ0xVREVfRElSIC0gdGhlIFNDVFAgaW5jbHVkZSBkaXJlY3RvcmllcworIyAgU0NUUF9MSUJSQVJJRVMgLSBsaW5rIHRoZXNlIHRvIHVzZSBTQ1RQCisKK2lmIChTQ1RQX0lOQ0xVREVfRElSIEFORCBTQ1RQX0xJQlJBUklFUykKKyAgc2V0KFNDVFBfRklORF9RVUlFVExZIFRSVUUpCitlbmRpZiAoU0NUUF9JTkNMVURFX0RJUiBBTkQgU0NUUF9MSUJSQVJJRVMpCisKKyMgSW5jbHVkZSBkaXIKK2ZpbmRfcGF0aChTQ1RQX0lOQ0xVREVfRElSCisgIE5BTUVTIG5ldGluZXQvc2N0cC5oCispCisKKyMgTGlicmFyeQorZmluZF9saWJyYXJ5KFNDVFBfTElCUkFSWQorICBOQU1FUyBzY3RwCispCisKKyMgU2V0IHRoZSBpbmNsdWRlIGRpciB2YXJpYWJsZXMgYW5kIHRoZSBsaWJyYXJpZXMgYW5kIGxldCBsaWJmaW5kX3Byb2Nlc3MgZG8gdGhlIHJlc3QuCisjIE5PVEU6IFNpbmd1bGFyIHZhcmlhYmxlcyBmb3IgdGhpcyBsaWJyYXJ5LCBwbHVyYWwgZm9yIGxpYnJhcmllcyB0aGlzIHRoaXMgbGliIGRlcGVuZHMgb24uCisjc2V0KFNDVFBfUFJPQ0VTU19JTkNMVURFUyBTQ1RQX0lOQ0xVREVfRElSKQorI3NldChTQ1RQX1BST0NFU1NfTElCUyBTQ1RQX0xJQlJBUlkpCisjbGliZmluZF9wcm9jZXNzKFNDVFApCisKKworIyBoYW5kbGUgdGhlIFFVSUVUTFkgYW5kIFJFUVVJUkVEIGFyZ3VtZW50cyBhbmQgc2V0IFNDVFBfRk9VTkQgdG8gVFJVRSBpZgorIyBhbGwgbGlzdGVkIHZhcmlhYmxlcyBhcmUgVFJVRQorSU5DTFVERShGaW5kUGFja2FnZUhhbmRsZVN0YW5kYXJkQXJncykKK0ZJTkRfUEFDS0FHRV9IQU5ETEVfU1RBTkRBUkRfQVJHUyhTQ1RQIERFRkFVTFRfTVNHIFNDVFBfTElCUkFSWSBTQ1RQX0lOQ0xVREVfRElSKQorCisjIElmIHdlIHN1Y2Nlc3NmdWxseSBmb3VuZCB0aGUgc2N0cCBsaWJyYXJ5IHRoZW4gYWRkIHRoZSBsaWJyYXJ5IHRvIHRoZQorIyBTQ1RQX0xJQlJBUklFUyBjbWFrZSB2YXJpYWJsZSBvdGhlcndpc2Ugc2V0IFNDVFBfTElCUkFSSUVTIHRvIG5vdGhpbmcuCitJRihTQ1RQX0ZPVU5EKQorICAgU0VUKCBTQ1RQX0xJQlJBUklFUyAke1NDVFBfTElCUkFSWX0gKQorRUxTRShTQ1RQX0ZPVU5EKQorICAgU0VUKCBTQ1RQX0xJQlJBUklFUyApCitFTkRJRihTQ1RQX0ZPVU5EKQorCisKKyMgTGFzdGx5IG1ha2UgaXQgc28gdGhhdCB0aGUgU0NUUF9MSUJSQVJZIGFuZCBTQ1RQX0lOQ0xVREVfRElSIHZhcmlhYmxlcworIyBvbmx5IHNob3cgdXAgdW5kZXIgdGhlIGFkdmFuY2VkIG9wdGlvbnMgaW4gdGhlIGd1aSBjbWFrZSBhcHBsaWNhdGlvbnMuCitNQVJLX0FTX0FEVkFOQ0VEKCBTQ1RQX0xJQlJBUlkgU0NUUF9JTkNMVURFX0RJUiApCisKZGlmZiAtLWdpdCBhL2NtYWtlL01vZHVsZXMvR2V0VmVyc2lvbldpdGhIZy5jbWFrZSBiL2NtYWtlL01vZHVsZXMvR2V0VmVyc2lvbldpdGhIZy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmNmMzkyCi0tLSAvZGV2L251bGwKKysrIGIvY21ha2UvTW9kdWxlcy9HZXRWZXJzaW9uV2l0aEhnLmNtYWtlCkBAIC0wLDAgKzEsMjMgQEAKKyMgVGhpcyBmaWxlIGlzIGNhbGxlZCBhdCBidWlsZCB0aW1lLiBJdCByZWdlbmVyYXRlcyB0aGUgdmVyc2lvbi5oIGZpbGUgYmFzZWQgb24gdGhlIGhnIHZlcnNpb24uCisKK0VYRUNVVEVfUFJPQ0VTUygKKwlDT01NQU5EICR7SEdDT01NQU5EfSBpZCAtaQorCVdPUktJTkdfRElSRUNUT1JZICR7Q01BS0VfU09VUkNFX0RJUn0KKwlSRVNVTFRfVkFSSUFCTEUgcmVzaGFzaAorCU9VVFBVVF9WQVJJQUJMRSB2ZXJoYXNoCisJRVJST1JfUVVJRVQKKwlPVVRQVVRfU1RSSVBfVFJBSUxJTkdfV0hJVEVTUEFDRSkKK0VYRUNVVEVfUFJPQ0VTUygKKwlDT01NQU5EICR7SEdDT01NQU5EfSBpZCAtbgorCVdPUktJTkdfRElSRUNUT1JZICR7Q01BS0VfU09VUkNFX0RJUn0KKwlSRVNVTFRfVkFSSUFCTEUgcmVzdmFsCisJT1VUUFVUX1ZBUklBQkxFIHZlcnZhbAorCUVSUk9SX1FVSUVUCisJT1VUUFVUX1NUUklQX1RSQUlMSU5HX1dISVRFU1BBQ0UpCisJCitpZiAocmVzaGFzaCBFUVVBTCAwKSAKKwlTRVQoRkRfUFJPSkVDVF9WRVJTSU9OX0hHICIke3ZlcnZhbH0oJHt2ZXJoYXNofSkiKQorIAltZXNzYWdlKFNUQVRVUyAiU291cmNlIHZlcnNpb246ICR7RkRfUFJPSkVDVF9WRVJTSU9OX0hHfSIpCitlbmRpZiAocmVzaGFzaCBFUVVBTCAwKQorCitDT05GSUdVUkVfRklMRSgke1NSQ30gJHtEU1R9KQpkaWZmIC0tZ2l0IGEvY29udHJpYi9DeER4L1JFQURNRSBiL2NvbnRyaWIvQ3hEeC9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU1NGU0NAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvQ3hEeC9SRUFETUUKQEAgLTAsMCArMSwxNyBAQAorRGF0ZTogVGh1LCAxMyBPY3QgMjAxMSAxNDowMTo0MCAtMDMwMAorRnJvbTogIk5vcmJlcnRvIFIuIGRlIEdvZXMgSnIuIiA8bm9yYmVydG9AY3BxZC5jb20uYnI+CitUbzogaGVscEBmcmVlZGlhbWV0ZXIubmV0CitTdWJqZWN0OiBbSGVscF0gQ3ggZGljdGlvbmFyeSAoc2FtcGxlcyAiYyIgYW5kICJ4bWwiKQorCitIaS4KKworSnVzdCBhIGNvbnRyaWJ1dGlvbiwgdGhleSB3ZXJlIG5vdCB0ZXN0ZWQuCitCZXN0IHJlZ2FyZHMsCisKKy0tCitOb3JiZXJ0byBSLiBkZSBHb2VzIEpyLgorQ1BxRCAtIERSQworVGVsLjogKzU1IDE5IDM3MDUtNDI0MSAvIEZheDogKzU1IDE5IDM3MDUtNjEyNQorbm9yYmVydG9AY3BxZC5jb20uYnIKK3d3dy5jcHFkLmNvbS5icgorCmRpZmYgLS1naXQgYS9jb250cmliL0N4RHgvZGljdF9jeGR4LmMgYi9jb250cmliL0N4RHgvZGljdF9jeGR4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ1OGM4ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvQ3hEeC9kaWN0X2N4ZHguYwpAQCAtMCwwICsxLDE3MjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBBdXRob3I6IE5vcmJlcnRvIFIuIGRlIEdvZXMgSnIuIAkJCQkJCSAqCisgKgkJCQkJCQkJCQkJCQkgKgorICogQ29weXJpZ2h0IChjKSAyMDExLCBOb3JiZXJ0byBSLiBkZSBHb2VzIEpyLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICoKKyAqCQkJCQkJCQkJCSAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyAqIAkJCQkJCQkJCQkJCQkgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyAqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisgKiAJCQkJCQkJCQkJCQkJICoKKyAqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorICogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorICogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyAqICAgIAkJCQkJCQkJCQkJCQkgKgorICogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisgKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisgKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisgKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorICogCQkJCQkJCQkJCQkJCSAqCisgKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFRlcmFva2EgTGFib3JhdG9yeSBub3IgdGhlIAkJCQkJCQkgKgorICogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyAqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisgKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBUZXJhb2thIExhYm9yYXRvcnkgCQkJCQkJICoKKyAqICAgCQkJCQkJCQkJCQkJCSAqCisgKiAJCQkJCQkJCQkJCQkJICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorICogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyAqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyAqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisgKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworID09PSBDcHFEL0RSQyAgLSAgUHJvamV0byBBRFJJTVMgIC0gIE1hci8yMDExID09PQorID09PSBEaWNpb25hcmlvIER4L0N4ID09PQorIEJhc2VhZG8gbm8gImRpY3Rfc2lwIiBkbyBGcmVlRGlhbWV0ZXIgKHd3dy5mcmVlZGlhbWV0ZXIubmV0KSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vcmJlcnRvIFIgR29lcyBKcgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpbmNsdWRlIDxmcmVlRGlhbWV0ZXIvZXh0ZW5zaW9uLmg+CisKKworCisvKiBUaGUgY29udGVudCBvZiB0aGlzIGZpbGUgZm9sbG93cyB0aGUgc2FtZSBzdHJ1Y3R1cmUgYXMgZGljdF9iYXNlX3Byb3RvLmMgKi8KKworI2RlZmluZSBDSEVDS19kaWN0X25ldyggX3R5cGUsIF9kYXRhLCBfcGFyZW50LCBfcmVmICkJCQlcCisgIENIRUNLX0ZDVCggIGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIChfdHlwZSksIChfZGF0YSksIChfcGFyZW50KSwgKF9yZWYpKSAgKTsKKworI2RlZmluZSBDSEVDS19kaWN0X3NlYXJjaCggX3R5cGUsIF9jcml0ZXJpYSwgX3doYXQsIF9yZXN1bHQgKQkJXAorICBDSEVDS19GQ1QoICBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCAoX3R5cGUpLCAoX2NyaXRlcmlhKSwgKF93aGF0KSwgKF9yZXN1bHQpLCBFTk9FTlQpICk7CisKKworc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gCit7CisgIGNoYXIgCQkJKmF2cF9uYW1lOworICBlbnVtIHJ1bGVfcG9zaXRpb24JIHBvc2l0aW9uOworICBpbnQgCQkJIG1pbjsKKyAgaW50CQkJIG1heDsKK307CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBSVUxFX09SREVSKCBfcG9zaXRpb24gKSAoKCgoX3Bvc2l0aW9uKSA9PSBSVUxFX0ZJWEVEX0hFQUQpIHx8ICgoX3Bvc2l0aW9uKSA9PSBSVUxFX0ZJWEVEX1RBSUwpKSA/IDEgOiAwICkKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIFBBUlNFX2xvY19ydWxlcyggX3J1bGVhcnJheSwgX3BhcmVudCwgX2F2cF9zZWFyY2hfZmxhZykgewlcCisgICAgaW50IF9fYXI7CQkJCQkJCQlcCisgICAgZm9yIChfX2FyPTA7IF9fYXIgPCBzaXplb2YoX3J1bGVhcnJheSkgLyBzaXplb2YoKF9ydWxlYXJyYXkpWzBdKTsgX19hcisrKSB7CVwKKyAgICAgIHN0cnVjdCBkaWN0X3J1bGVfZGF0YSBfX2RhdGEgPSB7IE5VTEwsCQkJCVwKKwkJCQkgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLnBvc2l0aW9uLAlcCisJCQkJICAgICAgIDAsCQkJCVwKKwkJCQkgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLm1pbiwJCVwKKwkJCQkgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLm1heH07CQlcCisgICAgICBfX2RhdGEucnVsZV9vcmRlciA9IFJVTEVfT1JERVIoX19kYXRhLnJ1bGVfcG9zaXRpb24pOwkJXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0hFQ0tfRkNUKCAgZmRfZGljdF9zZWFyY2goCQkJCQlcCisJCQkJIGZkX2dfY29uZmlnLT5jbmZfZGljdCwJCQlcCisJCQkJIERJQ1RfQVZQLAkJCQlcCisJCQkJIF9hdnBfc2VhcmNoX2ZsYWcsCQkJXAorCQkJCSAoX3J1bGVhcnJheSlbX19hcl0uYXZwX25hbWUsCQlcCisJCQkJICZfX2RhdGEucnVsZV9hdnAsIDAgKSApOwkJXAorICAgICAgaWYgKCAhX19kYXRhLnJ1bGVfYXZwICkgewkJCQkJCVwKKwlUUkFDRV9ERUJVRyhJTkZPLCAiQVZQIE5vdCBmb3VuZDogJyVzJyIsIChfcnVsZWFycmF5KVtfX2FyXS5hdnBfbmFtZSApOwlcCisJcmV0dXJuIEVOT0VOVDsJCQkJCQkJXAorICAgICAgfQkJCQkJCQkJCVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIENIRUNLX0ZDVF9ETyggZmRfZGljdF9uZXcoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9SVUxFLCAmX19kYXRhLCBfcGFyZW50LCBOVUxMKSwgXAorCQkgICAgewkJCQkJCQlcCisJCSAgICAgIFRSQUNFX0RFQlVHKElORk8sICJFcnJvciBvbiBydWxlIHdpdGggQVZQICclcyciLAlcCisJCQkJICAoX3J1bGVhcnJheSlbX19hcl0uYXZwX25hbWUgKTsJXAorCQkgICAgICByZXR1cm4gRUlOVkFMOwkJCQkJXAorCQkgICAgfSApOwkJCQkJCVwKKyAgICB9CQkJCQkJCQkJXAorICB9CisKKyNkZWZpbmUgZW51bXZhbF9kZWZfdTMyKCBfdmFsXywgX3N0cl8gKQkJXAorICB7IF9zdHJfLCAJCXsgLnUzMiA9IF92YWxfIH19CisKKyNkZWZpbmUgZW51bXZhbF9kZWZfb3MoIF9sZW5fLCBfdmFsXywgX3N0cl8gKQkJCQlcCisgIHsgX3N0cl8sIAkJeyAub3MgPSB7IC5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilfdmFsXywgLmxlbiA9IF9sZW5fIH19fQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworaW50IGN4ZHhfZGljdF9pbml0KGNoYXIgKiBjb25mZmlsZSkKK3sKKworI2RlZmluZSBWRU5ET1JfM0dQUF9JZCAgMTA0MTUKKworCisgIHN0cnVjdCBkaWN0X29iamVjdCAqIHZlbmRvcl9kaWN0OworICB7CisgICAgc3RydWN0IGRpY3RfdmVuZG9yX2RhdGEgdmVuZG9yX2RhdGEgPSB7IFZFTkRPUl8zR1BQX0lkLCAiM0dQUCIgfTsKKyAgICBDSEVDS19kaWN0X25ldyAoRElDVF9WRU5ET1IsICZ2ZW5kb3JfZGF0YSwgTlVMTCwgJnZlbmRvcl9kaWN0KTsKKyAgfQorCisKKyAgc3RydWN0IGRpY3Rfb2JqZWN0ICogY3hkeF9kaWN0OworICB7CisgICAgc3RydWN0IGRpY3RfYXBwbGljYXRpb25fZGF0YSBkYXRhICA9IHsgMTY3NzcyMTYgLyogTlJHSiAqLywgIkRpYW1ldGVyIEN4RHggQXBwbGljYXRpb24iCX07CisgICAgQ0hFQ0tfZGljdF9uZXcgKERJQ1RfQVBQTElDQVRJT04sICZkYXRhLCB2ZW5kb3JfZGljdCwgJmN4ZHhfZGljdCk7CisgIH0KKworCisgIC8qICMjIyMjIEFWUCBzZWN0aW9uICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAqLworICB7CisgICAgc3RydWN0IGRpY3Rfb2JqZWN0ICogVVRGOFN0cmluZ190eXBlOworICAgIHN0cnVjdCBkaWN0X29iamVjdCAqIERpYW1ldGVyVVJJX3R5cGU7CisKKyAgICBDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJVVEY4U3RyaW5nIiwgICZVVEY4U3RyaW5nX3R5cGUpOworICAgIENIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkRpYW1ldGVyVVJJIiwgJkRpYW1ldGVyVVJJX3R5cGUpOworCisgICAgLyogRGlnZXN0IEFWUHM6ICAqLworCisgICAgLyogVmlzaXRlZC1OZXR3b3JrLUlkZW50aWZpZXIgKi8KKyAgICB7CisgICAgICBzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0gCisJeyAKKwkgIDYwMCwgCQkJCQkvKiBDb2RlICovCisJICBWRU5ET1JfM0dQUF9JZCwgIAkJCS8qIFZlbmRvciAqLworCSAgIlZpc2l0ZWQtTmV0d29yay1JZGVudGlmaWVyIiwgICAgICAgICAvKiBOYW1lICovCisJICBBVlBfRkxBR19NQU5EQVRPUlkgfCBBVlBfRkxBR19WRU5ET1IsIC8qIEZpeGVkIGZsYWdzICovCisJICBBVlBfRkxBR19NQU5EQVRPUlkgfCBBVlBfRkxBR19WRU5ET1IsIC8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJICBBVlBfVFlQRV9PQ1RFVFNUUklORyAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCX07CisgICAgICBDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKyAgICB9CisKKyAgICAvKiBQdWJsaWMtSWRlbnRpdHkgKi8KKyAgICB7CisgICAgICBzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0gCisJeyAKKwkgIDYwMSwgCQkJCQkvKiBDb2RlICovCisJICBWRU5ET1JfM0dQUF9JZCwJCQkvKiBWZW5kb3IgKi8KKwkgICJQdWJsaWMtSWRlbnRpdHkiLCAJCSAgICAgICAgLyogTmFtZSAqLworCSAgQVZQX0ZMQUdfTUFOREFUT1JZIHwgQVZQX0ZMQUdfVkVORE9SLCAvKiBGaXhlZCBmbGFncyAqLworCSAgQVZQX0ZMQUdfTUFOREFUT1JZIHwgQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCSAgQVZQX1RZUEVfT0NURVRTVFJJTkcgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwl9OworICAgICAgQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisgICAgfQorCisKKyAgICAvKiBTZXJ2ZXItTmFtZSAqLworICAgIHsKKyAgICAgIHN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSAKKwl7IAorCSAgNjAyLCAJCQkJCS8qIENvZGUgKi8KKwkgIFZFTkRPUl8zR1BQX0lkLAkJCS8qIFZlbmRvciAqLworCSAgIlNlcnZlci1OYW1lIiwgCQkgICAgICAgIC8qIE5hbWUgKi8KKwkgIEFWUF9GTEFHX01BTkRBVE9SWSB8IEFWUF9GTEFHX1ZFTkRPUiwgLyogRml4ZWQgZmxhZ3MgKi8KKwkgIEFWUF9GTEFHX01BTkRBVE9SWSB8IEFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkgIEFWUF9UWVBFX09DVEVUU1RSSU5HIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJfTsKKyAgICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBEaWFtZXRlclVSSV90eXBlLypVVEY4U3RyaW5nX3R5cGUqLywgTlVMTCk7CisgICAgfQorCisKKyAgICAvKiBPcHRpb25hbC1DYXBhYmlsaXR5ICovCisgICAgeworICAgICAgc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IAorCXsgCisJICA2MDUsIAkJCQkJLyogQ29kZSAqLworCSAgVkVORE9SXzNHUFBfSWQsCQkJLyogVmVuZG9yICovCisJICAiT3B0aW9uYWwtQ2FwYWJpbGl0eSIsCSAgICAgICAgLyogTmFtZSAqLworCSAgQVZQX0ZMQUdfTUFOREFUT1JZIHwgQVZQX0ZMQUdfVkVORE9SLCAvKiBGaXhlZCBmbGFncyAqLworCSAgQVZQX0ZMQUdfTUFOREFUT1JZIHwgQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCSAgQVZQX1RZUEVfVU5TSUdORUQzMiAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCX07CisgICAgICBDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgTlVMTCk7CisgICAgfQorCisKKyAgICAvKiBGZWF0dXJlLUxpc3QtSUQgKi8KKyAgICB7CisgICAgICBzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0gCisJeyAKKwkgIDYyOSwgCQkJCQkvKiBDb2RlICovCisJICBWRU5ET1JfM0dQUF9JZCwJCQkvKiBWZW5kb3IgKi8KKwkgICJGZWF0dXJlLUxpc3QtSUQiLCAJCSAgICAgICAgLyogTmFtZSAqLworCSAgQVZQX0ZMQUdfVkVORE9SLCAgICAgICAgICAgICAgICAgICAgICAvKiBGaXhlZCBmbGFncyAqLworCSAgQVZQX0ZMQUdfVkVORE9SLAkgICAgICAgICAgICAgICAgLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkgIEFWUF9UWVBFX1VOU0lHTkVEMzIgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwl9OworICAgICAgQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsIE5VTEwpOworICAgIH0KKworCisgICAgLyogRmVhdHVyZS1MaXN0ICovCisgICAgeworICAgICAgc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IAorCXsgCisJICA2MzAsIAkJCQkJLyogQ29kZSAqLworCSAgVkVORE9SXzNHUFBfSWQsCQkJLyogVmVuZG9yICovCisJICAiRmVhdHVyZS1MaXN0IiwgCQkgICAgICAgIC8qIE5hbWUgKi8KKwkgIEFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgLyogRml4ZWQgZmxhZ3MgKi8KKwkgIEFWUF9GTEFHX01BTkRBVE9SWSwJCSAJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkgIEFWUF9UWVBFX1VOU0lHTkVEMzIgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwl9OworICAgICAgQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsIE5VTEwpOworICAgIH0KKworICAgIC8qIFNlcnZlci1DYXBhYmlsaXRpZXMgKi8KKyAgICB7CisgICAgICBzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisgICAgICBzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0gCisJeyAKKwkgIDYwMywgCQkJCQkvKiBDb2RlICovCisJICBWRU5ET1JfM0dQUF9JZCwJCQkvKiBWZW5kb3IgKi8KKwkgICJTZXJ2ZXItQ2FwYWJpbGl0aWVzIiwgCQkvKiBOYW1lICovCisJICBBVlBfRkxBR19NQU5EQVRPUlkgfCBBVlBfRkxBR19WRU5ET1IsIC8qIEZpeGVkIGZsYWdzICovCisJICBBVlBfRkxBR19NQU5EQVRPUlkgfCBBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJICBBVlBfVFlQRV9HUk9VUEVEIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJfTsKKworICAgICAgc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9IAorCXsgCisJICB7ICAiVmVuZG9yLUlkIiwgCSBSVUxFX1JFUVVJUkVELCAtMSwgMSB9LAorCSAgeyAgIkZlYXR1cmUtTGlzdC1JRCIsICBSVUxFX1JFUVVJUkVELCAtMSwgMSB9LAorCSAgeyAgIkZlYXR1cmUtTGlzdCIsIAkgUlVMRV9SRVFVSVJFRCwgLTEsIDEgfQorCX07CisKKyAgICAgIENIRUNLX2RpY3RfbmV3IChESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKyAgICAgIFBBUlNFX2xvY19ydWxlcyhydWxlcywgYXZwLCBBVlBfQllfTkFNRV9BTExfVkVORE9SUyApOworICAgIH0KKworCisKKyAgICAvKiBVc2VyLUF1dGhvcml6YXRpb24tVHlwZSAqLworICAgIHsKKyAgICAgIHN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSAKKwl7IAorCSAgNjIzLCAJCQkJCS8qIENvZGUgKi8KKwkgIFZFTkRPUl8zR1BQX0lkLCAJCQkvKiBWZW5kb3IgKi8KKwkgICJVc2VyLUF1dGhvcml6YXRpb24tVHlwZSIsIAkJLyogTmFtZSAqLworCSAgQVZQX0ZMQUdfTUFOREFUT1JZIHwgQVZQX0ZMQUdfVkVORE9SLCAvKiBGaXhlZCBmbGFncyAqLworCSAgQVZQX0ZMQUdfTUFOREFUT1JZIHwgQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCSAgQVZQX1RZUEVfT0NURVRTVFJJTkcgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwl9OworICAgICAgQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisgICAgfQorCisKKyAgICAvKiBTdXBwb3J0ZWQtRmVhdHVyZXMgKi8KKyAgICB7CisgICAgICBzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisgICAgICBzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0gCisJeyAKKwkgIDYyOCwgCQkJCQkvKiBDb2RlICovCisJICBWRU5ET1JfM0dQUF9JZCwJCQkvKiBWZW5kb3IgKi8KKwkgICJTdXBwb3J0ZWQtRmVhdHVyZXMiLCAJCS8qIE5hbWUgKi8KKwkgIEFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgLyogRml4ZWQgZmxhZ3MgKi8KKwkgIEFWUF9GTEFHX01BTkRBVE9SWSwJCSAJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkgIEFWUF9UWVBFX0dST1VQRUQgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwl9OworCisgICAgICBzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0gCisJeyAKKwkgIHsgICJWZW5kb3ItSWQiLCAJIFJVTEVfUkVRVUlSRUQsIC0xLCAxIH0sCisJICB7ICAiRmVhdHVyZS1MaXN0LUlEIiwgIFJVTEVfUkVRVUlSRUQsIC0xLCAxIH0sCisJICB7ICAiRmVhdHVyZS1MaXN0IiwgCSBSVUxFX1JFUVVJUkVELCAtMSwgMSB9CisJfTsKKworICAgICAgQ0hFQ0tfZGljdF9uZXcgKERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworICAgICAgUEFSU0VfbG9jX3J1bGVzKHJ1bGVzLCBhdnAsIEFWUF9CWV9OQU1FX0FMTF9WRU5ET1JTICk7CisgICAgfQorICAKKworCisKKyAgfSAvKiBlbmQgQVZQIHNlY3Rpb24gKi8KKworCisKKyAgLyogIyMjIENvbW1hbmQgc2VjdGlvbiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAqLworICB7CisgICAgLyogVXNlci1BdXRob3JpemF0aW9uLVJlcXVlc3QgKFVBUikgQ29tbWFuZCAqLworICAgIHsKKyAgICAgIC8qCisJVGhlIFVzZXItQXV0aG9yaXphdGlvbi1SZXF1ZXN0IChVQVIpIGlzIGluZGljYXRlZCBieSB0aGUgQ29tbWFuZC1Db2RlCisJc2V0IHRvIDI4MyBhbmQgdGhlIENvbW1hbmQgRmxhZ3MnICdSJyBiaXQgc2V0LiAgVGhlIERpYW1ldGVyIGNsaWVudAorCWluIGEgU0lQIHNlcnZlciBzZW5kcyB0aGlzIGNvbW1hbmQgdG8gdGhlIERpYW1ldGVyIHNlcnZlciB0byByZXF1ZXN0CisJYXV0aG9yaXphdGlvbiBmb3IgdGhlIFNJUCBVc2VyIEFnZW50IHRvIHJvdXRlIGEgU0lQIFJFR0lTVEVSIHJlcXVlc3QuCisJQmVjYXVzZSB0aGUgU0lQIFJFR0lTVEVSIHJlcXVlc3QgaW1wbGljaXRseSBjYXJyaWVzIGEgcGVybWlzc2lvbiB0bworCWJpbmQgYW4gQU9SIHRvIGEgY29udGFjdCBhZGRyZXNzLCB0aGUgRGlhbWV0ZXIgY2xpZW50IHVzZXMgdGhlCisJRGlhbWV0ZXIgVUFSIGFzIGEgZmlyc3QgYXV0aG9yaXphdGlvbiByZXF1ZXN0IHRvd2FyZHMgdGhlIERpYW1ldGVyCisJc2VydmVyIHRvIGF1dGhvcml6ZSB0aGUgcmVnaXN0cmF0aW9uLiAgRm9yIGluc3RhbmNlLCB0aGUgRGlhbWV0ZXIKKwlzZXJ2ZXIgY2FuIHZlcmlmeSB0aGF0IHRoZSBBT1IgaXMgYSBsZWdpdGltYXRlIHVzZXIgb2YgdGhlIHJlYWxtLgorCisJVGhlIERpYW1ldGVyIGNsaWVudCBpbiB0aGUgU0lQIHNlcnZlciByZXF1ZXN0cyBhdXRob3JpemF0aW9uIGZvciBvbmUKKwlvZiB0aGUgcG9zc2libGUgdmFsdWVzIGRlZmluZWQgaW4gdGhlIFNJUC1Vc2VyLUF1dGhvcml6YXRpb24tVHlwZSBBVlAKKwkoU2VjdGlvbiA5LjEwKS4KKworCVRoZSB1c2VyIG5hbWUgdXNlZCBmb3IgYXV0aGVudGljYXRpb24gb2YgdGhlIHVzZXIgaXMgY29udmV5ZWQgaW4gYQorCVVzZXItTmFtZSBBVlAgKGRlZmluZWQgaW4gdGhlIERpYW1ldGVyIGJhc2UgcHJvdG9jb2wsIFJGQyAzNTg4CisJW1JGQzM1ODhdKS4gIFRoZSBsb2NhdGlvbiBvZiB0aGUgYXV0aGVudGljYXRpb24gdXNlciBuYW1lIGluIHRoZSBTSVAKKwlSRUdJU1RFUiByZXF1ZXN0IHZhcmllcyBkZXBlbmRpbmcgb24gdGhlIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbS4KKwlXaGVuIHRoZSBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc20gaXMgSFRUUCBEaWdlc3QgYXMgZGVmaW5lZCBpbiBSRkMKKwkyNjE3IFtSRkMyNjE3XSwgdGhlIGF1dGhlbnRpY2F0aW9uIHVzZXIgbmFtZSBpcyBmb3VuZCBpbiB0aGUKKwkidXNlcm5hbWUiIGRpcmVjdGl2ZSBvZiB0aGUgU0lQIEF1dGhvcml6YXRpb24gaGVhZGVyIGZpZWxkIHZhbHVlLgorCVRoaXMgRGlhbWV0ZXIgU0lQIGFwcGxpY2F0aW9uIG9ubHkgcHJvdmlkZXMgc3VwcG9ydCBmb3IgSFRUUCBEaWdlc3QKKwlhdXRoZW50aWNhdGlvbiBpbiBTSVA7IG90aGVyIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbXMgYXJlIG5vdAorCWN1cnJlbnRseSBzdXBwb3J0ZWQuCisKKwlUaGUgU0lQIG9yIFNJUFMgVVJJIHRvIGJlIHJlZ2lzdGVyZWQgaXMgY29udmV5ZWQgaW4gdGhlIFNJUC1BT1IgQVZQCisJKFNlY3Rpb24gOS44KS4gIFR5cGljYWxseSB0aGlzIFNJUCBvciBTSVBTIFVSSSBpcyBmb3VuZCBpbiB0aGUgVG8KKwloZWFkZXIgZmllbGQgdmFsdWUgb2YgdGhlIFNJUCBSRUdJU1RFUiByZXF1ZXN0IHRoYXQgdHJpZ2dlcmVkIHRoZQorCURpYW1ldGVyIFVBUiBtZXNzYWdlLgorCisJVGhlIFNJUC1WaXNpdGVkLU5ldHdvcmstSWQgQVZQIGluZGljYXRlcyB0aGUgbmV0d29yayB0aGF0IGlzCisJcHJvdmlkaW5nIFNJUCBzZXJ2aWNlcyAoZS5nLiwgU0lQIHByb3h5IGZ1bmN0aW9uYWxpdHkgb3IgYW55IG90aGVyCisJa2luZCBvZiBzZXJ2aWNlcykgdG8gdGhlIFNJUCBVc2VyIEFnZW50LgorCisJVGhlIE1lc3NhZ2UgRm9ybWF0IG9mIHRoZSBVQVIgY29tbWFuZCBpcyBhcyBmb2xsb3dzOgorCisKKwk8IFVBUj4gOjo9PCBEaWFtZXRlciBIZWFkZXI6IDMwMCwgUkVRLCBQWFksIDE2Nzc3MjE2ID4KKwk8IFNlc3Npb24tSWQgPgorCXsgVmVuZG9yLVNwZWNpZmljLUFwcGxpY2F0aW9uLUlkIH0KKwl7IEF1dGgtU2Vzc2lvbi1TdGF0ZSB9CisJeyBPcmlnaW4tSG9zdCB9CisJeyBPcmlnaW4tUmVhbG0gfQorCVsgRGVzdGluYXRpb24tSG9zdCBdCisJeyBEZXN0aW5hdGlvbi1SZWFsbSB9CisJeyBVc2VyLU5hbWUgfQorCSpbIFN1cHBvcnRlZC1GZWF0dXJlcyBdCisJeyBQdWJsaWMtSWRlbnRpdHkgfQorCXsgVmlzaXRlZC1OZXR3b3JrLUlkZW50aWZpZXIgfQorCVsgVXNlci1BdXRob3JpemF0aW9uLVR5cGUgXQorCVsgVUFSLUZsYWdzIF0KKwkqWyBBVlAgXQorCSpbIFByb3h5LUluZm8gXQorCSpbIFJvdXRlLVJlY29yZCBdCisJKi8KKworICAgICAgc3RydWN0IGRpY3Rfb2JqZWN0ICAgKiBjbWQ7CisgICAgICBzdHJ1Y3QgZGljdF9jbWRfZGF0YSAgIGRhdGEgPSAKKwl7IAorCSAgMzAwLCAgICAgICAgICAgICAgICAgICAJLyogQ29kZSAqLworCSAgIlVzZXItQXV0aG9yaXphdGlvbi1SZXF1ZXN0IiwgLyogTmFtZSAqLworCSAgQ01EX0ZMQUdfUkVRVUVTVCB8IENNRF9GTEFHX1BST1hJQUJMRSB8IENNRF9GTEFHX0VSUk9SLCAvKiBGaXhlZCBmbGFncyAqLworCSAgQ01EX0ZMQUdfUkVRVUVTVCB8IENNRF9GTEFHX1BST1hJQUJMRSAgLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwl9OworCisgICAgICBzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0gCisJeworCSAgeyAgIlNlc3Npb24tSWQiLCAJCQlSVUxFX0ZJWEVEX0hFQUQsIC0xLCAgMSB9LAorCSAgeyAgIlZlbmRvci1TcGVjaWZpYy1BcHBsaWNhdGlvbi1JZCIsCVJVTEVfUkVRVUlSRUQsICAgLTEsICAxIH0sCisJICB7ICAiQXV0aC1TZXNzaW9uLVN0YXRlIiwgCQlSVUxFX1JFUVVJUkVELCAgIC0xLCAgMSB9LAorCSAgeyAgIk9yaWdpbi1Ib3N0IiwgCQkJUlVMRV9SRVFVSVJFRCwgICAtMSwgIDEgfSwKKwkgIHsgICJPcmlnaW4tUmVhbG0iLCAJCQlSVUxFX1JFUVVJUkVELCAgIC0xLCAgMSB9LAorCSAgLy8JICB7ICAiRGVzdGluYXRpb24tSG9zdCIsIAkJUlVMRV9PUFRJT05BTCwgICAtMSwgIDEgfSwKKwkgIHsgICJEZXN0aW5hdGlvbi1SZWFsbSIsIAkJUlVMRV9SRVFVSVJFRCwgICAtMSwgIDEgfSwKKwkgIHsgICJVc2VyLU5hbWUiLCAJCQlSVUxFX1JFUVVJUkVELCAgIC0xLCAgMSB9LAorCSAgLy8JICB7ICAiU3VwcG9ydGVkLUZlYXR1cmVzIiwgCQlSVUxFX09QVElPTkFMLCAgIC0xLCAtMSB9LAorCSAgeyAgIlB1YmxpYy1JZGVudGl0eSIsIAkJUlVMRV9SRVFVSVJFRCwgICAtMSwgIDEgfSwKKwkgIHsgICJWaXNpdGVkLU5ldHdvcmstSWRlbnRpZmllciIsICAgICAgUlVMRV9SRVFVSVJFRCwgICAtMSwgIDEgfSwKKwkgIC8vCSAgeyAgIlVBUi1GbGFncyIsICAgICAgICAgICAgICAgICAgICAgICBSVUxFX09QVElPTkFMLCAgIC0xLCAgMSB9LAorCSAgLy8JICB7ICAiVXNlci1BdXRob3JpemF0aW9uLVR5cGUiLCAJUlVMRV9PUFRJT05BTCwgICAtMSwgIDEgfSwKKwkgIC8vCSAgeyAgIlByb3h5LUluZm8iLCAJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAtMSB9LAorCSAgLy8JICB7ICAiUm91dGUtUmVjb3JkIiwgCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgLTEgfQorCX07CisJCQkKKyAgICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX0NPTU1BTkQsICZkYXRhICwgY3hkeF9kaWN0LCAmY21kKTsKKyAgICAgIFBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGNtZCwgQVZQX0JZX05BTUVfQUxMX1ZFTkRPUlMpOworICAgIH0KKworICAgIC8qIFVzZXItQXV0aG9yaXphdGlvbi1BbnN3ZXIgKFVBQSkgQ29tbWFuZCAqLworICAgIHsKKyAgICAgIC8qCisJVGhlIFVzZXItQXV0aG9yaXphdGlvbi1BbnN3ZXIgKFVBQSkgaXMgaW5kaWNhdGVkIGJ5IHRoZSBDb21tYW5kLUNvZGUKKwlzZXQgdG8gMjgzIGFuZCB0aGUgQ29tbWFuZCBGbGFncycgJ1InIGJpdCBjbGVhcmVkLiAgVGhlIERpYW1ldGVyCisJc2VydmVyIHNlbmRzIHRoaXMgY29tbWFuZCBpbiByZXNwb25zZSB0byBhIHByZXZpb3VzbHkgcmVjZWl2ZWQKKwlEaWFtZXRlciBVc2VyLUF1dGhvcml6YXRpb24tUmVxdWVzdCAoVUFSKSBjb21tYW5kLiAgVGhlIERpYW1ldGVyCisJc2VydmVyIGluZGljYXRlcyB0aGUgcmVzdWx0IG9mIHRoZSByZXF1ZXN0ZWQgcmVnaXN0cmF0aW9uCisJYXV0aG9yaXphdGlvbi4gIEFkZGl0aW9uYWxseSwgdGhlIERpYW1ldGVyIHNlcnZlciBtYXkgaW5kaWNhdGUgYQorCWNvbGxlY3Rpb24gb2YgU0lQIGNhcGFiaWxpdGllcyB0aGF0IGFzc2lzdHMgdGhlIERpYW1ldGVyIGNsaWVudCB0bworCXNlbGVjdCBhIFNJUCBwcm94eSB0byB0aGUgQU9SIHVuZGVyIHJlZ2lzdHJhdGlvbi4KKworCisJSW4gYWRkaXRpb24gdG8gdGhlIHZhbHVlcyBhbHJlYWR5IGRlZmluZWQgaW4gUkZDIDM1ODggW1JGQzM1ODhdLCB0aGUKKwlSZXN1bHQtQ29kZSBBVlAgbWF5IGNvbnRhaW4gb25lIG9mIHRoZSB2YWx1ZXMgZGVmaW5lZCBpbgorCVNlY3Rpb24gMTAuMS4KKworCVdoZW5ldmVyIHRoZSBEaWFtZXRlciBzZXJ2ZXIgZmFpbHMgdG8gcHJvY2VzcyB0aGUgRGlhbWV0ZXIgVUFSCisJbWVzc2FnZSwgaXQgTVVTVCBzdG9wIHByb2Nlc3NpbmcgYW5kIHJldHVybiB0aGUgcmVsZXZhbnQgZXJyb3IgaW4gdGhlCisJRGlhbWV0ZXIgVUFBIG1lc3NhZ2UuICBXaGVuIHRoZXJlIGlzIHN1Y2Nlc3MgaW4gdGhlIHByb2Nlc3MsIHRoZQorCURpYW1ldGVyIHNlcnZlciBNVVNUIHNldCB0aGUgY29kZSB0byBESUFNRVRFUl9TVUNDRVNTIGluIHRoZSBEaWFtZXRlcgorCVVBQSBtZXNzYWdlLgorCisJSWYgdGhlIERpYW1ldGVyIHNlcnZlciByZXF1aXJlcyBhIFVzZXItTmFtZSBBVlAgdmFsdWUgdG8gcHJvY2VzcyB0aGUKKwlEaWFtZXRlciBVQVIgcmVxdWVzdCwgYnV0IHRoZSBEaWFtZXRlciBVQVIgbWVzc2FnZSBkaWQgbm90IGNvbnRhaW4gYQorCVVzZXItTmFtZSBBVlAgdmFsdWUsIHRoZSBEaWFtZXRlciBzZXJ2ZXIgTVVTVCBzZXQgdGhlIFJlc3VsdC1Db2RlIEFWUAorCXZhbHVlIHRvIERJQU1FVEVSX1VTRVJfTkFNRV9SRVFVSVJFRCAoc2VlIFNlY3Rpb24gMTAuMS4yKSBhbmQgcmV0dXJuCisJaXQgaW4gYSBEaWFtZXRlciBVQUEgbWVzc2FnZS4gIFVwb24gcmVjZXB0aW9uIG9mIHRoaXMgRGlhbWV0ZXIgVUFBCisJbWVzc2FnZSB3aXRoIHRoZSBSZXN1bHQtQ29kZSBBVlAgdmFsdWUgc2V0IHRvCisJRElBTUVURVJfVVNFUl9OQU1FX1JFUVVJUkVELCB0aGUgU0lQIHNlcnZlciB0eXBpY2FsbHkgcmVxdWVzdHMKKwlhdXRoZW50aWNhdGlvbiBieSBzZW5kaW5nIGEgU0lQIDQwMSAoVW5hdXRob3JpemVkKSBvciBTSVAgNDA3IChQcm94eQorCUF1dGhlbnRpY2F0aW9uIFJlcXVpcmVkKSByZXNwb25zZSBiYWNrIHRvIHRoZSBvcmlnaW5hdG9yLgorCisJV2hlbiB0aGUgYXV0aG9yaXphdGlvbiBwcm9jZWR1cmUgc3VjY2VlZHMsIHRoZSBEaWFtZXRlciBzZXJ2ZXIKKwljb25zdHJ1Y3RzIGEgVXNlci1BdXRob3JpemF0aW9uLUFuc3dlciAoVUFBKSBtZXNzYWdlIHRoYXQgTVVTVAorCWluY2x1ZGUgKDEpIHRoZSBhZGRyZXNzIG9mIHRoZSBTSVAgc2VydmVyIGFscmVhZHkgYXNzaWduZWQgdG8gdGhlCisJdXNlciBuYW1lLCAoMikgdGhlIGNhcGFiaWxpdGllcyBuZWVkZWQgYnkgdGhlIFNJUCBzZXJ2ZXIgKERpYW1ldGVyCisJY2xpZW50KSB0byBzZWxlY3QgYW5vdGhlciBTSVAgc2VydmVyIGZvciB0aGUgdXNlciwgb3IgKDMpIGEKKwljb21iaW5hdGlvbiBvZiB0aGUgcHJldmlvdXMgdHdvIG9wdGlvbnMuCisKKwlJZiB0aGUgRGlhbWV0ZXIgc2VydmVyIGlzIGFscmVhZHkgYXdhcmUgb2YgYSBTSVAgc2VydmVyIGFsbG9jYXRlZCB0bworCXRoZSB1c2VyLCB0aGUgRGlhbWV0ZXIgVUFBIG1lc3NhZ2UgY29udGFpbnMgdGhlIGFkZHJlc3Mgb2YgdGhhdCBTSVAKKwlzZXJ2ZXIuCisKKwlUaGUgRGlhbWV0ZXIgVUFBIG1lc3NhZ2UgY29udGFpbnMgdGhlIGNhcGFiaWxpdGllcyByZXF1aXJlZCBieSBhIFNJUAorCXNlcnZlciB0byB0cmlnZ2VyIGFuZCBleGVjdXRlIHNlcnZpY2VzLiAgSXQgaXMgcmVxdWlyZWQgdGhhdCB0aGVzZQorCWNhcGFiaWxpdGllcyBhcmUgcHJlc2VudCBpbiB0aGUgRGlhbWV0ZXIgVUFBIG1lc3NhZ2UgZHVlIHRvIHRoZQorCXBvc3NpYmlsaXR5IHRoYXQgdGhlIERpYW1ldGVyIGNsaWVudCAoaW4gdGhlIFNJUCBzZXJ2ZXIpIGFsbG9jYXRlcyBhCisJZGlmZmVyZW50IFNJUCBzZXJ2ZXIgdG8gdHJpZ2dlciBhbmQgZXhlY3V0ZSBzZXJ2aWNlcyBmb3IgdGhhdAorCXBhcnRpY3VsYXIgdXNlci4KKworCUlmIGEgVXNlci1OYW1lIEFWUCBpcyBwcmVzZW50IGluIHRoZSBEaWFtZXRlciBVQVIgbWVzc2FnZSwgdGhlbiB0aGUKKwlEaWFtZXRlciBzZXJ2ZXIgTVVTVCB2ZXJpZnkgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgdXNlciBpbiB0aGUgcmVhbG0sCisJaS5lLiwgdGhlIFVzZXItTmFtZSBBVlAgdmFsdWUgaXMgYSB2YWxpZCB1c2VyIHdpdGhpbiB0aGF0IHJlYWxtLiAgSWYKKwl0aGUgRGlhbWV0ZXIgc2VydmVyIGRvZXMgbm90IHJlY29nbml6ZSB0aGUgdXNlciBuYW1lIHJlY2VpdmVkIGluIHRoZQorCVVzZXItTmFtZSBBVlAsIHRoZSBEaWFtZXRlciBzZXJ2ZXIgTVVTVCBidWlsZCBhIERpYW1ldGVyIFVzZXItCisJQXV0aG9yaXphdGlvbi1BbnN3ZXIgKFVBQSkgbWVzc2FnZSBhbmQgTVVTVCBzZXQgdGhlIFJlc3VsdC1Db2RlIEFWUAorCXRvIERJQU1FVEVSX0VSUk9SX1VTRVJfVU5LTk9XTi4KKworCisJSWYgYSBVc2VyLU5hbWUgQVZQIGlzIHByZXNlbnQgaW4gdGhlIERpYW1ldGVyIFVBUiBtZXNzYWdlLCB0aGVuIHRoZQorCURpYW1ldGVyIHNlcnZlciBNVVNUIGF1dGhvcml6ZSB0aGF0IFVzZXItTmFtZSBBVlAgdmFsdWUgaXMgYWJsZSB0bworCXJlZ2lzdGVyIHRoZSBTSVAgb3IgU0lQUyBVUkkgaW5jbHVkZWQgaW4gdGhlIFNJUC1BT1IgQVZQLiAgSWYgdGhpcworCWF1dGhvcml6YXRpb24gZmFpbHMsIHRoZSBEaWFtZXRlciBzZXJ2ZXIgbXVzdCBzZXQgdGhlIFJlc3VsdC1Db2RlIEFWUAorCXRvIERJQU1FVEVSX0VSUk9SX0lERU5USVRJRVNfRE9OVF9NQVRDSCBhbmQgc2VuZCBpdCBpbiBhIERpYW1ldGVyCisJVXNlci1BdXRob3JpemF0aW9uLUFuc3dlciAoVUFBKSBtZXNzYWdlLgorCisJTm90ZTogQ29ycmVsYXRpb24gYmV0d2VlbiBVc2VyLU5hbWUgYW5kIFNJUC1BT1IgQVZQIHZhbHVlcyBpcworCXJlcXVpcmVkIGluIG9yZGVyIHRvIGF2b2lkIHJlZ2lzdHJhdGlvbiBvZiBhIFNJUC1BT1IgYWxsb2NhdGVkIHRvCisJYW5vdGhlciB1c2VyLgorCisJSWYgdGhlcmUgaXMgYSBTSVAtVmlzaXRlZC1OZXR3b3JrLUlkIEFWUCBpbiB0aGUgRGlhbWV0ZXIgVUFSIG1lc3NhZ2UsCisJYW5kIHRoZSBTSVAtVXNlci1BdXRob3JpemF0aW9uLVR5cGUgQVZQIHZhbHVlIHJlY2VpdmVkIGluIHRoZQorCURpYW1ldGVyIFVBUiBtZXNzYWdlIGlzIHNldCB0byBSRUdJU1RSQVRJT04gb3IgUkVHSVNUUkFUSU9OJgorCUNBUEFCSUxJVElFUywgdGhlbiB0aGUgRGlhbWV0ZXIgc2VydmVyIFNIT1VMRCB2ZXJpZnkgd2hldGhlciB0aGUgdXNlcgorCWlzIGFsbG93ZWQgdG8gcm9hbSBpbnRvIHRoZSBuZXR3b3JrIHNwZWNpZmllZCBpbiB0aGUKKwlTSVAtVmlzaXRlZC1OZXR3b3JrLUlkIEFWUCBpbiB0aGUgRGlhbWV0ZXIgVUFSIG1lc3NhZ2UuICBJZiB0aGUgdXNlcgorCWlzIG5vdCBhbGxvd2VkIHRvIHJvYW0gaW50byB0aGF0IG5ldHdvcmssIHRoZSBEaWFtZXRlciBBQUEgc2VydmVyCisJTVVTVCBzZXQgdGhlIFJlc3VsdC1Db2RlIEFWUCB2YWx1ZSBpbiB0aGUgRGlhbWV0ZXIgVUFBIG1lc3NhZ2UgdG8KKwlESUFNRVRFUl9FUlJPUl9ST0FNSU5HX05PVF9BTExPV0VELgorCisJSWYgdGhlIFNJUC1Vc2VyLUF1dGhvcml6YXRpb24tVHlwZSBBVlAgdmFsdWUgcmVjZWl2ZWQgaW4gdGhlIERpYW1ldGVyCisJVUFSIG1lc3NhZ2UgaXMgc2V0IHRvIFJFR0lTVFJBVElPTiBvciBSRUdJU1RSQVRJT04mQ0FQQUJJTElUSUVTLCB0aGVuCisJdGhlIERpYW1ldGVyIHNlcnZlciBTSE9VTEQgdmVyaWZ5IHdoZXRoZXIgdGhlIFNJUC1BT1IgQVZQIHZhbHVlIGlzCisJYXV0aG9yaXplZCB0byByZWdpc3RlciBpbiB0aGUgSG9tZSBSZWFsbS4gIFdoZXJlIHRoZSBTSVAgQU9SIGlzIG5vdAorCWF1dGhvcml6ZWQgdG8gcmVnaXN0ZXIgaW4gdGhlIEhvbWUgUmVhbG0sIHRoZSBEaWFtZXRlciBzZXJ2ZXIgTVVTVAorCXNldCB0aGUgUmVzdWx0LUNvZGUgQVZQIHRvIERJQU1FVEVSX0FVVEhPUklaQVRJT05fUkVKRUNURUQgYW5kIHNlbmQKKwlpdCBpbiBhIERpYW1ldGVyIFVBQSBtZXNzYWdlLgorCisJV2hlbiB0aGUgU0lQLVVzZXItQXV0aG9yaXphdGlvbi1UeXBlIEFWUCBpcyBub3QgcHJlc2VudCBpbiB0aGUKKwlEaWFtZXRlciBVQVIgbWVzc2FnZSwgb3Igd2hlbiBpdCBpcyBwcmVzZW50IGFuZCBpdHMgdmFsdWUgaXMgc2V0IHRvCisJUkVHSVNUUkFUSU9OLCB0aGVuOgorCisJbyAgSWYgdGhlIERpYW1ldGVyIHNlcnZlciBpcyBub3QgYXdhcmUgb2YgYW55IHByZXZpb3VzIHJlZ2lzdHJhdGlvbgorCW9mIHRoZSB1c2VyIG5hbWUgKGluY2x1ZGluZyByZWdpc3RyYXRpb25zIG9mIG90aGVyIFNJUCBBT1JzCisJYWxsb2NhdGVkIHRvIHRoZSBzYW1lIHVzZXIgbmFtZSksIHRoZW4gdGhlIERpYW1ldGVyIHNlcnZlciBkb2VzCisJbm90IGtub3cgb2YgYW55IFNJUCBzZXJ2ZXIgYWxsb2NhdGVkIHRvIHRoZSB1c2VyLiAgSW4gdGhpcyBjYXNlLAorCXRoZSBEaWFtZXRlciBzZXJ2ZXIgTVVTVCBzZXQgdGhlIFJlc3VsdC1Db2RlIEFWUCB2YWx1ZSB0bworCURJQU1FVEVSX0ZJUlNUX1JFR0lTVFJBVElPTiBpbiB0aGUgRGlhbWV0ZXIgVUFBIG1lc3NhZ2UsIGFuZCB0aGUKKwlEaWFtZXRlciBzZXJ2ZXIgU0hPVUxEIGluY2x1ZGUgdGhlIHJlcXVpcmVkIFNJUCBzZXJ2ZXIKKwljYXBhYmlsaXRpZXMgaW4gdGhlIFNJUC1TZXJ2ZXItQ2FwYWJpbGl0aWVzIEFWUCB2YWx1ZSBpbiB0aGUKKwlEaWFtZXRlciBVQUEgbWVzc2FnZS4gIFRoZSBTSVAtU2VydmVyLUNhcGFiaWxpdGllcyBBVlAgYXNzaXN0cyB0aGUKKwlEaWFtZXRlciBjbGllbnQgKFNJUCBzZXJ2ZXIpIHRvIHNlbGVjdCBhbiBhcHByb3ByaWF0ZSBTSVAgc2VydmVyCisJZm9yIHRoZSB1c2VyLCBhY2NvcmRpbmcgdG8gdGhlIHJlcXVpcmVkIGNhcGFiaWxpdGllcy4KKworCW8gIEluIHNvbWUgY2FzZXMsIHRoZSBEaWFtZXRlciBzZXJ2ZXIgaXMgYXdhcmUgb2YgYSBwcmV2aW91c2x5CisJYXNzaWduZWQgU0lQIHNlcnZlciBmb3IgdGhlIHNhbWUgb3IgZGlmZmVyZW50IFNJUCBBT1JzIGFsbG9jYXRlZAorCXRvIHRoZSBzYW1lIHVzZXIgbmFtZS4gIEluIHRoZXNlIGNhc2VzLCByZS1hc3NpZ25tZW50IG9mIGEgbmV3IFNJUAorCXNlcnZlciBtYXkgb3IgbWF5IG5vdCBiZSBuZWVkZWQsIGRlcGVuZGluZyBvbiB0aGUgY2FwYWJpbGl0aWVzIG9mCisJdGhlIFNJUCBzZXJ2ZXIuICBUaGUgRGlhbWV0ZXIgc2VydmVyIE1VU1QgYWx3YXlzIGluY2x1ZGUgdGhlCisJYWxsb2NhdGVkIFNJUCBzZXJ2ZXIgVVJJIGluIHRoZSBTSVAtU2VydmVyLVVSSSBBVlAgb2YgdGhlIFVBQQorCW1lc3NhZ2UuICBJZiB0aGUgRGlhbWV0ZXIgc2VydmVyIGRvZXMgbm90IHJldHVybiB0aGUgU0lQCisJY2FwYWJpbGl0aWVzLCB0aGUgRGlhbWV0ZXIgc2VydmVyIE1VU1Qgc2V0IHRoZSBSZXN1bHQtQ29kZSBBVlAgaW4KKwl0aGUgRGlhbWV0ZXIgVUFBIG1lc3NhZ2UgdG8gRElBTUVURVJfU1VCU0VRVUVOVF9SRUdJU1RSQVRJT04uCisJT3RoZXJ3aXNlIChpLmUuLCBpZiB0aGUgRGlhbWV0ZXIgc2VydmVyIGluY2x1ZGVzIGEKKwlTSVAtU2VydmVyLUNhcGFiaWxpdGllcyBBVlApLCB0aGVuIHRoZSBEaWFtZXRlciBzZXJ2ZXIgTVVTVCBzZXQKKwl0aGUgUmVzdWx0LUNvZGUgQVZQIGluIHRoZSBEaWFtZXRlciBVQUEgbWVzc2FnZSB0bworCURJQU1FVEVSX1NFUlZFUl9TRUxFQ1RJT04uICBUaGVuIHRoZSBEaWFtZXRlciBjbGllbnQgZGV0ZXJtaW5lcywKKwliYXNlZCBvbiB0aGUgcmVjZWl2ZWQgaW5mb3JtYXRpb24sIHdoZXRoZXIgaXQgbmVlZHMgdG8gc2VsZWN0IGEKKwluZXcgU0lQIHNlcnZlci4KKworCVdoZW4gdGhlIFNJUC1Vc2VyLUF1dGhvcml6YXRpb24tVHlwZSBBVlAgdmFsdWUgcmVjZWl2ZWQgaW4gdGhlCisJRGlhbWV0ZXIgVUFSIG1lc3NhZ2UgaXMgc2V0IHRvIFJFR0lTVFJBVElPTiZDQVBBQklMSVRJRVMsIHRoZW4KKwlEaWFtZXRlciBTZXJ2ZXIgTVVTVCByZXR1cm4gdGhlIGxpc3Qgb2YgY2FwYWJpbGl0aWVzIGluIHRoZQorCVNJUC1TZXJ2ZXItQ2FwYWJpbGl0aWVzIEFWUCB2YWx1ZSBvZiB0aGUgRGlhbWV0ZXIgVUFBIG1lc3NhZ2UsIGl0CisJTVVTVCBzZXQgdGhlIFJlc3VsdC1Db2RlIHRvIERJQU1FVEVSX1NVQ0NFU1MsIGFuZCBpdCBNVVNUIE5PVCByZXR1cm4KKwlhIFNJUC1TZXJ2ZXItVVJJIEFWUC4gIFRoZSBTSVAtU2VydmVyLUNhcGFiaWxpdGllcyBBVlAgZW5hYmxlcyB0aGUKKwlTSVAgc2VydmVyIChEaWFtZXRlciBjbGllbnQpIHRvIHNlbGVjdCBhbm90aGVyIGFwcHJvcHJpYXRlIFNJUCBzZXJ2ZXIKKwlmb3IgaW52b2tpbmcgYW5kIGV4ZWN1dGluZyBzZXJ2aWNlcyBmb3IgdGhlIHVzZXIsIGRlcGVuZGluZyBvbiB0aGUKKwlyZXF1aXJlZCBjYXBhYmlsaXRpZXMuICBUaGUgRGlhbWV0ZXIgc2VydmVyIE1BWSBsZWF2ZSB0aGUgbGlzdCBvZgorCWNhcGFiaWxpdGllcyBlbXB0eSB0byBpbmRpY2F0ZSB0aGF0IGFueSBTSVAgc2VydmVyIGNhbiBiZSBzZWxlY3RlZC4KKworCVdoZW4gdGhlIFNJUC1Vc2VyLUF1dGhvcml6YXRpb24tVHlwZSBBVlAgdmFsdWUgcmVjZWl2ZWQgaW4gdGhlCisJRGlhbWV0ZXIgVUFSIG1lc3NhZ2UgaXMgc2V0IHRvIERFUkVHSVNUUkFUSU9OLCB0aGVuOgorCisJbyAgSWYgdGhlIERpYW1ldGVyIHNlcnZlciBpcyBhd2FyZSBvZiBhIFNJUCBzZXJ2ZXIgYXNzaWduZWQgdG8gdGhlCisJU0lQIEFPUiB1bmRlciBkZXJlZ2lzdHJhdGlvbiwgdGhlIERpYW1ldGVyIHNlcnZlciBNVVNUIHNldCB0aGUKKwlSZXN1bHQtQ29kZSBBVlAgdG8gRElBTUVURVJfU1VDQ0VTUyBhbmQgTVVTVCBzZXQgdGhlCisJU0lQLVNlcnZlci1VUkkgQVZQIHZhbHVlIHRvIHRoZSBrbm93biBTSVAgc2VydmVyLCBhbmQgcmV0dXJuIHRoZW0KKwlpbiB0aGUgRGlhbWV0ZXIgVUFBIG1lc3NhZ2UuCisKKwlvICBJZiB0aGUgRGlhbWV0ZXIgc2VydmVyIGlzIG5vdCBhd2FyZSBvZiBhIFNJUCBzZXJ2ZXIgYXNzaWduZWQgdG8KKwl0aGUgU0lQIEFPUiB1bmRlciBkZXJlZ2lzdHJhdGlvbiwgdGhlbiB0aGUgRGlhbWV0ZXIgc2VydmVyIE1VU1QKKwlzZXQgdGhlIFJlc3VsdC1Db2RlIEFWUCBpbiB0aGUgRGlhbWV0ZXIgVUFBIG1lc3NhZ2UgdG8KKwlESUFNRVRFUl9FUlJPUl9JREVOVElUWV9OT1RfUkVHSVNURVJFRC4KKworCVRoZSBNZXNzYWdlIEZvcm1hdCBvZiB0aGUgVUFBIGNvbW1hbmQgaXMgYXMgZm9sbG93czoKKworCTxVQUE+IDo6PSA8IERpYW1ldGVyIEhlYWRlcjogMjgzLCBQWFkgPgorCTwgU2Vzc2lvbi1JZCA+CisJeyBBdXRoLUFwcGxpY2F0aW9uLUlkIH0KKwl7IEF1dGgtU2Vzc2lvbi1TdGF0ZSB9CisJeyBSZXN1bHQtQ29kZSB9CisJeyBPcmlnaW4tSG9zdCB9CisJeyBPcmlnaW4tUmVhbG0gfQorCVsgU0lQLVNlcnZlci1VUkkgXQorCVsgU0lQLVNlcnZlci1DYXBhYmlsaXRpZXMgXQorCVsgQXV0aG9yaXphdGlvbi1MaWZldGltZSBdCisJWyBBdXRoLUdyYWNlLVBlcmlvZCBdCisJWyBSZWRpcmVjdC1Ib3N0IF0KKwlbIFJlZGlyZWN0LUhvc3QtVXNhZ2UgXQorCVsgUmVkaXJlY3QtTWF4LUNhY2hlLVRpbWUgXQorCSogWyBQcm94eS1JbmZvIF0KKwkqIFsgUm91dGUtUmVjb3JkIF0KKwkqIFsgQVZQIF0KKworCisJKi8KKyAgICAgIHN0cnVjdCBkaWN0X29iamVjdCAqIGNtZDsKKyAgICAgIHN0cnVjdCBkaWN0X2NtZF9kYXRhIGRhdGEgPSAKKwl7IAorCSAgMzAwLCAJCQkJCS8qIENvZGUgKi8KKwkgICJVc2VyLUF1dGhvcml6YXRpb24tQW5zd2VyIiwgCQkvKiBOYW1lICovCisJICBDTURfRkxBR19SRVFVRVNUIHwgQ01EX0ZMQUdfUFJPWElBQkxFIHwgQ01EX0ZMQUdfRVJST1IsIC8qIEZpeGVkIGZsYWdzICovCisJICBDTURfRkxBR19QUk9YSUFCTEUgCQkJCQkgIC8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJfTsKKworICAgICAgc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9IAorCXsgCSAKKwkgIHsgICJTZXNzaW9uLUlkIiwgCQlSVUxFX0ZJWEVEX0hFQUQsIC0xLCAgMSB9LAorCSAgeyAgIkF1dGgtQXBwbGljYXRpb24tSWQiLCAJUlVMRV9SRVFVSVJFRCwgICAtMSwgIDEgfSwKKwkgIHsgICJBdXRoLVNlc3Npb24tU3RhdGUiLCAJUlVMRV9SRVFVSVJFRCwgICAtMSwgIDEgfSwKKwkgIHsgICJSZXN1bHQtQ29kZSIsIAkJUlVMRV9SRVFVSVJFRCwgICAtMSwgIDEgfSwKKwkgIHsgICJPcmlnaW4tSG9zdCIsIAkJUlVMRV9SRVFVSVJFRCwgICAtMSwgIDEgfSwKKwkgIHsgICJPcmlnaW4tUmVhbG0iLCAJCVJVTEVfUkVRVUlSRUQsICAgLTEsICAxIH0sCisJICB7ICAiUHJveHktSW5mbyIsIAkJUlVMRV9PUFRJT05BTCwgICAtMSwgLTEgfSwKKwkgIHsgICJSb3V0ZS1SZWNvcmQiLCAJCVJVTEVfT1BUSU9OQUwsICAgLTEsIC0xIH0KKwl9OworCisgICAgICBDSEVDS19kaWN0X25ldyggRElDVF9DT01NQU5ELCAmZGF0YSAsIGN4ZHhfZGljdCwgJmNtZCk7CisgICAgICBQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBjbWQsIEFWUF9CWV9OQU1FICk7CisgICAgfQorCisKKworCisKKyNpZiAwICAgLyogVE9ETyAtIE5SR0ogOiAgIGFsdGVyYXIgY29uZm9ybWUgUkZDLTNHUFAgOiAqLworCQkKKyAgICAvKiBNdWx0aW1lZGlhLUF1dGgtUmVxdWVzdCAoTUFSKSBDb21tYW5kICovCisgICAgeworICAgICAgLyoJCQorCQkJVGhlIE11bHRpbWVkaWEtQXV0aC1SZXF1ZXN0IChNQVIpIGNvbW1hbmQgaXMgaW5kaWNhdGVkIGJ5IHRoZQorCQkJQ29tbWFuZC1Db2RlIHNldCB0byAyODYgYW5kIHRoZSBDb21tYW5kIEZsYWdzJyAnUicgYml0IHNldC4gIFRoZQorCQkJRGlhbWV0ZXIgY2xpZW50IGluIGEgU0lQIHNlcnZlciBzZW5kcyB0aGlzIGNvbW1hbmQgdG8gdGhlIERpYW1ldGVyCisJCQlzZXJ2ZXIgdG8gcmVxdWVzdCB0aGF0IHRoZSBEaWFtZXRlciBzZXJ2ZXIgYXV0aGVudGljYXRlIGFuZCBhdXRob3JpemUKKwkJCWEgdXNlciBhdHRlbXB0IHRvIHVzZSBzb21lIFNJUCBzZXJ2aWNlIChpbiB0aGlzIGNvbnRleHQsIFNJUCBzZXJ2aWNlCisJCQljYW4gYmUgc29tZXRoaW5nIGFzIHNpbXBsZSBhcyBhIFNJUCBzdWJzY3JpcHRpb24gb3IgdXNpbmcgdGhlIHByb3h5CisJCQlzZXJ2aWNlcyBmb3IgYSBTSVAgcmVxdWVzdCkuCisKKwkJCVRoZSBNQVIgY29tbWFuZCBtYXkgYWxzbyByZWdpc3RlciB0aGUgU0lQIHNlcnZlcidzIG93biBVUkkgdG8gdGhlCisJCQlEaWFtZXRlciBzZXJ2ZXIsIHNvIHRoYXQgZnV0dXJlIExJUi9MSUEgbWVzc2FnZXMgY2FuIHJldHVybiB0aGlzIFVSSS4KKwkJCUlmIHRoZSBTSVAgc2VydmVyIGlzIGFjdGluZyBhcyBhIFNJUCByZWdpc3RyYXIgKHNlZSBleGFtcGxlcyBpbgorCQkJU2VjdGlvbnMgNi4yIGFuZCA2LjMpLCBpdHMgRGlhbWV0ZXIgY2xpZW50IE1VU1QgaW5jbHVkZSBhIFNJUC0KKwkJCVNlcnZlci1VUkkgQVZQIGluIHRoZSBNQVIgY29tbWFuZC4gIEluIGFueSBvdGhlciBjYXNlcyAoc2VlIGV4YW1wbGUKKwkJCWluIFNlY3Rpb24gNi40KSwgaXRzIERpYW1ldGVyIGNsaWVudCBNVVNUIE5PVCBpbmNsdWRlIGEgU0lQLVNlcnZlci0KKwkJCVVSSSBBVlAgaW4gdGhlIE1BUiBjb21tYW5kLgorCisJCQlUaGUgU0lQLU1ldGhvZCBBVlAgTVVTVCBpbmNsdWRlIHRoZSBTSVAgbWV0aG9kIG5hbWUgb2YgdGhlIFNJUAorCQkJcmVxdWVzdCB0aGF0IHRyaWdnZXJlZCB0aGlzIERpYW1ldGVyIE1BUiBtZXNzYWdlLiAgVGhlIERpYW1ldGVyCisJCQlzZXJ2ZXIgY2FuIHVzZSB0aGlzIEFWUCB0byBhdXRob3JpemUgc29tZSBTSVAgcmVxdWVzdHMgZGVwZW5kaW5nIG9uCisJCQl0aGUgbWV0aG9kLgorCisJCQlUaGUgRGlhbWV0ZXIgTUFSIG1lc3NhZ2UgTVVTVCBpbmNsdWRlIGEgU0lQLUFPUiBBVlAuICBUaGUgU0lQLUFPUiBBVlAKKwkJCWluZGljYXRlcyB0aGUgdGFyZ2V0IG9mIHRoZSBTSVAgcmVxdWVzdC4gIFRoZSB2YWx1ZSBvZiB0aGUgQVZQIGlzCisJCQlleHRyYWN0ZWQgZnJvbSBkaWZmZXJlbnQgcGxhY2VzIGluIFNJUCByZXF1ZXN0LCBkZXBlbmRpbmcgb24gdGhlCisJCQlzZW1hbnRpY3Mgb2YgdGhlIFNJUCByZXF1ZXN0LiAgRm9yIFNJUCBSRUdJU1RFUiBtZXNzYWdlcyB0aGUgU0lQLUFPUgorCQkJQVZQIHZhbHVlIGluZGljYXRlcyB0aGUgaW50ZW5kZWQgcHVibGljIHVzZXIgaWRlbnRpdHkgdW5kZXIKKwkJCXJlZ2lzdHJhdGlvbiwgYW5kIGl0IGlzIHRoZSBTSVAgb3IgU0lQUyBVUkkgcG9wdWxhdGVkIGluIHRoZSBUbworCQkJaGVhZGVyIGZpZWxkIHZhbHVlIChhZGRyLXNwZWMgYXMgcGVyIFJGQyAzMjYxIFtSRkMzMjYxXSkgb2YgdGhlIFNJUAorCQkJUkVHSVNURVIgcmVxdWVzdC4gIEZvciBvdGhlciB0eXBlcyBvZiBTSVAgcmVxdWVzdHMsIHN1Y2ggYXMgSU5WSVRFLAorCQkJU1VCU0NSSUJFLCBNRVNTQUdFLCBldGMuLCB0aGUgU0lQLUFPUiBBVlAgdmFsdWUgaW5kaWNhdGVzIHRoZQorCQkJaW50ZW5kZWQgZGVzdGluYXRpb24gb2YgdGhlIHJlcXVlc3QuICBUaGlzIGlzIHR5cGljYWxseSBwb3B1bGF0ZWQgaW4KKwkJCXRoZSBSZXF1ZXN0LVVSSSBvZiB0aGUgU0lQIHJlcXVlc3QuICBFeHRyYWN0aW5nIHRoZSBTSVAtQU9SIEFWUCB2YWx1ZQorCQkJZnJvbSB0aGUgcHJvcGVyIFNJUCBoZWFkZXIgZmllbGQgaXMgdGhlIERpYW1ldGVyIGNsaWVudCdzCisJCQlyZXNwb25zaWJpbGl0eS4gIEV4dGVuc2lvbnMgdG8gU0lQIChuZXcgU0lQIG1ldGhvZHMgb3IgbmV3IHNlbWFudGljcykKKwkJCW1heSByZXF1aXJlIHRoZSBTSVAtQU9SIHRvIGJlIGV4dHJhY3RlZCBmcm9tIG90aGVyIHBhcnRzIG9mIHRoZQorCQkJcmVxdWVzdC4KKworCQkJSWYgdGhlIFNJUCByZXF1ZXN0IGluY2x1ZGVzIHNvbWUgc29ydCBvZiBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbiwKKwkJCXRoZSBEaWFtZXRlciBjbGllbnQgTVVTVCBpbmNsdWRlIHRoZSB1c2VyIG5hbWUsIGV4dHJhY3RlZCBmcm9tIHRoZQorCQkJYXV0aGVudGljYXRpb24gaW5mb3JtYXRpb24gb2YgdGhlIFNJUCByZXF1ZXN0LCBpbiB0aGUgVXNlci1OYW1lIEFWUAorCQkJdmFsdWUuCisKKwkJCVRoZSBNZXNzYWdlIEZvcm1hdCBvZiB0aGUgTUFSIGNvbW1hbmQgaXMgYXMgZm9sbG93czoKKworCQkJPE1BUj4gOjo9IDwgRGlhbWV0ZXIgSGVhZGVyOiAyODYsIFJFUSwgUFhZID4KKwkJCTwgU2Vzc2lvbi1JZCA+CisJCQl7IEF1dGgtQXBwbGljYXRpb24tSWQgfQorCQkJeyBBdXRoLVNlc3Npb24tU3RhdGUgfQorCQkJeyBPcmlnaW4tSG9zdCB9CisJCQl7IE9yaWdpbi1SZWFsbSB9CisJCQl7IERlc3RpbmF0aW9uLVJlYWxtIH0KKwkJCXsgU0lQLUFPUiB9CisJCQl7IFNJUC1NZXRob2QgfQorCQkJWyBEZXN0aW5hdGlvbi1Ib3N0IF0KKwkJCVsgVXNlci1OYW1lIF0KKwkJCVsgU0lQLVNlcnZlci1VUkkgXQorCQkJWyBTSVAtTnVtYmVyLUF1dGgtSXRlbXMgXQorCQkJWyBTSVAtQXV0aC1EYXRhLUl0ZW0gXQorCQkJKiBbIFByb3h5LUluZm8gXQorCQkJKiBbIFJvdXRlLVJlY29yZCBdCisJCQkqIFsgQVZQIF0KKworCQkJKi8KKworICAgICAgc3RydWN0IGRpY3Rfb2JqZWN0ICogY21kOworICAgICAgc3RydWN0IGRpY3RfY21kX2RhdGEgZGF0YSA9IAorCXsgCisJICAzMDMsIAkJCQkvKiBDb2RlICovCisJICAiTXVsdGltZWRpYS1BdXRoLVJlcXVlc3QiLCAJLyogTmFtZSAqLworCSAgQ01EX0ZMQUdfUkVRVUVTVCB8IENNRF9GTEFHX1BST1hJQUJMRSB8IENNRF9GTEFHX0VSUk9SLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkgIENNRF9GTEFHX1JFUVVFU1QgfCBDTURfRkxBR19QUk9YSUFCTEUgCQkJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwl9OworCisgICAgICBzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0gCisJeyAJIHsgICJTZXNzaW9uLUlkIiwgCQlSVUxFX0ZJWEVEX0hFQUQsIC0xLCAxIH0KKwkJICx7ICAiQXV0aC1BcHBsaWNhdGlvbi1JZCIsIAlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJICx7ICAiQXV0aC1TZXNzaW9uLVN0YXRlIiwgCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkgLHsgICJPcmlnaW4tSG9zdCIsIAkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCSAseyAgIk9yaWdpbi1SZWFsbSIsIAkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCSAseyAgIkRlc3RpbmF0aW9uLVJlYWxtIiwJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCSAseyAgIlNJUC1BT1IiLCAJCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkgLHsgICJTSVAtTWV0aG9kIiwgCQlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJICx7ICAiRGVzdGluYXRpb24tSG9zdCIsIAlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJICx7ICAiVXNlci1OYW1lIiwgCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJICx7ICAiU0lQLVNlcnZlci1VUkkiLCAJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkgLHsgICJTSVAtTnVtYmVyLUF1dGgtSXRlbXMiLCAJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCSAseyAgIlNJUC1BdXRoLURhdGEtSXRlbSIsIAlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJICx7ICAiUHJveHktSW5mbyIsIAkJUlVMRV9PUFRJT05BTCwgICAtMSwgLTEgfQorCQkgLHsgICJSb3V0ZS1SZWNvcmQiLCAJCVJVTEVfT1BUSU9OQUwsICAgLTEsIC0xIH0KKworCX07CisJCQkKKyAgICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX0NPTU1BTkQsICZkYXRhICwgY3hkeF9kaWN0LCAmY21kKTsKKyAgICAgIFBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGNtZCwgQVZQX0JZX05BTUUgKTsKKyAgICB9CisgICAgLyogTXVsdGltZWRpYS1BdXRoLUFuc3dlciAoTUFBKSBDb21tYW5kICovCisgICAgeworICAgICAgLyoKKwkJCQorCVRoZSBNdWx0aW1lZGlhLUF1dGgtQW5zd2VyIChNQUEpIGlzIGluZGljYXRlZCBieSB0aGUgQ29tbWFuZC1Db2RlIHNldAorCXRvIDI4NiBhbmQgdGhlIENvbW1hbmQgRmxhZ3MnICdSJyBiaXQgY2xlYXJlZC4gIFRoZSBEaWFtZXRlciBzZXJ2ZXIKKwlzZW5kcyB0aGlzIGNvbW1hbmQgaW4gcmVzcG9uc2UgdG8gYSBwcmV2aW91c2x5IHJlY2VpdmVkIERpYW1ldGVyCisJTXVsdGltZWRpYS1BdXRoLVJlcXVlc3QgKE1BUikgY29tbWFuZC4KKworCUluIGFkZGl0aW9uIHRvIHRoZSB2YWx1ZXMgYWxyZWFkeSBkZWZpbmVkIGluIFJGQyAzNTg4IFtSRkMzNTg4XSwgdGhlCisJUmVzdWx0LUNvZGUgQVZQIG1heSBjb250YWluIG9uZSBvZiB0aGUgdmFsdWVzIGRlZmluZWQgaW4KKwlTZWN0aW9uIDEwLjEuCisKKwlJZiB0aGUgRGlhbWV0ZXIgc2VydmVyIHJlcXVpcmVzIGEgVXNlci1OYW1lIEFWUCB2YWx1ZSB0byBwcm9jZXNzIHRoZQorCURpYW1ldGVyIE1BUiByZXF1ZXN0LCBidXQgdGhlIERpYW1ldGVyIE1BUiBtZXNzYWdlIGRpZCBub3QgY29udGFpbiBhCisJVXNlci1OYW1lIEFWUCB2YWx1ZSwgdGhlIERpYW1ldGVyIHNlcnZlciBNVVNUIHNldCB0aGUgUmVzdWx0LUNvZGUgQVZQCisJdmFsdWUgdG8gRElBTUVURVJfVVNFUl9OQU1FX1JFUVVJUkVEIChzZWUgU2VjdGlvbiAxMC4xLjIpIGFuZCByZXR1cm4KKwlpdCBpbiBhIERpYW1ldGVyIE1BQSBtZXNzYWdlLiAgVGhlIERpYW1ldGVyIHNlcnZlciBNQVkgaW5jbHVkZSBhCisJU0lQLU51bWJlci1BdXRoLUl0ZW1zIEFWUCBhbmQgb25lIG9yIG1vcmUgU0lQLUF1dGgtRGF0YS1JdGVtIEFWUHMKKwl3aXRoIGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uIChlLmcuLCBhIGNoYWxsZW5nZSkuICBVcG9uIHJlY2VwdGlvbgorCW9mIHRoaXMgRGlhbWV0ZXIgTUFBIG1lc3NhZ2Ugd2l0aCB0aGUgUmVzdWx0LUNvZGUgQVZQIHZhbHVlIHNldCB0bworCURJQU1FVEVSX1VTRVJfTkFNRV9SRVFVSVJFRCwgdGhlIFNJUCBzZXJ2ZXIgdHlwaWNhbGx5IHJlcXVlc3RzCisJYXV0aGVudGljYXRpb24gYnkgZ2VuZXJhdGluZyBhIFNJUCA0MDEgKFVuYXV0aG9yaXplZCkgb3IgU0lQIDQwNworCShQcm94eSBBdXRoZW50aWNhdGlvbiBSZXF1aXJlZCkgcmVzcG9uc2UgYmFjayB0byB0aGUgb3JpZ2luYXRvci4KKworCUlmIHRoZSBVc2VyLU5hbWUgQVZQIGlzIHByZXNlbnQgaW4gdGhlIERpYW1ldGVyIE1BUiBtZXNzYWdlLCB0aGUKKwlEaWFtZXRlciBzZXJ2ZXIgTVVTVCB2ZXJpZnkgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgdXNlciBpbiB0aGUgcmVhbG0sCisJaS5lLiwgdGhlIFVzZXItTmFtZSBBVlAgdmFsdWUgaXMgYSB2YWxpZCB1c2VyIHdpdGhpbiB0aGF0IHJlYWxtLiAgSWYKKwl0aGUgRGlhbWV0ZXIgc2VydmVyIGRvZXMgbm90IHJlY29nbml6ZSB0aGUgdXNlciBuYW1lIHJlY2VpdmVkIGluIHRoZQorCVVzZXItTmFtZSBBVlAsIHRoZSBEaWFtZXRlciBzZXJ2ZXIgTVVTVCBidWlsZCBhIERpYW1ldGVyCisJTXVsdGltZWRpYS1BdXRoLUFuc3dlciAoTUFBKSBtZXNzYWdlIGFuZCBNVVNUIHNldCB0aGUgUmVzdWx0LUNvZGUgQVZQCisJdG8gRElBTUVURVJfRVJST1JfVVNFUl9VTktOT1dOLgorCisJSWYgdGhlIFNJUC1NZXRob2RzIEFWUCB2YWx1ZSBvZiB0aGUgRGlhbWV0ZXIgTUFSIG1lc3NhZ2UgaXMgc2V0IHRvCisJUkVHSVNURVIgYW5kIGEgVXNlci1OYW1lIEFWUCBpcyBwcmVzZW50LCB0aGVuIHRoZSBEaWFtZXRlciBzZXJ2ZXIKKwlNVVNUIGF1dGhvcml6ZSB0aGF0IFVzZXItTmFtZSBBVlAgdmFsdWUgaXMgYWJsZSB0byB1c2UgdGhlIFVSSQorCWluY2x1ZGVkIGluIHRoZSBTSVAtQU9SIEFWUC4gIElmIHRoaXMgYXV0aG9yaXphdGlvbiBmYWlscywgdGhlCisJRGlhbWV0ZXIgc2VydmVyIG11c3Qgc2V0IHRoZSBSZXN1bHQtQ29kZSBBVlAgdG8KKwlESUFNRVRFUl9FUlJPUl9JREVOVElUSUVTX0RPTlRfTUFUQ0ggYW5kIHNlbmQgaXQgaW4gYSBEaWFtZXRlcgorCU11bHRpbWVkaWEtQXV0aC1BbnN3ZXIgKE1BQSkgbWVzc2FnZS4KKworCU5vdGU6IENvcnJlbGF0aW9uIGJldHdlZW4gVXNlci1OYW1lIGFuZCBTSVAtQU9SIEFWUCB2YWx1ZXMgaXMgb25seQorCXJlcXVpcmVkIGZvciBTSVAgUkVHSVNURVIgcmVxdWVzdCwgdG8gcHJldmVudCBhIHVzZXIgZnJvbQorCXJlZ2lzdGVyaW5nIGEgU0lQLUFPUiBhbGxvY2F0ZWQgdG8gYW5vdGhlciB1c2VyLiAgSW4gb3RoZXIgdHlwZXMKKwlvZiBTSVAgcmVxdWVzdHMgKGUuZy4sIElOVklURSksIHRoZSBTSVAtQU9SIGluZGljYXRlcyB0aGUgaW50ZW5kZWQKKwlkZXN0aW5hdGlvbiBvZiB0aGUgcmVxdWVzdCwgcmF0aGVyIHRoYW4gdGhlIG9yaWdpbmF0b3Igb2YgaXQuCisKKwlUaGUgRGlhbWV0ZXIgc2VydmVyIE1VU1QgdmVyaWZ5IHdoZXRoZXIgdGhlIGF1dGhlbnRpY2F0aW9uIHNjaGVtZQorCShTSVAtQXV0aGVudGljYXRpb24tU2NoZW1lIEFWUCB2YWx1ZSkgaW5kaWNhdGVkIGluIHRoZSBncm91cGVkCisJU0lQLUF1dGgtRGF0YS1JdGVtIEFWUCBpcyBzdXBwb3J0ZWQgb3Igbm90LiAgSWYgdGhhdCBhdXRoZW50aWNhdGlvbgorCXNjaGVtZSBpcyBub3Qgc3VwcG9ydGVkLCB0aGVuIHRoZSBEaWFtZXRlciBzZXJ2ZXIgTVVTVCBzZXQgdGhlCisJUmVzdWx0LUNvZGUgQVZQIHRvIERJQU1FVEVSX0VSUk9SX0FVVEhfU0NIRU1FX05PVF9TVVBQT1JURUQgYW5kIHNlbmQKKwlpdCBpbiBhIERpYW1ldGVyIE11bHRpbWVkaWEtQXV0aC1BbnN3ZXIgKE1BQSkgbWVzc2FnZS4KKworCUlmIHRoZSBTSVAtTnVtYmVyLUF1dGgtSXRlbXMgQVZQIGlzIHByZXNlbnQgaW4gdGhlIERpYW1ldGVyIE1BUgorCW1lc3NhZ2UsIGl0IGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGF1dGhlbnRpY2F0aW9uIGRhdGEgaXRlbXMgdGhhdAorCXRoZSBEaWFtZXRlciBjbGllbnQgaXMgcmVxdWVzdGluZy4gIEl0IGlzIFJFQ09NTUVOREVEIHRoYXQgdGhlCisJRGlhbWV0ZXIgc2VydmVyLCB3aGVuIGJ1aWxkaW5nIHRoZSBEaWFtZXRlciBNQUEgbWVzc2FnZSwgaW5jbHVkZXMgYQorCW51bWJlciBvZiBTSVAtQXV0aC1EYXRhLUl0ZW0gQVZQcyB0aGF0IGFyZSBhIHN1YnNldCBvZiB0aGUKKwlhdXRoZW50aWNhdGlvbiBkYXRhIGl0ZW1zIHJlcXVlc3RlZCBieSB0aGUgRGlhbWV0ZXIgY2xpZW50IGluIHRoZQorCVNJUC1OdW1iZXItQXV0aC1JdGVtcyBBVlAgdmFsdWUgb2YgdGhlIERpYW1ldGVyIE1BUiBtZXNzYWdlLgorCisJSWYgdGhlIFNJUC1TZXJ2ZXItVVJJIEFWUCBpcyBwcmVzZW50IGluIHRoZSBEaWFtZXRlciBNQVIgbWVzc2FnZSwKKwl0aGVuIHRoZSBEaWFtZXRlciBzZXJ2ZXIgTVVTVCBjb21wYXJlIHRoZSBzdG9yZWQgU0lQIHNlcnZlciAoYXNzaWduZWQKKwl0byB0aGUgdXNlcikgd2l0aCB0aGUgU0lQLVNlcnZlci1VUkkgQVZQIHZhbHVlIChyZWNlaXZlZCBpbiB0aGUKKwlEaWFtZXRlciBNQVIgbWVzc2FnZSkuICBJZiB0aGV5IGRvbid0IG1hdGNoLCB0aGUgRGlhbWV0ZXIgc2VydmVyIE1VU1QKKwl0ZW1wb3JhcmlseSBzYXZlIHRoZSBuZXdseSByZWNlaXZlZCBTSVAgc2VydmVyIGFzc2lnbmVkIHRvIHRoZSB1c2VyLAorCWFuZCBNVVNUIHNldCBhbiAiYXV0aGVudGljYXRpb24gcGVuZGluZyIgZmxhZyBmb3IgdGhlIHVzZXIuICBJZiB0aGV5CisJbWF0Y2gsIHRoZSBEaWFtZXRlciBzZXJ2ZXIgc2hhbGwgY2xlYXIgdGhlICJhdXRoZW50aWNhdGlvbiBwZW5kaW5nIgorCWZsYWcgZm9yIHRoZSB1c2VyLgorCisJSW4gYW55IG90aGVyIHNpdHVhdGlvbiwgaWYgdGhlcmUgaXMgYSBzdWNjZXNzIGluIHByb2Nlc3NpbmcgdGhlCisJRGlhbWV0ZXIgTUFSIGNvbW1hbmQgYW5kIHRoZSBEaWFtZXRlciBzZXJ2ZXIgc3RvcmVkIHRoZQorCVNJUC1TZXJ2ZXItVVJJLCB0aGUgRGlhbWV0ZXIgc2VydmVyIE1VU1Qgc2V0IHRoZSBSZXN1bHQtQ29kZSBBVlAKKwl2YWx1ZSB0byBESUFNRVRFUl9TVUNDRVNTIGFuZCByZXR1cm4gaXQgaW4gYSBEaWFtZXRlciBNQUEgbWVzc2FnZS4KKworCUlmIHRoZXJlIGlzIGEgc3VjY2VzcyBpbiBwcm9jZXNzaW5nIHRoZSBEaWFtZXRlciBNQVIgY29tbWFuZCwgYnV0IHRoZQorCURpYW1ldGVyIHNlcnZlciBkb2VzIG5vdCBzdG9yZSB0aGUgU0lQLVNlcnZlci1VUkkgYmVjYXVzZSB0aGUgQVZQIHdhcworCW5vdCBwcmVzZW50IGluIHRoZSBEaWFtZXRlciBNQVIgY29tbWFuZCwgdGhlbiB0aGUgRGlhbWV0ZXIgc2VydmVyCisJTVVTVCBzZXQgdGhlIFJlc3VsdC1Db2RlIEFWUCB2YWx1ZSB0byBlaXRoZXI6CisKKwkxLiAgRElBTUVURVJfU1VDQ0VTU19BVVRIX1NFTlRfU0VSVkVSX05PVF9TVE9SRUQsIGlmIHRoZSBEaWFtZXRlcgorCXNlcnZlciBpcyBzZW5kaW5nIGF1dGhlbnRpY2F0aW9uIGNyZWRlbnRpYWxzIHRvIGNyZWF0ZSBhCisJY2hhbGxlbmdlLgorCisJMi4gIERJQU1FVEVSX1NVQ0NFU1NfU0VSVkVSX05BTUVfTk9UX1NUT1JFRCwgaWYgdGhlIERpYW1ldGVyIHNlcnZlcgorCXN1Y2Nlc3NmdWxseSBhdXRoZW50aWNhdGVkIHRoZSB1c2VyIGFuZCBhdXRob3JpemVkIHRoZSBTSVAgc2VydmVyCisJdG8gcHJvY2VlZCB3aXRoIHRoZSBTSVAgcmVxdWVzdC4KKworCU90aGVyd2lzZSwgdGhlIERpYW1ldGVyIHNlcnZlciBNVVNUIHNldCB0aGUgUmVzdWx0LUNvZGUgQVZQIHZhbHVlIHRvCisJRElBTUVURVJfVU5BQkxFX1RPX0NPTVBMWSwgYW5kIGl0IE1VU1QgTk9UIGluY2x1ZGUgYW55CisJU0lQLUF1dGgtRGF0YS1JdGVtIEFWUC4KKworCVRoZSBNZXNzYWdlIEZvcm1hdCBvZiB0aGUgTUFBIGNvbW1hbmQgaXMgYXMgZm9sbG93czoKKworCTxNQUE+IDo6PSA8IERpYW1ldGVyIEhlYWRlcjogMjg2LCBQWFkgPgorCTwgU2Vzc2lvbi1JZCA+CisJeyBBdXRoLUFwcGxpY2F0aW9uLUlkIH0KKwl7IFJlc3VsdC1Db2RlIH0KKwl7IEF1dGgtU2Vzc2lvbi1TdGF0ZSB9CisJeyBPcmlnaW4tSG9zdCB9CisJeyBPcmlnaW4tUmVhbG0gfQorCVsgVXNlci1OYW1lIF0KKwlbIFNJUC1BT1IgXQorCVsgU0lQLU51bWJlci1BdXRoLUl0ZW1zIF0KKwkqIFsgU0lQLUF1dGgtRGF0YS1JdGVtIF0KKwlbIEF1dGhvcml6YXRpb24tTGlmZXRpbWUgXQorCVsgQXV0aC1HcmFjZS1QZXJpb2QgXQorCVsgUmVkaXJlY3QtSG9zdCBdCisJWyBSZWRpcmVjdC1Ib3N0LVVzYWdlIF0KKwlbIFJlZGlyZWN0LU1heC1DYWNoZS1UaW1lIF0KKwkqIFsgUHJveHktSW5mbyBdCisJKiBbIFJvdXRlLVJlY29yZCBdCisJKiBbIEFWUCBdCisKKwkqLworICAgICAgc3RydWN0IGRpY3Rfb2JqZWN0ICogY21kOworICAgICAgc3RydWN0IGRpY3RfY21kX2RhdGEgZGF0YSA9IHsgCisJMjg2LCAJCQkJCS8qIENvZGUgKi8KKwkiTXVsdGltZWRpYS1BdXRoLUFuc3dlciIsIAkJLyogTmFtZSAqLworCUNNRF9GTEFHX1JFUVVFU1QgfCBDTURfRkxBR19QUk9YSUFCTEUgfCBDTURfRkxBR19FUlJPUiwgCS8qIEZpeGVkIGZsYWdzICovCisJQ01EX0ZMQUdfUFJPWElBQkxFIAkJCQkJCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisgICAgICB9OworICAgICAgc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9IAorCXsgCSB7ICAiU2Vzc2lvbi1JZCIsIAkJUlVMRV9GSVhFRF9IRUFELCAtMSwgMSB9CisJCSAseyAgIkF1dGgtQXBwbGljYXRpb24tSWQiLCAJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCSAseyAgIlJlc3VsdC1Db2RlIiwgCQlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJICx7ICAiQXV0aC1TZXNzaW9uLVN0YXRlIiwgCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkgLHsgICJPcmlnaW4tSG9zdCIsIAkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCSAseyAgIk9yaWdpbi1SZWFsbSIsIAkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCSAseyAgIlVzZXItTmFtZSIsIAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCSAseyAgIlNJUC1BT1IiLCAJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJICx7ICAiU0lQLU51bWJlci1BdXRoLUl0ZW1zIiwgCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkgLHsgICJTSVAtQXV0aC1EYXRhLUl0ZW0iLCAJUlVMRV9PUFRJT05BTCwgICAtMSwgLTEgfQorCQkgLHsgICJBdXRob3JpemF0aW9uLUxpZmV0aW1lIiwgCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkgLHsgICJBdXRoLUdyYWNlLVBlcmlvZCIsIAlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJICx7ICAiUmVkaXJlY3QtSG9zdCIsIAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCSAseyAgIlJlZGlyZWN0LUhvc3QtVXNhZ2UiLCAJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCSAseyAgIlJlZGlyZWN0LU1heC1DYWNoZS1UaW1lIiwgCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkgLHsgICJQcm94eS1JbmZvIiwgCQlSVUxFX09QVElPTkFMLCAgIC0xLCAtMSB9CisJCSAseyAgIlJvdXRlLVJlY29yZCIsIAkJUlVMRV9PUFRJT05BTCwgICAtMSwgLTEgfQorCisJfTsKKwkJCQorICAgICAgQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQ09NTUFORCwgJmRhdGEgLCBjeGR4X2RpY3QsICZjbWQpOworICAgICAgUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgY21kLCBBVlBfQllfTkFNRSApOworICAgIH0KKyAgICAvKiBTZXJ2ZXItQXNzaWdubWVudC1SZXF1ZXN0IChTQVIpIENvbW1hbmQgKi8KKyAgICB7CisgICAgICAvKgorCQkJCisJVGhlIFNlcnZlci1Bc3NpZ25tZW50LVJlcXVlc3QgKFNBUikgY29tbWFuZCBpcyBpbmRpY2F0ZWQgYnkgdGhlCisJQ29tbWFuZC1Db2RlIHNldCB0byAyODQgYW5kIHRoZSBDb21tYW5kIEZsYWdzJyAnUicgYml0IHNldC4gIFRoZQorCURpYW1ldGVyIGNsaWVudCBpbiBhIFNJUCBzZXJ2ZXIgc2VuZHMgdGhpcyBjb21tYW5kIHRvIHRoZSBEaWFtZXRlcgorCXNlcnZlciB0byBpbmRpY2F0ZSB0aGUgY29tcGxldGlvbiBvZiB0aGUgYXV0aGVudGljYXRpb24gcHJvY2VzcyBhbmQKKwl0byByZXF1ZXN0IHRoYXQgdGhlIERpYW1ldGVyIHNlcnZlciBzdG9yZSB0aGUgVVJJIG9mIHRoZSBTSVAgc2VydmVyCisJdGhhdCBpcyBjdXJyZW50bHkgc2VydmluZyB0aGUgdXNlci4gIFRoZSBtYWluIGZ1bmN0aW9ucyBvZiB0aGUKKwlEaWFtZXRlciBTQVIgY29tbWFuZCBhcmUgdG8gaW5mb3JtIHRoZSBEaWFtZXRlciBzZXJ2ZXIgb2YgdGhlIFVSSSBvZgorCXRoZSBTSVAgc2VydmVyIGFsbG9jYXRlZCB0byB0aGUgdXNlciwgYW5kIHRvIHN0b3JlIG9yIGNsZWFyIGl0IGZyb20KKwl0aGUgRGlhbWV0ZXIgc2VydmVyLiAgQWRkaXRpb25hbGx5LCB0aGUgRGlhbWV0ZXIgY2xpZW50IGNhbiByZXF1ZXN0CisJdG8gZG93bmxvYWQgdGhlIHVzZXIgcHJvZmlsZSBvciBwYXJ0IG9mIGl0LgorCisJRHVyaW5nIHRoZSByZWdpc3RyYXRpb24gcHJvY2VkdXJlLCBhIFNJUCBzZXJ2ZXIgYmVjb21lcyBhc3NpZ25lZCB0bworCXRoZSB1c2VyLiAgVGhlIERpYW1ldGVyIGNsaWVudCBpbiB0aGUgYXNzaWduZWQgU0lQIHNlcnZlciBNVVNUCisJaW5jbHVkZSBpdHMgb3duIFVSSSBpbiB0aGUgU0lQLVNlcnZlci1VUkkgQVZQIG9mIHRoZQorCVNlcnZlci1Bc3NpZ25tZW50LVJlcXVlc3QgKFNBUikgRGlhbWV0ZXIgbWVzc2FnZSBhbmQgc2VuZCBpdCB0byB0aGUKKwlEaWFtZXRlciBzZXJ2ZXIuICBUaGUgRGlhbWV0ZXIgc2VydmVyIHRoZW4gYmVjb21lcyBhd2FyZSBvZiB0aGUKKwlhbGxvY2F0aW9uIG9mIHRoZSBTSVAgc2VydmVyIHRvIHRoZSB1c2VyIG5hbWUgYW5kIHRoZSBzZXJ2ZXIncyBVUkkuCisKKwlUaGUgRGlhbWV0ZXIgY2xpZW50IGluIHRoZSBTSVAgc2VydmVyIE1BWSBzZW5kIGEgRGlhbWV0ZXIgU0FSIG1lc3NhZ2UKKwliZWNhdXNlIG9mIG90aGVyIHJlYXNvbnMuICBUaGVzZSByZWFzb25zIGFyZSBpZGVudGlmaWVkIGluIHRoZQorCVNJUC1TZXJ2ZXItQXNzaWdubWVudC1UeXBlIEFWUCAoU2VjdGlvbiA5LjQpIHZhbHVlLiAgRm9yIGluc3RhbmNlLCBhCisJRGlhbWV0ZXIgY2xpZW50IGluIGEgU0lQIHNlcnZlciBtYXkgY29udGFjdCB0aGUgRGlhbWV0ZXIgc2VydmVyIHRvCisJcmVxdWVzdCBkZXJlZ2lzdHJhdGlvbiBvZiBhIHVzZXIsIHRvIGluZm9ybSB0aGUgRGlhbWV0ZXIgc2VydmVyIG9mIGFuCisJYXV0aGVudGljYXRpb24gZmFpbHVyZSwgb3IganVzdCB0byBkb3dubG9hZCB0aGUgdXNlciBwcm9maWxlLiAgRm9yIGEKKwljb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiBhbGwgdGhlIFNJUC1TZXJ2ZXItQXNzaWdubWVudC1UeXBlIEFWUAorCXZhbHVlcywgc2VlIFNlY3Rpb24gOS40LgorCisJVHlwaWNhbGx5IHRoZSByZWNlcHRpb24gb2YgYSBTSVAgUkVHSVNURVIgcmVxdWVzdCBpbiBhIFNJUCBzZXJ2ZXIKKwl3aWxsIHRyaWdnZXIgdGhlIERpYW1ldGVyIGNsaWVudCBpbiB0aGUgU0lQIHNlcnZlciB0byBzZW5kIHRoZQorCURpYW1ldGVyIFNBUiBtZXNzYWdlLiAgSG93ZXZlciwgaWYgYSBTSVAgc2VydmVyIGlzIHJlY2VpdmluZyBvdGhlcgorCVNJUCByZXF1ZXN0LCBzdWNoIGFzIElOVklURSwgYW5kIHRoZSBTSVAgc2VydmVyIGRvZXMgbm90IGhhdmUgdGhlCisJdXNlciBwcm9maWxlLCB0aGUgRGlhbWV0ZXIgY2xpZW50IGluIHRoZSBTSVAgc2VydmVyIG1heSBzZW5kIHRoZQorCURpYW1ldGVyIFNBUiBtZXNzYWdlIHRvIHRoZSBEaWFtZXRlciBzZXJ2ZXIgaW4gb3JkZXIgdG8gZG93bmxvYWQgdGhlCisJdXNlciBwcm9maWxlIGFuZCBtYWtlIHRoZSBEaWFtZXRlciBzZXJ2ZXIgYXdhcmUgb2YgdGhlIFNJUCBzZXJ2ZXIKKwlhc3NpZ25lZCB0byB0aGUgdXNlci4KKwlUaGUgdXNlciBwcm9maWxlIGlzIGFuIGltcG9ydGFudCBwaWVjZSBvZiBpbmZvcm1hdGlvbiB0aGF0IGRpY3RhdGVzCisJdGhlIGJlaGF2aW9yIG9mIHRoZSBTSVAgc2VydmVyIHdoZW4gdHJpZ2dlcmluZyBvciBwcm92aWRpbmcgc2VydmljZXMKKwlmb3IgdGhlIHVzZXIuICBUeXBpY2FsbHkgdGhlIHVzZXIgcHJvZmlsZSBpcyBkaXZpZGVkIGludG86CisKKwlvICBTZXJ2aWNlcyB0byBiZSByZW5kZXJlZCB0byB0aGUgdXNlciB3aGVuIHRoZSB1c2VyIGlzIHJlZ2lzdGVyZWQKKwlhbmQgaW5pdGlhdGVzIGEgU0lQIHJlcXVlc3QuCisKKwlvICBTZXJ2aWNlcyB0byBiZSByZW5kZXJlZCB0byB0aGUgdXNlciB3aGVuIHRoZSB1c2VyIGlzIHJlZ2lzdGVyZWQKKwlhbmQgYSBTSVAgcmVxdWVzdCBkZXN0aW5lZCB0byB0aGF0IHVzZXIgYXJyaXZlcyB0byB0aGUgU0lQIHByb3h5LgorCisJbyAgU2VydmljZXMgdG8gYmUgcmVuZGVyZWQgdG8gdGhlIHVzZXIgd2hlbiB0aGUgdXNlciBpcyBub3QKKwlyZWdpc3RlcmVkIGFuZCBhIFNJUCByZXF1ZXN0IGRlc3RpbmVkIHRvIHRoYXQgdXNlciBhcnJpdmVzIHRvIHRoZQorCVNJUCBwcm94eS4KKworCVRoZSBTSVAtU2VydmVyLUFzc2lnbm1lbnQtVHlwZSBBVlAgaW5kaWNhdGVzIHRoZSByZWFzb24gd2h5IHRoZQorCURpYW1ldGVyIGNsaWVudCAoU0lQIHNlcnZlcikgY29udGFjdGVkIHRoZSBEaWFtZXRlciBzZXJ2ZXIuICBJZiB0aGUKKwlEaWFtZXRlciBjbGllbnQgc2V0cyB0aGUgU0lQLVNlcnZlci1Bc3NpZ25tZW50LVR5cGUgQVZQIHZhbHVlIHRvCisJUkVHSVNUUkFUSU9OLCBSRV9SRUdJU1RSQVRJT04sIFVOUkVHSVNURVJFRF9VU0VSLCBOT19BU1NJR05NRU5ULAorCUFVVEhFTlRJQ0FUSU9OX0ZBSUxVUkUgb3IgQVVUSEVOVElDQVRJT05fVElNRU9VVCwgdGhlIERpYW1ldGVyIGNsaWVudAorCU1VU1QgaW5jbHVkZSBleGFjdGx5IG9uZSBTSVAtQU9SIEFWUCBpbiB0aGUgRGlhbWV0ZXIgU0FSIG1lc3NhZ2UuCisKKwlUaGUgU0FSIG1lc3NhZ2UgTUFZIGNvbnRhaW4gemVybyBvciBtb3JlIFNJUC1TdXBwb3J0ZWQtVXNlci1EYXRhLVR5cGUKKwlBVlBzLiAgRWFjaCBvZiB0aGVtIGNvbnRhaW5zIGEgdHlwZSBvZiB1c2VyIGRhdGEgdW5kZXJzdG9vZCBieSB0aGUKKwlTSVAgc2VydmVyLiAgVGhpcyBhbGxvd3MgdGhlIERpYW1ldGVyIGNsaWVudCB0byBwcm92aWRlIGFuIGluZGljYXRpb24KKwl0byB0aGUgRGlhbWV0ZXIgc2VydmVyIG9mIHRoZSBkaWZmZXJlbnQgZm9ybWF0IG9mIHVzZXIgZGF0YQorCXVuZGVyc3Rvb2QgYnkgdGhlIFNJUCBzZXJ2ZXIuICBUaGUgRGlhbWV0ZXIgc2VydmVyIHVzZXMgdGhpcworCWluZm9ybWF0aW9uIHRvIHNlbGVjdCBvbmUgb3IgbW9yZSBTSVAtVXNlci1EYXRhIEFWUHMgdGhhdCB3aWxsIGJlCisJaW5jbHVkZWQgaW4gdGhlIFNBQSBtZXNzYWdlLgorCisJVGhlIE1lc3NhZ2UgRm9ybWF0IG9mIHRoZSBTQVIgY29tbWFuZCBpcyBhcyBmb2xsb3dzOgorCisJPFNBUj4gOjo9IDwgRGlhbWV0ZXIgSGVhZGVyOiAyODQsIFJFUSwgUFhZID4KKwk8IFNlc3Npb24tSWQgPgorCXsgQXV0aC1BcHBsaWNhdGlvbi1JZCB9CisJeyBBdXRoLVNlc3Npb24tU3RhdGUgfQorCXsgT3JpZ2luLUhvc3QgfQorCXsgT3JpZ2luLVJlYWxtIH0KKwl7IERlc3RpbmF0aW9uLVJlYWxtIH0KKwl7IFNJUC1TZXJ2ZXItQXNzaWdubWVudC1UeXBlIH0KKwl7IFNJUC1Vc2VyLURhdGEtQWxyZWFkeS1BdmFpbGFibGUgfQorCVsgRGVzdGluYXRpb24tSG9zdCBdCisJWyBVc2VyLU5hbWUgXQorCVsgU0lQLVNlcnZlci1VUkkgXQorCSogWyBTSVAtU3VwcG9ydGVkLVVzZXItRGF0YS1UeXBlIF0KKwkqIFsgU0lQLUFPUiBdCisJKiBbIFByb3h5LUluZm8gXQorCSogWyBSb3V0ZS1SZWNvcmQgXQorCSogWyBBVlAgXQorCSovCisgICAgICBzdHJ1Y3QgZGljdF9vYmplY3QgKiBjbWQ7CisgICAgICBzdHJ1Y3QgZGljdF9jbWRfZGF0YSBkYXRhID0geyAKKwkyODQsIAkJCQkJLyogQ29kZSAqLworCSJTZXJ2ZXItQXNzaWdubWVudC1SZXF1ZXN0IiwgCQkvKiBOYW1lICovCisJQ01EX0ZMQUdfUkVRVUVTVCB8IENNRF9GTEFHX1BST1hJQUJMRSB8IENNRF9GTEFHX0VSUk9SLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwlDTURfRkxBR19SRVFVRVNUIHwgQ01EX0ZMQUdfUFJPWElBQkxFIAkJCQkJCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisgICAgICB9OworICAgICAgc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9IAorCXsgCSB7ICAiU2Vzc2lvbi1JZCIsIAkJCVJVTEVfRklYRURfSEVBRCwgLTEsIDEgfQorCQkgLHsgICJBdXRoLUFwcGxpY2F0aW9uLUlkIiwgCQlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJICx7ICAiQXV0aC1TZXNzaW9uLVN0YXRlIiwgCQlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJICx7ICAiT3JpZ2luLUhvc3QiLCAJCQlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJICx7ICAiT3JpZ2luLVJlYWxtIiwgCQkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCSAseyAgIkRlc3RpbmF0aW9uLVJlYWxtIiwJCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkgLHsgICJTSVAtU2VydmVyLUFzc2lnbm1lbnQtVHlwZSIsIAlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJICx7ICAiU0lQLVVzZXItRGF0YS1BbHJlYWR5LUF2YWlsYWJsZSIsIAlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJICx7ICAiRGVzdGluYXRpb24tSG9zdCIsIAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCSAseyAgIlVzZXItTmFtZSIsIAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkgLHsgICJTSVAtU2VydmVyLVVSSSIsIAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkgLHsgICJTSVAtU3VwcG9ydGVkLVVzZXItRGF0YS1UeXBlIiwgCVJVTEVfT1BUSU9OQUwsICAgLTEsIC0xIH0KKwkJICx7ICAiU0lQLUFPUiIsIAkJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAtMSB9CisJCSAseyAgIlByb3h5LUluZm8iLCAJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAtMSB9CisJCSAseyAgIlJvdXRlLVJlY29yZCIsIAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIC0xIH0KKworCX07CisJCQkKKyAgICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX0NPTU1BTkQsICZkYXRhICwgY3hkeF9kaWN0LCAmY21kKTsKKyAgICAgIFBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGNtZCwgQVZQX0JZX05BTUUgKTsKKyAgICB9CisgICAgLyogU2VydmVyLUFzc2lnbm1lbnQtQW5zd2VyIChTQUEpIENvbW1hbmQgKi8KKyAgICB7CisgICAgICAvKgorCQkJCisJVGhlIFNlcnZlci1Bc3NpZ25tZW50LUFuc3dlciAoU0FBKSBpcyBpbmRpY2F0ZWQgYnkgdGhlIENvbW1hbmQtQ29kZQorCXNldCB0byAyODQgYW5kIHRoZSBDb21tYW5kIEZsYWdzJyAnUicgYml0IGNsZWFyZWQuICBUaGUgRGlhbWV0ZXIKKwlzZXJ2ZXIgc2VuZHMgdGhpcyBjb21tYW5kIGluIHJlc3BvbnNlIHRvIGEgcHJldmlvdXNseSByZWNlaXZlZAorCURpYW1ldGVyIFNlcnZlci1Bc3NpZ25tZW50LVJlcXVlc3QgKFNBUikgY29tbWFuZC4gIFRoZSByZXNwb25zZSBtYXkKKwlpbmNsdWRlIHRoZSB1c2VyIHByb2ZpbGUgb3IgcGFydCBvZiBpdCwgaWYgcmVxdWVzdGVkLgorCisJSW4gYWRkaXRpb24gdG8gdGhlIHZhbHVlcyBhbHJlYWR5IGRlZmluZWQgaW4gUkZDIDM1ODggW1JGQzM1ODhdLCB0aGUKKwlSZXN1bHQtQ29kZSBBVlAgbWF5IGNvbnRhaW4gb25lIG9mIHRoZSB2YWx1ZXMgZGVmaW5lZCBpbgorCVNlY3Rpb24gMTAuMS4KKworCVRoZSBSZXN1bHQtQ29kZSBBVlAgdmFsdWUgaW4gdGhlIERpYW1ldGVyIFNBQSBtZXNzYWdlIG1heSBpbmRpY2F0ZSBhCisJc3VjY2VzcyBvciBhbiBlcnJvciBpbiB0aGUgZXhlY3V0aW9uIG9mIHRoZSBEaWFtZXRlciBTQVIgY29tbWFuZC4gIElmCisJUmVzdWx0LUNvZGUgQVZQIHZhbHVlIGluIHRoZSBEaWFtZXRlciBTQUEgbWVzc2FnZSBkb2VzIG5vdCBjb250YWluIGFuCisJZXJyb3IgY29kZSwgdGhlIFNBQSBtZXNzYWdlIE1BWSBpbmNsdWRlIG9uZSBvciBtb3JlIFNJUC1Vc2VyLURhdGEKKwlBVlBzIHRoYXQgdHlwaWNhbGx5IGNvbnRhaW4gdGhlIHByb2ZpbGUgb2YgdGhlIHVzZXIsIGluZGljYXRpbmcKKwlzZXJ2aWNlcyB0aGF0IHRoZSBTSVAgc2VydmVyIGNhbiBwcm92aWRlIHRvIHRoYXQgdXNlci4KKworCVRoZSBEaWFtZXRlciBzZXJ2ZXIgTUFZIGluY2x1ZGUgb25lIG9yIG1vcmUKKwlTSVAtU3VwcG9ydGVkLVVzZXItRGF0YS1UeXBlIEFWUHMsIGVhY2ggb25lIGlkZW50aWZ5aW5nIGEgdHlwZSBvZgorCXVzZXIgZGF0YSBmb3JtYXQgc3VwcG9ydGVkIGluIHRoZSBEaWFtZXRlciBzZXJ2ZXIuICBJZiB0aGVyZSBpcyBub3QgYQorCWNvbW1vbiBzdXBwb3J0ZWQgdXNlciBkYXRhIHR5cGUgYmV0d2VlbiB0aGUgRGlhbWV0ZXIgY2xpZW50IGFuZCB0aGUKKwlEaWFtZXRlciBzZXJ2ZXIsIHRoZSBEaWFtZXRlciBzZXJ2ZXIgU0hPVUxEIGRlY2xhcmUgaXRzIGxpc3Qgb2YKKwlzdXBwb3J0ZWQgdXNlciBkYXRhIHR5cGVzIGJ5IGluY2x1ZGluZyBvbmUgb3IgbW9yZQorCVNJUC1TdXBwb3J0ZWQtVXNlci1EYXRhLVR5cGUgQVZQcyBpbiBhIERpYW1ldGVyIFNBQSBtZXNzYWdlLiAgVGhpcworCWluZGljYXRpb24gaXMgbWVyZWx5IGZvciBkZWJ1Z2dpbmcgcmVhc29ucywgc2luY2UgdGhlcmUgaXMgbm90IGEKKwlmYWxsYmFjayBtZWNoYW5pc20gdGhhdCBhbGxvd3MgdGhlIERpYW1ldGVyIGNsaWVudCB0byByZXRyaWV2ZSB0aGUKKwlwcm9maWxlIGluIGEgc3VwcG9ydGVkIGZvcm1hdC4KKworCUlmIHRoZSBEaWFtZXRlciBzZXJ2ZXIgcmVxdWlyZXMgYSBVc2VyLU5hbWUgQVZQIHZhbHVlIHRvIHByb2Nlc3MgdGhlCisJRGlhbWV0ZXIgU0FSIHJlcXVlc3QsIGJ1dCB0aGUgRGlhbWV0ZXIgU0FSIG1lc3NhZ2UgZGlkIG5vdCBjb250YWluIGEKKwlVc2VyLU5hbWUgQVZQIHZhbHVlLCB0aGUgRGlhbWV0ZXIgc2VydmVyIE1VU1Qgc2V0IHRoZSBSZXN1bHQtQ29kZSBBVlAKKwl2YWx1ZSB0byBESUFNRVRFUl9VU0VSX05BTUVfUkVRVUlSRUQgKHNlZSBTZWN0aW9uIDEwLjEuMikgYW5kIHJldHVybgorCWl0IGluIGEgRGlhbWV0ZXIgU0FBIG1lc3NhZ2UuICBVcG9uIHJlY2VwdGlvbiBvZiB0aGlzIERpYW1ldGVyIFNBQQorCW1lc3NhZ2Ugd2l0aCB0aGUgUmVzdWx0LUNvZGUgQVZQIHZhbHVlIHNldCB0bworCURJQU1FVEVSX1VTRVJfTkFNRV9SRVFVSVJFRCwgdGhlIFNJUCBzZXJ2ZXIgdHlwaWNhbGx5IHJlcXVlc3RzCisJYXV0aGVudGljYXRpb24gYnkgZ2VuZXJhdGluZyBhIFNJUCA0MDEgKFVuYXV0aG9yaXplZCkgb3IgU0lQIDQwNworCShQcm94eSBBdXRoZW50aWNhdGlvbiBSZXF1aXJlZCkgcmVzcG9uc2UgYmFjayB0byB0aGUgb3JpZ2luYXRvci4KKworCUlmIHRoZSBVc2VyLU5hbWUgQVZQIGlzIGluY2x1ZGVkIGluIHRoZSBEaWFtZXRlciBTQVIgbWVzc2FnZSwgdXBvbgorCXJlY2VwdGlvbiBvZiB0aGUgRGlhbWV0ZXIgU0FSIG1lc3NhZ2UsIHRoZSBEaWFtZXRlciBzZXJ2ZXIgTVVTVAorCXZlcmlmeSB0aGUgZXhpc3RlbmNlIG9mIHRoZSB1c2VyIGluIHRoZSByZWFsbSwgaS5lLiwgdGhlIFVzZXItTmFtZQorCUFWUCB2YWx1ZSBpcyBhIHZhbGlkIHVzZXIgd2l0aGluIHRoYXQgcmVhbG0uICBJZiB0aGUgRGlhbWV0ZXIgc2VydmVyCisJZG9lcyBub3QgcmVjb2duaXplIHRoZSB1c2VyIG5hbWUgcmVjZWl2ZWQgaW4gdGhlIFVzZXItTmFtZSBBVlAsIHRoZQorCURpYW1ldGVyIHNlcnZlciBNVVNUIGJ1aWxkIGEgRGlhbWV0ZXIgU2VydmVyLUFzc2lnbm1lbnQtQW5zd2VyIChTQUEpCisJbWVzc2FnZSBhbmQgTVVTVCBzZXQgdGhlIFJlc3VsdC1Db2RlIEFWUCB0bworCURJQU1FVEVSX0VSUk9SX1VTRVJfVU5LTk9XTi4KKwlUaGVuIHRoZSBEaWFtZXRlciBzZXJ2ZXIgTVVTVCBhdXRob3JpemUgdGhhdCBVc2VyLU5hbWUgQVZQIHZhbHVlIGlzIGEKKwl2YWxpZCBhdXRoZW50aWNhdGlvbiBuYW1lIGZvciB0aGUgU0lQIG9yIFNJUFMgVVJJIGluY2x1ZGVkIGluIHRoZQorCVNJUC1BT1IgQVZQIG9mIHRoZSBEaWFtZXRlciBTQVIgbWVzc2FnZS4gIElmIHRoaXMgYXV0aG9yaXphdGlvbgorCWZhaWxzLCB0aGUgRGlhbWV0ZXIgc2VydmVyIG11c3Qgc2V0IHRoZSBSZXN1bHQtQ29kZSBBVlAgdG8KKwlESUFNRVRFUl9FUlJPUl9JREVOVElUSUVTX0RPTlRfTUFUQ0ggYW5kIHNlbmQgaXQgaW4gYSBEaWFtZXRlcgorCVNlcnZlci1Bc3NpZ25tZW50LUFuc3dlciAoU0FBKSBtZXNzYWdlLgorCisJQWZ0ZXIgc3VjY2Vzc2Z1bCBleGVjdXRpb24gb2YgdGhlIERpYW1ldGVyIFNBUiBjb21tYW5kLCB0aGUgRGlhbWV0ZXIKKwlzZXJ2ZXIgTVVTVCBjbGVhciB0aGUgImF1dGhlbnRpY2F0aW9uIHBlbmRpbmciIGZsYWcgYW5kIFNIT1VMRCBtb3ZlCisJdGhlIHRlbXBvcmFyaWx5IHN0b3JlZCBTSVAgc2VydmVyIFVSSSB0byBwZXJtYW5lbnQgc3RvcmFnZS4KKworCVRoZSBhY3Rpb25zIG9mIHRoZSBEaWFtZXRlciBzZXJ2ZXIgdXBvbiByZWNlcHRpb24gb2YgdGhlIERpYW1ldGVyIFNBUgorCW1lc3NhZ2UgZGVwZW5kIG9uIHRoZSB2YWx1ZSBvZiB0aGUgU0lQLVNlcnZlci1Bc3NpZ25tZW50LVR5cGU6CisKKwlvICBJZiB0aGUgU0lQLVNlcnZlci1Bc3NpZ25tZW50LVR5cGUgQVZQIHZhbHVlIGluIHRoZSBEaWFtZXRlciBTQVIKKwltZXNzYWdlIGlzIHNldCB0byBSRUdJU1RSQVRJT04gb3IgUkVfUkVHSVNUUkFUSU9OLCB0aGUgRGlhbWV0ZXIKKwlzZXJ2ZXIgU0hPVUxEIHZlcmlmeSB0aGF0IHRoZXJlIGlzIG9ubHkgb25lIFNJUC1BT1IgQVZQLgorCU90aGVyd2lzZSwgdGhlIERpYW1ldGVyIHNlcnZlciBNVVNUIGFuc3dlciB3aXRoIGEgRGlhbWV0ZXIgU0FBCisJbWVzc2FnZSB3aXRoIHRoZSBSZXN1bHQtQ29kZSBBVlAgdmFsdWUgc2V0IHRvCisJRElBTUVURVJfQVZQX09DQ1VSU19UT09fTUFOWV9USU1FUyBhbmQgTVVTVCBOT1QgaW5jbHVkZSBhbnkKKwlTSVAtVXNlci1EYXRhIEFWUC4gIElmIHRoZXJlIGlzIG9ubHkgb25lIFNJUC1BT1IgQVZQIGFuZCBpZiB0aGUKKwlTSVAtVXNlci1EYXRhLUFscmVhZHktQXZhaWxhYmxlIEFWUCB2YWx1ZSBpcyBzZXQgdG8KKwlVU0VSX0RBVEFfTk9UX0FWQUlMQUJMRSwgdGhlbiB0aGUgRGlhbWV0ZXIgc2VydmVyIFNIT1VMRCBpbmNsdWRlCisJb25lIG9yIG1vcmUgdXNlciBwcm9maWxlIGRhdGEgd2l0aCB0aGUgU0lQIG9yIFNJUFMgVVJJIChTSVAtQU9SCisJQVZQKSBhbmQgYWxsIG90aGVyIFNJUCBpZGVudGl0aWVzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEFWUCBpbiB0aGUKKwlTSVAtVXNlci1EYXRhIEFWUCB2YWx1ZSBvZiB0aGUgRGlhbWV0ZXIgU0FBIG1lc3NhZ2UuICBPbiBzZWxlY3RpbmcKKwl0aGUgdHlwZSBvZiB1c2VyIGRhdGEsIHRoZSBEaWFtZXRlciBzZXJ2ZXIgU0hPVUxEIHRha2UgaW50bworCWFjY291bnQgdGhlIHN1cHBvcnRlZCBmb3JtYXRzIGF0IHRoZSBTSVAgc2VydmVyCisJKFNJUC1TdXBwb3J0ZWQtVXNlci1EYXRhLVR5cGUgQVZQIGluIHRoZSBTQVIgbWVzc2FnZSkgYW5kIHRoZQorCWxvY2FsIHBvbGljeS4gIEFkZGl0aW9uYWxseSwgdGhlIERpYW1ldGVyIHNlcnZlciBNVVNUIHNldCB0aGUKKwlSZXN1bHQtQ29kZSBBVlAgdmFsdWUgdG8gRElBTUVURVJfU1VDQ0VTUyBpbiB0aGUgRGlhbWV0ZXIgU0FBCisJbWVzc2FnZS4gIFRoZSBEaWFtZXRlciBzZXJ2ZXIgY29uc2lkZXJzIHRoZSBTSVAgQU9SIGF1dGhlbnRpY2F0ZWQKKwlhbmQgcmVnaXN0ZXJlZC4KKworCW8gIElmIHRoZSBTSVAtU2VydmVyLUFzc2lnbm1lbnQtVHlwZSBBVlAgdmFsdWUgaW4gdGhlIERpYW1ldGVyIFNBUgorCW1lc3NhZ2UgaXMgc2V0IHRvIFVOUkVHSVNURVJFRF9VU0VSLCB0aGVuIHRoZSBEaWFtZXRlciBzZXJ2ZXIgTVVTVAorCXN0b3JlIHRoZSBTSVAgc2VydmVyIGFkZHJlc3MgaW5jbHVkZWQgaW4gdGhlIFNJUC1TZXJ2ZXItVVJJIEFWUAorCXZhbHVlLiAgVGhlIERpYW1ldGVyIHNlcnZlciB3aWxsIHJldHVybiB0aGUgU0lQIHNlcnZlciBhZGRyZXNzIGluCisJRGlhbWV0ZXIgTG9jYXRpb24tSW5mby1BbnN3ZXIgKExJQSkgbWVzc2FnZXMuICBJZiB0aGUKKwlTSVAtVXNlci1EYXRhLUFscmVhZHktQXZhaWxhYmxlIEFWUCB2YWx1ZSBpcyBzZXQgdG8KKwlVU0VSX0RBVEFfTk9UX0FWQUlMQUJMRSwgdGhlbiB0aGUgRGlhbWV0ZXIgc2VydmVyIFNIT1VMRCBpbmNsdWRlCisJb25lIG9yIG1vcmUgdXNlciBwcm9maWxlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBTSVAgb3IgU0lQUyBVUkkKKwkoU0lQLUFPUiBBVlApIGFuZCBhc3NvY2lhdGVkIGlkZW50aXRpZXMgaW4gdGhlIFNJUC1Vc2VyLURhdGEgQVZQCisJdmFsdWUgb2YgdGhlIERpYW1ldGVyIFNBQSBtZXNzYWdlLiAgT24gc2VsZWN0aW5nIHRoZSB0eXBlIG9mIHVzZXIKKwlkYXRhLCB0aGUgRGlhbWV0ZXIgc2VydmVyIFNIT1VMRCB0YWtlIGludG8gYWNjb3VudCB0aGUgc3VwcG9ydGVkCisJZm9ybWF0cyBhdCB0aGUgU0lQIHNlcnZlciAoU0lQLVN1cHBvcnRlZC1Vc2VyLURhdGEtVHlwZSBBVlAgaW4gdGhlCisJU0FSIG1lc3NhZ2UpIGFuZCB0aGUgbG9jYWwgcG9saWN5LiAgVGhlIERpYW1ldGVyIHNlcnZlciBNVVNUIHNldAorCXRoZSBSZXN1bHQtQ29kZSBBVlAgdmFsdWUgdG8gRElBTUVURVJfU1VDQ0VTUy4gIFRoZSBEaWFtZXRlcgorCXNlcnZlciBjb25zaWRlcnMgdGhlIFNJUCBBT1IgVU5SRUdJU1RFUkVELCBidXQgd2l0aCBhIFNJUCBzZXJ2ZXIKKwlhbGxvY2F0ZWQgdG8gdHJpZ2dlciBhbmQgcHJvdmlkZSBzZXJ2aWNlcyBmb3IgdW5yZWdpc3RlcmVkIHVzZXJzLgorCU5vdGUgdGhhdCBpbiBjYXNlIG9mIFVOUkVHSVNURVJFRF9VU0VSIChTSVAtU2VydmVyLUFzc2lnbm1lbnQtVHlwZQorCUFWUCksIHRoZSBEaWFtZXRlciBzZXJ2ZXIgTVVTVCB2ZXJpZnkgdGhhdCB0aGVyZSBpcyBvbmx5IG9uZQorCVNJUC1BT1IgQVZQLiAgT3RoZXJ3aXNlLCB0aGUgRGlhbWV0ZXIgc2VydmVyIE1VU1QgYW5zd2VyIHRoZQorCURpYW1ldGVyIFNBUiBtZXNzYWdlIHdpdGggYSBEaWFtZXRlciBTQUEgbWVzc2FnZSwgYW5kIGl0IE1VU1Qgc2V0CisJdGhlIFJlc3VsdC1Db2RlIEFWUCB2YWx1ZSB0byBESUFNRVRFUl9BVlBfT0NDVVJTX1RPT19NQU5ZX1RJTUVTCisJYW5kIE1VU1QgTk9UIGluY2x1ZGUgYW55IFNJUC1Vc2VyLURhdGEgQVZQLgorCUlmIHRoZSBVc2VyLU5hbWUgQVZQIHdhcyBub3QgcHJlc2VudCBpbiB0aGUgRGlhbWV0ZXIgU0FSIG1lc3NhZ2UKKwlhbmQgdGhlIFNJUC1BT1IgaXMgbm90IGtub3duIGZvciB0aGUgRGlhbWV0ZXIgc2VydmVyLCB0aGUgRGlhbWV0ZXIKKwlzZXJ2ZXIgTVVTVCBOT1QgaW5jbHVkZSBhIFVzZXItTmFtZSBBVlAgaW4gdGhlIERpYW1ldGVyIFNBQQorCW1lc3NhZ2UgYW5kIE1VU1Qgc2V0IHRoZSBSZXN1bHQtQ29kZSBBVlAgdmFsdWUgdG8KKwlESUFNRVRFUl9FUlJPUl9VU0VSX1VOS05PV04uCisKKwlvICBJZiB0aGUgU0lQLVNlcnZlci1Bc3NpZ25tZW50LVR5cGUgQVZQIHZhbHVlIGluIHRoZSBEaWFtZXRlciBTQVIKKwltZXNzYWdlIGlzIHNldCB0byBUSU1FT1VUX0RFUkVHSVNUUkFUSU9OLCBVU0VSX0RFUkVHSVNUUkFUSU9OLAorCURFUkVHSVNUUkFUSU9OX1RPT19NVUNIX0RBVEEsIG9yIEFETUlOSVNUUkFUSVZFX0RFUkVHSVNUUkFUSU9OLAorCXRoZSBEaWFtZXRlciBzZXJ2ZXIgTVVTVCBjbGVhciB0aGUgU0lQIHNlcnZlciBhZGRyZXNzIGFzc29jaWF0ZWQKKwl3aXRoIGFsbCBTSVAgQU9ScyBpbmRpY2F0ZWQgaW4gZWFjaCBvZiB0aGUgU0lQLUFPUiBBVlAgdmFsdWVzCisJaW5jbHVkZWQgaW4gdGhlIERpYW1ldGVyIFNBUiBtZXNzYWdlLiAgVGhlIERpYW1ldGVyIHNlcnZlcgorCWNvbnNpZGVycyBhbGwgb2YgdGhlc2UgU0lQIEFPUnMgYXMgbm90IHJlZ2lzdGVyZWQuICBUaGUgRGlhbWV0ZXIKKwlzZXJ2ZXIgTVVTVCBzZXQgdGhlIFJlc3VsdC1Db2RlIEFWUCB2YWx1ZSB0byBESUFNRVRFUl9TVUNDRVNTIGluCisJdGhlIERpYW1ldGVyIFNBQSBtZXNzYWdlLgorCisJbyAgSWYgdGhlIFNJUC1TZXJ2ZXItQXNzaWdubWVudC1UeXBlIEFWUCB2YWx1ZSBpbiB0aGUgRGlhbWV0ZXIgU0FSCisJbWVzc2FnZSBpcyBzZXQgdG8gVElNRU9VVF9ERVJFR0lTVFJBVElPTl9TVE9SRV9TRVJWRVJfTkFNRSBvcgorCVVTRVJfREVSRUdJU1RSQVRJT05fU1RPUkVfU0VSVkVSX05BTUUsIHRoZSBEaWFtZXRlciBzZXJ2ZXIgTUFZCisJa2VlcCB0aGUgU0lQIHNlcnZlciBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCB0aGUgU0lQIEFPUnMgaW5jbHVkZWQKKwlpbiB0aGUgU0lQLUFPUiBBVlAgdmFsdWVzIG9mIHRoZSBEaWFtZXRlciBTQVIgbWVzc2FnZSwgZXZlbiB0aG91Z2gKKwl0aGUgU0lQIEFPUnMgYmVjb21lIHVucmVnaXN0ZXJlZC4gIFRoaXMgZmVhdHVyZSBhbGxvd3MgYSBTSVAKKwlzZXJ2ZXIgdG8gcmVxdWVzdCB0aGF0IHRoZSBEaWFtZXRlciBzZXJ2ZXIgcmVtYWluIGFuIGFzc2lnbmVkIFNJUAorCXNlcnZlciBmb3IgdGhvc2UgU0lQIEFPUnMgKFNJUC1BT1IgQVZQIHZhbHVlcykgYWxsb2NhdGVkIHRvIHRoZQorCXNhbWUgdXNlciBuYW1lLCBhbmQgYXZvaWQgU0lQIHNlcnZlciBhc3NpZ25tZW50LiAgVGhlIERpYW1ldGVyCisJc2VydmVyIE1VU1QgY29uc2lkZXIgYWxsIHRoZXNlIFNJUCBBT1JzIGFzIG5vdCByZWdpc3RlcmVkLiAgSWYgdGhlCisJRGlhbWV0ZXIgc2VydmVyIGhvbm9ycyB0aGUgcmVxdWVzdCBvZiB0aGUgRGlhbWV0ZXIgY2xpZW50IChTSVAKKwlzZXJ2ZXIpIHRvIHJlbWFpbiBhcyBhbiBhbGxvY2F0ZWQgU0lQIHNlcnZlciwgdGhlbiB0aGUgRGlhbWV0ZXIKKwlzZXJ2ZXIgTVVTVCBrZWVwIHRoZSBTSVAgc2VydmVyIGFzc2lnbmVkIHRvIHRob3NlIFNJUCBBT1JzCisJYWxsb2NhdGVkIHRvIHRoZSB1c2VybmFtZSBhbmQgTVVTVCBzZXQgdGhlIFJlc3VsdC1Db2RlIEFWUCB2YWx1ZQorCXRvIERJQU1FVEVSX1NVQ0NFU1MgaW4gdGhlIERpYW1ldGVyIFNBQSBtZXNzYWdlLiAgT3RoZXJ3aXNlLCB3aGVuCisJdGhlIERpYW1ldGVyIHNlcnZlciBkb2VzIG5vdCBob25vciB0aGUgcmVxdWVzdCBvZiB0aGUgRGlhbWV0ZXIKKwljbGllbnQgKFNJUCBzZXJ2ZXIpIHRvIHJlbWFpbiBhcyBhbiBhbGxvY2F0ZWQgU0lQIHNlcnZlciwgdGhlCisJRGlhbWV0ZXIgc2VydmVyIE1VU1QgY2xlYXIgdGhlIFNJUCBzZXJ2ZXIgbmFtZSBhc3NpZ25lZCB0byB0aG9zZQorCVNJUCBBT1JzIGFuZCBpdCBNVVNUIHNldCB0aGUgUmVzdWx0LUNvZGUgQVZQIHZhbHVlIHRvCisJRElBTUVURVJfU1VDQ0VTU19TRVJWRVJfTkFNRV9OT1RfU1RPUkVEIGluIHRoZSBEaWFtZXRlciBTQUEKKwltZXNzYWdlLgorCW8gIElmIHRoZSBTSVAtU2VydmVyLUFzc2lnbm1lbnQtVHlwZSBBVlAgdmFsdWUgaW4gdGhlIERpYW1ldGVyIFNBUgorCW1lc3NhZ2UgaXMgc2V0IHRvIE5PX0FTU0lHTk1FTlQsIHRoZSBEaWFtZXRlciBzZXJ2ZXIgU0hPVUxEIGZpcnN0CisJdmVyaWZ5IHRoYXQgdGhlIFNJUC1TZXJ2ZXItVVJJIEFWUCB2YWx1ZSBpbiB0aGUgRGlhbWV0ZXIgU0FSCisJbWVzc2FnZSBpcyB0aGUgc2FtZSBVUkkgYXMgdGhlIG9uZSBhc3NpZ25lZCB0byB0aGUgU0lQLUFPUiBBVlAKKwl2YWx1ZS4gIElmIHRoZXkgZGlmZmVyLCB0aGVuIHRoZSBEaWFtZXRlciBzZXJ2ZXIgTVVTVCBzZXQgdGhlCisJUmVzdWx0LUNvZGUgQVZQIHZhbHVlIHRvIERJQU1FVEVSX1VOQUJMRV9UT19DT01QTFkgaW4gdGhlIERpYW1ldGVyCisJU0FBIG1lc3NhZ2UuICBPdGhlcndpc2UsIGlmIHRoZSBTSVAtVXNlci1EYXRhLUFscmVhZHktQXZhaWxhYmxlCisJQVZQIHZhbHVlIGlzIHNldCB0byBVU0VSX0RBVEFfTk9UX0FWQUlMQUJMRSwgdGhlbiB0aGUgRGlhbWV0ZXIKKwlzZXJ2ZXIgU0hPVUxEIGluY2x1ZGUgdGhlIHVzZXIgcHJvZmlsZSBkYXRhIHdpdGggdGhlIFNJUCBvciBTSVBTCisJVVJJIChTSVAtQU9SIEFWUCkgYW5kIGFsbCBvdGhlciBTSVAgaWRlbnRpdGllcyBhc3NvY2lhdGVkIHdpdGgKKwl0aGF0IEFWUCBpbiB0aGUgU0lQLVVzZXItRGF0YSBBVlAgdmFsdWUgb2YgdGhlIERpYW1ldGVyIFNBQQorCW1lc3NhZ2UuICBPbiBzZWxlY3RpbmcgdGhlIHR5cGUgb2YgdXNlciBkYXRhLCB0aGUgRGlhbWV0ZXIgc2VydmVyCisJU0hPVUxEIHRha2UgaW50byBhY2NvdW50IHRoZSBzdXBwb3J0ZWQgZm9ybWF0cyBhdCB0aGUgU0lQIHNlcnZlcgorCShTSVAtU3VwcG9ydGVkLVVzZXItRGF0YS1UeXBlIEFWUCBpbiB0aGUgU0FSIG1lc3NhZ2UpIGFuZCB0aGUKKwlsb2NhbCBwb2xpY3kuCisKKwlvICBJZiB0aGUgU0lQLVNlcnZlci1Bc3NpZ25tZW50LVR5cGUgQVZQIHZhbHVlIGluIHRoZSBEaWFtZXRlciBTQVIKKwltZXNzYWdlIGlzIHNldCB0byBBVVRIRU5USUNBVElPTl9GQUlMVVJFIG9yCisJQVVUSEVOVElDQVRJT05fVElNRU9VVCwgdGhlIERpYW1ldGVyIHNlcnZlciBNVVNUIHZlcmlmeSB0aGF0IHRoZXJlCisJaXMgZXhhY3RseSBvbmUgU0lQLUFPUiBBVlAgaW4gdGhlIERpYW1ldGVyIFNBUiBtZXNzYWdlLiAgSWYgdGhlCisJbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9mIHRoZSBTSVAtQU9SIEFWUCBpcyBub3QgZXhhY3RseSBvbmUsIHRoZQorCURpYW1ldGVyIHNlcnZlciBNVVNUIHNldCB0aGUgUmVzdWx0LUNvZGUgQVZQIHZhbHVlIHRvCisJRElBTUVURVJfQVZQX09DQ1VSU19UT09fTUFOWV9USU1FUyBpbiB0aGUgRGlhbWV0ZXIgU0FBIG1lc3NhZ2UsCisJYW5kIFNIT1VMRCBub3QgdGFrZSBmdXJ0aGVyIGFjdGlvbnMuICBJZiB0aGVyZSBpcyBleGFjdGx5IG9uZQorCVNJUC1BT1IgQVZQIGluIHRoZSBEaWFtZXRlciBTQVIgbWVzc2FnZSwgdGhlIERpYW1ldGVyIHNlcnZlciBNVVNUCisJY2xlYXIgdGhlIGFkZHJlc3Mgb2YgdGhlIFNJUCBzZXJ2ZXIgYXNzaWduZWQgdG8gdGhlIFNJUCBBT1IKKwlhbGxvY2F0ZWQgdG8gdGhlIHVzZXIgbmFtZSwgYW5kIHRoZSBEaWFtZXRlciBzZXJ2ZXIgTVVTVCBzZXQgdGhlCisJUmVzdWx0LUNvZGUgQVZQIHZhbHVlIHRvIERJQU1FVEVSX1NVQ0NFU1MgaW4gdGhlIERpYW1ldGVyIFNBQQorCW1lc3NhZ2UuICBUaGUgRGlhbWV0ZXIgc2VydmVyIE1VU1QgY29uc2lkZXIgdGhlIFNJUCBBT1IgYXMgbm90CisJcmVnaXN0ZXJlZC4KKworCVRoZSBNZXNzYWdlIEZvcm1hdCBvZiB0aGUgU0FBIGNvbW1hbmQgaXMgYXMgZm9sbG93czoKKworCTxTQUE+IDo6PSA8IERpYW1ldGVyIEhlYWRlcjogMjg0LCBQWFkgPgorCTwgU2Vzc2lvbi1JZCA+CisJeyBBdXRoLUFwcGxpY2F0aW9uLUlkIH0KKwl7IFJlc3VsdC1Db2RlIH0KKwl7IEF1dGgtU2Vzc2lvbi1TdGF0ZSB9CisJeyBPcmlnaW4tSG9zdCB9CisJeyBPcmlnaW4tUmVhbG0gfQorCSogWyBTSVAtVXNlci1EYXRhIF0KKwlbIFNJUC1BY2NvdW50aW5nLUluZm9ybWF0aW9uIF0KKwkqIFsgU0lQLVN1cHBvcnRlZC1Vc2VyLURhdGEtVHlwZSBdCisJWyBVc2VyLU5hbWUgXQorCVsgQXV0aC1HcmFjZS1QZXJpb2QgXQorCVsgQXV0aG9yaXphdGlvbi1MaWZldGltZSBdCisJWyBSZWRpcmVjdC1Ib3N0IF0KKwlbIFJlZGlyZWN0LUhvc3QtVXNhZ2UgXQorCVsgUmVkaXJlY3QtTWF4LUNhY2hlLVRpbWUgXQorCSogWyBQcm94eS1JbmZvIF0KKwkqIFsgUm91dGUtUmVjb3JkIF0KKwkqIFsgQVZQIF0KKworCisKKworCSovCisgICAgICBzdHJ1Y3QgZGljdF9vYmplY3QgKiBjbWQ7CisgICAgICBzdHJ1Y3QgZGljdF9jbWRfZGF0YSBkYXRhID0geyAKKwkyODQsIAkJCQkJLyogQ29kZSAqLworCSJTZXJ2ZXItQXNzaWdubWVudC1BbnN3ZXIiLCAJCS8qIE5hbWUgKi8KKwlDTURfRkxBR19SRVFVRVNUIHwgQ01EX0ZMQUdfUFJPWElBQkxFIHwgQ01EX0ZMQUdfRVJST1IsIAkvKiBGaXhlZCBmbGFncyAqLworCUNNRF9GTEFHX1BST1hJQUJMRSAJCQkJCQkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworICAgICAgfTsKKyAgICAgIHN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPSAKKwl7IAkgeyAgIlNlc3Npb24tSWQiLCAJCQlSVUxFX0ZJWEVEX0hFQUQsIC0xLCAxIH0KKwkJICx7ICAiQXV0aC1BcHBsaWNhdGlvbi1JZCIsIAkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCSAseyAgIlJlc3VsdC1Db2RlIiwgCQkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCSAseyAgIkF1dGgtU2Vzc2lvbi1TdGF0ZSIsIAkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCSAseyAgIk9yaWdpbi1Ib3N0IiwgCQkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCSAseyAgIk9yaWdpbi1SZWFsbSIsIAkJCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkgLHsgICJTSVAtVXNlci1EYXRhIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAtMSB9CisJCSAseyAgIlNJUC1BY2NvdW50aW5nLUluZm9ybWF0aW9uIiwgCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkgLHsgICJTSVAtU3VwcG9ydGVkLVVzZXItRGF0YS1UeXBlIiwgCVJVTEVfT1BUSU9OQUwsICAgLTEsIC0xIH0KKwkJICx7ICAiVXNlci1OYW1lIiwgCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCSAseyAgIkF1dGgtR3JhY2UtUGVyaW9kIiwgCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJICx7ICAiQXV0aG9yaXphdGlvbi1MaWZldGltZSIsIAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCSAseyAgIlJlZGlyZWN0LUhvc3QiLCAJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJICx7ICAiUmVkaXJlY3QtSG9zdC1Vc2FnZSIsIAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCSAseyAgIlJlZGlyZWN0LU1heC1DYWNoZS1UaW1lIiwgCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJICx7ICAiUHJveHktSW5mbyIsIAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIC0xIH0KKwkJICx7ICAiUm91dGUtUmVjb3JkIiwgCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgLTEgfQorCisJfTsKKwkJCQorICAgICAgQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQ09NTUFORCwgJmRhdGEgLCBjeGR4X2RpY3QsICZjbWQpOworICAgICAgUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgY21kLCBBVlBfQllfTkFNRSApOworICAgIH0KKyAgICAvKiBMb2NhdGlvbi1JbmZvLVJlcXVlc3QgKExJUikgQ29tbWFuZCAqLworICAgIHsKKyAgICAgIC8qCisJCQkKKwlUaGUgTG9jYXRpb24tSW5mby1SZXF1ZXN0IChMSVIpIGlzIGluZGljYXRlZCBieSB0aGUgQ29tbWFuZC1Db2RlIHNldAorCXRvIDI4NSBhbmQgdGhlIENvbW1hbmQgRmxhZ3MnICdSJyBiaXQgc2V0LiAgVGhlIERpYW1ldGVyIGNsaWVudCBpbiBhCisJU0lQIHNlcnZlciBzZW5kcyB0aGlzIGNvbW1hbmQgdG8gdGhlIERpYW1ldGVyIHNlcnZlciB0byByZXF1ZXN0CisJcm91dGluZyBpbmZvcm1hdGlvbiwgZS5nLiwgdGhlIFVSSSBvZiB0aGUgU0lQIHNlcnZlciBhc3NpZ25lZCB0byB0aGUKKwlTSVAtQU9SIEFWUCB2YWx1ZSBhbGxvY2F0ZWQgdG8gdGhlIHVzZXJzLgorCisJVGhlIE1lc3NhZ2UgRm9ybWF0IG9mIHRoZSBMSVIgY29tbWFuZCBpcyBhcyBmb2xsb3dzOgorCisJPExJUj4gOjo9IDwgRGlhbWV0ZXIgSGVhZGVyOiAyODUsIFJFUSwgUFhZID4KKwk8IFNlc3Npb24tSWQgPgorCXsgQXV0aC1BcHBsaWNhdGlvbi1JZCB9CisJeyBBdXRoLVNlc3Npb24tU3RhdGUgfQorCXsgT3JpZ2luLUhvc3QgfQorCXsgT3JpZ2luLVJlYWxtIH0KKwl7IERlc3RpbmF0aW9uLVJlYWxtIH0KKwl7IFNJUC1BT1IgfQorCVsgRGVzdGluYXRpb24tSG9zdCBdCisJKiBbIFByb3h5LUluZm8gXQorCSogWyBSb3V0ZS1SZWNvcmQgXQorCSogWyBBVlAgXQorCSovCisgICAgICBzdHJ1Y3QgZGljdF9vYmplY3QgKiBjbWQ7CisgICAgICBzdHJ1Y3QgZGljdF9jbWRfZGF0YSBkYXRhID0geyAKKwkyODUsIAkJCQkJLyogQ29kZSAqLworCSJMb2NhdGlvbi1JbmZvLVJlcXVlc3QiLCAJCS8qIE5hbWUgKi8KKwlDTURfRkxBR19SRVFVRVNUIHwgQ01EX0ZMQUdfUFJPWElBQkxFIHwgQ01EX0ZMQUdfRVJST1IsIAkvKiBGaXhlZCBmbGFncyAqLworCUNNRF9GTEFHX1JFUVVFU1QgfCBDTURfRkxBR19QUk9YSUFCTEUgCQkJCQkJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKyAgICAgIH07CisgICAgICBzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0gCisJeyAJIHsgICJTZXNzaW9uLUlkIiwgCQlSVUxFX0ZJWEVEX0hFQUQsIC0xLCAxIH0KKwkJICx7ICAiQXV0aC1BcHBsaWNhdGlvbi1JZCIsIAlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJICx7ICAiQXV0aC1TZXNzaW9uLVN0YXRlIiwgCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkgLHsgICJPcmlnaW4tSG9zdCIsIAkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCSAseyAgIk9yaWdpbi1SZWFsbSIsIAkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCSAseyAgIkRlc3RpbmF0aW9uLVJlYWxtIiwJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCSAseyAgIlNJUC1BT1IiLCAJCQlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJICx7ICAiRGVzdGluYXRpb24tSG9zdCIsIAlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJICx7ICAiUHJveHktSW5mbyIsIAkJUlVMRV9PUFRJT05BTCwgICAtMSwgLTEgfQorCQkgLHsgICJSb3V0ZS1SZWNvcmQiLCAJCVJVTEVfT1BUSU9OQUwsICAgLTEsIC0xIH0KKworCX07CisJCQkKKyAgICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX0NPTU1BTkQsICZkYXRhICwgY3hkeF9kaWN0LCAmY21kKTsKKyAgICAgIFBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGNtZCwgQVZQX0JZX05BTUUgKTsKKyAgICB9CisgICAgLyogTG9jYXRpb24tSW5mby1BbnN3ZXIgKExJQSkgQ29tbWFuZCAqLworICAgIHsKKyAgICAgIC8qCisJVGhlIExvY2F0aW9uLUluZm8tQW5zd2VyIChMSUEpIGlzIGluZGljYXRlZCBieSB0aGUgQ29tbWFuZC1Db2RlIHNldAorCXRvIDI4NSBhbmQgdGhlIENvbW1hbmQgRmxhZ3MnICdSJyBiaXQgY2xlYXJlZC4gIFRoZSBEaWFtZXRlciBzZXJ2ZXIKKwlzZW5kcyB0aGlzIGNvbW1hbmQgaW4gcmVzcG9uc2UgdG8gYSBwcmV2aW91c2x5IHJlY2VpdmVkIERpYW1ldGVyCisJTG9jYXRpb24tSW5mby1SZXF1ZXN0IChMSVIpIGNvbW1hbmQuCisKKwlJbiBhZGRpdGlvbiB0byB0aGUgdmFsdWVzIGFscmVhZHkgZGVmaW5lZCBpbiBSRkMgMzU4OCBbUkZDMzU4OF0sIHRoZQorCVJlc3VsdC1Db2RlIEFWUCBtYXkgY29udGFpbiBvbmUgb2YgdGhlIHZhbHVlcyBkZWZpbmVkIGluCisJU2VjdGlvbiAxMC4xLiAgV2hlbiB0aGUgRGlhbWV0ZXIgc2VydmVyIGZpbmRzIGFuIGVycm9yIGluIHByb2Nlc3NpbmcKKwl0aGUgRGlhbWV0ZXIgTElSIG1lc3NhZ2UsIHRoZSBEaWFtZXRlciBzZXJ2ZXIgTVVTVCBzdG9wIHRoZSBwcm9jZXNzCisJb2YgdGhlIG1lc3NhZ2UgYW5kIGFuc3dlciB3aXRoIGEgRGlhbWV0ZXIgTElBIG1lc3NhZ2UgdGhhdCBpbmNsdWRlcworCXRoZSBhcHByb3ByaWF0ZSBlcnJvciBjb2RlIGluIHRoZSBSZXN1bHQtQ29kZSBBVlAgdmFsdWUuICBXaGVuIHRoZXJlCisJaXMgbm8gZXJyb3IsIHRoZSBEaWFtZXRlciBzZXJ2ZXIgTVVTVCBzZXQgdGhlIFJlc3VsdC1Db2RlIEFWUCB2YWx1ZQorCXRvIERJQU1FVEVSX1NVQ0NFU1MgaW4gdGhlIERpYW1ldGVyIExJQSBtZXNzYWdlLgorCisJT25lIG9mIHRoZSBlcnJvcnMgdGhhdCB0aGUgRGlhbWV0ZXIgc2VydmVyIG1heSBmaW5kIGlzIHRoYXQgdGhlCisJU0lQLUFPUiBBVlAgdmFsdWUgaXMgbm90IGEgdmFsaWQgdXNlciBpbiB0aGUgcmVhbG0uICBJbiBzdWNoIGNhc2VzLAorCXRoZSBEaWFtZXRlciBzZXJ2ZXIgTVVTVCBzZXQgdGhlIFJlc3VsdC1Db2RlIEFWUCB2YWx1ZSB0bworCURJQU1FVEVSX0VSUk9SX1VTRVJfVU5LTk9XTiBhbmQgcmV0dXJuIGl0IGluIGEgRGlhbWV0ZXIgTElBIG1lc3NhZ2UuCisKKwlJZiB0aGUgRGlhbWV0ZXIgc2VydmVyIGNhbm5vdCBwcm9jZXNzIHRoZSBEaWFtZXRlciBMSVIgY29tbWFuZCwgZS5nLiwKKwlkdWUgdG8gYSBkYXRhYmFzZSBlcnJvciwgdGhlIERpYW1ldGVyIHNlcnZlciBNVVNUIHNldCB0aGUgUmVzdWx0LUNvZGUKKwlBVlAgdmFsdWUgdG8gRElBTUVURVJfVU5BQkxFX1RPX0NPTVBMWSBhbmQgcmV0dXJuIGl0IGluIGEgRGlhbWV0ZXIKKwlMSUEgbWVzc2FnZS4gIFRoZSBEaWFtZXRlciBzZXJ2ZXIgTVVTVCBOT1QgaW5jbHVkZSBhbnkgU0lQLVNlcnZlci1VUkkKKwlvciBTSVAtU2VydmVyLUNhcGFiaWxpdGllcyBBVlAgaW4gdGhlIERpYW1ldGVyIExJQSBtZXNzYWdlLgorCisJVGhlIERpYW1ldGVyIHNlcnZlciBtYXkgb3IgbWF5IG5vdCBiZSBhd2FyZSBvZiBhIFNJUCBzZXJ2ZXIgYXNzaWduZWQKKwl0byB0aGUgU0lQLUFPUiBBVlAgdmFsdWUgaW5jbHVkZWQgaW4gdGhlIERpYW1ldGVyIExJUiBtZXNzYWdlLiAgSWYKKwl0aGUgRGlhbWV0ZXIgc2VydmVyIGlzIGF3YXJlIG9mIGEgU0lQIHNlcnZlciBhbGxvY2F0ZWQgdG8gdGhhdAorCXBhcnRpY3VsYXIgdXNlciwgdGhlIERpYW1ldGVyIHNlcnZlciBNVVNUIGluY2x1ZGUgdGhlIFVSSSBvZiBzdWNoIFNJUAorCXNlcnZlciBpbiB0aGUgU0lQLVNlcnZlci1VUkkgQVZQIGFuZCByZXR1cm4gaXQgaW4gYSBEaWFtZXRlciBMSUEKKwltZXNzYWdlLiAgVGhpcyBpcyB0eXBpY2FsbHkgdGhlIHNpdHVhdGlvbiB3aGVuIHRoZSB1c2VyIGlzIGVpdGhlcgorCXJlZ2lzdGVyZWQsIG9yIHVucmVnaXN0ZXJlZCBidXQgYSBTSVAgc2VydmVyIGlzIHN0aWxsIGFzc2lnbmVkIHRvIHRoZQorCXVzZXIuCisKKwlXaGVuIHRoZSBEaWFtZXRlciBzZXJ2ZXIgaXMgbm90IGF3YXJlIG9mIGEgU0lQIHNlcnZlciBhbGxvY2F0ZWQgdG8KKwl0aGUgdXNlciAodHlwaWNhbGx5IHRoZSBjYXNlIHdoZW4gdGhlIHVzZXIgdW5yZWdpc3RlcmVkKSwgdGhlCisJUmVzdWx0LUNvZGUgQVZQIHZhbHVlIGluIHRoZSBEaWFtZXRlciBMSUEgbWVzc2FnZSBkZXBlbmRzIG9uIHdoZXRoZXIKKwl0aGUgRGlhbWV0ZXIgc2VydmVyIGlzIGF3YXJlIHRoYXQgdGhlIHVzZXIgaGFzIHNlcnZpY2VzIGRlZmluZWQgZm9yCisJdW5yZWdpc3RlcmVkIHVzZXJzOgorCisJbyAgVGhvc2UgdXNlcnMgd2hvIGhhdmUgc2VydmljZXMgZGVmaW5lZCBmb3IgdW5yZWdpc3RlcmVkIHVzZXJzIG1heQorCXJlcXVpcmUgdGhlIGFsbG9jYXRpb24gb2YgYSBTSVAgc2VydmVyIHRvIHRyaWdnZXIgYW5kIHBlcmhhcHMKKwlleGVjdXRlIHRob3NlIHNlcnZpY2VzLiAgVGhlcmVmb3JlLCB3aGVuIHRoZSBEaWFtZXRlciBzZXJ2ZXIgaXMKKwlub3QgYXdhcmUgb2YgYW4gYXNzaWduZWQgU0lQIHNlcnZlciwgYnV0IHRoZSB1c2VyIGhhcyBzZXJ2aWNlcworCWRlZmluZWQgZm9yIHVucmVnaXN0ZXJlZCB1c2VycywgdGhlIERpYW1ldGVyIHNlcnZlciBNVVNUIHNldCB0aGUKKwlSZXN1bHQtQ29kZSBBVlAgdmFsdWUgdG8gRElBTUVURVJfVU5SRUdJU1RFUkVEX1NFUlZJQ0UgYW5kIHJldHVybgorCWl0IGluIGEgRGlhbWV0ZXIgTElBIG1lc3NhZ2UuICBUaGUgRGlhbWV0ZXIgc2VydmVyIE1BWSBhbHNvCisJaW5jbHVkZSBhIFNJUC1TZXJ2ZXItQ2FwYWJpbGl0aWVzIEFWUCB0byBmYWNpbGl0YXRlIHRoZSBTSVAgc2VydmVyCisJKERpYW1ldGVyIGNsaWVudCkgd2l0aCB0aGUgc2VsZWN0aW9uIG9mIGFuIGFwcHJvcHJpYXRlIFNJUCBzZXJ2ZXIKKwl3aXRoIHRoZSByZXF1aXJlZCBjYXBhYmlsaXRpZXMuICBBYnNlbmNlIG9mIHRoZSBTSVAtU2VydmVyLQorCUNhcGFiaWxpdGllcyBBVlAgaW5kaWNhdGVzIHRvIHRoZSBTSVAgc2VydmVyIChEaWFtZXRlciBjbGllbnQpCisJdGhhdCBhbnkgU0lQIHNlcnZlciBpcyBzdWl0YWJsZSB0byBiZSBhbGxvY2F0ZWQgZm9yIHRoZSB1c2VyLgorCisJbyAgVGhvc2UgdXNlcnMgd2hvIGRvIG5vdCBoYXZlIHNlcnZpY2UgZGVmaW5lZCBmb3IgdW5yZWdpc3RlcmVkIHVzZXJzCisJZG8gbm90IHJlcXVpcmUgZnVydGhlciBwcm9jZXNzaW5nLiAgVGhlIERpYW1ldGVyIHNlcnZlciBNVVNUIHNldAorCXRoZSBSZXN1bHQtQ29kZSBBVlAgdmFsdWUgdG8KKwlESUFNRVRFUl9FUlJPUl9JREVOVElUWV9OT1RfUkVHSVNURVJFRCBhbmQgcmV0dXJuIGl0IHRvIHRoZQorCURpYW1ldGVyIGNsaWVudCBpbiBhIERpYW1ldGVyIExJQSBtZXNzYWdlLiAgVGhlIFNJUCBzZXJ2ZXIKKwkoRGlhbWV0ZXIgY2xpZW50KSBtYXkgcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBTSVAgcmVzcG9uc2UgKGUuZy4sCisJNDgwIChUZW1wb3JhcmlseSB1bmF2YWlsYWJsZSkpIHRvIHRoZSBvcmlnaW5hbCBTSVAgcmVxdWVzdC4KKworCVRoZSBNZXNzYWdlIEZvcm1hdCBvZiB0aGUgTElBIGNvbW1hbmQgaXMgYXMgZm9sbG93czoKKworCTxMSUE+IDo6PSA8IERpYW1ldGVyIEhlYWRlcjogMjg1LCBQWFkgPgorCTwgU2Vzc2lvbi1JZCA+CisJeyBBdXRoLUFwcGxpY2F0aW9uLUlkIH0KKwl7IFJlc3VsdC1Db2RlIH0KKwl7IEF1dGgtU2Vzc2lvbi1TdGF0ZSB9CisJeyBPcmlnaW4tSG9zdCB9CisJeyBPcmlnaW4tUmVhbG0gfQorCVsgU0lQLVNlcnZlci1VUkkgXQorCVsgU0lQLVNlcnZlci1DYXBhYmlsaXRpZXMgXQorCVsgQXV0aC1HcmFjZS1QZXJpb2QgXQorCVsgQXV0aG9yaXphdGlvbi1MaWZldGltZSBdCisJWyBSZWRpcmVjdC1Ib3N0IF0KKwlbIFJlZGlyZWN0LUhvc3QtVXNhZ2UgXQorCVsgUmVkaXJlY3QtTWF4LUNhY2hlLVRpbWUgXQorCSogWyBQcm94eS1JbmZvIF0KKwkqIFsgUm91dGUtUmVjb3JkIF0KKwkqIFsgQVZQIF0KKwkqLworICAgICAgc3RydWN0IGRpY3Rfb2JqZWN0ICogY21kOworICAgICAgc3RydWN0IGRpY3RfY21kX2RhdGEgZGF0YSA9IHsgCisJMjg1LCAJCQkJCS8qIENvZGUgKi8KKwkiTG9jYXRpb24tSW5mby1BbnN3ZXIiLCAJCS8qIE5hbWUgKi8KKwlDTURfRkxBR19SRVFVRVNUIHwgQ01EX0ZMQUdfUFJPWElBQkxFIHwgQ01EX0ZMQUdfRVJST1IsIAkvKiBGaXhlZCBmbGFncyAqLworCUNNRF9GTEFHX1BST1hJQUJMRSAJCQkJCQkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworICAgICAgfTsKKyAgICAgIHN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPSAKKwl7IAkgeyAgIlNlc3Npb24tSWQiLCAJCVJVTEVfRklYRURfSEVBRCwgLTEsIDEgfQorCQkgLHsgICJBdXRoLUFwcGxpY2F0aW9uLUlkIiwgCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkgLHsgICJSZXN1bHQtQ29kZSIsIAkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCSAseyAgIkF1dGgtU2Vzc2lvbi1TdGF0ZSIsIAlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJICx7ICAiT3JpZ2luLUhvc3QiLCAJCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkgLHsgICJPcmlnaW4tUmVhbG0iLCAJCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkgLHsgICJTSVAtU2VydmVyLVVSSSIsCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJICx7ICAiU0lQLVNlcnZlci1DYXBhYmlsaXRpZXMiLCAJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCSAseyAgIkF1dGgtR3JhY2UtUGVyaW9kIiwgCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkgLHsgICJBdXRob3JpemF0aW9uLUxpZmV0aW1lIiwgCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkgLHsgICJSZWRpcmVjdC1Ib3N0IiwgCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJICx7ICAiUmVkaXJlY3QtSG9zdC1Vc2FnZSIsIAlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJICx7ICAiUmVkaXJlY3QtTWF4LUNhY2hlLVRpbWUiLCAJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCSAseyAgIlByb3h5LUluZm8iLCAJCVJVTEVfT1BUSU9OQUwsICAgLTEsIC0xIH0KKwkJICx7ICAiUm91dGUtUmVjb3JkIiwgCQlSVUxFX09QVElPTkFMLCAgIC0xLCAtMSB9CisKKwl9OworCQkJCisgICAgICBDSEVDS19kaWN0X25ldyggRElDVF9DT01NQU5ELCAmZGF0YSAsIGN4ZHhfZGljdCwgJmNtZCk7CisgICAgICBQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBjbWQsIEFWUF9CWV9OQU1FICk7CisgICAgfQorICAgIC8qIFJlZ2lzdHJhdGlvbi1UZXJtaW5hdGlvbi1SZXF1ZXN0IChSVFIpIENvbW1hbmQgKi8KKyAgICB7CisgICAgICAvKgorCVRoZSBSZWdpc3RyYXRpb24tVGVybWluYXRpb24tUmVxdWVzdCAoUlRSKSBjb21tYW5kIGlzIGluZGljYXRlZCBieQorCXRoZSBDb21tYW5kLUNvZGUgc2V0IHRvIDI4NyBhbmQgdGhlIENvbW1hbmQgRmxhZ3MnICdSJyBiaXQgc2V0LiAgVGhlCisJRGlhbWV0ZXIgc2VydmVyIHNlbmRzIHRoaXMgY29tbWFuZCB0byB0aGUgRGlhbWV0ZXIgY2xpZW50IGluIGEgU0lQCisJc2VydmVyIHRvIGluZGljYXRlIHRvIHRoZSBTSVAgc2VydmVyIHRoYXQgb25lIG9yIG1vcmUgU0lQIEFPUnMgaGF2ZQorCXRvIGJlIGRlcmVnaXN0ZXJlZC4gIFRoZSBjb21tYW5kIGFsbG93cyBhbiBvcGVyYXRvciB0bworCWFkbWluaXN0cmF0aXZlbHkgY2FuY2VsIHRoZSByZWdpc3RyYXRpb24gb2YgYSB1c2VyIGZyb20gYSBjZW50cmFsaXplZAorCURpYW1ldGVyIHNlcnZlci4KKworCVRoZSBEaWFtZXRlciBzZXJ2ZXIgaGFzIHRoZSBjYXBhYmlsaXR5IHRvIGluaXRpYXRlIHRoZSBkZXJlZ2lzdHJhdGlvbgorCW9mIGEgdXNlciBhbmQgaW5mb3JtIHRoZSBTSVAgc2VydmVyIGJ5IG1lYW5zIG9mIHRoZSBEaWFtZXRlciBSVFIKKwljb21tYW5kLiAgVGhlIERpYW1ldGVyIHNlcnZlciBjYW4gZGVjaWRlIHdoZXRoZXIgb25seSBvbmUgU0lQIEFPUiBpcworCWdvaW5nIHRvIGJlIGRlcmVnaXN0ZXJlZCwgYSBsaXN0IG9mIFNJUCBBT1JzLCBvciBhbGwgdGhlIFNJUCBBT1JzCisJYWxsb2NhdGVkIHRvIHRoZSB1c2VyLgorCisJVGhlIGFic2VuY2Ugb2YgYSBTSVAtQU9SIEFWUCBpbiB0aGUgRGlhbWV0ZXIgUlRSIG1lc3NhZ2UgaW5kaWNhdGVzCisJdGhhdCBhbGwgdGhlIFNJUCBBT1JzIGFsbG9jYXRlZCB0byB0aGUgdXNlciBpZGVudGlmaWVkIGJ5IHRoZQorCVVzZXItTmFtZSBBVlAgYXJlIGJlaW5nIGRlcmVnaXN0ZXJlZC4KKworCVRoZSBEaWFtZXRlciBzZXJ2ZXIgTVVTVCBpbmNsdWRlIGEgU0lQLURlcmVnaXN0cmF0aW9uLVJlYXNvbiBBVlAKKwl2YWx1ZSB0byBpbmRpY2F0ZSB0aGUgcmVhc29uIGZvciB0aGUgZGVyZWdpc3RyYXRpb24uCisKKwlUaGUgTWVzc2FnZSBGb3JtYXQgb2YgdGhlIFJUUiBjb21tYW5kIGlzIGFzIGZvbGxvd3M6CisKKwk8UlRSPiA6Oj0gPCBEaWFtZXRlciBIZWFkZXI6IDI4NywgUkVRLCBQWFkgPgorCTwgU2Vzc2lvbi1JZCA+CisJeyBBdXRoLUFwcGxpY2F0aW9uLUlkIH0KKwl7IEF1dGgtU2Vzc2lvbi1TdGF0ZSB9CisJeyBPcmlnaW4tSG9zdCB9CisJeyBPcmlnaW4tUmVhbG0gfQorCXsgRGVzdGluYXRpb24tSG9zdCB9CisJeyBTSVAtRGVyZWdpc3RyYXRpb24tUmVhc29uIH0KKwlbIERlc3RpbmF0aW9uLVJlYWxtIF0KKwlbIFVzZXItTmFtZSBdCisJKiBbIFNJUC1BT1IgXQorCSogWyBQcm94eS1JbmZvIF0KKwkqIFsgUm91dGUtUmVjb3JkIF0KKwkqIFsgQVZQIF0KKworCSovCisKKyAgICAgIHN0cnVjdCBkaWN0X29iamVjdCAqIGNtZDsKKyAgICAgIHN0cnVjdCBkaWN0X2NtZF9kYXRhIGRhdGEgPSAKKwl7IAorCSAgMjg3LCAJCQkJCS8qIENvZGUgKi8KKwkgICJSZWdpc3RyYXRpb24tVGVybWluYXRpb24tUmVxdWVzdCIsIAkJLyogTmFtZSAqLworCSAgQ01EX0ZMQUdfUkVRVUVTVCB8IENNRF9GTEFHX1BST1hJQUJMRSB8IENNRF9GTEFHX0VSUk9SLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkgIENNRF9GTEFHX1JFUVVFU1QgfCBDTURfRkxBR19QUk9YSUFCTEUgCQkJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwl9OworCisgICAgICBzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0gCisJeyAgCisJICB7ICJTZXNzaW9uLUlkIiwgICAgICAgICAgICAgICBSVUxFX0ZJWEVEX0hFQUQsIC0xLCAgMSB9LAorCSAgeyAiQXV0aC1BcHBsaWNhdGlvbi1JZCIsIAlSVUxFX1JFUVVJUkVELCAgIC0xLCAgMSB9LAorCSAgeyAiQXV0aC1TZXNzaW9uLVN0YXRlIiwgCVJVTEVfUkVRVUlSRUQsICAgLTEsICAxIH0sCisJICB7ICJPcmlnaW4tSG9zdCIsIAkJUlVMRV9SRVFVSVJFRCwgICAtMSwgIDEgfSwKKwkgIHsgIk9yaWdpbi1SZWFsbSIsIAkJUlVMRV9SRVFVSVJFRCwgICAtMSwgIDEgfSwKKwkgIHsgIkRlc3RpbmF0aW9uLUhvc3QiLCAJUlVMRV9SRVFVSVJFRCwgICAtMSwgIDEgfSwKKwkgIHsgIlNJUC1EZXJlZ2lzdHJhdGlvbi1SZWFzb24iLFJVTEVfUkVRVUlSRUQsICAgLTEsICAxIH0sCQorCSAgeyAiRGVzdGluYXRpb24tUmVhbG0iLAlSVUxFX09QVElPTkFMLCAgIC0xLCAgMSB9LAorCSAgeyAiVXNlci1OYW1lIiwgCQlSVUxFX09QVElPTkFMLCAgIC0xLCAgMSB9LAorCSAgeyAiU0lQLUFPUiIsIAkJICAgICAgICBSVUxFX1JFUVVJUkVELCAgIC0xLCAtMSB9LAorCSAgeyAiUHJveHktSW5mbyIsIAkJUlVMRV9PUFRJT05BTCwgICAtMSwgLTEgfSwKKwkgIHsgIlJvdXRlLVJlY29yZCIsIAkJUlVMRV9PUFRJT05BTCwgICAtMSwgLTEgfQorCX07CisgICAgICAKKyAgICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX0NPTU1BTkQsICZkYXRhICwgY3hkeF9kaWN0LCAmY21kKTsKKyAgICAgIFBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGNtZCwgQVZQX0JZX05BTUUgKTsKKyAgICB9CisgICAgLyogUmVnaXN0cmF0aW9uLVRlcm1pbmF0aW9uLUFuc3dlciAoUlRBKSBDb21tYW5kICovCisgICAgeworICAgICAgLyoKKwlUaGUgUmVnaXN0cmF0aW9uLVRlcm1pbmF0aW9uLUFuc3dlciAoUlRBKSBpcyBpbmRpY2F0ZWQgYnkgdGhlCisJQ29tbWFuZC1Db2RlIHNldCB0byAyODcgYW5kIHRoZSBDb21tYW5kIEZsYWdzJyAnUicgYml0IGNsZWFyZWQuICBUaGUKKwlEaWFtZXRlciBjbGllbnQgc2VuZHMgdGhpcyBjb21tYW5kIGluIHJlc3BvbnNlIHRvIGEgcHJldmlvdXNseQorCXJlY2VpdmVkIERpYW1ldGVyIFJlZ2lzdHJhdGlvbi1UZXJtaW5hdGlvbi1SZXF1ZXN0IChSVFIpIGNvbW1hbmQuCisKKwlJbiBhZGRpdGlvbiB0byB0aGUgdmFsdWVzIGFscmVhZHkgZGVmaW5lZCBpbiBSRkMgMzU4OCBbUkZDMzU4OF0sIHRoZQorCVJlc3VsdC1Db2RlIEFWUCBtYXkgY29udGFpbiBvbmUgb2YgdGhlIHZhbHVlcyBkZWZpbmVkIGluCisJU2VjdGlvbiAxMC4xLgorCisJSWYgdGhlIFNJUCBzZXJ2ZXIgKERpYW1ldGVyIGNsaWVudCkgcmVxdWlyZXMgYSBVc2VyLU5hbWUgQVZQIHZhbHVlIHRvCisJcHJvY2VzcyB0aGUgRGlhbWV0ZXIgUlRSIHJlcXVlc3QsIGJ1dCB0aGUgRGlhbWV0ZXIgUlRSIG1lc3NhZ2UgZGlkCisJbm90IGNvbnRhaW4gYSBVc2VyLU5hbWUgQVZQIHZhbHVlLCB0aGUgRGlhbWV0ZXIgY2xpZW50IE1VU1Qgc2V0IHRoZQorCVJlc3VsdC1Db2RlIEFWUCB2YWx1ZSB0byBESUFNRVRFUl9VU0VSX05BTUVfUkVRVUlSRUQgKHNlZSBTZWN0aW9uCisJMTAuMS4yKSBhbmQgcmV0dXJuIGl0IGluIGEgRGlhbWV0ZXIgUlRBIG1lc3NhZ2UuCisKKwlUaGUgU0lQIHNlcnZlciAoRGlhbWV0ZXIgY2xpZW50KSBhcHBsaWVzIHRoZSBhZG1pbmlzdHJhdGl2ZQorCWRlcmVnaXN0cmF0aW9uIHRvIGVhY2ggb2YgdGhlIFVSSXMgaW5jbHVkZWQgaW4gZWFjaCBvZiB0aGUgU0lQLUFPUgorCUFWUCB2YWx1ZXMsIG9yLCBpZiB0aGVyZSBpcyBubyBTSVAtQU9SIEFWUCBwcmVzZW50IGluIHRoZSBEaWFtZXRlcgorCVJUUiByZXF1ZXN0LCB0byBhbGwgdGhlIFVSSXMgYWxsb2NhdGVkIHRvIHRoZSBVc2VyLU5hbWUgQVZQIHZhbHVlLgorCisJVGhlIHZhbHVlIG9mIHRoZSBTSVAtRGVyZWdpc3RyYXRpb24tUmVhc29uIEFWUCBpbiB0aGUgRGlhbWV0ZXIgUlRSCisJY29tbWFuZCBoYXMgYW4gZWZmZWN0IG9uIHRoZSBhY3Rpb25zIHBlcmZvcm1lZCBhdCB0aGUgU0lQIHNlcnZlcgorCShEaWFtZXRlciBjbGllbnQpOgorCisJbyAgSWYgdGhlIHZhbHVlIGlzIHNldCB0byBQRVJNQU5FTlRfVEVSTUlOQVRJT04sIHRoZW4gdGhlIHVzZXIgaGFzCisJdGVybWluYXRlZCBoaXMvaGVyIHJlZ2lzdHJhdGlvbiB0byB0aGUgcmVhbG0uICBJZiBpbmZvcm1pbmcgdGhlCisJaW50ZXJlc3RlZCBwYXJ0aWVzIChlLmcuLCBzdWJzY3JpYmVycyB0byB0aGUgInJlZyIgZXZlbnQKKwlbUkZDMzY4MF0pIGFib3V0IHRoZSBhZG1pbmlzdHJhdGl2ZSBkZXJlZ2lzdHJhdGlvbiBpcyBzdXBwb3J0ZWQKKwl0aHJvdWdoIFNJUCBwcm9jZWR1cmVzLCB0aGUgU0lQIHNlcnZlciAoRGlhbWV0ZXIgY2xpZW50KSB3aWxsIGRvCisJc28uICBUaGUgRGlhbWV0ZXIgQ2xpZW50IGluIHRoZSBTSVAgU2VydmVyIFNIT1VMRCBOT1QgcmVxdWVzdCBhCisJbmV3IHVzZXIgcmVnaXN0cmF0aW9uLiAgVGhlIFNJUCBzZXJ2ZXIgY2xlYXJzIHRoZSByZWdpc3RyYXRpb24KKwlzdGF0ZSBvZiB0aGUgZGVyZWdpc3RlcmVkIEFPUnMuCisKKwlvICBJZiB0aGUgdmFsdWUgaXMgc2V0IHRvIE5FV19TSVBfU0VSVkVSX0FTU0lHTkVELCB0aGUgRGlhbWV0ZXIKKwlzZXJ2ZXIgaW5mb3JtcyB0aGUgU0lQIHNlcnZlciAoRGlhbWV0ZXIgY2xpZW50KSB0aGF0IGEgbmV3IFNJUAorCXNlcnZlciBoYXMgYmVlbiBhbGxvY2F0ZWQgdG8gdGhlIHVzZXIsIGR1ZSB0byBzb21lIHJlYXNvbi4gIFRoZQorCVNJUCBzZXJ2ZXIsIGlmIHN1cHBvcnRlZCB0aHJvdWdoIFNJUCBwcm9jZWR1cmVzLCB3aWxsIGluZm9ybSB0aGUKKwlpbnRlcmVzdGVkIHBhcnRpZXMgKGUuZy4sIHN1YnNjcmliZXJzIHRvIHRoZSAicmVnIiBldmVudAorCVtSRkMzNjgwXSkgYWJvdXQgdGhlIGFkbWluaXN0cmF0aXZlIGRlcmVnaXN0cmF0aW9uIGF0IHRoaXMgU0lQCisJc2VydmVyLiAgVGhlIERpYW1ldGVyIGNsaWVudCBpbiB0aGUgU0lQIHNlcnZlciBTSE9VTEQgTk9UIHJlcXVlc3QKKwlhIG5ldyB1c2VyIHJlZ2lzdHJhdGlvbi4gIFRoZSBTSVAgc2VydmVyIGNsZWFycyB0aGUgcmVnaXN0cmF0aW9uCisJc3RhdGUgb2YgdGhlIGRlcmVnaXN0ZXJlZCBTSVAgQU9Scy4KKworCW8gIElmIHRoZSB2YWx1ZSBpcyBzZXQgdG8gU0lQX1NFUlZFUl9DSEFOR0UsIHRoZSBEaWFtZXRlciBzZXJ2ZXIKKwlpbmZvcm1zIHRoZSBTSVAgc2VydmVyIChEaWFtZXRlciBjbGllbnQpIHRoYXQgYSBuZXcgU0lQIHNlcnZlciBoYXMKKwl0byBiZSBhbGxvY2F0ZWQgdG8gdGhlIHVzZXIsIGUuZy4sIGR1ZSB0byB1c2VyJ3MgY2FwYWJpbGl0aWVzCisJcmVxdWlyaW5nIGEgbmV3IFNJUCBzZXJ2ZXIsIG9yIG5vdCBlbm91Z2ggcmVzb3VyY2VzIGluIHRoZSBjdXJyZW50CisJU0lQIHNlcnZlci4gIElmIGluZm9ybWluZyB0aGUgaW50ZXJlc3RlZCBwYXJ0aWVzIGFib3V0IHRoZQorCWFkbWluaXN0cmF0aXZlIGRlcmVnaXN0cmF0aW9uIGlzIHN1cHBvcnRlZCB0aHJvdWdoIFNJUCBwcm9jZWR1cmVzCisJKGUuZy4sIHN1YnNjcmlwdGlvbnMgdG8gdGhlICJyZWciIGV2ZW50IFtSRkMzNjgwXSksIHRoZSBTSVAgc2VydmVyCisJd2lsbCBkbyBzby4gIFRoZSBEaWFtZXRlciBjbGllbnQgaW4gdGhlIFNJUCBTZXJ2ZXIgU0hPVUxEIE5PVAorCXJlcXVlc3QgYSBuZXcgdXNlciByZWdpc3RyYXRpb24uICBUaGUgU0lQIHNlcnZlciBjbGVhcnMgdGhlCisJcmVnaXN0cmF0aW9uIHN0YXRlIG9mIHRoZSBkZXJlZ2lzdGVyZWQgU0lQIEFPUnMuCisKKwlvICBJZiB0aGUgdmFsdWUgaXMgc2V0IHRvIFJFTU9WRV9TSVBfU0VSVkVSLCB0aGUgRGlhbWV0ZXIgc2VydmVyCisJaW5mb3JtcyB0aGUgU0lQIHNlcnZlciAoRGlhbWV0ZXIgY2xpZW50KSB0aGF0IHRoZSBTSVAgc2VydmVyIHdpbGwKKwlubyBsb25nZXIgYmUgYm91bmQgaW4gdGhlIERpYW1ldGVyIHNlcnZlciB3aXRoIHRoYXQgdXNlci4gIFRoZSBTSVAKKwlzZXJ2ZXIgY2FuIGRlbGV0ZSBhbGwgZGF0YSByZWxhdGVkIHRvIHRoZSB1c2VyLgorCisJVGhlIE1lc3NhZ2UgRm9ybWF0IG9mIHRoZSBSVEEgY29tbWFuZCBpcyBhcyBmb2xsb3dzOgorCisJPFJUQT4gOjo9IDwgRGlhbWV0ZXIgSGVhZGVyOiAyODcsIFBYWSA+CisJPCBTZXNzaW9uLUlkID4KKwl7IEF1dGgtQXBwbGljYXRpb24tSWQgfQorCXsgUmVzdWx0LUNvZGUgfQorCXsgQXV0aC1TZXNzaW9uLVN0YXRlIH0KKwl7IE9yaWdpbi1Ib3N0IH0KKwl7IE9yaWdpbi1SZWFsbSB9CisJWyBBdXRob3JpemF0aW9uLUxpZmV0aW1lIF0KKwlbIEF1dGgtR3JhY2UtUGVyaW9kIF0KKwlbIFJlZGlyZWN0LUhvc3QgXQorCVsgUmVkaXJlY3QtSG9zdC1Vc2FnZSBdCisJWyBSZWRpcmVjdC1NYXgtQ2FjaGUtVGltZSBdCisJKiBbIFByb3h5LUluZm8gXQorCSogWyBSb3V0ZS1SZWNvcmQgXQorCSogWyBBVlAgXQorCisJKi8KKyAgICAgIHN0cnVjdCBkaWN0X29iamVjdCAqIGNtZDsKKyAgICAgIHN0cnVjdCBkaWN0X2NtZF9kYXRhIGRhdGEgPSB7IAorCTI4NywgCQkJCQkvKiBDb2RlICovCisJIlJlZ2lzdHJhdGlvbi1UZXJtaW5hdGlvbi1BbnN3ZXIiLCAJCS8qIE5hbWUgKi8KKwlDTURfRkxBR19SRVFVRVNUIHwgQ01EX0ZMQUdfUFJPWElBQkxFIHwgQ01EX0ZMQUdfRVJST1IsIAkvKiBGaXhlZCBmbGFncyAqLworCUNNRF9GTEFHX1BST1hJQUJMRSAJCQkJCQkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworICAgICAgfTsKKyAgICAgIHN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPSAKKwl7IAkgeyAgIlNlc3Npb24tSWQiLCAJCVJVTEVfRklYRURfSEVBRCwgLTEsIDEgfQorCQkgLHsgICJBdXRoLUFwcGxpY2F0aW9uLUlkIiwgCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkgLHsgICJSZXN1bHQtQ29kZSIsIAkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCSAseyAgIkF1dGgtU2Vzc2lvbi1TdGF0ZSIsIAlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJICx7ICAiT3JpZ2luLUhvc3QiLCAJCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkgLHsgICJPcmlnaW4tUmVhbG0iLCAJCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkgLHsgICJBdXRob3JpemF0aW9uLUxpZmV0aW1lIiwJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCSAseyAgIkF1dGgtR3JhY2UtUGVyaW9kIiwgCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkgLHsgICJSZWRpcmVjdC1Ib3N0IiwgCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJICx7ICAiUmVkaXJlY3QtSG9zdC1Vc2FnZSIsIAlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJICx7ICAiUmVkaXJlY3QtTWF4LUNhY2hlLVRpbWUiLCAJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCSAseyAgIlByb3h5LUluZm8iLCAJCVJVTEVfT1BUSU9OQUwsICAgLTEsIC0xIH0KKwkJICx7ICAiUm91dGUtUmVjb3JkIiwgCQlSVUxFX09QVElPTkFMLCAgIC0xLCAtMSB9CisKKwl9OworCQkJCisgICAgICBDSEVDS19kaWN0X25ldyggRElDVF9DT01NQU5ELCAmZGF0YSAsIGN4ZHhfZGljdCwgJmNtZCk7CisgICAgICBQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBjbWQsIEFWUF9CWV9OQU1FICk7CisgICAgfQorCQkKKyAgICAvKiBQdXNoLVByb2ZpbGUtUmVxdWVzdCAoUFBSKSBDb21tYW5kICovCisgICAgeworICAgICAgLyoKKwlUaGUgUHVzaC1Qcm9maWxlLVJlcXVlc3QgKFBQUikgY29tbWFuZCBpcyBpbmRpY2F0ZWQgYnkgdGhlCisJQ29tbWFuZC1Db2RlIHNldCB0byAyODggYW5kIHRoZSBDb21tYW5kIEZsYWdzJyAnUicgYml0IHNldC4gIFRoZQorCURpYW1ldGVyIHNlcnZlciBzZW5kcyB0aGlzIGNvbW1hbmQgdG8gdGhlIERpYW1ldGVyIGNsaWVudCBpbiBhIFNJUAorCXNlcnZlciB0byB1cGRhdGUgZWl0aGVyIHRoZSB1c2VyIHByb2ZpbGUgb2YgYW4gYWxyZWFkeSByZWdpc3RlcmVkCisJdXNlciBpbiB0aGF0IFNJUCBzZXJ2ZXIgb3IgdGhlIFNJUCBhY2NvdW50aW5nIGluZm9ybWF0aW9uLiAgVGhpcworCWFsbG93cyBhbiBvcGVyYXRvciB0byBtb2RpZnkgdGhlIGRhdGEgb2YgYSB1c2VyIHByb2ZpbGUgb3IgdGhlCisJYWNjb3VudGluZyBpbmZvcm1hdGlvbiBhbmQgcHVzaCBpdCB0byB0aGUgU0lQIHNlcnZlciB3aGVyZSB0aGUgdXNlcgorCWlzIHJlZ2lzdGVyZWQuCisKKwlFYWNoIHVzZXIgaGFzIGEgdXNlciBwcm9maWxlIGFzc29jaWF0ZWQgd2l0aCBoaW0vaGVyIGFuZCBvdGhlcgorCWFjY291bnRpbmcgaW5mb3JtYXRpb24uICBUaGUgcHJvZmlsZSBvciB0aGUgYWNjb3VudGluZyBpbmZvcm1hdGlvbgorCW1heSBjaGFuZ2Ugd2l0aCB0aW1lLCBlLmcuLCBkdWUgdG8gYWRkaXRpb24gb2YgbmV3IHNlcnZpY2VzIHRvIHRoZQorCXVzZXIuICBXaGVuIHRoZSB1c2VyIHByb2ZpbGUgb3IgdGhlIGFjY291bnRpbmcgaW5mb3JtYXRpb24gY2hhbmdlcywKKwl0aGUgRGlhbWV0ZXIgc2VydmVyIHNlbmRzIGEgRGlhbWV0ZXIgUHVzaC1Qcm9maWxlLVJlcXVlc3QgKFBQUikKKwljb21tYW5kIHRvIHRoZSBEaWFtZXRlciBjbGllbnQgaW4gYSBTSVAgc2VydmVyLCBpbiBvcmRlciB0byBzdGFydAorCWFwcGx5aW5nIHRob3NlIG5ldyBzZXJ2aWNlcy4KKworCUEgUFBSIGNvbW1hbmQgTUFZIGNvbnRhaW4gYSBTSVAtQWNjb3VudGluZy1JbmZvcm1hdGlvbiBBVlAgdGhhdAorCXVwZGF0ZXMgdGhlIGFkZHJlc3NlcyBvZiB0aGUgYWNjb3VudGluZyBzZXJ2ZXJzLiAgQ2hhbmdlcyBpbiB0aGUKKwlhZGRyZXNzZXMgb2YgdGhlIGFjY291bnRpbmcgc2VydmVycyB0YWtlIGVmZmVjdCBpbW1lZGlhdGVseS4gIFRoZQorCURpYW1ldGVyIGNsaWVudCBTSE9VTEQgY2xvc2UgYW55IGV4aXN0aW5nIGFjY291bnRpbmcgc2Vzc2lvbiB3aXRoIHRoZQorCWV4aXN0aW5nIHNlcnZlciBhbmQgc3RhcnQgcHJvdmlkaW5nIGFjY291bnRpbmcgaW5mb3JtYXRpb24gdG8gdGhlCisJbmV3bHkgYWNxdWlyZWQgYWNjb3VudGluZyBzZXJ2ZXIuCisKKwlBIFBQUiBjb21tYW5kIE1BWSBjb250YWluIHplcm8gb3IgbW9yZSBTSVAtVXNlci1EYXRhIEFWUCB2YWx1ZXMKKwljb250YWluaW5nIHRoZSBuZXcgdXNlciBwcm9maWxlLiAgT24gc2VsZWN0aW5nIHRoZSB0eXBlIG9mIHVzZXIgZGF0YSwKKwl0aGUgRGlhbWV0ZXIgc2VydmVyIFNIT1VMRCB0YWtlIGludG8gYWNjb3VudCB0aGUgc3VwcG9ydGVkIGZvcm1hdHMgYXQKKwl0aGUgU0lQIHNlcnZlciAoU0lQLVN1cHBvcnRlZC1Vc2VyLURhdGEtVHlwZSBBVlAgc2VudCBpbiBhIHByZXZpb3VzCisJU0FSIG1lc3NhZ2UpIGFuZCB0aGUgbG9jYWwgcG9saWN5LgorCisJVGhlIFVzZXItTmFtZSBBVlAgaW5kaWNhdGVzIHRoZSB1c2VyIHRvIHdob20gdGhlIHByb2ZpbGUgaXMKKwlhcHBsaWNhYmxlLgorCisJVGhlIE1lc3NhZ2UgRm9ybWF0IG9mIHRoZSBQUFIgY29tbWFuZCBpcyBhcyBmb2xsb3dzOgorCisJPFBQUj4gOjo9IDwgRGlhbWV0ZXIgSGVhZGVyOiAyODgsIFJFUSwgUFhZID4KKwk8IFNlc3Npb24tSWQgPgorCXsgQXV0aC1BcHBsaWNhdGlvbi1JZCB9CisJeyBBdXRoLVNlc3Npb24tU3RhdGUgfQorCXsgT3JpZ2luLUhvc3QgfQorCXsgT3JpZ2luLVJlYWxtIH0KKwl7IERlc3RpbmF0aW9uLVJlYWxtIH0KKwl7IFVzZXItTmFtZSB9CisJKiBbIFNJUC1Vc2VyLURhdGEgXQorCVsgU0lQLUFjY291bnRpbmctSW5mb3JtYXRpb24gXQorCVsgRGVzdGluYXRpb24tSG9zdCBdCisJWyBBdXRob3JpemF0aW9uLUxpZmV0aW1lIF0KKwlbIEF1dGgtR3JhY2UtUGVyaW9kIF0KKwkqIFsgUHJveHktSW5mbyBdCisJKiBbIFJvdXRlLVJlY29yZCBdCisJKiBbIEFWUCBdCisKKwkqLworICAgICAgc3RydWN0IGRpY3Rfb2JqZWN0ICogY21kOworICAgICAgc3RydWN0IGRpY3RfY21kX2RhdGEgZGF0YSA9IHsgCisJMjg4LCAJCQkJCS8qIENvZGUgKi8KKwkiUHVzaC1Qcm9maWxlLVJlcXVlc3QiLCAJCS8qIE5hbWUgKi8KKwlDTURfRkxBR19SRVFVRVNUIHwgQ01EX0ZMQUdfUFJPWElBQkxFIHwgQ01EX0ZMQUdfRVJST1IsIAkvKiBGaXhlZCBmbGFncyAqLworCUNNRF9GTEFHX1JFUVVFU1QgfCBDTURfRkxBR19QUk9YSUFCTEUgCQkJCQkJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKyAgICAgIH07CisgICAgICBzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0gCisJeyAJIHsgICJTZXNzaW9uLUlkIiwgCQkJUlVMRV9GSVhFRF9IRUFELCAtMSwgMSB9CisJCSAseyAgIkF1dGgtQXBwbGljYXRpb24tSWQiLCAJCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkgLHsgICJBdXRoLVNlc3Npb24tU3RhdGUiLCAJCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkgLHsgICJPcmlnaW4tSG9zdCIsIAkJCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkgLHsgICJPcmlnaW4tUmVhbG0iLCAJCQlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJICx7ICAiRGVzdGluYXRpb24tUmVhbG0iLAkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCSAseyAgIlVzZXItTmFtZSIsIAkJCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkgLHsgICJTSVAtVXNlci1EYXRhIiwgCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgLTEgfQorCQkgLHsgICJTSVAtQWNjb3VudGluZy1JbmZvcm1hdGlvbiIsIAlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJICx7ICAiRGVzdGluYXRpb24tSG9zdCIsIAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCSAseyAgIkF1dGhvcml6YXRpb24tTGlmZXRpbWUiLCAJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkgLHsgICJBdXRoLUdyYWNlLVBlcmlvZCIsIAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCSAseyAgIlByb3h5LUluZm8iLCAJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAtMSB9CisJCSAseyAgIlJvdXRlLVJlY29yZCIsIAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIC0xIH0KKworCX07CisJCQkKKyAgICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX0NPTU1BTkQsICZkYXRhICwgY3hkeF9kaWN0LCAmY21kKTsKKyAgICAgIFBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGNtZCwgQVZQX0JZX05BTUUgKTsKKyAgICB9CisgICAgLyogUHVzaC1Qcm9maWxlLUFuc3dlciAoUFBBKSBDb21tYW5kICovCisgICAgeworICAgICAgLyoKKwkJCQorCQkJCisJVGhlIFB1c2gtUHJvZmlsZS1BbnN3ZXIgKFBQQSkgaXMgaW5kaWNhdGVkIGJ5IHRoZSBDb21tYW5kLUNvZGUgc2V0IHRvCisJMjg4IGFuZCB0aGUgQ29tbWFuZCBGbGFncycgJ1InIGJpdCBjbGVhcmVkLiAgVGhlIERpYW1ldGVyIGNsaWVudAorCXNlbmRzIHRoaXMgY29tbWFuZCBpbiByZXNwb25zZSB0byBhIHByZXZpb3VzbHkgcmVjZWl2ZWQgRGlhbWV0ZXIKKwlQdXNoLVByb2ZpbGUtUmVxdWVzdCAoUFBSKSBjb21tYW5kLgorCisJSW4gYWRkaXRpb24gdG8gdGhlIHZhbHVlcyBhbHJlYWR5IGRlZmluZWQgaW4gUkZDIDM1ODggW1JGQzM1ODhdLCB0aGUKKwlSZXN1bHQtQ29kZSBBVlAgbWF5IGNvbnRhaW4gb25lIG9mIHRoZSB2YWx1ZXMgZGVmaW5lZCBpbgorCVNlY3Rpb24gMTAuMS4KKworCUlmIHRoZXJlIGlzIG5vIGVycm9yIHdoZW4gcHJvY2Vzc2luZyB0aGUgcmVjZWl2ZWQgRGlhbWV0ZXIgUFBSCisJbWVzc2FnZSwgdGhlIFNJUCBzZXJ2ZXIgKERpYW1ldGVyIGNsaWVudCkgTVVTVCBkb3dubG9hZCB0aGUgcmVjZWl2ZWQKKwl1c2VyIHByb2ZpbGUgZnJvbSB0aGUgU0lQLVVzZXItRGF0YSBBVlAgdmFsdWVzIGluIHRoZSBEaWFtZXRlciBQUFIKKwltZXNzYWdlIGFuZCBzdG9yZSBpdCBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgc3BlY2lmaWVkIGluIHRoZQorCVVzZXItTmFtZSBBVlAgdmFsdWUuCisKKwlJZiB0aGUgU0lQIHNlcnZlciBkb2VzIG5vdCByZWNvZ25pemUgb3IgZG9lcyBub3Qgc3VwcG9ydCBzb21lIG9mIHRoZQorCWRhdGEgdHJhbnNmZXJyZWQgaW4gdGhlIFNJUC1Vc2VyLURhdGEgQVZQIHZhbHVlcywgdGhlIERpYW1ldGVyIGNsaWVudAorCWluIHRoZSBTSVAgc2VydmVyIE1VU1QgcmV0dXJuIGEgRGlhbWV0ZXIgUFBBIG1lc3NhZ2UgdGhhdCBpbmNsdWRlcyBhCisJUmVzdWx0LUNvZGUgQVZQIHNldCB0byB0aGUgdmFsdWUgRElBTUVURVJfRVJST1JfTk9UX1NVUFBPUlRFRF9VU0VSX0RBVEEuCisKKwlJZiB0aGUgU0lQIHNlcnZlciAoRGlhbWV0ZXIgY2xpZW50KSByZWNlaXZlcyBhIERpYW1ldGVyIFBQUiBtZXNzYWdlCisJd2l0aCBhIFVzZXItTmFtZSBBVlAgdGhhdCBpcyB1bmtub3duLCB0aGUgRGlhbWV0ZXIgY2xpZW50IE1VU1Qgc2V0CisJdGhlIFJlc3VsdC1Db2RlIEFWUCB2YWx1ZSB0byBESUFNRVRFUl9FUlJPUl9VU0VSX1VOS05PV04gYW5kIE1VU1QKKwlyZXR1cm4gaXQgdG8gdGhlIERpYW1ldGVyIHNlcnZlciBpbiBhIERpYW1ldGVyIFBQQSBtZXNzYWdlLgorCisJSWYgdGhlIFNJUCBzZXJ2ZXIgKERpYW1ldGVyIGNsaWVudCkgcmVjZWl2ZXMgaW4gdGhlCisJU0lQLVVzZXItRGF0YS1Db250ZW50IEFWUCB2YWx1ZSAob2YgdGhlIGdyb3VwZWQgU0lQLVVzZXItRGF0YSBBVlApCisJbW9yZSBkYXRhIHRoYW4gaXQgY2FuIGFjY2VwdCwgaXQgTVVTVCBzZXQgdGhlIFJlc3VsdC1Db2RlIEFWUCB2YWx1ZQorCXRvIERJQU1FVEVSX0VSUk9SX1RPT19NVUNIX0RBVEEgYW5kIE1VU1QgcmV0dXJuIGl0IHRvIHRoZSBEaWFtZXRlcgorCXNlcnZlciBpbiBhIERpYW1ldGVyIFBQQSBtZXNzYWdlLiAgVGhlIFNJUCBzZXJ2ZXIgTVVTVCBOT1Qgb3ZlcnJpZGUKKwl0aGUgZXhpc3RpbmcgdXNlciBwcm9maWxlIHdpdGggdGhlIG9uZSByZWNlaXZlZCBpbiB0aGUgUFBSIG1lc3NhZ2UuCisKKwlJZiB0aGUgRGlhbWV0ZXIgc2VydmVyIHJlY2VpdmVzIHRoZSBSZXN1bHQtQ29kZSBBVlAgdmFsdWUgc2V0IHRvCisJRElBTUVURVJfRVJST1JfVE9PX01VQ0hfREFUQSBpbiBhIERpYW1ldGVyIFBQQSBtZXNzYWdlLCBpdCBTSE9VTEQKKwlmb3JjZSBhIG5ldyByZS1yZWdpc3RyYXRpb24gb2YgdGhlIHVzZXIgYnkgc2VuZGluZyB0byB0aGUgRGlhbWV0ZXIKKwljbGllbnQgYSBEaWFtZXRlciBSZWdpc3RyYXRpb24tVGVybWluYXRpb24tUmVxdWVzdCAoUlRSKSB3aXRoIHRoZQorCVNJUC1EZXJlZ2lzdHJhdGlvbi1SZWFzb24gQVZQIHZhbHVlIHNldCB0byBTSVBfU0VSVkVSX0NIQU5HRS4gIFRoaXMKKwl3aWxsIGZvcmNlIGEgcmUtcmVnaXN0cmF0aW9uIG9mIHRoZSB1c2VyIGFuZCB3aWxsIHRyaWdnZXIgYSBzZWxlY3Rpb24KKwlvZiBhIG5ldyBTSVAgc2VydmVyLgorCisJSWYgdGhlIERpYW1ldGVyIGNsaWVudCBpcyBub3QgYWJsZSB0byBob25vciB0aGUgY29tbWFuZCwgZm9yIGFueQorCW90aGVyIHJlYXNvbiwgaXQgTVVTVCBzZXQgdGhlIFJlc3VsdC1Db2RlIEFWUCB2YWx1ZSB0bworCURJQU1FVEVSX1VOQUJMRV9UT19DT01QTFkgYW5kIGl0IE1VU1QgcmV0dXJuIGl0IGluIGEgRGlhbWV0ZXIgUFBBCisJbWVzc2FnZS4KKworCVRoZSBNZXNzYWdlIEZvcm1hdCBvZiB0aGUgUFBBIGNvbW1hbmQgaXMgYXMgZm9sbG93czoKKworCTxQUEE+IDo6PSA8IERpYW1ldGVyIEhlYWRlcjogMjg4LCBQWFkgPgorCTwgU2Vzc2lvbi1JZCA+CisJeyBBdXRoLUFwcGxpY2F0aW9uLUlkIH0KKwl7IFJlc3VsdC1Db2RlIH0KKwl7IEF1dGgtU2Vzc2lvbi1TdGF0ZSB9CisJeyBPcmlnaW4tSG9zdCB9CisJeyBPcmlnaW4tUmVhbG0gfQorCVsgUmVkaXJlY3QtSG9zdCBdCisJWyBSZWRpcmVjdC1Ib3N0LVVzYWdlIF0KKwlbIFJlZGlyZWN0LU1heC1DYWNoZS1UaW1lIF0KKwkqIFsgUHJveHktSW5mbyBdCisJKiBbIFJvdXRlLVJlY29yZCBdCisJKiBbIEFWUCBdCisKKworCisJKi8KKyAgICAgIHN0cnVjdCBkaWN0X29iamVjdCAqIGNtZDsKKyAgICAgIHN0cnVjdCBkaWN0X2NtZF9kYXRhIGRhdGEgPSB7IAorCTI4OCwgCQkJCQkvKiBDb2RlICovCisJIlB1c2gtUHJvZmlsZS1BbnN3ZXIiLCAJCS8qIE5hbWUgKi8KKwlDTURfRkxBR19SRVFVRVNUIHwgQ01EX0ZMQUdfUFJPWElBQkxFIHwgQ01EX0ZMQUdfRVJST1IsIAkvKiBGaXhlZCBmbGFncyAqLworCUNNRF9GTEFHX1BST1hJQUJMRSAJCQkJCQkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworICAgICAgfTsKKyAgICAgIHN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPSAKKwl7IAkgeyAgIlNlc3Npb24tSWQiLCAJCVJVTEVfRklYRURfSEVBRCwgLTEsIDEgfQorCQkgLHsgICJBdXRoLUFwcGxpY2F0aW9uLUlkIiwgCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkgLHsgICJSZXN1bHQtQ29kZSIsIAkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCSAseyAgIkF1dGgtU2Vzc2lvbi1TdGF0ZSIsIAlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJICx7ICAiT3JpZ2luLUhvc3QiLCAJCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkgLHsgICJPcmlnaW4tUmVhbG0iLCAJCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkgLHsgICJSZWRpcmVjdC1Ib3N0IiwJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkgLHsgICJSZWRpcmVjdC1Ib3N0LVVzYWdlIiwgCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkgLHsgICJSZWRpcmVjdC1NYXgtQ2FjaGUtVGltZSIsIAlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJICx7ICAiUHJveHktSW5mbyIsIAkJUlVMRV9PUFRJT05BTCwgICAtMSwgLTEgfQorCQkgLHsgICJSb3V0ZS1SZWNvcmQiLCAJCVJVTEVfT1BUSU9OQUwsICAgLTEsIC0xIH0KKworCX07CisJCQkKKyAgICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX0NPTU1BTkQsICZkYXRhICwgY3hkeF9kaWN0LCAmY21kKTsKKyAgICAgIFBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGNtZCwgQVZQX0JZX05BTUUgKTsKKyAgICB9CisKKyNlbmRpZiAvKiBUT0RPIC0gTlJHSiAqLworCisgIH0gIC8qIGVuZCBDb21tYW5kIHNlY3Rpb24gKi8KKworCisJCisgIFRSQUNFX0RFQlVHKElORk8sICJFeHRlbnNpb24gJ0RpY3Rpb25hcnkgQ3hEeCcgaW5pdGlhbGl6ZWQiKTsKKyAgcmV0dXJuIDA7Cit9CisKKworRVhURU5TSU9OX0VOVFJZKCJkaWN0X2N4ZHgiLCBjeGR4X2RpY3RfaW5pdCk7CisKZGlmZiAtLWdpdCBhL2NvbnRyaWIvQ3hEeC9kaWN0X2N4ZHgueG1sIGIvY29udHJpYi9DeER4L2RpY3RfY3hkeC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk1NmMyMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvQ3hEeC9kaWN0X2N4ZHgueG1sCkBAIC0wLDAgKzEsNDA3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCFET0NUWVBFIGRpY3Rpb25hcnkgU1lTVEVNICJkaWN0aW9uYXJ5LmR0ZCI+CisKKworPCEtLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyA9PT0gQ3BxRC9EUkMgIC0gIFByb2pldG8gQURSSU1TICAtICBNYXIvMjAxMSA9PT0KKyA9PT0gRGljaW9uYXJpbyBEeC9DeCA9PT0KKyBCYXNlYWRvIG5vICJkaWN0X3NpcCIgZG8gRnJlZURpYW1ldGVyICh3d3cuZnJlZWRpYW1ldGVyLm5ldCkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9yYmVydG8gUiBHb2VzIEpyCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi0tPgorCisKKzxkaWN0aW9uYXJ5PgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqIFZlbmRvcnMgKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHZlbmRvciBpZD0iMTMwMTkiIG5hbWU9IkVUU0kiIC8+CisKKyAgPHZlbmRvciBpZD0iMTA0MTUiIG5hbWU9IjNHUFAiIC8+CisgIAorICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorICA8IS0tICoqKioqKioqKioqKioqKioqIEN4RHggQXBwbGljYXRpb24gKioqKioqKioqKioqKioqKioqKioqLS0+CisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPGFwcGxpY2F0aW9uIGlkPSIxNjc3NzIxNiIgbmFtZT0iRGlhbWV0ZXIgQ3hEeCBBcHBsaWNhdGlvbiIgCisJICAgICAgIHVyaT0iaHR0cDovL3d3dy5jcHFkLmNvbS5iciI+CisgICAgCisgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKyAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqIENvbW1hbmRzICoqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisgCisgICAgPGNvbW1hbmQgbmFtZT0iVXNlci1BdXRob3JpemF0aW9uIiBjb2RlPSIzMDAiID4KKworICAgICAgPHJlcXVlc3RydWxlcz4KKyAgICAgICAgPGZpeGVkPgorCSAgPGF2cHJ1bGUgbmFtZT0iU2Vzc2lvbi1JZCIgbWluaW11bT0iMSIgbWF4aW11bT0iMSIvPgorCTwvZml4ZWQ+CisJCisgICAgICAgIDxyZXF1aXJlZD4KKwkgIDxhdnBydWxlIG5hbWU9IlZlbmRvci1TcGVjaWZpYy1BcHBsaWNhdGlvbi1JZCIgbWF4aW11bT0iMSIgLz4KKwkgIDxhdnBydWxlIG5hbWU9IkF1dGgtU2Vzc2lvbi1TdGF0ZSIgbWF4aW11bT0iMSIgLz4KKwkgIDxhdnBydWxlIG5hbWU9Ik9yaWdpbi1Ib3N0IiBtYXhpbXVtPSIxIiAvPgorCSAgPGF2cHJ1bGUgbmFtZT0iT3JpZ2luLVJlYWxtIiBtYXhpbXVtPSIxIiAvPgorCSAgPGF2cHJ1bGUgbmFtZT0iRGVzdGluYXRpb24tUmVhbG0iIG1heGltdW09IjEiIC8+CisJICA8YXZwcnVsZSBuYW1lPSJVc2VyLU5hbWUiIG1heGltdW09IjEiIC8+CisJICA8YXZwcnVsZSBuYW1lPSJQdWJsaWMtSWRlbnRpdHkiIG1heGltdW09IjEiIC8+CisJICA8YXZwcnVsZSBuYW1lPSJWaXNpdGVkLU5ldHdvcmstSWRlbnRpZmllciIgbWF4aW11bT0iMSIgLz4KKwk8L3JlcXVpcmVkPgorCQorICAgICAgICA8b3B0aW9uYWw+CisJICA8YXZwcnVsZSBuYW1lPSJEZXN0aW5hdGlvbi1Ib3N0IiBtYXhpbXVtPSIxIi8+CisJICA8YXZwcnVsZSBuYW1lPSJTdXBwb3J0ZWQtRmVhdHVyZXMiIC8+CisJICA8YXZwcnVsZSBuYW1lPSJVc2VyLUF1dGhvcml6YXRpb24tVHlwZSIgbWF4aW11bT0iMSIvPgorCSAgPGF2cHJ1bGUgbmFtZT0iVUFSLUZsYWdzIiBtYXhpbXVtPSIxIiAvPgorCSAgPGF2cHJ1bGUgbmFtZT0iQVZQIiAvPgorCSAgPGF2cHJ1bGUgbmFtZT0iUHJveHktSW5mbyIgLz4KKwkgIDxhdnBydWxlIG5hbWU9IlJvdXRlLVJlY29yZCIgLz4KKyAgICAgICAgPC9vcHRpb25hbD4KKyAgICAgIDwvcmVxdWVzdHJ1bGVzPgorICAgICAgCisgICAgICAKKyAgICAgIDxhbnN3ZXJydWxlcz4KKyAgICAgICAgPGZpeGVkPgorCSAgPGF2cHJ1bGUgbmFtZT0iU2Vzc2lvbi1JZCIgIG1pbmltdW09IjEiIG1heGltdW09IjEiLz4KKwk8L2ZpeGVkPgorCQorICAgICAgICA8cmVxdWlyZWQ+CisJICA8YXZwcnVsZSBuYW1lPSJWZW5kb3ItU3BlY2lmaWMtQXBwbGljYXRpb24tSWQiIG1heGltdW09IjEiIC8+CisJICA8YXZwcnVsZSBuYW1lPSJBdXRoLVNlc3Npb24tU3RhdGUiIG1heGltdW09IjEiIC8+CisJICA8YXZwcnVsZSBuYW1lPSJPcmlnaW4tSG9zdCIgbWF4aW11bT0iMSIgLz4KKwkgIDxhdnBydWxlIG5hbWU9Ik9yaWdpbi1SZWFsbSIgbWF4aW11bT0iMSIvPgorCSAgCisJPC9yZXF1aXJlZD4KKwkKKyAgICAgICAgPG9wdGlvbmFsPgorCSAgPGF2cHJ1bGUgbmFtZT0iUmVzdWx0LUNvZGUiIG1heGltdW09IjEiLz4KKwkgIDxhdnBydWxlIG5hbWU9IkV4cGVyaW1lbnRhbC1SZXN1bHQiIG1heGltdW09IjEiLz4KKwkgIDxhdnBydWxlIG5hbWU9IlN1cHBvcnRlZC1GZWF0dXJlcyIgLz4KKwkgIDxhdnBydWxlIG5hbWU9IlNlcnZlci1OYW1lIiBtYXhpbXVtPSIxIi8+CisJICA8YXZwcnVsZSBuYW1lPSJTZXJ2ZXItQ2FwYWJpbGl0aWVzIiBtYXhpbXVtPSIxIi8+CisJICA8YXZwcnVsZSBuYW1lPSJXaWxkY2FyZGVkLUlNUFUiIG1heGltdW09IjEiLz4KKwkgIDxhdnBydWxlIG5hbWU9IkFWUCIgLz4KKwkgIDxhdnBydWxlIG5hbWU9IkZhaWxlZC1BVlAiIC8+CisJICA8YXZwcnVsZSBuYW1lPSJQcm94eS1JbmZvIiAvPgorCSAgPGF2cHJ1bGUgbmFtZT0iUm91dGUtUmVjb3JkIiAvPgorICAgICAgICA8L29wdGlvbmFsPgorCQorICAgICAgPC9hbnN3ZXJydWxlcz4KKyAgICAgIAorICAgIDwvY29tbWFuZD4KKyAgICAKKworCisgICAgPGNvbW1hbmQgbmFtZT0iU2VydmVyLUFzc2lnbm1lbnQiIGNvZGU9IjMwMSIgPgorCisgICAgICA8cmVxdWVzdHJ1bGVzPgorICAgICAgICA8Zml4ZWQ+CisJICA8YXZwcnVsZSBuYW1lPSJTZXNzaW9uLUlkIiBtaW5pbXVtPSIxIiBtYXhpbXVtPSIxIi8+CisJPC9maXhlZD4KKwkKKyAgICAgICAgPHJlcXVpcmVkPgorCSAgPGF2cHJ1bGUgbmFtZT0iVmVuZG9yLVNwZWNpZmljLUFwcGxpY2F0aW9uLUlkIiBtYXhpbXVtPSIxIiAvPgorCSAgPGF2cHJ1bGUgbmFtZT0iQXV0aC1TZXNzaW9uLVN0YXRlIiBtYXhpbXVtPSIxIiAvPgorCSAgPGF2cHJ1bGUgbmFtZT0iT3JpZ2luLUhvc3QiIG1heGltdW09IjEiIC8+CisJICA8YXZwcnVsZSBuYW1lPSJPcmlnaW4tUmVhbG0iIG1heGltdW09IjEiIC8+CisJICA8YXZwcnVsZSBuYW1lPSJEZXN0aW5hdGlvbi1SZWFsbSIgbWF4aW11bT0iMSIgLz4KKwkgIDxhdnBydWxlIG5hbWU9IlNlcnZlci1OYW1lIiBtYXhpbXVtPSIxIi8+CisJICA8YXZwcnVsZSBuYW1lPSJTZXJ2ZXItQXNzaWdubWVudC1UeXBlIiBtYXhpbXVtPSIxIiAvPgorCSAgPGF2cHJ1bGUgbmFtZT0iVXNlci1EYXRhLUFscmVhZHktQXZhaWxhYmxlIiBtYXhpbXVtPSIxIiAvPgorCTwvcmVxdWlyZWQ+CisJCisgICAgICAgIDxvcHRpb25hbD4KKwkgIDxhdnBydWxlIG5hbWU9IkRlc3RpbmF0aW9uLUhvc3QiIG1heGltdW09IjEiLz4KKwkgIDxhdnBydWxlIG5hbWU9IlVzZXItTmFtZSIgbWF4aW11bT0iMSIgLz4KKwkgIDxhdnBydWxlIG5hbWU9IlN1cHBvcnRlZC1GZWF0dXJlcyIgLz4KKwkgIDxhdnBydWxlIG5hbWU9IlB1YmxpYy1JZGVudGl0eSIgLz4KKwkgIDxhdnBydWxlIG5hbWU9IldpbGRjYXJkZWQtUFNJIiBtYXhpbXVtPSIxIi8+CisJICA8YXZwcnVsZSBuYW1lPSJXaWxkY2FyZGVkLUlNUFUiIG1heGltdW09IjEiLz4KKwkgIDwhLS0gYXZwcnVsZSBuYW1lPSJTQ1NDRi1SZXN0b3JhdGlvbi1JbmZvIiBtYXhpbXVtPSIxIi8+IC0tPgorCSAgPCEtLSBhdnBydWxlIG5hbWU9Ik11bHRpcGxlLVJlZ2lzdHJhdGlvbi1JbmRpY2F0aW9uIiBtYXhpbXVtPSIxIi8+IC0tPgorCSAgPCEtLWF2cHJ1bGUgbmFtZT0iU2Vzc2lvbi1Qcmlvcml0eSIgbWF4aW11bT0iMSIvPiAtLT4KKwkgIDxhdnBydWxlIG5hbWU9IkFWUCIgLz4KKwkgIDxhdnBydWxlIG5hbWU9IlByb3h5LUluZm8iIC8+CisJICA8YXZwcnVsZSBuYW1lPSJSb3V0ZS1SZWNvcmQiIC8+CisgICAgICAgIDwvb3B0aW9uYWw+CisgICAgICA8L3JlcXVlc3RydWxlcz4gICAgCisKKworICAgICAgPGFuc3dlcnJ1bGVzPgorICAgICAgICA8Zml4ZWQ+CisJICA8YXZwcnVsZSBuYW1lPSJTZXNzaW9uLUlkIiAgbWluaW11bT0iMSIgbWF4aW11bT0iMSIvPgorCTwvZml4ZWQ+CisJCisgICAgICAgIDxyZXF1aXJlZD4KKwkgIDxhdnBydWxlIG5hbWU9IlZlbmRvci1TcGVjaWZpYy1BcHBsaWNhdGlvbi1JZCIgbWF4aW11bT0iMSIgLz4KKwkgIDxhdnBydWxlIG5hbWU9IkF1dGgtU2Vzc2lvbi1TdGF0ZSIgbWF4aW11bT0iMSIgLz4KKwkgIDxhdnBydWxlIG5hbWU9Ik9yaWdpbi1Ib3N0IiBtYXhpbXVtPSIxIiAvPgorCSAgPGF2cHJ1bGUgbmFtZT0iT3JpZ2luLVJlYWxtIiBtYXhpbXVtPSIxIi8+CisJPC9yZXF1aXJlZD4KKwkKKyAgICAgICAgPG9wdGlvbmFsPgorCSAgPGF2cHJ1bGUgbmFtZT0iUmVzdWx0LUNvZGUiIG1heGltdW09IjEiLz4KKwkgIDxhdnBydWxlIG5hbWU9IkV4cGVyaW1lbnRhbC1SZXN1bHQiIG1heGltdW09IjEiLz4KKwkgIDxhdnBydWxlIG5hbWU9IlVzZXItTmFtZSIgbWF4aW11bT0iMSIgLz4KKwkgIDxhdnBydWxlIG5hbWU9IlN1cHBvcnRlZC1GZWF0dXJlcyIgLz4KKwkgIDwhLS1hdnBydWxlIG5hbWU9IlVzZXItRGF0YSIgbWF4aW11bT0iMSIvPiAtLT4KKwkgIDwhLS1hdnBydWxlIG5hbWU9IkNoYXJnaW5nLUluZm9ybWF0aW9uIiBtYXhpbXVtPSIxIi8+IC0tPgorCSAgPCEtLWF2cHJ1bGUgbmFtZT0iQXNzb2NpYXRlZC1JZGVudGl0aWVzIiBtYXhpbXVtPSIxIi8+IC0tPgorCSAgPCEtLWF2cHJ1bGUgbmFtZT0iTG9vc2UtUm91dGUtSW5kaWNhdGlvbiIgbWF4aW11bT0iMSIvPiAtLT4KKwkgIDwhLS1hdnBydWxlIG5hbWU9IlNDU0NGLVJlc3RvcmF0aW9uLUluZm8iIC8+IC0tPgorCSAgPCEtLWF2cHJ1bGUgbmFtZT0iQXNzb2NpYXRlZC1SZWdpc3RlcmVkLUlkZW50aXRpZXMgIiBtYXhpbXVtPSIxIi8+IC0tPgorCSAgPGF2cHJ1bGUgbmFtZT0iQVZQIiAvPgorCSAgPGF2cHJ1bGUgbmFtZT0iU2VydmVyLU5hbWUiIG1heGltdW09IjEiLz4KKwkgIDxhdnBydWxlIG5hbWU9IkZhaWxlZC1BVlAiIC8+CisJICA8YXZwcnVsZSBuYW1lPSJQcm94eS1JbmZvIiAvPgorCSAgPGF2cHJ1bGUgbmFtZT0iUm91dGUtUmVjb3JkIiAvPgorICAgCisgICAgICAgIDwvb3B0aW9uYWw+CisJCisgICAgICA8L2Fuc3dlcnJ1bGVzPgorICAgICAgCisgICAgPC9jb21tYW5kPgorICAgIAorCisKKworCisgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKyAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqIEFWUHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisJCisgICAgPGF2cCBuYW1lPSJWaXNpdGVkLU5ldHdvcmstSWRlbnRpZmllciIgY29kZT0iNjAwIiB2ZW5kb3ItaWQ9IjEwNDE1IiBtYW5kYXRvcnk9Im11c3QiCisJIG1heS1lbmNyeXB0PSJubyI+CisgICAgICA8dHlwZSB0eXBlLW5hbWU9Ik9jdGV0U3RyaW5nIiAvPgorICAgIDwvYXZwPgorICAgCisgICAgPGF2cCBuYW1lPSJQdWJsaWMtSWRlbnRpdHkiIGNvZGU9IjYwMSIgdmVuZG9yLWlkPSIxMDQxNSIgIG1hbmRhdG9yeT0ibXVzdCIKKwkgbWF5LWVuY3J5cHQ9Im5vIj4KKyAgICAgIDx0eXBlIHR5cGUtbmFtZT0iVVRGOFN0cmluZyIgLz4KKyAgICA8L2F2cD4KKyAgCisgICAgPGF2cCBuYW1lPSJTZXJ2ZXItTmFtZSIgY29kZT0iNjAyIiB2ZW5kb3ItaWQ9IjEwNDE1IiAgbWFuZGF0b3J5PSJtdXN0IgorCSBtYXktZW5jcnlwdD0ibm8iPgorICAgICAgPHR5cGUgdHlwZS1uYW1lPSJVVEY4U3RyaW5nIiAvPgorICAgIDwvYXZwPgorCisgICAgPCEtLSAiU2VydmVyLUNhcGFiaWxpdGVzIiAoNjAzKSB1c2EgYXMgZHVhcyBBVlBzIGEgc2VndWlyIDogICAgLS0+CisgICAgPGF2cCBuYW1lPSJGZWF0dXJlLUxpc3QtSUQiIGNvZGU9IjYyOSIgdmVuZG9yLWlkPSIxMDQxNSIgIG1hbmRhdG9yeT0ibXVzdCIKKwkgbWF5LWVuY3J5cHQ9Im5vIj4gIDwhLS0gdmVyaWZpY2FyIGZsYWdzIC8gTlJHSiAtLT4KKyAgICAgIDx0eXBlIHR5cGUtbmFtZT0iVW5zaWduZWQzMiIgLz4KKyAgICA8L2F2cD4KKworICAgIDxhdnAgbmFtZT0iRmVhdHVyZS1MaXN0IiBjb2RlPSI2MzAiIHZlbmRvci1pZD0iMTA0MTUiICBtYW5kYXRvcnk9Im11c3QiCisJIG1heS1lbmNyeXB0PSJubyI+IDwhLS0gdmVyaWZpY2FyIGZsYWdzIC8gTlJHSiAtLT4KKyAgICAgIDx0eXBlIHR5cGUtbmFtZT0iVW5zaWduZWQzMiIgLz4KKyAgICA8L2F2cD4gICAgCisKKyAgICA8YXZwIG5hbWU9IlNlcnZlci1DYXBhYmlsaXRpZXMiIGNvZGU9IjYwMyIgdmVuZG9yLWlkPSIxMDQxNSIgbWFuZGF0b3J5PSJtdXN0IgorCSBtYXktZW5jcnlwdD0ibm8iPgorICAgICAgPGdyb3VwZWQ+CisJPG9wdGlvbmFsPgorCSAgPGF2cHJ1bGUgbmFtZT0iVmVuZG9yLUlkIiBtYXhpbXVtPSIxIiAvPgorCSAgPGF2cHJ1bGUgbmFtZT0iRmVhdHVyZS1MaXN0LUlEIiBtYXhpbXVtPSIxIiAvPgorCSAgPGF2cHJ1bGUgbmFtZT0iRmVhdHVyZS1MaXN0IiBtYXhpbXVtPSIxIiAvPgorCTwvb3B0aW9uYWw+CisgICAgICA8L2dyb3VwZWQ+CisgICAgPC9hdnA+CisKKyAgICA8YXZwIG5hbWU9Ik1hbmRhdG9yeS1DYXBhYmlsaXR5IiBjb2RlPSI2MDQiIHZlbmRvci1pZD0iMTA0MTUiIG1hbmRhdG9yeT0ibXVzdCIKKwkgbWF5LWVuY3J5cHQ9Im5vIj4KKyAgICAgIDx0eXBlIHR5cGUtbmFtZT0iVW5zaWduZWQzMiIgLz4KKyAgICA8L2F2cD4KKyAgCisgICAgPGF2cCBuYW1lPSJPcHRpb25hbC1DYXBhYmlsaXR5IiBjb2RlPSI2MDUiIHZlbmRvci1pZD0iMTA0MTUiIG1hbmRhdG9yeT0ibXVzdCIKKwkgbWF5LWVuY3J5cHQ9Im5vIj4KKyAgICAgIDx0eXBlIHR5cGUtbmFtZT0iVW5zaWduZWQzMiIgLz4KKyAgICA8L2F2cD4KKyAgCisgICAgPGF2cCBuYW1lPSJVc2VyLURhdGEiIGNvZGU9IjYwNiIgdmVuZG9yLWlkPSIxMDQxNSIgbWFuZGF0b3J5PSJtdXN0IgorCSBtYXktZW5jcnlwdD0ibm8iPgorICAgICAgPHR5cGUgdHlwZS1uYW1lPSJPY3RldFN0cmluZyIgLz4KKyAgICA8L2F2cD4KKyAgCisgICAgPGF2cCBuYW1lPSJTSVAtTnVtYmVyLUF1dGgtSXRlbXMiIGNvZGU9IjYwNyIgdmVuZG9yLWlkPSIxMDQxNSIgbWFuZGF0b3J5PSJtdXN0IgorCSBtYXktZW5jcnlwdD0ibm8iPgorICAgICAgPHR5cGUgdHlwZS1uYW1lPSJVbnNpZ25lZDMyIiAvPgorICAgIDwvYXZwPgorICAKKyAgICA8YXZwIG5hbWU9IlNJUC1BdXRoZW50aWNhdGlvbi1TY2hlbWUiIGNvZGU9IjYwOCIgdmVuZG9yLWlkPSIxMDQxNSIgbWFuZGF0b3J5PSJtdXN0IgorCSBtYXktZW5jcnlwdD0ibm8iPgorICAgICAgPHR5cGUgdHlwZS1uYW1lPSJVVEY4U3RyaW5nIiAvPgorICAgIDwvYXZwPgorICAKKyAgICA8YXZwIG5hbWU9IlNJUC1BdXRoZW50aWNhdGUiIGNvZGU9IjYwOSIgdmVuZG9yLWlkPSIxMDQxNSIgbWFuZGF0b3J5PSJtdXN0IgorCSBtYXktZW5jcnlwdD0ibm8iPgorICAgICAgPHR5cGUgdHlwZS1uYW1lPSJPY3RldFN0cmluZyIgLz4KKyAgICA8L2F2cD4KKyAgCisgICAgPGF2cCBuYW1lPSJTSVAtQXV0aG9yaXphdGlvbiIgY29kZT0iNjEwIiB2ZW5kb3ItaWQ9IjEwNDE1IiBtYW5kYXRvcnk9Im11c3QiCisJIG1heS1lbmNyeXB0PSJubyI+CisgICAgICA8dHlwZSB0eXBlLW5hbWU9Ik9jdGV0U3RyaW5nIiAvPgorICAgIDwvYXZwPgorIAorICAgIDxhdnAgbmFtZT0iU0lQLUF1dGhlbnRpY2F0aW9uLUNvbnRleHQiIGNvZGU9IjYxMSIgdmVuZG9yLWlkPSIxMDQxNSIgbWFuZGF0b3J5PSJtdXN0IgorCSBtYXktZW5jcnlwdD0ibm8iPgorICAgICAgPHR5cGUgdHlwZS1uYW1lPSJPY3RldFN0cmluZyIgLz4KKyAgICA8L2F2cD4KKyAgCisKKworICAgIDwhLS0gIlNJUC1BdXRoLURhdGEtSXRlbSIgKDYxMikgdXNhIGFzIEFWUHMgYSBzZWd1aXIgOiAgICAtLT4KKworICAgIDxhdnAgbmFtZT0iU0lQLUl0ZW0tTnVtYmVyIiBjb2RlPSI2MTMiIHZlbmRvci1pZD0iMTA0MTUiIG1hbmRhdG9yeT0ibXVzdCIKKwkgbWF5LWVuY3J5cHQ9Im5vIj4KKyAgICAgIDx0eXBlIHR5cGUtbmFtZT0iVW5zaWduZWQzMiIgLz4KKyAgICA8L2F2cD4KKyAgCisgICAgPGF2cCBuYW1lPSJDb25maWRlbnRpYWxpdHktS2V5IiBjb2RlPSI2MjUiIHZlbmRvci1pZD0iMTA0MTUiIG1hbmRhdG9yeT0ibXVzdCIKKwkgbWF5LWVuY3J5cHQ9Im5vIj4KKyAgICAgIDx0eXBlIHR5cGUtbmFtZT0iT2N0ZXRTdHJpbmciIC8+CisgICAgPC9hdnA+CisgIAorICAgIDxhdnAgbmFtZT0iSW50ZWdyaXR5LUtleSIgY29kZT0iNjI2IiB2ZW5kb3ItaWQ9IjEwNDE1IiBtYW5kYXRvcnk9Im11c3QiCisJIG1heS1lbmNyeXB0PSJubyI+CisgICAgICA8dHlwZSB0eXBlLW5hbWU9Ik9jdGV0U3RyaW5nIiAvPgorICAgIDwvYXZwPgorICAKKyAgICA8YXZwIG5hbWU9IkRpZ2VzdC1SZWFsbSIgY29kZT0iMTA0IiB2ZW5kb3ItaWQ9IjEwNDE1IiBtYW5kYXRvcnk9Im11c3QiCisJIG1heS1lbmNyeXB0PSJubyI+IDwhLS0gdmVyaWZpY2FyIGZsYWdzIC8gTlJHSiAtLT4KKyAgICAgIDx0eXBlIHR5cGUtbmFtZT0iVVRGOFN0cmluZyIgLz4KKyAgICA8L2F2cD4KKyAKKyAgIDxhdnAgbmFtZT0iRGlnZXN0LUFsZ29yaXRobSIgY29kZT0iMTExIiB2ZW5kb3ItaWQ9IjEwNDE1IiBtYW5kYXRvcnk9Im11c3QiCisJIG1heS1lbmNyeXB0PSJubyI+IDwhLS0gdmVyaWZpY2FyIGZsYWdzIC8gTlJHSiAtLT4KKyAgICAgIDx0eXBlIHR5cGUtbmFtZT0iVVRGOFN0cmluZyIgLz4KKyAgICA8L2F2cD4KKworICAgPGF2cCBuYW1lPSJEaWdlc3QtUW9QIiBjb2RlPSIxMTAiIHZlbmRvci1pZD0iMTA0MTUiIG1hbmRhdG9yeT0ibXVzdCIKKwkgbWF5LWVuY3J5cHQ9Im5vIj4gPCEtLSB2ZXJpZmljYXIgZmxhZ3MgLyBOUkdKIC0tPgorICAgICAgPHR5cGUgdHlwZS1uYW1lPSJVVEY4U3RyaW5nIiAvPgorICAgIDwvYXZwPgorICAKKyAgIDxhdnAgbmFtZT0iRGlnZXN0LUhBMSIgY29kZT0iMTIxIiB2ZW5kb3ItaWQ9IjEwNDE1IiBtYW5kYXRvcnk9Im11c3QiCisJIG1heS1lbmNyeXB0PSJubyI+IDwhLS0gdmVyaWZpY2FyIGZsYWdzIC8gTlJHSiAtLT4KKyAgICAgIDx0eXBlIHR5cGUtbmFtZT0iVVRGOFN0cmluZyIgLz4KKyAgICA8L2F2cD4KKyAgICAgCisKKyAgICA8YXZwIG5hbWU9IlNJUC1EaWdlc3QtQXV0aGVudGljYXRlIiBjb2RlPSI2MzUiIHZlbmRvci1pZD0iMTA0MTUiIAorCSBtYXktZW5jcnlwdD0ibm8iPiA8IS0tIHZlcmlmaWNhciBmbGFncyAvIE5SR0ogLS0+CisgICAgICA8Z3JvdXBlZD4KKwk8cmVxdWlyZWQ+CisJICA8YXZwcnVsZSBuYW1lPSJEaWdlc3QtUmVhbG0iIG1pbmltdW09IjEiIG1heGltdW09IjEiIC8+CisJPC9yZXF1aXJlZD4KKwk8b3B0aW9uYWw+CisJICA8YXZwcnVsZSBuYW1lPSJEaWdlc3QtQWxnb3JpdGhtIiBtYXhpbXVtPSIxIiAvPgorCSAgPGF2cHJ1bGUgbmFtZT0iRGlnZXN0LVFvUCIgbWF4aW11bT0iMSIgLz4KKwkgIDxhdnBydWxlIG5hbWU9IkRpZ2VzdC1IQTEiIG1heGltdW09IjEiIC8+CisJICA8YXZwcnVsZSBuYW1lPSJBVlAiIC8+CisJPC9vcHRpb25hbD4KKyAgICAgIDwvZ3JvdXBlZD4KKworICAgIDwvYXZwPgorICAgIAorICAgIDxhdnAgbmFtZT0iTGluZS1JZGVudGlmaWVyIiBjb2RlPSI1MDAiIHZlbmRvci1pZD0iMTMwMTkiIG1hbmRhdG9yeT0ibXVzdCIKKwkgbWF5LWVuY3J5cHQ9Im5vIj4gPCEtLSB2ZXJpZmljYXIgZmxhZ3MgLyBOUkdKIC0tPgorICAgICAgPHR5cGUgdHlwZS1uYW1lPSJPY3RldFN0cmluZyIgLz4KKyAgICA8L2F2cD4KKyAgICAKKyAgICA8YXZwIG5hbWU9IlNJUC1BdXRoLURhdGEtSXRlbSIgY29kZT0iNjEyIiB2ZW5kb3ItaWQ9IjEwNDE1IiBtYW5kYXRvcnk9Im11c3QiCisJIG1heS1lbmNyeXB0PSJubyI+CisgICAgICA8Z3JvdXBlZD4KKwk8b3B0aW9uYWw+CisJICA8YXZwcnVsZSBuYW1lPSJTSVAtSXRlbS1OdW1iZXIiIG1heGltdW09IjEiIC8+CisJICA8YXZwcnVsZSBuYW1lPSJTSVAtQXV0aGVudGljYXRpb24tU2NoZW1lIiBtYXhpbXVtPSIxIiAvPgorCSAgPGF2cHJ1bGUgbmFtZT0iU0lQLUF1dGhlbnRpY2F0ZSIgbWF4aW11bT0iMSIgLz4KKwkgIDxhdnBydWxlIG5hbWU9IlNJUC1BdXRob3JpemF0aW9uIiBtYXhpbXVtPSIxIiAvPgorCSAgPGF2cHJ1bGUgbmFtZT0iU0lQLUF1dGhlbnRpY2F0aW9uLUNvbnRleHQiIG1heGltdW09IjEiIC8+CisJICA8YXZwcnVsZSBuYW1lPSJDb25maWRlbnRpYWxpdHktS2V5IiBtYXhpbXVtPSIxIiAvPgorCSAgPGF2cHJ1bGUgbmFtZT0iSW50ZWdyaXR5LUtleSIgbWF4aW11bT0iMSIgLz4KKwkgIDxhdnBydWxlIG5hbWU9IlNJUC1EaWdlc3QtQXV0aGVudGljYXRlIiBtYXhpbXVtPSIxIiAvPgorCSAgPGF2cHJ1bGUgbmFtZT0iRnJhbWVkLUlQLUFkZHJlc3MiIG1heGltdW09IjEiIC8+CisJICA8YXZwcnVsZSBuYW1lPSJGcmFtZWQtSVB2Ni1QcmVmaXgiIG1heGltdW09IjEiIC8+CisJICA8YXZwcnVsZSBuYW1lPSJGcmFtZWQtSW50ZXJmYWNlLUlkIiBtYXhpbXVtPSIxIiAvPgorCSAgPGF2cHJ1bGUgbmFtZT0iTGluZS1JZGVudGlmaWVyIiAvPgorCSAgPGF2cHJ1bGUgbmFtZT0iQVZQIiAvPgorCTwvb3B0aW9uYWw+CisgICAgICA8L2dyb3VwZWQ+CisgICAgPC9hdnA+CisgIAorCisKKworICAgIDxhdnAgbmFtZT0iU2VydmVyLUFzc2lnbm1lbnQtVHlwZSIgY29kZT0iNjE0IiBtYW5kYXRvcnk9Im11c3QiCisJIG1heS1lbmNyeXB0PSJubyI+CisgICAgICA8dHlwZSB0eXBlLW5hbWU9IkVudW1lcmF0ZWQiLz4KKyAgICAgIDxlbnVtIG5hbWU9Ik5PX0FTU0lHTk1FTlQiIGNvZGU9IjAiLz4KKyAgICAgIDxlbnVtIG5hbWU9IlJFR0lTVFJBVElPTiIgY29kZT0iMSIvPgorICAgICAgPGVudW0gbmFtZT0iUkVfUkVHSVNUUkFUSU9OIiBjb2RlPSIyIi8+CisgICAgICA8ZW51bSBuYW1lPSJVTlJFR0lTVEVSRURfVVNFUiIgY29kZT0iMyIvPgorICAgICAgPGVudW0gbmFtZT0iVElNRU9VVF9ERVJFR0lTVFJBVElPTiIgY29kZT0iNCIvPgorICAgICAgPGVudW0gbmFtZT0iVVNFUl9ERVJFR0lTVFJBVElPTiIgY29kZT0iNSIvPgorICAgICAgPGVudW0gbmFtZT0iVElNRU9VVF9ERVJFR0lTVFJBVElPTl9TVE9SRV9TRVJWRVJfTkFNRSIgY29kZT0iNiIvPgorICAgICAgPGVudW0gbmFtZT0iVVNFUl9ERVJFR0lTVFJBVElPTl9TVE9SRV9TRVJWRVJfTkFNRSIgY29kZT0iNyIvPgorICAgICAgPGVudW0gbmFtZT0iQURNSU5JU1RSQVRJVkVfREVSRUdJU1RSQVRJT04gIiBjb2RlPSI4Ii8+CisgICAgICA8ZW51bSBuYW1lPSJBVVRIRU5USUNBVElPTl9GQUlMVVJFIiBjb2RlPSI5Ii8+CisgICAgICA8ZW51bSBuYW1lPSJBVVRIRU5USUNBVElPTl9USU1FT1VUIiBjb2RlPSIxMCIvPgorICAgICAgPGVudW0gbmFtZT0iREVSRUdJU1RSQVRJT05fVE9PX01VQ0hfREFUQSIgY29kZT0iMTEiLz4KKyAgICAgIDxlbnVtIG5hbWU9IkFBQV9VU0VSX0RBVEFfUkVRVUVTVCIgY29kZT0iMTIiLz4KKyAgICAgIDxlbnVtIG5hbWU9IlBHV19VUERBVEUgIiBjb2RlPSIxMyIvPgorICAgIDwvYXZwPgorCisKKyAgICA8YXZwIG5hbWU9IlVzZXItRGF0YS1BbHJlYWR5LUF2YWlsYWJsZSIgY29kZT0iNjI0IiBtYW5kYXRvcnk9Im11c3QiCisJIG1heS1lbmNyeXB0PSJubyI+CisgICAgICA8dHlwZSB0eXBlLW5hbWU9IkVudW1lcmF0ZWQiLz4KKyAgICAgIDxlbnVtIG5hbWU9IlVTRVJfREFUQV9OT1RfQVZBSUxBQkxFIiBjb2RlPSIwIi8+CisgICAgICA8ZW51bSBuYW1lPSJVU0VSX0RBVEFfQUxSRUFEWV9BVkFJTEFCTEUiIGNvZGU9IjEiLz4KKyAgICA8L2F2cD4KKyAgCisKKyAgICA8YXZwIG5hbWU9IldpbGRjYXJkZWQtUFNJIiBjb2RlPSI2MzQiIHZlbmRvci1pZD0iMTA0MTUiCisJIG1heS1lbmNyeXB0PSJubyI+CisgICAgICA8dHlwZSB0eXBlLW5hbWU9IlVURjhTdHJpbmciIC8+CisgICAgPC9hdnA+CisgICAKKyAgCisgICAgPGF2cCBuYW1lPSJVc2VyLUF1dGhvcml6YXRpb24tVHlwZSIgY29kZT0iNjIzIiB2ZW5kb3ItaWQ9IjEwNDE1IiBtYW5kYXRvcnk9Im11c3QiCisJIG1heS1lbmNyeXB0PSJubyI+CisgICAgICA8dHlwZSB0eXBlLW5hbWU9IlVURjhTdHJpbmciIC8+CisgICAgPC9hdnA+CisgICAKKworICAKKyAgIDxhdnAgbmFtZT0iV2lsZGNhcmRlZC1JTVBVIiBjb2RlPSI2MzYiIHZlbmRvci1pZD0iMTA0MTUiIG1hbmRhdG9yeT0ibXVzdCIKKwltYXktZW5jcnlwdD0ibm8iPgorICAgICAgPHR5cGUgdHlwZS1uYW1lPSJVVEY4U3RyaW5nIiAvPgorICAgIDwvYXZwPgorCisgICAgPGF2cCBuYW1lPSJVQVItRmxhZ3MiIGNvZGU9IjYzNyIgdmVuZG9yLWlkPSIxMDQxNSIgIG1hbmRhdG9yeT0ibXVzdCIKKwkgbWF5LWVuY3J5cHQ9Im5vIj4KKyAgICAgIDx0eXBlIHR5cGUtbmFtZT0iVW5zaWduZWQzMiIgLz4KKyAgICA8L2F2cD4KKyAgCisgICAgCisgICAgPGF2cCBuYW1lPSJTdXBwb3J0ZWQtRmVhdHVyZXMiIGNvZGU9IjYyOCIgdmVuZG9yLWlkPSIxMDQxNSIKKwkgbWF5LWVuY3J5cHQ9Im5vIj4KKyAgICAgIDxncm91cGVkPgorCTxvcHRpb25hbD4KKwkgIDxhdnBydWxlIG5hbWU9IlZlbmRvci1JZCIgbWF4aW11bT0iMSIgLz4KKwkgIDxhdnBydWxlIG5hbWU9IkZlYXR1cmUtTGlzdC1JRCIgbWF4aW11bT0iMSIgLz4KKwkgIDxhdnBydWxlIG5hbWU9IkZlYXR1cmUtTGlzdCIgbWF4aW11bT0iMSIgLz4KKwk8L29wdGlvbmFsPgorICAgICAgPC9ncm91cGVkPgorICAgIDwvYXZwPgorIAorCisKKyAgPC9hcHBsaWNhdGlvbj4KKworCis8L2RpY3Rpb25hcnk+CisKKwpkaWZmIC0tZ2l0IGEvY29udHJpYi9PcGVuV1JUL0hPV1RPIGIvY29udHJpYi9PcGVuV1JUL0hPV1RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMDdiNDMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL09wZW5XUlQvSE9XVE8KQEAgLTAsMCArMSwzMDUgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAgISEgSU1QT1JUQU5UICEhICAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworVGhlIHVDbGliYyBsaWJyYXJ5IHRoYXQgaXMgc2hpcHBlZCB3aXRoIE9wZW5XUlQgbGFja3Mgc3VwcG9ydCBmb3Igc2V2ZXJhbCBQT1NJWCB0aHJlYWQKK2ZlYXR1cmVzLCBzdWNoIGFzIHB0aHJlYWRfY2xlYW51cF97cHVzaCxwb3B9LCB0aGF0IGFyZSByZXF1aXJlZCBieSB0aGUgZnJlZURpYW1ldGVyCitmcmFtZXdvcmsuCisKK1VudGlsIHRoZXNlIGZlYXR1cmVzIGFyZSBpbmNsdWRlZCBpbiB0aGUgYmFzZSBPcGVuV1JUIHN5c3RlbSwgdGhlIGZyYW1ld29yayB3aWxsIG5vdCAKK2JlaGF2ZSBjb3JyZWN0bHkgb24gdGhpcyBwbGF0Zm9ybS4KKworVGhlcmVmb3JlLCB0aGUgT3BlbldSVCBwb3J0IGlzIE5PVCB1c2FibGUgcHJvcGVybHkgYXQgdGhpcyBtb21lbnQgd2l0aCB1Q2xpYmMuCisKK0EgdGVzdCBzb2Z0d2FyZSBpcyBpbmNsdWRlZCBpbiB0ZXN0X3JlcXVpcmVkIGZvciBjaGVja2luZyBpZiBuZXcgdUNsaWJjIGRpc3RyaWJ1dGlvbnMgCitzdXBwb3J0IHRoZSByZXF1aXJlZCBmZWF0dXJlcy4gWW91J2xsIGhhdmUgdG8gYWRhcHQgdGhlIE1ha2VmaWxlIGFjY29yZGluZyB0byB5b3VyIGVudmlyb25tZW50LgorCitBbiBhbHRlcm5hdGl2ZSBjaG9pY2UgaWYgeW91ciBoYXJkd2FyZSBhbGxvd3MgaXQgaXMgdG8gdXNlIChlKWdsaWJjIGluIHlvdXIgb3BlbndydCBpbWFnZS4KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKworCitUaGlzIEhPV1RPIGRlc2NyaWJlcyBob3cgdG8gZ2VuZXJhdGUgYSBzZXQgb2YgaXBrZyBtb2R1bGVzIGZvciAKK3Byb3ZpZGluZyBzdXBwb3J0IG9mIGZyZWVEaWFtZXRlciBpbiBhbiBPcGVuV1JUIHN5c3RlbS4KKworVGhpcyBIT1dUTyBpcyB3cml0dGVuIGZvciBPcGVuV1JUIDEwLjAzIChCYWNrRmlyZSkgYW5kIG5vIGd1YXJhbnRlZSBpcyBwcm92aWRlZAordGhhdCBpdCB3aWxsIHdvcmsgZm9yIHlvdS4gQmUgcHJlcGFyZWQgdG8gZXZlbnR1YWxseSBicmljayB5b3VyIHJvdXRldXIuLi4KKworVGFibGUgb2YgY29udGVudHM6CiswKSBRdWljayBIT1dUTzogb3B0aW1pc3RpYyBzdGVwLWJ5LXN0ZXAgaW5zdHJ1Y3Rpb25zLgorMSkgUHJlcmVxdWlzaXRlczogZ2V0IHRoZSBPcGVuV1JUIGRldmVsb3BtZW50IGVudmlyb25tZW50IHJlYWR5LgorMikgU3VwcGxpZWQgcGFja2FnZXM6IHVzZSB0aGUgZXhpc3RpbmcgcGFja2FnZXMgd2hlbiBwb3NzaWJsZSAoZ251dGxzLCAuLi4pCiszKSBPdGhlciBkZXBlbmRlbmNpZXM6IHByb3ZpZGUgZm9yIGFkZGl0aW9uYWwgbWlzc2luZyBkZXBlbmRlbmNpZXMgKHNjdHAgLi4uKQorNCkgZnJlZWRpYW1ldGVyIHBhY2thZ2U6IG5vdyBjcmVhdGUgdGhlIGZyZWVEaWFtZXRlciBwYWNrYWdlCis1KSBDb25maWd1cmF0aW9uOiBob3cgdG8gc2V0IHRoZSBjb25maWd1cmF0aW9uIG9uIHRoZSByb3V0ZXIuCisKK1RoaXMgSE9XVE8gd2lsbCBOT1QgY292ZXIgaG93IHRvIGluc3RhbGwgT3BlbldSVCBvbiB5b3VyIGFjY2VzcyBkZXZpY2UsIG5vciAKK2l0cyBiYXNpYyBjb25maWd1cmF0aW9uLiBQbGVhc2UgcmVmZXIgdG8gT3BlbldSVCB3ZWJzaXRlIGZvciB0aGlzIHR5cGUgb2YgSE9XVE9zLgorCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzApIFF1aWNrIEhPV1RPCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitUaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyBzaG91bGQgYWxsb3cgeW91IHRvIHB1dCBmcmVlRGlhbWV0ZXIgb24geW91ciBPcGVuV1JULWNvbXBhdGlibGUgcm91dGVyLgorSW4gY2FzZSBzb21ldGhpbmcgZ29lcyB3cm9uZywgeW91IHNob3VsZCBmb2xsb3cgdGhlIGRldGFpbGVkIGluc3RydWN0aW9ucyBpbiB0aGUgcmVtYWluaW5nIG9mIAordGhpcyBmaWxlLgorCitCZSB3YXJuZWQ6IHBsYXlpbmcgd2l0aCB0aGUgc29mdHdhcmUgaW4geW91ciByb3V0ZXIgbWF5IGJyaWNrIGl0LCBpLmUuIG1ha2UgaXQgdW51c2FibGUgZm9yZXZlci4gCitEbyBpdCBhdCB5b3VyIG93biByaXNrLgorCisxKSBHZXQgdGhlIE9wZW5XUlQgZW52aXJvbm1lbnQ6CiskIGdpdCBjbG9uZSBnaXQ6Ly9uYmQubmFtZS9vcGVud3J0LmdpdAorJCBjZCBvcGVud3J0CisKKzIpIEdldCB0aGUgZmVlZHMKKyQgY3AgZmVlZHMuY29uZi5kZWZhdWx0IGZlZWRzLmNvbmYKKyQgZWNobyAic3JjLWhnIGZyZWVkaWFtZXRlciBodHRwOi8vd3d3LmZyZWVkaWFtZXRlci5uZXQvaGcvZkQtT1dSVC1wYWNrYWdlcyIgPj4gZmVlZHMuY29uZgorJCBzY3JpcHRzL2ZlZWRzIHVwZGF0ZQorJCBzY3JpcHRzL2ZlZWRzIGluc3RhbGwgZnJlZURpYW1ldGVyCisKKzMpIENvbmZpZ3VyZSB5b3VyIGltYWdlCiskIG1ha2UgbWVudWNvbmZpZworKHNldCBUYXJnZXQgU3lzdGVtIGFuZCBUYXJnZXQgUHJvZmlsZSBhcyBuZWVkZWQgZm9yIHlvdXIgZXF1aXBtZW50KQorCistIE5ldHdvcmsgLS0tPgorICAgZnJlZURpYW1ldGVyIChNKQorICAgZnJlZURpYW1ldGVyLXRlc3QgKE0pCisgICB3cGFkICgqKQorICAgd3BhZC1taW5pICggKQorICAgCisKKzQpIFNldCB0aGUgQyBsaWJyYXJ5IHRvIGdsaWJjIGluc3RlYWQgb2YgdUNsaWJjIChicm9rZW4gc3VwcG9ydCwgc2VlICMyNikKKworLSBBZHZhbmNlZCBjb25maWd1cmF0aW9uIG9wdGlvbnMgKGZvciBkZXZlbG9wZXJzKSAtLS0+CisgIC0gVG9vbGNoYWluIE9wdGlvbnMgLS0tLT4KKyAgICBDIExpYnJhcnkgaW1wbGVtZW50YXRpb24gKFVzZSBlZ2xpYmMpCisKKworNSkgQnVpbGQgdGhlIGltYWdlIGFuZCBwYWNrYWdlcywgdGhpcyB0YWtlcyBhIHdoaWxlCiskIG1ha2Ugd29ybGQKKworNikgRXhwb3J0IHRoZSBiaW4vKiBkaXJlY3RvcnkgdGhyb3VnaCBhIHdlYnNlcnZlci4gCisgICBXZSBhc3N1bWUgaXQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly8xOTIuMTY4LjEuMjUvb3dydAorICAgCis3KSBGbGFzaCB0aGUgcm91dGVyIHdpdGggeW91ciBuZXcgaW1hZ2UgLS0gVEhJUyBERVNUUk9ZUyBBTEwgQ09ORklHIE9OIFRIRSBST1VURVIhCiskIHNzaCByb290QDE5Mi4xNjguMS4xCisjIGNkIC90bXAKKyMgd2dldCBodHRwOi8vMTkyLjE2OC4xLjI1L293cnQvb3BlbndydC1icmNtNDd4eC1zcXVhc2hmcy50cngKKyAgICA7OyBjaGFuZ2UgdGhlIGZpbGUgbmFtZSB3aXRoIHlvdXJzCisjIG10ZCAtciB3cml0ZSBvcGVud3J0LWJyY200N3h4LXNxdWFzaGZzLnRyeCBsaW51eAorICAgIDs7IHdhaXQgZm9yIHJlYm9vdAorJCB0ZWxuZXQgMTkyLjE2OC4xLjEKKyMgcGFzc3dkCisjIHN5bmMKKyMgZXhpdAorCis4KSBVcGRhdGUgdGhlIG9wa2cgcm91dGVyJ3MgY29uZmlnIHRvIGdldCB5b3VyIG5ldyBwYWNrYWdlcworc3NoIHJvb3RAMTkyLjE2OC4xLjEKKyMgZWNobyAic3JjL2d6IGxvY2FscmVwbyBodHRwOi8vMTkyLjE2OC4xLjI1L293cnQvcGFja2FnZXMiID4+IC9ldGMvb3BrZy5jb25mIAorIyBvcGtnIHVwZGF0ZQorCis5KSBJbnN0YWxsIGZyZWVEaWFtZXRlciwgeW91J3JlIGRvbmUuIE9wdGlvbm5hbHksIGluc3RhbGwgYWxzbyBjZXJ0dG9vbCBvbiB0aGUgcm91dGVyIGJlZm9yZSwgdG8gCisgICBnZW5lcmF0ZSB0aGUgVExTIGNlcnRpZmljYXRlIGF1dG9tYXRpY2FsbHkuCisjIG9wa2cgaW5zdGFsbCBmcmVlRGlhbWV0ZXIKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorMSkgUHJlcmVxdWlzaXRlczoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworV2Ugd2lsbCBmaXJzdCBuZWVkIGEgd29ya2luZyBPcGVuV1JUIHRvb2xjaGFpbiBlbnZpcm9ubWVudC4gWW91IGNhbiByZXRyaWV2ZQorcHJlLWNvbXBpbGVkIGJpbmFyaWVzIG9mIHN1Y2ggdG9vbGNoYWlucyAoIkltYWdlIGJ1aWxkZXIiKSBvbiB0aGUgT3BlbldSVCB3ZWJzaXRlLiBBbnl3YXksCitpbiBjYXNlIHRoZSBhcmNoaXRlY3R1cmUgeW91IGFyZSBpbnRlcmVzdGVkIGluIGlzIG5vdCBsaXN0ZWQsIHlvdSBjYW4gYnVpbGQKK3RoZSBmdWxsIHRvb2xjaGFpbiBmcm9tIHNvdXJjZS4gVGhpcyBpcyB0aGUgcGF0aCB3ZSBhcmUgZm9sbG93aW5nIGluIHRoaXMgSE9XVE8uCisKK2EpIFJldHJpZXZlIHRoZSBsYXRlc3QgT3BlbldSVCBzb3VyY2UsIHVzaW5nIHN1YnZlcnNpb24gb3IgZ2l0LgorU2luY2UgSSBoYXZlIHRvIGdvIHRocm91Z2ggYSBwcm94eSwgSSB1c2UgdGhlIGxhdGVyIGhlcmUsIHN2biBiZWluZyBxdWl0ZSBhbm5veWluZyB3aXRoIHByb3hpZXMuCitOb3RlLCB0aGUgZm9sbG93aW5nIGNvbW1hbmRzIG11c3Qgbm90IGJlIHJ1biBhcyByb290LgorJCBnaXQgY2xvbmUgZ2l0Oi8vbmJkLm5hbWUvb3BlbndydC5naXQKKyAoTm90ZTogeW91IG1pZ2h0IGluc3RlYWQgdXNlICJiYWNrZmlyZS5naXQiIGlmIHlvdSB3YW50IHRvIHN0aWNrIHdpdGggYW4gT3BlbldSVCByZWxlYXNlLikKKyQgY2Qgb3BlbndydAorJCBjcCBmZWVkcy5jb25mLmRlZmF1bHQgZmVlZHMuY29uZgorCitiKSBJZiB5b3UgYXJlIHVzaW5nIGdpdCwgeW91IGhhdmUgdG8gZWRpdCB0aGUgZmVlZHMuY29uZiBmaWxlIHRvIHVzZSBnaXQgYXMgd2VsbCBmb3IgcGFja2FnZXMuCitEbyB0aGUgZm9sbG93aW5nIG1vZGlmaWNhdGlvbnMgaW4gdGhpcyBjYXNlOgorJCB2aSBmZWVkcy5jb25mCisgQ29tbWVudCBvdXQgdGhpcyBsaW5lOgorc3JjLXN2biBwYWNrYWdlcyBodHRwczovL3N2bi5vcGVud3J0Lm9yZy9vcGVud3J0L3BhY2thZ2VzCisgQWRkIHRoaXMgbGluZSBpbnN0ZWFkOgorc3JjLWdpdCBwYWNrYWdlcyBnaXQ6Ly9uYmQubmFtZS9wYWNrYWdlcy5naXQKKworIFlvdSBjYW4gbGVhdmUgdW5jb21tZW50ZWQgdGhlIGx1Y2kgKGZvciBHTlVUTFMpIGFuZCBYd3J0ICh3ZWJpZikgcmVwb3NpdG9yaWVzLiBTaW5jZSB0aGVzZSByZXBvc2l0b3JpZXMKK3VzZSBzdm4gb3ZlciBodHRwLCB5b3UgY2FuIHVzZSBzdWJ2ZXJzaW9uIGV2ZW4gaWYgeW91IGFyZSBiZWhpbmQgYSBwcm94eS4KKworYykgVGhlbiBpc3N1ZSB0aGUgZm9sbG93aW5nIGNvbW1hbmQgdG8gdXBkYXRlIHRoZSBwYWNrYWdlIGxpc3Q6CiskIHNjcmlwdHMvZmVlZHMgdXBkYXRlCisKK2QpIE5vdywgbGV0J3MgYWxyZWFkeSBjcmVhdGUgdGhlIHRvb2xjaGFpbiBhbmQgYmFzaWMgaW1hZ2UuCiskIG1ha2UgbWVudWNvbmZpZworCitUaGlzIHdpbGwgb3BlbiBhIG1lbnUgZm9yIHlvdS4gWW91IG11c3Qgc2VsZWN0IHRoZSB0YXJnZXQgeW91IGFyZSBidWlsZGluZyBmb3IuCitTZWUgaHR0cDovL3dpa2kub3BlbndydC5vcmcvdG9oL3N0YXJ0IGZvciB0aGUgdGFibGUgb2YgaGFyZHdhcmUgYW5kIGFzc29jaWF0ZWQgaW5mb3JtYXRpb24uCitJbiBteSBjYXNlLCBJIGFtIHVzaW5nIGEgQnVmZmFsbyBXWlItSFAtRzMwME5IIHJvdXRlci4gSSB0aGVyZWZvcmUgc2VsZWN0IHRoZXNlIG9wdGlvbnM6CistIFRhcmdldCBTeXN0ZW0gLS0tPgorICAgQXRoZXJvcyBBUjcxeHgvQVI3MjQwL0FSOTEzeAorLSBUYXJnZXQgUHJvZmlsZSAtLS0+CisgICBCdWZmYWxvIFdaUi1IUC1HMzAwTkgKKyAgIAorRm9yIG1hbnkgcm91dGV1cnMsIHRoZSByZWNvbW1lbmRlZCBrZXJuZWwgaXMgYSAyLjR4IHZlcnNpb24uIEkgaGF2ZSBOT1QgdHJpZWQgd2l0aCBzdWNoIGtlcm5lbCwKK2FuZCB0aGUgU0NUUCBzdXBwb3J0IGlzIGxpa2VseSB0byBiZSBkaWZmZXJlbnQgaW4gdGhpcyBnZW5lcmF0aW9uIG9mIGtlcm5lbHMuIEkgc3Ryb25nbHkgcmVjb21tZW5kCit0byBnbyB3aXRoIGEgMi42eCBrZXJuZWwsIHdoZW5ldmVyIHBvc3NpYmxlLiAKKyAgIAorZSkgQXMgcGVyIGZyZWVEaWFtZXRlciB0aWNrZXQgIzI2LCB5b3UgYWxzbyBuZWVkIHRvIGNoYW5nZSB0aGUgbGlicmFyeSB0byBnbGliYyBpbnN0ZWFkIG9mIHVDbGliYy4KK0NoYW5nZSB0aGUgb3B0aW9uIGFzIGZvbGxvdzoKKworLSBBZHZhbmNlZCBjb25maWd1cmF0aW9uIG9wdGlvbnMgKGZvciBkZXZlbG9wZXJzKSAtLS0+CisgIC0gVG9vbGNoYWluIE9wdGlvbnMgLS0tLT4KKyAgICBDIExpYnJhcnkgaW1wbGVtZW50YXRpb24gKFVzZSBlZ2xpYmMpCisKK2YpIE9uY2UgY29uZmlndXJlZCwgY3JlYXRlIHRoZSB0b29sY2hhaW4gYW5kIGRlZmF1bHQgaW1hZ2UgKHRoaXMgdGFrZXMgYSB3aGlsZSk6CiskIG1ha2Ugd29ybGQKKworQWZ0ZXIgdGhpcyBjb21tYW5kIGNvbXBsZXRlcyBzdWNjZXNzZnVsbHksIHlvdXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgcmVhZHkuCitUaGUgcmVzdWx0aW5nIGltYWdlIGFuZCBwYWNrYWdlcyBhcmUgc3RvcmVkIGluIHRoZSAiYmluLyIgc3ViZGlyZWN0b3J5LgorSXQgaXMgdmVyeSBjb252ZW5pZW50IGlmIHlvdSBtYWtlIHRoaXMgcmVwb3NpdG9yeSBhdmFpbGFibGUgaW4gaHR0cCB0byB5b3VyIHJvdXRldXIuCisKK1lvdSBzaG91bGQgcHJvYmFibHkgdHJ5IGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gZmxhc2ggeW91ciBkZXZpY2Ugd2l0aCB0aGUgaW1hZ2UgeW91IGhhdmUgZ2VuZXJhdGVkLgorSWYgdGhlIGRlZmF1bHQgYmFzaWMgaW1hZ2UgZG9lcyBub3Qgd29yaywgaXQgaXMgcHJvYmFibHkgbm90IHdvcnRoIGFkZGluZyBuZXcgcHJvYmxlbXMgb24gdG9wIG9mIGl0LgorCitGb3IgdHJvdWJsZXNob290aW5nLCBwbGVhc2UgY29uc3VsdCBPcGVuV1JUIGRvY3VtZW50YXRpb24gZGlyZWN0bHkuCisibWFrZSBwcmVyZXEiIG1heSBoZWxwIHlvdSBidWlsZGluZyB0aGUgaW5pdGlhbCBpbWFnZSBhbHNvLgorU2VlIGh0dHA6Ly9kb3dubG9hZHMub3BlbndydC5vcmcvZG9jcy9idWlsZHJvb3QtZG9jdW1lbnRhdGlvbi5odG1sIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCitjb25jZXJuaW5nIHRoaXMgc3RlcC4KKworWW91IHNob3VsZCBub3cgYmUgYWJsZSB0byBsb2dpbiBvbiB5b3VyIHJvdXRldXIgd2l0aCB0ZWxuZXQgKGZpcnN0IHRpbWUpIG9yIHNzaCAoYWZ0ZXIgc2V0dGluZyBhIHBhc3N3b3JkKS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorMikgU3VwcGxpZWQgcGFja2FnZXM6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZXJlIGFyZSBzb21lIGRlcGVuZGVuY2llcyBvZiBmcmVlRGlhbWV0ZXIgYWxyZWFkeSBhdmFpbGFibGUgaW4gdGhlIE9wZW5XUlQgcGFja2FnZXMgcmVwb3NpdG9yeS4gCitZb3UgY2FuIGNoZWNrIGZvciB0aGUgYXZhaWxhYmxlIHBhY2thZ2VzIHdpdGggdGhlIHNjcmlwdDoKKyQgLi9zY3JpcHRzL2ZlZWRzIHNlYXJjaCA8cGFja2FnZT4KKworV2Ugd2lsbCBub3cgZGVzY3JpYmUgaG93IHRvIGluc3RhbGwgdGhlc2UgZGVwZW5kZW5jaWVzLiBBdCB0aGUgdGltZSB0aGlzIEhPV1RPIGlzIHdyaXR0ZW4sIAordGhlIE9wZW5XUlQgcmVwb3NpdG9yaWVzIGNvbnRhaW5zIHBhY2thZ2VzIGZvciBzY3RwLCBpcHY2LCBnbnV0bHMsIHB0aHJlYWRzIGFuZCBob3N0YXBkLiAKK0ZvbGxvdyB0aGVzZSBpbnN0cnVjdGlvbnMgdG8gYnVpbGQgdGhlbS4KKworQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBmaW5kIHRoZXNlIHBhY2thZ2VzIHByZS1jb21waWxlZCBpbiB0aGUgT3BlbldSVCBwYWNrYWdlcyByZXBvc2l0b3J5LgorCithKSBBZGQgdGhlIHBhY2thZ2VzCiskIHNjcmlwdHMvZmVlZHMgaW5zdGFsbCBsaWJnbnV0bHMKKyQgc2NyaXB0cy9mZWVkcyBpbnN0YWxsIHNjdHAKKworYikgU2VsZWN0IHRoZSBmb2xsb3dpbmcgY29tcG9uZW50cyBpbiB0aGUgbWVudToKKyQgbWFrZSBtZW51Y29uZmlnCistIEJhc2Ugc3lzdGVtIC0tLT4KKyAgIGxpYnB0aHJlYWQgKE0pCisgICAKKy0gTmV0d29yayAtLS0+CisgICBzY3RwIChNKQorICAgaG9zdGFwZCAoTSkKKyAgIHdwYWQtbWluaSAoICkKKworLSBMaWJyYXJpZXMgLS0tPgorICAgU1NMIC0tLT4KKyAgICAgbGliZ251dGxzIChNKQorICAgCistIEtlcm5lbCBtb2R1bGVzIC0tLT4KKyAgIE5ldHdvcmsgU3VwcG9ydCAtLS0+CisgICAgIGttb2QtaXB2NiAoTSkKKyAgICAgCitRdWl0IGFuZCBzYXZlIHRoZSBuZXcgY29uZmlnLCB0aGVuOgorJCBtYWtlIHdvcmxkCisKK1RoaXMgd2lsbCBhZGQgYSBidW5jaCBvZiBtb2R1bGVzIGluIHlvdXIgYmluIGRpcmVjdG9yeSB0aGF0IHdpbGwgYmUgcmVxdWlyZWQgZm9yIGZyZWVEaWFtZXRlci4KK1NpbmNlIHdlIGFyZSByZW1vdmluZyB0aGUgd3BhZC1taW5pIGRhZW1vbiBmcm9tIHRoZSBiYXNlIGltYWdlLCB0aGlzIGltYWdlICh0cnggb3IgYmluIGZpbGUpIGlzIGFsc28gcmVjb21waWxlZC4KKworTm90ZSB0aGF0IGlmIHlvdSBhcmUgc2V0dGluZyB5b3VyIGRldmljZSBhcyBXUEEgc3VwcGxpY2FudCBhbHNvICh3aXJlbGVzcyBjbGllbnQpLCB5b3UgbXVzdCBzZWxlY3Qgd3BhZCBpbnN0ZWFkIG9mIGhvc3RhcGQuCisoaW4gYW55IGNhc2UsIHRoZSAtbWluaSB2ZXJzaW9uIGlzIG5vdCBzdWl0YWJsZSBzaW5jZSB3ZSB3aWxsIHVzZSB0aGUgUkFESVVTIGF1dGhlbnRpY2F0aW9uKS4KKworCitZb3Ugc2hvdWxkIG5vdyByZWZsYXNoIHlvdXIgcm91dGV1ciB3aXRoIHRoZSBuZXcgZmlybXdhcmUgaW1hZ2UuIFRoZSBzaW1wbGVzdCB3YXkgdG8gYWNoaWV2ZSBpZiB5b3VyIHJvdXRldXIgaGFzIGVub3VnaAorZmxhc2ggbWVtb3J5IGlzIHRvOgorLSBjb3B5IHRoZSBuZXcgdHJ4IGltYWdlIHRvIHlvdXIgcm91dGV1cidzIC90bXAgKHVzaW5nIHdnZXQgb3Igc2NwKQorLSBydW4gdGhpcyBjb21tYW5kIChvbiB0aGUgZGV2aWNlKSAtLSByZXBsYWNlIDxuZXdmaWxlLnRyeD4gd2l0aCB5b3VyIGFjdHVhbCBmaWxlbmFtZToKKyByb290QE9wZW5XcnQ6fiMgbXRkIC1yIHdyaXRlIDxuZXdmaWxlLnRyeD4gbGludXgKKworV0FSTklORzogdGhpcyB3aWxsIGVyYXNlIHlvdXIgZXhpc3RpbmcgY29uZmlndXJhdGlvbiBvbiB0aGUgcm91dGV1ci4gCitJbiBjYXNlIHlvdSBuZWVkIHRvIHNhdmUgaXQsIHlvdSBtYXkgdHJ5IHRoZSBzeXN1cGdyYWRlIGNvbW1hbmQgaW5zdGVhZC4KKworVGhpcyB3aWxsIHJlYm9vdCB0aGUgZGV2aWNlIGFmdGVyIHdyaXRpbmcgdGhlIG5ldyBpbWFnZSBmaWxlLgorQWZ0ZXJ3YXJkcywgaWYgeW91IGhhdmUgc2V0IHVwIHRoZSBodHRwIHNlcnZlciBvbiB5b3VyIGRldmVsb3BtZW50IG1hY2hpbmUgcHJvcGVybHkgCisobGV0J3MgYXNzdW1lIGl0IGhhcyBJUCBhZGRyZXNzIDE5Mi4xNjguMS4yNSkKK3lvdSBjYW4gcnVuIHRoZSBmb2xsb3dpbmcgY29tbWFuZCBvbiB5b3VyIHJvdXRlcjoKKyByb290QE9wZW5XcnQ6fiMgZWNobyAic3JjL2d6IG15ZGV2IGh0dHA6Ly8xOTIuMTY4LjEuMjUvcGFja2FnZXMiID4+IC9ldGMvb3BrZy5jb25mIAorIHJvb3RAT3BlbldydDp+IyBvcGtnIHVwZGF0ZQorCitJbnN0YWxsIHRoZSBuZXdseSBjb21waWxlZCBwYWNrYWdlcyB3aXRoOgorIHJvb3RAT3BlbldydDp+IyBvcGtnIGluc3RhbGwga21vZC1pcHY2IGhvc3RhcGQgbGlicHRocmVhZCBzY3RwCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzMpIE1pc3NpbmcgcGFja2FnZXM6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1VQREFURTogU3RhcnRpbmcgZnJvbSByZXZpc2lvbiByMjI5MTcsIHNjdHAgYW5kIGttb2Qtc2N0cCBhcmUgaW5jbHVkZWQgaW4gdGhlIE9wZW5XUlQgZGlzdHJpYnV0aW9uLCBhbmQgaGF2ZSBiZWVuIHJlbW92ZWQKK2Zyb20gZnJlZURpYW1ldGVyIHBhY2thZ2UuIE9uZSBtYXkgY29uc2lkZXIgdXNpbmcgYSBmcmVlRGlhbWV0ZXIgcGFja2FnZSBwcmlvciB0byAyMDEwLzA5LzA1IGluIG9yZGVyIHRvIGdldCB0aGUgc2N0cCAKK3BhY2thZ2UsIG9yIGEgbW9yZSByZWNlbnQgT3BlbldSVCBlbnZpcm9ubWVudC4gCisKK1BSRVZJT1VTIFNJVFVBVElPTjogSWYgeW91IGFyZSB1c2luZyBjb21wb25lbnRzIHByaW9yIHRvIDIwMTAvMDkvMDUsIHRoZSBmb2xsb3dpbmcgYXBwbGllczoKK1A6IAorUDogVGhlcmUgYXJlIG90aGVyIGRlcGVuZGVuY2llcyBmb3IgZnJlZURpYW1ldGVyIHRoYXQgYXJlIG5vdCBwcm92aWRlZCBieSBPcGVuV1JUIHBhY2thZ2VzLiAKK1A6IEZvciBjb252ZW5pZW5jZSwgd2UgaW5jbHVkZSB0aGVzZSBtZXRhLXBhY2thZ2VzIGluIHRoZSBmcmVlRGlhbWV0ZXIgZGlzdHJpYnV0aW9uIC0tIGJ1dCB0aGV5CitQOiBtaWdodCBub3QgYmUgdXAtdG8tZGF0ZS4KK1A6IAorUDogYSkgQWRkaW5nIHRoZSBjb250cmlidXRlZCBkaXJlY3RvcnkgdG8gdGhlIGZlZWRzCitQOiAgIEFkZCB0aGUgZm9sbG93aW5nIGxpbmUgaW4geW91ciBmZWVkcy5jb25mIGZpbGU6CitQOiBzcmMtbGluayBmcmVlZGlhbWV0ZXIgL3BhdGgvdG8vZnJlZWRpYW1ldGVyL2NvbnRyaWIvT3BlbldSVC9wYWNrYWdlcy8KK1A6IAorUDogVGhlbiBydW46IAorUDogJCBzY3JpcHRzL2ZlZWRzIHVwZGF0ZQorUDogCitQOiBUaGlzIHNob3VsZCBhbGxvdyB5b3UgdG8gaW5zdGFsbCB0aGUgbWlzc2luZyBkZXBlbmRlbmNpZXMgYXMgZm9sbG93OgorUDogCitQOiAKK1A6IGIpIFNDVFAgbGlicmFyeSAobm90ZTogeW91IG1pZ2h0IGFsdGVybmF0aXZlbHkgY29tcGlsZSBmcmVlRGlhbWV0ZXIgd2l0aG91dCBTQ1RQIHN1cHBvcnQpLgorUDogJCBzY3JpcHRzL2ZlZWRzIGluc3RhbGwgc2N0cAorUDogCitQOiAKK1A6IGMpIFNlbGVjdCB0aGVzZSBjb21wb25lbnRzIGluIHRoZSBtZW51OgorUDogJCBtYWtlIG1lbnVjb25maWcKK1A6IC0gTGlicmFyaWVzIC0tLT4KK1A6ICAgIHNjdHAgKE0pCitQOiAKK1A6IFF1aXQgYW5kIHNhdmUgdGhlIG5ldyBjb25maWcsIHRoZW46CitQOiAkIG1ha2Ugd29ybGQKK1A6IAorUDogCitQOiBkKSBJbnN0YWxsIHRoaXMgb24gdGhlIHJvdXRlciBhcyB3ZWxsOgorUDogIHJvb3RAT3BlbldydDp+IyBvcGtnIHVwZGF0ZQorUDogIHJvb3RAT3BlbldydDp+IyBvcGtnIGluc3RhbGwgc2N0cAorCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzQpIGZyZWVkaWFtZXRlciBwYWNrYWdlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitOb3csIHlvdXIgZW52aXJvbm1lbnQgc2hvdWxkIGJlIHJlYWR5IHRvIGNvbXBpbGUgdGhlIGZyZWVEaWFtZXRlciBpcGtnIHBhY2thZ2UuCiskIHNjcmlwdHMvZmVlZHMgaW5zdGFsbCBmcmVlRGlhbWV0ZXIKKworTm90ZSB0aGF0IGluIG9yZGVyIHRvIGJ1aWxkIHRoaXMgcGFja2FnZSwgeW91IG5lZWQgdG8gaGF2ZSBjbWFrZSAmIGZsZXggb24geW91ciBjb21waWxhdGlvbiBtYWNoaW5lLgorCiskIG1ha2UgbWVudWNvbmZpZworLSBOZXR3b3JrIC0tLT4KKyAgIGZyZWVEaWFtZXRlciAoTSkKKyAgIGZyZWVEaWFtZXRlci10ZXN0IChNKQorICAgCitRdWl0IGFuZCBzYXZlIHRoZSBuZXcgY29uZmlnLCB0aGVuOgorJCBtYWtlIHdvcmxkCisKK09uIHlvdXIgcm91dGVyLCBydW46CisjIG9wa2cgdXBkYXRlCisjIG9wa2cgaW5zdGFsbCBmcmVlRGlhbWV0ZXIKKworCisKZGlmZiAtLWdpdCBhL2NvbnRyaWIvT3BlbldSVC9vdGhlcnMvRC1MaW5rX0RJUi0zMzBfbmV0Y29uZmlnLnBhdGNoIGIvY29udHJpYi9PcGVuV1JUL290aGVycy9ELUxpbmtfRElSLTMzMF9uZXRjb25maWcucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM1NTU2YQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvT3BlbldSVC9vdGhlcnMvRC1MaW5rX0RJUi0zMzBfbmV0Y29uZmlnLnBhdGNoCkBAIC0wLDAgKzEsMzUgQEAKK2RpZmYgLS1naXQgYS90YXJnZXQvbGludXgvYnJjbTQ3eHgvYmFzZS1maWxlcy9ldGMvaW5pdC5kL25ldGNvbmZpZyBiL3RhcmdldC9saW51eC9icmNtNDd4eC9iYXNlLWZpbGVzL2V0Yy9pbml0LmQvbmV0Y29uZmlnCitpbmRleCBkNzgzOWI2Li42NDQ2NDgzIDEwMDc1NQorLS0tIGEvdGFyZ2V0L2xpbnV4L2JyY200N3h4L2Jhc2UtZmlsZXMvZXRjL2luaXQuZC9uZXRjb25maWcKKysrKyBiL3RhcmdldC9saW51eC9icmNtNDd4eC9iYXNlLWZpbGVzL2V0Yy9pbml0LmQvbmV0Y29uZmlnCitAQCAtMTUwLDYgKzE1MCwzMCBAQCBzdGFydCgpIHsKKyAJCQkJfQorIAkJCX0KKyAJCX0KKysgICAgICAgICAgICAgICAgaWYgKG1vZGVsID09ICJELUxpbmsgRElSLTMzMCIpIHsgIyBib2FyZHR5cGUgaXMgMHgwNDcyLCBzbyB3ZSBuZWVkIHRvIHJlc2V0IHRoZSBwYXJhbWV0ZXJzCisrCQkgICAjIFRoZSBzd2l0Y2ggaXMgb24gZXRoMSwgdGhpcyBzY3JpcHQgZGVmYXVsdHMgdG8gc3dpdGNoIG9uIGV0aDAsIHNvIHdlIHdyaXRlIHRoZSB2YWx1ZXMgZGlyZWN0bHkgaW5zdGVhZC4KKysgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICIjIyMjIERJUi0zMzA6IGV0aDEgbXVzdCBiZSB1cCBmb3IgY29uZmlndXJpbmcgdGhlIHN3aXRjaCAiCisrICAgICAgICAgICAgICAgICAgICAgICBwcmludCAiY29uZmlnIGludGVyZmFjZSBzd2l0Y2hwb3J0IgorKyAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgIiBvcHRpb24gaWZuYW1lIFwiZXRoMVwiIgorKyAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgIiBvcHRpb24gcHJvdG8gbm9uZSIKKysgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICIiCisrCQkgICAgICAgIHByaW50ICJjb25maWcgc3dpdGNoIGV0aDEiCisrICAgICAgICAgICAgICAgICAgICAgICBwcmludCAiIG9wdGlvbiBlbmFibGUgICAxIgorKyAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgIiIKKysgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICJjb25maWcgc3dpdGNoX3ZsYW4gZXRoMV8wIgorKyAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgIiBvcHRpb24gZGV2aWNlICAgXCJldGgxXCIiCisrICAgICAgICAgICAgICAgICAgICAgICBwcmludCAiIG9wdGlvbiB2bGFuICAgICAwIgorKyAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgIiBvcHRpb24gcG9ydHMgICAgXCIwIDEgMiAzIDV0XCIiCisrICAgICAgICAgICAgICAgICAgICAgICBwcmludCAiIgorKyAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgImNvbmZpZyBzd2l0Y2hfdmxhbiBldGgxXzEiCisrICAgICAgICAgICAgICAgICAgICAgICBwcmludCAiIG9wdGlvbiBkZXZpY2UgICBcImV0aDFcIiIKKysgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICIgb3B0aW9uIHZsYW4gICAgIDEiCisrICAgICAgICAgICAgICAgICAgICAgICBwcmludCAiIG9wdGlvbiBwb3J0cyAgICBcIjQgNXRcIiIKKysgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICIiCisrICAgICAgICAgICAgICAgICAgICAgICAgY1sibGFuX2lmbmFtZSJdID0gImV0aDAuMCIKKysgICAgICAgICAgICAgICAgICAgICAgICBjWyJ3YW5faWZuYW1lIl0gPSAiZXRoMC4xIgorKyAgICAgICAgICAgICAgICB9CisrCisgCQkjIEJ1ZmZhbG8gV0JSLUIxMSBhbmQgQnVmZmFsbyBXQlItRzU0CisgCQlpZiAobnZyYW1bImJvYXJkdHlwZSJdID09ICJiY205NDcxMGFwIikgeworIAkJCWNbInZsYW4wcG9ydHMiXSA9ICIwIDEgMiAzIDQgNXUiCmRpZmYgLS1naXQgYS9jb250cmliL09wZW5XUlQvcGFja2FnZXMvZnJlZURpYW1ldGVyL01ha2VmaWxlIGIvY29udHJpYi9PcGVuV1JUL3BhY2thZ2VzL2ZyZWVEaWFtZXRlci9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDY1MDJjCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9PcGVuV1JUL3BhY2thZ2VzL2ZyZWVEaWFtZXRlci9NYWtlZmlsZQpAQCAtMCwwICsxLDI0MSBAQAorIworIyBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpCisjCisjIENvcHlyaWdodCAoYykgMjAxMywgV0lERSBQcm9qZWN0IGFuZCBOSUNUCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFNlZSBMSUNFTlNFIGZpbGUgZnJvbSBmcmVlRGlhbWV0ZXIgc291cmNlIHBhY2thZ2UgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisjCisKK2luY2x1ZGUgJChUT1BESVIpL3J1bGVzLm1rCisKK1BLR19OQU1FOj1mcmVlRGlhbWV0ZXIKK1BLR19SRVY6PTY5NgorUEtHX1ZFUlNJT046PXIkKFBLR19SRVYpCitQS0dfUkVMRUFTRTo9MQorCitQS0dfU09VUkNFX1BST1RPOj1oZworUEtHX1NPVVJDRV9WRVJTSU9OOj0kKFBLR19SRVYpCitQS0dfU09VUkNFX1NVQkRJUjo9JChQS0dfTkFNRSktJChQS0dfVkVSU0lPTikKK1BLR19TT1VSQ0U6PSQoUEtHX05BTUUpLSQoUEtHX1ZFUlNJT04pLnRhci5negorUEtHX1NPVVJDRV9VUkw6PWh0dHA6Ly93d3cuZnJlZWRpYW1ldGVyLm5ldC9oZy9mcmVlRGlhbWV0ZXIKKyMgUEtHX01ENVNVTTo9CisKK1BLR19GSVhVUDo9bGlidG9vbAorUEtHX0lOU1RBTEw6PTEKKworaW5jbHVkZSAkKElOQ0xVREVfRElSKS9wYWNrYWdlLm1rCisKK2RlZmluZSBQYWNrYWdlL2ZyZWVEaWFtZXRlcgorICBTRUNUSU9OOj1mcmVlRGlhbWV0ZXIKKyAgQ0FURUdPUlk6PU5ldHdvcmsKKyAgVElUTEU6PWZyZWVEaWFtZXRlcgorICBVUkw6PWh0dHA6Ly93d3cuZnJlZWRpYW1ldGVyLm5ldAorICBERVBFTkRTOj0rc2N0cCArbGliZ251dGxzICtsaWJwdGhyZWFkICtrbW9kLWlwdjYKK2VuZGVmCisKK2RlZmluZSBQYWNrYWdlL2ZyZWVEaWFtZXRlci10ZXN0CisgIFNFQ1RJT046PWZyZWVEaWFtZXRlcgorICBDQVRFR09SWTo9TmV0d29yaworICBUSVRMRTo9ZnJlZURpYW1ldGVyLXRlc3QKKyAgVVJMOj1odHRwOi8vd3d3LmZyZWVkaWFtZXRlci5uZXQKKyAgREVQRU5EUzo9K2ZyZWVEaWFtZXRlcgorZW5kZWYKKworZGVmaW5lIFBhY2thZ2UvZnJlZURpYW1ldGVyL2Rlc2NyaXB0aW9uCisgZnJlZURpYW1ldGVyICsgUkFESVVTL0RpYW1ldGVyIGdhdGV3YXkgZXh0ZW5zaW9uIHBhY2thZ2UuCitlbmRlZgorCitkZWZpbmUgUGFja2FnZS9mcmVlRGlhbWV0ZXItdGVzdC9kZXNjcmlwdGlvbgorIFRoZSBhcHBfdGVzdC5mZHggZXh0ZW5zaW9uIGZvciBmcmVlRGlhbWV0ZXIsIHVzZWZ1bCBvbmx5IHRvIHBlcmZvcm0gc29tZQordGVzdHMgYmV0d2VlbiBmcmVlRGlhbWV0ZXIgcGVlcnMgKHBpbmctbGlrZSBmb3IgRGlhbWV0ZXIpLgorZW5kZWYKKworZGVmaW5lIFBhY2thZ2UvZnJlZURpYW1ldGVyL2NvbmZmaWxlcworL2V0Yy9mcmVlRGlhbWV0ZXIvZnJlZURpYW1ldGVyLmNvbmYKKy9ldGMvZnJlZURpYW1ldGVyL3Jndy5jb25mCitlbmRlZgorCitkZWZpbmUgQnVpbGQvQ29uZmlndXJlCisgICAgSU5fT1BFTldSVD0xIFwKKyAgICBBUj0iJChUQVJHRVRfQ1JPU1MpYXIiIFwKKyAgICBBUz0iJChUQVJHRVRfQ0MpIC1jICQoVEFSR0VUX0NGTEFHUykiIFwKKyAgICBMRD0iJChUQVJHRVRfQ1JPU1MpbGQiIFwKKyAgICBOTT0iJChUQVJHRVRfQ1JPU1Mpbm0iIFwKKyAgICBDQz0iJChUQVJHRVRfQ0MpIiBcCisgICAgR0NDPSIkKFRBUkdFVF9DQykiIFwKKyAgICBDWFg9IiQoVEFSR0VUX0NST1NTKWcrKyIgXAorICAgIFJBTkxJQj0iJChUQVJHRVRfQ1JPU1MpcmFubGliIiBcCisgICAgU1RSSVA9IiQoVEFSR0VUX0NST1NTKXN0cmlwIiBcCisgICAgT0JKQ09QWT0iJChUQVJHRVRfQ1JPU1Mpb2JqY29weSIgXAorICAgIE9CSkRVTVA9IiQoVEFSR0VUX0NST1NTKW9iamR1bXAiIFwKKyAgICBUQVJHRVRfQ1BQRkxBR1M9IiQoVEFSR0VUX0NQUEZMQUdTKSIgXAorICAgIFRBUkdFVF9DRkxBR1M9IiQoVEFSR0VUX0NGTEFHUykiIFwKKyAgICBUQVJHRVRfTERGTEFHUz0iJChUQVJHRVRfTERGTEFHUykiIFwKKyAgICBjbWFrZSBcCisJCS1EQ01BS0VfUFJFRklYX1BBVEg6UEFUSD0kKFNUQUdJTkdfRElSKS91c3IgXAorICAgIAkJLURDTUFLRV9JTlNUQUxMX1BSRUZJWDpQQVRIPS91c3IgXAorICAgICAgICAgICAgICAgIC1ERElBTUlEX0lETkFfUkVKRUNUOkJPT0w9T04gXAorICAgICAgICAgICAgICAgIC1EQlVJTERfVEVTVElORzpCT09MPU9GRiBcCisJCS1EQ01BS0VfQlVJTERfVFlQRTpTVFJJTkc9RGViaWFuUGFja2FnZSBcCisJCS1EREVGQVVMVF9DT05GX1BBVEg6UEFUSD0vZXRjL2ZyZWVEaWFtZXRlciBcCisJCS1EQlVJTERfQVBQX1JBREdXOkJPT0w9T04gXAorCQktREJVSUxEX0RCR19NT05JVE9SOkJPT0w9T04gXAorCQktREJVSUxEX1RFU1RfQVBQOkJPT0w9T04gXAorCQlWRVJCT1NFPTEgXAorCSQoUEtHX0JVSUxEX0RJUikvQ01ha2VMaXN0cy50eHQgCitlbmRlZgorCitUQVJHRVRfTERGTEFHUyA6PSAtTCQoU1RBR0lOR19ESVIpL3Vzci9saWIgJChUQVJHRVRfTERGTEFHUykKK2RlZmluZSBQYWNrYWdlL2ZyZWVEaWFtZXRlci9pbnN0YWxsCisJIyBiaW5hcmllcworCSQoSU5TVEFMTF9ESVIpICQoMSkvdXNyL2JpbgorCSQoQ1ApIFwKKwkJJChQS0dfSU5TVEFMTF9ESVIpL3Vzci9iaW4vZnJlZURpYW1ldGVyZCogXAorCQkkKDEpL3Vzci9iaW4vCisJIyBsaWJyYXJpZXMgJiBleHRlbnNpb25zCisJJChJTlNUQUxMX0RJUikgJCgxKS91c3IvbGliLworCSQoQ1ApIFwKKwkJJChQS0dfSU5TVEFMTF9ESVIpL3Vzci9saWIvKiBcCisJCSQoMSkvdXNyL2xpYi8KKwkjIFJlbW92ZSB0aGUgdGVzdF9hcHAgZnJvbSB0aGUgbWFpbiBwYWNrYWdlIChzZWUgZnJlZURpYW1ldGVyLXRlc3QpCisJJChSTSkgJCgxKS91c3IvbGliL2ZyZWVEaWFtZXRlci90ZXN0X2FwcCoKKwkKKwkjIGNvbmZpZ3VyYXRpb24gZmlsZXMKKwkkKElOU1RBTExfRElSKSAkKDEpL2V0Yy9mcmVlRGlhbWV0ZXIKKwkkKElOU1RBTExfQ09ORikgXAorCQkkKFBLR19CVUlMRF9ESVIpL2RvYy9mcmVlZGlhbWV0ZXIuY29uZi5zYW1wbGUgXAorCQkkKDEpL2V0Yy9mcmVlRGlhbWV0ZXIvZnJlZURpYW1ldGVyLmNvbmYKKwkkKFNFRCkgJ3MsVExTX0NyZWQsI1RMU19DcmVkLGcnIAkJICAgJCgxKS9ldGMvZnJlZURpYW1ldGVyL2ZyZWVEaWFtZXRlci5jb25mCisJZWNobyAiIiAJCQkJCT4+ICQoMSkvZXRjL2ZyZWVEaWFtZXRlci9mcmVlRGlhbWV0ZXIuY29uZgorCWVjaG8gIiMjIyBPUEVOV1JUIHNwZWNpZmljIgkJIAk+PiAkKDEpL2V0Yy9mcmVlRGlhbWV0ZXIvZnJlZURpYW1ldGVyLmNvbmYKKwllY2hvICJUTFNfQ3JlZCA9IFwiL2V0Yy9mcmVlRGlhbWV0ZXIvZnJlZURpYW1ldGVyLnBlbVwiLCBcIi9ldGMvZnJlZURpYW1ldGVyL2ZyZWVEaWFtZXRlci5rZXlcIjsiIFwKKwkJCQkJCQk+PiAkKDEpL2V0Yy9mcmVlRGlhbWV0ZXIvZnJlZURpYW1ldGVyLmNvbmYKKwllY2hvICJUTFNfQ0EgPSBcIi9ldGMvZnJlZURpYW1ldGVyL2ZyZWVEaWFtZXRlci5jYS5wZW1cIjsiIFwKKwkJCQkJCQk+PiAkKDEpL2V0Yy9mcmVlRGlhbWV0ZXIvZnJlZURpYW1ldGVyLmNvbmYKKwllY2hvICJUTFNfREhfRmlsZSA9IFwiL2V0Yy9mcmVlRGlhbWV0ZXIvZGgucGVtXCI7IiBcCisJCQkJIAkJCT4+ICQoMSkvZXRjL2ZyZWVEaWFtZXRlci9mcmVlRGlhbWV0ZXIuY29uZgorCWVjaG8gIlNDVFBfc3RyZWFtcyA9IDM7IgkJCT4+ICQoMSkvZXRjL2ZyZWVEaWFtZXRlci9mcmVlRGlhbWV0ZXIuY29uZgorCWVjaG8gIkxvYWRFeHRlbnNpb24gPSBcImRpY3RfbmFzcmVxLmZkeFwiOyIgCT4+ICQoMSkvZXRjL2ZyZWVEaWFtZXRlci9mcmVlRGlhbWV0ZXIuY29uZgorCWVjaG8gIkxvYWRFeHRlbnNpb24gPSBcImRpY3RfZWFwLmZkeFwiOyIgCT4+ICQoMSkvZXRjL2ZyZWVEaWFtZXRlci9mcmVlRGlhbWV0ZXIuY29uZgorCWVjaG8gIkxvYWRFeHRlbnNpb24gPSBcImFwcF9yYWRndy5mZHhcIjpcInJndy5jb25mXCI7IiBcCisJCQkJCQkJPj4gJCgxKS9ldGMvZnJlZURpYW1ldGVyL2ZyZWVEaWFtZXRlci5jb25mCisJZWNobyAiIyB0ZXN0X2FwcC5mZHggcHJvdmlkZWQgaW4gZnJlZURpYW1ldGVyLXRlc3QgcGFja2FnZToiIFwKKwkJCQkJCQk+PiAkKDEpL2V0Yy9mcmVlRGlhbWV0ZXIvZnJlZURpYW1ldGVyLmNvbmYKKwllY2hvICIjIExvYWRFeHRlbnNpb24gPSBcInRlc3RfYXBwLmZkeFwiOyIJPj4gJCgxKS9ldGMvZnJlZURpYW1ldGVyL2ZyZWVEaWFtZXRlci5jb25mCisJZWNobyAiIyMgQWRkIG92ZXJyaWRlcyBiZWxvdyB0aGlzIHBvaW50IiAJPj4gJCgxKS9ldGMvZnJlZURpYW1ldGVyL2ZyZWVEaWFtZXRlci5jb25mCisKKwkKKwkkKElOU1RBTExfQ09ORikgXAorCQkkKFBLR19CVUlMRF9ESVIpL2RvYy9hcHBfcmFkZ3cuY29uZi5zYW1wbGUgXAorCQkkKDEpL2V0Yy9mcmVlRGlhbWV0ZXIvcmd3LmNvbmYKKwkkKFNFRCkgJ3MsUkdXWCwjUkdXWCxnJyAJCSAgCSAgICQoMSkvZXRjL2ZyZWVEaWFtZXRlci9yZ3cuY29uZgorCWVjaG8gIiIgCQkJCQk+PiAkKDEpL2V0Yy9mcmVlRGlhbWV0ZXIvcmd3LmNvbmYKKwllY2hvICIjIyMgT1BFTldSVCBzcGVjaWZpYyIJCSAJPj4gJCgxKS9ldGMvZnJlZURpYW1ldGVyL3Jndy5jb25mCisJZWNobyAiICBSR1dYID0gXCJhdXRoLnJnd3hcIiA6IGF1dGg7IgkJPj4gJCgxKS9ldGMvZnJlZURpYW1ldGVyL3Jndy5jb25mCisJZWNobyAiICBSR1dYID0gXCJhY2N0LnJnd3hcIiA6IGFjY3Q7IgkJPj4gJCgxKS9ldGMvZnJlZURpYW1ldGVyL3Jndy5jb25mCisJZWNobyAiIiAJCQkJCT4+ICQoMSkvZXRjL2ZyZWVEaWFtZXRlci9yZ3cuY29uZgorCWVjaG8gIiAgY2xpID0gMTI3LjAuMC4xIC8gXCJzZWNyZXQga2V5XCIgOyIgCT4+ICQoMSkvZXRjL2ZyZWVEaWFtZXRlci9yZ3cuY29uZgorCWVjaG8gIiAgYXV0aF9zZXJ2ZXJfaXA0ID0gMTI3LjAuMC4xOyIgCQk+PiAkKDEpL2V0Yy9mcmVlRGlhbWV0ZXIvcmd3LmNvbmYKKwllY2hvICIgIGF1dGhfc2VydmVyX2lwNiA9IDo6MSA7IiAJCT4+ICQoMSkvZXRjL2ZyZWVEaWFtZXRlci9yZ3cuY29uZgorCWVjaG8gIiAgYWNjdF9zZXJ2ZXJfaXA0ID0gMTI3LjAuMC4xOyIgCQk+PiAkKDEpL2V0Yy9mcmVlRGlhbWV0ZXIvcmd3LmNvbmYKKwllY2hvICIgIGFjY3Rfc2VydmVyX2lwNiA9IDo6MSA7IiAJCT4+ICQoMSkvZXRjL2ZyZWVEaWFtZXRlci9yZ3cuY29uZgorZW5kZWYKKworZGVmaW5lIFBhY2thZ2UvZnJlZURpYW1ldGVyLXRlc3QvaW5zdGFsbAorCSMgT25seSB0aGUgdGVzdF9hcHAgZXh0ZW5zaW9uCisJJChJTlNUQUxMX0RJUikgJCgxKS91c3IvbGliL2ZyZWVEaWFtZXRlci8KKwkkKENQKSAkKFBLR19JTlNUQUxMX0RJUikvdXNyL2xpYi9mcmVlRGlhbWV0ZXIvdGVzdF9hcHAqIFwKKwkJJCgxKS91c3IvbGliL2ZyZWVEaWFtZXRlci8KK2VuZGVmCisKK2RlZmluZSBQYWNrYWdlL2ZyZWVEaWFtZXRlci9wb3N0aW5zdAorIyEvYmluL3NoCisKKyMgVGVzdCBpZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGNvbnRhaW5zIHRoZSBsb2NhbCBpZGVudGl0eSBhbHJlYWR5Citsb2NhbGlkPWBzZWQgLW4gLXIgLWUgInMvXltbOnNwYWNlOl1dKklkZW50aXR5W1s6c3BhY2U6XV0qPVtbOnNwYWNlOl1dKlwiKFteXCJdKilcIltbOnNwYWNlOl1dKjsvXDEvcCIgL2V0Yy9mcmVlRGlhbWV0ZXIvZnJlZURpYW1ldGVyLmNvbmZgCitpZiBbIC16ICIkJGxvY2FsaWQiIF07IHRoZW4KKyAgICMgQXNrIGZvciB0aGUgbG9jYWwgbmFtZQorICAgZWNobyAtbiAiRnVsbCBuYW1lIG9mIHlvdXIgYWNjZXNzIHBvaW50PyAob3BlbndydC5sb2NhbGRvbWFpbikgOiAiCisgICByZWFkIGxvY2FsaWQKKyAgIGlmIFsgLXogIiQkbG9jYWxpZCIgXTsgdGhlbgorICAgICAgbG9jYWxpZD0ib3BlbndydC5sb2NhbGRvbWFpbiIKKyAgIGZpCisgICBlY2hvICJJZGVudGl0eSA9IFwiJCRsb2NhbGlkXCI7IiA+PiAvZXRjL2ZyZWVEaWFtZXRlci9mcmVlRGlhbWV0ZXIuY29uZgorZmkKKworIyBJcyB0aGVyZSBhbHJlYWR5IGEgQ29ubmVjdFBlZXIgZGlyZWN0aXZlPworZ3JlcCAtcSAtRSAtZSAiXltbOnNwYWNlOl1dKkNvbm5lY3RQZWVyW1s6c3BhY2U6XV0qPSIgL2V0Yy9mcmVlRGlhbWV0ZXIvZnJlZURpYW1ldGVyLmNvbmYKK2lmIFsgIiQkPyIgLWVxICIxIiBdOyB0aGVuCisgICBlY2hvIC1uICJEaWFtZXRlciBJZGVudGl0eSBvZiB5b3VyIERpYW1ldGVyIHNlcnZlcjogIgorICAgcmVhZCBzZXJ2ZXJpZAorICAgaWYgWyAteiAiJCRzZXJ2ZXJpZCIgXTsgdGhlbgorICAgICAgZWNobyAiU2tpcHBlZC4gUGxlYXNlIGFkZCBDb25uZWN0UGVlciBkaXJlY3RpdmUgdG8geW91ciAvZXRjL2ZyZWVEaWFtZXRlci9mcmVlRGlhbWV0ZXIuY29uZiBmaWxlIGxhdGVyLiIKKyAgIGVsc2UKKyAgICAgIGVjaG8gLW4gIklQIG9yIElQdjYgYWRkcmVzcyBvZiB5b3VyIERpYW1ldGVyIHNlcnZlcj8gKGxlYXZlIGJsYW5rIGZvciBkeW5hbWljIHJlc29sdXRpb24pICIKKyAgICAgIHJlYWQgc2VydmVyaXAKKyAgICAgIGNvbm5zdHI9IiIKKyAgICAgIGlmIFsgLW4gIiQkc2VydmVyaXAiIF07IHRoZW4KKyAgICAgICAgY29ubnN0cj0iIHsgQ29ubmVjdFRvID0gXCIkJHNlcnZlcmlwXCI7IH0iCisgICAgICBmaQorICAgICAgZWNobyAiQ29ubmVjdFBlZXIgPSBcIiQkc2VydmVyaWRcIiQkY29ubnN0cjsiID4+IC9ldGMvZnJlZURpYW1ldGVyL2ZyZWVEaWFtZXRlci5jb25mCisgICBmaQorZmkKKworIyBDZXJ0aWZpY2F0ZSBjb25maWd1cmF0aW9uICAgIAoraWYgWyAhIC1mICIvdXNyL2Jpbi9jZXJ0dG9vbCIgXTsgdGhlbgorICAgZWNobyAiY2VydHRvb2wgaXMgbm90IGluc3RhbGxlZCwgc2tpcHBpbmcgY3JlYXRpb24gb2YgZGVmYXVsdCBjZXJ0aWZpY2F0ZSBhbmQgREggcGFyYW1ldGVycy4iCisgICBlY2hvICJUaGUgZm9sbG93aW5nIGZpbGVzIGFyZSBleHBlY3RlZCBieSBmcmVlRGlhbWV0ZXI6IgorICAgZWNobyAiICAvZXRjL2ZyZWVEaWFtZXRlci9mcmVlRGlhbWV0ZXIua2V5IgorICAgZWNobyAiICAvZXRjL2ZyZWVEaWFtZXRlci9mcmVlRGlhbWV0ZXIucGVtIgorICAgZWNobyAiICAvZXRjL2ZyZWVEaWFtZXRlci9mcmVlRGlhbWV0ZXIuY2EucGVtIgorICAgZWNobyAiICAvZXRjL2ZyZWVEaWFtZXRlci9kaC5wZW0iCisgICBleGl0IDAKK2ZpCitpZiBbICEgLWYgIi9ldGMvZnJlZURpYW1ldGVyL2ZyZWVEaWFtZXRlci5rZXkiIF07IHRoZW4gCisgICBlY2hvICJDcmVhdGluZyBhIG5ldyBwcml2YXRlIGtleSBmb3IgZnJlZURpYW1ldGVyLCBwbGVhc2Ugd2FpdCIKKyAgIGNlcnR0b29sIC1wIC0tb3V0ZmlsZSAvZXRjL2ZyZWVEaWFtZXRlci9mcmVlRGlhbWV0ZXIua2V5CitmaQoraWYgWyAhIC1mICIvZXRjL2ZyZWVEaWFtZXRlci9mcmVlRGlhbWV0ZXIucGVtIiBdOyB0aGVuCisgICBlY2hvICJvcmdhbml6YXRpb24gPSBmcmVlRGlhbWV0ZXIiCQk+IC90bXAvdGVtcGxhdGUuY25mCisgICBlY2hvICJ1bml0ID0gT3BlbldSVCIJCQk+Pi90bXAvdGVtcGxhdGUuY25mCisgICBlY2hvICJzdGF0ZSA9IGludGVybmV0IgkJCT4+L3RtcC90ZW1wbGF0ZS5jbmYKKyAgIGVjaG8gImNvdW50cnkgPSBuZXQiCQkJCT4+L3RtcC90ZW1wbGF0ZS5jbmYKKyAgIGVjaG8gImNuID0gJCRsb2NhbGlkIgkJCT4+L3RtcC90ZW1wbGF0ZS5jbmYKKyAgIGVjaG8gImV4cGlyYXRpb25fZGF5cyA9IDM2NTAiCQk+Pi90bXAvdGVtcGxhdGUuY25mCisgICBlY2hvICJzaWduaW5nX2tleSIJCQkJPj4vdG1wL3RlbXBsYXRlLmNuZgorICAgZWNobyAiZW5jcnlwdGlvbl9rZXkiCQkJPj4vdG1wL3RlbXBsYXRlLmNuZgorICAgaWYgWyAhIC1mICIvZXRjL2ZyZWVEaWFtZXRlci9mcmVlRGlhbWV0ZXIuY3NyIiBdOyB0aGVuIAorICAgICAgZWNobyAiQ3JlYXRpbmcgYSBuZXcgQ1NSICh1c2UgaWYgeW91IGhhdmUgYSBzZXBhcmF0ZSBDQSkiCisgICAgICBjZXJ0dG9vbCAtcSAtLWxvYWQtcHJpdmtleSAvZXRjL2ZyZWVEaWFtZXRlci9mcmVlRGlhbWV0ZXIua2V5IFwKKyAgICAgICAgICAgICAgIC0tb3V0ZmlsZSAvZXRjL2ZyZWVEaWFtZXRlci9mcmVlRGlhbWV0ZXIuY3NyIFwKKwkgICAgICAgLS10ZW1wbGF0ZSAvdG1wL3RlbXBsYXRlLmNuZgorICAgZmkKKyAgIGVjaG8gIkNyZWF0aW5nIGEgbmV3IGNlcnRpZmljYXRlIGZvciBmcmVlRGlhbWV0ZXIiCisgICBjZXJ0dG9vbCAtcyAtLWxvYWQtcHJpdmtleSAvZXRjL2ZyZWVEaWFtZXRlci9mcmVlRGlhbWV0ZXIua2V5IFwKKyAgICAgICAgICAgICAgIC0tb3V0ZmlsZSAvZXRjL2ZyZWVEaWFtZXRlci9mcmVlRGlhbWV0ZXIucGVtIFwKKwkgICAgICAgLS10ZW1wbGF0ZSAvdG1wL3RlbXBsYXRlLmNuZgorICAgcm0gLWYgL3RtcC90ZW1wbGF0ZS5jbmYKKyAgIGNhdCAvZXRjL2ZyZWVEaWFtZXRlci9mcmVlRGlhbWV0ZXIucGVtID4+IC9ldGMvZnJlZURpYW1ldGVyL2ZyZWVEaWFtZXRlci5jYS5wZW0KKyAgIGVjaG8gIkRvbmUuIgorICAgZWNobyAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IgorICAgZWNobyAiVG8gZW5hYmxlIFRMUyBjb21tdW5pY2F0aW9uLCB5b3Ugc2hvdWxkIGVpdGhlcjoiCisgICBlY2hvICIgIC0gdXNlIGEgcmVhbCBjZXJ0aWZpY2F0ZSBzaWduZWQgYnkgeW91ciBzZXJ2ZXIncyBDQToiCisgICBlY2hvICIgICAgICBVc2UgdGhlIENTUiBwcm92aWRlZCBpbiAvZXRjL2ZyZWVEaWFtZXRlci9mcmVlRGlhbWV0ZXIuY3NyIgorICAgZWNobyAiICAgICAgU2F2ZSB0aGUgbmV3IGNlcnRpZmljYXRlIGFzIC9ldGMvZnJlZURpYW1ldGVyL2ZyZWVEaWFtZXRlci5wZW0iCisgICBlY2hvICIgICAgICBSZXBsYWNlIHRoZSBjb250ZW50cyBvZiAvZXRjL2ZyZWVEaWFtZXRlci9mcmVlRGlhbWV0ZXIuY2EucGVtIHdpdGggeW91ciBDQSdzIGNlcnRpZmljYXRlIgorICAgZWNobyAiICAtIG9yLCBkZWNsYXJlIHRoZSBjZXJ0aWZpY2F0ZXMgYXMgdHJ1c3RlZCBhcyBmb2xsb3c6ICIKKyAgIGVjaG8gIiAgICAgIEFkZCB5b3VyIHNlcnZlcidzIENBIGNlcnRpZmljYXRlIGludG8gL2V0Yy9mcmVlRGlhbWV0ZXIvZnJlZURpYW1ldGVyLmNhLnBlbSIKKyAgIGVjaG8gIiAgICAgIEFkZCB0aGUgY29udGVudCBvZiAvZXRjL2ZyZWVEaWFtZXRlci9mcmVlRGlhbWV0ZXIucGVtIGludG8geW91ciBzZXJ2ZXIncyB0cnVzdGVkIENBIGZpbGUiCisgICBlY2hvICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iCitmaQoraWYgWyAhIC1mICIvZXRjL2ZyZWVEaWFtZXRlci9kaC5wZW0iIF07IHRoZW4KKyAgIGVjaG8gIkNyZWF0aW5nIG5ldyBEaWZmaWUtSGVsbG1hbiBwYXJhbWV0ZXJzIGZpbGUuIFRoaXMgb3BlcmF0aW9uIHRha2VzIGEgd2hpbGUuLi4iCisgICBjZXJ0dG9vbCAtLWdlbmVyYXRlLWRoLXBhcmFtcyAtLW91dGZpbGUgL2V0Yy9mcmVlRGlhbWV0ZXIvZGgucGVtCisgICBlY2hvICJEb25lLiIKK2ZpCitlY2hvICJmcmVlRGlhbWV0ZXIgY29uZmlndXJhdGlvbiBjb21wbGV0ZWQgYW5kIHN0b3JlZCBpbiAvZXRjL2ZyZWVEaWFtZXRlci8uIgorZW5kZWYKKworJChldmFsICQoY2FsbCBCdWlsZFBhY2thZ2UsZnJlZURpYW1ldGVyKSkKKyQoZXZhbCAkKGNhbGwgQnVpbGRQYWNrYWdlLGZyZWVEaWFtZXRlci10ZXN0KSkKZGlmZiAtLWdpdCBhL2NvbnRyaWIvT3BlbldSVC9wYWNrYWdlcy9mcmVlRGlhbWV0ZXIvcGF0Y2hlcy8wMS1mcmVlRGlhbWV0ZXItT3BlbldSVC5wYXRjaCBiL2NvbnRyaWIvT3BlbldSVC9wYWNrYWdlcy9mcmVlRGlhbWV0ZXIvcGF0Y2hlcy8wMS1mcmVlRGlhbWV0ZXItT3BlbldSVC5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjQzYzhkCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9PcGVuV1JUL3BhY2thZ2VzL2ZyZWVEaWFtZXRlci9wYXRjaGVzLzAxLWZyZWVEaWFtZXRlci1PcGVuV1JULnBhdGNoCkBAIC0wLDAgKzEsMTkgQEAKK2RpZmYgLU51ciBmcmVlRGlhbWV0ZXIvQ01ha2VMaXN0cy50eHQgZnJlZURpYW1ldGVyLU9wZW5XUlQvQ01ha2VMaXN0cy50eHQKKy0tLSBmcmVlRGlhbWV0ZXIvQ01ha2VMaXN0cy50eHQJMjAxMC0wOC0xMyAxNjoxOTozNS4wMDAwMDAwMDAgKzA5MDAKKysrKyBmcmVlRGlhbWV0ZXItT3BlbldSVC9DTWFrZUxpc3RzLnR4dAkyMDEwLTA4LTEzIDE2OjIxOjMyLjAwMDAwMDAwMCArMDkwMAorQEAgLTUxLDYgKzUxLDE0IEBACisgICBTRVQoREVCVUcgMSkKKyBFTkRJRiAoQ01BS0VfQlVJTERfVFlQRSBNQVRDSEVTICJEZWJ1Z3xQcm9maWxpbmd8RGVidWdWYWxncmluZCIpCisgCisrIyBPcGVuV1JUCisrU0VUKElOX09QRU5XUlQgJEVOVntJTl9PUEVOV1JUfSkKKytJRiAoSU5fT1BFTldSVCkKKysgIEFERF9ERUZJTklUSU9OUygiJEVOVntUQVJHRVRfTERGTEFHU30iICIkRU5We1RBUkdFVF9DUFBGTEFHU30iICIkRU5We1RBUkdFVF9DRkxBR1N9IikKKysgIElOQ0xVREVfRElSRUNUT1JJRVMoIiRFTlZ7VEFSR0VUX0xERkxBR1N9IiAiJEVOVntUQVJHRVRfQ1BQRkxBR1N9IiAiJEVOVntUQVJHRVRfQ0ZMQUdTfSIpCisrRU5ESUYoSU5fT1BFTldSVCkKKysKKysKKyAjIHNvbWUgc3ViZm9sZGVycyB1c2UgeWFjYyBhbmQgbGV4IHBhcnNlcnMKKyBTRVQoQklTT05fR0VORVJBVEVfREVGSU5FUyBUUlVFKQorIFNFVChCSVNPTl9QUkVGSVhfT1VUUFVUUyBUUlVFKQorQmluYXJ5IGZpbGVzIGZyZWVEaWFtZXRlci8uaGcvZGlyc3RhdGUgYW5kIGZyZWVEaWFtZXRlci1PcGVuV1JULy5oZy9kaXJzdGF0ZSBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvT3BlbldSVC90ZXN0X3JlcXVpcmVkL01ha2VmaWxlIGIvY29udHJpYi9PcGVuV1JUL3Rlc3RfcmVxdWlyZWQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEzY2M5MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvT3BlbldSVC90ZXN0X3JlcXVpcmVkL01ha2VmaWxlCkBAIC0wLDAgKzEsMTUgQEAKK09XUlRfRU5WX1JPT1Q9L3Jvb3Qvb3BlbndydC1lbnYvb3BlbndydAorU1RBR0lOR19VQ0xJQkNfUk9PVD0kKE9XUlRfRU5WX1JPT1QpL3N0YWdpbmdfZGlyL3RhcmdldC1taXBzZWxfdUNsaWJjLTAuOS4zMQorU1RBR0lOR19HQ0NfUk9PVD0kKE9XUlRfRU5WX1JPT1QpL3N0YWdpbmdfZGlyL3Rvb2xjaGFpbi1taXBzZWxfZ2NjLTQuMy4zK2NzX3VDbGliYy0wLjkuMzEKKworQ0ZMQUdTPS1PcyAtcGlwZSAtbWlwczMyIC1tdHVuZT1taXBzMzIgLWZ1bml0LWF0LWEtdGltZSAtZmhvbm91ci1jb3B0cyAtbXNvZnQtZmxvYXQgIC1JJChTVEFHSU5HX1VDTElCQ19ST09UKS91c3IvaW5jbHVkZSAtSSQoU1RBR0lOR19VQ0xJQkNfUk9PVCkvaW5jbHVkZSAtSSQoU1RBR0lOR19HQ0NfUk9PVCkvdXNyL2luY2x1ZGUgLUkkKFNUQUdJTkdfR0NDX1JPT1QpL2luY2x1ZGUgCitMREZMQUdTPS1MJChTVEFHSU5HX1VDTElCQ19ST09UKS91c3IvbGliIC1MJChTVEFHSU5HX1VDTElCQ19ST09UKS9saWIgLUwkKFNUQUdJTkdfR0NDX1JPT1QpL3Vzci9saWIgLUwkKFNUQUdJTkdfR0NDX1JPT1QpL2xpYiAKKworR0NDPW1pcHNlbC1vcGVud3J0LWxpbnV4LXVjbGliYy1nY2MKK1BBVEg6PSQoU1RBR0lOR19HQ0NfUk9PVCkvYmluLzokKFBBVEgpCisKK3Rlc3RjYXNlOgl0ZXN0Y2FzZS5vCisJJChHQ0MpICQoTERGTEFHUykgLWxwdGhyZWFkIHRlc3RjYXNlLm8gLW8gdGVzdGNhc2UKKwordGVzdGNhc2UubzoJdGVzdGNhc2UuYworCSQoR0NDKSAkKENGTEFHUykgLW8gdGVzdGNhc2UubyAtYyB0ZXN0Y2FzZS5jCmRpZmYgLS1naXQgYS9jb250cmliL09wZW5XUlQvdGVzdF9yZXF1aXJlZC90ZXN0Y2FzZS5jIGIvY29udHJpYi9PcGVuV1JUL3Rlc3RfcmVxdWlyZWQvdGVzdGNhc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWQ3ODgyCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9PcGVuV1JUL3Rlc3RfcmVxdWlyZWQvdGVzdGNhc2UuYwpAQCAtMCwwICsxLDkwIEBACisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5ncy5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorCitzdGF0aWMgcHRocmVhZF9iYXJyaWVyX3QgYmFyOworc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBtdHggPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOworc3RhdGljIHB0aHJlYWRfY29uZF90IGNuZCA9IFBUSFJFQURfQ09ORF9JTklUSUFMSVpFUjsKK3N0YXRpYyBpbnQgY2FsbGVkID0gMDsKKworI2lmbmRlZiBBU1NFUlQKKyNkZWZpbmUgQVNTRVJUKHgpIGFzc2VydCh4KQorI2VuZGlmIC8qIEFTU0VSVCAqLworCitzdGF0aWMgdm9pZCBjbGVhbnVwbXV0ZXgodm9pZCAqIGFyZykKK3sKKwlwcmludGYoImNhbmNlbGF0aW9uIGNsZWFudXAgaGFuZGxlciBjYWxsZWRcbiIpOworCWlmIChhcmcpIHsKKwkJQVNTRVJUKCBwdGhyZWFkX211dGV4X3VubG9jaygocHRocmVhZF9tdXRleF90ICopYXJnKSA9PSAwICk7CisJCWNhbGxlZCsrOworCX0KKwkKK30KKworc3RhdGljIHZvaWQgKiBteXRocmVhZCh2b2lkICogYSkKK3sKKwlpbnQgcmV0OworCQorCS8qIGxvY2sgbXV0ZXggKi8KKwlBU1NFUlQoIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXR4KSA9PSAwICk7CisJCQorCS8qIFB1c2ggY2xlYW51cCAqLworCXB0aHJlYWRfY2xlYW51cF9wdXNoKGNsZWFudXBtdXRleCwgJm10eCk7CisJCisJcHJpbnRmKCJ0aHJlYWQgc3luY2hyb25pemF0aW9uIChtdXRleCBhY3F1aXJlZClcbiIpOworCQorCS8qIFdha2UgdGhlIG90aGVyIHRocmVhZCAqLworCXJldCA9IHB0aHJlYWRfYmFycmllcl93YWl0KCZiYXIpOworCUFTU0VSVCggKHJldCA9PSAwKSB8fCAocmV0ID09IFBUSFJFQURfQkFSUklFUl9TRVJJQUxfVEhSRUFEKSApOworCQorCS8qIE5vdyB3YWl0IGZvciB0aGUgY29uZGl0aW9uLCB0aGlzIHVubG9ja3MgdGhlIG11dGV4ICovCisJZG8geworCQlwcmludGYoInRocmVhZCB3YWl0aW5nIGNvbmRcbiIpOworCQlBU1NFUlQoIHB0aHJlYWRfY29uZF93YWl0KCZjbmQsICZtdHgpID09IDApOworCQlwcmludGYoInRocmVhZCB3b2tlblxuIik7CisJfSB3aGlsZSAoMSk7CisJCisJLyogQ2xlYW51cCwgbmV2ZXIgcmVhY2hlZCAqLworCXB0aHJlYWRfY2xlYW51cF9wb3AoMSk7CisJcmV0dXJuIE5VTEw7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICogYXJndltdKQoreworCWludCByZXQ7CisJcHRocmVhZF90IHRocjsKKwl2b2lkICogZHVtbXk7CisJCisJLyogaW5pdGlhbGl6ZSB0aGUgYmFycmllciAqLworCUFTU0VSVCggcHRocmVhZF9iYXJyaWVyX2luaXQoJmJhciwgTlVMTCwgMikgPT0gMCApOworCQorCXByaW50ZigiQ3JlYXRpbmcgdGhyZWFkXG4iKTsKKwkKKwkvKiBDcmVhdGUgdGhlIHRocmVhZCAqLworCUFTU0VSVCggcHRocmVhZF9jcmVhdGUoJnRociwgTlVMTCwgbXl0aHJlYWQsIE5VTEwpID09IDAgKTsKKwkKKwlwcmludGYoIm1haW4gc3luY2hyb25pemF0aW9uXG4iKTsKKwlyZXQgPSBwdGhyZWFkX2JhcnJpZXJfd2FpdCgmYmFyKTsKKwlBU1NFUlQoIChyZXQgPT0gMCkgfHwgKHJldCA9PSBQVEhSRUFEX0JBUlJJRVJfU0VSSUFMX1RIUkVBRCkgKTsKKwkKKwlBU1NFUlQoIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXR4KSA9PSAwICk7CisJcHJpbnRmKCJtYWluOiB0aHJlYWQgaXMgbm93IHdhaXRpbmcgZm9yIGNvbmR2YXJcbiIpOworCQorCS8qIENhbmNlbCB0aGUgdGhyZWFkICovCisJQVNTRVJUKCBwdGhyZWFkX2NhbmNlbCh0aHIpID09IDAgKTsKKwkKKwkvKiBOb3csIHVubG9jaywgc28gdGhhdCB0aGUgdGhyZWFkIGNhbiBhY3R1YWxseSByZWFsbHkgZXhpdCAqLworCUFTU0VSVCggcHRocmVhZF9tdXRleF91bmxvY2soJm10eCkgPT0gMCApOworCQorCS8qIFJlbGVhc2UgdGhyZWFkIHJlc291cmNlcyAqLworCUFTU0VSVCggcHRocmVhZF9qb2luKHRociwgJmR1bW15KSA9PSAwICk7CisJCisJaWYgKGNhbGxlZCA9PSAxKQorCQlwcmludGYoIlRlc3Qgc3VjY2Vzc2Z1bCFcbiIpOworCWVsc2UKKwkJcHJpbnRmKCJUZXN0IGZhaWxlZCEgQ2xlYW51cCB3YXMgbm90IGNhbGxlZCAoJiBsb2NrIG5vdCByZWxlYXNlZClcbiIpOworCQorCXJldHVybiAwOworCQorfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9QS0kvY2Ffc2NyaXB0L01ha2VmaWxlIGIvY29udHJpYi9QS0kvY2Ffc2NyaXB0L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNDc2ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL1BLSS9jYV9zY3JpcHQvTWFrZWZpbGUKQEAgLTAsMCArMSwxNDkgQEAKKyMhL3Vzci9iaW4vbWFrZSAtcworIworIyBUaGlzIGZpbGUgaXMgZGVzaWduZWQgdG8gYXV0b21hdGl6ZSB0aGUgQ0EgdGFza3Mgc3VjaCBhczoKKyMgIC0+IGluaXQgIDogY3JlYXRlIHRoZSBpbml0aWFsIENBIHRyZWUgYW5kIHRoZSBDQSByb290IGNlcnRpZmljYXRlLgorIyAgLT4gbmV3Y3NyOiBjcmVhdGUgYSBuZXcgcHJpdmF0ZSBrZXkgYW5kIGNzci4gJG5hbWUgYW5kICRlbWFpbCBtdXN0IGJlIHNldC4gQywgU1QsIEwsIE8sIE9VIG1heSBiZSBvdmVyd2l0dGVuIChleGFtcGxlOiBtYWtlIG5ld2NzciBDPUZSKQorIyAgLT4gY2VydCAgOiBzaWduIGEgcGVuZGluZyBDU1IgYW5kIGdlbmVyYXRlIHRoZSBjZXJ0aWZpY2F0ZS4gJG5hbWUgbXVzdCBiZSBwcm92aWRlZC4KKyMgIC0+IHJldm9rZTogcmV2b2tlIGEgY2VydGlmaWNhdGUuICRuYW1lIG11c3QgYmUgcHJvdmlkZWQuCisjICAtPiBnZW5jcmw6IHVwZGF0ZS9jcmVhdGUgdGhlIENSTC4KKyMKKyMgVGhlIGZpbGUgc2hvdWxkIGJlIGxvY2F0ZWQgaW4gdGhlIGRpcmVjdG9yeSBTVEFUSUNfRElSIGFzIGRlZmluZWQgYmVsb3cuCisjIFRoZSBESVIgZGlyZWN0b3J5IHdpbGwgY29udGFpbiB0aGUgZGF0YSBvZiB0aGUgQ0EuIEl0IG1pZ2h0IGJlIHBsYWNlZCBpbiAvdmFyLgorIyBUaGUgRElSIHNob3VsZCBhbHNvIGJlIGNvbmZpZ3VyZWQgaW4gb3BlbnNzbC5jbmYgZmlsZSB1bmRlciBbIENBX2RlZmF1bHQgXS0+ZGlyLgorIworIyBIZXJlIGFyZSB0aGUgc3RlcHMgdG8gaW5zdGFsbCB0aGUgQ0Egc2NyaXB0cyBpbiBkZWZhdWx0IGVudmlyb25tZW50OgorIyMgbWtkaXIgL2V0Yy9vcGVuc3NsLWNhLnN0YXRpYworIyMgY3AgTWFrZWZpbGUgb3BlbnNzbC5jbmYgL2V0Yy9vcGVuc3NsLWNhLnN0YXRpYworIyAoIGNvbmZpZ3VyZSB0aGUgZGVmYXVsdCBwYXJhbWV0ZXJzIG9mIHlvdXIgQ0EgaW4gL2V0Yy9vcGVuc3NsLWNhL29wZW5zc2wuY25mICkgIyMKKyMjIG1rZGlyIC9ldGMvb3BlbnNzbC1jYQorIyMgbWFrZSAtZiAvZXRjL29wZW5zc2wtY2Euc3RhdGljL01ha2VmaWxlIGRlc3Ryb3kgZm9yY2U9eQorIyMgY2QgL2V0Yy9vcGVuc3NsLWNhCisjIyBtYWtlIGluaXQKKyMjIG1ha2UgaGVscAorCitESVIgPSAvaG9tZS90aGVkb2MvdGVzdGJlZC5hYWEvY2EKK1NUQVRJQ19ESVIgPSAvaG9tZS90aGVkb2MvdGVzdGJlZC5hYWEvY2EKK0NPTkZJRyA9IC1jb25maWcgJChESVIpL29wZW5zc2wuY25mCisKKyNEZWZhdWx0cyBmb3IgbmV3IENTUgorQyA9IEpQCitTVCA9IFRva3lvCitMID0gS29nYW5laQorTyA9IFdJREUKK09VID0gIkFBQSBXRyIKKworI0RlZmF1bHQgbGlmZXRpbWUKK0RBWVMgPSAzNjUKKworI1ZhbHVlcyBmb3IgdGhlIENBCitDQV9DTiA9IG1nci50ZXN0YmVkLmFhYQorQ0FfbWFpbCA9IHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQKKworI0Rpc2FibGUgIm1ha2UgZGVzdHJveSIKK2ZvcmNlID0gCisKKworIyBEZWZhdWx0OiBwcmludCB0aGUgaGVscAorYWxsOgloZWxwCisKKyMgSGVscCBtZXNzYWdlCitoZWxwOgorCUBlY2hvICJcblwKK0RlZmF1bHQgdmFsdWVzIChjYW4gYmUgb3ZlcndyaXR0ZW4gb24gY29tbWFuZC1saW5lKTpcblwKKyAgIFtDPSQoQyldIFtTVD0kKFNUKV0gW0w9JChMKV0gW089JChPKV0gW09VPSQoT1UpXVxuXAorICAgW0NBX0NOPSQoQ0FfQ04pXSBbQ0FfbWFpbD0kKENBX21haWwpXVxuXG5cCitBdmFpbGFibGUgY29tbWFuZHM6XG5cCisgICBtYWtlIGluaXRcblwKKyAgICAgICBDcmVhdGVzIHRoZSBpbml0aWFsIENBIHN0cnVjdHVyZSBpbiAkKERJUilcblwKKyAgIG1ha2UgZ2VuY3JsXG5cCisgICAgICAgUmVnZW5lcmF0ZXMgdGhlIENSTC4gU2hvdWxkIGJlIHJ1biBhdCBsZWFzdCBvbmNlIGEgbW9udGguXG5cCisgICBtYWtlIG5ld2NzciBuYW1lPWZvbyBlbWFpbD1iQHIgW3R5cGU9Y2FdXG5cCisgICAgICAgQ3JlYXRlIHByaXZhdGUga2V5IGFuZCBjc3IgaW4gY2xpZW50cyBzdWJkaXIgKG5hbWVkIGZvby4qKVxuXAorICAgbWFrZSBjZXJ0IG5hbWU9Zm9vXG5cCisgICAgICAgU2lnbnMgdGhlIENTUiBmb28uY3NyIGFuZCBjcmVhdGVzIHRoZSBjZXJ0aWZpY2F0ZSBmb28uY2VydC5cblwKKyAgIG1ha2UgcmV2b2tlIG5hbWU9Zm9vXG5cCisgICAgICAgUmV2b2tlcyB0aGUgY2VydGlmaWNhdGUgZm9vLmNlcnQgYW5kIHJlZ2VuZXJhdGVzIHRoZSBDUkwuXG5cCitcblwKK05vdGVzOlxuXAorICAgQ29udGVudCBmcm9tIHB1YmxpYy13d3cgc2hvdWxkIGJlIGF2YWlsYWJsZSBmcm9tIEludGVybmV0LiBcblwKKyAgIFRoZSBVUkwgdG8gQ1JMIHNob3VsZCBiZSBzZXQgaW4gb3BlbnNzbC5jbmYuXG5cCisgICBBIGNyb24gam9iIHNob3VsZCBleGVjdXRlIG1ha2UgZ2VuY3JsIG9uY2UgYSBtb250aC5cblwKKyI7CisKKyMgRGVzdHJveSB0aGUgQ0EgY29tcGxldGVseS4gVXNlIHdpdGggY2FyZS4KK2Rlc3Ryb3k6CisJQGlmIFsgLXogIiQoZm9yY2UpIiBdOyB0aGVuIGVjaG8gIlJlc3RhcnQgZGlzYWJsZWQsIHVzZTogbWFrZSBkZXN0cm95IGZvcmNlPXkiOyBleGl0IDE7IGZpCisJQGlmIFsgISAtZCAkKFNUQVRJQ19ESVIpIF07IHRoZW4gZWNobyAiRXJyb3IgaW4gc2V0dXAiOyBleGl0IDE7IGZpCisJQGVjaG8gIlJlbW92aW5nIGV2ZXJ5dGhpbmcgKGZvciBkZWJ1ZyBwdXJwb3NlKS4uLiIKKwlAcm0gLXJmICQoRElSKS8qCisJQGxuIC1zZiAkKFNUQVRJQ19ESVIpL01ha2VmaWxlICQoRElSKQorCUBsbiAtc2YgJChTVEFUSUNfRElSKS9vcGVuc3NsLmNuZiAkKERJUikKKworIyBJbml0aWFsaXplIHRoZSBDQSBzdHJ1Y3R1cmUgYW5kIGtleXMuCitpbml0OgorCUBpZiBbIC1kICQoRElSKS9wcml2YXRlIF07IHRoZW4gZWNobyAiQ0EgYWxyZWFkeSBpbml0aWFsaXplZC4iOyBleGl0IDE7IGZpCisJQGVjaG8gIkNyZWF0aW5nIENBIHN0cnVjdHVyZS4uLiIKKwlAbWtkaXIgJChESVIpL2NybAorCUBta2RpciAkKERJUikvY2VydHMKKwlAbWtkaXIgJChESVIpL25ld2NlcnRzCisJQG1rZGlyICQoRElSKS9wdWJsaWMtd3d3CisJQG1rZGlyICQoRElSKS9wcml2YXRlCisJQGNobW9kIDcwMCAkKERJUikvcHJpdmF0ZQorCUBta2RpciAkKERJUikvY2xpZW50cworCUBta2RpciAkKERJUikvY2xpZW50cy9wcml2a2V5cworCUBta2RpciAkKERJUikvY2xpZW50cy9jc3IKKwlAbWtkaXIgJChESVIpL2NsaWVudHMvY2VydHMKKwlAZWNobyAiMDEiID4gJChESVIpL3NlcmlhbAorCUB0b3VjaCAkKERJUikvaW5kZXgudHh0CisJQG9wZW5zc2wgcmVxICQoQ09ORklHKSAtbmV3IC1iYXRjaCAteDUwOSAtZGF5cyAzNjUwIC1ub2RlcyAtbmV3a2V5IHJzYToyMDQ4IC1vdXQgJChESVIpL3B1YmxpYy13d3cvY2FjZXJ0LnBlbSBcCisJCS1rZXlvdXQgJChESVIpL3ByaXZhdGUvY2FrZXkucGVtIC1zdWJqIC9DPSQoQykvU1Q9JChTVCkvTD0kKEwpL089JChPKS9PVT0kKE9VKS9DTj0kKENBX0NOKS9lbWFpbEFkZHJlc3M9JChDQV9tYWlsKQorCUBsbiAtcyAkKERJUikvcHVibGljLXd3dy9jYWNlcnQucGVtICQoRElSKS9jZXJ0cy9gb3BlbnNzbCB4NTA5IC1ub291dCAtaGFzaCA8ICQoRElSKS9wdWJsaWMtd3d3L2NhY2VydC5wZW1gLjAKKwlAJChNQUtFKSAtZiAkKERJUikvTWFrZWZpbGUgZ2VuY3JsCisKKyMgUmVnZW5lcmF0ZSB0aGUgQ2VydGlmaWNhdGUgUmV2b2NhdGlvbiBMaXN0LgorIyBUaGlzIGxpc3Qgc2hvdWxkIGJlIGF2YWlsYWJsZSBwdWJsaWNseQorZ2VuY3JsOgorCUBvcGVuc3NsIGNhICQoQ09ORklHKSAtZ2VuY3JsIC1vdXQgJChESVIpL3B1YmxpYy13d3cvY3JsLnBlbQorCUBsbiAtc2YgJChESVIpL3B1YmxpYy13d3cvY3JsLnBlbSAkKERJUikvY3JsL2BvcGVuc3NsIGNybCAtbm9vdXQgLWhhc2ggPCAkKERJUikvcHVibGljLXd3dy9jcmwucGVtYC5yMAorCisjIENyZWF0ZSBhIG5ldyBwcml2YXRlIGtleSBhbmQgYSBDU1IsIGluIGNhc2UgdGhlIGNsaWVudCBkb2VzIG5vdCBwcm92aWRlIHRoZSBDU1IgYnkgYW5vdGhlciBtZWFuLgorIyBVc2FnZSBpczogbWFrZSBuZXdjc3IgbmFtZT1wZWVyLmNsaWVudC5mcWRuIGVtYWlsPWFkbWluQGNsaWVudC5mcWRuCituZXdjc3I6CisJQGlmIFsgLXogIiQobmFtZSkiIC1vIC16ICIkKGVtYWlsKSIgXTsgdGhlbiBlY2hvICJQbGVhc2UgcHJvdmlkZSBjZXJ0aWZpY2F0ZSBuYW1lIGFuZCBlbWFpbCBhZGRyZXNzOiBtYWtlIG5ld2NzciBuYW1lPW1uLm5hdXRpbHVzLm9yZyBlbWFpbD15b3VAbWFpbC5jb20iOyBleGl0IDE7IGZpCisJQGlmIFsgLWUgJChESVIpL2NsaWVudHMvY3NyLyQobmFtZSkuY3NyIF07IHRoZW4gZWNobyAiVGhlcmUgaXMgYWxyZWFkeSBhIHBlbmRpbmcgY3NyIGZvciB0aGlzIG5hbWUuIjsgZXhpdCAxOyBmaQorCUBpZiBbICEgLWUgJChESVIpL2NsaWVudHMvcHJpdmtleXMvJChuYW1lKS5rZXkucGVtIF07IFwKKwkJdGhlbiBlY2hvICJHZW5lcmF0aW5nIGEgcHJpdmF0ZSBrZXkgZm9yICQobmFtZSkgLi4uIjsgXAorCQlvcGVuc3NsIGdlbnJzYSAtb3V0ICQoRElSKS9jbGllbnRzL3ByaXZrZXlzLyQobmFtZSkua2V5LnBlbSAxMDI0OyBcCisJCWZpOworCUBlY2hvICJDcmVhdGluZyB0aGUgQ1NSIGluICQoRElSKS9jbGllbnRzL2Nzci8kKG5hbWUpLmNzciI7CisJQG9wZW5zc2wgcmVxICQoQ09ORklHKSAtbmV3IC1iYXRjaCAtb3V0ICQoRElSKS9jbGllbnRzL2Nzci8kKG5hbWUpLmNzciBcCisJCS1rZXkgJChESVIpL2NsaWVudHMvcHJpdmtleXMvJChuYW1lKS5rZXkucGVtIFwKKwkJLXN1YmogL0M9JChDKS9TVD0kKFNUKS9MPSQoTCkvTz0kKE8pL09VPSQoT1UpL0NOPSQobmFtZSkvZW1haWxBZGRyZXNzPSQoZW1haWwpCisKKyMgUHJvY2VzcyBhIENTUiB0byBjcmVhdGUgYSB4NTA5IGNlcnRpZmljYXRlLiBUaGUgY2VydGlmaWNhdGUgaXMgdmFsaWQgZm9yIDEgeWVhci4gCisjIEl0IHNob3VsZCBiZSBzZW50IHRvIHRoZSBjbGllbnQgYnkgYW55IG1lYW4uCitjZXJ0OgorCUBpZiBbIC16ICIkKG5hbWUpIiBdOyB0aGVuIGVjaG8gIm5hbWUgbXVzdCBiZSBwcm92aWRlZDogbWFrZSBjZXJ0IG5hbWU9bW4ubjYub3JnIjsgZXhpdCAxOyBmaQorCUBpZiBbICEgLWUgJChESVIpL2NsaWVudHMvY3NyLyQobmFtZSkuY3NyIF07IHRoZW4gZWNobyAiQ291bGQgbm90IGZpbmQgQ1NSIGluICQoRElSKS9jbGllbnRzL2Nzci8kKG5hbWUpLmNzci4iOyBleGl0IDE7IGZpCisJQGlmIFsgLWUgJChESVIpL2NsaWVudHMvY2VydHMvJChuYW1lKS5jZXJ0IF07IFwKKwkJdGhlbiBlY2hvICJSZXZva2luZyBvbGQgY2VydGlmaWNhdGUuLi4iOyBcCisJCSQoTUFLRSkgcmV2b2tlIG5hbWU9JChuYW1lKTsgXAorCQlmaTsKKwlAb3BlbnNzbCBjYSAkKENPTkZJRykgLWluICQoRElSKS9jbGllbnRzL2Nzci8kKG5hbWUpLmNzciBcCisJCS1vdXQgJChESVIpL2NsaWVudHMvY2VydHMvJChuYW1lKS5jZXJ0IFwKKwkJLWRheXMgJChEQVlTKSBcCisJCS1iYXRjaAorCUBsbiAtcyAkKERJUikvY2xpZW50cy9jZXJ0cy8kKG5hbWUpLmNlcnQgJChESVIpL2NlcnRzL2BvcGVuc3NsIHg1MDkgLW5vb3V0IC1oYXNoIDwgJChESVIpL2NsaWVudHMvY2VydHMvJChuYW1lKS5jZXJ0YC4wCisKKyMgUmV2b2tlIGEgY2VydGlmaWNhdGUuCityZXZva2U6CisJQGlmIFsgLXogIiQobmFtZSkiIF07IHRoZW4gZWNobyAibmFtZSBtdXN0IGJlIHByb3ZpZGVkOiBtYWtlIHJldm9rZSBuYW1lPW1uLm42Lm9yZyI7IGV4aXQgMTsgZmkKKwlAaWYgWyAhIC1lICQoRElSKS9jbGllbnRzL2NlcnRzLyQobmFtZSkuY2VydCBdOyBcCisJCXRoZW4gZWNobyAiJChESVIpL2NsaWVudHMvY2VydHMvJChuYW1lKS5jZXJ0IG5vdCBmb3VuZCI7IFwKKwkJZXhpdCAxOyBcCisJCWZpOworCUBvcGVuc3NsIGNhICQoQ09ORklHKSAtcmV2b2tlICQoRElSKS9jbGllbnRzL2NlcnRzLyQobmFtZSkuY2VydDsKKwlAcm0gLWYgJChESVIpL2NlcnRzL2BvcGVuc3NsIHg1MDkgLW5vb3V0IC1oYXNoIDwgJChESVIpL2NsaWVudHMvY2VydHMvJChuYW1lKS5jZXJ0YC4wCisJQCQoTUFLRSkgZ2VuY3JsCisKKyMgRW5kIG9mIGZpbGUuLi4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvUEtJL2NhX3NjcmlwdC9vcGVuc3NsLmNuZiBiL2NvbnRyaWIvUEtJL2NhX3NjcmlwdC9vcGVuc3NsLmNuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDY3MWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9QS0kvY2Ffc2NyaXB0L29wZW5zc2wuY25mCkBAIC0wLDAgKzEsMzE1IEBACisjCisjIE9wZW5TU0wgZXhhbXBsZSBjb25maWd1cmF0aW9uIGZpbGUuCisjIFRoaXMgaXMgbW9zdGx5IGJlaW5nIHVzZWQgZm9yIGdlbmVyYXRpb24gb2YgY2VydGlmaWNhdGUgcmVxdWVzdHMuCisjCisKKyMgVGhpcyBkZWZpbml0aW9uIHN0b3BzIHRoZSBmb2xsb3dpbmcgbGluZXMgY2hva2luZyBpZiBIT01FIGlzbid0CisjIGRlZmluZWQuCitIT01FCQkJPSAuCitSQU5ERklMRQkJPSAkRU5WOjpIT01FLy5ybmQKKworIyBFeHRyYSBPQkpFQ1QgSURFTlRJRklFUiBpbmZvOgorI29pZF9maWxlCQk9ICRFTlY6OkhPTUUvLm9pZAorb2lkX3NlY3Rpb24JCT0gbmV3X29pZHMKKworIyBUbyB1c2UgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUgd2l0aCB0aGUgIi1leHRmaWxlIiBvcHRpb24gb2YgdGhlCisjICJvcGVuc3NsIHg1MDkiIHV0aWxpdHksIG5hbWUgaGVyZSB0aGUgc2VjdGlvbiBjb250YWluaW5nIHRoZQorIyBYLjUwOXYzIGV4dGVuc2lvbnMgdG8gdXNlOgorIyBleHRlbnNpb25zCQk9IAorIyAoQWx0ZXJuYXRpdmVseSwgdXNlIGEgY29uZmlndXJhdGlvbiBmaWxlIHRoYXQgaGFzIG9ubHkKKyMgWC41MDl2MyBleHRlbnNpb25zIGluIGl0cyBtYWluIFs9IGRlZmF1bHRdIHNlY3Rpb24uKQorCitbIG5ld19vaWRzIF0KKworIyBXZSBjYW4gYWRkIG5ldyBPSURzIGluIGhlcmUgZm9yIHVzZSBieSAnY2EnIGFuZCAncmVxJy4KKyMgQWRkIGEgc2ltcGxlIE9JRCBsaWtlIHRoaXM6CisjIHRlc3RvaWQxPTEuMi4zLjQKKyMgT3IgdXNlIGNvbmZpZyBmaWxlIHN1YnN0aXR1dGlvbiBsaWtlIHRoaXM6CisjIHRlc3RvaWQyPSR7dGVzdG9pZDF9LjUuNgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworWyBjYSBdCitkZWZhdWx0X2NhCT0gQ0FfZGVmYXVsdAkJIyBUaGUgZGVmYXVsdCBjYSBzZWN0aW9uCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitbIENBX2RlZmF1bHQgXQorCitkaXIJCT0gL2V0Yy9vcGVuc3NsLWNhCSMgV2hlcmUgZXZlcnl0aGluZyBpcyBrZXB0CitjZXJ0cwkJPSAkZGlyL2NlcnRzCQkjIFdoZXJlIHRoZSBpc3N1ZWQgY2VydHMgYXJlIGtlcHQKK2NybF9kaXIJCT0gJGRpci9jcmwJCSMgV2hlcmUgdGhlIGlzc3VlZCBjcmwgYXJlIGtlcHQKK2RhdGFiYXNlCT0gJGRpci9pbmRleC50eHQJIyBkYXRhYmFzZSBpbmRleCBmaWxlLgorI3VuaXF1ZV9zdWJqZWN0CT0gbm8JCQkjIFNldCB0byAnbm8nIHRvIGFsbG93IGNyZWF0aW9uIG9mCisJCQkJCSMgc2V2ZXJhbCBjdGlmaWNhdGVzIHdpdGggc2FtZSBzdWJqZWN0LgorbmV3X2NlcnRzX2Rpcgk9ICRkaXIvbmV3Y2VydHMJCSMgZGVmYXVsdCBwbGFjZSBmb3IgbmV3IGNlcnRzLgorCitjZXJ0aWZpY2F0ZQk9ICRkaXIvcHVibGljLXd3dy9jYWNlcnQucGVtIAkjIFRoZSBDQSBjZXJ0aWZpY2F0ZQorc2VyaWFsCQk9ICRkaXIvc2VyaWFsIAkJIyBUaGUgY3VycmVudCBzZXJpYWwgbnVtYmVyCisjIGNybG51bWJlcgk9ICRkaXIvY3JsbnVtYmVyCSMgdGhlIGN1cnJlbnQgY3JsIG51bWJlcgorCQkJCQkjIG11c3QgYmUgY29tbWVudGVkIG91dCB0byBsZWF2ZSBhIFYxIENSTAorY3JsCQk9ICRkaXIvcHVibGljLXd3dy9jcmwucGVtIAkJIyBUaGUgY3VycmVudCBDUkwKK3ByaXZhdGVfa2V5CT0gJGRpci9wcml2YXRlL2Nha2V5LnBlbSMgVGhlIHByaXZhdGUga2V5CitSQU5ERklMRQk9ICRkaXIvcHJpdmF0ZS8ucmFuZAkjIHByaXZhdGUgcmFuZG9tIG51bWJlciBmaWxlCisKK3g1MDlfZXh0ZW5zaW9ucwk9IHVzcl9jZXJ0CQkjIFRoZSBleHRlbnRpb25zIHRvIGFkZCB0byB0aGUgY2VydAorCisjIENvbW1lbnQgb3V0IHRoZSBmb2xsb3dpbmcgdHdvIGxpbmVzIGZvciB0aGUgInRyYWRpdGlvbmFsIgorIyAoYW5kIGhpZ2hseSBicm9rZW4pIGZvcm1hdC4KK25hbWVfb3B0IAk9IGNhX2RlZmF1bHQJCSMgU3ViamVjdCBOYW1lIG9wdGlvbnMKK2NlcnRfb3B0IAk9IGNhX2RlZmF1bHQJCSMgQ2VydGlmaWNhdGUgZmllbGQgb3B0aW9ucworCisjIEV4dGVuc2lvbiBjb3B5aW5nIG9wdGlvbjogdXNlIHdpdGggY2F1dGlvbi4KKyMgY29weV9leHRlbnNpb25zID0gY29weQorCisjIEV4dGVuc2lvbnMgdG8gYWRkIHRvIGEgQ1JMLiBOb3RlOiBOZXRzY2FwZSBjb21tdW5pY2F0b3IgY2hva2VzIG9uIFYyIENSTHMKKyMgc28gdGhpcyBpcyBjb21tZW50ZWQgb3V0IGJ5IGRlZmF1bHQgdG8gbGVhdmUgYSBWMSBDUkwuCisjIGNybG51bWJlciBtdXN0IGFsc28gYmUgY29tbWVudGVkIG91dCB0byBsZWF2ZSBhIFYxIENSTC4KKyMgY3JsX2V4dGVuc2lvbnMJPSBjcmxfZXh0CisKK2RlZmF1bHRfZGF5cwk9IDM2NQkJCSMgaG93IGxvbmcgdG8gY2VydGlmeSBmb3IKK2RlZmF1bHRfY3JsX2RheXM9IDMwCQkJIyBob3cgbG9uZyBiZWZvcmUgbmV4dCBDUkwKK2RlZmF1bHRfbWQJPSBzaGExCQkJIyB3aGljaCBtZCB0byB1c2UuCitwcmVzZXJ2ZQk9IG5vCQkJIyBrZWVwIHBhc3NlZCBETiBvcmRlcmluZworCisjIEEgZmV3IGRpZmZlcmVuY2Ugd2F5IG9mIHNwZWNpZnlpbmcgaG93IHNpbWlsYXIgdGhlIHJlcXVlc3Qgc2hvdWxkIGxvb2sKKyMgRm9yIHR5cGUgQ0EsIHRoZSBsaXN0ZWQgYXR0cmlidXRlcyBtdXN0IGJlIHRoZSBzYW1lLCBhbmQgdGhlIG9wdGlvbmFsCisjIGFuZCBzdXBwbGllZCBmaWVsZHMgYXJlIGp1c3QgdGhhdCA6LSkKKyMgcG9saWN5CQk9IHBvbGljeV9tYXRjaAorcG9saWN5CQkJPSBwb2xpY3lfYW55dGhpbmcKKworIyBGb3IgdGhlIENBIHBvbGljeQorWyBwb2xpY3lfbWF0Y2ggXQorY291bnRyeU5hbWUJCT0gbWF0Y2gKK3N0YXRlT3JQcm92aW5jZU5hbWUJPSBtYXRjaAorb3JnYW5pemF0aW9uTmFtZQk9IG1hdGNoCitvcmdhbml6YXRpb25hbFVuaXROYW1lCT0gb3B0aW9uYWwKK2NvbW1vbk5hbWUJCT0gc3VwcGxpZWQKK2VtYWlsQWRkcmVzcwkJPSBvcHRpb25hbAorCisjIEZvciB0aGUgJ2FueXRoaW5nJyBwb2xpY3kKKyMgQXQgdGhpcyBwb2ludCBpbiB0aW1lLCB5b3UgbXVzdCBsaXN0IGFsbCBhY2NlcHRhYmxlICdvYmplY3QnCisjIHR5cGVzLgorWyBwb2xpY3lfYW55dGhpbmcgXQorY291bnRyeU5hbWUJCT0gb3B0aW9uYWwKK3N0YXRlT3JQcm92aW5jZU5hbWUJPSBvcHRpb25hbAorbG9jYWxpdHlOYW1lCQk9IG9wdGlvbmFsCitvcmdhbml6YXRpb25OYW1lCT0gb3B0aW9uYWwKK29yZ2FuaXphdGlvbmFsVW5pdE5hbWUJPSBvcHRpb25hbAorY29tbW9uTmFtZQkJPSBzdXBwbGllZAorZW1haWxBZGRyZXNzCQk9IG9wdGlvbmFsCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitbIHJlcSBdCitkZWZhdWx0X2JpdHMJCT0gMTAyNAorZGVmYXVsdF9rZXlmaWxlIAk9IHByaXZrZXkucGVtCitkaXN0aW5ndWlzaGVkX25hbWUJPSByZXFfZGlzdGluZ3Vpc2hlZF9uYW1lCithdHRyaWJ1dGVzCQk9IHJlcV9hdHRyaWJ1dGVzCit4NTA5X2V4dGVuc2lvbnMJPSB2M19jYQkjIFRoZSBleHRlbnRpb25zIHRvIGFkZCB0byB0aGUgc2VsZiBzaWduZWQgY2VydAorCisjIFBhc3N3b3JkcyBmb3IgcHJpdmF0ZSBrZXlzIGlmIG5vdCBwcmVzZW50IHRoZXkgd2lsbCBiZSBwcm9tcHRlZCBmb3IKKyMgaW5wdXRfcGFzc3dvcmQgPSBmZHNlY3JldAorIyBvdXRwdXRfcGFzc3dvcmQgPSBmZHNlY3JldAorCisjIFRoaXMgc2V0cyBhIG1hc2sgZm9yIHBlcm1pdHRlZCBzdHJpbmcgdHlwZXMuIFRoZXJlIGFyZSBzZXZlcmFsIG9wdGlvbnMuIAorIyBkZWZhdWx0OiBQcmludGFibGVTdHJpbmcsIFQ2MVN0cmluZywgQk1QU3RyaW5nLgorIyBwa2l4CSA6IFByaW50YWJsZVN0cmluZywgQk1QU3RyaW5nLgorIyB1dGY4b25seTogb25seSBVVEY4U3RyaW5ncy4KKyMgbm9tYnN0ciA6IFByaW50YWJsZVN0cmluZywgVDYxU3RyaW5nIChubyBCTVBTdHJpbmdzIG9yIFVURjhTdHJpbmdzKS4KKyMgTUFTSzpYWFhYIGEgbGl0ZXJhbCBtYXNrIHZhbHVlLgorIyBXQVJOSU5HOiBjdXJyZW50IHZlcnNpb25zIG9mIE5ldHNjYXBlIGNyYXNoIG9uIEJNUFN0cmluZ3Mgb3IgVVRGOFN0cmluZ3MKKyMgc28gdXNlIHRoaXMgb3B0aW9uIHdpdGggY2F1dGlvbiEKK3N0cmluZ19tYXNrID0gdXRmOG9ubHkKKworIyByZXFfZXh0ZW5zaW9ucyA9IHYzX3JlcSAjIFRoZSBleHRlbnNpb25zIHRvIGFkZCB0byBhIGNlcnRpZmljYXRlIHJlcXVlc3QKKworWyByZXFfZGlzdGluZ3Vpc2hlZF9uYW1lIF0KK2NvdW50cnlOYW1lCQkJPSBDb3VudHJ5IE5hbWUgKDIgbGV0dGVyIGNvZGUpCitjb3VudHJ5TmFtZV9kZWZhdWx0CQk9IEpQCitjb3VudHJ5TmFtZV9taW4JCQk9IDIKK2NvdW50cnlOYW1lX21heAkJCT0gMgorCitzdGF0ZU9yUHJvdmluY2VOYW1lCQk9IFN0YXRlIG9yIFByb3ZpbmNlIE5hbWUgKGZ1bGwgbmFtZSkKK3N0YXRlT3JQcm92aW5jZU5hbWVfZGVmYXVsdAk9IFRva3lvCisKK2xvY2FsaXR5TmFtZQkJCT0gTG9jYWxpdHkgTmFtZSAoZWcsIGNpdHkpCitsb2NhbGl0eU5hbWVfZGVmYXVsdAkJPSBLb2dhbmVpCisKKzAub3JnYW5pemF0aW9uTmFtZQkJPSBPcmdhbml6YXRpb24gTmFtZSAoZWcsIGNvbXBhbnkpCiswLm9yZ2FuaXphdGlvbk5hbWVfZGVmYXVsdAk9IFdJREUKKworIyB3ZSBjYW4gZG8gdGhpcyBidXQgaXQgaXMgbm90IG5lZWRlZCBub3JtYWxseSA6LSkKKzEub3JnYW5pemF0aW9uTmFtZQkJPSBTZWNvbmQgT3JnYW5pemF0aW9uIE5hbWUgKGVnLCBjb21wYW55KQorMS5vcmdhbml6YXRpb25OYW1lX2RlZmF1bHQJPSBOSUNUCisKK29yZ2FuaXphdGlvbmFsVW5pdE5hbWUJCT0gT3JnYW5pemF0aW9uYWwgVW5pdCBOYW1lIChlZywgc2VjdGlvbikKK29yZ2FuaXphdGlvbmFsVW5pdE5hbWVfZGVmYXVsdAk9IEFBQSBXRworCitjb21tb25OYW1lCQkJPSBDb21tb24gTmFtZSAoaS5lLiBEaWFtZXRlciBBZ2VudCBob3N0bmFtZSkKK2NvbW1vbk5hbWVfbWF4CQkJPSA2NAorCitlbWFpbEFkZHJlc3MJCQk9IEVtYWlsIEFkZHJlc3MgKGkuZS4gRGlhbWV0ZXIgYWdlbnQgYWRtaW5pc3RyYXRvcikKK2VtYWlsQWRkcmVzc19tYXgJCT0gNjQKKworIyBTRVQtZXgzCQkJPSBTRVQgZXh0ZW5zaW9uIG51bWJlciAzCisKK1sgcmVxX2F0dHJpYnV0ZXMgXQorY2hhbGxlbmdlUGFzc3dvcmQJCT0gQSBjaGFsbGVuZ2UgcGFzc3dvcmQKK2NoYWxsZW5nZVBhc3N3b3JkX21pbgkJPSAwCitjaGFsbGVuZ2VQYXNzd29yZF9tYXgJCT0gMjAKKwordW5zdHJ1Y3R1cmVkTmFtZQkJPSBBbiBvcHRpb25hbCBjb21wYW55IG5hbWUKKworWyB1c3JfY2VydCBdCisKKyMgVGhlc2UgZXh0ZW5zaW9ucyBhcmUgYWRkZWQgd2hlbiAnY2EnIHNpZ25zIGEgcmVxdWVzdC4KKworIyBUaGlzIGdvZXMgYWdhaW5zdCBQS0lYIGd1aWRlbGluZXMgYnV0IHNvbWUgQ0FzIGRvIGl0IGFuZCBzb21lIHNvZnR3YXJlCisjIHJlcXVpcmVzIHRoaXMgdG8gYXZvaWQgaW50ZXJwcmV0aW5nIGFuIGVuZCB1c2VyIGNlcnRpZmljYXRlIGFzIGEgQ0EuCisKK2Jhc2ljQ29uc3RyYWludHM9Q0E6RkFMU0UKKworIyBIZXJlIGFyZSBzb21lIGV4YW1wbGVzIG9mIHRoZSB1c2FnZSBvZiBuc0NlcnRUeXBlLiBJZiBpdCBpcyBvbWl0dGVkCisjIHRoZSBjZXJ0aWZpY2F0ZSBjYW4gYmUgdXNlZCBmb3IgYW55dGhpbmcgKmV4Y2VwdCogb2JqZWN0IHNpZ25pbmcuCisKKyMgVGhpcyBpcyBPSyBmb3IgYW4gU1NMIHNlcnZlci4KKyMgbnNDZXJ0VHlwZQkJCT0gc2VydmVyCisKKyMgRm9yIGFuIG9iamVjdCBzaWduaW5nIGNlcnRpZmljYXRlIHRoaXMgd291bGQgYmUgdXNlZC4KKyMgbnNDZXJ0VHlwZSA9IG9ianNpZ24KKworIyBGb3Igbm9ybWFsIGNsaWVudCB1c2UgdGhpcyBpcyB0eXBpY2FsCisjIG5zQ2VydFR5cGUgPSBjbGllbnQsIGVtYWlsCisKKyMgYW5kIGZvciBldmVyeXRoaW5nIGluY2x1ZGluZyBvYmplY3Qgc2lnbmluZzoKKyMgbnNDZXJ0VHlwZSA9IGNsaWVudCwgZW1haWwsIG9ianNpZ24KKworIyBUaGlzIGlzIHR5cGljYWwgaW4ga2V5VXNhZ2UgZm9yIGEgY2xpZW50IGNlcnRpZmljYXRlLgorIyBrZXlVc2FnZSA9IG5vblJlcHVkaWF0aW9uLCBkaWdpdGFsU2lnbmF0dXJlLCBrZXlFbmNpcGhlcm1lbnQKKworIyBUaGlzIHdpbGwgYmUgZGlzcGxheWVkIGluIE5ldHNjYXBlJ3MgY29tbWVudCBsaXN0Ym94LgorbnNDb21tZW50CQkJPSAiT3BlblNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUiCisKKyMgUEtJWCByZWNvbW1lbmRhdGlvbnMgaGFybWxlc3MgaWYgaW5jbHVkZWQgaW4gYWxsIGNlcnRpZmljYXRlcy4KK3N1YmplY3RLZXlJZGVudGlmaWVyPWhhc2gKK2F1dGhvcml0eUtleUlkZW50aWZpZXI9a2V5aWQsaXNzdWVyCisKKyMgVGhpcyBzdHVmZiBpcyBmb3Igc3ViamVjdEFsdE5hbWUgYW5kIGlzc3VlckFsdG5hbWUuCisjIEltcG9ydCB0aGUgZW1haWwgYWRkcmVzcy4KKyMgc3ViamVjdEFsdE5hbWU9ZW1haWw6Y29weQorIyBBbiBhbHRlcm5hdGl2ZSB0byBwcm9kdWNlIGNlcnRpZmljYXRlcyB0aGF0IGFyZW4ndAorIyBkZXByZWNhdGVkIGFjY29yZGluZyB0byBQS0lYLgorIyBzdWJqZWN0QWx0TmFtZT1lbWFpbDptb3ZlCisKKyMgQ29weSBzdWJqZWN0IGRldGFpbHMKKyMgaXNzdWVyQWx0TmFtZT1pc3N1ZXI6Y29weQorCisjbnNDYVJldm9jYXRpb25VcmwJCT0gaHR0cDovL3d3dy5kb21haW4uZG9tL2NhLWNybC5wZW0KKyNuc0Jhc2VVcmwKKyNuc1Jldm9jYXRpb25VcmwKKyNuc1JlbmV3YWxVcmwKKyNuc0NhUG9saWN5VXJsCisjbnNTc2xTZXJ2ZXJOYW1lCisKK1sgdjNfcmVxIF0KKworIyBFeHRlbnNpb25zIHRvIGFkZCB0byBhIGNlcnRpZmljYXRlIHJlcXVlc3QKKworYmFzaWNDb25zdHJhaW50cyA9IENBOkZBTFNFCitrZXlVc2FnZSA9IG5vblJlcHVkaWF0aW9uLCBkaWdpdGFsU2lnbmF0dXJlLCBrZXlFbmNpcGhlcm1lbnQKKworWyB2M19jYSBdCisKKworIyBFeHRlbnNpb25zIGZvciBhIHR5cGljYWwgQ0EKKworCisjIFBLSVggcmVjb21tZW5kYXRpb24uCisKK3N1YmplY3RLZXlJZGVudGlmaWVyPWhhc2gKKworYXV0aG9yaXR5S2V5SWRlbnRpZmllcj1rZXlpZDphbHdheXMsaXNzdWVyOmFsd2F5cworCisjIFRoaXMgaXMgd2hhdCBQS0lYIHJlY29tbWVuZHMgYnV0IHNvbWUgYnJva2VuIHNvZnR3YXJlIGNob2tlcyBvbiBjcml0aWNhbAorIyBleHRlbnNpb25zLgorI2Jhc2ljQ29uc3RyYWludHMgPSBjcml0aWNhbCxDQTp0cnVlCisjIFNvIHdlIGRvIHRoaXMgaW5zdGVhZC4KK2Jhc2ljQ29uc3RyYWludHMgPSBDQTp0cnVlCisKKyMgS2V5IHVzYWdlOiB0aGlzIGlzIHR5cGljYWwgZm9yIGEgQ0EgY2VydGlmaWNhdGUuIEhvd2V2ZXIgc2luY2UgaXQgd2lsbAorIyBwcmV2ZW50IGl0IGJlaW5nIHVzZWQgYXMgYW4gdGVzdCBzZWxmLXNpZ25lZCBjZXJ0aWZpY2F0ZSBpdCBpcyBiZXN0CisjIGxlZnQgb3V0IGJ5IGRlZmF1bHQuCisjIGtleVVzYWdlID0gY1JMU2lnbiwga2V5Q2VydFNpZ24KKworIyBTb21lIG1pZ2h0IHdhbnQgdGhpcyBhbHNvCisjIG5zQ2VydFR5cGUgPSBzc2xDQSwgZW1haWxDQQorCisjIEluY2x1ZGUgZW1haWwgYWRkcmVzcyBpbiBzdWJqZWN0IGFsdCBuYW1lOiBhbm90aGVyIFBLSVggcmVjb21tZW5kYXRpb24KKyMgc3ViamVjdEFsdE5hbWU9ZW1haWw6Y29weQorIyBDb3B5IGlzc3VlciBkZXRhaWxzCisjIGlzc3VlckFsdE5hbWU9aXNzdWVyOmNvcHkKKworIyBERVIgaGV4IGVuY29kaW5nIG9mIGFuIGV4dGVuc2lvbjogYmV3YXJlIGV4cGVydHMgb25seSEKKyMgb2JqPURFUjowMjowMworIyBXaGVyZSAnb2JqJyBpcyBhIHN0YW5kYXJkIG9yIGFkZGVkIG9iamVjdAorIyBZb3UgY2FuIGV2ZW4gb3ZlcnJpZGUgYSBzdXBwb3J0ZWQgZXh0ZW5zaW9uOgorIyBiYXNpY0NvbnN0cmFpbnRzPSBjcml0aWNhbCwgREVSOjMwOjAzOjAxOjAxOkZGCisKK1sgY3JsX2V4dCBdCisKKyMgQ1JMIGV4dGVuc2lvbnMuCisjIE9ubHkgaXNzdWVyQWx0TmFtZSBhbmQgYXV0aG9yaXR5S2V5SWRlbnRpZmllciBtYWtlIGFueSBzZW5zZSBpbiBhIENSTC4KKworIyBpc3N1ZXJBbHROYW1lPWlzc3Vlcjpjb3B5CithdXRob3JpdHlLZXlJZGVudGlmaWVyPWtleWlkOmFsd2F5cyxpc3N1ZXI6YWx3YXlzCisKK1sgcHJveHlfY2VydF9leHQgXQorIyBUaGVzZSBleHRlbnNpb25zIHNob3VsZCBiZSBhZGRlZCB3aGVuIGNyZWF0aW5nIGEgcHJveHkgY2VydGlmaWNhdGUKKworIyBUaGlzIGdvZXMgYWdhaW5zdCBQS0lYIGd1aWRlbGluZXMgYnV0IHNvbWUgQ0FzIGRvIGl0IGFuZCBzb21lIHNvZnR3YXJlCisjIHJlcXVpcmVzIHRoaXMgdG8gYXZvaWQgaW50ZXJwcmV0aW5nIGFuIGVuZCB1c2VyIGNlcnRpZmljYXRlIGFzIGEgQ0EuCisKK2Jhc2ljQ29uc3RyYWludHM9Q0E6RkFMU0UKKworIyBIZXJlIGFyZSBzb21lIGV4YW1wbGVzIG9mIHRoZSB1c2FnZSBvZiBuc0NlcnRUeXBlLiBJZiBpdCBpcyBvbWl0dGVkCisjIHRoZSBjZXJ0aWZpY2F0ZSBjYW4gYmUgdXNlZCBmb3IgYW55dGhpbmcgKmV4Y2VwdCogb2JqZWN0IHNpZ25pbmcuCisKKyMgVGhpcyBpcyBPSyBmb3IgYW4gU1NMIHNlcnZlci4KKyMgbnNDZXJ0VHlwZQkJCT0gc2VydmVyCisKKyMgRm9yIGFuIG9iamVjdCBzaWduaW5nIGNlcnRpZmljYXRlIHRoaXMgd291bGQgYmUgdXNlZC4KKyMgbnNDZXJ0VHlwZSA9IG9ianNpZ24KKworIyBGb3Igbm9ybWFsIGNsaWVudCB1c2UgdGhpcyBpcyB0eXBpY2FsCisjIG5zQ2VydFR5cGUgPSBjbGllbnQsIGVtYWlsCisKKyMgYW5kIGZvciBldmVyeXRoaW5nIGluY2x1ZGluZyBvYmplY3Qgc2lnbmluZzoKKyMgbnNDZXJ0VHlwZSA9IGNsaWVudCwgZW1haWwsIG9ianNpZ24KKworIyBUaGlzIGlzIHR5cGljYWwgaW4ga2V5VXNhZ2UgZm9yIGEgY2xpZW50IGNlcnRpZmljYXRlLgorIyBrZXlVc2FnZSA9IG5vblJlcHVkaWF0aW9uLCBkaWdpdGFsU2lnbmF0dXJlLCBrZXlFbmNpcGhlcm1lbnQKKworIyBUaGlzIHdpbGwgYmUgZGlzcGxheWVkIGluIE5ldHNjYXBlJ3MgY29tbWVudCBsaXN0Ym94LgorbnNDb21tZW50CQkJPSAiT3BlblNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUiCisKKyMgUEtJWCByZWNvbW1lbmRhdGlvbnMgaGFybWxlc3MgaWYgaW5jbHVkZWQgaW4gYWxsIGNlcnRpZmljYXRlcy4KK3N1YmplY3RLZXlJZGVudGlmaWVyPWhhc2gKK2F1dGhvcml0eUtleUlkZW50aWZpZXI9a2V5aWQsaXNzdWVyOmFsd2F5cworCisjIFRoaXMgc3R1ZmYgaXMgZm9yIHN1YmplY3RBbHROYW1lIGFuZCBpc3N1ZXJBbHRuYW1lLgorIyBJbXBvcnQgdGhlIGVtYWlsIGFkZHJlc3MuCisjIHN1YmplY3RBbHROYW1lPWVtYWlsOmNvcHkKKyMgQW4gYWx0ZXJuYXRpdmUgdG8gcHJvZHVjZSBjZXJ0aWZpY2F0ZXMgdGhhdCBhcmVuJ3QKKyMgZGVwcmVjYXRlZCBhY2NvcmRpbmcgdG8gUEtJWC4KKyMgc3ViamVjdEFsdE5hbWU9ZW1haWw6bW92ZQorCisjIENvcHkgc3ViamVjdCBkZXRhaWxzCisjIGlzc3VlckFsdE5hbWU9aXNzdWVyOmNvcHkKKworI25zQ2FSZXZvY2F0aW9uVXJsCQk9IGh0dHA6Ly93d3cuZG9tYWluLmRvbS9jYS1jcmwucGVtCisjbnNCYXNlVXJsCisjbnNSZXZvY2F0aW9uVXJsCisjbnNSZW5ld2FsVXJsCisjbnNDYVBvbGljeVVybAorI25zU3NsU2VydmVyTmFtZQorCisjIFRoaXMgcmVhbGx5IG5lZWRzIHRvIGJlIGluIHBsYWNlIGZvciBpdCB0byBiZSBhIHByb3h5IGNlcnRpZmljYXRlLgorcHJveHlDZXJ0SW5mbz1jcml0aWNhbCxsYW5ndWFnZTppZC1wcGwtYW55TGFuZ3VhZ2UscGF0aGxlbjozLHBvbGljeTpmb28KZGlmZiAtLWdpdCBhL2NvbnRyaWIvUEtJL2NhX3NjcmlwdDIvTWFrZWZpbGUgYi9jb250cmliL1BLSS9jYV9zY3JpcHQyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NTE3NmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL1BLSS9jYV9zY3JpcHQyL01ha2VmaWxlCkBAIC0wLDAgKzEsMTc4IEBACisjIS91c3IvYmluL21ha2UgLXMKKyMKKyMgVGhpcyBmaWxlIGlzIGluc3BpcmVkIGZyb20gZnJlZURpYW1ldGVyJ3MgY29udHJpYi9jYV9zY3JpcHQgYW5kCisjIGltcHJvdmVkIHRvIGhhbmRsZSBtdWx0aXBsZSBDQSBpbiBhIGhpZXJhcmNoaWNhbCBmYXNoaW9uLgorIyBXYXJuaW5nOiB0aGUgZGlyZWN0b3J5IHN0cnVjdHVyZSBpcyBmbGF0LCBkb2VzIG5vdCByZWZsZWN0IHRoZSBDQSBoaWVyYXJjaHkKKworU0NSSVBUX0RJUiA9IC4KK0RBVEFfRElSID0gLi9jYV9kYXRhCisKK0NPTkZJRyA9IC1jb25maWcgJChTQ1JJUFRfRElSKS9vcGVuc3NsLmNuZgorUkVNQUtFID0gJChNQUtFKSAtZiAkKFNDUklQVF9ESVIpL01ha2VmaWxlCisKKyNEaXNhYmxlICJtYWtlIGRlc3Ryb3kiIC0tIG92ZXJ3cml0ZSBvbiBjb21tYW5kIGxpbmUKK2ZvcmNlID0gCisKKyNSU0Ega2V5IHNpemVzLCBjYW4gYmUgb3ZlcndyaXR0ZW4gb24gY29tbWFuZCBsaW5lCitjYWtleXNpemUgPSAyMDQ4CitrZXlzaXplID0gMTAyNAorCisjIFNhdmUgY3VycmVudCBkYXRlCitEQVRFPWBkYXRlICslWSVtJWQtJUglTSVTYAorCisjIERlZmF1bHQ6IHByaW50IHRoZSBoZWxwCithbGw6CWhlbHAKKworIyBIZWxwIG1lc3NhZ2UKK2hlbHA6CisJQGVjaG8gIlxuXAorQXZhaWxhYmxlIGNvbW1hbmRzOlxuXAorICAgbWFrZSBpbml0IHRvcGNhPW5hbWVcblwKKyAgICAgICBDcmVhdGVzIHRoZSBpbml0aWFsIHRvcC1sZXZlbCBDQSBzdHJ1Y3R1cmVcblwKKyAgIG1ha2UgbmV3Y2EgbmFtZT1uZXdjYW5hbWUgY2E9cGFyZW50Y2FcblwKKyAgICAgICBDcmVhdGVzIGEgbmV3IHN1Yi1DQSB0aGF0IGNhbiBiZSB1c2VkIGZvciBjZXJ0aWZpY2F0ZXMgbGF0ZXIuXG5cCisgICBtYWtlIG5ld2NlcnQgbmFtZT1mb28gY2E9cGFyZW50Y2FcblwKKyAgICAgICBDcmVhdGUgcHJpdmF0ZSBrZXkgYW5kIGNzciwgdGhlbiBpc3N1ZSB0aGUgY2VydGlmaWNhdGUgKG5hbWVkIGZvby4qKVxuXAorICAgbWFrZSBwMTIgbmFtZT1mb28gY2E9cGFyZW50Y2FcblwKKyAgICAgICBTYW1lIGFzIG5ld2NlcnQsIGJ1dCBhZGRpdGlvbm5hbHkgY3JlYXRlcyBhIHBrY3MxMiBmaWxlIHRvIHNoaXAgY2xpZW50IGNlcnRpZmljYXRlIHRvIFdpbmRvd3Mgb3IgTWFjXG5cCisgICBtYWtlIHNoaXAgbmFtZT1mb28gY2E9cGFyZW50Y2FcblwKKyAgICAgICBDcmVhdGUgYW4gYXJjaGl2ZSB3aXRoIHRoZSBkYXRhIGZvciB0aGUgY2xpZW50ICh1c2VmdWwgZm9yIGZyZWVEaWFtZXRlciBwZWVycylcblwKKyAgIG1ha2UgcmV2b2tlIG5hbWU9Zm9vIGNhPXBhcmVudGNhXG5cCisgICAgICAgUmV2b2tlcyB0aGUgY2VydGlmaWNhdGUgZm9vLmNlcnQgaXNzdWVkIGJ5IHBhcmVudGNhIGFuZCByZWdlbmVyYXRlcyB0aGUgQ1JMLlxuXAorICAgbWFrZSBnZW5jcmwgY2E9Y2FuYW1lXG5cCisgICAgICAgUmVnZW5lcmF0ZXMgdGhlIENSTCBvZiBDQSBjYW5hbWUuIFNob3VsZCBiZSBydW4gcGVyaW9kaWNhbGx5LlxuXAorXG5cCisiOworCisjIERlc3Ryb3kgdGhlIENBIGhpZXJhcmNoeSBjb21wbGV0ZWx5LiBVc2Ugd2l0aCBjYXJlLgorZGVzdHJveToKKwlAaWYgWyAteiAiJChmb3JjZSkiIF07IHRoZW4gZWNobyAiRGVzdHJveSBkaXNhYmxlZCwgdXNlOiBtYWtlIGRlc3Ryb3kgZm9yY2U9eSI7IGV4aXQgMTsgZmkKKwlAaWYgWyAhIC1kICQoU0NSSVBUX0RJUikgXTsgdGhlbiBlY2hvICJFcnJvciBpbiBzZXR1cCI7IGV4aXQgMTsgZmkKKwlAZWNobyAiUmVtb3ZpbmcgZXZlcnl0aGluZyAoZm9yIGRlYnVnIHB1cnBvc2UpLi4uIgorCUBybSAtcmYgJChEQVRBX0RJUikvKgorCisjIEluaXRpYWxpemUgdGhlIENBIHN0cnVjdHVyZQorc3RydWN0dXJlOgorCUBpZiBbIC16ICIkKGNhbmFtZSkiIF07IHRoZW4gZWNobyAiSW50ZXJuYWwgZXJyb3I6IGNhbmFtZSBpcyBtaXNzaW5nIjsgZXhpdCAxOyBmaQorCUBpZiBbIC1kICQoREFUQV9ESVIpLyQoY2FuYW1lKSBdOyB0aGVuIGVjaG8gIkNBICQoY2FuYW1lKSBhbHJlYWR5IGV4aXN0cy4iOyBleGl0IDE7IGZpCisJIyBDcmVhdGluZyBDQSBzdHJ1Y3R1cmUKKwlAbWtkaXIgLXAgJChEQVRBX0RJUikvJChjYW5hbWUpCisJQG1rZGlyICQoREFUQV9ESVIpLyQoY2FuYW1lKS9wdWJsaWMKKwlAbWtkaXIgJChEQVRBX0RJUikvJChjYW5hbWUpL3B1YmxpYy9jcmwKKwlAbWtkaXIgJChEQVRBX0RJUikvJChjYW5hbWUpL3ByaXZhdGUKKwlAY2htb2QgNzAwICQoREFUQV9ESVIpLyQoY2FuYW1lKS9wcml2YXRlCisJQG1rZGlyICQoREFUQV9ESVIpLyQoY2FuYW1lKS9jbGllbnRzCisJQGVjaG8gIjAxIiA+ICQoREFUQV9ESVIpLyQoY2FuYW1lKS9zZXJpYWwKKwlAZWNobyAiMDEiID4gJChEQVRBX0RJUikvJChjYW5hbWUpL2NybG51bWJlcgorCUB0b3VjaCAkKERBVEFfRElSKS8kKGNhbmFtZSkvaW5kZXgudHh0CisKKyMgSW5pdGlhbGl6ZSB0aGUgdG9wLWxldmVsIENBIHN0cnVjdHVyZSBhbmQga2V5cy4KK2luaXQ6CisJQGlmIFsgLXogIiQodG9wY2EpIiBdOyB0aGVuIGVjaG8gIlBsZWFzZSBzcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSByb290IENBLiBFeDogbWFrZSBpbml0IHRvcGNhPXJvb3RjYS50ZXN0YmVkLmFhYSI7IGV4aXQgMTsgZmkKKwkjIENyZWF0ZSB0aGUgZm9sZGVyIGhpZXJhcmNoeQorCUAkKFJFTUFLRSkgc3RydWN0dXJlIGNhbmFtZT0kKHRvcGNhKQorCSMgR2VuZXJhdGUgdGhlIHNlbGYtc2lnbmVkIGNlcnRpZmljYXRlCisJQENBX1JPT1RfRElSPSQoREFUQV9ESVIpLyQodG9wY2EpIG9wZW5zc2wgcmVxICQoQ09ORklHKSAtbmV3IC1iYXRjaCAteDUwOSAtZGF5cyAzNjUwIC1ub2RlcyAtbmV3a2V5IHJzYTokKGNha2V5c2l6ZSkgLW91dCAkKERBVEFfRElSKS8kKHRvcGNhKS9wdWJsaWMvY2FjZXJ0LnBlbSBcCisJCS1rZXlvdXQgJChEQVRBX0RJUikvJCh0b3BjYSkvcHJpdmF0ZS9jYWtleS5wZW0gLWV4dGVuc2lvbnMgY2FfY2VydCAtc3ViaiAvQ049JCh0b3BjYSkKKwlAbG4gLXMgY2FjZXJ0LnBlbSAkKERBVEFfRElSKS8kKHRvcGNhKS9wdWJsaWMvYG9wZW5zc2wgeDUwOSAtbm9vdXQgLWhhc2ggPCAkKERBVEFfRElSKS8kKHRvcGNhKS9wdWJsaWMvY2FjZXJ0LnBlbWAuMAorCUB0b3VjaCAkKERBVEFfRElSKS8kKHRvcGNhKS9wdWJsaWMvY2FjaGFpbi5wZW0KKwlAbG4gLXMgLi4vLi4vJCh0b3BjYSkvcHVibGljL2NhY2VydC5wZW0gJChEQVRBX0RJUikvJCh0b3BjYSkvcHVibGljL2Nhcm9vdC5wZW0gCisJQCQoUkVNQUtFKSBnZW5jcmwgY2E9JCh0b3BjYSkKKworIyBDcmVhdGUgYSBzZWNvbmRhcnkgQ0EKK25ld2NhOgorCUBpZiBbIC16ICIkKG5hbWUpIiAtbyAteiAiJChjYSkiIF07IHRoZW4gZWNobyAiTWlzc2luZyBwYXJhbWV0ZXIuIEV4OiBtYWtlIG5ld2NhIG5hbWU9c3ViY2EudGVzdGJlZC5hYWEgY2E9cm9vdGNhLnRlc3RiZWQuYWFhIjsgZXhpdCAxOyBmaQorCUBpZiBbICEgLWUgJChEQVRBX0RJUikvJChjYSkvcHJpdmF0ZS9jYWtleS5wZW0gXTsgdGhlbiBlY2hvICJUaGUgcGFyZW50IENBICQoY2EpIGRvZXMgbm90IGV4aXN0LiI7IGV4aXQgMTsgZmkKKwlAaWYgWyAhIC1kICQoREFUQV9ESVIpLyQobmFtZSkgXTsgdGhlbiAkKFJFTUFLRSkgc3RydWN0dXJlIGNhbmFtZT0kKG5hbWUpOyBmaQorCSMgR2VuZXJhdGUgdGhlIHByaXZhdGUga2V5IGFuZCBDU1IgZm9yIHRoZSBuZXcgQ0EgaWYgbmVlZGVkCisJQGlmIFsgISAtZSAkKERBVEFfRElSKS8kKG5hbWUpL3ByaXZhdGUvY2FrZXkucGVtIF07IHRoZW4gXAorCQlvcGVuc3NsIGdlbnJzYSAtb3V0ICQoREFUQV9ESVIpLyQobmFtZSkvcHJpdmF0ZS9jYWtleS5wZW0gJChjYWtleXNpemUpIDsgZmkKKwlAaWYgWyAhIC1lICQoREFUQV9ESVIpLyQobmFtZSkvcHJpdmF0ZS9jYWNzci5wZW0gXTsgdGhlbiBcCisJCUNBX1JPT1RfRElSPSQoREFUQV9ESVIpLyQobmFtZSkgb3BlbnNzbCByZXEgJChDT05GSUcpIC1uZXcgLWJhdGNoIC1vdXQgJChEQVRBX0RJUikvJChuYW1lKS9wcml2YXRlL2NhY3NyLnBlbSBcCisJCQkta2V5ICQoREFUQV9ESVIpLyQobmFtZSkvcHJpdmF0ZS9jYWtleS5wZW0gXAorCQkJLXN1YmogL0NOPSQobmFtZSkgLXJlcWV4dHMgdjNfcmVxX2NhOyBmaQorCSMgUmV2b2tlIGEgcHJldmlvdXMgY2VydGlmaWNhdGUgZm9yIHRoaXMgQ0EgaWYgYW55CisJQGlmIFsgLWUgJChEQVRBX0RJUikvJChuYW1lKS9wdWJsaWMvY2FjZXJ0LnBlbSBdOyB0aGVuIFwKKwkJZWNobyAiUmV2b2tpbmcgcHJldmlvdXMgY2VydGlmaWNhdGUgLi4uIjsgXAorCQkkKFJFTUFLRSkgcmV2b2tlIG5hbWU9JChuYW1lKSBjYT0kKGNhKTsgXAorCQltdiAkKERBVEFfRElSKS8kKG5hbWUpL3B1YmxpYy9jYWNlcnQucGVtICQoREFUQV9ESVIpLyQobmFtZSkvcHVibGljL2NhY2VydC0kKERBVEUpLnBlbTsgZmkKKwkjIElzc3VlIHRoZSBuZXcgQ0EgY2VydGlmaWNhdGUKKwlAQ0FfUk9PVF9ESVI9JChEQVRBX0RJUikvJChjYSkgb3BlbnNzbCBjYSAkKENPTkZJRykgLWluICQoREFUQV9ESVIpLyQobmFtZSkvcHJpdmF0ZS9jYWNzci5wZW0gXAorCQktb3V0ICQoREFUQV9ESVIpLyQobmFtZSkvcHVibGljL2NhY2VydC5wZW0gXAorCQktYmF0Y2ggLWV4dGVuc2lvbnMgY2FfY2VydAorCSMgSGFzaCBhbmQgbGluayB0byBwYXJlbnQKKwlAbG4gLXMgY2FjZXJ0LnBlbSAkKERBVEFfRElSKS8kKGNhKS9wdWJsaWMvYG9wZW5zc2wgeDUwOSAtbm9vdXQgLWhhc2ggPCAkKERBVEFfRElSKS8kKG5hbWUpL3B1YmxpYy9jYWNlcnQucGVtYC4wCisJQHJtIC1mICQoREFUQV9ESVIpLyQobmFtZSkvcGFyZW50CisJQGxuIC1zIC4uLyQoY2EpICQoREFUQV9ESVIpLyQobmFtZSkvcGFyZW50CisJQGNhdCAkKERBVEFfRElSKS8kKG5hbWUpL3B1YmxpYy9jYWNlcnQucGVtICQoREFUQV9ESVIpLyQoY2EpL3B1YmxpYy9jYWNoYWluLnBlbSA+ICQoREFUQV9ESVIpLyQobmFtZSkvcHVibGljL2NhY2hhaW4ucGVtCisJQGxuIC1zIC4uLy4uLyQoY2EpL3B1YmxpYy9jYXJvb3QucGVtICQoREFUQV9ESVIpLyQobmFtZSkvcHVibGljL2Nhcm9vdC5wZW0KKwlAZm9yIENSTEZJTEUgaW4gYGNkICQoREFUQV9ESVIpLyQoY2EpL3B1YmxpYy9jcmwgJiYgbHMgLTFgOyBkbyBsbiAtc2YgLi4vLi4vLi4vJChjYSkvcHVibGljL2NybC8kJENSTEZJTEUgJChEQVRBX0RJUikvJChuYW1lKS9wdWJsaWMvY3JsLyQkQ1JMRklMRTsgZG9uZQorCUAkKFJFTUFLRSkgZ2VuY3JsIGNhPSQobmFtZSkKKworIyBDcmVhdGUgYSBuZXcgY2VydGlmaWNhdGUgZm9yIHVzZSBpbiBUTFMgY29tbXVuaWNhdGlvbnMgYW5kIG90aGVyIHRlcm1pbmFsIHVzYWdlcworbmV3Y2VydDoKKwlAaWYgWyAteiAiJChuYW1lKSIgLW8gLXogIiQoY2EpIiBdOyB0aGVuIGVjaG8gIk1pc3NpbmcgcGFyYW1ldGVyLiBFeDogbWFrZSBuZXdjZXJ0IG5hbWU9c2VydmljZS50ZXN0YmVkLmFhYSBjYT1jYS50ZXN0YmVkLmFhYSI7IGV4aXQgMTsgZmkKKwlAaWYgWyAhIC1lICQoREFUQV9ESVIpLyQoY2EpL3ByaXZhdGUvY2FrZXkucGVtIF07IHRoZW4gZWNobyAiVGhlIHBhcmVudCBDQSAkKGNhKSBkb2VzIG5vdCBleGlzdC4iOyBleGl0IDE7IGZpCisJQGlmIFsgISAtZCAkKERBVEFfRElSKS8kKGNhKS9jbGllbnRzLyQobmFtZSkgXTsgdGhlbiBta2RpciAkKERBVEFfRElSKS8kKGNhKS9jbGllbnRzLyQobmFtZSk7IGZpCisJIyBDcmVhdGUgYSBwcml2YXRlIGtleSBpZiBuZWVkZWQKKwlAaWYgWyAhIC1lICQoREFUQV9ESVIpLyQoY2EpL2NsaWVudHMvJChuYW1lKS9wcml2a2V5LnBlbSBdOyB0aGVuIFwKKwkJb3BlbnNzbCBnZW5yc2EgLW91dCAkKERBVEFfRElSKS8kKGNhKS9jbGllbnRzLyQobmFtZSkvcHJpdmtleS5wZW0gJChrZXlzaXplKTsgZmkKKwkjIENyZWF0ZSBhIENTUiBpZiBuZWVkZWQKKwlAaWYgWyAhIC1lICQoREFUQV9ESVIpLyQoY2EpL2NsaWVudHMvJChuYW1lKS9jc3IucGVtIF07IHRoZW4gXAorCQlDQV9ST09UX0RJUj0kKERBVEFfRElSKS8kKGNhKSBvcGVuc3NsIHJlcSAkKENPTkZJRykgLW5ldyAtYmF0Y2ggLW91dCAkKERBVEFfRElSKS8kKGNhKS9jbGllbnRzLyQobmFtZSkvY3NyLnBlbSBcCisJCQkta2V5ICQoREFUQV9ESVIpLyQoY2EpL2NsaWVudHMvJChuYW1lKS9wcml2a2V5LnBlbSBcCisJCQktc3ViaiAvQ049JChuYW1lKTsgZmkKKwkjIFJldm9rZSBhIHByZXZpb3VzIGNlcnRpZmljYXRlIGlmIGFueQorCUBpZiBbIC1lICQoREFUQV9ESVIpLyQoY2EpL2NsaWVudHMvJChuYW1lKS9jZXJ0LnBlbSBdOyB0aGVuIFwKKwkJJChSRU1BS0UpIHJldm9rZSBuYW1lPSQobmFtZSkgY2E9JChjYSk7IFwKKwkJbXYgJChEQVRBX0RJUikvJChjYSkvY2xpZW50cy8kKG5hbWUpL2NlcnQucGVtICQoREFUQV9ESVIpLyQoY2EpL2NsaWVudHMvJChuYW1lKS9jZXJ0LSQoREFURSkucGVtOyBmaQorCSMgTm93IHNpZ24gdGhlIG5ldyBjZXJ0aWZpY2F0ZSB3aXRoIHRoZSBDQSBrZXkKKwlAQ0FfUk9PVF9ESVI9JChEQVRBX0RJUikvJChjYSkgb3BlbnNzbCBjYSAkKENPTkZJRykgLWluICQoREFUQV9ESVIpLyQoY2EpL2NsaWVudHMvJChuYW1lKS9jc3IucGVtIFwKKwkJLW91dCAkKERBVEFfRElSKS8kKGNhKS9jbGllbnRzLyQobmFtZSkvY2VydC5wZW0gXAorCQktYmF0Y2gKKwkjIEhhc2gKKwlAbG4gLXNmIGBjYXQgJChEQVRBX0RJUikvJChjYSkvc2VyaWFsLm9sZGAucGVtICQoREFUQV9ESVIpLyQoY2EpL3B1YmxpYy9gb3BlbnNzbCB4NTA5IC1ub291dCAtaGFzaCA8ICQoREFUQV9ESVIpLyQoY2EpL2NsaWVudHMvJChuYW1lKS9jZXJ0LnBlbWAuMAorCSMgQ29tcGlsZWQgaW5mb3JtYXRpb25zIGZvciB0aGUgY2xpZW50CisJQGNhdCAkKERBVEFfRElSKS8kKGNhKS9jbGllbnRzLyQobmFtZSkvY2VydC5wZW0gJChEQVRBX0RJUikvJChjYSkvcHVibGljL2NhY2hhaW4ucGVtID4gJChEQVRBX0RJUikvJChjYSkvY2xpZW50cy8kKG5hbWUpL2NlcnRjaGFpbi5wZW0KKwlAbG4gLXNmIC4uLy4uL3B1YmxpYy9jcmwgJChEQVRBX0RJUikvJChjYSkvY2xpZW50cy8kKG5hbWUpL2NybAorCUBsbiAtc2YgLi4vLi4vcHVibGljL2Nhcm9vdC5wZW0gJChEQVRBX0RJUikvJChjYSkvY2xpZW50cy8kKG5hbWUpL2NhLnBlbQorCisjIENyZWF0ZSBhIFBLQ1MjMTIgZmlsZSBjb250YWluaW5nIHRoZSBjbGllbnQncyBpbmZvcm1hdGlvbgorcDEyOgluZXdjZXJ0CisJIyBDcmVhdGUgdGhlIFBLQ1MjMTIgZmlsZQorCUBjYXQgCSQoREFUQV9ESVIpLyQoY2EpL2NsaWVudHMvJChuYW1lKS9wcml2a2V5LnBlbSBcCisJCSQoREFUQV9ESVIpLyQoY2EpL2NsaWVudHMvJChuYW1lKS9jZXJ0Y2hhaW4ucGVtIFwKKwkJJChEQVRBX0RJUikvJChjYSkvY2xpZW50cy8kKG5hbWUpL2NhLnBlbSBcCisJCXwgb3BlbnNzbCBwa2NzMTIgLWV4cG9ydCAtb3V0ICQoREFUQV9ESVIpLyQoY2EpL2NsaWVudHMvJChuYW1lKS8kKG5hbWUpLnAxMgorCUBlY2hvICJDbGllbnQgY2VydGlmaWNhdGUgaXMgY3JlYXRlZCBpbiAkKERBVEFfRElSKS8kKGNhKS9jbGllbnRzLyQobmFtZSkvJChuYW1lKS5wMTIiCisKKyMgQ3JlYXRlIGFuIGFyY2hpdmUgdG8gc2VuZCB0aGUgZGF0YSB0byB0aGUgY2xpZW50IG5vZGUKK3NoaXA6CisJQGlmIFsgLXogIiQobmFtZSkiIC1vIC16ICIkKGNhKSIgXTsgdGhlbiBlY2hvICJNaXNzaW5nIHBhcmFtZXRlci4gRXg6IG1ha2Ugc2hpcCBuYW1lPXNlcnZpY2UudGVzdGJlZC5hYWEgY2E9Y2EudGVzdGJlZC5hYWEiOyBleGl0IDE7IGZpCisJQGlmIFsgISAtZSAkKERBVEFfRElSKS8kKGNhKS9wcml2YXRlL2Nha2V5LnBlbSBdOyB0aGVuIGVjaG8gIlRoZSBwYXJlbnQgQ0EgJChjYSkgZG9lcyBub3QgZXhpc3QuIjsgZXhpdCAxOyBmaQorCUBpZiBbICEgLWUgICQoREFUQV9ESVIpLyQoY2EpL2NsaWVudHMvJChuYW1lKS9wcml2a2V5LnBlbSBdOyB0aGVuIGVjaG8gIlRoZSBjbGllbnQgJChuYW1lKSBkb2VzIG5vdCBleGlzdCwgdXNlICdtYWtlIG5ld2NlcnQnIGZpcnN0LiI7IGV4aXQgMTsgZmkKKwkjIFNoaXAgdGhlIGRhdGEKKwlAdGFyIC1jIC1DICQoREFUQV9ESVIpLyQoY2EpL2NsaWVudHMvJChuYW1lKSAteiAtZiAkKGNhKV8kKG5hbWUpLnRhci5neiAtaCAuCisJQGVjaG8gIlRoZSBmaWxlcyBoYXZlIGJlZW4gcGFja2FnZWQgaW50byBhcmNoaXZlOiAkKGNhKV8kKG5hbWUpLnRhci5neiIKKworIyBSZXZva2UgYSBjZXJ0aWZpY2F0ZQorcmV2b2tlOgorCUBpZiBbIC16ICIkKG5hbWUpIiAtbyAteiAiJChjYSkiIF07IHRoZW4gZWNobyAiTWlzc2luZyBwYXJhbWV0ZXIuIEV4OiBtYWtlIHJldm9rZSBuYW1lPXNlcnZpY2UudGVzdGJlZC5hYWEgY2E9Y2EudGVzdGJlZC5hYWEiOyBleGl0IDE7IGZpCisJQGlmIFsgISAtZSAkKERBVEFfRElSKS8kKGNhKS9wcml2YXRlL2Nha2V5LnBlbSBdOyB0aGVuIGVjaG8gIlRoZSBwYXJlbnQgQ0EgJChjYSkgZG9lcyBub3QgZXhpc3QuIjsgZXhpdCAxOyBmaQorCUBpZiBbICEgLWUgJChEQVRBX0RJUikvJChjYSkvY2xpZW50cy8kKG5hbWUpL2NlcnQucGVtIF07IFwKKwkJdGhlbiBlY2hvICIkKERBVEFfRElSKS8kKGNhKS9jbGllbnRzLyQobmFtZSkvY2VydC5wZW0gbm90IGZvdW5kIjsgXAorCQlleGl0IDE7IFwKKwkJZmk7CisJIyBSZXZva2UgdGhlIGNlcnRpZmljYXRlCisJQENBX1JPT1RfRElSPSQoREFUQV9ESVIpLyQoY2EpIG9wZW5zc2wgY2EgJChDT05GSUcpIC1yZXZva2UgJChEQVRBX0RJUikvJChjYSkvY2xpZW50cy8kKG5hbWUpL2NlcnQucGVtOworCUAkKFJFTUFLRSkgZ2VuY3JsIGNhPSQoY2EpCisKKyMgUmVnZW5lcmF0ZSB0aGUgQ2VydGlmaWNhdGUgUmV2b2NhdGlvbiBMaXN0LgorZ2VuY3JsOgorCUBpZiBbIC16ICIkKGNhKSIgXTsgdGhlbiBlY2hvICJNaXNzaW5nIHBhcmFtZXRlci4gRXg6IG1ha2UgZ2VuY3JsIGNhPWNhLnRlc3RiZWQuYWFhIjsgZXhpdCAxOyBmaQorCSMgQ3JlYXRlIHRoZSBDUkwKKwlAQ0FfUk9PVF9ESVI9JChEQVRBX0RJUikvJChjYSkgb3BlbnNzbCBjYSAkKENPTkZJRykgLWdlbmNybCAtb3V0ICQoREFUQV9ESVIpLyQoY2EpL3B1YmxpYy9jcmwvJChjYSkucGVtCisJQGxuIC1zIGNybC8kKGNhKS5wZW0gJChEQVRBX0RJUikvJChjYSkvcHVibGljL2xvY2FsLnBlbQorCUBsbiAtcyBsb2NhbC5wZW0gJChEQVRBX0RJUikvJChjYSkvcHVibGljL2BvcGVuc3NsIGNybCAtbm9vdXQgLWhhc2ggPCAkKERBVEFfRElSKS8kKGNhKS9wdWJsaWMvY3JsLyQoY2EpLnBlbWAucjAKKworIyBFbmQgb2YgZmlsZS4uLgpkaWZmIC0tZ2l0IGEvY29udHJpYi9QS0kvY2Ffc2NyaXB0Mi9vcGVuc3NsLmNuZiBiL2NvbnRyaWIvUEtJL2NhX3NjcmlwdDIvb3BlbnNzbC5jbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIwMjIwOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvUEtJL2NhX3NjcmlwdDIvb3BlbnNzbC5jbmYKQEAgLTAsMCArMSwxMjAgQEAKKyMgTm90ZTogZm9yIHRoaXMgZmlsZSB0byBiZSB3b3JraW5nLCBhbiBlbnZpcm9ubWVudCB2YXIgQ0FfUk9PVF9ESVIgPSBkaXJlY3RvcnkgCisjIG11c3QgYmUgZGVmaW5lZCBhbmQgcG9pbnRpbmcgdG8gdGhlIENBIHRvcC1sZXZlbCBkaXJlY3RvcnkuCisKK0hPTUUJCQk9IC4KK1JBTkRGSUxFCQk9ICRFTlY6OkhPTUUvLnJuZAorCitvaWRfc2VjdGlvbgkJPSBuZXdfb2lkcworCitbIG5ld19vaWRzIF0KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworWyByZXEgXQorZGVmYXVsdF9iaXRzCQk9IDEwMjQKKyMgZGVmYXVsdF9rZXlmaWxlIAk9IHByaXZrZXkucGVtCitzdHJpbmdfbWFzayAJCT0gdXRmOG9ubHkKKworZGlzdGluZ3Vpc2hlZF9uYW1lCT0gcmVxX2Rpc3Rpbmd1aXNoZWRfbmFtZQorYXR0cmlidXRlcwkJPSByZXFfYXR0cmlidXRlcworcmVxX2V4dGVuc2lvbnMgCQk9IHYzX3JlcSAgICAjIG92ZXJ3cml0ZSB3aXRoIC1yZXFleHRzCit4NTA5X2V4dGVuc2lvbnMJCT0gY2FfY2VydCAgICMgb3ZlcndyaXRlIHdpdGggLWV4dGVuc2lvbnM7IHVzZWQgZm9yIHNlbGYtc2lnbmVkIGtleXMgb25seQorCitbIHJlcV9kaXN0aW5ndWlzaGVkX25hbWUgXQorY291bnRyeU5hbWUJCQk9IENvdW50cnkgTmFtZSAoMiBsZXR0ZXIgY29kZSkKK2NvdW50cnlOYW1lX2RlZmF1bHQJCT0gSlAKK2NvdW50cnlOYW1lX21pbgkJCT0gMgorY291bnRyeU5hbWVfbWF4CQkJPSAyCitzdGF0ZU9yUHJvdmluY2VOYW1lCQk9IFN0YXRlIG9yIFByb3ZpbmNlIE5hbWUgKGZ1bGwgbmFtZSkKK3N0YXRlT3JQcm92aW5jZU5hbWVfZGVmYXVsdAk9IFRva3lvCitsb2NhbGl0eU5hbWUJCQk9IExvY2FsaXR5IE5hbWUgKGVnLCBjaXR5KQorbG9jYWxpdHlOYW1lX2RlZmF1bHQJCT0gS29nYW5laQorMC5vcmdhbml6YXRpb25OYW1lCQk9IE9yZ2FuaXphdGlvbiBOYW1lIChlZywgY29tcGFueSkKKzAub3JnYW5pemF0aW9uTmFtZV9kZWZhdWx0CT0gV0lERQorMS5vcmdhbml6YXRpb25OYW1lCQk9IFNlY29uZCBPcmdhbml6YXRpb24gTmFtZSAoZWcsIGNvbXBhbnkpCisxLm9yZ2FuaXphdGlvbk5hbWVfZGVmYXVsdAk9IE5JQ1QKK29yZ2FuaXphdGlvbmFsVW5pdE5hbWUJCT0gT3JnYW5pemF0aW9uYWwgVW5pdCBOYW1lIChlZywgc2VjdGlvbikKK29yZ2FuaXphdGlvbmFsVW5pdE5hbWVfZGVmYXVsdAk9IEFBQSBXRyB0ZXN0YmVkCisKK1sgcmVxX2F0dHJpYnV0ZXMgXQorY2hhbGxlbmdlUGFzc3dvcmQJCT0gQSBjaGFsbGVuZ2UgcGFzc3dvcmQKK2NoYWxsZW5nZVBhc3N3b3JkX21pbgkJPSAwCitjaGFsbGVuZ2VQYXNzd29yZF9tYXgJCT0gMjAKK3Vuc3RydWN0dXJlZE5hbWUJCT0gQW4gb3B0aW9uYWwgY29tcGFueSBuYW1lCisKK1sgdjNfcmVxIF0KKyMgRXh0ZW5zaW9ucyB0byBhZGQgdG8gYSBjZXJ0aWZpY2F0ZSByZXF1ZXN0CitiYXNpY0NvbnN0cmFpbnRzID0gQ0E6RkFMU0UKK2tleVVzYWdlID0gbm9uUmVwdWRpYXRpb24sIGRpZ2l0YWxTaWduYXR1cmUsIGtleUVuY2lwaGVybWVudAorCitbIHYzX3JlcV9jYSBdCisjIEV4dGVuc2lvbnMgdG8gYWRkIHRvIGEgY2VydGlmaWNhdGUgcmVxdWVzdCBmb3IgQ0EKK2Jhc2ljQ29uc3RyYWludHMgPSBDQTpUUlVFCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK1sgY2EgXQorZGVmYXVsdF9jYQk9IENBX2RlZmF1bHQJCSMgVGhlIGRlZmF1bHQgY2Egc2VjdGlvbgorCitbIENBX2RlZmF1bHQgXQorCitkaXIJCT0gJEVOVjo6Q0FfUk9PVF9ESVIJIyBXaGVyZSBldmVyeXRoaW5nIGlzIGtlcHQKK2NlcnRzCQk9ICRkaXIvcHVibGljCQkjIFdoZXJlIHRoZSBpc3N1ZWQgY2VydHMgYXJlIGtlcHQKK2NybF9kaXIJCT0gJGRpci9wdWJsaWMJCSMgV2hlcmUgdGhlIGlzc3VlZCBjcmwgYXJlIGtlcHQKK2RhdGFiYXNlCT0gJGRpci9pbmRleC50eHQJIyBkYXRhYmFzZSBpbmRleCBmaWxlLgorI3VuaXF1ZV9zdWJqZWN0CT0gbm8JCQkjIFNldCB0byAnbm8nIHRvIGFsbG93IGNyZWF0aW9uIG9mCisJCQkJCSMgc2V2ZXJhbCBjdGlmaWNhdGVzIHdpdGggc2FtZSBzdWJqZWN0LgorbmV3X2NlcnRzX2Rpcgk9ICRkaXIvcHVibGljCQkjIGRlZmF1bHQgcGxhY2UgZm9yIG5ldyBjZXJ0cy4KKworY2VydGlmaWNhdGUJPSAkZGlyL3B1YmxpYy9jYWNlcnQucGVtIAkjIFRoZSBDQSBjZXJ0aWZpY2F0ZQorc2VyaWFsCQk9ICRkaXIvc2VyaWFsIAkJIyBUaGUgY3VycmVudCBzZXJpYWwgbnVtYmVyCitjcmxudW1iZXIJPSAkZGlyL2NybG51bWJlcgkjIHRoZSBjdXJyZW50IGNybCBudW1iZXIKK2NybAkJPSAkZGlyL3B1YmxpYy9sb2NhbC5wZW0gCQkjIFRoZSBjdXJyZW50IENSTAorcHJpdmF0ZV9rZXkJPSAkZGlyL3ByaXZhdGUvY2FrZXkucGVtCSMgVGhlIHByaXZhdGUga2V5Cit4NTA5X2V4dGVuc2lvbnMJPSB1c3JfY2VydAkJIyBUaGUgZXh0ZW50aW9ucyB0byBhZGQgdG8gdGhlIGNlcnQKKwkJCQkJIyBvdmVyd3JpdGUgd2l0aCAtZXh0ZW5zaW9ucworbmFtZV9vcHQgCT0gY2FfZGVmYXVsdAkJIyBTdWJqZWN0IE5hbWUgb3B0aW9ucworY2VydF9vcHQgCT0gY2FfZGVmYXVsdAkJIyBDZXJ0aWZpY2F0ZSBmaWVsZCBvcHRpb25zCitjcmxfZXh0ZW5zaW9ucwk9IGNybF9leHQKKworZGVmYXVsdF9kYXlzCT0gMzY1MAkJCSMgaG93IGxvbmcgdG8gY2VydGlmeSBmb3IKK2RlZmF1bHRfY3JsX2RheXM9IDM2NQkJCSMgaG93IGxvbmcgYmVmb3JlIG5leHQgQ1JMCitkZWZhdWx0X21kCT0gc2hhMQkJCSMgd2hpY2ggbWQgdG8gdXNlLgorcHJlc2VydmUJPSBubwkJCSMga2VlcCBwYXNzZWQgRE4gb3JkZXJpbmcKKworIyBXZSBhY2NlcHQgdG8gc2lnbiBhbnl0aGluZywgYnV0IGEgcmVhbCBkZXBsb3ltZW50IHdvdWxkIGxpbWl0IHRvIHByb3BlciBkb21haW4gZXRjLi4uCitwb2xpY3kJCQk9IHBvbGljeV9hbnl0aGluZworCitbIHBvbGljeV9hbnl0aGluZyBdCitjb3VudHJ5TmFtZQkJPSBvcHRpb25hbAorc3RhdGVPclByb3ZpbmNlTmFtZQk9IG9wdGlvbmFsCitsb2NhbGl0eU5hbWUJCT0gb3B0aW9uYWwKK29yZ2FuaXphdGlvbk5hbWUJPSBvcHRpb25hbAorb3JnYW5pemF0aW9uYWxVbml0TmFtZQk9IG9wdGlvbmFsCitjb21tb25OYW1lCQk9IHN1cHBsaWVkCitlbWFpbEFkZHJlc3MJCT0gb3B0aW9uYWwKKworWyB1c3JfY2VydCBdCitiYXNpY0NvbnN0cmFpbnRzPUNBOkZBTFNFCisjIFRoaXMgaXMgdHlwaWNhbCBpbiBrZXlVc2FnZSBmb3IgYSBjbGllbnQgY2VydGlmaWNhdGUuCitrZXlVc2FnZSA9IG5vblJlcHVkaWF0aW9uLCBkaWdpdGFsU2lnbmF0dXJlLCBrZXlFbmNpcGhlcm1lbnQKK3N1YmplY3RLZXlJZGVudGlmaWVyPWhhc2gKK2F1dGhvcml0eUtleUlkZW50aWZpZXI9a2V5aWQsaXNzdWVyCisKK1sgY2FfY2VydCBdCisjIEV4dGVuc2lvbnMgZm9yIGEgdHlwaWNhbCBDQQorc3ViamVjdEtleUlkZW50aWZpZXI9aGFzaAorYXV0aG9yaXR5S2V5SWRlbnRpZmllcj1rZXlpZDphbHdheXMsaXNzdWVyOmFsd2F5cworYmFzaWNDb25zdHJhaW50cyA9IGNyaXRpY2FsLENBOnRydWUgICMgUmVtb3ZlICJjcml0aWNhbCwiIGluIGNhc2Ugb2YgcHJvYmxlbXMKK2tleVVzYWdlID0gY1JMU2lnbiwga2V5Q2VydFNpZ24KKyMgc3ViamVjdEFsdE5hbWU9ZW1haWw6Y29weQorIyBDb3B5IGlzc3VlciBkZXRhaWxzCisjIGlzc3VlckFsdE5hbWU9aXNzdWVyOmNvcHkKKworWyBjcmxfZXh0IF0KKyMgQ1JMIGV4dGVuc2lvbnMuCisjIE9ubHkgaXNzdWVyQWx0TmFtZSBhbmQgYXV0aG9yaXR5S2V5SWRlbnRpZmllciBtYWtlIGFueSBzZW5zZSBpbiBhIENSTC4KKyMgaXNzdWVyQWx0TmFtZT1pc3N1ZXI6Y29weQorYXV0aG9yaXR5S2V5SWRlbnRpZmllcj1rZXlpZDphbHdheXMsaXNzdWVyOmFsd2F5cworCisKZGlmZiAtLWdpdCBhL2NvbnRyaWIvUEtJL3BocGtpLTAuODIucGF0Y2ggYi9jb250cmliL1BLSS9waHBraS0wLjgyLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NTRkODgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL1BLSS9waHBraS0wLjgyLnBhdGNoCkBAIC0wLDAgKzEsMjg0IEBACitkaWZmIC1OdXIgcGhwa2ktMC44Mi9jYS9tYWluLnBocCBwaHBraS0wLjgyLWZEL2NhL21haW4ucGhwCistLS0gcGhwa2ktMC44Mi9jYS9tYWluLnBocAkyMDA1LTExLTE3IDEwOjE3OjIwLjAwMDAwMDAwMCArMDkwMAorKysrIHBocGtpLTAuODItZkQvY2EvbWFpbi5waHAJMjAxMC0wNS0yNyAxNzowNDo0NC4wMDAwMDAwMDAgKzA5MDAKK0BAIC0zNiw3ICszNiw3IEBACisgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgPz4KKyAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9I2ZmMDAwMD4KKy0gICAgICAgICAgICAgICAgPGgyPlRoZXJlIHdhcyBhbiBlcnJvciB1cGRhdGluZyB0aGUgQ2VydGlmaWNhdGUgUmV2b2NhdGlvbiBMaXN0LjwvaDI+PC9mb250Pjxicj4KKysgICAgICAgICAgICAgICAgPGgyPlRoZXJlIHdhcyBhbiBlcnJvciB1cGRhdGluZyB0aGUgQ2VydGlmaWNhdGUgUmV2b2NhdGlvbiBMaXN0LjwvaDI+PC9mb250PjxiciAvPgorICAgICAgICAgICAgICAgICA8YmxvY2txdW90ZT4KKyAgICAgICAgICAgICAgICAgPGgzPkRlYnVnIEluZm86PC9oMz4KKyAgICAgICAgICAgICAgICAgPHByZT48Pz0kZXJydHh0Pz48L3ByZT4KK0BAIC01Myw4ICs1MywxMSBAQAorIGRlZmF1bHQ6CisgCXByaW50SGVhZGVyKCdjYScpOworIAk/PgorLQk8YnI+CistCTxicj4KKysJPGJyIC8+CisrCTxiciAvPgorKworKwk8Y2VudGVyPjxoMz5Gb3IgPHNwYW4gc3R5bGU9ImNvbG9yOiAjRkYwMDAwOyI+ZnJlZURpYW1ldGVyPC9zcGFuPiBzcGVjaWZpYyBpbnN0cnVjdGlvbnMsIHNjcm9sbCBkb3duIHRoaXMgcGFnZS4uLjwvaDM+PC9jZW50ZXI+PGJyIC8+CisrCisgCTxjZW50ZXI+CisgCTx0YWJsZSBjbGFzcz1tZW51IHdpZHRoPTYwMD48dGggY2xhc3M9bWVudSBjb2xzcGFuPTI+PGJpZz5DRVJUSUZJQ0FURSBNQU5BR0VNRU5UIE1FTlU8L2JpZz48L3RoPgorIAorQEAgLTg5LDcgKzkyLDU3IEBACisgCisgCTwvdGFibGU+CisgCTwvY2VudGVyPgorLQk8YnI+PGJyPgorKwk8YnIgLz48YnIgLz4KKysJPGNlbnRlcj4KKysJPHRhYmxlIGNsYXNzPW1lbnUgd2lkdGg9OTAwPjx0aCBjbGFzcz1tZW51IGNvbHNwYW49Mj48YmlnPkZSRUVESUFNRVRFUiBJTlNUUlVDVElPTlM8L2JpZz48L3RoPgorKyAgICAgICAgPHRyPjx0ZCBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyBmb250LXdlaWdodDogYm9sZDsiPgorKyAgICAgICAgQ3JlYXRlIGEgbmV3IGNlcnRpZmljYXRlPC90ZD4KKysKKysJPHRkPlVzZSB0aGUgPHN0cm9uZz48Y2l0ZT5DcmVhdGUgYSBOZXcgQ2VydGlmaWNhdGU8L2NpdGU+PC9zdHJvbmc+IGxpbmsgaW4gcHJldmlvdXMgdGFibGUgdG8gcmVxdWVzdCBhIG5ldyBjZXJ0aWZpY2F0ZS4gRmlsbCB0aGUgZm9ybSBhcyBmb2xsb3c6CisrCTx1bD4KKysJICA8bGk+PHN0cm9uZz5Db21tb24gTmFtZTwvc3Ryb25nPjogdXNlIHlvdXIgbmV3IGZyZWVEaWFtZXRlciBpZGVudGl0eSAodXN1YWxseSB0aGUgRlFETikuPC9saT4KKysJICA8bGk+PHN0cm9uZz5FLW1haWwgQWRkcmVzczwvc3Ryb25nPjogUHJvdmlkZSB5b3VyIGFkZHJlc3Mgc28gdGhhdCB5b3UgY2FuIGJlIGNvbnRhY3RlZCBpbiBjYXNlIG9mIGlucXVpcnkuPC9saT4KKysJICA8bGk+PHN0cm9uZz5Pcmdhbml6YXRpb248L3N0cm9uZz46IHVzZSAiZnJlZURpYW1ldGVyIHRlc3RiZWQiIGZvciBleGFtcGxlLjwvbGk+CisrICAgICAgICAgIDxsaT48c3Ryb25nPkNlcnRpZmljYXRlIFBhc3N3b3JkPC9zdHJvbmc+OiBEbyBub3QgbG9vc2UgdGhlIHBhc3N3b3JkIHlvdSBwcm92aWRlLCB5b3UnbGwgbmVlZCBpdCBpbiB0aGUgbmV4dCBzdGVwLiA8YnIgLz4KKysJCVRoZSBwYXNzd29yZCBtdXN0IGJlID49IDggY2hhcnMuPC9saT4KKysJICA8bGk+VGhlIG90aGVyIGZpZWxkcyBjYW4gYmUgZmlsbGVkIGF0IHlvdXIgdGFzdGUuPC9saT4KKysJPC91bD4KKysJT25jZSB5b3UgaGF2ZSB2YWxpZGF0ZWQsIHlvdSBjYW4gY2hlY2sgdGhlIHZhbHVlcywgYW5kIHRoZW4gcHJvY2VlZCB0byBkb3dubG9hZCB0aGUgbmV3IGNlcnRpZmljYXRlIGFuZCBwcml2YXRlIGtleS4KKysJWW91IHdpbGwgcmVjZWl2ZSBhIGZpbGUgaW4gUEVNIGZvcm1hdC4gTGV0J3MgY2FsbCB0aGlzIGZpbGUgPGVtPm15Y2VydHByb3RlY3RlZC5wZW08L2VtPi4KKysgICAgICAgIEl0IGNvbnRhaW5zOgorKyAgICAgICAgPHVsPgorKyAgICAgICAgICA8bGk+WW91ciBwYXNzd29yZC1wcm90ZWN0ZWQgUlNBIHByaXZhdGUga2V5LjwvbGk+CisrICAgICAgICAgIDxsaT5Zb3VyIGNlcnRpZmljYXRlIGluIFBFTSBmb3JtYXQuPC9saT4KKysgICAgICAgICAgPGxpPlRoZSBDQSBjZXJ0aWZpY2F0ZS48L2xpPgorKyAgICAgICAgPC91bD48L3RkPjwvdHI+CisrCisrICAgICAgICA8dHI+PHRkIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7IHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IGZvbnQtd2VpZ2h0OiBib2xkOyI+CisrICAgICAgICBTcGxpdCB0aGUgZmlsZTwvdGQ+CisrCQorKwk8dGQ+SW4gb3JkZXIgdG8gdXNlIHRoZSBpbmZvcm1hdGlvbiB3aXRoIGZyZWVEaWFtZXRlciBkYWVtb24sIHlvdSBtdXN0IHRyYW5zZm9ybSB0aGUgZGF0YSBhcyBmb2xsb3c6CisrCTx1bD4KKysJICA8bGk+PHN0cm9uZz5EZWNvZGUgdGhlIHByaXZhdGUga2V5PC9zdHJvbmc+OiA8YnIgLz4KKysJCTxjb2RlPm9wZW5zc2wgcnNhIC1pbiA8ZW0+bXljZXJ0cHJvdGVjdGVkLnBlbTwvZW0+IC1vdXQgL2V0Yy9zc2wvcHJpdmF0ZS9mcmVlRGlhbWV0ZXIua2V5PC9jb2RlPjxiciAvPgorKwlPcGVuU1NMIHdpbGwgYXNrIGZvciB0aGUgcGFzc3dvcmQgeW91IGVudGVyZWQgd2hlbiBjcmVhdGluZyB0aGUgY2VydGlmaWNhdGUuPC9saT4KKysJICA8bGk+PHN0cm9uZz5FeHRyYWN0IHlvdXIgY2VydGlmaWNhdGU8L3N0cm9uZz46IDxiciAvPgorKyAgICAgICAgICAgICAgICA8Y29kZT5vcGVuc3NsIHg1MDkgLWluIDxlbT5teWNlcnRwcm90ZWN0ZWQucGVtPC9lbT4gPiAvZXRjL3NzbC9jZXJ0cy9mcmVlRGlhbWV0ZXIucGVtPC9jb2RlPjwvbGk+CisrICAgICAgICAgIDxsaT48c3Ryb25nPkdldCB0aGUgQ0EgY2VydGlmaWNhdGU8L3N0cm9uZz46IDxiciAvPgorKyAgICAgICAgICAgICAgICA8Y29kZT53Z2V0IC0tbm8tY2hlY2stY2VydGlmaWNhdGUgIiRjb25maWdbYmFzZV91cmxdaW5kZXgucGhwP3N0YWdlPWRsX3Jvb3QiIC1PIC9ldGMvc3NsL2NlcnRzL2ZyZWVEaWFtZXRlcl90ZXN0YmVkX0NBLnBlbTwvY29kZT48L2xpPgorKwk8L3VsPgorKwlOb3RlOiBmb3IgdGhlIGxhc3Qgc3RlcCwgeW91IGNvdWxkIGFsc28gZXh0cmFjdCBpdCBkaXJlY3RseSBmcm9tIHRoZSBQRU0gZmlsZSB5b3UgcmVjZWl2ZWQuPGJyIC8+CisrCU5vdGU6IHRoZSBDUkwgaXMgYWxzbyBhdmFpbGFibGUgZnJvbSB0aGUgd2Vic2l0ZSwgYnV0IHRoaXMgZmVhdHVyZSBpcyBub3QgdGVzdGVkIHlldC48L3RkPjwvdHI+CisrCisrCTx0cj48dGQgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsgdmVydGljYWwtYWxpZ246IG1pZGRsZTsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij4KKysgICAgICAgIENvbmZpZ3VyZSBmcmVlRGlhbWV0ZXI8L3RkPgorKworKyAgICAgICAgPHRkPkhlcmUgaXMgdGhlIGNvbmZpZ3VyYXRpb24gcmVsYXRlZCB0byBUTFMgdGhhdCB5b3Ugc2hvdWxkIHNldCBpbiB5b3VyIDxlbT4vZXRjL2ZyZWVEaWFtZXRlci9mcmVlRGlhbWV0ZXIuY29uZjwvZW0+IGZpbGU6CisrCTxibG9ja3F1b3RlPlRMU19DcmVkID0gIi9ldGMvc3NsL2NlcnRzL2ZyZWVEaWFtZXRlci5wZW0iLCAiL2V0Yy9zc2wvcHJpdmF0ZS9mcmVlRGlhbWV0ZXIua2V5Ijs8YnIgLz4KKytUTFNfQ0EgPSAiL2V0Yy9zc2wvY2VydHMvZnJlZURpYW1ldGVyX3Rlc3RiZWRfQ0EucGVtIjs8L2Jsb2NrcXVvdGU+PC90ZD48L3RyPgorKworKworKyAgICAgICAgPC90YWJsZT4KKysgICAgICAgIDwvY2VudGVyPgorKwk8YnIgLz48YnIgLz4JCisgCTw/CisgCXByaW50Rm9vdGVyKCk7CisgfQorZGlmZiAtTnVyIHBocGtpLTAuODIvY2EvcmVxdWVzdF9jZXJ0LnBocCBwaHBraS0wLjgyLWZEL2NhL3JlcXVlc3RfY2VydC5waHAKKy0tLSBwaHBraS0wLjgyL2NhL3JlcXVlc3RfY2VydC5waHAJMjAwNy0wMS0wNCAxNDo0NTowOS4wMDAwMDAwMDAgKzA5MDAKKysrKyBwaHBraS0wLjgyLWZEL2NhL3JlcXVlc3RfY2VydC5waHAJMjAxMC0wNS0yNyAxNjo1OToxNi4wMDAwMDAwMDAgKzA5MDAKK0BAIC0xOTcsNiArMTk3LDcgQEAKKyAKKyAgICAgICAgICAgICAgICAgc3dpdGNoKCRjZXJ0X3R5cGUpIHsKKyAgICAgICAgICAgICAgICAgY2FzZSAnc2VydmVyJzoKKysgICAgICAgICAgICAgICAgY2FzZSAnZnJlZWRpYW1ldGVyJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICB1cGxvYWQoYXJyYXkoIiRjb25maWdbcHJpdmF0ZV9kaXJdLyRzZXJpYWwta2V5LnBlbSIsIiRjb25maWdbbmV3X2NlcnRzX2Rpcl0vJHNlcmlhbC5wZW0iLCRjb25maWdbJ2NhY2VydF9wZW0nXSksICIkY29tbW9uX25hbWUgKCRlbWFpbCkucGVtIiwnYXBwbGljYXRpb24vcGtpeC1jZXJ0Jyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgIGNhc2UgJ2VtYWlsJzoKK0BAIC0yMjUsNyArMjI2LDcgQEAKKyAJaWYgKCEgJGVtYWlsKSAgICAgICAgICRlbWFpbCA9ICIiOworIAlpZiAoISAkZXhwaXJ5KSAgICAgICAgJGV4cGlyeSA9IDE7CisgCWlmICghICRrZXlzaXplKSAgICAgICAka2V5c2l6ZSA9IDEwMjQ7CistCWlmICghICRjZXJ0X3R5cGUpICAgICAkY2VydF90eXBlID0gJ2VtYWlsJzsKKysJaWYgKCEgJGNlcnRfdHlwZSkgICAgICRjZXJ0X3R5cGUgPSAnZnJlZWRpYW1ldGVyJzsKKyAKKyAJcHJpbnRIZWFkZXIoKTsKKyAJPz4KK0BAIC0zMDIsMTMgKzMwMywxNCBAQAorIAk8dGQ+Q2VydGlmaWNhdGUgVXNlOiA8L3RkPgorIAk8dGQ+PHNlbGVjdCBuYW1lPWNlcnRfdHlwZT4KKyAJPD8KKy0JcHJpbnQgJzxvcHRpb24gdmFsdWU9ImVtYWlsIiAnLigkY2VydF90eXBlPT0nZW1haWwnPydzZWxlY3RlZCc6JycpLic+RS1tYWlsLCBTU0wgQ2xpZW50PC9vcHRpb24+JzsKKy0JcHJpbnQgJzxvcHRpb24gdmFsdWU9ImVtYWlsX3NpZ25pbmciICcuKCRjZXJ0X3R5cGU9PSdlbWFpbF9zaWduaW5nJz8nc2VsZWN0ZWQnOicnKS4nPkUtbWFpbCwgU1NMIENsaWVudCwgQ29kZSBTaWduaW5nPC9vcHRpb24+JzsKKy0JcHJpbnQgJzxvcHRpb24gdmFsdWU9InNlcnZlciIgJy4oJGNlcnRfdHlwZT09J3NlcnZlcic/J3NlbGVjdGVkJzonJykuJz5TU0wgU2VydmVyPC9vcHRpb24+JzsKKy0JcHJpbnQgJzxvcHRpb24gdmFsdWU9InZwbl9jbGllbnQiICcuKCRjZXJ0X3R5cGU9PSd2cG5fY2xpZW50Jz8nc2VsZWN0ZWQnOicnKS4nPlZQTiBDbGllbnQgT25seTwvb3B0aW9uPic7CistCXByaW50ICc8b3B0aW9uIHZhbHVlPSJ2cG5fc2VydmVyIiAnLigkY2VydF90eXBlPT0ndnBuX3NlcnZlcic/J3NlbGVjdGVkJzonJykuJz5WUE4gU2VydmVyIE9ubHk8L29wdGlvbj4nOworLQlwcmludCAnPG9wdGlvbiB2YWx1ZT0idnBuX2NsaWVudF9zZXJ2ZXIiICcuKCRjZXJ0X3R5cGU9PSd2cG5fY2xpZW50X3NlcnZlcic/J3NlbGVjdGVkJzonJykuJz5WUE4gQ2xpZW50LCBWUE4gU2VydmVyPC9vcHRpb24+JzsKKy0JcHJpbnQgJzxvcHRpb24gdmFsdWU9InRpbWVfc3RhbXBpbmciICcuKCRjZXJ0X3R5cGU9PSd0aW1lX3N0YW1waW5nJz8nc2VsZWN0ZWQnOicnKS4nPlRpbWUgU3RhbXBpbmc8L29wdGlvbj4nOworKwlwcmludCAnPG9wdGlvbiB2YWx1ZT0iZW1haWwiIGRpc2FibGVkICcuKCRjZXJ0X3R5cGU9PSdlbWFpbCc/J3NlbGVjdGVkJzonJykuJz5FLW1haWwsIFNTTCBDbGllbnQ8L29wdGlvbj4nOworKwlwcmludCAnPG9wdGlvbiB2YWx1ZT0iZW1haWxfc2lnbmluZyIgZGlzYWJsZWQgJy4oJGNlcnRfdHlwZT09J2VtYWlsX3NpZ25pbmcnPydzZWxlY3RlZCc6JycpLic+RS1tYWlsLCBTU0wgQ2xpZW50LCBDb2RlIFNpZ25pbmc8L29wdGlvbj4nOworKwlwcmludCAnPG9wdGlvbiB2YWx1ZT0ic2VydmVyIiBkaXNhYmxlZCAnLigkY2VydF90eXBlPT0nc2VydmVyJz8nc2VsZWN0ZWQnOicnKS4nPlNTTCBTZXJ2ZXI8L29wdGlvbj4nOworKwlwcmludCAnPG9wdGlvbiB2YWx1ZT0iZnJlZWRpYW1ldGVyIiAnLigkY2VydF90eXBlPT0nZnJlZWRpYW1ldGVyJz8nc2VsZWN0ZWQnOicnKS4nPmZyZWVEaWFtZXRlciBub2RlPC9vcHRpb24+JzsKKysJcHJpbnQgJzxvcHRpb24gdmFsdWU9InZwbl9jbGllbnQiIGRpc2FibGVkICcuKCRjZXJ0X3R5cGU9PSd2cG5fY2xpZW50Jz8nc2VsZWN0ZWQnOicnKS4nPlZQTiBDbGllbnQgT25seTwvb3B0aW9uPic7CisrCXByaW50ICc8b3B0aW9uIHZhbHVlPSJ2cG5fc2VydmVyIiBkaXNhYmxlZCAnLigkY2VydF90eXBlPT0ndnBuX3NlcnZlcic/J3NlbGVjdGVkJzonJykuJz5WUE4gU2VydmVyIE9ubHk8L29wdGlvbj4nOworKwlwcmludCAnPG9wdGlvbiB2YWx1ZT0idnBuX2NsaWVudF9zZXJ2ZXIiIGRpc2FibGVkICcuKCRjZXJ0X3R5cGU9PSd2cG5fY2xpZW50X3NlcnZlcic/J3NlbGVjdGVkJzonJykuJz5WUE4gQ2xpZW50LCBWUE4gU2VydmVyPC9vcHRpb24+JzsKKysJcHJpbnQgJzxvcHRpb24gdmFsdWU9InRpbWVfc3RhbXBpbmciIGRpc2FibGVkICcuKCRjZXJ0X3R5cGU9PSd0aW1lX3N0YW1waW5nJz8nc2VsZWN0ZWQnOicnKS4nPlRpbWUgU3RhbXBpbmc8L29wdGlvbj4nOworIAk/PgorIAk8L3NlbGVjdD48L3RkPgorIAk8L3RyPgorZGlmZiAtTnVyIHBocGtpLTAuODIvaW5jbHVkZS9vcGVuc3NsX2Z1bmN0aW9ucy5waHAgcGhwa2ktMC44Mi1mRC9pbmNsdWRlL29wZW5zc2xfZnVuY3Rpb25zLnBocAorLS0tIHBocGtpLTAuODIvaW5jbHVkZS9vcGVuc3NsX2Z1bmN0aW9ucy5waHAJMjAwNy0wMS0wNCAxNTo0Nzo1Ny4wMDAwMDAwMDAgKzA5MDAKKysrKyBwaHBraS0wLjgyLWZEL2luY2x1ZGUvb3BlbnNzbF9mdW5jdGlvbnMucGhwCTIwMTAtMDUtMjcgMTY6NTk6NTcuMDAwMDAwMDAwICswOTAwCitAQCAtNjksNiArNjksMTMgQEAKKyBkZWZhdWx0X2RheXMgICAgICAgICAgID0gMzY1CisgcG9saWN5ICAgICAgICAgICAgICAgICA9IHBvbGljeV9zdXBwbGllZAorIAorK1sgZnJlZWRpYW1ldGVyX2NlcnQgXQorK3g1MDlfZXh0ZW5zaW9ucyAgICAgICAgPSBmcmVlZGlhbWV0ZXJfZXh0CisrZGVmYXVsdF9kYXlzICAgICAgICAgICA9IDczMAorK3BvbGljeSAgICAgICAgICAgICAgICAgPSBwb2xpY3lfc3VwcGxpZWQKKysKKysKKysKKyBbIHZwbl9jZXJ0IF0KKyB4NTA5X2V4dGVuc2lvbnMgICAgICAgID0gdnBuX2NsaWVudF9zZXJ2ZXJfZXh0CisgZGVmYXVsdF9kYXlzICAgICAgICAgICA9IDM2NQorQEAgLTE1Miw2ICsxNTksMjQgQEAKKyBuc1Jldm9jYXRpb25VcmwgICAgICAgICA9IG5zX3Jldm9rZV9xdWVyeS5waHA/CisgbnNDYVBvbGljeVVybCAgICAgICAgICAgPSAkY29uZmlnW2Jhc2VfdXJsXXBvbGljeS5odG1sCisgCisrWyBmcmVlZGlhbWV0ZXJfZXh0IF0KKytiYXNpY0NvbnN0cmFpbnRzICAgICAgICA9IENBOmZhbHNlCisra2V5VXNhZ2UgICAgICAgICAgICAgICAgPSBjcml0aWNhbCwgZGlnaXRhbFNpZ25hdHVyZSwga2V5RW5jaXBoZXJtZW50CisrZXh0ZW5kZWRLZXlVc2FnZSAgICAgICAgPSBjcml0aWNhbCwgc2VydmVyQXV0aCwgY2xpZW50QXV0aAorK25zQ2VydFR5cGUgICAgICAgICAgICAgID0gY3JpdGljYWwsIHNlcnZlciwgY2xpZW50Cisrc3ViamVjdEtleUlkZW50aWZpZXIgICAgPSBoYXNoCisrYXV0aG9yaXR5S2V5SWRlbnRpZmllciAgPSBrZXlpZDphbHdheXMsIGlzc3VlcjphbHdheXMKKytzdWJqZWN0QWx0TmFtZSAgICAgICAgICA9IEROUzokY29tbW9uX25hbWUsZW1haWw6Y29weQorK2lzc3VlckFsdE5hbWUgICAgICAgICAgID0gaXNzdWVyOmNvcHkKKytjcmxEaXN0cmlidXRpb25Qb2ludHMgICA9IFVSSTokY29uZmlnW2Jhc2VfdXJsXWluZGV4LnBocD9zdGFnZT1kbF9jcmwKKytuc0NvbW1lbnQgICAgICAgICAgICAgICA9IFwiUEhQa2kvT3BlblNTTCBHZW5lcmF0ZWQgU2VjdXJlIENlcnRpZmljYXRlIGZvciBmcmVlRGlhbWV0ZXJcIgorK25zQmFzZVVybCAgICAgICAgICAgICAgICAgICAgICAgPSAkY29uZmlnW2Jhc2VfdXJsXQorK25zUmV2b2NhdGlvblVybCAgICAgICAgICAgICA9IG5zX3Jldm9rZV9xdWVyeS5waHA/CisrbnNDYVBvbGljeVVybCAgICAgICAgICAgPSAkY29uZmlnW2Jhc2VfdXJsXXBvbGljeS5odG1sCisrCisrCisrCisrCisgWyB0aW1lX3N0YW1waW5nX2V4dCBdCisgYmFzaWNDb25zdHJhaW50cyAgICAgICA9IENBOmZhbHNlCisga2V5VXNhZ2UgICAgICAgICAgICAgICA9IGNyaXRpY2FsLCBub25SZXB1ZGlhdGlvbiwgZGlnaXRhbFNpZ25hdHVyZQorZGlmZiAtTnVyIHBocGtpLTAuODIvb3BlbnNzbC5jbmYgcGhwa2ktMC44Mi1mRC9vcGVuc3NsLmNuZgorLS0tIHBocGtpLTAuODIvb3BlbnNzbC5jbmYJMjAwNi0wNy0yMyAwMDozMzozNC4wMDAwMDAwMDAgKzA5MDAKKysrKyBwaHBraS0wLjgyLWZEL29wZW5zc2wuY25mCTIwMTAtMDUtMjcgMTc6MDA6MzMuMDAwMDAwMDAwICswOTAwCitAQCAtMzksNiArMzksMTEgQEAKKyBkZWZhdWx0X2RheXMgICAgICAgICAgID0gMzY1CisgcG9saWN5ICAgICAgICAgICAgICAgICA9IHBvbGljeV9zdXBwbGllZAorIAorK1sgZnJlZWRpYW1ldGVyX2NlcnQgXQorK3g1MDlfZXh0ZW5zaW9ucyAgICAgICAgPSBmcmVlZGlhbWV0ZXJfZXh0CisrZGVmYXVsdF9kYXlzICAgICAgICAgICA9IDczMAorK3BvbGljeSAgICAgICAgICAgICAgICAgPSBwb2xpY3lfc3VwcGxpZWQKKysKKyBbIHZwbl9jZXJ0IF0KKyB4NTA5X2V4dGVuc2lvbnMgICAgICAgID0gdnBuX2NsaWVudF9zZXJ2ZXJfZXh0CisgZGVmYXVsdF9kYXlzICAgICAgICAgICA9IDM2NQorQEAgLTExNSw2ICsxMjAsMjMgQEAKKyBuc1Jldm9jYXRpb25VcmwJCT0gbnNfcmV2b2tlX3F1ZXJ5LnBocD8KKyBuc0NhUG9saWN5VXJsICAgICAgICAgICA9IGh0dHA6Ly93d3cuc29tZXdoZXJlLmNvbS9waHBraS9wb2xpY3kuaHRtbAorIAorK1sgZnJlZWRpYW1ldGVyX2V4dCBdCisrYmFzaWNDb25zdHJhaW50cyAgICAgICAgPSBDQTpmYWxzZQorK2tleVVzYWdlICAgICAgICAgICAgICAgID0gY3JpdGljYWwsIGRpZ2l0YWxTaWduYXR1cmUsIGtleUVuY2lwaGVybWVudAorK2V4dGVuZGVkS2V5VXNhZ2UgICAgICAgID0gY3JpdGljYWwsIHNlcnZlckF1dGgsIGNsaWVudEF1dGgKKytuc0NlcnRUeXBlICAgICAgICAgICAgICA9IGNyaXRpY2FsLCBzZXJ2ZXIsIGNsaWVudAorK3N1YmplY3RLZXlJZGVudGlmaWVyICAgID0gaGFzaAorK2F1dGhvcml0eUtleUlkZW50aWZpZXIgID0ga2V5aWQ6YWx3YXlzLCBpc3N1ZXI6YWx3YXlzCisrc3ViamVjdEFsdE5hbWUgICAgICAgICAgPSBETlM6JGNvbW1vbl9uYW1lLGVtYWlsOmNvcHkKKytpc3N1ZXJBbHROYW1lICAgICAgICAgICA9IGlzc3Vlcjpjb3B5CisrY3JsRGlzdHJpYnV0aW9uUG9pbnRzICAgPSBVUkk6JGNvbmZpZ1tiYXNlX3VybF1pbmRleC5waHA/c3RhZ2U9ZGxfY3JsCisrbnNDb21tZW50ICAgICAgICAgICAgICAgPSAiUEhQa2kvT3BlblNTTCBHZW5lcmF0ZWQgU2VjdXJlIENlcnRpZmljYXRlIGZvciBmcmVlRGlhbWV0ZXIiCisrbnNCYXNlVXJsICAgICAgICAgICAgICAgICAgICAgICA9ICRjb25maWdbYmFzZV91cmxdCisrbnNSZXZvY2F0aW9uVXJsICAgICAgICAgICAgID0gbnNfcmV2b2tlX3F1ZXJ5LnBocD8KKytuc0NhUG9saWN5VXJsICAgICAgICAgICA9ICRjb25maWdbYmFzZV91cmxdcG9saWN5Lmh0bWwKKysKKysKKysKKyBbIHZwbl9jbGllbnRfZXh0IF0KKyBiYXNpY0NvbnN0cmFpbnRzICAgICAgICA9IGNyaXRpY2FsLCBDQTpmYWxzZQorIGtleVVzYWdlICAgICAgICAgICAgICAgID0gY3JpdGljYWwsIGRpZ2l0YWxTaWduYXR1cmUKK2RpZmYgLU51ciBwaHBraS0wLjgyL3NldHVwLnBocCBwaHBraS0wLjgyLWZEL3NldHVwLnBocAorLS0tIHBocGtpLTAuODIvc2V0dXAucGhwCTIwMDctMDctMjIgMjM6MzQ6MDguMDAwMDAwMDAwICswOTAwCisrKysgcGhwa2ktMC44Mi1mRC9zZXR1cC5waHAJMjAxMC0wNS0yNyAxNzowMTo0MS4wMDAwMDAwMDAgKzA5MDAKK0BAIC0zMzksNiArMzM5LDExIEBACisgZGVmYXVsdF9kYXlzICAgICAgICAgICA9IDM2NQorIHBvbGljeSAgICAgICAgICAgICAgICAgPSBwb2xpY3lfc3VwcGxpZWQKKyAKKytbIGZyZWVkaWFtZXRlcl9jZXJ0IF0KKyt4NTA5X2V4dGVuc2lvbnMgICAgICAgID0gZnJlZWRpYW1ldGVyX2V4dAorK2RlZmF1bHRfZGF5cyAgICAgICAgICAgPSA3MzAKKytwb2xpY3kgICAgICAgICAgICAgICAgID0gcG9saWN5X3N1cHBsaWVkCisrCisgWyB2cG5fY2VydCBdCisgeDUwOV9leHRlbnNpb25zICAgICAgICA9IHZwbl9jbGllbnRfc2VydmVyX2V4dAorIGRlZmF1bHRfZGF5cyAgICAgICAgICAgPSAzNjUKK0BAIC00MTgsNiArNDIzLDIyIEBACisgbnNSZXZvY2F0aW9uVXJsCQkgICAgPSBuc19yZXZva2VfcXVlcnkucGhwPworIG5zQ2FQb2xpY3lVcmwgICAgICAgICAgID0gJGNvbmZpZ1tiYXNlX3VybF1wb2xpY3kuaHRtbAorIAorK1sgZnJlZWRpYW1ldGVyX2V4dCBdCisrYmFzaWNDb25zdHJhaW50cyAgICAgICAgPSBDQTpmYWxzZQorK2tleVVzYWdlICAgICAgICAgICAgICAgID0gY3JpdGljYWwsIGRpZ2l0YWxTaWduYXR1cmUsIGtleUVuY2lwaGVybWVudAorK2V4dGVuZGVkS2V5VXNhZ2UgICAgICAgID0gY3JpdGljYWwsIHNlcnZlckF1dGgsIGNsaWVudEF1dGgKKytuc0NlcnRUeXBlICAgICAgICAgICAgICA9IGNyaXRpY2FsLCBzZXJ2ZXIsIGNsaWVudAorK3N1YmplY3RLZXlJZGVudGlmaWVyICAgID0gaGFzaAorK2F1dGhvcml0eUtleUlkZW50aWZpZXIgID0ga2V5aWQ6YWx3YXlzLCBpc3N1ZXI6YWx3YXlzCisrc3ViamVjdEFsdE5hbWUgICAgICAgICAgPSBETlM6JGNvbW1vbl9uYW1lLGVtYWlsOmNvcHkKKytpc3N1ZXJBbHROYW1lICAgICAgICAgICA9IGlzc3Vlcjpjb3B5CisrY3JsRGlzdHJpYnV0aW9uUG9pbnRzICAgPSBVUkk6JGNvbmZpZ1tiYXNlX3VybF1pbmRleC5waHA/c3RhZ2U9ZGxfY3JsCisrbnNDb21tZW50ICAgICAgICAgICAgICAgPSAiUEhQa2kvT3BlblNTTCBHZW5lcmF0ZWQgU2VjdXJlIENlcnRpZmljYXRlIGZvciBmcmVlRGlhbWV0ZXIiCisrbnNCYXNlVXJsCQkgICAgICAgID0gJGNvbmZpZ1tiYXNlX3VybF0KKytuc1Jldm9jYXRpb25VcmwJCSAgICA9IG5zX3Jldm9rZV9xdWVyeS5waHA/CisrbnNDYVBvbGljeVVybCAgICAgICAgICAgPSAkY29uZmlnW2Jhc2VfdXJsXXBvbGljeS5odG1sCisrCisrCisgWyB0aW1lX3N0YW1waW5nX2V4dCBdCisgYmFzaWNDb25zdHJhaW50cyAgICAgICA9IENBOmZhbHNlCisga2V5VXNhZ2UgICAgICAgICAgICAgICA9IGNyaXRpY2FsLCBub25SZXB1ZGlhdGlvbiwgZGlnaXRhbFNpZ25hdHVyZQorZGlmZiAtTnVyIHBocGtpLTAuODIvc2V0dXAucGhwLXByZXNldHVwIHBocGtpLTAuODItZkQvc2V0dXAucGhwLXByZXNldHVwCistLS0gcGhwa2ktMC44Mi9zZXR1cC5waHAtcHJlc2V0dXAJMjAwNy0wNy0yMiAyMzozNDowOC4wMDAwMDAwMDAgKzA5MDAKKysrKyBwaHBraS0wLjgyLWZEL3NldHVwLnBocC1wcmVzZXR1cAkyMDEwLTA1LTI3IDE3OjAxOjQxLjAwMDAwMDAwMCArMDkwMAorQEAgLTMzOSw2ICszMzksMTEgQEAKKyBkZWZhdWx0X2RheXMgICAgICAgICAgID0gMzY1CisgcG9saWN5ICAgICAgICAgICAgICAgICA9IHBvbGljeV9zdXBwbGllZAorIAorK1sgZnJlZWRpYW1ldGVyX2NlcnQgXQorK3g1MDlfZXh0ZW5zaW9ucyAgICAgICAgPSBmcmVlZGlhbWV0ZXJfZXh0CisrZGVmYXVsdF9kYXlzICAgICAgICAgICA9IDczMAorK3BvbGljeSAgICAgICAgICAgICAgICAgPSBwb2xpY3lfc3VwcGxpZWQKKysKKyBbIHZwbl9jZXJ0IF0KKyB4NTA5X2V4dGVuc2lvbnMgICAgICAgID0gdnBuX2NsaWVudF9zZXJ2ZXJfZXh0CisgZGVmYXVsdF9kYXlzICAgICAgICAgICA9IDM2NQorQEAgLTQxOCw2ICs0MjMsMjIgQEAKKyBuc1Jldm9jYXRpb25VcmwJCSAgICA9IG5zX3Jldm9rZV9xdWVyeS5waHA/CisgbnNDYVBvbGljeVVybCAgICAgICAgICAgPSAkY29uZmlnW2Jhc2VfdXJsXXBvbGljeS5odG1sCisgCisrWyBmcmVlZGlhbWV0ZXJfZXh0IF0KKytiYXNpY0NvbnN0cmFpbnRzICAgICAgICA9IENBOmZhbHNlCisra2V5VXNhZ2UgICAgICAgICAgICAgICAgPSBjcml0aWNhbCwgZGlnaXRhbFNpZ25hdHVyZSwga2V5RW5jaXBoZXJtZW50CisrZXh0ZW5kZWRLZXlVc2FnZSAgICAgICAgPSBjcml0aWNhbCwgc2VydmVyQXV0aCwgY2xpZW50QXV0aAorK25zQ2VydFR5cGUgICAgICAgICAgICAgID0gY3JpdGljYWwsIHNlcnZlciwgY2xpZW50Cisrc3ViamVjdEtleUlkZW50aWZpZXIgICAgPSBoYXNoCisrYXV0aG9yaXR5S2V5SWRlbnRpZmllciAgPSBrZXlpZDphbHdheXMsIGlzc3VlcjphbHdheXMKKytzdWJqZWN0QWx0TmFtZSAgICAgICAgICA9IEROUzokY29tbW9uX25hbWUsZW1haWw6Y29weQorK2lzc3VlckFsdE5hbWUgICAgICAgICAgID0gaXNzdWVyOmNvcHkKKytjcmxEaXN0cmlidXRpb25Qb2ludHMgICA9IFVSSTokY29uZmlnW2Jhc2VfdXJsXWluZGV4LnBocD9zdGFnZT1kbF9jcmwKKytuc0NvbW1lbnQgICAgICAgICAgICAgICA9ICJQSFBraS9PcGVuU1NMIEdlbmVyYXRlZCBTZWN1cmUgQ2VydGlmaWNhdGUgZm9yIGZyZWVEaWFtZXRlciIKKytuc0Jhc2VVcmwJCSAgICAgICAgPSAkY29uZmlnW2Jhc2VfdXJsXQorK25zUmV2b2NhdGlvblVybAkJICAgID0gbnNfcmV2b2tlX3F1ZXJ5LnBocD8KKytuc0NhUG9saWN5VXJsICAgICAgICAgICA9ICRjb25maWdbYmFzZV91cmxdcG9saWN5Lmh0bWwKKysKKysKKyBbIHRpbWVfc3RhbXBpbmdfZXh0IF0KKyBiYXNpY0NvbnN0cmFpbnRzICAgICAgID0gQ0E6ZmFsc2UKKyBrZXlVc2FnZSAgICAgICAgICAgICAgID0gY3JpdGljYWwsIG5vblJlcHVkaWF0aW9uLCBkaWdpdGFsU2lnbmF0dXJlCmRpZmYgLS1naXQgYS9jb250cmliL1JFQURNRSBiL2NvbnRyaWIvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3OGQzMGIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL1JFQURNRQpAQCAtMCwwICsxLDYxIEBACitUaGlzIGZpbGUgZGVzY3JpYmVzIHRoZSBjb250ZW50IG9mIHRoZSAiY29udHJpYiIgZGlyZWN0b3J5LiAKK0ZvciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZnJlZURpYW1ldGVyIHByb2plY3QsIHBsZWFzZSByZWZlcgordG8gdG9wLWxldmVsIFJFQURNRSBmaWxlLgorCistIHVwZGF0ZV9jb3B5cmlnaHQuc2ggOiBUaGlzIHNjcmlwdCB3aWxsIHNpbXBseSB1cGRhdGUgdGhlIGNvcHlyaWdodCBpbmZvcm1hdGlvbgorICAgICAgICBpbiBhbGwgc291cmNlIGZpbGVzIGluIHRoZSBmcmVlRGlhbWV0ZXIgbWVyY3VyaWFsIHJlcG9zaXRvcnksIGJhc2VkCisJb24gdGhlIGxhc3QgbW9kaWZpY2F0aW9uIHRpbWUuIFRob3VnaHQgSSBtaWdodCBzaGFyZSBpdCBpZiBvdGhlciBwZW9wbGUgZmluZAorCWl0IHVzZWZ1bCBmb3IgdGhlaXIgb3duIHByb2plY3QuLi4KKworCistIGRlYmlhbiA6IFRoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIHRoZSBwYWNrYWdpbmcgaW5mb3JtYXRpb24gdG8gY3JlYXRlIG5hdGl2ZSBEZWJpYW4gLyBVYnVudHUgCisJcGFja2FnZXMuIEl0IHJlcXVpcmVzIGRlYmhlbHBlciA+PSA3LjMuOSAoc3VwcG9ydCBmb3IgY21ha2UpLiBUbyB1c2UsIHNpbXBseSBsaW5rIHRoZQorCWRlYmlhbiBmb2xkZXIgZnJvbSB0aGUgbWFpbiBmcmVlRGlhbWV0ZXIgZm9sZGVyLCB0aGVuIHVzZSB5b3VyIGJ1aWxkaW5nIHNjcmlwdCBhcworCXVzdWFsICgnZGggYmluYXJ5JyBvciAncGRlYnVpbGQnIG9yIC4uLikuCisJSWYgeW91IHNpbXBseSBpbnRlbmQgdG8gdXNlIGZyZWVEaWFtZXRlciBwYWNrYWdlLCB0aGUgcmVsZXZhbnQgaW5mb3JtYXRpb24gaXMgbG9jYXRlZAorCWF0OiBodHRwOi8vd3d3LmZyZWVkaWFtZXRlci5uZXQvdHJhYy93aWtpL0RlYlJlcG9zaXRvcnkKKworCistIFBLSSA6IFRoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIHVzZWZ1bCBtYXRlcmlhbCByZWxhdGVkIHRvIGVzdGFibGlzaGluZyBhIAorICAgICAgICBQdWJsaWMgS2V5IEluZnJhc3RydWN0dXJlIChQS0kpIGZvciBkZXBsb3lpbmcgeDUwOSBjZXJ0aWZpY2F0ZXMgCisJYW5kIHVzZSB0aGVzZSBmb3IgVExTIGF1dGhlbnRpY2F0aW9uIG9mIHRoZSBmcmVlRGlhbWV0ZXIgbm9kZXMuCisJCisgICAgICAgIElNUE9SVEFOVDogUGxlYXNlIG5vdGUgdGhhdCB0aGVzZSBzb2x1dGlvbnMgYXJlIE5PVCBzdWl0YWJsZSAKKwlmb3IgdXNlIGluIGEgcHJvZHVjdGlvbiBlbnZpcm9ubWVudCEgSXQgYWxsb3dzIGVhc3kgZGVwbG95bWVudCBvZiAKKwljZXJ0aWZpY2F0ZXMgZm9yIHRlc3RzLCBhbmQgdGhhdCBpcyB0aGVpciBzb2xlIHB1cnBvc2UuCisgICAgCisgICAgICAgIFRoZSBkaXJlY3RvcnkgY29udGFpbnM6CisJCisgICAgLSBjYV9zY3JpcHQ6IGEgc2ltcGxlIE1ha2VmaWxlIGFsbG93aW5nIHlvdSB0byBnZW5lcmF0ZSBhIHNlbGYtc2lnbmVkIGNlcnRpZmljYXRlIChyb290KQorICAgICAgICAgICAgICAgIGFuZCB0aGVuIGlzc3VlIG5ldyBjZXJ0aWZpY2F0ZXMgYW5kIHByaXZhdGUga2V5cyBmb3IgeW91ciB1c2Vycy4KKwkJUnVuICJtYWtlIiB3aXRob3V0IGFyZ3VtZW50IHRvIGdldCB0aGUgaGVscC4KKwkJCisgICAgLSBjYV9zY3JpcHQyOiBBbiBldm9sdXRpb24gb2YgdGhlIHByZXZpb3VzIE1ha2VmaWxlLiBUaGlzIG9uZSBhbGxvd3MgeW91CisgICAgCQl0byBjcmVhdGUgYSBoaWVyYXJjaHkgb2YgQ0EgYW5kIGNlcnRpZmljYXRlcy4gCisKKyAgICAtIHBocGtpLTAuODIucGF0Y2ggOiBUaGlzIHBhdGNoIGlzIHRvIGJlIGFwcGxpZWQgdG8gUEhQa2kgdG8gY3VzdG9taXplIHRoZSB1c2UgZm9yIGZyZWVEaWFtZXRlci4KKyAgICAgICAgICAgICAgICBQSFBraSAoaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9waHBraS8pIGlzIGEgUEhQLWJhc2VkIHdlYiBpbnRlcmZhY2UKKwkJdGhhdCBwcm92aWRlcyBtb3JlIG9yIGxlc3MgdGhlIHNhbWUgc2VydmljZXMgYXMgY2Ffc2NyaXB0LgorCisKKy0gT3BlbldSVCA6IFRoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIHRoZSBzY3JpcHRzIGFuZCBkb2N1bWVudGF0aW9uIHJlbGF0ZWQgdG8gCisJdGhlIGludGVncmF0aW9uIG9mIGZyZWVEaWFtZXRlciBSQURJVVMvRGlhbWV0ZXIgZ2F0ZXdheSBjb21wb25lbnQgaW4gdGhlIG9wZW5XUlQKKwlkaXN0cmlidXRpb24gKGh0dHA6Ly9vcGVud3J0Lm9yZykgLS0gdGhlIGdvYWwgaXMgdG8gZ2l2ZSB0aGUgYWNjZXNzIHBvaW50IHRoZSAKKwlhYmlsaXR5IHRvICJ0YWxrIiBEaWFtZXRlciBpbnN0ZWFkIG9mIFJBRElVUy4KKwkJCQkKKworLSBuaWdodGx5X3Rlc3RzIDogVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgdGhlIHNjcmlwdHMgYW5kIGRvY3VtZW50YXRpb24gZm9yIHRoZSBuaWdodGx5IAorCXRlc3RzIHJ1biBvbiBmcmVlRGlhbWV0ZXIuIFRoZSByZXN1bHRzIGFyZSBwdWJsaXNoZWQgYXQgdGhlIGZvbGxvd2luZyBVUkw6CisJaHR0cDovL3d3dy5mcmVlZGlhbWV0ZXIubmV0L0NEYXNoL2luZGV4LnBocD9wcm9qZWN0PWZyZWVEaWFtZXRlcgorCisKKy0gZGljdF9sZWdhY3k6IFhNTCBhbmQgRFREIGZpbGVzIGZvciB0aGUgZGljdF9sZWdhY3lfeG1sLmZkeCBleHRlbnNpb24uCisKKy0gZGljdF9kY2NhOiBwYXJ0aWFsIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgRENDQSBkaWN0aW9uYXJ5CisKKy0gZGljdF9neDogdW50ZXN0ZWQgaW1wbGVtZW50YXRpb24gb2YgdGhlIEd4IGludGVyZmFjZS4KKworLSB0ZXN0X0d4OiBhIHJlc3BvbmRlciBvbiB0aGUgR3ggaW50ZXJmYWNlIHRoYXQgYWx3YXlzIHNlbmQgU1VDQ0VTUyBzdGF0dXMuCisKKy0gd2lyZXNoYXJrOiBUaGlzIGNvbnRhaW5zIHNvbWUgaW5mb3JtYXRpb24gb24gaG93IHRvIHVzZSBXaXJlc2hhcmsgdG8gbW9uaXRvciBEaWFtZXRlcgorCWV4Y2hhbmdlIHByb3RlY3RlZCB3aXRoIFRMUy4gSXQgaW52b2x2ZXMgcGF0Y2hpbmcgdGhlIHdpcmVzaGFyayBzb2Z0d2FyZS4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvUlBNL2J1aWxkX3JwbS50eHQgYi9jb250cmliL1JQTS9idWlsZF9ycG0udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjUzZWI3N2YKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL1JQTS9idWlsZF9ycG0udHh0CkBAIC0wLDAgKzEsNiBAQAorW2tydW1AVGhpbmtQYWQgRGVsTWVdJCBjcCBmcmVlRGlhbWV0ZXIuc3BlYyAvaG9tZS9rcnVtL3JwbWJ1aWxkL1NQRUNTLworW2tydW1AVGhpbmtQYWQgRGVsTWVdJCBjZCAvaG9tZS9rcnVtL3JwbWJ1aWxkL1NPVVJDRVMvCitba3J1bUBUaGlua1BhZCB+XSQgY2QgL2hvbWUva3J1bS9ycG1idWlsZC9TT1VSQ0VTLworW2tydW1AVGhpbmtQYWQgU09VUkNFU10kIHdnZXQgaHR0cDovL3d3dy5mcmVlZGlhbWV0ZXIubmV0L2hnL2ZyZWVEaWFtZXRlci9hcmNoaXZlLzEuMS42LnRhci5negorW2tydW1AVGhpbmtQYWQgU09VUkNFU10kIGNkIC4uL1NQRUNTLworW2tydW1AVGhpbmtQYWQgU1BFQ1NdJCBycG1idWlsZCAtYmEgZnJlZURpYW1ldGVyLnNwZWMKZGlmZiAtLWdpdCBhL2NvbnRyaWIvUlBNL2ZyZWVEaWFtZXRlci5zcGVjIGIvY29udHJpYi9SUE0vZnJlZURpYW1ldGVyLnNwZWMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2Y0OTJkYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvUlBNL2ZyZWVEaWFtZXRlci5zcGVjCkBAIC0wLDAgKzEsNzggQEAKKworTmFtZTogZnJlZURpYW1ldGVyCQkKK1ZlcnNpb246IDEuMS42IAkKK1JlbGVhc2U6IDElez9kaXN0fQorUGFja2FnZXI6IGtydW0uYm95NGV2QGdtYWlsLmNvbQorU3VtbWFyeTogZnJlZURpYW1ldGVyIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBEaWFtZXRlciBwcm90b2NvbC4gCQorR3JvdXA6IERldmVsb3BtZW50L0xpYnJhcmllcwkJCitMaWNlbnNlOiBCU0QgTGljZW5zZQkKK1VSTDogaHR0cDovL3d3dy5mcmVlZGlhbWV0ZXIubmV0CQkKK1NvdXJjZTA6IGh0dHA6Ly93d3cuZnJlZWRpYW1ldGVyLm5ldC9oZy9mcmVlRGlhbWV0ZXIvYXJjaGl2ZS8xLjEuNi50YXIuZ3oJCisKK0J1aWxkUmVxdWlyZXM6IGNtYWtlIG1ha2UgZ2NjIGdjYy1jKysgZmxleCBiaXNvbiBsa3NjdHAtdG9vbHMtZGV2ZWwgCitCdWlsZFJlcXVpcmVzOiBnbnV0bHMtZGV2ZWwgbGliZ2NyeXB0LWRldmVsIGxpYmlkbi1kZXZlbAorQnVpbGRSZXF1aXJlczogbWVyY3VyaWFsCQorUmVxdWlyZXM6IGxrc2N0cC10b29scwkKKworJWRlc2NyaXB0aW9uCitmcmVlRGlhbWV0ZXIgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIERpYW1ldGVyIHByb3RvY29sLgorCQorRGlhbWV0ZXIgaXMgYSBwcm90b2NvbCBkZXNpZ25lZCB0byBjYXJyeSBBdXRoZW50aWNhdGlvbiwgQXV0aG9yaXphdGlvbiBhbmQKK0FjY291bnRpbmcgKEFBQSkgcGF5bG9hZC4gSXQgaXMgYW4gZXZvbHV0aW9uIG9mIHRoZSBSQURJVVMgcHJvdG9jb2wgKGFzIHRoZQorbmFtZSBzdWdnZXN0cykuCisKK1NlZSBodHRwOi8vd3d3LmZyZWVkaWFtZXRlci5uZXQvIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBwcm9qZWN0LgorCQorZnJlZURpYW1ldGVyIHdhcyBwcmV2aW91c2x5IGtub3duIGFzIHRoZSAid2FhYWQiIHByb2plY3QgKFdJREUgQUFBIERhZW1vbikKK1RoaXMgcHJvamVjdCBpcyBub3QgcmVsYXRlZCB0byB0aGUgImZyZWVkaWFtZXRlciIgcHJvamVjdCBmcm9tIFN1biBvbiBzb3VyY2Vmb3JnZS4KKwkKK0F1dGhvcjogU2ViYXN0aWVuIERlY3VnaXMuCisKKyVwYWNrYWdlIGRhZW1vbgorU3VtbWFyeTogIFNpbXBsZSBkYWVtb24gcGFyc2VzIHRoZSBjb21tYW5kIGxpbmUgYW5kIGluaXRpYWxpemVzIHRoZSBmcmVlRGlhbWV0ZXIgZnJhbWV3b3JrLgorR3JvdXA6IERldmVsb3BtZW50L0xpYnJhcmllcworUmVxdWlyZXM6IGZyZWVEaWFtZXRlcgorCislZGVzY3JpcHRpb24gZGFlbW9uCitmcmVlRGlhbWV0ZXJkIDogdGhpcyBzaW1wbGUgZGFlbW9uIHBhcnNlcyB0aGUgY29tbWFuZCBsaW5lIGFuZCBpbml0aWFsaXplcyB0aGUKK2ZyZWVEaWFtZXRlciBmcmFtZXdvcmsuIFVzZSBpdCBmb3IgeW91ciBEaWFtZXRlciBzZXJ2ZXIgJiBhZ2VudCBjb21wb25lbnRzLgorSW4gY2FzZSBvZiBEaWFtZXRlciBjbGllbnRzLCB5b3UgcHJvYmFibHkgd2lsbCBwcmVmZXIgbGlua2luZyB0aGUgbGliZmRjb3JlCitkaXJlY3RseSB3aXRoIHlvdXIgY2xpZW50IGFwcGxpY2F0aW9uIHRoYXQgbXVzdCBiZSBtYWRlIERpYW1ldGVyLWF3YXJlLgorCisKKyVwcmVwCislc2V0dXAgLXFuICV7bmFtZX0tJXt2ZXJzaW9ufQorCisKKyVidWlsZAorbWtkaXIgLXAgYnVpbGQKK2NkIGJ1aWxkCitjbWFrZSAuLi8KKworbWFrZSAlez9fc21wX21mbGFnc30KKworCislaW5zdGFsbAorcm0gLXJmICRSUE1fQlVJTERfUk9PVAorY2QgYnVpbGQKK21ha2UgaW5zdGFsbCBERVNURElSPSRSUE1fQlVJTERfUk9PVAorbWFrZSB0ZXN0CisKKyVwb3N0IGRhZW1vbgorZWNobyAiL3Vzci9sb2NhbC9saWIvIiA+IC9ldGMvbGQuc28uY29uZi5kLyV7bmFtZX0uY29uZiAKKy9zYmluL2xkY29uZmlnCisKKyVmaWxlcworJWRlZmF0dHIoLSxyb290LHJvb3QsLSkKKy91c3IvbG9jYWwvaW5jbHVkZS8KKy91c3IvbG9jYWwvbGliLworCislZmlsZXMgZGFlbW9uCislZGVmYXR0cigtLHJvb3Qscm9vdCwtKQorL3Vzci9sb2NhbC9iaW4vCisKKworCislY2hhbmdlbG9nCisgKiBTYXQgSnVsIDUgMjAxMyBLcnVtIEJveWNoZXYgPGtydW0uYm95NGV2QGdtYWlsLmNvbT4gLSAxLjEuNi0xCisgLSBpbml0aWFsIHZlcnNpb24KZGlmZiAtLWdpdCBhL2NvbnRyaWIvYXBwX2FjY3RfdG9vbHMvUkVBRE1FIGIvY29udHJpYi9hcHBfYWNjdF90b29scy9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDcyOGYxNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvYXBwX2FjY3RfdG9vbHMvUkVBRE1FCkBAIC0wLDAgKzEsNDcgQEAKK1RoaXMgZm9sZGVyIGNvbnRhaW5zIHNldmVyYWwgdG9vbHMgdG8gdXNlIGFuZCBwYXJzZSB0aGUgZGF0YSBmcm9tIHRoZSBhcHBfYWNjdC5mZHggZXh0ZW5zaW9uLgorCistIGRhdGFiYXNlLnNxbCA6CisgICAgQW4gZXhhbXBsZSBkYXRhYmFzZSBmb3JtYXQgZm9yIHVzZSB3aXRoIHRoZSBzY3JpcHRzIGluIHRoaXMgZm9sZGVyLgorICAgIAorLSBhcHBfYWNjdC5jb25mIDoKKyAgICBUaGUgcGFydCBvZiBhcHBfYWNjdC5jb25mIHRoYXQgaXMgcmVsZXZhbnQgdG8gdGhpcyBkYXRhYmFzZSBzY2hlbWEuCisKKy0gcHVyZ2VfdG9fZmlsZS5waHAgOiAKKyAgICBUaGlzIFBIUCBzY3JpcHQgaXMgdXNlZCB0byB0YWtlIHRoZSByZWNvcmRzIGZyb20gdGhlIGluY29taW5nIHRhYmxlIChzdG9yZWQgYnkgYXBwX2FjY3QuZmR4IAorICBleHRlbnNpb24pIGFuZCBzYXZlIHRoZXNlIHJlY29yZHMgaW4gYSBmaWxlIGluIFNRTCBmb3JtYXQuIFRoaXMgaXMgc2ltaWxhciB0byBwZ19kdW1wIAorICBjb21tYW5kLCBleGNlcHQgdGhhdCBhbGwgdGhlIHJlY29yZHMgdGhhdCBoYXZlIGJlZW4gc2F2ZWQgaW4gdGhlIGZpbGUgYXJlIHJlbW92ZWQgZnJvbSAKKyAgdGhlIHRhYmxlLiBUaGlzIGNhbiBiZSB1c2VkIGluIGNyb24gam9icyBmb3IgZXhhbXBsZSB0byBtYWludGFpbiBhIHJlYXNvbmFibGUgc2l6ZSBvZiAKKyAgdGhlIGluY29taW5nIHRhYmxlIGFuZCBtb3ZlIHRoZSBkYXRhIHRvIGFub3RoZXIgaG9zdCBmb3Igb2ZmLWxpbmUgcHJvY2Vzc2luZy4gSXQgY2FuIAorICBhbHNvIGJlIHVzZWZ1bCB0byBhZ2dyZWdhdGUgdGhlIGRhdGEgZnJvbSBkaWZmZXJlbnQgaG9zdHMsIGlmIHlvdSBhcmUgbG9hZC1iYWxhbmNpbmcgeW91cgorICBhY2NvdW50aW5nIHNlcnZlcnMgZm9yIGV4YW1wbGUgKGdyYW50ZWQgdGhhdCBhbGwgYXBwX2FjY3QuZmR4IHVzZSBpZGVudGljYWwgdGFibGUgZm9ybWF0CisgIG9uIGFsbCB0aGUgc2VydmVycykuIFNlZSB0aGUgdG9wIG9mIHRoZSBmaWxlIGZvciBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMuCisgICAgCistIHByb2Nlc3NfcmVjb3Jkcy5waHAgOgorICAgIFRoaXMgUEhQIHNjcmlwdCBwcm9jZXNzZXMgdGhlIHJlY29yZHMgcGVydGFpbmluZyB0byB1c2VycyBzZXNzaW9ucywgYXMgZm9sbG93OgorICAqIHdoZW4gYSBzZXNzaW9uIGlzIGNvbXBsZXRlIChTVE9QIHJlY29yZCByZWNlaXZlZCksIGl0IHN0b3JlcyBhIHNlc3Npb24gc3VtbWFyeQorICBpbnRvIHRoZSBwcm9jZXNzZWQgcmVjb3JkcyB0YWJsZSAoc2VlIHByb2Nlc3NfZGF0YWJhc2Uuc3FsIGZpbGUgZm9yIGZvcm1hdCkuIAorICAqIEl0IG9wdGlvbmFsbHkgYXJjaGl2ZXMgdGhlIHByb2Nlc3NlZCByZWNvcmRzIGludG8gYSBkaWZmZXJlbnQgdGFibGUsIGJlZm9yZSBkZWxldGluZyB0aGVtLgorICAqIEl0IGNhbiBhbHNvIG1vdmUgcmVjb3JkcyBvZiB1bnRlcm1pbmF0ZWQgc2Vzc2lvbnMgdGhhdCBhcmUgb2xkZXIgdGhhbiBhIGNvbmZpZ3VyYWJsZSB0aW1lIAorICB0byBhbiBvcnBoYW5fcmVjb3JkcyB0YWJsZSwgc28gdGhhdCB0aGV5IGFyZSBub3QgcmUtcHJvY2Vzc2VkIGV2ZXJ5IHRpbWUuIAorICBUaGlzIG9ycGhhbnMgdGFibGUgbXVzdCBoYXZlIHRoZSBzYW1lIHN0cnVjdHVyZSBhcyB0aGUgImluY29taW5nIiB0YWJsZS4KKyAgCistIGRpc3BsYXlfcmVzdWx0cy5waHAsIGRpc3BsYXlfc2VsZi5waHAsIGRpc3BsYXlfc3RhdHMucGhwIDoKKyAgIFRoZXNlIHNjcmlwdHMgZ2l2ZSBhIGZldyBleGFtcGxlcyBvZiBob3cgdG8gZGlzcGxheSB0aGUgcHJvY2Vzc2VkIGRhdGEuCisgIAorVVNBR0U6CisgKikgSW5pdGlhbDogY3JlYXRlIHlvdXIgZGF0YWJhc2UgdXNpbmcgZGF0YWJhc2Uuc3FsIGZpbGUKKyAqKSBDb25maWd1cmUgdGhlIGFwcF9hY2N0LmZkeCBleHRlbnNpb24gdXNpbmcgdGlwcyBmcm9tIGFwcF9hY2N0LmNvbmYKKworICBUaGUgZm9sbG93aW5nIHByb2Nlc3NpbmcgY2FuIGJlIHJ1biBmb3IgZXhhbXBsZSBhcyBjcm9uIGpvYnMuCisgMSkgT24gZWFjaCBhY2NvdW50aW5nIHNlcnZlciBmb3IgdGhlIHJlYWxtLCBjb25maWd1cmUgdGhlIGFwcF9hY2N0LmZkeCBleHRlbnNpb24gdG8KKyAgIGR1bXAgdGhlIHJlY29yZHMgaW4gYSBsb2NhbCBkYXRhYmFzZSAoYWxsIHNlcnZlcnMgbXVzdCB1c2UgdGhlIHNhbWUgZGF0YWJhc2UgZm9ybWF0KS4KKyAgIFRoZSB0YWJsZSB3b3VsZCB0eXBpY2FsbHkgYmUgImluY29taW5nIi4KKyAyKSBSdW4gdGhlIHB1cmdlX3RvX2ZpbGUucGhwIHNjcmlwdCBvbiBlYWNoIHNlcnZlciByZWd1bGFybHksIHRoZW4gbW92ZSB0aGUgZ2VuZXJhdGVkCisgICBmaWxlcyBvbnRvIGEgc2luZ2xlIHNlcnZlciBmb3IgcHJvY2Vzc2luZy4gVGhpcyBzZXJ2ZXIgb25seSBuZWVkcyB0aGUgb3RoZXIgdGFibGVzLgorIDMpIEFkZCB0aGUgZGF0YSBmcm9tIHRoZSBmaWxlcyBpbnRvIHRoZSBkYXRhYmFzZSBpbiB0aGlzIHNlcnZlciBieSBydW5uaW5nOgorICAgcHNxbCA8IGZpbGUuc3FsCisgICAgRWFjaCBmaWxlIHRoYXQgaGFzIGJlZW4gYWRkZWQgc2hvdWxkIHRoZW4gYmUgYXJjaGl2ZWQgYW5kIHJlbW92ZWQgc28gdGhhdCBpdCBpcyBub3QgCisgICByZS1hZGRlZCBsYXRlci4KKyA0KSBSdW4gdGhlIHByb2Nlc3NfcmVjb3Jkcy5waHAgc2NyaXB0IG9uIHRoaXMgcHJvY2Vzc2luZyBzZXJ2ZXIuIE5vdywgdGhlIGRhdGFiYXNlCisgICBjb250YWlucyB0aGUgYWdncmVnYXRlZCBkYXRhIHRoYXQgY2FuIGJlIHZpc3VhbGl6ZWQgd2l0aCBkaXNwbGF5XyoucGhwIHNjcmlwdHMuCisgICAKZGlmZiAtLWdpdCBhL2NvbnRyaWIvYXBwX2FjY3RfdG9vbHMvYXBwX2FjY3QuY29uZiBiL2NvbnRyaWIvYXBwX2FjY3RfdG9vbHMvYXBwX2FjY3QuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzljZGI4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9hcHBfYWNjdF90b29scy9hcHBfYWNjdC5jb25mCkBAIC0wLDAgKzEsNjggQEAKKworIyBUaGlzIGlzIHRoZSBjb25maWd1cmF0aW9uIGZvciB1c2Ugd2l0aCB0aGUgZGF0YWJhc2UgY3JlYXRlZCBieSAnZGF0YWJhc2Uuc3FsJyBmaWxlLgorIyBPbmUgc2hvdWxkIHRha2UgY2FyZSBvZiBjb25maWd1cmluZyB0aGUgQ29ubkluZm8gcHJvcGVybHkuCitDb25uSW5mbyA9ICIiOworCisjIFRoZSB0YWJsZSBhbmQgc3BlY2lhbCBmaWVsZHMgbmFtZXM6CitUYWJsZSA9ICJpbmNvbWluZyI7CitUaW1lc3RhbXBfZmllbGQgPSAicmVjb3JkZWRfb24iOworU2VydmVyX25hbWVfZmllbGQgPSAicmVjb3JkZWRfc2VydiI7CisKKyMgVGhlIEFWUHMgdGhhdCBhcmUgc2F2ZWQgaW4gdGhlIHRhYmxlOgorIk9yaWdpbi1Ib3N0IjsKKyJPcmlnaW4tUmVhbG0iOworIkRlc3RpbmF0aW9uLVJlYWxtIjsKKyJEZXN0aW5hdGlvbi1Ib3N0IjsKKyJTZXNzaW9uLUlkIjsKKyJPcmlnaW4tU3RhdGUtSWQiOyAKKyJBY2NvdW50aW5nLVJlY29yZC1UeXBlIjsKKyJBY2NvdW50aW5nLVJlY29yZC1OdW1iZXIiOworIlVzZXItTmFtZSI7CisiRXZlbnQtVGltZXN0YW1wIjsgCisiQWNjdC1BcHBsaWNhdGlvbi1JZCI7CisiQWNjb3VudGluZy1TdWItU2Vzc2lvbi1JZCI7CisiQWNjdC1TZXNzaW9uLUlkIjsKKyJBY2N0LU11bHRpLVNlc3Npb24tSWQiOworIk9yaWdpbi1BQUEtUHJvdG9jb2wiOworIkFjY3QtRGVsYXktVGltZSI7IAorIk5BUy1JZGVudGlmaWVyIjsKKyJOQVMtSVAtQWRkcmVzcyI7CisiTkFTLUlQdjYtQWRkcmVzcyI7CisiTkFTLVBvcnQiOworIk5BUy1Qb3J0LUlkIjsKKyJOQVMtUG9ydC1UeXBlIjsKKyJTZXJ2aWNlLVR5cGUiOworIlRlcm1pbmF0aW9uLUNhdXNlIjsgCisiQWNjb3VudGluZy1JbnB1dC1PY3RldHMiOworIkFjY291bnRpbmctSW5wdXQtUGFja2V0cyI7CisiQWNjb3VudGluZy1PdXRwdXQtT2N0ZXRzIjsKKyJBY2NvdW50aW5nLU91dHB1dC1QYWNrZXRzIjsKKyJBY2N0LUF1dGhlbnRpYyI7CisiQWNjdC1MaW5rLUNvdW50IjsKKyJBY2N0LVNlc3Npb24tVGltZSI7IAorIkFjY3QtVHVubmVsLUNvbm5lY3Rpb24iOworIkFjY3QtVHVubmVsLVBhY2tldHMtTG9zdCI7IAorIkNhbGxiYWNrLUlkIjsKKyJDYWxsYmFjay1OdW1iZXIiOworIkNhbGxlZC1TdGF0aW9uLUlkIjsKKyJDYWxsaW5nLVN0YXRpb24tSWQiOyAKKyJDb25uZWN0LUluZm8iOworIk9yaWdpbmF0aW5nLUxpbmUtSW5mbyI7IAorIkF1dGhvcml6YXRpb24tTGlmZXRpbWUiOworIlNlc3Npb24tVGltZW91dCI7CisiSWRsZS1UaW1lb3V0IjsKKyJQb3J0LUxpbWl0IjsKKyJBY2NvdW50aW5nLVJlYWx0aW1lLVJlcXVpcmVkIjsgCisiQWNjdC1JbnRlcmltLUludGVydmFsIjsKKyJGaWx0ZXItSWQiOworIk5BUy1GaWx0ZXItUnVsZSI7CisiUW9TLUZpbHRlci1SdWxlIjsgCisiTG9naW4tSVAtSG9zdCI7CisiTG9naW4tSVB2Ni1Ib3N0IjsKKyJMb2dpbi1MQVQtR3JvdXAiOworIkxvZ2luLUxBVC1Ob2RlIjsKKyJMb2dpbi1MQVQtUG9ydCI7IAorIkxvZ2luLUxBVC1TZXJ2aWNlIjsKKyJMb2dpbi1TZXJ2aWNlIjsKKyJMb2dpbi1UQ1AtUG9ydCI7IAorIlJvdXRlLVJlY29yZCIgPSB7IG11bHRpPTU7IH07CmRpZmYgLS1naXQgYS9jb250cmliL2FwcF9hY2N0X3Rvb2xzL2RhdGFiYXNlLnNxbCBiL2NvbnRyaWIvYXBwX2FjY3RfdG9vbHMvZGF0YWJhc2Uuc3FsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzYTMwNzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2FwcF9hY2N0X3Rvb2xzL2RhdGFiYXNlLnNxbApAQCAtMCwwICsxLDIyNyBAQAorLS0gZGF0YWJhc2Uuc3FsCistLSBTY3JpcHQgdG8gY3JlYXRlIHRoZSB0YWJsZXMgZm9yIHByb2Nlc3NfcmVjb3Jkcy5waHAgc2NyaXB0IHRvIHBlcmZvcm0uCistLSBJTVBPUlRBTlQgTk9URTogTm8gY29uc3RyYWludCBhbmQgYWxtb3N0IG5vIGluZGV4IGFyZSBjcmVhdGVkIGJ5IHRoaXMgc2NyaXB0LiAKKy0tIE9uZSBzaG91bGQgY29uc2lkZXIgYWRkaW5nIHRoZSBhcHByb3ByaWF0ZSBpbmRleGVzIGFjY29yZGluZyB0byB0aGVpciB1dGlsaXphdGlvbiBvZiB0aGUgZGF0YS4KKworLS0gSW5jb21pbmcgdGFibGUgdGFibGUuCistLSAgVGhpcyB0YWJsZSBpcyB1c2VkIGJ5IGFwcF9hY2N0LmZkeCB0byBzdG9yZSB0aGUgQWNjb3VudGluZyByZWNvcmRzLgorQ1JFQVRFIFRBQkxFIGluY29taW5nICgKKyAgICAiT3JpZ2luLUhvc3QiIGJ5dGVhIE5PVCBOVUxMLAorICAgICJPcmlnaW4tUmVhbG0iIGJ5dGVhIE5PVCBOVUxMLAorICAgICJEZXN0aW5hdGlvbi1SZWFsbSIgYnl0ZWEsCisgICAgIkRlc3RpbmF0aW9uLUhvc3QiIGJ5dGVhLAorICAgICJTZXNzaW9uLUlkIiBieXRlYSBOT1QgTlVMTCwKKyAgICAiT3JpZ2luLVN0YXRlLUlkIiBpbnRlZ2VyLAorICAgICJBY2NvdW50aW5nLVJlY29yZC1UeXBlIiBpbnRlZ2VyIE5PVCBOVUxMLAorICAgICJBY2NvdW50aW5nLVJlY29yZC1OdW1iZXIiIGludGVnZXIgTk9UIE5VTEwsCisgICAgIlVzZXItTmFtZSIgYnl0ZWEsCisgICAgIkV2ZW50LVRpbWVzdGFtcCIgYnl0ZWEsCisgICAgIkFjY3QtQXBwbGljYXRpb24tSWQiIGludGVnZXIsCisgICAgIkFjY291bnRpbmctU3ViLVNlc3Npb24tSWQiIGJpZ2ludCwKKyAgICAiQWNjdC1TZXNzaW9uLUlkIiBieXRlYSwKKyAgICAiQWNjdC1NdWx0aS1TZXNzaW9uLUlkIiBieXRlYSwKKyAgICAiT3JpZ2luLUFBQS1Qcm90b2NvbCIgaW50ZWdlciwKKyAgICAiQWNjdC1EZWxheS1UaW1lIiBpbnRlZ2VyLAorICAgICJOQVMtSWRlbnRpZmllciIgYnl0ZWEsCisgICAgIk5BUy1JUC1BZGRyZXNzIiBieXRlYSwKKyAgICAiTkFTLUlQdjYtQWRkcmVzcyIgYnl0ZWEsCisgICAgIk5BUy1Qb3J0IiBpbnRlZ2VyLAorICAgICJOQVMtUG9ydC1JZCIgYnl0ZWEsCisgICAgIk5BUy1Qb3J0LVR5cGUiIGludGVnZXIsCisgICAgIlNlcnZpY2UtVHlwZSIgaW50ZWdlciwKKyAgICAiVGVybWluYXRpb24tQ2F1c2UiIGludGVnZXIsCisgICAgIkFjY291bnRpbmctSW5wdXQtT2N0ZXRzIiBiaWdpbnQsCisgICAgIkFjY291bnRpbmctSW5wdXQtUGFja2V0cyIgYmlnaW50LAorICAgICJBY2NvdW50aW5nLU91dHB1dC1PY3RldHMiIGJpZ2ludCwKKyAgICAiQWNjb3VudGluZy1PdXRwdXQtUGFja2V0cyIgYmlnaW50LAorICAgICJBY2N0LUF1dGhlbnRpYyIgaW50ZWdlciwKKyAgICAiQWNjdC1MaW5rLUNvdW50IiBpbnRlZ2VyLAorICAgICJBY2N0LVNlc3Npb24tVGltZSIgaW50ZWdlciwKKyAgICAiQWNjdC1UdW5uZWwtQ29ubmVjdGlvbiIgYnl0ZWEsCisgICAgIkFjY3QtVHVubmVsLVBhY2tldHMtTG9zdCIgaW50ZWdlciwKKyAgICAiQ2FsbGJhY2stSWQiIGJ5dGVhLAorICAgICJDYWxsYmFjay1OdW1iZXIiIGJ5dGVhLAorICAgICJDYWxsZWQtU3RhdGlvbi1JZCIgYnl0ZWEsCisgICAgIkNhbGxpbmctU3RhdGlvbi1JZCIgYnl0ZWEsCisgICAgIkNvbm5lY3QtSW5mbyIgYnl0ZWEsCisgICAgIk9yaWdpbmF0aW5nLUxpbmUtSW5mbyIgYnl0ZWEsCisgICAgIkF1dGhvcml6YXRpb24tTGlmZXRpbWUiIGludGVnZXIsCisgICAgIlNlc3Npb24tVGltZW91dCIgaW50ZWdlciwKKyAgICAiSWRsZS1UaW1lb3V0IiBpbnRlZ2VyLAorICAgICJQb3J0LUxpbWl0IiBpbnRlZ2VyLAorICAgICJBY2NvdW50aW5nLVJlYWx0aW1lLVJlcXVpcmVkIiBpbnRlZ2VyLAorICAgICJBY2N0LUludGVyaW0tSW50ZXJ2YWwiIGludGVnZXIsCisgICAgIkZpbHRlci1JZCIgYnl0ZWEsCisgICAgIk5BUy1GaWx0ZXItUnVsZSIgYnl0ZWEsCisgICAgIlFvUy1GaWx0ZXItUnVsZSIgYnl0ZWEsCisgICAgIkxvZ2luLUlQLUhvc3QiIGJ5dGVhLAorICAgICJMb2dpbi1JUHY2LUhvc3QiIGJ5dGVhLAorICAgICJMb2dpbi1MQVQtR3JvdXAiIGJ5dGVhLAorICAgICJMb2dpbi1MQVQtTm9kZSIgYnl0ZWEsCisgICAgIkxvZ2luLUxBVC1Qb3J0IiBieXRlYSwKKyAgICAiTG9naW4tTEFULVNlcnZpY2UiIGJ5dGVhLAorICAgICJMb2dpbi1TZXJ2aWNlIiBpbnRlZ2VyLAorICAgICJMb2dpbi1UQ1AtUG9ydCIgaW50ZWdlciwKKyAgICAiUm91dGUtUmVjb3JkMSIgYnl0ZWEsCisgICAgIlJvdXRlLVJlY29yZDIiIGJ5dGVhLAorICAgICJSb3V0ZS1SZWNvcmQzIiBieXRlYSwKKyAgICAiUm91dGUtUmVjb3JkNCIgYnl0ZWEsCisgICAgIlJvdXRlLVJlY29yZDUiIGJ5dGVhLAorICAgICJyZWNvcmRlZF9vbiIgdGltZXN0YW1wIHdpdGggdGltZSB6b25lIE5PVCBOVUxMLAorICAgICJyZWNvcmRlZF9zZXJ2IiBieXRlYQorICk7CisKKworLS0gQWNjb3VudGluZyBEYXRhLgorLS0gIFRoaXMgaXMgaXMgdGhlIHByb2Nlc3NlZCBkYXRhIHRoYXQgaXMgdXNlZCBhbHNvIGJ5IGRpc3BsYXlfcmVzdWx0cy5waHAKK0NSRUFURSBUQUJMRSBwcm9jZXNzZWQgKAorICAgIHVzZXJfbmFtZSBieXRlYSwKKyAgICB1c2VyX2RldmljZSBieXRlYSwKKyAgICBuYXNfaW5mbyBieXRlYSwKKyAgICBzZXNzX3N0YXJ0IHRpbWVzdGFtcCB3aXRoIHRpbWUgem9uZSwKKyAgICBzZXNzX2R1cmF0aW9uIGludGVydmFsLAorICAgIGRvd25sX2J5dGVzIGJpZ2ludCwKKyAgICB1cGxfYnl0ZXMgYmlnaW50LAorICAgIGRvd25sX3BhY2tldHMgYmlnaW50LAorICAgIHVwbF9wYWNrZXRzIGJpZ2ludAorICk7CitDUkVBVEUgSU5ERVggdW5faW5kZXggT04gcHJvY2Vzc2VkICh1c2VyX25hbWUpOworCisKKworLS0gT3JwaGFucyB0YWJsZS4KKy0tICBUaGlzIGlzIG9wdGlvbmFsLCBhbmQgaXQgbXVzdCBtYXRjaCB0aGUgc3RydWN0dXJlIG9mIHlvdXIgaW5jb21pbmcgdGFibGUuCitDUkVBVEUgVEFCTEUgb3JwaGFucyAoCisgICAgIk9yaWdpbi1Ib3N0IiBieXRlYSBOT1QgTlVMTCwKKyAgICAiT3JpZ2luLVJlYWxtIiBieXRlYSBOT1QgTlVMTCwKKyAgICAiRGVzdGluYXRpb24tUmVhbG0iIGJ5dGVhLAorICAgICJEZXN0aW5hdGlvbi1Ib3N0IiBieXRlYSwKKyAgICAiU2Vzc2lvbi1JZCIgYnl0ZWEgTk9UIE5VTEwsCisgICAgIk9yaWdpbi1TdGF0ZS1JZCIgaW50ZWdlciwKKyAgICAiQWNjb3VudGluZy1SZWNvcmQtVHlwZSIgaW50ZWdlciBOT1QgTlVMTCwKKyAgICAiQWNjb3VudGluZy1SZWNvcmQtTnVtYmVyIiBpbnRlZ2VyIE5PVCBOVUxMLAorICAgICJVc2VyLU5hbWUiIGJ5dGVhLAorICAgICJFdmVudC1UaW1lc3RhbXAiIGJ5dGVhLAorICAgICJBY2N0LUFwcGxpY2F0aW9uLUlkIiBpbnRlZ2VyLAorICAgICJBY2NvdW50aW5nLVN1Yi1TZXNzaW9uLUlkIiBiaWdpbnQsCisgICAgIkFjY3QtU2Vzc2lvbi1JZCIgYnl0ZWEsCisgICAgIkFjY3QtTXVsdGktU2Vzc2lvbi1JZCIgYnl0ZWEsCisgICAgIk9yaWdpbi1BQUEtUHJvdG9jb2wiIGludGVnZXIsCisgICAgIkFjY3QtRGVsYXktVGltZSIgaW50ZWdlciwKKyAgICAiTkFTLUlkZW50aWZpZXIiIGJ5dGVhLAorICAgICJOQVMtSVAtQWRkcmVzcyIgYnl0ZWEsCisgICAgIk5BUy1JUHY2LUFkZHJlc3MiIGJ5dGVhLAorICAgICJOQVMtUG9ydCIgaW50ZWdlciwKKyAgICAiTkFTLVBvcnQtSWQiIGJ5dGVhLAorICAgICJOQVMtUG9ydC1UeXBlIiBpbnRlZ2VyLAorICAgICJTZXJ2aWNlLVR5cGUiIGludGVnZXIsCisgICAgIlRlcm1pbmF0aW9uLUNhdXNlIiBpbnRlZ2VyLAorICAgICJBY2NvdW50aW5nLUlucHV0LU9jdGV0cyIgYmlnaW50LAorICAgICJBY2NvdW50aW5nLUlucHV0LVBhY2tldHMiIGJpZ2ludCwKKyAgICAiQWNjb3VudGluZy1PdXRwdXQtT2N0ZXRzIiBiaWdpbnQsCisgICAgIkFjY291bnRpbmctT3V0cHV0LVBhY2tldHMiIGJpZ2ludCwKKyAgICAiQWNjdC1BdXRoZW50aWMiIGludGVnZXIsCisgICAgIkFjY3QtTGluay1Db3VudCIgaW50ZWdlciwKKyAgICAiQWNjdC1TZXNzaW9uLVRpbWUiIGludGVnZXIsCisgICAgIkFjY3QtVHVubmVsLUNvbm5lY3Rpb24iIGJ5dGVhLAorICAgICJBY2N0LVR1bm5lbC1QYWNrZXRzLUxvc3QiIGludGVnZXIsCisgICAgIkNhbGxiYWNrLUlkIiBieXRlYSwKKyAgICAiQ2FsbGJhY2stTnVtYmVyIiBieXRlYSwKKyAgICAiQ2FsbGVkLVN0YXRpb24tSWQiIGJ5dGVhLAorICAgICJDYWxsaW5nLVN0YXRpb24tSWQiIGJ5dGVhLAorICAgICJDb25uZWN0LUluZm8iIGJ5dGVhLAorICAgICJPcmlnaW5hdGluZy1MaW5lLUluZm8iIGJ5dGVhLAorICAgICJBdXRob3JpemF0aW9uLUxpZmV0aW1lIiBpbnRlZ2VyLAorICAgICJTZXNzaW9uLVRpbWVvdXQiIGludGVnZXIsCisgICAgIklkbGUtVGltZW91dCIgaW50ZWdlciwKKyAgICAiUG9ydC1MaW1pdCIgaW50ZWdlciwKKyAgICAiQWNjb3VudGluZy1SZWFsdGltZS1SZXF1aXJlZCIgaW50ZWdlciwKKyAgICAiQWNjdC1JbnRlcmltLUludGVydmFsIiBpbnRlZ2VyLAorICAgICJGaWx0ZXItSWQiIGJ5dGVhLAorICAgICJOQVMtRmlsdGVyLVJ1bGUiIGJ5dGVhLAorICAgICJRb1MtRmlsdGVyLVJ1bGUiIGJ5dGVhLAorICAgICJMb2dpbi1JUC1Ib3N0IiBieXRlYSwKKyAgICAiTG9naW4tSVB2Ni1Ib3N0IiBieXRlYSwKKyAgICAiTG9naW4tTEFULUdyb3VwIiBieXRlYSwKKyAgICAiTG9naW4tTEFULU5vZGUiIGJ5dGVhLAorICAgICJMb2dpbi1MQVQtUG9ydCIgYnl0ZWEsCisgICAgIkxvZ2luLUxBVC1TZXJ2aWNlIiBieXRlYSwKKyAgICAiTG9naW4tU2VydmljZSIgaW50ZWdlciwKKyAgICAiTG9naW4tVENQLVBvcnQiIGludGVnZXIsCisgICAgIlJvdXRlLVJlY29yZDEiIGJ5dGVhLAorICAgICJSb3V0ZS1SZWNvcmQyIiBieXRlYSwKKyAgICAiUm91dGUtUmVjb3JkMyIgYnl0ZWEsCisgICAgIlJvdXRlLVJlY29yZDQiIGJ5dGVhLAorICAgICJSb3V0ZS1SZWNvcmQ1IiBieXRlYSwKKyAgICAicmVjb3JkZWRfb24iIHRpbWVzdGFtcCB3aXRoIHRpbWUgem9uZSBOT1QgTlVMTCwKKyAgICAicmVjb3JkZWRfc2VydiIgYnl0ZWEKKyApOworCistLSBBcmNoaXZlcyB0YWJsZS4KKy0tICBUaGlzIGlzIGFsc28gb3B0aW9uYWwsIGFuZCBpdCBtdXN0IG1hdGNoIHRoZSBzdHJ1Y3R1cmUgb2YgeW91ciBpbmNvbWluZyB0YWJsZS4KK0NSRUFURSBUQUJMRSBhcmNoaXZlZCAoCisgICAgIk9yaWdpbi1Ib3N0IiBieXRlYSBOT1QgTlVMTCwKKyAgICAiT3JpZ2luLVJlYWxtIiBieXRlYSBOT1QgTlVMTCwKKyAgICAiRGVzdGluYXRpb24tUmVhbG0iIGJ5dGVhLAorICAgICJEZXN0aW5hdGlvbi1Ib3N0IiBieXRlYSwKKyAgICAiU2Vzc2lvbi1JZCIgYnl0ZWEgTk9UIE5VTEwsCisgICAgIk9yaWdpbi1TdGF0ZS1JZCIgaW50ZWdlciwKKyAgICAiQWNjb3VudGluZy1SZWNvcmQtVHlwZSIgaW50ZWdlciBOT1QgTlVMTCwKKyAgICAiQWNjb3VudGluZy1SZWNvcmQtTnVtYmVyIiBpbnRlZ2VyIE5PVCBOVUxMLAorICAgICJVc2VyLU5hbWUiIGJ5dGVhLAorICAgICJFdmVudC1UaW1lc3RhbXAiIGJ5dGVhLAorICAgICJBY2N0LUFwcGxpY2F0aW9uLUlkIiBpbnRlZ2VyLAorICAgICJBY2NvdW50aW5nLVN1Yi1TZXNzaW9uLUlkIiBiaWdpbnQsCisgICAgIkFjY3QtU2Vzc2lvbi1JZCIgYnl0ZWEsCisgICAgIkFjY3QtTXVsdGktU2Vzc2lvbi1JZCIgYnl0ZWEsCisgICAgIk9yaWdpbi1BQUEtUHJvdG9jb2wiIGludGVnZXIsCisgICAgIkFjY3QtRGVsYXktVGltZSIgaW50ZWdlciwKKyAgICAiTkFTLUlkZW50aWZpZXIiIGJ5dGVhLAorICAgICJOQVMtSVAtQWRkcmVzcyIgYnl0ZWEsCisgICAgIk5BUy1JUHY2LUFkZHJlc3MiIGJ5dGVhLAorICAgICJOQVMtUG9ydCIgaW50ZWdlciwKKyAgICAiTkFTLVBvcnQtSWQiIGJ5dGVhLAorICAgICJOQVMtUG9ydC1UeXBlIiBpbnRlZ2VyLAorICAgICJTZXJ2aWNlLVR5cGUiIGludGVnZXIsCisgICAgIlRlcm1pbmF0aW9uLUNhdXNlIiBpbnRlZ2VyLAorICAgICJBY2NvdW50aW5nLUlucHV0LU9jdGV0cyIgYmlnaW50LAorICAgICJBY2NvdW50aW5nLUlucHV0LVBhY2tldHMiIGJpZ2ludCwKKyAgICAiQWNjb3VudGluZy1PdXRwdXQtT2N0ZXRzIiBiaWdpbnQsCisgICAgIkFjY291bnRpbmctT3V0cHV0LVBhY2tldHMiIGJpZ2ludCwKKyAgICAiQWNjdC1BdXRoZW50aWMiIGludGVnZXIsCisgICAgIkFjY3QtTGluay1Db3VudCIgaW50ZWdlciwKKyAgICAiQWNjdC1TZXNzaW9uLVRpbWUiIGludGVnZXIsCisgICAgIkFjY3QtVHVubmVsLUNvbm5lY3Rpb24iIGJ5dGVhLAorICAgICJBY2N0LVR1bm5lbC1QYWNrZXRzLUxvc3QiIGludGVnZXIsCisgICAgIkNhbGxiYWNrLUlkIiBieXRlYSwKKyAgICAiQ2FsbGJhY2stTnVtYmVyIiBieXRlYSwKKyAgICAiQ2FsbGVkLVN0YXRpb24tSWQiIGJ5dGVhLAorICAgICJDYWxsaW5nLVN0YXRpb24tSWQiIGJ5dGVhLAorICAgICJDb25uZWN0LUluZm8iIGJ5dGVhLAorICAgICJPcmlnaW5hdGluZy1MaW5lLUluZm8iIGJ5dGVhLAorICAgICJBdXRob3JpemF0aW9uLUxpZmV0aW1lIiBpbnRlZ2VyLAorICAgICJTZXNzaW9uLVRpbWVvdXQiIGludGVnZXIsCisgICAgIklkbGUtVGltZW91dCIgaW50ZWdlciwKKyAgICAiUG9ydC1MaW1pdCIgaW50ZWdlciwKKyAgICAiQWNjb3VudGluZy1SZWFsdGltZS1SZXF1aXJlZCIgaW50ZWdlciwKKyAgICAiQWNjdC1JbnRlcmltLUludGVydmFsIiBpbnRlZ2VyLAorICAgICJGaWx0ZXItSWQiIGJ5dGVhLAorICAgICJOQVMtRmlsdGVyLVJ1bGUiIGJ5dGVhLAorICAgICJRb1MtRmlsdGVyLVJ1bGUiIGJ5dGVhLAorICAgICJMb2dpbi1JUC1Ib3N0IiBieXRlYSwKKyAgICAiTG9naW4tSVB2Ni1Ib3N0IiBieXRlYSwKKyAgICAiTG9naW4tTEFULUdyb3VwIiBieXRlYSwKKyAgICAiTG9naW4tTEFULU5vZGUiIGJ5dGVhLAorICAgICJMb2dpbi1MQVQtUG9ydCIgYnl0ZWEsCisgICAgIkxvZ2luLUxBVC1TZXJ2aWNlIiBieXRlYSwKKyAgICAiTG9naW4tU2VydmljZSIgaW50ZWdlciwKKyAgICAiTG9naW4tVENQLVBvcnQiIGludGVnZXIsCisgICAgIlJvdXRlLVJlY29yZDEiIGJ5dGVhLAorICAgICJSb3V0ZS1SZWNvcmQyIiBieXRlYSwKKyAgICAiUm91dGUtUmVjb3JkMyIgYnl0ZWEsCisgICAgIlJvdXRlLVJlY29yZDQiIGJ5dGVhLAorICAgICJSb3V0ZS1SZWNvcmQ1IiBieXRlYSwKKyAgICAicmVjb3JkZWRfb24iIHRpbWVzdGFtcCB3aXRoIHRpbWUgem9uZSBOT1QgTlVMTCwKKyAgICAicmVjb3JkZWRfc2VydiIgYnl0ZWEKKyApOworCmRpZmYgLS1naXQgYS9jb250cmliL2FwcF9hY2N0X3Rvb2xzL2Rpc3BsYXlfcmVzdWx0cy5waHAgYi9jb250cmliL2FwcF9hY2N0X3Rvb2xzL2Rpc3BsYXlfcmVzdWx0cy5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg0ZDNkMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvYXBwX2FjY3RfdG9vbHMvZGlzcGxheV9yZXN1bHRzLnBocApAQCAtMCwwICsxLDE0MSBAQAorPD9waHAKKworIyBUaGUgY29weXJpZ2h0IG9mIHRoaXMgZmlsZSBpcyB0aGUgc2FtZSBhcyB0aGUgZnJlZURpYW1ldGVyIHByb2plY3QuIExpY2VuY2UgaXMgQlNELgorCisjIFRoaXMgZmlsZSBzaG91bGQgbm8gYmUgY2FsbGVkIGRpcmVjdGx5OyAKKyMgaW5zdGVhZCBpdCBzaG91bGQgYmUgaW5jbHVkZWQgZnJvbSBhbm90aGVyIHNjcmlwdCB0aGF0IHNldHMgaXRzIHBhcmFtZXRlcnMgYXMgZGVzY3JpYmVkIGJlbG93LgorCisjIyAkVVNFUlMgIAorIyBBbiBhcnJheSBvZiB0aGUgdXNlciBuYW1lcyB0byBkaXNwbGF5OyB0aGUgZW1wdHkgYXJyYXkgd2lsbCBkaXNwbGF5IGFsbCB1c2Vycy4KKyMgVGhpcyBwYXJhbWV0ZXIgTVVTVCBiZSBzZXQuCitpZiAoIWlzc2V0KCRVU0VSUykpCisJZGllKCdEbyBub3QgY2FsbCB0aGlzIGZpbGUgZGlyZWN0bHknKTsKKworIyMgJFNUQVJUX1RJTUU6CisjIElmIHNldCwgdGhpcyByZXN0cmljdHMgdGhlIGRpc3BsYXllZCBkYXRhIHRvIHNlc3Npb25zIHN0YXJ0aW5nIGFmdGVyICRTVEFSVAorCisjIyAkRU5EX1RJTUU6CisjIElmIHNldCwgdGhpcyByZXN0cmljdHMgdGhlIGRpc3BsYXllZCBkYXRhIHRvIHNlc3Npb25zIHN0YXJ0aW5nIGJlZm9yZSAkRU5ECisKKyMjICRMSU1JVDoKKyMjICRMSU1JVF9PRkZTRVQ6CisjIElmIHNldCwgdGhlc2UgbGltaXQgdGhlIG51bWJlciBvZiBhY2NvdW50aW5nIHJlY29yZHMgZGlzcGxheWVkIChmb3IgcGFnaW5hdGlvbiBwdXJwb3NlKQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIERBVEFCQVNFOgorCisvKiBUaGUgQ29ubmVjdGlvbiBTdHJpbmcgdXNlZCB0byBhY2Nlc3MgdGhhdCBkYXRhYmFzZToKKyAgRXhhbXBsZTogImhvc3Q9bG9jYWxob3N0IGRibmFtZT1hcHBfYWNjdCB1c2VyPWZyZWVkaWFtZXRlciBwYXNzd29yZD1mb28iICovCiskQ09OTlNUUj0iIjsgCisKKy8qIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSBjb250YWluaW5nIHRoZSBwcm9jZXNzZWQgZGF0YSAoZnJvbSBwcm9jZXNzX3JlY29yZHMucGhwIHNjcmlwdCkgKi8KKyRQUk9DRVNTRUQ9InByb2Nlc3NlZCI7CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisvKiBDb25uZWN0IHRvIHRoZSBkYXRhYmFzZSAqLworJGRiY29ubiA9IHBnX2Nvbm5lY3QoJENPTk5TVFIpCisgICAgb3IgZGllKCdDb3VsZCBub3QgY29ubmVjdDogJyAuIHBnX2xhc3RfZXJyb3IoKSAuICJcbiIpOworICAgIAorLyogRnVuY3Rpb24gdG8gZm9ybWF0IGRvd25sb2FkIHNpemUgKGZyb20gcGhwLm5ldCkgKi8KK2Z1bmN0aW9uIGh1bWFuX3JlYWRhYmxlKCAkc2l6ZSApCit7CisgICAkY291bnQgPSAwOworICAgJGZvcm1hdCA9IGFycmF5KCJCIiwiS0IiLCJNQiIsIkdCIiwiVEIiLCJQQiIsIkVCIiwiWkIiLCJZQiIpOworICAgd2hpbGUoKCRzaXplLzEwMjQpPjEgJiYgJGNvdW50PDgpCisgICB7CisgICAgICAgJHNpemU9JHNpemUvMTAyNDsKKyAgICAgICAkY291bnQrKzsKKyAgIH0KKyAgIGlmKCAkc2l6ZSA+PSAxMDAgKSAkZGVjaW1hbHMgPSAwOworICAgZWxzZWlmICgkc2l6ZSA+PSAxMCApICRkZWNpbWFscyA9IDE7CisgICBlbHNlICAkZGVjaW1hbHMgPSAyOworICAgJHJldHVybiA9IG51bWJlcl9mb3JtYXQoJHNpemUsJGRlY2ltYWxzLCcuJywnICcpLiIgIi4kZm9ybWF0WyRjb3VudF07CisgICByZXR1cm4gJHJldHVybjsKK30KKyAgICAKKy8qIEJ1aWxkIHRoZSBTUUwgcXVlcnkgKi8KKyRzcWwgPSAnU0VMRUNUICosIHRvX2NoYXIoc2Vzc19zdGFydCwgXCdZWVlZLU1NLUREJm5ic3A7SEgyNDpNSTpTUyZuYnNwOyhUWilcJykgYXMgZm10X3Nlc3Nfc3RhcnQgRlJPTSAiJy4kUFJPQ0VTU0VELiciJzsKKyR3aGVyZT0wOworaWYgKCRVU0VSUykgeworCSRVU0VSUyA9IGFycmF5X21hcChwZ19lc2NhcGVfYnl0ZWEsICRVU0VSUyk7CisJJHNxbCAuPSAiIFdIRVJFIHVzZXJfbmFtZSBJTiAoJyIuIGpvaW4oIicsICciLCBhcnJheV92YWx1ZXMoJFVTRVJTKSkuIicpICI7CisJJHdoZXJlID0gMTsKK30KKworaWYgKCRTVEFSVF9USU1FKSB7CisJJFNUQVJUX1RJTUUgPSBwZ19lc2NhcGVfc3RyaW5nKCRTVEFSVF9USU1FKTsKKwlpZiAoJHdoZXJlKyspCisJCSRzcWwgLj0gIiBBTkQgIjsKKwllbHNlCisJCSRzcWwgLj0gIiBXSEVSRSAiOworCSRzcWwgLj0gInNlc3Nfc3RhcnQgPj0gJyIuJFNUQVJUX1RJTUUuIiciOworfQoraWYgKCRFTkRfVElNRSkgeworCSRFTkRfVElNRSA9IHBnX2VzY2FwZV9zdHJpbmcoJEVORF9USU1FKTsKKwlpZiAoJHdoZXJlKyspCisJCSRzcWwgLj0gIiBBTkQgIjsKKwllbHNlCisJCSRzcWwgLj0gIiBXSEVSRSAiOworCSRzcWwgLj0gInNlc3Nfc3RhcnQgPD0gJyIuJEVORF9USU1FLiInIjsKK30KKworJHNxbCAuPSAiIE9SREVSIEJZIHNlc3Nfc3RhcnQsIHNlc3NfZHVyYXRpb24iOworCitpZiAoJExJTUlUKQorCSRzcWwgLj0gIiBMSU1JVCAkTElNSVQiOworaWYgKCRMSU1JVF9PRkZTRVQpCisJJHNxbCAuPSAiIE9GRlNFVCAkTElNSVRfT0ZGU0VUIjsKKworLyogRXhlY3V0ZSB0aGUgcXVlcnkgKi8KKyRyZXN1bHQgPSBwZ19xdWVyeSgkZGJjb25uLCAkc3FsKSBvciBkaWUoJ1F1ZXJ5IGZhaWxlZDogJyAuIHBnX2xhc3RfZXJyb3IoKSAuICJcbiIpOworJHJlY3MgPSBwZ19udW1fcm93cygkcmVzdWx0KTsKK2lmICgkcmVjcyA9PSAwKSB7CisJZWNobyAiPHA+PGVtPlNvcnJ5LCBubyBkYXRhIGlzIGF2YWlsYWJsZSBpbiB0aGlzIHNlbGVjdGlvbi48L2VtPjwvcD5cbiI7Cit9IGVsc2UgeworCWVjaG8gIjxwPjxzdHJvbmc+JHJlY3M8L3N0cm9uZz4gcmVjb3JkcyBmb3VuZC48L3A+XG4iOworPz4KKyAgPHRhYmxlPgorICAgIDx0cj4KKyAgICAgIDx0aD5EZXZpY2UgaWRlbnRpZmllcjwvdGg+CisgICAgICA8dGg+QWNjZXNzIERldmljZSBpbmZvcm1hdGlvbjwvdGg+CisgICAgICA8dGg+U2Vzc2lvbiBzdGFydGVkIG9uPC90aD4KKyAgICAgIDx0aD5EdXJhdGlvbjwvdGg+CisgICAgICA8dGg+RG93bmxvYWRlZDwvdGg+CisgICAgICA8dGg+VXBsb2FkZWQ8L3RoPgorICAgIDwvdHI+Cis8P3BocAorCXdoaWxlICgkcmVjb3JkID0gcGdfZmV0Y2hfYXJyYXkoJHJlc3VsdCwgbnVsbCwgUEdTUUxfQVNTT0MpKSB7CisJCWVjaG8gIiAgICA8dHIgdGl0bGU9JyIuaHRtbGVudGl0aWVzKHBnX3VuZXNjYXBlX2J5dGVhKCRyZWNvcmRbInVzZXJfbmFtZSJdKSkuIic+XG4iOworCQllY2hvICIgICAgICA8dGQ+IjsKKwkJZWNobyBodG1sZW50aXRpZXMocGdfdW5lc2NhcGVfYnl0ZWEoJHJlY29yZFsidXNlcl9kZXZpY2UiXSkpOworCQllY2hvICI8L3RkPlxuIjsKKwkJZWNobyAiICAgICAgPHRkPiI7CisJCWVjaG8gaHRtbGVudGl0aWVzKHBnX3VuZXNjYXBlX2J5dGVhKCRyZWNvcmRbIm5hc19pbmZvIl0pKTsKKwkJZWNobyAiPC90ZD5cbiI7CisJCWVjaG8gIiAgICAgIDx0ZD4iOworCQllY2hvICRyZWNvcmRbImZtdF9zZXNzX3N0YXJ0Il07CisJCWVjaG8gIjwvdGQ+XG4iOworCQllY2hvICIgICAgICA8dGQ+IjsKKwkJZWNobyBodG1sZW50aXRpZXMoJHJlY29yZFsic2Vzc19kdXJhdGlvbiJdKTsKKwkJZWNobyAiPC90ZD5cbiI7CisJCWVjaG8gIiAgICAgIDx0ZD4iOworCQllY2hvIGh1bWFuX3JlYWRhYmxlKCAkcmVjb3JkWyJkb3dubF9ieXRlcyJdICkuIiAoIi4kcmVjb3JkWyJkb3dubF9wYWNrZXRzIl0uInBja3RzKSI7CisJCWVjaG8gIjwvdGQ+XG4iOworCQllY2hvICIgICAgICA8dGQ+IjsKKwkJZWNobyBodW1hbl9yZWFkYWJsZSggJHJlY29yZFsidXBsX2J5dGVzIl0gKS4iICgiLiRyZWNvcmRbInVwbF9wYWNrZXRzIl0uInBja3RzKSI7CisJCWVjaG8gIjwvdGQ+XG4iOworCQllY2hvICIgICAgPC90cj5cbiI7CisJCisJfQorfQorcGdfZnJlZV9yZXN1bHQoJHJlc3VsdCk7CisKKworLyogQ2xvc2luZyBjb25uZWN0aW9uICovCitwZ19jbG9zZSgkZGJjb25uKTsKKworCisKKz8+CmRpZmYgLS1naXQgYS9jb250cmliL2FwcF9hY2N0X3Rvb2xzL2Rpc3BsYXlfc2VsZi5waHAgYi9jb250cmliL2FwcF9hY2N0X3Rvb2xzL2Rpc3BsYXlfc2VsZi5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA2Y2IwYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvYXBwX2FjY3RfdG9vbHMvZGlzcGxheV9zZWxmLnBocApAQCAtMCwwICsxLDEzOSBAQAorPD9waHAKKworIyBUaGlzIGZpbGUgaXMgYW4gZXhhbXBsZSB3cmFwcGVyIGFyb3VuZCBkaXNwbGF5X3Jlc3VsdHMucGhwLgorCisjIEl0IHJlbGllcyBvbiBjbGllbnRzIGF1dGhlbnRpY2F0aW9uIGJhc2VkIG9uIGNlcnRpZmljYXRlIHVzYWdlIAorIyAoaXQgbXVzdCBiZSB0aGUgc2FtZSBjZXJ0aWZpY2F0ZSBhcyB1c2VkIGR1cmluZyBBQUEgYWNjZXNzLCBzbyB0aGF0IHRoZSBVc2VyLU5hbWUgbWF0Y2hlcykuCisjIFNlZSB5b3VyIHdlYiBzZXJ2ZXIgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscy4KKyMgRXhhbXBsZSBmb3IgYXBhY2hlMjoKKyMgICgrIGRldGFpbCBpbiBodHRwOi8vaHR0cGQuYXBhY2hlLm9yZy9kb2NzLzIuMC9zc2wvc3NsX2hvd3RvLmh0bWwjYWxsY2xpZW50cyApCisjIC0gaW4gdmhvc3QgZGVmaW5pdGlvbiBmaWxlLCByZWZlbmNlIHRoZSBDQSBjaGFpbiBvZiB5b3VyIHVzZXJzIGNlcnRpZmljYXRlczoKKyMgIFNTTENBQ2VydGlmaWNhdGVGaWxlIC92YXIvd3d3L2NvbmYvc3NsLmNydC9jYS5jcnQKKyMgLSBpbiB2aG9zdCBmaWxlIG9yIC5odGFjY2VzcyBmaWxlIChhZGp1c3QgRGVwdGggdG8geW91ciBzZXR1cCk6CisjICA8SWZNb2R1bGUgbW9kX3NzbC5jPgorIyAgU1NMVmVyaWZ5Q2xpZW50IHJlcXVpcmUKKyMgIFNTTFZlcmlmeURlcHRoIDIKKyMgIDwvSWZNb2R1bGU+CisKKy8qIENoZWNrIHRoZSBjbGllbnQgaXMgY29ycmVjdGx5IFNTTCBhdXRoZW50aWNhdGVkIHdpdGggaGlzIHNlcnZlciAqLworaWYgKCFpc3NldCgkX1NFUlZFUlsiU1NMX0NMSUVOVF9WRVJJRlkiXSkgfHwgJF9TRVJWRVJbIlNTTF9DTElFTlRfVkVSSUZZIl0gIT0gIlNVQ0NFU1MiKQorCWRpZSgiU1NMIGF1dGhlbnRpY2F0aW9uIGZhaWxlZCwgdGhlIHdlYnNlcnZlciBpcyBwcm9iYWJseSBub3QgY29uZmlndXJlZCBjb3JyZWN0bHkuXG4iKTsKKwkKKy8qIEZvcmNlIHNvbWUgcGFyYW1ldGVycyB0byBpbnRlZ2VyIHZhbHVlcyAqLworaWYgKCRfR0VUWyJ0X2xpbWl0Il0pCisJJF9HRVRbInRfbGltaXQiXSA9IChpbnQpICRfR0VUWyJ0X2xpbWl0Il07CitpZiAoJF9HRVRbInRfb2Zmc2V0Il0pCisJJF9HRVRbInRfb2Zmc2V0Il0gPSAoaW50KSAkX0dFVFsidF9vZmZzZXQiXTsKKwkKKy8qIERlZmF1bHQgZm9ybSB2YWx1ZXMgKi8KK2lmICghaXNzZXQoJF9HRVRbIlN1Ym1pdCJdKSkgeworCSRfR0VUWyJ0X2xpbWl0Il0gPSA1MDsKKwkkX0dFVFsiY19saW1pdCJdID0gMTsKKwkkX0dFVFsidF9vZmZzZXQiXSA9IDA7Cit9CisKKy8qIE91dHB1dCB0aGUgZm9ybSAqLworPz4KKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L3N0cmljdC5kdGQiPgorPGh0bWwgbGFuZz0iZW4tVVMiPgorPGhlYWQ+CisgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgorCisgICAgPHRpdGxlPkFjY291bnRpbmcgRGF0YTwvdGl0bGU+CisgICAgPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlRoaXMgcGFnZSBnaXZlcyB5b3UgYWNjZXNzIHRvIHlvdXIgcGVyc29uYWwgYWNjb3VudGluZyBkYXRhLiI+CisgICAgPG1ldGEgbmFtZT0ia2V5d29yZHMiIGNvbnRlbnQ9ImFjY291bnRpbmciPgorCisgICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KKyAgICAgICAgYm9keSB7IHRleHQtYWxpZ246Y2VudGVyOyB9CisJdGFibGUgeyBib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7IG1hcmdpbi1sZWZ0OmF1dG87IG1hcmdpbi1yaWdodDphdXRvOyB9CisJdGFibGUsIHRkLCB0aCB7IGJvcmRlcjoxcHggc29saWQgZ3JlZW47IHBhZGRpbmctbGVmdDouNWVtOyBwYWRkaW5nLXJpZ2h0Oi41ZW07fQorCXRoIHsgYmFja2dyb3VuZC1jb2xvcjpncmVlbjsgY29sb3I6d2hpdGU7IH0KKyAgICA8L3N0eWxlPgorPC9oZWFkPgorCis8Ym9keSA+CisgPGgxPkFjY291bnRpbmcgZGF0YTwvaDE+CisgIDxwPk5vdGUgd2VsbDogdGhpcyBwYWdlIGRpc3BsYXlzIG9ubHkgZGF0YSBhYm91dCA8ZW0+dGVybWluYXRlZDwvZW0+IHNlc3Npb25zLjwvcD4KKyAgPGZvcm0gbWV0aG9kPSJHRVQiPgorICA8dGFibGU+CisgICAgPHRyPgorICAgICAgPHRoIGNvbHNwYW49IjMiPgorICAgICAgICBGaWx0ZXJpbmcgcGFyYW1ldGVycworICAgICAgPC90aD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImNfc3RhcnR0aW1lIjw/cGhwIGlmIChpc3NldCgkX0dFVFsiY19zdGFydHRpbWUiXSkpIGVjaG8gIiBjaGVja2VkIjsgPz4+PC90ZD4KKyAgICAgIDx0ZD5TaG93IG9ubHkgc2Vzc2lvbnMgc3RhcnRpbmcgZnJvbSAoPGEgaHJlZj0iaHR0cDovL3d3dy5wb3N0Z3Jlc3FsLm9yZy9kb2NzLzguNC9zdGF0aWMvZGF0YXR5cGUtZGF0ZXRpbWUuaHRtbCI+WVlZWS1NTS1ERCBISDpNTTpTUzwvYT4pOjwvdGQ+CisgICAgICA8dGQ+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9InRfc3RhcnR0aW1lIjw/cGhwIGlmIChpc3NldCgkX0dFVFsidF9zdGFydHRpbWUiXSkpIGVjaG8gJ3ZhbHVlPSInLiRfR0VUWyJ0X3N0YXJ0dGltZSJdLiciJzsgPz4+PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImNfZW5kdGltZSI8P3BocCBpZiAoaXNzZXQoJF9HRVRbImNfZW5kdGltZSJdKSkgZWNobyAiIGNoZWNrZWQiOyA/Pj48L3RkPgorICAgICAgPHRkPlNob3cgb25seSBzZXNzaW9ucyBzdGFydGluZyB1bnRpbCAoPGEgaHJlZj0iaHR0cDovL3d3dy5wb3N0Z3Jlc3FsLm9yZy9kb2NzLzguNC9zdGF0aWMvZGF0YXR5cGUtZGF0ZXRpbWUuaHRtbCI+WVlZWS1NTS1ERCBISDpNTTpTUzwvYT4pOjwvdGQ+CisgICAgICA8dGQ+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9InRfZW5kdGltZSI8P3BocCBpZiAoaXNzZXQoJF9HRVRbInRfZW5kdGltZSJdKSkgZWNobyAndmFsdWU9IicuJF9HRVRbInRfZW5kdGltZSJdLiciJzsgPz4+PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImNfbGltaXQiPD9waHAgaWYgKGlzc2V0KCRfR0VUWyJjX2xpbWl0Il0pKSBlY2hvICIgY2hlY2tlZCI7ID8+PjwvdGQ+CisgICAgICA8dGQ+U2hvdyBvbmx5IHRoaXMgbnVtYmVyIG9mIHJlY29yZHM6PC90ZD4KKyAgICAgIDx0ZD48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0idF9saW1pdCI8P3BocCBpZiAoaXNzZXQoJF9HRVRbInRfbGltaXQiXSkpIGVjaG8gJ3ZhbHVlPSInLiRfR0VUWyJ0X2xpbWl0Il0uJyInOyA/Pj48L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iY19vZmZzZXQiPD9waHAgaWYgKGlzc2V0KCRfR0VUWyJjX29mZnNldCJdKSkgZWNobyAiIGNoZWNrZWQiOyA/Pj48L3RkPgorICAgICAgPHRkPlN0YXJ0aW5nIGZyb20gcmVjb3JkOjwvdGQ+CisgICAgICA8dGQ+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9InRfb2Zmc2V0Ijw/cGhwIGlmIChpc3NldCgkX0dFVFsidF9vZmZzZXQiXSkpIGVjaG8gJ3ZhbHVlPSInLiRfR0VUWyJ0X29mZnNldCJdLiciJzsgPz4+PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0aCBjb2xzcGFuPSIzIj4KKyAgICAgICAgQXBwbHkgdGhpcyBmaWx0ZXI6IDxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9IlN1Ym1pdCI+CisgICAgICA8L3RoPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisgIDwvZm9ybT4KKyAgCis8cD4KKyAgIEN1cnJlbnRseSBkaXNwbGF5aW5nIHVzZXIgPGVtPjw/cGhwIGVjaG8gaHRtbGVudGl0aWVzKCRfU0VSVkVSWyJTU0xfQ0xJRU5UX1NfRE5fQ04iXSk7ID8+PC9lbT48P3BocAorCisvKiBTZWFyY2ggdXNlciBieSBDTiBvciBFbWFpbCBzaW5jZSBzb21lIE9TIHVzZSB0aGUgbGF0ZXIgZHVyaW5nIEVBUC1UTFMgYXV0aGVudGljYXRpb24gKi8KKyRVU0VSUyA9IGFycmF5KCRfU0VSVkVSWyJTU0xfQ0xJRU5UX1NfRE5fQ04iXSwgJF9TRVJWRVJbIlNTTF9DTElFTlRfU19ETl9FbWFpbCJdKTsKKworLyogSWYgdGhlIHN0YXJ0IHRpbWUgYm91bmRhcnkgd2FzIHNwZWNpZmllZC4uLiAqLworaWYgKCRfR0VUWyJjX3N0YXJ0dGltZSJdICYmICRfR0VUWyJ0X3N0YXJ0dGltZSJdKSB7CisJJFNUQVJUX1RJTUU9JF9HRVRbInRfc3RhcnR0aW1lIl07Cit9CitpZiAoJF9HRVRbImNfZW5kdGltZSJdICYmICRfR0VUWyJ0X2VuZHRpbWUiXSkgeworCSRFTkRfVElNRT0kX0dFVFsidF9lbmR0aW1lIl07Cit9CisKKy8qIGlkZW0gd2l0aCBlbmQgdGltZSAqLworaWYgKCRTVEFSVF9USU1FICYmICRFTkRfVElNRSkgeworCWVjaG8gIiwgc2Vzc2lvbnMgc3RhcnRpbmcgYmV0d2VlbiAkU1RBUlRfVElNRSBhbmQgJEVORF9USU1FIjsKK30gZWxzZWlmICgkU1RBUlRfVElNRSkgeworCWVjaG8gIiwgc2Vzc2lvbnMgc3RhcnRpbmcgYWZ0ZXIgJFNUQVJUX1RJTUUiOworfSBlbHNlaWYgKCRFTkRfVElNRSkgeworCWVjaG8gIiwgc2Vzc2lvbnMgc3RhcnRpbmcgYmVmb3JlICRFTkRfVElNRSI7Cit9CisKKy8qIFBhZ2luYXRpb24gKi8KK2lmICgkX0dFVFsiY19saW1pdCJdICYmICRfR0VUWyJ0X2xpbWl0Il0pIHsKKwkkTElNSVQ9JF9HRVRbInRfbGltaXQiXTsKK30KK2lmICgkX0dFVFsiY19vZmZzZXQiXSAmJiAkX0dFVFsidF9vZmZzZXQiXSkgeworCSRMSU1JVF9PRkZTRVQ9JF9HRVRbInRfb2Zmc2V0Il07Cit9CitpZiAoJExJTUlUKSB7CisJZWNobyAiLCBsaW1pdGVkIHRvICIuJExJTUlULiIgcmVjb3JkcyI7CisJaWYgKCRMSU1JVF9PRkZTRVQpCisJCWVjaG8gIiBzdGFydGluZyBhdCAiLiRMSU1JVF9PRkZTRVQ7Cit9IGVsc2UgaWYgKCRMSU1JVF9PRkZTRVQpIHsKKwllY2hvICIgc3RhcnRpbmcgYXQgcmVjb3JkICIuJExJTUlUX09GRlNFVDsKK30KK2VjaG8gIi5cbiI7Cis/PgorPC9wPgorCis8P3BocAorLyogVGhpcyBmaWxlIHdpbGwgZ2VuZXJhdGUgdGhlIGFycmF5IG9mIGRhdGEgbWF0Y2hpbmcgdGhlIHNlbGVjdGlvbiAqLworcmVxdWlyZSgiZGlzcGxheV9yZXN1bHRzLnBocCIpOworCis/PgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvY29udHJpYi9hcHBfYWNjdF90b29scy9kaXNwbGF5X3N0YXRzLnBocCBiL2NvbnRyaWIvYXBwX2FjY3RfdG9vbHMvZGlzcGxheV9zdGF0cy5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFiZWIxMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvYXBwX2FjY3RfdG9vbHMvZGlzcGxheV9zdGF0cy5waHAKQEAgLTAsMCArMSwyNjkgQEAKKzw/cGhwCisKKyMgVGhlIGNvcHlyaWdodCBvZiB0aGlzIGZpbGUgaXMgdGhlIHNhbWUgYXMgdGhlIGZyZWVEaWFtZXRlciBwcm9qZWN0LiBMaWNlbmNlIGlzIEJTRC4KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBEQVRBQkFTRToKKworLyogVGhlIENvbm5lY3Rpb24gU3RyaW5nIHVzZWQgdG8gYWNjZXNzIHRoYXQgZGF0YWJhc2U6CisgIEV4YW1wbGU6ICJob3N0PWxvY2FsaG9zdCBkYm5hbWU9YXBwX2FjY3QgdXNlcj1mcmVlZGlhbWV0ZXIgcGFzc3dvcmQ9Zm9vIiAqLworJENPTk5TVFI9IiI7IAorCisvKiBUaGUgbmFtZSBvZiB0aGUgdGFibGUgY29udGFpbmluZyB0aGUgcHJvY2Vzc2VkIGRhdGEgKGZyb20gcHJvY2Vzc19yZWNvcmRzLnBocCBzY3JpcHQpICovCiskUFJPQ0VTU0VEPSJwcm9jZXNzZWQiOworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz8+Cis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9zdHJpY3QuZHRkIj4KKzxodG1sIGxhbmc9ImVuLVVTIj4KKzxoZWFkPgorICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4KKworICAgIDx0aXRsZT5BY2NvdW50aW5nIERhdGE8L3RpdGxlPgorICAgIDxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJUaGlzIHBhZ2UgZ2l2ZXMgeW91IGFjY2VzcyB0byB5b3VyIHBlcnNvbmFsIGFjY291bnRpbmcgZGF0YS4iPgorICAgIDxtZXRhIG5hbWU9ImtleXdvcmRzIiBjb250ZW50PSJhY2NvdW50aW5nIj4KKworICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CisgICAgICAgIGJvZHkgeyB0ZXh0LWFsaWduOmNlbnRlcjsgfQorCXRhYmxlLmNvbG9yZWQgeyBib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7IG1hcmdpbi1sZWZ0OmF1dG87IG1hcmdpbi1yaWdodDphdXRvOyB9CisJdGFibGUuY29sb3JlZCB0ZCwgdGFibGUuY29sb3JlZCB0aCB7IGJvcmRlcjoxcHggc29saWQgZ3JlZW47IHBhZGRpbmctbGVmdDouNWVtOyBwYWRkaW5nLXJpZ2h0Oi41ZW07fQorCS5jb2xvcmVkIHRoIHsgYmFja2dyb3VuZC1jb2xvcjpncmVlbjsgY29sb3I6d2hpdGU7IH0KKwlociB7IHdpZHRoOjE1cHg7IG1hcmdpbi10b3A6MmVtO21hcmdpbi1ib3R0b206MmVtOyB9CisgICAgPC9zdHlsZT4KKzwvaGVhZD4KKworPGJvZHkgPgorIDxoMT5TdGF0aXN0aWNhbCBhY2NvdW50aW5nIGRhdGE8L2gxPgorICA8Zm9ybSBtZXRob2Q9IkdFVCI+CisgIDx0YWJsZSBjbGFzcz0iY29sb3JlZCI+CisgICAgPHRyPgorICAgICAgPHRoIGNvbHNwYW49IjMiPgorICAgICAgICBGaWx0ZXJpbmcgb3B0aW9ucworICAgICAgPC90aD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImNfc3RhcnR0aW1lIjw/cGhwIGlmIChpc3NldCgkX0dFVFsiY19zdGFydHRpbWUiXSkpIGVjaG8gIiBjaGVja2VkIjsgPz4+PC90ZD4KKyAgICAgIDx0ZD5MaW1pdCB0byBzZXNzaW9ucyBzdGFydGluZyBmcm9tICg8YSBocmVmPSJodHRwOi8vd3d3LnBvc3RncmVzcWwub3JnL2RvY3MvOC40L3N0YXRpYy9kYXRhdHlwZS1kYXRldGltZS5odG1sIj5oaW50PC9hPik6PC90ZD4KKyAgICAgIDx0ZD48aW5wdXQgdHlwZT0idGV4dCIgdGl0bGU9IllZWVktTU0tREQgSEg6TU06U1MiIG5hbWU9InRfc3RhcnR0aW1lIjw/cGhwIGlmIChpc3NldCgkX0dFVFsidF9zdGFydHRpbWUiXSkpIGVjaG8gJ3ZhbHVlPSInLiRfR0VUWyJ0X3N0YXJ0dGltZSJdLiciJzsgPz4+PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImNfZW5kdGltZSI8P3BocCBpZiAoaXNzZXQoJF9HRVRbImNfZW5kdGltZSJdKSkgZWNobyAiIGNoZWNrZWQiOyA/Pj48L3RkPgorICAgICAgPHRkPkxpbWl0IHRvIHNlc3Npb25zIHN0YXJ0aW5nIHVudGlsICg8YSBocmVmPSJodHRwOi8vd3d3LnBvc3RncmVzcWwub3JnL2RvY3MvOC40L3N0YXRpYy9kYXRhdHlwZS1kYXRldGltZS5odG1sIj5oaW50PC9hPik6PC90ZD4KKyAgICAgIDx0ZD48aW5wdXQgdHlwZT0idGV4dCIgdGl0bGU9IllZWVktTU0tREQgSEg6TU06U1MiIG5hbWU9InRfZW5kdGltZSI8P3BocCBpZiAoaXNzZXQoJF9HRVRbInRfZW5kdGltZSJdKSkgZWNobyAndmFsdWU9IicuJF9HRVRbInRfZW5kdGltZSJdLiciJzsgPz4+PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0aCBjb2xzcGFuPSIzIj4KKyAgICAgICAgQXBwbHkgdGhpcyBmaWx0ZXI6IDxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9IlN1Ym1pdCI+CisgICAgICA8L3RoPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisgIDwvZm9ybT4KKyAgPHA+Tm90ZSB3ZWxsOiB0aGlzIHBhZ2UgZGlzcGxheXMgb25seSBkYXRhIGFib3V0IDxlbT50ZXJtaW5hdGVkPC9lbT4gc2Vzc2lvbnMuPC9wPgorPD9waHAKKworLyogQ29ubmVjdCB0byB0aGUgZGF0YWJhc2UgKi8KKyRkYmNvbm4gPSBwZ19jb25uZWN0KCRDT05OU1RSKQorICAgIG9yIGRpZSgnQ291bGQgbm90IGNvbm5lY3Q6ICcgLiBwZ19sYXN0X2Vycm9yKCkgLiAiXG4iKTsKKyAgICAKK2lmICgkX0dFVFsiY19zdGFydHRpbWUiXSAmJiAkX0dFVFsidF9zdGFydHRpbWUiXSkgeworCSRTVEFSVF9USU1FPSRfR0VUWyJ0X3N0YXJ0dGltZSJdOworfQoraWYgKCRfR0VUWyJjX2VuZHRpbWUiXSAmJiAkX0dFVFsidF9lbmR0aW1lIl0pIHsKKwkkRU5EX1RJTUU9JF9HRVRbInRfZW5kdGltZSJdOworfQorJHNxbF9jb25kPSIiOworaWYgKCRTVEFSVF9USU1FKSB7CisJJHNxbF9jb25kID0gInNlc3Nfc3RhcnQgPj0gJyIucGdfZXNjYXBlX3N0cmluZygkU1RBUlRfVElNRSkuIiciOworfQoraWYgKCRFTkRfVElNRSkgeworCWlmICgkc3FsX2NvbmQpCisJCSRzcWxfY29uZCAuPSAiIEFORCAiOworCSRzcWxfY29uZCAuPSAic2Vzc19zdGFydCA9PCAnIi5wZ19lc2NhcGVfc3RyaW5nKCRFTkRfVElNRSkuIiciOworfQorCisKKy8qIEZ1bmN0aW9uIHRvIGZvcm1hdCBkb3dubG9hZCBzaXplIChmcm9tIHBocC5uZXQpICovCitmdW5jdGlvbiBodW1hbl9yZWFkYWJsZSggJHNpemUgKQoreworICAgJGNvdW50ID0gMDsKKyAgICRmb3JtYXQgPSBhcnJheSgiQiIsIktCIiwiTUIiLCJHQiIsIlRCIiwiUEIiLCJFQiIsIlpCIiwiWUIiKTsKKyAgIHdoaWxlKCgkc2l6ZS8xMDI0KT4xICYmICRjb3VudDw4KQorICAgeworICAgICAgICRzaXplPSRzaXplLzEwMjQ7CisgICAgICAgJGNvdW50Kys7CisgICB9CisgICBpZiggJHNpemUgPj0gMTAwICkgJGRlY2ltYWxzID0gMDsKKyAgIGVsc2VpZiAoJHNpemUgPj0gMTAgKSAkZGVjaW1hbHMgPSAxOworICAgZWxzZSAgJGRlY2ltYWxzID0gMjsKKyAgICRyZXR1cm4gPSBudW1iZXJfZm9ybWF0KCRzaXplLCRkZWNpbWFscywnLicsJyAnKS4iICIuJGZvcm1hdFskY291bnRdOworICAgcmV0dXJuICRyZXR1cm47Cit9CisKKz8+CisgIAorICA8aHIgLz4KKyAgCis8P3BocAorICAgIAorLyogRmlyc3QgcXVlcnk6IGdsb2JhbCBkYXRhICovCiskc3FsID0gJ1NFTEVDVCBTVU0oZG93bmxfYnl0ZXMpIGFzIHRvdGFsX2Rvd24sIFNVTSh1cGxfYnl0ZXMpIGFzIHRvdGFsX3VwLCc7Ciskc3FsIC49ICcgdG9fY2hhcihtaW4oc2Vzc19zdGFydCksIFwnWVlZWS1NTS1ERCZuYnNwO0hIMjQ6TUk6U1MmbmJzcDtUWlwnKSBhcyBmaXJzdF9zZXNzLCc7Ciskc3FsIC49ICcgdG9fY2hhcihtYXgoc2Vzc19zdGFydCksIFwnWVlZWS1NTS1ERCZuYnNwO0hIMjQ6TUk6U1MmbmJzcDtUWlwnKSBhcyBsYXN0X3Nlc3MsJzsKKyRzcWwgLj0gJyBjb3VudChkaXN0aW5jdCB1c2VyX25hbWUpIGFzIG5iX3VzZXJzLCc7Ciskc3FsIC49ICcgY291bnQoZGlzdGluY3QgbmFzX2luZm8pIGFzIG5iX2FwJzsKKyRzcWwgLj0gJyBGUk9NICInLiRQUk9DRVNTRUQuJyInOworaWYgKCRzcWxfY29uZCkKKwkkc3FsIC49ICcgV0hFUkUgJy4kc3FsX2NvbmQ7CisKKy8qIEV4ZWN1dGUgdGhlIHF1ZXJ5ICovCiskcmVzdWx0ID0gcGdfcXVlcnkoJGRiY29ubiwgJHNxbCkgb3IgZGllKCdRdWVyeSBmYWlsZWQ6ICcgLiBwZ19sYXN0X2Vycm9yKCkgLiAiXG4iKTsKK2lmIChwZ19udW1fcm93cygkcmVzdWx0KSA9PSAwKSB7CisJZWNobyAiPHA+PGVtPk5vIGRhdGEgaXMgYXZhaWxhYmxlIGluIHRoZSBzZWxlY3RlZCBwZXJpb2QuPC9lbT48L3A+XG4iOworCWRpZSgiPC9ib2R5PjwvaHRtbD5cbiIpOworfSAKKworJGRhdGEgPSBwZ19mZXRjaF9hcnJheSgkcmVzdWx0LCBudWxsLCBQR1NRTF9BU1NPQyk7Cis/PgorICA8dGFibGUgY2xhc3M9ImNvbG9yZWQiPgorICAgIDx0cj4KKyAgICAgIDx0aCBjb2xzcGFuPSIyIj5Ub3RhbCBhY2NvdW50ZWQgZGF0YTwvdGg+CisgICAgPC90cj4KKzw/cGhwCitlY2hvICIgICAgPHRyPjx0ZD5GaXJzdCBzZXNzaW9uIHN0YXJ0ZWQ6PC90ZD48dGQ+Ii4kZGF0YVsiZmlyc3Rfc2VzcyJdLiI8L3RkPjwvdHI+XG4iOworZWNobyAiICAgIDx0cj48dGQ+TGFzdCBzZXNzaW9uIHN0YXJ0ZWQ6PC90ZD48dGQ+Ii4kZGF0YVsibGFzdF9zZXNzIl0uIjwvdGQ+PC90cj5cbiI7CitlY2hvICIgICAgPHRyPjx0ZD5Ub3RhbCBkYXRhIGRvd25sb2FkZWQ6PC90ZD48dGQ+PHN0cm9uZz4iLmh1bWFuX3JlYWRhYmxlKCRkYXRhWyJ0b3RhbF9kb3duIl0pLiI8L3N0cm9uZz48L3RkPjwvdHI+XG4iOworZWNobyAiICAgIDx0cj48dGQ+VG90YWwgZGF0YSB1cGxvYWRlZDo8L3RkPjx0ZD48c3Ryb25nPiIuaHVtYW5fcmVhZGFibGUoJGRhdGFbInRvdGFsX3VwIl0pLiI8L3N0cm9uZz48L3RkPjwvdHI+XG4iOworZWNobyAiICAgIDx0cj48dGQ+TnVtYmVyIG9mIHVzZXJzIHdobyBjb25uZWN0ZWQgYXQgbGVhc3Qgb25jZTo8L3RkPjx0ZD4iLiRkYXRhWyJuYl91c2VycyJdLiI8L3RkPjwvdHI+XG4iOworZWNobyAiICAgIDx0cj48dGQ+TnVtYmVyIG9mIGFjY2VzcyBwb2ludHMgaW52b2x2ZWQ6PC90ZD48dGQ+Ii4kZGF0YVsibmJfYXAiXS4iPC90ZD48L3RyPlxuIjsKK2VjaG8gIiAgPC90cj5cbiI7CitlY2hvICIgPC90YWJsZT5cbiI7CisKK3BnX2ZyZWVfcmVzdWx0KCRyZXN1bHQpOworCis/PgorICAKKyAgPGhyIC8+CisgIAorICA8dGFibGUgY2xhc3M9ImNvbG9yZWQiPgorICAgIDx0cj4KKyAgICAgIDx0aCBjb2xzcGFuPSIyIj5Ub3AtNSA8c3Ryb25nPmRvd25sb2FkaW5nPC9zdHJvbmc+IHVzZXJzPC90aD4KKyAgICA8L3RyPgorPD9waHAKKyAgICAKKy8qIE5vdywgZ2V0IHRoZSB0b3AgNSBkb3dubG9hZGVycyAqLworJHNxbCA9ICdTRUxFQ1QgU1VNKGRvd25sX2J5dGVzKSBhcyB0b3RhbF9kb3duLCB1c2VyX25hbWUnOworJHNxbCAuPSAnIEZST00gIicuJFBST0NFU1NFRC4nIic7CitpZiAoJHNxbF9jb25kKQorCSRzcWwgLj0gJyBXSEVSRSAnLiRzcWxfY29uZDsKKyRzcWwgLj0gJyBHUk9VUCBCWSB1c2VyX25hbWUnOworJHNxbCAuPSAnIE9SREVSIEJZIHRvdGFsX2Rvd24gZGVzYywgdXNlcl9uYW1lJzsKKyRzcWwgLj0gJyBMSU1JVCA1JzsKKworLyogRXhlY3V0ZSB0aGUgcXVlcnkgKi8KKyRyZXN1bHQgPSBwZ19xdWVyeSgkZGJjb25uLCAkc3FsKSBvciBkaWUoJ1F1ZXJ5IGZhaWxlZDogJyAuIHBnX2xhc3RfZXJyb3IoKSAuICJcbiIpOword2hpbGUgKCRkYXRhID0gcGdfZmV0Y2hfYXJyYXkoJHJlc3VsdCwgbnVsbCwgUEdTUUxfQVNTT0MpKSB7CisJZWNobyAiICAgIDx0cj5cbiI7CisJZWNobyAiICAgICAgPHRkPiIuaHRtbGVudGl0aWVzKHBnX3VuZXNjYXBlX2J5dGVhKCRkYXRhWyJ1c2VyX25hbWUiXSkpLiI8L3RkPlxuIjsKKwllY2hvICIgICAgICA8dGQ+Ii5odW1hbl9yZWFkYWJsZSgkZGF0YVsidG90YWxfZG93biJdKS4iPC90ZD5cbiI7CisJZWNobyAiICAgIDwvdHI+XG4iOworfQorcGdfZnJlZV9yZXN1bHQoJHJlc3VsdCk7Cis/PgorICA8L3RhYmxlPgorICAKKyAgPGhyIC8+CisgIAorICA8dGFibGUgY2xhc3M9ImNvbG9yZWQiPgorICAgIDx0cj4KKyAgICAgIDx0aCBjb2xzcGFuPSIyIj5Ub3AtNSA8c3Ryb25nPnVwbG9hZGluZzwvc3Ryb25nPiB1c2VyczwvdGg+CisgICAgPC90cj4KKzw/cGhwCisgICAgCisvKiBOb3csIGdldCB0aGUgdG9wIDUgZG93bmxvYWRlcnMgKi8KKyRzcWwgPSAnU0VMRUNUIFNVTSh1cGxfYnl0ZXMpIGFzIHRvdGFsX3VwLCB1c2VyX25hbWUnOworJHNxbCAuPSAnIEZST00gIicuJFBST0NFU1NFRC4nIic7CitpZiAoJHNxbF9jb25kKQorCSRzcWwgLj0gJyBXSEVSRSAnLiRzcWxfY29uZDsKKyRzcWwgLj0gJyBHUk9VUCBCWSB1c2VyX25hbWUnOworJHNxbCAuPSAnIE9SREVSIEJZIHRvdGFsX3VwIGRlc2MsIHVzZXJfbmFtZSc7Ciskc3FsIC49ICcgTElNSVQgNSc7CisKKy8qIEV4ZWN1dGUgdGhlIHF1ZXJ5ICovCiskcmVzdWx0ID0gcGdfcXVlcnkoJGRiY29ubiwgJHNxbCkgb3IgZGllKCdRdWVyeSBmYWlsZWQ6ICcgLiBwZ19sYXN0X2Vycm9yKCkgLiAiXG4iKTsKK3doaWxlICgkZGF0YSA9IHBnX2ZldGNoX2FycmF5KCRyZXN1bHQsIG51bGwsIFBHU1FMX0FTU09DKSkgeworCWVjaG8gIiAgICA8dHI+XG4iOworCWVjaG8gIiAgICAgIDx0ZD4iLmh0bWxlbnRpdGllcyhwZ191bmVzY2FwZV9ieXRlYSgkZGF0YVsidXNlcl9uYW1lIl0pKS4iPC90ZD5cbiI7CisJZWNobyAiICAgICAgPHRkPiIuaHVtYW5fcmVhZGFibGUoJGRhdGFbInRvdGFsX3VwIl0pLiI8L3RkPlxuIjsKKwllY2hvICIgICAgPC90cj5cbiI7Cit9CitwZ19mcmVlX3Jlc3VsdCgkcmVzdWx0KTsKKz8+CisgIDwvdGFibGU+CisKKyAgPGhyIC8+CisgIAorICA8dGFibGUgY2xhc3M9ImNvbG9yZWQiPgorICAgIDx0cj4KKyAgICAgIDx0aCBjb2xzcGFuPSIyIj5Ub3AtOCBhY2Nlc3MgZGV2aWNlcyAoYnkgbnVtYmVyIG9mIHVzZXJzKTwvdGg+CisgICAgPC90cj4KKzw/cGhwCisgICAgCisvKiBOb3csIGdldCB0aGUgdG9wIDUgZG93bmxvYWRlcnMgKi8KKyRzcWwgPSAnU0VMRUNUIGNvdW50KGRpc3RpbmN0IHVzZXJfbmFtZSkgYXMgdW5jLCBuYXNfaW5mbyc7Ciskc3FsIC49ICcgRlJPTSAiJy4kUFJPQ0VTU0VELiciJzsKK2lmICgkc3FsX2NvbmQpCisJJHNxbCAuPSAnIFdIRVJFICcuJHNxbF9jb25kOworJHNxbCAuPSAnIEdST1VQIEJZIG5hc19pbmZvJzsKKyRzcWwgLj0gJyBPUkRFUiBCWSB1bmMgZGVzYywgbmFzX2luZm8nOworJHNxbCAuPSAnIExJTUlUIDgnOworCisvKiBFeGVjdXRlIHRoZSBxdWVyeSAqLworJHJlc3VsdCA9IHBnX3F1ZXJ5KCRkYmNvbm4sICRzcWwpIG9yIGRpZSgnUXVlcnkgZmFpbGVkOiAnIC4gcGdfbGFzdF9lcnJvcigpIC4gIlxuIik7Cit3aGlsZSAoJGRhdGEgPSBwZ19mZXRjaF9hcnJheSgkcmVzdWx0LCBudWxsLCBQR1NRTF9BU1NPQykpIHsKKwllY2hvICIgICAgPHRyPlxuIjsKKwllY2hvICIgICAgICA8dGQ+Ii5odG1sZW50aXRpZXMocGdfdW5lc2NhcGVfYnl0ZWEoJGRhdGFbIm5hc19pbmZvIl0pKS4iPC90ZD5cbiI7CisJZWNobyAiICAgICAgPHRkPiIuJGRhdGFbInVuYyJdLiI8L3RkPlxuIjsKKwllY2hvICIgICAgPC90cj5cbiI7Cit9CitwZ19mcmVlX3Jlc3VsdCgkcmVzdWx0KTsKKz8+CisgIDwvdGFibGU+CisKKyAgPGhyIC8+CisgIAorICA8dGFibGUgY2xhc3M9ImNvbG9yZWQiPgorICAgIDx0cj4KKyAgICAgIDx0aCBjb2xzcGFuPSIyIj5Ub3AtOCBhY2Nlc3MgZGV2aWNlcyAoYnkgdHJhZmZpYzogdXArZG93bik8L3RoPgorICAgIDwvdHI+Cis8P3BocAorICAgIAorLyogTm93LCBnZXQgdGhlIHRvcCA1IGRvd25sb2FkZXJzICovCiskc3FsID0gJ1NFTEVDVCBTVU0odXBsX2J5dGVzKSArIFNVTShkb3dubF9ieXRlcykgYXMgdHJhZmZpYywgbmFzX2luZm8nOworJHNxbCAuPSAnIEZST00gIicuJFBST0NFU1NFRC4nIic7CitpZiAoJHNxbF9jb25kKQorCSRzcWwgLj0gJyBXSEVSRSAnLiRzcWxfY29uZDsKKyRzcWwgLj0gJyBHUk9VUCBCWSBuYXNfaW5mbyc7Ciskc3FsIC49ICcgT1JERVIgQlkgdHJhZmZpYyBkZXNjLCBuYXNfaW5mbyc7Ciskc3FsIC49ICcgTElNSVQgOCc7CisKKy8qIEV4ZWN1dGUgdGhlIHF1ZXJ5ICovCiskcmVzdWx0ID0gcGdfcXVlcnkoJGRiY29ubiwgJHNxbCkgb3IgZGllKCdRdWVyeSBmYWlsZWQ6ICcgLiBwZ19sYXN0X2Vycm9yKCkgLiAiXG4iKTsKK3doaWxlICgkZGF0YSA9IHBnX2ZldGNoX2FycmF5KCRyZXN1bHQsIG51bGwsIFBHU1FMX0FTU09DKSkgeworCWVjaG8gIiAgICA8dHI+XG4iOworCWVjaG8gIiAgICAgIDx0ZD4iLmh0bWxlbnRpdGllcyhwZ191bmVzY2FwZV9ieXRlYSgkZGF0YVsibmFzX2luZm8iXSkpLiI8L3RkPlxuIjsKKwllY2hvICIgICAgICA8dGQ+Ii5odW1hbl9yZWFkYWJsZSgkZGF0YVsidHJhZmZpYyJdKS4iPC90ZD5cbiI7CisJZWNobyAiICAgIDwvdHI+XG4iOworfQorcGdfZnJlZV9yZXN1bHQoJHJlc3VsdCk7Cis/PgorICA8L3RhYmxlPgorCisgIDxociAvPgorPD9waHAKKy8qIENsb3NpbmcgY29ubmVjdGlvbiAqLworcGdfY2xvc2UoJGRiY29ubik7Cis/PgorPHA+PHNtYWxsPkRhdGEgZ2VuZXJhdGVkIGJ5IHNjcmlwdHMgZnJvbSB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5mcmVlZGlhbWV0ZXIubmV0Ij5mcmVlRGlhbWV0ZXI8L2E+IHByb2plY3QuPC9zbWFsbD48L3A+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9jb250cmliL2FwcF9hY2N0X3Rvb2xzL3Byb2Nlc3NfcmVjb3Jkcy5waHAgYi9jb250cmliL2FwcF9hY2N0X3Rvb2xzL3Byb2Nlc3NfcmVjb3Jkcy5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY0ZTFkNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvYXBwX2FjY3RfdG9vbHMvcHJvY2Vzc19yZWNvcmRzLnBocApAQCAtMCwwICsxLDIwNSBAQAorPD9waHAKKyMgVGhpcyBmaWxlIG1heSBiZSBjYWxsZWQgZWl0aGVyIGZyb20gQ0xJIG9yIHdlYiBQSFAgaW5zdGFsbGF0aW9uLgorIyBUaGUgY29weXJpZ2h0IGlzIHRoZSBzYW1lIGFzIHRoZSBmcmVlRGlhbWV0ZXIgcHJvamVjdC4gTGljZW5jZSBpcyBCU0QuCisKKyMgSU1QT1JUQU5UOiBUaGlzIHNjcmlwdCBpcyBoaWdobHkgZXhwZXJpbWVudGFsLCBQTEVBU0UgS0VFUCBBIENPUFkgT0YgWU9VUiBBQ0NPVU5USU5HIERBVEEgCisjIGlmIHRoaXMgZGF0YSBoYXMgYW55IGltcG9ydGFuY2UuCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFRoaXMgc2NyaXB0IHN1cHBvcnRzIG9ubHkgb25lIGRhdGFiYXNlIHdoZXJlIGFsbCB0YWJsZXMgYXJlIGtlcHQuIAorICBUaGUgQ29ubmVjdGlvbiBTdHJpbmcgdXNlZCB0byBhY2Nlc3MgdGhhdCBkYXRhYmFzZToKKyAgRXhhbXBsZTogImhvc3Q9bG9jYWxob3N0IGRibmFtZT1hcHBfYWNjdCB1c2VyPWZyZWVkaWFtZXRlciBwYXNzd29yZD1mb28iICovCiskQ09OTlNUUj0iIjsgCisKKworLyoqKiogMSA6IEluY29taW5nIHJlY29yZHMgKG91dHB1dCBvZiBhcHBfYWNjdC5mZHgpICoqKiovCisvKiBUaGUgbmFtZSBvZiB0aGUgdGFibGUgd2VyZSB0aGUgcmF3IHJlY29yZHMgYXJlIHNhdmVkIChmcm9tIGFwcF9hY2N0LmNvbmYpICovCiskSU5DT01JTkc9ImluY29taW5nIjsKKworLyogTm90ZTogRm9yIHRoaXMgc2NyaXB0LCB0aGlzIHRhYmxlIE1VU1QgY29udGFpbiB0aGUgZm9sbG93aW5nIGZpZWxkcyAod2l0aCB0aGVzZSBuYW1lcyk6IAorIFNlc3Npb24tSWQsIFVzZXItTmFtZSwgQWNjb3VudGluZy1SZWNvcmQtVHlwZSwgQWNjb3VudGluZy1SZWNvcmQtTnVtYmVyLCBBY2N0LVNlc3Npb24tSWQsIAorIEFjY291bnRpbmcte0luLE91dH1wdXQte09jdGV0cyxQYWNrZXRzfSwKKyBOQVMtSWRlbnRpZmllciwgQ2FsbGVkLVN0YXRpb24tSWQsIENhbGxpbmctU3RhdGlvbi1JZCwgcmVjb3JkZWRfb24uCisgKi8KKworCisvKioqKiAyIDogUHJvY2Vzc2VkIHJlY29yZHMgKG91dHB1dCBvZiB0aGlzIHNjcmlwdCwgaW5wdXQgZm9yIGRpc3BsYXlfcmVzdWx0cy5waHApICoqKiovCisvKiBUaGUgbmFtZSBvZiB0aGUgdGFibGUgKi8KKyRQUk9DRVNTRUQ9InByb2Nlc3NlZCI7CisKKy8qIFNlZSBwcm9jZXNzX2RhdGFiYXNlLnNxbCBmb3IgY29tbWFuZCB0byBjcmVhdGUgdGhpcyBkYXRhYmFzZSAqLworCisvKioqKiAzIDogT3JwaGFuIHJlY29yZHMgKG9wdGlvbmFsKSAqKioqLworLyogVGhlIHNjcmlwdCBjYW4gbW92ZSByZWNvcmRzIGJlbG9uZ2luZyB0byBhbiB1bnRlcm1pbmF0ZWQgc2Vzc2lvbiB0aGF0IGhhcyBub3QgcmVjZWl2ZWQgYW55IG5ldworICByZWNvcmQgZm9yIG1vcmUgdGhhbiAkT1JQSEFOX0RFTEFZIChiYXNlZCBvbiByZWNvcmRlZF9vbiBmaWVsZCkgaW50byBhbiAkT1JQSEFORURfVEFCTEUgdGFibGUsIHNvIHRoYXQKKyAgdGhlc2UgcmVjb3JkcyBhcmUgbm90IHJlLXByb2Nlc3NlZCBldmVyeXRpbWUgdGhlIHNjcmlwdCBydW5zLiAKKyAgSWYgJE9SUEhBTkVEX1RBQkxFIGlzIGVtcHR5LCB0aGlzIGZlYXR1cmUgaXMgZGlzYWJsZWQuICAqLworJE9SUEhBTkVEX1RBQkxFPSJvcnBoYW5zIjsKKyRPUlBIQU5fREVMQVkgPSAiMiBkYXlzIjsKKworCisvKioqKiA0IDogQXJjaGl2ZWQgcmVjb3JkcyAob3B0aW9uYWwpICoqKiovCisvKiBXaGVuIGRhdGEgaGFzIGJlZW4gcHJvY2Vzc2VkIHN1Y2Nlc3NmdWxseSwgdGhlIHJlY29yZHMgY2FuIGJlIHNhdmVkIGludG8gYW4gYXJjaGl2ZSB0YWJsZSBiZWZvcmUgYmVpbmcgZGVsZXRlZC4gKi8KKy8qIFRoaXMgdGFibGUgYWxzbyBtdXN0IGhhdmUgdGhlIHNhbWUgc3RydWN0dXJlIGFzICRJTkNPTUlORyAqLworJEFSQ0hJVkVTX1RBQkxFPSJhcmNoaXZlZCI7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIENvbm5lY3QgdG8gdGhlIGRhdGFiYXNlICovCiskZGJjb25uID0gcGdfY29ubmVjdCgkQ09OTlNUUikKKyAgICBvciBkaWUoJ0NvdWxkIG5vdCBjb25uZWN0OiAnIC4gcGdfbGFzdF9lcnJvcigpIC4gIlxuIik7CisKKy8qIEhhbmRsZSBvcnBoYW5zIGZpcnN0ICovCitpZiAoJE9SUEhBTkVEX1RBQkxFKSB7CisJJG9ycGhhbnNfc3FsID0gJ1NFTEVDVCAqIEZST00gIicuJElOQ09NSU5HLiciICc7CisJJG9ycGhhbnNfc3FsLj0gJ1dIRVJFICJBY2N0LVNlc3Npb24tSWQiIElOICgnOworCSRvcnBoYW5zX3NxbC49ICcgICBTRUxFQ1QgZGF0YS5hc2lkICc7CisJJG9ycGhhbnNfc3FsLj0gJyAgIEZST00gKCc7CisJJG9ycGhhbnNfc3FsLj0gJyAgICAgICBTRUxFQ1QgIkFjY3QtU2Vzc2lvbi1JZCIgYXMgYXNpZCwgTUFYKCJyZWNvcmRlZF9vbiIpIGFzIGxhdGVzdCwgYm9vbF9vcigiQWNjb3VudGluZy1SZWNvcmQtVHlwZSIgPSAyKSBhcyBnb3Rfc3RhcnQsIGJvb2xfb3IoIkFjY291bnRpbmctUmVjb3JkLVR5cGUiID0gNCkgYXMgZ290X3N0b3AgICc7CisJJG9ycGhhbnNfc3FsLj0gJyAgICAgICBGUk9NICInLiRJTkNPTUlORy4nIic7CisJJG9ycGhhbnNfc3FsLj0gJyAgICAgICBHUk9VUCBCWSAiQWNjdC1TZXNzaW9uLUlkIikgJzsKKwkkb3JwaGFuc19zcWwuPSAnICAgYXMgZGF0YSc7CisJJG9ycGhhbnNfc3FsLj0gJyAgIFdIRVJFIGRhdGEubGF0ZXN0IDwgY3VycmVudF90aW1lc3RhbXAgLSBpbnRlcnZhbCBcJycuICRPUlBIQU5fREVMQVkgLidcJyBBTkQgTk9UICggZ290X3N0YXJ0IEFORCBnb3Rfc3RvcCApJzsKKwkkb3JwaGFuc19zcWwuPSAnKTsnOworCQorCS8qIEV4ZWN1dGUsIG1vdmUgdGhlIG9ycGhhbmVkIHJlY29yZHMgdG8gdGhlIGFwcHJvcHJpYXRlIHRhYmxlLiAqLworCSRyZXN1bHQgPSBwZ19xdWVyeSgkZGJjb25uLCAkb3JwaGFuc19zcWwpIG9yIGRpZSgnUXVlcnkgZmFpbGVkOiAnIC4gcGdfbGFzdF9lcnJvcigpIC4gIlxuIik7CisJaWYgKHBnX251bV9yb3dzKCRyZXN1bHQpID4gMCkgeworCQkkaSA9IDA7CisJCXdoaWxlICgkb3JwaGFuID0gcGdfZmV0Y2hfYXJyYXkoJHJlc3VsdCwgbnVsbCwgUEdTUUxfQVNTT0MpKSB7CisJCQkkaSsrOworCQkJCisJCQkvLyB0aGlzIGRvZXNuJ3Qgd29yazogcGdfaW5zZXJ0KCAkZGJjb25uLCAkT1JQSEFORURfVEFCTEUsICRvcnBoYW4gKSBvciBkaWUoJ0luc2VydCBmYWlsZWQ6ICcgLiBwZ19sYXN0X2Vycm9yKCkgLiAiXG4iKTsKKwkJCSRzcWwgID0gIklOU0VSVCBJTlRPIFwiJE9SUEhBTkVEX1RBQkxFXCIgIjsKKwkJCSRzcWwgLj0gJygiJzsKKwkJCSRzcWwgLj0gam9pbignIiwgIicsIGFycmF5X2tleXMoJG9ycGhhbikpOworCQkJJHNxbCAuPSAnIikgVkFMVUVTICgnOworCQkJZm9yKCRjID0gMDsgJGMgPCBjb3VudCgkb3JwaGFuKTsgJGMrKykKKwkJCSAgJHNxbCAuPSAoJGMgPyAnLCAnIDogJycpLickJy4oJGMrMSk7CisJCQkkc3FsIC49ICcpJzsKKwkJCXBnX3F1ZXJ5X3BhcmFtcygkZGJjb25uLCAkc3FsLCBhcnJheV92YWx1ZXMoJG9ycGhhbikpIG9yIGRpZSgnSW5zZXJ0IGZhaWxlZDogJyAuIHBnX2xhc3RfZXJyb3IoKSAuICJcbiIpOworCQkJCQkJCisJCQkvLyBUaGlzIGFsc28gZG9lc24ndCB3b3JrOiBwZ19kZWxldGUoICRkYmNvbm4sICRJTkNPTUlORywgJG9ycGhhbiApIG9yIGRpZSgnUmVtb3Zpbmcgb3JwaGFuIGZhaWxlZDogJyAuIHBnX2xhc3RfZXJyb3IoKSAuICJcbiIpOworCQkJJHNxbCAgPSAiREVMRVRFIEZST00gXCIkSU5DT01JTkdcIiBXSEVSRSAiOworCQkJJHNxbCAuPSAnIkFjY3QtU2Vzc2lvbi1JZCIgPSAkMSBBTkQgInJlY29yZGVkX29uIiA9ICQyJzsKKwkJCXBnX3F1ZXJ5X3BhcmFtcygkZGJjb25uLCAkc3FsLCBhcnJheSgkb3JwaGFuWyJBY2N0LVNlc3Npb24tSWQiXSwgJG9ycGhhblsicmVjb3JkZWRfb24iXSkpIG9yIGRpZSgnUmVtb3Zpbmcgb3JwaGFuIGZhaWxlZDogJyAuIHBnX2xhc3RfZXJyb3IoKSAuICJcbiIpOworCQl9CisJCWVjaG8gJGkuIiBvcnBoYW5zIGhhdmUgYmVlbiBtb3ZlZCB0byAnIi4kT1JQSEFORURfVEFCTEUuIidcbiI7CisJfQorCXBnX2ZyZWVfcmVzdWx0KCRyZXN1bHQpOworfQorCisvKiBEZWxldGUgZHVwbGljYXRlIHJlY29yZHMgKHdoaWNoIG1pZ2h0IGhhdmUgYmVlbiByZWNlaXZlZCBieSBkaWZmZXJlbnQgc2VydmVycyBvbiBkaWZmZXJlbnQgdGltZSwgYnV0IGFyZSBpZGVudGljYWwgb3RoZXJ3aXNlICovCiskZHVwbGljYXRlX3NxbCAgPSAnIFNFTEVDVCAqIEZST00gKFNFTEVDVCBjb3VudCgqKSBhcyBjbnQsIG1pbigicmVjb3JkZWRfb24iKSBhcyBmaXJzdCwgIlNlc3Npb24tSWQiLCAiQWNjdC1TZXNzaW9uLUlkIiwgIkFjY291bnRpbmctUmVjb3JkLVR5cGUiLCAiQWNjb3VudGluZy1SZWNvcmQtTnVtYmVyIic7CiskZHVwbGljYXRlX3NxbCAuPSAnIEZST00gIicuJElOQ09NSU5HLiciIEdST1VQIEJZICJTZXNzaW9uLUlkIiwgIkFjY3QtU2Vzc2lvbi1JZCIsICJBY2NvdW50aW5nLVJlY29yZC1UeXBlIiwgIkFjY291bnRpbmctUmVjb3JkLU51bWJlciIpIGFzIHFyeSBXSEVSRSBxcnkuY250ID4gMSc7CiskcmVzdWx0ID0gcGdfcXVlcnkoJGRiY29ubiwgJG9ycGhhbnNfc3FsKSBvciBkaWUoJ1F1ZXJ5IGZhaWxlZDogJyAuIHBnX2xhc3RfZXJyb3IoKSAuICJcbiIpOworaWYgKHBnX251bV9yb3dzKCRyZXN1bHQpID4gMCkgeworCS8qIFdlIGhhdmUgc29tZSBkdXBsaWNhdGVzIHRvIGRlbGV0ZSAqLworCSRpPTA7CisJd2hpbGUgKCRkdXAgPSBwZ19mZXRjaF9hcnJheSgkcmVzdWx0LCBudWxsLCBQR1NRTF9BU1NPQykpIHsKKwkJJGkrKzsKKwkJJHNxbCAgPSAiREVMRVRFIEZST00gXCIkSU5DT01JTkdcIiBXSEVSRSAiOworCQkkc3FsIC49ICciU2Vzc2lvbi1JZCIgPSAkMSBBTkQgIkFjY3QtU2Vzc2lvbi1JZCIgPSAkMiBBTkQgIkFjY291bnRpbmctUmVjb3JkLVR5cGUiID0gJDMgQU5EICJBY2NvdW50aW5nLVJlY29yZC1OdW1iZXIiID0gJDQgQU5EICJyZWNvcmRlZF9vbiIgPD4gJDUnOworCQkkcGFyYW1zID0gYXJyYXkoJGR1cFsiU2Vzc2lvbi1JZCJdLCAkZHVwWyJBY2N0LVNlc3Npb24tSWQiXSwgJGR1cFsiQWNjb3VudGluZy1SZWNvcmQtVHlwZSJdLCAkZHVwWyJBY2NvdW50aW5nLVJlY29yZC1OdW1iZXIiXSwgJGR1cFsiZmlyc3QiXSk7CisJCXBnX3F1ZXJ5X3BhcmFtcygkZGJjb25uLCAkc3FsLCAkcGFyYW1zKSBvciBkaWUoJ1JlbW92aW5nIGR1cGxpY2F0ZXMgZmFpbGVkOiAnIC4gcGdfbGFzdF9lcnJvcigpIC4gIlxuIik7CisJfQorCWVjaG8gJGkuIiBkdXBsaWNhdGUgcmVjb3JkcyBoYXZlIGJlZW4gZGVsZXRlZCBmcm9tICciLiRJTkNPTUlORy4iJ1xuIjsKK30KK3BnX2ZyZWVfcmVzdWx0KCRyZXN1bHQpOworCisKKy8qIE5vdywgZmluZCBBY2N0LVNlc3Npb24tSWQgb2YgY29tcGxldGVkIHNlc3Npb25zICovCiskY29tcGxldGVkX3NxbCAgPSAnIFNFTEVDVCAiU2Vzc2lvbi1JZCIsICJBY2N0LVNlc3Npb24tSWQiIEZST00gKCc7CiskY29tcGxldGVkX3NxbCAuPSAnICAgICBTRUxFQ1QgIlNlc3Npb24tSWQiLCAiQWNjdC1TZXNzaW9uLUlkIiwgYm9vbF9vcigiQWNjb3VudGluZy1SZWNvcmQtVHlwZSIgPSAyKSBhcyBnb3Rfc3RhcnQsIGJvb2xfb3IoIkFjY291bnRpbmctUmVjb3JkLVR5cGUiID0gNCkgYXMgZ290X3N0b3AgJzsKKyRjb21wbGV0ZWRfc3FsIC49ICcgICAgIEZST00gIicuJElOQ09NSU5HLiciIEdST1VQIEJZICJTZXNzaW9uLUlkIiwgIkFjY3QtU2Vzc2lvbi1JZCInOworJGNvbXBsZXRlZF9zcWwgLj0gJyAgICApIGFzIGlucHV0JzsKKyRjb21wbGV0ZWRfc3FsIC49ICcgV0hFUkUgZ290X3N0YXJ0IEFORCBnb3Rfc3RvcCc7CisKKyRzaWRzID0gcGdfcXVlcnkoJGRiY29ubiwgJGNvbXBsZXRlZF9zcWwpIG9yIGRpZSgnUXVlcnkgZmFpbGVkOiAnIC4gcGdfbGFzdF9lcnJvcigpIC4gIlxuIik7CitpZiAocGdfbnVtX3Jvd3MoJHNpZHMpID4gMCkgeworCXdoaWxlICgkc2lkc19saW5lID0gcGdfZmV0Y2hfYXJyYXkoJHNpZHMsIG51bGwsIFBHU1FMX0FTU09DKSkgeworCQkkc2lkICA9ICRzaWRzX2xpbmVbIlNlc3Npb24tSWQiXTsKKwkJJGFzaWQgPSAkc2lkc19saW5lWyJBY2N0LVNlc3Npb24tSWQiXTsKKwkJZWNobyAiUHJvY2Vzc2luZyBBY2N0LVNlc3Npb24tSWQgJyIuJGFzaWQuIicsIFNlc3Npb24tSWQgJyIuJHNpZCAuIicuLi4gIjsKKwkJCisJCSRkYXRhPWFycmF5KCk7CisJCQorCQkvKiBXZSBzaW1wbHkgaWdub3JlIHRoZSBpbnRlcmltIHJlY29yZChzKSBpbiB0aGlzIGZpcnN0IHZlcnNpb24sIHNpbmNlIHRoZXkgY29udGFpbiBvbmx5IGN1bXVsYXRpdmUgZGF0YS4gSXQgY291bGQgYmUgdXNlZCBpbiBsYXRlciB2ZXJzaW9uIHRvIGRyYXcgdGhlIHNlc3Npb24gZGV0YWlscyBmb3IgZXhhbXBsZS4gKi8KKwkJCisJCSRyZXN1bHQgPSBwZ19xdWVyeV9wYXJhbXMoJGRiY29ubiwgJ1NFTEVDVCAqLCAicmVjb3JkZWRfb24iIC0gQ0FTVCh0ZXh0Y2F0KHRleHQoIkFjY3QtU2Vzc2lvbi1UaW1lIiksIHRleHQoXCcgc2Vjb25kc1wnKSkgYXMgSU5URVJWQUwpIGFzIHN0YXJ0X3RpbWUgRlJPTSAiJy4kSU5DT01JTkcuCisJCQkJCQkgICAnIiBXSEVSRSAiU2Vzc2lvbi1JZCIgPSAkMSBBTkQgIkFjY3QtU2Vzc2lvbi1JZCIgPSAkMiBBTkQgIkFjY291bnRpbmctUmVjb3JkLVR5cGUiID0gNCBPUkRFUiBCWSAicmVjb3JkZWRfb24iJywgCisJCQkJCQkgICBhcnJheSgkc2lkLCAkYXNpZCkpIG9yIGRpZSgnUXVlcnkgZmFpbGVkOiAnIC4gcGdfbGFzdF9lcnJvcigpIC4gIlxuIik7CisJCSRyZWNvcmQgPSBwZ19mZXRjaF9hcnJheSgkcmVzdWx0LCBudWxsLCBQR1NRTF9BU1NPQykgb3IgZGllKCdJbnRlcm5hbCBlcnJvciwgZ290X3N0b3AgaXMgdHJ1ZSBidXQgbm8gcmVjb3JkIHdhcyByZXR1cm5lZCcpOworCQkKKwkJJGRhdGFbLyogInVzZXJfbmFtZSIgKi9dID0gJHJlY29yZFsiVXNlci1OYW1lIl07CisJCSRkYXRhWy8qICJ1c2VyX2RldmljZSIgKi9dID0gJHJlY29yZFsiQ2FsbGluZy1TdGF0aW9uLUlkIl07CisJCQorCQkkbmFzX2lkPSAoJHJlY29yZFsiTkFTLUlkZW50aWZpZXIiXSA/OiAkcmVjb3JkWyJPcmlnaW4tSG9zdCJdKSA/OiAiPHVuaWRlbnRpZmllZCBOQVM+IjsKKwkJJGlwID0gJHJlY29yZFsiTkFTLUlQLUFkZHJlc3MiXSA/OiAkcmVjb3JkWyJOQVMtSVB2Ni1BZGRyZXNzIl07CisJCSRuYXNfaXA9ICRpcCA/IGluZXRfbnRvcChwZ191bmVzY2FwZV9ieXRlYSgkaXApKSA6ICI8dW5rbm93biBOQVMgSVA+IjsKKwkJJG5hc19jc2kgPSAkcmVjb3JkWyJDYWxsZWQtU3RhdGlvbi1JZCJdOworCQkkZGF0YVsvKiAibmFzX2luZm8iICovXSA9ICRuYXNfaWQgLiAiICgiLiRuYXNfaXAuIikiIC4gKCRuYXNfY3NpID8gIiAtIENhbGxlZCBTdGF0aW9uOiAiLiRuYXNfY3NpIDogIiIpOworCQkKKwkJLyogSXMgaXQgcG9zc2libGUgdG8gaW5mZXIgdGhlIHNlc3Npb24gc3RhcnQgdGltZSBmcm9tIHRoaXMgcmVjb3JkIG9ubHk/ICovCisJCWlmICgkcmVjb3JkWyJBY2N0LVNlc3Npb24tVGltZSJdKSB7CisJCQkvKiBZZXMsIGxldCdzIGdvICovCisJCQkkZGF0YVsvKiAic2Vzc19zdGFydCIgKi9dID0gJHJlY29yZFsic3RhcnRfdGltZSJdOworCQkJJGRhdGFbLyogInNlc3NfZHVyYXRpb24iICovXSA9ICRyZWNvcmRbIkFjY3QtU2Vzc2lvbi1UaW1lIl0uIiBzZWNvbmRzIjsKKwkJfSBlbHNlIHsKKwkJCS8qIE5vIHRoZSBpbmZvcm1hdGlvbiBpcyBtaXNzaW5nLCBsZXQncyBjb21wdXRlIHRoZSBhcHByb3ggdmFsdWUgd2l0aCB0aGUgU1RBUlQgcmVjb3JkIHRpbWVzdGFtcCAqLworCQkJJHJlcyA9IHBnX3F1ZXJ5X3BhcmFtcygkZGJjb25uLCAnU0VMRUNUIHRfc3RhcnQuInJlY29yZGVkX29uIiBhcyBiZWdpbmluZywgdF9lbmQuInJlY29yZGVkX29uIiAtIHRfc3RhcnQuInJlY29yZGVkX29uIiBhcyBkdXJhdGlvbicuCisJCQkJCQkJJyBGUk9NIChTRUxFQ1QgInJlY29yZGVkX29uIiBGUk9NICInLiRJTkNPTUlORy4nIiAgV0hFUkUgIlNlc3Npb24tSWQiID0gJDEgQU5EICJBY2N0LVNlc3Npb24tSWQiID0gJDIgQU5EICJBY2NvdW50aW5nLVJlY29yZC1UeXBlIiA9IDQgT1JERVIgQlkgInJlY29yZGVkX29uIiBMSU1JVCAxKSBhcyB0X2VuZCwgJy4KKwkJCQkJCQknICAgICAgKFNFTEVDVCAicmVjb3JkZWRfb24iIEZST00gIicuJElOQ09NSU5HLiciICBXSEVSRSAiU2Vzc2lvbi1JZCIgPSAkMSBBTkQgIkFjY3QtU2Vzc2lvbi1JZCIgPSAkMiBBTkQgIkFjY291bnRpbmctUmVjb3JkLVR5cGUiID0gMiBPUkRFUiBCWSAiQWNjb3VudGluZy1SZWNvcmQtTnVtYmVyIiwgInJlY29yZGVkX29uIiBMSU1JVCAxKSBhcyB0X3N0YXJ0JywKKwkJCQkJCQlhcnJheSgkc2lkLCAkYXNpZCkpIG9yIGRpZSgnUXVlcnkgZmFpbGVkOiAnIC4gcGdfbGFzdF9lcnJvcigpIC4gIlxuIik7CisJCQkkdmFscyA9IHBnX2ZldGNoX2FycmF5KCRyZXN1bHQsIG51bGwsIFBHU1FMX0FTU09DKSBvciBkaWUoJ0ludGVybmFsIGVycm9yLCB1bmFibGUgdG8gY29tcHV0ZSBzZXNzaW9uIHRpbWUnKTsKKwkJCSRkYXRhWy8qICJzZXNzX3N0YXJ0IiAqL10gPSAkdmFsc1siYmVnaW5pbmciXTsKKwkJCSRkYXRhWy8qICJzZXNzX2R1cmF0aW9uIiAqL10gPSAkdmFsc1siZHVyYXRpb24iXTsKKwkJCXBnX2ZyZWVfcmVzdWx0KCRyZXMpOworCQl9CisJCQorCQkkZGF0YVsvKiAiZG93bmxfYnl0ZXMiICovXSA9ICRyZWNvcmRbIkFjY291bnRpbmctT3V0cHV0LU9jdGV0cyJdOworCQkkZGF0YVsvKiAiZG93bmxfcGFja2V0cyIgKi9dID0gJHJlY29yZFsiQWNjb3VudGluZy1PdXRwdXQtUGFja2V0cyJdOworCQkkZGF0YVsvKiAidXBsX2J5dGVzIiAqL10gPSAkcmVjb3JkWyJBY2NvdW50aW5nLUlucHV0LU9jdGV0cyJdOworCQkkZGF0YVsvKiAidXBsX3BhY2tldHMiICovXSA9ICRyZWNvcmRbIkFjY291bnRpbmctSW5wdXQtUGFja2V0cyJdOworCQlwZ19mcmVlX3Jlc3VsdCgkcmVzdWx0KTsKKwkJCisJCSRyZXN1bHQgPSBwZ19xdWVyeV9wYXJhbXMoJGRiY29ubiwgCisJCQknSU5TRVJUIElOVE8gIicuJFBST0NFU1NFRC4nIiAodXNlcl9uYW1lLCB1c2VyX2RldmljZSwgbmFzX2luZm8sIHNlc3Nfc3RhcnQsIHNlc3NfZHVyYXRpb24sIGRvd25sX2J5dGVzLCBkb3dubF9wYWNrZXRzLCB1cGxfYnl0ZXMsIHVwbF9wYWNrZXRzKSAnLgorCQkJJ1ZBTFVFUyAoJDEsICQyLCAkMywgJDQsICQ1LCAkNiwgJDcsICQ4LCAkOSknLCAkZGF0YSkgb3IgZGllKCdRdWVyeSBmYWlsZWQ6ICcgLiBwZ19sYXN0X2Vycm9yKCkgLiAiXG4iKTsKKwkJcGdfZnJlZV9yZXN1bHQoJHJlc3VsdCk7CisJCWVjaG8gIkRhdGEgc3RvcmVkIGludG8gJyRQUk9DRVNTRUQnLi4uICI7CisJCQorCQkvKiBOb3cgdGhhdCB3ZSBoYXZlIHByb2Nlc3NlZCBpdCwgbW92ZSB0aGVzZSByZWNvcmRzIHRvIHRoZSAkQVJDSElWRVNfVEFCTEUgdGFibGUuICovCisJCWlmICgkQVJDSElWRVNfVEFCTEUpIHsKKwkJCSRyZXN1bHQgPSBwZ19xdWVyeV9wYXJhbXMoJGRiY29ubiwgJ1NFTEVDVCAqIEZST00gIicuJElOQ09NSU5HLiciIFdIRVJFICJTZXNzaW9uLUlkIiA9ICQxIEFORCAiQWNjdC1TZXNzaW9uLUlkIiA9ICQyJywgYXJyYXkoJHNpZCwgJGFzaWQpKSBvciBkaWUoJ1F1ZXJ5IGZhaWxlZDogJyAuIHBnX2xhc3RfZXJyb3IoKSAuICJcbiIpOworCQkJJGkgPSAwOworCQkJd2hpbGUgKCRyZWMgPSBwZ19mZXRjaF9hcnJheSgkcmVzdWx0LCBudWxsLCBQR1NRTF9BU1NPQykpIHsKKwkJCQkkaSsrOworCisJCQkJJHNxbCAgPSAiSU5TRVJUIElOVE8gXCIkQVJDSElWRVNfVEFCTEVcIiAiOworCQkJCSRzcWwgLj0gJygiJzsKKwkJCQkkc3FsIC49IGpvaW4oJyIsICInLCBhcnJheV9rZXlzKCRyZWMpKTsKKwkJCQkkc3FsIC49ICciKSBWQUxVRVMgKCc7CisJCQkJZm9yKCRjID0gMDsgJGMgPCBjb3VudCgkcmVjKTsgJGMrKykKKwkJCQkgICRzcWwgLj0gKCRjID8gJywgJyA6ICcnKS4nJCcuKCRjKzEpOworCQkJCSRzcWwgLj0gJyknOworCQkJCXBnX3F1ZXJ5X3BhcmFtcygkZGJjb25uLCAkc3FsLCBhcnJheV92YWx1ZXMoJHJlYykpIG9yIGRpZSgnSW5zZXJ0IGZhaWxlZDogJyAuIHBnX2xhc3RfZXJyb3IoKSAuICJcbiIpOworCQkJfQorCQkJZWNobyAkaS4iIHJlY29yZHMgYXJjaGl2ZWQgaW50byAnIi4kQVJDSElWRVNfVEFCTEUuIiciOworCQkJcGdfZnJlZV9yZXN1bHQoJHJlc3VsdCk7CisJCX0KKwkJZWNobyAiXG4iOworCQkkcmVzdWx0ID0gcGdfcXVlcnlfcGFyYW1zKCRkYmNvbm4sICdERUxFVEUgRlJPTSAiJy4kSU5DT01JTkcuJyIgV0hFUkUgIlNlc3Npb24tSWQiID0gJDEgQU5EICJBY2N0LVNlc3Npb24tSWQiID0gJDInLCBhcnJheSgkc2lkLCAkYXNpZCkpIG9yIGRpZSgnUXVlcnkgZmFpbGVkOiAnIC4gcGdfbGFzdF9lcnJvcigpIC4gIlxuIik7CisJCXBnX2ZyZWVfcmVzdWx0KCRyZXN1bHQpOworCX0KK30KK3BnX2ZyZWVfcmVzdWx0KCRzaWRzKTsKKworZWNobyAiT3BlcmF0aW9uIGNvbXBsZXRlZCB3aXRoIHN1Y2Nlc3MhXG4iOworCisvKiBDbG9zaW5nIGNvbm5lY3Rpb24gKi8KK3BnX2Nsb3NlKCRkYmNvbm4pOworCisKKz8+CmRpZmYgLS1naXQgYS9jb250cmliL2FwcF9hY2N0X3Rvb2xzL3B1cmdlX3RvX2ZpbGUucGhwIGIvY29udHJpYi9hcHBfYWNjdF90b29scy9wdXJnZV90b19maWxlLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmM5ZjI5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9hcHBfYWNjdF90b29scy9wdXJnZV90b19maWxlLnBocApAQCAtMCwwICsxLDE1NyBAQAorPD9waHAKKyMgVGhpcyBmaWxlIG1heSBiZSBjYWxsZWQgZWl0aGVyIGZyb20gQ0xJIG9yIHdlYiBQSFAgaW5zdGFsbGF0aW9uLgorCisjIFRoZSBjb3B5cmlnaHQgaXMgdGhlIHNhbWUgYXMgdGhlIGZyZWVEaWFtZXRlciBwcm9qZWN0LiBMaWNlbmNlIGlzIEJTRC4KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogLS0gVGhlc2UgcGFyYW1ldGVycyBtdXN0IG1hdGNoIHRoZSBhcHBfYWNjdC5jb25mIGZpbGUgLS0gKi8KKworLyogVGhlIENvbm5lY3Rpb24gU3RyaW5nIHVzZWQgdG8gYWNjZXNzIHRoZSBkYXRhYmFzZS4KKyAgRXhhbXBsZTogImhvc3Q9bG9jYWxob3N0IGRibmFtZT1hcHBfYWNjdCB1c2VyPWZyZWVkaWFtZXRlciBwYXNzd29yZD1mb28iICovCiskQ09OTlNUUj0iIjsgCisKKy8qIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB3ZXJlIHRoZSByZWNvcmRzIGFyZSBzYXZlZCBieSBhcHBfYWNjdC5mZHggKi8KKyRUQUJMRT0iaW5jb21pbmciOworCisKKy8qIC0tIFRoZXNlIHBhcmFtZXRlcnMgYXJlIHNwZWNpZmljIHRvIHRoaXMgc2NyaXB0IC0tICovCisKKy8qIE5hbWUgb2YgdGhlIGR1bXAgZmlsZSB0byBjcmVhdGUuIEl0IGNhbiBiZSByZWxhdGl2ZSBvciBhYnNvbHV0ZS4gCisgICBUaGUgc2NyaXB0IGZhaWxzIGlmIHRoaXMgZmlsZSBhbHJlYWR5IGV4aXN0cy4KKyAgIFVzZSBmb3IgZXhhbXBsZSAiZGF0YS0iLmRhdGUoIlltZGhpcyIpLiIuc3FsIiB0byBhdm9pZCBjb2xsaXNpb25zLiAqLworJERVTVBGSUxFPSJpbmNvbWluZ19kYXRhLnNxbCI7CisKKy8qIERvZXMgdGhlIHNjcmlwdCBhbHNvIGVjaG9lcyBhbiBIVE1MIFRBQkxFIG9mIHRoZSBkYXRhIHByb2Nlc3NlZD8gKi8KKyRESVNQTEFZX0hUTUw9RkFMU0U7IC8vIGl0IHdvdWxkIGJlIGJldHRlciB0byBkZXRlY3QgaWYgd2UgYXJlIGNhbGxlZCB0aHJvdWdoIFdlYiBvciBDTEkuLi4KKy8qIEluIGFkZGl0aW9uLCBpc3N1ZSBhIGZ1bGwgSFRNTCBwYWdlIChpbmNsdWRpbmcgaGVhZGVycykgPyAqLworJEhUTUxfSEVBREVSUz1UUlVFOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBDb25uZWN0IHRvIHRoZSBkYXRhYmFzZSAqLworJGRiY29ubiA9IHBnX2Nvbm5lY3QoJENPTk5TVFIpCisgICAgb3IgZGllKCdDb3VsZCBub3QgY29ubmVjdDogJyAuIHBnX2xhc3RfZXJyb3IoKSAuICJcbiIpOworICAgIAorLyogQ2hlY2sgaWYgdGhlIGZpbGUgZXhpc3RzICovCiskZmlsZSA9IGZvcGVuKCREVU1QRklMRSwgInhiIikKKyAgICBvciBkaWUoIlRoZSBmaWxlICckRFVNUEZJTEUnIGFscmVhZHkgZXhpc3RzIG9yIGNhbm5vdCBiZSBjcmVhdGVkLCBhYm9ydGluZy5cbiIpOworCisvKiBGaXJzdCwgcXVlcnkgdGhlIHRhYmxlIGZvcm1hdCAqLworJGZvcm1hdF9zcWwgPSAgICJTRUxFQ1QgIi4KKwkJIiAgIGEuYXR0bmFtZSBBUyBmaWVsZCwiLgorCQkiICAgdC50eXBuYW1lIEFTIHR5cGUsIi4KKy8qCQkiICAgYS5hdHRsZW4gQVMgbGVuZ3RoLCIuICovCisJCSIgICBhLmF0dHR5cG1vZCBBUyBsZW5ndGh2YXIsIi4KKwkJIiAgIGEuYXR0bm90bnVsbCBBUyBub3RudWxsIi4KKwkJIiBGUk9NIi4KKwkJIiAgIHBnX2NsYXNzIGMsIi4KKwkJIiAgIHBnX2F0dHJpYnV0ZSBhLCIuCisJCSIgICBwZ190eXBlIHQiLgorCQkiIFdIRVJFIi4KKwkJIiAgIGMucmVsbmFtZSA9ICciIC4gJFRBQkxFIC4gIiciLgorCQkiICAgQU5EIGEuYXR0bnVtID4gMCIuCisJCSIgICBBTkQgYS5hdHRyZWxpZCA9IGMub2lkIi4KKwkJIiAgIEFORCBhLmF0dHR5cGlkID0gdC5vaWQiLgorCQkiICAgT1JERVIgQlkgYS5hdHRudW0iOworJHJlc3VsdCA9IHBnX3F1ZXJ5KCRkYmNvbm4sICRmb3JtYXRfc3FsKSBvciBkaWUoJ1F1ZXJ5IGZhaWxlZDogJyAuIHBnX2xhc3RfZXJyb3IoKSAuICJcbiIpOworCisvKiBhcHBfYWNjdC5mZHggb25seSB1c2VzIGEgZmV3IGRpZmZlcmVudCBmaWVsZHMgdHlwZXM6ICovCiskY29udl90eXBlcyA9IGFycmF5KAorICAgICJ0aW1lc3RhbXB0eiIgPT4gInRpbWVzdGFtcCB3aXRoIHRpbWUgem9uZSIsIC8qIHJlY29yZGVkIG9uICovCisgICAgImJ5dGVhIiA9PiAiYnl0ZWEiLCAgIC8qIG9jdGV0IHN0cmluZyAqLworICAgICJpbnQ0IiA9PiAiaW50ZWdlciIsICAvKiB1bnNpZ25lZDMyLCBpbnRlZ2VyMzIsIGZsb2F0MzIgKi8KKyAgICAiaW50OCIgPT4gImJpZ2ludCIgICAgLyogdW5zaWduZWQ2NCwgaW50ZWdlcjY0LCBmbG9hdDY0ICovCisgICAgKTsKKyAgICAKKyRmaWVsZHNfdHlwZXM9YXJyYXkoKTsKKworZndyaXRlKCRmaWxlLCAiIC0tIERhdGEgcHVyZ2VkIG9uICIuZGF0ZShEQVRFX1JGQzgyMikuIlxuXG4iKTsKK2Z3cml0ZSgkZmlsZSwgIiAtLSBGb3JtYXQgb2YgdGhlIHRhYmxlIGl0IHdhcyBleHRyYWN0ZWQgZnJvbTpcbiIpOworZndyaXRlKCRmaWxlLCAiIC0tIENSRUFURSBUQUJMRSBcIiIuJFRBQkxFLiJcIiAoXG4iKTsKKyRpID0gMDsKK3doaWxlICgkZmllbGQgPSBwZ19mZXRjaF9hcnJheSgkcmVzdWx0LCBudWxsLCBQR1NRTF9BU1NPQykpIHsKKwlpZiAoJGkrKykKKwkJZndyaXRlKCRmaWxlLCAiLFxuIik7CisJZndyaXRlKCRmaWxlLCAiIC0tICAgIFwiIi4kZmllbGRbImZpZWxkIl0uIlwiICIpOworCWlmIChhcnJheV9rZXlfZXhpc3RzKCRmaWVsZFsidHlwZSJdLCAkY29udl90eXBlcykpCisJCSRmaWVsZHNfdHlwZXNbJGZpZWxkWyJmaWVsZCJdXSA9ICRjb252X3R5cGVzWyRmaWVsZFsidHlwZSJdXTsKKwllbHNlCisJCSRmaWVsZHNfdHlwZXNbJGZpZWxkWyJmaWVsZCJdXSA9ICRmaWVsZFsidHlwZSJdOworCWZ3cml0ZSgkZmlsZSwgJGZpZWxkc190eXBlc1skZmllbGRbImZpZWxkIl1dKTsKKwlpZiAoJGZpZWxkWyJsZW5ndGh2YXIiXSAhPSAiLTEiKQorCQlmd3JpdGUoJGZpbGUsICIoIi4kZmllbGRbImxlbmd0aHZhciJdLiIpIik7CisJaWYgKCRmaWVsZFsibm90bnVsbCJdID09ICJ0IikKKwkJZndyaXRlKCRmaWxlLCAiIE5PVCBOVUxMIik7Cit9Citmd3JpdGUoJGZpbGUsICJcbiAtLSApO1xuXG4iKTsKK3BnX2ZyZWVfcmVzdWx0KCRyZXN1bHQpOworCisvKiBOb3csIHRoZSBkYXRhICovCiskcmVzdWx0ID0gcGdfcXVlcnkoJGRiY29ubiwgIlNFTEVDVCAqIEZST00gXCIiLiRUQUJMRS4iXCIiKSBvciBkaWUoJ1F1ZXJ5IGZhaWxlZDogJyAuIHBnX2xhc3RfZXJyb3IoKSAuICJcbiIpOworaWYgKHBnX251bV9yb3dzKCRyZXN1bHQpID4gMCkgeworCWZ3cml0ZSgkZmlsZSwgIklOU0VSVCBJTlRPIFwiIi4kVEFCTEUuIlwiXG4gKFxuIik7CisJJGkgPSBwZ19udW1fZmllbGRzKCRyZXN1bHQpOworCWlmICgkRElTUExBWV9IVE1MICYmICRIVE1MX0hFQURFUlMpIGVjaG8gIjxIVE1MPlxuPEhFQUQ+PFRJVExFPlB1cmdlPC9USVRMRT48L0hFQUQ+XG48Qk9EWT5cbiI7CisJaWYgKCRESVNQTEFZX0hUTUwpIGVjaG8gIjxUQUJMRT5cbiAgPFRSPlxuIjsKKwlmb3IgKCRqID0gMDsgJGogPCAkaTsgJGorKykgeworCSAgICAgIGZ3cml0ZSgkZmlsZSwgKCRqID8gIiwgIiA6ICIiKSAuICJcIiIgLiBwZ19lc2NhcGVfc3RyaW5nKHBnX2ZpZWxkX25hbWUoJHJlc3VsdCwgJGopKS4gIlwiIik7CisJICAgICAgaWYgKCRESVNQTEFZX0hUTUwpIGVjaG8gIiAgICA8VEQ+Ii5odG1sZW50aXRpZXMocGdfZmllbGRfbmFtZSgkcmVzdWx0LCAkaikpLiI8L1REPlxuIjsKKwl9CisJZndyaXRlKCRmaWxlLCAiXG4gKVxuIFZBTFVFUyBcbiIpOworCWlmICgkRElTUExBWV9IVE1MKSBlY2hvICIgIDwvVFI+XG4iOworCSRpID0gMDsKKwl3aGlsZSAoJGxpbmUgPSBwZ19mZXRjaF9hcnJheSgkcmVzdWx0LCBudWxsLCBQR1NRTF9BU1NPQykpIHsKKwkJaWYgKCRpKyspCisJCQlmd3JpdGUoJGZpbGUsICIsXG4iKTsKKwkJZndyaXRlKCRmaWxlLCAiICggIik7CisJCQorCQlpZiAoJERJU1BMQVlfSFRNTCkgZWNobyAiICA8VFI+XG4iOworCQkkaiA9IDA7CisJCSRzcWwgPSAiIjsKKwkJZm9yZWFjaCAoJGxpbmUgYXMgJGYgPT4gJHYpIHsKKwkJCWlmICghaXNfbnVsbCgkdikpCisJCQkJc3dpdGNoICgkZmllbGRzX3R5cGVzWyRmXSkgeworCQkJCQljYXNlICJieXRlYSI6CisJCQkJCQkkdiA9ICJFJyIucGdfZXNjYXBlX2J5dGVhKHBnX3VuZXNjYXBlX2J5dGVhKCR2KSkuIiciOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgInRpbWVzdGFtcCB3aXRoIHRpbWUgem9uZSI6CisJCQkJCQkkdiA9ICJFJyIucGdfZXNjYXBlX3N0cmluZygkdikuIiciOworCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJZWxzZQorCQkJCSR2ID0gIk5VTEwiOworCQkJCisJICAgICAgCQlpZiAoJERJU1BMQVlfSFRNTCkgZWNobyAiICAgIDxURD4iLmh0bWxlbnRpdGllcyhwcmludF9yKCRsaW5lWyRmXSwgVFJVRSkpLiI8L1REPlxuIjsKKworCQkJZndyaXRlKCRmaWxlLCAoJGogPyAiLCAiIDogIiIpIC4gJHYpOworCQkJJHNxbCAuPSAoJGogPyAiIEFORCAiIDogIiIpIC4gIlwiIi5wZ19lc2NhcGVfc3RyaW5nKCRmKS4iXCIgIjsKKwkJCWlmIChpc19udWxsKCRsaW5lWyRmXSkpCisJCQkJJHNxbCAuPSAiIElTIE5VTEwiOworCQkJZWxzZSAKKwkJCQkkc3FsIC49ICIgPSAiIC4gJHY7CisJCQkkaisrOworCQl9CisJCWZ3cml0ZSgkZmlsZSwgIikiKTsKKwkJaWYgKCRESVNQTEFZX0hUTUwpIGVjaG8gIiAgPC9UUj5cbiI7CisJCSRyZXMgPSBwZ19xdWVyeSggIkRFTEVURSBGUk9NIFwiIi4kVEFCTEUuIlwiIFdIRVJFICIuJHNxbCkgb3IgZGllKCdERUxFVEUgcXVlcnkgZmFpbGVkOiAnIC4gcGdfbGFzdF9lcnJvcigpIC4gIlxuIik7CisJCXBnX2ZyZWVfcmVzdWx0KCRyZXMpOworCX0KKwlmd3JpdGUoJGZpbGUsICJcbjtcbiIpOworCWlmICgkRElTUExBWV9IVE1MKSBlY2hvICI8L1RBQkxFPlxuIjsKKwlpZiAoJERJU1BMQVlfSFRNTCAmJiAkSFRNTF9IRUFERVJTKSBlY2hvICI8L0JPRFk+XG48L0hUTUw+XG4iOworICAgICAgICBlbHNlIGVjaG8gJGkuIiByZWNvcmRzIGhhdmUgYmVlbiBzdWNjZXNzZnVsbHkgd3JpdHRlbiB0byAnIi4kRFVNUEZJTEUuIicgYW5kIHJlbW92ZWQgZnJvbSBkYXRhYmFzZS5cbiI7Cit9IGVsc2UgeworCWlmICgkRElTUExBWV9IVE1MKSBlY2hvICI8cD48ZW0+Tm8gbmV3IHJlY29yZCBpbiB0aGUgZGF0YWJhc2U8L2VtPjwvcD5cbiI7CisgICAgICAgIGVsc2UgZWNobyAiTm8gbmV3IHJlY29yZCBpbiB0aGUgZGF0YWJhc2UsIHRoZSBnZW5lcmF0ZWQgZmlsZSBpcyBlbXB0eS5cbiI7Cit9CitwZ19mcmVlX3Jlc3VsdCgkcmVzdWx0KTsKKworLyogQ2xvc2luZyBjb25uZWN0aW9uICovCitwZ19jbG9zZSgkZGJjb25uKTsKKworLyogQ2xvc2luZyB0aGUgZmlsZSAqLworZmNsb3NlKCRmaWxlKTsKKworCis/PgpkaWZmIC0tZ2l0IGEvY29udHJpYi9kZWJpYW4vY2hhbmdlbG9nIGIvY29udHJpYi9kZWJpYW4vY2hhbmdlbG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNmQ5ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2RlYmlhbi9jaGFuZ2Vsb2cKQEAgLTAsMCArMSwyMDkgQEAKK2ZyZWVkaWFtZXRlciAoMS4yLjEpIFVOUkVMRUFTRUQ7IHVyZ2VuY3k9bG93CisKKyAgKiBOZXcgZXh0ZW5zaW9uOiBydF9yYW5kb21pemUgKGxvYWQtYmFsYW5jaW5nIG9uIHBvc3NpYmxlIGRlc3RpbmF0aW9ucykKKyAgKiBOZXcgY29udHJpYjogR3ggZXh0ZW5zaW9uLgorICAqIHJ0X3JlZGlyZWN0LmZkeCBhbmQgcnRfbG9hZF9iYWxhbmNlLmZkeCBpbXByb3ZlbWVudDogdXNlIGEgaGFzaCB0YWJsZS4gVGhhbmtzIFRob21hcy4KKyAgKiBOZXcgaG9vayBIT09LX01FU1NBR0VfU0VORElORyB0byBnaXZlIGEgbGFzdCBjaGFuY2UgdG8gZWRpdCBtZXNzYWdlcyBiZWZvcmUgdGhleSBhcmUgc2VudC4KKyAgICBUaGlzIHdpbGwgYmUgbW9zdGx5IHVzZWQgZm9yIGVuZm9yY2luZyBpbnRlcm9wZXJhYmlsaXR5IGNvbnN0cmFpbnRzIG9uIG5vbi1jb21wbGlhbnQgcGVlcnMuCisgICogU2ltcGxpZmllZCBsb2cgb3V0cHV0LiBPbGQgb3V0cHV0IGNhbiBiZSByZWNvdmVyZWQgd2l0aCBERUJVR19XSVRIX01FVEEgYnVpbGQgb3B0aW9uLgorICAqIFVwZGF0ZWQgdGhlIGludGVybmFsIGNvdW50ZXJzIGZvciBmaW5lciBjb250cm9sIG9uIHRoZSBsb2FkLgorICAqIEZpeGVzIGluIG1lc3NhZ2UgZXhwaXJ5IG1lY2hhbmlzbS4KKyAgKiBCdWcgZml4ZXMgaW4gZXJyb3IgbWVzc2FnZXMgZ2VuZXJhdGlvbiBhbmQgdmFyaW91cyBwYXJ0cy4KKyAgKiBJbXByb3ZlbWVudHMgb24gc2h1dGRvd24gc2VxdWVuY2UgaGFuZGxpbmcuCisgICogSW1wcm92ZW1lbnRzIHRvIHRoZSBkaWN0X2RjY2FfKiBleHRlbnNpb25zLgorICAqIEltcHJvdmVkIGRlZmF1bHQgQ01ha2UgY29uZmlndXJhdGlvbi4KKyAgKiBJbXByb3ZlZCBidWlsZCBmb3IgTWFjT1NYCisgICogRml4ZXMgZm9yIGEgZmV3IG5ld2VyIG9wZXJhdGluZyBzeXN0ZW1zIGNvbXBhdGliaWxpdHkuCisgICogRml4ZWQgZGVmYXVsdCBzZWN1cmUgRGlhbWV0ZXIgcG9ydCBudW1iZXIgNTg2OCBpbnN0ZWFkIG9mNTY1OCAoZXJyYXRhIG9mIFJGQyA2NzMzKQorCisgLS0gU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+ICBTYXQsIDMwIEphbiAyMDE2IDIzOjM4OjAzICswODAwCisKK2ZyZWVkaWFtZXRlciAoMS4yLjApIFVOUkVMRUFTRUQ7IHVyZ2VuY3k9bG93CisKKyAgKiBNYWpvciBjaGFuZ2VzIGluIHRoZSBsb2dnaW5nIHN5c3RlbSB0byBiZSBtb3JlIHN5c2xvZyBhbmQgcHJvZHVjdGlvbiBmcmllbmRseQorICAqIE5ldyBleHRlbnNpb246IGRpY3RfZGNjYV8zZ3BwCisgICogTmV3IGV4dGVuc2lvbjogZGljdF9kY2NhX3N0YXJlbnQgKFN0YXJlbnQgRENDQSB2ZW5kb3Itc3BlY2lmaWMgQVZQcykKKyAgKiBOZXcgZXh0ZW5zaW9uOiBydF9pZ25vcmVfZGggKGhpZGUgbmV0d29yayB0b3BvbG9neSBieSBwcm94eWluZyBEZXN0aW5hdGlvbi1Ib3N0KS4KKyAgKiBOZXcgZXh0ZW5zaW9uOiBydF9sb2FkX2JhbGFuY2UgKGxvYWQgYmFsYW5jZXIgYmFzZWQgb24gcGVuZGluZyBxdWV1ZSBzaXplKS4KKyAgKiBOZXcgZXh0ZW5zaW9uOiBydF9idXN5cGVlcnMuIFNlZSBkb2MvcnRfYnVzeXBlZXJzLmNvbmYuc2FtcGxlLgorICAqIE5ldyBleHRlbnNpb246IGRiZ19tc2dfdGltaW5ncy4gTWVhc3VyZXMgdGltaW5nIG9mIG1lc3NhZ2Ugb3BlcmF0aW9ucy4KKyAgKiBOZXcgZXh0ZW5zaW9uOiBkYmdfbXNnX2R1bXBzLiBVc2UgdG8gY29udHJvbCBob29rcyBkaXNwbGF5LgorICAqIE5ldyBBUEkgKGZkX2hvb2tfKikgZm9yIGV4dGVuc2lvbnMgdG8gY29udHJvbCBtZXNzYWdlcyBsb2dnaW5nICYgcHJvZmlsaW5nCisgICogTmV3IEFQSSAoZmRfc3RhdHNfKikgZm9yIGV4dGVuc2lvbnMgdG8gbW9uaXRvciBmcmFtZXdvcmsgc3RhdGUgKGUuZy4gU05NUCBpbXBsZW0pCisgICogQVBJIGNoYW5nZTogYWxsIHRoZSBmZF8qX2R1bXAgZnVuY3Rpb25zIG5vdyByZXR1cm4gbWFsbG9jJ2Qgc3RyaW5ncyBpbnN0ZWFkIG9mIGxvZ2dpbmcgZGlyZWN0bHkuCisgICogQVBJIGNoYW5nZTogY2FsbGJhY2sgcGFyYW1ldGVyIG9mIGZkX3J0X291dF9yZWdpc3RlciBoYWQgaXRzIHNpZ25hdHVyZSB1cGRhdGVkLgorICAqIFVwZGF0ZWQgZGJnX21vbml0b3JpbmcgZXh0ZW5zaW9uIHRvIHVzZSB0aGUgbmV3IEFQSQorICAqIE5ldyBzY3JpcHQgdG8gZ2VuZXJhdGUgZGljdGlvbmFyeSBleHRlbnNpb25zIGZyb20gb3JnIGZpbGUgKHNlZSBjb250cmliL3Rvb2xzKQorICAqIE5ldyBjb21waWxhdGlvbiBvcHRpb246IFdPUktBUk9VTkRfQUNDRVBUX0lOVkFMSURfVlNBSSB0byBpbXByb3ZlIGNvbXBhdGliaWxpdHkKKyAgICB3aXRoIGludmFsaWQgVmVuZG9yLVNwZWNpZmljLUFwcGxpY2F0aW9uLUlkIEFWUHMgcmVjZWl2ZWQgZnJvbSBzb21lIGVxdWlwbWVudHMgKGUuZy4gQ2lzY28pLgorICAqIE5ldyBjb21waWxhdGlvbiBvcHRpb246IERJU0FCTEVfUEVFUl9FWFBJUlkgZm9yIHVzZSBpbiB0ZXN0IGVudmlyb25tZW50cy4KKyAgKiBFeHRlbnNpb25zIGFyZSBub3cgYWxzbyBzZWFyY2hlZCBpbiBMRF9MSUJSQVJZX1BBVEguCisgICogQ29weSBQcm94eS1JbmZvIEFWUCBhdXRvbWF0aWNhbGx5IGluIG5ldyBhbnN3ZXJzLgorICAqIFBvcnQgdmFsdWUgMCBhbGxvd2VkIGluIGNvbmZpZ3VyYXRpb24gdG8gZGlzYWJsZSBsb2NhbCBzZXJ2ZXIgKGUuZy4gZGlzYWJsZSBub24tc2VjdXJlIHBvcnQpLgorICAqIEFQSSBjaGFuZ2U6IGZkX21zZ19zZW5kX3RpbWVvdXQgbm93IHRha2VzIGEgc2VwYXJhdGUgY2FsbGJhY2sgZm9yIHRpbWVvdXQgc2l0dWF0aW9uLgorICAqIEZ1bmN0aW9uIGNoYW5nZXM6IGZkX21zZ19kdW1wXyogbm93IHNwbGl0IGluIHRocmVlIGRpZmZlcmVudCB0eXBlIG9mIG91dHB1dC4KKyAgKiBOZXcgdGVzdCB0ZXN0bWVzZ19zdHJlc3MgdG8gbWVhc3VyZSBtZXNzYWdlIHBhcnNlciBwZXJmb3JtYW5jZQorICAqIEZpeCB0ZXJtaW5hdGlvbiBvZiB0aGUgZnJhbWV3b3JrIHRvIGF2b2lkIGZhaWx1cmVzLgorICAqIEZpeCBpbnZhbGlkIHRpbWVzcGVjIHZhbHVlIGluIHBlZXIgUFNNIGFwcGVhcmluZyByYW5kb21seSAobGVhZGluZyB0byBjcmFzaCkuCisgICogUmV0dXJuIERJQU1FVEVSX0xPT1BfREVURUNURUQgaWYgbG9jYWwgcGVlciBpbiB0aGUgUm91dGUtUmVjb3JkIGxpc3Qgb2YgYSBtZXNzYWdlLgorICAqIEFsbG93IHJ1bm5pbmcgd2l0aG91dCBUTFMgY29uZmlndXJhdGlvbi4KKyAgKiBVcGdyYWRlZCBTQ1RQIGNvZGUgdG8gY29tcGx5IHdpdGggUkZDIDY0NTgKKyAgKiBVc2luZyBkZWZhdWx0IHNlY3VyZSBEaWFtZXRlciBwb3J0IG51bWJlciA1NjU4IGFzIHBlciBSRkMgNjczMworICAqIFVwZGF0ZWQgVExTIGNvZGUgZm9yIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50cyB3aXRoIG5ldyBHTlUgVExTLgorICAqIEZpeCBpbnRlcmxvY2tpbmcgcHJvYmxlbSB3aGVuIGxhcmdlIG51bWJlciBvZiByZXF1ZXN0cyB3ZXJlIGZhaWxlZCBvdmVyLgorICAqIE5ldyBvcHRpb24gaW4gdGVzdF9hcHAuZmR4IGV4dGVuc2lvbiBmb3IgbG9uZyBtZXNzYWdlcyBwYXlsb2FkLgorICAqIFBlcmZvcm1hbmNlIGltcHJvdmVtZW50IGluIG1lc3NhZ2Ugc2VuZGluZyBjb2RlIHBhdGguCisKKyAtLSBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4gIFNhdCwgMTQgU2VwIDIwMTMgMTg6MDg6MDcgKzA4MDAKKworZnJlZWRpYW1ldGVyICgxLjEuNikgVU5SRUxFQVNFRDsgdXJnZW5jeT1sb3cKKworICAqIEZpeCBtYWpvciBpc3N1ZSBpbiAxLjEuNSBwcmV2ZW50aW5nIHRvIHNlbmQgYW5zd2VycyB0byBhIHJlY2VpdmVkIG1lc3NhZ2UuCisgICogTmV3IGNvbW1hbmQtbGluZSBvcHRpb246IC0tZW5hYmxlX21zZ19sb2c9KCBEUk9QUEVEIHwgUkVDRUlWRUQgfCBTRU5UIHwgTk9ERUxJVkVSIHwgVElNSU5HICkKKyAgKiBJbXByb3ZlZCBwYXJzaW5nIGVycm9yIGhhbmRsaW5nIGFuZCBGYWlsZWQtQVZQIGdlbmVyYXRpb24uCisgICogQWRkZWQgc3VwcG9ydCBmb3Igc29tZSB0aW1pbmdzIG1lYXN1cmVtZW50cyBpbiBmcmVlRGlhbWV0ZXIgKGluIHRoZSBsb2dzKQorICAqIEZpeCBwb3J0IGhhbmRsaW5nIHdoZW4gdXNpbmcgbm9uLWRlZmF1bHQgcG9ydC4KKyAgKiBTb21lIGNsZWFudXBzIGluIHNldmVyYWwgZGljdGlvbmFyeSBmaWxlcy4KKyAgKiBOZXcgb3B0aW9uIHRvIGZkX2RpY3Rfc2VhcmNoOiBBVlBfQllfU1RSVUNUCisgICogSW1wcm92ZWQgY29tcGF0aWJpbGl0eSB3aXRoIEMrKyBjb21waWxlcnMuCisgICogQ2xlYW51cHMgaW4gc2Vzc2lvbnMgY3JlYXRpb24vZGVzdHJ1Y3Rpb24gdG8gYXZvaWQgbWVtb3J5IGNvcnJ1cHRpb24gdW5kZXIgc3RyZXNzLgorICAqIEFkZCBzdXBwb3J0IGZvciAiaW5jbHVkZSIgZGlyZWN0aXZlIGluIGZyZWVEaWFtZXRlci5jb25mIGZpbGUuCisKKyAtLSBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4gIFN1biwgMDMgTWFyIDIwMTMgMDc6NDA6NDMgKzAxMDAKKworZnJlZWRpYW1ldGVyICgxLjEuNSkgVU5SRUxFQVNFRDsgdXJnZW5jeT1sb3cKKworICAqIEFkZGVkIGNvbXBhdGliaWxpdHkgd2l0aCBNQUMgT1MgWAorICAqIEZpeCBiZWhhdmlvciBvZiB0aW1lb3V0IHdoZSBuc2VuZGluZyBtZXNzYWdlcyB0byBhbGxvdyByZS1zZW5kLgorICAqIFNldmVyYWwgY2xlYW51cHMgYW5kIG5ldyBjb250cmlidXRpb25zIGluY2x1ZGVkLgorICAqIEFkZGVkIGRlcGVuZGVuY3kgb24gQysrIGNvbXBpbGVyIGZvciBDTWFrZUxpc3RzLnR4dAorCisgLS0gU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+ICBTYXQsIDAzIE5vdiAyMDEyIDE3OjU4OjExICswMTAwCisKK2ZyZWVkaWFtZXRlciAoMS4xLjQpIFVOUkVMRUFTRUQ7IHVyZ2VuY3k9bG93CisKKyAgKiBDb21wYXRpYmlsaXR5IHdpdGggR251VExTIDMueCB2ZXJzaW9ucyAvIHVwZGF0ZWQgcGFja2FnaW5nIGZpbGVzIGFjY29yZGluZ2x5CisgICogRml4IGNyYXNoIG9uIFNwYXJjIDY0IChwb3NzaWJseSBvdGhlciA2NGIgbWFjaGluZXMpCisgICogVXBkYXRlZCBkaWN0X2RjY2EgaW4gZXh0ZW5zaW9ucyBhbmQgY29udHJpYiAodGhhbmtzIEtvbnN0YW50aW4pCisgICogQ2hhbmdlZCBkdW1waW5nIG9mIG1lc3NhZ2VzIHRvIGF2b2lkIGludGVybGVhdmVkIGluZm9ybWF0aW9uCisKKyAtLSBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4gIEZyaSwgMjQgQXVnIDIwMTIgMDA6MTc6MDUgKzAyMDAKKworZnJlZWRpYW1ldGVyICgxLjEuMykgVU5SRUxFQVNFRDsgdXJnZW5jeT1sb3cKKworICAqIEZpeGVkIGEgbWVtb3J5IGxlYWsKKyAgKiBDbGVhbi11cCBvZiBzb21lIGV4dGVuc2lvbnMKKworIC0tIFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PiAgVHVlLCAwMyBKdWwgMjAxMiAwODoxNTo0OSArMDIwMAorCitmcmVlZGlhbWV0ZXIgKDEuMS4yKSBVTlJFTEVBU0VEOyB1cmdlbmN5PWxvdworCisgICogRklGTyBxdWV1ZXMgYXJlIG5vdyBjYXBwZWQgdG8gYXZvaWQgbWVtb3J5IGV4aGF1c3Rpb24uCisgICogQ2xlYW51cHMgaW4gTUlQdjYgZGljdGlvbmFyaWVzLgorICAqIGFwcF9hY2N0IHVwZ3JhZGVkOiBlbmFibGVkIHZlbmRvci1zcGVjaWZpYyBBVlAgbG9nZ2luZywgdGhyZWFkLXNhZmUgdmVyc2lvbi4KKyAgKiBOZXcgZnVuY3Rpb246IGZkX2RpY3RfZ2V0bGlzdG9mIHRvIGxpc3QgZGljdGlvbmFyeSBjb250ZW50cy4KKyAgKiBOZXcgZnVuY3Rpb246IGZkX2RpY3RfZGVsZXRlIHRvIHJlbW92ZSBhbiBlbnRyeSAoZGFuZ2Vyb3VzIGZ1bmN0aW9uISkKKyAgKiBOZXcgZnVuY3Rpb246IGZkX3Nlc3NfZ2V0Y291bnQgdG8gZ2V0IGNvdW50IG9mIHNlc3Npb24gb2JqZWN0cy4KKyAgKiBBIGZldyBhZGRpdGlvbmFsIGJ1ZyBmaXhlcywgY2hlY2sgaGcgbG9nIGZvciBkZXRhaWxzLgorCisgLS0gU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+ICBUdWUsIDIxIEZlYiAyMDEyIDE4OjM4OjEwICswMTAwCisKK2ZyZWVkaWFtZXRlciAoMS4xLjEpIFVOUkVMRUFTRUQ7IHVyZ2VuY3k9bG93CisKKyAgKiBCdWcgZml4IHJlbGVhc2UKKyAgKiBTdXBwb3J0cyBuZXdlciBHTlVUTFMgdmVyc2lvbnMKKyAgKiBBbGxvdyBlbXB0eSBPY3RldFN0cmluZyBBVlBzIChsPTApCisgICogQWxsb3cgdHdvIGluc3RhbmNlcyBvZiBmcmVlRGlhbWV0ZXIgb24gYSBzaW5nbGUgaG9zdC4KKworIC0tIFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BuaWN0LmdvLmpwPiAgRnJpLCAzMCBTZXAgMjAxMSAyMTo1Njo1MCArMDIwMAorCitmcmVlZGlhbWV0ZXIgKDEuMS4wKSBVTlJFTEVBU0VEOyB1cmdlbmN5PWxvdworCisgICogU291cmNlIHBhY2thZ2UgcmVzdHJ1Y3R1cmVkLiBNb3N0IG9mIHRoZSAKKyAgICBmcmFtZXdvcmsgbm93IGNvbnRhaW5lZCBpbiB0aGUgbGliZmRjb3JlIGxpYnJhcnkuCisgICAgbGliZnJlZURpYW1ldGVyIHJlbmFtZWQgYXMgbGliZmRwcm90by4KKyAgICBUaGlzIGNsb3NlcyAjMTUuCisgICogQVBJIHZlcnNpb24gYnVtcGVkIHRvIHZlcnNpb24gNC4KKyAgKiBJbXByb3ZlZCBmZF9kaWN0X25ldygpIHdoZW4gdGhlIHNhbWUgb2JqZWN0IGFscmVhZHkgZXhpc3RzLgorICAqIEltcHJvdmVtZW50cyB0byBkaWN0X2xlZ2FjeV94bWwgZXh0ZW5zaW9uLgorICAqIENsZWFudXBzIGluIGxpbmtzIHRvIHNoYXJlZCBsaWJyYXJpZXMKKyAgKiAoYXBwX3JhZGd3LmZkeCkgQmV0dGVyIGhhbmRsaW5nIGNvbnZlcnNpb24gb2YgREVBIHdpdGggZXJyb3Igc3RhdHVzCisgICAgdG8gUkFESVVTIChjbG9zZXMgIzI1KQorICAqIEFsbG93IGRlZmF1bHQgc2lnbmFscyBzdWNoIGFzIFNJR1RTVFAgKGN0cmwteikgdG8gYmUgdXNlZCB3aXRoCisgICAgZnJlZURpYW1ldGVyZAorICAqIEltcHJvdmVkIERpYW1ldGVySWRlbnRpdHkgaGFuZGxpbmcgKGVzcC4gaW50ZXJhdGlvbmFsaXphdGlvbiBpc3N1ZXMpLCAKKyAgICBhbmQgaW1wcm92ZSBlZmZpY2llbmN5IG9mIHNvbWUgc3RyaW5nIG9wZXJhdGlvbnMgaW4gcGVlcnMsIHNlc3Npb25zLCAKKyAgICBhbmQgZGljdGlvbmFyeSBtb2R1bGVzIChjbG9zZXMgIzcpCisgICogQ2xlYW51cCBpbiB0aGUgc2Vzc2lvbiBtb2R1bGUgdG8gZnJlZSBvbmx5IHVucmVmZXJlbmNlZCBzZXNzaW9ucyAoIzE2KQorICAqIFJlbW92ZWQgZmRfY3B1X2ZsdXNoX2NhY2hlKCksIHJlcGxhY2VkIGJ5IG1vcmUgcm9idXN0IGFsdGVybmF0aXZlcy4KKyAgKiBJbXByb3ZlZCBwZWVyIHN0YXRlIG1hY2hpbmUgYWxnb3JpdGhtIHRvIGNvdW50ZXIgU0NUUCBtdWx0aXN0cmVhbSByYWNlIAorICAgIGNvbmRpdGlvbi4KKyAgKiBOZXcgZXh0ZW5zaW9uIHJ0X3JlZGlyZWN0LmZkeCB0aGF0IGhhbmRsZXMgdGhlIERpYW1ldGVyIFJlZGlyZWN0IGVycm9ycy4KKyAgKiBOZXcgZXh0ZW5zaW9uIGFwcF9yZWRpcmVjdCB0aGF0IGFsbG93cyBzZW5kaW5nIFJlZGlyZWN0IGluZGljYXRpb25zIHRvIAorICAgIG90aGVyIHBlZXJzLiBTZWUgZG9jL2FwcF9yZWRpcmVjdC5jb25mLnNhbXBsZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAgKiBBZGRlZCBpbmNvbXBsZXRlIGRpY3Rpb25hcnkgZXh0ZW5zaW9uIGZvciByZmM0MDA2IChEQ0NBKSwgY291cnRlc3kKKyAgICBvZiBLb25zdGFudGluIENoZWt1c2hpbiA8a29jaEBsbXQubHY+CisKKyAtLSBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4gIFR1ZSwgMjkgTWFyIDIwMTEgMTA6NDE6MTkgKzA5MDAKKworZnJlZWRpYW1ldGVyICgxLjAuNCkgVU5SRUxFQVNFRDsgdXJnZW5jeT1sb3cKKworICAqIEFkZGVkIG5ldyBBUEkgdG8gc3BlY2lmeSB0aW1lb3V0IG9uIHJlY2VpdmluZyBhbnN3ZXIgKCMxMCkgCisgICogQnVtcGVkIEFQSSB2ZXJzaW9uIG51bWJlciBhY2NvcmRpbmdseS4KKyAgKiBOZXcgdGVzdF9uZXRlbXVsIGV4dGVuc2lvbiAoc2ltcGxlIG5ldHdvcmsgZW11bGF0b3IgcHJveHkpCisgICogSW1wcm92ZWQgQVBJIGNvbXBhdGliaWxpdHkgdG8gQysrIGNvbXBpbGVycworCisgLS0gU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQG5pY3QuZ28uanA+ICBUdWUsIDExIEphbiAyMDExIDEyOjI4OjIyICswOTAwCisKK2ZyZWVkaWFtZXRlciAoMS4wLjMpIFVOUkVMRUFTRUQ7IHVyZ2VuY3k9bG93CisKKyAgKiBGaXhlZCBhIGNvdXBsZSBvZiBpc3N1ZXMgZm9yIHBvcnRhYmlsaXR5ICgjMjEsICMyMiwgIzIzKQorICAqIEZpeGVkIGlzc3VlIHdpdGggTGlzdGVuT24gYml0IG9yZGVyaW5nICgjMjApCisgICogQWRkZWQgZGljdGlvbmFyeSBzdXBwb3J0IGZvciBNSVB2NiBhcHBsaWNhdGlvbiBvYmplY3RzLgorICAqIEFkZGVkIGRpY3Rpb25hcnkgc3VwcG9ydCBmb3IgbGVnYWN5IFhNTCBmaWxlcy4KKyAgKiBBZGRlZCBweXRob24gaW50ZXJmYWNlIGRiZ19pbnRlcmFjdGl2ZSAoZXhwZXJpbWVudGFsKS4gCisgICogQWRkZWQgcGFyYW1ldGVycyB0byBmZF9kaXNwX3JlZ2lzdGVyKCkgYW5kIGZkX3Nlc3NfaGFuZGxlcl9jcmVhdGUoKSwKKyAgICBCdW1wZWQgQVBJIHZlcnNpb24gbnVtYmVyIGFjY29yZGluZ2x5LgorCisgLS0gU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQG5pY3QuZ28uanA+ICBUdWUsIDE0IERlYyAyMDEwIDExOjM5OjI5ICswOTAwCisKK2ZyZWVkaWFtZXRlciAoMS4wLjIpIFVOUkVMRUFTRUQ7IHVyZ2VuY3k9bG93CisKKyAgKiBGaXggYW4gaXNzdWUgaW4gYXBwX2RpYW1lYXAuZmR4IHdpdGggdXNlciBuYW1lcyAoIzE4KQorICAqIEFsbG93IERIIHBhcmFtZXRlcnMgbG9hZGVkIGZyb20gYSBmaWxlICgjMTcpIAorICAqIEZpeGVkIGEgZmV3IGNvbXBpbGF0aW9uIHdhcm5pbmdzIG9uIDY0Yml0cyBhcmNoaXRlY3R1cmVzLgorICAqIE5ldyBBTExfRVhURU5TSU9OUyBidWlsZCBvcHRpb24uCisKKyAtLSBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAbmljdC5nby5qcD4gIFdlZCwgMjcgT2N0IDIwMTAgMTE6MTc6MzIgKzA5MDAKKworZnJlZWRpYW1ldGVyICgxLjAuMSkgVU5SRUxFQVNFRDsgdXJnZW5jeT1sb3cKKworICAqIGFwcF9hY2N0LmZkeDogbmV3IHNldCBvZiBQSFAgc2NyaXB0cyBhdmFpbGFibGUgaW4gc291cmNlCisgICAgY29udHJpYi9hcHBfYWNjdF90b29scworICAqIGFwcF9hY2N0LmZkeDogbmV3IGRpcmVjdGl2ZSAnU2VydmVyX25hbWVfZmllbGQnIGluIHRoZQorICAgIGNvbmZpZ3VyYXRpb24uCisgICogYXBwX3JhZGd3LmZkeDogbmV3IGRpcmVjdGl2ZSAnbm9uYWknIGluIGFjY3QgYW5kIGF1dGggcGx1Z2lucyB0bworICAgIGRpc2FibGUgTkFJIHByb2Nlc3NpbmcuCisgICogYXBwX3JhZGd3LmZkeDogTmV3IHN1cHBvcnQgZm9yIFJBRElVUyBwcm94aWVzLgorICAqIGFwcF9yYWRndy5mZHg6IG1hbnkgYnVnIGZpeGVzLgorICAqIGRhZW1vbjogQ2hlY2sgdGhlIGxvY2FsIGNlcnRpZmljYXRlIGlzIHZhbGlkIGR1cmluZyBUTFMKKyAgICBpbml0aWFsaXphdGlvbi4KKyAgKiBkYWVtb246IEZpeGVkIGlzc3VlIGZvciBJUCBhZGRyZXNzZXMgaW4gdGhlIGZvcm0geC54LnguMjM1CisgICogZGFlbW9uOiBuZXcgb3B0aW9uIC0tZGJnX2dudXRscyB0byBnZXQgR05VVExTIGRlYnVnIG1lc3NhZ2VzLgorICAqIGRlYmlhbjogc29tZSBjbGVhbnVwcyBpbiB0aGUgcGFja2FnaW5nIChkZXBlbmRlbmNpZXMsIG1ldGEtZGF0YSkKKyAgKiBydF9lcmVnLmZkeDogTmV3IHJvdXRpbmcgZXh0ZW5zaW9uIGJhc2VkIG9uIHJlZ3VsYXIgZXhwcmVzc2lvbgorICAgIG1hdGNoaW5nIGluIHBhY2thZ2UgZnJlZWRpYW1ldGVyLWRhZW1vbi4KKworIC0tIFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BuaWN0LmdvLmpwPiAgV2VkLCAxNSBTZXAgMjAxMCAxODozMDoyOCArMDkwMAorCitmcmVlZGlhbWV0ZXIgKDEuMC4wLTIpIGV4cGVyaW1lbnRhbDsgdXJnZW5jeT1sb3cKKworICAqIE9mZmljaWFsIHJlbGVhc2UgMS4wLjAgCisKKyAtLSBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAbmljdC5nby5qcD4gIFRodSwgMjkgSnVsIDIwMTAgMTc6Mjc6MTMgKzA5MDAKKworZnJlZWRpYW1ldGVyICgxLjAuMC0xKSBleHBlcmltZW50YWw7IHVyZ2VuY3k9bG93CisKKyAgKiBJbml0aWFsIFJlbGVhc2UuCisgIAorIC0tIFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BuaWN0LmdvLmpwPiAgV2VkLCAxOSBNYXkgMjAxMCAxNTozNjo1NCArMDkwMApkaWZmIC0tZ2l0IGEvY29udHJpYi9kZWJpYW4vY29tcGF0IGIvY29udHJpYi9kZWJpYW4vY29tcGF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmOGYwMTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2RlYmlhbi9jb21wYXQKQEAgLTAsMCArMSBAQAorNwpkaWZmIC0tZ2l0IGEvY29udHJpYi9kZWJpYW4vY29udHJvbCBiL2NvbnRyaWIvZGViaWFuL2NvbnRyb2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE5ZTEwZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvZGViaWFuL2NvbnRyb2wKQEAgLTAsMCArMSwyMjkgQEAKK1NvdXJjZTogZnJlZWRpYW1ldGVyCitTZWN0aW9uOiBjb250cmliL25ldAorUHJpb3JpdHk6IGV4dHJhCitNYWludGFpbmVyOiBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4KK0J1aWxkLURlcGVuZHM6IGRlYmhlbHBlciAoID49IDcuMy45KSwKKyBjbWFrZSwgbWFrZSwgZ2NjLCBnKyssIGJpc29uLCBmbGV4LAorIGxpYnNjdHAtZGV2LCBsaWJnbnV0bHMtZGV2IHwgZ251dGxzLWRldiwgbGliaWRuMTEtZGV2LAorIGxpYnBxLWRldiwgbGlibXlzcWxjbGllbnQtZGV2LCBsaWJ4bWwyLWRldiwgc3dpZywgcHl0aG9uLWRldiwKKyBsaWJnY3J5cHQxMS1kZXYgfCBsaWJnY3J5cHQyMC1kZXYKK1N0YW5kYXJkcy1WZXJzaW9uOiAzLjguMworSG9tZXBhZ2U6IGh0dHA6Ly93d3cuZnJlZWRpYW1ldGVyLm5ldAorCitQYWNrYWdlOiBmcmVlZGlhbWV0ZXItY29tbW9uCitBcmNoaXRlY3R1cmU6IGFueQorRGVwZW5kczogJHtzaGxpYnM6RGVwZW5kc30sICR7bWlzYzpEZXBlbmRzfQorRGVzY3JpcHRpb246IFRoZSBmcmVlRGlhbWV0ZXIgbGlicmFyaWVzLgorIFRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgZnJlZURpYW1ldGVyIGZyYW1ld29yayBjb3JlIGxpYnJhcmllcywgCisgcmVxdWlyZWQgYnkgYWxsIGZyZWVEaWFtZXRlciBjb21wb25lbnRzLgorIEl0IG1heSBhbHNvIGJlIHVzZWZ1bCBmb3Igb3RoZXIgcHJvamVjdHMgd2hpY2ggbmVlZCB0byAKKyBwZXJmb3JtIG9wZXJhdGlvbnMgb24gRGlhbWV0ZXIgbWVzc2FnZXMuIAorIC4KKyBUaGUgZnJlZURpYW1ldGVyIGZyYW1ld29yayBwcm92aWRlcyBzdXBwb3J0IGZvciB0aGUgRGlhbWV0ZXIKKyBCYXNlIFByb3RvY29sLiBXaXRob3V0IGFueSBleHRlbnNpb24sIHRoZSBmcmFtZXdvcmsgY2FuIG9ubHkKKyBiZSB1c2VkIGFzIGEgRGlhbWV0ZXIgcm91dGluZyBhZ2VudC4gWW91IHByb2JhYmx5IHdhbnQgdG8gCisgaW5zdGFsbCBzb21lIGZyZWVEaWFtZXRlciBleHRlbnNpb24ocykgdG8gZXh0ZW5kIGl0cyAKKyBmZWF0dXJlcywgYW5kIGFsc28gdGhlIGZyZWVkaWFtZXRlci1kYWVtb24gcGFja2FnZSB0aGF0Cisgd2lsbCBpbml0aWFsaXplIHRoZSBmcmFtZXdvcmsgZm9yIHlvdS4KKyAuCisgU2VlICdmcmVlRGlhbWV0ZXItZGV2JyBwYWNrYWdlIHRvIHJldHJpZXZlIHRoZSBBUEkgZm9yIHRoZSBsaWJyYXJ5LgorCitQYWNrYWdlOiBmcmVlZGlhbWV0ZXItZGV2CitBcmNoaXRlY3R1cmU6IGFueQorU2VjdGlvbjogY29udHJpYi9kZXZlbAorRGVwZW5kczogZnJlZWRpYW1ldGVyLWNvbW1vbiAoPSAke2JpbmFyeTpWZXJzaW9ufSksIGxpYnNjdHAtZGV2LCBsaWJnbnV0bHMtZGV2LCBsaWJnY3J5cHQtZGV2CitEZXNjcmlwdGlvbjogVGhpcyBwYWNrYWdlIHByb3ZpZGVzIHRoZSBkZXZlbG9wbWVudCBmaWxlcyBmb3IgZnJlZURpYW1ldGVyLgorCitQYWNrYWdlOiBmcmVlZGlhbWV0ZXItZGFlbW9uCitBcmNoaXRlY3R1cmU6IGFueQorRGVwZW5kczogJHtzaGxpYnM6RGVwZW5kc30sICR7bWlzYzpEZXBlbmRzfSwgZnJlZWRpYW1ldGVyLWNvbW1vbiAoPSAke2JpbmFyeTpWZXJzaW9ufSkKK1N1Z2dlc3RzOiBzc2wtY2VydCwgZnJlZWRpYW1ldGVyLWRpY3Rpb25hcnktcmZjNDAwNSwgZnJlZWRpYW1ldGVyLWRpY3Rpb25hcnktcmZjNDA3MiwgZnJlZWRpYW1ldGVyLWRpY3Rpb25hcnktcmZjNDc0MCwKKyAgZnJlZWRpYW1ldGVyLWRpY3Rpb25hcnktbWlwNiwgZnJlZWRpYW1ldGVyLWRpY3Rpb25hcnktbGVnYWN5CitEZXNjcmlwdGlvbjogVGhlIGZyZWVEaWFtZXRlciBkYWVtb24uIAorIFRoaXMgZGFlbW9uIGlzIGEgc2ltcGxlIGxvYWRlciBmb3IgdGhlIGZyZWVEaWFtZXRlciBmcmFtZXdvcmsuCisgSXQgaXMgc2hpcHBlZCB3aXRoIGEgc21hbGwgc2V0IG9mIGV4dGVuc2lvbnMsIGZvcgorIGV4YW1wbGUgdG8gY29uZmlndXJlIHRoZSByb3V0aW5nIGJlaGF2aW9yLiBTZWUgdGhlIAorIGV4YW1wbGVzIGluIC91c3Ivc2hhcmUvZnJlZWRpYW1ldGVyKiBmb3IgbW9yZSBkZXRhaWxzLgorCitQYWNrYWdlOiBmcmVlZGlhbWV0ZXItZGVidWctdG9vbHMKK0FyY2hpdGVjdHVyZTogYW55CitTZWN0aW9uOiBjb250cmliL2RlYnVnCitEZXBlbmRzOiAke21pc2M6RGVwZW5kc30sIGZyZWVkaWFtZXRlci1jb21tb24gKD0gJHtiaW5hcnk6VmVyc2lvbn0pCitTdWdnZXN0czogcHl0aG9uLCBsaWJteXNxbGNsaWVudDE2IHwgbGlibXlzcWxjbGllbnQxOAorRGVzY3JpcHRpb246IGZyZWVEaWFtZXRlciBkZWJ1ZyB0b29scy4KKyBUaGlzIHBhY2thZ2UgcHJvdmlkZXMgdXNlZnVsIHRvb2xzIHRvIGhlbHAgdHJhY2tpbmcgCisgcHJvYmxlbXMgaW4gZnJlZURpYW1ldGVyIGluc3RhbGxhdGlvbi4gRm9yIGV4YW1wbGUsCisgdGhlIGRiZ19pbnRlcmFjdGl2ZS5mZHggZXh0ZW5zaW9uIGFsbG93cyBhY2Nlc3MgdG8gdGhlIAorIGZyYW1ld29yayB2aWEgYSBweXRob24gaW50ZXJwcmV0ZXIgY29uc29sZS4gIAorCitQYWNrYWdlOiBmcmVlZGlhbWV0ZXItZGljdGlvbmFyeS1yZmM0MDA1CitBcmNoaXRlY3R1cmU6IGFueQorRGVwZW5kczogJHttaXNjOkRlcGVuZHN9LCBmcmVlZGlhbWV0ZXItY29tbW9uICg9ICR7YmluYXJ5OlZlcnNpb259KQorRGVzY3JpcHRpb246IFJGQzQwMDUgKE5BU1JFUSkgZGljdGlvbmFyeSBzdXBwb3J0LgorIFRoaXMgZnJlZURpYW1ldGVyIGV4dGVuc2lvbiBwcm92aWRlcyB0aGUgZGljdGlvbmFyeSBzdXBwb3J0CisgZm9yIGNvbW1hbmRzIGFuZCBBVlAgZGVmaW5lZCBpbiBSRkM0MDA1IChOQVNSRVEpLgorIC4KKyBJbiBvcmRlciB0byB1c2UgdGhpcyBleHRlbnNpb24sIHlvdXIgbWFpbiBmcmVlRGlhbWV0ZXIgCisgY29uZmlndXJhdGlvbiBmaWxlIG11c3QgY29udGFpbiBhIExvYWRFeHRlbnNpb24gZGlyZWN0aXZlLiAKKyBTZWUgZnJlZURpYW1ldGVyIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgZGV0YWlscy4gCisgLgorIFRoaXMgZXh0ZW5zaW9uIGRvZXMgbm90IHJlcXVpcmUgYSBjb25maWd1cmF0aW9uIGZpbGUuCisKK1BhY2thZ2U6IGZyZWVkaWFtZXRlci1kaWN0aW9uYXJ5LXJmYzQwMDYKK0FyY2hpdGVjdHVyZTogYW55CitEZXBlbmRzOiAke21pc2M6RGVwZW5kc30sIGZyZWVkaWFtZXRlci1jb21tb24gKD0gJHtiaW5hcnk6VmVyc2lvbn0pCitEZXNjcmlwdGlvbjogUkZDNDAwNiAoRENDQSkgZGljdGlvbmFyeSBzdXBwb3J0IChpbmNvbXBsZXRlKS4KKyBUaGlzIGZyZWVEaWFtZXRlciBleHRlbnNpb24gcHJvdmlkZXMgdGhlIGRpY3Rpb25hcnkgc3VwcG9ydAorIGZvciBjb21tYW5kcyBhbmQgQVZQIGRlZmluZWQgaW4gUkZDNDAwNiAoRENDQSkuCisgLgorIEluIG9yZGVyIHRvIHVzZSB0aGlzIGV4dGVuc2lvbiwgeW91ciBtYWluIGZyZWVEaWFtZXRlciAKKyBjb25maWd1cmF0aW9uIGZpbGUgbXVzdCBjb250YWluIGEgTG9hZEV4dGVuc2lvbiBkaXJlY3RpdmUuIAorIFNlZSBmcmVlRGlhbWV0ZXIgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLiAKKyAuCisgVGhpcyBleHRlbnNpb24gZG9lcyBub3QgcmVxdWlyZSBhIGNvbmZpZ3VyYXRpb24gZmlsZS4KKyAuCisgQ3VycmVudGx5IHRoaXMgZXh0ZW5zaW9uIGlzIG5vdCBjb21wbGV0ZTogb25seSBBVlAgZGVmaW5pdGlvbnMgCisgYXJlIGluY2x1ZGVkLiBTZWUgdGhlIHNvdXJjZSBmaWxlIGZvciBtb3JlIGRldGFpbHMuCisKK1BhY2thZ2U6IGZyZWVkaWFtZXRlci1kaWN0aW9uYXJ5LXJmYzQwNzIKK0FyY2hpdGVjdHVyZTogYW55CitEZXBlbmRzOiAke21pc2M6RGVwZW5kc30sIGZyZWVkaWFtZXRlci1jb21tb24gKD0gJHtiaW5hcnk6VmVyc2lvbn0pLCBmcmVlZGlhbWV0ZXItZGljdGlvbmFyeS1yZmM0MDA1ICg9ICR7YmluYXJ5OlZlcnNpb259KQorRGVzY3JpcHRpb246IFJGQzQwNzIgKERpYW1ldGVyIEVBUCkgZGljdGlvbmFyeSBzdXBwb3J0LgorIFRoaXMgZnJlZURpYW1ldGVyIGV4dGVuc2lvbiBwcm92aWRlcyB0aGUgZGljdGlvbmFyeSBzdXBwb3J0CisgZm9yIGNvbW1hbmRzIGFuZCBBVlAgZGVmaW5lZCBpbiBSRkM0MDcyIChEaWFtZXRlciBFQVApLgorIC4KKyBJbiBvcmRlciB0byB1c2UgdGhpcyBleHRlbnNpb24sIHlvdXIgbWFpbiBmcmVlRGlhbWV0ZXIgCisgY29uZmlndXJhdGlvbiBmaWxlIG11c3QgY29udGFpbiBhIExvYWRFeHRlbnNpb24gZGlyZWN0aXZlLiAKKyBTZWUgZnJlZURpYW1ldGVyIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgZGV0YWlscy4gCisgLgorIFRoaXMgZXh0ZW5zaW9uIGRvZXMgbm90IHJlcXVpcmUgYSBjb25maWd1cmF0aW9uIGZpbGUuCisKK1BhY2thZ2U6IGZyZWVkaWFtZXRlci1kaWN0aW9uYXJ5LXJmYzQ3NDAKK0FyY2hpdGVjdHVyZTogYW55CitEZXBlbmRzOiAke21pc2M6RGVwZW5kc30sIGZyZWVkaWFtZXRlci1jb21tb24gKD0gJHtiaW5hcnk6VmVyc2lvbn0pCitEZXNjcmlwdGlvbjogUkZDNDc0MCAoRGlhbWV0ZXIgU0lQKSBkaWN0aW9uYXJ5IHN1cHBvcnQuCisgVGhpcyBmcmVlRGlhbWV0ZXIgZXh0ZW5zaW9uIHByb3ZpZGVzIHRoZSBkaWN0aW9uYXJ5IHN1cHBvcnQKKyBmb3IgY29tbWFuZHMgYW5kIEFWUCBkZWZpbmVkIGluIFJGQzQ3NDAgKERpYW1ldGVyIFNJUCkuCisgLgorIEluIG9yZGVyIHRvIHVzZSB0aGlzIGV4dGVuc2lvbiwgeW91ciBtYWluIGZyZWVEaWFtZXRlciAKKyBjb25maWd1cmF0aW9uIGZpbGUgbXVzdCBjb250YWluIGEgTG9hZEV4dGVuc2lvbiBkaXJlY3RpdmUuIAorIFNlZSBmcmVlRGlhbWV0ZXIgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLiAKKyAuCisgVGhpcyBleHRlbnNpb24gZG9lcyBub3QgcmVxdWlyZSBhIGNvbmZpZ3VyYXRpb24gZmlsZS4KKworUGFja2FnZTogZnJlZWRpYW1ldGVyLWRpY3Rpb25hcnktbWlwNgorQXJjaGl0ZWN0dXJlOiBhbnkKK0RlcGVuZHM6ICR7bWlzYzpEZXBlbmRzfSwgZnJlZWRpYW1ldGVyLWNvbW1vbiAoPSAke2JpbmFyeTpWZXJzaW9ufSkKK0Rlc2NyaXB0aW9uOiBEaWFtZXRlciBNb2JpbGUgSVB2NiBhcHBsaWNhdGlvbiBkaWN0aW9uYXJ5IHN1cHBvcnQuCisgVGhpcyBwYWNrYWdlIGNvbnRhaW5zIGEgc2V0IG9mIGV4dGVuc2lvbnMgdG8gcHJvdmlkZSB0aGUgc3VwcG9ydAorIGZvciBjb21tYW5kcyBhbmQgQVZQIGRlZmluZWQgaW4gc2V2ZXJhbCBSRkNzIHJlbGF0ZWQgdG8KKyBEaWFtZXRlciBNSVB2Ni4gSXQgaXMgc3BsaXQgaXMgc2V2ZXJhbCBleHRlbnNpb25zOgorIG1pcDZhLCBtaXA2aSwgbmFzLW1pcHY2LCByZmM1Nzc3LgorIC4KKyBJbiBvcmRlciB0byB1c2UgdGhlc2UgZXh0ZW5zaW9ucywgeW91ciBtYWluIGZyZWVEaWFtZXRlciAKKyBjb25maWd1cmF0aW9uIGZpbGUgbXVzdCBjb250YWluIExvYWRFeHRlbnNpb24gZGlyZWN0aXZlcy4gCisgU2VlIGZyZWVEaWFtZXRlciBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGRldGFpbHMuIAorIC4KKyBUaGVzZSBleHRlbnNpb25zIGRvIG5vdCByZXF1aXJlIGEgY29uZmlndXJhdGlvbiBmaWxlLgorCitQYWNrYWdlOiBmcmVlZGlhbWV0ZXItZGljdGlvbmFyeS1sZWdhY3kKK0FyY2hpdGVjdHVyZTogYW55CitEZXBlbmRzOiAke21pc2M6RGVwZW5kc30sIGZyZWVkaWFtZXRlci1jb21tb24gKD0gJHtiaW5hcnk6VmVyc2lvbn0pLCBsaWJ4bWwyCitEZXNjcmlwdGlvbjogTGVnYWN5IFhNTCBkaWN0aW9uYXJ5IGZpbGVzIHN1cHBvcnQuCisgVGhpcyBmcmVlRGlhbWV0ZXIgZXh0ZW5zaW9uIGFsbG93cyB0aGUgdXNlIG9mIFhNTCBkaWN0aW9uYXJ5CisgZmlsZXMgd2l0aCB0aGUgZnJlZURpYW1ldGVyIGZyYW1ld29yay4gUGxlYXNlIG5vdGUgdGhhdAorIGRpY3Rpb25hcmllcyBwcm92aWRlZCBhcyBYTUwgZmlsZXMgY29tZSB3aXRoIGxlc3MgZmVhdHVyZXMKKyB0aGFuIG5hdGl2ZSBiaW5hcnkgZm9ybWF0LCBzbyB0aGUgbGF0ZXIgc2hvdWxkIGJlIHByZWZlcnJlZAorIHdoZW4gcG9zc2libGUuCisgLgorIEluIG9yZGVyIHRvIHVzZSB0aGlzIGV4dGVuc2lvbiwgeW91ciBtYWluIGZyZWVEaWFtZXRlciAKKyBjb25maWd1cmF0aW9uIGZpbGUgbXVzdCBjb250YWluIGEgTG9hZEV4dGVuc2lvbiBkaXJlY3RpdmUuIAorIFNlZSBmcmVlRGlhbWV0ZXIgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLiAKKyAuCisgVGhpcyBleHRlbnNpb24gcmVxdWlyZXMgYSBjb25maWd1cmF0aW9uIGZpbGUuIFNlZSAKKyBkaWN0X2xlZ2FjeV94bWwuY29uZi5zYW1wbGUgZm9yIGRvY3VtZW50YXRpb24uCisKK1BhY2thZ2U6IGZyZWVkaWFtZXRlci1yYWRpdXMtZ2F0ZXdheQorQXJjaGl0ZWN0dXJlOiBhbnkKK0RlcGVuZHM6ICR7bWlzYzpEZXBlbmRzfSwgZnJlZWRpYW1ldGVyLWRhZW1vbiAoPSAke2JpbmFyeTpWZXJzaW9ufSkKK1N1Z2dlc3RzOiBmcmVlZGlhbWV0ZXItZGljdGlvbmFyeS1yZmM0MDcyICg9ICR7YmluYXJ5OlZlcnNpb259KSwgZnJlZWRpYW1ldGVyLWRpY3Rpb25hcnktcmZjNDc0MCAoPSAke2JpbmFyeTpWZXJzaW9ufSkKK0Rlc2NyaXB0aW9uOiBSQURJVVMvRGlhbWV0ZXIgZXh0ZW5zaWJsZSBnYXRld2F5LgorIFRoaXMgZnJlZURpYW1ldGVyIGV4dGVuc2lvbiBpbXBsZW1lbnRzIGEgUkFESVVTIHRvIERpYW1ldGVyCisgZ2F0ZXdheS4gSXQgYWxsb3dzIGEgUkFESVVTIGNsaWVudCB0byBjb25uZWN0IHRvIGEgRGlhbWV0ZXIKKyBzZXJ2ZXIuCisgLgorIFRoZSBzdXBwb3J0IGZvciBzcGVjaWZpYyBEaWFtZXRlciBhcHBsaWNhdGlvbnMgYW5kL29yIFJBRElVUyAKKyBleHRlbnNpb25zIGlzIHByb3ZpZGVkIGluIHRoZSBnYXRld2F5IGJ5IHRoZSB1c2Ugb2YgcGx1Z2lucy4KKyBDdXJyZW50bHksIHRoZSBmb2xsb3dpbmcgcGx1Z2lucyBhcmUgYXZhaWxhYmxlOgorICAtIGVjaG9kcm9wLnJnd3ggOiBkcm9wIG9yIGVjaG8gYSBSQURJVVMgYXR0cmlidXRlLiAKKyAgICAgICAgICAgICAgICAgICAgVGhlIGF0dHJpYnV0ZSBpcyBub3QgY29udmVydGVkIHRvIERpYW1ldGVyLgorCQkgICAgU2VlIGVjaG9kcm9wLnJnd3guY29uZi5zYW1wbGUgZm9yIGRldGFpbHMuCisgIC0gYXV0aC5yZ3d4IDogQ29udmVydCBBY2Nlc3MtUmVxdWVzdCB0byBEaWFtZXRlciBBQVIgb3IgREVSLgorICAgICAgICAgICAgICAgIFJlcXVlc3RzIEZvciBDb21tZW50czogUkFESVVTOiAyODY1LCAzMTYyLCAyODY4LAorCQkyODY5LCAzNTc5OyBEaWFtZXRlcjogNDAwNSwgNDA3Mi4KKwkJUmVxdWlyZXMgZnJlZWRpYW1ldGVyLWRpY3Rpb25hcnktcmZjNDA3Mi4KKyAgLSBzaXAucmd3eCAgOiBDb252ZXJ0IEFjY2Vzcy1SZXF1ZXN0IHRvIERpYW1ldGVyIFNJUCBtZXNzYWdlcy4KKyAgICAgICAgICAgICAgICBSZXF1ZXN0cyBGb3IgQ29tbWVudHM6IERpYW1ldGVyOiA0NzQwLgorCQlSZXF1aXJlcyBmcmVlZGlhbWV0ZXItZGljdGlvbmFyeS1yZmM0NzQwLgorICAtIGFjY3Qucmd3eCA6IENvbnZlcnRzIEFjY291bnRpbmctUmVxdWVzdCAoMjg2NikgdG8gRGlhbWV0ZXIgCisgICAgICAgICAgICAgICAgQUNSICgzNTg4KS4KKwkJUmVxdWlyZXMgZnJlZWRpYW1ldGVyLWRpY3Rpb25hcnktcmZjNDA3Mi4KKyAuCisgSW4gb3JkZXIgdG8gdXNlIHRoaXMgZXh0ZW5zaW9uLCB5b3VyIG1haW4gZnJlZURpYW1ldGVyIAorIGNvbmZpZ3VyYXRpb24gZmlsZSBtdXN0IGNvbnRhaW4gYSBMb2FkRXh0ZW5zaW9uIGRpcmVjdGl2ZS4gCisgU2VlIGZyZWVEaWFtZXRlciBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGRldGFpbHMuIAorIC4KKyBUaGlzIGV4dGVuc2lvbiByZXF1aXJlcyBhIGNvbmZpZ3VyYXRpb24gZmlsZS4KKyBTZWUgYXBwX3JhZGd3LmNvbmYuc2FtcGxlIGZvciBtb3JlIGRldGFpbHMuCisKK1BhY2thZ2U6IGZyZWVkaWFtZXRlci1hY2NvdW50aW5nLXNlcnZlcgorQXJjaGl0ZWN0dXJlOiBhbnkKK0RlcGVuZHM6ICR7bWlzYzpEZXBlbmRzfSwgZnJlZWRpYW1ldGVyLWRhZW1vbiAoPSAke2JpbmFyeTpWZXJzaW9ufSksIGxpYnBxNQorU3VnZ2VzdHM6IGZyZWVkaWFtZXRlci1kaWN0aW9uYXJ5LXJmYzQwNzIKK0Rlc2NyaXB0aW9uOiBmcmVlRGlhbWV0ZXIgc2ltcGxlIEFjY291bnRpbmcgc2VydmVyLgorIFRoaXMgZnJlZURpYW1ldGVyIGV4dGVuc2lvbiBpbXBsZW1lbnRzIHRoZSBEaWFtZXRlciBCYXNlIAorIEFjY291bnRpbmcgYXBwbGljYXRpb24uIEl0IHNhdmVzIHRoZSBhY2NvdW50aW5nIHJlY29yZHMKKyBpbiBhIFBvc3RncmVTUUwgZGF0YWJhc2UgYmFja2VuZCBpbiBhIGhpZ2hseSBjb25maWd1cmFibGUKKyBtYW5lZXIuCisgLgorIEluIG9yZGVyIHRvIHVzZSB0aGlzIGV4dGVuc2lvbiwgeW91ciBtYWluIGZyZWVEaWFtZXRlciAKKyBjb25maWd1cmF0aW9uIGZpbGUgbXVzdCBjb250YWluIGEgTG9hZEV4dGVuc2lvbiBkaXJlY3RpdmUuIAorIFNlZSBmcmVlRGlhbWV0ZXIgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLiAKKyAuCisgVGhpcyBleHRlbnNpb24gcmVxdWlyZXMgYSBjb25maWd1cmF0aW9uIGZpbGUuCisgU2VlIGFwcF9hY2N0LmNvbmYuc2FtcGxlIGZvciBtb3JlIGRldGFpbHMuCisgLgorIFlvdSBtYXkgZmluZCBzb21lIHVzZWZ1bCByZXNvdXJjZXMgdG8gcGFyc2UgdGhlIHNhdmVkIHJlY29yZHMKKyBpbiB0aGUgY29udHJpYi9hcHBfYWNjdF90b29scyBmb2xkZXIgaW4gc291cmNlIHBhY2thZ2UuCisKK1BhY2thZ2U6IGZyZWVkaWFtZXRlci1lYXAtc2VydmVyCitBcmNoaXRlY3R1cmU6IGFueQorRGVwZW5kczogJHttaXNjOkRlcGVuZHN9LCBmcmVlZGlhbWV0ZXItZGFlbW9uICg9ICR7YmluYXJ5OlZlcnNpb259KSwgbGlibXlzcWxjbGllbnQxNiB8IGxpYm15c3FsY2xpZW50MTgsIGZyZWVkaWFtZXRlci1kaWN0aW9uYXJ5LXJmYzQwNzIgKD0gJHtiaW5hcnk6VmVyc2lvbn0pCitEZXNjcmlwdGlvbjogZnJlZURpYW1ldGVyIERpYW1ldGVyIEVBUCBzZXJ2ZXIgaW1wbGVtZW50YXRpb24uCisgVGhpcyBmcmVlRGlhbWV0ZXIgZXh0ZW5zaW9uIGltcGxlbWVudHMgYSBEaWFtZXRlciBFQVAgc2VydmVyLiAKKyBJdCBzdXBwb3J0cyBFQVAtTUQ1IGFuZCBFQVAtVExTIG1ldGhvZHMgY3VycmVudGx5LgorIC4KKyBJbiBvcmRlciB0byB1c2UgdGhpcyBleHRlbnNpb24sIHlvdXIgbWFpbiBmcmVlRGlhbWV0ZXIgCisgY29uZmlndXJhdGlvbiBmaWxlIG11c3QgY29udGFpbiBhIExvYWRFeHRlbnNpb24gZGlyZWN0aXZlLiAKKyBTZWUgZnJlZURpYW1ldGVyIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgZGV0YWlscy4gCisgLgorIFRoaXMgZXh0ZW5zaW9uIHJlcXVpcmVzIGEgY29uZmlndXJhdGlvbiBmaWxlLgorIFNlZSBhcHBfZGlhbWVhcC5jb25mLnNhbXBsZSBhbmQgCisgaHR0cDovL2RpYW1lYXAueWFnYW1pLmZyZWVkaWFtZXRlci5uZXQgZm9yIG1vcmUgZGV0YWlscy4KKworUGFja2FnZTogZnJlZWRpYW1ldGVyLXNpcC1zZXJ2ZXIKK0FyY2hpdGVjdHVyZTogYW55CitEZXBlbmRzOiAke21pc2M6RGVwZW5kc30sIGZyZWVkaWFtZXRlci1kYWVtb24gKD0gJHtiaW5hcnk6VmVyc2lvbn0pLCBsaWJteXNxbGNsaWVudDE2IHwgbGlibXlzcWxjbGllbnQxOCwgZnJlZWRpYW1ldGVyLWRpY3Rpb25hcnktcmZjNDc0MCAoPSAke2JpbmFyeTpWZXJzaW9ufSkKK0Rlc2NyaXB0aW9uOiBmcmVlRGlhbWV0ZXIgRGlhbWV0ZXIgU0lQIHNlcnZlciBpbXBsZW1lbnRhdGlvbi4KKyBUaGlzIGZyZWVEaWFtZXRlciBleHRlbnNpb24gaW1wbGVtZW50cyBhIHByb3RvdHlwZSAKKyBEaWFtZXRlciBTSVAgc2VydmVyLgorIFNlZSBodHRwOi8vd3d3LmZyZWVkaWFtZXRlci5uZXQvdHJhYy93aWtpL2FwcF9zaXAuZmR4IGZvcgorIHN0YXR1cyBpbmZvcm1hdGlvbi4KKyAuCisgSW4gb3JkZXIgdG8gdXNlIHRoaXMgZXh0ZW5zaW9uLCB5b3VyIG1haW4gZnJlZURpYW1ldGVyIAorIGNvbmZpZ3VyYXRpb24gZmlsZSBtdXN0IGNvbnRhaW4gYSBMb2FkRXh0ZW5zaW9uIGRpcmVjdGl2ZS4gCisgU2VlIGZyZWVEaWFtZXRlciBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGRldGFpbHMuIAorIC4KKyBUaGlzIGV4dGVuc2lvbiByZXF1aXJlcyBhIGNvbmZpZ3VyYXRpb24gZmlsZS4KKyBTZWUgYXBwX3NpcC5jb25mLnNhbXBsZSBmb3IgbW9yZSBkZXRhaWxzLgorCmRpZmYgLS1naXQgYS9jb250cmliL2RlYmlhbi9jb3B5cmlnaHQgYi9jb250cmliL2RlYmlhbi9jb3B5cmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE0YmZhNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvZGViaWFuL2NvcHlyaWdodApAQCAtMCwwICsxLDM1IEBACitGb3JtYXQtU3BlY2lmaWNhdGlvbjogaHR0cDovL2RlcC5kZWJpYW4ubmV0L2RlcHMvZGVwNS8KK05hbWU6IGZyZWVEaWFtZXRlcgorTWFpbnRhaW5lcjogU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+CitTb3VyY2U6IGh0dHA6Ly93d3cuZnJlZWRpYW1ldGVyLm5ldAorCitGaWxlczogKgorQ29weXJpZ2h0OiAyMDA4LTIwMTEsIFdJREUgUHJvamVjdCBhbmQgTklDVC4KK0xpY2Vuc2U6IEJTRAorIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlCisgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgLgorICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQorICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgLiAKKyAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKKyAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgorICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAuCisgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBXSURFIFByb2plY3Qgb3IgTklDVCBub3IgdGhlCisgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IKKyAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFdJREUgUHJvamVjdCBhbmQKKyAgIE5JQ1QuCisgLgorIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQQorIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgorIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SCisgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRgorIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCmRpZmYgLS1naXQgYS9jb250cmliL2RlYmlhbi9kaXJzIGIvY29udHJpYi9kZWJpYW4vZGlycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWU1Mzk5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9kZWJpYW4vZGlycwpAQCAtMCwwICsxIEBACitldGMvZnJlZURpYW1ldGVyLwpkaWZmIC0tZ2l0IGEvY29udHJpYi9kZWJpYW4vZG9jcyBiL2NvbnRyaWIvZGViaWFuL2RvY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIzOGE5OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvZGViaWFuL2RvY3MKQEAgLTAsMCArMSwzIEBACitJTlNUQUxMKgorTElDRU5TRQorUkVBRE1FCmRpZmYgLS1naXQgYS9jb250cmliL2RlYmlhbi9mcmVlZGlhbWV0ZXItYWNjb3VudGluZy1zZXJ2ZXIuZXhhbXBsZXMgYi9jb250cmliL2RlYmlhbi9mcmVlZGlhbWV0ZXItYWNjb3VudGluZy1zZXJ2ZXIuZXhhbXBsZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRjZTY0NgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvZGViaWFuL2ZyZWVkaWFtZXRlci1hY2NvdW50aW5nLXNlcnZlci5leGFtcGxlcwpAQCAtMCwwICsxIEBACitkb2MvYXBwX2FjY3QuY29uZi5zYW1wbGUKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZGViaWFuL2ZyZWVkaWFtZXRlci1hY2NvdW50aW5nLXNlcnZlci5pbnN0YWxsIGIvY29udHJpYi9kZWJpYW4vZnJlZWRpYW1ldGVyLWFjY291bnRpbmctc2VydmVyLmluc3RhbGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQzYjFkOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvZGViaWFuL2ZyZWVkaWFtZXRlci1hY2NvdW50aW5nLXNlcnZlci5pbnN0YWxsCkBAIC0wLDAgKzEgQEAKK3Vzci9saWIvZnJlZURpYW1ldGVyL2FwcF9hY2N0LmZkeApkaWZmIC0tZ2l0IGEvY29udHJpYi9kZWJpYW4vZnJlZWRpYW1ldGVyLWNvbW1vbi5leGFtcGxlcyBiL2NvbnRyaWIvZGViaWFuL2ZyZWVkaWFtZXRlci1jb21tb24uZXhhbXBsZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFiYjMzNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvZGViaWFuL2ZyZWVkaWFtZXRlci1jb21tb24uZXhhbXBsZXMKQEAgLTAsMCArMSw1IEBACitkb2MvZnJlZWRpYW1ldGVyLmNvbmYuc2FtcGxlCitkb2MvYWNsX3dsLmNvbmYuc2FtcGxlCitkb2MvcnRfZGVmYXVsdC5jb25mLnNhbXBsZQorZG9jL3J0X2VyZWcuY29uZi5zYW1wbGUKK2RvYy9zaW5nbGVfaG9zdApkaWZmIC0tZ2l0IGEvY29udHJpYi9kZWJpYW4vZnJlZWRpYW1ldGVyLWNvbW1vbi5pbnN0YWxsIGIvY29udHJpYi9kZWJpYW4vZnJlZWRpYW1ldGVyLWNvbW1vbi5pbnN0YWxsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ODYxZWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2RlYmlhbi9mcmVlZGlhbWV0ZXItY29tbW9uLmluc3RhbGwKQEAgLTAsMCArMSw2IEBACit1c3IvbGliL2xpYmZkcHJvdG8uc28qCit1c3IvbGliL2xpYmZkY29yZS5zbyoKK3Vzci9saWIvZnJlZURpYW1ldGVyL2FjbF93bC5mZHgKK3Vzci9saWIvZnJlZURpYW1ldGVyL3J0X2RlZmF1bHQuZmR4Cit1c3IvbGliL2ZyZWVEaWFtZXRlci9ydF9lcmVnLmZkeAordXNyL2xpYi9mcmVlRGlhbWV0ZXIvZGJnX21vbml0b3IuZmR4CmRpZmYgLS1naXQgYS9jb250cmliL2RlYmlhbi9mcmVlZGlhbWV0ZXItZGFlbW9uLmRlZmF1bHQgYi9jb250cmliL2RlYmlhbi9mcmVlZGlhbWV0ZXItZGFlbW9uLmRlZmF1bHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ4Yjc5MgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvZGViaWFuL2ZyZWVkaWFtZXRlci1kYWVtb24uZGVmYXVsdApAQCAtMCwwICsxLDcgQEAKKyMgRGVmYXVsdHMgZm9yIGZyZWVkaWFtZXRlciBpbml0c2NyaXB0CisjIHNvdXJjZWQgYnkgL2V0Yy9pbml0LmQvZnJlZWRpYW1ldGVyCisjIGluc3RhbGxlZCBhdCAvZXRjL2RlZmF1bHQvZnJlZWRpYW1ldGVyIGJ5IHRoZSBtYWludGFpbmVyIHNjcmlwdHMKKworIyBBZGRpdGlvbmFsIG9wdGlvbnMgdGhhdCBhcmUgcGFzc2VkIHRvIHRoZSBEYWVtb24uCisjIFNlZSAiZnJlZURpYW1ldGVyZCAtLWhlbHAiIGZvciBzdXBwb3J0ZWQgZmxhZ3MuCitEQUVNT05fT1BUUz0iIgpkaWZmIC0tZ2l0IGEvY29udHJpYi9kZWJpYW4vZnJlZWRpYW1ldGVyLWRhZW1vbi5pbml0IGIvY29udHJpYi9kZWJpYW4vZnJlZWRpYW1ldGVyLWRhZW1vbi5pbml0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMmEzMWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2RlYmlhbi9mcmVlZGlhbWV0ZXItZGFlbW9uLmluaXQKQEAgLTAsMCArMSwxNjAgQEAKKyMhIC9iaW4vc2gKKworIyMjIEJFR0lOIElOSVQgSU5GTworIyBQcm92aWRlczogICAgICAgICAgZnJlZWRpYW1ldGVyCisjIERlZmF1bHQtU3RhcnQ6ICAgICAyIDMgNCA1CisjIERlZmF1bHQtU3RvcDogICAgICAwIDEgNgorIyBSZXF1aXJlZC1TdGFydDogICAgJHJlbW90ZV9mcyAkc3lzbG9nCisjIFJlcXVpcmVkLVN0b3A6ICAgICAkcmVtb3RlX2ZzICRzeXNsb2cKKyMgU2hvcnQtRGVzY3JpcHRpb246IFN0YXJ0IGZyZWVEaWFtZXRlciBkYWVtb24gYXQgYm9vdCB0aW1lCisjIERlc2NyaXB0aW9uOiAgICAgICBTdGFydCB0aGUgZnJlZURpYW1ldGVyIGRhZW1vbiBhdCBib290IHRpbWUuCisjCWZyZWVEaWFtZXRlciBpcyBhbiBleHRlbnNpYmxlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBEaWFtZXRlciBwcm90b2NvbCwKKyMJZGVzaWduZWQgZm9yIEF1dGhlbnRpY2F0aW9uLCBBdXRob3JpemF0aW9uIGFuZCBBY2NvdW50aW5nLiBEaWFtZXRlciBpcworIwlhbiBldm9sdXRpb24gb2YgdGhlIFJBRElVUyBwcm90b2NvbC4KKyMjIyBFTkQgSU5JVCBJTkZPIworCitEQUVNT049L3Vzci9iaW4vZnJlZURpYW1ldGVyZAorQ09ORj0vZXRjL2ZyZWVEaWFtZXRlci9mcmVlRGlhbWV0ZXIuY29uZgorTkFNRT1mcmVlZGlhbWV0ZXIKK0RFU0M9ImZyZWVEaWFtZXRlciBkYWVtb24iCisKK3Rlc3QgLXggJERBRU1PTiB8fCBleGl0IDAKKworTE9HRElSPS92YXIvbG9nL2ZyZWVkaWFtZXRlcgorUElERklMRT0vdmFyL3J1bi8kTkFNRS5waWQKK0RPRFRJTUU9MzAgICAgICAgICAgICAgICAgICAjIFRpbWUgdG8gd2FpdCBmb3IgdGhlIHNlcnZlciB0byBkaWUsIGluIHNlY29uZHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFRoZSB2YWx1ZSBpcyBoaWdoIGJlY2F1c2Ugd2Ugd2FpdCBmb3IgU1RBIGFuc3dlcnMKKwkJCSAgICAjIGJlZm9yZSBkaXNjb25uZWN0aW5nIHRoZSBwZWVycy4KKworIyBJbmNsdWRlIGZyZWVkaWFtZXRlciBkZWZhdWx0cyBpZiBhdmFpbGFibGUKK2lmIFsgLWYgL2V0Yy9kZWZhdWx0L2ZyZWVkaWFtZXRlciBdIDsgdGhlbgorICAgIC4gL2V0Yy9kZWZhdWx0L2ZyZWVkaWFtZXRlcgorZmkKKwordGVzdCB4IiIgIT0geCREQUVNT05fT1BUUyB8fCB0ZXN0IC1mICRDT05GIHx8IGV4aXQgMAorCitzZXQgLWUKKworcnVubmluZ19waWQoKQoreworICAgICMgQ2hlY2sgaWYgYSBnaXZlbiBwcm9jZXNzIHBpZCdzIGNtZGxpbmUgbWF0Y2hlcyBhIGdpdmVuIG5hbWUKKyAgICBwaWQ9JDEKKyAgICBuYW1lPSQyCisgICAgWyAteiAiJHBpZCIgXSAmJiByZXR1cm4gMQorICAgIFsgISAtZCAvcHJvYy8kcGlkIF0gJiYgIHJldHVybiAxCisgICAgY21kPWBjYXQgL3Byb2MvJHBpZC9jbWRsaW5lIHwgdHIgIlwwMDAiICJcbiJ8aGVhZCAtbiAxIHxjdXQgLWQgOiAtZiAxYAorICAgICMgSXMgdGhpcyB0aGUgZXhwZWN0ZWQgY2hpbGQ/CisgICAgWyAiJGNtZCIgIT0gIiRuYW1lIiBdICYmICByZXR1cm4gMQorICAgIHJldHVybiAwCit9CisKK3J1bm5pbmcoKQoreworIyBDaGVjayBpZiB0aGUgcHJvY2VzcyBpcyBydW5uaW5nIGxvb2tpbmcgYXQgL3Byb2MKKyMgKHdvcmtzIGZvciBhbGwgdXNlcnMpCisKKyAgICAjIE5vIHBpZGZpbGUsIHByb2JhYmx5IG5vIGRhZW1vbiBwcmVzZW50CisgICAgWyAhIC1mICIkUElERklMRSIgXSAmJiByZXR1cm4gMQorICAgICMgT2J0YWluIHRoZSBwaWQgYW5kIGNoZWNrIGl0IGFnYWluc3QgdGhlIGJpbmFyeSBuYW1lCisgICAgcGlkPWBjYXQgJFBJREZJTEVgCisgICAgcnVubmluZ19waWQgJHBpZCAkREFFTU9OIHx8IHJldHVybiAxCisgICAgcmV0dXJuIDAKK30KKworZm9yY2Vfc3RvcCgpIHsKKyMgRm9yY2VmdWxseSBraWxsIHRoZSBwcm9jZXNzCisgICAgWyAhIC1mICIkUElERklMRSIgXSAmJiByZXR1cm4KKyAgICBpZiBydW5uaW5nIDsgdGhlbgorICAgICAgICBraWxsIC0xNSAkcGlkCisgICAgICAgICMgSXMgaXQgcmVhbGx5IGRlYWQ/CisgICAgICAgIFsgLW4gIiRET0RUSU1FIiBdICYmIHNsZWVwICIkRE9EVElNRSJzCisgICAgICAgIGlmIHJ1bm5pbmcgOyB0aGVuCisgICAgICAgICAgICBraWxsIC05ICRwaWQKKyAgICAgICAgICAgIFsgLW4gIiRET0RUSU1FIiBdICYmIHNsZWVwICIkRE9EVElNRSJzCisgICAgICAgICAgICBpZiBydW5uaW5nIDsgdGhlbgorICAgICAgICAgICAgICAgIGVjaG8gIkNhbm5vdCBraWxsICRMQUJFTCAocGlkPSRwaWQpISIKKyAgICAgICAgICAgICAgICBleGl0IDEKKyAgICAgICAgICAgIGZpCisgICAgICAgIGZpCisgICAgZmkKKyAgICBybSAtZiAkUElERklMRQorICAgIHJldHVybiAwCit9CisKK2Nhc2UgIiQxIiBpbgorICBzdGFydCkKKyAgICAgICAgZWNobyAtbiAiU3RhcnRpbmcgJERFU0M6ICIKKyAgICAgICAgc3RhcnQtc3RvcC1kYWVtb24gLS1zdGFydCAtLXF1aWV0IC0tcGlkZmlsZSAkUElERklMRSBcCisgICAgICAgICAgICAtLWV4ZWMgJERBRU1PTiAtLSAkREFFTU9OX09QVFMKKyAgICAgICAgaWYgcnVubmluZyA7IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIiROQU1FLiIKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZWNobyAiIEVSUk9SLiIKKyAgICAgICAgZmkKKyAgICAgICAgOzsKKyAgc3RvcCkKKyAgICAgICAgZWNobyAtbiAiU3RvcHBpbmcgJERFU0M6ICIKKyAgICAgICAgc3RhcnQtc3RvcC1kYWVtb24gLS1zdG9wIC0tcXVpZXQgLS1waWRmaWxlICRQSURGSUxFIFwKKyAgICAgICAgICAgIC0tZXhlYyAkREFFTU9OCisgICAgICAgIGVjaG8gIiROQU1FLiIKKyAgICAgICAgOzsKKyAgZm9yY2Utc3RvcCkKKyAgICAgICAgZWNobyAtbiAiRm9yY2VmdWxseSBzdG9wcGluZyAkREVTQzogIgorICAgICAgICBmb3JjZV9zdG9wCisgICAgICAgIGlmICEgcnVubmluZyA7IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIiROQU1FLiIKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZWNobyAiIEVSUk9SLiIKKyAgICAgICAgZmkKKyAgICAgICAgOzsKKyAgI3JlbG9hZCkKKyAgICAgICAgIworICAgICAgICAjIElmIHRoZSBkYWVtb24gY2FuIHJlbG9hZCBpdHMgY29uZmlnIGZpbGVzIG9uIHRoZSBmbHkKKyAgICAgICAgIyBmb3IgZXhhbXBsZSBieSBzZW5kaW5nIGl0IFNJR0hVUCwgZG8gaXQgaGVyZS4KKyAgICAgICAgIworICAgICAgICAjIElmIHRoZSBkYWVtb24gcmVzcG9uZHMgdG8gY2hhbmdlcyBpbiBpdHMgY29uZmlnIGZpbGUKKyAgICAgICAgIyBkaXJlY3RseSBhbnl3YXksIG1ha2UgdGhpcyBhIGRvLW5vdGhpbmcgZW50cnkuCisgICAgICAgICMKKyAgICAgICAgIyBlY2hvICJSZWxvYWRpbmcgJERFU0MgY29uZmlndXJhdGlvbiBmaWxlcy4iCisgICAgICAgICMgc3RhcnQtc3RvcC1kYWVtb24gLS1zdG9wIC0tc2lnbmFsIDEgLS1xdWlldCAtLXBpZGZpbGUgXAorICAgICAgICAjICAgICAgIC92YXIvcnVuLyROQU1FLnBpZCAtLWV4ZWMgJERBRU1PTgorICAjOzsKKyAgZm9yY2UtcmVsb2FkKQorICAgICAgICAjCisgICAgICAgICMgSWYgdGhlICJyZWxvYWQiIG9wdGlvbiBpcyBpbXBsZW1lbnRlZCwgbW92ZSB0aGUgImZvcmNlLXJlbG9hZCIKKyAgICAgICAgIyBvcHRpb24gdG8gdGhlICJyZWxvYWQiIGVudHJ5IGFib3ZlLiBJZiBub3QsICJmb3JjZS1yZWxvYWQiIGlzCisgICAgICAgICMganVzdCB0aGUgc2FtZSBhcyAicmVzdGFydCIgZXhjZXB0IHRoYXQgaXQgZG9lcyBub3RoaW5nIGlmIHRoZQorICAgICAgICAjIGRhZW1vbiBpc24ndCBhbHJlYWR5IHJ1bm5pbmcuCisgICAgICAgICMgY2hlY2sgd2V0aGVyICREQUVNT04gaXMgcnVubmluZy4gSWYgc28sIHJlc3RhcnQKKyAgICAgICAgc3RhcnQtc3RvcC1kYWVtb24gLS1zdG9wIC0tdGVzdCAtLXF1aWV0IC0tcGlkZmlsZSBcCisgICAgICAgICAgICAvdmFyL3J1bi8kTkFNRS5waWQgLS1leGVjICREQUVNT04gXAorICAgICAgICAgICAgJiYgJDAgcmVzdGFydCBcCisgICAgICAgICAgICB8fCBleGl0IDAKKyAgICAgICAgOzsKKyAgcmVzdGFydCkKKyAgICBlY2hvIC1uICJSZXN0YXJ0aW5nICRERVNDOiAiCisgICAgICAgIHN0YXJ0LXN0b3AtZGFlbW9uIC0tc3RvcCAtLXF1aWV0IC0tcGlkZmlsZSBcCisgICAgICAgICAgICAvdmFyL3J1bi8kTkFNRS5waWQgLS1leGVjICREQUVNT04KKyAgICAgICAgWyAtbiAiJERPRFRJTUUiIF0gJiYgc2xlZXAgJERPRFRJTUUKKyAgICAgICAgc3RhcnQtc3RvcC1kYWVtb24gLS1zdGFydCAtLXF1aWV0IC0tcGlkZmlsZSBcCisgICAgICAgICAgICAvdmFyL3J1bi8kTkFNRS5waWQgLS1leGVjICREQUVNT04gLS0gJERBRU1PTl9PUFRTCisgICAgICAgIGVjaG8gIiROQU1FLiIKKyAgICAgICAgOzsKKyAgc3RhdHVzKQorICAgIGVjaG8gLW4gIiRMQUJFTCBpcyAiCisgICAgaWYgcnVubmluZyA7ICB0aGVuCisgICAgICAgIGVjaG8gInJ1bm5pbmciCisgICAgZWxzZQorICAgICAgICBlY2hvICIgbm90IHJ1bm5pbmcuIgorICAgICAgICBleGl0IDEKKyAgICBmaQorICAgIDs7CisgICopCisgICAgTj0vZXRjL2luaXQuZC8kTkFNRQorICAgICMgZWNobyAiVXNhZ2U6ICROIHtzdGFydHxzdG9wfHJlc3RhcnR8cmVsb2FkfGZvcmNlLXJlbG9hZH0iID4mMgorICAgIGVjaG8gIlVzYWdlOiAkTiB7c3RhcnR8c3RvcHxyZXN0YXJ0fGZvcmNlLXJlbG9hZHxzdGF0dXN8Zm9yY2Utc3RvcH0iID4mMgorICAgIGV4aXQgMQorICAgIDs7Citlc2FjCisKK2V4aXQgMApkaWZmIC0tZ2l0IGEvY29udHJpYi9kZWJpYW4vZnJlZWRpYW1ldGVyLWRhZW1vbi5pbnN0YWxsIGIvY29udHJpYi9kZWJpYW4vZnJlZWRpYW1ldGVyLWRhZW1vbi5pbnN0YWxsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMTY3YTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2RlYmlhbi9mcmVlZGlhbWV0ZXItZGFlbW9uLmluc3RhbGwKQEAgLTAsMCArMSBAQAordXNyL2Jpbi9mcmVlRGlhbWV0ZXJkKgpkaWZmIC0tZ2l0IGEvY29udHJpYi9kZWJpYW4vZnJlZWRpYW1ldGVyLWRlYnVnLXRvb2xzLmV4YW1wbGVzIGIvY29udHJpYi9kZWJpYW4vZnJlZWRpYW1ldGVyLWRlYnVnLXRvb2xzLmV4YW1wbGVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3NTBkMWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2RlYmlhbi9mcmVlZGlhbWV0ZXItZGVidWctdG9vbHMuZXhhbXBsZXMKQEAgLTAsMCArMSwzIEBACitkb2MvdGVzdF9hcHAuY29uZi5zYW1wbGUKK2RvYy90ZXN0X25ldGVtdWwuY29uZi5zYW1wbGUKK2RvYy9kYmdfaW50ZXJhY3RpdmUucHkuc2FtcGxlCmRpZmYgLS1naXQgYS9jb250cmliL2RlYmlhbi9mcmVlZGlhbWV0ZXItZGVidWctdG9vbHMuaW5zdGFsbCBiL2NvbnRyaWIvZGViaWFuL2ZyZWVkaWFtZXRlci1kZWJ1Zy10b29scy5pbnN0YWxsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyYzdmNTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2RlYmlhbi9mcmVlZGlhbWV0ZXItZGVidWctdG9vbHMuaW5zdGFsbApAQCAtMCwwICsxLDUgQEAKK3Vzci9saWIvZnJlZURpYW1ldGVyL2RiZ19ydC5mZHgKK3Vzci9saWIvZnJlZURpYW1ldGVyL3Rlc3RfYXBwLmZkeAordXNyL2xpYi9mcmVlRGlhbWV0ZXIvdGVzdF9zaXAuZmR4Cit1c3IvbGliL2ZyZWVEaWFtZXRlci90ZXN0X25ldGVtdWwuZmR4Cit1c3IvbGliL2ZyZWVEaWFtZXRlci9kYmdfaW50ZXJhY3RpdmUuZmR4CmRpZmYgLS1naXQgYS9jb250cmliL2RlYmlhbi9mcmVlZGlhbWV0ZXItZGV2Lmluc3RhbGwgYi9jb250cmliL2RlYmlhbi9mcmVlZGlhbWV0ZXItZGV2Lmluc3RhbGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA1NWQ0MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvZGViaWFuL2ZyZWVkaWFtZXRlci1kZXYuaW5zdGFsbApAQCAtMCwwICsxIEBACit1c3IvaW5jbHVkZS9mcmVlRGlhbWV0ZXIvKgpkaWZmIC0tZ2l0IGEvY29udHJpYi9kZWJpYW4vZnJlZWRpYW1ldGVyLWRpY3Rpb25hcnktbGVnYWN5LmV4YW1wbGVzIGIvY29udHJpYi9kZWJpYW4vZnJlZWRpYW1ldGVyLWRpY3Rpb25hcnktbGVnYWN5LmV4YW1wbGVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZWRlMjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2RlYmlhbi9mcmVlZGlhbWV0ZXItZGljdGlvbmFyeS1sZWdhY3kuZXhhbXBsZXMKQEAgLTAsMCArMSwyIEBACitkb2MvZGljdF9sZWdhY3lfeG1sLmNvbmYuc2FtcGxlCitjb250cmliL2RpY3RfbGVnYWN5L2RpY3Rpb25hcnkuZHRkCmRpZmYgLS1naXQgYS9jb250cmliL2RlYmlhbi9mcmVlZGlhbWV0ZXItZGljdGlvbmFyeS1sZWdhY3kuaW5zdGFsbCBiL2NvbnRyaWIvZGViaWFuL2ZyZWVkaWFtZXRlci1kaWN0aW9uYXJ5LWxlZ2FjeS5pbnN0YWxsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjZGRmOWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2RlYmlhbi9mcmVlZGlhbWV0ZXItZGljdGlvbmFyeS1sZWdhY3kuaW5zdGFsbApAQCAtMCwwICsxIEBACit1c3IvbGliL2ZyZWVEaWFtZXRlci9kaWN0X2xlZ2FjeV94bWwuZmR4CmRpZmYgLS1naXQgYS9jb250cmliL2RlYmlhbi9mcmVlZGlhbWV0ZXItZGljdGlvbmFyeS1taXA2Lmluc3RhbGwgYi9jb250cmliL2RlYmlhbi9mcmVlZGlhbWV0ZXItZGljdGlvbmFyeS1taXA2Lmluc3RhbGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMzN2MzZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvZGViaWFuL2ZyZWVkaWFtZXRlci1kaWN0aW9uYXJ5LW1pcDYuaW5zdGFsbApAQCAtMCwwICsxLDQgQEAKK3Vzci9saWIvZnJlZURpYW1ldGVyL2RpY3RfbmFzX21pcHY2LmZkeAordXNyL2xpYi9mcmVlRGlhbWV0ZXIvZGljdF9taXA2aS5mZHgKK3Vzci9saWIvZnJlZURpYW1ldGVyL2RpY3RfbWlwNmEuZmR4Cit1c3IvbGliL2ZyZWVEaWFtZXRlci9kaWN0X3JmYzU3NzcuZmR4CmRpZmYgLS1naXQgYS9jb250cmliL2RlYmlhbi9mcmVlZGlhbWV0ZXItZGljdGlvbmFyeS1yZmM0MDA1Lmluc3RhbGwgYi9jb250cmliL2RlYmlhbi9mcmVlZGlhbWV0ZXItZGljdGlvbmFyeS1yZmM0MDA1Lmluc3RhbGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM4MjQzMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvZGViaWFuL2ZyZWVkaWFtZXRlci1kaWN0aW9uYXJ5LXJmYzQwMDUuaW5zdGFsbApAQCAtMCwwICsxIEBACit1c3IvbGliL2ZyZWVEaWFtZXRlci9kaWN0X25hc3JlcS5mZHgKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZGViaWFuL2ZyZWVkaWFtZXRlci1kaWN0aW9uYXJ5LXJmYzQwMDYuaW5zdGFsbCBiL2NvbnRyaWIvZGViaWFuL2ZyZWVkaWFtZXRlci1kaWN0aW9uYXJ5LXJmYzQwMDYuaW5zdGFsbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjg0YTM5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9kZWJpYW4vZnJlZWRpYW1ldGVyLWRpY3Rpb25hcnktcmZjNDAwNi5pbnN0YWxsCkBAIC0wLDAgKzEgQEAKK3Vzci9saWIvZnJlZURpYW1ldGVyL2RpY3RfZGNjYS5mZHgKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZGViaWFuL2ZyZWVkaWFtZXRlci1kaWN0aW9uYXJ5LXJmYzQwNzIuaW5zdGFsbCBiL2NvbnRyaWIvZGViaWFuL2ZyZWVkaWFtZXRlci1kaWN0aW9uYXJ5LXJmYzQwNzIuaW5zdGFsbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWM0NGFkCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9kZWJpYW4vZnJlZWRpYW1ldGVyLWRpY3Rpb25hcnktcmZjNDA3Mi5pbnN0YWxsCkBAIC0wLDAgKzEgQEAKK3Vzci9saWIvZnJlZURpYW1ldGVyL2RpY3RfZWFwLmZkeApkaWZmIC0tZ2l0IGEvY29udHJpYi9kZWJpYW4vZnJlZWRpYW1ldGVyLWRpY3Rpb25hcnktcmZjNDc0MC5pbnN0YWxsIGIvY29udHJpYi9kZWJpYW4vZnJlZWRpYW1ldGVyLWRpY3Rpb25hcnktcmZjNDc0MC5pbnN0YWxsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ZGJmZTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2RlYmlhbi9mcmVlZGlhbWV0ZXItZGljdGlvbmFyeS1yZmM0NzQwLmluc3RhbGwKQEAgLTAsMCArMSBAQAordXNyL2xpYi9mcmVlRGlhbWV0ZXIvZGljdF9zaXAuZmR4CmRpZmYgLS1naXQgYS9jb250cmliL2RlYmlhbi9mcmVlZGlhbWV0ZXItZWFwLXNlcnZlci5leGFtcGxlcyBiL2NvbnRyaWIvZGViaWFuL2ZyZWVkaWFtZXRlci1lYXAtc2VydmVyLmV4YW1wbGVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhOWVkN2EKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2RlYmlhbi9mcmVlZGlhbWV0ZXItZWFwLXNlcnZlci5leGFtcGxlcwpAQCAtMCwwICsxLDIgQEAKK2RvYy9hcHBfZGlhbWVhcC5jb25mLnNhbXBsZQorZG9jL2VhcF90bHNfcGx1Z2luLmRpYW1lYXAuY29uZi5zYW1wbGUKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZGViaWFuL2ZyZWVkaWFtZXRlci1lYXAtc2VydmVyLmluc3RhbGwgYi9jb250cmliL2RlYmlhbi9mcmVlZGlhbWV0ZXItZWFwLXNlcnZlci5pbnN0YWxsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhZmIxNzQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2RlYmlhbi9mcmVlZGlhbWV0ZXItZWFwLXNlcnZlci5pbnN0YWxsCkBAIC0wLDAgKzEsMiBAQAordXNyL2xpYi9mcmVlRGlhbWV0ZXIvYXBwX2RpYW1lYXAuZmR4Cit1c3IvbGliL2ZyZWVEaWFtZXRlci8qLmVtcApkaWZmIC0tZ2l0IGEvY29udHJpYi9kZWJpYW4vZnJlZWRpYW1ldGVyLXJhZGl1cy1nYXRld2F5LmV4YW1wbGVzIGIvY29udHJpYi9kZWJpYW4vZnJlZWRpYW1ldGVyLXJhZGl1cy1nYXRld2F5LmV4YW1wbGVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMjZkZjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2RlYmlhbi9mcmVlZGlhbWV0ZXItcmFkaXVzLWdhdGV3YXkuZXhhbXBsZXMKQEAgLTAsMCArMSwyIEBACitkb2MvYXBwX3JhZGd3LmNvbmYuc2FtcGxlCitkb2MvZWNob2Ryb3Aucmd3eC5jb25mLnNhbXBsZQpkaWZmIC0tZ2l0IGEvY29udHJpYi9kZWJpYW4vZnJlZWRpYW1ldGVyLXJhZGl1cy1nYXRld2F5Lmluc3RhbGwgYi9jb250cmliL2RlYmlhbi9mcmVlZGlhbWV0ZXItcmFkaXVzLWdhdGV3YXkuaW5zdGFsbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2VlOGRjCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9kZWJpYW4vZnJlZWRpYW1ldGVyLXJhZGl1cy1nYXRld2F5Lmluc3RhbGwKQEAgLTAsMCArMSwyIEBACit1c3IvbGliL2ZyZWVEaWFtZXRlci9hcHBfcmFkZ3cuZmR4Cit1c3IvbGliL2ZyZWVEaWFtZXRlci8qLnJnd3gKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZGViaWFuL2ZyZWVkaWFtZXRlci1zaXAtc2VydmVyLmV4YW1wbGVzIGIvY29udHJpYi9kZWJpYW4vZnJlZWRpYW1ldGVyLXNpcC1zZXJ2ZXIuZXhhbXBsZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ5MjkwYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvZGViaWFuL2ZyZWVkaWFtZXRlci1zaXAtc2VydmVyLmV4YW1wbGVzCkBAIC0wLDAgKzEsNCBAQAorZG9jL2FwcF9zaXAuY29uZi5zYW1wbGUKK2RvYy9hcHBfc2lwLnNxbAorZG9jL2FwcF9zaXBfU0wuc3FsCitkb2MvdGVzdF9zaXAuY29uZi5zYW1wbGUKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZGViaWFuL2ZyZWVkaWFtZXRlci1zaXAtc2VydmVyLmluc3RhbGwgYi9jb250cmliL2RlYmlhbi9mcmVlZGlhbWV0ZXItc2lwLXNlcnZlci5pbnN0YWxsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiOGM2MTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2RlYmlhbi9mcmVlZGlhbWV0ZXItc2lwLXNlcnZlci5pbnN0YWxsCkBAIC0wLDAgKzEsMyBAQAordXNyL2xpYi9mcmVlRGlhbWV0ZXIvYXBwX3NpcC5mZHgKK3Vzci9zaGFyZS9kb2MvZnJlZURpYW1ldGVyLXNpcC1zZXJ2ZXIvKgordXNyL2Jpbi9mcmVlZGlhbWV0ZXItc2lwLSoKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZGViaWFuL3J1bGVzIGIvY29udHJpYi9kZWJpYW4vcnVsZXMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODA4ZjdlYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvZGViaWFuL3J1bGVzCkBAIC0wLDAgKzEsMzEgQEAKKyMhL3Vzci9iaW4vbWFrZSAtZgorIyAtKi0gbWFrZWZpbGUgLSotCisjIFNhbXBsZSBkZWJpYW4vcnVsZXMgdGhhdCB1c2VzIGRlYmhlbHBlci4KKyMKKyMgVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkgSm9leSBIZXNzIGFuZCBDcmFpZyBTbWFsbC4KKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgd2hlbiB0aGlzIGZpbGUgaXMgY29waWVkIGJ5IGRoLW1ha2UgaW50byBhCisjIGRoLW1ha2Ugb3V0cHV0IGZpbGUsIHlvdSBtYXkgdXNlIHRoYXQgb3V0cHV0IGZpbGUgd2l0aG91dCByZXN0cmljdGlvbi4KKyMgVGhpcyBzcGVjaWFsIGV4Y2VwdGlvbiB3YXMgYWRkZWQgYnkgQ3JhaWcgU21hbGwgaW4gdmVyc2lvbiAwLjM3IG9mIGRoLW1ha2UuCisjCisjIE1vZGlmaWVkIHRvIG1ha2UgYSB0ZW1wbGF0ZSBmaWxlIGZvciBhIG11bHRpLWJpbmFyeSBwYWNrYWdlIHdpdGggc2VwYXJhdGVkCisjIGJ1aWxkLWFyY2ggYW5kIGJ1aWxkLWluZGVwIHRhcmdldHMgIGJ5IEJpbGwgQWxsb21iZXJ0IDIwMDEKKworIyBVbmNvbW1lbnQgdGhpcyB0byB0dXJuIG9uIHZlcmJvc2UgbW9kZS4KKyNleHBvcnQgREhfVkVSQk9TRT0xCisKKyMgVGhpcyBoYXMgdG8gYmUgZXhwb3J0ZWQgdG8gbWFrZSBzb21lIG1hZ2ljIGJlbG93IHdvcmsuCitleHBvcnQgREhfT1BUSU9OUworCisjIENvbW1lbnQgdGhpcyBvdXQgaWYgeW91IHdhbnQgdG8gaW5jbHVkZSB0aGUgdGVzdHMgd2hlbiB0aGUgcGFja2FnZSBpcyBidWlsdAorc2tpcF90aGVfdGVzdHM9LURCVUlMRF9URVNUSU5HOkJPT0w9T0ZGCisKKyU6CisJZGggICRACisKK292ZXJyaWRlX2RoX2F1dG9fY29uZmlndXJlOgorCWRoX2F1dG9fY29uZmlndXJlIC0tICQoc2tpcF90aGVfdGVzdHMpIFwKKwkJLURDTUFLRV9CVUlMRF9UWVBFOlNUUklORz1EZWJpYW5QYWNrYWdlIFwKKwkJLURERUZBVUxUX0NPTkZfUEFUSDpQQVRIPS9ldGMvZnJlZURpYW1ldGVyIFwKKwkJLURBTExfRVhURU5TSU9OUzpCT09MPU9OCisJCQorCmRpZmYgLS1naXQgYS9jb250cmliL2RlYmlhbi91cGRhdGVfY2hhbmdlbG9nLnR4dCBiL2NvbnRyaWIvZGViaWFuL3VwZGF0ZV9jaGFuZ2Vsb2cudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNmVmYmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2RlYmlhbi91cGRhdGVfY2hhbmdlbG9nLnR4dApAQCAtMCwwICsxLDMgQEAKK25ldyByZWxlYXNlOiBkY2ggLXYgMS4wLjMgLUQgVU5SRUxFQVNFRCAtLXJlbGVhc2UtaGV1cmlzdGljIGxvZworU2ltcGxlIGFkZGl0aW9uOiBkY2ggImNoYW5nZWxvZyBlbnRyeSB0ZXh0IgorCmRpZmYgLS1naXQgYS9jb250cmliL2RpY3RfZGNjYS9SRUFETUUgYi9jb250cmliL2RpY3RfZGNjYS9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RhM2NjOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvZGljdF9kY2NhL1JFQURNRQpAQCAtMCwwICsxLDUgQEAKK0ZpbGVzIHByb3ZpZGVkIGNvdXJ0ZXN5IG9mIEtvbnN0YW50aW4gQ2hla3VzaGluIHVuZGVyIHRoZSBzYW1lIGxpY2Vuc2UgYXMgZnJlZURpYW1ldGVyLgorCitDb21tZW50OgorIlRoZXkgYXJlIG5vdCBmdWxsLCBJJ3ZlIGZpbGxlZCBvbmx5IHRoYXQgSSB3YW50ZWQgdG8gdXNlIGluIG91ciBhcHBfZGNjYSBtb2R1bGUuICIKKwpkaWZmIC0tZ2l0IGEvY29udHJpYi9kaWN0X2RjY2EvZGljdF9kY2NhXzNncHAuYyBiL2NvbnRyaWIvZGljdF9kY2NhL2RpY3RfZGNjYV8zZ3BwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY3ODQyNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvZGljdF9kY2NhL2RpY3RfZGNjYV8zZ3BwLmMKQEAgLTAsMCArMSw4NDEgQEAKKy8qIAorICogRGljdGlvbmFyeSBkZWZpbml0aW9ucyBvZiBvYmplY3RzIHNwZWNpZmllZCBpbiBEQ0NBIChOb2tpYSwgM0dQUCkuCisgKi8KKyNpbmNsdWRlIDxmcmVlRGlhbWV0ZXIvZXh0ZW5zaW9uLmg+CisKKworLyogVGhlIGNvbnRlbnQgb2YgdGhpcyBmaWxlIGZvbGxvd3MgdGhlIHNhbWUgc3RydWN0dXJlIGFzIGRpY3RfYmFzZV9wcm90by5jICovCisKKyNkZWZpbmUgQ0hFQ0tfZGljdF9uZXcoIF90eXBlLCBfZGF0YSwgX3BhcmVudCwgX3JlZiApCVwKKwlDSEVDS19GQ1QoICBmZF9kaWN0X25ldyggZmRfZ19jb25maWctPmNuZl9kaWN0LCAoX3R5cGUpLCAoX2RhdGEpLCAoX3BhcmVudCksIChfcmVmKSkgICk7CisKKyNkZWZpbmUgQ0hFQ0tfZGljdF9zZWFyY2goIF90eXBlLCBfY3JpdGVyaWEsIF93aGF0LCBfcmVzdWx0ICkJXAorCUNIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIChfdHlwZSksIChfY3JpdGVyaWEpLCAoX3doYXQpLCAoX3Jlc3VsdCksIEVOT0VOVCkgKTsKKworc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24geworCWNoYXIgCQkJKmF2cF9uYW1lOworCWVudW0gcnVsZV9wb3NpdGlvbglwb3NpdGlvbjsKKwlpbnQgCQkJbWluOworCWludAkJCW1heDsKK307CisKKyNkZWZpbmUgUlVMRV9PUkRFUiggX3Bvc2l0aW9uICkgKCgoKF9wb3NpdGlvbikgPT0gUlVMRV9GSVhFRF9IRUFEKSB8fCAoKF9wb3NpdGlvbikgPT0gUlVMRV9GSVhFRF9UQUlMKSkgPyAxIDogMCApCisKKyNkZWZpbmUgUEFSU0VfbG9jX3J1bGVzKCBfcnVsZWFycmF5LCBfcGFyZW50KSB7CQkJCQkJCQlcCisJaW50IF9fYXI7CQkJCQkJCQkJCQlcCisJZm9yIChfX2FyPTA7IF9fYXIgPCBzaXplb2YoX3J1bGVhcnJheSkgLyBzaXplb2YoKF9ydWxlYXJyYXkpWzBdKTsgX19hcisrKSB7CQkJXAorCQlzdHJ1Y3QgZGljdF9ydWxlX2RhdGEgX19kYXRhID0geyBOVUxMLCAJCQkJCQkJXAorCQkJKF9ydWxlYXJyYXkpW19fYXJdLnBvc2l0aW9uLAkJCQkJCQlcCisJCQkwLCAJCQkJCQkJCQkJXAorCQkJKF9ydWxlYXJyYXkpW19fYXJdLm1pbiwJCQkJCQkJCVwKKwkJCShfcnVsZWFycmF5KVtfX2FyXS5tYXh9OwkJCQkJCQlcCisJCV9fZGF0YS5ydWxlX29yZGVyID0gUlVMRV9PUkRFUihfX2RhdGEucnVsZV9wb3NpdGlvbik7CQkJCQlcCisJCUNIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoKCAJCQkJCQkJCVwKKwkJCWZkX2dfY29uZmlnLT5jbmZfZGljdCwJCQkJCQkJCVwKKwkJCURJQ1RfQVZQLCAJCQkJCQkJCQlcCisJCQlBVlBfQllfTkFNRSwgCQkJCQkJCQkJXAorCQkJKF9ydWxlYXJyYXkpW19fYXJdLmF2cF9uYW1lLCAJCQkJCQkJXAorCQkJJl9fZGF0YS5ydWxlX2F2cCwgMCApICk7CQkJCQkJCVwKKwkJaWYgKCAhX19kYXRhLnJ1bGVfYXZwICkgewkJCQkJCQkJXAorCQkJVFJBQ0VfREVCVUcoSU5GTywgIkFWUCBOb3QgZm91bmQ6ICclcyciLCAoX3J1bGVhcnJheSlbX19hcl0uYXZwX25hbWUgKTsJCVwKKwkJCXJldHVybiBFTk9FTlQ7CQkJCQkJCQkJXAorCQl9CQkJCQkJCQkJCQlcCisJCUNIRUNLX0ZDVF9ETyggZmRfZGljdF9uZXcoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9SVUxFLCAmX19kYXRhLCBfcGFyZW50LCBOVUxMKSwJXAorCQkJewkJCQkJCQkgICAgICAgIAkJXAorCQkJCVRSQUNFX0RFQlVHKElORk8sICJFcnJvciBvbiBydWxlIHdpdGggQVZQICclcyciLCAgICAgIAkJCVwKKwkJCQkJIChfcnVsZWFycmF5KVtfX2FyXS5hdnBfbmFtZSApOwkJICAgICAgCQkJXAorCQkJCXJldHVybiBFSU5WQUw7CQkJCQkgICAgICAJCQlcCisJCQl9ICk7CQkJCQkJCSAgICAgIAkJCVwKKwl9CQkJCQkJCQkJICAgICAgCQkJXAorfQorCisjZGVmaW5lIGVudW12YWxfZGVmX3UzMiggX3ZhbF8sIF9zdHJfICkgXAorCQl7IF9zdHJfLCAJCXsgLnUzMiA9IF92YWxfIH19CisKKyNkZWZpbmUgZW51bXZhbF9kZWZfb3MoIF9sZW5fLCBfdmFsXywgX3N0cl8gKSBcCisJCXsgX3N0cl8sIAkJeyAub3MgPSB7IC5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilfdmFsXywgLmxlbiA9IF9sZW5fIH19fQorCisKK3N0YXRpYyBpbnQgZGljdF9kY2NhXzNncHBfZW50cnkoY2hhciAqIGNvbmZmaWxlKQoreworCVRSQUNFX0VOVFJZKCIlcCIsIGNvbmZmaWxlKTsJCQorCQorCS8qIEFwcGxpY2F0aW9ucyBzZWN0aW9uICovCisJewkJCisgICAgICAgICAgICAgICAgLyogQ3JlYXRlIHRoZSB2ZW5kb3JzICovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRpY3RfdmVuZG9yX2RhdGEgdmVuZG9yX2RhdGEgPSB7IDEwNDE1LCAiM0dQUCIgfTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX0ZDVChmZF9kaWN0X25ldyhmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfVkVORE9SLCAmdmVuZG9yX2RhdGEsIE5VTEwsIE5VTEwpKTsKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgCisJfQorCQorCQorCS8qIEFWUCBzZWN0aW9uICovCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgZGljdF9vYmplY3QgKiBBZGRyZXNzX3R5cGU7CisgICAgICAgICAgICAgICAgc3RydWN0IGRpY3Rfb2JqZWN0ICogVVRGOFN0cmluZ190eXBlOworICAgICAgICAgICAgICAgIHN0cnVjdCBkaWN0X29iamVjdCAqIERpYW1ldGVySWRlbnRpdHlfdHlwZTsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgZGljdF9vYmplY3QgKiBEaWFtZXRlclVSSV90eXBlOworICAgICAgICAgICAgICAgIHN0cnVjdCBkaWN0X29iamVjdCAqIFRpbWVfdHlwZTsKKworICAgICAgICAgICAgICAgIENIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkFkZHJlc3MiLCAmQWRkcmVzc190eXBlKTsKKyAgICAgICAgICAgICAgICBDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJVVEY4U3RyaW5nIiwgJlVURjhTdHJpbmdfdHlwZSk7CisgICAgICAgICAgICAgICAgQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiRGlhbWV0ZXJJZGVudGl0eSIsICZEaWFtZXRlcklkZW50aXR5X3R5cGUpOworICAgICAgICAgICAgICAgIENIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkRpYW1ldGVyVVJJIiwgJkRpYW1ldGVyVVJJX3R5cGUpOworICAgICAgICAgICAgICAgIENIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIlRpbWUiLCAmVGltZV90eXBlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgICAgICAgICAgICAgICAgLyogUmVwb3J0aW5nLVJlYXNvbiAqLworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC8qIAorICAgICAgICAgICAgICAgICAgICAgRW51bWVyYXRlZC4gV2lsbCBiZSBwcmVzZW50IGlmIHF1b3RhIHdhcyAKKyAgICAgICAgICAgICAgICAgICAgIGV4aGF1c3RlZCBmb3Igb25lIG9yIG1vcmUgbWV0ZXJpbmcgdHlwZXMuIE9ubHkgCisgICAgICAgICAgICAgICAgICAgICBvbmUgUmVwb3J0aW5nLVJlYXNvbiBBVlAgY2FuIGJlIHByZXNlbnQgaW4gdGhlIAorICAgICAgICAgICAgICAgICAgICAgVXNlZC1TZXJ2aWNlLVVuaXQgQVZQLiAoTm90ZSB0aGF0IHRoZSBSZXBvcnRpbmctCisgICAgICAgICAgICAgICAgICAgICBSZWFzb24gQVZQIG1heSBiZSBwcmVzZW50IGFsc28gYXQgdGhlIE1TQ0MgCisgICAgICAgICAgICAgICAgICAgICBsZXZlbDsgc2VlIGJlbG93LikKKyAgICAgICAgICAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgdmFsdWVzIGFyZSBzdXBwb3J0ZWQ6CisKKyAgICAgICAgICAgICAgICAgICAgIFFVT1RBX0VYSEFVU1RFRCgzKTsgUXVvdGEgZm9yIHRoZSAKKyAgICAgICAgICAgICAgICAgICAgIGFzc29jaWF0ZWQgbWV0ZXJpbmcgdHlwZSBoYXMgYmVlbiAKKyAgICAgICAgICAgICAgICAgICAgIGV4aGF1c3RlZC4gV2l0aCB0aGlzIHJlcG9ydGluZyByZWFzb24gdGhlcmUgaXMgCisgICAgICAgICAgICAgICAgICAgICBvbmx5IG9uZSBtZXRlcmluZyB0eXBlIGluIHRoaXMgVXNlZC1TZXJ2aWNlLQorICAgICAgICAgICAgICAgICAgICAgVW5pdCBBVlAuCisKKyAgICAgICAgICAgICAgICAgICAgIE9USEVSX1FVT1RBX1RZUEUoNSk7IFF1b3RhIGZvciBvbmUgb3IgCisgICAgICAgICAgICAgICAgICAgICBtb3JlIG9mIHRoZSBvdGhlciBtZXRlcmluZyB0eXBlcyBoYXMgYmVlbiAKKyAgICAgICAgICAgICAgICAgICAgIGV4aGF1c3RlZC4gV2l0aCB0aGlzIHJlcG9ydGluZyByZWFzb24gdGhlcmUgCisgICAgICAgICAgICAgICAgICAgICBtYXkgYmUgbXVsdGlwbGUgbWV0ZXJpbmcgdHlwZXMgaW4gVXNlZC0KKyAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2UtVW5pdCBBVlAuCisKKyAgICAgICAgICAgICAgICAgICAgIFBPT0xfRVhIQVVTVEVEKDgpOyBRdW90YSBmcm9tIHRoZSAKKyAgICAgICAgICAgICAgICAgICAgIGNyZWRpdCBwb29sIGhhcyBiZWVuIGV4aGF1c3RlZC4gVGhpcyByZXBvcnRpbmcgCisgICAgICAgICAgICAgICAgICAgICByZWFzb24gaXMgdXNlZCBpZiB0aGUgcXVvdGEgZm9yIHRoZSBhc3NvY2lhdGVkIAorICAgICAgICAgICAgICAgICAgICAgbWV0ZXJpbmcgdHlwZSB3YXMgZ3JhbnRlZCBmcm9tIGEgY3JlZGl0IHBvb2wgCisgICAgICAgICAgICAgICAgICAgICBieSB1c2luZyB0aGUgR1NVLVBvb2wtUmVmZXJlbmNlIEFWUCBpbiB0aGUgCisgICAgICAgICAgICAgICAgICAgICBDQ0EuIFdpdGggdGhpcyByZXBvcnRpbmcgcmVhc29uIHRoZXJlIGlzIG9ubHkgCisgICAgICAgICAgICAgICAgICAgICBvbmUgbWV0ZXJpbmcgdHlwZSBpbiB0aGUgVXNlZC1TZXJ2aWNlLVVuaXQgCisgICAgICAgICAgICAgICAgICAgICBBVlAuCisgICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICAgICAgICp0eXBlOworICAgICAgICAgICAgICAgICAgc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICAgICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAgICJFbnVtZXJhdGVkKFJlcG9ydGluZy1SZWFzb24pIiAsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCQkgIHN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiUUhUIiwgICAgICAgICAgICAgICAgICAgICAgeyAuaTMyID0gMSB9fTsKKwkJCQkgIHN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiRklOQUwiLCAgICAgICAgICAgICAgICAgICAgICB7IC5pMzIgPSAyIH19OworICAgICAgICAgICAgICAgICAgc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMgPSB7ICJRVU9UQV9FWEhBVVNURUQiLCAgICAgICAgICAgICAgICAgICAgICB7IC5pMzIgPSAzIH19OworCQkJCSAgc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzQgPSB7ICJWQUxJRElUWV9USU1FIiwgICAgICAgICAgICAgICAgICAgICAgeyAuaTMyID0gNCB9fTsKKyAgICAgICAgICAgICAgICAgIHN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF81ID0geyAiT1RIRVJfUVVPVEFfVFlQRSIsICAgICAgICB7IC5pMzIgPSA1IH19OworCQkJCSAgc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzYgPSB7ICJSQVRJTkdfQ09ORElUSU9OX0NIQU5HRSIsICAgICAgICB7IC5pMzIgPSA2IH19OworCQkJCSAgc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzcgPSB7ICJGT1JDRURfUkVBVVRIT1JJWkFUSU9OIiwgICAgICAgIHsgLmkzMiA9IDcgfX07CisgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfOCA9IHsgIlBPT0xfRVhIQVVTVEVEIiwgICAgICAgICAgICAgICAgICB7IC5pMzIgPSA4IH19OworCisgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGljdF9hdnBfZGF0YSAgICBkYXRhID0geyAKKyAgICAgICAgICAgICAgICAgICAgODcyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvZGUgKi8KKyAgICAgICAgICAgICAgICAgICAgMTA0MTUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWZW5kb3IgKi8KKyAgICAgICAgICAgICAgICAgICAgIlJlcG9ydGluZy1SZWFzb24iLCAgICAgICAgICAgICAgICAgICAgLyogTmFtZSAqLworICAgICAgICAgICAgICAgICAgICBBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksICAgLyogRml4ZWQgZmxhZ3MgKi8KKyAgICAgICAgICAgICAgICAgICAgQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAgICAgICAgICAgICAgICAgICAgIC8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisgICAgICAgICAgICAgICAgICAgIEFWUF9UWVBFX0lOVEVHRVIzMiAgICAgICAgICAgICAgICAgICAgICAvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgIC8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisgICAgICAgICAgICAgICAgICBDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEgLCBOVUxMLCAmdHlwZSk7CisgICAgICAgICAgICAgICAgICBDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zICwgdHlwZSwgTlVMTCk7CisgICAgICAgICAgICAgICAgICBDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF81ICwgdHlwZSwgTlVMTCk7CisgICAgICAgICAgICAgICAgICBDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF84ICwgdHlwZSwgTlVMTCk7CisgICAgICAgICAgICAgICAgICBDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgdHlwZSwgTlVMTCk7CisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgIAorCisgICAgICAgICAgICAgICAgLyogVHJpZ2dlciAqLworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgIEdyb3VwZWQuIFRoZSBwcmVzZW5jZSBvZiB0aGUgVHJpZ2dlciBBVlAgaW4gdGhlIAorICAgICAgICAgICAgICAgICAgICBDQ1IgaWRlbnRpZmllcyB0aGUgZXZlbnQocykgdHJpZ2dlcmluZyB0aGUgQ0NSLgorICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICAgIHN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisgICAgICAgICAgICAgICAgICAgIDEyNjQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29kZSAqLworICAgICAgICAgICAgICAgICAgICAxMDQxNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZlbmRvciAqLworICAgICAgICAgICAgICAgICAgICAiVHJpZ2dlciIsICAgICAgICAgICAgICAgICAgLyogTmFtZSAqLworICAgICAgICAgICAgICAgICAgICBBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksICAgLyogRml4ZWQgZmxhZ3MgKi8KKyAgICAgICAgICAgICAgICAgICAgQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAgICAgICAgICAgICAgICAgICAgIC8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisgICAgICAgICAgICAgICAgICAgIEFWUF9UWVBFX0dST1VQRUQgICAgICAgICAgICAgICAgICAgICAgICAvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBUcmlnZ2VyLVR5cGUgKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAvKiAKKyAgICAgICAgICAgICAgICAgICAgIEVudW1lcmF0ZWQuIE9uZSBvciBtb3JlIG9mIHRoZXNlIEFWUHMgbWF5IGJlIAorICAgICAgICAgICAgICAgICAgICAgcHJlc2VudC4gSW5kaWNhdGVzIHRoZSBldmVudCB0aGF0IHRyaWdnZXJlZCB0aGUgCisgICAgICAgICAgICAgICAgICAgICBNU0NDLiBTdXBwb3J0ZWQgdmFsdWVzIGFyZToKKworICAgICAgICAgICAgICAgICAgICAgQ0hBTkdFX0lOX1NHU05fSVBfQUREUkVTUyAoMSksIGEgIGNoYW5nZSBpbiB0aGUgU0dTTiBhZGRyZXNzLgorCisgICAgICAgICAgICAgICAgICAgICBDSEFOR0VJTlFPU19BTlkgKDIpLCBhIGNoYW5nZSBpbiB0aGUgUW9TIHByb2ZpbGUKKworICAgICAgICAgICAgICAgICAgICAgQ0hBTkdFSU5SQVQgKDQpLCBhIGNoYW5nZSBpbiByYWRpbyBhY2Nlc3MgdGVjaG5vbG9neQorCisgICAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgICAgICAgc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAgICAgICAqdHlwZTsKKyAgICAgICAgICAgICAgICAgIHN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgICAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgICAiRW51bWVyYXRlZChUcmlnZ2VyLVR5cGUpIiAsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKyAgICAgICAgICAgICAgICAgIHN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiQ0hBTkdFX0lOX1NHU05fSVBfQUREUkVTUyIsICAgICAgICAgICAgICAgICAgICAgIHsgLmkzMiA9IDEgfX07CisgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIkNIQU5HRUlOUU9TX0FOWSIsICAgICAgICB7IC5pMzIgPSAyIH19OworICAgICAgICAgICAgICAgICAgc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzQgPSB7ICJDSEFOR0VJTlJBVCIsICAgICAgICAgICAgICAgICAgeyAuaTMyID0gNCB9fTsKKworICAgICAgICAgICAgICAgICAgc3RydWN0IGRpY3RfYXZwX2RhdGEgICAgZGF0YSA9IHsgCisgICAgICAgICAgICAgICAgICAgIDg3MCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb2RlICovCisgICAgICAgICAgICAgICAgICAgIDEwNDE1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVuZG9yICovCisgICAgICAgICAgICAgICAgICAgICJUcmlnZ2VyLVR5cGUiLCAgICAgICAgICAgICAgICAgICAgLyogTmFtZSAqLworICAgICAgICAgICAgICAgICAgICBBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksICAgLyogRml4ZWQgZmxhZ3MgKi8KKyAgICAgICAgICAgICAgICAgICAgQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAgICAgICAgICAgICAgICAgICAgIC8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisgICAgICAgICAgICAgICAgICAgIEFWUF9UWVBFX0lOVEVHRVIzMiAgICAgICAgICAgICAgICAgICAgICAvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgIC8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisgICAgICAgICAgICAgICAgICBDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEgLCBOVUxMLCAmdHlwZSk7CisgICAgICAgICAgICAgICAgICBDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xICwgdHlwZSwgTlVMTCk7CisgICAgICAgICAgICAgICAgICBDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yICwgdHlwZSwgTlVMTCk7CisgICAgICAgICAgICAgICAgICBDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF80ICwgdHlwZSwgTlVMTCk7CisgICAgICAgICAgICAgICAgICBDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgdHlwZSwgTlVMTCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8qIFNlcnZpY2UtSW5mb3JtYXRpb24gKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAvKiAKKyAgICAgICAgICAgICAgICAgICAgIEdyb3VwZWQuIFRoZSBTZXJ2aWNlLUluZm9ybWF0aW9uIHB1cnBvc2UgaXMgdG8gCisgICAgICAgICAgICAgICAgICAgICBhbGxvdyB0aGUgdHJhbnNtaXNzaW9uIG9mIGFkZGl0aW9uYWwgM0dQUCBzZXJ2aWNlIAorICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWMgaW5mb3JtYXRpb24gZWxlbWVudHMgKDNHUFAgMzIuMjk5IAorICAgICAgICAgICAgICAgICAgICAgUmVsNykuCisgICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworICAgICAgICAgICAgICAgICAgICA4NzMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29kZSAqLworICAgICAgICAgICAgICAgICAgICAxMDQxNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZlbmRvciAqLworICAgICAgICAgICAgICAgICAgICAiU2VydmljZS1JbmZvcm1hdGlvbiIsICAgICAgICAgICAgICAgICAgLyogTmFtZSAqLworICAgICAgICAgICAgICAgICAgICBBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksICAgLyogRml4ZWQgZmxhZ3MgKi8KKyAgICAgICAgICAgICAgICAgICAgQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAgICAgICAgICAgICAgICAgICAgIC8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisgICAgICAgICAgICAgICAgICAgIEFWUF9UWVBFX0dST1VQRUQgICAgICAgICAgICAgICAgICAgICAgICAvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBQUy1JbmZvcm1hdGlvbiAqLworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC8qIAorICAgICAgICAgICAgICAgICAgICAgR3JvdXBlZC4gSXRzIHB1cnBvc2UgaXMgdG8gYWxsb3cgdGhlIHRyYW5zbWlzc2lvbiAKKyAgICAgICAgICAgICAgICAgICAgIG9mIGFkZGl0aW9uYWwgUFMgc2VydmljZSBzcGVjaWZpYyBpbmZvcm1hdGlvbiAKKyAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzICgzR1BQIDMyLjI5OSBSZWw3KS4KKyAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICAgIHN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisgICAgICAgICAgICAgICAgICAgIDg3NCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb2RlICovCisgICAgICAgICAgICAgICAgICAgIDEwNDE1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVuZG9yICovCisgICAgICAgICAgICAgICAgICAgICJQUy1JbmZvcm1hdGlvbiIsICAgICAgICAgICAgICAgICAgLyogTmFtZSAqLworICAgICAgICAgICAgICAgICAgICBBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksICAgLyogRml4ZWQgZmxhZ3MgKi8KKyAgICAgICAgICAgICAgICAgICAgQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAgICAgICAgICAgICAgICAgICAgIC8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisgICAgICAgICAgICAgICAgICAgIEFWUF9UWVBFX0dST1VQRUQgICAgICAgICAgICAgICAgICAgICAgICAvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBQRFAtQWRkcmVzcyAqLworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgIEFkZHJlc3MuIFByZXNlbnQgb25seSBpbiB0aGUgaW5pdGlhbCBDQ1IuIENvbnRhaW5zIAorICAgICAgICAgICAgICAgICAgICB0aGUgdXNlciBlcXVpcG1lbnQgSVAgYWRkcmVzcy4gVGhpcyBBVlAgaXMgCisgICAgICAgICAgICAgICAgICAgIGRlZmluZWQgaW4gM0dQUCAzMi4yOTkgUmVsNy4gCisgICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKyAgICAgICAgICAgICAgICAgICAgMTIyNywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb2RlICovCisgICAgICAgICAgICAgICAgICAgIDEwNDE1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVuZG9yICovCisgICAgICAgICAgICAgICAgICAgICJQRFAtQWRkcmVzcyIsICAgICAgICAgICAgICAgICAgICAgIC8qIE5hbWUgKi8KKyAgICAgICAgICAgICAgICAgICAgQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAgIC8qIEZpeGVkIGZsYWdzICovCisgICAgICAgICAgICAgICAgICAgIEFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgICAgICAgICAgICAgICAgICAgICAvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworICAgICAgICAgICAgICAgICAgICBBVlBfVFlQRV9PQ1RFVFNUUklORyAgICAgICAgICAgICAgICAgICAgLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICBDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgQWRkcmVzc190eXBlLCBOVUxMKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiAzR1BQLUlNU0kgKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAvKgorCQkgICAgSU1TSSBlbmNvZGVkIGluIFVURi04IHBlciAzR1BQIFRTIDIzLjAwMy4gTm8KKwkJICAgIHBhZGRpbmcuIE1heGltdW0gbGVuZ3RoIG9mIGRhdGE6IDE1LgorICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgIHN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorICAgICAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvZGUgKi8KKyAgICAgICAgICAgICAgICAgICAgMTA0MTUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWZW5kb3IgKi8KKyAgICAgICAgICAgICAgICAgICAgIjNHUFAtSU1TSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5hbWUgKi8KKyAgICAgICAgICAgICAgICAgICAgQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAgIC8qIEZpeGVkIGZsYWdzICovCisgICAgICAgICAgICAgICAgICAgIEFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgICAgICAgICAgICAgICAgICAgICAvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworICAgICAgICAgICAgICAgICAgICBBVlBfVFlQRV9PQ1RFVFNUUklORyAgICAgICAgICAgICAgICAgICAgICAvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIDNHUFAtQ2hhcmdpbmctSWQgKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICBVbnNpZ25lZDMyLiAoM0dQUCBUUyAyOS4wNjEgUmVsNykgLiBUaGUgCisgICAgICAgICAgICAgICAgICAgIGNoYXJnaW5nIGlkZW50aWZpZXIgZm9yIHRoZSBQRFAgY29udGV4dC4gVGhlIEZsZXhpIAorICAgICAgICAgICAgICAgICAgICBJU04gZ2VuZXJhdGVzIHRoZSAzR1BQIGNoYXJnaW5nIElEIGZvciBib3RoIAorICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIGFuZCBub3JtYWwgUERQIGNvbnRleHRzIHdpdGggb25lIGV4Y2VwLQorICAgICAgICAgICAgICAgICAgICB0aW9uLiBJZiB0aGUgRmxleGkgSVNOIGFjdHMgYXMgYSBOQVMgc2VydmVyIGFuZCB0aGUgCisgICAgICAgICAgICAgICAgICAgIGNoYXJnaW5nIElEIHNlbGVjdGlvbiBpcyBzZXQgdG8gTkFTIENsaWVudCwgdGhlIAorICAgICAgICAgICAgICAgICAgICBjaGFyZ2luZyBJRCB3aWxsIGJlIHRoZSBOQWFuZCBub3QgdGhlIDNHUFAgY2hhcmdpbmcgSUQgb2YgRmxleGkgSVNOLiAKKyAgICAgICAgICAgICAgICAgICAgUHJlc2VudCBpbiB0aGUgaW5pdGlhbCBDQ1Igb25seS5TIGNsaWVudAorICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgIHN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorICAgICAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvZGUgKi8KKyAgICAgICAgICAgICAgICAgICAgMTA0MTUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWZW5kb3IgKi8KKyAgICAgICAgICAgICAgICAgICAgIjNHUFAtQ2hhcmdpbmctSWQiLCAgICAgICAgICAgICAgICAgICAgICAvKiBOYW1lICovCisgICAgICAgICAgICAgICAgICAgIEFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgICAvKiBGaXhlZCBmbGFncyAqLworICAgICAgICAgICAgICAgICAgICBBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksICAgICAgICAgICAgICAgICAgICAgLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgQVZQX1RZUEVfVU5TSUdORUQzMiAgICAgICAgICAgICAgICAgICAgIC8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsIE5VTEwpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIDNHUFAtUERQLVR5cGUgKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICBFbnVtZXJhdGVkLiAoM0dQUCBUUyAyOS4wNjEgUmVsNyApLiBUeXBlIG9mIAorICAgICAgICAgICAgICAgICAgICBQRFAgY29udGV4dCwgZm9yIGV4YW1wbGUsIElQIG9yIFBQUC4gUHJlc2VudCBpbiAKKyAgICAgICAgICAgICAgICAgICAgdGhlIGluaXRpYWwgQ0NSIG9ubHkuCisJCSAgICAwID0gSVB2NAorCQkgICAgMSA9IFBQUAorCQkgICAgMiA9IElQdjYKKwkJICAgIDMgPSBJUHY0djYKKyAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGljdF9hdnBfZGF0YSAgICBkYXRhID0geyAKKyAgICAgICAgICAgICAgICAgICAgMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb2RlICovCisgICAgICAgICAgICAgICAgICAgIDEwNDE1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVuZG9yICovCisgICAgICAgICAgICAgICAgICAgICIzR1BQLVBEUC1UeXBlIiwgICAgICAgICAgICAgICAgICAgIC8qIE5hbWUgKi8KKyAgICAgICAgICAgICAgICAgICAgQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAgIC8qIEZpeGVkIGZsYWdzICovCisgICAgICAgICAgICAgICAgICAgIEFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgICAgICAgICAgICAgICAgICAgICAvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworICAgICAgICAgICAgICAgICAgICBBVlBfVFlQRV9VTlNJR05FRDMyICAgICAgICAgICAgICAgICAgICAgIC8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsIE5VTEwpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIDNHUFAtQ0ctQWRkcmVzcyAqLworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgIE9jdGV0U3RyaW5nLiAoM0dQUCBUUyAyOS4wNjEgUmVsNCkuIFRoZSBhZGRyZXNzIAorICAgICAgICAgICAgICAgICAgICBvZiB0aGUgY2hhcmdpbmcgZ2F0ZXdheSB0aGF0IGhhcyBiZWVuIG1hcmtlZCBhcyAKKyAgICAgICAgICAgICAgICAgICAgdGhlIGRlZmF1bHQgY2hhcmdpbmcgZ2F0ZXdheSBmb3IgdGhlIFBEUCBjb250ZXh0LiAKKyAgICAgICAgICAgICAgICAgICAgVGhlIGFkZHJlc3MgaXMgZXhwcmVzc2VkIGFzIGEgZm91ci1ieXRlIGludGVnZXIuIAorICAgICAgICAgICAgICAgICAgICBQcmVzZW50IGluIHRoZSBpbml0aWFsIENDUiBvbmx5LgorICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgIHN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorICAgICAgICAgICAgICAgICAgICA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvZGUgKi8KKyAgICAgICAgICAgICAgICAgICAgMTA0MTUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWZW5kb3IgKi8KKyAgICAgICAgICAgICAgICAgICAgIjNHUFAtQ0ctQWRkcmVzcyIsICAgICAgICAgICAgICAgICAgICAgIC8qIE5hbWUgKi8KKyAgICAgICAgICAgICAgICAgICAgQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAgIC8qIEZpeGVkIGZsYWdzICovCisgICAgICAgICAgICAgICAgICAgIEFWUF9GTEFHX1ZFTkRPUiwgICAgICAgICAgICAgICAgICAgICAvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworICAgICAgICAgICAgICAgICAgICBBVlBfVFlQRV9PQ1RFVFNUUklORyAgICAgICAgICAgICAgICAgICAgIC8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIEFkZHJlc3NfdHlwZSwgTlVMTCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogM0dQUC1HUFJTLU5lZ290aWF0ZWQtUW9TLVByb2ZpbGUgKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAvKiAKKyAgICAgICAgICAgICAgICAgICAgIFVURjhTdHJpbmcuICgzR1BQIFRTIDI5LjA2MSBSZWw3ICkuIFRoZSBRb1MgCisgICAgICAgICAgICAgICAgICAgICBwcm9maWxlIGFwcGxpZWQgYnkgdGhlIEZsZXhpIElTTi4gSW4gdXBkYXRlIGFuZCB0ZXItCisgICAgICAgICAgICAgICAgICAgICBtaW5hdGlvbiByZXF1ZXN0cywgdGhpcyBBVlAgaXMgcHJlc2VudCBvbmx5IHdoZW4gCisgICAgICAgICAgICAgICAgICAgICB0aGUgQ0NSIGhhcyBiZWVuIHRyaWdnZXJlZCBieSBhIFBEUCBjb250ZXh0IAorICAgICAgICAgICAgICAgICAgICAgdXBkYXRlIGFmZmVjdGluZyB0aGUgbmVnb3RpYXRlZCBRb1MKKwkJICAgICBFYWNoIG9jdGV0IGlzIGRlc2NyaWJlZCBieSB0d28gVVRGLTgtZW5jb2RlZAorICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVycyBkZW5vdGluZyB0aGUgaGV4YWRlY2ltYWwKKyAgICAgICAgICAgICAgICAgICAgIHJlcHJlc2VudGF0aW9uLgorICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgIHN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorICAgICAgICAgICAgICAgICAgICA1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvZGUgKi8KKyAgICAgICAgICAgICAgICAgICAgMTA0MTUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWZW5kb3IgKi8KKyAgICAgICAgICAgICAgICAgICAgIjNHUFAtR1BSUy1OZWdvdGlhdGVkLVFvUy1Qcm9maWxlIiwgICAgICAgICAgICAgICAgICAgIC8qIE5hbWUgKi8KKyAgICAgICAgICAgICAgICAgICAgQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAgIC8qIEZpeGVkIGZsYWdzICovCisgICAgICAgICAgICAgICAgICAgIEFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgICAgICAgICAgICAgICAgICAgICAvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworICAgICAgICAgICAgICAgICAgICBBVlBfVFlQRV9PQ1RFVFNUUklORyAgICAgICAgICAgICAgICAgICAgICAvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIDNHUFAtU0dTTi1BZGRyZXNzICovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgT2N0ZXRTdHJpbmcuICgzR1BQIFRTIDI5LjA2MSBSZWw0KS4gVGhlIGFkZHJlc3MgCisgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBjaGFyZ2luZyBnYXRld2F5IHRoYXQgaGFzIGJlZW4gbWFya2VkIGFzIAorICAgICAgICAgICAgICAgICAgICB0aGUgZGVmYXVsdCBjaGFyZ2luZyBnYXRld2F5IGZvciB0aGUgUERQIGNvbnRleHQuIAorICAgICAgICAgICAgICAgICAgICBUaGUgYWRkcmVzcyBpcyBleHByZXNzZWQgYXMgYSBmb3VyLWJ5dGUgaW50ZWdlci4gCisgICAgICAgICAgICAgICAgICAgIFByZXNlbnQgaW4gdGhlIGluaXRpYWwgQ0NSIG9ubHkuCisgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisgICAgICAgICAgICAgICAgICAgIDYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29kZSAqLworICAgICAgICAgICAgICAgICAgICAxMDQxNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZlbmRvciAqLworICAgICAgICAgICAgICAgICAgICAiM0dQUC1TR1NOLUFkZHJlc3MiLCAgICAgICAgICAgICAgICAgICAgICAvKiBOYW1lICovCisgICAgICAgICAgICAgICAgICAgIEFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgICAvKiBGaXhlZCBmbGFncyAqLworICAgICAgICAgICAgICAgICAgICBBVlBfRkxBR19WRU5ET1IsICAgICAgICAgICAgICAgICAgICAgLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgQVZQX1RZUEVfT0NURVRTVFJJTkcgICAgICAgICAgICAgICAgICAgICAvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBBZGRyZXNzX3R5cGUsIE5VTEwpOworICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAKKworICAgICAgICAgICAgICAgIC8qIDNHUFAtR0dTTi1BZGRyZXNzICovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgT2N0ZXRTdHJpbmcuICgzR1BQIFRTIDI5LjA2MSBSZWw0KS4gVXN1YWxseSB0aGUgCisgICAgICAgICAgICAgICAgICAgIElQIGFkZHJlc3Mgb2YgRmxleGkgSVNOLiBUaGUgb25seSBleGNlcHRpb24gaXMgCisgICAgICAgICAgICAgICAgICAgIHdoZW4gdGhlIEZsZXhpIElTTiBhY3RzIGFzIGEgTkFTIHNlcnZlciBhbmQgdGhlIAorICAgICAgICAgICAgICAgICAgICBjaGFyZ2luZyBJRCBzZWxlY3Rpb24gaXMgc2V0IHRvIE5BUyBDbGllbnQ7IHRoZW4gdGhlIAorICAgICAgICAgICAgICAgICAgICBHR1NOIElQIGFkZHJlc3Mgd2lsbCBiZSB0aGUgTkFJUCBhZGRyZXNzLiBQcmVzZW50IGluIHRoZSBpbml0aWFsIENDUiBvbmx5LlMgY2xpZW50CisgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisgICAgICAgICAgICAgICAgICAgIDcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29kZSAqLworICAgICAgICAgICAgICAgICAgICAxMDQxNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZlbmRvciAqLworICAgICAgICAgICAgICAgICAgICAiM0dQUC1HR1NOLUFkZHJlc3MiLCAgICAgICAgICAgICAgICAgICAgICAvKiBOYW1lICovCisgICAgICAgICAgICAgICAgICAgIEFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgICAvKiBGaXhlZCBmbGFncyAqLworICAgICAgICAgICAgICAgICAgICBBVlBfRkxBR19WRU5ET1IsICAgICAgICAgICAgICAgICAgICAgLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgQVZQX1RZUEVfT0NURVRTVFJJTkcgICAgICAgICAgICAgICAgICAgICAvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBBZGRyZXNzX3R5cGUsIE5VTEwpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIDNHUFAtSU1TSS1NQ0MtTU5DICovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgVVRGOFN0cmluZy4gTUNDIGFuZCBNTkMgZXh0cmFjdGVkIGZyb20gdGhlIAorICAgICAgICAgICAgICAgICAgICB1c2VyJ3MgSU1TSSAoZmlyc3QgNSBvciA2IGRpZ2l0cywgYXMgYXBwbGljYWJsZSBmcm9tIAorICAgICAgICAgICAgICAgICAgICB0aGUgcHJlc2VudGVkIElNU0kpLiBUaGUgTUNDLU1OQ3MgYXJlIAorICAgICAgICAgICAgICAgICAgICBleHRyYWN0ZWQgZnJvbSB0aGUgdGFibGVzIGNvbmZpZ3VyZWQgaW4gRmxleGlJU04gCisgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gdW5kZXIgdGhlIEdlbmVyYWwgYW5kIFJvYW1pbmcgCisgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25zLgorICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgIHN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorICAgICAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvZGUgKi8KKyAgICAgICAgICAgICAgICAgICAgMTA0MTUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWZW5kb3IgKi8KKyAgICAgICAgICAgICAgICAgICAgIjNHUFAtSU1TSS1NQ0MtTU5DIiwgICAgICAgICAgICAgICAgICAgIC8qIE5hbWUgKi8KKyAgICAgICAgICAgICAgICAgICAgQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAgIC8qIEZpeGVkIGZsYWdzICovCisgICAgICAgICAgICAgICAgICAgIEFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgICAgICAgICAgICAgICAgICAgICAvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworICAgICAgICAgICAgICAgICAgICBBVlBfVFlQRV9PQ1RFVFNUUklORyAgICAgICAgICAgICAgICAgICAgICAvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIDNHUFAtR0dTTi1NQ0MtTU5DICovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgLyogCisgICAgICAgICAgICAgICAgICAgICBVVEY4U3RyaW5nLiAoM0dQUCBUUyAyOS4wNjEgUmVsNyApLiBDb250YWlucyAKKyAgICAgICAgICAgICAgICAgICAgIHRoZSBtb2JpbGUgY291bnRyeSBhbmQgbmV0d29yayBjb2RlIG9mIHRoZSBQTE1OIAorICAgICAgICAgICAgICAgICAgICAgdGhhdCB0aGUgRmxleGkgSVNOIGJlbG9uZ3MgdG8uIFByZXNlbnQgaW4gdGhlIGluaXRpYWwgCisgICAgICAgICAgICAgICAgICAgICBDQ1Igb25seS4gVGhlIGZpcnN0IGVudHJ5IGluIHRoZSBsaXN0IG9mIGxvY2FsIFBMTU5zIAorICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIEZsZXhpIElTTiBjb25maWd1cmF0aW9uIGRldGVybWluZXMgdGhlIHZhbHVlIAorICAgICAgICAgICAgICAgICAgICAgb2YgdGhpcyBBVlAuCisgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisgICAgICAgICAgICAgICAgICAgIDksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29kZSAqLworICAgICAgICAgICAgICAgICAgICAxMDQxNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZlbmRvciAqLworICAgICAgICAgICAgICAgICAgICAiM0dQUC1HR1NOLU1DQy1NTkMiLCAgICAgICAgICAgICAgICAgICAgLyogTmFtZSAqLworICAgICAgICAgICAgICAgICAgICBBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksICAgLyogRml4ZWQgZmxhZ3MgKi8KKyAgICAgICAgICAgICAgICAgICAgQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAgICAgICAgICAgICAgICAgICAgIC8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisgICAgICAgICAgICAgICAgICAgIEFWUF9UWVBFX09DVEVUU1RSSU5HICAgICAgICAgICAgICAgICAgICAgIC8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogM0dQUC1OU0FQSSAqLworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC8qIAorICAgICAgICAgICAgICAgICAgICAgVVRGOFN0cmluZy4gKDNHUFAgVFMgMjkuMDYxIFJlbDcgKS4gSW5kaWNhdGVzIAorICAgICAgICAgICAgICAgICAgICAgdGhlIE5TQVBJIG9mIHRoZSBQRFAgY29udGV4dC4gQ29udGFpbnMgb25lIG9jdGV0IAorICAgICAgICAgICAgICAgICAgICAgY29uc2lzdGluZyBvZiBhIHNpbmdsZSBkaWdpdC4gUHJlc2VudCBpbiB0aGUgaW5pdGlhbCAKKyAgICAgICAgICAgICAgICAgICAgIENDUiBvbmx5LgorICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgIHN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorICAgICAgICAgICAgICAgICAgICAxMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb2RlICovCisgICAgICAgICAgICAgICAgICAgIDEwNDE1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVuZG9yICovCisgICAgICAgICAgICAgICAgICAgICIzR1BQLU5TQVBJIiwgICAgICAgICAgICAgICAgICAgIC8qIE5hbWUgKi8KKyAgICAgICAgICAgICAgICAgICAgQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAgIC8qIEZpeGVkIGZsYWdzICovCisgICAgICAgICAgICAgICAgICAgIEFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgICAgICAgICAgICAgICAgICAgICAvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworICAgICAgICAgICAgICAgICAgICBBVlBfVFlQRV9PQ1RFVFNUUklORyAgICAgICAgICAgICAgICAgICAgICAvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIDNHUFAtU2Vzc2lvbi1TdG9wLUluZGljYXRvciAqLworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgIE9jdGV0U3RyaW5nLiAoM0dQUCBUUyAyOS4wNjEgUmVsNCkuIFRoZSAKKyAgICAgICAgICAgICAgICAgICAgcHJlc2VuY2Ugb2YgdGhpcyBBVlAgaW5kaWNhdGVzIHRoYXQgdGhlIGxhc3QgCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQgb2YgdGhlIFBEUCBzZXNzaW9uIGhhcyBiZWVuIGRlbGV0ZWQuIE1heSAKKyAgICAgICAgICAgICAgICAgICAgYmUgcHJlc2VudCBpbiB0aGUgdGVybWluYXRpb24gQ0NSIG9ubHkuIENvbnRhaW5zIAorICAgICAgICAgICAgICAgICAgICBvbmUgb2N0ZXQgdGhhdCBoYXMgYSB2YWx1ZSBvZiAweGZmLgorICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgIHN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorICAgICAgICAgICAgICAgICAgICAxMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb2RlICovCisgICAgICAgICAgICAgICAgICAgIDEwNDE1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVuZG9yICovCisgICAgICAgICAgICAgICAgICAgICIzR1BQLVNlc3Npb24tU3RvcC1JbmRpY2F0b3IiLCAgICAgICAgICAgICAgICAgICAgICAvKiBOYW1lICovCisgICAgICAgICAgICAgICAgICAgIEFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgICAvKiBGaXhlZCBmbGFncyAqLworICAgICAgICAgICAgICAgICAgICBBVlBfRkxBR19WRU5ET1IsICAgICAgICAgICAgICAgICAgICAgLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgQVZQX1RZUEVfT0NURVRTVFJJTkcgICAgICAgICAgICAgICAgICAgICAvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiAzR1BQLVNlbGVjdGlvbi1Nb2RlICovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgVVRGOFN0cmluZy4gKDNHUFAgVFMgMjkuMDYxIFJlbDcgKS4gQ29uc2lzdHMgb2YgCisgICAgICAgICAgICAgICAgICAgIG9uZSBvY3RldCBjb250YWluaW5nIHRoZSBzZWxlY3Rpb24gbW9kZSBhcyAKKyAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZWQgZnJvbSBTR1NOIGluIHRoZSBDcmVhdGUgUERQIENvbnRleHQgCisgICAgICAgICAgICAgICAgICAgIFJlcXVlc3QuIFByZXNlbnQgaW4gdGhlIGluaXRpYWwgQ0NSIG9ubHkuCisgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisgICAgICAgICAgICAgICAgICAgIDEyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvZGUgKi8KKyAgICAgICAgICAgICAgICAgICAgMTA0MTUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWZW5kb3IgKi8KKyAgICAgICAgICAgICAgICAgICAgIjNHUFAtU2VsZWN0aW9uLU1vZGUiLCAgICAgICAgICAgICAgICAgICAgLyogTmFtZSAqLworICAgICAgICAgICAgICAgICAgICBBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksICAgLyogRml4ZWQgZmxhZ3MgKi8KKyAgICAgICAgICAgICAgICAgICAgQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAgICAgICAgICAgICAgICAgICAgIC8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisgICAgICAgICAgICAgICAgICAgIEFWUF9UWVBFX09DVEVUU1RSSU5HICAgICAgICAgICAgICAgICAgICAgIC8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogM0dQUC1DaGFyZ2luZy1DaGFyYWN0ZXJpc3RpY3MgKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICBVVEY4U3RyaW5nLiAoM0dQUCBUUyAyOS4wNjEgUmVsNyApLiBUaGUgCisgICAgICAgICAgICAgICAgICAgIGNoYXJnaW5nIGNoYXJhY3RlcmlzdGljcyBmb3IgdGhlIFBEUCBjb250ZXh0LiAKKyAgICAgICAgICAgICAgICAgICAgUHJlc2VudCBpbiB0aGUgaW5pdGlhbCBDQ1Igb25seS4gQ29uc2lzdHMgb2YgZm91ciAKKyAgICAgICAgICAgICAgICAgICAgb2N0ZXRzLiBFYWNoIG9jdGV0IGNvbnRhaW5zIGEgc2luZ2xlIFVURi04IAorICAgICAgICAgICAgICAgICAgICBlbmNvZGVkIGRpZ2l0LiBUaGUgY29udGVudCBvZiB0aGUgY2hhcmdpbmcgY2hhcmFjLQorICAgICAgICAgICAgICAgICAgICB0ZXJpc3RpY3MgaXMgZGVzY3JpYmVkIGluIDNHUFAgVFMgMzIuMjE1LgorICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgIHN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorICAgICAgICAgICAgICAgICAgICAxMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb2RlICovCisgICAgICAgICAgICAgICAgICAgIDEwNDE1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVuZG9yICovCisgICAgICAgICAgICAgICAgICAgICIzR1BQLUNoYXJnaW5nLUNoYXJhY3RlcmlzdGljcyIsICAgICAgICAgICAgICAgICAgICAvKiBOYW1lICovCisgICAgICAgICAgICAgICAgICAgIEFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgICAvKiBGaXhlZCBmbGFncyAqLworICAgICAgICAgICAgICAgICAgICBBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksICAgICAgICAgICAgICAgICAgICAgLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgQVZQX1RZUEVfT0NURVRTVFJJTkcgICAgICAgICAgICAgICAgICAgICAgLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICBDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiAzR1BQLUNHLUlQdjYtQWRkcmVzcyAqLworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgIFVURjhTdHJpbmcuLiAoM0dQUCBUUyAyOS4wNjEgUmVsPyAoPD0xMCkgKS4gVGhlIAorCQkgICAgSVB2NiBhZGRyZXNzIG9mIHRoZSBjaGFyZ2luZyBnYXRld2F5LgorICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgIHN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorICAgICAgICAgICAgICAgICAgICAxNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb2RlICovCisgICAgICAgICAgICAgICAgICAgIDEwNDE1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVuZG9yICovCisgICAgICAgICAgICAgICAgICAgICIzR1BQLUNHLUlQdjYtQWRkcmVzcyIsICAgICAgICAgICAgICAgICAgICAvKiBOYW1lICovCisgICAgICAgICAgICAgICAgICAgIEFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgICAvKiBGaXhlZCBmbGFncyAqLworICAgICAgICAgICAgICAgICAgICBBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksICAgICAgICAgICAgICAgICAgICAgLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgQVZQX1RZUEVfT0NURVRTVFJJTkcgICAgICAgICAgICAgICAgICAgICAgLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICBDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiAzR1BQLVNHU04tSVB2Ni1BZGRyZXNzICovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgVVRGOFN0cmluZy4uICgzR1BQIFRTIDI5LjA2MSBSZWw/ICg8PTEwKSApLiBUaGUgCisJCSAgICBJUHY2IGFkZHJlc3Mgb2YgdGhlIFNHU04uCisgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisgICAgICAgICAgICAgICAgICAgIDE1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvZGUgKi8KKyAgICAgICAgICAgICAgICAgICAgMTA0MTUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWZW5kb3IgKi8KKyAgICAgICAgICAgICAgICAgICAgIjNHUFAtU0dTTi1JUHY2LUFkZHJlc3MiLCAgICAgICAgICAgICAgICAgICAgLyogTmFtZSAqLworICAgICAgICAgICAgICAgICAgICBBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksICAgLyogRml4ZWQgZmxhZ3MgKi8KKyAgICAgICAgICAgICAgICAgICAgQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAgICAgICAgICAgICAgICAgICAgIC8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisgICAgICAgICAgICAgICAgICAgIEFWUF9UWVBFX09DVEVUU1RSSU5HICAgICAgICAgICAgICAgICAgICAgIC8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogM0dQUC1HR1NOLUlQdjYtQWRkcmVzcyAqLworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgIFVURjhTdHJpbmcuLiAoM0dQUCBUUyAyOS4wNjEgUmVsPyAoPD0xMCkgKS4gVGhlIAorCQkgICAgSVB2NiBhZGRyZXNzIG9mIHRoZSBHR1NOLgorICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgIHN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorICAgICAgICAgICAgICAgICAgICAxNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb2RlICovCisgICAgICAgICAgICAgICAgICAgIDEwNDE1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVuZG9yICovCisgICAgICAgICAgICAgICAgICAgICIzR1BQLUdHU04tSVB2Ni1BZGRyZXNzIiwgICAgICAgICAgICAgICAgICAgIC8qIE5hbWUgKi8KKyAgICAgICAgICAgICAgICAgICAgQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAgIC8qIEZpeGVkIGZsYWdzICovCisgICAgICAgICAgICAgICAgICAgIEFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgICAgICAgICAgICAgICAgICAgICAvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworICAgICAgICAgICAgICAgICAgICBBVlBfVFlQRV9PQ1RFVFNUUklORyAgICAgICAgICAgICAgICAgICAgICAvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIDNHUFAtR0dTTi1JUHY2LUROUy1TZXJ2ZXJzICovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgVVRGOFN0cmluZy4uICgzR1BQIFRTIDI5LjA2MSBSZWw/ICg8PTEwKSApLiBMaXN0CisJCSAgICBvZiBJUHY2IGFkZHJlc3NlcyBvZiBETlMgc2VydmVycyBmb3IgYW4gQVBOIGluCisJCSAgICBvcmRlciBvZiBwcmVmZXJlbmNlIChtYXguIDE1IHNlcnZlcnMsIDE2IGJ5dGVzCisJCSAgICBlYWNoKS4KKyAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKyAgICAgICAgICAgICAgICAgICAgMTcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29kZSAqLworICAgICAgICAgICAgICAgICAgICAxMDQxNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZlbmRvciAqLworICAgICAgICAgICAgICAgICAgICAiM0dQUC1HR1NOLUlQdjYtRE5TLVNlcnZlcnMiLCAgICAgICAgICAgICAgICAgICAgLyogTmFtZSAqLworICAgICAgICAgICAgICAgICAgICBBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksICAgLyogRml4ZWQgZmxhZ3MgKi8KKyAgICAgICAgICAgICAgICAgICAgQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAgICAgICAgICAgICAgICAgICAgIC8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisgICAgICAgICAgICAgICAgICAgIEFWUF9UWVBFX09DVEVUU1RSSU5HICAgICAgICAgICAgICAgICAgICAgIC8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogM0dQUC1TR1NOLU1DQy1NTkMgKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAvKiAKKyAgICAgICAgICAgICAgICAgICAgIFVURjhTdHJpbmcuICgzR1BQIFRTIDI5LjA2MSBSZWw3ICkuIE1DQyBhbmQgCisgICAgICAgICAgICAgICAgICAgICBNTkMgZXh0cmFjdGVkIGZyb20gdGhlIFJBSSB3aXRoaW4gQ3JlYXRlIG9yIAorICAgICAgICAgICAgICAgICAgICAgVXBkYXRlIFBEUCBDb250ZXh0IFJlcXVlc3QuIEluIHVwZGF0ZSBhbmQgdGVyLQorICAgICAgICAgICAgICAgICAgICAgbWluYXRpb24gcmVxdWVzdHMsIHRoaXMgQVZQIGlzIHByZXNlbnQgb25seSB3aGVuIAorICAgICAgICAgICAgICAgICAgICAgdGhlIENDUiBoYXMgYmVlbiB0cmlnZ2VyZWQgYnkgYSByb3V0aW5nIGFyZWEgCisgICAgICAgICAgICAgICAgICAgICB1cGRhdGUuCisgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisgICAgICAgICAgICAgICAgICAgIDE4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvZGUgKi8KKyAgICAgICAgICAgICAgICAgICAgMTA0MTUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWZW5kb3IgKi8KKyAgICAgICAgICAgICAgICAgICAgIjNHUFAtU0dTTi1NQ0MtTU5DIiwgICAgICAgICAgICAgICAgICAgIC8qIE5hbWUgKi8KKyAgICAgICAgICAgICAgICAgICAgQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAgIC8qIEZpeGVkIGZsYWdzICovCisgICAgICAgICAgICAgICAgICAgIEFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgICAgICAgICAgICAgICAgICAgICAvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworICAgICAgICAgICAgICAgICAgICBBVlBfVFlQRV9PQ1RFVFNUUklORyAgICAgICAgICAgICAgICAgICAgICAvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIE1pc3Npbmc6IDNHUFAtVGVhcmRvd24tSW5kaWNhdG9yICgxOSkgKi8KKworICAgICAgICAgICAgICAgIC8qIDNHUFAtSU1FSVNWICovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgLyoKKwkJICAgIElNRUkoU1YpIGVuY29kZWQgYXMgc2VxdWVuY2Ugb2YgVVRGOCBjaGFyYWN0ZXJzLgorICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgIHN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorICAgICAgICAgICAgICAgICAgICAyMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb2RlICovCisgICAgICAgICAgICAgICAgICAgIDEwNDE1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVuZG9yICovCisgICAgICAgICAgICAgICAgICAgICIzR1BQLUlNRUlTViIsICAgICAgICAgICAgICAgICAgICAgIC8qIE5hbWUgKi8KKyAgICAgICAgICAgICAgICAgICAgQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAgIC8qIEZpeGVkIGZsYWdzICovCisgICAgICAgICAgICAgICAgICAgIEFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgICAgICAgICAgICAgICAgICAgICAvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworICAgICAgICAgICAgICAgICAgICBBVlBfVFlQRV9PQ1RFVFNUUklORyAgICAgICAgICAgICAgICAgICAgIC8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogM0dQUC1SQVQtVHlwZSAqLworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC8qIAorICAgICAgICAgICAgICAgICAgICAgT2N0ZXRTdHJpbmcuICgzR1BQIFRTIDI5LjA2MSBSZWw3ICkgRGVmaW5lcyB0aGUgCisgICAgICAgICAgICAgICAgICAgICBtZXRob2QgdXNlZCB0byBhY2Nlc3MgdGhlIG5ldHdvcmsuIENvbnNpc3RzIG9mIGEgCisgICAgICAgICAgICAgICAgICAgICBzaW5nbGUgb2N0ZXQuIFRoZSBmb2xsb3dpbmcgdmFsdWVzIG1heSBiZSBzZW50OgorICAgICAgICAgICAgICAgICAgICAgVVRSQU4gKDEpLCBHRVJBTiAoMiksIFdMQU4gKDMpLCBOQVMgKDI1NCksIAorICAgICAgICAgICAgICAgICAgICAgVW5zcGVjaWZpZWQgKDI1NSkuIAorICAgICAgICAgICAgICAgICAgICAgVGhpcyBBVlAgaXMgaW5jbHVkZWQgaW4gdGhlIGluaXRpYWwgQ0NSIGFuZCBpbiAKKyAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZSBvciB0ZXJtaW5hdGlvbiBDQ1JzIGlmIHRoZSB2YWx1ZSBjaGFuZ2VzLgorICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgIHN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorICAgICAgICAgICAgICAgICAgICAyMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb2RlICovCisgICAgICAgICAgICAgICAgICAgIDEwNDE1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVuZG9yICovCisgICAgICAgICAgICAgICAgICAgICIzR1BQLVJBVC1UeXBlIiwgICAgICAgICAgICAgICAgICAgICAgLyogTmFtZSAqLworICAgICAgICAgICAgICAgICAgICBBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksICAgLyogRml4ZWQgZmxhZ3MgKi8KKyAgICAgICAgICAgICAgICAgICAgQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAgICAgICAgICAgICAgICAgICAgIC8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisgICAgICAgICAgICAgICAgICAgIEFWUF9UWVBFX09DVEVUU1RSSU5HICAgICAgICAgICAgICAgICAgICAgLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICBDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgTlVMTCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogM0dQUC1Vc2VyLUxvY2F0aW9uLUluZm8gKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICBPY3RldFN0cmluZy4gKDNHUFAgVFMgMjkuMDYxIFJlbDcgKSBDb250YWlucyAKKyAgICAgICAgICAgICAgICAgICAgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHVzZXIncyBjdXJyZW50IGdlb2dyYXBoaWNhbCAKKyAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gYXMgcmVjZWl2ZWQgZnJvbSB0aGUgU0dTTi4gUHJlc2VudCAKKyAgICAgICAgICAgICAgICAgICAgYWx3YXlzIGluIGluaXRpYWwgQ0NSIGlmIHRoZSB2YWx1ZSBpcyBrbm93biBhbmQgaW4gCisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZSBhbmQgdGVybWluYXRpb24gQ0NScyBpZiB0aGUgdmFsdWUgCisgICAgICAgICAgICAgICAgICAgIGNoYW5nZXMuCisgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisgICAgICAgICAgICAgICAgICAgIDIyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvZGUgKi8KKyAgICAgICAgICAgICAgICAgICAgMTA0MTUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWZW5kb3IgKi8KKyAgICAgICAgICAgICAgICAgICAgIjNHUFAtVXNlci1Mb2NhdGlvbi1JbmZvIiwgICAgICAgICAgICAgICAgICAgICAgLyogTmFtZSAqLworICAgICAgICAgICAgICAgICAgICBBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksICAgLyogRml4ZWQgZmxhZ3MgKi8KKyAgICAgICAgICAgICAgICAgICAgQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAgICAgICAgICAgICAgICAgICAgIC8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisgICAgICAgICAgICAgICAgICAgIEFWUF9UWVBFX09DVEVUU1RSSU5HICAgICAgICAgICAgICAgICAgICAgLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICBDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgTlVMTCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogM0dQUC1NUy1UaW1lWm9uZSAqLworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgIE9jdGV0U3RyaW5nLiAoM0dQUCBUUyAyOS4wNjEgUmVsNyApIDNHUFAtTVMtCisgICAgICAgICAgICAgICAgICAgIFRpbWVab25lIGlzIEFWUCBpcyBwcmVzZW50IGFsd2F5cyBpbiB0aGUgaW5pdGlhbCBDQ1IgaWYgdGhlIAorICAgICAgICAgICAgICAgICAgICB2YWx1ZSBpcyBrbm93biBhbmQgaW4gdGhlIHVwZGF0ZSBhbmQgdGVybWluYXRpb24gCisgICAgICAgICAgICAgICAgICAgIENDUnMgaWYgdGhlIHZhbHVlIGNoYW5nZXMuIFRoaXMgSUUgaXMgZW5jb2RlZCAKKyAgICAgICAgICAgICAgICAgICAgYWNjb3JkaW5nIHRvIDNHUFAgVFMgMjkuMDYxIFJlbDcKKyAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKyAgICAgICAgICAgICAgICAgICAgMjMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29kZSAqLworICAgICAgICAgICAgICAgICAgICAxMDQxNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZlbmRvciAqLworICAgICAgICAgICAgICAgICAgICAiM0dQUC1NUy1UaW1lWm9uZSIsICAgICAgICAgICAgICAgICAgICAgIC8qIE5hbWUgKi8KKyAgICAgICAgICAgICAgICAgICAgQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAgIC8qIEZpeGVkIGZsYWdzICovCisgICAgICAgICAgICAgICAgICAgIEFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgICAgICAgICAgICAgICAgICAgICAvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworICAgICAgICAgICAgICAgICAgICBBVlBfVFlQRV9PQ1RFVFNUUklORyAgICAgICAgICAgICAgICAgICAgIC8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsIE5VTEwpOworICAgICAgICAgICAgICAgIH0KKworCQkvKiBNaXNzaW5nOiAzR1BQLUNBTUVMLUNoYXJnaW5nLUluZm8gKDI0KSAqLworCQkvKiBNaXNzaW5nOiAzR1BQLVBhY2tldC1GaWx0ZXIgKDI1KSAqLworCQkvKiBNaXNzaW5nOiAzR1BQLU5lZ290aWF0ZWQtRFNDUCAoMjYpICovCisJCS8qIE1pc3Npbmc6IDNHUFAtQWxsb2NhdGUtSVAtVHlwZSAoMjcpICovCisKKyAgICAgICAgICAgICAgICAvKiBQRFAtQ29udGV4dC1UeXBlICovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgLyogCisgICAgICAgICAgICAgICAgICAgICBFbnVtZXJhdGVkLiBJbmRpY2F0ZXMgdGhlIHR5cGUgb2YgYSBQRFAgY29udGV4dCAKKyAgICAgICAgICAgICAgICAgICAgIGFuZCBpcyBvbmx5IGluY2x1ZGVkIGluIENDUiBpbml0aWFsLgorCisgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgYXJlIDAgZm9yIHByaW1hcnkgYW5kIDEgZm9yIHNlY29uZGFyeSAKKyAgICAgICAgICAgICAgICAgICAgICgzR1BQIDMyLjI5OSBSZWw3KQorICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgIHN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgICAgICAgKnR5cGU7CisgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgICAgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICAgIkVudW1lcmF0ZWQoUERQLUNvbnRleHQtVHlwZSkiICwgTlVMTCwgTlVMTCwgTlVMTCB9OworICAgICAgICAgICAgICAgICAgc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzAgPSB7ICJQUklNQVJZIiwgICAgICAgICAgICAgICAgICAgICAgeyAuaTMyID0gMCB9fTsKKyAgICAgICAgICAgICAgICAgIHN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiU0VDT05EQVJZIiwgICAgICAgIHsgLmkzMiA9IDEgfX07CisKKyAgICAgICAgICAgICAgICAgIHN0cnVjdCBkaWN0X2F2cF9kYXRhICAgIGRhdGEgPSB7IAorICAgICAgICAgICAgICAgICAgICAxMjQ3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvZGUgKi8KKyAgICAgICAgICAgICAgICAgICAgMTA0MTUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWZW5kb3IgKi8KKyAgICAgICAgICAgICAgICAgICAgIlBEUC1Db250ZXh0LVR5cGUiLCAgICAgICAgICAgICAgICAgICAgLyogTmFtZSAqLworICAgICAgICAgICAgICAgICAgICBBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksICAgLyogRml4ZWQgZmxhZ3MgKi8KKyAgICAgICAgICAgICAgICAgICAgQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAgICAgICAgICAgICAgICAgICAgIC8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisgICAgICAgICAgICAgICAgICAgIEFWUF9UWVBFX0lOVEVHRVIzMiAgICAgICAgICAgICAgICAgICAgICAvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgIC8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisgICAgICAgICAgICAgICAgICBDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEgLCBOVUxMLCAmdHlwZSk7CisgICAgICAgICAgICAgICAgICBDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8wICwgdHlwZSwgTlVMTCk7CisgICAgICAgICAgICAgICAgICBDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xICwgdHlwZSwgTlVMTCk7CisgICAgICAgICAgICAgICAgICBDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgdHlwZSwgTlVMTCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogSU1TLUluZm9ybWF0aW9uICovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgR3JvdXBlZC4gSXRzIHB1cnBvc2UgaXMgdG8gYWxsb3cgdGhlIHRyYW5zbWlzc2lvbiAKKyAgICAgICAgICAgICAgICAgICAgb2YgYWRkaXRpb25hbCBJTVMgc2VydmljZSBzcGVjaWZpYyBpbmZvcm1hdGlvbiBlbGUtCisgICAgICAgICAgICAgICAgICAgIG1lbnRzLiAoM0dQUCAzMi4yOTkgUmVsNykKKyAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworICAgICAgICAgICAgICAgICAgICA4NzYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29kZSAqLworICAgICAgICAgICAgICAgICAgICAxMDQxNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZlbmRvciAqLworICAgICAgICAgICAgICAgICAgICAiSU1TLUluZm9ybWF0aW9uIiwgICAgICAgICAgICAgICAgICAvKiBOYW1lICovCisgICAgICAgICAgICAgICAgICAgIEFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgICAvKiBGaXhlZCBmbGFncyAqLworICAgICAgICAgICAgICAgICAgICBBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksICAgICAgICAgICAgICAgICAgICAgLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgQVZQX1RZUEVfR1JPVVBFRCAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsIE5VTEwpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIElNUy1DaGFyZ2luZy1JZGVudGlmaWVyICovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgVVRGOFN0cmluZy4gQ29udGFpbnMgdGhlIElNUyBjaGFyZ2luZyBpZGVudGlmaWVyIAorICAgICAgICAgICAgICAgICAgICBhcyBnaXZlbiB0byB0aGUgRmxleGkgSVNOIGJ5IHRoZSBJTVMuIFRoaXMgQVZQIGlzIAorICAgICAgICAgICAgICAgICAgICBkZWZpbmVkIGluIDNHUFAgVFMgMzIuMjI1LiBUaGlzIEFWUCBpcyBwcmVzZW50IAorICAgICAgICAgICAgICAgICAgICBpbiBJTVMgc2Vzc2lvbnMgb25seS4gUHJlc2VudCBpbiB0aGUgaW5pdGlhbCBDQ1IgCisgICAgICAgICAgICAgICAgICAgIG9ubHkuCisgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisgICAgICAgICAgICAgICAgICAgIDg0MSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb2RlICovCisgICAgICAgICAgICAgICAgICAgIDEwNDE1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVuZG9yICovCisgICAgICAgICAgICAgICAgICAgICJJTVMtQ2hhcmdpbmctSWRlbnRpZmllciIsICAgICAgICAgICAgICAgICAgICAvKiBOYW1lICovCisgICAgICAgICAgICAgICAgICAgIEFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgICAvKiBGaXhlZCBmbGFncyAqLworICAgICAgICAgICAgICAgICAgICBBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksICAgICAgICAgICAgICAgICAgICAgLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgQVZQX1RZUEVfT0NURVRTVFJJTkcgICAgICAgICAgICAgICAgICAgICAgLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICBDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisKKyAgICAgICAgICAgICAgICAKKworICAgICAgICAgICAgICAgIC8qIE1heC1SZXF1ZXN0ZWQtQmFuZHdpZHRoLVVMICovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgVW5zaWduZWQzMi4gVGhlIE1heC1SZXF1ZXN0ZWQtQmFuZHdpZHRoLQorICAgICAgICAgICAgICAgICAgICBVTC9ETCBBVlAgaW5kaWNhdGVzIHRoZSBtYXhpbXVtIGFsbG93ZWQgYml0IAorICAgICAgICAgICAgICAgICAgICByYXRlIChpbiBiaXRzIHBlciBzZWNvbmQpIGZvciB0aGUgdXBsaW5rIGRpcmVjdGlvbi4gCisgICAgICAgICAgICAgICAgICAgIChSZS11c2VkIGZyb20gM0dQUCAyOS4yMTQpCisgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisgICAgICAgICAgICAgICAgICAgIDUxNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb2RlICovCisgICAgICAgICAgICAgICAgICAgIDEwNDE1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVuZG9yICovCisgICAgICAgICAgICAgICAgICAgICJNYXgtUmVxdWVzdGVkLUJhbmR3aWR0aC1VTCIsICAgICAgICAgICAgICAgICAgICAgIC8qIE5hbWUgKi8KKyAgICAgICAgICAgICAgICAgICAgQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAgIC8qIEZpeGVkIGZsYWdzICovCisgICAgICAgICAgICAgICAgICAgIEFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgICAgICAgICAgICAgICAgICAgICAvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworICAgICAgICAgICAgICAgICAgICBBVlBfVFlQRV9VTlNJR05FRDMyICAgICAgICAgICAgICAgICAgICAgLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICBDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgTlVMTCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogTWF4LVJlcXVlc3RlZC1CYW5kd2lkdGgtREwgKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICBVbnNpZ25lZDMyLiBUaGUgTWF4LVJlcXVlc3RlZC1CYW5kd2lkdGgtCisgICAgICAgICAgICAgICAgICAgIFVML0RMIEFWUCBpbmRpY2F0ZXMgdGhlIG1heGltdW0gYWxsb3dlZCBiaXQgCisgICAgICAgICAgICAgICAgICAgIHJhdGUgKGluIGJpdHMgcGVyIHNlY29uZCkgZm9yIHRoZSB1cGxpbmsgZGlyZWN0aW9uLgorICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgIHN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorICAgICAgICAgICAgICAgICAgICA1MTYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29kZSAqLworICAgICAgICAgICAgICAgICAgICAxMDQxNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZlbmRvciAqLworICAgICAgICAgICAgICAgICAgICAiTWF4LVJlcXVlc3RlZC1CYW5kd2lkdGgtREwiLCAgICAgICAgICAgICAgICAgICAgICAvKiBOYW1lICovCisgICAgICAgICAgICAgICAgICAgIEFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgICAvKiBGaXhlZCBmbGFncyAqLworICAgICAgICAgICAgICAgICAgICBBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksICAgICAgICAgICAgICAgICAgICAgLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgQVZQX1RZUEVfVU5TSUdORUQzMiAgICAgICAgICAgICAgICAgICAgIC8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsIE5VTEwpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIFFvUy1JbmZvcm1hdGlvbiAqLworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgIEdyb3VwZWQuIFRoaXMgaXMgdGhlIFFvUyB0aGF0IHRoZSBEQ0NBIAorICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIgcmVxdWVzdHMgZnJvbSBGbGV4aSBJU04gdG8gYmUgYXBwbGllZCBmb3IgCisgICAgICAgICAgICAgICAgICAgIHRoaXMgUERQIGNvbnRleHQuIFRoaXMgQVZQIGFuZCBhbGwgQVZQcyBjb24tCisgICAgICAgICAgICAgICAgICAgIHRhaW5lZCB3aXRoaW4gYXJlIGRlc2NyaWJlZCBpbiAzR1BQIFRTIDI5LjIxMiAKKyAgICAgICAgICAgICAgICAgICAgUmVsZWFzZSA3LiBUaGUgQVJQIEFWUCBpcyBpbnRyb2R1Y2VkIHdpdGggCisgICAgICAgICAgICAgICAgICAgIFJlbGVhc2UgOC4gVGhlIHJlbGV2YW50IHR5cGVzIGFyZSBkZWZpbmVkIG9uIAorICAgICAgICAgICAgICAgICAgICB0YWJsZSA1LjMuMSBvZiBUUyAyOS4yMTIuCisgICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworICAgICAgICAgICAgICAgICAgICAxMDE2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvZGUgKi8KKyAgICAgICAgICAgICAgICAgICAgMTA0MTUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWZW5kb3IgKi8KKyAgICAgICAgICAgICAgICAgICAgIlFvUy1JbmZvcm1hdGlvbiIsICAgICAgICAgICAgICAgICAgLyogTmFtZSAqLworICAgICAgICAgICAgICAgICAgICBBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksICAgLyogRml4ZWQgZmxhZ3MgKi8KKyAgICAgICAgICAgICAgICAgICAgQVZQX0ZMQUdfVkVORE9SLCAgICAgICAgICAgICAgICAgICAgIC8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisgICAgICAgICAgICAgICAgICAgIEFWUF9UWVBFX0dST1VQRUQgICAgICAgICAgICAgICAgICAgICAgICAvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIAorICAgICAgICB9CisKKworCQorCVRSQUNFX0RFQlVHKElORk8sICJFeHRlbnNpb24gJ0RpY3Rpb25hcnkgZGVmaW5pdGlvbnMgZm9yIERDQ0EgM0dQUCcgaW5pdGlhbGl6ZWQiKTsKKwlyZXR1cm4gMDsKK30KKworRVhURU5TSU9OX0VOVFJZKCJkaWN0X2RjY2FfM2dwcCIsIGRpY3RfZGNjYV8zZ3BwX2VudHJ5LCAiZGljdF9kY2NhIik7CmRpZmYgLS1naXQgYS9jb250cmliL2RpY3RfZGNjYS9kaWN0X2RjY2Ffbm9raWEuYyBiL2NvbnRyaWIvZGljdF9kY2NhL2RpY3RfZGNjYV9ub2tpYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmZjc0MjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2RpY3RfZGNjYS9kaWN0X2RjY2Ffbm9raWEuYwpAQCAtMCwwICsxLDI4MSBAQAorLyogCisgKiBEaWN0aW9uYXJ5IGRlZmluaXRpb25zIG9mIG9iamVjdHMgc3BlY2lmaWVkIGluIERDQ0EgKE5va2lhLCAzR1BQKS4KKyAqLworI2luY2x1ZGUgPGZyZWVEaWFtZXRlci9leHRlbnNpb24uaD4KKworCisvKiBUaGUgY29udGVudCBvZiB0aGlzIGZpbGUgZm9sbG93cyB0aGUgc2FtZSBzdHJ1Y3R1cmUgYXMgZGljdF9iYXNlX3Byb3RvLmMgKi8KKworI2RlZmluZSBDSEVDS19kaWN0X25ldyggX3R5cGUsIF9kYXRhLCBfcGFyZW50LCBfcmVmICkJXAorCUNIRUNLX0ZDVCggIGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIChfdHlwZSksIChfZGF0YSksIChfcGFyZW50KSwgKF9yZWYpKSAgKTsKKworI2RlZmluZSBDSEVDS19kaWN0X3NlYXJjaCggX3R5cGUsIF9jcml0ZXJpYSwgX3doYXQsIF9yZXN1bHQgKQlcCisJQ0hFQ0tfRkNUKCAgZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgKF90eXBlKSwgKF9jcml0ZXJpYSksIChfd2hhdCksIChfcmVzdWx0KSwgRU5PRU5UKSApOworCitzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiB7CisJY2hhciAJCQkqYXZwX25hbWU7CisJZW51bSBydWxlX3Bvc2l0aW9uCXBvc2l0aW9uOworCWludCAJCQltaW47CisJaW50CQkJbWF4OworfTsKKworI2RlZmluZSBSVUxFX09SREVSKCBfcG9zaXRpb24gKSAoKCgoX3Bvc2l0aW9uKSA9PSBSVUxFX0ZJWEVEX0hFQUQpIHx8ICgoX3Bvc2l0aW9uKSA9PSBSVUxFX0ZJWEVEX1RBSUwpKSA/IDEgOiAwICkKKworI2RlZmluZSBQQVJTRV9sb2NfcnVsZXMoIF9ydWxlYXJyYXksIF9wYXJlbnQpIHsJCQkJCQkJCVwKKwlpbnQgX19hcjsJCQkJCQkJCQkJCVwKKwlmb3IgKF9fYXI9MDsgX19hciA8IHNpemVvZihfcnVsZWFycmF5KSAvIHNpemVvZigoX3J1bGVhcnJheSlbMF0pOyBfX2FyKyspIHsJCQlcCisJCXN0cnVjdCBkaWN0X3J1bGVfZGF0YSBfX2RhdGEgPSB7IE5VTEwsIAkJCQkJCQlcCisJCQkoX3J1bGVhcnJheSlbX19hcl0ucG9zaXRpb24sCQkJCQkJCVwKKwkJCTAsIAkJCQkJCQkJCQlcCisJCQkoX3J1bGVhcnJheSlbX19hcl0ubWluLAkJCQkJCQkJXAorCQkJKF9ydWxlYXJyYXkpW19fYXJdLm1heH07CQkJCQkJCVwKKwkJX19kYXRhLnJ1bGVfb3JkZXIgPSBSVUxFX09SREVSKF9fZGF0YS5ydWxlX3Bvc2l0aW9uKTsJCQkJCVwKKwkJQ0hFQ0tfRkNUKCAgZmRfZGljdF9zZWFyY2goIAkJCQkJCQkJXAorCQkJZmRfZ19jb25maWctPmNuZl9kaWN0LAkJCQkJCQkJXAorCQkJRElDVF9BVlAsIAkJCQkJCQkJCVwKKwkJCUFWUF9CWV9OQU1FLCAJCQkJCQkJCQlcCisJCQkoX3J1bGVhcnJheSlbX19hcl0uYXZwX25hbWUsIAkJCQkJCQlcCisJCQkmX19kYXRhLnJ1bGVfYXZwLCAwICkgKTsJCQkJCQkJXAorCQlpZiAoICFfX2RhdGEucnVsZV9hdnAgKSB7CQkJCQkJCQlcCisJCQlUUkFDRV9ERUJVRyhJTkZPLCAiQVZQIE5vdCBmb3VuZDogJyVzJyIsIChfcnVsZWFycmF5KVtfX2FyXS5hdnBfbmFtZSApOwkJXAorCQkJcmV0dXJuIEVOT0VOVDsJCQkJCQkJCQlcCisJCX0JCQkJCQkJCQkJCVwKKwkJQ0hFQ0tfRkNUX0RPKCBmZF9kaWN0X25ldyggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1JVTEUsICZfX2RhdGEsIF9wYXJlbnQsIE5VTEwpLAlcCisJCQl7CQkJCQkJCSAgICAgICAgCQlcCisJCQkJVFJBQ0VfREVCVUcoSU5GTywgIkVycm9yIG9uIHJ1bGUgd2l0aCBBVlAgJyVzJyIsICAgICAgCQkJXAorCQkJCQkgKF9ydWxlYXJyYXkpW19fYXJdLmF2cF9uYW1lICk7CQkgICAgICAJCQlcCisJCQkJcmV0dXJuIEVJTlZBTDsJCQkJCSAgICAgIAkJCVwKKwkJCX0gKTsJCQkJCQkJICAgICAgCQkJXAorCX0JCQkJCQkJCQkgICAgICAJCQlcCit9CisKKyNkZWZpbmUgZW51bXZhbF9kZWZfdTMyKCBfdmFsXywgX3N0cl8gKSBcCisJCXsgX3N0cl8sIAkJeyAudTMyID0gX3ZhbF8gfX0KKworI2RlZmluZSBlbnVtdmFsX2RlZl9vcyggX2xlbl8sIF92YWxfLCBfc3RyXyApIFwKKwkJeyBfc3RyXywgCQl7IC5vcyA9IHsgLmRhdGEgPSAodW5zaWduZWQgY2hhciAqKV92YWxfLCAubGVuID0gX2xlbl8gfX19CisKKworc3RhdGljIGludCBkaWN0X2RjY2Ffbm9raWFfZW50cnkoY2hhciAqIGNvbmZmaWxlKQoreworCVRSQUNFX0VOVFJZKCIlcCIsIGNvbmZmaWxlKTsJCQorCQorCS8qIEFwcGxpY2F0aW9ucyBzZWN0aW9uICovICAgICAgICAgICAgICAgCisJewkJCisgICAgICAgICAgICAgICAgLyogQ3JlYXRlIHRoZSB2ZW5kb3JzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGljdF92ZW5kb3JfZGF0YSB2ZW5kb3JfZGF0YSA9IHsgOTQsICJOb2tpYSIgfTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX0ZDVChmZF9kaWN0X25ldyhmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfVkVORE9SLCAmdmVuZG9yX2RhdGEsIE5VTEwsIE5VTEwpKTsKKyAgICAgICAgICAgICAgICB9CisgIAorCX0KKwkKKwkKKwkvKiBBVlAgc2VjdGlvbiAqLworICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RydWN0IGRpY3Rfb2JqZWN0ICogQWRkcmVzc190eXBlOworICAgICAgICAgICAgICAgIHN0cnVjdCBkaWN0X29iamVjdCAqIFVURjhTdHJpbmdfdHlwZTsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgZGljdF9vYmplY3QgKiBEaWFtZXRlcklkZW50aXR5X3R5cGU7CisgICAgICAgICAgICAgICAgc3RydWN0IGRpY3Rfb2JqZWN0ICogRGlhbWV0ZXJVUklfdHlwZTsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgZGljdF9vYmplY3QgKiBUaW1lX3R5cGU7CisKKyAgICAgICAgICAgICAgICBDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJBZGRyZXNzIiwgJkFkZHJlc3NfdHlwZSk7CisgICAgICAgICAgICAgICAgQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiVVRGOFN0cmluZyIsICZVVEY4U3RyaW5nX3R5cGUpOworICAgICAgICAgICAgICAgIENIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkRpYW1ldGVySWRlbnRpdHkiLCAmRGlhbWV0ZXJJZGVudGl0eV90eXBlKTsKKyAgICAgICAgICAgICAgICBDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJEaWFtZXRlclVSSSIsICZEaWFtZXRlclVSSV90eXBlKTsKKyAgICAgICAgICAgICAgICBDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJUaW1lIiwgJlRpbWVfdHlwZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICAgICAgICAgICAgICAgIC8qIE5TTi1Ub2tlbi1WYWx1ZSAqLworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC8qIAorICAgICAgICAgICAgICAgICAgICAgT2N0ZXRTdHJpbmcuIEEgdG9rZW4gdGhhdCB3YXMgcmVjZWl2ZWQsIGZvciAKKyAgICAgICAgICAgICAgICAgICAgIGV4YW1wbGUsIGZyb20gdGhlIHN1YnNjcmlwdGlvbiBwb3J0YWwgWzE0XS4gVGhlIAorICAgICAgICAgICAgICAgICAgICAgbWF4aW11bSBsZW5ndGggb2YgdGhlIHRva2VuIGlzIDY0IG9jdGV0cy4KKyAgICAgICAgICAgICAgICAgICAgIFdoZW4gdGhpcyBBVlAgaXMgaW5jbHVkZWQgaW4gdGhlIE1TQ0MsIHRoZSBVU1UgCisgICAgICAgICAgICAgICAgICAgICBhbmQgUmVwb3J0aW5nLVJlYXNvbiBBVlBzIHdpbGwgbm90IGJlIGluY2x1ZGVkIAorICAgICAgICAgICAgICAgICAgICAgKGJlY2F1c2UgdGhlIHRva2VuIGlzIG5vdCBhIHRyaWdnZXIgdG8gcmVwb3J0IHF1b3RhIAorICAgICAgICAgICAgICAgICAgICAgdXNhZ2UpLiBBZGRpdGlvbmFsbHksIHRoZSBSYXRpbmctR3JvdXAgYW5kIAorICAgICAgICAgICAgICAgICAgICAgU2VydmljZS1JZCBBVlBzIHdpbGwgaGF2ZSB0aGUgdmFsdWVzIHJlY2VpdmVkIAorICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgc3Vic2NyaXB0aW9uIHBvcnRhbC4KKyAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisgICAgICAgICAgICAgICAgICAgIDUxMTMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29kZSAqLworICAgICAgICAgICAgICAgICAgICA5NCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZlbmRvciAqLworICAgICAgICAgICAgICAgICAgICAiTlNOLVRva2VuLVZhbHVlIiwgICAgICAgICAgICAgICAgICAgICAgLyogTmFtZSAqLworICAgICAgICAgICAgICAgICAgICBBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksICAgLyogRml4ZWQgZmxhZ3MgKi8KKyAgICAgICAgICAgICAgICAgICAgQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAgICAgICAgICAgICAgICAgICAgIC8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisgICAgICAgICAgICAgICAgICAgIEFWUF9UWVBFX09DVEVUU1RSSU5HICAgICAgICAgICAgICAgICAgICAgLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICBDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgTlVMTCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8qIFF1b3RhLUNvbnN1bXB0aW9uLVRpbWUgKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICBVbnNpZ25lZDMyLiBDb250YWlucyB0aGUgdGltZSBxdW90YSBlbnZlbG9wZSAKKyAgICAgICAgICAgICAgICAgICAgZXhwaXJhdGlvbiB0aW1lIGluIHNlY29uZHMuIFRoaXMgaXMgdGhlIHRpbWUgCisgICAgICAgICAgICAgICAgICAgIGVsYXBzZWQgZnJvbSB0aGUgcHJldmlvdXMgc2VydmljZSByZXF1ZXN0LCB0byAKKyAgICAgICAgICAgICAgICAgICAgdGhlIG1vbWVudCB0aGUgRmxleGkgSVNOIGNvbnNpZGVycyB0aGF0IHRoZSAKKyAgICAgICAgICAgICAgICAgICAgdGltZSBlbnZlbG9wZSBmaW5pc2hlcy4gVGhlIHZhbHVlIG9mIHRoaXMgQVZQIAorICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGluIGVmZmVjdCBmb3IgdGhlIHJlbWFpbmRlciBvZiB0aGUgc2Vzc2lvbiAKKyAgICAgICAgICAgICAgICAgICAgb3IgdW50aWwgYSBuZXcgdmFsdWUgaXMgcmVjZWl2ZWQuIElmIHRoaXMgQVZQIGlzIAorICAgICAgICAgICAgICAgICAgICBub3QgcHJlc2VudCwgdGhlIGRlZmF1bHQgdmFsdWUgY29uZmlndXJlZCBmb3IgdGhlIAorICAgICAgICAgICAgICAgICAgICByYXRpbmcgZ3JvdXAgd2lsbCBiZSB1c2VkLiBUaGUgT0NTIG1heSAKKyAgICAgICAgICAgICAgICAgICAgZGlzYWJsZSB0aGUgdGltZSBxdW90YSBlbnZlbG9wZSBleHBpcmF0aW9uIGJ5IAorICAgICAgICAgICAgICAgICAgICBzZXR0aW5nIHRoZSB2YWx1ZSBvZiB0aGlzIEFWUCB0byAwLiBUaGUgdmFsdWUgb2YgCisgICAgICAgICAgICAgICAgICAgIFFDVCBzZW50IGZyb20gdGhlIE9DUyBmb3IgYSBjZXJ0YWluIE1TQ0MgCisgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlIGlzIHN0b3JlZCBpbiB0aGUgRmxleGkgSVNOIGFuZCBpdCBpcyB1c2VkIAorICAgICAgICAgICAgICAgICAgICBpZiB0aGUgT0NTIGRvZXMgbm90IHNlbnQgYSBuZXcgdmFsdWUgaW4gdGhlIAorICAgICAgICAgICAgICAgICAgICBDQ0FzIHRoYXQgZm9sbG93CisgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisgICAgICAgICAgICAgICAgICAgIDUxMDksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29kZSAqLworICAgICAgICAgICAgICAgICAgICA5NCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZlbmRvciAqLworICAgICAgICAgICAgICAgICAgICAiUXVvdGEtQ29uc3VtcHRpb24tVGltZSIsICAgICAgICAgICAgICAgICAgICAgIC8qIE5hbWUgKi8KKyAgICAgICAgICAgICAgICAgICAgQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAgIC8qIEZpeGVkIGZsYWdzICovCisgICAgICAgICAgICAgICAgICAgIEFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgICAgICAgICAgICAgICAgICAgICAvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworICAgICAgICAgICAgICAgICAgICBBVlBfVFlQRV9VTlNJR05FRDMyICAgICAgICAgICAgICAgICAgICAgLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICBDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgTlVMTCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogUXVvdGEtSG9sZGluZy1UaW1lICovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgLyogCisgICAgICAgICAgICAgICAgICAgICBVbnNpZ25lZDMyLiBJbmRpY2F0ZXMgaG93IGxvbmcgdGhlIEZsZXhpIElTTiAKKyAgICAgICAgICAgICAgICAgICAgIHdpbGwga2VlcCB0aGUgZ3JhbnRlZCBxdW90YSBhZnRlciBhIHNlcnZpY2UgCisgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0IGhhcyBiZWVuIHJlY2VpdmVkLiBUaGUgdW5pdCBpcyBpbiAKKyAgICAgICAgICAgICAgICAgICAgIHNlY29uZHMuIFdoZW4gdGhpcyB0aW1lIGVsYXBzZXMsIHRoZSBGbGV4aSBJU04gCisgICAgICAgICAgICAgICAgICAgICBlbmRzIHRoZSBNU0NDIGluc3RhbmNlIGFuZCByZXBvcnRzIHRoZSB1c2VkIAorICAgICAgICAgICAgICAgICAgICAgcXVvdGEgd2l0aG91dCByZXF1ZXN0aW5nIG1vcmUuIFRoZSB2YWx1ZSBvZiAKKyAgICAgICAgICAgICAgICAgICAgIHRoaXMgQVZQIHdpbGwgYmUgaW4gZWZmZWN0IGZvciB0aGUgcmVtYWluZGVyIG9mIAorICAgICAgICAgICAgICAgICAgICAgdGhlIHNlc3Npb24gb3IgdW50aWwgYSBuZXcgdmFsdWUgaXMgcmVjZWl2ZWQuIElmIAorICAgICAgICAgICAgICAgICAgICAgdGhpcyBBVlAgaXMgbm90IHByZXNlbnQsIHRoZSBkZWZhdWx0IHZhbHVlIGNvbi0KKyAgICAgICAgICAgICAgICAgICAgIGZpZ3VyZWQgZm9yIHRoZSByYXRpbmcgZ3JvdXAgd2lsbCBiZSB1c2VkLiBUaGUgCisgICAgICAgICAgICAgICAgICAgICBPQ1MgbWF5IGRpc2FibGUgdGhlIFF1b3RhIEhvbGRpbmcgVGltZXIgYnkgCisgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nIHRoZSB2YWx1ZSBvZiB0aGlzIEFWUCB0byAwLiBUaGUgdmFsdWUgb2YgCisgICAgICAgICAgICAgICAgICAgICB0aGUgUUhUIHNlbnQgZnJvbSB0aGUgT0NTIGZvciBhIGNlcnRhaW4gCisgICAgICAgICAgICAgICAgICAgICBNU0NDIGluc3RhbmNlIGlzIHN0b3JlZCBpbiB0aGUgRmxleGkgSVNOLCBhbmQgCisgICAgICAgICAgICAgICAgICAgICBpdCBpcyB1c2VkIGlmIHRoZSBPQ1MgZG9lcyBub3Qgc2VudCBhIG5ldyB2YWx1ZSAKKyAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBDQ0FzIHRoYXQgZm9sbG93LgorICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgIHN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorICAgICAgICAgICAgICAgICAgICA1MTEwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvZGUgKi8KKyAgICAgICAgICAgICAgICAgICAgOTQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWZW5kb3IgKi8KKyAgICAgICAgICAgICAgICAgICAgIlF1b3RhLUhvbGRpbmctVGltZSIsICAgICAgICAgICAgICAgICAgICAgIC8qIE5hbWUgKi8KKyAgICAgICAgICAgICAgICAgICAgQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAgIC8qIEZpeGVkIGZsYWdzICovCisgICAgICAgICAgICAgICAgICAgIEFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgICAgICAgICAgICAgICAgICAgICAvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworICAgICAgICAgICAgICAgICAgICBBVlBfVFlQRV9VTlNJR05FRDMyICAgICAgICAgICAgICAgICAgICAgLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICBDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgTlVMTCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogRGVmYXVsdC1RdW90YSAqLworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgIEdyb3VwZWQuIEluZGljYXRlcyB0aGUgYWJzb2x1dGUgbnVtYmVyIG9mIAorICAgICAgICAgICAgICAgICAgICB1bml0cyB0aGF0IGFyZSBhdmFpbGFibGUgZm9yIGNvbnN1bXB0aW9uIGR1cmluZyAKKyAgICAgICAgICAgICAgICAgICAgZWFjaCB1cGNvbWluZyBPQ1MgaW50ZXJyb2dhdGlvbiAoZS5nLiBhZnRlciBhIAorICAgICAgICAgICAgICAgICAgICBDQ1IgaGFzIGJlZW4gc2VudCBidXQgYmVmb3JlIHRoZSBDQ0EgaXMgCisgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVkKS4gSWYgdGhpcyBBVlAgaXMgbm90IHByZXNlbnQsIHRoZSBGbGV4aSAKKyAgICAgICAgICAgICAgICAgICAgSVNOIHdpbGwgdXNlIHRoZSBjb25maWd1cmVkIG9yIGVhcmxpZXIgcmVjZWl2ZWQgCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgcXVvdGEuIElmIHRoaXMgQVZQIGlzIHByZXNlbnQgYnV0IGRvZXMgCisgICAgICAgICAgICAgICAgICAgIG5vdCBpbmNsdWRlIHRoZSBkZWZhdWx0IHF1b3RhIGZvciBhIGNlcnRhaW4gdW5pdCAKKyAgICAgICAgICAgICAgICAgICAgdHlwZSwgdGhhdCB1bml0IHR5cGUgaXMgY29uc2lkZXJlZCB0byBoYXZlIG5vIAorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IHF1b3RhLiAKKyAgICAgICAgICAgICAgICAgICAgVGhlIHVzYWdlIG9mIGRlZmF1bHQgcXVvdGEgY2FuIGJlIGRpc2FibGVkIGluIAorICAgICAgICAgICAgICAgICAgICBjZXJ0YWluIHNpdHVhdGlvbnMgYnkgbW9kaWZ5aW5nIHRoZSBGbGV4aSBJU04gCisgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzCisgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKyAgICAgICAgICAgICAgICAgICAgNTExMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb2RlICovCisgICAgICAgICAgICAgICAgICAgIDk0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVuZG9yICovCisgICAgICAgICAgICAgICAgICAgICJEZWZhdWx0LVF1b3RhIiwgICAgICAgICAgICAgICAgICAvKiBOYW1lICovCisgICAgICAgICAgICAgICAgICAgIEFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgICAvKiBGaXhlZCBmbGFncyAqLworICAgICAgICAgICAgICAgICAgICBBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksICAgICAgICAgICAgICAgICAgICAgLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgQVZQX1RZUEVfR1JPVVBFRCAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsIE5VTEwpOworICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgCisKKyAgICAgICAgICAgICAgICAvKiBTZXNzaW9uLVN0YXJ0LUluZGljYXRvciAqLworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgIE9jdGV0U3RyaW5nLiAoM0dQUCBUUyAyOS4wNjEgUmVsNCkuIFRoZSBhZGRyZXNzIAorICAgICAgICAgICAgICAgICAgICBvZiB0aGUgY2hhcmdpbmcgZ2F0ZXdheSB0aGF0IGhhcyBiZWVuIG1hcmtlZCBhcyAKKyAgICAgICAgICAgICAgICAgICAgdGhlIGRlZmF1bHQgY2hhcmdpbmcgZ2F0ZXdheSBmb3IgdGhlIFBEUCBjb250ZXh0LiAKKyAgICAgICAgICAgICAgICAgICAgVGhlIGFkZHJlc3MgaXMgZXhwcmVzc2VkIGFzIGEgZm91ci1ieXRlIGludGVnZXIuIAorICAgICAgICAgICAgICAgICAgICBQcmVzZW50IGluIHRoZSBpbml0aWFsIENDUiBvbmx5LgorICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgIHN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorICAgICAgICAgICAgICAgICAgICA1MTA1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvZGUgKi8KKyAgICAgICAgICAgICAgICAgICAgOTQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWZW5kb3IgKi8KKyAgICAgICAgICAgICAgICAgICAgIlNlc3Npb24tU3RhcnQtSW5kaWNhdG9yIiwgICAgICAgICAgICAgICAgICAgICAgLyogTmFtZSAqLworICAgICAgICAgICAgICAgICAgICBBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksICAgLyogRml4ZWQgZmxhZ3MgKi8KKyAgICAgICAgICAgICAgICAgICAgQVZQX0ZMQUdfVkVORE9SLCAgICAgICAgICAgICAgICAgICAgIC8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisgICAgICAgICAgICAgICAgICAgIEFWUF9UWVBFX09DVEVUU1RSSU5HICAgICAgICAgICAgICAgICAgICAgLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICBDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgTlVMTCk7CisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAKKworICAgICAgICAgICAgICAgIC8qIFJ1bGViYXNlLWlkICovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKyAgICAgICAgICAgICAgICAgICAgNTEwNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb2RlICovCisgICAgICAgICAgICAgICAgICAgIDk0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVuZG9yICovCisgICAgICAgICAgICAgICAgICAgICJSdWxlYmFzZS1pZCIsICAgICAgICAgICAgICAgICAgICAvKiBOYW1lICovCisgICAgICAgICAgICAgICAgICAgIEFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgICAvKiBGaXhlZCBmbGFncyAqLworICAgICAgICAgICAgICAgICAgICBBVlBfRkxBR19WRU5ET1IsICAgICAgICAgICAgICAgICAgICAgLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgQVZQX1RZUEVfT0NURVRTVFJJTkcgICAgICAgICAgICAgICAgICAgICAgLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICBDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIAorCisgICAgICAgICAgICAgICAgLyogVGltZS1PZi1GaXJzdC1Vc2FnZSAqLworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgIFRpbWUuIENvbnRhaW5zIGEgdGltZS1zdGFtcCBpZGVudGlmeWluZyB0aGUgZGF0ZSAKKyAgICAgICAgICAgICAgICAgICAgYW5kIHRpbWUgb2YgdGhlIGZpcnN0IGluY3JlbWVudCBvZiB0aGUgdXNlZCB1bml0cyAKKyAgICAgICAgICAgICAgICAgICAgY291bnRlciBzaW5jZSB0aGUgcHJldmlvdXMgcmVwb3J0LiBJZiBubyB1c2VkIHVuaXRzIAorICAgICAgICAgICAgICAgICAgICB3ZXJlIGdhdGhlcmVkIGR1cmluZyB0aGUgcHJldmlvdXMgcmVwb3J0aW5nIGludGVyLQorICAgICAgICAgICAgICAgICAgICB2YWwsIHRoaXMgQVZQIHdpbGwgbm90IGJlIHByZXNlbnQuCisgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisgICAgICAgICAgICAgICAgICAgIDUxMDMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvZGUgKi8KKyAgICAgICAgICAgICAgICAgICAgOTQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWZW5kb3IgKi8KKyAgICAgICAgICAgICAgICAgICAgIlRpbWUtT2YtRmlyc3QtVXNhZ2UiLCAgICAgICAgICAgICAgICAgICAgICAvKiBOYW1lICovCisgICAgICAgICAgICAgICAgICAgIEFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgICAvKiBGaXhlZCBmbGFncyAqLworICAgICAgICAgICAgICAgICAgICBBVlBfRkxBR19WRU5ET1IsICAgICAgICAgICAgICAgICAgICAgLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgQVZQX1RZUEVfT0NURVRTVFJJTkcgICAgICAgICAgICAgICAgICAgIC8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIFRpbWVfdHlwZSwgTlVMTCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogVGltZS1PZi1MYXN0LVVzYWdlICovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgVGltZS4gQ29udGFpbnMgYSB0aW1lLXN0YW1wIGlkZW50aWZ5aW5nIHRoZSBkYXRlIAorICAgICAgICAgICAgICAgICAgICBhbmQgdGltZSBvZiB0aGUgZmlyc3QgaW5jcmVtZW50IG9mIHRoZSB1c2VkIHVuaXRzIAorICAgICAgICAgICAgICAgICAgICBjb3VudGVyIHNpbmNlIHRoZSBwcmV2aW91cyByZXBvcnQuIElmIG5vIHVzZWQgdW5pdHMgCisgICAgICAgICAgICAgICAgICAgIHdlcmUgZ2F0aGVyZWQgZHVyaW5nIHRoZSBwcmV2aW91cyByZXBvcnRpbmcgaW50ZXItCisgICAgICAgICAgICAgICAgICAgIHZhbCwgdGhpcyBBVlAgd2lsbCBub3QgYmUgcHJlc2VudC4KKyAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKyAgICAgICAgICAgICAgICAgICAgNTEwNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29kZSAqLworICAgICAgICAgICAgICAgICAgICA5NCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZlbmRvciAqLworICAgICAgICAgICAgICAgICAgICAiVGltZS1PZi1MYXN0LVVzYWdlIiwgICAgICAgICAgICAgICAgICAgICAgLyogTmFtZSAqLworICAgICAgICAgICAgICAgICAgICBBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksICAgLyogRml4ZWQgZmxhZ3MgKi8KKyAgICAgICAgICAgICAgICAgICAgQVZQX0ZMQUdfVkVORE9SLCAgICAgICAgICAgICAgICAgICAgIC8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisgICAgICAgICAgICAgICAgICAgIEFWUF9UWVBFX09DVEVUU1RSSU5HICAgICAgICAgICAgICAgICAgICAvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBUaW1lX3R5cGUsIE5VTEwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCQorCVRSQUNFX0RFQlVHKElORk8sICJFeHRlbnNpb24gJ0RpY3Rpb25hcnkgZGVmaW5pdGlvbnMgZm9yIERDQ0EgTm9raWEnIGluaXRpYWxpemVkIik7CisJcmV0dXJuIDA7Cit9CisKK0VYVEVOU0lPTl9FTlRSWSgiZGljdF9kY2NhX25va2lhIiwgZGljdF9kY2NhX25va2lhX2VudHJ5LCAiZGljdF9kY2NhIik7CmRpZmYgLS1naXQgYS9jb250cmliL2RpY3RfZ3gvUkVBRE1FIGIvY29udHJpYi9kaWN0X2d4L1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTViNTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9kaWN0X2d4L1JFQURNRQpAQCAtMCwwICsxLDMgQEAKK0ZpbGUgc2VudCB0byB0aGUgbWFpbGluZy1saXN0IGJ5IEdlcm1hbiBCYXJyb3MgPGdiYXJyb3NAaXBjb21zYS5jb20+LgorVG8gYmUgdXNlZCB3aXRoIHRoZSBkaWN0X2xlZ2FjeV94bWwgZXh0ZW5zaW9uLgorCmRpZmYgLS1naXQgYS9jb250cmliL2RpY3RfZ3gvZGljdF9neC54bWwgYi9jb250cmliL2RpY3RfZ3gvZGljdF9neC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk4NWZlNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvZGljdF9neC9kaWN0X2d4LnhtbApAQCAtMCwwICsxLDcwOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhRE9DVFlQRSBkaWN0aW9uYXJ5IFNZU1RFTSAiZGljdGlvbmFyeS5kdGQiPgorCis8IS0tKioqKioqKioqKioqKioqKioqKiBEaWNjaW9uYXJpbyBHeCA9PT0gR2VybWFuIEJhcnJvcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCis8ZGljdGlvbmFyeT4KKworCisKKwk8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCTwhLS0gKioqKioqKioqKioqKioqKioqKioqIFZlbmRvcnMgKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisJPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworCTx2ZW5kb3IgaWQ9IjEwNDE1IiBuYW1lPSIzR1BQIiAvPgorCisJPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKwk8IS0tICoqKioqKioqKioqKioqKioqIEd4IEFwcGxpY2F0aW9uICoqKioqKioqKioqKioqKioqKioqKiAtLT4KKwk8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisJPGFwcGxpY2F0aW9uIGlkPSIxNjc3NzIzOCIgbmFtZT0iR3giPgorCisKKwkJPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09IENPTU1BTkQgQ09ERVMgPT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKwkJPCEtLSAqKiogQ29tbWFuZC1Db2RlcyAqKiogLS0+CisKKwkJPCEtLSBbM0dQUCBUUyAyOS4yMTIgVjcuNy4wXSAsIGNsYXVzZSA1LjYuMiBhbmQgNS42LjMgLS0+CisJCTxjb21tYW5kIG5hbWU9IkNDIiBjb2RlPSIyNzIiIHZlbmRvci1pZD0iMTA0MTUiPgorCisJCTwvY29tbWFuZD4KKworCQk8IS0tIFszR1BQIFRTIDI5LjIxMiBWNy43LjBdICwgY2xhdXNlIDUuNi40IGFuZCA1LjYuNSAtLT4KKwkJPGNvbW1hbmQgbmFtZT0iUkEiIGNvZGU9IjI1OCIgdmVuZG9yLWlkPSIxMDQxNSIgLz4KKworCisJCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKwkJPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09IEd4IFNwZWNpZmljIEFWUHMgPT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKworCQk8IS0tIFJlZiA9IFszR1BQIC0gMjkuMjE0XSA1LjMuMiAtLT4KKwkJPGF2cCBuYW1lPSJBY2Nlc3MtTmV0d29yay1DaGFyZ2luZy1BZGRyZXNzIiBjb2RlPSI1MDEiIG1hbmRhdG9yeT0ibXVzdCIKKwkJCW1heS1lbmNyeXB0PSJ5ZXMiIHZlbmRvci1pZD0iMTA0MTUiPgorCQkJPHR5cGUgdHlwZS1uYW1lPSJBZGRyZXNzIiAvPgorCQk8L2F2cD4KKworCisJCTwhLS0gWzNHUFAgVFMgMjkuMjEyIFY3LjcuMF0gLCBjbGF1c2UgNS4zLjEgLS0+CisJCTxhdnAgbmFtZT0iQmVhcmVyLVVzYWdlIiB2ZW5kb3ItaWQ9IjEwNDE1IiBjb2RlPSIxMDAwIiBtYW5kYXRvcnk9Im11c3QiCisJCQltYXktZW5jcnlwdD0ieWVzIj4KKwkJCTx0eXBlIHR5cGUtbmFtZT0iRW51bWVyYXRlZCIgLz4KKwkJCTxlbnVtIG5hbWU9IkdFTkVSQUwiIGNvZGU9IjAiIC8+CisJCQk8ZW51bSBuYW1lPSJJTVNfU0lHTkFMTElORyIgY29kZT0iMSIgLz4KKwkJPC9hdnA+CisKKwkJCTwhLS0gWzNHUFAgVFMgMjkuMjEyIFY3LjcuMF0gLCBjbGF1c2UgNS4zLjIzIC0tPgorCQk8YXZwIG5hbWU9IkJlYXJlci1Db250cm9sLU1vZGUiIHZlbmRvci1pZD0iMTA0MTUiIGNvZGU9IjEwMjMiCisJCQltYW5kYXRvcnk9Im11c3QiIG1heS1lbmNyeXB0PSJ5ZXMiPgorCisJCQk8dHlwZSB0eXBlLW5hbWU9IkVudW1lcmF0ZWQiIC8+CisJCQk8ZW51bSBuYW1lPSJVRV9PTkxZIiBjb2RlPSIwIiAvPgorCQkJPGVudW0gbmFtZT0iUkVTRVJWRUQiIGNvZGU9IjEiIC8+CisJCQk8ZW51bSBuYW1lPSJVRV9OVyIgY29kZT0iMiIgLz4KKworCQk8L2F2cD4KKwkJCisJCQk8IS0tIFszR1BQIFRTIDI5LjIxMiBWNy43LjBdICwgY2xhdXNlIDUuMy44IC0tPgorCQk8YXZwIG5hbWU9Ik1ldGVyaW5nLU1ldGhvZCIgdmVuZG9yLWlkPSIxMDQxNSIgY29kZT0iMTAwNyIKKwkJCW1hbmRhdG9yeT0ibXVzdCIgbWF5LWVuY3J5cHQ9InllcyIgcHJvdGVjdGVkPSJtYXkiIHR5cGU9IkVudW1lcmF0ZWQiPgorCQkJPHR5cGUgdHlwZS1uYW1lPSJFbnVtZXJhdGVkIiAvPgorCQkJPGVudW0gbmFtZT0iRFVSQVRJT04iIGNvZGU9IjAiIC8+CisJCQk8ZW51bSBuYW1lPSJWT0xVTUUiIGNvZGU9IjEiIC8+CisJCQk8ZW51bSBuYW1lPSJEVVJBVElPTl9WT0xVTUUiIGNvZGU9IjIiIC8+CisJCTwvYXZwPgorCQk8IS0tIFszR1BQIFRTIDI5LjIyOSBWNy43LjBdICwgY2xhdXNlIDYuMy4yMCAtLT4KKwkJPGF2cCBuYW1lPSJQcmltYXJ5LUV2ZW50LUNoYXJnaW5nLUZ1bmN0aW9uLU5hbWUiIHZlbmRvci1pZD0iMTA0MTUiCisJCQljb2RlPSI2MTkiIG1hbmRhdG9yeT0ibXVzdCIgbWF5LWVuY3J5cHQ9InllcyI+CisJCQk8dHlwZSB0eXBlLW5hbWU9IkRpYW1ldGVyVVJJIiAvPgorCQk8L2F2cD4KKworCQk8IS0tIFszR1BQIFRTIDI5LjIyOSBWNy43LjBdICwgY2xhdXNlIDYuMy4yMSAtLT4KKwkJPGF2cCBuYW1lPSJTZWNvbmRhcnktRXZlbnQtQ2hhcmdpbmctRnVuY3Rpb24tTmFtZSIgdmVuZG9yLWlkPSIxMDQxNSIKKwkJCWNvZGU9IjYyMCIgbWFuZGF0b3J5PSJtdXN0IiBtYXktZW5jcnlwdD0ieWVzIj4KKwkJCTx0eXBlIHR5cGUtbmFtZT0iRGlhbWV0ZXJVUkkiIC8+CisJCTwvYXZwPgorCisJCTwhLS0gWzNHUFAgVFMgMjkuMjI5IFY3LjcuMF0gLCBjbGF1c2UgNi4zLjIyIC0tPgorCQk8YXZwIG5hbWU9IlByaW1hcnktQ2hhcmdpbmctQ29sbGVjdGlvbi1GdW5jdGlvbi1OYW1lIiB2ZW5kb3ItaWQ9IjEwNDE1IgorCQkJY29kZT0iNjIxIiBtYW5kYXRvcnk9Im11c3QiIG1heS1lbmNyeXB0PSJ5ZXMiPgorCQkJPHR5cGUgdHlwZS1uYW1lPSJEaWFtZXRlclVSSSIgLz4KKwkJPC9hdnA+CisKKwkJPCEtLSBbM0dQUCBUUyAyOS4yMjkgVjcuNy4wXSAsIGNsYXVzZSA2LjMuMjMgLS0+CisJCTxhdnAgbmFtZT0iU2Vjb25kYXJ5LUNoYXJnaW5nLUNvbGxlY3Rpb24tRnVuY3Rpb24tTmFtZSIgdmVuZG9yLWlkPSIxMDQxNSIKKwkJCWNvZGU9IjYyMiIgbWFuZGF0b3J5PSJtdXN0IiBtYXktZW5jcnlwdD0ieWVzIj4KKwkJCTx0eXBlIHR5cGUtbmFtZT0iRGlhbWV0ZXJVUkkiIC8+CisJCTwvYXZwPgorCisJCTwhLS0gWzNHUFAgVFMgMjkuMjE0IHY3LjMuMF0gLCBjbGF1c2UgNS4zLjQgLS0+CisJCTxhdnAgbmFtZT0iQWNjZXNzLU5ldHdvcmstQ2hhcmdpbmctSWRlbnRpZmllci1WYWx1ZSIgdmVuZG9yLWlkPSIxMDQxNSIKKwkJCWNvZGU9IjUwMyIgbWFuZGF0b3J5PSJtdXN0IiBtYXktZW5jcnlwdD0ieWVzIj4KKwkJCTx0eXBlIHR5cGUtbmFtZT0iT2N0ZXRTdHJpbmciIC8+CisJCTwvYXZwPgorCisKKwkJPCEtLSBbM0dQUCBUUyAyOS4wNjEgVjcuOS4wXSAsIGNsYXVzZSAxNi40LjcgLS0+CisJCTxhdnAgbmFtZT0iM0dQUC1SQVQtVHlwZSIgdmVuZG9yLWlkPSIxMDQxNSIgY29kZT0iMjEiIG1hbmRhdG9yeT0ibXVzdG5vdCIKKwkJCW1heS1lbmNyeXB0PSJ5ZXMiPgorCQkJPHR5cGUgdHlwZS1uYW1lPSJPY3RldFN0cmluZyIgLz4KKwkJPC9hdnA+CisKKworCQkJPCEtLSBSZWYgPSBSRkMgNDAwNiBjaGFwIDguNDggLS0+CisJCTxhdnAgbmFtZT0iU3Vic2NyaXB0aW9uLUlkLURhdGEiIGNvZGU9IjQ0NCIgbWFuZGF0b3J5PSJtdXN0IgorCQkJbWF5LWVuY3J5cHQ9InllcyI+CisJCQk8dHlwZSB0eXBlLW5hbWU9IlVURjhTdHJpbmciIC8+CisJCTwvYXZwPgorCQk8IS0tIFJlZiA9IFJGQyA0MDA2IGNoYXAgOC40NyAtLT4KKwkJPGF2cCBuYW1lPSJTdWJzY3JpcHRpb24tSWQtVHlwZSIgY29kZT0iNDUwIiBtYW5kYXRvcnk9Im11c3QiCisJCQlwcm90ZWN0ZWQ9Im1heSIgbWF5LWVuY3J5cHQ9InllcyI+CisJCQk8dHlwZSB0eXBlLW5hbWU9IkVudW1lcmF0ZWQiIC8+CisJCQk8ZW51bSBuYW1lPSJFTkRfVVNFUl9FMTY0IiBjb2RlPSIwIiAvPgorCQkJPGVudW0gbmFtZT0iRU5EX1VTRVJfSU1TSSIgY29kZT0iMSIgLz4KKwkJCTxlbnVtIG5hbWU9IkVORF9VU0VSX1NJUF9VUkkiIGNvZGU9IjIiIC8+CisJCQk8ZW51bSBuYW1lPSJFTkRfVVNFUl9OQUkiIGNvZGU9IjMiIC8+CisJCQk8ZW51bSBuYW1lPSJFTkRfVVNFUl9QUklWQVRFIiBjb2RlPSI0IiAvPgorCQk8L2F2cD4KKworCQk8IS0tIFtSRkMgNDAwNl0gLCBjbGF1c2UgOC4yIC0tPgorCQk8YXZwIG5hbWU9IkNDLVJlcXVlc3QtTnVtYmVyIiBjb2RlPSI0MTUiIG1hbmRhdG9yeT0ibXVzdCIKKwkJCW1heS1lbmNyeXB0PSJ5ZXMiPgorCQkJPHR5cGUgdHlwZS1uYW1lPSJVbnNpZ25lZDMyIiAvPgorCQk8L2F2cD4KKworCQk8IS0tIFtSRkMgNDAwNl0gLCBjbGF1c2UgOC4zIC0tPgorCQk8YXZwIG5hbWU9IkNDLVJlcXVlc3QtVHlwZSIgY29kZT0iNDE2IiBtYW5kYXRvcnk9Im11c3QiCisJCQltYXktZW5jcnlwdD0ieWVzIj4KKwkJCTx0eXBlIHR5cGUtbmFtZT0iRW51bWVyYXRlZCIgLz4KKwkJCTxlbnVtIG5hbWU9IklOSVRJQUxfUkVRVUVTVCIgY29kZT0iMSIgLz4KKwkJCTxlbnVtIG5hbWU9IlVQREFURV9SRVFVRVNUIiBjb2RlPSIyIiAvPgorCQkJPGVudW0gbmFtZT0iVEVSTUlOQVRJT05fUkVRVUVTVCIgY29kZT0iMyIgLz4KKwkJCTxlbnVtIG5hbWU9IkVWRU5UX1JFUVVFU1QiIGNvZGU9IjQiIC8+CisJCTwvYXZwPgorCisJCTwhLS0gW1JGQyA0MDA2XSAsIGNsYXVzZSA4LjM4IC0tPgorCQk8YXZwIG5hbWU9IlJlZGlyZWN0LUFkZHJlc3MtVHlwZSIgY29kZT0iNDMzIiBtYW5kYXRvcnk9Im11c3QiCisJCQltYXktZW5jcnlwdD0ieWVzIj4KKwkJCTx0eXBlIHR5cGUtbmFtZT0iRW51bWVyYXRlZCIgLz4KKwkJCTxlbnVtIG5hbWU9IklQVjRfQUREUkVTUyIgY29kZT0iMCIgLz4KKwkJCTxlbnVtIG5hbWU9IklQVjZfQUREUkVTUyIgY29kZT0iMSIgLz4KKwkJCTxlbnVtIG5hbWU9IlVSTCIgY29kZT0iMiIgLz4KKwkJCTxlbnVtIG5hbWU9IlNJUF9VUkkiIGNvZGU9IjMiIC8+CisJCTwvYXZwPgorPCEtLSBbUkZDIDQwMDZdICwgY2xhdXNlIDguMzkgLS0+CisJCTxhdnAgbmFtZT0iUmVkaXJlY3QtU2VydmVyLUFkZHJlc3MiIGNvZGU9IjQzNSIgbWFuZGF0b3J5PSJtdXN0IgorCQkJbWF5LWVuY3J5cHQ9InllcyI+CisJCQk8dHlwZSB0eXBlLW5hbWU9IlVURjhTdHJpbmciIC8+CisJCTwvYXZwPgorCQkKKwkJCTwhLS0gWzNHUFAgVFMgMjkuMjEyIFY3LjcuMF0gLCBjbGF1c2UgNS4zLjE5IC0tPgorCQk8YXZwIG5hbWU9IlBDQy1SdWxlLVN0YXR1cyIgdmVuZG9yLWlkPSIxMDQxNSIgY29kZT0iMTAxOSIKKwkJCW1hbmRhdG9yeT0ibXVzdCIgbWF5LWVuY3J5cHQ9InllcyI+CisJCQk8dHlwZSB0eXBlLW5hbWU9IkVudW1lcmF0ZWQiIC8+CisJCQk8ZW51bSBuYW1lPSJBQ1RJVkUiIGNvZGU9IjAiIC8+CisJCQk8ZW51bSBuYW1lPSJJTkFDVElWRSIgY29kZT0iMSIgLz4KKwkJCTxlbnVtIG5hbWU9IlRFTVBPUkFSSUxZIElOQUNUSVZFIiBjb2RlPSIyIiAvPgorCQk8L2F2cD4KKworCQk8IS0tIFtSRkMgNDAwNV0gLCBjbGF1c2UgNi4xMS4xIC0tPgorCQk8YXZwIG5hbWU9IkZyYW1lZC1JUC1BZGRyZXNzIiBjb2RlPSI4IiBtYW5kYXRvcnk9Im11c3QiCisJCQltYXktZW5jcnlwdD0ieWVzIj4KKwkJCTx0eXBlIHR5cGUtbmFtZT0iT2N0ZXRTdHJpbmciIC8+CisJCTwvYXZwPgorCisJCTwhLS0gW1JGQyA0MDA1XSAsIGNsYXVzZSA2LjExLjYgLS0+CisJCTxhdnAgbmFtZT0iRnJhbWVkLUlQdjYtUHJlZml4IiBjb2RlPSI5NyIgbWFuZGF0b3J5PSJtdXN0IgorCQkJbWF5LWVuY3J5cHQ9InllcyI+CisJCQk8dHlwZSB0eXBlLW5hbWU9Ik9jdGV0U3RyaW5nIiAvPgorCQk8L2F2cD4KKworCQk8IS0tIFtSRkMgNDAwNV0gLCBjbGF1c2UgNC41IC0tPgorCQk8YXZwIG5hbWU9IkNhbGxlZC1TdGF0aW9uLUlkIiBjb2RlPSIzMCIgbWFuZGF0b3J5PSJtdXN0IgorCQkJbWF5LWVuY3J5cHQ9InllcyI+CisJCQk8dHlwZSB0eXBlLW5hbWU9IlVURjhTdHJpbmciIC8+CisJCTwvYXZwPgorCisJCTwhLS0gW1JGQyA0MDA1XSAsIGNsYXVzZSA2LjcgLS0+CisJCTxhdnAgbmFtZT0iRmlsdGVyLUlkIiBjb2RlPSIxMSIgbWFuZGF0b3J5PSJtdXN0IiBtYXktZW5jcnlwdD0ieWVzIj4KKwkJCTx0eXBlIHR5cGUtbmFtZT0iVVRGOFN0cmluZyIgLz4KKwkJPC9hdnA+CisKKwkJPCEtLSBbM0dQUCBUUyAyOS4yMTIgVjcuNy4wXSAsIGNsYXVzZSA1LjMuMjEgLS0+CisJCTxhdnAgbmFtZT0iQmVhcmVyLU9wZXJhdGlvbiIgdmVuZG9yLWlkPSIxMDQxNSIgY29kZT0iMTAyMSIKKwkJCW1hbmRhdG9yeT0ibXVzdCIgbWF5LWVuY3J5cHQ9InllcyI+CisJCQk8dHlwZSB0eXBlLW5hbWU9IkVudW1lcmF0ZWQiIC8+CisJCQk8ZW51bSBuYW1lPSJURVJNSU5BVElPTiIgY29kZT0iMCIgLz4KKwkJCTxlbnVtIG5hbWU9IkVTVEFCTElTSE1FTlQiIGNvZGU9IjEiIC8+CisJCQk8ZW51bSBuYW1lPSJNT0RJRklDQVRJT04iIGNvZGU9IjIiIC8+CisJCTwvYXZwPgorCQkKKwkJPCEtLSBbM0dQUCBUUyAyOS4yMTIgVjcuNy4wXSAsIGNsYXVzZSA1LjMuMjQgLS0+CisJCTxhdnAgbmFtZT0iTmV0d29yay1SZXF1ZXN0LVN1cHBvcnQiIHZlbmRvci1pZD0iMTA0MTUiIGNvZGU9IjEwMjQiCisJCQltYW5kYXRvcnk9Im11c3QiIG1heS1lbmNyeXB0PSJ5ZXMiPgorCQkJPHR5cGUgdHlwZS1uYW1lPSJFbnVtZXJhdGVkIi8+CisgICAgICAKKwkJCQk8ZW51bSBuYW1lPSJORVRXT1JLX1JFUVVFU1RfTk9UX1NVUFBPUlRFRCIgY29kZT0iMCIgLz4KKwkJCQk8ZW51bSBuYW1lPSJORVRXT1JLX1JFUVVFU1RfU1VQUE9SVEVEIiBjb2RlPSIxIiAvPgorCQk8L2F2cD4KKworCQkJCTwhLS0gWzNHUFAgVFMgMjkuMjEyIFY3LjcuMF0gLCBjbGF1c2UgNS4zLjUgLS0+CisJCTxhdnAgbmFtZT0iQ2hhcmdpbmctUnVsZS1CYXNlLU5hbWUiIHZlbmRvci1pZD0iMTA0MTUiIGNvZGU9IjEwMDQiCisJCQltYW5kYXRvcnk9Im11c3QiIG1heS1lbmNyeXB0PSJ5ZXMiPgorCQkJPHR5cGUgdHlwZS1uYW1lPSJVVEY4U3RyaW5nIiAvPgorCQk8L2F2cD4KKwkJPCEtLSBbM0dQUCBUUyAyOS4yMTIgVjcuNy4wXSAsIGNsYXVzZSA1LjMuMTUgLS0+CisJCTxhdnAgbmFtZT0iVG9TLVRyYWZmaWMtQ2xhc3MiIHZlbmRvci1pZD0iMTA0MTUiIGNvZGU9IjEwMTQiCisJCQltYW5kYXRvcnk9Im11c3QiIG1heS1lbmNyeXB0PSJ5ZXMiPgorCQkJPHR5cGUgdHlwZS1uYW1lPSJPY3RldFN0cmluZyIgLz4KKwkJPC9hdnA+CisKKwkJPCEtLSBbM0dQUCBUUyAyOS4yMTIgVjcuNy4wXSAsIGNsYXVzZSA1LjMuMjcgLS0+CisJCTxhdnAgbmFtZT0iSVAtQ0FOLVR5cGUiIHZlbmRvci1pZD0iMTA0MTUiIGNvZGU9IjEwMjciIG1hbmRhdG9yeT0ibXVzdCIKKwkJCW1heS1lbmNyeXB0PSJ5ZXMiPgorCQkJPHR5cGUgdHlwZS1uYW1lPSJFbnVtZXJhdGVkIiAvPgorCQkJPGVudW0gbmFtZT0iM0dQUCIgY29kZT0iMCIgLz4KKwkJCTxlbnVtIG5hbWU9IkRPQ1NJUyIgY29kZT0iMSIgLz4KKwkJCTxlbnVtIG5hbWU9InhEU0wiIGNvZGU9IjIiIC8+CisJCQk8ZW51bSBuYW1lPSJXaU1BWCIgY29kZT0iMyIgLz4KKwkJCTxlbnVtIG5hbWU9IjNHUFAyIiBjb2RlPSI0IiAvPgorCQk8L2F2cD4KKworCQk8IS0tIFszR1BQIFRTIDI5LjIxMiBWNy43LjBdICwgY2xhdXNlIDUuMy4yOCAtLT4KKwkJPGF2cCBuYW1lPSJRb1MtTmVnb3RpYXRpb24iIHZlbmRvci1pZD0iMTA0MTUiIGNvZGU9IjEwMjkiCisJCQltYW5kYXRvcnk9Im11c3QiIG1heS1lbmNyeXB0PSJ5ZXMiPgorCQkJPHR5cGUgdHlwZS1uYW1lPSJFbnVtZXJhdGVkIiAvPgorCQkJPGVudW0gbmFtZT0iTk9fUU9TX05FR09USUFUSU9OIiBjb2RlPSIwIiAvPgorCQkJPGVudW0gbmFtZT0iUU9TX05FR09USUFUSU9OX1NVUFBPUlRFRCIgY29kZT0iMSIgLz4KKwkJPC9hdnA+CisKKwkJPCEtLSBbM0dQUCBUUyAyOS4yMTIgVjcuNy4wXSAsIGNsYXVzZSA1LjMuMjkgLS0+CisJCTxhdnAgbmFtZT0iUW9TLVVwZ3JhZGUiIHZlbmRvci1pZD0iMTA0MTUiIGNvZGU9IjEwMzAiIG1hbmRhdG9yeT0ibXVzdCIKKwkJCW1heS1lbmNyeXB0PSJ5ZXMiPgorCQkJPHR5cGUgdHlwZS1uYW1lPSJFbnVtZXJhdGVkIiAvPgorCQkJPGVudW0gbmFtZT0iUU9TX1VQR1JBREVfTk9UX1NVUFBPUlRFRCIgY29kZT0iMCIgLz4KKwkJCTxlbnVtIG5hbWU9IlFPU19VUEdSQURFX1NVUFBPUlRFRCIgY29kZT0iMSIgLz4KKwkJPC9hdnA+CisKKwkJPCEtLSBbM0dQUCBUUyAyOS4yMTIgVjcuNy4wXSAsIGNsYXVzZSA1LjMuMzAgLS0+CisJCTxhdnAgbmFtZT0iUnVsZS1GYWlsdXJlLUNvZGUiIHZlbmRvci1pZD0iMTA0MTUiIGNvZGU9IjEwMzEiCisJCQltYW5kYXRvcnk9Im11c3QiIG1heS1lbmNyeXB0PSJ5ZXMiPgorCQkJPHR5cGUgdHlwZS1uYW1lPSJFbnVtZXJhdGVkIiAvPgorCQkJPGVudW0gbmFtZT0iVU5LTk9XTl9SVUxFX05BTUUiIGNvZGU9IjEiIC8+CisJCQk8ZW51bSBuYW1lPSJSQVRJTkdfR1JPVVBfRVJST1IiIGNvZGU9IjIiIC8+CisJCQk8ZW51bSBuYW1lPSJTRVJWSUNFX0lERU5USUZJRVJfRVJST1IiIGNvZGU9IjMiIC8+CisJCQk8ZW51bSBuYW1lPSJHVy9QQ0VGX01BTEZVTkNUSU9OIiBjb2RlPSI0IiAvPgorCQkJPGVudW0gbmFtZT0iUkVTT1VSQ0VTX0xJTUlUQVRJT04iIGNvZGU9IjUiIC8+CisJCQk8ZW51bSBuYW1lPSJNQVhfTlJfQkVBUkVSU19SRUFDSEVEIiBjb2RlPSI2IiAvPgorCQkJPGVudW0gbmFtZT0iVU5LTk9XTl9CRUFSRVJfSUQiIGNvZGU9IjciIC8+CisJCQk8ZW51bSBuYW1lPSJNSVNTSU5HX0JFQVJFUl9JRCIgY29kZT0iOCIgLz4KKwkJCTxlbnVtIG5hbWU9Ik1JU1NJTkdfRkxPV19ERVNDUklQVElPTiIgY29kZT0iOSIgLz4KKwkJPC9hdnA+CisKKwkJPCEtLSBbM0dQUCBUUyAyOS4yMTIgVjcuNy4wXSAsIGNsYXVzZSA1LjMuMzQgLS0+CisJCTxhdnAgbmFtZT0iU2Vzc2lvbi1SZWxlYXNlLUNhdXNlIiB2ZW5kb3ItaWQ9IjEwNDE1IiBjb2RlPSIxMDM1IgorCQkJbWFuZGF0b3J5PSJtdXN0IiBtYXktZW5jcnlwdD0ieWVzIj4KKwkJCTx0eXBlIHR5cGUtbmFtZT0iRW51bWVyYXRlZCIgLz4KKwkJCTxlbnVtIG5hbWU9IlVOU1BFQ0lGSUVEX1JFQVNPTlMiIGNvZGU9IjAiIC8+CisJCQk8ZW51bSBuYW1lPSJVRV9TVUJTQ1JJUFRJT05fUkVBU09OIiBjb2RlPSIxIiAvPgorCQkJPGVudW0gbmFtZT0iSU5TVUZGSUNJRU5UX1NFUlZFUl9SRVNPVVJDRVMiIGNvZGU9IjIiIC8+CisJCTwvYXZwPgorCisKKworCQk8IS0tIFszR1BQIFRTIDI5LjA2MSBWNy45LjBdICwgY2xhdXNlIDE2LjQuNy4gLS0+CisJCTxhdnAgbmFtZT0iM0dQUC1TR1NOLU1DQy1NTkMiIHZlbmRvci1pZD0iMTA0MTUiIGNvZGU9IjE4IgorCQkJbWFuZGF0b3J5PSJtdXN0bm90IiBtYXktZW5jcnlwdD0ieWVzIj4KKwkJCTx0eXBlIHR5cGUtbmFtZT0iVVRGOFN0cmluZyIgLz4KKwkJPC9hdnA+CisKKwkJPCEtLSBbM0dQUCBUUyAyOS4wNjEgVjcuOS4wXSAsIGNsYXVzZSAxNi40LjcgLS0+CisJCTxhdnAgbmFtZT0iM0dQUC1Vc2VyLUxvY2F0aW9uLUluZm8iIHZlbmRvci1pZD0iMTA0MTUiIGNvZGU9IjIyIgorCQkJbWFuZGF0b3J5PSJtdXN0bm90IiBtYXktZW5jcnlwdD0ieWVzIj4KKwkJCTx0eXBlIHR5cGUtbmFtZT0iT2N0ZXRTdHJpbmciIC8+CisJCTwvYXZwPgorCisKKwkJPCEtLSBbM0dQUCBUUyAyOS4yMTIgVjcuNy4wXSAsIGNsYXVzZSA1LjMuMzEgLS0+CisJCTxhdnAgbmFtZT0iUmV2YWxpZGF0aW9uLVRpbWUiIHZlbmRvci1pZD0iMTA0MTUiIGNvZGU9IjEwMzIiCisJCQltYW5kYXRvcnk9Im11c3QiIG1heS1lbmNyeXB0PSJ5ZXMiPgorCQkJPHR5cGUgdHlwZS1uYW1lPSJUaW1lIiAvPgorCQk8L2F2cD4KKworCQk8IS0tIFszR1BQIFRTIDI5LjIxMiBWNy43LjBdICwgY2xhdXNlIDUuMy4zMiAtLT4KKwkJPGF2cCBuYW1lPSJSdWxlLUFjdGl2YXRpb24tVGltZSIgY29kZT0iMTAzMyIgbWFuZGF0b3J5PSJtdXN0IgorCQkJbWF5LWVuY3J5cHQ9InllcyI+CisJCQk8dHlwZSB0eXBlLW5hbWU9IlRpbWUiIC8+CisJCTwvYXZwPgorCisKKwkJPCEtLSBbM0dQUCBUUyAyOS4yMTIgVjcuNy4wXSAsIGNsYXVzZSA1LjMuMzMgLS0+CisJCTxhdnAgbmFtZT0iUnVsZS1EZWFjdGl2YXRpb24tVGltZSIgdmVuZG9yLWlkPSIxMDQxNSIgY29kZT0iMTAzNCIKKwkJCW1hbmRhdG9yeT0ibXVzdCIgbWF5LWVuY3J5cHQ9InllcyI+CisJCQk8dHlwZSB0eXBlLW5hbWU9IlRpbWUiIC8+CisJCTwvYXZwPgorCisJCTwhLS0gWzNHUFAgVFMgMjkuMDYxIFY3LjcuMF0gLCBjbGF1c2UgMTYuNC43LjEgLS0+CisJCTxhdnAgbmFtZT0iM0dQUC1TR1NOLUFkZHJlc3MiIHZlbmRvci1pZD0iMTA0MTUiIGNvZGU9IjYiIG1hbmRhdG9yeT0ibXVzdG5vdCIKKwkJCW1heS1lbmNyeXB0PSJ5ZXMiPgorCQkJPHR5cGUgdHlwZS1uYW1lPSJPY3RldFN0cmluZyIgLz4KKwkJPC9hdnA+CisKKwkJPCEtLSBbM0dQUCBUUyAyOS4wNjEgVjcuNy4wXSAsIGNsYXVzZSAxNi40LjcuMSAtLT4KKwkJPGF2cCBuYW1lPSIzR1BQLVNHU04tSVB2Ni1BZGRyZXNzIiB2ZW5kb3ItaWQ9IjEwNDE1IiBjb2RlPSIxNSIKKwkJCW1hbmRhdG9yeT0ibXVzdG5vdCIgbWF5LWVuY3J5cHQ9InllcyI+CisJCQk8dHlwZSB0eXBlLW5hbWU9Ik9jdGV0U3RyaW5nIiAvPgorCQk8L2F2cD4KKworCQk8IS0tIFszR1BQIFRTIDI5LjA2MSBWNy43LjBdICwgY2xhdXNlIDE3LjcuMTIgLS0+CisJCTxhdnAgbmFtZT0iUkFJIiB2ZW5kb3ItaWQ9IjEwNDE1IiBjb2RlPSI5MDkiIG1hbmRhdG9yeT0ibXVzdCIKKwkJCW1heS1lbmNyeXB0PSJ5ZXMiPgorCQkJPHR5cGUgdHlwZS1uYW1lPSJVVEY4U3RyaW5nIiAvPgorCQk8L2F2cD4KKworCQk8IS0tIFszR1BQIFRTIDI5LjA2MSBWNy43LjBdICwgY2xhdXNlIDE2LjQuNyAtLT4KKwkJPGF2cCBuYW1lPSIzR1BQLU1TLVRpbWVab25lIiB2ZW5kb3ItaWQ9IjEwNDE1IiBjb2RlPSIyMyIgbWFuZGF0b3J5PSJtdXN0bm90IgorCQkJbWF5LWVuY3J5cHQ9InllcyI+CisJCQk8dHlwZSB0eXBlLW5hbWU9Ik9jdGV0U3RyaW5nIiAvPgorCQk8L2F2cD4KKwkJCisJCTwhLS0gWzNHUFAgVFMgMjkuMjEyIFY3LjcuMF0gLCBjbGF1c2UgNS4zLjIwIC0tPgorCQk8YXZwIG5hbWU9IkJlYXJlci1JZGVudGlmaWVyIiB2ZW5kb3ItaWQ9IjEwNDE1IiBjb2RlPSIxMDIwIgorCQkJbWFuZGF0b3J5PSJtdXN0IiBtYXktZW5jcnlwdD0ieWVzIj4KKwkJCTx0eXBlIHR5cGUtbmFtZT0iT2N0ZXRTdHJpbmciIC8+CisJCTwvYXZwPgorCisJCTwhLS0gWzNHUFAgVFMgMjkuMjEyIFY3LjcuMF0gLCBjbGF1c2UgNS4zLjYgLS0+CisJCTxhdnAgbmFtZT0iQ2hhcmdpbmctUnVsZS1OYW1lIiB2ZW5kb3ItaWQ9IjEwNDE1IiBjb2RlPSIxMDA1IgorCQkJbWFuZGF0b3J5PSJtdXN0IiBtYXktZW5jcnlwdD0ieWVzIj4KKwkJCTx0eXBlIHR5cGUtbmFtZT0iT2N0ZXRTdHJpbmciIC8+CisJCTwvYXZwPgorCisKKwkJPCEtLSBbUkZDIDQwMDZdICwgY2xhdXNlIDguMjggLS0+CisJCTxhdnAgbmFtZT0iU2VydmljZS1JZGVudGlmaWVyIiBjb2RlPSI0MzkiIG1hbmRhdG9yeT0ibXVzdCIKKwkJCW1heS1lbmNyeXB0PSJ5ZXMiPgorCQkJPHR5cGUgdHlwZS1uYW1lPSJVbnNpZ25lZDMyIiAvPgorCQk8L2F2cD4KKwkJCisJCTwhLS0gW1JGQyA0MDA2XSAsIGNsYXVzZSA4LjI5IC0tPgorCQk8YXZwIG5hbWU9IlJhdGluZy1Hcm91cCIgY29kZT0iNDMyIiBtYW5kYXRvcnk9Im11c3QiIG1heS1lbmNyeXB0PSJ5ZXMiPgorCQkJPHR5cGUgdHlwZS1uYW1lPSJVbnNpZ25lZDMyIiAvPgorCQk8L2F2cD4KKwkJPCEtLSBbM0dQUCBUUyAyOS4yMTQgVjcuMy4wXSAsIGNsYXVzZSA1LjMuMTEgLS0+CisJCTxhdnAgbmFtZT0iRmxvdy1TdGF0dXMiIHZlbmRvci1pZD0iMTA0MTUiIGNvZGU9IjUxMSIgbWFuZGF0b3J5PSJtdXN0IgorCQkJbWF5LWVuY3J5cHQ9InllcyI+CisJCQk8dHlwZSB0eXBlLW5hbWU9IkVudW1lcmF0ZWQiIC8+CisJCQk8ZW51bSBuYW1lPSJFTkFCTEVELVVQTElOSyIgY29kZT0iMCIgLz4KKwkJCTxlbnVtIG5hbWU9IkVOQUJMRUQtRE9XTkxJTksiIGNvZGU9IjEiIC8+CisJCQk8ZW51bSBuYW1lPSJFTkFCTEVEIiBjb2RlPSIyIiAvPgorCQkJPGVudW0gbmFtZT0iRElTQUJMRUQiIGNvZGU9IjMiIC8+CisJCQk8ZW51bSBuYW1lPSJSRU1PVkVEIiBjb2RlPSI0IiAvPgorCQk8L2F2cD4KKwkJCQk8IS0tIFszR1BQIFRTIDI5LjIxMiBWNy43LjBdICwgY2xhdXNlIDUuMy4xNyAtLT4KKwkJPGF2cCBuYW1lPSJRb1MtQ2xhc3MtSWRlbnRpZmllciIgdmVuZG9yLWlkPSIxMDQxNSIgY29kZT0iMTAyOCIKKwkJCW1hbmRhdG9yeT0ibXVzdCIgbWF5LWVuY3J5cHQ9InllcyI+CisJCQk8dHlwZSB0eXBlLW5hbWU9IkVudW1lcmF0ZWQiIC8+CisJCQk8ZW51bSBuYW1lPSJGSU5BTF9TRVJWSUNFX0lORk9STUFUSU9OIiBjb2RlPSIwIiAvPgorCQkJPGVudW0gbmFtZT0iUFJFTElNSU5BUllfU0VSVklDRV9JTkZPUk1BVElPTiIgY29kZT0iMSIgLz4KKwkJPC9hdnA+CisJCQk8IS0tIFJlZiA9IFszR1BQIC0gMjkuMjE0XSA1LjMuMTUgLS0+CisJCTxhdnAgbmFtZT0iTWF4LVJlcXVlc3RlZC1CYW5kd2lkdGgtVUwiIGNvZGU9IjUxNiIgdmVuZG9yLWlkPSIxMDQxNSIKKwkJCW1hbmRhdG9yeT0ibXVzdCIgbWF5LWVuY3J5cHQ9InllcyI+CisJCQk8dHlwZSB0eXBlLW5hbWU9IlVuc2lnbmVkMzIiIC8+CisJCTwvYXZwPgorCQk8IS0tIFszR1BQIFRTIDI5LjIxMiBWNy43LjBdICwgY2xhdXNlIDUuMy4yNSAtLT4KKwkJPGF2cCBuYW1lPSJHdWFyYW50ZWVkLUJpdHJhdGUtREwiIHZlbmRvci1pZD0iMTA0MTUiIGNvZGU9IjEwMjUiCisJCQltYW5kYXRvcnk9Im11c3QiIG1heS1lbmNyeXB0PSJ5ZXMiPgorCQkJPHR5cGUgdHlwZS1uYW1lPSJVbnNpZ25lZDMyIiAvPgorCQk8L2F2cD4KKworCQk8IS0tIFszR1BQIFRTIDI5LjIxMiBWNy43LjBdICwgY2xhdXNlIDUuMy4yNiAtLT4KKwkJPGF2cCBuYW1lPSJHdWFyYW50ZWVkLUJpdHJhdGUtVUwiIHZlbmRvci1pZD0iMTA0MTUiIGNvZGU9IjEwMjYiCisJCQltYW5kYXRvcnk9Im11c3QiIG1heS1lbmNyeXB0PSJ5ZXMiPgorCQkJPHR5cGUgdHlwZS1uYW1lPSJVbnNpZ25lZDMyIiAvPgorCQk8L2F2cD4KKwkJPCEtLSBbM0dQUCBUUyAyOS4yMTIgVjcuNy4wXSAsIGNsYXVzZSA1LjMuMjAgLS0+CisJCTxhdnAgbmFtZT0iQmVhcmVyLUlkZW50aWZpZXIiIHZlbmRvci1pZD0iMTA0MTUiIGNvZGU9IjEwMjAiCisJCQltYW5kYXRvcnk9Im11c3QiIG1heS1lbmNyeXB0PSJ5ZXMiPgorCQkJPHR5cGUgdHlwZS1uYW1lPSJPY3RldFN0cmluZyIgLz4KKwkJPC9hdnA+CisJCTxhdnAgbmFtZT0iTWF4LVJlcXVlc3RlZC1CYW5kd2lkdGgtVUwiIGNvZGU9IjUxNiIgbWFuZGF0b3J5PSJtdXN0IiB2ZW5kb3ItaWQ9IjEwNDE1IiBtYXktZW5jcnlwdD0ieWVzIj4KKwkJCTx0eXBlIHR5cGUtbmFtZT0iVW5zaWduZWQzMiIvPgorCQk8L2F2cD4KKwkJICAgPGF2cCBuYW1lPSJNYXgtUmVxdWVzdGVkLUJhbmR3aWR0aC1ETCIgY29kZT0iNTE1IiBtYW5kYXRvcnk9Im11c3QiIHZlbmRvci1pZD0iMTA0MTUiIG1heS1lbmNyeXB0PSJ5ZXMiPgorCQkJPHR5cGUgdHlwZS1uYW1lPSJVbnNpZ25lZDMyIi8+CisJCTwvYXZwPgorCQk8IS0tIFszR1BQIFRTIDI5LjIxMiBWNy43LjBdICwgY2xhdXNlIDUuMy4xNiAtLT4KKwkJPGF2cCBuYW1lPSJRb1MtSW5mb3JtYXRpb24iIHZlbmRvci1pZD0iMTA0MTUiIGNvZGU9IjEwMTYiCisJCQltYW5kYXRvcnk9Im11c3QiIG1heS1lbmNyeXB0PSJ5ZXMiPgorCQkJPGdyb3VwZWQ+CisJCQkJPHJlcXVpcmVkPgorCQkJCQk8YXZwcnVsZSBuYW1lPSJRb1MtQ2xhc3MtSWRlbnRpZmllciIgbWluaW11bT0iMSIgbWF4aW11bT0iMSIgLz4KKwkJCQkJPGF2cHJ1bGUgbmFtZT0iTWF4LVJlcXVlc3RlZC1CYW5kd2lkdGgtVUwiIG1pbmltdW09IjEiCisJCQkJCQltYXhpbXVtPSIxIiAvPgorCQkJCQk8YXZwcnVsZSBuYW1lPSJNYXgtUmVxdWVzdGVkLUJhbmR3aWR0aC1ETCIgbWluaW11bT0iMSIKKwkJCQkJCW1heGltdW09IjEiIC8+CisJCQkJCTxhdnBydWxlIG5hbWU9Ikd1YXJhbnRlZWQtQml0cmF0ZS1VTCIgbWluaW11bT0iMSIgbWF4aW11bT0iMSIgLz4KKwkJCQkJPGF2cHJ1bGUgbmFtZT0iR3VhcmFudGVlZC1CaXRyYXRlLURMIiBtaW5pbXVtPSIxIiBtYXhpbXVtPSIxIiAvPgorCQkJCQk8YXZwcnVsZSBuYW1lPSJCZWFyZXItSWRlbnRpZmllciIgbWluaW11bT0iMSIgbWF4aW11bT0iMSIgLz4KKwkJCQk8L3JlcXVpcmVkPgorCQkJPC9ncm91cGVkPgorCQk8L2F2cD4KKwkJPCEtLSBbM0dQUCBUUyAyOS4yMTQgVjcuMy4wXSAsIGNsYXVzZSA1LjMuOCAtLT4KKwkJPGF2cCBuYW1lPSJGbG93LURlc2NyaXB0aW9uIiB2ZW5kb3ItaWQ9IjEwNDE1IiBjb2RlPSI1MDciCisJCQltYW5kYXRvcnk9Im11c3QiIG1heS1lbmNyeXB0PSJ5ZXMiPgorCQkJPHR5cGUgdHlwZS1uYW1lPSJJUEZpbHRlclJ1bGUiIC8+CisJCTwvYXZwPgorCQk8IS0tIFszR1BQIFRTIDI5LjIxMiBWNy43LjBdICwgY2xhdXNlIDUuMy4xMiAtLT4KKwkJPGF2cCBuYW1lPSJSZXBvcnRpbmctTGV2ZWwiIHZlbmRvci1pZD0iMTA0MTUiIGNvZGU9IjEwMTEiCisJCQltYW5kYXRvcnk9Im11c3QiIG1heS1lbmNyeXB0PSJ5ZXMiPgorCQkJPHR5cGUgdHlwZS1uYW1lPSJFbnVtZXJhdGVkIiAvPgorCQkJPGVudW0gbmFtZT0iU0VSVklDRV9JREVOVElGSUVSX0xFVkVMIiBjb2RlPSIwIiAvPgorCQkJPGVudW0gbmFtZT0iUkFUSU5HX0dST1VQX0xFVkVMIiBjb2RlPSIxIiAvPgorCQk8L2F2cD4KKwkJPCEtLSBbM0dQUCBUUyAyOS4yMTIgVjcuNy4wXSAsIGNsYXVzZSA1LjMuOSAtLT4KKwkJPGF2cCBuYW1lPSJPZmZsaW5lIiB2ZW5kb3ItaWQ9IjEwNDE1IiBjb2RlPSIxMDA4IiBtYW5kYXRvcnk9Im11c3QiCisJCQltYXktZW5jcnlwdD0ieWVzIj4KKwkJCTx0eXBlIHR5cGUtbmFtZT0iRW51bWVyYXRlZCIgLz4KKwkJCTxlbnVtIG5hbWU9IkRJU0FCTEVfT0ZGTElORSIgY29kZT0iMCIgLz4KKwkJCTxlbnVtIG5hbWU9IkVOQUJMRV9PRkZMSU5FIiBjb2RlPSIxIiAvPgorCQk8L2F2cD4KKworCQk8IS0tIFszR1BQIFRTIDI5LjIxMiBWNy43LjBdICwgY2xhdXNlIDUuMy4xMCAtLT4KKwkJPGF2cCBuYW1lPSJPbmxpbmUiIHZlbmRvci1pZD0iMTA0MTUiIGNvZGU9IjEwMDkiIG1hbmRhdG9yeT0ibXVzdCIKKwkJCW1heS1lbmNyeXB0PSJ5ZXMiPgorCQkJPHR5cGUgdHlwZS1uYW1lPSJFbnVtZXJhdGVkIiAvPgorCQkJPGVudW0gbmFtZT0iRElTQUJMRV9PTkxJTkUiIGNvZGU9IjAiIC8+CisJCQk8ZW51bSBuYW1lPSJFTkFCTEVfT05MSU5FIiBjb2RlPSIxIiAvPgorCQk8L2F2cD4KKworCQk8IS0tIFszR1BQIFRTIDI5LjIxMiBWNy43LjBdICwgY2xhdXNlIDUuMy4xMSAtLT4KKwkJPGF2cCBuYW1lPSJQcmVjZWRlbmNlIiB2ZW5kb3ItaWQ9IjEwNDE1IiBjb2RlPSIxMDEwIiBtYW5kYXRvcnk9Im11c3QiCisJCQltYXktZW5jcnlwdD0ieWVzIj4KKwkJCTx0eXBlIHR5cGUtbmFtZT0iVW5zaWduZWQzMiIgLz4KKwkJPC9hdnA+CisJCQorCQk8IS0tIFszR1BQIFRTIDI5LjIxNCBWNy4zLjBdICwgY2xhdXNlIDUuMy42IC0tPgorCQk8YXZwIG5hbWU9IkFGLUNoYXJnaW5nLUlkZW50aWZpZXIiIHZlbmRvci1pZD0iMTA0MTUiIGNvZGU9IjUwNSIKKwkJCW1hbmRhdG9yeT0ibXVzdCIgbWF5LWVuY3J5cHQ9InllcyI+CisJCQk8dHlwZSB0eXBlLW5hbWU9Ik9jdGV0U3RyaW5nIiAvPgorCQk8L2F2cD4KKworCQk8IS0tIFJlZiA9IFszR1BQIC0gMjkuMjE0XSA1LjMuMTQgLS0+CisJCTxhdnAgbmFtZT0iTWF4LVJlcXVlc3RlZC1CYW5kd2lkdGgtREwiIGNvZGU9IjUxNSIgdmVuZG9yLWlkPSIxMDQxNSIKKwkJCW1hbmRhdG9yeT0ibXVzdCIgbWF5LWVuY3J5cHQ9InllcyI+CisJCQk8dHlwZSB0eXBlLW5hbWU9IlVuc2lnbmVkMzIiIC8+CisJCTwvYXZwPgorCQk8IS0tIFszR1BQIFRTIDI5LjIxNCBWNy4zLjBdICwgY2xhdXNlIDUuMy4xNyAtLT4KKwkJPGF2cCBuYW1lPSJNZWRpYS1Db21wb25lbnQtTnVtYmVyIiB2ZW5kb3ItaWQ9IjEwNDE1IiBjb2RlPSI1MTgiCisJCQltYW5kYXRvcnk9Im11c3QiIG1heS1lbmNyeXB0PSJ5ZXMiPgorCQkJPHR5cGUgdHlwZS1uYW1lPSJVbnNpZ25lZDMyIiAvPgorCQk8L2F2cD4KKworCQk8IS0tIFszR1BQIFRTIDI5LjIxNCBWNy4zLjBdICwgY2xhdXNlIDUuMy45IC0tPgorCQk8YXZwIG5hbWU9IkZsb3ctTnVtYmVyIiB2ZW5kb3ItaWQ9IjEwNDE1IiBjb2RlPSI1MDkiIG1hbmRhdG9yeT0ibXVzdCIKKwkJCW1heS1lbmNyeXB0PSJ5ZXMiPgorCQkJPHR5cGUgdHlwZS1uYW1lPSJVbnNpZ25lZDMyIiAvPgorCQk8L2F2cD4KKzwhLS0gWzNHUFAgVFMgMjkuMjE0IFY3LjMuMF0gLCBjbGF1c2UgNS4zLjEwIC0tPgorCQk8YXZwIG5hbWU9IkZsb3dzIiB2ZW5kb3ItaWQ9IjEwNDE1IiBjb2RlPSI1MTAiIG1hbmRhdG9yeT0ibXVzdCIKKwkJCW1heS1lbmNyeXB0PSJ5ZXMiPgorCQkJPGdyb3VwZWQ+CisJCQkJPHJlcXVpcmVkPgorCQkJCQk8YXZwcnVsZSBuYW1lPSJNZWRpYS1Db21wb25lbnQtTnVtYmVyIiBtaW5pbXVtPSIxIiBtYXhpbXVtPSIxIiAvPgorCQkJCTwvcmVxdWlyZWQ+CisJCQkJPG9wdGlvbmFsPgorCQkJCQk8YXZwcnVsZSBuYW1lPSJGbG93LU51bWJlciIgbWF4aW11bT0iMSIgLz4KKwkJCQk8L29wdGlvbmFsPgorCQkJPC9ncm91cGVkPgorCQk8L2F2cD4KKwkJPCEtLSBbM0dQUCBUUyAyOS4yMTIgVjcuNy4wXSAsIGNsYXVzZSA1LjMuNCAtLT4KKwkJPGF2cCBuYW1lPSJDaGFyZ2luZy1SdWxlLURlZmluaXRpb24iIHZlbmRvci1pZD0iMTA0MTUiIGNvZGU9IjEwMDMiCisJCQltYW5kYXRvcnk9Im11c3QiIG1heS1lbmNyeXB0PSJ5ZXMiPgorCQkJPGdyb3VwZWQ+CisJCQkJPHJlcXVpcmVkPgorCQkJCQk8YXZwcnVsZSBuYW1lPSJDaGFyZ2luZy1SdWxlLU5hbWUiIG1pbmltdW09IjEiIG1heGltdW09IjEiIC8+CisJCQkJCTxhdnBydWxlIG5hbWU9IlNlcnZpY2UtSWRlbnRpZmllciIgbWF4aW11bT0iMSIgLz4KKwkJCQkJPGF2cHJ1bGUgbmFtZT0iUmF0aW5nLUdyb3VwIiBtYXhpbXVtPSIxIiAvPgorCQkJCTwvcmVxdWlyZWQ+CisJCQkJPG9wdGlvbmFsPgorCQkJCQk8YXZwcnVsZSBuYW1lPSJGbG93LURlc2NyaXB0aW9uIiBtYXhpbXVtPSIxIiAvPgorCQkJCTwvb3B0aW9uYWw+CisJCQkJPHJlcXVpcmVkPgorCQkJCQk8YXZwcnVsZSBuYW1lPSJGbG93LVN0YXR1cyIgbWF4aW11bT0iMSIgLz4KKwkJCQkJPGF2cHJ1bGUgbmFtZT0iUW9TLUluZm9ybWF0aW9uIiBtYXhpbXVtPSIxIiAvPgorCQkJCQk8YXZwcnVsZSBuYW1lPSJSZXBvcnRpbmctTGV2ZWwiIG1heGltdW09IjEiIC8+CisJCQkJCTxhdnBydWxlIG5hbWU9Ik9ubGluZSIgbWF4aW11bT0iMSIgLz4KKwkJCQkJPGF2cHJ1bGUgbmFtZT0iT2ZmbGluZSIgbWF4aW11bT0iMSIgLz4KKwkJCQkJPGF2cHJ1bGUgbmFtZT0iTWV0ZXJpbmctTWV0aG9kIiBtYXhpbXVtPSIxIiAvPgorCQkJCQk8YXZwcnVsZSBuYW1lPSJQcmVjZWRlbmNlIiBtYXhpbXVtPSIxIiAvPgorCQkJCQk8YXZwcnVsZSBuYW1lPSJBRi1DaGFyZ2luZy1JZGVudGlmaWVyIiBtYXhpbXVtPSIxIiAvPgorCQkJCTwvcmVxdWlyZWQ+CisJCQkJPG9wdGlvbmFsPgorCQkJCQk8YXZwcnVsZSBuYW1lPSJGbG93cyIgbWF4aW11bT0iMSIgLz4KKwkJCQk8L29wdGlvbmFsPgorCQkJPC9ncm91cGVkPgorCQk8L2F2cD4KKwkJCisJCTwhLS0gWzNHUFAgVFMgMjkuMjEyIFY3LjcuMF0gLCBjbGF1c2UgNS4zLjIgLS0+CisJCTxhdnAgbmFtZT0iQ2hhcmdpbmctUnVsZS1JbnN0YWxsIiB2ZW5kb3ItaWQ9IjEwNDE1IiBjb2RlPSIxMDAxIgorCQkJbWFuZGF0b3J5PSJtdXN0IiBtYXktZW5jcnlwdD0ieWVzIj4KKwkJCTxncm91cGVkPgorCQkJCTxvcHRpb25hbD4KKwkJCQkJPGF2cHJ1bGUgbmFtZT0iQ2hhcmdpbmctUnVsZS1EZWZpbml0aW9uIiBtYXhpbXVtPSIxIiAvPgorCQkJCQk8YXZwcnVsZSBuYW1lPSJDaGFyZ2luZy1SdWxlLU5hbWUiIG1heGltdW09IjEiIC8+CisJCQkJCTxhdnBydWxlIG5hbWU9IkNoYXJnaW5nLVJ1bGUtQmFzZS1OYW1lIiBtYXhpbXVtPSIxIiAvPgorCQkJCTwvb3B0aW9uYWw+CisJCQkJPHJlcXVpcmVkPgorCQkJCQk8YXZwcnVsZSBuYW1lPSJCZWFyZXItSWRlbnRpZmllciIgbWludW1pbj0iMSIgbWF4aW11bT0iMSIgLz4KKwkJCQk8L3JlcXVpcmVkPgorCQkJCTxvcHRpb25hbD4KKwkJCQkJPGF2cHJ1bGUgbmFtZT0iUnVsZS1BY3RpdmF0aW9uLVRpbWUiIG1heGltdW09IjEiIC8+CisJCQkJCTxhdnBydWxlIG5hbWU9IlJ1bGUtRGVhY3RpdmF0aW9uLVRpbWUiIG1heGltdW09IjEiIC8+CisJCQkJPC9vcHRpb25hbD4KKwkJCTwvZ3JvdXBlZD4KKwkJPC9hdnA+CisKKwkJPCEtLSBbM0dQUCBUUyAyOS4yMTIgVjcuNy4wXSAsIGNsYXVzZSA1LjMuMyAtLT4KKwkJPGF2cCBuYW1lPSJDaGFyZ2luZy1SdWxlLVJlbW92ZSIgdmVuZG9yLWlkPSIxMDQxNSIgY29kZT0iMTAwMiIKKwkJCW1hbmRhdG9yeT0ibXVzdCIgbWF5LWVuY3J5cHQ9InllcyI+CisJCQk8Z3JvdXBlZD4KKwkJCQk8b3B0aW9uYWw+CisJCQkJCTxhdnBydWxlIG5hbWU9IkNoYXJnaW5nLVJ1bGUtTmFtZSIgbWF4aW11bT0iMSIgLz4KKwkJCQkJPGF2cHJ1bGUgbmFtZT0iQ2hhcmdpbmctUnVsZS1CYXNlLU5hbWUiIG1heGltdW09IjEiIC8+CisJCQkJPC9vcHRpb25hbD4KKwkJCTwvZ3JvdXBlZD4KKwkJPC9hdnA+CisKKwkJCisKKworCisJCQorCisJCTwhLS0gWzNHUFAgVFMgMjkuMjEyIFY3LjcuMF0gLCBjbGF1c2UgNS4zLjcgLS0+CisJCTxhdnAgbmFtZT0iRXZlbnQtVHJpZ2dlciIgdmVuZG9yLWlkPSIxMDQxNSIgY29kZT0iMTAwNiIgbWFuZGF0b3J5PSJtdXN0IgorCQkJbWF5LWVuY3J5cHQ9InllcyI+CisJCQk8dHlwZSB0eXBlLW5hbWU9IkVudW1lcmF0ZWQiIC8+CisJCQk8ZW51bSBuYW1lPSJTR1NOX0NIQU5HRSIgY29kZT0iMCIgLz4KKwkJCTxlbnVtIG5hbWU9IlFPU19DSEFOR0UiIGNvZGU9IjEiIC8+CisJCQk8ZW51bSBuYW1lPSJSQVRfQ0hBTkdFIiBjb2RlPSIyIiAvPgorCQkJPGVudW0gbmFtZT0iVEZUX0NIQU5HRSIgY29kZT0iMyIgLz4KKwkJCTxlbnVtIG5hbWU9IlBMTU5fQ0hBTkdFIiBjb2RlPSI0IiAvPgorCQkJPGVudW0gbmFtZT0iTE9TU19PRl9CRUFSRVIiIGNvZGU9IjUiIC8+CisJCQk8ZW51bSBuYW1lPSJSRUNPVkVSWV9PRl9CRUFSRVIiIGNvZGU9IjYiIC8+CisJCQk8ZW51bSBuYW1lPSJJUC1DQU5fQ0hBTkdFIiBjb2RlPSI3IiAvPgorCQkJPGVudW0gbmFtZT0iUENFRl9NQUxGVU5DVElPTiIgY29kZT0iOCIgLz4KKwkJCTxlbnVtIG5hbWU9IlJFU09VUkNFU19MSU1JVEFUSU9OIiBjb2RlPSI5IiAvPgorCQkJPGVudW0gbmFtZT0iTUFYX05SX0JFQVJFUlNfUkVBQ0hFRCIgY29kZT0iMTAiIC8+CisJCQk8ZW51bSBuYW1lPSJRT1NfQ0hBTkdFX0VYQ0VFRElOR19BVVRIT1JJWkFUSU9OIiBjb2RlPSIxMSIgLz4KKwkJCTxlbnVtIG5hbWU9IlJBSV9DSEFOR0UiIGNvZGU9IjEyIiAvPgorCQkJPGVudW0gbmFtZT0iVVNFUl9MT0NBVElPTl9DSEFOR0UiIGNvZGU9IjEzIiAvPgorCQkJPGVudW0gbmFtZT0iTk9fRVZFTlRfVFJJR0dFUlMiIGNvZGU9IjE0IiAvPgorCQkJPGVudW0gbmFtZT0iT1VUX09GX0NSRURJVCIgY29kZT0iMTUiIC8+CisJCQk8ZW51bSBuYW1lPSJSRUFMTE9DQVRJT05fT0ZfQ1JFRElUIiBjb2RlPSIxNiIgLz4KKwkJCTxlbnVtIG5hbWU9IlJFVkFMSURBVElPTl9USU1FT1VUIiBjb2RlPSIxNyIgLz4KKwkJPC9hdnA+CisKKwkKKworCQkKKworCQkKKworCQk8IS0tIFszR1BQIFRTIDI5LjIxMiBWNy43LjBdICwgY2xhdXNlIDUuMy4xMyAtLT4KKwkJPGF2cCBuYW1lPSJURlQtRmlsdGVyIiB2ZW5kb3ItaWQ9IjEwNDE1IiBjb2RlPSIxMDEyIiBtYW5kYXRvcnk9Im11c3QiCisJCQltYXktZW5jcnlwdD0ieWVzIj4KKwkJCTx0eXBlIHR5cGUtbmFtZT0iSVBGaWx0ZXJSdWxlIiAvPgorCQk8L2F2cD4KKworCisJCTwhLS0gWzNHUFAgVFMgMjkuMjEyIFY3LjcuMF0gLCBjbGF1c2UgNS4zLjE0IC0tPgorCQk8YXZwIG5hbWU9IlRGVC1QYWNrZXQtRmlsdGVyLUluZm9ybWF0aW9uIiB2ZW5kb3ItaWQ9IjEwNDE1IiBjb2RlPSIxMDEzIgorCQkJbWFuZGF0b3J5PSJtdXN0IiBtYXktZW5jcnlwdD0ieWVzIj4KKwkJCTxncm91cGVkPgorCQkJCTxyZXF1aXJlZD4KKwkJCQkJPGF2cHJ1bGUgbmFtZT0iUHJlY2VkZW5jZSIgbWluaW11bT0iMSIgbWF4aW11bT0iMSIgLz4KKwkJCQkJPGF2cHJ1bGUgbmFtZT0iVEZULUZpbHRlciIgbWluaW11bT0iMSIgbWF4aW11bT0iMSIgLz4KKwkJCQkJPGF2cHJ1bGUgbmFtZT0iVG9TLVRyYWZmaWMtQ2xhc3MiIG1pbmltdW09IjEiIG1heGltdW09IjEiIC8+CisJCQkJPC9yZXF1aXJlZD4KKwkJCTwvZ3JvdXBlZD4KKwkJPC9hdnA+CisJCQorPCEtLSBbUkZDIDQwMDZdICwgY2xhdXNlIDguMzUgLS0+CisJCTxhdnAgbmFtZT0iRmluYWwtVW5pdC1BY3Rpb24iIGNvZGU9IjQ0OSIgbWFuZGF0b3J5PSJtdXN0IgorCQkJbWF5LWVuY3J5cHQ9InllcyI+CisJCQk8dHlwZSB0eXBlLW5hbWU9IkVudW1lcmF0ZWQiIC8+CisJCQk8ZW51bSBuYW1lPSJURVJNSU5BVEUiIGNvZGU9IjAiIC8+CisJCQk8ZW51bSBuYW1lPSJSRURJUkVDVCIgY29kZT0iMSIgLz4KKwkJCTxlbnVtIG5hbWU9IlJFU1RSSUNUX0FDQ0VTUyIgY29kZT0iMiIgLz4KKwkJPC9hdnA+CisJCQorCQk8IS0tIFtSRkMgNDAwNl0gLCBjbGF1c2UgOC4zNiAtLT4KKwkJPGF2cCBuYW1lPSJSZXN0cmljdGlvbi1GaWx0ZXItUnVsZSIgY29kZT0iNDM4IiBtYW5kYXRvcnk9Im11c3QiCisJCQltYXktZW5jcnlwdD0ieWVzIj4KKwkJCTx0eXBlIHR5cGUtbmFtZT0iSVBGaWx0ZXJSdWxlIiAvPgorCQk8L2F2cD4KKwkJPCEtLSBbUkZDIDQwMDZdICwgY2xhdXNlIDguMzcgLS0+CisJCTxhdnAgbmFtZT0iUmVkaXJlY3QtU2VydmVyIiBjb2RlPSI0MzQiIG1hbmRhdG9yeT0ibXVzdCIKKwkJCW1heS1lbmNyeXB0PSJ5ZXMiPgorCQkJPGdyb3VwZWQ+CisJCQkJPHJlcXVpcmVkPgorCQkJCQk8YXZwcnVsZSBuYW1lPSJSZWRpcmVjdC1BZGRyZXNzLVR5cGUiIG1pbmltdW09IjEiIG1heGltdW09IjEiIC8+CisJCQkJCTxhdnBydWxlIG5hbWU9IlJlZGlyZWN0LVNlcnZlci1BZGRyZXNzIiBtaW5pbXVtPSIxIgorCQkJCQkJbWF4aW11bT0iMSIgLz4KKwkJCQk8L3JlcXVpcmVkPgorCQkJPC9ncm91cGVkPgorCQk8L2F2cD4KKwkJPCEtLSBbUkZDIDQwMDZdICwgY2xhdXNlIDguMzQgLS0+CisJCTxhdnAgbmFtZT0iRmluYWwtVW5pdC1JbmRpY2F0aW9uIiBjb2RlPSI0MzAiIG1hbmRhdG9yeT0ibXVzdCIKKwkJCW1heS1lbmNyeXB0PSJ5ZXMiPgorCQkJPGdyb3VwZWQ+CisJCQkJPHJlcXVpcmVkPgorCQkJCQk8YXZwcnVsZSBuYW1lPSJGaW5hbC1Vbml0LUFjdGlvbiIgbWluaW11bT0iMSIgbWF4aW11bT0iMSIgLz4KKwkJCQkJPGF2cHJ1bGUgbmFtZT0iUmVzdHJpY3Rpb24tRmlsdGVyLVJ1bGUiIG1pbmltdW09IjEiCisJCQkJCQltYXhpbXVtPSIxIiAvPgorCQkJCQk8YXZwcnVsZSBuYW1lPSJGaWx0ZXItSWQiIG1pbmltdW09IjEiIG1heGltdW09IjEiIC8+CisJCQkJCTxhdnBydWxlIG5hbWU9IlJlZGlyZWN0LVNlcnZlciIgbWluaW11bT0iMSIgbWF4aW11bT0iMSIgLz4KKwkJCQk8L3JlcXVpcmVkPgorCQkJPC9ncm91cGVkPgorCQk8L2F2cD4KKwkJCisJCTwhLS0gWzNHUFAgVFMgMjkuMjEyIFY3LjcuMF0gLCBjbGF1c2UgNS4zLjE4IC0tPgorCQk8YXZwIG5hbWU9IkNoYXJnaW5nLVJ1bGUtUmVwb3J0IiB2ZW5kb3ItaWQ9IjEwNDE1IiBjb2RlPSIxMDE4IgorCQkJbWFuZGF0b3J5PSJtdXN0IiBtYXktZW5jcnlwdD0ieWVzIj4KKwkJCTxncm91cGVkPgorCQkJCTxvcHRpb25hbD4KKwkJCQkJPGF2cHJ1bGUgbmFtZT0iQ2hhcmdpbmctUnVsZS1OYW1lIiBtYXhpbXVtPSIxIiAvPgorCQkJCQk8YXZwcnVsZSBuYW1lPSJDaGFyZ2luZy1SdWxlLUJhc2UtTmFtZSIgbWF4aW11bT0iMSIgLz4KKwkJCQk8L29wdGlvbmFsPgorCQkJCTxyZXF1aXJlZD4KKwkJCQkJPGF2cHJ1bGUgbmFtZT0iUENDLVJ1bGUtU3RhdHVzIiBtaW5pbXVtPSIxIiBtYXhpbXVtPSIxIiAvPgorCQkJCTwvcmVxdWlyZWQ+CisJCQkJPG9wdGlvbmFsPgorCQkJCQk8YXZwcnVsZSBuYW1lPSJSdWxlLUZhaWx1cmUtQ29kZSIgbWF4aW11bT0iMSIgLz4KKwkJCQkJPGF2cHJ1bGUgbmFtZT0iRmluYWwtVW5pdC1JbmRpY2F0aW9uIiBtYXhpbXVtPSIxIiAvPgorCQkJCTwvb3B0aW9uYWw+CisJCQk8L2dyb3VwZWQ+CisJCTwvYXZwPgorCisJCisKKwkJPCEtLSBbM0dQUCBUUyAyOS4yMTIgVjcuNy4wXSAsIGNsYXVzZSA1LjMuMjIgLS0+CisJCTxhdnAgbmFtZT0iQWNjZXNzLU5ldHdvcmstQ2hhcmdpbmctSWRlbnRpZmllci1HeCIgdmVuZG9yLWlkPSIxMDQxNSIKKwkJCWNvZGU9IjEwMjIiIG1hbmRhdG9yeT0ibXVzdCIgbWF5LWVuY3J5cHQ9InllcyI+CisJCQk8Z3JvdXBlZD4KKwkJCQk8cmVxdWlyZWQ+CisJCQkJCTxhdnBydWxlIG5hbWU9IkFjY2Vzcy1OZXR3b3JrLUNoYXJnaW5nLUlkZW50aWZpZXItVmFsdWUiCisJCQkJCQltaW5pbXVtPSIxIiBtYXhpbXVtPSIxIiAvPgorCQkJCTwvcmVxdWlyZWQ+CisJCQkJPG9wdGlvbmFsPgorCQkJCQk8YXZwcnVsZSBuYW1lPSJDaGFyZ2luZy1SdWxlLUJhc2UtTmFtZSIgbWF4aW11bT0iMSIgLz4KKwkJCQkJPGF2cHJ1bGUgbmFtZT0iQ2hhcmdpbmctUnVsZS1OYW1lIiBtYXhpbXVtPSIxIiAvPgorCQkJCTwvb3B0aW9uYWw+CisJCQk8L2dyb3VwZWQ+CisJCTwvYXZwPgorCisJCisKKwkJPCEtLSBbM0dQUCBUUyAyOS4yMjkgVjcuNy4wXSAsIGNsYXVzZSA2LjMuMTkgLS0+CisJCTxhdnAgbmFtZT0iQ2hhcmdpbmctSW5mb3JtYXRpb24iIHZlbmRvci1pZD0iMTA0MTUiIGNvZGU9IjYxOCIKKwkJCW1hbmRhdG9yeT0ibXVzdCIgbWF5LWVuY3J5cHQ9InllcyI+CisJCQk8Z3JvdXBlZD4KKwkJCQk8cmVxdWlyZWQ+CisJCQkJCTxhdnBydWxlIG5hbWU9IlByaW1hcnktRXZlbnQtQ2hhcmdpbmctRnVuY3Rpb24tTmFtZSIKKwkJCQkJCW1pbmltdW09IjEiIG1heGltdW09IjEiIC8+CisJCQkJCTxhdnBydWxlIG5hbWU9IlNlY29uZGFyeS1FdmVudC1DaGFyZ2luZy1GdW5jdGlvbi1OYW1lIgorCQkJCQkJbWluaW11bT0iMSIgbWF4aW11bT0iMSIgLz4KKwkJCQkJPGF2cHJ1bGUgbmFtZT0iUHJpbWFyeS1DaGFyZ2luZy1Db2xsZWN0aW9uLUZ1bmN0aW9uLU5hbWUiCisJCQkJCQltaW5pbXVtPSIxIiBtYXhpbXVtPSIxIiAvPgorCQkJCQk8YXZwcnVsZSBuYW1lPSJTZWNvbmRhcnktQ2hhcmdpbmctQ29sbGVjdGlvbi1GdW5jdGlvbi1OYW1lIgorCQkJCQkJbWluaW11bT0iMSIgbWF4aW11bT0iMSIgLz4KKwkJCQk8L3JlcXVpcmVkPgorCQkJPC9ncm91cGVkPgorCQk8L2F2cD4KKworCQkKKwkJCisKKworCQk8IS0tIFJlZiA9IFJGQyA0MDA2IGNoYXAgOC40NiAtLT4KKwkJPGF2cCBuYW1lPSJTdWJzY3JpcHRpb24tSWQiIGNvZGU9IjQ0MyIgbWFuZGF0b3J5PSJtdXN0IgorCQkJbWF5LWVuY3J5cHQ9InllcyI+CisJCQk8Z3JvdXBlZD4KKwkJCQk8cmVxdWlyZWQ+CisJCQkJCTxhdnBydWxlIG5hbWU9IlN1YnNjcmlwdGlvbi1JZC1UeXBlIiAvPgorCQkJCQk8YXZwcnVsZSBuYW1lPSJTdWJzY3JpcHRpb24tSWQtRGF0YSIgLz4KKwkJCQk8L3JlcXVpcmVkPgorCQkJPC9ncm91cGVkPgorCQk8L2F2cD4KKwkKKwkJCisKKworCTwvYXBwbGljYXRpb24+Cis8L2RpY3Rpb25hcnk+CisKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZGljdF9sZWdhY3kvUkVBRE1FIGIvY29udHJpYi9kaWN0X2xlZ2FjeS9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZiMjQxOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvZGljdF9sZWdhY3kvUkVBRE1FCkBAIC0wLDAgKzEsMTQgQEAKK1RoZSBkaWN0aW9uYXJ5LmR0ZCBmaWxlIG9yaWdpbmF0ZXMgZnJvbSBkcmFmdC1mcmFzY29uZS14bWwtZGljdGlvbmFyeS0wMC4KK0EgZmV3IG1vZGlmaWNhdGlvbnMgbWF5IGhhdmUgYmVlbiBwZXJmb3JtZWQgKHNlZSBmaWxlIGhpc3RvcnkgaW4gTWVyY3VyaWFsKQorSG93ZXZlciwgbm8gRFREIHZhbGlkYXRpb24gaXMgcGVyZm9ybWVkIGJ5IHRoZSBwYXJzZXIsIGJ1dCB0aGUgZXh0ZW5zaW9uCitleHBlY3RzIGEga25vd24gZm9ybWF0IHRoZXJlZm9yZSB0aGUgZmxleGliaWxpdHkgaXMgbGltaXRlZC4KKworCitBZGRpdGlvbmFsIFhNTCBkaWN0aW9uYXJ5IGZpbGVzIGNhbiBiZSBmb3VuZDoKKyAgLSBDaXJjdW0gcHJvamVjdCAoY2lyY3VtLnNmLm5ldCkKKyAgCXVuZGVyIHNoYXJlLyoueG1sCisKKyAgLSBPcGVuRGlhbWV0ZXIgcHJvamVjdCAoZGlhbWV0ZXIuc2YubmV0KQorICAJdW5kZXIgbGliZGlhbWV0ZXIvY29uZmlnL2RpY3Rpb25hcnkueG1sICh3aWxsIHByb2JhYmx5IHJlcXVpcmUgc29tZSBzdHJpcHBpbmcpCisgCisKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZGljdF9sZWdhY3kvZGljdGlvbmFyeS5kdGQgYi9jb250cmliL2RpY3RfbGVnYWN5L2RpY3Rpb25hcnkuZHRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyZmNlZDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2RpY3RfbGVnYWN5L2RpY3Rpb25hcnkuZHRkCkBAIC0wLDAgKzEsNjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IUVMRU1FTlQgZGljdGlvbmFyeSAodmVuZG9yKiwgYmFzZSosIGFwcGxpY2F0aW9uKik+CisKKzwhRUxFTUVOVCB2ZW5kb3IgRU1QVFk+Cis8IUFUVExJU1QgdmVuZG9yCisgICAgICAgIGlkIENEQVRBICNSRVFVSVJFRAorICAgICAgICBuYW1lIENEQVRBICNSRVFVSVJFRAorPgorCis8IUVMRU1FTlQgYmFzZSAoY29tbWFuZCosIHR5cGVkZWZuKiwgYXZwKik+Cis8IUFUVExJU1QgYmFzZQorICAgICAgICB1cmkgQ0RBVEEgI0lNUExJRUQKKz4KKworPCFFTEVNRU5UIGFwcGxpY2F0aW9uIChjb21tYW5kKiwgdHlwZWRlZm4qLCBhdnAqKT4KKzwhQVRUTElTVCBhcHBsaWNhdGlvbgorICAgICAgICBpZCBDREFUQSAjUkVRVUlSRUQKKyAgICAgICAgbmFtZSBDREFUQSAjSU1QTElFRAorICAgICAgICB1cmkgQ0RBVEEgI0lNUExJRUQKKz4KKzwhRUxFTUVOVCBjb21tYW5kIChyZXF1ZXN0cnVsZXMqLCBhbnN3ZXJydWxlcyopPgorPCFBVFRMSVNUIGNvbW1hbmQKKyAgICAgICAgbmFtZSBDREFUQSAjUkVRVUlSRUQKKyAgICAgICAgY29kZSBDREFUQSAjUkVRVUlSRUQKKyAgICAgICAgdmVuZG9yLWlkIENEQVRBICNJTVBMSUVECisgICAgICAgIHBiaXQgKDAgfCAxKSAiMSIKKz4KKworPCFFTEVNRU5UIHR5cGVkZWZuIEVNUFRZPgorPCFBVFRMSVNUIHR5cGVkZWZuCisgICAgICAgIHR5cGUtbmFtZSBJRCAjUkVRVUlSRUQKKyAgICAgICAgdHlwZS1wYXJlbnQgSURSRUYgI0lNUExJRUQKKyAgICAgICAgZGVzY3JpcHRpb24gQ0RBVEEgI0lNUExJRUQKKz4KKzwhRUxFTUVOVCBhdnAgKCh0eXBlIHwgZ3JvdXBlZCksIChlbnVtKikpPgorPCFBVFRMSVNUIGF2cAorICAgICAgICBuYW1lIElEICNSRVFVSVJFRAorICAgICAgICBkZXNjcmlwdGlvbiBDREFUQSAjSU1QTElFRAorICAgICAgICBjb2RlIENEQVRBICNSRVFVSVJFRAorICAgICAgICBtYW5kYXRvcnkgQ0RBVEEgI0lNUExJRUQKKyAgICAgICAgdmVuZG9yLWlkIENEQVRBICNJTVBMSUVECis+Cis8IUVMRU1FTlQgdHlwZSBFTVBUWT4KKzwhQVRUTElTVCB0eXBlCisgICAgICAgIHR5cGUtbmFtZSBJRFJFRiAjUkVRVUlSRUQKKz4KKzwhRUxFTUVOVCBncm91cGVkIChmaXhlZCosIHJlcXVpcmVkKiwgb3B0aW9uYWwqKT4KKzwhRUxFTUVOVCBlbnVtIEVNUFRZPgorPCFBVFRMSVNUIGVudW0KKyAgICAgICAgbmFtZSBDREFUQSAjUkVRVUlSRUQKKyAgICAgICAgY29kZSBDREFUQSAjUkVRVUlSRUQKKz4KKworPCFFTEVNRU5UIHJlcXVlc3RydWxlcyAoZml4ZWQqLCByZXF1aXJlZCosIG9wdGlvbmFsKik+Cis8IUVMRU1FTlQgYW5zd2VycnVsZXMgKGZpeGVkKiwgcmVxdWlyZWQqLCBvcHRpb25hbCopPgorCis8IUVMRU1FTlQgZml4ZWQgICAgKGF2cHJ1bGUqKT4KKzwhRUxFTUVOVCByZXF1aXJlZCAoYXZwcnVsZSopPgorPCFFTEVNRU5UIG9wdGlvbmFsIChhdnBydWxlKik+CisKKzwhRUxFTUVOVCBhdnBydWxlIEVNUFRZPgorPCFBVFRMSVNUIGF2cHJ1bGUKKyAgICAgICAgbmFtZSBJRFJFRiAjUkVRVUlSRUQKKyAgICAgICAgcG9zaXRpb24gKGZpcnN0IHwgbGFzdCB8IHVuc3BlY2lmaWVkKSAgInVuc3BlY2lmaWVkIgorICAgICAgICBtYXhpbXVtIENEQVRBICNJTVBMSUVECisgICAgICAgIG1pbmltdW0gQ0RBVEEgI0lNUExJRUQKKz4KKworCmRpZmYgLS1naXQgYS9jb250cmliL25pZ2h0bHlfdGVzdHMvUkVBRE1FIGIvY29udHJpYi9uaWdodGx5X3Rlc3RzL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2Q5N2U5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9uaWdodGx5X3Rlc3RzL1JFQURNRQpAQCAtMCwwICsxLDg2IEBACitUaGlzIGZvbGRlciBjb250YWlucyBpbmZvcm1hdGlvbiBhbmQgc2NyaXB0cyB0byBydW4gYSBuZXcgdGVzdCBjb25maWd1cmF0aW9uIGZvciBuaWdodGx5IGJ1aWxkcyAKK2FuZCByZXBvcnRpbmcgdGhlIHJlc3VsdHMgdG8gZnJlZURpYW1ldGVyIGRhc2hib2FyZCBhdDoKKyAgaHR0cDovL3d3dy5mcmVlZGlhbWV0ZXIubmV0L0NEYXNoL2luZGV4LnBocD9wcm9qZWN0PWZyZWVEaWFtZXRlcgorCitUaGUgaW5mb3JtYXRpb24gZ2F0aGVyZWQgaGVyZSBtb3N0bHkgY29tZXMgZnJvbSB0aGUgZm9sbG93aW5nIHBhZ2VzOgorIGh0dHA6Ly93d3cuaXRrLm9yZy9XaWtpL0NNYWtlX1Rlc3RpbmdfV2l0aF9DVGVzdAorIGh0dHA6Ly93d3cuaXRrLm9yZy9XaWtpL0NNYWtlX1NjcmlwdGluZ19PZl9DVGVzdAorIGh0dHA6Ly93d3cuaXRrLm9yZy9XaWtpL0NUZXN0OkJ1aWxkc2VydmVyCisKKz09PT09PT09PT09PT0KKworSU5TVFJVQ1RJT05TIHRvIHNldHVwIGEgbmV3IGJ1aWxkIHNsYXZlIGZvciB0aGUgZnJlZURpYW1ldGVyIGJ1aWxkc2VydmVyOgorLS0gbm90ZTogdGhlIGJ1aWxkIHNsYXZlIHNob3VsZCBoYXZlIGNtYWtlIHZlcnNpb24gMi44IGF0IGxlYXN0IHNvIHRoYXQgY3Rlc3Qgd2lsbCB1cGRhdGUgdGhlIHNvdXJjZSB0cmVlIHByb3Blcmx5LgorCisxKSBJbnN0YWxsIGFsbCBkZXBlbmRlbmNpZXMgZm9yIGZyZWVEaWFtZXRlciBhcyBmb2xsb3c6IAorICBhKSBEZWJpYW4gLyBVYnVudHU6IFNlZSB0aGUgInByZXJlcXMudWJ1bnR1IiBmaWxlCisJJCBzdWRvIGFwdGl0dWRlIGluc3RhbGwgYHdnZXQgaHR0cDovL3d3dy5mcmVlZGlhbWV0ZXIubmV0L2hnL2ZyZWVEaWFtZXRlci9yYXctZmlsZS90aXAvY29udHJpYi9uaWdodGx5X3Rlc3RzL3ByZXJlcXMudWJ1bnR1IC1PIC0gfCBncmVwIC12IC1lICJeIyJgCisJCisgIGIpIEZyZWVCU0Q6IFNlZSB0aGUgInByZXJlcXMuZnJlZWJzZCIgZmlsZQorICAgICAgLSBpbnN0YWxsIGJhc2Ugc3lzdGVtIGFuZCBwb3J0cworICAgICAgLSBpbnN0YWxsIGZyZWVkaWFtZXRlciBkZXBlbmRlbmNpZXMgYXMgZm9sbG93OgorICAgICAgIyBwa2dfYWRkIC1yIC12IHdnZXQKKyAgICAgICMgcGtnX2FkZCAtciAtdiBgd2dldCBodHRwOi8vd3d3LmZyZWVkaWFtZXRlci5uZXQvaGcvZnJlZURpYW1ldGVyL3Jhdy1maWxlL3RpcC9jb250cmliL25pZ2h0bHlfdGVzdHMvcHJlcmVxcy5mcmVlYnNkIC1PIC0gfCBncmVwIC12IC1lICJeIyJgCisgICAgICAKKyAgYykgT3BlblNVU0U6CisJJCBzdWRvIHp5cHBlciBpbnN0YWxsIGB3Z2V0IGh0dHA6Ly93d3cuZnJlZWRpYW1ldGVyLm5ldC9oZy9mcmVlRGlhbWV0ZXIvcmF3LWZpbGUvdGlwL2NvbnRyaWIvbmlnaHRseV90ZXN0cy9wcmVyZXFzLm9wZW5zdXNlIC1PIC0gfCBncmVwIC12IC1lICJeIyJgCisgIAorICBkKSBGZWRvcmE6CisJJCBzdWRvIHl1bSBpbnN0YWxsIHdnZXQKKwkkIHN1ZG8geXVtIGluc3RhbGwgYHdnZXQgaHR0cDovL3d3dy5mcmVlZGlhbWV0ZXIubmV0L2hnL2ZyZWVEaWFtZXRlci9yYXctZmlsZS90aXAvY29udHJpYi9uaWdodGx5X3Rlc3RzL3ByZXJlcXMuZmVkb3JhIC1PIC0gfCBncmVwIC12IC1lICJeIyJgCisJCisgICAgIFlvdSBtYXkgYWxzbyBoYXZlIGlzc3VlcyB3aXRoIFNFTGludXggbGF0ZXIsIGFuIGVhc3kgd29ya2Fyb3VuZCBpcyB0byBkaXNhYmxlIGl0ICh1bnRpbCBiZXR0ZXIgc29sdXRpb24pCisgICAgICAgICMgc2V0ZW5mb3JjZSBQZXJtaXNzaXZlCisgICAgICAgIAorCisyKSBDcmVhdGUgdGhlICJ0ZXN0IiBkYXRhYmFzZSBmb3IgYXBwX2FjY3QgdGVzdCAod2UgYXNzdW1lIHRoZSB0ZXN0cyBhcmUgcnVuIGFzIHVzZXIgInRlc3QiIGhlcmUpCisgICAgICAtIGNoZWNrIElOU1RBTEwuRnJlZUJTRCBmaWxlIGZvciBzcGVjaWZpYyBQb3N0Z3JlU1FMIHByZS1pbnN0YWxsIGluc3RydWN0aW9ucy4KKyAgICAgIC0gVGhlc2UgYXJlIHRoZSBpbnN0cnVjdGlvbnMgZm9yIERlYmlhbi9VYnVudHUvT3BlblNVU0UsICBhZGp1c3QgYXMgbmVlZGVkOgorCSMgc3UgLSBwb3N0Z3JlcworCSMgY3JlYXRldXNlciAtLWludGVyYWN0aXZlIHRlc3QKKwkgU2hhbGwgdGhlIG5ldyByb2xlIGJlIGEgc3VwZXJ1c2VyPyAoeS9uKSBuCisJIFNoYWxsIHRoZSBuZXcgcm9sZSBiZSBhbGxvd2VkIHRvIGNyZWF0ZSBkYXRhYmFzZXM/ICh5L24pIHkKKwkgU2hhbGwgdGhlIG5ldyByb2xlIGJlIGFsbG93ZWQgdG8gY3JlYXRlIG1vcmUgbmV3IHJvbGVzPyAoeS9uKSBuCisJIyBsb2dvdXQKKwkkIHdob2FtaQorCSB0ZXN0CisJJCBjcmVhdGVkYiB0ZXN0CisJJCBwc3FsIHRlc3QKKwkgcHNxbCAoOC40LjQpCisJIFR5cGUgImhlbHAiIGZvciBoZWxwLgorCisJIHRlc3Q9PiAKKwkgQ1JFQVRFIFRBQkxFIGluY29taW5nX3Rlc3QgKAorCSByZWNvcmRlZF9vbiB0aW1lc3RhbXAgd2l0aCB0aW1lIHpvbmUgTk9UIE5VTEwsCisJICJBY2NvdW50aW5nLVJlY29yZC1UeXBlIiBpbnRlZ2VyLAorCSAiU2Vzc2lvbi1JZCIgYnl0ZWEsCisJICJBY2NvdW50aW5nLVJlY29yZC1OdW1iZXIiIGludGVnZXIsCisJICJSb3V0ZS1SZWNvcmQxIiBieXRlYSwKKwkgIlJvdXRlLVJlY29yZDIiIGJ5dGVhLAorCSAiUm91dGUtUmVjb3JkMyIgYnl0ZWEsCisJICJSb3V0ZS1SZWNvcmQ0IiBieXRlYSApOworCSBccQorCSAKKworMykgQ3JlYXRlIGEgZGlyZWN0b3J5IH4vZkR0ZXN0cworCSQgY2QKKwkkIG1rZGlyIGZEdGVzdHMKKwkkIGNkIGZEdGVzdHMKKworNCkgUmV0cmlldmUgdGhlIHJ1bnRlc3RzLnNoIHNjcmlwdCBhbmQgc2F2ZSBpbiB0aGlzIGRpcmVjdG9yeQorCSQgd2dldCBodHRwOi8vd3d3LmZyZWVkaWFtZXRlci5uZXQvaGcvZnJlZURpYW1ldGVyL3Jhdy1maWxlL3RpcC9jb250cmliL25pZ2h0bHlfdGVzdHMvcnVudGVzdHMuc2gKKwkkIGNobW9kICt4IHJ1bnRlc3RzLnNoCisKKzUpIENyZWF0ZSBhIGZpbGUgbG9jYWwuY21ha2UgZGVmaW5pbmcgdGhlIG5hbWUgb2YgdGhlIGJ1aWxkIHNsYXZlIGluIHRoaXMgZGlyZWN0b3J5IGFsc28uCisJJCBlY2hvICJTRVQoQ1RFU1RfU0lURSBcIiJgaG9zdG5hbWVgIlwiKSIgPiBsb2NhbC5jbWFrZQorCQorICAgRm9yIEZyZWVCU0QsIGluIGFkZGl0aW9uIGRvOgorICAgCSQgZWNobyAic2V0KENURVNUX0JVSUxEX09QVElPTlMgXCJcJHtDVEVTVF9CVUlMRF9PUFRJT05TfSAtREZMRVhfRVhFQ1VUQUJMRTpGSUxFUEFUSD0vdXNyL2xvY2FsL2Jpbi9mbGV4XCIpIiA+PiBsb2NhbC5jbWFrZQorCQorNikgUnVuIHRoZSBydW50ZXN0cy5zaCBzY3JpcHQgb25jZSB0byBjaGVjayBpdCB3b3JrcyBwcm9wZXJseSAoZnJlZUJTRCBtaWdodCByZXF1aXJlOiBsbiAtcyAvdXNyL2xvY2FsL2Jpbi9iYXNoIC9iaW4vYmFzaCkKKworNykgU2V0IHVwIGEgY3JvbnRhYiB0byBydW4gdGhlIHNjcmlwdAorCSQgd2dldCBodHRwOi8vd3d3LmZyZWVkaWFtZXRlci5uZXQvaGcvZnJlZURpYW1ldGVyL3Jhdy1maWxlL3RpcC9jb250cmliL25pZ2h0bHlfdGVzdHMvY3JvbmpvYi5zaAorCSQgY2htb2QgK3ggY3JvbmpvYi5zaAorCSQgY3JvbnRhYiAtbAorMCAwICogKiAqIC9ob21lL3Rlc3QvZkR0ZXN0cy9jcm9uam9iLnNoID4gL2hvbWUvdGVzdC9mRHRlc3RzL2Nyb25qb2IubG9nIDI+JjEKZGlmZiAtLWdpdCBhL2NvbnRyaWIvbmlnaHRseV90ZXN0cy9hbGxkZWZhdWx0LmNvbmYgYi9jb250cmliL25pZ2h0bHlfdGVzdHMvYWxsZGVmYXVsdC5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNzY5MTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL25pZ2h0bHlfdGVzdHMvYWxsZGVmYXVsdC5jb25mCkBAIC0wLDAgKzEsMiBAQAorCitzZXQoQ1RFU1RfQlVJTERfTkFNRSAiRGVmYXVsdCIpCmRpZmYgLS1naXQgYS9jb250cmliL25pZ2h0bHlfdGVzdHMvYWxsZXh0LmNvbmYgYi9jb250cmliL25pZ2h0bHlfdGVzdHMvYWxsZXh0LmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE5NGEwOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvbmlnaHRseV90ZXN0cy9hbGxleHQuY29uZgpAQCAtMCwwICsxLDkgQEAKKworIyBUaGlzIGNvbmZpZ3VyYXRpb24gY29tcGlsZXMgYWxsIHRoZSBleHRlbnNpb25zLiBJdCBhbHNvIHBlcmZvcm1zIGEgY292ZXJhZ2UgdGVzdC4KKyMgRm9yIHRoaXMgdG8gcGFzcywgeW91IG5lZWQgdG8gc2V0dXAgdGhlIHBnIGRhdGFiYXNlIGZvciBhcHBfYWNjdCB0ZXN0LgorCitzZXQoQ1RFU1RfQlVJTERfTkFNRSAiQWxsIGV4dGVuc2lvbnMgKGRlZmF1bHQpIikKKworc2V0KENURVNUX0JVSUxEX09QVElPTlMgIiR7Q1RFU1RfQlVJTERfT1BUSU9OU30gLURBTExfRVhURU5TSU9OUzpCT09MPU9OIikKK3NldChDVEVTVF9CVUlMRF9PUFRJT05TICIke0NURVNUX0JVSUxEX09QVElPTlN9IC1EVEVTVF9BUFBfQUNDVDpCT09MPU9OIC1EVEVTVF9BUFBfQUNDVF9DT05OSU5GTzpTVFJJTkc9dXNlcj10ZXN0XFwgZGJuYW1lPXRlc3QiKQorCmRpZmYgLS1naXQgYS9jb250cmliL25pZ2h0bHlfdGVzdHMvYWxsZXh0ZGJnLmNvbmYgYi9jb250cmliL25pZ2h0bHlfdGVzdHMvYWxsZXh0ZGJnLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBlOWRmNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvbmlnaHRseV90ZXN0cy9hbGxleHRkYmcuY29uZgpAQCAtMCwwICsxLDExIEBACisKKyMgVGhpcyBjb25maWd1cmF0aW9uIGNvbXBpbGVzIGFsbCB0aGUgZXh0ZW5zaW9ucy4gSXQgYWxzbyBwZXJmb3JtcyBhIGNvdmVyYWdlIHRlc3QuCisjIEZvciB0aGlzIHRvIHBhc3MsIHlvdSBuZWVkIHRvIHNldHVwIHRoZSBwZyBkYXRhYmFzZSBmb3IgYXBwX2FjY3QgdGVzdC4KKworc2V0KFdJVEhfQ09WRVJBR0UgVFJVRSkKK3NldChDVEVTVF9CVUlMRF9OQU1FICJBbGwgZXh0ZW5zaW9ucyAoRGVidWcpIikKKworc2V0KENURVNUX0JVSUxEX09QVElPTlMgIiR7Q1RFU1RfQlVJTERfT1BUSU9OU30gLURBTExfRVhURU5TSU9OUzpCT09MPU9OIikKK3NldChDVEVTVF9CVUlMRF9PUFRJT05TICIke0NURVNUX0JVSUxEX09QVElPTlN9IC1EQ01BS0VfQlVJTERfVFlQRTpTVFJJTkc9RGVidWciKQorc2V0KENURVNUX0JVSUxEX09QVElPTlMgIiR7Q1RFU1RfQlVJTERfT1BUSU9OU30gLURURVNUX0FQUF9BQ0NUOkJPT0w9T04gLURURVNUX0FQUF9BQ0NUX0NPTk5JTkZPOlNUUklORz11c2VyPXRlc3RcXCBkYm5hbWU9dGVzdCIpCisKZGlmZiAtLWdpdCBhL2NvbnRyaWIvbmlnaHRseV90ZXN0cy9hbGxleHRkZWIuY29uZiBiL2NvbnRyaWIvbmlnaHRseV90ZXN0cy9hbGxleHRkZWIuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzZiYWFmCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9uaWdodGx5X3Rlc3RzL2FsbGV4dGRlYi5jb25mCkBAIC0wLDAgKzEsMTAgQEAKKworIyBUaGlzIGNvbmZpZ3VyYXRpb24gY29tcGlsZXMgYWxsIHRoZSBleHRlbnNpb25zLiBJdCBhbHNvIHBlcmZvcm1zIGEgY292ZXJhZ2UgdGVzdC4KKyMgRm9yIHRoaXMgdG8gcGFzcywgeW91IG5lZWQgdG8gc2V0dXAgdGhlIHBnIGRhdGFiYXNlIGZvciBhcHBfYWNjdCB0ZXN0LgorCitzZXQoQ1RFU1RfQlVJTERfTkFNRSAiQWxsIGV4dGVuc2lvbnMgKERlYmlhblBhY2thZ2UpIikKKworc2V0KENURVNUX0JVSUxEX09QVElPTlMgIiR7Q1RFU1RfQlVJTERfT1BUSU9OU30gLURBTExfRVhURU5TSU9OUzpCT09MPU9OIikKK3NldChDVEVTVF9CVUlMRF9PUFRJT05TICIke0NURVNUX0JVSUxEX09QVElPTlN9IC1EQ01BS0VfQlVJTERfVFlQRTpTVFJJTkc9RGViaWFuUGFja2FnZSIpCitzZXQoQ1RFU1RfQlVJTERfT1BUSU9OUyAiJHtDVEVTVF9CVUlMRF9PUFRJT05TfSAtRFRFU1RfQVBQX0FDQ1Q6Qk9PTD1PTiAtRFRFU1RfQVBQX0FDQ1RfQ09OTklORk86U1RSSU5HPXVzZXI9dGVzdFxcIGRibmFtZT10ZXN0IikKKwpkaWZmIC0tZ2l0IGEvY29udHJpYi9uaWdodGx5X3Rlc3RzL2FsbGV4dG1heC5jb25mIGIvY29udHJpYi9uaWdodGx5X3Rlc3RzL2FsbGV4dG1heC5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NzQ2OGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL25pZ2h0bHlfdGVzdHMvYWxsZXh0bWF4LmNvbmYKQEAgLTAsMCArMSwxMCBAQAorCisjIFRoaXMgY29uZmlndXJhdGlvbiBjb21waWxlcyBhbGwgdGhlIGV4dGVuc2lvbnMuIEl0IGFsc28gcGVyZm9ybXMgYSBjb3ZlcmFnZSB0ZXN0LgorIyBGb3IgdGhpcyB0byBwYXNzLCB5b3UgbmVlZCB0byBzZXR1cCB0aGUgcGcgZGF0YWJhc2UgZm9yIGFwcF9hY2N0IHRlc3QuCisKK3NldChDVEVTVF9CVUlMRF9OQU1FICJBbGwgZXh0ZW5zaW9ucyAoTWF4UGVyZm9ybWFuY2UpIikKKworc2V0KENURVNUX0JVSUxEX09QVElPTlMgIiR7Q1RFU1RfQlVJTERfT1BUSU9OU30gLURBTExfRVhURU5TSU9OUzpCT09MPU9OIikKK3NldChDVEVTVF9CVUlMRF9PUFRJT05TICIke0NURVNUX0JVSUxEX09QVElPTlN9IC1EQ01BS0VfQlVJTERfVFlQRTpTVFJJTkc9TWF4UGVyZm9ybWFuY2UiKQorc2V0KENURVNUX0JVSUxEX09QVElPTlMgIiR7Q1RFU1RfQlVJTERfT1BUSU9OU30gLURURVNUX0FQUF9BQ0NUOkJPT0w9T04gLURURVNUX0FQUF9BQ0NUX0NPTk5JTkZPOlNUUklORz11c2VyPXRlc3RcXCBkYm5hbWU9dGVzdCIpCisKZGlmZiAtLWdpdCBhL2NvbnRyaWIvbmlnaHRseV90ZXN0cy9hbGxleHRwcm9mLmNvbmYgYi9jb250cmliL25pZ2h0bHlfdGVzdHMvYWxsZXh0cHJvZi5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNmQ2NmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL25pZ2h0bHlfdGVzdHMvYWxsZXh0cHJvZi5jb25mCkBAIC0wLDAgKzEsMTEgQEAKKworIyBUaGlzIGNvbmZpZ3VyYXRpb24gY29tcGlsZXMgYWxsIHRoZSBleHRlbnNpb25zLiBJdCBhbHNvIHBlcmZvcm1zIGEgY292ZXJhZ2UgdGVzdC4KKyMgRm9yIHRoaXMgdG8gcGFzcywgeW91IG5lZWQgdG8gc2V0dXAgdGhlIHBnIGRhdGFiYXNlIGZvciBhcHBfYWNjdCB0ZXN0LgorCitzZXQoV0lUSF9DT1ZFUkFHRSBUUlVFKQorc2V0KENURVNUX0JVSUxEX05BTUUgIkFsbCBleHRlbnNpb25zIChQcm9maWxpbmcpIikKKworc2V0KENURVNUX0JVSUxEX09QVElPTlMgIiR7Q1RFU1RfQlVJTERfT1BUSU9OU30gLURBTExfRVhURU5TSU9OUzpCT09MPU9OIikKK3NldChDVEVTVF9CVUlMRF9PUFRJT05TICIke0NURVNUX0JVSUxEX09QVElPTlN9IC1EQ01BS0VfQlVJTERfVFlQRTpTVFJJTkc9UHJvZmlsaW5nIikKK3NldChDVEVTVF9CVUlMRF9PUFRJT05TICIke0NURVNUX0JVSUxEX09QVElPTlN9IC1EVEVTVF9BUFBfQUNDVDpCT09MPU9OIC1EVEVTVF9BUFBfQUNDVF9DT05OSU5GTzpTVFJJTkc9dXNlcj10ZXN0XFwgZGJuYW1lPXRlc3QiKQorCmRpZmYgLS1naXQgYS9jb250cmliL25pZ2h0bHlfdGVzdHMvYWxsZXh0cmVsLmNvbmYgYi9jb250cmliL25pZ2h0bHlfdGVzdHMvYWxsZXh0cmVsLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA0NTdjYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvbmlnaHRseV90ZXN0cy9hbGxleHRyZWwuY29uZgpAQCAtMCwwICsxLDEwIEBACisKKyMgVGhpcyBjb25maWd1cmF0aW9uIGNvbXBpbGVzIGFsbCB0aGUgZXh0ZW5zaW9ucy4gSXQgYWxzbyBwZXJmb3JtcyBhIGNvdmVyYWdlIHRlc3QuCisjIEZvciB0aGlzIHRvIHBhc3MsIHlvdSBuZWVkIHRvIHNldHVwIHRoZSBwZyBkYXRhYmFzZSBmb3IgYXBwX2FjY3QgdGVzdC4KKworc2V0KENURVNUX0JVSUxEX05BTUUgIkFsbCBleHRlbnNpb25zIChSZWxlYXNlKSIpCisKK3NldChDVEVTVF9CVUlMRF9PUFRJT05TICIke0NURVNUX0JVSUxEX09QVElPTlN9IC1EQUxMX0VYVEVOU0lPTlM6Qk9PTD1PTiIpCitzZXQoQ1RFU1RfQlVJTERfT1BUSU9OUyAiJHtDVEVTVF9CVUlMRF9PUFRJT05TfSAtRENNQUtFX0JVSUxEX1RZUEU6U1RSSU5HPVJlbGVhc2UiKQorc2V0KENURVNUX0JVSUxEX09QVElPTlMgIiR7Q1RFU1RfQlVJTERfT1BUSU9OU30gLURURVNUX0FQUF9BQ0NUOkJPT0w9T04gLURURVNUX0FQUF9BQ0NUX0NPTk5JTkZPOlNUUklORz11c2VyPXRlc3RcXCBkYm5hbWU9dGVzdCIpCisKZGlmZiAtLWdpdCBhL2NvbnRyaWIvbmlnaHRseV90ZXN0cy9hbGxleHR2YWwuY29uZiBiL2NvbnRyaWIvbmlnaHRseV90ZXN0cy9hbGxleHR2YWwuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGUzMmFhCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9uaWdodGx5X3Rlc3RzL2FsbGV4dHZhbC5jb25mCkBAIC0wLDAgKzEsMTEgQEAKKworIyBUaGlzIGNvbmZpZ3VyYXRpb24gY29tcGlsZXMgYWxsIHRoZSBleHRlbnNpb25zLiBJdCBhbHNvIHBlcmZvcm1zIGEgY292ZXJhZ2UgdGVzdC4KKyMgRm9yIHRoaXMgdG8gcGFzcywgeW91IG5lZWQgdG8gc2V0dXAgdGhlIHBnIGRhdGFiYXNlIGZvciBhcHBfYWNjdCB0ZXN0LgorCitzZXQoV0lUSF9DT1ZFUkFHRSBUUlVFKQorc2V0KENURVNUX0JVSUxEX05BTUUgIkFsbCBleHRlbnNpb25zIChEZWJ1Z1ZhbGdyaW5kKSIpCisKK3NldChDVEVTVF9CVUlMRF9PUFRJT05TICIke0NURVNUX0JVSUxEX09QVElPTlN9IC1EQUxMX0VYVEVOU0lPTlM6Qk9PTD1PTiIpCitzZXQoQ1RFU1RfQlVJTERfT1BUSU9OUyAiJHtDVEVTVF9CVUlMRF9PUFRJT05TfSAtRENNQUtFX0JVSUxEX1RZUEU6U1RSSU5HPURlYnVnVmFsZ3JpbmQiKQorc2V0KENURVNUX0JVSUxEX09QVElPTlMgIiR7Q1RFU1RfQlVJTERfT1BUSU9OU30gLURURVNUX0FQUF9BQ0NUOkJPT0w9T04gLURURVNUX0FQUF9BQ0NUX0NPTk5JTkZPOlNUUklORz11c2VyPXRlc3RcXCBkYm5hbWU9dGVzdCIpCisKZGlmZiAtLWdpdCBhL2NvbnRyaWIvbmlnaHRseV90ZXN0cy9jcm9uam9iLnNoIGIvY29udHJpYi9uaWdodGx5X3Rlc3RzL2Nyb25qb2Iuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUxODA5ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvbmlnaHRseV90ZXN0cy9jcm9uam9iLnNoCkBAIC0wLDAgKzEsOSBAQAorIyEvYmluL2Jhc2ggCisKKyMgVGhpcyBzY3JpcHQgd2lsbCBzaW1wbHkgcmV0cmlldmUgdGhlIGxhdGVzdCAicnVudGVzdCIgc2NyaXB0IGFuZCBydW4gaXQuCitwdXNoZCB+L2ZEdGVzdHMKK212IC1mIHJ1bnRlc3RzLnNoIHJ1bnRlc3RzLnNoLnByZXYKK3dnZXQgImh0dHA6Ly93d3cuZnJlZWRpYW1ldGVyLm5ldC9oZy9mcmVlRGlhbWV0ZXIvcmF3LWZpbGUvdGlwL2NvbnRyaWIvbmlnaHRseV90ZXN0cy9ydW50ZXN0cy5zaCIKK2NobW9kICt4IHJ1bnRlc3RzLnNoCitwb3BkCit+L2ZEdGVzdHMvcnVudGVzdHMuc2gKZGlmZiAtLWdpdCBhL2NvbnRyaWIvbmlnaHRseV90ZXN0cy9pZG5haWdub3JlLmNvbmYgYi9jb250cmliL25pZ2h0bHlfdGVzdHMvaWRuYWlnbm9yZS5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMzQ0YWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL25pZ2h0bHlfdGVzdHMvaWRuYWlnbm9yZS5jb25mCkBAIC0wLDAgKzEsNCBAQAorCitzZXQoQ1RFU1RfQlVJTERfT1BUSU9OUyAiJHtDVEVTVF9CVUlMRF9PUFRJT05TfSAtRERJQU1JRF9JRE5BX0lHTk9SRTpCT09MPU9OIikKKworc2V0KENURVNUX0JVSUxEX05BTUUgIklETkEgSWdub3JlIikKZGlmZiAtLWdpdCBhL2NvbnRyaWIvbmlnaHRseV90ZXN0cy9pZG5hcmVqZWN0LmNvbmYgYi9jb250cmliL25pZ2h0bHlfdGVzdHMvaWRuYXJlamVjdC5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiY2JlNjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL25pZ2h0bHlfdGVzdHMvaWRuYXJlamVjdC5jb25mCkBAIC0wLDAgKzEsNCBAQAorCitzZXQoQ1RFU1RfQlVJTERfT1BUSU9OUyAiJHtDVEVTVF9CVUlMRF9PUFRJT05TfSAtRERJQU1JRF9JRE5BX1JFSkVDVDpCT09MPU9OIikKKworc2V0KENURVNUX0JVSUxEX05BTUUgIklETkEgUmVqZWN0IikKZGlmZiAtLWdpdCBhL2NvbnRyaWIvbmlnaHRseV90ZXN0cy9ub3NjdHAuY29uZiBiL2NvbnRyaWIvbmlnaHRseV90ZXN0cy9ub3NjdHAuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzdhYTNlCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9uaWdodGx5X3Rlc3RzL25vc2N0cC5jb25mCkBAIC0wLDAgKzEsNSBAQAorCisjIFJlbW92ZSBTQ1RQIHN1cHBvcnQgYXQgY29tcGlsYXRpb24KK3NldChDVEVTVF9CVUlMRF9PUFRJT05TICIke0NURVNUX0JVSUxEX09QVElPTlN9IC1ERElTQUJMRV9TQ1RQOkJPT0w9T04iKQorCitzZXQoQ1RFU1RfQlVJTERfTkFNRSAiTm8gU0NUUCIpCmRpZmYgLS1naXQgYS9jb250cmliL25pZ2h0bHlfdGVzdHMvcHJlcmVxcy5mZWRvcmEgYi9jb250cmliL25pZ2h0bHlfdGVzdHMvcHJlcmVxcy5mZWRvcmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJlNDMwNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvbmlnaHRseV90ZXN0cy9wcmVyZXFzLmZlZG9yYQpAQCAtMCwwICsxLDE1IEBACisjIEZlZG9yYSBwYWNrYWdlcyBuYW1lcyBvZiBkZXBlbmRlbmNpZXMgZm9yIG5pZ2h0bHkgdGVzdHMgKHVzaW5nICJ5dW0gaW5zdGFsbCA8cGFja2FnZXM+Iik6CitjbWFrZSBtYWtlIGdjYyBnY2MtYysrIGZsZXggYmlzb24gZ251dGxzLWRldmVsIGxpYmdjcnlwdC1kZXZlbCBtZXJjdXJpYWwKK2xrc2N0cC10b29scy1kZXZlbCBrZXJuZWwtbW9kdWxlcy1leHRyYQorcG9zdGdyZXNxbC1zZXJ2ZXIgcG9zdGdyZXNxbC1kZXZlbAorbXlzcWwtc2VydmVyIG15c3FsLWRldmVsCitsaWJ4bWwyIGxpYnhtbDItZGV2ZWwgbGliaWRuLWRldmVsCitzd2lnIHB5dGhvbi1kZXZlbAorCisjIEZvciBwb3N0Z3Jlc3FsIHNlcnZlciB0byBzdGFydCBhdXRvbWF0aWNhbGx5LCB5b3UgbWF5IGhhdmUgdG8gaXNzdWU6CisjICAgc2VydmljZSBwb3N0Z3Jlc3FsIGluaXRkYgorIyAgIGNoa2NvbmZpZyAtLWxldmVsIDM0NSBwb3N0Z3Jlc3FsIG9uCisKKyMgVG8gYWxsb3cgU0NUUCBzb2NrZXRzIHRvIGJlIGJvdW5kIGluIFNFTGludXgsIEkgZG9uJ3Qga25vdyB0aGUgY29tbWFuZCwKKyMgc28gbGV0J3MgZGlzYWJsZSBTRUxpbnV4IGZvciB0aGUgbW9tZW50OgorIyAgIHNldGVuZm9yY2UgUGVybWlzc2l2ZQpkaWZmIC0tZ2l0IGEvY29udHJpYi9uaWdodGx5X3Rlc3RzL3ByZXJlcXMuZnJlZWJzZCBiL2NvbnRyaWIvbmlnaHRseV90ZXN0cy9wcmVyZXFzLmZyZWVic2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZhMjM5ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvbmlnaHRseV90ZXN0cy9wcmVyZXFzLmZyZWVic2QKQEAgLTAsMCArMSw1IEBACisjIDE6IGluc3RhbGwgYmFzZSBzeXN0ZW0gYW5kIHBvcnRzCisjIDI6IGluc3RhbGwgd2dldCB3aXRoIGNvbW1hbmQ6IHBrZ19hZGQgLXIgLXYgd2dldAorIyBGaW5hbGx5LCBpbnN0YWxsIHRoZSBvdGhlciBwYWNrYWdlcyBmcm9tIHRoaXMgZmlsZQorIyBwa2dfYWRkIC1yIC1GIC12IGB3Z2V0IGh0dHA6Ly93d3cuZnJlZWRpYW1ldGVyLm5ldC9oZy9mcmVlRGlhbWV0ZXIvcmF3LWZpbGUvdGlwL2NvbnRyaWIvbmlnaHRseV90ZXN0cy9wcmVyZXFzLmZyZWVic2QgLU8gLSB8IGdyZXAgLXYgLWUgIl4jImAKK2Jhc2ggY21ha2UgbWVyY3VyaWFsIGZsZXggYmlzb24gbGliZ2NyeXB0IGdudXRscyBwb3N0Z3Jlc3FsODQtY2xpZW50IHBvc3RncmVzcWw4NC1zZXJ2ZXIgbXlzcWw1MC1jbGllbnQgbGlieG1sMiBzd2lnCmRpZmYgLS1naXQgYS9jb250cmliL25pZ2h0bHlfdGVzdHMvcHJlcmVxcy5vcGVuc3VzZSBiL2NvbnRyaWIvbmlnaHRseV90ZXN0cy9wcmVyZXFzLm9wZW5zdXNlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlY2UyZGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL25pZ2h0bHlfdGVzdHMvcHJlcmVxcy5vcGVuc3VzZQpAQCAtMCwwICsxLDkgQEAKKyMgT3BlblNVU0UgcGFja2FnZXMgbmFtZXMgb2YgZGVwZW5kZW5jaWVzIGZvciBuaWdodGx5IHRlc3RzICh1c2luZyAienlwcGVyIGluc3RhbGwgPHBhY2thZ2VzPiIpOgorIyB6eXBwZXIgaW5zdGFsbCBgd2dldCBodHRwOi8vd3d3LmZyZWVkaWFtZXRlci5uZXQvaGcvZnJlZURpYW1ldGVyL3Jhdy1maWxlL3RpcC9jb250cmliL25pZ2h0bHlfdGVzdHMvcHJlcmVxcy5vcGVuc3VzZSAtTyAtIHwgZ3JlcCAtdiAtZSAiXiMiYAorY21ha2UgbWVyY3VyaWFsIG1ha2UgZ2NjIGdjYy1jKysgZmxleCBiaXNvbiBsa3NjdHAtdG9vbHMtZGV2ZWwgbGliZ251dGxzLWRldmVsIGxpYmdjcnlwdC1kZXZlbAorcG9zdGdyZXNxbC1zZXJ2ZXIgcG9zdGdyZXNxbC1kZXZlbCBsaWJteXNxbGNsaWVudC1kZXZlbCBsaWJ4bWwyLWRldmVsIHN3aWcgcHl0aG9uLWRldmVsCisKKyMgQWZ0ZXJ3YXJkcywgeW91IG1heSBuZWVkIHRvIGlzc3VlIHRoZSBmb2xsb3dpbmcgY29tbWFuZCBzbyB0aGF0IHBvc3RncmVzcWwgc3RhcnRzIGF0IGJvb3Q6IAorIyAgaW5zc2VydiBwb3N0Z3Jlc3FsCisjIG9yIGZvciBvcGVuIFN1c2UgMTIueDoKKyMgIHN5c3RlbWN0bCBlbmFibGUgcG9zdGdyZXNxbC5zZXJ2aWNlCmRpZmYgLS1naXQgYS9jb250cmliL25pZ2h0bHlfdGVzdHMvcHJlcmVxcy51YnVudHUgYi9jb250cmliL25pZ2h0bHlfdGVzdHMvcHJlcmVxcy51YnVudHUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJlYTkwNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvbmlnaHRseV90ZXN0cy9wcmVyZXFzLnVidW50dQpAQCAtMCwwICsxLDMgQEAKKyMgUGFja2FnZXMgKFVidW50dSBuYW1lcykKK2NtYWtlIG1lcmN1cmlhbCBtYWtlIGdjYyBnKysgZmxleCBiaXNvbiBiaW51dGlscyBsaWJzY3RwLWRldiBsaWJnbnV0bHMtZGV2IHZhbGdyaW5kIHdnZXQgbGlicHEtZGV2IHBvc3RncmVzcWwgbGlibXlzcWxjbGllbnQtZGV2IGxpYnhtbDItZGV2IGxpYnhtbDIgc3dpZyBweXRob24tZGV2IAorCmRpZmYgLS1naXQgYS9jb250cmliL25pZ2h0bHlfdGVzdHMvcnVudGVzdHMuc2ggYi9jb250cmliL25pZ2h0bHlfdGVzdHMvcnVudGVzdHMuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMzOWI5YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvbmlnaHRseV90ZXN0cy9ydW50ZXN0cy5zaApAQCAtMCwwICsxLDEzMyBAQAorIyEvYmluL2Jhc2ggLXgKKworIyBUaGlzIHNjcmlwdCB3aWxsIHJldHJpZXZlIHRoZSBsaXN0IG9mIHRlc3RzIHRvIHJ1biBmcm9tIHRoZSBmcmVlZGlhbWV0ZXIgd2Vic2l0ZSwKKyMgYW5kIGV4ZWN1dGUgdGhlbSBvbmUgYnkgb25lLgorCitST09URElSPSRIT01FL2ZEdGVzdHMKK2lmIFsgISAtZCAkUk9PVERJUiBdOyB0aGVuCisgICBlY2hvICJUaGUgd29ya2luZyBkaXJlY3RvcnkgJFJPT1RESVIgZG9lcyBub3QgZXhpc3QuIFBsZWFzZSBjcmVhdGUgaXQgb3IgZWRpdCB0aGUgc2NyaXB0LiIKKyAgIGV4aXQgMTsKK2ZpCisKK1dPUktESVI9JFJPT1RESVIvZGF0YQorCisjIFRoZSBzY3JpcHQgcmVxdWlyZXMgYSBsb2NhbC5jbWFrZSBmaWxlIHRvIGV4aXN0IGFuZCBkZWZpbmUgdGhlIGZvbGxvd2luZzoKKyMgQ1RFU1RfU0lURT0KKyMgICAgIHRoZSBuYW1lIG9mIHRoZSBidWlsZCBzbGF2ZS4KKyMgRXhhbXBsZTogU0VUKENURVNUX1NJVEUgIlVidW50dS1MdWNpZC02NGIiKQoraWYgWyAhIC1lICRST09URElSL2xvY2FsLmNtYWtlIF07IHRoZW4KKyAgIGVjaG8gIk1pc3NpbmcgJFJPT1RESVIvbG9jYWwuY21ha2UgZmlsZSwgZ2VuZXJhdGluZyBvbmUgKGVkaXQgYXMgbmVlZGVkLCBhbmQgcnVuIHRoZSBzY3JpcHQgYWdhaW4pIjsKKyAgIGVjaG8gIlNFVChDVEVTVF9TSVRFIFwiImBob3N0bmFtZSAtLWZxZG5gIlwiKSIgPiAkUk9PVERJUi9sb2NhbC5jbWFrZQorICAgZXhpdCAxOworZmkKKworIyBOb3csIGNsZWFudXAgYW55IHByZXZpb3VzIGJ1aWx0IGRhdGEsIGJ1dCBrZWVwIHRoZSBzb3VyY2VzICh0byBnZXQgdGhlIGRpZmZzKQoraWYgWyAhIC1kICRXT1JLRElSIF07IHRoZW4gCisgICBta2RpciAkV09SS0RJUgorZWxzZQorICAgcm0gLXJmICRXT1JLRElSLyovYnVpbGQKK2ZpCisKK2VjaG8gIlN0YXJ0aW5nIE5pZ2h0bHkgdGVzdHMsIHRpbWU6ICJgZGF0ZWAKKworIyBSZXRyaWV2ZSB0aGUgZGVmYXVsdCBwYXJhbWV0ZXJzLgord2dldCAiaHR0cDovL3d3dy5mcmVlZGlhbWV0ZXIubmV0L2hnL2ZyZWVEaWFtZXRlci9yYXctZmlsZS90aXAvQ1Rlc3RDb25maWcuY21ha2UiIC1PICRXT1JLRElSLzFfZGVmYXVsdC5jbWFrZQoraWYgWyAhIC1lICRXT1JLRElSLzFfZGVmYXVsdC5jbWFrZSBdOyB0aGVuCisgICBlY2hvICJFcnJvciByZXRyaWV2aW5nIENUZXN0Q29uZmlnLmNtYWtlIGZpbGUiOworICAgZXhpdCAxOworZmkKKworIyBSZXRyaWV2ZSB0aGUgbGlzdCBvZiBidWlsZCBuYW1lcword2dldCAiaHR0cDovL3d3dy5mcmVlZGlhbWV0ZXIubmV0L2hnL2ZyZWVEaWFtZXRlci9yYXctZmlsZS90aXAvY29udHJpYi9uaWdodGx5X3Rlc3RzL3Rlc3RzLmxpc3QiIC1PICRXT1JLRElSLzJfdGVzdHMubGlzdAoraWYgWyAhIC1lICRXT1JLRElSLzJfdGVzdHMubGlzdCBdOyB0aGVuCisgICBlY2hvICJFcnJvciByZXRyaWV2aW5nIHRlc3RzLmxpc3QgZmlsZSI7CisgICBleGl0IDE7CitmaQorCisjIE5vdywgZm9yIGVhY2ggdGVzdCBpbiB0aGUgbGlzdAorZm9yIHQgaW4gJChjYXQgJFdPUktESVIvMl90ZXN0cy5saXN0IHwgZ3JlcCAtdiAtZSAiXiMiKTsgZG8KKyAgICMgQ3JlYXRlIHRoZSB3b3JrIGVudmlyb25tZW50IGlmIG5lZWRlZAorICAgaWYgWyAhIC1kICRXT1JLRElSLyR0IF07IHRoZW4gCisgICAgICAgbWtkaXIgJFdPUktESVIvJHQKKyAgIGZpCisgICAKKyAgICMjIyMgQ3JlYXRlIHRoZSBzY3JpcHQKKyAgIAorICAgIyBQcm9qZWN0IG5hbWUsIG5pZ2h0bHkgdGltZQorICAgY3AgJFdPUktESVIvMV9kZWZhdWx0LmNtYWtlICRXT1JLRElSLyR0L0NUZXN0U2NyaXB0LmNtYWtlCisgICAKKyAgICMgQ3JlYXRlIHBhdGggbmFtZXMsIGRlZmF1bHQgYnVpbGQgY29uZmlndXJhdGlvbiwgLi4uCisgICBjYXQgPj4gJFdPUktESVIvJHQvQ1Rlc3RTY3JpcHQuY21ha2UgPDwgRU9GCisgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICAgU0VUKENURVNUX1NPVVJDRV9ESVJFQ1RPUlkgIiRXT1JLRElSLyR0L3NvdXJjZSIpCisgICAgICBTRVQoQ1RFU1RfQklOQVJZX0RJUkVDVE9SWSAiJFdPUktESVIvJHQvYnVpbGQiKQorCisgICAgICBzZXQoQ1RFU1RfQ01BS0VfR0VORVJBVE9SICJVbml4IE1ha2VmaWxlcyIpCisgICAgICAKKyAgICAgIHNldChDVEVTVF9CVUlMRF9DT05GSUdVUkFUSU9OICJQcm9maWxpbmciKQorICAgICAgc2V0KFdJVEhfTUVNQ0hFQ0sgRkFMU0UpCisgICAgICBzZXQoV0lUSF9DT1ZFUkFHRSBGQUxTRSkKKyAgICAgIAorICAgICAgc2V0KENURVNUX0JVSUxEX09QVElPTlMgIiIpCisgICAgICBzZXQoQ1RFU1RfQlVJTERfTkFNRSAiVW5uYW1lZCIpCisKKyAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitFT0YKKyAgIAorICAgd2dldCAiaHR0cDovL3d3dy5mcmVlZGlhbWV0ZXIubmV0L2hnL2ZyZWVEaWFtZXRlci9yYXctZmlsZS90aXAvY29udHJpYi9uaWdodGx5X3Rlc3RzLyR0LmNvbmYiIC1PICRXT1JLRElSLyR0L3BhcmFtcy5jb25mCisgICBpZiBbICEgLWUgJFdPUktESVIvJHQvcGFyYW1zLmNvbmYgXTsgdGhlbgorICAgICAgZWNobyAiRXJyb3IgcmV0cmlldmluZyAkdC5jb25mIGZpbGUiOworICAgICAgY29udGludWU7CisgICBmaQorICAgCisgICAjIFRoZSByZXRyaWV2ZWQgcGFyYW1ldGVycyB3aWxsIG92ZXJ3cml0ZSB0aGUgZGVmYXVsdHMKKyAgIGNhdCAkV09SS0RJUi8kdC9wYXJhbXMuY29uZiA+PiAkV09SS0RJUi8kdC9DVGVzdFNjcmlwdC5jbWFrZQorICAgCisgICAjIE92ZXJ3cml0ZSB3aXRoIGFsbCB0aGUgbG9jYWwgZGF0YSAoc2l0ZSBuYW1lLCAuLi4pCisgICBlY2hvICIjIyMjIyMjIyBMb2NhbCBzaXRlIGRhdGE6ICIgID4+ICRXT1JLRElSLyR0L0NUZXN0U2NyaXB0LmNtYWtlCisgICBjYXQgJFJPT1RESVIvbG9jYWwuY21ha2UgPj4gJFdPUktESVIvJHQvQ1Rlc3RTY3JpcHQuY21ha2UKKyAgIAorICAgIyBOb3csIHRoZSByZW1haW5pbmcgb2YgdGhlIHNjcmlwdAorICAgY2F0ID4+ICRXT1JLRElSLyR0L0NUZXN0U2NyaXB0LmNtYWtlIDw8IEVPRgorICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyAgICAgICAjIGN0ZXN0X2VtcHR5X2JpbmFyeV9kaXJlY3RvcnkoXCR7Q1RFU1RfQklOQVJZX0RJUkVDVE9SWX0pCisKKyAgICAgICBmaW5kX3Byb2dyYW0oQ1RFU1RfSEdfQ09NTUFORCBOQU1FUyBoZykKKyAgICAgICBmaW5kX3Byb2dyYW0oQ1RFU1RfQ09WRVJBR0VfQ09NTUFORCBOQU1FUyBnY292KQorICAgICAgIGZpbmRfcHJvZ3JhbShDVEVTVF9NRU1PUllDSEVDS19DT01NQU5EIE5BTUVTIHZhbGdyaW5kKQorCisgICAgICAgIyBzZXQoQ1RFU1RfTUVNT1JZQ0hFQ0tfU1VQUFJFU1NJT05TX0ZJTEUgXCR7Q1RFU1RfU09VUkNFX0RJUkVDVE9SWX0vdGVzdHMvdmFsZ3JpbmQuc3VwcCkKKworICAgICAgIGlmKE5PVCBFWElTVFMgIlwke0NURVNUX1NPVVJDRV9ESVJFQ1RPUll9IikKKwkgc2V0KENURVNUX0NIRUNLT1VUX0NPTU1BTkQgIlwke0NURVNUX0hHX0NPTU1BTkR9IGNsb25lIGh0dHA6Ly93d3cuZnJlZWRpYW1ldGVyLm5ldC9oZy9mcmVlRGlhbWV0ZXIgXCR7Q1RFU1RfU09VUkNFX0RJUkVDVE9SWX0iKQorICAgICAgIGVuZGlmKCkKKworICAgICAgIHNldChDVEVTVF9VUERBVEVfQ09NTUFORCAiXCR7Q1RFU1RfSEdfQ09NTUFORH0iKQorCisgICAgICAgc2V0KENURVNUX0NPTkZJR1VSRV9DT01NQU5EICJcJHtDTUFLRV9DT01NQU5EfSAtRENNQUtFX0JVSUxEX1RZUEU6U1RSSU5HPVwke0NURVNUX0JVSUxEX0NPTkZJR1VSQVRJT059IikKKyAgICAgICBzZXQoQ1RFU1RfQ09ORklHVVJFX0NPTU1BTkQgIlwke0NURVNUX0NPTkZJR1VSRV9DT01NQU5EfSAtREJVSUxEX1RFU1RJTkc6Qk9PTD1PTiAtRE9QVF9URVNUX0FSR1VNRU5UUzpTVFJJTkc9LWQgXCR7Q1RFU1RfQlVJTERfT1BUSU9OU30iKQorICAgICAgIHNldChDVEVTVF9DT05GSUdVUkVfQ09NTUFORCAiXCR7Q1RFU1RfQ09ORklHVVJFX0NPTU1BTkR9IFxcIi1HXCR7Q1RFU1RfQ01BS0VfR0VORVJBVE9SfVxcIiIpCisgICAgICAgc2V0KENURVNUX0NPTkZJR1VSRV9DT01NQU5EICJcJHtDVEVTVF9DT05GSUdVUkVfQ09NTUFORH0gXFwiXCR7Q1RFU1RfU09VUkNFX0RJUkVDVE9SWX1cXCIiKQorCisgICAgICAgY3Rlc3Rfc3RhcnQoIk5pZ2h0bHkiKQorICAgICAgIGN0ZXN0X3VwZGF0ZSgpCisgICAgICAgY3Rlc3RfY29uZmlndXJlKCkKKyAgICAgICBjdGVzdF9idWlsZCgpCisgICAgICAgY3Rlc3RfdGVzdCgpCisgICAgICAgaWYgKFdJVEhfQ09WRVJBR0UgQU5EIENURVNUX0NPVkVSQUdFX0NPTU1BTkQpCisJIGN0ZXN0X2NvdmVyYWdlKCkKKyAgICAgICBlbmRpZiAoV0lUSF9DT1ZFUkFHRSBBTkQgQ1RFU1RfQ09WRVJBR0VfQ09NTUFORCkKKyAgICAgICBpZiAoV0lUSF9NRU1DSEVDSyBBTkQgQ1RFU1RfTUVNT1JZQ0hFQ0tfQ09NTUFORCkKKwkgY3Rlc3RfbWVtY2hlY2soKQorICAgICAgIGVuZGlmIChXSVRIX01FTUNIRUNLIEFORCBDVEVTVF9NRU1PUllDSEVDS19DT01NQU5EKQorICAgICAgIGN0ZXN0X3N1Ym1pdCgpCitFT0YKKworICAgIyBPSywgbm93IHJ1biB0aGlzIHRlc3QsIGl0IHdpbGwgc3VibWl0IGl0cyByZXN1bHRzLgorICAgY3Rlc3QgLVMgJFdPUktESVIvJHQvQ1Rlc3RTY3JpcHQuY21ha2UgLVYKK2RvbmUKKworZWNobyAiQ29tcGxldGVkIE5pZ2h0bHkgdGVzdHMsIHRpbWU6ICJgZGF0ZWAKKworCmRpZmYgLS1naXQgYS9jb250cmliL25pZ2h0bHlfdGVzdHMvdGVzdHMubGlzdCBiL2NvbnRyaWIvbmlnaHRseV90ZXN0cy90ZXN0cy5saXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZDIxMjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL25pZ2h0bHlfdGVzdHMvdGVzdHMubGlzdApAQCAtMCwwICsxLDEyIEBACithbGxleHQKK2FsbGV4dGRiZworYWxsZXh0dmFsCithbGxleHRyZXQKK2FsbGV4dHByb2YKK2FsbGV4dG1heAorYWxsZXh0ZGViCithbGxkZWZhdWx0Citub3NjdHAKK2lkbmFpZ25vcmUKK2lkbmFyZWplY3QKKyNub2V4dApkaWZmIC0tZ2l0IGEvY29udHJpYi90ZXN0X0d4L0NNYWtlTGlzdHMudHh0IGIvY29udHJpYi90ZXN0X0d4L0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5YjAyODMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3Rlc3RfR3gvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxMyBAQAorIyBUaGUgZGljdF9uYXNyZXEgZXh0ZW5zaW9uCitQUk9KRUNUKCJHeCBJbnRlcmZhY2UgZm9yIGZyZWVkaWFtZXRlciIgQykKKworIyBDb21waWxlIGFzIGEgbW9kdWxlCitGRF9BRERfRVhURU5TSU9OKGFwcF9neCBtYWluX2d4LmMpCisKKworIyMjIworIyMgSU5TVEFMTCBzZWN0aW9uICMjCisKK0lOU1RBTEwoVEFSR0VUUyBhcHBfZ3ggCisgICAgICAgTElCUkFSWSBERVNUSU5BVElPTiAke0lOU1RBTExfRVhURU5TSU9OU19TVUZGSVh9CisgICAgICAgQ09NUE9ORU5UIGZyZWVEaWFtZXRlci1yeC1pbnRlcmZhY2UpCmRpZmYgLS1naXQgYS9jb250cmliL3Rlc3RfR3gvbWFpbl9neC5jIGIvY29udHJpYi90ZXN0X0d4L21haW5fZ3guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODExNjYxCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi90ZXN0X0d4L21haW5fZ3guYwpAQCAtMCwwICsxLDgxOSBAQAorLyoqKioqKioqKioqKioqKioKKyBDb250cmlidXRlZCBieTogS3Jpc2huYW4gU3Jpbml2YXNhbiA8aHNpcmtfNkB5YWhvby5jb20+CisgTGljZW5zZTogdG8gYmUgc3BlY2lmaWVkLgorIFRPRE86CisgCisgKioqKioqKioqKioqKioqKi8KKworCisjaW5jbHVkZSA8ZnJlZURpYW1ldGVyL2V4dGVuc2lvbi5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNkZWZpbmUgQVVUSF9BUFBfSUQJCQkJICAgIDE2Nzc3MjM4CisjZGVmaW5lIFZFTkRPUl9JRF8zR1BQICAJCQkgICAgMTA0MTUKKy8qIFRoZSBjb250ZW50IG9mIHRoaXMgZmlsZSBmb2xsb3dzIHRoZSBzYW1lIHN0cnVjdHVyZSBhcyBkaWN0X2Jhc2VfcHJvdG8uYyAqLworCisjaWYgMAorI2RlZmluZSBDSEVDS19kaWN0X25ldyggX3R5cGUsIF9kYXRhLCBfcGFyZW50LCBfcmVmICkgIFwKKyAgICAgICBDSEVDS19GQ1QoICBmZF9kaWN0X25ldyggZmRfZ19jb25maWctPmNuZl9kaWN0LCAoX3R5cGUpLCAoX2RhdGEpLCAoX3BhcmVudCksIChfcmVmKSkgICk7CisjZW5kaWYKKwordm9pZCBkdW1wX3Nlc3NfZXllYyhzdHJ1Y3Qgc2Vzc2lvbiAqc2VzcywgY29uc3QgY2hhciAqKTsKKworc3RhdGljIGludCBjY3JfY2IoIHN0cnVjdCBtc2cgKiogbXNnLCBzdHJ1Y3QgYXZwICogYXZwLCBzdHJ1Y3Qgc2Vzc2lvbiAqIHNlc3MsIHZvaWQgKiBvcGFxdWUsIGVudW0gZGlzcF9hY3Rpb24gKiBhY3QpOworc3RhdGljIGludCByZWF1dGhfY2IoIHN0cnVjdCBtc2cgKiogbXNnLCBzdHJ1Y3QgYXZwICogYXZwLCBzdHJ1Y3Qgc2Vzc2lvbiAqIHNlc3MsIHZvaWQgKiBvcGFxdWUsIGVudW0gZGlzcF9hY3Rpb24gKiBhY3QpOworc3RhdGljIGludCBjY2FfY2IoIHN0cnVjdCBtc2cgKiogbXNnLCBzdHJ1Y3QgYXZwICogYXZwLCBzdHJ1Y3Qgc2Vzc2lvbiAqIHNlc3MsIHZvaWQgKiBvcGFxdWUsIGVudW0gZGlzcF9hY3Rpb24gKiBhY3QpOworc3RhdGljIHN0cnVjdCBkaXNwX2hkbCAqIGNjcl9jYl9oZGwgPSBOVUxMOyAvKiBoYW5kbGVyIGZvciBjY3IgcmVxIGNiICovCitzdGF0aWMgc3RydWN0IGRpc3BfaGRsICogY2NhX2NiX2hkbCA9IE5VTEw7IC8qIGhhbmRsZXIgZm9yIGNjYSByZXEgY2IgKi8KK3N0YXRpYyBzdHJ1Y3QgZGlzcF9oZGwgKiByZWF1dGhfY2JfaGRsID0gTlVMTDsgLyogaGFuZGxlciBmb3IgY2NhIHJlcSBjYiAqLworCitzdHJ1Y3QgZGljdF9vYmplY3QgKmNjcl9jbWQgPSBOVUxMOworc3RydWN0IGRpY3Rfb2JqZWN0ICpjY2FfY21kID0gTlVMTDsKK3N0cnVjdCBkaWN0X29iamVjdCAqZGF0YW9ial9yZV9hdXRoX3JlcXVlc3RfdHlwZSA9IE5VTEw7CitzdHJ1Y3QgZGljdF9vYmplY3QgKiBvcmlnaW5faG9zdCA9IE5VTEw7CitzdHJ1Y3QgZGljdF9vYmplY3QgKiBvcmlnaW5fcmVhbG0gPSBOVUxMOworc3RydWN0IGRpY3Rfb2JqZWN0ICogZGVzdF9ob3N0ID0gTlVMTDsKK3N0cnVjdCBkaWN0X29iamVjdCAqIGRlc3RfcmVhbG0gPSBOVUxMOworc3RydWN0IGRpY3Rfb2JqZWN0ICpyZWF1dGhfY21kID0gTlVMTDsKK3N0cnVjdCBkaWN0X29iamVjdCAqIGF1dGhfYXBwX2lkICAgID0gTlVMTDsgCitzdHJ1Y3QgZGljdF9vYmplY3QgKiBzZXJ2aWNlX2N4dF9pZCA9IE5VTEwgOyAKK3N0cnVjdCBkaWN0X29iamVjdCAqIGNjX3JlcV90eXBlICAgID0gTlVMTDsgCitzdHJ1Y3QgZGljdF9vYmplY3QgKiBjY19yZXFfbnVtICAgID0gTlVMTDsgCitzdHJ1Y3QgZGljdF9vYmplY3QgKiBiZWFyZXJfdXNhZ2UgICAgPSBOVUxMOyAKK3N0cnVjdCBkaWN0X29iamVjdCAqIHBmbHRfb3BlciAgICA9IE5VTEw7IAorc3RydWN0IGRpY3Rfb2JqZWN0ICogcGZsdF9pbmZvICAgID0gTlVMTDsgCitzdHJ1Y3QgZGljdF9vYmplY3QgKiBwZmx0X2lkCT0gTlVMTDsgCitzdHJ1Y3QgZGljdF9vYmplY3QgKiBneF9pbmY7CitzdHJ1Y3QgZGljdF9vYmplY3QgKiB0ZXJtX2NhdXNlID0gTlVMTDsKKworc3RydWN0IHNlc3Npb24gKmdfc2VzcyA9IE5VTEw7CitzdHJ1Y3Qgc2Vzc2lvbl9oYW5kbGVyICpnX2hkbHIgPSBOVUxMOworCitlbnVtIGd4X3N0YXRlIHsKKyAgICBTVEFURV9JTklUID0gMCwKKyAgICBTVEFURV9JTlRFUk1FRElBVEUgLAorICAgIFNUQVRFX0ZJTkFMCit9Oworc3RydWN0IGd4X3NtX3QgeworICAgIGVudW0gZ3hfc3RhdGUgc3RhdGU7CisgICAgcHRocmVhZF90IHRpZDsKKyAgICBzdHJ1Y3QgZmlmbyAqZXZlbnRzOworICAgIHB0aHJlYWRfbXV0ZXhfdCBwX3NtX210eDsKKyAgICBpbnQgcmVxX251bTsKKyAgICBzdHJ1Y3Qgc2Vzc2lvbiAqc2VzczsgIAorfSBnX2d4X3NtOworCitpbnQgc25kX2Njcl9tc2coc3RydWN0IGd4X3NtX3QgKipneF9zbSAgLCBzdHJ1Y3QgZGljdF9vYmplY3QgKmNtZF9yICkgOworCit2b2lkIHNpZ19oZGxyKHZvaWQpOworCit2b2lkICpneF9zbV90aCh2b2lkICpzbSk7CisjZGVmaW5lIHByZXNzX2tleV9jb250aW51ZSgpIHsgcHJpbnRmKCIlcyAlZFxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7fQorc3RhdGljIGludCBhcHBfZ3hfZW50cnkoY2hhciAqIGNvbmZmaWxlKQoreworLy8gICAgIFRSQUNFX0VOVFJZKCIlcCIsIGNvbmZmaWxlKTsJICAgICAgIAorICAgICAgIHsKKwkgICAgICAgYXBwbGljYXRpb25faWRfdCBkY2NhX2lkID0gQVVUSF9BUFBfSUQ7CisJICAgICAgIGFwcGxpY2F0aW9uX2lkX3QgY2NyX2lkID0gMjcyOworCSAgICAgICBhcHBsaWNhdGlvbl9pZF90IGNjYV9pZCA9IDI3MjsKKwkgICAgICAgYXBwbGljYXRpb25faWRfdCByZWF1dGhfaWQgPSAyNTg7CisJICAgICAgIENIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BUFBMSUNBVElPTiwgQVBQTElDQVRJT05fQllfSUQsICZkY2NhX2lkLCAmZ3hfaW5mLCBFTk9FTlQpKTsKKyAgICAgICBDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQ09NTUFORCwgQ01EX0JZX0NPREVfUiwgJmNjcl9pZCwgJmNjcl9jbWQsIEVOT0VOVCkpOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9DT01NQU5ELCBDTURfQllfQ09ERV9BLCAmY2NhX2lkLCAmY2NhX2NtZCwgRU5PRU5UKSk7CisgIC8vICAgQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0NPTU1BTkQsIENNRF9CWV9DT0RFX1IsICZyZWF1dGhfaWQsICZyZWF1dGhfY21kLCBFTk9FTlQpKTsKKworICAgICAgIH0KKworICAgICAgIC8qIEFwcGxpY2F0aW9ucyBzZWN0aW9uICovCisjaWYgMAorICAgICB7CisJLy8gR3ggaW50ZXJmYWNlCisJICAgICAgIHsKKwlzdHJ1Y3QgZGljdF9hcHBsaWNhdGlvbl9kYXRhIGRhdGEgPSB7IEFVVEhfQVBQX0lELCAiM0dQUC1HeCBBcHBsaWNhdGlvbiIgfTsKKwkgQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVBQTElDQVRJT04sICZkYXRhLCBOVUxMLCAmZ3hfaW5mKTsKKworCSAgICAgICB9CQkJCQorICAKKwl9CisjZW5kaWYKKworCisJLy8gRG8gcmVnaXN0ZXJhdGlvbiBhbmQgaW5pdCBzdHVmZgorICAgICAgeworCXN0cnVjdCBkaXNwX3doZW4gZGF0YTsKKyAgICAgICAKKyAgICAgICBUUkFDRV9ERUJVRyhGVUxMLCAiSW5pdGlhbGl6aW5nIGRpc3BhdGNoIGNhbGxiYWNrcyBmb3IgR3ggaW50ZXJmYWNlIik7CisJICAgCisgICAgICAgbWVtc2V0KCZkYXRhLCAwLCBzaXplb2YoZGF0YSkpOworICAgICAgIGRhdGEuYXBwID0gZ3hfaW5mOworCSAgIGRhdGEuY29tbWFuZCA9IGNjcl9jbWQ7CisgICAgICAgLyogTm93IHNwZWNpZmljIGhhbmRsZXIgZm9yIENDUi1DTUQgKi8KKwkgICBDSEVDS19GQ1QoIGZkX2Rpc3BfcmVnaXN0ZXIoIGNjcl9jYiwgRElTUF9IT1dfQ0MsICZkYXRhLCBOVUxMLCAmY2NyX2NiX2hkbCApICk7CisKKyAKKyAgICAgICBtZW1zZXQoJmRhdGEsIDAsIHNpemVvZihkYXRhKSk7CisgICAgICAgZGF0YS5hcHAgPSBneF9pbmY7CisJICAgZGF0YS5jb21tYW5kID0gY2NhX2NtZDsKKworCSAgIENIRUNLX0ZDVCggZmRfZGlzcF9yZWdpc3RlciggY2NhX2NiLCBESVNQX0hPV19DQywgJmRhdGEsIE5VTEwsICZjY2FfY2JfaGRsICkgKTsKKyAgICAgICAKKyNpZmRlZiBSRUFVVEgKKwlDSEVDS19GQ1QoZmRfZGljdF9zZWFyY2goZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0NPTU1BTkQsIENNRF9CWV9OQU1FLAorCQkJCSAgICAgICAiUmUtQXV0aC1SZXF1ZXN0IiwgJnJlYXV0aF9jbWQsIEVOT0VOVCkpOworCW1lbXNldCgmZGF0YSwgMCwgc2l6ZW9mKGRhdGEpKTsKKyAgICAgICBkYXRhLmFwcCA9IGd4X2luZjsKKwkgICBkYXRhLmNvbW1hbmQgPSByZWF1dGhfY21kOworCXByaW50ZigicmVnaXN0ZXIgUkVBVVRIXG4iKTsKKwkgICBDSEVDS19GQ1QoIGZkX2Rpc3BfcmVnaXN0ZXIoIHJlYXV0aF9jYiwgRElTUF9IT1dfQ0MsICZkYXRhLCBOVUxMLCAmcmVhdXRoX2NiX2hkbCApICk7CisjZW5kaWYKKworCisgICAgIH0KKworCQorICAgICAgIENIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgCisJCQkgICAgICAgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAKKwkJCSAgICAgICAiT3JpZ2luLUhvc3QiLCAKKwkJCQkmb3JpZ2luX2hvc3QsIAorCQkJCUVOT0VOVCkgKTsKKworICAgICAgIENIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgCisJCQkgICAgICAgRElDVF9BVlAsIAorCQkJICAgICAgIEFWUF9CWV9OQU1FLCAKKwkJCSAgICAgICAiT3JpZ2luLVJlYWxtIiwgCisJCQkgICAgICAgJm9yaWdpbl9yZWFsbSwgCisJCQkgICAgICAgRU5PRU5UKSApOworCisgICAgICAgQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCAKKwkJCSAgICAgICBESUNUX0FWUCwgCisJCQkgICAgICAgQVZQX0JZX05BTUUsIAorCQkJICAgICAgICJEZXN0aW5hdGlvbi1Ib3N0IiwgCisJCQkJJmRlc3RfaG9zdCwgCisJCQkJRU5PRU5UKSApOworCisgICAgICAgQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCAKKwkJCSAgICAgICBESUNUX0FWUCwgCisJCQkgICAgICAgQVZQX0JZX05BTUUsIAorCQkJICAgICAgICJEZXN0aW5hdGlvbi1SZWFsbSIsIAorCQkJICAgICAgICZkZXN0X3JlYWxtLCAKKwkJCSAgICAgICBFTk9FTlQpICk7CisKKworICAgICAgIENIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgCisJCQkgICAgICAgRElDVF9BVlAsIAorCQkJICAgICAgIEFWUF9CWV9OQU1FLCAKKwkJCSAgICAgICAiQXV0aC1BcHBsaWNhdGlvbi1JZCIsIAorCQkJICAgICAgICZhdXRoX2FwcF9pZCwgCisJCQkJRU5PRU5UKSApOworCisKKyAgICAgICBDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIAorCQkJICAgICAgIERJQ1RfQVZQLCAKKwkJCSAgICAgICBBVlBfQllfTkFNRSwgCisJCQkgICAgICAgIlNlcnZpY2UtQ29udGV4dC1JZCIsIAorCQkJICAgICAgICZzZXJ2aWNlX2N4dF9pZCwgCisJCQkJRU5PRU5UKSApOworCisgICAgQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCAKKwkJCSAgICAgICBESUNUX0FWUCwgCisJCQkgICAgICAgQVZQX0JZX05BTUUsIAorCQkJICAgICAgICJDQy1SZXF1ZXN0LVR5cGUiLCAKKwkJCSAgICAgICAmY2NfcmVxX3R5cGUsIAorCQkJCUVOT0VOVCkgKTsKKworICAgIENIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgCisJCQkgICAgICAgRElDVF9BVlAsIAorCQkJICAgICAgIEFWUF9CWV9OQU1FLCAKKwkJCSAgICAgICAiVGVybWluYXRpb24tQ2F1c2UiLCAKKwkJCSAgICAgICAmdGVybV9jYXVzZSwgCisJCQkJRU5PRU5UKSApOworCisgICAgQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCAKKwkJCSAgICAgICBESUNUX0FWUCwgCisJCQkgICAgICAgQVZQX0JZX05BTUUsIAorCQkJICAgICAgICJDQy1SZXF1ZXN0LU51bWJlciIsIAorCQkJICAgICAgICZjY19yZXFfbnVtLCAKKwkJCQlFTk9FTlQpICk7CisgICAgeworCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IHJlcSA9IHsgVkVORE9SX0lEXzNHUFAsIDAsICJCZWFyZXItVXNhZ2UifTsgCisKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIAorCQkJCSAgIERJQ1RfQVZQLCAKKwkJCQkgICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAKKwkJCQkgICAmcmVxLCAKKwkJCQkgICAmYmVhcmVyX3VzYWdlLCAKKwkJCQkgICAgRU5PRU5UKSApOworICAgIH0KKyAgICB7CisJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgcmVxID0geyBWRU5ET1JfSURfM0dQUCwgMCwgIlBhY2tldC1GaWx0ZXItT3BlcmF0aW9uIn07IAorCisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCAKKwkJCQkgICBESUNUX0FWUCwgCisJCQkJICAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgCisJCQkJICAgJnJlcSwgCisJCQkJICAgJnBmbHRfb3BlciwgCisJCQkJICAgIEVOT0VOVCkgKTsKKyAgICB9CisgICAgeworCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IHJlcSA9IHsgVkVORE9SX0lEXzNHUFAsIDAsICJQYWNrZXQtRmlsdGVyLUluZm9ybWF0aW9uIn07IAorCisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCAKKwkJCQkgICBESUNUX0FWUCwgCisJCQkJICAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgCisJCQkJICAgJnJlcSwgCisJCQkJICAgJnBmbHRfaW5mbywgCisJCQkJICAgIEVOT0VOVCkgKTsKKyAgICB9CisgICAgeworCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IHJlcSA9IHsgVkVORE9SX0lEXzNHUFAsIDAsICJQYWNrZXQtRmlsdGVyLUlkZW50aWZpZXIifTsgCisKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIAorCQkJCSAgIERJQ1RfQVZQLCAKKwkJCQkgICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAKKwkJCQkgICAmcmVxLCAKKwkJCQkgICAmcGZsdF9pZCwgCisJCQkJICAgIEVOT0VOVCkgKTsKKyAgICB9CisKKyAgICBDSEVDS19GQ1QoZmRfc2Vzc19oYW5kbGVyX2NyZWF0ZSggJmdfaGRsciwgZnJlZSwgTlVMTCkpOworICAgIENIRUNLX0ZDVCggZmRfZmlmb19uZXcoJmdfZ3hfc20uZXZlbnRzKSk7ICAKKyAgICBDSEVDS19GQ1QoIGZkX2Rpc3BfYXBwX3N1cHBvcnQoIGd4X2luZiwgTlVMTCwgMSAsIDApKTsKKworICAgIENIRUNLX0ZDVCggZmRfZXZlbnRfdHJpZ19yZWdjYihTSUdVU1IxLCAiYXBwX2d4Iiwgc2lnX2hkbHIgKSApOworCisKKyAgICAgICBUUkFDRV9ERUJVRyhJTkZPLCAiRXh0ZW5zaW9uICdHeCcgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICByZXR1cm4gMDsKK30KKwordm9pZCAqIGd4X3NtX3RoKHZvaWQgKnNtKQoreworICAgc3RydWN0IGd4X3NtX3QgKmd4X3NtID0gKHN0cnVjdCBneF9zbV90ICopIHNtOworICAgIHN0cnVjdCB0aW1lc3BlYyB0b3V0OworICAgIGludCBldnRfY29kZTsKKworCSAgICBDSEVDS19TWVNfRE8oIGNsb2NrX2dldHRpbWUoIENMT0NLX1JFQUxUSU1FLCAmdG91dCksIGdvdG8gb3V0KTsKKwkgICAgdG91dC50dl9zZWMgPSsgNjAgOworICAgCisgICAgd2hpbGUoMSkgeworIAorCWZkX2V2ZW50X3RpbWVkZ2V0KGd4X3NtLT5ldmVudHMsICZ0b3V0ICwgRVRJTUVET1VULCAmZXZ0X2NvZGUsIE5VTEwsIE5VTEwgKTsKKwkgQ0hFQ0tfU1lTX0RPKCBjbG9ja19nZXR0aW1lKCBDTE9DS19SRUFMVElNRSwgJnRvdXQpLCBnb3RvIG91dCk7CisJcHJpbnRmKCJpbiB0b3V0IHNlYyAlZFxuIiwgdG91dC50dl9zZWMpOyAKKwlpZihldnRfY29kZSA9PSBFVElNRURPVVQpIHsKKwkgICAgCisJICAgIHNuZF9jY3JfbXNnKCZneF9zbSwgY2NyX2NtZCk7CisJICAgIGd4X3NtLT5yZXFfbnVtKysgOworCSAgICBneF9zbS0+c3RhdGUgPSBTVEFURV9JTlRFUk1FRElBVEU7CisJICAgIENIRUNLX1NZU19ETyggY2xvY2tfZ2V0dGltZSggQ0xPQ0tfUkVBTFRJTUUsICZ0b3V0KSwgZ290byBvdXQpOworCSAgICB0b3V0LnR2X3NlYyArPSAzMCA7CisKKwl9CisgICAgICAgLy8gcHJpbnRmKCJwcmVzcyBlbnRlclxuIik7CisgICAgICAgLy8gZ2V0Y2hhcigpOworICAgIH0KKyAgICAgCisgb3V0OiAKKyByZXR1cm4gTlVMTDsKK30KKy8vVEJECitpbnQgaW5pdF9neF9zbShzdHJ1Y3QgZ3hfc21fdCAqc20pCit7CisgICAgc20tPnN0YXRlID0gU1RBVEVfSU5JVDsKKyAgICBzbS0+dGlkID0gMDsvLworICAgIHNtLT5ldmVudHMgPSBOVUxMOworICAgIHB0aHJlYWRfbXV0ZXhfdCBwX3NtX210eDsKKyAgICBzbS0+cmVxX251bSA9IDA7CisgICAgc20tPnNlc3MgPSBOVUxMOworCityZXR1cm4gMDsKK30KK2ludCBmcmVlX2d4X3NtKHN0cnVjdCBneF9zbV90ICpzbSkKK3sKKyAgICAKKyAgZnJlZShzbSk7Cit9CitzdHJ1Y3QgZ3hfc21fdCAqZ2xfZ3hfc20gPSBOVUxMOworCit2b2lkIHNpZ19oZGxyKCkKK3sKK3N0cnVjdCBneF9zbV90ICpneF9zbSA9IGdsX2d4X3NtOworCisgICAgaWYoIGd4X3NtKSB7CisKKwlmZF9zZXNzX2R1bXAoIDAgLCBnX2d4X3NtLnNlc3MpOworCisgICAgIH0gZWxzZSB7CisKKwlpZihneF9zbT0gKHN0cnVjdCBneF9zbV90ICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgZ3hfc21fdCkpKSB7CisJICAgIGluaXRfZ3hfc20oZ3hfc20pOworCSAgIH0KKwkgICBnbF9neF9zbSA9IGd4X3NtOworCX0KKworICAgICAgc25kX2Njcl9tc2coICZneF9zbSwgY2NyX2NtZCk7CisgICAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBjcl9jYl9hbnModm9pZCAqZGF0YSwgc3RydWN0IG1zZyAgKiptc2cpCit7CisgICAgcHJpbnRmKCJjYWxsIGJhY2sgXG4iKTsKKyAgIHJldHVybjsKK30KKworLyoJCQkJICAgICA8IFNlc3Npb24tSWQgPgorCQkJCSAgIHsgT3JpZ2luLUhvc3QgfQorCQkJCSAgIHsgT3JpZ2luLVJlYWxtIH0KKwkJCQkgICB7IERlc3RpbmF0aW9uLVJlYWxtIH0KKwkJCQkgICB7IEF1dGgtQXBwbGljYXRpb24tSWQgfQorCQkJCSAgIHsgU2VydmljZS1Db250ZXh0LUlkIH0KKwkJCQkgICB7IENDLVJlcXVlc3QtVHlwZSB9CisJCQkJICAgeyBDQy1SZXF1ZXN0LU51bWJlciB9CisqLworCitpbnQgc25kX2Njcl9tc2coc3RydWN0IGd4X3NtX3QgKipzbSAsIHN0cnVjdCBkaWN0X29iamVjdCAqY21kX3IgKSAKK3sKKyAgICAgICBzdHJ1Y3QgbXNnICogcmVxID0gTlVMTDsKKyAgICAgICBzdHJ1Y3QgYXZwICogYXZwID0gTlVMTDsKKyAgICAgICB1bmlvbiBhdnBfdmFsdWUgdmFsOworICAgICAgIHN0cnVjdCB0YV9tZXNzX2luZm8gKiBtaSA9IE5VTEwsICpzdmc7CisgICAgICAgc3RydWN0IHNlc3Npb24gKnNlc3MgPSBOVUxMOworICAgIHN0cnVjdCBneF9zbV90ICpneF9zbSA9IE5VTEw7CisgICAgc3RydWN0IGd4X3NtX3QgKnB0ciA9IE5VTEw7CisKKyAgICAgICBUUkFDRV9ERUJVRyhGVUxMLCAiQ3JlYXRpbmcgYSBuZXcgQ0NSIG1lc3NhZ2UgZm9yIHNlbmRpbmcuICVwIiwgZ3hfc20pOworICAgICAgIAorICAgICAgIC8qIENyZWF0ZSB0aGUgcmVxdWVzdCBmcm9tIHRlbXBsYXRlICovCisgICAgICAgQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfbmV3KCBjbWRfciwgTVNHRkxfQUxMT0NfRVRFSUQsICZyZXEgKSwgZ290byBvdXQgKTsKKyAgICAgICAKKyAgICBneF9zbSA9ICpzbTsKKyAgICAgICAvKiBDcmVhdGUgYSBuZXcgc2Vzc2lvbiAqLworICAgIGlmKCFneF9zbS0+c2VzcykgeworCisJICAgQ0hFQ0tfRkNUX0RPKCBmZF9zZXNzX25ldyggJnNlc3MsIAorCQkJCSAgIGZkX2dfY29uZmlnLT5jbmZfZGlhbWlkLCAKKwkJCQkgICBmZF9nX2NvbmZpZy0+Y25mX2RpYW1pZF9sZW4sIAorCQkJCSAgICAiQ0NSX1NFU1NJT04iLCBzdHJsZW4oIkNDUl9TRVNTSU9OIikgKSwgZ290byBvdXQgKTsKKwkKKwlwcmludGYoInN0YXRlbWFjaGluZTogJXAgJXAgJXBcbiIsICooJmd4X3NtKSwgZ3hfc20gLCAqc20pOworCWd4X3NtLT5zZXNzID0gc2VzczsKKwlwcmludGYoIm5ldyBzZXNzaW9uICVwIFxuIiwgc2Vzcyk7CisJLy9Ib2xkIHRoZSBzZXNzaW9uIHRpbGwgdGVybWluYXRlIGhhcHBlbnMKKwkgICAgICAgQ0hFQ0tfRkNUKCBmZF9zZXNzX3JlZl9tc2coc2VzcykgKTsKKworICAgICAgfSBlbHNlIHsKKworCXNlc3MgPSBneF9zbS0+c2VzczsKKwlwcmludGYoInVzZSBwcmV2aW91cyBzZXNzaW9uICVwIFxuIiwgc2Vzcyk7CisKKyAgICAgIH0KKyAgICAgCisgICAgIGZkX3Nlc3NfZHVtcCggMCAsIHNlc3MpOworICAgIAorICAgICAgIAorLy8gICAgIGR1bXBfc2Vzc19leWVjKCBzZXNzLCBfX0ZVTkNUSU9OX18pOworICAgICAgIC8qIE5vdyBzZXQgYWxsIEFWUHMgdmFsdWVzICovCisgICAgICAgCisgICAgICAgLyogU2Vzc2lvbi1JZCAqLworICAgICAgIHsKKwkgICAgICAgb3MwX3Qgc2lkOworCSAgICAgICBzaXplX3Qgc2lkbGVuOworCXN0cnVjdCBkaWN0X29iamVjdCAqc2Vzc19pZCA9IE5VTEw7CisKKyAgICAgICBDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCAgIGZkX2dfY29uZmlnLT5jbmZfZGljdAorCQkJCSAgICwgRElDVF9BVlAsIEFWUF9CWV9OQU1FCisJCQkJICAgLCAiU2Vzc2lvbi1JZCIKKwkJCQkgICAsICZzZXNzX2lkLCBFTk9FTlQpICk7CisKKwkgICAgICAgQ0hFQ0tfRkNUX0RPKCBmZF9zZXNzX2dldHNpZCAoIHNlc3MsICZzaWQsICZzaWRsZW4gKSwgZ290byBvdXQgKTsKKwkgICAgICAgQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfYXZwX25ldyAoIHNlc3NfaWQsIDAsICZhdnAgKSwgZ290byBvdXQgKTsKKwkgICAgICAgdmFsLm9zLmRhdGEgPSBzaWQ7CisJICAgICAgIHZhbC5vcy5sZW4gID0gc2lkbGVuOworCSAgICAgICBDSEVDS19GQ1RfRE8oIGZkX21zZ19hdnBfc2V0dmFsdWUoIGF2cCwgJnZhbCApLCBnb3RvIG91dCApOworCSAgICAgICBDSEVDS19GQ1RfRE8oIGZkX21zZ19hdnBfYWRkKCByZXEsIE1TR19CUldfRklSU1RfQ0hJTEQsIGF2cCApLCBnb3RvIG91dCApOworICAgICAgIH0KKworICAgICAgIC8qIFNldCB0aGUgRGVzdGluYXRpb24tUmVhbG0gQVZQICovCisgICAgICAgeworCSAgICAgICBDSEVDS19GQ1RfRE8oIGZkX21zZ19hdnBfbmV3ICggZGVzdF9yZWFsbSwgMCwgJmF2cCApLCBnb3RvIG91dCAgKTsKKwkgICAgICAgdmFsLm9zLmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSgidm0iKTsKKwkgICAgICAgdmFsLm9zLmxlbiAgPSBzdHJsZW4oInZtIik7CisJICAgICAgIENIRUNLX0ZDVF9ETyggZmRfbXNnX2F2cF9zZXR2YWx1ZSggYXZwLCAmdmFsICksIGdvdG8gb3V0ICApOworCSAgICAgICBDSEVDS19GQ1RfRE8oIGZkX21zZ19hdnBfYWRkKCByZXEsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwICksIGdvdG8gb3V0ICApOworICAgICAgIH0KKyAgICAgICAKKworICAgICAgIC8qIFNldCB0aGUgRGVzdGluYXRpb24tSG9zdCBBVlAgaWYgbmVlZGVkKi8KKyAgICB7CisJICAgICAgIENIRUNLX0ZDVF9ETyggZmRfbXNnX2F2cF9uZXcgKCBkZXN0X2hvc3QsIDAsICZhdnAgKSwgZ290byBvdXQgICk7CisJICAgICAgIHZhbC5vcy5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikoIjE5Mi4xNjguMTAxLjMiKTsKKwkgICAgICAgdmFsLm9zLmxlbiAgPSBzdHJsZW4oIjE5Mi4xNjguMTAxLjMiKTsKKwkgICAgICAgQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfYXZwX3NldHZhbHVlKCBhdnAsICZ2YWwgKSwgZ290byBvdXQgICk7CisJICAgICAgIENIRUNLX0ZDVF9ETyggZmRfbXNnX2F2cF9hZGQoIHJlcSwgTVNHX0JSV19MQVNUX0NISUxELCBhdnAgKSwgZ290byBvdXQgICk7CisgICAgfQorICAgICAgIAorCisgICAgICAgLyogU2V0IE9yaWdpbi1Ib3N0ICYgT3JpZ2luLVJlYWxtICovCisgICAgICAgQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfYWRkX29yaWdpbiAoIHJlcSwgMCApLCBnb3RvIG91dCAgKTsKKworCisgICAvKiAgU2V0IEF1dGgtQXBwbGljYXRpb24gSUQgKi8KKyAgICB7CisgICAgICAgQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfYXZwX25ldyAoIGF1dGhfYXBwX2lkLCAwLCAmYXZwICksIGdvdG8gb3V0ICApOworCSAgICAgICB2YWwuaTMyID0gIEFVVEhfQVBQX0lEOyAvLyBBdXRoLUFwcCBpZCBpcyA0IGZvciBDQ1IgCisJICAgICAgIENIRUNLX0ZDVF9ETyggZmRfbXNnX2F2cF9zZXR2YWx1ZSggYXZwLCAmdmFsICksIGdvdG8gb3V0ICApOworCSAgICAgICBDSEVDS19GQ1RfRE8oIGZkX21zZ19hdnBfYWRkKCByZXEsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwICksIGdvdG8gb3V0ICApOworICAgIH0KKworICAgIC8qICAgICBTZXQgU2VydmljZSBDb250ZXh0IElEICAgICAqLworICAgIHsKKworICAgICAgIENIRUNLX0ZDVF9ETyggZmRfbXNnX2F2cF9uZXcgKCBzZXJ2aWNlX2N4dF9pZCwgMCwgJmF2cCApLCBnb3RvIG91dCAgKTsKKwl2YWwub3MuZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopKCJ0ZXN0QHRzdCIpOworCSAgICAgICBDSEVDS19GQ1RfRE8oIGZkX21zZ19hdnBfc2V0dmFsdWUoIGF2cCwgJnZhbCApLCBnb3RvIG91dCAgKTsKKwkgICAgICAgQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfYXZwX2FkZCggcmVxLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCApLCBnb3RvIG91dCAgKTsKKworICAgIH0KKworICAgIC8qICAgICBTZXQgUmVxdWVzdCBUeXBlCSAgICAgICovCisgICAgeworI2RlZmluZSBDQ1JfSU5JVF9SRVFVRVNUCQkxCisjZGVmaW5lIENDUl9VUERBVEVfUkVRVUVTVAkJMgorI2RlZmluZSBDQ1JfVEVSTUlOQVRJT05fUkVRVUVTVCAJMworI2RlZmluZSBDQ1JfRVZFTlRfUkVRVUVTVAkJNAorLy9UT0RPIENoYW5nZSB0aGlzIHRvIHVzZSAgZW51bSBvYmplY3QKKyAgICAgICBDSEVDS19GQ1RfRE8oIGZkX21zZ19hdnBfbmV3ICggY2NfcmVxX3R5cGUsIDAsICZhdnAgKSwgZ290byBvdXQgICk7CisJaWYoZ3hfc20tPnN0YXRlID09IFNUQVRFX0lOSVQpCisJICAgIHZhbC5pMzIgPSBDQ1JfSU5JVF9SRVFVRVNUOworCWVsc2UgaWYoZ3hfc20tPnN0YXRlID09IFNUQVRFX0ZJTkFMKQorCSAgICB2YWwuaTMyID0gQ0NSX1RFUk1JTkFUSU9OX1JFUVVFU1Q7CisJIGVsc2UgCisJICAgIHZhbC5pMzIgPSBDQ1JfVVBEQVRFX1JFUVVFU1Q7CisKKwkgICAgICAgQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfYXZwX3NldHZhbHVlKCBhdnAsICZ2YWwgKSwgZ290byBvdXQgICk7CisJICAgICAgIENIRUNLX0ZDVF9ETyggZmRfbXNnX2F2cF9hZGQoIHJlcSwgTVNHX0JSV19MQVNUX0NISUxELCBhdnAgKSwgZ290byBvdXQgICk7CisKKyAgICB9CisKKyAgICAvKiAgICAgU2V0IFJlcXVlc3QgTnVtYmVyCSAgICAgICovCisgICAgeworICAgICAgIENIRUNLX0ZDVF9ETyggZmRfbXNnX2F2cF9uZXcgKCBjY19yZXFfbnVtLCAwLCAmYXZwICksIGdvdG8gb3V0ICApOworCXZhbC5pMzIgPSBneF9zbS0+cmVxX251bTsKKwkgICAgICAgQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfYXZwX3NldHZhbHVlKCBhdnAsICZ2YWwgKSwgZ290byBvdXQgICk7CisJICAgICAgIENIRUNLX0ZDVF9ETyggZmRfbXNnX2F2cF9hZGQoIHJlcSwgTVNHX0JSV19MQVNUX0NISUxELCBhdnAgKSwgZ290byBvdXQgICk7CisJZ3hfc20tPnJlcV9udW0rKzsgCisgICAgfQorCisgICAgc3dpdGNoKGd4X3NtLT5zdGF0ZSkgeworCisgICAgIGNhc2UgU1RBVEVfSU5JVDoKKworCXsKKwkvL1NldCBCZWFyZXItVXNhZ2UKKyAgICAvL1RPRE8gQ2hhbmdlIHRoaXMgdG8gdXNlICBlbnVtIG9iamVjdAorICAgICAgIENIRUNLX0ZDVF9ETyggZmRfbXNnX2F2cF9uZXcgKCBiZWFyZXJfdXNhZ2UsIDAsICZhdnAgKSwgZ290byBvdXQgICk7CisJdmFsLmkzMiA9IDE7Ly9JTVMKKwkgICAgICAgQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfYXZwX3NldHZhbHVlKCBhdnAsICZ2YWwgKSwgZ290byBvdXQgICk7CisJICAgICAgIENIRUNLX0ZDVF9ETyggZmRfbXNnX2F2cF9hZGQoIHJlcSwgTVNHX0JSV19MQVNUX0NISUxELCBhdnAgKSwgZ290byBvdXQgICk7CisJfSAKKyAgICAgICB7CisJLy9TZXQgUGFja2V0IEZpbHRlciBPcGVyYXRpb24gCisJLy9UT0RPIENoYW5nZSB0aGlzIHRvIHVzZSAgZW51bSBvYmplY3QKKyAgICAgICBDSEVDS19GQ1RfRE8oIGZkX21zZ19hdnBfbmV3ICggcGZsdF9vcGVyLCAwLCAmYXZwICksIGdvdG8gb3V0ICApOworCXZhbC5pMzIgPSAxOy8vQURESVRJT04KKwkgICAgICAgQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfYXZwX3NldHZhbHVlKCBhdnAsICZ2YWwgKSwgZ290byBvdXQgICk7CisJICAgICAgIENIRUNLX0ZDVF9ETyggZmRfbXNnX2F2cF9hZGQoIHJlcSwgTVNHX0JSV19MQVNUX0NISUxELCBhdnAgKSwgZ290byBvdXQgICk7CisJIH0gCisJc3RydWN0IGF2cCAqZmx0X2luZm8gPSBOVUxMOyAKKwl7CisJICAgIC8vU2V0IFBhY2tldCBGaWx0ZXIgSW5mb3JtYXRpb24gCisJICAgQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfYXZwX25ldyAoIHBmbHRfaW5mbywgMCwgJmZsdF9pbmZvICksIGdvdG8gb3V0ICApOworCisgICAKKwkgICAgICAgQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfYXZwX2FkZCggcmVxLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGZsdF9pbmZvICksIGdvdG8gb3V0ICApOworCX0gCisJLy8gU2V0IFBhY2tldCBGaWx0ZXIgSWRlbnRpdHkKKwl7CisKKwkgQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfYXZwX25ldyAoIHBmbHRfaWQsIDAsICZhdnAgKSwgZ290byBvdXQgICk7CisJICB2YWwub3MuZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopKCJJRCIpOworCQkgdmFsLm9zLmxlbiAgPSBzdHJsZW4oIklEIik7CisJICBDSEVDS19GQ1RfRE8oIGZkX21zZ19hdnBfc2V0dmFsdWUoIGF2cCwgJnZhbCApLCBnb3RvIG91dCAgKTsKKwkgIGlmKGZsdF9pbmZvKSB7CisJCSAgIENIRUNLX0ZDVF9ETyggZmRfbXNnX2F2cF9hZGQoIGZsdF9pbmZvLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCApLCBnb3RvIG91dCAgKTsKKwkgICB9ZWxzZSB7CisJCXByaW50ZigiZmx0X2luZm8gTlVMTFxuIik7CisJICAgIH0KKworCSB9CisJQ0hFQ0tfRkNUKGZkX3Nlc3Nfc3RhdGVfc3RvcmUoZ19oZGxyLCBzZXNzLCAmZ3hfc20pKTsKKworCWJyZWFrOworICAgICBjYXNlIFNUQVRFX0ZJTkFMOgorCSB7CisJLy9TZXQgUGFja2V0IEZpbHRlciBPcGVyYXRpb24gCisJLy9UT0RPIENoYW5nZSB0aGlzIHRvIHVzZSAgZW51bSBvYmplY3QKKyAgICAgICBDSEVDS19GQ1RfRE8oIGZkX21zZ19hdnBfbmV3ICggdGVybV9jYXVzZSwgMCwgJmF2cCApLCBnb3RvIG91dCAgKTsKKwl2YWwuaTMyID0gMTsvL0RpYW1ldGVyIGxvZ291dAorCSAgICAgICBDSEVDS19GQ1RfRE8oIGZkX21zZ19hdnBfc2V0dmFsdWUoIGF2cCwgJnZhbCApLCBnb3RvIG91dCAgKTsKKwkgICAgICAgQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfYXZwX2FkZCggcmVxLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCApLCBnb3RvIG91dCAgKTsKKwkgfSAKKwlicmVhazsKKyAgICAgZGVmYXVsdDogCisJcHJpbnRmKCJTdGF0ZSBtaXNtYXRjaCBcbiIpOworICAgIH0KKyAgICAgICBmZmx1c2goc3RkZXJyKTsKKyAgICAgICAKKyAgICAgICAvKiBTZW5kIHRoZSByZXF1ZXN0ICovCisgICAgcHJpbnRmKCJDQ0EgJXBcbiIscmVxKTsKKy8vIEV2ZXJ0aGluZyBEb25lIFN0b3JlIHRoZSBzdGF0ZTogcmVwbHkgc2hvdWxkIHJldHJlaXZlIGl0IAorICAgICAgIENIRUNLX0ZDVF9ETyggZmRfbXNnX3NlbmQoICZyZXEsIE5VTEwsIE5VTEwgKSwgZ290byBvdXQgKTsKKworb3V0OgorICAgICAgIHJldHVybjsKK30KKworCitzdGF0aWMgaW50IHJlYXV0aF9jYiggc3RydWN0IG1zZyAqKiBtc2csIHN0cnVjdCBhdnAgKiBhdnAsIHN0cnVjdCBzZXNzaW9uICogc2Vzcywgdm9pZCAqIG9wYXF1ZSwgZW51bSBkaXNwX2FjdGlvbiAqIGFjdCkKK3sKKyAgICAgICBzdHJ1Y3QgbXNnICphbnMsICpxcnk7CisgICAgICAgc3RydWN0IGF2cCAqIGE7CisKKyAgICAgICBUUkFDRV9FTlRSWSgiJXAgJXAgJXAgJXAiLCBtc2csIGF2cCwgc2VzcywgYWN0KTsKKyAgICAgICAKKyAgICAgICBpZiAobXNnID09IE5VTEwpCisJICAgICAgIHJldHVybiBFSU5WQUw7CisgICAgICAgCisgICAgICAgCisgICAgICAgLyogQ3JlYXRlIGFuc3dlciBoZWFkZXIgKi8KKyAgICAgICBxcnkgPSAqbXNnOworICAgICAgIENIRUNLX0ZDVCggZmRfbXNnX25ld19hbnN3ZXJfZnJvbV9yZXEgKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIG1zZywgMCApICk7CisgICAgICAgYW5zID0gKm1zZzsKKyAgICAgICAKKyAgICAgICAvKiBTZXQgdGhlIE9yaWdpbi1Ib3N0LCBPcmlnaW4tUmVhbG0sIFJlc3VsdC1Db2RlIEFWUHMgKi8KKyAgICAgICBDSEVDS19GQ1QoIGZkX21zZ19yZXNjb2RlX3NldCggYW5zLCAiRElBTUVURVJfU1VDQ0VTUyIsIE5VTEwsIE5VTEwsIDEgKSApOworICAgICAgIAorICAgICAgIC8qIFNlbmQgdGhlIGFuc3dlciAqLworICAgICAgIENIRUNLX0ZDVCggZmRfbXNnX3NlbmQoIG1zZywgTlVMTCwgTlVMTCApICk7CisgICAgICAgCisgICAgICAgCisKK30KK3N0YXRpYyBpbnQgZGNjYV9hbnNfZnJvbV9yZXEoIHN0cnVjdCBkaWN0X29iamVjdCAqIG9iaiwgc3RydWN0IG1zZyAqcXJ5LCBzdHJ1Y3QgbXNnICoqbXNnKQoreworICAgICAgIHN0cnVjdCBhdnAgKmF2cCAgPSBOVUxMOworICAgICAgIHN0cnVjdCBhdnBfaGRyICogYXZwZGF0YTsKKyAgICBpbnQgIHJjID0gLTE7CisKKyAgICBDSEVDS19GQ1QoZmRfbXNnX3NlYXJjaF9hdnAoIHFyeSwgb2JqLCAmYXZwKSk7CisgICAgQ0hFQ0tfRkNUKGZkX21zZ19hdnBfaGRyKGF2cCwgJmF2cGRhdGEpKTsKKyAgICBhdnAgPSBOVUxMOworCisgICAgICAgQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfYXZwX25ldyAoIG9iaiwgMCwgJmF2cCApLCBnb3RvIG91dCAgKTsKKyAgICAgICBDSEVDS19GQ1RfRE8oIGZkX21zZ19hdnBfc2V0dmFsdWUoIGF2cCwgYXZwZGF0YS0+YXZwX3ZhbHVlICksIGdvdG8gb3V0ICApOworICAgICAgIENIRUNLX0ZDVF9ETyggZmRfbXNnX2F2cF9hZGQoICptc2csIE1TR19CUldfTEFTVF9DSElMRCwgYXZwICksIGdvdG8gb3V0ICApOworCisgcmMgPSAwOworb3V0OgorIHJldHVybiByYzsKKworfQorLyogRHVtbXkgY2NyIHdoaWNoIDoKKyAgIFJlYWQgdGhlIGNjLXJlcS10eXBlICYmIGNjLXJlcS1udW1iZXIgZnJvbSB0aGUgbXNnIGFuZCBzdGljayBpdCBiYWNrCisgIGluIHRoZSByZXBseQorCisqLworc3RhdGljIGludCBjY3JfY2IoIHN0cnVjdCBtc2cgKiogbXNnLCBzdHJ1Y3QgYXZwICogcl9hdnAsIHN0cnVjdCBzZXNzaW9uICogc2Vzcywgdm9pZCAqIG9wYXF1ZSwgZW51bSBkaXNwX2FjdGlvbiAqIGFjdCkKK3sKKyAgICAgICBzdHJ1Y3QgbXNnICphbnMsICpxcnk7CisgICAgICAgc3RydWN0IGF2cCAqYXZwICA9IE5VTEw7CisgICAgICAgc3RydWN0IGF2cF9oZHIgKiBhdnBfZGF0YTsKKyAgICBpbnQgcmMgID0gLSAxOyAKKworICAgICAgIFRSQUNFX0VOVFJZKCIlcCAlcCAlcCAlcCIsIG1zZywgcl9hdnAsIHNlc3MsIGFjdCk7CisgICAgICAgCisgICAgICAgaWYgKG1zZyA9PSBOVUxMKQorCSAgICAgICByZXR1cm4gRUlOVkFMOworICAgICAgIAorICAgICAgIAorICAgICAgIC8qIENyZWF0ZSBhbnN3ZXIgaGVhZGVyICovCisgICAgICAgcXJ5ID0gKm1zZzsKKyAgICAgICBDSEVDS19GQ1RfRE8oIGZkX21zZ19uZXdfYW5zd2VyX2Zyb21fcmVxICggZmRfZ19jb25maWctPmNuZl9kaWN0LCBtc2csIDAgKSAsIGdvdG8gb3V0KTsKKyAgICAgICBhbnMgPSAqbXNnOworICAgICAgIAorICAgICAgIC8qIFNldCB0aGUgT3JpZ2luLUhvc3QsIE9yaWdpbi1SZWFsbSwgUmVzdWx0LUNvZGUgQVZQcyAqLworICAgICAgIENIRUNLX0ZDVF9ETyggZmRfbXNnX3Jlc2NvZGVfc2V0KCBhbnMsICJESUFNRVRFUl9TVUNDRVNTIiwgTlVMTCwgTlVMTCwgMSApLCBnb3RvIG91dCApOworCisvLyBHZXQgdGhlIGF1dGhfYXBwX2lkIGFuZCBmcm9tIHRoZSByZXBseSBhbmQgc2V0IGl0IGluIHRoZSByZXBseSAKKyAgICBDSEVDS19GQ1RfRE8oZGNjYV9hbnNfZnJvbV9yZXEoIGF1dGhfYXBwX2lkLCBxcnksIG1zZyksIGdvdG8gb3V0KTsKKyAgICBDSEVDS19GQ1RfRE8oZGNjYV9hbnNfZnJvbV9yZXEoIGNjX3JlcV90eXBlLCBxcnksIG1zZyksIGdvdG8gb3V0KTsKKyAgICBDSEVDS19GQ1RfRE8oZGNjYV9hbnNfZnJvbV9yZXEoIGNjX3JlcV9udW0sIHFyeSwgbXNnKSwgZ290byBvdXQpOworCisgICAgICAgLyogU2VuZCB0aGUgYW5zd2VyICovCisgICAgICAgQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfc2VuZCggbXNnLCBOVUxMLCBOVUxMICksIGdvdG8gb3V0ICk7CisgICAgcmMgID0gMDsKKyAgb3V0OgorICAgIC8vRnJlZSB1cCB0aGUgbWVtb3J5CisgICAgcmV0dXJuIHJjIDsKKworfQoraW50IHNlbmRfcmVhdXRoX3JlcSgpCisKK3sKKyAgICAgICBzdHJ1Y3QgZGljdF9hcHBsaWNhdGlvbl9kYXRhIGFwcGRhdGE7CisgICAgc3RydWN0IGF2cCAqYXZwID0gTlVMTDsKKyAgICB1bmlvbiBhdnBfdmFsdWUgdmFsIDsKKyAgICBzdHJ1Y3QgbXNnICpxcnksICphbnMgPSBOVUxMOworICAgIHN0cnVjdCBtc2cgKnJlcSA9IE5VTEw7CisgICAgc3RydWN0IG1zZyAqdHN0ID0gTlVMTDsKKyAgICAgICBzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdXRoX2FwcF9pZCA9IE5VTEwsICpyZWF1dGhfcmVxX3R5cGUgPSBOVUxMOworCisvLyAgICBxcnkgPSAqbXNnOworCisKKyAgICB7IC8vIFNlbmQgbmV3IHJlYXV0aCByZXF1ZXN0CisKKwkgICBDSEVDS19GQ1RfRE8oIGZkX21zZ19uZXcoIHJlYXV0aF9jbWQsIE1TR0ZMX0FMTE9DX0VURUlELCAmcmVxICksIGdvdG8gb3V0ICk7CisgICAgICAgQ0hFQ0tfRkNUKCAgZmRfZGljdF9nZXR2YWwoZ3hfaW5mLCAmYXBwZGF0YSkgICk7CisgICAgCisgICAgICAgc3RydWN0IG1zZ19oZHIgKiBoZWFkZXIgPSBOVUxMOworCSAgICAgICBDSEVDS19GQ1QoIGZkX21zZ19oZHIgKCByZXEsICZoZWFkZXIgKSApOworCSAgICAgICBoZWFkZXItPm1zZ19hcHBsID0gYXBwZGF0YS5hcHBsaWNhdGlvbl9pZDsKKworICAgIH0KKworICAgICAgIC8qIFNlc3Npb24tSWQgKi8KKyAgICAgICB7CisJICAgICAgIG9zMF90IHNpZDsKKwkgICAgICAgc2l6ZV90IHNpZGxlbjsKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKnNlc3NfaWQgPSBOVUxMOworICAgICAgIENIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiU2Vzc2lvbi1JZCIsICZzZXNzX2lkLCBFTk9FTlQpICk7CisKKwkgICAgICAgLy9DSEVDS19GQ1RfRE8oIGZkX3Nlc3NfZ2V0c2lkICggc2VzcywgJnNpZCwgJnNpZGxlbiApLCBnb3RvIG91dCApOworCSAgICAgICBDSEVDS19GQ1RfRE8oIGZkX21zZ19hdnBfbmV3ICggc2Vzc19pZCwgMCwgJmF2cCApLCBnb3RvIG91dCApOworCSAgICAgICB2YWwub3MuZGF0YSA9IHNpZDsKKwkgICAgICAgdmFsLm9zLmxlbiAgPSBzaWRsZW47CisJICAgICAgIENIRUNLX0ZDVF9ETyggZmRfbXNnX2F2cF9zZXR2YWx1ZSggYXZwLCAmdmFsICksIGdvdG8gb3V0ICk7CisJICAgICAgIENIRUNLX0ZDVF9ETyggZmRfbXNnX2F2cF9hZGQoIHJlcSwgTVNHX0JSV19GSVJTVF9DSElMRCwgYXZwICksIGdvdG8gb3V0ICk7CisJICAgICAgIAorICAgICAgIH0KKworICAgICAgIC8qIFNldCB0aGUgRGVzdGluYXRpb24tUmVhbG0gQVZQICovCisgICAgICAgeworCSAgICAgICBDSEVDS19GQ1RfRE8oIGZkX21zZ19hdnBfbmV3ICggZGVzdF9yZWFsbSwgMCwgJmF2cCApLCBnb3RvIG91dCAgKTsKKwkgICAgICAgdmFsLm9zLmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSgidm0iKTsKKwkgICAgICAgdmFsLm9zLmxlbiAgPSBzdHJsZW4oInZtIik7CisJICAgICAgIENIRUNLX0ZDVF9ETyggZmRfbXNnX2F2cF9zZXR2YWx1ZSggYXZwLCAmdmFsICksIGdvdG8gb3V0ICApOworCSAgICAgICBDSEVDS19GQ1RfRE8oIGZkX21zZ19hdnBfYWRkKCByZXEsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwICksIGdvdG8gb3V0ICApOworICAgICAgIH0KKyAgICAgICAKKyAgICAgICAvKiBTZXQgdGhlIERlc3RpbmF0aW9uLUhvc3QgQVZQIGlmIG5lZWRlZCovCisvLyAgICAgaWYgKHRhX2NvbmYtPmRlc3RfaG9zdCkgeworCSAgICAgICBDSEVDS19GQ1RfRE8oIGZkX21zZ19hdnBfbmV3ICggZGVzdF9ob3N0LCAwLCAmYXZwICksIGdvdG8gb3V0ICApOworCSAgICAgICB2YWwub3MuZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopKCJjbGkudm0iKTsKKwkgICAgICAgdmFsLm9zLmxlbiAgPSBzdHJsZW4oImNsaS52bSIpOworCSAgICAgICBDSEVDS19GQ1RfRE8oIGZkX21zZ19hdnBfc2V0dmFsdWUoIGF2cCwgJnZhbCApLCBnb3RvIG91dCAgKTsKKwkgICAgICAgQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfYXZwX2FkZCggcmVxLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCApLCBnb3RvIG91dCAgKTsKKy8vICAgICB9CisgICAgCisgICAgICAgLyogU2V0IE9yaWdpbi1Ib3N0ICYgT3JpZ2luLVJlYWxtICovCisgICAgICAgQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfYWRkX29yaWdpbiAoIHJlcSwgMCApLCBnb3RvIG91dCAgKTsKKworICAgICAgIC8qIEFVVEhfQXBwbGljYXRpb24tSUQgKi8KKyAgICAgICBDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIkF1dGgtQXBwbGljYXRpb24tSWQiLCAmYXV0aF9hcHBfaWQsIEVOT0VOVCkgKTsKKwkgICAgICAgQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfYXZwX25ldyAoIGF1dGhfYXBwX2lkLCAwLCAmYXZwICksIGdvdG8gb3V0ICApOworCSAgICAgICB2YWwuaTMyID0gYXBwZGF0YS5hcHBsaWNhdGlvbl9pZDsKKwkgICAgICAgQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfYXZwX3NldHZhbHVlKCBhdnAsICZ2YWwgKSwgZ290byBvdXQgICk7CisJICAgICAgIENIRUNLX0ZDVF9ETyggZmRfbXNnX2F2cF9hZGQoIHJlcSwgTVNHX0JSV19MQVNUX0NISUxELCBhdnAgKSwgZ290byBvdXQgICk7CisKKyAgICAgICAvKiBSZS1BdXRoIFJlcXVlc3QgVHlwZSAqLworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiUmUtQXV0aC1SZXF1ZXN0LVR5cGUiLCAmcmVhdXRoX3JlcV90eXBlLCBFTk9FTlQpICk7CisJICAgQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfYXZwX25ldyAoIHJlYXV0aF9yZXFfdHlwZSwgMCwgJmF2cCApLCBnb3RvIG91dCAgKTsKKwl2YWwuaTMyID0gMDsKKwlDSEVDS19GQ1RfRE8oIGZkX21zZ19hdnBfc2V0dmFsdWUoIGF2cCwgJnZhbCApLCBnb3RvIG91dCAgKTsKKwlDSEVDS19GQ1RfRE8oIGZkX21zZ19hdnBfYWRkKCByZXEsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwICksIGdvdG8gb3V0ICApOworCisKKyAgICAgICBDSEVDS19GQ1RfRE8oIGZkX21zZ19zZW5kKCAmcmVxLCBjcl9jYl9hbnMsIE5VTEwgKSwgZ290byBvdXQgKTsKK291dDoKKyAgICByZXR1cm4gMCA7CisKKworfQorLyogU2VhcmNoIGEgZ2l2ZW4gQVZQIG1vZGVsIGluIGFuIEFWUCAoZXh0cmFjdGVkIGZyb20gbGliZnJlZWRpYW1ldGVyL21lc3NhZ2UuYyApICovCitpbnQgZmRfYXZwX3NlYXJjaF9hdnAgKCBzdHJ1Y3QgYXZwICogZ3JvdXBlZGF2cCwgc3RydWN0IGRpY3Rfb2JqZWN0ICogd2hhdCwgc3RydWN0IGF2cCAqKiBhdnAgKQoreworICAgICAgIHN0cnVjdCBhdnAgKiBuZXh0YXZwOworICAgICAgIHN0cnVjdCBhdnBfaGRyICogbmV4dGF2cGhkcjsKKyAgICAgICBzdHJ1Y3QgZGljdF9hdnBfZGF0YSAgICBkaWN0ZGF0YTsKKyAgICAgICAKKyAgICAgICAKKyAgICAgICBUUkFDRV9FTlRSWSgiJXAgJXAgJXAiLCBncm91cGVkYXZwLCB3aGF0LCBhdnApOworICAgICAgIAorICAgICAgIENIRUNLX0ZDVCggIGZkX2RpY3RfZ2V0dmFsKHdoYXQsICZkaWN0ZGF0YSkgICk7CisgICAgICAgCisgICAgICAgLy8gTG9vcCBvbmx5IGluIHRoZSBncm91cCBBVlAgCisgICAgICAgQ0hFQ0tfRkNUKCAgZmRfbXNnX2Jyb3dzZShncm91cGVkYXZwLCBNU0dfQlJXX0ZJUlNUX0NISUxELCAodm9pZCAqKSZuZXh0YXZwLCBOVUxMKSAgKTsKKyAgICAgICBDSEVDS19GQ1QoIGZkX21zZ19hdnBfaGRyKCBuZXh0YXZwLCAmbmV4dGF2cGhkciApICApOworICAgICAgIAorICAgICAgIHdoaWxlIChuZXh0YXZwaGRyKSB7CisJICAgICAgIAorCSAgICAgICBpZiAoIChuZXh0YXZwaGRyLT5hdnBfY29kZSAgID09IGRpY3RkYXRhLmF2cF9jb2RlKSAmJiAobmV4dGF2cGhkci0+YXZwX3ZlbmRvciA9PSBkaWN0ZGF0YS5hdnBfdmVuZG9yKSApIC8vIGFsd2F5cyAwIGlmIG5vIFZlbmRvciBmbGFnCisJICAgICAgIHsKKwkJICAgICAgIGJyZWFrOworCSAgICAgICB9CisJICAgICAgIAorCSAgICAgICAvLyBPdGhlcndpc2UgbW92ZSB0byBuZXh0IEFWUCBpbiB0aGUgZ3JvdXBlZCBBVlAgCisJICAgICAgIENIRUNLX0ZDVCggZmRfbXNnX2Jyb3dzZShuZXh0YXZwLCBNU0dfQlJXX05FWFQsICh2b2lkICopJm5leHRhdnAsIE5VTEwpICk7CisJICAgICAgIAorCSAgICAgICBpZihuZXh0YXZwIT1OVUxMKQorCSAgICAgICB7CisJCSAgICAgICBDSEVDS19GQ1QoIGZkX21zZ19hdnBfaGRyKCBuZXh0YXZwLCAmbmV4dGF2cGhkciApICApOworCSAgICAgICB9CisJICAgICAgIGVsc2UKKwkJICAgICAgIG5leHRhdnBoZHI9TlVMTDsKKyAgICAgICB9CisgICAgICAgaWYgKGF2cCkKKwkgICAgICAgKmF2cCA9IG5leHRhdnA7CisgICAgICAgCisgICAgICAgaWYgKGF2cCAmJiBuZXh0YXZwKSB7CisJICAgICAgIHN0cnVjdCBkaWN0aW9uYXJ5ICogZGljdDsKKwkgICAgICAgQ0hFQ0tfRkNUKCBmZF9kaWN0X2dldGRpY3QoIHdoYXQsICZkaWN0KSApOworCSAgICAgICBDSEVDS19GQ1RfRE8oIGZkX21zZ19wYXJzZV9kaWN0KCBuZXh0YXZwLCBkaWN0LCBOVUxMICksICApOworICAgICAgIH0KKyAgICAgICAKKyAgICAgICBpZiAoYXZwIHx8IG5leHRhdnApCisJICAgICAgIHJldHVybiAwOworICAgICAgIGVsc2UKKwkgICAgICAgcmV0dXJuIEVOT0VOVDsKK30KKworc3RhdGljIGludCBjY2FfY2IoIHN0cnVjdCBtc2cgKiogbXNnLCAKKwkJICAgc3RydWN0IGF2cCAqIHRfYXZwICwgCisJCSAgIHN0cnVjdCBzZXNzaW9uICogc2VzcywgCisJCSAgIHZvaWQgKiBvcGFxdWUsIAorCQkgICBlbnVtIGRpc3BfYWN0aW9uICogYWN0KQoreworICAgIHN0cnVjdCBhdnAgKmF2cCA9IE5VTEwsICpnX2F2cCA9IE5VTEw7CisgICAgc3RydWN0IG1zZyAqcmVxID0gKm1zZzsKKyAgICBzdHJ1Y3QgZGljdF9vYmplY3QgKmNocmdfcnVsZV9uYW1lID0gTlVMTCA7CisgICAgc3RydWN0IGRpY3Rfb2JqZWN0ICpjaHJnX3J1bGVfZ3JwID0gTlVMTCA7CisgICAgICAgc3RydWN0IGF2cF9oZHIgKiBhdnBkYXRhID0gTlVMTDsKKyAgICBzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBncnVsZV9yZXEgPSAgIHtWRU5ET1JfSURfM0dQUCwgMCwiQ2hhcmdpbmctUnVsZS1JbnN0YWxsIn07CisgICAgc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgcnVsZV9yZXEgPSAgIHtWRU5ET1JfSURfM0dQUCwgMCwiQ2hhcmdpbmctUnVsZS1OYW1lIn07CisgICAgc3RydWN0IHRpbWVzcGVjIHNlc3NfdGltZW91dDsKKyAgICBzdHJ1Y3QgZ3hfc21fdCAqZ3hfc20gPSBOVUxMOworICAvLyAgc3RydWN0IHNlc3Npb24gKnNlc3MgPSBOVUxMOworICAgIAorICAgIAorICAgICAgIENIRUNLX0ZDVChmZF9zZXNzX3N0YXRlX3JldHJpZXZlKCBnX2hkbHIsIHNlc3MsICZneF9zbSkpOworICAgIGZkX3Nlc3NfZHVtcCggMCwgc2Vzcyk7CisgICAgaWYoZ3hfc20tPnN0YXRlICE9IFNUQVRFX0ZJTkFMKSB7IAorCisJICAgICAgIENIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdAorCQkJCSAgICwgRElDVF9BVlAsIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IKKwkJCQkgICAsICZncnVsZV9yZXEgCisJCQkJICAgLCAmY2hyZ19ydWxlX2dycAorCQkJCSAgICwgRU5PRU5UKSk7CisgICAgCisJICAgQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0CisJCQkJICAgLCBESUNUX0FWUCwgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUgorCQkJCSAgICwgJnJ1bGVfcmVxIAorCQkJCSAgICwgJmNocmdfcnVsZV9uYW1lCisJCQkJICAgLCBFTk9FTlQpKTsKKworCisJQ0hFQ0tfRkNUKGZkX21zZ19zZWFyY2hfYXZwICggKm1zZywgY2hyZ19ydWxlX2dycCwgJmdfYXZwICkpOworCUNIRUNLX0ZDVChmZF9hdnBfc2VhcmNoX2F2cChnX2F2cCwgY2hyZ19ydWxlX25hbWUsICZhdnApKTsKKworCWlmKGF2cCkgeworCSAgICAgICBDSEVDS19GQ1QoZmRfbXNnX2F2cF9oZHIoYXZwLCAmYXZwZGF0YSkpOworCX0gZWxzZSB7CisJICAgIHByaW50ZigiTlVMTCBBVlAgXG4iKTsKKwl9CisJcHJpbnRmKCJjaGFyZ2luZy1ydWxlLW5hbWUgJXNcbiIsIGF2cGRhdGEtPmF2cF92YWx1ZS0+b3MuZGF0YSk7CisJZ3hfc20tPnN0YXRlID0gU1RBVEVfRklOQUw7CisJZHVtcF9zZXNzX2V5ZWMoIHNlc3MsIF9fRlVOQ1RJT05fXyk7CisJcHJpbnRmKCJuZXh0IGR1bXBcbiIpOworCUNIRUNLX0ZDVChmZF9zZXNzX3N0YXRlX3N0b3JlKCBnX2hkbHIsIHNlc3MsICZneF9zbSkpOworCWZkX21zZ19mcmVlKCptc2cpOworCSptc2cgPSBOVUxMOworCisgICB9IGVsc2UgeworCXByaW50ZigiU2Vzc2lvbiB0ZXJtaW5hdGVkXG4iKTsKKwlmcmVlX2d4X3NtKGd4X3NtKTsKKwlmZF9tc2dfZnJlZSgqbXNnKTsKKwlmZF9zZXNzX3JlY2xhaW0oJnNlc3MpOworCSptc2cgPSBOVUxMOworICAgIH0KKyAgICBmZF9zZXNzX2R1bXAoIDAgLCBzZXNzKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGd4X2VudHJ5KGNoYXIgKiBjb25mZmlsZSkKK3sKKyByZXR1cm4gMDsKK30KK0VYVEVOU0lPTl9FTlRSWSggImFwcF9neCIsIGFwcF9neF9lbnRyeSwgImRpY3RfZGNjYV8zZ3BwIik7CisvL0VYVEVOU0lPTl9FTlRSWSggImFwcF9neCIsIGd4X2VudHJ5KTsKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGVzdF9HeC9yZWFkbWUudHh0IGIvY29udHJpYi90ZXN0X0d4L3JlYWRtZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI3ZDUxNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdGVzdF9HeC9yZWFkbWUudHh0CkBAIC0wLDAgKzEsNiBAQAorVGhpcyBjb250ZW50IHdhcyBjb250cmlidXRlZCBieSBLcmlzaG5hbiBTcmluaXZhc2FuIGZyb20gQWxsb3QgQ29tbXVuaWNhdGlvbi4KKworVGhlIGRpY3Rpb25hcnkgZW50cmllcyBtYXkgbmVlZCBzb21lIGFkanVzdG1lbnRzIHRvIAorbWF0Y2ggdGhlIGNvbnRlbnQgb2YgdGhlIGRpY3RfZGNjYV8zZ3BwIGV4dGVuc2lvbi4KKworVGhhbmsgeW91IEtyaXNobmFuIQpkaWZmIC0tZ2l0IGEvY29udHJpYi90b29scy9SRUFETUUgYi9jb250cmliL3Rvb2xzL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmIyMzVkCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi90b29scy9SRUFETUUKQEAgLTAsMCArMSwyIEBACitvcmdfdG9fZmQucGwgY29udmVydHMgb3JnIGZpbGVzIGxpa2UgZGlhbWV0ZXItcmZjcy5vcmcgdG8gQyBmcmFnbWVudHMKK3RoYXQgY2FuIGJlIGluY2x1ZGVkIGluIGZyZWVEaWFtZXRlciBjb2RlLgpkaWZmIC0tZ2l0IGEvY29udHJpYi90b29scy9kaWFtZXRlci1yZmNzLm9yZyBiL2NvbnRyaWIvdG9vbHMvZGlhbWV0ZXItcmZjcy5vcmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ5MmNhZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdG9vbHMvZGlhbWV0ZXItcmZjcy5vcmcKQEAgLTAsMCArMSwxODggQEAKK3wgQXR0cmlidXRlIE5hbWUgICAgICAgICAgICAgICAgICAgfCBDb2RlIHwgU2VjdGlvbiB8IERhdGEgICAgICAgIHwgTVVTVCB8IE1BWSB8IFNITEQgTk9UIHwgTVVTVCBOT1QgfCBFbmNyIHwKK3wgIyBSRkMgMzU4OCAtIERpYW1ldGVyICMgICAgICAgICAgfCAgICAgIHwgICAgICAgICB8ICAgICAgICAgICAgIHwgICAgICB8ICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgIHwKK3wgQWNjdC1JbnRlcmltLUludGVydmFsICAgICAgICAgICAgfCAgIDg1IHwgICA5LjguMiB8IFVuc2lnbmVkMzIgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgQWNjb3VudGluZy1SZWFsdGltZS1SZXF1aXJlZCAgICAgfCAgNDgzIHwgICA5LjguNyB8IEVudW1lcmF0ZWQgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgQWNjdC1NdWx0aS1TZXNzaW9uLUlkICAgICAgICAgICAgfCAgIDUwIHwgICA5LjguNSB8IFVURjhTdHJpbmcgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgQWNjb3VudGluZy1SZWNvcmQtTnVtYmVyICAgICAgICAgfCAgNDg1IHwgICA5LjguMyB8IFVuc2lnbmVkMzIgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgQWNjb3VudGluZy1SZWNvcmQtVHlwZSAgICAgICAgICAgfCAgNDgwIHwgICA5LjguMSB8IEVudW1lcmF0ZWQgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgQWNjb3VudGluZy1TZXNzaW9uLUlkICAgICAgICAgICAgfCAgIDQ0IHwgICA5LjguNCB8IE9jdGV0U3RyaW5nIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgQWNjb3VudGluZy1TdWItU2Vzc2lvbi1JZCAgICAgICAgfCAgMjg3IHwgICA5LjguNiB8IFVuc2lnbmVkNjQgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgQWNjdC1BcHBsaWNhdGlvbi1JZCAgICAgICAgICAgICAgfCAgMjU5IHwgICAgIDYuOSB8IFVuc2lnbmVkMzIgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBOICAgIHwKK3wgQXV0aC1BcHBsaWNhdGlvbi1JZCAgICAgICAgICAgICAgfCAgMjU4IHwgICAgIDYuOCB8IFVuc2lnbmVkMzIgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBOICAgIHwKK3wgQXV0aC1SZXF1ZXN0LVR5cGUgICAgICAgICAgICAgICAgfCAgMjc0IHwgICAgIDguNyB8IEVudW1lcmF0ZWQgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBOICAgIHwKK3wgQXV0aG9yaXphdGlvbi1MaWZldGltZSAgICAgICAgICAgfCAgMjkxIHwgICAgIDguOSB8IFVuc2lnbmVkMzIgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBOICAgIHwKK3wgQXV0aC1HcmFjZS1QZXJpb2QgICAgICAgICAgICAgICAgfCAgMjc2IHwgICAgOC4xMCB8IFVuc2lnbmVkMzIgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBOICAgIHwKK3wgQXV0aC1TZXNzaW9uLVN0YXRlICAgICAgICAgICAgICAgfCAgMjc3IHwgICAgOC4xMSB8IEVudW1lcmF0ZWQgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBOICAgIHwKK3wgUmUtQXV0aC1SZXF1ZXN0LVR5cGUgICAgICAgICAgICAgfCAgMjg1IHwgICAgOC4xMiB8IEVudW1lcmF0ZWQgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBOICAgIHwKK3wgQ2xhc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDI1IHwgICAgOC4yMCB8IE9jdGV0U3RyaW5nIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgRGVzdGluYXRpb24tSG9zdCAgICAgICAgICAgICAgICAgfCAgMjkzIHwgICAgIDYuNSB8IERpYW1JZGVudCAgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBOICAgIHwKK3wgRGVzdGluYXRpb24tUmVhbG0gICAgICAgICAgICAgICAgfCAgMjgzIHwgICAgIDYuNiB8IERpYW1JZGVudCAgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBOICAgIHwKK3wgRGlzY29ubmVjdC1DYXVzZSAgICAgICAgICAgICAgICAgfCAgMjczIHwgICA1LjQuMyB8IEVudW1lcmF0ZWQgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBOICAgIHwKK3wgRTJFLVNlcXVlbmNlLUFWUCAgICAgICAgICAgICAgICAgfCAgMzAwIHwgICAgNi4xNSB8IEdyb3VwZWQgICAgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgRXJyb3ItTWVzc2FnZSAgICAgICAgICAgICAgICAgICAgfCAgMjgxIHwgICAgIDcuMyB8IFVURjhTdHJpbmcgIHwgICAgICB8IFAgICB8ICAgICAgICAgIHwgVixNICAgICAgfCBOICAgIHwKK3wgRXJyb3ItUmVwb3J0aW5nLUhvc3QgICAgICAgICAgICAgfCAgMjk0IHwgICAgIDcuNCB8IERpYW1JZGVudCAgIHwgICAgICB8IFAgICB8ICAgICAgICAgIHwgVixNICAgICAgfCBOICAgIHwKK3wgRXZlbnQtVGltZXN0YW1wICAgICAgICAgICAgICAgICAgfCAgIDU1IHwgICAgOC4yMSB8IFRpbWUgICAgICAgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBOICAgIHwKK3wgRXhwZXJpbWVudGFsLVJlc3VsdCAgICAgICAgICAgICAgfCAgMjk3IHwgICAgIDcuNiB8IEdyb3VwZWQgICAgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBOICAgIHwKK3wgRXhwZXJpbWVudGFsLVJlc3VsdC1Db2RlICAgICAgICAgfCAgMjk4IHwgICAgIDcuNyB8IFVuc2lnbmVkMzIgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBOICAgIHwKK3wgRmFpbGVkLUFWUCAgICAgICAgICAgICAgICAgICAgICAgfCAgMjc5IHwgICAgIDcuNSB8IEdyb3VwZWQgICAgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBOICAgIHwKK3wgRmlybXdhcmUtUmV2aXNpb24gICAgICAgICAgICAgICAgfCAgMjY3IHwgICA1LjMuNCB8IFVuc2lnbmVkMzIgIHwgICAgICB8ICAgICB8ICAgICAgICAgIHwgUCxWLE0gICAgfCBOICAgIHwKK3wgSG9zdC1JUC1BZGRyZXNzICAgICAgICAgICAgICAgICAgfCAgMjU3IHwgICA1LjMuNSB8IEFkZHJlc3MgICAgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBOICAgIHwKK3wgSW5iYW5kLVNlY3VyaXR5LUlkICAgICAgICAgICAgICAgfCAgMjk5IHwgICAgNi4xMCB8IFVuc2lnbmVkMzIgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBOICAgIHwKK3wgTXVsdGktUm91bmQtVGltZS1PdXQgICAgICAgICAgICAgfCAgMjcyIHwgICAgOC4xOSB8IFVuc2lnbmVkMzIgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgT3JpZ2luLUhvc3QgICAgICAgICAgICAgICAgICAgICAgfCAgMjY0IHwgICAgIDYuMyB8IERpYW1JZGVudCAgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBOICAgIHwKK3wgT3JpZ2luLVJlYWxtICAgICAgICAgICAgICAgICAgICAgfCAgMjk2IHwgICAgIDYuNCB8IERpYW1JZGVudCAgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBOICAgIHwKK3wgT3JpZ2luLVN0YXRlLUlkICAgICAgICAgICAgICAgICAgfCAgMjc4IHwgICAgOC4xNiB8IFVuc2lnbmVkMzIgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBOICAgIHwKK3wgUHJvZHVjdC1OYW1lICAgICAgICAgICAgICAgICAgICAgfCAgMjY5IHwgICA1LjMuNyB8IFVURjhTdHJpbmcgIHwgICAgICB8ICAgICB8ICAgICAgICAgIHwgUCxWLE0gICAgfCBOICAgIHwKK3wgUHJveHktSG9zdCAgICAgICAgICAgICAgICAgICAgICAgfCAgMjgwIHwgICA2LjcuMyB8IERpYW1JZGVudCAgIHwgTSAgICB8ICAgICB8ICAgICAgICAgIHwgUCxWICAgICAgfCBOICAgIHwKK3wgUHJveHktSW5mbyAgICAgICAgICAgICAgICAgICAgICAgfCAgMjg0IHwgICA2LjcuMiB8IEdyb3VwZWQgICAgIHwgTSAgICB8ICAgICB8ICAgICAgICAgIHwgUCxWICAgICAgfCBOICAgIHwKK3wgUHJveHktU3RhdGUgICAgICAgICAgICAgICAgICAgICAgfCAgIDMzIHwgICA2LjcuNCB8IE9jdGV0U3RyaW5nIHwgTSAgICB8ICAgICB8ICAgICAgICAgIHwgUCxWICAgICAgfCBOICAgIHwKK3wgUmVkaXJlY3QtSG9zdCAgICAgICAgICAgICAgICAgICAgfCAgMjkyIHwgICAgNi4xMiB8IERpYW1VUkkgICAgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBOICAgIHwKK3wgUmVkaXJlY3QtSG9zdC1Vc2FnZSAgICAgICAgICAgICAgfCAgMjYxIHwgICAgNi4xMyB8IEVudW1lcmF0ZWQgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBOICAgIHwKK3wgUmVkaXJlY3QtTWF4LUNhY2hlLVRpbWUgICAgICAgICAgfCAgMjYyIHwgICAgNi4xNCB8IFVuc2lnbmVkMzIgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBOICAgIHwKK3wgUmVzdWx0LUNvZGUgICAgICAgICAgICAgICAgICAgICAgfCAgMjY4IHwgICAgIDcuMSB8IFVuc2lnbmVkMzIgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBOICAgIHwKK3wgUm91dGUtUmVjb3JkICAgICAgICAgICAgICAgICAgICAgfCAgMjgyIHwgICA2LjcuMSB8IERpYW1JZGVudCAgIHwgTSAgICB8ICAgICB8ICAgICAgICAgIHwgUCxWICAgICAgfCBOICAgIHwKK3wgU2Vzc2lvbi1JZCAgICAgICAgICAgICAgICAgICAgICAgfCAgMjYzIHwgICAgIDguOCB8IFVURjhTdHJpbmcgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgU2Vzc2lvbi1UaW1lb3V0ICAgICAgICAgICAgICAgICAgfCAgIDI3IHwgICAgOC4xMyB8IFVuc2lnbmVkMzIgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBOICAgIHwKK3wgU2Vzc2lvbi1CaW5kaW5nICAgICAgICAgICAgICAgICAgfCAgMjcwIHwgICAgOC4xNyB8IFVuc2lnbmVkMzIgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgU2Vzc2lvbi1TZXJ2ZXItRmFpbG92ZXIgICAgICAgICAgfCAgMjcxIHwgICAgOC4xOCB8IEVudW1lcmF0ZWQgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgU3VwcG9ydGVkLVZlbmRvci1JZCAgICAgICAgICAgICAgfCAgMjY1IHwgICA1LjMuNiB8IFVuc2lnbmVkMzIgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBOICAgIHwKK3wgVGVybWluYXRpb24tQ2F1c2UgICAgICAgICAgICAgICAgfCAgMjk1IHwgICAgOC4xNSB8IEVudW1lcmF0ZWQgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBOICAgIHwKK3wgVXNlci1OYW1lICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAxIHwgICAgOC4xNCB8IFVURjhTdHJpbmcgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgVmVuZG9yLUlkICAgICAgICAgICAgICAgICAgICAgICAgfCAgMjY2IHwgICA1LjMuMyB8IFVuc2lnbmVkMzIgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBOICAgIHwKK3wgVmVuZG9yLVNwZWNpZmljLUFwcGxpY2F0aW9uLUlkICAgfCAgMjYwIHwgICAgNi4xMSB8IEdyb3VwZWQgICAgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBOICAgIHwKK3wgIyBSRkMgNDAwNSAtIE5BUyAjICAgICAgICAgICAgICAgfCAgICAgIHwgICAgICAgICB8ICAgICAgICAgICAgIHwgICAgICB8ICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgIHwKK3wgTkFTLVBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA1IHwgICAgIDQuMiB8IFVuc2lnbmVkMzIgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgTkFTLVBvcnQtSWQgICAgICAgICAgICAgICAgICAgICAgfCAgIDg3IHwgICAgIDQuMyB8IFVURjhTdHJpbmcgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgTkFTLVBvcnQtVHlwZSAgICAgICAgICAgICAgICAgICAgfCAgIDYxIHwgICAgIDQuNCB8IEVudW1lcmF0ZWQgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgQ2FsbGVkLVN0YXRpb24tSWQgICAgICAgICAgICAgICAgfCAgIDMwIHwgICAgIDQuNSB8IFVURjhTdHJpbmcgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgQ2FsbGluZy1TdGF0aW9uLUlkICAgICAgICAgICAgICAgfCAgIDMxIHwgICAgIDQuNiB8IFVURjhTdHJpbmcgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgQ29ubmVjdC1JbmZvICAgICAgICAgICAgICAgICAgICAgfCAgIDc3IHwgICAgIDQuNyB8IFVURjhTdHJpbmcgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgT3JpZ2luYXRpbmctTGluZS1JbmZvICAgICAgICAgICAgfCAgIDk0IHwgICAgIDQuOCB8IE9jdGV0U3RyaW5nIHwgICAgICB8IE0sUCB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgUmVwbHktTWVzc2FnZSAgICAgICAgICAgICAgICAgICAgfCAgIDE4IHwgICAgIDQuOSB8IFVURjhTdHJpbmcgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgVXNlci1QYXNzd29yZCAgICAgICAgICAgICAgICAgICAgfCAgICAyIHwgICAgIDUuMSB8IE9jdGV0U3RyaW5nIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgUGFzc3dvcmQtUmV0cnkgICAgICAgICAgICAgICAgICAgfCAgIDc1IHwgICAgIDUuMiB8IFVuc2lnbmVkMzIgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgUHJvbXB0ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDc2IHwgICAgIDUuMyB8IEVudW1lcmF0ZWQgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgQ0hBUC1BdXRoICAgICAgICAgICAgICAgICAgICAgICAgfCAgNDAyIHwgICAgIDUuNCB8IEdyb3VwZWQgICAgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgQ0hBUC1BbGdvcml0aG0gICAgICAgICAgICAgICAgICAgfCAgNDAzIHwgICAgIDUuNSB8IEVudW1lcmF0ZWQgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgQ0hBUC1JZGVudCAgICAgICAgICAgICAgICAgICAgICAgfCAgNDA0IHwgICAgIDUuNiB8IE9jdGV0U3RyaW5nIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgQ0hBUC1SZXNwb25zZSAgICAgICAgICAgICAgICAgICAgfCAgNDA1IHwgICAgIDUuNyB8IE9jdGV0U3RyaW5nIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgQ0hBUC1DaGFsbGVuZ2UgICAgICAgICAgICAgICAgICAgfCAgIDYwIHwgICAgIDUuOCB8IE9jdGV0U3RyaW5nIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgQVJBUC1QYXNzd29yZCAgICAgICAgICAgICAgICAgICAgfCAgIDcwIHwgICAgIDUuOSB8IE9jdGV0U3RyaW5nIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgQVJBUC1DaGFsbGVuZ2UtUmVzcG9uc2UgICAgICAgICAgfCAgIDg0IHwgICAgNS4xMCB8IE9jdGV0U3RyaW5nIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgQVJBUC1TZWN1cml0eSAgICAgICAgICAgICAgICAgICAgfCAgIDczIHwgICAgNS4xMSB8IFVuc2lnbmVkMzIgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgQVJBUC1TZWN1cml0eS1EYXRhICAgICAgICAgICAgICAgfCAgIDc0IHwgICAgNS4xMiB8IE9jdGV0U3RyaW5nIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgU2VydmljZS1UeXBlICAgICAgICAgICAgICAgICAgICAgfCAgICA2IHwgICAgIDYuMSB8IEVudW1lcmF0ZWQgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgQ2FsbGJhY2stTnVtYmVyICAgICAgICAgICAgICAgICAgfCAgIDE5IHwgICAgIDYuMiB8IFVURjhTdHJpbmcgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgQ2FsbGJhY2stSWQgICAgICAgICAgICAgICAgICAgICAgfCAgIDIwIHwgICAgIDYuMyB8IFVURjhTdHJpbmcgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgSWRsZS1UaW1lb3V0ICAgICAgICAgICAgICAgICAgICAgfCAgIDI4IHwgICAgIDYuNCB8IFVuc2lnbmVkMzIgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgUG9ydC1MaW1pdCAgICAgICAgICAgICAgICAgICAgICAgfCAgIDYyIHwgICAgIDYuNSB8IFVuc2lnbmVkMzIgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgTkFTLUZpbHRlci1SdWxlICAgICAgICAgICAgICAgICAgfCAgNDAwIHwgICAgIDYuNiB8IElQRmx0clJ1bGUgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgRmlsdGVyLUlkICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDExIHwgICAgIDYuNyB8IFVURjhTdHJpbmcgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgQ29uZmlndXJhdGlvbi1Ub2tlbiAgICAgICAgICAgICAgfCAgIDc4IHwgICAgIDYuOCB8IE9jdGV0U3RyaW5nIHwgTSAgICB8ICAgICB8ICAgICAgICAgIHwgUCxWICAgICAgfCAgICAgIHwKK3wgUW9TLUZpbHRlci1SdWxlICAgICAgICAgICAgICAgICAgfCAgNDA3IHwgICAgIDYuOSB8IFFvU0ZsdHJSdWxlIHwgICAgICB8ICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgIHwKK3wgRnJhbWVkLVByb3RvY29sICAgICAgICAgICAgICAgICAgfCAgICA3IHwgIDYuMTAuMSB8IEVudW1lcmF0ZWQgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgRnJhbWVkLVJvdXRpbmcgICAgICAgICAgICAgICAgICAgfCAgIDEwIHwgIDYuMTAuMiB8IEVudW1lcmF0ZWQgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgRnJhbWVkLU1UVSAgICAgICAgICAgICAgICAgICAgICAgfCAgIDEyIHwgIDYuMTAuMyB8IFVuc2lnbmVkMzIgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgRnJhbWVkLUNvbXByZXNzaW9uICAgICAgICAgICAgICAgfCAgIDEzIHwgIDYuMTAuNCB8IEVudW1lcmF0ZWQgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgRnJhbWVkLUlQLUFkZHJlc3MgICAgICAgICAgICAgICAgfCAgICA4IHwgIDYuMTEuMSB8IE9jdGV0U3RyaW5nIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgRnJhbWVkLUlQLU5ldG1hc2sgICAgICAgICAgICAgICAgfCAgICA5IHwgIDYuMTEuMiB8IE9jdGV0U3RyaW5nIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgRnJhbWVkLVJvdXRlICAgICAgICAgICAgICAgICAgICAgfCAgIDIyIHwgIDYuMTEuMyB8IFVURjhTdHJpbmcgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgRnJhbWVkLVBvb2wgICAgICAgICAgICAgICAgICAgICAgfCAgIDg4IHwgIDYuMTEuNCB8IE9jdGV0U3RyaW5nIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgRnJhbWVkLUludGVyZmFjZS1JZCAgICAgICAgICAgICAgfCAgIDk2IHwgIDYuMTEuNSB8IFVuc2lnbmVkNjQgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgRnJhbWVkLUlQdjYtUHJlZml4ICAgICAgICAgICAgICAgfCAgIDk3IHwgIDYuMTEuNiB8IE9jdGV0U3RyaW5nIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgRnJhbWVkLUlQdjYtUm91dGUgICAgICAgICAgICAgICAgfCAgIDk5IHwgIDYuMTEuNyB8IFVURjhTdHJpbmcgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgRnJhbWVkLUlQdjYtUG9vbCAgICAgICAgICAgICAgICAgfCAgMTAwIHwgIDYuMTEuOCB8IE9jdGV0U3RyaW5nIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgRnJhbWVkLUlQWC1OZXR3b3JrICAgICAgICAgICAgICAgfCAgIDIzIHwgIDYuMTIuMSB8IFVURjhTdHJpbmcgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgRnJhbWVkLUFwcGxldGFsay1MaW5rICAgICAgICAgICAgfCAgIDM3IHwgIDYuMTMuMSB8IFVuc2lnbmVkMzIgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgRnJhbWVkLUFwcGxldGFsay1OZXR3b3JrICAgICAgICAgfCAgIDM4IHwgIDYuMTMuMiB8IFVuc2lnbmVkMzIgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgRnJhbWVkLUFwcGxldGFsay1ab25lICAgICAgICAgICAgfCAgIDM5IHwgIDYuMTMuMyB8IE9jdGV0U3RyaW5nIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgQVJBUC1GZWF0dXJlcyAgICAgICAgICAgICAgICAgICAgfCAgIDcxIHwgIDYuMTQuMSB8IE9jdGV0U3RyaW5nIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgQVJBUC1ab25lLUFjY2VzcyAgICAgICAgICAgICAgICAgfCAgIDcyIHwgIDYuMTQuMiB8IEVudW1lcmF0ZWQgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgTG9naW4tSVAtSG9zdCAgICAgICAgICAgICAgICAgICAgfCAgIDE0IHwgIDYuMTUuMSB8IE9jdGV0U3RyaW5nIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgTG9naW4tSVB2Ni1Ib3N0ICAgICAgICAgICAgICAgICAgfCAgIDk4IHwgIDYuMTUuMiB8IE9jdGV0U3RyaW5nIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgTG9naW4tU2VydmljZSAgICAgICAgICAgICAgICAgICAgfCAgIDE1IHwgIDYuMTUuMyB8IEVudW1lcmF0ZWQgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgTG9naW4tVENQLVBvcnQgICAgICAgICAgICAgICAgICAgfCAgIDE2IHwgIDYuMTYuMSB8IFVuc2lnbmVkMzIgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgTG9naW4tTEFULVNlcnZpY2UgICAgICAgICAgICAgICAgfCAgIDM0IHwgIDYuMTcuMSB8IE9jdGV0U3RyaW5nIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgTG9naW4tTEFULU5vZGUgICAgICAgICAgICAgICAgICAgfCAgIDM1IHwgIDYuMTcuMiB8IE9jdGV0U3RyaW5nIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgTG9naW4tTEFULUdyb3VwICAgICAgICAgICAgICAgICAgfCAgIDM2IHwgIDYuMTcuMyB8IE9jdGV0U3RyaW5nIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgTG9naW4tTEFULVBvcnQgICAgICAgICAgICAgICAgICAgfCAgIDYzIHwgIDYuMTcuNCB8IE9jdGV0U3RyaW5nIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgVHVubmVsaW5nICAgICAgICAgICAgICAgICAgICAgICAgfCAgNDAxIHwgICAgIDcuMSB8IEdyb3VwZWQgICAgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBOICAgIHwKK3wgVHVubmVsLVR5cGUgICAgICAgICAgICAgICAgICAgICAgfCAgIDY0IHwgICAgIDcuMiB8IEVudW1lcmF0ZWQgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgVHVubmVsLU1lZGl1bS1UeXBlICAgICAgICAgICAgICAgfCAgIDY1IHwgICAgIDcuMyB8IEVudW1lcmF0ZWQgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgVHVubmVsLUNsaWVudC1FbmRwb2ludCAgICAgICAgICAgfCAgIDY2IHwgICAgIDcuNCB8IFVURjhTdHJpbmcgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgVHVubmVsLVNlcnZlci1FbmRwb2ludCAgICAgICAgICAgfCAgIDY3IHwgICAgIDcuNSB8IFVURjhTdHJpbmcgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgVHVubmVsLVBhc3N3b3JkICAgICAgICAgICAgICAgICAgfCAgIDY5IHwgICAgIDcuNiB8IE9jdGV0U3RyaW5nIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgVHVubmVsLVByaXZhdGUtR3JvdXAtSWQgICAgICAgICAgfCAgIDgxIHwgICAgIDcuNyB8IE9jdGV0U3RyaW5nIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgVHVubmVsLUFzc2lnbm1lbnQtSWQgICAgICAgICAgICAgfCAgIDgyIHwgICAgIDcuOCB8IE9jdGV0U3RyaW5nIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgVHVubmVsLVByZWZlcmVuY2UgICAgICAgICAgICAgICAgfCAgIDgzIHwgICAgIDcuOSB8IFVuc2lnbmVkMzIgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgVHVubmVsLUNsaWVudC1BdXRoLUlkICAgICAgICAgICAgfCAgIDkwIHwgICAgNy4xMCB8IFVURjhTdHJpbmcgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgVHVubmVsLVNlcnZlci1BdXRoLUlkICAgICAgICAgICAgfCAgIDkxIHwgICAgNy4xMSB8IFVURjhTdHJpbmcgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgQWNjb3VudGluZy1JbnB1dC1PY3RldHMgICAgICAgICAgfCAgMzYzIHwgICAgIDguMSB8IFVuc2lnbmVkNjQgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgQWNjb3VudGluZy1PdXRwdXQtT2N0ZXRzICAgICAgICAgfCAgMzY0IHwgICAgIDguMiB8IFVuc2lnbmVkNjQgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgQWNjb3VudGluZy1JbnB1dC1QYWNrZXRzICAgICAgICAgfCAgMzY1IHwgICAgIDguMyB8IFVuc2lnbmVkNjQgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgQWNjb3VudGluZy1PdXRwdXQtUGFja2V0cyAgICAgICAgfCAgMzY2IHwgICAgIDguNCB8IFVuc2lnbmVkNjQgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgQWNjdC1TZXNzaW9uLVRpbWUgICAgICAgICAgICAgICAgfCAgIDQ2IHwgICAgIDguNSB8IFVuc2lnbmVkMzIgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgQWNjdC1BdXRoZW50aWMgICAgICAgICAgICAgICAgICAgfCAgIDQ1IHwgICAgIDguNiB8IEVudW1lcmF0ZWQgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgQWNvdW50aW5nLUF1dGgtTWV0aG9kICAgICAgICAgICAgfCAgNDA2IHwgICAgIDguNyB8IEVudW1lcmF0ZWQgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgQWNjdC1EZWxheS1UaW1lICAgICAgICAgICAgICAgICAgfCAgIDQxIHwgICAgIDguOCB8IFVuc2lnbmVkMzIgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgQWNjdC1MaW5rLUNvdW50ICAgICAgICAgICAgICAgICAgfCAgIDUxIHwgICAgIDguOSB8IFVuc2lnbmVkMzIgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgQWNjdC1UdW5uZWwtQ29ubmVjdGlvbiAgICAgICAgICAgfCAgIDY4IHwgICAgOC4xMCB8IE9jdGV0U3RyaW5nIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgQWNjdC1UdW5uZWwtUGFja2V0cy1Mb3N0ICAgICAgICAgfCAgIDg2IHwgICAgOC4xMSB8IFVuc2lnbmVkMzIgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgTkFTLUlkZW50aWZpZXIgICAgICAgICAgICAgICAgICAgfCAgIDMyIHwgICA5LjMuMSB8IFVURjhTdHJpbmcgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgTkFTLUlQLUFkZHJlc3MgICAgICAgICAgICAgICAgICAgfCAgICA0IHwgICA5LjMuMiB8IE9jdGV0U3RyaW5nIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgTkFTLUlQdjYtQWRkcmVzcyAgICAgICAgICAgICAgICAgfCAgIDk1IHwgICA5LjMuMyB8IE9jdGV0U3RyaW5nIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgU3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDI0IHwgICA5LjMuNCB8IE9jdGV0U3RyaW5nIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgVGVybWluYXRpb24tQ2F1c2UgICAgICAgICAgICAgICAgfCAgMjk1IHwgICA5LjMuNSB8IEVudW1lcmF0ZWQgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgT3JpZ2luLUFBQS1Qcm90b2NvbCAgICAgICAgICAgICAgfCAgNDA4IHwgICA5LjMuNiB8IEVudW1lcmF0ZWQgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgIyBSRkMgNDAwNiAtIERDQ0EgIyAgICAgICAgICAgICAgfCAgICAgIHwgICAgICAgICB8ICAgICAgICAgICAgIHwgICAgICB8ICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgIHwKK3wgQ0MtQ29ycmVsYXRpb24tSWQgICAgICAgICAgICAgICAgfCAgNDExIHwgICAgIDguMSB8IE9jdGV0U3RyaW5nIHwgICAgICB8IFAsTSB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgQ0MtSW5wdXQtT2N0ZXRzICAgICAgICAgICAgICAgICAgfCAgNDEyIHwgICAgOC4yNCB8IFVuc2lnbmVkNjQgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgQ0MtTW9uZXkgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNDEzIHwgICAgOC4yMiB8IEdyb3VwZWQgICAgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgQ0MtT3V0cHV0LU9jdGV0cyAgICAgICAgICAgICAgICAgfCAgNDE0IHwgICAgOC4yNSB8IFVuc2lnbmVkNjQgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgQ0MtUmVxdWVzdC1OdW1iZXIgICAgICAgICAgICAgICAgfCAgNDE1IHwgICAgIDguMiB8IFVuc2lnbmVkMzIgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgQ0MtUmVxdWVzdC1UeXBlICAgICAgICAgICAgICAgICAgfCAgNDE2IHwgICAgIDguMyB8IEVudW1lcmF0ZWQgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgQ0MtU2VydmljZS1TcGVjaWZpYy1Vbml0cyAgICAgICAgfCAgNDE3IHwgICAgOC4yNiB8IFVuc2lnbmVkNjQgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgQ0MtU2Vzc2lvbi1GYWlsb3ZlciAgICAgICAgICAgICAgfCAgNDE4IHwgICAgIDguNCB8IEVudW1lcmF0ZWQgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgQ0MtU3ViLVNlc3Npb24tSWQgICAgICAgICAgICAgICAgfCAgNDE5IHwgICAgIDguNSB8IFVuc2lnbmVkNjQgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgQ0MtVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNDIwIHwgICAgOC4yMSB8IFVuc2lnbmVkMzIgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgQ0MtVG90YWwtT2N0ZXRzICAgICAgICAgICAgICAgICAgfCAgNDIxIHwgICAgOC4yMyB8IFVuc2lnbmVkNjQgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgQ0MtVW5pdC1UeXBlICAgICAgICAgICAgICAgICAgICAgfCAgNDU0IHwgICAgOC4zMiB8IEVudW1lcmF0ZWQgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgQ2hlY2stQmFsYW5jZS1SZXN1bHQgICAgICAgICAgICAgfCAgNDIyIHwgICAgIDguNiB8IEVudW1lcmF0ZWQgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgQ29zdC1JbmZvcm1hdGlvbiAgICAgICAgICAgICAgICAgfCAgNDIzIHwgICAgIDguNyB8IEdyb3VwZWQgICAgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgQ29zdC1Vbml0ICAgICAgICAgICAgICAgICAgICAgICAgfCAgNDI0IHwgICAgOC4xMiB8IFVURjhTdHJpbmcgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgQ3JlZGl0LUNvbnRyb2wgICAgICAgICAgICAgICAgICAgfCAgNDI2IHwgICAgOC4xMyB8IEVudW1lcmF0ZWQgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgQ3JlZGl0LUNvbnRyb2wtRmFpbHVyZS1IYW5kbGluZyAgfCAgNDI3IHwgICAgOC4xNCB8IEVudW1lcmF0ZWQgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgQ3VycmVuY3ktQ29kZSAgICAgICAgICAgICAgICAgICAgfCAgNDI1IHwgICAgOC4xMSB8IFVuc2lnbmVkMzIgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgRGlyZWN0LURlYml0aW5nLUZhaWx1cmUtSGFuZGxpbmcgfCAgNDI4IHwgICAgOC4xNSB8IEVudW1lcmF0ZWQgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgRXhwb25lbnQgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNDI5IHwgICAgIDguOSB8IEludGVnZXIzMiAgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgRmluYWwtVW5pdC1BY3Rpb24gICAgICAgICAgICAgICAgfCAgNDQ5IHwgICAgOC4zNSB8IEVudW1lcmF0ZWQgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgRmluYWwtVW5pdC1JbmRpY2F0aW9uICAgICAgICAgICAgfCAgNDMwIHwgICAgOC4zNCB8IEdyb3VwZWQgICAgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgR3JhbnRlZC1TZXJ2aWNlLVVuaXQgICAgICAgICAgICAgfCAgNDMxIHwgICAgOC4xNyB8IEdyb3VwZWQgICAgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgRy1TLVUtUG9vbC1JZGVudGlmaWVyICAgICAgICAgICAgfCAgNDUzIHwgICAgOC4zMSB8IFVuc2lnbmVkMzIgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgRy1TLVUtUG9vbC1SZWZlcmVuY2UgICAgICAgICAgICAgfCAgNDU3IHwgICAgOC4zMCB8IEdyb3VwZWQgICAgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgTXVsdGlwbGUtU2VydmljZXMtQ3JlZGl0LUNvbnRyb2wgfCAgNDU2IHwgICAgOC4xNiB8IEdyb3VwZWQgICAgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgTXVsdGlwbGUtU2VydmljZXMtSW5kaWNhdG9yICAgICAgfCAgNDU1IHwgICAgOC40MCB8IEVudW1lcmF0ZWQgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgUmF0aW5nLUdyb3VwICAgICAgICAgICAgICAgICAgICAgfCAgNDMyIHwgICAgOC4yOSB8IFVuc2lnbmVkMzIgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgUmVkaXJlY3QtQWRkcmVzcy1UeXBlICAgICAgICAgICAgfCAgNDMzIHwgICAgOC4zOCB8IEVudW1lcmF0ZWQgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgUmVkaXJlY3QtU2VydmVyICAgICAgICAgICAgICAgICAgfCAgNDM0IHwgICAgOC4zNyB8IEdyb3VwZWQgICAgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgUmVkaXJlY3QtU2VydmVyLUFkZHJlc3MgICAgICAgICAgfCAgNDM1IHwgICAgOC4zOSB8IFVURjhTdHJpbmcgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgUmVxdWVzdGVkLUFjdGlvbiAgICAgICAgICAgICAgICAgfCAgNDM2IHwgICAgOC40MSB8IEVudW1lcmF0ZWQgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgUmVxdWVzdGVkLVNlcnZpY2UtVW5pdCAgICAgICAgICAgfCAgNDM3IHwgICAgOC4xOCB8IEdyb3VwZWQgICAgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgUmVzdHJpY3Rpb24tRmlsdGVyLVJ1bGUgICAgICAgICAgfCAgNDM4IHwgICAgOC4zNiB8IElQRmlsdHJSdWxlIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgU2VydmljZS1Db250ZXh0LUlkICAgICAgICAgICAgICAgfCAgNDYxIHwgICAgOC40MiB8IFVURjhTdHJpbmcgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgU2VydmljZS1JZGVudGlmaWVyICAgICAgICAgICAgICAgfCAgNDM5IHwgICAgOC4yOCB8IFVuc2lnbmVkMzIgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgU2VydmljZS1QYXJhbWV0ZXItSW5mbyAgICAgICAgICAgfCAgNDQwIHwgICAgOC40MyB8IEdyb3VwZWQgICAgIHwgICAgICB8IFAsTSB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgU2VydmljZS1QYXJhbWV0ZXItVHlwZSAgICAgICAgICAgfCAgNDQxIHwgICAgOC40NCB8IFVuc2lnbmVkMzIgIHwgICAgICB8IFAsTSB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgU2VydmljZS1QYXJhbWV0ZXItVmFsdWUgICAgICAgICAgfCAgNDQyIHwgICAgOC40NSB8IE9jdGV0U3RyaW5nIHwgICAgICB8IFAsTSB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgU3Vic2NyaXB0aW9uLUlkICAgICAgICAgICAgICAgICAgfCAgNDQzIHwgICAgOC40NiB8IEdyb3VwZWQgICAgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgU3Vic2NyaXB0aW9uLUlkLURhdGEgICAgICAgICAgICAgfCAgNDQ0IHwgICAgOC40OCB8IFVURjhTdHJpbmcgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgU3Vic2NyaXB0aW9uLUlkLVR5cGUgICAgICAgICAgICAgfCAgNDUwIHwgICAgOC40NyB8IEVudW1lcmF0ZWQgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgVGFyaWZmLUNoYW5nZS1Vc2FnZSAgICAgICAgICAgICAgfCAgNDUyIHwgICAgOC4yNyB8IEVudW1lcmF0ZWQgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgVGFyaWZmLVRpbWUtQ2hhbmdlICAgICAgICAgICAgICAgfCAgNDUxIHwgICAgOC4yMCB8IFRpbWUgICAgICAgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgVW5pdC1WYWx1ZSAgICAgICAgICAgICAgICAgICAgICAgfCAgNDQ1IHwgICAgIDguOCB8IEdyb3VwZWQgICAgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgVXNlZC1TZXJ2aWNlLVVuaXQgICAgICAgICAgICAgICAgfCAgNDQ2IHwgICAgOC4xOSB8IEdyb3VwZWQgICAgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgVXNlci1FcXVpcG1lbnQtSW5mbyAgICAgICAgICAgICAgfCAgNDU4IHwgICAgOC40OSB8IEdyb3VwZWQgICAgIHwgICAgICB8IFAsTSB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgVXNlci1FcXVpcG1lbnQtSW5mby1UeXBlICAgICAgICAgfCAgNDU5IHwgICAgOC41MCB8IEVudW1lcmF0ZWQgIHwgICAgICB8IFAsTSB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgVXNlci1FcXVpcG1lbnQtSW5mby1WYWx1ZSAgICAgICAgfCAgNDYwIHwgICAgOC41MSB8IE9jdGV0U3RyaW5nIHwgICAgICB8IFAsTSB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgVmFsdWUtRGlnaXRzICAgICAgICAgICAgICAgICAgICAgfCAgNDQ3IHwgICAgOC4xMCB8IEludGVnZXI2NCAgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKK3wgVmFsaWRpdHktVGltZSAgICAgICAgICAgICAgICAgICAgfCAgNDQ4IHwgICAgOC4zMyB8IFVuc2lnbmVkMzIgIHwgTSAgICB8IFAgICB8ICAgICAgICAgIHwgViAgICAgICAgfCBZICAgIHwKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdG9vbHMvb3JnX3RvX2ZkLnBsIGIvY29udHJpYi90b29scy9vcmdfdG9fZmQucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWNjMDYzMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdG9vbHMvb3JnX3RvX2ZkLnBsCkBAIC0wLDAgKzEsOTYgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKK3VzZSBzdHJpY3Q7Cit1c2UgR2V0b3B0OjpTdGQ7CisKK291ciAoJG9wdF9WLCAkb3B0X3YpOworCisjIGRlZmF1bHQgdG8gM0dQUAorbXkgKCR2ZW5kb3IpID0gMTA0MTU7CitteSAoJHZlbmRvcl9uYW1lKSA9ICIzR1BQIjsKKworc3ViIGNvbnZlcnRfbXVzdF90b19mbGFncygkKSB7CisgICAgbXkgKCRhbGxtdXN0KSA9IEBfOworICAgIG15ICgkbXVzdGZpZWxkcykgPSAiIjsKKyAgICAkbXVzdGZpZWxkcyAuPSAiQVZQX0ZMQUdfVkVORE9SIHwiIGlmICgkYWxsbXVzdCA9fiBtL1YvKTsKKyAgICAkbXVzdGZpZWxkcyAuPSAiQVZQX0ZMQUdfTUFOREFUT1JZIHwiIGlmICgkYWxsbXVzdCA9fiBtL00vKTsKKyAgICAkbXVzdGZpZWxkcyA9fiBzLyBcfCQvLzsKKyAgICByZXR1cm4gJG11c3RmaWVsZHM7Cit9CisKK3N1YiBiYXNlX3R5cGUoJCkgeworICAgIG15ICgkdHlwZSkgPSBAXzsKKworICAgIHJldHVybiAiQVZQX1RZUEVfR1JPVVBFRCIgaWYgKCR0eXBlID1+IG0vR3JvdXBlZC8pOworICAgIHJldHVybiAiQVZQX1RZUEVfT0NURVRTVFJJTkciIGlmICgkdHlwZSA9fiBtLyhBZGRyZXNzfERpYW1ldGVySWRlbnRpdHl8RGlhbWV0ZXJVUkl8T2N0ZXRTdHJpbmd8SVBGaWx0ZXJSdWxlfFRpbWV8VVRGOFN0cmluZykvKTsKKyAgICByZXR1cm4gIkFWUF9UWVBFX0lOVEVHRVIzMiIgaWYgKCR0eXBlID1+IG0vRW51bWVyYXRlZHxJbnRlZ2VyMzIvKTsKKyAgICByZXR1cm4gIkFWUF9UWVBFX0lOVEVHRVI2NCIgaWYgKCR0eXBlID1+IG0vSW50ZWdlcjY0Lyk7CisgICAgcmV0dXJuICJBVlBfVFlQRV9VTlNJR05FRDMyIiBpZiAoJHR5cGUgPX4gbS9VbnNpZ25lZDMyLyk7CisgICAgcmV0dXJuICJBVlBfVFlQRV9VTlNJR05FRDY0IiBpZiAoJHR5cGUgPX4gbS9VbnNpZ25lZDY0Lyk7CisgICAgcmV0dXJuICJBVlBfVFlQRV9GTE9BVDMyIiBpZiAoJHR5cGUgPX4gbS9GbG9hdDMyLyk7CisgICAgcmV0dXJuICJBVlBfVFlQRV9GTE9BVDY0IiBpZiAoJHR5cGUgPX4gbS9GbG9hdDY0Lyk7CisKKyAgICByZXR1cm4gIlVOS05PV04gVFlQRTogJHR5cGUiOworfQorCitzdWIgcHJpbnRfaW5zZXJ0KCQkKSB7CisgICAgbXkgKCR0eXBlLCAkbmFtZSkgPSBAXzsKKyAgICBteSAkYXZwX3R5cGU7CisKKyAgICBpZiAoJHR5cGUgPX4gbS8oR3JvdXBlZHxPY3RldFN0cmluZ3xJbnRlZ2VyMzJ8SW50ZWdlcjY0fFVuc2lnbmVkMzJ8VW5zaWduZWQ2NHxGbG9hdDMyfEZsb2F0NjQpLykgeworICAgICAgICAkYXZwX3R5cGUgPSAiTlVMTCI7CisgICAgfSBlbHNpZiAoJHR5cGUgPX4gbS9FbnVtZXJhdGVkLykgeworICAgICAgICBwcmludCAiXHRcdHN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7XG4iOworICAgICAgICBwcmludCAiXHRcdHN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgXCIiIC4gKCR2ZW5kb3JfbmFtZSA/ICIkdmVuZG9yX25hbWUvIiA6ICIiKSAuIkVudW1lcmF0ZWQoJG5hbWUpXCIsIE5VTEwsIE5VTEwsIE5VTEwgfTtcbiI7CisgICAgICAgICMgWFhYOiBhZGQgZW51bWVyYXRlZCB2YWx1ZXMKKyAgICAgICAgcHJpbnQgIlx0XHRDSEVDS19kaWN0X25ldyhESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpO1xuIjsKKyAgICAgICAgJGF2cF90eXBlID0gInR5cGUiOworICAgIH0gZWxzZSB7CisgICAgICAgICRhdnBfdHlwZSA9ICIke3R5cGV9X3R5cGUiOworICAgIH0KKworICAgIHByaW50ICJcdFx0Q0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCAkYXZwX3R5cGUsIE5VTEwpO1xuIjsKK30KKworc3ViIHVzYWdlKCQpIHsKKyAgICBkaWUoInVzYWdlOiBvcmdfdG9fZmQucGwgWy1WIHZlbmRvcl9uYW1lIC12IHZlbmRvcl9jb2RlXSBbZmlsZSAuLi5dXG4iKTsKKyAgICBleGl0KEBfKTsKK30KKworZ2V0b3B0cygiVjp2OiIpIHx8IHVzYWdlKDEpOworCitpZiAoZGVmaW5lZCgkb3B0X3YpKSB7CisgICAgJHZlbmRvciA9ICRvcHRfdjsKKyAgICBpZiAoIWRlZmluZWQoJG9wdF9WKSkgeworCXVzYWdlKDEpOworICAgIH0KKyAgICAkdmVuZG9yX25hbWUgPSAkb3B0X1Y7Cit9CisKK3ByaW50ICJcdC8qIFRoZSBmb2xsb3dpbmcgaXMgY3JlYXRlZCBhdXRvbWF0aWNhbGx5LiBEbyBub3QgbW9kaWZ5LiAqL1xuIjsKK3ByaW50ICJcdC8qIENoYW5nZXMgd2lsbCBiZSBsb3N0IGR1cmluZyB0aGUgbmV4dCB1cGRhdGUuIE1vZGlmeSB0aGUgc291cmNlIG9yZyBmaWxlIGluc3RlYWQuICovXG5cbiI7CisKK3doaWxlICg8PikgeworICAgIG15ICgkZHVtbXksICRuYW1lLCAkY29kZSwgJHNlY3Rpb24sICR0eXBlLCAkbXVzdCwgJG1heSwgJHNob3VsZG5vdCwgJG11c3Rub3QsICRlbmNyKSA9IHNwbGl0IC9cfC87CisKKyAgICBuZXh0IGlmICgkbmFtZSA9fiBtL0F0dHJpYnV0ZSBOYW1lLyk7CisgICAgaWYgKCRuYW1lID1+IG0vICMgKC4qKS8pIHsKKyAgICAgICAgcHJpbnQgIlx0LyogJDEgKi9cbiI7CisgICAgICAgIG5leHQ7CisgICAgfQorICAgICAgICAKKworICAgICRuYW1lID1+IHMvICovL2c7CisgICAgJGNvZGUgPX4gcy8gKi8vZzsKKyAgICAkdHlwZSA9fiBzLyAqLy9nOworCisgICAgcHJpbnQgIlx0LyogJG5hbWUgKi9cblx0e1xuXHRcdHN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7XG4iOworICAgIHByaW50ICJcdFx0XHQkY29kZSxcdC8qIENvZGUgKi9cbiI7CisgICAgcHJpbnQgIlx0XHRcdCR2ZW5kb3IsXHQvKiBWZW5kb3IgKi9cbiI7CisgICAgcHJpbnQgIlx0XHRcdFwiJG5hbWVcIixcdC8qIE5hbWUgKi9cbiI7CisgICAgcHJpbnQgIlx0XHRcdCIgLiBjb252ZXJ0X211c3RfdG9fZmxhZ3MoIiRtdXN0LCAkbXVzdG5vdCIpIC4gIixcdC8qIEZpeGVkIGZsYWdzICovXG4iOworICAgIHByaW50ICJcdFx0XHQiIC4gY29udmVydF9tdXN0X3RvX2ZsYWdzKCIkbXVzdCIpIC4gIixcdC8qIEZpeGVkIGZsYWcgdmFsdWVzICovXG4iOworICAgIHByaW50ICJcdFx0XHQiIC4gYmFzZV90eXBlKCR0eXBlKSAuICJcdC8qIGJhc2UgdHlwZSBvZiBkYXRhICovXG4iOworICAgIHByaW50ICJcdFx0fTtcbiI7CisgICAgcHJpbnRfaW5zZXJ0KCR0eXBlLCAkbmFtZSk7CisgICAgcHJpbnQgIlx0fTtcblxuIjsKK30KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdXBkYXRlX2NvcHlyaWdodC5zaCBiL2NvbnRyaWIvdXBkYXRlX2NvcHlyaWdodC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42NGU0NDY1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi91cGRhdGVfY29weXJpZ2h0LnNoCkBAIC0wLDAgKzEsMzMgQEAKKyMhL2Jpbi9iYXNoIC14CisKKyMgVGhpcyBzY3JpcHQgd2lsbCBzZWFyY2ggYWxsIGNvcHlyaWdodHMgZGF0ZXMgZnJvbSBzb3VyY2UgZmlsZXMsIGFuZCB1cGRhdGUgdGhlc2UgaWYgCisjIHRoZSBmaWxlIGhhcyBiZWVuIG1vZGlmaWVkIGF0IGEgbGF0ZXIgZGF0ZS4KKworaWYgWyAhIC1mIGluY2x1ZGUvZnJlZURpYW1ldGVyL2xpYmZkY29yZS5oIF07Cit0aGVuIGVjaG8gIlRoaXMgc2NyaXB0IG11c3QgYmUgcnVuIGZyb20gdGhlIHNvdXJjZSB0b3AgZGlyZWN0b3J5IgorZXhpdCAxOworZmk7CisKKyMgQ3JlYXRlIGEgY2xlYW4gd29ya2luZyBjb3B5CitUTVBESVI9YG1rdGVtcCAtZCB1cF9jb3AuWFhYWFhYWGAgfHwgZXhpdCAxCitoZyBjbG9uZSAuICRUTVBESVIvZkQgfHwgZXhpdCAxCitwdXNoZCAkVE1QRElSL2ZECisKKyMgTm93LCBmb3IgZWFjaCBmaWxlIHdpdGggYSBjb3B5cmlnaHQKK2ZvciBTUkNfRklMRSBpbiBgZmluZCAuIC1uYW1lIC5oZyAtcHJ1bmUgLW9yIC10eXBlIGYgLWV4ZWMgZ3JlcCAtcSAnQ29weXJpZ2h0IChjKSAyMC4uLCBXSURFIFByb2plY3QgYW5kIE5JQ1QnIHt9IFw7IC1wcmludGA7CitkbyAKK0hHX1lFQVI9YGhnIGxvZyAtLXRlbXBsYXRlICd7ZGF0ZXxzaG9ydGRhdGV9JyAkU1JDX0ZJTEUgfCB0ciAtICcgJyB8IGF3ayAne3ByaW50IFwkMX0nYAorQ1BZX1lFQVI9YGdyZXAgJ0NvcHlyaWdodCAoYykgMjAuLiwgV0lERSBQcm9qZWN0IGFuZCBOSUNUJyAkU1JDX0ZJTEUgfCBhd2sgJ3twcmludCBzdWJzdHIoXCQ0LCAxLCA0KSB9J2AKK2lmIFsgJEhHX1lFQVIgLWd0ICRDUFlfWUVBUiBdOwordGhlbgorZWNobyAiVXBkYXRpbmcgY29weXJpZ2h0ICRDUFlfWUVBUiAtPiAkSEdfWUVBUiBpbiAkU1JDX0ZJTEUiOworc2VkIC1pIC1lICJzL0NvcHlyaWdodCAoYykgJENQWV9ZRUFSLCBXSURFIFByb2plY3QgYW5kIE5JQ1QvQ29weXJpZ2h0IChjKSAkSEdfWUVBUiwgV0lERSBQcm9qZWN0IGFuZCBOSUNULyIgJFNSQ19GSUxFCitmaTsKK2RvbmUKKworaGcgY29tbWl0IC1tIlVwZGF0ZWQgY29weXJpZ2h0IGluZm9ybWF0aW9uIgoraGcgcHVzaAorcG9wZAorcm0gLXJmICRUTVBESVIKK2hnIHVwZGF0ZQorCmRpZmYgLS1naXQgYS9jb250cmliL3dpcmVzaGFyay9IT1dUTyBiL2NvbnRyaWIvd2lyZXNoYXJrL0hPV1RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2ZDkxMjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3dpcmVzaGFyay9IT1dUTwpAQCAtMCwwICsxLDY4IEBACisJICAtLS0tLS0tLQorCSAgRk9SRVdPUkQKKwkgIC0tLS0tLS0tCisJCQkgICAKK1RoZSBwYXRjaCBpbiB0aGlzIGZvbGRlciBhbGxvd3MgV2lyZXNoYXJrIHRvIHByb2Nlc3MgcGFja2V0cyB0aGF0IGNvbnRhaW4gVExTLXByb3RlY3RlZAorRGlhbWV0ZXIgbWVzc2FnZXMgb3ZlciBTQ1RQIG11bHRpLXN0cmVhbSBhc3NvY2lhdGlvbnMuIEVhY2ggU0NUUCBzdHJlYW0gcGFpcnMgaXMgaGFuZGxlZAorYXMgYSBzZXBhcmF0ZSBUTFMgY2hhbm5lbCAoUkZDMzQzNiksIHdoaWNoIGlzIGNvbnNpc3RlbnQgd2l0aCBmcmVlRGlhbWV0ZXIgMS4wLnggbWVjaGFuaXNtLgorCitJdCBzaG91bGQgYmUgbm90ZWQgaG93ZXZlciB0aGF0IHJmYzM1ODhiaXMgKHJldmlzZWQgRGlhbWV0ZXIpIHJlY29tbWVuZHMgdGhhdCBEVExTIGlzIHVzZWQKK2luc3RlYWQgb2YgVExTIG92ZXIgU0NUUCwgZm9yIHRoZSByZWFzb25zIGhpZ2hsaWdodGVkIGluIHRoZSBpbnRyb2R1Y3Rpb24gb2YgUkZDNjA4My4KK1doZW4gdGhpcyBuZXcgbWVjaGFuaXNtIGlzIGltcGxlbWVudGVkIGluIGZyZWVEaWFtZXRlciwgYSBkaWZmZXJlbnQgcGF0Y2ggd2lsbCBwcm9iYWJseQorYmUgcmVxdWlyZWQgZm9yIHdpcmVzaGFyay4KKworCitUaGUgaW5zdHJ1Y3Rpb25zIGluIHRoaXMgZmlsZSB3aWxsIGNoYW5nZSB5b3VyIHdpcmVzaGFyayBiaW5hcnkgaW4gYSB3YXkgc3VpdGFibGUgZm9yCithbmFseXNpcyBvZiBEaWFtZXRlciBvdmVyIFRMUyBvdmVyIFNDVFAsIGJ1dCBtYXkgaGF2ZSB1bmV4cGVjdGVkIHNpZGUtZWZmZWN0cworb24gc29tZSBvdGhlciBwcm90b2NvbHMgYW5hbHlzaXMgKGluY2x1ZGluZyBEVExTKS4KKworVGhlIGluc3RydWN0aW9ucyByZWZlciB0byBEZWJpYW4tc3R5bGUgcGFja2FnaW5nIChhcHQpLCB5b3Ugc2hvdWxkIGFkYXB0IAordGhlIHByb2Nlc3MgdG8gYnVpbGQgYSBuZXcgbW9kaWZpZWQgcGFja2FnZSBvZiB3aXJlc2hhcmsgZm9yIHlvdXIgZGlzdHJpYnV0aW9uLgorCitUaGUgcHJvdmlkZWQgcGF0Y2ggaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHRlc3RlZCB3aXRoOgorIC0gd2lyZXNoYXJrLTEuMi43IChVYnVudHUgTHVjaWQpCisgLSB3aXJlc2hhcmstMS4yLjExIChVYnVudHUgTWF2ZXJpY2spCitJdCBtYXkgb3IgbWF5IG5vdCB3b3JrIG9uIG1vcmUgcmVjZW50IG9yIGFuY2llbnQgdmVyc2lvbnMuCisKKworCS0tLS0tLS0tLS0tLQorCUlOU1RSVUNUSU9OUworCS0tLS0tLS0tLS0tLQorCitUaGUgc3RlcHMgYXJlOgorIC0gZ2V0IHlvdXIgd2lyZXNoYXJrIHNvdXJjZQorIAlhcHQtZ2V0IHNvdXJjZSB3aXJlc2hhcmsKKwljZCB3aXJlc2hhcmstMS4yLioKKwkKKyAtIGFwcGx5IHRoZSBwYXRjaAorIAljYXQgfi93aXJlc2hhcmstMS4yLjctZGlhbWV0ZXItdGxzLnBhdGNoIHwgcGF0Y2ggLXAxCisKKyAtIGluY3JlYXNlIHRoZSB2ZXJzaW9uIG51bWJlcgorIAlkY2ggLWxmRCAiQWRkZWQgc3VwcG9ydCBmb3IgRGlhbWV0ZXIgb3ZlciBUTFMgb3ZlciBTQ1RQIgorCQorIC0gQ3JlYXRlIGEgbmV3IHBhY2thZ2UsIHRoaXMgbWlnaHQgdGFrZSBhIHdoaWxlCisJZmFrZXJvb3QgZGViaWFuL3J1bGVzIGJpbmFyeQorCisgLSBJbnN0YWxsIHRoZSBtb2RpZmllZCB2ZXJzaW9uCisgCXN1ZG8gZHBrZyAtLWluc3RhbGwgLi4vd2lyZXNoYXJrLWNvbW1vbl8qZkQqLmRlYiAuLi93aXJlc2hhcmtfKmZEKi5kZWIKKworIC0gU3RhcnQgdGhlIG5ldyB3aXJlc2hhcms6CisgCXdpcmVzaGFyayAmCisJCitUbyBhbmFseXplIGEgY2FwdHVyZSBmaWxlLCB5b3Ugd2lsbCBuZWVkIHRoZSBwcml2YXRlIGtleXMgb2YgYm90aCBwZWVycyBpbnZvbHZlZC4KKworTGV0J3MgaW1hZ2luZSBmb3IgZXhhbXBsZToKKyAgcGVlciBBIHdpdGggSVAgYWRkcmVzcyAxOTIuMTY4LjAuMTAgaGFzIHByaXZhdGUga2V5IHByaXZBLnBlbQorICBwZWVyIEIgd2l0aCBJUCBhZGRyZXNzIDE5Mi4xNjguMC4xMSBoYXMgcHJpdmF0ZSBrZXkgcHJpdkIucGVtCisgIAorSW4gd2lyZXNoYXJrIHlvdSBtdXN0IGRvIHRoZSBmb2xsb3dpbmc6CisgLSBnbyB0byBtZW51IEVkaXQtPlByZWZlcmVuY2VzCisgLSBJbiB0aGUgbGVmdCBwYW5lbCwgdW5kZXIgUHJvdG9jb2xzLCBzY3JvbGwgdG8gIlNTTCIgYW5kIHNlbGVjdCBpdC4KKyAtIEluIHRoZSByaWdodCBwYW5lbCwgZmlsbCAiUlNBIGtleXMgbGlzdCIgYXMgZm9sbG93OgorCTE5Mi4xNjguMC4xMCwzODY5LGRpYW1ldGVyLC9hYnNvbHV0ZS9wYXRoL3RvL3ByaXZBLnBlbTsxOTIuMTY4LjAuMTEsMzg2OSxkaWFtZXRlciwvYWJzb2x1dGUvcGF0aC90by9wcml2Qi5wZW0KKyAtIFlvdSBtYXkgZmluZCBhbHNvIHVzZWZ1bCB0byBzZWxlY3QgYW4gU1NMIGRlYnVnIGZpbGUgdG8gZ2V0IGEgaGludCBvZiBhbnkgcHJvYmxlbS4KKyAKK09uY2UgdGhpcyBjb25maWd1cmF0aW9uIGlzIGNvbXBsZXRlLCB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gc2VlIHRoZSBjb250ZW50cyBvZiBTQ1RQIHBhY2tldHMsIAoraW5jbHVkaW5nIHByb3RlY3RlZCBEaWFtZXRlciBwYXlsb2FkLgorCitDaGVjayB0aGUgInNhbXBsZSIgc3ViZGlyZWN0b3J5IGZvciBhIHRlc3QgY2FwdHVyZSBmaWxlLgpkaWZmIC0tZ2l0IGEvY29udHJpYi93aXJlc2hhcmsvc2FtcGxlLzE5Mi4xNjguMTAzLjEwLnByaXYucGVtIGIvY29udHJpYi93aXJlc2hhcmsvc2FtcGxlLzE5Mi4xNjguMTAzLjEwLnByaXYucGVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYTE1ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3dpcmVzaGFyay9zYW1wbGUvMTkyLjE2OC4xMDMuMTAucHJpdi5wZW0KQEAgLTAsMCArMSwxNSBAQAorLS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQorTUlJQ1hBSUJBQUtCZ1FETWNYeTJpVnFjWGtHYVk0NHlOaWhWTnpXL3pIcHRxSUQ0OS9aeXl5T2lueEhlbnZmOQorby9mcjYxM1h2VXV5cXVhYXBMOTl5aU1QdUxVM0kxVXh4YWNXQlNBYjQ5NmVHZDdmWTFVZHcxUnRxS0NlYjYwYworanBUYzN6S3lTR1BIdG56T3hlU01ESy9SNnVxa0ZpckY2TG51MThtS1p5QXdKdHZGWW5oMHdLM1N3d0lEQVFBQgorQW9HQWE2a1gwOGhoUHhjajFQbTRXQmpOQkpNZWF2SnpSbXdGL3hZVllqNDNkZHZ1dlIxWjJ1Z09GdDdMZkdEagorRENPVGJMeDFXdmlubmcvVzNrSnRDdGpiTTN3M2s1Y3VGSmRKY1VSWGRhNzNJSFNhSk9IbkJBdzVSbHZGQ0U3OQorMTJ5S3FHT0JneTgwZ0dIRGxxblNJaklTQ0diLzl3TGNIWUxjY2FrZWtja1BjNEVDUVFEdWJ0NWZXek40d1V3VQoreVcrZS9TTzlWejRqK0ZpSUMyYVp5Mk9NOVhYdDZjZ2g0djBoUTNsMHNXVko2bFR2SzE3YUQ5TFhFNXJsdUFPSQordGhuUFpFbEZBa0VBMjRHSDhQby8rM0s2QTVkNVpoMStod29NTGJXcnlrUURXU09ndG1hT3RiQXZlemxvbEY4TworVzE4cFZkdnlNSmczZ1VpQ0EvckhHK3IrT0J4YTRzeDRad0pBSDRjMWpISm8yZnpsYkpJK1drMnEzaXlkSVBDRAorOUdsZGhkU3BNMGg1OFozS1F3RGE2LzBhSUY0Y3dLdGwwOEp1Wm5OVk0rOTV1Z3FkSFFUSFlPOG42UUpCQUlnTworbStLRVd4QlNwblgvZCtJUnVoR2Q2cnFTZHU4aWhTakZhcUprbzJSKzFvOThvQlFIYjNDM1pYbXdvVWY1c2IzUworNGJQeHgyVEluZGJOekkvenlWVUNRR3FON2V5b2VUeHRQRDhQMDhsVUdUVW5DMm4waW1aMW1VNXA4Qm52OGd3NQorbHd0OXF4dXowVWpyN3VGUFB1NThidkdzWWVvRlVWMjNXUm1TMHJLTFh2MD0KKy0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCmRpZmYgLS1naXQgYS9jb250cmliL3dpcmVzaGFyay9zYW1wbGUvMTkyLjE2OC4xMDMuMjAucHJpdi5wZW0gYi9jb250cmliL3dpcmVzaGFyay9zYW1wbGUvMTkyLjE2OC4xMDMuMjAucHJpdi5wZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY2OWY3YQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvd2lyZXNoYXJrL3NhbXBsZS8xOTIuMTY4LjEwMy4yMC5wcml2LnBlbQpAQCAtMCwwICsxLDE1IEBACistLS0tLUJFR0lOIFJTQSBQUklWQVRFIEtFWS0tLS0tCitNSUlDWGdJQkFBS0JnUURlZjhDcnFhd2Z2bUNMQndtbFBSbFdqd0I2VjRUdlZNUmhpdkFZbHd3RmJVU29VNWJtCisyRDc4MElCcjNmTkwzelAzOHlTYTdyOWNYeFBnazdtYmozUGhjSmJJMEl4MEFqUWRGU0IwOEFPWGV2NGdxVThwCitxZ0VPREZWMDR0bkZoT2NEeXNwNzdxSC9ERnVOd3hkMnh0RlViR0tmR2hyb0Fzc0h4SnVvZ09taVdRSURBUUFCCitBb0dBUDZIN3dWeUNMSVh1NkhQM3p6a2RJUU0rMkw1azkybWZ6R0hHN3RGc0Q3VkRXSHluZ0pmQjA5M3hqR2ZxCitwLzFLeUpQU0dUbEVveTlSNlAxMnJNV25GdjdzWVlLbVBHZktkUlVNeFpZSVhicGx3NitML2d3VzNNQ2lPTURECit6UnpSamtuRTNhK01qbzNlMlhNSGg2WitHSjYxbWVnTWVHSW5PRFAwNS9oNjZBRUNRUUR5RmhUK0Q4RFZqMWhwCitSbGFZVEZES0NtUzlyZ01RK2c0WXlxTUx6dWFra0t3YUp3YkNJbE1iUW9ydEdCdlk5SSswdVpDNGprbGNPcG5sCitZWWNHSVVFQkFrRUE2MGw1dUFWQms2dktXS1dYMmNrc0JQL1ZsSk0yQjlwa3ZtbEw3dFB3SlZFZm9hQXpaeDROCityUHBDOXNPc0ZsWDFTaHBpckFtSXFtdlkxNmluNHhFSldRSkJBT3ZVTFNFT2NaalphcFFyakVJUzNnVGtPUjA2CitmZ3cwdkRUVWVoOFBzRW1TRWNYc1RMNGp0L2Z2UyswS05sNlVaOFh6bTVMZU1ZTGlKM2Q0R1pRVUl3RUNRUUNiCit2WUxvSC9LTVFNWXJiMURZUTZUem1qUlJxQyszZXdQOFZjNkJRNkJOMHlqUTN5Mm5MK2wxZWlJaEhOd24zTFlFCitXdnE5VFlJODdDNFljZmJQQWxQaEFrRUEwYk5VL1V0Z2Ridi95VDRsVW13KzB0b3FGSGtjVDVzMTNSRld6TkpVCitLZFEzMDhrd3o5clNEbXVROGVZem41VjAyVGlvSktWNHIwTlp6K1djQ3lEWTNBPT0KKy0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCmRpZmYgLS1naXQgYS9jb250cmliL3dpcmVzaGFyay9zYW1wbGUvUkVBRE1FIGIvY29udHJpYi93aXJlc2hhcmsvc2FtcGxlL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzVjZmExCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi93aXJlc2hhcmsvc2FtcGxlL1JFQURNRQpAQCAtMCwwICsxLDU2IEBACitUaGlzIGZvbGRlciBjb250YWlucyBhbiBleGFtcGxlIGNhcHR1cmUgZmlsZSwgYXMgd2VsbCBhcyB0aGUgdHdvCitwcml2YXRlIGtleXMgcmVxdWlyZWQgdG8gZGVjb2RlIHRoZSBUTFMtcHJvdGVjdGVkIGV4Y2hhbmdlcy4KKworSW4gb3JkZXIgdG8gZGVjcnlwdCBwcm9wZXJseSB0aGUgcGFja2V0cywgeW91J2xsIG5lZWQgYSBwYXRjaGVkIHdpcmVzaGFyayAoc2VlIHBhcmVudCBkaXJlY3RvcnkpCithbmQgdGhlIFNTTCAiUlNBIFByaXZhdGUgS2V5cyIgcHJvcGVydGllcyBzZXQgdG8gKHJlcGxhY2Ugd2l0aCByZWFsIGZ1bGwgcGF0aCk6CisgIDE5Mi4xNjguMTAzLjEwLDM4NjksZGlhbWV0ZXIsZnJlZURpYW1ldGVyL2NvbnRyaWIvd2lyZXNoYXJrL3NhbXBsZS8xOTIuMTY4LjEwMy4xMC5wcml2LnBlbTsxOTIuMTY4LjEwMy4yMCwzODY5LGRpYW1ldGVyLGZyZWVEaWFtZXRlci9jb250cmliL3dpcmVzaGFyay9zYW1wbGUvMTkyLjE2OC4xMDMuMjAucHJpdi5wZW0KKworCitUaGlzIGNhcHR1cmUgY29udGFpbnMgZXZlcnl0aGluZyB0aGF0IHdhcyBleGNoYW5nZWQgYnkgdGhlIHBlZXIgc2luY2UgaXQgYm9vdCB1cC4KK1RoZSBjYXB0dXJlZCBwZWVyIGlzICJyZWxheS5hLnJ0LmZyZWVkaWFtZXRlci5uZXQiIHdpdGggSVAgYWRkcmVzcyAxOTIuMTY4LjEwMy4yMC4KKworSGVyZSBpcyB0aGUgZGV0YWlsIG9mIHdoYXQgeW91IGNhbiBzZWUgaW4gdGhlIGNhcHR1cmUsIGlmIHRoZSBkZWN5cGhlcmluZyAKK3dvcmtzIGFzIGV4cGVjdGVkLCBpbiBjaHJvbm9sb2dpY2FsIG9yZGVyOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRnJhbWVzCQl8IENvbW1lbnRzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMS0yNAkJfCBQZWVyIGJvb3RpbmcgdXA6IERIQ1AsIE5UUCwgLi4uCisJCXwKKzI1LTI5CQl8IENvbm5lY3Rpb24gYXR0ZW1wdCBmcm9tIDE5Mi4xNjguMTAzLjEwCisJCXwgICBmaXJzdCBhdHRlbXB0IG9uIFNDVFAgKGZyYW1lcyAyNi0yNykKKwkJfCAgIHRoZW4gb24gVENQIChmcmFtZXMgMjgtMjkpCisJCXwKKzMyLTM1CQl8IGZyZWVEaWFtZXRlciBzdGFydGluZzogRGlhbWV0ZXIgSWRlbnRpdGllcworCQl8ICAgZnJvbSB0aGUgcGVlcidzIGNvbmZpZ3VyYXRpb24gZmlsZSBhcmUKKwkJfCAgIEROUyByZXNvbHZlZC4KKwkJfAorMzYtMzkJCXwgU0NUUCBjb25uZWN0aW9uIHRvIDE5Mi4xNjguMTAzLjEwCisJCXwKKzQwLTQ1CQl8IEZhaWxlZCBhdHRlbXB0IHRvIGNvbm5lY3QgdG8gMTkyLjE2OC4xMDMuMzAKKwkJfCAgIHdoZXJlIGZyZWVEaWFtZXRlciB3YXMgbm90IHN0YXJ0ZWQuCisJCXwKKzQ2LTQ5CQl8IChJIHRoaW5rIHRoaXMgaXMgdHJpZ2dlZCBieSBEZWJ1ZyBvdXRwdXQsIAorCQl8ICAgSSBoYXZlIHRvIGNoZWNrKQorCQl8Cis1MC03MwkJfCBUTFMgaGFuZHNoYWtlIG9uIGZpcnN0IHN0cmVhbSBwYWlyICgjMCkuCisJCXwKKzc0LTkwCQl8IFJlc3VtZWQgaGFuZHNoYWtlcyBvbiBzdHJlYW1zICMxIGFuZCAjMiBpbiBwYXJhbGxlbC4KKwkJfCAgIChub3Qgc3VyZSB3aGVyZSB0byBmaW5kIHRoYXQgaXQgaXMgcmVzdW1lZCwKKwkJfCAgICBleGNlcHQgdGhhdCBjZXJ0aWZpY2F0ZXMgYXJlIG5vdCByZS1leGNoYW5nZWQpCisJCXwKKzkxLTkyCQl8IENFUi9DRUEgZXhjaGFuZ2UuCis5My05NgkJfCBEV1IvRFdBIGV4Y2hhbmdlLgorCQl8CisxMDMtMTE4CQl8IFNDVFAgaGVhcnRiZWF0cyBhcmUgZXhjaGFuZ2VkIG1vcmUgZnJlcXVlbnRseSB0aGFuIERXUi9EV0EuCisJCXwKKzExOS0xMjQJCXwgQ29uY3VycmVudCBEV1IvRFdBIChpdCBoYXBwZW5zIHNvbWV0aW1lcykKKwkJfAorMTI1LTEyOAkJfCBBbm90aGVyIGZhaWxlZCBhdHRlbXB0IHRvIDE5Mi4xNjguMTAzLjMwIChjZi4gZnJhbWVzIDQwLTQ1KQorCQl8CisxMzctMTQwCQl8IERQUi9EUEEgZXhjaGFuZ2UuCisJCXwKKzE0MS0xNTMJCXwgVExTIGNsZWFuIHNodXRkb3duIG9uIGFsbCBzdHJlYW1zIGluIHBhcmFsbGVsLgorCQl8CisxNTQtMTU3CQl8IFNDVFAgYXNzb2NpYXRpb24gaXMgY2xvc2VkLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvd2lyZXNoYXJrL3NhbXBsZS9jYXB0dXJlLmNhcCBiL2NvbnRyaWIvd2lyZXNoYXJrL3NhbXBsZS9jYXB0dXJlLmNhcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjgwNTkwCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi93aXJlc2hhcmsvc2FtcGxlL2NhcHR1cmUuY2FwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvd2lyZXNoYXJrL3dpcmVzaGFyay0xLjIuNy1kaWFtZXRlci10bHMucGF0Y2ggYi9jb250cmliL3dpcmVzaGFyay93aXJlc2hhcmstMS4yLjctZGlhbWV0ZXItdGxzLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyYTE4MjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3dpcmVzaGFyay93aXJlc2hhcmstMS4yLjctZGlhbWV0ZXItdGxzLnBhdGNoCkBAIC0wLDAgKzEsNjg1IEBACitkaWZmIC1OdXIgd2lyZXNoYXJrLTEuMi43L2VwYW4vY29udmVyc2F0aW9uLmMgd2lyZXNoYXJrLTEuMi43LWZEL2VwYW4vY29udmVyc2F0aW9uLmMKKy0tLSB3aXJlc2hhcmstMS4yLjcvZXBhbi9jb252ZXJzYXRpb24uYwkyMDEwLTA0LTAxIDAxOjQ0OjM5LjAwMDAwMDAwMCArMDkwMAorKysrIHdpcmVzaGFyay0xLjIuNy1mRC9lcGFuL2NvbnZlcnNhdGlvbi5jCTIwMTEtMDItMjMgMTQ6MjY6MzUuMDAwMDAwMDAwICswOTAwCitAQCAtNDAsNiArNDAsMTEgQEAKKyBzdGF0aWMgR0hhc2hUYWJsZSAqY29udmVyc2F0aW9uX2hhc2h0YWJsZV9leGFjdCA9IE5VTEw7CisgCisgLyoKKysgKiBIYXNoIHRhYmxlIGZvciBjb252ZXJzYXRpb25zIHdpdGhvdXQgc3RyaWQuCisrICovCisrc3RhdGljIEdIYXNoVGFibGUgKmNvbnZlcnNhdGlvbl9oYXNodGFibGVfbm9fc3RyaWQgPSBOVUxMOworKworKy8qCisgICogSGFzaCB0YWJsZSBmb3IgY29udmVyc2F0aW9ucyB3aXRoIG9uZSB3aWxkY2FyZCBhZGRyZXNzLgorICAqLworIHN0YXRpYyBHSGFzaFRhYmxlICpjb252ZXJzYXRpb25faGFzaHRhYmxlX25vX2FkZHIyID0gTlVMTDsKK0BAIC02Myw2ICs2OCw3IEBACisgCXBvcnRfdHlwZSBwdHlwZTsKKyAJZ3VpbnQzMglwb3J0MTsKKyAJZ3VpbnQzMglwb3J0MjsKKysJZ3VpbnQzMglzdHJpZDsKKyB9IGNvbnZlcnNhdGlvbl9rZXk7CisgI2VuZGlmCisgLyoKK0BAIC0xOTMsNiArMTk5LDcgQEAKKyAJaGFzaF92YWwgKz0ga2V5LT5wb3J0MTsKKyAJQUREX0FERFJFU1NfVE9fSEFTSChoYXNoX3ZhbCwgJmtleS0+YWRkcjIpOworIAloYXNoX3ZhbCArPSBrZXktPnBvcnQyOworKwloYXNoX3ZhbCArPSBrZXktPnN0cmlkOworIAorIAlyZXR1cm4gaGFzaF92YWw7CisgfQorQEAgLTIxNyw2ICsyMjQsNzggQEAKKyAJICovCisgCWlmICh2MS0+cG9ydDEgPT0gdjItPnBvcnQxICYmCisgCSAgICB2MS0+cG9ydDIgPT0gdjItPnBvcnQyICYmCisrCSAgICB2MS0+c3RyaWQgPT0gdjItPnN0cmlkICYmCisrCSAgICBBRERSRVNTRVNfRVFVQUwoJnYxLT5hZGRyMSwgJnYyLT5hZGRyMSkgJiYKKysJICAgIEFERFJFU1NFU19FUVVBTCgmdjEtPmFkZHIyLCAmdjItPmFkZHIyKSkgeworKwkJLyoKKysJCSAqIFllcy4gIEl0J3MgdGhlIHNhbWUgY29udmVyc2F0aW9uLCBhbmQgdGhlIHR3bworKwkJICogYWRkcmVzcy9wb3J0IHBhaXJzIGFyZSBnb2luZyBpbiB0aGUgc2FtZSBkaXJlY3Rpb24uCisrCQkgKi8KKysJCXJldHVybiAxOworKwl9CisrCisrCS8qCisrCSAqIElzIHRoZSBmaXJzdCBwb3J0IDIgdGhlIHNhbWUgYXMgdGhlIHNlY29uZCBwb3J0IDEsIHRoZSBmaXJzdAorKwkgKiBwb3J0IDEgdGhlIHNhbWUgYXMgdGhlIHNlY29uZCBwb3J0IDIsIHRoZSBmaXJzdCBhZGRyZXNzIDIKKysJICogdGhlIHNhbWUgYXMgdGhlIHNlY29uZCBhZGRyZXNzIDEsIGFuZCB0aGUgZmlyc3QgYWRkcmVzcyAxCisrCSAqIHRoZSBzYW1lIGFzIHRoZSBzZWNvbmQgYWRkcmVzcyAyPworKwkgKi8KKysJaWYgKHYxLT5wb3J0MiA9PSB2Mi0+cG9ydDEgJiYKKysJICAgIHYxLT5wb3J0MSA9PSB2Mi0+cG9ydDIgJiYKKysJICAgIHYxLT5zdHJpZCA9PSB2Mi0+c3RyaWQgJiYKKysJICAgIEFERFJFU1NFU19FUVVBTCgmdjEtPmFkZHIyLCAmdjItPmFkZHIxKSAmJgorKwkgICAgQUREUkVTU0VTX0VRVUFMKCZ2MS0+YWRkcjEsICZ2Mi0+YWRkcjIpKSB7CisrCQkvKgorKwkJICogWWVzLiAgSXQncyB0aGUgc2FtZSBjb252ZXJzYXRpb24sIGFuZCB0aGUgdHdvCisrCQkgKiBhZGRyZXNzL3BvcnQgcGFpcnMgYXJlIGdvaW5nIGluIG9wcG9zaXRlIGRpcmVjdGlvbnMuCisrCQkgKi8KKysJCXJldHVybiAxOworKwl9CisrCisrCS8qCisrCSAqIFRoZSBhZGRyZXNzZXMgb3IgdGhlIHBvcnRzIGRvbid0IG1hdGNoLgorKwkgKi8KKysJcmV0dXJuIDA7CisrfQorKworKy8qCisrICogQ29tcHV0ZSB0aGUgaGFzaCB2YWx1ZSBmb3IgdHdvIGdpdmVuIGFkZHJlc3MvcG9ydCBwYWlycyBpZiB0aGUgbWF0Y2gKKysgKiBoYXMgYSB3aWxkY2FyZCBzdHJlYW0gaWQuCisrICovCisrc3RhdGljIGd1aW50CisrY29udmVyc2F0aW9uX2hhc2hfbm9fc3RyaWQoZ2NvbnN0cG9pbnRlciB2KQorK3sKKysJY29uc3QgY29udmVyc2F0aW9uX2tleSAqa2V5ID0gKGNvbnN0IGNvbnZlcnNhdGlvbl9rZXkgKil2OworKwlndWludCBoYXNoX3ZhbDsKKysKKysJaGFzaF92YWwgPSAwOworKwlBRERfQUREUkVTU19UT19IQVNIKGhhc2hfdmFsLCAma2V5LT5hZGRyMSk7CisrCWhhc2hfdmFsICs9IGtleS0+cG9ydDE7CisrCWhhc2hfdmFsICs9IGtleS0+cG9ydDI7CisrCisrCXJldHVybiBoYXNoX3ZhbDsKKyt9CisrCisrLyoKKysgKiBDb21wYXJlIHR3byBjb252ZXJzYXRpb24ga2V5cywgZXhjZXB0IGZvciB0aGUgc3RyZWFtIGlkIHZhbHVlLgorKyAqLworK3N0YXRpYyBnaW50CisrY29udmVyc2F0aW9uX21hdGNoX25vX3N0cmlkKGdjb25zdHBvaW50ZXIgdiwgZ2NvbnN0cG9pbnRlciB3KQorK3sKKysJY29uc3QgY29udmVyc2F0aW9uX2tleSAqdjEgPSAoY29uc3QgY29udmVyc2F0aW9uX2tleSAqKXY7CisrCWNvbnN0IGNvbnZlcnNhdGlvbl9rZXkgKnYyID0gKGNvbnN0IGNvbnZlcnNhdGlvbl9rZXkgKil3OworKworKwlpZiAodjEtPnB0eXBlICE9IHYyLT5wdHlwZSkKKysJCXJldHVybiAwOwkvKiBkaWZmZXJlbnQgdHlwZXMgb2YgcG9ydCAqLworKworKwkvKgorKwkgKiBBcmUgdGhlIGZpcnN0IGFuZCBzZWNvbmQgcG9ydCAxIHZhbHVlcyB0aGUgc2FtZSwgdGhlIGZpcnN0IGFuZAorKwkgKiBzZWNvbmQgcG9ydCAyIHZhbHVlcyB0aGUgc2FtZSwgdGhlIGZpcnN0IGFuZCBzZWNvbmQgYWRkcmVzcworKwkgKiAxIHZhbHVlcyB0aGUgc2FtZSwgYW5kIHRoZSBmaXJzdCBhbmQgc2Vjb25kIGFkZHJlc3MgMiB2YWx1ZXMKKysJICogdGhlIHNhbWU/CisrCSAqLworKwlpZiAodjEtPnBvcnQxID09IHYyLT5wb3J0MSAmJgorKwkgICAgdjEtPnBvcnQyID09IHYyLT5wb3J0MiAmJgorIAkgICAgQUREUkVTU0VTX0VRVUFMKCZ2MS0+YWRkcjEsICZ2Mi0+YWRkcjEpICYmCisgCSAgICBBRERSRVNTRVNfRVFVQUwoJnYxLT5hZGRyMiwgJnYyLT5hZGRyMikpIHsKKyAJCS8qCitAQCAtMjYzLDYgKzM0Miw3IEBACisgCUFERF9BRERSRVNTX1RPX0hBU0goaGFzaF92YWwsICZrZXktPmFkZHIxKTsKKyAJaGFzaF92YWwgKz0ga2V5LT5wb3J0MTsKKyAJaGFzaF92YWwgKz0ga2V5LT5wb3J0MjsKKysJaGFzaF92YWwgKz0ga2V5LT5zdHJpZDsKKyAKKyAJcmV0dXJuIGhhc2hfdmFsOworIH0KK0BAIC0yODksNiArMzY5LDcgQEAKKyAJICovCisgCWlmICh2MS0+cG9ydDEgPT0gdjItPnBvcnQxICYmCisgCSAgICB2MS0+cG9ydDIgPT0gdjItPnBvcnQyICYmCisrCSAgICB2MS0+c3RyaWQgPT0gdjItPnN0cmlkICYmCisgCSAgICBBRERSRVNTRVNfRVFVQUwoJnYxLT5hZGRyMSwgJnYyLT5hZGRyMSkpIHsKKyAJCS8qCisgCQkgKiBZZXMuICBJdCdzIHRoZSBzYW1lIGNvbnZlcnNhdGlvbiwgYW5kIHRoZSB0d28KK0BAIC0zMTcsNiArMzk4LDcgQEAKKyAJQUREX0FERFJFU1NfVE9fSEFTSChoYXNoX3ZhbCwgJmtleS0+YWRkcjEpOworIAloYXNoX3ZhbCArPSBrZXktPnBvcnQxOworIAlBRERfQUREUkVTU19UT19IQVNIKGhhc2hfdmFsLCAma2V5LT5hZGRyMik7CisrCWhhc2hfdmFsICs9IGtleS0+c3RyaWQ7CisgCisgCXJldHVybiBoYXNoX3ZhbDsKKyB9CitAQCAtMzQyLDYgKzQyNCw3IEBACisgCSAqIGFkZHJlc3MgMiB2YWx1ZXMgdGhlIHNhbWU/CisgCSAqLworIAlpZiAodjEtPnBvcnQxID09IHYyLT5wb3J0MSAmJgorKwkgICAgdjEtPnN0cmlkID09IHYyLT5zdHJpZCAmJgorIAkgICAgQUREUkVTU0VTX0VRVUFMKCZ2MS0+YWRkcjEsICZ2Mi0+YWRkcjEpICYmCisgCSAgICBBRERSRVNTRVNfRVFVQUwoJnYxLT5hZGRyMiwgJnYyLT5hZGRyMikpIHsKKyAJCS8qCitAQCAtMzcwLDYgKzQ1Myw3IEBACisgCWhhc2hfdmFsID0gMDsKKyAJQUREX0FERFJFU1NfVE9fSEFTSChoYXNoX3ZhbCwgJmtleS0+YWRkcjEpOworIAloYXNoX3ZhbCArPSBrZXktPnBvcnQxOworKwloYXNoX3ZhbCArPSBrZXktPnN0cmlkOworIAorIAlyZXR1cm4gaGFzaF92YWw7CisgfQorQEAgLTM5NCw2ICs0NzgsNyBAQAorIAkgKiBhbmQgc2Vjb25kIGFkZHJlc3MgMSB2YWx1ZXMgdGhlIHNhbWU/CisgCSAqLworIAlpZiAodjEtPnBvcnQxID09IHYyLT5wb3J0MSAmJgorKwkgICAgdjEtPnN0cmlkID09IHYyLT5zdHJpZCAmJgorIAkgICAgQUREUkVTU0VTX0VRVUFMKCZ2MS0+YWRkcjEsICZ2Mi0+YWRkcjEpKSB7CisgCQkvKgorIAkJICogWWVzLiAgSXQncyB0aGUgc2FtZSBjb252ZXJzYXRpb24sIGFuZCB0aGUgdHdvCitAQCAtNDIwLDYgKzUwNSw4IEBACisgCWNvbnZlcnNhdGlvbl9rZXlzID0gTlVMTDsKKyAJaWYgKGNvbnZlcnNhdGlvbl9oYXNodGFibGVfZXhhY3QgIT0gTlVMTCkKKyAJCWdfaGFzaF90YWJsZV9kZXN0cm95KGNvbnZlcnNhdGlvbl9oYXNodGFibGVfZXhhY3QpOworKwlpZiAoY29udmVyc2F0aW9uX2hhc2h0YWJsZV9ub19zdHJpZCAhPSBOVUxMKQorKwkJZ19oYXNoX3RhYmxlX2Rlc3Ryb3koY29udmVyc2F0aW9uX2hhc2h0YWJsZV9ub19zdHJpZCk7CisgCWlmIChjb252ZXJzYXRpb25faGFzaHRhYmxlX25vX2FkZHIyICE9IE5VTEwpCisgCQlnX2hhc2hfdGFibGVfZGVzdHJveShjb252ZXJzYXRpb25faGFzaHRhYmxlX25vX2FkZHIyKTsKKyAJaWYgKGNvbnZlcnNhdGlvbl9oYXNodGFibGVfbm9fcG9ydDIgIT0gTlVMTCkKK0BAIC00MzgsNiArNTI1LDkgQEAKKyAJY29udmVyc2F0aW9uX2hhc2h0YWJsZV9leGFjdCA9CisgCSAgICBnX2hhc2hfdGFibGVfbmV3KGNvbnZlcnNhdGlvbl9oYXNoX2V4YWN0LAorIAkgICAgICBjb252ZXJzYXRpb25fbWF0Y2hfZXhhY3QpOworKwljb252ZXJzYXRpb25faGFzaHRhYmxlX25vX3N0cmlkID0KKysJICAgIGdfaGFzaF90YWJsZV9uZXcoY29udmVyc2F0aW9uX2hhc2hfbm9fc3RyaWQsCisrCSAgICAgIGNvbnZlcnNhdGlvbl9tYXRjaF9ub19zdHJpZCk7CisgCWNvbnZlcnNhdGlvbl9oYXNodGFibGVfbm9fYWRkcjIgPQorIAkgICAgZ19oYXNoX3RhYmxlX25ldyhjb252ZXJzYXRpb25faGFzaF9ub19hZGRyMiwKKyAJICAgICAgY29udmVyc2F0aW9uX21hdGNoX25vX2FkZHIyKTsKK0BAIC00NjYsNiArNTU2LDE1IEBACisgY29udmVyc2F0aW9uX25ldyhndWludDMyIHNldHVwX2ZyYW1lLCBhZGRyZXNzICphZGRyMSwgYWRkcmVzcyAqYWRkcjIsIHBvcnRfdHlwZSBwdHlwZSwKKyAgICAgZ3VpbnQzMiBwb3J0MSwgZ3VpbnQzMiBwb3J0MiwgZ3VpbnQgb3B0aW9ucykKKyB7CisrCXJldHVybiBjb252ZXJzYXRpb25fbmV3X2V4dChzZXR1cF9mcmFtZSwgYWRkcjEsIGFkZHIyLCBwdHlwZSwKKysgICAgCQlwb3J0MSwgcG9ydDIsIG9wdGlvbnMgJiB+KERJU1RJTkNUX1NDVFBfU1RSRUFNSUQpLCAwKTsKKysKKyt9CisrCisrY29udmVyc2F0aW9uX3QgKgorK2NvbnZlcnNhdGlvbl9uZXdfZXh0KGd1aW50MzIgc2V0dXBfZnJhbWUsIGFkZHJlc3MgKmFkZHIxLCBhZGRyZXNzICphZGRyMiwgcG9ydF90eXBlIHB0eXBlLAorKyAgICBndWludDMyIHBvcnQxLCBndWludDMyIHBvcnQyLCBndWludCBvcHRpb25zLCBndWludDE2IHN0cmlkKQorK3sKKyAvKgorIAlESVNTRUNUT1JfQVNTRVJUKCEob3B0aW9ucyB8IENPTlZFUlNBVElPTl9URU1QTEFURSkgfHwgKChvcHRpb25zIHwgKE5PX0FERFIyIHwgTk9fUE9SVDIgfCBOT19QT1JUMl9GT1JDRSkpKSAmJgorIAkJCQkiQSBjb252ZXJzYXRpb24gdGVtcGxhdGUgbWF5IG5vdCBiZSBjb25zdHJ1Y3RlZCB3aXRob3V0IHdpbGRjYXJkIG9wdGlvbnMiKTsKK0BAIC00ODYsNyArNTg1LDExIEBACisgCQlpZiAob3B0aW9ucyAmIChOT19QT1JUMnxOT19QT1JUMl9GT1JDRSkpIHsKKyAJCQloYXNodGFibGUgPSBjb252ZXJzYXRpb25faGFzaHRhYmxlX25vX3BvcnQyOworIAkJfSBlbHNlIHsKKy0JCQloYXNodGFibGUgPSBjb252ZXJzYXRpb25faGFzaHRhYmxlX2V4YWN0OworKwkJCWlmIChvcHRpb25zICYgRElTVElOQ1RfU0NUUF9TVFJFQU1JRCkgeworKwkJCQloYXNodGFibGUgPSBjb252ZXJzYXRpb25faGFzaHRhYmxlX2V4YWN0OworKwkJCX0gZWxzZSB7CisrCQkJCWhhc2h0YWJsZSA9IGNvbnZlcnNhdGlvbl9oYXNodGFibGVfbm9fc3RyaWQ7CisrCQkJfQorIAkJfQorIAl9CisgCitAQCAtNDk1LDYgKzU5OCw3IEBACisgCWV4aXN0aW5nX2tleS5wdHlwZSA9IHB0eXBlOworIAlleGlzdGluZ19rZXkucG9ydDEgPSBwb3J0MTsKKyAJZXhpc3Rpbmdfa2V5LnBvcnQyID0gcG9ydDI7CisrCWV4aXN0aW5nX2tleS5zdHJpZCA9IHN0cmlkOworIAorIAljb252ZXJzYXRpb24gPSBnX2hhc2hfdGFibGVfbG9va3VwKGhhc2h0YWJsZSwgJmV4aXN0aW5nX2tleSk7CisgCXRjID0gY29udmVyc2F0aW9uOyAvKiBSZW1lbWJlciBpZiBsb29rdXAgd2FzIHN1Y2Nlc3NmdWwgKi8KK0BAIC01MDcsNiArNjExLDcgQEAKKyAJbmV3X2tleS0+cHR5cGUgPSBwdHlwZTsKKyAJbmV3X2tleS0+cG9ydDEgPSBwb3J0MTsKKyAJbmV3X2tleS0+cG9ydDIgPSBwb3J0MjsKKysJbmV3X2tleS0+c3RyaWQgPSBzdHJpZDsKKyAKKyAJaWYgKGNvbnZlcnNhdGlvbikgeworIAkJZm9yICg7IGNvbnZlcnNhdGlvbi0+bmV4dDsgY29udmVyc2F0aW9uID0gY29udmVyc2F0aW9uLT5uZXh0KQorQEAgLTU2OCw4ICs2NzMsMTMgQEAKKyAJCWdfaGFzaF90YWJsZV9pbnNlcnQoY29udmVyc2F0aW9uX2hhc2h0YWJsZV9ub19hZGRyMiwKKyAJCSAgICBjb252LT5rZXlfcHRyLCBjb252KTsKKyAJfSBlbHNlIHsKKy0JCWdfaGFzaF90YWJsZV9pbnNlcnQoY29udmVyc2F0aW9uX2hhc2h0YWJsZV9leGFjdCwKKy0JCSAgICBjb252LT5rZXlfcHRyLCBjb252KTsKKysJCWlmIChjb252LT5vcHRpb25zICYgRElTVElOQ1RfU0NUUF9TVFJFQU1JRCkgeworKwkJCWdfaGFzaF90YWJsZV9pbnNlcnQoY29udmVyc2F0aW9uX2hhc2h0YWJsZV9leGFjdCwKKysJCQkgICAgY29udi0+a2V5X3B0ciwgY29udik7CisrCQl9IGVsc2UgeworKwkJCWdfaGFzaF90YWJsZV9pbnNlcnQoY29udmVyc2F0aW9uX2hhc2h0YWJsZV9ub19zdHJpZCwKKysJCQkgICAgY29udi0+a2V5X3B0ciwgY29udik7CisrCQl9CisgCX0KKyB9CisgCitAQCAtNjAyLDE4ICs3MTIsMjMgQEAKKyAJCWdfaGFzaF90YWJsZV9pbnNlcnQoY29udmVyc2F0aW9uX2hhc2h0YWJsZV9ub19wb3J0MiwKKyAJCSAgICBjb252LT5rZXlfcHRyLCBjb252KTsKKyAJfSBlbHNlIHsKKy0JCWdfaGFzaF90YWJsZV9pbnNlcnQoY29udmVyc2F0aW9uX2hhc2h0YWJsZV9leGFjdCwKKy0JCSAgICBjb252LT5rZXlfcHRyLCBjb252KTsKKysJCWlmIChjb252LT5vcHRpb25zICYgRElTVElOQ1RfU0NUUF9TVFJFQU1JRCkgeworKwkJCWdfaGFzaF90YWJsZV9pbnNlcnQoY29udmVyc2F0aW9uX2hhc2h0YWJsZV9leGFjdCwKKysJCQkgICAgY29udi0+a2V5X3B0ciwgY29udik7CisrCQl9IGVsc2UgeworKwkJCWdfaGFzaF90YWJsZV9pbnNlcnQoY29udmVyc2F0aW9uX2hhc2h0YWJsZV9ub19zdHJpZCwKKysJCQkgICAgY29udi0+a2V5X3B0ciwgY29udik7CisrCQl9CisgCX0KKyB9CisgCisgLyoKKyAgKiBTZWFyY2ggYSBwYXJ0aWN1bGFyIGhhc2ggdGFibGUgZm9yIGEgY29udmVyc2F0aW9uIHdpdGggdGhlIHNwZWNpZmllZAorLSAqIHthZGRyMSwgcG9ydDEsIGFkZHIyLCBwb3J0Mn0gYW5kIHNldCB1cCBiZWZvcmUgZnJhbWVfbnVtLgorKyAqIHthZGRyMSwgcG9ydDEsIGFkZHIyLCBwb3J0Miwgc3RyaWR9IGFuZCBzZXQgdXAgYmVmb3JlIGZyYW1lX251bS4KKyAgKi8KKyBzdGF0aWMgY29udmVyc2F0aW9uX3QgKgorIGNvbnZlcnNhdGlvbl9sb29rdXBfaGFzaHRhYmxlKEdIYXNoVGFibGUgKmhhc2h0YWJsZSwgZ3VpbnQzMiBmcmFtZV9udW0sIGFkZHJlc3MgKmFkZHIxLCBhZGRyZXNzICphZGRyMiwKKy0gICAgcG9ydF90eXBlIHB0eXBlLCBndWludDMyIHBvcnQxLCBndWludDMyIHBvcnQyKQorKyAgICBwb3J0X3R5cGUgcHR5cGUsIGd1aW50MzIgcG9ydDEsIGd1aW50MzIgcG9ydDIsIGd1aW50MTYgc3RyaWQpCisgeworIAljb252ZXJzYXRpb25fdCogY29udmVyc2F0aW9uOworIAljb252ZXJzYXRpb25fdCogbWF0Y2g7CitAQCAtNjI4LDYgKzc0Myw3IEBACisgCWtleS5wdHlwZSA9IHB0eXBlOworIAlrZXkucG9ydDEgPSBwb3J0MTsKKyAJa2V5LnBvcnQyID0gcG9ydDI7CisrCWtleS5zdHJpZCA9IHN0cmlkOworIAorIAltYXRjaCA9IGdfaGFzaF90YWJsZV9sb29rdXAoaGFzaHRhYmxlLCAma2V5KTsKKyAKK0BAIC02ODUsMTIgKzgwMSwxOSBAQAorIGZpbmRfY29udmVyc2F0aW9uKGd1aW50MzIgZnJhbWVfbnVtLCBhZGRyZXNzICphZGRyX2EsIGFkZHJlc3MgKmFkZHJfYiwgcG9ydF90eXBlIHB0eXBlLAorICAgICBndWludDMyIHBvcnRfYSwgZ3VpbnQzMiBwb3J0X2IsIGd1aW50IG9wdGlvbnMpCisgeworKwlyZXR1cm4gZmluZF9jb252ZXJzYXRpb25fZXh0KGZyYW1lX251bSwgYWRkcl9hLCBhZGRyX2IsIHB0eXBlLAorKyAgICAJCXBvcnRfYSwgcG9ydF9iLCBvcHRpb25zIHwgSUdOT1JFX1NDVFBfU1RSRUFNSUQsIDApOworK30KKytjb252ZXJzYXRpb25fdCAqCisrZmluZF9jb252ZXJzYXRpb25fZXh0KGd1aW50MzIgZnJhbWVfbnVtLCBhZGRyZXNzICphZGRyX2EsIGFkZHJlc3MgKmFkZHJfYiwgcG9ydF90eXBlIHB0eXBlLAorKyAgICBndWludDMyIHBvcnRfYSwgZ3VpbnQzMiBwb3J0X2IsIGd1aW50IG9wdGlvbnMsIGd1aW50MTYgc3RyaWQpCisreworICAgIGNvbnZlcnNhdGlvbl90ICpjb252ZXJzYXRpb247CisgCisgICAgLyoKKy0gICAgKiBGaXJzdCB0cnkgYW4gZXhhY3QgbWF0Y2gsIGlmIHdlIGhhdmUgdHdvIGFkZHJlc3NlcyBhbmQgcG9ydHMuCisrICAgICogRmlyc3QgdHJ5IGFuIGV4YWN0IG1hdGNoLCBpZiB3ZSBoYXZlIHR3byBhZGRyZXNzZXMgYW5kIHBvcnRzIGFuZCBzdHJpZC4KKyAgICAgKi8KKy0gICBpZiAoIShvcHRpb25zICYgKE5PX0FERFJfQnxOT19QT1JUX0IpKSkgeworKyAgIGlmICghKG9wdGlvbnMgJiAoTk9fQUREUl9CfE5PX1BPUlRfQnxJR05PUkVfU0NUUF9TVFJFQU1JRCkpKSB7CisgICAgICAgLyoKKyAgICAgICAgKiBOZWl0aGVyIHNlYXJjaCBhZGRyZXNzIEIgbm9yIHNlYXJjaCBwb3J0IEIgYXJlIHdpbGRjYXJkZWQsCisgICAgICAgICogc3RhcnQgb3V0IHdpdGggYW4gZXhhY3QgbWF0Y2guCitAQCAtNjk5LDcgKzgyMiw3IEBACisgICAgICAgY29udmVyc2F0aW9uID0KKyAgICAgICAgICBjb252ZXJzYXRpb25fbG9va3VwX2hhc2h0YWJsZShjb252ZXJzYXRpb25faGFzaHRhYmxlX2V4YWN0LAorICAgICAgICAgIGZyYW1lX251bSwgYWRkcl9hLCBhZGRyX2IsIHB0eXBlLAorLSAgICAgICAgIHBvcnRfYSwgcG9ydF9iKTsKKysgICAgICAgICBwb3J0X2EsIHBvcnRfYiwgc3RyaWQpOworICAgICAgIGlmICgoY29udmVyc2F0aW9uID09IE5VTEwpICYmIChhZGRyX2EtPnR5cGUgPT0gQVRfRkMpKSB7CisgICAgICAgICAgLyogSW4gRmlicmUgY2hhbm5lbCwgT1hJRCAmIFJYSUQgYXJlIG5ldmVyIHN3YXBwZWQgYXMKKyAgICAgICAgICAgKiBUQ1AvVURQIHBvcnRzIGFyZSBpbiBUQ1AvSVAuCitAQCAtNzA3LDcgKzgzMCwzMyBAQAorICAgICAgICAgIGNvbnZlcnNhdGlvbiA9CisgICAgICAgICAgICAgY29udmVyc2F0aW9uX2xvb2t1cF9oYXNodGFibGUoY29udmVyc2F0aW9uX2hhc2h0YWJsZV9leGFjdCwKKyAgICAgICAgICAgICBmcmFtZV9udW0sIGFkZHJfYiwgYWRkcl9hLCBwdHlwZSwKKy0gICAgICAgICAgICBwb3J0X2EsIHBvcnRfYik7CisrICAgICAgICAgICAgcG9ydF9hLCBwb3J0X2IsIHN0cmlkKTsKKysgICAgICB9CisrICAgICAgaWYgKGNvbnZlcnNhdGlvbiAhPSBOVUxMKQorKyAgICAgICAgIHJldHVybiBjb252ZXJzYXRpb247CisrICAgfQorKworKyAgIC8qCisrICAgICogVGhlbiwgaWdub3Jpbmcgc3RyaWQgdHJ5IGFuIGV4YWN0IG1hdGNoLCBpZiB3ZSBoYXZlIHR3byBhZGRyZXNzZXMgYW5kIHBvcnRzLgorKyAgICAqLworKyAgIGlmICghKG9wdGlvbnMgJiAoTk9fQUREUl9CfE5PX1BPUlRfQnxOT19JR05PUkVfU0NUUF9TVFJFQU1JRCkpKSB7CisrICAgICAgLyoKKysgICAgICAgKiBOZWl0aGVyIHNlYXJjaCBhZGRyZXNzIEIgbm9yIHNlYXJjaCBwb3J0IEIgYXJlIHdpbGRjYXJkZWQsCisrICAgICAgICogc3RhcnQgb3V0IHdpdGggYW4gZXhhY3QgbWF0Y2guCisrICAgICAgICogRXhhY3QgbWF0Y2hlcyBjaGVjayBib3RoIGRpcmVjdGlvbnMuCisrICAgICAgICovCisrICAgICAgY29udmVyc2F0aW9uID0KKysgICAgICAgICBjb252ZXJzYXRpb25fbG9va3VwX2hhc2h0YWJsZShjb252ZXJzYXRpb25faGFzaHRhYmxlX25vX3N0cmlkLAorKyAgICAgICAgIGZyYW1lX251bSwgYWRkcl9hLCBhZGRyX2IsIHB0eXBlLAorKyAgICAgICAgIHBvcnRfYSwgcG9ydF9iLCBzdHJpZCk7CisrICAgICAgaWYgKChjb252ZXJzYXRpb24gPT0gTlVMTCkgJiYgKGFkZHJfYS0+dHlwZSA9PSBBVF9GQykpIHsKKysgICAgICAgICAvKiBJbiBGaWJyZSBjaGFubmVsLCBPWElEICYgUlhJRCBhcmUgbmV2ZXIgc3dhcHBlZCBhcworKyAgICAgICAgICAqIFRDUC9VRFAgcG9ydHMgYXJlIGluIFRDUC9JUC4KKysgICAgICAgICAgKi8KKysgICAgICAgICBjb252ZXJzYXRpb24gPQorKyAgICAgICAgICAgIGNvbnZlcnNhdGlvbl9sb29rdXBfaGFzaHRhYmxlKGNvbnZlcnNhdGlvbl9oYXNodGFibGVfbm9fc3RyaWQsCisrICAgICAgICAgICAgZnJhbWVfbnVtLCBhZGRyX2IsIGFkZHJfYSwgcHR5cGUsCisrICAgICAgICAgICAgcG9ydF9hLCBwb3J0X2IsIHN0cmlkKTsKKyAgICAgICB9CisgICAgICAgaWYgKGNvbnZlcnNhdGlvbiAhPSBOVUxMKQorICAgICAgICAgIHJldHVybiBjb252ZXJzYXRpb247CitAQCAtNzI5LDcgKzg3OCw3IEBACisgICAgICAgICovCisgICAgICAgY29udmVyc2F0aW9uID0KKyAgICAgICAgICBjb252ZXJzYXRpb25fbG9va3VwX2hhc2h0YWJsZShjb252ZXJzYXRpb25faGFzaHRhYmxlX25vX2FkZHIyLAorLSAgICAgICAgIGZyYW1lX251bSwgYWRkcl9hLCBhZGRyX2IsIHB0eXBlLCBwb3J0X2EsIHBvcnRfYik7CisrICAgICAgICAgZnJhbWVfbnVtLCBhZGRyX2EsIGFkZHJfYiwgcHR5cGUsIHBvcnRfYSwgcG9ydF9iLCBzdHJpZCk7CisgICAgICAgaWYgKChjb252ZXJzYXRpb24gPT0gTlVMTCkgJiYgKGFkZHJfYS0+dHlwZSA9PSBBVF9GQykpIHsKKyAgICAgICAgICAvKiBJbiBGaWJyZSBjaGFubmVsLCBPWElEICYgUlhJRCBhcmUgbmV2ZXIgc3dhcHBlZCBhcworICAgICAgICAgICAqIFRDUC9VRFAgcG9ydHMgYXJlIGluIFRDUC9JUC4KK0BAIC03MzcsNyArODg2LDcgQEAKKyAgICAgICAgICBjb252ZXJzYXRpb24gPQorICAgICAgICAgICAgIGNvbnZlcnNhdGlvbl9sb29rdXBfaGFzaHRhYmxlKGNvbnZlcnNhdGlvbl9oYXNodGFibGVfbm9fYWRkcjIsCisgICAgICAgICAgICAgZnJhbWVfbnVtLCBhZGRyX2IsIGFkZHJfYSwgcHR5cGUsCistICAgICAgICAgICAgcG9ydF9hLCBwb3J0X2IpOworKyAgICAgICAgICAgIHBvcnRfYSwgcG9ydF9iLCBzdHJpZCk7CisgICAgICAgfQorICAgICAgIGlmIChjb252ZXJzYXRpb24gIT0gTlVMTCkgeworICAgICAgICAgIC8qCitAQCAtNzc5LDcgKzkyOCw3IEBACisgICAgICAgaWYgKCEob3B0aW9ucyAmIE5PX0FERFJfQikpIHsKKyAgICAgICAgICBjb252ZXJzYXRpb24gPQorICAgICAgICAgICAgIGNvbnZlcnNhdGlvbl9sb29rdXBfaGFzaHRhYmxlKGNvbnZlcnNhdGlvbl9oYXNodGFibGVfbm9fYWRkcjIsCistICAgICAgICAgICAgZnJhbWVfbnVtLCBhZGRyX2IsIGFkZHJfYSwgcHR5cGUsIHBvcnRfYiwgcG9ydF9hKTsKKysgICAgICAgICAgICBmcmFtZV9udW0sIGFkZHJfYiwgYWRkcl9hLCBwdHlwZSwgcG9ydF9iLCBwb3J0X2EsIHN0cmlkKTsKKyAgICAgICAgICBpZiAoY29udmVyc2F0aW9uICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAqIElmIHRoaXMgaXMgZm9yIGEgY29ubmVjdGlvbi1vcmllbnRlZAorQEAgLTgyMSwxNCArOTcwLDE0IEBACisgICAgICAgICovCisgICAgICAgY29udmVyc2F0aW9uID0KKyAgICAgICAgICBjb252ZXJzYXRpb25fbG9va3VwX2hhc2h0YWJsZShjb252ZXJzYXRpb25faGFzaHRhYmxlX25vX3BvcnQyLAorLSAgICAgICAgIGZyYW1lX251bSwgYWRkcl9hLCBhZGRyX2IsIHB0eXBlLCBwb3J0X2EsIHBvcnRfYik7CisrICAgICAgICAgZnJhbWVfbnVtLCBhZGRyX2EsIGFkZHJfYiwgcHR5cGUsIHBvcnRfYSwgcG9ydF9iLCBzdHJpZCk7CisgICAgICAgaWYgKChjb252ZXJzYXRpb24gPT0gTlVMTCkgJiYgKGFkZHJfYS0+dHlwZSA9PSBBVF9GQykpIHsKKyAgICAgICAgICAvKiBJbiBGaWJyZSBjaGFubmVsLCBPWElEICYgUlhJRCBhcmUgbmV2ZXIgc3dhcHBlZCBhcworICAgICAgICAgICAqIFRDUC9VRFAgcG9ydHMgYXJlIGluIFRDUC9JUAorICAgICAgICAgICAqLworICAgICAgICAgIGNvbnZlcnNhdGlvbiA9CisgICAgICAgICAgICAgY29udmVyc2F0aW9uX2xvb2t1cF9oYXNodGFibGUoY29udmVyc2F0aW9uX2hhc2h0YWJsZV9ub19wb3J0MiwKKy0gICAgICAgICAgICBmcmFtZV9udW0sIGFkZHJfYiwgYWRkcl9hLCBwdHlwZSwgcG9ydF9hLCBwb3J0X2IpOworKyAgICAgICAgICAgIGZyYW1lX251bSwgYWRkcl9iLCBhZGRyX2EsIHB0eXBlLCBwb3J0X2EsIHBvcnRfYiwgc3RyaWQpOworICAgICAgIH0KKyAgICAgICBpZiAoY29udmVyc2F0aW9uICE9IE5VTEwpIHsKKyAgICAgICAgICAvKgorQEAgLTg3MCw3ICsxMDE5LDcgQEAKKyAgICAgICBpZiAoIShvcHRpb25zICYgTk9fUE9SVF9CKSkgeworICAgICAgICAgIGNvbnZlcnNhdGlvbiA9CisgICAgICAgICAgICAgY29udmVyc2F0aW9uX2xvb2t1cF9oYXNodGFibGUoY29udmVyc2F0aW9uX2hhc2h0YWJsZV9ub19wb3J0MiwKKy0gICAgICAgICAgICBmcmFtZV9udW0sIGFkZHJfYiwgYWRkcl9hLCBwdHlwZSwgcG9ydF9iLCBwb3J0X2EpOworKyAgICAgICAgICAgIGZyYW1lX251bSwgYWRkcl9iLCBhZGRyX2EsIHB0eXBlLCBwb3J0X2IsIHBvcnRfYSwgc3RyaWQpOworICAgICAgICAgIGlmIChjb252ZXJzYXRpb24gIT0gTlVMTCkgeworICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICogSWYgdGhpcyBpcyBmb3IgYSBjb25uZWN0aW9uLW9yaWVudGVkCitAQCAtOTA3LDcgKzEwNTYsNyBAQAorICAgICAqLworICAgIGNvbnZlcnNhdGlvbiA9CisgICAgICAgY29udmVyc2F0aW9uX2xvb2t1cF9oYXNodGFibGUoY29udmVyc2F0aW9uX2hhc2h0YWJsZV9ub19hZGRyMl9vcl9wb3J0MiwKKy0gICAgICBmcmFtZV9udW0sIGFkZHJfYSwgYWRkcl9iLCBwdHlwZSwgcG9ydF9hLCBwb3J0X2IpOworKyAgICAgIGZyYW1lX251bSwgYWRkcl9hLCBhZGRyX2IsIHB0eXBlLCBwb3J0X2EsIHBvcnRfYiwgc3RyaWQpOworICAgIGlmIChjb252ZXJzYXRpb24gIT0gTlVMTCkgeworICAgICAgIC8qCisgICAgICAgICogSWYgdGhpcyBpcyBmb3IgYSBjb25uZWN0aW9uLW9yaWVudGVkIHByb3RvY29sOgorQEAgLTk1MiwxMSArMTEwMSwxMSBAQAorICAgIGlmIChhZGRyX2EtPnR5cGUgPT0gQVRfRkMpCisgICAgICAgY29udmVyc2F0aW9uID0KKyAgICAgICBjb252ZXJzYXRpb25fbG9va3VwX2hhc2h0YWJsZShjb252ZXJzYXRpb25faGFzaHRhYmxlX25vX2FkZHIyX29yX3BvcnQyLAorLSAgICAgIGZyYW1lX251bSwgYWRkcl9iLCBhZGRyX2EsIHB0eXBlLCBwb3J0X2EsIHBvcnRfYik7CisrICAgICAgZnJhbWVfbnVtLCBhZGRyX2IsIGFkZHJfYSwgcHR5cGUsIHBvcnRfYSwgcG9ydF9iLCBzdHJpZCk7CisgICAgZWxzZQorICAgICAgIGNvbnZlcnNhdGlvbiA9CisgICAgICAgY29udmVyc2F0aW9uX2xvb2t1cF9oYXNodGFibGUoY29udmVyc2F0aW9uX2hhc2h0YWJsZV9ub19hZGRyMl9vcl9wb3J0MiwKKy0gICAgICBmcmFtZV9udW0sIGFkZHJfYiwgYWRkcl9hLCBwdHlwZSwgcG9ydF9iLCBwb3J0X2EpOworKyAgICAgIGZyYW1lX251bSwgYWRkcl9iLCBhZGRyX2EsIHB0eXBlLCBwb3J0X2IsIHBvcnRfYSwgc3RyaWQpOworICAgIGlmIChjb252ZXJzYXRpb24gIT0gTlVMTCkgeworICAgICAgIC8qCisgICAgICAgICogSWYgdGhpcyBpcyBmb3IgYSBjb25uZWN0aW9uLW9yaWVudGVkIHByb3RvY29sLCBzZXQgdGhlCitkaWZmIC1OdXIgd2lyZXNoYXJrLTEuMi43L2VwYW4vY29udmVyc2F0aW9uLmggd2lyZXNoYXJrLTEuMi43LWZEL2VwYW4vY29udmVyc2F0aW9uLmgKKy0tLSB3aXJlc2hhcmstMS4yLjcvZXBhbi9jb252ZXJzYXRpb24uaAkyMDEwLTA0LTAxIDAxOjQ0OjM5LjAwMDAwMDAwMCArMDkwMAorKysrIHdpcmVzaGFyay0xLjIuNy1mRC9lcGFuL2NvbnZlcnNhdGlvbi5oCTIwMTEtMDItMjMgMTQ6MjU6NDQuMDAwMDAwMDAwICswOTAwCitAQCAtMzksMTEgKzM5LDEzIEBACisgICogVEVNUExBVEUgZmxhZyB3aWxsIGJlIGFsdGVyZWQgb25jZSB0aGUgZmlyc3QgY29ubmVjdGlvbnMgKGNvbm5lY3Rpb24KKyAgKiBvcmllbnRlZCBwcm90b2NvbHMgb25seSkgdG8gaW5jbHVkZSB0aGUgbmV3bHkgZm91bmQgaW5mb3JtYXRpb24gd2hpY2gKKyAgKiBtYXRjaGVkIHRoZSB3aWxkY2FyZCBvcHRpb25zLgorKyAqIERJU1RJTkNUX1NDVFBfU1RSRUFNSUQgd2lsbCBhbHNvIHNhdmUgdGhlIFNDVFAgc3RyZWFtIGlkZW50aWZpZXIsIGlmIGFueS4KKyAgKi8KKyAjZGVmaW5lIE5PX0FERFIyIDB4MDEKKyAjZGVmaW5lIE5PX1BPUlQyIDB4MDIKKyAjZGVmaW5lIE5PX1BPUlQyX0ZPUkNFIDB4MDQKKyAjZGVmaW5lIENPTlZFUlNBVElPTl9URU1QTEFURSAweDA4CisrI2RlZmluZSBESVNUSU5DVF9TQ1RQX1NUUkVBTUlEIDB4MTAKKyAKKyAvKgorICAqIEZsYWdzIHRvIHBhc3MgdG8gImZpbmRfY29udmVyc2F0aW9uKCkiIHRvIGluZGljYXRlIHRoYXQgdGhlIGFkZHJlc3MgQgorQEAgLTUxLDYgKzUzLDggQEAKKyAgKi8KKyAjZGVmaW5lIE5PX0FERFJfQiAweDAxCisgI2RlZmluZSBOT19QT1JUX0IgMHgwMgorKyNkZWZpbmUgSUdOT1JFX1NDVFBfU1RSRUFNSUQgMHgwNAorKyNkZWZpbmUgTk9fSUdOT1JFX1NDVFBfU1RSRUFNSUQgMHgwOAorIAorICNpbmNsdWRlICJwYWNrZXQuaCIJCS8qIGZvciBjb252ZXJzYXRpb24gZGlzc2VjdG9yIHR5cGUgKi8KKyAKK0BAIC02NCw2ICs2OCw3IEBACisgCXBvcnRfdHlwZSBwdHlwZTsKKyAJZ3VpbnQzMglwb3J0MTsKKyAJZ3VpbnQzMglwb3J0MjsKKysJZ3VpbnQxNglzdHJpZDsKKyB9IGNvbnZlcnNhdGlvbl9rZXk7CisgCisgdHlwZWRlZiBzdHJ1Y3QgY29udmVyc2F0aW9uIHsKK0BAIC04NSw2ICs5MCwxMyBAQAorIGV4dGVybiBjb252ZXJzYXRpb25fdCAqZmluZF9jb252ZXJzYXRpb24oZ3VpbnQzMiBmcmFtZV9udW0sIGFkZHJlc3MgKmFkZHJfYSwgYWRkcmVzcyAqYWRkcl9iLAorICAgICBwb3J0X3R5cGUgcHR5cGUsIGd1aW50MzIgcG9ydF9hLCBndWludDMyIHBvcnRfYiwgZ3VpbnQgb3B0aW9ucyk7CisgCisrLyogZm9yIFNDVFAgc3RyZWFtICovCisrZXh0ZXJuIGNvbnZlcnNhdGlvbl90ICpjb252ZXJzYXRpb25fbmV3X2V4dChndWludDMyIHNldHVwX2ZyYW1lLCBhZGRyZXNzICphZGRyMSwgYWRkcmVzcyAqYWRkcjIsCisrICAgIHBvcnRfdHlwZSBwdHlwZSwgZ3VpbnQzMiBwb3J0MSwgZ3VpbnQzMiBwb3J0MiwgZ3VpbnQgb3B0aW9ucywgZ3VpbnQxNiBzdHJpZCk7CisrZXh0ZXJuIGNvbnZlcnNhdGlvbl90ICpmaW5kX2NvbnZlcnNhdGlvbl9leHQoZ3VpbnQzMiBmcmFtZV9udW0sIGFkZHJlc3MgKmFkZHJfYSwgYWRkcmVzcyAqYWRkcl9iLAorKyAgICBwb3J0X3R5cGUgcHR5cGUsIGd1aW50MzIgcG9ydF9hLCBndWludDMyIHBvcnRfYiwgZ3VpbnQgb3B0aW9ucywgZ3VpbnQxNiBzdHJpZCk7CisrICAgIAorKworIGV4dGVybiB2b2lkIGNvbnZlcnNhdGlvbl9hZGRfcHJvdG9fZGF0YShjb252ZXJzYXRpb25fdCAqY29udiwgaW50IHByb3RvLAorICAgICB2b2lkICpwcm90b19kYXRhKTsKKyBleHRlcm4gdm9pZCAqY29udmVyc2F0aW9uX2dldF9wcm90b19kYXRhKGNvbnZlcnNhdGlvbl90ICpjb252LCBpbnQgcHJvdG8pOworZGlmZiAtTnVyIHdpcmVzaGFyay0xLjIuNy9lcGFuL2Rpc3NlY3RvcnMvcGFja2V0LWRpYW1ldGVyLmMgd2lyZXNoYXJrLTEuMi43LWZEL2VwYW4vZGlzc2VjdG9ycy9wYWNrZXQtZGlhbWV0ZXIuYworLS0tIHdpcmVzaGFyay0xLjIuNy9lcGFuL2Rpc3NlY3RvcnMvcGFja2V0LWRpYW1ldGVyLmMJMjAxMC0wNC0wMSAwMTo0NDoyMS4wMDAwMDAwMDAgKzA5MDAKKysrKyB3aXJlc2hhcmstMS4yLjctZkQvZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1kaWFtZXRlci5jCTIwMTEtMDItMjMgMTM6MzM6MTAuMDAwMDAwMDAwICswOTAwCitAQCAtNjMsOCArNjMsMTAgQEAKKyAjaW5jbHVkZSAicGFja2V0LW50cC5oIgorICNpbmNsdWRlICJwYWNrZXQtZGlhbWV0ZXIuaCIKKyAjaW5jbHVkZSAiZGlhbV9kaWN0LmgiCisrI2luY2x1ZGUgInBhY2tldC1zc2wuaCIKKyAKKyAjZGVmaW5lIFNDVFBfUE9SVF9ESUFNRVRFUgkzODY4CisrI2RlZmluZSBTQ1RQX1RMU19QT1JUX0RJQU1FVEVSCTM4NjkKKyAKKyAvKiBEaWFtZXRlciBIZWFkZXIgRmxhZ3MgKi8KKyAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlBFVHJycnJDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0MgICovCitAQCAtMjcxLDEwICsyNzMsMTMgQEAKKyAKKyAKKyBzdGF0aWMgZ3VpbnQgZ2JsX2RpYW1ldGVyU2N0cFBvcnQ9U0NUUF9QT1JUX0RJQU1FVEVSOworK3N0YXRpYyBndWludCBnYmxfZGlhbWV0ZXJTY3RwVGxzUG9ydD1TQ1RQX1RMU19QT1JUX0RJQU1FVEVSOworIAorIHN0YXRpYyBkaXNzZWN0b3JfaGFuZGxlX3QgZGlhbWV0ZXJfdGNwX2hhbmRsZTsKKyBzdGF0aWMgcmFuZ2VfdCAqZ2xvYmFsX2RpYW1ldGVyX3RjcF9wb3J0X3JhbmdlOworK3N0YXRpYyByYW5nZV90ICpnbG9iYWxfZGlhbWV0ZXJfdGNwX3Rsc19wb3J0X3JhbmdlOworICNkZWZpbmUgREVGQVVMVF9ESUFNRVRFUl9QT1JUX1JBTkdFICIzODY4IgorKyNkZWZpbmUgREVGQVVMVF9ESUFNRVRFUl9UTFNfUE9SVF9SQU5HRSAiMzg2OSIKKyAKKyAvKiBkZXNlZ21lbnRhdGlvbiBvZiBEaWFtZXRlciBvdmVyIFRDUCAqLworIHN0YXRpYyBnYm9vbGVhbiBnYmxfZGlhbWV0ZXJfZGVzZWdtZW50ID0gVFJVRTsKK0BAIC0xMzU4LDEzICsxMzYzLDI3IEBACisgICAgIGRpc3NlY3Rvcl9hZGQoInRjcC5wb3J0IiwgcG9ydCwgZGlhbWV0ZXJfdGNwX2hhbmRsZSk7CisgfQorIAorK3N0YXRpYyB2b2lkCisrcmFuZ2VfZGVsZXRlX2NhbGxiYWNrX3NlYyhndWludDMyIHBvcnQpCisreworKyAgICBzc2xfZGlzc2VjdG9yX2RlbGV0ZShwb3J0LCAiZGlhbWV0ZXIiLCBUUlVFKTsKKyt9CisrCisrc3RhdGljIHZvaWQKKytyYW5nZV9hZGRfY2FsbGJhY2tfc2VjKGd1aW50MzIgcG9ydCkKKyt7CisrICAgIHNzbF9kaXNzZWN0b3JfYWRkKHBvcnQsICJkaWFtZXRlciIsIFRSVUUpOworK30KKysKKyB2b2lkCisgcHJvdG9fcmVnX2hhbmRvZmZfZGlhbWV0ZXIodm9pZCkKKyB7CisgCXN0YXRpYyBnYm9vbGVhbiBJbml0aWFsaXplZD1GQUxTRTsKKyAJc3RhdGljIGd1aW50IFNjdHBQb3J0OworKwlzdGF0aWMgZ3VpbnQgU2N0cHNQb3J0OworIAlzdGF0aWMgZGlzc2VjdG9yX2hhbmRsZV90IGRpYW1ldGVyX2hhbmRsZTsKKyAJc3RhdGljIHJhbmdlX3QgKmRpYW1ldGVyX3RjcF9wb3J0X3JhbmdlOworKwlzdGF0aWMgcmFuZ2VfdCAqZGlhbWV0ZXJzX3RjcF9wb3J0X3JhbmdlOworIAorIAlpZiAoIUluaXRpYWxpemVkKSB7CisgCQlkaWFtZXRlcl9oYW5kbGUgPSBmaW5kX2Rpc3NlY3RvcigiZGlhbWV0ZXIiKTsKK0BAIC0xMzgyLDIwICsxNDAxLDI3IEBACisgCQkvKiBBVlAgQ29kZTogNDYzIEVBUC1SZWlzc3VlZC1QYXlsb2FkICovCisgCQlkaXNzZWN0b3JfYWRkKCJkaWFtZXRlci5iYXNlIiwgNDYzLCAKKyAJCQluZXdfY3JlYXRlX2Rpc3NlY3Rvcl9oYW5kbGUoZGlzc2VjdF9kaWFtZXRlcl9lYXBfcGF5bG9hZCwgcHJvdG9fZGlhbWV0ZXIpKTsKKysJCQkKKysJCS8qIHNldCBwb3J0IGZvciBmdXR1cmUgZGVsZXRlcyAqLworKwkJZGlhbWV0ZXJfdGNwX3BvcnRfcmFuZ2UgPSByYW5nZV9jb3B5KGdsb2JhbF9kaWFtZXRlcl90Y3BfcG9ydF9yYW5nZSk7CisrCQlyYW5nZV9mb3JlYWNoKGRpYW1ldGVyX3RjcF9wb3J0X3JhbmdlLCByYW5nZV9hZGRfY2FsbGJhY2spOworKwkJZGlhbWV0ZXJzX3RjcF9wb3J0X3JhbmdlID0gcmFuZ2VfY29weShnbG9iYWxfZGlhbWV0ZXJfdGNwX3Rsc19wb3J0X3JhbmdlKTsKKysJCXJhbmdlX2ZvcmVhY2goZGlhbWV0ZXJzX3RjcF9wb3J0X3JhbmdlLCByYW5nZV9hZGRfY2FsbGJhY2tfc2VjKTsKKysJCQorKwkJZGlzc2VjdG9yX2FkZCgic2N0cC5wb3J0IiwgZ2JsX2RpYW1ldGVyU2N0cFBvcnQsIGRpYW1ldGVyX2hhbmRsZSk7CisrCQlzc2xfZGlzc2VjdG9yX2FkZChnYmxfZGlhbWV0ZXJTY3RwVGxzUG9ydCwgImRpYW1ldGVyIiwgVFJVRSk7CisgCisgCQlJbml0aWFsaXplZD1UUlVFOworIAl9IGVsc2UgeworIAkJcmFuZ2VfZm9yZWFjaChkaWFtZXRlcl90Y3BfcG9ydF9yYW5nZSwgcmFuZ2VfZGVsZXRlX2NhbGxiYWNrKTsKKyAJCWdfZnJlZShkaWFtZXRlcl90Y3BfcG9ydF9yYW5nZSk7CisrCQlyYW5nZV9mb3JlYWNoKGRpYW1ldGVyc190Y3BfcG9ydF9yYW5nZSwgcmFuZ2VfZGVsZXRlX2NhbGxiYWNrX3NlYyk7CisrCQlnX2ZyZWUoZGlhbWV0ZXJzX3RjcF9wb3J0X3JhbmdlKTsKKyAJCWRpc3NlY3Rvcl9kZWxldGUoInNjdHAucG9ydCIsIFNjdHBQb3J0LCBkaWFtZXRlcl9oYW5kbGUpOworIAl9CisgCistCS8qIHNldCBwb3J0IGZvciBmdXR1cmUgZGVsZXRlcyAqLworLQlkaWFtZXRlcl90Y3BfcG9ydF9yYW5nZSA9IHJhbmdlX2NvcHkoZ2xvYmFsX2RpYW1ldGVyX3RjcF9wb3J0X3JhbmdlKTsKKy0JcmFuZ2VfZm9yZWFjaChkaWFtZXRlcl90Y3BfcG9ydF9yYW5nZSwgcmFuZ2VfYWRkX2NhbGxiYWNrKTsKKyAKKy0JU2N0cFBvcnQ9Z2JsX2RpYW1ldGVyU2N0cFBvcnQ7CistCWRpc3NlY3Rvcl9hZGQoInNjdHAucG9ydCIsIGdibF9kaWFtZXRlclNjdHBQb3J0LCBkaWFtZXRlcl9oYW5kbGUpOworKwkKKyB9CisgCisgLyogcmVnaXN0cmF0aW9uIHdpdGggdGhlIGZpbHRlcmluZyBlbmdpbmUgKi8KK0BAIC0xNTQzLDggKzE1NjksOSBAQAorIAlkaWFtZXRlcl9kaXNzZWN0b3JfdGFibGUgPSByZWdpc3Rlcl9kaXNzZWN0b3JfdGFibGUoImRpYW1ldGVyLmJhc2UiLCAiRElBTUVURVJfM0dQUF9BVlBTIiwgRlRfVUlOVDMyLCBCQVNFX0RFQyk7CisgCWRpYW1ldGVyXzNncHBfYXZwX2Rpc3NlY3Rvcl90YWJsZSA9IHJlZ2lzdGVyX2Rpc3NlY3Rvcl90YWJsZSgiZGlhbWV0ZXIuM2dwcCIsICJESUFNRVRFUl8zR1BQX0FWUFMiLCBGVF9VSU5UMzIsIEJBU0VfREVDKTsKKyAKKy0JLyogU2V0IGRlZmF1bHQgVENQIHBvcnRzICovCisrCS8qIFNldCBkZWZhdWx0IFRDUCAmIFRMUyBwb3J0cyAqLworIAlyYW5nZV9jb252ZXJ0X3N0cigmZ2xvYmFsX2RpYW1ldGVyX3RjcF9wb3J0X3JhbmdlLCBERUZBVUxUX0RJQU1FVEVSX1BPUlRfUkFOR0UsIE1BWF9VRFBfUE9SVCk7CisrCXJhbmdlX2NvbnZlcnRfc3RyKCZnbG9iYWxfZGlhbWV0ZXJfdGNwX3Rsc19wb3J0X3JhbmdlLCBERUZBVUxUX0RJQU1FVEVSX1RMU19QT1JUX1JBTkdFLCBNQVhfVURQX1BPUlQpOworIAorIAkvKiBSZWdpc3RlciBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHBvcnRzICovCisgCWRpYW1ldGVyX21vZHVsZSA9IHByZWZzX3JlZ2lzdGVyX3Byb3RvY29sKHByb3RvX2RpYW1ldGVyLAorZGlmZiAtTnVyIHdpcmVzaGFyay0xLjIuNy9lcGFuL2Rpc3NlY3RvcnMvcGFja2V0LXNjdHAuYyB3aXJlc2hhcmstMS4yLjctZkQvZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1zY3RwLmMKKy0tLSB3aXJlc2hhcmstMS4yLjcvZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1zY3RwLmMJMjAxMC0wNC0wMSAwMTo0NDoyOC4wMDAwMDAwMDAgKzA5MDAKKysrKyB3aXJlc2hhcmstMS4yLjctZkQvZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1zY3RwLmMJMjAxMS0wMi0yMyAxMzo1NDoxMy4wMDAwMDAwMDAgKzA5MDAKK0BAIC0yNjkzLDYgKzI2OTMsNyBAQAorICAgYl9iaXQgPSB0dmJfZ2V0X2d1aW50OChjaHVua190dmIsIENIVU5LX0ZMQUdTX09GRlNFVCkgJiBTQ1RQX0RBVEFfQ0hVTktfQl9CSVQ7CisgICB1X2JpdCA9IHR2Yl9nZXRfZ3VpbnQ4KGNodW5rX3R2YiwgQ0hVTktfRkxBR1NfT0ZGU0VUKSAmIFNDVFBfREFUQV9DSFVOS19VX0JJVDsKKyAgIHN0cmVhbV9pZCA9IHR2Yl9nZXRfbnRvaHMoY2h1bmtfdHZiLCBEQVRBX0NIVU5LX1NUUkVBTV9JRF9PRkZTRVQpOworKyAgcGluZm8tPnN0cmlkID0gc3RyZWFtX2lkOworICAgc3RyZWFtX3NlcV9udW0gPSB0dmJfZ2V0X250b2hzKGNodW5rX3R2YiwgREFUQV9DSFVOS19TVFJFQU1fU0VRX05VTUJFUl9PRkZTRVQpOworICAgdHNuID0gdHZiX2dldF9udG9obChjaHVua190dmIsIERBVEFfQ0hVTktfVFNOX09GRlNFVCk7CisgCitkaWZmIC1OdXIgd2lyZXNoYXJrLTEuMi43L2VwYW4vZGlzc2VjdG9ycy9wYWNrZXQtc3NsLmMgd2lyZXNoYXJrLTEuMi43LWZEL2VwYW4vZGlzc2VjdG9ycy9wYWNrZXQtc3NsLmMKKy0tLSB3aXJlc2hhcmstMS4yLjcvZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1zc2wuYwkyMDEwLTA0LTAxIDAxOjQ0OjM0LjAwMDAwMDAwMCArMDkwMAorKysrIHdpcmVzaGFyay0xLjIuNy1mRC9lcGFuL2Rpc3NlY3RvcnMvcGFja2V0LXNzbC5jCTIwMTEtMDItMjMgMTQ6NTY6MzYuMDAwMDAwMDAwICswOTAwCitAQCAtNTAwLDYgKzUwMCw3IEBACisgICAgIGd1aW50KiBjb252X3ZlcnNpb247CisgICAgIFNzbF9wcml2YXRlX2tleV90ICogcHJpdmF0ZV9rZXk7CisgICAgIGd1aW50MzIgcG9ydDsKKysgICAgZ3VpbnQxNiBzdHJpZDsKKyAKKyAgICAgdGkgPSBOVUxMOworICAgICBzc2xfdHJlZSAgID0gTlVMTDsKK0BAIC01MDcsOSArNTA4LDE0IEBACisgICAgIGZpcnN0X3JlY29yZF9pbl9mcmFtZSA9IFRSVUU7CisgICAgIHNzbF9zZXNzaW9uID0gTlVMTDsKKyAgICAgcG9ydCA9IDA7CisrICAgIHN0cmlkID0gMDsKKyAKKyAKKyAgICAgc3NsX2RlYnVnX3ByaW50ZigiXG5kaXNzZWN0X3NzbCBlbnRlciBmcmFtZSAjJXUgKCVzKVxuIiwgcGluZm8tPmZkLT5udW0sIChwaW5mby0+ZmQtPmZsYWdzLnZpc2l0ZWQpPyJhbHJlYWR5IHZpc2l0ZWQiOiJmaXJzdCB0aW1lIik7CisrICAgIAorKyAgICBpZiAocGluZm8tPnB0eXBlID09IFBUX1NDVFApIHsKKysgICAgCXNzbF9kZWJ1Z19wcmludGYoIlxuZGlzc2VjdF9zc2wgU0NUUCBzdHJlYW0gJWhkXG4iLCBwaW5mby0+c3RyaWQpOworKyAgICB9CisgCisgICAgIC8qIFRyYWNrIHRoZSB2ZXJzaW9uIHVzaW5nIGNvbnZlcnNhdGlvbnMgdG8gcmVkdWNlIHRoZQorICAgICAgKiBjaGFuY2UgdGhhdCBhIHBhY2tldCB0aGF0IHNpbXBseSAqbG9va3MqIGxpa2UgYSB2MiBvcgorQEAgLTUyMywxNCArNTI5LDE0IEBACisgICAgICAqICAgICAgIHRoZSBjb252X3ZlcnNpb24sIG11c3Qgc2V0IHRoZSBjb3B5IGluIHRoZSBjb252ZXJzYXRpb24KKyAgICAgICogICAgICAgaW4gYWRkaXRpb24gdG8gY29udl92ZXJzaW9uCisgICAgICAqLworLSAgICBjb252ZXJzYXRpb24gPSBmaW5kX2NvbnZlcnNhdGlvbihwaW5mby0+ZmQtPm51bSwgJnBpbmZvLT5zcmMsICZwaW5mby0+ZHN0LCBwaW5mby0+cHR5cGUsCistICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpbmZvLT5zcmNwb3J0LCBwaW5mby0+ZGVzdHBvcnQsIDApOworKyAgICBjb252ZXJzYXRpb24gPSBmaW5kX2NvbnZlcnNhdGlvbl9leHQocGluZm8tPmZkLT5udW0sICZwaW5mby0+c3JjLCAmcGluZm8tPmRzdCwgcGluZm8tPnB0eXBlLAorKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaW5mby0+c3JjcG9ydCwgcGluZm8tPmRlc3Rwb3J0LCBOT19JR05PUkVfU0NUUF9TVFJFQU1JRCwgcGluZm8tPnN0cmlkKTsKKyAKKyAgICAgaWYgKCFjb252ZXJzYXRpb24pCisgICAgIHsKKyAgICAgICAgIC8qIGNyZWF0ZSBhIG5ldyBjb252ZXJzYXRpb24gKi8KKy0gICAgICAgIGNvbnZlcnNhdGlvbiA9IGNvbnZlcnNhdGlvbl9uZXcocGluZm8tPmZkLT5udW0sICZwaW5mby0+c3JjLCAmcGluZm8tPmRzdCwgcGluZm8tPnB0eXBlLAorLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaW5mby0+c3JjcG9ydCwgcGluZm8tPmRlc3Rwb3J0LCAwKTsKKysgICAgICAgIGNvbnZlcnNhdGlvbiA9IGNvbnZlcnNhdGlvbl9uZXdfZXh0KHBpbmZvLT5mZC0+bnVtLCAmcGluZm8tPnNyYywgJnBpbmZvLT5kc3QsIHBpbmZvLT5wdHlwZSwKKysgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGluZm8tPnNyY3BvcnQsIHBpbmZvLT5kZXN0cG9ydCwgKHBpbmZvLT5wdHlwZSA9PSBQVF9TQ1RQKSA/IERJU1RJTkNUX1NDVFBfU1RSRUFNSUQgOiAwLCBwaW5mby0+c3RyaWQpOworICAgICAgICAgc3NsX2RlYnVnX3ByaW50ZigiICBuZXcgY29udmVyc2F0aW9uID0gJXAgY3JlYXRlZFxuIiwgKHZvaWQgKiljb252ZXJzYXRpb24pOworICAgICB9CisgICAgIGNvbnZfZGF0YSA9IGNvbnZlcnNhdGlvbl9nZXRfcHJvdG9fZGF0YShjb252ZXJzYXRpb24sIHByb3RvX3NzbCk7CitAQCAtNTQ5LDcgKzU1NSw3IEBACisgICAgICAgICBjb252ZXJzYXRpb25fYWRkX3Byb3RvX2RhdGEoY29udmVyc2F0aW9uLCBwcm90b19zc2wsIHNzbF9zZXNzaW9uKTsKKyAKKyAgICAgICAgIC8qIHdlIG5lZWQgdG8ga25vdyB3aGljaCBzaWRlIG9mIHRoZSBjb252ZXJzYXRpb24gaXMgc3BlYWtpbmcgKi8KKy0gICAgICAgIGlmIChzc2xfcGFja2V0X2Zyb21fc2VydmVyKHNzbF9hc3NvY2lhdGlvbnMsIHBpbmZvLT5zcmNwb3J0LCBwaW5mby0+cHR5cGUgPT0gUFRfVENQKSkgeworKyAgICAgICAgaWYgKHNzbF9wYWNrZXRfZnJvbV9zZXJ2ZXIoc3NsX2Fzc29jaWF0aW9ucywgcGluZm8tPnNyY3BvcnQsIHBpbmZvLT5wdHlwZSAhPSBQVF9VRFApKSB7CisgICAgICAgICAgICAgZHVtbXkuYWRkciA9IHBpbmZvLT5zcmM7CisgICAgICAgICAgICAgZHVtbXkucG9ydCA9IHBvcnQgPSBwaW5mby0+c3JjcG9ydDsKKyAgICAgICAgIH0gZWxzZSB7CitAQCAtNzYyLDcgKzc2OCw3IEBACisgICAgICAqIGFkZCBkZWNyeXB0ZWQgZGF0YSB0byB0aGlzIHBhY2tldCBpbmZvICovCisgICAgIHNzbF9kZWJ1Z19wcmludGYoImRlY3J5cHRfc3NsM19yZWNvcmQ6IGFwcF9kYXRhIGxlbiAlZCBzc2wsIHN0YXRlIDB4JTAyWFxuIiwKKyAgICAgICAgIHJlY29yZF9sZW5ndGgsIHNzbC0+c3RhdGUpOworLSAgICBkaXJlY3Rpb24gPSBzc2xfcGFja2V0X2Zyb21fc2VydmVyKHNzbF9hc3NvY2lhdGlvbnMsIHBpbmZvLT5zcmNwb3J0LCBwaW5mby0+cHR5cGUgPT0gUFRfVENQKTsKKysgICAgZGlyZWN0aW9uID0gc3NsX3BhY2tldF9mcm9tX3NlcnZlcihzc2xfYXNzb2NpYXRpb25zLCBwaW5mby0+c3JjcG9ydCwgcGluZm8tPnB0eXBlICE9IFBUX1VEUCk7CisgCisgICAgIC8qIHJldHJpZXZlIGRlY29kZXIgZm9yIHRoaXMgcGFja2V0IGRpcmVjdGlvbiAqLworICAgICBpZiAoZGlyZWN0aW9uICE9IDApIHsKK0BAIC0xNTA0LDcgKzE1MTAsNyBAQAorICAgICAgICAgICAgIGNvbF9hcHBlbmRfc3RyKHBpbmZvLT5jaW5mbywgQ09MX0lORk8sICJDaGFuZ2UgQ2lwaGVyIFNwZWMiKTsKKyAgICAgICAgIGRpc3NlY3Rfc3NsM19jaGFuZ2VfY2lwaGVyX3NwZWModHZiLCBzc2xfcmVjb3JkX3RyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwgY29udl92ZXJzaW9uLCBjb250ZW50X3R5cGUpOworLSAgICAgICAgaWYgKHNzbCkgc3NsX2NoYW5nZV9jaXBoZXIoc3NsLCBzc2xfcGFja2V0X2Zyb21fc2VydmVyKHNzbF9hc3NvY2lhdGlvbnMsIHBpbmZvLT5zcmNwb3J0LCBwaW5mby0+cHR5cGUgPT0gUFRfVENQKSk7CisrICAgICAgICBpZiAoc3NsKSBzc2xfY2hhbmdlX2NpcGhlcihzc2wsIHNzbF9wYWNrZXRfZnJvbV9zZXJ2ZXIoc3NsX2Fzc29jaWF0aW9ucywgcGluZm8tPnNyY3BvcnQsIHBpbmZvLT5wdHlwZSAhPSBQVF9VRFApKTsKKyAgICAgICAgIGJyZWFrOworICAgICBjYXNlIFNTTF9JRF9BTEVSVDoKKyAgICAgeworQEAgLTE1NjYsOCArMTU3Miw4IEBACisgICAgICAgICAvKiB3ZSBuZWVkIGRpc3NlY3RvciBpbmZvcm1hdGlvbiB3aGVuIHRoZSBzZWxlY3RlZCBwYWNrZXQgaXMgc2hvd24uCisgICAgICAgICAgKiBzc2wgc2Vzc2lvbiBwb2ludGVyIGlzIE5VTEwgYXQgdGhhdCB0aW1lLCBzbyB3ZSBjYW4ndCBhY2Nlc3MKKyAgICAgICAgICAqIGluZm8gY2FjaGVkIHRoZXJlKi8KKy0gICAgICAgIGFzc29jaWF0aW9uID0gc3NsX2Fzc29jaWF0aW9uX2ZpbmQoc3NsX2Fzc29jaWF0aW9ucywgcGluZm8tPnNyY3BvcnQsIHBpbmZvLT5wdHlwZSA9PSBQVF9UQ1ApOworLSAgICAgICAgYXNzb2NpYXRpb24gPSBhc3NvY2lhdGlvbiA/IGFzc29jaWF0aW9uOiBzc2xfYXNzb2NpYXRpb25fZmluZChzc2xfYXNzb2NpYXRpb25zLCBwaW5mby0+ZGVzdHBvcnQsIHBpbmZvLT5wdHlwZSA9PSBQVF9UQ1ApOworKyAgICAgICAgYXNzb2NpYXRpb24gPSBzc2xfYXNzb2NpYXRpb25fZmluZChzc2xfYXNzb2NpYXRpb25zLCBwaW5mby0+c3JjcG9ydCwgcGluZm8tPnB0eXBlICE9IFBUX1VEUCk7CisrICAgICAgICBhc3NvY2lhdGlvbiA9IGFzc29jaWF0aW9uID8gYXNzb2NpYXRpb246IHNzbF9hc3NvY2lhdGlvbl9maW5kKHNzbF9hc3NvY2lhdGlvbnMsIHBpbmZvLT5kZXN0cG9ydCwgcGluZm8tPnB0eXBlICE9IFBUX1VEUCk7CisgCisgICAgICAgICBwcm90b19pdGVtX3NldF90ZXh0KHNzbF9yZWNvcmRfdHJlZSwKKyAgICAgICAgICAgICIlcyBSZWNvcmQgTGF5ZXI6ICVzIFByb3RvY29sOiAlcyIsCitkaWZmIC1OdXIgd2lyZXNoYXJrLTEuMi43L2VwYW4vZGlzc2VjdG9ycy9wYWNrZXQtc3NsLXV0aWxzLmMgd2lyZXNoYXJrLTEuMi43LWZEL2VwYW4vZGlzc2VjdG9ycy9wYWNrZXQtc3NsLXV0aWxzLmMKKy0tLSB3aXJlc2hhcmstMS4yLjcvZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1zc2wtdXRpbHMuYwkyMDEwLTA0LTAxIDAxOjQ0OjI3LjAwMDAwMDAwMCArMDkwMAorKysrIHdpcmVzaGFyay0xLjIuNy1mRC9lcGFuL2Rpc3NlY3RvcnMvcGFja2V0LXNzbC11dGlscy5jCTIwMTEtMDItMjMgMTM6MzM6MTAuMDAwMDAwMDAwICswOTAwCitAQCAtMjcxMyw5ICsyNzEzLDEwIEBACisgICAgIGZwcmludGYoc3RkZXJyLCAiYXNzb2NpYXRpb25fYWRkKCkgY291bGQgbm90IGZpbmQgaGFuZGxlIGZvciBwcm90b2NvbDolc1xuIixwcm90b2NvbCk7CisgICB9IGVsc2UgeworICAgICBpZihwb3J0KSB7CistICAgICAgaWYodGNwKQorKyAgICAgIGlmKHRjcCkgeworICAgICAgICAgZGlzc2VjdG9yX2FkZCgidGNwLnBvcnQiLCBwb3J0LCBoYW5kbGUpOworLSAgICAgIGVsc2UKKysgICAgICAgIGRpc3NlY3Rvcl9hZGQoInNjdHAucG9ydCIsIHBvcnQsIGhhbmRsZSk7CisrICAgICAgfSBlbHNlCisgICAgICAgICBkaXNzZWN0b3JfYWRkKCJ1ZHAucG9ydCIsIHBvcnQsIGhhbmRsZSk7CisgICAgIH0KKyAgICAgZ190cmVlX2luc2VydChhc3NvY2lhdGlvbnMsIGFzc29jLCBhc3NvYyk7CitkaWZmIC1OdXIgd2lyZXNoYXJrLTEuMi43L2VwYW4vcGFja2V0X2luZm8uaCB3aXJlc2hhcmstMS4yLjctZkQvZXBhbi9wYWNrZXRfaW5mby5oCistLS0gd2lyZXNoYXJrLTEuMi43L2VwYW4vcGFja2V0X2luZm8uaAkyMDEwLTA0LTAxIDAxOjQ0OjQwLjAwMDAwMDAwMCArMDkwMAorKysrIHdpcmVzaGFyay0xLjIuNy1mRC9lcGFuL3BhY2tldF9pbmZvLmgJMjAxMS0wMi0yMyAxMzo1NDo1Mi4wMDAwMDAwMDAgKzA5MDAKK0BAIC0xNjksNiArMTY5LDcgQEAKKyAgIHR2YnVmZl90ICpnc3NhcGlfZGVjcnlwdGVkX3R2YjsKKyAgIGdib29sZWFuIGdzc2FwaV9kYXRhX2VuY3J5cHRlZDsKKyAKKysgIGd1aW50MTYgc3RyaWQ7IC8qIFN0cmVhbSBJZCBvZiB0aGUgbGFzdCBEQVRBIGNodW5rIGluIHRoZSBwYWNrZXQgKi8KKyAgIGd1aW50MzIgcHBpZDsgIC8qIFNDVFAgUFBJIG9mIGN1cnJlbnQgREFUQSBjaHVuayAqLworICAgZ3VpbnQzMiBwcGlkc1tNQVhfTlVNQkVSX09GX1BQSURTXTsgLyogVGhlIGZpcnN0IE5VTUJFUl9PRl9QUElEUyBQUElEUyB3aGljaCBhcmUgcHJlc2VudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpbiB0aGUgU0NUUCBwYWNrZXQKZGlmZiAtLWdpdCBhL2RvYy9hY2xfd2wuY29uZi5zYW1wbGUgYi9kb2MvYWNsX3dsLmNvbmYuc2FtcGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ODZmMWEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYWNsX3dsLmNvbmYuc2FtcGxlCkBAIC0wLDAgKzEsMTkgQEAKKyMgQ29uZmlndXJhdGlvbiBmaWxlIGZvciB0aGUgcGVlciB3aGl0ZWxpc3QgZXh0ZW5zaW9uLgorIworIyBUaGlzIGV4dGVuc2lvbiBpcyBtZWFudCB0byBhbGxvdyBjb25uZWN0aW9uIGZyb20gcmVtb3RlIHBlZXJzLCB3aXRob3V0IGFjdGl2ZWx5CisjIG1haW50YWluaW5nIHRoaXMgY29ubmVjdGlvbiBvdXJzZWx2ZXMgKGFzIGl0IHdvdWxkIGJlIHRoZSBjYXNlIGJ5IGRlY2xhcmluZyB0aGUgCisjIHBlZXIgaW4gYSBDb25uZWN0UGVlciBkaXJlY3RpdmUpLgorIyBUaGUgZm9ybWF0IG9mIHRoaXMgZmlsZSBpcyB2ZXJ5IHNpbXBsZS4gSXQgY29udGFpbnMgYSBsaXN0IG9mIHBlZXIgbmFtZXMKKyMgc2VwYXJhdGVkIGJ5IHNwYWNlcyBvciBuZXdsaW5lcy4gCisjCisjIFRoZSBwZWVyIG5hbWUgbXVzdCBiZSBhIGZxZG4uIFdlIGFsbG93IGFsc28gYSBzcGVjaWFsICIqIiBjaGFyYWN0ZXIgYXMgdGhlCisjIGZpcnN0IGxhYmVsIG9mIHRoZSBmcWRuLCB0byBhbGxvdyBhbGwgZnFkbiB3aXRoIHRoZSBzYW1lIGRvbWFpbiBuYW1lLgorIyBFeGFtcGxlOiAqLmV4YW1wbGUubmV0IHdpbGwgYWxsb3cgaG9zdDEuZXhhbXBsZS5uZXQgYW5kIGhvc3QyLmV4YW1wbGUubmV0CisjCisjIEF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLCB0aGUgZm9sbG93aW5nIGZsYWdzIGFyZSBhbGxvd2VkIChjYXNlIHNlbnNpdGl2ZSkgLS0gZWl0aGVyIG9yIGJvdGggY2FuIGFwcGVhcjoKKyMgQUxMT1dfT0xEX1RMUyA6IHdlIGFjY2VwdCB1bnByb3RlY3RlZCBDRVIvQ0VBIGV4Y2hhbmdlIHdpdGggSW5iYW5kLVNlY3VyaXR5LUlkID0gVExTCisjIEFMTE9XX0lQU0VDICAgOiB3ZSBhY2NlcHQgaW1wbGljaXRseSBwcm90ZWN0ZWQgY29ubmVjdGlvbiB3aXRoIHdpdGggcGVlciAoSW5iYW5kLVNlY3VyaXR5LUlkID0gSVBTZWMpCisjIEl0IGlzIHNwZWNpZmllZCBmb3IgZXhhbXBsZSBhczoKKyMgQUxMT1dfSVBTRUMgdnBuLmV4YW1wbGUubmV0IHZwbjIuZXhhbXBsZS5uZXQgKi52cG4uZXhhbXBsZS5uZXQKKyMgVGhlc2UgZmxhZyB0YWtlIGVmZmVjdCBmcm9tIHRoZWlyIHBvc2l0aW9uLCB1bnRpbCB0aGUgZW5kIG9mIHRoZSBsaW5lLgorCmRpZmYgLS1naXQgYS9kb2MvYXBwX2FjY3QuY29uZi5zYW1wbGUgYi9kb2MvYXBwX2FjY3QuY29uZi5zYW1wbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNmYWU4MAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9hcHBfYWNjdC5jb25mLnNhbXBsZQpAQCAtMCwwICsxLDgyIEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlc2NyaXB0aW9uIG9mIGNvbmZpZ3VyYXRpb24gYW5kIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlCisjICJBcHBfQWNjdCIgZXh0ZW5zaW9uLgorCisjIFRoaXMgZXh0ZW5zaW9uIHByb3ZpZGVzIGEgc2ltcGxlIERpYW1ldGVyIEFjY291bnRpbmcgc2VydmVyLgorIyAgVGhlIGV4dGVuc2lvbiBkb2VzIHJlY2VpdmUgdGhlIEFjY291bnRpbmctUmVxdWVzdCBtZXNzYWdlLCB0aGVuCisjIHNhdmVzIHRoZSBjb250ZW50cyBvZiB0aGUgQVZQIGluIGEgZGF0YWJhc2UsIGFzIGNvbmZpZ3VyZWQgaGVyZS4KKyMgIFRoZSBkYXRhIGlzIG5vdCBwcm9jZXNzZWQgYXQgYWxsLiBUaGUgaW50ZW50IGlzIHRoYXQgYSBkZWRpY2F0ZWQKKyMgYXBwbGljYXRpb24gd2lsbCB0aGVuIHB1bGwgZnJvbSB0aGlzIGRhdGFiYXNlIGFuZCBwcm9jZXNzIHRoZSBkYXRhIChjb25zb2xpZGF0ZSAKKyMgc2Vzc2lvbnMsIC4uLikKKworIyBJbiBvcmRlciB0byBlbmFibGUgdGhpcyBleHRlbnNpb24sIHRoZSBtYWluIGZyZWVEaWFtZXRlciBjb25maWd1cmF0aW9uIGZpbGUKKyMgbXVzdCBjb250YWluIHRoZSBmb2xsb3dpbmcgZGVjbGFyYXRpb246CisjIExvYWRFeHRlbnNpb24gPSAiZXh0ZW5zaW9ucy9hcHBfYWNjdC5mZHgiIDogIi9wYXRoL3RvL2FwcF9hY2N0LmNvbmYiIDsKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMjIyMjIyMjIyMjIyMjIyMjCisjIyBQYXJ0IEk6IEFWUCAjIworIyMjIyMjIyMjIyMjIyMjIyMKKworIyBDb25maWd1cmUgaGVyZSB0aGUgQVZQcyB0aGF0IG11c3QgYmUgc3RvcmVkIGluIHRoZSBkYXRhYmFzZS4KKyMgVGhlIGZvcm1hdCBpczoKKyMJICAiQVZQLWRpY3Rpb25hcnktbmFtZSIgPSB7CisjCQlmaWVsZCA9ICJkYi1maWVsZC1uYW1lIjsKKyMJCXJlcXVpcmVkOworIwkJbXVsdGk9TjsKKyMJICB9OworIyBXaGVyZToKKyMgIEFWUC1kaWN0aW9uYXJ5LW5hbWU6CisjIAlUaGUgbmFtZSBvZiB0aGUgQVZQLCBzdWNoIGFzICJTZXNzaW9uLUlkIi4gT25seSB0aGlzIGZpZWxkIGlzIG1hbmRhdG9yeS4KKyMgIGZpZWxkPSIuLi4iOgorIwlUaGUgbmFtZSBvZiB0aGUgZmllbGQgaW4gdGhlIGRhdGFiYXNlIHdoZXJlIGlzIEFWUCBjb250ZW50cyB3aWxsIGJlIHNhdmVkLgorIwlUaGUgZGVmYXVsdCBpcyB0aGF0IHRoZSBmaWVsZCBpcyBuYW1lZCBhcyB0aGUgQVZQLWRpY3Rpb25hcnktbmFtZS4KKyMgIHJlcXVpcmVkOgorIwlCeSBkZWZhdWx0LCBpZiB0aGUgQVZQIGlzIG5vdCBpbiB0aGUgRGlhbWV0ZXIgbWVzc2FnZSwgaXQgaXMgbm90IHBhc3NlZCBpbiAKKyMJdGhlIElOU0VSVCBzdGF0ZW1lbnQgKHdpbGwgZ2V0IE5VTEwpLiBJZiBSZXF1aXJlZCBpcyBzcGVjaWZpZWQgZm9yIHRoZSBBVlAsCisjCWFuIGVycm9yIGlzIHJldHVybmVkIGluIHRoZSBEaWFtZXRlciBhbnN3ZXIsIGFuZCB0aGUgZGF0YSBpcyBkaXNjYXJkZWQuCisjICBtdWx0aT1OOgorIwlJZiBhbiBBVlAgbWF5IGFwcGVhciBzZXZlcmFsIHRpbWVzIGluIGEgcmVxdWVzdCwgeW91IG1heSBzcGVjaWZ5IGEgbnVtYmVyIG9mCisjCW9jY3VycmVuY2VzIHRvIHNhdmUgaW4gdGhlIGRhdGFiYXNlLiBUaGUgTnRoIGZpcnN0IG9jY3VycmVuY2VzIG9mIHRoZSBBVlAgCisjCXdpbGwgYmUgc2F2ZWQgaW4gZmllbGRzICJkYi1maWVsZC1uYW1lMSIsICJkYi1maWVsZC1uYW1lMiIsIC4uLiAiZGItZmllbGQtbmFtZU4iCisjCisjIEluIGNhc2UgdGhlIGRlZmF1bHQgYmVoYXZpb3IgZm9yIGFuIEFWUCBpcyBmaW5lLCB5b3UgY2FuIHVzZSB0aGUgc2hvcnQgc3ludGF4OgorIyAgIkFWUC1kaWN0aW9uYXJ5LW5hbWUiOworIworIyBOb3RlIHRoYXQgYXQgdGhlIG1vbWVudCwgR1JPVVBFRCBBVlAgYXJlIG5vdCBzdXBwb3J0ZWQuIEFsc28sIG9ubHkgdGhlIHRvcC1sZXZlbCBBVlBzIGFyZQorIyBzZWFyY2hlZC4gVGhpcyBiZWhhdmlvciBjYW4gYmUgY2hhbmdlZCBxdWl0ZSBlYXNpbHkgaWYgbmVlZGVkLgorCisjIFlvdSBtYXkgbG9vayBhdCBjb250cmliL2FwcF9hY2N0X3Rvb2xzL2FwcF9hY2N0LmNvbmYgYW5kIGRhdGFiYXNlLnNxbCBmaWxlcworIyBmb3IgYW4gZXhhbXBsZSBvZiBzZXR1cC4KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMgUGFydCBJSTogRGF0YWJhc2UgIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgWW91IG11c3Qgc3BlY2lmeSB0aGUgY29ubmVjdGlvbiBpbmZvcm1hdGlvbiB0byB0aGUgZGF0YWJhc2UgaGVyZS4KKyMgUGxlYXNlIG5vdGUgdGhhdCBpZiB0aGUgY29ubmVjdGlvbiBpcyB0ZXJtaW5hdGVkLCBpdCB3aWxsIHRyaWcgdGhlIHNodXRkb3duIG9mIHRoZSBmcmVlRGlhbWV0ZXIgZGFlbW9uCisjIEZvciB0aGlzIHJlYXNvbiwgeW91IHNob3VsZCBhcyBtdWNoIGFzIHBvc3NpYmxlIHVzZSBhIGxvY2FsIGRhdGFiYXNlLgorCisjIENvbm5JbmZvOgorIyBUaGUgY29ubmVjdGlvbiBzdHJpbmcgdG8gdGhlIGRhdGFiYXNlLiBTZWUgaHR0cDovL3d3dy5wb3N0Z3Jlc3FsLm9yZy9kb2NzLzguNC9zdGF0aWMvbGlicHEtY29ubmVjdC5odG1sCisjIEV4YW1wbGU6IENvbm5JbmZvID0gImhvc3Q9bG9jYWxob3N0IHBvcnQ9NTQzMiBkYm5hbWU9YWNjdCB1c2VyPWFjY3QgcGFzc3dvcmQ9ZnJlZWRpYW1ldGVyIjsKKworIyBUYWJsZToKKyMgVGhlIG5hbWUgb2YgdGhlIHRhYmxlIHRvIHVzZS4gVGhlIGZpZWxkcyBhbmQgdHlwZXMgaW4gdGhpcyB0YWJsZSBtdXN0IGJlIGNyZWF0ZWQgYWNjb3JkaW5nbHkgdG8gdGhlIFBhcnQgSSBjb25maWd1cmF0aW9uIGluIHRoaXMgZmlsZS4KKyMgRXhhbXBsZTogVGFibGUgPSAiaW5jb21pbmciOworCisjIFRpbWVzdGFtcF9maWVsZDoKKyMgT3B0aW9uYWxseSwgeW91IGNhbiBzcGVjaWZ5IGEgbmFtZSBvZiBhIGZpZWxkIHRoYXQgd2lsbCByZWNlaXZlIHRoZSB2YWx1ZSAnbm93JyB3aGVuIGEgbmV3IHJlY29yZCBpcyBpbnNlcnRlZC4KKyMgRGVmYXVsdDogbm8gdGltZXN0YW1wIGlzIGluc2VydGVkLgorIyBFeGFtcGxlOiBUaW1lc3RhbXBfZmllbGQgPSAicmVjb3JkZWRfb24iOworCisjIFNlcnZlcl9uYW1lX2ZpZWxkOgorIyBPcHRpb25hbGx5LCB5b3UgY2FuIHNwZWNpZnkgYSBmaWVsZCB3aGljaCB3aWxsIHJlY2VpdmUgdGhlIERpYW1ldGVyIElkZW50aXR5IG9mIHRoZSBsb2NhbCBzZXJ2ZXIgZm9yIGVhY2ggcmVjb3JkIHNhdmVkLgorIyBUaGlzIGlzIHVzZWZ1bCBlc3BlY2lhbGx5IGlmIHlvdSBoYXZlIHNldmVyYWwgQWNjb3VudGluZyBzZXJ2ZXJzIGFuZCB3YW50IHRvIGNoZWNrIExvYWQtQmFsYW5jaW5nIGJlaGF2aW9yIG9yIHNvLAorIyBhZnRlciBhZ2dyZWdhdGluZyBhbGwgdGhlIGRhdGEuCisjIERlZmF1bHQ6IG5vIHNlcnZlciBuYW1lIGluc2VydGVkLgorIyBFeGFtcGxlOiBTZXJ2ZXJfbmFtZV9maWVsZCA9ICJyZWNvcmRlZF9zZXJ2IjsKKworCisKZGlmZiAtLWdpdCBhL2RvYy9hcHBfZGlhbWVhcC5jb25mLnNhbXBsZSBiL2RvYy9hcHBfZGlhbWVhcC5jb25mLnNhbXBsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGE4YWE3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2FwcF9kaWFtZWFwLmNvbmYuc2FtcGxlCkBAIC0wLDAgKzEsNDQgQEAKKyMjIyMjIGEgc2FtcGxlIENvbmZpZ3VyYXRpb24gZmlsZSBmb3IgRGlhbUVBUAorCisjIE15U1FMIERhdGFiYXNlIHNldHRpbmdzCisjIFNwZWNpZnkgY29ubmVjdGlvbiBwYXJhbWV0ZXJzIGZvciBEaWFtRUFQIE15U1FMIGRhdGFiYXNlOiAKKyMgLSB1c2VybmFtZSBhbmQgcGFzc3dvcmQgdG8gY29ubmVjdCB0byB0aGUgTXlTUUwgU2VydmVyCisjIC0gZGF0YWJhc2VzZXJ2ZXIgOiB0aGUgTXlTUUwgc2VydmVyIGxvY2F0aW9uLiBJdCBjYW4gYmUgdGhlIElQIGFkZHJlc3Mgb3IgdGhlIGhvc3QgbmFtZSB3aGVyZSBNeVNRTCBzZXJ2ZXIgaXMgbG9jYXRlZC4gJ2xvY2FsaG9zdCcgY2FuIGJlIHVzZWQgYXMgdGhlIGxvY2F0aW9uIGlmIHRoZSBzZXJ2ZXIgaXMgbG9jYXRkIGluIHRoZSBzYW1lIGhvc3QgdGhhbiBEaWFtRUFQLgorIyAtIGRhdGFiYXNlX25hbWUgOiB0aGUgY3JlYXRlZCBkYXRhYmFzZSBmb3IgRGlhbUVBUC4KKworIyBTeW50YXggOgorIyBEaWFtRUFQX015U1FMID0gIjx1c2VybmFtZT4iICwgIjxwYXNzd29yZD4iICwgIjxkYXRhYmFzZXNlcnZlcj4iICwgIjxkYXRhYmFzZV9uYW1lPiI7CisKKworCisjIyMjIyBFeHRlbnNpYmxlIEF1dGhlbnRpY2F0aW9uIFByb3RvY29sIChFQVApIE1ldGhvZHMgUGx1Z2lucyAjIyMjIworIyBBbiBFQVAgbWV0aG9kIGlzIGlkZW50aWZpZWQgYnkgaXRzIEVBUCBtZXRob2QgbmFtZSwgRUFQIFRZUEUsIFZFTkRPUiBhbmQgcGF0aCB0byBpdHMgRUFQIE1ldGhvZCBQbHVnaW4uIAorIyBPcHRpb25hbGx5LCBwYXRoIHRvIGEgY29uZmlndXJhdGlvbiBmaWxlIG9mIHBsdWdpbiBjYW4gYWxzbyBiZSBwcm92aWRlZC4gCisjIExvY2F0aW9uIG9mIHBsdWdpbnMgYW5kIHRoZWlyIGNvbmZpZ3VyYXRpb24gZmlsZXMgY2FuIGJlIHByb3ZpZGVkIGJ5IHRoZSBhYnNvbHV0ZSBwYXRob3IgdGhlIHJlbGF0aXZlIHBhdGggZnJvbSB0aGUgbG9jYXRpb24gY29uZmlndXJlZCBpbiBjbWFrZS4KKyMgQW4gRUFQIE1ldGhvZCBQbHVnaW4gY2FuIG5vdCBiZSBsb2FkZWQgdHdpY2UuIE9ubHkgdGhlIGZpcnN0IGFkZGVkIG1ldGhvZCB3aWxsIGJlIGxvYWRlZC4KKyMgQW55IEVBUCBNZXRob2QgcGx1Z2luIHdpdGggYSBzYW1lIEVBUF9UWVBFIHZhbHVlIHRoYW4gYW4gYWxyZWFkeSBsb2FkZWQgb25lIHdpbGwgYmUgZGlzY2FyZGVkLgorIyBFQVAgTWV0aG9kcyBhcmUgYWRkZWQgaW4gdGhlIHNhbWUgb3JkZXIgdGhleSBhcmUgYWRkZWQgdG8gdGhlIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCisgCisjIFN5bnRheCA6IAorIyBMb2FkX3BsdWdpbiA9ICI8RUFQIG1ldGhvZCBuYW1lPiI6RUFQX1RZUEU6VkVORE9SOiI8UGF0aCB0byBFQVAgbWV0aG9kID4iOiI8UGF0aCB0byBjb25maWd1cmF0aW9uIGZpbGU+IjsKKyMKKyMgRXhhbXBsZToKKyMgTG9hZF9wbHVnaW4gPSAiRUFQIE1ENSI6NDowOiIvZXh0ZW5zaW9ucy9lYXBfbWQ1LmVtcCI6IiI7CisjIExvYWRfcGx1Z2luID0gIkVBUCBUTFMiOjEzOjA7Ii9leHRlbnNpb25zL2VhcF90bHMuZW1wIjoiL2RvYy9lYXBfdGxzX3BsdWdpbi5kaWFtZWFwLmNvbmYiOworCitMb2FkX3BsdWdpbiA9ICJFQVAgSWRlbnRpdHkiOjE6MDoiL2V4dGVuc2lvbnMvZWFwX2lkZW50aXR5LmVtcCI6IiI7CisKKyMgRW5hYmxlL2Rpc2FibGUgY2hlY2tpbmcgVXNlcidzIElkZW50aXR5LiBJZiBkaXNhYmxlZCwgZGVmYXVsdCBwYXJhbWV0ZXJzIHZhbHVlIHdpbGwgYmUgdXNlZCBmb3IgYXV0aGVudGljYXRpb24gYW5kIGF1dGhvcml6YXRpb24gYXR0cmlidXRlcy4KKyMgRGVmYXVsdCB2YWx1ZXMgYXJlIGRlZmluZWQgaW4gZGF0YWJhc2UgZm9yICdEZWZhdWx0IFVzZXInLgorQ2hlY2tfVXNlcl9JZGVudGl0eSA9IDE7CisKKyMgSW4gYWRkaXRpb24gdG8gYXV0aGVudGljYXRpb24gRGlhbUVBUCBjYW4gYmUgY29uZmlndXJlZCB0byBjaGVjayBhdXRob3JpemF0aW9uIG9mIGF1dGhlbnRpY2F0ZWQgdXNlcnMuIElmIHNldCB0byAwIGF1dGhvcml6YXRpb24gaXMgZGlzYWJsZWQsIG90aGVyd2lzZSBlbmFibGVkLiggYnkgZGVmYXVsdCBkaXNhYmxlZCkuCitBdXRob3JpemF0aW9uID0gMTsKKworIyBUaGlzIHBhcmFtZXRlciBzcGVjaWZ5IHRoZSBtYXhpbXVtIG51bWJlciBvZiBzZWNvbmRzIHByb3ZpZGVkIHRvIHRoZSBhY2Nlc3MgZGV2aWNlIGZvciByZXNwb25kaW5nIHRvIGFuIEVBUCByZXF1ZXN0LiAoYnkgZGVmYXVsdCBzZXQgdG8gMzAgc2Vjb25kcykKKyNNdWx0aV9Sb3VuZF9UaW1lX091dD0zMDsKKworIyBBZnRlciByZWNlaXZpbiBhIG51bWJlciBvZiBpbnZhbGlkIEVBUCBwYWNrZXRzLCBEaWFtRUFQIHJlamVjdCB0aGUgYXV0aGVudGljYXRpb24gYnkgcmVzcG9uZGluZyB3aXRoIEZhaWx1cmUgQXV0aGVudGljYXRpb24uIAorIyBUaGUgZGVmYXVsdCB2YWx1ZSBvZiBtYXhpbXVtIG51bWJlciBvZiBpbnZhbGlkIEVBUCBwYWNrZXRzIGlzIHNldCB0byA1IHBhY2tldHMuIAorIyBUaGUgdmFsdWUgb2YgbWF4aW11bSBpbnZhbGlkIEVBUCBwYWNrZXRzIGNhbiBiZSBtb2RpZmllZCBieSBhZGRpbmcgYSBuZXcgdmFsdWUuCisjTUFYX0ludmFsaWRfRUFQX1BhY2tldHM9NTsKZGlmZiAtLWdpdCBhL2RvYy9hcHBfcmFkZ3cuY29uZi5zYW1wbGUgYi9kb2MvYXBwX3JhZGd3LmNvbmYuc2FtcGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZTE2MTkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYXBwX3JhZGd3LmNvbmYuc2FtcGxlCkBAIC0wLDAgKzEsMTA1IEBACisjIFRoaXMgZmlsZSBjb250YWlucyBpbmZvcm1hdGlvbiBmb3IgY29uZmlndXJpbmcgdGhlIGFwcF9yYWRndyBleHRlbnNpb24uCisjIFRvIGZpbmQgaG93IHRvIGhhdmUgZnJlZURpYW1ldGVyIGxvYWQgdGhpcyBleHRlbnNpb24sIHBsZWFzZSByZWZlciB0byB0aGUgZnJlZURpYW1ldGVyIGRvY3VtZW50YXRpb24uCisjCisjIFRoZSBhcHBfcmFkZ3cgZXh0ZW5zaW9uIGFsbG93cyBhIGZyZWVEaWFtZXRlciBhZ2VudCB0byBzZXJ2ZSBhcyBhCisjIFJBRElVUy9EaWFtZXRlciBnYXRld2F5LiBUeXBpY2FsbHksIGEgUkFESVVTIGNsaWVudCAoZS5nLiBhIE5BUykgd2lsbCBjb25uZWN0IHRvCisjIHRoaXMgYWdlbnQsIGFuZCB0aGUgbWVzc2FnZSB3aWxsIGJlIGNvbnZlcnRlZCB0byBEaWFtZXRlciBhbmQgc2VudCB0byBhIERpYW1ldGVyIHNlcnZlci4KKyMKKyMgTm90ZSB0aGF0IHRoaXMgZXh0ZW5zaW9uIGRvZXMgbm90IHByb3ZpZGUgYSBmdWxseSBmdW5jdGlvbm5hbCBSQURJVVMvRGlhbWV0ZXIgZ2F0ZXdheS4KKyMgWW91IG5lZWQgdG8gbG9hZCBwbHVnaW5zIHRvIGhhbmRsZSBzcGVjaWZpYyBSQURJVVMgbWVzc2FnZXMgYW5kIGNvbnZlcnQgdGhlbSB0byAKKyMgRGlhbWV0ZXIgYXBwcyBzdWNoIGFzIE5BU1JFUSwgRUFQLCAuLi4gU2VlIHRoZSBuZXh0IHNlY3Rpb24gZm9yIGluZm9ybWF0aW9uLgorCisKKyMjIyMjIyMjIyMjCisjIFBMVUdJTlMgIworIyMjIyMjIyMjIyMKKworIyBBZGRpdGlvbmFsIHBsdWdpbnMgbXVzdCBiZSBsb2FkZWQgdG8gc3VwcG9ydCBzcGVjaWZpYyBSQURJVVMgbWVzc2FnZXMgYW5kIGF0dHJpYnV0ZXMuCisKKyMgUGx1Z2lucyBhcmUgcmVnaXN0ZXJlZCBlaXRoZXIgZm9yIGV2ZXJ5IG1lc3NhZ2UsIG9yIGJ5IHBvcnQgKGF1dGggb3IgYWNjdCksIG9yIGJ5IHBvcnQgYW5kIGNvZGUuCisjIFRoZSBnZW5lcmFsIGZvcm1hdCBpczoKKyMgUkdXWCA9IHBsdWdpbiBbOiBjb25mX2ZpbGVdIFs6IHBvcnRdIFs6IGNvZGUocyldIDsKKyMgIFdoZXJlOgorIyAgICBwbHVnaW4gaXMgdGhlIHF1b3RlZCBmaWxlIG5hbWUgKHJlbGF0aXZlIG9yIGFic29sdXRlKSBvZiB0aGUgcGx1Z2luIHRvIGxvYWQgKC5yZ3d4IGZpbGVzKS4KKyMgICAgY29uZl9maWxlIChvcHRpb25hbCkgaXMgdGhlIHF1b3RlZCBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCisjICAgIHBvcnQgKG9wdGlvbmFsKSwgZWl0aGVyIGF1dGggb3IgYWNjdC4gCisjICAgICAgIElmIG5vdCBzcGVjaWZpZWQsIGV4dGVuc2lvbiBpcyBjYWxsZWQgZm9yIG1lc3NhZ2VzIGluY29taW5nIG9uIGJvdGggcG9ydHMKKyMgICAgY29kZShzKTogc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgY29tbWFuZCBjb2RlcyBmb3Igd2hpY2ggdGhpcyBleHRlbnNpb24gbXVzdCBiZSBjYWxsZWQuCisjICAgICAgIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBleHRlbnNpb24gaXMgY2FsbGVkIGZvciBhbGwgaW5jb21pbmcgbWVzc2FnZXMuCisjICAgICAgIFRoZSB2YWx1ZXMgYXJlIGludGVycHJldGVkIGFzIGhleGFkZWNpbWFsLgorIworIyBUaGUgcGx1Z2lucyBhcmUgY2FsbGVkIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbiB0aGlzIGZpbGUuCisjIEhlcmUgYXJlIHNvbWUgZXhwbGFpbmVkIGV4YW1wbGVzOgorIyAgUkdXWCA9ICIzNTc5LnJnd3giOyAgIExvYWQgdGhpcyBleHRlbnNpb24gYW5kIGNhbGwgaXQgZm9yIGFsbCBtZXNzYWdlcy4gTm8gY29uZmlndXJhdGlvbiBmaWxlLgorIyAgUkdXWCA9ICIzNTc5LnJnd3giIDogIjM1NzkuY29uZiI7ICBTYW1lIGFzIHByZXZpb3VzIGJ1dCB3aXRoIGEgY29uZmlndXJhdGlvbiBmaWxlIHNwZWNpZmllZC4KKyMgIFJHV1ggPSAiMzU3OS5yZ3d4IiA6IGF1dGg7IE5vIGNvbmZpZ3VyYXRpb24gZmlsZSwgYnV0IGNhbGxlZCBvbmx5IGZvciBSQURJVVMgbWVzc2FnZXMgcmVjZWl2ZWQgb24gYXV0aGVudGljYXRpb24gcG9ydC4KKyMgIFJHV1ggPSAiMzU3OS5yZ3d4IiA6IDQgOCBiOyAgQ2FsbGVkIGZvciBtZXNzYWdlcyB3aXRoIGNvbW1hbmQgY29kZSA0LCA4LCBvciAxMSBvbmx5LgorIyAgUkdXWCA9ICIzNTc5LnJnd3giIDogIjM1NzkuY29uZiIgOiBhdXRoIDogNCA4IGI7ICBBbGwgcGFyYW1ldGVycyBjb21iaW5lZC4KKworIyBPbmNlIHRoZSBsaXN0IG9mIGV4dGVuc2lvbnMgZm9yIGFuIGluY29taW5nIG1lc3NhZ2UgaGFzIGJlZW4gY2FsbGVkIChvciBpZiB0aGUgbGlzdCBpcyBlbXB0eSksIAorIyBhbiBlcnJvciBpcyBsb2dnZWQgaWYgc29tZSBSQURJVVMgYXR0cmlidXRlcyBvZiB0aGUgbWVzc2FnZSBoYXZlIG5vdCBiZWVuIGhhbmRsZWQuCisKK1JHV1ggPSAiZXh0ZW5zaW9ucy9lY2hvZHJvcC5yZ3d4IiA6ICJlY2hvZHJvcC5yZ3d4LmNvbmYiOyAjIFNlZSBlY2hvZHJvcC5yZ3d4LmNvbmYuc2FtcGxlIGZpbGUKK1JHV1ggPSAiZXh0ZW5zaW9ucy9hdXRoLnJnd3giIDogYXV0aDsgCitSR1dYID0gImV4dGVuc2lvbnMvYWNjdC5yZ3d4IiA6IGFjY3Q7CisjIFJHV1ggPSAiZXh0ZW5zaW9ucy9kZWJ1Zy5yZ3d4IjsgIyBVbmNvbW1lbnQgdG8gc2VlIHRoZSByZXN1bHQgb2YgdGhlIHRyYW5zbGF0aW9uIHBsdWdpbnMuCisKKyMgRm9yIHNvbWUgZXh0ZW5zaW9ucyAoYXV0aCwgYWNjdCksIGEgZmFsc2UgY29uZmlndXJhdGlvbiBmaWxlIG5hbWUgCisjIGNhbiBiZSBwYXNzZWQgdG8gc3BlY2lmeSBmbGFncywgc3VjaCBhcyAibm9uYWkiIHRvIGlnbm9yZSBOQUktYmFzZWQgcm91dGluZy4KKworIyMjIyMjIyMjIyMjIyMjIyMjCisjIFJBRElVUyBDbGllbnRzICMKKyMjIyMjIyMjIyMjIyMjIyMjIworCisjIEVhY2ggUkFESVVTIGNsaWVudCBtdXN0IGJlIGRlY2xhcmVkIGluIHRoZSBmb3JtOiAKKyMgICBuYXMgPSBJUCAvIHNoYXJlZC1zZWNyZXQgOworIyBJUCBjYW4gYmUgaXB2NCBvciBpcHY2CisjIHBvcnQgY2FuIGJlIGFkZGl0aW9uYWx5IHJlc3RyaWN0ZWQgd2l0aCBicmFja2V0czogSVBbcG9ydF0gKGV4OiAxOTIuMTY4LjAuMVsxODEyXSkKKyMgc2hhcmVkLXNlY3JldCBjYW4gYmUgYSBxdW90ZWQgc3RyaW5nLCBvciBhIGxpc3Qgb2YgaGV4YWRlY2ltYWwgdmFsdWVzLgorIyBleGFtcGxlczoKKyMgbmFzID0gMTkyLjE2OC4xMDAuMSAvICJzZWNyZXQga2V5IiA7ICMgdGhlIHNoYXJlZCBzZWNyZXQgYnVmZmVyIGlzIDB4NzM2NTYzNzI2NTc0MjA2YjY1NzkgKGxlbmd0aCAxMCBieXRlcykKKyMgbmFzID0gZmUwMDo6MSAvIDczIDY1IDYzIDcyIDY1IDc0IDIwIDZiIDY1IDc5OyAjIHNhbWUgc2hhcmVkIHNlY3JldCBhcyBwcmV2aW91c2x5CisjIFdoZW4gYSBwYWNrZXQgaXMgcmVjZWl2ZWQgZnJvbSBhbiBJUCBub3QgZGVjbGFyZWQgaGVyZSwgaXQgaXMgZGlzY2FyZGVkLgorCisjIElmIHRoZSBSQURJVVMgY2xpZW50IGlzIGEgUHJveHkgdGhhdCBmb3J3YXJkcyBtZXNzYWdlcyBmcm9tIGRpZmZlcmVudCBwZWVycywgaXQgbXVzdCBiZQorIyBkZWNsYXJlZCBpbnN0ZWFkIGFzIGZvbGxvdzoKKyMgICBweHkgPSBJUCAvIHNoYXJlZC1zZWNyZXQgOworIyBOb3RlIHRoYXQgaXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIHVzZSB0aGlzIGdhdGV3YXkgaW1wbGVtZW50YXRpb24gd2l0aCBhIHByb3h5IGN1cnJlbnRseSwKKyMgc2luY2UgdGhlIG1hbmFnZW1lbnQgb2YgZHVwbGljYXRlIG1lc3NhZ2VzIG1pZ2h0IGJlIGluc3VmZmljaWVudC4KKworIyBUaGUgb2xkIG5vdGF0aW9uIGNsaSA9IC4uLiBpcyBlcXVpdmFsZW50IHRvIG5hcyA9IC4uLiBhbmQga2VwdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAgQXV0aGVudGljYXRpb24gICMKKyMgIEF1dGhvcml6YXRpb24gICAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIEVuYWJsZSB0aGUgUkFESVVTL0RpYW1ldGVyIGF1dGhlbnRpY2F0aW9uL2F1dGhvcml6YXRpb24gZ2F0ZXdheT8KKyMgYXV0aF9zZXJ2ZXJfZW5hYmxlID0gMTsKKworIyBUaGUgcG9ydCBvbiB3aGljaCB0aGUgYWNjb3VudGluZyBzZXJ2ZXIgbGlzdGVucworIyBhdXRoX3NlcnZlcl9wb3J0ID0gMTgxMjsKKworIyBUaGUgSVB2NCBvbiB3aGljaCB0byBiaW5kIHRoZSBzZXJ2ZXIsIG9yICJkaXNhYmxlIiBpZiBJUHY0IG11c3Qgbm90IGJlIHVzZWQuCisjIGF1dGhfc2VydmVyX2lwNCA9IDAuMC4wLjA7CisKKyMgVGhlIElQdjYgYWRkcmVzcyB0byB3aGljaCB0aGUgc2VydmVyIGlzIGJvdW5kLCBvciAiZGlzYWJsZSIKKyMgYXV0aF9zZXJ2ZXJfaXA2ID0gOjogOworCisKKyMjIyMjIyMjIyMjIyMjIyMKKyMgIEFjY291bnRpbmcgICMKKyMjIyMjIyMjIyMjIyMjIyMKKworIyBFbmFibGUgdGhlIFJBRElVUy9EaWFtZXRlciBhY2NvdW50aW5nIGdhdGV3YXk/CisjIGFjY3Rfc2VydmVyX2VuYWJsZSA9IDE7CisKKyMgVGhlIHBvcnQgb24gd2hpY2ggdGhlIGFjY291bnRpbmcgc2VydmVyIGxpc3RlbnMKKyMgYWNjdF9zZXJ2ZXJfcG9ydCA9IDE4MTM7CisKKyMgVGhlIElQdjQgb24gd2hpY2ggdG8gYmluZCB0aGUgc2VydmVyLCBvciAiZGlzYWJsZSIgaWYgbm8gSVB2NCBpcyB3YW50ZWQuCisjIGFjY3Rfc2VydmVyX2lwNCA9IDAuMC4wLjA7CisKKyMgVGhlIElQdjYgYWRkcmVzcyB0byB3aGljaCB0aGUgc2VydmVyIGlzIGJvdW5kLCBvciAiZGlzYWJsZSIKKyMgYWNjdF9zZXJ2ZXJfaXA2ID0gOjogOwpkaWZmIC0tZ2l0IGEvZG9jL2FwcF9yZWRpcmVjdC5jb25mLnNhbXBsZSBiL2RvYy9hcHBfcmVkaXJlY3QuY29uZi5zYW1wbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIwNDRkNgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9hcHBfcmVkaXJlY3QuY29uZi5zYW1wbGUKQEAgLTAsMCArMSw5NyBAQAorIyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBhcHBfcmVkaXJlY3QgZXh0ZW5zaW9uIG9mIGZyZWVEaWFtZXRlci4KKyMKKyMgVGhpcyBleHRlbnNpb24gcHJvdmlkZXMgY29uZmlndXJhYmxlIFJlZGlyZWN0IG1lc3NhZ2VzLgorCisjIExpbmVzIHN0YXJ0aW5nIHdpdGggYSAjIGFyZSBjb21tZW50cyBhbmQgaWdub3JlZC4KKyMgU3BhY2VzIGFuZCBuZXdsaW5lcyBhcmUgbm90IG1lYW5pbmdmdWwsIGV4Y2VwdCBpbnNpZGUgcXVvdGVkIGFyZWFzLgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAgICAgICAgU2VlIERpYW1ldGVyIFJGQyBmb3IgYSBkZXRhaWxlZCBleHBsYW5hdGlvbiBvbiBSZWRpcmVjdHMgc2VtYW50aWNzICAgICAgICAgICAgICMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMjIGRlZmF1bHRfcmVkaXJlY3RfY2FjaGVfdGltZQorIyBTcGVjaWZ5IHRoZSBkZWZhdWx0IHZhbHVlIGZvciBSZWRpcmVjdC1NYXgtQ2FjaGUtVGltZS4KKyMgVGhpcyB2YWx1ZSBjYW4gYmUgb3ZlcndyaXR0ZW4gZm9yIGVhY2ggcnVsZSBhcyBzcGVjaWZpZWQgYmVsb3cuCisjIElmIHRoaXMgdmFsdWUgaXMgbm90IHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgaXM6CisjZGVmYXVsdF9yZWRpcmVjdF9jYWNoZV90aW1lID0gODY0MDA7ICAjIyA9PiAxIGRheQorCisjIFRoZSByZW1haW5pbmcgb2YgdGhpcyBmaWxlIGNvbnRhaW5zIGEgbGlzdCBvZiBSVUxFIGVsZW1lbnRzLgorIyBFYWNoIFJVTEUgY29uc2lzdHMgaW4gdGhyZWUgcGFydHM6CisjICAtIGEgQ1JJVEVSSUEgdGhhdCBzcGVjaWZpZXMgd2hpY2ggbWVzc2FnZXMgdGhlIFJVTEUgYXBwbGllcyB0by4KKyMgIC0gYSBSRURJUkVDVF9UWVBFIHRoYXQgc3BlY2lmaWVzIHdoYXQgdHlwZSBvZiByZWRpcmVjdCBpcyB0byBiZSBzZW50LCBhbmQgaXRzIGR1cmF0aW9uLgorIyAgLSBhIFRBUkdFVF9IT1NUUyBsaXN0IHRoYXQgc3BlY2lmaWVzIHRoZSBob3N0KHMpIHRvIHNlbmQgdGhlIG1lc3NhZ2UgdG8uCisjCisjIFRoZSBydWxlcyBhcmUgbWF0Y2hlZCBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXIgaW4gdGhpcyBmaWxlLiBPbmNlIGEgcnVsZSBoYXMgbWF0Y2hlZCwgdGhlCisjIHJlbWFpbmluZyBydWxlcyBhcmUgbm90IHByb2Nlc3NlZC4KKyMKKyMgVGhlIGJhc2ljIGZvcm1hdCBvZiBhIHJ1bGUgaXM6CisjICBSRURJUkVDVF9UWVBFIDogQ1JJVEVSSUEgdG8gVEFSR0VUX0hPU1RTIDsKKworIyBUaGVzZSBhcmUgYSBmZXcgZXhhbXBsZXMuIFRoZSBkZWZpbml0aW9uIG9mIGVhY2ggdGVybSBmb2xsb3dzLgorIworIyAxKSBSRUFMTV9BTkRfQVBQTElDQVRJT04gOiBhcHA9MyAiRGVzdGluYXRpb24tUmVhbG0iPSJteXJlYWxtLm5ldCIgdG8gImFhYXM6Ly9hY2N0MS5teXJlYWxtLm5ldCIgImFhYXM6Ly9hY2N0Mi5teXJlYWxtLm5ldCI7CisjICB3aWxsIGFzayBhbGwgcGVlcnMgc2VuZGluZyBhIEJhc2UgQWNjb3VudGluZyBtZXNzYWdlIGZvciByZWFsbSAibXlyZWFsbS5uZXQiIHRvIHNlbmQKKyMgdGhpcyBtZXNzYWdlIGRpcmVjdGx5IHRvIGVpdGhlciAnYWNjdDEubXlyZWFsbS5uZXQnIG9yICdhY2N0Mi5teXJlYWxtLm5ldCcuCisjCisjIDIpIEFMTF9TRVNTSU9OIDM2MDAgOiAiT3JpZ2luLUFBQS1Qcm90b2NvbCI9MSAiRGVzdGluYXRpb24tUmVhbG0iPSJteXJlYWxtLm5ldCIgdG8gImFhYXM6Ly9yYWRkaWFtLm15cmVhbG0ubmV0IjsKKyMgIFdpbGwgYXNrIGFueSBwZWVyIHNlbmRpbmcgbWVzc2FnZXMgdHJhbnNsYXRlZCBmcm9tIFJBRElVUyBhbmQgdGFyZ2V0ZWQgdG8gdGhpcyByZWFsbQorIyB0byBhZGRyZXNzIGFsbCB0aGUgbWVzc2FnZXMgZnJvbSB0aGUgc2FtZSBzZXNzaW9uIHRvICdyYWRkaWFtLm15cmVhbG0ubmV0Jy4gVGhlCisjIHJlZGlyZWN0IGVudHJ5IHNob3VsZCBiZSBzdG9yZWQgZm9yIDEgaG91ci4KKyMKKyMgMykgQUxMX0hPU1QgOiBmcm9tLnJlYWxtPVsiLipcLihmcnxkZXxlcykiXSB0byAiYWFhczovL3JlbGF5LUVVLm15cmVhbG0ubmV0IjsKKyMgICAgQUxMX0hPU1QgOiBmcm9tLnJlYWxtPVsiLipcLihjbnxqcHx2bikiXSB0byAiYWFhczovL3JlbGF5LUFTSUEubXlyZWFsbS5uZXQiOworIyAgUmVkaXJlY3QgbWVzc2FnZXMgdG8gZGlmZmVyZW50IHJlbGF5cyBkZXBlbmRpbmcgb24gd2hlcmUgdGhleSBjb21lIGZyb20uCisjCisjIDQpIEFMTF9IT1NUIDogdG8gImFhYXM6Ly9uZXdzZXJ2Lm15cmVhbG0ubmV0IjsKKyMgIFRoaXMgc2VydmVyIHdhcyByZWxvY2F0ZWQsIHRlbGwgYWxsIHBlZXJzIHRvIGdvIGRpcmVjdGx5IHRvIHRoZSBuZXcgb25lLgorIyAgVGhpcyBydWxlIHNob3VsZCBhcHBlYXIgbGFzdCBiZWNhdXNlIGl0IG1hdGNoZXMgYWxsIG1lc3NhZ2VzLCBzbyBmdXJ0aGVyIHJ1bGVzIHdpbGwgbmV2ZXIgYmUgdXNlZC4KKworCisjIAorIyBSRURJUkVDVF9UWVBFCisjCisKKyMgVGhlIHJlZGlyZWN0X3R5cGUgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgKHNlZSBSZWRpcmVjdC1Ib3N0LVVzYWdlIEFWUCBkZWZpbml0aW9uIGluIFJGQyBmb3Igc2VtYW50aWNzKToKKyMgRE9OVF9DQUNIRQorIyBBTExfU0VTU0lPTgorIyBBTExfUkVBTE0KKyMgUkVBTE1fQU5EX0FQUExJQ0FUSU9OCisjIEFMTF9BUFBMSUNBVElPTgorIyBBTExfSE9TVAorIyBBTExfVVNFUgorCisjIEluIGFkZGl0aW9uLCBhbiBpbnRlZ2VyIGNhbiBmb2xsb3cuIElmIHNwZWNpZmllZCwgaXQgb3ZlcndyaXRlcyB0aGUgZGVmYXVsdF9yZWRpcmVjdF9jYWNoZV90aW1lCisjIHZhbHVlIGZvciB0aGlzIHJ1bGUuIFRoZSB2YWx1ZSBpcyBhbHdheXMgc3BlY2lmaWVkIGluIHNlY29uZHMuCisKKyMgCisjIENSSVRFUklBCisjCisKKyMgRWFjaCBSVUxFIGNhbiBjb250YWluIDAgb3IgbW9yZSBjcml0ZXJpYS4KKyMgSWYgbm8gY3JpdGVyaWEgaXMgc3BlY2lmaWVkLCBhbGwgbWVzc2FnZXMgYXJlIGFzc3VtZWQgdG8gbWF0Y2ggKHdpbGRjYXJkKS4KKyMgSWYgbW9yZSB0aGFuIG9uZSBjcml0ZXJpYSBpcyBzcGVjaWZpZWQsIGFuICJBTkQiIHJlbGF0aW9uc2hpcCBpcyBhc3N1bWVkLgorIyBJZiB5b3UgbmVlZCB0byBzcGVjaWZ5ICJPUiIsIGp1c3QgY3JlYXRlIHNlcGFyYXRlIHJ1bGVzLgorIworIyBJbiB0aGUgZm9sbG93aW5nIGRlZmluaXRpb25zLCAiU1RSL1JFRyIgc3RhbmRzIGZvcjoKKyMgICAtIGEgcXVvdGVkIHN0cmluZyAic29tZS5wZWVyIiB0aGF0IHdpbGwgbWF0Y2ggZXhhY3RseSB0aGlzIHN0cmluZyAoY2FzZS1pbnNlbnNpdGl2ZSksIG9yCisjICAgLSBhIGJyYWNrZXQtcXVvdGVkIHN0cmluZyBbInNvbWUgcmVnZXgiXSB0aGF0IHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgYSBQT1NJWCBleHRlbmRlZCByZWd1bGFyIGV4cHJlc3Npb24gKGNhc2Utc2Vuc2l0aXZlKSwgYW5kIGF0dGVtcHQgdG8gbWF0Y2ggdGhlIHN0cmluZy4KKyMKKyMgQSBjcml0ZXJpYSBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKyMgICAgZnJvbS5pZD0iU1RSL1JFRyIJCS0+IG1hdGNoZXMgbWVzc2FnZXMgcmVjZWl2ZWQgZnJvbSBwZWVyIHdpdGggdGhpcyBEaWFtZXRlciBJZGVudGl0eS4KKyMgICAgZnJvbS5yZWFsbT0iU1RSL1JFRyIJLT4gbWF0Y2hlcyBtZXNzYWdlcyByZWNlaXZlZCBmcm9tIHBlZXIgd2l0aCB0aGlzIFJlYWxtLgorIyAgICBhcHA9VTMyX1ZBTFVFCQktPiBtYXRjaGVzIG1lc3NhZ2VzIHdpdGggdGhpcyBEaWFtZXRlciBBcHBsaWNhdGlvbi1JZCB2YWx1ZSBpbiBpdHMgaGVhZGVyLgorIyAgICAiQVZQLW5hbWUiPVUzMl9WQUxVRQktPiBtYXRjaGVzIG1lc3NhZ2VzIHRoYXQgY29udGFpbiBhbiBhdnAgIkFWUC1uYW1lIiAocmVwbGFjZSB3aXRoIHRoZSByZWFsbSBuYW1lKSB3aXRoIHRoaXMgdmFsdWUuCisjICAgICJBVlAtbmFtZSI9IlNUUi9SRUciCS0+IG1hdGNoZXMgbWVzc2FnZXMgdGhhdCBjb250YWluIGFuIGF2cCAiQVZQLW5hbWUiIChyZXBsYWNlIHdpdGggdGhlIHJlYWxtIG5hbWUpIHdpdGggdGhpcyAuCisKKyMgCisjIFRBUkdFVF9IT1NUUworIworCisjIFRoaXMgaXMgYSBzaW1wbGUgbGlzdCBvZiBEaWFtZXRlclVSSSB0aGF0IG11c3QgYmUgc2VudCBiYWNrLgorIyBTZWUgdGhlIFJGQyBmb3IgdmFsaWQgZm9ybWF0IG9mIERpYW1ldGVyIFVSSToKKyMgICJhYWE6Ly8iIEZRRE4gWyBwb3J0IF0gWyB0cmFuc3BvcnQgXSBbIHByb3RvY29sIF0KKyMgImFhYXM6Ly8iIEZRRE4gWyBwb3J0IF0gWyB0cmFuc3BvcnQgXSBbIHByb3RvY29sIF0KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworCmRpZmYgLS1naXQgYS9kb2MvYXBwX3NpcC5jb25mLnNhbXBsZSBiL2RvYy9hcHBfc2lwLmNvbmYuc2FtcGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYjQ3ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYXBwX3NpcC5jb25mLnNhbXBsZQpAQCAtMCwwICsxLDI4IEBACisKKyMgTU9ERSBEaWFtZXRlci1TSVAgc2VydmVyIChEU1NFUlZFUikgb3IgU3Vic2NyaWJlciBMb2NhdG9yIChTTCkKKyNZb3UgbXVzdCBoYXZlIGF0IGxlYXN0IGluIHlvdXIgbmV0d29yayBhIERpYW1ldGVyIFNJUCBzZXJ2ZXIgYW5kIGEgU3Vic2NyaWJlciBMb2NhdG9yIChvbiBkaWZmZXJlbnQgbm9kZXMpCittb2RlID0gRFNTRVJWRVI7CisKKworIyBBZG1pbmlzdHJhdG9yIGNvbW1hbmRzIHBvcnQgKHBvcnQgc2hvdWxkIGJlIHByb3ZpZGVkIHdpdGggIi1wIiBpbiByZW1vdGUgbGluZSkKK3Bwcl9wb3J0PTkwOworcnRyX3BvcnQ9OTE7CisKKworIyoqKioqKioqKioqKioqKioqKiMKKyMqKioqKkRBVEFCQVNFKioqKiojCisjKioqKioqKioqKioqKioqKioqIworIyBEQVRBU09VUkNFOiBNWVNRTAorZGF0YXNvdXJjZSA9IE1ZU1FMOworCisjTVlTUUwgY29ubmVjdGlvbiBkZXRhaWxzCitteXNxbF9sb2dpbiA9ICJsb2dpbiI7CitteXNxbF9wYXNzd29yZCA9ICJwYXNzd29yZCI7CitteXNxbF9kYXRhYmFzZSA9ICJkYiI7CitteXNxbF9zZXJ2ZXIgPSAic2VydmVyLmZyIjsKKworI0lmIHZhbHVlPTAsIGRlZmF1bHQgcG9ydCBmb3IgbXlzcWwgd2lsbCBiZSBzZXQKK215c3FsX3BvcnQgPSAwOworCisjUHJlZml4IGZvciB0YWJsZXMgKGRlZmF1bHQgaXMgImRzIikKK215c3FsX3ByZWZpeCA9ICJkcyI7CmRpZmYgLS1naXQgYS9kb2MvYXBwX3NpcC5zcWwgYi9kb2MvYXBwX3NpcC5zcWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZkNTI3OQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9hcHBfc2lwLnNxbApAQCAtMCwwICsxLDExNyBAQAorLS1DYW4gYmUgdXNlZCBpbiBwaHBNeUFkbWluCisKK1NFVCBTUUxfTU9ERT0iTk9fQVVUT19WQUxVRV9PTl9aRVJPIjsKKworLS0KKy0tIERJQU1FVEVSIFNFUlZFUiBEQVRBQkFTRQorLS0KKworLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0KKy0tIFRhYmxlIHN0cnVjdHVyZSBmb3IgdGFibGUgYGRzX2RhdGFfdHlwZXNgCistLQorCitDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBgZHNfZGF0YV90eXBlc2AgKAorICBgaWRfZGF0YV90eXBlYCBpbnQoMTEpIE5PVCBOVUxMIEFVVE9fSU5DUkVNRU5ULAorICBgbGFiZWxfdHlwZWAgdmFyY2hhcigyNTUpIE5PVCBOVUxMLAorICBQUklNQVJZIEtFWSAoYGlkX2RhdGFfdHlwZWApCispIEVOR0lORT1NeUlTQU0gIERFRkFVTFQgQ0hBUlNFVD1sYXRpbjEgQVVUT19JTkNSRU1FTlQ9MiA7CisKKy0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tCistLSBUYWJsZSBzdHJ1Y3R1cmUgZm9yIHRhYmxlIGBkc19uZXR3b3Jrc2AKKy0tCisKK0NSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIGBkc19uZXR3b3Jrc2AgKAorICBgaWRfbmV0d29ya2AgaW50KDExKSBOT1QgTlVMTCBBVVRPX0lOQ1JFTUVOVCwKKyAgYGxhYmVsX25ldHdvcmtgIHZhcmNoYXIoMjU1KSBOT1QgTlVMTCwKKyAgUFJJTUFSWSBLRVkgKGBpZF9uZXR3b3JrYCkKKykgRU5HSU5FPU15SVNBTSAgREVGQVVMVCBDSEFSU0VUPWxhdGluMSBBVVRPX0lOQ1JFTUVOVD0zIDsKKworLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0KKy0tIFRhYmxlIHN0cnVjdHVyZSBmb3IgdGFibGUgYGRzX3NpcF9hb3JgCistLQorCitDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBgZHNfc2lwX2FvcmAgKAorICBgaWRfc2lwX2FvcmAgaW50KDExKSBOT1QgTlVMTCBBVVRPX0lOQ1JFTUVOVCwKKyAgYGlkX3VzZXJgIGludCgxMSkgTk9UIE5VTEwsCisgIGBzaXBfYW9yYCB2YXJjaGFyKDI1NSkgTk9UIE5VTEwsCisgIGBzaXBfc2VydmVyX3VyaWAgdmFyY2hhcigyNTUpIERFRkFVTFQgTlVMTCwKKyAgYHJlZ2lzdGVyZWRgIHRpbnlpbnQoMSkgTk9UIE5VTEwgREVGQVVMVCAnMCcsCisgIFBSSU1BUlkgS0VZIChgaWRfc2lwX2FvcmAsYGlkX3VzZXJgKQorKSBFTkdJTkU9SW5ub0RCICBERUZBVUxUIENIQVJTRVQ9bGF0aW4xIEFVVE9fSU5DUkVNRU5UPTQgOworCistLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLQorLS0gVGFibGUgc3RydWN0dXJlIGZvciB0YWJsZSBgZHNfc2lwX3NlcnZpY2VzYAorLS0KKworQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgYGRzX3NpcF9zZXJ2aWNlc2AgKAorICBgaWRfc2VydmljZWAgaW50KDExKSBOT1QgTlVMTCBBVVRPX0lOQ1JFTUVOVCwKKyAgYGxhYmVsX3NlcnZpY2VgIHZhcmNoYXIoMjU1KSBOT1QgTlVMTCwKKyAgUFJJTUFSWSBLRVkgKGBpZF9zZXJ2aWNlYCkKKykgRU5HSU5FPU15SVNBTSAgREVGQVVMVCBDSEFSU0VUPWxhdGluMSBBVVRPX0lOQ1JFTUVOVD0yIDsKKworLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0KKy0tIFRhYmxlIHN0cnVjdHVyZSBmb3IgdGFibGUgYGRzX3VzZXJzYAorLS0KKworQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgYGRzX3VzZXJzYCAoCisgIGBpZF91c2VyYCBpbnQoMTEpIE5PVCBOVUxMIEFVVE9fSU5DUkVNRU5ULAorICBgdXNlcm5hbWVgIHZhcmNoYXIoNTApIE5PVCBOVUxMLAorICBgcGFzc3dvcmRgIHZhcmNoYXIoNTApIE5PVCBOVUxMLAorICBgU0lQX1NlcnZlcl9VUklgIHZhcmNoYXIoMjU1KSBERUZBVUxUIE5VTEwsCisgIGB0ZW1wX1NJUF9TZXJ2ZXJfVVJJYCB2YXJjaGFyKDI1NSkgREVGQVVMVCBOVUxMLAorICBgYXV0aGVudGljYXRpb25fcGVuZGluZ2AgdGlueWludCgxKSBOT1QgTlVMTCBERUZBVUxUICcwJywKKyAgYHJlZ2lzdHJhdGVkYCB0aW55aW50KDEpIE5PVCBOVUxMIERFRkFVTFQgJzAnLAorICBQUklNQVJZIEtFWSAoYGlkX3VzZXJgKQorKSBFTkdJTkU9SW5ub0RCICBERUZBVUxUIENIQVJTRVQ9bGF0aW4xIEFVVE9fSU5DUkVNRU5UPTIgOworCistLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLQorLS0gVGFibGUgc3RydWN0dXJlIGZvciB0YWJsZSBgZHNfdXNlcl9kYXRhYAorLS0KKworQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgYGRzX3VzZXJfZGF0YWAgKAorICBgaWRfdXNlcl9kYXRhYCBpbnQoMTEpIE5PVCBOVUxMIEFVVE9fSU5DUkVNRU5ULAorICBgaWRfc2lwX2FvcmAgaW50KDExKSBOT1QgTlVMTCwKKyAgYGlkX2RhdGFfdHlwZWAgaW50KDExKSBOT1QgTlVMTCwKKyAgYGRhdGFgIGxvbmdibG9iIE5PVCBOVUxMLAorICBQUklNQVJZIEtFWSAoYGlkX3VzZXJfZGF0YWAsYGlkX3NpcF9hb3JgLGBpZF9kYXRhX3R5cGVgKQorKSBFTkdJTkU9TXlJU0FNICBERUZBVUxUIENIQVJTRVQ9bGF0aW4xIEFVVE9fSU5DUkVNRU5UPTMgOworCistLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLQorLS0gVGFibGUgc3RydWN0dXJlIGZvciB0YWJsZSBgZHNfdXNlcl9uZXR3b3Jrc2AKKy0tCisKK0NSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIGBkc191c2VyX25ldHdvcmtzYCAoCisgIGBpZF91c2VyX25ldHdvcmtgIGludCgxMSkgTk9UIE5VTEwgQVVUT19JTkNSRU1FTlQsCisgIGBpZF91c2VyYCBpbnQoMTEpIE5PVCBOVUxMLAorICBgaWRfbmV0d29ya2AgaW50KDExKSBOT1QgTlVMTCwKKyAgUFJJTUFSWSBLRVkgKGBpZF91c2VyX25ldHdvcmtgLGBpZF91c2VyYCkKKykgRU5HSU5FPU15SVNBTSAgREVGQVVMVCBDSEFSU0VUPWxhdGluMSBBVVRPX0lOQ1JFTUVOVD0zIDsKKworLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0KKy0tIFRhYmxlIHN0cnVjdHVyZSBmb3IgdGFibGUgYGRzX3VzZXJfc2VydmljZXNgCistLQorCitDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBgZHNfdXNlcl9zZXJ2aWNlc2AgKAorICBgaWRfdXNlcl9zZXJ2aWNlYCBpbnQoMTEpIE5PVCBOVUxMIEFVVE9fSU5DUkVNRU5ULAorICBgaWRfdXNlcmAgaW50KDExKSBOT1QgTlVMTCwKKyAgYGlkX3NlcnZpY2VgIGludCgxMSkgTk9UIE5VTEwsCisgIGBjb21wdWxzb3J5YCB0aW55aW50KDEpIE5PVCBOVUxMIERFRkFVTFQgJzAnLAorICBQUklNQVJZIEtFWSAoYGlkX3VzZXJfc2VydmljZWAsYGlkX3VzZXJgKQorKSBFTkdJTkU9TXlJU0FNICBERUZBVUxUIENIQVJTRVQ9bGF0aW4xIEFVVE9fSU5DUkVNRU5UPTYgOworCmRpZmYgLS1naXQgYS9kb2MvYXBwX3NpcF9TTC5zcWwgYi9kb2MvYXBwX3NpcF9TTC5zcWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQzNWJhMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9hcHBfc2lwX1NMLnNxbApAQCAtMCwwICsxLDIxIEBACisKKworU0VUIFNRTF9NT0RFPSJOT19BVVRPX1ZBTFVFX09OX1pFUk8iOworCistLQorLS0gU1VCU0NSSUJFUiBMT0NBVE9SIERBVEFCQVNFCistLQorCistLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLQorLS0gVGFibGUgc3RydWN0dXJlIGZvciB0YWJsZSBgZHNfc2lwX2Fvcl9tYXBgCistLQorCitDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBgZHNfc2lwX2Fvcl9tYXBgICgKKyAgYGlkX21hcGAgaW50KDExKSBOT1QgTlVMTCBBVVRPX0lOQ1JFTUVOVCwKKyAgYHNpcF9hb3JgIHZhcmNoYXIoMjU1KSBOT1QgTlVMTCwKKyAgYGRpYW1ldGVyX3VyaWAgdmFyY2hhcigyNTUpIE5PVCBOVUxMLAorICBQUklNQVJZIEtFWSAoYGlkX21hcGApCispIEVOR0lORT1NeUlTQU0gIERFRkFVTFQgQ0hBUlNFVD1sYXRpbjEgQVVUT19JTkNSRU1FTlQ9MiA7CisKZGlmZiAtLWdpdCBhL2RvYy9kYmdfaW50ZXJhY3RpdmUucHkuc2FtcGxlIGIvZG9jL2RiZ19pbnRlcmFjdGl2ZS5weS5zYW1wbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYxZmZlOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kYmdfaW50ZXJhY3RpdmUucHkuc2FtcGxlCkBAIC0wLDAgKzEsNzgzIEBACisjIEV4YW1wbGUgZmlsZSBmb3IgdGhlIGRiZ19pbnRlcmFjdGl2ZS5mZHggZXh0ZW5zaW9uLgorIworIyBUaGlzIGV4dGVuc2lvbiBwcm92aWRlcyBhbiBpbnRlcmFjdGl2ZSBweXRob24gaW50ZXJwcmV0ZXIgY29uc29sZSB0aGF0IGFsbG93cworIyBpbnRlcmFjdGluZyB3aXRoIGZyZWVEaWFtZXRlciBmcmFtZXdvcmsuCisjCisjIFRoZSBhZGFwdGF0aW9uIGxheWVyIGJldHdlZW4gUHl0aG9uIGFuZCBDIGlzIHByb3ZpZGVkIGJ5IFNXSUcgKGh0dHA6Ly9zd2lnLm9yZykuIAorIyBZb3UgbWF5IHJlZmVyIHRvIFNXSUcgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgdGhlIHdyYXBwZXIgaXMgZ2VuZXJhdGVkIGFuZCB1c2VkLgorIyBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlIHdyYXBwaW5nIGZyZWVEaWFtZXRlciBmcmFtZXdvcmsgaXM6IF9mRHB5CisjCisjIFNpbWlsYXIgdG8gYWxsIGZyZWVEaWFtZXRlciBleHRlbnNpb25zLCBhbiBvcHRpb25hbCBmaWxlbmFtZSBjYW4gYmUgc3BlY2lmaWVkIGluIHRoZQorIyBtYWluIGZyZWVEaWFtZXRlci5jb25mIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgdGhlIGRiZ19pbnRlcmFjdGl2ZS5mZHggZXh0ZW5zaW9uLgorIyBJZiBzdWNoIGZpbGUgaXMgcHJvdmlkZWQsIGl0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBweXRob24gaW50ZXJwcmV0ZXIgYXMgYSBweXRob24gc2NyaXB0CisjIHRvIGV4ZWN1dGUuIE90aGVyd2lzZSwgdGhlIGludGVycHJldGVyIHdpbGwgYmUgaW50ZXJhY3RpdmUuCisjCisjIFNXSUcgZGVhbHMgd2l0aCBzdHJ1Y3R1cmVzIGFzIGZvbGxvdzoKKyMgR2l2ZW4gdGhlIHN0cnVjdHVyZToKKyMgc3RydWN0IGZvbyB7IGludCBhOyB9CisjIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBhdmFpbGFibGUgdG8gcHl0aG9uICh0aGVpciBDIGVxdWl2YWxlbnQgcHJvY2Vzc2luZyBpcyBnaXZlbiBpbiBbIF0pOgorIyBzID0gbmV3X2ZvbygpCSAgIFsgcyA9IGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IGZvbykpIF0KKyMgZm9vX2Ffc2V0KHMsIDIpICBbIHMtPmEgPSAyIF0KKyMgZm9vX2FfZ2V0KHMpICAgICBbIHJldHVybnMgcy0+YSB2YWx1ZSBdCisjIGRlbGV0ZV9mb28ocykgICAgWyBmcmVlKHMpICBdCisjCisjIEluIGFkZGl0aW9uLCB0aGFua3MgdG8gdGhlIHByb3h5IChha2Egc2hhZG93KSBjbGFzcywgd2UgY2FuIGFsc28gZG8gdGhlIG1vcmUgdXNlci1mcmllbmRseToKKyMgcyA9IGZvbygpCisjIHMuYSA9IDIKKyMgcy5hCisjIGRlbCBzCisjCisKKyMgVGhlIHJlbWFpbmluZyBvZiB0aGlzIGZpbGUgZ2l2ZXMgc29tZSBleGFtcGxlcyBvZiBob3cgdG8gdXNlIHRoZSBweXRob24gaW50ZXJwcmV0ZXIuCisjIE5vdGUgdGhhdCBhdCB0aGUgbW9tZW50IG5vdCAxMDAlIG9mIHRoZSBmcmFtZXdvcmsgaXMgdXNhYmxlLiAKKyMgWW91IG1heSBoYXZlIHRvIGV4dGVuZCBzb21lIGNsYXNzZXMgb3Igd3JpdGUgc29tZSB0eXBlbWFwcyBpbiB0aGUgc291cmNlIGNvZGUgCisjIG9mIHRoZSBleHRlbnNpb24gdG8gZG8gd2hhdCB5b3Ugd2FudC4KKworCisjIyMjIyMjIyMjIyMjIENvbXBpbGF0aW9uLXRpbWUgY29uc3RhbnRzIChmcm9tIGZyZWVEaWFtZXRlci1ob3N0LmgpICMjIyMjIyMjIyMjIworCisjIERpc3BsYXkgY3VycmVudCB2ZXJzaW9uCitwcmludCAiJXMgJWQuJWQuJWQiICUgKEZEX1BST0pFQ1RfTkFNRSwgRkRfUFJPSkVDVF9WRVJTSU9OX01BSk9SLCBGRF9QUk9KRUNUX1ZFUlNJT05fTUlOT1IsIEZEX1BST0pFQ1RfVkVSU0lPTl9SRVYpCisKKworIyMjIyMjIyMjIyMjIyBEZWJ1ZyAjIyMjIyMjIyMjIyMKKworIyBDaGFuZ2UgdGhlIGdsb2JhbCBkZWJ1ZyBsZXZlbCBvZiB0aGUgZnJhbWV3b3JrIChjdmFyIGNvbnRhaW5zIGFsbCBnbG9iYWwgdmFyaWFibGVzKQorY3Zhci5mZF9nX2RlYnVnX2x2bCA9IDEKKworCisjIFR1cm4gb24gZGVidWcgZm9yIGEgc3BlY2lmaWMgZnVuY3Rpb24gKGlmIGZyYW1ld29yayBjb21waWxlZCB3aXRoIERFQlVHIHN1cHBvcnQpCitjdmFyLmZkX2RlYnVnX29uZV9mdW5jdGlvbiA9ICJnY190aF9mY3QiCisKKworIyBQcmludCBtZXNzYWdlcyB0byBmcmVlRGlhbWV0ZXIncyBkZWJ1ZyBmYWNpbGl0eQorIyBOb3RlOiB0aGUgcHl0aG9uIHZlcnNpb24gZG9lcyBub3Qgc3VwcG9ydCBwcmludGYtbGlrZSBhcmd1bWVudCBsaXN0LiBUaGUgZm9ybWF0aW5nIHNob3VsZCBiZSBkb25lIGluIHB5dGhvbi4KKyMgICAgICAgU2VlIFNXSUcgZG9jdW1lbnRhdGlvbiBhYm91dCB2YXJhcmdzIGZ1bmN0aW9ucyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KK2ZkX2xvZyhGRF9MT0dfTk9USUNFLCAiMyArIDQgPSAlZCIgJSAoNykpCisKKworIyBEaXNwbGF5IHNvbWUgZnJhbWV3b3JrIHN0YXRlIGluZm9ybWF0aW9uCitjb25mID0gZmRfY29uZl9kdW1wKCk7CitwcmludCBjb25mOworCitmZF9wZWVyX2R1bXBfbGlzdCgwKQorZmRfc2VydmVyc19kdW1wKDApCitmZF9leHRfZHVtcCgwKQorCisKKyMjIyMjIyMjIyMjIyMgR2xvYmFsIHZhcmlhYmxlcyAjIyMjIyMjIyMjIyMKKworIyBEaXNwbGF5IHRoZSBsb2NhbCBEaWFtZXRlciBJZGVudGl0eToKK3ByaW50ICJMb2NhbCBEaWFtZXRlciBJZGVudGl0eToiLCBjdmFyLmZkX2dfY29uZmlnLmNuZl9kaWFtaWQKKworIyBEaXNwbGF5IHJlYWxtLCB1c2luZyB0aGUgbG93LWxldmVsIGZ1bmN0aW9ucyAoc2tpcCBwcm94eSBjbGFzc2UgZGVmaW5pdGlvbnMpOgorcHJpbnQgIlJlYWxtOiIsIF9mRHB5LmZkX2NvbmZpZ19jbmZfZGlhbXJsbV9nZXQoX2ZEcHkuY3Zhci5mZF9nX2NvbmZpZykKKworCisKKyMjIyMjIyMjIyMjIyMgTGlzdHMgIyMjIyMjIyMjIyMjCisKKyMgTm90ZTogd2UgdXNlIGRpZmZlcmVudCBuYW1lcyBmcm9tIHRoZSBDIEFQSSBoZXJlLCBmb3IgdXNhYmlsaXR5LgorbDEgPSBmZF9saXN0KCkgICAjIFdpbGwgYmUgb3VyIHNlbnRpbmVsCitsMiA9IGZkX2xpc3QoKQorbDMgPSBmZF9saXN0KCkKK2wxLmlzZW1wdHkoKQorbDEuaW5zZXJ0X25leHQobDIpICAgIyBsMSAtPiBsMgorbDEuaXNlbXB0eSgpCitsMS5pbnNlcnRfcHJldihsMykgICAjIGwxIC0+IGwyIC0+IGwzIChjaXJjdWxhciBsaXN0KQorbDEuZHVtcCgpCitsMy5kZXRhY2goKSAgICAgICAgICAjIGwxIC0+IGwyCitsND1mZF9saXN0KCkKK2w1PWZkX2xpc3QoKQorbDMuaW5zZXJ0X25leHQobDQpICAgIyAgIGwzIC0+IGw0CitsMy5pbnNlcnRfbmV4dChsNSkgICAjICAgbDMgLT4gbDUgLT4gbDQKK2wxLmNvbmNhdChsMykgICAgICAgICMgbDEgLT4gbDIgLT4gbDUgLT4gbDQKKworZWxlbWVudHMgPSBsMS5lbnVtX2FzKCkgICMgZGVmYXVsdDogZW51bWVyYXRlcyBhcyBmZF9saXN0LiBXYXJuaW5nOiB0aGlzIGEgY29weSwgY2hhbmdpbmcgdGhlIHB5dGhvbiBsaXN0IGhhcyBubyBlZmZlY3Qgb24gdGhlIHVuZGVybHlpbmcgZmRfbGlzdC4KK2ZvciBsaSBpbiBlbGVtZW50czoKKyAgbGkuZHVtcCgpCisKK2RlbCBlbGVtZW50cworZGVsIGwyCitkZWwgbDMKK2RlbCBsNAorZGVsIGw1CitsMS5pc2VtcHR5KCkgIyBUaGUgZGVzdHJ1Y3RvciBoYXMgYW4gaW1wbGljaXQgZmRfbGlzdF91bmxpbmsgY2FsbAorZGVsIGwxCisKKworIyMjIyMjIyMjIyMjIyBIYXNoICMjIyMjIyMjIyMjIworCitoZXgoZmRfb3NfaGFzaCgiaGVsbG8gd29ybGQiKSkJIyBJdCBhY2NlcHRzIGJpbmFyeSBkYXRhCisKKworIyMjIyMjIyMjIyMjIyBEaWN0aW9uYXJ5ICMjIyMjIyMjIyMjIworCisjIyMjIyBDcmVhdGUgYSBkZWRpY2F0ZWQgZGljdGlvbmFyeSBmb3Igb3VyIHRlc3RzCitkID0gZGljdGlvbmFyeSgpCitkLmR1bXAoKQorCisjIE5ldyB2ZW5kb3IKK3YgPSBkaWN0X3ZlbmRvcl9kYXRhKCkKK3YudmVuZG9yX2lkID0gMTIzCit2LnZlbmRvcl9uYW1lID0gIk15IHRlc3QgdmVuZG9yIgorbXlfdmVuZG9yID0gZC5uZXdfb2JqKERJQ1RfVkVORE9SLCB2KQorZGVsIHYKK2QuZHVtcCgpCitkLnZlbmRvcnNfbGlzdCgpCisKKyMgQ29tcGFjdCBpbnZvY2F0aW9uIGFsc28gcG9zc2libGU6Cit2MiA9IGRpY3RfdmVuZG9yX2RhdGEoMTI0LCAiTXkgdGVzdCB2ZW5kb3IgMiIpCitkZWwgdjIKKworIyBOZXcgYXBwbGljYXRpb24KK2EgPSBkaWN0X2FwcGxpY2F0aW9uX2RhdGEoKQorYS5hcHBsaWNhdGlvbl9pZCA9IDk5CithLmFwcGxpY2F0aW9uX25hbWUgPSAiTXkgdGVzdCBhcHBsIgorbXlfYXBwbCA9IGQubmV3X29iaihESUNUX0FQUExJQ0FUSU9OLCBhLCBteV92ZW5kb3IpCitkZWwgYQorCithMiA9IGRpY3RfYXBwbGljYXRpb25fZGF0YSg5OSwgIk15IHRlc3QgYXBwbCAyIikKK2RlbCBhMgorCisjIE5ldyB0eXBlIChjYWxsYmFja3MgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0Li4uKQordCA9IGRpY3RfdHlwZV9kYXRhKCkKK3QudHlwZV9iYXNlID0gQVZQX1RZUEVfSU5URUdFUjMyCit0LnR5cGVfbmFtZSA9ICJNeSBpbnRlZ2VyIEFWUCIKK215X3R5cGVfaW50ID0gZC5uZXdfb2JqKERJQ1RfVFlQRSwgdCwgbXlfYXBwbCkKK3QudHlwZV9iYXNlID0gQVZQX1RZUEVfT0NURVRTVFJJTkcKK3QudHlwZV9uYW1lID0gIk15IGJpbmFyeSBidWZmZXIgQVZQIgorbXlfdHlwZV9vcyA9IGQubmV3X29iaihESUNUX1RZUEUsIHQsIG15X2FwcGwpCitkZWwgdAorCit0MiA9IGRpY3RfdHlwZV9kYXRhKEFWUF9UWVBFX1VOU0lHTkVEMzIsICJ1MzIgdHlwZSIpCitkZWwgdDIKKworIyBDb25zdGFudHMKK2MgPSBkaWN0X2VudW12YWxfZGF0YSgpCitjLmVudW1fbmFtZSA9ICJBVlBfVkFMVUVfVFJPSVMiCitjLmVudW1fdmFsdWUuaTMyID0gMworZC5uZXdfb2JqKERJQ1RfRU5VTVZBTCwgYywgbXlfdHlwZV9pbnQpCisKK2MuZW51bV9uYW1lID0gIkFfQlVGRkVSX0NPTlNUQU5UIgorYy5lbnVtX3ZhbHVlLm9zID0gIlRoaXMgaXMgYSB2ZXJ5IGxvbmcgQVZQIHZhbHVlIHRoYXQgd2UgcHJlZmVyIHRvIHJlcHJlc2VudCBhcyBhIGNvbnN0YW50IgorYy5lbnVtX3ZhbHVlLm9zLmR1bXAoKQorZC5uZXdfb2JqKERJQ1RfRU5VTVZBTCwgYywgbXlfdHlwZV9vcykKK2RlbCBjCisKK2MyID0gZGljdF9lbnVtdmFsX2RhdGEoImVudW0gMjMiLCAyMykgICMgVGhlIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyB1bnNpZ25lZDMyLCBmb3Igb3RoZXIgdmFsdWVzLCBzZXQgdGhlbSBhZnRlcndhcmRzCitjMyA9IGRpY3RfZW51bXZhbF9kYXRhKCJlbnVtIG90aGVyIikKK2MzLm9zID0gIm90aGVyIHZhbHVlIgorZGVsIGMyCitkZWwgYzMKKworIyBBVlAKK2EgPSBkaWN0X2F2cF9kYXRhKCkKK2EuYXZwX2NvZGUgPSAyMzQKK2EuYXZwX25hbWUgPSAibXkgaW50ZWdlciBhdnAiCithLmF2cF9mbGFnX21hc2sgPSBBVlBfRkxBR19NQU5EQVRPUlkKK2EuYXZwX2Jhc2V0eXBlID0gQVZQX1RZUEVfSU5URUdFUjMyCitteV9hdnBfaW50ID0gZC5uZXdfb2JqKERJQ1RfQVZQLCBhLCBteV90eXBlX2ludCkKKworYS5hdnBfdmVuZG9yID0gMTIzCithLmF2cF9uYW1lID0gIm15IE9TIGF2cCIKK2EuYXZwX2ZsYWdfbWFzayA9IEFWUF9GTEFHX01BTkRBVE9SWSArIEFWUF9GTEFHX1ZFTkRPUgorYS5hdnBfZmxhZ192YWwgPSBBVlBfRkxBR19WRU5ET1IKK2EuYXZwX2Jhc2V0eXBlID0gQVZQX1RZUEVfT0NURVRTVFJJTkcKK215X2F2cF9vcyA9IGQubmV3X29iaihESUNUX0FWUCwgYSwgbXlfdHlwZV9vcykKK2RlbCBhCisKK2EyID0gZGljdF9hdnBfZGF0YSgyMzUsICJubyB2ZW5kb3IsIG5vdCBtYW5kYXRvcnkiLCBBVlBfVFlQRV9PQ1RFVFNUUklORykKK2EzID0gZGljdF9hdnBfZGF0YSgyMzYsICJ2ZW5kb3IgMTIsIG5vdCBtYW5kYXRvcnkiLCBBVlBfVFlQRV9PQ1RFVFNUUklORywgMTIpCithNCA9IGRpY3RfYXZwX2RhdGEoMjM3LCAidmVuZG9yIDEyLCBtYW5kYXRvcnkiLCBBVlBfVFlQRV9PQ1RFVFNUUklORywgMTIsIDEpCithNSA9IGRpY3RfYXZwX2RhdGEoMjM4LCAibm8gdmVuZG9yLCBtYW5kYXRvcnkiLCBBVlBfVFlQRV9PQ1RFVFNUUklORywgMCwgMSkKK2RlbCBhMgorZGVsIGEzCitkZWwgYTQKK2RlbCBhNQorCisKKyMgQ29tbWFuZAorYyA9IGRpY3RfY21kX2RhdGEoKQorYy5jbWRfY29kZSA9IDM0NQorYy5jbWRfbmFtZSA9ICJNeS1QeXRob24tUmVxdWVzdCIKK2MuY21kX2ZsYWdfbWFzayA9IENNRF9GTEFHX1JFUVVFU1QgKyBDTURfRkxBR19QUk9YSUFCTEUKK2MuY21kX2ZsYWdfdmFsID0gQ01EX0ZMQUdfUkVRVUVTVCArIENNRF9GTEFHX1BST1hJQUJMRQorbXlfcmVxID0gZC5uZXdfb2JqKERJQ1RfQ09NTUFORCwgYywgbXlfYXBwbCkKK2MuY21kX25hbWUgPSAiTXktUHl0aG9uLUFuc3dlciIKK2MuY21kX2ZsYWdfdmFsID0gQ01EX0ZMQUdfUFJPWElBQkxFCitteV9hbnMgPSBkLm5ld19vYmooRElDVF9DT01NQU5ELCBjLCBteV9hcHBsKQorZGVsIGMKKworYzIgPSBkaWN0X2NtZF9kYXRhKDM0NiwgIlNlY29uZC1SZXF1ZXN0IiwgMSkgIyBEZWZhdWx0IGNyZWF0ZWQgd2l0aCBQUk9YSUFCTEUgZmxhZy4KK2MzID0gZGljdF9jbWRfZGF0YSgzNDYsICJTZWNvbmQtQW5zd2VyIiwgIDApIAorZGVsIGMyCitkZWwgYzMKKworIyBSdWxlCityID0gZGljdF9ydWxlX2RhdGEoKQorci5ydWxlX2F2cCA9IG15X2F2cF9pbnQKK3IucnVsZV9wb3NpdGlvbiA9IFJVTEVfUkVRVUlSRUQKK3IucnVsZV9taW4gPSAtMQorci5ydWxlX21heCA9IC0xCitkLm5ld19vYmooRElDVF9SVUxFLCByLCBteV9yZXEpCitkLm5ld19vYmooRElDVF9SVUxFLCByLCBteV9hbnMpCityLnJ1bGVfYXZwID0gbXlfYXZwX29zCitkLm5ld19vYmooRElDVF9SVUxFLCByLCBteV9yZXEpCitkLm5ld19vYmooRElDVF9SVUxFLCByLCBteV9hbnMpCitkZWwgcgorCityMiA9IGRpY3RfcnVsZV9kYXRhKG15X2F2cF9pbnQsIFJVTEVfUkVRVUlSRUQpICMgbWluICYgbWF4IGFyZSBvcHRpb25hbCBwYXJhbWV0ZXJzLCBkZWZhdWx0IHRvIC0xCityMyA9IGRpY3RfcnVsZV9kYXRhKG15X2F2cF9pbnQsIFJVTEVfUkVRVUlSRUQsIDIsIDMpICMgbWluIGlzIDIsIG1heCBpcyAzCityNCA9IGRpY3RfcnVsZV9kYXRhKG15X2F2cF9pbnQsIFJVTEVfRklYRURfSEVBRCkgIyBUaGUgcjQucnVsZV9vcmRlciA9IDEgYnkgZGVmYXVsdCwgY2hhbmdlIGFmdGVyd2FyZHMgaWYgbmVlZGVkLgorZGVsIHIyCitkZWwgcjMKK2RlbCByNAorCitkLmR1bXAoKQorZGVsIGQKKworIyMjIyMjIyBOb3cgcGxheSB3aXRoIHRoZSAicmVhbCIgZGljdGlvbmFyeQorCitnZGljdCA9IGN2YXIuZmRfZ19jb25maWcuY25mX2RpY3QKKworYXBwbCA9IGdkaWN0LnNlYXJjaCAoIERJQ1RfQVBQTElDQVRJT04sIEFQUExJQ0FUSU9OX0JZX0lELCAzICkKK2FwcGwuZHVtcCgpCithdnAgPSBnZGljdC5zZWFyY2ggKCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJPcmlnaW4tSG9zdCIpCithdnAuZHVtcCgpCitlcnJjbWQgPSBnZGljdC5lcnJvcl9jbWQoKQorCit2ID0gYXZwLmdldHZhbCgpCitwcmludCB2LmF2cF9jb2RlCitkZWwgdgorCit0ID0gYXZwLmdldHR5cGUoKQorcHJpbnQgdAorZGVsIHQKKworZGljdCA9IGF2cC5nZXRkaWN0KCkKK2RlbCBkaWN0CisKKworIyMjIyMjIyMjIyMjIyBTZXNzaW9ucyAjIyMjIyMjIyMjIyMKKworIyBoYW5kbGVyCitkZWYgbXlfY2xlYW51cChzdGF0ZSxzaWQpOgorICAgIHByaW50ICJDbGVhbmluZyB1cCBweXRob24gc3RhdGUgZm9yIHNlc3Npb246Iiwgc2lkCisgICAgcHJpbnQgIlJlY2VpdmVkIHN0YXRlOiIsIHN0YXRlCisgICAgZGVsIHN0YXRlCisKK2hkbCA9IHNlc3Npb25faGFuZGxlcihteV9jbGVhbnVwKQoraGRsLmR1bXAoKQorZGVsIGhkbAorCisjIFNlc3Npb24KK2hkbCA9IHNlc3Npb25faGFuZGxlcihteV9jbGVhbnVwKQorczEgPSBzZXNzaW9uKCkKK3MxLmdldHNpZCgpCitzMiA9IHNlc3Npb24oInRoaXMuaXMuYS5mdWxsLnNlc3Npb24uaWQiKQorcixzMyxpc25ldyA9IGZkX3Nlc3NfZnJvbXNpZCgidGhpcy5pcy5hLmZ1bGwuc2Vzc2lvbi5pZCIpICAjIHVzZSB0aGlzIGNhbGwgaWYgImlzbmV3IiBpcyByZWFsbHkgbmVlZGVkLi4uCitzNCA9IHNlc3Npb24oImhvc3QuaWQiLCAib3B0aW9uYWwucGFydCIpCitzNC5zZXR0aW1lb3V0KDMwKSAjIHRoZSBweXRob24gd3JhcHBlciB0YWtlcyBhIG51bWJlciBvZiBzZWNvbmRzIGFzIHBhcmFtZXRlciBmb3Igc2ltcGxpY2l0eQorczQuZHVtcCgpCisKKyMgc3RhdGVzCitteXN0YXRlID0gWyAzNCwgImJsYWgiLCBbIDMyLCAxMiBdIF0KK3MxLnN0b3JlKGhkbCwgbXlzdGF0ZSkKK2RlbCBteXN0YXRlCitnb3RzdGF0ZSA9IHMxLnJldHJpZXZlKGhkbCkKK3ByaW50IGdvdHN0YXRlCitkZWwgZ290c3RhdGUKKworCisjIyMjIyMjIyMjIyMjIFJvdXRpbmcgIyMjIyMjIyMjIyMjCisKK3JkID0gcnRfZGF0YSgpCisKK3JkLmFkZCgicDEudGVzdGJlZC5hYWEiLCAidGVzdGJlZC5hYWEiKQorcmQuYWRkKCJwMi50ZXN0YmVkLmFhYSIsICJ0ZXN0YmVkLmFhYSIpCityZC5hZGQoInAzLnRlc3RiZWQuYWFhIiwgInRlc3RiZWQuYWFhIikKK3JkLmFkZCgicDQudGVzdGJlZC5hYWEiLCAidGVzdGJlZC5hYWEiKQorCityZC5yZW1vdmUoInAyLnRlc3RiZWQuYWFhIikKKworcmQuZXJyb3IoInAzLnRlc3RiZWQuYWFhIiwgInJlbGF5LnRlc3RiZWQuYWFhIiwgMzAwMikKKworbGlzdCA9IHJkLmV4dHJhY3QoLTEpCitmb3IgYyBpbiBsaXN0LmVudW1fYXMoInN0cnVjdCBydGRfY2FuZGlkYXRlICoiKToKKyAgcHJpbnQgIiVzICglcyk6ICVzIiAlIChjLmRpYW1pZCwgYy5yZWFsbSwgYy5zY29yZSkKKworZGVsIHJkCisKKworIyBBIHJ0X2Z3ZCBjYWxsYmFjayBoYXMgdGhlIGZvbGxvd2luZyBwcm90b3R5cGU6CitkZWYgbXlfcnRmd2RfY2IobXNnKToKKyAgICBwcmludCAiRm9yd2FyZGluZyB0aGUgZm9sbG93aW5nIG1lc3NhZ2U6IgorICAgIG1zZy5kdW1wKCkKKyAgICByZXR1cm4gWyAwLCBtc2cgXSAgIyByZXR1cm4gTm9uZSBpbnN0ZWFkIG9mIG1zZyB0byBzdG9wIGZvcndhcmRpbmcuCisKK2Z3ZGhkbCA9IGZkX3J0X2Z3ZF9oZGwoIG15X3J0ZndkX2NiLCBSVF9GV0RfUkVRICkKKworCisjIEEgcnRfb3V0IGNiIGhhcyB0aGUgZm9sbG93aW5nIHByb3RvdHlwZToKK2RlZiBteV9ydG91dF9jYihtc2csIGxpc3QpOgorICAgIHByaW50ICJTZW5kaW5nIG91dCB0aGUgZm9sbG93aW5nIG1lc3NhZ2U6IgorICAgIG1zZy5kdW1wKCkKKyAgICBwcmludCAiVGhlIHBvc3NpYmxlIGNhbmRpZGF0ZXMgYXJlOiIKKyAgICBmb3IgYyBpbiBsaXN0LmVudW1fYXMoInN0cnVjdCBydGRfY2FuZGlkYXRlICoiKToKKyAgICAgICBwcmludCAiJXMgKCVzKTogJXMiICUgKGMuZGlhbWlkLCBjLnJlYWxtLCBjLnNjb3JlKQorICAgIHJldHVybiAwICAgIyByZXR1cm5zIGFuIGVycm9yIGNvZGUgKHN0YW5kYXJkIGVycm5vIHZhbHVlcykKKworb3V0aGRsID0gZmRfcnRfb3V0X2hkbCggbXlfcnRvdXRfY2IgKSAgIyBhIHByaW9yaXR5IGNhbiBiZSBzcGVjaWZpZWQgYXMgMm5kIHBhcmFtZXRlciwgZGVmYXVsdCBpcyAwLgorCisKKworCisKKyMjIyMjIyMjIyMjIyMgTWVzc2FnZXMsIEFWUHMgIyMjIyMjIyMjIyMjCisKKyMjIEFWUAorCisjIENyZWF0ZSBlbXB0eQorYmxhbmtfYXZwID0gYXZwKCkKK2RlbCBibGFua19hdnAKKworIyBDcmVhdGUgZnJvbSBkaWN0aW9uYXJ5IGRlZmluaXRpb25zCitvaCA9IGF2cChjdmFyLmZkX2dfY29uZmlnLmNuZl9kaWN0LnNlYXJjaCAoIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIk9yaWdpbi1Ib3N0IikpCSAgICAgICAgICAgICAgICAjIE9jdGV0IFN0cmluZwordmkgPSBhdnAoY3Zhci5mZF9nX2NvbmZpZy5jbmZfZGljdC5zZWFyY2ggKCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJWZW5kb3ItSWQiKSkgICAgICAgICAgICAgICAgICAgICAgICAjIFUzMgordnNhaSA9IGF2cChjdmFyLmZkX2dfY29uZmlnLmNuZl9kaWN0LnNlYXJjaCAoIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIlZlbmRvci1TcGVjaWZpYy1BcHBsaWNhdGlvbi1JZCIpKSAjIEdyb3VwZWQKKworIyBTZXQgdmFsdWVzCit2YWwgPSBhdnBfdmFsdWUoKQordmFsLnUzMiA9IDEyMwordmkuc2V0dmFsKE5vbmUpICAjIHRoaXMgY2xlYW5zIGEgcHJldmlvdXMgdmFsdWUgKHVzdWFsbHkgbm90IG5lZWRlZCkKK3ZpLnNldHZhbCh2YWwpCit2YWwub3MgPSAibXkub3JpZ2luLmhvc3QiCitvaC5zZXR2YWwodmFsKQordnNhaS5hZGRfY2hpbGQodmkpICMgY2FsbCBhcyBhZGRfY2hpbGQodmksIDEpIHRvIGFkZCB0aGUgbmV3IEFWUCBhdCB0aGUgYmVnaW5uaW5nLCBkZWZhdWx0IGlzIGF0IHRoZSBlbmQKKworIyBJdCBpcyBwb3NzaWJsZSB0byBpbml0aWFsaXplIHRoZSBBVlAgd2l0aCBhIGJsYW5rIHZhbHVlIGFzIGZvbGxvdzoKK2JsYW5rX3dpdGhfdmFsdWUgPSBhdnAoTm9uZSwgQVZQRkxfU0VUX0JMQU5LX1ZBTFVFKQorIyBpdCBlbmFibGVzIHRoaXMgd2l0aG91dCBkb2luZyB0aGUgc2V0dmFsIGNhbGw6CitibGFua193aXRoX3ZhbHVlLmhlYWRlcigpLmF2cF92YWx1ZS51MzIgPSAxMgorCisKKyMjIE1lc3NhZ2VzCisKKyMgQ3JlYXRlIGVtcHQgKGFzIGZvciBhdnBzLCBwYXNzIE5vbmUgb3IgYSBkaWN0aW9uYXJ5IG9iamVjdCBhcyAxc3QgcGFyYW0sIGFuZCBmbGFncyBhcyBvcHRpb25hbCAybmQgcGFyYW0peQorYV9tc2cgPSBtc2coKQorYV9tc2cuZHVtcCgpCitkZWwgYV9tc2cKKworIyBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHBhc3MgTVNHRkxfKiBmbGFncyBpbiBzZWNvbmQgcGFyYW1ldGVyIChBTExPQ19FVEVJRCBpcyBkZWZhdWx0KQorbXNnX25vX2VpZCA9IG1zZyhOb25lLCAwKQorbXNnX25vX2VpZC5kdW1wKCkKK2RlbCBtc2dfbm9fZWlkCisKKyMgQ3JlYXRlIGZyb20gZGljdGlvbmFyeQorZHdyX2RpY3QgPSBjdmFyLmZkX2dfY29uZmlnLmNuZl9kaWN0LnNlYXJjaCAoIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJEZXZpY2UtV2F0Y2hkb2ctUmVxdWVzdCIgKQorZHdyID0gbXNnKGR3cl9kaWN0KQorZHdyLmR1bXAoKQorCisjIENyZWF0ZSBtc2cgZnJvbSBhIGJpbmFyeSBidWZmZXIgKHRoZW4geW91IHNob3VsZCBjYWxsIHBhcnNlX2RpY3QgYW5kIHBhcnNlX3J1bGVzIG1ldGhvZHMpCitkd3IyID0gbXNnKCJceDAxXHgwMFx4MDBceDE0XHg4MFx4MDBceDAxXHgxOFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgxYlx4ZjBceDAwXHgwMSIpCisKKyMgQ3JlYXRlIGFuc3dlciBmcm9tIHJlcXVlc3QgKG9wdGlvbmFsIHBhcmFtZXRlcnM6IGRpY3Rpb25hcnkgdG8gdXNlLCBhbmQgZmxhZ3MpOgorZHdyMyA9IG1zZyhjdmFyLmZkX2dfY29uZmlnLmNuZl9kaWN0LnNlYXJjaCAoIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJEZXZpY2UtV2F0Y2hkb2ctUmVxdWVzdCIgKSkKK2R3YTMgPSBkd3IzLmNyZWF0ZV9hbnN3ZXIoKQorZHdyM2NweSA9IGR3YTMuZ2V0X3F1ZXJ5KCkKKworCisjIyBPdGhlciBmdW5jdGlvbnMgd2l0aCBBVlBzICYgbWVzc2FnZXMKKworIyBBZGQgdGhlIEFWUHMgaW4gdGhlIG1lc3NhZ2UKK2R3ci5hZGRfY2hpbGQob2gpCitvaC5hZGRfbmV4dCh2c2FpKSAgICMgZXF1aXZhbGVudCB0byBhZGRfY2hpbGQgb24gdGhlIHBhcmVudAorCisjIENyZWF0ZSBhIG5ldHdvcmsgYnl0ZSBidWZmZXIgZnJvbSB0aGUgbWVzc2FnZQorZHdyLmJ1ZmZlcml6ZSgpCisKKyMgR2V0IGZpcnN0IGNoaWxkIEFWUCAoZmFzdCkKK2F2cCA9IGR3ci5maXJzdF9jaGlsZCgpCisKKyMgdGhlbjoKK2F2cCA9IGF2cC5nZXRfbmV4dCgpICMgd2hlbiBsYXN0IEFWUCwgcmV0dXJucyBOb25lCisKKworIyBHZXQgYWxsIDFzdCBsZXZlbCBjaGlsZHJlbiAoc2xvd2VyKSAtLSB3YXJuaW5nLCBjaGFuZ2VzIHRvIHRoZSBweXRob24gbGlzdCB3aWxsIG5vdCBiZSByZWZsZWN0ZWQgb24gdGhlIHVuZGVybHlpbmcgbWVzc2FnZS4gcmVhZC1vbmx5IHVzZS4KK2R3ci5jaGlsZHJlbigpCisjIGV4YW1wbGUgdXNlOgorZm9yIGEgaW4gZHdyLmNoaWxkcmVuKCk6CisgIGEuZHVtcCgwKSAgIyAwIG1lYW5zOiBkdW1wIG9ubHkgdGhpcyBvYmplY3QsIGRvIG5vdCB3YWxrIHRoZSB0cmVlCisKKworIyBTZWFyY2ggdGhlIGZpcnN0IEFWUCBvZiBhIGdpdmVuIHR5cGUKK29oX2RpY3QgPSBjdmFyLmZkX2dfY29uZmlnLmNuZl9kaWN0LnNlYXJjaCggRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiT3JpZ2luLUhvc3QiKQorb2ggPSBkd3Iuc2VhcmNoKCBvaF9kaWN0ICkKKworIyBBZnRlciBhZGRpbmcgQVZQcywgdGhlIGxlbmd0aCBpbiB0aGUgbWVzc2FnZSBoZWFkZXIgaXMgb3V0ZGF0ZWQsIHJlZnJlc2ggYXMgZm9sbG93OgorZHdyLnVwZGF0ZV9sZW5ndGgoKQorCisjIEdldCBkaWN0aW9uYXJ5IG1vZGVsIGZvciBhIG1lc3NhZ2Ugb3IgYXZwCitkd3IubW9kZWwoKQorb2gubW9kZWwoKS5kdW1wKCkKKworIyBSZXRyaWV2ZSB0aGUgaGVhZGVyIG9mIG1lc3NhZ2VzICYgYXZwOgorZHdyX2hkciA9IGR3ci5oZWFkZXIoKQorZHdyX2hkci5tc2dfdmVyc2lvbgorZHdyX2hkci5tc2dfaGJoaWQKKworb2hfaGRyID0gb2guaGVhZGVyKCkKK2hleChvaF9oZHIuYXZwX2ZsYWdzKQorb2hfaGRyLmF2cF92ZW5kb3IKK29oX2hkci5hdnBfdmFsdWUub3MuYXNfc3RyKCkgCisKKworIyBHZXQgb3Igc2V0IHRoZSByb3V0aW5nIGRhdGEKK3JkID0gcnRfZGF0YSgpCitkd3Iuc2V0X3J0ZChyZCkKK3JkID0gZHdyLmdldF9ydGQoKQorCisjIFRlc3QgaWYgbWVzc2FnZSBpcyByb3V0YWJsZQorZHdyLmlzX3JvdXRhYmxlKCkKKworIyBXaGljaCBwZWVyIHRoZSBtZXNzYWdlIHdhcyByZWNlaXZlZCBmcm9tICh3aGVuIHJlY2VpdmVkIGZyb20gbmV0d29yaykKK2R3ci5zb3VyY2UoKQorCisjIFRoZSBzZXNzaW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBtZXNzYWdlIChyZXR1cm5zIE5vbmUgd2hlbiBubyBTZXNzaW9uLUlkIEFWUCBpcyBpbmNsdWRlZCkKK2R3ci5nZXRfc2Vzc2lvbigpCisKKworIyBQYXJzZSBhIGJ1ZmZlcgorYnVmID0gIlx4MDFceDAwXHgwMEBceDgwXHgwMFx4MDFceDE4XHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBOXHgxMFx4MDBceDAwXHgwMFx4MDBceDAxXHgwOEBceDAwXHgwMFx4MTZteS5vcmlnaW4uaG9zdFx4MDBceDAwXHgwMFx4MDBceDAxXHgwNEBceDAwXHgwMFx4MTRceDAwXHgwMFx4MDFcbkBceDAwXHgwMFx4MGNceDAwXHgwMFx4MDB7IgorbXlkd3IgPSBtc2coYnVmKQorIyBSZXNvbHZlIG9iamVjdHMgaW4gdGhlIGRpY3Rpb25hcnkuIFJldHVybiB2YWx1ZSBpcyBOb25lIG9yIGEgc3RydWN0IHBlaV9lcnJvciBpbiBjYXNlIG9mIHByb2JsZW0uCitteWR3ci5wYXJzZV9kaWN0KCkgICMgaWYgbm90IHVzaW5nIHRoZSBmRCBnbG9iYWwgZGljdCwgcGFzcyBpdCBhcyBwYXJhbWV0ZXIKK2VyciA9IG15ZHdyLnBhcnNlX3J1bGVzKCkKK2Vyci5wZWlfZXJyY29kZQorCisKKyMgR3JvdXBlZCBBVlBzIGFyZSBicm93c2VkIHdpdGggc2FtZSBtZXRob2RzIGFzIG1lc3NhZ2VzOgorZ2F2cCA9IGR3ci5jaGlsZHJlbigpWzFdCitnYXZwLmZpcnN0X2NoaWxkKCkuZHVtcCgpCitnYXZwLmNoaWxkcmVuKCkKKworCisjIFNlbmQgYSBtZXNzYWdlOgorbXlkd3IgPSBtc2coYnVmKQorbXlkd3Iuc2VuZCgpCisKKyMgT3B0aW9uYWxseSwgYSBjYWxsYmFjayBjYW4gYmUgcmVnaXN0ZXJlZCB3aGVuIGEgcmVxdWVzdCBpcyBzZW50LCB3aXRoIGFuIG9wdGlvbmFsIG9iamVjdC4KKyMgVGhpcyBjYWxsYmFjayB0YWtlcyB0aGUgYW5zd2VyIG1lc3NhZ2UgYXMgcGFyYW1ldGVyIGFuZCBzaG91bGQgcmV0dXJuIE5vbmUgb3IgYSBtZXNzYWdlLiAoY2YuIGZkX21zZ19zZW5kKQorZGVmIHNlbmRfY2FsbGJhY2sobXNnLCBvYmopOgorICAgIHByaW50ICJSZWNlaXZlZCBhbnN3ZXI6IgorICAgIG1zZy5kdW1wKCkKKyAgICBwcmludCAiQXNzb2NpYXRlZCBkYXRhOiIKKyAgICBvYmoKKyAgICByZXR1cm4gTm9uZQorCitteWR3ciA9IG1zZyhidWYpCitteWR3ci5zZW5kKHNlbmRfY2FsbGJhY2ssIHNvbWVfb2JqZWN0KQorCisjIEFnYWluIG9wdGlvbmFsbHksIGEgdGltZSBsaW1pdCBjYW4gYmUgc3BlY2lmaWVkIGluIHRoaXMgY2FzZSBhcyBmb2xsb3c6CitteWR3ci5zZW5kKHNlbmRfY2FsbGJhY2ssIHNvbWVfb2JqZWN0LCAxMCkKKyMgSW4gdGhhdCBjYXNlLCBpZiBubyBhbnN3ZXIgLyBlcnJvciBpcyByZWNlaXZlZCBhZnRlciAxMCBzZWNvbmRzICh0aGUgdmFsdWUgc3BlY2lmaWVkKSwgCisjIHRoZSBjYWxsYmFjayBpcyBjYWxsZWQgd2l0aCB0aGUgcmVxdWVzdCBhcyBwYXJhbWV0ZXIuCisjIFRlc3RpbmcgZm9yIHRpbWVvdXQgY2FzZSBpcyBkb25lIGJ5IHVzaW5nIG1zZy5pc19yZXF1ZXN0KCkKK2RlZiBzZW5kX2NhbGxiYWNrKG1zZywgb2JqKToKKyAgICBpZiAobXNnLmlzX3JlcXVlc3QoKSk6CisgICAgICAgIHByaW50ICJSZXF1ZXN0IHRpbWVkIG91dCB3aXRob3V0IGFuc3dlcjoiCisgICAgZWxzZToKKyAgICAgICAgcHJpbnQgIlJlY2VpdmVkIGFuc3dlcjoiCisgICAgbXNnLmR1bXAoKQorICAgIHByaW50ICJBc3NvY2lhdGVkIGRhdGE6IgorICAgIG9iagorICAgIHJldHVybiBOb25lCisKKworIyBTZXQgYSByZXN1bHQgY29kZSBpbiBhbiBhbnN3ZXIgbWVzc2FnZS4KK215ZHdyID0gbXNnKGJ1ZikKK2R3YSA9IG15ZHdyLmNyZWF0ZV9hbnN3ZXIoKQorZHdhLnJlc2NvZGVfc2V0KCkgICAjIFRoaXMgYWRkcyB0aGUgRElBTUVURVJfU1VDQ0VTUyByZXN1bHQgY29kZQorZHdhLnJlc2NvZGVfc2V0KCJESUFNRVRFUl9MSU1JVEVEX1NVQ0NFU1MiICkgICAjIFRoaXMgYWRkcyBhIGRpZmZlcmVudCByZXN1bHQgY29kZQorZHdhLnJlc2NvZGVfc2V0KCJESUFNRVRFUl9MSU1JVEVEX1NVQ0NFU1MiLCAiU29tZXRoaW5nIHdlbnQgbm90IHNvIHdlbGwiICkgICAjIFRoaXMgYWRkcyBhIGRpZmZlcmVudCByZXN1bHQgY29kZSArIHNwZWNpZmllZCBFcnJvci1NZXNzYWdlCitkd2EucmVzY29kZV9zZXQoIkRJQU1FVEVSX0lOVkFMSURfQVZQIiwgTm9uZSwgZmF1bHR5X2F2cCApICAgIyBUaGlzIGFkZHMgYSBGYWlsZWQtQVZQCitkd2EucmVzY29kZV9zZXQoIkRJQU1FVEVSX1NVQ0NFU1MiLCBOb25lLCBOb25lLCAxICkgICAjIFRoaXMgYWRkcyBvcmlnaW4gaW5mb3JtYXRpb24gKHNlZSBmZF9tc2dfcmVzY29kZV9zZXQncyB0eXBlX2lkIGZvciBtb3JlIGluZm8pCisKKyMgU2V0IHRoZSBvcmlnaW4gdG8gbG9jYWwgaG9zdAorbXlkd3IuYWRkX29yaWdpbigpICAjIGFkZHMgT3JpZ2luLUhvc3QgJiBPcmlnaW4tUmVhbG0KK215ZHdyLmFkZF9vcmlnaW4oMSkgIyBhZGRzIE9yaWdpbi1TdGF0ZS1JZCBpbiBhZGRpdGlvbi4KKworCisjIyMjIyMjIyMjIyMjIERJU1BBVENIIChha2EuIHNlcnZlciBhcHBsaWNhdGlvbikgIyMjIyMjIyMjIyMjCisKKyMgQXMgZm9yIHNlc3Npb25zLCBvbmx5IG9uZSBkaXNwYXRjaCBoYW5kbGVyIGNhbiBiZSByZWdpc3RlcmVkIGluIHRoaXMgZXh0ZW5zaW9uIGF0IHRoZSBtb21lbnQuCisjIFRoZSBjYWxsYmFjayBmb3IgdGhlIGhhbmRsZXIgaGFzIHRoZSBmb2xsb3dpbmcgc3ludGF4OgorZGVmIGRpc3BhdGNoX2NiX21vZGVsKGlubXNnLCBpbmF2cCwgaW5zZXNzaW9uKToKKyAgIHByaW50ICJDYWxsYmFjayB0cmlnZ2VkIG9uIG1lc3NhZ2U6ICIKKyAgIGlubXNnLmR1bXAoKQorICAgIyBpbmF2cCBpcyBOb25lIG9yIHRoZSBBVlAgdGhhdCB0cmlnZ2VkIHRoZSBjYWxsYmFjaywgZGVwZW5kaW5nIG9uIGhvdyBpdCB3YXMgcmVnaXN0ZXJlZC4KKyAgIGlmIGluYXZwOgorICAgICBwcmludCAiRnJvbSB0aGUgZm9sbG93aW5nIEFWUDoiCisgICAgIGluYXZwLmR1bXAoKQorICAgZWxzZToKKyAgICAgcHJpbnQgIk5vIEFWUCIKKyAgICMgU2Vzc2lvbiBpcyBwcm92aWRlZCBvbmx5IGlmIGEgU2Vzc2lvbi1JZCBpcyBpbiB0aGUgbWVzc2FnZQorICAgaWYgaW5zZXNzaW9uOgorICAgICBwcmludCAiVGhlIHNlc3Npb24gaXM6ICIsIGluc2Vzc2lvbi5nZXRzaWQoKQorICAgZWxzZToKKyAgICAgcHJpbnQgIk5vIHNlc3Npb24iCisgICAjIE5vdywgZm9yIHRoZSByZXR1cm4gdmFsdWUuCisgICAjIFRoaXMgY2FsbGJhY2sgbXVzdCByZXR1cm4gMyBlbGVtZW50czoKKyAgICMgLSBhbiBpbnRlZ2VyIHdoaWNoIGlzIGludGVycHJldGVkIGFzIGFuIGVycm9yIGNvZGUgKGVycm5vLmgpCisgICAjIC0gYSBtZXNzYWdlIG9yIE5vbmUsIGRlcGVuZGluZyBvbiB0aGUgbmV4dCBpdGVtCisgICAjIC0gYW4gZW51bSBkaXNwX2FjdGlvbiB2YWx1ZSwgd2l0aCB0aGUgc2FtZSBtZWFuaW5nIGFzIGluIEMgKHNlZSBsaWJmcmVlRGlhbWV0ZXIuaCkKKyAgIGRlbCBpbm1zZworICAgcmV0dXJuIFsgMCwgTm9uZSwgRElTUF9BQ1RfQ09OVCBdCisKKworIyMjIEV4YW1wbGUgdXNlOiByZWJ1aWxkIHRoZSBzZXJ2ZXItc2lkZSBvZiB0ZXN0X2FwcC5mZHggaW4gcHl0aG9uCisKKyMgVGhlIGZvbGxvd2luZyBibG9jayBkZWZpbmVzIHRoZSBkaWN0aW9uYXJ5IG9iamVjdHMgZnJvbSB0aGUgdGVzdF9hcHAuZmR4IGFwcGxpY2F0aW9uIHRoYXQgd2UgdXNlIG9uIHRoZSByZW1vdGUgcGVlcgorZ2RpY3QgPSBjdmFyLmZkX2dfY29uZmlnLmNuZl9kaWN0CitkX3NpID0gZ2RpY3Quc2VhcmNoICggRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiU2Vzc2lvbi1JZCIgKQorZF9vaCAgPSBnZGljdC5zZWFyY2ggKCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJPcmlnaW4tSG9zdCIgKQorZF9vciAgPSBnZGljdC5zZWFyY2ggKCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJPcmlnaW4tUmVhbG0iICkKK2RfZGggID0gZ2RpY3Quc2VhcmNoICggRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiRGVzdGluYXRpb24tSG9zdCIgKQorZF9kciAgPSBnZGljdC5zZWFyY2ggKCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJEZXN0aW5hdGlvbi1SZWFsbSIgKQorZF9yYyAgPSBnZGljdC5zZWFyY2ggKCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJSZXN1bHQtQ29kZSIgKQorZF92bmQgPSBnZGljdC5uZXdfb2JqKERJQ1RfVkVORE9SLCAJZGljdF92ZW5kb3JfZGF0YSg5OTk5OTksIAkiYXBwX3Rlc3RfcHkgdmVuZG9yIikgKQorZF9hcHAgPSBnZGljdC5uZXdfb2JqKERJQ1RfQVBQTElDQVRJT04sIGRpY3RfYXBwbGljYXRpb25fZGF0YSgweGZmZmZmZiwgImFwcF90ZXN0X3B5IGFwcGxpIiksIGRfdm5kKQorZF9yZXEgPSBnZGljdC5uZXdfb2JqKERJQ1RfQ09NTUFORCwgCWRpY3RfY21kX2RhdGEoMHhmZmZmZmUsICJUZXN0X3B5LVJlcXVlc3QiLCAxKSwgZF9hcHApCitkX2FucyA9IGdkaWN0Lm5ld19vYmooRElDVF9DT01NQU5ELCAJZGljdF9jbWRfZGF0YSgweGZmZmZmZSwgIlRlc3RfcHktQW5zd2VyIiwgIDApLCBkX2FwcCkKK2RfYXZwID0gZ2RpY3QubmV3X29iaihESUNUX0FWUCwgCWRpY3RfYXZwX2RhdGEoMHhmZmZmZmYsICJhcHBfdGVzdF9weSBhdnAiLCBBVlBfVFlQRV9JTlRFR0VSMzIsIDk5OTk5OSApKQorZ2RpY3QubmV3X29iaihESUNUX1JVTEUsIGRpY3RfcnVsZV9kYXRhKGRfc2ksIFJVTEVfRklYRURfSEVBRCwgMSwgMSksIGRfcmVxKQorZ2RpY3QubmV3X29iaihESUNUX1JVTEUsIGRpY3RfcnVsZV9kYXRhKGRfc2ksIFJVTEVfRklYRURfSEVBRCwgMSwgMSksIGRfYW5zKQorZ2RpY3QubmV3X29iaihESUNUX1JVTEUsIGRpY3RfcnVsZV9kYXRhKGRfYXZwLCBSVUxFX1JFUVVJUkVELCAxLCAxKSwgZF9yZXEpCitnZGljdC5uZXdfb2JqKERJQ1RfUlVMRSwgZGljdF9ydWxlX2RhdGEoZF9hdnAsIFJVTEVfUkVRVUlSRUQsIDEsIDEpLCBkX2FucykKK2dkaWN0Lm5ld19vYmooRElDVF9SVUxFLCBkaWN0X3J1bGVfZGF0YShkX29oLCBSVUxFX1JFUVVJUkVELCAxLCAxKSwgZF9yZXEpCitnZGljdC5uZXdfb2JqKERJQ1RfUlVMRSwgZGljdF9ydWxlX2RhdGEoZF9vaCwgUlVMRV9SRVFVSVJFRCwgMSwgMSksIGRfYW5zKQorZ2RpY3QubmV3X29iaihESUNUX1JVTEUsIGRpY3RfcnVsZV9kYXRhKGRfb3IsIFJVTEVfUkVRVUlSRUQsIDEsIDEpLCBkX3JlcSkKK2dkaWN0Lm5ld19vYmooRElDVF9SVUxFLCBkaWN0X3J1bGVfZGF0YShkX29yLCBSVUxFX1JFUVVJUkVELCAxLCAxKSwgZF9hbnMpCitnZGljdC5uZXdfb2JqKERJQ1RfUlVMRSwgZGljdF9ydWxlX2RhdGEoZF9kciwgUlVMRV9SRVFVSVJFRCwgMSwgMSksIGRfcmVxKQorZ2RpY3QubmV3X29iaihESUNUX1JVTEUsIGRpY3RfcnVsZV9kYXRhKGRfZGgsIFJVTEVfT1BUSU9OQUwsIDAsIDEpLCBkX3JlcSkKK2dkaWN0Lm5ld19vYmooRElDVF9SVUxFLCBkaWN0X3J1bGVfZGF0YShkX3JjLCBSVUxFX1JFUVVJUkVELCAxLCAxKSwgZF9hbnMpCisKKyMgTm93LCBjcmVhdGUgdGhlIFRlc3RfYXBwIHNlcnZlciBjYWxsYmFjazoKK2RlZiB0ZXN0X2FwcF9jYihpbm1zZywgaW5hdnAsIGluc2Vzc2lvbik6CisgICB0dmFsID0gaW5tc2cuc2VhcmNoKGRfYXZwKS5oZWFkZXIoKS5hdnBfdmFsdWUudTMyCisgICBwcmludCAiUHkgRUNITyBUZXN0IG1lc3NhZ2UgZnJvbSAnJXMnIHdpdGggdGVzdCB2YWx1ZSAleCwgcmVwbHlpbmcuLi4iICUgKGlubXNnLnNlYXJjaChkX29oKS5oZWFkZXIoKS5hdnBfdmFsdWUub3MuYXNfc3RyKCksIHR2YWwpCisgICBhbnN3ID0gaW5tc2cuY3JlYXRlX2Fuc3dlcigpCisgICBhbnN3LnJlc2NvZGVfc2V0KCkKKyAgIGFuc3cuYWRkX29yaWdpbigpCisgICB0YSA9IGF2cChkX2F2cCwgQVZQRkxfU0VUX0JMQU5LX1ZBTFVFKQorICAgdGEuaGVhZGVyKCkuYXZwX3ZhbHVlLnUzMiA9IHR2YWwKKyAgIGFuc3cuYWRkX2NoaWxkKHRhKQorICAgcmV0dXJuIFsgMCwgYW5zdywgRElTUF9BQ1RfU0VORCBdCisKKyMgUmVnaXN0ZXIgdGhlIGNhbGxiYWNrIGZvciBkaXNwYXRjaCB0aHJlYWQ6CitoZGwgPSBkaXNwX2hkbCh0ZXN0X2FwcF9jYiwgRElTUF9IT1dfQ0MsIGRpc3Bfd2hlbihkX2FwcCwgZF9yZXEpKSAgIyBkaXNwX3doZW4oKSB0YWtlcyAwIHRvIDQgYXJndW1lbnRzIGFzIGZvbGxvdzogKGFwcD1OVUxMLCBjbWQ9TlVMTCwgYXZwPU5VTEwsIHZhbD1OVUxMKQorCisjIERvbid0IGZvcmdldCB0byByZWdpc3RlciB0aGUgYXBwbGljYXRpb24gaW4gdGhlIGRhZW1vbiBmb3IgQ0VSL0NFQSBjYXBhYmlsaXRpZXMuCitmZF9kaXNwX2FwcF9zdXBwb3J0ICggZF9hcHAsIGRfdm5kLCAxLCAwICkKKworCisjIyMgIEZvciB0aGUgZnVuLCB0aGUgY2xpZW50IHBhcnQgb2YgdGhlIHRlc3RfYXBwOgorCitkZWYgcmVjZWl2ZV9hbnN3ZXIoYW5zLCB0ZXN0dmFsKToKKyAgIHRyeToKKyAgICAgdHZhbCA9IGFucy5zZWFyY2goZF9hdnApLmhlYWRlcigpLmF2cF92YWx1ZS51MzIKKyAgIGV4Y2VwdDoKKyAgICAgcHJpbnQgIkVycm9yIGluIHJlY2VpdmVfYW5zd2VyOiBubyBUZXN0LUFWUCBpbmNsdWRlZCIKKyAgICAgdHZhbCA9IDAKKyAgIHRyeToKKyAgICAgcHJpbnQgIlB5IFJFQ1YgJXggKGV4cGVjdGVkOiAleCkgU3RhdHVzOiAlZCBGcm9tOiAnJXMnIiAlICh0dmFsLCB0ZXN0dmFsLCBhbnMuc2VhcmNoKGRfcmMpLmhlYWRlcigpLmF2cF92YWx1ZS51MzIsIGFucy5zZWFyY2goZF9vaCkuaGVhZGVyKCkuYXZwX3ZhbHVlLm9zLmFzX3N0cigpKQorICAgZXhjZXB0OgorICAgICBwcmludCAiRXJyb3IgaW4gcmVjZWl2ZV9hbnN3ZXI6IFJlc3VsdC1Db2RlIG9yIE9yaWdpbi1Ib3N0IGFyZSBtaXNzaW5nIgorICAgZGVsIGFucworICAgcmV0dXJuIE5vbmUKKworaW1wb3J0IHJhbmRvbQorCitkZWYgc2VuZF9xdWVyeShkZXN0cmVhbG09ImxvY2FsZG9tYWluIik6CisgICBxcnkgPSBtc2coZF9yZXEpCisgICBzZXNzID0gc2Vzc2lvbigpCisgICB0diA9IHJhbmRvbS5yYW5kaW50KDEsIDE8PDMyKQorICAgIyBTZXNzaW9uLUlkCisgICBhID0gYXZwKGRfc2ksIEFWUEZMX1NFVF9CTEFOS19WQUxVRSkKKyAgIGEuaGVhZGVyKCkuYXZwX3ZhbHVlLm9zID0gc2Vzcy5nZXRzaWQoKQorICAgcXJ5LmFkZF9jaGlsZChhKQorICAgIyBEZXN0aW5hdGlvbi1SZWFsbQorICAgYSA9IGF2cChkX2RyLCBBVlBGTF9TRVRfQkxBTktfVkFMVUUpCisgICBhLmhlYWRlcigpLmF2cF92YWx1ZS5vcyA9IGRlc3RyZWFsbQorICAgcXJ5LmFkZF9jaGlsZChhKQorICAgIyBPcmlnaW4tSG9zdCwgT3JpZ2luLVJlYWxtCisgICBxcnkuYWRkX29yaWdpbigpCisgICAjIFRlc3QtQVZQCisgICBhID0gYXZwKGRfYXZwLCBBVlBGTF9TRVRfQkxBTktfVkFMVUUpCisgICBhLmhlYWRlcigpLmF2cF92YWx1ZS51MzIgPSB0dgorICAgcXJ5LmFkZF9jaGlsZChhKQorICAgcHJpbnQgIlB5IFNFTkQgJXggdG8gJyVzJyIgJSAodHYsIGRlc3RyZWFsbSkKKyAgIHFyeS5zZW5kKHJlY2VpdmVfYW5zd2VyLCB0dikKKworc2VuZF9xdWVyeSgpCisKKworIyMjIyMjIyMjIyMjIyBGSUZPIHF1ZXVlcyAjIyMjIyMjIyMjIyMKKworbXlxdWV1ZSA9IGZpZm8oKQorCisjIGVucXVldWUgYW55IG9iamVjdAorbXlxdWV1ZS5wb3N0KDMpCitteXF1ZXVlLnBvc3QoImJsYWgiKQorbXlxdWV1ZS5wb3N0KCBbIDMsIDIgXSApCisKKyMgU2ltcGxlIGdldCAoYmxvY2tzIHdoZW4gdGhlIHF1ZXVlIGlzIGVtcHR5KQorbXlxdWV1ZS5nZXQoKQorCisjIFRyeSBnZXQ6IHJldHVybnMgdGhlIG5leHQgb2JqZWN0LCBvciBOb25lIGlmIHRoZSBxdWV1ZSBpcyBlbXB0eQorbXlxdWV1ZS50cnlnZXQoKQorCisjIHRpbWVkIGdldDogbGlrZSBnZXQsIGJ1dCByZXR1cm5zIE5vbmUgYWZ0ZXIgeCBzZWNvbmRzCitteXF1ZXVlLnRpbWVkZ2V0KDMpCisKKyMgU2hvdyB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBxdWV1ZQorbXlxdWV1ZS5sZW5ndGgoKQorCisKKyMjIFZhcmlhbnRzOgorIyBBbGwgdGhlIHByZXZpb3VzIGNhbGxzIGFyZSBzdWl0YWJsZSB0byBxdWV1ZSBQeXRob24gb2JqZWN0cy4KKyMgSW4gb3JkZXIgdG8gaW50ZXJhY3Qgd2l0aCBvYmplY3RzIHF1ZXVlZCAvIHBvcGVkIGJ5IEMgY291bnRlcnBhcnQsCisjIGEgc2Vjb25kIHBhcmFtZXRlciBtdXN0IGJlIHBhc3NlZCB0byBzcGVjaWZ5IHRoZSBvYmplY3QgdHlwZSwKKyMgYXMgZm9sbG93OgorZXYgPSBmZF9ldmVudCgpCitldi5jb2RlID0gRkRFVl9EVU1QX0VYVAorY3Zhci5mZF9nX2NvbmZpZy5jbmZfbWFpbl9ldi5wb3N0KGV2LCAic3RydWN0IGZkX2V2ZW50ICoiKQorCisjIFNpbWlsYXJseSwgZm9yICpnZXQsIHdlIGNhbiBzcGVjaWZ5IHRoZSBzdHJ1Y3R1cmUgdGhhdCB3YXMgcXVldWVkOgorbXlxdWV1ZS5nZXQoInN0cnVjdCBmZF9ldmVudCAqIikKK215cXVldWUudHJ5Z2V0KCJzdHJ1Y3QgZmRfZXZlbnQgKiIpCitteXF1ZXVlLnRpbWVkZ2V0KDMsICJzdHJ1Y3QgZmRfZXZlbnQgKiIpCisKK2RlbCBteXF1ZXVlCisKKworIyMjIyMjIyMjIyMjIyBIT09LUyAjIyMjIyMjIyMjIyMKKworZGVmIG15X2hvb2tfY2IodHlwZSwgbXNnLCBwZWVyLCBvdGhlciwgb2xkcG1kKToKKyAgICBwcmludCAiY2FsbGJhY2sgdHlwZSAiLCB0eXBlLCAiIGNhbGxlZDogIiwgbXNnLCBvdGhlciwgb2xkcG1kCisgICAgcmV0dXJuICJ0aGlzIGlzIHRoZSBuZXcgcG1kIgorCisjIENyZWF0ZSBhIHdyYXBwZWQgZmRfaG9va19kYXRhX2hkbDoKK2RhdGFoZGwgPSBmZF9ob29rX2RhdGFfaGRsKCkKKworIyBSZWdpc3RlciB0aGUgaG9vayBjYWxsYmFjazoKK2hkbCA9IGZkX2hvb2tfaGRsKDEgPDwgSE9PS19NRVNTQUdFX1NFTlQsIG15X2hvb2tfY2IsIGRhdGFoZGwpCisKKworCisKKyMjIyMjIyMjIyMjIyMgUEVFUlMgIyMjIyMjIyMjIyMjCisKKyMgR2V0IHRoZSBsaXN0IG9mIHBlZXJzIGRlZmluZWQgaW4gdGhlIHN5c3RlbSAKKyMgKHdlIGFyZSBzdXBwb3NlZCB0byByZWFkbG9jayBmZF9nX3BlZXJzX3J3IGJlZm9yZSBhY2Nlc3NpbmcgdGhpcyBsaXN0KQorY3Zhci5mZF9nX3BlZXJzX3J3LnJkbG9jaygpCitwZWVycyA9IGN2YXIuZmRfZ19wZWVycy5lbnVtX2FzKCJzdHJ1Y3QgcGVlcl9oZHIgKiIpCitjdmFyLmZkX2dfcGVlcnNfcncudW5sb2NrKCkKK2ZvciBwIGluIHBlZXJzOgorICAgcHJpbnQgIlBlZXI6IiwgcC5pbmZvLnBpX2RpYW1pZAorCisKKyMgQ3JlYXRlIGEgbmV3IHBlZXIKK25wID0gcGVlcl9pbmZvKCkKK25wLnBpX2RpYW1pZCA9ICJuYXMubG9jYWxkb21haW4iCitucC5jb25maWcucGljX2ZsYWdzLnBybzQgPSBQSV9QNF9UQ1AKKworCisjIEFkZCB0aGlzIHBlZXIgaW50byB0aGUgZnJhbWV3b3JrLgorbnAuYWRkKCkKKworIyBJdCBpcyBwb3NzaWJsZSB0byBzcGVjaWZ5IGEgY2FsbGJhY2sgZm9yIHdoZW4gdGhlIGNvbm5lY3Rpb24gY29tcGxldGVzIG9yIGZhaWxzIHdpdGggdGhpcyBwZWVyLgorIyBUaGUgcHJvdG90eXBlIGlzIGFzIGZvbGxvdzoKK2RlZiBhZGRfY2IocGVlcik6CisgICAgaWYgcGVlcjoKKyAgICAgICAgaWYgcGVlci5ydW50aW1lLnBpcl9zdGF0ZSA9PSBTVEFURV9PUEVOOgorCSAgIHByaW50ICJDb25uZWN0aW9uIHRvIHBlZXIgJyVzJyBjb21wbGV0ZWQiICUgKHBlZXIucGlfZGlhbWlkKQorCSAgICMgY2FuIGZpbmQgbW9yZSBpbmZvcm1hdGlvbiBpbiBwZWVyLnJ1bnRpbWUuKgorCWVsc2U6CisJICAgcHJpbnQgIkNvbm5lY3Rpb24gdG8gcGVlciAnJXMnIGZhaWxlZCAoc3RhdGU6JWQpIiAlIChwZWVyLnBpX2RpYW1pZCwgcGVlci5ydW50aW1lLnBpcl9zdGF0ZSkKKyAgICBlbHNlOgorICAgICAgICBwcmludCAiVGhlIHBlZXIgaGFzIGJlZW4gZGVzdHJveWVkIGJlZm9yZSBpdCBjb21wbGV0ZWQgdGhlIGNvbm5lY3Rpb24uIgorCisjIFRoZW4gYWRkIHRoZSBwZWVyIGxpa2UgdGhpczoKK25wLmFkZChhZGRfY2IpCisKKworIyBTZWFyY2ggYSBwZWVyIGJ5IGl0cyBkaWFtZXRlciBpZCAocmV0dXJucyBhIHBlZXJfaGRyIG9iamVjdCBpZiBmb3VuZCkgLS0gc2ltaWxhciB0byBmZF9wZWVyX2dldGJ5aWQKK3AgPSBwZWVyX3NlYXJjaCgibmFzLmRvbWFpbi5hYWEiKQorCisKKyMjIFZhbGlkYXRpb24gY2FsbGJhY2sgKHNlZSBmZF9wZWVyX3ZhbGlkYXRlX3JlZ2lzdGVyIGRvY3VtZW50YXRpb24pCisKKyMgY2IyIHByb3RvdHlwZToKK2RlZiBteV92YWxpZGF0ZV9jYjIocGluZm8pOgorICAgIHByaW50ICJDYjIgY2FsbGJhY2sgdHJpZ2dlZCBmb3IgcGVlciAlcyIgJSAocGluZm8ucGlfZGlhbWlkKQorICAgICMgVXN1YWxseSwgdGhpcyB3b3VsZCBiZSB1c2VkIG9ubHkgdG8gY2hlY2sgc29tZSBUTFMgcHJvcGVydGllcywgCisgICAgIyB3aGljaCBpcyBub3QgcmVhbGx5IHBvc3NpYmxlIHlldCB0aHJvdWdoIHRoZSBweXRob24gaW50ZXJwcmV0ZXIuLi4KKyAgICByZXR1cm4gMCAgICMgcmV0dXJuIGFuIGVycm9yIGNvZGUgaWYgdGhlIHBlZXIgaXMgbm90IHZhbGlkYXRlZAorCisjIGNiIHByb3RvdHlwZToKK2RlZiBteV92YWxpZGF0ZV9jYihwaW5mbyk6CisgICAgcHJpbnQgIlZhbGlkYXRlIGNhbGxiYWNrIHRyaWdnZWQgZm9yIHBlZXIgJXMiICUgKHBpbmZvLnBpX2RpYW1pZCkKKyAgICAjIElmIHRoZSBwZWVyIGlzIG5vdCBhbGxvd2VkIHRvIGNvbm5lY3Q6CisgICAgI3JldHVybiAtMQorICAgICMgSWYgdGhlIHBlZXIgaXMgYXV0aG9yaXplZDoKKyAgICAjcmV0dXJuIDEKKyAgICAjIEluIGFkZGl0aW9uLCBpZiBJUHNlYyBpcyBhbGxvd2VkLAorICAgICNwaW5mby5jb25maWcucGljX2ZsYWdzLnNlYyA9IFBJX1NFQ19OT05FCisgICAgIyBJZiBubyBkZWNpc2lvbiBoYXMgYmVlbiBtYWRlOgorICAgICNyZXR1cm4gMAorICAgICMgSWYgdGhlIHBlZXIgaXMgdGVtcG9yYXJpbHkgYXV0aG9yaXplZCBidXQgYSBzZWNvbmQgY2FsbGJhY2sgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgVExTIG5lZ29jaWF0aW9uOgorICAgIHJldHVybiBteV92YWxpZGF0ZV9jYjIKKworIyBSZWdpc3RlciB0aGUgY2FsbGJhY2ssIGl0IHdpbGwgYmUgY2FsbGVkIG9uIG5ldyBpbmNvbWluZyBjb25uZWN0aW9ucy4KK3BlZXJfdmFsaWRhdGVfcmVnaXN0ZXIobXlfdmFsaWRhdGVfY2IpCisKKworCisjIyMjIyMjIyMjIyMjIEVORFBPSU5UUyAjIyMjIyMjIyMjIyMKKworZXAgPSBmZF9lbmRwb2ludCgiMTI5LjE2OC4xNjguMTkyIikKKworIyB3aXRoIHBvcnQ6CitlcCA9IGZkX2VuZHBvaW50KCIxMjkuMTY4LjE2OC4xOTIiLCAzODY4KQorCisjIFdpdGggZGlmZmVyZW50IGZsYWdzOgorZXAgPSBmZF9lbmRwb2ludCgiMTI5LjE2OC4xNjguMTkyIiwgMzg2OCwgRVBfRkxfUFJJTUFSWSkKKworIyBBZGQgSVAgaW5mb3JtYXRpb24gZm9yIHRoZSBwZWVyCitucCA9IHBlZXJfaW5mbygpCitlcC5hZGRfbWVyZ2UobnAucGlfZW5kcG9pbnRzKQorZmRfZXBfZHVtcCgwLCBucC5waV9lbmRwb2ludHMpCisKKworCisjIyMjIyMjIyMjIyMjIFBPU0lYIGZ1bmN0aW9ucyB3cmFwcGVycyAjIyMjIyMjIyMjIyMKKworIyBUaGUgaW50ZXJmYWNlIGFsc28gcHJvdmlkZXMgd3JhcHBlcnMgYXJvdW5kIGJhc2UgUE9TSVggCisjIHN5bmNocm9uaXphdGlvbiBmdW5jdGlvbnM6CisKK20gPSBwdGhyZWFkX211dGV4X3QoKQorbS5sb2NrKCkKK20udW5sb2NrKCkKKworYyA9IHB0aHJlYWRfY29uZF90KCkKK2Muc2lnbmFsKCkKK2MuYnJvYWRjYXN0KCkKK2Mud2FpdChtKQorYy50aW1lZHdhaXQobSwgNSkgICMgaXQgdGFrZXMgYSByZWxhdGl2ZSB0aW1lCisKK3IgPSBwdGhyZWFkX3J3bG9ja190KCkKK3IucmRsb2NrKCkKK3IudW5sb2NrKCkKK3Iud3Jsb2NrKCkKZGlmZiAtLWdpdCBhL2RvYy9kaWN0X2xlZ2FjeV94bWwuY29uZi5zYW1wbGUgYi9kb2MvZGljdF9sZWdhY3lfeG1sLmNvbmYuc2FtcGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlYWUyNTcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZGljdF9sZWdhY3lfeG1sLmNvbmYuc2FtcGxlCkBAIC0wLDAgKzEsMTUgQEAKKyMgVGhpcyBmaWxlIGRvY3VtZW50cyB0aGUgY29uZmlndXJhdGlvbiBmb3JtYXQgZm9yIHRoZSBkaWN0X2xlZ2FjeV94bWwuZmR4IGZyZWVEaWFtZXRlciBleHRlbnNpb24uCisjIEluIG9yZGVyIHRvIGxvYWQgdGhpcyBleHRlbnNpb24sIHBsZWFzZSByZWZlciB0byBtYWluIGZyZWVEaWFtZXRlci5jb25mIG1hbnVhbC4KKworIyBUaGlzIGV4dGVuc2lvbiBhbGxvd3MgdGhlIHVzZSBvZiBEaWFtZXRlciBkaWN0aW9uYXJ5IGZpbGVzIGluIFhNTCBmb3JtYXQsCisjIGFzIHJvdWdobHkgc3BlY2lmaWVkIGluIGRyYWZ0LWZyYXNjb25lLXhtbC1kaWN0aW9uYXJ5LTAwLgorIyAodGhlIGFjdHVhbCBmb3JtYXQgaXMgdGhlIG9uZSBmcm9tIE9wZW5EaWFtZXRlciBsYXRlc3QgdmVyc2lvbikKKyMgTm90ZSB0aGF0IHRoaXMgZm9ybWF0LCBhbHRob3VnaCBtb3JlIHdpZGVseSB1c2VkLCBpcyBsZXNzIGVmZmljaWVudCB0aGFuIHRoZQorIyBpbnRlcm5hbCBmcmVlRGlhbWV0ZXIgZm9ybWF0LiBJdCBpcyByZWNvbW1lbmRlZCB3aGVuIHBvc3NpYmxlIHRvIHVzZSB0aGUgbGF0ZXIuCisKKyMgWW91IG1heSByZWZlciB0byB0aGUgY29udHJpYi9kaWN0X2xlZ2FjeS9SRUFETUUgZmlsZSBmb3IgaW5mb3JtYXRpb24gb24gd2hlcmUgdG8gZmluZCBzdWNoIHJlc291cmNlcy4KKworIyBUaGlzIGZpbGUgc2ltcGx5IGNvbnNpc3RzIGluIGEgbGlzdCBvZiBYTUwgZGljdGlvbmFyeSBmaWxlcyB0aGF0IG11c3QgYmUgcGFyc2VkLgorIyBFeGFtcGxlOgorIyAgIi9ldGMvZnJlZURpYW1ldGVyL2RpY3Rpb25hcnkueG1sIjsKKwpkaWZmIC0tZ2l0IGEvZG9jL2VhcF90bHNfcGx1Z2luLmRpYW1lYXAuY29uZi5zYW1wbGUgYi9kb2MvZWFwX3Rsc19wbHVnaW4uZGlhbWVhcC5jb25mLnNhbXBsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTY5OGJlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VhcF90bHNfcGx1Z2luLmRpYW1lYXAuY29uZi5zYW1wbGUKQEAgLTAsMCArMSwxMyBAQAorIyMjIyBhIHNhbXBsZSBjb25maWd1cmF0aW9uIGZpbGUgZm9yIEVBUC1UTFMKKworI0NlcnRpZmljYXRlIGFuZCBQcml2YXRlIGtleSBmaWxlcworI0NyZWQgPSAiPFBhdGggdG8gY2VydGlmaWNhdGU+IiA6ICI8UGF0aCB0byBwcml2YXRlIEtleT4iOworCisjQ0EgZmlsZQorI0NBID0gIjxQYXRoIHRvIENBIGZpbGU+IjsKKworI0NSTCBmaWxlCisjQ1JMID0gIjxQYXRoIHRvIENSTCBmaWxlPiI7CisKKyNFbmFibGUvZGlzYWJsZSBjaGVja2luZyBjZXJ0aWZpY2F0ZSdzIENOCitjaGVja19jZXJ0X2NuX3VzZXJuYW1lID0gMTsKZGlmZiAtLWdpdCBhL2RvYy9lY2hvZHJvcC5yZ3d4LmNvbmYuc2FtcGxlIGIvZG9jL2VjaG9kcm9wLnJnd3guY29uZi5zYW1wbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ2ODE0NQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9lY2hvZHJvcC5yZ3d4LmNvbmYuc2FtcGxlCkBAIC0wLDAgKzEsMzMgQEAKKyMgU2FtcGxlIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgdGhlIGVjaG9kcm9wLnJnd3ggcGx1Z2luIG9mIFJBRElVUy9EaWFtZXRlciB0cmFuc2xhdGlvbiBhZ2VudC4KKyMKKyMgVGhpcyBwbHVnaW4gYWxsb3dzIHRvIGVhc2lseSBzcGVjaWZ5IHRoZSBmb2xsb3dpbmcgaGFuZGxpbmcgb2YgUkFESVVTIGF0dHJpYnV0ZXMKKyMgcmVjZWl2ZWQgaW4gYSBSQURJVVMgcmVxdWVzdDoKKyMgIC0gRUNITzogdGhlIGF0dHJpYnV0ZSB3aWxsIGJlIGNvcGllZCB2ZXJiYXRpbSBpbiB0aGUgUkFESVVTIGFuc3dlci4KKyMgIC0gRFJPUDogdGhlIGF0dHJpYnV0ZSBpcyBkaXNjYXJkZWQuCisjCisjIEluIGJvdGggY2FzZXMsIHRoZSBhdHRyaWJ1dGUgaXMgTk9UIHRyYW5zbGF0ZWQgaW4gRGlhbWV0ZXIgbWVzc2FnZS4KKyMKKyMgVGhlIGZvcm1hdCBvZiB0aGlzIGZpbGUgaXM6CisjIDxhY3Rpb24+IENPREUgPGNvZGU+IFsgVkVORE9SIDx2aWQ+IFsgVExWIDx0eXBlPiB8IEVYVCA8ZXh0LXR5cGU+IF0gXTsKKyMgV2hlcmU6CisjICAgIDxhY3Rpb24+OiBpcyBlaXRoZXIgRFJPUCBvciBFQ0hPLgorIyAgICA8Y29kZT4gIDogaXMgYSAoZGVjaW1hbCkgaW50ZWdlciBiZXR3ZWVuIDAgYW5kIDI1NSwgYW5kIGRlc2lnbmF0ZXMgdGhlIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZS4KKyMKKyMgIFRoZSByZW1haW5pbmcgb2YgdGhlIGxpbmUgaXMgb3B0aW9uYWwsIGFuZCBzaG91bGQgb25seSBiZSB1c2VkIAorIyAgd2l0aCBsaW5lcyBjb250YWluaW5nICJDT0RFIDI2IiAoVmVuZG9yLVNwZWNpZmljIEF0dHJpYnV0ZSkKKyMgICAgPHZpZD4gOiBhIFZlbmRvciB2YWx1ZSAoMzIgYml0KSwgc2VlIFJGQzI4NjUgc2VjdGlvbiA1LjI2IGZvciBkZXRhaWwuCisjCisjICA8dHlwZT4gICAgOiBUaGUgYXR0cmlidXRlIGlzIGludGVycHJldGVkIGFzIFRMViAocmZjMzg2NSwgc2VjdGlvbiA1LjI2KSAKKyMJCWFuZCB3ZSBtYXRjaCBvbmx5IHRoaXMgInZlbmRvciB0eXBlIiB2YWx1ZSAoOCBiaXRzKS4KKyMKKyMgIDxleHQtdHlwZT46IE5PVEU6IFRISVMgT1BUSU9OIElTIE5PVCBTVVBQT1JURUQgUFJPUEVSTFkgWUVUISEhIQorIwkgICAgICAgVGhlIGF0dHJpYnV0ZSBpcyBpbnRlcnByZXRlZCBhcyBleHRlbmRlZCBhdHRyaWJ1dGUgKGRyYWZ0LWlldGYtcmFkZXh0LWV4dGVuZGVkLWF0dHJpYnV0ZXMtMDgpCisjICAgICAgICAgICAgICAgYW5kIHdlIG1hdGNoIG9ubHkgdGhpcyAiRXh0LVR5cGUiIHZhbHVlICgxNiBiaXRzKS4KKyMgICAgICAgICAgICAgIFRoaXMgb3B0aW9uIHNob3VsZCBvbmx5IGJlIHVzZWQgd2l0aCAiQ09ERSAyNiBWRU5ET1IgMCIuCisjCQkKKyMgTm90ZSB0aGF0IHRoZSBQcm94eS1TdGF0ZSAoY29kZSAzMykgYXR0cmlidXRlIGlzIGhhbmRsZWQgZGlyZWN0bHkgYXMgYW4gRUNITyBwYXJhbWV0ZXIgYnkgdGhlIGdhdGV3YXkgY29yZS4KKworIyBFeGFtcGxlczoKKyMgRFJPUCBjb2RlIDE4IDsgIyBSZXBseS1NZXNzYWdlIGF0dHJpYnV0ZSwgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBpbiByZXF1ZXN0cworIyBEUk9QIGNvZGUgMjYgdmVuZG9yIDkgOyAjIERyb3AgYW55IENpc2NvLXNwZWNpZmljIGF0dHJpYnV0ZQorIyBFQ0hPIGNvZGUgMjYgdmVuZG9yIDAgZXh0IDI1NiA7ICMgRWNobyBhbnkgZXh0ZW5kZWQgYXR0cmlidXRlIHdpdGggdGhlIHR5cGUgMjU2LgpkaWZmIC0tZ2l0IGEvZG9jL2ZyZWVkaWFtZXRlci5jb25mLnNhbXBsZSBiL2RvYy9mcmVlZGlhbWV0ZXIuY29uZi5zYW1wbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIyYmE5ZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9mcmVlZGlhbWV0ZXIuY29uZi5zYW1wbGUKQEAgLTAsMCArMSwyNTIgQEAKKyMgVGhpcyBpcyBhIHNhbXBsZSBjb25maWd1cmF0aW9uIGZpbGUgZm9yIGZyZWVEaWFtZXRlciBkYWVtb24uCisKKyMgTW9zdCBvZiB0aGUgb3B0aW9ucyBjYW4gYmUgb21pdHRlZCwgYXMgdGhleSBkZWZhdWx0IHRvIHJlYXNvbmFibGUgdmFsdWVzLgorIyBPbmx5IFRMUy1yZWxhdGVkIG9wdGlvbnMgbXVzdCBiZSBjb25maWd1cmVkIHByb3Blcmx5IGluIHVzdWFsIHNldHVwcy4KKworIyBJdCBpcyBwb3NzaWJsZSB0byB1c2UgImluY2x1ZGUiIGtleXdvcmQgdG8gaW1wb3J0IGFkZGl0aW9uYWwgZmlsZXMKKyMgZS5nLjogaW5jbHVkZSAiL2V0Yy9mcmVlRGlhbWV0ZXIuZC8qLmNvbmYiCisjIFRoaXMgaXMgZXhhY3RseSBlcXVpdmFsZW50IGFzIGNvcHkgJiBwYXN0ZSB0aGUgY29udGVudCBvZiB0aGUgaW5jbHVkZWQgZmlsZShzKSAKKyMgd2hlcmUgdGhlICJpbmNsdWRlIiBrZXl3b3JkIGlzIGZvdW5kLgorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyAgUGVlciBpZGVudGl0eSBhbmQgcmVhbG0gCisKKyMgVGhlIERpYW1ldGVyIElkZW50aXR5IG9mIHRoaXMgZGFlbW9uLgorIyBUaGlzIG11c3QgYmUgYSB2YWxpZCBGUUROIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGxvY2FsIGhvc3QuCisjIERlZmF1bHQ6IGhvc3RuYW1lJ3MgRlFETgorI0lkZW50aXR5ID0gImFhYS5rb2dhbmVpLmZyZWVkaWFtZXRlci5uZXQiOworCisjIFRoZSBEaWFtZXRlciBSZWFsbSBvZiB0aGlzIGRhZW1vbi4KKyMgRGVmYXVsdDogdGhlIGRvbWFpbiBwYXJ0IG9mIElkZW50aXR5IChhZnRlciB0aGUgZmlyc3QgZG90KS4KKyNSZWFsbSA9ICJrb2dhbmVpLmZyZWVkaWFtZXRlci5uZXQiOworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMgIFRyYW5zcG9ydCBwcm90b2NvbCBjb25maWd1cmF0aW9uCisKKyMgVGhlIHBvcnQgdGhpcyBwZWVyIGlzIGxpc3RlbmluZyBvbiBmb3IgaW5jb21pbmcgY29ubmVjdGlvbnMgKFRDUCBhbmQgU0NUUCkuCisjIERlZmF1bHQ6IDM4NjguIFVzZSAwIHRvIGRpc2FibGUuCisjUG9ydCA9IDM4Njg7CisKKyMgVGhlIHBvcnQgdGhpcyBwZWVyIGlzIGxpc3RlbmluZyBvbiBmb3IgaW5jb21pbmcgVExTLXByb3RlY3RlZCBjb25uZWN0aW9ucyAoVENQIGFuZCBTQ1RQKS4KKyMgU2VlIFRMU19vbGRfbWV0aG9kIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IFRMUyBmbGF2b3Vycy4KKyMgTm90ZTogd2UgdXNlIFRMUy9TQ1RQIGluc3RlYWQgb2YgRFRMUy9TQ1RQIGF0IHRoZSBtb21lbnQuIFRoaXMgd2lsbCBjaGFuZ2UgaW4gZnV0dXJlIHZlcnNpb24gb2YgZnJlZURpYW1ldGVyLgorIyBEZWZhdWx0OiA1ODY4LiBVc2UgMCB0byBkaXNhYmxlLgorI1NlY1BvcnQgPSA1ODY4OworCisjIFVzZSBSRkMzNTg4IG1ldGhvZCBmb3IgVExTIHByb3RlY3Rpb24sIHdoZXJlIFRMUyBpcyBuZWdvY2lhdGVkIGFmdGVyIENFUi9DRUEgZXhjaGFuZ2UgaXMgY29tcGxldGVkIAorIyBvbiB0aGUgdW5zZWN1cmUgY29ubmVjdGlvbi4gVGhlIGFsdGVybmF0aXZlIGlzIFJGQzY3MzMgbWVjaGFuaXNtLCB3aGVyZSBUTFMgcHJvdGVjdHMgYWxzbyB0aGUgCisjIENFUi9DRUEgZXhjaGFuZ2Ugb24gYSBkZWRpY2F0ZWQgc2VjdXJlIHBvcnQuCisjIFRoaXMgcGFyYW1ldGVyIG9ubHkgYWZmZWN0cyBvdXRnb2luZyBjb25uZWN0aW9ucy4gCisjIFRoZSBzZXR0aW5nIGNhbiBiZSBhbHNvIGRlZmluZWQgcGVyLXBlZXIgKHNlZSBQZWVycyBjb25maWd1cmF0aW9uIHNlY3Rpb24pLgorIyBEZWZhdWx0OiB1c2UgUkZDNjczMyBtZXRob2Qgd2l0aCBzZXBhcmF0ZSBwb3J0IGZvciBUTFMuCisjVExTX29sZF9tZXRob2Q7CisKKyMgRGlzYWJsZSB1c2Ugb2YgVENQIHByb3RvY29sIChvbmx5IGxpc3RlbiBhbmQgY29ubmVjdCBvdmVyIFNDVFApCisjIERlZmF1bHQgOiBUQ1AgZW5hYmxlZAorI05vX1RDUDsKKworIyBEaXNhYmxlIHVzZSBvZiBTQ1RQIHByb3RvY29sIChvbmx5IGxpc3RlbiBhbmQgY29ubmVjdCBvdmVyIFRDUCkKKyMgRGVmYXVsdCA6IFNDVFAgZW5hYmxlZAorI05vX1NDVFA7CisjIFRoaXMgb3B0aW9uIGlzIGlnbm9yZWQgaWYgZnJlZURpYW1ldGVyIGlzIGNvbXBpbGVkIHdpdGggRElTQUJMRV9TQ1RQIG9wdGlvbi4KKworIyBQcmVmZXIgVENQIGluc3RlYWQgb2YgU0NUUCBmb3IgZXN0YWJsaXNoaW5nIG5ldyBjb25uZWN0aW9ucy4KKyMgVGhpcyBzZXR0aW5nIG1heSBiZSBvdmVyd3JpdHRlbiBwZXIgcGVlciBpbiBwZWVyIGNvbmZpZ3VyYXRpb24gYmxvY3MuCisjIERlZmF1bHQgOiBTQ1RQIGlzIGF0dGVtcHRlZCBmaXJzdC4KKyNQcmVmZXJfVENQOworCisjIERlZmF1bHQgbnVtYmVyIG9mIHN0cmVhbXMgcGVyIFNDVFAgYXNzb2NpYXRpb25zLgorIyBUaGlzIHNldHRpbmcgbWF5IGJlIG92ZXJ3cml0dGVuIHBlciBwZWVyIGJhc2lzLgorIyBEZWZhdWx0IDogMzAgc3RyZWFtcworI1NDVFBfc3RyZWFtcyA9IDMwOworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMgIEVuZHBvaW50IGNvbmZpZ3VyYXRpb24KKworIyBEaXNhYmxlIHVzZSBvZiBJUCBhZGRyZXNzZXMgKG9ubHkgSVB2NikKKyMgRGVmYXVsdCA6IElQIGVuYWJsZWQKKyNOb19JUDsKKworIyBEaXNhYmxlIHVzZSBvZiBJUHY2IGFkZHJlc3NlcyAob25seSBJUCkKKyMgRGVmYXVsdCA6IElQdjYgZW5hYmxlZAorI05vX0lQdjY7CisKKyMgU3BlY2lmeSBsb2NhbCBhZGRyZXNzZXMgdGhlIHNlcnZlciBtdXN0IGJpbmQgdG8KKyMgRGVmYXVsdCA6IGxpc3RlbiBvbiBhbGwgYWRkcmVzc2VzIGF2YWlsYWJsZS4KKyNMaXN0ZW5PbiA9ICIyMDIuMjQ5LjM3LjUiOworI0xpc3Rlbk9uID0gIjIwMDE6MjAwOjkwMzoyOjoyMDI6MSI7CisjTGlzdGVuT24gPSAiZmU4MDo6MjFjOjVmZjpmZTk4OjdkNjIlZXRoMCI7CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjICBTZXJ2ZXIgY29uZmlndXJhdGlvbgorCisjIEhvdyBtYW55IERpYW1ldGVyIHBlZXJzIGFyZSBhbGxvd2VkIHRvIGJlIGNvbm5lY3RpbmcgYXQgdGhlIHNhbWUgdGltZSA/CisjIFRoaXMgcGFyYW1ldGVyIGxpbWl0cyB0aGUgbnVtYmVyIG9mIGluY29taW5nIGNvbm5lY3Rpb25zIGZyb20gdGhlIHRpbWUKKyMgdGhlIGNvbm5lY3Rpb24gaXMgYWNjZXB0ZWQgdW50aWwgdGhlIGZpcnN0IENFUiBpcyByZWNlaXZlZC4KKyMgRGVmYXVsdDogNSB1bmlkZW50aWZpZWQgY2xpZW50cyBpbiBwYXJhbGVsLgorI1RocmVhZHNQZXJTZXJ2ZXIgPSA1OworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMgIFRMUyBDb25maWd1cmF0aW9uCisKKyMgVExTIGlzIG1hbmFnZWQgYnkgdGhlIEdOVVRMUyBsaWJyYXJ5IGluIHRoZSBmcmVlRGlhbWV0ZXIgZGFlbW9uLgorIyBZb3UgbWF5IGZpbmQgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBwYXJhbWV0ZXJzIGFuZCBzcGVjaWFsIGJlaGF2aW9ycworIyBpbiB0aGUgcmVsZXZhbnQgZG9jdW1lbnRhdGlvbi4KKyMgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2dudXRscy9tYW51YWwvCisKKyMgQ3JlZGVudGlhbHMgb2YgdGhlIGxvY2FsIHBlZXIKKyMgVGhlIFg1MDkgY2VydGlmaWNhdGUgYW5kIHByaXZhdGUga2V5IGZpbGUgdG8gdXNlIGZvciB0aGUgbG9jYWwgcGVlci4KKyMgVGhlIGZpbGVzIG11c3QgY29udGFpbiBQS0NTLTEgZW5jb2RlZCBSU0Ega2V5LCBpbiBQRU0gZm9ybWF0LgorIyAoVGhlc2UgcGFyYW1ldGVycyBhcmUgcGFzc2VkIHRvIGdudXRsc19jZXJ0aWZpY2F0ZV9zZXRfeDUwOV9rZXlfZmlsZSBmdW5jdGlvbikKKyMgRGVmYXVsdCA6IE5PIERFRkFVTFQKKyNUTFNfQ3JlZCA9ICI8eDUwOSBjZXJ0aWYgZmlsZS5QRU0+IiAsICI8eDUwOSBwcml2YXRlIGtleSBmaWxlLlBFTT4iOworVExTX0NyZWQgPSAiL2V0Yy9zc2wvY2VydHMvZnJlZURpYW1ldGVyLnBlbSIsICIvZXRjL3NzbC9wcml2YXRlL2ZyZWVEaWFtZXRlci5rZXkiOworCisjIENlcnRpZmljYXRlIGF1dGhvcml0eSAvIHRydXN0IGFuY2hvcnMKKyMgVGhlIGZpbGUgY29udGFpbmluZyB0aGUgbGlzdCBvZiB0cnVzdGVkIENlcnRpZmljYXRlIEF1dGhvcml0aWVzIChQRU0gbGlzdCkKKyMgKFRoaXMgcGFyYW1ldGVyIGlzIHBhc3NlZCB0byBnbnV0bHNfY2VydGlmaWNhdGVfc2V0X3g1MDlfdHJ1c3RfZmlsZSBmdW5jdGlvbikKKyMgVGhlIGRpcmVjdGl2ZSBjYW4gYXBwZWFyIHNldmVyYWwgdGltZXMgdG8gc3BlY2lmeSBzZXZlcmFsIGZpbGVzLgorIyBEZWZhdWx0IDogR05VVExTIGRlZmF1bHQgYmVoYXZpb3IKKyNUTFNfQ0EgPSAiPGZpbGUuUEVNPiI7CisKKyMgQ2VydGlmaWNhdGUgUmV2b2NhdGlvbiBMaXN0IGZpbGUKKyMgVGhlIGluZm9ybWF0aW9uIGFib3V0IHJldm9rZWQgY2VydGlmaWNhdGVzLgorIyBUaGUgZmlsZSBjb250YWlucyBhIGxpc3Qgb2YgdHJ1c3RlZCBDUkxzIGluIFBFTSBmb3JtYXQuIFRoZXkgc2hvdWxkIGhhdmUgYmVlbiB2ZXJpZmllZCBiZWZvcmUuIAorIyAoVGhpcyBwYXJhbWV0ZXIgaXMgcGFzc2VkIHRvIGdudXRsc19jZXJ0aWZpY2F0ZV9zZXRfeDUwOV9jcmxfZmlsZSBmdW5jdGlvbikKKyMgTm90ZTogb3BlbnNzbCBDUkwgZm9ybWF0IG1pZ2h0IGhhdmUgaW50ZXJvcGVyYWJpbGl0eSBpc3N1ZSB3aXRoIEdOVVRMUyBmb3JtYXQuCisjIERlZmF1bHQgOiBHTlVUTFMgZGVmYXVsdCBiZWhhdmlvcgorI1RMU19DUkwgPSAiPGZpbGUuUEVNPiI7CisKKyMgR05VIFRMUyBQcmlvcml0eSBzdHJpbmcKKyMgVGhpcyBzdHJpbmcgYWxsb3dzIHRvIGNvbmZpZ3VyZSB0aGUgYmVoYXZpb3Igb2YgR05VVExTIGtleSBleGNoYW5nZXMgCisjIGFsZ29yaXRobXMuIFNlZSBnbnV0bHNfcHJpb3JpdHlfaW5pdCBmdW5jdGlvbiBkb2N1bWVudGF0aW9uIGZvciBpbmZvcm1hdGlvbi4KKyMgWW91IHNob3VsZCBhbHNvIHJlZmVyIHRvIHRoZSBEaWFtZXRlciByZXF1aXJlZCBUTFMgc3VwcG9ydCBoZXJlOgorIyAgIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzY3MzMjc2VjdGlvbi0xMy4xCisjIERlZmF1bHQgOiAiTk9STUFMIgorIyBFeGFtcGxlOiBUTFNfUHJpbyA9ICJOT05FOitWRVJTLVRMUzEuMTorQUVTLTEyOC1DQkM6K1JTQTorU0hBMTorQ09NUC1OVUxMIjsKKyNUTFNfUHJpbyA9ICJOT1JNQUwiOworCisjIERpZmZpZS1IZWxsbWFuIHBhcmFtZXRlcnMgc2l6ZQorIyBTZXQgdGhlIG51bWJlciBvZiBiaXRzIGZvciBnZW5lcmF0ZWQgREggcGFyYW1ldGVycworIyBWYWxpZCB2YWx1ZSBzaG91bGQgYmUgNzY4LCAxMDI0LCAyMDQ4LCAzMDcyIG9yIDQwOTYuCisjIChUaGlzIHBhcmFtZXRlciBpcyBwYXNzZWQgdG8gZ251dGxzX2RoX3BhcmFtc19nZW5lcmF0ZTIgZnVuY3Rpb24sIAorIyBpdCB1c3VhbGx5IHNob3VsZCBtYXRjaCBSU0Ega2V5IHNpemUpCisjIERlZmF1bHQgOiAxMDI0CisjVExTX0RIX0JpdHMgPSAxMDI0OworCisjIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gc3BlY2lmeSBhIGZpbGUgdG8gbG9hZCB0aGUgUEtDUyMzIGVuY29kZWQKKyMgREggcGFyYW1ldGVycyBkaXJlY3RseSBmcm9tLiBUaGlzIGFjY2VsZXJhdGVzIHRoZSBkYWVtb24gc3RhcnQgCisjIGJ1dCBpcyBzbGlnaHRseSBsZXNzIHNlY3VyZS4gSWYgdGhpcyBmaWxlIGlzIHByb3ZpZGVkLCB0aGUKKyMgVExTX0RIX0JpdHMgcGFyYW1ldGVycyBoYXMgbm8gZWZmZWN0LgorIyBEZWZhdWx0IDogbm8gZGVmYXVsdC4KKyNUTFNfREhfRmlsZSA9ICI8ZmlsZS5QRU0+IjsKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMgIFRpbWVycyBjb25maWd1cmF0aW9uCisKKyMgVGhlIFRjIHRpbWVyIG9mIHRoaXMgcGVlci4KKyMgSXQgaXMgdGhlIGRlbGF5IGJlZm9yZSBhIG5ldyBhdHRlbXB0IGlzIG1hZGUgdG8gcmVjb25uZWN0IGEgZGlzY29ubmVjdGVkIHBlZXIuCisjIFRoZSB2YWx1ZSBpcyBleHByZXNzZWQgaW4gc2Vjb25kcy4gVGhlIHJlY29tbWVuZGVkIHZhbHVlIGlzIDMwIHNlY29uZHMuCisjIERlZmF1bHQ6IDMwCisjVGNUaW1lciA9IDMwOworCisjIFRoZSBUdyB0aW1lciBvZiB0aGlzIHBlZXIuCisjIEl0IGlzIHRoZSBkZWxheSBiZWZvcmUgYSB3YXRjaGRvZyBtZXNzYWdlIGlzIHNlbnQsIGFzIGRlc2NyaWJlZCBpbiBSRkMgMzUzOS4KKyMgVGhlIHZhbHVlIGlzIGV4cHJlc3NlZCBpbiBzZWNvbmRzLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAzMCBzZWNvbmRzLiBWYWx1ZSBtdXN0CisjIGJlIGdyZWF0ZXIgb3IgZXF1YWwgdG8gNiBzZWNvbmRzLiBTZWUgZGV0YWlscyBpbiB0aGUgUkZDLgorIyBEZWZhdWx0OiAzMAorI1R3VGltZXIgPSAzMDsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjICBBcHBsaWNhdGlvbnMgY29uZmlndXJhdGlvbgorCisjIERpc2FibGUgdGhlIHJlbGF5aW5nIG9mIERpYW1ldGVyIG1lc3NhZ2VzPworIyBGb3IgbWVzc2FnZXMgbm90IGhhbmRsZWQgbG9jYWxseSwgdGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gZm9yd2FyZCB0aGUKKyMgbWVzc2FnZSB0byBhbm90aGVyIHBlZXIgaWYgYW55IGlzIGF2YWlsYWJsZSwgYWNjb3JkaW5nIHRvIHRoZSByb3V0aW5nIAorIyBhbGdvcml0aG1zLiBJbiBhZGRpdGlvbiB0aGUgIjB4ZmZmZmZmIiBhcHBsaWNhdGlvbiBpcyBhZHZlcnRpc2VkIGluIENFUi9DRUEgCisjIGV4Y2hhbmdlcy4KKyMgRGVmYXVsdDogUmVsYXlpbmcgaXMgZW5hYmxlZC4KKyNOb1JlbGF5OworCisjIE51bWJlciBvZiBzZXJ2ZXIgdGhyZWFkcyB0aGF0IGNhbiBoYW5kbGUgaW5jb21pbmcgbWVzc2FnZXMgYXQgdGhlIHNhbWUgdGltZS4KKyMgRGVmYXVsdDogNAorI0FwcFNlcnZUaHJlYWRzID0gNDsKKworIyBPdGhlciBhcHBsaWNhdGlvbnMgYXJlIGNvbmZpZ3VyZWQgYnkgbG9hZGVkIGV4dGVuc2lvbnMuCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyAgRXh0ZW5zaW9ucyBjb25maWd1cmF0aW9uCisKKyMgIFRoZSBmcmVlRGlhbWV0ZXIgZnJhbWV3b3JrIG1lcmVseSBwcm92aWRlcyBzdXBwb3J0IGZvcgorIyBEaWFtZXRlciBCYXNlIFByb3RvY29sLiBUaGUgc3BlY2lmaWMgYXBwbGljYXRpb24gYmVoYXZpb3JzLAorIyBhcyB3ZWxsIGFzIGFkdmFuY2VkIGZ1bmN0aW9ucywgYXJlIHByb3ZpZGVkCisjIGJ5IGxvYWRhYmxlIGV4dGVuc2lvbnMgKHBsdWctaW5zKS4KKyMgIFRoZXNlIGV4dGVuc2lvbnMgbWF5IGluIGFkZGl0aW9uIHJlY2VpdmUgdGhlIG5hbWUgb2YgYSAKKyMgY29uZmlndXJhdGlvbiBmaWxlLCB0aGUgZm9ybWF0IG9mIHdoaWNoIGlzIGV4dGVuc2lvbi1zcGVjaWZpYy4KKyMKKyMgRm9ybWF0OgorI0xvYWRFeHRlbnNpb24gPSAiL3BhdGgvdG8vZXh0ZW5zaW9uIiBbIDogIi9vcHRpb25hbC9jb25maWd1cmF0aW9uL2ZpbGUiIF0gOworIworIyBFeGFtcGxlczoKKyNMb2FkRXh0ZW5zaW9uID0gImV4dGVuc2lvbnMvc2FtcGxlLmZkeCI7CisjTG9hZEV4dGVuc2lvbiA9ICJleHRlbnNpb25zL3NhbXBsZS5mZHgiOiJjb25mL3NhbXBsZS5jb25mIjsKKworIyBFeHRlbnNpb25zIGFyZSBuYW1lZCBhcyBmb2xsb3c6CisjIGRpY3RfKiBmb3IgZXh0ZW5zaW9ucyB0aGF0IGFkZCBjb250ZW50IHRvIHRoZSBkaWN0aW9uYXJ5IGRlZmluaXRpb25zLgorIyBkYmdfKiAgZm9yIGV4dGVuc2lvbnMgdXNlZnVsIG9ubHkgdG8gcmV0cmlldmUgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgZnJhbWV3b3JrIGV4ZWN1dGlvbi4KKyMgYWNsXyogIDogQWNjZXNzIGNvbnRyb2wgbGlzdCwgdG8gY29udHJvbCB3aGljaCBwZWVycyBhcmUgYWxsb3dlZCB0byBjb25uZWN0LgorIyBydF8qICAgOiByb3V0aW5nIGV4dGVuc2lvbnMgdGhhdCBpbXBhY3QgaG93IG1lc3NhZ2VzIGFyZSBmb3J3YXJkZWQgdG8gb3RoZXIgcGVlcnMuCisjIGFwcF8qICA6IGFwcGxpY2F0aW9ucywgdGhlc2UgZXh0ZW5zaW9ucyB1c3VhbGx5IHJlZ2lzdGVyIGNhbGxiYWNrcyB0byBoYW5kbGUgc3BlY2lmaWMgbWVzc2FnZXMuCisjIHRlc3RfKiA6IGR1bW15IGV4dGVuc2lvbnMgdGhhdCBhcmUgdXNlZnVsIG9ubHkgaW4gdGVzdGluZyBlbnZpcm9ubWVudHMuCisKKworIyBUaGUgZGJnX21zZ19kdW1wLmZkeCBleHRlbnNpb24gYWxsb3dzIHlvdSB0byB0d2VhayB0aGUgd2F5IGZyZWVEaWFtZXRlciBkaXNwbGF5cyBzb21lCisjIGluZm9ybWF0aW9uIGFib3V0IHNvbWUgZXZlbnRzLiBUaGlzIGV4dGVuc2lvbiBkb2VzIG5vdCBhY3R1YWxseSB1c2UgYSBjb25maWd1cmF0aW9uIGZpbGUKKyMgYnV0IHJlY2VpdmVzIGRpcmVjdGx5IGEgcGFyYW1ldGVyIGluIHRoZSBzdHJpbmcgcGFzc2VkIHRvIHRoZSBleHRlbnNpb24uIEhlcmUgYXJlIHNvbWUgZXhhbXBsZXM6CisjIyBMb2FkRXh0ZW5zaW9uID0gImRiZ19tc2dfZHVtcHMuZmR4IiA6ICIweDExMTEiOyAjIFJlbW92ZXMgYWxsIGRlZmF1bHQgaG9va3MsIHZlcnkgcXVpZXQgZXZlbiBpbiBjYXNlIG9mIGVycm9ycy4KKyMjIExvYWRFeHRlbnNpb24gPSAiZGJnX21zZ19kdW1wcy5mZHgiIDogIjB4MjIyMiI7ICMgRGlzcGxheSBhbGwgZXZlbnRzIHdpdGggZmV3IGRldGFpbHMuCisjIyBMb2FkRXh0ZW5zaW9uID0gImRiZ19tc2dfZHVtcHMuZmR4IiA6ICIweDAwODAiOyAjIER1bXAgY29tcGxldGUgaW5mb3JtYXRpb24gYWJvdXQgc2VudCBhbmQgcmVjZWl2ZWQgbWVzc2FnZXMuCisjIFRoZSBmb3VyIGRpZ2l0cyByZXNwZWN0aXZlbHkgY29udHJvbDogY29ubmVjdGlvbnMsIHJvdXRpbmcgZGVjaXNpb25zLCBzZW50L3JlY2VpdmVkIG1lc3NhZ2VzLCBlcnJvcnMuCisjIFRoZSB2YWx1ZXMgZm9yIGVhY2ggZGlnaXQgYXJlOgorIyAgMCAtIGRlZmF1bHQgLSBrZWVwIHRoZSBkZWZhdWx0IGJlaGF2aW9yCisjICAxIC0gcXVpZXQgICAtIHJlbW92ZSBhbnkgc3BlY2lmaWMgbG9nCisjICAyIC0gY29tcGFjdCAtIGRpc3BsYXkgb25seSBhIHN1bW1hcnkgb2YgdGhlIGluZm9ybWF0aW9uCisjICA0IC0gZnVsbCAgICAtIGRpc3BsYXkgdGhlIGNvbXBsZXRlIGluZm9ybWF0aW9uIG9uIGEgc2luZ2xlIGxvbmcgbGluZQorIyAgOCAtIHRyZWUgICAgLSBkaXNwbGF5IHRoZSBjb21wbGV0ZSBpbmZvcm1hdGlvbiBpbiBhbiBlYXNpZXIgdG8gcmVhZCBmb3JtYXQgc3Bhbm5pbmcgc2V2ZXJhbCBsaW5lcy4KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMgIFBlZXJzIGNvbmZpZ3VyYXRpb24KKworIyAgVGhlIGxvY2FsIHNlcnZlciBsaXN0ZW5zIGZvciBpbmNvbWluZyBjb25uZWN0aW9ucy4gQnkgZGVmYXVsdCwKKyMgYWxsIHVua25vd24gY29ubmVjdGluZyBwZWVycyBhcmUgcmVqZWN0ZWQuIEV4dGVuc2lvbnMgY2FuIG92ZXJyaWRlIHRoaXMgYmVoYXZpb3IgKGUuZy4sIGFjbF93bCkuCisjIAorIyAgSW4gYWRkaXRpb24gdG8gaW5jb21pbmcgY29ubmVjdGlvbnMsIHRoZSBsb2NhbCBwZWVyIGNhbgorIyBiZSBjb25maWd1cmVkIHRvIGVzdGFibGlzaCBhbmQgbWFpbnRhaW4gY29ubmVjdGlvbnMgdG8gc29tZSAKKyMgRGlhbWV0ZXIgbm9kZXMgYW5kIGFsbG93IGNvbm5lY3Rpb25zIGZyb20gdGhlc2Ugbm9kZXMuCisjICBUaGlzIGlzIGFjaGlldmVkIHdpdGggdGhlIENvbm5lY3RQZWVyIGRpcmVjdGl2ZSBkZXNjcmliZWQgYmVsb3cuCisjCisjIE5vdGUgdGhhdCB0aGUgY29uZmlndXJlZCBEaWFtZXRlciBJZGVudGl0eSBNVVNUIG1hdGNoCisjIHRoZSBpbmZvcm1hdGlvbiByZWNlaXZlZCBpbnNpZGUgQ0VBLCBvciB0aGUgY29ubmVjdGlvbiB3aWxsIGJlIGFib3J0ZWQuCisjCisjIEZvcm1hdDoKKyNDb25uZWN0UGVlciA9ICJkaWFtZXRlcmlkIiBbIHsgcGFyYW1ldGVyMTsgcGFyYW1ldGVyMjsgLi4ufSBdIDsKKyMgUGFyYW1ldGVycyB0aGF0IGNhbiBiZSBzcGVjaWZpZWQgaW4gdGhlIHBlZXIncyBwYXJhbWV0ZXIgbGlzdDoKKyMgIE5vX1RDUDsgTm9fU0NUUDsgTm9fSVA7IE5vX0lQdjY7IFByZWZlcl9UQ1A7IFRMU19vbGRfbWV0aG9kOworIyAgTm9fVExTOyAgICAgICAjIGFzc3VtZSB0cmFuc3BhcmVudCBzZWN1cml0eSBpbnN0ZWFkIG9mIFRMUy4gRFRMUyBpcyBub3Qgc3VwcG9ydGVkIHlldCAod2lsbCBjaGFuZ2UgaW4gZnV0dXJlIHZlcnNpb25zKS4KKyMgIFBvcnQgPSA1ODY4OyAgIyBUaGUgcG9ydCB0byBjb25uZWN0IHRvCisjICBUY1RpbWVyID0gMzA7CisjICBUd1RpbWVyID0gMzA7CisjICBDb25uZWN0VG8gPSAiMjAyLjI0OS4zNy41IjsKKyMgIENvbm5lY3RUbyA9ICIyMDAxOjIwMDo5MDM6Mjo6MjAyOjEiOworIyAgVExTX1ByaW8gPSAiTk9STUFMIjsKKyMgIFJlYWxtID0gInJlYWxtLm5ldCI7ICMgUmVqZWN0IHRoZSBwZWVyIGlmIGl0IGRvZXMgbm90IGFkdmVydGlzZSB0aGlzIHJlYWxtLgorIyBFeGFtcGxlczoKKyNDb25uZWN0UGVlciA9ICJhYWEud2lkZS5hZC5qcCI7CisjQ29ubmVjdFBlZXIgPSAib2xkLmRpYW1ldGVyLnNlcnYiIHsgVGNUaW1lciA9IDYwOyBUTFNfb2xkX21ldGhvZDsgTm9fU0NUUDsgUG9ydD0zODY4OyB9IDsKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZG9jL3J0X2J1c3lwZWVycy5jb25mLnNhbXBsZSBiL2RvYy9ydF9idXN5cGVlcnMuY29uZi5zYW1wbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI1ZjE2MAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9ydF9idXN5cGVlcnMuY29uZi5zYW1wbGUKQEAgLTAsMCArMSw0NyBAQAorIyBUaGlzIGZpbGUgY29udGFpbnMgaW5mb3JtYXRpb24gZm9yIGNvbmZpZ3VyaW5nIHRoZSBydF9idXN5cGVlcnMgZXh0ZW5zaW9uLgorIyBUbyBmaW5kIGhvdyB0byBoYXZlIGZyZWVEaWFtZXRlciBsb2FkIHRoaXMgZXh0ZW5zaW9uLCBwbGVhc2UgcmVmZXIgdG8gdGhlIGZyZWVEaWFtZXRlciBkb2N1bWVudGF0aW9uLgorIworIyBUaGUgcnRfYnVzeXBlZXJzIGV4dGVuc2lvbiBoYXMgdHdvIHB1cnBvc2VzLiAKKyMgLSB3aGVuIHRoZSBsb2NhbCBwZWVyIHJlY2VpdmVzIGFuIGVycm9yIERJQU1FVEVSX1RPT19CVVNZIGZyb20gYSBwZWVyLCAKKyMgICB0aGlzIGV4dGVuc2lvbiBjYXRjaHMgdGhpcyBlcnJvciBhbmQgYXR0ZW1wdHMgdG8gcmV0cmFuc21pdCB0aGUgcXVlcnkgdG8gYW5vdGhlciBwZWVyIGlmIGl0IG1ha2VzIHNlbnNlLCBpLmUuOgorIyAgICAgICogdGhlIHBlZXIgaXNzdWluZyB0aGUgZXJyb3IgaXMgbm90IHRoZSBwZWVyIHJlZmVyZW5jZWQgaW4gdGhlIERlc3RpbmF0aW9uLUhvc3QgQVZQIG9mIHRoZSBtZXNzYWdlLAorIyAgICAgICogd2UgaGF2ZSBhIGRpcmVjdCBsaW5rIHdpdGggdGhlIHBlZXIgdGhhdCBpc3N1ZWQgdGhlIGVycm9yIChzZWUgcGFyYW1ldGVyIFJldHJ5RGlzdGFudFBlZXJzIGJlbG93KQorIworIyAtIFdoZW4gYSByZXF1ZXN0IGlzIGZvcndhcmRlZCBieSB0aGUgbG9jYWwgcGVlciwgc3RhcnQgYSB0aW1lciBhbmQgaWYgdGhlIGNvcnJlc3BvbmRpbmcgYW5zd2VyL2Vycm9yIGhhcworIyAgIG5vdCBiZWVuIHJlY2VpdmVkIHdpdGhpbiBSZWxheVRpbWVvdXQgc2Vjb25kcywgZWl0aGVyIHNlbmQgdG8gYW5vdGhlciBwZWVyIG9yIHJldHVybiBhIERJQU1FVEVSX1RPT19CVVNZCisjICAgZXJyb3IsIGRlcGVuZGluZyBvbiB0aGUgUmV0cnlNYXhQZWVycyBwYXJhbWV0ZXIuCisjCisjIFRoaXMgZXh0ZW5zaW9uIGlzIG1haW5seSB1c2VmdWwgZm9yIERpYW1ldGVyIGFnZW50cywgZm9yIERpYW1ldGVyIGNsaWVudHMgaXQgaXMgcmVjb21tZW5kZWQgdG8gCisjIGltcGxlbWVudCB0aGlzIGxvZ2ljIGRpcmVjdGx5IGluIHRoZSBjbGllbnQgYXBwbGljYXRpb24uIAorCisKKyMgUGFyYW1ldGVyOiBTa2lwVG9vQnVzeUVycm9ycworIyBJZiBkZWZpbmVkLCB0aGlzIHBhcmFtZXRlciBkaXNhYmxlcyB0aGUgaGFuZGxpbmcgb2YgRGlhbWV0ZXIgRXJyb3JzIG1lc3NhZ2Ugd2l0aCBhIFJlc3VsdC1Db2RlIHNldCB0byBESUFNRVRFUl9UT09fQlVTWSBpbiB0aGlzIGV4dGVuc2lvbi4KKyMgV2hlbiB0aGlzIHBhcmFtZXRlciBpcyBkZWZpbmVkLCB0aGUgcGFyYW1ldGVyIFJldHJ5RGlzdGFudFBlZXIgaGFzIG5vIGVmZmVjdC4KKyMgRGVmYXVsdDogcGFyYW1ldGVyIGlzIG5vdCBkZWZpbmVkLgorI1NraXBUb29CdXN5RXJyb3JzOworCisKKyMgUGFyYW1ldGVyOiBSZXRyeURpc3RhbnRQZWVycworIyBCeSBkZWZhdWx0LCB0aGUgZXh0ZW5zaW9uIG9ubHkgcmV0cmllcyB0byBzZW5kIG1lc3NhZ2VzIGlmIHRoZSBwZWVyIHRoYXQgaXNzdWVkIHRoZSBESUFNRVRFUl9UT09fQlVTWSBlcnJvciBpcyBkaXJlY3RseSBjb25uZWN0ZWQgdG8KKyMgdGhlIGxvY2FsIHBlZXIgKG5vdCB0aHJvdWdoIGEgRGlhbWV0ZXIgYWdlbnQpLiBUaGlzIGF2b2lkcyB0aGUgc2l0dWF0aW9uIHdoZXJlIHRoZSBtZXNzYWdlIGlzIHNlbnQgdG8gYSBkaWZmZXJlbnQgcmVsYXkgdGhhdCB3aWxsIGRlbGl2ZXIKKyMgdG8gdGhlIHNhbWUgYnVzeSBwZWVyIGFmdGVyd2FyZHMuIElmIHRoZSBwYXJhbWV0ZXIgaXMgZGVmaW5lZCwgdGhlbiB0aGUgZXh0ZW5zaW9uIHdpbGwgYWxzbyByZXRyeSBzZW5kaW5nIG1lc3NhZ2VzIGZvciBlcnJvcnMgZ2VuZXJhdGVkIGluCisjIGRpc3RhbnQgcGVlcnMuIFRoaXMgc2hvdWxkIGluY3JlYXNlIHRoZSBjaGFuY2UgdGhhdCB0aGUgbWVzc2FnZSBpcyBkZWxpdmVyZWQsIGJ1dCBhbHNvIGNhbiBpbmNyZWFzZSB0aGUgbG9hZCBvZiB0aGUgbmV0d29yayB1bm5lY2Vzc2FyaWx5LgorIyBEZWZhdWx0OiBwYXJhbWV0ZXIgaXMgbm90IGRlZmluZWQuCisjUmV0cnlEaXN0YW50UGVlcnM7CisKKworIyBQYXJhbWV0ZXI6IFJldHJ5TWF4UGVlcnMKKyMgVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIHRpbWVzIGEgcmVxdWVzdCBjYW4gYmUgcmUtc2VudCB0byBhIGRpZmZlcmVudCBwZWVyLCBiZWZvcmUgdGhlIGxvY2FsIHJlbGF5IGdpdmVzIHVwIGFuZCAKKyMgZm9yd2FyZHMgdGhlIGVycm9yIHRvIHVwc3RyZWFtLgorIyBEZWZhdWx0OiAwLCBtZWFuaW5nIGFsbCBwb3NzaWJsZSBjYW5kaWRhdGVzIGFyZSBhdHRlbXB0ZWQgYmVmb3JlIGdpdmUgdXAuCisjUmV0cnlNYXhQZWVycz0wOworCisKKyMgUGFyYW1ldGVyOiBSZWxheVRpbWVvdXQKKyMgSWYgdGhlIHZhbHVlIG9mIHRoaXMgcGFyYW1ldGVyIGlzIG5vdCAwLCBpdCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgKDEvMTAwMCBzKSB0aGF0IHRoZSBsb2NhbCByZWxheSB3YWl0cyBmb3IgYW4gYW5zd2VyIHRvIGEgCisjIGZvcndhcmRlZCByZXF1ZXN0IGJlZm9yZSBjb25zaWRlcmluZyB0aGUgcmVtb3RlIHBlZXIgaXMgYnVzeSBhbmQgdGFraW5nIGNvcnJlY3RpdmUgYWN0aW9uIChzaW1pbGFyIGFzIGlmIHRoYXQgcmVsYXkgaGFkIHJldHVybmVkIFRPT19CVVNZIHN0YXR1cykuCisjIE5vdGU6IHRoaXMgcGFyYW1ldGVyIGRvZXMgbm90IGFwcGx5IGZvciByZXF1ZXN0cyBpc3N1ZWQgbG9jYWxseS4gSW4gdGhhdCBjYXNlLCB0aGUgZXh0ZW5zaW9uIGlzc3VpbmcgdGhlIHJlcXVlc3Qgc2hvdWxkIGRpcmVjdGx5IHNwZWNpZnkgdGhlIHRpbWVvdXQuCisjIERlZmF1bHQ6IDAsIG1lYW5pbmcgdGhhdCB0aGVyZSBpcyBubyB0aW1lb3V0IHBhcmFtZXRlci4KKyNSZWxheVRpbWVvdXQ9MDsKKwpkaWZmIC0tZ2l0IGEvZG9jL3J0X2RlZmF1bHQuY29uZi5zYW1wbGUgYi9kb2MvcnRfZGVmYXVsdC5jb25mLnNhbXBsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjExMTAwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3J0X2RlZmF1bHQuY29uZi5zYW1wbGUKQEAgLTAsMCArMSw5MSBAQAorIyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBydF9kZWZhdWx0IGV4dGVuc2lvbiBvZiBmcmVlRGlhbWV0ZXIuCisjCisjIFRoaXMgZXh0ZW5zaW9uIHByb3ZpZGVzIGNvbmZpZ3VyYWJsZSByb3V0aW5nIHByb3BlcnRpZXMgZm9yIGZyZWVEaWFtZXRlci4KKworIyBMaW5lcyBzdGFydGluZyB3aXRoIGEgIyBhcmUgY29tbWVudHMgYW5kIGlnbm9yZWQuCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBUaGUgZnJlZURpYW1ldGVyIGRhZW1vbiB3aWxsIG5vdCBhbGxvdyBmb3J3YXJkaW5nIGEgbWVzc2FnZSB0byBhIHBlZXIgdGhhdDoKKyMgLSBhbHJlYWR5IGZvcndhcmRlZCB0aGUgbWVzc2FnZSAoYXBwZWFyIGFzIFJvdXRlLVJlY29yZCBpbnNpZGUgdGhlIG1lc3NhZ2UpCisjIC0gY29ubmVjdGlvbiBpcyBub3QgaW4gU1RBVEVfT1BFTiBzdGF0ZS4KKyMgV2UgY2FsbCBoZXJlICJlbGlnaWJsZSBwZWVyIiBhIHBlZXIgdGhhdCBpcyBub3Qgc2NyZWVuZWQgb3V0IGJ5IG9uZSBvZiB0aGVzZSBjcml0ZXJpYS4KKyMKKyMgRXZlbiBpZiBhIHBlZXIgaXMgc3BlY2lmaWVkIGFzIHJvdXRlIGZvciBhIG1lc3NhZ2UgaGVyZSwgdGhlIGRhZW1vbiBtYXkKKyMgY2hvb3NlIHRvIHNlbmQgYSBtZXNzYWdlIHRvIGFub3RoZXIgcGVlciwgb3IgcmV0dXJuIGEgVU5BQkxFX1RPX0RFTElWRVIgZXJyb3IsIGlmIHRoYXQgcGVlciBpcyBub3QgZWxpZ2libGUgCisjIGF0IHRoZSB0aW1lIHdoZXJlIHRoZSBtZXNzYWdlIGlzIHRvIGJlIGZvcndhcmRlZC4KKyMKKyMgTm90ZSBhbHNvIHRoYXQgZGVmaW5pbmcgYSBwZWVyIGhlcmUgd2lsbCBub3QgcmVzdWx0IGluIHRoZSBkYWVtb24gdHJ5aW5nIHRvIGVzdGFibGlzaAorIyBhIGNvbm5lY3Rpb24gdG8gdGhpcyBwZWVyLiBGb3IgdGhpcyBwdXJwb3NlLCB0aGUgcGVlciBtdXN0IGJlIGRlZmluZWQgaW4gdGhlIG1haW4KKyMgY29uZmlndXJhdGlvbiAoQ29ubmVjdFBlZXIpLCBvciBjb25uZWN0aW9uIGVzdGFibGlzaGVkIHRocm91Z2ggb3RoZXIgbWVhbnMgKGUuZy4gZHluYW1pYyBwZWVyCisjIGRpc2NvdmVyeSBleHRlbnNpb24pLgorIworIyBUaGUgZGVmYXVsdCBmb3J3YXJkaW5nIGJlaGF2aW9yIG9mIGZyZWVEaWFtZXRlciBpczoKKyMgLSBpZiB0aGUgbWVzc2FnZSBjb250YWlucyBhIERlc3RpbmF0aW9uLUhvc3QgQVZQLCBhbmQgdGhlIGRlc2lnbmF0ZWQgcGVlciBpcyBhbiBlbGlnaWJsZSBjYW5kaWRhdGUsIHNlbmQgdG8gdGhpcyBwZWVyLgorIyAtIGlmIGEgcGVlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSBtZXNzYWdlIGFwcGxpY2F0aW9uIG9yIFJlbGF5IGFwcGxpY2F0aW9uLCBnaXZlIGl0IGEgcGVuYWx0eSBmb3IgdGhpcyBtZXNzYWdlIAorIyAgICAoaXQgbWVhbnMgdGhhdCB1bmxlc3Mgb3ZlcndyaXR0ZW4gYnkgYW4gZXh0ZW5zaW9uLCB0aGUgbWVzc2FnZSB3aWxsIG5vdCBiZSBzZW50IHRvIHRoYXQgcGVlcikKKyMgLSBpZiBvbmUgb2YgdGhlIGVsaWdpYmxlIHBlZXIgYWR2ZXJ0aXNlZCBhIHJlYWxtIG1hdGNoaW5nIHRoZSBtZXNzYWdlJ3MgRGVzdGluYXRpb24tUmVhbG0sIHNlbmQgdG8gdGhpcyBwZWVyLgorIworIyBUaGUgbWVjaGFuaXNtIGlzIGFzIGZvbGxvdzoKKyMgLSB0aGUgZGFlbW9uIGJ1aWxkcyBhIGxpc3Qgb2YgZWxpZ2libGUgcGVlcnMsIHRoZW4gYXR0cmlidXRlcyBhIHNjb3JlIHRvIHRoZXNlIHBlZXJzIChzZWUgZW51bSBmZF9ydF9vdXRfc2NvcmUgaW4gZnJlZURpYW1ldGVyLmgpCisjIC0gYW55IG51bWJlciBvZiBleHRlbnNpb25zIGNhbiByZWdpc3RlciBhIGNhbGxiYWNrIGFuZCBtb2RpZnkgdGhlIHNjb3JlCisjIC0gYWZ0ZXIgYWxsIGNhbGxiYWNrcyBoYXZlIGJlZW4gY2FsbGVkLCB0aGUgbWVzc2FnZSBpcyBzZW50IHRvIHRoZSBwZWVyIHdpdGggdGhlIGhpZ2hlciBzY29yZS4gSWYgYW4gZXJyb3IgaXMgcmVjZWl2ZWQsIGl0IGlzIHJldHJpZWQgdG8gdGhlIG5leHQgcGVlciBpbiB0aGUgbGlzdCwgYW5kIHNvIG9uLAorIyAgIHVudGlsIHRoZSBsaXN0IGlzIGVtcHR5LiBJbiBzdWNoIHNpdHVhdGlvbiwgYW4gZXJyb3IgVU5BQkxFX1RPX0RFTElWRVIgaXMgZ2VuZXJhdGVkLgorIworIyBUaGlzIGV4dGVuc2lvbiBhbGxvd3MgdG8gbW9kaWZ5IHRoZSBzY29yZSBvZiBzb21lIHBlZXJzIGJhc2VkIG9uIHNvbWUgY3JpdGVyaWEgb2YgdGhlIG1lc3NhZ2UuCisjCisjIEZpbmFsbHksIHBsZWFzZSBub3RlIHRoYXQgdGhlIGZyZWVEaWFtZXRlciBkYWVtb24gZG9lcyBub3Qgc3VwcG9ydCBSRURJUkVDVCBpbmRpY2F0aW9ucyBuYXRpdmVseS4gCisjIFlvdSBoYXZlIHRvIGxvYWQgdGhlIHJ0X3JlZGlyIGV4dGVuc2lvbiB0byBhZGQgdGhpcyBzdXBwb3J0LgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgVGhpcyBmaWxlIGNvbnRhaW5zIGEgbGlzdCBvZiBSVUxFIGVsZW1lbnRzLgorIyBFYWNoIFJVTEUgaXMgbWFkZSBvZiB0aHJlZSBjb21wb25lbnRzOgorIyAgLSBhIENSSVRFUklBLCB3aGljaCBzcGVjaWZpZXMgd2hpY2ggbWVzc2FnZXMgdGhlIFJVTEUgYXBwbHkgdG8uCisjICAtIGEgVEFSR0VUIHN0cmluZywgdGhhdCBzcGVjaWZpZXMgd2hpY2ggcGVlcihzKSBpbiB0aGUgZWxpZ2libGUgbGlzdCB0aGUgcnVsZSBpcyBhcHBsaWVkIHRvCisjICAtIGFuZCBhIFNDT1JFLCB0aGF0IGlzIGFkZGVkIHRvIHRoZSBtYXRjaGluZyBwZWVyJ3MgY3VycmVudCBzY29yZS4KKyMKKyMgSW4gdGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucywgIlNUUi9SRUciIHN0YW5kcyBmb3I6CisjICAgLSBhIHF1b3RlZCBzdHJpbmcgInNvbWUucGVlciIgdGhhdCB3aWxsIG1hdGNoIGV4YWN0bHkgdGhpcyBzdHJpbmcgKGNhc2UtaW5zZW5zaXRpdmUpLCBvcgorIyAgIC0gYSBicmFja2V0LXF1b3RlZCBzdHJpbmcgWyJzb21lIHJlZ2V4Il0gdGhhdCB3aWxsIGJlIGludGVycHJldGVkIGFzIGEgUE9TSVggZXh0ZW5kZWQgcmVndWxhciBleHByZXNzaW9uIChjYXNlLXNlbnNpdGl2ZSksIGFuZCBhdHRlbXB0IHRvIG1hdGNoIHRoZSBzdHJpbmcuCisjCisjIFRoZSBSVUxFIGlzIHNwZWNpZmllZCBhczoKKyMgICAgQ1JJVEVSSUEgOiBUQVJHRVQgKz0gU0NPUkUgOworIworIyBUaGUgQ1JJVEVSSUEgY2FuIGJlOgorIyAgICAqICAgCQktPiBtYXRjaGVzIGFueSBtZXNzYWdlLgorIyAgICBvaD0iU1RSL1JFRyIJLT4gc2VsZWN0cyB0aGUgbWVzc2FnZSBpZiB0aGUgc3RyaW5nIG9yIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGVzIHRoZSBtZXNzYWdlJ3MgT3JpZ2luLUhvc3QgQVZQIGNvbnRlbnQKKyMgICAgb3I9IlNUUi9SRUciICAgCS0+IGlkZW0gd2l0aCBPcmlnaW4tUmVhbG0KKyMgICAgZGg9IlNUUi9SRUciICAgCS0+IGlkZW0gd2l0aCBEZXN0aW5hdGlvbi1Ib3N0CisjICAgIGRyPSJTVFIvUkVHIiAgIAktPiBpZGVtIHdpdGggRGVzdGluYXRpb24tUmVhbG0KKyMgICAgdW49IlNUUi9SRUciICAgCS0+IGlkZW0gd2l0aCBVc2VyLU5hbWUKKyMgICAgc2k9IlNUUi9SRUciICAgCS0+IGlkZW0gd2l0aCBTZXNzaW9uLUlkCisjCisjIFRoZSBUQVJHRVQgaXMgYWxzbyBvZiBhIHNpbWlsYXIgZm9ybToKKyMgICAgIlNUUi9SRUciCQktPiBXaWxsIGFwcGx5IHRoZSBzY29yZSB0byB0aGlzIHBlZXIgaWYgaXRzIERpYW1ldGVyLUlkIGlzIG1hdGNoZWQgYnkgdGhlIHN0cmluZyBvciByZWd1bGFyIGV4cHJlc3Npb24uCisjICAgIHJsbT0iU1RSL1JFRyIJLT4gSWRlbSB3aXRoIHRoZSBwZWVyJ3MgYWR2ZXJ0aXplZCBEaWFtZXRlci1SZWFsbS4KKyMKKyMgVGhlIFNDT1JFIGlzIGVpdGhlciBudW1lcmljIChwb3NpdGl2ZSBvciBuZWdhdGl2ZSksIG9yIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbnN0YW50cyAoc2VlIHZhbHVlcyBpbiBsaWJmZGNvcmUuaCk6CisjICAgIE5PX0RFTElWRVJZCisjICAgIERFRkFVTFQKKyMgICAgREVGQVVMVF9SRUFMTQorIyAgICBSRUFMTQorIyAgICBSRURJUl9IT1NUICAgICAKKyMgICAgUkVESVJfQVBQICAgICAgCisjICAgIFJFRElSX1JFQUxNICAgIAorIyAgICBSRURJUl9SRUFMTV9BUFAKKyMgICAgUkVESVJfVVNFUiAgICAgCisjICAgIFJFRElSX1NFU1NJT04gIAorIyAgICBGSU5BTERFU1QKKyMKKyMKKyMgSGVyZSBhcmUgc29tZSBleGFtcGxlczoKKyMgIDEpIFJ1bGUgdG8gYWRkIGEgZGVmYXVsdCBuZXh0LWhvcCBwZWVyIHRvIGFsbCBtZXNzYWdlczoKKyMgICAgKiA6ICJwcm94eS50ZXN0YmVkLmFhYSIgKz0gREVGQVVMVCA7CisjCisjICAyKSBSdWxlIHRvIHJvdXRlIG1lc3NhZ2VzIGZvciBhIGdpdmVuIHJlYWxtIChyZWFsbUEpIHRocm91Z2ggYW5vdGhlciByZWFsbSAocmVhbG1CKToKKyMgICAgZHI9InJlYWxtQSIgOiBybG09InJlYWxtQiIgKz0gREVGQVVMVF9SRUFMTSA7CisjCisjICAzKSBBdm9pZCBzZW5kaW5nIG1lc3NhZ2VzIHdpdGggZGVjb3JhdGVkIE5BSSB0byB0aGUgcHJveHkgQToKKyMgICAgdW49WyIuKyEuK0AuKyJdIDogInByb3h5LkEiICs9IE5PX0RFTElWRVJZIDsKKworCisKZGlmZiAtLWdpdCBhL2RvYy9ydF9lcmVnLmNvbmYuc2FtcGxlIGIvZG9jL3J0X2VyZWcuY29uZi5zYW1wbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ5ZDRkOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9ydF9lcmVnLmNvbmYuc2FtcGxlCkBAIC0wLDAgKzEsMjEgQEAKKyMgVGhpcyBmaWxlIGNvbnRhaW5zIGluZm9ybWF0aW9uIGZvciBjb25maWd1cmluZyB0aGUgcnRfZXJlZyBleHRlbnNpb24uCisjIFRvIGZpbmQgaG93IHRvIGhhdmUgZnJlZURpYW1ldGVyIGxvYWQgdGhpcyBleHRlbnNpb24sIHBsZWFzZSByZWZlciB0byB0aGUgZnJlZURpYW1ldGVyIGRvY3VtZW50YXRpb24uCisjCisjIFRoZSBydF9lcmVnIGV4dGVuc2lvbiBhbGxvd3MgY3JlYXRpb24gb2Ygcm91dGluZyBydWxlcyBiYXNlZCBvbiBBVlAgdmFsdWUgbWF0Y2hpbmcgcmVndWxhciBleHByZXNzaW9ucy4KKworIyBGaXJzdCwgb25lIG11c3QgaW5kaWNhdGUgd2hpY2ggQVZQIHNob3VsZCBiZSB1c2VkIGZvciBtYXRjaGluZy4gCisjIEF0IHRoZSBtb21lbnQsIG9ubHkgQVZQIHdpdGggT0NURVRTVFJJTkcgdHlwZXMgYXJlIHZhbGlkLgorIyAgQVZQID0gIlVzZXItTmFtZSI7CisjIFRoaXMgcGFyYW1ldGVyIGlzIG1hbmRhdG9yeS4gVGhlcmUgaXMgbm8gZGVmYXVsdCB2YWx1ZS4KKworIyBUaGVuIGEgbGlzdCBvZiBydWxlcyBmb2xsb3cuIEEgcnVsZSBoYXMgdGhpcyBmb3JtYXQ6CisjICAicGF0dGVybiIgOiAic2VydmVyIiArPSBzY29yZSA7CisjIFdoZXJlOgorIyAgcGF0dGVybiBpcyB0aGUgcXVvdGVkLXN0cmluZyByZWdleCB0byBtYXRjaCwgCisjICBzZXJ2ZXIgaXMgdGhlIG5leHQgaG9wIGluIHRoZSByb3V0aW5nIGxpc3QgdGhhdCB3aWxsIHJlY2VpdmUgdGhlCisjICBzY29yZSwgd2hpY2ggY2FuIGJlIHBvc2l0aXZlIG9yIG5lZ2F0aXZlLgorIyBFeGFtcGxlOgorIyAgIltbOmRpZ2l0Ol1dKiIgOiAic2VydmVyQS5leGFtcGxlLm5ldCIgKz0gLTMgOworIyAgICBtZWFucyB0aGF0IGlmIHRoZSBBVlAgdmFsdWUgaXMgb25seSBudW1lcmljLCB0aGUgU2VydmVyQSB3aWxsIGhhdmUgaXRzIHNjb3JlIGRlY3JlYXNlZCBieSAzIHBvaW50cy4KKyMgICAgKHJlbWluZGVyOiB0aGUgc2VydmVyIHdpdGggdGhlIHBlZXIgd2l0aCB0aGUgaGlnaGVzdCBzY29yZSBnZXRzIHRoZSBtZXNzYWdlKQorIyBOb3RlIHRoYXQgYWxsIHJ1bGVzIGFyZSB0ZXN0ZWQgZm9yIGVhY2ggbWVzc2FnZSB0aGF0IGNvbnRhaW4gdGhlIEFWUCwgbm90IG9ubHkgdGhlIGZpcnN0IG1hdGNoLgpkaWZmIC0tZ2l0IGEvZG9jL3NpbmdsZV9ob3N0LzAxLnBlbSBiL2RvYy9zaW5nbGVfaG9zdC8wMS5wZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UzNTFhOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zaW5nbGVfaG9zdC8wMS5wZW0KQEAgLTAsMCArMSw2MCBAQAorQ2VydGlmaWNhdGU6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMyAoMHgyKQorICAgICAgICBTZXJpYWwgTnVtYmVyOiAxICgweDEpCisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQ049Y2EubG9jYWxkb21haW4sIEM9RlIsIFNUPUJkUiwgTD1BaXgsIE89ZkQsIE9VPVRlc3RzCisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBKdW4gIDEgMTk6Mzc6MTQgMjAxNyBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IEp1biAgMSAxOTozNzoxNCAyMDE4IEdNVAorICAgICAgICBTdWJqZWN0OiBDPUZSLCBTVD1CZFIsIE89ZkQsIE9VPVRlc3RzLCBDTj1wZWVyMS5sb2NhbGRvbWFpbgorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICAgICAgUHVibGljLUtleTogKDEwMjQgYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXM6CisgICAgICAgICAgICAgICAgICAgIDAwOmMwOmU0OmYzOmFjOmJiOjQ5OmJmOjQzOmQzOjNlOmI2OjY2OjYwOjBhOgorICAgICAgICAgICAgICAgICAgICA5NDpmZjplMzphOTowNzpjZjo1OToyODo4ZDpmMjo5ZTpiZDo5NjphOTo3ZDoKKyAgICAgICAgICAgICAgICAgICAgMTA6ZTQ6OWY6ZjU6ZmI6MTc6ZWM6ZDk6MTY6ZDI6MGY6OGQ6ODI6M2U6MTg6CisgICAgICAgICAgICAgICAgICAgIGE5OjM4Ojk3OmY5OmU0OmFjOmUzOjcyOmY5OmMzOmRmOjhhOmQyOmU5Ojg4OgorICAgICAgICAgICAgICAgICAgICA2NzpjMTo3MDoxNDo5NDowMjozYjpiYTo4YzpiODozZTo5ZDpkMTpiZjpmMzoKKyAgICAgICAgICAgICAgICAgICAgZTY6YTE6OTE6YzI6ZWU6ODc6ODA6M2Q6Yjg6OTk6MzM6ODI6MmQ6YmQ6MWI6CisgICAgICAgICAgICAgICAgICAgIDI3OjljOmY1OmI2OjY0OmI0OjU1OmI3Ojk2OjMxOmMwOjgxOjhiOjQ2OmMxOgorICAgICAgICAgICAgICAgICAgICBjMDpjNzo3YTo0MzozOTowMjoxYTo4Zjo2YTplMzowYTpkNzpmNzo3OTowNzoKKyAgICAgICAgICAgICAgICAgICAgYWI6MzU6YzU6NDM6NjQ6MjM6ZDA6NjI6MDUKKyAgICAgICAgICAgICAgICBFeHBvbmVudDogNjU1MzcgKDB4MTAwMDEpCisgICAgICAgIFg1MDl2MyBleHRlbnNpb25zOgorICAgICAgICAgICAgWDUwOXYzIEJhc2ljIENvbnN0cmFpbnRzOiAKKyAgICAgICAgICAgICAgICBDQTpGQUxTRQorICAgICAgICAgICAgTmV0c2NhcGUgQ29tbWVudDogCisgICAgICAgICAgICAgICAgT3BlblNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUKKyAgICAgICAgICAgIFg1MDl2MyBTdWJqZWN0IEtleSBJZGVudGlmaWVyOiAKKyAgICAgICAgICAgICAgICAzNTpGODo0QTpDOTpBOTo1NjpFQTo5OTo1RDo1ODo0MTpFNzo5MDo3ODo4MzoyMzowMjo5NTowQTozQworICAgICAgICAgICAgWDUwOXYzIEF1dGhvcml0eSBLZXkgSWRlbnRpZmllcjogCisgICAgICAgICAgICAgICAga2V5aWQ6M0E6QjU6QkQ6REY6QUI6OEQ6NzE6Nzc6Rjc6MUU6RkY6MkM6RUI6QjI6RDM6MkY6NTI6RDY6MjA6Q0UKKworICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICAgMmI6ZTI6YzY6MzM6OGE6ZmM6YjM6ZDY6NTU6ZDY6MTY6ZDQ6Zjc6MmQ6ZDg6NDk6Nzg6NmE6CisgICAgICAgICBmNDoxMjplYzoyNjo4MjoyZDoxNTo3Mzo3ODpiNzo0ZTozNDozOTpjNzowZjoyNTozYzo3MzoKKyAgICAgICAgIGEzOjEzOmI4OmMxOjVjOmI2OmE0Ojc2Ojc4OjcxOjY2OjBmOjZhOmY0OjUzOmI5OjgwOmY3OgorICAgICAgICAgNDE6ZGQ6NWY6MGQ6N2Q6N2I6ZDM6YjY6ZDY6OGU6ZmI6ODE6NmY6NTc6MjQ6ZDc6YWM6NWE6CisgICAgICAgICA1Mjo2NjpjYTo0ODphOTozNzpkYjo3ZTowNzpiMjplZTo4Yzo4MTphNjplNjo5YzpiMzo0MDoKKyAgICAgICAgIGYyOmYwOjJkOjU3OmQ1OjIwOjM3OjIwOjVjOjIzOjljOjVlOjU4OmM5OjBjOmM3Ojg4OjAyOgorICAgICAgICAgZTc6YTE6MTU6OWE6MDg6Y2Y6ZmQ6YzA6N2E6OTc6YTI6M2E6YTE6ODI6MTk6NDE6ODY6NGY6CisgICAgICAgICBhZjozZQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlDcERDQ0FnMmdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCZk1SY3dGUVlEVlFRRERBNWpZUzVzCitiMk5oYkdSdmJXRnBiakVMTUFrR0ExVUVCaE1DUmxJeEREQUtCZ05WQkFnTUEwSmtVakVNTUFvR0ExVUVCd3dECitRV2w0TVFzd0NRWURWUVFLREFKbVJERU9NQXdHQTFVRUN3d0ZWR1Z6ZEhNd0hoY05NVGN3TmpBeE1Ua3pOekUwCitXaGNOTVRnd05qQXhNVGt6TnpFMFdqQlVNUXN3Q1FZRFZRUUdFd0pHVWpFTU1Bb0dBMVVFQ0F3RFFtUlNNUXN3CitDUVlEVlFRS0RBSm1SREVPTUF3R0ExVUVDd3dGVkdWemRITXhHakFZQmdOVkJBTU1FWEJsWlhJeExteHZZMkZzCitaRzl0WVdsdU1JR2ZNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0R05BRENCaVFLQmdRREE1UE9zdTBtL1E5TSt0bVpnCitDcFQvNDZrSHoxa29qZktldlphcGZSRGtuL1g3Rit6WkZ0SVBqWUkrR0trNGwvbmtyT055K2NQZml0THBpR2ZCCitjQlNVQWp1NmpMZytuZEcvOCthaGtjTHVoNEE5dUpremdpMjlHeWVjOWJaa3RGVzNsakhBZ1l0R3djREhla001CitBaHFQYXVNSzEvZDVCNnMxeFVOa0k5QmlCUUlEQVFBQm8zc3dlVEFKQmdOVkhSTUVBakFBTUN3R0NXQ0dTQUdHCisrRUlCRFFRZkZoMVBjR1Z1VTFOTUlFZGxibVZ5WVhSbFpDQkRaWEowYVdacFkyRjBaVEFkQmdOVkhRNEVGZ1FVCitOZmhLeWFsVzZwbGRXRUhua0hpREl3S1ZDand3SHdZRFZSMGpCQmd3Rm9BVU9yVzkzNnVOY1hmM0h2OHM2N0xUCitMMUxXSU00d0RRWUpLb1pJaHZjTkFRRUZCUUFEZ1lFQUsrTEdNNHI4czlaVjFoYlU5eTNZU1hocTlCTHNKb0l0CitGWE40dDA0ME9jY1BKVHh6b3hPNHdWeTJwSFo0Y1dZUGF2UlR1WUQzUWQxZkRYMTcwN2JXanZ1QmIxY2sxNnhhCitVbWJLU0trMzIzNEhzdTZNZ2FibW5MTkE4dkF0VjlVZ055QmNJNXhlV01rTXg0Z0M1NkVWbWdqUC9jQjZsNkk2CitvWUlaUVlaUHJ6ND0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL2RvYy9zaW5nbGVfaG9zdC8wMi5wZW0gYi9kb2Mvc2luZ2xlX2hvc3QvMDIucGVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNWVlY2IKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2luZ2xlX2hvc3QvMDIucGVtCkBAIC0wLDAgKzEsNjAgQEAKK0NlcnRpZmljYXRlOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDMgKDB4MikKKyAgICAgICAgU2VyaWFsIE51bWJlcjogMiAoMHgyKQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IENOPWNhLmxvY2FsZG9tYWluLCBDPUZSLCBTVD1CZFIsIEw9QWl4LCBPPWZELCBPVT1UZXN0cworICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogSnVuICAxIDE5OjM3OjE0IDIwMTcgR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBKdW4gIDEgMTk6Mzc6MTQgMjAxOCBHTVQKKyAgICAgICAgU3ViamVjdDogQz1GUiwgU1Q9QmRSLCBPPWZELCBPVT1UZXN0cywgQ049cGVlcjIubG9jYWxkb21haW4KKyAgICAgICAgU3ViamVjdCBQdWJsaWMgS2V5IEluZm86CisgICAgICAgICAgICBQdWJsaWMgS2V5IEFsZ29yaXRobTogcnNhRW5jcnlwdGlvbgorICAgICAgICAgICAgICAgIFB1YmxpYy1LZXk6ICgxMDI0IGJpdCkKKyAgICAgICAgICAgICAgICBNb2R1bHVzOgorICAgICAgICAgICAgICAgICAgICAwMDpjZjpmYTo4YTpkMTpmYzplZTpjMjoxYzo1ZDo1NDpkZDoxNDo1MzpmMToKKyAgICAgICAgICAgICAgICAgICAgN2M6ZDI6YTc6Mzk6M2Y6ZTU6YzE6Mzc6Yzg6MDg6ODQ6NjI6NzU6Nzg6MjU6CisgICAgICAgICAgICAgICAgICAgIDg5OmZiOjg4OjIwOjVkOjk1OmRmOjkyOjI4OjQzOmQwOjNiOjliOjZhOmQwOgorICAgICAgICAgICAgICAgICAgICBkNTo1YjpiOTpiYzowZDozODo0YTpjODpkZDoyZTo4Mjo0MDo4MDpkMDowYzoKKyAgICAgICAgICAgICAgICAgICAgMjU6ZTg6OGM6NTI6MDM6OGU6ZWI6NmQ6ZWQ6Nzk6M2U6NTA6Zjk6NGQ6YWU6CisgICAgICAgICAgICAgICAgICAgIDJjOjYzOjUyOjAxOjJjOjFkOmMwOjg5OjkwOjY5OmNmOjkzOjBhOjBmOjMyOgorICAgICAgICAgICAgICAgICAgICBhODo1MDpjMDoyZToyZTpmYTplNDpjZDoyMzoxOTphYjo1ODoxOToxYzpmMjoKKyAgICAgICAgICAgICAgICAgICAgZjI6NDk6YzE6NDI6ZDY6MWQ6NWE6MTk6OTI6MTg6ZmM6Yzk6YzI6YTk6M2U6CisgICAgICAgICAgICAgICAgICAgIDFkOjdiOjMyOmIwOjc2OmUwOjg5Ojk0OmVmCisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgICAgICBYNTA5djMgZXh0ZW5zaW9uczoKKyAgICAgICAgICAgIFg1MDl2MyBCYXNpYyBDb25zdHJhaW50czogCisgICAgICAgICAgICAgICAgQ0E6RkFMU0UKKyAgICAgICAgICAgIE5ldHNjYXBlIENvbW1lbnQ6IAorICAgICAgICAgICAgICAgIE9wZW5TU0wgR2VuZXJhdGVkIENlcnRpZmljYXRlCisgICAgICAgICAgICBYNTA5djMgU3ViamVjdCBLZXkgSWRlbnRpZmllcjogCisgICAgICAgICAgICAgICAgOEU6OTQ6RTA6Q0U6M0U6OEQ6RDY6RkQ6NTE6Qzc6OTI6Q0Q6OUM6MkE6RDY6NUI6MUU6Njc6OUY6MjcKKyAgICAgICAgICAgIFg1MDl2MyBBdXRob3JpdHkgS2V5IElkZW50aWZpZXI6IAorICAgICAgICAgICAgICAgIGtleWlkOjNBOkI1OkJEOkRGOkFCOjhEOjcxOjc3OkY3OjFFOkZGOjJDOkVCOkIyOkQzOjJGOjUyOkQ2OjIwOkNFCisKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgIDMwOjZiOmQ0OmFlOjI1OmVlOjhhOmQ4OjBhOjZhOjRkOjUwOmNiOmJjOjA4OjVkOjFjOjNkOgorICAgICAgICAgYmE6NWI6YTk6OTc6NjM6OWE6MzM6NDc6MzY6YmM6ODg6NzE6Yjk6N2U6M2I6ZTQ6M2I6MTU6CisgICAgICAgICA1NzpiNTo1Mzo1ZDphYTplNjo1NjphOTpjYzo0MTpkZDpiYjoxODpmZToyMTowNDpiOTo5MToKKyAgICAgICAgIDE3OjU2OjE1OjAxOmZjOmEzOmUwOjcyOmI0OjAyOjc0OjFlOjg5OjZmOjRjOjEzOjNhOmFkOgorICAgICAgICAgMTI6OGI6ODg6YTc6MDk6Mzg6M2M6MDY6OWY6MjI6NjI6Yjg6MTA6MmM6ZmI6MTg6NDU6MWM6CisgICAgICAgICBhYTo2MTpiNzpmNjo5Mzo4Njo5ZDpmNDo1MTo5MjpiNTplZTpjNTo4MTo2Njo0MzpmMjphZToKKyAgICAgICAgIGFlOjU1OmI5OjViOmEyOjY4OmZiOmRkOjc4OjJjOjFiOjEyOmQ5OmNmOmZiOjJkOmRjOmY3OgorICAgICAgICAgMGY6MzkKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJQ3BEQ0NBZzJnQXdJQkFnSUJBakFOQmdrcWhraUc5dzBCQVFVRkFEQmZNUmN3RlFZRFZRUUREQTVqWVM1cworYjJOaGJHUnZiV0ZwYmpFTE1Ba0dBMVVFQmhNQ1JsSXhEREFLQmdOVkJBZ01BMEprVWpFTU1Bb0dBMVVFQnd3RAorUVdsNE1Rc3dDUVlEVlFRS0RBSm1SREVPTUF3R0ExVUVDd3dGVkdWemRITXdIaGNOTVRjd05qQXhNVGt6TnpFMAorV2hjTk1UZ3dOakF4TVRrek56RTBXakJVTVFzd0NRWURWUVFHRXdKR1VqRU1NQW9HQTFVRUNBd0RRbVJTTVFzdworQ1FZRFZRUUtEQUptUkRFT01Bd0dBMVVFQ3d3RlZHVnpkSE14R2pBWUJnTlZCQU1NRVhCbFpYSXlMbXh2WTJGcworWkc5dFlXbHVNSUdmTUEwR0NTcUdTSWIzRFFFQkFRVUFBNEdOQURDQmlRS0JnUURQK29yUi9PN0NIRjFVM1JSVAorOFh6U3B6ay81Y0UzeUFpRVluVjRKWW43aUNCZGxkK1NLRVBRTzV0cTBOVmJ1YndOT0VySTNTNkNRSURRRENYbworakZJRGp1dHQ3WGsrVVBsTnJpeGpVZ0VzSGNDSmtHblBrd29QTXFoUXdDNHUrdVROSXhtcldCa2M4dkpKd1VMVworSFZvWmtoajh5Y0twUGgxN01yQjI0SW1VN3dJREFRQUJvM3N3ZVRBSkJnTlZIUk1FQWpBQU1Dd0dDV0NHU0FHRworK0VJQkRRUWZGaDFQY0dWdVUxTk1JRWRsYm1WeVlYUmxaQ0JEWlhKMGFXWnBZMkYwWlRBZEJnTlZIUTRFRmdRVQoranBUZ3pqNk4xdjFSeDVMTm5DcldXeDVubnljd0h3WURWUjBqQkJnd0ZvQVVPclc5MzZ1TmNYZjNIdjhzNjdMVAorTDFMV0lNNHdEUVlKS29aSWh2Y05BUUVGQlFBRGdZRUFNR3ZVcmlYdWl0Z0thazFReTd3SVhSdzl1bHVwbDJPYQorTTBjMnZJaHh1WDQ3NURzVlY3VlRYYXJtVnFuTVFkMjdHUDRoQkxtUkYxWVZBZnlqNEhLMEFuUWVpVzlNRXpxdAorRW91SXB3azRQQWFmSW1LNEVDejdHRVVjcW1HMzlwT0duZlJSa3JYdXhZRm1RL0t1cmxXNVc2Sm8rOTE0TEJzUworMmMvN0xkejNEems9CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCmRpZmYgLS1naXQgYS9kb2Mvc2luZ2xlX2hvc3QvY2FjZXJ0LnBlbSBiL2RvYy9zaW5nbGVfaG9zdC9jYWNlcnQucGVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNDIwOTkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2luZ2xlX2hvc3QvY2FjZXJ0LnBlbQpAQCAtMCwwICsxLDE2IEBACistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUNqRENDQWZXZ0F3SUJBZ0lKQUt2N3gzZXoyUWY5TUEwR0NTcUdTSWIzRFFFQkJRVUFNRjh4RnpBVkJnTlYKK0JBTU1EbU5oTG14dlkyRnNaRzl0WVdsdU1Rc3dDUVlEVlFRR0V3SkdVakVNTUFvR0ExVUVDQXdEUW1SU01Rd3cKK0NnWURWUVFIREFOQmFYZ3hDekFKQmdOVkJBb01BbVpFTVE0d0RBWURWUVFMREFWVVpYTjBjekFlRncweE56QTIKK01ERXhPVE0zTVROYUZ3MHlOekExTXpBeE9UTTNNVE5hTUY4eEZ6QVZCZ05WQkFNTURtTmhMbXh2WTJGc1pHOXQKK1lXbHVNUXN3Q1FZRFZRUUdFd0pHVWpFTU1Bb0dBMVVFQ0F3RFFtUlNNUXd3Q2dZRFZRUUhEQU5CYVhneEN6QUoKK0JnTlZCQW9NQW1aRU1RNHdEQVlEVlFRTERBVlVaWE4wY3pDQm56QU5CZ2txaGtpRzl3MEJBUUVGQUFPQmpRQXcKK2dZa0NnWUVBcUxKcE83NnlYdThLc2k5eTBrOVVNUXFPcStaWHQwa3VrUVZFZEQ4b1ZXYU1CamZqaUF2TWtFU0kKK0RLdDRJWHZGblFlTEo1SHpJbUgrNmIyMG9YeEVCSWdZRXZwODZTOGwydFVha2hhSjUyT05oTk1WekRLMEhvMHcKK2VrQzZOa1JvWjJnbFN3UisxRy8vNVVJUElYQWJJV3YrRUZ4Y09tNHNGdER1VDU1SkFkY0NBd0VBQWFOUU1FNHcKK0hRWURWUjBPQkJZRUZEcTF2ZCtyalhGMzl4Ny9MT3V5MHk5UzFpRE9NQjhHQTFVZEl3UVlNQmFBRkRxMXZkK3IKK2pYRjM5eDcvTE91eTB5OVMxaURPTUF3R0ExVWRFd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVGQlFBRGdZRUEKK0t5a2dwZDN4Qjdrb1hhTVJSU0FjVXEvWm5CVlBFdGt0T3hKOVZGdjNlRmxHK1RyZDUvVkpxUCtGT1lPZWNBNjIKK2F1NFBuWnlDdnkwVngyWTB5V0w4ZHhGdzYyTlpjK3pSZm4yR0piRDYwYTlmVXVmTk5kV1ovTkp2ZXE5WlVjd2UKK2RsdFU1N09GYXhNR2lWUjFnbmwwSHFTZXp2d2NRdlNHZm5idjFqTEpIbFE9CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCmRpZmYgLS1naXQgYS9kb2Mvc2luZ2xlX2hvc3QvY2FrZXkucGVtIGIvZG9jL3NpbmdsZV9ob3N0L2Nha2V5LnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTBmY2JkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NpbmdsZV9ob3N0L2Nha2V5LnBlbQpAQCAtMCwwICsxLDE2IEBACistLS0tLUJFR0lOIFBSSVZBVEUgS0VZLS0tLS0KK01JSUNkd0lCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQW1Fd2dnSmRBZ0VBQW9HQkFLaXlhVHUrc2w3dkNySXYKK2N0SlBWREVLanF2bVY3ZEpMcEVGUkhRL0tGVm1qQVkzNDRnTHpKQkVpQXlyZUNGN3haMEhpeWVSOHlKaC91bTkKK3RLRjhSQVNJR0JMNmZPa3ZKZHJWR3BJV2llZGpqWVRURmN3eXRCNk5NSHBBdWpaRWFHZG9KVXNFZnRSdi8rVkMKK0R5RndHeUZyL2hCY1hEcHVMQmJRN2srZVNRSFhBZ01CQUFFQ2dZRUFnWWI3WmZRMTRNNkoxK2Eyc3VSV01KRjYKK21tSnlWempKbUhBQzczN082VU9qbitLcHdYdk54YmZZL21GcUM4dU5IOVQ2ODVjTXFBbTJRS0o0WHNXYk11QUoKK0htUFd3QjRaTXhna3lGeVBXbDk5SWFDdVlSampkTlZJYWpXSkI2bi83a056QS91U3ZFSDM4N0wxTDhhV1pmdjYKK3JJQWhTdVYrdU5aUjdZSGJOd0VDUVFEYVEzS3ArT3JkcTZmc1RnbzF2K2UvVHZZL0hwWklkMTBielJxRjV3WXIKK29TMjJXT3BoS2Zab1lnSTl3WndML090ME5QbGUwWjYzdk40SlVBRm0wdldKQWtFQXhkMFppSDN6SkZXNTNMWTUKK2tMd0xTWnZxZlJldUJlUE1UbEcyZ3ZmK2x6dlVBb29waWJ6djFRdm8wbkQvUkZkSit1QVZKUWY4OHpETUZoMGIKK0ZDdkVYd0pCQU5oTysvYUQ0SkFyck5JK1RWUVRpbU5JcURiSjQzcVNBVTZxS0YwSUprOWEvMmkyR2lLTmFjenQKK1JQZGJSNEdCK1A5RCtOZ0Z1dHl4YXdPanJKL3c5ckVDUUcvVXZHYXgwU2U3TUJaNEErY3k4U3BFYm04UFlETkMKK0FpcE44dHJwTWNMbWRMaU93RlZ5TFJkNzZMWndXVWFXRTJFeEg2SlRkbnM1SEZCdldPdTRwUDhDUUhhRmNlaDYKKzVKQW1XU3NycW8zOS8yREZUT0JHeUxrK1ptSDN4STlWT3Y3SVUvdWdXcHIxbDJLRkh3UUw3ZkJTRDMrUWM2QUwKK1prOTdFUEliVGRMVThyND0KKy0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0KZGlmZiAtLWdpdCBhL2RvYy9zaW5nbGVfaG9zdC9kZW1vQ0EvaW5kZXgudHh0IGIvZG9jL3NpbmdsZV9ob3N0L2RlbW9DQS9pbmRleC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBiMzkxOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zaW5nbGVfaG9zdC9kZW1vQ0EvaW5kZXgudHh0CkBAIC0wLDAgKzEsMiBAQAorVgkxODA2MDExOTM3MTRaCQkwMQl1bmtub3duCS9DPUZSL1NUPUJkUi9PPWZEL09VPVRlc3RzL0NOPXBlZXIxLmxvY2FsZG9tYWluCitWCTE4MDYwMTE5MzcxNFoJCTAyCXVua25vd24JL0M9RlIvU1Q9QmRSL089ZkQvT1U9VGVzdHMvQ049cGVlcjIubG9jYWxkb21haW4KZGlmZiAtLWdpdCBhL2RvYy9zaW5nbGVfaG9zdC9kZW1vQ0EvaW5kZXgudHh0LmF0dHIgYi9kb2Mvc2luZ2xlX2hvc3QvZGVtb0NBL2luZGV4LnR4dC5hdHRyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmN2U2M2EKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2luZ2xlX2hvc3QvZGVtb0NBL2luZGV4LnR4dC5hdHRyCkBAIC0wLDAgKzEgQEAKK3VuaXF1ZV9zdWJqZWN0ID0geWVzCmRpZmYgLS1naXQgYS9kb2Mvc2luZ2xlX2hvc3QvZGVtb0NBL2luZGV4LnR4dC5hdHRyLm9sZCBiL2RvYy9zaW5nbGVfaG9zdC9kZW1vQ0EvaW5kZXgudHh0LmF0dHIub2xkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmN2U2M2EKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2luZ2xlX2hvc3QvZGVtb0NBL2luZGV4LnR4dC5hdHRyLm9sZApAQCAtMCwwICsxIEBACit1bmlxdWVfc3ViamVjdCA9IHllcwpkaWZmIC0tZ2l0IGEvZG9jL3NpbmdsZV9ob3N0L2RlbW9DQS9pbmRleC50eHQub2xkIGIvZG9jL3NpbmdsZV9ob3N0L2RlbW9DQS9pbmRleC50eHQub2xkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMTkxOTUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2luZ2xlX2hvc3QvZGVtb0NBL2luZGV4LnR4dC5vbGQKQEAgLTAsMCArMSBAQAorVgkxODA2MDExOTM3MTRaCQkwMQl1bmtub3duCS9DPUZSL1NUPUJkUi9PPWZEL09VPVRlc3RzL0NOPXBlZXIxLmxvY2FsZG9tYWluCmRpZmYgLS1naXQgYS9kb2Mvc2luZ2xlX2hvc3QvZGVtb0NBL3NlcmlhbCBiL2RvYy9zaW5nbGVfaG9zdC9kZW1vQ0Evc2VyaWFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MDE2ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2luZ2xlX2hvc3QvZGVtb0NBL3NlcmlhbApAQCAtMCwwICsxIEBACiswMwpkaWZmIC0tZ2l0IGEvZG9jL3NpbmdsZV9ob3N0L2ZyZWVEaWFtZXRlci0xLmNvbmYgYi9kb2Mvc2luZ2xlX2hvc3QvZnJlZURpYW1ldGVyLTEuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDM0NGY5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NpbmdsZV9ob3N0L2ZyZWVEaWFtZXRlci0xLmNvbmYKQEAgLTAsMCArMSwxNiBAQAorCisjIC0tLS0tLS0tIFRlc3QgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0KKworSWRlbnRpdHkgPSAicGVlcjEubG9jYWxkb21haW4iOworUmVhbG0gPSAibG9jYWxkb21haW4iOworIyBQb3J0ID0gMzg2ODsKKyMgU2VjUG9ydCA9IDM4Njk7CisKK1RMU19DcmVkID0gInBlZXIxLmNlcnQucGVtIiwKKwkgICAicGVlcjEua2V5LnBlbSI7CitUTFNfQ0EgPSAiY2FjZXJ0LnBlbSI7CisKK0xvYWRFeHRlbnNpb24gPSAiZXh0ZW5zaW9ucy90ZXN0X2FwcC5mZHgiIDogInRlc3RfYXBwMS5jb25mIjsKKworQ29ubmVjdFBlZXIgPSAicGVlcjIubG9jYWxkb21haW4iIHsgQ29ubmVjdFRvID0gIjEyNy4wLjAuMSI7IE5vX1RMUzsgcG9ydCA9IDMwODY4OyB9OworCmRpZmYgLS1naXQgYS9kb2Mvc2luZ2xlX2hvc3QvZnJlZURpYW1ldGVyLTIuY29uZiBiL2RvYy9zaW5nbGVfaG9zdC9mcmVlRGlhbWV0ZXItMi5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MWU5ODgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2luZ2xlX2hvc3QvZnJlZURpYW1ldGVyLTIuY29uZgpAQCAtMCwwICsxLDE1IEBACisjIC0tLS0tLS0tIFRlc3QgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0KKworSWRlbnRpdHkgPSAicGVlcjIubG9jYWxkb21haW4iOworUmVhbG0gPSAibG9jYWxkb21haW4iOworUG9ydCA9IDMwODY4OworU2VjUG9ydCA9IDMwODY5OworCitUTFNfQ3JlZCA9ICJwZWVyMi5jZXJ0LnBlbSIsCisJICAgInBlZXIyLmtleS5wZW0iOworVExTX0NBID0gImNhY2VydC5wZW0iOworCitMb2FkRXh0ZW5zaW9uID0gImV4dGVuc2lvbnMvdGVzdF9hcHAuZmR4IiA6ICJ0ZXN0X2FwcDIuY29uZiI7CisKK0Nvbm5lY3RQZWVyID0gInBlZXIxLmxvY2FsZG9tYWluIiB7IENvbm5lY3RUbyA9ICIxMjcuMC4wLjEiOyBOb19UTFM7IH07CisKZGlmZiAtLWdpdCBhL2RvYy9zaW5nbGVfaG9zdC9tYWtlX2NlcnRzLnNoIGIvZG9jL3NpbmdsZV9ob3N0L21ha2VfY2VydHMuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y0MjQ4YgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zaW5nbGVfaG9zdC9tYWtlX2NlcnRzLnNoCkBAIC0wLDAgKzEsMjAgQEAKK3JtIC1yZiBkZW1vQ0EKK21rZGlyIGRlbW9DQQorZWNobyAwMSA+IGRlbW9DQS9zZXJpYWwKK3RvdWNoIGRlbW9DQS9pbmRleC50eHQKKworCisKKyMgQ0Egc2VsZiBjZXJ0aWZpY2F0ZQorb3BlbnNzbCByZXEgIC1uZXcgLWJhdGNoIC14NTA5IC1kYXlzIDM2NTAgLW5vZGVzIC1uZXdrZXkgcnNhOjEwMjQgLW91dCBjYWNlcnQucGVtIC1rZXlvdXQgY2FrZXkucGVtIC1zdWJqIC9DTj1jYS5sb2NhbGRvbWFpbi9DPUZSL1NUPUJkUi9MPUFpeC9PPWZEL09VPVRlc3RzCisKKyNwZWVyMQorb3BlbnNzbCBnZW5yc2EgLW91dCBwZWVyMS5rZXkucGVtIDEwMjQKK29wZW5zc2wgcmVxIC1uZXcgLWJhdGNoIC1vdXQgcGVlcjEuY3NyLnBlbSAta2V5IHBlZXIxLmtleS5wZW0gLXN1YmogL0NOPXBlZXIxLmxvY2FsZG9tYWluL0M9RlIvU1Q9QmRSL0w9QWl4L089ZkQvT1U9VGVzdHMKK29wZW5zc2wgY2EgLWNlcnQgY2FjZXJ0LnBlbSAta2V5ZmlsZSBjYWtleS5wZW0gLWluIHBlZXIxLmNzci5wZW0gLW91dCBwZWVyMS5jZXJ0LnBlbSAtb3V0ZGlyIC4gLWJhdGNoCisKKyNwZWVyMgorb3BlbnNzbCBnZW5yc2EgLW91dCBwZWVyMi5rZXkucGVtIDEwMjQKK29wZW5zc2wgcmVxIC1uZXcgLWJhdGNoIC1vdXQgcGVlcjIuY3NyLnBlbSAta2V5IHBlZXIyLmtleS5wZW0gLXN1YmogL0NOPXBlZXIyLmxvY2FsZG9tYWluL0M9RlIvU1Q9QmRSL0w9QWl4L089ZkQvT1U9VGVzdHMKK29wZW5zc2wgY2EgLWNlcnQgY2FjZXJ0LnBlbSAta2V5ZmlsZSBjYWtleS5wZW0gLWluIHBlZXIyLmNzci5wZW0gLW91dCBwZWVyMi5jZXJ0LnBlbSAtb3V0ZGlyIC4gLWJhdGNoCisKZGlmZiAtLWdpdCBhL2RvYy9zaW5nbGVfaG9zdC9wZWVyMS5jZXJ0LnBlbSBiL2RvYy9zaW5nbGVfaG9zdC9wZWVyMS5jZXJ0LnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTM1MWE4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NpbmdsZV9ob3N0L3BlZXIxLmNlcnQucGVtCkBAIC0wLDAgKzEsNjAgQEAKK0NlcnRpZmljYXRlOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDMgKDB4MikKKyAgICAgICAgU2VyaWFsIE51bWJlcjogMSAoMHgxKQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IENOPWNhLmxvY2FsZG9tYWluLCBDPUZSLCBTVD1CZFIsIEw9QWl4LCBPPWZELCBPVT1UZXN0cworICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogSnVuICAxIDE5OjM3OjE0IDIwMTcgR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBKdW4gIDEgMTk6Mzc6MTQgMjAxOCBHTVQKKyAgICAgICAgU3ViamVjdDogQz1GUiwgU1Q9QmRSLCBPPWZELCBPVT1UZXN0cywgQ049cGVlcjEubG9jYWxkb21haW4KKyAgICAgICAgU3ViamVjdCBQdWJsaWMgS2V5IEluZm86CisgICAgICAgICAgICBQdWJsaWMgS2V5IEFsZ29yaXRobTogcnNhRW5jcnlwdGlvbgorICAgICAgICAgICAgICAgIFB1YmxpYy1LZXk6ICgxMDI0IGJpdCkKKyAgICAgICAgICAgICAgICBNb2R1bHVzOgorICAgICAgICAgICAgICAgICAgICAwMDpjMDplNDpmMzphYzpiYjo0OTpiZjo0MzpkMzozZTpiNjo2Njo2MDowYToKKyAgICAgICAgICAgICAgICAgICAgOTQ6ZmY6ZTM6YTk6MDc6Y2Y6NTk6Mjg6OGQ6ZjI6OWU6YmQ6OTY6YTk6N2Q6CisgICAgICAgICAgICAgICAgICAgIDEwOmU0OjlmOmY1OmZiOjE3OmVjOmQ5OjE2OmQyOjBmOjhkOjgyOjNlOjE4OgorICAgICAgICAgICAgICAgICAgICBhOTozODo5NzpmOTplNDphYzplMzo3MjpmOTpjMzpkZjo4YTpkMjplOTo4ODoKKyAgICAgICAgICAgICAgICAgICAgNjc6YzE6NzA6MTQ6OTQ6MDI6M2I6YmE6OGM6Yjg6M2U6OWQ6ZDE6YmY6ZjM6CisgICAgICAgICAgICAgICAgICAgIGU2OmExOjkxOmMyOmVlOjg3OjgwOjNkOmI4Ojk5OjMzOjgyOjJkOmJkOjFiOgorICAgICAgICAgICAgICAgICAgICAyNzo5YzpmNTpiNjo2NDpiNDo1NTpiNzo5NjozMTpjMDo4MTo4Yjo0NjpjMToKKyAgICAgICAgICAgICAgICAgICAgYzA6Yzc6N2E6NDM6Mzk6MDI6MWE6OGY6NmE6ZTM6MGE6ZDc6Zjc6Nzk6MDc6CisgICAgICAgICAgICAgICAgICAgIGFiOjM1OmM1OjQzOjY0OjIzOmQwOjYyOjA1CisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgICAgICBYNTA5djMgZXh0ZW5zaW9uczoKKyAgICAgICAgICAgIFg1MDl2MyBCYXNpYyBDb25zdHJhaW50czogCisgICAgICAgICAgICAgICAgQ0E6RkFMU0UKKyAgICAgICAgICAgIE5ldHNjYXBlIENvbW1lbnQ6IAorICAgICAgICAgICAgICAgIE9wZW5TU0wgR2VuZXJhdGVkIENlcnRpZmljYXRlCisgICAgICAgICAgICBYNTA5djMgU3ViamVjdCBLZXkgSWRlbnRpZmllcjogCisgICAgICAgICAgICAgICAgMzU6Rjg6NEE6Qzk6QTk6NTY6RUE6OTk6NUQ6NTg6NDE6RTc6OTA6Nzg6ODM6MjM6MDI6OTU6MEE6M0MKKyAgICAgICAgICAgIFg1MDl2MyBBdXRob3JpdHkgS2V5IElkZW50aWZpZXI6IAorICAgICAgICAgICAgICAgIGtleWlkOjNBOkI1OkJEOkRGOkFCOjhEOjcxOjc3OkY3OjFFOkZGOjJDOkVCOkIyOkQzOjJGOjUyOkQ2OjIwOkNFCisKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgIDJiOmUyOmM2OjMzOjhhOmZjOmIzOmQ2OjU1OmQ2OjE2OmQ0OmY3OjJkOmQ4OjQ5Ojc4OjZhOgorICAgICAgICAgZjQ6MTI6ZWM6MjY6ODI6MmQ6MTU6NzM6Nzg6Yjc6NGU6MzQ6Mzk6Yzc6MGY6MjU6M2M6NzM6CisgICAgICAgICBhMzoxMzpiODpjMTo1YzpiNjphNDo3Njo3ODo3MTo2NjowZjo2YTpmNDo1MzpiOTo4MDpmNzoKKyAgICAgICAgIDQxOmRkOjVmOjBkOjdkOjdiOmQzOmI2OmQ2OjhlOmZiOjgxOjZmOjU3OjI0OmQ3OmFjOjVhOgorICAgICAgICAgNTI6NjY6Y2E6NDg6YTk6Mzc6ZGI6N2U6MDc6YjI6ZWU6OGM6ODE6YTY6ZTY6OWM6YjM6NDA6CisgICAgICAgICBmMjpmMDoyZDo1NzpkNToyMDozNzoyMDo1YzoyMzo5Yzo1ZTo1ODpjOTowYzpjNzo4ODowMjoKKyAgICAgICAgIGU3OmExOjE1OjlhOjA4OmNmOmZkOmMwOjdhOjk3OmEyOjNhOmExOjgyOjE5OjQxOjg2OjRmOgorICAgICAgICAgYWY6M2UKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJQ3BEQ0NBZzJnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFVRkFEQmZNUmN3RlFZRFZRUUREQTVqWVM1cworYjJOaGJHUnZiV0ZwYmpFTE1Ba0dBMVVFQmhNQ1JsSXhEREFLQmdOVkJBZ01BMEprVWpFTU1Bb0dBMVVFQnd3RAorUVdsNE1Rc3dDUVlEVlFRS0RBSm1SREVPTUF3R0ExVUVDd3dGVkdWemRITXdIaGNOTVRjd05qQXhNVGt6TnpFMAorV2hjTk1UZ3dOakF4TVRrek56RTBXakJVTVFzd0NRWURWUVFHRXdKR1VqRU1NQW9HQTFVRUNBd0RRbVJTTVFzdworQ1FZRFZRUUtEQUptUkRFT01Bd0dBMVVFQ3d3RlZHVnpkSE14R2pBWUJnTlZCQU1NRVhCbFpYSXhMbXh2WTJGcworWkc5dFlXbHVNSUdmTUEwR0NTcUdTSWIzRFFFQkFRVUFBNEdOQURDQmlRS0JnUURBNVBPc3UwbS9ROU0rdG1aZworQ3BULzQ2a0h6MWtvamZLZXZaYXBmUkRrbi9YN0YrelpGdElQallJK0dLazRsL25rck9OeStjUGZpdExwaUdmQgorY0JTVUFqdTZqTGcrbmRHLzgrYWhrY0x1aDRBOXVKa3pnaTI5R3llYzliWmt0RlczbGpIQWdZdEd3Y0RIZWtNNQorQWhxUGF1TUsxL2Q1QjZzMXhVTmtJOUJpQlFJREFRQUJvM3N3ZVRBSkJnTlZIUk1FQWpBQU1Dd0dDV0NHU0FHRworK0VJQkRRUWZGaDFQY0dWdVUxTk1JRWRsYm1WeVlYUmxaQ0JEWlhKMGFXWnBZMkYwWlRBZEJnTlZIUTRFRmdRVQorTmZoS3lhbFc2cGxkV0VIbmtIaURJd0tWQ2p3d0h3WURWUjBqQkJnd0ZvQVVPclc5MzZ1TmNYZjNIdjhzNjdMVAorTDFMV0lNNHdEUVlKS29aSWh2Y05BUUVGQlFBRGdZRUFLK0xHTTRyOHM5WlYxaGJVOXkzWVNYaHE5QkxzSm9JdAorRlhONHQwNDBPY2NQSlR4em94TzR3VnkycEhaNGNXWVBhdlJUdVlEM1FkMWZEWDE3MDdiV2p2dUJiMWNrMTZ4YQorVW1iS1NLazMyMzRIc3U2TWdhYm1uTE5BOHZBdFY5VWdOeUJjSTV4ZVdNa014NGdDNTZFVm1nalAvY0I2bDZJNgorb1lJWlFZWlByejQ9CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCmRpZmYgLS1naXQgYS9kb2Mvc2luZ2xlX2hvc3QvcGVlcjEuY3NyLnBlbSBiL2RvYy9zaW5nbGVfaG9zdC9wZWVyMS5jc3IucGVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNzUzM2EKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2luZ2xlX2hvc3QvcGVlcjEuY3NyLnBlbQpAQCAtMCwwICsxLDExIEBACistLS0tLUJFR0lOIENFUlRJRklDQVRFIFJFUVVFU1QtLS0tLQorTUlJQm9qQ0NBUXNDQVFBd1lqRWFNQmdHQTFVRUF3d1JjR1ZsY2pFdWJHOWpZV3hrYjIxaGFXNHhDekFKQmdOVgorQkFZVEFrWlNNUXd3Q2dZRFZRUUlEQU5DWkZJeEREQUtCZ05WQkFjTUEwRnBlREVMTUFrR0ExVUVDZ3dDWmtReAorRGpBTUJnTlZCQXNNQlZSbGMzUnpNSUdmTUEwR0NTcUdTSWIzRFFFQkFRVUFBNEdOQURDQmlRS0JnUURBNVBPcwordTBtL1E5TSt0bVpnQ3BULzQ2a0h6MWtvamZLZXZaYXBmUkRrbi9YN0YrelpGdElQallJK0dLazRsL25rck9OeQorK2NQZml0THBpR2ZCY0JTVUFqdTZqTGcrbmRHLzgrYWhrY0x1aDRBOXVKa3pnaTI5R3llYzliWmt0RlczbGpIQQorZ1l0R3djREhla001QWhxUGF1TUsxL2Q1QjZzMXhVTmtJOUJpQlFJREFRQUJvQUF3RFFZSktvWklodmNOQVFFRgorQlFBRGdZRUFZaEpoOWFoNkhSTGtyNXljRWFMdEdVT3M5dkQ3R1lpVVNWOWlsSWljOS9XQ0doK0tpTDU5V3EzMAorRTEzWnJMSGY2b3FqSkRPcUhtU1JEYkc5d3M1Z2lsWWRHZGYrQXUvbUF1dG12T3dyVFZuQU90WXpBcUpQS1RpbgorL0piYmVkZlNPRlV1YytJaStxUkNwdlhkZnJpQlpHUkdmVkJRWWp3eXdyUXovSUpRK29FPQorLS0tLS1FTkQgQ0VSVElGSUNBVEUgUkVRVUVTVC0tLS0tCmRpZmYgLS1naXQgYS9kb2Mvc2luZ2xlX2hvc3QvcGVlcjEua2V5LnBlbSBiL2RvYy9zaW5nbGVfaG9zdC9wZWVyMS5rZXkucGVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiY2E4NDcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2luZ2xlX2hvc3QvcGVlcjEua2V5LnBlbQpAQCAtMCwwICsxLDE1IEBACistLS0tLUJFR0lOIFJTQSBQUklWQVRFIEtFWS0tLS0tCitNSUlDWEFJQkFBS0JnUURBNVBPc3UwbS9ROU0rdG1aZ0NwVC80NmtIejFrb2pmS2V2WmFwZlJEa24vWDdGK3paCitGdElQallJK0dLazRsL25rck9OeStjUGZpdExwaUdmQmNCU1VBanU2akxnK25kRy84K2Foa2NMdWg0QTl1Smt6CitnaTI5R3llYzliWmt0RlczbGpIQWdZdEd3Y0RIZWtNNUFocVBhdU1LMS9kNUI2czF4VU5rSTlCaUJRSURBUUFCCitBb0dCQUxML3cyQTNMR2hnK0ZicHpIYXpXekZhZ2pETktWK0kyZXlVNG9yRmxEZVVlUjlaUkdEdjNGNnlZbnBkCitTQ3RNWElqb0p1azYvWmtqcWpVc2I1d0I5aFVHek9uOHBaNmxjZFl4WVlRcHhjSjdnRm50REZRRjZFbkJYUi9SCitXcGJwWExIaWdKdHFleTFJaTZEQk9BaXlMdERvalZWL3MyeVllbzJwMGZIa210b0JBa0VBMy9IKy9ScmdsQ1l5CitjZTNSSVBBT0REek5LMWVzQkkxQ1VpUlo0OUNJYTQzOHJiQitRMlZ0WWsxWXBZQkdUN3FPYVhpRlhpMU9ybFZGCiszS0JreTRSYWVRSkJBTnlCS0xJOEVMMXRWczR1TXpKWkRpUFVqcnhnQ055c21xczIrM3VHL3ZRSnI3czhHUzMwCit0Ny9LMEtNNHhSL3NTRXlFLzVoVVVUcEJ4ZitKbjlCbG9PMENRRnl4RjIrL3pqREQxcUZkWS9BVUxGeFlWanVZCitZRFRLR3lkUXNId2c5alkrWU5XcmRiZURwZERJWHVheHYyaUV1U2xpbnlFcDg2VW8ybS9GVzdMNUoxRUNRQS9ZCitBL21Ta1UxYkh1S2Z0VFFIN0Jrcys3aVRXZStwUTAvTUdwUE1wbU1Za3hUc0E0OG14MUV6bkh3dDV4UWRJVERHCitXYXN6VzhiSTFSWkFhRWhNRlIwQ1FBdHZmNDlHc3FOWnd2RVpZTmdVWkR4eDc0YTJqeWRFK3RZN202NmN4Y1pJCitiRGFiUlBoU29ncm5lRWxBVFB0T1ZSSHM2ZTVJU0ZiWTloNkwxNXNEUXpVPQorLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0KZGlmZiAtLWdpdCBhL2RvYy9zaW5nbGVfaG9zdC9wZWVyMi5jZXJ0LnBlbSBiL2RvYy9zaW5nbGVfaG9zdC9wZWVyMi5jZXJ0LnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjVlZWNiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NpbmdsZV9ob3N0L3BlZXIyLmNlcnQucGVtCkBAIC0wLDAgKzEsNjAgQEAKK0NlcnRpZmljYXRlOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDMgKDB4MikKKyAgICAgICAgU2VyaWFsIE51bWJlcjogMiAoMHgyKQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IENOPWNhLmxvY2FsZG9tYWluLCBDPUZSLCBTVD1CZFIsIEw9QWl4LCBPPWZELCBPVT1UZXN0cworICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogSnVuICAxIDE5OjM3OjE0IDIwMTcgR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBKdW4gIDEgMTk6Mzc6MTQgMjAxOCBHTVQKKyAgICAgICAgU3ViamVjdDogQz1GUiwgU1Q9QmRSLCBPPWZELCBPVT1UZXN0cywgQ049cGVlcjIubG9jYWxkb21haW4KKyAgICAgICAgU3ViamVjdCBQdWJsaWMgS2V5IEluZm86CisgICAgICAgICAgICBQdWJsaWMgS2V5IEFsZ29yaXRobTogcnNhRW5jcnlwdGlvbgorICAgICAgICAgICAgICAgIFB1YmxpYy1LZXk6ICgxMDI0IGJpdCkKKyAgICAgICAgICAgICAgICBNb2R1bHVzOgorICAgICAgICAgICAgICAgICAgICAwMDpjZjpmYTo4YTpkMTpmYzplZTpjMjoxYzo1ZDo1NDpkZDoxNDo1MzpmMToKKyAgICAgICAgICAgICAgICAgICAgN2M6ZDI6YTc6Mzk6M2Y6ZTU6YzE6Mzc6Yzg6MDg6ODQ6NjI6NzU6Nzg6MjU6CisgICAgICAgICAgICAgICAgICAgIDg5OmZiOjg4OjIwOjVkOjk1OmRmOjkyOjI4OjQzOmQwOjNiOjliOjZhOmQwOgorICAgICAgICAgICAgICAgICAgICBkNTo1YjpiOTpiYzowZDozODo0YTpjODpkZDoyZTo4Mjo0MDo4MDpkMDowYzoKKyAgICAgICAgICAgICAgICAgICAgMjU6ZTg6OGM6NTI6MDM6OGU6ZWI6NmQ6ZWQ6Nzk6M2U6NTA6Zjk6NGQ6YWU6CisgICAgICAgICAgICAgICAgICAgIDJjOjYzOjUyOjAxOjJjOjFkOmMwOjg5OjkwOjY5OmNmOjkzOjBhOjBmOjMyOgorICAgICAgICAgICAgICAgICAgICBhODo1MDpjMDoyZToyZTpmYTplNDpjZDoyMzoxOTphYjo1ODoxOToxYzpmMjoKKyAgICAgICAgICAgICAgICAgICAgZjI6NDk6YzE6NDI6ZDY6MWQ6NWE6MTk6OTI6MTg6ZmM6Yzk6YzI6YTk6M2U6CisgICAgICAgICAgICAgICAgICAgIDFkOjdiOjMyOmIwOjc2OmUwOjg5Ojk0OmVmCisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgICAgICBYNTA5djMgZXh0ZW5zaW9uczoKKyAgICAgICAgICAgIFg1MDl2MyBCYXNpYyBDb25zdHJhaW50czogCisgICAgICAgICAgICAgICAgQ0E6RkFMU0UKKyAgICAgICAgICAgIE5ldHNjYXBlIENvbW1lbnQ6IAorICAgICAgICAgICAgICAgIE9wZW5TU0wgR2VuZXJhdGVkIENlcnRpZmljYXRlCisgICAgICAgICAgICBYNTA5djMgU3ViamVjdCBLZXkgSWRlbnRpZmllcjogCisgICAgICAgICAgICAgICAgOEU6OTQ6RTA6Q0U6M0U6OEQ6RDY6RkQ6NTE6Qzc6OTI6Q0Q6OUM6MkE6RDY6NUI6MUU6Njc6OUY6MjcKKyAgICAgICAgICAgIFg1MDl2MyBBdXRob3JpdHkgS2V5IElkZW50aWZpZXI6IAorICAgICAgICAgICAgICAgIGtleWlkOjNBOkI1OkJEOkRGOkFCOjhEOjcxOjc3OkY3OjFFOkZGOjJDOkVCOkIyOkQzOjJGOjUyOkQ2OjIwOkNFCisKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgIDMwOjZiOmQ0OmFlOjI1OmVlOjhhOmQ4OjBhOjZhOjRkOjUwOmNiOmJjOjA4OjVkOjFjOjNkOgorICAgICAgICAgYmE6NWI6YTk6OTc6NjM6OWE6MzM6NDc6MzY6YmM6ODg6NzE6Yjk6N2U6M2I6ZTQ6M2I6MTU6CisgICAgICAgICA1NzpiNTo1Mzo1ZDphYTplNjo1NjphOTpjYzo0MTpkZDpiYjoxODpmZToyMTowNDpiOTo5MToKKyAgICAgICAgIDE3OjU2OjE1OjAxOmZjOmEzOmUwOjcyOmI0OjAyOjc0OjFlOjg5OjZmOjRjOjEzOjNhOmFkOgorICAgICAgICAgMTI6OGI6ODg6YTc6MDk6Mzg6M2M6MDY6OWY6MjI6NjI6Yjg6MTA6MmM6ZmI6MTg6NDU6MWM6CisgICAgICAgICBhYTo2MTpiNzpmNjo5Mzo4Njo5ZDpmNDo1MTo5MjpiNTplZTpjNTo4MTo2Njo0MzpmMjphZToKKyAgICAgICAgIGFlOjU1OmI5OjViOmEyOjY4OmZiOmRkOjc4OjJjOjFiOjEyOmQ5OmNmOmZiOjJkOmRjOmY3OgorICAgICAgICAgMGY6MzkKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJQ3BEQ0NBZzJnQXdJQkFnSUJBakFOQmdrcWhraUc5dzBCQVFVRkFEQmZNUmN3RlFZRFZRUUREQTVqWVM1cworYjJOaGJHUnZiV0ZwYmpFTE1Ba0dBMVVFQmhNQ1JsSXhEREFLQmdOVkJBZ01BMEprVWpFTU1Bb0dBMVVFQnd3RAorUVdsNE1Rc3dDUVlEVlFRS0RBSm1SREVPTUF3R0ExVUVDd3dGVkdWemRITXdIaGNOTVRjd05qQXhNVGt6TnpFMAorV2hjTk1UZ3dOakF4TVRrek56RTBXakJVTVFzd0NRWURWUVFHRXdKR1VqRU1NQW9HQTFVRUNBd0RRbVJTTVFzdworQ1FZRFZRUUtEQUptUkRFT01Bd0dBMVVFQ3d3RlZHVnpkSE14R2pBWUJnTlZCQU1NRVhCbFpYSXlMbXh2WTJGcworWkc5dFlXbHVNSUdmTUEwR0NTcUdTSWIzRFFFQkFRVUFBNEdOQURDQmlRS0JnUURQK29yUi9PN0NIRjFVM1JSVAorOFh6U3B6ay81Y0UzeUFpRVluVjRKWW43aUNCZGxkK1NLRVBRTzV0cTBOVmJ1YndOT0VySTNTNkNRSURRRENYbworakZJRGp1dHQ3WGsrVVBsTnJpeGpVZ0VzSGNDSmtHblBrd29QTXFoUXdDNHUrdVROSXhtcldCa2M4dkpKd1VMVworSFZvWmtoajh5Y0twUGgxN01yQjI0SW1VN3dJREFRQUJvM3N3ZVRBSkJnTlZIUk1FQWpBQU1Dd0dDV0NHU0FHRworK0VJQkRRUWZGaDFQY0dWdVUxTk1JRWRsYm1WeVlYUmxaQ0JEWlhKMGFXWnBZMkYwWlRBZEJnTlZIUTRFRmdRVQoranBUZ3pqNk4xdjFSeDVMTm5DcldXeDVubnljd0h3WURWUjBqQkJnd0ZvQVVPclc5MzZ1TmNYZjNIdjhzNjdMVAorTDFMV0lNNHdEUVlKS29aSWh2Y05BUUVGQlFBRGdZRUFNR3ZVcmlYdWl0Z0thazFReTd3SVhSdzl1bHVwbDJPYQorTTBjMnZJaHh1WDQ3NURzVlY3VlRYYXJtVnFuTVFkMjdHUDRoQkxtUkYxWVZBZnlqNEhLMEFuUWVpVzlNRXpxdAorRW91SXB3azRQQWFmSW1LNEVDejdHRVVjcW1HMzlwT0duZlJSa3JYdXhZRm1RL0t1cmxXNVc2Sm8rOTE0TEJzUworMmMvN0xkejNEems9CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCmRpZmYgLS1naXQgYS9kb2Mvc2luZ2xlX2hvc3QvcGVlcjIuY3NyLnBlbSBiL2RvYy9zaW5nbGVfaG9zdC9wZWVyMi5jc3IucGVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNTE3NGIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2luZ2xlX2hvc3QvcGVlcjIuY3NyLnBlbQpAQCAtMCwwICsxLDExIEBACistLS0tLUJFR0lOIENFUlRJRklDQVRFIFJFUVVFU1QtLS0tLQorTUlJQm9qQ0NBUXNDQVFBd1lqRWFNQmdHQTFVRUF3d1JjR1ZsY2pJdWJHOWpZV3hrYjIxaGFXNHhDekFKQmdOVgorQkFZVEFrWlNNUXd3Q2dZRFZRUUlEQU5DWkZJeEREQUtCZ05WQkFjTUEwRnBlREVMTUFrR0ExVUVDZ3dDWmtReAorRGpBTUJnTlZCQXNNQlZSbGMzUnpNSUdmTUEwR0NTcUdTSWIzRFFFQkFRVUFBNEdOQURDQmlRS0JnUURQK29yUgorL083Q0hGMVUzUlJUOFh6U3B6ay81Y0UzeUFpRVluVjRKWW43aUNCZGxkK1NLRVBRTzV0cTBOVmJ1YndOT0VySQorM1M2Q1FJRFFEQ1hvakZJRGp1dHQ3WGsrVVBsTnJpeGpVZ0VzSGNDSmtHblBrd29QTXFoUXdDNHUrdVROSXhtcgorV0JrYzh2Skp3VUxXSFZvWmtoajh5Y0twUGgxN01yQjI0SW1VN3dJREFRQUJvQUF3RFFZSktvWklodmNOQVFFRgorQlFBRGdZRUFReis1QUxNT2JGUHY5UEFWbmpiaDJNUTJQcXRKZWFGeGkwckZLQ2tBNHNmV2ZZdkI1eks1UHg5aQorSjk0WjdyUnJSb2NOYVR6K29rNkpzVW43TjFhRWphVTN5SnExY1JJN0cycHFybzd6MUNNRnZNS1FsQk5WcXVoNAorc3hyTTFtSFVuS1F2NUJ4OHhwcXVwMm9BTGswVW92Y1BHcnM2dVM5Rkc5Y0pIYUlSWVdRPQorLS0tLS1FTkQgQ0VSVElGSUNBVEUgUkVRVUVTVC0tLS0tCmRpZmYgLS1naXQgYS9kb2Mvc2luZ2xlX2hvc3QvcGVlcjIua2V5LnBlbSBiL2RvYy9zaW5nbGVfaG9zdC9wZWVyMi5rZXkucGVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNjE3YTgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2luZ2xlX2hvc3QvcGVlcjIua2V5LnBlbQpAQCAtMCwwICsxLDE1IEBACistLS0tLUJFR0lOIFJTQSBQUklWQVRFIEtFWS0tLS0tCitNSUlDWEFJQkFBS0JnUURQK29yUi9PN0NIRjFVM1JSVDhYelNwemsvNWNFM3lBaUVZblY0SlluN2lDQmRsZCtTCitLRVBRTzV0cTBOVmJ1YndOT0VySTNTNkNRSURRRENYb2pGSURqdXR0N1hrK1VQbE5yaXhqVWdFc0hjQ0prR25QCitrd29QTXFoUXdDNHUrdVROSXhtcldCa2M4dkpKd1VMV0hWb1praGo4eWNLcFBoMTdNckIyNEltVTd3SURBUUFCCitBb0dBVFlpcGwvOGpRMW92c1NONklKRTJaNUhQMWZKaFJkcGMwbjJpTFZoUlNHUkhMSnhpN0tuMkhmc2F4WWQxCitBdTBMSGlLT1ByTzJVdmlaRFBaNmEyZGtheU1oV1pSTmVWZE9NVUZxREdHL2IyWWZ4dVZuYTNKS3oyYmp4cVViCitpMjVGVytpQk8xOGMvNUZCZjF1WWtoNHp3cFlHR2J6bndYUGx4SEJCSGpUYUtvRUNRUURuaFgzRTBiVm5wMktxCitkbUpURURzdGZjV2NoUHV0eHdtVWtLU0c0bUUzK09nbHlFL1V5R21UMGlmYXNaVDVVbFZJc1J2Ung4NGZ0dXlQCitHclVBaUhGYkFrRUE1ZmZUeEZPUlBtZ2dLZEVFdW1xa2JxMUE5dTNmTWFUcFJGM3hpWk80TXhJREJXVVpkS1JmCitEL3ZwNzdSOEZReEk5bFFaUkdtRmZ1UUo5eThCTHd3Sy9RSkFWK3I2YXA1VUsrdUZiVVFOYkl1U1hXRVFoTEovCitQR3VEK05YQWxMUXN4T3VSaEo5L3FVYjl5TE9hak5LNHhzRDhQK0Y1dGYwUkNqd1ZzdllxVyt4MFZ3SkJBSkhCCitqQ1ZKV2l1Vno1enhiKysvbTh6U1h2U2pPKzI1T21nc3F1U3FEZnZBbE0yY2tJL1BocmtZeitNd0g5MHZWaWRhCitrbEU4R0hLZWtucHEvbk1WVFBrQ1FFK1ltWFZ1Znh5Vys1RjhwMDRMZE9HVWpyWFQ2dVF2M2gyNFFLU1ZZdG92CitwRko5dlVWcHBKc0lUSFJDOVYzWG5GTjZTMXRlaTh6aDh1MDR5WmhScVl3PQorLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0KZGlmZiAtLWdpdCBhL2RvYy9zaW5nbGVfaG9zdC90ZXN0X2FwcDEuY29uZiBiL2RvYy9zaW5nbGVfaG9zdC90ZXN0X2FwcDEuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NpbmdsZV9ob3N0L3Rlc3RfYXBwMS5jb25mCmRpZmYgLS1naXQgYS9kb2Mvc2luZ2xlX2hvc3QvdGVzdF9hcHAyLmNvbmYgYi9kb2Mvc2luZ2xlX2hvc3QvdGVzdF9hcHAyLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zaW5nbGVfaG9zdC90ZXN0X2FwcDIuY29uZgpkaWZmIC0tZ2l0IGEvZG9jL3Rlc3RfYXBwLmNvbmYuc2FtcGxlIGIvZG9jL3Rlc3RfYXBwLmNvbmYuc2FtcGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNjJlMjEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdGVzdF9hcHAuY29uZi5zYW1wbGUKQEAgLTAsMCArMSw3NCBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZXNjcmlwdGlvbiBvZiBjb25maWd1cmF0aW9uIGFuZCBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZQorIyAidGVzdF9hcHAiIGV4dGVuc2lvbi4KKworIyBUaGlzIGV4dGVuc2lvbiBwcm92aWRlcyBhIHNpbXBsZSB3YXkgdG8gc2VuZCBhIHByZWRlZmluZWQgbWVzc2FnZSBvdmVyIHRoZSBEaWFtZXRlciBOZXR3b3JrLgorIyBJdCBtYXkgYmUgdXNlZCB0byB0ZXN0IHRoZSBSb3V0aW5nIG9yIG90aGVyIGJhc2UgbWVjaGFuaXNtcyBmcm9tIHRoZSBEaWFtZXRlciBuZXR3b3JrLgorCisjIEluIG9yZGVyIHRvIGVuYWJsZSB0aGlzIGV4dGVuc2lvbiwgdGhlIG1haW4gZnJlZURpYW1ldGVyIGNvbmZpZ3VyYXRpb24gZmlsZQorIyBtdXN0IGNvbnRhaW4gdGhlIGZvbGxvd2luZyBkZWNsYXJhdGlvbjoKKyMgTG9hZEV4dGVuc2lvbiA9ICJleHRlbnNpb25zL2FwcF90ZXN0LmZkeCIgOiAiL3BhdGgvdG8vYXBwX3Rlc3QuY29uZiIgOworIyBOb3RlIHRoYXQgdGhlIGNvbmZmaWxlIG1heSBiZSBvbWl0dGVkLCBpbiB3aGljaCBjYXNlIGRlZmF1bHQgcGFyYW1ldGVycyB3aWxsIGJlIGFzc3VtZWQuCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvbmZpZ3VyYXRpb24gb2YgdGhlIHRlc3QgbWVzc2FnZQorCisjIFRoaXMgYXBwbGljYXRpb24gaXMgZGVmaW5lZCBhcyBhIFZlbmRvci1TcGVjaWZpYyBhcHBsaWNhdGlvbi4gCisjIFNpbmNlIGZyZWVEaWFtZXRlciBkb2VzIG5vdCBoYXZlIGEgSUFOQS1hc3NpZ25lZCBWZW5kb3IgSUQsIHdlIGxldCBhIGNvbmZpZ3VyYWJsZSB2YWx1ZSBoZXJlOgorIyB2ZW5kb3ItaWQgPSA5OTk5OTk7CisKKyMgVGhlIGFwcGxpY2F0aW9uIGlkLiBTYW1lIHJlbWFyayBhcyBwcmV2aW91c2x5LgorIyBhcHBsaS1pZCA9IDk5OTk5OTsKKworIyBUaGUgY29tbWFuZCBjb2RlIGZvciBUZXN0LVJlcXVlc3QgYW5kIFRlc3QtQW5zd2VyLiBUaGUgcmFuZ2UgMHhmZmZmZmUtZmZmZmZmIChkZWM6IDE2Nzc3MjE1KSBpcyByZXNlcnZlZCBmb3IgZXhwZXJpbWVudGFsIHVzZS4KKyMgY21kLWlkID0gMTY3NzcyMTQ7CisKKyMgVGhlIEFWUCBpZCBmb3IgdGhlIHRlc3QuCisjIGF2cC1pZCA9IDM0NTY3ODsKKworIyBBbm90aGVyIEFWUCBpZCBmb3IgbG9uZyBwYXlsb2FkIHRlc3QuIGRlZmF1bHQgdG8gdmFsdWUgMCwgbWVhbmluZyB0aGlzIGlzIG5vdCB1c2VkLgorIyBsb25nLWF2cC1pZCA9IDA7CisKKyMgRGVmaW5lIHRoZSBwYXlsb2FkIGxlbmd0aCBvZiB0aGUgbG9uZy1hdnAuIERlZmF1bHQgNTAwMCBieXRlcy4KKyMgbG9uZy1hdnAtbGVuID0gNTAwMDsKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb25maWd1cmF0aW9uIG9mIHRoZSBleHRlbnNpb24gYmVoYXZpb3IKKworIyBUaGUgbW9kZSBmb3IgdGhlIGV4dGVuc2lvbi4KKyMgLSBzZXJ2ZXI6IEFuc3dlciBpbmNvbWluZyByZXF1ZXN0cy4gVGhlIHNpZ25hbCBpcyBpZ25vcmVkLgorIyAtIGNsaWVudDogU2VuZCBhIHJlcXVlc3Qgd2hlbiB0aGUgc2lnbmFsIGlzIHJlY2VpdmVkLCBhbmQgbWVhc3VyZSB0aGUgdGltZSB0byByZWNlaXZpbmcgYW5zd2VyLgorIyAtIGJvdGg6IGFjdHMgYXMgY2xpZW50IGFuZCBzZXJ2ZXIKKyMgbW9kZSA9IGJvdGg7CisKKyMgVGhlIGJlaGF2aW9yIGNhbiBiZSBjaGFuZ2VkIGJ5IHNwZWNpZnlpbmcgYWRkaXRpb25hbCAiYmVuY2htYXJrOyIga2V5d29yZC4KKyMgV2hlbiB0aGlzIGtleXdvcmQgYXBwZWFycywgaXQgY2hhbmdlcyB0aGUgYmVoYXZpb3IgYXMgZm9sbG93OgorIyAgLSBzZXJ2ZXIgaXMgc2lsZW50IG9uIG1lc3NhZ2UgcmVjZXB0aW9uLCBvbmx5IHRoZSBhY3Rpdml0eSBzdW1tYXJ5IGlzIGRpc3BsYXllZCBldmVyeSAzMCBzZWNvbmRzCisjICAtIGNsaWVudCBhdHRlbXB0cyB0byBzZW5kIGFzIG1hbnkgbWVzc2FnZXMgYXMgcG9zc2libGUgZHVyaW5nIDEwIHNlY29uZHMgYW5kIGNvdW50cyB0aGVtLgorIyBUaGUgYmVuY2htYXJrIGtleXdvcmQgY2FuIGJlIGZvbGxvd2VkIG9wdGlvbmFsbHkgYnkgdHdvIGludGVnZXJzOgorIyAgIGR1cmF0aW9uIGlzIHRoZSB0aW1lIGZvciB0aGUgbWVhc3VyZW1lbnQsIGluIHNlY29uZHMgKGRlZmF1bHQgMTApLgorIyAgIGNvbmN1cnJlbmN5IGlzIHRoZSBudW1iZXIgb2YgbWVzc2FnZXMgdGhhdCBjYW4gYmUgb24gdGhlIHdpcmUgYmVmb3JlIHdhaXRpbmcgZm9yIGFuIGFuc3dlciAoZGVmYXVsdCAxMDApLgorIyBiZW5jaG1hcmsgW2R1cmF0aW9uIGNvbmN1cnJlbmN5XTsKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDbGllbnQtc3BlY2lmaWMgY29uZmlndXJhdGlvbgorCisjIFRoZSBEZXN0aW5hdGlvbi1SZWFsbSBmb3IgdGhlIG1lc3NhZ2UKKyMgKGRlZmF1bHQgaXMgc2VuZGluZyB0byBzYW1lIHJlYWxtIGFzIGxvY2FsIHBlZXIpLgorIyBkZXN0LXJlYWxtID0gImZvcmVpZ24ubmV0IjsKKworIyBUaGUgRGVzdGluYXRpb24tSG9zdCBmb3IgdGhlIG1lc3NhZ2UuCisjIChkZWZhdWx0IGlzIG5vdCBwcm92aWRpbmcgdGhpcyBBVlApLgorIyBkZXN0LWhvc3QgPSAic2VydmVyLmZvcmVpZ24ubmV0IjsKKworIyBUaGUgVXNlci1OYW1lIGZvciB0aGUgbWVzc2FnZSAobWF5IGJlIHVzZWZ1bCBmb3Igc29tZSByb3V0aW5nIHRlc3RzKS4KKyMgKGRlZmF1bHQgaXMgbm90IHByb3ZpZGluZyB0aGlzIEFWUCkuCisjIHVzZXItbmFtZSA9ICJ1c2VyQHNlcnZlci5mb3JlaWduLm5ldCI7CisKKyMgVGhlIHNpZ25hbCB0aGF0IHRyaWdnZXJzIHNlbmRpbmcgdGhlIHRlc3QgbWVzc2FnZQorIyBOb3RlOiBTeW1ib2xpYyBuYW1lcyBhcmUgbm90IHJlY29nbml6ZWQsIHlvdSBtdXN0IHVzZSBpbnRlZ2VycworIyBzaWduYWwgPSAxMDsKZGlmZiAtLWdpdCBhL2RvYy90ZXN0X25ldGVtdWwuY29uZi5zYW1wbGUgYi9kb2MvdGVzdF9uZXRlbXVsLmNvbmYuc2FtcGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5YzRkMTIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdGVzdF9uZXRlbXVsLmNvbmYuc2FtcGxlCkBAIC0wLDAgKzEsNTkgQEAKKyMgVGhpcyBmaWxlIGNvbnRhaW5zIGluZm9ybWF0aW9uIGZvciBjb25maWd1cmluZyB0aGUgdGVzdF9uZXRlbXVsIGV4dGVuc2lvbi4KKyMgVG8gZmluZCBob3cgdG8gaGF2ZSBmcmVlRGlhbWV0ZXIgbG9hZCB0aGlzIGV4dGVuc2lvbiwgcGxlYXNlIHJlZmVyIHRvIHRoZSBmcmVlRGlhbWV0ZXIgZG9jdW1lbnRhdGlvbi4KKyMKKyMgVGhlIHRlc3RfbmV0ZW11bCBleHRlbnNpb24gaW1wbGVtZW50cyBhIERpYW1ldGVyIHByb3h5IHRoYXQgYmVoYXZlcyBsaWtlIHNpbXBsZSBmb3J3YXJkaW5nIGFnZW50LAorIyB3aXRoIHRoZSBleGNlcHRpb24gdGhhdCBpdCBjYW4gaW50cm9kdWNlIGRlbGF5IGluIHRoZSBmb3J3YXJkaW5nIG9mIHRoZSBtZXNzYWdlcyBhbmQgZ2VuZXJhdGUgZHVwbGljYXRlcworIyBvZiBtZXNzYWdlcywgYXMgY2FuIGJlIGV4cGVjdGVkIGZyb20gYSByZWFsIERpYW1ldGVyIG5ldHdvcmsuIEl0IGNhbiBhbHNvIGdlbmVyYXRlIHJvdXRpbmcgZXJyb3JzIHdoZW4gCisjIGNvbm5lY3RlZCB0byBtb3JlIHRoYW4gMiBwZWVycy4KKworCisjIExBVEVOQ1k6CisjIFR3byBwYXJhbWV0ZXJzIGFyZSB1c2VkIHRvIGNvbnRyb2wgdGhlIGRlbGF5IGludHJvZHVjZWQgaW4gdGhlIG1lc3NhZ2VzLgorIyAgLSBsYXRlbmN5X2F2ZXJhZ2U6CisjICAgVGhpcyBpcyB0aGUgYXZlcmFnZSBkZWxheSBpbnRyb2R1Y2VkIGluIHRoZSBwYWNrZXRzLiAKKyMgICBTZXQgdG8gMCB0byBub3QgYWRkIGFueSBsYXRlbmN5IChiZXlvbmQgdGhlIG5vcm1hbCBwcm9jZXNzaW5nIHRpbWUpLgorIyAgIFRoZSB2YWx1ZSBpcyBleHByZXNzZWQgYXMgYW4gaW50ZWdlciBmb2xsb3dlZCBieSBhIHVuaXQgd2hpY2ggY2FuIAorIyAgIGJlICdzJyAoc2Vjb25kcykgb3IgJ21zJyAobWlsbGlzZWNvbmRzKS4gRXhhbXBsZToKKyMgICAgIGxhdGVuY3lfYXZlcmFnZSA9IDcwMCBtczsKKyMKKyMgIC0gbGF0ZW5jeV9kZXZpYXRpb246CisjICAgVGhpcyBwYXJhbWV0ZXIgY29udHJvbHMgdGhlIHZhcmlhbmNlIGluIHRoZSBsYXRlbmN5LiBJdCBpcyBleHByZXNzZWQKKyMgICBhcyBhIHZhbHVlIGJldHdlZW4gMCAlIGFuZCAxMDAgJS4gV2hlbiBzZXQgdG8gMCAlLCBhbGwgbWVzc2FnZXMgd2lsbCBiZSBkZWxheWVkCisjICAgYnkgZXhhY3RseSBsYXRlbmN5X2F2ZXJhZ2UuIE90aGVyd2lzZSwgaXQgcmVwcmVzZW50cyB0aGUgd2lkdGggb2YgdGhlIGludGVydmFsIAorIyAgICJhcm91bmQiIHRoZSBhdmVyYWdlIHdoZXJlICJtb3N0IiBvZiB0aGUgbGF0ZW5jeSB3aWxsIGJlIGNob3NlbiAodGhlIGRpc3RyaWJ1dGlvbgorIyAgIGhhcyBhIEdhdXNzaWFuIHNoYXBlKS4gRXhhbXBsZToKKyMgICAgICBsYXRlbmN5X2RldmlhdGlvbiA9IDI1ICU7CisjCisjIFRoZSBkZWZhdWx0IHZhbHVlcyBnaXZlIGFuIGFkZGVkIGxhdGVuY3kgIm1vc3RseSIgYmV0d2VlbiAwLjQgYW5kIDAuNiBzZWNvbmRzOgorIyAgbGF0ZW5jeV9hdmVyYWdlICA9IDUwMCBtczsKKyMgIGxhdGVuY3lfZGV2aWF0aW9uID0gMjAgJSA7CisKKworIyBSRU9SREVSSU5HOgorIyBUaGVyZSBpcyBubyBzcGVjaWFsIGNvbnRyb2wgb3ZlciB0aGUgcmVvcmRlcmluZyBvZiBtZXNzYWdlcy4gSXQgbWF5IHNpbXBseSBoYXBwZW4KKyMgYXMgYSByZXN1bHQgb2YgdGhlIGxhdGVuY3kuIElmIHlvdSB3YW50IHRvIGdldCBhIGxvdCBvZiByZW9yZGVyaW5nLCBzZXQgdGhlIAorIyBsYXRlbmN5X3ZhcmlhbmNlIHRvIGEgaGlnaCB2YWx1ZS4KKworCisjIERVUExJQ0FURVM6CisjIER1cGxpY2F0ZSBtZXNzYWdlcyBhcmUgZXhwZWN0ZWQgaW4gdGhlIERpYW1ldGVyIHByb3RvY29sIGJ5IGRlc2lnbiwgYXMgYSBjb25zZXF1ZW5jZQorIyBvZiB0aGUgZmFpbG92ZXIgbWVjaGFuaXNtIHRoYXQgcHJvdmlkZXMgdGhlIHByb3RvY29sJ3MgcmVsaWFiaWxpdHkuCisjICAtIGR1cGxfcHJvYmE6CisjICAgVGhpcyB2YWx1ZSBnaXZlcyB0aGUgcHJvYmFiaWxpdHkgb2YgcHJvZHVjaW5nIGEgZHVwbGljYXRlIG9mIGEgZm9yd2FyZGVkIG1lc3NhZ2UuIAorIyAgIFRoZSB2YWx1ZSBpcyBjb21wcml6ZWQgYmV0d2VlbiAwIChubyBkdXBsaWNhdGVzKSBhbmQgMSAoZHVwbGljYXRlIGFsbCBtZXNzYWdlcykuCisjICAgRHVwbGljYXRlcyBhcmUgY3JlYXRlZCBmb3IgcmVxdWVzdHMsIGJ1dCBtYXkgcmVzdWx0IGluIGR1cGxpY2F0ZSBhbnN3ZXJzIAorIyAgIHJlY2VpdmVkIGJ5IHlvdXIgRGlhbWV0ZXIgY2xpZW50KHMpLCBkZXBlbmRpbmcgb24geW91ciBzZXJ2ZXIocykncyBiZWhhdmlvci4KKyMgICBJbiB0aGUgY2FzZSBvZiBmcmVlRGlhbWV0ZXIgY2xpZW50LCB0aGUgZHVwbGljYXRlIGFuc3dlciBpcyBhdXRvbWF0aWNhbGx5IGZpbHRlcmVkIG91dAorIyAgIGJlY2F1c2UgdGhlIGhvcC1ieS1ob3AgaWQgaGFzIGFscmVhZHkgYmVlbiB1c2VkLgorIyAgIE5vdGUgdGhhdCBlYWNoIGR1cGxpY2F0ZSBjb3B5IGlzIGFuIGluZGVwZW5kZW50IG1lc3NhZ2UsCisjICAgd2hpY2ggcmVjZWl2ZXMgYSBkaWZmZXJlbnQgbGF0ZW5jeSwgYW5kIG1pZ2h0IGJlIHJvdXRlZCB0byBhIGRpZmZlcmVudCBzZXJ2ZXIgaWYgeW91CisjICAgdXNlIGZvciBleGFtcGxlIGxvYWQtYmFsYW5jaW5nLgorIyAgIFRoZSBwYXJhbWV0ZXIgY2FuIHRha2Ugc2V2ZXJhbCBmb3JtczoKKyMgICAgZHVwbF9wcm9iYSA9IDAgOworIyAgICAgIERpc2FibGVzIHRoZSBnZW5lcmF0aW9uIG9mIGR1cGxpY2F0ZSBtZXNzYWdlcyBjb21wbGV0ZWx5LgorIyAgICBkdXBsX3Byb2JhID0gMSAvIDEwMDAwIDsKKyMgICAgZHVwbF9wcm9iYSA9IDAuMDAwMSA7CisjICAgICAgQXJvdW5kIDEgbWVzc2FnZXMgb3ZlciB0ZW4gdGhvdXNhbmRzIHdpbGwgYmUgZHVwbGljYXRlZC4KKyMKKyMgRGVmYXVsdCB2YWx1ZToKKyMgIGR1cGxfcHJvYmEgPSAxIC8gMTAwIDsKZGlmZiAtLWdpdCBhL2RvYy90ZXN0X3NpcC5jb25mLnNhbXBsZSBiL2RvYy90ZXN0X3NpcC5jb25mLnNhbXBsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjUyNzJhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Rlc3Rfc2lwLmNvbmYuc2FtcGxlCkBAIC0wLDAgKzEsOCBAQAorI1VzZXIgY29uZmlndXJhdGlvbgordXNlcm5hbWUgPSAiYXdlc3RmYWhsIgorcGFzc3dvcmQgPSAidGVzdCIKK3NpcF9hb3IgPSAic2lwOmF3ZXN0ZmFobEB0ZXJhLmljcy5rZWlvLmFjLmpwIgorCisjRGVzdGluYXRpb24gaW5mb3JtYXRpb24KK2Rlc3RpbmF0aW9uX3JlYWxtID0gImZyZWVkaWFtZXRlci5uZXQiCitkZXN0aW5hdGlvbl9zaXAgPSAic2lwOmF3ZXN0ZmFobEBmcmVlZGlhbWV0ZXIubmV0IgpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9DTWFrZUxpc3RzLnR4dCBiL2V4dGVuc2lvbnMvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZhODMzNAotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxNjIgQEAKK1BST0pFQ1QoImZyZWVEaWFtZXRlciBleHRlbnNpb25zIiBDKQorCisjIFdlIHdhbnQgYWxsIHJlc3VsdGluZyBvYmplY3RzIGluIHRoZSBzYW1lIGZvbGRlcgorU0VUKExJQlJBUllfT1VUUFVUX1BBVEggJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9KQorCisjIFVzZSB0aGUgbWFjcm8gRkRfQUREX0VYVEVOU0lPTihuYW1lIGZpbGVzLi4uKSB0byBjcmVhdGUgYW4gZXh0ZW5zaW9uCisjIEl0IGlzIGVxdWl2YWxlbnQgdG8gYWRkX2xpYnJhcnkgd2l0aCB0aGUgYXBwcm9wcmlhdGUgcGFyYW1ldGVycworIyBhbmQgbmFtaW5nIGNvbnZlbnRpb25zICguZmR4IDogRnJlZURpYW1ldGVyIGVYdGVuc2lvbikKK01BQ1JPKEZEX0FERF9FWFRFTlNJT04gRVhUTkFNRSkKKyAgQUREX0xJQlJBUlkoJHtFWFROQU1FfSBNT0RVTEUgJHtBUkdOfSkKKyAgU0VUX1RBUkdFVF9QUk9QRVJUSUVTKCR7RVhUTkFNRX0gUFJPUEVSVElFUyBQUkVGSVggIiIgKQorICBTRVRfVEFSR0VUX1BST1BFUlRJRVMoJHtFWFROQU1FfSBQUk9QRVJUSUVTIFNVRkZJWCAiLmZkeCIgKQorRU5ETUFDUk8oRkRfQUREX0VYVEVOU0lPTikKKworIyBVc2UgdGhlIG1hY3JvIEZEX0VYVEVOU0lPTl9TVUJESVIoZXh0bWFjcm9uYW1lIHN1YmRpciBkZXNjciBkZWZhdWx0KSB0byAKKyMgYWRkIGEgbmV3IGV4dGVuc2lvbiBzdWJkaXJlY3RvcnkuCitNQUNSTyhGRF9FWFRFTlNJT05fU1VCRElSIEVYVFNVQkRJUiBFWFRERVNDUiBFWFRERUZBVUxUKQorICAgU1RSSU5HKFRPVVBQRVIgJHtFWFRTVUJESVJ9IEVYVE1BQ1JPTkFNRSkKKyAgIElGIChOT1QgQUxMX0VYVEVOU0lPTlMpCisgICAgIE9QVElPTihCVUlMRF8ke0VYVE1BQ1JPTkFNRX0gIkJ1aWxkICR7RVhUU1VCRElSfS5mZHg/ICgke0VYVERFU0NSfSkiICR7RVhUREVGQVVMVH0pCisgICBFTkRJRiAoTk9UIEFMTF9FWFRFTlNJT05TKQorICAgSUYgKEJVSUxEXyR7RVhUTUFDUk9OQU1FfSBPUiBBTExfRVhURU5TSU9OUykKKyAgICAgIFNVQkRJUlMoJHtFWFRTVUJESVJ9KQorICAgRU5ESUYgKEJVSUxEXyR7RVhUTUFDUk9OQU1FfSBPUiBBTExfRVhURU5TSU9OUykKK0VORE1BQ1JPKEZEX0VYVEVOU0lPTl9TVUJESVIpCisKK09QVElPTihBTExfRVhURU5TSU9OUyAiQnVpbGQgQUxMIGF2YWlsYWJsZSBleHRlbnNpb25zPyAoZGlzYWJsZSB0byBzZWxlY3QgaW5kaXZpZHVhbCBjb21wb25lbnRzKSIgT0ZGKQorCisjIFRoZSBleHRlbnNpb25zIGluY2x1ZGUgdGhlIGhlYWRlcnMgb2YgZnJlZURpYW1ldGVyIHRoYXQgY29udGFpbnMgZ251dGxzIG9iamVjdHMKK0lOQ0xVREVfRElSRUNUT1JJRVMoJHtMRkRDT1JFX0lOQ0xVREVTfSkKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgRXh0ZW5zaW9ucyBzZWN0aW9uCisKKyMjIyMKKyMgRGlhbWV0ZXIgYXBwbGljYXRpb25zIGRpY3Rpb25hcmllcworCitGRF9FWFRFTlNJT05fU1VCRElSKGRpY3RfbmFzcmVxICJOQVNSRVEgKFJGQzQwMDUpIERpY3Rpb25hcnkgZGVmaW5pdGlvbnMiICAgICAgIE9OKQorRkRfRVhURU5TSU9OX1NVQkRJUihkaWN0X2VhcCAgICAiRGlhbWV0ZXIgRUFQIChSRkM0MDcyKSBEaWN0aW9uYXJ5IGRlZmluaXRpb25zIiBPTikKKworRkRfRVhURU5TSU9OX1NVQkRJUihkaWN0X2RjY2EgICAiRGlhbWV0ZXIgQ0MgKFJGQzQwMDYpIERpY3Rpb25hcnkgZGVmaW5pdGlvbnMgW2luY29tcGxldGVdIiBPTikKK0ZEX0VYVEVOU0lPTl9TVUJESVIoZGljdF9kY2NhXzNncHAgICAiRGlhbWV0ZXIgQ0MgM0dQUCBEaWN0aW9uYXJ5IGRlZmluaXRpb25zIFtpbmNvbXBsZXRlXSIgT04pCitGRF9FWFRFTlNJT05fU1VCRElSKGRpY3RfZGNjYV9zdGFyZW50ICAgIkRpYW1ldGVyIENDIFN0YXJlbnQgRGljdGlvbmFyeSBkZWZpbml0aW9ucyIgT04pCisKK0ZEX0VYVEVOU0lPTl9TVUJESVIoZGljdF9zaXAgICAgIkRpYW1ldGVyIFNJUCAoUkZDNDc0MCkgRGljdGlvbmFyeSBkZWZpbml0aW9ucyIgT04pCisKK0ZEX0VYVEVOU0lPTl9TVUJESVIoZGljdF9taXA2YSAgICAgIkRpYW1ldGVyIE1vYmlsZSBJUHY2IEF1dGggRGljdGlvbmFyeSBkZWZpbml0aW9ucyIgICAgICAgICBPTikKK0ZEX0VYVEVOU0lPTl9TVUJESVIoZGljdF9taXA2aSAgICAgIkRpYW1ldGVyIE1vYmlsZSBJUHY2IElLRSBEaWN0aW9uYXJ5IGRlZmluaXRpb25zIiAgICAgICAgICBPTikKK0ZEX0VYVEVOU0lPTl9TVUJESVIoZGljdF9uYXNfbWlwdjYgIkRpYW1ldGVyIE5BUy10by1IQUFBIEludGVyYWN0aW9uIERpY3Rpb25hcnkgZGVmaW5pdGlvbnMiICBPTikKKworRkRfRVhURU5TSU9OX1NVQkRJUihkaWN0X2xlZ2FjeV94bWwgIkxvYWQgRGlhbWV0ZXIgZGljdGlvbmFyeSBkZWZpbml0aW9ucyBmcm9tIFhNTCBmaWxlcy4iICAgIE9GRikKKworCisjIyMjCisjIERpYW1ldGVyIGFwcGxpY2F0aW9ucworCitGRF9FWFRFTlNJT05fU1VCRElSKGFwcF9hY2N0ICAgICJTaW1wbGUgYWNjb3VudGluZyBhcHBsaWNhdGlvbiB0aGF0IHN0b3JlcyBhY2NvdW50aW5nIHJlY29yZHMgaW4gZmxhdCBkYXRhYmFzZSIgT0ZGKQorRkRfRVhURU5TSU9OX1NVQkRJUihhcHBfZGlhbWVhcCAiRGlhbWV0ZXIgRUFQIEFwcGxpY2F0aW9uIHNlcnZlciAoUkZDIDQwNzIpIiAJCQkJCU9GRikKK0ZEX0VYVEVOU0lPTl9TVUJESVIoYXBwX3JhZGd3ICAgIlJBRElVUy9EaWFtZXRlciBnYXRld2F5IHRyYW5zbGF0aW9uIC0gUkFESVVTIGNsaWVudCB0byBEaWFtZXRlciBzZXJ2ZXIiIAlPRkYpCitGRF9FWFRFTlNJT05fU1VCRElSKGFwcF9zaXAgICAgICJEaWFtZXRlciBTSVAgQXV0aGVudGljYXRpb24gYW5kIEF1dGhvcml6YXRpb24gc2VydmVyIChSRkMgNDc0MCkiIAkJT0ZGKQorCitGRF9FWFRFTlNJT05fU1VCRElSKGFwcF9yZWRpcmVjdCAiRGlhbWV0ZXIgUmVkaXJlY3Qgc2VydmVyOiBzZW5kIGNvbmZpZ3VyYWJsZSBSZWRpcmVjdCBpbmRpY2F0aW9ucyB0byBvdGhlciBwZWVycyIgT0ZGKQorCisKKyMjIyMKKyMgUm91dGluZyBleHRlbnNpb25zCisKK0ZEX0VYVEVOU0lPTl9TVUJESVIocnRfYnVzeXBlZXJzICJIYW5kbGluZyBvZiBEaWFtZXRlciBUT09fQlVTWSBtZXNzYWdlcyBhbmQgcmVsYXkgdGltZW91dHMiCU9OKQorRkRfRVhURU5TSU9OX1NVQkRJUihydF9kZWZhdWx0ICAgIkNvbmZpZ3VyYWJsZSByb3V0aW5nIHJ1bGVzIGZvciBmcmVlRGlhbWV0ZXIiIAkJICAgICAJT04pCitGRF9FWFRFTlNJT05fU1VCRElSKHJ0X2VyZWcgICAgICAiQ29uZmlndXJhYmxlIHJvdXRpbmcgYmFzZWQgb24gcmVnZXhwIG1hdGNoaW5nIG9mIEFWUCB2YWx1ZXMiIE9GRikKK0ZEX0VYVEVOU0lPTl9TVUJESVIocnRfaWdub3JlX2RoICJTdG93IERlc3RpbmF0aW9uLUhvc3QgaW4gUHJveHktSW5mbywgcmVzdG9yZSB0byBPcmlnaW4tSG9zdCBmb3IgYW5zd2VycyIJT04pCitGRF9FWFRFTlNJT05fU1VCRElSKHJ0X2xvYWRfYmFsYW5jZSAiQmFsYW5jZSBsb2FkIG92ZXIgbXVsdGlwbGUgZXF1YWwgaG9zdHMsIGJhc2VkIG9uIG91dHN0YW5kaW5nIHJlcXVlc3RzIglPTikKK0ZEX0VYVEVOU0lPTl9TVUJESVIocnRfcmFuZG9taXplICJSYW5kb21seSBjaG9vc2Ugb25lIG9mIHRoZSBoaWdoZXN0IHNjb3JlZCBob3N0cyBhbmQgaW5jcmVhc2UgaXRzIHNjb3JlIGJ5IG9uZSIJT04pCitGRF9FWFRFTlNJT05fU1VCRElSKHJ0X3JlZGlyZWN0ICAiSGFuZGxpbmcgb2YgRGlhbWV0ZXIgUmVkaXJlY3QgbWVzc2FnZXMiIAkJCU9OKQorCisKKyMjIyMKKyMgUGVlcnMgc2VjdXJpdHkgZXh0ZW5zaW9ucworCitGRF9FWFRFTlNJT05fU1VCRElSKGFjbF93bCAiV2hpdGUtbGlzdCBiYXNlZCBhdXRob3JpemF0aW9uIG9mIGluY29taW5nIGNvbm5lY3Rpb25zIiBPTikKKworCisjIyMjCisjIERlYnVnICYgdGVzdCBleHRlbnNpb25zCisKK0ZEX0VYVEVOU0lPTl9TVUJESVIoZGJnX21vbml0b3IgIk91dHB1dHMgcGVyaW9kaWNhbCBzdGF0dXMgaW5mb3JtYXRpb24iICAgICAgICAgICAgICBPTikKK0ZEX0VYVEVOU0lPTl9TVUJESVIoZGJnX21zZ190aW1pbmdzICJTaG93IHNvbWUgdGltaW5nIGluZm9ybWF0aW9uIGZvciBtZXNzYWdlcyIgICAgICBPTikKK0ZEX0VYVEVOU0lPTl9TVUJESVIoZGJnX21zZ19kdW1wcyAiU2hvdyBodW1hbi1yZWFkYWJsZSBjb250ZW50IG9mIHRoZSByZWNlaXZlZCAmIHNlbnQgbWVzc2FnZXMiICAgICAgT04pCitGRF9FWFRFTlNJT05fU1VCRElSKGRiZ19ydCAgICAgICJSb3V0aW5nIGV4dGVuc2lvbiBmb3IgZGVidWdnaW5nIHRoZSByb3V0aW5nIG1vZHVsZSIgT04pCitGRF9FWFRFTlNJT05fU1VCRElSKHRlc3RfYXBwICAgICJUZXN0aW5nIGFwcGxpY2F0aW9uIHRvIHNlbmQgZHVtbXkgbWVzc2FnZSB0byBhbm90aGVyIHBlZXIsIGxpa2UgYSBEaWFtZXRlciAncGluZyciIE9GRikKK0ZEX0VYVEVOU0lPTl9TVUJESVIodGVzdF9zaXAgICAgIlRlc3RpbmcgYXBwbGljYXRpb24gdG8gc2ltdWxhdGUgRGlhbWV0ZXItU0lQIGNsaWVudCAoUkZDNDc0MCkiIE9GRikKK0ZEX0VYVEVOU0lPTl9TVUJESVIoZGJnX2ludGVyYWN0aXZlICJQeXRob24taW50ZXJwcmV0ZXIgYmFzZWQgbW9kdWxlIiAgICAgICAgICAgICAgICBPRkYpCitGRF9FWFRFTlNJT05fU1VCRElSKHRlc3RfbmV0ZW11bCAiU2ltcGxlIERpYW1ldGVyIG5ldHdvcmsgZW11bGF0b3IgcHJveHkgZXh0ZW5zaW9uIChsYXRlbmN5LCBQRFYsIGR1cGxpY2F0ZXMpIiBPRkYpCisKKworCisjIFRoZSBmb2xsb3dpbmcgZXh0ZW5zaW9uIGhhdmUgdmVyeSBsaXR0bGUgdXNlIGV4Y2VwdCBmb3Igc3BlY2lmaWMgdGVzdHMsIHNvIHdlIGRpc2FibGUgdGhlbSBleGNlcHQgaW4gRGVidWcgY29uZmlndXJhdGlvbnMuCitJRiAoQ01BS0VfQlVJTERfVFlQRSBNQVRDSEVTICJEZWJ1ZyIpCisJRkRfRVhURU5TSU9OX1NVQkRJUihfc2FtcGxlICAgICAiU2ltcGxlIGV4dGVuc2lvbiB0byBkZW1vbnN0cmF0ZSBleHRlbnNpb24gbWVjaGFuaXNtLCBmb3IgZGV2ZWxvcHBlcnMiIE9GRikKKwlGRF9FWFRFTlNJT05fU1VCRElSKHRlc3RfYWNjdCAgICJSZWNlaXZlIEFjY291bnRpbmctUmVxdWVzdHMgYW5kIGRpc3BsYXkgdGhlIGRhdGEsIGJ1dCBubyBzdG9yYWdlIiBPRkYpCisJRkRfRVhURU5TSU9OX1NVQkRJUih0ZXN0X3J0X2FueSAiUm91dGluZyBleHRlbnNpb24gcmFuZG9tbHkgc2VuZGluZyBtZXNzYWdlIHRvIGFueSBwZWVyIGF2YWlsYWJsZSwgZm9yIHRlc3RpbmcgcHVycG9zZSIgT0ZGKQorRU5ESUYgKENNQUtFX0JVSUxEX1RZUEUgTUFUQ0hFUyAiRGVidWciKQorCisKK0ZEX0VYVEVOU0lPTl9TVUJESVIoZGljdF8zZ3BwMl9hdnBzICJkaWN0XzNncHAyX2F2cHMgZXh0ZW5zaW9uIGxpYnJhcnkiIE9OKQorRkRfRVhURU5TSU9OX1NVQkRJUihkaWN0X0NyZWRpdENvbnRyb2wgImRpY3RfQ3JlZGl0Q29udHJvbCBleHRlbnNpb24gbGlicmFyeSIgT04pCitGRF9FWFRFTlNJT05fU1VCRElSKGRpY3RfQ3hEeCAiZGljdF9DeER4IGV4dGVuc2lvbiBsaWJyYXJ5IiBPTikKK0ZEX0VYVEVOU0lPTl9TVUJESVIoZGljdF9HeCAiZGljdF9HeCBleHRlbnNpb24gbGlicmFyeSIgT04pCitGRF9FWFRFTlNJT05fU1VCRElSKGRpY3RfTkFTICJkaWN0X05BUyBleHRlbnNpb24gbGlicmFyeSIgT04pCitGRF9FWFRFTlNJT05fU1VCRElSKGRpY3RfUmYgImRpY3RfUmYgZXh0ZW5zaW9uIGxpYnJhcnkiIE9OKQorRkRfRVhURU5TSU9OX1NVQkRJUihkaWN0X1JvICJkaWN0X1JvIGV4dGVuc2lvbiBsaWJyYXJ5IiBPTikKK0ZEX0VYVEVOU0lPTl9TVUJESVIoZGljdF9SeCAiZGljdF9SeCBleHRlbnNpb24gbGlicmFyeSIgT04pCitGRF9FWFRFTlNJT05fU1VCRElSKGRpY3RfUzZhczZkICJkaWN0X1M2YXM2ZCBleHRlbnNpb24gbGlicmFyeSIgT04pCitGRF9FWFRFTlNJT05fU1VCRElSKGRpY3RfUzZtUzZuICJkaWN0X1M2bVM2biBleHRlbnNpb24gbGlicmFyeSIgT04pCitGRF9FWFRFTlNJT05fU1VCRElSKGRpY3RfUzZ0ICJkaWN0X1M2dCBleHRlbnNpb24gbGlicmFyeSIgT04pCitGRF9FWFRFTlNJT05fU1VCRElSKGRpY3RfU0dkICJkaWN0X1NHZCBleHRlbnNpb24gbGlicmFyeSIgT04pCitGRF9FWFRFTlNJT05fU1VCRElSKGRpY3RfU0xoICJkaWN0X1NMaCBleHRlbnNpb24gbGlicmFyeSIgT04pCitGRF9FWFRFTlNJT05fU1VCRElSKGRpY3RfU2QgImRpY3RfU2QgZXh0ZW5zaW9uIGxpYnJhcnkiIE9OKQorRkRfRVhURU5TSU9OX1NVQkRJUihkaWN0X1NoICJkaWN0X1NoIGV4dGVuc2lvbiBsaWJyYXJ5IiBPTikKK0ZEX0VYVEVOU0lPTl9TVUJESVIoZGljdF9UNCAiZGljdF9UNCBleHRlbnNpb24gbGlicmFyeSIgT04pCitGRF9FWFRFTlNJT05fU1VCRElSKGRpY3RfVDZhVDZiVDcgImRpY3RfVDZhVDZiVDcgZXh0ZW5zaW9uIGxpYnJhcnkiIE9OKQorRkRfRVhURU5TSU9OX1NVQkRJUihkaWN0X1RzcCAiZGljdF9Uc3AgZXh0ZW5zaW9uIGxpYnJhcnkiIE9OKQorI0ZEX0VYVEVOU0lPTl9TVUJESVIoZGljdF9iYXNlX3JmYzY3MzMgImRpY3RfYmFzZV9yZmM2NzMzIGV4dGVuc2lvbiBsaWJyYXJ5IiBPTikKK0ZEX0VYVEVOU0lPTl9TVUJESVIoZGljdF9kcmFmdGxvYWRfYXZwcyAiZGljdF9kcmFmdGxvYWRfYXZwcyBleHRlbnNpb24gbGlicmFyeSIgT04pCitGRF9FWFRFTlNJT05fU1VCRElSKGRpY3RfZXRzaTI4MzAzNF9hdnBzICJkaWN0X2V0c2kyODMwMzRfYXZwcyBleHRlbnNpb24gbGlicmFyeSIgT04pCitGRF9FWFRFTlNJT05fU1VCRElSKGRpY3RfcmZjNDAwNF9hdnBzICJkaWN0X3JmYzQwMDRfYXZwcyBleHRlbnNpb24gbGlicmFyeSIgT04pCitGRF9FWFRFTlNJT05fU1VCRElSKGRpY3RfcmZjNDAwNmJpc19hdnBzICJkaWN0X3JmYzQwMDZiaXNfYXZwcyBleHRlbnNpb24gbGlicmFyeSIgT04pCitGRF9FWFRFTlNJT05fU1VCRElSKGRpY3RfcmZjNDA3Ml9hdnBzICJkaWN0X3JmYzQwNzJfYXZwcyBleHRlbnNpb24gbGlicmFyeSIgT04pCitGRF9FWFRFTlNJT05fU1VCRElSKGRpY3RfcmZjNDU5MF9hdnBzICJkaWN0X3JmYzQ1OTBfYXZwcyBleHRlbnNpb24gbGlicmFyeSIgT04pCitGRF9FWFRFTlNJT05fU1VCRElSKGRpY3RfcmZjNTQ0N19hdnBzICJkaWN0X3JmYzU0NDdfYXZwcyBleHRlbnNpb24gbGlicmFyeSIgT04pCitGRF9FWFRFTlNJT05fU1VCRElSKGRpY3RfcmZjNTU4MF9hdnBzICJkaWN0X3JmYzU1ODBfYXZwcyBleHRlbnNpb24gbGlicmFyeSIgT04pCitGRF9FWFRFTlNJT05fU1VCRElSKGRpY3RfcmZjNTc3N19hdnBzICJkaWN0X3JmYzU3NzdfYXZwcyBleHRlbnNpb24gbGlicmFyeSIgT04pCitGRF9FWFRFTlNJT05fU1VCRElSKGRpY3RfcmZjNTc3OF9hdnBzICJkaWN0X3JmYzU3NzhfYXZwcyBleHRlbnNpb24gbGlicmFyeSIgT04pCitGRF9FWFRFTlNJT05fU1VCRElSKGRpY3RfcmZjNjczNF9hdnBzICJkaWN0X3JmYzY3MzRfYXZwcyBleHRlbnNpb24gbGlicmFyeSIgT04pCitGRF9FWFRFTlNJT05fU1VCRElSKGRpY3RfcmZjNjk0Ml9hdnBzICJkaWN0X3JmYzY5NDJfYXZwcyBleHRlbnNpb24gbGlicmFyeSIgT04pCitGRF9FWFRFTlNJT05fU1VCRElSKGRpY3RfcmZjNzE1NV9hdnBzICJkaWN0X3JmYzcxNTVfYXZwcyBleHRlbnNpb24gbGlicmFyeSIgT04pCitGRF9FWFRFTlNJT05fU1VCRElSKGRpY3RfcmZjNzY4M19hdnBzICJkaWN0X3JmYzc2ODNfYXZwcyBleHRlbnNpb24gbGlicmFyeSIgT04pCitGRF9FWFRFTlNJT05fU1VCRElSKGRpY3RfcmZjNzk0NF9hdnBzICJkaWN0X3JmYzc5NDRfYXZwcyBleHRlbnNpb24gbGlicmFyeSIgT04pCitGRF9FWFRFTlNJT05fU1VCRElSKGRpY3RfdHMyOTA2MV9hdnBzICJkaWN0X3RzMjkwNjFfYXZwcyBleHRlbnNpb24gbGlicmFyeSIgT04pCitGRF9FWFRFTlNJT05fU1VCRElSKGRpY3RfdHMyOTEyOF9hdnBzICJkaWN0X3RzMjkxMjhfYXZwcyBleHRlbnNpb24gbGlicmFyeSIgT04pCitGRF9FWFRFTlNJT05fU1VCRElSKGRpY3RfdHMyOTE1NF9hdnBzICJkaWN0X3RzMjkxNTRfYXZwcyBleHRlbnNpb24gbGlicmFyeSIgT04pCitGRF9FWFRFTlNJT05fU1VCRElSKGRpY3RfdHMyOTE3M19hdnBzICJkaWN0X3RzMjkxNzNfYXZwcyBleHRlbnNpb24gbGlicmFyeSIgT04pCitGRF9FWFRFTlNJT05fU1VCRElSKGRpY3RfdHMyOTIxMl9hdnBzICJkaWN0X3RzMjkyMTJfYXZwcyBleHRlbnNpb24gbGlicmFyeSIgT04pCitGRF9FWFRFTlNJT05fU1VCRElSKGRpY3RfdHMyOTIxNF9hdnBzICJkaWN0X3RzMjkyMTRfYXZwcyBleHRlbnNpb24gbGlicmFyeSIgT04pCitGRF9FWFRFTlNJT05fU1VCRElSKGRpY3RfdHMyOTIxNV9hdnBzICJkaWN0X3RzMjkyMTVfYXZwcyBleHRlbnNpb24gbGlicmFyeSIgT04pCitGRF9FWFRFTlNJT05fU1VCRElSKGRpY3RfdHMyOTIxN19hdnBzICJkaWN0X3RzMjkyMTdfYXZwcyBleHRlbnNpb24gbGlicmFyeSIgT04pCitGRF9FWFRFTlNJT05fU1VCRElSKGRpY3RfdHMyOTIyOV9hdnBzICJkaWN0X3RzMjkyMjlfYXZwcyBleHRlbnNpb24gbGlicmFyeSIgT04pCitGRF9FWFRFTlNJT05fU1VCRElSKGRpY3RfdHMyOTI3Ml9hdnBzICJkaWN0X3RzMjkyNzJfYXZwcyBleHRlbnNpb24gbGlicmFyeSIgT04pCitGRF9FWFRFTlNJT05fU1VCRElSKGRpY3RfdHMyOTI3M19hdnBzICJkaWN0X3RzMjkyNzNfYXZwcyBleHRlbnNpb24gbGlicmFyeSIgT04pCitGRF9FWFRFTlNJT05fU1VCRElSKGRpY3RfdHMyOTMyOV9hdnBzICJkaWN0X3RzMjkzMjlfYXZwcyBleHRlbnNpb24gbGlicmFyeSIgT04pCitGRF9FWFRFTlNJT05fU1VCRElSKGRpY3RfdHMyOTMzNl9hdnBzICJkaWN0X3RzMjkzMzZfYXZwcyBleHRlbnNpb24gbGlicmFyeSIgT04pCitGRF9FWFRFTlNJT05fU1VCRElSKGRpY3RfdHMyOTMzN19hdnBzICJkaWN0X3RzMjkzMzdfYXZwcyBleHRlbnNpb24gbGlicmFyeSIgT04pCitGRF9FWFRFTlNJT05fU1VCRElSKGRpY3RfdHMyOTMzOF9hdnBzICJkaWN0X3RzMjkzMzhfYXZwcyBleHRlbnNpb24gbGlicmFyeSIgT04pCitGRF9FWFRFTlNJT05fU1VCRElSKGRpY3RfdHMyOTM0M19hdnBzICJkaWN0X3RzMjkzNDNfYXZwcyBleHRlbnNpb24gbGlicmFyeSIgT04pCitGRF9FWFRFTlNJT05fU1VCRElSKGRpY3RfdHMyOTM0NF9hdnBzICJkaWN0X3RzMjkzNDRfYXZwcyBleHRlbnNpb24gbGlicmFyeSIgT04pCitGRF9FWFRFTlNJT05fU1VCRElSKGRpY3RfdHMyOTM0NV9hdnBzICJkaWN0X3RzMjkzNDVfYXZwcyBleHRlbnNpb24gbGlicmFyeSIgT04pCitGRF9FWFRFTlNJT05fU1VCRElSKGRpY3RfdHMyOTM2OF9hdnBzICJkaWN0X3RzMjkzNjhfYXZwcyBleHRlbnNpb24gbGlicmFyeSIgT04pCitGRF9FWFRFTlNJT05fU1VCRElSKGRpY3RfdHMyOTQ2OF9hdnBzICJkaWN0X3RzMjk0NjhfYXZwcyBleHRlbnNpb24gbGlicmFyeSIgT04pCitGRF9FWFRFTlNJT05fU1VCRElSKGRpY3RfdHMzMjI5OV9hdnBzICJkaWN0X3RzMzIyOTlfYXZwcyBleHRlbnNpb24gbGlicmFyeSIgT04pCitGRF9FWFRFTlNJT05fU1VCRElSKGRpY3RfUzZjICJkaWN0X1M2YyBleHRlbnNpb24gbGlicmFyeSIgT04pCitGRF9FWFRFTlNJT05fU1VCRElSKGRpY3RfUzkgImRpY3RfUzkgZXh0ZW5zaW9uIGxpYnJhcnkiIE9OKQpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9fc2FtcGxlL0NNYWtlTGlzdHMudHh0IGIvZXh0ZW5zaW9ucy9fc2FtcGxlL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhZDYzMGEKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL19zYW1wbGUvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxNCBAQAorIyBUaGUgc2FtcGxlIGV4dGVuc2lvbgorUFJPSkVDVCgiU2FtcGxlIGV4dGVuc2lvbiIpCisKKyMgQ29tcGlsZSBhcyBhIG1vZHVsZQorRkRfQUREX0VYVEVOU0lPTihkYmdfc2FtcGxlIHNhbXBsZS5jIGhlbGxvLmNwcCBmaW5pLmMpCisKKworIyMjIworIyMgSU5TVEFMTCBzZWN0aW9uICMjCisKKyMgVW5jb21tZW50IHRoZSBmb2xsb3dpbmcgbGluZXMgdG8gaGF2ZSB0aGUgZXh0ZW5zaW9uIGluc3RhbGxlZAorIyBJTlNUQUxMKFRBUkdFVFMgZGJnX3NhbXBsZQorIyAJTElCUkFSWSBERVNUSU5BVElPTiAke0lOU1RBTExfRVhURU5TSU9OU19TVUZGSVh9CisjIAlDT01QT05FTlQgZnJlZURpYW1ldGVyLWRlYnVnLXRvb2xzKQpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9fc2FtcGxlL2ZpbmkuYyBiL2V4dGVuc2lvbnMvX3NhbXBsZS9maW5pLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY3NTEzYwotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvX3NhbXBsZS9maW5pLmMKQEAgLTAsMCArMSw0NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTEsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8ZnJlZURpYW1ldGVyL2V4dGVuc2lvbi5oPgorCisvKiBUaGUgZnVuY3Rpb24gTVVTVCBiZSBjYWxsZWQgdGhpcyAqLwordm9pZCBmZF9leHRfZmluaSh2b2lkKQoreworCS8qIFRoaXMgY29kZSBpcyBleGVjdXRlZCB3aGVuIHRoZSBkYWVtb24gaXMgZXhpdGluZzsgY2xlYW51cCBtYW5hZ2VtZW50IHNob3VsZCBiZSBwbGFjZWQgaGVyZSAqLworCVRSQUNFX0RFQlVHKElORk8sICJFeHRlbnNpb24gaXMgdGVybWluYXRlZC4uLiBCeWUhIik7CisJcmV0dXJuIDsKK30KKwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9fc2FtcGxlL2hlbGxvLmNwcCBiL2V4dGVuc2lvbnMvX3NhbXBsZS9oZWxsby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDViMzQwYwotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvX3NhbXBsZS9oZWxsby5jcHAKQEAgLTAsMCArMSw0OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTMsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBTYW1wbGUgZmlsZSBkZW1vbnN0cmF0aW5nIGhvdyB0byB3cml0ZSBzb21lIEMrKyBjb2RlICovCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworI2luY2x1ZGUgPGZyZWVEaWFtZXRlci9leHRlbnNpb24uaD4KKworZXh0ZXJuICJDIiB2b2lkIG15Y3BwZnVuYygpOyAvKiB3aWxsIGJlIGNhbGxlZCBmcm9tIEMgY29kZSAqLworCisKK3ZvaWQgbXljcHBmdW5jKCkgeworCXN0ZDo6Y291dCA8PCAiSGVsbG8gV29ybGQhIiA8PCBzdGQ6OmVuZGw7CisJLyogZG9uZSAqLworfQpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9fc2FtcGxlL3NhbXBsZS5jIGIvZXh0ZW5zaW9ucy9fc2FtcGxlL3NhbXBsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNzI2ODQKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL19zYW1wbGUvc2FtcGxlLmMKQEAgLTAsMCArMSw5NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTMsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBTYW1wbGUgZXh0ZW5zaW9uIHRvIHRlc3QgZXh0ZW5zaW9ucyBtZWNoYW5pc20gaW4gZnJlZURpYW1ldGVyICovCisjaW5jbHVkZSA8ZnJlZURpYW1ldGVyL2V4dGVuc2lvbi5oPgorCisvKiBmcm9tIHNhbXBsZS5jcHAgKi8KK3ZvaWQgbXljcHBmdW5jKCk7CisKK3N0YXRpYyBpbnQgc2FtcGxlX21haW4oY2hhciAqIGNvbmZmaWxlKTsKKworLyogRGVmaW5lIHRoZSBlbnRyeSBwb2ludC4gQSBjb252ZW5pZW5jZSBtYWNybyBpcyBwcm92aWRlZCAqLworRVhURU5TSU9OX0VOVFJZKCJzYW1wbGUiLCBzYW1wbGVfbWFpbik7CisKKy8qIFRoZSBleHRlbnNpb24tc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gY29kZSAqLworc3RhdGljIGludCBzYW1wbGVfbWFpbihjaGFyICogY29uZmZpbGUpCit7CisJLyogVGhlIGRlYnVnIG1hY3JvIGZyb20gbWFpbiB0cmVlIGNhbiBiZSB1c2VkIHRoZSBzYW1lIHdheSAqLworCVRSQUNFX0VOVFJZKCIlcCIsIGNvbmZmaWxlKTsKKwkKKwkvKiBUaGlzIGlzIGhvdyB3ZSBhY2Nlc3MgZGFlbW9uJ3MgZ2xvYmFsIHZhcnMgKi8KKwlmcHJpbnRmKHN0ZG91dCwgIkkgYW0gZXh0ZW5zaW9uICIgX19GSUxFX18gIiBydW5uaW5nIG9uIGhvc3QgJXMuIiwgZmRfZ19jb25maWctPmNuZl9kaWFtaWQpOworCQorCS8qIFRoZSBjb25maWd1cmF0aW9uIGZpbGUgbmFtZSBpcyByZWNlaXZlZCBpbiB0aGUgY29uZmZpbGUgdmFyLiBJdCdzIHVwIHRvIGV4dGVuc2lvbiB0byBwYXJzZSBpdCAqLworCWlmIChjb25mZmlsZSkgeworCQlmcHJpbnRmKHN0ZG91dCwgIkkgc2hvdWxkIHBhcnNlIG15IGNvbmZpZ3VyYXRpb24gZmlsZSB0aGVyZTogJXNcbiIsIGNvbmZmaWxlKTsKKwl9IGVsc2UgeworCQlmcHJpbnRmKHN0ZG91dCwgIkkgcmVjZWl2ZWQgbm8gY29uZmlndXJhdGlvbiBmaWxlIHRvIHBhcnNlXG4iKTsKKwl9CisJCisJLyogRnVuY3Rpb25zIGZyb20gdGhlIGxpYmZyZWVkaWFtZXRlciBjYW4gYWxzbyBiZSB1c2VkIGFzIGRlbW9uc3RyYXRlZCBoZXJlOiAqLworCVRSQUNFX0RFQlVHKElORk8sICJMZXQncyBjcmVhdGUgdGhhdCAnRXhhbXBsZS1BVlAnLi4uIik7CisJeworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBvcmlnaW5faG9zdF9hdnAgPSBOVUxMOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBzZXNzaW9uX2lkX2F2cCA9IE5VTEw7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGV4YW1wbGVfYXZwX2F2cCA9IE5VTEw7CisJCXN0cnVjdCBkaWN0X3J1bGVfZGF0YSBydWxlX2RhdGEgPSB7IE5VTEwsIFJVTEVfUkVRVUlSRUQsIDAsIC0xLCAxIH07CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGV4YW1wbGVfYXZwX2RhdGEgPSB7IDk5OTk5OSwgMCwgIkV4YW1wbGUtQVZQIiwgQVZQX0ZMQUdfVkVORE9SICwgMCwgQVZQX1RZUEVfR1JPVVBFRCB9OworCisJCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2ggKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIk9yaWdpbi1Ib3N0IiwgJm9yaWdpbl9ob3N0X2F2cCwgRU5PRU5UKSk7CisJCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2ggKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIlNlc3Npb24tSWQiLCAmc2Vzc2lvbl9pZF9hdnAsIEVOT0VOVCkpOworCQkKKwkJQ0hFQ0tfRkNUKCBmZF9kaWN0X25ldyAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsICZleGFtcGxlX2F2cF9kYXRhICwgTlVMTCwgJmV4YW1wbGVfYXZwX2F2cCApKTsKKwkJCisJCXJ1bGVfZGF0YS5ydWxlX2F2cCA9IG9yaWdpbl9ob3N0X2F2cDsKKwkJcnVsZV9kYXRhLnJ1bGVfbWluID0gMTsKKwkJcnVsZV9kYXRhLnJ1bGVfbWF4ID0gMTsKKwkJQ0hFQ0tfRkNUKCBmZF9kaWN0X25ldyAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9SVUxFLCAmcnVsZV9kYXRhLCBleGFtcGxlX2F2cF9hdnAsIE5VTEwgKSk7CisJCQorCQlydWxlX2RhdGEucnVsZV9hdnAgPSBzZXNzaW9uX2lkX2F2cDsKKwkJcnVsZV9kYXRhLnJ1bGVfbWluID0gMTsKKwkJcnVsZV9kYXRhLnJ1bGVfbWF4ID0gLTE7CisJCUNIRUNLX0ZDVCggZmRfZGljdF9uZXcgKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfUlVMRSwgJnJ1bGVfZGF0YSwgZXhhbXBsZV9hdnBfYXZwLCBOVUxMICkpOworCQkKKwl9CisJVFJBQ0VfREVCVUcoSU5GTywgIidFeGFtcGxlLUFWUCcgY3JlYXRlZCB3aXRob3V0IGVycm9yIik7CisJCisJLyogQ2FsbCB0aGUgYysrIGZ1bmN0aW9uICovCisJbXljcHBmdW5jKCk7CisJCisJLyogVGhlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IgY29kZSB3aXRoIHRoZSBzdGFuZGFyZCBQT1NJWCBtZWFuaW5nIChFTk9NRU0sIGFuZCBzbyBvbikgKi8KKwlyZXR1cm4gMDsKK30KKworLyogU2VlIGZpbGUgZmluaS5jIGZvciBhbiBleGFtcGxlIG9mIGRlc3RydWN0b3IgKi8KZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvYWNsX3dsL0NNYWtlTGlzdHMudHh0IGIvZXh0ZW5zaW9ucy9hY2xfd2wvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ1MTE1MAotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvYWNsX3dsL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMjkgQEAKKyMgVGhlIGFjbF93bCBleHRlbnNpb24KK1BST0pFQ1QoIkFjY2VzcyBDb250cm9sIC8gV2hpdGUgTGlzdCIgQykKKworIyBQYXJzZXIgZmlsZXMKK0JJU09OX0ZJTEUoYXdfY29uZi55KQorRkxFWF9GSUxFKGF3X2NvbmYubCkKK1NFVF9TT1VSQ0VfRklMRVNfUFJPUEVSVElFUyhsZXguYXdfY29uZi5jIGF3X2NvbmYudGFiLmMgUFJPUEVSVElFUyBDT01QSUxFX0ZMQUdTICItSSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0iKQorCisjIExpc3Qgb2Ygc291cmNlIGZpbGVzCitTRVQoIEFDTF9XTF9TUkMKKwlhY2xfd2wuaAorCWFjbF93bC5jCisJYXdfdHJlZS5jCisJbGV4LmF3X2NvbmYuYworCWF3X2NvbmYudGFiLmMKKwlhd19jb25mLnRhYi5oCispCisKKyMgQ29tcGlsZSBhcyBhIG1vZHVsZQorRkRfQUREX0VYVEVOU0lPTihhY2xfd2wgJHtBQ0xfV0xfU1JDfSkKKworCisjIyMjCisjIyBJTlNUQUxMIHNlY3Rpb24gIyMKKworIyBXZSBpbnN0YWxsIHdpdGggdGhlIGRhZW1vbiBjb21wb25lbnQgYmVjYXVzZSBpdCBpcyBhIGJhc2UgZmVhdHVyZS4KK0lOU1RBTEwoVEFSR0VUUyBhY2xfd2wKKwlMSUJSQVJZIERFU1RJTkFUSU9OICR7SU5TVEFMTF9FWFRFTlNJT05TX1NVRkZJWH0KKwlDT01QT05FTlQgZnJlZURpYW1ldGVyLWRhZW1vbikKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvYWNsX3dsL2FjbF93bC5jIGIvZXh0ZW5zaW9ucy9hY2xfd2wvYWNsX3dsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI4ZGRkOQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvYWNsX3dsL2FjbF93bC5jCkBAIC0wLDAgKzEsMTE3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxMSwgV0lERSBQcm9qZWN0IGFuZCBOSUNUCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBXSURFIFByb2plY3Qgb3IgTklDVCBub3IgdGhlIAkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFdJREUgUHJvamVjdCBhbmQgCQkJCQkJICoKKyogICBOSUNULgkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIAorICogV2hpdGVsaXN0IGV4dGVuc2lvbiBmb3IgZnJlZURpYW1ldGVyLgorICovCisKKyNpbmNsdWRlICJhY2xfd2wuaCIKKworLyogVGhlIHZhbGlkYXRvciBmdW5jdGlvbiAqLworc3RhdGljIGludCBhd192YWxpZGF0ZShzdHJ1Y3QgcGVlcl9pbmZvICogaW5mbywgaW50ICogYXV0aCwgaW50ICgqKmNiMikoc3RydWN0IHBlZXJfaW5mbyAqKSkKK3sKKwlpbnQgcmVzOworCQorCVRSQUNFX0VOVFJZKCIlcCAlcCAlcCIsIGluZm8sIGF1dGgsIGNiMik7CisJCisJQ0hFQ0tfUEFSQU1TKGluZm8gJiYgYXV0aCAmJiBjYjIpOworCQorCS8qIFdlIGRvbid0IHVzZSB0aGUgc2Vjb25kIGNhbGxiYWNrICovCisJKmNiMiA9IE5VTEw7CisJCisJLyogRGVmYXVsdCB0byB1bmtub3duIHJlc3VsdCAqLworCSphdXRoID0gMDsKKwkKKwkvKiBOb3cgc2VhcmNoIHRoZSBwZWVyIGluIG91ciB0cmVlICovCisJQ0hFQ0tfRkNUKCBhd190cmVlX2xvb2t1cChpbmZvLT5waV9kaWFtaWQsICZyZXMpICk7CisJaWYgKHJlcyA8IDApIHsKKwkJLyogVGhlIHBlZXIgaXMgbm90IHdoaXRlbGlzdGVkICovCisJCXJldHVybiAwOworCX0KKwkKKwkvKiBXZSBmb3VuZCB0aGUgcGVlciBpbiB0aGUgdHJlZSwgbm93IGNoZWNrIHRoZSBzdGF0dXMgKi8KKwkKKwkvKiBGaXJzdCwgaWYgVExTIGlzIGFscmVhZHkgaW4gcGxhY2UsIGp1c3QgYWNjZXB0ICovCisJaWYgKGluZm8tPnJ1bnRpbWUucGlyX2NlcnRfbGlzdCkgeworCQkqYXV0aCA9IDE7CisJCXJldHVybiAwOworCX0KKwkKKwkvKiBOb3csIGlmIHdlIGRpZCBub3Qgc3BlY2lmeSBhbnkgZmxhZywgcmVqZWN0ICovCisJaWYgKHJlcyA9PSAwKSB7CisJCVRSQUNFX0RFQlVHKElORk8sICJQZWVyICclcycgcmVqZWN0ZWQsIG9ubHkgVExTLXByb3RlY3RlZCBjb25uZWN0aW9uIGlzIHdoaXRlbGlzdGVkLiIsIGluZm8tPnBpX2RpYW1pZCk7CisJCS8qIFdlIGRvbid0IGFjdHVhbGx5IHNldCAqYXV0aCA9IC0xLCBsZWF2ZSBzcGFjZSBmb3IgYSBmdXJ0aGVyIGV4dGVuc2lvbiB0byB2YWxpZGF0ZSB0aGUgcGVlciAqLworCQlyZXR1cm4gMDsKKwl9CisJCisJLyogT3RoZXJ3aXNlLCBqdXN0IHNldCB0aGUgY29uZmlndXJlZCBmbGFncyBmb3IgdGhlIHBlZXIsIGFuZCBhdXRob3JpemUgaXQgKi8KKwkqYXV0aCA9IDE7CisJCisJLyogU2F2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VjdXJpdHkgbWVjaGFuaXNtIHRvIHVzZSBhZnRlciBDRVIvQ0VBIGV4Y2hhbmdlICovCisJaWYgKChyZXMgJiBQSV9TRUNfTk9ORSkgJiYgKHJlcyAmIFBJX1NFQ19UTFNfT0xEKSkKKwkJcmVzID0gUElfU0VDX05PTkU7IC8qIElmIHdlIGF1dGhvcml6ZWQgaXQsIHdlIG11c3QgaGF2ZSBhbiBJUHNlYyB0dW5uZWwgc2V0dXAsIG5vIG5lZWQgZm9yIFRMUyBpbiB0aGlzIGNhc2UgKi8KKwkKKwlpbmZvLT5jb25maWcucGljX2ZsYWdzLnNlYyA9IHJlczsKKwlyZXR1cm4gMDsKK30KKworLyogZW50cnkgcG9pbnQgKi8KK3N0YXRpYyBpbnQgYXdfZW50cnkoY2hhciAqIGNvbmZmaWxlKQoreworCVRSQUNFX0VOVFJZKCIlcCIsIGNvbmZmaWxlKTsKKwlDSEVDS19QQVJBTVMoY29uZmZpbGUpOworCQorCS8qIFBhcnNlIGNvbmZpZ3VyYXRpb24gZmlsZSAqLworCUNIRUNLX0ZDVCggYXdfY29uZl9oYW5kbGUoY29uZmZpbGUpICk7CisJCisJVFJBQ0VfREVCVUcoSU5GTywgIkV4dGVuc2lvbiBBQ0xfd2wgaW5pdGlhbGl6ZWQgd2l0aCBjb25maWd1cmF0aW9uOiAnJXMnIiwgY29uZmZpbGUpOworCWlmIChUUkFDRV9CT09MKEFOTk9ZSU5HKSkgeworCQlhd190cmVlX2R1bXAoKTsKKwl9CisJCisJLyogUmVnaXN0ZXIgdGhlIHZhbGlkYXRvciBmdW5jdGlvbiAqLworCUNIRUNLX0ZDVCggZmRfcGVlcl92YWxpZGF0ZV9yZWdpc3RlciAoIGF3X3ZhbGlkYXRlICkgKTsKKworCXJldHVybiAwOworfQorCisvKiBVbmxvYWQgKi8KK3ZvaWQgZmRfZXh0X2Zpbmkodm9pZCkKK3sKKwkvKiBEZXN0cm95IHRoZSB0cmVlICovCisJYXdfdHJlZV9kZXN0cm95KCk7Cit9CisKK0VYVEVOU0lPTl9FTlRSWSgiYWNsX3dsIiwgYXdfZW50cnkpOwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9hY2xfd2wvYWNsX3dsLmggYi9leHRlbnNpb25zL2FjbF93bC9hY2xfd2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjA2YzJhCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9hY2xfd2wvYWNsX3dsLmgKQEAgLTAsMCArMSw2MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTEsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBIZWFkZXIgZmlsZSBmb3IgdGhlIGFjbF93bCBleHRlbnNpb24uIAorICoKKyAqICBUaGlzIGV4dGVuc2lvbiBwcm92aWRlcyBhIHNpbXBsZSBtZWNoYW5pc20gdG8gYWxsb3cgY29ubmVjdGlvbnMgZnJvbSByZW1vdGUgcGVlcnMKKyAqIHdpdGhvdXQgYWN0aXZlbHkgbWFpbnRhaW5pbmcgYSBjb25uZWN0aW9uIHRvIHRoZXNlIHBlZXJzLgorICoKKyAqICBTZWUgdGhlIGFjbF93bC5jb25mLnNhbXBsZSBmaWxlIGZvciB0aGUgZm9ybWF0IG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCisgKi8KKyAKKyNpbmNsdWRlIDxmcmVlRGlhbWV0ZXIvZXh0ZW5zaW9uLmg+CisKKy8qIFBhcnNlIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgKi8KK2ludCBhd19jb25mX2hhbmRsZShjaGFyICogY29uZmZpbGUpOworCisvKiBBZGQgdG8gdGhlIHRyZWUgKG5hbWUgaXMgXDAgdGVybWluYXRlZCkgKi8KK2ludCBhd190cmVlX2FkZChjaGFyICogbmFtZSwgaW50IGZsYWdzKTsKKworLyogU2VhcmNoIGluIHRoZSB0cmVlLiBPbiByZXR1cm4sICpyZXN1bHQgPSAgLTE6IG5vdCBmb3VuZDsgPj0wOiBmb3VuZCB3aXRoIFBJX1NFQ18qIGZsYWdzICovCitpbnQgYXdfdHJlZV9sb29rdXAoY2hhciAqIG5hbWUsIGludCAqIHJlc3VsdCk7CisKKy8qIENsZWFudXAgdGhlIHRyZWUgKi8KK3ZvaWQgYXdfdHJlZV9kZXN0cm95KHZvaWQpOworCisvKiBGb3IgZGVidWcgKi8KK3ZvaWQgYXdfdHJlZV9kdW1wKHZvaWQpOworCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2FjbF93bC9hd19jb25mLmwgYi9leHRlbnNpb25zL2FjbF93bC9hd19jb25mLmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZiNTVjOAotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvYWNsX3dsL2F3X2NvbmYubApAQCAtMCwwICsxLDEwMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTMsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBMZXggZXh0ZW5zaW9uJ3MgY29uZmlndXJhdGlvbiBwYXJzZXIuCisgKgorICogVGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBjb250YWlucyBhIGRlZmF1bHQgcHJpb3JpdHksIGFuZCBhIGxpc3Qgb2YgcGVlcnMgd2l0aCBvcHRpb25hbCBvdmVyd2l0ZSBwcmlvcml0eS4KKyAqIC0tIHNlZSB0aGUgYXBwX3Rlc3QuY29uZi5zYW1wbGUgZmlsZSBmb3IgbW9yZSBkZXRhaWwuCisgKi8KKworJXsKKyNpbmNsdWRlICJhY2xfd2wuaCIKKy8qIEluY2x1ZGUgeWFjYyB0b2tlbnMgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlICJhd19jb25mLnRhYi5oIgorCisvKiBVcGRhdGUgdGhlIGNvbHVtbiBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBZWV9VU0VSX0FDVElPTiB7IAkJCQkJCVwKKwl5eWxsb2MtPmZpcnN0X2NvbHVtbiA9IHl5bGxvYy0+bGFzdF9jb2x1bW4gKyAxOyAJCVwKKwl5eWxsb2MtPmxhc3RfY29sdW1uID0geXlsbG9jLT5maXJzdF9jb2x1bW4gKyB5eWxlbmcgLSAxOwlcCit9CisKKy8qIEF2b2lkIHdhcm5pbmcgd2l0aCBuZXdlciBmbGV4ICovCisjZGVmaW5lIFlZX05PX0lOUFVUCisKK3N0YXRpYyBpbnQgY3VyZmxhZyA9IDA7CisKKyV9CisKKyVvcHRpb24gYmlzb24tYnJpZGdlIGJpc29uLWxvY2F0aW9ucworJW9wdGlvbiBub3l5d3JhcAorJW9wdGlvbiBub3VucHV0CisKKyUlCisKKwkvKiBVcGRhdGUgdGhlIGxpbmUgY291bnQsIHJlc2V0IGZsYWcgdmFsdWUgKi8KK1xuCQkJeworCQkJCXl5bGxvYy0+Zmlyc3RfbGluZSsrOyAKKwkJCQl5eWxsb2MtPmxhc3RfbGluZSsrOyAKKwkJCQl5eWxsb2MtPmxhc3RfY29sdW1uPTA7IAorCQkJCWN1cmZsYWcgPSAwOworCQkJfQorCSAKKwkvKiBFYXQgYWxsIHNwYWNlcyBidXQgbm90IG5ldyBsaW5lcyAqLworKFtbOnNwYWNlOl1dey19W1xuXSkrCTsKKwkvKiBFYXQgYWxsIGNvbW1lbnRzICovCisjLiokCQkJOworCisJLyogTWF0Y2ggdGhlIHR3byBhbGxvd2VkIGZsYWdzIGRpcmVjdGx5IGluIExFWCAqLworQUxMT1dfSVBTRUMJCXsKKwkJCQljdXJmbGFnIHw9IFBJX1NFQ19OT05FOworCQkJfQorCitBTExPV19PTERfVExTCQl7CisJCQkJY3VyZmxhZyB8PSBQSV9TRUNfVExTX09MRDsKKwkJCX0KKworCS8qIEFueSBvdGhlciBzdHJpbmcgaXMgY29uc2lkZXJlZCBhIGZxZG4gb3IgcGFydGlhbCBmcWRuIHdpdGggYSBzdGFyLiBUaGUgc3RhciBjYW4gb25seSBiZSB0aGUgZmlyc3QgbGFiZWwuICovCisoXCp8W1s6YWxudW06XV1bWzphbG51bTpdLV0qKShcLltbOmFsbnVtOl1dW1s6YWxudW06XS1dKikrCXsKKwkJCQkvKiBXZSBtYXRjaGVkIGEgdmFsaWQgbGFiZWwsIGxldCdzIGRpcmVjdGx5IHNhdmUgaXQgaW50byB0aGUgdHJlZS4gVGhlIGZ1bmN0aW9uIHdpbGwgaXNzdWUgdGhlIGFwcHJvcHJpYXRlIHdhcm5pbmdzLiAqLworCQkJCUNIRUNLX0ZDVF9ETyggYXdfdHJlZV9hZGQoeXl0ZXh0LCBjdXJmbGFnKSwgcmV0dXJuIExFWF9FUlJPUik7CisJCQkJeXlsdmFsLT5zdHJpbmcgPSB5eXRleHQ7CisJCQkJcmV0dXJuIEZRRE47CisJCQl9CisKKwkvKiBObyBtYXRjaCAqLworPCo+W1s6YWxudW06XV0rCQl8CS8qIFRoaXMgcnVsZSBpcyBvbmx5IHVzZWZ1bCB0byBwcmludCBhIGNvbXBsZXRlIHRva2VuIGluIGVycm9yIG1lc3NhZ2VzICovCis8Kj4uCQkJeworCQkJCVRSQUNFX0VSUk9SKCJVbnJlY29nbml6ZWQgdGV4dCBvbiBsaW5lICVkIGNvbCAlZDogJyVzJy4iLCB5eWxsb2MtPmZpcnN0X2xpbmUsIHl5bGxvYy0+Zmlyc3RfY29sdW1uLCB5eXRleHQpOworCQkJIAlyZXR1cm4gTEVYX0VSUk9SOyAKKwkJCX0KKworJSUKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvYWNsX3dsL2F3X2NvbmYueSBiL2V4dGVuc2lvbnMvYWNsX3dsL2F3X2NvbmYueQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWNlOGU1Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9hY2xfd2wvYXdfY29uZi55CkBAIC0wLDAgKzEsMTQxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxMywgV0lERSBQcm9qZWN0IGFuZCBOSUNUCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBXSURFIFByb2plY3Qgb3IgTklDVCBub3IgdGhlIAkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFdJREUgUHJvamVjdCBhbmQgCQkJCQkJICoKKyogICBOSUNULgkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFlhY2MgZXh0ZW5zaW9uJ3MgY29uZmlndXJhdGlvbiBwYXJzZXIuCisgKiBTZWUgZG9jL2FjbF93bC5jb25mLnNhbXBsZSBmb3IgY29uZmlndXJhdGlvbiBmaWxlIGZvcm1hdAorICovCisKKy8qIEZvciBkZXZlbG9wbWVudCBvbmx5IDogKi8KKyVkZWJ1ZyAKKyVlcnJvci12ZXJib3NlCisKKy8qIFRoZSBwYXJzZXIgcmVjZWl2ZXMgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBmaWxlbmFtZSBhcyBwYXJhbWV0ZXIgKi8KKyVwYXJzZS1wYXJhbSB7Y2hhciAqIGNvbmZmaWxlfQorCisvKiBLZWVwIHRyYWNrIG9mIGxvY2F0aW9uICovCislbG9jYXRpb25zIAorJXB1cmUtcGFyc2VyCisKKyV7CisjaW5jbHVkZSAiYWNsX3dsLmgiCisjaW5jbHVkZSAiYXdfY29uZi50YWIuaCIJLyogYmlzb24gaXMgbm90IHNtYXJ0IGVub3VnaCB0byBkZWZpbmUgdGhlIFlZTFRZUEUgYmVmb3JlIGluY2x1ZGluZyB0aGlzIGNvZGUsIHNvLi4uICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9uICovCitpbnQgeXlwYXJzZShjaGFyICogY29uZmZpbGUpOworCitzdGF0aWMgaW50IGZxZG5fYWRkZWQgPSAwOworCisvKiBQYXJzZSB0aGUgY29uZmlndXJhdGlvbiBmaWxlICovCitpbnQgYXdfY29uZl9oYW5kbGUoY2hhciAqIGNvbmZmaWxlKQoreworCWV4dGVybiBGSUxFICogYXdfY29uZmluOworCWludCByZXQ7CisJCisJVFJBQ0VfRU5UUlkoIiVwIiwgY29uZmZpbGUpOworCQorCVRSQUNFX0RFQlVHIChGVUxMLCAiUGFyc2luZyBjb25maWd1cmF0aW9uIGZpbGU6ICVzLi4uIiwgY29uZmZpbGUpOworCQorCWF3X2NvbmZpbiA9IGZvcGVuKGNvbmZmaWxlLCAiciIpOworCWlmIChhd19jb25maW4gPT0gTlVMTCkgeworCQlyZXQgPSBlcnJubzsKKwkJZmRfbG9nX2RlYnVnKCJVbmFibGUgdG8gb3BlbiBleHRlbnNpb24gY29uZmlndXJhdGlvbiBmaWxlICVzIGZvciByZWFkaW5nOiAlcyIsIGNvbmZmaWxlLCBzdHJlcnJvcihyZXQpKTsKKwkJVFJBQ0VfREVCVUcgKElORk8sICJFcnJvciBvY2N1cnJlZCwgbWVzc2FnZSBsb2dnZWQgLS0gY29uZmlndXJhdGlvbiBmaWxlLiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHl5cGFyc2UoY29uZmZpbGUpOworCisJZmNsb3NlKGF3X2NvbmZpbik7CisKKwlpZiAocmV0ICE9IDApIHsKKwkJVFJBQ0VfREVCVUcgKElORk8sICJVbmFibGUgdG8gcGFyc2UgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4iKTsKKwkJcmV0dXJuIEVJTlZBTDsKKwl9IGVsc2UgeworCQlUUkFDRV9ERUJVRyhGVUxMLCAiUmVhZCAlZCBGUUROIGVudHJpZXMgc3VjY2Vzc2Z1bGx5LiIsIGZxZG5fYWRkZWQpOworCX0KKwkKKwlyZXR1cm4gMDsKK30KKworLyogVGhlIExleCBwYXJzZXIgcHJvdG90eXBlICovCitpbnQgYXdfY29uZmxleChZWVNUWVBFICpsdmFscCwgWVlMVFlQRSAqbGxvY3ApOworCisvKiBGdW5jdGlvbiB0byByZXBvcnQgdGhlIGVycm9ycyAqLwordm9pZCB5eWVycm9yIChZWUxUWVBFICpwbG9jLCBjaGFyICogY29uZmZpbGUsIGNoYXIgY29uc3QgKnMpCit7CisJVFJBQ0VfREVCVUcoSU5GTywgIkVycm9yIGluIGNvbmZpZ3VyYXRpb24gcGFyc2luZyIpOworCQorCWlmIChwbG9jLT5maXJzdF9saW5lICE9IHBsb2MtPmxhc3RfbGluZSkKKwkJZmRfbG9nX2RlYnVnKCIlczolZC4lZC0lZC4lZCA6ICVzIiwgY29uZmZpbGUsIHBsb2MtPmZpcnN0X2xpbmUsIHBsb2MtPmZpcnN0X2NvbHVtbiwgcGxvYy0+bGFzdF9saW5lLCBwbG9jLT5sYXN0X2NvbHVtbiwgcyk7CisJZWxzZSBpZiAocGxvYy0+Zmlyc3RfY29sdW1uICE9IHBsb2MtPmxhc3RfY29sdW1uKQorCQlmZF9sb2dfZGVidWcoIiVzOiVkLiVkLSVkIDogJXMiLCBjb25mZmlsZSwgcGxvYy0+Zmlyc3RfbGluZSwgcGxvYy0+Zmlyc3RfY29sdW1uLCBwbG9jLT5sYXN0X2NvbHVtbiwgcyk7CisJZWxzZQorCQlmZF9sb2dfZGVidWcoIiVzOiVkLiVkIDogJXMiLCBjb25mZmlsZSwgcGxvYy0+Zmlyc3RfbGluZSwgcGxvYy0+Zmlyc3RfY29sdW1uLCBzKTsKK30KKworJX0KKworLyogVmFsdWVzIHJldHVybmVkIGJ5IGxleCBmb3IgdG9rZW4gKi8KKyV1bmlvbiB7CisJY2hhciAJCSAqc3RyaW5nOworfQorCisvKiBJbiBjYXNlIG9mIGVycm9yIGluIHRoZSBsZXhpY2FsIGFuYWx5c2lzICovCisldG9rZW4gCQlMRVhfRVJST1IKKworLyogS2V5IHdvcmRzICovCisldG9rZW4gPHN0cmluZz4JRlFETgorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCislJQorCisJLyogVGhlIGdyYW1tYXIgZGVmaW5pdGlvbiAqLworY29uZmZpbGU6CQkvKiBlbXB0eSBncmFtbWFyIGlzIE9LICovCisJCQl8IGNvbmZmaWxlIEZRRE4KKwkJCXsKKwkJCQlmcWRuX2FkZGVkKys7CisJCQkJVFJBQ0VfREVCVUcoRlVMTCwgIkFkZGVkIEZRRE46ICVzIiwgJDIpOworCQkJfQorCQkJfCBjb25mZmlsZSBMRVhfRVJST1IKKwkJCXsKKwkJCQl5eWVycm9yKCZ5eWxsb2MsIGNvbmZmaWxlLCAiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcGFyc2luZyB0aGUgY29uZmlndXJhdGlvbiBmaWxlIik7CisJCQkJcmV0dXJuIEVJTlZBTDsKKwkJCX0KKwkJCTsKKwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9hY2xfd2wvYXdfdHJlZS5jIGIvZXh0ZW5zaW9ucy9hY2xfd2wvYXdfdHJlZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliOWNiZDgKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2FjbF93bC9hd190cmVlLmMKQEAgLTAsMCArMSw0MTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDEzLCBXSURFIFByb2plY3QgYW5kIE5JQ1QJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFdJREUgUHJvamVjdCBvciBOSUNUIG5vciB0aGUgCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgV0lERSBQcm9qZWN0IGFuZCAJCQkJCQkgKgorKiAgIE5JQ1QuCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImFjbF93bC5oIgorCisvKiBUaGUgY29uZmlndXJhdGlvbiBzaW1wbHkgY29udGFpbnMgdGhlIGFsbG93ZWQgZnFkbiBhbmQvb3IgZG9tYWlucyAoKi5leGFtcGxlLm5ldCkKKyAqIEl0IGlzIHJlcHJlc2VudGVkIHNpbWlsYXJseSB0byB0aGUgRE5TIHRyZWU6CisgKiAgICAgICAgICAgICAgKHJvb3QpLS1fX18KKyAqICAgICAgICAgICAgICAvICAgIFwgICAgIFwKKyAqICAgICAgICAgICAgdGxkMSAgdGxkMiAgICh0bGQzLi4uKQorICogICAgICAgICAgICAgLyAgICAgIHwKKyAqICAgICAgICAgIGxhYmVsMSAgIGxhYmVsMgorICogICAgICAgICAgICAgICAgICAgIC8gICBcCisgKiAgICAgICAgICAgICAgICAgbGJsMjEgbGJsMjIKKyAqICAgICAgICAgICAgICAgICAgLyAgICAgICBcCisgKiAgICAgICAgICAgICAgIGxibDIxMSAgICAgICoKKyAqCisgKiBUaGlzIHRyZWUgd291bGQgd2hpdGVsaXN0OgorICogICAtIGxhYmVsMS50bGQxCisgKiAgIC0gbGJsMjExLmxibDIxLmxhYmVsMi50bGQyCisgKiAgIC0gKi5sYmwyMi5sYWJlbDIudGxkMgorICoKKyAqIFRoZSBmdW5jdGlvbnMgdG8gYWRkIGFuZCBzZWFyY2ggdGhlIHRyZWUgYXJlIGluIGF3X3RyZWUuYy4KKyAqCisgKi8KKyAKKy8qIE1heGltdW0gZGVwdGggb2YgdGhlIHRyZWUuIFdlIHNldCBhIHN0YXRpYyBzaXplIHRvIGF2b2lkIGR5bmFtaWMgYWxsb2NhdGlvbnMuIFdlIHJlcG9ydCBhbiBlcnJvciBpZiB0aGlzIGlzIG5vdCBzdWZmaWNpZW50LiAqLworI2RlZmluZSBBV19UUkVFX01BWERFUFRIIDEwCisKKy8qIEFuIGVsZW1lbnQgb2YgdGhlIHRyZWUgKi8KK3N0cnVjdCB0cmVlX2l0ZW0geworCXN0cnVjdCBmZF9saXN0CWNoYWluOwkJLyogTGluayB0byBlbGVtZW50cyBhdCB0aGUgc2FtZSBsZXZlbC4gT3JkZXJlZCBhbHBoYWJldGljYWxseS4gKi8KKwlzdHJ1Y3QgZmRfbGlzdAljaGlsZHJlbjsJLyogU2VudGluZWwgZm9yIHRoZSBzdWJ0cmVlLiAqLworCWNoYXIgKgkJc3RyOwkvKiB0aGUgXDAgdGVybWluYXRlZCBsYWJlbCwgb3IgTlVMTCBpZiBpdCBpcyBhIGdlbmVyaWMgY29udGFpbmVyICgiKiIpICovCisJaW50CQlmbGFnczsJLyogUElfU0VDXyogZmxhZ3MgKi8KKwlpbnQJCWxlYWY7CS8qIHRydWUgaWYgdGhpcyBpdGVtIGNhbiBiZSBhIGxlYWYgb2YgdGhlIHRyZWUgKi8KK307CisKKy8qIFRoZSByb290IG9mIHRoZSB0cmVlICovCitzdGF0aWMgc3RydWN0IGZkX2xpc3QgdHJlZV9yb290ID0gRkRfTElTVF9JTklUSUFMSVpFUih0cmVlX3Jvb3QpOworCisvKiBOb3RlOiB3ZSBkb24ndCBuZWVkIHRvIGxvY2ssIHNpbmNlIHdlIGFkZCBvbmx5IHdoZW4gcGFyc2luZyB0aGUgY29uZiwgYW5kIHRoZW4gcmVhZCBvbmx5ICovCisKKworLyogVGhlIHBhcnNlZCBuYW1lICovCitzdHJ1Y3Qgc3BsaXRfbmFtZSB7CisJc3RydWN0IHsKKwkJY2hhciAqIHN0cjsJLyogc3RhcnQgb2YgdGhpcyBsYWJlbCAqLworCQlzaXplX3QgbGVuOwkvKiBsZW5ndGggb2YgdGhpcyBsYWJlbC4gSXQgZG9lcyBub3QgaW5jbHVkZSB0aGUgZmluYWwgIi4iIG9yICJcMCIgKi8KKwl9ICAgbGFiZWxbQVdfVFJFRV9NQVhERVBUSF07CisJaW50IGxhc3RfbGJsOwkvKiBpZHggb2YgbGFzdCBsYWJlbCBkZWZpbmVkICovCit9OworCisvKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIGV4cGxvZGVzIGEgbmFtZSBpbnRvIGEgc3BsaXRfbmFtZSBzdHJ1Y3R1cmUgKi8KK3N0YXRpYyBpbnQgcGFyc2VfbmFtZShjaGFyICogbmFtZSwgc3RydWN0IHNwbGl0X25hbWUgKiByZXN1bHQpCit7CisJaW50IGksIGwsIHByZXZfb2Zmc2V0OworCQorCVRSQUNFX0VOVFJZKCIlcCAlcCIsIG5hbWUsIHJlc3VsdCk7CisJCisJLyogRmlyc3QsIGluaXRpYWxpemUgdGhlIHJlc3VsdCBhcnJheSAqLworCW1lbXNldChyZXN1bHQsIDAsIHNpemVvZihzdHJ1Y3Qgc3BsaXRfbmFtZSkpOworCXJlc3VsdC0+bGFiZWxbMF0uc3RyID0gbmFtZTsKKwlsID0gMDsgcHJldl9vZmZzZXQgPSAwOworCQorCWZvciAoaT0wOyBuYW1lW2ldICE9ICdcMCc7IGkrKykgeworCQlpZiAobmFtZVtpXT09Jy4nKSB7CisJCQlsKys7CisJCQlDSEVDS19QQVJBTVMoIGwgPCBBV19UUkVFX01BWERFUFRIICk7CisJCQkKKwkJCS8qIFRoZSBwcmV2aW91cyBsYWJlbCBpcyBjb21wbGV0ZSwgd3JpdGUgaXRzIHNpemUgKi8KKwkJCXJlc3VsdC0+bGFiZWxbbCAtIDFdLmxlbiA9IGkgLSBwcmV2X29mZnNldDsKKwkJCXByZXZfb2Zmc2V0ID0gaSArIDE7CisJCQkKKwkJCS8qIFdyaXRlIHRoZSBzdGFydCBvZiB0aGUgbmV3IGxhYmVsICovCisJCQlyZXN1bHQtPmxhYmVsW2xdLnN0ciA9IG5hbWUgKyBpICsgMTsKKwkJfQorCX0KKwkKKwkvKiBGaW5hbGx5LCB3cml0ZSB0aGUgc2l6ZSBvZiB0aGUgbGFzdCBsYWJlbCAqLworCXJlc3VsdC0+bGFiZWxbbF0ubGVuID0gaSAtIHByZXZfb2Zmc2V0OworCQorCXJlc3VsdC0+bGFzdF9sYmwgPSBsOworCQorI2lmIDAKKwlmZF9sb2dfZGVidWcoIlBhcnNlZCBuYW1lICVzIGFzOiIsIG5hbWUpOworCWZvciAoaT0wOyBpPD1sOyBpKyspCisJCWZkX2xvZ19kZWJ1ZygiICBzdHJbJWRdIGxlbjogJWQsIHY6JS4qcyIsIGksIHJlc3VsdC0+bGFiZWxbaV0ubGVuLCByZXN1bHQtPmxhYmVsW2ldLmxlbiwgcmVzdWx0LT5sYWJlbFtpXS5zdHIpOworI2VuZGlmIC8qIDAgKi8KKwlyZXR1cm4gMDsKK30KKworLyogQ3JlYXRlIGEgbmV3IHRyZWVfaXRlbSBzdHJ1Y3R1cmUgKi8KK3N0YXRpYyBzdHJ1Y3QgdHJlZV9pdGVtICogbmV3X3RpKGNoYXIgKiBzdHIsIHNpemVfdCBsZW4sIGludCBmbGFncywgaW50IGxlYWYpCit7CisJc3RydWN0IHRyZWVfaXRlbSAqIHRpOworCWNoYXIgKiBzID0gTlVMTDsKKwkKKwlUUkFDRV9FTlRSWSgiJXAgJXpkICV4Iiwgc3RyLCBsZW4sIGZsYWdzKTsKKwkKKwlpZiAoc3RyKSB7CisJCUNIRUNLX01BTExPQ19ETyhzID0gbWFsbG9jKGxlbiArIDEpLCByZXR1cm4gTlVMTCk7CisJCW1lbWNweShzLCBzdHIsIGxlbik7CisJCXNbbGVuXSA9ICdcMCc7CisJfQorCQorCUNIRUNLX01BTExPQ19ETyggdGkgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCB0cmVlX2l0ZW0pKSwge2ZyZWUocyk7IHJldHVybiBOVUxMOyB9ICk7CisJbWVtc2V0KHRpLCAwLCBzaXplb2Yoc3RydWN0IHRyZWVfaXRlbSkpOworCQorCWZkX2xpc3RfaW5pdCgmdGktPmNoYWluLCB0aSk7CisJZmRfbGlzdF9pbml0KCZ0aS0+Y2hpbGRyZW4sIHRpKTsKKwl0aS0+c3RyID0gczsKKwl0aS0+ZmxhZ3MgPSBmbGFnczsKKwl0aS0+bGVhZiA9IGxlYWY7CisJCisJcmV0dXJuIHRpOworfQorCisvKiBSZWN1cnNpdmVseSBkZWxldGUgYSBzdWJ0cmVlICovCitzdGF0aWMgdm9pZCBkZWxldGVfdHJlZShzdHJ1Y3QgZmRfbGlzdCAqIHNlbnRpKQoreworCXdoaWxlICghRkRfSVNfTElTVF9FTVBUWShzZW50aSkpIHsKKwkJc3RydWN0IHRyZWVfaXRlbSAqIHRpID0gKHN0cnVjdCB0cmVlX2l0ZW0gKikoc2VudGktPm5leHQpOworCQkKKwkJLyogRGVsZXRlIHJlY3Vyc2l2ZWx5IGl0cyBjaGlsZHJlbiBmaXJzdCAqLworCQlkZWxldGVfdHJlZSgmdGktPmNoaWxkcmVuKTsKKwkJCisJCS8qIE5vdywgdW5saW5rIGZyb20gdGhlIHNlbnRpbmVsIGxpc3QgKi8KKwkJZmRfbGlzdF91bmxpbmsoJnRpLT5jaGFpbik7CisJCQorCQkvKiBkZXN0cm95IHRoaXMgdHJlZSBpdGVtICovCisJCWZyZWUodGktPnN0cik7CisJCWZyZWUodGkpOworCX0KK30KKworLyogVG9wLWxldmVsIGRlc3Ryb3kgZnVuY3Rpb24gKi8KK3ZvaWQgYXdfdHJlZV9kZXN0cm95KHZvaWQpCit7CisJZGVsZXRlX3RyZWUoJnRyZWVfcm9vdCk7Cit9CisKKy8qIERpc3BsYXkgdGhlIGNvbnRlbnQgb2YgYSBzdWJ0cmVlICovCitzdGF0aWMgdm9pZCB0cmVlX2R1bXAoc3RydWN0IGZkX2xpc3QgKiBzdWIsIGludCBpbmRlbnQpCit7CisJc3RydWN0IGZkX2xpc3QgKiBsaTsKKwlmb3IgKGxpID0gc3ViLT5uZXh0OyBsaSAhPSBzdWI7IGxpID0gbGktPm5leHQpIHsKKwkJc3RydWN0IHRyZWVfaXRlbSAqIHRpID0gKHN0cnVjdCB0cmVlX2l0ZW0gKilsaTsKKwkJY2hhciBidWZbMTAyNF07CisJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlKnMlcyIsIGluZGVudCAqIDIsICIiLCB0aS0+c3RyPzoiKiIpOworCQlpZiAodGktPmxlYWYpCisJCQlzbnByaW50ZihidWYrc3RybGVuKGJ1ZiksIHNpemVvZihidWYpLXN0cmxlbihidWYpLCAiIChmbGFnOiV4KSIsIHRpLT5mbGFncyk7CisJCWZkX2xvZ19kZWJ1ZygiJXMiLCBidWYpOworCQl0cmVlX2R1bXAoJnRpLT5jaGlsZHJlbiwgaW5kZW50ICsgMSk7CisJfQorfQorCisvKiBUb3AtbGV2ZWwgZnVuY3Rpb24gKi8KK3ZvaWQgYXdfdHJlZV9kdW1wKHZvaWQpCit7CisJZmRfbG9nX2RlYnVnKCJbYWNsX3dsXSB0cmVlIGR1bXA6Iik7CisJZmRfbG9nX2RlYnVnKCIocm9vdCkiKTsKKwl0cmVlX2R1bXAoJnRyZWVfcm9vdCwgMSk7CisJZmRfbG9nX2RlYnVnKCJbYWNsX3dsXSBlbmQgb2YgZHVtcCIpOworfQorCisvKiBGdW5jdGlvbiB0byBhZGQgYSBuZXcgZW50cnkgaW4gdGhlIHRyZWUgKi8KK2ludCBhd190cmVlX2FkZChjaGFyICogbmFtZSwgaW50IGZsYWdzKQoreworCXN0cnVjdCBzcGxpdF9uYW1lIHNuOworCXN0cnVjdCB0cmVlX2l0ZW0gKiB0aTsKKwlzdHJ1Y3QgZmRfbGlzdCAqIGxpLCAqc2VudGk7CisJaW50IGxibCwgZm91bmQ7CisJCisJVFJBQ0VfRU5UUlkoIiVwICV4IiwgbmFtZSwgZmxhZ3MpOworCUNIRUNLX1BBUkFNUyhuYW1lICYmICpuYW1lKTsKKwkKKwlDSEVDS19GQ1RfRE8oIHBhcnNlX25hbWUobmFtZSwgJnNuKSwgCisJCXsgCisJCQlmZF9sb2dfZGVidWcoIlRoZSBuYW1lICclcycgY29udGFpbnMgdG9vIG1hbnkgbGFiZWxzLCB0cnkgYSBnZW5lcmljICgqKSBvciByZWNvbXBpbGUgd2l0aCBiaWdnZXIgQVdfVFJFRV9NQVhERVBUSCB2YWx1ZSAoY3VyOiAlZCkiLCBuYW1lLCBBV19UUkVFX01BWERFUFRIKTsgCisJCQlyZXR1cm4gRUlOVkFMOyAKKwkJfSApOworCQkKKwlzZW50aSA9ICZ0cmVlX3Jvb3Q7CisJCisJZm9yIChsYmwgPSBzbi5sYXN0X2xibDsgbGJsID4gMDsgbGJsLS0pIHsKKwkJLyogQ2hlY2sgaWYgdGhlIGxpc3QgaXMgZW1wdHksIHdlIGNhbiBkaXJlY3RseSBjcmVhdGUgdGhlIG5ldyBlbnRyeSAqLworCQlpZiAoRkRfSVNfTElTVF9FTVBUWShzZW50aSkpIHsKKwkJCUNIRUNLX01BTExPQyggdGkgPSBuZXdfdGkoc24ubGFiZWxbbGJsXS5zdHIsIHNuLmxhYmVsW2xibF0ubGVuLCAwLCAwIC8qIGZsYWdzIGFyZSBvbmx5IHNldCBpbiB0aGUgdGVybWluYWxzICovKSApOworCQkJLyogSW5zZXJ0IHRoaXMgbGFiZWwgaW4gdGhlIHNlbnRpbmVsIHN1Ymxpc3QgKi8KKwkJCWZkX2xpc3RfaW5zZXJ0X2FmdGVyKHNlbnRpLCAmdGktPmNoYWluKTsKKwkJCS8qIFVwZGF0ZSB0aGUgc2VudGluZWwgKi8KKwkJCXNlbnRpID0gJnRpLT5jaGlsZHJlbjsKKwkJCS8qIGxvb3AgdG8gdGhlIG5leHQgbGFiZWwgKi8KKwkJCWNvbnRpbnVlOworCQl9CisJCQorCQkvKiBDaGVjayBpZiB3ZSBoYXZlIGEgJyonIGVsZW1lbnQgYWxyZWFkeSB0aGF0IG92ZXJsYXBzZXMgKi8KKwkJdGkgPSAoc3RydWN0IHRyZWVfaXRlbSAqKShzZW50aS0+bmV4dCk7CisJCWlmICh0aS0+c3RyID09IE5VTEwpIHsKKwkJCWZkX2xvZ19kZWJ1ZygiW2FjbF93bF0gV2FybmluZzogZW50cnkgJyVzJyBpcyBzdXBlcnNlZWRlZCBieSBhIGdlbmVyaWMgZW50cnkgYXQgbGFiZWwgJWQsIGlnbm9yaW5nLiIsIG5hbWUsIGxibCArIDEpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJCisJCS8qIFNlYXJjaCB0aGlzIGxhYmVsIGluIHRoZSBvcmRlcmVkIGxpc3QgKi8KKwkJZm91bmQgPSAwOworCQlmb3IgKGxpID0gc2VudGktPm5leHQ7IGxpICE9IHNlbnRpOyBsaT1saS0+bmV4dCkgeworCQkJaW50IGNtcCwgbGVuOworCQkJdGkgPSAoc3RydWN0IHRyZWVfaXRlbSAqKWxpOworCQkJCisJCQljbXAgPSBzdHJuY2FzZWNtcCh0aS0+c3RyLCBzbi5sYWJlbFtsYmxdLnN0ciwgc24ubGFiZWxbbGJsXS5sZW4pOworCQkJaWYgKGNtcCA+IDApCisJCQkJYnJlYWs7CS8qIHRoZSBuZXcgbGFiZWwgbXVzdCBiZSBpbnNlcnRlZCBiZWZvcmUgbGkgKi8KKwkJCWlmIChjbXAgPCAwKQorCQkJCWNvbnRpbnVlOworCQkJCisJCQkvKiBDaGVjayB0aGUgbGVuZ3RocyAqLworCQkJbGVuID0gc3RybGVuKHRpLT5zdHIpOworCQkJaWYgKGxlbiA+IHNuLmxhYmVsW2xibF0ubGVuKQorCQkJCWJyZWFrOwkvKiB0aGUgbmV3IGxhYmVsIG11c3QgYmUgaW5zZXJ0ZWQgYmVmb3JlIGxpICovCisJCQlpZiAobGVuIDwgc24ubGFiZWxbbGJsXS5sZW4pCisJCQkJY29udGludWU7CisJCQkKKwkJCS8qIFdlIGFscmVhZHkgaGFkIHRoaXMgbGFiZWwgKi8KKwkJCWZvdW5kID0gMTsKKwkJCXNlbnRpID0gJnRpLT5jaGlsZHJlbjsKKwkJCWJyZWFrOworCQl9CisJCQorCQlpZiAoZm91bmQpCisJCQljb250aW51ZTsKKwkJCisJCS8qIE90aGVyd2lzZSwgd2UgaGF2ZSB0byBjcmVhdGUgYSBuZXcgdGksIGFuZCBhZGQgaXQgYmVmb3JlIGxpICovCisJCUNIRUNLX01BTExPQyggdGkgPSBuZXdfdGkoc24ubGFiZWxbbGJsXS5zdHIsIHNuLmxhYmVsW2xibF0ubGVuLCAwLCAwIC8qIGZsYWdzIGFyZSBvbmx5IHNldCBpbiB0aGUgdGVybWluYWxzICovKSApOworCQkvKiBJbnNlcnQgdGhpcyBsYWJlbCBpbiB0aGUgc2VudGluZWwgc3VibGlzdCAqLworCQlmZF9saXN0X2luc2VydF9iZWZvcmUobGksICZ0aS0+Y2hhaW4pOworCQkvKiBVcGRhdGUgdGhlIHNlbnRpbmVsICovCisJCXNlbnRpID0gJnRpLT5jaGlsZHJlbjsKKwl9CisJCisJdGkgPSBOVUxMOworCWxpID0gc2VudGk7CisJCisJLyogQXQgdGhpcyBwb2ludCwgc2VudGkgcG9pbnRzIHRvIHRoZSBsaXN0IHdoZXJlIHdlIGFyZSBzdXBwb3NlZCB0byBpbnNlcnQgb3VyIGxhc3QgbGFiZWwuICovCisJaWYgKHNuLmxhYmVsWzBdLnN0clswXSA9PSAnKicpIHsKKwkJaWYgKCFGRF9JU19MSVNUX0VNUFRZKHNlbnRpKSkgeworCQkJZmRfbG9nX2RlYnVnKCJbYWNsX3dsXSBXYXJuaW5nOiBlbnRyeSAnJXMnIG92ZXJ3cml0ZXMgcHJldmlvdXMgbW9yZSBkZXRhaWxlZCBlbnRyaWVzLCB0aGVzZSBhcmUgZGVsZXRlZC4iLCBuYW1lKTsKKwkJCWRlbGV0ZV90cmVlKHNlbnRpKTsKKwkJfQorCQkKKwkJLyogQ3JlYXRlIHRoZSBuZXcgZW50cnkgKi8KKwkJQ0hFQ0tfTUFMTE9DKCB0aSA9IG5ld190aShOVUxMLCAwLCBmbGFncywgMSkgKTsKKwl9IGVsc2UgeworCQlpZiAoIUZEX0lTX0xJU1RfRU1QVFkoc2VudGkpKSB7CisJCQkvKiBDaGVjayB3ZSBkb24ndCBoYXZlIGEgJyonIGVudHJ5IGFscmVhZHkgKi8KKwkJCXRpID0gKHN0cnVjdCB0cmVlX2l0ZW0gKikoc2VudGktPm5leHQpOworCQkJaWYgKHRpLT5zdHIgPT0gTlVMTCkgeworCQkJCWZkX2xvZ19kZWJ1ZygiW2FjbF93bF0gV2FybmluZzogZW50cnkgJyVzJyBpcyBzdXBlcnNlZWRlZCBieSBhIGdlbmVyaWMgZW50cnkgYXQgbGFiZWwgMSwgaWdub3JpbmcuIiwgbmFtZSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQkKKwkJCS8qIFNlYXJjaCB0aGUgcGxhY2UgZm9yIHRoZSBuZXcgbGFiZWwgKi8KKwkJCWZvciAobGkgPSBzZW50aS0+bmV4dDsgbGkgIT0gc2VudGk7IGxpPWxpLT5uZXh0KSB7CisJCQkJaW50IGNtcCwgbGVuOworCQkJCXRpID0gKHN0cnVjdCB0cmVlX2l0ZW0gKilsaTsKKworCQkJCWNtcCA9IHN0cm5jYXNlY21wKHRpLT5zdHIsIHNuLmxhYmVsWzBdLnN0ciwgc24ubGFiZWxbMF0ubGVuKTsKKwkJCQlpZiAoY21wID4gMCkKKwkJCQkJYnJlYWs7CS8qIHRoZSBuZXcgbGFiZWwgbXVzdCBiZSBpbnNlcnRlZCBiZWZvcmUgbGkgKi8KKwkJCQlpZiAoY21wIDwgMCkKKwkJCQkJY29udGludWU7CisKKwkJCQkvKiBDaGVjayB0aGUgbGVuZ3RocyAqLworCQkJCWxlbiA9IHN0cmxlbih0aS0+c3RyKTsKKwkJCQlpZiAobGVuID4gc24ubGFiZWxbMF0ubGVuKQorCQkJCQlicmVhazsJLyogdGhlIG5ldyBsYWJlbCBtdXN0IGJlIGluc2VydGVkIGJlZm9yZSBsaSAqLworCQkJCWlmIChsZW4gPCBzbi5sYWJlbFswXS5sZW4pCisJCQkJCWNvbnRpbnVlOworCisJCQkJLyogV2UgYWxyZWFkeSBoYWQgdGhpcyBsYWJlbCAqLworCQkJCWlmICh0aS0+bGVhZikgeworCQkJCQlmZF9sb2dfZGVidWcoIlthY2xfd2xdIFdhcm5pbmc6IGVudHJ5ICclcycgaXMgZHVwbGljYXRlZCwgbWVyZ2luZyB0aGUgZmxhZ3MuIiwgbmFtZSk7CisJCQkJCXRpLT5mbGFncyB8PSBmbGFnczsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogSnVzdCBtYXJrIHRoaXMgZW50cnkgYXMgYSB2YWxpZCBsZWFmIGFsc28gKi8KKwkJCQkJdGktPmxlYWYgPSAxOworCQkJCQl0aS0+ZmxhZ3MgPSBmbGFnczsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJfQorCQl9CisJCQorCQkvKiBDcmVhdGUgdGhlIG5ldyBlbnRyeSAqLworCQlDSEVDS19NQUxMT0MoIHRpID0gbmV3X3RpKHNuLmxhYmVsWzBdLnN0ciwgc24ubGFiZWxbMF0ubGVuLCBmbGFncywgMSkgKTsKKwl9CisJCisJLyogVGhlIG5ldyBsYWJlbCBpcyAidGkiLCBpdCBpcyBpbnNlcnRlZCBiZWZvcmUgImxpIiAqLworCWZkX2xpc3RfaW5zZXJ0X2JlZm9yZShsaSwgJnRpLT5jaGFpbik7CisJCisJLyogRG9uZSEgKi8KKwlyZXR1cm4gMDsKK30KKworLyogU2VhcmNoIGluIHRoZSB0cmVlLiBPbiByZXR1cm4sICpyZXN1bHQgPSAgLTE6IG5vdCBmb3VuZDsgPj0wOiBmb3VuZCB3aXRoIFBJX1NFQ18qIGZsYWdzICovCitpbnQgYXdfdHJlZV9sb29rdXAoY2hhciAqIG5hbWUsIGludCAqIHJlc3VsdCkKK3sKKwlzdHJ1Y3Qgc3BsaXRfbmFtZSBzbjsKKwlpbnQgbGJsLCBmb3VuZDsKKwlzdHJ1Y3QgdHJlZV9pdGVtICogdGk7CisJc3RydWN0IGZkX2xpc3QgKiBzZW50aSwgKmxpOworCQorCVRSQUNFX0VOVFJZKCIlcCAlcCIsIG5hbWUsIHJlc3VsdCk7CisJQ0hFQ0tfUEFSQU1TKG5hbWUgJiYgcmVzdWx0KTsKKwkKKwkvKiBJbml0aWFsaXplICovCisJKnJlc3VsdCA9IC0xOworCQorCS8qIFBhcnNlIHRoZSBuYW1lIGludG8gbGFiZWxzICovCisJQ0hFQ0tfRkNUX0RPKCBwYXJzZV9uYW1lKG5hbWUsICZzbiksIAorCQl7IAorCQkJVFJBQ0VfREVCVUcoSU5GTywgIlRvbyBtYW55IGxhYmVscyBpbiB0aGlzIG5hbWUsIGl0IGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgdHJlZSwgc2tpcHBpbmcuIik7IAorCQkJcmV0dXJuIDA7CisJCX0gKTsKKwkKKwlzZW50aSA9ICZ0cmVlX3Jvb3Q7CisJCisJZm9yIChsYmwgPSBzbi5sYXN0X2xibDsgbGJsID49IDA7IGxibC0tKSB7CisJCS8qIENoZWNrIGlmIHRoZSBsaXN0IGlzIGVtcHR5LCB3ZSBjYW4gZGlyZWN0bHkgcmV0dXJuICovCisJCWlmIChGRF9JU19MSVNUX0VNUFRZKHNlbnRpKSkgeworCQkJLyogVGhlIGl0ZW0gaXMgbm90IGZvdW5kICovCisJCQlyZXR1cm4gMDsKKwkJfQorCQkKKwkJLyogQ2hlY2sgaWYgd2UgaGF2ZSBhICcqJyBlbGVtZW50ICovCisJCXRpID0gKHN0cnVjdCB0cmVlX2l0ZW0gKikoc2VudGktPm5leHQpOworCQlpZiAodGktPnN0ciA9PSBOVUxMKSB7CisJCQlUUkFDRV9ERUJVRyhBTk5PWUlORywgIlthY2xfd2xdICVzIG1hdGNoZWQgYXQgbGFiZWwgJWQgd2l0aCBhIGdlbmVyaWMgZW50cnkuIiwgbmFtZSwgbGJsICsgMSk7CisJCQkqcmVzdWx0ID0gdGktPmZsYWdzOworCQkJcmV0dXJuIDA7CisJCX0KKworCQkvKiBTZWFyY2ggdGhpcyBsYWJlbCBpbiB0aGUgb3JkZXJlZCBsaXN0ICovCisJCWZvdW5kID0gMDsKKwkJZm9yIChsaSA9IHNlbnRpLT5uZXh0OyBsaSAhPSBzZW50aTsgbGk9bGktPm5leHQpIHsKKwkJCWludCBjbXAsIGxlbjsKKwkJCXRpID0gKHN0cnVjdCB0cmVlX2l0ZW0gKilsaTsKKwkJCQorCQkJY21wID0gc3RybmNhc2VjbXAodGktPnN0ciwgc24ubGFiZWxbbGJsXS5zdHIsIHNuLmxhYmVsW2xibF0ubGVuKTsKKwkJCWlmIChjbXAgPiAwKQorCQkJCXJldHVybiAwOwkvKiB0aGUgbGFiZWwgd2FzIG5vdCBmb3VuZCAqLworCQkJaWYgKGNtcCA8IDApCisJCQkJY29udGludWU7CisJCQkKKwkJCS8qIENoZWNrIHRoZSBsZW5ndGhzICovCisJCQlsZW4gPSBzdHJsZW4odGktPnN0cik7CisJCQlpZiAobGVuID4gc24ubGFiZWxbbGJsXS5sZW4pCisJCQkJcmV0dXJuIDA7CS8qIHRoZSBsYWJlbCB3YXMgbm90IGZvdW5kICovCisJCQlpZiAobGVuIDwgc24ubGFiZWxbbGJsXS5sZW4pCisJCQkJY29udGludWU7CisJCQkKKwkJCS8qIFdlIGZvdW5kIHRoZSBsYWJlbCAqLworCQkJZm91bmQgPSAxOworCQkJc2VudGkgPSAmdGktPmNoaWxkcmVuOworCQkJYnJlYWs7CisJCX0KKwkJCisJCWlmICghZm91bmQpCisJCQlyZXR1cm4gMDsgLyogbGFiZWwgbm90IGZvdW5kICovCisJCQorCQkvKiBvdGhlcndpc2UsIGNvbnRpbnVlLCBzZW50aW5lbCBoYXMgYmVlbiB1cGRhdGVkICovCisJfQorCQorCS8qIEF0IHRoZSBlbmQsIHRpIHBvaW50cyB0byB0aGUgY29ycmVjdCBsZWFmICovCisJaWYgKCF0aS0+bGVhZikKKwkJcmV0dXJuIDA7CisJCisJVFJBQ0VfREVCVUcoQU5OT1lJTkcsICJbYWNsX3dsXSAlcyBtYXRjaGVkIGV4YWN0bHkuIiwgbmFtZSk7CisJKnJlc3VsdCA9IHRpLT5mbGFnczsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvYXBwX2FjY3QvQ01ha2VMaXN0cy50eHQgYi9leHRlbnNpb25zL2FwcF9hY2N0L0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzM2NhNWQKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2FwcF9hY2N0L0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMzggQEAKKyMgVGhlIGFwcF9hY2N0IGV4dGVuc2lvbgorUFJPSkVDVCgiU2ltcGxlIEFjY291bnRpbmcgc2VydmVyIiBDKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgU2VhcmNoIGZvciBsaWJwZyAocG9zdGdyZXNxbCBwYWNrYWdlKQorRklORF9QQUNLQUdFKFBvc3RncmVTUUwgUkVRVUlSRUQpCitJTkNMVURFX0RJUkVDVE9SSUVTKCR7UE9TVEdSRVNRTF9JTkNMVURFX0RJUn0pCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBQYXJzZXIgZmlsZXMKK0JJU09OX0ZJTEUoYWNjdF9jb25mLnkpCitGTEVYX0ZJTEUoYWNjdF9jb25mLmwpCitTRVRfU09VUkNFX0ZJTEVTX1BST1BFUlRJRVMobGV4LmFjY3RfY29uZi5jIGFjY3RfY29uZi50YWIuYyBQUk9QRVJUSUVTIENPTVBJTEVfRkxBR1MgIi1JICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfSIpCisKKyMgTGlzdCBvZiBzb3VyY2UgZmlsZXMKK1NFVCggQVBQX0FDQ1RfU1JDCisJYXBwX2FjY3QuaAorCWFwcF9hY2N0LmMKKwlhY2N0X2RiLmMKKwlhY2N0X3JlY29yZHMuYworKQorU0VUKCBBUFBfQUNDVF9TUkNfR0VOCisJbGV4LmFjY3RfY29uZi5jCisJYWNjdF9jb25mLnRhYi5jCisJYWNjdF9jb25mLnRhYi5oCispCisKKyMgQ29tcGlsZSBhcyBhIG1vZHVsZQorRkRfQUREX0VYVEVOU0lPTihhcHBfYWNjdCAke0FQUF9BQ0NUX1NSQ30gJHtBUFBfQUNDVF9TUkNfR0VOfSkKK1RBUkdFVF9MSU5LX0xJQlJBUklFUyhhcHBfYWNjdCAke1BPU1RHUkVTUUxfTElCUkFSSUVTfSkKKworCisjIyMjCisjIyBJTlNUQUxMIHNlY3Rpb24gIyMKKworSU5TVEFMTChUQVJHRVRTIGFwcF9hY2N0CisJTElCUkFSWSBERVNUSU5BVElPTiAke0lOU1RBTExfRVhURU5TSU9OU19TVUZGSVh9CisJQ09NUE9ORU5UIGZyZWVEaWFtZXRlci1hY2NvdW50aW5nLXNlcnZlcikKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvYXBwX2FjY3QvYWNjdF9jb25mLmwgYi9leHRlbnNpb25zL2FwcF9hY2N0L2FjY3RfY29uZi5sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNWRlMWEKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2FwcF9hY2N0L2FjY3RfY29uZi5sCkBAIC0wLDAgKzEsMTQzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxMywgV0lERSBQcm9qZWN0IGFuZCBOSUNUCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBXSURFIFByb2plY3Qgb3IgTklDVCBub3IgdGhlIAkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFdJREUgUHJvamVjdCBhbmQgCQkJCQkJICoKKyogICBOSUNULgkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIExleCBleHRlbnNpb24ncyBjb25maWd1cmF0aW9uIHBhcnNlci4KKyAqCisgKi8KKworJXsKKyNpbmNsdWRlICJhcHBfYWNjdC5oIgorI2luY2x1ZGUgImFjY3RfY29uZi50YWIuaCIKKworLyogVXBkYXRlIHRoZSBjb2x1bW4gaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgWVlfVVNFUl9BQ1RJT04geyAJCQkJCQlcCisJeXlsbG9jLT5maXJzdF9jb2x1bW4gPSB5eWxsb2MtPmxhc3RfY29sdW1uICsgMTsgCQlcCisJeXlsbG9jLT5sYXN0X2NvbHVtbiA9IHl5bGxvYy0+Zmlyc3RfY29sdW1uICsgeXlsZW5nIC0gMTsJXAorfQorCisvKiBBdm9pZCB3YXJuaW5nIHdpdGggbmV3ZXIgZmxleCAqLworI2RlZmluZSBZWV9OT19JTlBVVAorCislfQorCislb3B0aW9uIGJpc29uLWJyaWRnZSBiaXNvbi1sb2NhdGlvbnMKKyVvcHRpb24gbm95eXdyYXAKKyVvcHRpb24gbm91bnB1dAorCisvKiBRdW90ZWQgc3RyaW5nLiBNdWx0aWxpbmVzIGRvIG5vdCBtYXRjaC4gKi8KK3FzdHJpbmcJCVwiW15cIlxuXSpcIgorCislJQorCisJLyogVXBkYXRlIHRoZSBsaW5lIGNvdW50ICovCitcbgkJCXsKKwkJCQl5eWxsb2MtPmZpcnN0X2xpbmUrKzsgCisJCQkJeXlsbG9jLT5sYXN0X2xpbmUrKzsgCisJCQkJeXlsbG9jLT5sYXN0X2NvbHVtbj0wOyAKKwkJCX0KKwkgCisJLyogRWF0IGFsbCBzcGFjZXMgYnV0IG5vdCBuZXcgbGluZXMgKi8KKyhbWzpzcGFjZTpdXXstfVtcbl0pKwk7CisJLyogRWF0IGFsbCBjb21tZW50cyAqLworIy4qJAkJCTsKKworCS8qIFJlY29nbml6ZSBhbnkgaW50ZWdlciAqLworWy1dP1tbOmRpZ2l0Ol1dKwkJeworCQkJCS8qIENvbnZlcnQgdGhpcyB0byBhbiBpbnRlZ2VyIHZhbHVlICovCisJCQkJaW50IHJldD0wOworCQkJCXJldCA9IHNzY2FuZih5eXRleHQsICIlaSIsICZ5eWx2YWwtPmludGVnZXIpOworCQkJCWlmIChyZXQgIT0gMSkgeworCQkJCQkvKiBObyBtYXRjaGluZzogYW4gZXJyb3Igb2NjdXJyZWQgKi8KKwkJCQkJZmRfbG9nX2RlYnVnKCJVbmFibGUgdG8gY29udmVydCB0aGUgdmFsdWUgJyVzJyB0byBhIHZhbGlkIG51bWJlcjogJXMiLCB5eXRleHQsIHN0cmVycm9yKGVycm5vKSk7CisJCQkJCXJldHVybiBMRVhfRVJST1I7IC8qIHRyaWcgYW4gZXJyb3IgaW4geWFjYyBwYXJzZXIgKi8KKwkJCQkJLyogTWF5YmUgd2UgY291bGQgUkVKRUNUIGluc3RlYWQgb2YgZmFpbGluZyBoZXJlPyAqLworCQkJCX0KKwkJCQlyZXR1cm4gSU5URUdFUjsKKwkJCX0KKworCS8qIFJlY29nbml6ZSBxdW90ZWQgc3RyaW5ncyAtLSB3ZSBkbyBub3Qgc3VwcG9ydCBlc2NhcGVkIFwiIGluIHRoZSBzdHJpbmcgY3VycmVudGx5LiAqLwore3FzdHJpbmd9CQl7CisJCQkJLyogTWF0Y2ggYSBxdW90ZWQgc3RyaW5nLiBMZXQncyBiZSB2ZXJ5IHBlcm1pc3NpdmUuICovCisJCQkJeXlsdmFsLT5zdHJpbmcgPSBzdHJkdXAoeXl0ZXh0KzEpOworCQkJCWlmICgheXlsdmFsLT5zdHJpbmcpIHsKKwkJCQkJZmRfbG9nX2RlYnVnKCJVbmFibGUgdG8gY29weSB0aGUgc3RyaW5nICclcyc6ICVzIiwgeXl0ZXh0LCBzdHJlcnJvcihlcnJubykpOworCQkJCQlUUkFDRV9ERUJVRyhJTkZPLCAic3RyZHVwIGZhaWxlZCIpOworCQkJCQlyZXR1cm4gTEVYX0VSUk9SOyAvKiB0cmlnIGFuIGVycm9yIGluIHlhY2MgcGFyc2VyICovCisJCQkJfQorCQkJCXl5bHZhbC0+c3RyaW5nW3N0cmxlbih5eXRleHQpIC0gMl0gPSAnXDAnOworCQkJCXJldHVybiBRU1RSSU5HOworCQkJfQorCQkJCisJLyogUmVjb2duaXplIHRoZSB0b2tlbnMgKi8JCisoP2k6IkNvbm5JbmZvIikJCXsKKwkJCQlyZXR1cm4gQ09OTklORk87CisJCQl9CisKKyg/aToiVGFibGUiKQkJeworCQkJCXJldHVybiBUQUJMRTsKKwkJCX0KKworKD9pOiJUaW1lc3RhbXBfZmllbGQiKQl7CisJCQkJcmV0dXJuIFRTRklFTEQ7CisJCQl9CisKKyg/aToiU2VydmVyX25hbWVfZmllbGQiKSB7CisJCQkJcmV0dXJuIFNSVk5GSUVMRDsKKwkJCX0KKworKD9pOiJmaWVsZCIpCQl7CisJCQkJcmV0dXJuIEZJRUxEOworCQkJfQorCisoP2k6InJlcXVpcmVkIikJCXsKKwkJCQlyZXR1cm4gUkVRVUlSRUQ7CisJCQl9CisKKyg/aToibXVsdGkiKQkJeworCQkJCXJldHVybiBNVUxUSTsKKwkJCX0KKworCisJCQkKKwkvKiBWYWxpZCBzaW5nbGUgY2hhcmFjdGVycyBmb3IgeXlwYXJzZSAqLworWz07e31dCQkJeyByZXR1cm4geXl0ZXh0WzBdOyB9CisKKwkvKiBVbnJlY29nbml6ZWQgc2VxdWVuY2UsIGlmIGl0IGRpZCBub3QgbWF0Y2ggYW55IHByZXZpb3VzIHBhdHRlcm4gKi8KK1teWzpzcGFjZTpdIio9Pjtcbl0rCXsgCisJCQkJZmRfbG9nX2RlYnVnKCJVbnJlY29nbml6ZWQgdGV4dCBvbiBsaW5lICVkIGNvbCAlZDogJyVzJy4iLCB5eWxsb2MtPmZpcnN0X2xpbmUsIHl5bGxvYy0+Zmlyc3RfY29sdW1uLCB5eXRleHQpOworCQkJIAlyZXR1cm4gTEVYX0VSUk9SOyAKKwkJCX0KKworJSUKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvYXBwX2FjY3QvYWNjdF9jb25mLnkgYi9leHRlbnNpb25zL2FwcF9hY2N0L2FjY3RfY29uZi55Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3OWYxZmEKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2FwcF9hY2N0L2FjY3RfY29uZi55CkBAIC0wLDAgKzEsMzM2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxNSwgV0lERSBQcm9qZWN0IGFuZCBOSUNUCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBXSURFIFByb2plY3Qgb3IgTklDVCBub3IgdGhlIAkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFdJREUgUHJvamVjdCBhbmQgCQkJCQkJICoKKyogICBOSUNULgkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFlhY2MgZXh0ZW5zaW9uJ3MgY29uZmlndXJhdGlvbiBwYXJzZXIuCisgKiBTZWUgZG9jL2FwcF9hY2N0LmNvbmYuc2FtcGxlIGZvciBjb25maWd1cmF0aW9uIGZpbGUgZm9ybWF0CisgKi8KKworLyogRm9yIGRldmVsb3BtZW50IG9ubHkgOiAqLworJWRlYnVnIAorJWVycm9yLXZlcmJvc2UKKworLyogVGhlIHBhcnNlciByZWNlaXZlcyB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGZpbGVuYW1lIGFzIHBhcmFtZXRlciAqLworJXBhcnNlLXBhcmFtIHtjaGFyICogY29uZmZpbGV9CisKKy8qIEtlZXAgdHJhY2sgb2YgbG9jYXRpb24gKi8KKyVsb2NhdGlvbnMgCislcHVyZS1wYXJzZXIKKworJXsKKyNpbmNsdWRlICJhcHBfYWNjdC5oIgorI2luY2x1ZGUgImFjY3RfY29uZi50YWIuaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb24gKi8KK2ludCB5eXBhcnNlKGNoYXIgKiBjb25mZmlsZSk7CisKKy8qIFRoZSBMZXggcGFyc2VyIHByb3RvdHlwZSAqLworaW50IGFjY3RfY29uZmxleChZWVNUWVBFICpsdmFscCwgWVlMVFlQRSAqbGxvY3ApOworCisvKiB0aGUgZ2xvYmFsIGNvbmZpZ3VyYXRpb24gKi8KK3N0cnVjdCBhY2N0X2NvbmYgKiBhY2N0X2NvbmZpZyA9IE5VTEw7CisKKy8qIEluaXRpYWxpemUgdGhlIGJsYW5rIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlICovCitpbnQgYWNjdF9jb25mX2luaXQodm9pZCkKK3sKKwlUUkFDRV9FTlRSWSgpOworCQorCUNIRUNLX01BTExPQyggYWNjdF9jb25maWcgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBhY2N0X2NvbmYpKSApOworCW1lbXNldChhY2N0X2NvbmZpZywgMCwgc2l6ZW9mKHN0cnVjdCBhY2N0X2NvbmYpICk7CisJZmRfbGlzdF9pbml0KCZhY2N0X2NvbmZpZy0+YXZwcywgTlVMTCk7CisJCisJcmV0dXJuIDA7Cit9CisKKy8qIFZhbGlkYXRlIGFuZCBldmVudHVhbGx5IGRpc3BsYXkgdGhlIGNvbnRlbnQgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgZGVidWcgKi8KK2ludCBhY2N0X2NvbmZfY2hlY2soY2hhciAqIGNvbmZmaWxlKQoreworCUNIRUNLX1BBUkFNUyhhY2N0X2NvbmZpZyk7CisJCisJaWYgKCAhIGFjY3RfY29uZmlnLT5jb25uaW5mbykgeworCQlmZF9sb2dfZGVidWcoIlthcHBfYWNjdF0gRVJST1I6ICdDb25uSW5mbycgaXMgbWlzc2luZyBpbiBmaWxlICclcycuIgorCQkJIiBZb3UgY2FuIHNwZWNpZnkgJ0Nvbm5JbmZvPVwiXCI7JyB0byB1c2UgZGVmYXVsdCBwYXJhbWV0ZXJzLiIsIGNvbmZmaWxlKTsKKwkJcmV0dXJuIEVJTlZBTDsKKwl9CisJaWYgKCAhIGFjY3RfY29uZmlnLT50YWJsZW5hbWUpIHsKKwkJZmRfbG9nX2RlYnVnKCJbYXBwX2FjY3RdIEVSUk9SOiAnVGFibGUnIHZhbHVlIGlzIG1pc3NpbmcgaW4gZmlsZSAnJXMnLiIsIGNvbmZmaWxlKTsKKwkJcmV0dXJuIEVJTlZBTDsKKwl9CisKKwlpZiAoIVRSQUNFX0JPT0woRlVMTCkpCisJCXJldHVybiAwOworCQorCXN0cnVjdCBmZF9saXN0ICogbGk7CisJCQorCWZkX2xvZ19kZWJ1ZygiW2FwcF9hY2N0XSBDb25maWd1cmF0aW9uIGR1bXA6Iik7CisJZmRfbG9nX2RlYnVnKCIgRGF0YWJhc2U6Iik7CisJZmRfbG9nX2RlYnVnKCIgICBDb25uSW5mbyAuLi4uLi4gOiAnJXMnIiwgYWNjdF9jb25maWctPmNvbm5pbmZvID86ICI8bnVsbD4iKTsKKwlmZF9sb2dfZGVidWcoIiAgIFRhYmxlIG5hbWUgLi4uLiA6ICclcyciLCBhY2N0X2NvbmZpZy0+dGFibGVuYW1lID86ICI8bnVsbD4iKTsKKwlmZF9sb2dfZGVidWcoIiAgIFRpbWVzdGFtcCBmaWVsZCA6ICclcyciLCBhY2N0X2NvbmZpZy0+dHNmaWVsZCA/OiAiPG51bGw+Iik7CisJZmRfbG9nX2RlYnVnKCIgICBTZXJ2ZXIgbmFtZSBmbGQgOiAnJXMnIiwgYWNjdF9jb25maWctPnNydm5maWVsZCA/OiAiPG51bGw+Iik7CisJZmRfbG9nX2RlYnVnKCIgQVZQcyB0aGF0IHdpbGwgYmUgc2F2ZWQgdG8gdGhlIGRhdGFiYXNlOiIpOworCWZvciAobGkgPSBhY2N0X2NvbmZpZy0+YXZwcy5uZXh0OyBsaSAhPSAmYWNjdF9jb25maWctPmF2cHM7IGxpID0gbGktPm5leHQpIHsKKwkJc3RydWN0IGFjY3RfY29uZl9hdnAgKiBhID0gKHN0cnVjdCBhY2N0X2NvbmZfYXZwICopbGk7CisJCWZkX2xvZ19kZWJ1ZygiICAgJS0qcyBBVlAlcyBzYXZlZCBpbiAiLCAzMCwgYS0+YXZwbmFtZSwgYS0+cmVxdWlyZWQgPyAiIFtyZXF1aXJlZF0iOiIiICk7CisJCWlmIChhLT5tdWx0aSkgeworCQkJZmRfbG9nX2RlYnVnKCJmaWVsZHMgJyVzWzEuLiVkXScgIiwgYS0+ZmllbGQ/OmEtPmF2cG5hbWUsIGEtPm11bHRpKTsKKwkJfSBlbHNlIHsKKwkJCWZkX2xvZ19kZWJ1ZygiZmllbGQgJyVzJyAiLCBhLT5maWVsZD86YS0+YXZwbmFtZSk7CisJCX0KKwkJZmRfbG9nX2RlYnVnKCJhcyA6OiVzIiwgZGlhbTJkYl90eXBlc19tYXBwaW5nW2EtPmF2cHR5cGVdKTsKKwl9CisJZmRfbG9nX2RlYnVnKCJbYXBwX2FjY3RdIENvbXBsZXRlLiIpOworCXJldHVybiAwOworfQorCit2b2lkIGFjY3RfY29uZl9mcmVlKHZvaWQpCit7CisJVFJBQ0VfRU5UUlkoKTsKKwkKKwlpZiAoIWFjY3RfY29uZmlnKQorCQlyZXR1cm47CisJCQorCS8qIERlc3Ryb3kgdGhlIGxpc3QgKi8KKwl3aGlsZSAoIUZEX0lTX0xJU1RfRU1QVFkoJmFjY3RfY29uZmlnLT5hdnBzKSkgeworCQlzdHJ1Y3QgYWNjdF9jb25mX2F2cCAqIGEgPSAoc3RydWN0IGFjY3RfY29uZl9hdnAgKikoYWNjdF9jb25maWctPmF2cHMubmV4dCk7CisJCWZkX2xpc3RfdW5saW5rKCZhLT5jaGFpbik7CisJCWZyZWUoYS0+YXZwbmFtZSk7CisJCWZyZWUoYS0+ZmllbGQpOworCQlmcmVlKGEpOworCX0KKwkKKwkvKiBkZXN0cm95IG90aGVyIGRhdGEgKi8KKwlmcmVlKGFjY3RfY29uZmlnLT5jb25uaW5mbyk7CisJZnJlZShhY2N0X2NvbmZpZy0+dGFibGVuYW1lKTsKKwlmcmVlKGFjY3RfY29uZmlnLT50c2ZpZWxkKTsKKwlmcmVlKGFjY3RfY29uZmlnLT5zcnZuZmllbGQpOworCQorCS8qIERvbmUgKi8KKwlmcmVlKGFjY3RfY29uZmlnKTsKKwlhY2N0X2NvbmZpZyA9IE5VTEw7Cit9CisKKy8qIFBhcnNlIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgKi8KK2ludCBhY2N0X2NvbmZfcGFyc2UoY2hhciAqIGNvbmZmaWxlKQoreworCWV4dGVybiBGSUxFICogYWNjdF9jb25maW47CisJaW50IHJldDsKKwkKKwlUUkFDRV9FTlRSWSgiJXAiLCBjb25mZmlsZSk7CisJCisJVFJBQ0VfREVCVUcgKEZVTEwsICJQYXJzaW5nIGNvbmZpZ3VyYXRpb24gZmlsZTogJXMuLi4iLCBjb25mZmlsZSk7CisJCisJYWNjdF9jb25maW4gPSBmb3Blbihjb25mZmlsZSwgInIiKTsKKwlpZiAoYWNjdF9jb25maW4gPT0gTlVMTCkgeworCQlyZXQgPSBlcnJubzsKKwkJZmRfbG9nX2RlYnVnKCJVbmFibGUgdG8gb3BlbiBleHRlbnNpb24gY29uZmlndXJhdGlvbiBmaWxlICVzIGZvciByZWFkaW5nOiAlcyIsIGNvbmZmaWxlLCBzdHJlcnJvcihyZXQpKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSB5eXBhcnNlKGNvbmZmaWxlKTsKKworCWZjbG9zZShhY2N0X2NvbmZpbik7CisKKwlpZiAocmV0ICE9IDApIHsKKwkJVFJBQ0VfREVCVUcgKElORk8sICJVbmFibGUgdG8gcGFyc2UgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4iKTsKKwkJcmV0dXJuIEVJTlZBTDsKKwl9CisJCisJcmV0dXJuIDA7Cit9CisKKy8qIEZ1bmN0aW9uIHRvIHJlcG9ydCB0aGUgZXJyb3JzICovCit2b2lkIHl5ZXJyb3IgKFlZTFRZUEUgKnBsb2MsIGNoYXIgKiBjb25mZmlsZSwgY2hhciBjb25zdCAqcykKK3sKKwlMT0dfRSggIkVycm9yIGluIGNvbmZpZ3VyYXRpb24gcGFyc2luZyIpOworCQorCWlmIChwbG9jLT5maXJzdF9saW5lICE9IHBsb2MtPmxhc3RfbGluZSkKKwkJTE9HX0UoIiVzOiVkLiVkLSVkLiVkIDogJXMiLCBjb25mZmlsZSwgcGxvYy0+Zmlyc3RfbGluZSwgcGxvYy0+Zmlyc3RfY29sdW1uLCBwbG9jLT5sYXN0X2xpbmUsIHBsb2MtPmxhc3RfY29sdW1uLCBzKTsKKwllbHNlIGlmIChwbG9jLT5maXJzdF9jb2x1bW4gIT0gcGxvYy0+bGFzdF9jb2x1bW4pCisJCUxPR19FKCIlczolZC4lZC0lZCA6ICVzIiwgY29uZmZpbGUsIHBsb2MtPmZpcnN0X2xpbmUsIHBsb2MtPmZpcnN0X2NvbHVtbiwgcGxvYy0+bGFzdF9jb2x1bW4sIHMpOworCWVsc2UKKwkJTE9HX0UoIiVzOiVkLiVkIDogJXMiLCBjb25mZmlsZSwgcGxvYy0+Zmlyc3RfbGluZSwgcGxvYy0+Zmlyc3RfY29sdW1uLCBzKTsKK30KKworc3RhdGljIHN0cnVjdCBhY2N0X2NvbmZfYXZwIGF2cGRhdGE7CisKKyV9CisKKy8qIFZhbHVlcyByZXR1cm5lZCBieSBsZXggZm9yIHRva2VuICovCisldW5pb24geworCWNoYXIgCQkqc3RyaW5nOwkvKiBUaGUgc3RyaW5nIGlzIGFsbG9jYXRlZCBieSBzdHJkdXAgaW4gbGV4LiovCisJaW50CQkgaW50ZWdlcjsJLyogU3RvcmUgaW50ZWdlciB2YWx1ZXMgKi8KK30KKworLyogSW4gY2FzZSBvZiBlcnJvciBpbiB0aGUgbGV4aWNhbCBhbmFseXNpcyAqLworJXRva2VuIAkJTEVYX0VSUk9SCisKKy8qIEtleXdvcmRzICovCisldG9rZW4gCQlGSUVMRAorJXRva2VuIAkJUkVRVUlSRUQKKyV0b2tlbiAJCU1VTFRJCisldG9rZW4gCQlDT05OSU5GTworJXRva2VuIAkJVEFCTEUKKyV0b2tlbiAJCVRTRklFTEQKKyV0b2tlbiAJCVNSVk5GSUVMRAorCisvKiBUb2tlbnMgYW5kIHR5cGVzICovCisvKiBBIChkZSlxdW90ZWQgc3RyaW5nIChtYWxsb2MnZCBpbiBsZXggcGFyc2VyOyBpdCBtdXN0IGJlIGZyZWVkIGFmdGVyIHVzZSkgKi8KKyV0b2tlbiA8c3RyaW5nPglRU1RSSU5HCisKKy8qIEFuIGludGVnZXIgdmFsdWUgKi8KKyV0b2tlbiA8aW50ZWdlcj4gSU5URUdFUgorCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyUlCisKKwkvKiBUaGUgZ3JhbW1hciBkZWZpbml0aW9uICovCitjb25mZmlsZToJCS8qIGVtcHR5IGdyYW1tYXIgaXMgT0sgZm9yIHRoZSBwYXJzZXIgKHdpbGwgYmUgdmFsaWRhdGVkIGFmdGVyd2FyZHMpICovCisJCQl8IGNvbmZmaWxlIGF2cGxpbmUKKwkJCXwgY29uZmZpbGUgY29ubmluZm9saW5lCisJCQl8IGNvbmZmaWxlIHRhYmxlbGluZQorCQkJfCBjb25mZmlsZSB0c2ZpZWxkbGluZQorCQkJfCBjb25mZmlsZSBzcnZuZmllbGRsaW5lCisJCQl8IGNvbmZmaWxlIGVycm9ycworCQkJeworCQkJCXl5ZXJyb3IoJnl5bGxvYywgY29uZmZpbGUsICJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBwYXJzaW5nIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuIik7CisJCQkJcmV0dXJuIEVJTlZBTDsKKwkJCX0KKwkJCTsKKworCQkJLyogQ2F0Y2ggbGV4aWNhbCBhbmQgc3ludGF4IGVycm9ycyAqLworZXJyb3JzOgkJCUxFWF9FUlJPUgorCQkJfCBlcnJvcgorCQkJOworCisJLyogVGhlIHRva2VucyAqLworYXZwbGluZToJCXsKKwkJCQltZW1zZXQoJmF2cGRhdGEsIDAsIHNpemVvZihzdHJ1Y3QgYWNjdF9jb25mX2F2cCkpOworCQkJfQorCQkJUVNUUklORyBhdnBjb250ZW50cyAnOycKKwkJCXsKKwkJCQlzdHJ1Y3QgYWNjdF9jb25mX2F2cCAqbmV3OworCQkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGRpY3Q7CisJCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGljdGRhdGE7CisJCQkJCisJCQkJLyogVmFsaWRhdGUgdGhlIGF2cCBuYW1lIGZpcnN0ICovCisJCQkJQ0hFQ0tfRkNUX0RPKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUVfQUxMX1ZFTkRPUlMsICQyLCAmZGljdCwgRU5PRU5UKSwKKwkJCQkJeyB5eWVycm9yICgmeXlsbG9jLCBjb25mZmlsZSwgIkFWUCBkZWZpbml0aW9uIG5vdCBmb3VuZCBpbiB0aGUgZGljdGlvbmFyeS4gV2FzIHRoZSBhcHByb3ByaWF0ZSBkaWN0XyouZmR4IGV4dGVuc2lvbiBsb2FkZWQ/Iik7IFlZRVJST1I7IH0gKTsKKwkJCQlDSEVDS19GQ1QoIGZkX2RpY3RfZ2V0dmFsKCBkaWN0LCAmZGljdGRhdGEgKSk7CisJCQkJCisJCQkJLyogQ3JlYXRlIGEgbmV3IGVudHJ5ICovCisJCQkJQ0hFQ0tfTUFMTE9DX0RPKCBuZXcgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBhY2N0X2NvbmZfYXZwKSksCisJCQkJCXsgeXllcnJvciAoJnl5bGxvYywgY29uZmZpbGUsICJPdXQgb2YgbWVtb3J5Iik7IFlZRVJST1I7IH0gKTsKKwkJCQkKKwkJCQkvKiBSZXRyaWV2ZSBhbGwgdGhlIGRhdGEgZnJvbSBhdnBjb250ZW50cyBwYXJzaW5nIChmaWVsZCwgcmVxdWlyZWQsIG11bHRpKSAqLwkKKwkJCQltZW1jcHkobmV3LCAmYXZwZGF0YSwgc2l6ZW9mKHN0cnVjdCBhY2N0X2NvbmZfYXZwKSk7CisJCQkJCisJCQkJLyogSW5pdGlhbGl6ZSB0aGUgb3RoZXIgZGF0YSAqLworCQkJCWZkX2xpc3RfaW5pdCgmbmV3LT5jaGFpbiwgTlVMTCk7CisJCQkJbmV3LT5hdnBuYW1lID0gJDI7CisJCQkJbmV3LT5hdnBvYmogPSBkaWN0OworCQkJCW5ldy0+YXZwdHlwZSA9IGRpY3RkYXRhLmF2cF9iYXNldHlwZTsKKwkJCQorCQkJCS8qIEFkZCB0aGlzIG5ldyBlbnRyeSBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0ICovCisJCQkJZmRfbGlzdF9pbnNlcnRfYmVmb3JlKCAmYWNjdF9jb25maWctPmF2cHMsICZuZXctPmNoYWluICk7CisJCQl9CisJCQk7CisJCQkKK2F2cGNvbnRlbnRzOgkJLyogRW1wdHkgY29udGVudCBpcyBmaW5lICovCisJCQl8ICc9JyAneycgYXZwZmxhZ2xpbmUgJ30nCisJCQk7CisJCQkKK2F2cGZsYWdsaW5lOgkJLyogRW1wdHkgZmxhZ3MgaXMgYWxzbyBmaW5lICovCisJCQl8IGF2cGZsYWdsaW5lIEZJRUxEICc9JyBRU1RSSU5HICc7JworCQkJeworCQkJCWlmIChhdnBkYXRhLmZpZWxkKSB7CisJCQkJCXl5ZXJyb3IgKCZ5eWxsb2MsIGNvbmZmaWxlLCAiRHVwbGljYXRlIGVudHJ5Iik7CisJCQkJCVlZRVJST1I7CisJCQkJfQorCQkJCWF2cGRhdGEuZmllbGQgPSAkNDsKKwkJCX0KKwkJCXwgYXZwZmxhZ2xpbmUgUkVRVUlSRUQgJzsnCisJCQl7CisJCQkJYXZwZGF0YS5yZXF1aXJlZCA9IDE7CisJCQl9CisJCQl8IGF2cGZsYWdsaW5lIE1VTFRJICc9JyBJTlRFR0VSICc7JworCQkJeworCQkJCWF2cGRhdGEubXVsdGkgPSAodW5zaWduZWQpICQ0OworCQkJfQorCQkJOworCQorY29ubmluZm9saW5lOgkJQ09OTklORk8gJz0nIFFTVFJJTkcgJzsnCisJCQl7CisJCQkJaWYgKGFjY3RfY29uZmlnLT5jb25uaW5mbykgeworCQkJCQl5eWVycm9yICgmeXlsbG9jLCBjb25mZmlsZSwgIkR1cGxpY2F0ZSBlbnRyeSIpOworCQkJCQlZWUVSUk9SOworCQkJCX0KKwkJCQlhY2N0X2NvbmZpZy0+Y29ubmluZm8gPSAkMzsKKwkJCX0KKwkJCTsKKwordGFibGVsaW5lOgkJVEFCTEUgJz0nIFFTVFJJTkcgJzsnCisJCQl7CisJCQkJaWYgKGFjY3RfY29uZmlnLT50YWJsZW5hbWUpIHsKKwkJCQkJeXllcnJvciAoJnl5bGxvYywgY29uZmZpbGUsICJEdXBsaWNhdGUgZW50cnkiKTsKKwkJCQkJWVlFUlJPUjsKKwkJCQl9CisJCQkJYWNjdF9jb25maWctPnRhYmxlbmFtZSA9ICQzOworCQkJfQorCQkJOworCit0c2ZpZWxkbGluZToJCVRTRklFTEQgJz0nIFFTVFJJTkcgJzsnCisJCQl7CisJCQkJaWYgKGFjY3RfY29uZmlnLT50c2ZpZWxkKSB7CisJCQkJCXl5ZXJyb3IgKCZ5eWxsb2MsIGNvbmZmaWxlLCAiRHVwbGljYXRlIGVudHJ5Iik7CisJCQkJCVlZRVJST1I7CisJCQkJfQorCQkJCWFjY3RfY29uZmlnLT50c2ZpZWxkID0gJDM7CisJCQl9CisJCQk7CisKK3Nydm5maWVsZGxpbmU6CQlTUlZORklFTEQgJz0nIFFTVFJJTkcgJzsnCisJCQl7CisJCQkJaWYgKGFjY3RfY29uZmlnLT5zcnZuZmllbGQpIHsKKwkJCQkJeXllcnJvciAoJnl5bGxvYywgY29uZmZpbGUsICJEdXBsaWNhdGUgZW50cnkiKTsKKwkJCQkJWVlFUlJPUjsKKwkJCQl9CisJCQkJYWNjdF9jb25maWctPnNydm5maWVsZCA9ICQzOworCQkJfQorCQkJOwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9hcHBfYWNjdC9hY2N0X2RiLmMgYi9leHRlbnNpb25zL2FwcF9hY2N0L2FjY3RfZGIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDQ0Yzk0Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9hcHBfYWNjdC9hY2N0X2RiLmMKQEAgLTAsMCArMSwzNDEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDEzLCBXSURFIFByb2plY3QgYW5kIE5JQ1QJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFdJREUgUHJvamVjdCBvciBOSUNUIG5vciB0aGUgCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgV0lERSBQcm9qZWN0IGFuZCAJCQkJCQkgKgorKiAgIE5JQ1QuCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRGF0YWJhc2UgaW50ZXJmYWNlIG1vZHVsZSAqLworCisvKiBUaGVyZSBpcyBvbmUgY29ubmVjdGlvbiB0byB0aGUgZGIgcGVyIHRocmVhZC4gCitUaGUgY29ubmVjdGlvbiBpcyBzdG9yZWQgaW4gdGhlIHB0aHJlYWRfa2V5X3QgdmFyaWFibGUgKi8KKworCisjaW5jbHVkZSAiYXBwX2FjY3QuaCIKKyNpbmNsdWRlIDxsaWJwcS1mZS5oPgorCitjb25zdCBjaGFyICogZGlhbTJkYl90eXBlc19tYXBwaW5nW0FWUF9UWVBFX01BWCArIDFdID0geworCSIiIAkJLyogQVZQX1RZUEVfR1JPVVBFRCAqLywKKwkiYnl0ZWEiIAkvKiBBVlBfVFlQRV9PQ1RFVFNUUklORyAqLywKKwkiaW50ZWdlciIgCS8qIEFWUF9UWVBFX0lOVEVHRVIzMiAqLywKKwkiYmlnaW50IiAJLyogQVZQX1RZUEVfSU5URUdFUjY0ICovLAorCSJpbnRlZ2VyIiAJLyogQVZQX1RZUEVfVU5TSUdORUQzMiArIGNhc3QgKi8sCisJImJpZ2ludCIgCS8qIEFWUF9UWVBFX1VOU0lHTkVENjQgKyBjYXN0ICovLAorCSJyZWFsIiAJCS8qIEFWUF9UWVBFX0ZMT0FUMzIgKi8sCisJImRvdWJsZSBwcmVjaXNpb24iIC8qIEFWUF9UWVBFX0ZMT0FUNjQgKi8KK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogc3RtdCA9ICJhY2N0X2RiX3N0bXQiOworI2lmbmRlZiBURVNUX0RFQlVHCitzdGF0aWMgCisjZW5kaWYgLyogVEVTVF9ERUJVRyAqLworcHRocmVhZF9rZXlfdCBjb25uazsKK3N0YXRpYyBjaGFyICogc3FsID0gTlVMTDsgICAvKiBUaGUgYnVmZmVyIHRoYXQgd2lsbCBjb250YWluIHRoZSBTUUwgcXVlcnkgKi8KK3N0YXRpYyBpbnQgbmJyZWNvcmRzID0gMDsKKworCisvKiBJbml0aWFsaXplIHRoZSBkYXRhYmFzZSBjb250ZXh0OiBjb25uZWN0aW9uIHRvIHRoZSBEQiwgcHJlcGFyZWQgc3RhdGVtZW50IHRvIGluc2VydCBuZXcgcmVjb3JkcyAqLworaW50IGFjY3RfZGJfaW5pdCh2b2lkKQoreworCXN0cnVjdCBhY2N0X3JlY29yZF9saXN0IGVtcHR5cmVjb3JkczsKKwlzdHJ1Y3QgZmRfbGlzdCAqIGxpOworCXNpemVfdCBzcWxfYWxsb2NkID0gMDsgLyogVGhlIG1hbGxvYydkIHNpemUgb2YgdGhlIGJ1ZmZlciAqLworCXNpemVfdCBzcWxfb2Zmc2V0ID0gMDsgLyogVGhlIGFjdHVhbCBkYXRhIGFscmVhZHkgd3JpdHRlbiBpbiB0aGlzIGJ1ZmZlciAqLworCWludCBpZHggPSAwOworCVBHcmVzdWx0ICogcmVzOworCVBHY29ubiAqY29ubjsKKwkjZGVmaW5lIFJFQUxMT0NfU0laRQkxMDI0CS8qIFdlIGV4dGVuZCB0aGUgYnVmZmVyIGJ5IHRoaXMgYW1vdW50ICovCisJCisJVFJBQ0VfRU5UUlkoKTsKKwlDSEVDS19QQVJBTVMoIGFjY3RfY29uZmlnICYmIGFjY3RfY29uZmlnLT5jb25uaW5mbyAmJiBhY2N0X2NvbmZpZy0+dGFibGVuYW1lICk7IAorCQorCUNIRUNLX1BBUkFNU19ETyggUFFpc3RocmVhZHNhZmUoKSA9PSAxLCB7CisJCWZkX2xvZ19kZWJ1ZygiWW91IFBvc3RHcmVTUUwgaW5zdGFsbGF0aW9uIGlzIG5vdCB0aHJlYWQtc2FmZSEiKTsKKwkJcmV0dXJuIEVJTlZBTDsKKwl9ICk7CQkJCisJCisJLyogVXNlIHRoZSBpbmZvcm1hdGlvbiBmcm9tIGFjY3RfY29uZmlnIHRvIGNyZWF0ZSB0aGUgY29ubmVjdGlvbiBhbmQgcHJlcGFyZSB0aGUgcXVlcnkgKi8KKwljb25uID0gUFFjb25uZWN0ZGIoYWNjdF9jb25maWctPmNvbm5pbmZvKTsKKwkKKwkvKiBDaGVjayB0byBzZWUgdGhhdCB0aGUgYmFja2VuZCBjb25uZWN0aW9uIHdhcyBzdWNjZXNzZnVsbHkgbWFkZSAqLworCWlmIChQUXN0YXR1cyhjb25uKSAhPSBDT05ORUNUSU9OX09LKSB7CisJCWZkX2xvZ19kZWJ1ZygiQ29ubmVjdGlvbiB0byBkYXRhYmFzZSBmYWlsZWQ6ICVzIiwgUFFlcnJvck1lc3NhZ2UoY29ubikpOworCQlhY2N0X2RiX2ZyZWUoKTsKKwkJcmV0dXJuIEVJTlZBTDsKKwl9CisJaWYgKFBRcHJvdG9jb2xWZXJzaW9uKGNvbm4pIDwgMykgeworCQlmZF9sb2dfZGVidWcoIkRhdGFiYXNlIHByb3RvY29sIHZlcnNpb24gaXMgdG9vIG9sZCwgdmVyc2lvbiAzIGlzIHJlcXVpcmVkIGZvciBwcmVwYXJlZCBzdGF0ZW1lbnRzLiIpOworCQlhY2N0X2RiX2ZyZWUoKTsKKwkJcmV0dXJuIEVJTlZBTDsKKwl9CisJCisJVFJBQ0VfREVCVUcoRlVMTCwgIkNvbm5lY3Rpb24gdG8gZGF0YWJhc2Ugc3VjY2Vzc2Z1bCwgc2VydmVyIHZlcnNpb24gJWQuIiwgUFFzZXJ2ZXJWZXJzaW9uKGNvbm4pKTsKKwkKKwkvKiBOb3csIHByZXBhcmUgdGhlIHJlcXVlc3Qgb2JqZWN0ICovCisJCisJLyogRmlyc3QsIHdlIGJ1aWxkIHRoZSBsaXN0IG9mIEFWUCB3ZSB3aWxsIGluc2VydCBpbiB0aGUgZGF0YWJhc2UgKi8KKwlDSEVDS19GQ1QoIGFjY3RfcmVjX3ByZXBhcmUoJmVtcHR5cmVjb3JkcykgKTsKKwkKKwkvKiBOb3csIHByZXBhcmUgdGhlIHRleHQgb2YgdGhlIHJlcXVlc3QgKi8KKwlDSEVDS19NQUxMT0Moc3FsID0gbWFsbG9jKFJFQUxMT0NfU0laRSkpOworCXNxbF9hbGxvY2QgPSBSRUFMTE9DX1NJWkU7CisJCisJLyogVGhpcyBtYWNybyBoaWRlcyB0aGUgZGV0YWlscyBvZiBleHRlbmRpbmcgdGhlIGJ1ZmZlciBvbiBlYWNoIHNwcmludGYuLi4gKi8KKwkjZGVmaW5lIEFERF9FWFRFTkQoYXJncy4uLikgewkJCQkJCQkJCVwKKwkJc2l6ZV90IHA7CQkJCQkJCQkJCVwKKwkJaW50IGxvb3AgPSAwOwkJCQkJCQkJCQlcCisJCWRvIHsJCQkJCQkJCQkJCVwKKwkJCXAgPSBzbnByaW50ZihzcWwgKyBzcWxfb2Zmc2V0LCBzcWxfYWxsb2NkIC0gc3FsX29mZnNldCwgIyNhcmdzKTsJCVwKKwkJCWlmIChwID49IHNxbF9hbGxvY2QgLSBzcWxfb2Zmc2V0KSB7CQkJCQkJXAorCQkJCS8qIFRvbyBzaG9ydCwgZXh0ZW5kIHRoZSBidWZmZXIgYW5kIHN0YXJ0IGFnYWluICovCQkJXAorCQkJCUNIRUNLX01BTExPQyggc3FsID0gcmVhbGxvYyhzcWwsIHNxbF9hbGxvY2QgKyBSRUFMTE9DX1NJWkUpICk7CQlcCisJCQkJc3FsX2FsbG9jZCArPSBSRUFMTE9DX1NJWkU7CQkJCQkJXAorCQkJCWxvb3ArKzsJCQkJCQkJCQlcCisJCQkJQVNTRVJUKGxvb3AgPCAxMDApOyAvKiBkZXRlY3QgaW5maW5pdGUgbG9vcHMgKi8JCQkJXAorCQkJCWNvbnRpbnVlOwkJCQkJCQkJXAorCQkJfQkJCQkJCQkJCQlcCisJCQlzcWxfb2Zmc2V0ICs9IHA7CQkJCQkJCQlcCisJCQlicmVhazsJCQkJCQkJCQkJXAorCQl9IHdoaWxlICgxKTsJCQkJCQkJCQkJXAorCX0KKwkKKwkvKiBUaGlzIG1hY3JvIGFsbG93cyB0byBhZGQgYSB2YWx1ZSBpbiB0aGUgU1FMIGJ1ZmZlciB3aGlsZSBlc2NhcGluZyBpbiBwcm9wZXJseSAqLworCSNkZWZpbmUgQUREX0VTQ0FQRShzdHIpIHsJCQkJCQkJCQlcCisJCWNoYXIgKiBfX3MgPSAoY2hhciAqKXN0cjsJCQkJCQkJCVwKKwkJLyogQ2hlY2sgd2UgaGF2ZSBhdCBsZWFzdCB0d2ljZSB0aGUgc2l6ZSBhdmFpbGFibGUgKzEgKi8JCQkJXAorCQlzaXplX3QgcCA9IHN0cmxlbihfX3MpOwkJCQkJCQkJCVwKKwkJCQkJCQkJCQkJCQlcCisJCXdoaWxlIChzcWxfYWxsb2NkIC0gc3FsX29mZnNldCA8IDIgKiBwICsgMSkgewkJCQkJCVwKKwkJCS8qIFRvbyBzaG9ydCwgZXh0ZW5kIHRoZSBidWZmZXIgKi8JCQkJCQlcCisJCQlDSEVDS19NQUxMT0MoIHNxbCA9IHJlYWxsb2Moc3FsLCBzcWxfYWxsb2NkICsgUkVBTExPQ19TSVpFKSApOwkJCVwKKwkJCXNxbF9hbGxvY2QgKz0gUkVBTExPQ19TSVpFOwkJCQkJCQlcCisJCX0JCQkJCQkJCQkJCVwKKwkJCQkJCQkJCQkJCQlcCisJCS8qIE5vdyBhZGQgdGhlIGVzY2FwZWQgc3RyaW5nICovCQkJCQkJCVwKKwkJcCA9IFBRZXNjYXBlU3RyaW5nQ29ubihjb25uLCBzcWwrc3FsX29mZnNldCwgX19zLCBwLCBOVUxMKTsJCQkJXAorCQlzcWxfb2Zmc2V0ICs9IHA7CQkJCQkJCQkJXAorCX0KKwkKKwkvKiBJTlNFUlQgSU5UTyB0YWJsZSAodHNmaWVsZCwgZmllbGQxLCBmaWVsZDIsIC4uLikgVkFMVUVTIChub3csICQxOjpieXRlYSwgJDI6OmludGVnZXIsIC4uLikgKi8KKwlBRERfRVhURU5EKCJJTlNFUlQgSU5UTyAlcyAoIiwgYWNjdF9jb25maWctPnRhYmxlbmFtZSk7CisJCisJaWYgKGFjY3RfY29uZmlnLT50c2ZpZWxkKSB7CisJCUFERF9FWFRFTkQoIlwiIik7CisJCUFERF9FU0NBUEUoYWNjdF9jb25maWctPnRzZmllbGQpOworCQlBRERfRVhURU5EKCJcIiwgIik7CisJfQorCQorCWlmIChhY2N0X2NvbmZpZy0+c3J2bmZpZWxkKSB7CisJCUFERF9FWFRFTkQoIlwiIik7CisJCUFERF9FU0NBUEUoYWNjdF9jb25maWctPnNydm5maWVsZCk7CisJCUFERF9FWFRFTkQoIlwiLCAiKTsKKwl9CisJCisJZm9yIChsaSA9IGVtcHR5cmVjb3Jkcy5hbGwubmV4dDsgbGkgIT0gJmVtcHR5cmVjb3Jkcy5hbGw7IGxpID0gbGktPm5leHQpIHsKKwkJc3RydWN0IGFjY3RfcmVjb3JkX2l0ZW0gKiBpID0gKHN0cnVjdCBhY2N0X3JlY29yZF9pdGVtICopKGxpLT5vKTsKKwkJQUREX0VYVEVORCgiXCIiKTsKKwkJQUREX0VTQ0FQRShpLT5wYXJhbS0+ZmllbGQ/OmktPnBhcmFtLT5hdnBuYW1lKTsKKwkJaWYgKGktPmluZGV4KSB7CisJCQlBRERfRVhURU5EKCIlZCIsIGktPmluZGV4KTsKKwkJfQorCQlpZiAobGktPm5leHQgIT0gJmVtcHR5cmVjb3Jkcy5hbGwpIHsKKwkJCUFERF9FWFRFTkQoIlwiLCAiKTsKKwkJfQorCX0KKwkKKwlBRERfRVhURU5EKCJcIikgVkFMVUVTICgiKTsKKwkKKwlpZiAoYWNjdF9jb25maWctPnRzZmllbGQpIHsKKwkJKytpZHg7CisJCUFERF9FWFRFTkQoIiQlZCwgIiwgaWR4KTsKKwl9CisJaWYgKGFjY3RfY29uZmlnLT5zcnZuZmllbGQpIHsKKwkJQUREX0VYVEVORCgiJyIpOworCQlBRERfRVNDQVBFKGZkX2dfY29uZmlnLT5jbmZfZGlhbWlkKTsKKwkJQUREX0VYVEVORCgiJywgIik7CisJfQorCQorCWZvciAobGkgPSBlbXB0eXJlY29yZHMuYWxsLm5leHQ7IGxpICE9ICZlbXB0eXJlY29yZHMuYWxsOyBsaSA9IGxpLT5uZXh0KSB7CisJCXN0cnVjdCBhY2N0X3JlY29yZF9pdGVtICogaSA9IChzdHJ1Y3QgYWNjdF9yZWNvcmRfaXRlbSAqKShsaS0+byk7CisJCSsraWR4OworCQlBRERfRVhURU5EKCIkJWQ6OiVzIiwgaWR4LCBkaWFtMmRiX3R5cGVzX21hcHBpbmdbaS0+cGFyYW0tPmF2cHR5cGVdKTsKKwkJCisJCWlmIChsaS0+bmV4dCAhPSAmZW1wdHlyZWNvcmRzLmFsbCkgeworCQkJQUREX0VYVEVORCgiLCAiKTsKKwkJfQorCX0KKwkKKwlBRERfRVhURU5EKCIpOyIpOworCQorCVRSQUNFX0RFQlVHKEZVTEwsICJQcmVwYXJpbmcgdGhlIGZvbGxvd2luZyBTUUwgc3RhdGVtZW50OiAnJXMnIiwgc3FsKTsKKwlyZXMgPSBQUXByZXBhcmUoY29ubiwgc3RtdCwgc3FsLCBlbXB0eXJlY29yZHMubmJhbGwsIE5VTEwpOworCWlmIChQUXJlc3VsdFN0YXR1cyhyZXMpICE9IFBHUkVTX0NPTU1BTkRfT0spIHsKKwkJVFJBQ0VfREVCVUcoSU5GTywgIlByZXBhcmluZyBzdGF0ZW1lbnQgJyVzJyBmYWlsZWQ6ICVzIiwKKwkJCXNxbCwgUFFlcnJvck1lc3NhZ2UoY29ubikpOworCQlQUWNsZWFyKHJlcyk7CisJCXJldHVybiBFSU5WQUw7CisgICAgICAgIH0KKwlQUWNsZWFyKHJlcyk7CisJbmJyZWNvcmRzID0gZW1wdHlyZWNvcmRzLm5iYWxsOworCQorCWFjY3RfcmVjX2VtcHR5KCZlbXB0eXJlY29yZHMpOworCQorCUNIRUNLX1BPU0lYKCBwdGhyZWFkX2tleV9jcmVhdGUoJmNvbm5rLCAodm9pZCAoKikodm9pZCopKVBRZmluaXNoKSApOworCUNIRUNLX1BPU0lYKCBwdGhyZWFkX3NldHNwZWNpZmljKGNvbm5rLCBjb25uKSApOworCQorCS8qIE9rLCByZWFkeSAqLworCXJldHVybiAwOworfQorCisvKiBUZXJtaW5hdGUgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIERCICovCit2b2lkIGFjY3RfZGJfZnJlZSh2b2lkKQorewkKKwlDSEVDS19QT1NJWF9ETyhwdGhyZWFkX2tleV9kZWxldGUoY29ubmspICwgKTsKKwlmcmVlKHNxbCk7Cit9CisKKy8qIFdoZW4gYSBuZXcgbWVzc2FnZSBoYXMgYmVlbiByZWNlaXZlZCwgaW5zZXJ0IHRoZSBjb250ZW50IG9mIHRoZSBwYXJzZWQgbWFwcGluZyBpbnRvIHRoZSBEQiAodXNpbmcgcHJlcGFyZWQgc3RhdGVtZW50KSAqLworaW50IGFjY3RfZGJfaW5zZXJ0KHN0cnVjdCBhY2N0X3JlY29yZF9saXN0ICogcmVjb3JkcykKK3sKKwljaGFyIAkqKnZhbDsKKwlpbnQJICp2YWxfbGVuOworCWludCAJICp2YWxfaXNiaW47CisJaW50CSAgaWR4ID0gMDsKKwlpbnQJICBzaXplID0gMDsKKwlQR3Jlc3VsdCAqcmVzOworCXN0cnVjdCBmZF9saXN0ICpsaTsKKwlQR2Nvbm4gKmNvbm47CisJaW50IG5ldyA9IDA7CisJCisJVFJBQ0VfRU5UUlkoIiVwIiwgcmVjb3Jkcyk7CisJQ0hFQ0tfUEFSQU1TKCByZWNvcmRzICk7CisJCisJY29ubiA9IHB0aHJlYWRfZ2V0c3BlY2lmaWMoY29ubmspOworCWlmICghY29ubikgeworCQljb25uID0gUFFjb25uZWN0ZGIoYWNjdF9jb25maWctPmNvbm5pbmZvKTsKKwkJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfc2V0c3BlY2lmaWMoY29ubmssIGNvbm4pICk7CisJCQorCQluZXcgPSAxOworCX0KKwkKKwkvKiBGaXJzdCwgY2hlY2sgaWYgdGhlIGNvbm5lY3Rpb24gd2l0aCB0aGUgREIgaGFzIG5vdCBzdGFsZWQsIGFuZCBldmVudHVhbGx5IHRyeSB0byBmaXggaXQgKi8KKwlpZiAoUFFzdGF0dXMoY29ubikgIT0gQ09OTkVDVElPTl9PSykgeworCQkvKiBBdHRlbXB0IGEgcmVzZXQgKi8KKwkJUFFyZXNldChjb25uKTsKKwkJaWYgKFBRc3RhdHVzKGNvbm4pICE9IENPTk5FQ1RJT05fT0spIHsKKwkJCVRSQUNFX0RFQlVHKElORk8sICJMb3N0IGNvbm5lY3Rpb24gdG8gdGhlIGRhdGFiYXNlIHNlcnZlciwgYW5kIGF0dGVtcHQgdG8gcmVlc3RhYmxpc2ggaXQgZmFpbGVkIik7CisJCQlUT0RPKCJUZXJtaW5hdGUgdGhlIGZyZWVEaWFtZXRlciBpbnN0YW5jZSBjb21wbGV0ZWx5PyIpOworCQkJcmV0dXJuIEVOT1RDT05OOworCQl9CisJfQorCQorCWlmIChuZXcpIHsKKwkJLyogQ3JlYXRlIHRoZSBwcmVwYXJlZCBzdGF0ZW1lbnQgZm9yIHRoaXMgb2NubmVjdGlvbiwgaXQgaXMgbm90IHNoYXJlZCAqLworCQlyZXMgPSBQUXByZXBhcmUoY29ubiwgc3RtdCwgc3FsLCBuYnJlY29yZHMsIE5VTEwpOworCQlpZiAoUFFyZXN1bHRTdGF0dXMocmVzKSAhPSBQR1JFU19DT01NQU5EX09LKSB7CisJCQlUUkFDRV9ERUJVRyhJTkZPLCAiUHJlcGFyaW5nIHN0YXRlbWVudCAnJXMnIGZhaWxlZDogJXMiLAorCQkJCXNxbCwgUFFlcnJvck1lc3NhZ2UoY29ubikpOworCQkJUFFjbGVhcihyZXMpOworCQkJcmV0dXJuIEVJTlZBTDsKKyAgICAgICAgCX0KKwkJUFFjbGVhcihyZXMpOworCX0KKwkKKwlzaXplID0gCWFjY3RfY29uZmlnLT50c2ZpZWxkID8gcmVjb3Jkcy0+bmJhbGwgKyAxIDogcmVjb3Jkcy0+bmJhbGw7CisJCisJLyogQWxsb2MgdGhlIGFycmF5cyBvZiBwYXJhbWV0ZXJzICovCisJQ0hFQ0tfTUFMTE9DKCB2YWwgICAgICAgPSBjYWxsb2Moc2l6ZSwgc2l6ZW9mKGNvbnN0IGNoYXIgKikpICk7CisJQ0hFQ0tfTUFMTE9DKCB2YWxfbGVuICAgPSBjYWxsb2Moc2l6ZSwgc2l6ZW9mKGNvbnN0IGludCkpICk7CisJQ0hFQ0tfTUFMTE9DKCB2YWxfaXNiaW4gPSBjYWxsb2Moc2l6ZSwgc2l6ZW9mKGNvbnN0IGludCkpICk7CisJCisJaWYgKGFjY3RfY29uZmlnLT50c2ZpZWxkKSB7CisJCXZhbFtpZHhdID0gIm5vdyI7CisJCXZhbF9sZW5baWR4XSA9IDM7CisJCXZhbF9pc2JpbltpZHhdID0gMDsKKwkJaWR4Kys7CisJfQorCQorCS8qIE5vdyB3cml0ZSBhbGwgdGhlIG1hcCdkIHJlY29yZHMgaW4gdGhlc2UgYXJyYXlzICovCisJZm9yIChsaSA9IHJlY29yZHMtPmFsbC5uZXh0OyBsaSAhPSAmcmVjb3Jkcy0+YWxsOyBsaSA9IGxpLT5uZXh0KSB7CisJCXN0cnVjdCBhY2N0X3JlY29yZF9pdGVtICogciA9IChzdHJ1Y3QgYWNjdF9yZWNvcmRfaXRlbSAqKShsaS0+byk7CisJCWlmIChyLT52YWx1ZSkgeworCQkJdmFsX2lzYmluW2lkeF0gPSAxOyAvKiBXZSBhbHdheXMgcGFzcyBiaW5hcnkgcGFyYW1ldGVycyAqLworCQkJc3dpdGNoIChyLT5wYXJhbS0+YXZwdHlwZSkgeworCQkJCWNhc2UgQVZQX1RZUEVfT0NURVRTVFJJTkc6CisJCQkJCXZhbFtpZHhdID0gKHZvaWQgKikoci0+dmFsdWUtPm9zLmRhdGEpOworCQkJCQl2YWxfbGVuW2lkeF0gPSByLT52YWx1ZS0+b3MubGVuOworCQkJCQlicmVhazsKKwkJCQkJCisJCQkJY2FzZSBBVlBfVFlQRV9JTlRFR0VSMzI6CisJCQkJY2FzZSBBVlBfVFlQRV9VTlNJR05FRDMyOgorCQkJCWNhc2UgQVZQX1RZUEVfRkxPQVQzMjoKKwkJCQkJci0+c2NhbGFyLnYzMiA9IGh0b25sKHItPnZhbHVlLT51MzIpOworCQkJCQl2YWxbaWR4XSA9ICZyLT5zY2FsYXIuYzsKKwkJCQkJdmFsX2xlbltpZHhdID0gc2l6ZW9mKHVpbnQzMl90KTsKKwkJCQkJYnJlYWs7CisJCQkJCQorCQkJCWNhc2UgQVZQX1RZUEVfSU5URUdFUjY0OgorCQkJCWNhc2UgQVZQX1RZUEVfVU5TSUdORUQ2NDoKKwkJCQljYXNlIEFWUF9UWVBFX0ZMT0FUNjQ6CisJCQkJCXItPnNjYWxhci52NjQgPSBodG9ubGwoci0+dmFsdWUtPnU2NCk7CisJCQkJCXZhbFtpZHhdID0gJnItPnNjYWxhci5jOworCQkJCQl2YWxfbGVuW2lkeF0gPSBzaXplb2YodWludDY0X3QpOworCQkJCQlicmVhazsKKwkJCQkKKwkJCQlkZWZhdWx0OgorCQkJCQlBU1NFUlQoMCk7IC8qIGRldGVjdCBidWdzICovCisJCQl9CisJCX0KKwkJCisJCWlkeCsrOworCX0KKwkKKwkvKiBPSywgbm93IGV4ZWN1dGUgdGhlIFNRTCBzdGF0ZW1lbnQgKi8KKwlyZXMgPSBQUWV4ZWNQcmVwYXJlZChjb25uLCBzdG10LCBzaXplLCAoY29uc3QgY2hhciAqIGNvbnN0ICopdmFsLCB2YWxfbGVuLCB2YWxfaXNiaW4sIDEgLyogV2UgYWN0dWFsbHkgZG9uJ3QgY2FyZSBoZXJlICovKTsKKwkKKwkvKiBEb25lIHdpdGggdGhlIHBhcmFtZXRlcnMgKi8KKwlmcmVlKHZhbCk7CisJZnJlZSh2YWxfbGVuKTsKKwlmcmVlKHZhbF9pc2Jpbik7CisJCisJLyogTm93IGNoZWNrIHRoZSByZXN1bHQgY29kZSAqLworCWlmIChQUXJlc3VsdFN0YXR1cyhyZXMpICE9IFBHUkVTX0NPTU1BTkRfT0spIHsKKwkJVFJBQ0VfREVCVUcoSU5GTywgIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIElOU0VSVGluZyBpbiB0aGUgZGF0YWJhc2U6ICVzIiwgUFFlcnJvck1lc3NhZ2UoY29ubikpOworCQlQUWNsZWFyKHJlcyk7CisJCXJldHVybiBFSU5WQUw7IC8qIEl0IHdhcyBwcm9iYWJseSBhIG1pc3Rha2UgaW4gY29uZmlndXJhdGlvbiBmaWxlLi4uICovCisgICAgICAgIH0KKwlQUWNsZWFyKHJlcyk7CisJCisJLyogT2ssIHdlIGFyZSBkb25lICovCisJcmV0dXJuIDA7Cit9CisKKwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9hcHBfYWNjdC9hY2N0X3JlY29yZHMuYyBiL2V4dGVuc2lvbnMvYXBwX2FjY3QvYWNjdF9yZWNvcmRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYxYjM0MAotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvYXBwX2FjY3QvYWNjdF9yZWNvcmRzLmMKQEAgLTAsMCArMSwxNjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDEzLCBXSURFIFByb2plY3QgYW5kIE5JQ1QJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFdJREUgUHJvamVjdCBvciBOSUNUIG5vciB0aGUgCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgV0lERSBQcm9qZWN0IGFuZCAJCQkJCQkgKgorKiAgIE5JQ1QuCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRnVuY3Rpb25zIHRvIGNyZWF0ZSBhIGxpc3Qgb2YgQVZQcyBhY2NvcmRpbmcgdG8gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSAqLworCisjaW5jbHVkZSAiYXBwX2FjY3QuaCIKKworLyogUHJlcGFyZSBhIGxpc3Qgb2YgYWNjdF9yZWNvcmQgZW50cmllcyBmcm9tIHRoZSBjb25maWd1cmF0aW9uLCB3aXRob3V0IG1hcHBpbmcgYW55IHZhbHVlIGF0IHRoaXMgdGltZSAqLworaW50IGFjY3RfcmVjX3ByZXBhcmUoc3RydWN0IGFjY3RfcmVjb3JkX2xpc3QgKiByZWNvcmRzKQoreworCXN0cnVjdCBmZF9saXN0ICogbGk7CisJVFJBQ0VfRU5UUlkoIiVwIiwgcmVjb3Jkcyk7CisJQ0hFQ0tfUEFSQU1TKCByZWNvcmRzICYmIGFjY3RfY29uZmlnICk7CisJCisJLyogUHJlcGFyZSB0aGUgcmVjb3JkcyBzdHJ1Y3R1cmUgKi8KKwltZW1zZXQocmVjb3JkcywgMCwgc2l6ZW9mKHN0cnVjdCBhY2N0X3JlY29yZF9saXN0KSk7CisJZmRfbGlzdF9pbml0KCZyZWNvcmRzLT5hbGwsIHJlY29yZHMpOworCWZkX2xpc3RfaW5pdCgmcmVjb3Jkcy0+dW5tYXBlZCwgcmVjb3Jkcyk7CisJCisJLyogZm9yIGVhY2ggZW50cnkgaW4gdGhlIGNvbmZpZ3VyYXRpb24gKi8KKwlmb3IgKGxpID0gYWNjdF9jb25maWctPmF2cHMubmV4dDsgbGkgIT0gJmFjY3RfY29uZmlnLT5hdnBzOyBsaSA9IGxpLT5uZXh0KSB7CisJCXN0cnVjdCBhY2N0X2NvbmZfYXZwICogYSA9IChzdHJ1Y3QgYWNjdF9jb25mX2F2cCAqKWxpOworCQlzdHJ1Y3QgYWNjdF9yZWNvcmRfaXRlbSAqIG5ldzsKKwkJaW50IGkgPSBhLT5tdWx0aSA/IDEgOiAwOworCQkvKiBDcmVhdGUgYXMgbWFueSByZWNvcmRzIGFzIHRoZSAnbXVsdGknIHBhcmFtZXRlciByZXF1aXJlcyAqLworCQlkbyB7CisJCQlDSEVDS19NQUxMT0MoIG5ldyA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGFjY3RfcmVjb3JkX2l0ZW0pKSApOworCQkJbWVtc2V0KG5ldywgMCwgc2l6ZW9mKHN0cnVjdCBhY2N0X3JlY29yZF9pdGVtKSk7CisJCQlmZF9saXN0X2luaXQoJm5ldy0+Y2hhaW4sIG5ldyk7CisJCQlmZF9saXN0X2luaXQoJm5ldy0+dW5tYXBkLCBuZXcpOworCQkJbmV3LT5wYXJhbSA9IGE7CisJCQluZXctPmluZGV4ID0gaTsKKwkJCWZkX2xpc3RfaW5zZXJ0X2JlZm9yZSgmcmVjb3Jkcy0+YWxsLCAmbmV3LT5jaGFpbik7CisJCQlmZF9saXN0X2luc2VydF9iZWZvcmUoJnJlY29yZHMtPnVubWFwZWQsICZuZXctPnVubWFwZCk7CisJCQlyZWNvcmRzLT5uYmFsbCsrOworCQkJcmVjb3Jkcy0+bmJ1bm1hcCsrOworCQkJaSsrOworCQl9IHdoaWxlIChpIDw9IGEtPm11bHRpKTsKKwl9CisJCisJcmV0dXJuIDA7Cit9CisKKy8qIEZpbmQgdGhlIEFWUHMgZnJvbSBjb25maWd1cmF0aW9uIGluc2lkZSBhIHJlY2VpdmVkIG1lc3NhZ2UgKi8KK2ludCBhY2N0X3JlY19tYXAoc3RydWN0IGFjY3RfcmVjb3JkX2xpc3QgKiByZWNvcmRzLCBzdHJ1Y3QgbXNnICogbXNnKQoreworCXN0cnVjdCBhdnAgKiBhdnA7CisJCisJVFJBQ0VfRU5UUlkoIiVwICVwIiwgcmVjb3JkcywgbXNnKTsKKwkKKwkvKiBGb3IgZWFjaCBBVlAgaW4gdGhlIG1lc3NhZ2UsIHNlYXJjaCBpZiB3ZSBoYXZlIGEgY29ycmVzcG9uZGluZyB1bm1hcCdkIHJlY29yZCAqLworCUNIRUNLX0ZDVCggIGZkX21zZ19icm93c2UobXNnLCBNU0dfQlJXX0ZJUlNUX0NISUxELCAmYXZwLCBOVUxMKSAgKTsKKwl3aGlsZSAoYXZwKSB7CisJCXN0cnVjdCBmZF9saXN0ICogbGk7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIG1vZGVsOworCQkKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfbW9kZWwoYXZwLCAmbW9kZWwpICk7CisJCWlmIChtb2RlbCAhPSBOVUxMKSB7CS8qIHdlIGlnbm9yZSB0aGUgQVZQcyB3ZSBkb24ndCByZWNvZ25pemUgKi8KKwkJCisJCQkvKiBTZWFyY2ggdGhpcyBtb2RlbCBpbiB0aGUgbGlzdCAqLworCQkJZm9yIChsaSA9IHJlY29yZHMtPnVubWFwZWQubmV4dDsgbGkgIT0gJnJlY29yZHMtPnVubWFwZWQ7IGxpID0gbGktPm5leHQpIHsKKwkJCQlzdHJ1Y3QgYWNjdF9yZWNvcmRfaXRlbSAqIHIgPSAoc3RydWN0IGFjY3RfcmVjb3JkX2l0ZW0gKikobGktPm8pOworCQkJCWlmIChyLT5wYXJhbS0+YXZwb2JqID09IG1vZGVsKSB7CisJCQkJCS8qIEl0IG1hdGNoZXM6IHNhdmUgdGhlIEFWUCB2YWx1ZSBhbmQgdW5saW5rIHRoaXMgcmVjb3JkIGZyb20gdGhlIHVubWFwJ2QgbGlzdCAqLworCQkJCQlzdHJ1Y3QgYXZwX2hkciAqIGg7CisJCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9oZHIoIGF2cCwgJmggKSApOworCQkJCQlyLT52YWx1ZSA9IGgtPmF2cF92YWx1ZTsKKwkJCQkJZmRfbGlzdF91bmxpbmsoJnItPnVubWFwZCk7CisJCQkJCXJlY29yZHMtPm5idW5tYXAgLT0gMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQkvKiBDb250aW51ZSBvbmx5IHdoaWxlIHRoZXJlIGFyZSBzb21lIEFWUHMgdG8gbWFwICovCisJCQlpZiAoRkRfSVNfTElTVF9FTVBUWSgmcmVjb3Jkcy0+dW5tYXBlZCkpCisJCQkJYnJlYWs7CisJCX0KKwkJCisJCS8qIEdvIHRvIG5leHQgQVZQIGluIHRoZSBtZXNzYWdlICovCisJCUNIRUNLX0ZDVCggZmRfbXNnX2Jyb3dzZShhdnAsIE1TR19CUldfTkVYVCwgJmF2cCwgTlVMTCkgKTsKKwl9CisJCisJLyogRG9uZSAqLworCXJldHVybiAwOworfQorCisvKiBDaGVjayB0aGF0IGEgbWFwcGVkIGxpc3QgaXMgbm90IGVtcHR5IGFuZCBubyByZXF1aXJlZCBBVlAgaXMgbWlzc2luZy4gRnJlZSB0aGUgcmVjb3JkIGxpc3QgaW4gY2FzZSBvZiBlcnJvciAqLworaW50IGFjY3RfcmVjX3ZhbGlkYXRlKHN0cnVjdCBhY2N0X3JlY29yZF9saXN0ICogcmVjb3JkcykKK3sKKwlzdHJ1Y3QgZmRfbGlzdCAqIGxpOworCVRSQUNFX0VOVFJZKCIlcCIsIHJlY29yZHMpOworCUNIRUNLX1BBUkFNUyggcmVjb3JkcyApOworCQorCS8qIENoZWNrIGF0IGxlYXN0IG9uZSBBVlAgd2FzIG1hcHBlZCAqLworCWlmIChyZWNvcmRzLT5uYmFsbCA9PSByZWNvcmRzLT5uYnVubWFwKSB7CisJCWZkX2xvZ19kZWJ1ZygiVGhlIHJlY2VpdmVkIEFDUiBkb2VzIG5vdCBjb250YWluIGFueSBBVlAgZnJvbSB0aGUgY29uZmlndXJhdGlvbiBmaWxlLiIKKwkJCQkiIFRoaXMgaXMgYW4gaW52YWxpZCBzaXR1YXRpb24uIFBsZWFzZSBmaXggeW91ciBjb25maWd1cmF0aW9uIGZpbGUuIgorCQkJCSIgT25lIHdheSB0byBlbnN1cmUgdGhpcyBkb2VzIG5vdCBoYXBwZW4gaXMgdG8gaW5jbHVkZSBTZXNzaW9uLUlkIGluIHRoZSBkYXRhYmFzZS4iKTsKKwkJYWNjdF9yZWNfZW1wdHkocmVjb3Jkcyk7CisJCXJldHVybiBFSU5WQUw7CisJfQorCQorCS8qIE5vdywgY2hlY2sgdGhlcmUgaXMgbm8gcmVxdWlyZWQgQVZQIHVubWFwJ2QgKi8KKwlmb3IgKGxpID0gcmVjb3Jkcy0+dW5tYXBlZC5uZXh0OyBsaSAhPSAmcmVjb3Jkcy0+dW5tYXBlZDsgbGkgPSBsaS0+bmV4dCkgeworCQlzdHJ1Y3QgYWNjdF9yZWNvcmRfaXRlbSAqIHIgPSAoc3RydWN0IGFjY3RfcmVjb3JkX2l0ZW0gKikobGktPm8pOworCQlpZiAoci0+cGFyYW0tPnJlcXVpcmVkICYmIChyLT5pbmRleCA8PSAxKSkgeworCQkJZmRfbG9nX2RlYnVnKCJUaGUgcmVjZWl2ZWQgQUNSIGRvZXMgbm90IGNvbnRhaW4gdGhlIHJlcXVpcmVkIEFWUCAnJXMnLiIsIHItPnBhcmFtLT5hdnBuYW1lKTsKKwkJCWFjY3RfcmVjX2VtcHR5KHJlY29yZHMpOworCQkJcmV0dXJuIEVJTlZBTDsKKwkJfQorCX0KKwkKKwkvKiBUaGUgcmVjb3JkIGxpc3QgaXMgT0sgKi8KKwlyZXR1cm4gMDsKK30KKworLyogRnJlZSBhbGwgdGhlIGl0ZW1zIGluIGFuIGFjY3RfcmVjb3JkX2xpc3QgcmV0dXJuZWQgYnkgYWNjdF9yZWNfcHJlcGFyZSAqLwordm9pZCBhY2N0X3JlY19lbXB0eShzdHJ1Y3QgYWNjdF9yZWNvcmRfbGlzdCAqIHJlY29yZHMpCit7CisJVFJBQ0VfRU5UUlkoIiVwIiwgcmVjb3Jkcyk7CisJQ0hFQ0tfUEFSQU1TX0RPKCByZWNvcmRzLCByZXR1cm4gKTsKKwkKKwl3aGlsZSAoIUZEX0lTX0xJU1RfRU1QVFkoJnJlY29yZHMtPmFsbCkpIHsKKwkJc3RydWN0IGFjY3RfcmVjb3JkX2l0ZW0gKiByID0gKHN0cnVjdCBhY2N0X3JlY29yZF9pdGVtICopKHJlY29yZHMtPmFsbC5uZXh0KTsKKwkJZmRfbGlzdF91bmxpbmsoICZyLT5jaGFpbiApOworCQlmZF9saXN0X3VubGluayggJnItPnVubWFwZCApOworCQlmcmVlKHIpOworCX0KK30KZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvYXBwX2FjY3QvYXBwX2FjY3QuYyBiL2V4dGVuc2lvbnMvYXBwX2FjY3QvYXBwX2FjY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDY1Yjc1Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9hcHBfYWNjdC9hcHBfYWNjdC5jCkBAIC0wLDAgKzEsMTU1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxMSwgV0lERSBQcm9qZWN0IGFuZCBOSUNUCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBXSURFIFByb2plY3Qgb3IgTklDVCBub3IgdGhlIAkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFdJREUgUHJvamVjdCBhbmQgCQkJCQkJICoKKyogICBOSUNULgkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoZSBzaW1wbGUgQWNjb3VudGluZyBzZXJ2ZXIgZm9yIGZyZWVEaWFtZXRlciAqLworCisjaW5jbHVkZSAiYXBwX2FjY3QuaCIKKworLyogTWFuZGF0b3J5IEFWUHMgZm9yIHRoZSBBY2NvdW50aW5nLUFuc3dlciAoYW55IHZhbHVlIGluIGFkZGluZyBhbGwgdGhlIG90aGVyIEFWUHM/KSAqLworc3RhdGljIHN0cnVjdCB7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogQWNjb3VudGluZ19SZWNvcmRfTnVtYmVyOworCXN0cnVjdCBkaWN0X29iamVjdCAqIEFjY291bnRpbmdfUmVjb3JkX1R5cGU7Cit9IGFjY3RfZGljdDsKKworCisvKiBDYWxsYmFjayBmb3IgaW5jb21pbmcgQmFzZSBBY2NvdW50aW5nIEFjY291bnRpbmctUmVxdWVzdCBtZXNzYWdlcyAqLworc3RhdGljIGludCBhY2N0X2NiKCBzdHJ1Y3QgbXNnICoqIG1zZywgc3RydWN0IGF2cCAqIGF2cCwgc3RydWN0IHNlc3Npb24gKiBzZXNzLCB2b2lkICogb3BhcXVlLCBlbnVtIGRpc3BfYWN0aW9uICogYWN0KQoreworCXN0cnVjdCBtc2cgKiBtOworCXN0cnVjdCBhdnAgKiBhID0gTlVMTDsKKwlzdHJ1Y3QgYXZwX2hkciAqIGFydD1OVUxMLCAqYXJuPU5VTEw7IC8qIFdlIGtlZXAgYSBwb2ludGVyIG9uIHRoZSBBY2NvdW50aW5nLVJlY29yZC17VHlwZSwgTnVtYmVyfSBBVlBzIGZyb20gdGhlIHF1ZXJ5ICovCisJc3RydWN0IGFjY3RfcmVjb3JkX2xpc3Qgcmw7CisJCisJVFJBQ0VfRU5UUlkoIiVwICVwICVwICVwIiwgbXNnLCBhdnAsIHNlc3MsIGFjdCk7CisJaWYgKG1zZyA9PSBOVUxMKQorCQlyZXR1cm4gRUlOVkFMOworCQorCW0gPSAqbXNnOworCQorCS8qIFByZXBhcmUgYSBuZXcgcmVjb3JkIGxpc3QgKi8KKwlDSEVDS19GQ1QoIGFjY3RfcmVjX3ByZXBhcmUoICZybCApICk7CisJCisJLyogTWFwcyB0aGUgQVZQcyBmcm9tIHRoZSBxdWVyeSB3aXRoIHRoaXMgcmVjb3JkIGxpc3QgKi8KKwlDSEVDS19GQ1QoIGFjY3RfcmVjX21hcCggJnJsLCBtICkgKTsKKwkKKwkvKiBDaGVjayB0aGF0IGF0IGxlYXN0IG9uZSBBVlAgd2FzIG1hcHBlZCAqLworCUNIRUNLX0ZDVCggYWNjdF9yZWNfdmFsaWRhdGUoICZybCApICk7CisJCisJLyogTm93LCBzYXZlIHRoZXNlIG1hcHBlZCBBVlBzIGluIHRoZSBkYXRhYmFzZSAqLworCUNIRUNLX0ZDVCggYWNjdF9kYl9pbnNlcnQoICZybCApICk7CisJCisJYWNjdF9yZWNfZW1wdHkoICZybCApOworCQorCS8qIE9LLCB3ZSBjYW4gc2VuZCBhIHBvc2l0aXZlIHJlcGx5IG5vdyAqLworCQorCS8qIEdldCBBY2NvdW50aW5nLVJlY29yZC17TnVtYmVyLFR5cGV9IHZhbHVlcyAqLworCUNIRUNLX0ZDVCggZmRfbXNnX3NlYXJjaF9hdnAgKCBtLCBhY2N0X2RpY3QuQWNjb3VudGluZ19SZWNvcmRfVHlwZSwgJmEpICk7CisJaWYgKGEpIHsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2hkciggYSwgJmFydCApICApOworCX0KKwlDSEVDS19GQ1QoIGZkX21zZ19zZWFyY2hfYXZwICggbSwgYWNjdF9kaWN0LkFjY291bnRpbmdfUmVjb3JkX051bWJlciwgJmEpICk7CisJaWYgKGEpIHsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2hkciggYSwgJmFybiApICApOworCX0KKwkKKwkvKiBDcmVhdGUgdGhlIGFuc3dlciBtZXNzYWdlICovCisJQ0hFQ0tfRkNUKCBmZF9tc2dfbmV3X2Fuc3dlcl9mcm9tX3JlcSAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgbXNnLCAwICkgKTsKKwltID0gKm1zZzsKKworCS8qIFNldCB0aGUgT3JpZ2luLUhvc3QsIE9yaWdpbi1SZWFsbSwgUmVzdWx0LUNvZGUgQVZQcyAqLworCUNIRUNLX0ZDVCggZmRfbXNnX3Jlc2NvZGVfc2V0KCBtLCAiRElBTUVURVJfU1VDQ0VTUyIsIE5VTEwsIE5VTEwsIDEgKSApOworCQorCS8qIEFkZCB0aGUgbWFuZGF0b3J5IEFWUHMgaW4gdGhlIEFDQSAqLworCWlmIChhcnQpIHsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIGFjY3RfZGljdC5BY2NvdW50aW5nX1JlY29yZF9UeXBlLCAwLCAmYSApICk7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9zZXR2YWx1ZSggYSwgYXJ0LT5hdnBfdmFsdWUgKSApOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkKCBtLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGEgKSApOworCX0KKwlpZiAoYXJuKSB7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBhY2N0X2RpY3QuQWNjb3VudGluZ19SZWNvcmRfTnVtYmVyLCAwLCAmYSApICk7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9zZXR2YWx1ZSggYSwgYXJuLT5hdnBfdmFsdWUgKSApOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkKCBtLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGEgKSApOworCX0KKwkKKwkvKiBTZW5kIHRoZSBhbnN3ZXIgKi8KKwkqYWN0ID0gRElTUF9BQ1RfU0VORDsKKwlyZXR1cm4gMDsKK30KKwkKKworLyogZW50cnkgcG9pbnQgKi8KK3N0YXRpYyBpbnQgYWNjdF9lbnRyeShjaGFyICogY29uZmZpbGUpCit7CisJc3RydWN0IGRpc3Bfd2hlbiBkYXRhOworCQorCVRSQUNFX0VOVFJZKCIlcCIsIGNvbmZmaWxlKTsKKwkKKyNpZm5kZWYgVEVTVF9ERUJVRyAvKiBXZSBkbyB0aGlzIGRpZmZlcmVudGx5IGluIHRoZSB0ZXN0IHNjZW5hcmlvICovCisJLyogSW5pdGlhbGl6ZSB0aGUgY29uZmlndXJhdGlvbiBhbmQgcGFyc2UgdGhlIGZpbGUgKi8KKwlDSEVDS19GQ1QoIGFjY3RfY29uZl9pbml0KCkgKTsKKwlDSEVDS19GQ1QoIGFjY3RfY29uZl9wYXJzZShjb25mZmlsZSkgKTsKKwlDSEVDS19GQ1QoIGFjY3RfY29uZl9jaGVjayhjb25mZmlsZSkgKTsKKyNlbmRpZiAvKiBURVNUX0RFQlVHICovCisJCisJLyogTm93IGluaXRpYWxpemUgdGhlIGRhdGFiYXNlIG1vZHVsZSAqLworCUNIRUNLX0ZDVCggYWNjdF9kYl9pbml0KCkgKTsKKwkKKwkvKiBTZWFyY2ggdGhlIEFWUHMgd2Ugd2lsbCBuZWVkIGluIHRoaXMgZmlsZSAqLworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiQWNjb3VudGluZy1SZWNvcmQtTnVtYmVyIiwgJmFjY3RfZGljdC5BY2NvdW50aW5nX1JlY29yZF9OdW1iZXIsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIkFjY291bnRpbmctUmVjb3JkLVR5cGUiLCAmYWNjdF9kaWN0LkFjY291bnRpbmdfUmVjb3JkX1R5cGUsIEVOT0VOVCkgKTsKKwkKKwkvKiBSZWdpc3RlciB0aGUgZGlzcGF0Y2ggY2FsbGJhY2tzICovCisJbWVtc2V0KCZkYXRhLCAwLCBzaXplb2YoZGF0YSkpOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BUFBMSUNBVElPTiwgQVBQTElDQVRJT05fQllfTkFNRSwgIkRpYW1ldGVyIEJhc2UgQWNjb3VudGluZyIsICZkYXRhLmFwcCwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIkFjY291bnRpbmctUmVxdWVzdCIsICZkYXRhLmNvbW1hbmQsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2Rpc3BfcmVnaXN0ZXIoIGFjY3RfY2IsIERJU1BfSE9XX0NDLCAmZGF0YSwgTlVMTCwgTlVMTCApICk7CisJCisJLyogQWR2ZXJ0aXNlIHRoZSBzdXBwb3J0IGZvciB0aGUgRGlhbWV0ZXIgQmFzZSBBY2NvdW50aW5nIGFwcGxpY2F0aW9uIGluIHRoZSBwZWVyICovCisJQ0hFQ0tfRkNUKCBmZF9kaXNwX2FwcF9zdXBwb3J0ICggZGF0YS5hcHAsIE5VTEwsIDAsIDEgKSApOworCQorCXJldHVybiAwOworfQorCisvKiBVbmxvYWQgKi8KK3ZvaWQgZmRfZXh0X2Zpbmkodm9pZCkKK3sKKwkvKiBDbG9zZSB0aGUgZGIgY29ubmVjdGlvbiAqLworCWFjY3RfZGJfZnJlZSgpOworCQorCS8qIERlc3Ryb3kgdGhlIGNvbmZpZ3VyYXRpb24gKi8KKwlhY2N0X2NvbmZfZnJlZSgpOworfQorCitFWFRFTlNJT05fRU5UUlkoImFwcF9hY2N0IiwgYWNjdF9lbnRyeSk7CmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2FwcF9hY2N0L2FwcF9hY2N0LmggYi9leHRlbnNpb25zL2FwcF9hY2N0L2FwcF9hY2N0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk4YTMzNQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvYXBwX2FjY3QvYXBwX2FjY3QuaApAQCAtMCwwICsxLDEyMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTEsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBIZWFkZXIgZmlsZSBmb3IgdGhlIGFwcF9hY2N0IGV4dGVuc2lvbi4gCisgKgorICogIFRoaXMgZXh0ZW5zaW9uIGlzIGEgc2ltcGxlIERpYW1ldGVyIEFjY291bnRpbmcgc2VydmVyLgorICoKKyAqIEl0IHJlY2VpdmVzIHRoZSBEaWFtZXRlciBBY2NvdW50aW5nLVJlcXVlc3QgbWVzc2FnZSwgYW5kIHNlbmRzIGl0cyBjb250ZW50IGluIGEgCisgKiAiYnVmZmVyIiBwb3N0Z3JlU1FMIGRhdGFiYXNlIChzZWUgY29uZmlndXJhdGlvbiBzYW1wbGUgZmlsZSBhcHBfYWNjdC5jb25mLnNhbXBsZSkuCisgKgorICogVGhlIGludGVudCBpcyB0aGF0IGFub3RoZXIgYXBwbGljYXRpb24gd2lsbCB0aGVuIHBpY2sgdGhlIHJlY29yZHMgZnJvbSB0aGlzICJidWZmZXIiIGRhdGFiYXNlCisgKiBhbmQgcHJvY2VzcyBpdCBhY2NvcmRpbmdseSB0byB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoZSBlbmQgYXBwbGljYXRpb24uCisgKi8KKyAKKyNpbmNsdWRlIDxmcmVlRGlhbWV0ZXIvZXh0ZW5zaW9uLmg+CisKKy8qIFRoZSBzdHJ1Y3R1cmUgY29ycmVzcG9uZGluZyB0byBhbiBBVlAgZW50cnkgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSAqLworc3RydWN0IGFjY3RfY29uZl9hdnAgeworCS8qIENoYWluICovCisJc3RydWN0IGZkX2xpc3QJIAkgY2hhaW47CQkvKiBsaW5rIGluIHRoZSBnbG9iYWwgbGlzdCAqLworCQorCS8qIFJhdyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgKi8KKwljaGFyIAkJCSphdnBuYW1lOwkvKiB0aGUgbmFtZSBvZiB0aGUgQVZQLCBhcyBhcHBlYXIgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSAqLworCWNoYXIJCQkqZmllbGQ7CQkvKiB0aGUgZmllbGQgbmFtZSBpbiB0aGUgZGF0YWJhc2UsIG9yIE5VTEwgaWYgaXQgaXMgdGhlIHNhbWUgYXMgYXZwbmFtZSAqLworCWludAkJCSByZXF1aXJlZDsJLyogc2V0IHRvIHRydWUgaWYgdGhpcyBBVlAgaGFzIHRvIGJlIGluIHRoZSBtZXNzYWdlICovCisJdW5zaWduZWQgCQkgbXVsdGk7CQkvKiB0aGUgbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9mIHRoaXMgQVZQIHdlIGNvbnZlcnQsIG9yIDAgaWYgaXQgd2FzIG5vdCBzcGVjaWZpZWQgKi8KKwkKKwkvKiBQYXJzZWQgaW5mb3JtYXRpb24gKi8KKwlzdHJ1Y3QgZGljdF9vYmplY3QgCSphdnBvYmo7CS8qIHRoZSBkaWN0aW9uYXJ5IG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgQVZQICovCisJZW51bSBkaWN0X2F2cF9iYXNldHlwZQkgYXZwdHlwZTsJLyogdGhpcyBpbmZvIGlzIGV4dHJhY3RlZCBmcm9tIGF2cG9iai4gR1JPVVBFRCBhdnBzIGFyZSBub3QgYWxsb3dlZCB5ZXQgKi8KK307CisKKy8qIFRoaXMgaXMgZGVzY3JpYmVkIG9ubHkgaW5zaWRlIGFjY3RfZGIuYyAqLworc3RydWN0IGFjY3RfZGI7CisKKy8qIFRoZSBjb21wbGV0ZSBjb25maWd1cmF0aW9uICovCitzdHJ1Y3QgYWNjdF9jb25mIHsKKwkvKiBBVlBzICovCisJc3RydWN0IGZkX2xpc3QJIGF2cHM7CQkvKiB0aGUgbGlzdCBvZiBhY2N0X2NvbmZfYXZwIGVudHJpZXMgKi8KKwkKKwkvKiBSYXcgaW5mb3JtYXRpb24gKi8KKwljaGFyCQkqY29ubmluZm87CS8qIHRoZSBjb25uZWN0aW9uIHN0cmluZyB0byB0aGUgZGF0YWJhc2UsIHRoYXQgaXMgcGFzc2VkIGFzIGlzIHRvIHRoZSBkYXRhYmFzZSBsaWJyYXJ5ICovCisJY2hhciAJCSp0YWJsZW5hbWU7CS8qIHRoZSBuYW1lIG9mIHRoZSB0YWJsZSB3ZSBhcmUgd29ya2luZyB3aXRoICovCisJY2hhciAJCSp0c2ZpZWxkOwkvKiB0aGUgbmFtZSBvZiB0aGUgdGltZXN0YW1wIGZpZWxkLCBvciBOVUxMIGlmIG5vdCByZXF1aXJlZCAqLworCWNoYXIgCQkqc3J2bmZpZWxkOwkvKiB0aGUgbmFtZSBvZiB0aGUgc2VydmVyIG5hbWUgZmllbGQsIG9yIE5VTEwgaWYgbm90IHJlcXVpcmVkICovCit9OworCisvKiBBIHN1Y2Nlc3NmdWxseSBwYXJzZWQgQWNjb3VudGluZy1SZXF1ZXN0IHByb2R1Y2VzIGEgbGlzdCBvZiB0aGVzZTogKi8KK3N0cnVjdCBhY2N0X3JlY29yZF9pdGVtIHsKKwlzdHJ1Y3QgZmRfbGlzdAkJIGNoYWluOwkvKiBsaW5rIHdpdGggYWxsIG90aGVycyAqLworCXN0cnVjdCBmZF9saXN0CQkgdW5tYXBkOy8qIGxpbmsgd2l0aCBvbmx5IHVubWFwJ2QgcmVjb3JkcyAqLworCXN0cnVjdCBhY2N0X2NvbmZfYXZwIAkqcGFyYW07CS8qIHRoZSBBVlAgZW50cnkgdGhpcyByZWZlcnMgdG8uICovCisJdW5zaWduZWQJCSBpbmRleDsJLyogaW4gY2FzZSBvZiBtdWx0aSAqLworCXVuaW9uIGF2cF92YWx1ZQkJKnZhbHVlOyAvKiBJZiB0aGUgQVZQIHdhcyBmb3VuZCBpbiB0aGUgbWVzc2FnZSwgdGhpcyBwb2ludHMgdG8gaXRzIHZhbHVlLiBPdGhlcndpc2UsIE5VTEwgKi8KKwl1bmlvbiB7CisJCXVpbnQzMl90IHYzMgkvKiBTdG9yYWdlIGFyZWEgZm9yIG5ldHdvcmsgYnl0ZS1vcmRlciBjb3B5IG9mIHRoZSBBVlAgdmFsdWUgKi87CisJCXVpbnQ2NF90IHY2NDsKKwkJY2hhcgkgYzsJLyogcG9pbnRlciB0aGF0IGlzIHBhc3NlZCB0byB0aGUgZGF0YWJhc2UgKi8KKwl9IAkJCSBzY2FsYXI7LyogZm9yIHNjYWxhciBBVlAgKGFsbCB0eXBlcyBleGNlcHQgT0NURVRTVFJJTkcpIHdlIGNvcHkgaW4gdGhpcyBhcmVhIHRoZSB2YWx1ZSBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIgKi8KK307CisKKy8qIFRoZSBzZW50aW5lbCBmb3IgYSBsaXN0IG9mIGFjY3RfcmVjb3JkX2l0ZW1zICovCitzdHJ1Y3QgYWNjdF9yZWNvcmRfbGlzdCB7CisJc3RydWN0IGZkX2xpc3QJYWxsOwkvKiBUaGUgbGlzdCBvZiByZWNvcmRzICovCisJaW50CQluYmFsbDsJLyogVGhlIG51bWJlciBvZiByZWNvcmRzIGluIGFsbCAqLworCXN0cnVjdCBmZF9saXN0CXVubWFwZWQ7LyogT25seSB0aGUgcmVjb3JkcyB3aXRob3V0IGEgdmFsdWUgKi8KKwlpbnQJCW5idW5tYXA7LyogVGhlIG51bWJlciBvZiB1bm1hcCdkIHJlY29yZHMgKi8KK307CisKKy8qIE1hcHBpbmcgb2YgdGhlIGRhdGEgdHlwZXMgYmV0d2VlbiBEaWFtZXRlciBBVlAgYW5kIFBRIHR5cGVzOiAqLworZXh0ZXJuIGNvbnN0IGNoYXIgKiBkaWFtMmRiX3R5cGVzX21hcHBpbmdbXTsKKworLyogSW4gYWNjdF9jb25mLnkgKi8KK2V4dGVybiBzdHJ1Y3QgYWNjdF9jb25mICogYWNjdF9jb25maWc7CS8qIHRoZSBnbG9iYWwgY29uZmlndXJhdGlvbiAqLworaW50IGFjY3RfY29uZl9pbml0KHZvaWQpOworaW50IGFjY3RfY29uZl9wYXJzZShjaGFyICogY29uZmZpbGUpOworaW50IGFjY3RfY29uZl9jaGVjayhjaGFyICogY29uZmZpbGUpOwordm9pZCBhY2N0X2NvbmZfZnJlZSh2b2lkKTsKKworLyogSW4gYWNjdF9kYi5jICovCitpbnQgYWNjdF9kYl9pbml0KHZvaWQpOworaW50IGFjY3RfZGJfaW5zZXJ0KHN0cnVjdCBhY2N0X3JlY29yZF9saXN0ICogcmVjb3Jkcyk7Cit2b2lkIGFjY3RfZGJfZnJlZSh2b2lkKTsKKworLyogSW4gYWNjdF9yZWNvcmRzLmMgKi8KK2ludCBhY2N0X3JlY19wcmVwYXJlKHN0cnVjdCBhY2N0X3JlY29yZF9saXN0ICogcmVjb3Jkcyk7CitpbnQgYWNjdF9yZWNfbWFwKHN0cnVjdCBhY2N0X3JlY29yZF9saXN0ICogcmVjb3Jkcywgc3RydWN0IG1zZyAqIG1zZyk7CitpbnQgYWNjdF9yZWNfdmFsaWRhdGUoc3RydWN0IGFjY3RfcmVjb3JkX2xpc3QgKiByZWNvcmRzKTsKK3ZvaWQgYWNjdF9yZWNfZW1wdHkoc3RydWN0IGFjY3RfcmVjb3JkX2xpc3QgKiByZWNvcmRzKTsKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvYXBwX2RpYW1lYXAvQ01ha2VMaXN0cy50eHQgYi9leHRlbnNpb25zL2FwcF9kaWFtZWFwL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0NjMwMjIKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2FwcF9kaWFtZWFwL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNTYgQEAKKyMgVGhlIERpYW1ldGVyIEVBUCBBcHBsaWNhdGlvbiBleHRlbnNpb24KK1BST0pFQ1QoIkRpYW1ldGVyIEVBUCBBcHBsaWNhdGlvbiBleHRlbnNpb24iIEMpCisKKyMgRmluZCBNeVNRTCAKK0ZJTkRfUEFDS0FHRShNeVNRTCBSRVFVSVJFRCkKK0ZJTkRfUEFDS0FHRShHY3J5cHQgUkVRVUlSRUQpCitJTkNMVURFX0RJUkVDVE9SSUVTKCR7TXlTUUxfSU5DTFVERV9ESVJ9KQorCisjIFBhcnNlIHBsdWdpbnMKK0FERF9TVUJESVJFQ1RPUlkocGx1Z2lucykKKworIyBQYXJzZXIgCitCSVNPTl9GSUxFKGRpYW1lYXAueSkKK0ZMRVhfRklMRShkaWFtZWFwLmwpCitTRVRfU09VUkNFX0ZJTEVTX1BST1BFUlRJRVMobGV4LmRpYW1lYXAuYyBkaWFtZWFwLnRhYi5jIFBST1BFUlRJRVMgQ09NUElMRV9GTEFHUyAiLUkgXCIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn1cIiIpCisKKworc2V0KCBkaWFtZWFwc3JjCisgICAgZGlhbWVhcF9kZWZzLmgKKyAgICBkaWFtZWFwLmgKKyAgICBkaWFtZWFwX3NlcnZlci5oCisgICAgZGlhbWVhcF9wbHVnaW5zLmggICAgICAgIAorICAgIGRpYW1lYXBfZWFwLmgKKyAgICBwbHVnaW5zLmgKKyAgICBkaWFtZWFwX2VhcHBhY2tldC5oCisgICAgZGlhbWVhcF91c2VyLmgKKyAgICBkaWFtZWFwLnRhYi5oCisgICAgZGlhbWVhcC50YWIuYworICAgIGxleC5kaWFtZWFwLmMgICAgICAgIAorICAgIGRpYW1lYXAuYworICAgIGRpYW1lYXBfc2VydmVyLmMKKyAgICBkaWFtZWFwX3BsdWdpbnMuYworICAgIGRpYW1lYXBfaW5pdC5jCisgICAgZGlhbWVhcF9jb21tb24uaAorICAgIGRpYW1lYXBfZWFwcGFja2V0LmMKKyAgICBsaWJkaWFtZWFwLmgKKyAgICBkaWFtZWFwX2VhcC5jCisgICAgZGlhbWVhcF9teXNxbC5oCisgICAgZGlhbWVhcF9teXNxbC5jCisgICAgZGlhbWVhcF90bHMuaAorICAgIGRpYW1lYXBfdGxzLmMKKyAgICBsaWJjcnlwdC5oCisgICAgbGliY3J5cHQuYworICAgIGRpYW1lYXBfdXNlci5jCispCisKK0ZEX0FERF9FWFRFTlNJT04oYXBwX2RpYW1lYXAgJHtkaWFtZWFwc3JjfSkKKworVEFSR0VUX0xJTktfTElCUkFSSUVTKGFwcF9kaWFtZWFwICR7R0NSWVBUX0xJQlJBUll9ICR7R05VVExTX0xJQlJBUklFU30gJHtNeVNRTF9MSUJSQVJZfSApCisKKyMjIyMKKyMjIElOU1RBTEwgc2VjdGlvbiAjIworCitJTlNUQUxMKFRBUkdFVFMgYXBwX2RpYW1lYXAKKwlMSUJSQVJZIERFU1RJTkFUSU9OICR7SU5TVEFMTF9FWFRFTlNJT05TX1NVRkZJWH0KKwlDT01QT05FTlQgZnJlZURpYW1ldGVyLWVhcC1zZXJ2ZXIpCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2FwcF9kaWFtZWFwL0xJQ0VOU0UgYi9leHRlbnNpb25zL2FwcF9kaWFtZWFwL0xJQ0VOU0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZlNDhkMgotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvYXBwX2RpYW1lYXAvTElDRU5TRQpAQCAtMCwwICsxLDM1IEBACisgU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKQorIEF1dGhvciA6IFNvdWhlaWwgQmVuIEF5ZWQgPHNvdWhlaWxAdGVyYS5pY3Mua2Vpby5hYy5qcD4KKworIENvcHlyaWdodCAoYykgMjAwOS0yMDEwLCBTb3VoZWlsIEJlbiBBeWVkLCBUZXJhb2thIExhYm9yYXRvcnkgb2YgS2VpbyBVbml2ZXJzaXR5LCBhbmQgdGhlIFdJREUgUHJvamVjdAorIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgU291aGVpbCBCZW4gQXllZCA8c291aGVpbEB0ZXJhLmljcy5rZWlvLmFjLmpwPi4KKworIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgU291aGVpbCBCZW4gQXllZCwgVGVyYW9rYSBMYWJvcmF0b3J5IG9mIEtlaW8gVW5pdmVyc2l0eSBvciB0aGUgV0lERSBQcm9qZWN0IG5vciB0aGUKKyAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAnJ0FTIElTJycgQU5EIEFOWQorIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvYXBwX2RpYW1lYXAvUkVBRE1FIGIvZXh0ZW5zaW9ucy9hcHBfZGlhbWVhcC9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFkODViZAotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvYXBwX2RpYW1lYXAvUkVBRE1FCkBAIC0wLDAgKzEsMTE5IEBACitEaWFtRUFQIChodHRwOi8vZGlhbWVhcC55YWdhbWkuZnJlZWRpYW1ldGVyLm5ldC8pCisKK0NvcHlyaWdodCAoYykgMjAwOS0yMDEwIFNvdWhlaWwgQmVuIEF5ZWQsIFRlcmFva2EgTGFib3JhdG9yeSBvZiBLZWlvIFVuaXZlcnNpdHksIGFuZCB0aGUgV0lERSBQcm9qZWN0LgorCitBdXRob3I6IFNvdWhlaWwgQmVuIEF5ZWQgPHNvdWhlaWxAdGVyYS5pY3Mua2Vpby5hYy5qcD4KKworCisKKy0tLS0tIFNVTU1BUlkgLS0tLS0KKworRGlhbUVBUCBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRGlhbWV0ZXIgRXh0ZW5zaWJsZSBBdXRoZW50aWNhdGlvbiBQcm90b2NvbCAoRUFQKSBBcHBsaWNhdGlvbiAoUkZDIDQwNzIpLgorVGhlIERpYW1ldGVyIHByb3RvY29sIGlzIGEgQUFBIHByb3RvY29sIHRvIHNlY3VyZWx5IGNhcnJ5IEF1dGhlbnRpY2F0aW9uLCBBdXRob3JpemF0aW9uIGFuZCBBY2NvdW50aW5nIGluZm9ybWF0aW9ucyBiZXR3ZWVuIHRoZSBBQUEgY2xpZW50IGFuZCB0aGUgQUFBIHNlcnZlci4KK0RpYW1ldGVyIEVBUCBBcHBsaWNhdGlvbiBpcyBhIERpYW1ldGVyIGFwcGxpY2F0aW9uIHRoYXQgc3VwcG9ydHMgYXV0aGVudGljYXRpb24gdXNpbmcgRXh0ZW5zaWJsZSBBdXRoZW50aWNhdGlvbiBQcm90b2NvbCAoUkZDIDM3NDgpLiAgCisKK0RpYW1FQVAgaXMgZGVzaWduZWQgdG8gYmUgZXh0ZW5zaWJsZSBzbyB0aGF0IGFueSBuZXcgRUFQIG1ldGhvZCBjYW4gYmUgaW1wbGVtZW50ZWQgc2VwYXJhdGVseSBhcyBhIHNoYXJlZCBsaWJyYXJ5IGNhbGxlZCAnRUFQIG1ldGhvZCBwbHVnLWluJy4KK0N1cnJlbnRseSwgRGlhbUVBUCBjb21wcmlzZXMgdHdvIEVBUCBNZXRob2RzIHBsdWctaW5zOiAKKwktIEVBUCBNRDUgcGx1Zy1pbiA6IGltcGxlbWVudGF0aW9uIG9mIEVBUC1NRDUgYXV0aGVudGljYXRpb24gbWV0aG9kLgorCS0gRUFQIFRMUyBwbHVnLWluIDogaW1wbGVtZW50YXRpb24gb2YgRUFQLVRMUyBhdXRoZW50aWNhdGlvbiBtZXRob2QgLgorCitPdGhlciBFQVAgbWV0aG9kcyBhcmUgc2NoZWR1bGVkIHRvIGJlIGFkZGVkIGluIGZ1dHVyZSByZWxlYXNlcy4gCQorCQorRGlhbUVBUCBpcyBhbiBleHRlbnNpb24gZm9yIGZyZWVEaWFtZXRlci4gVmlzaXQgaHR0cDovL3d3dy5mcmVlZGlhbWV0ZXIubmV0LyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBmcmVlRGlhbWV0ZXIgcHJvamVjdC4KKworRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gRGlhbUVBUCBwcm9qZWN0LCB2aXNpdCBodHRwOi8vZGlhbWVhcC55YWdhbWkuZnJlZWRpYW1ldGVyLm5ldC8KKworCisKKy0tLS0tIFJFUVVJUkVNRU5UUyAtLS0tLQorCitTb21lIHBhY2thZ2VzIGFyZSByZXF1aXJlZCB0byBjb21waWxlIERpYW1FQVAgZnJvbSBzb3VyY2UuCisKK0lmIHlvdSB3aWxsIGluc3RhbGwgRGlhbUVBUCBvbiBEZWJpYW4gb3IgVWJ1bnR1IHN5c3RlbSBpbnN0YWxsIHRoZSBmb2xsb3dpbmcgcGFja2FnZXM6IGNtYWtlIGZsZXggYmlzb24gbGliZ251dGxzLWRldiBsaWJnY3J5cHQtZGV2IGxpYm15c3FsY2xpZW50LWRldgorCisJJCBzdWRvIGFwdC1nZXQgaW5zdGFsbCBjbWFrZSBmbGV4IGJpc29uIGxpYmdudXRscy1kZXYgbGliZ2NyeXB0LWRldiBsaWJteXNxbGNsaWVudC1kZXYKKworCisKKy0tLS0tIElOU1RBTExBVElPTiAtLS0tLQorCisxLSBBZGQgRGlhbUVBUCBleHRlbnNpb24gdG8gZnJlZURpYW1ldGVyLiAKKwlTZWUgZnJlZURpYW1ldGVyIGRvY3VtZW50YXRpb24gKGh0dHA6Ly93d3cuZnJlZWRpYW1ldGVyLm5ldC8pCisKKzItQ3JlYXRlIGEgbmV3IE15U1FMIGRhdGFiYXNlIGFuZCBhZGQgdGFibGVzIHVzaW5nIHRoZSBzcWwgc2NyaXB0ICdkaWFtZWFwLnNxbCcuCisKKzMtIEVkaXQgdGhlIGV4dGVuc2lvbnMvQ01ha2VMaXN0LnR4dCBmaWxlIHRvIGFkZCBEaWFtRUFQIHRvIGZyZWVEaWFtZXRlci4KKworQWRkIHRoZSBmb2xsb3dpbmcgbGluZXM6CisgICAKKwkgIE9QVElPTihCVUlMRF9BUFBfRElBTUVBUCAiQnVpbGQgRGlhbUVBUD8gKERpYW1ldGVyIEVBUCBBcHBsaWNhdGlvbiAtIFJGQyA0MDcyKSIgT0ZGKQorCSAJSUYgKEJVSUxEX0FQUF9ESUFNRUFQKQorCSAJICAgQUREX1NVQkRJUkVDVE9SWShhcHBfZGlhbWVhcCkKKwkgCUVORElGIChCVUlMRF9BUFBfRElBTUVBUCkKKworTm90ZTogeW91IGNhbiBlbmFibGUgRGlhbUVBUCB0byBiZSBidWlsdCB3aXRoIGZyZWVEaWFtZXRlciBieSBzZXR0aW5nIHRoZSBCVUlMRF9BUFBfRElBTUVBUCB0byBPTi4gSWYgeW91IGVuYWJsZSBpdCBoZXJlIHlvdSBkb24ndCBuZWVkIHRvIGVuYWJsZSBpdCB3aGVuIGJ1aWxkaW5nIGZyZWVEaWFtZXRlci4KKworNC0gRW5hYmxlIERpYW1FQVAgYnkgZW5hYmxpbmcgQlVJTERfQVBQX0RJQU1FQVAgb3B0aW9uIHdpdGggQ01ha2U6CisKK2NtYWtlIC1EQlVJTERfQVBQX0RJQU1FQVA6Qk9PbD1PTiAuLi8KKworCisKKy0tLS0tIENPTkZJR1VSQVRJT04gLS0tLS0KKworRGlhbUVBUCByZXF1aXJlcyBhIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBzdGFydCB0aGUgRGlhbUVBUCBzZXJ2ZXIuIAorSXQgaXMgYWR2aXNlZCB0byBzdGFydCBieSBhIGNvcHkgb2YgdGhlIHNhbXBsZSBmaWxlLCBhbmQgY3VzdG9taXplIHRoZSBjb25maWd1cmF0aW9uIHRvIGZpdCB5b3VyIG5lZWRzLgorQSBzYW1wbGUgY29uZmlndXJhdGlvbiBmaWxlICdkaWFtZWFwLmNvbmYuc2FtcGxlJyBjYW4gYmUgZmluZCBpbiBleHRlbnNpb25zL2FwcF9kaWFtZWFwLyBvciBpbiBkb2MvIGZvbGRlciBvZiBmcmVlRGlhbWV0ZXIuIAorVGhlIGZpbGUgJ2RpYW1lYXAuY29uZi5zYW1wbGUnIGNvbnRhaW5zIGEgZGVzY3JpcHRpb24gb2YgYWxsIHBhcmFtZXRlcnMgdGhhdCBjYW4gYmUgYWRkZWQgdG8gdGhlIERpYW1FQVAgY29uZmlndXJhdGlvbiBmaWxlLgorCisqU3BlY2lmeSBjb25uZWN0aW9uIHBhcmFtZXRlcnMgdG8gRGlhbUVBUCBNeVNRTCBkYXRhYmFzZToKKy0gdXNlcm5hbWUgYW5kIHBhc3N3b3JkIHRvIGNvbm5lY3QgdG8gdGhlIE15U1FMIFNlcnZlcgorLSBkYXRhYmFzZSBzZXJ2ZXIgOiBhZGRyZXNzIHRvIE15U1FMIHNlcnZlci4KKy0gZGF0YWJhc2UgbmFtZSA6ICBkYXRhYmFzZSBmb3IgRGlhbUVBUC4KKworRXhhbXBsZToKKworRGlhbUVBUF9NeVNRTCA9ICJVc2VyTmFtZSIgLCAiTXlQYXNzd29yZCIgLCAibG9jYWxob3N0IiAsICJkcnVwYWxfdWkiOworCisKKypBZGQgRUFQIE1ldGhvZCBwbHVnLWlucyB0byBiZSBsb2FkZWQgd2l0aCBEaWFtRUFQIHNlcnZlci4gTm90ZSB0aGF0IEVBUCBJZGVudGl0eSBtdXN0IGJlIGFkZC4KKworRXhhbXBsZToKKworTG9hZF9wbHVnaW4gPSAiRUFQIE1ENSI6NDowOiJleHRlbnNpb25zL2VhcF9tZDUuZW1wIjoiIjsKK0xvYWRfcGx1Z2luID0gIkVBUCBUTFMiOjEzOjA6ImV4dGVuc2lvbnMvZWFwX3Rscy5lbXAiOiJkb2MvZWFwX3Rsc19wbHVnaW4uYXBwX2RpYW1lYXAuY29uZiI7CisKKworKiBFbmFibGUgQXV0aG9yaXphdGlvbiB3aXRoIERpYW1FQVAuCisKK1lvdSBjYW4gZW5hYmxlIERpYW1FQVAgdG8gY2hlY2sgYXV0aG9yaXphdGlvbiBvZiBhdXRoZW50aWNhdGVkIHVzZXJzLiBUbyBlbmFibGUgYXV0aG9yaXphdGlvbiBzZXQgYXV0aG9yaXphdGlvbiB0byAxLiAoIGJ5IGRlZmF1bHQgZGlzYWJsZWQpLgorCisKKyogTXVsdGlwbGUgcm91bmQgdHJpcHMgdGltZW91dAorCitUaGlzIHBhcmFtZXRlciBpbmRpY2F0ZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHNlY29uZHMgcHJvdmlkZXMgdGhlIHVzZXIgdG8gYW5zd2VyIHRvIGEgRGlhbWV0ZXItRUFQLVJlcXVlc3QuIChieSBkZWZhdWx0IHNldCB0byAzMCBzZWNvbmRzKQorCisKKyogSW52YWxpZCBFQVAgUGFja2V0cworCitUaGlzIHBhcmFtZXRlciBkZWZpbmVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBpbnZhbGlkIEVBUCBwYWNrZXRzIHRoYXQgY2FuIGJlIHJlY2VpdmVkIGJlZm9yZSByZWplY3RpbmcgdGhlIGNvbm5lY3Rpb24uIChieSBkZWZhdWx0IHNldCB0byA1IHBhY2tldHMpCisKKworRm9yIG1vcmUgZG9jdW1lbnRhdGlvbiBvbiBjb25maWd1cmluZyBEaWFtRUFQLCB2aXNpdCB0aGUgZG9jdW1lbnRhdGlvbiBwYWdlIG9mIHRoZSBwcm9qZWN0IDogaHR0cDovL2RpYW1lYXAueWFnYW1pLmZyZWVkaWFtZXRlci5uZXQvZG9jdW1lbnRhdGlvbgorCisKKworLS0tLS0gQ09QWVJJR0hUIC0tLS0tCisKK1NlZSBMSUNFTlNFIGZpbGUgZm9yIGxlZ2FsIGluZm9ybWF0aW9uIG9uIHRoaXMgc29mdHdhcmUuCisKKworCistLS0tLSBDT05UQUNUIC0tLS0tCisKK0F1dGhvcjogU291aGVpbCBCZW4gQXllZCAoc291aGVpbEB0ZXJhLmljcy5rZWlvLmFjLmpwKQorCisKK0N1cnJlbnQgbWFpbnRhaW5lcnM6CistU291aGVpbCBCZW4gQXllZCAoVGVyYW9rYSBMYWJvcmF0b3J5IG9mIEtlaW8gVW5pdmVyc2l0eSkgCQorCXNvdWhlaWxAdGVyYS5pY3Mua2Vpby5hYy5qcApkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9hcHBfZGlhbWVhcC9kaWFtZWFwLmMgYi9leHRlbnNpb25zL2FwcF9kaWFtZWFwL2RpYW1lYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzM5OWNiCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9hcHBfZGlhbWVhcC9kaWFtZWFwLmMKQEAgLTAsMCArMSw4NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpCisgKiBBdXRob3IgOiBTb3VoZWlsIEJlbiBBeWVkIDxzb3VoZWlsQHRlcmEuaWNzLmtlaW8uYWMuanA+CisgKgorICogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTAsIFNvdWhlaWwgQmVuIEF5ZWQsIFRlcmFva2EgTGFib3JhdG9yeSBvZiBLZWlvIFVuaXZlcnNpdHksIGFuZCB0aGUgV0lERSBQcm9qZWN0CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBTb3VoZWlsIEJlbiBBeWVkIDxzb3VoZWlsQHRlcmEuaWNzLmtlaW8uYWMuanA+LgorICoKKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgU291aGVpbCBCZW4gQXllZCwgVGVyYW9rYSBMYWJvcmF0b3J5IG9mIEtlaW8gVW5pdmVyc2l0eSBvciB0aGUgV0lERSBQcm9qZWN0IG5vciB0aGUKKyAqICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICcnQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImRpYW1lYXBfY29tbW9uLmgiCisKKworCisvKiBEaWFtRUFQIENvbmZpZ3VyYXRpb24gKi8KK3N0YXRpYyBzdHJ1Y3QgZGlhbWVhcF9jb25mIGNvbmY7CitzdHJ1Y3QgZGlhbWVhcF9jb25mICogZGlhbWVhcF9jb25maWcgPSAmY29uZjsKKworLyogVGhlIGVudHJ5IHBvaW50ICovCitzdGF0aWMgaW50IGRpYW1lYXBfbWFpbihjaGFyICogY29uZmZpbGUpCit7CisJVFJBQ0VfRU5UUlkoIiVwIiwgY29uZmZpbGUpOworCisJbWVtc2V0KGRpYW1lYXBfY29uZmlnLCAwLCBzaXplb2Yoc3RydWN0IGRpYW1lYXBfY29uZikpOworCisJLyogSW5pdGlhbGl6ZSBjb25maWd1cmF0aW9uICovCisJQ0hFQ0tfRkNUKGRpYW1lYXBfaW5pdChjb25mZmlsZSkpOworCisJLyogU3RhcnQgRGlhbWV0ZXIgRUFQIEFwcGxpY2F0aW9uIChCYWNrLWVuZCBBdXRoZW50aWNhdG9yICkgKi8KKwlDSEVDS19GQ1QoZGlhbWVhcF9zdGFydF9zZXJ2ZXIoKSk7CisKKwkvKiBBbm5vdW5jZSB0aGUgc3VwcG9ydCBvZiBEaWFtZXRlciBFQVAgQXBwbGljYXRpb24gdG8gb3RoZXIgcGVlcnMgKi8KKwlDSEVDS19GQ1QoZmRfZGlzcF9hcHBfc3VwcG9ydChkYXRhb2JqX2RpYW1lYXBfYXBwLCBkYXRhb2JqX2RpYW1lYXBfdmVuLCAxLCAwKSk7CisKKwlMT0dfRCgiJXNEaWFtZXRlciBFQVAgQXBwbGljYXRpb24gRXh0ZW5zaW9uIHN0YXJ0ZWQgc3VjY2Vzc2Z1bGx5LiIsRElBTUVBUF9FWFRFTlNJT04pOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZmRfZXh0X2Zpbmkodm9pZCkKK3sKKwlUUkFDRV9ERUJVRyhGVUxMLCIlc1N0b3BwaW5nIHRoZSBzZXJ2ZXIiLERJQU1FQVBfRVhURU5TSU9OKTsKKwlDSEVDS19GQ1RfRE8oZGlhbWVhcF9zdG9wX3NlcnZlcigpLAorCQkJewlUUkFDRV9ERUJVRyhJTkZPLCIlc1N0b3BwaW5nIHRoZSBzZXJ2ZXI6IEVycm9yIG9jY3VycmVkLiIsRElBTUVBUF9FWFRFTlNJT04pO30pOworCisJaWYgKGRiX2Nvbm4pCisJeworCQlUUkFDRV9ERUJVRyhGVUxMLCIlc0Rpc2Nvbm5lY3RpbmcgZnJvbSBNeVNRTCBTZXJ2ZXIiLERJQU1FQVBfRVhURU5TSU9OKTsKKwkJZGlhbWVhcF9teXNxbF9kaXNjb25uZWN0KCk7CisJfQorCisJVFJBQ0VfREVCVUcoRlVMTCwiJXNVbmxvYWRpbmcgRUFQIE1ldGhvZHMgcGx1Zy1pbnM6IEVycm9yIG9jY3VycmVkLiIsRElBTUVBUF9FWFRFTlNJT04pOworCUNIRUNLX0ZDVF9ETyhkaWFtZWFwX3BsdWdpbl91bmxvYWQoKSwKKwkJCXsJVFJBQ0VfREVCVUcoSU5GTywiJXNVbmxvYWRpbmcgRUFQIE1ldGhvZHMgcGx1Zy1pbnM6IEVycm9yIG9jY3VycmVkLiIsRElBTUVBUF9FWFRFTlNJT04pO30pOworCXJldHVybjsKK30KKworLyogRGVmaW5lIHRoZSBlbnRyeSBwb2ludCAqLworRVhURU5TSU9OX0VOVFJZKCJEaWFtRUFQIiwgZGlhbWVhcF9tYWluLCAiZGljdF9lYXAiKQorOwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9hcHBfZGlhbWVhcC9kaWFtZWFwLmggYi9leHRlbnNpb25zL2FwcF9kaWFtZWFwL2RpYW1lYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTViMjgwCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9hcHBfZGlhbWVhcC9kaWFtZWFwLmgKQEAgLTAsMCArMSw4MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpCisgKiBBdXRob3IgOiBTb3VoZWlsIEJlbiBBeWVkIDxzb3VoZWlsQHRlcmEuaWNzLmtlaW8uYWMuanA+CisgKgorICogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTAsIFNvdWhlaWwgQmVuIEF5ZWQsIFRlcmFva2EgTGFib3JhdG9yeSBvZiBLZWlvIFVuaXZlcnNpdHksIGFuZCB0aGUgV0lERSBQcm9qZWN0CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBTb3VoZWlsIEJlbiBBeWVkIDxzb3VoZWlsQHRlcmEuaWNzLmtlaW8uYWMuanA+LgorICoKKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgU291aGVpbCBCZW4gQXllZCwgVGVyYW9rYSBMYWJvcmF0b3J5IG9mIEtlaW8gVW5pdmVyc2l0eSBvciB0aGUgV0lERSBQcm9qZWN0IG5vciB0aGUKKyAqICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICcnQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIERJQU1FQVBfSF8KKyNkZWZpbmUgRElBTUVBUF9IXworCisvKiBTdHJ1Y3R1cmUgdG8gaG9sZCBjb25maWd1cmF0aW9uIG9mIERpYW1FQVAqLworc3RydWN0IGRpYW1lYXBfY29uZgoreworCWNoYXIgKmNvbmZmaWxlOyAvKiBjb25maWd1cmF0aW9uIGZpbGUgb2YgdGhlIGV4dGVuc2lvbiovCisKKwlpbnQgYXV0aG9yaXplOyAvKiBTZXQgdG8gMSBpZiBwcm92aWRlcyBBdXRob3JpemF0aW9uLiBPdGhlcndpc2Ugc2V0IHRvIDAuIChieSBkZWZhdWx0IHNldCB0byAwKSovCisKKwl1MzIgdmVuZG9yX2lkOyAvKiBWZW5kb3IgSUQqLworCXUzMiBhcHBsaWNhdGlvbl9pZDsgLyogRGlhbWV0ZXIgRUFQIEFwcGxpY2F0aW9uIElELiBWYWx1ZSBzZXQgdG8gNS4gKi8KKwl1MzIgY29tbWFuZF9jb2RlOyAvKiBEaWFtZXRlciBFQVAgQXBwbGljYXRpb24gQ29tbWFuZCBDb2RlLiBWYWx1ZSBzZXQgdG8gMjY4LiAqLworCisJY2hhciAqIGRpYW1fcmVhbG07IC8qIERpYW1ldGVyIHJlYWxtIG9mIHRoZSBwZWVyICovCisKKwkvKkRpYW1ldGVyIEVBUCBTZXJ2ZXIqLworCWludCBtYXhfaW52YWxpZF9lYXBfcGFja2V0OworCisJLy9NeVNRTCBEYXRhYmFzZSBwYXJhbWV0ZXJzCisKKwlzdHJ1Y3QgeworCQljaGFyICpzZXJ2ZXI7CisJCWNoYXIgKnVzZXI7CisJCWNoYXIgKnBhc3N3b3JkOworCQljaGFyICpkYXRhYmFzZTsKKwl9ZGI7CisKKwl1MzIgbXVsdGlfcm91bmRfdGltZV9vdXQ7Cit9OworCisvKiBUaGUgcG9pbnRlciB0byBhY2Nlc3MgRGlhbUVBUCBjb25maWd1cmF0aW9uKi8KK2V4dGVybiBzdHJ1Y3QgZGlhbWVhcF9jb25mICpkaWFtZWFwX2NvbmZpZzsKKworLyogSW5pdGlhbGl6ZSB0aGUgY29uZmlndXJhdGlvbiBvZiBEaWFtRUFQKi8KK2ludCBkaWFtZWFwX2luaXQoY2hhciAqIGNvbmZmaWxlKTsKKworLyogcGFyc2VyICovCitpbnQgZGlhbWVhcHBhcnNlKHN0cnVjdCBkaWFtZWFwX2NvbmYgKiBjb25maWcpOworCisKKyNlbmRpZiAvKiBESUFNRUFQX0hfICovCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2FwcF9kaWFtZWFwL2RpYW1lYXAubCBiL2V4dGVuc2lvbnMvYXBwX2RpYW1lYXAvZGlhbWVhcC5sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkY2I0NzAKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2FwcF9kaWFtZWFwL2RpYW1lYXAubApAQCAtMCwwICsxLDEyOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpCisgKiBBdXRob3IgOiBTb3VoZWlsIEJlbiBBeWVkIDxzb3VoZWlsQHRlcmEuaWNzLmtlaW8uYWMuanA+CisgKgorICogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTAsIFNvdWhlaWwgQmVuIEF5ZWQsIFRlcmFva2EgTGFib3JhdG9yeSBvZiBLZWlvIFVuaXZlcnNpdHksIGFuZCB0aGUgV0lERSBQcm9qZWN0CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBTb3VoZWlsIEJlbiBBeWVkIDxzb3VoZWlsQHRlcmEuaWNzLmtlaW8uYWMuanA+LgorICoKKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgU291aGVpbCBCZW4gQXllZCwgVGVyYW9rYSBMYWJvcmF0b3J5IG9mIEtlaW8gVW5pdmVyc2l0eSBvciB0aGUgV0lERSBQcm9qZWN0IG5vciB0aGUKKyAqICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICcnQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisKKy8qRGVjbGFyYXRpb25zIGFuZCBvcHRpb24gc2V0dGluZ3MqLworJXsKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImRpYW1lYXBfY29tbW9uLmgiCisjaW5jbHVkZSAiZGlhbWVhcC50YWIuaCIKKyAKKyNkZWZpbmUgWVlfVVNFUl9BQ1RJT04geyAJCQkJCQlcCisJeXlsbG9jLT5maXJzdF9saW5lID0geXlsbG9jLT5sYXN0X2xpbmUgPSB5eWxpbmVubzsgXAorCXl5bGxvYy0+Zmlyc3RfY29sdW1uID0geXlsbG9jLT5sYXN0X2NvbHVtbiArIDE7IAkJXAorCXl5bGxvYy0+bGFzdF9jb2x1bW4gKz0geXlsZW5nICsxOwlcCisJfQkKKyAKKyNkZWZpbmUgWVlfTk9fSU5QVVQKKyV9CisKKworCislb3B0aW9uIG5veXl3cmFwCislb3B0aW9uIHl5bGluZW5vCislb3B0aW9uIGJpc29uLWJyaWRnZSAKKyVvcHRpb24gYmlzb24tbG9jYXRpb25zCislb3B0aW9uIG5vdW5wdXQKKworJSUKKwkvKiBMaXN0IG9mIHBhdHRlcm5zIGFuZCBhY3Rpb25zICovCisKKzwqPlxuCQkJewkJCQkKKwkJCQl5eWxsb2MtPmxhc3RfY29sdW1uPTA7IAorCQkJCX0KKworPCo+Iy4qJAkJCXsgfQorCitbIFx0XG5dKwkJeyAJCisJCQl5eWxsb2MtPmxhc3RfY29sdW1uPTA7IAorCQkJCS8qIGlnbm9yZSB3aGl0ZXNwYWNlICovIAorCQkJfQorCitcIihbXlxuXCJdKilcIgkJeworCQkJCXl5bHZhbC0+c3RyID0gc3RyZHVwKHl5dGV4dCsxKTsgLyogUXVvdGVkIFN0cmluZyAqLworCQkJCXl5bHZhbC0+c3RyW3l5bGVuZy0yXT0nXDAnOworCQkJCXJldHVybiBpU1RSSU5HOworCQkJfQorCisKK1tbOmRpZ2l0Ol1dKwkJeyAJLyogRGlnaXRhbCBudW1iZXIgKi8KKwkJCQl5eWx2YWwtPnZhbCA9IGF0b2koeXl0ZXh0KTsKKwkJCQlyZXR1cm4gTlVNOyAvKiBOdW1lcmljIHZhbHVlICovIAorCQkJfQorCisoP2k6IkxvYWRfUGx1Z2luIikJeworCQkJCXJldHVybiBFQVBNRVRIT0Q7CisJCQl9CisKKyg/aToiQXV0aG9yaXphdGlvbiIpCQl7IAorCQkJCXJldHVybiBBVVRIT1JJWkU7CisJCQl9CisKKyg/aToiRGlhbUVBUF9NeVNRTCIpCQl7IAorCQkJCXJldHVybiBESUFNRUFQX01ZU1FMOworCQkJfQorCQkJCisoP2k6Ik1BWF9JbnZhbGlkX0VBUF9QYWNrZXRzIikJCXsKKwkJCQlyZXR1cm4gTUFYX0lOVkFMSURfRUFQX1BBQ0tFVDsKKwkJCX0KKworKD9pOiJNdWx0aV9Sb3VuZF9UaW1lX091dCIpCQl7CisJCQkJcmV0dXJuIE1VTFRJX1JPVU5EX1RJTUVPVVQ7CisJCQl9CisKKyg/aToiQ2hlY2tfdXNlcl9pZGVudGl0eSIpCQl7CisJCQkJcmV0dXJuIENIRUNLX1VTRVJfSURFTlRJVFk7CisJCQl9CisKKyI9InwiOyJ8IjoifCIsIgkJewkKKwkJCQlyZXR1cm4geXl0ZXh0WzBdOyAKKwkJCX0KKworCS8qIFVucmVjb2duaXplZCB0b2tlbiBvciB0ZXh0ICovCisJCis8Kj5bWzphbG51bTpdXSsJIHwJCQkJCSAKKzwqPi4JeyAKKwkJCQlmcHJpbnRmKHN0ZGVyciwiVW5yZWNvZ25pemVkIGlucHV0IHRleHQgJyVzJyggb24gbGluZSAlaSBjb2x1bW4gJWkgKVxuIiwgeXl0ZXh0LCB5eWxsb2MtPmZpcnN0X2xpbmUsIHl5bGxvYy0+Zmlyc3RfY29sdW1uKTsgCisJCQkgCXJldHVybiBMRVhfRVJST1I7IAorCQkJfQorCislJQorLyogUm91dGluZXMgKi8KKworCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2FwcF9kaWFtZWFwL2RpYW1lYXAuc3FsIGIvZXh0ZW5zaW9ucy9hcHBfZGlhbWVhcC9kaWFtZWFwLnNxbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDBhMzYyCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9hcHBfZGlhbWVhcC9kaWFtZWFwLnNxbApAQCAtMCwwICsxLDgyIEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCWRpYW1lYXAuc3FsCQkJCQkJCSMKKyMJCQlEaWFtRUFQIGV4dGVuc2lvbgkJCQkjCisjICAJCSBVc2VycyBJbmZvcm1hdGlvbiBEYXRhYmFzZSBzY2hlbWEgICAgICAgICAgIAkJIworIyAgCQkJCQkJCQkJIworIyAgCQkJCQkJCQkJIworIwkJCQkJCQkJCSMKKyMgTXlTUUwgY29tbWFuZCB0byBsb2FkIHRoZSBzY3JpcHQ6CQkJCQkjCisjICAgIG15c3FsPiBteXNxbCAtdSB1c2VybmFtZSAtcCBwYXNzd29yZCBkaWFtZWFwX3VpIDwJZGlhbWVhcC5zcWwJIworIwkJCQkJCQkJCSMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0KKy0tIFRhYmxlIHN0cnVjdHVyZSBmb3IgdGFibGUgYGF1dGhlYAorLS0KKworQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgYGF1dGhlYCAoCisgIGBpZGAgaW50KDExKSBOT1QgTlVMTCBBVVRPX0lOQ1JFTUVOVCwKKyAgYGdycGAgaW50KDExKSBOT1QgTlVMTCwKKyAgYGF0dHJpYnV0ZWAgc2V0KCdBdXRob3JpemF0aW9uLUxpZmV0aW1lJywnQXV0aC1HcmFjZS1QZXJpb2QnLCdBdXRoLVNlc3Npb24tU3RhdGUnLCdSZS1BdXRoLVJlcXVlc3QtVHlwZScsJ1Nlc3Npb24tVGltZW91dCcsJ011bHRpLVJvdW5kLVRpbWUtT3V0JywnQWNjdC1JbnRlcmltLUludGVydmFsJykgTk9UIE5VTEwgREVGQVVMVCAnQXV0aG9yaXphdGlvbi1MaWZldGltZScsCisgIGB2YWx1ZWAgY2hhcigyNTUpIE5PVCBOVUxMLAorICBQUklNQVJZIEtFWSAoYGlkYCkKKyk7CisKKy0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tCistLSBUYWJsZSBzdHJ1Y3R1cmUgZm9yIHRhYmxlIGBhdXRoemAKKy0tCisKK0NSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIGBhdXRoemAgKAorICBgaWRgIGludCgxMSkgTk9UIE5VTEwgQVVUT19JTkNSRU1FTlQsCisgIGBncnBgIGludCgxMSkgTk9UIE5VTEwsCisgIGBhdHRyaWJ1dGVgIHNldCgnTkFTLUlQdjYtQWRkcmVzcycsJ05BUy1JZGVudGlmaWVyJywnTkFTLUlQLUFkZHJlc3MnLCdOQVMtUG9ydCcsJ05BUy1Qb3J0LUlkJywnTkFTLVBvcnQtVHlwZScsJ0NhbGxlZC1TdGF0aW9uLUlkJywnQ2FsbGluZy1TdGF0aW9uLUlkJywnQ29ubmVjdC1JbmZvJywnT3JpZ2luYXRpbmctTGluZS1JbmZvJywnU2VydmljZS1UeXBlJywnQ2FsbGJhY2stTnVtYmVyJywnQ2FsbGJhY2stSWQnLCdJZGxlLVRpbWVvdXQnLCdQb3J0LUxpbWl0JywnTkFTLUZpbHRlci1SdWxlJywnRmlsdGVyLUlkJywnQ29uZmlndXJhdGlvbi1Ub2tlbicsJ1FvUy1GaWx0ZXItUnVsZScsJ0ZyYW1lZC1Qcm90b2NvbCcsJ0ZyYW1lZC1Sb3V0aW5nJywnRnJhbWVkLU1UVScsJ0ZyYW1lZC1Db21wcmVzc2lvbicsJ0ZyYW1lZC1JUC1BZGRyZXNzJywnRnJhbWVkLUlQLU5ldG1hc2snLCdGcmFtZWQtUm91dGUnLCdGcmFtZWQtUG9vbCcsJ0ZyYW1lZC1JbnRlcmZhY2UtSWQnLCdGcmFtZWQtSVB2Ni1QcmVmaXgnLCdGcmFtZWQtSVB2Ni1Qb29sJywnRnJhbWVkLUlQdjYtUm91dGUnLCdGcmFtZWQtSVBYLU5ldHdvcmsnLCdGcmFtZWQtQXBwbGV0YWxrLUxpbmsnLCdGcmFtZWQtQXBwbGV0YWxrLU5ldHdvcmsnLCdGcmFtZWQtQXBwbGV0YWxrLVpvbmUnKSBOT1QgTlVMTCBERUZBVUxUICdTZXJ2aWNlLVR5cGUnLAorICBgb3BgIHNldCgnPT0nLCc+JywnPj0nLCc8JywnPD0nLCchPScsJ349JywnPSsnLCcrPT0nLCcrPicsJys+PScsJys8JywnKzw9JywnKyE9JywnK349JywnPT0rJywnPisnLCc+PSsnLCc8KycsJzw9KycsJyE9KycpIE5PVCBOVUxMIERFRkFVTFQgJz09JywKKyAgYHZhbHVlYCBjaGFyKDI1NSkgTk9UIE5VTEwsCisgIFBSSU1BUlkgS0VZIChgaWRgKQorKTsKKworLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0KKy0tIFRhYmxlIHN0cnVjdHVyZSBmb3IgdGFibGUgYGdycGAKKy0tCisKK0NSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIGBncnBgICgKKyAgYGlkYCBpbnQoMTEpIE5PVCBOVUxMIEFVVE9fSU5DUkVNRU5ULAorICBgZ3JwX25hbWVgIGNoYXIoMjU1KSBOT1QgTlVMTCwKKyAgYGFjdGl2ZWAgc2V0KCdZJywnTicpIE5PVCBOVUxMIERFRkFVTFQgJ1knLAorICBQUklNQVJZIEtFWSAoYGlkYCkKKyk7CisKKy0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tCistLSBUYWJsZSBzdHJ1Y3R1cmUgZm9yIHRhYmxlIGB1c2Vyc2AKKy0tCisKK0NSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIGB1c2Vyc2AgKAorICBgaWRgIGludCgxMSkgTk9UIE5VTEwgQVVUT19JTkNSRU1FTlQsCisgIGB1c2VybmFtZWAgdmFyY2hhcigyNTUpIENIQVJBQ1RFUiBTRVQgbGF0aW4xIENPTExBVEUgbGF0aW4xX2dlbmVyYWxfY2kgTk9UIE5VTEwsCisgIGBlYXBtZXRob2RgIHRpbnlpbnQoMykgdW5zaWduZWQgTk9UIE5VTEwgREVGQVVMVCAnMCcsCisgIGB2ZW5kb3JgIGludCgxMSkgTk9UIE5VTEwgREVGQVVMVCAnMCcsCisgIGBwYXNzd29yZGAgdmFyY2hhcigyNTUpIENIQVJBQ1RFUiBTRVQgbGF0aW4xIENPTExBVEUgbGF0aW4xX2dlbmVyYWxfY2kgTk9UIE5VTEwsCisgIGBhY3RpdmVgIGVudW0oJ1knLCdOJykgQ0hBUkFDVEVSIFNFVCBsYXRpbjEgQ09MTEFURSBsYXRpbjFfZ2VuZXJhbF9jaSBOT1QgTlVMTCBERUZBVUxUICdZJywKKyAgUFJJTUFSWSBLRVkgKGBpZGApCispOworCistLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLQorLS0gVGFibGUgc3RydWN0dXJlIGZvciB0YWJsZSBgdXNlcl9ncnBgCistLQorCitDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBgdXNlcl9ncnBgICgKKyAgYGlkYCBpbnQoMTEpIE5PVCBOVUxMIEFVVE9fSU5DUkVNRU5ULAorICBgdXNlcmAgaW50KDExKSBOT1QgTlVMTCwKKyAgYGdycGAgaW50KDExKSBOT1QgTlVMTCwKKyAgUFJJTUFSWSBLRVkgKGBpZGApCispOwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9hcHBfZGlhbWVhcC9kaWFtZWFwLnkgYi9leHRlbnNpb25zL2FwcF9kaWFtZWFwL2RpYW1lYXAueQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDNkNDA0Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9hcHBfZGlhbWVhcC9kaWFtZWFwLnkKQEAgLTAsMCArMSwxOTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKQorICogQXV0aG9yIDogU291aGVpbCBCZW4gQXllZCA8c291aGVpbEB0ZXJhLmljcy5rZWlvLmFjLmpwPgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOS0yMDEwLCBTb3VoZWlsIEJlbiBBeWVkLCBUZXJhb2thIExhYm9yYXRvcnkgb2YgS2VpbyBVbml2ZXJzaXR5LCBhbmQgdGhlIFdJREUgUHJvamVjdAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgU291aGVpbCBCZW4gQXllZCA8c291aGVpbEB0ZXJhLmljcy5rZWlvLmFjLmpwPi4KKyAqCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNvdWhlaWwgQmVuIEF5ZWQsIFRlcmFva2EgTGFib3JhdG9yeSBvZiBLZWlvIFVuaXZlcnNpdHkgb3IgdGhlIFdJREUgUHJvamVjdCBub3IgdGhlCisgKiAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAnJ0FTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworJXsKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImRpYW1lYXBfY29tbW9uLmgiCisjaW5jbHVkZSAiZGlhbWVhcC50YWIuaCIKKwordm9pZCB5eWVycm9yIChZWUxUWVBFICpsbG9jcCwgc3RydWN0IGRpYW1lYXBfY29uZiAqIGNvbmZpZywgY29uc3QgY2hhciAqcyk7CisKK2V4dGVybiBpbnQgeXl3cmFwKCk7CitleHRlcm4gaW50IHl5bGV4KCk7CisKKworLyogVGhlIExleCBwYXJzZXIgcHJvdG90eXBlICovCitpbnQgZGlhbWVhcGxleChZWVNUWVBFICpsdmFscCwgWVlMVFlQRSAqbGxvY3ApOworCisKKyV9CisKKyVsb2NhdGlvbnMKKyVwYXJzZS1wYXJhbSB7c3RydWN0IGRpYW1lYXBfY29uZiAqIGNvbmZpZ30gCislcHVyZV9wYXJzZXIKKy8qJWRlZmluZXMgKi8KKyVlcnJvci12ZXJib3NlCislZGVidWcgCisKKyV1bmlvbiB7CisJY2hhciAqc3RyOworCWludCB2YWw7CisJY2hhciBieXRlOworfQorCisKKworLyogSW4gY2FzZSBvZiBlcnJvciBpbiB0aGUgbGV4aWNhbCBhbmFseXNpcyAqLworJXRva2VuIAkJTEVYX0VSUk9SCisKKyV0b2tlbiAJPHZhbD4JTlVNCisKKyV0b2tlbiAJPHN0cj4JaVNUUklORworCisldG9rZW4gIDxieXRlPglpQllURQorCisldG9rZW4gCQlFQVBNRVRIT0QKKyV0b2tlbiAJCUFVVEhPUklaRQorJXRva2VuIAkJTU9ERQorJXRva2VuIAkJRElBTUVBUF9NWVNRTAorJXRva2VuCQlNQVhfSU5WQUxJRF9FQVBfUEFDS0VUCisldG9rZW4JCU1VTFRJX1JPVU5EX1RJTUVPVVQKKyV0b2tlbgkJQ0hFQ0tfVVNFUl9JREVOVElUWQorCislJQkKKworY29uZnBhcmFtcyA6IAkvKiBlbXB0eSAqLworCQl8IGNvbmZwYXJhbXMgRUFQbWV0aG9kCisJCXwgY29uZnBhcmFtcyBBdXRob3JpemUKKwkJfCBjb25mcGFyYW1zIERpYW1FQVBfTXlTUUwKKwkJfCBjb25mcGFyYW1zIE1BWF9JbnZhbGlkX0VBUF9QYWNrZXQKKwkJfCBjb25mcGFyYW1zIE11bHRpX1JvdW5kX1RpbWVvdXQKKwkJfCBjb25mcGFyYW1zIENoZWNrX1VzZXJfSWRlbnRpdHkKKwkJfCBjb25mcGFyYW1zIGVycm9ycworCQl7CisJCQl5eWVycm9yKCZ5eWxsb2MsIGNvbmZpZywgIlVucmVjb2duaXplZCBjb25maWd1cmF0aW9uIHBhcmFtZXRlci4iKTsKKwkJCXJldHVybiBFSU5WQUw7CisJCX0KKwkJOworCitlcnJvcnMgOglMRVhfRVJST1IKKwkJfCBlcnJvcgorCQk7CisKKworRUFQbWV0aG9kIDoJRUFQTUVUSE9EICc9JyBpU1RSSU5HICc6JyBOVU0gJzonIE5VTSAnOicgaVNUUklORyAnOicgaVNUUklORyAnOycKKwkJeworCQljaGFyICogaW5maWxlLCAqY2ZpbGU7CisJCUZJTEUgKiBmbDsKKworCQlpbmZpbGUgPSAkOTsKKwkJZmwgPSBmb3BlbihpbmZpbGUsICJyIik7CisJCWlmICgoZmwgPT0gTlVMTCkgJiYgKCppbmZpbGUgIT0gJy8nKSkgeworCQkJY2hhciAqIHRtcGZpbGU9aW5maWxlOworCQkJQ0hFQ0tfTUFMTE9DX0RPKCBpbmZpbGUgPSBtYWxsb2MoIHN0cmxlbih0bXBmaWxlKSArIHN0cmxlbihERUZBVUxUX0VYVEVOU0lPTlNfUEFUSCkgKyAyICksCisJCQkJeyB5eWVycm9yICgmeXlsbG9jLCBjb25maWcsICJOb3QgZW5vdWdoIG1lbW9yeSIpOyBZWUVSUk9SOyB9ICk7CisJCQlzcHJpbnRmKGluZmlsZSwgREVGQVVMVF9FWFRFTlNJT05TX1BBVEggIi8lcyIsIHRtcGZpbGUpOworCQkJZnJlZSh0bXBmaWxlKTsKKwkJCWZsID0gZm9wZW4oaW5maWxlLCAiciIpOworCQl9CisJCWlmIChmbCA9PSBOVUxMKSB7CisJCQlpbnQgcmV0ID0gZXJybm87CisJCQlUUkFDRV9ERUJVRyhJTkZPLCAiVW5hYmxlIHRvIG9wZW4gJXMgcGx1Z2luIGZpbGUgJXMgZm9yIHJlYWRpbmc6ICVzIiwgJDMsIGluZmlsZSwgc3RyZXJyb3IocmV0KSk7CisJCQl5eWVycm9yICgmeXlsbG9jLCBjb25maWcsICJFcnJvciBhZGRpbmcgRUFQIFBsdWdpbiIpOyAKKwkJCVlZRVJST1I7CisJCX0KKwkJZmNsb3NlKGZsKTsKKwkJCisJCWNmaWxlID0gJDExOworCisJCWlmKHN0cmxlbihjZmlsZSk+MCl7CisJCQlmbCA9IGZvcGVuKGNmaWxlLCAiciIpOworCQkJaWYgKChmbCA9PSBOVUxMKSAmJiAoKmNmaWxlICE9ICcvJykpIHsKKwkJCQljaGFyICogdG1wID0gY2ZpbGU7CisJCQkJQ0hFQ0tfTUFMTE9DX0RPKCBjZmlsZSA9IG1hbGxvYyggc3RybGVuKHRtcCkgKyBzdHJsZW4oREVGQVVMVF9DT05GX1BBVEgpICsgMiApLAorCQkJCQl7IHl5ZXJyb3IgKCZ5eWxsb2MsIGNvbmZpZywgIk5vdCBlbm91Z2ggbWVtb3J5Iik7IFlZRVJST1I7IH0gKTsKKwkJCQlzcHJpbnRmKGNmaWxlLCBERUZBVUxUX0NPTkZfUEFUSCAiLyVzIiwgdG1wKTsKKwkJCQlmcmVlKHRtcCk7CisJCQkJZmwgPSBmb3BlbihjZmlsZSwgInIiKTsKKwkJCX0KKwkJCWlmIChmbCA9PSBOVUxMKSB7CisJCQkJCQorCQkJfQorCQkJaWYoZmwpCisJCQkJZmNsb3NlKGZsKTsKKwkJfQkJCisJCQorCQlkaWFtZWFwX3BsdWdpbl9hZGQoJDMsKGNoYXIpJDUsKGNoYXIpJDcsaW5maWxlLGNmaWxlKTsKKwkJfQorCQk7CisKK0F1dGhvcml6ZSA6CUFVVEhPUklaRSAnPScgTlVNICc7JworCQl7CisJCWlmKChpbnQpJDMpCisJCQljb25maWctPmF1dGhvcml6ZT0xOworCQl9CisJCTsKKwkJCQorCitEaWFtRUFQX015U1FMIDoJRElBTUVBUF9NWVNRTCAnPScgaVNUUklORyAnLCcgaVNUUklORyAnLCcgaVNUUklORyAnLCcgaVNUUklORyAnOycKKwkJeworCQlkaWFtZWFwX3NldF9teXNxbF9wYXJhbSgkMywkNSwkNywkOSk7CisJCX0KKwkJOworCitNQVhfSW52YWxpZF9FQVBfUGFja2V0IDogTUFYX0lOVkFMSURfRUFQX1BBQ0tFVCAnPScgTlVNICc7JworCQl7CisJCWNvbmZpZy0+bWF4X2ludmFsaWRfZWFwX3BhY2tldD0oaW50KSQzOworCQl9OworCitNdWx0aV9Sb3VuZF9UaW1lb3V0IDogTVVMVElfUk9VTkRfVElNRU9VVCAnPScgTlVNICc7JworCQl7CisJCWNvbmZpZy0+bXVsdGlfcm91bmRfdGltZV9vdXQ9KHVuc2lnbmVkIGludCkkMzsKKwkJfTsKKworQ2hlY2tfVXNlcl9JZGVudGl0eTogQ0hFQ0tfVVNFUl9JREVOVElUWSAnPScgTlVNICc7JworCQl7CisJCQlpZigoaW50KSQzKXsKKwkJCQljaGVja191c2VyX2lkZW50aXR5ID0gVFJVRTsKKwkJCX1lbHNleworCQkJCWNoZWNrX3VzZXJfaWRlbnRpdHkgPSBGQUxTRTsKKwkJCX0KKwkJfTsKKwkJCisJCislJQorCit2b2lkIHl5ZXJyb3IoWVlMVFlQRSAqbGxvY3AsIHN0cnVjdCBkaWFtZWFwX2NvbmYgKiBjb25maWcsY29uc3QgY2hhciAqc3RyKQoreworICAgICAgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluICVzICggb24gbGluZSAlaSBjb2x1bW4gJWkgLT4gbGluZSAlaSBjb2x1bW4gJWkpIDogJXNcbiIsY29uZmlnLT5jb25mZmlsZSwgbGxvY3AtPmZpcnN0X2xpbmUsIGxsb2NwLT5maXJzdF9jb2x1bW4sIGxsb2NwLT5sYXN0X2xpbmUsIGxsb2NwLT5sYXN0X2NvbHVtbiwgc3RyKTsKK30KZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvYXBwX2RpYW1lYXAvZGlhbWVhcF9jb21tb24uaCBiL2V4dGVuc2lvbnMvYXBwX2RpYW1lYXAvZGlhbWVhcF9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjgyMmM3Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9hcHBfZGlhbWVhcC9kaWFtZWFwX2NvbW1vbi5oCkBAIC0wLDAgKzEsMTI3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkKKyAqIEF1dGhvciA6IFNvdWhlaWwgQmVuIEF5ZWQgPHNvdWhlaWxAdGVyYS5pY3Mua2Vpby5hYy5qcD4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMCwgU291aGVpbCBCZW4gQXllZCwgVGVyYW9rYSBMYWJvcmF0b3J5IG9mIEtlaW8gVW5pdmVyc2l0eSwgYW5kIHRoZSBXSURFIFByb2plY3QKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IFNvdWhlaWwgQmVuIEF5ZWQgPHNvdWhlaWxAdGVyYS5pY3Mua2Vpby5hYy5qcD4uCisgKgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiBTb3VoZWlsIEJlbiBBeWVkLCBUZXJhb2thIExhYm9yYXRvcnkgb2YgS2VpbyBVbml2ZXJzaXR5IG9yIHRoZSBXSURFIFByb2plY3Qgbm9yIHRoZQorICogICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgJydBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgRElBTUVBUF9DT01NT05fSF8KKyNkZWZpbmUgRElBTUVBUF9DT01NT05fSF8KKworI2luY2x1ZGUgImxpYmRpYW1lYXAuaCIKKyNpbmNsdWRlICJsaWJjcnlwdC5oIgorI2luY2x1ZGUgImRpYW1lYXAuaCIKKyNpbmNsdWRlICJkaWFtZWFwX3BsdWdpbnMuaCIKKyNpbmNsdWRlICJkaWFtZWFwX2VhcC5oIgorI2luY2x1ZGUgImRpYW1lYXBfc2VydmVyLmgiCisjaW5jbHVkZSA8cmVnZXguaD4KKworCisKKy8qIERpY3Rpb25hcnkgT2JqZWN0IHRlbXBsYXRlcyAqLworZXh0ZXJuIHN0cnVjdCBkaWN0X29iamVjdCAqIGRhdGFvYmpfZGlhbWVhcF9jbWQ7IC8qIERpYW1ldGVyLUVBUC1SZXF1ZXN0IENvbW1hbmQgQ29kZSAqLworZXh0ZXJuIHN0cnVjdCBkaWN0X29iamVjdCAqIGRhdGFvYmpfZGlhbWVhcF9hcHA7IC8qIERpYW1ldGVyIEVBUCBBcHBsaWNhdGlvbiBvYmplY3QgKi8KK2V4dGVybiBzdHJ1Y3QgZGljdF9vYmplY3QgKiBkYXRhb2JqX2RpYW1lYXBfdmVuOyAvKiBEaWFtZXRlciBFQVAgQXBwbGljYXRpb24gVmVuZG9yIG9iamVjdCAqLworZXh0ZXJuIHN0cnVjdCBkaWN0X29iamVjdCAqIGRhdGFvYmpfYWNjb3VudGluZ19lYXBfYXV0aF9tZXRob2Q7CitleHRlcm4gc3RydWN0IGRpY3Rfb2JqZWN0ICogZGF0YW9ial9hY2N0X2ludGVyaW1faW50ZXJ2YWw7CitleHRlcm4gc3RydWN0IGRpY3Rfb2JqZWN0ICogZGF0YW9ial9hdXRoX2FwcGxpY2F0aW9uX2lkOworZXh0ZXJuIHN0cnVjdCBkaWN0X29iamVjdCAqIGRhdGFvYmpfYXV0aF9ncmFjZV9wZXJpb2Q7CitleHRlcm4gc3RydWN0IGRpY3Rfb2JqZWN0ICogZGF0YW9ial9hdXRoX3JlcXVlc3RfdHlwZTsKK2V4dGVybiBzdHJ1Y3QgZGljdF9vYmplY3QgKiBkYXRhb2JqX2F1dGhfc2Vzc2lvbl9zdGF0ZTsKK2V4dGVybiBzdHJ1Y3QgZGljdF9vYmplY3QgKiBkYXRhb2JqX2F1dGhvcml6YXRpb25fbGlmZXRpbWU7CitleHRlcm4gc3RydWN0IGRpY3Rfb2JqZWN0ICogZGF0YW9ial9jYWxsYmFja19pZDsKK2V4dGVybiBzdHJ1Y3QgZGljdF9vYmplY3QgKiBkYXRhb2JqX2NhbGxiYWNrX251bWJlcjsKK2V4dGVybiBzdHJ1Y3QgZGljdF9vYmplY3QgKiBkYXRhb2JqX2NhbGxlZF9zdGF0aW9uX2lkOworZXh0ZXJuIHN0cnVjdCBkaWN0X29iamVjdCAqIGRhdGFvYmpfY2FsbGluZ19zdGF0aW9uX2lkOworZXh0ZXJuIHN0cnVjdCBkaWN0X29iamVjdCAqIGRhdGFvYmpfY2xhc3M7CitleHRlcm4gc3RydWN0IGRpY3Rfb2JqZWN0ICogZGF0YW9ial9jb25maWd1cmF0aW9uX3Rva2VuOworZXh0ZXJuIHN0cnVjdCBkaWN0X29iamVjdCAqIGRhdGFvYmpfY29ubmVjdF9pbmZvOworZXh0ZXJuIHN0cnVjdCBkaWN0X29iamVjdCAqIGRhdGFvYmpfZGVzdGluYXRpb25faG9zdDsKK2V4dGVybiBzdHJ1Y3QgZGljdF9vYmplY3QgKiBkYXRhb2JqX2Rlc3RpbmF0aW9uX3JlYWxtOworZXh0ZXJuIHN0cnVjdCBkaWN0X29iamVjdCAqIGRhdGFvYmpfZWFwX21hc3Rlcl9zZXNzaW9uX2tleTsKK2V4dGVybiBzdHJ1Y3QgZGljdF9vYmplY3QgKiBkYXRhb2JqX2VhcF9rZXlfbmFtZTsKK2V4dGVybiBzdHJ1Y3QgZGljdF9vYmplY3QgKiBkYXRhb2JqX2VhcF9wYXlsb2FkOworZXh0ZXJuIHN0cnVjdCBkaWN0X29iamVjdCAqIGRhdGFvYmpfZWFwX3JlaXNzdWVkX3BheWxvYWQ7CitleHRlcm4gc3RydWN0IGRpY3Rfb2JqZWN0ICogZGF0YW9ial9lcnJvcl9tZXNzYWdlOworZXh0ZXJuIHN0cnVjdCBkaWN0X29iamVjdCAqIGRhdGFvYmpfZXJyb3JfcmVwb3J0aW5nX2hvc3Q7CitleHRlcm4gc3RydWN0IGRpY3Rfb2JqZWN0ICogZGF0YW9ial9mYWlsZWRfYXZwOworZXh0ZXJuIHN0cnVjdCBkaWN0X29iamVjdCAqIGRhdGFvYmpfZmlsdGVyX2lkOworZXh0ZXJuIHN0cnVjdCBkaWN0X29iamVjdCAqIGRhdGFvYmpfZnJhbWVkX2FwcGxldGFsa19saW5rOworZXh0ZXJuIHN0cnVjdCBkaWN0X29iamVjdCAqIGRhdGFvYmpfZnJhbWVkX2FwcGxldGFsa19uZXR3b3JrOworZXh0ZXJuIHN0cnVjdCBkaWN0X29iamVjdCAqIGRhdGFvYmpfZnJhbWVkX2FwcGxldGFsa196b25lOworZXh0ZXJuIHN0cnVjdCBkaWN0X29iamVjdCAqIGRhdGFvYmpfZnJhbWVkX2NvbXByZXNzaW9uOworZXh0ZXJuIHN0cnVjdCBkaWN0X29iamVjdCAqIGRhdGFvYmpfZnJhbWVkX2ludGVyZmFjZV9pZDsKK2V4dGVybiBzdHJ1Y3QgZGljdF9vYmplY3QgKiBkYXRhb2JqX2ZyYW1lZF9pcF9hZGRyZXNzOworZXh0ZXJuIHN0cnVjdCBkaWN0X29iamVjdCAqIGRhdGFvYmpfZnJhbWVkX2lwX25ldG1hc2s7CitleHRlcm4gc3RydWN0IGRpY3Rfb2JqZWN0ICogZGF0YW9ial9mcmFtZWRfaXB2Nl9wcmVmaXg7CitleHRlcm4gc3RydWN0IGRpY3Rfb2JqZWN0ICogZGF0YW9ial9mcmFtZWRfaXB2Nl9wb29sOworZXh0ZXJuIHN0cnVjdCBkaWN0X29iamVjdCAqIGRhdGFvYmpfZnJhbWVkX2lwdjZfcm91dGU7CitleHRlcm4gc3RydWN0IGRpY3Rfb2JqZWN0ICogZGF0YW9ial9mcmFtZWRfaXB4X25ldHdvcms7CitleHRlcm4gc3RydWN0IGRpY3Rfb2JqZWN0ICogZGF0YW9ial9mcmFtZWRfbXR1OworZXh0ZXJuIHN0cnVjdCBkaWN0X29iamVjdCAqIGRhdGFvYmpfZnJhbWVkX3Bvb2w7CitleHRlcm4gc3RydWN0IGRpY3Rfb2JqZWN0ICogZGF0YW9ial9mcmFtZWRfcHJvdG9jb2w7CitleHRlcm4gc3RydWN0IGRpY3Rfb2JqZWN0ICogZGF0YW9ial9mcmFtZWRfcm91dGU7CitleHRlcm4gc3RydWN0IGRpY3Rfb2JqZWN0ICogZGF0YW9ial9mcmFtZWRfcm91dGluZzsKK2V4dGVybiBzdHJ1Y3QgZGljdF9vYmplY3QgKiBkYXRhb2JqX2lkbGVfdGltZW91dDsKK2V4dGVybiBzdHJ1Y3QgZGljdF9vYmplY3QgKiBkYXRhb2JqX211bHRpX3JvdW5kX3RpbWVfb3V0OworZXh0ZXJuIHN0cnVjdCBkaWN0X29iamVjdCAqIGRhdGFvYmpfbmFzX2ZpbHRlcl9ydWxlOworZXh0ZXJuIHN0cnVjdCBkaWN0X29iamVjdCAqIGRhdGFvYmpfbmFzX2lkZW50aWZpZXI7CitleHRlcm4gc3RydWN0IGRpY3Rfb2JqZWN0ICogZGF0YW9ial9uYXNfaXBfYWRkcmVzczsKK2V4dGVybiBzdHJ1Y3QgZGljdF9vYmplY3QgKiBkYXRhb2JqX25hc19pcHY2X2FkZHJlc3M7CitleHRlcm4gc3RydWN0IGRpY3Rfb2JqZWN0ICogZGF0YW9ial9uYXNfcG9ydDsKK2V4dGVybiBzdHJ1Y3QgZGljdF9vYmplY3QgKiBkYXRhb2JqX25hc19wb3J0X2lkOworZXh0ZXJuIHN0cnVjdCBkaWN0X29iamVjdCAqIGRhdGFvYmpfbmFzX3BvcnRfdHlwZTsKK2V4dGVybiBzdHJ1Y3QgZGljdF9vYmplY3QgKiBkYXRhb2JqX29yaWdpbmF0aW5nX2xpbmVfaW5mbzsKK2V4dGVybiBzdHJ1Y3QgZGljdF9vYmplY3QgKiBkYXRhb2JqX29yaWdpbl9ob3N0OworZXh0ZXJuIHN0cnVjdCBkaWN0X29iamVjdCAqIGRhdGFvYmpfb3JpZ2luX3JlYWxtOworZXh0ZXJuIHN0cnVjdCBkaWN0X29iamVjdCAqIGRhdGFvYmpfb3JpZ2luX3N0YXRlX2lkOworZXh0ZXJuIHN0cnVjdCBkaWN0X29iamVjdCAqIGRhdGFvYmpfcG9ydF9saW1pdDsKK2V4dGVybiBzdHJ1Y3QgZGljdF9vYmplY3QgKiBkYXRhb2JqX3Byb3h5X2luZm87CitleHRlcm4gc3RydWN0IGRpY3Rfb2JqZWN0ICogZGF0YW9ial9xb3NfZmlsdGVyX3J1bGU7CitleHRlcm4gc3RydWN0IGRpY3Rfb2JqZWN0ICogZGF0YW9ial9yZV9hdXRoX3JlcXVlc3RfdHlwZTsKK2V4dGVybiBzdHJ1Y3QgZGljdF9vYmplY3QgKiBkYXRhb2JqX3JlZGlyZWN0X2hvc3Q7CitleHRlcm4gc3RydWN0IGRpY3Rfb2JqZWN0ICogZGF0YW9ial9yZWRpcmVjdF9ob3N0X3VzYWdlOworZXh0ZXJuIHN0cnVjdCBkaWN0X29iamVjdCAqIGRhdGFvYmpfcmVkaXJlY3RfbWF4X2NhY2hlX3RpbWU7CitleHRlcm4gc3RydWN0IGRpY3Rfb2JqZWN0ICogZGF0YW9ial9yZXBseV9tZXNzYWdlOworZXh0ZXJuIHN0cnVjdCBkaWN0X29iamVjdCAqIGRhdGFvYmpfcmVzdWx0X2NvZGU7CitleHRlcm4gc3RydWN0IGRpY3Rfb2JqZWN0ICogZGF0YW9ial9yb3V0ZV9yZWNvcmQ7CitleHRlcm4gc3RydWN0IGRpY3Rfb2JqZWN0ICogZGF0YW9ial9zZXJ2aWNlX3R5cGU7CitleHRlcm4gc3RydWN0IGRpY3Rfb2JqZWN0ICogZGF0YW9ial9zZXNzaW9uX2lkOworZXh0ZXJuIHN0cnVjdCBkaWN0X29iamVjdCAqIGRhdGFvYmpfc2Vzc2lvbl90aW1lb3V0OworZXh0ZXJuIHN0cnVjdCBkaWN0X29iamVjdCAqIGRhdGFvYmpfc3RhdGU7CitleHRlcm4gc3RydWN0IGRpY3Rfb2JqZWN0ICogZGF0YW9ial90dW5uZWxpbmc7CitleHRlcm4gc3RydWN0IGRpY3Rfb2JqZWN0ICogZGF0YW9ial91c2VyX25hbWU7CisKKworI2VuZGlmIC8qIERJQU1FQVBfQ09NTU9OX0hfICovCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2FwcF9kaWFtZWFwL2RpYW1lYXBfZGVmcy5oIGIvZXh0ZW5zaW9ucy9hcHBfZGlhbWVhcC9kaWFtZWFwX2RlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDk1ZTg2Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9hcHBfZGlhbWVhcC9kaWFtZWFwX2RlZnMuaApAQCAtMCwwICsxLDIyMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpCisgKiBBdXRob3IgOiBTb3VoZWlsIEJlbiBBeWVkIDxzb3VoZWlsQHRlcmEuaWNzLmtlaW8uYWMuanA+CisgKgorICogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTAsIFNvdWhlaWwgQmVuIEF5ZWQsIFRlcmFva2EgTGFib3JhdG9yeSBvZiBLZWlvIFVuaXZlcnNpdHksIGFuZCB0aGUgV0lERSBQcm9qZWN0CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBTb3VoZWlsIEJlbiBBeWVkIDxzb3VoZWlsQHRlcmEuaWNzLmtlaW8uYWMuanA+LgorICoKKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgU291aGVpbCBCZW4gQXllZCwgVGVyYW9rYSBMYWJvcmF0b3J5IG9mIEtlaW8gVW5pdmVyc2l0eSBvciB0aGUgV0lERSBQcm9qZWN0IG5vciB0aGUKKyAqICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICcnQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIERJQU1FQVBfREVGU19IXworI2RlZmluZSBESUFNRUFQX0RFRlNfSF8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCQlEYXRhIFR5cGUgRGVmaW5pdGlvbiAJCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBib29sZWFuIFR5cGUgKi8KK3R5cGVkZWYgZW51bQoreworCUZBTFNFID0gMCwgVFJVRSA9IDEKK30gYm9vbGVhbjsKKworLyogRXhhY3Qtd2lkdGggaW50ZWdlciB0eXBlcyAqLwordHlwZWRlZiBpbnQ4X3Qgczg7CQkvKiBzaWduZWQgY2hhciAqLwordHlwZWRlZiB1aW50OF90IHU4OwkJLyogdW5zaWduZWQgY2hhciAqLwordHlwZWRlZiBpbnQxNl90IHMxNjsJLyogc2lnbmVkIGludCAqLwordHlwZWRlZiB1aW50MTZfdCB1MTY7CS8qIHVuc2lnbmVkIGludCAqLwordHlwZWRlZiBpbnQzMl90IHMzMjsJLyogc2lnbmVkIGxvbmcgaW50ICovCit0eXBlZGVmIHVpbnQzMl90IHUzMjsJLyogdW5zaWduZWQgbG9uZyBpbnQgKi8KK3R5cGVkZWYgaW50NjRfdCBzNjQ7CS8qIHNpZ25lZCBsb25nIGxvbmcgaW50ICovCit0eXBlZGVmIHVpbnQ2NF90IHU2NDsJLyogdW5zaWduZWQgbG9uZyBsb25nIGludCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJCU1hY3JvcwkJCQkJCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBNYWNyb3MgZm9yIG1hbmlwdWxhdGluZyBkYXRhKi8KKworLyogUmV0cmlldmUgc2lnbmVkL3Vuc2lnbmVkIGV4YWN0LXdpZHRoIGludGVnZXIgdHlwZXMgKi8KKyNkZWZpbmUgRzgodikgKHU4KSAoKiAodikgKQorCisjZGVmaW5lIEcxNkJJR0UodikgKCAJKCAodTE2KSAoKiAodikgICApIDw8ICA4ICkgXiBcCisJCSAgICAgIAkoICh1MTYpICgqKCh2KSsxKSkgICAgICAgKSApCisjZGVmaW5lIEcxNkxJVEUodikgKAkoICh1MTYpICgqKCh2KSsxKSkgPDwgIDggKSBeIFwKKwkJICAgICAgCSggKHUxNikgKCogKHYpICAgKSAgICAgICApICkKKworI2RlZmluZSBHMjRCSUdFKHYpICgJKCAodTMyKSAoKiAodikgICApIDw8IDE2ICkgXiBcCisJCQkoICh1MzIpICgqKCh2KSsxKSkgPDwgIDggKSBeIFwKKwkJCSggKHUzMikgKCooKHYpKzIpKSAgICAgICApICkKKyNkZWZpbmUgRzI0TElURSh2KSAoIAkoICh1MzIpICgqKCh2KSsyKSkgPDwgMTYgKSBeIFwKKwkJCSggKHUzMikgKCooKHYpKzEpKSA8PCAgOCApIF4gXAorCQkJKCAodTMyKSAoKiAodikgICApICAgICAgICkgKQorCisjZGVmaW5lIEczMkJJR0UodikgKCAJKCAodTMyKSAoKiAodikgICApIDw8IDI0ICkgXiBcCisJCQkoICh1MzIpICgqKCh2KSsxKSkgPDwgMTYgKSBeIFwKKwkJCSggKHUzMikgKCooKHYpKzIpKSA8PCAgOCApIF4gXAorCQkJKCAodTMyKSAoKigodikrMykpICAgICAgICkgKQorI2RlZmluZSBHMzJMSVRFKHYpICgJKCAodTMyKSAoKigodikrMykpIDw8IDI0ICkgXiBcCisJCQkoICh1MzIpICgqKCh2KSsyKSkgPDwgMTYgKSBeIFwKKwkJCSggKHUzMikgKCooKHYpKzEpKSA8PCAgOCApIF4gXAorCQkJKCAodTMyKSAoKiAodikgICApICAgICAgICkgKQorCisjZGVmaW5lIEc2NEJJR0UodikgKCAJKCAodTY0KSAoKiAodikgICApIDw8IDU2ICkgXiBcCisJCQkoICh1NjQpICgqKCh2KSsxKSkgPDwgNDggKSBeIFwKKwkJCSggKHU2NCkgKCooKHYpKzIpKSA8PCA0MCApIF4gXAorCQkJKCAodTY0KSAoKigodikrMykpIDw8IDMyICkgXiBcCisJCQkoICh1NjQpICgqKCh2KSs0KSkgPDwgMjQgKSBeIFwKKwkJCSggKHU2NCkgKCooKHYpKzUpKSA8PCAxNiApIF4gXAorCQkJKCAodTY0KSAoKigodikrNikpIDw8ICA4ICkgXiBcCisJCQkoICh1NjQpICgqKCh2KSs3KSkgICAgICAgKSApCisjZGVmaW5lIEc2NExJVEUodikgKAkoICh1NjQpICgqKCh2KSs3KSkgPDwgNTYgKSBeIFwKKwkJCSggKHU2NCkgKCooKHYpKzYpKSA8PCA0OCApIF4gXAorCQkJKCAodTY0KSAoKigodikrNSkpIDw8IDQwICkgXiBcCisJCQkoICh1NjQpICgqKCh2KSs0KSkgPDwgMzIgKSBeIFwKKwkJCSggKHU2NCkgKCooKHYpKzMpKSA8PCAyNCApIF4gXAorCQkJKCAodTY0KSAoKigodikrMikpIDw8IDE2ICkgXiBcCisJCQkoICh1NjQpICgqKCh2KSsxKSkgPDwgIDggKSBeIFwKKwkJCSggKHU2NCkgKCogKHYpICAgKSAgICAgICApICkKKworLyogSW5zZXJ0IHNpZ25lZC91bnNpZ25lZCBleGFjdC13aWR0aCBpbnRlZ2VyIHR5cGVzICovCisvKiB2IDogcG9pbnRlciB3aGVyZSB0byBpbnNlcnQgdGhlIGRhdGEKKyAqIGIgOiBwb2ludGVyIG9mIGRhdGEgdG8gYmUgaW5zZXJ0ZWQKKyAqLworLyogSW5zZXJ0aW9uIGZvcm1hdAorICogQklHRSA6IEJJRyBFTkRJQU4KKyAqIExJVEUgOiBMSVRUTEUgRU5ESUFOCisgKi8KKworI2RlZmluZSBQOCh2LGIpIGRvIHsgXAorCQl1OCB4ID0gKGIpOyBcCisJCXU4ICpkID0gKHYpOyBcCisJCWRbMF0gPSAoeCYweGZmVSk7IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIFAxNkJJR0UodixiKSBkbyB7IFwKKwkJdTE2IHggPSAoYik7IFwKKwkJdTggKmQgPSAodik7IFwKKwkJZFswXSA9ICgoeCA+PiA4KSYweGZmVSk7IFwKKwkJZFsxXSA9ICh4JjB4ZmZVKTsgXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgUDE2TElURSh2LGIpIGRvIHsgXAorCQl1MTYgeCA9IChiKTsgXAorCQl1OCAqZCA9ICh2KTsgXAorCQlkWzBdID0gKHgmMHhmZlUpOyBcCisJCWRbMV0gPSAoKHggPj4gOCkmMHhmZlUpOyBcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBQMjRCSUdFKHYsIGIpICBkbyB7IFwKKwkJdTMyIHggPSAoYik7IFwKKwkJdTggKmQgPSAodik7IFwKKwkJZFswXSA9ICgoeCA+PiAxNikmMHhmZlUpOyBcCisJCWRbMV0gPSAoKHggPj4gOCkmMHhmZlUpOyBcCisJCWRbMl0gPSAoKHgpJjB4ZmZVKTsgXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgUDI0TElURSh2LCBiKSAgZG8geyBcCisJCXUzMiB4ID0gKGIpOyBcCisJCXU4ICpkID0gKHYpOyBcCisJCWRbMF0gPSAoKHgpJjB4ZmZVKTsgXAorCQlkWzFdID0gKCh4ID4+IDgpJjB4ZmZVKTsgXAorCQlkWzJdID0gKCh4ID4+IDE2KSYweGZmVSk7IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIFAzMkJJR0UodiwgYikgIGRvIHsgXAorCQl1MzIgeCA9IChiKTsgXAorCQl1OCAqZCA9ICh2KTsgXAorCQlkWzBdID0gKCh4ID4+IDI0KSYweGZmVSk7IFwKKwkJZFsxXSA9ICgoeCA+PiAxNikmMHhmZlUpOyBcCisJCWRbMl0gPSAoKHggPj4gOCkmMHhmZlUpOyBcCisJCWRbM10gPSAoKHgpJjB4ZmZVKTsgXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgUDMyTElURSh2LCBiKSAgZG8geyBcCisJCXUzMiB4ID0gKGIpOyBcCisJCXU4ICpkID0gKHYpOyBcCisJCWRbMF0gPSAoKHgpJjB4ZmZVKTsgXAorCQlkWzFdID0gKCh4ID4+IDgpJjB4ZmZVKTsgXAorCQlkWzJdID0gKCh4ID4+IDE2KSYweGZmVSk7IFwKKwkJZFszXSA9ICgoeCA+PiAyNCkmMHhmZlUpOyBcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBQNjRCSUdFKHYsIGIpIGRvIHsgXAorCQl1NjQgeCA9IChiKTsgXAorCQl1OCAqZCA9ICh2KTsgXAorCQlkWzBdID0gKCh4ID4+IDU2KSYweGZmVSk7IFwKKwkJZFsxXSA9ICgoeCA+PiA0OCkmMHhmZlUpOyBcCisJCWRbMl0gPSAoKHggPj4gNDApJjB4ZmZVKTsgXAorCQlkWzNdID0gKCh4ID4+IDMyKSYweGZmVSk7IFwKKwkJZFs0XSA9ICgoeCA+PiAyNCkmMHhmZlUpOyBcCisJCWRbNV0gPSAoKHggPj4gMTYpJjB4ZmZVKTsgXAorCQlkWzZdID0gKCh4ID4+IDgpJjB4ZmZVKTsgXAorCQlkWzddID0gKCh4KSYweGZmVSk7IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIFA2NExJVEUodiwgYikgZG8geyBcCisJCXU2NCB4ID0gKGIpOyBcCisJCXU4ICpkID0gKHYpOyBcCisJCWRbMF0gPSAoKHgpJjB4ZmZVKTsgXAorCQlkWzFdID0gKCh4ID4+IDgpJjB4ZmZVKTsgXAorCQlkWzJdID0gKCh4ID4+IDE2KSYweGZmVSk7IFwKKwkJZFszXSA9ICgoeCA+PiAyNCkmMHhmZlUpOyBcCisJCWRbNF0gPSAoKHggPj4gMzIpJjB4ZmZVKTsgXAorCQlkWzVdID0gKCh4ID4+IDQwKSYweGZmVSk7IFwKKwkJZFs2XSA9ICgoeCA+PiA0OCkmMHhmZlUpOyBcCisJCWRbN10gPSAoKHggPj4gNTYpJjB4ZmZVKTsgXAorCX0gd2hpbGUgKDApCisKKy8qCisgKiBJbnNlcnQgZGF0YSBpbiBhIHNwZWNpZmllZCBwb3NpdGlvbgorICogYSA6ICh1OCopIHBvaW50ZXIgd2hlcmUgdG8gaW5zZXJ0IHRoZSBkYXRhCisgKiBmIDogKGludCkgaW5zZXJ0IGZyb20gdGhpcyBwb3NpdGlvbgorICogbCA6IChpbnQpIGxlbmd0aCBvZiB0aGUgZGF0YSBpbiBieXRlIHRvIGluc2VydAorICogYiA6ICh1OCopIHBvaW50ZXIgb2YgZGF0YSB0byBiZSBpbnNlcnRlZAorICovCisKKyNkZWZpbmUgVThDT1BZKGEsZixsLGIpIGRveyBcCisJCQl1OCAqIHggPSAoYSk7IFwKKwkJCXU4ICogeSA9IChiKTsgXAorCQkJaW50IGk7IFwKKwkJCWZvcihpPTA7aTxsO2krKykgXAorCQkJeFtpK2ZdPSB5W2ldOyBcCisJCX0gd2hpbGUgKDApCisKKworI2VuZGlmIC8qRElBTUVBUF9ERUZTX0hfKi8KZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvYXBwX2RpYW1lYXAvZGlhbWVhcF9lYXAuYyBiL2V4dGVuc2lvbnMvYXBwX2RpYW1lYXAvZGlhbWVhcF9lYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Mjg4NWVhCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9hcHBfZGlhbWVhcC9kaWFtZWFwX2VhcC5jCkBAIC0wLDAgKzEsNjA0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkKKyAqIEF1dGhvciA6IFNvdWhlaWwgQmVuIEF5ZWQgPHNvdWhlaWxAdGVyYS5pY3Mua2Vpby5hYy5qcD4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMCwgU291aGVpbCBCZW4gQXllZCwgVGVyYW9rYSBMYWJvcmF0b3J5IG9mIEtlaW8gVW5pdmVyc2l0eSwgYW5kIHRoZSBXSURFIFByb2plY3QKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IFNvdWhlaWwgQmVuIEF5ZWQgPHNvdWhlaWxAdGVyYS5pY3Mua2Vpby5hYy5qcD4uCisgKgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiBTb3VoZWlsIEJlbiBBeWVkLCBUZXJhb2thIExhYm9yYXRvcnkgb2YgS2VpbyBVbml2ZXJzaXR5IG9yIHRoZSBXSURFIFByb2plY3Qgbm9yIHRoZQorICogICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgJydBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiZGlhbWVhcF9jb21tb24uaCIKKworc3RhdGljIHZvaWQgZGlhbWVhcF9iYV9uZXh0aWQoc3RydWN0IGVhcF9zdGF0ZV9tYWNoaW5lICogc20sIGludCAqIGlkKQoreworCVRSQUNFX0VOVFJZKCIlcCAlcCIsc20saWQpOworCisJaWYgKHNtLT5jdXJyZW50SWQgPCAwKQorCXsKKwkJKmlkID0gKHU4KSAoMjU1ICogcmFuZCgpIC8gUkFORF9NQVgpICYgMHhGRlU7CisJfQorCWVsc2UKKwl7CisJCSppZCA9IChzbS0+Y3VycmVudElkKyspICYgMHhGRlU7CisJfQorCWlmICgqaWQgPT0gc20tPmxhc3RJZCkKKwl7CisJCSppZD0qaWQrMTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRpYW1lYXBfYmFfcG9saWN5dXBkYXRlKHN0cnVjdCBlYXBfc3RhdGVfbWFjaGluZSAqIGVhcF9zbSwKKwkJc3RydWN0IGVhcF9wYWNrZXQgKmVhcFBhY2tldCkKK3sKKwlUUkFDRV9FTlRSWSgiJXAgJXAiLGVhcF9zbSwgZWFwUGFja2V0KTsKKwlpZiAoKGVhcF9zbS0+cmVzcE1ldGhvZCA9PSBUWVBFX05BSykpCisJeworCQlpbnQgaWQ7CisJCWVhcF9zbS0+dXNlci5wbWV0aG9kcyA9IDA7CisJCXUzMiB2ZW5kb3I7CisJCWVhcF90eXBlIHR5cGU7CisJCXU4ICpkYXRhID0gKHU4ICopIGVhcFBhY2tldC0+ZGF0YTsKKwkJZGF0YSArPSA1OworCQlpZCA9IDU7CisJCXdoaWxlIChpZCA8IGVhcFBhY2tldC0+bGVuZ3RoKQorCQl7CisJCQl2ZW5kb3IgPSBWRU5ET1JfSUVURjsKKwkJCXR5cGUgPSBHOChkYXRhKTsKKwkJCWlmIChkaWFtZWFwX3BsdWdpbl9leGlzdCh2ZW5kb3IsIHR5cGUpID09IFRSVUUpCisJCQl7CisJCQkJZWFwX3NtLT51c2VyLnByb3Bvc2VkbWV0aG9kc1tpZCAtIDVdLm1ldGhvZCA9IHR5cGU7CisJCQkJZWFwX3NtLT51c2VyLnByb3Bvc2VkbWV0aG9kc1tpZCAtIDVdLnZlbmRvciA9IHZlbmRvcjsKKwkJCQllYXBfc20tPnVzZXIucG1ldGhvZHMrKzsKKwkJCX0KKwkJCWRhdGErKzsKKwkJCWlkKys7CisJCX0KKwkJZWFwX3NtLT51c2VyLm1ldGhvZElkID0gLTE7CisJfQorfQorCitzdGF0aWMgaW50IGRpYW1lYXBfYmFfcG9saWN5Z2V0bmV4dG1ldGhvZChzdHJ1Y3QgZWFwX3N0YXRlX21hY2hpbmUgKiBlYXBfc20sCisJCWVhcF90eXBlICogZWFwdHlwZSwgdTMyICogdmVuZG9yKQoreworCVRSQUNFX0VOVFJZKCIlcCAlcCAlcCIsZWFwX3NtLGVhcHR5cGUsdmVuZG9yKTsKKwkqdmVuZG9yID0gMDsKKwkqZWFwdHlwZSA9IFRZUEVfTk9ORTsKKwlpZiAoZWFwX3NtID09IE5VTEwpCisJeworCQlyZXR1cm4gRUlOVkFMOworCX0KKworCWVhcF9zbS0+c2VsZWN0ZWRNZXRob2QgPSBOVUxMOworCisJaWYgKGVhcF9zbS0+dXNlci51c2VyaWQgPT0gTlVMTCkKKwl7CisJCWlmICgoZWFwX3NtLT5jdXJyZW50TWV0aG9kID09IFRZUEVfTk9ORSkpCisJCXsKKwkJCSp2ZW5kb3IgPSBWRU5ET1JfSUVURjsKKwkJCSplYXB0eXBlID0gVFlQRV9JREVOVElUWTsKKwkJCWlmIChlYXBfc20tPnNlbGVjdGVkTWV0aG9kICE9IE5VTEwpCisJCQl7CisJCQkJKCplYXBfc20tPnNlbGVjdGVkTWV0aG9kLT5lYXBfbWV0aG9kX2ZyZWUpKGVhcF9zbS0+bWV0aG9kRGF0YSk7CisJCQkJZWFwX3NtLT5tZXRob2REYXRhID0gTlVMTDsKKwkJCX0KKwkJCUNIRUNLX0ZDVChkaWFtZWFwX3BsdWdpbl9nZXQoVkVORE9SX0lFVEYsVFlQRV9JREVOVElUWSwmZWFwX3NtLT5zZWxlY3RlZE1ldGhvZCkpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQllYXBfc20tPnNlbGVjdGVkTWV0aG9kID0gTlVMTDsKKwkJKnZlbmRvciA9IDA7CisJCSplYXB0eXBlID0gVFlQRV9OT05FOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZWFwX3NtLT51c2VyLm1ldGhvZElkID09IC0xKQorCXsKKwkJaWYgKGVhcF9zbS0+dXNlci5wcm9wb3NlZF9lYXBfbWV0aG9kID49IFRZUEVfRUFQX01ENSkKKwkJeworCQkJKnZlbmRvciA9IGVhcF9zbS0+dXNlci5wcm9wb3NlZF9lYXBfbWV0aG9kX3ZlbmRvcjsKKwkJCWlmICgqdmVuZG9yID09IFZFTkRPUl9JRVRGKQorCQkJeworCQkJCSplYXB0eXBlID0gZWFwX3NtLT51c2VyLnByb3Bvc2VkX2VhcF9tZXRob2Q7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJKmVhcHR5cGUgPSBUWVBFX0VYUEFOREVEX1RZUEVTOworCQkJfQorCQkJaWYgKGVhcF9zbS0+c2VsZWN0ZWRNZXRob2QgIT0gTlVMTCkKKwkJCXsKKwkJCQkoKmVhcF9zbS0+c2VsZWN0ZWRNZXRob2QtPmVhcF9tZXRob2RfZnJlZSkoZWFwX3NtLT5tZXRob2REYXRhKTsKKwkJCQllYXBfc20tPm1ldGhvZERhdGEgPSBOVUxMOworCQkJfQorCQkJQ0hFQ0tfRkNUX0RPKGRpYW1lYXBfcGx1Z2luX2dldCgqdmVuZG9yLCplYXB0eXBlLCZlYXBfc20tPnNlbGVjdGVkTWV0aG9kKSwKKwkJCQkJewlUUkFDRV9ERUJVRyhJTkZPLCIlcyBbRUFQIFByb3RvY29sXSBJbnZhbGlkIEVBUC1UWVBFICVkICh2ZW5kb3IgJWQpIixESUFNRUFQX0VYVEVOU0lPTiwqZWFwdHlwZSwqdmVuZG9yKTtyZXR1cm4gMTt9KTsKKworCQl9CisJCWVhcF9zbS0+dXNlci5wcm9wb3NlZF9lYXBfbWV0aG9kID0gVFlQRV9OT05FOworCX0KKwllbHNlCisJeworCQkqdmVuZG9yID0gZWFwX3NtLT51c2VyLnByb3Bvc2VkbWV0aG9kc1tlYXBfc20tPnVzZXIubWV0aG9kSWRdLnZlbmRvcjsKKwkJaWYgKGVhcF9zbS0+dXNlci5wcm9wb3NlZG1ldGhvZHNbZWFwX3NtLT51c2VyLm1ldGhvZElkXS52ZW5kb3IKKwkJCQk9PSBWRU5ET1JfSUVURikKKwkJeworCQkJKmVhcHR5cGUKKwkJCQkJPSBlYXBfc20tPnVzZXIucHJvcG9zZWRtZXRob2RzW2VhcF9zbS0+dXNlci5tZXRob2RJZF0ubWV0aG9kOworCQl9CisJCWVsc2UKKwkJeworCQkJKmVhcHR5cGUgPSBUWVBFX0VYUEFOREVEX1RZUEVTOworCQl9CisJCWlmIChlYXBfc20tPnNlbGVjdGVkTWV0aG9kICE9IE5VTEwpCisJCXsKKwkJCSgqZWFwX3NtLT5zZWxlY3RlZE1ldGhvZC0+ZWFwX21ldGhvZF9mcmVlKShlYXBfc20tPm1ldGhvZERhdGEpOworCQkJZWFwX3NtLT5tZXRob2REYXRhPU5VTEw7CisJCX0KKwkJQ0hFQ0tfRkNUKGRpYW1lYXBfcGx1Z2luX2dldChlYXBfc20tPnVzZXIucHJvcG9zZWRtZXRob2RzW2VhcF9zbS0+dXNlci5tZXRob2RJZF0udmVuZG9yLGVhcF9zbS0+dXNlci5wcm9wb3NlZG1ldGhvZHNbZWFwX3NtLT51c2VyLm1ldGhvZElkXS5tZXRob2QsJmVhcF9zbS0+c2VsZWN0ZWRNZXRob2QpKTsKKworCQllYXBfc20tPnVzZXIubWV0aG9kSWQrKzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkaWFtZWFwX2JhX3BvbGljeWdldGRlY2lzaW9uKHN0cnVjdCBlYXBfc3RhdGVfbWFjaGluZSAqIGVhcF9zbSwKKwkJc3RydWN0IGRpYW1lYXBfZWFwX2ludGVyZmFjZSAqIGVhcF9pLCBkZWNpc2lvbiAqIGdkZWNpc2lvbikKK3sKKwlUUkFDRV9FTlRSWSgiJXAgJXAgJXAiLGVhcF9zbSxlYXBfaSxnZGVjaXNpb24pOworCisJaWYgKGVhcF9zbS0+dXNlci51c2VyaWQgIT0gTlVMTCkKKwl7CisKKwkJaWYgKGVhcF9zbS0+bWV0aG9kU3RhdGUgPT0gRUFQX01fRU5EKQorCQl7CisKKwkJCWlmIChlYXBfc20tPnJlc3BNZXRob2QgPT0gVFlQRV9JREVOVElUWSkKKwkJCXsKKworCQkJCSpnZGVjaXNpb24gPSBERUNJU0lPTl9DT05USU5VRTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKworCQkJaWYgKChlYXBfc20tPnJlc3BNZXRob2QgPT0gVFlQRV9OQUspIHx8ICgoZWFwX3NtLT5yZXNwTWV0aG9kCisJCQkJCT09IFRZUEVfRVhQQU5ERURfVFlQRVMpICYmIChlYXBfc20tPnJlc3BWZW5kb3IKKwkJCQkJPT0gVkVORE9SX0lFVEYpICYmIChlYXBfc20tPnJlc3BWZW5kb3JNZXRob2QgPT0gVFlQRV9OQUspKSkKKwkJCXsKKwkJCQlnb3RvIFNlbGVjdE5leHRNZXRob2Q7CisJCQl9CisKKwkJCWlmIChlYXBfc20tPnVzZXIuc3VjY2VzcyA9PSBUUlVFKQorCQkJeworCisJCQkJKmdkZWNpc2lvbiA9IERFQ0lTSU9OX1NVQ0NFU1M7CisJCQl9CisJCQllbHNlCisJCQl7CisKKwkJCQkqZ2RlY2lzaW9uID0gREVDSVNJT05fRkFJTFVSRTsKKwkJCX0KKworCQl9CisJCWVsc2UKKwkJeworCQkJZ290byBTZWxlY3ROZXh0TWV0aG9kOworCQl9CisJCXJldHVybiAwOworCisJCVNlbGVjdE5leHRNZXRob2Q6IGlmICgoZWFwX3NtLT51c2VyLm1ldGhvZElkCisJCQkJPT0gKE1BWFBST1BPU0VETUVUSE9EUyAtIDEpKQorCQkJCXx8ICgoZWFwX3NtLT51c2VyLnByb3Bvc2VkbWV0aG9kc1tlYXBfc20tPnVzZXIubWV0aG9kSWQgKyAxXS5tZXRob2QKKwkJCQkJCT09IFRZUEVfTk9ORSkKKwkJCQkJCSYmIChlYXBfc20tPnVzZXIucHJvcG9zZWRtZXRob2RzW2VhcF9zbS0+dXNlci5tZXRob2RJZAorCQkJCQkJCQkrIDFdLnZlbmRvciA9PSBWRU5ET1JfSUVURikpKQorCQl7CisJCQlUUkFDRV9ERUJVRyhGVUxMKzEsCisJCQkJCSIlcyBbRUFQIHByb3RvY29sXSBOb25lIG9mIHByb3Bvc2VkIEVBUCBNZXRob2RzIGF1dGhlbnRpY2F0ZWQgdGhlIHVzZXIuKEZBSUxVUkUpIixESUFNRUFQX0VYVEVOU0lPTik7CisJCQkqZ2RlY2lzaW9uID0gREVDSVNJT05fRkFJTFVSRTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJZWFwX3NtLT51c2VyLm1ldGhvZElkID0gMDsKKwkJKmdkZWNpc2lvbiA9IERFQ0lTSU9OX0NPTlRJTlVFOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZWFwX3NtLT5jdXJyZW50TWV0aG9kID09IFRZUEVfSURFTlRJVFkpCisJeworCQkqZ2RlY2lzaW9uID0gREVDSVNJT05fRkFJTFVSRTsKKwkJcmV0dXJuIDA7CisJfQorCisJKmdkZWNpc2lvbiA9IERFQ0lTSU9OX0NPTlRJTlVFOworCXJldHVybiAwOworfQorCitzdGF0aWMgYm9vbGVhbiBkaWFtZWFwX2JhX3BvbGljeWRvcGlja3VwKGVhcF90eXBlIHR5cGUpCit7CisJVFJBQ0VfRU5UUlkoIiVkIix0eXBlKTsKKwlpZiAodHlwZSA9PSBUWVBFX0lERU5USVRZKQorCXsKKwkJcmV0dXJuIFRSVUU7CisJfQorCXJldHVybiBGQUxTRTsKK30KKworaW50IGRpYW1lYXBfZWFwX3N0YXRlbWFjaGluZShzdHJ1Y3QgZWFwX3N0YXRlX21hY2hpbmUgKiBlYXBfc20sCisJCXN0cnVjdCBkaWFtZWFwX2VhcF9pbnRlcmZhY2UgKiBlYXBfaSwgYm9vbGVhbiAqIG5vbl9mYXRhbF9lcnJvcikKK3sKKwlUUkFDRV9FTlRSWSgiJXAgJXAgJXAiLCBlYXBfc20sIGVhcF9pLCBub25fZmF0YWxfZXJyb3IpOworCWludCByZXQ7CisKKwlpZiAoKGVhcF9zbS0+ZWFwX3N0YXRlID09IEVBUF9JRExFKSAmJiAoZWFwX2ktPmFhYUVhcFJlc3AgPT0gVFJVRSkpCisJeworCQllYXBfc20tPmVhcF9zdGF0ZSA9IEVBUF9SRUNFSVZFRDsKKwl9CisJd2hpbGUgKCEoKGVhcF9zbS0+ZWFwX3N0YXRlID09IEVBUF9JRExFKSB8fCAoZWFwX3NtLT5lYXBfc3RhdGUgPT0gRUFQX0VORCkpKQorCXsKKwkJc3dpdGNoIChlYXBfc20tPmVhcF9zdGF0ZSkKKwkJeworCQljYXNlIEVBUF9JTklUSUFMSVpFOgorCQkJaWYgKGVhcF9zbS0+cnhSZXNwID09IFRSVUUpCisJCQl7CisJCQkJZWFwX3NtLT5sYXN0SWQgPSBlYXBfc20tPmN1cnJlbnRJZDsKKwkJCQllYXBfc20tPmN1cnJlbnRJZCA9IGVhcF9zbS0+cmVzcElkOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWVhcF9zbS0+bGFzdElkID0gLTE7CisJCQkJZWFwX3NtLT5jdXJyZW50SWQgPSAtMTsKKwkJCX0KKwkJCWlmIChlYXBfc20tPnJ4UmVzcCA9PSBGQUxTRSkKKwkJCXsKKwkJCQllYXBfc20tPmVhcF9zdGF0ZSA9IEVBUF9TRUxFQ1RfQUNUSU9OOworCQkJfQorCQkJZWxzZSBpZiAoKGVhcF9zbS0+cmVzcE1ldGhvZCA9PSBUWVBFX05BSykgfHwgKGVhcF9zbS0+cmVzcE1ldGhvZAorCQkJCQk9PSBUWVBFX0VYUEFOREVEX1RZUEVTICYmIGVhcF9zbS0+cmVzcFZlbmRvciA9PSBWRU5ET1JfSUVURgorCQkJCQkmJiBlYXBfc20tPnJlc3BWZW5kb3JNZXRob2QgPT0gVFlQRV9OQUspKQorCQkJeworCQkJCWVhcF9zbS0+ZWFwX3N0YXRlID0gRUFQX05BSzsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQllYXBfc20tPmVhcF9zdGF0ZSA9IEVBUF9QSUNLX1VQX01FVEhPRDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIEVBUF9QSUNLX1VQX01FVEhPRDoKKwkJCWlmIChkaWFtZWFwX2JhX3BvbGljeWRvcGlja3VwKGVhcF9zbS0+cmVzcE1ldGhvZCkgPT0gVFJVRSkKKwkJCXsKKwkJCQllYXBfc20tPmN1cnJlbnRNZXRob2QgPSBlYXBfc20tPnJlc3BNZXRob2Q7CisKKwkJCQlpZiAoZGlhbWVhcF9wbHVnaW5fZ2V0KGVhcF9zbS0+Y3VycmVudFZlbmRvciwKKwkJCQkJCWVhcF9zbS0+Y3VycmVudE1ldGhvZCwgJmVhcF9zbS0+c2VsZWN0ZWRNZXRob2QpKQorCQkJCXsKKwkJCQkJVFJBQ0VfREVCVUcoSU5GTywiJXNObyBFQVAgTWV0aG9kIHBsdWdpbiBhdmFpbGFibGUgZm9yIEVBUCBNZXRob2Qge1R5cGU9JWQsIFZlbmRvcj0lZH0uIixESUFNRUFQX0VYVEVOU0lPTixlYXBfc20tPmN1cnJlbnRNZXRob2QsIGVhcF9zbS0+Y3VycmVudFZlbmRvcik7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCVRSQUNFX0RFQlVHKEZVTEwsIiVzQ3VycmVudCBFQVAgTWV0aG9kIHtUeXBlPSVkLCBWZW5kb3I9JWR9IChFQVAgTWV0aG9kIHBsdWdpbiBzZWxlY3RlZCkuIixESUFNRUFQX0VYVEVOU0lPTixlYXBfc20tPmN1cnJlbnRNZXRob2QsIGVhcF9zbS0+Y3VycmVudFZlbmRvcik7CisJCQkJfQorCQkJCWVhcF9zbS0+Y3VycmVudFZlbmRvciA9IFZFTkRPUl9JRVRGOworCQkJCWlmIChlYXBfc20tPnNlbGVjdGVkTWV0aG9kICE9IE5VTEwpCisJCQkJeworCQkJCQlyZXQgPSAoKmVhcF9zbS0+c2VsZWN0ZWRNZXRob2QtPmVhcF9tZXRob2RfaW5pdFBpY2tVcCkoCisJCQkJCQkJZWFwX3NtKTsKKwkJCQkJaWYgKHJldCkKKwkJCQkJeworCQkJCQkJVFJBQ0VfREVCVUcoSU5GTywgIiVzRUFQIE1ldGhvZCBJbml0UGlja1VwIHJldHVybmVkIGVycm9yLiIsRElBTUVBUF9FWFRFTlNJT04pOworCQkJCQkJZWFwX3NtLT5zZWxlY3RlZE1ldGhvZCA9IE5VTEw7CisJCQkJCQllYXBfc20tPmN1cnJlbnRNZXRob2QgPSBUWVBFX05PTkU7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlpZiAoZWFwX3NtLT5jdXJyZW50TWV0aG9kID09IFRZUEVfTk9ORSkKKwkJCXsKKwkJCQllYXBfc20tPmVhcF9zdGF0ZSA9IEVBUF9TRUxFQ1RfQUNUSU9OOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWVhcF9zbS0+ZWFwX3N0YXRlID0gRUFQX01FVEhPRF9SRVNQT05TRTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgRUFQX1JFQ0VJVkVEOgorCQkJVFJBQ0VfREVCVUcoRlVMTCsxLCIlc1tFQVAgUHJvdG9jb2xdIE5ldyBFQVAgUmVzcG9uc2UgcmVjZWl2ZWQiLERJQU1FQVBfRVhURU5TSU9OKQorCQkJOworCQkJZGlhbWVhcF9lYXBfZHVtcChGVUxMICsgMSwgJmVhcF9pLT5hYWFFYXBSZXNwRGF0YSk7CisJCQlpZiAoKGVhcF9zbS0+cnhSZXNwID09IFRSVUUpICYmIChlYXBfc20tPnJlc3BJZAorCQkJCQk9PSBlYXBfc20tPmN1cnJlbnRJZCkgJiYgKChlYXBfc20tPnJlc3BNZXRob2QKKwkJCQkJPT0gZWFwX3NtLT5jdXJyZW50TWV0aG9kKSB8fCAoKGVhcF9zbS0+cmVzcE1ldGhvZAorCQkJCQk9PSBUWVBFX0VYUEFOREVEX1RZUEVTKSAmJiAoZWFwX3NtLT5yZXNwVmVuZG9yCisJCQkJCT09IFZFTkRPUl9JRVRGKSAmJiAoZWFwX3NtLT5yZXNwVmVuZG9yTWV0aG9kCisJCQkJCT09IGVhcF9zbS0+Y3VycmVudE1ldGhvZCkpKSkKKwkJCXsKKwkJCQllYXBfc20tPmVhcF9zdGF0ZSA9IEVBUF9JTlRFR1JJVFlfQ0hFQ0s7CisJCQl9CisJCQllbHNlIGlmICgoZWFwX3NtLT5yeFJlc3AgPT0gVFJVRSkgJiYgKGVhcF9zbS0+cmVzcElkCisJCQkJCT09IGVhcF9zbS0+Y3VycmVudElkKSAmJiAoKGVhcF9zbS0+cmVzcE1ldGhvZCA9PSBUWVBFX05BSykKKwkJCQkJfHwgKGVhcF9zbS0+cmVzcE1ldGhvZCA9PSBUWVBFX0VYUEFOREVEX1RZUEVTCisJCQkJCQkJJiYgZWFwX3NtLT5yZXNwVmVuZG9yID09IFZFTkRPUl9JRVRGCisJCQkJCQkJJiYgZWFwX3NtLT5yZXNwVmVuZG9yTWV0aG9kID09IFRZUEVfTkFLKSkKKwkJCQkJJiYgKGVhcF9zbS0+bWV0aG9kU3RhdGUgPT0gRUFQX01fUFJPUE9TRUQpKQorCQkJeworCQkJCWVhcF9zbS0+ZWFwX3N0YXRlID0gRUFQX05BSzsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQllYXBfc20tPmVhcF9zdGF0ZSA9IEVBUF9ESVNDQVJEOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgRUFQX0RJU0NBUkQ6CisJCQlUUkFDRV9ERUJVRyhJTkZPLCIlc1tFQVAgUHJvdG9jb2xdIEludmFsaWQgRUFQIFBhY2tldCByZWNlaXZlZCAoTm9uIGZhdGFsIGVycm9yKS4iLERJQU1FQVBfRVhURU5TSU9OKQorCQkJOworCQkJKm5vbl9mYXRhbF9lcnJvciA9IFRSVUU7CisJCQllYXBfc20tPmVhcF9zdGF0ZSA9IEVBUF9JRExFOworCQkJYnJlYWs7CisKKwkJY2FzZSBFQVBfU0VORF9SRVFVRVNUOgorCQkJVFJBQ0VfREVCVUcoRlVMTCsxLCIlc1tFQVAgUHJvdG9jb2xdIE5ldyBFQVAgcGFja2V0IHJlcXVlc3QgY3JlYXRlZC4iLERJQU1FQVBfRVhURU5TSU9OKQorCQkJOworCQkJZGlhbWVhcF9lYXBfZHVtcChGVUxMLCAmZWFwX2ktPmFhYUVhcFJlcURhdGEpOworCQkJZWFwX2ktPmFhYUVhcFJlc3AgPSBGQUxTRTsKKwkJCWVhcF9pLT5hYWFFYXBSZXEgPSBUUlVFOworCQkJZWFwX3NtLT5lYXBfc3RhdGUgPSBFQVBfSURMRTsKKwkJCWJyZWFrOworCisJCWNhc2UgRUFQX0lOVEVHUklUWV9DSEVDSzoKKwkJCWlmICgoKmVhcF9zbS0+c2VsZWN0ZWRNZXRob2QtPmVhcF9tZXRob2RfY2hlY2spKGVhcF9zbSwKKwkJCQkJJmVhcF9pLT5hYWFFYXBSZXNwRGF0YSkgPT0gRkFMU0UpCisJCQl7CisJCQkJVFJBQ0VfREVCVUcoSU5GTywiJXNbRUFQIFByb3RvY29sXSBJbnZhbGlkIEVBUCBwYWNrZXQgcmVjZWl2ZWQge1R5cGU9JWQsIFZlbmRvcj0lZH0uIEludGVncml0eSBjaGVjayBmYWlsZWQgKG5vbiBmYXRhbCBlcnJvcikuIixESUFNRUFQX0VYVEVOU0lPTixlYXBfc20tPmN1cnJlbnRNZXRob2QsZWFwX3NtLT5jdXJyZW50VmVuZG9yKTsKKwkJCQkvL25vbl9mYXRhX2Vycm9yCisJCQkJKm5vbl9mYXRhbF9lcnJvciA9IFRSVUU7CisJCQkJZWFwX3NtLT5lYXBfc3RhdGUgPSBFQVBfSURMRTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQllYXBfc20tPmVhcF9zdGF0ZSA9IEVBUF9NRVRIT0RfUkVTUE9OU0U7CisJCQl9CisKKwkJCWJyZWFrOworCQljYXNlIEVBUF9NRVRIT0RfUkVRVUVTVDoKKwkJCWVhcF9zbS0+bGFzdElkID0gZWFwX3NtLT5jdXJyZW50SWQ7CisJCQlkaWFtZWFwX2JhX25leHRpZChlYXBfc20sICZlYXBfc20tPmN1cnJlbnRJZCk7CisJCQlDSEVDS19GQ1QoKCplYXBfc20tPnNlbGVjdGVkTWV0aG9kLT5lYXBfbWV0aG9kX2J1aWxkUmVxKSgKKwkJCQkJCQllYXBfc20sIGVhcF9zbS0+Y3VycmVudElkLCZlYXBfaS0+YWFhRWFwUmVxRGF0YSkpCisJCQk7CisJCQlpZiAoZWFwX3NtLT5zZWxlY3RlZE1ldGhvZC0+ZWFwX21ldGhvZF9nZXRUaW1lb3V0KQorCQkJeworCQkJCWlmICgoKmVhcF9zbS0+c2VsZWN0ZWRNZXRob2QtPmVhcF9tZXRob2RfZ2V0VGltZW91dCkoZWFwX3NtLAorCQkJCQkJJmVhcF9pLT5hYWFNZXRob2RUaW1lb3V0KSkKKwkJCQl7CisJCQkJCVRSQUNFX0RFQlVHKElORk8sIiVzW0VBUCBQcm90b2NvbF0gWyVzIHBsdWdpbl0gZ2V0VGltZW91dCBmYWlsZWQuIixESUFNRUFQX0VYVEVOU0lPTixlYXBfc20tPnNlbGVjdGVkTWV0aG9kLT5tZXRob2RuYW1lKTsKKwkJCQkJZWFwX2ktPmFhYU1ldGhvZFRpbWVvdXQgPSAwOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQllYXBfaS0+YWFhTWV0aG9kVGltZW91dCA9IDA7CisJCQl9CisJCQllYXBfc20tPmVhcF9zdGF0ZSA9IEVBUF9TRU5EX1JFUVVFU1Q7CisJCQlicmVhazsKKworCQljYXNlIEVBUF9NRVRIT0RfUkVTUE9OU0U6CisJCQlpZiAoZWFwX3NtLT5yZXNwTWV0aG9kID49IFRZUEVfRUFQX01ENSkKKwkJCXsKKwkJCQlpZiAoZWFwX3NtLT51c2VyLm1ldGhvZElkIDwgMCkKKwkJCQl7CisJCQkJCWVhcF9zbS0+dXNlci5tZXRob2RJZCA9IDA7CisJCQkJCWVhcF9zbS0+dXNlci5tZXRob2RzW2VhcF9zbS0+dXNlci5tZXRob2RJZF0udmVuZG9yCisJCQkJCQkJPSBlYXBfc20tPnJlc3BWZW5kb3I7CisJCQkJCWVhcF9zbS0+dXNlci5tZXRob2RzW2VhcF9zbS0+dXNlci5tZXRob2RJZF0ubWV0aG9kCisJCQkJCQkJPSBlYXBfc20tPnJlc3BNZXRob2Q7CisJCQkJCWVhcF9zbS0+dXNlci5tZXRob2RJZCsrOworCisJCQkJfQorCQkJCWVsc2UgaWYgKCEoKGVhcF9zbS0+dXNlci5tZXRob2RzW2VhcF9zbS0+dXNlci5tZXRob2RJZCAtIDFdLnZlbmRvcgorCQkJCQkJPT0gZWFwX3NtLT5yZXNwVmVuZG9yKQorCQkJCQkJJiYgKGVhcF9zbS0+dXNlci5tZXRob2RzW2VhcF9zbS0+dXNlci5tZXRob2RJZCAtIDFdLm1ldGhvZAorCQkJCQkJCQk9PSBlYXBfc20tPnJlc3BNZXRob2QpKSkKKwkJCQl7CisJCQkJCWVhcF9zbS0+dXNlci5tZXRob2RzW2VhcF9zbS0+dXNlci5tZXRob2RJZF0udmVuZG9yCisJCQkJCQkJPSBlYXBfc20tPnJlc3BWZW5kb3I7CisJCQkJCWVhcF9zbS0+dXNlci5tZXRob2RzW2VhcF9zbS0+dXNlci5tZXRob2RJZF0ubWV0aG9kCisJCQkJCQkJPSBlYXBfc20tPnJlc3BNZXRob2Q7CisJCQkJCWVhcF9zbS0+dXNlci5tZXRob2RJZCsrOworCQkJCX0KKwkJCX0KKwkJCWlmICgoKmVhcF9zbS0+c2VsZWN0ZWRNZXRob2QtPmVhcF9tZXRob2RfcHJvY2VzcykoZWFwX3NtLAorCQkJCQkmZWFwX2ktPmFhYUVhcFJlc3BEYXRhKSkKKwkJCXsKKwkJCQlUUkFDRV9ERUJVRyhJTkZPLCIlc1tFQVAgUHJvdG9jb2xdIFslcyBwbHVnaW5dIEF1dGhlbnRpY2F0aW9uIHByb2Nlc3MgZmFpbGVkLiIsRElBTUVBUF9FWFRFTlNJT04sZWFwX3NtLT5zZWxlY3RlZE1ldGhvZC0+bWV0aG9kbmFtZSk7CisJCQkJKm5vbl9mYXRhbF9lcnJvciA9IFRSVUU7CisJCQkJZWFwX3NtLT5lYXBfc3RhdGUgPSBFQVBfSURMRTsKKworCQkJfWVsc2V7CisJCQlpZiAoKCplYXBfc20tPnNlbGVjdGVkTWV0aG9kLT5lYXBfbWV0aG9kX2lzRG9uZSkoZWFwX3NtKSA9PSBUUlVFKQorCQkJeworCQkJCS8qZGlhbWVhcF9iYV9Qb2xpY3lVcGRhdGUoKTsqLworCQkJCWVhcF9pLT5hYWFFYXBNU0tMZW5ndGggPSAwOworCQkJCWVhcF9pLT5hYWFFYXBFTVNLTGVuZ3RoID0gMDsKKwkJCQlpZiAoZWFwX3NtLT5zZWxlY3RlZE1ldGhvZC0+ZWFwX21ldGhvZF9nZXRLZXkpCisJCQkJeworCQkJCQlpZiAoKCplYXBfc20tPnNlbGVjdGVkTWV0aG9kLT5lYXBfbWV0aG9kX2dldEtleSkoZWFwX3NtLAorCQkJCQkJCSZlYXBfaS0+YWFhRWFwTVNLRGF0YSwgJmVhcF9pLT5hYWFFYXBNU0tMZW5ndGgsCisJCQkJCQkJJmVhcF9pLT5hYWFFYXBFTVNLRGF0YSwgJmVhcF9pLT5hYWFFYXBFTVNLTGVuZ3RoKSkKKwkJCQkJeworCQkJCQkJVFJBQ0VfREVCVUcoSU5GTywiJXNbRUFQIFByb3RvY29sXSBbJXMgcGx1Z2luXSBHZW5lcmF0aW5nIEVBUCBNYXN0ZXIgS2V5IGZhaWxlZC4iLERJQU1FQVBfRVhURU5TSU9OLGVhcF9zbS0+c2VsZWN0ZWRNZXRob2QtPm1ldGhvZG5hbWUpCisJCQkJCQllYXBfaS0+YWFhRWFwTVNLTGVuZ3RoID0gMDsKKwkJCQkJCWVhcF9pLT5hYWFFYXBFTVNLTGVuZ3RoID0gMDsKKwkJCQkJCWVhcF9pLT5hYWFFYXBLZXlBdmFpbGFibGUgPSBGQUxTRTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCWVhcF9pLT5hYWFFYXBLZXlBdmFpbGFibGUgPSBUUlVFOworCQkJCQl9CisJCQkJfQorCQkJCWVhcF9zbS0+bWV0aG9kU3RhdGUgPSBFQVBfTV9FTkQ7CisJCQkJZWFwX3NtLT5lYXBfc3RhdGUgPSBFQVBfU0VMRUNUX0FDVElPTjsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQllYXBfc20tPm1ldGhvZFN0YXRlID0gRUFQX01fQ09OVElOVUU7CisJCQkJZWFwX3NtLT5lYXBfc3RhdGUgPSBFQVBfTUVUSE9EX1JFUVVFU1Q7CisJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBFQVBfUFJPUE9TRV9NRVRIT0Q6CisJCQlpZiAoZGlhbWVhcF9iYV9wb2xpY3lnZXRuZXh0bWV0aG9kKGVhcF9zbSwgJmVhcF9zbS0+Y3VycmVudE1ldGhvZCwKKwkJCQkJJmVhcF9zbS0+Y3VycmVudFZlbmRvcikpCisJCQl7CisJCQkJVFJBQ0VfREVCVUcoSU5GTywiJXNbRUFQIFByb3RvY29sXSBbJXMgcGx1Z2luXSBTZWxlY3RpbmcgRUFQIE1ldGhvZCBwbHVnaW4gZmFpbGVkLiIsRElBTUVBUF9FWFRFTlNJT04sZWFwX3NtLT5zZWxlY3RlZE1ldGhvZC0+bWV0aG9kbmFtZSk7CisKKwkJCQkqbm9uX2ZhdGFsX2Vycm9yID0gVFJVRTsKKwkJCQllYXBfc20tPmVhcF9zdGF0ZSA9IEVBUF9FTkQ7CisKKwkJCX0KKwkJCVRSQUNFX0RFQlVHKEZVTEwsIiVzW0VBUCBQcm90b2NvbF0gU2VsZWN0aW5nIEVBUCBNZXRob2QgcGx1Z2luOiAlcyglZCkuIFt1c2VyOiAlc10iLERJQU1FQVBfRVhURU5TSU9OLGVhcF9zbS0+c2VsZWN0ZWRNZXRob2QtPm1ldGhvZG5hbWUsZWFwX3NtLT5zZWxlY3RlZE1ldGhvZC0+bWV0aG9kdHlwZSxlYXBfc20tPnVzZXIudXNlcmlkKQorCQkJOworCQkJaWYgKCgqZWFwX3NtLT5zZWxlY3RlZE1ldGhvZC0+ZWFwX21ldGhvZF9pbml0KShlYXBfc20pKQorCQkJeworCQkJCVRSQUNFX0RFQlVHKElORk8sIiVzW0VBUCBQcm90b2NvbF0gWyVzIHBsdWdpbl0gSW5pdGlhbGl6aW5nIEVBUCBwbHVnaW4gZmFpbGVkLiIsRElBTUVBUF9FWFRFTlNJT04sZWFwX3NtLT5zZWxlY3RlZE1ldGhvZC0+bWV0aG9kbmFtZSk7CisJCQl9CisKKwkJCWlmICgoZWFwX3NtLT5jdXJyZW50TWV0aG9kID09IFRZUEVfSURFTlRJVFkpCisJCQkJCXx8IChlYXBfc20tPmN1cnJlbnRNZXRob2QgPT0gVFlQRV9OT1RJRklDQVRJT04pKQorCQkJeworCQkJCWVhcF9zbS0+bWV0aG9kU3RhdGUgPSBFQVBfTV9DT05USU5VRTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQllYXBfc20tPm1ldGhvZFN0YXRlID0gRUFQX01fUFJPUE9TRUQ7CisJCQl9CisJCQllYXBfc20tPmVhcF9zdGF0ZSA9IEVBUF9NRVRIT0RfUkVRVUVTVDsKKwkJCWJyZWFrOworCQljYXNlIEVBUF9OQUs6CisJCQlUUkFDRV9ERUJVRyhGVUxMKzEsIiVzW0VBUCBQcm90b2NvbF0gRUFQIE5BSyBQYWNrZXQgcmVjZWl2ZWQuIixESUFNRUFQX0VYVEVOU0lPTikKKwkJCTsKKwkJCWlmIChlYXBfc20tPnNlbGVjdGVkTWV0aG9kLT5lYXBfbWV0aG9kX2ZyZWUpCisJCQl7CisJCQkJKCplYXBfc20tPnNlbGVjdGVkTWV0aG9kLT5lYXBfbWV0aG9kX2ZyZWUpKGVhcF9zbS0+bWV0aG9kRGF0YSk7CisJCQkJZWFwX3NtLT5tZXRob2REYXRhID0gTlVMTDsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpZiAoZWFwX3NtLT5tZXRob2REYXRhKQorCQkJCXsKKwkJCQkJZnJlZShlYXBfc20tPm1ldGhvZERhdGEpOworCQkJCQllYXBfc20tPm1ldGhvZERhdGEgPSBOVUxMOworCQkJCX0KKwkJCX0KKwkJCWRpYW1lYXBfYmFfcG9saWN5dXBkYXRlKGVhcF9zbSwgJmVhcF9pLT5hYWFFYXBSZXNwRGF0YSk7CisJCQllYXBfc20tPmVhcF9zdGF0ZSA9IEVBUF9TRUxFQ1RfQUNUSU9OOworCQkJYnJlYWs7CisJCWNhc2UgRUFQX1NFTEVDVF9BQ1RJT046CisJCQlDSEVDS19GQ1QoZGlhbWVhcF9iYV9wb2xpY3lnZXRkZWNpc2lvbihlYXBfc20sIGVhcF9pLCZlYXBfc20tPnNtX2RlY2lzaW9uKSkKKwkJCTsKKwkJCXN3aXRjaCAoZWFwX3NtLT5zbV9kZWNpc2lvbikKKwkJCXsKKwkJCWNhc2UgREVDSVNJT05fQ09OVElOVUU6CisJCQkJZWFwX3NtLT5lYXBfc3RhdGUgPSBFQVBfUFJPUE9TRV9NRVRIT0Q7CisJCQkJYnJlYWs7CisJCQljYXNlIERFQ0lTSU9OX0ZBSUxVUkU6CisJCQkJVFJBQ0VfREVCVUcoRlVMTCwiJXNbRUFQIFByb3RvY29sXSBBdXRoZW50aWNhdGlvbiBGYWlsdXJlIFtVc2VyOiAlc10uIixESUFNRUFQX0VYVEVOU0lPTixlYXBfc20tPnVzZXIudXNlcmlkKQorCQkJCTsKKwkJCQllYXBfc20tPmxhc3RJZCA9IGVhcF9zbS0+Y3VycmVudElkOworCQkJCWRpYW1lYXBfYmFfbmV4dGlkKGVhcF9zbSwgJmVhcF9zbS0+Y3VycmVudElkKTsKKwkJCQlDSEVDS19GQ1QoZGlhbWVhcF9lYXBfbmV3KEVBUF9GQUlMVVJFLCAodTgpIGVhcF9zbS0+Y3VycmVudElkLCBUWVBFX05PTkUsIE5VTEwsIDAsJmVhcF9pLT5hYWFFYXBSZXFEYXRhKSkKKwkJCQk7CisJCQkJZWFwX2ktPmFhYUZhaWwgPSBUUlVFOworCQkJCSpub25fZmF0YWxfZXJyb3IgPSBGQUxTRTsKKwkJCQllYXBfc20tPmVhcF9zdGF0ZSA9IEVBUF9FTkQ7CisJCQkJaWYgKGVhcF9zbS0+bWV0aG9kRGF0YSkKKwkJCQl7CisJCQkJCWlmIChlYXBfc20tPnNlbGVjdGVkTWV0aG9kLT5lYXBfbWV0aG9kX2ZyZWUpCisJCQkJCXsKKwkJCQkJCSgqZWFwX3NtLT5zZWxlY3RlZE1ldGhvZC0+ZWFwX21ldGhvZF9mcmVlKSgKKwkJCQkJCQkJZWFwX3NtLT5tZXRob2REYXRhKTsKKwkJCQkJCWVhcF9zbS0+bWV0aG9kRGF0YSA9IE5VTEw7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlmcmVlKGVhcF9zbS0+bWV0aG9kRGF0YSk7CisJCQkJCQllYXBfc20tPm1ldGhvZERhdGEgPSBOVUxMOworCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBERUNJU0lPTl9TVUNDRVNTOgorCQkJCVRSQUNFX0RFQlVHKEZVTEwsIiVzW0VBUCBQcm90b2NvbF0gQXV0aGVudGljYXRpb24gU3VjY2VzcyBbVXNlcjogJXNdLiIsRElBTUVBUF9FWFRFTlNJT04sZWFwX3NtLT51c2VyLnVzZXJpZCkKKwkJCQk7CisJCQkJZWFwX3NtLT5sYXN0SWQgPSBlYXBfc20tPmN1cnJlbnRJZDsKKwkJCQlkaWFtZWFwX2JhX25leHRpZChlYXBfc20sICZlYXBfc20tPmN1cnJlbnRJZCk7CisJCQkJQ0hFQ0tfRkNUKGRpYW1lYXBfZWFwX25ldyhFQVBfU1VDQ0VTUywgKHU4KSBlYXBfc20tPmN1cnJlbnRJZCwgVFlQRV9OT05FLCBOVUxMLCAwLCZlYXBfaS0+YWFhRWFwUmVxRGF0YSkpCisJCQkJOworCQkJCWlmIChlYXBfaS0+YWFhRWFwTVNLRGF0YSAhPSBOVUxMKQorCQkJCXsKKwkJCQkJVFJBQ0VfREVCVUcoRlVMTCsxLCIlc1tFQVAgUHJvdG9jb2xdIEVBUCBLZXkgYXZhaWxhYmxlIFtVc2VyOiAlc10uIixESUFNRUFQX0VYVEVOU0lPTixlYXBfc20tPnVzZXIudXNlcmlkKTsKKwkJCQkJZWFwX2ktPmFhYUVhcEtleUF2YWlsYWJsZSA9IFRSVUU7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCVRSQUNFX0RFQlVHKEZVTEwrMSwiJXNbRUFQIFByb3RvY29sXSBObyBFQVAgS2V5IGF2YWlsYWJsZSBbVXNlcjogJXNdLiIsRElBTUVBUF9FWFRFTlNJT04sZWFwX3NtLT51c2VyLnVzZXJpZCk7CisJCQkJfQorCQkJCWVhcF9pLT5hYWFTdWNjZXNzID0gVFJVRTsKKwkJCQkqbm9uX2ZhdGFsX2Vycm9yID0gRkFMU0U7CisJCQkJZWFwX3NtLT5lYXBfc3RhdGUgPSBFQVBfRU5EOworCQkJCWlmIChlYXBfc20tPnNlbGVjdGVkTWV0aG9kLT5lYXBfbWV0aG9kX2ZyZWUpCisJCQkJeworCQkJCQkoKmVhcF9zbS0+c2VsZWN0ZWRNZXRob2QtPmVhcF9tZXRob2RfZnJlZSkoCisJCQkJCQkJZWFwX3NtLT5tZXRob2REYXRhKTsKKwkJCQkJZWFwX3NtLT5tZXRob2REYXRhID0gTlVMTDsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJaWYgKGVhcF9zbS0+bWV0aG9kRGF0YSkKKwkJCQkJeworCQkJCQkJZnJlZShlYXBfc20tPm1ldGhvZERhdGEpOworCQkJCQkJZWFwX3NtLT5tZXRob2REYXRhID0gTlVMTDsKKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJVFJBQ0VfREVCVUcoSU5GTywiJXNJbmNvcnJlY3QgRUFQIERlY2lzaW9uLihQbGVhc2UgcmVwb3J0IHRoaXMgcHJvYmxlbS4pIixESUFNRUFQX0VYVEVOU0lPTikKKwkJCQk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIEVBUF9FTkQ6CisJCQlicmVhazsKKworCQljYXNlIEVBUF9JRExFOgorCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9hcHBfZGlhbWVhcC9kaWFtZWFwX2VhcC5oIGIvZXh0ZW5zaW9ucy9hcHBfZGlhbWVhcC9kaWFtZWFwX2VhcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmYjY2MTcKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2FwcF9kaWFtZWFwL2RpYW1lYXBfZWFwLmgKQEAgLTAsMCArMSw3MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpCisgKiBBdXRob3IgOiBTb3VoZWlsIEJlbiBBeWVkIDxzb3VoZWlsQHRlcmEuaWNzLmtlaW8uYWMuanA+CisgKgorICogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTAsIFNvdWhlaWwgQmVuIEF5ZWQsIFRlcmFva2EgTGFib3JhdG9yeSBvZiBLZWlvIFVuaXZlcnNpdHksIGFuZCB0aGUgV0lERSBQcm9qZWN0CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBTb3VoZWlsIEJlbiBBeWVkIDxzb3VoZWlsQHRlcmEuaWNzLmtlaW8uYWMuanA+LgorICoKKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgU291aGVpbCBCZW4gQXllZCwgVGVyYW9rYSBMYWJvcmF0b3J5IG9mIEtlaW8gVW5pdmVyc2l0eSBvciB0aGUgV0lERSBQcm9qZWN0IG5vciB0aGUKKyAqICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICcnQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIERJQU1FQVBfRUFQX0hfCisjZGVmaW5lIERJQU1FQVBfRUFQX0hfCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCQlFQVAgQUFBIEludGVyZmFjZQkJCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBFQVAgQmFja2VuZCBBdXRoZW50aWNhdG9yIFN0YXRlIE1hY2hpbmUgKi8KK3N0cnVjdCBkaWFtZWFwX2VhcF9pbnRlcmZhY2UKK3sKKworCS8qIFZhcmlhYmxlcyAoQUFBIEludGVyZmFjZSB0byBCYWNrZW5kIEF1dGhlbnRpY2F0b3IpKi8KKwlib29sZWFuIGFhYUVhcFJlc3A7CisJc3RydWN0IGVhcF9wYWNrZXQgYWFhRWFwUmVzcERhdGE7CisKKwkvKlZhcmlhYmxlcyAoQmFja2VuZCBBdXRoZW50aWNhdG9yIHRvIEFBQSBJbnRlcmZhY2UgKSovCisJYm9vbGVhbiBhYWFFYXBSZXE7CisJYm9vbGVhbiBhYWFFYXBOb1JlcTsKKwlib29sZWFuIGFhYVN1Y2Nlc3M7CisJYm9vbGVhbiBhYWFGYWlsOworCXN0cnVjdCBlYXBfcGFja2V0IGFhYUVhcFJlcURhdGE7CisJdTggKmFhYUVhcE1TS0RhdGE7CisJaW50IGFhYUVhcE1TS0xlbmd0aDsKKwl1OCAqYWFhRWFwRU1TS0RhdGE7CisJaW50IGFhYUVhcEVNU0tMZW5ndGg7CisJYm9vbGVhbiBhYWFFYXBLZXlBdmFpbGFibGU7CisJaW50IGFhYU1ldGhvZFRpbWVvdXQ7CisKK307CisKK2ludCBkaWFtZWFwX2VhcF9zdGF0ZW1hY2hpbmUoc3RydWN0IGVhcF9zdGF0ZV9tYWNoaW5lICogc20sIHN0cnVjdCBkaWFtZWFwX2VhcF9pbnRlcmZhY2UgKiBlYXBfaSwgYm9vbGVhbiAqIGVycm9yKTsKKworCisjZW5kaWYgLyogRUFQX0hfICovCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2FwcF9kaWFtZWFwL2RpYW1lYXBfZWFwcGFja2V0LmMgYi9leHRlbnNpb25zL2FwcF9kaWFtZWFwL2RpYW1lYXBfZWFwcGFja2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY5NjE2MQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvYXBwX2RpYW1lYXAvZGlhbWVhcF9lYXBwYWNrZXQuYwpAQCAtMCwwICsxLDMxMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpCisgKiBBdXRob3IgOiBTb3VoZWlsIEJlbiBBeWVkIDxzb3VoZWlsQHRlcmEuaWNzLmtlaW8uYWMuanA+CisgKgorICogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTAsIFNvdWhlaWwgQmVuIEF5ZWQsIFRlcmFva2EgTGFib3JhdG9yeSBvZiBLZWlvIFVuaXZlcnNpdHksIGFuZCB0aGUgV0lERSBQcm9qZWN0CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBTb3VoZWlsIEJlbiBBeWVkIDxzb3VoZWlsQHRlcmEuaWNzLmtlaW8uYWMuanA+LgorICoKKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgU291aGVpbCBCZW4gQXllZCwgVGVyYW9rYSBMYWJvcmF0b3J5IG9mIEtlaW8gVW5pdmVyc2l0eSBvciB0aGUgV0lERSBQcm9qZWN0IG5vciB0aGUKKyAqICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICcnQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaW5jbHVkZSAibGliZGlhbWVhcC5oIgorCitpbnQgZGlhbWVhcF9lYXBfZ2V0X2NvZGUoc3RydWN0IGVhcF9wYWNrZXQgKmVhcHBhY2tldCwgZWFwX2NvZGUgKiBlYXBjb2RlKQoreworCVRSQUNFX0VOVFJZKCIlcCAlcCIsZWFwcGFja2V0LGVhcGNvZGUpOworCisJaWYgKGVhcHBhY2tldC0+ZGF0YSA9PSBOVUxMKQorCXsKKwkJKmVhcGNvZGUgPSBFUlJPUjsKKwkJVFJBQ0VfREVCVUcoSU5GTywiJXNFbXB0eSBkYXRhIGluIEVBUCBwYWNrZXQ6IG5vIEVBUCBDb2RlIHRvIHJldHVybi4iLERJQU1FQVBfRVhURU5TSU9OKTsKKwkJcmV0dXJuIEVJTlZBTDsKKwl9CisJaWYgKGVhcHBhY2tldC0+bGVuZ3RoIDwgMSkKKwl7CisJCSplYXBjb2RlID0gRVJST1I7CisJCVRSQUNFX0RFQlVHKElORk8sIiVzRUFQIHBhY2tldCBsZW5ndGggJWQgOiBubyBFQVAgQ29kZSB0byByZXR1cm4uIixESUFNRUFQX0VYVEVOU0lPTiwgZWFwcGFja2V0LT5sZW5ndGgpOworCQlyZXR1cm4gRUlOVkFMOworCX0KKwkqZWFwY29kZSA9IEc4KGVhcHBhY2tldC0+ZGF0YSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBkaWFtZWFwX2VhcF9nZXRfaWRlbnRpZmllcihzdHJ1Y3QgZWFwX3BhY2tldCAqZWFwcGFja2V0LCB1OCAqIGlkZW50aWZpZXIpCit7CisJVFJBQ0VfRU5UUlkoIiVwICVwIixlYXBwYWNrZXQsaWRlbnRpZmllcik7CisJKmlkZW50aWZpZXIgPSAwOworCWlmIChlYXBwYWNrZXQtPmRhdGEgPT0gTlVMTCkKKwl7CisJCVRSQUNFX0RFQlVHKElORk8sIiVzRW1wdHkgZGF0YSBpbiBFQVAgcGFja2V0OiBubyBJZGVudGlmaWVyIGZpZWxkIHRvIHJldHVybi4iLERJQU1FQVBfRVhURU5TSU9OKTsKKwkJcmV0dXJuIEVJTlZBTDsKKwl9CisJaWYgKGVhcHBhY2tldC0+bGVuZ3RoIDwgMikKKwl7CisJCVRSQUNFX0RFQlVHKElORk8sIiVzRUFQIHBhY2tldCBsZW5ndGggJWQgOiBubyBJZGVudGlmaWVyIGZpZWxkIHRvIHJldHVybi4iLERJQU1FQVBfRVhURU5TSU9OLCBlYXBwYWNrZXQtPmxlbmd0aCk7CisJCXJldHVybiBFSU5WQUw7CisJfQorCSppZGVudGlmaWVyID0gRzgoZWFwcGFja2V0LT5kYXRhICsgMSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBkaWFtZWFwX2VhcF9nZXRfbGVuZ3RoKHN0cnVjdCBlYXBfcGFja2V0ICplYXBwYWNrZXQsIHUxNiAqbGVuZ3RoKQoreworCVRSQUNFX0VOVFJZKCIlcCAlcCIsZWFwcGFja2V0LGxlbmd0aCk7CisJKmxlbmd0aCA9IDA7CisKKwlpZiAoZWFwcGFja2V0LT5kYXRhID09IE5VTEwpCisJeworCQlUUkFDRV9ERUJVRyhJTkZPLCIlc0VtcHR5IGRhdGEgaW4gRUFQIHBhY2tldDogbm8gTGVuZ3RoIGZpZWxkIHRvIHJldHVybi4iLERJQU1FQVBfRVhURU5TSU9OKTsKKwkJcmV0dXJuIEVJTlZBTDsKKwl9CisJaWYgKGVhcHBhY2tldC0+dWxlbmd0aCA8IDQpCisJeworCQlUUkFDRV9ERUJVRyhJTkZPLCIlc0VBUCBwYWNrZXQgbGVuZ3RoICVkIDogbm8gTGVuZ3RoIGZpZWxkIHRvIHJldHVybi4iLERJQU1FQVBfRVhURU5TSU9OLCBlYXBwYWNrZXQtPmxlbmd0aCk7CisJCXJldHVybiBFSU5WQUw7CisJfQorCSpsZW5ndGggPSAodTE2KSBHMTZCSUdFKChlYXBwYWNrZXQtPmRhdGEgKyAyKSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBkaWFtZWFwX2VhcF9nZXRfcGFja2V0bGVuZ3RoKHN0cnVjdCBlYXBfcGFja2V0ICplYXBwYWNrZXQsIHUxNiAqbGVuZ3RoKQoreworCVRSQUNFX0VOVFJZKCIlcCAlcCIsZWFwcGFja2V0LGxlbmd0aCk7CisJaWYgKGVhcHBhY2tldC0+ZGF0YSA9PSBOVUxMKQorCXsKKwkJVFJBQ0VfREVCVUcoSU5GTywiJXNFbXB0eSBkYXRhIGluIEVBUCBwYWNrZXQ6IG5vIExlbmd0aCBmaWVsZCB0byByZXR1cm4uIixESUFNRUFQX0VYVEVOU0lPTik7CisJCXJldHVybiBFSU5WQUw7CisJfQorCSpsZW5ndGggPSBlYXBwYWNrZXQtPnVsZW5ndGg7CisJcmV0dXJuIDA7Cit9CisKK2ludCBkaWFtZWFwX2VhcF9nZXRfdHlwZShzdHJ1Y3QgZWFwX3BhY2tldCAqZWFwcGFja2V0LCBlYXBfdHlwZSAqIGVhcHR5cGUpCit7CisJVFJBQ0VfRU5UUlkoIiVwICVwIixlYXBwYWNrZXQsZWFwdHlwZSk7CisJKmVhcHR5cGUgPSAwOworCisJaWYgKGVhcHBhY2tldC0+ZGF0YSA9PSBOVUxMKQorCXsKKwkJVFJBQ0VfREVCVUcoSU5GTywiJXNFbXB0eSBkYXRhIGluIEVBUCBwYWNrZXQ6IG5vIEVBUCBUeXBlIGZpZWxkIHRvIHJldHVybi4iLERJQU1FQVBfRVhURU5TSU9OKTsKKwkJcmV0dXJuIEVJTlZBTDsKKwl9CisJaWYgKGVhcHBhY2tldC0+bGVuZ3RoIDwgNSkKKwl7CisJCVRSQUNFX0RFQlVHKElORk8sIiVzRUFQIHBhY2tldCBsZW5ndGggJWQgOiBubyBFQVAgVHlwZSBmaWVsZCB0byByZXR1cm4uIixESUFNRUFQX0VYVEVOU0lPTiwgZWFwcGFja2V0LT5sZW5ndGgpOworCQlyZXR1cm4gRUlOVkFMOworCX0KKwkqZWFwdHlwZSA9ICh1MzIpIEc4KGVhcHBhY2tldC0+ZGF0YSArIDQpOworCXJldHVybiAwOworfQorCitib29sZWFuIGRpYW1lYXBfZWFwX2NoZWNrX2NvZGUoZWFwX2NvZGUgY29kZSkKK3sKKwlUUkFDRV9FTlRSWSgiJWQiLGNvZGUpOworCWlmIChjb2RlICE9IEVBUF9SRVFVRVNUICYmIGNvZGUgIT0gRUFQX1JFU1BPTlNFICYmIGNvZGUgIT0gRUFQX1NVQ0NFU1MKKwkJCSYmIGNvZGUgIT0gRUFQX0ZBSUxVUkUpCisJeworCQlUUkFDRV9ERUJVRyhGVUxMLCIlc0luY29ycmVjdCBFQVAgQ29kZSAoJWQpLiIsRElBTUVBUF9FWFRFTlNJT04sY29kZSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJcmV0dXJuIFRSVUU7Cit9CisKK2ludCBkaWFtZWFwX2VhcF9nZXRfcGFja2V0ZGF0YShzdHJ1Y3QgZWFwX3BhY2tldCAqZWFwcGFja2V0LCB1OCAqKiBkYXRhLAorCQlpbnQgKmxlbikKK3sKKwlUUkFDRV9FTlRSWSgiJXAgJXAiLGVhcHBhY2tldCxkYXRhKTsKKwlpZiAoZWFwcGFja2V0LT5sZW5ndGggPiAwKQorCXsKKwkJKmRhdGEgPSBtYWxsb2Moc2l6ZW9mKHU4KSAqIGVhcHBhY2tldC0+bGVuZ3RoKTsKKwkJVThDT1BZKCpkYXRhLDAsZWFwcGFja2V0LT5sZW5ndGgsZWFwcGFja2V0LT5kYXRhKTsKKwkJKmxlbiA9IGVhcHBhY2tldC0+bGVuZ3RoOworCQlyZXR1cm4gMDsKKwl9CisJVFJBQ0VfREVCVUcoSU5GTywiJXNFQVAgcGFja2V0IGxlbmd0aD0lZDogZW1wdHkgb3Igd3JvbmcgRUFQIFBhY2tldC4iLERJQU1FQVBfRVhURU5TSU9OLCBlYXBwYWNrZXQtPmxlbmd0aCk7CisJKmRhdGEgPSBOVUxMOworCSpsZW4gPSAwOworCXJldHVybiBFSU5WQUw7Cit9CisKK2ludCBkaWFtZWFwX2VhcF9nZXRfZGF0YShzdHJ1Y3QgZWFwX3BhY2tldCAqZWFwcGFja2V0LCB1OCAqKiBkYXRhLCBpbnQgKiBsZW4pCit7CisJVFJBQ0VfRU5UUlkoIiVwICVwIixlYXBwYWNrZXQsZGF0YSk7CisJaWYgKGVhcHBhY2tldC0+bGVuZ3RoID4gNSkKKwl7CisJCUNIRUNLX01BTExPQyggKmRhdGEgPSBtYWxsb2Moc2l6ZW9mKHU4KSAqIChlYXBwYWNrZXQtPmxlbmd0aCAtIDUpKSApOworCQlVOENPUFkoKmRhdGEsMCwoZWFwcGFja2V0LT5sZW5ndGgtNSksKGVhcHBhY2tldC0+ZGF0YSs1KSk7CisJCSpsZW4gPSBlYXBwYWNrZXQtPmxlbmd0aCAtIDU7CisJCXJldHVybiAwOworCX0KKwlUUkFDRV9ERUJVRyhJTkZPLCIlc0VBUCBwYWNrZXQgbGVuZ3RoPSVkOiBlbXB0eSBvciB3cm9uZyBFQVAgUGFja2V0LiIsRElBTUVBUF9FWFRFTlNJT04sIGVhcHBhY2tldC0+bGVuZ3RoKTsKKwkqZGF0YSA9IE5VTEw7CisJKmxlbiA9IDA7CisKKwlyZXR1cm4gRUlOVkFMOworfQorCit2b2lkIGRpYW1lYXBfZWFwX2R1bXAoaW50IGxldmVsLCBzdHJ1Y3QgZWFwX3BhY2tldCAqZWFwcGFja2V0KQoreworCVRSQUNFX0VOVFJZKCIlZCAlcCIsbGV2ZWwsZWFwcGFja2V0KTsKKwlpZiAoIVRSQUNFX0JPT0wobGV2ZWwpKQorCQlyZXR1cm47CisKKwlpZiAoZWFwcGFja2V0LT5kYXRhID09IE5VTEwpCisJCXJldHVybjsKKwlpZiAoZWFwcGFja2V0LT5sZW5ndGggPCA1KQorCQlyZXR1cm47CisJaWYgKGVhcHBhY2tldC0+dWxlbmd0aCA8IDUpCisJCXJldHVybjsKKworCWZkX2xvZ19kZWJ1ZygiLS0tLS0tLS0tLS0tLSBEdW1wIEVBUCBQYWNrZXQtLS0tLS0tLS0tLS0tIik7CisJaW50IGk7CisJZmRfbG9nX2RlYnVnKCJcdCAtQ29kZSAgICAgICA6ICIpOworCWVhcF9jb2RlIGNvZGU7CisJQ0hFQ0tfRkNUX0RPKGRpYW1lYXBfZWFwX2dldF9jb2RlKGVhcHBhY2tldCwmY29kZSkscmV0dXJuKTsKKwlzd2l0Y2ggKGNvZGUpCisJeworCWNhc2UgMToKKwkJZmRfbG9nX2RlYnVnKCJSZXF1ZXN0Iik7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJZmRfbG9nX2RlYnVnKCJSZXNwb25zZSIpOworCQlicmVhazsKKwljYXNlIDM6CisJCWZkX2xvZ19kZWJ1ZygiU3VjY2VzcyIpOworCQlicmVhazsKKwljYXNlIDQ6CisJCWZkX2xvZ19kZWJ1ZygiRmFpbHVyZSIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlmZF9sb2dfZGVidWcoIkVycm9yIChFQVAgQ29kZSB2YWx1ZSBbJWRdIG5vdCBhbGxvd2VkKSIsY29kZSk7CisJCWJyZWFrOworCX0KKwl1OCBpZDsKKwlDSEVDS19GQ1RfRE8oZGlhbWVhcF9lYXBfZ2V0X2lkZW50aWZpZXIoZWFwcGFja2V0LCZpZCkscmV0dXJuKTsKKwlmZF9sb2dfZGVidWcoIlx0IC1JZGVudGlmaWVyIDogJXggIiwgaWQpOworCXUxNiBsZW5ndGg7CisJQ0hFQ0tfRkNUX0RPKGRpYW1lYXBfZWFwX2dldF9sZW5ndGgoZWFwcGFja2V0LCZsZW5ndGgpLHJldHVybik7CisJZmRfbG9nX2RlYnVnKCJcdCAtTGVuZ3RoICAgICA6ICVkICIsICh1bnNpZ25lZCBpbnQpbGVuZ3RoKTsKKwlpZiAoZWFwcGFja2V0LT5sZW5ndGggPiA0KQorCXsKKwkJZWFwX3R5cGUgdHlwZTsKKwkJQ0hFQ0tfRkNUX0RPKGRpYW1lYXBfZWFwX2dldF90eXBlKGVhcHBhY2tldCwmdHlwZSkscmV0dXJuKTsKKwkJZmRfbG9nX2RlYnVnKCJcdCAtVHlwZSAgICAgICA6ICVkICIsIHR5cGUpOworCX0KKwlpZiAoZWFwcGFja2V0LT5sZW5ndGggPiA1KQorCXsKKwkJY2hhciBidWZbMTAyNF07CisJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJcdCAtRGF0YSAgICAgICA6ICIpOworCQlmb3IgKGkgPSA1OyBpIDwgZWFwcGFja2V0LT5sZW5ndGggJiYgaSA8IDMwOyBpKyspCisJCXsKKwkJCXNucHJpbnRmKGJ1ZitzdHJsZW4oYnVmKSwgc2l6ZW9mKGJ1Ziktc3RybGVuKGJ1ZiksICIlMDJ4ICIsIEc4KGVhcHBhY2tldC0+ZGF0YSArIGkpKTsKKwkJfQorCQlpZihpKzE8ZWFwcGFja2V0LT5sZW5ndGgpCisJCQlzbnByaW50ZihidWYrc3RybGVuKGJ1ZiksIHNpemVvZihidWYpLXN0cmxlbihidWYpLCAiWy4uLl0gKGxlbj0lZCkiLCh1bnNpZ25lZCBpbnQpIGxlbmd0aCk7CisJCWZkX2xvZ19kZWJ1ZygiJXMiLCBidWYpOworCX0KKwlmZF9sb2dfZGVidWcoIi0tLS0tLS0tLS0tLS1FbmQgRHVtcCBFQVAgUGFja2V0LS0tLS0tLS0tLS0tLSIpOworfQorCitpbnQgZGlhbWVhcF9lYXBfbmV3KGVhcF9jb2RlIGNvZGUsIHU4IGlkLCBlYXBfdHlwZSB0eXBlLCB1OCAqIGRhdGEsCisJCXUxNiBkYXRhTGVuZ3RoLCBzdHJ1Y3QgZWFwX3BhY2tldCAqZWFwcGFja2V0KQoreworCisJVFJBQ0VfRU5UUlkoIiVkICVoaHUgJWQgJXAgJWh1ICVwIiwgY29kZSwgaWQsIHR5cGUsIGRhdGEsIGRhdGFMZW5ndGgsZWFwcGFja2V0KTsKKworCWludCBsZW5ndGggPSAwOworCisJLy9Jbml0aWFsaXplIEVBUCBQYWNrZXQKKwllYXBwYWNrZXQtPmxlbmd0aCA9IDA7CisJZWFwcGFja2V0LT51bGVuZ3RoID0gMDsKKwllYXBwYWNrZXQtPmRhdGEgPSBOVUxMOworCisJaWYgKGRpYW1lYXBfZWFwX2NoZWNrX2NvZGUoY29kZSkgPT0gRkFMU0UpCisJeworCQlUUkFDRV9ERUJVRygKKwkJCQlJTkZPLAorCQkJCSIlc1dyb25nIEVBUCBDb2RlLiBPbmx5IFJlcXVlc3QsIFJlc3BvbnNlLCBTdWNjZXNzIG9yIEZhaWx1cmUgYXJlIHBlcm1pdHRlZC4iLERJQU1FQVBfRVhURU5TSU9OKTsKKwkJcmV0dXJuIEVJTlZBTDsKKwl9CisKKwlsZW5ndGggKz0gRUFQX0hFQURFUjsKKwlpZiAoY29kZSA9PSBFQVBfUkVRVUVTVCB8fCBjb2RlID09IEVBUF9SRVNQT05TRSkKKwl7IC8vIEVBUCBQYWNrZXQgY29kZSBpcyBlaXRoZXIgUmVxdWVzdCBvciBSZXNwb25zZQorCQlpZiAodHlwZSA9PSBUWVBFX05PTkUpCisJCXsKKwkJCVRSQUNFX0RFQlVHKElORk8sCisJCQkJCSIlc1VuYWJsZSB0byBjcmVhdGUgYSBuZXcgRUFQIFBhY2tldCAoUmVxdWVzdCBvciBSZXNwb25zZSkgd2l0aG91dCBFQVAgVHlwZSBmaWVsZC4iLERJQU1FQVBfRVhURU5TSU9OKTsKKwkJCXJldHVybiBFSU5WQUw7CisJCX0KKwkJbGVuZ3RoICs9IEVBUF9UWVBFOyAvLyBFQVAgUGFja2V0IGNvZGUKKwkJaWYgKGRhdGEgIT0gTlVMTCkKKwkJeworCQkJbGVuZ3RoICs9IGRhdGFMZW5ndGg7CisKKwkJCWlmIChsZW5ndGggPiAoaW50KSBNQVhfRUFQX1BBQ0tFVCkKKwkJCXsKKworCQkJCVRSQUNFX0RFQlVHKElORk8sCisJCQkJCQkiJXNVbmFibGUgdG8gYWRkIERhdGEgdG8gRUFQIFBhY2tldC4gRGF0YSBmaWVsZCBsZW5ndGggZXhjZWVkIGFsbG93ZWQgZGF0YSBzaXplLiIsIERJQU1FQVBfRVhURU5TSU9OKTsKKwkJCQlyZXR1cm4gRUlOVkFMOworCQkJfQorCQkJZWxzZQorCQkJeworCisJCQkJQ0hFQ0tfTUFMTE9DKGVhcHBhY2tldC0+ZGF0YT1tYWxsb2Moc2l6ZW9mKHU4KSpsZW5ndGgpKTsKKwkJCQltZW1zZXQoZWFwcGFja2V0LT5kYXRhLCAwLCBzaXplb2YodTgpICogbGVuZ3RoKTsKKwkJCQlVOENPUFkoZWFwcGFja2V0LT5kYXRhLCA1LCBkYXRhTGVuZ3RoLCBkYXRhKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCUNIRUNLX01BTExPQyhlYXBwYWNrZXQtPmRhdGE9bWFsbG9jKHNpemVvZih1OCkqbGVuZ3RoKSk7CisJCQltZW1zZXQoZWFwcGFja2V0LT5kYXRhLCAwLCBzaXplb2YodTgpICogbGVuZ3RoKTsKKwkJfQorCQlQOChlYXBwYWNrZXQtPmRhdGEgKyA0LCB0eXBlKTsKKwl9CisJZWxzZQorCXsgLy9FQVAgUGFja2V0IGNvZGUgaXMgU1VDQ0VTUyBvciBGQUlMVVJFCisJCUNIRUNLX01BTExPQyhlYXBwYWNrZXQtPmRhdGE9bWFsbG9jKHNpemVvZih1OCkqbGVuZ3RoKSk7CisJCW1lbXNldChlYXBwYWNrZXQtPmRhdGEsIDAsIHNpemVvZih1OCkgKiBsZW5ndGgpOworCQkvL05vIERhdGEgZmlsZWQKKwkJLy9ObyBUeXBlIGZpZWxkCisJfQorCS8vQWRkIENvZGUgYW5kIElkZW50aWZpZXIgZmllbGRzCisJUDgoZWFwcGFja2V0LT5kYXRhLCBjb2RlKTsKKwlQOChlYXBwYWNrZXQtPmRhdGEgKyAxLCBpZCk7CisJLy9BZGQgbGVuZ3RoIGZpZWxkCisJUDE2QklHRShlYXBwYWNrZXQtPmRhdGEgKyAyLCBsZW5ndGgpOworCWVhcHBhY2tldC0+bGVuZ3RoID0gbGVuZ3RoOworCWVhcHBhY2tldC0+dWxlbmd0aCA9IGxlbmd0aDsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvYXBwX2RpYW1lYXAvZGlhbWVhcF9lYXBwYWNrZXQuaCBiL2V4dGVuc2lvbnMvYXBwX2RpYW1lYXAvZGlhbWVhcF9lYXBwYWNrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjBjMDY5Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9hcHBfZGlhbWVhcC9kaWFtZWFwX2VhcHBhY2tldC5oCkBAIC0wLDAgKzEsMjU4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkKKyAqIEF1dGhvciA6IFNvdWhlaWwgQmVuIEF5ZWQgPHNvdWhlaWxAdGVyYS5pY3Mua2Vpby5hYy5qcD4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMCwgU291aGVpbCBCZW4gQXllZCwgVGVyYW9rYSBMYWJvcmF0b3J5IG9mIEtlaW8gVW5pdmVyc2l0eSwgYW5kIHRoZSBXSURFIFByb2plY3QKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IFNvdWhlaWwgQmVuIEF5ZWQgPHNvdWhlaWxAdGVyYS5pY3Mua2Vpby5hYy5qcD4uCisgKgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiBTb3VoZWlsIEJlbiBBeWVkLCBUZXJhb2thIExhYm9yYXRvcnkgb2YgS2VpbyBVbml2ZXJzaXR5IG9yIHRoZSBXSURFIFByb2plY3Qgbm9yIHRoZQorICogICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgJydBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgRElBTUVBUF9FQVBQQUNLRVRfSF8KKyNkZWZpbmUgRElBTUVBUF9FQVBQQUNLRVRfSF8KKworI2luY2x1ZGUgImRpYW1lYXBfZGVmcy5oIgorCisvKkVBUCBQYWNrZXQgZGVmaW5pdGlvbiA6IHRoZSBFeHRlbnNpYmxlIEF1dGhlbnRpY2F0aW9uIFByb3RvY29sIChSRkMzNzQ4KSAqLworCisvKiBEZWZpbmUgTGVuZ3RoL1NpemUgKi8KKyNkZWZpbmUgRUFQX0hFQURFUiA0IAkvKiBFQVAgUGFja2V0IGhlYWRlciBzaXplIDogNCBCeXRlcyAqLworI2RlZmluZSBFQVBfVFlQRSAxIAkJLyogRUFQIFR5cGUgZmllbGQgc2l6ZSA6IDEgQnl0ZSAqLworI2RlZmluZSBNQVhfRUFQX1BBQ0tFVCAodTE2KTB4ZmZmZiAvKiBNYXhpbXVtIHZhbHVlIGFsbG93ZWQgZm9yIGFuIEVBUCBQYWNrZXQgKi8KKworLypFQVAgUGFja2V0IENvZGVzIFR5cGUqLwordHlwZWRlZiBlbnVtCit7CisJRVJST1IgPSAwLCAJCQkvKiBFQVAgUGFja2V0IENvZGUgc2hvdWxkIG5vdCBiZSBzZXQgdG8gRVJST1IuIEluZGljYXRlcyBhIHdyb25nIENvZGUgdmFsdWUgcmVjZWl2ZWQuICovCisJRUFQX1JFUVVFU1QgPSAxLCAJLyogRUFQIFJlcXVlc3QgKHZhbHVlPTEpLiAqLworCUVBUF9SRVNQT05TRSA9IDIsIAkvKiBFQVAgUmVzcG9uc2UgKHZhbHVlPTIpLiAqLworCUVBUF9TVUNDRVNTID0gMywgCS8qIEVBUCBTdWNjZXNzICh2YWx1ZT0zKS4gKi8KKwlFQVBfRkFJTFVSRSA9IDQgCS8qIEVBUCBGYWlsdXJlICh2YWx1ZT00KS4gKi8KK30gZWFwX2NvZGU7CisKKy8qIEVBUCBQYWNrZXQgKi8KK3N0cnVjdCBlYXBfcGFja2V0Cit7CisJdTE2IGxlbmd0aDsgCS8qIExlbmd0aCBvZiBkYXRhIChlcXVpdmFsZW50IHRvIHRoZSBsZW5ndGggZmllbGQpLiAqLworCXUxNiB1bGVuZ3RoOyAJLyogTGVuZ3RoIG9mIHJlY2VpdmVkIG9yIGluc2VydGVkIGJ5dGVzIGluIHRoZSBkYXRhIHBvaW50ZXIuICovCisJdTggKmRhdGE7IAkJLyogRGF0YSBidWZmZXIgKGluY2x1ZGluZyBDb2RlLCBJZGVudGlmaWVyLCBMZW5ndGgsICAoYWxzbyBUeXBlIGFuZCBEYXRhIGZpZWxkcyBpZiBleGlzdHMpKS4gKi8KK307CisKKy8qIEVBUCBNZXRob2RzIFR5cGVzICovCit0eXBlZGVmIGVudW0KK3sKKwlUWVBFX05PTkUgPSAwLCAJCQkvKiBJbmRpY2F0ZSBubyBtZXRob2Qgc3BlY2lmaWVkICovCisJVFlQRV9JREVOVElUWSA9IDEsIAkJLyogRUFQIElkZW50aXR5IChSRkMzNzQ4KSAqLworCVRZUEVfTk9USUZJQ0FUSU9OID0gMiwgCS8qIEVBUCBOb3RpZmljYXRpb24gKFJGQzM3NDgpICovCisJVFlQRV9OQUsgPSAzLCAJCQkvKiBFQVAgTkFLIChSRkMzNzQ4KSAqLworCVRZUEVfRUFQX01ENSA9IDQsCQkvKiBFQVAgTUQ1IChSRkMzNzQ4KSAqLworCVRZUEVfT1RQID0gNSwgCQkJLyogRUFQIE9UUCAoUkZDMzc0OCkgKi8KKwlUWVBFX0dUQyA9IDYsIAkJCS8qIEVBUCBHVEMgKFJGQzM3NDgpICovCisJVFlQRV9FQVBfVExTID0gMTMsCQkvKiBFQVAgVExTIChSRkM1MjE2KSAqLworCVRZUEVfRVhQQU5ERURfVFlQRVMgPSAyNTQsIAkvKiBFQVAgRXhwYW5kZWQgTkFLIChSRkMzNzQ4KSAqLworCVRZUEVfRVhQRVJJTUVOVEFMX1VTRSA9IDI1NQkvKiBmb3IgRXhwZXJpbWVudGFsIHVzZSAoUkZDMzc0OCkgKi8KK30gZWFwX3R5cGU7CisKKworLyogRnVuY3Rpb24JCToJZGlhbWVhcF9lYXBfZ2V0X2NvZGUKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogCWVhcFBhY2tldCAJOiAJYW4gRUFQIFBhY2tldAorICoJZWFwY29kZQkJOglPbiBzdWNjZXNzZnVsIHJldHVybiwgdGhlIEVBUCBDb2RlIGlzIHN0b3JlZCBoZXJlLgorICoKKyAqIERlc2NyaXB0aW9uOgorICogCUdldCB0aGUgRUFQIENvZGUgb2YgYW4gRUFQIFBhY2tldC4gSWYgTlVMTCBFQVAgUGFja2V0IG9yIGVtcHR5IHBhY2tldCBFUlJPUiBpcyBzdG9yZWQgaW4gZWFwY29kZS4KKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJMCAJCQk6IAlpZiBzdWNjZXNzZnVsCisqIAlFSU5WQUwJCToJaWYgRUFQIFBhY2tldCBpcyBOVUxMIG9yIGVtcHR5CisgKi8KKworaW50IGRpYW1lYXBfZWFwX2dldF9jb2RlKHN0cnVjdCBlYXBfcGFja2V0ICplYXBQYWNrZXQsIGVhcF9jb2RlICogZWFwY29kZSk7CisKKworLyogRnVuY3Rpb24JCToJZGlhbWVhcF9lYXBfZ2V0X2lkZW50aWZpZXIKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogCWVhcFBhY2tldCAJOiAJYW4gRUFQIFBhY2tldAorICogCWlkZW50aWZpZXIJOglvbiBzdWNjZXNzZnVsIHJldHVybiwgdGhlIGlkZW50aWZpZXIgdmFsdWUgaXMgc3RvcmVkIGhlcmUuCisgKgorICogRGVzY3JpcHRpb246CisgKiAJR2V0IHRoZSBJZGVudGlmaWVyIGZpZWxkIG9mIGFuIEVBUCBQYWNrZXQuCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCTAgCQkJOiAJaWYgc3VjY2Vzc2Z1bAorICogCUVJTlZBTAkJOiAJaWYgdGhlIEVBUCBQYWNrZXQgaXMgTlVMTCBvciB0aGUgRUFQIGlkZW50aWZpZXIgdmFsdWUgaXMgbm90IHZhbGlkIG9yIGRhdGEgbGVuZ3RoIDwgMgorICoKKyAqLworCitpbnQgZGlhbWVhcF9lYXBfZ2V0X2lkZW50aWZpZXIoc3RydWN0IGVhcF9wYWNrZXQgKmVhcFBhY2tldCwgdTggKiBpZGVudGlmaWVyKTsKKworCisvKiBGdW5jdGlvbgkJOglkaWFtZWFwX2VhcF9nZXRfbGVuZ3RoCisgKgorICogUGFyYW1ldGVyczoKKyAqCWVhcFBhY2tldAk6IAlhbiBFQVAgUGFja2V0CisgKglsZW5ndGgJCToJb24gc3VjY2Vzc2Z1bCByZXR1cm4sIHRoZSBFQVAgUGFja2V0IGxlbmd0aCBmaWVsZCBpcyBzdG9yZWQgaGVyZS4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCUdldCB0aGUgTGVuZ3RoIGZpZWxkIG9mIGFuIEVBUCBQYWNrZXQKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKgkwCQkJOglpZiBzdWNjZXNzZnVsCisgKglFSU5WQUwJCTogCWlmIHRoZSBkYXRhIGxlbmd0aCA8IDQsIG9yIHRoZSBFQVAgUGFja2V0IGlzIE5VTEwuCisgKi8KKworaW50IGRpYW1lYXBfZWFwX2dldF9sZW5ndGgoc3RydWN0IGVhcF9wYWNrZXQgKmVhcFBhY2tldCwgdTE2ICpsZW5ndGgpOworCisKKy8qIEZ1bmN0aW9uCQk6CWRpYW1lYXBfZWFwX2dldF9wYWNrZXRsZW5ndGgKKyAqCisgKiBQYXJhbWV0ZXJzOgorICoJZWFwUGFja2V0CTogCWFuIEVBUCBQYWNrZXQKKyAqCWxlbmd0aAkJOglvbiBzdWNjZXNzZnVsIHJldHVybiwgdGhlIGxlbmd0aCBvZiBFQVAgUGFja2V0IGlzIHN0b3JlZCBoZXJlLgorICoKKyAqIERlc2NyaXB0aW9uOgorICoJR2V0IHRoZSByZWNlaXZlZCBvciBpbnNlcnRlZCBsZW5ndGggb2YgQnl0ZXMgaW4gYW4gRUFQIFBhY2tldC4KKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKgkwCQkJOiAJaWYgc3VjY2Vzc2Z1bAorICoJRUlOVkFMCQk6IAlpZiB0aGUgRUFQIFBhY2tldCBpcyBOVUxMCisgKi8KKworaW50IGRpYW1lYXBfZWFwX2dldF9wYWNrZXRsZW5ndGgoc3RydWN0IGVhcF9wYWNrZXQgKmVhcFBhY2tldCwgdTE2ICpsZW5ndGgpOworCisKKy8qIEZ1bmN0aW9uCQk6CWRpYW1lYXBfZWFwX2dldF90eXBlCisgKgorICogUGFyYW1ldGVyczoKKyAqCWVhcFBhY2tldAk6IAlhbiBFQVAgUGFja2V0CisgKgllYXB0eXBlCQk6CW9uIHN1Y2Nlc3NmdWwgcmV0dXJuLCB0aGUgRUFQIFR5cGUgZmllbGQgaXMgc3RvcmVkIGhlcmUuCisgKgorICogRGVzY3JpcHRpb246CisgKglHZXQgdGhlIFR5cGUgZmllbGQgb2YgYW4gRUFQIFBhY2tldC4KKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKgkwCQkJOglpZiBzdWNjZXNzZnVsCisgKglFSU5WQUwJCToJaWYgdGhlIEVBUCBQYWNrZXQgaXMgTlVMTCBvciBkYXRhIGxlbmd0aCA8IDUKKyAqLworCitpbnQgZGlhbWVhcF9lYXBfZ2V0X3R5cGUoc3RydWN0IGVhcF9wYWNrZXQgKmVhcFBhY2tldCxlYXBfdHlwZSAqIGVhcHR5cGUpOworCisKKy8qIEZ1bmN0aW9uCQk6CWRpYW1lYXBfZWFwX2dldF9wYWNrZXRkYXRhCisgKgorICogUGFyYW1ldGVyczoKKyAqCWVhcFBhY2tldAk6IAlhbiBFQVAgUGFja2V0CisgKgllYXBkYXRhCQk6CW9uIHN1Y2Nlc3NmdWwgcmV0dXJuLCB0aGUgY29udGVudCBvZiBFQVAgUGFja2V0IGlzIHN0b3JlZCBoZXJlLgorICoJZWFwZGF0YWxlbgk6CW9uIHN1Y2Nlc3NmdWwgcmV0dXJuLCB0aGUgbGVuZ3RoIG9mIEVBUCBQYWNrZXQgaXMgc3RvcmVkIGhlcmUuCisgKgorICogRGVzY3JpcHRpb246CisgKglHZXQgdGhlIGRhdGEgY29udGVudCBvZiBhbiBFQVAgUGFja2V0LgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqCTAJCQk6IAlpZiBzdWNjZXNzZnVsCisgKglFSU5WQUwJCTogCWlmIHRoZXJlIGlzIG5vIGRhdGEgaW4gdGhlIGN1cnJlbnQgRUFQIFBhY2tldCAodWxlbmd0aDwxKQorICovCisKK2ludCBkaWFtZWFwX2VhcF9nZXRfcGFja2V0ZGF0YShzdHJ1Y3QgZWFwX3BhY2tldCAqZWFwUGFja2V0LCB1OCAqKiBkYXRhLCBpbnQgKmxlbik7CisKKworLyogRnVuY3Rpb24JCToJZGlhbWVhcF9lYXBfZ2V0X2RhdGEKKyAqCisgKiBQYXJhbWV0ZXJzOgorICoJZWFwUGFja2V0CTogCWFuIEVBUCBQYWNrZXQKKyAqCWRhdGEJCToJb24gc3VjY2Vzc2Z1bCByZXR1cm4sIHRoZSBjb250ZW50IG9mIGRhdGEgZmllbGQgaXMgc3RvcmVkIGhlcmUuCisgKglkYXRhbGVuCQk6CW9uIHN1Y2Nlc3NmdWwgcmV0dXJuLCB0aGUgbGVuZ3RoIG9mIGRhdGEgZmllbGQgaXMgc3RvcmVkIGhlcmUuCisgKgorICogRGVzY3JpcHRpb246CisgKglSZXR1cm4gdGhlIERhdGEgZmllbGQgb2YgYW4gRUFQIFBhY2tldAorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqCTAJCQk6IAlpZiBzdWNjZXNzZnVsCisgKglFSU5WQUwJCTogCWlmIHRoZXJlIGlzIG5vIGRhdGEgaW4gdGhlIGN1cnJlbnQgRUFQIFBhY2tldCAodWxlbmd0aDw2KQorICovCisKK2ludCBkaWFtZWFwX2VhcF9nZXRfZGF0YShzdHJ1Y3QgZWFwX3BhY2tldCAqZWFwUGFja2V0LCB1OCAqKiBkYXRhLCBpbnQgKiBsZW4pOworCisKKy8qIEZ1bmN0aW9uCQk6CWRpYW1lYXBfZWFwX2NoZWNoX2NvZGUKKyAqCisgKiBQYXJhbWV0ZXJzOgorICoJY29kZQkJOiAJYW4gRUFQIENvZGUgdmFsdWUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCUNoZWNrIGlmIHRoZSBjb2RlIHZhbHVlIGlzIHZhbGlkIG9yIG5vdAorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlUUlVFCQk6IAlpZiB2YWxpZCB2YWx1ZQorICogCUZBTFNFCQk6IAlpZiBub3QgdmFsaWQgdmFsdWUKKyAqCisgKi8KKworYm9vbGVhbiBkaWFtZWFwX2VhcF9jaGVja19jb2RlKGVhcF9jb2RlIGNvZGUpOworCisKKy8qIEZ1bmN0aW9uCQk6CWRpYW1lYXBfZWFwX2R1bXAKKyAqCisgKiBQYXJhbWV0ZXJzOgorICoJZWFwUGFja2V0CToJYW4gRUFQIFBhY2tldAorICoJbGV2ZWwJCToJRGVidWcgbGV2ZWwKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCUR1bXAgdGhlIHN0cnVjdHVyZSBhbmQgdGhlIGNvbnRlbnQgb2YgYWxsIHRoZSBmaWVsZHMgaW4gdGhpcyBFQVAgUGFja2V0CisgKgorICovCisKK3ZvaWQgZGlhbWVhcF9lYXBfZHVtcChpbnQgbGV2ZWwsIHN0cnVjdCBlYXBfcGFja2V0ICplYXBQYWNrZXQpOworCisKKy8qIEZ1bmN0aW9uCQk6CWRpYW1lYXBfZWFwX25ldworICoKKyAqIFBhcmFtZXRlcnM6CisgKgljb2RlCQk6CUVBUCBDT0RFIGZpZWxkIHZhbHVlCisgKglpZAkJCToJRUFQIElkZW50aWZpZXIgZmllbGQgdmFsdWUKKyAqCXR5cGUJCToJKG9wdGlvbmFsKSBFQVAgdHlwZSBmaWVsZCB2YWx1ZSBpZiBleGlzdCwgb3RoZXJ3aXNlIE5VTEwKKyAqCWRhdGEJCToJKG9wdGlvbmFsKSBFQVAgZGF0YSBmaWVsZCB2YWx1ZSBpZiBleGlzdCwgb3RoZXJ3aXNlIE5VTEwKKyAqCWRhdGFMZW5ndGgJOgkob3B0aW9uYWwpIExlbmd0aCBvZiB0aGUgZGF0YSB0byBiZSBpbnNlcnRlZCBpbiB0aGUgUGFja2V0LCBvdGhlcndpc2UgMAorICoJZWFwcGFja2V0CToJb24gc3VjY2Vzc2Z1bCByZXR1cm4sIHBvaW50ZXIgdG8gZWFwIHBhY2tldCBpcyBzdG9yZWQgaGVyZS4KKyAqIERlc2NyaXB0aW9uOgorICoJQ3JlYXRlIGEgbmV3IEVBUCBQYWNrZXQgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMgYW5kIGRhdGEKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKgkwCQkJOiAJaWYgc3VjY2Vzc2Z1bAorICoJRUlOVkFMCQk6CUludmFsaWQgcGFyYW1ldGVyCisgKi8KKworaW50IGRpYW1lYXBfZWFwX25ldyhlYXBfY29kZSBjb2RlLCB1OCBpZCwgZWFwX3R5cGUgdHlwZSwKKwkJdTggKiBkYXRhLCB1MTYgZGF0YUxlbmd0aCwgc3RydWN0IGVhcF9wYWNrZXQgKmVhcHBhY2tldCk7CisKKyNlbmRpZiAvKiBESUFNRUFQX0VBUFBBQ0tFVF9IXyAqLwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9hcHBfZGlhbWVhcC9kaWFtZWFwX2luaXQuYyBiL2V4dGVuc2lvbnMvYXBwX2RpYW1lYXAvZGlhbWVhcF9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNiOGNjOQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvYXBwX2RpYW1lYXAvZGlhbWVhcF9pbml0LmMKQEAgLTAsMCArMSw0MjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKQorICogQXV0aG9yIDogU291aGVpbCBCZW4gQXllZCA8c291aGVpbEB0ZXJhLmljcy5rZWlvLmFjLmpwPgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOS0yMDEwLCBTb3VoZWlsIEJlbiBBeWVkLCBUZXJhb2thIExhYm9yYXRvcnkgb2YgS2VpbyBVbml2ZXJzaXR5LCBhbmQgdGhlIFdJREUgUHJvamVjdAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgU291aGVpbCBCZW4gQXllZCA8c291aGVpbEB0ZXJhLmljcy5rZWlvLmFjLmpwPi4KKyAqCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNvdWhlaWwgQmVuIEF5ZWQsIFRlcmFva2EgTGFib3JhdG9yeSBvZiBLZWlvIFVuaXZlcnNpdHkgb3IgdGhlIFdJREUgUHJvamVjdCBub3IgdGhlCisgKiAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAnJ0FTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2luY2x1ZGUgImRpYW1lYXBfY29tbW9uLmgiCisKKy8qIERpY3Rpb25hcnkgT2JqZWN0IHRlbXBsYXRlcyAqLworc3RydWN0IGRpY3Rfb2JqZWN0ICogZGF0YW9ial9kaWFtZWFwX2NtZCA9IE5VTEw7IC8qIERpYW1ldGVyLUVBUC1SZXF1ZXN0IENvbW1hbmQgQ29kZSAqLworc3RydWN0IGRpY3Rfb2JqZWN0ICogZGF0YW9ial9kaWFtZWFwX2FwcCA9IE5VTEw7IC8qIERpYW1ldGVyIEVBUCBBcHBsaWNhdGlvbiBvYmplY3QgKi8KK3N0cnVjdCBkaWN0X29iamVjdCAqIGRhdGFvYmpfZGlhbWVhcF92ZW4gPSBOVUxMOyAvKiBEaWFtZXRlciBFQVAgQXBwbGljYXRpb24gVmVuZG9yIG9iamVjdCAqLworc3RydWN0IGRpY3Rfb2JqZWN0ICogZGF0YW9ial9hY2NvdW50aW5nX2VhcF9hdXRoX21ldGhvZCA9IE5VTEw7CitzdHJ1Y3QgZGljdF9vYmplY3QgKiBkYXRhb2JqX2FjY3RfaW50ZXJpbV9pbnRlcnZhbCA9IE5VTEw7CitzdHJ1Y3QgZGljdF9vYmplY3QgKiBkYXRhb2JqX2F1dGhfYXBwbGljYXRpb25faWQgPSBOVUxMOworc3RydWN0IGRpY3Rfb2JqZWN0ICogZGF0YW9ial9hdXRoX2dyYWNlX3BlcmlvZCA9IE5VTEw7CitzdHJ1Y3QgZGljdF9vYmplY3QgKiBkYXRhb2JqX2F1dGhfcmVxdWVzdF90eXBlID0gTlVMTDsKK3N0cnVjdCBkaWN0X29iamVjdCAqIGRhdGFvYmpfYXV0aF9zZXNzaW9uX3N0YXRlID0gTlVMTDsKK3N0cnVjdCBkaWN0X29iamVjdCAqIGRhdGFvYmpfYXV0aG9yaXphdGlvbl9saWZldGltZSA9IE5VTEw7CitzdHJ1Y3QgZGljdF9vYmplY3QgKiBkYXRhb2JqX2NhbGxiYWNrX2lkID0gTlVMTDsKK3N0cnVjdCBkaWN0X29iamVjdCAqIGRhdGFvYmpfY2FsbGJhY2tfbnVtYmVyID0gTlVMTDsKK3N0cnVjdCBkaWN0X29iamVjdCAqIGRhdGFvYmpfY2FsbGVkX3N0YXRpb25faWQgPSBOVUxMOworc3RydWN0IGRpY3Rfb2JqZWN0ICogZGF0YW9ial9jYWxsaW5nX3N0YXRpb25faWQgPSBOVUxMOworc3RydWN0IGRpY3Rfb2JqZWN0ICogZGF0YW9ial9jbGFzcyA9IE5VTEw7CitzdHJ1Y3QgZGljdF9vYmplY3QgKiBkYXRhb2JqX2NvbmZpZ3VyYXRpb25fdG9rZW4gPSBOVUxMOworc3RydWN0IGRpY3Rfb2JqZWN0ICogZGF0YW9ial9jb25uZWN0X2luZm8gPSBOVUxMOworc3RydWN0IGRpY3Rfb2JqZWN0ICogZGF0YW9ial9kZXN0aW5hdGlvbl9ob3N0ID0gTlVMTDsKK3N0cnVjdCBkaWN0X29iamVjdCAqIGRhdGFvYmpfZGVzdGluYXRpb25fcmVhbG0gPSBOVUxMOworc3RydWN0IGRpY3Rfb2JqZWN0ICogZGF0YW9ial9lYXBfbWFzdGVyX3Nlc3Npb25fa2V5ID0gTlVMTDsKK3N0cnVjdCBkaWN0X29iamVjdCAqIGRhdGFvYmpfZWFwX2tleV9uYW1lID0gTlVMTDsKK3N0cnVjdCBkaWN0X29iamVjdCAqIGRhdGFvYmpfZWFwX3BheWxvYWQgPSBOVUxMOworc3RydWN0IGRpY3Rfb2JqZWN0ICogZGF0YW9ial9lYXBfcmVpc3N1ZWRfcGF5bG9hZCA9IE5VTEw7CitzdHJ1Y3QgZGljdF9vYmplY3QgKiBkYXRhb2JqX2Vycm9yX21lc3NhZ2UgPSBOVUxMOworc3RydWN0IGRpY3Rfb2JqZWN0ICogZGF0YW9ial9lcnJvcl9yZXBvcnRpbmdfaG9zdCA9IE5VTEw7CitzdHJ1Y3QgZGljdF9vYmplY3QgKiBkYXRhb2JqX2ZhaWxlZF9hdnAgPSBOVUxMOworc3RydWN0IGRpY3Rfb2JqZWN0ICogZGF0YW9ial9maWx0ZXJfaWQgPSBOVUxMOworc3RydWN0IGRpY3Rfb2JqZWN0ICogZGF0YW9ial9mcmFtZWRfYXBwbGV0YWxrX2xpbmsgPSBOVUxMOworc3RydWN0IGRpY3Rfb2JqZWN0ICogZGF0YW9ial9mcmFtZWRfYXBwbGV0YWxrX25ldHdvcmsgPSBOVUxMOworc3RydWN0IGRpY3Rfb2JqZWN0ICogZGF0YW9ial9mcmFtZWRfYXBwbGV0YWxrX3pvbmUgPSBOVUxMOworc3RydWN0IGRpY3Rfb2JqZWN0ICogZGF0YW9ial9mcmFtZWRfY29tcHJlc3Npb24gPSBOVUxMOworc3RydWN0IGRpY3Rfb2JqZWN0ICogZGF0YW9ial9mcmFtZWRfaW50ZXJmYWNlX2lkID0gTlVMTDsKK3N0cnVjdCBkaWN0X29iamVjdCAqIGRhdGFvYmpfZnJhbWVkX2lwX2FkZHJlc3MgPSBOVUxMOworc3RydWN0IGRpY3Rfb2JqZWN0ICogZGF0YW9ial9mcmFtZWRfaXBfbmV0bWFzayA9IE5VTEw7CitzdHJ1Y3QgZGljdF9vYmplY3QgKiBkYXRhb2JqX2ZyYW1lZF9pcHY2X3ByZWZpeCA9IE5VTEw7CitzdHJ1Y3QgZGljdF9vYmplY3QgKiBkYXRhb2JqX2ZyYW1lZF9pcHY2X3Bvb2wgPSBOVUxMOworc3RydWN0IGRpY3Rfb2JqZWN0ICogZGF0YW9ial9mcmFtZWRfaXB2Nl9yb3V0ZSA9IE5VTEw7CitzdHJ1Y3QgZGljdF9vYmplY3QgKiBkYXRhb2JqX2ZyYW1lZF9pcHhfbmV0d29yayA9IE5VTEw7CitzdHJ1Y3QgZGljdF9vYmplY3QgKiBkYXRhb2JqX2ZyYW1lZF9tdHUgPSBOVUxMOworc3RydWN0IGRpY3Rfb2JqZWN0ICogZGF0YW9ial9mcmFtZWRfcG9vbCA9IE5VTEw7CitzdHJ1Y3QgZGljdF9vYmplY3QgKiBkYXRhb2JqX2ZyYW1lZF9wcm90b2NvbCA9IE5VTEw7CitzdHJ1Y3QgZGljdF9vYmplY3QgKiBkYXRhb2JqX2ZyYW1lZF9yb3V0ZSA9IE5VTEw7CitzdHJ1Y3QgZGljdF9vYmplY3QgKiBkYXRhb2JqX2ZyYW1lZF9yb3V0aW5nID0gTlVMTDsKK3N0cnVjdCBkaWN0X29iamVjdCAqIGRhdGFvYmpfaWRsZV90aW1lb3V0ID0gTlVMTDsKK3N0cnVjdCBkaWN0X29iamVjdCAqIGRhdGFvYmpfbXVsdGlfcm91bmRfdGltZV9vdXQgPSBOVUxMOworc3RydWN0IGRpY3Rfb2JqZWN0ICogZGF0YW9ial9uYXNfZmlsdGVyX3J1bGUgPSBOVUxMOworc3RydWN0IGRpY3Rfb2JqZWN0ICogZGF0YW9ial9uYXNfaWRlbnRpZmllciA9IE5VTEw7CitzdHJ1Y3QgZGljdF9vYmplY3QgKiBkYXRhb2JqX25hc19pcF9hZGRyZXNzID0gTlVMTDsKK3N0cnVjdCBkaWN0X29iamVjdCAqIGRhdGFvYmpfbmFzX2lwdjZfYWRkcmVzcyA9IE5VTEw7CitzdHJ1Y3QgZGljdF9vYmplY3QgKiBkYXRhb2JqX25hc19wb3J0ID0gTlVMTDsKK3N0cnVjdCBkaWN0X29iamVjdCAqIGRhdGFvYmpfbmFzX3BvcnRfaWQgPSBOVUxMOworc3RydWN0IGRpY3Rfb2JqZWN0ICogZGF0YW9ial9uYXNfcG9ydF90eXBlID0gTlVMTDsKK3N0cnVjdCBkaWN0X29iamVjdCAqIGRhdGFvYmpfb3JpZ2luYXRpbmdfbGluZV9pbmZvID0gTlVMTDsKK3N0cnVjdCBkaWN0X29iamVjdCAqIGRhdGFvYmpfb3JpZ2luX2hvc3QgPSBOVUxMOworc3RydWN0IGRpY3Rfb2JqZWN0ICogZGF0YW9ial9vcmlnaW5fcmVhbG0gPSBOVUxMOworc3RydWN0IGRpY3Rfb2JqZWN0ICogZGF0YW9ial9vcmlnaW5fc3RhdGVfaWQgPSBOVUxMOworc3RydWN0IGRpY3Rfb2JqZWN0ICogZGF0YW9ial9wb3J0X2xpbWl0ID0gTlVMTDsKK3N0cnVjdCBkaWN0X29iamVjdCAqIGRhdGFvYmpfcHJveHlfaW5mbyA9IE5VTEw7CitzdHJ1Y3QgZGljdF9vYmplY3QgKiBkYXRhb2JqX3Fvc19maWx0ZXJfcnVsZSA9IE5VTEw7CitzdHJ1Y3QgZGljdF9vYmplY3QgKiBkYXRhb2JqX3JlX2F1dGhfcmVxdWVzdF90eXBlID0gTlVMTDsKK3N0cnVjdCBkaWN0X29iamVjdCAqIGRhdGFvYmpfcmVkaXJlY3RfaG9zdCA9IE5VTEw7CitzdHJ1Y3QgZGljdF9vYmplY3QgKiBkYXRhb2JqX3JlZGlyZWN0X2hvc3RfdXNhZ2UgPSBOVUxMOworc3RydWN0IGRpY3Rfb2JqZWN0ICogZGF0YW9ial9yZWRpcmVjdF9tYXhfY2FjaGVfdGltZSA9IE5VTEw7CitzdHJ1Y3QgZGljdF9vYmplY3QgKiBkYXRhb2JqX3JlcGx5X21lc3NhZ2UgPSBOVUxMOworc3RydWN0IGRpY3Rfb2JqZWN0ICogZGF0YW9ial9yZXN1bHRfY29kZSA9IE5VTEw7CitzdHJ1Y3QgZGljdF9vYmplY3QgKiBkYXRhb2JqX3JvdXRlX3JlY29yZCA9IE5VTEw7CitzdHJ1Y3QgZGljdF9vYmplY3QgKiBkYXRhb2JqX3NlcnZpY2VfdHlwZSA9IE5VTEw7CitzdHJ1Y3QgZGljdF9vYmplY3QgKiBkYXRhb2JqX3Nlc3Npb25faWQgPSBOVUxMOworc3RydWN0IGRpY3Rfb2JqZWN0ICogZGF0YW9ial9zZXNzaW9uX3RpbWVvdXQgPSBOVUxMOworc3RydWN0IGRpY3Rfb2JqZWN0ICogZGF0YW9ial9zdGF0ZSA9IE5VTEw7CitzdHJ1Y3QgZGljdF9vYmplY3QgKiBkYXRhb2JqX3R1bm5lbGluZyA9IE5VTEw7CitzdHJ1Y3QgZGljdF9vYmplY3QgKiBkYXRhb2JqX3VzZXJfbmFtZSA9IE5VTEw7CisKKworCitzdGF0aWMgaW50IGRpYW1lYXBfaW5pdF9jb25maWcoY2hhciAqIGNvbmZmaWxlKQoreworCVRSQUNFX0VOVFJZKCIlcCIsY29uZmZpbGUpOworCisJaWYgKGNvbmZmaWxlICE9IE5VTEwpCisJeworCQlkaWFtZWFwX2NvbmZpZy0+Y29uZmZpbGUgPSBjb25mZmlsZTsKKwl9CisJZWxzZQorCXsKKwkJVFJBQ0VfREVCVUcoRlVMTCwiJXNObyBjb25maWd1cmF0aW9uIGZpbGUgcHJvdmlkZWQgd2l0aCB0aGUgRGlhbUVBUCBleHRlbnNpb246IGRlZmF1bHQgcGFyYW1ldGVycyB3aWxsIGJlIHVzZWQuIixESUFNRUFQX0VYVEVOU0lPTik7CisJfQorCisJZGlhbWVhcF9jb25maWctPmFwcGxpY2F0aW9uX2lkID0gNTsKKwlkaWFtZWFwX2NvbmZpZy0+dmVuZG9yX2lkID0gMDsKKwlkaWFtZWFwX2NvbmZpZy0+Y29tbWFuZF9jb2RlID0gMjY4OworCWRpYW1lYXBfY29uZmlnLT5kaWFtX3JlYWxtID0gc3RyZHVwKGZkX2dfY29uZmlnLT5jbmZfZGlhbXJsbSk7CisJZGlhbWVhcF9jb25maWctPm1heF9pbnZhbGlkX2VhcF9wYWNrZXQgPSA1OworCWRpYW1lYXBfY29uZmlnLT5tdWx0aV9yb3VuZF90aW1lX291dCA9IDMwOworCWNoZWNrX3VzZXJfaWRlbnRpdHkgPSBUUlVFOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGlhbWVhcF9pbml0X29iaih2b2lkKQoreworCisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FQUExJQ0FUSU9OLCBBUFBMSUNBVElPTl9CWV9JRCwgJihkaWFtZWFwX2NvbmZpZy0+YXBwbGljYXRpb25faWQpLCZkYXRhb2JqX2RpYW1lYXBfYXBwLCBFTk9FTlQpKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQ09NTUFORCxDTURfQllfQ09ERV9SLCAmKGRpYW1lYXBfY29uZmlnLT5jb21tYW5kX2NvZGUpLCAmZGF0YW9ial9kaWFtZWFwX2NtZCwgRU5PRU5UKSk7CisJLy8JQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1ZFTkRPUixWRU5ET1JfT0ZfQVBQTElDQVRJT04sICZkYXRhb2JqX2RpYW1lYXBfYXBwLCAmZGF0YW9ial9kaWFtZWFwX3ZlbixFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKGZkX2RpY3Rfc2VhcmNoKGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLAorCQkJCQkiQWNjb3VudGluZy1FQVAtQXV0aC1NZXRob2QiLCAmZGF0YW9ial9hY2NvdW50aW5nX2VhcF9hdXRoX21ldGhvZCwKKwkJCQkJRU5PRU5UKSk7CisJQ0hFQ0tfRkNUKGZkX2RpY3Rfc2VhcmNoKGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLAorCQkJCQkiQWNjdC1JbnRlcmltLUludGVydmFsIiwgJmRhdGFvYmpfYWNjdF9pbnRlcmltX2ludGVydmFsLCBFTk9FTlQpKTsKKwlDSEVDS19GQ1QoZmRfZGljdF9zZWFyY2goZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsCisJCQkJCSJBdXRoLUFwcGxpY2F0aW9uLUlkIiwgJmRhdGFvYmpfYXV0aF9hcHBsaWNhdGlvbl9pZCwgRU5PRU5UKSk7CisJQ0hFQ0tfRkNUKGZkX2RpY3Rfc2VhcmNoKGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLAorCQkJCQkiQXV0aC1HcmFjZS1QZXJpb2QiLCAmZGF0YW9ial9hdXRoX2dyYWNlX3BlcmlvZCwgRU5PRU5UKSk7CisJQ0hFQ0tfRkNUKGZkX2RpY3Rfc2VhcmNoKGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLAorCQkJCQkiQXV0aC1SZXF1ZXN0LVR5cGUiLCAmZGF0YW9ial9hdXRoX3JlcXVlc3RfdHlwZSwgRU5PRU5UKSk7CisJQ0hFQ0tfRkNUKGZkX2RpY3Rfc2VhcmNoKGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLAorCQkJCQkiQXV0aC1TZXNzaW9uLVN0YXRlIiwgJmRhdGFvYmpfYXV0aF9zZXNzaW9uX3N0YXRlLCBFTk9FTlQpKTsKKwlDSEVDS19GQ1QoZmRfZGljdF9zZWFyY2goZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsCisJCQkJCSJBdXRob3JpemF0aW9uLUxpZmV0aW1lIiwgJmRhdGFvYmpfYXV0aG9yaXphdGlvbl9saWZldGltZSwgRU5PRU5UKSk7CisJQ0hFQ0tfRkNUKGZkX2RpY3Rfc2VhcmNoKGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLAorCQkJCQkiQ2FsbGJhY2stSWQiLCAmZGF0YW9ial9jYWxsYmFja19pZCwgRU5PRU5UKSk7CisJQ0hFQ0tfRkNUKGZkX2RpY3Rfc2VhcmNoKGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLAorCQkJCQkiQ2FsbGJhY2stTnVtYmVyIiwgJmRhdGFvYmpfY2FsbGJhY2tfbnVtYmVyLCBFTk9FTlQpKTsKKwlDSEVDS19GQ1QoZmRfZGljdF9zZWFyY2goZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsCisJCQkJCSJDYWxsZWQtU3RhdGlvbi1JZCIsICZkYXRhb2JqX2NhbGxlZF9zdGF0aW9uX2lkLCBFTk9FTlQpKTsKKwlDSEVDS19GQ1QoZmRfZGljdF9zZWFyY2goZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsCisJCQkJCSJDYWxsaW5nLVN0YXRpb24tSWQiLCAmZGF0YW9ial9jYWxsaW5nX3N0YXRpb25faWQsIEVOT0VOVCkpOworCUNIRUNLX0ZDVChmZF9kaWN0X3NlYXJjaChmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwKKwkJCQkJIkNsYXNzIiwgJmRhdGFvYmpfY2xhc3MsIEVOT0VOVCkpOworCUNIRUNLX0ZDVChmZF9kaWN0X3NlYXJjaChmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwKKwkJCQkJIkNvbmZpZ3VyYXRpb24tVG9rZW4iLCAmZGF0YW9ial9jb25maWd1cmF0aW9uX3Rva2VuLCBFTk9FTlQpKTsKKwlDSEVDS19GQ1QoZmRfZGljdF9zZWFyY2goZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsCisJCQkJCSJDb25uZWN0LUluZm8iLCAmZGF0YW9ial9jb25uZWN0X2luZm8sIEVOT0VOVCkpOworCUNIRUNLX0ZDVChmZF9kaWN0X3NlYXJjaChmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwKKwkJCQkJIkRlc3RpbmF0aW9uLUhvc3QiLCAmZGF0YW9ial9kZXN0aW5hdGlvbl9ob3N0LCBFTk9FTlQpKTsKKwlDSEVDS19GQ1QoZmRfZGljdF9zZWFyY2goZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsCisJCQkJCSJEZXN0aW5hdGlvbi1SZWFsbSIsICZkYXRhb2JqX2Rlc3RpbmF0aW9uX3JlYWxtLCBFTk9FTlQpKTsKKwlDSEVDS19GQ1QoZmRfZGljdF9zZWFyY2goZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsCisJCQkJCSJFQVAtTWFzdGVyLVNlc3Npb24tS2V5IiwgJmRhdGFvYmpfZWFwX21hc3Rlcl9zZXNzaW9uX2tleSwgRU5PRU5UKSk7CisJQ0hFQ0tfRkNUKGZkX2RpY3Rfc2VhcmNoKGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLAorCQkJCQkiRUFQLUtleS1OYW1lIiwgJmRhdGFvYmpfZWFwX2tleV9uYW1lLCBFTk9FTlQpKTsKKwlDSEVDS19GQ1QoZmRfZGljdF9zZWFyY2goZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsCisJCQkJCSJFQVAtUGF5bG9hZCIsICZkYXRhb2JqX2VhcF9wYXlsb2FkLCBFTk9FTlQpKTsKKwlDSEVDS19GQ1QoZmRfZGljdF9zZWFyY2goZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsCisJCQkJCSJFQVAtUmVpc3N1ZWQtUGF5bG9hZCIsICZkYXRhb2JqX2VhcF9yZWlzc3VlZF9wYXlsb2FkLCBFTk9FTlQpKTsKKwlDSEVDS19GQ1QoZmRfZGljdF9zZWFyY2goZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsCisJCQkJCSJFcnJvci1NZXNzYWdlIiwgJmRhdGFvYmpfZXJyb3JfbWVzc2FnZSwgRU5PRU5UKSk7CisJQ0hFQ0tfRkNUKGZkX2RpY3Rfc2VhcmNoKGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLAorCQkJCQkiRXJyb3ItUmVwb3J0aW5nLUhvc3QiLCAmZGF0YW9ial9lcnJvcl9yZXBvcnRpbmdfaG9zdCwgRU5PRU5UKSk7CisJQ0hFQ0tfRkNUKGZkX2RpY3Rfc2VhcmNoKGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLAorCQkJCQkiRmFpbGVkLUFWUCIsICZkYXRhb2JqX2ZhaWxlZF9hdnAsIEVOT0VOVCkpOworCUNIRUNLX0ZDVChmZF9kaWN0X3NlYXJjaChmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwKKwkJCQkJIkZpbHRlci1JZCIsICZkYXRhb2JqX2ZpbHRlcl9pZCwgRU5PRU5UKSk7CisJQ0hFQ0tfRkNUKGZkX2RpY3Rfc2VhcmNoKGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLAorCQkJCQkiRnJhbWVkLUFwcGxlVGFsay1MaW5rIiwgJmRhdGFvYmpfZnJhbWVkX2FwcGxldGFsa19saW5rLCBFTk9FTlQpKTsKKwlDSEVDS19GQ1QoZmRfZGljdF9zZWFyY2goZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsCisJCQkJCSJGcmFtZWQtQXBwbGVUYWxrLU5ldHdvcmsiLCAmZGF0YW9ial9mcmFtZWRfYXBwbGV0YWxrX25ldHdvcmssCisJCQkJCUVOT0VOVCkpOworCUNIRUNLX0ZDVChmZF9kaWN0X3NlYXJjaChmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwKKwkJCQkJIkZyYW1lZC1BcHBsZVRhbGstWm9uZSIsICZkYXRhb2JqX2ZyYW1lZF9hcHBsZXRhbGtfem9uZSwgRU5PRU5UKSk7CisJQ0hFQ0tfRkNUKGZkX2RpY3Rfc2VhcmNoKGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLAorCQkJCQkiRnJhbWVkLUNvbXByZXNzaW9uIiwgJmRhdGFvYmpfZnJhbWVkX2NvbXByZXNzaW9uLCBFTk9FTlQpKTsKKwlDSEVDS19GQ1QoZmRfZGljdF9zZWFyY2goZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsCisJCQkJCSJGcmFtZWQtSW50ZXJmYWNlLUlkIiwgJmRhdGFvYmpfZnJhbWVkX2ludGVyZmFjZV9pZCwgRU5PRU5UKSk7CisJQ0hFQ0tfRkNUKGZkX2RpY3Rfc2VhcmNoKGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLAorCQkJCQkiRnJhbWVkLUlQLUFkZHJlc3MiLCAmZGF0YW9ial9mcmFtZWRfaXBfYWRkcmVzcywgRU5PRU5UKSk7CisJQ0hFQ0tfRkNUKGZkX2RpY3Rfc2VhcmNoKGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLAorCQkJCQkiRnJhbWVkLUlQLU5ldG1hc2siLCAmZGF0YW9ial9mcmFtZWRfaXBfbmV0bWFzaywgRU5PRU5UKSk7CisJQ0hFQ0tfRkNUKGZkX2RpY3Rfc2VhcmNoKGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLAorCQkJCQkiRnJhbWVkLUlQdjYtUHJlZml4IiwgJmRhdGFvYmpfZnJhbWVkX2lwdjZfcHJlZml4LCBFTk9FTlQpKTsKKwlDSEVDS19GQ1QoZmRfZGljdF9zZWFyY2goZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsCisJCQkJCSJGcmFtZWQtSVB2Ni1Qb29sIiwgJmRhdGFvYmpfZnJhbWVkX2lwdjZfcG9vbCwgRU5PRU5UKSk7CisJQ0hFQ0tfRkNUKGZkX2RpY3Rfc2VhcmNoKGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLAorCQkJCQkiRnJhbWVkLUlQdjYtUm91dGUiLCAmZGF0YW9ial9mcmFtZWRfaXB2Nl9yb3V0ZSwgRU5PRU5UKSk7CisJQ0hFQ0tfRkNUKGZkX2RpY3Rfc2VhcmNoKGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLAorCQkJCQkiRnJhbWVkLUlQWC1OZXR3b3JrIiwgJmRhdGFvYmpfZnJhbWVkX2lweF9uZXR3b3JrLCBFTk9FTlQpKTsKKwlDSEVDS19GQ1QoZmRfZGljdF9zZWFyY2goZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsCisJCQkJCSJGcmFtZWQtTVRVIiwgJmRhdGFvYmpfZnJhbWVkX210dSwgRU5PRU5UKSk7CisJQ0hFQ0tfRkNUKGZkX2RpY3Rfc2VhcmNoKGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLAorCQkJCQkiRnJhbWVkLVBvb2wiLCAmZGF0YW9ial9mcmFtZWRfcG9vbCwgRU5PRU5UKSk7CisJQ0hFQ0tfRkNUKGZkX2RpY3Rfc2VhcmNoKGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLAorCQkJCQkiRnJhbWVkLVByb3RvY29sIiwgJmRhdGFvYmpfZnJhbWVkX3Byb3RvY29sLCBFTk9FTlQpKTsKKwlDSEVDS19GQ1QoZmRfZGljdF9zZWFyY2goZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsCisJCQkJCSJGcmFtZWQtUm91dGUiLCAmZGF0YW9ial9mcmFtZWRfcm91dGUsIEVOT0VOVCkpOworCUNIRUNLX0ZDVChmZF9kaWN0X3NlYXJjaChmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwKKwkJCQkJIkZyYW1lZC1Sb3V0aW5nIiwgJmRhdGFvYmpfZnJhbWVkX3JvdXRpbmcsIEVOT0VOVCkpOworCUNIRUNLX0ZDVChmZF9kaWN0X3NlYXJjaChmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwKKwkJCQkJIklkbGUtVGltZW91dCIsICZkYXRhb2JqX2lkbGVfdGltZW91dCwgRU5PRU5UKSk7CisJQ0hFQ0tfRkNUKGZkX2RpY3Rfc2VhcmNoKGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLAorCQkJCQkiTXVsdGktUm91bmQtVGltZS1PdXQiLCAmZGF0YW9ial9tdWx0aV9yb3VuZF90aW1lX291dCwgRU5PRU5UKSk7CisJQ0hFQ0tfRkNUKGZkX2RpY3Rfc2VhcmNoKGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLAorCQkJCQkiTkFTLUZpbHRlci1SdWxlIiwgJmRhdGFvYmpfbmFzX2ZpbHRlcl9ydWxlLCBFTk9FTlQpKTsKKwlDSEVDS19GQ1QoZmRfZGljdF9zZWFyY2goZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsCisJCQkJCSJOQVMtSWRlbnRpZmllciIsICZkYXRhb2JqX25hc19pZGVudGlmaWVyLCBFTk9FTlQpKTsKKwlDSEVDS19GQ1QoZmRfZGljdF9zZWFyY2goZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsCisJCQkJCSJOQVMtSVAtQWRkcmVzcyIsICZkYXRhb2JqX25hc19pcF9hZGRyZXNzLCBFTk9FTlQpKTsKKwlDSEVDS19GQ1QoZmRfZGljdF9zZWFyY2goZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsCisJCQkJCSJOQVMtSVB2Ni1BZGRyZXNzIiwgJmRhdGFvYmpfbmFzX2lwdjZfYWRkcmVzcywgRU5PRU5UKSk7CisJQ0hFQ0tfRkNUKGZkX2RpY3Rfc2VhcmNoKGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLAorCQkJCQkiTkFTLVBvcnQiLCAmZGF0YW9ial9uYXNfcG9ydCwgRU5PRU5UKSk7CisJQ0hFQ0tfRkNUKGZkX2RpY3Rfc2VhcmNoKGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLAorCQkJCQkiTkFTLVBvcnQtSWQiLCAmZGF0YW9ial9uYXNfcG9ydF9pZCwgRU5PRU5UKSk7CisJQ0hFQ0tfRkNUKGZkX2RpY3Rfc2VhcmNoKGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLAorCQkJCQkiTkFTLVBvcnQtVHlwZSIsICZkYXRhb2JqX25hc19wb3J0X3R5cGUsIEVOT0VOVCkpOworCUNIRUNLX0ZDVChmZF9kaWN0X3NlYXJjaChmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwKKwkJCQkJIk9yaWdpbmF0aW5nLUxpbmUtSW5mbyIsICZkYXRhb2JqX29yaWdpbmF0aW5nX2xpbmVfaW5mbywgRU5PRU5UKSk7CisJQ0hFQ0tfRkNUKGZkX2RpY3Rfc2VhcmNoKGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLAorCQkJCQkiT3JpZ2luLUhvc3QiLCAmZGF0YW9ial9vcmlnaW5faG9zdCwgRU5PRU5UKSk7CisJQ0hFQ0tfRkNUKGZkX2RpY3Rfc2VhcmNoKGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLAorCQkJCQkiT3JpZ2luLVJlYWxtIiwgJmRhdGFvYmpfb3JpZ2luX3JlYWxtLCBFTk9FTlQpKTsKKwlDSEVDS19GQ1QoZmRfZGljdF9zZWFyY2goZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsCisJCQkJCSJPcmlnaW4tU3RhdGUtSWQiLCAmZGF0YW9ial9vcmlnaW5fc3RhdGVfaWQsIEVOT0VOVCkpOworCUNIRUNLX0ZDVChmZF9kaWN0X3NlYXJjaChmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwKKwkJCQkJIlBvcnQtTGltaXQiLCAmZGF0YW9ial9wb3J0X2xpbWl0LCBFTk9FTlQpKTsKKwlDSEVDS19GQ1QoZmRfZGljdF9zZWFyY2goZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsCisJCQkJCSJQcm94eS1JbmZvIiwgJmRhdGFvYmpfcHJveHlfaW5mbywgRU5PRU5UKSk7CisJQ0hFQ0tfRkNUKGZkX2RpY3Rfc2VhcmNoKGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLAorCQkJCQkiUW9TLUZpbHRlci1SdWxlIiwgJmRhdGFvYmpfcW9zX2ZpbHRlcl9ydWxlLCBFTk9FTlQpKTsKKwlDSEVDS19GQ1QoZmRfZGljdF9zZWFyY2goZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsCisJCQkJCSJSZS1BdXRoLVJlcXVlc3QtVHlwZSIsICZkYXRhb2JqX3JlX2F1dGhfcmVxdWVzdF90eXBlLCBFTk9FTlQpKTsKKwlDSEVDS19GQ1QoZmRfZGljdF9zZWFyY2goZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsCisJCQkJCSJSZWRpcmVjdC1Ib3N0IiwgJmRhdGFvYmpfcmVkaXJlY3RfaG9zdCwgRU5PRU5UKSk7CisJQ0hFQ0tfRkNUKGZkX2RpY3Rfc2VhcmNoKGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLAorCQkJCQkiUmVkaXJlY3QtSG9zdC1Vc2FnZSIsICZkYXRhb2JqX3JlZGlyZWN0X2hvc3RfdXNhZ2UsIEVOT0VOVCkpOworCUNIRUNLX0ZDVCgKKwkJCWZkX2RpY3Rfc2VhcmNoKGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLAorCQkJCQkiUmVkaXJlY3QtTWF4LUNhY2hlLVRpbWUiLAorCQkJCQkmZGF0YW9ial9yZWRpcmVjdF9tYXhfY2FjaGVfdGltZSwgRU5PRU5UKSk7CisJQ0hFQ0tfRkNUKGZkX2RpY3Rfc2VhcmNoKGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLAorCQkJCQkiUmVwbHktTWVzc2FnZSIsICZkYXRhb2JqX3JlcGx5X21lc3NhZ2UsIEVOT0VOVCkpOworCUNIRUNLX0ZDVChmZF9kaWN0X3NlYXJjaChmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwKKwkJCQkJIlJlc3VsdC1Db2RlIiwgJmRhdGFvYmpfcmVzdWx0X2NvZGUsIEVOT0VOVCkpOworCUNIRUNLX0ZDVChmZF9kaWN0X3NlYXJjaChmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwKKwkJCQkJIlJvdXRlLVJlY29yZCIsICZkYXRhb2JqX3JvdXRlX3JlY29yZCwgRU5PRU5UKSk7CisJQ0hFQ0tfRkNUKGZkX2RpY3Rfc2VhcmNoKGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLAorCQkJCQkiU2VydmljZS1UeXBlIiwgJmRhdGFvYmpfc2VydmljZV90eXBlLCBFTk9FTlQpKTsKKwlDSEVDS19GQ1QoZmRfZGljdF9zZWFyY2goZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsCisJCQkJCSJTZXNzaW9uLUlkIiwgJmRhdGFvYmpfc2Vzc2lvbl9pZCwgRU5PRU5UKSk7CisJQ0hFQ0tfRkNUKGZkX2RpY3Rfc2VhcmNoKGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLAorCQkJCQkiU2Vzc2lvbi1UaW1lb3V0IiwgJmRhdGFvYmpfc2Vzc2lvbl90aW1lb3V0LCBFTk9FTlQpKTsKKwlDSEVDS19GQ1QoZmRfZGljdF9zZWFyY2goZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsCisJCQkJCSJTdGF0ZSIsICZkYXRhb2JqX3N0YXRlLCBFTk9FTlQpKTsKKwlDSEVDS19GQ1QoZmRfZGljdF9zZWFyY2goZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsCisJCQkJCSJUdW5uZWxpbmciLCAmZGF0YW9ial90dW5uZWxpbmcsIEVOT0VOVCkpOworCUNIRUNLX0ZDVChmZF9kaWN0X3NlYXJjaChmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwKKwkJCQkJIlVzZXItTmFtZSIsICZkYXRhb2JqX3VzZXJfbmFtZSwgRU5PRU5UKSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogUGFyc2UgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSAodXNpbmcgdGhlIHlhY2MgcGFyc2VyKSAqLworc3RhdGljIGludCBkaWFtZWFwX3BhcnNlX2NvbmZmaWxlKHZvaWQpCit7CisJaWYgKCFkaWFtZWFwX2NvbmZpZy0+Y29uZmZpbGUpCisJeworCQlUUkFDRV9ERUJVRyAoSU5GTywiJXNObyBjb25maWd1cmF0aW9uIGZpbGUgdG8gcGFyc2UgZm9yIERpYW1FQVAgRXh0ZW5zaW9uLiIsRElBTUVBUF9FWFRFTlNJT04pOworCQlyZXR1cm4gRUlOVkFMOworCX0KKwlleHRlcm4gRklMRSAqIGRpYW1lYXBpbjsKKworCVRSQUNFX0RFQlVHIChGVUxMLCAiJXNQYXJzaW5nIGNvbmZpZ3VyYXRpb24gZmlsZTogJXMiLERJQU1FQVBfRVhURU5TSU9OLCBkaWFtZWFwX2NvbmZpZy0+Y29uZmZpbGUpOworCWRpYW1lYXBpbiA9IGZvcGVuKGRpYW1lYXBfY29uZmlnLT5jb25mZmlsZSwgInIiKTsKKwlpZiAoIWRpYW1lYXBpbikKKwl7CisJCVRSQUNFX0RFQlVHKElORk8sIiVzVW5hYmxlIHRvIG9wZW4gY29uZmlndXJhdGlvbiBmaWxlICVzIGZvciByZWFkaW5nOiAlcyIsRElBTUVBUF9FWFRFTlNJT04sIGRpYW1lYXBfY29uZmlnLT5jb25mZmlsZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIGVycm5vOworCX0KKworCS8qIGNhbGwgeWFjYyBwYXJzZXIgKi8KKwlDSEVDS19GQ1QoZGlhbWVhcHBhcnNlKGRpYW1lYXBfY29uZmlnKSk7CisKKwkvKiBjbG9zZSB0aGUgZmlsZSAqLworCUNIRUNLX0ZDVChmY2xvc2UoZGlhbWVhcGluKSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBkaWFtZWFwX3NldF9teXNxbF9wYXJhbShjaGFyICogdXNlciwgY2hhciAqIHBhc3N3ZCwgY2hhciAqIHNlcnZlciwKKwkJY2hhciAqIGRhdGFiYXNlKQoreworCVRSQUNFX0VOVFJZKCIlcCAlcCAlcCAlcCIsdXNlcixwYXNzd2Qsc2VydmVyLGRhdGFiYXNlKTsKKwlpZiAodXNlciA9PSBOVUxMKQorCXsKKwkJVFJBQ0VfREVCVUcoSU5GTywiJXNVbmFibGUgdG8gY29ubmVjdCB0byBNeVNRTCBEYXRhYmFzZSBTZXJ2ZXI6IEVtcHR5IHVzZXIgbmFtZSBvciBtaXNzaW5nIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuIixESUFNRUFQX0VYVEVOU0lPTik7CisJCXJldHVybiBFSU5WQUw7CisJfQorCisJaWYgKHNlcnZlciA9PSBOVUxMKQorCXsKKwkJVFJBQ0VfREVCVUcoSU5GTywiJXNVbmFibGUgdG8gY29ubmVjdCB0byBNeVNRTCBEYXRhYmFzZSBTZXJ2ZXI6IE15U1FMIERhdGFiYXNlIFNlcnZlciBhZGRyZXNzIG1pc3NpbmcgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4iLERJQU1FQVBfRVhURU5TSU9OKTsKKwkJcmV0dXJuIEVJTlZBTDsKKwl9CisJaWYgKGRhdGFiYXNlID09IE5VTEwpCisJeworCQlUUkFDRV9ERUJVRyhJTkZPLCIlc1VuYWJsZSB0byBjb25uZWN0IHRvIE15U1FMIERhdGFiYXNlIFNlcnZlcjogTXlTUUwgRGF0YWJhc2UgbmFtZSBtaXNzaW5nIGluIGNvbmZpZ3VyYXRpb24gZmlsZS4iLERJQU1FQVBfRVhURU5TSU9OKTsKKwkJcmV0dXJuIEVJTlZBTDsKKwl9CisJZGlhbWVhcF9jb25maWctPmRiLnVzZXIgPSB1c2VyOworCWRpYW1lYXBfY29uZmlnLT5kYi5wYXNzd29yZCA9IHBhc3N3ZDsKKwlkaWFtZWFwX2NvbmZpZy0+ZGIuc2VydmVyID0gc2VydmVyOworCWRpYW1lYXBfY29uZmlnLT5kYi5kYXRhYmFzZSA9IGRhdGFiYXNlOworCXJldHVybiAwOworfQorCisvKiBDb25uZWN0aW5nIHRvIE15U1FMIERhdGFiYXNlICovCitpbnQgZGlhbWVhcF9teXNxbF9jb25uZWN0KHZvaWQpCit7CisJVFJBQ0VfRU5UUlkoKTsKKwlkYl9jb25uID0gbXlzcWxfaW5pdChOVUxMKTsKKwljb25zdCBteV9ib29sIG15c3FsX3JlY29ubmVjdF92YWw9MTsKKwlteXNxbF9vcHRpb25zKGRiX2Nvbm4sTVlTUUxfT1BUX1JFQ09OTkVDVCwmbXlzcWxfcmVjb25uZWN0X3ZhbCk7CisJLyogQ29ubmVjdCB0byBkYXRhYmFzZSAqLworCWlmICghbXlzcWxfcmVhbF9jb25uZWN0KGRiX2Nvbm4sIGRpYW1lYXBfY29uZmlnLT5kYi5zZXJ2ZXIsCisJCQlkaWFtZWFwX2NvbmZpZy0+ZGIudXNlciwgZGlhbWVhcF9jb25maWctPmRiLnBhc3N3b3JkLAorCQkJZGlhbWVhcF9jb25maWctPmRiLmRhdGFiYXNlLCAwLCBOVUxMLCAwKSkKKwl7CisJCVRSQUNFX0RFQlVHKElORk8sIiVzQ29ubmVjdGlvbiB0byBNeVNRTCBEYXRhYmFzZSBTZXJ2ZXIgZmFpbGVkOiAlcyIsRElBTUVBUF9FWFRFTlNJT04sIG15c3FsX2Vycm9yKGRiX2Nvbm4pKTsKKwkJcmV0dXJuIGVycm5vOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGlhbWVhcF9jb25mX2R1bXAodm9pZCkKK3sKKworCWlmICghVFJBQ0VfQk9PTChJTkZPKSkKKwkJcmV0dXJuOworCisJZmRfbG9nX2RlYnVnKCItLS0tLS0tLSBEaWFtRUFQIGV4dGVuc2lvbiA6IENvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyAoRHVtcCkgLS0tLS0tLS0tLS0tLSIpOworCWZkX2xvZ19kZWJ1ZygiXHQtQ29uZmlndXJhdGlvbiBmaWxlLi4uLi46ICVzIiwgZGlhbWVhcF9jb25maWctPmNvbmZmaWxlKTsKKwlmZF9sb2dfZGVidWcoIlx0LUVBUCBBcHBsaWNhdGlvbiBJZC4uLi4uOiAldSIsCisJCQlkaWFtZWFwX2NvbmZpZy0+YXBwbGljYXRpb25faWQpOworCWZkX2xvZ19kZWJ1ZygiXHQtRUFQIEFwcGxpY2F0aW9uIENvbW1hbmQ6ICV1IiwKKwkJCWRpYW1lYXBfY29uZmlnLT5jb21tYW5kX2NvZGUpOworCWZkX2xvZ19kZWJ1ZygiXHQtRUFQIEFwcGxpY2F0aW9uIFZlbmRvci46ICV1IiwgZGlhbWVhcF9jb25maWctPnZlbmRvcl9pZCk7CisJZmRfbG9nX2RlYnVnKCJcdC1NYXggaW52YWxpZCBFQVAgcGFja2V0czogJXUiLCBkaWFtZWFwX2NvbmZpZy0+bWF4X2ludmFsaWRfZWFwX3BhY2tldCk7CisJZmRfbG9nX2RlYnVnKCJcdC1NdWx0aS1Sb3VuZCBUaW1lb3V0Li4uLjogJXUiLCBkaWFtZWFwX2NvbmZpZy0+bXVsdGlfcm91bmRfdGltZV9vdXQpOworCWlmIChkaWFtZWFwX2NvbmZpZy0+ZGIudXNlcikKKwl7CisJCWZkX2xvZ19kZWJ1ZygiXHQtTXlTUUwgRGF0YWJhc2UgUGFyYW1zLi46Iik7CisJCWZkX2xvZ19kZWJ1ZygiXHRcdFVzZXIgLi4uLi4uLjolcyIsIGRpYW1lYXBfY29uZmlnLT5kYi51c2VyKTsKKwkJZmRfbG9nX2RlYnVnKCJcdFx0U2VydmVyIC4uLi4uOiVzIiwgZGlhbWVhcF9jb25maWctPmRiLnNlcnZlcik7CisJCWZkX2xvZ19kZWJ1ZygiXHRcdERhdGFiYXNlLi4uLjolcyIsIGRpYW1lYXBfY29uZmlnLT5kYi5kYXRhYmFzZSk7CisJfQorCisJZmRfbG9nX2RlYnVnKCJcdC1FQVAgTWV0aG9kIFBsdWdpbnMuLi4uLjogIik7CisJZGlhbWVhcF9wbHVnaW5fZHVtcCgpOworCisJZmRfbG9nX2RlYnVnKCItLS0tLS0tLSBEaWFtRUFQIGV4dGVuc2lvbiA6IENvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyAoRW5kKSAtLS0tLS0tLS0tLS0tLS0iKTsKK30KKworaW50IGRpYW1lYXBfaW5pdChjaGFyICogY29uZmZpbGUpCit7CisJVFJBQ0VfRU5UUlkoIiVwIixjb25mZmlsZSk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBkaWFtZWFwX2NvbmZpZyBzdHJ1Y3R1cmUqLworCUNIRUNLX0ZDVChkaWFtZWFwX2luaXRfY29uZmlnKGNvbmZmaWxlKSk7CisKKwlpZiAoZGlhbWVhcF9jb25maWctPmNvbmZmaWxlKQorCXsKKwkJLyogcGFyc2UgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSovCisJCUNIRUNLX0ZDVChkaWFtZWFwX3BhcnNlX2NvbmZmaWxlKCkpOworCisJCS8qIExvYWQgRUFQIG1ldGhvZHMgcGx1Zy1pbnMgKi8KKwkJQ0hFQ0tfRkNUKGRpYW1lYXBfcGx1Z2luX2xvYWQoKSk7CisKKwl9CisJZWxzZQorCXsKKwkJVFJBQ0VfREVCVUcoRlVMTCwiJXNObyBFQVAgbWV0aG9kIHBsdWctaW4gYXZhaWxhYmxlIHdpdGggYSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uIixESUFNRUFQX0VYVEVOU0lPTik7CisJfQorCisJLyogSW5pdGlhbGl6ZSBEaWN0aW9uYXJ5IHRlbXBsYXRlcyAqLworCUNIRUNLX0ZDVChkaWFtZWFwX2luaXRfb2JqKCkpOworCisJLyogSW5pdGlhbGl6ZSBhY2Nlc3MgdG8gdXNlcidzIGluZm9ybWF0aW9uIERhdGFiYXNlICovCisJQ0hFQ0tfRkNUKGRpYW1lYXBfbXlzcWxfY29ubmVjdCgpKTsKKworCS8qIER1bXAgRGlhbUVBUCBleHRlbnNpb24gY29uZmlndXJhdGlvbiAqLworCWRpYW1lYXBfY29uZl9kdW1wKCk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvYXBwX2RpYW1lYXAvZGlhbWVhcF9teXNxbC5jIGIvZXh0ZW5zaW9ucy9hcHBfZGlhbWVhcC9kaWFtZWFwX215c3FsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdhMDljNQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvYXBwX2RpYW1lYXAvZGlhbWVhcF9teXNxbC5jCkBAIC0wLDAgKzEsMjM0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkKKyAqIEF1dGhvciA6IFNvdWhlaWwgQmVuIEF5ZWQgPHNvdWhlaWxAdGVyYS5pY3Mua2Vpby5hYy5qcD4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMCwgU291aGVpbCBCZW4gQXllZCwgVGVyYW9rYSBMYWJvcmF0b3J5IG9mIEtlaW8gVW5pdmVyc2l0eSwgYW5kIHRoZSBXSURFIFByb2plY3QKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IFNvdWhlaWwgQmVuIEF5ZWQgPHNvdWhlaWxAdGVyYS5pY3Mua2Vpby5hYy5qcD4uCisgKgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiBTb3VoZWlsIEJlbiBBeWVkLCBUZXJhb2thIExhYm9yYXRvcnkgb2YgS2VpbyBVbml2ZXJzaXR5IG9yIHRoZSBXSURFIFByb2plY3Qgbm9yIHRoZQorICogICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgJydBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiZGlhbWVhcF9teXNxbC5oIgorCitzdGF0aWMgcHRocmVhZF9tdXRleF90IGRiX2NzX211dGV4ID0KK1BUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CisKK2ludCBkaWFtZWFwX2dldF9lYXBfdXNlcihzdHJ1Y3QgZWFwX3VzZXIgKiB1c2VyLCBjaGFyICogdXNlcm5hbWUpCit7CisJVFJBQ0VfRU5UUlkoIiVwICVwIix1c2VyLHVzZXJuYW1lKTsKKwlpZiAoZGJfY29ubiA9PSBOVUxMKQorCXsKKwkJVFJBQ0VfREVCVUcoSU5GTywgIiVzTm90IGNvbm5lY3RlZCB0byB0aGUgTXlTUUwgRGF0YWJhc2Ugc2VydmVyLiIsRElBTUVBUF9FWFRFTlNJT04pOworCisJCXJldHVybiBFSU5WQUw7CisKKwl9CisJbXlzcWxfdGhyZWFkX2luaXQoKTsKKworCU1ZU1FMX1JFUyAqcmVzOworCU1ZU1FMX1JPVyByb3c7CisJY2hhciAqIHF1ZXJ5OworCUNIRUNLX01BTExPQyhxdWVyeT0oY2hhciAqKW1hbGxvYyhzaXplb2YoY2hhcikqMjU1KSk7CisKKwlzcHJpbnRmKAorCQkJcXVlcnksCisJCQkiU0VMRUNUIGlkLHVzZXJuYW1lLHBhc3N3b3JkLGVhcG1ldGhvZCwgdmVuZG9yIEZST00gdXNlcnMgV0hFUkUgIHVzZXJzLnVzZXJuYW1lPSclcycgYW5kIHVzZXJzLmFjdGl2ZT0nWScgIiwKKwkJCXVzZXJuYW1lKTsKKworCUNIRUNLX1BPU0lYKHB0aHJlYWRfbXV0ZXhfbG9jayggJmRiX2NzX211dGV4ICkpOworCisJaWYgKG15c3FsX3F1ZXJ5KGRiX2Nvbm4sIHF1ZXJ5KSkKKwl7CisJCUNIRUNLX1BPU0lYKHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCAmZGJfY3NfbXV0ZXggKSk7CisJCVRSQUNFX0RFQlVHKElORk8sICIlc1F1ZXJ5IGV4ZWN1dGlvbiBmYWlsLiAlcyIsRElBTUVBUF9FWFRFTlNJT04sIG15c3FsX2Vycm9yKGRiX2Nvbm4pKTsKKwkJbXlzcWxfdGhyZWFkX2VuZCgpOworCQlmcmVlKHF1ZXJ5KTsKKwkJcXVlcnkgPSBOVUxMOworCQlyZXR1cm4gRUlOVkFMOworCX0KKworCXJlcyA9IG15c3FsX3N0b3JlX3Jlc3VsdChkYl9jb25uKTsKKworCUNIRUNLX1BPU0lYKHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCAmZGJfY3NfbXV0ZXggKSk7CisKKwlpZiAoKHJvdyA9IG15c3FsX2ZldGNoX3JvdyhyZXMpKSAhPSBOVUxMKQorCXsKKworCQl1c2VyLT5pZCA9IGF0b2kocm93WzBdKTsKKwkJQ0hFQ0tfTUFMTE9DKHVzZXItPnVzZXJpZD1tYWxsb2Moc3RybGVuKHJvd1sxXSkrMSkpOworCQltZW1jcHkodXNlci0+dXNlcmlkLHJvd1sxXSxzdHJsZW4ocm93WzFdKSsxKTsKKwkJdXNlci0+dXNlcmlkTGVuZ3RoID0gc3RybGVuKHJvd1sxXSk7CisJCUNIRUNLX01BTExPQyh1c2VyLT5wYXNzd29yZD1tYWxsb2Moc3RybGVuKHJvd1syXSkrMSkpOworCQltZW1jcHkodXNlci0+cGFzc3dvcmQsIHJvd1syXSxzdHJsZW4ocm93WzJdKSsxKTsKKwkJdXNlci0+cGFzc3dvcmRMZW5ndGggPSBzdHJsZW4ocm93WzJdKTsKKwkJdXNlci0+cHJvcG9zZWRfZWFwX21ldGhvZCA9IGF0b2kocm93WzNdKTsKKwkJdXNlci0+cHJvcG9zZWRfZWFwX21ldGhvZF92ZW5kb3IgPSBhdG9pKHJvd1s0XSk7CisKKwkJbXlzcWxfZnJlZV9yZXN1bHQocmVzKTsKKwkJbXlzcWxfdGhyZWFkX2VuZCgpOworCQlmcmVlKHF1ZXJ5KTsKKwkJcXVlcnkgPSBOVUxMOworCQlyZXR1cm4gMDsKKwl9CisKKwlUUkFDRV9ERUJVRyhJTkZPLCAiJXNVc2VyIHVuYXZhaWxhYmxlLiIsRElBTUVBUF9FWFRFTlNJT04pOworCW15c3FsX2ZyZWVfcmVzdWx0KHJlcyk7CisJbXlzcWxfdGhyZWFkX2VuZCgpOworCWZyZWUocXVlcnkpOworCXF1ZXJ5ID0gTlVMTDsKKwlyZXR1cm4gRUlOVkFMOworCit9CisKK2ludCBkaWFtZWFwX2F1dGhlbnRpY2F0aW9uX2dldF9hdHRyaWJzKHN0cnVjdCBlYXBfdXNlciAqdXNlciwKKwkJc3RydWN0IGZkX2xpc3QgKiBhdHRyaWJ1dGVfbGlzdCkKK3sKKworCVRSQUNFX0VOVFJZKCIlcCAlcCIsdXNlcixhdHRyaWJ1dGVfbGlzdCk7CisKKwlpZiAoZGJfY29ubiA9PSBOVUxMKQorCXsKKwkJVFJBQ0VfREVCVUcoSU5GTywgIiVzTm90IGNvbm5lY3RlZCB0byB0aGUgTXlTUUwgRGF0YWJhc2Ugc2VydmVyLiIsRElBTUVBUF9FWFRFTlNJT04pOworCisJCXJldHVybiBFSU5WQUw7CisKKwl9CisKKwlteXNxbF90aHJlYWRfaW5pdCgpOworCU1ZU1FMX1JFUyAqcmVzOworCU1ZU1FMX1JPVyByb3c7CisJY2hhciAqIHF1ZXJ5OworCUNIRUNLX01BTExPQyhxdWVyeT1tYWxsb2Moc2l6ZW9mKGNoYXIpKjI1NSkpOworCisJc3ByaW50ZigKKwkJCXF1ZXJ5LAorCQkJIlNFTEVDVCBgYXV0aGVgLmBhdHRyaWJ1dGVgICxgYXV0aGVgLmB2YWx1ZWAgRlJPTSBgYXV0aGVgIFdIRVJFIGBhdXRoZWAuYGdycGAgSU4gKCBTRUxFQ1QgYHVzZXJfZ3JwYC5gZ3JwYCBGUk9NIGB1c2VyX2dycGAgV0hFUkUgYHVzZXJfZ3JwYC5gdXNlcmAgPSAlZCApICIsCisJCQl1c2VyLT5pZCk7CisKKwlDSEVDS19QT1NJWChwdGhyZWFkX211dGV4X2xvY2soICZkYl9jc19tdXRleCApKTsKKworCWlmIChteXNxbF9xdWVyeShkYl9jb25uLCBxdWVyeSkpCisJeworCQlDSEVDS19QT1NJWChwdGhyZWFkX211dGV4X3VubG9jayggJmRiX2NzX211dGV4ICkpOworCQlUUkFDRV9ERUJVRyhJTkZPLCAiJXNRdWVyeSBleGVjdXRpb24gZmFpbC4gJXMiLERJQU1FQVBfRVhURU5TSU9OLCBteXNxbF9lcnJvcihkYl9jb25uKSk7CisJCW15c3FsX3RocmVhZF9lbmQoKTsKKwkJZnJlZShxdWVyeSk7CisJCXF1ZXJ5ID0gTlVMTDsKKwkJcmV0dXJuIEVJTlZBTDsKKwl9CisKKwlyZXMgPSBteXNxbF9zdG9yZV9yZXN1bHQoZGJfY29ubik7CisKKwlDSEVDS19QT1NJWChwdGhyZWFkX211dGV4X3VubG9jayggJmRiX2NzX211dGV4ICkpOworCisJd2hpbGUgKChyb3cgPSBteXNxbF9mZXRjaF9yb3cocmVzKSkpCisJeworCQlzdHJ1Y3QgYXV0aF9hdHRyaWJ1dGUgKiBhdHRyaWJ1dGU7CisJCUNIRUNLX01BTExPQyhhdHRyaWJ1dGUgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdXRoX2F0dHJpYnV0ZSkpKTsKKwkJbWVtc2V0KGF0dHJpYnV0ZSwgMCwgc2l6ZW9mKHN0cnVjdCBhdXRoX2F0dHJpYnV0ZSkpOworCQlmZF9saXN0X2luaXQoJmF0dHJpYnV0ZS0+Y2hhaW4sIE5VTEwpOworCQlhdHRyaWJ1dGUtPmF0dHJpYiA9IHN0cmR1cChyb3dbMF0pOworCQlhdHRyaWJ1dGUtPm9wID0gTlVMTDsKKwkJYXR0cmlidXRlLT52YWx1ZSA9IHN0cmR1cChyb3dbMV0pOworCQlmZF9saXN0X2luc2VydF9iZWZvcmUoYXR0cmlidXRlX2xpc3QsICZhdHRyaWJ1dGUtPmNoYWluKTsKKworCX0KKworCW15c3FsX2ZyZWVfcmVzdWx0KHJlcyk7CisJbXlzcWxfdGhyZWFkX2VuZCgpOworCWZyZWUocXVlcnkpOworCXF1ZXJ5ID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworaW50IGRpYW1lYXBfYXV0aG9yaXphdGlvbl9nZXRfYXR0cmlicyhzdHJ1Y3QgZWFwX3VzZXIgKnVzZXIsCisJCXN0cnVjdCBmZF9saXN0ICogYXR0cmlidXRlX2xpc3QpCit7CisJVFJBQ0VfRU5UUlkoIiVwICVwIix1c2VyLGF0dHJpYnV0ZV9saXN0KTsKKworCWlmIChkYl9jb25uID09IE5VTEwpCisJeworCQlUUkFDRV9ERUJVRyhJTkZPLCAiJXNOb3QgY29ubmVjdGVkIHRvIHRoZSBNeVNRTCBEYXRhYmFzZSBzZXJ2ZXIuIixESUFNRUFQX0VYVEVOU0lPTik7CisKKwkJcmV0dXJuIEVJTlZBTDsKKworCX0KKworCW15c3FsX3RocmVhZF9pbml0KCk7CisKKwlNWVNRTF9SRVMgKnJlczsKKwlNWVNRTF9ST1cgcm93OworCWNoYXIgKiBxdWVyeTsKKwlDSEVDS19NQUxMT0MocXVlcnk9bWFsbG9jKHNpemVvZihjaGFyKSoyNTUpKTsKKworCXNwcmludGYoCisJCQlxdWVyeSwKKwkJCSJTRUxFQ1QgYGF1dGh6YC5gYXR0cmlidXRlYCAsIGBhdXRoemAuYG9wYCAsIGBhdXRoemAuYHZhbHVlYCBGUk9NIGBhdXRoemAgV0hFUkUgYGF1dGh6YC5gZ3JwYCBJTiAoIFNFTEVDVCBgdXNlcl9ncnBgLmBncnBgIEZST00gYHVzZXJfZ3JwYCBXSEVSRSBgdXNlcl9ncnBgLmB1c2VyYCA9ICVkICkgIiwKKwkJCXVzZXItPmlkKTsKKworCUNIRUNLX1BPU0lYKHB0aHJlYWRfbXV0ZXhfbG9jayggJmRiX2NzX211dGV4ICkpOworCisJaWYgKG15c3FsX3F1ZXJ5KGRiX2Nvbm4sIHF1ZXJ5KSkKKwl7CisJCUNIRUNLX1BPU0lYKHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCAmZGJfY3NfbXV0ZXggKSk7CisJCVRSQUNFX0RFQlVHKElORk8sICIlc1F1ZXJ5IGV4ZWN1dGlvbiBmYWlsLiAlcyIsRElBTUVBUF9FWFRFTlNJT04sIG15c3FsX2Vycm9yKGRiX2Nvbm4pKTsKKwkJbXlzcWxfdGhyZWFkX2VuZCgpOworCQlmcmVlKHF1ZXJ5KTsKKwkJcXVlcnkgPSBOVUxMOworCQlyZXR1cm4gRUlOVkFMOworCX0KKworCXJlcyA9IG15c3FsX3N0b3JlX3Jlc3VsdChkYl9jb25uKTsKKworCUNIRUNLX1BPU0lYKHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCAmZGJfY3NfbXV0ZXggKSk7CisKKwl3aGlsZSAoKHJvdyA9IG15c3FsX2ZldGNoX3JvdyhyZXMpKSkKKwl7CisJCXN0cnVjdCBhdXRoX2F0dHJpYnV0ZSAqIGF0dHJpYnV0ZTsKKwkJQ0hFQ0tfTUFMTE9DKGF0dHJpYnV0ZSA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGF1dGhfYXR0cmlidXRlKSkpOworCQltZW1zZXQoYXR0cmlidXRlLCAwLCBzaXplb2Yoc3RydWN0IGF1dGhfYXR0cmlidXRlKSk7CisJCWZkX2xpc3RfaW5pdCgmYXR0cmlidXRlLT5jaGFpbiwgTlVMTCk7CisJCWF0dHJpYnV0ZS0+YXR0cmliID0gc3RyZHVwKHJvd1swXSk7CisJCWF0dHJpYnV0ZS0+b3AgPSBzdHJkdXAocm93WzFdKTsKKwkJYXR0cmlidXRlLT52YWx1ZSA9IHN0cmR1cChyb3dbMl0pOworCQlmZF9saXN0X2luc2VydF9iZWZvcmUoYXR0cmlidXRlX2xpc3QsICZhdHRyaWJ1dGUtPmNoYWluKTsKKwl9CisKKwlteXNxbF9mcmVlX3Jlc3VsdChyZXMpOworCW15c3FsX3RocmVhZF9lbmQoKTsKKwlmcmVlKHF1ZXJ5KTsKKwlxdWVyeSA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZGlhbWVhcF9teXNxbF9kaXNjb25uZWN0KCkKK3sKKwlteXNxbF9jbG9zZShkYl9jb25uKTsKK30KZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvYXBwX2RpYW1lYXAvZGlhbWVhcF9teXNxbC5oIGIvZXh0ZW5zaW9ucy9hcHBfZGlhbWVhcC9kaWFtZWFwX215c3FsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIxN2RjNgotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvYXBwX2RpYW1lYXAvZGlhbWVhcF9teXNxbC5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKQorICogQXV0aG9yIDogU291aGVpbCBCZW4gQXllZCA8c291aGVpbEB0ZXJhLmljcy5rZWlvLmFjLmpwPgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOS0yMDEwLCBTb3VoZWlsIEJlbiBBeWVkLCBUZXJhb2thIExhYm9yYXRvcnkgb2YgS2VpbyBVbml2ZXJzaXR5LCBhbmQgdGhlIFdJREUgUHJvamVjdAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgU291aGVpbCBCZW4gQXllZCA8c291aGVpbEB0ZXJhLmljcy5rZWlvLmFjLmpwPi4KKyAqCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNvdWhlaWwgQmVuIEF5ZWQsIFRlcmFva2EgTGFib3JhdG9yeSBvZiBLZWlvIFVuaXZlcnNpdHkgb3IgdGhlIFdJREUgUHJvamVjdCBub3IgdGhlCisgKiAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAnJ0FTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBESUFNRUFQX01ZU1FMX0hfCisjZGVmaW5lIERJQU1FQVBfTVlTUUxfSF8KKworI2luY2x1ZGUgImxpYmRpYW1lYXAuaCIKKyNpbmNsdWRlIDxteXNxbC5oPgorCisvKiBNeVNRTCBEYXRhYmFzZSBjb25uZWN0aW9uICovCitNWVNRTCAqZGJfY29ubjsKKworaW50IGRpYW1lYXBfZ2V0X2VhcF91c2VyKHN0cnVjdCBlYXBfdXNlciAqIHVzZXIsIGNoYXIgKiB1c2VybmFtZSk7CisKK2ludCBkaWFtZWFwX215c3FsX2Nvbm5lY3QoKTsKKworaW50IGRpYW1lYXBfbXlzcWxfcmVjb25uZWN0KCk7CisKK2ludCBkaWFtZWFwX3NldF9teXNxbF9wYXJhbShjaGFyICogdXNlciwgY2hhciAqIHBhc3N3ZCwgY2hhciAqIHNlcnZlciwgY2hhciAqIGRhdGFiYXNlKTsKKwordm9pZCBkaWFtZWFwX215c3FsX2Rpc2Nvbm5lY3QoKTsKKworLyogKi8KK2ludCBkaWFtZWFwX2F1dGhlbnRpY2F0aW9uX2dldF9hdHRyaWJzKHN0cnVjdCBlYXBfdXNlciAqdXNlciwKKwkJCXN0cnVjdCBmZF9saXN0ICogYXR0cmlidXRlX2xpc3QpOworCisvKiAqLworaW50IGRpYW1lYXBfYXV0aG9yaXphdGlvbl9nZXRfYXR0cmlicyhzdHJ1Y3QgZWFwX3VzZXIgKnVzZXIsCisJCQlzdHJ1Y3QgZmRfbGlzdCAqIGF0dHJpYnV0ZV9saXN0KTsKKworCisjZW5kaWYgLyogRElBTUVBUF9NWVNRTF9IXyAqLwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9hcHBfZGlhbWVhcC9kaWFtZWFwX3BsdWdpbnMuYyBiL2V4dGVuc2lvbnMvYXBwX2RpYW1lYXAvZGlhbWVhcF9wbHVnaW5zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM2YzY4NgotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvYXBwX2RpYW1lYXAvZGlhbWVhcF9wbHVnaW5zLmMKQEAgLTAsMCArMSw0NTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKQorICogQXV0aG9yIDogU291aGVpbCBCZW4gQXllZCA8c291aGVpbEB0ZXJhLmljcy5rZWlvLmFjLmpwPgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOS0yMDEwLCBTb3VoZWlsIEJlbiBBeWVkLCBUZXJhb2thIExhYm9yYXRvcnkgb2YgS2VpbyBVbml2ZXJzaXR5LCBhbmQgdGhlIFdJREUgUHJvamVjdAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgU291aGVpbCBCZW4gQXllZCA8c291aGVpbEB0ZXJhLmljcy5rZWlvLmFjLmpwPi4KKyAqCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNvdWhlaWwgQmVuIEF5ZWQsIFRlcmFva2EgTGFib3JhdG9yeSBvZiBLZWlvIFVuaXZlcnNpdHkgb3IgdGhlIFdJREUgUHJvamVjdCBub3IgdGhlCisgKiAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAnJ0FTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRmT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiZGlhbWVhcF9jb21tb24uaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJTG9hZGluZyBhbmQgaW5pdGlhbGl6aW5nIHBsdWctaW5zCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBBZGQgbmV3IHBsdWdpbiAqLworaW50IGRpYW1lYXBfcGx1Z2luX2FkZChjaGFyICogbmFtZSwgZWFwX3R5cGUgbWV0aG9kdHlwZSwgdTMyIHZlbmRvciwKKwkJY2hhciAqIGZpbGVuYW1lLCBjaGFyICogY29uZmZpbGUpCit7CisJVFJBQ0VfRU5UUlkoIiVwICVkICVkICVwICVwIiwgbmFtZSwgbWV0aG9kdHlwZSwgdmVuZG9yLCBmaWxlbmFtZSwgY29uZmZpbGUpOworCisJLyogQ2hlY2sgdGhlIGZpbGVuYW1lIGlzIHZhbGlkICovCisJQ0hFQ0tfUEFSQU1TKGZpbGVuYW1lKTsKKworCS8qIGFkZCBuZXcgRUFQIG1ldGhvZCAgaW4gdGhlIGxpc3Qgb2YgcGx1Z2lucyovCisJeworCQlzdHJ1Y3QgcGx1Z2luICogcGx1Z2luOworCQlDSEVDS19NQUxMT0MocGx1Z2luID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgcGx1Z2luKSkpOworCQltZW1zZXQocGx1Z2luLCAwLCBzaXplb2Yoc3RydWN0IHBsdWdpbikpOworCQlmZF9saXN0X2luaXQoJnBsdWdpbi0+Y2hhaW4sIHBsdWdpbik7CisJCXBsdWdpbi0+bWV0aG9kbmFtZSA9IG5hbWU7CisJCXBsdWdpbi0+bWV0aG9kdHlwZSA9IG1ldGhvZHR5cGU7CisJCXBsdWdpbi0+dmVuZG9yID0gdmVuZG9yOworCQlwbHVnaW4tPnBsdWdpbmZpbGUgPSBmaWxlbmFtZTsKKwkJcGx1Z2luLT5jb25mZmlsZSA9IGNvbmZmaWxlOworCQlmZF9saXN0X2luc2VydF9iZWZvcmUoJnBsdWdpbnNfbGlzdCwgJnBsdWdpbi0+Y2hhaW4pOworCX0KKworCXJldHVybiAwOworfQorCisvKiBEdW1wIHBsdWdpbnMgbGlzdCAqLwordm9pZCBkaWFtZWFwX3BsdWdpbl9kdW1wKHZvaWQpCit7CisJc3RydWN0IGZkX2xpc3QgKiBwbDsKKworCWZvciAocGwgPSBwbHVnaW5zX2xpc3QubmV4dDsgcGwgIT0gJnBsdWdpbnNfbGlzdDsgcGwgPSBwbC0+bmV4dCkKKwl7CisJCXN0cnVjdCBwbHVnaW4gKiBwbHVnaW4gPSAoc3RydWN0IHBsdWdpbiAqKSBwbDsKKwkJZmRfbG9nX2RlYnVnKCJcdFx0IC0gJXMgcGx1Z2luIFx0IFtUeXBlOiAlaSwgVmVuZG9yOiAlaV0gICVzbG9hZGVkIiwgcGx1Z2luLT5tZXRob2RuYW1lLAorCQkJCXBsdWdpbi0+bWV0aG9kdHlwZSxwbHVnaW4tPnZlbmRvciwgcGx1Z2luLT5oYW5kbGVyID8gIiIgOiAibm90ICIpOworCX0KK30KKworaW50IGRpYW1lYXBfcGx1Z2luX2dldCh1MzIgdmVuZG9yLCBlYXBfdHlwZSB0eXBlLCBzdHJ1Y3QgcGx1Z2luICoqIGdldHBsdWdpbikKK3sKKwlUUkFDRV9FTlRSWSgiJWQgJWQgJXAiLHZlbmRvcix0eXBlLGdldHBsdWdpbik7CisJc3RydWN0IGZkX2xpc3QgKiBwbDsKKworCWZvciAocGwgPSBwbHVnaW5zX2xpc3QubmV4dDsgcGwgIT0gJnBsdWdpbnNfbGlzdDsgcGwgPSBwbC0+bmV4dCkKKwl7CisJCXN0cnVjdCBwbHVnaW4gKiBwbHVnaW4gPSAoc3RydWN0IHBsdWdpbiAqKSBwbDsKKwkJaWYgKHBsdWdpbi0+bWV0aG9kdHlwZSA9PSB0eXBlICYmIHBsdWdpbi0+dmVuZG9yID09IHZlbmRvcikKKwkJeworCQkJKmdldHBsdWdpbiA9IHBsdWdpbjsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAxOworfQorCisvKiBMb2FkIGFsbCBtZXRob2QgaW4gdGhlIHBsdWdpbnMgbGlzdCAqLworaW50IGRpYW1lYXBfcGx1Z2luX2xvYWQodm9pZCkKK3sKKworCWludCByZXQ7CisJc3RydWN0IGZkX2xpc3QgKiBwbDsKKworCS8qIExvb3Agb24gYWxsIHBsdWdpbnMgKi8KKworCWZvciAocGwgPSBwbHVnaW5zX2xpc3QubmV4dDsgcGwgIT0gJnBsdWdpbnNfbGlzdDsgcGwgPSBwbC0+bmV4dCkKKwl7CisJCXN0cnVjdCBwbHVnaW4gKiBwbHVnaW4gPSAoc3RydWN0IHBsdWdpbiAqKSBwbDsKKwkJc3RydWN0IHJlZ2lzdGVyX3BsdWdpbiAqIHJlZ2lzdGVycGx1Z2luOworCQlpbnQgKCpkaWFtZWFwX3BsdWdpbl9yZWdpc3RlcikoKTsKKworCQlUUkFDRV9ERUJVRyhGVUxMLCAiJXNMb2FkaW5nIEVBUCBtZXRob2QgcGx1Z2luOiAlcyIsRElBTUVBUF9FWFRFTlNJT04sIHBsdWdpbi0+bWV0aG9kbmFtZSk7CisKKwkJLyogTG9hZCB0aGUgbWV0aG9kICovCisJCXBsdWdpbi0+aGFuZGxlciA9IGRsb3BlbihwbHVnaW4tPnBsdWdpbmZpbGUsIFJUTERfTEFaWSB8IFJUTERfR0xPQkFMKTsKKwkJaWYgKHBsdWdpbi0+aGFuZGxlciA9PSBOVUxMKQorCQl7CisJCQlUUkFDRV9ERUJVRyhJTkZPLCAiJXNMb2FkaW5nIG9mIHBsdWdpbiAlcyBmYWlsZWQ6ICVzIixESUFNRUFQX0VYVEVOU0lPTiwKKwkJCQkJcGx1Z2luLT5tZXRob2RuYW1lLCBkbGVycm9yKCkpOworCQkJcmV0dXJuIEVJTlZBTDsKKwkJfQorCisJCS8qIERlZmluZWQgcmVnaXN0ZXIgbWV0aG9kcyBmb3IgdGhpcyBFQVAgbWV0aG9kKi8KKwkJZGlhbWVhcF9wbHVnaW5fcmVnaXN0ZXIgPSAoaW50KCopKCkpIGRsc3ltKHBsdWdpbi0+aGFuZGxlciwKKwkJCQkiZGlhbWVhcF9wbHVnaW5fcmVnaXN0ZXIiKTsKKwkJaWYgKCFkaWFtZWFwX3BsdWdpbl9yZWdpc3RlcikKKwkJeworCQkJVFJBQ0VfREVCVUcoSU5GTywKKwkJCQkJIiVzWyVzIHBsdWdpbl0gVW5hYmxlIHRvIHJlZ2lzdGVyIEVBUCBtZXRob2Q6ICVzLiIsRElBTUVBUF9FWFRFTlNJT04sCisJCQkJCXBsdWdpbi0+bWV0aG9kbmFtZSwgZGxlcnJvcigpKTsKKwkJCXJldHVybiBFSU5WQUw7CisJCX0KKworCQlpZiAoKCpkaWFtZWFwX3BsdWdpbl9yZWdpc3RlcikoKSAhPSAwKQorCQl7CisJCQlUUkFDRV9ERUJVRyhJTkZPLAorCQkJCQkiJXNbJXMgcGx1Z2luXSBVbmFibGUgdG8gcmVnaXN0ZXIgRUFQIG1ldGhvZCBwbHVnaW4iLERJQU1FQVBfRVhURU5TSU9OLHBsdWdpbi0+bWV0aG9kbmFtZSk7CisJCX0KKworCQlpbnQgKCpkaWFtZWFwX3BsdWdpbl9vYmplY3RzKShzdHJ1Y3QgcmVnaXN0ZXJfcGx1Z2luICoqKTsKKworCQlkaWFtZWFwX3BsdWdpbl9vYmplY3RzID0gKGludCgqKShzdHJ1Y3QgcmVnaXN0ZXJfcGx1Z2luICoqKSkgZGxzeW0oCisJCQkJcGx1Z2luLT5oYW5kbGVyLCAiZGlhbWVhcF9wbHVnaW5fb2JqZWN0cyIpOworCQlpZiAoIWRpYW1lYXBfcGx1Z2luX29iamVjdHMpCisJCXsKKwkJCVRSQUNFX0RFQlVHKElORk8sCisJCQkJCSIlc1slcyBwbHVnaW5dIFVuYWJsZSB0byByZXNvbHZlIHN5bWJvbCBvZiB0aGUgcGx1Z2luOiAlcyIsRElBTUVBUF9FWFRFTlNJT04sCisJCQkJCXBsdWdpbi0+bWV0aG9kbmFtZSwgZGxlcnJvcigpKTsKKwkJCXJldHVybiBFSU5WQUw7CisJCX0KKworCQlpZiAoKCpkaWFtZWFwX3BsdWdpbl9vYmplY3RzKSgmcmVnaXN0ZXJwbHVnaW4pICE9IDApCisJCXsKKworCQkJVFJBQ0VfREVCVUcoCisJCQkJCUlORk8sCisJCQkJCSIlc1slcyBwbHVnaW5dIFVuYWJsZSB0byBnZXQgb2JqZWN0cyBkZXNjcmlwdGlvbiBmcm9tIHRoZSBwbHVnLWluOiAlcyIsRElBTUVBUF9FWFRFTlNJT04sCisJCQkJCXBsdWdpbi0+bWV0aG9kbmFtZSwgZGxlcnJvcigpKTsKKwkJCXJldHVybiBFSU5WQUw7CisJCX0KKworCQkvKiBlYXBfbWV0aG9kX2NvbmZpZ3VyZSBtZXRob2QgKi8KKwkJaWYgKHJlZ2lzdGVycGx1Z2luLT5jb25maWd1cmUpCisJCXsKKwkJCXBsdWdpbi0+ZWFwX21ldGhvZF9jb25maWd1cmUgPSAoaW50KCopKGNoYXIgKikpIGRsc3ltKAorCQkJCQlwbHVnaW4tPmhhbmRsZXIsIHJlZ2lzdGVycGx1Z2luLT5jb25maWd1cmUpOworCQkJaWYgKHBsdWdpbi0+ZWFwX21ldGhvZF9jb25maWd1cmUgPT0gTlVMTCkKKwkJCXsKKwkJCQlUUkFDRV9ERUJVRygKKwkJCQkJCUlORk8sCisJCQkJCQkiJXNbJXMgcGx1Z2luXSBVbmFibGUgdG8gcmVzb2x2ZSBzeW1ib2wgZm9yICdlYXBfbWV0aG9kX2NvbmZpZ3VyZSc6ICVzIixESUFNRUFQX0VYVEVOU0lPTiwKKwkJCQkJCXBsdWdpbi0+bWV0aG9kbmFtZSwgZGxlcnJvcigpKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCXBsdWdpbi0+ZWFwX21ldGhvZF9jb25maWd1cmUgPSBOVUxMOworCQkJVFJBQ0VfREVCVUcoRlVMTCsxLCIlc1slcyBwbHVnaW5dIFVuYXZhaWxhYmxlIGZ1bmN0aW9uICdlYXBfbWV0aG9kX2NvbmZpZ3VyZSciLERJQU1FQVBfRVhURU5TSU9OLCBwbHVnaW4tPm1ldGhvZG5hbWUpOworCQl9CisKKwkJLyogZWFwX21ldGhvZF9pbml0IG1ldGhvZCAqLworCQlpZiAocmVnaXN0ZXJwbHVnaW4tPmluaXQpCisJCXsKKwkJCXBsdWdpbi0+ZWFwX21ldGhvZF9pbml0CisJCQkJCT0gKGludCgqKShzdHJ1Y3QgZWFwX3N0YXRlX21hY2hpbmUgKikpIGRsc3ltKAorCQkJCQkJCXBsdWdpbi0+aGFuZGxlciwgcmVnaXN0ZXJwbHVnaW4tPmluaXQpOworCQkJaWYgKHBsdWdpbi0+ZWFwX21ldGhvZF9pbml0ID09IE5VTEwpCisJCQl7CisJCQkJVFJBQ0VfREVCVUcoCisJCQkJCQlJTkZPLAorCQkJCQkJIiVzWyVzIHBsdWdpbl0gVW5hYmxlIHRvIHJlc29sdmUgc3ltYm9sIGZvciAnZWFwX21ldGhvZF9pbml0JzogJXMiLERJQU1FQVBfRVhURU5TSU9OLAorCQkJCQkJcGx1Z2luLT5tZXRob2RuYW1lLCBkbGVycm9yKCkpOworCQkJCXJldHVybiBFSU5WQUw7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlwbHVnaW4tPmVhcF9tZXRob2RfaW5pdCA9IE5VTEw7CisJCQlUUkFDRV9ERUJVRyhJTkZPLCIlc1slcyBwbHVnaW5dIFVuYXZhaWxhYmxlIGZ1bmN0aW9uICdlYXBfbWV0aG9kX2luaXQnIixESUFNRUFQX0VYVEVOU0lPTiwgcGx1Z2luLT5tZXRob2RuYW1lKTsKKwkJCXJldHVybiBFSU5WQUw7CisJCX0KKworCQkvKiBlYXBfbWV0aG9kX2luaXRQaWNrVXAgbWV0aG9kICovCisJCWlmIChyZWdpc3RlcnBsdWdpbi0+aW5pdFBpY2tVcCkKKwkJeworCQkJcGx1Z2luLT5lYXBfbWV0aG9kX2luaXRQaWNrVXAKKwkJCQkJPSAoaW50KCopKHN0cnVjdCBlYXBfc3RhdGVfbWFjaGluZSAqKSkgZGxzeW0oCisJCQkJCQkJcGx1Z2luLT5oYW5kbGVyLCByZWdpc3RlcnBsdWdpbi0+aW5pdFBpY2tVcCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwbHVnaW4tPmVhcF9tZXRob2RfaW5pdFBpY2tVcCA9IE5VTEw7CisJCQlUUkFDRV9ERUJVRyhGVUxMKzEsIiVzWyVzIHBsdWdpbl0gVW5hdmFpbGFibGUgZnVuY3Rpb24gJ2VhcF9tZXRob2RfaW5pdFBpY2tVcCciLERJQU1FQVBfRVhURU5TSU9OLCBwbHVnaW4tPm1ldGhvZG5hbWUpOworCQl9CisKKwkJLyogZWFwX21ldGhvZF9idWlsZFJlcSBtZXRob2QgKi8KKwkJaWYgKHJlZ2lzdGVycGx1Z2luLT5idWlsZFJlcSkKKwkJeworCQkJcGx1Z2luLT5lYXBfbWV0aG9kX2J1aWxkUmVxID0gKGludCgqKShzdHJ1Y3QgZWFwX3N0YXRlX21hY2hpbmUgKiwKKwkJCQkJdTgsIHN0cnVjdCBlYXBfcGFja2V0ICopKSBkbHN5bShwbHVnaW4tPmhhbmRsZXIsCisJCQkJCXJlZ2lzdGVycGx1Z2luLT5idWlsZFJlcSk7CisJCQlpZiAocGx1Z2luLT5lYXBfbWV0aG9kX2J1aWxkUmVxID09IE5VTEwpCisJCQl7CisJCQkJVFJBQ0VfREVCVUcoCisJCQkJCQlJTkZPLAorCQkJCQkJIiVzWyVzIHBsdWdpbl0gVW5hYmxlIHRvIHJlc29sdmUgc3ltYm9sIGZvciAnZWFwX21ldGhvZF9idWlsZFJlcSc6ICVzIixESUFNRUFQX0VYVEVOU0lPTiwKKwkJCQkJCXBsdWdpbi0+bWV0aG9kbmFtZSwgZGxlcnJvcigpKTsKKwkJCQlyZXR1cm4gRUlOVkFMOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJcGx1Z2luLT5lYXBfbWV0aG9kX2J1aWxkUmVxID0gTlVMTDsKKwkJCVRSQUNFX0RFQlVHKElORk8sIiVzWyVzIHBsdWdpbl0gVW5hdmFpbGFibGUgZnVuY3Rpb24gJ2VhcF9tZXRob2RfYnVpbGRSZXEnIixESUFNRUFQX0VYVEVOU0lPTiwgcGx1Z2luLT5tZXRob2RuYW1lKTsKKwkJCXJldHVybiBFSU5WQUw7CisJCX0KKworCQkvKiBlYXBfbWV0aG9kX2dldFRpbWVvdXQgbWV0aG9kICovCisJCWlmIChyZWdpc3RlcnBsdWdpbi0+Z2V0VGltZW91dCkKKwkJeworCQkJcGx1Z2luLT5lYXBfbWV0aG9kX2dldFRpbWVvdXQgPSAoaW50KCopKHN0cnVjdCBlYXBfc3RhdGVfbWFjaGluZSAqLAorCQkJCQlpbnQgKikpIGRsc3ltKHBsdWdpbi0+aGFuZGxlciwgcmVnaXN0ZXJwbHVnaW4tPmdldFRpbWVvdXQpOworCQkJaWYgKHBsdWdpbi0+ZWFwX21ldGhvZF9nZXRUaW1lb3V0ID09IE5VTEwpCisJCQl7CisJCQkJVFJBQ0VfREVCVUcoCisJCQkJCQlJTkZPLAorCQkJCQkJIiVzWyVzIHBsdWdpbl0gVW5hYmxlIHRvIHJlc29sdmUgc3ltYm9sIGZvciAnZWFwX21ldGhvZF9nZXRUaW1lb3V0JzogJXMiLERJQU1FQVBfRVhURU5TSU9OLAorCQkJCQkJcGx1Z2luLT5tZXRob2RuYW1lLCBkbGVycm9yKCkpOworCQkJCXJldHVybiBFSU5WQUw7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlwbHVnaW4tPmVhcF9tZXRob2RfZ2V0VGltZW91dCA9IE5VTEw7CisJCQlUUkFDRV9ERUJVRyhGVUxMKzEsIiVzWyVzIHBsdWdpbl0gVW5hdmFpbGFibGUgZnVuY3Rpb24gICdlYXBfbWV0aG9kX2dldFRpbWVvdXQnIixESUFNRUFQX0VYVEVOU0lPTiwgcGx1Z2luLT5tZXRob2RuYW1lKTsKKwkJfQorCisJCS8qIGVhcF9tZXRob2RfY2hlY2sgbWV0aG9kICovCisJCWlmIChyZWdpc3RlcnBsdWdpbi0+Y2hlY2spCisJCXsKKwkJCXBsdWdpbi0+ZWFwX21ldGhvZF9jaGVjayA9IChib29sZWFuKCopKHN0cnVjdCBlYXBfc3RhdGVfbWFjaGluZSAqLAorCQkJCQlzdHJ1Y3QgZWFwX3BhY2tldCopKSBkbHN5bShwbHVnaW4tPmhhbmRsZXIsCisJCQkJCXJlZ2lzdGVycGx1Z2luLT5jaGVjayk7CisJCQlpZiAocGx1Z2luLT5lYXBfbWV0aG9kX2NoZWNrID09IE5VTEwpCisJCQl7CisJCQkJVFJBQ0VfREVCVUcoCisJCQkJCQlJTkZPLAorCQkJCQkJIiVzWyVzIHBsdWdpbl0gVW5hYmxlIHRvIHJlc29sdmUgc3ltYm9sIGZvciAnZWFwX21ldGhvZF9jaGVjayc6ICVzIixESUFNRUFQX0VYVEVOU0lPTiwKKwkJCQkJCXBsdWdpbi0+bWV0aG9kbmFtZSwgZGxlcnJvcigpKTsKKwkJCQlyZXR1cm4gRUlOVkFMOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJcGx1Z2luLT5lYXBfbWV0aG9kX2NoZWNrID0gTlVMTDsKKwkJCVRSQUNFX0RFQlVHKElORk8sIiVzWyVzIHBsdWdpbl0gVW5hdmFpbGFibGUgZnVuY3Rpb24gJ2VhcF9tZXRob2RfY2hlY2snIixESUFNRUFQX0VYVEVOU0lPTiwgcGx1Z2luLT5tZXRob2RuYW1lKTsKKwkJCXJldHVybiBFSU5WQUw7CisJCX0KKworCQkvKiBlYXBfbWV0aG9kX3Byb2Nlc3MgbWV0aG9kICovCisJCWlmIChyZWdpc3RlcnBsdWdpbi0+cHJvY2VzcykKKwkJeworCQkJcGx1Z2luLT5lYXBfbWV0aG9kX3Byb2Nlc3MgPSAoaW50KCopKHN0cnVjdCBlYXBfc3RhdGVfbWFjaGluZSAqLAorCQkJCQlzdHJ1Y3QgZWFwX3BhY2tldCopKSBkbHN5bShwbHVnaW4tPmhhbmRsZXIsCisJCQkJCXJlZ2lzdGVycGx1Z2luLT5wcm9jZXNzKTsKKwkJCWlmIChwbHVnaW4tPmVhcF9tZXRob2RfcHJvY2VzcyA9PSBOVUxMKQorCQkJeworCQkJCVRSQUNFX0RFQlVHKAorCQkJCQkJSU5GTywKKwkJCQkJCSIlc1slcyBwbHVnaW5dIFVuYWJsZSB0byByZXNvbHZlIHN5bWJvbCBmb3IgJ2VhcF9tZXRob2RfcHJvY2Vzcyc6ICVzIixESUFNRUFQX0VYVEVOU0lPTiwKKwkJCQkJCXBsdWdpbi0+bWV0aG9kbmFtZSwgZGxlcnJvcigpKTsKKwkJCQlyZXR1cm4gRUlOVkFMOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJcGx1Z2luLT5lYXBfbWV0aG9kX3Byb2Nlc3MgPSBOVUxMOworCQkJVFJBQ0VfREVCVUcoSU5GTywiJXNbJXMgcGx1Z2luXSBVbmF2YWlsYWJsZSBmdW5jdGlvbiAnZWFwX21ldGhvZF9wcm9jZXNzJyIsRElBTUVBUF9FWFRFTlNJT04sIHBsdWdpbi0+bWV0aG9kbmFtZSk7CisJCQlyZXR1cm4gRUlOVkFMOworCQl9CisKKwkJLyogZWFwX21ldGhvZF9pc0RvbmUgbWV0aG9kICovCisJCWlmIChyZWdpc3RlcnBsdWdpbi0+aXNEb25lKQorCQl7CisJCQlwbHVnaW4tPmVhcF9tZXRob2RfaXNEb25lCisJCQkJCT0gKGJvb2xlYW4oKikoc3RydWN0IGVhcF9zdGF0ZV9tYWNoaW5lICopKSBkbHN5bSgKKwkJCQkJCQlwbHVnaW4tPmhhbmRsZXIsIHJlZ2lzdGVycGx1Z2luLT5pc0RvbmUpOworCQkJaWYgKHBsdWdpbi0+ZWFwX21ldGhvZF9pc0RvbmUgPT0gTlVMTCkKKwkJCXsKKwkJCQlUUkFDRV9ERUJVRygKKwkJCQkJCUlORk8sCisJCQkJCQkiJXNbJXMgcGx1Z2luXSBVbmFibGUgdG8gcmVzb2x2ZSBzeW1ib2wgZm9yICdlYXBfbWV0aG9kX2lzRG9uZSc6ICVzIixESUFNRUFQX0VYVEVOU0lPTiwKKwkJCQkJCXBsdWdpbi0+bWV0aG9kbmFtZSwgZGxlcnJvcigpKTsKKwkJCQlyZXR1cm4gRUlOVkFMOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJcGx1Z2luLT5lYXBfbWV0aG9kX2lzRG9uZSA9IE5VTEw7CisJCQlUUkFDRV9ERUJVRyhJTkZPLCIlc1slcyBwbHVnaW5dIFVuYXZhaWxhYmxlIGZ1bmN0aW9uICdlYXBfbWV0aG9kX2lzRG9uZSciLERJQU1FQVBfRVhURU5TSU9OLCBwbHVnaW4tPm1ldGhvZG5hbWUpOworCQkJcmV0dXJuIEVJTlZBTDsKKwkJfQorCisJCS8qIGVhcF9tZXRob2RfZ2V0S2V5IG1ldGhvZCAqLworCQlpZiAocmVnaXN0ZXJwbHVnaW4tPmdldEtleSkKKwkJeworCQkJcGx1Z2luLT5lYXBfbWV0aG9kX2dldEtleSA9IChpbnQoKikoc3RydWN0IGVhcF9zdGF0ZV9tYWNoaW5lICosCisJCQkJCXU4KiosIGludCosdTgqKiwgaW50KikpIGRsc3ltKHBsdWdpbi0+aGFuZGxlciwgcmVnaXN0ZXJwbHVnaW4tPmdldEtleSk7CisJCQlpZiAocGx1Z2luLT5lYXBfbWV0aG9kX2dldEtleSA9PSBOVUxMKQorCQkJeworCQkJCVRSQUNFX0RFQlVHKAorCQkJCQkJSU5GTywKKwkJCQkJCSIlc1slcyBwbHVnaW5dIFVuYWJsZSB0byByZXNvbHZlIHN5bWJvbCBmb3IgJ2VhcF9tZXRob2RfZ2V0S2V5JzogJXMiLERJQU1FQVBfRVhURU5TSU9OLAorCQkJCQkJcGx1Z2luLT5tZXRob2RuYW1lLCBkbGVycm9yKCkpOworCQkJCXJldHVybiBFSU5WQUw7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlwbHVnaW4tPmVhcF9tZXRob2RfZ2V0S2V5ID0gTlVMTDsKKwkJCVRSQUNFX0RFQlVHKEZVTEwrMSwiJXNbJXMgcGx1Z2luXSBVbmF2YWlsYWJsZSBmdW5jdGlvbiAnZWFwX21ldGhvZF9nZXRLZXknIixESUFNRUFQX0VYVEVOU0lPTiwgcGx1Z2luLT5tZXRob2RuYW1lKTsKKwkJfQorCisJCS8qIGVhcF9tZXRob2RfdW5yZWdpc3RlciBtZXRob2QgKi8KKwkJaWYgKHJlZ2lzdGVycGx1Z2luLT51bnJlZ2lzdGVyKQorCQl7CisJCQlwbHVnaW4tPmVhcF9tZXRob2RfdW5yZWdpc3RlciA9ICh2b2lkKCopKHZvaWQpKSBkbHN5bSgKKwkJCQkJcGx1Z2luLT5oYW5kbGVyLCByZWdpc3RlcnBsdWdpbi0+dW5yZWdpc3Rlcik7CisJCQlpZiAocGx1Z2luLT5lYXBfbWV0aG9kX3VucmVnaXN0ZXIgPT0gTlVMTCkKKwkJCXsKKwkJCQlUUkFDRV9ERUJVRygKKwkJCQkJCUlORk8sCisJCQkJCQkiJXNbJXMgcGx1Z2luXSBVbmFibGUgdG8gcmVzb2x2ZSBzeW1ib2wgZm9yICdlYXBfbWV0aG9kX3VucmVnaXN0ZXInOiAlcyIsRElBTUVBUF9FWFRFTlNJT04sCisJCQkJCQlwbHVnaW4tPm1ldGhvZG5hbWUsIGRsZXJyb3IoKSk7CisJCQkJcmV0dXJuIEVJTlZBTDsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCXBsdWdpbi0+ZWFwX21ldGhvZF91bnJlZ2lzdGVyID0gTlVMTDsKKwkJCVRSQUNFX0RFQlVHKEZVTEwrMSwiJXNbJXMgcGx1Z2luXSBVbmF2YWlsYWJsZSBmdW5jdGlvbiAnZWFwX21ldGhvZF91bnJlZ2lzdGVyJyIsRElBTUVBUF9FWFRFTlNJT04sIHBsdWdpbi0+bWV0aG9kbmFtZSk7CisJCX0KKworCQkvKiBlYXBfbWV0aG9kX2RhdGFmcmVlIG1ldGhvZCAqLworCQlpZiAocmVnaXN0ZXJwbHVnaW4tPmRhdGFmcmVlKQorCQl7CisJCQlwbHVnaW4tPmVhcF9tZXRob2RfZnJlZSA9ICh2b2lkKCopKHZvaWQgKikpIGRsc3ltKHBsdWdpbi0+aGFuZGxlciwKKwkJCQkJcmVnaXN0ZXJwbHVnaW4tPmRhdGFmcmVlKTsKKwkJCWlmIChwbHVnaW4tPmVhcF9tZXRob2RfZnJlZSA9PSBOVUxMKQorCQkJeworCQkJCVRSQUNFX0RFQlVHKAorCQkJCQkJSU5GTywKKwkJCQkJCSIlc1slcyBwbHVnaW5dIFVuYWJsZSB0byByZXNvbHZlIHN5bWJvbCBmb3IgJ2VhcF9tZXRob2RfZGF0YWZyZWUnOiAlcyIsRElBTUVBUF9FWFRFTlNJT04sCisJCQkJCQlwbHVnaW4tPm1ldGhvZG5hbWUsIGRsZXJyb3IoKSk7CisJCQkJcmV0dXJuIEVJTlZBTDsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCXBsdWdpbi0+ZWFwX21ldGhvZF9mcmVlID0gTlVMTDsKKwkJCVRSQUNFX0RFQlVHKEZVTEwrMSwiJXNbJXMgcGx1Z2luXSBVbmF2YWlsYWJsZSBmdW5jdGlvbiAnZWFwX21ldGhvZF9kYXRhZnJlZSciLERJQU1FQVBfRVhURU5TSU9OLCBwbHVnaW4tPm1ldGhvZG5hbWUpOworCQl9CisKKwkJaWYgKHBsdWdpbi0+ZWFwX21ldGhvZF9jb25maWd1cmUgIT0gTlVMTCkKKwkJeworCQkJLyogY2FsbCB0aGUgY29uZmlndXJhdGlvbiBtZXRob2QgKi8KKwkJCXJldCA9ICgqcGx1Z2luLT5lYXBfbWV0aG9kX2NvbmZpZ3VyZSkocGx1Z2luLT5jb25mZmlsZSk7CisJCQlpZiAocmV0ICE9IDApCisJCQl7CisJCQkJVFJBQ0VfREVCVUcoCisJCQkJCQlJTkZPLAorCQkJCQkJIiVzWyVzIHBsdWdpbl0gVW5hYmxlIHRvIGNvbmZpZ3VyZSB0aGUgcGx1Z2luIixESUFNRUFQX0VYVEVOU0lPTiwKKwkJCQkJCXBsdWdpbi0+bWV0aG9kbmFtZSk7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJfQorCisJCVRSQUNFX0RFQlVHKEZVTEwsICIlc1slcyBwbHVnaW5dIExvYWRlZCBzdWNjZXNzZnVsbHkuIixESUFNRUFQX0VYVEVOU0lPTiwKKwkJCQlwbHVnaW4tPm1ldGhvZG5hbWUpOworCisJCS8qIGxvYWQgbmV4dCBtZXRob2QgKi8KKwl9CisKKwlyZXR1cm4gMDsKK30KKworYm9vbGVhbiBkaWFtZWFwX3BsdWdpbl9leGlzdCh1MzIgdmVuZG9yLCBlYXBfdHlwZSB0eXBlKQoreworCisJVFJBQ0VfRU5UUlkoIiVkICVkIix2ZW5kb3IsdHlwZSk7CisJc3RydWN0IGZkX2xpc3QgKiBwbDsKKworCWZvciAocGwgPSBwbHVnaW5zX2xpc3QubmV4dDsgcGwgIT0gJnBsdWdpbnNfbGlzdDsgcGwgPSBwbC0+bmV4dCkKKwl7CisJCXN0cnVjdCBwbHVnaW4gKiBwbHVnaW4gPSAoc3RydWN0IHBsdWdpbiAqKSBwbDsKKwkJaWYgKHBsdWdpbi0+bWV0aG9kdHlwZSA9PSB0eXBlICYmIHBsdWdpbi0+dmVuZG9yID09IHZlbmRvcikKKwkJeworCQkJcmV0dXJuIFRSVUU7CisJCX0KKwl9CisJcmV0dXJuIEZBTFNFOworfQorCitpbnQgZGlhbWVhcF9wbHVnaW5fdW5sb2FkKHZvaWQpCit7CisKKwl3aGlsZSAoIUZEX0lTX0xJU1RfRU1QVFkoJnBsdWdpbnNfbGlzdCkpCisJeworCQlzdHJ1Y3QgZmRfbGlzdCAqIHBsdWdpbiA9IHBsdWdpbnNfbGlzdC5uZXh0OworCQlzdHJ1Y3QgcGx1Z2luICogaXRlbSA9IChzdHJ1Y3QgcGx1Z2luICopIHBsdWdpbjsKKworCQlmZF9saXN0X3VubGluayhwbHVnaW4pOworCisJCWlmIChpdGVtLT5lYXBfbWV0aG9kX3VucmVnaXN0ZXIgIT0gTlVMTCkKKwkJeworCQkJKCppdGVtLT5lYXBfbWV0aG9kX3VucmVnaXN0ZXIpKCk7CisJCX0KKworCQlpZiAoaXRlbS0+aGFuZGxlcikKKwkJeworCQkJaWYgKGRsY2xvc2UoaXRlbS0+aGFuZGxlcikgIT0gMCkKKwkJCXsKKwkJCQlUUkFDRV9ERUJVRyAoSU5GTywgIiVzRmFpbCB0byB1bmxvYWQgcGx1Z2luICVzIDogJXMiLERJQU1FQVBfRVhURU5TSU9OLCBpdGVtLT5tZXRob2RuYW1lLCBkbGVycm9yKCkpOworCQkJfQorCQl9CisKKwkJZnJlZShpdGVtLT5jb25mZmlsZSk7CisJCWZyZWUoaXRlbS0+cGx1Z2luZmlsZSk7CisJCWZyZWUoaXRlbSk7CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9hcHBfZGlhbWVhcC9kaWFtZWFwX3BsdWdpbnMuaCBiL2V4dGVuc2lvbnMvYXBwX2RpYW1lYXAvZGlhbWVhcF9wbHVnaW5zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWExMmMzOQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvYXBwX2RpYW1lYXAvZGlhbWVhcF9wbHVnaW5zLmgKQEAgLTAsMCArMSw2NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpCisgKiBBdXRob3IgOiBTb3VoZWlsIEJlbiBBeWVkIDxzb3VoZWlsQHRlcmEuaWNzLmtlaW8uYWMuanA+CisgKgorICogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTAsIFNvdWhlaWwgQmVuIEF5ZWQsIFRlcmFva2EgTGFib3JhdG9yeSBvZiBLZWlvIFVuaXZlcnNpdHksIGFuZCB0aGUgV0lERSBQcm9qZWN0CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBTb3VoZWlsIEJlbiBBeWVkIDxzb3VoZWlsQHRlcmEuaWNzLmtlaW8uYWMuanA+LgorICoKKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgU291aGVpbCBCZW4gQXllZCwgVGVyYW9rYSBMYWJvcmF0b3J5IG9mIEtlaW8gVW5pdmVyc2l0eSBvciB0aGUgV0lERSBQcm9qZWN0IG5vciB0aGUKKyAqICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICcnQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIERJQU1FQVBfUExVR0lOU19IXworI2RlZmluZSBESUFNRUFQX1BMVUdJTlNfSF8KKworI2luY2x1ZGUgPGRsZmNuLmg+CisKKworCitzdGF0aWMgc3RydWN0IGZkX2xpc3QgcGx1Z2luc19saXN0ID0gRkRfTElTVF9JTklUSUFMSVpFUihwbHVnaW5zX2xpc3QpOworCisvKiBBZGQgYSBwbHVnLWluIHRvIHRoZSBsaXN0IG9mIHBsdWdpbnMqLworaW50IGRpYW1lYXBfcGx1Z2luX2FkZChjaGFyICogbmFtZSwgZWFwX3R5cGUgbWV0aG9kdHlwZSwgdTMyIHZlbmRvciwgY2hhciAqIGZpbGVuYW1lLAorCQljaGFyICogY29uZmZpbGUpOworCisvKiBEdW1wIGFsbCBwbHVnLWlucyAocGx1Z2luc19saXN0KSovCit2b2lkIGRpYW1lYXBfcGx1Z2luX2R1bXAoKTsKKworLyogUmV0dXJuIHBvaW50ZXIgdG8gYSBwbHVnLWluICovCitpbnQgZGlhbWVhcF9wbHVnaW5fZ2V0KHUzMiB2ZW5kb3IsZWFwX3R5cGUgdHlwZSwgc3RydWN0IHBsdWdpbiAqKiBnZXRwbHVnaW4pOworCisvKiBMb2FkIHBsdWctaW5zICovCitpbnQgZGlhbWVhcF9wbHVnaW5fbG9hZCh2b2lkKTsKKworLyogQ2hlY2sgaWYgYSBwbHVnLWluIGV4aXN0cyBmb3IgYSBnaXZlbiBFQVAgbWV0aG9kIHR5cGUgKi8KK2Jvb2xlYW4gZGlhbWVhcF9wbHVnaW5fZXhpc3QodTMyIHZlbmRvciwgZWFwX3R5cGUgdHlwZSk7CisKKy8qIFVubG9hZCBhbGwgcGx1Zy1pbnMqLworaW50IGRpYW1lYXBfcGx1Z2luX3VubG9hZCh2b2lkKTsKKworI2VuZGlmIC8qIERJQU1FQVBfUExVR0lOU19IXyAqLwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9hcHBfZGlhbWVhcC9kaWFtZWFwX3NlcnZlci5jIGIvZXh0ZW5zaW9ucy9hcHBfZGlhbWVhcC9kaWFtZWFwX3NlcnZlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5M2Y2YmIKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2FwcF9kaWFtZWFwL2RpYW1lYXBfc2VydmVyLmMKQEAgLTAsMCArMSwzNDE5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkKKyAqIEF1dGhvciA6IFNvdWhlaWwgQmVuIEF5ZWQgPHNvdWhlaWxAdGVyYS5pY3Mua2Vpby5hYy5qcD4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMCwgU291aGVpbCBCZW4gQXllZCwgVGVyYW9rYSBMYWJvcmF0b3J5IG9mIEtlaW8gVW5pdmVyc2l0eSwgYW5kIHRoZSBXSURFIFByb2plY3QKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IFNvdWhlaWwgQmVuIEF5ZWQgPHNvdWhlaWxAdGVyYS5pY3Mua2Vpby5hYy5qcD4uCisgKgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiBTb3VoZWlsIEJlbiBBeWVkLCBUZXJhb2thIExhYm9yYXRvcnkgb2YgS2VpbyBVbml2ZXJzaXR5IG9yIHRoZSBXSURFIFByb2plY3Qgbm9yIHRoZQorICogICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgJydBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiZGlhbWVhcF9jb21tb24uaCIKKworLyogaGFuZGxlciBmb3IgRGlhbUVBUCBzZXJ2ZXIgY2FsbGJhY2sgKi8KK3N0YXRpYyBzdHJ1Y3QgZGlzcF9oZGwgKiBoYW5kbGU7CisKKy8qIHNlc3Npb24gaGFuZGxlciBmb3IgRGlhbUVBUCBzZXNzaW9ucyBzdGF0ZSBtYWNoaW5lICovCitzdGF0aWMgc3RydWN0IHNlc3Npb25faGFuZGxlciAqIGRpYW1lYXBfc2VydmVyX3JlZyA9IE5VTEw7CisKKworc3RydWN0IGF2cF9tYXhfb2NjdXJlbmNlcyBhdXRoX2F2cHNbXSA9Cit7Cit7ICJTZXJ2aWNlLVR5cGUiLCAxIH0sCit7ICJDYWxsYmFjay1OdW1iZXIiLCAxIH0sCit7ICJDYWxsYmFjay1JZCIsIDEgfSwKK3sgIklkbGUtVGltZW91dCIsIDEgfSwKK3sgIlBvcnQtTGltaXQiLCAxIH0sCit7ICJOQVMtRmlsdGVyLVJ1bGUiIC0gMSB9LAoreyAiRmlsdGVyLUlkIiwgLTEgfSwKK3sgIkNvbmZpZ3VyYXRpb24tVG9rZW4iLCAtMSB9LAoreyAiUW9TLUZpbHRlci1SdWxlIiwgLTEgfSwKK3sgIkZyYW1lZC1Qcm90b2NvbCIsIDEgfSwKK3sgIkZyYW1lZC1Sb3V0aW5nIiwgMSB9LAoreyAiRnJhbWVkLU1UVSIsIDEgfSwKK3sgIkZyYW1lZC1Db21wcmVzc2lvbiIsIC0xIH0sCit7ICJGcmFtZWQtSVAtQWRkcmVzcyIsIDEgfSwKK3sgIkZyYW1lZC1JUC1OZXRtYXNrIiwgMSB9LAoreyAiRnJhbWVkLVJvdXRlIiwgLTEgfSwKK3sgIkZyYW1lZC1Qb29sIiwgMSB9LAoreyAiRnJhbWVkLUludGVyZmFjZS1JZCIsIDEgfSwKK3sgIkZyYW1lZC1JUHY2LVByZWZpeCIsIC0xIH0sCit7ICJGcmFtZWQtSVB2Ni1Qb29sIiwgMSB9LAoreyAiRnJhbWVkLUlQdjYtUm91dGUiLCAtMSB9LAoreyAiRnJhbWVkLUlQWC1OZXR3b3JrIiwgMSB9LAoreyAiRnJhbWVkLUFwcGxldGFsay1MaW5rIiwgMSB9LAoreyAiRnJhbWVkLUFwcGxldGFsay1OZXR3b3JrIiwgLTEgfSwKK3sgIkZyYW1lZC1BcHBsZXRhbGstWm9uZSIsIDEgfSwKK3sgIk5BUy1JUHY2LUFkZHJlc3MiLCAwIH0sCit7ICJOQVMtSWRlbnRpZmllciIsIDAgfSwKK3sgIk5BUy1JUC1BZGRyZXNzIiwgMCB9LAoreyAiTkFTLVBvcnQiLCAwIH0sCit7ICJOQVMtUG9ydC1JZCIsIDAgfSwKK3sgIk5BUy1Qb3J0LVR5cGUiLCAwIH0sCit7ICJDYWxsZWQtU3RhdGlvbi1JZCIsIDAgfSwKK3sgIkNhbGxpbmctU3RhdGlvbi1JZCIsIDAgfSwKK3sgIkNvbm5lY3QtSW5mbyIsIDAgfSwKK3sgIk9yaWdpbmF0aW5nLUxpbmUtSW5mbyIsIDAgfSB9OworCisKKwordm9pZCBkaWFtZWFwX2NsaV9zZXNzX2NsZWFudXAoc3RydWN0IHNlc3Nfc3RhdGUgKiBkaWFtZWFwX3Nlc3NfZGF0YSwgb3MwX3Qgc2lkLCB2b2lkICogb3BhcXVlKQoreworCisJQ0hFQ0tfUEFSQU1TX0RPKCBkaWFtZWFwX3Nlc3NfZGF0YSwgcmV0dXJuICk7CisKKwlpZiAoZGlhbWVhcF9zZXNzX2RhdGEgIT0gTlVMTCkKKwl7CisJCWlmIChkaWFtZWFwX3Nlc3NfZGF0YS0+bWV0aG9kRGF0YSAhPSBOVUxMKQorCQl7CisJCQlzdHJ1Y3QgcGx1Z2luICogY3BsdWdpbjsKKwkJCWlmIChkaWFtZWFwX3BsdWdpbl9nZXQoZGlhbWVhcF9zZXNzX2RhdGEtPmN1cnJlbnRWZW5kb3IsCisJCQkJCWRpYW1lYXBfc2Vzc19kYXRhLT5jdXJyZW50TWV0aG9kLCAmY3BsdWdpbikpCisJCQl7CisJCQkJVFJBQ0VfREVCVUcoSU5GTywiJXNVbmFibGUgdG8gYWNjZXNzIEVBUCBNZXRob2QgcGx1Z2luIHtUeXBlPSVkLCBWZW5kb3I9JWR9LiIsRElBTUVBUF9FWFRFTlNJT04sZGlhbWVhcF9zZXNzX2RhdGEtPmN1cnJlbnRNZXRob2QsZGlhbWVhcF9zZXNzX2RhdGEtPmN1cnJlbnRWZW5kb3IpOworCQkJfQorCisJCQlpZiAoY3BsdWdpbi0+ZWFwX21ldGhvZF9mcmVlKQorCQkJeworCQkJCSgqY3BsdWdpbi0+ZWFwX21ldGhvZF9mcmVlKShkaWFtZWFwX3Nlc3NfZGF0YS0+bWV0aG9kRGF0YSk7CisJCQkJZGlhbWVhcF9zZXNzX2RhdGEtPm1ldGhvZERhdGEgPSBOVUxMOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCVRSQUNFX0RFQlVHKEZVTEwrMSwiJXNbJXMgcGx1Z2luXSBkYXRhZnJlZSBmdW5jdGlvbiBub3QgYXZhaWxhYmxlLiIsRElBTUVBUF9FWFRFTlNJT04sY3BsdWdpbi0+bWV0aG9kbmFtZSk7CisJCQkJaWYgKGRpYW1lYXBfc2Vzc19kYXRhLT5tZXRob2REYXRhICE9IE5VTEwpCisJCQkJeworCQkJCQlmcmVlKGRpYW1lYXBfc2Vzc19kYXRhLT5tZXRob2REYXRhKTsKKwkJCQkJZGlhbWVhcF9zZXNzX2RhdGEtPm1ldGhvZERhdGEgPSBOVUxMOworCQkJCX0KKwkJCX0KKwkJCWlmIChkaWFtZWFwX3Nlc3NfZGF0YS0+bWV0aG9kRGF0YSkKKwkJCXsKKwkJCQlUUkFDRV9ERUJVRyhJTkZPLCIlc1Nlc3Npb24gc3RhdGUgd2FzIG5vdCBiZWVuIGZyZWVkIGNvcnJlY3RseSEhISIsRElBTUVBUF9FWFRFTlNJT04pOworCQkJfQorCQl9CisKKwkJaWYgKGRpYW1lYXBfc2Vzc19kYXRhLT51c2VyLnBhc3N3b3JkICE9IE5VTEwpCisJCXsKKwkJCWZyZWUoZGlhbWVhcF9zZXNzX2RhdGEtPnVzZXIucGFzc3dvcmQpOworCQkJZGlhbWVhcF9zZXNzX2RhdGEtPnVzZXIucGFzc3dvcmQgPSBOVUxMOworCQl9CisKKwkJaWYgKGRpYW1lYXBfc2Vzc19kYXRhLT51c2VyLnVzZXJpZCAhPSBOVUxMKQorCQl7CisJCQlmcmVlKGRpYW1lYXBfc2Vzc19kYXRhLT51c2VyLnVzZXJpZCk7CisJCQlkaWFtZWFwX3Nlc3NfZGF0YS0+dXNlci51c2VyaWQgPSBOVUxMOworCQl9CisJCWZyZWUoZGlhbWVhcF9zZXNzX2RhdGEpOworCQlkaWFtZWFwX3Nlc3NfZGF0YSA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgaW50IGRpYW1lYXBfaW5pdGlhbGl6ZV9kaWFtZWFwX3NtKAorCQlzdHJ1Y3QgZGlhbWVhcF9zdGF0ZV9tYWNoaW5lICogZGlhbWVhcF9zbSwKKwkJc3RydWN0IHNlc3Nfc3RhdGUgKiBkaWFtZWFwX3Nlc3NfZGF0YSkKK3sKKwlUUkFDRV9FTlRSWSgiJXAgJXAiLCBkaWFtZWFwX3NtLCBkaWFtZWFwX3Nlc3NfZGF0YSk7CisKKwlpbnQgaTsKKworCS8qIEluaXRpYWxpemUgTG9uZyBUZXJtIFZhcmlhYmxlcyAqLworCWlmIChkaWFtZWFwX3Nlc3NfZGF0YSAhPSBOVUxMKQorCXsKKwkJZGlhbWVhcF9zbS0+aW52YWxpZF9lYXBwYWNrZXRzID0gZGlhbWVhcF9zZXNzX2RhdGEtPmludmFsaWRfZWFwcGFja2V0czsKKworCQkvKiBJbml0aWFsaXplIGVhcCBzdGF0ZSBtYWNoaW5lIHZhcmlhYmxlcyAqLworCQkvKlVzZXIqLworCQlkaWFtZWFwX3NtLT5lYXBfc20udXNlci5pZCA9IGRpYW1lYXBfc2Vzc19kYXRhLT51c2VyLmlkOworCisJCWlmICgoZGlhbWVhcF9zZXNzX2RhdGEtPnVzZXIudXNlcmlkICE9IE5VTEwpCisJCQkJJiYgKGRpYW1lYXBfc2Vzc19kYXRhLT51c2VyLnVzZXJpZExlbmd0aCA+IDApKQorCQl7CisJCQlkaWFtZWFwX3NtLT5lYXBfc20udXNlci51c2VyaWRMZW5ndGgKKwkJCQkJPSBkaWFtZWFwX3Nlc3NfZGF0YS0+dXNlci51c2VyaWRMZW5ndGg7CisJCQlDSEVDS19NQUxMT0MoZGlhbWVhcF9zbS0+ZWFwX3NtLnVzZXIudXNlcmlkPSBtYWxsb2MoZGlhbWVhcF9zbS0+ZWFwX3NtLnVzZXIudXNlcmlkTGVuZ3RoKzEpKTsKKwkJCVU4Q09QWShkaWFtZWFwX3NtLT5lYXBfc20udXNlci51c2VyaWQsMCxkaWFtZWFwX3NtLT5lYXBfc20udXNlci51c2VyaWRMZW5ndGgrMSxkaWFtZWFwX3Nlc3NfZGF0YS0+dXNlci51c2VyaWQpOworCQkJZnJlZShkaWFtZWFwX3Nlc3NfZGF0YS0+dXNlci51c2VyaWQpOworCQkJZGlhbWVhcF9zZXNzX2RhdGEtPnVzZXIudXNlcmlkID0gTlVMTDsKKworCQl9CisJCWVsc2UKKwkJeworCQkJVFJBQ0VfREVCVUcoSU5GTywiJXMgdXNlciBub3QgaWRlbnRpZmllZCB5ZXQuIixESUFNRUFQX0VYVEVOU0lPTik7CisJCQlkaWFtZWFwX3NtLT5lYXBfc20udXNlci51c2VyaWRMZW5ndGggPSAwOworCQkJZGlhbWVhcF9zbS0+ZWFwX3NtLnVzZXIudXNlcmlkID0gTlVMTDsKKwkJfQorCisJCWlmICgoZGlhbWVhcF9zZXNzX2RhdGEtPnVzZXIucGFzc3dvcmQgIT0gTlVMTCkKKwkJCQkmJiAoZGlhbWVhcF9zZXNzX2RhdGEtPnVzZXIucGFzc3dvcmRMZW5ndGggPiAwKSkKKwkJeworCQkJZGlhbWVhcF9zbS0+ZWFwX3NtLnVzZXIucGFzc3dvcmRMZW5ndGgKKwkJCQkJPSBkaWFtZWFwX3Nlc3NfZGF0YS0+dXNlci5wYXNzd29yZExlbmd0aDsKKwkJCUNIRUNLX01BTExPQyhkaWFtZWFwX3NtLT5lYXBfc20udXNlci5wYXNzd29yZCA9IG1hbGxvYyhkaWFtZWFwX3NtLT5lYXBfc20udXNlci5wYXNzd29yZExlbmd0aCsxKSk7CisJCQlVOENPUFkoZGlhbWVhcF9zbS0+ZWFwX3NtLnVzZXIucGFzc3dvcmQsMCxkaWFtZWFwX3NtLT5lYXBfc20udXNlci5wYXNzd29yZExlbmd0aCsxLCBkaWFtZWFwX3Nlc3NfZGF0YS0+dXNlci5wYXNzd29yZCk7CisJCQlmcmVlKGRpYW1lYXBfc2Vzc19kYXRhLT51c2VyLnBhc3N3b3JkKTsKKwkJCWRpYW1lYXBfc2Vzc19kYXRhLT51c2VyLnBhc3N3b3JkID0gTlVMTDsKKwkJfQorCQllbHNlCisJCXsKKwkJCWRpYW1lYXBfc20tPmVhcF9zbS51c2VyLnBhc3N3b3JkTGVuZ3RoID0gMDsKKwkJCWRpYW1lYXBfc20tPmVhcF9zbS51c2VyLnBhc3N3b3JkID0gTlVMTDsKKwkJfQorCisJCWRpYW1lYXBfc20tPmVhcF9zbS51c2VyLm1ldGhvZElkID0gZGlhbWVhcF9zZXNzX2RhdGEtPnVzZXIubWV0aG9kSWQ7CisJCWZvciAoaSA9IDA7IGkgPCBNQVhNRVRIT0RTOyBpKyspCisJCXsKKwkJCWRpYW1lYXBfc20tPmVhcF9zbS51c2VyLm1ldGhvZHNbaV0ubWV0aG9kCisJCQkJCT0gZGlhbWVhcF9zZXNzX2RhdGEtPnVzZXIubWV0aG9kc1tpXS5tZXRob2Q7CisJCQlkaWFtZWFwX3NtLT5lYXBfc20udXNlci5tZXRob2RzW2ldLnZlbmRvcgorCQkJCQk9IGRpYW1lYXBfc2Vzc19kYXRhLT51c2VyLm1ldGhvZHNbaV0udmVuZG9yOworCQl9CisJCWZvciAoaSA9IDA7IGkgPCBNQVhQUk9QT1NFRE1FVEhPRFM7IGkrKykKKwkJeworCQkJZGlhbWVhcF9zbS0+ZWFwX3NtLnVzZXIucHJvcG9zZWRtZXRob2RzW2ldLm1ldGhvZAorCQkJCQk9IGRpYW1lYXBfc2Vzc19kYXRhLT51c2VyLnByb3Bvc2VkbWV0aG9kc1tpXS5tZXRob2Q7CisJCQlkaWFtZWFwX3NtLT5lYXBfc20udXNlci5wcm9wb3NlZG1ldGhvZHNbaV0udmVuZG9yCisJCQkJCT0gZGlhbWVhcF9zZXNzX2RhdGEtPnVzZXIucHJvcG9zZWRtZXRob2RzW2ldLnZlbmRvcjsKKwkJfQorCisJCWRpYW1lYXBfc20tPmVhcF9zbS51c2VyLnBtZXRob2RzID0gZGlhbWVhcF9zZXNzX2RhdGEtPnVzZXIucG1ldGhvZHM7CisJCWRpYW1lYXBfc20tPmVhcF9zbS51c2VyLnByb3Bvc2VkX2VhcF9tZXRob2QKKwkJCQk9IGRpYW1lYXBfc2Vzc19kYXRhLT51c2VyLnByb3Bvc2VkX2VhcF9tZXRob2Q7CisJCWRpYW1lYXBfc20tPmVhcF9zbS51c2VyLnByb3Bvc2VkX2VhcF9tZXRob2RfdmVuZG9yCisJCQkJPSBkaWFtZWFwX3Nlc3NfZGF0YS0+dXNlci5wcm9wb3NlZF9lYXBfbWV0aG9kX3ZlbmRvcjsKKwkJZGlhbWVhcF9zbS0+ZWFwX3NtLnVzZXIuc3VjY2VzcyA9IGRpYW1lYXBfc2Vzc19kYXRhLT51c2VyLnN1Y2Nlc3M7CisKKwkJZGlhbWVhcF9zbS0+ZWFwX3NtLmN1cnJlbnRJZCA9IGRpYW1lYXBfc2Vzc19kYXRhLT5jdXJyZW50SWQ7CisJCWRpYW1lYXBfc20tPmVhcF9zbS5jdXJyZW50VmVuZG9yID0gZGlhbWVhcF9zZXNzX2RhdGEtPmN1cnJlbnRWZW5kb3I7CisJCWRpYW1lYXBfc20tPmVhcF9zbS5sYXN0SWQgPSBkaWFtZWFwX3Nlc3NfZGF0YS0+bGFzdElkOworCQlkaWFtZWFwX3NtLT5lYXBfc20ubWV0aG9kU3RhdGUgPSBkaWFtZWFwX3Nlc3NfZGF0YS0+bWV0aG9kU3RhdGU7CisJCWRpYW1lYXBfc20tPmVhcF9zbS5jdXJyZW50TWV0aG9kID0gZGlhbWVhcF9zZXNzX2RhdGEtPmN1cnJlbnRNZXRob2Q7CisKKwkJZGlhbWVhcF9zbS0+ZWFwX3NtLm1ldGhvZERhdGEgPSBkaWFtZWFwX3Nlc3NfZGF0YS0+bWV0aG9kRGF0YTsKKwkJZGlhbWVhcF9zZXNzX2RhdGEtPm1ldGhvZERhdGEgPSBOVUxMOworCisJCWlmIChkaWFtZWFwX3NtLT5lYXBfc20uY3VycmVudE1ldGhvZCAhPSBUWVBFX05PTkUpCisJCXsKKwkJCWRpYW1lYXBfcGx1Z2luX2dldChkaWFtZWFwX3NtLT5lYXBfc20uY3VycmVudFZlbmRvciwKKwkJCQkJZGlhbWVhcF9zbS0+ZWFwX3NtLmN1cnJlbnRNZXRob2QsCisJCQkJCSZkaWFtZWFwX3NtLT5lYXBfc20uc2VsZWN0ZWRNZXRob2QpOworCQl9CisKKwkJLyogZnJlZSBzZXNzaW9uIGRhdGEqLworCQlmcmVlKGRpYW1lYXBfc2Vzc19kYXRhKTsKKwkJZGlhbWVhcF9zZXNzX2RhdGEgPSBOVUxMOworCisJfQorCWVsc2UKKwl7CisJCWRpYW1lYXBfc20tPmludmFsaWRfZWFwcGFja2V0cyA9IDA7CisKKwkJLyogSW5pdGlhbGl6ZSBlYXAgc3RhdGUgbWFjaGluZSB2YXJpYWJsZXMgKi8KKwkJLypVc2VyKi8KKwkJZGlhbWVhcF9zbS0+ZWFwX3NtLnVzZXIuaWQgPSAwOworCQlkaWFtZWFwX3NtLT5lYXBfc20udXNlci51c2VyaWQgPSBOVUxMOworCQlkaWFtZWFwX3NtLT5lYXBfc20udXNlci51c2VyaWRMZW5ndGggPSAwOworCQlkaWFtZWFwX3NtLT5lYXBfc20udXNlci5wYXNzd29yZCA9IE5VTEw7CisJCWRpYW1lYXBfc20tPmVhcF9zbS51c2VyLnBhc3N3b3JkTGVuZ3RoID0gMDsKKwkJZGlhbWVhcF9zbS0+ZWFwX3NtLnVzZXIubWV0aG9kSWQgPSAtMTsKKwkJZm9yIChpID0gMDsgaSA8IE1BWE1FVEhPRFM7IGkrKykKKwkJeworCQkJZGlhbWVhcF9zbS0+ZWFwX3NtLnVzZXIubWV0aG9kc1tpXS5tZXRob2QgPSBUWVBFX05PTkU7CisJCQlkaWFtZWFwX3NtLT5lYXBfc20udXNlci5tZXRob2RzW2ldLnZlbmRvciA9IFZFTkRPUl9JRVRGOworCQl9CisJCWZvciAoaSA9IDA7IGkgPCBNQVhQUk9QT1NFRE1FVEhPRFM7IGkrKykKKwkJeworCQkJZGlhbWVhcF9zbS0+ZWFwX3NtLnVzZXIucHJvcG9zZWRtZXRob2RzW2ldLm1ldGhvZCA9IFRZUEVfTk9ORTsKKwkJCWRpYW1lYXBfc20tPmVhcF9zbS51c2VyLnByb3Bvc2VkbWV0aG9kc1tpXS52ZW5kb3IgPSBWRU5ET1JfSUVURjsKKwkJfQorCisJCWRpYW1lYXBfc20tPmVhcF9zbS51c2VyLnBtZXRob2RzID0gLTE7CisJCWRpYW1lYXBfc20tPmVhcF9zbS51c2VyLnByb3Bvc2VkX2VhcF9tZXRob2QgPSBUWVBFX05PTkU7CisJCWRpYW1lYXBfc20tPmVhcF9zbS51c2VyLnByb3Bvc2VkX2VhcF9tZXRob2RfdmVuZG9yID0gVkVORE9SX0lFVEY7CisJCWRpYW1lYXBfc20tPmVhcF9zbS51c2VyLnN1Y2Nlc3MgPSBGQUxTRTsKKworCQlkaWFtZWFwX3NtLT5lYXBfc20uY3VycmVudElkID0gLTE7CisJCWRpYW1lYXBfc20tPmVhcF9zbS5jdXJyZW50VmVuZG9yID0gVkVORE9SX0lFVEY7CisJCWRpYW1lYXBfc20tPmVhcF9zbS5sYXN0SWQgPSAtMTsKKwkJZGlhbWVhcF9zbS0+ZWFwX3NtLm1ldGhvZFN0YXRlID0gRUFQX01fUFJPUE9TRUQ7CisKKwkJZGlhbWVhcF9zbS0+ZWFwX3NtLmN1cnJlbnRNZXRob2QgPSBUWVBFX05PTkU7CisKKwkJZGlhbWVhcF9zbS0+ZWFwX3NtLm1ldGhvZERhdGEgPSBOVUxMOworCisJfQorCisJZGlhbWVhcF9zbS0+cmVzdWx0X2NvZGUgPSAwOworCWZkX2xpc3RfaW5pdCgmZGlhbWVhcF9zbS0+YXR0cmlidXRlcywgTlVMTCk7CisJZmRfbGlzdF9pbml0KCZkaWFtZWFwX3NtLT5yZXFfYXR0cmlidXRlcywgTlVMTCk7CisJZmRfbGlzdF9pbml0KCZkaWFtZWFwX3NtLT5hbnNfYXR0cmlidXRlcywgTlVMTCk7CisJZGlhbWVhcF9zbS0+ZmFpbGVkYXZwID0gTlVMTDsKKwlkaWFtZWFwX3NtLT5hdXRoX3JlcXVlc3RfdmFsID0gQVVUSEVOVElDQVRFX09OTFk7CisJZGlhbWVhcF9zbS0+dmVyaWZ5X2F1dGhvcml6YXRpb24gPSBGQUxTRTsKKwlkaWFtZWFwX3NtLT5hdXRoU3VjY2VzcyA9IEZBTFNFOworCWRpYW1lYXBfc20tPmF1dGhGYWlsdXJlID0gRkFMU0U7CisJZGlhbWVhcF9zbS0+bGFzdFJlcUVBUGF2cCA9IE5VTEw7CisJZGlhbWVhcF9zbS0+cHJpdmF0ZVVzZXIgPSBGQUxTRTsKKwlkaWFtZWFwX3NtLT5hdXRob3JpemVkID0gRkFMU0U7CisKKwlkaWFtZWFwX3NtLT5lYXBfc20ucnhSZXNwID0gRkFMU0U7CisJZGlhbWVhcF9zbS0+ZWFwX3NtLnJlc3BJZCA9IC0xOworCWRpYW1lYXBfc20tPmVhcF9zbS5yZXNwTWV0aG9kID0gVFlQRV9OT05FOworCWRpYW1lYXBfc20tPmVhcF9zbS5yZXNwVmVuZG9yID0gVkVORE9SX0lFVEY7CisJZGlhbWVhcF9zbS0+ZWFwX3NtLnJlc3BWZW5kb3JNZXRob2QgPSBUWVBFX05PTkU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkaWFtZWFwX2luaXRpYWxpemVfZGlhbWVhcF9lYXBfaW50ZXJmYWNlKAorCQlzdHJ1Y3QgZGlhbWVhcF9lYXBfaW50ZXJmYWNlICogZWFwX2kpCit7CisJVFJBQ0VfRU5UUlkoIiVwIiwgZWFwX2kpOworCisJLy9Jbml0aWFsaXplIEFBQS1FQVAgSW50ZXJmYWNlCisJZWFwX2ktPmFhYUVhcFJlc3AgPSBGQUxTRTsKKwllYXBfaS0+YWFhRWFwUmVzcERhdGEuZGF0YSA9IE5VTEw7CisJLy9Jbml0aWFsaXplIEVBUC1BQUEgSW50ZXJmYWNlCisJZWFwX2ktPmFhYUVhcFJlcSA9IEZBTFNFOworCWVhcF9pLT5hYWFFYXBOb1JlcSA9IEZBTFNFOworCWVhcF9pLT5hYWFTdWNjZXNzID0gRkFMU0U7CisJZWFwX2ktPmFhYUZhaWwgPSBGQUxTRTsKKwllYXBfaS0+YWFhRWFwUmVxRGF0YS5kYXRhID0gTlVMTDsKKwllYXBfaS0+YWFhRWFwTVNLRGF0YSA9IE5VTEw7CisJZWFwX2ktPmFhYUVhcEVNU0tEYXRhID0gTlVMTDsKKwllYXBfaS0+YWFhRWFwS2V5QXZhaWxhYmxlID0gRkFMU0U7CisJZWFwX2ktPmFhYU1ldGhvZFRpbWVvdXQgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGlhbWVhcF9mYWlsZWRfYXZwKHN0cnVjdCBkaWFtZWFwX3N0YXRlX21hY2hpbmUgKiBkaWFtZWFwX3NtLAorCQlzdHJ1Y3QgYXZwICogaW52YWxpZGF2cCkKK3sKKwlUUkFDRV9FTlRSWSgiJXAgJXAiLGRpYW1lYXBfc20saW52YWxpZGF2cCk7CisJaWYgKCFpbnZhbGlkYXZwKQorCQlyZXR1cm4gRUlOVkFMOworCisJaWYgKCFkaWFtZWFwX3NtKQorCQlyZXR1cm4gRUlOVkFMOworCisJaWYgKGRpYW1lYXBfc20tPmZhaWxlZGF2cCA9PSBOVUxMKQorCXsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyggZGF0YW9ial9mYWlsZWRfYXZwLCAwLCAmZGlhbWVhcF9zbS0+ZmFpbGVkYXZwKSApOworCisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQoIGRpYW1lYXBfc20tPmZhaWxlZGF2cCwgTVNHX0JSV19MQVNUX0NISUxELCBpbnZhbGlkYXZwICkgKTsKKworCX0KKwllbHNlCisJeworCQkvL2FkZCBtdWx0aXBsZSBBVlBzIGluIEZhaWxlZC1BVlAKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGlhbWVhcF9wYXJzZV9lYXBfcmVzcChzdHJ1Y3QgZWFwX3N0YXRlX21hY2hpbmUgKiBlYXBfc20sCisJCXN0cnVjdCBlYXBfcGFja2V0ICplYXBwYWNrZXQpCit7CisJVFJBQ0VfRU5UUlkoIiVwICVwIixlYXBfc20sIGVhcHBhY2tldCkKKworCWVhcF9zbS0+cnhSZXNwID0gRkFMU0U7CisJZWFwX3NtLT5yZXNwSWQgPSAtMTsKKwllYXBfc20tPnJlc3BNZXRob2QgPSBUWVBFX05PTkU7CisJZWFwX3NtLT5yZXNwVmVuZG9yID0gVkVORE9SX0lFVEY7CisJZWFwX3NtLT5yZXNwVmVuZG9yTWV0aG9kID0gVFlQRV9OT05FOworCisJaWYgKGVhcHBhY2tldC0+ZGF0YSA9PSBOVUxMKQorCXsKKwkJVFJBQ0VfREVCVUcoSU5GTywiJXMgRW1wdHkgRUFQIHBhY2tldCIsRElBTUVBUF9FWFRFTlNJT04pOworCQlyZXR1cm4gMDsKKwl9CisKKwl1MTYgcGxlbmd0aDsKKwlDSEVDS19GQ1QoZGlhbWVhcF9lYXBfZ2V0X3BhY2tldGxlbmd0aChlYXBwYWNrZXQsJnBsZW5ndGgpKTsKKwlpZiAoKGludCkgcGxlbmd0aCA8IEVBUF9IRUFERVIpCisJeworCQlUUkFDRV9ERUJVRyhJTkZPLCIlcyBFQVAgcGFja2V0IGxlbmd0aCBsZXNzIHRoYW4gRUFQIGhlYWRlci4iLERJQU1FQVBfRVhURU5TSU9OKTsKKwkJcmV0dXJuIDA7CisJfQorCisJdTE2IGxlbmd0aDsKKwlDSEVDS19GQ1QoZGlhbWVhcF9lYXBfZ2V0X2xlbmd0aChlYXBwYWNrZXQsJmxlbmd0aCkpOworCWlmICgoaW50KSBsZW5ndGggPCBFQVBfSEVBREVSKQorCXsKKwkJVFJBQ0VfREVCVUcoSU5GTywiJXNFQVAgcGFja2V0IGxlbmd0aCBmaWVsZCBsZXNzIHRoYW4gRUFQIGhlYWRlci4iLERJQU1FQVBfRVhURU5TSU9OKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHBsZW5ndGggPCBsZW5ndGgpCisJeworCQlUUkFDRV9ERUJVRyhJTkZPLCIlc0xlbmd0aCBvZiByZWNlaXZlZCBFQVAgcGFja2V0IGlzIGxlc3MgdGhhbiB0aGUgdmFsdWUgb2YgdGhlIGxlbmd0aCBmaWVsZC4iLERJQU1FQVBfRVhURU5TSU9OKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZWFwX2NvZGUgY29kZTsKKwlDSEVDS19GQ1QoZGlhbWVhcF9lYXBfZ2V0X2NvZGUoZWFwcGFja2V0LCZjb2RlKSk7CisJaWYgKGNvZGUgPT0gRUFQX1JFUVVFU1QgfHwgY29kZSA9PSBFQVBfU1VDQ0VTUyB8fCBjb2RlID09IEVBUF9GQUlMVVJFKQorCXsKKwkJVFJBQ0VfREVCVUcoSU5GTywiJXNPbmx5IEVBUCBSZXNwb25zZXMgYXJlIGFjY2VwdGVkIGF0IEVBUCBzZXJ2ZXIgc2lkZS4iLERJQU1FQVBfRVhURU5TSU9OKTsKKwkJcmV0dXJuIDA7CisJfQorCisJdTggaWQ7CisJQ0hFQ0tfRkNUKGRpYW1lYXBfZWFwX2dldF9pZGVudGlmaWVyKGVhcHBhY2tldCwmaWQpKTsKKwllYXBfc20tPnJlc3BJZCA9IGlkOworCisJQ0hFQ0tfRkNUKGRpYW1lYXBfZWFwX2dldF90eXBlKGVhcHBhY2tldCwmZWFwX3NtLT5yZXNwTWV0aG9kKSk7CisJaWYgKChlYXBfc20tPm1ldGhvZFN0YXRlICE9IEVBUF9NX1BST1BPU0VEKSAmJiAoZWFwX3NtLT5yZXNwTWV0aG9kCisJCQk9PSBUWVBFX05BSyB8fCBlYXBfc20tPnJlc3BNZXRob2QgPT0gVFlQRV9FWFBBTkRFRF9UWVBFUykpCisJeworCQlUUkFDRV9ERUJVRyhJTkZPLCIlc05BSyBvciBFWFBBTkRFRF9OQUsgcmVjZWl2ZWQgYWZ0ZXIgYW4gRUFQIFRZUEUgYmVlbiBzZWxlY3RlZCIsRElBTUVBUF9FWFRFTlNJT04pOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoKGVhcF9zbS0+cmVzcE1ldGhvZCA9PSBUWVBFX0VYUEFOREVEX1RZUEVTKSAmJiAobGVuZ3RoIDwgMjApKQorCXsKKwkJVFJBQ0VfREVCVUcoSU5GTywiJXMgVHJ1bmNhdGVkIEVBUCBQYWNrZXQgcmVjZWl2ZWQuIixESUFNRUFQX0VYVEVOU0lPTik7CisJCXJldHVybiAwOworCX0KKworCWlmICgoZWFwX3NtLT5yZXNwTWV0aG9kID09IFRZUEVfTkFLKSAmJiAoZWFwX3NtLT5jdXJyZW50TWV0aG9kIDwgNCkpCisJeworCQlUUkFDRV9ERUJVRyhJTkZPLCIlc05BSyByZXNwb25zZSBub3QgZXhwZWN0ZWQgYXQgdGhpcyBzdGVwIChPbmx5IEVBUCB0eXBlID0gNCBhbmQgYWJvdmUgYXJlIGFjY2VwdGVkKS4iLERJQU1FQVBfRVhURU5TSU9OKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGVhcF9zbS0+cmVzcE1ldGhvZCA9PSBUWVBFX0VYUEFOREVEX1RZUEVTKQorCXsKKwkJdTggKmRhdGEgPSAodTggKikgZWFwcGFja2V0LT5kYXRhOworCQkvL2ludCBsZW4gPSAwOworCQkvL3UzMiByZXNwVmVuZG9yLCByZXNwVmVuZG9yTWV0aG9kOworCQlkYXRhICs9IDU7CisJCWVhcF9zbS0+cmVzcFZlbmRvciA9IEcyNEJJR0UoZGF0YSk7CisJCWRhdGEgKz0gMzsKKwkJZWFwX3NtLT5yZXNwVmVuZG9yTWV0aG9kID0gRzMyQklHRShkYXRhKTsKKwkJZGF0YSArPSA0OworCQkvKgkJd2hpbGUgKChsZW5ndGggLSAxMikgPiAobGVuICogOCkpCisJCSB7CisJCSBpZiAoKChlYXBfdHlwZSkgRzgoZGF0YSkpICE9IFRZUEVfRVhQQU5ERURfVFlQRVMpCisJCSB7CisJCSByZXR1cm4gRkFMU0U7CisJCSB9CisJCSBkYXRhICs9IDE7CisJCSByZXNwVmVuZG9yID0gRzI0QklHRShkYXRhKTsKKwkJIGRhdGEgKz0gMzsKKwkJIHJlc3BWZW5kb3JNZXRob2QgPSBHMzJCSUdFKGRhdGEpOworCQkgZWFwX3NtLT51c2VyLnByb3Bvc2VkbWV0aG9kc1tsZW5dLm1ldGhvZCA9IHJlc3BWZW5kb3I7CisJCSBlYXBfc20tPnVzZXIucHJvcG9zZWRtZXRob2RzW2xlbl0udmVuZG9yID0gcmVzcFZlbmRvck1ldGhvZDsKKwkJIGxlbisrOworCQkgZGF0YSArPSA0OworCQkgfQorCQkgZWFwX3NtLT51c2VyLm1ldGhvZElkID0gMDsqLworCX0KKworCWlmKChlYXBfc20tPnJlc3BNZXRob2QgPT0gVFlQRV9JREVOVElUWSkgJiYgKGxlbmd0aCA8IDYpKXsKKwkJVFJBQ0VfREVCVUcoSU5GTywiJXNVc2VyIElkZW50aXR5IG1pc3NpbmciLERJQU1FQVBfRVhURU5TSU9OKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZWFwX3NtLT5yeFJlc3AgPSBUUlVFOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRpYW1lYXBfZWFwcGFja2V0X25ldyhzdHJ1Y3QgZWFwX3BhY2tldCAqIGVhcHBhY2tldCwKKwkJc3RydWN0IGF2cF9oZHIgKiBhdnBkYXRhKQoreworCVRSQUNFX0VOVFJZKCIlcCAlcCIsZWFwcGFja2V0LGF2cGRhdGEpOworCWVhcHBhY2tldC0+dWxlbmd0aCA9ICh1MTYpIGF2cGRhdGEtPmF2cF92YWx1ZS0+b3MubGVuOworCWVhcHBhY2tldC0+ZGF0YSA9ICh1OCAqKSBhdnBkYXRhLT5hdnBfdmFsdWUtPm9zLmRhdGE7CisJZGlhbWVhcF9lYXBfZ2V0X3BhY2tldGxlbmd0aChlYXBwYWNrZXQsICZlYXBwYWNrZXQtPmxlbmd0aCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGlhbWVhcF9wYXJzZV9hdnBzKHN0cnVjdCBkaWFtZWFwX3N0YXRlX21hY2hpbmUgKiBkaWFtZWFwX3NtLAorCQlzdHJ1Y3QgbXNnICogcmVxLCBzdHJ1Y3QgZGlhbWVhcF9lYXBfaW50ZXJmYWNlICogZWFwX2kpCit7CisJVFJBQ0VfRU5UUlkoIiVwICVwICVwIixkaWFtZWFwX3NtLHJlcSxlYXBfaSk7CisJc3RydWN0IGF2cCAqIGF2cCwgKmF2cDI7CisJc3RydWN0IGF2cF9oZHIgKiBhdnBkYXRhOworCWludCByZXQ7CisJaW50IGRlcHRoOworCisJLyogRUFQLVBheWxvYWQgZGF0YSovCisJYXZwID0gTlVMTDsKKwlDSEVDS19GQ1QoZmRfbXNnX3NlYXJjaF9hdnAocmVxLCBkYXRhb2JqX2VhcF9wYXlsb2FkLCAmYXZwKSk7CisJaWYgKGF2cCAhPSBOVUxMKQorCXsKKwkJQ0hFQ0tfRkNUKGZkX21zZ19hdnBfaGRyKGF2cCwgJmF2cGRhdGEpKTsKKwkJQ0hFQ0tfRkNUKGRpYW1lYXBfZWFwcGFja2V0X25ldygmZWFwX2ktPmFhYUVhcFJlc3BEYXRhLCBhdnBkYXRhKSk7CisJCWVhcF9pLT5hYWFFYXBSZXNwID0gVFJVRTsKKwkJdTE2IGxlbmd0aDsKKwkJZGlhbWVhcF9lYXBfZ2V0X2xlbmd0aCgmZWFwX2ktPmFhYUVhcFJlc3BEYXRhLCAmbGVuZ3RoKTsKKwkJaWYgKGxlbmd0aCA+PSA0KQorCQl7CisJCQllYXBfY29kZSBjb2RlOworCQkJQ0hFQ0tfRkNUKGRpYW1lYXBfZWFwX2dldF9jb2RlKCZlYXBfaS0+YWFhRWFwUmVzcERhdGEsJmNvZGUpKTsKKworCQkJaWYgKGNvZGUgIT0gRUFQX1JFU1BPTlNFKQorCQkJeworCQkJCWRpYW1lYXBfc20tPnJlc3VsdF9jb2RlID0gNTAwNDsgLyogRElBTUVURVJfSU5WQUxJRF9BVlBfVkFMVUUgNTAwNCAqLworCQkJCXN0cnVjdCBhdnAgKiBpbnZhbGlkYXZwOworCQkJCXVuaW9uIGF2cF92YWx1ZSB2YWw7CisJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIGRhdGFvYmpfZWFwX3BheWxvYWQsIDAsICZpbnZhbGlkYXZwKSk7CisJCQkJdmFsLm9zLmRhdGEgPSBlYXBfaS0+YWFhRWFwUmVzcERhdGEuZGF0YTsKKwkJCQl2YWwub3MubGVuID0gZWFwX2ktPmFhYUVhcFJlc3BEYXRhLmxlbmd0aDsKKwkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUoIGludmFsaWRhdnAsICZ2YWwgKSkKKwkJCQlDSEVDS19GQ1QoIGRpYW1lYXBfZmFpbGVkX2F2cChkaWFtZWFwX3NtLCBpbnZhbGlkYXZwKSk7CisJCQkJVFJBQ0VfREVCVUcoSU5GTywiJXNJbmNvcnJlY3QgRUFQIFBhY2tldC4gRUFQIENvZGUgIT0gUmVzcG9uc2UuIixESUFNRUFQX0VYVEVOU0lPTik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJQ0hFQ0tfRkNUKGRpYW1lYXBfcGFyc2VfZWFwX3Jlc3AoJmRpYW1lYXBfc20tPmVhcF9zbSwgJmVhcF9pLT5hYWFFYXBSZXNwRGF0YSkpOworCQkJCWlmIChkaWFtZWFwX3NtLT5lYXBfc20ucnhSZXNwID09IEZBTFNFKQorCQkJCXsKKwkJCQkJZGlhbWVhcF9zbS0+cmVzdWx0X2NvZGUgPSAxMDAxOyAvKkRJQU1FVEVSX01VTFRJX1JPVU5EX0FVVEgqLworCQkJCQllYXBfaS0+YWFhRWFwTm9SZXEgPSBUUlVFOworCQkJCQllYXBfaS0+YWFhRWFwUmVzcCA9IEZBTFNFOworCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCWlmIChkaWFtZWFwX3NtLT5lYXBfc20uY3VycmVudE1ldGhvZCAhPSBUWVBFX05PTkUpCisJCQl7CisJCQkJZGlhbWVhcF9zbS0+cmVzdWx0X2NvZGUgPSA1MDA0OyAvKiBESUFNRVRFUl9JTlZBTElEX0FWUF9WQUxVRSA1MDA0ICovCisJCQkJQ0hFQ0tfRkNUKGRpYW1lYXBfZmFpbGVkX2F2cChkaWFtZWFwX3NtLCBhdnApKTsKKwkJCQlUUkFDRV9ERUJVRyhJTkZPLCIlc0VBUCBwYWNrZXQgbGVuZ3RoIDwgTWluaW11bSBFQVAgcGFja2V0IGxlbmd0aC4iLERJQU1FQVBfRVhURU5TSU9OKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJCS8vRUFQIHN0YXJ0IHJlY2VpdmVkCisKKwkJfQorCX0KKworCS8qIFVzZXItTmFtZSBBVlAgKi8KKwlhdnAgPSBOVUxMOworCUNIRUNLX0ZDVChmZF9tc2dfc2VhcmNoX2F2cChyZXEsIGRhdGFvYmpfdXNlcl9uYW1lLCAmYXZwKSk7CisJaWYgKGF2cCAhPSBOVUxMKQorCXsKKwkJQ0hFQ0tfRkNUKGZkX21zZ19hdnBfaGRyKGF2cCwgJmF2cGRhdGEpKTsKKwkJc3RydWN0IGF2cF9hdHRyaWJ1dGUgKiBhdHRyaWJ1dGU7CisJCUNIRUNLX01BTExPQyhhdHRyaWJ1dGUgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdnBfYXR0cmlidXRlKSkpOworCQltZW1zZXQoYXR0cmlidXRlLCAwLCBzaXplb2Yoc3RydWN0IGF2cF9hdHRyaWJ1dGUpKTsKKwkJZmRfbGlzdF9pbml0KCZhdHRyaWJ1dGUtPmNoYWluLCBhdHRyaWJ1dGUpOworCQlhdHRyaWJ1dGUtPmF0dHJpYiA9ICJVc2VyLU5hbWUiOworCQlhdHRyaWJ1dGUtPnZhbHVlLm9zLmRhdGEgPSBhdnBkYXRhLT5hdnBfdmFsdWUtPm9zLmRhdGE7CisJCWF0dHJpYnV0ZS0+dmFsdWUub3MubGVuID0gYXZwZGF0YS0+YXZwX3ZhbHVlLT5vcy5sZW47CisJCWZkX2xpc3RfaW5zZXJ0X2JlZm9yZSgmZGlhbWVhcF9zbS0+cmVxX2F0dHJpYnV0ZXMsICZhdHRyaWJ1dGUtPmNoYWluKTsKKwl9CisKKwkvKiBFQVAtS2V5LU5hbWUgQVZQICovCisKKwlhdnAgPSBOVUxMOworCUNIRUNLX0ZDVChmZF9tc2dfc2VhcmNoX2F2cChyZXEsIGRhdGFvYmpfZWFwX2tleV9uYW1lLCAmYXZwKSk7CisJaWYgKGF2cCAhPSBOVUxMKQorCXsKKwkJQ0hFQ0tfRkNUKGZkX21zZ19hdnBfaGRyKGF2cCwgJmF2cGRhdGEpKTsKKwkJc3RydWN0IGF2cF9hdHRyaWJ1dGUgKiBhdHRyaWJ1dGU7CisJCUNIRUNLX01BTExPQyhhdHRyaWJ1dGUgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdnBfYXR0cmlidXRlKSkpOworCQltZW1zZXQoYXR0cmlidXRlLCAwLCBzaXplb2Yoc3RydWN0IGF2cF9hdHRyaWJ1dGUpKTsKKwkJZmRfbGlzdF9pbml0KCZhdHRyaWJ1dGUtPmNoYWluLCBhdHRyaWJ1dGUpOworCQlhdHRyaWJ1dGUtPmF0dHJpYiA9ICJFQVAtS2V5LU5hbWUiOworCQlhdHRyaWJ1dGUtPnZhbHVlLm9zLmRhdGEgPSBhdnBkYXRhLT5hdnBfdmFsdWUtPm9zLmRhdGE7CisJCWF0dHJpYnV0ZS0+dmFsdWUub3MubGVuID0gYXZwZGF0YS0+YXZwX3ZhbHVlLT5vcy5sZW47CisJCWZkX2xpc3RfaW5zZXJ0X2JlZm9yZSgmZGlhbWVhcF9zbS0+cmVxX2F0dHJpYnV0ZXMsICZhdHRyaWJ1dGUtPmNoYWluKTsKKwl9CisKKwkvKiBBdXRoLVJlcXVlc3QtVHlwZSBBVlAgKi8KKwlhdnAgPSBOVUxMOworCUNIRUNLX0ZDVChmZF9tc2dfc2VhcmNoX2F2cChyZXEsIGRhdGFvYmpfYXV0aF9yZXF1ZXN0X3R5cGUsICZhdnApKTsKKwlpZiAoYXZwICE9IE5VTEwpCisJeworCQlDSEVDS19GQ1QoZmRfbXNnX2F2cF9oZHIoYXZwLCAmYXZwZGF0YSkpOworCQlkaWFtZWFwX3NtLT5hdXRoX3JlcXVlc3RfdmFsID0gYXZwZGF0YS0+YXZwX3ZhbHVlLT5pMzI7CisJfQorCisJLyogQXV0aG9yaXphdGlvbi1MaWZldGltZSBBVlAgKi8KKwlhdnAgPSBOVUxMOworCUNIRUNLX0ZDVChmZF9tc2dfc2VhcmNoX2F2cChyZXEsIGRhdGFvYmpfYXV0aG9yaXphdGlvbl9saWZldGltZSwgJmF2cCkpOworCWlmIChhdnAgIT0gTlVMTCkKKwl7CisJCUNIRUNLX0ZDVChmZF9tc2dfYXZwX2hkcihhdnAsICZhdnBkYXRhKSk7CisJCXN0cnVjdCBhdnBfYXR0cmlidXRlICogYXR0cmlidXRlOworCQlDSEVDS19NQUxMT0MoYXR0cmlidXRlID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXZwX2F0dHJpYnV0ZSkpKTsKKwkJbWVtc2V0KGF0dHJpYnV0ZSwgMCwgc2l6ZW9mKHN0cnVjdCBhdnBfYXR0cmlidXRlKSk7CisJCWZkX2xpc3RfaW5pdCgmYXR0cmlidXRlLT5jaGFpbiwgYXR0cmlidXRlKTsKKwkJYXR0cmlidXRlLT5hdHRyaWIgPSAiQXV0aG9yaXphdGlvbi1MaWZldGltZSI7CisJCWF0dHJpYnV0ZS0+dmFsdWUudTMyID0gYXZwZGF0YS0+YXZwX3ZhbHVlLT51MzI7CisJCWZkX2xpc3RfaW5zZXJ0X2JlZm9yZSgmZGlhbWVhcF9zbS0+cmVxX2F0dHJpYnV0ZXMsICZhdHRyaWJ1dGUtPmNoYWluKTsKKwl9CisKKwkvKiBBdXRoLUdyYWNlLVBlcmlvZCBBVlAgKi8KKwlhdnAgPSBOVUxMOworCUNIRUNLX0ZDVChmZF9tc2dfc2VhcmNoX2F2cChyZXEsIGRhdGFvYmpfYXV0aF9ncmFjZV9wZXJpb2QsICZhdnApKTsKKwlpZiAoYXZwICE9IE5VTEwpCisJeworCQlDSEVDS19GQ1QoZmRfbXNnX2F2cF9oZHIoYXZwLCAmYXZwZGF0YSkpOworCQlzdHJ1Y3QgYXZwX2F0dHJpYnV0ZSAqIGF0dHJpYnV0ZTsKKwkJQ0hFQ0tfTUFMTE9DKGF0dHJpYnV0ZSA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGF2cF9hdHRyaWJ1dGUpKSk7CisJCW1lbXNldChhdHRyaWJ1dGUsIDAsIHNpemVvZihzdHJ1Y3QgYXZwX2F0dHJpYnV0ZSkpOworCQlmZF9saXN0X2luaXQoJmF0dHJpYnV0ZS0+Y2hhaW4sIGF0dHJpYnV0ZSk7CisJCWF0dHJpYnV0ZS0+YXR0cmliID0gIkF1dGgtR3JhY2UtUGVyaW9kIjsKKwkJYXR0cmlidXRlLT52YWx1ZS51MzIgPSBhdnBkYXRhLT5hdnBfdmFsdWUtPnUzMjsKKwkJZmRfbGlzdF9pbnNlcnRfYmVmb3JlKCZkaWFtZWFwX3NtLT5yZXFfYXR0cmlidXRlcywgJmF0dHJpYnV0ZS0+Y2hhaW4pOworCX0KKworCS8qIEF1dGgtU2Vzc2lvbi1TdGF0ZSBBVlAgKi8KKwlhdnAgPSBOVUxMOworCUNIRUNLX0ZDVChmZF9tc2dfc2VhcmNoX2F2cChyZXEsIGRhdGFvYmpfYXV0aF9zZXNzaW9uX3N0YXRlLCAmYXZwKSk7CisJaWYgKGF2cCAhPSBOVUxMKQorCXsKKwkJQ0hFQ0tfRkNUKGZkX21zZ19hdnBfaGRyKGF2cCwgJmF2cGRhdGEpKTsKKwkJc3RydWN0IGF2cF9hdHRyaWJ1dGUgKiBhdHRyaWJ1dGU7CisJCUNIRUNLX01BTExPQyhhdHRyaWJ1dGUgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdnBfYXR0cmlidXRlKSkpOworCQltZW1zZXQoYXR0cmlidXRlLCAwLCBzaXplb2Yoc3RydWN0IGF2cF9hdHRyaWJ1dGUpKTsKKwkJZmRfbGlzdF9pbml0KCZhdHRyaWJ1dGUtPmNoYWluLCBhdHRyaWJ1dGUpOworCQlhdHRyaWJ1dGUtPmF0dHJpYiA9ICJBdXRoLVNlc3Npb24tU3RhdGUiOworCQlhdHRyaWJ1dGUtPnZhbHVlLmkzMiA9IGF2cGRhdGEtPmF2cF92YWx1ZS0+aTMyOworCQlmZF9saXN0X2luc2VydF9iZWZvcmUoJmRpYW1lYXBfc20tPnJlcV9hdHRyaWJ1dGVzLCAmYXR0cmlidXRlLT5jaGFpbik7CisJfQorCisJLyogT3JpZ2luLXN0YXRlLUlkIEFWUCAqLworCWF2cCA9IE5VTEw7CisJQ0hFQ0tfRkNUKGZkX21zZ19zZWFyY2hfYXZwKHJlcSwgZGF0YW9ial9vcmlnaW5fc3RhdGVfaWQsICZhdnApKTsKKwlpZiAoYXZwICE9IE5VTEwpCisJeworCQlDSEVDS19GQ1QoZmRfbXNnX2F2cF9oZHIoYXZwLCAmYXZwZGF0YSkpOworCQlzdHJ1Y3QgYXZwX2F0dHJpYnV0ZSAqIGF0dHJpYnV0ZTsKKwkJQ0hFQ0tfTUFMTE9DKGF0dHJpYnV0ZSA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGF2cF9hdHRyaWJ1dGUpKSk7CisJCW1lbXNldChhdHRyaWJ1dGUsIDAsIHNpemVvZihzdHJ1Y3QgYXZwX2F0dHJpYnV0ZSkpOworCQlmZF9saXN0X2luaXQoJmF0dHJpYnV0ZS0+Y2hhaW4sIGF0dHJpYnV0ZSk7CisJCWF0dHJpYnV0ZS0+YXR0cmliID0gIk9yaWdpbi1zdGF0ZS1JZCBBVlAiOworCQlhdHRyaWJ1dGUtPnZhbHVlLnUzMiA9IGF2cGRhdGEtPmF2cF92YWx1ZS0+dTMyOworCQlmZF9saXN0X2luc2VydF9iZWZvcmUoJmRpYW1lYXBfc20tPnJlcV9hdHRyaWJ1dGVzLCAmYXR0cmlidXRlLT5jaGFpbik7CisJfQorCisJLyogTkFTLVBvcnQgQVZQKi8KKwlhdnAgPSBOVUxMOworCUNIRUNLX0ZDVChmZF9tc2dfc2VhcmNoX2F2cChyZXEsIGRhdGFvYmpfbmFzX3BvcnQsICZhdnApKTsKKwlpZiAoYXZwICE9IE5VTEwpCisJeworCQlDSEVDS19GQ1QoZmRfbXNnX2F2cF9oZHIoYXZwLCAmYXZwZGF0YSkpOworCQlzdHJ1Y3QgYXZwX2F0dHJpYnV0ZSAqIGF0dHJpYnV0ZTsKKwkJQ0hFQ0tfTUFMTE9DKGF0dHJpYnV0ZSA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGF2cF9hdHRyaWJ1dGUpKSk7CisJCW1lbXNldChhdHRyaWJ1dGUsIDAsIHNpemVvZihzdHJ1Y3QgYXZwX2F0dHJpYnV0ZSkpOworCQlmZF9saXN0X2luaXQoJmF0dHJpYnV0ZS0+Y2hhaW4sIGF0dHJpYnV0ZSk7CisJCWF0dHJpYnV0ZS0+YXR0cmliID0gIk5BUy1Qb3J0IjsKKwkJYXR0cmlidXRlLT52YWx1ZS51MzIgPSBhdnBkYXRhLT5hdnBfdmFsdWUtPnUzMjsKKwkJZmRfbGlzdF9pbnNlcnRfYmVmb3JlKCZkaWFtZWFwX3NtLT5yZXFfYXR0cmlidXRlcywgJmF0dHJpYnV0ZS0+Y2hhaW4pOworCX0KKworCS8qIE5BUy1Qb3J0LUlkIEFWUCAqLworCWF2cCA9IE5VTEw7CisJQ0hFQ0tfRkNUKGZkX21zZ19zZWFyY2hfYXZwKHJlcSwgZGF0YW9ial9uYXNfcG9ydF9pZCwgJmF2cCkpOworCWlmIChhdnAgIT0gTlVMTCkKKwl7CisJCUNIRUNLX0ZDVChmZF9tc2dfYXZwX2hkcihhdnAsICZhdnBkYXRhKSk7CisJCXN0cnVjdCBhdnBfYXR0cmlidXRlICogYXR0cmlidXRlOworCQlDSEVDS19NQUxMT0MoYXR0cmlidXRlID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXZwX2F0dHJpYnV0ZSkpKTsKKwkJbWVtc2V0KGF0dHJpYnV0ZSwgMCwgc2l6ZW9mKHN0cnVjdCBhdnBfYXR0cmlidXRlKSk7CisJCWZkX2xpc3RfaW5pdCgmYXR0cmlidXRlLT5jaGFpbiwgYXR0cmlidXRlKTsKKwkJYXR0cmlidXRlLT5hdHRyaWIgPSAiTkFTLVBvcnQtSWQiOworCQlhdHRyaWJ1dGUtPnZhbHVlLm9zLmRhdGEgPSBhdnBkYXRhLT5hdnBfdmFsdWUtPm9zLmRhdGE7CisJCWF0dHJpYnV0ZS0+dmFsdWUub3MubGVuID0gYXZwZGF0YS0+YXZwX3ZhbHVlLT5vcy5sZW47CisJCWZkX2xpc3RfaW5zZXJ0X2JlZm9yZSgmZGlhbWVhcF9zbS0+cmVxX2F0dHJpYnV0ZXMsICZhdHRyaWJ1dGUtPmNoYWluKTsKKwl9CisKKwkvKiBOQVMtUG9ydC1UeXBlIEFWUCAqLworCWF2cCA9IE5VTEw7CisJQ0hFQ0tfRkNUKGZkX21zZ19zZWFyY2hfYXZwKHJlcSwgZGF0YW9ial9uYXNfcG9ydF90eXBlLCAmYXZwKSk7CisJaWYgKGF2cCAhPSBOVUxMKQorCXsKKwkJQ0hFQ0tfRkNUKGZkX21zZ19hdnBfaGRyKGF2cCwgJmF2cGRhdGEpKTsKKwkJc3RydWN0IGF2cF9hdHRyaWJ1dGUgKiBhdHRyaWJ1dGU7CisJCUNIRUNLX01BTExPQyhhdHRyaWJ1dGUgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdnBfYXR0cmlidXRlKSkpOworCQltZW1zZXQoYXR0cmlidXRlLCAwLCBzaXplb2Yoc3RydWN0IGF2cF9hdHRyaWJ1dGUpKTsKKwkJZmRfbGlzdF9pbml0KCZhdHRyaWJ1dGUtPmNoYWluLCBhdHRyaWJ1dGUpOworCQlhdHRyaWJ1dGUtPmF0dHJpYiA9ICJOQVMtUG9ydC1UeXBlIjsKKwkJYXR0cmlidXRlLT52YWx1ZS51MzIgPSBhdnBkYXRhLT5hdnBfdmFsdWUtPnUzMjsKKwkJZmRfbGlzdF9pbnNlcnRfYmVmb3JlKCZkaWFtZWFwX3NtLT5yZXFfYXR0cmlidXRlcywgJmF0dHJpYnV0ZS0+Y2hhaW4pOworCX0KKworCS8qIENhbGxlZC1TdGF0aW9uLUlkIEFWUCAqLworCWF2cCA9IE5VTEw7CisJQ0hFQ0tfRkNUKGZkX21zZ19zZWFyY2hfYXZwKHJlcSwgZGF0YW9ial9jYWxsZWRfc3RhdGlvbl9pZCwgJmF2cCkpOworCWlmIChhdnAgIT0gTlVMTCkKKwl7CisJCUNIRUNLX0ZDVChmZF9tc2dfYXZwX2hkcihhdnAsICZhdnBkYXRhKSk7CisJCXN0cnVjdCBhdnBfYXR0cmlidXRlICogYXR0cmlidXRlOworCQlDSEVDS19NQUxMT0MoYXR0cmlidXRlID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXZwX2F0dHJpYnV0ZSkpKTsKKwkJbWVtc2V0KGF0dHJpYnV0ZSwgMCwgc2l6ZW9mKHN0cnVjdCBhdnBfYXR0cmlidXRlKSk7CisJCWZkX2xpc3RfaW5pdCgmYXR0cmlidXRlLT5jaGFpbiwgYXR0cmlidXRlKTsKKwkJYXR0cmlidXRlLT5hdHRyaWIgPSAiQ2FsbGVkLVN0YXRpb24tSWQiOworCQlhdHRyaWJ1dGUtPnZhbHVlLm9zLmRhdGEgPSBhdnBkYXRhLT5hdnBfdmFsdWUtPm9zLmRhdGE7CisJCWF0dHJpYnV0ZS0+dmFsdWUub3MubGVuID0gYXZwZGF0YS0+YXZwX3ZhbHVlLT5vcy5sZW47CisJCWZkX2xpc3RfaW5zZXJ0X2JlZm9yZSgmZGlhbWVhcF9zbS0+cmVxX2F0dHJpYnV0ZXMsICZhdHRyaWJ1dGUtPmNoYWluKTsKKwl9CisKKwkvKiBDYWxsaW5nLVN0YXRpb24tSWQgQVZQICovCisJYXZwID0gTlVMTDsKKwlDSEVDS19GQ1QoZmRfbXNnX3NlYXJjaF9hdnAocmVxLCBkYXRhb2JqX2NhbGxpbmdfc3RhdGlvbl9pZCwgJmF2cCkpOworCWlmIChhdnAgIT0gTlVMTCkKKwl7CisJCUNIRUNLX0ZDVChmZF9tc2dfYXZwX2hkcihhdnAsICZhdnBkYXRhKSk7CisJCXN0cnVjdCBhdnBfYXR0cmlidXRlICogYXR0cmlidXRlOworCQlDSEVDS19NQUxMT0MoYXR0cmlidXRlID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXZwX2F0dHJpYnV0ZSkpKTsKKwkJbWVtc2V0KGF0dHJpYnV0ZSwgMCwgc2l6ZW9mKHN0cnVjdCBhdnBfYXR0cmlidXRlKSk7CisJCWZkX2xpc3RfaW5pdCgmYXR0cmlidXRlLT5jaGFpbiwgYXR0cmlidXRlKTsKKwkJYXR0cmlidXRlLT5hdHRyaWIgPSAiQ2FsbGluZy1TdGF0aW9uLUlkIjsKKwkJYXR0cmlidXRlLT52YWx1ZS5vcy5kYXRhID0gYXZwZGF0YS0+YXZwX3ZhbHVlLT5vcy5kYXRhOworCQlhdHRyaWJ1dGUtPnZhbHVlLm9zLmxlbiA9IGF2cGRhdGEtPmF2cF92YWx1ZS0+b3MubGVuOworCQlmZF9saXN0X2luc2VydF9iZWZvcmUoJmRpYW1lYXBfc20tPnJlcV9hdHRyaWJ1dGVzLCAmYXR0cmlidXRlLT5jaGFpbik7CisJfQorCisJLyogQ29ubmVjdC1JbmZvIEFWUCAqLworCWF2cCA9IE5VTEw7CisJQ0hFQ0tfRkNUKGZkX21zZ19zZWFyY2hfYXZwKHJlcSwgZGF0YW9ial9jb25uZWN0X2luZm8sICZhdnApKTsKKwlpZiAoYXZwICE9IE5VTEwpCisJeworCQlDSEVDS19GQ1QoZmRfbXNnX2F2cF9oZHIoYXZwLCAmYXZwZGF0YSkpOworCQlzdHJ1Y3QgYXZwX2F0dHJpYnV0ZSAqIGF0dHJpYnV0ZTsKKwkJQ0hFQ0tfTUFMTE9DKGF0dHJpYnV0ZSA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGF2cF9hdHRyaWJ1dGUpKSk7CisJCW1lbXNldChhdHRyaWJ1dGUsIDAsIHNpemVvZihzdHJ1Y3QgYXZwX2F0dHJpYnV0ZSkpOworCQlmZF9saXN0X2luaXQoJmF0dHJpYnV0ZS0+Y2hhaW4sIGF0dHJpYnV0ZSk7CisJCWF0dHJpYnV0ZS0+YXR0cmliID0gIkNvbm5lY3QtSW5mbyI7CisJCWF0dHJpYnV0ZS0+dmFsdWUub3MuZGF0YSA9IGF2cGRhdGEtPmF2cF92YWx1ZS0+b3MuZGF0YTsKKwkJYXR0cmlidXRlLT52YWx1ZS5vcy5sZW4gPSBhdnBkYXRhLT5hdnBfdmFsdWUtPm9zLmxlbjsKKwkJZmRfbGlzdF9pbnNlcnRfYmVmb3JlKCZkaWFtZWFwX3NtLT5yZXFfYXR0cmlidXRlcywgJmF0dHJpYnV0ZS0+Y2hhaW4pOworCX0KKworCS8qIE9yaWdpbmF0aW5nLUxpbmUtSW5mbyBBVlAgKi8KKwlhdnAgPSBOVUxMOworCUNIRUNLX0ZDVChmZF9tc2dfc2VhcmNoX2F2cChyZXEsIGRhdGFvYmpfb3JpZ2luYXRpbmdfbGluZV9pbmZvLCAmYXZwKSk7CisJaWYgKGF2cCAhPSBOVUxMKQorCXsKKwkJQ0hFQ0tfRkNUKGZkX21zZ19hdnBfaGRyKGF2cCwgJmF2cGRhdGEpKTsKKwkJc3RydWN0IGF2cF9hdHRyaWJ1dGUgKiBhdHRyaWJ1dGU7CisJCUNIRUNLX01BTExPQyhhdHRyaWJ1dGUgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdnBfYXR0cmlidXRlKSkpOworCQltZW1zZXQoYXR0cmlidXRlLCAwLCBzaXplb2Yoc3RydWN0IGF2cF9hdHRyaWJ1dGUpKTsKKwkJZmRfbGlzdF9pbml0KCZhdHRyaWJ1dGUtPmNoYWluLCBhdHRyaWJ1dGUpOworCQlhdHRyaWJ1dGUtPmF0dHJpYiA9ICJPcmlnaW5hdGluZy1MaW5lLUluZm8iOworCQlhdHRyaWJ1dGUtPnZhbHVlLm9zLmRhdGEgPSBhdnBkYXRhLT5hdnBfdmFsdWUtPm9zLmRhdGE7CisJCWF0dHJpYnV0ZS0+dmFsdWUub3MubGVuID0gYXZwZGF0YS0+YXZwX3ZhbHVlLT5vcy5sZW47CisJCWZkX2xpc3RfaW5zZXJ0X2JlZm9yZSgmZGlhbWVhcF9zbS0+cmVxX2F0dHJpYnV0ZXMsICZhdHRyaWJ1dGUtPmNoYWluKTsKKwl9CisKKwkvKiBTZXJ2aWNlLVR5cGUgQVZQICovCisJYXZwID0gTlVMTDsKKwlDSEVDS19GQ1QoZmRfbXNnX3NlYXJjaF9hdnAocmVxLCBkYXRhb2JqX3NlcnZpY2VfdHlwZSwgJmF2cCkpOworCWlmIChhdnAgIT0gTlVMTCkKKwl7CisJCUNIRUNLX0ZDVChmZF9tc2dfYXZwX2hkcihhdnAsICZhdnBkYXRhKSk7CisJCXN0cnVjdCBhdnBfYXR0cmlidXRlICogYXR0cmlidXRlOworCQlDSEVDS19NQUxMT0MoYXR0cmlidXRlID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXZwX2F0dHJpYnV0ZSkpKTsKKwkJbWVtc2V0KGF0dHJpYnV0ZSwgMCwgc2l6ZW9mKHN0cnVjdCBhdnBfYXR0cmlidXRlKSk7CisJCWZkX2xpc3RfaW5pdCgmYXR0cmlidXRlLT5jaGFpbiwgYXR0cmlidXRlKTsKKwkJYXR0cmlidXRlLT5hdHRyaWIgPSAiU2VydmljZS1UeXBlIjsKKwkJYXR0cmlidXRlLT52YWx1ZS51MzIgPSBhdnBkYXRhLT5hdnBfdmFsdWUtPnUzMjsKKwkJZmRfbGlzdF9pbnNlcnRfYmVmb3JlKCZkaWFtZWFwX3NtLT5yZXFfYXR0cmlidXRlcywgJmF0dHJpYnV0ZS0+Y2hhaW4pOworCX0KKworCS8qIENhbGxiYWNrLU51bWJlciBBVlAgKi8KKwlhdnAgPSBOVUxMOworCUNIRUNLX0ZDVChmZF9tc2dfc2VhcmNoX2F2cChyZXEsIGRhdGFvYmpfY2FsbGJhY2tfbnVtYmVyLCAmYXZwKSk7CisJaWYgKGF2cCAhPSBOVUxMKQorCXsKKwkJQ0hFQ0tfRkNUKGZkX21zZ19hdnBfaGRyKGF2cCwgJmF2cGRhdGEpKTsKKwkJc3RydWN0IGF2cF9hdHRyaWJ1dGUgKiBhdHRyaWJ1dGU7CisJCUNIRUNLX01BTExPQyhhdHRyaWJ1dGUgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdnBfYXR0cmlidXRlKSkpOworCQltZW1zZXQoYXR0cmlidXRlLCAwLCBzaXplb2Yoc3RydWN0IGF2cF9hdHRyaWJ1dGUpKTsKKwkJZmRfbGlzdF9pbml0KCZhdHRyaWJ1dGUtPmNoYWluLCBhdHRyaWJ1dGUpOworCQlhdHRyaWJ1dGUtPmF0dHJpYiA9ICJDYWxsYmFjay1OdW1iZXIiOworCQlhdHRyaWJ1dGUtPnZhbHVlLm9zLmRhdGEgPSBhdnBkYXRhLT5hdnBfdmFsdWUtPm9zLmRhdGE7CisJCWF0dHJpYnV0ZS0+dmFsdWUub3MubGVuID0gYXZwZGF0YS0+YXZwX3ZhbHVlLT5vcy5sZW47CisJCWZkX2xpc3RfaW5zZXJ0X2JlZm9yZSgmZGlhbWVhcF9zbS0+cmVxX2F0dHJpYnV0ZXMsICZhdHRyaWJ1dGUtPmNoYWluKTsKKwl9CisKKwkvKiBQb3J0LUxpbWl0IEFWUCAqLworCWF2cCA9IE5VTEw7CisJQ0hFQ0tfRkNUKGZkX21zZ19zZWFyY2hfYXZwKHJlcSwgZGF0YW9ial9wb3J0X2xpbWl0LCAmYXZwKSk7CisJaWYgKGF2cCAhPSBOVUxMKQorCXsKKwkJQ0hFQ0tfRkNUKGZkX21zZ19hdnBfaGRyKGF2cCwgJmF2cGRhdGEpKTsKKwkJc3RydWN0IGF2cF9hdHRyaWJ1dGUgKiBhdHRyaWJ1dGU7CisJCUNIRUNLX01BTExPQyhhdHRyaWJ1dGUgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdnBfYXR0cmlidXRlKSkpOworCQltZW1zZXQoYXR0cmlidXRlLCAwLCBzaXplb2Yoc3RydWN0IGF2cF9hdHRyaWJ1dGUpKTsKKwkJZmRfbGlzdF9pbml0KCZhdHRyaWJ1dGUtPmNoYWluLCBhdHRyaWJ1dGUpOworCQlhdHRyaWJ1dGUtPmF0dHJpYiA9ICJQb3J0LUxpbWl0IjsKKwkJYXR0cmlidXRlLT52YWx1ZS51MzIgPSBhdnBkYXRhLT5hdnBfdmFsdWUtPnUzMjsKKwkJZmRfbGlzdF9pbnNlcnRfYmVmb3JlKCZkaWFtZWFwX3NtLT5yZXFfYXR0cmlidXRlcywgJmF0dHJpYnV0ZS0+Y2hhaW4pOworCX0KKworCS8qIEZyYW1lZC1Qcm90b2NvbCBBVlAgKi8KKwlhdnAgPSBOVUxMOworCUNIRUNLX0ZDVChmZF9tc2dfc2VhcmNoX2F2cChyZXEsIGRhdGFvYmpfZnJhbWVkX3Byb3RvY29sLCAmYXZwKSk7CisJaWYgKGF2cCAhPSBOVUxMKQorCXsKKwkJQ0hFQ0tfRkNUKGZkX21zZ19hdnBfaGRyKGF2cCwgJmF2cGRhdGEpKTsKKwkJc3RydWN0IGF2cF9hdHRyaWJ1dGUgKiBhdHRyaWJ1dGU7CisJCUNIRUNLX01BTExPQyhhdHRyaWJ1dGUgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdnBfYXR0cmlidXRlKSkpOworCQltZW1zZXQoYXR0cmlidXRlLCAwLCBzaXplb2Yoc3RydWN0IGF2cF9hdHRyaWJ1dGUpKTsKKwkJZmRfbGlzdF9pbml0KCZhdHRyaWJ1dGUtPmNoYWluLCBhdHRyaWJ1dGUpOworCQlhdHRyaWJ1dGUtPmF0dHJpYiA9ICJGcmFtZWQtUHJvdG9jb2wiOworCQlhdHRyaWJ1dGUtPnZhbHVlLnUzMiA9IGF2cGRhdGEtPmF2cF92YWx1ZS0+dTMyOworCQlmZF9saXN0X2luc2VydF9iZWZvcmUoJmRpYW1lYXBfc20tPnJlcV9hdHRyaWJ1dGVzLCAmYXR0cmlidXRlLT5jaGFpbik7CisJfQorCisJLyogRnJhbWVkLU1UVSBBVlAgKi8KKwlhdnAgPSBOVUxMOworCUNIRUNLX0ZDVChmZF9tc2dfc2VhcmNoX2F2cChyZXEsIGRhdGFvYmpfZnJhbWVkX210dSwgJmF2cCkpOworCWlmIChhdnAgIT0gTlVMTCkKKwl7CisJCUNIRUNLX0ZDVChmZF9tc2dfYXZwX2hkcihhdnAsICZhdnBkYXRhKSk7CisJCXN0cnVjdCBhdnBfYXR0cmlidXRlICogYXR0cmlidXRlOworCQlDSEVDS19NQUxMT0MoYXR0cmlidXRlID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXZwX2F0dHJpYnV0ZSkpKTsKKwkJbWVtc2V0KGF0dHJpYnV0ZSwgMCwgc2l6ZW9mKHN0cnVjdCBhdnBfYXR0cmlidXRlKSk7CisJCWZkX2xpc3RfaW5pdCgmYXR0cmlidXRlLT5jaGFpbiwgYXR0cmlidXRlKTsKKwkJYXR0cmlidXRlLT5hdHRyaWIgPSAiRnJhbWVkLU1UVSI7CisJCWF0dHJpYnV0ZS0+dmFsdWUudTMyID0gYXZwZGF0YS0+YXZwX3ZhbHVlLT51MzI7CisJCWZkX2xpc3RfaW5zZXJ0X2JlZm9yZSgmZGlhbWVhcF9zbS0+cmVxX2F0dHJpYnV0ZXMsICZhdHRyaWJ1dGUtPmNoYWluKTsKKwl9CisKKwkvKiBGcmFtZWQtQ29tcHJlc3Npb24gQVZQICovCisJYXZwID0gTlVMTDsKKwlhdnAyID0gTlVMTDsKKwlDSEVDS19GQ1QoZmRfbXNnX3NlYXJjaF9hdnAocmVxLCBkYXRhb2JqX2ZyYW1lZF9jb21wcmVzc2lvbiwgJmF2cCkpOworCWlmIChhdnAgIT0gTlVMTCkKKwl7CisJCUNIRUNLX0ZDVChmZF9tc2dfYXZwX2hkcihhdnAsICZhdnBkYXRhKSk7CisJCXUzMiBQaV9Db2RlID0gYXZwZGF0YS0+YXZwX2NvZGU7CisJCWludCBkZXB0aDsKKwkJZG8KKwkJeworCQkJc3RydWN0IGF2cF9hdHRyaWJ1dGUgKiBhdHRyaWJ1dGU7CisJCQlDSEVDS19NQUxMT0MoYXR0cmlidXRlID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXZwX2F0dHJpYnV0ZSkpKTsKKwkJCW1lbXNldChhdHRyaWJ1dGUsIDAsIHNpemVvZihzdHJ1Y3QgYXZwX2F0dHJpYnV0ZSkpOworCQkJZmRfbGlzdF9pbml0KCZhdHRyaWJ1dGUtPmNoYWluLCBhdHRyaWJ1dGUpOworCQkJYXR0cmlidXRlLT5hdHRyaWIgPSAiRnJhbWVkLUNvbXByZXNzaW9uIjsKKwkJCWF0dHJpYnV0ZS0+dmFsdWUudTMyID0gYXZwZGF0YS0+YXZwX3ZhbHVlLT51MzI7CisJCQlmZF9saXN0X2luc2VydF9iZWZvcmUoJmRpYW1lYXBfc20tPnJlcV9hdHRyaWJ1dGVzLAorCQkJCQkmYXR0cmlidXRlLT5jaGFpbik7CisJCQlyZXQgPSAwOworCQkJZGVwdGggPSAwOworCQkJcmV0ID0gZmRfbXNnX2Jyb3dzZSAoIGF2cCwgTVNHX0JSV19ORVhULCAmYXZwMiwgJmRlcHRoKTsKKwkJCWlmIChhdnAyICE9IE5VTEwpCisJCQl7CisJCQkJQ0hFQ0tfRkNUKGZkX21zZ19hdnBfaGRyKGF2cDIsICZhdnBkYXRhKSk7CisJCQl9CisJCQlhdnAgPSBhdnAyOworCQl9IHdoaWxlICgoYXZwMiAhPSBOVUxMKSAmJiAocmV0ID09IDApICYmIChyZXQgPT0gMCkKKwkJCQkmJiAoYXZwZGF0YS0+YXZwX2NvZGUgPT0gUGlfQ29kZSkpOworCX0KKworCS8qIEZyYW1lZC1JUC1BZGRyZXNzIEFWUCAqLworCWF2cCA9IE5VTEw7CisJQ0hFQ0tfRkNUKGZkX21zZ19zZWFyY2hfYXZwKHJlcSwgZGF0YW9ial9mcmFtZWRfaXBfYWRkcmVzcywgJmF2cCkpOworCWlmIChhdnAgIT0gTlVMTCkKKwl7CisJCUNIRUNLX0ZDVChmZF9tc2dfYXZwX2hkcihhdnAsICZhdnBkYXRhKSk7CisJCXN0cnVjdCBhdnBfYXR0cmlidXRlICogYXR0cmlidXRlOworCQlDSEVDS19NQUxMT0MoYXR0cmlidXRlID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXZwX2F0dHJpYnV0ZSkpKTsKKwkJbWVtc2V0KGF0dHJpYnV0ZSwgMCwgc2l6ZW9mKHN0cnVjdCBhdnBfYXR0cmlidXRlKSk7CisJCWZkX2xpc3RfaW5pdCgmYXR0cmlidXRlLT5jaGFpbiwgYXR0cmlidXRlKTsKKwkJYXR0cmlidXRlLT5hdHRyaWIgPSAiRnJhbWVkLUlQLUFkZHJlc3MiOworCQlhdHRyaWJ1dGUtPnZhbHVlLm9zLmRhdGEgPSBhdnBkYXRhLT5hdnBfdmFsdWUtPm9zLmRhdGE7CisJCWF0dHJpYnV0ZS0+dmFsdWUub3MubGVuID0gYXZwZGF0YS0+YXZwX3ZhbHVlLT5vcy5sZW47CisJCWZkX2xpc3RfaW5zZXJ0X2JlZm9yZSgmZGlhbWVhcF9zbS0+cmVxX2F0dHJpYnV0ZXMsICZhdHRyaWJ1dGUtPmNoYWluKTsKKwl9CisKKwkvKiBGcmFtZWQtSVAtTmV0bWFzayBBVlAgKi8KKwlhdnAgPSBOVUxMOworCUNIRUNLX0ZDVChmZF9tc2dfc2VhcmNoX2F2cChyZXEsIGRhdGFvYmpfZnJhbWVkX2lwX25ldG1hc2ssICZhdnApKTsKKwlpZiAoYXZwICE9IE5VTEwpCisJeworCQlDSEVDS19GQ1QoZmRfbXNnX2F2cF9oZHIoYXZwLCAmYXZwZGF0YSkpOworCQlzdHJ1Y3QgYXZwX2F0dHJpYnV0ZSAqIGF0dHJpYnV0ZTsKKwkJQ0hFQ0tfTUFMTE9DKGF0dHJpYnV0ZSA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGF2cF9hdHRyaWJ1dGUpKSk7CisJCW1lbXNldChhdHRyaWJ1dGUsIDAsIHNpemVvZihzdHJ1Y3QgYXZwX2F0dHJpYnV0ZSkpOworCQlmZF9saXN0X2luaXQoJmF0dHJpYnV0ZS0+Y2hhaW4sIGF0dHJpYnV0ZSk7CisJCWF0dHJpYnV0ZS0+YXR0cmliID0gIkZyYW1lZC1JUC1OZXRtYXNrIjsKKwkJYXR0cmlidXRlLT52YWx1ZS5vcy5kYXRhID0gYXZwZGF0YS0+YXZwX3ZhbHVlLT5vcy5kYXRhOworCQlhdHRyaWJ1dGUtPnZhbHVlLm9zLmxlbiA9IGF2cGRhdGEtPmF2cF92YWx1ZS0+b3MubGVuOworCQlmZF9saXN0X2luc2VydF9iZWZvcmUoJmRpYW1lYXBfc20tPnJlcV9hdHRyaWJ1dGVzLCAmYXR0cmlidXRlLT5jaGFpbik7CisJfQorCisJLyogRnJhbWVkLUludGVyZmFjZS1JZCBBVlAgKi8KKwlhdnAgPSBOVUxMOworCUNIRUNLX0ZDVChmZF9tc2dfc2VhcmNoX2F2cChyZXEsIGRhdGFvYmpfZnJhbWVkX2ludGVyZmFjZV9pZCwgJmF2cCkpOworCWlmIChhdnAgIT0gTlVMTCkKKwl7CisJCUNIRUNLX0ZDVChmZF9tc2dfYXZwX2hkcihhdnAsICZhdnBkYXRhKSk7CisJCXN0cnVjdCBhdnBfYXR0cmlidXRlICogYXR0cmlidXRlOworCQlDSEVDS19NQUxMT0MoYXR0cmlidXRlID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXZwX2F0dHJpYnV0ZSkpKTsKKwkJbWVtc2V0KGF0dHJpYnV0ZSwgMCwgc2l6ZW9mKHN0cnVjdCBhdnBfYXR0cmlidXRlKSk7CisJCWZkX2xpc3RfaW5pdCgmYXR0cmlidXRlLT5jaGFpbiwgYXR0cmlidXRlKTsKKwkJYXR0cmlidXRlLT5hdHRyaWIgPSAiRnJhbWVkLUludGVyZmFjZS1JZCI7CisJCWF0dHJpYnV0ZS0+dmFsdWUudTY0ID0gYXZwZGF0YS0+YXZwX3ZhbHVlLT51NjQ7CisJCWZkX2xpc3RfaW5zZXJ0X2JlZm9yZSgmZGlhbWVhcF9zbS0+cmVxX2F0dHJpYnV0ZXMsICZhdHRyaWJ1dGUtPmNoYWluKTsKKwl9CisKKwkvKiBGcmFtZWQtSVB2Ni1QcmVmaXggQVZQICovCisJYXZwID0gTlVMTDsKKwlhdnAyID0gTlVMTDsKKwlDSEVDS19GQ1QoZmRfbXNnX3NlYXJjaF9hdnAocmVxLCBkYXRhb2JqX2ZyYW1lZF9pcHY2X3ByZWZpeCwgJmF2cCkpOworCWlmIChhdnAgIT0gTlVMTCkKKwl7CisJCUNIRUNLX0ZDVChmZF9tc2dfYXZwX2hkcihhdnAsICZhdnBkYXRhKSk7CisJCXUzMiBQaV9Db2RlID0gYXZwZGF0YS0+YXZwX2NvZGU7CisJCWRvCisJCXsKKwkJCXN0cnVjdCBhdnBfYXR0cmlidXRlICogYXR0cmlidXRlOworCQkJQ0hFQ0tfTUFMTE9DKGF0dHJpYnV0ZSA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGF2cF9hdHRyaWJ1dGUpKSk7CisJCQltZW1zZXQoYXR0cmlidXRlLCAwLCBzaXplb2Yoc3RydWN0IGF2cF9hdHRyaWJ1dGUpKTsKKwkJCWZkX2xpc3RfaW5pdCgmYXR0cmlidXRlLT5jaGFpbiwgYXR0cmlidXRlKTsKKwkJCWF0dHJpYnV0ZS0+YXR0cmliID0gIkZyYW1lZC1JUHY2LVByZWZpeCI7CisJCQlhdHRyaWJ1dGUtPnZhbHVlLnUzMiA9IGF2cGRhdGEtPmF2cF92YWx1ZS0+dTMyOworCQkJZmRfbGlzdF9pbnNlcnRfYmVmb3JlKCZkaWFtZWFwX3NtLT5yZXFfYXR0cmlidXRlcywKKwkJCQkJJmF0dHJpYnV0ZS0+Y2hhaW4pOworCQkJcmV0ID0gMDsKKwkJCWRlcHRoID0gMDsKKwkJCXJldCA9IGZkX21zZ19icm93c2UgKCBhdnAsIE1TR19CUldfTkVYVCwgJmF2cDIsICZkZXB0aCk7CisJCQlpZiAoYXZwMiAhPSBOVUxMKQorCQkJeworCQkJCUNIRUNLX0ZDVChmZF9tc2dfYXZwX2hkcihhdnAyLCAmYXZwZGF0YSkpOworCQkJfQorCQkJYXZwID0gYXZwMjsKKwkJfSB3aGlsZSAoKGF2cDIgIT0gTlVMTCkgJiYgKHJldCA9PSAwKSAmJiAocmV0ID09IDApCisJCQkJJiYgKGF2cGRhdGEtPmF2cF9jb2RlID09IFBpX0NvZGUpKTsKKwl9CisKKwkvKiBUdW5uZWxpbmcgQVZQICovCisJYXZwID0gTlVMTDsKKwlhdnAyID0gTlVMTDsKKwlDSEVDS19GQ1QoZmRfbXNnX3NlYXJjaF9hdnAocmVxLCBkYXRhb2JqX3R1bm5lbGluZywgJmF2cCkpOworCWlmIChhdnAgIT0gTlVMTCkKKwl7CisJCUNIRUNLX0ZDVChmZF9tc2dfYXZwX2hkcihhdnAsICZhdnBkYXRhKSk7CisJCXUzMiBQaV9Db2RlID0gYXZwZGF0YS0+YXZwX2NvZGU7CisJCWludCBkZXB0aDsKKwkJZG8KKwkJeworCQkJc3RydWN0IGF2cF9hdHRyaWJ1dGUgKiBhdHRyaWJ1dGU7CisJCQlDSEVDS19NQUxMT0MoYXR0cmlidXRlID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXZwX2F0dHJpYnV0ZSkpKTsKKwkJCW1lbXNldChhdHRyaWJ1dGUsIDAsIHNpemVvZihzdHJ1Y3QgYXZwX2F0dHJpYnV0ZSkpOworCQkJZmRfbGlzdF9pbml0KCZhdHRyaWJ1dGUtPmNoYWluLCBhdHRyaWJ1dGUpOworCQkJYXR0cmlidXRlLT5hdHRyaWIgPSAiVHVubmVsaW5nIjsKKwkJCS8vZ3JvdXBlZCBBVlAKKwkJCWZkX2xpc3RfaW5zZXJ0X2JlZm9yZSgmZGlhbWVhcF9zbS0+cmVxX2F0dHJpYnV0ZXMsCisJCQkJCSZhdHRyaWJ1dGUtPmNoYWluKTsKKwkJCXJldCA9IDA7CisJCQlkZXB0aCA9IDA7CisJCQlyZXQgPSBmZF9tc2dfYnJvd3NlICggYXZwLCBNU0dfQlJXX05FWFQsICZhdnAyLCAmZGVwdGgpOworCQkJaWYgKGF2cDIgIT0gTlVMTCkKKwkJCXsKKwkJCQlDSEVDS19GQ1QoZmRfbXNnX2F2cF9oZHIoYXZwMiwgJmF2cGRhdGEpKTsKKwkJCX0KKwkJCWF2cCA9IGF2cDI7CisJCX0gd2hpbGUgKChhdnAyICE9IE5VTEwpICYmIChyZXQgPT0gMCkgJiYgKHJldCA9PSAwKQorCQkJCSYmIChhdnBkYXRhLT5hdnBfY29kZSA9PSBQaV9Db2RlKSk7CisJfQorCisJLyogTkFTLUlkZW50aWZpZXIgQVZQICovCisJYXZwID0gTlVMTDsKKwlDSEVDS19GQ1QoZmRfbXNnX3NlYXJjaF9hdnAocmVxLCBkYXRhb2JqX25hc19pZGVudGlmaWVyLCAmYXZwKSk7CisJaWYgKGF2cCAhPSBOVUxMKQorCXsKKwkJQ0hFQ0tfRkNUKGZkX21zZ19hdnBfaGRyKGF2cCwgJmF2cGRhdGEpKTsKKwkJc3RydWN0IGF2cF9hdHRyaWJ1dGUgKiBhdHRyaWJ1dGU7CisJCUNIRUNLX01BTExPQyhhdHRyaWJ1dGUgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdnBfYXR0cmlidXRlKSkpOworCQltZW1zZXQoYXR0cmlidXRlLCAwLCBzaXplb2Yoc3RydWN0IGF2cF9hdHRyaWJ1dGUpKTsKKwkJZmRfbGlzdF9pbml0KCZhdHRyaWJ1dGUtPmNoYWluLCBhdHRyaWJ1dGUpOworCQlhdHRyaWJ1dGUtPmF0dHJpYiA9ICJOQVMtSWRlbnRpZmllciI7CisJCWF0dHJpYnV0ZS0+dmFsdWUub3MuZGF0YSA9IGF2cGRhdGEtPmF2cF92YWx1ZS0+b3MuZGF0YTsKKwkJYXR0cmlidXRlLT52YWx1ZS5vcy5sZW4gPSBhdnBkYXRhLT5hdnBfdmFsdWUtPm9zLmxlbjsKKwkJZmRfbGlzdF9pbnNlcnRfYmVmb3JlKCZkaWFtZWFwX3NtLT5yZXFfYXR0cmlidXRlcywgJmF0dHJpYnV0ZS0+Y2hhaW4pOworCX0KKworCS8qIE5BUy1JUC1BZGRyZXNzIEFWUCAqLworCWF2cCA9IE5VTEw7CisJQ0hFQ0tfRkNUKGZkX21zZ19zZWFyY2hfYXZwKHJlcSwgZGF0YW9ial9uYXNfaXBfYWRkcmVzcywgJmF2cCkpOworCWlmIChhdnAgIT0gTlVMTCkKKwl7CisJCUNIRUNLX0ZDVChmZF9tc2dfYXZwX2hkcihhdnAsICZhdnBkYXRhKSk7CisJCXN0cnVjdCBhdnBfYXR0cmlidXRlICogYXR0cmlidXRlOworCQlDSEVDS19NQUxMT0MoYXR0cmlidXRlID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXZwX2F0dHJpYnV0ZSkpKTsKKwkJbWVtc2V0KGF0dHJpYnV0ZSwgMCwgc2l6ZW9mKHN0cnVjdCBhdnBfYXR0cmlidXRlKSk7CisJCWZkX2xpc3RfaW5pdCgmYXR0cmlidXRlLT5jaGFpbiwgYXR0cmlidXRlKTsKKwkJYXR0cmlidXRlLT5hdHRyaWIgPSAiTkFTLUlQLUFkZHJlc3MiOworCQlhdHRyaWJ1dGUtPnZhbHVlLm9zLmRhdGEgPSBhdnBkYXRhLT5hdnBfdmFsdWUtPm9zLmRhdGE7CisJCWF0dHJpYnV0ZS0+dmFsdWUub3MubGVuID0gYXZwZGF0YS0+YXZwX3ZhbHVlLT5vcy5sZW47CisJCWZkX2xpc3RfaW5zZXJ0X2JlZm9yZSgmZGlhbWVhcF9zbS0+cmVxX2F0dHJpYnV0ZXMsICZhdHRyaWJ1dGUtPmNoYWluKTsKKwl9CisKKwkvKiBOQVMtSVB2Ni1BZGRyZXNzIEFWUCAqLworCWF2cCA9IE5VTEw7CisJQ0hFQ0tfRkNUKGZkX21zZ19zZWFyY2hfYXZwKHJlcSwgZGF0YW9ial9uYXNfaXB2Nl9hZGRyZXNzLCAmYXZwKSk7CisJaWYgKGF2cCAhPSBOVUxMKQorCXsKKwkJQ0hFQ0tfRkNUKGZkX21zZ19hdnBfaGRyKGF2cCwgJmF2cGRhdGEpKTsKKwkJc3RydWN0IGF2cF9hdHRyaWJ1dGUgKiBhdHRyaWJ1dGU7CisJCUNIRUNLX01BTExPQyhhdHRyaWJ1dGUgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdnBfYXR0cmlidXRlKSkpOworCQltZW1zZXQoYXR0cmlidXRlLCAwLCBzaXplb2Yoc3RydWN0IGF2cF9hdHRyaWJ1dGUpKTsKKwkJZmRfbGlzdF9pbml0KCZhdHRyaWJ1dGUtPmNoYWluLCBhdHRyaWJ1dGUpOworCQlhdHRyaWJ1dGUtPmF0dHJpYiA9ICJOQVMtSVB2Ni1BZGRyZXNzIjsKKwkJYXR0cmlidXRlLT52YWx1ZS5vcy5kYXRhID0gYXZwZGF0YS0+YXZwX3ZhbHVlLT5vcy5kYXRhOworCQlhdHRyaWJ1dGUtPnZhbHVlLm9zLmxlbiA9IGF2cGRhdGEtPmF2cF92YWx1ZS0+b3MubGVuOworCQlmZF9saXN0X2luc2VydF9iZWZvcmUoJmRpYW1lYXBfc20tPnJlcV9hdHRyaWJ1dGVzLCAmYXR0cmlidXRlLT5jaGFpbik7CisJfQorCisJLyogU3RhdGUgQVZQICovCisJYXZwID0gTlVMTDsKKwlDSEVDS19GQ1QoZmRfbXNnX3NlYXJjaF9hdnAocmVxLCBkYXRhb2JqX3N0YXRlLCAmYXZwKSk7CisJaWYgKGF2cCAhPSBOVUxMKQorCXsKKwkJQ0hFQ0tfRkNUKGZkX21zZ19hdnBfaGRyKGF2cCwgJmF2cGRhdGEpKTsKKwkJc3RydWN0IGF2cF9hdHRyaWJ1dGUgKiBhdHRyaWJ1dGU7CisJCUNIRUNLX01BTExPQyhhdHRyaWJ1dGUgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdnBfYXR0cmlidXRlKSkpOworCQltZW1zZXQoYXR0cmlidXRlLCAwLCBzaXplb2Yoc3RydWN0IGF2cF9hdHRyaWJ1dGUpKTsKKwkJZmRfbGlzdF9pbml0KCZhdHRyaWJ1dGUtPmNoYWluLCBhdHRyaWJ1dGUpOworCQlhdHRyaWJ1dGUtPmF0dHJpYiA9ICJTdGF0ZSI7CisJCWF0dHJpYnV0ZS0+dmFsdWUub3MuZGF0YSA9IGF2cGRhdGEtPmF2cF92YWx1ZS0+b3MuZGF0YTsKKwkJYXR0cmlidXRlLT52YWx1ZS5vcy5sZW4gPSBhdnBkYXRhLT5hdnBfdmFsdWUtPm9zLmxlbjsKKwkJZmRfbGlzdF9pbnNlcnRfYmVmb3JlKCZkaWFtZWFwX3NtLT5yZXFfYXR0cmlidXRlcywgJmF0dHJpYnV0ZS0+Y2hhaW4pOworCX0KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgZGlhbWVhcF9zZXNzX2RhdGFfbmV3KAorCQlzdHJ1Y3Qgc2Vzc19zdGF0ZSAqZGlhbWVhcF9zZXNzX2RhdGEsCisJCXN0cnVjdCBkaWFtZWFwX3N0YXRlX21hY2hpbmUgKmRpYW1lYXBfc20pCit7CisJaWYgKCFkaWFtZWFwX3NtKQorCQlyZXR1cm4gRUlOVkFMOworCisJaW50IGk7CisKKwlkaWFtZWFwX3Nlc3NfZGF0YS0+aW52YWxpZF9lYXBwYWNrZXRzID0gZGlhbWVhcF9zbS0+aW52YWxpZF9lYXBwYWNrZXRzOworCisJZGlhbWVhcF9zZXNzX2RhdGEtPnVzZXIuaWQgPSBkaWFtZWFwX3NtLT5lYXBfc20udXNlci5pZDsKKworCWlmICgoZGlhbWVhcF9zbS0+ZWFwX3NtLnVzZXIudXNlcmlkICE9IE5VTEwpCisJCQkmJiAoZGlhbWVhcF9zbS0+ZWFwX3NtLnVzZXIudXNlcmlkTGVuZ3RoID4gMCkpCisJeworCQlkaWFtZWFwX3Nlc3NfZGF0YS0+dXNlci51c2VyaWRMZW5ndGgKKwkJCQk9IGRpYW1lYXBfc20tPmVhcF9zbS51c2VyLnVzZXJpZExlbmd0aDsKKwkJQ0hFQ0tfTUFMTE9DKGRpYW1lYXBfc2Vzc19kYXRhLT51c2VyLnVzZXJpZD0gbWFsbG9jKGRpYW1lYXBfc2Vzc19kYXRhLT51c2VyLnVzZXJpZExlbmd0aCsxKSk7CisJCVU4Q09QWShkaWFtZWFwX3Nlc3NfZGF0YS0+dXNlci51c2VyaWQsMCxkaWFtZWFwX3Nlc3NfZGF0YS0+dXNlci51c2VyaWRMZW5ndGgrMSxkaWFtZWFwX3NtLT5lYXBfc20udXNlci51c2VyaWQpOworCQlmcmVlKGRpYW1lYXBfc20tPmVhcF9zbS51c2VyLnVzZXJpZCk7CisJCWRpYW1lYXBfc20tPmVhcF9zbS51c2VyLnVzZXJpZCA9IE5VTEw7CisKKwl9CisJZWxzZQorCXsKKwkJZGlhbWVhcF9zZXNzX2RhdGEtPnVzZXIudXNlcmlkTGVuZ3RoID0gMDsKKwkJZGlhbWVhcF9zZXNzX2RhdGEtPnVzZXIudXNlcmlkID0gTlVMTDsKKwl9CisKKwlpZiAoKGRpYW1lYXBfc20tPmVhcF9zbS51c2VyLnBhc3N3b3JkICE9IE5VTEwpCisJCQkmJiAoZGlhbWVhcF9zbS0+ZWFwX3NtLnVzZXIucGFzc3dvcmRMZW5ndGggPiAwKSkKKwl7CisJCWRpYW1lYXBfc2Vzc19kYXRhLT51c2VyLnBhc3N3b3JkTGVuZ3RoCisJCQkJPSBkaWFtZWFwX3NtLT5lYXBfc20udXNlci5wYXNzd29yZExlbmd0aDsKKwkJQ0hFQ0tfTUFMTE9DKGRpYW1lYXBfc2Vzc19kYXRhLT51c2VyLnBhc3N3b3JkID0gbWFsbG9jKGRpYW1lYXBfc2Vzc19kYXRhLT51c2VyLnBhc3N3b3JkTGVuZ3RoKzEpKTsKKwkJVThDT1BZKGRpYW1lYXBfc2Vzc19kYXRhLT51c2VyLnBhc3N3b3JkLDAsZGlhbWVhcF9zZXNzX2RhdGEtPnVzZXIucGFzc3dvcmRMZW5ndGgrMSxkaWFtZWFwX3NtLT5lYXBfc20udXNlci5wYXNzd29yZCk7CisJCWZyZWUoZGlhbWVhcF9zbS0+ZWFwX3NtLnVzZXIucGFzc3dvcmQpOworCQlkaWFtZWFwX3NtLT5lYXBfc20udXNlci5wYXNzd29yZCA9IE5VTEw7CisJfQorCWVsc2UKKwl7CisJCWRpYW1lYXBfc2Vzc19kYXRhLT51c2VyLnBhc3N3b3JkTGVuZ3RoID0gMDsKKwkJZGlhbWVhcF9zZXNzX2RhdGEtPnVzZXIucGFzc3dvcmQgPSBOVUxMOworCX0KKworCWRpYW1lYXBfc2Vzc19kYXRhLT51c2VyLm1ldGhvZElkID0gZGlhbWVhcF9zbS0+ZWFwX3NtLnVzZXIubWV0aG9kSWQ7CisJZm9yIChpID0gMDsgaSA8IE1BWE1FVEhPRFM7IGkrKykKKwl7CisJCWRpYW1lYXBfc2Vzc19kYXRhLT51c2VyLm1ldGhvZHNbaV0ubWV0aG9kCisJCQkJPSBkaWFtZWFwX3NtLT5lYXBfc20udXNlci5tZXRob2RzW2ldLm1ldGhvZDsKKwkJZGlhbWVhcF9zZXNzX2RhdGEtPnVzZXIubWV0aG9kc1tpXS52ZW5kb3IKKwkJCQk9IGRpYW1lYXBfc20tPmVhcF9zbS51c2VyLm1ldGhvZHNbaV0udmVuZG9yOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBNQVhQUk9QT1NFRE1FVEhPRFM7IGkrKykKKwl7CisJCWRpYW1lYXBfc2Vzc19kYXRhLT51c2VyLnByb3Bvc2VkbWV0aG9kc1tpXS5tZXRob2QKKwkJCQk9IGRpYW1lYXBfc20tPmVhcF9zbS51c2VyLnByb3Bvc2VkbWV0aG9kc1tpXS5tZXRob2Q7CisJCWRpYW1lYXBfc2Vzc19kYXRhLT51c2VyLnByb3Bvc2VkbWV0aG9kc1tpXS52ZW5kb3IKKwkJCQk9IGRpYW1lYXBfc20tPmVhcF9zbS51c2VyLnByb3Bvc2VkbWV0aG9kc1tpXS52ZW5kb3I7CisJfQorCisJZGlhbWVhcF9zZXNzX2RhdGEtPnVzZXIucG1ldGhvZHMgPSBkaWFtZWFwX3NtLT5lYXBfc20udXNlci5wbWV0aG9kczsKKwlkaWFtZWFwX3Nlc3NfZGF0YS0+dXNlci5wcm9wb3NlZF9lYXBfbWV0aG9kCisJCQk9IGRpYW1lYXBfc20tPmVhcF9zbS51c2VyLnByb3Bvc2VkX2VhcF9tZXRob2Q7CisJZGlhbWVhcF9zZXNzX2RhdGEtPnVzZXIucHJvcG9zZWRfZWFwX21ldGhvZF92ZW5kb3IKKwkJCT0gZGlhbWVhcF9zbS0+ZWFwX3NtLnVzZXIucHJvcG9zZWRfZWFwX21ldGhvZF92ZW5kb3I7CisJZGlhbWVhcF9zZXNzX2RhdGEtPnVzZXIuc3VjY2VzcyA9IGRpYW1lYXBfc20tPmVhcF9zbS51c2VyLnN1Y2Nlc3M7CisKKwlkaWFtZWFwX3Nlc3NfZGF0YS0+Y3VycmVudElkID0gZGlhbWVhcF9zbS0+ZWFwX3NtLmN1cnJlbnRJZDsKKwlkaWFtZWFwX3Nlc3NfZGF0YS0+Y3VycmVudE1ldGhvZCA9IGRpYW1lYXBfc20tPmVhcF9zbS5jdXJyZW50TWV0aG9kOworCWRpYW1lYXBfc2Vzc19kYXRhLT5jdXJyZW50VmVuZG9yID0gZGlhbWVhcF9zbS0+ZWFwX3NtLmN1cnJlbnRWZW5kb3I7CisJZGlhbWVhcF9zZXNzX2RhdGEtPmxhc3RJZCA9IGRpYW1lYXBfc20tPmVhcF9zbS5sYXN0SWQ7CisJZGlhbWVhcF9zZXNzX2RhdGEtPm1ldGhvZFN0YXRlID0gZGlhbWVhcF9zbS0+ZWFwX3NtLm1ldGhvZFN0YXRlOworCisJZGlhbWVhcF9zZXNzX2RhdGEtPm1ldGhvZERhdGEgPSBkaWFtZWFwX3NtLT5lYXBfc20ubWV0aG9kRGF0YTsKKwlkaWFtZWFwX3NtLT5lYXBfc20ubWV0aG9kRGF0YSA9IE5VTEw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZnJlZV9hdHRyaWIoc3RydWN0IGF1dGhfYXR0cmlidXRlICogYXV0aF9hdHRyaWIpCit7CisJaWYgKGF1dGhfYXR0cmliID09IE5VTEwpCisJeworCQlyZXR1cm47CisJfQorCWlmIChhdXRoX2F0dHJpYi0+YXR0cmliICE9IE5VTEwpCisJeworCQlmcmVlKGF1dGhfYXR0cmliLT5hdHRyaWIpOworCQlhdXRoX2F0dHJpYi0+YXR0cmliID0gTlVMTDsKKwl9CisJaWYgKGF1dGhfYXR0cmliLT5vcCAhPSBOVUxMKQorCXsKKwkJZnJlZShhdXRoX2F0dHJpYi0+b3ApOworCQlhdXRoX2F0dHJpYi0+b3AgPSBOVUxMOworCX0KKwlpZiAoYXV0aF9hdHRyaWItPnZhbHVlICE9IE5VTEwpCisJeworCQlmcmVlKGF1dGhfYXR0cmliLT52YWx1ZSk7CisJCWF1dGhfYXR0cmliLT52YWx1ZSA9IE5VTEw7CisJfQorCWZyZWUoYXV0aF9hdHRyaWIpOworCWF1dGhfYXR0cmliID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQgZnJlZV9hdnBfYXR0cmliKHN0cnVjdCBhdnBfYXR0cmlidXRlICogYXZwX2F0dHJpYikKK3sKKwlpZihhdnBfYXR0cmliKXsKKwlmcmVlKGF2cF9hdHRyaWIpOworCWF2cF9hdHRyaWIgPSBOVUxMOworCX0KK30KKworc3RhdGljIHZvaWQgZnJlZV9hbnNfYXR0cmliKHN0cnVjdCBhdnBfYXR0cmlidXRlICogYW5zX2F0dHJpYikKK3sKKwlpZihhbnNfYXR0cmliKXsKKwkJaWYgKGFuc19hdHRyaWItPnRvZnJlZSA9PSAxKQorCQl7CisJCQlpZihhbnNfYXR0cmliLT52YWx1ZS5vcy5kYXRhKXsKKwkJCWZyZWUoYW5zX2F0dHJpYi0+dmFsdWUub3MuZGF0YSk7CisJCQlhbnNfYXR0cmliLT52YWx1ZS5vcy5kYXRhID0gTlVMTDsKKwkJCX0KKwkJfQorCQlmcmVlKGFuc19hdHRyaWIpOworCQlhbnNfYXR0cmliID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZGlhbWVhcF91bmxpbmtfYXR0cmlidXRlc19saXN0cygKKwkJc3RydWN0IGRpYW1lYXBfc3RhdGVfbWFjaGluZSAqIGRpYW1lYXBfc20pCit7CisJVFJBQ0VfRU5UUlkoIiVwICIsIGRpYW1lYXBfc20pOworCWlmIChkaWFtZWFwX3NtID09IE5VTEwpCisJeworCQlyZXR1cm4gRUlOVkFMOworCX0KKworCXdoaWxlICghRkRfSVNfTElTVF9FTVBUWSgmZGlhbWVhcF9zbS0+YXR0cmlidXRlcykpCisJeworCQlzdHJ1Y3QgZmRfbGlzdCAqIGl0ZW0gPSAoc3RydWN0IGZkX2xpc3QgKikgZGlhbWVhcF9zbS0+YXR0cmlidXRlcy5uZXh0OworCQlzdHJ1Y3QgYXV0aF9hdHRyaWJ1dGUgKiBhdXRoID0gKHN0cnVjdCBhdXRoX2F0dHJpYnV0ZSAqKSBpdGVtOworCQlmZF9saXN0X3VubGluayhpdGVtKTsKKwkJZnJlZV9hdHRyaWIoYXV0aCk7CisJfQorCisJd2hpbGUgKCFGRF9JU19MSVNUX0VNUFRZKCZkaWFtZWFwX3NtLT5yZXFfYXR0cmlidXRlcykpCisJeworCQlzdHJ1Y3QgZmRfbGlzdCAqIGl0ZW0gPQorCQkJCShzdHJ1Y3QgZmRfbGlzdCAqKSBkaWFtZWFwX3NtLT5yZXFfYXR0cmlidXRlcy5uZXh0OworCQlzdHJ1Y3QgYXZwX2F0dHJpYnV0ZSAqIGF2cCA9IChzdHJ1Y3QgYXZwX2F0dHJpYnV0ZSAqKSBpdGVtOworCQlmZF9saXN0X3VubGluayhpdGVtKTsKKwkJZnJlZV9hdnBfYXR0cmliKGF2cCk7CisJfQorCisJd2hpbGUgKCFGRF9JU19MSVNUX0VNUFRZKCZkaWFtZWFwX3NtLT5hbnNfYXR0cmlidXRlcykpCisJeworCQlzdHJ1Y3QgZmRfbGlzdCAqIGl0ZW0gPQorCQkJCShzdHJ1Y3QgZmRfbGlzdCAqKSBkaWFtZWFwX3NtLT5hbnNfYXR0cmlidXRlcy5uZXh0OworCQlzdHJ1Y3QgYXZwX2F0dHJpYnV0ZSAqIGF2cF9hbnMgPSAoc3RydWN0IGF2cF9hdHRyaWJ1dGUgKikgaXRlbTsKKwkJZmRfbGlzdF91bmxpbmsoaXRlbSk7CisJCWZyZWVfYW5zX2F0dHJpYihhdnBfYW5zKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGlhbWVhcF9mcmVlKHN0cnVjdCBkaWFtZWFwX3N0YXRlX21hY2hpbmUgKiBkaWFtZWFwX3NtKQoreworCisJaWYgKGRpYW1lYXBfc20gIT0gTlVMTCkKKwl7CisJCWlmIChkaWFtZWFwX3NtLT5lYXBfc20udXNlci51c2VyaWQgIT0gTlVMTCkKKwkJeworCQkJZnJlZShkaWFtZWFwX3NtLT5lYXBfc20udXNlci51c2VyaWQpOworCQkJZGlhbWVhcF9zbS0+ZWFwX3NtLnVzZXIudXNlcmlkID0gTlVMTDsKKwkJfQorCisJCWlmIChkaWFtZWFwX3NtLT5lYXBfc20udXNlci5wYXNzd29yZCAhPSBOVUxMKQorCQl7CisJCQlmcmVlKGRpYW1lYXBfc20tPmVhcF9zbS51c2VyLnBhc3N3b3JkKTsKKwkJCWRpYW1lYXBfc20tPmVhcF9zbS51c2VyLnBhc3N3b3JkID0gTlVMTDsKKwkJfQorCisJCWRpYW1lYXBfc20tPmVhcF9zbS5zZWxlY3RlZE1ldGhvZCA9IE5VTEw7CisKKwkJaWYgKGRpYW1lYXBfc20tPmVhcF9zbS5tZXRob2REYXRhICE9IE5VTEwpCisJCXsKKworCQkJc3RydWN0IHBsdWdpbiAqIGNwbHVnaW47CisJCQlpZiAoZGlhbWVhcF9wbHVnaW5fZ2V0KGRpYW1lYXBfc20tPmVhcF9zbS5jdXJyZW50VmVuZG9yLAorCQkJCQlkaWFtZWFwX3NtLT5lYXBfc20uY3VycmVudE1ldGhvZCwgJmNwbHVnaW4pKQorCQkJeworCQkJCVRSQUNFX0RFQlVHKElORk8sIiVzVW5hYmxlIHRvIGFjY2VzcyBFQVAgTWV0aG9kIHBsdWdpbiB7VHlwZT0lZCwgVmVuZG9yPSVkfS4iLERJQU1FQVBfRVhURU5TSU9OLGRpYW1lYXBfc20tPmVhcF9zbS5jdXJyZW50TWV0aG9kLGRpYW1lYXBfc20tPmVhcF9zbS5jdXJyZW50VmVuZG9yKTsKKwkJCX0KKworCQkJaWYgKGNwbHVnaW4tPmVhcF9tZXRob2RfZnJlZSkKKwkJCXsKKwkJCQkoKmNwbHVnaW4tPmVhcF9tZXRob2RfZnJlZSkoZGlhbWVhcF9zbS0+ZWFwX3NtLm1ldGhvZERhdGEpOworCQkJCWRpYW1lYXBfc20tPmVhcF9zbS5tZXRob2REYXRhID0gTlVMTDsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlUUkFDRV9ERUJVRyhJTkZPLCIlc1slcyBwbHVnaW5dIGRhdGFmcmVlIGZ1bmN0aW9uIG5vdCBhdmFpbGFibGUuIixESUFNRUFQX0VYVEVOU0lPTixjcGx1Z2luLT5tZXRob2RuYW1lKTsKKwkJCQlpZiAoZGlhbWVhcF9zbS0+ZWFwX3NtLm1ldGhvZERhdGEgIT0gTlVMTCkKKwkJCQl7CisJCQkJCWZyZWUoZGlhbWVhcF9zbS0+ZWFwX3NtLm1ldGhvZERhdGEpOworCQkJCQlkaWFtZWFwX3NtLT5lYXBfc20ubWV0aG9kRGF0YSA9IE5VTEw7CisJCQkJfQorCQkJfQorCQkJaWYgKGRpYW1lYXBfc20tPmVhcF9zbS5tZXRob2REYXRhKQorCQkJeworCQkJCVRSQUNFX0RFQlVHKElORk8sIiVzU2Vzc2lvbiBzdGF0ZSB3YXMgbm90IGJlZW4gZnJlZWQgY29ycmVjdGx5ISEhIixESUFNRUFQX0VYVEVOU0lPTik7CisJCQl9CisJCX0KKworCQlpZiAoZGlhbWVhcF9zbS0+ZmFpbGVkYXZwICE9IE5VTEwpCisJCXsKKwkJCUNIRUNLX0ZDVF9ETyhmZF9tc2dfZnJlZShkaWFtZWFwX3NtLT5mYWlsZWRhdnApLCApOworCQl9CisKKwkJaWYgKGRpYW1lYXBfc20tPmxhc3RSZXFFQVBhdnAgIT0gTlVMTCkKKwkJeworCQkJQ0hFQ0tfRkNUX0RPKGZkX21zZ19mcmVlKGRpYW1lYXBfc20tPmxhc3RSZXFFQVBhdnApLCApOworCQl9CisKKwkJQ0hFQ0tfRkNUX0RPKGRpYW1lYXBfdW5saW5rX2F0dHJpYnV0ZXNfbGlzdHMoZGlhbWVhcF9zbSksICk7CisKKwkJZnJlZShkaWFtZWFwX3NtKTsKKwkJZGlhbWVhcF9zbSA9IE5VTEw7CisJfQorCit9CisKK3N0YXRpYyBpbnQgZGlhbWVhcF9nZXRfYXZwX2F0dHJpYnV0ZShzdHJ1Y3QgZmRfbGlzdCAqIGF2cF9hdHRyaWJ1dGVzLAorCQljaGFyICogYXR0cmlidXRlLCBzdHJ1Y3QgYXZwX2F0dHJpYnV0ZSAqKiBhdnBfYXR0cmliLCBpbnQgdW5saW5rLAorCQlpbnQgKnJldCkKK3sKKwlUUkFDRV9FTlRSWSgiJXAgJXAgJXAgJWQgJXAiLCBhdnBfYXR0cmlidXRlcywgYXR0cmlidXRlLCBhdnBfYXR0cmliLCB1bmxpbmssIHJldCk7CisJaWYgKGF2cF9hdHRyaWJ1dGVzID09IE5VTEwpCisJeworCQlyZXR1cm4gRUlOVkFMOworCX0KKwlpZiAoYXR0cmlidXRlID09IE5VTEwpCisJeworCQlyZXR1cm4gRUlOVkFMOworCX0KKwlzdHJ1Y3QgZmRfbGlzdCAqIGF0dHJpYjsKKwlmb3IgKGF0dHJpYiA9IGF2cF9hdHRyaWJ1dGVzLT5uZXh0OyBhdHRyaWIgIT0gYXZwX2F0dHJpYnV0ZXM7IGF0dHJpYgorCQkJPSBhdHRyaWItPm5leHQpCisJeworCQkqYXZwX2F0dHJpYiA9IChzdHJ1Y3QgYXZwX2F0dHJpYnV0ZSAqKSBhdHRyaWI7CisJCWlmIChzdHJjbXAoKCphdnBfYXR0cmliKS0+YXR0cmliLCBhdHRyaWJ1dGUpID09IDApCisJCXsKKwkJCSpyZXQgPSAwOworCQkJaWYgKHVubGluayA9PSAxKQorCQkJeworCQkJCWZkX2xpc3RfdW5saW5rKCYoKmF2cF9hdHRyaWIpLT5jaGFpbik7CisJCQl9CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwkqYXZwX2F0dHJpYiA9IE5VTEw7CisJKnJldCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGlhbWVhcF9nZXRfYXV0aF9hdHRyaWJ1dGUoc3RydWN0IGZkX2xpc3QgKiBhdXRoX2F0dHJpYnV0ZXMsCisJCWNoYXIgKiBhdHRyaWJ1dGUsIHN0cnVjdCBhdXRoX2F0dHJpYnV0ZSAqKiBhdXRoX2F0dHJpYiwgaW50IHVubGluaywKKwkJaW50ICpyZXQpCit7CisKKwlUUkFDRV9FTlRSWSgiJXAgJXAgJXAgJWQgJXAiLCBhdXRoX2F0dHJpYnV0ZXMsIGF0dHJpYnV0ZSwgYXV0aF9hdHRyaWIsIHVubGluaywgcmV0KTsKKworCWlmIChhdXRoX2F0dHJpYnV0ZXMgPT0gTlVMTCkKKwl7CisJCXJldHVybiBFSU5WQUw7CisJfQorCWlmIChhdHRyaWJ1dGUgPT0gTlVMTCkKKwl7CisJCXJldHVybiBFSU5WQUw7CisJfQorCisJc3RydWN0IGZkX2xpc3QgKiBhdHRyaWI7CisKKwlmb3IgKGF0dHJpYiA9IGF1dGhfYXR0cmlidXRlcy0+bmV4dDsgYXR0cmliICE9IGF1dGhfYXR0cmlidXRlczsgYXR0cmliCisJCQk9IGF0dHJpYi0+bmV4dCkKKwl7CisJCSphdXRoX2F0dHJpYiA9IChzdHJ1Y3QgYXV0aF9hdHRyaWJ1dGUgKikgYXR0cmliOworCQlpZiAoc3RyY21wKCgqYXV0aF9hdHRyaWIpLT5hdHRyaWIsIGF0dHJpYnV0ZSkgPT0gMCkKKwkJeworCQkJKnJldCA9IDA7CisJCQlpZiAodW5saW5rID09IDEpCisJCQl7CisJCQkJZmRfbGlzdF91bmxpbmsoJigqYXV0aF9hdHRyaWIpLT5jaGFpbik7CisJCQl9CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwkqYXV0aF9hdHRyaWIgPSBOVUxMOworCSpyZXQgPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRpYW1lYXBfZ2V0X2Fuc19hdHRyaWJ1dGUoc3RydWN0IGZkX2xpc3QgKiBhbnNfYXR0cmlidXRlcywKKwkJY2hhciAqIGF0dHJpYnV0ZSwgc3RydWN0IGF2cF9hdHRyaWJ1dGUgKiogYW5zX2F0dHJpYiwgaW50IHVubGluaywKKwkJaW50ICpyZXQpCit7CisJVFJBQ0VfRU5UUlkoIiVwICVwICVwICVkICVwIiwgYW5zX2F0dHJpYnV0ZXMsIGF0dHJpYnV0ZSwgYW5zX2F0dHJpYiwgdW5saW5rLCByZXQpOworCWlmIChhbnNfYXR0cmlidXRlcyA9PSBOVUxMKQorCXsKKwkJcmV0dXJuIEVJTlZBTDsKKwl9CisJaWYgKGF0dHJpYnV0ZSA9PSBOVUxMKQorCXsKKwkJcmV0dXJuIEVJTlZBTDsKKwl9CisJc3RydWN0IGZkX2xpc3QgKiBhdHRyaWI7CisJZm9yIChhdHRyaWIgPSBhbnNfYXR0cmlidXRlcy0+bmV4dDsgYXR0cmliICE9IGFuc19hdHRyaWJ1dGVzOyBhdHRyaWIKKwkJCT0gYXR0cmliLT5uZXh0KQorCXsKKwkJKmFuc19hdHRyaWIgPSAoc3RydWN0IGF2cF9hdHRyaWJ1dGUgKikgYXR0cmliOworCQlpZiAoc3RyY21wKCgqYW5zX2F0dHJpYiktPmF0dHJpYiwgYXR0cmlidXRlKSA9PSAwKQorCQl7CisJCQkqcmV0ID0gMDsKKwkJCWlmICh1bmxpbmsgPT0gMSkKKwkJCXsKKwkJCQlmZF9saXN0X3VubGluaygmKCphbnNfYXR0cmliKS0+Y2hhaW4pOworCQkJfQorCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJKmFuc19hdHRyaWIgPSBOVUxMOworCSpyZXQgPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRpYW1lYXBfYW5zd2VyX2F2cF9hdHRyaWJ1dGVzKAorCQlzdHJ1Y3QgZGlhbWVhcF9zdGF0ZV9tYWNoaW5lICogZGlhbWVhcF9zbSkKK3sKKwlUUkFDRV9FTlRSWSgiJXAiLGRpYW1lYXBfc20pOworCisJaWYgKGRpYW1lYXBfc20gPT0gTlVMTCkKKwl7CisJCXJldHVybiBFSU5WQUw7CisJfQorCWludCByZXQxLCByZXQyOworCXN0cnVjdCBhdnBfYXR0cmlidXRlICogYXZwX2F0dHJpYjsKKwlzdHJ1Y3QgYXZwX2F0dHJpYnV0ZSAqIGFuc19hdHRyaWI7CisJc3RydWN0IGF1dGhfYXR0cmlidXRlICogYXV0aF9hdHRyaWI7CisKKwkvKiBBdXRob3JpemF0aW9uLUxpZmV0aW1lICovCisJeworCQlDSEVDS19GQ1QoZGlhbWVhcF9nZXRfYXZwX2F0dHJpYnV0ZSgmZGlhbWVhcF9zbS0+cmVxX2F0dHJpYnV0ZXMsICJBdXRob3JpemF0aW9uLUxpZmV0aW1lIiwgJmF2cF9hdHRyaWIsMSwgJnJldDEpKTsKKworCQlDSEVDS19GQ1QoZGlhbWVhcF9nZXRfYXV0aF9hdHRyaWJ1dGUoJmRpYW1lYXBfc20tPmF0dHJpYnV0ZXMsICJBdXRob3JpemF0aW9uLUxpZmV0aW1lIiwgJmF1dGhfYXR0cmliLDEsICZyZXQyKSk7CisKKwkJaWYgKChyZXQxID09IDEpICYmIChyZXQyID09IDApICYmIChhdXRoX2F0dHJpYiAhPSBOVUxMKSkKKwkJeworCisJCQlDSEVDS19NQUxMT0MoYW5zX2F0dHJpYiA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGF2cF9hdHRyaWJ1dGUpKSk7CisKKwkJCW1lbXNldChhbnNfYXR0cmliLCAwLCBzaXplb2Yoc3RydWN0IGF2cF9hdHRyaWJ1dGUpKTsKKworCQkJZmRfbGlzdF9pbml0KCZhbnNfYXR0cmliLT5jaGFpbiwgTlVMTCk7CisKKwkJCWFuc19hdHRyaWItPmF0dHJpYiA9ICJBdXRob3JpemF0aW9uLUxpZmV0aW1lIjsKKworCQkJYW5zX2F0dHJpYi0+dmFsdWUudTMyID0gYXRvaShhdXRoX2F0dHJpYi0+dmFsdWUpOworCisJCQlmZF9saXN0X2luc2VydF9iZWZvcmUoJmRpYW1lYXBfc20tPmFuc19hdHRyaWJ1dGVzLAorCQkJCQkmYW5zX2F0dHJpYi0+Y2hhaW4pOworCisJCQlmcmVlX2F0dHJpYihhdXRoX2F0dHJpYik7CisKKwkJfQorCQlpZiAoKHJldDEgPT0gMCkgJiYgKHJldDIgPT0gMSkgJiYgKGF2cF9hdHRyaWIgIT0gTlVMTCkpCisJCXsKKworCQkJQ0hFQ0tfTUFMTE9DKGFuc19hdHRyaWIgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdnBfYXR0cmlidXRlKSkpOworCisJCQltZW1zZXQoYW5zX2F0dHJpYiwgMCwgc2l6ZW9mKHN0cnVjdCBhdnBfYXR0cmlidXRlKSk7CisKKwkJCWZkX2xpc3RfaW5pdCgmYW5zX2F0dHJpYi0+Y2hhaW4sIE5VTEwpOworCisJCQlhbnNfYXR0cmliLT5hdHRyaWIgPSAiQXV0aG9yaXphdGlvbi1MaWZldGltZSI7CisKKwkJCWFuc19hdHRyaWItPnZhbHVlLnUzMiA9IGF2cF9hdHRyaWItPnZhbHVlLnUzMjsKKworCQkJZmRfbGlzdF9pbnNlcnRfYmVmb3JlKCZkaWFtZWFwX3NtLT5hbnNfYXR0cmlidXRlcywKKwkJCQkJJmFuc19hdHRyaWItPmNoYWluKTsKKworCQkJZnJlZV9hdnBfYXR0cmliKGF2cF9hdHRyaWIpOworCisJCX0KKwkJaWYgKChyZXQxID09IDApICYmIChyZXQyID09IDApICYmIChhdXRoX2F0dHJpYiAhPSBOVUxMKSAmJiAoYXZwX2F0dHJpYgorCQkJCSE9IE5VTEwpKQorCQl7CisKKwkJCUNIRUNLX01BTExPQyhhbnNfYXR0cmliID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXZwX2F0dHJpYnV0ZSkpKTsKKworCQkJbWVtc2V0KGFuc19hdHRyaWIsIDAsIHNpemVvZihzdHJ1Y3QgYXZwX2F0dHJpYnV0ZSkpOworCQkJZmRfbGlzdF9pbml0KCZhbnNfYXR0cmliLT5jaGFpbiwgTlVMTCk7CisJCQlhbnNfYXR0cmliLT5hdHRyaWIgPSAiQXV0aG9yaXphdGlvbi1MaWZldGltZSI7CisJCQlpZiAoYXZwX2F0dHJpYi0+dmFsdWUudTMyIDwgYXRvaShhdXRoX2F0dHJpYi0+dmFsdWUpKQorCQkJeworCQkJCWFuc19hdHRyaWItPnZhbHVlLnUzMiA9IGF2cF9hdHRyaWItPnZhbHVlLnUzMjsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlhbnNfYXR0cmliLT52YWx1ZS51MzIgPSBhdG9pKGF1dGhfYXR0cmliLT52YWx1ZSk7CisJCQl9CisJCQlmZF9saXN0X2luc2VydF9iZWZvcmUoJmRpYW1lYXBfc20tPmFuc19hdHRyaWJ1dGVzLAorCQkJCQkmYW5zX2F0dHJpYi0+Y2hhaW4pOworCQkJZnJlZV9hdnBfYXR0cmliKGF2cF9hdHRyaWIpOworCQkJZnJlZV9hdHRyaWIoYXV0aF9hdHRyaWIpOworCQl9CisJfQorCisJLyogQXV0aC1HcmFjZS1QZXJpb2QgKi8KKwl7CisJCUNIRUNLX0ZDVChkaWFtZWFwX2dldF9hdnBfYXR0cmlidXRlKCZkaWFtZWFwX3NtLT5yZXFfYXR0cmlidXRlcywgIkF1dGgtR3JhY2UtUGVyaW9kIiwgJmF2cF9hdHRyaWIsMSwgJnJldDEpKTsKKworCQlDSEVDS19GQ1QoZGlhbWVhcF9nZXRfYXV0aF9hdHRyaWJ1dGUoJmRpYW1lYXBfc20tPmF0dHJpYnV0ZXMsICJBdXRoLUdyYWNlLVBlcmlvZCIsICZhdXRoX2F0dHJpYiwxLCAmcmV0MikpOworCisJCWlmICgocmV0MSA9PSAxKSAmJiAocmV0MiA9PSAwKSAmJiAoYXV0aF9hdHRyaWIgIT0gTlVMTCkpCisJCXsKKwkJCUNIRUNLX01BTExPQyhhbnNfYXR0cmliID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXZwX2F0dHJpYnV0ZSkpKTsKKwkJCW1lbXNldChhbnNfYXR0cmliLCAwLCBzaXplb2Yoc3RydWN0IGF2cF9hdHRyaWJ1dGUpKTsKKwkJCWZkX2xpc3RfaW5pdCgmYW5zX2F0dHJpYi0+Y2hhaW4sIE5VTEwpOworCQkJYW5zX2F0dHJpYi0+YXR0cmliID0gIkF1dGgtR3JhY2UtUGVyaW9kIjsKKwkJCWFuc19hdHRyaWItPnZhbHVlLnUzMiA9IGF0b2koYXV0aF9hdHRyaWItPnZhbHVlKTsKKwkJCWZkX2xpc3RfaW5zZXJ0X2JlZm9yZSgmZGlhbWVhcF9zbS0+YW5zX2F0dHJpYnV0ZXMsCisJCQkJCSZhbnNfYXR0cmliLT5jaGFpbik7CisJCQlmcmVlX2F0dHJpYihhdXRoX2F0dHJpYik7CisJCX0KKwkJaWYgKChyZXQxID09IDApICYmIChyZXQyID09IDEpICYmIChhdnBfYXR0cmliICE9IE5VTEwpKQorCQl7CisJCQlDSEVDS19NQUxMT0MoYW5zX2F0dHJpYiA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGF2cF9hdHRyaWJ1dGUpKSk7CisJCQltZW1zZXQoYW5zX2F0dHJpYiwgMCwgc2l6ZW9mKHN0cnVjdCBhdnBfYXR0cmlidXRlKSk7CisJCQlmZF9saXN0X2luaXQoJmFuc19hdHRyaWItPmNoYWluLCBOVUxMKTsKKwkJCWFuc19hdHRyaWItPmF0dHJpYiA9ICJBdXRoLUdyYWNlLVBlcmlvZCI7CisJCQlhbnNfYXR0cmliLT52YWx1ZS51MzIgPSBhdnBfYXR0cmliLT52YWx1ZS51MzI7CisJCQlmZF9saXN0X2luc2VydF9iZWZvcmUoJmRpYW1lYXBfc20tPmFuc19hdHRyaWJ1dGVzLAorCQkJCQkmYW5zX2F0dHJpYi0+Y2hhaW4pOworCQkJZnJlZV9hdnBfYXR0cmliKGF2cF9hdHRyaWIpOworCQl9CisJCWlmICgocmV0MSA9PSAwKSAmJiAocmV0MiA9PSAwKSAmJiAoYXV0aF9hdHRyaWIgIT0gTlVMTCkgJiYgKGF2cF9hdHRyaWIKKwkJCQkhPSBOVUxMKSkKKwkJeworCQkJQ0hFQ0tfTUFMTE9DKGFuc19hdHRyaWIgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdnBfYXR0cmlidXRlKSkpOworCQkJbWVtc2V0KGFuc19hdHRyaWIsIDAsIHNpemVvZihzdHJ1Y3QgYXZwX2F0dHJpYnV0ZSkpOworCQkJZmRfbGlzdF9pbml0KCZhbnNfYXR0cmliLT5jaGFpbiwgTlVMTCk7CisJCQlhbnNfYXR0cmliLT5hdHRyaWIgPSAiQXV0aC1HcmFjZS1QZXJpb2QiOworCQkJaWYgKGF2cF9hdHRyaWItPnZhbHVlLnUzMiA8IGF0b2koYXV0aF9hdHRyaWItPnZhbHVlKSkKKwkJCXsKKwkJCQlhbnNfYXR0cmliLT52YWx1ZS51MzIgPSBhdnBfYXR0cmliLT52YWx1ZS51MzI7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJYW5zX2F0dHJpYi0+dmFsdWUudTMyID0gYXRvaShhdXRoX2F0dHJpYi0+dmFsdWUpOworCQkJfQorCQkJZmRfbGlzdF9pbnNlcnRfYmVmb3JlKCZkaWFtZWFwX3NtLT5hbnNfYXR0cmlidXRlcywKKwkJCQkJJmFuc19hdHRyaWItPmNoYWluKTsKKwkJCWZyZWVfYXR0cmliKGF1dGhfYXR0cmliKTsKKwkJCWZyZWVfYXZwX2F0dHJpYihhdnBfYXR0cmliKTsKKwkJfQorCX0KKworCS8qIEF1dGgtU2Vzc2lvbi1TdGF0ZSAqLworCXsKKwkJQ0hFQ0tfRkNUKGRpYW1lYXBfZ2V0X2F1dGhfYXR0cmlidXRlKCZkaWFtZWFwX3NtLT5hdHRyaWJ1dGVzLCAiQXV0aC1TZXNzaW9uLVN0YXRlIiwgJmF1dGhfYXR0cmliLDEsICZyZXQyKSk7CisJCWlmICgocmV0MiA9PSAwKSAmJiAoYXV0aF9hdHRyaWIgIT0gTlVMTCkpCisJCXsKKwkJCUNIRUNLX01BTExPQyhhbnNfYXR0cmliID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXZwX2F0dHJpYnV0ZSkpKTsKKwkJCW1lbXNldChhbnNfYXR0cmliLCAwLCBzaXplb2Yoc3RydWN0IGF2cF9hdHRyaWJ1dGUpKTsKKwkJCWZkX2xpc3RfaW5pdCgmYW5zX2F0dHJpYi0+Y2hhaW4sIE5VTEwpOworCQkJYW5zX2F0dHJpYi0+YXR0cmliID0gIkF1dGgtU2Vzc2lvbi1TdGF0ZSI7CisJCQlhbnNfYXR0cmliLT52YWx1ZS5pMzIgPSBhdG9pKGF1dGhfYXR0cmliLT52YWx1ZSk7CisJCQlmZF9saXN0X2luc2VydF9iZWZvcmUoJmRpYW1lYXBfc20tPmFuc19hdHRyaWJ1dGVzLAorCQkJCQkmYW5zX2F0dHJpYi0+Y2hhaW4pOworCQkJZnJlZV9hdHRyaWIoYXV0aF9hdHRyaWIpOworCQl9CisJfQorCisJLyogUmUtQXV0aC1SZXF1ZXN0LVR5cGUgKi8KKwl7CisJCUNIRUNLX0ZDVChkaWFtZWFwX2dldF9hdXRoX2F0dHJpYnV0ZSgmZGlhbWVhcF9zbS0+YXR0cmlidXRlcywgIlJlLUF1dGgtUmVxdWVzdC1UeXBlIiwgJmF1dGhfYXR0cmliLDEsICZyZXQyKSk7CisJCWlmICgocmV0MiA9PSAwKSAmJiAoYXV0aF9hdHRyaWIgIT0gTlVMTCkpCisJCXsKKwkJCUNIRUNLX01BTExPQyhhbnNfYXR0cmliID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXZwX2F0dHJpYnV0ZSkpKTsKKwkJCW1lbXNldChhbnNfYXR0cmliLCAwLCBzaXplb2Yoc3RydWN0IGF2cF9hdHRyaWJ1dGUpKTsKKwkJCWZkX2xpc3RfaW5pdCgmYW5zX2F0dHJpYi0+Y2hhaW4sIE5VTEwpOworCQkJYW5zX2F0dHJpYi0+YXR0cmliID0gIlJlLUF1dGgtUmVxdWVzdC1UeXBlIjsKKwkJCWFuc19hdHRyaWItPnZhbHVlLmkzMiA9IGF0b2koYXV0aF9hdHRyaWItPnZhbHVlKTsKKwkJCWZkX2xpc3RfaW5zZXJ0X2JlZm9yZSgmZGlhbWVhcF9zbS0+YW5zX2F0dHJpYnV0ZXMsCisJCQkJCSZhbnNfYXR0cmliLT5jaGFpbik7CisJCQlmcmVlX2F0dHJpYihhdXRoX2F0dHJpYik7CisJCX0KKwkJZWxzZQorCQl7CisJCQlhbnNfYXR0cmliID0gTlVMTDsKKwkJCUNIRUNLX0ZDVChkaWFtZWFwX2dldF9hbnNfYXR0cmlidXRlKCZkaWFtZWFwX3NtLT5hbnNfYXR0cmlidXRlcywgIkF1dGhvcml6YXRpb24tTGlmZXRpbWUiLCAmYW5zX2F0dHJpYiwwLCAmcmV0MSkpOworCQkJaWYgKChyZXQxID09IDApICYmIChhbnNfYXR0cmliICE9IE5VTEwpKQorCQkJeworCQkJCUNIRUNLX01BTExPQyhhbnNfYXR0cmliID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXZwX2F0dHJpYnV0ZSkpKTsKKwkJCQltZW1zZXQoYW5zX2F0dHJpYiwgMCwgc2l6ZW9mKHN0cnVjdCBhdnBfYXR0cmlidXRlKSk7CisJCQkJZmRfbGlzdF9pbml0KCZhbnNfYXR0cmliLT5jaGFpbiwgTlVMTCk7CisJCQkJYW5zX2F0dHJpYi0+YXR0cmliID0gIlJlLUF1dGgtUmVxdWVzdC1UeXBlIjsKKwkJCQlhbnNfYXR0cmliLT52YWx1ZS5pMzIgPSAwOworCQkJCWZkX2xpc3RfaW5zZXJ0X2JlZm9yZSgmZGlhbWVhcF9zbS0+YW5zX2F0dHJpYnV0ZXMsCisJCQkJCQkmYW5zX2F0dHJpYi0+Y2hhaW4pOworCQkJfQorCQl9CisJfQorCisJLyogU2Vzc2lvbi1UaW1lb3V0ICovCisJeworCQlDSEVDS19GQ1QoZGlhbWVhcF9nZXRfYXV0aF9hdHRyaWJ1dGUoJmRpYW1lYXBfc20tPmF0dHJpYnV0ZXMsICJTZXNzaW9uLVRpbWVvdXQiLCAmYXV0aF9hdHRyaWIsMSwgJnJldDIpKTsKKwkJaWYgKChyZXQyID09IDApICYmIChhdXRoX2F0dHJpYiAhPSBOVUxMKSkKKwkJeworCQkJQ0hFQ0tfTUFMTE9DKGFuc19hdHRyaWIgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdnBfYXR0cmlidXRlKSkpOworCQkJbWVtc2V0KGFuc19hdHRyaWIsIDAsIHNpemVvZihzdHJ1Y3QgYXZwX2F0dHJpYnV0ZSkpOworCQkJZmRfbGlzdF9pbml0KCZhbnNfYXR0cmliLT5jaGFpbiwgTlVMTCk7CisJCQlhbnNfYXR0cmliLT5hdHRyaWIgPSAiU2Vzc2lvbi1UaW1lb3V0IjsKKwkJCWFuc19hdHRyaWItPnZhbHVlLnUzMiA9IGF0b2koYXV0aF9hdHRyaWItPnZhbHVlKTsKKwkJCWZkX2xpc3RfaW5zZXJ0X2JlZm9yZSgmZGlhbWVhcF9zbS0+YW5zX2F0dHJpYnV0ZXMsCisJCQkJCSZhbnNfYXR0cmliLT5jaGFpbik7CisJCQlmcmVlX2F0dHJpYihhdXRoX2F0dHJpYik7CisJCX0KKwl9CisKKwkvKiBNdWx0aS1Sb3VuZC1UaW1lLU91dCAqLworCXsKKwkJQ0hFQ0tfRkNUKGRpYW1lYXBfZ2V0X2F1dGhfYXR0cmlidXRlKCZkaWFtZWFwX3NtLT5hdHRyaWJ1dGVzLCAiTXVsdGktUm91bmQtVGltZS1PdXQiLCAmYXV0aF9hdHRyaWIsMSwgJnJldDIpKTsKKwkJaWYgKChyZXQyID09IDApICYmIChhdXRoX2F0dHJpYiAhPSBOVUxMKSkKKwkJeworCQkJQ0hFQ0tfTUFMTE9DKGFuc19hdHRyaWIgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdnBfYXR0cmlidXRlKSkpOworCQkJbWVtc2V0KGFuc19hdHRyaWIsIDAsIHNpemVvZihzdHJ1Y3QgYXZwX2F0dHJpYnV0ZSkpOworCQkJZmRfbGlzdF9pbml0KCZhbnNfYXR0cmliLT5jaGFpbiwgTlVMTCk7CisJCQlhbnNfYXR0cmliLT5hdHRyaWIgPSAiTXVsdGktUm91bmQtVGltZS1PdXQiOworCQkJYW5zX2F0dHJpYi0+dmFsdWUudTMyID0gYXRvaShhdXRoX2F0dHJpYi0+dmFsdWUpOworCQkJZmRfbGlzdF9pbnNlcnRfYmVmb3JlKCZkaWFtZWFwX3NtLT5hbnNfYXR0cmlidXRlcywKKwkJCQkJJmFuc19hdHRyaWItPmNoYWluKTsKKwkJCWZyZWVfYXR0cmliKGF1dGhfYXR0cmliKTsKKwkJfQorCX0KKworCS8qIEFjY3QtSW50ZXJpbS1JbnRlcnZhbCAqLworCXsKKwkJQ0hFQ0tfRkNUKGRpYW1lYXBfZ2V0X2F1dGhfYXR0cmlidXRlKCZkaWFtZWFwX3NtLT5hdHRyaWJ1dGVzLCAiQWNjdC1JbnRlcmltLUludGVydmFsIiwgJmF1dGhfYXR0cmliLDEsICZyZXQyKSk7CisJCWlmICgocmV0MiA9PSAwKSAmJiAoYXV0aF9hdHRyaWIgIT0gTlVMTCkpCisJCXsKKwkJCUNIRUNLX01BTExPQyhhbnNfYXR0cmliID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXZwX2F0dHJpYnV0ZSkpKTsKKwkJCW1lbXNldChhbnNfYXR0cmliLCAwLCBzaXplb2Yoc3RydWN0IGF2cF9hdHRyaWJ1dGUpKTsKKwkJCWZkX2xpc3RfaW5pdCgmYW5zX2F0dHJpYi0+Y2hhaW4sIE5VTEwpOworCQkJYW5zX2F0dHJpYi0+YXR0cmliID0gIkFjY3QtSW50ZXJpbS1JbnRlcnZhbCI7CisJCQlhbnNfYXR0cmliLT52YWx1ZS51MzIgPSBhdG9pKGF1dGhfYXR0cmliLT52YWx1ZSk7CisJCQlmZF9saXN0X2luc2VydF9iZWZvcmUoJmRpYW1lYXBfc20tPmFuc19hdHRyaWJ1dGVzLAorCQkJCQkmYW5zX2F0dHJpYi0+Y2hhaW4pOworCQkJZnJlZV9hdHRyaWIoYXV0aF9hdHRyaWIpOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUJRElBTUVBUF9TVFIJMQorI2RlZmluZQlESUFNRUFQX05VTQkyCisKKyNkZWZpbmUgRElBTUVBUF9PUF9OTwkwCS8vTm90IHN1cHBvcnRlZCBvcGVyYXRvcgorI2RlZmluZQlESUFNRUFQX09QX0VRCTEJLy89PQorI2RlZmluZQlESUFNRUFQX09QX0dUCTIJLy8+CisjZGVmaW5lCURJQU1FQVBfT1BfTFQJMwkvLzwKKyNkZWZpbmUJRElBTUVBUF9PUF9HRQk0CS8vPj0KKyNkZWZpbmUJRElBTUVBUF9PUF9MRQk1CS8vPD0KKyNkZWZpbmUJRElBTUVBUF9PUF9ORQk2CS8vIT0KKyNkZWZpbmUJRElBTUVBUF9PUF9FWAk3CS8vfj0KKyNkZWZpbmUgRVEoQSxCKSBBPT1CID8gVFJVRSA6IEZBTFNFCisjZGVmaW5lIEdUKEEsQikgQT5CID8gVFJVRSA6IEZBTFNFCisjZGVmaW5lIEdFKEEsQikgQT49QiA/IFRSVUUgOiBGQUxTRQorI2RlZmluZSBMVChBLEIpIEE8QiA/IFRSVUUgOiBGQUxTRQorI2RlZmluZSBMRShBLEIpIEE8PUIgPyBUUlVFIDogRkFMU0UKKyNkZWZpbmUgTkUoQSxCKSBBIT1CID8gVFJVRSA6IEZBTFNFCisKK2ludCBkaWFtZWFwX2dldF9vcGVyYXRvcihjaGFyICpvcGVyYXRvcikKK3sKKwlUUkFDRV9FTlRSWSgiJXAiLG9wZXJhdG9yKTsKKwlpZiAoc3RyY21wKG9wZXJhdG9yLCAiPT0iKSA9PSAwKQorCXsKKwkJcmV0dXJuIERJQU1FQVBfT1BfRVE7CisJfQorCWlmIChzdHJjbXAob3BlcmF0b3IsICI+IikgPT0gMCkKKwl7CisJCXJldHVybiBESUFNRUFQX09QX0dUOworCX0KKwlpZiAoc3RyY21wKG9wZXJhdG9yLCAiPCIpID09IDApCisJeworCQlyZXR1cm4gRElBTUVBUF9PUF9MVDsKKwl9CisJaWYgKHN0cmNtcChvcGVyYXRvciwgIj49IikgPT0gMCkKKwl7CisJCXJldHVybiBESUFNRUFQX09QX0dFOworCX0KKwlpZiAoc3RyY21wKG9wZXJhdG9yLCAiPD0iKSA9PSAwKQorCXsKKwkJcmV0dXJuIERJQU1FQVBfT1BfTEU7CisJfQorCWlmIChzdHJjbXAob3BlcmF0b3IsICIhPSIpID09IDApCisJeworCQlyZXR1cm4gRElBTUVBUF9PUF9ORTsKKwl9CisJaWYgKHN0cmNtcChvcGVyYXRvciwgIn49IikgPT0gMCkKKwl7CisJCXJldHVybiBESUFNRUFQX09QX0VYOworCX0KKwlyZXR1cm4gRElBTUVBUF9PUF9OTzsKK30KKworYm9vbGVhbiBpc19vcGVyYXRvcihpbnQgZm9ybWF0X3R5cGUsIGNoYXIgKiBvcGVyYXRvcikKK3sKKwlUUkFDRV9FTlRSWSgiJWQgJXAiLGZvcm1hdF90eXBlLG9wZXJhdG9yKTsKKwlpZiAoKGZvcm1hdF90eXBlID09IERJQU1FQVBfU1RSKSAmJiAoc3RyY21wKG9wZXJhdG9yLCAiPT0iKSA9PSAwIHx8IHN0cmNtcCgKKwkJCW9wZXJhdG9yLCAifj0iKSA9PSAwIHx8IHN0cmNtcChvcGVyYXRvciwgIiE9IikgPT0gMCkpCisJeworCQlyZXR1cm4gVFJVRTsKKwl9CisJaWYgKChmb3JtYXRfdHlwZSA9PSBESUFNRUFQX05VTSkgJiYgKHN0cmNtcChvcGVyYXRvciwgIn49IikgIT0gMCkpCisJeworCQlyZXR1cm4gVFJVRTsKKwl9CisJcmV0dXJuIEZBTFNFOworfQorCit1bmlvbiBhdnBfdmFsdWUgZGlhbWVhcF9nZXRfbnVtKGNoYXIgKiBudW0sIGVudW0gZGljdF9hdnBfYmFzZXR5cGUgZGF0YXR5cGUpCit7CisJVFJBQ0VfRU5UUlkoIiVwICVkIixudW0sZGF0YXR5cGUpOworCXVuaW9uIGF2cF92YWx1ZSB2YWw7CisJc3dpdGNoIChkYXRhdHlwZSkKKwl7CisJY2FzZSBBVlBfVFlQRV9JTlRFR0VSMzI6Ly9pMzIKKwkJdmFsLmkzMiA9IGF0b2kobnVtKTsKKwkJYnJlYWs7CisJY2FzZSBBVlBfVFlQRV9JTlRFR0VSNjQ6Ly9pNjQKKwkJdmFsLmk2NCA9IGF0b2xsKG51bSk7CisJCWJyZWFrOworCWNhc2UgQVZQX1RZUEVfVU5TSUdORUQzMjovL3UzMgorCQl2YWwudTMyID0gc3RydG91bChudW0sIE5VTEwsIDEwKTsKKwkJYnJlYWs7CisJY2FzZSBBVlBfVFlQRV9VTlNJR05FRDY0Oi8vdTY0CisJCXZhbC51NjQgPSBzdHJ0b3VsbChudW0sIE5VTEwsIDEwKTsKKwkJYnJlYWs7CisJY2FzZSBBVlBfVFlQRV9GTE9BVDMyOi8vZjMyCisJCXZhbC5mMzIgPSBhdG9mKG51bSk7CisJCWJyZWFrOworCWNhc2UgQVZQX1RZUEVfRkxPQVQ2NDovL2Y2NAorCQl2YWwuZjY0ID0gc3RydG9kKG51bSwgTlVMTCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVRSQUNFX0RFQlVHKElORk8sICIlc1Vua25vd24gQVZQIEJhc2UgVHlwZS4iLERJQU1FQVBfRVhURU5TSU9OKQorCQk7CisJfQorCXJldHVybiB2YWw7Cit9CisKK2Jvb2xlYW4gZGlhbWVhcF9jaGVjayh1bmlvbiBhdnBfdmFsdWUgKkEsIGNoYXIgKiBCLCBjaGFyICogb3BlcmF0b3IsCisJCWVudW0gZGljdF9hdnBfYmFzZXR5cGUgZGF0YXR5cGUpCit7CisJVFJBQ0VfRU5UUlkoIiVwICVwICVwICVkIixBLEIsb3BlcmF0b3IsZGF0YXR5cGUpOworCWlmICgoKGRhdGF0eXBlID09IEFWUF9UWVBFX09DVEVUU1RSSU5HKSAmJiAoaXNfb3BlcmF0b3IoRElBTUVBUF9TVFIsCisJCQlvcGVyYXRvcikgPT0gVFJVRSkpIHx8ICgoZGF0YXR5cGUgIT0gQVZQX1RZUEVfT0NURVRTVFJJTkcpCisJCQkmJiAoZGF0YXR5cGUgIT0gQVZQX1RZUEVfR1JPVVBFRCkgJiYgKGlzX29wZXJhdG9yKERJQU1FQVBfTlVNLAorCQkJb3BlcmF0b3IpID09IFRSVUUpKSkKKwl7CisJCXN3aXRjaCAoZGlhbWVhcF9nZXRfb3BlcmF0b3Iob3BlcmF0b3IpKQorCQl7CisJCWNhc2UgRElBTUVBUF9PUF9FUToKKwkJCWlmICgoZGF0YXR5cGUgPT0gQVZQX1RZUEVfT0NURVRTVFJJTkcpICYmIChpc19vcGVyYXRvcihESUFNRUFQX1NUUiwKKwkJCQkJb3BlcmF0b3IpID09IFRSVUUpKQorCQkJeworCQkJCWlmIChzdHJjbXAoKGNoYXIgKilBLT5vcy5kYXRhLCBCKSA9PSAwKQorCQkJCQlyZXR1cm4gVFJVRTsKKwkJCQllbHNlCisJCQkJCXJldHVybiBGQUxTRTsKKwkJCX0KKwkJCWVsc2UgaWYgKChkYXRhdHlwZSAhPSBBVlBfVFlQRV9PQ1RFVFNUUklORykgJiYgKGRhdGF0eXBlCisJCQkJCSE9IEFWUF9UWVBFX0dST1VQRUQpICYmIChpc19vcGVyYXRvcihESUFNRUFQX05VTSwgb3BlcmF0b3IpCisJCQkJCT09IFRSVUUpKQorCQkJeworCisJCQkJc3dpdGNoIChkYXRhdHlwZSkKKwkJCQl7CisJCQkJY2FzZSBBVlBfVFlQRV9JTlRFR0VSMzI6Ly9pMzIKKwkJCQkJcmV0dXJuIEVRKEEtPmkzMixkaWFtZWFwX2dldF9udW0oQiwgZGF0YXR5cGUpLmkzMik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQVZQX1RZUEVfSU5URUdFUjY0Oi8vaTY0CisJCQkJCXJldHVybiBFUShBLT5pNjQsZGlhbWVhcF9nZXRfbnVtKEIsIGRhdGF0eXBlKS5pNjQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEFWUF9UWVBFX1VOU0lHTkVEMzI6Ly91MzIKKwkJCQkJcmV0dXJuIEVRKEEtPnUzMixkaWFtZWFwX2dldF9udW0oQiwgZGF0YXR5cGUpLnUzMik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQVZQX1RZUEVfVU5TSUdORUQ2NDovL3U2NAorCQkJCQlyZXR1cm4gRVEoQS0+dTY0LGRpYW1lYXBfZ2V0X251bShCLCBkYXRhdHlwZSkudTY0KTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBBVlBfVFlQRV9GTE9BVDMyOi8vZjMyCisJCQkJCXJldHVybiBFUShBLT5mMzIsZGlhbWVhcF9nZXRfbnVtKEIsIGRhdGF0eXBlKS5mMzIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEFWUF9UWVBFX0ZMT0FUNjQ6Ly9mNjQKKwkJCQkJcmV0dXJuIEVRKEEtPmY2NCxkaWFtZWFwX2dldF9udW0oQiwgZGF0YXR5cGUpLmY2NCk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCXJldHVybiBGQUxTRTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcmV0dXJuIEZBTFNFOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgRElBTUVBUF9PUF9FWDoKKwkJeworCQkJLy9zdHJpbmcgb25seQorCQkJYm9vbGVhbiBhdXRob3JpemVkID0gRkFMU0U7CisJCQlpZiAoKGRhdGF0eXBlID09IEFWUF9UWVBFX09DVEVUU1RSSU5HKSAmJiAoaXNfb3BlcmF0b3IoRElBTUVBUF9TVFIsCisJCQkJCW9wZXJhdG9yKSA9PSBUUlVFKSkKKwkJCXsKKwkJCQlyZWdleF90IHJ1bGVfcmVnZXhwOworCQkJCXJlZ2NvbXAoJnJ1bGVfcmVnZXhwLCBCLCBSRUdfRVhURU5ERUQgfCBSRUdfTk9TVUIgfCBSRUdfSUNBU0UpOworCQkJCWlmIChyZWdleGVjKCZydWxlX3JlZ2V4cCwgKGNoYXIgKilBLT5vcy5kYXRhLCAwLCBOVUxMLCAwKSAhPSAwKQorCQkJCXsKKwkJCQkJYXV0aG9yaXplZCA9IEZBTFNFOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlhdXRob3JpemVkID0gVFJVRTsKKwkJCQl9CisJCQkJcmVnZnJlZSgmcnVsZV9yZWdleHApOworCQkJfQorCQkJcmV0dXJuIGF1dGhvcml6ZWQ7CisJCX0KKwkJY2FzZSBESUFNRUFQX09QX0dUOgorCisJCQlpZiAoKGRhdGF0eXBlICE9IEFWUF9UWVBFX09DVEVUU1RSSU5HKSAmJiAoZGF0YXR5cGUKKwkJCQkJIT0gQVZQX1RZUEVfR1JPVVBFRCkgJiYgKGlzX29wZXJhdG9yKERJQU1FQVBfTlVNLCBvcGVyYXRvcikKKwkJCQkJPT0gVFJVRSkpCisJCQl7CisJCQkJc3dpdGNoIChkYXRhdHlwZSkKKwkJCQl7CisJCQkJY2FzZSBBVlBfVFlQRV9JTlRFR0VSMzI6Ly9pMzIKKwkJCQkJcmV0dXJuIEdUKEEtPmkzMiwgZGlhbWVhcF9nZXRfbnVtKEIsIGRhdGF0eXBlKS5pMzIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEFWUF9UWVBFX0lOVEVHRVI2NDovL2k2NAorCQkJCQlyZXR1cm4gR1QoQS0+aTY0LCBkaWFtZWFwX2dldF9udW0oQiwgZGF0YXR5cGUpLmk2NCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQVZQX1RZUEVfVU5TSUdORUQzMjovL3UzMgorCQkJCQlyZXR1cm4gR1QoQS0+dTMyLCBkaWFtZWFwX2dldF9udW0oQiwgZGF0YXR5cGUpLnUzMik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQVZQX1RZUEVfVU5TSUdORUQ2NDovL3U2NAorCQkJCQlyZXR1cm4gR1QoQS0+dTY0LCBkaWFtZWFwX2dldF9udW0oQiwgZGF0YXR5cGUpLnU2NCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQVZQX1RZUEVfRkxPQVQzMjovL2YzMgorCQkJCQlyZXR1cm4gR1QoQS0+ZjMyLCBkaWFtZWFwX2dldF9udW0oQiwgZGF0YXR5cGUpLmYzMik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQVZQX1RZUEVfRkxPQVQ2NDovL2Y2NAorCQkJCQlyZXR1cm4gR1QoQS0+ZjY0LCBkaWFtZWFwX2dldF9udW0oQiwgZGF0YXR5cGUpLmY2NCk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCXJldHVybiBGQUxTRTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcmV0dXJuIEZBTFNFOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgRElBTUVBUF9PUF9HRToKKwkJCWlmICgoZGF0YXR5cGUgIT0gQVZQX1RZUEVfT0NURVRTVFJJTkcpICYmIChkYXRhdHlwZQorCQkJCQkhPSBBVlBfVFlQRV9HUk9VUEVEKSAmJiAoaXNfb3BlcmF0b3IoRElBTUVBUF9OVU0sIG9wZXJhdG9yKQorCQkJCQk9PSBUUlVFKSkKKwkJCXsKKwkJCQlzd2l0Y2ggKGRhdGF0eXBlKQorCQkJCXsKKwkJCQljYXNlIEFWUF9UWVBFX0lOVEVHRVIzMjovL2kzMgorCQkJCQlyZXR1cm4gR0UoQS0+aTMyLGRpYW1lYXBfZ2V0X251bShCLCBkYXRhdHlwZSkuaTMyKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBBVlBfVFlQRV9JTlRFR0VSNjQ6Ly9pNjQKKwkJCQkJcmV0dXJuIEdFKEEtPmk2NCxkaWFtZWFwX2dldF9udW0oQiwgZGF0YXR5cGUpLmk2NCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQVZQX1RZUEVfVU5TSUdORUQzMjovL3UzMgorCQkJCQlyZXR1cm4gR0UoQS0+dTMyLGRpYW1lYXBfZ2V0X251bShCLCBkYXRhdHlwZSkudTMyKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBBVlBfVFlQRV9VTlNJR05FRDY0Oi8vdTY0CisJCQkJCXJldHVybiBHRShBLT51NjQsZGlhbWVhcF9nZXRfbnVtKEIsIGRhdGF0eXBlKS51NjQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEFWUF9UWVBFX0ZMT0FUMzI6Ly9mMzIKKwkJCQkJcmV0dXJuIEdFKEEtPmYzMixkaWFtZWFwX2dldF9udW0oQiwgZGF0YXR5cGUpLmYzMik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQVZQX1RZUEVfRkxPQVQ2NDovL2Y2NAorCQkJCQlyZXR1cm4gR0UoQS0+ZjY0LGRpYW1lYXBfZ2V0X251bShCLCBkYXRhdHlwZSkuZjY0KTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJcmV0dXJuIEZBTFNFOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBESUFNRUFQX09QX0xUOgorCQkJaWYgKChkYXRhdHlwZSAhPSBBVlBfVFlQRV9PQ1RFVFNUUklORykgJiYgKGRhdGF0eXBlCisJCQkJCSE9IEFWUF9UWVBFX0dST1VQRUQpICYmIChpc19vcGVyYXRvcihESUFNRUFQX05VTSwgb3BlcmF0b3IpCisJCQkJCT09IFRSVUUpKQorCQkJeworCQkJCXN3aXRjaCAoZGF0YXR5cGUpCisJCQkJeworCQkJCWNhc2UgQVZQX1RZUEVfSU5URUdFUjMyOi8vaTMyCisJCQkJCXJldHVybiBMVChBLT5pMzIsIGRpYW1lYXBfZ2V0X251bShCLCBkYXRhdHlwZSkuaTMyKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBBVlBfVFlQRV9JTlRFR0VSNjQ6Ly9pNjQKKwkJCQkJcmV0dXJuIExUKEEtPmk2NCwgZGlhbWVhcF9nZXRfbnVtKEIsIGRhdGF0eXBlKS5pNjQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEFWUF9UWVBFX1VOU0lHTkVEMzI6Ly91MzIKKwkJCQkJcmV0dXJuIExUKEEtPnUzMiwgZGlhbWVhcF9nZXRfbnVtKEIsIGRhdGF0eXBlKS51MzIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEFWUF9UWVBFX1VOU0lHTkVENjQ6Ly91NjQKKwkJCQkJcmV0dXJuIExUKEEtPnU2NCwgZGlhbWVhcF9nZXRfbnVtKEIsIGRhdGF0eXBlKS51NjQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEFWUF9UWVBFX0ZMT0FUMzI6Ly9mMzIKKwkJCQkJcmV0dXJuIExUKEEtPmYzMiwgZGlhbWVhcF9nZXRfbnVtKEIsIGRhdGF0eXBlKS5mMzIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEFWUF9UWVBFX0ZMT0FUNjQ6Ly9mNjQKKwkJCQkJcmV0dXJuIExUKEEtPmY2NCwgZGlhbWVhcF9nZXRfbnVtKEIsIGRhdGF0eXBlKS5mNjQpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlyZXR1cm4gRkFMU0U7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXJldHVybiBGQUxTRTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIERJQU1FQVBfT1BfTEU6CisJCQlpZiAoKGRhdGF0eXBlICE9IEFWUF9UWVBFX09DVEVUU1RSSU5HKSAmJiAoZGF0YXR5cGUKKwkJCQkJIT0gQVZQX1RZUEVfR1JPVVBFRCkgJiYgKGlzX29wZXJhdG9yKERJQU1FQVBfTlVNLCBvcGVyYXRvcikKKwkJCQkJPT0gVFJVRSkpCisJCQl7CisJCQkJc3dpdGNoIChkYXRhdHlwZSkKKwkJCQl7CisJCQkJY2FzZSBBVlBfVFlQRV9JTlRFR0VSMzI6Ly9pMzIKKwkJCQkJcmV0dXJuIExFKEEtPmkzMiwgZGlhbWVhcF9nZXRfbnVtKEIsIGRhdGF0eXBlKS5pMzIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEFWUF9UWVBFX0lOVEVHRVI2NDovL2k2NAorCQkJCQlyZXR1cm4gTEUoQS0+aTY0LCBkaWFtZWFwX2dldF9udW0oQiwgZGF0YXR5cGUpLmk2NCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQVZQX1RZUEVfVU5TSUdORUQzMjovL3UzMgorCQkJCQlyZXR1cm4gTEUoQS0+dTMyLCBkaWFtZWFwX2dldF9udW0oQiwgZGF0YXR5cGUpLnUzMik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQVZQX1RZUEVfVU5TSUdORUQ2NDovL3U2NAorCQkJCQlyZXR1cm4gTEUoQS0+dTY0LCBkaWFtZWFwX2dldF9udW0oQiwgZGF0YXR5cGUpLnU2NCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQVZQX1RZUEVfRkxPQVQzMjovL2YzMgorCQkJCQlyZXR1cm4gTEUoQS0+ZjMyLCBkaWFtZWFwX2dldF9udW0oQiwgZGF0YXR5cGUpLmYzMik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQVZQX1RZUEVfRkxPQVQ2NDovL2Y2NAorCQkJCQlyZXR1cm4gTEUoQS0+ZjY0LCBkaWFtZWFwX2dldF9udW0oQiwgZGF0YXR5cGUpLmY2NCk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCXJldHVybiBGQUxTRTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcmV0dXJuIEZBTFNFOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgRElBTUVBUF9PUF9ORToKKwkJCWlmICgoZGF0YXR5cGUgPT0gQVZQX1RZUEVfT0NURVRTVFJJTkcpICYmIChpc19vcGVyYXRvcihESUFNRUFQX1NUUiwKKwkJCQkJb3BlcmF0b3IpID09IFRSVUUpKQorCQkJeworCQkJCWlmIChzdHJjbXAoKGNoYXIgKilBLT5vcy5kYXRhLCBCKSAhPSAwKQorCQkJCQlyZXR1cm4gVFJVRTsKKwkJCQllbHNlCisJCQkJCXJldHVybiBGQUxTRTsKKwkJCX0KKwkJCWVsc2UgaWYgKChkYXRhdHlwZSAhPSBBVlBfVFlQRV9PQ1RFVFNUUklORykgJiYgKGRhdGF0eXBlCisJCQkJCSE9IEFWUF9UWVBFX0dST1VQRUQpICYmIChpc19vcGVyYXRvcihESUFNRUFQX05VTSwgb3BlcmF0b3IpCisJCQkJCT09IFRSVUUpKQorCQkJeworCQkJCXN3aXRjaCAoZGF0YXR5cGUpCisJCQkJeworCQkJCWNhc2UgQVZQX1RZUEVfSU5URUdFUjMyOi8vaTMyCisJCQkJCXJldHVybiBORShBLT5pMzIsIGRpYW1lYXBfZ2V0X251bShCLCBkYXRhdHlwZSkuaTMyKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBBVlBfVFlQRV9JTlRFR0VSNjQ6Ly9pNjQKKwkJCQkJcmV0dXJuIE5FKEEtPmk2NCwgZGlhbWVhcF9nZXRfbnVtKEIsIGRhdGF0eXBlKS5pNjQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEFWUF9UWVBFX1VOU0lHTkVEMzI6Ly91MzIKKwkJCQkJcmV0dXJuIE5FKEEtPnUzMiwgZGlhbWVhcF9nZXRfbnVtKEIsIGRhdGF0eXBlKS51MzIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEFWUF9UWVBFX1VOU0lHTkVENjQ6Ly91NjQKKwkJCQkJcmV0dXJuIE5FKEEtPnU2NCwgZGlhbWVhcF9nZXRfbnVtKEIsIGRhdGF0eXBlKS51NjQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEFWUF9UWVBFX0ZMT0FUMzI6Ly9mMzIKKwkJCQkJcmV0dXJuIE5FKEEtPmYzMiwgZGlhbWVhcF9nZXRfbnVtKEIsIGRhdGF0eXBlKS5mMzIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEFWUF9UWVBFX0ZMT0FUNjQ6Ly9mNjQKKwkJCQkJcmV0dXJuIE5FKEEtPmY2NCwgZGlhbWVhcF9nZXRfbnVtKEIsIGRhdGF0eXBlKS5mNjQpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlyZXR1cm4gRkFMU0U7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXJldHVybiBGQUxTRTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiBGQUxTRTsKK30KKworY2hhciAqIGRpYW1lYXBfYXR0cmlidXRlX29wZXJhdG9yKGNoYXIgKiBvcCwgaW50ICogdG9hZGQsIGJvb2xlYW4gKmlzcnVsZSkKK3sKKwlUUkFDRV9FTlRSWSgiJXAgJXAgJXAiLG9wLHRvYWRkLGlzcnVsZSk7CisJY2hhciAqIGF0dHJpYnV0ZV9vcDsKKworCWlmIChvcFswXSA9PSAnKycpCisJeworCQkqdG9hZGQgPSAxOworCX0KKwllbHNlIGlmIChvcFtzdHJsZW4ob3ApIC0gMV0gPT0gJysnKQorCXsKKwkJKnRvYWRkID0gMjsKKwl9CisJZWxzZQorCXsKKwkJKnRvYWRkID0gMDsKKwl9CisKKwlzd2l0Y2ggKCp0b2FkZCkKKwl7CisJY2FzZSAxOgorCQlhdHRyaWJ1dGVfb3AgPSBtYWxsb2Moc3RybGVuKG9wKSk7CisJCW1lbXNldChhdHRyaWJ1dGVfb3AsIDAsIHN0cmxlbihvcCkpOworCQlzdHJuY3B5KGF0dHJpYnV0ZV9vcCwgb3AgKyAxLCBzdHJsZW4ob3ApIC0gMSk7CisJCWF0dHJpYnV0ZV9vcFtzdHJsZW4ob3ApXSA9ICdcMCc7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJYXR0cmlidXRlX29wID0gbWFsbG9jKHN0cmxlbihvcCkpOworCQltZW1zZXQoYXR0cmlidXRlX29wLCAwLCBzdHJsZW4ob3ApKTsKKwkJc3RybmNweShhdHRyaWJ1dGVfb3AsIG9wLCBzdHJsZW4ob3ApIC0gMSk7CisJCWF0dHJpYnV0ZV9vcFtzdHJsZW4ob3ApXSA9ICdcMCc7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWF0dHJpYnV0ZV9vcCA9IG1hbGxvYyhzdHJsZW4ob3ApICsgMSk7CisJCW1lbXNldChhdHRyaWJ1dGVfb3AsIDAsIHN0cmxlbihvcCkgKyAxKTsKKwkJc3RyY3B5KGF0dHJpYnV0ZV9vcCwgb3ApOworCQlhdHRyaWJ1dGVfb3Bbc3RybGVuKG9wKSArIDFdID0gJ1wwJzsKKwl9CisJaWYgKHN0cmNtcChhdHRyaWJ1dGVfb3AsICI9IikgPT0gMCkKKwl7CisJCSppc3J1bGUgPSBGQUxTRTsKKwkJKnRvYWRkID0gMjsKKwl9CisJZWxzZQorCXsKKwkJKmlzcnVsZSA9IFRSVUU7CisJfQorCisJcmV0dXJuIGF0dHJpYnV0ZV9vcDsKK30KKworaW50IGRpYW1lYXBfYW5zd2VyX3NldF9hdHRyaWJ1dGVfdmFsdWVBKHVuaW9uIGF2cF92YWx1ZSAqQSwgaW50ICp0b2ZyZWUsCisJCWVudW0gZGljdF9hdnBfYmFzZXR5cGUgZGF0YXR5cGUsIHVuaW9uIGF2cF92YWx1ZSAqIHJ2YWwpCit7CisJVFJBQ0VfRU5UUlkoIiVwICVwICVkICVwIixBLHRvZnJlZSxkYXRhdHlwZSxydmFsKTsKKwlpZiAoZGF0YXR5cGUgPT0gQVZQX1RZUEVfT0NURVRTVFJJTkcpCisJeworCQlDSEVDS19NQUxMT0MocnZhbC0+b3MuZGF0YT1tYWxsb2MoQS0+b3MubGVuKSk7CisJCW1lbWNweShydmFsLT5vcy5kYXRhLEEtPm9zLmRhdGEsQS0+b3MubGVuKTsKKwkJcnZhbC0+b3MubGVuID0gQS0+b3MubGVuOworCQkqdG9mcmVlID0gMTsKKwl9CisJZWxzZQorCXsKKwkJKnJ2YWwgPSAqQTsKKwl9CisJcmV0dXJuIDA7Cit9CitpbnQgZGlhbWVhcF9hbnN3ZXJfc2V0X2F0dHJpYnV0ZV92YWx1ZUIoY2hhciAqIEIsIGludCAqdG9mcmVlLAorCQllbnVtIGRpY3RfYXZwX2Jhc2V0eXBlIGRhdGF0eXBlLCB1bmlvbiBhdnBfdmFsdWUgKiBydmFsKQoreworCVRSQUNFX0VOVFJZKCIlcCAlcCAlZCAlcCIsQix0b2ZyZWUsZGF0YXR5cGUscnZhbCk7CisJaWYgKGRhdGF0eXBlID09IEFWUF9UWVBFX09DVEVUU1RSSU5HKQorCXsKKwkJQ0hFQ0tfTUFMTE9DKHJ2YWwtPm9zLmRhdGE9bWFsbG9jKHN0cmxlbihCKSkpOworCQltZW1jcHkocnZhbC0+b3MuZGF0YSxCLHN0cmxlbihCKSk7CisJCXJ2YWwtPm9zLmxlbiA9IHN0cmxlbihCKTsKKworCQkqdG9mcmVlID0gMTsKKwl9CisJZWxzZQorCXsKKworCQkqcnZhbCA9IGRpYW1lYXBfZ2V0X251bShCLCBkYXRhdHlwZSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGlhbWVhcF9hdHRyaWJ1dGVfbGltaXRzKGNoYXIgKiBhdHRyaWIsIGludCAqIG1heCwgaW50ICpyZXQpCit7CisJVFJBQ0VfRU5UUlkoIiVwICVwICVwIixhdHRyaWIsbWF4LHJldCk7CisJaWYgKGF0dHJpYiA9PSBOVUxMKQorCXsKKwkJcmV0dXJuIEVJTlZBTDsKKwl9CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IHNpemVvZihhdXRoX2F2cHMpOyBpKyspCisJeworCQlpZiAoc3RyY21wKGF1dGhfYXZwc1tpXS5hdnBfYXR0cmlidXRlLCBhdHRyaWIpID09IDApCisJCXsKKwkJCSptYXggPSBhdXRoX2F2cHNbaV0ubWF4OworCQkJKnJldCA9IDA7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwkqbWF4ID0gMDsKKwkqcmV0ID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkaWFtZWFwX2Fuc3dlcl9hdXRob3JpemF0aW9uX2F0dHJpYnV0ZXMoCisJCXN0cnVjdCBkaWFtZWFwX3N0YXRlX21hY2hpbmUgKiBkaWFtZWFwX3NtKQoreworCVRSQUNFX0VOVFJZKCIlcCIsZGlhbWVhcF9zbSk7CisKKwlpZiAoZGlhbWVhcF9zbSA9PSBOVUxMKQorCXsKKwkJcmV0dXJuIEVJTlZBTDsKKwl9CisJYm9vbGVhbiBjaGVja2VkID0gVFJVRTsKKworCXN0cnVjdCBmZF9saXN0ICogYXR0cmliOworCXN0cnVjdCBhdXRoX2F0dHJpYnV0ZSAqIGF1dGhfYXR0cmliOworCXN0cnVjdCBhdnBfYXR0cmlidXRlICogYXZwX2F0dHJpYjsKKwlpbnQgcmV0OworCisJZm9yIChhdHRyaWIgPSAoJmRpYW1lYXBfc20tPmF0dHJpYnV0ZXMpLT5uZXh0OyBhdHRyaWIKKwkJCSE9ICgmZGlhbWVhcF9zbS0+YXR0cmlidXRlcyk7IGF0dHJpYiA9IGF0dHJpYi0+bmV4dCkKKwl7CisJCWF2cF9hdHRyaWIgPSBOVUxMOworCQlhdXRoX2F0dHJpYiA9IChzdHJ1Y3QgYXV0aF9hdHRyaWJ1dGUgKikgYXR0cmliOworCisJCWludCB0b2FkZCA9IDA7CisJCWJvb2xlYW4gaXNydWxlID0gRkFMU0U7CisJCWNoYXIgKiBvcDsKKworCQlvcCA9IGRpYW1lYXBfYXR0cmlidXRlX29wZXJhdG9yKGF1dGhfYXR0cmliLT5vcCwgJnRvYWRkLCAmaXNydWxlKTsKKworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBkb2JqOworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBhdnBkYXRhOworCQlmZF9kaWN0X3NlYXJjaChmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwKKwkJCQlhdXRoX2F0dHJpYi0+YXR0cmliLCAmZG9iaiwgRU5PRU5UKTsKKwkJZmRfZGljdF9nZXR2YWwoZG9iaiwgJmF2cGRhdGEpOworCisJCWNoZWNrZWQgPSBUUlVFOworCQlpZiAoaXNydWxlID09IFRSVUUpCisJCXsKKwkJCUNIRUNLX0ZDVChkaWFtZWFwX2dldF9hdnBfYXR0cmlidXRlKCZkaWFtZWFwX3NtLT5yZXFfYXR0cmlidXRlcyxhdXRoX2F0dHJpYi0+YXR0cmliLCZhdnBfYXR0cmliLDAsJnJldCkpOworCQkJaWYgKHJldCA9PSAwKQorCQkJeworCQkJCWNoZWNrZWQgPSBkaWFtZWFwX2NoZWNrKCZhdnBfYXR0cmliLT52YWx1ZSwgYXV0aF9hdHRyaWItPnZhbHVlLAorCQkJCQkJb3AsIGF2cGRhdGEuYXZwX2Jhc2V0eXBlKTsKKwkJCX0KKwkJfQorCQlpZiAoY2hlY2tlZCA9PSBUUlVFICYmIHRvYWRkICE9IDApCisJCXsKKworCQkJc3RydWN0IGF2cF9hdHRyaWJ1dGUgKiBhbnNfYXR0cmliOworCQkJaW50IG1heCA9IDA7CisJCQlkaWFtZWFwX2F0dHJpYnV0ZV9saW1pdHMoYXV0aF9hdHRyaWItPmF0dHJpYiwgJm1heCwgJnJldCk7CisJCQlpZiAoKHJldCA9PSAwKSAmJiAobWF4ICE9IDApKQorCQkJeworCQkJCWlmIChtYXggPT0gMSkvL29ubHkgb25lCisJCQkJeworCQkJCQlpbnQgcmV0ID0gMDsKKwkJCQkJZGlhbWVhcF9nZXRfYW5zX2F0dHJpYnV0ZSgmZGlhbWVhcF9zbS0+YW5zX2F0dHJpYnV0ZXMsCisJCQkJCQkJYXV0aF9hdHRyaWItPmF0dHJpYiwgJmFuc19hdHRyaWIsIDAsICZyZXQpOworCQkJCQlpZiAocmV0ID09IDEpCisJCQkJCXsKKwkJCQkJCWFuc19hdHRyaWIgPSBOVUxMOworCQkJCQkJQ0hFQ0tfTUFMTE9DKGFuc19hdHRyaWIgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdnBfYXR0cmlidXRlKSkpOworCQkJCQkJbWVtc2V0KGFuc19hdHRyaWIsIDAsIHNpemVvZihzdHJ1Y3QgYXZwX2F0dHJpYnV0ZSkpOworCQkJCQkJZmRfbGlzdF9pbml0KCZhbnNfYXR0cmliLT5jaGFpbiwgTlVMTCk7CisJCQkJCQlhbnNfYXR0cmliLT5hdHRyaWIgPSBzdHJkdXAoYXV0aF9hdHRyaWItPmF0dHJpYik7CisJCQkJCQlpZiAodG9hZGQgPT0gMSkKKwkJCQkJCXsKKwkJCQkJCQlkaWFtZWFwX2Fuc3dlcl9zZXRfYXR0cmlidXRlX3ZhbHVlQSgKKwkJCQkJCQkJCSZhdnBfYXR0cmliLT52YWx1ZSwgJmFuc19hdHRyaWItPnRvZnJlZSwKKwkJCQkJCQkJCWF2cGRhdGEuYXZwX2Jhc2V0eXBlLCAmYW5zX2F0dHJpYi0+dmFsdWUpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCWRpYW1lYXBfYW5zd2VyX3NldF9hdHRyaWJ1dGVfdmFsdWVCKAorCQkJCQkJCQkJYXV0aF9hdHRyaWItPnZhbHVlLCAmYW5zX2F0dHJpYi0+dG9mcmVlLAorCQkJCQkJCQkJYXZwZGF0YS5hdnBfYmFzZXR5cGUsICZhbnNfYXR0cmliLT52YWx1ZSk7CisJCQkJCQl9CisJCQkJCQlmZF9saXN0X2luc2VydF9iZWZvcmUoJmRpYW1lYXBfc20tPmFuc19hdHRyaWJ1dGVzLAorCQkJCQkJCQkmYW5zX2F0dHJpYi0+Y2hhaW4pOworCisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQkvL2FuIGFuc3dlciBhdnAgaXMgYWxyZWFkeSBhZGRlZAorCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWFuc19hdHRyaWIgPSBOVUxMOworCQkJCQlDSEVDS19NQUxMT0MoYW5zX2F0dHJpYiA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGF2cF9hdHRyaWJ1dGUpKSk7CisJCQkJCW1lbXNldChhbnNfYXR0cmliLCAwLCBzaXplb2Yoc3RydWN0IGF2cF9hdHRyaWJ1dGUpKTsKKwkJCQkJZmRfbGlzdF9pbml0KCZhbnNfYXR0cmliLT5jaGFpbiwgTlVMTCk7CisJCQkJCWFuc19hdHRyaWItPmF0dHJpYiA9IGF1dGhfYXR0cmliLT5hdHRyaWI7CisJCQkJCWlmICh0b2FkZCA9PSAxKQorCQkJCQl7CisJCQkJCQlkaWFtZWFwX2Fuc3dlcl9zZXRfYXR0cmlidXRlX3ZhbHVlQSgmYXZwX2F0dHJpYi0+dmFsdWUsCisJCQkJCQkJCSZhbnNfYXR0cmliLT50b2ZyZWUsIGF2cGRhdGEuYXZwX2Jhc2V0eXBlLAorCQkJCQkJCQkmYW5zX2F0dHJpYi0+dmFsdWUpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJZGlhbWVhcF9hbnN3ZXJfc2V0X2F0dHJpYnV0ZV92YWx1ZUIoYXV0aF9hdHRyaWItPnZhbHVlLAorCQkJCQkJCQkmYW5zX2F0dHJpYi0+dG9mcmVlLCBhdnBkYXRhLmF2cF9iYXNldHlwZSwKKwkJCQkJCQkJJmFuc19hdHRyaWItPnZhbHVlKTsKKwkJCQkJfQorCQkJCQlmZF9saXN0X2luc2VydF9iZWZvcmUoJmRpYW1lYXBfc20tPmFuc19hdHRyaWJ1dGVzLAorCQkJCQkJCSZhbnNfYXR0cmliLT5jaGFpbik7CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChjaGVja2VkID09IEZBTFNFKQorCQl7CisKKwkJCWRpYW1lYXBfc20tPmF1dGhvcml6ZWQgPSBGQUxTRTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCWRpYW1lYXBfc20tPmF1dGhvcml6ZWQgPSBjaGVja2VkOworCXJldHVybiAwOworCisJcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgaW50IGRpYW1lYXBfcG9saWN5X2RlY2lzaW9uKHN0cnVjdCBkaWFtZWFwX3N0YXRlX21hY2hpbmUgKiBkaWFtZWFwX3NtLAorCQlzdHJ1Y3QgZGlhbWVhcF9lYXBfaW50ZXJmYWNlICplYXBfaSkKK3sKKwlUUkFDRV9FTlRSWSgiJXAgJXAiLGRpYW1lYXBfc20sZWFwX2kpOworCisJaWYgKChlYXBfaS0+YWFhRmFpbCA9PSBUUlVFKSAmJiAoZWFwX2ktPmFhYVN1Y2Nlc3MgPT0gVFJVRSkpCisJeworCQlUUkFDRV9ERUJVRyhJTkZPLCIlcyBJbmNvcnJlY3QgRUFQIGRlY2lzaW9uLiBFQVAgcHJvY2VzcyBzaG91bGQgbm90IHJldHVybiBib3RoIHN1Y2Nlc3MgYW5kIGZhaWx1cmUgZm9yIHRoZSBzYW1lIHNlc3Npb24uKHBsZWFzZSByZXBvcnQgdGhpcyBwcm9ibGVtLikiLERJQU1FQVBfRVhURU5TSU9OKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChlYXBfaS0+YWFhRmFpbCA9PSBUUlVFKQorCXsKKwkJZGlhbWVhcF9zbS0+cmVzdWx0X2NvZGUgPSA0MDAxOyAvKiBESUFNRVRFUl9BVVRIRU5USUNBVElPTl9SRUpFQ1RFRCA0MDAxICovCisJCWRpYW1lYXBfc20tPmF1dGhGYWlsdXJlID0gVFJVRTsKKwkJVFJBQ0VfREVCVUcoRlVMTCsxLCIlcyBBdXRoIGZhaWx1cmU6IEF1dGhlbnRpY2F0aW9uIFJlamVjdGVkICIsRElBTUVBUF9FWFRFTlNJT04pOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZWFwX2ktPmFhYVN1Y2Nlc3MgPT0gRkFMU0UpCisJeworCQlkaWFtZWFwX3NtLT5yZXN1bHRfY29kZSA9IDEwMDE7IC8qIERJQU1FVEVSX01VTFRJX1JPVU5EX0FVVEggMTAwMSAqLworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZWFwX2ktPmFhYVN1Y2Nlc3MgPT0gVFJVRSkKKwl7CisJCWlmIChkaWFtZWFwX3NtLT5hdXRoX3JlcXVlc3RfdmFsID09IEFVVEhPUklaRV9BVVRIRU5USUNBVEUpCisJCXsKKwkJCWlmICgoZGlhbWVhcF9zbS0+dmVyaWZ5X2F1dGhvcml6YXRpb24gPT0gVFJVRSkKKwkJCQkJJiYgKGRpYW1lYXBfc20tPnJlc3VsdF9jb2RlID09IDApKQorCQkJeworCQkJCWRpYW1lYXBfc20tPnJlc3VsdF9jb2RlID0gMjAwMTsgLyogRElBTUVURVJfU1VDQ0VTUyAyMDAxICovCisJCQkJZGlhbWVhcF9zbS0+YXV0aFN1Y2Nlc3MgPSBUUlVFOworCQkJCVRSQUNFX0RFQlVHKEZVTEwrMSwiJXMgQXV0aCBzdWNjZXNzOiBBdXRob3JpemF0aW9uIGFuZCBBdXRoZW50aWNhdGlvbiAiLERJQU1FQVBfRVhURU5TSU9OKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLworCQkJfQorCQl9CisJCWlmIChkaWFtZWFwX3NtLT5hdXRoX3JlcXVlc3RfdmFsID09IEFVVEhFTlRJQ0FURV9PTkxZKQorCQl7CisJCQlkaWFtZWFwX3NtLT5yZXN1bHRfY29kZSA9IDIwMDE7IC8qIERJQU1FVEVSX1NVQ0NFU1MgMjAwMSAqLworCQkJZGlhbWVhcF9zbS0+YXV0aFN1Y2Nlc3MgPSBUUlVFOworCQkJVFJBQ0VfREVCVUcoRlVMTCsxLCIlcyBBdXRoIHN1Y2Nlc3M6IEF1dGhlbnRpY2F0aW9uIE9ubHkgIixESUFNRUFQX0VYVEVOU0lPTik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRpYW1lYXBfYWRkX2F2cHMoc3RydWN0IGRpYW1lYXBfc3RhdGVfbWFjaGluZSAqIGRpYW1lYXBfc20sCisJCXN0cnVjdCBtc2cgKiBhbnMsIHN0cnVjdCBtc2cgKiByZXEpCit7CisJVFJBQ0VfRU5UUlkoIiVwICVwICVwIixkaWFtZWFwX3NtLGFucyxyZXEpOworCisJc3RydWN0IGF2cCAqIGF2cCwgKmF2cDI7CisJc3RydWN0IGF2cF9oZHIgKiBhdnBkYXRhOworCXVuaW9uIGF2cF92YWx1ZSBhdnBfdmFsOworCWludCByZXQgPSAwOworCisJLyogT3JpZ2luLUhvc3QgQVZQIGFuZCBPcmlnaW4tUmVhbG0gQVZQICovCisJeworCQlDSEVDS19GQ1QoIGZkX21zZ19hZGRfb3JpZ2luICggYW5zLCAwICkgKTsKKwl9CisKKwkvKiBBdXRoLUFwcGxpY2F0aW9uLUlkIEFWUCAqLworCXsKKwkJQ0hFQ0tfRkNUKGZkX21zZ19hdnBfbmV3KGRhdGFvYmpfYXV0aF9hcHBsaWNhdGlvbl9pZCwgMCwgJmF2cCkpOworCQlhdnBfdmFsLnUzMiA9IGRpYW1lYXBfY29uZmlnLT5hcHBsaWNhdGlvbl9pZDsKKwkJQ0hFQ0tfRkNUKGZkX21zZ19hdnBfc2V0dmFsdWUoYXZwLCAmYXZwX3ZhbCkpOworCQlDSEVDS19GQ1QoZmRfbXNnX2F2cF9hZGQoYW5zLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCkpOworCX0KKworCS8qIEF1dGgtUmVxdWVzdC1UeXBlIEFWUAorCSAqIEVudW1lcmF0ZWQgdmFsdWVzOgorCSAqIAlBVVRIRU5USUNBVEVfT05MWSAxCisJICogCUFVVEhPUklaRV9PTkxZIDIKKwkgKiAJQVVUSE9SSVpFX0FVVEhFTlRJQ0FURSAzICovCisJeworCQlDSEVDS19GQ1QoZmRfbXNnX2F2cF9uZXcoZGF0YW9ial9hdXRoX3JlcXVlc3RfdHlwZSwgMCwgJmF2cCkpOworCQlpZiAoIWRpYW1lYXBfY29uZmlnLT5hdXRob3JpemUpCisJCXsKKwkJCS8vQVVUSEVOVElDQVRFIE9OTFkKKwkJCWF2cF92YWwuaTMyID0gQVVUSEVOVElDQVRFX09OTFk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZiAoZGlhbWVhcF9zbS0+YXV0aF9yZXF1ZXN0X3ZhbCA9PSAzKQorCQkJeworCQkJCS8vQVVUSE9SSVpFX0FVVEhFTlRJQ0FURQorCQkJCWF2cF92YWwuaTMyID0gQVVUSE9SSVpFX0FVVEhFTlRJQ0FURTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvL0FVVEhFTlRJQ0FURV9PTkxZCisJCQkJYXZwX3ZhbC5pMzIgPSBBVVRIRU5USUNBVEVfT05MWTsKKwkJCX0KKwkJfQorCQlDSEVDS19GQ1QoZmRfbXNnX2F2cF9zZXR2YWx1ZShhdnAsICZhdnBfdmFsKSk7CisJCUNIRUNLX0ZDVChmZF9tc2dfYXZwX2FkZChhbnMsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwKSk7CisJfQorCisJLyogUHJveHktSW5mbyBBVlAgKi8KKwlDSEVDS19GQ1QoZmRfbXNnX3NlYXJjaF9hdnAocmVxLCBkYXRhb2JqX3Byb3h5X2luZm8sICZhdnApKTsKKwlpZiAoYXZwICE9IE5VTEwpCisJeworCQlDSEVDS19GQ1QoZmRfbXNnX2F2cF9oZHIgKCBhdnAsICZhdnBkYXRhICkgKTsKKwkJdTMyIHByb3h5X2luZm9fY29kZSA9IGF2cGRhdGEtPmF2cF9jb2RlOworCQlpbnQgZGVwdGg7CisJCWRvCisJCXsKKwkJCXJldCA9IDA7CisJCQlkZXB0aCA9IDA7CisJCQlDSEVDS19GQ1QoZmRfbXNnX2F2cF9oZHIgKCBhdnAsICZhdnBkYXRhICkgKTsKKwkJCWlmIChhdnBkYXRhLT5hdnBfY29kZSA9PSBwcm94eV9pbmZvX2NvZGUpCisJCQl7CisJCQkJQ0hFQ0tfRkNUKGZkX21zZ19hdnBfYWRkKGFucywgTVNHX0JSV19MQVNUX0NISUxELCBhdnApKTsKKwkJCX0KKwkJCXJldCA9IGZkX21zZ19icm93c2UgKCBhdnAsIE1TR19CUldfTkVYVCwgJmF2cDIsICZkZXB0aCk7CisJCQlhdnAgPSBhdnAyOworCQl9IHdoaWxlICgoYXZwICE9IE5VTEwpICYmIChyZXQgPT0gMCkgJiYgKHJldCA9PSAwKSk7CisJfQorCisJaWYgKGRpYW1lYXBfc20tPmVhcF9zbS51c2VyLnVzZXJpZCkKKwl7CisJCS8qIFVzZXItTmFtZSBBVlAgKi8KKwkJeworCQkJQ0hFQ0tfRkNUKGZkX21zZ19hdnBfbmV3KGRhdGFvYmpfdXNlcl9uYW1lLCAwLCAmYXZwKSk7CisKKwkJCWlmIChkaWFtZWFwX3NtLT5wcml2YXRlVXNlciA9PSBGQUxTRSkKKwkJCXsKKworCQkJCWF2cF92YWwub3MuZGF0YSA9IGRpYW1lYXBfc20tPmVhcF9zbS51c2VyLnVzZXJpZDsKKwkJCQlhdnBfdmFsLm9zLmxlbiA9IGRpYW1lYXBfc20tPmVhcF9zbS51c2VyLnVzZXJpZExlbmd0aDsKKwkJCQlDSEVDS19GQ1QoZmRfbXNnX2F2cF9zZXR2YWx1ZShhdnAsICZhdnBfdmFsKSk7CisJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCggYW5zLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCApICk7CisJCQl9CisJCQllbHNlCisJCQl7CisKKwkJCX0KKworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRpYW1lYXBfYWRkX3VzZXJfc2Vzc2lvbnNfYXZwcygKKwkJc3RydWN0IGRpYW1lYXBfc3RhdGVfbWFjaGluZSAqIGRpYW1lYXBfc20sIHN0cnVjdCBtc2cgKiBhbnMpCit7CisJVFJBQ0VfRU5UUlkoIiVwICVwIixkaWFtZWFwX3NtLGFucyk7CisKKwlzdHJ1Y3QgYXZwICogYXZwOworCXVuaW9uIGF2cF92YWx1ZSBhdnBfdmFsOworCWludCByZXQ7CisKKwkvKiBBdXRob3JpemF0aW9uLUxpZmV0aW1lIEFWUCAqLworCXsKKwkJc3RydWN0IGF2cF9hdHRyaWJ1dGUgKiBhbnNfYXR0cmliOworCQlDSEVDS19GQ1QoZGlhbWVhcF9nZXRfYW5zX2F0dHJpYnV0ZSgmZGlhbWVhcF9zbS0+YW5zX2F0dHJpYnV0ZXMsIkF1dGhvcml6YXRpb24tTGlmZXRpbWUiLCZhbnNfYXR0cmliLDEsJnJldCkpOworCQlpZiAoKHJldCA9PSAwKSAmJiAoYW5zX2F0dHJpYiAhPSBOVUxMKSkKKwkJeworCQkJQ0hFQ0tfRkNUKGZkX21zZ19hdnBfbmV3KGRhdGFvYmpfYXV0aG9yaXphdGlvbl9saWZldGltZSwgMCwgJmF2cCkpOworCQkJYXZwX3ZhbC51MzIgPSBhbnNfYXR0cmliLT52YWx1ZS51MzI7CisJCQlDSEVDS19GQ1QoZmRfbXNnX2F2cF9zZXR2YWx1ZShhdnAsICZhdnBfdmFsKSk7CisJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkKCBhbnMsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwICkgKTsKKwkJCWZyZWVfYW5zX2F0dHJpYihhbnNfYXR0cmliKTsKKwkJfQorCX0KKworCS8qIEF1dGgtR3JhY2UtUGVyaW9kIEFWUCAqLworCXsKKwkJc3RydWN0IGF2cF9hdHRyaWJ1dGUgKiBhbnNfYXR0cmliOworCQlDSEVDS19GQ1QoZGlhbWVhcF9nZXRfYW5zX2F0dHJpYnV0ZSgmZGlhbWVhcF9zbS0+YW5zX2F0dHJpYnV0ZXMsIkF1dGgtR3JhY2UtUGVyaW9kIiwmYW5zX2F0dHJpYiwxLCZyZXQpKTsKKwkJaWYgKChyZXQgPT0gMCkgJiYgKGFuc19hdHRyaWIgIT0gTlVMTCkpCisJCXsKKwkJCUNIRUNLX0ZDVChmZF9tc2dfYXZwX25ldyhkYXRhb2JqX2F1dGhfZ3JhY2VfcGVyaW9kLCAwLCAmYXZwKSk7CisJCQlhdnBfdmFsLnUzMiA9IGFuc19hdHRyaWItPnZhbHVlLnUzMjsKKwkJCUNIRUNLX0ZDVChmZF9tc2dfYXZwX3NldHZhbHVlKGF2cCwgJmF2cF92YWwpKTsKKwkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQoIGFucywgTVNHX0JSV19MQVNUX0NISUxELCBhdnAgKSApOworCQkJZnJlZV9hbnNfYXR0cmliKGFuc19hdHRyaWIpOworCQl9CisJfQorCisJLyogQXV0aC1TZXNzaW9uLVN0YXRlIEFWUCAqLworCXsKKwkJc3RydWN0IGF2cF9hdHRyaWJ1dGUgKiBhbnNfYXR0cmliOworCQlDSEVDS19GQ1QoZGlhbWVhcF9nZXRfYW5zX2F0dHJpYnV0ZSgmZGlhbWVhcF9zbS0+YW5zX2F0dHJpYnV0ZXMsIkF1dGgtU2Vzc2lvbi1TdGF0ZSIsJmFuc19hdHRyaWIsMSwmcmV0KSk7CisJCWlmICgocmV0ID09IDApICYmIChhbnNfYXR0cmliICE9IE5VTEwpKQorCQl7CisJCQlDSEVDS19GQ1QoZmRfbXNnX2F2cF9uZXcoZGF0YW9ial9hdXRoX3Nlc3Npb25fc3RhdGUsIDAsICZhdnApKTsKKwkJCWF2cF92YWwuaTMyID0gYW5zX2F0dHJpYi0+dmFsdWUuaTMyOworCQkJQ0hFQ0tfRkNUKGZkX21zZ19hdnBfc2V0dmFsdWUoYXZwLCAmYXZwX3ZhbCkpOworCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCggYW5zLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCApICk7CisJCQlmcmVlX2Fuc19hdHRyaWIoYW5zX2F0dHJpYik7CisJCX0KKwl9CisKKwkvKiBSZS1BdXRoLVJlcXVlc3QtVHlwZSBBVlAgKi8KKwl7CisJCXN0cnVjdCBhdnBfYXR0cmlidXRlICogYW5zX2F0dHJpYjsKKwkJQ0hFQ0tfRkNUKGRpYW1lYXBfZ2V0X2Fuc19hdHRyaWJ1dGUoJmRpYW1lYXBfc20tPmFuc19hdHRyaWJ1dGVzLCJSZS1BdXRoLVJlcXVlc3QtVHlwZSIsJmFuc19hdHRyaWIsMSwmcmV0KSk7CisJCWlmICgocmV0ID09IDApICYmIChhbnNfYXR0cmliICE9IE5VTEwpKQorCQl7CisJCQlDSEVDS19GQ1QoZmRfbXNnX2F2cF9uZXcoZGF0YW9ial9yZV9hdXRoX3JlcXVlc3RfdHlwZSwgMCwgJmF2cCkpOworCQkJYXZwX3ZhbC5pMzIgPSBhbnNfYXR0cmliLT52YWx1ZS5pMzI7CisJCQlDSEVDS19GQ1QoZmRfbXNnX2F2cF9zZXR2YWx1ZShhdnAsICZhdnBfdmFsKSk7CisJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkKCBhbnMsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwICkgKTsKKwkJCWZyZWVfYW5zX2F0dHJpYihhbnNfYXR0cmliKTsKKwkJfQorCX0KKworCS8qIFNlc3Npb24tVGltZW91dCBBVlAgKi8KKwl7CisJCXN0cnVjdCBhdnBfYXR0cmlidXRlICogYW5zX2F0dHJpYjsKKwkJQ0hFQ0tfRkNUKGRpYW1lYXBfZ2V0X2Fuc19hdHRyaWJ1dGUoJmRpYW1lYXBfc20tPmFuc19hdHRyaWJ1dGVzLCJTZXNzaW9uLVRpbWVvdXQiLCZhbnNfYXR0cmliLDEsJnJldCkpOworCQlpZiAoKHJldCA9PSAwKSAmJiAoYW5zX2F0dHJpYiAhPSBOVUxMKSkKKwkJeworCQkJQ0hFQ0tfRkNUKGZkX21zZ19hdnBfbmV3KGRhdGFvYmpfc2Vzc2lvbl90aW1lb3V0LCAwLCAmYXZwKSk7CisJCQlhdnBfdmFsLnUzMiA9IGFuc19hdHRyaWItPnZhbHVlLnUzMjsKKwkJCUNIRUNLX0ZDVChmZF9tc2dfYXZwX3NldHZhbHVlKGF2cCwgJmF2cF92YWwpKTsKKwkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQoIGFucywgTVNHX0JSV19MQVNUX0NISUxELCBhdnAgKSApOworCQkJZnJlZV9hbnNfYXR0cmliKGFuc19hdHRyaWIpOworCQl9CisJfQorCisJLyogQWNjdC1JbnRlcmltLUludGVydmFsIEFWUCAqLworCXsKKwkJc3RydWN0IGF2cF9hdHRyaWJ1dGUgKiBhbnNfYXR0cmliOworCQlDSEVDS19GQ1QoZGlhbWVhcF9nZXRfYW5zX2F0dHJpYnV0ZSgmZGlhbWVhcF9zbS0+YW5zX2F0dHJpYnV0ZXMsIkFjY3QtSW50ZXJpbS1JbnRlcnZhbCIsJmFuc19hdHRyaWIsMSwmcmV0KSk7CisJCWlmICgocmV0ID09IDApICYmIChhbnNfYXR0cmliICE9IE5VTEwpKQorCQl7CisJCQlDSEVDS19GQ1QoZmRfbXNnX2F2cF9uZXcoZGF0YW9ial9hY2N0X2ludGVyaW1faW50ZXJ2YWwsIDAsICZhdnApKTsKKwkJCWF2cF92YWwudTMyID0gYW5zX2F0dHJpYi0+dmFsdWUudTMyOworCQkJQ0hFQ0tfRkNUKGZkX21zZ19hdnBfc2V0dmFsdWUoYXZwLCAmYXZwX3ZhbCkpOworCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCggYW5zLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCApICk7CisJCQlmcmVlX2Fuc19hdHRyaWIoYW5zX2F0dHJpYik7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGlhbWVhcF9hZGRfYXV0aG9yaXphdGlvbl9hdnBzKAorCQlzdHJ1Y3QgZGlhbWVhcF9zdGF0ZV9tYWNoaW5lICogZGlhbWVhcF9zbSwgc3RydWN0IG1zZyAqIGFucykKK3sKKworCVRSQUNFX0VOVFJZKCIlcCAlcCIsZGlhbWVhcF9zbSwgYW5zKTsKKworCXN0cnVjdCBhdnAgKiBhdnA7CisJdW5pb24gYXZwX3ZhbHVlIGF2cF92YWw7CisJaW50IHJldDsKKworCWlmIChkaWFtZWFwX3NtID09IE5VTEwpCisJeworCQlyZXR1cm4gRUlOVkFMOworCX0KKwlpZiAoYW5zID09IE5VTEwpCisJeworCQlyZXR1cm4gRUlOVkFMOworCX0KKworCS8qIFJlcGx5LU1lc3NhZ2UgKi8KKwl7CisJCXN0cnVjdCBhdnBfYXR0cmlidXRlICogYW5zX2F0dHJpYjsKKwkJQ0hFQ0tfRkNUKGRpYW1lYXBfZ2V0X2Fuc19hdHRyaWJ1dGUoJmRpYW1lYXBfc20tPmFuc19hdHRyaWJ1dGVzLCJSZXBseS1NZXNzYWdlIiwmYW5zX2F0dHJpYiwxLCZyZXQpKTsKKwkJd2hpbGUgKChyZXQgPT0gMCkgJiYgKGFuc19hdHRyaWIgIT0gTlVMTCkpCisJCXsKKwkJCUNIRUNLX0ZDVChmZF9tc2dfYXZwX25ldyhkYXRhb2JqX3JlcGx5X21lc3NhZ2UsIDAsICZhdnApKTsKKwkJCWF2cF92YWwub3MuZGF0YSA9IGFuc19hdHRyaWItPnZhbHVlLm9zLmRhdGE7CisJCQlhdnBfdmFsLm9zLmxlbiA9IGFuc19hdHRyaWItPnZhbHVlLm9zLmxlbjsKKwkJCUNIRUNLX0ZDVChmZF9tc2dfYXZwX3NldHZhbHVlKGF2cCwgJmF2cF92YWwpKTsKKwkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQoIGFucywgTVNHX0JSV19MQVNUX0NISUxELCBhdnAgKSApOworCQkJZnJlZV9hbnNfYXR0cmliKGFuc19hdHRyaWIpOworCQkJQ0hFQ0tfRkNUKGRpYW1lYXBfZ2V0X2Fuc19hdHRyaWJ1dGUoJmRpYW1lYXBfc20tPmFuc19hdHRyaWJ1dGVzLCJSZXBseS1NZXNzYWdlIiwmYW5zX2F0dHJpYiwxLCZyZXQpKTsKKwkJfQorCisJfQorCisJLyogU2VydmljZS1UeXBlICovCisJeworCQlzdHJ1Y3QgYXZwX2F0dHJpYnV0ZSAqIGFuc19hdHRyaWI7CisJCUNIRUNLX0ZDVChkaWFtZWFwX2dldF9hbnNfYXR0cmlidXRlKCZkaWFtZWFwX3NtLT5hbnNfYXR0cmlidXRlcywiU2VydmljZS1UeXBlIiwmYW5zX2F0dHJpYiwxLCZyZXQpKTsKKwkJaWYgKChyZXQgPT0gMCkgJiYgKGFuc19hdHRyaWIgIT0gTlVMTCkpCisJCXsKKwkJCUNIRUNLX0ZDVChmZF9tc2dfYXZwX25ldyhkYXRhb2JqX3NlcnZpY2VfdHlwZSwgMCwgJmF2cCkpOworCQkJYXZwX3ZhbC5pMzIgPSBhbnNfYXR0cmliLT52YWx1ZS5pMzI7CisJCQlDSEVDS19GQ1QoZmRfbXNnX2F2cF9zZXR2YWx1ZShhdnAsICZhdnBfdmFsKSk7CisJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkKCBhbnMsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwICkgKTsKKwkJCWZyZWVfYW5zX2F0dHJpYihhbnNfYXR0cmliKTsKKwkJfQorCX0KKworCS8qIENhbGxiYWNrLU51bWJlciAqLworCXsKKwkJc3RydWN0IGF2cF9hdHRyaWJ1dGUgKiBhbnNfYXR0cmliOworCQlDSEVDS19GQ1QoZGlhbWVhcF9nZXRfYW5zX2F0dHJpYnV0ZSgmZGlhbWVhcF9zbS0+YW5zX2F0dHJpYnV0ZXMsIkNhbGxiYWNrLU51bWJlciIsJmFuc19hdHRyaWIsMSwmcmV0KSk7CisJCWlmICgocmV0ID09IDApICYmIChhbnNfYXR0cmliICE9IE5VTEwpKQorCQl7CisJCQlDSEVDS19GQ1QoZmRfbXNnX2F2cF9uZXcoZGF0YW9ial9jYWxsYmFja19udW1iZXIsIDAsICZhdnApKTsKKwkJCWF2cF92YWwub3MuZGF0YSA9IGFuc19hdHRyaWItPnZhbHVlLm9zLmRhdGE7CisJCQlhdnBfdmFsLm9zLmxlbiA9IGFuc19hdHRyaWItPnZhbHVlLm9zLmxlbjsKKwkJCUNIRUNLX0ZDVChmZF9tc2dfYXZwX3NldHZhbHVlKGF2cCwgJmF2cF92YWwpKTsKKwkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQoIGFucywgTVNHX0JSV19MQVNUX0NISUxELCBhdnAgKSApOworCQkJZnJlZV9hbnNfYXR0cmliKGFuc19hdHRyaWIpOworCQl9CisJfQorCisJLyogQ2FsbGJhY2stSWQgKi8KKwl7CisJCXN0cnVjdCBhdnBfYXR0cmlidXRlICogYW5zX2F0dHJpYjsKKwkJQ0hFQ0tfRkNUKGRpYW1lYXBfZ2V0X2Fuc19hdHRyaWJ1dGUoJmRpYW1lYXBfc20tPmFuc19hdHRyaWJ1dGVzLCJDYWxsYmFjay1JZCIsJmFuc19hdHRyaWIsMSwmcmV0KSk7CisJCWlmICgocmV0ID09IDApICYmIChhbnNfYXR0cmliICE9IE5VTEwpKQorCQl7CisJCQlDSEVDS19GQ1QoZmRfbXNnX2F2cF9uZXcoZGF0YW9ial9jYWxsYmFja19pZCwgMCwgJmF2cCkpOworCQkJYXZwX3ZhbC5vcy5kYXRhID0gYW5zX2F0dHJpYi0+dmFsdWUub3MuZGF0YTsKKwkJCWF2cF92YWwub3MubGVuID0gYW5zX2F0dHJpYi0+dmFsdWUub3MubGVuOworCQkJQ0hFQ0tfRkNUKGZkX21zZ19hdnBfc2V0dmFsdWUoYXZwLCAmYXZwX3ZhbCkpOworCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCggYW5zLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCApICk7CisJCQlmcmVlX2Fuc19hdHRyaWIoYW5zX2F0dHJpYik7CisJCX0KKwl9CisKKwkvKiBJZGxlLVRpbWVvdXQgKi8KKwl7CisJCXN0cnVjdCBhdnBfYXR0cmlidXRlICogYW5zX2F0dHJpYjsKKwkJQ0hFQ0tfRkNUKGRpYW1lYXBfZ2V0X2Fuc19hdHRyaWJ1dGUoJmRpYW1lYXBfc20tPmFuc19hdHRyaWJ1dGVzLCJJZGxlLVRpbWVvdXQiLCZhbnNfYXR0cmliLDEsJnJldCkpOworCQlpZiAoKHJldCA9PSAwKSAmJiAoYW5zX2F0dHJpYiAhPSBOVUxMKSkKKwkJeworCQkJQ0hFQ0tfRkNUKGZkX21zZ19hdnBfbmV3KGRhdGFvYmpfaWRsZV90aW1lb3V0LCAwLCAmYXZwKSk7CisJCQlhdnBfdmFsLnUzMiA9IGFuc19hdHRyaWItPnZhbHVlLnUzMjsKKwkJCUNIRUNLX0ZDVChmZF9tc2dfYXZwX3NldHZhbHVlKGF2cCwgJmF2cF92YWwpKTsKKwkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQoIGFucywgTVNHX0JSV19MQVNUX0NISUxELCBhdnAgKSApOworCQkJZnJlZV9hbnNfYXR0cmliKGFuc19hdHRyaWIpOworCQl9CisJfQorCisJLyogTkFTLUZpbHRlci1SdWxlICovCisJeworCQlzdHJ1Y3QgYXZwX2F0dHJpYnV0ZSAqIGFuc19hdHRyaWI7CisJCUNIRUNLX0ZDVChkaWFtZWFwX2dldF9hbnNfYXR0cmlidXRlKCZkaWFtZWFwX3NtLT5hbnNfYXR0cmlidXRlcywiTkFTLUZpbHRlci1SdWxlIiwmYW5zX2F0dHJpYiwxLCZyZXQpKTsKKwkJaWYgKChyZXQgPT0gMCkgJiYgKGFuc19hdHRyaWIgIT0gTlVMTCkpCisJCXsKKwkJCUNIRUNLX0ZDVChmZF9tc2dfYXZwX25ldyhkYXRhb2JqX25hc19maWx0ZXJfcnVsZSwgMCwgJmF2cCkpOworCQkJYXZwX3ZhbC51MzIgPSBhbnNfYXR0cmliLT52YWx1ZS51MzI7CisJCQlDSEVDS19GQ1QoZmRfbXNnX2F2cF9zZXR2YWx1ZShhdnAsICZhdnBfdmFsKSk7CisJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkKCBhbnMsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwICkgKTsKKwkJCWZyZWVfYW5zX2F0dHJpYihhbnNfYXR0cmliKTsKKwkJfQorCX0KKworCS8qIEZpbHRlci1JZCAqLworCXsKKwkJc3RydWN0IGF2cF9hdHRyaWJ1dGUgKiBhbnNfYXR0cmliOworCQlDSEVDS19GQ1QoZGlhbWVhcF9nZXRfYW5zX2F0dHJpYnV0ZSgmZGlhbWVhcF9zbS0+YW5zX2F0dHJpYnV0ZXMsIkZpbHRlci1JZCIsJmFuc19hdHRyaWIsMSwmcmV0KSk7CisJCXdoaWxlICgocmV0ID09IDApICYmIChhbnNfYXR0cmliICE9IE5VTEwpKQorCQl7CisJCQlDSEVDS19GQ1QoZmRfbXNnX2F2cF9uZXcoZGF0YW9ial9maWx0ZXJfaWQsIDAsICZhdnApKTsKKwkJCWF2cF92YWwub3MuZGF0YSA9IGFuc19hdHRyaWItPnZhbHVlLm9zLmRhdGE7CisJCQlhdnBfdmFsLm9zLmxlbiA9IGFuc19hdHRyaWItPnZhbHVlLm9zLmxlbjsKKwkJCUNIRUNLX0ZDVChmZF9tc2dfYXZwX3NldHZhbHVlKGF2cCwgJmF2cF92YWwpKTsKKwkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQoIGFucywgTVNHX0JSV19MQVNUX0NISUxELCBhdnAgKSApOworCQkJZnJlZV9hbnNfYXR0cmliKGFuc19hdHRyaWIpOworCQkJQ0hFQ0tfRkNUKGRpYW1lYXBfZ2V0X2Fuc19hdHRyaWJ1dGUoJmRpYW1lYXBfc20tPmFuc19hdHRyaWJ1dGVzLCJGaWx0ZXItSWQiLCZhbnNfYXR0cmliLDEsJnJldCkpOworCQl9CisKKwl9CisKKwkvKiBDb25maWd1cmF0aW9uLVRva2VuICovCisJeworCQlzdHJ1Y3QgYXZwX2F0dHJpYnV0ZSAqIGFuc19hdHRyaWI7CisJCUNIRUNLX0ZDVChkaWFtZWFwX2dldF9hbnNfYXR0cmlidXRlKCZkaWFtZWFwX3NtLT5hbnNfYXR0cmlidXRlcywiQ29uZmlndXJhdGlvbi1Ub2tlbiIsJmFuc19hdHRyaWIsMSwmcmV0KSk7CisJCXdoaWxlICgocmV0ID09IDApICYmIChhbnNfYXR0cmliICE9IE5VTEwpKQorCQl7CisJCQlDSEVDS19GQ1QoZmRfbXNnX2F2cF9uZXcoZGF0YW9ial9jb25maWd1cmF0aW9uX3Rva2VuLCAwLCAmYXZwKSk7CisJCQlhdnBfdmFsLm9zLmRhdGEgPSBhbnNfYXR0cmliLT52YWx1ZS5vcy5kYXRhOworCQkJYXZwX3ZhbC5vcy5sZW4gPSBhbnNfYXR0cmliLT52YWx1ZS5vcy5sZW47CisJCQlDSEVDS19GQ1QoZmRfbXNnX2F2cF9zZXR2YWx1ZShhdnAsICZhdnBfdmFsKSk7CisJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkKCBhbnMsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwICkgKTsKKwkJCWZyZWVfYW5zX2F0dHJpYihhbnNfYXR0cmliKTsKKwkJCUNIRUNLX0ZDVChkaWFtZWFwX2dldF9hbnNfYXR0cmlidXRlKCZkaWFtZWFwX3NtLT5hbnNfYXR0cmlidXRlcywiQ29uZmlndXJhdGlvbi1Ub2tlbiIsJmFuc19hdHRyaWIsMSwmcmV0KSk7CisJCX0KKwl9CisKKwkvKiBRb1MtRmlsdGVyLVJ1bGUgKi8KKwl7CisJCXN0cnVjdCBhdnBfYXR0cmlidXRlICogYW5zX2F0dHJpYjsKKwkJQ0hFQ0tfRkNUKGRpYW1lYXBfZ2V0X2Fuc19hdHRyaWJ1dGUoJmRpYW1lYXBfc20tPmFuc19hdHRyaWJ1dGVzLCJRb1MtRmlsdGVyLVJ1bGUiLCZhbnNfYXR0cmliLDEsJnJldCkpOworCQl3aGlsZSAoKHJldCA9PSAwKSAmJiAoYW5zX2F0dHJpYiAhPSBOVUxMKSkKKwkJeworCQkJQ0hFQ0tfRkNUKGZkX21zZ19hdnBfbmV3KGRhdGFvYmpfcW9zX2ZpbHRlcl9ydWxlLCAwLCAmYXZwKSk7CisJCQlhdnBfdmFsLm9zLmRhdGEgPSBhbnNfYXR0cmliLT52YWx1ZS5vcy5kYXRhOworCQkJYXZwX3ZhbC5vcy5sZW4gPSBhbnNfYXR0cmliLT52YWx1ZS5vcy5sZW47CisJCQlDSEVDS19GQ1QoZmRfbXNnX2F2cF9zZXR2YWx1ZShhdnAsICZhdnBfdmFsKSk7CisJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkKCBhbnMsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwICkgKTsKKwkJCWZyZWVfYW5zX2F0dHJpYihhbnNfYXR0cmliKTsKKwkJCUNIRUNLX0ZDVChkaWFtZWFwX2dldF9hbnNfYXR0cmlidXRlKCZkaWFtZWFwX3NtLT5hbnNfYXR0cmlidXRlcywiUW9TLUZpbHRlci1SdWxlIiwmYW5zX2F0dHJpYiwxLCZyZXQpKTsKKwkJfQorCisJfQorCisJLyogRnJhbWVkLVByb3RvY29sICovCisJeworCQlzdHJ1Y3QgYXZwX2F0dHJpYnV0ZSAqIGFuc19hdHRyaWI7CisJCUNIRUNLX0ZDVChkaWFtZWFwX2dldF9hbnNfYXR0cmlidXRlKCZkaWFtZWFwX3NtLT5hbnNfYXR0cmlidXRlcywiRnJhbWVkLVByb3RvY29sIiwmYW5zX2F0dHJpYiwxLCZyZXQpKTsKKwkJaWYgKChyZXQgPT0gMCkgJiYgKGFuc19hdHRyaWIgIT0gTlVMTCkpCisJCXsKKwkJCUNIRUNLX0ZDVChmZF9tc2dfYXZwX25ldyhkYXRhb2JqX2ZyYW1lZF9wcm90b2NvbCwgMCwgJmF2cCkpOworCQkJYXZwX3ZhbC5pMzIgPSBhbnNfYXR0cmliLT52YWx1ZS5pMzI7CisJCQlDSEVDS19GQ1QoZmRfbXNnX2F2cF9zZXR2YWx1ZShhdnAsICZhdnBfdmFsKSk7CisJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkKCBhbnMsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwICkgKTsKKwkJCWZyZWVfYW5zX2F0dHJpYihhbnNfYXR0cmliKTsKKwkJfQorCX0KKworCS8qIEZyYW1lZC1Sb3V0aW5nICovCisJeworCQlzdHJ1Y3QgYXZwX2F0dHJpYnV0ZSAqIGFuc19hdHRyaWI7CisJCUNIRUNLX0ZDVChkaWFtZWFwX2dldF9hbnNfYXR0cmlidXRlKCZkaWFtZWFwX3NtLT5hbnNfYXR0cmlidXRlcywiRnJhbWVkLVJvdXRpbmciLCZhbnNfYXR0cmliLDEsJnJldCkpOworCQlpZiAoKHJldCA9PSAwKSAmJiAoYW5zX2F0dHJpYiAhPSBOVUxMKSkKKwkJeworCQkJQ0hFQ0tfRkNUKGZkX21zZ19hdnBfbmV3KGRhdGFvYmpfZnJhbWVkX3JvdXRpbmcsIDAsICZhdnApKTsKKwkJCWF2cF92YWwuaTMyID0gYW5zX2F0dHJpYi0+dmFsdWUuaTMyOworCQkJQ0hFQ0tfRkNUKGZkX21zZ19hdnBfc2V0dmFsdWUoYXZwLCAmYXZwX3ZhbCkpOworCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCggYW5zLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCApICk7CisJCQlmcmVlX2Fuc19hdHRyaWIoYW5zX2F0dHJpYik7CisJCX0KKworCX0KKworCS8qIEZyYW1lZC1NVFUgKi8KKwl7CisJCXN0cnVjdCBhdnBfYXR0cmlidXRlICogYW5zX2F0dHJpYjsKKwkJQ0hFQ0tfRkNUKGRpYW1lYXBfZ2V0X2Fuc19hdHRyaWJ1dGUoJmRpYW1lYXBfc20tPmFuc19hdHRyaWJ1dGVzLCJGcmFtZWQtTVRVIiwmYW5zX2F0dHJpYiwxLCZyZXQpKTsKKwkJaWYgKChyZXQgPT0gMCkgJiYgKGFuc19hdHRyaWIgIT0gTlVMTCkpCisJCXsKKwkJCUNIRUNLX0ZDVChmZF9tc2dfYXZwX25ldyhkYXRhb2JqX2ZyYW1lZF9tdHUsIDAsICZhdnApKTsKKwkJCWF2cF92YWwudTMyID0gYW5zX2F0dHJpYi0+dmFsdWUudTMyOworCQkJQ0hFQ0tfRkNUKGZkX21zZ19hdnBfc2V0dmFsdWUoYXZwLCAmYXZwX3ZhbCkpOworCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCggYW5zLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCApICk7CisJCQlmcmVlX2Fuc19hdHRyaWIoYW5zX2F0dHJpYik7CisJCX0KKwl9CisKKwkvKiBGcmFtZWQtQ29tcHJlc3Npb24gKi8KKwl7CisJCXN0cnVjdCBhdnBfYXR0cmlidXRlICogYW5zX2F0dHJpYjsKKwkJQ0hFQ0tfRkNUKGRpYW1lYXBfZ2V0X2Fuc19hdHRyaWJ1dGUoJmRpYW1lYXBfc20tPmFuc19hdHRyaWJ1dGVzLCJGcmFtZWQtQ29tcHJlc3Npb24iLCZhbnNfYXR0cmliLDEsJnJldCkpOworCQl3aGlsZSAoKHJldCA9PSAwKSAmJiAoYW5zX2F0dHJpYiAhPSBOVUxMKSkKKwkJeworCQkJQ0hFQ0tfRkNUKGZkX21zZ19hdnBfbmV3KGRhdGFvYmpfZnJhbWVkX2NvbXByZXNzaW9uLCAwLCAmYXZwKSk7CisJCQlhdnBfdmFsLmkzMiA9IGFuc19hdHRyaWItPnZhbHVlLmkzMjsKKwkJCUNIRUNLX0ZDVChmZF9tc2dfYXZwX3NldHZhbHVlKGF2cCwgJmF2cF92YWwpKTsKKwkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQoIGFucywgTVNHX0JSV19MQVNUX0NISUxELCBhdnAgKSApOworCQkJZnJlZV9hbnNfYXR0cmliKGFuc19hdHRyaWIpOworCQkJQ0hFQ0tfRkNUKGRpYW1lYXBfZ2V0X2Fuc19hdHRyaWJ1dGUoJmRpYW1lYXBfc20tPmFuc19hdHRyaWJ1dGVzLCJGcmFtZWQtQ29tcHJlc3Npb24iLCZhbnNfYXR0cmliLDEsJnJldCkpOworCQl9CisKKwl9CisJLyogRnJhbWVkLUlQLUFkZHJlc3MgKi8KKwl7CisJCXN0cnVjdCBhdnBfYXR0cmlidXRlICogYW5zX2F0dHJpYjsKKwkJQ0hFQ0tfRkNUKGRpYW1lYXBfZ2V0X2Fuc19hdHRyaWJ1dGUoJmRpYW1lYXBfc20tPmFuc19hdHRyaWJ1dGVzLCJGcmFtZWQtSVAtQWRkcmVzcyIsJmFuc19hdHRyaWIsMSwmcmV0KSk7CisJCWlmICgocmV0ID09IDApICYmIChhbnNfYXR0cmliICE9IE5VTEwpKQorCQl7CisJCQlDSEVDS19GQ1QoZmRfbXNnX2F2cF9uZXcoZGF0YW9ial9mcmFtZWRfaXBfYWRkcmVzcywgMCwgJmF2cCkpOworCQkJYXZwX3ZhbC5vcy5kYXRhID0gYW5zX2F0dHJpYi0+dmFsdWUub3MuZGF0YTsKKwkJCWF2cF92YWwub3MubGVuID0gYW5zX2F0dHJpYi0+dmFsdWUub3MubGVuOworCQkJQ0hFQ0tfRkNUKGZkX21zZ19hdnBfc2V0dmFsdWUoYXZwLCAmYXZwX3ZhbCkpOworCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCggYW5zLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCApICk7CisJCQlmcmVlX2Fuc19hdHRyaWIoYW5zX2F0dHJpYik7CisJCX0KKwl9CisKKwkvKiBGcmFtZWQtSVAtTmV0bWFzayAqLworCXsKKwkJc3RydWN0IGF2cF9hdHRyaWJ1dGUgKiBhbnNfYXR0cmliOworCQlDSEVDS19GQ1QoZGlhbWVhcF9nZXRfYW5zX2F0dHJpYnV0ZSgmZGlhbWVhcF9zbS0+YW5zX2F0dHJpYnV0ZXMsIkZyYW1lZC1JUC1OZXRtYXNrIiwmYW5zX2F0dHJpYiwxLCZyZXQpKTsKKwkJaWYgKChyZXQgPT0gMCkgJiYgKGFuc19hdHRyaWIgIT0gTlVMTCkpCisJCXsKKwkJCUNIRUNLX0ZDVChmZF9tc2dfYXZwX25ldyhkYXRhb2JqX2ZyYW1lZF9pcF9uZXRtYXNrLCAwLCAmYXZwKSk7CisJCQlhdnBfdmFsLm9zLmRhdGEgPSBhbnNfYXR0cmliLT52YWx1ZS5vcy5kYXRhOworCQkJYXZwX3ZhbC5vcy5sZW4gPSBhbnNfYXR0cmliLT52YWx1ZS5vcy5sZW47CisJCQlDSEVDS19GQ1QoZmRfbXNnX2F2cF9zZXR2YWx1ZShhdnAsICZhdnBfdmFsKSk7CisJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkKCBhbnMsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwICkgKTsKKwkJCWZyZWVfYW5zX2F0dHJpYihhbnNfYXR0cmliKTsKKwkJfQorCX0KKworCS8qIEZyYW1lZC1Sb3V0ZSAqLworCXsKKwkJc3RydWN0IGF2cF9hdHRyaWJ1dGUgKiBhbnNfYXR0cmliOworCQlDSEVDS19GQ1QoZGlhbWVhcF9nZXRfYW5zX2F0dHJpYnV0ZSgmZGlhbWVhcF9zbS0+YW5zX2F0dHJpYnV0ZXMsIkZyYW1lZC1Sb3V0ZSIsJmFuc19hdHRyaWIsMSwmcmV0KSk7CisJCXdoaWxlICgocmV0ID09IDApICYmIChhbnNfYXR0cmliICE9IE5VTEwpKQorCQl7CisJCQlDSEVDS19GQ1QoZmRfbXNnX2F2cF9uZXcoZGF0YW9ial9mcmFtZWRfcm91dGUsIDAsICZhdnApKTsKKwkJCWF2cF92YWwub3MuZGF0YSA9IGFuc19hdHRyaWItPnZhbHVlLm9zLmRhdGE7CisJCQlhdnBfdmFsLm9zLmxlbiA9IGFuc19hdHRyaWItPnZhbHVlLm9zLmxlbjsKKwkJCUNIRUNLX0ZDVChmZF9tc2dfYXZwX3NldHZhbHVlKGF2cCwgJmF2cF92YWwpKTsKKwkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQoIGFucywgTVNHX0JSV19MQVNUX0NISUxELCBhdnAgKSApOworCQkJZnJlZV9hbnNfYXR0cmliKGFuc19hdHRyaWIpOworCQkJQ0hFQ0tfRkNUKGRpYW1lYXBfZ2V0X2Fuc19hdHRyaWJ1dGUoJmRpYW1lYXBfc20tPmFuc19hdHRyaWJ1dGVzLCJGcmFtZWQtUm91dGUiLCZhbnNfYXR0cmliLDEsJnJldCkpOworCQl9CisJfQorCisJLyogRnJhbWVkLVBvb2wgKi8KKwl7CisJCXN0cnVjdCBhdnBfYXR0cmlidXRlICogYW5zX2F0dHJpYjsKKwkJQ0hFQ0tfRkNUKGRpYW1lYXBfZ2V0X2Fuc19hdHRyaWJ1dGUoJmRpYW1lYXBfc20tPmFuc19hdHRyaWJ1dGVzLCJGcmFtZWQtUG9vbCIsJmFuc19hdHRyaWIsMSwmcmV0KSk7CisJCWlmICgocmV0ID09IDApICYmIChhbnNfYXR0cmliICE9IE5VTEwpKQorCQl7CisJCQlDSEVDS19GQ1QoZmRfbXNnX2F2cF9uZXcoZGF0YW9ial9mcmFtZWRfcG9vbCwgMCwgJmF2cCkpOworCQkJYXZwX3ZhbC5vcy5kYXRhID0gYW5zX2F0dHJpYi0+dmFsdWUub3MuZGF0YTsKKwkJCWF2cF92YWwub3MubGVuID0gYW5zX2F0dHJpYi0+dmFsdWUub3MubGVuOworCQkJQ0hFQ0tfRkNUKGZkX21zZ19hdnBfc2V0dmFsdWUoYXZwLCAmYXZwX3ZhbCkpOworCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCggYW5zLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCApICk7CisJCQlmcmVlX2Fuc19hdHRyaWIoYW5zX2F0dHJpYik7CisJCX0KKwl9CisKKwkvKiBGcmFtZWQtSW50ZXJmYWNlLUlkICovCisJeworCQlzdHJ1Y3QgYXZwX2F0dHJpYnV0ZSAqIGFuc19hdHRyaWI7CisJCUNIRUNLX0ZDVChkaWFtZWFwX2dldF9hbnNfYXR0cmlidXRlKCZkaWFtZWFwX3NtLT5hbnNfYXR0cmlidXRlcywiRnJhbWVkLUludGVyZmFjZS1JZCIsJmFuc19hdHRyaWIsMSwmcmV0KSk7CisJCWlmICgocmV0ID09IDApICYmIChhbnNfYXR0cmliICE9IE5VTEwpKQorCQl7CisJCQlDSEVDS19GQ1QoZmRfbXNnX2F2cF9uZXcoZGF0YW9ial9mcmFtZWRfaW50ZXJmYWNlX2lkLCAwLCAmYXZwKSk7CisJCQlhdnBfdmFsLnU2NCA9IGFuc19hdHRyaWItPnZhbHVlLnU2NDsKKwkJCUNIRUNLX0ZDVChmZF9tc2dfYXZwX3NldHZhbHVlKGF2cCwgJmF2cF92YWwpKTsKKwkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQoIGFucywgTVNHX0JSV19MQVNUX0NISUxELCBhdnAgKSApOworCQkJZnJlZV9hbnNfYXR0cmliKGFuc19hdHRyaWIpOworCQl9CisJfQorCisJLyogRnJhbWVkLUlQdjYtUHJlZml4ICovCisJeworCQlzdHJ1Y3QgYXZwX2F0dHJpYnV0ZSAqIGFuc19hdHRyaWI7CisJCUNIRUNLX0ZDVChkaWFtZWFwX2dldF9hbnNfYXR0cmlidXRlKCZkaWFtZWFwX3NtLT5hbnNfYXR0cmlidXRlcywiRnJhbWVkLUlQdjYtUHJlZml4IiwmYW5zX2F0dHJpYiwxLCZyZXQpKTsKKwkJd2hpbGUgKChyZXQgPT0gMCkgJiYgKGFuc19hdHRyaWIgIT0gTlVMTCkpCisJCXsKKwkJCUNIRUNLX0ZDVChmZF9tc2dfYXZwX25ldyhkYXRhb2JqX2ZyYW1lZF9pcHY2X3ByZWZpeCwgMCwgJmF2cCkpOworCQkJYXZwX3ZhbC5vcy5kYXRhID0gYW5zX2F0dHJpYi0+dmFsdWUub3MuZGF0YTsKKwkJCWF2cF92YWwub3MubGVuID0gYW5zX2F0dHJpYi0+dmFsdWUub3MubGVuOworCQkJQ0hFQ0tfRkNUKGZkX21zZ19hdnBfc2V0dmFsdWUoYXZwLCAmYXZwX3ZhbCkpOworCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCggYW5zLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCApICk7CisJCQlmcmVlX2Fuc19hdHRyaWIoYW5zX2F0dHJpYik7CisJCQlDSEVDS19GQ1QoZGlhbWVhcF9nZXRfYW5zX2F0dHJpYnV0ZSgmZGlhbWVhcF9zbS0+YW5zX2F0dHJpYnV0ZXMsIkZyYW1lZC1JUHY2LVByZWZpeCIsJmFuc19hdHRyaWIsMSwmcmV0KSk7CisJCX0KKwl9CisKKwkvKiBGcmFtZWQtSVB2Ni1Sb3V0ZSAqLworCXsKKwkJc3RydWN0IGF2cF9hdHRyaWJ1dGUgKiBhbnNfYXR0cmliOworCQlDSEVDS19GQ1QoZGlhbWVhcF9nZXRfYW5zX2F0dHJpYnV0ZSgmZGlhbWVhcF9zbS0+YW5zX2F0dHJpYnV0ZXMsIkZyYW1lZC1JUHY2LVJvdXRlIiwmYW5zX2F0dHJpYiwxLCZyZXQpKTsKKwkJd2hpbGUgKChyZXQgPT0gMCkgJiYgKGFuc19hdHRyaWIgIT0gTlVMTCkpCisJCXsKKwkJCUNIRUNLX0ZDVChmZF9tc2dfYXZwX25ldyhkYXRhb2JqX2ZyYW1lZF9pcHY2X3JvdXRlLCAwLCAmYXZwKSk7CisJCQlhdnBfdmFsLm9zLmRhdGEgPSBhbnNfYXR0cmliLT52YWx1ZS5vcy5kYXRhOworCQkJYXZwX3ZhbC5vcy5sZW4gPSBhbnNfYXR0cmliLT52YWx1ZS5vcy5sZW47CisJCQlDSEVDS19GQ1QoZmRfbXNnX2F2cF9zZXR2YWx1ZShhdnAsICZhdnBfdmFsKSk7CisJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkKCBhbnMsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwICkgKTsKKwkJCWZyZWVfYW5zX2F0dHJpYihhbnNfYXR0cmliKTsKKwkJCUNIRUNLX0ZDVChkaWFtZWFwX2dldF9hbnNfYXR0cmlidXRlKCZkaWFtZWFwX3NtLT5hbnNfYXR0cmlidXRlcywiRnJhbWVkLUlQdjYtUm91dGUiLCZhbnNfYXR0cmliLDEsJnJldCkpOworCQl9CisJfQorCisJLyogRnJhbWVkLUlQdjYtUG9vbCAqLworCXsKKwkJc3RydWN0IGF2cF9hdHRyaWJ1dGUgKiBhbnNfYXR0cmliOworCQlDSEVDS19GQ1QoZGlhbWVhcF9nZXRfYW5zX2F0dHJpYnV0ZSgmZGlhbWVhcF9zbS0+YW5zX2F0dHJpYnV0ZXMsIkZyYW1lZC1JUHY2LVBvb2wiLCZhbnNfYXR0cmliLDEsJnJldCkpOworCQlpZiAoKHJldCA9PSAwKSAmJiAoYW5zX2F0dHJpYiAhPSBOVUxMKSkKKwkJeworCQkJQ0hFQ0tfRkNUKGZkX21zZ19hdnBfbmV3KGRhdGFvYmpfZnJhbWVkX2lwdjZfcG9vbCwgMCwgJmF2cCkpOworCQkJYXZwX3ZhbC5vcy5kYXRhID0gYW5zX2F0dHJpYi0+dmFsdWUub3MuZGF0YTsKKwkJCWF2cF92YWwub3MubGVuID0gYW5zX2F0dHJpYi0+dmFsdWUub3MubGVuOworCQkJQ0hFQ0tfRkNUKGZkX21zZ19hdnBfc2V0dmFsdWUoYXZwLCAmYXZwX3ZhbCkpOworCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCggYW5zLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCApICk7CisJCQlmcmVlX2Fuc19hdHRyaWIoYW5zX2F0dHJpYik7CisJCX0KKwl9CisKKwkvKiBGcmFtZWQtSVBYLU5ldHdvcmsgKi8KKwl7CisJCXN0cnVjdCBhdnBfYXR0cmlidXRlICogYW5zX2F0dHJpYjsKKwkJQ0hFQ0tfRkNUKGRpYW1lYXBfZ2V0X2Fuc19hdHRyaWJ1dGUoJmRpYW1lYXBfc20tPmFuc19hdHRyaWJ1dGVzLCJGcmFtZWQtSVBYLU5ldHdvcmsiLCZhbnNfYXR0cmliLDEsJnJldCkpOworCQlpZiAoKHJldCA9PSAwKSAmJiAoYW5zX2F0dHJpYiAhPSBOVUxMKSkKKwkJeworCQkJQ0hFQ0tfRkNUKGZkX21zZ19hdnBfbmV3KGRhdGFvYmpfZnJhbWVkX2lweF9uZXR3b3JrLCAwLCAmYXZwKSk7CisJCQlhdnBfdmFsLnUzMiA9IGFuc19hdHRyaWItPnZhbHVlLnUzMjsKKwkJCUNIRUNLX0ZDVChmZF9tc2dfYXZwX3NldHZhbHVlKGF2cCwgJmF2cF92YWwpKTsKKwkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQoIGFucywgTVNHX0JSV19MQVNUX0NISUxELCBhdnAgKSApOworCQkJZnJlZV9hbnNfYXR0cmliKGFuc19hdHRyaWIpOworCQl9CisKKwl9CisJLyogRnJhbWVkLUFwcGxlVGFsay1MaW5rICovCisJeworCQlzdHJ1Y3QgYXZwX2F0dHJpYnV0ZSAqIGFuc19hdHRyaWI7CisJCUNIRUNLX0ZDVChkaWFtZWFwX2dldF9hbnNfYXR0cmlidXRlKCZkaWFtZWFwX3NtLT5hbnNfYXR0cmlidXRlcywiRnJhbWVkLUFwcGxlVGFsay1MaW5rIiwmYW5zX2F0dHJpYiwxLCZyZXQpKTsKKwkJaWYgKChyZXQgPT0gMCkgJiYgKGFuc19hdHRyaWIgIT0gTlVMTCkpCisJCXsKKwkJCUNIRUNLX0ZDVChmZF9tc2dfYXZwX25ldyhkYXRhb2JqX2ZyYW1lZF9hcHBsZXRhbGtfbGluaywgMCwgJmF2cCkpOworCQkJYXZwX3ZhbC51MzIgPSBhbnNfYXR0cmliLT52YWx1ZS51MzI7CisJCQlDSEVDS19GQ1QoZmRfbXNnX2F2cF9zZXR2YWx1ZShhdnAsICZhdnBfdmFsKSk7CisJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkKCBhbnMsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwICkgKTsKKwkJCWZyZWVfYW5zX2F0dHJpYihhbnNfYXR0cmliKTsKKwkJfQorCisJfQorCisJLyogRnJhbWVkLUFwcGxlVGFsay1OZXR3b3JrICovCisJeworCQlzdHJ1Y3QgYXZwX2F0dHJpYnV0ZSAqIGFuc19hdHRyaWI7CisJCUNIRUNLX0ZDVChkaWFtZWFwX2dldF9hbnNfYXR0cmlidXRlKCZkaWFtZWFwX3NtLT5hbnNfYXR0cmlidXRlcywiRnJhbWVkLUFwcGxlVGFsay1OZXR3b3JrIiwmYW5zX2F0dHJpYiwxLCZyZXQpKTsKKwkJd2hpbGUgKChyZXQgPT0gMCkgJiYgKGFuc19hdHRyaWIgIT0gTlVMTCkpCisJCXsKKwkJCUNIRUNLX0ZDVChmZF9tc2dfYXZwX25ldyhkYXRhb2JqX2ZyYW1lZF9hcHBsZXRhbGtfbmV0d29yaywgMCwgJmF2cCkpOworCQkJYXZwX3ZhbC51MzIgPSBhbnNfYXR0cmliLT52YWx1ZS51MzI7CisJCQlDSEVDS19GQ1QoZmRfbXNnX2F2cF9zZXR2YWx1ZShhdnAsICZhdnBfdmFsKSk7CisJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkKCBhbnMsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwICkgKTsKKwkJCWZyZWVfYW5zX2F0dHJpYihhbnNfYXR0cmliKTsKKwkJCUNIRUNLX0ZDVChkaWFtZWFwX2dldF9hbnNfYXR0cmlidXRlKCZkaWFtZWFwX3NtLT5hbnNfYXR0cmlidXRlcywiRnJhbWVkLUFwcGxlVGFsay1OZXR3b3JrIiwmYW5zX2F0dHJpYiwxLCZyZXQpKTsKKwkJfQorCisJfQorCisJLyogRnJhbWVkLUFwcGxlVGFsay1ab25lICovCisJeworCQlzdHJ1Y3QgYXZwX2F0dHJpYnV0ZSAqIGFuc19hdHRyaWI7CisJCUNIRUNLX0ZDVChkaWFtZWFwX2dldF9hbnNfYXR0cmlidXRlKCZkaWFtZWFwX3NtLT5hbnNfYXR0cmlidXRlcywiRnJhbWVkLUFwcGxlVGFsay1ab25lIiwmYW5zX2F0dHJpYiwxLCZyZXQpKTsKKwkJaWYgKChyZXQgPT0gMCkgJiYgKGFuc19hdHRyaWIgIT0gTlVMTCkpCisJCXsKKwkJCUNIRUNLX0ZDVChmZF9tc2dfYXZwX25ldyhkYXRhb2JqX2ZyYW1lZF9hcHBsZXRhbGtfem9uZSwgMCwgJmF2cCkpOworCQkJYXZwX3ZhbC5vcy5kYXRhID0gYW5zX2F0dHJpYi0+dmFsdWUub3MuZGF0YTsKKwkJCWF2cF92YWwub3MubGVuID0gYW5zX2F0dHJpYi0+dmFsdWUub3MubGVuOworCQkJQ0hFQ0tfRkNUKGZkX21zZ19hdnBfc2V0dmFsdWUoYXZwLCAmYXZwX3ZhbCkpOworCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCggYW5zLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCApICk7CisJCQlmcmVlX2Fuc19hdHRyaWIoYW5zX2F0dHJpYik7CisJCX0KKwl9CisKKwkvKiBUdW5uZWxpbmcgKi8KKwkvLworCisJLyogU3RhdGUgKi8KKwkvLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRpYW1lYXBfYWRkX3Jlc3VsdF9jb2RlKHN0cnVjdCBkaWFtZWFwX3N0YXRlX21hY2hpbmUgKiBkaWFtZWFwX3NtLAorCQlzdHJ1Y3QgbXNnICogYW5zLCBzdHJ1Y3Qgc2Vzc2lvbiAqIHNlc3MpCit7CisJVFJBQ0VfRU5UUlkoIiVwICVwIixkaWFtZWFwX3NtLGFucyk7CisJc3RydWN0IGF2cCAqIGF2cDsKKwl1bmlvbiBhdnBfdmFsdWUgYXZwX3ZhbDsKKwlpbnQgcmV0OworCisJLyogUmVzdWx0LUNvZGUgQVZQICovCisJQ0hFQ0tfRkNUKGZkX21zZ19hdnBfbmV3KGRhdGFvYmpfcmVzdWx0X2NvZGUsIDAsICZhdnApKTsKKwlhdnBfdmFsLnUzMiA9IGRpYW1lYXBfc20tPnJlc3VsdF9jb2RlOworCUNIRUNLX0ZDVChmZF9tc2dfYXZwX3NldHZhbHVlKGF2cCwgJmF2cF92YWwpKTsKKwkvKiBBZGQgUmVzdWx0LUNvZGUgQVZQIHRvIHRoZSBtZXNzYWdlICovCisJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCggYW5zLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCApICk7CisKKwkvKiBNdWx0aV9Sb3VuZF9UaW1lX091dCBBVlAgKi8KKwlpZiAoZGlhbWVhcF9zbS0+cmVzdWx0X2NvZGUgPT0gMTAwMSkKKwl7CisJCXN0cnVjdCB0aW1lc3BlYyBzZXNzX3RpbWVvdXQ7CisJCUNIRUNLX0ZDVChmZF9tc2dfYXZwX25ldyhkYXRhb2JqX211bHRpX3JvdW5kX3RpbWVfb3V0LCAwLCAmYXZwKSk7CisJCXN0cnVjdCBhdnBfYXR0cmlidXRlICogYW5zX2F0dHJpYjsKKwkJQ0hFQ0tfRkNUKGRpYW1lYXBfZ2V0X2Fuc19hdHRyaWJ1dGUoJmRpYW1lYXBfc20tPmFuc19hdHRyaWJ1dGVzLCJNdWx0aS1Sb3VuZC1UaW1lLU91dCIsJmFuc19hdHRyaWIsMSwmcmV0KSk7CisJCWlmICgocmV0ID09IDApICYmIChhbnNfYXR0cmliICE9IE5VTEwpKQorCQl7CisJCQlhdnBfdmFsLnUzMiA9IGFuc19hdHRyaWItPnZhbHVlLnUzMjsKKwkJCS8qIFVwZGF0ZSB0aGUgc2Vzc2lvbiB0aW1lb3V0IHdpdGggbXVsdGktcm91bmQtdGltZS1vdXQgdmFsdWUgKi8KKwkJCUNIRUNLX1NZUyhjbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCZzZXNzX3RpbWVvdXQpKTsKKwkJCXNlc3NfdGltZW91dC50dl9zZWMgKz0gZGlhbWVhcF9jb25maWctPm11bHRpX3JvdW5kX3RpbWVfb3V0OworCQkJQ0hFQ0tfRkNUKGZkX3Nlc3Nfc2V0dGltZW91dChzZXNzLCAmc2Vzc190aW1lb3V0KSk7CisJCQlmcmVlX2Fuc19hdHRyaWIoYW5zX2F0dHJpYik7CisJCX0KKwkJZWxzZQorCQl7CisJCQlhdnBfdmFsLnUzMiA9IGRpYW1lYXBfY29uZmlnLT5tdWx0aV9yb3VuZF90aW1lX291dDsKKwkJCS8qIFVwZGF0ZSB0aGUgc2Vzc2lvbiB0aW1lb3V0IHdpdGggbXVsdGktcm91bmQtdGltZS1vdXQgdmFsdWUgKi8KKwkJCUNIRUNLX1NZUyhjbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCZzZXNzX3RpbWVvdXQpKTsKKwkJCXNlc3NfdGltZW91dC50dl9zZWMgKz0gZGlhbWVhcF9jb25maWctPm11bHRpX3JvdW5kX3RpbWVfb3V0OworCQkJQ0hFQ0tfRkNUKGZkX3Nlc3Nfc2V0dGltZW91dChzZXNzLCAmc2Vzc190aW1lb3V0KSk7CisJCX0KKwkJQ0hFQ0tfRkNUKGZkX21zZ19hdnBfc2V0dmFsdWUoYXZwLCAmYXZwX3ZhbCkpOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkKCBhbnMsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwICkgKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGlhbWVhcF9hZGRfZWFwX3BheWxvYWQoc3RydWN0IGRpYW1lYXBfc3RhdGVfbWFjaGluZSAqIGRpYW1lYXBfc20sCisJCXN0cnVjdCBtc2cgKiBhbnMsIHN0cnVjdCBkaWFtZWFwX2VhcF9pbnRlcmZhY2UgKmVhcF9pKQoreworCVRSQUNFX0VOVFJZKCIlcCAlcCIsZGlhbWVhcF9zbSxhbnMpOworCXN0cnVjdCBhdnAgKiBhdnA7CisJdW5pb24gYXZwX3ZhbHVlIGF2cF92YWw7CisJaW50IHJldDsKKwl1MzIgRnJhbWVkX01UVSA9IDE1MDA7IC8vMTUwMCBkZWZhdWx0IHZhbHVlCisJdTMyIE5BU19Qb3J0X1R5cGVfSGVhZGVyTGVuZ3RoID0gNDsKKwlpbnQgRUFQX01heF9MZW5ndGggPSAwOworCisJLyogZ2V0IEZyYW1lZC1NVFUgQVZQIHZhbHVlICovCisJeworCQlzdHJ1Y3QgYXZwX2F0dHJpYnV0ZSAqIGFuc19hdHRyaWI7CisJCUNIRUNLX0ZDVChkaWFtZWFwX2dldF9hbnNfYXR0cmlidXRlKCZkaWFtZWFwX3NtLT5hbnNfYXR0cmlidXRlcywiRnJhbWVkLU1UVSIsJmFuc19hdHRyaWIsMCwmcmV0KSk7CisJCWlmICgocmV0ID09IDApICYmIChhbnNfYXR0cmliICE9IE5VTEwpKQorCQl7CisJCQlGcmFtZWRfTVRVID0gYW5zX2F0dHJpYi0+dmFsdWUudTMyOworCQl9CisJfQorCisJLyogZ2V0IE5BUy1Qb3J0LVR5cGUgQVZQIHZhbHVlICovCisJeworCQlzdHJ1Y3QgYXZwX2F0dHJpYnV0ZSAqIGFuc19hdHRyaWI7CisJCUNIRUNLX0ZDVChkaWFtZWFwX2dldF9hbnNfYXR0cmlidXRlKCZkaWFtZWFwX3NtLT5hbnNfYXR0cmlidXRlcywiTkFTLVBvcnQtVHlwZSIsJmFuc19hdHRyaWIsMCwmcmV0KSk7CisJCWlmICgocmV0ID09IDApICYmIChhbnNfYXR0cmliICE9IE5VTEwpKQorCQl7CisJCQkvLyA9IGFuc19hdHRyaWItPnZhbHVlLmkzMjsKKwkJfQorCX0KKworCS8vVEQgdGFrZSB0aGUgbGluayB0eXBlIGludG8gY29uc2lkZXJhdGlvbiB3aGVuIGNhbGN1bGF0aW5nIEVBUF9NQVhfTGVuZ3RoCisJRUFQX01heF9MZW5ndGggPSBGcmFtZWRfTVRVIC0gTkFTX1BvcnRfVHlwZV9IZWFkZXJMZW5ndGg7CisKKwlpZiAoZWFwX2ktPmFhYUVhcFJlcURhdGEubGVuZ3RoIDw9IEVBUF9NYXhfTGVuZ3RoKQorCXsKKworCQkvKiBFQVAtUGF5bG9hZCBBVlAgKi8KKwkJeworCQkJQ0hFQ0tfRkNUKGZkX21zZ19hdnBfbmV3KGRhdGFvYmpfZWFwX3BheWxvYWQsIDAsICZhdnApKTsKKwkJCWF2cF92YWwub3MuZGF0YSA9IGVhcF9pLT5hYWFFYXBSZXFEYXRhLmRhdGE7CisJCQlhdnBfdmFsLm9zLmxlbiA9IGVhcF9pLT5hYWFFYXBSZXFEYXRhLmxlbmd0aDsKKwkJCUNIRUNLX0ZDVChmZF9tc2dfYXZwX3NldHZhbHVlKGF2cCwgJmF2cF92YWwpKTsKKwkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQoIGFucywgTVNHX0JSV19MQVNUX0NISUxELCBhdnAgKSApOworCisJCQlpZiAoZGlhbWVhcF9zbS0+bGFzdFJlcUVBUGF2cCAhPSBOVUxMKQorCQkJeworCQkJCWZkX21zZ19mcmVlKGRpYW1lYXBfc20tPmxhc3RSZXFFQVBhdnApOworCQkJCWRpYW1lYXBfc20tPmxhc3RSZXFFQVBhdnAgPSBOVUxMOworCQkJfQorCisJCQlDSEVDS19GQ1QoZmRfbXNnX2F2cF9uZXcoZGF0YW9ial9lYXBfcGF5bG9hZCwgMCwgJmRpYW1lYXBfc20tPmxhc3RSZXFFQVBhdnApKTsKKwkJCWF2cF92YWwub3MuZGF0YSA9IGVhcF9pLT5hYWFFYXBSZXFEYXRhLmRhdGE7CisJCQlhdnBfdmFsLm9zLmxlbiA9IGVhcF9pLT5hYWFFYXBSZXFEYXRhLmxlbmd0aDsKKwkJCUNIRUNLX0ZDVChmZF9tc2dfYXZwX3NldHZhbHVlKGRpYW1lYXBfc20tPmxhc3RSZXFFQVBhdnAsICZhdnBfdmFsKSk7CisKKwkJfQorCX0KKwllbHNlCisJeworCQkvL2lmIEVBUCBQYWNrZXQgbGVuZ3RoID4gRUFQX01heF9MZW5ndGgKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGlhbWVhcF9zZW5kKHN0cnVjdCBtc2cgKiogcm1zZykKK3sKKwlUUkFDRV9FTlRSWSgiJXAiLHJtc2cpOworCUNIRUNLX0ZDVCggZmRfbXNnX3NlbmQoIHJtc2csIE5VTEwsIE5VTEwpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkaWFtZWFwX2FkZF9lYXBfc3VjY2Vzc19hdnBzKAorCQlzdHJ1Y3QgZGlhbWVhcF9zdGF0ZV9tYWNoaW5lICogZGlhbWVhcF9zbSwgc3RydWN0IG1zZyAqIGFucywKKwkJc3RydWN0IGRpYW1lYXBfZWFwX2ludGVyZmFjZSAqZWFwX2kpCit7CisJVFJBQ0VfRU5UUlkoIiVwICVwICVwIixkaWFtZWFwX3NtLGFucyxlYXBfaSk7CisJc3RydWN0IGF2cCAqIGF2cDsKKwl1bmlvbiBhdnBfdmFsdWUgYXZwX3ZhbDsKKwlpbnQgcmV0OworCisJLyogRUFQLU1hc3Rlci1TZXNzaW9uLUtleSBBVlAgKi8KKwlpZiAoZWFwX2ktPmFhYUVhcEtleUF2YWlsYWJsZSA9PSBUUlVFKQorCXsKKwkJQ0hFQ0tfRkNUKGZkX21zZ19hdnBfbmV3KGRhdGFvYmpfZWFwX21hc3Rlcl9zZXNzaW9uX2tleSwgMCwgJmF2cCkpOworCQlhdnBfdmFsLm9zLmRhdGEgPSBlYXBfaS0+YWFhRWFwTVNLRGF0YTsKKwkJYXZwX3ZhbC5vcy5sZW4gPSBlYXBfaS0+YWFhRWFwTVNLTGVuZ3RoOworCQlDSEVDS19GQ1QoZmRfbXNnX2F2cF9zZXR2YWx1ZShhdnAsICZhdnBfdmFsKSk7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQoIGFucywgTVNHX0JSV19MQVNUX0NISUxELCBhdnAgKSApOworCisJfQorCisJLyogRUFQLUtleS1OYW1lIEFWUCAqLworCXN0cnVjdCBhdnBfYXR0cmlidXRlICogYXZwX2F0dHJpYiA9IE5VTEw7CisKKwlDSEVDS19GQ1QoZGlhbWVhcF9nZXRfYXZwX2F0dHJpYnV0ZSgmZGlhbWVhcF9zbS0+cmVxX2F0dHJpYnV0ZXMsIkVBUC1LZXktTmFtZSIsJmF2cF9hdHRyaWIsMSwmcmV0KSkKKwlpZiAoKGF2cF9hdHRyaWIgIT0gTlVMTCkgJiYgKHJldCAhPSAxKSkKKwl7CisJCWlmIChhdnBfYXR0cmliLT52YWx1ZS5vcy5sZW4gPT0gMCkKKwkJeworCQkJQ0hFQ0tfRkNUKGZkX21zZ19hdnBfbmV3KGRhdGFvYmpfZWFwX2tleV9uYW1lLCAwLCAmYXZwKSk7CisJCQlhdnBfdmFsLm9zLmRhdGEgPSBOVUxMOy8vCisJCQlhdnBfdmFsLm9zLmxlbiA9IDA7Ly8KKwkJCUNIRUNLX0ZDVChmZF9tc2dfYXZwX3NldHZhbHVlKGF2cCwgJmF2cF92YWwpKTsKKwkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQoIGFucywgTVNHX0JSV19MQVNUX0NISUxELCBhdnAgKSApOworCQkJZnJlZV9hdnBfYXR0cmliKGF2cF9hdHRyaWIpOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBkaWFtZWFwX2F1dGhvcml6ZShzdHJ1Y3QgZGlhbWVhcF9zdGF0ZV9tYWNoaW5lICogZGlhbWVhcF9zbSkKK3sKKwlUUkFDRV9FTlRSWSgiJXAiLGRpYW1lYXBfc20pOworCisJQ0hFQ0tfRkNUKGRpYW1lYXBfYXV0aG9yaXphdGlvbl9nZXRfYXR0cmlicygmZGlhbWVhcF9zbS0+ZWFwX3NtLnVzZXIsICZkaWFtZWFwX3NtLT5hdHRyaWJ1dGVzKSk7CisKKwlkaWFtZWFwX3NtLT5hdXRob3JpemVkID0gVFJVRTsKKworCUNIRUNLX0ZDVF9ETyhkaWFtZWFwX2Fuc3dlcl9hdXRob3JpemF0aW9uX2F0dHJpYnV0ZXMoZGlhbWVhcF9zbSksCisJKTsKKwlpZiAoZGlhbWVhcF9zbS0+YXV0aG9yaXplZCA9PSBGQUxTRSkKKwl7CisJCWRpYW1lYXBfc20tPnJlc3VsdF9jb2RlID0gNDAwMTsgLyogRElBTUVURVJfQVVUSEVOVElDQVRJT05fUkVKRUNURUQgNDAwMSAqLworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkaWFtZWFwX2FkZF9hY2NvdW50aW5nX2VhcF9hdXRoX21ldGhvZCgKKwkJc3RydWN0IGRpYW1lYXBfc3RhdGVfbWFjaGluZSAqIGRpYW1lYXBfc20sIHN0cnVjdCBtc2cgKiBhbnMpCit7CisJVFJBQ0VfRU5UUlkoIiVwICVwIixkaWFtZWFwX3NtLGFucyk7CisJaW50IGkgPSAwOworCXN0cnVjdCBhdnAgKiBhdnA7CisJdW5pb24gYXZwX3ZhbHVlIGF2cF92YWw7CisJLyogQWNjb3VudGluZy1FQVAtQXV0aC1NZXRob2QgQVZQICovCisJd2hpbGUgKGkgPCBkaWFtZWFwX3NtLT5lYXBfc20udXNlci5tZXRob2RJZCkKKwl7CisJCUNIRUNLX0ZDVChmZF9tc2dfYXZwX25ldyhkYXRhb2JqX2FjY291bnRpbmdfZWFwX2F1dGhfbWV0aG9kLCAwLCAmYXZwKSk7CisKKwkJYXZwX3ZhbC51NjQgPSAodTY0KSAoKChkaWFtZWFwX3NtLT5lYXBfc20udXNlci5tZXRob2RzW2ldLnZlbmRvcikKKwkJCQkqIHBvdygoZG91YmxlKSAyLCAoZG91YmxlKSAzMikpCisJCQkJKyBkaWFtZWFwX3NtLT5lYXBfc20udXNlci5tZXRob2RzW2ldLm1ldGhvZCk7CisJCUNIRUNLX0ZDVChmZF9tc2dfYXZwX3NldHZhbHVlKGF2cCwgJmF2cF92YWwpKTsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCggYW5zLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCApICk7CisJCWkrKzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGlhbWVhcF9hZGRfZWFwX3JlaXNzdWVkX3BheWxvYWQoc3RydWN0IG1zZyAqIGFucywgc3RydWN0IG1zZyAqIHJlcSkKK3sKKwlUUkFDRV9FTlRSWSgiJXAgJXAiLCBhbnMsIHJlcSk7CisJc3RydWN0IGF2cCAqIGF2cCwgKnJlX2F2cDsKKwl1bmlvbiBhdnBfdmFsdWUgYXZwX3ZhbDsKKwlzdHJ1Y3QgYXZwX2hkciAqIGF2cGhkcjsKKworCWlmICgoYW5zID09IE5VTEwpIHx8IChyZXEgPT0gTlVMTCkpCisJeworCQlyZXR1cm4gRUlOVkFMOworCX0KKwlhdnAgPSBOVUxMOworCUNIRUNLX0ZDVChmZF9tc2dfc2VhcmNoX2F2cChyZXEsIGRhdGFvYmpfZWFwX3BheWxvYWQsICZhdnApKTsKKwlpZiAoYXZwICE9IE5VTEwpCisJeworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfaGRyKGF2cCwgJmF2cGhkcikpOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3KGRhdGFvYmpfZWFwX3JlaXNzdWVkX3BheWxvYWQsIDAsICZyZV9hdnApKTsKKwkJQ0hFQ0tfTUFMTE9DKGF2cF92YWwub3MuZGF0YT1tYWxsb2MoYXZwaGRyLT5hdnBfdmFsdWUtPm9zLmxlbikpOworCQltZW1jcHkoYXZwX3ZhbC5vcy5kYXRhLGF2cGhkci0+YXZwX3ZhbHVlLT5vcy5kYXRhLGF2cGhkci0+YXZwX3ZhbHVlLT5vcy5sZW4pOworCQlhdnBfdmFsLm9zLmxlbiA9IGF2cGhkci0+YXZwX3ZhbHVlLT5vcy5sZW47CisJCUNIRUNLX0ZDVChmZF9tc2dfYXZwX3NldHZhbHVlKHJlX2F2cCwgJmF2cF92YWwpKTsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCggYW5zLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIHJlX2F2cCApICk7CisJfQorCWVsc2UKKwl7CisJCVRSQUNFX0RFQlVHKElORk8sIiVzVW5hYmxlIHRvIGZpbmQgRUFQLVBheWxvYWQgQVZQIGluIHJlY2VpdmVkIERpYW1ldGVyLUVBUC1SZXF1ZXN0LiIsRElBTUVBUF9FWFRFTlNJT04pOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisKKworc3RhdGljIGludCBkaWFtZWFwX3NlcnZlcl9jYWxsYmFjayhzdHJ1Y3QgbXNnICoqIHJtc2csIHN0cnVjdCBhdnAgKiByYXZwLAorCQlzdHJ1Y3Qgc2Vzc2lvbiAqIHNlc3MsIHZvaWQgKiBvcGFxdWUsIGVudW0gZGlzcF9hY3Rpb24gKiBhY3Rpb24pCit7CisJVFJBQ0VfRU5UUlkoIiVwICVwICVwICVwIiwgcm1zZywgcmF2cCwgc2VzcywgYWN0aW9uKTsKKworCXN0cnVjdCBzZXNzX3N0YXRlICogZGlhbWVhcF9zZXNzX2RhdGEgPSBOVUxMOworCXN0cnVjdCBkaWFtZWFwX3N0YXRlX21hY2hpbmUgKiBkaWFtZWFwX3NtID0gTlVMTDsKKwlzdHJ1Y3QgZGlhbWVhcF9lYXBfaW50ZXJmYWNlIGVhcF9pOworCXN0cnVjdCBtc2cgKnJlcSwgKmFuczsKKwlib29sZWFuIG5vbl9mYXRhbF9lcnJvciA9IEZBTFNFOworCisJaWYgKHJtc2cgPT0gTlVMTCkKKwkJcmV0dXJuIEVJTlZBTDsKKworCXJlcSA9ICpybXNnOworCisJQ0hFQ0tfRkNUX0RPKGZkX3Nlc3Nfc3RhdGVfcmV0cmlldmUoZGlhbWVhcF9zZXJ2ZXJfcmVnLCBzZXNzLCAmZGlhbWVhcF9zZXNzX2RhdGEpLAorCQkJewlUUkFDRV9ERUJVRyhJTkZPLCIlcyByZXRyaWV2aW5nIHNlc3Npb24gc3RhdGUgZmFpbGVkLiIsRElBTUVBUF9FWFRFTlNJT04pOyBnb3RvIHNfZW5kO30pOworCisJQ0hFQ0tfTUFMTE9DX0RPKGRpYW1lYXBfc20gPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBkaWFtZWFwX3N0YXRlX21hY2hpbmUpKSwKKwkJCWdvdG8gc19lbmQpOworCW1lbXNldChkaWFtZWFwX3NtLCAwLCBzaXplb2Yoc3RydWN0IGRpYW1lYXBfc3RhdGVfbWFjaGluZSkpOworCisJaWYgKGRpYW1lYXBfc2Vzc19kYXRhKQorCXsKKwkJZGlhbWVhcF9zbS0+c3RhdGUgPSBESUFNRUFQX1JFQ0VJVkVEOworCQlkaWFtZWFwX3NtLT5lYXBfc20uZWFwX3N0YXRlID0gRUFQX0lETEU7CisJfQorCWVsc2UKKwl7CisJCWRpYW1lYXBfc20tPnN0YXRlID0gRElBTUVBUF9ESVNBQkxFRDsKKwkJZGlhbWVhcF9zbS0+ZWFwX3NtLmVhcF9zdGF0ZSA9IEVBUF9JTklUSUFMSVpFOworCX0KKworCXdoaWxlIChkaWFtZWFwX3NtLT5zdGF0ZSAhPSBESUFNRUFQX0lETEUgJiYgZGlhbWVhcF9zbS0+c3RhdGUKKwkJCSE9IERJQU1FQVBfRU5EKQorCXsKKwkJc3dpdGNoIChkaWFtZWFwX3NtLT5zdGF0ZSkKKwkJeworCQljYXNlIERJQU1FQVBfRElTQUJMRUQ6CisJCQlpZiAocm1zZykKKwkJCXsKKwkJCQlkaWFtZWFwX3NtLT5zdGF0ZSA9IERJQU1FQVBfSU5JVElBTElaRTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlUUkFDRV9ERUJVRyhJTkZPLCIlc1JlY2VpdmVkIGVtcHR5IERpYW1ldGVyIEVBUCBSZXF1ZXN0IG1lc3NhZ2UuIixESUFNRUFQX0VYVEVOU0lPTik7CisJCQkJZ290byBzX2VuZDsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgRElBTUVBUF9JTklUSUFMSVpFOgorCisJCQlDSEVDS19GQ1RfRE8oZGlhbWVhcF9pbml0aWFsaXplX2RpYW1lYXBfc20oZGlhbWVhcF9zbSxkaWFtZWFwX3Nlc3NfZGF0YSksCisJCQkJCXsJVFJBQ0VfREVCVUcoSU5GTywiJXMgSW5pdGlhbGl6aW5nIERpYW1FQVAgc3RhdGUgbWFjaGluZSBmYWlsZWQuIixESUFNRUFQX0VYVEVOU0lPTik7IGdvdG8gc19lbmQ7fSkKKwkJCTsKKwkJCUNIRUNLX0ZDVF9ETyhkaWFtZWFwX2luaXRpYWxpemVfZGlhbWVhcF9lYXBfaW50ZXJmYWNlKCZlYXBfaSksCisJCQkJCXsJVFJBQ0VfREVCVUcoSU5GTywiJXMgSW5pdGlhbGl6aW5nIERpYW1FQVAtRUFQIEludGVyZmFjZSBmYWlsZWQuIixESUFNRUFQX0VYVEVOU0lPTik7IGdvdG8gc19lbmQ7fSkKKwkJCTsKKwkJCVRSQUNFX0RFQlVHKEZVTEwrMSwiJXNQYXJzaW5nIEFWUHMiLERJQU1FQVBfRVhURU5TSU9OKQorCQkJOworCQkJQ0hFQ0tfRkNUX0RPKGRpYW1lYXBfcGFyc2VfYXZwcyhkaWFtZWFwX3NtLCByZXEsICZlYXBfaSksIFRSQUNFX0RFQlVHKElORk8sIiVzIFVuYWJsZSB0byBwYXJzZSBEaWFtZXRlci1FQVAtUmVxdWVzdCBBVlBzLiIsRElBTUVBUF9FWFRFTlNJT04pKQorCQkJOworCisJCQlpZiAoKGRpYW1lYXBfc20tPnJlc3VsdF9jb2RlICE9IDApKQorCQkJeworCQkJCWRpYW1lYXBfc20tPnN0YXRlID0gRElBTUVBUF9TRU5EX0VSUk9SX01TRzsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlkaWFtZWFwX3NtLT5zdGF0ZSA9IERJQU1FQVBfQVVUSEVOVElDQVRJT05fVkVSSUZZOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBESUFNRUFQX1JFQ0VJVkVEOgorCisJCQlDSEVDS19GQ1RfRE8oZGlhbWVhcF9pbml0aWFsaXplX2RpYW1lYXBfc20oZGlhbWVhcF9zbSxkaWFtZWFwX3Nlc3NfZGF0YSksCisJCQkJCXsJVFJBQ0VfREVCVUcoSU5GTywiJXMgSW5pdGlhbGl6aW5nIERpYW1FQVAgc3RhdGUgbWFjaGluZSBmYWlsZWQuIixESUFNRUFQX0VYVEVOU0lPTik7IGdvdG8gc19lbmQ7fSkKKwkJCTsKKwkJCUNIRUNLX0ZDVF9ETyhkaWFtZWFwX2luaXRpYWxpemVfZGlhbWVhcF9lYXBfaW50ZXJmYWNlKCZlYXBfaSksCisJCQkJCXsJVFJBQ0VfREVCVUcoSU5GTywiJXMgSW5pdGlhbGl6aW5nIERpYW1FQVAtRUFQIEludGVyZmFjZSBmYWlsZWQuIixESUFNRUFQX0VYVEVOU0lPTik7IGdvdG8gc19lbmQ7fSkKKwkJCTsKKwkJCVRSQUNFX0RFQlVHKEZVTEwrMSwiJXNQYXJzaW5nIEFWUHMiLERJQU1FQVBfRVhURU5TSU9OKQorCQkJOworCQkJQ0hFQ0tfRkNUX0RPKGRpYW1lYXBfcGFyc2VfYXZwcyhkaWFtZWFwX3NtLCByZXEsICZlYXBfaSksIFRSQUNFX0RFQlVHKElORk8sIiVzIFVuYWJsZSB0byBwYXJzZSBEaWFtZXRlci1FQVAtUmVxdWVzdCBBVlBzLiIsRElBTUVBUF9FWFRFTlNJT04pKQorCQkJOworCisJCQlpZiAoZGlhbWVhcF9zbS0+cmVzdWx0X2NvZGUgIT0gMCkKKwkJCXsKKwkJCQlkaWFtZWFwX3NtLT5zdGF0ZSA9IERJQU1FQVBfU0VORF9FUlJPUl9NU0c7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJZGlhbWVhcF9zbS0+c3RhdGUgPSBESUFNRUFQX0FVVEhFTlRJQ0FUSU9OX1ZFUklGWTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgRElBTUVBUF9BVVRIRU5USUNBVElPTl9WRVJJRlk6CisJCXsKKworCQkJVFJBQ0VfREVCVUcoRlVMTCsxLCIlc1ZlcmlmeSBhdXRoZW50aWNhdGlvbiIsRElBTUVBUF9FWFRFTlNJT04pOworCQkJQ0hFQ0tfRkNUX0RPKGRpYW1lYXBfZWFwX3N0YXRlbWFjaGluZSgmZGlhbWVhcF9zbS0+ZWFwX3NtLCAmZWFwX2ksJm5vbl9mYXRhbF9lcnJvciksCisJCQkJCXsJVFJBQ0VfREVCVUcoSU5GTywiJXMgRUFQIHByb2Nlc3MgZmFpbGVkLiIsRElBTUVBUF9FWFRFTlNJT04pOyBnb3RvIHNfZW5kO30pOworCisJCQlpZiAobm9uX2ZhdGFsX2Vycm9yID09IFRSVUUpCisJCQl7CisJCQkJVFJBQ0VfREVCVUcoRlVMTCsxLCIlc0F1dGhlbnRpY2F0aW9uIHZlcmlmeSBmaW5pc2hlZCB3aXRoIGEgbm9uLWZhdGFsLWVycm9yLiIsRElBTUVBUF9FWFRFTlNJT04pOworCQkJCWRpYW1lYXBfc20tPnN0YXRlID0gRElBTUVBUF9TRU5EX0VSUk9SX01TRzsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlkaWFtZWFwX3NtLT5zdGF0ZSA9IERJQU1FQVBfU0VMRUNUX0RFQ0lTSU9OOworCisJCQl9CisJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgRElBTUVBUF9TRUxFQ1RfREVDSVNJT046CisKKwkJCUNIRUNLX0ZDVF9ETyggZGlhbWVhcF9wb2xpY3lfZGVjaXNpb24oZGlhbWVhcF9zbSwmZWFwX2kpLAorCQkJCQlnb3RvIHNfZW5kKQorCQkJOworCisJCQlpZiAoKGVhcF9pLmFhYVN1Y2Nlc3MgPT0gVFJVRSkgJiYgKGRpYW1lYXBfc20tPmF1dGhfcmVxdWVzdF92YWwKKwkJCQkJPT0gQVVUSE9SSVpFX0FVVEhFTlRJQ0FURSkKKwkJCQkJJiYgKGRpYW1lYXBfc20tPnZlcmlmeV9hdXRob3JpemF0aW9uID09IEZBTFNFKSkKKwkJCXsKKwkJCQlkaWFtZWFwX3NtLT5zdGF0ZSA9IERJQU1FQVBfQVVUSE9SSVpBVElPTl9WRVJJRlk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJZGlhbWVhcF9zbS0+c3RhdGUgPSBESUFNRUFQX0RJQU1FVEVSX0VBUF9BTlNXRVI7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIERJQU1FQVBfQVVUSE9SSVpBVElPTl9WRVJJRlk6CisJCQlkaWFtZWFwX3NtLT52ZXJpZnlfYXV0aG9yaXphdGlvbiA9IFRSVUU7CisJCQlUUkFDRV9ERUJVRyhGVUxMKzEsIiVzVmVyaWZ5IGF1dGhvcml6YXRpb24iLERJQU1FQVBfRVhURU5TSU9OKQorCQkJOworCQkJQ0hFQ0tfRkNUX0RPKGRpYW1lYXBfYXV0aG9yaXplKGRpYW1lYXBfc20pLAorCQkJCQl7CVRSQUNFX0RFQlVHKElORk8sIiVzIEF1dGhvcml6YXRpb24gY2hlY2sgcHJvY2VzcyBmYWlsZWQuIixESUFNRUFQX0VYVEVOU0lPTik7IGdvdG8gc19lbmQ7fSkKKwkJCTsKKwkJCWRpYW1lYXBfc20tPnN0YXRlID0gRElBTUVBUF9TRUxFQ1RfREVDSVNJT047CisKKwkJCWJyZWFrOworCisJCWNhc2UgRElBTUVBUF9ESUFNRVRFUl9FQVBfQU5TV0VSOgorCQkJVFJBQ0VfREVCVUcoRlVMTCsxLCIlc2NyZWF0ZSBEaWFtZXRlciBFQVAgQW5zd2VyIixESUFNRUFQX0VYVEVOU0lPTikKKwkJCTsKKwkJCUNIRUNLX0ZDVF9ETyhmZF9tc2dfbmV3X2Fuc3dlcl9mcm9tX3JlcShmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIHJtc2csIDApLAorCQkJCQlnb3RvIHNfZW5kKQorCQkJOworCQkJYW5zID0gKnJtc2c7CisJCQlUUkFDRV9ERUJVRyhGVUxMKzEsIiVzQWRkaW5nIEFWUHMgdG8gRGlhbWV0ZXIgRUFQIEFuc3dlci4iLERJQU1FQVBfRVhURU5TSU9OKQorCQkJOworCQkJQ0hFQ0tfRkNUX0RPKCBkaWFtZWFwX2FkZF9hdnBzKGRpYW1lYXBfc20sIGFucyxyZXEpLAorCQkJCQl7CVRSQUNFX0RFQlVHKElORk8sIiVzIFVuYWJsZSB0byBhZGQgQVZQcyB0byBEaWFtZXRlci1FQVAtQW5zd2VyIG1lc3NhZ2UuIixESUFNRUFQX0VYVEVOU0lPTik7Z290byBzX2VuZDt9KQorCQkJOworCQkJaWYgKGRpYW1lYXBfc20tPmF1dGhGYWlsdXJlID09IEZBTFNFKQorCQkJeworCQkJCWlmIChkaWFtZWFwX3NtLT5lYXBfc20udXNlci5pZCAhPSAwKQorCQkJCXsKKwkJCQkJVFJBQ0VfREVCVUcoRlVMTCsxLCIlc1NlbGVjdCBhdXRoZW50aWNhdGlvbiBhdHRyaWJ1dGVzLiIsRElBTUVBUF9FWFRFTlNJT04pOworCQkJCQlDSEVDS19GQ1RfRE8oZGlhbWVhcF9hdXRoZW50aWNhdGlvbl9nZXRfYXR0cmlicygmZGlhbWVhcF9zbS0+ZWFwX3NtLnVzZXIsICZkaWFtZWFwX3NtLT5hdHRyaWJ1dGVzKSwKKwkJCQkJCQl7CVRSQUNFX0RFQlVHKElORk8sIiVzIFVuYWJsZSB0byBnZXQgdXNlcidzIHNlc3Npb24gYXR0cmlidXRlcy4iLERJQU1FQVBfRVhURU5TSU9OKTsgZ290byBzX2VuZDt9KTsKKwkJCQkJVFJBQ0VfREVCVUcoRlVMTCsxLCIlc0NyZWF0ZSBhbnN3ZXIgYXV0aGVudGljYXRpb24gYXR0cmlidXRlcy4iLERJQU1FQVBfRVhURU5TSU9OKTsKKwkJCQkJQ0hFQ0tfRkNUX0RPKGRpYW1lYXBfYW5zd2VyX2F2cF9hdHRyaWJ1dGVzKGRpYW1lYXBfc20pLAorCQkJCQkJCXsJVFJBQ0VfREVCVUcoSU5GTywiJXMgVW5hYmxlIHRvIGdlbmVyYXRlIGFuc3dlciBhdHRyaWJ1dGVzLiIsRElBTUVBUF9FWFRFTlNJT04pOyBnb3RvIHNfZW5kO30pOworCQkJCX0KKworCQkJCWlmIChkaWFtZWFwX3NtLT5hdXRoU3VjY2VzcyA9PSBGQUxTRSkKKwkJCQl7CisJCQkJCWRpYW1lYXBfc20tPnN0YXRlID0gRElBTUVBUF9TRU5EX1JFUVVFU1Q7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisKKwkJCQkJZGlhbWVhcF9zbS0+c3RhdGUgPSBESUFNRUFQX1NFTkRfU1VDQ0VTUzsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJZGlhbWVhcF9zbS0+c3RhdGUgPSBESUFNRUFQX1NFTkRfRkFJTFVSRTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgRElBTUVBUF9TRU5EX1JFUVVFU1Q6CisJCQlUUkFDRV9ERUJVRyhGVUxMKzEsIiVzQWRkaW5nIFJlc3VsdCBDb2RlIEFWUCB0byBEaWFtZXRlci1FQVAtQW5zd2VyLiIsRElBTUVBUF9FWFRFTlNJT04pCisJCQk7CisJCQlDSEVDS19GQ1RfRE8oIGRpYW1lYXBfYWRkX3Jlc3VsdF9jb2RlKGRpYW1lYXBfc20sIGFucywgc2VzcyksCisJCQkJCXsJVFJBQ0VfREVCVUcoSU5GTywiJXMgQWRkaW5nIFJlc3VsdC1Db2RlIEFWUCBmYWlsZWQuIixESUFNRUFQX0VYVEVOU0lPTik7IGdvdG8gc19lbmQ7fSkKKwkJCTsKKwkJCVRSQUNFX0RFQlVHKEZVTEwrMSwiJXNBZGRpbmcgRUFQLVBheWxvYWQgdG8gRGlhbWV0ZXItRUFQLUFuc3dlci4iLERJQU1FQVBfRVhURU5TSU9OKQorCQkJOworCQkJQ0hFQ0tfRkNUX0RPKCBkaWFtZWFwX2FkZF9lYXBfcGF5bG9hZChkaWFtZWFwX3NtLCBhbnMsJmVhcF9pKSwKKwkJCQkJewlUUkFDRV9ERUJVRyhJTkZPLCIlcyBBZGRpbmcgRUFQLVBheWxvYWQgQVZQIGZhaWxlZC4iLERJQU1FQVBfRVhURU5TSU9OKTsgZ290byBzX2VuZDt9KQorCQkJOworCQkJVFJBQ0VfREVCVUcoRlVMTCsxLCIlc1N0b3JpbmcgRGlhbUVBUCBzZXNzaW9uIGRhdGEuIixESUFNRUFQX0VYVEVOU0lPTikKKwkJCTsKKwkJCUNIRUNLX01BTExPQyhkaWFtZWFwX3Nlc3NfZGF0YSA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHNlc3Nfc3RhdGUpKSkKKwkJCTsKKwkJCW1lbXNldChkaWFtZWFwX3Nlc3NfZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBzZXNzX3N0YXRlKSk7CisJCQlkaWFtZWFwX3Nlc3NfZGF0YV9uZXcoZGlhbWVhcF9zZXNzX2RhdGEsIGRpYW1lYXBfc20pOworCisJCQlDSEVDS19GQ1RfRE8oZmRfc2Vzc19zdGF0ZV9zdG9yZShkaWFtZWFwX3NlcnZlcl9yZWcsIHNlc3MsICZkaWFtZWFwX3Nlc3NfZGF0YSksCisJCQkJCXsJVFJBQ0VfREVCVUcoSU5GTywiJXMgU3RvcmluZyBzZXNzaW9uIHN0YXRlIGZhaWxlZC4iLERJQU1FQVBfRVhURU5TSU9OKTsgZ290byBzX2VuZDt9KQorCQkJOworCisJCQlDSEVDS19GQ1RfRE8oIGRpYW1lYXBfc2VuZChybXNnKSwKKwkJCQkJZ290byBzX2VuZCkKKwkJCTsKKworCQkJZGlhbWVhcF9zbS0+c3RhdGUgPSBESUFNRUFQX0lETEU7CisJCQlicmVhazsKKworCQljYXNlIERJQU1FQVBfU0VORF9GQUlMVVJFOgorCQkJVFJBQ0VfREVCVUcoRlVMTCsxLCIlc0FkZGluZyBSZXN1bHQgQ29kZSBBVlAgdG8gRGlhbWV0ZXItRUFQLUFuc3dlci4iLERJQU1FQVBfRVhURU5TSU9OKQorCQkJOworCQkJQ0hFQ0tfRkNUX0RPKCBkaWFtZWFwX2FkZF9yZXN1bHRfY29kZShkaWFtZWFwX3NtLCBhbnMsIHNlc3MpLAorCQkJCQl7CVRSQUNFX0RFQlVHKElORk8sIiVzIEFkZGluZyBSZXN1bHQtQ29kZSBBVlAgZmFpbGVkLiIsRElBTUVBUF9FWFRFTlNJT04pOyBnb3RvIHNfZW5kO30pCisJCQk7CisJCQlUUkFDRV9ERUJVRyhGVUxMKzEsIiVzQWRkaW5nIEVBUC1QYXlsb2FkIHRvIERpYW1ldGVyLUVBUC1BbnN3ZXIuIixESUFNRUFQX0VYVEVOU0lPTikKKwkJCTsKKwkJCUNIRUNLX0ZDVF9ETyggZGlhbWVhcF9hZGRfZWFwX3BheWxvYWQoZGlhbWVhcF9zbSwgYW5zLCZlYXBfaSksCisJCQkJCXsJVFJBQ0VfREVCVUcoSU5GTywiJXMgQWRkaW5nIEVBUC1QYXlsb2FkIEFWUCBmYWlsZWQuIixESUFNRUFQX0VYVEVOU0lPTik7IGdvdG8gc19lbmQ7fSkKKwkJCTsKKworCQkJTE9HX04oIiVzIEF1dGggRkFJTDogJS4qcyIsRElBTUVBUF9FWFRFTlNJT04sIGRpYW1lYXBfc20tPmVhcF9zbS51c2VyLnVzZXJpZExlbmd0aCwgZGlhbWVhcF9zbS0+ZWFwX3NtLnVzZXIudXNlcmlkKTsKKwkJCQorCQkJQ0hFQ0tfRkNUX0RPKCBkaWFtZWFwX3NlbmQocm1zZyksCisJCQkJCWdvdG8gc19lbmQpCisJCQk7CisJCQlkaWFtZWFwX3NtLT5zdGF0ZSA9IERJQU1FQVBfRU5EOworCQkJYnJlYWs7CisKKwkJY2FzZSBESUFNRUFQX1NFTkRfU1VDQ0VTUzoKKwkJCVRSQUNFX0RFQlVHKEZVTEwrMSwiJXNBZGRpbmcgVXNlciBzZXNzaW9uIEFWUHMgdG8gRGlhbWV0ZXItRUFQLUFuc3dlci4iLERJQU1FQVBfRVhURU5TSU9OKQorCQkJOworCQkJQ0hFQ0tfRkNUX0RPKGRpYW1lYXBfYWRkX3VzZXJfc2Vzc2lvbnNfYXZwcyhkaWFtZWFwX3NtLGFucyksCisJCQkJCXsJVFJBQ0VfREVCVUcoSU5GTywiJXMgQWRkaW5nIHVzZXIncyBzZXNzaW9uIEFWUHMgZmFpbGVkLiIsRElBTUVBUF9FWFRFTlNJT04pOyBnb3RvIHNfZW5kO30pCisJCQk7CisKKwkJCWlmIChkaWFtZWFwX3NtLT5hdXRoX3JlcXVlc3RfdmFsID09IEFVVEhPUklaRV9BVVRIRU5USUNBVEUpCisJCQl7CisJCQkJVFJBQ0VfREVCVUcoRlVMTCsxLCIlc0FkZGluZyBBdXRob3JpemF0aW9uIEFWUHMgdG8gRGlhbWV0ZXItRUFQLUFuc3dlci4iLERJQU1FQVBfRVhURU5TSU9OKTsKKwkJCQlDSEVDS19GQ1RfRE8oZGlhbWVhcF9hZGRfYXV0aG9yaXphdGlvbl9hdnBzKGRpYW1lYXBfc20sYW5zKSwKKwkJCQkJCXsJVFJBQ0VfREVCVUcoSU5GTywiJXMgQWRkaW5nIEF1dGhvcml6YXRpb24gQVZQcyBmYWlsZWQuIixESUFNRUFQX0VYVEVOU0lPTik7IGdvdG8gc19lbmQ7fSk7CisJCQl9CisJCQlUUkFDRV9ERUJVRyhGVUxMKzEsIiVzQWRkaW5nIFJlc3VsdCBDb2RlIEFWUCB0byBEaWFtZXRlci1FQVAtQW5zd2VyLiIsRElBTUVBUF9FWFRFTlNJT04pCisJCQk7CisJCQlDSEVDS19GQ1RfRE8oIGRpYW1lYXBfYWRkX3Jlc3VsdF9jb2RlKGRpYW1lYXBfc20sIGFucywgc2VzcyksCisJCQkJCXsJVFJBQ0VfREVCVUcoSU5GTywiJXMgQWRkaW5nIFJlc3VsdC1Db2RlIEFWUCBmYWlsZWQuIixESUFNRUFQX0VYVEVOU0lPTik7IGdvdG8gc19lbmQ7fSkKKwkJCTsKKwkJCVRSQUNFX0RFQlVHKEZVTEwrMSwiJXNBZGRpbmcgRUFQLVBheWxvYWQgdG8gRGlhbWV0ZXItRUFQLUFuc3dlci4iLERJQU1FQVBfRVhURU5TSU9OKQorCQkJOworCQkJQ0hFQ0tfRkNUX0RPKCBkaWFtZWFwX2FkZF9lYXBfcGF5bG9hZChkaWFtZWFwX3NtLCBhbnMsJmVhcF9pKSwKKwkJCQkJewlUUkFDRV9ERUJVRyhJTkZPLCIlcyBBZGRpbmcgRUFQLVBheWxvYWQgQVZQIGZhaWxlZC4iLERJQU1FQVBfRVhURU5TSU9OKTsgZ290byBzX2VuZDt9KQorCQkJOworCQkJVFJBQ0VfREVCVUcoRlVMTCsxLCIlc0FkZGluZyBFQVAgc3VjY2VzcyBBVlBzIEFWUHMgdG8gRGlhbWV0ZXItRUFQLUFuc3dlci4iLERJQU1FQVBfRVhURU5TSU9OKQorCQkJOworCQkJQ0hFQ0tfRkNUX0RPKCBkaWFtZWFwX2FkZF9lYXBfc3VjY2Vzc19hdnBzKGRpYW1lYXBfc20sIGFucywgJmVhcF9pKSwKKwkJCQkJZ290byBzX2VuZCkKKwkJCTsKKwkJCVRSQUNFX0RFQlVHKEZVTEwrMSwiJXNBZGRpbmcgQWNjb3VudGluZy1FQVAtQXV0aC1NZXRob2QgQVZQcyB0byBEaWFtZXRlci1FQVAtQW5zd2VyLiIsRElBTUVBUF9FWFRFTlNJT04pCisJCQk7CisJCQlDSEVDS19GQ1RfRE8oZGlhbWVhcF9hZGRfYWNjb3VudGluZ19lYXBfYXV0aF9tZXRob2QoZGlhbWVhcF9zbSwgYW5zKSwKKwkJCQkJewlUUkFDRV9ERUJVRyhJTkZPLCIlcyBBZGRpbmcgYWNjb3VudGluZyBBVlAgZmFpbGVkIixESUFNRUFQX0VYVEVOU0lPTik7IGdvdG8gc19lbmQ7fSkKKwkJCTsKKwkJCQorCQkJTE9HX04oIiVzIEF1dGggU3VjY2VzczogJS4qcyIsRElBTUVBUF9FWFRFTlNJT04sIGRpYW1lYXBfc20tPmVhcF9zbS51c2VyLnVzZXJpZExlbmd0aCwgZGlhbWVhcF9zbS0+ZWFwX3NtLnVzZXIudXNlcmlkKTsKKwkJCQorCQkJQ0hFQ0tfRkNUX0RPKCBkaWFtZWFwX3NlbmQocm1zZyksCisJCQkJCWdvdG8gc19lbmQpCisJCQk7CisJCQlkaWFtZWFwX3NtLT5zdGF0ZSA9IERJQU1FQVBfRU5EOworCQkJYnJlYWs7CisKKwkJY2FzZSBESUFNRUFQX1NFTkRfRVJST1JfTVNHOgorCQkJZGlhbWVhcF9zbS0+aW52YWxpZF9lYXBwYWNrZXRzKys7CisJCQlpZiAoZGlhbWVhcF9zbS0+aW52YWxpZF9lYXBwYWNrZXRzCisJCQkJCT09IGRpYW1lYXBfY29uZmlnLT5tYXhfaW52YWxpZF9lYXBfcGFja2V0KQorCQkJeworCQkJCWRpYW1lYXBfc20tPnJlc3VsdF9jb2RlID0gNDAwMTsvL0RJQU1FVEVSX0FVVEhFTlRJQ0FUSU9OX1JFSkVDVEVECisJCQkJVFJBQ0VfREVCVUcoRlVMTCwiJXMgTWF4aW11bSBwZXJtaXR0ZWQgaW52YWxpZCBFQVAgUGFja2V0IHJlYWNoZWQuIERpYW1ldGVyIEF1dGhlbnRpY2F0aW9uIFJlamVjdGVkLiIsRElBTUVBUF9FWFRFTlNJT04pOworCQkJfQorCisJCQlDSEVDS19GQ1RfRE8oZmRfbXNnX25ld19hbnN3ZXJfZnJvbV9yZXEoZmRfZ19jb25maWctPmNuZl9kaWN0LCBybXNnLCAwKSwKKwkJCQkJZ290byBzX2VuZCkKKwkJCTsKKworCQkJYW5zID0gKnJtc2c7CisJCQlDSEVDS19GQ1RfRE8oIGRpYW1lYXBfYWRkX2F2cHMoZGlhbWVhcF9zbSwgYW5zLHJlcSksCisJCQkJCXsJVFJBQ0VfREVCVUcoSU5GTywiJXMgQWRkaW5nIEFWUHMgdG8gRGlhbWV0ZXItRUFQLUFuc3dlciBtZXNzYWdlIGZhaWxlZC4iLERJQU1FQVBfRVhURU5TSU9OKTtnb3RvIHNfZW5kO30pCisJCQk7CisJCQlpZiAoKG5vbl9mYXRhbF9lcnJvciA9PSBUUlVFKSAmJiAoZGlhbWVhcF9zbS0+cmVzdWx0X2NvZGUgPT0gMCkpCisJCQl7CisJCQkJZGlhbWVhcF9zbS0+cmVzdWx0X2NvZGUgPSAxMDAxOworCQkJfQorCisJCQlpZiAoZGlhbWVhcF9zbS0+cmVzdWx0X2NvZGUgPT0gMTAwMSkKKwkJCXsKKwkJCQlDSEVDS19GQ1RfRE8oIGRpYW1lYXBfYWRkX2VhcF9yZWlzc3VlZF9wYXlsb2FkKGFucyxyZXEpLCBnb3RvIHNfZW5kKTsKKwkJCX0KKworCQkJaWYgKGRpYW1lYXBfc20tPnJlc3VsdF9jb2RlID09IDUwMDQpCisJCQl7CisJCQkJQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfYXZwX2FkZCggYW5zICwgTVNHX0JSV19MQVNUX0NISUxELCBkaWFtZWFwX3NtLT5mYWlsZWRhdnAgKSxnb3RvIHNfZW5kICk7CisJCQl9CisKKwkJCUNIRUNLX0ZDVF9ETyggZGlhbWVhcF9hZGRfcmVzdWx0X2NvZGUoZGlhbWVhcF9zbSwgYW5zLCBzZXNzKSwgZ290byBzX2VuZCkKKwkJCTsKKworCQkJQ0hFQ0tfRkNUX0RPKCBkaWFtZWFwX3NlbmQocm1zZyksIGdvdG8gc19lbmQpCisJCQk7CisJCQlkaWFtZWFwX3NtLT5zdGF0ZSA9IERJQU1FQVBfSURMRTsKKwkJCWJyZWFrOworCisJCWNhc2UgRElBTUVBUF9FTkQ6CisJCQlicmVhazsKKworCQljYXNlIERJQU1FQVBfSURMRToKKwkJCWJyZWFrOworCQl9CisJfQorCisJZGlhbWVhcF9mcmVlKGRpYW1lYXBfc20pOworCisJc19lbmQ6IHJldHVybiAwOworfQorCitpbnQgZGlhbWVhcF9zdGFydF9zZXJ2ZXIodm9pZCkKK3sKKwlzdHJ1Y3QgZGlzcF93aGVuIHdoZW47CisKKwkvKmNyZWF0ZSBoYW5kbGVyIGZvciBzZXNzaW9ucyAqLworCUNIRUNLX0ZDVChmZF9zZXNzX2hhbmRsZXJfY3JlYXRlKCZkaWFtZWFwX3NlcnZlcl9yZWcsIGRpYW1lYXBfY2xpX3Nlc3NfY2xlYW51cCwgTlVMTCwgTlVMTCkpOworCisJLyogUmVnaXN0ZXIgdGhlIGNhbGxiYWNrICovCisJbWVtc2V0KCZ3aGVuLCAwLCBzaXplb2Yod2hlbikpOworCXdoZW4uY29tbWFuZCA9IGRhdGFvYmpfZGlhbWVhcF9jbWQ7CisJd2hlbi5hcHAgPSBkYXRhb2JqX2RpYW1lYXBfYXBwOworCisJLyogUmVnaXN0ZXIgdGhlIGNhbGxiYWNrIGZvciBFQVAgQXBwbGljYXRpb24gKi8KKwlDSEVDS19GQ1QoZmRfZGlzcF9yZWdpc3RlcihkaWFtZWFwX3NlcnZlcl9jYWxsYmFjaywgRElTUF9IT1dfQ0MsICZ3aGVuLCBOVUxMLAorCQkJCQkmaGFuZGxlKSk7CisKKwlpZiAoaGFuZGxlID09IE5VTEwpCisJeworCQlUUkFDRV9ERUJVRyhJTkZPLCAiJXNDYW5ub3QgcmVnaXN0ZXIgdGhlIGNhbGxiYWNrICEhISIsRElBTUVBUF9FWFRFTlNJT04pOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBkaWFtZWFwX3N0b3Bfc2VydmVyKHZvaWQpCit7CisJQ0hFQ0tfRkNUKGZkX3Nlc3NfaGFuZGxlcl9kZXN0cm95KCZkaWFtZWFwX3NlcnZlcl9yZWcsIE5VTEwpKTsKKwlDSEVDS19GQ1QoZmRfZGlzcF91bnJlZ2lzdGVyKCZoYW5kbGUsIE5VTEwpKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9hcHBfZGlhbWVhcC9kaWFtZWFwX3NlcnZlci5oIGIvZXh0ZW5zaW9ucy9hcHBfZGlhbWVhcC9kaWFtZWFwX3NlcnZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZjExYzcKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2FwcF9kaWFtZWFwL2RpYW1lYXBfc2VydmVyLmgKQEAgLTAsMCArMSwxMTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKQorICogQXV0aG9yIDogU291aGVpbCBCZW4gQXllZCA8c291aGVpbEB0ZXJhLmljcy5rZWlvLmFjLmpwPgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOS0yMDEwLCBTb3VoZWlsIEJlbiBBeWVkLCBUZXJhb2thIExhYm9yYXRvcnkgb2YgS2VpbyBVbml2ZXJzaXR5LCBhbmQgdGhlIFdJREUgUHJvamVjdAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgU291aGVpbCBCZW4gQXllZCA8c291aGVpbEB0ZXJhLmljcy5rZWlvLmFjLmpwPi4KKyAqCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNvdWhlaWwgQmVuIEF5ZWQsIFRlcmFva2EgTGFib3JhdG9yeSBvZiBLZWlvIFVuaXZlcnNpdHkgb3IgdGhlIFdJREUgUHJvamVjdCBub3IgdGhlCisgKiAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAnJ0FTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBESUFNRUFQX1NFUlZFUl9IXworI2RlZmluZSBESUFNRUFQX1NFUlZFUl9IXworCisgCisvKiBzZXNzaW9uIGRhdGEgc3RydWN0dXJlIHRvIHN0b3JlICovCitzdHJ1Y3Qgc2Vzc19zdGF0ZQoreworCWludCBpbnZhbGlkX2VhcHBhY2tldHM7IC8qIE51bWJlciBvZiBpbnZhbGlkIEVBUCBQYWNrZXQgcmVjZWl2ZWQqLworCisJZWFwX3R5cGUgY3VycmVudE1ldGhvZDsKKwl1MzIgY3VycmVudFZlbmRvcjsKKwlpbnQgY3VycmVudElkOworCWludCBsYXN0SWQ7CisJdm9pZCAqIG1ldGhvZERhdGE7CisKKwl1OCBOQUtwcm9wb3NlZE1ldGhvZHNbMjUxXTsKKworCWVhcF9tZXRob2Rfc3RhdGUgbWV0aG9kU3RhdGU7CisKKwlzdHJ1Y3QgZWFwX3VzZXIgdXNlcjsKK307CisKK3R5cGVkZWYgZW51bQoreworCUFVVEhFTlRJQ0FURV9PTkxZID0gMSwgQVVUSE9SSVpFX09OTFkgPSAyLCBBVVRIT1JJWkVfQVVUSEVOVElDQVRFID0gMworfSBhdXRoX3JlcXVlc3Q7CisKK3N0cnVjdCBkaWFtZWFwX3N0YXRlX21hY2hpbmUKK3sKKwlpbnQgaW52YWxpZF9lYXBwYWNrZXRzOyAvKiBOdW1iZXIgb2YgaW52YWxpZCBFQVAgUGFja2V0IHJlY2VpdmVkKi8KKwlzdHJ1Y3QgYXZwICogbGFzdFJlcUVBUGF2cDsgLy9sYXN0IEVBUC1QYXlsb2FkIEFWUAorCisJaW50IHJlc3VsdF9jb2RlOyAvKkVycm9yIG51bWJlciBmb3IgUmVzdWx0X2NvZGUqLworCXN0cnVjdCBmZF9saXN0IGF0dHJpYnV0ZXM7IC8vZGF0YWJhc2UgYXR0cmlidXRlcworCXN0cnVjdCBmZF9saXN0IHJlcV9hdHRyaWJ1dGVzOyAvL2F0dHJpYnV0ZXMgZnJvbSBERVIKKwlzdHJ1Y3QgZmRfbGlzdCBhbnNfYXR0cmlidXRlczsgLy9hdHRyaWJ1dGVzIHRvIGJlIHNldCBmb3IgREVBCisJc3RydWN0IGF2cCAqIGZhaWxlZGF2cDsgLyogVGhlIEZhaWxlZC1BVlAgQVZQLiBzaG91bGQgYmUgdXBkYXRlIHdoZW5ldmVyIGEgRmFpbGVkIEFWUCBpcyBlbmNvdW50ZXJlZCBkdXJpbmcgYXV0aGVudGljYXRpb24uICovCisJc3RydWN0IGVhcF9zdGF0ZV9tYWNoaW5lIGVhcF9zbTsgLyogRUFQIFN0YXRlIE1hY2hpbmUgKi8KKwlhdXRoX3JlcXVlc3QgYXV0aF9yZXF1ZXN0X3ZhbDsgLyp0aGUgUmVxdWVzdCBUeXBlIG9mIEF1dGgtUmVxdWVzdC1UeXBlIEFWUCovCisJYm9vbGVhbiB2ZXJpZnlfYXV0aG9yaXphdGlvbjsgLyogU2V0IHRvIFRSVUUgYXQgdGhlIGF1dGhvcml6YXRpb24gc3RhdGUuIFBhcmFtZXRlciB1c2VkIHRvIGluZGljYXRlIHRoYXQgYXV0aG9yaXphdGlvbiBpcyBwZXJmb3JtZWQuKi8KKwlib29sZWFuIGF1dGhTdWNjZXNzOyAvLyBTZXQgdG8gVFJVRSBpZiBjbGllbnQgYXV0aGVudGljYXRlZCBhbmQgYXV0aG9yaXplZAorCWJvb2xlYW4gYXV0aEZhaWx1cmU7IC8vc2V0IHRvIFRSVUUgaWYgY2xpZW50IGlzIG5vdCBhdXRoZW50aWNhdGVkCisJYm9vbGVhbiBhdXRob3JpemVkOyAvL3NldCB0byBUUlVFIGlmIGNsaWVudCBpcyBhdXRob3JpemVkCisJZW51bQorCXsKKwkJRElBTUVBUF9ESVNBQkxFRCwKKwkJRElBTUVBUF9JTklUSUFMSVpFLAorCQlESUFNRUFQX1JFQ0VJVkVELAorCQlESUFNRUFQX0lETEUsCisJCURJQU1FQVBfQVVUSEVOVElDQVRJT05fVkVSSUZZLAorCQlESUFNRUFQX1NFTkRfRVJST1JfTVNHLAorCQlESUFNRUFQX1NFTEVDVF9ERUNJU0lPTiwKKwkJRElBTUVBUF9ESUFNRVRFUl9FQVBfQU5TV0VSLAorCQlESUFNRUFQX0VORCwKKwkJRElBTUVBUF9BVVRIT1JJWkFUSU9OX1ZFUklGWSwKKwkJRElBTUVBUF9TRU5EX1JFUVVFU1QsCisJCURJQU1FQVBfU0VORF9TVUNDRVNTLAorCQlESUFNRUFQX1NFTkRfRkFJTFVSRQorCisJfSBzdGF0ZTsgLy8gc3RhdGUgb2YgRGlhbUVBUAorCisJYm9vbGVhbiBwcml2YXRlVXNlcjsvL1RECit9OworCitzdHJ1Y3QgYXZwX21heF9vY2N1cmVuY2VzCit7CisJY2hhciAqIGF2cF9hdHRyaWJ1dGU7CisJaW50IG1heDsgLy8tMSBtZWFucyBubyBsaW1pdHMKK307CisKKworCisvKiBzdGFydCBzZXJ2ZXIgKi8KK2ludCBkaWFtZWFwX3N0YXJ0X3NlcnZlcih2b2lkKTsKKworLyogc3RvcCBzZXJ2ZXIqLworaW50IGRpYW1lYXBfc3RvcF9zZXJ2ZXIodm9pZCk7CisKKyNlbmRpZiAvKiBESUFNRUFQX1NFUlZFUl9IXyAqLwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9hcHBfZGlhbWVhcC9kaWFtZWFwX3Rscy5jIGIvZXh0ZW5zaW9ucy9hcHBfZGlhbWVhcC9kaWFtZWFwX3Rscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3N2E2NWMKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2FwcF9kaWFtZWFwL2RpYW1lYXBfdGxzLmMKQEAgLTAsMCArMSw0OTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKQorICogQXV0aG9yIDogU291aGVpbCBCZW4gQXllZCA8c291aGVpbEB0ZXJhLmljcy5rZWlvLmFjLmpwPgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOS0yMDEwLCBTb3VoZWlsIEJlbiBBeWVkLCBUZXJhb2thIExhYm9yYXRvcnkgb2YgS2VpbyBVbml2ZXJzaXR5LCBhbmQgdGhlIFdJREUgUHJvamVjdAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgU291aGVpbCBCZW4gQXllZCA8c291aGVpbEB0ZXJhLmljcy5rZWlvLmFjLmpwPi4KKyAqCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNvdWhlaWwgQmVuIEF5ZWQsIFRlcmFva2EgTGFib3JhdG9yeSBvZiBLZWlvIFVuaXZlcnNpdHkgb3IgdGhlIFdJREUgUHJvamVjdCBub3IgdGhlCisgKiAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAnJ0FTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2luY2x1ZGUgImRpYW1lYXBfdGxzLmgiCisKKy8vR0NSWV9USFJFQURfT1BUSU9OX1BUSFJFQURfSU1QTDsKKworaW50IGRpYW1lYXBfdGxzX2luaXQoc3RydWN0IHRsc19jb25maWcgKiB0bHNfY29uZikKK3sKKwlpbnQgcmV0OworCXJldCA9IGdudXRsc19nbG9iYWxfaW5pdCgpOworCWlmIChyZXQgPCAwKQorCXsKKwkJZ251dGxzX3BlcnJvcihyZXQpOworCX0KKworCWdudXRsc19nbG9iYWxfc2V0X2xvZ19mdW5jdGlvbihkaWFtZWFwX3Rsc19sb2cpOworCS8vZ251dGxzX2dsb2JhbF9zZXRfbG9nX2xldmVsKDkpOworCisKKwlpZih0bHNfY29uZi0+Y2FmaWxlID09TlVMTCl7CisJCWZwcmludGYoc3RkZXJyLCJbRGlhbUVBUCBleHRlbnNpb25dIFtFQVAgVExTXSBNaXNzaW5nIGNlcnRpZmljYXRpb24gYXV0aG9yaXR5IChDQSkgY2VydGlmaWNhdGVzLiBQbGVhc2UgcHJvdmlkZSBDQSBjb25maWd1cmF0aW9uIGRpcmVjdGl2ZS5cbiIpOyAKKwkJcmV0dXJuIEVJTlZBTDsKKwl9CisJaWYoICF0bHNfY29uZi0+Y2VydGZpbGUgfHwgIXRsc19jb25mLT5rZXlmaWxlKXsKKwkJZnByaW50ZihzdGRlcnIsIltEaWFtRUFQIGV4dGVuc2lvbl0gW0VBUCBUTFNdIE1pc3NpbmcgcHJpdmF0ZSBLZXkuIFBsZWFzZSBwcm92aWRlIENyZWQgY29uZmlndXJhdGlvbiBkaXJlY3RpdmUuXG4iKTsgCisJCXJldHVybiBFSU5WQUw7CisJfQorCisJcmV0ID0gZ251dGxzX2NlcnRpZmljYXRlX2FsbG9jYXRlX2NyZWRlbnRpYWxzKCZ0bHNfY29uZi0+Y2VydF9jcmVkKTsKKworCWlmIChyZXQgPCAwKQorCXsKKwkJZ251dGxzX3BlcnJvcihyZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGdudXRsc19jZXJ0aWZpY2F0ZV9zZXRfeDUwOV90cnVzdF9maWxlKHRsc19jb25mLT5jZXJ0X2NyZWQsCisJCQl0bHNfY29uZi0+Y2FmaWxlLCBHTlVUTFNfWDUwOV9GTVRfUEVNKTsKKwlpZiAocmV0IDwgMCkKKwl7CisJCWdudXRsc19wZXJyb3IocmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJaWYgKHRsc19jb25mLT5jcmxmaWxlKQorCXsKKwkJcmV0ID0gZ251dGxzX2NlcnRpZmljYXRlX3NldF94NTA5X2NybF9maWxlKHRsc19jb25mLT5jZXJ0X2NyZWQsCisJCQkJdGxzX2NvbmYtPmNybGZpbGUsIEdOVVRMU19YNTA5X0ZNVF9QRU0pOworCQlpZiAocmV0IDwgMCkKKwkJeworCQkJZ251dGxzX3BlcnJvcihyZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCXJldCA9IGdudXRsc19jZXJ0aWZpY2F0ZV9zZXRfeDUwOV9rZXlfZmlsZSh0bHNfY29uZi0+Y2VydF9jcmVkLAorCQkJdGxzX2NvbmYtPmNlcnRmaWxlLCB0bHNfY29uZi0+a2V5ZmlsZSwgR05VVExTX1g1MDlfRk1UX1BFTSk7CisJaWYgKHJldCA8IDApCisJeworCQlnbnV0bHNfcGVycm9yKHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCXJldHVybiAwOworfQorCit2b2lkIGRpYW1lYXBfdGxzX2xvZyhpbnQgbGV2LCBjb25zdCBjaGFyICogdGV4dCkKK3sKKwl1OCAqIG1zZzsKKwlpZiAodGV4dCA9PSBOVUxMKQorCQlyZXR1cm47CisJbXNnID0gKHU4ICopIHN0cmR1cCh0ZXh0KTsKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyAoRzgodGV4dCtpKSAhPSAnXG4nKSAmJiAoRzgodGV4dCtpKSAhPSAnXDAnKTsgaSsrKQorCXsKKwl9CisJUDgoKG1zZytpKSwnXDAnKTsKKwlmcHJpbnRmKHN0ZGVyciwgIltEaWFtRUFQIGV4dGVuc2lvbl0gW0VBUCBUTFNdIEdOVVRMUyBsb2dbJWRdIDogJXNcbiIsIGxldiwgbXNnKTsKKwlmcmVlKG1zZyk7Cit9CisKK2ludCBkaWFtZWFwX3Rsc19pbml0X3Nlc3Npb24oc3RydWN0IHRsc19jb25maWcgKiB0bHNfY29uZiwKKwkJc3RydWN0IHRsc19kYXRhICogZGF0YSkKK3sKKwlpbnQgcmV0OworCXJldCA9IGdudXRsc19pbml0KCZkYXRhLT5zZXNzaW9uLCBHTlVUTFNfU0VSVkVSKTsKKwlpZiAocmV0IDwgMCkKKwl7CisJCWdudXRsc19wZXJyb3IocmV0KTsKKwl9CisJcmV0ID0gZ251dGxzX3NldF9kZWZhdWx0X3ByaW9yaXR5KGRhdGEtPnNlc3Npb24pOworCWlmIChyZXQgPCAwKQorCXsKKwkJZ251dGxzX3BlcnJvcihyZXQpOworCX0KKworCXJldCA9IGdudXRsc19jcmVkZW50aWFsc19zZXQoZGF0YS0+c2Vzc2lvbiwgR05VVExTX0NSRF9DRVJUSUZJQ0FURSwKKwkJCXRsc19jb25mLT5jZXJ0X2NyZWQpOworCWlmIChyZXQgPCAwKQorCXsKKwkJZ251dGxzX3BlcnJvcihyZXQpOworCX0KKworCS8qIHJlcXVlc3QgY2xpZW50IGNlcnRpZmljYXRlIGlmIGFueS4KKwkgKi8KKwlnbnV0bHNfY2VydGlmaWNhdGVfc2VydmVyX3NldF9yZXF1ZXN0KGRhdGEtPnNlc3Npb24sIEdOVVRMU19DRVJUX1JFUVVJUkUpOyAvL0dOVVRMU19DRVJUX1JFUVVFU1QpOworCisJZ251dGxzX3RyYW5zcG9ydF9zZXRfcHVsbF9mdW5jdGlvbihkYXRhLT5zZXNzaW9uLCBkaWFtZWFwX3Rsc19yZWNlaXZlKTsKKwlnbnV0bHNfdHJhbnNwb3J0X3NldF9wdXNoX2Z1bmN0aW9uKGRhdGEtPnNlc3Npb24sIGRpYW1lYXBfdGxzX3NlbmQpOworCWdudXRsc190cmFuc3BvcnRfc2V0X3B0cihkYXRhLT5zZXNzaW9uLCAoZ251dGxzX3RyYW5zcG9ydF9wdHJfdCkgZGF0YSk7CisKKwkvKiBzdGFydGluZyB2ZXJzaW9uIDIuMTIsIHRoaXMgY2FsbCBpcyBub3QgbmVlZGVkICovCisJLy9nbnV0bHNfdHJhbnNwb3J0X3NldF9sb3dhdChkYXRhLT5zZXNzaW9uLCAwKTsKKwkKKwlyZXR1cm4gcmV0OworfQorCitzc2l6ZV90IGRpYW1lYXBfdGxzX3JlY2VpdmUoZ251dGxzX3RyYW5zcG9ydF9wdHJfdCBwdHIsIHZvaWQgKmJ1ZmZlciwKKwkJc2l6ZV90IGxlbmd0aCkKK3sKKwlzdHJ1Y3QgdGxzX2RhdGEgKiBkYXRhID0gKHN0cnVjdCB0bHNfZGF0YSAqKSBwdHI7CisJaWYgKGRhdGEtPnBfbGVuZ3RoID09IDApCisJeworCQllcnJubyA9IEVXT1VMREJMT0NLOworCQlyZXR1cm4gLTE7CisJfQorCWlmIChsZW5ndGggPiBkYXRhLT5wX2xlbmd0aCkKKwl7CisJCWxlbmd0aCA9IGRhdGEtPnBfbGVuZ3RoOworCX0KKwltZW1jcHkoYnVmZmVyLCBkYXRhLT50bHNSZXNwLmRhdGEgKyAoZGF0YS0+dGxzUmVzcC5kYXRhbGVuZ3RoCisJCQktIGRhdGEtPnBfbGVuZ3RoKSwgbGVuZ3RoKTsKKwlkYXRhLT5wX2xlbmd0aCAtPSBsZW5ndGg7CisKKwlyZXR1cm4gbGVuZ3RoOworfQorCitzc2l6ZV90IGRpYW1lYXBfdGxzX3NlbmQoZ251dGxzX3RyYW5zcG9ydF9wdHJfdCBwdHIsIGNvbnN0IHZvaWQgKmJ1ZmZlciwKKwkJc2l6ZV90IGxlbmd0aCkKK3sKKwlzdHJ1Y3QgdGxzX2RhdGEgKiBkYXRhID0gKHN0cnVjdCB0bHNfZGF0YSAqKSBwdHI7CisJZGF0YS0+dGxzUmVxLmRhdGEgPSByZWFsbG9jKGRhdGEtPnRsc1JlcS5kYXRhLCBkYXRhLT50bHNSZXEuZGF0YWxlbmd0aAorCQkJKyBsZW5ndGgpOworCVU4Q09QWShkYXRhLT50bHNSZXEuZGF0YSxkYXRhLT50bHNSZXEuZGF0YWxlbmd0aCxsZW5ndGgsKHU4KilidWZmZXIpOworCWRhdGEtPnRsc1JlcS5kYXRhbGVuZ3RoICs9IGxlbmd0aDsKKworCXJldHVybiBsZW5ndGg7Cit9CisKK2ludCBkaWFtZWFwX3Rsc19uZXcoc3RydWN0IHRsc19tc2cgKiB0bHNtc2cpCit7CisJaWYgKCF0bHNtc2cpCisJeworCQlyZXR1cm4gRUlOVkFMOworCX0KKwl0bHNtc2ctPmZsYWdzID0gMHgwMDsKKwl0bHNtc2ctPmxlbmd0aCA9IDA7CisJdGxzbXNnLT5kYXRhID0gTlVMTDsKKwl0bHNtc2ctPmRhdGFsZW5ndGggPSAwOworCXJldHVybiAwOworfQorCitpbnQgZGlhbWVhcF90bHNfZ2V0X2ZsYWdzKHN0cnVjdCB0bHNfbXNnIHRsc21zZywgdTggKiBmbGFncykKK3sKKwkqZmxhZ3MgPSB0bHNtc2cuZmxhZ3M7CisJcmV0dXJuIDA7Cit9CisKK2ludCBkaWFtZWFwX3Rsc19zZXRfZmxhZ3Moc3RydWN0IHRsc19tc2cgKiB0bHNtc2csIHU4IGZsYWdzKQoreworCWlmICghdGxzbXNnKQorCXsKKwkJcmV0dXJuIEVJTlZBTDsKKwl9CisJaWYgKChmbGFncyAmIFRMU19GTEFHX0xFTkdUSCkgPT0gVExTX0ZMQUdfTEVOR1RIKQorCXsKKwkJZmxhZ3MgPSBmbGFncyBeIFRMU19GTEFHX0xFTkdUSDsKKwl9CisJdGxzbXNnLT5mbGFncyA9IHRsc21zZy0+ZmxhZ3MgfCBmbGFnczsKKwlyZXR1cm4gMDsKK30KKworaW50IGRpYW1lYXBfdGxzX2dldF9tZXNzYWdlX2xlbmd0aChzdHJ1Y3QgdGxzX21zZyB0bHNtc2csIHUzMiAqIGxlbmd0aCkKK3sKKwlpZiAoKHRsc21zZy5mbGFncyAmIFRMU19GTEFHX0xFTkdUSCkgPT0gVExTX0ZMQUdfTEVOR1RIKQorCXsKKwkJKmxlbmd0aCA9IHRsc21zZy5sZW5ndGg7CisJfQorCWVsc2UKKwl7CisJCSpsZW5ndGggPSAwOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGRpYW1lYXBfdGxzX3NldF9tZXNzYWdlX2xlbmd0aChzdHJ1Y3QgdGxzX21zZyAqIHRsc21zZywgdTMyIGxlbmd0aCkKK3sKKwlpZiAoIXRsc21zZykKKwl7CisJCXJldHVybiBFSU5WQUw7CisJfQorCWlmIChsZW5ndGggPiAwKQorCXsKKwkJdGxzbXNnLT5sZW5ndGggPSBsZW5ndGg7CisJCXRsc21zZy0+ZmxhZ3MgPSB0bHNtc2ctPmZsYWdzIHwgVExTX0ZMQUdfTEVOR1RIOworCX0KKwllbHNlCisJeworCQl0bHNtc2ctPmxlbmd0aCA9IDA7CisJCWlmICgodGxzbXNnLT5mbGFncyAmIFRMU19GTEFHX0xFTkdUSCkgPT0gVExTX0ZMQUdfTEVOR1RIKQorCQl7CisJCQl0bHNtc2ctPmZsYWdzID0gdGxzbXNnLT5mbGFncyBeIFRMU19GTEFHX0xFTkdUSDsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGRpYW1lYXBfdGxzX2dldF9kYXRhKHN0cnVjdCB0bHNfbXNnIHRsc21zZywgdTgqKiB0bHNfZGF0YSwKKwkJdTMyICogZGF0YV9sZW5ndGgpCit7CisJaWYgKHRsc21zZy5kYXRhbGVuZ3RoID4gMCkKKwl7CisJCSp0bHNfZGF0YSA9IG1hbGxvYyhzaXplb2YodTgpICogdGxzbXNnLmRhdGFsZW5ndGgpOworCQlVOENPUFkoKnRsc19kYXRhLDAsdGxzbXNnLmRhdGFsZW5ndGgsdGxzbXNnLmRhdGEpOworCQkqZGF0YV9sZW5ndGggPSB0bHNtc2cuZGF0YWxlbmd0aDsKKwl9CisJZWxzZQorCXsKKwkJKnRsc19kYXRhID0gTlVMTDsKKwkJKmRhdGFfbGVuZ3RoID0gMDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBkaWFtZWFwX3Rsc19zZXRfZGF0YShzdHJ1Y3QgdGxzX21zZyAqIHRsc21zZywgdTgqIHRsc19kYXRhLCBpbnQgZGF0YV9sZW5ndGgpCit7CisJaWYgKCF0bHNtc2cpCisJeworCQlyZXR1cm4gRUlOVkFMOworCX0KKwl0bHNtc2ctPmRhdGEgPSBtYWxsb2Moc2l6ZW9mKHU4KSAqIGRhdGFfbGVuZ3RoKTsKKwlVOENPUFkodGxzbXNnLT5kYXRhLDAsZGF0YV9sZW5ndGgsdGxzX2RhdGEpOworCXRsc21zZy0+ZGF0YWxlbmd0aCA9IGRhdGFfbGVuZ3RoOworCXJldHVybiAwOworfQorCisvKgorICogZGF0YSA6IHJldHVybmVkIGRhdGEKKyAqIGVhcHRsc19kYXRhIDogdGhlIFRMU19EYXRhIGZpZWxkCisgKiBsZW5ndGggOiB0aGUgbGVuZ3RoIG9mIGVhcHRsc19kYXRhCisgKiBmbGFncyA6IGNvbWJpbmF0aW9uIG9mIGZsYWdzIGV0IHNldAorICovCitpbnQgZGlhbWVhcF90bHNfbmV3X3Rsc19wYWNrZXQodTgqKiBkYXRhLCBpbnQgKiBsZW4sIHN0cnVjdCB0bHNfbXNnIHRsc21zZykKK3sKKwlpbnQgYnVmbGVuLCBwb3MgPSAwOworCisJYnVmbGVuID0gMTsKKworCWlmICgodGxzbXNnLmZsYWdzICYgVExTX0ZMQUdfTEVOR1RIKSA9PSBUTFNfRkxBR19MRU5HVEgpCisJeworCQlidWZsZW4gKz0gNDsKKwl9CisKKwlpZiAodGxzbXNnLmRhdGFsZW5ndGggPiAwKQorCXsKKwkJYnVmbGVuICs9IHRsc21zZy5kYXRhbGVuZ3RoOworCX0KKwkqZGF0YSA9IG1hbGxvYyhzaXplb2YodTgpICogYnVmbGVuKTsKKwltZW1zZXQoKmRhdGEsIDAsIHNpemVvZih1OCkgKiBidWZsZW4pOworCVA4KCpkYXRhLHRsc21zZy5mbGFncyk7CisJcG9zKys7CisKKwlpZiAoKHRsc21zZy5mbGFncyAmIFRMU19GTEFHX0xFTkdUSCkgPT0gVExTX0ZMQUdfTEVOR1RIKQorCXsKKwkJUDMyQklHRSgqZGF0YStwb3MsdGxzbXNnLmxlbmd0aCk7CisJCXBvcyArPSA0OworCX0KKwlpZiAodGxzbXNnLmRhdGEpCisJeworCQlVOENPUFkoKmRhdGEscG9zLHRsc21zZy5kYXRhbGVuZ3RoLHRsc21zZy5kYXRhKTsKKwl9CisJKmxlbiA9IGJ1ZmxlbjsKKwlyZXR1cm4gMDsKK30KKworaW50IGRpYW1lYXBfc2V0X3RscyhzdHJ1Y3QgdGxzX21zZyAqIHRsc21zZywgdTggZmxhZ3MsIHUzMiBsZW5ndGgsCisJCXU4ICp0bHNfZGF0YSwgaW50IGRhdGFfbGVuZ3RoKQoreworCWRpYW1lYXBfdGxzX25ldyh0bHNtc2cpOworCWRpYW1lYXBfdGxzX3NldF9mbGFncyh0bHNtc2csIGZsYWdzKTsKKwlkaWFtZWFwX3Rsc19zZXRfbWVzc2FnZV9sZW5ndGgodGxzbXNnLCBsZW5ndGgpOworCWRpYW1lYXBfdGxzX3NldF9kYXRhKHRsc21zZywgdGxzX2RhdGEsIGRhdGFfbGVuZ3RoKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGRpYW1lYXBfdGxzX3BhcnNlKHU4KiBkYXRhLCBpbnQgbGVuLCBzdHJ1Y3QgdGxzX21zZyAqIHRsc21zZykKK3sKKworCWlmIChkYXRhID09IE5VTEwpCisJCXJldHVybiBFSU5WQUw7CisJaW50IHBvcyA9IDA7CisJZGlhbWVhcF90bHNfbmV3KHRsc21zZyk7CisJdGxzbXNnLT5mbGFncyA9IEc4KGRhdGEpOworCXBvcysrOworCWlmICgodGxzbXNnLT5mbGFncyAmIFRMU19GTEFHX0xFTkdUSCkgPT0gVExTX0ZMQUdfTEVOR1RIKQorCXsKKwkJdGxzbXNnLT5sZW5ndGggPSBHMzJCSUdFKGRhdGErMSk7CisJCXBvcyA9IHBvcyArIDQ7CisJfQorCisJaWYgKGxlbiA+IHBvcykKKwl7CisJCXRsc21zZy0+ZGF0YSA9IG1hbGxvYyhzaXplb2YodTgpICogKGxlbiAtIHBvcykpOworCQlVOENPUFkodGxzbXNnLT5kYXRhLDAsKGxlbi1wb3MpLGRhdGErcG9zKTsKKwkJdGxzbXNnLT5kYXRhbGVuZ3RoID0gbGVuIC0gcG9zOworCX0KKwllbHNlCisJeworCQl0bHNtc2ctPmRhdGEgPSBOVUxMOworCQl0bHNtc2ctPmRhdGFsZW5ndGggPSAwOworCX0KKwlyZXR1cm4gMDsKK30KKwordm9pZCBkaWFtZWFwX3Rsc19kdW1wKHN0cnVjdCB0bHNfbXNnIHRsc21zZykKK3sKKwl1OCAqIGRhdGEgPSBOVUxMOworCXUzMiBsZW47CisJZGlhbWVhcF90bHNfZ2V0X2RhdGEodGxzbXNnLCAmZGF0YSwgJmxlbik7CisKKwlmcHJpbnRmKHN0ZGVyciwgIi0tLS0tLS0tLS0tLS1EdW1wIEVBUC1UTFMgbXNnLS0tLS0tLS0tLS0tLVxuIik7CisJdTggZmxhZ3M7CisJZGlhbWVhcF90bHNfZ2V0X2ZsYWdzKHRsc21zZywgJmZsYWdzKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0IC1mbGFncyAgICAgICAJCTogJTAyeCAiLCBmbGFncyk7CisJaWYgKGZsYWdzICYgVExTX0ZMQUdfTEVOR1RIKQorCQlmcHJpbnRmKHN0ZGVyciwgIiBUTFNfRkxBR19MRU5HVEggIik7CisJaWYgKGZsYWdzICYgVExTX0ZMQUdfTU9SRSkKKwkJZnByaW50ZihzdGRlcnIsICIgVExTX0ZMQUdfTU9SRSAiKTsKKwlpZiAoZmxhZ3MgJiBUTFNfRkxBR19TVEFSVCkKKwkJZnByaW50ZihzdGRlcnIsICIgVExTX0ZMQUdfU1RBUlQgIik7CisJZnByaW50ZihzdGRlcnIsICJcbiIpOworCWlmICgodGxzbXNnLmZsYWdzICYgVExTX0ZMQUdfTEVOR1RIKSA9PSBUTFNfRkxBR19MRU5HVEgpCisJeworCQl1MzIgbGVuZ3RoOworCQlkaWFtZWFwX3Rsc19nZXRfbWVzc2FnZV9sZW5ndGgodGxzbXNnLCAmbGVuZ3RoKTsKKwkJZnByaW50ZihzdGRlcnIsICJcdCAtVExTIG1zZyBsZW5ndGgJOiAldSAoMHglMDJ4JTAyeCUwMnglMDJ4KVxuIiwKKwkJCQlsZW5ndGgsIChsZW5ndGggPj4gMjQpICYgMHhmZlUsIChsZW5ndGggPj4gMTYpICYgMHhmZlUsIChsZW5ndGgKKwkJCQkJCT4+IDgpICYgMHhmZlUsIGxlbmd0aCAmIDB4ZmZVKTsKKwl9CisJZnByaW50ZihzdGRlcnIsICJcdCAtZGF0YSBsZW5ndGgJCTogJWQgXG4iLCBsZW4pOworCS8qCisJaWYgKGxlbiA+IDApCisJeworCQlpbnQgaTsKKwkJZnByaW50ZihzdGRlcnIsICJcdCAtRGF0YQkJCTogIik7CisJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJeworCQkJZnByaW50ZihzdGRlcnIsICIlMDJ4ICIsIEc4KGRhdGEgKyBpKSk7CisJCX0KKwkJZnByaW50ZihzdGRlcnIsICJcbiIpOworCX0KKwkqLworCWZwcmludGYoc3RkZXJyLCAiLS0tLS0tLS0tLS0tLUVuZCBEdW1wIEVBUC1UTFMgbXNnLS0tLS0tLS0tLS0tLVxuIik7CisJCisJZnJlZShkYXRhKTsKK30KKworaW50IGRpYW1lYXBfdGxzX2luaXRpYWxpemUoc3RydWN0IHRsc19kYXRhICogZGF0YSkKK3sKKwlpZiAoIWRhdGEpCisJeworCQlyZXR1cm4gRUlOVkFMOworCX0KKwlkYXRhLT5zdGF0ZSA9IFNUQVJUOworCWRhdGEtPm1vcmVfdG9zZW5kX2xlbmd0aCA9IDA7CisJZGF0YS0+bW9yZV90b3JlY2VpdmUgPSBGQUxTRTsKKwlkYXRhLT5oYW5kc2hha2UgPSBGQUxTRTsKKwlyZXR1cm4gMDsKK30KKworaW50IGRpYW1lYXBfdGxzX3JlYXNzZW1ibGUoc3RydWN0IHRsc19tc2cgKiB0bywgc3RydWN0IHRsc19tc2cgZnJvbSkKK3sKKwl1OCBmcm9tX2ZsYWc7CisJZGlhbWVhcF90bHNfZ2V0X2ZsYWdzKGZyb20sICZmcm9tX2ZsYWcpOworCisJaWYgKGZyb21fZmxhZyAmIFRMU19GTEFHX0xFTkdUSCkKKwl7CisJCWRpYW1lYXBfdGxzX25ldyh0byk7CisJCXUzMiBsZW5ndGg7CisJCWRpYW1lYXBfdGxzX2dldF9tZXNzYWdlX2xlbmd0aChmcm9tLCAmbGVuZ3RoKTsKKwkJZGlhbWVhcF90bHNfc2V0X21lc3NhZ2VfbGVuZ3RoKHRvLCBsZW5ndGgpOworCX0KKwlkaWFtZWFwX3Rsc19zZXRfZmxhZ3ModG8sIGZyb21fZmxhZyk7CisKKwl1OCAqIHRsc1Jlc3BEYXRhOworCXUzMiB0bHNSZXNwRGF0YUxlbmd0aDsKKwlkaWFtZWFwX3Rsc19nZXRfZGF0YShmcm9tLCAmdGxzUmVzcERhdGEsICZ0bHNSZXNwRGF0YUxlbmd0aCk7CisJdG8tPmRhdGEgPSByZWFsbG9jKHRvLT5kYXRhLCB0by0+ZGF0YWxlbmd0aCArIHRsc1Jlc3BEYXRhTGVuZ3RoKTsKKwlVOENPUFkodG8tPmRhdGEsdG8tPmRhdGFsZW5ndGgsdGxzUmVzcERhdGFMZW5ndGgsdGxzUmVzcERhdGEpOworCXRvLT5kYXRhbGVuZ3RoICs9IHRsc1Jlc3BEYXRhTGVuZ3RoOworCWZyZWUodGxzUmVzcERhdGEpOworCXJldHVybiAwOworfQorCitpbnQgZGlhbWVhcF90bHNfY29weShzdHJ1Y3QgdGxzX21zZyAqIHRvLCBzdHJ1Y3QgdGxzX21zZyBmcm9tKQoreworCXU4IGZsYWc7CisJdTMyIGxlbmd0aDsKKwl1OCAqIGRhdGE7CisJZGlhbWVhcF90bHNfbmV3KHRvKTsKKwlkaWFtZWFwX3Rsc19nZXRfZmxhZ3MoZnJvbSwgJmZsYWcpOworCWRpYW1lYXBfdGxzX3NldF9mbGFncyh0bywgZmxhZyk7CisJZGlhbWVhcF90bHNfZ2V0X21lc3NhZ2VfbGVuZ3RoKGZyb20sICZsZW5ndGgpOworCWRpYW1lYXBfdGxzX3NldF9tZXNzYWdlX2xlbmd0aCh0bywgbGVuZ3RoKTsKKwlsZW5ndGggPSAwOworCWRpYW1lYXBfdGxzX2dldF9kYXRhKGZyb20sICZkYXRhLCAmbGVuZ3RoKTsKKwlkaWFtZWFwX3Rsc19zZXRfZGF0YSh0bywgZGF0YSwgbGVuZ3RoKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGRpYW1lYXBfdGxzX3Byb2Nlc3NfcmVjZWl2ZShzdHJ1Y3QgdGxzX2RhdGEgKiBkYXRhKQoreworCWludCByZXQ7CisKKwlkYXRhLT5wX2xlbmd0aCA9IGRhdGEtPnRsc1Jlc3AuZGF0YWxlbmd0aDsKKworCXJldCA9IGdudXRsc19oYW5kc2hha2UoZGF0YS0+c2Vzc2lvbik7CisKKwlpZiAocmV0IDwgMCkKKwl7CisJCXN3aXRjaCAocmV0KQorCQl7CisJCWNhc2UgR05VVExTX0VfQUdBSU46CisJCQlicmVhazsKKwkJY2FzZSBHTlVUTFNfRV9JTlRFUlJVUFRFRDoKKwkJCWZwcmludGYoc3RkZXJyLCAiW0RpYW1FQVAgZXh0ZW5zaW9uXSBbRUFQIFRMU10gZ251dGxzIGhhbmRzaGFrZSA6IEdOVVRMU19FX0lOVEVSUlVQVEVEIik7CisJCQlicmVhazsKKwkJY2FzZSBHTlVUTFNfRV9HT1RfQVBQTElDQVRJT05fREFUQToKKwkJCWZwcmludGYoc3RkZXJyLAorCQkJCQkiW0RpYW1FQVAgZXh0ZW5zaW9uXSBbRUFQIFRMU10gZ251dGxzIGhhbmRzaGFrZSA6IEdOVVRMU19FX0dPVF9BUFBMSUNBVElPTl9EQVRBIik7CisJCQlicmVhazsKKwkJY2FzZSBHTlVUTFNfRV9XQVJOSU5HX0FMRVJUX1JFQ0VJVkVEOgorCQkJZnByaW50ZihzdGRlcnIsCisJCQkJCSJbRGlhbUVBUCBleHRlbnNpb25dIFtFQVAgVExTXSBnbnV0bHMgaGFuZHNoYWtlIDogR05VVExTX0VfV0FSTklOR19BTEVSVF9SRUNFSVZFRCIpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHJldCAhPSBHTlVUTFNfRV9BR0FJTikKKwkJeworCQkJZ251dGxzX3BlcnJvcihyZXQpOworCQl9CisJfQorCWlmIChyZXQgPT0gR05VVExTX0VfU1VDQ0VTUykKKwl7CisJCWRhdGEtPmhhbmRzaGFrZSA9IFRSVUU7CisJfQorCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2FwcF9kaWFtZWFwL2RpYW1lYXBfdGxzLmggYi9leHRlbnNpb25zL2FwcF9kaWFtZWFwL2RpYW1lYXBfdGxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU3NzRlNwotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvYXBwX2RpYW1lYXAvZGlhbWVhcF90bHMuaApAQCAtMCwwICsxLDE0MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpCisgKiBBdXRob3IgOiBTb3VoZWlsIEJlbiBBeWVkIDxzb3VoZWlsQHRlcmEuaWNzLmtlaW8uYWMuanA+CisgKgorICogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTAsIFNvdWhlaWwgQmVuIEF5ZWQsIFRlcmFva2EgTGFib3JhdG9yeSBvZiBLZWlvIFVuaXZlcnNpdHksIGFuZCB0aGUgV0lERSBQcm9qZWN0CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBTb3VoZWlsIEJlbiBBeWVkIDxzb3VoZWlsQHRlcmEuaWNzLmtlaW8uYWMuanA+LgorICoKKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgU291aGVpbCBCZW4gQXllZCwgVGVyYW9rYSBMYWJvcmF0b3J5IG9mIEtlaW8gVW5pdmVyc2l0eSBvciB0aGUgV0lERSBQcm9qZWN0IG5vciB0aGUKKyAqICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICcnQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIERJQU1FQVBfVExTX0hfCisjZGVmaW5lIERJQU1FQVBfVExTX0hfCisKKyNpZiBkZWZpbmVkKF9fR05VQ19fKQorIyBkZWZpbmUgR0NDX0RJQUdfRE9fUFJBR01BKHgpIF9QcmFnbWEgKCN4KQorIyBkZWZpbmUgR0NDX0RJQUdfUFJBR01BKHgpIEdDQ19ESUFHX0RPX1BSQUdNQShHQ0MgZGlhZ25vc3RpYyB4KQorIyBpZiAoKF9fR05VQ19fICogMTAwKSArIF9fR05VQ19NSU5PUl9fKSA+PSA0MDYJCS8qIDQuNi54ICovCisjICBkZWZpbmUgR0NDX0RJQUdfT0ZGKHgpIEdDQ19ESUFHX1BSQUdNQShwdXNoKSBcCisgICAgIEdDQ19ESUFHX1BSQUdNQShpZ25vcmVkIHgpCisjICBkZWZpbmUgR0NDX0RJQUdfT04oeCkgR0NDX0RJQUdfUFJBR01BKHBvcCkKKyMgZWxzZQkJCQkJCQkvKiBvbGRlciAqLworIyAgZGVmaW5lIEdDQ19ESUFHX09GRih4KSBHQ0NfRElBR19QUkFHTUEoaWdub3JlZCB4KQorIyAgZGVmaW5lIEdDQ19ESUFHX09OKHgpICBHQ0NfRElBR19QUkFHTUEod2FybmluZyB4KQorIyBlbmRpZgorI2Vsc2UKKyMgZGVmaW5lIEdDQ19ESUFHX09GRih4KQorIyBkZWZpbmUgR0NDX0RJQUdfT04oeCkKKyNlbmRpZgorCisKKyNpbmNsdWRlICJkaWFtZWFwX2RlZnMuaCIKKyNpbmNsdWRlIDxnbnV0bHMvZ251dGxzLmg+CitHQ0NfRElBR19PRkYoIi1XZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMiKQorI2luY2x1ZGUgPGdjcnlwdC5oPgorR0NDX0RJQUdfT04oIi1XZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMiKQorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorCisKKworI2RlZmluZSBUTFNfRkxBR19MRU5HVEgJMHg4MAorI2RlZmluZSBUTFNfRkxBR19NT1JFCTB4NDAKKyNkZWZpbmUgVExTX0ZMQUdfU1RBUlQJMHgyMAorCitzdHJ1Y3QgdGxzX2NvbmZpZ3sKKwljaGFyICogY29uZmZpbGU7CisJLy9jZXJ0aWZpY2F0ZXMKKwljaGFyICoga2V5ZmlsZTsKKwljaGFyICogY2VydGZpbGU7CisJY2hhciAqIGNhZmlsZTsKKwljaGFyICogY3JsZmlsZTsKKworCS8vY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCisJYm9vbGVhbiBjaGVja19jZXJ0X2NuX3VzZXJuYW1lOworCisJaW50IG1heF9zaXplOworCisJZ251dGxzX2NlcnRpZmljYXRlX2NyZWRlbnRpYWxzX3QgY2VydF9jcmVkOworfTsKKworc3RydWN0IHRsc19tc2d7CisJdTgJZmxhZ3M7CisJdTMyIGxlbmd0aDsKKwl1OCAqZGF0YTsKKwl1MzIgZGF0YWxlbmd0aDsKK307CisKK3N0cnVjdCB0bHNfZGF0YQoreworCWdudXRsc19zZXNzaW9uX3Qgc2Vzc2lvbjsKKwllbnVtIHsgU1RBUlQsIENPTlRJTlVFLCBTVUNDRVNTLCBGQUlMVVJFIH0gc3RhdGU7CisJc3RydWN0IHRsc19tc2cgdGxzUmVxOworCWludCBwX2xlbmd0aDsgCQkJLyogbGVuZ3RoIG9mIGJ1ZmZlciBzdGlsbCBub3QgcmV0dXJuZWQgdG8gaGFuZHNoYWtlICovCisJc3RydWN0IHRsc19tc2cgdGxzUmVzcDsKKwlpbnQgbW9yZV90b3NlbmRfbGVuZ3RoOwkvKiAwIGlmIG5vIG1vcmUgZnJhZ21lbnQgdG8gc2VuZC4gT3RoZXJ3aXNlIHRoZSBsZW5ndGggb2YgdGhlIGJ1ZmYgbm90IHlldCBzZW50ICovCisJYm9vbGVhbiBtb3JlX3RvcmVjZWl2ZTsgLyogVFJVRSBpZiB3YWl0IGZvciBtb3JlIGZyYWdtZW50cy4gKi8KKwlib29sZWFuIGhhbmRzaGFrZTsgCQkvKiBUUlVFIGlmIGhhbmRzaGFrZSB0ZXJtaW5hdGVkIHN1Y2Nlc3NmdWwuICovCit9OworCitpbnQgZGlhbWVhcF90bHNfaW5pdChzdHJ1Y3QgdGxzX2NvbmZpZyAqIHRsc19jb25mICk7Cit2b2lkIGRpYW1lYXBfdGxzX2xvZyhpbnQgbGV2LCBjb25zdCBjaGFyICogdGV4dCk7CitpbnQgZGlhbWVhcF90bHNfaW5pdF9zZXNzaW9uKHN0cnVjdCB0bHNfY29uZmlnICogdGxzX2NvbmYsIHN0cnVjdCB0bHNfZGF0YSAqIGRhdGEpOworaW50IGRpYW1lYXBfdGxzX25ldyhzdHJ1Y3QgdGxzX21zZyAqIHRsc21zZyk7CisKK2ludCBkaWFtZWFwX3Rsc19nZXRfbWVzc2FnZV9sZW5ndGgoc3RydWN0IHRsc19tc2cgdGxzbXNnLCB1MzIgKiBsZW5ndGgpOworaW50IGRpYW1lYXBfdGxzX3NldF9tZXNzYWdlX2xlbmd0aChzdHJ1Y3QgdGxzX21zZyAqIHRsc21zZywgdTMyIGxlbmd0aCk7CisKK2ludCBkaWFtZWFwX3Rsc19nZXRfZmxhZ3Moc3RydWN0IHRsc19tc2cgdGxzbXNnLCB1OCAqIGZsYWdzKTsKK2ludCBkaWFtZWFwX3Rsc19zZXRfZmxhZ3Moc3RydWN0IHRsc19tc2cgKiB0bHNtc2csIHU4IGZsYWdzKTsKKworaW50IGRpYW1lYXBfdGxzX2dldF9kYXRhKHN0cnVjdCB0bHNfbXNnIHRsc21zZywgdTgqKiB0bHNfZGF0YSwgdTMyICogZGF0YV9sZW5ndGgpOworaW50IGRpYW1lYXBfdGxzX3NldF9kYXRhKHN0cnVjdCB0bHNfbXNnICogdGxzbXNnLCB1OCogdGxzX2RhdGEsIGludCBkYXRhX2xlbmd0aCk7CisKK2ludCBkaWFtZWFwX3Rsc19wYXJzZSh1OCogZGF0YSwgaW50IGxlbmd0aCwgc3RydWN0IHRsc19tc2cgKiB0bHNtc2cpOworCitpbnQgZGlhbWVhcF90bHNfbmV3X3Rsc19wYWNrZXQodTgqKiBkYXRhLCBpbnQgKiBsZW4sIHN0cnVjdCB0bHNfbXNnIHRsc21zZyk7CisKK2ludCBkaWFtZWFwX3NldF90bHMoc3RydWN0IHRsc19tc2cgKiB0bHNtc2csIHU4IGZsYWdzLCB1MzIgbGVuZ3RoLHU4ICp0bHNfZGF0YSwgaW50IGRhdGFfbGVuZ3RoKTsKKwordm9pZCBkaWFtZWFwX3Rsc19kdW1wKHN0cnVjdCB0bHNfbXNnIHRsc21zZyk7CisKK2ludCBkaWFtZWFwX3Rsc19pbml0aWFsaXplKHN0cnVjdCB0bHNfZGF0YSAqIGRhdGEpOworCitpbnQgZGlhbWVhcF90bHNfcmVhc3NlbWJsZShzdHJ1Y3QgdGxzX21zZyAqIHRvLHN0cnVjdCB0bHNfbXNnIGZyb20pOworCitpbnQgZGlhbWVhcF90bHNfY29weShzdHJ1Y3QgdGxzX21zZyAqIHRvLHN0cnVjdCB0bHNfbXNnIGZyb20pOworCitpbnQgZGlhbWVhcF90bHNfcHJvY2Vzc19yZWNlaXZlKHN0cnVjdCB0bHNfZGF0YSAqIGRhdGEpOworCitzc2l6ZV90IGRpYW1lYXBfdGxzX3JlY2VpdmUoZ251dGxzX3RyYW5zcG9ydF9wdHJfdCBkYXRhICwgdm9pZCAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoKTsKK3NzaXplX3QgZGlhbWVhcF90bHNfc2VuZChnbnV0bHNfdHJhbnNwb3J0X3B0cl90IGRhdGEgLCBjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBsZW5ndGgpOworCisjZW5kaWYgLyogRElBTUVBUF9UTFNfSF8gKi8KZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvYXBwX2RpYW1lYXAvZGlhbWVhcF91c2VyLmMgYi9leHRlbnNpb25zL2FwcF9kaWFtZWFwL2RpYW1lYXBfdXNlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlOGRlMWIKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2FwcF9kaWFtZWFwL2RpYW1lYXBfdXNlci5jCkBAIC0wLDAgKzEsMTUyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkKKyAqIEF1dGhvciA6IFNvdWhlaWwgQmVuIEF5ZWQgPHNvdWhlaWxAdGVyYS5pY3Mua2Vpby5hYy5qcD4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMCwgU291aGVpbCBCZW4gQXllZCwgVGVyYW9rYSBMYWJvcmF0b3J5IG9mIEtlaW8gVW5pdmVyc2l0eSwgYW5kIHRoZSBXSURFIFByb2plY3QKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IFNvdWhlaWwgQmVuIEF5ZWQgPHNvdWhlaWxAdGVyYS5pY3Mua2Vpby5hYy5qcD4uCisgKgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiBTb3VoZWlsIEJlbiBBeWVkLCBUZXJhb2thIExhYm9yYXRvcnkgb2YgS2VpbyBVbml2ZXJzaXR5IG9yIHRoZSBXSURFIFByb2plY3Qgbm9yIHRoZQorICogICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgJydBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpbmNsdWRlICJsaWJkaWFtZWFwLmgiCisKK2ludCBkaWFtZWFwX3VzZXJfZ2V0X3VzZXJpZChzdHJ1Y3QgZWFwX3VzZXIgKnVzZXIsIHU4KiB1c2VyaWQpCit7CisJVFJBQ0VfRU5UUlkoIiVwICVwIix1c2VyLHVzZXJpZCk7CisJaWYgKHVzZXItPnVzZXJpZCA9PSBOVUxMKQorCQlyZXR1cm4gRUlOVkFMOworCXVzZXJpZCA9IHVzZXItPnVzZXJpZDsKKwlyZXR1cm4gMDsKK30KKworaW50IGRpYW1lYXBfdXNlcl9nZXRfcGFzc3dvcmQoc3RydWN0IGVhcF91c2VyICp1c2VyLCB1OCogcGFzc3dvcmQsdTE2ICogcGFzc3dvcmRsZW5ndGgpCit7CisJVFJBQ0VfRU5UUlkoIiVwICVwIix1c2VyLHBhc3N3b3JkKTsKKwlpZiAodXNlci0+cGFzc3dvcmQgPT0gTlVMTCkKKwkJcmV0dXJuIEVJTlZBTDsKKwlwYXNzd29yZCA9IHVzZXItPnBhc3N3b3JkOworCSpwYXNzd29yZGxlbmd0aCA9IHVzZXItPnBhc3N3b3JkTGVuZ3RoOworCXJldHVybiAwOworfQorCitpbnQgZGlhbWVhcF91c2VyX2dldF9wYXNzd29yZGxlbmd0aChzdHJ1Y3QgZWFwX3VzZXIgKnVzZXIsIHUxNiAqIHBhc3N3b3JkbGVuZ3RoKQoreworCVRSQUNFX0VOVFJZKCIlcCAlcCIsdXNlcixwYXNzd29yZGxlbmd0aCk7CisJaWYgKHVzZXItPnBhc3N3b3JkID09IE5VTEwpCisJCXJldHVybiBFSU5WQUw7CisJKnBhc3N3b3JkbGVuZ3RoID0gdXNlci0+cGFzc3dvcmRMZW5ndGg7CisJcmV0dXJuIDA7Cit9CisKK2ludCBkaWFtZWFwX3VzZXJfc2V0X3Bhc3N3b3JkKHN0cnVjdCBlYXBfdXNlciAqIHVzZXIsIHU4ICogcGFzc3dvcmQsCisJCXUxNiBwYXNzd29yZExlbmd0aCkKK3sKKwlUUkFDRV9FTlRSWSgiJXAgJXAgJWh1Iix1c2VyLHBhc3N3b3JkLHBhc3N3b3JkTGVuZ3RoKTsKKwlpZiAocGFzc3dvcmQgPT0gTlVMTCkKKwkJcmV0dXJuIEVJTlZBTDsKKwlpZiAocGFzc3dvcmRMZW5ndGggPCAxKQorCQlyZXR1cm4gRUlOVkFMOworCXVzZXItPnBhc3N3b3JkID0gcGFzc3dvcmQ7CisJdXNlci0+cGFzc3dvcmRMZW5ndGggPSBwYXNzd29yZExlbmd0aDsKKwlyZXR1cm4gMDsKK30KKworaW50IGRpYW1lYXBfdXNlcl9zZXRfdXNlcmlkKHN0cnVjdCBlYXBfdXNlciAqIHVzZXIsIHU4ICogdXNlcmlkLAorCQl1MTYgdXNlcmlkTGVuZ3RoKQoreworCVRSQUNFX0VOVFJZKCIlcCAlcCAlaHUiLHVzZXIsdXNlcmlkLHVzZXJpZExlbmd0aCk7CisJaWYgKHVzZXJpZCA9PSBOVUxMKQorCQlyZXR1cm4gRUlOVkFMOworCWlmICh1c2VyaWRMZW5ndGggPCAxKQorCQlyZXR1cm4gRUlOVkFMOworCXVzZXItPnVzZXJpZCA9IHVzZXJpZDsKKwl1c2VyLT51c2VyaWRMZW5ndGggPSB1c2VyaWRMZW5ndGg7CisJcmV0dXJuIDA7Cit9CisKK2ludCBkaWFtZWFwX3VzZXJfZ2V0X21ldGhvZGlkKHN0cnVjdCBlYXBfdXNlciAqdXNlciwgaW50ICogbWV0aG9kaWQpCit7CisJVFJBQ0VfRU5UUlkoIiVwICVwIix1c2VyLG1ldGhvZGlkKTsKKwlpZiAodXNlci0+cGFzc3dvcmQgPT0gTlVMTCkKKwkJcmV0dXJuIEVJTlZBTDsKKwkqbWV0aG9kaWQgPSB1c2VyLT5tZXRob2RJZDsKKwlyZXR1cm4gMDsKK30KKworaW50IGRpYW1lYXBfdXNlcl9zZXRfbWV0aG9kaWQoc3RydWN0IGVhcF91c2VyICogdXNlciwgaW50IG1ldGhvZElkKQoreworCVRSQUNFX0VOVFJZKCIlcCAlZCIsdXNlcixtZXRob2RJZCk7CisJaWYgKHVzZXItPnBhc3N3b3JkID09IE5VTEwpCisJCXJldHVybiBFSU5WQUw7CisJaWYgKG1ldGhvZElkIDwgMCkKKwkJcmV0dXJuIEVJTlZBTDsKKwl1c2VyLT5tZXRob2RJZCA9IG1ldGhvZElkOworCXJldHVybiAwOworfQorCitib29sZWFuIGRpYW1lYXBfdXNlcl9pc3N1Y2Nlc3Moc3RydWN0IGVhcF91c2VyICp1c2VyKQoreworCVRSQUNFX0VOVFJZKCIlcCIsdXNlcik7CisJaWYgKHVzZXItPnBhc3N3b3JkID09IE5VTEwpCisJCXJldHVybiBGQUxTRTsKKwlyZXR1cm4gdXNlci0+c3VjY2VzczsKK30KKworaW50IGRpYW1lYXBfdXNlcl9zZXRfc3VjY2VzcyhzdHJ1Y3QgZWFwX3VzZXIgKiB1c2VyKQoreworCVRSQUNFX0VOVFJZKCIlcCIsdXNlcik7CisJaWYgKHVzZXItPnBhc3N3b3JkID09IE5VTEwpCisJCXJldHVybiBFSU5WQUw7CisJdXNlci0+c3VjY2VzcyA9IFRSVUU7CisJcmV0dXJuIDA7Cit9CisKK2ludCBkaWFtZWFwX3VzZXJfZ2V0X2VhcF9tZXRob2Qoc3RydWN0IGVhcF91c2VyICp1c2VyLCBpbnQgaWQsCisJCXN0cnVjdCBlYXBfbWV0aG9kICptZXRob2QpCit7CisJVFJBQ0VfRU5UUlkoIiVwICVkICVwIix1c2VyLGlkLG1ldGhvZCk7CisJaWYgKHNpemVvZih1c2VyLT5tZXRob2RzKSA+PSAoaWQgLSAxKSkKKwkJKm1ldGhvZCA9IHVzZXItPm1ldGhvZHNbaWRdOworCXJldHVybiAwOworfQorCitpbnQgZGlhbWVhcF91c2VyX3NldF9lYXBfbWV0aG9kKHN0cnVjdCBlYXBfdXNlciAqIHVzZXIsIGludCBpZCwKKwkJc3RydWN0IGVhcF9tZXRob2QgKiBtZXRob2QpCit7CisJVFJBQ0VfRU5UUlkoIiVwICVkICVwIix1c2VyLGlkLG1ldGhvZCk7CisJaWYgKHVzZXItPnBhc3N3b3JkID09IE5VTEwpCisJCXJldHVybiBFSU5WQUw7CisJaWYgKHNpemVvZih1c2VyLT5tZXRob2RzKSA8IChpZCAtIDEpKQorCQlyZXR1cm4gRUlOVkFMOworCXVzZXItPm1ldGhvZHNbaWRdLnZlbmRvciA9IG1ldGhvZC0+dmVuZG9yOworCXVzZXItPm1ldGhvZHNbaWRdLm1ldGhvZCA9IG1ldGhvZC0+bWV0aG9kOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9hcHBfZGlhbWVhcC9kaWFtZWFwX3VzZXIuaCBiL2V4dGVuc2lvbnMvYXBwX2RpYW1lYXAvZGlhbWVhcF91c2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc5OGE4OAotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvYXBwX2RpYW1lYXAvZGlhbWVhcF91c2VyLmgKQEAgLTAsMCArMSw5OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpCisgKiBBdXRob3IgOiBTb3VoZWlsIEJlbiBBeWVkIDxzb3VoZWlsQHRlcmEuaWNzLmtlaW8uYWMuanA+CisgKgorICogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTAsIFNvdWhlaWwgQmVuIEF5ZWQsIFRlcmFva2EgTGFib3JhdG9yeSBvZiBLZWlvIFVuaXZlcnNpdHksIGFuZCB0aGUgV0lERSBQcm9qZWN0CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBTb3VoZWlsIEJlbiBBeWVkIDxzb3VoZWlsQHRlcmEuaWNzLmtlaW8uYWMuanA+LgorICoKKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgU291aGVpbCBCZW4gQXllZCwgVGVyYW9rYSBMYWJvcmF0b3J5IG9mIEtlaW8gVW5pdmVyc2l0eSBvciB0aGUgV0lERSBQcm9qZWN0IG5vciB0aGUKKyAqICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICcnQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIERJQU1FQVBfVVNFUl9IXworI2RlZmluZSBESUFNRUFQX1VTRVJfSF8KKworI2RlZmluZSBNQVhNRVRIT0RTIDggCS8qTWF4aW11bSBudW1iZXIgb2YgYWxsb3dlZCBtZXRob2RzICovCisKKyNkZWZpbmUgTUFYUFJPUE9TRURNRVRIT0RTIDggCS8qTWF4aW11bSBudW1iZXIgb2YgYWxsb3dlZCBwcm9wb3NlZCBtZXRob2RzICovCisKKyNkZWZpbmUJVkVORE9SX0lFVEYgMAorCisvKkVBUCBVc2VyIHN0cnVjdHVyZSAqLworc3RydWN0IGVhcF91c2VyCit7CisJaW50IGlkOwkvKnVzZXIncyBpZGVudGlmaWVyKi8KKwl1OCAJKnVzZXJpZDsJLyp1c2VyJ3MgaWRlbnRpdHkqLworCXUxNgl1c2VyaWRMZW5ndGg7CS8qVXNlcidzIGlkZW50aXR5IGxlbmd0aCovCisJdTggCSpwYXNzd29yZDsgLyp1c2VyJ3MgcGFzc3dvcmQqLworCXUxNiBwYXNzd29yZExlbmd0aDsJLypMZW5ndGggb2YgcGFzc3dvcmQqLworCisJaW50IG1ldGhvZElkOwkvKkN1cnJlbnQgbWV0aG9kIElkKi8KKwlzdHJ1Y3QgZWFwX21ldGhvZAorCXsKKwkJdTMyIHZlbmRvcjsKKwkJZWFwX3R5cGUgbWV0aG9kOworCX0gbWV0aG9kc1tNQVhNRVRIT0RTXTsgLyp1c2VkIG1ldGhvZCBmb3IgYXV0aGVudGljYXRpb24qLworCisJc3RydWN0IHByb3Bvc2VkX2VhcF9tZXRob2QKKwl7CisJCXUzMiB2ZW5kb3I7CisJCWVhcF90eXBlIG1ldGhvZDsKKwl9IHByb3Bvc2VkbWV0aG9kc1tNQVhQUk9QT1NFRE1FVEhPRFNdOyAvKiBtZXRob2RzIHByb3Bvc2VkIHRocm93IE5BSyByZXNwb25zZSBvciBFWFBBTkRFRCBOQUsqLworCWludCBwbWV0aG9kczsgLypOdW1iZXIgb2YgYWNjZXB0ZWQgbWV0aG9kcyBmcm9tIHBlZXIncyBwcm9wb3NlZCBtZXRob2RzKi8KKworCWVhcF90eXBlIHByb3Bvc2VkX2VhcF9tZXRob2Q7IC8qIFByb3Bvc2VkIEVBUCBNZXRob2QqLworCXUzMiBwcm9wb3NlZF9lYXBfbWV0aG9kX3ZlbmRvcjsKKwlib29sZWFuIHN1Y2Nlc3M7IC8qIFNldCB0byBUUlVFIGlmIFVzZXIgaXMgYXV0aGVudGljYXRlZCBzdWNjZXNzZnVsbHkgKi8KK307CisKK2Jvb2xlYW4gY2hlY2tfdXNlcl9pZGVudGl0eTsKKworaW50IGRpYW1lYXBfdXNlcl9nZXRfcGFzc3dvcmQoc3RydWN0IGVhcF91c2VyICp1c2VyLCB1OCAqIHBhc3N3b3JkLHUxNiAqbGVuZ3RoKTsKKworaW50IGRpYW1lYXBfdXNlcl9nZXRfdXNlcmlkKHN0cnVjdCBlYXBfdXNlciAqdXNlciwgdTggKiB1c2VyaWQpOworCitpbnQgZGlhbWVhcF91c2VyX3NldF9wYXNzd29yZChzdHJ1Y3QgZWFwX3VzZXIgKiB1c2VyLCB1OCAqIHBhc3N3b3JkLCB1MTYgTGVuZ3RoKTsKKworaW50IGRpYW1lYXBfdXNlcl9zZXRfdXNlcmlkKHN0cnVjdCBlYXBfdXNlciAqIHVzZXIsIHU4ICogdXNlcmlkLCB1MTYgTGVuZ3RoKTsKKworaW50IGRpYW1lYXBfdXNlcl9nZXRfbWV0aG9kaWQoc3RydWN0IGVhcF91c2VyICp1c2VyLGludCAqbWV0aG9kSWQpOworCitpbnQgZGlhbWVhcF91c2VyX3NldF9tZXRob2RpZChzdHJ1Y3QgZWFwX3VzZXIgKiB1c2VyLCBpbnQgbWV0aG9kSWQpOworCitib29sZWFuIGRpYW1lYXBfdXNlcl9pc3N1Y2Nlc3Moc3RydWN0IGVhcF91c2VyICp1c2VyKTsKKworaW50IGRpYW1lYXBfdXNlcl9zZXRfc3VjY2VzcyhzdHJ1Y3QgZWFwX3VzZXIgKiB1c2VyKTsKKworaW50IGRpYW1lYXBfdXNlcl9nZXRfZWFwX21ldGhvZChzdHJ1Y3QgZWFwX3VzZXIgKnVzZXIsIGludCBpZCwgc3RydWN0IGVhcF9tZXRob2QgKiBlYXBtZXRob2QpOworCitpbnQgZGlhbWVhcF91c2VyX3NldF9lYXBfbWV0aG9kKHN0cnVjdCBlYXBfdXNlciAqIHVzZXIsIGludCBpZCwgc3RydWN0IGVhcF9tZXRob2QgKiBtZXRob2QpOworCisjZW5kaWYgLyogRElBTUVBUF9VU0VSX0hfICovCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2FwcF9kaWFtZWFwL2xpYmNyeXB0LmMgYi9leHRlbnNpb25zL2FwcF9kaWFtZWFwL2xpYmNyeXB0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ2ZDZjOAotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvYXBwX2RpYW1lYXAvbGliY3J5cHQuYwpAQCAtMCwwICsxLDU2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkKKyAqIEF1dGhvciA6IFNvdWhlaWwgQmVuIEF5ZWQgPHNvdWhlaWxAdGVyYS5pY3Mua2Vpby5hYy5qcD4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMCwgU291aGVpbCBCZW4gQXllZCwgVGVyYW9rYSBMYWJvcmF0b3J5IG9mIEtlaW8gVW5pdmVyc2l0eSwgYW5kIHRoZSBXSURFIFByb2plY3QKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IFNvdWhlaWwgQmVuIEF5ZWQgPHNvdWhlaWxAdGVyYS5pY3Mua2Vpby5hYy5qcD4uCisgKgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiBTb3VoZWlsIEJlbiBBeWVkLCBUZXJhb2thIExhYm9yYXRvcnkgb2YgS2VpbyBVbml2ZXJzaXR5IG9yIHRoZSBXSURFIFByb2plY3Qgbm9yIHRoZQorICogICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgJydBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpbmNsdWRlICJsaWJjcnlwdC5oIgorCitpbnQgbWQ1aGFzaCh2b2lkICogYnVmZmVyLCBpbnQgbGVuZ3RoLCB2b2lkICogZGlnZXN0KXsKKworCWdjcnlfbWRfaGRfdCBtZDVfY3R4OworCisJZ2NyeV9tZF9vcGVuICggJm1kNV9jdHgsIEdDUllfTURfTUQ1LCAwKTsKKworCWlmKCFnY3J5X21kX2lzX2VuYWJsZWQobWQ1X2N0eCwgR0NSWV9NRF9NRDUpKXsKKwkJZnByaW50ZihzdGRlcnIsIltsaWJjcnlwdF0gdW5hYmxlIHRvIGluaXRpYXRlIE1ENSBoYXNoIGFsZ29yaXRobS5cbiIpOworCX0KKworCWdjcnlfbWRfd3JpdGUobWQ1X2N0eCxidWZmZXIsbGVuZ3RoKTsKKworCW1lbWNweSAoZGlnZXN0LCBnY3J5X21kX3JlYWQgKG1kNV9jdHgsIDApLCAxNik7CisJZ2NyeV9tZF9jbG9zZSAobWQ1X2N0eCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2FwcF9kaWFtZWFwL2xpYmNyeXB0LmggYi9leHRlbnNpb25zL2FwcF9kaWFtZWFwL2xpYmNyeXB0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc1MjM0YgotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvYXBwX2RpYW1lYXAvbGliY3J5cHQuaApAQCAtMCwwICsxLDU0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkKKyAqIEF1dGhvciA6IFNvdWhlaWwgQmVuIEF5ZWQgPHNvdWhlaWxAdGVyYS5pY3Mua2Vpby5hYy5qcD4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMCwgU291aGVpbCBCZW4gQXllZCwgVGVyYW9rYSBMYWJvcmF0b3J5IG9mIEtlaW8gVW5pdmVyc2l0eSwgYW5kIHRoZSBXSURFIFByb2plY3QKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IFNvdWhlaWwgQmVuIEF5ZWQgPHNvdWhlaWxAdGVyYS5pY3Mua2Vpby5hYy5qcD4uCisgKgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiBTb3VoZWlsIEJlbiBBeWVkLCBUZXJhb2thIExhYm9yYXRvcnkgb2YgS2VpbyBVbml2ZXJzaXR5IG9yIHRoZSBXSURFIFByb2plY3Qgbm9yIHRoZQorICogICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgJydBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgTElCQ1JZUFRfSF8KKyNkZWZpbmUgTElCQ1JZUFRfSF8KKworLyogRUFQLVRMUyovCisjaW5jbHVkZSAiZGlhbWVhcF90bHMuaCIKKworR0NDX0RJQUdfT0ZGKCItV2RlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIikKKyNpbmNsdWRlIDxnY3J5cHQuaD4KK0dDQ19ESUFHX09OKCItV2RlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIikKKyNpbmNsdWRlIDxzdGRpby5oPgorCisKKworaW50IG1kNWhhc2godm9pZCAqIGJ1ZmZlciwgaW50IGxlbmd0aCwgdm9pZCAqIGRpZ2VzdCk7CisKKyNlbmRpZiAvKiBMSUJDUllQVF9IXyAqLwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9hcHBfZGlhbWVhcC9saWJkaWFtZWFwLmggYi9leHRlbnNpb25zL2FwcF9kaWFtZWFwL2xpYmRpYW1lYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDU5ZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9hcHBfZGlhbWVhcC9saWJkaWFtZWFwLmgKQEAgLTAsMCArMSwxODcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKQorICogQXV0aG9yIDogU291aGVpbCBCZW4gQXllZCA8c291aGVpbEB0ZXJhLmljcy5rZWlvLmFjLmpwPgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOS0yMDEwLCBTb3VoZWlsIEJlbiBBeWVkLCBUZXJhb2thIExhYm9yYXRvcnkgb2YgS2VpbyBVbml2ZXJzaXR5LCBhbmQgdGhlIFdJREUgUHJvamVjdAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgU291aGVpbCBCZW4gQXllZCA8c291aGVpbEB0ZXJhLmljcy5rZWlvLmFjLmpwPi4KKyAqCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNvdWhlaWwgQmVuIEF5ZWQsIFRlcmFva2EgTGFib3JhdG9yeSBvZiBLZWlvIFVuaXZlcnNpdHkgb3IgdGhlIFdJREUgUHJvamVjdCBub3IgdGhlCisgKiAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAnJ0FTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBMSUJESUFNRUFQX0hfCisjZGVmaW5lIExJQkRJQU1FQVBfSF8KKworI2luY2x1ZGUgPGZyZWVEaWFtZXRlci9leHRlbnNpb24uaD4KKworI2RlZmluZSBESUFNRUFQX0VYVEVOU0lPTiAiW0RpYW1FQVAgZXh0ZW5zaW9uXSAiCisKKyNpbmNsdWRlICJkaWFtZWFwX2RlZnMuaCIKKyNpbmNsdWRlICJkaWFtZWFwX2VhcHBhY2tldC5oIgorI2luY2x1ZGUgImRpYW1lYXBfdXNlci5oIgorI2luY2x1ZGUgImRpYW1lYXBfbXlzcWwuaCIKKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxkbGZjbi5oPgorCisKKy8qIGF1dGhlbnRpY2F0aW9uIGFuZCBhdXRob3JpemF0aW9uIGF0dHJpYnV0ZXMgICovCisKK3N0cnVjdCBhdXRoX2F0dHJpYnV0ZQoreworCXN0cnVjdCBmZF9saXN0IGNoYWluOworCWNoYXIgKiBhdHRyaWI7CisJY2hhciAqIG9wOworCWNoYXIgKiB2YWx1ZTsKK307CisKK3N0cnVjdCBhdnBfYXR0cmlidXRlCit7CisJc3RydWN0IGZkX2xpc3QgY2hhaW47CisJY2hhciAqIGF0dHJpYjsKKwl1bmlvbiBhdnBfdmFsdWUgdmFsdWU7CisJaW50IHRvZnJlZTsKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCQlFQVAgTWV0aG9kcwlwbHVnaW5zCQkJCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGUgcmVnaXN0ZXIgZnVuY3Rpb25zIG9mIGFuIEVBUCBtZXRob2QgKi8KK3N0cnVjdCByZWdpc3Rlcl9wbHVnaW4KK3sKKwljaGFyICogY29uZmlndXJlOworCWNoYXIgKiBpbml0OworCWNoYXIgKiBpbml0UGlja1VwOworCWNoYXIgKiBidWlsZFJlcTsKKwljaGFyICogaXNEb25lOworCWNoYXIgKiBwcm9jZXNzOworCWNoYXIgKiBjaGVjazsKKwljaGFyICogZ2V0VGltZW91dDsKKwljaGFyICogZ2V0S2V5OworCWNoYXIgKiB1bnJlZ2lzdGVyOworCWNoYXIgKiBkYXRhZnJlZTsKK307CisKK3N0cnVjdCBlYXBfc3RhdGVfbWFjaGluZTsKKy8qIExpc3Qgb2YgcGx1Z2lucyB0byBsb2FkICggb25seSBFQVAgbWV0aG9kcyBkZWNsYXJlZCBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlIHdpbGwgYmUgbG9hZGVkKSAqLworc3RydWN0IHBsdWdpbgoreworCXN0cnVjdCBmZF9saXN0IGNoYWluOyAvKiBsaW5rIGluIHRoZSBsaXN0ICovCisJdTMyIHZlbmRvcjsJLyogdmVuZG9yKi8KKwljb25zdCBjaGFyICptZXRob2RuYW1lOyAvKiBuYW1lIG9mIHRoZSBFQVAgbWV0aG9kKi8KKwllYXBfdHlwZSBtZXRob2R0eXBlOyAvKiB0eXBlIG51bWJlciBvZiB0aGUgRUFQIG1ldGhvZCAqLworCWNoYXIgKnBsdWdpbmZpbGU7IC8qIHBsdWdpbiBmaWxlbmFtZSAqLworCWNoYXIgKmNvbmZmaWxlOyAvKiBvcHRpb25hbCBjb25maWd1cmF0aW9uIGZpbGUgbmFtZSBmb3IgdGhlIG1ldGhvZCAqLworCXZvaWQgKmhhbmRsZXI7IC8qIG9iamVjdCByZXR1cm5lZCBieSBkbG9wZW4oKSAqLworCWludCAoKmVhcF9tZXRob2RfY29uZmlndXJlKShjaGFyICogY29uZmlnZmlsZSk7IC8qIChPcHRpb25hbCkgYWRkcmVzcyBvZiB0aGUgZWFwX21ldGhvZF9jb25maWd1cmUgbWV0aG9kICovCisJaW50ICgqZWFwX21ldGhvZF9pbml0KShzdHJ1Y3QgZWFwX3N0YXRlX21hY2hpbmUgKnNtZCk7IC8qIGFkZHJlc3Mgb2YgdGhlIGVhcF9tZXRob2RfaW5pdCBtZXRob2QgKi8KKwlpbnQgKCplYXBfbWV0aG9kX2luaXRQaWNrVXApKHN0cnVjdCBlYXBfc3RhdGVfbWFjaGluZSAqc21kKTsgLyogYWRkcmVzcyBvZiB0aGUgZWFwX21ldGhvZF9pbml0UGlja1VwIG1ldGhvZCAqLworCWludCAoKmVhcF9tZXRob2RfYnVpbGRSZXEpKHN0cnVjdCBlYXBfc3RhdGVfbWFjaGluZSAqc21kLAorCQkJdTggaWRlbnRpZmllcixzdHJ1Y3QgZWFwX3BhY2tldCAqIGVhcFBhY2tldCk7IC8qIGFkZHJlc3Mgb2YgdGhlIGVhcF9tZXRob2RfYnVpbGRSZXEgbWV0aG9kICovCisJaW50ICgqZWFwX21ldGhvZF9nZXRUaW1lb3V0KShzdHJ1Y3QgZWFwX3N0YXRlX21hY2hpbmUgKnNtZCwgaW50ICogdGltZW91dCk7IC8qIGFkZHJlc3Mgb2YgdGhlIGVhcF9tZXRob2RfZ2V0VGltZW91dCBtZXRob2QgKi8KKwlib29sZWFuICgqZWFwX21ldGhvZF9jaGVjaykoc3RydWN0IGVhcF9zdGF0ZV9tYWNoaW5lICpzbWQsCisJCQlzdHJ1Y3QgZWFwX3BhY2tldCAqIGVhcFJlc3BEYXRhKTsgLyogYWRkcmVzcyBvZiB0aGUgZWFwX21ldGhvZF9jaGVjayBtZXRob2QgKi8KKwlpbnQgKCplYXBfbWV0aG9kX3Byb2Nlc3MpKHN0cnVjdCBlYXBfc3RhdGVfbWFjaGluZSAqc21kLAorCQkJc3RydWN0IGVhcF9wYWNrZXQgKiBlYXBSZXNwRGF0YSk7IC8qIGFkZHJlc3Mgb2YgdGhlIGVhcF9tZXRob2RfcHJvY2VzcyBtZXRob2QgKi8KKwlib29sZWFuICgqZWFwX21ldGhvZF9pc0RvbmUpKHN0cnVjdCBlYXBfc3RhdGVfbWFjaGluZSAqc21kKTsgLyogYWRkcmVzcyBvZiB0aGUgZWFwX21ldGhvZF9pc0RvbmUgbWV0aG9kICovCisJaW50ICgqZWFwX21ldGhvZF9nZXRLZXkpKHN0cnVjdCBlYXBfc3RhdGVfbWFjaGluZSAqc21kLCB1OCAqKiBtc2ssaW50ICptc2tsZW5ndGgsIAorCQkJdTggKiogZW1zayxpbnQgKmVtc2tsZW5ndGgpOyAvKiBhZGRyZXNzIG9mIHRoZSBlYXBfbWV0aG9kX2dldEtleSBtZXRob2QgKi8KKwl2b2lkICgqZWFwX21ldGhvZF91bnJlZ2lzdGVyKSh2b2lkKTsgLyogKE9wdGlvbmFsKSBhZGRyZXNzIG9mIHRoZSBlYXBfbWV0aG9kX3VucmVnaXN0ZXIgbWV0aG9kICovCisJdm9pZCAoKmVhcF9tZXRob2RfZnJlZSkodm9pZCAqKTsgLyogKE9wdGlvbmFsKSBhZGRyZXNzIG9mIHRoZSBlYXBfbWV0aG9kX2RhdGFmcmVlIG1ldGhvZCAqLworCit9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJRUFQIFN0YXRlIE1hY2hpbmUJCQkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRUFQIFBvbGljeSBEZWNpc2lvbiAqLwordHlwZWRlZiBlbnVtCit7CisJREVDSVNJT05fRkFJTFVSRSA9IDAsIERFQ0lTSU9OX1NVQ0NFU1MgPSAxLCBERUNJU0lPTl9DT05USU5VRSA9IDIKK30gZGVjaXNpb247CisKK3R5cGVkZWYgZW51bQoreworCUVBUF9NX0VORCwgRUFQX01fQ09OVElOVUUsIEVBUF9NX1BST1BPU0VECit9IGVhcF9tZXRob2Rfc3RhdGU7CisKKy8qIEVBUCBCYWNrZW5kIEF1dGhlbnRpY2F0b3IgU3RhdGUgTWFjaGluZSAoUkZDNDEzNykgKi8KKy8qIE1vc3Qgb2YgdmFyaWFibGVzIGFyZSBkZXNjcmliZWQgaW4gdGhlIHBhcnQgNiBvZiB0aGUgUkZDIDQxMzcgKi8KKy8qICovCitzdHJ1Y3QgZWFwX3N0YXRlX21hY2hpbmUKK3sKKwkvKkxvY2FsIHN0YXRlIE1hY2hpbmUgVmFyaWFibGVzKi8KKworCS8qIExvbmctVGVybSAoTWFpbnRhaW5lZCBiZXR3ZWVuIFBhY2tldHMpICovCisJZWFwX3R5cGUgY3VycmVudE1ldGhvZDsKKwl1MzIgY3VycmVudFZlbmRvcjsKKwlpbnQgY3VycmVudElkOworCWludCBsYXN0SWQ7CisJdm9pZCAqIG1ldGhvZERhdGE7CisJc3RydWN0IHBsdWdpbiAqc2VsZWN0ZWRNZXRob2Q7CisJdTggTkFLcHJvcG9zZWRNZXRob2RzWzI1MV07CisKKwllYXBfbWV0aG9kX3N0YXRlIG1ldGhvZFN0YXRlOworCisJc3RydWN0IGVhcF91c2VyIHVzZXI7CisKKwkvKiBTaG9ydC1UZXJtIChOb3QgTWFpbnRhaW5lZCBiZXR3ZWVuIGV4Y2hhbmdlZCBEaWFtZXRlciBFQVAgbWVzc2FnZXMpKi8KKwlib29sZWFuIHJ4UmVzcDsKKwlpbnQgcmVzcElkOworCWVhcF90eXBlIHJlc3BNZXRob2Q7CisJaW50IHJlc3BWZW5kb3JNZXRob2Q7CisJdTMyIHJlc3BWZW5kb3I7CisJZGVjaXNpb24gc21fZGVjaXNpb247CisJZW51bQorCXsKKwkJRUFQX0lOSVRJQUxJWkUsCisJCUVBUF9QSUNLX1VQX01FVEhPRCwKKwkJRUFQX0lETEUsCisJCUVBUF9SRUNFSVZFRCwKKwkJRUFQX1NFTkRfUkVRVUVTVCwKKwkJRUFQX0lOVEVHUklUWV9DSEVDSywKKwkJRUFQX01FVEhPRF9SRVFVRVNULAorCQlFQVBfTUVUSE9EX1JFU1BPTlNFLAorCQlFQVBfUFJPUE9TRV9NRVRIT0QsCisJCUVBUF9OQUssCisJCUVBUF9TRUxFQ1RfQUNUSU9OLAorCQlFQVBfRU5ELAorCQlFQVBfRElTQ0FSRAorCX0gZWFwX3N0YXRlOworCit9OworCisKKworI2VuZGlmIC8qIExJQkRJQU1FQVBfSF8gKi8KZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvYXBwX2RpYW1lYXAvcGx1Z2lucy5oIGIvZXh0ZW5zaW9ucy9hcHBfZGlhbWVhcC9wbHVnaW5zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRmOTJlNQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvYXBwX2RpYW1lYXAvcGx1Z2lucy5oCkBAIC0wLDAgKzEsODIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKQorICogQXV0aG9yIDogU291aGVpbCBCZW4gQXllZCA8c291aGVpbEB0ZXJhLmljcy5rZWlvLmFjLmpwPgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOS0yMDEwLCBTb3VoZWlsIEJlbiBBeWVkLCBUZXJhb2thIExhYm9yYXRvcnkgb2YgS2VpbyBVbml2ZXJzaXR5LCBhbmQgdGhlIFdJREUgUHJvamVjdAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgU291aGVpbCBCZW4gQXllZCA8c291aGVpbEB0ZXJhLmljcy5rZWlvLmFjLmpwPi4KKyAqCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNvdWhlaWwgQmVuIEF5ZWQsIFRlcmFva2EgTGFib3JhdG9yeSBvZiBLZWlvIFVuaXZlcnNpdHkgb3IgdGhlIFdJREUgUHJvamVjdCBub3IgdGhlCisgKiAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAnJ0FTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBfUExVR0lOU19ICisjZGVmaW5lIF9QTFVHSU5TX0gKKworI2luY2x1ZGUgImxpYmRpYW1lYXAuaCIKKyNpbmNsdWRlICJsaWJjcnlwdC5oIgorCisKKworCisvKiBNYWNybyB0aGF0IGRlZmluZSB0aGUgcmVnaXN0ZXIgZnVuY3Rpb25zIG9mIGFuIEVBUCBtZXRob2QgKi8KKyNkZWZpbmUgUkVHSVNURVJfTUVUSE9EKF9tZXRob2ROYW1lLCBfY29uZmlnRnVuY3Rpb24sIF9pbml0RnVuY3Rpb24sIF9pbml0UGlja1VwRnVuY3Rpb24sIF9idWlsZFJlcUZ1bmN0aW9uLCBfZ2V0VGltZW91dEZ1bmN0aW9uLCBfY2hlY2tGdW5jdGlvbiwgX3Byb2Nlc3NGdW5jdGlvbiwgX2lzRG9uZUZ1bmN0aW9uLCBfZ2V0S2V5RnVuY3Rpb24sIF91bnJlZ2lzdGVyRnVuY3Rpb24sIF9kYXRhZnJlZUZ1bmN0aW9uICApIFwKK3N0YXRpYyBzdHJ1Y3QgcmVnaXN0ZXJfcGx1Z2luICpyZWdpc3RlcnBsdWdpbiA9IE5VTEw7CVwKK3N0YXRpYyBpbnQgaXNyZWdpc3RlcmVkID0gMDsJXAoraW50IGRpYW1lYXBfcGx1Z2luX3JlZ2lzdGVyKCkgewlcCisJCWlmICghaXNyZWdpc3RlcmVkKXsJXAorCQkJcmVnaXN0ZXJwbHVnaW4gPSBtYWxsb2MgKHNpemVvZihzdHJ1Y3QgcmVnaXN0ZXJfcGx1Z2luKSk7IFwKKwkJCWlmKHJlZ2lzdGVycGx1Z2luPT1OVUxMKSBcCisJCQkJZnByaW50ZihzdGRlcnIsIltEaWFtRUFQIGV4dGVuc2lvbl0gRXJyb3IgaW4gcmVnaXN0ZXJpbmcgcGx1Zy1pblx0JXNcbiIsc3RyZXJyb3IoZXJybm8pKTsgXAorCQkJbWVtc2V0KHJlZ2lzdGVycGx1Z2luLCAwLCBzaXplb2Yoc3RydWN0IHJlZ2lzdGVyX3BsdWdpbikpOyBcCisJCQlpZihfY29uZmlnRnVuY3Rpb24pIHJlZ2lzdGVycGx1Z2luLT5jb25maWd1cmU9X2NvbmZpZ0Z1bmN0aW9uOwlcCisJCQlpZihfaW5pdEZ1bmN0aW9uKSByZWdpc3RlcnBsdWdpbi0+aW5pdD1faW5pdEZ1bmN0aW9uOwlcCisJCQlpZihfaW5pdFBpY2tVcEZ1bmN0aW9uKSByZWdpc3RlcnBsdWdpbi0+aW5pdFBpY2tVcD1faW5pdFBpY2tVcEZ1bmN0aW9uOwlcCisJCQlpZihfYnVpbGRSZXFGdW5jdGlvbikgcmVnaXN0ZXJwbHVnaW4tPmJ1aWxkUmVxPV9idWlsZFJlcUZ1bmN0aW9uOwlcCisJCQlpZihfZ2V0VGltZW91dEZ1bmN0aW9uKSByZWdpc3RlcnBsdWdpbi0+Z2V0VGltZW91dD1fZ2V0VGltZW91dEZ1bmN0aW9uOwlcCisJCQlpZihfY2hlY2tGdW5jdGlvbikgcmVnaXN0ZXJwbHVnaW4tPmNoZWNrPV9jaGVja0Z1bmN0aW9uOwlcCisJCQlpZihfcHJvY2Vzc0Z1bmN0aW9uKSByZWdpc3RlcnBsdWdpbi0+cHJvY2Vzcz1fcHJvY2Vzc0Z1bmN0aW9uOwlcCisJCQlpZihfaXNEb25lRnVuY3Rpb24pIHJlZ2lzdGVycGx1Z2luLT5pc0RvbmU9X2lzRG9uZUZ1bmN0aW9uOwlcCisJCQlpZihfZ2V0S2V5RnVuY3Rpb24pIHJlZ2lzdGVycGx1Z2luLT5nZXRLZXk9X2dldEtleUZ1bmN0aW9uOwlcCisJCQlpZihfdW5yZWdpc3RlckZ1bmN0aW9uKSByZWdpc3RlcnBsdWdpbi0+dW5yZWdpc3Rlcj1fdW5yZWdpc3RlckZ1bmN0aW9uOwlcCisJCQlpZihfZGF0YWZyZWVGdW5jdGlvbikgcmVnaXN0ZXJwbHVnaW4tPmRhdGFmcmVlPV9kYXRhZnJlZUZ1bmN0aW9uOwlcCisJCQlpc3JlZ2lzdGVyZWQrKzsgXAorCQl9ZWxzZXsgXAorCQkJIGZwcmludGYoc3RkZXJyLCAiQ2Fubm90IHJlZ2lzdGVyIHRoZSAiIF9tZXRob2ROYW1lICIgcGx1Z2luIHR3aWNlXG4iKTsJXAorCQkJcmV0dXJuIEVJTlZBTDsgXAorCQl9IFwKKwkJcmV0dXJuIDA7IFwKKwl9CVwKK2ludCBkaWFtZWFwX3BsdWdpbl9vYmplY3RzKHN0cnVjdCByZWdpc3Rlcl9wbHVnaW4gKiogcnBsdWdpbil7IFwKKypycGx1Z2luPXJlZ2lzdGVycGx1Z2luOyBcCityZXR1cm4gMDsgXAorfSBcCisKKworI2VuZGlmIC8qX1BMVUdJTlNfSCovCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2FwcF9kaWFtZWFwL3BsdWdpbnMvQ01ha2VMaXN0cy50eHQgYi9leHRlbnNpb25zL2FwcF9kaWFtZWFwL3BsdWdpbnMvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIzNjYxMQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvYXBwX2RpYW1lYXAvcGx1Z2lucy9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDM0IEBACitQUk9KRUNUKCJFQVAgTWV0aG9kcyBQbHVnaW5zIiBDKQorCitNQUNSTyhFQVBfQUREX01FVEhPRCBNRVRITkFNRSkKKyAgQUREX0xJQlJBUlkoJHtNRVRITkFNRX0gTU9EVUxFICR7QVJHTn0pCisgIFNFVF9UQVJHRVRfUFJPUEVSVElFUygke01FVEhOQU1FfSBQUk9QRVJUSUVTIFBSRUZJWCAiIiApCisgIFNFVF9UQVJHRVRfUFJPUEVSVElFUygke01FVEhOQU1FfSBQUk9QRVJUSUVTIFNVRkZJWCAiLmVtcCIgKQorICBJTlNUQUxMKFRBUkdFVFMgJHtNRVRITkFNRX0KKwlMSUJSQVJZIERFU1RJTkFUSU9OICR7SU5TVEFMTF9FWFRFTlNJT05TX1NVRkZJWH0KKwlDT01QT05FTlQgZnJlZURpYW1ldGVyLWVhcC1zZXJ2ZXIpCitFTkRNQUNSTyhFQVBfQUREX01FVEhPRCkKKworIyBVc2UgdGhlIG1hY3JvIEZEX0VBUF9QTFVHSU4oZXh0bWFjcm9uYW1lIHN1YmRpciBkZXNjciBkZWZhdWx0KSB0byAKKyMgYWRkIGEgbmV3IGV4dGVuc2lvbiBzdWJkaXJlY3RvcnkuCitNQUNSTyhGRF9FQVBfUExVR0lOIEVYVFNVQkRJUiBFWFRERVNDUiBFWFRERUZBVUxUKQorICAgU1RSSU5HKFRPVVBQRVIgJHtFWFRTVUJESVJ9IEVYVE1BQ1JPTkFNRSkKKyAgIElGIChOT1QgQUxMX0VYVEVOU0lPTlMpCisgICAgIE9QVElPTihCVUlMRF8ke0VYVE1BQ1JPTkFNRX0gJHtFWFRERVNDUn0gJHtFWFRERUZBVUxUfSkKKyAgIEVORElGIChOT1QgQUxMX0VYVEVOU0lPTlMpCisgICBJRiAoQlVJTERfJHtFWFRNQUNST05BTUV9IE9SIEFMTF9FWFRFTlNJT05TKQorICAgICAgQUREX1NVQkRJUkVDVE9SWSgke0VYVFNVQkRJUn0pCisgICBFTkRJRiAoQlVJTERfJHtFWFRNQUNST05BTUV9IE9SIEFMTF9FWFRFTlNJT05TKQorRU5ETUFDUk8oRkRfRUFQX1BMVUdJTikKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEVBUCBNZXRob2RzIFBsdWdpbnMgU2VjdGlvbgorCisjIEVBUCBJZGVudGl0eSBwbHVnaW4KK0ZEX0VBUF9QTFVHSU4oZWFwX2lkZW50aXR5ICJCdWlsZCBFQVAgSWRlbnRpdHkgUGx1Z2luICIgT04pCisKKyMgRUFQIE1ENSBwbHVnaW4KK0ZEX0VBUF9QTFVHSU4oZWFwX21kNSAiQnVpbGQgRUFQLU1ENSBQbHVnaW4gIiBPRkYpCisKKyMgRUFQIFRMUyBwbHVnaW4KK0ZEX0VBUF9QTFVHSU4oZWFwX3RscyAiQnVpbGQgRUFQLVRMUyBQbHVnaW4gIiBPRkYpCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2FwcF9kaWFtZWFwL3BsdWdpbnMvZWFwX2lkZW50aXR5L0NNYWtlTGlzdHMudHh0IGIvZXh0ZW5zaW9ucy9hcHBfZGlhbWVhcC9wbHVnaW5zL2VhcF9pZGVudGl0eS9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWY0NjlmCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9hcHBfZGlhbWVhcC9wbHVnaW5zL2VhcF9pZGVudGl0eS9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDQgQEAKKyMgRUFQIElkZW50aXR5IHBsdWdpbgorUFJPSkVDVCgiRUFQIElkZW50aXR5IFBsdWdpbiIgQykKKworRUFQX0FERF9NRVRIT0QoZWFwX2lkZW50aXR5IGVhcF9pZGVudGl0eS5jKQpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9hcHBfZGlhbWVhcC9wbHVnaW5zL2VhcF9pZGVudGl0eS9lYXBfaWRlbnRpdHkuYyBiL2V4dGVuc2lvbnMvYXBwX2RpYW1lYXAvcGx1Z2lucy9lYXBfaWRlbnRpdHkvZWFwX2lkZW50aXR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTczNmY5ZAotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvYXBwX2RpYW1lYXAvcGx1Z2lucy9lYXBfaWRlbnRpdHkvZWFwX2lkZW50aXR5LmMKQEAgLTAsMCArMSwxNzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKQorICogQXV0aG9yIDogU291aGVpbCBCZW4gQXllZCA8c291aGVpbEB0ZXJhLmljcy5rZWlvLmFjLmpwPgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOS0yMDEwLCBTb3VoZWlsIEJlbiBBeWVkLCBUZXJhb2thIExhYm9yYXRvcnkgb2YgS2VpbyBVbml2ZXJzaXR5LCBhbmQgdGhlIFdJREUgUHJvamVjdAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgU291aGVpbCBCZW4gQXllZCA8c291aGVpbEB0ZXJhLmljcy5rZWlvLmFjLmpwPi4KKyAqCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNvdWhlaWwgQmVuIEF5ZWQsIFRlcmFva2EgTGFib3JhdG9yeSBvZiBLZWlvIFVuaXZlcnNpdHkgb3IgdGhlIFdJREUgUHJvamVjdCBub3IgdGhlCisgKiAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAnJ0FTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICIuLi8uLi9wbHVnaW5zLmgiCisKK3N0cnVjdCBpZGVudGl0eV9kYXRhCit7CisJZW51bQorCXsKKwkJSURFTlRJVFlfQ09OVElOVUUsIElERU5USVRZX1NVQ0NFU1MsIElERU5USVRZX0ZBSUxVUkUKKwl9IHN0YXRlOworfTsKKworaW50IGlkZW50aXR5X2luaXQoc3RydWN0IGVhcF9zdGF0ZV9tYWNoaW5lICpzbWQpOworaW50IGlkZW50aXR5X2luaXRQaWNrVXAoc3RydWN0IGVhcF9zdGF0ZV9tYWNoaW5lICpzbWQpOworaW50IGlkZW50aXR5X2J1aWxkUmVxKHN0cnVjdCBlYXBfc3RhdGVfbWFjaGluZSAqc21kLCB1OCBpZGVudGl0eSwgc3RydWN0IGVhcF9wYWNrZXQgKiBlYXBQYWNrZXQpOworYm9vbGVhbiBpZGVudGl0eV9jaGVjayhzdHJ1Y3QgZWFwX3N0YXRlX21hY2hpbmUgKnNtZCwgc3RydWN0IGVhcF9wYWNrZXQgKmVhcFJlc3BEYXRhKTsKK2ludCBpZGVudGl0eV9wcm9jZXNzKHN0cnVjdCBlYXBfc3RhdGVfbWFjaGluZSAqc21kLCBzdHJ1Y3QgZWFwX3BhY2tldCAqZWFwUmVzcERhdGEpOworYm9vbGVhbiBpZGVudGl0eV9pc0RvbmUoc3RydWN0IGVhcF9zdGF0ZV9tYWNoaW5lICpzbWQpOwordm9pZCBpZGVudGl0eV9mcmVlKHZvaWQgKiBkYXRhKTsKKworUkVHSVNURVJfTUVUSE9EKCJpZGVudGl0eSIsIE5VTEwsICJpZGVudGl0eV9pbml0IiwgImlkZW50aXR5X2luaXRQaWNrVXAiLCAiaWRlbnRpdHlfYnVpbGRSZXEiLCBOVUxMLCAiaWRlbnRpdHlfY2hlY2siLCAiaWRlbnRpdHlfcHJvY2VzcyIsICJpZGVudGl0eV9pc0RvbmUiLCBOVUxMLCBOVUxMLCAiaWRlbnRpdHlfZnJlZSIpOworCisKK2ludCBpZGVudGl0eV9pbml0KHN0cnVjdCBlYXBfc3RhdGVfbWFjaGluZSAqc21kKQoreworCXN0cnVjdCBpZGVudGl0eV9kYXRhICpkYXRhID0gTlVMTDsKKwlDSEVDS19NQUxMT0MoZGF0YSA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGlkZW50aXR5X2RhdGEpKSk7CisJbWVtc2V0KGRhdGEsIDAsIHNpemVvZihzdHJ1Y3QgaWRlbnRpdHlfZGF0YSkpOworCWRhdGEtPnN0YXRlID0gSURFTlRJVFlfQ09OVElOVUU7CisJc21kLT5tZXRob2REYXRhID0gKHN0cnVjdCBpZGVudGl0eV9kYXRhKikgZGF0YTsKKworCXJldHVybiAwOworfQorCitpbnQgaWRlbnRpdHlfaW5pdFBpY2tVcChzdHJ1Y3QgZWFwX3N0YXRlX21hY2hpbmUgKnNtZCkKK3sKKwlzdHJ1Y3QgaWRlbnRpdHlfZGF0YSAqZGF0YSA9IE5VTEw7CisJQ0hFQ0tfTUFMTE9DKGRhdGEgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBpZGVudGl0eV9kYXRhKSkpOworCW1lbXNldChkYXRhLCAwLCBzaXplb2Yoc3RydWN0IGlkZW50aXR5X2RhdGEpKTsKKwlkYXRhLT5zdGF0ZSA9IElERU5USVRZX0NPTlRJTlVFOworCXNtZC0+bWV0aG9kRGF0YSA9IChzdHJ1Y3QgaWRlbnRpdHlfZGF0YSopIGRhdGE7CisJcmV0dXJuIDA7Cit9CisKK2ludCBpZGVudGl0eV9idWlsZFJlcShzdHJ1Y3QgZWFwX3N0YXRlX21hY2hpbmUgKnNtZCwgdTggaWRlbnRpdHksIHN0cnVjdCBlYXBfcGFja2V0ICogZWFwUGFja2V0KQoreworCisJQ0hFQ0tfRkNUKGRpYW1lYXBfZWFwX25ldyhFQVBfUkVRVUVTVCwgaWRlbnRpdHksIFRZUEVfSURFTlRJVFksIE5VTEwsIDAsZWFwUGFja2V0KSk7CisJcmV0dXJuIDA7CisKK30KKworCitib29sZWFuIGlkZW50aXR5X2NoZWNrKHN0cnVjdCBlYXBfc3RhdGVfbWFjaGluZSAqc21kLCBzdHJ1Y3QgZWFwX3BhY2tldCAqZWFwUGFja2V0KQoreworCisJaWYgKGVhcFBhY2tldC0+ZGF0YSA9PSBOVUxMKQorCXsKKwkJVFJBQ0VfREVCVUcoSU5GTywiJXNbRUFQIElkZW50aXR5IHBsdWdpbl0gRW1wdHkgRUFQIHBhY2tldCByZWNlaXZlZC4iLERJQU1FQVBfRVhURU5TSU9OKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwllYXBfdHlwZSB0eXBlOworCWlmKGRpYW1lYXBfZWFwX2dldF90eXBlKGVhcFBhY2tldCwmdHlwZSkhPTApeworCQlyZXR1cm4gRkFMU0U7CisJfQorCWlmICh0eXBlID09IFRZUEVfSURFTlRJVFkpCisJeworCQl1MTYgbGVuZ3RoOworCQlDSEVDS19GQ1QoZGlhbWVhcF9lYXBfZ2V0X2xlbmd0aChlYXBQYWNrZXQsJmxlbmd0aCkpOworCQlpZiAoKGludClsZW5ndGggPCA2KQorCQl7CisJCQlUUkFDRV9ERUJVRyhJTkZPLCIlc1tFQVAgSWRlbnRpdHkgcGx1Z2luXSBJbmNvcnJlY3QgRUFQIHBhY2tldCByZWNlaXZlZCAobGVuZ3RoID0gJWQgKS4iLERJQU1FQVBfRVhURU5TSU9OLGxlbmd0aCk7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKwkJaWYgKChpbnQpbGVuZ3RoID4gMTAyMCkKKwkJeworCQkJVFJBQ0VfREVCVUcoSU5GTywiJXNbRUFQIElkZW50aXR5IHBsdWdpbl0gSW5jb3JyZWN0IEVBUCBwYWNrZXQgcmVjZWl2ZWQgKGxlbmd0aCA9ICVkICkuIixESUFNRUFQX0VYVEVOU0lPTixsZW5ndGgpOworCQkJcmV0dXJuIEZBTFNFOworCQl9CisJCXJldHVybiBUUlVFOworCX0KKwlyZXR1cm4gRkFMU0U7Cit9CisKK2ludCBpZGVudGl0eV9wcm9jZXNzKHN0cnVjdCBlYXBfc3RhdGVfbWFjaGluZSAqc21kLCBzdHJ1Y3QgZWFwX3BhY2tldCAqZWFwUmVzcERhdGEpCit7CisJc3RydWN0IGlkZW50aXR5X2RhdGEgKiBkYXRhOworCXUxNiBsZW5ndGg7CisJY2hhciAqIHVzZXI7CisJdTggKiBSZXNwZGF0YTsKKwlpbnQgbGVuLHJldDsKKworCUNIRUNLX0ZDVChkaWFtZWFwX2VhcF9nZXRfbGVuZ3RoKGVhcFJlc3BEYXRhLCZsZW5ndGgpKTsKKwlkYXRhID0gKHN0cnVjdCBpZGVudGl0eV9kYXRhKikgc21kLT5tZXRob2REYXRhOworCisJQ0hFQ0tfTUFMTE9DKHVzZXI9bWFsbG9jKHNpemVvZihjaGFyKSooKGludClsZW5ndGgtNCkpKTsKKworCWRpYW1lYXBfZWFwX2dldF9kYXRhKGVhcFJlc3BEYXRhLCZSZXNwZGF0YSwmbGVuKTsKKwlpZihSZXNwZGF0YT09TlVMTCl7CisJCWRhdGEtPnN0YXRlID0gSURFTlRJVFlfRkFJTFVSRTsKKwkJZ290byBlbmQ7CisJfQorCVU4Q09QWSgodTggKil1c2VyLDAsbGVuLFJlc3BkYXRhKTsKKwl1c2VyW2xlbmd0aC01XT0nXDAnOworCWlmKGNoZWNrX3VzZXJfaWRlbnRpdHkgPT0gRkFMU0UpeworCQlyZXQ9ZGlhbWVhcF9nZXRfZWFwX3VzZXIoJihzbWQtPnVzZXIpLCJEZWZhdWx0IFVzZXIiKTsKKwkJQ0hFQ0tfTUFMTE9DX0RPKHNtZC0+dXNlci51c2VyaWQ9cmVhbGxvYyhzbWQtPnVzZXIudXNlcmlkLHN0cmxlbih1c2VyKSsxKSx7cmV0ID0gMTsgZ290byBuZXh0O30pOworCQltZW1jcHkoc21kLT51c2VyLnVzZXJpZCx1c2VyLHN0cmxlbih1c2VyKSsxKTsKKwkJc21kLT51c2VyLnVzZXJpZExlbmd0aCA9IHN0cmxlbih1c2VyKTsKKwl9IGVsc2UgeworCQlyZXQ9ZGlhbWVhcF9nZXRfZWFwX3VzZXIoJihzbWQtPnVzZXIpLHVzZXIpOworCX0KK25leHQ6CisJaWYocmV0PT0wKQorCXsKKwkJc21kLT51c2VyLm1ldGhvZElkID0gLTE7CisJCWRhdGEtPnN0YXRlID0gSURFTlRJVFlfU1VDQ0VTUzsKKwl9ZWxzZXsKKwkJZGF0YS0+c3RhdGUgPSBJREVOVElUWV9GQUlMVVJFOworCX0KK2VuZDoKKwlzbWQtPm1ldGhvZERhdGEgPSBkYXRhOworCWZyZWUodXNlcik7CisJdXNlcj1OVUxMOworCXJldHVybiAwOworfQorCitib29sZWFuIGlkZW50aXR5X2lzRG9uZShzdHJ1Y3QgZWFwX3N0YXRlX21hY2hpbmUgKnNtZCkKK3sKKwlzdHJ1Y3QgaWRlbnRpdHlfZGF0YSAqZGF0YTsKKwlkYXRhID0gKHN0cnVjdCBpZGVudGl0eV9kYXRhKikgc21kLT5tZXRob2REYXRhOworCWlmIChkYXRhLT5zdGF0ZSAhPSBJREVOVElUWV9DT05USU5VRSkKKwkJcmV0dXJuIFRSVUU7CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7Cit9CisKK3ZvaWQgaWRlbnRpdHlfZnJlZSh2b2lkICogZGF0YSkKK3sKKwlmcmVlKGRhdGEpOworCWRhdGE9TlVMTDsKK30KZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvYXBwX2RpYW1lYXAvcGx1Z2lucy9lYXBfbWQ1L0NNYWtlTGlzdHMudHh0IGIvZXh0ZW5zaW9ucy9hcHBfZGlhbWVhcC9wbHVnaW5zL2VhcF9tZDUvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMwMjUzYgotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvYXBwX2RpYW1lYXAvcGx1Z2lucy9lYXBfbWQ1L0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNCBAQAorIyBFQVAgTUQ1IFBsdWdpbgorUFJPSkVDVCgiRUFQIE1ENSBQbHVnaW4iIEMpCisKK0VBUF9BRERfTUVUSE9EKGVhcF9tZDUgZWFwX21kNS5jKQpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9hcHBfZGlhbWVhcC9wbHVnaW5zL2VhcF9tZDUvZWFwX21kNS5jIGIvZXh0ZW5zaW9ucy9hcHBfZGlhbWVhcC9wbHVnaW5zL2VhcF9tZDUvZWFwX21kNS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMWM5Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2FwcF9kaWFtZWFwL3BsdWdpbnMvZWFwX21kNS9lYXBfbWQ1LmMKQEAgLTAsMCArMSwyMDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKQorICogQXV0aG9yIDogU291aGVpbCBCZW4gQXllZCA8c291aGVpbEB0ZXJhLmljcy5rZWlvLmFjLmpwPgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOS0yMDEwLCBTb3VoZWlsIEJlbiBBeWVkLCBUZXJhb2thIExhYm9yYXRvcnkgb2YgS2VpbyBVbml2ZXJzaXR5LCBhbmQgdGhlIFdJREUgUHJvamVjdAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgU291aGVpbCBCZW4gQXllZCA8c291aGVpbEB0ZXJhLmljcy5rZWlvLmFjLmpwPi4KKyAqCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNvdWhlaWwgQmVuIEF5ZWQsIFRlcmFva2EgTGFib3JhdG9yeSBvZiBLZWlvIFVuaXZlcnNpdHkgb3IgdGhlIFdJREUgUHJvamVjdCBub3IgdGhlCisgKiAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAnJ0FTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2luY2x1ZGUgIi4uLy4uL3BsdWdpbnMuaCIKK0dDQ19ESUFHX09GRigiLVdkZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIpCisjaW5jbHVkZSA8Z2NyeXB0Lmg+CitHQ0NfRElBR19PTigiLVdkZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIpCisKKyNkZWZpbmUgQ0hBTExFTkdFX0xFTgkxNgorCitzdHJ1Y3QgZWFwX21kNV9kYXRhCit7CisJZW51bQorCXsKKwkJRUFQX01ENV9DT05USU5VRSwgRUFQX01ENV9TVUNDRVNTLCBFQVBfTUQ1X0ZBSUxVUkUKKwl9IHN0YXRlOworCXU4ICogY2hhbGxlbmdlOworfTsKKworaW50IGVhcF9tZDVfY29uZmlndXJlKGNoYXIgKiBjb25maWdmaWxlKTsKK2ludCBlYXBfbWQ1X2luaXQoc3RydWN0IGVhcF9zdGF0ZV9tYWNoaW5lICpzbWQpOworaW50IGVhcF9tZDVfaW5pdFBpY2tVcChzdHJ1Y3QgZWFwX3N0YXRlX21hY2hpbmUgKnNtZCk7CitpbnQgZWFwX21kNV9idWlsZFJlcShzdHJ1Y3QgZWFwX3N0YXRlX21hY2hpbmUgKnNtZCwgdTggZWFwX21kNSwKKwkJc3RydWN0IGVhcF9wYWNrZXQgKiBlYXBQYWNrZXQpOworYm9vbGVhbiBlYXBfbWQ1X2NoZWNrKHN0cnVjdCBlYXBfc3RhdGVfbWFjaGluZSAqc21kLCBzdHJ1Y3QgZWFwX3BhY2tldCAqZWFwUmVzcERhdGEpOworaW50IGVhcF9tZDVfcHJvY2VzcyhzdHJ1Y3QgZWFwX3N0YXRlX21hY2hpbmUgKnNtZCwgc3RydWN0IGVhcF9wYWNrZXQgKmVhcFJlc3BEYXRhKTsKK2Jvb2xlYW4gZWFwX21kNV9pc0RvbmUoc3RydWN0IGVhcF9zdGF0ZV9tYWNoaW5lICpzbWQpOwordm9pZCBlYXBfbWQ1X2ZyZWUodm9pZCAqIGRhdGEpOworCitSRUdJU1RFUl9NRVRIT0QoImVhcF9tZDUiLCAiZWFwX21kNV9jb25maWd1cmUiLCAiZWFwX21kNV9pbml0IiwgImVhcF9tZDVfaW5pdFBpY2tVcCIsICJlYXBfbWQ1X2J1aWxkUmVxIiwgTlVMTCwgImVhcF9tZDVfY2hlY2siLCAiZWFwX21kNV9wcm9jZXNzIiwgImVhcF9tZDVfaXNEb25lIiwgTlVMTCwgTlVMTCwgImVhcF9tZDVfZnJlZSIpCis7CisKK2ludCBlYXBfbWQ1X2NvbmZpZ3VyZShjaGFyICogY29uZmlnZmlsZSkKK3sKKwlnY3J5X2NvbnRyb2wgKEdDUllDVExfRU5BQkxFX1FVSUNLX1JBTkRPTSwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGVhcF9tZDVfaW5pdChzdHJ1Y3QgZWFwX3N0YXRlX21hY2hpbmUgKnNtZCkKK3sKKwlzdHJ1Y3QgZWFwX21kNV9kYXRhICpkYXRhID0gTlVMTDsKKwlDSEVDS19NQUxMT0MoZGF0YSA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGVhcF9tZDVfZGF0YSkpKTsKKwltZW1zZXQoZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBlYXBfbWQ1X2RhdGEpKTsKKwlkYXRhLT5zdGF0ZSA9IEVBUF9NRDVfQ09OVElOVUU7CisJZGF0YS0+Y2hhbGxlbmdlID0gTlVMTDsKKwlzbWQtPm1ldGhvZERhdGEgPSAoc3RydWN0IGVhcF9tZDVfZGF0YSopIGRhdGE7CisJcmV0dXJuIDA7Cit9CisKKworaW50IGVhcF9tZDVfYnVpbGRSZXEoc3RydWN0IGVhcF9zdGF0ZV9tYWNoaW5lICpzbWQsIHU4IGlkLAorCQlzdHJ1Y3QgZWFwX3BhY2tldCAqIGVhcFBhY2tldCkKK3sKKwlzdHJ1Y3QgZWFwX21kNV9kYXRhICogZGF0YTsKKwl1OCAqcGF5bG9hZCwgKmNoYWxsZW5nZTsKKworCWRhdGEgPSAoc3RydWN0IGVhcF9tZDVfZGF0YSAqKSBzbWQtPm1ldGhvZERhdGE7CisJQ0hFQ0tfTUFMTE9DKCBjaGFsbGVuZ2U9bWFsbG9jKHNpemVvZih1OCkqQ0hBTExFTkdFX0xFTikpOworCUNIRUNLX01BTExPQyggcGF5bG9hZD1tYWxsb2Moc2l6ZW9mKHU4KSooQ0hBTExFTkdFX0xFTisxKSkpOworCW1lbXNldChwYXlsb2FkLCAwLCBzaXplb2YodTgpICogKENIQUxMRU5HRV9MRU4gKyAxKSk7CisKKwlnY3J5X2NyZWF0ZV9ub25jZShjaGFsbGVuZ2UsQ0hBTExFTkdFX0xFTik7CisJVThDT1BZKHBheWxvYWQsIDEsIENIQUxMRU5HRV9MRU4sIGNoYWxsZW5nZSk7CisJcGF5bG9hZFswXSA9ICh1OCkgQ0hBTExFTkdFX0xFTjsKKwlDSEVDS19GQ1QoZGlhbWVhcF9lYXBfbmV3KEVBUF9SRVFVRVNULCBpZCwgVFlQRV9FQVBfTUQ1LCBwYXlsb2FkLCBDSEFMTEVOR0VfTEVOCisJCQkJCSsgMSxlYXBQYWNrZXQpKTsKKwlDSEVDS19NQUxMT0MoZGF0YS0+Y2hhbGxlbmdlPXJlYWxsb2MoZGF0YS0+Y2hhbGxlbmdlLHNpemVvZih1OCkqQ0hBTExFTkdFX0xFTikpOworCVU4Q09QWShkYXRhLT5jaGFsbGVuZ2UsMCxDSEFMTEVOR0VfTEVOLGNoYWxsZW5nZSk7CisKKwlzbWQtPm1ldGhvZERhdGEgPSBkYXRhOworCisJZnJlZShjaGFsbGVuZ2UpOworCWNoYWxsZW5nZT1OVUxMOworCWZyZWUocGF5bG9hZCk7CisJcGF5bG9hZD1OVUxMOworCisJcmV0dXJuIDA7Cit9CisKKworYm9vbGVhbiBlYXBfbWQ1X2NoZWNrKHN0cnVjdCBlYXBfc3RhdGVfbWFjaGluZSAqc21kLCBzdHJ1Y3QgZWFwX3BhY2tldCAqZWFwUmVzcERhdGEpCit7CisJZWFwX3R5cGUgdHlwZTsKKwlpZihkaWFtZWFwX2VhcF9nZXRfdHlwZShlYXBSZXNwRGF0YSwmdHlwZSkhPTApeworCQlyZXR1cm4gRkFMU0U7CisJfQorCWlmICh0eXBlID09IFRZUEVfRUFQX01ENSkKKwl7CisJCXUxNiBsZW5ndGg7CisJCUNIRUNLX0ZDVChkaWFtZWFwX2VhcF9nZXRfbGVuZ3RoKGVhcFJlc3BEYXRhLCZsZW5ndGgpKTsKKwkJaWYgKChpbnQpIGxlbmd0aCA8IDYpCisJCXsKKwkJCVRSQUNFX0RFQlVHKElORk8sIiVzW0VBUCBNRDUgcGx1Z2luXSBJbmNvcnJlY3QgRUFQIHBhY2tldCByZWNlaXZlZCAobGVuZ3RoID0gJWQgKS4iLERJQU1FQVBfRVhURU5TSU9OLGxlbmd0aCk7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKwkJcmV0dXJuIFRSVUU7CisJfQorCXJldHVybiBGQUxTRTsKK30KKworCisKK2ludCBlYXBfbWQ1X3Byb2Nlc3Moc3RydWN0IGVhcF9zdGF0ZV9tYWNoaW5lICpzbWQsIHN0cnVjdCBlYXBfcGFja2V0ICplYXBSZXNwRGF0YSkKK3sKKworCXN0cnVjdCBlYXBfbWQ1X2RhdGEgKiBkYXRhOworCWludCB3b3JkbGVuID0gMCwgaSA9IDA7CisJdTggKiB3b3JkLCAqaGFzaCwgaWQ7CisJZGF0YSA9IChzdHJ1Y3QgZWFwX21kNV9kYXRhKikgc21kLT5tZXRob2REYXRhOworCXdvcmRsZW4gPSAxICsgc21kLT51c2VyLnBhc3N3b3JkTGVuZ3RoICsgQ0hBTExFTkdFX0xFTjsKKwlDSEVDS19NQUxMT0Mod29yZCA9IG1hbGxvYyhzaXplb2YodTgpKndvcmRsZW4pKTsKKwltZW1zZXQod29yZCwgMCwgc2l6ZW9mKHU4KSAqIHdvcmRsZW4pOworCUNIRUNLX0ZDVChkaWFtZWFwX2VhcF9nZXRfaWRlbnRpZmllcihlYXBSZXNwRGF0YSwmaWQpKTsKKwkqd29yZCA9IGlkOworCVU4Q09QWSh3b3JkLDEsc21kLT51c2VyLnBhc3N3b3JkTGVuZ3RoLHNtZC0+dXNlci5wYXNzd29yZCk7CisJVThDT1BZKHdvcmQsMStzbWQtPnVzZXIucGFzc3dvcmRMZW5ndGgsQ0hBTExFTkdFX0xFTixkYXRhLT5jaGFsbGVuZ2UpOworCUNIRUNLX01BTExPQyhoYXNoID0gbWFsbG9jKHNpemVvZih1OCkqMTYpKTsKKworCW1kNWhhc2god29yZCwgd29yZGxlbiwgaGFzaCk7CisKKworCWZvciAoaSA9IDA7IGkgPCBDSEFMTEVOR0VfTEVOOyBpKyspCisJeworCQlpZiAoRzgoaGFzaCArIGkpICE9IEc4KGVhcFJlc3BEYXRhLT5kYXRhICsgNiArIGkpKQorCQl7CisJCQlkYXRhLT5zdGF0ZSA9IEVBUF9NRDVfRkFJTFVSRTsKKwkJfQorCX0KKworCWlmIChkYXRhLT5zdGF0ZSAhPSBFQVBfTUQ1X0ZBSUxVUkUpCisJeworCQlkYXRhLT5zdGF0ZSA9IEVBUF9NRDVfU1VDQ0VTUzsKKwkJc21kLT51c2VyLnN1Y2Nlc3MgPSBUUlVFOworCX0KKworCXNtZC0+bWV0aG9kRGF0YSA9IGRhdGE7CisJZnJlZShoYXNoKTsKKwloYXNoPU5VTEw7CisJZnJlZSh3b3JkKTsKKwl3b3JkPU5VTEw7CisJcmV0dXJuIDA7Cit9CisKK2Jvb2xlYW4gZWFwX21kNV9pc0RvbmUoc3RydWN0IGVhcF9zdGF0ZV9tYWNoaW5lICpzbWQpCit7CisJc3RydWN0IGVhcF9tZDVfZGF0YSAqZGF0YTsKKwlkYXRhID0gKHN0cnVjdCBlYXBfbWQ1X2RhdGEqKSBzbWQtPm1ldGhvZERhdGE7CisJaWYgKGRhdGEtPnN0YXRlICE9IEVBUF9NRDVfQ09OVElOVUUpCisJeworCQlyZXR1cm4gVFJVRTsKKwl9CisJcmV0dXJuIEZBTFNFOworfQorCisKK3ZvaWQgZWFwX21kNV9mcmVlKHZvaWQgKiBtZGF0YSkKK3sKKwlzdHJ1Y3QgZWFwX21kNV9kYXRhICpkYXRhOworCWRhdGEgPSAoc3RydWN0IGVhcF9tZDVfZGF0YSopIG1kYXRhOworCWZyZWUoZGF0YS0+Y2hhbGxlbmdlKTsKKwlkYXRhLT5jaGFsbGVuZ2U9TlVMTDsKKwlmcmVlKGRhdGEpOworCWRhdGE9TlVMTDsKK30KZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvYXBwX2RpYW1lYXAvcGx1Z2lucy9lYXBfdGxzL0NNYWtlTGlzdHMudHh0IGIvZXh0ZW5zaW9ucy9hcHBfZGlhbWVhcC9wbHVnaW5zL2VhcF90bHMvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIzZDEzNAotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvYXBwX2RpYW1lYXAvcGx1Z2lucy9lYXBfdGxzL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTggQEAKKyMgVGhlIEVBUC1UTFMgUGx1Z2luCitQUk9KRUNUKCJFQVAtVExTIFBsdWdpbiIgQykKKworIyBQYXJzZXIgZm9yIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgCitCSVNPTl9GSUxFKGVhcHRscy55KQorRkxFWF9GSUxFKGVhcHRscy5sKQorCitTRVRfU09VUkNFX0ZJTEVTX1BST1BFUlRJRVMobGV4LmVhcHRscy5jIGVhcHRscy50YWIuYyBQUk9QRVJUSUVTIENPTVBJTEVfRkxBR1MgIi1JIFwiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9XCIiKQorCitFQVBfQUREX01FVEhPRChlYXBfdGxzCisgICAgZWFwX3Rscy5jCisgICAgZWFwX3Rscy5oICAgIAorICAgIGxleC5lYXB0bHMuYworICAgIGVhcHRscy50YWIuYworICAgIGVhcHRscy50YWIuaAorICAgICkKKworVEFSR0VUX0xJTktfTElCUkFSSUVTKGVhcF90bHMgJHtHTlVUTFNfTElCUkFSSUVTfSkKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvYXBwX2RpYW1lYXAvcGx1Z2lucy9lYXBfdGxzL2VhcF90bHMuYyBiL2V4dGVuc2lvbnMvYXBwX2RpYW1lYXAvcGx1Z2lucy9lYXBfdGxzL2VhcF90bHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjgxMmRkCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9hcHBfZGlhbWVhcC9wbHVnaW5zL2VhcF90bHMvZWFwX3Rscy5jCkBAIC0wLDAgKzEsNDI2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkKKyAqIEF1dGhvciA6IFNvdWhlaWwgQmVuIEF5ZWQgPHNvdWhlaWxAdGVyYS5pY3Mua2Vpby5hYy5qcD4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMCwgU291aGVpbCBCZW4gQXllZCwgVGVyYW9rYSBMYWJvcmF0b3J5IG9mIEtlaW8gVW5pdmVyc2l0eSwgYW5kIHRoZSBXSURFIFByb2plY3QKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IFNvdWhlaWwgQmVuIEF5ZWQgPHNvdWhlaWxAdGVyYS5pY3Mua2Vpby5hYy5qcD4uCisgKgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiBTb3VoZWlsIEJlbiBBeWVkLCBUZXJhb2thIExhYm9yYXRvcnkgb2YgS2VpbyBVbml2ZXJzaXR5IG9yIHRoZSBXSURFIFByb2plY3Qgbm9yIHRoZQorICogICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgJydBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpbmNsdWRlICJlYXBfdGxzLmgiCisKK2ludCBlYXBfdGxzX2NvbmZpZ3VyZShjaGFyICogY29uZmlnZmlsZSk7CitpbnQgZWFwX3Rsc19pbml0KHN0cnVjdCBlYXBfc3RhdGVfbWFjaGluZSAqc21kKTsKK2ludCBlYXBfdGxzX2luaXRQaWNrVXAoc3RydWN0IGVhcF9zdGF0ZV9tYWNoaW5lICpzbWQpOworaW50IGVhcF90bHNfYnVpbGRSZXEoc3RydWN0IGVhcF9zdGF0ZV9tYWNoaW5lICpzbWQsIHU4IGVhcF9tZDUsCisJCXN0cnVjdCBlYXBfcGFja2V0ICogZWFwUGFja2V0KTsKK2ludCBlYXBfdGxzX2dldFRpbWVvdXQoc3RydWN0IGVhcF9zdGF0ZV9tYWNoaW5lICpzbWQsIGludCAqIHRpbWVvdXQpOworYm9vbGVhbiBlYXBfdGxzX2NoZWNrKHN0cnVjdCBlYXBfc3RhdGVfbWFjaGluZSAqc21kLAorCQlzdHJ1Y3QgZWFwX3BhY2tldCAqZWFwUmVzcERhdGEpOworaW50IGVhcF90bHNfcHJvY2VzcyhzdHJ1Y3QgZWFwX3N0YXRlX21hY2hpbmUgKnNtZCwKKwkJc3RydWN0IGVhcF9wYWNrZXQgKmVhcFJlc3BEYXRhKTsKK2Jvb2xlYW4gZWFwX3Rsc19pc0RvbmUoc3RydWN0IGVhcF9zdGF0ZV9tYWNoaW5lICpzbWQpOworaW50IGVhcF90bHNfZ2V0S2V5KHN0cnVjdCBlYXBfc3RhdGVfbWFjaGluZSAqc21kLCB1OCoqIG1zaywgaW50ICogbXNrbGVuLCB1OCoqIGVtc2ssIGludCAqIGVtc2tsZW4pOwordm9pZCBlYXBfdGxzX3VucmVnaXN0ZXIodm9pZCk7Cit2b2lkIGVhcF90bHNfZnJlZSh2b2lkICogZGF0YSk7CisKK1JFR0lTVEVSX01FVEhPRCgiZWFwX3RscyIsICJlYXBfdGxzX2NvbmZpZ3VyZSIsICJlYXBfdGxzX2luaXQiLCAiZWFwX3Rsc19pbml0UGlja1VwIiwgImVhcF90bHNfYnVpbGRSZXEiLCAiZWFwX3Rsc19nZXRUaW1lb3V0IiwgImVhcF90bHNfY2hlY2siLCAiZWFwX3Rsc19wcm9jZXNzIiwgImVhcF90bHNfaXNEb25lIiwgImVhcF90bHNfZ2V0S2V5IiwgImVhcF90bHNfdW5yZWdpc3RlciIsICJlYXBfdGxzX2ZyZWUiKQorOworCitpbnQgZWFwX3Rsc19jb25maWd1cmUoY2hhciAqIGNvbmZpZ2ZpbGUpCit7CisJaW50IHJldDsKKwlleHRlcm4gRklMRSAqIGVhcHRsc2luOworCisJaWYgKGNvbmZpZ2ZpbGUpCisJeworCQl0bHNfZ2xvYmFsX2NvbmYuY29uZmZpbGUgPSBjb25maWdmaWxlOworCX0KKwl0bHNfZ2xvYmFsX2NvbmYuY2VydGZpbGUgPSBOVUxMOworCXRsc19nbG9iYWxfY29uZi5rZXlmaWxlID0gTlVMTDsKKwl0bHNfZ2xvYmFsX2NvbmYuY2FmaWxlID0gTlVMTDsKKwl0bHNfZ2xvYmFsX2NvbmYuY3JsZmlsZSA9IE5VTEw7CisJdGxzX2dsb2JhbF9jb25mLmNoZWNrX2NlcnRfY25fdXNlcm5hbWUgPSBGQUxTRTsKKworCS8qUGFyc2UgRUFQIFRMUyBjb25maWd1cmF0aW9uIGZpbGUgKi8KKwllYXB0bHNpbiA9IGZvcGVuKHRsc19nbG9iYWxfY29uZi5jb25mZmlsZSwgInIiKTsKKwlpZiAoIWVhcHRsc2luKQorCXsKKwkJVFJBQ0VfREVCVUcoSU5GTywiJXNbRUFQIFRMUyBwbHVnaW5dIFVuYWJsZSB0byBvcGVuIGNvbmZpZ3VyYXRpb24gZmlsZSAlcyBmb3IgcmVhZGluZzogJXMiLERJQU1FQVBfRVhURU5TSU9OLCB0bHNfZ2xvYmFsX2NvbmYuY29uZmZpbGUsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiBlcnJubzsKKwl9CisKKwkvKiBjYWxsIHlhY2MgcGFyc2VyICovCisJQ0hFQ0tfRkNUKGVhcHRsc3BhcnNlKCZ0bHNfZ2xvYmFsX2NvbmYpKTsKKworCisJdGxzX2dsb2JhbF9jb25mLm1heF9zaXplID0gNjQqMTAyNCAvKiBBcyBwZXIgUkZDIDUyMTYgcmVjb21tZW5kYXRpb24gKi87CisKKwkvKiBJbml0aWFsaXppbmcgR251VExTIGxpYnJhcnkgKi8KKwlyZXQgPSBkaWFtZWFwX3Rsc19pbml0KCZ0bHNfZ2xvYmFsX2NvbmYpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IGVhcF90bHNfaW5pdChzdHJ1Y3QgZWFwX3N0YXRlX21hY2hpbmUgKnNtZCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCB0bHNfZGF0YSAqZGF0YSA9IE5VTEw7CisJQ0hFQ0tfTUFMTE9DKGRhdGEgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCB0bHNfZGF0YSkpKTsKKwltZW1zZXQoZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCB0bHNfZGF0YSkpOworCUNIRUNLX0ZDVChkaWFtZWFwX3Rsc19pbml0aWFsaXplKGRhdGEpKTsKKwlyZXQgPSBkaWFtZWFwX3Rsc19pbml0X3Nlc3Npb24oJnRsc19nbG9iYWxfY29uZiwgZGF0YSk7CisKKwlzbWQtPm1ldGhvZERhdGEgPSAoc3RydWN0IHRsc19kYXRhKikgZGF0YTsKKwlpZiAocmV0IDwgMCkKKwl7CisJCXJldHVybiByZXQ7CisJfQorCXJldHVybiAwOworfQorCitpbnQgZWFwX3Rsc19pbml0UGlja1VwKHN0cnVjdCBlYXBfc3RhdGVfbWFjaGluZSAqc21kKQoreworCXJldHVybiAwOworfQorCitpbnQgZWFwX3Rsc19idWlsZFJlcShzdHJ1Y3QgZWFwX3N0YXRlX21hY2hpbmUgKnNtZCwgdTggaWQsCisJCXN0cnVjdCBlYXBfcGFja2V0ICogZWFwUGFja2V0KQoreworCXN0cnVjdCB0bHNfZGF0YSAqIGRhdGE7CisJZGF0YSA9IChzdHJ1Y3QgdGxzX2RhdGEgKikgc21kLT5tZXRob2REYXRhOworCisJaWYgKGRhdGEtPm1vcmVfdG9yZWNlaXZlID09IFRSVUUpCisJeworCQlDSEVDS19GQ1QoZGlhbWVhcF9lYXBfdGxzX2J1aWxkUmVxX2FjayhpZCxlYXBQYWNrZXQpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGRhdGEtPnN0YXRlID09IFNUQVJUKQorCXsKKwkJQ0hFQ0tfRkNUKGRpYW1lYXBfZWFwX3Rsc19idWlsZFJlcV9zdGFydChpZCxlYXBQYWNrZXQpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGRhdGEtPnN0YXRlID09IENPTlRJTlVFKQorCXsKKwkJZGlhbWVhcF9lYXBfdGxzX2J1aWxkUmVxX2RhdGEoZGF0YSwgaWQsIGVhcFBhY2tldCk7CisKKwkJc21kLT5tZXRob2REYXRhID0gKHN0cnVjdCB0bHNfZGF0YSopIGRhdGE7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgZWFwX3Rsc19nZXRUaW1lb3V0KHN0cnVjdCBlYXBfc3RhdGVfbWFjaGluZSAqc21kLCBpbnQgKiB0aW1lb3V0KQoreworCXJldHVybiAwOworfQorCitib29sZWFuIGVhcF90bHNfY2hlY2soc3RydWN0IGVhcF9zdGF0ZV9tYWNoaW5lICpzbWQsCisJCXN0cnVjdCBlYXBfcGFja2V0ICplYXBSZXNwRGF0YSkKK3sKKwllYXBfdHlwZSB0eXBlOworCWlmKGRpYW1lYXBfZWFwX2dldF90eXBlKGVhcFJlc3BEYXRhLCZ0eXBlKSE9MCl7CisJCWdvdG8gY2Y7CisJfQorCWlmICh0eXBlID09IFRZUEVfRUFQX1RMUykKKwl7CisJCXJldHVybiBUUlVFOworCX0KK2NmOgorCVRSQUNFX0RFQlVHKElORk8sIiVzW0VBUCBUTFMgcGx1Z2luXSBFQVAtVExTIGNoZWNrIGZhaWxlZDogUmVjZWl2ZWQgRUFQIHBhY2tldCB3aXRoIGRpZmZlcmVudCBFQVAtVHlwZSAoVHlwZSA9ICVkKSIsRElBTUVBUF9FWFRFTlNJT04sIHR5cGUpOworCXJldHVybiBGQUxTRTsKK30KKworaW50IGVhcF90bHNfcHJvY2VzcyhzdHJ1Y3QgZWFwX3N0YXRlX21hY2hpbmUgKnNtZCwKKwkJc3RydWN0IGVhcF9wYWNrZXQgKmVhcFJlc3BEYXRhKQoreworCXN0cnVjdCB0bHNfZGF0YSAqIGRhdGE7CisJZGF0YSA9IChzdHJ1Y3QgdGxzX2RhdGEgKikgc21kLT5tZXRob2REYXRhOworCXN0cnVjdCB0bHNfbXNnIHRsc21zZzsKKwlDSEVDS19GQ1QoZGlhbWVhcF9lYXBfdGxzX3BhcnNlKCZ0bHNtc2csZWFwUmVzcERhdGEpKTsKKworCWlmICgodGxzbXNnLmRhdGFsZW5ndGggPT0gMCkpCisJeworCQlpZiAoZGF0YS0+bW9yZV90b3NlbmRfbGVuZ3RoID4gMCkKKwkJeworCQkJLy9BQ0sgYW5kIG1vcmUgdG8gc2VuZAorCQkJcmV0dXJuIDA7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvL1N1Y2Nlc3MKKwkJCWlmIChkYXRhLT5oYW5kc2hha2UgPT0gVFJVRSkKKwkJCXsKKwkJCQlkYXRhLT5zdGF0ZSA9IFNVQ0NFU1M7CisJCQkJc21kLT51c2VyLnN1Y2Nlc3MgPSBUUlVFOworCisJCQkJaWYodGxzX2dsb2JhbF9jb25mLmNoZWNrX2NlcnRfY25fdXNlcm5hbWUgPT0gVFJVRSl7CisJCQkJCXVuc2lnbmVkIGludCBsaXN0X3NpemU7CisJCQkJCWNvbnN0IGdudXRsc19kYXR1bV90ICogbGlzdCA9IGdudXRsc19jZXJ0aWZpY2F0ZV9nZXRfcGVlcnMgKGRhdGEtPnNlc3Npb24sICZsaXN0X3NpemUpOworCQkJCQlpZihsaXN0X3NpemU8MSl7CisJCQkJCQlnb3RvIGZhaWx1cmU7CisJCQkJCX0KKworCQkJCQlnbnV0bHNfeDUwOV9jcnRfdCBjZXJ0OworCQkKKwkJCQkJQ0hFQ0tfR05VVExTX0RPKGdudXRsc194NTA5X2NydF9pbml0KCZjZXJ0KSx7CisJCQkJCQlUUkFDRV9ERUJVRyhOT05FLCIlc1tFQVAgVExTIHBsdWdpbl0gW0dudVRMU10gZXJyb3IgaW4gaW5pdGlhbGl6YXRpb24gY3J0IGluaXQiLERJQU1FQVBfRVhURU5TSU9OKTsKKwkJCQkJCWdvdG8gZmFpbHVyZTt9KTsKKwkJCQkJCisJCQkJCUNIRUNLX0dOVVRMU19ETyhnbnV0bHNfeDUwOV9jcnRfaW1wb3J0KGNlcnQsICZsaXN0WzBdLCBHTlVUTFNfWDUwOV9GTVRfREVSKSwgeworCQkJCQkJVFJBQ0VfREVCVUcoTk9ORSwiJXNbRUFQIFRMUyBwbHVnaW5dIFtHbnVUTFNdIGVycm9yIHBhcnNpbmcgY2VydGlmaWNhdGUiLERJQU1FQVBfRVhURU5TSU9OKTsKKwkJCQkJCWdvdG8gZmFpbHVyZTt9KTsKKworCQkJCQl2b2lkICogYnVmZjsKKwkJCQkJc2l6ZV90IHNpemVfYnVmZmVyOworCQkJCQlpbnQgcmV0OworCQkJCQlyZXQgPSBnbnV0bHNfeDUwOV9jcnRfZ2V0X2RuX2J5X29pZChjZXJ0LEdOVVRMU19PSURfWDUyMF9DT01NT05fTkFNRSwwLDAsTlVMTCwmc2l6ZV9idWZmZXIpOworCQkJCQlpZiggcmV0ICE9IEdOVVRMU19FX1NIT1JUX01FTU9SWV9CVUZGRVIpeworCQkJCQkJQ0hFQ0tfR05VVExTX0RPKHJldCx7CisJCQkJCQkJVFJBQ0VfREVCVUcoTk9ORSwiJXNbRUFQIFRMUyBwbHVnaW5dIFtHbnVUTFNdIGVycm9yIGdldCBkbiBieSBvaWQiLERJQU1FQVBfRVhURU5TSU9OKTsKKwkJCQkJCQlnb3RvIGZhaWx1cmU7fSk7CisJCQkJCX0KKworCQkJCQlDSEVDS19NQUxMT0NfRE8oYnVmZj1tYWxsb2Moc2l6ZV9idWZmZXIpLCBnb3RvIGZhaWx1cmUpOworCisJCQkJCUNIRUNLX0dOVVRMU19ETyhnbnV0bHNfeDUwOV9jcnRfZ2V0X2RuX2J5X29pZChjZXJ0LEdOVVRMU19PSURfWDUyMF9DT01NT05fTkFNRSwwLDAsYnVmZiwmc2l6ZV9idWZmZXIpLHsKKwkJCQkJCVRSQUNFX0RFQlVHKE5PTkUsIiVzW0VBUCBUTFMgcGx1Z2luXSBbR251VExTXSBlcnJvciBnZXQgZG4gYnkgb2lkIixESUFNRUFQX0VYVEVOU0lPTik7CisJCQkJCQlnb3RvIGZhaWx1cmU7fSk7CisKKwkJCQkJaWYoc3RybmNtcCgoY2hhciAqKXNtZC0+dXNlci51c2VyaWQsYnVmZixzbWQtPnVzZXIudXNlcmlkTGVuZ3RoKSE9MCl7CisJCQkJCQlnb3RvIGZhaWx1cmU7CisJCQkJCX0KKworCQkJCQlnbnV0bHNfeDUwOV9jcnRfZGVpbml0KGNlcnQpOwkJCQkKKwkJCQkJZ290byBuZXh0OworCisJCQkJCWZhaWx1cmU6CisJCQkJCVRSQUNFX0RFQlVHKE5PTkUsIiVzW0VBUCBUTFMgcGx1Z2luXSBDaGVja2luZyBmYWlsZWQuIGNlcnRpZmljYXRlJ3MgQ04gZG9lcyBub3QgbWF0Y2ggVXNlcl9OYW1lIEFWUCB2YWx1ZS4iLERJQU1FQVBfRVhURU5TSU9OKTsKKwkJCQkJZGF0YS0+c3RhdGUgPSBGQUlMVVJFOworCQkJCQlzbWQtPnVzZXIuc3VjY2VzcyA9IEZBTFNFOworCQkJCQlnbnV0bHNfeDUwOV9jcnRfZGVpbml0KGNlcnQpOworCQkJCX0KKworCQkJCW5leHQ6CisJCQkJc21kLT5tZXRob2REYXRhID0gKHN0cnVjdCB0bHNfZGF0YSopIGRhdGE7CisJCQkJcmV0dXJuIDA7CisKKwkJCX0KKworCQkJcmV0dXJuIDA7CisJCX0KKworCX0KKworCWlmIChkYXRhLT5tb3JlX3RvcmVjZWl2ZSA9PSBUUlVFKQorCXsKKwkJLy9yZWFzc2VtYmxlIHJlY2VpdmVkIGZyYWdtZW50IHRvIFRMUyBSZXNwb25zZQorCQlDSEVDS19GQ1QoZGlhbWVhcF90bHNfcmVhc3NlbWJsZSgmZGF0YS0+dGxzUmVzcCx0bHNtc2cpKTsKKwl9CisJZWxzZQorCXsKKwkJLy9yZWNlaXZlIHRoZSBmaXJzdCBmcmFnbWVudCBvciBhIGNvbXBsZXRlIFRMUyBtZXNzYWdlCisJCUNIRUNLX0ZDVChkaWFtZWFwX3Rsc19jb3B5KCZkYXRhLT50bHNSZXNwLHRsc21zZykpOworCX0KKworCWlmICh0bHNtc2cuZmxhZ3MgJiBUTFNfRkxBR19NT1JFKQorCXsKKwkJZGF0YS0+bW9yZV90b3JlY2VpdmUgPSBUUlVFOworCQlzbWQtPm1ldGhvZERhdGEgPSAoc3RydWN0IHRsc19kYXRhKikgZGF0YTsKKwkJcmV0dXJuIDA7CisJfQorCWVsc2UKKwl7CisJCS8vbGFzdCBmcmFnbWVudCByZWNlaXZlZAorCQlkYXRhLT5tb3JlX3RvcmVjZWl2ZSA9IEZBTFNFOworCX0KKwlkYXRhLT5zdGF0ZSA9IENPTlRJTlVFOworCWRpYW1lYXBfdGxzX3Byb2Nlc3NfcmVjZWl2ZShkYXRhKTsKKworCWlmIChkYXRhLT5zdGF0ZSA9PSBTVUNDRVNTKQorCXsKKwkJc21kLT51c2VyLnN1Y2Nlc3MgPSBUUlVFOworCX0KKwlzbWQtPm1ldGhvZERhdGEgPSAoc3RydWN0IHRsc19kYXRhKikgZGF0YTsKKwlyZXR1cm4gMDsKK30KKworYm9vbGVhbiBlYXBfdGxzX2lzRG9uZShzdHJ1Y3QgZWFwX3N0YXRlX21hY2hpbmUgKnNtZCkKK3sKKwlzdHJ1Y3QgdGxzX2RhdGEgKiBkYXRhOworCWRhdGEgPSAoc3RydWN0IHRsc19kYXRhICopIHNtZC0+bWV0aG9kRGF0YTsKKwlpZiAoZGF0YS0+c3RhdGUgPT0gQ09OVElOVUUgfHwgZGF0YS0+c3RhdGUgPT0gU1RBUlQpCisJeworCQlyZXR1cm4gRkFMU0U7CisJfQorCXJldHVybiBUUlVFOworfQorCitpbnQgZWFwX3Rsc19nZXRLZXkoc3RydWN0IGVhcF9zdGF0ZV9tYWNoaW5lICpzbWQsIHU4ICoqIG1zaywgaW50ICptc2tsZW4sIHU4ICoqIGVtc2ssIGludCAqZW1za2xlbikKK3sKKwlzdHJ1Y3QgdGxzX2RhdGEgKiBkYXRhOworCWludCBsZW4gPSBlbXNrID8gMTI4IDogNjQ7CisJZGF0YSA9IChzdHJ1Y3QgdGxzX2RhdGEgKikgc21kLT5tZXRob2REYXRhOworCSptc2sgPSBtYWxsb2MobGVuKTsKKwlpZiAoZ251dGxzX3ByZihkYXRhLT5zZXNzaW9uLCBzdHJsZW4oImNsaWVudCBFQVAgZW5jcnlwdGlvbiIpLAorCQkJImNsaWVudCBFQVAgZW5jcnlwdGlvbiIsIDAsIDAsIE5VTEwsIGxlbiwgKGNoYXIgKikgKm1zaykKKwkJCSE9IEdOVVRMU19FX1NVQ0NFU1MpCisJeworCQlmcmVlKCptc2spOworCQkqbXNrID0gTlVMTDsKKwkJKm1za2xlbiA9IDA7CisJCXJldHVybiAxOworCX0KKwllbHNlCisJeworCQkqbXNrbGVuID0gNjQ7CisJfQorCWlmIChlbXNrKSB7CisJCSplbXNrID0gbWFsbG9jKDY0KTsKKwkJbWVtY3B5KCplbXNrLCAoKm1zaykrNjQsIDY0KTsKKwkJbWVtc2V0KCgqbXNrKSs2NCwgMCwgNjQpOworCQkqZW1za2xlbiA9IDY0OworCX0KKworCXJldHVybiAwOworfQorCit2b2lkIGVhcF90bHNfdW5yZWdpc3Rlcih2b2lkKQoreworCS8vCit9CisKK3ZvaWQgZWFwX3Rsc19mcmVlKHZvaWQgKiBtZGF0YSkKK3sKKwlzdHJ1Y3QgdGxzX2RhdGEgKmRhdGE7CisJZGF0YSA9IChzdHJ1Y3QgdGxzX2RhdGEqKSBtZGF0YTsKKwlnbnV0bHNfZGVpbml0KGRhdGEtPnNlc3Npb24pOworCWlmKGRhdGEtPnRsc1JlcS5kYXRhKXsKKwkJZnJlZShkYXRhLT50bHNSZXEuZGF0YSk7CisJCWRhdGEtPnRsc1JlcS5kYXRhPU5VTEw7CisJfQorCWlmKGRhdGEtPnRsc1Jlc3AuZGF0YSl7CisJCWZyZWUoZGF0YS0+dGxzUmVzcC5kYXRhKTsKKwkJZGF0YS0+dGxzUmVzcC5kYXRhPU5VTEw7CisJfQorCWZyZWUoZGF0YSk7CisJZGF0YT1OVUxMOworfQorCisvL3NlbmQgVExTIEFDSyBSZXF1ZXN0IChlbXB0eSBUTFMgbXNnKQoraW50IGRpYW1lYXBfZWFwX3Rsc19idWlsZFJlcV9hY2sodTggaWQsIHN0cnVjdCBlYXBfcGFja2V0ICogZWFwUGFja2V0KQoreworCXU4KiBwYXlsb2FkOworCXN0cnVjdCB0bHNfbXNnIHRsc21zZzsKKwlpbnQgbGVuOworCUNIRUNLX0ZDVChkaWFtZWFwX3Rsc19uZXcoJnRsc21zZykpOworCUNIRUNLX0ZDVChkaWFtZWFwX3Rsc19uZXdfdGxzX3BhY2tldCgmcGF5bG9hZCwmbGVuLHRsc21zZykpOworCUNIRUNLX0ZDVChkaWFtZWFwX2VhcF9uZXcoRUFQX1JFUVVFU1QsaWQsVFlQRV9FQVBfVExTLHBheWxvYWQsbGVuLGVhcFBhY2tldCkpOworCXJldHVybiAwOworfQorCisvLyBwYXJzZSBFQVAgVExTIG1zZworaW50IGRpYW1lYXBfZWFwX3Rsc19wYXJzZShzdHJ1Y3QgdGxzX21zZyAqIHRsc21zZywgc3RydWN0IGVhcF9wYWNrZXQgKmVhcFBhY2tldCkKK3sKKwl1OCAqZGF0YXRsczsKKwlpbnQgbGVuOworCisJLy9pbml0aWFsaXplIGEgbmV3IGVtcHR5IEVBUCBUTFMgbXNnCisJZGlhbWVhcF90bHNfbmV3KHRsc21zZyk7CisJLy9yZXRyaWV2ZSB0aGUgZGF0YSBmaWVsZCBmcm9tIEVBUCBQYWNrZXQKKwlkaWFtZWFwX2VhcF9nZXRfZGF0YShlYXBQYWNrZXQsICZkYXRhdGxzLCAmbGVuKTsKKwkvL3BhcnNlIEVBUCBUTFMgbXNnCisJZGlhbWVhcF90bHNfcGFyc2UoZGF0YXRscywgbGVuLCB0bHNtc2cpOworCXJldHVybiAwOworfQorCitpbnQgZGlhbWVhcF9lYXBfdGxzX2J1aWxkUmVxX3N0YXJ0KHU4IGlkLCBzdHJ1Y3QgZWFwX3BhY2tldCAqIGVhcFBhY2tldCkKK3sKKwl1OCogcGF5bG9hZDsKKwlzdHJ1Y3QgdGxzX21zZyB0bHNtc2c7CisJaW50IGxlbjsKKwlDSEVDS19GQ1QoZGlhbWVhcF90bHNfbmV3KCZ0bHNtc2cpKTsKKwlDSEVDS19GQ1QoZGlhbWVhcF90bHNfc2V0X2ZsYWdzKCZ0bHNtc2csVExTX0ZMQUdfU1RBUlQpKTsKKwlDSEVDS19GQ1QoZGlhbWVhcF90bHNfbmV3X3Rsc19wYWNrZXQoJnBheWxvYWQsJmxlbix0bHNtc2cpKTsKKwlDSEVDS19GQ1QoZGlhbWVhcF9lYXBfbmV3KEVBUF9SRVFVRVNULGlkLFRZUEVfRUFQX1RMUyxwYXlsb2FkLGxlbixlYXBQYWNrZXQpKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGRpYW1lYXBfZWFwX3Rsc19idWlsZFJlcV9kYXRhKHN0cnVjdCB0bHNfZGF0YSAqIGRhdGEsIGludCBpZCwKKwkJc3RydWN0IGVhcF9wYWNrZXQgKiBlYXBQYWNrZXQpCit7CisJc3RydWN0IHRsc19tc2cgdGxzbXNnOworCXU4KiBkYXRhdG9zZW5kOworCXU4ICogZWFwdGxzX2RhdGE7CisJaW50IGxlbmd0aCA9IDA7CisKKwlkaWFtZWFwX3Rsc19uZXcoJnRsc21zZyk7CisKKwlpZiAoZGF0YS0+bW9yZV90b3NlbmRfbGVuZ3RoID09IDApCisJeworCQkvL0ZpcnN0IGZyYWdtZW50IG9mIG1lc3NhZ2Ugb3IgdGhlIG9ubHkgZnJhZ21lbnQgb2YgbWVzc2FnZQorCQlkYXRhLT5tb3JlX3Rvc2VuZF9sZW5ndGggPSBkYXRhLT50bHNSZXEuZGF0YWxlbmd0aDsKKwl9CisJaWYgKGRhdGEtPm1vcmVfdG9zZW5kX2xlbmd0aCA+IHRsc19nbG9iYWxfY29uZi5tYXhfc2l6ZSkKKwl7CisJCS8vTmV3IGZyYWdtZW50IG9mIG1lc3NhZ2UuIElzIG5vdCB0aGUgbGFzdCBmcmFnbWVudC4KKwkJbGVuZ3RoID0gdGxzX2dsb2JhbF9jb25mLm1heF9zaXplOworCQlDSEVDS19GQ1QoZGlhbWVhcF90bHNfc2V0X2ZsYWdzKCZ0bHNtc2csVExTX0ZMQUdfTU9SRSkpOworCQlpZiAoZGF0YS0+bW9yZV90b3NlbmRfbGVuZ3RoID09IGRhdGEtPnRsc1JlcS5kYXRhbGVuZ3RoKQorCQl7CisJCQkvL1RoZSBmaXJzdCBmcmFnbWVudCBvZiBtZXNzYWdlCisJCQlDSEVDS19GQ1QoZGlhbWVhcF90bHNfc2V0X21lc3NhZ2VfbGVuZ3RoKCZ0bHNtc2csZGF0YS0+dGxzUmVxLmRhdGFsZW5ndGgpKTsvL3NldCBMIGZsYWcgYW5kIGxlbmd0aCB2YWx1ZQorCQl9CisJfQorCWVsc2UKKwl7CisJCS8vVGhlIGxhc3QgZnJhZ21lbnQgb3IgdGhlIG9ubHkgZnJhZ21lbnQuCisJCWxlbmd0aCA9IGRhdGEtPm1vcmVfdG9zZW5kX2xlbmd0aDsKKwl9CisKKwlkYXRhdG9zZW5kID0gbWFsbG9jKHNpemVvZih1OCkgKiBsZW5ndGgpOworCVU4Q09QWShkYXRhdG9zZW5kLDAsbGVuZ3RoLGRhdGEtPnRsc1JlcS5kYXRhKyhkYXRhLT50bHNSZXEuZGF0YWxlbmd0aC1kYXRhLT5tb3JlX3Rvc2VuZF9sZW5ndGgpKTsKKwlkYXRhLT5tb3JlX3Rvc2VuZF9sZW5ndGggLT0gbGVuZ3RoOworCUNIRUNLX0ZDVChkaWFtZWFwX3Rsc19zZXRfZGF0YSgmdGxzbXNnLGRhdGF0b3NlbmQsbGVuZ3RoKSk7CisKKwlDSEVDS19GQ1QoZGlhbWVhcF90bHNfbmV3X3Rsc19wYWNrZXQoJmVhcHRsc19kYXRhLCZsZW5ndGgsdGxzbXNnKSk7CisJQ0hFQ0tfRkNUKGRpYW1lYXBfZWFwX25ldyhFQVBfUkVRVUVTVCxpZCxUWVBFX0VBUF9UTFMsZWFwdGxzX2RhdGEsbGVuZ3RoLGVhcFBhY2tldCkpOworCisJaWYgKGRhdGEtPm1vcmVfdG9zZW5kX2xlbmd0aCA9PSAwKQorCXsKKwkJZGlhbWVhcF90bHNfbmV3KCZkYXRhLT50bHNSZXEpOworCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvYXBwX2RpYW1lYXAvcGx1Z2lucy9lYXBfdGxzL2VhcF90bHMuaCBiL2V4dGVuc2lvbnMvYXBwX2RpYW1lYXAvcGx1Z2lucy9lYXBfdGxzL2VhcF90bHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDBmM2Q5Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9hcHBfZGlhbWVhcC9wbHVnaW5zL2VhcF90bHMvZWFwX3Rscy5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKQorICogQXV0aG9yIDogU291aGVpbCBCZW4gQXllZCA8c291aGVpbEB0ZXJhLmljcy5rZWlvLmFjLmpwPgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOS0yMDEwLCBTb3VoZWlsIEJlbiBBeWVkLCBUZXJhb2thIExhYm9yYXRvcnkgb2YgS2VpbyBVbml2ZXJzaXR5LCBhbmQgdGhlIFdJREUgUHJvamVjdAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgU291aGVpbCBCZW4gQXllZCA8c291aGVpbEB0ZXJhLmljcy5rZWlvLmFjLmpwPi4KKyAqCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNvdWhlaWwgQmVuIEF5ZWQsIFRlcmFva2EgTGFib3JhdG9yeSBvZiBLZWlvIFVuaXZlcnNpdHkgb3IgdGhlIFdJREUgUHJvamVjdCBub3IgdGhlCisgKiAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAnJ0FTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgRUFQX1RMU19IXworI2RlZmluZSBFQVBfVExTX0hfCisKKyNpbmNsdWRlICIuLi8uLi9wbHVnaW5zLmgiCisKK3N0cnVjdCB0bHNfY29uZmlnCXRsc19nbG9iYWxfY29uZjsKKworaW50IGRpYW1lYXBfZWFwX3Rsc19idWlsZFJlcV9hY2sodTggaWQsIHN0cnVjdCBlYXBfcGFja2V0ICogZWFwUGFja2V0KTsKK2ludCBkaWFtZWFwX2VhcF90bHNfYnVpbGRSZXFfc3RhcnQodTggaWQsIHN0cnVjdCBlYXBfcGFja2V0ICogZWFwUGFja2V0KTsKK2ludCBkaWFtZWFwX2VhcF90bHNfYnVpbGRSZXFfZGF0YShzdHJ1Y3QgdGxzX2RhdGEgKiBkYXRhLGludCBpZCxzdHJ1Y3QgZWFwX3BhY2tldCAqIGVhcFBhY2tldCk7CitpbnQgZGlhbWVhcF9lYXBfdGxzX3BhcnNlKHN0cnVjdCB0bHNfbXNnICogZWFwdGxzLHN0cnVjdCBlYXBfcGFja2V0ICplYXBQYWNrZXQpOworaW50IGVhcHRsc3BhcnNlKHN0cnVjdCB0bHNfY29uZmlnICogY29uZik7CisKKyNlbmRpZiAvKiBFQVBfVExTX0hfICovCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2FwcF9kaWFtZWFwL3BsdWdpbnMvZWFwX3Rscy9lYXB0bHMubCBiL2V4dGVuc2lvbnMvYXBwX2RpYW1lYXAvcGx1Z2lucy9lYXBfdGxzL2VhcHRscy5sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ODkzMzMKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2FwcF9kaWFtZWFwL3BsdWdpbnMvZWFwX3Rscy9lYXB0bHMubApAQCAtMCwwICsxLDExOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpCisgKiBBdXRob3IgOiBTb3VoZWlsIEJlbiBBeWVkIDxzb3VoZWlsQHRlcmEuaWNzLmtlaW8uYWMuanA+CisgKgorICogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTAsIFNvdWhlaWwgQmVuIEF5ZWQsIFRlcmFva2EgTGFib3JhdG9yeSBvZiBLZWlvIFVuaXZlcnNpdHkgYW5kIHRoZSBXSURFIFByb2plY3QKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IFNvdWhlaWwgQmVuIEF5ZWQgPHNvdWhlaWxAdGVyYS5pY3Mua2Vpby5hYy5qcD4uCisgKgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiBTb3VoZWlsIEJlbiBBeWVkLCBUZXJhb2thIExhYm9yYXRvcnkgb2YgS2VpbyBVbml2ZXJzaXR5IG9yIHRoZSBXSURFIFByb2plY3Qgbm9yIHRoZQorICogICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgJydBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qRGVjbGFyYXRpb25zIGFuZCBvcHRpb24gc2V0dGluZ3MqLworJXsKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImVhcF90bHMuaCIKKyNpbmNsdWRlICJlYXB0bHMudGFiLmgiCisKKyNkZWZpbmUgWVlfVVNFUl9BQ1RJT04geyAJCQkJCQlcCisJeXlsbG9jLT5maXJzdF9saW5lID0geXlsbG9jLT5sYXN0X2xpbmUgPSB5eWxpbmVubzsgXAorCXl5bGxvYy0+Zmlyc3RfY29sdW1uID0geXlsbG9jLT5sYXN0X2NvbHVtbiArIDE7IAkJXAorCXl5bGxvYy0+bGFzdF9jb2x1bW4gKz0geXlsZW5nICsxOwlcCisJfQkgCisJCisjZGVmaW5lIFlZX05PX0lOUFVUCislfQorCislb3B0aW9uIG5veXl3cmFwCislb3B0aW9uIHl5bGluZW5vCislb3B0aW9uIGJpc29uLWJyaWRnZSAKKyVvcHRpb24gYmlzb24tbG9jYXRpb25zCislb3B0aW9uIG5vdW5wdXQKKyUlCisJLyogTGlzdCBvZiBwYXR0ZXJucyBhbmQgYWN0aW9ucyAqLworCis8Kj5cbgkJCXsJCQkJCisJCQkJeXlsbG9jLT5sYXN0X2NvbHVtbj0wOyAKKwkJCX0KKworCis8Kj4jLiokCQkJe30KKworCitbIFx0XG5dKwkJeworCQkJCXl5bGxvYy0+bGFzdF9jb2x1bW49MDsgCisJCQl9CisKK1wiKFteXG5cIl0qKVwiCXsgCS8qIFF1b3RlZCBTdHJpbmcgKi8KKwkJCQkJeXlsdmFsLT5zdHIgPSBzdHJkdXAoeXl0ZXh0KzEpOyAKKwkJCQkJeXlsdmFsLT5zdHJbeXlsZW5nLTJdPSdcMCc7CisJCQkJCXJldHVybiBpU1RSSU5HOworCQkJCX0KKworCitbWzpkaWdpdDpdXSsJeyAJLyogRGlnaXRhbCBudW1iZXIgKi8KKwkJCQkJeXlsdmFsLT52YWwgPSBhdG9pKHl5dGV4dCk7CisJCQkJCXJldHVybiBOVU07IC8qIE51bWVyaWMgdmFsdWUgKi8gCisJCQkJfQorCisoP2k6IkNyZWQiKQl7CisJCQkJcmV0dXJuIENFUlRTOworCQkJfQorCisoP2k6IkNBIikJCXsgCisJCQkJcmV0dXJuIENBUEFUSDsKKwkJCX0KKworKD9pOiJDUkwiKQkJeyAKKwkJCQlyZXR1cm4gQ1JMUEFUSDsKKwkJCX0KKworKD9pOiJjaGVja19jZXJ0X2NuX3VzZXJuYW1lIikJCXsKKwkJCQlyZXR1cm4gQ0hFQ0tfQ05fVVNFUk5BTUU7CisJCQl9CisKKworCisiPSJ8IjsifCI6InwiLCIJCXsJLyogU2luZ2xlIGNoYXJhY3RlcnMgZm9yIHl5cGFyc2UgKi8gCisJCQkJcmV0dXJuIHl5dGV4dFswXTsgCisJCQl9CisKKwkvKiBVbnJlY29nbml6ZWQgdG9rZW4gb3IgdGV4dCAqLworCQorPCo+W1s6YWxudW06XV0rCSB8CQkJCQkgCis8Kj4uCXsgCisJCQkJZnByaW50ZihzdGRlcnIsIlVucmVjb2duaXplZCBpbnB1dCB0ZXh0ICclcycoIG9uIGxpbmUgJWkgY29sdW1uICVpIClcbiIsIHl5dGV4dCwgeXlsbG9jLT5maXJzdF9saW5lLCB5eWxsb2MtPmZpcnN0X2NvbHVtbik7IAorCQkJIAlyZXR1cm4gTEVYX0VSUk9SOyAKKwkJCX0KKworJSUKKy8qIFJvdXRpbmVzICovCisKKwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9hcHBfZGlhbWVhcC9wbHVnaW5zL2VhcF90bHMvZWFwdGxzLnkgYi9leHRlbnNpb25zL2FwcF9kaWFtZWFwL3BsdWdpbnMvZWFwX3Rscy9lYXB0bHMueQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTU1OWViCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9hcHBfZGlhbWVhcC9wbHVnaW5zL2VhcF90bHMvZWFwdGxzLnkKQEAgLTAsMCArMSwyNDMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKQorICogQXV0aG9yIDogU291aGVpbCBCZW4gQXllZCA8c291aGVpbEB0ZXJhLmljcy5rZWlvLmFjLmpwPgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOS0yMDEwLCBTb3VoZWlsIEJlbiBBeWVkLCBUZXJhb2thIExhYm9yYXRvcnkgb2YgS2VpbyBVbml2ZXJzaXR5IGFuZCB0aGUgV0lERSBQcm9qZWN0CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBTb3VoZWlsIEJlbiBBeWVkIDxzb3VoZWlsQHRlcmEuaWNzLmtlaW8uYWMuanA+LgorICoKKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgU291aGVpbCBCZW4gQXllZCwgVGVyYW9rYSBMYWJvcmF0b3J5IG9mIEtlaW8gVW5pdmVyc2l0eSBvciB0aGUgV0lERSBQcm9qZWN0IG5vciB0aGUKKyAqICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICcnQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworJXsKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImVhcF90bHMuaCIKKyNpbmNsdWRlICJlYXB0bHMudGFiLmgiCisKK3ZvaWQgeXllcnJvciAoWVlMVFlQRSAqbGxvY3AsIHN0cnVjdCB0bHNfY29uZmlnICogY29uZmlnLCBjb25zdCBjaGFyICpzKTsKKworZXh0ZXJuIGludCB5eXdyYXAoKTsKK2V4dGVybiBpbnQgeXlsZXgoKTsKKworCisvKiBUaGUgTGV4IHBhcnNlciBwcm90b3R5cGUgKi8KK2ludCBlYXB0bHNsZXgoWVlTVFlQRSAqbHZhbHAsIFlZTFRZUEUgKmxsb2NwKTsKKworCislfQorCislbG9jYXRpb25zCislcGFyc2UtcGFyYW0ge3N0cnVjdCB0bHNfY29uZmlnICogY29uZmlnfSAKKyVwdXJlX3BhcnNlcgorLyolZGVmaW5lcyAqLworJWVycm9yLXZlcmJvc2UKKyVkZWJ1ZyAKKworJXVuaW9uIHsKKwljaGFyICpzdHI7CisJaW50IHZhbDsKKwljaGFyIGJ5dGU7Cit9CisKKworCisvKiBJbiBjYXNlIG9mIGVycm9yIGluIHRoZSBsZXhpY2FsIGFuYWx5c2lzICovCisldG9rZW4gCQlMRVhfRVJST1IKKworJXRva2VuIAk8dmFsPglOVU0KKworJXRva2VuIAk8c3RyPglpU1RSSU5HCisKKyV0b2tlbiAgPGJ5dGU+CWlCWVRFCisKKyV0b2tlbiAJCUNFUlRTCisldG9rZW4gCQlDQVBBVEgKKyV0b2tlbiAJCUNSTFBBVEgKKyV0b2tlbgkJQ0hFQ0tfQ05fVVNFUk5BTUUKKworJSUJCisKK2NvbmZwYXJhbXMgOiAJLyogZW1wdHkgKi8KKwkJfCBjb25mcGFyYW1zIENFUlRTX2ZpbGVzCisJCXwgY29uZnBhcmFtcyBDQV9maWxlCisJCXwgY29uZnBhcmFtcyBDUkxfZmlsZQorCQl8IGNvbmZwYXJhbXMgQ0hFQ0tfQ05fVVNFUk5BTUVfcGFyYW0KKwkJfCBjb25mcGFyYW1zIGVycm9ycworCQl7CisJCQlyZXR1cm4gRUlOVkFMOworCQl9CisJCTsKKworZXJyb3JzIDoJTEVYX0VSUk9SCisJCXwgZXJyb3IKKwkJOworCisKK0NFUlRTX2ZpbGVzIDoJQ0VSVFMgJz0nIGlTVFJJTkcgJzonIGlTVFJJTkcgJzsnCisJCXsKKwkJY2hhciAqIGNlcnRmaWxlLCAqa2V5ZmlsZTsKKwkJRklMRSAqIGZsOworCisJCWNlcnRmaWxlID0gJDM7CisJCWtleWZpbGUgPSAkNTsKKwkJaWYoY2VydGZpbGUgPT0gTlVMTCl7CisJCQlUUkFDRV9ERUJVRyhJTkZPLCIlc1tFQVAgVExTIHBsdWdpbl0gY2VydGlmaWNhdGUgZmlsZSBtaXNzaW5nIGluIGNvbmZpZ3VyYXRpb24gZmlsZSIsRElBTUVBUF9FWFRFTlNJT04pOworCQkJeXllcnJvciAoJnl5bGxvYywgY29uZmlnLCAiY2VydCBmaWxlIG1pc3NpbmciKTsgCisJCQlZWUVSUk9SOworCQl9CisJCWlmKGtleWZpbGUgPT0gTlVMTCl7CisJCQlUUkFDRV9ERUJVRyhJTkZPLCIlc1tFQVAgVExTIHBsdWdpbl0gcHJpdmF0ZUtleSBmaWxlIG1pc3NpbmcgaW4gY29uZmlndXJhdGlvbiBmaWxlIixESUFNRUFQX0VYVEVOU0lPTik7CisJCQl5eWVycm9yICgmeXlsbG9jLCBjb25maWcsICJwcml2YXRlS2V5IGZpbGUgbWlzc2luZyIpOyAKKwkJCVlZRVJST1I7CisJCX0KKwkJCisJCWZsID0gZm9wZW4oY2VydGZpbGUsICJyIik7CisJCWlmICgoZmwgPT0gTlVMTCkgJiYgKCpjZXJ0ZmlsZSAhPSAnLycpKSB7CisJCQljaGFyICogdG1wZmlsZT1jZXJ0ZmlsZTsKKwkJCUNIRUNLX01BTExPQ19ETyggY2VydGZpbGUgPSBtYWxsb2MoIHN0cmxlbih0bXBmaWxlKSArIHN0cmxlbihERUZBVUxUX0VYVEVOU0lPTlNfUEFUSCkgKyAyICksCisJCQkJeyB5eWVycm9yICgmeXlsbG9jLCBjb25maWcsICJOb3QgZW5vdWdoIG1lbW9yeSIpOyBZWUVSUk9SOyB9ICk7CisJCQlzcHJpbnRmKGNlcnRmaWxlLCBERUZBVUxUX0VYVEVOU0lPTlNfUEFUSCAiLyVzIiwgdG1wZmlsZSk7CisJCQlmcmVlKHRtcGZpbGUpOworCQkJZmwgPSBmb3BlbihjZXJ0ZmlsZSwgInIiKTsKKwkJfQorCQlpZiAoZmwgPT0gTlVMTCkgeworCQkJaW50IHJldCA9IGVycm5vOworCQkJVFJBQ0VfREVCVUcoSU5GTywiJXNbRUFQIFRMUyBwbHVnaW5dIFVuYWJsZSB0byBvcGVuIGNlcnRpZmljYXRlIGZpbGUgJXMgZm9yIHJlYWRpbmc6ICVzIixESUFNRUFQX0VYVEVOU0lPTixjZXJ0ZmlsZSxzdHJlcnJvcihyZXQpKTsKKwkJCXl5ZXJyb3IgKCZ5eWxsb2MsIGNvbmZpZywgIkVycm9yIGNvbmZpZ3VyaW5nIGNlcnRpZmljYXRlIGZvciBFQVAtVExTIik7IAorCQkJWVlFUlJPUjsKKwkJfQorCQlmY2xvc2UoZmwpOworCQkKKwkJZmwgPSBmb3BlbihrZXlmaWxlLCAiciIpOworCQlpZiAoKGZsID09IE5VTEwpICYmICgqa2V5ZmlsZSAhPSAnLycpKSB7CisJCQljaGFyICogdG1wZmlsZT1rZXlmaWxlOworCQkJQ0hFQ0tfTUFMTE9DX0RPKCBrZXlmaWxlID0gbWFsbG9jKCBzdHJsZW4odG1wZmlsZSkgKyBzdHJsZW4oREVGQVVMVF9FWFRFTlNJT05TX1BBVEgpICsgMiApLAorCQkJCXsgeXllcnJvciAoJnl5bGxvYywgY29uZmlnLCAiTm90IGVub3VnaCBtZW1vcnkiKTsgWVlFUlJPUjsgfSApOworCQkJc3ByaW50ZihrZXlmaWxlLCBERUZBVUxUX0VYVEVOU0lPTlNfUEFUSCAiLyVzIiwgdG1wZmlsZSk7CisJCQlmcmVlKHRtcGZpbGUpOworCQkJZmwgPSBmb3BlbihrZXlmaWxlLCAiciIpOworCQl9CisJCWlmIChmbCA9PSBOVUxMKSB7CisJCQlpbnQgcmV0ID0gZXJybm87CisJCQlUUkFDRV9ERUJVRyhJTkZPLCIlc1tFQVAgVExTIHBsdWdpbl0gVW5hYmxlIHRvIG9wZW4gcHJpdmF0ZUtleSBmaWxlICVzIGZvciByZWFkaW5nOiAlcyIsRElBTUVBUF9FWFRFTlNJT04sa2V5ZmlsZSxzdHJlcnJvcihyZXQpKTsKKwkJCXl5ZXJyb3IgKCZ5eWxsb2MsIGNvbmZpZywgIkVycm9yIGNvbmZpZ3VyaW5nIHByaXZhdGVLZXkgZm9yIEVBUC1UTFMiKTsgCisJCQlZWUVSUk9SOworCQl9CisJCWZjbG9zZShmbCk7CisJCQorCQljb25maWctPmNlcnRmaWxlID0gY2VydGZpbGU7CisJCWNvbmZpZy0+a2V5ZmlsZSA9IGtleWZpbGU7CisJCX0KKwkJOworCQkKK0NBX2ZpbGUgOglDQVBBVEggJz0nIGlTVFJJTkcgJzsnCisJCXsKKwkJY2hhciAqIGNhZmlsZTsKKwkJRklMRSAqIGZsOworCisJCWNhZmlsZSA9ICQzOworCisJCWlmKGNhZmlsZSA9PSBOVUxMKXsKKwkJCVRSQUNFX0RFQlVHKElORk8sIiVzW0VBUCBUTFMgcGx1Z2luXSBDQSBmaWxlIG1pc3NpbmcgaW4gY29uZmlndXJhdGlvbiBmaWxlIixESUFNRUFQX0VYVEVOU0lPTik7CisJCQl5eWVycm9yICgmeXlsbG9jLCBjb25maWcsICJjZXJ0IGZpbGUgbWlzc2luZyIpOyAKKwkJCVlZRVJST1I7CisJCX0KKwkJCisJCWZsID0gZm9wZW4oY2FmaWxlLCAiciIpOworCQlpZiAoKGZsID09IE5VTEwpICYmICgqY2FmaWxlICE9ICcvJykpIHsKKwkJCWNoYXIgKiB0bXBmaWxlPWNhZmlsZTsKKwkJCUNIRUNLX01BTExPQ19ETyggY2FmaWxlID0gbWFsbG9jKCBzdHJsZW4odG1wZmlsZSkgKyBzdHJsZW4oREVGQVVMVF9FWFRFTlNJT05TX1BBVEgpICsgMiApLAorCQkJCXsgeXllcnJvciAoJnl5bGxvYywgY29uZmlnLCAiTm90IGVub3VnaCBtZW1vcnkiKTsgWVlFUlJPUjsgfSApOworCQkJc3ByaW50ZihjYWZpbGUsIERFRkFVTFRfRVhURU5TSU9OU19QQVRIICIvJXMiLCB0bXBmaWxlKTsKKwkJCWZyZWUodG1wZmlsZSk7CisJCQlmbCA9IGZvcGVuKGNhZmlsZSwgInIiKTsKKwkJfQorCQlpZiAoZmwgPT0gTlVMTCkgeworCQkJaW50IHJldCA9IGVycm5vOworCQkJVFJBQ0VfREVCVUcoSU5GTywiJXNbRUFQIFRMUyBwbHVnaW5dIFVuYWJsZSB0byBvcGVuIENBIGZpbGUgJXMgZm9yIHJlYWRpbmc6ICVzIixESUFNRUFQX0VYVEVOU0lPTixjYWZpbGUsc3RyZXJyb3IocmV0KSk7CisJCQl5eWVycm9yICgmeXlsbG9jLCBjb25maWcsICJFcnJvciBjb25maWd1cmluZyBDQSBmaWxlIGZvciBFQVAtVExTIik7IAorCQkJWVlFUlJPUjsKKwkJfQorCQlmY2xvc2UoZmwpOworCQkJY29uZmlnLT5jYWZpbGU9JDM7CisJCX0KKwkJOworCitDUkxfZmlsZSA6CUNSTFBBVEggJz0nIGlTVFJJTkcgJzsnCisJCXsKKwkJY2hhciAqIGNybGZpbGU7CisJCUZJTEUgKiBmbDsKKworCQljcmxmaWxlID0gJDM7CisKKwkJaWYoY3JsZmlsZSA9PSBOVUxMKXsKKwkJCVRSQUNFX0RFQlVHKEZVTEwrMSwiJXNbRUFQIFRMUyBwbHVnaW5dIENSTCBmaWxlIG1pc3NpbmcgaW4gY29uZmlndXJhdGlvbiBmaWxlIixESUFNRUFQX0VYVEVOU0lPTik7CisKKwkJfWVsc2V7CisJCQorCQkJZmwgPSBmb3BlbihjcmxmaWxlLCAiciIpOworCQkJaWYgKChmbCA9PSBOVUxMKSAmJiAoKmNybGZpbGUgIT0gJy8nKSkgeworCQkJCWNoYXIgKiB0bXBmaWxlPWNybGZpbGU7CisJCQkJQ0hFQ0tfTUFMTE9DX0RPKCBjcmxmaWxlID0gbWFsbG9jKCBzdHJsZW4odG1wZmlsZSkgKyBzdHJsZW4oREVGQVVMVF9FWFRFTlNJT05TX1BBVEgpICsgMiApLAorCQkJCQl7IHl5ZXJyb3IgKCZ5eWxsb2MsIGNvbmZpZywgIk5vdCBlbm91Z2ggbWVtb3J5Iik7IFlZRVJST1I7IH0gKTsKKwkJCQlzcHJpbnRmKGNybGZpbGUsIERFRkFVTFRfRVhURU5TSU9OU19QQVRIICIvJXMiLCB0bXBmaWxlKTsKKwkJCQlmcmVlKHRtcGZpbGUpOworCQkJCWZsID0gZm9wZW4oY3JsZmlsZSwgInIiKTsKKwkJCX0KKwkJCWlmIChmbCA9PSBOVUxMKSB7CisJCQkJaW50IHJldCA9IGVycm5vOworCQkJCVRSQUNFX0RFQlVHKElORk8sIiVzW0VBUCBUTFMgcGx1Z2luXSBVbmFibGUgdG8gb3BlbiBDUkwgZmlsZSAlcyBmb3IgcmVhZGluZzogJXMiLERJQU1FQVBfRVhURU5TSU9OLGNybGZpbGUsc3RyZXJyb3IocmV0KSk7CisJCQkJeXllcnJvciAoJnl5bGxvYywgY29uZmlnLCAiRXJyb3IgY29uZmlndXJpbmcgQ1JMIGZpbGUgZm9yIEVBUC1UTFMiKTsgCisJCQkJWVlFUlJPUjsKKwkJCX0KKwkJCWZjbG9zZShmbCk7CQorCQl9CisJCQljb25maWctPmNybGZpbGU9JDM7CisJCX0KKwkJOworCitDSEVDS19DTl9VU0VSTkFNRV9wYXJhbSA6CQorCQlDSEVDS19DTl9VU0VSTkFNRSAnPScgTlVNICc7JworCQl7CisJCQlpZigoaW50KSQzID09IDApeworCQkJCWNvbmZpZy0+Y2hlY2tfY2VydF9jbl91c2VybmFtZSA9IEZBTFNFOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWNvbmZpZy0+Y2hlY2tfY2VydF9jbl91c2VybmFtZSA9IFRSVUU7CQkJCisJCQl9CisJCX0KKwkJOworCQkKKyUlCisKK3ZvaWQgeXllcnJvcihZWUxUWVBFICpsbG9jcCwgc3RydWN0IHRsc19jb25maWcgKiBjb25maWcsY29uc3QgY2hhciAqc3RyKQoreworICAgICAgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluICVzICggb24gbGluZSAlaSBjb2x1bW4gJWkgLT4gbGluZSAlaSBjb2x1bW4gJWkpIDogJXNcbiIsY29uZmlnLT5jb25mZmlsZSwgbGxvY3AtPmZpcnN0X2xpbmUsIGxsb2NwLT5maXJzdF9jb2x1bW4sIGxsb2NwLT5sYXN0X2xpbmUsIGxsb2NwLT5sYXN0X2NvbHVtbiwgc3RyKTsKK30KZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvYXBwX3JhZGd3L0NNYWtlTGlzdHMudHh0IGIvZXh0ZW5zaW9ucy9hcHBfcmFkZ3cvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI5MWMyYgotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvYXBwX3JhZGd3L0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTE4IEBACisjIFRoZSBhcHBfcmFkZ3cgZXh0ZW5zaW9uCitQUk9KRUNUKCJSQURJVVMvRGlhbWV0ZXIgZXh0ZW5zaWJsZSBnYXRld2F5IGFwcGxpY2F0aW9uIGZvciBmcmVlRGlhbWV0ZXIiIEMpCisKKworIyMjIyMjIyMjIyMgTWFpbiBhcHBfcmFkZ3cgZXh0ZW5zaW9uICMjIyMjIyMjIyMjIyMKKworIyBQYXJzZXIgZmlsZXMKK0JJU09OX0ZJTEUocmd3X2NvbmYueSkKK0ZMRVhfRklMRShyZ3dfY29uZi5sKQorU0VUX1NPVVJDRV9GSUxFU19QUk9QRVJUSUVTKGxleC5yZ3dfY29uZi5jIHJnd19jb25mLnRhYi5jIFBST1BFUlRJRVMgQ09NUElMRV9GTEFHUyAiLUkgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9IikKKworIyBMaXN0IG9mIHNvdXJjZSBmaWxlcworU0VUKCBSR1dfREVGQVVMVF9TUkMKKwlyYWRpdXMuYworCW1kNS5jCisJcmd3X21zZ19jb2Rlcy5jCisJcmd3X21zZ19hdHRydHlwZS5jCisJcmd3X21haW4uYworCWxleC5yZ3dfY29uZi5jCisJcmd3X2NvbmYudGFiLmMKKwlyZ3dfY29uZi50YWIuaAorCXJnd19jbGllbnRzLmMKKwlyZ3dfcGx1Z2lucy5jCisJcmd3X3NlcnZlcnMuYworCXJnd193b3JrZXIuYworKQorCitTRVQoIFJHX0NPTU1PTl9IRUFERVIKKwlyZ3dfY29tbW9uLmgKKwlyYWRpdXMuaAorCW1kNS5oCisJaG9zdGFwX2NvbXBhdC5oCispCisKKyMgQ29tcGlsZSB0aGVzZSBmaWxlcyBhcyBhIGZyZWVEaWFtZXRlciBleHRlbnNpb24uCitGRF9BRERfRVhURU5TSU9OKGFwcF9yYWRndyAke1JHV19ERUZBVUxUX1NSQ30gJHtSR19DT01NT05fSEVBREVSfSkKKworCisjIyMjIyMjIyMjIyBSQURJVVMvRGlhbWV0ZXIgdHJhbnNsYXRpb24gYWdlbnQgcGx1Z2lucyAoc3VwcG9ydCBmb3IgUkFESVVTIHByb3RvY29sKSAjIyMjIyMjIyMjIyMKKyMgVXNlIHRoZSBtYWNybyBSR1dYX0FERF9QTFVHSU4obmFtZSBmaWxlcy4uLikgdG8gY3JlYXRlIGEgcGx1Z2luLgorIyBJdCBpcyBlcXVpdmFsZW50IHRvIGFkZF9saWJyYXJ5IHdpdGggdGhlIGFwcHJvcHJpYXRlIHBhcmFtZXRlcnMKKyMgYW5kIG5hbWluZyBjb252ZW50aW9ucyAoLnJnd3ggOiBSYWRpdXMgR2F0ZVdheSBlWHRlbnNpb24pCitNQUNSTyhSR1dYX0FERF9QTFVHSU4gUExHTkFNRSkKKyAgQUREX0xJQlJBUlkoJHtQTEdOQU1FfSBNT0RVTEUgJHtBUkdOfSkKKyAgU0VUX1RBUkdFVF9QUk9QRVJUSUVTKCR7UExHTkFNRX0gUFJPUEVSVElFUyBQUkVGSVggIiIgKQorICBTRVRfVEFSR0VUX1BST1BFUlRJRVMoJHtQTEdOQU1FfSBQUk9QRVJUSUVTIFNVRkZJWCAiLnJnd3giICkKKyAgSU5TVEFMTChUQVJHRVRTICR7UExHTkFNRX0KKwlMSUJSQVJZIERFU1RJTkFUSU9OICR7SU5TVEFMTF9FWFRFTlNJT05TX1NVRkZJWH0KKwlDT01QT05FTlQgZnJlZURpYW1ldGVyLXJhZGl1cy1nYXRld2F5KQorRU5ETUFDUk8oUkdXWF9BRERfUExVR0lOKQorCisjIEFzayB1bmxlc3MgQUxMX0VYVEVOU0lPTlMgaXMgc2V0OgorTUFDUk8oRkRfT1BUSU9OX1BMVUdJTiBQTEdWQVIgREVTQ1IgREVGTFQpCisgICBJRiAoTk9UIEFMTF9FWFRFTlNJT05TKQorICAgICBPUFRJT04oQlVJTERfJHtQTEdWQVJ9ICR7REVTQ1J9ICR7REVGTFR9KQorICAgRU5ESUYgKE5PVCBBTExfRVhURU5TSU9OUykKKyAgIElGIChCVUlMRF8ke1BMR1ZBUn0gT1IgQUxMX0VYVEVOU0lPTlMpCisgICAgIFNFVCgke1BMR1ZBUn0gVFJVRSkKKyAgIEVMU0UgKEJVSUxEXyR7UExHVkFSfSBPUiBBTExfRVhURU5TSU9OUykKKyAgICAgU0VUKCR7UExHVkFSfSBGQUxTRSkKKyAgIEVORElGIChCVUlMRF8ke1BMR1ZBUn0gT1IgQUxMX0VYVEVOU0lPTlMpCitFTkRNQUNSTyhGRF9PUFRJT05fUExVR0lOIFBMR1ZBUiBERVNDUiBERUZMVCkKKworCisjIyMgRGVidWcgCisjIEV4YW1wbGUgb2YgcGx1Z2luOgorCitGRF9PUFRJT05fUExVR0lOKFJHV1hfU0FNUExFICJCdWlsZCBzYW1wbGUgcGx1Z2luPyAoZm9yIGRldmVsb3BlcnMgb25seSkiIE9GRikKKyAJSUYgKFJHV1hfU0FNUExFKQorIAkgICBSR1dYX0FERF9QTFVHSU4oc2FtcGxlICR7UkdfQ09NTU9OX0hFQURFUn0gcmd3eF9zYW1wbGUuYykKKyAJRU5ESUYgKFJHV1hfU0FNUExFKQorCisjIEEgcGx1Z2luIGZvciBkZWJ1ZzogZHVtcHMgUkFESVVTIGFuZCBEaWFtZXRlciBtZXNzYWdlcyBzdGF0ZSBhdCB0aGUgdGltZSB0aGUgcGx1Z2luIGlzIGNhbGxlZC4KK0ZEX09QVElPTl9QTFVHSU4oUkdXWF9ERUJVRyAiQnVpbGQgZGVidWcgcGx1Z2luPyAoZGlzcGxheSBzdGF0dXMgb2YgUkFESVVTIGFuZCBEaWFtZXRlciBtZXNzYWdlcykiIE9OKQorIAlJRiAoUkdXWF9ERUJVRykKKyAJICAgUkdXWF9BRERfUExVR0lOKGRlYnVnICR7UkdfQ09NTU9OX0hFQURFUn0gcmd3eF9kZWJ1Zy5jKQorIAlFTkRJRiAoUkdXWF9ERUJVRykKKworCisjIyMgQXV0aGVudGljYXRpb24sIEF1dGhvcml6YXRpb24gbWVzc2FnZXMgdHJhbnNsYXRpb24uCitGRF9PUFRJT05fUExVR0lOKFJHV1hfQVVUSCAiQnVpbGQgQXV0aGVudGljYXRpb24gJiBBdXRob3JpemF0aW9uIFJBRElVUyB0cmFuc2xhdGlvbiBwbHVnaW4/IChSRkMyODY1LCBSRkMzNTc5KSIgT04pCisJSUYgKFJHV1hfQVVUSCkKKyAJICAgUkdXWF9BRERfUExVR0lOKGF1dGggJHtSR19DT01NT05fSEVBREVSfSByZ3d4X2F1dGguYykKKwlFTkRJRiAoUkdXWF9BVVRIKQorCisjIyMgU0lQIEF1dGhlbnRpY2F0aW9uLCBBdXRob3JpemF0aW9uIG1lc3NhZ2VzIHRyYW5zbGF0aW9uLgorRkRfT1BUSU9OX1BMVUdJTihSR1dYX1NJUCAiQnVpbGQgU0lQIFJBRElVUyB0cmFuc2xhdGlvbiBwbHVnaW4/IChSRkM0NzQwIG9yIFJGQzUwOTApIiBPRkYpCisgICAgICAgIElGIChSR1dYX1NJUCkKKyAgICAgICAgICAgUkdXWF9BRERfUExVR0lOKHNpcCAke1JHX0NPTU1PTl9IRUFERVJ9IHJnd3hfc2lwLmMpCisgICAgICAgIEVORElGIChSR1dYX1NJUCkKKworCisKKyMjIyBBY2NvdW50aW5nIG1lc3NhZ2VzIHRyYW5zbGF0aW9uLgorRkRfT1BUSU9OX1BMVUdJTihSR1dYX0FDQ1QgIkJ1aWxkIEFjY291bnRpbmcgUkFESVVTIHRyYW5zbGF0aW9uIHBsdWdpbj8gKFJGQzI4NjYpIiBPTikKKwlJRiAoUkdXWF9BQ0NUKQorIAkgICBSR1dYX0FERF9QTFVHSU4oYWNjdCAke1JHX0NPTU1PTl9IRUFERVJ9IHJnd3hfYWNjdC5jKQorCUVORElGIChSR1dYX0FDQ1QpCisKKworIyMjIEdlbmVyaWMgcGx1Z2luIHRvIGhhbmRsZSBzb21lIGF0dHJpYnV0ZXMgKGVpdGhlciBkZWxldGUgdGhlbSBvciBzaW1wbHkgZWNobyB0aGVtIGluIHRoZSBhbnN3ZXIpIAorRkRfT1BUSU9OX1BMVUdJTihSR1dYX0VDSE9EUk9QICJCdWlsZCAnZWNoby9kcm9wJyBwbHVnaW4/IChkcm9wIHNwZWNpZmljIFJBRElVUyBhdHRyaWJ1dGVzIG9yIGVjaG8gdGhlbSBpbiBSQURJVVMgYW5zd2VyKSIgT04pCisgIAlJRiAoUkdXWF9FQ0hPRFJPUCkKKyAgCSAgIEJJU09OX0ZJTEUocmd3eF9lY2hvZHJvcC55KQorICAJICAgRkxFWF9GSUxFKHJnd3hfZWNob2Ryb3AubCkKKyAgCSAgIFNFVF9TT1VSQ0VfRklMRVNfUFJPUEVSVElFUyhsZXgucmd3eF9lY2hvZHJvcC5jIHJnd3hfZWNob2Ryb3AudGFiLmMgUFJPUEVSVElFUyBDT01QSUxFX0ZMQUdTICItSSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0iKQorIAkgICBSR1dYX0FERF9QTFVHSU4oZWNob2Ryb3AgJHtSR19DT01NT05fSEVBREVSfSByZ3d4X2VjaG9kcm9wLmggcmd3eF9lY2hvZHJvcC5jIGxleC5yZ3d4X2VjaG9kcm9wLmMgcmd3eF9lY2hvZHJvcC50YWIuYyByZ3d4X2VjaG9kcm9wLnRhYi5oICkKKyAgCUVORElGIChSR1dYX0VDSE9EUk9QKQorCQorCQorIyMjIworIyMgSU5TVEFMTCBzZWN0aW9uICMjCisKK0lOU1RBTEwoVEFSR0VUUyBhcHBfcmFkZ3cKKwlMSUJSQVJZIERFU1RJTkFUSU9OICR7SU5TVEFMTF9FWFRFTlNJT05TX1NVRkZJWH0KKwlDT01QT05FTlQgZnJlZURpYW1ldGVyLXJhZGl1cy1nYXRld2F5KQorCQorIyBOb3RlIHRoYXQgYWxsIGNvbXBpbGVkIHBsdWdpbnMgYXJlIGFkZGVkIGJ5IHRoZSBSR1dYX0FERF9QTFVHSU4gbWFjcm8gaW4gdGhlIGNvbXBvbmVudCBmcmVlRGlhbWV0ZXItcmFkaXVzLWdhdGV3YXkgYXMgd2VsbC4KZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvYXBwX3JhZGd3L2hvc3RhcF9jb21wYXQuaCBiL2V4dGVuc2lvbnMvYXBwX3JhZGd3L2hvc3RhcF9jb21wYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmVlMmFjCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9hcHBfcmFkZ3cvaG9zdGFwX2NvbXBhdC5oCkBAIC0wLDAgKzEsMTk0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxMSwgV0lERSBQcm9qZWN0IGFuZCBOSUNUCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBXSURFIFByb2plY3Qgb3IgTklDVCBub3IgdGhlIAkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFdJREUgUHJvamVjdCBhbmQgCQkJCQkJICoKKyogICBOSUNULgkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoaXMgZmlsZSBjb250YWlucyBjb21wYXRpYmlsaXR5IGJpbmRpbmdzIGZvciBob3N0YXAgZmlsZXMuCisgTW9zdCBvZiB0aGUgZGVmaW5pdGlvbnMgaGVyZSBjb21lIGZyb20gZGlmZmVyZW50IGZpbGVzIGZyb20gdGhlIGhvc3RhcCBwcm9qZWN0LgorIAorIFdlIGRvbid0IGNhcmUgZm9yIE9TLXNwZWNpZmljIGRlZmluaXRpb25zIHNpbmNlIHdlIGFyZSBvbmx5IGNvbXBhdGlibGUgd2l0aCBQT1NJWCBzeXN0ZW1zLgorIAorICovCisKKyNpZm5kZWYgX0hPU1RBUF9DT01QQVRfSAorI2RlZmluZSBfSE9TVEFQX0NPTVBBVF9ICisKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorCit0eXBlZGVmIHVpbnQ2NF90IHU2NDsKK3R5cGVkZWYgdWludDMyX3QgdTMyOwordHlwZWRlZiB1aW50MTZfdCB1MTY7Cit0eXBlZGVmIHVpbnQ4X3QgdTg7Cit0eXBlZGVmIGludDY0X3QgczY0OwordHlwZWRlZiBpbnQzMl90IHMzMjsKK3R5cGVkZWYgaW50MTZfdCBzMTY7Cit0eXBlZGVmIGludDhfdCBzODsKKworLyogbWQ1LmMgdXNlcyBhIGRpZmZlcmVudCBtYWNybyBuYW1lIHRoYW4gZnJlZURpYW1ldGVyIGZvciBlbmRpYW5uZXNzICovCisjaWZkZWYgSE9TVF9CSUdfRU5ESUFOCisjIGRlZmluZSBXT1JEU19CSUdFTkRJQU4gSE9TVF9CSUdfRU5ESUFOCisjZWxzZSAvKiBIT1NUX0JJR19FTkRJQU4gKi8KKyMgdW5kZWYgV09SRFNfQklHRU5ESUFOCisjZW5kaWYgLyogSE9TVF9CSUdfRU5ESUFOICovCisKKy8qIGZyZWVEaWFtZXRlciB1c2VzIHRoZSBQT1NJWCBBUEksIHNvIHdlIGRvbid0IHByb3ZpZGUgYWx0ZXJuYXRpdmVzLiBUaGlzIG1heSBiZSBjaGFuZ2VkIGxhdGVyIGFzIG5lZWRlZCAqLworI2RlZmluZSBvc19tYWxsb2MocykgbWFsbG9jKChzKSkKKyNkZWZpbmUgb3NfcmVhbGxvYyhwLCBzKSByZWFsbG9jKChwKSwgKHMpKQorI2RlZmluZSBvc19mcmVlKHApIGZyZWUoKHApKQorCisjZGVmaW5lIG9zX21lbWNweShkLCBzLCBuKSBtZW1jcHkoKGQpLCAocyksIChuKSkKKyNkZWZpbmUgb3NfbWVtbW92ZShkLCBzLCBuKSBtZW1tb3ZlKChkKSwgKHMpLCAobikpCisjZGVmaW5lIG9zX21lbXNldChzLCBjLCBuKSBtZW1zZXQocywgYywgbikKKyNkZWZpbmUgb3NfbWVtY21wKHMxLCBzMiwgbikgbWVtY21wKChzMSksIChzMiksIChuKSkKKworI2RlZmluZSBvc19zdHJkdXAocykgc3RyZHVwKHMpCisjZGVmaW5lIG9zX3N0cmxlbihzKSBzdHJsZW4ocykKKyNkZWZpbmUgb3Nfc3RyY2FzZWNtcChzMSwgczIpIHN0cmNhc2VjbXAoKHMxKSwgKHMyKSkKKyNkZWZpbmUgb3Nfc3RybmNhc2VjbXAoczEsIHMyLCBuKSBzdHJuY2FzZWNtcCgoczEpLCAoczIpLCAobikpCisjZGVmaW5lIG9zX3N0cmNocihzLCBjKSBzdHJjaHIoKHMpLCAoYykpCisjZGVmaW5lIG9zX3N0cmNtcChzMSwgczIpIHN0cmNtcCgoczEpLCAoczIpKQorI2RlZmluZSBvc19zdHJuY21wKHMxLCBzMiwgbikgc3RybmNtcCgoczEpLCAoczIpLCAobikpCisjZGVmaW5lIG9zX3N0cm5jcHkoZCwgcywgbikgc3RybmNweSgoZCksIChzKSwgKG4pKQorI2RlZmluZSBvc19zdHJyY2hyKHMsIGMpIHN0cnJjaHIoKHMpLCAoYykpCisjZGVmaW5lIG9zX3N0cnN0cihoLCBuKSBzdHJzdHIoKGgpLCAobikpCisjZGVmaW5lIG9zX3NucHJpbnRmIHNucHJpbnRmCisKKyNkZWZpbmUgb3NfcmFuZG9tKCkgcmFuZG9tKCkKKworc3RhdGljIF9faW5saW5lX18gdm9pZCAqIG9zX3phbGxvYyhzaXplX3Qgc2l6ZSkKK3sKKwl2b2lkICpuID0gb3NfbWFsbG9jKHNpemUpOworCWlmIChuKQorCQlvc19tZW1zZXQobiwgMCwgc2l6ZSk7CisJcmV0dXJuIG47Cit9CisKK3R5cGVkZWYgbG9uZyBvc190aW1lX3Q7CitzdHJ1Y3Qgb3NfdGltZSB7CisJb3NfdGltZV90IHNlYzsKKwlvc190aW1lX3QgdXNlYzsKK307CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBvc19nZXRfdGltZShzdHJ1Y3Qgb3NfdGltZSAqdCkKK3sKKwlpbnQgcmVzOworCXN0cnVjdCB0aW1ldmFsIHR2OworCXJlcyA9IGdldHRpbWVvZmRheSgmdHYsIE5VTEwpOworCXQtPnNlYyA9IHR2LnR2X3NlYzsKKwl0LT51c2VjID0gdHYudHZfdXNlYzsKKwlyZXR1cm4gcmVzOworfQorCisvKiBNYWNyb3MgZm9yIGhhbmRsaW5nIHVuYWxpZ25lZCBtZW1vcnkgYWNjZXNzZXMgKi8KKyNkZWZpbmUgV1BBX0dFVF9CRTE2KGEpICgodTE2KSAoKChhKVswXSA8PCA4KSB8IChhKVsxXSkpCisjZGVmaW5lIFdQQV9QVVRfQkUxNihhLCB2YWwpCQkJXAorCWRvIHsJCQkJCVwKKwkJKGEpWzBdID0gKCh1MTYpICh2YWwpKSA+PiA4OwlcCisJCShhKVsxXSA9ICgodTE2KSAodmFsKSkgJiAweGZmOwlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBXUEFfR0VUX0xFMTYoYSkgKCh1MTYpICgoKGEpWzFdIDw8IDgpIHwgKGEpWzBdKSkKKyNkZWZpbmUgV1BBX1BVVF9MRTE2KGEsIHZhbCkJCQlcCisJZG8gewkJCQkJXAorCQkoYSlbMV0gPSAoKHUxNikgKHZhbCkpID4+IDg7CVwKKwkJKGEpWzBdID0gKCh1MTYpICh2YWwpKSAmIDB4ZmY7CVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIFdQQV9HRVRfQkUyNChhKSAoKCgodTMyKSAoYSlbMF0pIDw8IDE2KSB8ICgoKHUzMikgKGEpWzFdKSA8PCA4KSB8IFwKKwkJCSAoKHUzMikgKGEpWzJdKSkKKyNkZWZpbmUgV1BBX1BVVF9CRTI0KGEsIHZhbCkJCQkJCVwKKwlkbyB7CQkJCQkJCVwKKwkJKGEpWzBdID0gKHU4KSAoKCgodTMyKSAodmFsKSkgPj4gMTYpICYgMHhmZik7CVwKKwkJKGEpWzFdID0gKHU4KSAoKCgodTMyKSAodmFsKSkgPj4gOCkgJiAweGZmKTsJXAorCQkoYSlbMl0gPSAodTgpICgoKHUzMikgKHZhbCkpICYgMHhmZik7CQlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBXUEFfR0VUX0JFMzIoYSkgKCgoKHUzMikgKGEpWzBdKSA8PCAyNCkgfCAoKCh1MzIpIChhKVsxXSkgPDwgMTYpIHwgXAorCQkJICgoKHUzMikgKGEpWzJdKSA8PCA4KSB8ICgodTMyKSAoYSlbM10pKQorI2RlZmluZSBXUEFfUFVUX0JFMzIoYSwgdmFsKQkJCQkJXAorCWRvIHsJCQkJCQkJXAorCQkoYSlbMF0gPSAodTgpICgoKCh1MzIpICh2YWwpKSA+PiAyNCkgJiAweGZmKTsJXAorCQkoYSlbMV0gPSAodTgpICgoKCh1MzIpICh2YWwpKSA+PiAxNikgJiAweGZmKTsJXAorCQkoYSlbMl0gPSAodTgpICgoKCh1MzIpICh2YWwpKSA+PiA4KSAmIDB4ZmYpOwlcCisJCShhKVszXSA9ICh1OCkgKCgodTMyKSAodmFsKSkgJiAweGZmKTsJCVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIFdQQV9HRVRfTEUzMihhKSAoKCgodTMyKSAoYSlbM10pIDw8IDI0KSB8ICgoKHUzMikgKGEpWzJdKSA8PCAxNikgfCBcCisJCQkgKCgodTMyKSAoYSlbMV0pIDw8IDgpIHwgKCh1MzIpIChhKVswXSkpCisjZGVmaW5lIFdQQV9QVVRfTEUzMihhLCB2YWwpCQkJCQlcCisJZG8gewkJCQkJCQlcCisJCShhKVszXSA9ICh1OCkgKCgoKHUzMikgKHZhbCkpID4+IDI0KSAmIDB4ZmYpOwlcCisJCShhKVsyXSA9ICh1OCkgKCgoKHUzMikgKHZhbCkpID4+IDE2KSAmIDB4ZmYpOwlcCisJCShhKVsxXSA9ICh1OCkgKCgoKHUzMikgKHZhbCkpID4+IDgpICYgMHhmZik7CVwKKwkJKGEpWzBdID0gKHU4KSAoKCh1MzIpICh2YWwpKSAmIDB4ZmYpOwkJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgV1BBX0dFVF9CRTY0KGEpICgoKCh1NjQpIChhKVswXSkgPDwgNTYpIHwgKCgodTY0KSAoYSlbMV0pIDw8IDQ4KSB8IFwKKwkJCSAoKCh1NjQpIChhKVsyXSkgPDwgNDApIHwgKCgodTY0KSAoYSlbM10pIDw8IDMyKSB8IFwKKwkJCSAoKCh1NjQpIChhKVs0XSkgPDwgMjQpIHwgKCgodTY0KSAoYSlbNV0pIDw8IDE2KSB8IFwKKwkJCSAoKCh1NjQpIChhKVs2XSkgPDwgOCkgfCAoKHU2NCkgKGEpWzddKSkKKyNkZWZpbmUgV1BBX1BVVF9CRTY0KGEsIHZhbCkJCQkJXAorCWRvIHsJCQkJCQlcCisJCShhKVswXSA9ICh1OCkgKCgodTY0KSAodmFsKSkgPj4gNTYpOwlcCisJCShhKVsxXSA9ICh1OCkgKCgodTY0KSAodmFsKSkgPj4gNDgpOwlcCisJCShhKVsyXSA9ICh1OCkgKCgodTY0KSAodmFsKSkgPj4gNDApOwlcCisJCShhKVszXSA9ICh1OCkgKCgodTY0KSAodmFsKSkgPj4gMzIpOwlcCisJCShhKVs0XSA9ICh1OCkgKCgodTY0KSAodmFsKSkgPj4gMjQpOwlcCisJCShhKVs1XSA9ICh1OCkgKCgodTY0KSAodmFsKSkgPj4gMTYpOwlcCisJCShhKVs2XSA9ICh1OCkgKCgodTY0KSAodmFsKSkgPj4gOCk7CVwKKwkJKGEpWzddID0gKHU4KSAoKCh1NjQpICh2YWwpKSAmIDB4ZmYpOwlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBXUEFfR0VUX0xFNjQoYSkgKCgoKHU2NCkgKGEpWzddKSA8PCA1NikgfCAoKCh1NjQpIChhKVs2XSkgPDwgNDgpIHwgXAorCQkJICgoKHU2NCkgKGEpWzVdKSA8PCA0MCkgfCAoKCh1NjQpIChhKVs0XSkgPDwgMzIpIHwgXAorCQkJICgoKHU2NCkgKGEpWzNdKSA8PCAyNCkgfCAoKCh1NjQpIChhKVsyXSkgPDwgMTYpIHwgXAorCQkJICgoKHU2NCkgKGEpWzFdKSA8PCA4KSB8ICgodTY0KSAoYSlbMF0pKQorCisKKy8qIFBhY2tpbmcgc3RydWN0dXJlcyB0byBhdm9pZCBwYWRkaW5nICovCisjaWZkZWYgX19HTlVDX18KKyNkZWZpbmUgU1RSVUNUX1BBQ0tFRCBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkKKyNlbHNlCisjZGVmaW5lIFNUUlVDVF9QQUNLRUQKKyNlbmRpZgorCisvKiBGb3IgbWQ1LmMgZmlsZSAqLworI2RlZmluZSBJTlRFUk5BTF9NRDUKKyNkZWZpbmUgQ09ORklHX0NSWVBUT19JTlRFUk5BTAorCisvKiBGb3IgcmFkaXVzLmMgZmlsZSAqLworI2RlZmluZSBDT05GSUdfSVBWNgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisKKyNlbmRpZiAvKiBfSE9TVEFQX0NPTVBBVF9IICovCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2FwcF9yYWRndy9tZDUuYyBiL2V4dGVuc2lvbnMvYXBwX3JhZGd3L21kNS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1NWZjZjAKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2FwcF9yYWRndy9tZDUuYwpAQCAtMCwwICsxLDM5OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGZyZWVEaWFtZXRlciBhdXRob3Igbm90ZToKKyAqICBUaGUgY29udGVudCBmcm9tIHRoaXMgZmlsZSBjb21lcyBkaXJlY3RseSBmcm9tIHRoZSBob3N0YXAgcHJvamVjdC4KKyAqIEl0IGlzIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBCU0QgbGljZW5zZSwgYXMgYWxsb3dlZAorICogYnkgdGhlIG9yaWdpbmFsIGNvcHlyaWdodCByZXByb2R1Y2VkIGJlbG93LgorICogIEluIGFkZGl0aW9uIHRvIHRoaXMgbm90aWNlLCBvbmx5IHRoZSAjaW5jbHVkZSBkaXJlY3RpdmVzIGhhdmUgYmVlbiBtb2RpZmllZC4KKyAqLworI2luY2x1ZGUgInJnd19jb21tb24uaCIKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAKKy8qCisgKiBNRDUgaGFzaCBpbXBsZW1lbnRhdGlvbiBhbmQgaW50ZXJmYWNlIGZ1bmN0aW9ucworICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDUsIEpvdW5pIE1hbGluZW4gPGpAdzEuZmk+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgQlNECisgKiBsaWNlbnNlLgorICoKKyAqIFNlZSBSRUFETUUgYW5kIENPUFlJTkcgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisKKy8qKgorICogaG1hY19tZDVfdmVjdG9yIC0gSE1BQy1NRDUgb3ZlciBkYXRhIHZlY3RvciAoUkZDIDIxMDQpCisgKiBAa2V5OiBLZXkgZm9yIEhNQUMgb3BlcmF0aW9ucworICogQGtleV9sZW46IExlbmd0aCBvZiB0aGUga2V5IGluIGJ5dGVzCisgKiBAbnVtX2VsZW06IE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgZGF0YSB2ZWN0b3IKKyAqIEBhZGRyOiBQb2ludGVycyB0byB0aGUgZGF0YSBhcmVhcworICogQGxlbjogTGVuZ3RocyBvZiB0aGUgZGF0YSBibG9ja3MKKyAqIEBtYWM6IEJ1ZmZlciBmb3IgdGhlIGhhc2ggKDE2IGJ5dGVzKQorICovCit2b2lkIGhtYWNfbWQ1X3ZlY3Rvcihjb25zdCB1OCAqa2V5LCBzaXplX3Qga2V5X2xlbiwgc2l6ZV90IG51bV9lbGVtLAorCQkgICAgIGNvbnN0IHU4ICphZGRyW10sIGNvbnN0IHNpemVfdCAqbGVuLCB1OCAqbWFjKQoreworCXU4IGtfcGFkWzY0XTsgLyogcGFkZGluZyAtIGtleSBYT1JkIHdpdGggaXBhZC9vcGFkICovCisJdTggdGtbMTZdOworCWNvbnN0IHU4ICpfYWRkcls2XTsKKwlzaXplX3QgaSwgX2xlbls2XTsKKworCWlmIChudW1fZWxlbSA+IDUpIHsKKwkJLyoKKwkJICogRml4ZWQgbGltaXQgb24gdGhlIG51bWJlciBvZiBmcmFnbWVudHMgdG8gYXZvaWQgaGF2aW5nIHRvCisJCSAqIGFsbG9jYXRlIG1lbW9yeSAod2hpY2ggY291bGQgZmFpbCkuCisJCSAqLworCQlyZXR1cm47CisJfQorCisgICAgICAgIC8qIGlmIGtleSBpcyBsb25nZXIgdGhhbiA2NCBieXRlcyByZXNldCBpdCB0byBrZXkgPSBNRDUoa2V5KSAqLworICAgICAgICBpZiAoa2V5X2xlbiA+IDY0KSB7CisJCW1kNV92ZWN0b3IoMSwgJmtleSwgJmtleV9sZW4sIHRrKTsKKwkJa2V5ID0gdGs7CisJCWtleV9sZW4gPSAxNjsKKyAgICAgICAgfQorCisJLyogdGhlIEhNQUNfTUQ1IHRyYW5zZm9ybSBsb29rcyBsaWtlOgorCSAqCisJICogTUQ1KEsgWE9SIG9wYWQsIE1ENShLIFhPUiBpcGFkLCB0ZXh0KSkKKwkgKgorCSAqIHdoZXJlIEsgaXMgYW4gbiBieXRlIGtleQorCSAqIGlwYWQgaXMgdGhlIGJ5dGUgMHgzNiByZXBlYXRlZCA2NCB0aW1lcworCSAqIG9wYWQgaXMgdGhlIGJ5dGUgMHg1YyByZXBlYXRlZCA2NCB0aW1lcworCSAqIGFuZCB0ZXh0IGlzIHRoZSBkYXRhIGJlaW5nIHByb3RlY3RlZCAqLworCisJLyogc3RhcnQgb3V0IGJ5IHN0b3Jpbmcga2V5IGluIGlwYWQgKi8KKwlvc19tZW1zZXQoa19wYWQsIDAsIHNpemVvZihrX3BhZCkpOworCW9zX21lbWNweShrX3BhZCwga2V5LCBrZXlfbGVuKTsKKworCS8qIFhPUiBrZXkgd2l0aCBpcGFkIHZhbHVlcyAqLworCWZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKQorCQlrX3BhZFtpXSBePSAweDM2OworCisJLyogcGVyZm9ybSBpbm5lciBNRDUgKi8KKwlfYWRkclswXSA9IGtfcGFkOworCV9sZW5bMF0gPSA2NDsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2VsZW07IGkrKykgeworCQlfYWRkcltpICsgMV0gPSBhZGRyW2ldOworCQlfbGVuW2kgKyAxXSA9IGxlbltpXTsKKwl9CisJbWQ1X3ZlY3RvcigxICsgbnVtX2VsZW0sIF9hZGRyLCBfbGVuLCBtYWMpOworCisJb3NfbWVtc2V0KGtfcGFkLCAwLCBzaXplb2Yoa19wYWQpKTsKKwlvc19tZW1jcHkoa19wYWQsIGtleSwga2V5X2xlbik7CisJLyogWE9SIGtleSB3aXRoIG9wYWQgdmFsdWVzICovCisJZm9yIChpID0gMDsgaSA8IDY0OyBpKyspCisJCWtfcGFkW2ldIF49IDB4NWM7CisKKwkvKiBwZXJmb3JtIG91dGVyIE1ENSAqLworCV9hZGRyWzBdID0ga19wYWQ7CisJX2xlblswXSA9IDY0OworCV9hZGRyWzFdID0gbWFjOworCV9sZW5bMV0gPSBNRDVfTUFDX0xFTjsKKwltZDVfdmVjdG9yKDIsIF9hZGRyLCBfbGVuLCBtYWMpOworfQorCisKKy8qKgorICogaG1hY19tZDUgLSBITUFDLU1ENSBvdmVyIGRhdGEgYnVmZmVyIChSRkMgMjEwNCkKKyAqIEBrZXk6IEtleSBmb3IgSE1BQyBvcGVyYXRpb25zCisgKiBAa2V5X2xlbjogTGVuZ3RoIG9mIHRoZSBrZXkgaW4gYnl0ZXMKKyAqIEBkYXRhOiBQb2ludGVycyB0byB0aGUgZGF0YSBhcmVhCisgKiBAZGF0YV9sZW46IExlbmd0aCBvZiB0aGUgZGF0YSBhcmVhCisgKiBAbWFjOiBCdWZmZXIgZm9yIHRoZSBoYXNoICgxNiBieXRlcykKKyAqLwordm9pZCBobWFjX21kNShjb25zdCB1OCAqa2V5LCBzaXplX3Qga2V5X2xlbiwgY29uc3QgdTggKmRhdGEsIHNpemVfdCBkYXRhX2xlbiwKKwkgICAgICB1OCAqbWFjKQoreworCWhtYWNfbWQ1X3ZlY3RvcihrZXksIGtleV9sZW4sIDEsICZkYXRhLCAmZGF0YV9sZW4sIG1hYyk7Cit9CisKKworI2lmZGVmIElOVEVSTkFMX01ENQorCitzdHJ1Y3QgTUQ1Q29udGV4dCB7CisJdTMyIGJ1Zls0XTsKKwl1MzIgYml0c1syXTsKKwl1OCBpbls2NF07Cit9OworCisjaWZuZGVmIENPTkZJR19DUllQVE9fSU5URVJOQUwKK3N0YXRpYyB2b2lkIE1ENUluaXQoc3RydWN0IE1ENUNvbnRleHQgKmNvbnRleHQpOworc3RhdGljIHZvaWQgTUQ1VXBkYXRlKHN0cnVjdCBNRDVDb250ZXh0ICpjb250ZXh0LCB1bnNpZ25lZCBjaGFyIGNvbnN0ICpidWYsCisJCQkgIHVuc2lnbmVkIGxlbik7CitzdGF0aWMgdm9pZCBNRDVGaW5hbCh1bnNpZ25lZCBjaGFyIGRpZ2VzdFsxNl0sIHN0cnVjdCBNRDVDb250ZXh0ICpjb250ZXh0KTsKKyNlbmRpZiAvKiBDT05GSUdfQ1JZUFRPX0lOVEVSTkFMICovCitzdGF0aWMgdm9pZCBNRDVUcmFuc2Zvcm0odTMyIGJ1Zls0XSwgdTMyIGNvbnN0IGluWzE2XSk7CisKKwordHlwZWRlZiBzdHJ1Y3QgTUQ1Q29udGV4dCBNRDVfQ1RYOworCisKKy8qKgorICogbWQ1X3ZlY3RvciAtIE1ENSBoYXNoIGZvciBkYXRhIHZlY3RvcgorICogQG51bV9lbGVtOiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGRhdGEgdmVjdG9yCisgKiBAYWRkcjogUG9pbnRlcnMgdG8gdGhlIGRhdGEgYXJlYXMKKyAqIEBsZW46IExlbmd0aHMgb2YgdGhlIGRhdGEgYmxvY2tzCisgKiBAbWFjOiBCdWZmZXIgZm9yIHRoZSBoYXNoCisgKi8KK3ZvaWQgbWQ1X3ZlY3RvcihzaXplX3QgbnVtX2VsZW0sIGNvbnN0IHU4ICphZGRyW10sIGNvbnN0IHNpemVfdCAqbGVuLCB1OCAqbWFjKQoreworCU1ENV9DVFggY3R4OworCXNpemVfdCBpOworCisJTUQ1SW5pdCgmY3R4KTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2VsZW07IGkrKykKKwkJTUQ1VXBkYXRlKCZjdHgsIGFkZHJbaV0sIGxlbltpXSk7CisJTUQ1RmluYWwobWFjLCAmY3R4KTsKK30KKworCisvKiA9PT09PSBzdGFydCAtIHB1YmxpYyBkb21haW4gTUQ1IGltcGxlbWVudGF0aW9uID09PT09ICovCisvKgorICogVGhpcyBjb2RlIGltcGxlbWVudHMgdGhlIE1ENSBtZXNzYWdlLWRpZ2VzdCBhbGdvcml0aG0uCisgKiBUaGUgYWxnb3JpdGhtIGlzIGR1ZSB0byBSb24gUml2ZXN0LiAgVGhpcyBjb2RlIHdhcworICogd3JpdHRlbiBieSBDb2xpbiBQbHVtYiBpbiAxOTkzLCBubyBjb3B5cmlnaHQgaXMgY2xhaW1lZC4KKyAqIFRoaXMgY29kZSBpcyBpbiB0aGUgcHVibGljIGRvbWFpbjsgZG8gd2l0aCBpdCB3aGF0IHlvdSB3aXNoLgorICoKKyAqIEVxdWl2YWxlbnQgY29kZSBpcyBhdmFpbGFibGUgZnJvbSBSU0EgRGF0YSBTZWN1cml0eSwgSW5jLgorICogVGhpcyBjb2RlIGhhcyBiZWVuIHRlc3RlZCBhZ2FpbnN0IHRoYXQsIGFuZCBpcyBlcXVpdmFsZW50LAorICogZXhjZXB0IHRoYXQgeW91IGRvbid0IG5lZWQgdG8gaW5jbHVkZSB0d28gcGFnZXMgb2YgbGVnYWxlc2UKKyAqIHdpdGggZXZlcnkgY29weS4KKyAqCisgKiBUbyBjb21wdXRlIHRoZSBtZXNzYWdlIGRpZ2VzdCBvZiBhIGNodW5rIG9mIGJ5dGVzLCBkZWNsYXJlIGFuCisgKiBNRDVDb250ZXh0IHN0cnVjdHVyZSwgcGFzcyBpdCB0byBNRDVJbml0LCBjYWxsIE1ENVVwZGF0ZSBhcworICogbmVlZGVkIG9uIGJ1ZmZlcnMgZnVsbCBvZiBieXRlcywgYW5kIHRoZW4gY2FsbCBNRDVGaW5hbCwgd2hpY2gKKyAqIHdpbGwgZmlsbCBhIHN1cHBsaWVkIDE2LWJ5dGUgYXJyYXkgd2l0aCB0aGUgZGlnZXN0LgorICovCisKKyNpZm5kZWYgV09SRFNfQklHRU5ESUFOCisjZGVmaW5lIGJ5dGVSZXZlcnNlKGJ1ZiwgbGVuKQkvKiBOb3RoaW5nICovCisjZWxzZQorLyoKKyAqIE5vdGU6IHRoaXMgY29kZSBpcyBoYXJtbGVzcyBvbiBsaXR0bGUtZW5kaWFuIG1hY2hpbmVzLgorICovCitzdGF0aWMgdm9pZCBieXRlUmV2ZXJzZSh1bnNpZ25lZCBjaGFyICpidWYsIHVuc2lnbmVkIGxvbmdzKQoreworICAgIHUzMiB0OworICAgIGRvIHsKKwl0ID0gKHUzMikgKCh1bnNpZ25lZCkgYnVmWzNdIDw8IDggfCBidWZbMl0pIDw8IDE2IHwKKwkgICAgKCh1bnNpZ25lZCkgYnVmWzFdIDw8IDggfCBidWZbMF0pOworCSoodTMyICopIGJ1ZiA9IHQ7CisJYnVmICs9IDQ7CisgICAgfSB3aGlsZSAoLS1sb25ncyk7Cit9CisjZW5kaWYKKworLyoKKyAqIFN0YXJ0IE1ENSBhY2N1bXVsYXRpb24uICBTZXQgYml0IGNvdW50IHRvIDAgYW5kIGJ1ZmZlciB0byBteXN0ZXJpb3VzCisgKiBpbml0aWFsaXphdGlvbiBjb25zdGFudHMuCisgKi8KK3ZvaWQgTUQ1SW5pdChzdHJ1Y3QgTUQ1Q29udGV4dCAqY3R4KQoreworICAgIGN0eC0+YnVmWzBdID0gMHg2NzQ1MjMwMTsKKyAgICBjdHgtPmJ1ZlsxXSA9IDB4ZWZjZGFiODk7CisgICAgY3R4LT5idWZbMl0gPSAweDk4YmFkY2ZlOworICAgIGN0eC0+YnVmWzNdID0gMHgxMDMyNTQ3NjsKKworICAgIGN0eC0+Yml0c1swXSA9IDA7CisgICAgY3R4LT5iaXRzWzFdID0gMDsKK30KKworLyoKKyAqIFVwZGF0ZSBjb250ZXh0IHRvIHJlZmxlY3QgdGhlIGNvbmNhdGVuYXRpb24gb2YgYW5vdGhlciBidWZmZXIgZnVsbAorICogb2YgYnl0ZXMuCisgKi8KK3ZvaWQgTUQ1VXBkYXRlKHN0cnVjdCBNRDVDb250ZXh0ICpjdHgsIHVuc2lnbmVkIGNoYXIgY29uc3QgKmJ1ZiwgdW5zaWduZWQgbGVuKQoreworICAgIHUzMiB0OworCisgICAgLyogVXBkYXRlIGJpdGNvdW50ICovCisKKyAgICB0ID0gY3R4LT5iaXRzWzBdOworICAgIGlmICgoY3R4LT5iaXRzWzBdID0gdCArICgodTMyKSBsZW4gPDwgMykpIDwgdCkKKwljdHgtPmJpdHNbMV0rKzsJCS8qIENhcnJ5IGZyb20gbG93IHRvIGhpZ2ggKi8KKyAgICBjdHgtPmJpdHNbMV0gKz0gbGVuID4+IDI5OworCisgICAgdCA9ICh0ID4+IDMpICYgMHgzZjsJLyogQnl0ZXMgYWxyZWFkeSBpbiBzaHNJbmZvLT5kYXRhICovCisKKyAgICAvKiBIYW5kbGUgYW55IGxlYWRpbmcgb2RkLXNpemVkIGNodW5rcyAqLworCisgICAgaWYgKHQpIHsKKwl1bnNpZ25lZCBjaGFyICpwID0gKHVuc2lnbmVkIGNoYXIgKikgY3R4LT5pbiArIHQ7CisKKwl0ID0gNjQgLSB0OworCWlmIChsZW4gPCB0KSB7CisJICAgIG9zX21lbWNweShwLCBidWYsIGxlbik7CisJICAgIHJldHVybjsKKwl9CisJb3NfbWVtY3B5KHAsIGJ1ZiwgdCk7CisJYnl0ZVJldmVyc2UoY3R4LT5pbiwgMTYpOworCU1ENVRyYW5zZm9ybShjdHgtPmJ1ZiwgKHUzMiAqKSBjdHgtPmluKTsKKwlidWYgKz0gdDsKKwlsZW4gLT0gdDsKKyAgICB9CisgICAgLyogUHJvY2VzcyBkYXRhIGluIDY0LWJ5dGUgY2h1bmtzICovCisKKyAgICB3aGlsZSAobGVuID49IDY0KSB7CisJb3NfbWVtY3B5KGN0eC0+aW4sIGJ1ZiwgNjQpOworCWJ5dGVSZXZlcnNlKGN0eC0+aW4sIDE2KTsKKwlNRDVUcmFuc2Zvcm0oY3R4LT5idWYsICh1MzIgKikgY3R4LT5pbik7CisJYnVmICs9IDY0OworCWxlbiAtPSA2NDsKKyAgICB9CisKKyAgICAvKiBIYW5kbGUgYW55IHJlbWFpbmluZyBieXRlcyBvZiBkYXRhLiAqLworCisgICAgb3NfbWVtY3B5KGN0eC0+aW4sIGJ1ZiwgbGVuKTsKK30KKworLyoKKyAqIEZpbmFsIHdyYXB1cCAtIHBhZCB0byA2NC1ieXRlIGJvdW5kYXJ5IHdpdGggdGhlIGJpdCBwYXR0ZXJuCisgKiAxIDAqICg2NC1iaXQgY291bnQgb2YgYml0cyBwcm9jZXNzZWQsIE1TQi1maXJzdCkKKyAqLwordm9pZCBNRDVGaW5hbCh1bnNpZ25lZCBjaGFyIGRpZ2VzdFsxNl0sIHN0cnVjdCBNRDVDb250ZXh0ICpjdHgpCit7CisgICAgdW5zaWduZWQgY291bnQ7CisgICAgdW5zaWduZWQgY2hhciAqcDsKKworICAgIC8qIENvbXB1dGUgbnVtYmVyIG9mIGJ5dGVzIG1vZCA2NCAqLworICAgIGNvdW50ID0gKGN0eC0+Yml0c1swXSA+PiAzKSAmIDB4M0Y7CisKKyAgICAvKiBTZXQgdGhlIGZpcnN0IGNoYXIgb2YgcGFkZGluZyB0byAweDgwLiAgVGhpcyBpcyBzYWZlIHNpbmNlIHRoZXJlIGlzCisgICAgICAgYWx3YXlzIGF0IGxlYXN0IG9uZSBieXRlIGZyZWUgKi8KKyAgICBwID0gY3R4LT5pbiArIGNvdW50OworICAgICpwKysgPSAweDgwOworCisgICAgLyogQnl0ZXMgb2YgcGFkZGluZyBuZWVkZWQgdG8gbWFrZSA2NCBieXRlcyAqLworICAgIGNvdW50ID0gNjQgLSAxIC0gY291bnQ7CisKKyAgICAvKiBQYWQgb3V0IHRvIDU2IG1vZCA2NCAqLworICAgIGlmIChjb3VudCA8IDgpIHsKKwkvKiBUd28gbG90cyBvZiBwYWRkaW5nOiAgUGFkIHRoZSBmaXJzdCBibG9jayB0byA2NCBieXRlcyAqLworCW9zX21lbXNldChwLCAwLCBjb3VudCk7CisJYnl0ZVJldmVyc2UoY3R4LT5pbiwgMTYpOworCU1ENVRyYW5zZm9ybShjdHgtPmJ1ZiwgKHUzMiAqKSBjdHgtPmluKTsKKworCS8qIE5vdyBmaWxsIHRoZSBuZXh0IGJsb2NrIHdpdGggNTYgYnl0ZXMgKi8KKwlvc19tZW1zZXQoY3R4LT5pbiwgMCwgNTYpOworICAgIH0gZWxzZSB7CisJLyogUGFkIGJsb2NrIHRvIDU2IGJ5dGVzICovCisJb3NfbWVtc2V0KHAsIDAsIGNvdW50IC0gOCk7CisgICAgfQorICAgIGJ5dGVSZXZlcnNlKGN0eC0+aW4sIDE0KTsKKworICAgIC8qIEFwcGVuZCBsZW5ndGggaW4gYml0cyBhbmQgdHJhbnNmb3JtICovCisgICAgKCh1MzIgKikgY3R4LT5pbilbMTRdID0gY3R4LT5iaXRzWzBdOworICAgICgodTMyICopIGN0eC0+aW4pWzE1XSA9IGN0eC0+Yml0c1sxXTsKKworICAgIE1ENVRyYW5zZm9ybShjdHgtPmJ1ZiwgKHUzMiAqKSBjdHgtPmluKTsKKyAgICBieXRlUmV2ZXJzZSgodW5zaWduZWQgY2hhciAqKSBjdHgtPmJ1ZiwgNCk7CisgICAgb3NfbWVtY3B5KGRpZ2VzdCwgY3R4LT5idWYsIDE2KTsKKyAgICBvc19tZW1zZXQoY3R4LCAwLCBzaXplb2YoKmN0eCkpOwkvKiBJbiBjYXNlIGl0J3Mgc2Vuc2l0aXZlICovCit9CisKKy8qIFRoZSBmb3VyIGNvcmUgZnVuY3Rpb25zIC0gRjEgaXMgb3B0aW1pemVkIHNvbWV3aGF0ICovCisKKy8qICNkZWZpbmUgRjEoeCwgeSwgeikgKHggJiB5IHwgfnggJiB6KSAqLworI2RlZmluZSBGMSh4LCB5LCB6KSAoeiBeICh4ICYgKHkgXiB6KSkpCisjZGVmaW5lIEYyKHgsIHksIHopIEYxKHosIHgsIHkpCisjZGVmaW5lIEYzKHgsIHksIHopICh4IF4geSBeIHopCisjZGVmaW5lIEY0KHgsIHksIHopICh5IF4gKHggfCB+eikpCisKKy8qIFRoaXMgaXMgdGhlIGNlbnRyYWwgc3RlcCBpbiB0aGUgTUQ1IGFsZ29yaXRobS4gKi8KKyNkZWZpbmUgTUQ1U1RFUChmLCB3LCB4LCB5LCB6LCBkYXRhLCBzKSBcCisJKCB3ICs9IGYoeCwgeSwgeikgKyBkYXRhLCAgdyA9IHc8PHMgfCB3Pj4oMzItcyksICB3ICs9IHggKQorCisvKgorICogVGhlIGNvcmUgb2YgdGhlIE1ENSBhbGdvcml0aG0sIHRoaXMgYWx0ZXJzIGFuIGV4aXN0aW5nIE1ENSBoYXNoIHRvCisgKiByZWZsZWN0IHRoZSBhZGRpdGlvbiBvZiAxNiBsb25nd29yZHMgb2YgbmV3IGRhdGEuICBNRDVVcGRhdGUgYmxvY2tzCisgKiB0aGUgZGF0YSBhbmQgY29udmVydHMgYnl0ZXMgaW50byBsb25nd29yZHMgZm9yIHRoaXMgcm91dGluZS4KKyAqLworc3RhdGljIHZvaWQgTUQ1VHJhbnNmb3JtKHUzMiBidWZbNF0sIHUzMiBjb25zdCBpblsxNl0pCit7CisgICAgcmVnaXN0ZXIgdTMyIGEsIGIsIGMsIGQ7CisKKyAgICBhID0gYnVmWzBdOworICAgIGIgPSBidWZbMV07CisgICAgYyA9IGJ1ZlsyXTsKKyAgICBkID0gYnVmWzNdOworCisgICAgTUQ1U1RFUChGMSwgYSwgYiwgYywgZCwgaW5bMF0gKyAweGQ3NmFhNDc4LCA3KTsKKyAgICBNRDVTVEVQKEYxLCBkLCBhLCBiLCBjLCBpblsxXSArIDB4ZThjN2I3NTYsIDEyKTsKKyAgICBNRDVTVEVQKEYxLCBjLCBkLCBhLCBiLCBpblsyXSArIDB4MjQyMDcwZGIsIDE3KTsKKyAgICBNRDVTVEVQKEYxLCBiLCBjLCBkLCBhLCBpblszXSArIDB4YzFiZGNlZWUsIDIyKTsKKyAgICBNRDVTVEVQKEYxLCBhLCBiLCBjLCBkLCBpbls0XSArIDB4ZjU3YzBmYWYsIDcpOworICAgIE1ENVNURVAoRjEsIGQsIGEsIGIsIGMsIGluWzVdICsgMHg0Nzg3YzYyYSwgMTIpOworICAgIE1ENVNURVAoRjEsIGMsIGQsIGEsIGIsIGluWzZdICsgMHhhODMwNDYxMywgMTcpOworICAgIE1ENVNURVAoRjEsIGIsIGMsIGQsIGEsIGluWzddICsgMHhmZDQ2OTUwMSwgMjIpOworICAgIE1ENVNURVAoRjEsIGEsIGIsIGMsIGQsIGluWzhdICsgMHg2OTgwOThkOCwgNyk7CisgICAgTUQ1U1RFUChGMSwgZCwgYSwgYiwgYywgaW5bOV0gKyAweDhiNDRmN2FmLCAxMik7CisgICAgTUQ1U1RFUChGMSwgYywgZCwgYSwgYiwgaW5bMTBdICsgMHhmZmZmNWJiMSwgMTcpOworICAgIE1ENVNURVAoRjEsIGIsIGMsIGQsIGEsIGluWzExXSArIDB4ODk1Y2Q3YmUsIDIyKTsKKyAgICBNRDVTVEVQKEYxLCBhLCBiLCBjLCBkLCBpblsxMl0gKyAweDZiOTAxMTIyLCA3KTsKKyAgICBNRDVTVEVQKEYxLCBkLCBhLCBiLCBjLCBpblsxM10gKyAweGZkOTg3MTkzLCAxMik7CisgICAgTUQ1U1RFUChGMSwgYywgZCwgYSwgYiwgaW5bMTRdICsgMHhhNjc5NDM4ZSwgMTcpOworICAgIE1ENVNURVAoRjEsIGIsIGMsIGQsIGEsIGluWzE1XSArIDB4NDliNDA4MjEsIDIyKTsKKworICAgIE1ENVNURVAoRjIsIGEsIGIsIGMsIGQsIGluWzFdICsgMHhmNjFlMjU2MiwgNSk7CisgICAgTUQ1U1RFUChGMiwgZCwgYSwgYiwgYywgaW5bNl0gKyAweGMwNDBiMzQwLCA5KTsKKyAgICBNRDVTVEVQKEYyLCBjLCBkLCBhLCBiLCBpblsxMV0gKyAweDI2NWU1YTUxLCAxNCk7CisgICAgTUQ1U1RFUChGMiwgYiwgYywgZCwgYSwgaW5bMF0gKyAweGU5YjZjN2FhLCAyMCk7CisgICAgTUQ1U1RFUChGMiwgYSwgYiwgYywgZCwgaW5bNV0gKyAweGQ2MmYxMDVkLCA1KTsKKyAgICBNRDVTVEVQKEYyLCBkLCBhLCBiLCBjLCBpblsxMF0gKyAweDAyNDQxNDUzLCA5KTsKKyAgICBNRDVTVEVQKEYyLCBjLCBkLCBhLCBiLCBpblsxNV0gKyAweGQ4YTFlNjgxLCAxNCk7CisgICAgTUQ1U1RFUChGMiwgYiwgYywgZCwgYSwgaW5bNF0gKyAweGU3ZDNmYmM4LCAyMCk7CisgICAgTUQ1U1RFUChGMiwgYSwgYiwgYywgZCwgaW5bOV0gKyAweDIxZTFjZGU2LCA1KTsKKyAgICBNRDVTVEVQKEYyLCBkLCBhLCBiLCBjLCBpblsxNF0gKyAweGMzMzcwN2Q2LCA5KTsKKyAgICBNRDVTVEVQKEYyLCBjLCBkLCBhLCBiLCBpblszXSArIDB4ZjRkNTBkODcsIDE0KTsKKyAgICBNRDVTVEVQKEYyLCBiLCBjLCBkLCBhLCBpbls4XSArIDB4NDU1YTE0ZWQsIDIwKTsKKyAgICBNRDVTVEVQKEYyLCBhLCBiLCBjLCBkLCBpblsxM10gKyAweGE5ZTNlOTA1LCA1KTsKKyAgICBNRDVTVEVQKEYyLCBkLCBhLCBiLCBjLCBpblsyXSArIDB4ZmNlZmEzZjgsIDkpOworICAgIE1ENVNURVAoRjIsIGMsIGQsIGEsIGIsIGluWzddICsgMHg2NzZmMDJkOSwgMTQpOworICAgIE1ENVNURVAoRjIsIGIsIGMsIGQsIGEsIGluWzEyXSArIDB4OGQyYTRjOGEsIDIwKTsKKworICAgIE1ENVNURVAoRjMsIGEsIGIsIGMsIGQsIGluWzVdICsgMHhmZmZhMzk0MiwgNCk7CisgICAgTUQ1U1RFUChGMywgZCwgYSwgYiwgYywgaW5bOF0gKyAweDg3NzFmNjgxLCAxMSk7CisgICAgTUQ1U1RFUChGMywgYywgZCwgYSwgYiwgaW5bMTFdICsgMHg2ZDlkNjEyMiwgMTYpOworICAgIE1ENVNURVAoRjMsIGIsIGMsIGQsIGEsIGluWzE0XSArIDB4ZmRlNTM4MGMsIDIzKTsKKyAgICBNRDVTVEVQKEYzLCBhLCBiLCBjLCBkLCBpblsxXSArIDB4YTRiZWVhNDQsIDQpOworICAgIE1ENVNURVAoRjMsIGQsIGEsIGIsIGMsIGluWzRdICsgMHg0YmRlY2ZhOSwgMTEpOworICAgIE1ENVNURVAoRjMsIGMsIGQsIGEsIGIsIGluWzddICsgMHhmNmJiNGI2MCwgMTYpOworICAgIE1ENVNURVAoRjMsIGIsIGMsIGQsIGEsIGluWzEwXSArIDB4YmViZmJjNzAsIDIzKTsKKyAgICBNRDVTVEVQKEYzLCBhLCBiLCBjLCBkLCBpblsxM10gKyAweDI4OWI3ZWM2LCA0KTsKKyAgICBNRDVTVEVQKEYzLCBkLCBhLCBiLCBjLCBpblswXSArIDB4ZWFhMTI3ZmEsIDExKTsKKyAgICBNRDVTVEVQKEYzLCBjLCBkLCBhLCBiLCBpblszXSArIDB4ZDRlZjMwODUsIDE2KTsKKyAgICBNRDVTVEVQKEYzLCBiLCBjLCBkLCBhLCBpbls2XSArIDB4MDQ4ODFkMDUsIDIzKTsKKyAgICBNRDVTVEVQKEYzLCBhLCBiLCBjLCBkLCBpbls5XSArIDB4ZDlkNGQwMzksIDQpOworICAgIE1ENVNURVAoRjMsIGQsIGEsIGIsIGMsIGluWzEyXSArIDB4ZTZkYjk5ZTUsIDExKTsKKyAgICBNRDVTVEVQKEYzLCBjLCBkLCBhLCBiLCBpblsxNV0gKyAweDFmYTI3Y2Y4LCAxNik7CisgICAgTUQ1U1RFUChGMywgYiwgYywgZCwgYSwgaW5bMl0gKyAweGM0YWM1NjY1LCAyMyk7CisKKyAgICBNRDVTVEVQKEY0LCBhLCBiLCBjLCBkLCBpblswXSArIDB4ZjQyOTIyNDQsIDYpOworICAgIE1ENVNURVAoRjQsIGQsIGEsIGIsIGMsIGluWzddICsgMHg0MzJhZmY5NywgMTApOworICAgIE1ENVNURVAoRjQsIGMsIGQsIGEsIGIsIGluWzE0XSArIDB4YWI5NDIzYTcsIDE1KTsKKyAgICBNRDVTVEVQKEY0LCBiLCBjLCBkLCBhLCBpbls1XSArIDB4ZmM5M2EwMzksIDIxKTsKKyAgICBNRDVTVEVQKEY0LCBhLCBiLCBjLCBkLCBpblsxMl0gKyAweDY1NWI1OWMzLCA2KTsKKyAgICBNRDVTVEVQKEY0LCBkLCBhLCBiLCBjLCBpblszXSArIDB4OGYwY2NjOTIsIDEwKTsKKyAgICBNRDVTVEVQKEY0LCBjLCBkLCBhLCBiLCBpblsxMF0gKyAweGZmZWZmNDdkLCAxNSk7CisgICAgTUQ1U1RFUChGNCwgYiwgYywgZCwgYSwgaW5bMV0gKyAweDg1ODQ1ZGQxLCAyMSk7CisgICAgTUQ1U1RFUChGNCwgYSwgYiwgYywgZCwgaW5bOF0gKyAweDZmYTg3ZTRmLCA2KTsKKyAgICBNRDVTVEVQKEY0LCBkLCBhLCBiLCBjLCBpblsxNV0gKyAweGZlMmNlNmUwLCAxMCk7CisgICAgTUQ1U1RFUChGNCwgYywgZCwgYSwgYiwgaW5bNl0gKyAweGEzMDE0MzE0LCAxNSk7CisgICAgTUQ1U1RFUChGNCwgYiwgYywgZCwgYSwgaW5bMTNdICsgMHg0ZTA4MTFhMSwgMjEpOworICAgIE1ENVNURVAoRjQsIGEsIGIsIGMsIGQsIGluWzRdICsgMHhmNzUzN2U4MiwgNik7CisgICAgTUQ1U1RFUChGNCwgZCwgYSwgYiwgYywgaW5bMTFdICsgMHhiZDNhZjIzNSwgMTApOworICAgIE1ENVNURVAoRjQsIGMsIGQsIGEsIGIsIGluWzJdICsgMHgyYWQ3ZDJiYiwgMTUpOworICAgIE1ENVNURVAoRjQsIGIsIGMsIGQsIGEsIGluWzldICsgMHhlYjg2ZDM5MSwgMjEpOworCisgICAgYnVmWzBdICs9IGE7CisgICAgYnVmWzFdICs9IGI7CisgICAgYnVmWzJdICs9IGM7CisgICAgYnVmWzNdICs9IGQ7Cit9CisvKiA9PT09PSBlbmQgLSBwdWJsaWMgZG9tYWluIE1ENSBpbXBsZW1lbnRhdGlvbiA9PT09PSAqLworCisjZW5kaWYgLyogSU5URVJOQUxfTUQ1ICovCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2FwcF9yYWRndy9tZDUuaCBiL2V4dGVuc2lvbnMvYXBwX3JhZGd3L21kNS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjYmZkYzMKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2FwcF9yYWRndy9tZDUuaApAQCAtMCwwICsxLDQ2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogZnJlZURpYW1ldGVyIGF1dGhvciBub3RlOgorICogIFRoZSBjb250ZW50IGZyb20gdGhpcyBmaWxlIGNvbWVzIGRpcmVjdGx5IGZyb20gdGhlIGhvc3RhcCBwcm9qZWN0LgorICogSXQgaXMgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEJTRCBsaWNlbnNlLCBhcyBhbGxvd2VkCisgKiBieSB0aGUgb3JpZ2luYWwgY29weXJpZ2h0IHJlcHJvZHVjZWQgYmVsb3cuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIE1ENSBoYXNoIGltcGxlbWVudGF0aW9uIGFuZCBpbnRlcmZhY2UgZnVuY3Rpb25zCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNSwgSm91bmkgTWFsaW5lbiA8akB3MS5maT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBCU0QKKyAqIGxpY2Vuc2UuCisgKgorICogU2VlIFJFQURNRSBhbmQgQ09QWUlORyBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgTUQ1X0gKKyNkZWZpbmUgTUQ1X0gKKworI2RlZmluZSBNRDVfTUFDX0xFTiAxNgorCit2b2lkIGhtYWNfbWQ1X3ZlY3Rvcihjb25zdCB1OCAqa2V5LCBzaXplX3Qga2V5X2xlbiwgc2l6ZV90IG51bV9lbGVtLAorCQkgICAgIGNvbnN0IHU4ICphZGRyW10sIGNvbnN0IHNpemVfdCAqbGVuLCB1OCAqbWFjKTsKK3ZvaWQgaG1hY19tZDUoY29uc3QgdTggKmtleSwgc2l6ZV90IGtleV9sZW4sIGNvbnN0IHU4ICpkYXRhLCBzaXplX3QgZGF0YV9sZW4sCisJICAgICAgdTggKm1hYyk7CisKKyNpZmRlZiBDT05GSUdfQ1JZUFRPX0lOVEVSTkFMCitzdHJ1Y3QgTUQ1Q29udGV4dDsKKwordm9pZCBNRDVJbml0KHN0cnVjdCBNRDVDb250ZXh0ICpjb250ZXh0KTsKK3ZvaWQgTUQ1VXBkYXRlKHN0cnVjdCBNRDVDb250ZXh0ICpjb250ZXh0LCB1bnNpZ25lZCBjaGFyIGNvbnN0ICpidWYsCisJICAgICAgIHVuc2lnbmVkIGxlbik7Cit2b2lkIE1ENUZpbmFsKHVuc2lnbmVkIGNoYXIgZGlnZXN0WzE2XSwgc3RydWN0IE1ENUNvbnRleHQgKmNvbnRleHQpOworI2VuZGlmIC8qIENPTkZJR19DUllQVE9fSU5URVJOQUwgKi8KKworIC8qIEZvcndhcmQgZGVjbGFyYXRpb246ICovCit2b2lkIG1kNV92ZWN0b3Ioc2l6ZV90IG51bV9lbGVtLCBjb25zdCB1OCAqYWRkcltdLCBjb25zdCBzaXplX3QgKmxlbiwgdTggKm1hYyk7CisKKyNlbmRpZiAvKiBNRDVfSCAqLwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9hcHBfcmFkZ3cvcmFkaXVzLmMgYi9leHRlbnNpb25zL2FwcF9yYWRndy9yYWRpdXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDc1NWViCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9hcHBfcmFkZ3cvcmFkaXVzLmMKQEAgLTAsMCArMSwxMzczIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxMywgV0lERSBQcm9qZWN0IGFuZCBOSUNUCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBXSURFIFByb2plY3Qgb3IgTklDVCBub3IgdGhlIAkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFdJREUgUHJvamVjdCBhbmQgCQkJCQkJICoKKyogICBOSUNULgkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGZyZWVEaWFtZXRlciBhdXRob3Igbm90ZToKKyAqICBUaGUgY29udGVudCBmcm9tIHRoaXMgZmlsZSBjb21lcyBmb3IgdGhlIG1haW4gcGFydCBmcm9tIHRoZSBob3N0YXAgcHJvamVjdC4KKyAqIEl0IGlzIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBCU0QgbGljZW5zZSwgYXMgYWxsb3dlZAorICogYnkgdGhlIG9yaWdpbmFsIGNvcHlyaWdodCByZXByb2R1Y2VkIGJlbG93LgorICogVGhlIG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIGFyZSBwbGFjZWQgdW5kZXIgdGhlIGNvcHlyaWdodCBvZiB0aGUgZnJlZURpYW1ldGVyIHByb2plY3QuCisgKi8KKworLyoKKyAqIGhvc3RhcGQgLyBSQURJVVMgbWVzc2FnZSBwcm9jZXNzaW5nCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwOCwgSm91bmkgTWFsaW5lbiA8akB3MS5maT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBCU0QKKyAqIGxpY2Vuc2UuCisgKgorICogU2VlIFJFQURNRSBhbmQgQ09QWUlORyBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAicmd3LmgiCisKK3N0YXRpYyBzdHJ1Y3QgcmFkaXVzX2F0dHJfaGRyICoKK3JhZGl1c19nZXRfYXR0cl9oZHIoc3RydWN0IHJhZGl1c19tc2cgKm1zZywgaW50IGlkeCkKK3sKKwlyZXR1cm4gKHN0cnVjdCByYWRpdXNfYXR0cl9oZHIgKikgKG1zZy0+YnVmICsgbXNnLT5hdHRyX3Bvc1tpZHhdKTsKK30KKworCitzdHJ1Y3QgcmFkaXVzX21zZyAqcmFkaXVzX21zZ19uZXcodTggY29kZSwgdTggaWRlbnRpZmllcikKK3sKKwlzdHJ1Y3QgcmFkaXVzX21zZyAqbXNnOworCisJbXNnID0gb3NfbWFsbG9jKHNpemVvZigqbXNnKSk7CisJaWYgKG1zZyA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChyYWRpdXNfbXNnX2luaXRpYWxpemUobXNnLCBSQURJVVNfREVGQVVMVF9NU0dfU0laRSkpIHsKKwkJb3NfZnJlZShtc2cpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyYWRpdXNfbXNnX3NldF9oZHIobXNnLCBjb2RlLCBpZGVudGlmaWVyKTsKKworCXJldHVybiBtc2c7Cit9CisKKworaW50IHJhZGl1c19tc2dfaW5pdGlhbGl6ZShzdHJ1Y3QgcmFkaXVzX21zZyAqbXNnLCBzaXplX3QgaW5pdF9sZW4pCit7CisJaWYgKG1zZyA9PSBOVUxMIHx8IGluaXRfbGVuIDwgc2l6ZW9mKHN0cnVjdCByYWRpdXNfaGRyKSkKKwkJcmV0dXJuIC0xOworCisJb3NfbWVtc2V0KG1zZywgMCwgc2l6ZW9mKCptc2cpKTsKKwltc2ctPmJ1ZiA9IG9zX3phbGxvYyhpbml0X2xlbik7CisJaWYgKG1zZy0+YnVmID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCW1zZy0+YnVmX3NpemUgPSBpbml0X2xlbjsKKwltc2ctPmhkciA9IChzdHJ1Y3QgcmFkaXVzX2hkciAqKSBtc2ctPmJ1ZjsKKwltc2ctPmJ1Zl91c2VkID0gc2l6ZW9mKCptc2ctPmhkcik7CisKKwltc2ctPmF0dHJfcG9zID0KKwkJb3NfemFsbG9jKFJBRElVU19ERUZBVUxUX0FUVFJfQ09VTlQgKiBzaXplb2YoKm1zZy0+YXR0cl9wb3MpKTsKKwlpZiAobXNnLT5hdHRyX3BvcyA9PSBOVUxMKSB7CisJCW9zX2ZyZWUobXNnLT5idWYpOworCQltc2ctPmJ1ZiA9IE5VTEw7CisJCW1zZy0+aGRyID0gTlVMTDsKKwkJcmV0dXJuIC0xOworCX0KKworCW1zZy0+YXR0cl9zaXplID0gUkFESVVTX0RFRkFVTFRfQVRUUl9DT1VOVDsKKwltc2ctPmF0dHJfdXNlZCA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworCit2b2lkIHJhZGl1c19tc2dfc2V0X2hkcihzdHJ1Y3QgcmFkaXVzX21zZyAqbXNnLCB1OCBjb2RlLCB1OCBpZGVudGlmaWVyKQoreworCW1zZy0+aGRyLT5jb2RlID0gY29kZTsKKwltc2ctPmhkci0+aWRlbnRpZmllciA9IGlkZW50aWZpZXI7Cit9CisKKwordm9pZCByYWRpdXNfbXNnX2ZyZWUoc3RydWN0IHJhZGl1c19tc2cgKm1zZykKK3sKKwlvc19mcmVlKG1zZy0+YnVmKTsKKwltc2ctPmJ1ZiA9IE5VTEw7CisJbXNnLT5oZHIgPSBOVUxMOworCW1zZy0+YnVmX3NpemUgPSBtc2ctPmJ1Zl91c2VkID0gMDsKKworCW9zX2ZyZWUobXNnLT5hdHRyX3Bvcyk7CisJbXNnLT5hdHRyX3BvcyA9IE5VTEw7CisJbXNnLT5hdHRyX3NpemUgPSBtc2ctPmF0dHJfdXNlZCA9IDA7Cit9CisKKy8qIERlc3Ryb3kgYSBtZXNzYWdlICovCit2b2lkIHJnd19tc2dfZnJlZShzdHJ1Y3Qgcmd3X3JhZGl1c19tc2dfbWV0YSAqKiBtc2cpCit7CisJaWYgKCFtc2cgfHwgISptc2cpCisJCXJldHVybjsKKwkKKwlyYWRpdXNfbXNnX2ZyZWUoJigqbXNnKS0+cmFkaXVzKTsKKwlmcmVlKCptc2cpOworCSptc2cgPSBOVUxMOworfQorCisKKworc3RydWN0IHJhZGl1c19hdHRyX3R5cGUgeworCXU4IHR5cGU7CisJY2hhciAqbmFtZTsKKwllbnVtIHsKKwkJUkFESVVTX0FUVFJfVU5ESVNULCBSQURJVVNfQVRUUl9URVhULCBSQURJVVNfQVRUUl9JUCwKKwkJUkFESVVTX0FUVFJfSEVYRFVNUCwgUkFESVVTX0FUVFJfSU5UMzIsIFJBRElVU19BVFRSX0lQVjYKKwl9IGRhdGFfdHlwZTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmFkaXVzX2F0dHJfdHlwZSByYWRpdXNfYXR0cnNbXSA9Cit7CisJeyBSQURJVVNfQVRUUl9VU0VSX05BTUUsICJVc2VyLU5hbWUiLCBSQURJVVNfQVRUUl9URVhUIH0sCisJeyBSQURJVVNfQVRUUl9VU0VSX1BBU1NXT1JELCAiVXNlci1QYXNzd29yZCIsIFJBRElVU19BVFRSX1VORElTVCB9LAorCXsgUkFESVVTX0FUVFJfTkFTX0lQX0FERFJFU1MsICJOQVMtSVAtQWRkcmVzcyIsIFJBRElVU19BVFRSX0lQIH0sCisJeyBSQURJVVNfQVRUUl9OQVNfUE9SVCwgIk5BUy1Qb3J0IiwgUkFESVVTX0FUVFJfSU5UMzIgfSwKKwl7IFJBRElVU19BVFRSX0ZSQU1FRF9NVFUsICJGcmFtZWQtTVRVIiwgUkFESVVTX0FUVFJfSU5UMzIgfSwKKwl7IFJBRElVU19BVFRSX1JFUExZX01FU1NBR0UsICJSZXBseS1NZXNzYWdlIiwgUkFESVVTX0FUVFJfVEVYVCB9LAorCXsgUkFESVVTX0FUVFJfU1RBVEUsICJTdGF0ZSIsIFJBRElVU19BVFRSX1VORElTVCB9LAorCXsgUkFESVVTX0FUVFJfQ0xBU1MsICJDbGFzcyIsIFJBRElVU19BVFRSX1VORElTVCB9LAorCXsgUkFESVVTX0FUVFJfVkVORE9SX1NQRUNJRklDLCAiVmVuZG9yLVNwZWNpZmljIiwgUkFESVVTX0FUVFJfVU5ESVNUIH0sCisJeyBSQURJVVNfQVRUUl9TRVNTSU9OX1RJTUVPVVQsICJTZXNzaW9uLVRpbWVvdXQiLCBSQURJVVNfQVRUUl9JTlQzMiB9LAorCXsgUkFESVVTX0FUVFJfSURMRV9USU1FT1VULCAiSWRsZS1UaW1lb3V0IiwgUkFESVVTX0FUVFJfSU5UMzIgfSwKKwl7IFJBRElVU19BVFRSX1RFUk1JTkFUSU9OX0FDVElPTiwgIlRlcm1pbmF0aW9uLUFjdGlvbiIsCisJICBSQURJVVNfQVRUUl9JTlQzMiB9LAorCXsgUkFESVVTX0FUVFJfQ0FMTEVEX1NUQVRJT05fSUQsICJDYWxsZWQtU3RhdGlvbi1JZCIsCisJICBSQURJVVNfQVRUUl9URVhUIH0sCisJeyBSQURJVVNfQVRUUl9DQUxMSU5HX1NUQVRJT05fSUQsICJDYWxsaW5nLVN0YXRpb24tSWQiLAorCSAgUkFESVVTX0FUVFJfVEVYVCB9LAorCXsgUkFESVVTX0FUVFJfTkFTX0lERU5USUZJRVIsICJOQVMtSWRlbnRpZmllciIsIFJBRElVU19BVFRSX1RFWFQgfSwKKwl7IFJBRElVU19BVFRSX1BST1hZX1NUQVRFLCAiUHJveHktU3RhdGUiLCBSQURJVVNfQVRUUl9VTkRJU1QgfSwKKwl7IFJBRElVU19BVFRSX0FDQ1RfU1RBVFVTX1RZUEUsICJBY2N0LVN0YXR1cy1UeXBlIiwKKwkgIFJBRElVU19BVFRSX0lOVDMyIH0sCisJeyBSQURJVVNfQVRUUl9BQ0NUX0RFTEFZX1RJTUUsICJBY2N0LURlbGF5LVRpbWUiLCBSQURJVVNfQVRUUl9JTlQzMiB9LAorCXsgUkFESVVTX0FUVFJfQUNDVF9JTlBVVF9PQ1RFVFMsICJBY2N0LUlucHV0LU9jdGV0cyIsCisJICBSQURJVVNfQVRUUl9JTlQzMiB9LAorCXsgUkFESVVTX0FUVFJfQUNDVF9PVVRQVVRfT0NURVRTLCAiQWNjdC1PdXRwdXQtT2N0ZXRzIiwKKwkgIFJBRElVU19BVFRSX0lOVDMyIH0sCisJeyBSQURJVVNfQVRUUl9BQ0NUX1NFU1NJT05fSUQsICJBY2N0LVNlc3Npb24tSWQiLCBSQURJVVNfQVRUUl9URVhUIH0sCisJeyBSQURJVVNfQVRUUl9BQ0NUX0FVVEhFTlRJQywgIkFjY3QtQXV0aGVudGljIiwgUkFESVVTX0FUVFJfSU5UMzIgfSwKKwl7IFJBRElVU19BVFRSX0FDQ1RfU0VTU0lPTl9USU1FLCAiQWNjdC1TZXNzaW9uLVRpbWUiLAorCSAgUkFESVVTX0FUVFJfSU5UMzIgfSwKKwl7IFJBRElVU19BVFRSX0FDQ1RfSU5QVVRfUEFDS0VUUywgIkFjY3QtSW5wdXQtUGFja2V0cyIsCisJICBSQURJVVNfQVRUUl9JTlQzMiB9LAorCXsgUkFESVVTX0FUVFJfQUNDVF9PVVRQVVRfUEFDS0VUUywgIkFjY3QtT3V0cHV0LVBhY2tldHMiLAorCSAgUkFESVVTX0FUVFJfSU5UMzIgfSwKKwl7IFJBRElVU19BVFRSX0FDQ1RfVEVSTUlOQVRFX0NBVVNFLCAiQWNjdC1UZXJtaW5hdGUtQ2F1c2UiLAorCSAgUkFESVVTX0FUVFJfSU5UMzIgfSwKKwl7IFJBRElVU19BVFRSX0FDQ1RfTVVMVElfU0VTU0lPTl9JRCwgIkFjY3QtTXVsdGktU2Vzc2lvbi1JZCIsCisJICBSQURJVVNfQVRUUl9URVhUIH0sCisJeyBSQURJVVNfQVRUUl9BQ0NUX0xJTktfQ09VTlQsICJBY2N0LUxpbmstQ291bnQiLCBSQURJVVNfQVRUUl9JTlQzMiB9LAorCXsgUkFESVVTX0FUVFJfQUNDVF9JTlBVVF9HSUdBV09SRFMsICJBY2N0LUlucHV0LUdpZ2F3b3JkcyIsIAorCSAgUkFESVVTX0FUVFJfSU5UMzIgfSwKKwl7IFJBRElVU19BVFRSX0FDQ1RfT1VUUFVUX0dJR0FXT1JEUywgIkFjY3QtT3V0cHV0LUdpZ2F3b3JkcyIsCisJICBSQURJVVNfQVRUUl9JTlQzMiB9LAorCXsgUkFESVVTX0FUVFJfRVZFTlRfVElNRVNUQU1QLCAiRXZlbnQtVGltZXN0YW1wIiwKKwkgIFJBRElVU19BVFRSX0lOVDMyIH0sCisJeyBSQURJVVNfQVRUUl9OQVNfUE9SVF9UWVBFLCAiTkFTLVBvcnQtVHlwZSIsIFJBRElVU19BVFRSX0lOVDMyIH0sCisJeyBSQURJVVNfQVRUUl9UVU5ORUxfVFlQRSwgIlR1bm5lbC1UeXBlIiwgUkFESVVTX0FUVFJfSEVYRFVNUCB9LAorCXsgUkFESVVTX0FUVFJfVFVOTkVMX01FRElVTV9UWVBFLCAiVHVubmVsLU1lZGl1bS1UeXBlIiwKKwkgIFJBRElVU19BVFRSX0hFWERVTVAgfSwKKwl7IFJBRElVU19BVFRSX0NPTk5FQ1RfSU5GTywgIkNvbm5lY3QtSW5mbyIsIFJBRElVU19BVFRSX1RFWFQgfSwKKwl7IFJBRElVU19BVFRSX0VBUF9NRVNTQUdFLCAiRUFQLU1lc3NhZ2UiLCBSQURJVVNfQVRUUl9VTkRJU1QgfSwKKwl7IFJBRElVU19BVFRSX01FU1NBR0VfQVVUSEVOVElDQVRPUiwgIk1lc3NhZ2UtQXV0aGVudGljYXRvciIsCisJICBSQURJVVNfQVRUUl9VTkRJU1QgfSwKKwl7IFJBRElVU19BVFRSX1RVTk5FTF9QUklWQVRFX0dST1VQX0lELCAiVHVubmVsLVByaXZhdGUtR3JvdXAtSWQiLAorCSAgUkFESVVTX0FUVFJfSEVYRFVNUCB9LAorCXsgUkFESVVTX0FUVFJfQUNDVF9JTlRFUklNX0lOVEVSVkFMLCAiQWNjdC1JbnRlcmltLUludGVydmFsIiwKKwkgIFJBRElVU19BVFRSX0lOVDMyIH0sCisJeyBSQURJVVNfQVRUUl9DSEFSR0VBQkxFX1VTRVJfSURFTlRJVFksICJDaGFyZ2VhYmxlLVVzZXItSWRlbnRpdHkiLAorCSAgUkFESVVTX0FUVFJfVEVYVCB9LAorCXsgUkFESVVTX0FUVFJfTkFTX0lQVjZfQUREUkVTUywgIk5BUy1JUHY2LUFkZHJlc3MiLCBSQURJVVNfQVRUUl9JUFY2IH0sCit9OworI2RlZmluZSBSQURJVVNfQVRUUlMgKHNpemVvZihyYWRpdXNfYXR0cnMpIC8gc2l6ZW9mKHJhZGl1c19hdHRyc1swXSkpCisKKworc3RhdGljIHN0cnVjdCByYWRpdXNfYXR0cl90eXBlICpyYWRpdXNfZ2V0X2F0dHJfdHlwZSh1OCB0eXBlKQoreworCXNpemVfdCBpOworCisJZm9yIChpID0gMDsgaSA8IFJBRElVU19BVFRSUzsgaSsrKSB7CisJCWlmICh0eXBlID09IHJhZGl1c19hdHRyc1tpXS50eXBlKQorCQkJcmV0dXJuICZyYWRpdXNfYXR0cnNbaV07CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBjaGFyIHByaW50X2NoYXJfYnVmWzVdOworCitzdGF0aWMgY2hhciAqIHByaW50X2NoYXIoY2hhciBjKQoreworCWlmIChjID49IDMyICYmIGMgPCAxMjcpCisJCXNwcmludGYocHJpbnRfY2hhcl9idWYsICIlYyIsIGMpOworCWVsc2UKKwkJc3ByaW50ZihwcmludF9jaGFyX2J1ZiwgIjwlMDJ4PiIsIGMpOworCXJldHVybiBwcmludF9jaGFyX2J1ZjsKK30KKworCitzdGF0aWMgY2hhciAqIHJhZGl1c19tc2dfZHVtcF9hdHRyX3ZhbChzdHJ1Y3QgcmFkaXVzX2F0dHJfaGRyICpoZHIsIGNoYXIgKiBvdXRidWYsIHNpemVfdCBidWZsZW4pCit7CisJc3RydWN0IHJhZGl1c19hdHRyX3R5cGUgKmF0dHI7CisJaW50IGksIGxlbjsKKwl1bnNpZ25lZCBjaGFyICpwb3M7CisJdTggYXR0cnR5cGU7CisJCisJbWVtc2V0KG91dGJ1ZiwgMCwgYnVmbGVuKTsKKworCWF0dHIgPSByYWRpdXNfZ2V0X2F0dHJfdHlwZShoZHItPnR5cGUpOworCisJaWYgKGF0dHIgPT0gTlVMTCkKKwkJYXR0cnR5cGUgPSBSQURJVVNfQVRUUl9IRVhEVU1QOworCWVsc2UKKwkJYXR0cnR5cGUgPSBhdHRyLT5kYXRhX3R5cGU7CisKKwlsZW4gPSBoZHItPmxlbmd0aCAtIHNpemVvZihzdHJ1Y3QgcmFkaXVzX2F0dHJfaGRyKTsKKwlwb3MgPSAodW5zaWduZWQgY2hhciAqKSAoaGRyICsgMSk7CisKKwlzd2l0Y2ggKGF0dHJ0eXBlKSB7CisJY2FzZSBSQURJVVNfQVRUUl9URVhUOgorCQlzbnByaW50ZihvdXRidWYgKyBzdHJsZW4ob3V0YnVmKSwgYnVmbGVuIC0gc3RybGVuKG91dGJ1ZiksICIgICAgICBWYWx1ZTogJyIpOworCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCQlzbnByaW50ZihvdXRidWYgKyBzdHJsZW4ob3V0YnVmKSwgYnVmbGVuIC0gc3RybGVuKG91dGJ1ZiksICIlcyIsIHByaW50X2NoYXIocG9zW2ldKSk7CisJCXNucHJpbnRmKG91dGJ1ZiArIHN0cmxlbihvdXRidWYpLCBidWZsZW4gLSBzdHJsZW4ob3V0YnVmKSwgIiciKTsKKwkJYnJlYWs7CisKKwljYXNlIFJBRElVU19BVFRSX0lQOgorCQlpZiAobGVuID09IDQpIHsKKwkJCXN0cnVjdCBpbl9hZGRyIGFkZHI7CisJCQlvc19tZW1jcHkoJmFkZHIsIHBvcywgNCk7CisJCQlzbnByaW50ZihvdXRidWYgKyBzdHJsZW4ob3V0YnVmKSwgYnVmbGVuIC0gc3RybGVuKG91dGJ1ZiksICIgICAgICBWYWx1ZTogJXMiLCBpbmV0X250b2EoYWRkcikpOworCQl9IGVsc2UKKwkJCXNucHJpbnRmKG91dGJ1ZiArIHN0cmxlbihvdXRidWYpLCBidWZsZW4gLSBzdHJsZW4ob3V0YnVmKSwgIiAgICAgIEludmFsaWQgSVAgYWRkcmVzcyBsZW5ndGggJWQiLCBsZW4pOworCQlicmVhazsKKworCWNhc2UgUkFESVVTX0FUVFJfSVBWNjoKKwkJaWYgKGxlbiA9PSAxNikgeworCQkJY2hhciBidWZbMTI4XTsKKwkJCWNvbnN0IGNoYXIgKmF0eHQ7CisJCQlzdHJ1Y3QgaW42X2FkZHIgKmFkZHIgPSAoc3RydWN0IGluNl9hZGRyICopIHBvczsKKwkJCWF0eHQgPSBpbmV0X250b3AoQUZfSU5FVDYsIGFkZHIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCQkJc25wcmludGYob3V0YnVmICsgc3RybGVuKG91dGJ1ZiksIGJ1ZmxlbiAtIHN0cmxlbihvdXRidWYpLCAiICAgICAgVmFsdWU6ICVzIiwgYXR4dCA/IGF0eHQgOiAiPyIpOworCQl9IGVsc2UKKwkJCXNucHJpbnRmKG91dGJ1ZiArIHN0cmxlbihvdXRidWYpLCBidWZsZW4gLSBzdHJsZW4ob3V0YnVmKSwgIiAgICAgIEludmFsaWQgSVB2NiBhZGRyZXNzIGxlbmd0aCAlZCIsIGxlbik7CisJCWJyZWFrOworCisJY2FzZSBSQURJVVNfQVRUUl9JTlQzMjoKKwkJaWYgKGxlbiA9PSA0KQorCQkJc25wcmludGYob3V0YnVmICsgc3RybGVuKG91dGJ1ZiksIGJ1ZmxlbiAtIHN0cmxlbihvdXRidWYpLCAiICAgICAgVmFsdWU6ICV1IiwgV1BBX0dFVF9CRTMyKHBvcykpOworCQllbHNlCisJCQlzbnByaW50ZihvdXRidWYgKyBzdHJsZW4ob3V0YnVmKSwgYnVmbGVuIC0gc3RybGVuKG91dGJ1ZiksICIgICAgICBJbnZhbGlkIElOVDMyIGxlbmd0aCAlZCIsIGxlbik7CisJCWJyZWFrOworCisJY2FzZSBSQURJVVNfQVRUUl9IRVhEVU1QOgorCWNhc2UgUkFESVVTX0FUVFJfVU5ESVNUOgorCWRlZmF1bHQ6CisJCXNucHJpbnRmKG91dGJ1ZiArIHN0cmxlbihvdXRidWYpLCBidWZsZW4gLSBzdHJsZW4ob3V0YnVmKSwgIiAgICAgIFZhbHVlOiIpOworCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCQlzbnByaW50ZihvdXRidWYgKyBzdHJsZW4ob3V0YnVmKSwgYnVmbGVuIC0gc3RybGVuKG91dGJ1ZiksICIgJTAyeCIsIHBvc1tpXSk7CisJCWJyZWFrOworCX0KKwkKKwlyZXR1cm4gb3V0YnVmOworfQorCisvKiBEdW1wIGEgbWVzc2FnZSAgKi8KK3ZvaWQgcmd3X21zZ19kdW1wKHN0cnVjdCByZ3dfcmFkaXVzX21zZ19tZXRhICogbXNnLCBpbnQgaGFzX21ldGEpCit7CisJdW5zaWduZWQgY2hhciAqYXV0aDsKKwljaGFyIGJ1ZlsyNTZdOworCXNpemVfdCBpOworCWlmICghIFRSQUNFX0JPT0woRlVMTCkgKQorCQlyZXR1cm47CisJCisJYXV0aCA9ICAmKG1zZy0+cmFkaXVzLmhkci0+YXV0aGVudGljYXRvclswXSk7CisJCisJZmRfbG9nX2RlYnVnKCItLS0tLS0gUkFESVVTIG1zZyBkdW1wIC0tLS0tLS0iKTsKKwlmZF9sb2dfZGVidWcoIiBpZCAgOiAweCUwMmhoeCwgY29kZSA6ICVoaGQgKCVzKSwgbGVuZ3RoIDogJWQiLCBtc2ctPnJhZGl1cy5oZHItPmlkZW50aWZpZXIsIG1zZy0+cmFkaXVzLmhkci0+Y29kZSwgcmd3X21zZ19jb2RlX3N0cihtc2ctPnJhZGl1cy5oZHItPmNvZGUpLCBudG9ocyhtc2ctPnJhZGl1cy5oZHItPmxlbmd0aCkpOworCWZkX2xvZ19kZWJ1ZygiIGF1dGg6ICUwMmhoeCAlMDJoaHggJTAyaGh4ICUwMmhoeCAgJTAyaGh4ICUwMmhoeCAlMDJoaHggJTAyaGh4IiwKKwkJCWF1dGhbMF0sIGF1dGhbMV0sIGF1dGhbMl0sIGF1dGhbM10sIGF1dGhbNF0sIGF1dGhbNV0sIGF1dGhbNl0sIGF1dGhbN10pOworCWZkX2xvZ19kZWJ1ZygiICAgICAgICUwMmhoeCAlMDJoaHggJTAyaGh4ICUwMmhoeCAgJTAyaGh4ICUwMmhoeCAlMDJoaHggJTAyaGh4IiwKKwkJCWF1dGhbOF0sICBhdXRoWzldLCAgYXV0aFsxMF0sIGF1dGhbMTFdLCBhdXRoWzEyXSwgYXV0aFsxM10sIGF1dGhbMTRdLCBhdXRoWzE1XSk7CisJZm9yIChpID0gMDsgaSA8IG1zZy0+cmFkaXVzLmF0dHJfdXNlZDsgaSsrKSB7CisJCXN0cnVjdCByYWRpdXNfYXR0cl9oZHIgKmF0dHIgPSAoc3RydWN0IHJhZGl1c19hdHRyX2hkciAqKShtc2ctPnJhZGl1cy5idWYgKyBtc2ctPnJhZGl1cy5hdHRyX3Bvc1tpXSk7CisJCWZkX2xvZ19kZWJ1ZygiICAgIC0gVHlwZTogMHglMDJoaHggKCVzKSAgICAgICBMZW46ICUtM2hodSIsIGF0dHItPnR5cGUsIHJnd19tc2dfYXR0cnR5cGVfc3RyKGF0dHItPnR5cGUpLCBhdHRyLT5sZW5ndGgpOworCQlmZF9sb2dfZGVidWcoIiVzIiwgcmFkaXVzX21zZ19kdW1wX2F0dHJfdmFsKGF0dHIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKTsKKwl9CisJaWYgKGhhc19tZXRhICYmIG1zZy0+cHNfbmIpIHsKKwkJZmRfbG9nX2RlYnVnKCItLS0tIGhpZGRlbiBhdHRyaWJ1dGVzOiIpOworCQlmb3IgKGkgPSBtc2ctPnBzX2ZpcnN0OyBpIDwgbXNnLT5wc19maXJzdCArIG1zZy0+cHNfbmI7IGkrKykgeworCQkJc3RydWN0IHJhZGl1c19hdHRyX2hkciAqYXR0ciA9IChzdHJ1Y3QgcmFkaXVzX2F0dHJfaGRyICopKG1zZy0+cmFkaXVzLmJ1ZiArIG1zZy0+cmFkaXVzLmF0dHJfcG9zW2ldKTsKKwkJCWZkX2xvZ19kZWJ1ZygiICAgIC0gVHlwZTogMHglMDJoaHggKCVzKSAgICAgICBMZW46ICUtM2hodSIsIGF0dHItPnR5cGUsIHJnd19tc2dfYXR0cnR5cGVfc3RyKGF0dHItPnR5cGUpLCBhdHRyLT5sZW5ndGgpOworCQkJZmRfbG9nX2RlYnVnKCIlcyIsIHJhZGl1c19tc2dfZHVtcF9hdHRyX3ZhbChhdHRyLCBidWYsIHNpemVvZihidWYpKSk7CisJCX0KKwl9CisJZmRfbG9nX2RlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworfQorCisKK2ludCByYWRpdXNfbXNnX2ZpbmlzaChzdHJ1Y3QgcmFkaXVzX21zZyAqbXNnLCBjb25zdCB1OCAqc2VjcmV0LAorCQkgICAgICBzaXplX3Qgc2VjcmV0X2xlbikKK3sKKwlpZiAoc2VjcmV0KSB7CisJCXU4IGF1dGhbTUQ1X01BQ19MRU5dOworCQlzdHJ1Y3QgcmFkaXVzX2F0dHJfaGRyICphdHRyOworCisJCW9zX21lbXNldChhdXRoLCAwLCBNRDVfTUFDX0xFTik7CisJCWF0dHIgPSByYWRpdXNfbXNnX2FkZF9hdHRyKG1zZywKKwkJCQkJICAgUkFESVVTX0FUVFJfTUVTU0FHRV9BVVRIRU5USUNBVE9SLAorCQkJCQkgICBhdXRoLCBNRDVfTUFDX0xFTik7CisJCWlmIChhdHRyID09IE5VTEwpIHsKKwkJCWZkX2xvZ19kZWJ1ZygiV0FSTklORzogQ291bGQgbm90IGFkZCBNZXNzYWdlLUF1dGhlbnRpY2F0b3IiKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQltc2ctPmhkci0+bGVuZ3RoID0gaHRvbnMobXNnLT5idWZfdXNlZCk7CisJCWhtYWNfbWQ1KHNlY3JldCwgc2VjcmV0X2xlbiwgbXNnLT5idWYsIG1zZy0+YnVmX3VzZWQsCisJCQkgKHU4ICopIChhdHRyICsgMSkpOworCX0gZWxzZQorCQltc2ctPmhkci0+bGVuZ3RoID0gaHRvbnMobXNnLT5idWZfdXNlZCk7CisKKwlpZiAobXNnLT5idWZfdXNlZCA+IDB4ZmZmZikgeworCQlmZF9sb2dfZGVidWcoIldBUk5JTkc6IHRvbyBsb25nIFJBRElVUyBtZXNzYWdlICglbHUpIiwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKSBtc2ctPmJ1Zl91c2VkKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworCitpbnQgcmFkaXVzX21zZ19maW5pc2hfc3J2KHN0cnVjdCByYWRpdXNfbXNnICptc2csIGNvbnN0IHU4ICpzZWNyZXQsCisJCQkgIHNpemVfdCBzZWNyZXRfbGVuLCBjb25zdCB1OCAqcmVxX2F1dGhlbnRpY2F0b3IpCit7CisJdTggYXV0aFtNRDVfTUFDX0xFTl07CisJc3RydWN0IHJhZGl1c19hdHRyX2hkciAqYXR0cjsKKwljb25zdCB1OCAqYWRkcls0XTsKKwlzaXplX3QgbGVuWzRdOworCisJaWYgKG1zZy0+aGRyLT5jb2RlICE9IFJBRElVU19DT0RFX0FDQ09VTlRJTkdfUkVTUE9OU0UpIHsKKwkgICAgb3NfbWVtc2V0KGF1dGgsIDAsIE1ENV9NQUNfTEVOKTsKKwkgICAgYXR0ciA9IHJhZGl1c19tc2dfYWRkX2F0dHIobXNnLCBSQURJVVNfQVRUUl9NRVNTQUdFX0FVVEhFTlRJQ0FUT1IsCisJCQkJICAgICAgIGF1dGgsIE1ENV9NQUNfTEVOKTsKKwkgICAgaWYgKGF0dHIgPT0gTlVMTCkgeworCQkgICAgZmRfbG9nX2RlYnVnKCJXQVJOSU5HOiBDb3VsZCBub3QgYWRkIE1lc3NhZ2UtQXV0aGVudGljYXRvciIpOworCQkgICAgcmV0dXJuIC0xOworCSAgICB9CisJICAgIG1zZy0+aGRyLT5sZW5ndGggPSBodG9ucyhtc2ctPmJ1Zl91c2VkKTsKKwkgICAgb3NfbWVtY3B5KG1zZy0+aGRyLT5hdXRoZW50aWNhdG9yLCByZXFfYXV0aGVudGljYXRvciwKKwkJICAgICAgc2l6ZW9mKG1zZy0+aGRyLT5hdXRoZW50aWNhdG9yKSk7CisJICAgIGhtYWNfbWQ1KHNlY3JldCwgc2VjcmV0X2xlbiwgbXNnLT5idWYsIG1zZy0+YnVmX3VzZWQsCisJCSAgICAgKHU4ICopIChhdHRyICsgMSkpOworCX0gZWxzZSB7CisJICAgIG1zZy0+aGRyLT5sZW5ndGggPSBodG9ucyhtc2ctPmJ1Zl91c2VkKTsKKwl9CisKKwkvKiBSZXNwb25zZUF1dGggPSBNRDUoQ29kZStJRCtMZW5ndGgrUmVxdWVzdEF1dGgrQXR0cmlidXRlcytTZWNyZXQpICovCisJYWRkclswXSA9ICh1OCAqKSBtc2ctPmhkcjsKKwlsZW5bMF0gPSAxICsgMSArIDI7CisJYWRkclsxXSA9IHJlcV9hdXRoZW50aWNhdG9yOworCWxlblsxXSA9IE1ENV9NQUNfTEVOOworCWFkZHJbMl0gPSAodTggKikgKG1zZy0+aGRyICsgMSk7CisJbGVuWzJdID0gbXNnLT5idWZfdXNlZCAtIHNpemVvZigqbXNnLT5oZHIpOworCWFkZHJbM10gPSBzZWNyZXQ7CisJbGVuWzNdID0gc2VjcmV0X2xlbjsKKwltZDVfdmVjdG9yKDQsIGFkZHIsIGxlbiwgbXNnLT5oZHItPmF1dGhlbnRpY2F0b3IpOworCisJaWYgKG1zZy0+YnVmX3VzZWQgPiAweGZmZmYpIHsKKwkJZmRfbG9nX2RlYnVnKCJXQVJOSU5HOiB0b28gbG9uZyBSQURJVVMgbWVzc2FnZSAoJWx1KSIsCisJCSAgICAgICAodW5zaWduZWQgbG9uZykgbXNnLT5idWZfdXNlZCk7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKwordm9pZCByYWRpdXNfbXNnX2ZpbmlzaF9hY2N0KHN0cnVjdCByYWRpdXNfbXNnICptc2csIGNvbnN0IHU4ICpzZWNyZXQsCisJCQkgICAgc2l6ZV90IHNlY3JldF9sZW4pCit7CisJY29uc3QgdTggKmFkZHJbMl07CisJc2l6ZV90IGxlblsyXTsKKworCW1zZy0+aGRyLT5sZW5ndGggPSBodG9ucyhtc2ctPmJ1Zl91c2VkKTsKKwlvc19tZW1zZXQobXNnLT5oZHItPmF1dGhlbnRpY2F0b3IsIDAsIE1ENV9NQUNfTEVOKTsKKwlhZGRyWzBdID0gbXNnLT5idWY7CisJbGVuWzBdID0gbXNnLT5idWZfdXNlZDsKKwlhZGRyWzFdID0gc2VjcmV0OworCWxlblsxXSA9IHNlY3JldF9sZW47CisJbWQ1X3ZlY3RvcigyLCBhZGRyLCBsZW4sIG1zZy0+aGRyLT5hdXRoZW50aWNhdG9yKTsKKworCWlmIChtc2ctPmJ1Zl91c2VkID4gMHhmZmZmKSB7CisJCWZkX2xvZ19kZWJ1ZygiV0FSTklORzogdG9vIGxvbmcgUkFESVVTIG1lc3NhZ2VzICglbHUpIiwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKSBtc2ctPmJ1Zl91c2VkKTsKKwl9Cit9CisKKworaW50IHJhZGl1c19tc2dfYWRkX2F0dHJfdG9fYXJyYXkoc3RydWN0IHJhZGl1c19tc2cgKm1zZywKKwkJCQkJc3RydWN0IHJhZGl1c19hdHRyX2hkciAqYXR0cikKK3sKKwlpZiAobXNnLT5hdHRyX3VzZWQgPj0gbXNnLT5hdHRyX3NpemUpIHsKKwkJc2l6ZV90ICpuYXR0cl9wb3M7CisJCWludCBubGVuID0gbXNnLT5hdHRyX3NpemUgKiAyOworCisJCW5hdHRyX3BvcyA9IG9zX3JlYWxsb2MobXNnLT5hdHRyX3BvcywKKwkJCQkgICAgICAgbmxlbiAqIHNpemVvZigqbXNnLT5hdHRyX3BvcykpOworCQlpZiAobmF0dHJfcG9zID09IE5VTEwpCisJCQlyZXR1cm4gLTE7CisKKwkJbXNnLT5hdHRyX3BvcyA9IG5hdHRyX3BvczsKKwkJbXNnLT5hdHRyX3NpemUgPSBubGVuOworCX0KKworCW1zZy0+YXR0cl9wb3NbbXNnLT5hdHRyX3VzZWQrK10gPSAodW5zaWduZWQgY2hhciAqKSBhdHRyIC0gbXNnLT5idWY7CisKKwlyZXR1cm4gMDsKK30KKworCitzdHJ1Y3QgcmFkaXVzX2F0dHJfaGRyICpyYWRpdXNfbXNnX2FkZF9hdHRyKHN0cnVjdCByYWRpdXNfbXNnICptc2csIHU4IHR5cGUsCisJCQkJCSAgICBjb25zdCB1OCAqZGF0YSwgc2l6ZV90IGRhdGFfbGVuKQoreworCXNpemVfdCBidWZfbmVlZGVkOworCXN0cnVjdCByYWRpdXNfYXR0cl9oZHIgKmF0dHI7CisKKwlpZiAoZGF0YV9sZW4gPiBSQURJVVNfTUFYX0FUVFJfTEVOKSB7CisJCWZkX2xvZ19kZWJ1ZygicmFkaXVzX21zZ19hZGRfYXR0cjogdG9vIGxvbmcgYXR0cmlidXRlICglbHUgYnl0ZXMpIiwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKSBkYXRhX2xlbik7CisJCXJldHVybiBOVUxMOworCX0KKworCWJ1Zl9uZWVkZWQgPSBtc2ctPmJ1Zl91c2VkICsgc2l6ZW9mKCphdHRyKSArIGRhdGFfbGVuOworCisJaWYgKG1zZy0+YnVmX3NpemUgPCBidWZfbmVlZGVkKSB7CisJCS8qIGFsbG9jYXRlIG1vcmUgc3BhY2UgZm9yIG1lc3NhZ2UgYnVmZmVyICovCisJCXVuc2lnbmVkIGNoYXIgKm5idWY7CisJCXNpemVfdCBubGVuID0gbXNnLT5idWZfc2l6ZTsKKworCQl3aGlsZSAobmxlbiA8IGJ1Zl9uZWVkZWQpCisJCQlubGVuICo9IDI7CisJCW5idWYgPSBvc19yZWFsbG9jKG1zZy0+YnVmLCBubGVuKTsKKwkJaWYgKG5idWYgPT0gTlVMTCkKKwkJCXJldHVybiBOVUxMOworCQltc2ctPmJ1ZiA9IG5idWY7CisJCW1zZy0+aGRyID0gKHN0cnVjdCByYWRpdXNfaGRyICopIG1zZy0+YnVmOworCQlvc19tZW1zZXQobXNnLT5idWYgKyBtc2ctPmJ1Zl9zaXplLCAwLCBubGVuIC0gbXNnLT5idWZfc2l6ZSk7CisJCW1zZy0+YnVmX3NpemUgPSBubGVuOworCX0KKworCWF0dHIgPSAoc3RydWN0IHJhZGl1c19hdHRyX2hkciAqKSAobXNnLT5idWYgKyBtc2ctPmJ1Zl91c2VkKTsKKwlhdHRyLT50eXBlID0gdHlwZTsKKwlhdHRyLT5sZW5ndGggPSBzaXplb2YoKmF0dHIpICsgZGF0YV9sZW47CisJaWYgKGRhdGFfbGVuID4gMCkKKwkJb3NfbWVtY3B5KGF0dHIgKyAxLCBkYXRhLCBkYXRhX2xlbik7CisKKwltc2ctPmJ1Zl91c2VkICs9IHNpemVvZigqYXR0cikgKyBkYXRhX2xlbjsKKworCWlmIChyYWRpdXNfbXNnX2FkZF9hdHRyX3RvX2FycmF5KG1zZywgYXR0cikpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIGF0dHI7Cit9CisKKworLyogTW9kaWZpZWQgdmVyc2lvbiBvZiByYWRpdXNfbXNnX3BhcnNlICovCitpbnQgcmd3X21zZ19wYXJzZSh1bnNpZ25lZCBjaGFyICogYnVmLCBzaXplX3QgbGVuLCBzdHJ1Y3Qgcmd3X3JhZGl1c19tc2dfbWV0YSAqKiBtc2cpCit7CisJc3RydWN0IHJnd19yYWRpdXNfbXNnX21ldGEgKiB0ZW1wX21zZyA9IE5VTEw7CisJc3RydWN0IHJhZGl1c19oZHIgKmhkcjsKKwlzdHJ1Y3QgcmFkaXVzX2F0dHJfaGRyICphdHRyOworCXNpemVfdCBtc2dfbGVuOworCXVuc2lnbmVkIGNoYXIgKnBvcywgKmVuZDsKKwlpbnQgcmV0ID0gMDsKKwkKKwlUUkFDRV9FTlRSWSgiJXAgJXpkICVwIiwgYnVmLCBsZW4sIG1zZyk7CisJCisJQ0hFQ0tfUEFSQU1TKCBidWYgJiYgbGVuID49IHNpemVvZigqaGRyKSAmJiBtc2cgKTsKKwkKKwkqbXNnID0gTlVMTDsKKwkKKwkvKiBQYXJzZSB0aGUgUkFESVVTIG1lc3NhZ2UgKi8KKwloZHIgPSAoc3RydWN0IHJhZGl1c19oZHIgKikgYnVmOworCW1zZ19sZW4gPSBudG9ocyhoZHItPmxlbmd0aCk7CisJaWYgKG1zZ19sZW4gPCBzaXplb2YoKmhkcikgfHwgbXNnX2xlbiA+IGxlbikgeworCQlUUkFDRV9ERUJVRyhJTkZPLCAiSW52YWxpZCBSQURJVVMgbWVzc2FnZSBsZW5ndGgiKTsKKwkJcmV0dXJuIEVJTlZBTDsKKwl9CisKKwlpZiAobXNnX2xlbiA8IGxlbikgeworCQlUUkFDRV9ERUJVRyhJTkZPLCAiSWdub3JlZCAlbHUgZXh0cmEgYnl0ZXMgYWZ0ZXIgUkFESVVTIG1lc3NhZ2UiLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIGxlbiAtIG1zZ19sZW4pOworCX0KKworCUNIRUNLX01BTExPQyggdGVtcF9tc2cgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCByZ3dfcmFkaXVzX21zZ19tZXRhKSkgKTsKKwltZW1zZXQodGVtcF9tc2csIDAsIHNpemVvZihzdHJ1Y3Qgcmd3X3JhZGl1c19tc2dfbWV0YSkpOworCQorCWlmIChyYWRpdXNfbXNnX2luaXRpYWxpemUoJnRlbXBfbXNnLT5yYWRpdXMsIG1zZ19sZW4pKSB7CisJCVRSQUNFX0RFQlVHKElORk8sICJFcnJvciBpbiByYWRpdXNfbXNnX2luaXRpYWxpemUsIHJldHVybmluZyBFTk9NRU0uIik7CisJCWZyZWUodGVtcF9tc2cpOworCQlyZXR1cm4gRU5PTUVNOworCX0KKwkKKwkvKiBTdG9yZSB0aGUgcmVjZWl2ZWQgZGF0YSBpbiB0aGUgYWxsb2MnZCBidWZmZXIgKi8KKwltZW1jcHkodGVtcF9tc2ctPnJhZGl1cy5idWYsIGJ1ZiwgbXNnX2xlbik7CisJdGVtcF9tc2ctPnJhZGl1cy5idWZfc2l6ZSA9IHRlbXBfbXNnLT5yYWRpdXMuYnVmX3VzZWQgPSBtc2dfbGVuOworCQorCS8qIHBhcnNlIGF0dHJpYnV0ZXMgKi8KKwlwb3MgPSAodW5zaWduZWQgY2hhciAqKSAodGVtcF9tc2ctPnJhZGl1cy5oZHIgKyAxKTsKKwllbmQgPSB0ZW1wX21zZy0+cmFkaXVzLmJ1ZiArIHRlbXBfbXNnLT5yYWRpdXMuYnVmX3VzZWQ7CisJCisJd2hpbGUgKHBvcyA8IGVuZCkgeworCQlpZiAoKHNpemVfdCkgKGVuZCAtIHBvcykgPCBzaXplb2YoKmF0dHIpKSB7CisJCQlUUkFDRV9ERUJVRyhJTkZPLCAiVHJ1Y2F0ZWQgYXR0cmlidXRlIGZvdW5kIGluIFJBRElVUyBidWZmZXIsIEVJTlZBTC4iKTsKKwkJCXJldCA9IEVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCQkKKwkJYXR0ciA9IChzdHJ1Y3QgcmFkaXVzX2F0dHJfaGRyICopIHBvczsKKwkKKwkJaWYgKHBvcyArIGF0dHItPmxlbmd0aCA+IGVuZCB8fCBhdHRyLT5sZW5ndGggPCBzaXplb2YoKmF0dHIpKSB7CisJCQlUUkFDRV9ERUJVRyhJTkZPLCAiVHJ1Y2F0ZWQgYXR0cmlidXRlIGZvdW5kIGluIFJBRElVUyBidWZmZXIsIEVJTlZBTC4iKTsKKwkJCXJldCA9IEVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHJhZGl1c19tc2dfYWRkX2F0dHJfdG9fYXJyYXkoJnRlbXBfbXNnLT5yYWRpdXMsIGF0dHIpKSB7CisJCQlUUkFDRV9ERUJVRyhJTkZPLCAiRXJyb3IgaW4gcmFkaXVzX21zZ19hZGRfYXR0cl90b19hcnJheSwgRU5PTUVNIik7CisJCQlyZXQgPSBFTk9NRU07CisJCQlicmVhazsKKwkJfQorCQkKKwkJaWYgKGF0dHItPnR5cGUgPT0gUkFESVVTX0FUVFJfUFJPWFlfU1RBVEUpCisJCQl0ZW1wX21zZy0+cHNfbmIgKz0gMTsKKworCQlwb3MgKz0gYXR0ci0+bGVuZ3RoOworCX0KKwkKKwlpZiAocmV0ICE9IDApIHsKKwkJcmFkaXVzX21zZ19mcmVlKCZ0ZW1wX21zZy0+cmFkaXVzKTsKKwkJZnJlZSh0ZW1wX21zZyk7CisJCXJldHVybiByZXQ7CisJfQorCQorCS8qIE5vdyBtb3ZlIGFsbCB0aGUgcHJveHktc3RhdGUgYXR0cmlidXRlcyBhdCB0aGUgZW5kIG9mIHRoZSBhdHRyX3BvcyBhcnJheSAqLworCWlmICh0ZW1wX21zZy0+cHNfbmIpIHsKKwkJc2l6ZV90ICp0ZW1wX3BzID0gTlVMTDsKKwkJaW50IG4sIG5ld19uID0gMCwgcCA9IDA7CisJCQorCQlDSEVDS19NQUxMT0MoIHRlbXBfcHMgPSBjYWxsb2ModGVtcF9tc2ctPnBzX25iLCBzaXplb2Yoc2l6ZV90KSkgKTsKKwkJCisJCS8qIE1vdmUgYWxsIHRoZSBQcm94eS1TdGF0ZSBhdHRyaWJ1dGVzIGludG8gdGhlIHRlbXBfcHMgYXJyYXkgKi8KKwkJZm9yIChuPTA7IG4gPCB0ZW1wX21zZy0+cmFkaXVzLmF0dHJfdXNlZDsgbisrKSB7CisJCQlzdHJ1Y3QgcmFkaXVzX2F0dHJfaGRyICogYXR0ciA9IChzdHJ1Y3QgcmFkaXVzX2F0dHJfaGRyICopKHRlbXBfbXNnLT5yYWRpdXMuYnVmICsgdGVtcF9tc2ctPnJhZGl1cy5hdHRyX3Bvc1tuXSk7CisJCQkKKwkJCWlmIChhdHRyLT50eXBlID09IFJBRElVU19BVFRSX1BST1hZX1NUQVRFKSB7CisJCQkJdGVtcF9wc1twKytdID0gdGVtcF9tc2ctPnJhZGl1cy5hdHRyX3Bvc1tuXTsKKwkJCX0gZWxzZSB7CisJCQkJdGVtcF9tc2ctPnJhZGl1cy5hdHRyX3Bvc1tuZXdfbisrXSA9IHRlbXBfbXNnLT5yYWRpdXMuYXR0cl9wb3Nbbl07CisJCQl9CisJCX0KKwkJdGVtcF9tc2ctPnJhZGl1cy5hdHRyX3VzZWQgPSBuZXdfbjsgLyogaGlkZSB0aGUgcHJveHktc3RhdGUgdG8gb3RoZXIgbW9kdWxlcyAqLworCQl0ZW1wX21zZy0+cHNfZmlyc3QgPSBuZXdfbjsKKwkJCisJCS8qIEFuZCBiYWNrIGludG8gdGhlIGFycmF5ICovCisJCW1lbWNweSh0ZW1wX21zZy0+cmFkaXVzLmF0dHJfcG9zICsgbmV3X24sIHRlbXBfcHMsIHAgKiBzaXplb2Yoc2l6ZV90KSk7CisJCWZyZWUodGVtcF9wcyk7CisJfQorCQorCSptc2cgPSB0ZW1wX21zZzsKKwlyZXR1cm4gMDsKK30KKworCisKK2ludCByYWRpdXNfbXNnX2FkZF9lYXAoc3RydWN0IHJhZGl1c19tc2cgKm1zZywgY29uc3QgdTggKmRhdGEsIHNpemVfdCBkYXRhX2xlbikKK3sKKwljb25zdCB1OCAqcG9zID0gZGF0YTsKKwlzaXplX3QgbGVmdCA9IGRhdGFfbGVuOworCisJd2hpbGUgKGxlZnQgPiAwKSB7CisJCWludCBsZW47CisJCWlmIChsZWZ0ID4gUkFESVVTX01BWF9BVFRSX0xFTikKKwkJCWxlbiA9IFJBRElVU19NQVhfQVRUUl9MRU47CisJCWVsc2UKKwkJCWxlbiA9IGxlZnQ7CisKKwkJaWYgKCFyYWRpdXNfbXNnX2FkZF9hdHRyKG1zZywgUkFESVVTX0FUVFJfRUFQX01FU1NBR0UsCisJCQkJCSBwb3MsIGxlbikpCisJCQlyZXR1cm4gMDsKKworCQlwb3MgKz0gbGVuOworCQlsZWZ0IC09IGxlbjsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworCit1OCAqcmFkaXVzX21zZ19nZXRfZWFwKHN0cnVjdCByYWRpdXNfbXNnICptc2csIHNpemVfdCAqZWFwX2xlbikKK3sKKwl1OCAqZWFwLCAqcG9zOworCXNpemVfdCBsZW4sIGk7CisJc3RydWN0IHJhZGl1c19hdHRyX2hkciAqYXR0cjsKKworCWlmIChtc2cgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlsZW4gPSAwOworCWZvciAoaSA9IDA7IGkgPCBtc2ctPmF0dHJfdXNlZDsgaSsrKSB7CisJCWF0dHIgPSByYWRpdXNfZ2V0X2F0dHJfaGRyKG1zZywgaSk7CisJCWlmIChhdHRyLT50eXBlID09IFJBRElVU19BVFRSX0VBUF9NRVNTQUdFKQorCQkJbGVuICs9IGF0dHItPmxlbmd0aCAtIHNpemVvZihzdHJ1Y3QgcmFkaXVzX2F0dHJfaGRyKTsKKwl9CisKKwlpZiAobGVuID09IDApCisJCXJldHVybiBOVUxMOworCisJZWFwID0gb3NfbWFsbG9jKGxlbik7CisJaWYgKGVhcCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCXBvcyA9IGVhcDsKKwlmb3IgKGkgPSAwOyBpIDwgbXNnLT5hdHRyX3VzZWQ7IGkrKykgeworCQlhdHRyID0gcmFkaXVzX2dldF9hdHRyX2hkcihtc2csIGkpOworCQlpZiAoYXR0ci0+dHlwZSA9PSBSQURJVVNfQVRUUl9FQVBfTUVTU0FHRSkgeworCQkJaW50IGZsZW4gPSBhdHRyLT5sZW5ndGggLSBzaXplb2YoKmF0dHIpOworCQkJb3NfbWVtY3B5KHBvcywgYXR0ciArIDEsIGZsZW4pOworCQkJcG9zICs9IGZsZW47CisJCX0KKwl9CisKKwlpZiAoZWFwX2xlbikKKwkJKmVhcF9sZW4gPSBsZW47CisKKwlyZXR1cm4gZWFwOworfQorCisKK2ludCByYWRpdXNfbXNnX3ZlcmlmeV9tc2dfYXV0aChzdHJ1Y3QgcmFkaXVzX21zZyAqbXNnLCBjb25zdCB1OCAqc2VjcmV0LAorCQkJICAgICAgIHNpemVfdCBzZWNyZXRfbGVuLCBjb25zdCB1OCAqcmVxX2F1dGgpCit7CisJdTggYXV0aFtNRDVfTUFDX0xFTl0sIG9yaWdbTUQ1X01BQ19MRU5dOworCXU4IG9yaWdfYXV0aGVudGljYXRvclsxNl07CisJc3RydWN0IHJhZGl1c19hdHRyX2hkciAqYXR0ciA9IE5VTEwsICp0bXA7CisJc2l6ZV90IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbXNnLT5hdHRyX3VzZWQ7IGkrKykgeworCQl0bXAgPSByYWRpdXNfZ2V0X2F0dHJfaGRyKG1zZywgaSk7CisJCWlmICh0bXAtPnR5cGUgPT0gUkFESVVTX0FUVFJfTUVTU0FHRV9BVVRIRU5USUNBVE9SKSB7CisJCQlpZiAoYXR0ciAhPSBOVUxMKSB7CisJCQkJZmRfbG9nX2RlYnVnKCJNdWx0aXBsZSBNZXNzYWdlLUF1dGhlbnRpY2F0b3IgYXR0cmlidXRlcyBpbiBSQURJVVMgbWVzc2FnZSIpOworCQkJCXJldHVybiAxOworCQkJfQorCQkJYXR0ciA9IHRtcDsKKwkJfQorCX0KKworCWlmIChhdHRyID09IE5VTEwpIHsKKwkJZmRfbG9nX2RlYnVnKCJObyBNZXNzYWdlLUF1dGhlbnRpY2F0b3IgYXR0cmlidXRlIGZvdW5kIik7CisJCXJldHVybiAxOworCX0KKworCW9zX21lbWNweShvcmlnLCBhdHRyICsgMSwgTUQ1X01BQ19MRU4pOworCW9zX21lbXNldChhdHRyICsgMSwgMCwgTUQ1X01BQ19MRU4pOworCWlmIChyZXFfYXV0aCkgeworCQlvc19tZW1jcHkob3JpZ19hdXRoZW50aWNhdG9yLCBtc2ctPmhkci0+YXV0aGVudGljYXRvciwKKwkJCSAgc2l6ZW9mKG9yaWdfYXV0aGVudGljYXRvcikpOworCQlvc19tZW1jcHkobXNnLT5oZHItPmF1dGhlbnRpY2F0b3IsIHJlcV9hdXRoLAorCQkJICBzaXplb2YobXNnLT5oZHItPmF1dGhlbnRpY2F0b3IpKTsKKwl9CisJaG1hY19tZDUoc2VjcmV0LCBzZWNyZXRfbGVuLCBtc2ctPmJ1ZiwgbXNnLT5idWZfdXNlZCwgYXV0aCk7CisJb3NfbWVtY3B5KGF0dHIgKyAxLCBvcmlnLCBNRDVfTUFDX0xFTik7CisJaWYgKHJlcV9hdXRoKSB7CisJCW9zX21lbWNweShtc2ctPmhkci0+YXV0aGVudGljYXRvciwgb3JpZ19hdXRoZW50aWNhdG9yLAorCQkJICBzaXplb2Yob3JpZ19hdXRoZW50aWNhdG9yKSk7CisJfQorCisJaWYgKG9zX21lbWNtcChvcmlnLCBhdXRoLCBNRDVfTUFDX0xFTikgIT0gMCkgeworCQlmZF9sb2dfZGVidWcoIkludmFsaWQgTWVzc2FnZS1BdXRoZW50aWNhdG9yISIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitpbnQgcmFkaXVzX21zZ192ZXJpZnkoc3RydWN0IHJhZGl1c19tc2cgKm1zZywgY29uc3QgdTggKnNlY3JldCwKKwkJICAgICAgc2l6ZV90IHNlY3JldF9sZW4sIHN0cnVjdCByYWRpdXNfbXNnICpzZW50X21zZywgaW50IGF1dGgpCit7CisJY29uc3QgdTggKmFkZHJbNF07CisJc2l6ZV90IGxlbls0XTsKKwl1OCBoYXNoW01ENV9NQUNfTEVOXTsKKworCWlmIChzZW50X21zZyA9PSBOVUxMKSB7CisJCWZkX2xvZ19kZWJ1ZygiTm8gbWF0Y2hpbmcgQWNjZXNzLVJlcXVlc3QgbWVzc2FnZSBmb3VuZCIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoYXV0aCAmJgorCSAgICByYWRpdXNfbXNnX3ZlcmlmeV9tc2dfYXV0aChtc2csIHNlY3JldCwgc2VjcmV0X2xlbiwKKwkJCQkgICAgICAgc2VudF9tc2ctPmhkci0+YXV0aGVudGljYXRvcikpIHsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogUmVzcG9uc2VBdXRoID0gTUQ1KENvZGUrSUQrTGVuZ3RoK1JlcXVlc3RBdXRoK0F0dHJpYnV0ZXMrU2VjcmV0KSAqLworCWFkZHJbMF0gPSAodTggKikgbXNnLT5oZHI7CisJbGVuWzBdID0gMSArIDEgKyAyOworCWFkZHJbMV0gPSBzZW50X21zZy0+aGRyLT5hdXRoZW50aWNhdG9yOworCWxlblsxXSA9IE1ENV9NQUNfTEVOOworCWFkZHJbMl0gPSAodTggKikgKG1zZy0+aGRyICsgMSk7CisJbGVuWzJdID0gbXNnLT5idWZfdXNlZCAtIHNpemVvZigqbXNnLT5oZHIpOworCWFkZHJbM10gPSBzZWNyZXQ7CisJbGVuWzNdID0gc2VjcmV0X2xlbjsKKwltZDVfdmVjdG9yKDQsIGFkZHIsIGxlbiwgaGFzaCk7CisJaWYgKG9zX21lbWNtcChoYXNoLCBtc2ctPmhkci0+YXV0aGVudGljYXRvciwgTUQ1X01BQ19MRU4pICE9IDApIHsKKwkJZmRfbG9nX2RlYnVnKCJSZXNwb25zZSBBdXRoZW50aWNhdG9yIGludmFsaWQhIik7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCisKK2ludCByYWRpdXNfbXNnX2NvcHlfYXR0cihzdHJ1Y3QgcmFkaXVzX21zZyAqZHN0LCBzdHJ1Y3QgcmFkaXVzX21zZyAqc3JjLAorCQkJIHU4IHR5cGUpCit7CisJc3RydWN0IHJhZGl1c19hdHRyX2hkciAqYXR0cjsKKwlzaXplX3QgaTsKKwlpbnQgY291bnQgPSAwOworCisJZm9yIChpID0gMDsgaSA8IHNyYy0+YXR0cl91c2VkOyBpKyspIHsKKwkJYXR0ciA9IHJhZGl1c19nZXRfYXR0cl9oZHIoc3JjLCBpKTsKKwkJaWYgKGF0dHItPnR5cGUgPT0gdHlwZSkgeworCQkJaWYgKCFyYWRpdXNfbXNnX2FkZF9hdHRyKGRzdCwgdHlwZSwgKHU4ICopIChhdHRyICsgMSksCisJCQkJCQkgYXR0ci0+bGVuZ3RoIC0gc2l6ZW9mKCphdHRyKSkpCisJCQkJcmV0dXJuIC0xOworCQkJY291bnQrKzsKKwkJfQorCX0KKworCXJldHVybiBjb3VudDsKK30KKworCisvKiBDcmVhdGUgUmVxdWVzdCBBdXRoZW50aWNhdG9yLiBUaGUgdmFsdWUgc2hvdWxkIGJlIHVuaXF1ZSBvdmVyIHRoZSBsaWZldGltZQorICogb2YgdGhlIHNoYXJlZCBzZWNyZXQgYmV0d2VlbiBhdXRoZW50aWNhdG9yIGFuZCBhdXRoZW50aWNhdGlvbiBzZXJ2ZXIuCisgKiBVc2Ugb25lLXdheSBNRDUgaGFzaCBjYWxjdWxhdGVkIGZyb20gY3VycmVudCB0aW1lc3RhbXAgYW5kIHNvbWUgZGF0YSBnaXZlbgorICogYnkgdGhlIGNhbGxlci4gKi8KK3ZvaWQgcmFkaXVzX21zZ19tYWtlX2F1dGhlbnRpY2F0b3Ioc3RydWN0IHJhZGl1c19tc2cgKm1zZywKKwkJCQkgICBjb25zdCB1OCAqZGF0YSwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3Qgb3NfdGltZSB0djsKKwlsb25nIGludCBsOworCWNvbnN0IHU4ICphZGRyWzNdOworCXNpemVfdCBlbGVuWzNdOworCisJb3NfZ2V0X3RpbWUoJnR2KTsKKwlsID0gb3NfcmFuZG9tKCk7CisJYWRkclswXSA9ICh1OCAqKSAmdHY7CisJZWxlblswXSA9IHNpemVvZih0dik7CisJYWRkclsxXSA9IGRhdGE7CisJZWxlblsxXSA9IGxlbjsKKwlhZGRyWzJdID0gKHU4ICopICZsOworCWVsZW5bMl0gPSBzaXplb2YobCk7CisJbWQ1X3ZlY3RvcigzLCBhZGRyLCBlbGVuLCBtc2ctPmhkci0+YXV0aGVudGljYXRvcik7Cit9CisKKworLyogR2V0IFZlbmRvci1zcGVjaWZpYyBSQURJVVMgQXR0cmlidXRlIGZyb20gYSBwYXJzZWQgUkFESVVTIG1lc3NhZ2UuCisgKiBSZXR1cm5zIHRoZSBBdHRyaWJ1dGUgcGF5bG9hZCBhbmQgc2V0cyBhbGVuIHRvIGluZGljYXRlIHRoZSBsZW5ndGggb2YgdGhlCisgKiBwYXlsb2FkIGlmIGEgdmVuZG9yIGF0dHJpYnV0ZSB3aXRoIHN1YnR5cGUgaXMgZm91bmQsIG90aGVyd2lzZSByZXR1cm5zIE5VTEwuCisgKiBUaGUgcmV0dXJuZWQgcGF5bG9hZCBpcyBhbGxvY2F0ZWQgd2l0aCBvc19tYWxsb2MoKSBhbmQgY2FsbGVyIG11c3QgZnJlZSBpdAorICogYnkgY2FsbGluZyBvc19mcmVlKCkuCisgKi8KK3N0YXRpYyB1OCAqcmFkaXVzX21zZ19nZXRfdmVuZG9yX2F0dHIoc3RydWN0IHJhZGl1c19tc2cgKm1zZywgdTMyIHZlbmRvciwKKwkJCQkgICAgICB1OCBzdWJ0eXBlLCBzaXplX3QgKmFsZW4pCit7CisJdTggKmRhdGEsICpwb3M7CisJc2l6ZV90IGksIGxlbjsKKworCWlmIChtc2cgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlmb3IgKGkgPSAwOyBpIDwgbXNnLT5hdHRyX3VzZWQ7IGkrKykgeworCQlzdHJ1Y3QgcmFkaXVzX2F0dHJfaGRyICphdHRyID0gcmFkaXVzX2dldF9hdHRyX2hkcihtc2csIGkpOworCQlzaXplX3QgbGVmdDsKKwkJdTMyIHZlbmRvcl9pZDsKKwkJc3RydWN0IHJhZGl1c19hdHRyX3ZlbmRvciAqdmhkcjsKKworCQlpZiAoYXR0ci0+dHlwZSAhPSBSQURJVVNfQVRUUl9WRU5ET1JfU1BFQ0lGSUMpCisJCQljb250aW51ZTsKKworCQlsZWZ0ID0gYXR0ci0+bGVuZ3RoIC0gc2l6ZW9mKCphdHRyKTsKKwkJaWYgKGxlZnQgPCA0KQorCQkJY29udGludWU7CisKKwkJcG9zID0gKHU4ICopIChhdHRyICsgMSk7CisKKwkJb3NfbWVtY3B5KCZ2ZW5kb3JfaWQsIHBvcywgNCk7CisJCXBvcyArPSA0OworCQlsZWZ0IC09IDQ7CisKKwkJaWYgKG50b2hsKHZlbmRvcl9pZCkgIT0gdmVuZG9yKQorCQkJY29udGludWU7CisKKwkJd2hpbGUgKGxlZnQgPj0gc2l6ZW9mKCp2aGRyKSkgeworCQkJdmhkciA9IChzdHJ1Y3QgcmFkaXVzX2F0dHJfdmVuZG9yICopIHBvczsKKwkJCWlmICh2aGRyLT52ZW5kb3JfbGVuZ3RoID4gbGVmdCB8fAorCQkJICAgIHZoZHItPnZlbmRvcl9sZW5ndGggPCBzaXplb2YoKnZoZHIpKSB7CisJCQkJbGVmdCA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAodmhkci0+dmVuZG9yX3R5cGUgIT0gc3VidHlwZSkgeworCQkJCXBvcyArPSB2aGRyLT52ZW5kb3JfbGVuZ3RoOworCQkJCWxlZnQgLT0gdmhkci0+dmVuZG9yX2xlbmd0aDsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJbGVuID0gdmhkci0+dmVuZG9yX2xlbmd0aCAtIHNpemVvZigqdmhkcik7CisJCQlkYXRhID0gb3NfbWFsbG9jKGxlbik7CisJCQlpZiAoZGF0YSA9PSBOVUxMKQorCQkJCXJldHVybiBOVUxMOworCQkJb3NfbWVtY3B5KGRhdGEsIHBvcyArIHNpemVvZigqdmhkciksIGxlbik7CisJCQlpZiAoYWxlbikKKwkJCQkqYWxlbiA9IGxlbjsKKwkJCXJldHVybiBkYXRhOworCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKworc3RhdGljIHU4ICogZGVjcnlwdF9tc19rZXkoY29uc3QgdTggKmtleSwgc2l6ZV90IGxlbiwKKwkJCSAgIGNvbnN0IHU4ICpyZXFfYXV0aGVudGljYXRvciwKKwkJCSAgIGNvbnN0IHU4ICpzZWNyZXQsIHNpemVfdCBzZWNyZXRfbGVuLCBzaXplX3QgKnJlc2xlbikKK3sKKwl1OCAqcGxhaW4sICpwcG9zLCAqcmVzOworCWNvbnN0IHU4ICpwb3M7CisJc2l6ZV90IGxlZnQsIHBsZW47CisJdTggaGFzaFtNRDVfTUFDX0xFTl07CisJaW50IGksIGZpcnN0ID0gMTsKKwljb25zdCB1OCAqYWRkclszXTsKKwlzaXplX3QgZWxlblszXTsKKworCS8qIGtleTogMTYtYml0IHNhbHQgZm9sbG93ZWQgYnkgZW5jcnlwdGVkIGtleSBpbmZvICovCisKKwlpZiAobGVuIDwgMiArIDE2KQorCQlyZXR1cm4gTlVMTDsKKworCXBvcyA9IGtleSArIDI7CisJbGVmdCA9IGxlbiAtIDI7CisJaWYgKGxlZnQgJSAxNikgeworCQlmZF9sb2dfZGVidWcoIkludmFsaWQgbXMga2V5IGxlbiAlbHUiLCAodW5zaWduZWQgbG9uZykgbGVmdCk7CisJCXJldHVybiBOVUxMOworCX0KKworCXBsZW4gPSBsZWZ0OworCXBwb3MgPSBwbGFpbiA9IG9zX21hbGxvYyhwbGVuKTsKKwlpZiAocGxhaW4gPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJcGxhaW5bMF0gPSAwOworCisJd2hpbGUgKGxlZnQgPiAwKSB7CisJCS8qIGIoMSkgPSBNRDUoU2VjcmV0ICsgUmVxdWVzdC1BdXRoZW50aWNhdG9yICsgU2FsdCkKKwkJICogYihpKSA9IE1ENShTZWNyZXQgKyBjKGkgLSAxKSkgZm9yIGkgPiAxICovCisKKwkJYWRkclswXSA9IHNlY3JldDsKKwkJZWxlblswXSA9IHNlY3JldF9sZW47CisJCWlmIChmaXJzdCkgeworCQkJYWRkclsxXSA9IHJlcV9hdXRoZW50aWNhdG9yOworCQkJZWxlblsxXSA9IE1ENV9NQUNfTEVOOworCQkJYWRkclsyXSA9IGtleTsKKwkJCWVsZW5bMl0gPSAyOyAvKiBTYWx0ICovCisJCX0gZWxzZSB7CisJCQlhZGRyWzFdID0gcG9zIC0gTUQ1X01BQ19MRU47CisJCQllbGVuWzFdID0gTUQ1X01BQ19MRU47CisJCX0KKwkJbWQ1X3ZlY3RvcihmaXJzdCA/IDMgOiAyLCBhZGRyLCBlbGVuLCBoYXNoKTsKKwkJZmlyc3QgPSAwOworCisJCWZvciAoaSA9IDA7IGkgPCBNRDVfTUFDX0xFTjsgaSsrKQorCQkJKnBwb3MrKyA9ICpwb3MrKyBeIGhhc2hbaV07CisJCWxlZnQgLT0gTUQ1X01BQ19MRU47CisJfQorCisJaWYgKHBsYWluWzBdID09IDAgfHwgcGxhaW5bMF0gPiBwbGVuIC0gMSkgeworCQlmZF9sb2dfZGVidWcoIkZhaWxlZCB0byBkZWNyeXB0IE1QUEUga2V5Iik7CisJCW9zX2ZyZWUocGxhaW4pOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXMgPSBvc19tYWxsb2MocGxhaW5bMF0pOworCWlmIChyZXMgPT0gTlVMTCkgeworCQlvc19mcmVlKHBsYWluKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW9zX21lbWNweShyZXMsIHBsYWluICsgMSwgcGxhaW5bMF0pOworCWlmIChyZXNsZW4pCisJCSpyZXNsZW4gPSBwbGFpblswXTsKKwlvc19mcmVlKHBsYWluKTsKKwlyZXR1cm4gcmVzOworfQorCisKK3N0YXRpYyB2b2lkIGVuY3J5cHRfbXNfa2V5KGNvbnN0IHU4ICprZXksIHNpemVfdCBrZXlfbGVuLCB1MTYgc2FsdCwKKwkJCSAgIGNvbnN0IHU4ICpyZXFfYXV0aGVudGljYXRvciwKKwkJCSAgIGNvbnN0IHU4ICpzZWNyZXQsIHNpemVfdCBzZWNyZXRfbGVuLAorCQkJICAgdTggKmVidWYsIHNpemVfdCAqZWxlbikKK3sKKwlpbnQgaSwgbGVuLCBmaXJzdCA9IDE7CisJdTggaGFzaFtNRDVfTUFDX0xFTl0sIHNhbHRidWZbMl0sICpwb3M7CisJY29uc3QgdTggKmFkZHJbM107CisJc2l6ZV90IF9sZW5bM107CisKKwlXUEFfUFVUX0JFMTYoc2FsdGJ1Ziwgc2FsdCk7CisKKwlsZW4gPSAxICsga2V5X2xlbjsKKwlpZiAobGVuICYgMHgwZikgeworCQlsZW4gPSAobGVuICYgMHhmMCkgKyAxNjsKKwl9CisJb3NfbWVtc2V0KGVidWYsIDAsIGxlbik7CisJZWJ1ZlswXSA9IGtleV9sZW47CisJb3NfbWVtY3B5KGVidWYgKyAxLCBrZXksIGtleV9sZW4pOworCisJKmVsZW4gPSBsZW47CisKKwlwb3MgPSBlYnVmOworCXdoaWxlIChsZW4gPiAwKSB7CisJCS8qIGIoMSkgPSBNRDUoU2VjcmV0ICsgUmVxdWVzdC1BdXRoZW50aWNhdG9yICsgU2FsdCkKKwkJICogYihpKSA9IE1ENShTZWNyZXQgKyBjKGkgLSAxKSkgZm9yIGkgPiAxICovCisJCWFkZHJbMF0gPSBzZWNyZXQ7CisJCV9sZW5bMF0gPSBzZWNyZXRfbGVuOworCQlpZiAoZmlyc3QpIHsKKwkJCWFkZHJbMV0gPSByZXFfYXV0aGVudGljYXRvcjsKKwkJCV9sZW5bMV0gPSBNRDVfTUFDX0xFTjsKKwkJCWFkZHJbMl0gPSBzYWx0YnVmOworCQkJX2xlblsyXSA9IHNpemVvZihzYWx0YnVmKTsKKwkJfSBlbHNlIHsKKwkJCWFkZHJbMV0gPSBwb3MgLSBNRDVfTUFDX0xFTjsKKwkJCV9sZW5bMV0gPSBNRDVfTUFDX0xFTjsKKwkJfQorCQltZDVfdmVjdG9yKGZpcnN0ID8gMyA6IDIsIGFkZHIsIF9sZW4sIGhhc2gpOworCQlmaXJzdCA9IDA7CisKKwkJZm9yIChpID0gMDsgaSA8IE1ENV9NQUNfTEVOOyBpKyspCisJCQkqcG9zKysgXj0gaGFzaFtpXTsKKworCQlsZW4gLT0gTUQ1X01BQ19MRU47CisJfQorfQorCisKK3N0cnVjdCByYWRpdXNfbXNfbXBwZV9rZXlzICoKK3JhZGl1c19tc2dfZ2V0X21zX2tleXMoc3RydWN0IHJhZGl1c19tc2cgKm1zZywgc3RydWN0IHJhZGl1c19tc2cgKnNlbnRfbXNnLAorCQkgICAgICAgY29uc3QgdTggKnNlY3JldCwgc2l6ZV90IHNlY3JldF9sZW4pCit7CisJdTggKmtleTsKKwlzaXplX3Qga2V5bGVuOworCXN0cnVjdCByYWRpdXNfbXNfbXBwZV9rZXlzICprZXlzOworCisJaWYgKG1zZyA9PSBOVUxMIHx8IHNlbnRfbXNnID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJa2V5cyA9IG9zX3phbGxvYyhzaXplb2YoKmtleXMpKTsKKwlpZiAoa2V5cyA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWtleSA9IHJhZGl1c19tc2dfZ2V0X3ZlbmRvcl9hdHRyKG1zZywgUkFESVVTX1ZFTkRPUl9JRF9NSUNST1NPRlQsCisJCQkJCSBSQURJVVNfVkVORE9SX0FUVFJfTVNfTVBQRV9TRU5EX0tFWSwKKwkJCQkJICZrZXlsZW4pOworCWlmIChrZXkpIHsKKwkJa2V5cy0+c2VuZCA9IGRlY3J5cHRfbXNfa2V5KGtleSwga2V5bGVuLAorCQkJCQkgICAgc2VudF9tc2ctPmhkci0+YXV0aGVudGljYXRvciwKKwkJCQkJICAgIHNlY3JldCwgc2VjcmV0X2xlbiwKKwkJCQkJICAgICZrZXlzLT5zZW5kX2xlbik7CisJCW9zX2ZyZWUoa2V5KTsKKwl9CisKKwlrZXkgPSByYWRpdXNfbXNnX2dldF92ZW5kb3JfYXR0cihtc2csIFJBRElVU19WRU5ET1JfSURfTUlDUk9TT0ZULAorCQkJCQkgUkFESVVTX1ZFTkRPUl9BVFRSX01TX01QUEVfUkVDVl9LRVksCisJCQkJCSAma2V5bGVuKTsKKwlpZiAoa2V5KSB7CisJCWtleXMtPnJlY3YgPSBkZWNyeXB0X21zX2tleShrZXksIGtleWxlbiwKKwkJCQkJICAgIHNlbnRfbXNnLT5oZHItPmF1dGhlbnRpY2F0b3IsCisJCQkJCSAgICBzZWNyZXQsIHNlY3JldF9sZW4sCisJCQkJCSAgICAma2V5cy0+cmVjdl9sZW4pOworCQlvc19mcmVlKGtleSk7CisJfQorCisJcmV0dXJuIGtleXM7Cit9CisKKworc3RydWN0IHJhZGl1c19tc19tcHBlX2tleXMgKgorcmFkaXVzX21zZ19nZXRfY2lzY29fa2V5cyhzdHJ1Y3QgcmFkaXVzX21zZyAqbXNnLCBzdHJ1Y3QgcmFkaXVzX21zZyAqc2VudF9tc2csCisJCQkgIGNvbnN0IHU4ICpzZWNyZXQsIHNpemVfdCBzZWNyZXRfbGVuKQoreworCXU4ICprZXk7CisJc2l6ZV90IGtleWxlbjsKKwlzdHJ1Y3QgcmFkaXVzX21zX21wcGVfa2V5cyAqa2V5czsKKworCWlmIChtc2cgPT0gTlVMTCB8fCBzZW50X21zZyA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWtleXMgPSBvc196YWxsb2Moc2l6ZW9mKCprZXlzKSk7CisJaWYgKGtleXMgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlrZXkgPSByYWRpdXNfbXNnX2dldF92ZW5kb3JfYXR0cihtc2csIFJBRElVU19WRU5ET1JfSURfQ0lTQ08sCisJCQkJCSBSQURJVVNfQ0lTQ09fQVZfUEFJUiwgJmtleWxlbik7CisJaWYgKGtleSAmJiBrZXlsZW4gPT0gNTEgJiYKKwkgICAgb3NfbWVtY21wKGtleSwgImxlYXA6c2Vzc2lvbi1rZXk9IiwgMTcpID09IDApIHsKKwkJa2V5cy0+cmVjdiA9IGRlY3J5cHRfbXNfa2V5KGtleSArIDE3LCBrZXlsZW4gLSAxNywKKwkJCQkJICAgIHNlbnRfbXNnLT5oZHItPmF1dGhlbnRpY2F0b3IsCisJCQkJCSAgICBzZWNyZXQsIHNlY3JldF9sZW4sCisJCQkJCSAgICAma2V5cy0+cmVjdl9sZW4pOworCX0KKwlvc19mcmVlKGtleSk7CisKKwlyZXR1cm4ga2V5czsKK30KKworCitpbnQgcmFkaXVzX21zZ19hZGRfbXBwZV9rZXlzKHN0cnVjdCByYWRpdXNfbXNnICptc2csCisJCQkgICAgIGNvbnN0IHU4ICpyZXFfYXV0aGVudGljYXRvciwKKwkJCSAgICAgY29uc3QgdTggKnNlY3JldCwgc2l6ZV90IHNlY3JldF9sZW4sCisJCQkgICAgIGNvbnN0IHU4ICpzZW5kX2tleSwgc2l6ZV90IHNlbmRfa2V5X2xlbiwKKwkJCSAgICAgY29uc3QgdTggKnJlY3Zfa2V5LCBzaXplX3QgcmVjdl9rZXlfbGVuKQoreworCXN0cnVjdCByYWRpdXNfYXR0cl9oZHIgKmF0dHI7CisJdTMyIHZlbmRvcl9pZCA9IGh0b25sKFJBRElVU19WRU5ET1JfSURfTUlDUk9TT0ZUKTsKKwl1OCAqYnVmOworCXN0cnVjdCByYWRpdXNfYXR0cl92ZW5kb3IgKnZoZHI7CisJdTggKnBvczsKKwlzaXplX3QgZWxlbjsKKwlpbnQgaGxlbjsKKwl1MTYgc2FsdDsKKworCWhsZW4gPSBzaXplb2YodmVuZG9yX2lkKSArIHNpemVvZigqdmhkcikgKyAyOworCisJLyogTVMtTVBQRS1TZW5kLUtleSAqLworCWJ1ZiA9IG9zX21hbGxvYyhobGVuICsgc2VuZF9rZXlfbGVuICsgMTYpOworCWlmIChidWYgPT0gTlVMTCkgeworCQlyZXR1cm4gMDsKKwl9CisJcG9zID0gYnVmOworCW9zX21lbWNweShwb3MsICZ2ZW5kb3JfaWQsIHNpemVvZih2ZW5kb3JfaWQpKTsKKwlwb3MgKz0gc2l6ZW9mKHZlbmRvcl9pZCk7CisJdmhkciA9IChzdHJ1Y3QgcmFkaXVzX2F0dHJfdmVuZG9yICopIHBvczsKKwl2aGRyLT52ZW5kb3JfdHlwZSA9IFJBRElVU19WRU5ET1JfQVRUUl9NU19NUFBFX1NFTkRfS0VZOworCXBvcyA9ICh1OCAqKSAodmhkciArIDEpOworCXNhbHQgPSBvc19yYW5kb20oKSB8IDB4ODAwMDsKKwlXUEFfUFVUX0JFMTYocG9zLCBzYWx0KTsKKwlwb3MgKz0gMjsKKwllbmNyeXB0X21zX2tleShzZW5kX2tleSwgc2VuZF9rZXlfbGVuLCBzYWx0LCByZXFfYXV0aGVudGljYXRvciwgc2VjcmV0LAorCQkgICAgICAgc2VjcmV0X2xlbiwgcG9zLCAmZWxlbik7CisJdmhkci0+dmVuZG9yX2xlbmd0aCA9IGhsZW4gKyBlbGVuIC0gc2l6ZW9mKHZlbmRvcl9pZCk7CisKKwlhdHRyID0gcmFkaXVzX21zZ19hZGRfYXR0cihtc2csIFJBRElVU19BVFRSX1ZFTkRPUl9TUEVDSUZJQywKKwkJCQkgICBidWYsIGhsZW4gKyBlbGVuKTsKKwlvc19mcmVlKGJ1Zik7CisJaWYgKGF0dHIgPT0gTlVMTCkgeworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBNUy1NUFBFLVJlY3YtS2V5ICovCisJYnVmID0gb3NfbWFsbG9jKGhsZW4gKyBzZW5kX2tleV9sZW4gKyAxNik7CisJaWYgKGJ1ZiA9PSBOVUxMKSB7CisJCXJldHVybiAwOworCX0KKwlwb3MgPSBidWY7CisJb3NfbWVtY3B5KHBvcywgJnZlbmRvcl9pZCwgc2l6ZW9mKHZlbmRvcl9pZCkpOworCXBvcyArPSBzaXplb2YodmVuZG9yX2lkKTsKKwl2aGRyID0gKHN0cnVjdCByYWRpdXNfYXR0cl92ZW5kb3IgKikgcG9zOworCXZoZHItPnZlbmRvcl90eXBlID0gUkFESVVTX1ZFTkRPUl9BVFRSX01TX01QUEVfUkVDVl9LRVk7CisJcG9zID0gKHU4ICopICh2aGRyICsgMSk7CisJc2FsdCBePSAxOworCVdQQV9QVVRfQkUxNihwb3MsIHNhbHQpOworCXBvcyArPSAyOworCWVuY3J5cHRfbXNfa2V5KHJlY3Zfa2V5LCByZWN2X2tleV9sZW4sIHNhbHQsIHJlcV9hdXRoZW50aWNhdG9yLCBzZWNyZXQsCisJCSAgICAgICBzZWNyZXRfbGVuLCBwb3MsICZlbGVuKTsKKwl2aGRyLT52ZW5kb3JfbGVuZ3RoID0gaGxlbiArIGVsZW4gLSBzaXplb2YodmVuZG9yX2lkKTsKKworCWF0dHIgPSByYWRpdXNfbXNnX2FkZF9hdHRyKG1zZywgUkFESVVTX0FUVFJfVkVORE9SX1NQRUNJRklDLAorCQkJCSAgIGJ1ZiwgaGxlbiArIGVsZW4pOworCW9zX2ZyZWUoYnVmKTsKKwlpZiAoYXR0ciA9PSBOVUxMKSB7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCisKKy8qIEFkZCBVc2VyLVBhc3N3b3JkIGF0dHJpYnV0ZSB0byBhIFJBRElVUyBtZXNzYWdlIGFuZCBlbmNyeXB0IGl0IGFzIHNwZWNpZmllZAorICogaW4gUkZDIDI4NjUsIENoYXAuIDUuMiAqLworc3RydWN0IHJhZGl1c19hdHRyX2hkciAqCityYWRpdXNfbXNnX2FkZF9hdHRyX3VzZXJfcGFzc3dvcmQoc3RydWN0IHJhZGl1c19tc2cgKm1zZywKKwkJCQkgIGNvbnN0IHU4ICpkYXRhLCBzaXplX3QgZGF0YV9sZW4sCisJCQkJICBjb25zdCB1OCAqc2VjcmV0LCBzaXplX3Qgc2VjcmV0X2xlbikKK3sKKwl1OCBidWZbMTI4XTsKKwlpbnQgcGFkbGVuLCBpOworCXNpemVfdCBidWZfbGVuLCBwb3M7CisJY29uc3QgdTggKmFkZHJbMl07CisJc2l6ZV90IGxlblsyXTsKKwl1OCBoYXNoWzE2XTsKKworCWlmIChkYXRhX2xlbiA+IDEyOCkKKwkJcmV0dXJuIE5VTEw7CisKKwlvc19tZW1jcHkoYnVmLCBkYXRhLCBkYXRhX2xlbik7CisJYnVmX2xlbiA9IGRhdGFfbGVuOworCisJcGFkbGVuID0gZGF0YV9sZW4gJSAxNjsKKwlpZiAocGFkbGVuKSB7CisJCXBhZGxlbiA9IDE2IC0gcGFkbGVuOworCQlvc19tZW1zZXQoYnVmICsgZGF0YV9sZW4sIDAsIHBhZGxlbik7CisJCWJ1Zl9sZW4gKz0gcGFkbGVuOworCX0KKworCWFkZHJbMF0gPSBzZWNyZXQ7CisJbGVuWzBdID0gc2VjcmV0X2xlbjsKKwlhZGRyWzFdID0gbXNnLT5oZHItPmF1dGhlbnRpY2F0b3I7CisJbGVuWzFdID0gMTY7CisJbWQ1X3ZlY3RvcigyLCBhZGRyLCBsZW4sIGhhc2gpOworCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCWJ1ZltpXSBePSBoYXNoW2ldOworCXBvcyA9IDE2OworCisJd2hpbGUgKHBvcyA8IGJ1Zl9sZW4pIHsKKwkJYWRkclswXSA9IHNlY3JldDsKKwkJbGVuWzBdID0gc2VjcmV0X2xlbjsKKwkJYWRkclsxXSA9ICZidWZbcG9zIC0gMTZdOworCQlsZW5bMV0gPSAxNjsKKwkJbWQ1X3ZlY3RvcigyLCBhZGRyLCBsZW4sIGhhc2gpOworCisJCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCQkJYnVmW3BvcyArIGldIF49IGhhc2hbaV07CisKKwkJcG9zICs9IDE2OworCX0KKworCXJldHVybiByYWRpdXNfbXNnX2FkZF9hdHRyKG1zZywgUkFESVVTX0FUVFJfVVNFUl9QQVNTV09SRCwKKwkJCQkgICBidWYsIGJ1Zl9sZW4pOworfQorCisKK2ludCByYWRpdXNfbXNnX2dldF9hdHRyKHN0cnVjdCByYWRpdXNfbXNnICptc2csIHU4IHR5cGUsIHU4ICpidWYsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IHJhZGl1c19hdHRyX2hkciAqYXR0ciA9IE5VTEwsICp0bXA7CisJc2l6ZV90IGksIGRsZW47CisKKwlmb3IgKGkgPSAwOyBpIDwgbXNnLT5hdHRyX3VzZWQ7IGkrKykgeworCQl0bXAgPSByYWRpdXNfZ2V0X2F0dHJfaGRyKG1zZywgaSk7CisJCWlmICh0bXAtPnR5cGUgPT0gdHlwZSkgeworCQkJYXR0ciA9IHRtcDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCFhdHRyKQorCQlyZXR1cm4gLTE7CisKKwlkbGVuID0gYXR0ci0+bGVuZ3RoIC0gc2l6ZW9mKCphdHRyKTsKKwlpZiAoYnVmKQorCQlvc19tZW1jcHkoYnVmLCAoYXR0ciArIDEpLCBkbGVuID4gbGVuID8gbGVuIDogZGxlbik7CisJcmV0dXJuIGRsZW47Cit9CisKKworaW50IHJhZGl1c19tc2dfZ2V0X2F0dHJfcHRyKHN0cnVjdCByYWRpdXNfbXNnICptc2csIHU4IHR5cGUsIHU4ICoqYnVmLAorCQkJICAgIHNpemVfdCAqbGVuLCBjb25zdCB1OCAqc3RhcnQpCit7CisJc2l6ZV90IGk7CisJc3RydWN0IHJhZGl1c19hdHRyX2hkciAqYXR0ciA9IE5VTEwsICp0bXA7CisKKwlmb3IgKGkgPSAwOyBpIDwgbXNnLT5hdHRyX3VzZWQ7IGkrKykgeworCQl0bXAgPSByYWRpdXNfZ2V0X2F0dHJfaGRyKG1zZywgaSk7CisJCWlmICh0bXAtPnR5cGUgPT0gdHlwZSAmJgorCQkgICAgKHN0YXJ0ID09IE5VTEwgfHwgKHU4ICopIHRtcCA+IHN0YXJ0KSkgeworCQkJYXR0ciA9IHRtcDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCFhdHRyKQorCQlyZXR1cm4gLTE7CisKKwkqYnVmID0gKHU4ICopIChhdHRyICsgMSk7CisJKmxlbiA9IGF0dHItPmxlbmd0aCAtIHNpemVvZigqYXR0cik7CisJcmV0dXJuIDA7Cit9CisKKworaW50IHJhZGl1c19tc2dfY291bnRfYXR0cihzdHJ1Y3QgcmFkaXVzX21zZyAqbXNnLCB1OCB0eXBlLCBpbnQgbWluX2xlbikKK3sKKwlzaXplX3QgaTsKKwlpbnQgY291bnQ7CisKKwlmb3IgKGNvdW50ID0gMCwgaSA9IDA7IGkgPCBtc2ctPmF0dHJfdXNlZDsgaSsrKSB7CisJCXN0cnVjdCByYWRpdXNfYXR0cl9oZHIgKmF0dHIgPSByYWRpdXNfZ2V0X2F0dHJfaGRyKG1zZywgaSk7CisJCWlmIChhdHRyLT50eXBlID09IHR5cGUgJiYKKwkJICAgIGF0dHItPmxlbmd0aCA+PSBzaXplb2Yoc3RydWN0IHJhZGl1c19hdHRyX2hkcikgKyBtaW5fbGVuKQorCQkJY291bnQrKzsKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisKKworc3RydWN0IHJhZGl1c190dW5uZWxfYXR0cnMgeworCWludCB0YWdfdXNlZDsKKwlpbnQgdHlwZTsgLyogVHVubmVsLVR5cGUgKi8KKwlpbnQgbWVkaXVtX3R5cGU7IC8qIFR1bm5lbC1NZWRpdW0tVHlwZSAqLworCWludCB2bGFuaWQ7Cit9OworCisKKy8qKgorICogcmFkaXVzX21zZ19nZXRfdmxhbmlkIC0gUGFyc2UgUkFESVVTIGF0dHJpYnV0ZXMgZm9yIFZMQU4gdHVubmVsIGluZm9ybWF0aW9uCisgKiBAbXNnOiBSQURJVVMgbWVzc2FnZQorICogUmV0dXJuczogVkxBTiBJRCBmb3IgdGhlIGZpcnN0IHR1bm5lbCBjb25maWd1cmF0aW9uIG9mIC0xIGlmIG5vbmUgaXMgZm91bmQKKyAqLworaW50IHJhZGl1c19tc2dfZ2V0X3ZsYW5pZChzdHJ1Y3QgcmFkaXVzX21zZyAqbXNnKQoreworCXN0cnVjdCByYWRpdXNfdHVubmVsX2F0dHJzIHR1bm5lbFtSQURJVVNfVFVOTkVMX1RBR1NdLCAqdHVuOworCXNpemVfdCBpOworCXN0cnVjdCByYWRpdXNfYXR0cl9oZHIgKmF0dHIgPSBOVUxMOworCWNvbnN0IHU4ICpkYXRhOworCWNoYXIgYnVmWzEwXTsKKwlzaXplX3QgZGxlbjsKKworCW9zX21lbXNldCgmdHVubmVsLCAwLCBzaXplb2YodHVubmVsKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbXNnLT5hdHRyX3VzZWQ7IGkrKykgeworCQlhdHRyID0gcmFkaXVzX2dldF9hdHRyX2hkcihtc2csIGkpOworCQlkYXRhID0gKGNvbnN0IHU4ICopIChhdHRyICsgMSk7CisJCWRsZW4gPSBhdHRyLT5sZW5ndGggLSBzaXplb2YoKmF0dHIpOworCQlpZiAoYXR0ci0+bGVuZ3RoIDwgMykKKwkJCWNvbnRpbnVlOworCQlpZiAoZGF0YVswXSA+PSBSQURJVVNfVFVOTkVMX1RBR1MpCisJCQl0dW4gPSAmdHVubmVsWzBdOworCQllbHNlCisJCQl0dW4gPSAmdHVubmVsW2RhdGFbMF1dOworCisJCXN3aXRjaCAoYXR0ci0+dHlwZSkgeworCQljYXNlIFJBRElVU19BVFRSX1RVTk5FTF9UWVBFOgorCQkJaWYgKGF0dHItPmxlbmd0aCAhPSA2KQorCQkJCWJyZWFrOworCQkJdHVuLT50YWdfdXNlZCsrOworCQkJdHVuLT50eXBlID0gV1BBX0dFVF9CRTI0KGRhdGEgKyAxKTsKKwkJCWJyZWFrOworCQljYXNlIFJBRElVU19BVFRSX1RVTk5FTF9NRURJVU1fVFlQRToKKwkJCWlmIChhdHRyLT5sZW5ndGggIT0gNikKKwkJCQlicmVhazsKKwkJCXR1bi0+dGFnX3VzZWQrKzsKKwkJCXR1bi0+bWVkaXVtX3R5cGUgPSBXUEFfR0VUX0JFMjQoZGF0YSArIDEpOworCQkJYnJlYWs7CisJCWNhc2UgUkFESVVTX0FUVFJfVFVOTkVMX1BSSVZBVEVfR1JPVVBfSUQ6CisJCQlpZiAoZGF0YVswXSA8IFJBRElVU19UVU5ORUxfVEFHUykgeworCQkJCWRhdGErKzsKKwkJCQlkbGVuLS07CisJCQl9CisJCQlpZiAoZGxlbiA+PSBzaXplb2YoYnVmKSkKKwkJCQlicmVhazsKKwkJCW9zX21lbWNweShidWYsIGRhdGEsIGRsZW4pOworCQkJYnVmW2RsZW5dID0gJ1wwJzsKKwkJCXR1bi0+dGFnX3VzZWQrKzsKKwkJCXR1bi0+dmxhbmlkID0gYXRvaShidWYpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgUkFESVVTX1RVTk5FTF9UQUdTOyBpKyspIHsKKwkJdHVuID0gJnR1bm5lbFtpXTsKKwkJaWYgKHR1bi0+dGFnX3VzZWQgJiYKKwkJICAgIHR1bi0+dHlwZSA9PSBSQURJVVNfVFVOTkVMX1RZUEVfVkxBTiAmJgorCQkgICAgdHVuLT5tZWRpdW1fdHlwZSA9PSBSQURJVVNfVFVOTkVMX01FRElVTV9UWVBFXzgwMiAmJgorCQkgICAgdHVuLT52bGFuaWQgPiAwKQorCQkJcmV0dXJuIHR1bi0+dmxhbmlkOworCX0KKworCXJldHVybiAtMTsKK30KKworCit2b2lkIHJhZGl1c19mcmVlX2NsYXNzKHN0cnVjdCByYWRpdXNfY2xhc3NfZGF0YSAqYykKK3sKKwlzaXplX3QgaTsKKwlpZiAoYyA9PSBOVUxMKQorCQlyZXR1cm47CisJZm9yIChpID0gMDsgaSA8IGMtPmNvdW50OyBpKyspCisJCW9zX2ZyZWUoYy0+YXR0cltpXS5kYXRhKTsKKwlvc19mcmVlKGMtPmF0dHIpOworCWMtPmF0dHIgPSBOVUxMOworCWMtPmNvdW50ID0gMDsKK30KKworCitpbnQgcmFkaXVzX2NvcHlfY2xhc3Moc3RydWN0IHJhZGl1c19jbGFzc19kYXRhICpkc3QsCisJCSAgICAgIGNvbnN0IHN0cnVjdCByYWRpdXNfY2xhc3NfZGF0YSAqc3JjKQoreworCXNpemVfdCBpOworCisJaWYgKHNyYy0+YXR0ciA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCWRzdC0+YXR0ciA9IG9zX3phbGxvYyhzcmMtPmNvdW50ICogc2l6ZW9mKHN0cnVjdCByYWRpdXNfYXR0cl9kYXRhKSk7CisJaWYgKGRzdC0+YXR0ciA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlkc3QtPmNvdW50ID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBzcmMtPmNvdW50OyBpKyspIHsKKwkJZHN0LT5hdHRyW2ldLmRhdGEgPSBvc19tYWxsb2Moc3JjLT5hdHRyW2ldLmxlbik7CisJCWlmIChkc3QtPmF0dHJbaV0uZGF0YSA9PSBOVUxMKQorCQkJYnJlYWs7CisJCWRzdC0+Y291bnQrKzsKKwkJb3NfbWVtY3B5KGRzdC0+YXR0cltpXS5kYXRhLCBzcmMtPmF0dHJbaV0uZGF0YSwKKwkJCSAgc3JjLT5hdHRyW2ldLmxlbik7CisJCWRzdC0+YXR0cltpXS5sZW4gPSBzcmMtPmF0dHJbaV0ubGVuOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9hcHBfcmFkZ3cvcmFkaXVzLmggYi9leHRlbnNpb25zL2FwcF9yYWRndy9yYWRpdXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjc4NDcyCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9hcHBfcmFkZ3cvcmFkaXVzLmgKQEAgLTAsMCArMSwzMzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDEzLCBXSURFIFByb2plY3QgYW5kIE5JQ1QJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFdJREUgUHJvamVjdCBvciBOSUNUIG5vciB0aGUgCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgV0lERSBQcm9qZWN0IGFuZCAJCQkJCQkgKgorKiAgIE5JQ1QuCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGZyZWVEaWFtZXRlciBhdXRob3Igbm90ZToKKyAqICBUaGUgY29udGVudCBmcm9tIHRoaXMgZmlsZSBjb21lcyBtb3N0bHkgZnJvbSB0aGUgaG9zdGFwIHByb2plY3QuCisgKiBJdCBpcyByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQlNEIGxpY2Vuc2UsIGFzIGFsbG93ZWQKKyAqIGJ5IHRoZSBvcmlnaW5hbCBjb3B5cmlnaHQgcmVwcm9kdWNlZCBiZWxvdy4KKyAqIFRoZSBjaGFuZ2VzIHRvIHRoaXMgZmlsZSBhcmUgcGxhY2VkIHVuZGVyIHRoZSBjb3B5cmlnaHQgb2YgdGhlIGZyZWVEaWFtZXRlciBwcm9qZWN0LgorICovCisKKy8qCisgKiBob3N0YXBkIC8gUkFESVVTIG1lc3NhZ2UgcHJvY2Vzc2luZworICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDcsIEpvdW5pIE1hbGluZW4gPGpAdzEuZmk+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgQlNECisgKiBsaWNlbnNlLgorICoKKyAqIFNlZSBSRUFETUUgYW5kIENPUFlJTkcgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIFJBRElVU19ICisjZGVmaW5lIFJBRElVU19ICisKKy8qIFJGQyAyODY1IC0gUkFESVVTICovCisKKyNpZmRlZiBfTVNDX1ZFUgorI3ByYWdtYSBwYWNrKHB1c2gsIDEpCisjZW5kaWYgLyogX01TQ19WRVIgKi8KKworc3RydWN0IHJhZGl1c19oZHIgeworCXU4IGNvZGU7CisJdTggaWRlbnRpZmllcjsKKwl1MTYgbGVuZ3RoOyAvKiBpbmNsdWRpbmcgdGhpcyBoZWFkZXIgKi8KKwl1OCBhdXRoZW50aWNhdG9yWzE2XTsKKwkvKiBmb2xsb3dlZCBieSBsZW5ndGgtMjAgb2N0ZXRzIG9mIGF0dHJpYnV0ZXMgKi8KK30gU1RSVUNUX1BBQ0tFRDsKKworZW51bSB7IFJBRElVU19DT0RFX0FDQ0VTU19SRVFVRVNUID0gMSwKKyAgICAgICBSQURJVVNfQ09ERV9BQ0NFU1NfQUNDRVBUID0gMiwKKyAgICAgICBSQURJVVNfQ09ERV9BQ0NFU1NfUkVKRUNUID0gMywKKyAgICAgICBSQURJVVNfQ09ERV9BQ0NPVU5USU5HX1JFUVVFU1QgPSA0LAorICAgICAgIFJBRElVU19DT0RFX0FDQ09VTlRJTkdfUkVTUE9OU0UgPSA1LAorICAgICAgIFJBRElVU19DT0RFX0FDQ0VTU19DSEFMTEVOR0UgPSAxMSwKKyAgICAgICBSQURJVVNfQ09ERV9TVEFUVVNfU0VSVkVSID0gMTIsCisgICAgICAgUkFESVVTX0NPREVfU1RBVFVTX0NMSUVOVCA9IDEzLAorICAgICAgIFJBRElVU19DT0RFX1JFU0VSVkVEID0gMjU1Cit9OworCitzdHJ1Y3QgcmFkaXVzX2F0dHJfaGRyIHsKKwl1OCB0eXBlOworCXU4IGxlbmd0aDsgLyogaW5jbHVkaW5nIHRoaXMgaGVhZGVyICovCisJLyogZm9sbG93ZWQgYnkgbGVuZ3RoLTIgb2N0ZXRzIG9mIGF0dHJpYnV0ZSB2YWx1ZSAqLworfSBTVFJVQ1RfUEFDS0VEOworCisjZGVmaW5lIFJBRElVU19NQVhfQVRUUl9MRU4gKDI1NSAtIHNpemVvZihzdHJ1Y3QgcmFkaXVzX2F0dHJfaGRyKSkKKworZW51bSB7IFJBRElVU19BVFRSX1VTRVJfTkFNRSA9IDEsCisgICAgICAgUkFESVVTX0FUVFJfVVNFUl9QQVNTV09SRCA9IDIsCisgICAgICAgUkFESVVTX0FUVFJfTkFTX0lQX0FERFJFU1MgPSA0LAorICAgICAgIFJBRElVU19BVFRSX05BU19QT1JUID0gNSwKKyAgICAgICBSQURJVVNfQVRUUl9GUkFNRURfTVRVID0gMTIsCisgICAgICAgUkFESVVTX0FUVFJfUkVQTFlfTUVTU0FHRSA9IDE4LAorICAgICAgIFJBRElVU19BVFRSX1NUQVRFID0gMjQsCisgICAgICAgUkFESVVTX0FUVFJfQ0xBU1MgPSAyNSwKKyAgICAgICBSQURJVVNfQVRUUl9WRU5ET1JfU1BFQ0lGSUMgPSAyNiwKKyAgICAgICBSQURJVVNfQVRUUl9TRVNTSU9OX1RJTUVPVVQgPSAyNywKKyAgICAgICBSQURJVVNfQVRUUl9JRExFX1RJTUVPVVQgPSAyOCwKKyAgICAgICBSQURJVVNfQVRUUl9URVJNSU5BVElPTl9BQ1RJT04gPSAyOSwKKyAgICAgICBSQURJVVNfQVRUUl9DQUxMRURfU1RBVElPTl9JRCA9IDMwLAorICAgICAgIFJBRElVU19BVFRSX0NBTExJTkdfU1RBVElPTl9JRCA9IDMxLAorICAgICAgIFJBRElVU19BVFRSX05BU19JREVOVElGSUVSID0gMzIsCisgICAgICAgUkFESVVTX0FUVFJfUFJPWFlfU1RBVEUgPSAzMywKKyAgICAgICBSQURJVVNfQVRUUl9BQ0NUX1NUQVRVU19UWVBFID0gNDAsCisgICAgICAgUkFESVVTX0FUVFJfQUNDVF9ERUxBWV9USU1FID0gNDEsCisgICAgICAgUkFESVVTX0FUVFJfQUNDVF9JTlBVVF9PQ1RFVFMgPSA0MiwKKyAgICAgICBSQURJVVNfQVRUUl9BQ0NUX09VVFBVVF9PQ1RFVFMgPSA0MywKKyAgICAgICBSQURJVVNfQVRUUl9BQ0NUX1NFU1NJT05fSUQgPSA0NCwKKyAgICAgICBSQURJVVNfQVRUUl9BQ0NUX0FVVEhFTlRJQyA9IDQ1LAorICAgICAgIFJBRElVU19BVFRSX0FDQ1RfU0VTU0lPTl9USU1FID0gNDYsCisgICAgICAgUkFESVVTX0FUVFJfQUNDVF9JTlBVVF9QQUNLRVRTID0gNDcsCisgICAgICAgUkFESVVTX0FUVFJfQUNDVF9PVVRQVVRfUEFDS0VUUyA9IDQ4LAorICAgICAgIFJBRElVU19BVFRSX0FDQ1RfVEVSTUlOQVRFX0NBVVNFID0gNDksCisgICAgICAgUkFESVVTX0FUVFJfQUNDVF9NVUxUSV9TRVNTSU9OX0lEID0gNTAsCisgICAgICAgUkFESVVTX0FUVFJfQUNDVF9MSU5LX0NPVU5UID0gNTEsCisgICAgICAgUkFESVVTX0FUVFJfQUNDVF9JTlBVVF9HSUdBV09SRFMgPSA1MiwKKyAgICAgICBSQURJVVNfQVRUUl9BQ0NUX09VVFBVVF9HSUdBV09SRFMgPSA1MywKKyAgICAgICBSQURJVVNfQVRUUl9FVkVOVF9USU1FU1RBTVAgPSA1NSwKKyAgICAgICBSQURJVVNfQVRUUl9OQVNfUE9SVF9UWVBFID0gNjEsCisgICAgICAgUkFESVVTX0FUVFJfVFVOTkVMX1RZUEUgPSA2NCwKKyAgICAgICBSQURJVVNfQVRUUl9UVU5ORUxfTUVESVVNX1RZUEUgPSA2NSwKKyAgICAgICBSQURJVVNfQVRUUl9DT05ORUNUX0lORk8gPSA3NywKKyAgICAgICBSQURJVVNfQVRUUl9FQVBfTUVTU0FHRSA9IDc5LAorICAgICAgIFJBRElVU19BVFRSX01FU1NBR0VfQVVUSEVOVElDQVRPUiA9IDgwLAorICAgICAgIFJBRElVU19BVFRSX1RVTk5FTF9QUklWQVRFX0dST1VQX0lEID0gODEsCisgICAgICAgUkFESVVTX0FUVFJfQUNDVF9JTlRFUklNX0lOVEVSVkFMID0gODUsCisgICAgICAgUkFESVVTX0FUVFJfQ0hBUkdFQUJMRV9VU0VSX0lERU5USVRZID0gODksCisgICAgICAgUkFESVVTX0FUVFJfTkFTX0lQVjZfQUREUkVTUyA9IDk1Cit9OworCisKKy8qIFRlcm1pbmF0aW9uLUFjdGlvbiAqLworI2RlZmluZSBSQURJVVNfVEVSTUlOQVRJT05fQUNUSU9OX0RFRkFVTFQgMAorI2RlZmluZSBSQURJVVNfVEVSTUlOQVRJT05fQUNUSU9OX1JBRElVU19SRVFVRVNUIDEKKworLyogTkFTLVBvcnQtVHlwZSAqLworI2RlZmluZSBSQURJVVNfTkFTX1BPUlRfVFlQRV9JRUVFXzgwMl8xMSAxOQorCisvKiBBY2N0LVN0YXR1cy1UeXBlICovCisjZGVmaW5lIFJBRElVU19BQ0NUX1NUQVRVU19UWVBFX1NUQVJUIDEKKyNkZWZpbmUgUkFESVVTX0FDQ1RfU1RBVFVTX1RZUEVfU1RPUCAyCisjZGVmaW5lIFJBRElVU19BQ0NUX1NUQVRVU19UWVBFX0lOVEVSSU1fVVBEQVRFIDMKKyNkZWZpbmUgUkFESVVTX0FDQ1RfU1RBVFVTX1RZUEVfQUNDT1VOVElOR19PTiA3CisjZGVmaW5lIFJBRElVU19BQ0NUX1NUQVRVU19UWVBFX0FDQ09VTlRJTkdfT0ZGIDgKKworLyogQWNjdC1BdXRoZW50aWMgKi8KKyNkZWZpbmUgUkFESVVTX0FDQ1RfQVVUSEVOVElDX1JBRElVUyAxCisjZGVmaW5lIFJBRElVU19BQ0NUX0FVVEhFTlRJQ19MT0NBTCAyCisjZGVmaW5lIFJBRElVU19BQ0NUX0FVVEhFTlRJQ19SRU1PVEUgMworCisvKiBBY2N0LVRlcm1pbmF0ZS1DYXVzZSAqLworI2RlZmluZSBSQURJVVNfQUNDVF9URVJNSU5BVEVfQ0FVU0VfVVNFUl9SRVFVRVNUIDEKKyNkZWZpbmUgUkFESVVTX0FDQ1RfVEVSTUlOQVRFX0NBVVNFX0xPU1RfQ0FSUklFUiAyCisjZGVmaW5lIFJBRElVU19BQ0NUX1RFUk1JTkFURV9DQVVTRV9MT1NUX1NFUlZJQ0UgMworI2RlZmluZSBSQURJVVNfQUNDVF9URVJNSU5BVEVfQ0FVU0VfSURMRV9USU1FT1VUIDQKKyNkZWZpbmUgUkFESVVTX0FDQ1RfVEVSTUlOQVRFX0NBVVNFX1NFU1NJT05fVElNRU9VVCA1CisjZGVmaW5lIFJBRElVU19BQ0NUX1RFUk1JTkFURV9DQVVTRV9BRE1JTl9SRVNFVCA2CisjZGVmaW5lIFJBRElVU19BQ0NUX1RFUk1JTkFURV9DQVVTRV9BRE1JTl9SRUJPT1QgNworI2RlZmluZSBSQURJVVNfQUNDVF9URVJNSU5BVEVfQ0FVU0VfUE9SVF9FUlJPUiA4CisjZGVmaW5lIFJBRElVU19BQ0NUX1RFUk1JTkFURV9DQVVTRV9OQVNfRVJST1IgOQorI2RlZmluZSBSQURJVVNfQUNDVF9URVJNSU5BVEVfQ0FVU0VfTkFTX1JFUVVFU1QgMTAKKyNkZWZpbmUgUkFESVVTX0FDQ1RfVEVSTUlOQVRFX0NBVVNFX05BU19SRUJPT1QgMTEKKyNkZWZpbmUgUkFESVVTX0FDQ1RfVEVSTUlOQVRFX0NBVVNFX1BPUlRfVU5ORUVERUQgMTIKKyNkZWZpbmUgUkFESVVTX0FDQ1RfVEVSTUlOQVRFX0NBVVNFX1BPUlRfUFJFRU1QVEVEIDEzCisjZGVmaW5lIFJBRElVU19BQ0NUX1RFUk1JTkFURV9DQVVTRV9QT1JUX1NVU1BFTkRFRCAxNAorI2RlZmluZSBSQURJVVNfQUNDVF9URVJNSU5BVEVfQ0FVU0VfU0VSVklDRV9VTkFWQUlMQUJMRSAxNQorI2RlZmluZSBSQURJVVNfQUNDVF9URVJNSU5BVEVfQ0FVU0VfQ0FMTEJBQ0sgMTYKKyNkZWZpbmUgUkFESVVTX0FDQ1RfVEVSTUlOQVRFX0NBVVNFX1VTRVJfRVJST1IgMTcKKyNkZWZpbmUgUkFESVVTX0FDQ1RfVEVSTUlOQVRFX0NBVVNFX0hPU1RfUkVRVUVTVCAxOAorCisjZGVmaW5lIFJBRElVU19UVU5ORUxfVEFHUyAzMgorCisvKiBUdW5uZWwtVHlwZSAqLworI2RlZmluZSBSQURJVVNfVFVOTkVMX1RZUEVfUFBUUCAxCisjZGVmaW5lIFJBRElVU19UVU5ORUxfVFlQRV9MMlRQIDMKKyNkZWZpbmUgUkFESVVTX1RVTk5FTF9UWVBFX0lQSVAgNworI2RlZmluZSBSQURJVVNfVFVOTkVMX1RZUEVfR1JFIDEwCisjZGVmaW5lIFJBRElVU19UVU5ORUxfVFlQRV9WTEFOIDEzCisKKy8qIFR1bm5lbC1NZWRpdW0tVHlwZSAqLworI2RlZmluZSBSQURJVVNfVFVOTkVMX01FRElVTV9UWVBFX0lQVjQgMQorI2RlZmluZSBSQURJVVNfVFVOTkVMX01FRElVTV9UWVBFX0lQVjYgMgorI2RlZmluZSBSQURJVVNfVFVOTkVMX01FRElVTV9UWVBFXzgwMiA2CisKKworc3RydWN0IHJhZGl1c19hdHRyX3ZlbmRvciB7CisJdTggdmVuZG9yX3R5cGU7CisJdTggdmVuZG9yX2xlbmd0aDsKK30gU1RSVUNUX1BBQ0tFRDsKKworI2RlZmluZSBSQURJVVNfVkVORE9SX0lEX0NJU0NPIDkKKyNkZWZpbmUgUkFESVVTX0NJU0NPX0FWX1BBSVIgMQorCisvKiBSRkMgMjU0OCAtIE1pY3Jvc29mdCBWZW5kb3Itc3BlY2lmaWMgUkFESVVTIEF0dHJpYnV0ZXMgKi8KKyNkZWZpbmUgUkFESVVTX1ZFTkRPUl9JRF9NSUNST1NPRlQgMzExCisKK2VudW0geyBSQURJVVNfVkVORE9SX0FUVFJfTVNfTVBQRV9TRU5EX0tFWSA9IDE2LAorICAgICAgIFJBRElVU19WRU5ET1JfQVRUUl9NU19NUFBFX1JFQ1ZfS0VZID0gMTcKK307CisKKyNpZmRlZiBfTVNDX1ZFUgorI3ByYWdtYSBwYWNrKHBvcCkKKyNlbmRpZiAvKiBfTVNDX1ZFUiAqLworCitzdHJ1Y3QgcmFkaXVzX21zX21wcGVfa2V5cyB7CisJdTggKnNlbmQ7CisJc2l6ZV90IHNlbmRfbGVuOworCXU4ICpyZWN2OworCXNpemVfdCByZWN2X2xlbjsKK307CisKKworLyogUkFESVVTIG1lc3NhZ2Ugc3RydWN0dXJlIGZvciBuZXcgYW5kIHBhcnNlZCBtZXNzYWdlcyAqLworc3RydWN0IHJhZGl1c19tc2cgeworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKwlzaXplX3QgYnVmX3NpemU7IC8qIHRvdGFsIHNpemUgYWxsb2NhdGVkIGZvciBidWYgKi8KKwlzaXplX3QgYnVmX3VzZWQ7IC8qIGJ5dGVzIHVzZWQgaW4gYnVmICovCisKKwlzdHJ1Y3QgcmFkaXVzX2hkciAqaGRyOworCisJc2l6ZV90ICphdHRyX3BvczsgLyogYXJyYXkgb2YgaW5kZXhlcyB0byBhdHRyaWJ1dGVzIChudW1iZXIgb2YgYnl0ZXMKKwkJCSAgICogZnJvbSBidWYgdG8gdGhlIGJlZ2lubmluZyBvZgorCQkJICAgKiBzdHJ1Y3QgcmFkaXVzX2F0dHJfaGRyKS4gKi8KKwlzaXplX3QgYXR0cl9zaXplOyAvKiB0b3RhbCBzaXplIG9mIHRoZSBhdHRyaWJ1dGUgcG9pbnRlciBhcnJheSAqLworCXNpemVfdCBhdHRyX3VzZWQ7IC8qIHRvdGFsIG51bWJlciBvZiBhdHRyaWJ1dGVzIGluIHRoZSBhcnJheSAqLworfTsKKworCisvKiBEZWZhdWx0IHNpemUgdG8gYmUgYWxsb2NhdGVkIGZvciBuZXcgUkFESVVTIG1lc3NhZ2VzICovCisjZGVmaW5lIFJBRElVU19ERUZBVUxUX01TR19TSVpFIDEwMjQKKworLyogRGVmYXVsdCBzaXplIHRvIGJlIGFsbG9jYXRlZCBmb3IgYXR0cmlidXRlIGFycmF5ICovCisjZGVmaW5lIFJBRElVU19ERUZBVUxUX0FUVFJfQ09VTlQgMTYKKworCisvKiBNQUMgYWRkcmVzcyBBU0NJSSBmb3JtYXQgZm9yIElFRUUgODAyLjFYIHVzZQorICogKGRyYWZ0LWNvbmdkb24tcmFkaXVzLTgwMjF4LTIwLnR4dCkgKi8KKyNkZWZpbmUgUkFESVVTXzgwMl8xWF9BRERSX0ZPUk1BVCAiJTAyWC0lMDJYLSUwMlgtJTAyWC0lMDJYLSUwMlgiCisvKiBNQUMgYWRkcmVzcyBBU0NJSSBmb3JtYXQgZm9yIG5vbi04MDIuMVggdXNlICovCisjZGVmaW5lIFJBRElVU19BRERSX0ZPUk1BVCAiJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4IgorCitzdHJ1Y3QgcmFkaXVzX21zZyAqcmFkaXVzX21zZ19uZXcodTggY29kZSwgdTggaWRlbnRpZmllcik7CitpbnQgcmFkaXVzX21zZ19pbml0aWFsaXplKHN0cnVjdCByYWRpdXNfbXNnICptc2csIHNpemVfdCBpbml0X2xlbik7Cit2b2lkIHJhZGl1c19tc2dfc2V0X2hkcihzdHJ1Y3QgcmFkaXVzX21zZyAqbXNnLCB1OCBjb2RlLCB1OCBpZGVudGlmaWVyKTsKK3ZvaWQgcmFkaXVzX21zZ19mcmVlKHN0cnVjdCByYWRpdXNfbXNnICptc2cpOworaW50IHJhZGl1c19tc2dfZmluaXNoKHN0cnVjdCByYWRpdXNfbXNnICptc2csIGNvbnN0IHU4ICpzZWNyZXQsCisJCSAgICAgIHNpemVfdCBzZWNyZXRfbGVuKTsKK2ludCByYWRpdXNfbXNnX2ZpbmlzaF9zcnYoc3RydWN0IHJhZGl1c19tc2cgKm1zZywgY29uc3QgdTggKnNlY3JldCwKKwkJCSAgc2l6ZV90IHNlY3JldF9sZW4sIGNvbnN0IHU4ICpyZXFfYXV0aGVudGljYXRvcik7Cit2b2lkIHJhZGl1c19tc2dfZmluaXNoX2FjY3Qoc3RydWN0IHJhZGl1c19tc2cgKm1zZywgY29uc3QgdTggKnNlY3JldCwKKwkJCSAgICBzaXplX3Qgc2VjcmV0X2xlbik7CitzdHJ1Y3QgcmFkaXVzX2F0dHJfaGRyICpyYWRpdXNfbXNnX2FkZF9hdHRyKHN0cnVjdCByYWRpdXNfbXNnICptc2csIHU4IHR5cGUsCisJCQkJCSAgICBjb25zdCB1OCAqZGF0YSwgc2l6ZV90IGRhdGFfbGVuKTsKK2ludCByYWRpdXNfbXNnX2FkZF9lYXAoc3RydWN0IHJhZGl1c19tc2cgKm1zZywgY29uc3QgdTggKmRhdGEsCisJCSAgICAgICBzaXplX3QgZGF0YV9sZW4pOwordTggKnJhZGl1c19tc2dfZ2V0X2VhcChzdHJ1Y3QgcmFkaXVzX21zZyAqbXNnLCBzaXplX3QgKmxlbik7CitpbnQgcmFkaXVzX21zZ192ZXJpZnkoc3RydWN0IHJhZGl1c19tc2cgKm1zZywgY29uc3QgdTggKnNlY3JldCwKKwkJICAgICAgc2l6ZV90IHNlY3JldF9sZW4sIHN0cnVjdCByYWRpdXNfbXNnICpzZW50X21zZywKKwkJICAgICAgaW50IGF1dGgpOworaW50IHJhZGl1c19tc2dfdmVyaWZ5X21zZ19hdXRoKHN0cnVjdCByYWRpdXNfbXNnICptc2csIGNvbnN0IHU4ICpzZWNyZXQsCisJCQkgICAgICAgc2l6ZV90IHNlY3JldF9sZW4sIGNvbnN0IHU4ICpyZXFfYXV0aCk7CitpbnQgcmFkaXVzX21zZ19jb3B5X2F0dHIoc3RydWN0IHJhZGl1c19tc2cgKmRzdCwgc3RydWN0IHJhZGl1c19tc2cgKnNyYywKKwkJCSB1OCB0eXBlKTsKK3ZvaWQgcmFkaXVzX21zZ19tYWtlX2F1dGhlbnRpY2F0b3Ioc3RydWN0IHJhZGl1c19tc2cgKm1zZywKKwkJCQkgICBjb25zdCB1OCAqZGF0YSwgc2l6ZV90IGxlbik7CitzdHJ1Y3QgcmFkaXVzX21zX21wcGVfa2V5cyAqCityYWRpdXNfbXNnX2dldF9tc19rZXlzKHN0cnVjdCByYWRpdXNfbXNnICptc2csIHN0cnVjdCByYWRpdXNfbXNnICpzZW50X21zZywKKwkJICAgICAgIGNvbnN0IHU4ICpzZWNyZXQsIHNpemVfdCBzZWNyZXRfbGVuKTsKK3N0cnVjdCByYWRpdXNfbXNfbXBwZV9rZXlzICoKK3JhZGl1c19tc2dfZ2V0X2Npc2NvX2tleXMoc3RydWN0IHJhZGl1c19tc2cgKm1zZywgc3RydWN0IHJhZGl1c19tc2cgKnNlbnRfbXNnLAorCQkJICBjb25zdCB1OCAqc2VjcmV0LCBzaXplX3Qgc2VjcmV0X2xlbik7CitpbnQgcmFkaXVzX21zZ19hZGRfbXBwZV9rZXlzKHN0cnVjdCByYWRpdXNfbXNnICptc2csCisJCQkgICAgIGNvbnN0IHU4ICpyZXFfYXV0aGVudGljYXRvciwKKwkJCSAgICAgY29uc3QgdTggKnNlY3JldCwgc2l6ZV90IHNlY3JldF9sZW4sCisJCQkgICAgIGNvbnN0IHU4ICpzZW5kX2tleSwgc2l6ZV90IHNlbmRfa2V5X2xlbiwKKwkJCSAgICAgY29uc3QgdTggKnJlY3Zfa2V5LCBzaXplX3QgcmVjdl9rZXlfbGVuKTsKK3N0cnVjdCByYWRpdXNfYXR0cl9oZHIgKgorcmFkaXVzX21zZ19hZGRfYXR0cl91c2VyX3Bhc3N3b3JkKHN0cnVjdCByYWRpdXNfbXNnICptc2csCisJCQkJICBjb25zdCB1OCAqZGF0YSwgc2l6ZV90IGRhdGFfbGVuLAorCQkJCSAgY29uc3QgdTggKnNlY3JldCwgc2l6ZV90IHNlY3JldF9sZW4pOworaW50IHJhZGl1c19tc2dfZ2V0X2F0dHIoc3RydWN0IHJhZGl1c19tc2cgKm1zZywgdTggdHlwZSwgdTggKmJ1Ziwgc2l6ZV90IGxlbik7CitpbnQgcmFkaXVzX21zZ19nZXRfdmxhbmlkKHN0cnVjdCByYWRpdXNfbXNnICptc2cpOworCitzdGF0aWMgaW5saW5lIGludCByYWRpdXNfbXNnX2FkZF9hdHRyX2ludDMyKHN0cnVjdCByYWRpdXNfbXNnICptc2csIHU4IHR5cGUsCisJCQkJCSAgICB1MzIgdmFsdWUpCit7CisJdTMyIHZhbCA9IGh0b25sKHZhbHVlKTsKKwlyZXR1cm4gcmFkaXVzX21zZ19hZGRfYXR0cihtc2csIHR5cGUsICh1OCAqKSAmdmFsLCA0KSAhPSBOVUxMOworfQorCitpbnQgcmFkaXVzX21zZ19hZGRfYXR0cl90b19hcnJheShzdHJ1Y3QgcmFkaXVzX21zZyAqbXNnLCBzdHJ1Y3QgcmFkaXVzX2F0dHJfaGRyICphdHRyKTsKK3N0YXRpYyBpbmxpbmUgaW50IHJhZGl1c19tc2dfZ2V0X2F0dHJfaW50MzIoc3RydWN0IHJhZGl1c19tc2cgKm1zZywgdTggdHlwZSwKKwkJCQkJICAgIHUzMiAqdmFsdWUpCit7CisJdTMyIHZhbDsKKwlpbnQgcmVzOworCXJlcyA9IHJhZGl1c19tc2dfZ2V0X2F0dHIobXNnLCB0eXBlLCAodTggKikgJnZhbCwgNCk7CisJaWYgKHJlcyAhPSA0KQorCQlyZXR1cm4gLTE7CisKKwkqdmFsdWUgPSBudG9obCh2YWwpOworCXJldHVybiAwOworfQoraW50IHJhZGl1c19tc2dfZ2V0X2F0dHJfcHRyKHN0cnVjdCByYWRpdXNfbXNnICptc2csIHU4IHR5cGUsIHU4ICoqYnVmLAorCQkJICAgIHNpemVfdCAqbGVuLCBjb25zdCB1OCAqc3RhcnQpOworaW50IHJhZGl1c19tc2dfY291bnRfYXR0cihzdHJ1Y3QgcmFkaXVzX21zZyAqbXNnLCB1OCB0eXBlLCBpbnQgbWluX2xlbik7CisKKworc3RydWN0IHJhZGl1c19hdHRyX2RhdGEgeworCXU4ICpkYXRhOworCXNpemVfdCBsZW47Cit9OworCitzdHJ1Y3QgcmFkaXVzX2NsYXNzX2RhdGEgeworCXN0cnVjdCByYWRpdXNfYXR0cl9kYXRhICphdHRyOworCXNpemVfdCBjb3VudDsKK307CisKK3ZvaWQgcmFkaXVzX2ZyZWVfY2xhc3Moc3RydWN0IHJhZGl1c19jbGFzc19kYXRhICpjKTsKK2ludCByYWRpdXNfY29weV9jbGFzcyhzdHJ1Y3QgcmFkaXVzX2NsYXNzX2RhdGEgKmRzdCwKKwkJICAgICAgY29uc3Qgc3RydWN0IHJhZGl1c19jbGFzc19kYXRhICpzcmMpOworCisjZW5kaWYgLyogUkFESVVTX0ggKi8KZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvYXBwX3JhZGd3L3Jndy5oIGIvZXh0ZW5zaW9ucy9hcHBfcmFkZ3cvcmd3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZjMDkxMQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvYXBwX3JhZGd3L3Jndy5oCkBAIC0wLDAgKzEsMTM0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxMywgV0lERSBQcm9qZWN0IGFuZCBOSUNUCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBXSURFIFByb2plY3Qgb3IgTklDVCBub3IgdGhlIAkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFdJREUgUHJvamVjdCBhbmQgCQkJCQkJICoKKyogICBOSUNULgkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgZm9yIHRoZSBhcHBfcmFkZ3cgaW50ZXJuYWwgdXNlLiAqLworICAKKyNpZm5kZWYgX1JHV19ICisjZGVmaW5lIF9SR1dfSAorCisvKiBpbmNsdWRlIHRoZSBjb21tb24gZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlICJyZ3dfY29tbW9uLmgiCisKKy8qIFJBRElVUyBtZXNzYWdlcyArIG1ldGFkYXRhICovCitzdHJ1Y3Qgcmd3X3JhZGl1c19tc2dfbWV0YSB7CisKKwkvKiBUaGUgUkFESVVTIG1lc3NhZ2UgKi8KKwlzdHJ1Y3QgcmFkaXVzX21zZyAJcmFkaXVzOworCQorCS8qIE1ldGFkYXRhICovCisJc3RydWN0IHsKKwkJLyogVGhlIHBvcnQgaXQgd2FzIHNlbnQgZnJvbSwgaW4gbmV0d29yayBieXRlIG9yZGVyICovCisJCXVuc2lnbmVkCXBvcnQgOjE2OworCQkKKwkJLyogcmVjZWl2ZWQgb24gQUNDVCBvciBBVVRIIHBvcnQ/ICovCisJCXVuc2lnbmVkCXNlcnZfdHlwZSA6MjsKKwkJCisJCS8qIFRoZSBtZXNzYWdlIGhhcyBhIHZhbGlkIE1lc3NhZ2UtQXV0aGVudGljYXRvciBhdHRyaWJ1dGUgKi8KKwkJdW5zaWduZWQJdmFsaWRfbWFjIDoxOworCX07CisJCisJLyogRm9yIFByb3h5LVN0YXRlIGF0dHJpYnV0ZXM6ICovCisJaW50CXBzX2ZpcnN0OwkvKiBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IFByb3h5LVN0YXRlIGF0dHJpYnV0ZSBpbiByYWRpdXMuYXR0cl9wb3MuIEl0IGlzIGFsd2F5cyA+PSByYWRpdXMuYXR0cl91c2VkICovCisJaW50CXBzX25iOwkJLyogVGhlIG51bWJlciBvZiBQcm94eS1TdGF0ZSBhdHRyaWJ1dGVzLiBUaGUgcmVhbCByYWRpdXMuYXR0cl9wb3Mgc2l6ZSBpcyBhdHRyX3VzZWQgKyBwc19uYiAqLworfTsKK3ZvaWQgcmd3X21zZ19mcmVlKHN0cnVjdCByZ3dfcmFkaXVzX21zZ19tZXRhICoqIG1zZyk7CitpbnQgcmd3X21zZ19wYXJzZSh1bnNpZ25lZCBjaGFyICogYnVmLCBzaXplX3QgbGVuLCBzdHJ1Y3Qgcmd3X3JhZGl1c19tc2dfbWV0YSAqKiBtc2cpOwordm9pZCByZ3dfbXNnX2R1bXAoc3RydWN0IHJnd19yYWRpdXNfbXNnX21ldGEgKiBtc2csIGludCBoYXNfbWV0YSk7CisKKy8qIExvY2FsIFJBRElVUyBzZXJ2ZXIocykgY29uZmlndXJhdGlvbiAqLworc3RydWN0IHJnd19zZXJ2IHsKKwl1bnNpZ25lZAlkaXNhYmxlZAk6MTsKKwl1bnNpZ25lZAlpcF9kaXNhYmxlZAk6MTsKKwl1bnNpZ25lZAlpcDZfZGlzYWJsZWQJOjE7CisJdW5zaWduZWQJOjEzOyAvKiBwYWRkaW5nICovCisJCisJdWludDE2X3QJcG9ydDsJLyogc3RvcmVkIGluIG5ldHdvcmsgYnl0ZSBvcmRlciAqLworCQorCXN0cnVjdCBpbl9hZGRyCWlwX2VuZHBvaW50OworCXN0cnVjdCBpbjZfYWRkcglpcDZfZW5kcG9pbnQ7Cit9OworCitleHRlcm4gc3RydWN0IHJnd19zZXJ2cyB7CisJc3RydWN0IHJnd19zZXJ2CWF1dGhfc2VydjsKKwlzdHJ1Y3Qgcmd3X3NlcnYJYWNjdF9zZXJ2OworfSByZ3dfc2VydmVyczsKKworaW50IHJnd19zZXJ2ZXJzX2luaXQodm9pZCk7CitpbnQgcmd3X3NlcnZlcnNfc3RhcnQodm9pZCk7Cit2b2lkIHJnd19zZXJ2ZXJzX2R1bXAodm9pZCk7CitpbnQgcmd3X3NlcnZlcnNfc2VuZChpbnQgdHlwZSwgdW5zaWduZWQgY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuLCBzdHJ1Y3Qgc29ja2FkZHIgKnRvLCB1aW50MTZfdCB0b19wb3J0KTsKK3ZvaWQgcmd3X3NlcnZlcnNfZmluaSh2b2lkKTsKKworCisvKiBDbGllbnRzIG1hbmFnZW1lbnQgKi8KK2VudW0gcmd3X2NsaV90eXBlIHsgUkdXX0NMSV9OQVMsIFJHV19DTElfUFhZIH07CitpbnQgcmd3X2NsaWVudHNfYXV0aF9jaGVjayhzdHJ1Y3Qgcmd3X3JhZGl1c19tc2dfbWV0YSAqIG1zZywgc3RydWN0IHJnd19jbGllbnQgKiBjbGksIHVpbnQ4X3QgKiByZXFfYXV0aCk7CitpbnQgcmd3X2NsaWVudHNfYWRkKCBzdHJ1Y3Qgc29ja2FkZHIgKiBpcF9wb3J0LCB1bnNpZ25lZCBjaGFyICoqIGtleSwgc2l6ZV90IGtleWxlbiwgZW51bSByZ3dfY2xpX3R5cGUgdHlwZSApOworaW50IHJnd19jbGllbnRzX2dldGtleShzdHJ1Y3Qgcmd3X2NsaWVudCAqIGNsaSwgdW5zaWduZWQgY2hhciAqKmtleSwgc2l6ZV90ICprZXlfbGVuKTsKK2ludCByZ3dfY2xpZW50c19nZXR0eXBlKHN0cnVjdCByZ3dfY2xpZW50ICogY2xpLCBlbnVtIHJnd19jbGlfdHlwZSAqdHlwZSk7CitpbnQgcmd3X2NsaWVudHNfc2VhcmNoKHN0cnVjdCBzb2NrYWRkciAqIGlwX3BvcnQsIHN0cnVjdCByZ3dfY2xpZW50ICoqIHJlZik7CitpbnQgcmd3X2NsaWVudHNfY2hlY2tfZHVwKHN0cnVjdCByZ3dfcmFkaXVzX21zZ19tZXRhICoqbXNnLCBzdHJ1Y3Qgcmd3X2NsaWVudCAqY2xpKTsKK2ludCByZ3dfY2xpZW50c19jcmVhdGVfb3JpZ2luKHN0cnVjdCByZ3dfcmFkaXVzX21zZ19tZXRhICptc2csIHN0cnVjdCByZ3dfY2xpZW50ICogY2xpLCBzdHJ1Y3QgbXNnICoqIGRpYW0pOworaW50IHJnd19jbGllbnRfZmluaXNoX3NlbmQoc3RydWN0IHJhZGl1c19tc2cgKiogbXNnLCBzdHJ1Y3Qgcmd3X3JhZGl1c19tc2dfbWV0YSAqIHJlcSwgc3RydWN0IHJnd19jbGllbnQgKiBjbGkpOworaW50IHJnd19jbGllbnRfZmluaXNoX25vc2VuZChzdHJ1Y3Qgcmd3X3JhZGl1c19tc2dfbWV0YSAqIHJlcSwgc3RydWN0IHJnd19jbGllbnQgKiBjbGkpOwordm9pZCByZ3dfY2xpZW50c19kaXNwb3NlKHN0cnVjdCByZ3dfY2xpZW50ICoqIHJlZik7Cit2b2lkIHJnd19jbGllbnRzX2R1bXAodm9pZCk7CitpbnQgcmd3X2NsaWVudHNfaW5pdCh2b2lkKTsKK3ZvaWQgcmd3X2NsaWVudHNfZmluaSh2b2lkKTsKK2ludCByZ3dfY2xpZW50X3Nlc3Npb25fYWRkKHN0cnVjdCByZ3dfY2xpZW50ICogY2xpLCBzdHJ1Y3Qgc2Vzc2lvbiAqc2VzcywgY2hhciAqIGRlc3RfcmVhbG0sIGNoYXIgKiBkZXN0X2hvc3QsIGFwcGxpY2F0aW9uX2lkX3QgYXBwaWQpOworaW50IHJnd19jbGllbnRfc2Vzc2lvbl9zdG9wKHN0cnVjdCByZ3dfY2xpZW50ICogY2xpLCBzdHJ1Y3Qgc2Vzc2lvbiAqIHNlc3MsIGludDMyX3QgcmVhc29uKTsKKworCisvKiBNYW5hZ2VtZW50IG9mIHBsdWdpbnMgKi8KK2ludCByZ3dfcGxnX2FkZCggY2hhciAqIHBsZ2ZpbGUsIGNoYXIgKiBjb25mZmlsZSwgaW50IHBvcnQsIHVuc2lnbmVkIGNoYXIgKiogY29kZXNfYXJyYXksIHNpemVfdCBjb2Rlc19zeiApOwordm9pZCByZ3dfcGxnX2R1bXAodm9pZCk7Cit2b2lkIHJnd19wbGdfc3RhcnRfY2FjaGUodm9pZCk7CitpbnQgcmd3X3BsZ19sb29wX3JlcShzdHJ1Y3Qgcmd3X3JhZGl1c19tc2dfbWV0YSAqKnJhZCwgc3RydWN0IG1zZyAqKmRpYW1fbXNnLCBzdHJ1Y3Qgcmd3X2NsaWVudCAqIGNsaSk7CitpbnQgcmd3X3BsZ19sb29wX2FucyhzdHJ1Y3Qgcmd3X3JhZGl1c19tc2dfbWV0YSAqcmVxLCBzdHJ1Y3QgbXNnICoqZGlhbV9hbnMsIHN0cnVjdCByYWRpdXNfbXNnICoqIHJhZF9hbnMsIHN0cnVjdCByZ3dfY2xpZW50ICogY2xpKTsKK3ZvaWQgcmd3X3BsZ19maW5pKHZvaWQpOworCisKKy8qIFBhcnNlIGNvbmZpZ3VyYXRpb24gZmlsZSAqLworaW50IHJnd19jb25mX2hhbmRsZShjaGFyICogY29uZmZpbGUpOworCisKKy8qIFdvcmtlciBtb2R1bGUsIHByb2Nlc3MgaW5jb21pbmcgUkFESVVTIG1lc3NhZ2VzIChpbiBzZXBhcmF0ZWQgdGhyZWFkcykgKi8KK2ludCByZ3dfd29ya19zdGFydCh2b2lkKTsKK2ludCByZ3dfd29ya19hZGQoc3RydWN0IHJnd19yYWRpdXNfbXNnX21ldGEgKiBtc2csIHN0cnVjdCByZ3dfY2xpZW50ICogY2xpZW50KTsKK3ZvaWQgcmd3X3dvcmtfZmluaSh2b2lkKTsKKworCisjZW5kaWYgLyogX1JHV19IICovCisgIApkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9hcHBfcmFkZ3cvcmd3X2NsaWVudHMuYyBiL2V4dGVuc2lvbnMvYXBwX3JhZGd3L3Jnd19jbGllbnRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA5MjJjZQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvYXBwX3JhZGd3L3Jnd19jbGllbnRzLmMKQEAgLTAsMCArMSwxMTgxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxMywgV0lERSBQcm9qZWN0IGFuZCBOSUNUCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBXSURFIFByb2plY3Qgb3IgTklDVCBub3IgdGhlIAkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFdJREUgUHJvamVjdCBhbmQgCQkJCQkJICoKKyogICBOSUNULgkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIE1hbmFnZSB0aGUgbGlzdCBvZiBSQURJVVMgY2xpZW50cywgYWxvbmcgd2l0aCB0aGVpciBzaGFyZWQgc2VjcmV0cy4gKi8KKworLyogUHJvYmFibHkgc29tZSBjaGFuZ2VzIGFyZSBuZWVkZWQgdG8gc3VwcG9ydCBSQURJVVMgUHJveGllcyAqLworCisjaW5jbHVkZSAicmd3LmgiCisKKyNkZWZpbmUgUkVWRVJTRV9ETlNfU0laRV9NQVgJNTEyIC8qIGxlbmd0aCBvZiBvdXIgYnVmZmVyIGZvciByZXZlcnNlIEROUyAqLworI2RlZmluZSBEVVBMSUNBVEVfQ0hFQ0tfTElGRVRJTUUgNjAgLyogbnVtYmVyIG9mIHNlY29uZHMgdGhhdCB0aGUgcmVjZWl2ZWQgUkFESVVTIHJlY29yZHMgYXJlIGtlcHQgZm9yIGR1cGxpY2F0ZSBjaGVja2luZyAuIFRPRE86IG1ha2UgaXQgY29uZmlndXJhYmxlIGlmIG5lZWRlZCAqLworCisvKiBPcmRlcmVkIGxpc3RzIG9mIGNsaWVudHMuIFRoZSBvcmRlciByZWxhdGlvbnNoaXAgaXMgYSBtZW1jbXAgb24gdGhlIGFkZHJlc3Mgem9uZS4gCisgICBGb3Igc2FtZSBhZGRyZXNzZXMsIHRoZSBwb3J0IGlzIGNvbXBhcmVkLgorICAgVGhlIHNhbWUgYWRkcmVzcyBjYW5ub3QgYmUgYWRkZWQgdHdpY2UsIG9uY2Ugd2l0aCBhIDAtcG9ydCBhbmQgb25jZSB3aXRoIGFub3RoZXIgcG9ydCB2YWx1ZS4KKyAqLworc3RhdGljIHN0cnVjdCBmZF9saXN0IGNsaV9pcCA9IEZEX0xJU1RfSU5JVElBTElaRVIoY2xpX2lwKTsKK3N0YXRpYyBzdHJ1Y3QgZmRfbGlzdCBjbGlfaXA2ID0gRkRfTElTVF9JTklUSUFMSVpFUihjbGlfaXA2KTsKKworLyogTG9jayB0byBwcm90ZWN0IHRoZSBwcmV2aW91cyBsaXN0cy4gV2UgdXNlIGEgcndsb2NrIGJlY2F1c2UgdGhpcyBsaXN0IGlzIG1vc3RseSBzdGF0aWMsIHRvIGFsbG93IHBhcmFsbGVsIHJlYWRpbmcgKi8KK3N0YXRpYyBwdGhyZWFkX3J3bG9ja190IGNsaV9yd2wgPSBQVEhSRUFEX1JXTE9DS19JTklUSUFMSVpFUjsKKworLyogU3RydWN0dXJlIGRlc2NyaWJpbmcgb25lIHJlY2VpdmVkIFJBRElVUyBtZXNzYWdlLCBmb3IgZHVwbGljYXRlIGNoZWNrcyBwdXJwb3NlLiAqLworc3RydWN0IHJlcV9pbmZvIHsKKwl1aW50MTZfdAlwb3J0OyAJLyogVURQIHNvdXJjZSBwb3J0IG9mIHRoZSByZXF1ZXN0ICovCisJdWludDhfdAkJaWQ7CS8qIFRoZSBpZGVudGlmaWVyIGluIHRoZSByZXF1ZXN0IGhlYWRlciAqLworCXVpbnQ4X3QJCWF1dGhbMTZdOyAvKiBSZXF1ZXN0IGF1dGhlbnRpY2F0b3IsIHNpbmNlIHNvbWUgUkFESVVTIGNsaWVudHMgZG8gbm90IGltcGxlbWVudCB0aGUgaWQgbWVjaGFuaXNtIHByb3Blcmx5LiAqLworCXN0cnVjdCByYWRpdXNfbXNnICphbnM7IC8qIFRoZSByZXBsaWVkIGFuc3dlciBpZiBhbnksIGluIGNhc2UgdGhlIHByZXZpb3VzIGFuc3dlciBnb3QgbG9zdC4gKi8KKwkKKwlpbnQJCW5iZHVwOyAgLyogTnVtYmVyIG9mIHRpbWVzIHRoaXMgcmVxdWVzdCB3YXMgcmVjZWl2ZWQgYXMgYSBkdXBsaWNhdGUgKi8KKwlzdHJ1Y3QgZmRfbGlzdAlieV9pZDsJICAvKiBUaGUgbGlzdCBvZiByZXF1ZXN0cyBvcmRlcmVkIGJ5IHRoZWlyIGlkLCBwb3J0LCBhbmQgYXV0aCAqLworCXRpbWVfdCAJCXJlY2VpdmVkOyAvKiBXaGVuIHdhcyB0aGUgbGFzdCBkdXBsaWNhdGUgcmVjZWl2ZWQ/ICovCisJc3RydWN0IGZkX2xpc3QgIGJ5X3RpbWU7ICAvKiBUaGUgbGlzdCBvZiByZXF1ZXN0cyBvcmRlcmVkIGJ5IHRoZSAncmVjZWl2ZWQnIHZhbHVlIC4gKi8KK307CisKK3N0YXRpYyBwdGhyZWFkX3QgZGJ0X2V4cGlyZSA9IChwdGhyZWFkX3QpTlVMTDsgLyogVGhlIHRocmVhZCB0aGF0IHdpbGwgcmVtb3ZlIG9sZCByZXF1ZXN0cyBpbmZvcm1hdGlvbiBmcm9tIGFsbCBjbGllbnRzIChvbmUgdGhyZWFkIGZvciBhbGwpICovCisKKy8qIFN0cnVjdHVyZSBkZXNjcmliaW5nIG9uZSBjbGllbnQgKi8KK3N0cnVjdCByZ3dfY2xpZW50IHsKKwkvKiBMaW5rIGluZm9ybWF0aW9uIGluIGdsb2JhbCBsaXN0IChjbGlfaXAgb3IgY2xpX2lwNikgKi8KKwlzdHJ1Y3QgZmRfbGlzdAkJY2hhaW47CisJCisJLyogUmVmZXJlbmNlIGNvdW50ICovCisJaW50CQkJcmVmY291bnQ7CisJCisJLyogVGhlIGFkZHJlc3MgYW5kIG9wdGlvbmFsIHBvcnQgKGFsbG9jJ2QgZHVyaW5nIGNvbmZpZ3VyYXRpb24gZmlsZSBwYXJzaW5nKS4gKi8KKwl1bmlvbiB7CisJCXN0cnVjdCBzb2NrYWRkcgkJKnNhOyAvKiBnZW5lcmljIHBvaW50ZXIgKi8KKwkJc3RydWN0IHNvY2thZGRyX2luCSpzaW47CisJCXN0cnVjdCBzb2NrYWRkcl9pbjYJKnNpbjY7CisJfTsKKwkKKwkvKiBUaGUgRlFETiwgcmVhbG0sIGFuZCBvcHRpb25hbCBhbGlhc2VzICovCisJaW50CQkJIGlzX2xvY2FsOyAvKiB0cnVlIGlmIHRoZSBSQURJVVMgY2xpZW50IHJ1bnMgb24gdGhlIHNhbWUgaG9zdCAtLSB3ZSB1c2UgRGlhbWV0ZXIgSWRlbnRpdHkgaW4gdGhhdCBjYXNlICovCisJZW51bSByZ3dfY2xpX3R5cGUgCSB0eXBlOyAvKiBpcyBpdCBhIHByb3h5ID8gKi8KKwlEaWFtSWRfdAkJIGZxZG47IC8qIG1hbGxvYydkIGhlcmUgKi8KKwlzaXplX3QJCQkgZnFkbl9sZW47CisJRGlhbUlkX3QJCSByZWFsbTsgLyogcmVmZXJlbmNlcyBhbm90aGVyIHN0cmluZywgZG8gbm90IGZyZWUgKi8KKwlzaXplX3QJCQkgcmVhbG1fbGVuOworCXN0cnVjdCB7CisJCW9zMF90CQkgbmFtZTsKKwkJc2l6ZV90CQkgbGVuOworCX0JCQkqYWxpYXNlczsgLyogUmVjZWl2ZWQgYWxpYXNlcyAqLworCXNpemVfdAkJCSBhbGlhc2VzX25iOworCQorCS8qIFRoZSBzZWNyZXQga2V5IGRhdGEuICovCisJc3RydWN0IHsKKwkJdW5zaWduZWQgY2hhciAqIGRhdGE7CisJCXNpemVfdAkJbGVuOworCX0gCQkJa2V5OworCQorCS8qIGluZm9ybWF0aW9uIG9mIHByZXZpb3VzIG1zZyByZWNlaXZlZCwgZm9yIGR1cGxpY2F0ZSBjaGVja3MuICovCisJc3RydWN0IHsKKwkJcHRocmVhZF9tdXRleF90IGR1cGxfbG9jazsgICAgLyogVGhlIG11dGV4IHByb3RlY3RpbmcgdGhlIGZvbGxvd2luZyBsaXN0cyAqLworCQlzdHJ1Y3QgZmRfbGlzdCAJZHVwbF9ieV9pZDsgICAvKiBUaGUgbGlzdCBvZiByZXFfaW5mbyBzdHJ1Y3R1cmVzIG9yZGVyZWQgYnkgdGhlaXIgaWQsIHBvcnQsIGFuZCBhdXRoICovCisJCXN0cnVjdCBmZF9saXN0IAlkdXBsX2J5X3RpbWU7IC8qIFRoZSBsaXN0IG9mIHJlcV9pbmZvIHN0cnVjdHVyZXMgb3JkZXJlZCBieSB0aGVpciB0aW1lIChhcHByb3hpbWF0aXZlKSAqLworCX0gZHVwbF9pbmZvWzJdOyAvKlswXSBmb3IgYXV0aCwgWzFdIGZvciBhY2N0LiAqLworfTsKKworCisvKiBDcmVhdGUgYSBuZXcgcmVxX2luZm8gc3RydWN0dXJlIGFuZCBpbml0aWFsaXplIGl0cyBkYXRhIGZyb20gYSBSQURJVVMgcmVxdWVzdCBtZXNzYWdlICovCitzdGF0aWMgc3RydWN0IHJlcV9pbmZvICogZHVwbF9uZXdfcmVxX2luZm8oc3RydWN0IHJnd19yYWRpdXNfbXNnX21ldGEgKm1zZykgeworCXN0cnVjdCByZXFfaW5mbyAqIHJldCA9IE5VTEw7CisJQ0hFQ0tfTUFMTE9DX0RPKCByZXQgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCByZXFfaW5mbykpLCByZXR1cm4gTlVMTCApOworCW1lbXNldChyZXQsIDAsIHNpemVvZihzdHJ1Y3QgcmVxX2luZm8pKTsKKwlyZXQtPnBvcnQgPSBtc2ctPnBvcnQ7CisJcmV0LT5pZCAgID0gbXNnLT5yYWRpdXMuaGRyLT5pZGVudGlmaWVyOworCW1lbWNweSgmcmV0LT5hdXRoWzBdLCAmbXNnLT5yYWRpdXMuaGRyLT5hdXRoZW50aWNhdG9yWzBdLCAxNik7CisJZmRfbGlzdF9pbml0KCZyZXQtPmJ5X2lkLCByZXQpOworCWZkX2xpc3RfaW5pdCgmcmV0LT5ieV90aW1lLCByZXQpOworCXJldC0+cmVjZWl2ZWQgPSB0aW1lKE5VTEwpOworCXJldHVybiByZXQ7Cit9CisKKy8qIERlc3Ryb3kgYSByZXFfaW5mbyBzdHJ1Y3R1cmUsIGFmdGVyIGl0IGhhcyBiZWVuIHVubGlua2VkICovCitzdGF0aWMgdm9pZCBkdXBsX2ZyZWVfcmVxX2luZm8oc3RydWN0IHJlcV9pbmZvICogcikgeworCUNIRUNLX1BBUkFNU19ETyggciAmJiBGRF9JU19MSVNUX0VNUFRZKCZyLT5ieV9pZCkgJiYgRkRfSVNfTElTVF9FTVBUWSgmci0+YnlfdGltZSksIHJldHVybiApOworCWlmIChyLT5hbnMpIHsKKwkJLyogRnJlZSB0aGlzIFJBRElVUyBtZXNzYWdlICovCisJCXJhZGl1c19tc2dfZnJlZShyLT5hbnMpOworCQlmcmVlKHItPmFucyk7CisJfQorCQorCS8qIFVzZSByLT5uYmR1cCBmb3Igc29tZSBwdXJwb3NlPyAqLworCQorCWZyZWUocik7Cit9CisKKy8qIFRoZSBjb3JlIG9mIHRoZSBwdXJnZSB0aHJlYWQgKi8KK3N0YXRpYyBpbnQgZHVwbF9wdXJnZV9saXN0KHN0cnVjdCBmZF9saXN0ICogY2xpZW50cykgeworCisJc3RydWN0IGZkX2xpc3QgKmxpID0gTlVMTDsKKwkKKwlmb3IgKGxpID0gY2xpZW50cy0+bmV4dDsgbGkgIT0gY2xpZW50czsgbGkgPSBsaS0+bmV4dCkgeworCQlzdHJ1Y3Qgcmd3X2NsaWVudCAqIGNsaWVudCA9IChzdHJ1Y3Qgcmd3X2NsaWVudCAqKWxpOworCQlpbnQgcDsKKwkJCisJCWZvciAocD0wOyBwPD0xOyBwKyspIHsKKwkJCisJCQkvKiBMb2NrIHRoaXMgbGlzdCAqLworCQkJdGltZV90IG5vdzsKKwkJCUNIRUNLX1BPU0lYKCBwdGhyZWFkX211dGV4X2xvY2soJmNsaWVudC0+ZHVwbF9pbmZvW3BdLmR1cGxfbG9jaykgKTsKKwkJCQorCQkJbm93ID0gdGltZShOVUxMKTsKKwkJCQorCQkJd2hpbGUgKCFGRF9JU19MSVNUX0VNUFRZKCZjbGllbnQtPmR1cGxfaW5mb1twXS5kdXBsX2J5X3RpbWUpKSB7CisJCQkKKwkJCQkvKiBDaGVjayB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgbGlzdCAqLworCQkJCXN0cnVjdCByZXFfaW5mbyAqIHIgPSAoc3RydWN0IHJlcV9pbmZvICopKGNsaWVudC0+ZHVwbF9pbmZvW3BdLmR1cGxfYnlfdGltZS5uZXh0LT5vKTsKKwkJCQkKKwkJCQlpZiAobm93IC0gci0+cmVjZWl2ZWQgPiBEVVBMSUNBVEVfQ0hFQ0tfTElGRVRJTUUpIHsKKwkJCQkKKwkJCQkJVFJBQ0VfREVCVUcoQU5OT1lJTkcgKyAxLCAiUHVyZ2luZyBSQURJVVMgcmVxdWVzdCAoaWQ6ICUwMmhoeCwgcG9ydDogJWh1LCBkdXAgIyVkLCBhZ2UgJWxkIHNlY3MpIiwgci0+aWQsIG50b2hzKHItPnBvcnQpLCByLT5uYmR1cCwgKGxvbmcpKG5vdyAtIHItPnJlY2VpdmVkKSk7CisJCQkJCQorCQkJCQkvKiBSZW1vdmUgdGhpcyByZWNvcmQgKi8KKwkJCQkJZmRfbGlzdF91bmxpbmsoJnItPmJ5X3RpbWUpOworCQkJCQlmZF9saXN0X3VubGluaygmci0+YnlfaWQpOworCQkJCQlkdXBsX2ZyZWVfcmVxX2luZm8ocik7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogV2UgYXJlIGRvbmUgZm9yIHRoaXMgbGlzdCAqLworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQkKKwkJCUNIRUNLX1BPU0lYKCBwdGhyZWFkX211dGV4X3VubG9jaygmY2xpZW50LT5kdXBsX2luZm9bcF0uZHVwbF9sb2NrKSApOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKiBUaHJlYWQgdGhhdCBwdXJnZXMgb2xkIFJBRElVUyByZXF1ZXN0cyAqLworc3RhdGljIHZvaWQgKiBkdXBsX3RoKHZvaWQgKiBhcmcpIHsKKwkvKiBTZXQgdGhlIHRocmVhZCBuYW1lICovCisJZmRfbG9nX3RocmVhZG5hbWUgKCAiYXBwX3JhZGd3OmR1cGxpY2F0ZV9wdXJnZSIgKTsKKwkKKwkvKiBUaGUgdGhyZWFkIHdpbGwgYmUgY2FuY2VsZWQgKi8KKwl3aGlsZSAoMSkgeworCQkKKwkJLyogV2UgZG9uJ3QgdXNlIGEgY29uZCB2YXIsIHdlIHNpbXBseSB3YWtlIHVwIGV2ZXJ5IDUgc2Vjb25kcy4gSWYgdGhlIHNpemUgb2YgdGhlIGR1cGxpY2F0ZSBjYWNoZSBpcyBjcml0aWNhbCwgaXQgbWlnaHQgYmUgY2hhbmdlZCAqLworCQlzbGVlcCg1KTsKKwkJCisJCS8qIFdoZW4gd2Ugd2FrZSB1cCwgd2Ugd2lsbCBjaGVjayBhbGwgY2xpZW50cyBkdXBsaWNhdGUgbGlzdHMgb25lIGJ5IG9uZSAqLworCQlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9yd2xvY2tfcmRsb2NrKCZjbGlfcndsKSwgYnJlYWsgKTsKKwkJCisJCUNIRUNLX0ZDVF9ETyggZHVwbF9wdXJnZV9saXN0KCZjbGlfaXApLCBicmVhayApOworCQlDSEVDS19GQ1RfRE8oIGR1cGxfcHVyZ2VfbGlzdCgmY2xpX2lwNiksIGJyZWFrICk7CisJCQorCQlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9yd2xvY2tfdW5sb2NrKCZjbGlfcndsKSwgYnJlYWsgKTsKKwkKKwkJLyogTG9vcCAqLworCX0KKwkKKwkvKiBJZiB3ZSByZWFjaCB0aGlzIHBhcnQsIHNvbWUgZmF0YWwgZXJyb3Igd2FzIGVuY291bnRlcmVkICovCisJQ0hFQ0tfRkNUX0RPKGZkX2NvcmVfc2h1dGRvd24oKSwgKTsKKwlUUkFDRV9ERUJVRyhGVUxMLCAiVGhyZWFkIHRlcm1pbmF0ZWQiKTsJCisJcmV0dXJuIE5VTEw7Cit9CisKKworLyogY3JlYXRlIGEgbmV3IHJnd19jbGllbnQuIHRoZSBhcmd1bWVudHMgYXJlIE1PVkVEIGludG8gdGhlIHN0cnVjdHVyZSAodG8gbGltaXQgbWFsbG9jICYgZnJlZSBjYWxscykuICovCitzdGF0aWMgaW50IGNsaWVudF9jcmVhdGUoc3RydWN0IHJnd19jbGllbnQgKiogcmVzLCBzdHJ1Y3Qgc29ja2FkZHIgKiogaXBfcG9ydCwgdW5zaWduZWQgY2hhciAqKiBrZXksIHNpemVfdCBrZXlsZW4sIGVudW0gcmd3X2NsaV90eXBlIHR5cGUgKQoreworCXN0cnVjdCByZ3dfY2xpZW50ICp0bXAgPSBOVUxMOworCURpYW1JZF90IGZxZG47CisJc2l6ZV90IGZxZG5fbGVuID0gMDsKKwlpbnQgcmV0LCBpOworCWludCBsb2MgPSAwOworCQorCS8qIENoZWNrIGlmIHRoZSBJUCBhZGRyZXNzIGlzIGxvY2FsICovCisJaWYgKCAgICggKCgqaXBfcG9ydCktPnNhX2ZhbWlseSA9PSBBRl9JTkVUICkgJiYgKCAgIElOX0lTX0FERFJfTE9PUEJBQ0soICYoKHN0cnVjdCBzb2NrYWRkcl9pbiAgKikoKmlwX3BvcnQpKS0+c2luX2FkZHIgKSApICkKKwkgICAgIHx8KCAoKCppcF9wb3J0KS0+c2FfZmFtaWx5ID09IEFGX0lORVQ2KSAmJiAoICBJTjZfSVNfQUREUl9MT09QQkFDSyggJigoc3RydWN0IHNvY2thZGRyX2luNiAqKSgqaXBfcG9ydCkpLT5zaW42X2FkZHIpICkgKSkgeworCQkvKiBUaGUgY2xpZW50IGlzIGxvY2FsICovCisJCWxvYyA9IDE7CisJfSBlbHNlIHsKKwkJY2hhciBidWZbMjU1XTsKKwkKKwkJLyogU2VhcmNoIEZRRE4gZm9yIHRoZSBjbGllbnQgKi8KKwkJcmV0ID0gZ2V0bmFtZWluZm8oICppcF9wb3J0LCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UpLCAmYnVmWzBdLCBzaXplb2YoYnVmKSwgTlVMTCwgMCwgMCApOworCQlpZiAocmV0KSB7CisJCQlUUkFDRV9ERUJVRyhJTkZPLCAiVW5hYmxlIHRvIHJlc29sdmUgcGVlciBuYW1lOiAlcyIsIGdhaV9zdHJlcnJvcihyZXQpKTsKKwkJCXJldHVybiBFSU5WQUw7CisJCX0KKwkJZnFkbiA9ICZidWZbMF07CisJCUNIRUNLX0ZDVF9ETyggcmV0ID0gZmRfb3NfdmFsaWRhdGVfRGlhbWV0ZXJJZGVudGl0eSgmZnFkbiwgJmZxZG5fbGVuLCAxKSwKKwkJCXsKKwkJCQlUUkFDRV9ERUJVRyhJTkZPLCAiVW5hYmxlIHRvIHVzZSByZXNvbHZlZCBwZWVyIG5hbWUgJyVzJyBhcyBEaWFtZXRlcklkZW50aXR5OiAlcyIsIGJ1Ziwgc3RyZXJyb3IocmV0KSk7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0gKTsKKwl9CisJCisJLyogQ3JlYXRlIHRoZSBuZXcgb2JqZWN0ICovCisJQ0hFQ0tfTUFMTE9DKCB0bXAgPSBtYWxsb2Moc2l6ZW9mIChzdHJ1Y3Qgcmd3X2NsaWVudCkpICk7CisJbWVtc2V0KHRtcCwgMCwgc2l6ZW9mKHN0cnVjdCByZ3dfY2xpZW50KSk7CisJZmRfbGlzdF9pbml0KCZ0bXAtPmNoYWluLCBOVUxMKTsKKwkKKwkvKiBJbml0aWFsaXplIHRoZSBkdXBsaWNhdGUgbGlzdCBpbmZvICovCisJZm9yIChpPTA7IGk8PTE7IGkrKykgeworCQlDSEVDS19QT1NJWCggcHRocmVhZF9tdXRleF9pbml0KCZ0bXAtPmR1cGxfaW5mb1tpXS5kdXBsX2xvY2ssIE5VTEwpICk7CisJCWZkX2xpc3RfaW5pdCgmdG1wLT5kdXBsX2luZm9baV0uZHVwbF9ieV9pZCwgTlVMTCk7CisJCWZkX2xpc3RfaW5pdCgmdG1wLT5kdXBsX2luZm9baV0uZHVwbF9ieV90aW1lLCBOVUxMKTsKKwl9CisJdG1wLT50eXBlID0gdHlwZTsKKwkKKwlpZiAobG9jKSB7CisJCXRtcC0+aXNfbG9jYWwgPSAxOworCX0gZWxzZSB7CisJCS8qIENvcHkgdGhlIGZxZG4gKi8KKwkJdG1wLT5mcWRuID0gZnFkbjsKKwkJdG1wLT5mcWRuX2xlbiA9IGZxZG5fbGVuOworCisJCS8qIEZpbmQgYW4gYXBwcm9wcmlhdGUgcmVhbG0gKi8KKwkJdG1wLT5yZWFsbSA9IHN0cmNocihmcWRuLCAnLicpOworCQlpZiAodG1wLT5yZWFsbSkgeworCQkJdG1wLT5yZWFsbSArPSAxOworCQkJdG1wLT5yZWFsbV9sZW4gPSB0bXAtPmZxZG5fbGVuIC0gKHRtcC0+cmVhbG0gLSBmcWRuKTsKKwkJfQorCQlpZiAoKCF0bXAtPnJlYWxtKSB8fCAoKnRtcC0+cmVhbG0gPT0gJ1wwJykpIHsgLyogaW4gY2FzZSB0aGUgZnFkbiB3YXMgImxvY2FsaG9zdC4iIGZvciBleGFtcGxlLCBpZiBpdCBpcyBwb3NzaWJsZS4uLiAqLworCQkJdG1wLT5yZWFsbSA9IGZkX2dfY29uZmlnLT5jbmZfZGlhbXJsbTsKKwkJCXRtcC0+cmVhbG1fbGVuID0gZmRfZ19jb25maWctPmNuZl9kaWFtcmxtX2xlbjsKKwkJfQorCX0KKwkKKwkvKiBtb3ZlIHRoZSBzYSBpbmZvIHJlZmVyZW5jZSAqLworCXRtcC0+c2EgPSAqaXBfcG9ydDsKKwkqaXBfcG9ydCA9IE5VTEw7CisJCisJLyogbW92ZSB0aGUga2V5IG1hdGVyaWFsICovCisJdG1wLT5rZXkuZGF0YSA9ICprZXk7CisJdG1wLT5rZXkubGVuID0ga2V5bGVuOworCSprZXkgPSBOVUxMOworCQorCS8qIERvbmUhICovCisJKnJlcyA9IHRtcDsKKwlyZXR1cm4gMDsKK30KKworLyogRGVjcmVhc2UgcmVmY291bnQgb24gYSBjbGllbnQ7IHRoZSBsb2NrIG11c3QgYmUgaGVsZCB3aGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLiAqLworc3RhdGljIHZvaWQgY2xpZW50X3VubGluayhzdHJ1Y3Qgcmd3X2NsaWVudCAqIGNsaWVudCkKK3sKKwljbGllbnQtPnJlZmNvdW50IC09IDE7CisJCisJaWYgKGNsaWVudC0+cmVmY291bnQgPD0gMCkgeworCQlpbnQgaWR4OworCQkvKiB0byBiZSBzdXJlOiB0aGUgcmVmY291bnQgc2hvdWxkIGJlIDAgb25seSB3aGVuIGNsaWVudF9maW5pIGlzIGNhbGxlZCAqLworCQlBU1NFUlQoIEZEX0lTX0xJU1RfRU1QVFkoJmNsaWVudC0+Y2hhaW4pICk7CisJCQorCQkvKiBGcmVlIHRoZSBkYXRhICovCisJCWZvciAoaWR4ID0gMDsgaWR4IDwgY2xpZW50LT5hbGlhc2VzX25iOyBpZHgrKykKKwkJCWZyZWUoY2xpZW50LT5hbGlhc2VzW2lkeF0ubmFtZSk7CisJCWZyZWUoY2xpZW50LT5hbGlhc2VzKTsKKwkJZnJlZShjbGllbnQtPmZxZG4pOworCQlmcmVlKGNsaWVudC0+c2EpOworCQlmcmVlKGNsaWVudC0+a2V5LmRhdGEpOworCQkKKwkJLyogRnJlZSB0aGUgZHVwbGljYXRlIGluZm8gKi8KKwkJZm9yIChpZHg9MDsgaWR4IDw9IDE7IGlkeCsrKXsKKwkJCUNIRUNLX1BPU0lYX0RPKCBwdGhyZWFkX211dGV4X2xvY2soICZjbGllbnQtPmR1cGxfaW5mb1tpZHhdLmR1cGxfbG9jayApLCAvKiBjb250aW51ZSAqLyApOworCQkJCisJCQl3aGlsZSAoIUZEX0lTX0xJU1RfRU1QVFkoJmNsaWVudC0+ZHVwbF9pbmZvW2lkeF0uZHVwbF9ieV9pZCkpIHsKKwkJCQlzdHJ1Y3QgcmVxX2luZm8gKiByID0gKHN0cnVjdCByZXFfaW5mbyAqKShjbGllbnQtPmR1cGxfaW5mb1tpZHhdLmR1cGxfYnlfaWQubmV4dC0+byk7CisJCQkJZmRfbGlzdF91bmxpbmsoICZyLT5ieV9pZCApOworCQkJCWZkX2xpc3RfdW5saW5rKCAmci0+YnlfdGltZSApOworCQkJCWR1cGxfZnJlZV9yZXFfaW5mbyhyKTsKKwkJCX0KKwkJCQorCQkJQ0hFQ0tfUE9TSVhfRE8oIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCAmY2xpZW50LT5kdXBsX2luZm9baWR4XS5kdXBsX2xvY2sgKSwgLyogY29udGludWUgKi8gKTsKKworCQl9CisJCQorCQlmcmVlKGNsaWVudCk7CisJfQorfQorCisKKy8qIE1hY3JvIHRvIGF2b2lkIGR1cGxpY2F0aW5nIHRoZSBjb2RlIGluIHRoZSBuZXh0IGZ1bmN0aW9uICovCisjZGVmaW5lIGNsaWVudF9zZWFyY2hfZmFtaWx5KCBfZmFtaWx5XyApCQkJCQkJCQkJCQkJXAorCQljYXNlIEFGX0lORVQjI19mYW1pbHlfOiB7CQkJCQkJCQkJCQkJXAorCQkJc3RydWN0IHNvY2thZGRyX2luIyNfZmFtaWx5XyAqIHNpbiMjX2ZhbWlseV8gPSAoc3RydWN0IHNvY2thZGRyX2luIyNfZmFtaWx5XyAqKWlwX3BvcnQ7CQkJCVwKKwkJCWZvciAocmVmID0gY2xpX2lwIyNfZmFtaWx5Xy5uZXh0OyByZWYgIT0gJmNsaV9pcCMjX2ZhbWlseV87IHJlZiA9IHJlZi0+bmV4dCkgewkJCQkJXAorCQkJCWNtcCA9IG1lbWNtcCgmc2luIyNfZmFtaWx5Xy0+c2luIyNfZmFtaWx5XyMjX2FkZHIsIAkJCQkJCQlcCisJCQkJCSAgICAgJigoc3RydWN0IHJnd19jbGllbnQgKilyZWYpLT5zaW4jI19mYW1pbHlfLT5zaW4jI19mYW1pbHlfIyNfYWRkciwgCQkJCVwKKwkJCQkJICAgICBzaXplb2Yoc3RydWN0IGluIyNfZmFtaWx5XyMjX2FkZHIpKTsJCQkJCQkJXAorCQkJCWlmIChjbXAgPiAwKSBjb250aW51ZTsgLyogc2VhcmNoIGZ1cnRoZXIgaW4gdGhlIGxpc3QgKi8JCQkJCQkJXAorCQkJCWlmIChjbXAgPCAwKSBicmVhazsgLyogdGhpcyBJUCBpcyBub3QgaW4gdGhlIGxpc3QgKi8JCQkJCQkJXAorCQkJCS8qIE5vdyBjb21wYXJlIHRoZSBwb3J0cyBhcyBmb2xsb3c6ICovCQkJCQkJCQkJXAorCQkJCSAgICAgLyogSWYgdGhlIGlwX3BvcnQgd2UgYXJlIHNlYXJjaGluZyBkb2VzIG5vdCBjb250YWluIGEgcG9ydCwganVzdCByZXR1cm4gdGhlIGZpcnN0IG1hdGNoIHJlc3VsdCAqLwlcCisJCQkJaWYgKCAoc2luIyNfZmFtaWx5Xy0+c2luIyNfZmFtaWx5XyMjX3BvcnQgPT0gMCkgCQkJCQkJCVwKKwkJCQkgICAgIC8qIElmIHRoZSBlbnRyeSBpbiB0aGUgbGlzdCBkb2VzIG5vdCBjb250YWluIGEgcG9ydCwgcmV0dXJuIGl0IGFzIGEgbWF0Y2ggKi8JCQlcCisJCQkJICB8fCAoKChzdHJ1Y3Qgcmd3X2NsaWVudCAqKXJlZiktPnNpbiMjX2ZhbWlseV8tPnNpbiMjX2ZhbWlseV8jI19wb3J0ID09IDApIAkJCQlcCisJCQkJICAgICAvKiBJZiBib3RoIHBvcnRzIGFyZSBlcXVhbCwgaXQgaXMgYSBtYXRjaCAqLwkJCQkJCQlcCisJCQkJICB8fCAoc2luIyNfZmFtaWx5Xy0+c2luIyNfZmFtaWx5XyMjX3BvcnQgPT0gCQkJCQkJCQlcCisJCQkJICAJCSgoc3RydWN0IHJnd19jbGllbnQgKilyZWYpLT5zaW4jI19mYW1pbHlfLT5zaW4jI19mYW1pbHlfIyNfcG9ydCkpIHsJCQlcCisJCQkJCSpyZXMgPSAoc3RydWN0IHJnd19jbGllbnQgKilyZWY7CQkJCQkJCQlcCisJCQkJCXJldHVybiBFRVhJU1Q7CQkJCQkJCQkJCQlcCisJCQkJfQkJCQkJCQkJCQkJCQlcCisJCQkJLyogT3RoZXJ3aXNlLCB0aGUgbGlzdCBpcyBvcmRlcmVkIGJ5IHBvcnQgdmFsdWUgKGJ5dGUgb3JkZXIgZG9lcyBub3QgbWF0dGVyICovCQkJCVwKKwkJCQlpZiAoc2luIyNfZmFtaWx5Xy0+c2luIyNfZmFtaWx5XyMjX3BvcnQgCQkJCQkJCQlcCisJCQkJCT4gKChzdHJ1Y3Qgcmd3X2NsaWVudCAqKXJlZiktPnNpbiMjX2ZhbWlseV8tPnNpbiMjX2ZhbWlseV8jI19wb3J0KSBjb250aW51ZTsJCQlcCisJCQkJZWxzZSBicmVhazsJCQkJCQkJCQkJCQlcCisJCQl9CQkJCQkJCQkJCQkJCQlcCisJCQkqcmVzID0gKHN0cnVjdCByZ3dfY2xpZW50ICopKHJlZi0+cHJldik7CQkJCQkJCQkJXAorCQkJcmV0dXJuIEVOT0VOVDsJCQkJCQkJCQkJCQkJXAorCQl9CisvKiBGdW5jdGlvbiB0byBsb29rIGZvciBhbiBleGlzdGluZyByZ3dfY2xpZW50LCBvciB0aGUgcHJldmlvdXMgZWxlbWVudC4gCisgICBUaGUgY2xpX3J3bCBtdXN0IGJlIGhlbGQgZm9yIHJlYWRpbmcgKGF0IGxlYXN0KSB3aGVuIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4gCisgICBSZXR1cm5zIEVOT0VOVCBpZiB0aGUgbWF0Y2hpbmcgY2xpZW50IGRvZXMgbm90IGV4aXN0LCBhbmQgcmVzIHBvaW50cyB0byB0aGUgcHJldmlvdXMgZWxlbWVudCBpbiB0aGUgbGlzdC4gCisgICBSZXR1cm5zIEVFWElTVCBpZiB0aGUgbWF0Y2hpbmcgY2xpZW50IGlzIGZvdW5kLCBhbmQgcmVzIHBvaW50cyB0byB0aGlzIGVsZW1lbnQuIAorICAgUmV0dXJucyBvdGhlciBlcnJvciBjb2RlIG9uIG90aGVyIGVycm9yLiAqLworc3RhdGljIGludCBjbGllbnRfc2VhcmNoKHN0cnVjdCByZ3dfY2xpZW50ICoqIHJlcywgc3RydWN0IHNvY2thZGRyICogaXBfcG9ydCApCit7CisJaW50IGNtcDsKKwlzdHJ1Y3QgZmRfbGlzdCAqcmVmID0gTlVMTDsKKwkKKwlDSEVDS19QQVJBTVMocmVzICYmIGlwX3BvcnQpOworCQorCXN3aXRjaCAoaXBfcG9ydC0+c2FfZmFtaWx5KSB7CisJCWNsaWVudF9zZWFyY2hfZmFtaWx5KCkKKwkJCQlicmVhazsKKwkJCisJCWNsaWVudF9zZWFyY2hfZmFtaWx5KCA2ICkKKwkJCQlicmVhazsKKwl9CisJCisJLyogV2UncmUgbmV2ZXIgc3VwcG9zZWQgdG8gcmVhY2ggdGhpcyBwb2ludCAqLworCUFTU0VSVCgwKTsKKwlyZXR1cm4gRUlOVkFMOworfQorCitpbnQgcmd3X2NsaWVudHNfZ2V0a2V5KHN0cnVjdCByZ3dfY2xpZW50ICogY2xpLCB1bnNpZ25lZCBjaGFyICoqa2V5LCBzaXplX3QgKmtleV9sZW4pCit7CisJQ0hFQ0tfUEFSQU1TKCBjbGkgJiYga2V5ICYmIGtleV9sZW4gKTsKKwkqa2V5ID0gY2xpLT5rZXkuZGF0YTsKKwkqa2V5X2xlbiA9IGNsaS0+a2V5LmxlbjsKKwlyZXR1cm4gMDsKK30KKworaW50IHJnd19jbGllbnRzX2dldHR5cGUoc3RydWN0IHJnd19jbGllbnQgKiBjbGksIGVudW0gcmd3X2NsaV90eXBlICp0eXBlKQoreworCUNIRUNLX1BBUkFNUyggY2xpICYmIHR5cGUgKTsKKwkqdHlwZSA9IGNsaS0+dHlwZTsKKwlyZXR1cm4gMDsKK30KKworCitpbnQgcmd3X2NsaWVudHNfc2VhcmNoKHN0cnVjdCBzb2NrYWRkciAqIGlwX3BvcnQsIHN0cnVjdCByZ3dfY2xpZW50ICoqIHJlZikKK3sKKwlpbnQgcmV0ID0gMDsKKwkKKwlUUkFDRV9FTlRSWSgiJXAgJXAiLCBpcF9wb3J0LCByZWYpOworCQorCUNIRUNLX1BBUkFNUyhpcF9wb3J0ICYmIHJlZik7CisJCisJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfcndsb2NrX3JkbG9jaygmY2xpX3J3bCkgKTsKKworCXJldCA9IGNsaWVudF9zZWFyY2gocmVmLCBpcF9wb3J0KTsKKwlpZiAocmV0ID09IEVFWElTVCkgeworCQkoKnJlZiktPnJlZmNvdW50ICsrOworCQlyZXQgPSAwOworCX0gZWxzZSB7CisJCSpyZWYgPSBOVUxMOworCX0KKwkKKwlDSEVDS19QT1NJWCggcHRocmVhZF9yd2xvY2tfdW5sb2NrKCZjbGlfcndsKSApOworCQorCXJldHVybiByZXQ7Cit9CisKK2ludCByZ3dfY2xpZW50c19jaGVja19kdXAoc3RydWN0IHJnd19yYWRpdXNfbXNnX21ldGEgKiptc2csIHN0cnVjdCByZ3dfY2xpZW50ICpjbGkpCit7CisJaW50IHAsIGR1cCA9IDA7CisJc3RydWN0IGZkX2xpc3QgKiBsaTsKKwlzdHJ1Y3QgcmVxX2luZm8gKiByOworCQorCVRSQUNFX0VOVFJZKCIlcCAlcCIsIG1zZywgY2xpKTsKKwkKKwlDSEVDS19QQVJBTVMoIG1zZyAmJiBjbGkgKTsKKwkKKwlpZiAoKCptc2cpLT5zZXJ2X3R5cGUgPT0gUkdXX1BMR19UWVBFX0FVVEgpCisJCXAgPSAwOworCWVsc2UKKwkJcCA9IDE7CisJCisJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfbXV0ZXhfbG9jayggJmNsaS0+ZHVwbF9pbmZvW3BdLmR1cGxfbG9jayApICk7CisJCisJLyogU2VhcmNoIGlmIHdlIGhhdmUgdGhpcyBtZXNzYWdlIGluIG91ciBsaXN0ICovCisJZm9yIChsaSA9IGNsaS0+ZHVwbF9pbmZvW3BdLmR1cGxfYnlfaWQubmV4dDsgbGkgIT0gJmNsaS0+ZHVwbF9pbmZvW3BdLmR1cGxfYnlfaWQ7IGxpID0gbGktPm5leHQpIHsKKwkJaW50IGNtcCA9IDA7CisJCXIgPSAoc3RydWN0IHJlcV9pbmZvICopKGxpLT5vKTsKKwkJaWYgKHItPmlkIDwgKCptc2cpLT5yYWRpdXMuaGRyLT5pZGVudGlmaWVyKQorCQkJY29udGludWU7CisJCWlmIChyLT5pZCA+ICgqbXNnKS0+cmFkaXVzLmhkci0+aWRlbnRpZmllcikKKwkJCWJyZWFrOworCQlpZiAoci0+cG9ydCA8ICgqbXNnKS0+cG9ydCkKKwkJCWNvbnRpbnVlOworCQlpZiAoci0+cG9ydCA+ICgqbXNnKS0+cG9ydCkKKwkJCWJyZWFrOworCQljbXAgPSBtZW1jbXAoJnItPmF1dGhbMF0sICYoKm1zZyktPnJhZGl1cy5oZHItPmF1dGhlbnRpY2F0b3JbMF0sIDE2KTsKKwkJaWYgKGNtcCA8IDApCisJCQljb250aW51ZTsKKwkJaWYgKGNtcCA+IDApCisJCQlicmVhazsKKwkJZHVwID0gMTsKKwkJYnJlYWs7CisJfQorCQorCWlmIChkdXApIHsKKwkJdGltZV90IG5vdyA9IHRpbWUoTlVMTCk7CisJCXItPm5iZHVwICs9IDE7CisJCVRSQUNFX0RFQlVHKElORk8sICJSZWNlaXZlZCBkdXBsaWNhdGVkIFJBRElVUyBtZXNzYWdlIChpZDogJTAyaGh4LCBwb3J0OiAlaHUsIGR1cCAjJWQsIHByZXZpb3VzbHkgc2VlbiAlbGQgc2VjcyBhZ28pLiIsIAorCQkJCXItPmlkLCBudG9ocyhyLT5wb3J0KSwgci0+bmJkdXAsIChsb25nKShub3cgLSByLT5yZWNlaXZlZCkpOworCQkKKwkJaWYgKHItPmFucykgeworCQkJLyogUmVzZW5kIHRoZSBhbnN3ZXIgKi8KKwkJCUNIRUNLX0ZDVF9ETyggcmd3X3NlcnZlcnNfc2VuZCgoKm1zZyktPnNlcnZfdHlwZSwgci0+YW5zLT5idWYsIHItPmFucy0+YnVmX3VzZWQsIGNsaS0+c2EsIHItPnBvcnQpLCAgKTsKKwkJCQorCQkJLyogU2hvdWxkIHdlIGRlbGV0ZSAncicgc28gdGhhdCBhIGZ1cnRoZXIgZHVwbGljYXRlIHdpbGwgYWdhaW4gYmUgY29udmVydGVkIHRvIERpYW1ldGVyPyAqLworCQl9CisJCQorCQkvKiBVcGRhdGUgdGhlIHRpbWVzdGFtcCAqLworCQlyLT5yZWNlaXZlZCA9IG5vdzsKKwkJZmRfbGlzdF91bmxpbmsoJnItPmJ5X3RpbWUpOworCQlmZF9saXN0X2luc2VydF9iZWZvcmUoJmNsaS0+ZHVwbF9pbmZvW3BdLmR1cGxfYnlfdGltZSwgJnItPmJ5X3RpbWUpOyAvKiBNb3ZlIGFzIGxhc3QgZW50cnksIHNpbmNlIGl0IGlzIHRoZSBtb3N0IHJlY2VudCAqLworCQkKKwkJLyogRGVsZXRlIHRoZSByZXF1ZXN0IG1lc3NhZ2UgKi8KKwkJcmd3X21zZ19mcmVlKG1zZyk7CisJCQorCX0gZWxzZSB7CisJCS8qIFRoZSBtZXNzYWdlIHdhcyBub3QgYSBkdXBsaWNhdGUsIHdlIHNhdmUgaXQgKi8KKwkJLyogbGkgY3VycmVudGx5IHBvaW50cyB0aGUgdGhlIG5leHQgZW50cnkgaW4gbGlzdF9ieV9pZCAqLworCQlDSEVDS19NQUxMT0NfRE8oIHI9IGR1cGxfbmV3X3JlcV9pbmZvKCptc2cpLCB7IENIRUNLX1BPU0lYX0RPKHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCAmY2xpLT5kdXBsX2luZm9bcF0uZHVwbF9sb2NrICksICk7IHJldHVybiBFTk9NRU07IH0gKTsKKwkJZmRfbGlzdF9pbnNlcnRfYmVmb3JlKGxpLCAmci0+YnlfaWQpOworCQlmZF9saXN0X2luc2VydF9iZWZvcmUoJmNsaS0+ZHVwbF9pbmZvW3BdLmR1cGxfYnlfdGltZSwgJnItPmJ5X3RpbWUpOyAvKiBpdCBpcyB0aGUgbW9zdCByZWNlbnQgKi8KKwl9CisJCQorCUNIRUNLX1BPU0lYKCBwdGhyZWFkX211dGV4X3VubG9jayggJmNsaS0+ZHVwbF9pbmZvW3BdLmR1cGxfbG9jayApICk7CisJCisJcmV0dXJuIDA7Cit9CisKKy8qIENoZWNrIGlmIHRoZSBtZXNzYWdlIGhhcyBhIHZhbGlkIGF1dGhlbnRpY2F0b3IsIGFuZCB1cGRhdGUgdGhlIG1ldGEtZGF0YSBhY2NvcmRpbmdseSAqLworaW50IHJnd19jbGllbnRzX2F1dGhfY2hlY2soc3RydWN0IHJnd19yYWRpdXNfbXNnX21ldGEgKiBtc2csIHN0cnVjdCByZ3dfY2xpZW50ICogY2xpLCB1aW50OF90ICogcmVxX2F1dGgpCit7CisJdW5zaWduZWQgY2hhciAqIGtleTsKKwlzaXplX3Qga2V5bGVuOworCWludCBjb3VudDsKKwkKKwlUUkFDRV9FTlRSWSgiJXAgJXAgJXAiLCBtc2csIGNsaSwgcmVxX2F1dGgpOworCQorCUNIRUNLX1BBUkFNUyhtc2cgJiYgY2xpKTsKKwkKKwlDSEVDS19GQ1Qocmd3X2NsaWVudHNfZ2V0a2V5KGNsaSwgJmtleSwgJmtleWxlbikpOworCQorCWNvdW50ID0gcmFkaXVzX21zZ19jb3VudF9hdHRyKCZtc2ctPnJhZGl1cywgUkFESVVTX0FUVFJfTUVTU0FHRV9BVVRIRU5USUNBVE9SLCAwKTsKKwlpZiAoY291bnQgPiAxKSB7CisJCVRSQUNFX0RFQlVHKElORk8sICJUb28gbWFueSBNZXNzYWdlLUF1dGhlbnRpY2F0b3IgYXR0cmlidXRlcyAoJWQpLCBkaXNjYXJkaW5nIG1lc3NhZ2UuIiwgY291bnQpOworCQlyZXR1cm4gRUlOVkFMOworCX0KKwlpZiAoY291bnQgPT0gMCkgeworCQlUUkFDRV9ERUJVRyhGVUxMLCAiTWVzc2FnZSBkb2VzIG5vdCBjb250YWluIGEgTWVzc2FnZS1BdXRoZW50aWNhdG9yIGF0dHJpYnV0ZXMuIik7CisJCW1zZy0+dmFsaWRfbWFjID0gMDsKKwl9IGVsc2UgeworCQlpZiAocmFkaXVzX21zZ192ZXJpZnlfbXNnX2F1dGgoICZtc2ctPnJhZGl1cywga2V5LCBrZXlsZW4sIHJlcV9hdXRoICkpIHsKKwkJCVRSQUNFX0RFQlVHKElORk8sICJJbnZhbGlkIE1lc3NhZ2UtQXV0aGVudGljYXRvciByZWNlaXZlZCwgZGlzY2FyZGluZyBtZXNzYWdlLiIpOworCQkJcmV0dXJuIEVJTlZBTDsKKwkJfQorCQltc2ctPnZhbGlkX21hYyA9IDE7CisJfQorCQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGRpY3Rfb2JqZWN0ICogY2FjaGVfb3JpZ19ob3N0ID0gTlVMTDsKK3N0YXRpYyBzdHJ1Y3QgZGljdF9vYmplY3QgKiBjYWNoZV9vcmlnX3JlYWxtID0gTlVMTDsKK3N0YXRpYyBzdHJ1Y3QgZGljdF9vYmplY3QgKiBjYWNoZV9yb3V0ZV9yZWNvcmQgPSBOVUxMOworCitpbnQgcmd3X2NsaWVudHNfaW5pdCh2b2lkKQoreworCVRSQUNFX0VOVFJZKCk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaChmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIk9yaWdpbi1Ib3N0IiwgJmNhY2hlX29yaWdfaG9zdCwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJPcmlnaW4tUmVhbG0iLCAmY2FjaGVfb3JpZ19yZWFsbSwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJSb3V0ZS1SZWNvcmQiLCAmY2FjaGVfcm91dGVfcmVjb3JkLCBFTk9FTlQpICk7CisJCisJLyogQ3JlYXRlIHRoZSB0aHJlYWQgdGhhdCB3aWxsIHB1cmdlIG9sZCBSQURJVVMgZHVwbGljYXRlcyAqLworCUNIRUNLX1BPU0lYKCBwdGhyZWFkX2NyZWF0ZSggJmRidF9leHBpcmUsIE5VTEwsIGR1cGxfdGgsIE5VTEwpICk7CisJCisJcmV0dXJuIDA7Cit9CisKKworLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbiBjaGVja3MgaWYgYSBSQURJVVMgbWVzc2FnZSBjb250YWlucyBhIHZhbGlkIE5BUyBpZGVudGlmaWVyLCBhbmQgaW5pdGlhbGl6ZXMgYW4gZW1wdHkgRGlhbWV0ZXIKKyBtZXNzYWdlIHdpdGggdGhlIGFwcHJvcHJpYXRlIHJvdXRpbmcgaW5mb3JtYXRpb24gKi8KKy8qIENoZWNrIHRoYXQgdGhlIE5BUy1JUC1BZHJlc3Mgb3IgTkFTLUlkZW50aWZpZXIgaXMgY29oZXJlbnQgd2l0aCB0aGUgSVAgdGhlIHBhY2tldCB3YXMgcmVjZWl2ZWQgZnJvbSAqLworLyogQWxzbyB1cGRhdGUgdGhlIGNsaWVudCBsaXN0IG9mIGFsaWFzZXMgaWYgbmVlZGVkICovCitpbnQgcmd3X2NsaWVudHNfY3JlYXRlX29yaWdpbihzdHJ1Y3Qgcmd3X3JhZGl1c19tc2dfbWV0YSAqbXNnLCBzdHJ1Y3Qgcmd3X2NsaWVudCAqIGNsaSwgc3RydWN0IG1zZyAqKiBkaWFtKQoreworCWludCBpZHg7CisJaW50IHZhbGlkX25hc19pbmZvID0gMDsKKwlzdHJ1Y3QgcmFkaXVzX2F0dHJfaGRyICpuYXNfaXAgPSBOVUxMLCAqbmFzX2lwNiA9IE5VTEwsICpuYXNfaWQgPSBOVUxMOworCXNpemVfdCBuYXNfaWRfbGVuOworCWNoYXIgKiBvaF9zdHIgPSBOVUxMOyBzaXplX3Qgb2hfc3RybGVuID0gMDsgaW50IG9oX2ZyZWUgPSAwOworCWNoYXIgKiBvcl9zdHIgPSBOVUxMOyBzaXplX3Qgb3Jfc3RybGVuID0gMDsKKwljaGFyICogcnJfc3RyID0gTlVMTDsgc2l6ZV90IHJyX3N0cmxlbiA9IDA7CisJY2hhciBidWZbUkVWRVJTRV9ETlNfU0laRV9NQVhdOyAvKiB0byBzdG9yZSBETlMgbG9va3VwcyByZXN1bHRzICovCisJCisJc3RydWN0IGF2cCAqYXZwID0gTlVMTDsKKwl1bmlvbiBhdnBfdmFsdWUgYXZwX3ZhbDsKKwkKKwlUUkFDRV9FTlRSWSgiJXAgJXAgJXAiLCBtc2csIGNsaSwgZGlhbSk7CisJQ0hFQ0tfUEFSQU1TKG1zZyAmJiBjbGkgJiYgZGlhbSAmJiAoKmRpYW0gPT0gTlVMTCkpOworCQorCS8qIEZpbmQgdGhlIHJlbGV2YW50IGF0dHJpYnV0ZXMsIGlmIGFueSAqLworCWZvciAoaWR4ID0gMDsgaWR4IDwgbXNnLT5yYWRpdXMuYXR0cl91c2VkOyBpZHgrKykgeworCQlzdHJ1Y3QgcmFkaXVzX2F0dHJfaGRyICogYXR0ciA9IChzdHJ1Y3QgcmFkaXVzX2F0dHJfaGRyICopKG1zZy0+cmFkaXVzLmJ1ZiArIG1zZy0+cmFkaXVzLmF0dHJfcG9zW2lkeF0pOworCQlzaXplX3QgYXR0cl9sZW4gPSBhdHRyLT5sZW5ndGggLSBzaXplb2Yoc3RydWN0IHJhZGl1c19hdHRyX2hkcik7CisJCQorCQlpZiAoKGF0dHItPnR5cGUgPT0gUkFESVVTX0FUVFJfTkFTX0lQX0FERFJFU1MpICYmIChhdHRyX2xlbiA9IDQpKSB7CisJCQluYXNfaXAgPSBhdHRyOworCQkJY29udGludWU7CisJCX0KKwkJCQorCQlpZiAoKGF0dHItPnR5cGUgPT0gUkFESVVTX0FUVFJfTkFTX0lERU5USUZJRVIpICYmIChhdHRyX2xlbiA+IDApKSB7CisJCQluYXNfaWQgPSBhdHRyOworCQkJbmFzX2lkX2xlbiA9IGF0dHJfbGVuOworCQkJY29udGludWU7CisJCX0KKwkJCQorCQlpZiAoKGF0dHItPnR5cGUgPT0gUkFESVVTX0FUVFJfTkFTX0lQVjZfQUREUkVTUykgJiYgKGF0dHJfbGVuID0gMTYpKSB7CisJCQluYXNfaXA2ID0gYXR0cjsKKwkJCWNvbnRpbnVlOworCQl9CisJfQorCQkKKwlpZiAoIW5hc19pcCAmJiAhbmFzX2lwNiAmJiAhbmFzX2lkKSB7CisJCVRSQUNFX0RFQlVHKEZVTEwsICJUaGUgbWVzc2FnZSBkb2VzIG5vdCBjb250YWluIGFueSBOQVMgaWRlbnRpZmljYXRpb24gYXR0cmlidXRlLiIpOworCQkKKwkJLyogR2V0IGluZm9ybWF0aW9uIG9uIHRoaXMgcGVlciAqLworCQlDSEVDS19GQ1QoIHJnd19jbGllbnRzX2dldF9vcmlnaW4oY2xpLCAmb2hfc3RyLCAmb2hfc3RybGVuLCAmb3Jfc3RyLCAmb3Jfc3RybGVuKSApOworCQkKKwkJZ290byBkaWFtZXRlcjsKKwl9CisJCisJLyogQ2hlY2sgaWYgdGhlIG1lc3NhZ2Ugd2FzIHJlY2VpdmVkIGZyb20gdGhlIElQIGluIE5BUy1JUC1BZGRyZXNzIGF0dHJpYnV0ZSAqLworCWlmIChuYXNfaXAgJiYgKGNsaS0+c2EtPnNhX2ZhbWlseSA9PSBBRl9JTkVUKSAmJiAhbWVtY21wKG5hc19pcCsxLCAmY2xpLT5zaW4tPnNpbl9hZGRyLCBzaXplb2Yoc3RydWN0IGluX2FkZHIpKSkgeworCQlUUkFDRV9ERUJVRyhGVUxMLCAiTkFTLUlQLUFkZHJlc3MgY29udGFpbnMgdGhlIHNhbWUgYWRkcmVzcyBhcyB0aGUgbWVzc2FnZSB3YXMgcmVjZWl2ZWQgZnJvbS4iKTsKKwkJdmFsaWRfbmFzX2luZm8gfD0gMTsKKwl9CisJaWYgKG5hc19pcDYgJiYgKGNsaS0+c2EtPnNhX2ZhbWlseSA9PSBBRl9JTkVUNikgJiYgIW1lbWNtcChuYXNfaXA2KzEsICZjbGktPnNpbjYtPnNpbjZfYWRkciwgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpKSB7CisJCVRSQUNFX0RFQlVHKEZVTEwsICJOQVMtSVB2Ni1BZGRyZXNzIGNvbnRhaW5zIHRoZSBzYW1lIGFkZHJlc3MgYXMgdGhlIG1lc3NhZ2Ugd2FzIHJlY2VpdmVkIGZyb20uIik7CisJCXZhbGlkX25hc19pbmZvIHw9IDI7CisJfQorCQorCQorCS8qCisJCQlJbiBSQURJVVMgaXQgd291bGQgYmUgcG9zc2libGUgZm9yIGEgcm9ndWUgTkFTIHRvIGZvcmdlIHRoZSBOQVMtSVAtCisJCQlBZGRyZXNzIGF0dHJpYnV0ZSB2YWx1ZS4gIERpYW1ldGVyL1JBRElVUyB0cmFuc2xhdGlvbiBhZ2VudHMgTVVTVAorCQkJY2hlY2sgYSByZWNlaXZlZCBOQVMtSVAtQWRkcmVzcyBvciBOQVMtSVB2Ni1BZGRyZXNzIGF0dHJpYnV0ZSBhZ2FpbnN0CisJCQl0aGUgc291cmNlIGFkZHJlc3Mgb2YgdGhlIFJBRElVUyBwYWNrZXQuICBJZiB0aGV5IGRvIG5vdCBtYXRjaCBhbmQKKwkJCXRoZSBEaWFtZXRlci9SQURJVVMgdHJhbnNsYXRpb24gYWdlbnQgZG9lcyBub3Qga25vdyB3aGV0aGVyIHRoZQorCQkJcGFja2V0IHdhcyBzZW50IGJ5IGEgUkFESVVTIHByb3h5IG9yIE5BUyAoZS5nLiwgbm8gUHJveHktU3RhdGUKKwkJCWF0dHJpYnV0ZSksIHRoZW4gYnkgZGVmYXVsdCBpdCBpcyBhc3N1bWVkIHRoYXQgdGhlIHNvdXJjZSBhZGRyZXNzCisJCQljb3JyZXNwb25kcyB0byBhIFJBRElVUyBwcm94eSwgYW5kIHRoYXQgdGhlIE5BUyBBZGRyZXNzIGlzIGJlaGluZAorCQkJdGhhdCBwcm94eSwgcG90ZW50aWFsbHkgd2l0aCBzb21lIGFkZGl0aW9uYWwgUkFESVVTIHByb3hpZXMgaW4KKwkJCWJldHdlZW4uICBUaGUgRGlhbWV0ZXIvUkFESVVTIHRyYW5zbGF0aW9uIGFnZW50IE1VU1QgaW5zZXJ0IGVudHJpZXMKKwkJCWluIHRoZSBSb3V0ZS1SZWNvcmQgQVZQIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFwcGFyZW50IHJvdXRlLiAgVGhpcworCQkJaW1wbGllcyBkb2luZyBhIHJldmVyc2UgbG9va3VwIG9uIHRoZSBzb3VyY2UgYWRkcmVzcyBhbmQgTkFTLUlQLQorCQkJQWRkcmVzcyBvciBOQVMtSVB2Ni1BZGRyZXNzIGF0dHJpYnV0ZXMgdG8gZGV0ZXJtaW5lIHRoZSBjb3JyZXNwb25kaW5nCisJCQlGUUROcy4KKworCQkJSWYgdGhlIHNvdXJjZSBhZGRyZXNzIGFuZCB0aGUgTkFTLUlQLUFkZHJlc3Mgb3IgTkFTLUlQdjYtQWRkcmVzcyBkbworCQkJbm90IG1hdGNoLCBhbmQgdGhlIERpYW1ldGVyL1JBRElVUyB0cmFuc2xhdGlvbiBhZ2VudCBrbm93cyB0aGF0IGl0IGlzCisJCQl0YWxraW5nIGRpcmVjdGx5IHRvIHRoZSBOQVMgKGUuZy4sIHRoZXJlIGFyZSBubyBSQURJVVMgcHJveGllcworCQkJYmV0d2VlbiBpdCBhbmQgdGhlIE5BUyksIHRoZW4gdGhlIGVycm9yIHNob3VsZCBiZSBsb2dnZWQsIGFuZCB0aGUKKwkJCXBhY2tldCBNVVNUIGJlIGRpc2NhcmRlZC4KKworCQkJRGlhbWV0ZXIgYWdlbnRzIGFuZCBzZXJ2ZXJzIE1VU1QgY2hlY2sgd2hldGhlciB0aGUgTkFTLUlQLUFkZHJlc3MgQVZQCisJCQljb3JyZXNwb25kcyB0byBhbiBlbnRyeSBpbiB0aGUgUm91dGUtUmVjb3JkIEFWUC4gIFRoaXMgaXMgZG9uZSBieQorCQkJZG9pbmcgYSByZXZlcnNlIGxvb2t1cCAoUFRSIFJSKSBmb3IgdGhlIE5BUy1JUC1BZGRyZXNzIHRvIHJldHJpZXZlCisJCQl0aGUgY29ycmVzcG9uZGluZyBGUUROLCBhbmQgYnkgY2hlY2tpbmcgZm9yIGEgbWF0Y2ggd2l0aCB0aGUgUm91dGUtCisJCQlSZWNvcmQgQVZQLiAgSWYgbm8gbWF0Y2ggaXMgZm91bmQsIHRoZW4gYW4gZXJyb3IgaXMgbG9nZ2VkLCBidXQgbm8KKwkJCW90aGVyIGFjdGlvbiBpcyB0YWtlbi4KKwkqLworCWlmIChuYXNfaXAgfHwgbmFzX2lwNikgeworCQlpZiAoIXZhbGlkX25hc19pbmZvKSB7CisJCQlpZiAoKCFjbGktPmlzX2xvY2FsKSAmJiAoY2xpLT50eXBlID09IFJHV19DTElfTkFTKSkgeworCQkJCVRSQUNFX0RFQlVHKElORk8sICJNZXNzYWdlIHJlY2VpdmVkIHdpdGggYSBOQVMtSVAtQWRkcmVzcyBvciBOQVMtSVB2Ni1BZGRyZXNzIGRpZmZlcmVudCBmcm9tIHRoZSBzZW5kZXIncy4gUGxlYXNlIGNvbmZpZ3VyZSBhcyBQcm94eSBpZiB0aGlzIGlzIGV4cGVjdGVkLiBNZXNzYWdlIGRpc2NhcmRlZC4iKTsKKwkJCQlyZXR1cm4gRUlOVkFMOworCQkJfSBlbHNlIHsKKwkJCQlpbnQgcmV0OworCQkJCXNTUyBzczsKKwkJCQkvKiB0aGUgcGVlciBpcyBjb25maWd1cmVkIGFzIGEgcHJveHksIG9yIHJ1bm5pbmcgb24gbG9jYWxob3N0LCBzbyBhY2NlcHQgdGhlIG1lc3NhZ2UgKi8KKwkJCQkKKwkJCQkvKiBJbiB0aGF0IGNhc2UsIHRoZSBjbGkgd2lsbCBiZSBzdG9yZWQgYXMgUm91dGUtUmVjb3JkIGFuZCB0aGUgTkFTLUlQLUFkZHJlc3MgYXMgb3JpZ2luICovCisJCQkJaWYgKCFjbGktPmlzX2xvY2FsKSB7CisJCQkJCXJyX3N0ciA9IGNsaS0+ZnFkbjsKKwkJCQkJcnJfc3RybGVuID0gY2xpLT5mcWRuX2xlbjsKKwkJCQl9CisJCQkJCisJCQkJLyogV2UgbXVzdCBETlMtcmV2ZXJzZSB0aGUgTkFTLUlQKi1BZGRyZXNzICovCisJCQkJbWVtc2V0KCZzcywgMCAsIHNpemVvZihzU1MpKTsKKwkJCQlpZiAobmFzX2lwKSB7CisJCQkJCXNTQTQgKiBzaW4gPSAoc1NBNCAqKSZzczsKKwkJCQkJc2luLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwkJCQkJbWVtY3B5KCZzaW4tPnNpbl9hZGRyLCBuYXNfaXAgKyAxLCBzaXplb2Yoc3RydWN0IGluX2FkZHIpKTsKKwkJCQl9IGVsc2UgeworCQkJCQlzU0E2ICogc2luNiA9IChzU0E2ICopJnNzOworCQkJCQlzaW42LT5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OworCQkJCQltZW1jcHkoJnNpbjYtPnNpbjZfYWRkciwgbmFzX2lwNiArIDEsIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKKwkJCQl9CisJCQkJQ0hFQ0tfU1lTX0RPKCBnZXRuYW1laW5mbyggKHNTQSAqKSZzcywgc1NBbGVuKCZzcyksICZidWZbMF0sIHNpemVvZihidWYpLCBOVUxMLCAwLCBOSV9OQU1FUkVRRCksCisJCQkJCXsKKwkJCQkJCWlmIChjbGktPmlzX2xvY2FsKSB7CisJCQkJCQkJQ0hFQ0tfRkNUKCByZ3dfY2xpZW50c19nZXRfb3JpZ2luKGNsaSwgJm9oX3N0ciwgJm9oX3N0cmxlbiwgJm9yX3N0ciwgJm9yX3N0cmxlbikgKTsKKwkJCQkJCQlnb3RvIGRpYW1ldGVyOworCQkJCQkJfQorCQkJCQkJCisJCQkJCQlUUkFDRV9ERUJVRyhJTkZPLCAiVGhlIE5BUy1JUCotQWRkcmVzcyBjYW5ub3QgYmUgRE5TIHJldmVyc2VkIGluIG9yZGVyIHRvIGNyZWF0ZSB0aGUgT3JpZ2luLUhvc3QgQVZQOyByZWplY3RpbmcgdGhlIG1lc3NhZ2UgKHRyYW5zbGF0aW9uIGlzIGltcG9zc2libGUpLiIpOworCQkJCQkJcmV0dXJuIEVJTlZBTDsKKwkJCQkJfSApOworCQkJCQkKKwkJCQlvaF9zdHIgPSAmYnVmWzBdOworCQkJCUNIRUNLX0ZDVF9ETyggcmV0ID0gZmRfb3NfdmFsaWRhdGVfRGlhbWV0ZXJJZGVudGl0eSgmb2hfc3RyLCAmb2hfc3RybGVuLCAxKSwKKwkJCQkJeworCQkJCQkJaWYgKGNsaS0+aXNfbG9jYWwpIHsKKwkJCQkJCQlDSEVDS19GQ1QoIHJnd19jbGllbnRzX2dldF9vcmlnaW4oY2xpLCAmb2hfc3RyLCAmb2hfc3RybGVuLCAmb3Jfc3RyLCAmb3Jfc3RybGVuKSApOworCQkJCQkJCWdvdG8gZGlhbWV0ZXI7CisJCQkJCQl9CisJCQkJCQkKKwkJCQkJCVRSQUNFX0RFQlVHKElORk8sICJVbmFibGUgdG8gdXNlIHJlc29sdmVkIGNsaWVudCBuYW1lICclcycgYXMgRGlhbWV0ZXJJZGVudGl0eTogJXMiLCBidWYsIHN0cmVycm9yKHJldCkpOworCQkJCQkJcmV0dXJuIHJldDsKKwkJCQkJfSApOworCQkJCW9oX2ZyZWUgPSAxOworCQkJCQorCQkJCW9yX3N0ciA9IHN0cmNocihvaF9zdHIsICcuJyk7CisJCQkJaWYgKG9yX3N0cikgeworCQkJCQlvcl9zdHIgKys7IC8qIG1vdmUgYWZ0ZXIgdGhlIGZpcnN0IGRvdCAqLworCQkJCQlpZiAoKm9yX3N0ciA9PSAnXDAnKQorCQkJCQkJb3Jfc3RyID0gTlVMTDsgLyogRGlzY2FyZCB0aGlzIHJlYWxtLCB3ZSB3aWxsIHVzZSB0aGUgbG9jYWwgcmVhbG0gbGF0ZXIgKi8KKwkJCQkJZWxzZQorCQkJCQkJb3Jfc3RybGVuID0gb2hfc3RybGVuIC0gKG9yX3N0ciAtIG9oX3N0cik7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJLyogVGhlIGF0dHJpYnV0ZSBtYXRjaGVzIHRoZSBzb3VyY2UgYWRkcmVzcywganVzdCB1c2UgdGhpcyBpbiBvcmlnaW4taG9zdCAqLworCQkJQ0hFQ0tfRkNUKCByZ3dfY2xpZW50c19nZXRfb3JpZ2luKGNsaSwgJm9oX3N0ciwgJm9oX3N0cmxlbiwgJm9yX3N0ciwgJm9yX3N0cmxlbikgKTsKKwkJfQorCQkKKwkJZ290byBkaWFtZXRlcjsgLyogd2UgaWdub3JlIHRoZSBuYXNfaWQgaW4gdGhhdCBjYXNlICovCisJfQorCQorCS8qIFdlIGRvbid0IGhhdmUgYSBOQVMtSVAqLUFkZHJlc3MgYXR0cmlidXRlIGlmIHdlIGFyZSBoZXJlICovCisJaWYgKGNsaS0+aXNfbG9jYWwpIHsKKwkJLyogU2ltcGxlOiB3ZSB1c2Ugb3VyIG93biBjb25maWd1cmF0aW9uICovCisJCUNIRUNLX0ZDVCggcmd3X2NsaWVudHNfZ2V0X29yaWdpbihjbGksICZvaF9zdHIsICZvaF9zdHJsZW4sICZvcl9zdHIsICZvcl9zdHJsZW4pICk7CisJCWdvdG8gZGlhbWV0ZXI7CisJfQorCQorCS8qIEF0IHRoaXMgcG9pbnQsIHdlIG9ubHkgaGF2ZSBuYXNfaWQsIGFuZCB0aGUgY2xpZW50IGlzIG5vdCBsb2NhbCAqLworCUFTU0VSVChuYXNfaWQpOworCQorCXsKKwkJaW50IGZvdW5kLCByZXQ7CisJCXN0cnVjdCBhZGRyaW5mbyBoaW50LCAqcmVzLCAqcHRyOworCQkKKwkJLyoKKwkJCUluIFJBRElVUyBpdCB3b3VsZCBiZSBwb3NzaWJsZSBmb3IgYSByb2d1ZSBOQVMgdG8gZm9yZ2UgdGhlIE5BUy0KKwkJCUlkZW50aWZpZXIgYXR0cmlidXRlLiAgRGlhbWV0ZXIvUkFESVVTIHRyYW5zbGF0aW9uIGFnZW50cyBTSE9VTEQKKwkJCWF0dGVtcHQgdG8gY2hlY2sgYSByZWNlaXZlZCBOQVMtSWRlbnRpZmllciBhdHRyaWJ1dGUgYWdhaW5zdCB0aGUKKwkJCXNvdXJjZSBhZGRyZXNzIG9mIHRoZSBSQURJVVMgcGFja2V0LCBieSBkb2luZyBhbiBBL0FBQUEgUlIgcXVlcnkuICBJZgorCQkJdGhlIE5BUy1JZGVudGlmaWVyIGF0dHJpYnV0ZSBjb250YWlucyBhbiBGUUROLCB0aGVuIHN1Y2ggYSBxdWVyeQorCQkJd291bGQgcmVzb2x2ZSB0byBhbiBJUCBhZGRyZXNzIG1hdGNoaW5nIHRoZSBzb3VyY2UgYWRkcmVzcy4gIEhvd2V2ZXIsCisJCQl0aGUgTkFTLUlkZW50aWZpZXIgYXR0cmlidXRlIGlzIG5vdCByZXF1aXJlZCB0byBjb250YWluIGFuIEZRRE4sIHNvCisJCQlzdWNoIGEgcXVlcnkgY291bGQgZmFpbC4gIElmIGl0IGZhaWxzLCBhbiBlcnJvciBzaG91bGQgYmUgbG9nZ2VkLCBidXQKKwkJCW5vIGFjdGlvbiBzaG91bGQgYmUgdGFrZW4sIG90aGVyIHRoYW4gYSByZXZlcnNlIGxvb2t1cCBvbiB0aGUgc291cmNlCisJCQlhZGRyZXNzIGFuZCBpbnNlcnQgdGhlIHJlc3VsdGluZyBGUUROIGludG8gdGhlIFJvdXRlLVJlY29yZCBBVlAuCisKKwkJCURpYW1ldGVyIGFnZW50cyBhbmQgc2VydmVycyBTSE9VTEQgY2hlY2sgd2hldGhlciBhIE5BUy1JZGVudGlmaWVyIEFWUAorCQkJY29ycmVzcG9uZHMgdG8gYW4gZW50cnkgaW4gdGhlIFJvdXRlLVJlY29yZCBBVlAuICBJZiBubyBtYXRjaCBpcworCQkJZm91bmQsIHRoZW4gYW4gZXJyb3IgaXMgbG9nZ2VkLCBidXQgbm8gb3RoZXIgYWN0aW9uIGlzIHRha2VuLgorCQkqLworCQkKKwkJLyogZmlyc3QsIGNoZWNrIGlmIHRoZSBuYXNfaWQgaXMgdGhlIGZxZG4gb2YgdGhlIHBlZXIgb3IgYSBrbm93biBhbGlhcyAqLworCQlpZiAoIWZkX29zX2FsbW9zdGNhc2VzcmNoKG5hc19pZCArIDEsIG5hc19pZF9sZW4sIAorCQkJCQkJY2xpLT5mcWRuLCBjbGktPmZxZG5fbGVuLCBOVUxMKSkgeworCQkJVFJBQ0VfREVCVUcoRlVMTCwgIk5BUy1JZGVudGlmaWVyIGNvbnRhaW5zIHRoZSBmcWRuIG9mIHRoZSBjbGllbnQiKTsKKwkJCWZvdW5kID0gMTsKKwkJfSBlbHNlIHsKKwkJCWZvciAoaWR4ID0gMDsgaWR4IDwgY2xpLT5hbGlhc2VzX25iOyBpZHgrKykgeworCQkJCWlmICghZmRfb3NfY21wKG5hc19pZCArIDEsIG5hc19pZF9sZW4sIAorCQkJCQkJY2xpLT5hbGlhc2VzW2lkeF0ubmFtZSwgY2xpLT5hbGlhc2VzW2lkeF0ubGVuKSkgeworCQkJCQlUUkFDRV9ERUJVRyhGVUxMLCAiTkFTLUlkZW50aWZpZXIgdmFsaWQgdmFsdWUgZm91bmQgaW4gdGhlIGNhY2hlIik7CisJCQkJCWZvdW5kID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJCQorCQlpZiAoZm91bmQpIHsKKwkJCS8qIFRoZSBOQVMtSWRlbnRpZmllciBtYXRjaGVzIHRoZSBzb3VyY2UgSVAgKi8KKwkJCUNIRUNLX0ZDVCggcmd3X2NsaWVudHNfZ2V0X29yaWdpbihjbGksICZvaF9zdHIsICZvaF9zdHJsZW4sICZvcl9zdHIsICZvcl9zdHJsZW4pICk7CisKKwkJCWdvdG8gZGlhbWV0ZXI7CisJCX0KKwkJCisJCS8qIEF0dGVtcHQgRE5TIHJlc29sdXRpb24gb2YgdGhlIGlkZW50aWZpZXIgKi8KKwkJQVNTRVJUKCBuYXNfaWRfbGVuIDwgc2l6ZW9mKGJ1ZikgKTsKKwkJbWVtY3B5KGJ1ZiwgbmFzX2lkICsgMSwgbmFzX2lkX2xlbik7CisJCWJ1ZltuYXNfaWQtPmxlbmd0aCAtIHNpemVvZihzdHJ1Y3QgcmFkaXVzX2F0dHJfaGRyKV0gPSAnXDAnOworCQkKKwkJLyogTm93IGNoZWNrIGlmIHRoaXMgYWxpYXMgaXMgdmFsaWQgZm9yIHRoaXMgcGVlciAqLworCQltZW1zZXQoJmhpbnQsIDAsIHNpemVvZihoaW50KSk7CisJCWhpbnQuYWlfZmxhZ3MgID0gQUlfQ0FOT05OQU1FOworCQlyZXQgPSBnZXRhZGRyaW5mbyhidWYsIE5VTEwsICZoaW50LCAmcmVzKTsKKwkJaWYgKHJldCA9PSAwKSB7CisJCQlzdHJuY3B5KGJ1ZiwgcmVzLT5haV9jYW5vbm5hbWUsIHNpemVvZihidWYpKTsKKwkJCS8qIFRoZSBuYW1lIHdhcyByZXNvbHZlZCBjb3JyZWN0bHksIGRvZXMgaXQgbWF0Y2ggdGhlIElQIG9mIHRoZSBjbGllbnQ/ICovCisJCQlmb3IgKHB0ciA9IHJlczsgcHRyICE9IE5VTEw7IHB0ciA9IHB0ci0+YWlfbmV4dCkgeworCQkJCWlmIChjbGktPnNhLT5zYV9mYW1pbHkgIT0gcHRyLT5haV9mYW1pbHkpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmIChtZW1jbXAoY2xpLT5zYSwgcHRyLT5haV9hZGRyLCBzU0FsZW4oY2xpLT5zYSkpKQorCQkJCQljb250aW51ZTsKKwkJCQkKKwkJCQlmb3VuZCA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCQlmcmVlYWRkcmluZm8ocmVzKTsKKwkJCQorCQkJaWYgKCFmb3VuZCkgeworCQkJCWlmIChjbGktPnR5cGUgPT0gUkdXX0NMSV9OQVMpIHsKKwkJCQkJVFJBQ0VfREVCVUcoSU5GTywgIlRoZSBOQVMtSWRlbnRpZmllciB2YWx1ZSAnJS4qcycgcmVzb2x2ZXMgdG8gYSBkaWZmZXJlbnQgSVAgdGhhbiB0aGUgY2xpZW50J3MsIGRpc2NhcmRpbmcgdGhlIG1lc3NhZ2UuIENvbmZpZ3VyZSB0aGlzIGNsaWVudCBhcyBhIFByb3h5IGlmIHRoaXMgbWVzc2FnZSBzaG91bGQgYmUgdmFsaWQuIiwgCisJCQkJCQkoaW50KW5hc19pZF9sZW4sIChjaGFyICopKG5hc19pZCArIDEpKTsKKwkJCQkJcmV0dXJuIEVJTlZBTDsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiBUaGlzIGlkZW50aWZpZXIgbWF0Y2hlcyBhIGRpZmZlcmVudCBJUCwgYXNzdW1lIGl0IGlzIGEgcHJveGllZCBtZXNzYWdlICovCisJCQkJCWlmICghY2xpLT5pc19sb2NhbCkgeworCQkJCQkJcnJfc3RyID0gY2xpLT5mcWRuOworCQkJCQkJcnJfc3RybGVuID0gY2xpLT5mcWRuX2xlbjsKKwkJCQkJfQorCQkJCQlvaF9zdHIgPSAmYnVmWzBdOyAvKiBUaGUgY2Fub25uYW1lIHJlc29sdmVkICovCisJCQkJCW9oX3N0cmxlbiA9IDA7CisJCQkJCUNIRUNLX0ZDVF9ETyggcmV0ID0gZmRfb3NfdmFsaWRhdGVfRGlhbWV0ZXJJZGVudGl0eSgmb2hfc3RyLCAmb2hfc3RybGVuLCAxKSwKKwkJCQkJCXsKKwkJCQkJCQlUUkFDRV9ERUJVRyhJTkZPLCAiVW5hYmxlIHRvIHVzZSByZXNvbHZlZCBjbGllbnQgbmFtZSAnJXMnIGFzIERpYW1ldGVySWRlbnRpdHk6ICVzIiwgYnVmLCBzdHJlcnJvcihyZXQpKTsKKwkJCQkJCQlyZXR1cm4gcmV0OworCQkJCQkJfSApOworCQkJCQlvaF9mcmVlID0gMTsKKwkJCQkJb3Jfc3RyID0gc3RyY2hyKG9oX3N0ciwgJy4nKTsKKwkJCQkJaWYgKG9yX3N0cikgeworCQkJCQkJb3Jfc3RyICsrOyAvKiBtb3ZlIGFmdGVyIHRoZSBmaXJzdCBkb3QgKi8KKwkJCQkJCWlmICgqb3Jfc3RyID09ICdcMCcpCisJCQkJCQkJb3Jfc3RyID0gTlVMTDsgLyogRGlzY2FyZCB0aGlzIHJlYWxtLCB3ZSB3aWxsIHVzZSB0aGUgbG9jYWwgcmVhbG0gbGF0ZXIgKi8KKwkJCQkJCWVsc2UKKwkJCQkJCQlvcl9zdHJsZW4gPSBvaF9zdHJsZW4gLSAob3Jfc3RyIC0gb2hfc3RyKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLyogSXQgaXMgYSB2YWxpZCBhbGlhcywgc2F2ZSBpdCAqLworCQkJCUNIRUNLX01BTExPQyggY2xpLT5hbGlhc2VzID0gcmVhbGxvYyhjbGktPmFsaWFzZXMsIChjbGktPmFsaWFzZXNfbmIgKyAxKSAqIHNpemVvZihjbGktPmFsaWFzZXNbMF0pKSApOworCQkJCQorCQkJCUNIRUNLX01BTExPQyggY2xpLT5hbGlhc2VzW2NsaS0+YWxpYXNlc19uYiArIDFdLm5hbWUgPSBvczBkdXAobmFzX2lkICsgMSwgbmFzX2lkX2xlbiApICk7CisJCQkJY2xpLT5hbGlhc2VzW2NsaS0+YWxpYXNlc19uYiArIDFdLmxlbiA9IG5hc19pZF9sZW47CisKKwkJCQljbGktPmFsaWFzZXNfbmIgKys7CisJCQkJVFJBQ0VfREVCVUcoRlVMTCwgIlNhdmVkIHZhbGlkIGFsaWFzIGZvciBjbGllbnQ6ICclLipzJyAtPiAnJXMnIiwgKGludCluYXNfaWRfbGVuLCAoY2hhciAqKShuYXNfaWQgKyAxKSwgY2xpLT5mcWRuKTsKKwkJCQlDSEVDS19GQ1QoIHJnd19jbGllbnRzX2dldF9vcmlnaW4oY2xpLCAmb2hfc3RyLCAmb2hfc3RybGVuLCAmb3Jfc3RyLCAmb3Jfc3RybGVuKSApOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogRXJyb3IgcmVzb2x2aW5nIHRoZSBuYW1lICovCisJCQlUUkFDRV9ERUJVRyhJTkZPLCAiTkFTLUlkZW50aWZpZXIgJyVzJyBjYW5ub3QgYmUgcmVzb2x2ZWQ6ICVzLiBJZ25vcmluZy4uLiIsIGJ1ZiwgZ2FpX3N0cmVycm9yKHJldCkpOworCQkJLyogQXNzdW1lIHRoaXMgaXMgYSB2YWxpZCBpZGVudGlmaWVyIGZvciB0aGUgY2xpZW50ICovCisJCQlDSEVDS19GQ1QoIHJnd19jbGllbnRzX2dldF9vcmlnaW4oY2xpLCAmb2hfc3RyLCAmb2hfc3RybGVuLCAmb3Jfc3RyLCAmb3Jfc3RybGVuKSApOworCQl9CisJfQorCQorCS8qIE5vdywgbGV0J3MgY3JlYXRlIHRoZSBlbXB0eSBEaWFtZXRlciBtZXNzYWdlIHdpdGggT3JpZ2luLUhvc3QsIC1SZWFsbSwgYW5kIFJvdXRlLVJlY29yZCBpZiBuZWVkZWQuICovCitkaWFtZXRlcjoKKwlBU1NFUlQob2hfc3RyKTsgLyogSWYgaXQgaXMgbm90IGRlZmluZWQgaGVyZSwgdGhlcmUgaXMgYSBidWcuLi4gKi8KKwlpZiAoIW9yX3N0cikgeworCQlvcl9zdHIgPSBmZF9nX2NvbmZpZy0+Y25mX2RpYW1ybG07IC8qIFVzZSBsb2NhbCByZWFsbSBpbiB0aGF0IGNhc2UgKi8KKwkJb3Jfc3RybGVuID0gZmRfZ19jb25maWctPmNuZl9kaWFtcmxtX2xlbjsKKwl9CisJCisJLyogQ3JlYXRlIGFuIGVtcHR5IERpYW1ldGVyIG1lc3NhZ2Ugc28gdGhhdCBleHRlbnNpb25zIGNhbiBzdG9yZSB0aGVpciBBVlBzICovCisJQ0hFQ0tfRkNUKCAgZmRfbXNnX25ldyAoIE5VTEwsIE1TR0ZMX0FMTE9DX0VURUlELCBkaWFtICkgICk7CisJCisJLyogQWRkIHRoZSBPcmlnaW4tSG9zdCBhcyBuZXh0IEFWUCAqLworCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBjYWNoZV9vcmlnX2hvc3QsIDAsICZhdnAgKSApOworCW1lbXNldCgmYXZwX3ZhbCwgMCwgc2l6ZW9mKGF2cF92YWwpKTsKKwlhdnBfdmFsLm9zLmRhdGEgPSAodW5zaWduZWQgY2hhciAqKW9oX3N0cjsKKwlhdnBfdmFsLm9zLmxlbiA9IG9oX3N0cmxlbjsKKwlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUgKCBhdnAsICZhdnBfdmFsICkgKTsKKwlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkICggKmRpYW0sIE1TR19CUldfTEFTVF9DSElMRCwgYXZwKSApOworCQorCS8qIEFkZCB0aGUgT3JpZ2luLVJlYWxtIGFzIG5leHQgQVZQICovCisJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIGNhY2hlX29yaWdfcmVhbG0sIDAsICZhdnAgKSApOworCW1lbXNldCgmYXZwX3ZhbCwgMCwgc2l6ZW9mKGF2cF92YWwpKTsKKwlhdnBfdmFsLm9zLmRhdGEgPSAodW5zaWduZWQgY2hhciAqKW9yX3N0cjsKKwlhdnBfdmFsLm9zLmxlbiA9IG9yX3N0cmxlbjsKKwlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUgKCBhdnAsICZhdnBfdmFsICkgKTsKKwlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkICggKmRpYW0sIE1TR19CUldfTEFTVF9DSElMRCwgYXZwKSApOworCQorCWlmIChycl9zdHIpIHsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIGNhY2hlX3JvdXRlX3JlY29yZCwgMCwgJmF2cCApICk7CisJCW1lbXNldCgmYXZwX3ZhbCwgMCwgc2l6ZW9mKGF2cF92YWwpKTsKKwkJYXZwX3ZhbC5vcy5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilycl9zdHI7CisJCWF2cF92YWwub3MubGVuID0gcnJfc3RybGVuOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUgKCBhdnAsICZhdnBfdmFsICkgKTsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCAoICpkaWFtLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCkgKTsKKwl9CisJCisJaWYgKG9oX2ZyZWUpCisJCWZyZWUob2hfc3RyKTsKKwkKKwkvKiBEb25lISAqLworCXJldHVybiAwOworfQorCitpbnQgcmd3X2NsaWVudHNfZ2V0X29yaWdpbihzdHJ1Y3Qgcmd3X2NsaWVudCAqY2xpLCBEaWFtSWRfdCAqZnFkbiwgc2l6ZV90ICpmcWRubGVuLCBEaWFtSWRfdCAqcmVhbG0sIHNpemVfdCAqcmVhbG1sZW4pCit7CisJVFJBQ0VfRU5UUlkoIiVwICVwICVwICVwICVwIiwgY2xpLCBmcWRuLCBmcWRubGVuLCByZWFsbSwgcmVhbG1sZW4pOworCUNIRUNLX1BBUkFNUyhjbGkgJiYgZnFkbiAmJiBmcWRubGVuKTsKKwkKKwlpZiAoY2xpLT5pc19sb2NhbCkgeworCQkqZnFkbiA9IGZkX2dfY29uZmlnLT5jbmZfZGlhbWlkOworCQkqZnFkbmxlbiA9IGZkX2dfY29uZmlnLT5jbmZfZGlhbWlkX2xlbjsKKwkJaWYgKHJlYWxtKQorCQkJKnJlYWxtPSBmZF9nX2NvbmZpZy0+Y25mX2RpYW1ybG07CisJCWlmIChyZWFsbWxlbikKKwkJCSpyZWFsbWxlbj0gZmRfZ19jb25maWctPmNuZl9kaWFtcmxtX2xlbjsKKwl9IGVsc2UgeworCQkqZnFkbiA9IGNsaS0+ZnFkbjsKKwkJKmZxZG5sZW4gPSBjbGktPmZxZG5fbGVuOworCQlpZiAocmVhbG0pCisJCQkqcmVhbG09IGNsaS0+cmVhbG07CisJCWlmIChyZWFsbWxlbikKKwkJCSpyZWFsbWxlbj0gY2xpLT5yZWFsbV9sZW47CisJfQorCQkKKwlyZXR1cm4gMDsKK30KKworY2hhciAqIHJnd19jbGllbnRzX2lkKHN0cnVjdCByZ3dfY2xpZW50ICpjbGkpCit7CisJcmV0dXJuIGNsaS0+aXNfbG9jYWwgPyAiKGxvY2FsKSIgOiBjbGktPmZxZG47Cit9CisKKwordm9pZCByZ3dfY2xpZW50c19kaXNwb3NlKHN0cnVjdCByZ3dfY2xpZW50ICoqIHJlZikKK3sKKwlUUkFDRV9FTlRSWSgiJXAiLCByZWYpOworCUNIRUNLX1BBUkFNU19ETyhyZWYsIHJldHVybik7CisJCisJQ0hFQ0tfUE9TSVhfRE8oIHB0aHJlYWRfcndsb2NrX3dybG9jaygmY2xpX3J3bCksICApOworCWNsaWVudF91bmxpbmsoKnJlZik7CisJKnJlZiA9IE5VTEw7CisJQ0hFQ0tfUE9TSVhfRE8oIHB0aHJlYWRfcndsb2NrX3VubG9jaygmY2xpX3J3bCksICk7Cit9CisKK2ludCByZ3dfY2xpZW50c19hZGQoIHN0cnVjdCBzb2NrYWRkciAqIGlwX3BvcnQsIHVuc2lnbmVkIGNoYXIgKioga2V5LCBzaXplX3Qga2V5bGVuLCBlbnVtIHJnd19jbGlfdHlwZSB0eXBlICkKK3sKKwlzdHJ1Y3Qgcmd3X2NsaWVudCAqIHByZXYgPSBOVUxMLCAqbmV3ID0gTlVMTDsKKwlpbnQgcmV0OworCQorCVRSQUNFX0VOVFJZKCIlcCAlcCAlenUiLCBpcF9wb3J0LCBrZXksIGtleWxlbik7CisJCisJQ0hFQ0tfUEFSQU1TKCBpcF9wb3J0ICYmIGtleSAmJiAqa2V5ICYmIGtleWxlbiApOworCUNIRUNLX1BBUkFNUyggKGlwX3BvcnQtPnNhX2ZhbWlseSA9PSBBRl9JTkVUKSB8fCAoaXBfcG9ydC0+c2FfZmFtaWx5ID09IEFGX0lORVQ2KSApOworCUNIRUNLX1BBUkFNUyggKHR5cGUgPT0gUkdXX0NMSV9OQVMpIHx8ICh0eXBlID09IFJHV19DTElfUFhZKSApOworCQorCS8qIER1bXAgdGhlIGVudHJ5IGluIGRlYnVnIG1vZGUgKi8KKwlpZiAoVFJBQ0VfQk9PTChGVUxMICsgMSApKSB7CisJCWNoYXIgc2FfYnVmW3NTQV9EVU1QX1NUUkxFTl07CisJCWZkX3NhX3NkdW1wX251bWVyaWMoc2FfYnVmLCBpcF9wb3J0KTsKKwkJVFJBQ0VfREVCVUcoRlVMTCwgIkFkZGluZyAlczoiLCAodHlwZSA9PSBSR1dfQ0xJX05BUykgPyAiTkFTIiA6ICJQUk9YWSIgICk7CisJCVRSQUNFX0RFQlVHKEZVTEwsICJcdElQIDogJXMiLCBzYV9idWYgKTsKKwkJVFJBQ0VfQlVGRkVSKEZEX0xPR19ERUJVRywgRlVMTCwgIlx0S2V5OiBbIiwgKmtleSwga2V5bGVuLCAiXSIgKTsKKwl9CisJCisJLyogTG9jayB0aGUgbGlzdHMgKi8KKwlDSEVDS19QT1NJWCggcHRocmVhZF9yd2xvY2tfd3Jsb2NrKCZjbGlfcndsKSApOworCQorCS8qIENoZWNrIGlmIHRoZSBzYW1lIGVudHJ5IGRvZXMgbm90IGFscmVhZHkgZXhpc3QgKi8KKwlyZXQgPSBjbGllbnRfc2VhcmNoKCZwcmV2LCBpcF9wb3J0ICk7CisJaWYgKHJldCA9PSBFTk9FTlQpIHsKKwkJLyogTm8gZHVwbGljYXRlIGZvdW5kLCBPayB0byBhZGQgKi8KKwkJQ0hFQ0tfRkNUX0RPKCByZXQgPSBjbGllbnRfY3JlYXRlKCAmbmV3LCAmaXBfcG9ydCwga2V5LCBrZXlsZW4sIHR5cGUgKSwgZ290byBlbmQgKTsKKwkJZmRfbGlzdF9pbnNlcnRfYWZ0ZXIoJnByZXYtPmNoYWluLCAmbmV3LT5jaGFpbik7CisJCW5ldy0+cmVmY291bnQrKzsKKwkJcmV0ID0gMDsKKwkJZ290byBlbmQ7CisJfQorCQorCWlmIChyZXQgPT0gRUVYSVNUKSB7CisJCWNoYXIgc2FfYnVmW3NTQV9EVU1QX1NUUkxFTl07CisJCS8qIENoZWNrIGlmIHRoZSBrZXkgaXMgdGhlIHNhbWUsIHRoZW4gc2tpcCBvciByZXR1cm4gYW4gZXJyb3IgKi8KKwkJaWYgKChrZXlsZW4gPT0gcHJldi0+a2V5LmxlbiApICYmICggISBtZW1jbXAoKmtleSwgcHJldi0+a2V5LmRhdGEsIGtleWxlbikgKSAmJiAodHlwZSA9PSBwcmV2LT50eXBlKSkgeworCQkJVFJBQ0VfREVCVUcoSU5GTywgIlNraXBwaW5nIGR1cGxpY2F0ZSBjbGllbnQgZGVzY3JpcHRpb24iKTsKKwkJCXJldCA9IDA7CisJCQlnb3RvIGVuZDsKKwkJfQorCQkKKwkJZmRfbG9nX2Vycm9yKCJFUlJPUjogQ29uZmxpY3RpbmcgUkFESVVTIGNsaWVudHMgZGVzY3JpcHRpb25zISIpOworCQlUUkFDRV9FUlJPUigiUHJldmlvdXMgZW50cnk6ICVzIiwgKHByZXYtPnR5cGUgPT0gUkdXX0NMSV9OQVMpID8gIk5BUyIgOiAiUFJPWFkiKTsKKwkJZmRfc2Ffc2R1bXBfbnVtZXJpYyhzYV9idWYsIHByZXYtPnNhKTsKKwkJVFJBQ0VfRVJST1IoIlx0SVAgOiAlcyIsIHNhX2J1Zik7CisJCVRSQUNFX0JVRkZFUihGRF9MT0dfRVJST1IsIE5PTkUsICJcdEtleTogWyIsIHByZXYtPmtleS5kYXRhLCBwcmV2LT5rZXkubGVuLCAiXSIgKTsKKwkJVFJBQ0VfRVJST1IoIkNvbmZsaWN0aW5nIGVudHJ5OiAlcyIsICh0eXBlID09IFJHV19DTElfTkFTKSA/ICJOQVMiIDogIlBST1hZIik7CisJCWZkX3NhX3NkdW1wX251bWVyaWMoc2FfYnVmLCBpcF9wb3J0KTsKKwkJVFJBQ0VfRVJST1IoIlx0SVAgOiAlcyIsIHNhX2J1Zik7CisJCVRSQUNFX0JVRkZFUihGRF9MT0dfRVJST1IsIE5PTkUsICJcdEtleTogWyIsICprZXksIGtleWxlbiwgIl0iICk7CisJfQorZW5kOgorCS8qIHJlbGVhc2UgdGhlIGxpc3RzICovCisJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfcndsb2NrX3VubG9jaygmY2xpX3J3bCkgKTsKKwkKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBkdW1wX2NsaV9saXN0KHN0cnVjdCBmZF9saXN0ICpzZW50aSkKK3sKKwlzdHJ1Y3Qgcmd3X2NsaWVudCAqIGNsaWVudCA9IE5VTEw7CisJc3RydWN0IGZkX2xpc3QgKnJlZiA9IE5VTEw7CisJCisJZm9yIChyZWYgPSBzZW50aS0+bmV4dDsgcmVmICE9IHNlbnRpOyByZWYgPSByZWYtPm5leHQpIHsKKwkJY2hhciBzYV9idWZbc1NBX0RVTVBfU1RSTEVOXTsKKwkJY2xpZW50ID0gKHN0cnVjdCByZ3dfY2xpZW50ICopcmVmOworCQlmZF9zYV9zZHVtcF9udW1lcmljKHNhX2J1ZiwgY2xpZW50LT5zYSk7CisJCUxPR19EKCIgIC0gJXMlcyIsIHNhX2J1ZiwgKGNsaWVudC0+dHlwZSA9PSBSR1dfQ0xJX05BUykgPyAiIiA6ICIgW1BST1hZXSIgKTsKKwl9Cit9CisKK3ZvaWQgcmd3X2NsaWVudHNfZHVtcCh2b2lkKQoreworCWlmICggISBUUkFDRV9CT09MKEZVTEwpICkKKwkJcmV0dXJuOworCQorCUNIRUNLX1BPU0lYX0RPKCBwdGhyZWFkX3J3bG9ja19yZGxvY2soJmNsaV9yd2wpLCAvKiBpZ25vcmUgZXJyb3IgKi8gKTsKKwkKKwlpZiAoIUZEX0lTX0xJU1RfRU1QVFkoJmNsaV9pcCkpCisJCWZkX2xvZ19kZWJ1ZygiIFJBRElVUyBJUCBjbGllbnRzIGxpc3Q6Iik7CisJZHVtcF9jbGlfbGlzdCgmY2xpX2lwKTsKKwkJCisJaWYgKCFGRF9JU19MSVNUX0VNUFRZKCZjbGlfaXA2KSkKKwkJZmRfbG9nX2RlYnVnKCIgUkFESVVTIElQdjYgY2xpZW50cyBsaXN0OiIpOworCWR1bXBfY2xpX2xpc3QoJmNsaV9pcDYpOworCQkKKwlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9yd2xvY2tfdW5sb2NrKCZjbGlfcndsKSwgLyogaWdub3JlIGVycm9yICovICk7Cit9CisKK3ZvaWQgcmd3X2NsaWVudHNfZmluaSh2b2lkKQoreworCXN0cnVjdCBmZF9saXN0ICogY2xpZW50OworCQorCVRSQUNFX0VOVFJZKCk7CisJCisJQ0hFQ0tfUE9TSVhfRE8oIHB0aHJlYWRfcndsb2NrX3dybG9jaygmY2xpX3J3bCksIC8qIGlnbm9yZSBlcnJvciAqLyApOworCQorCUNIRUNLX0ZDVF9ETyggZmRfdGhyX3Rlcm0oJmRidF9leHBpcmUpLCAvKiBjb250aW51ZSAqLyApOworCisJLyogZW1wdHkgdGhlIGxpc3RzICovCisJd2hpbGUgKCAhIEZEX0lTX0xJU1RfRU1QVFkoJmNsaV9pcCkgKSB7CisJCWNsaWVudCA9IGNsaV9pcC5uZXh0OworCQlmZF9saXN0X3VubGluayhjbGllbnQpOworCQljbGllbnRfdW5saW5rKChzdHJ1Y3Qgcmd3X2NsaWVudCAqKWNsaWVudCk7CisJfQorCXdoaWxlICghIEZEX0lTX0xJU1RfRU1QVFkoJmNsaV9pcDYpKSB7CisJCWNsaWVudCA9IGNsaV9pcDYubmV4dDsKKwkJZmRfbGlzdF91bmxpbmsoY2xpZW50KTsKKwkJY2xpZW50X3VubGluaygoc3RydWN0IHJnd19jbGllbnQgKiljbGllbnQpOworCX0KKwkKKwlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9yd2xvY2tfdW5sb2NrKCZjbGlfcndsKSwgLyogaWdub3JlIGVycm9yICovICk7CisJCit9CisKK2ludCByZ3dfY2xpZW50X2ZpbmlzaF9zZW5kKHN0cnVjdCByYWRpdXNfbXNnICoqIG1zZywgc3RydWN0IHJnd19yYWRpdXNfbXNnX21ldGEgKiByZXEsIHN0cnVjdCByZ3dfY2xpZW50ICogY2xpKQoreworCWludCBwOworCXN0cnVjdCBmZF9saXN0ICogbGk7CisJCisJVFJBQ0VfRU5UUlkoIiVwICVwICVwIiwgbXNnLCByZXEsIGNsaSk7CisJQ0hFQ0tfUEFSQU1TKCBtc2cgJiYgKm1zZyAmJiBjbGkgKTsKKwkKKwlpZiAoIXJlcSkgeworCQkvKiBXZSBkb24ndCBzdXBwb3J0IHRoaXMgY2FzZSB5ZXQgKi8KKwkJQVNTRVJUKDApOworCQlyZXR1cm4gRU5PVFNVUDsKKwl9CisJCisJLyogQWRkIGFsbCB0aGUgUHJveHktU3RhdGVzIGJhY2sgaW4gdGhlIG1lc3NhZ2UgKi8KKwlmb3IgKHAgPSAwOyBwIDwgcmVxLT5wc19uYjsgcCsrKSB7CisJCXN0cnVjdCByYWRpdXNfYXR0cl9oZHIgKiBhdHRyID0gKHN0cnVjdCByYWRpdXNfYXR0cl9oZHIgKikocmVxLT5yYWRpdXMuYnVmICsgcmVxLT5yYWRpdXMuYXR0cl9wb3NbcmVxLT5wc19maXJzdCArIHBdKTsKKwkJCisJCWlmIChyYWRpdXNfbXNnX2FkZF9hdHRyX3RvX2FycmF5KCptc2csIGF0dHIpKSB7CisJCQlUUkFDRV9ERUJVRyhJTkZPLCAiRXJyb3IgaW4gcmFkaXVzX21zZ19hZGRfYXR0cl90b19hcnJheSwgRU5PTUVNIik7CisJCQlyYWRpdXNfbXNnX2ZyZWUoKm1zZyk7CisJCQlmcmVlKCptc2cpOworCQkJKm1zZyA9IE5VTEw7CisJCQlyZXR1cm4gRU5PTUVNOworCQl9CisJfQorCQorCS8qIEFkZCB0aGUgTWVzc2FnZS1BdXRoZW50aWNhdG9yIGlmIG5lZWRlZCwgYW5kIG90aGVyIGZpbmFsIHRhc2tzICovCisJaWYgKHJhZGl1c19tc2dfZmluaXNoX3NydigqbXNnLCBjbGktPmtleS5kYXRhLCBjbGktPmtleS5sZW4sIHJlcS0+cmFkaXVzLmhkci0+YXV0aGVudGljYXRvcikpIHsKKwkJVFJBQ0VfREVCVUcoSU5GTywgIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHByZXBhcmluZyB0aGUgUkFESVVTIGFuc3dlciIpOworCQlyYWRpdXNfbXNnX2ZyZWUoKm1zZyk7CisJCWZyZWUoKm1zZyk7CisJCSptc2cgPSBOVUxMOworCQlyZXR1cm4gRUlOVkFMOworCX0KKwkKKwkvKiBEZWJ1ZyAqLworCVRSQUNFX0RFQlVHKEZVTEwsICJSQURJVVMgbWVzc2FnZSByZWFkeSBmb3Igc2VuZGluZzoiKTsKKwlyZ3dfbXNnX2R1bXAoKHN0cnVjdCByZ3dfcmFkaXVzX21zZ19tZXRhICopKm1zZywgMCk7CisKKwkvKiBTZW5kIHRoZSBtZXNzYWdlICovCisJQ0hFQ0tfRkNUKCByZ3dfc2VydmVyc19zZW5kKHJlcS0+c2Vydl90eXBlLCAoKm1zZyktPmJ1ZiwgKCptc2cpLT5idWZfdXNlZCwgY2xpLT5zYSwgcmVxLT5wb3J0KSApOworCisJLyogdXBkYXRlIHRoZSBkdXBsaWNhdGUgY2FjaGUgKi8KKwlpZiAocmVxLT5zZXJ2X3R5cGUgPT0gUkdXX1BMR19UWVBFX0FVVEgpCisJCXAgPSAwOworCWVsc2UKKwkJcCA9IDE7CisJCisJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfbXV0ZXhfbG9jayggJmNsaS0+ZHVwbF9pbmZvW3BdLmR1cGxfbG9jayApICk7CisJCisJLyogU2VhcmNoIHRoaXMgbWVzc2FnZSBpbiBvdXIgbGlzdCAqLworCWZvciAobGkgPSBjbGktPmR1cGxfaW5mb1twXS5kdXBsX2J5X2lkLm5leHQ7IGxpICE9ICZjbGktPmR1cGxfaW5mb1twXS5kdXBsX2J5X2lkOyBsaSA9IGxpLT5uZXh0KSB7CisJCWludCBjbXAgPSAwOworCQlzdHJ1Y3QgcmVxX2luZm8gKiByID0gKHN0cnVjdCByZXFfaW5mbyAqKShsaS0+byk7CisJCWlmIChyLT5pZCA8IHJlcS0+cmFkaXVzLmhkci0+aWRlbnRpZmllcikKKwkJCWNvbnRpbnVlOworCQlpZiAoci0+aWQgPiByZXEtPnJhZGl1cy5oZHItPmlkZW50aWZpZXIpCisJCQlicmVhazsKKwkJaWYgKHItPnBvcnQgPCByZXEtPnBvcnQpCisJCQljb250aW51ZTsKKwkJaWYgKHItPnBvcnQgPiByZXEtPnBvcnQpCisJCQlicmVhazsKKwkJY21wID0gbWVtY21wKCZyLT5hdXRoWzBdLCAmcmVxLT5yYWRpdXMuaGRyLT5hdXRoZW50aWNhdG9yWzBdLCAxNik7CisJCWlmIChjbXAgPCAwKQorCQkJY29udGludWU7CisJCWlmIChjbXAgPiAwKQorCQkJYnJlYWs7CisJCQorCQkvKiBXZSBoYXZlIHRoZSByZXF1ZXN0IGluIG91ciBkdXBsaWNhdGUgY2FjaGUgKi8KKwkJLyogVGhpcyBzaG91bGQgbm90IGhhcHBlbiwgYnV0IGp1c3QgaW4gY2FzZS4uLiAqLworCQlpZiAoci0+YW5zKSB7CisJCQlyYWRpdXNfbXNnX2ZyZWUoci0+YW5zKTsKKwkJCWZyZWUoci0+YW5zKTsKKwkJfQorCQkKKwkJLyogTm93IHNhdmUgdGhlIG1lc3NhZ2UgKi8KKwkJci0+YW5zID0gKm1zZzsKKwkJKm1zZyA9IE5VTEw7CisJCQorCQkvKiBVcGRhdGUgdGhlIHRpbWVzdGFtcCAqLworCQl7CisJCQl0aW1lX3Qgbm93ID0gdGltZShOVUxMKTsKKwkJCXItPnJlY2VpdmVkID0gbm93OworCQkJZmRfbGlzdF91bmxpbmsoJnItPmJ5X3RpbWUpOyAvKiBNb3ZlIGFzIGxhc3QgZW50cnksIHNpbmNlIGl0IGlzIHRoZSBtb3N0IHJlY2VudCAqLworCQkJZmRfbGlzdF9pbnNlcnRfYmVmb3JlKCZjbGktPmR1cGxfaW5mb1twXS5kdXBsX2J5X3RpbWUsICZyLT5ieV90aW1lKTsKKwkJfQorCQlicmVhazsKKwl9CisJCQorCUNIRUNLX1BPU0lYKCBwdGhyZWFkX211dGV4X3VubG9jayggJmNsaS0+ZHVwbF9pbmZvW3BdLmR1cGxfbG9jayApICk7CisJCisJLyogSWYgd2UgaGF2ZSBub3QgZm91bmQgdGhlIHJlcXVlc3QgaW4gb3VyIGxpc3QsIHRoZSBwdXJnZSB0aW1lIGlzIHByb2JhYmx5IHRvbyBzbWFsbCAqLworCWlmICgqbXNnKSB7CisJCVRPRE8oIkF1Z21lbnQgdGhlIHB1cmdlIHRpbWUuLi4iKTsKKwkJLyogSWYgd2UgcmVjZWl2ZSB0aGUgZHVwbGljYXRlIHJlcXVlc3QgYWdhaW4sIGl0IHdpbGwgYmUgY29udmVydGVkIHRvIERpYW1ldGVyLi4uICovCisJCXJhZGl1c19tc2dfZnJlZSgqbXNnKTsKKwkJZnJlZSgqbXNnKTsKKwkJKm1zZyA9IE5VTEw7CisJfQorCQorCS8qIEZpbmlzaGVkICovCisJcmV0dXJuIDA7Cit9CisKKy8qIENhbGwgdGhpcyBmdW5jdGlvbiB3aGVuIGEgUkFESVVTIHJlcXVlc3QgaGFzIGV4cGxpY2l0ZWx5IG5vIGFuc3dlciAobWFpbmx5IGFjY291bnRpbmcpIHNvIAordGhhdCB3ZSBwdXJnZSB0aGUgZHVwbGljYXRlIGNhY2hlIGFuZCBhbGxvdyBmdXJ0aGVyIG1lc3NhZ2UgdG8gYmUgdHJhbnNsYXRlZCBhZ2Fpbi4KK1RoaXMgaXMgdXNlZnVsIGZvciBleGFtcGxlIHdoZW4gYSB0ZW1wb3JhcnkgZXJyb3Igb2NjdXJyZWQgaW4gRGlhbWV0ZXIgKGxpa2UgVU5BQkxFX1RPX0RFTElWRVIpICovCitpbnQgcmd3X2NsaWVudF9maW5pc2hfbm9zZW5kKHN0cnVjdCByZ3dfcmFkaXVzX21zZ19tZXRhICogcmVxLCBzdHJ1Y3Qgcmd3X2NsaWVudCAqIGNsaSkKK3sKKwlpbnQgcDsKKwlzdHJ1Y3QgZmRfbGlzdCAqIGxpOworCQorCVRSQUNFX0VOVFJZKCIlcCAlcCIsIHJlcSwgY2xpKTsKKwlDSEVDS19QQVJBTVMoIHJlcSAmJiBjbGkgKTsKKwkKKwkvKiB1cGRhdGUgdGhlIGR1cGxpY2F0ZSBjYWNoZSAqLworCWlmIChyZXEtPnNlcnZfdHlwZSA9PSBSR1dfUExHX1RZUEVfQVVUSCkKKwkJcCA9IDA7CisJZWxzZQorCQlwID0gMTsKKwkKKwlDSEVDS19QT1NJWCggcHRocmVhZF9tdXRleF9sb2NrKCAmY2xpLT5kdXBsX2luZm9bcF0uZHVwbF9sb2NrICkgKTsKKwkKKwkvKiBTZWFyY2ggdGhpcyBtZXNzYWdlIGluIG91ciBsaXN0ICovCisJZm9yIChsaSA9IGNsaS0+ZHVwbF9pbmZvW3BdLmR1cGxfYnlfaWQubmV4dDsgbGkgIT0gJmNsaS0+ZHVwbF9pbmZvW3BdLmR1cGxfYnlfaWQ7IGxpID0gbGktPm5leHQpIHsKKwkJaW50IGNtcCA9IDA7CisJCXN0cnVjdCByZXFfaW5mbyAqIHIgPSAoc3RydWN0IHJlcV9pbmZvICopKGxpLT5vKTsKKwkJaWYgKHItPmlkIDwgcmVxLT5yYWRpdXMuaGRyLT5pZGVudGlmaWVyKQorCQkJY29udGludWU7CisJCWlmIChyLT5pZCA+IHJlcS0+cmFkaXVzLmhkci0+aWRlbnRpZmllcikKKwkJCWJyZWFrOworCQlpZiAoci0+cG9ydCA8IHJlcS0+cG9ydCkKKwkJCWNvbnRpbnVlOworCQlpZiAoci0+cG9ydCA+IHJlcS0+cG9ydCkKKwkJCWJyZWFrOworCQljbXAgPSBtZW1jbXAoJnItPmF1dGhbMF0sICZyZXEtPnJhZGl1cy5oZHItPmF1dGhlbnRpY2F0b3JbMF0sIDE2KTsKKwkJaWYgKGNtcCA8IDApCisJCQljb250aW51ZTsKKwkJaWYgKGNtcCA+IDApCisJCQlicmVhazsKKwkJCisJCS8qIFdlIGhhdmUgdGhlIHJlcXVlc3QgaW4gb3VyIGR1cGxpY2F0ZSBjYWNoZSwgcmVtb3ZlIGl0ICovCisJCWZkX2xpc3RfdW5saW5rKCZyLT5ieV9pZCk7CisJCWZkX2xpc3RfdW5saW5rKCZyLT5ieV90aW1lKTsKKwkJZHVwbF9mcmVlX3JlcV9pbmZvKHIpOworCQlicmVhazsKKwl9CisJCQorCUNIRUNLX1BPU0lYKCBwdGhyZWFkX211dGV4X3VubG9jayggJmNsaS0+ZHVwbF9pbmZvW3BdLmR1cGxfbG9jayApICk7CisJCisJLyogRmluaXNoZWQgKi8KKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9hcHBfcmFkZ3cvcmd3X2NvbW1vbi5oIGIvZXh0ZW5zaW9ucy9hcHBfcmFkZ3cvcmd3X2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmYjcwMGEKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2FwcF9yYWRndy9yZ3dfY29tbW9uLmgKQEAgLTAsMCArMSwyODcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDEzLCBXSURFIFByb2plY3QgYW5kIE5JQ1QJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFdJREUgUHJvamVjdCBvciBOSUNUIG5vciB0aGUgCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgV0lERSBQcm9qZWN0IGFuZCAJCQkJCQkgKgorKiAgIE5JQ1QuCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVGhpcyBmaWxlIGNvbnRhaW5zIGRlZmluaXRpb25zIGZvciBib3RoIGFwcF9yYWRndyBleHRlbnNpb24gYW5kIGl0cyBwbHVnaW5zLiAqLworCisjaWZuZGVmIF9SR1dfQ09NTU9OX0gKKyNkZWZpbmUgX1JHV19DT01NT05fSAorCisvKiBJbmNsdWRlIGRlZmluaXRpb25zIGZyb20gdGhlIGZyZWVEaWFtZXRlciBmcmFtZXdvcmsgKi8KKyNpbmNsdWRlIDxmcmVlRGlhbWV0ZXIvZXh0ZW5zaW9uLmg+CisKKy8qIEluY2x1ZGUgaG9zdGFwIGZpbGVzIGZvciBSQURJVVMgcHJvY2Vzc2luZ3MgKi8KKyNpbmNsdWRlICJob3N0YXBfY29tcGF0LmgiCisjaW5jbHVkZSAibWQ1LmgiCisjaW5jbHVkZSAicmFkaXVzLmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgIEludGVyZmFjZSB3aXRoIGdhdGV3YXkncyBwbHVnLWlucyAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogVGhpcyBzdHJ1Y3R1cmUgaXMgcHJpdmF0ZSBmb3IgZWFjaCBwbHVnaW4gKi8KK3N0cnVjdCByZ3dwX2NvbmZpZzsKKworLyogVGhpcyBzdHJ1Y3R1cmUgcG9pbnRzIHRvIGEgUkFESVVTIGNsaWVudCBkZXNjcmlwdGlvbiwgdGhlIGRlZmluaXRpb24gaXMgbm90IGtub3duIHRvIHBsdWdpbnMgKi8KK3N0cnVjdCByZ3dfY2xpZW50OworCitpbnQgICAgcmd3X2NsaWVudHNfZ2V0a2V5KHN0cnVjdCByZ3dfY2xpZW50ICogY2xpLCB1bnNpZ25lZCBjaGFyICoqa2V5LCBzaXplX3QgKmtleV9sZW4pOworY2hhciAqIHJnd19jbGllbnRzX2lkKHN0cnVjdCByZ3dfY2xpZW50ICpjbGkpOworaW50ICAgIHJnd19jbGllbnRzX2dldF9vcmlnaW4oc3RydWN0IHJnd19jbGllbnQgKmNsaSwgRGlhbUlkX3QgKmZxZG4sIHNpemVfdCAqZnFkbmxlbiwgRGlhbUlkX3QgKnJlYWxtLCBzaXplX3QgKnJlYWxtbGVuKTsKKworLyogRWFjaCBwbHVnaW4gbXVzdCBwcm92aWRlIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlLiAqLworZXh0ZXJuIHN0cnVjdCByZ3dfYXBpIHsKKwkvKiBUaGUgbmFtZSBvZiB0aGUgcGx1Z2luICovCisJY29uc3QgY2hhciAqIHJnd3BfbmFtZTsKKworCS8qIFBhcnNlIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuIEl0IG1heSBiZSBjYWxsZWQgc2V2ZXJhbCB0aW1lcyB3aXRoIGRpZmZlcmVudCBjb25maWd1cmF0aW9ucy4KKwkgICAgQ2FsbGVkIGV2ZW4gaWYgbm8gY29uZmlndXJhdGlvbiBmaWxlIGlzIHBhc3NlZCAod2l0aCBOVUxMIGNvbmZfZmlsZSBwYXJhbWV0ZXIgdGhlbikgKi8KKwlpbnQgKCpyZ3dwX2NvbmZfcGFyc2UpICggY2hhciAqIGNvbmZfZmlsZSwgc3RydWN0IHJnd3BfY29uZmlnICoqIHN0YXRlICk7CisJCisJLyogQ2xlYW51cCB0aGUgY29uZmlndXJhdGlvbiBzdGF0ZSB3aGVuIHRoZSBkYWVtb24gaXMgZXhpdGluZyAoY2FsbGVkIGV2ZW4gaWYgc3RhdGUgaXMgTlVMTCkuICovCisJdm9pZCAoKnJnd3BfY29uZl9mcmVlKSAoc3RydWN0IHJnd3BfY29uZmlnICogc3RhdGUpOworCisJLyogaGFuZGxlIGFuIGluY29taW5nIFJBRElVUyBtZXNzYWdlICovCisJaW50CSgqcmd3cF9yYWRfcmVxKSAoIHN0cnVjdCByZ3dwX2NvbmZpZyAqIGNvbmYsIHN0cnVjdCByYWRpdXNfbXNnICogcmFkX3JlcSwgc3RydWN0IHJhZGl1c19tc2cgKiogcmFkX2Fucywgc3RydWN0IG1zZyAqKiBkaWFtX2Z3LCBzdHJ1Y3Qgcmd3X2NsaWVudCAqIGNsaSApOworCS8qIHJldCA+MDogY3JpdGljYWwgZXJyb3IgKGVycm5vKSwgbG9nIGFuZCBleGl0LgorCSAgIHJldCAwOiBjb250aW51ZTsgCisJICAgcmV0IC0xOiBzdG9wIHByb2Nlc3NpbmcgdGhpcyBtZXNzYWdlCisJICAgcmV0IC0yOiByZXBseSB0aGUgY29udGVudCBvZiByYWRfYW5zIHRvIHRoZSBSQURJVVMgY2xpZW50IGltbWVkaWF0bHkKKwkgKi8KKwkKKwkvKiBoYW5kbGUgdGhlIGNvcnJlc3BvbmRpbmcgRGlhbWV0ZXIgYW5zd2VyICovCisJaW50CSgqcmd3cF9kaWFtX2FucykgKCBzdHJ1Y3Qgcmd3cF9jb25maWcgKiBjb25mLCBzdHJ1Y3QgbXNnICoqIGRpYW1fYW5zLCBzdHJ1Y3QgcmFkaXVzX21zZyAqKiByYWRfZncsIHN0cnVjdCByZ3dfY2xpZW50ICogY2xpICk7CisJLyogcmV0IDA6IGNvbnRpbnVlOyByZXQgPjA6IGVycm9yOyByZXQ6IC0xIC4uLiAodGJkKSAqLworCQorfSByZ3dwX2Rlc2NyaXB0b3I7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgQWRkaXRpb25hbCBkZWZpbml0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBUeXBlIG9mIG1lc3NhZ2UgLyBzZXJ2ZXIgKi8KKyNkZWZpbmUgUkdXX1BMR19UWVBFX0FVVEgJMQorI2RlZmluZSBSR1dfUExHX1RZUEVfQUNDVAkyCisKKy8qIENsYXNzIGF0dHJpYnV0ZSBwcmVmaXggdG8gc3RvcmUgdGhlIEF1dGggQXBwbGljYXRpb24gSWQgKHJlcXVpcmVkIHRvIHNlbmQgU1RSKSAqLworI2RlZmluZSBDTEFTU19BQUlfUFJFRklYIAkiZkQvcmd3eC9hYWk6IgorCisvKiBBdHRyaWJ1dGVzIG1pc3NpbmcgZnJvbSByYWRpdXMuaCAobm90IHVzZWQgaW4gRUFQKSAqLworZW51bSB7IFJBRElVU19BVFRSX0NIQVBfUEFTU1dPUkQgPSAzLAorCVJBRElVU19BVFRSX1NFUlZJQ0VfVFlQRSA9IDYsCisJUkFESVVTX0FUVFJfRlJBTUVEX1BST1RPQ09MID0gNywKKwlSQURJVVNfQVRUUl9GUkFNRURfSVBfQUREUkVTUyA9IDgsCisJUkFESVVTX0FUVFJfRlJBTUVEX0lQX05FVE1BU0sgPSA5LAorCVJBRElVU19BVFRSX0ZSQU1FRF9ST1VUSU5HID0gMTAsCisJUkFESVVTX0FUVFJfRklMVEVSX0lEID0gMTEsCisJUkFESVVTX0FUVFJfRlJBTUVEX0NPTVBSRVNTSU9OID0gMTMsCisJUkFESVVTX0FUVFJfTE9HSU5fSVBfSE9TVCA9IDE0LAorCVJBRElVU19BVFRSX0xPR0lOX1NFUlZJQ0UgPSAxNSwKKwlSQURJVVNfQVRUUl9MT0dJTl9UQ1BfUE9SVCA9IDE2LAorCVJBRElVU19BVFRSX0NBTExCQUNLX05VTUJFUiA9IDE5LAorCVJBRElVU19BVFRSX0NBTExCQUNLX0lEID0gMjAsCisJUkFESVVTX0FUVFJfRlJBTUVEX1JPVVRFID0gMjIsCisJUkFESVVTX0FUVFJfRlJBTUVEX0lQWF9ORVRXT1JLID0gMjMsCisJUkFESVVTX0FUVFJfTE9HSU5fTEFUX1NFUlZJQ0UgPSAzNCwKKwlSQURJVVNfQVRUUl9MT0dJTl9MQVRfTk9ERSA9IDM1LAorCVJBRElVU19BVFRSX0xPR0lOX0xBVF9HUk9VUCA9IDM2LAorCVJBRElVU19BVFRSX0ZSQU1FRF9BUFBMRVRBTEtfTElOSyA9IDM3LAorCVJBRElVU19BVFRSX0ZSQU1FRF9BUFBMRVRBTEtfTkVUV09SSyA9IDM4LAorCVJBRElVU19BVFRSX0ZSQU1FRF9BUFBMRVRBTEtfWk9ORSA9IDM5LAorCVJBRElVU19BVFRSX0NIQVBfQ0hBTExFTkdFID0gNjAsCisJUkFESVVTX0FUVFJfUE9SVF9MSU1JVCA9IDYyLAorCVJBRElVU19BVFRSX0xPR0lOX0xBVF9QT1JUID0gNjMsCisJUkFESVVTX0FUVFJfVFVOTkVMX0NMSUVOVF9FTkRQT0lOVCA9IDY2LAorCVJBRElVU19BVFRSX1RVTk5FTF9TRVJWRVJfRU5EUE9JTlQgPSA2NywKKwlSQURJVVNfQVRUUl9UVU5ORUxfUEFTU1dPUkQgPSA2OSwKKwlSQURJVVNfQVRUUl9BUkFQX1BBU1NXT1JEID0gNzAsCisJUkFESVVTX0FUVFJfQVJBUF9GRUFUVVJFUyA9IDcxLAorCVJBRElVU19BVFRSX0FSQVBfWk9ORV9BQ0NFU1MgPSA3MiwKKwlSQURJVVNfQVRUUl9BUkFQX1NFQ1VSSVRZID0gNzMsCisJUkFESVVTX0FUVFJfQVJBUF9TRUNVUklUWV9EQVRBID0gNzQsCisJUkFESVVTX0FUVFJfUEFTU1dPUkRfUkVUUlkgPSA3NSwKKwlSQURJVVNfQVRUUl9QUk9NUFQgPSA3NiwKKwlSQURJVVNfQVRUUl9DT05GSUdVUkFUSU9OX1RPS0VOID0gNzgsCisJUkFESVVTX0FUVFJfVFVOTkVMX0FTU0lHTk1FTlRfSUQgPSA4MiwKKwlSQURJVVNfQVRUUl9UVU5ORUxfUFJFRkVSRU5DRSA9IDgzLAorCVJBRElVU19BVFRSX0FSQVBfQ0hBTExFTkdFX1JFU1BPTlNFID0gODQsCisJUkFESVVTX0FUVFJfTkFTX1BPUlRfSUQgPSA4NywKKwlSQURJVVNfQVRUUl9GUkFNRURfUE9PTCA9IDg4LAorCVJBRElVU19BVFRSX1RVTk5FTF9DTElFTlRfQVVUSF9JRCA9IDkwLAorCVJBRElVU19BVFRSX1RVTk5FTF9TRVJWRVJfQVVUSF9JRCA9IDkxLAorCVJBRElVU19BVFRSX09SSUdJTkFUSU5HX0xJTkVfSU5GTyA9IDk0LAorCVJBRElVU19BVFRSX0ZSQU1FRF9JTlRFUkZBQ0VfSUQgPSA5NiwKKwlSQURJVVNfQVRUUl9GUkFNRURfSVBWNl9QUkVGSVggPSA5NywKKwlSQURJVVNfQVRUUl9MT0dJTl9JUFY2X0hPU1QgPSA5OCwKKwlSQURJVVNfQVRUUl9GUkFNRURfSVBWNl9ST1VURSA9IDk5LAorCVJBRElVU19BVFRSX0ZSQU1FRF9JUFY2X1BPT0wgPSAxMDAsCisJUkFESVVTX0FUVFJfRVJST1JfQ0FVU0UgPSAxMDEsCisJUkFESVVTX0FUVFJfRUFQX0tFWV9OQU1FID0gMTAyLAorCVJBRElVU19BVFRSX0RJR0VTVF9SRVNQT05TRSA9IDEwMywKKwlSQURJVVNfQVRUUl9ESUdFU1RfUkVBTE0gPSAxMDQsCisJUkFESVVTX0FUVFJfRElHRVNUX05PTkNFID0gMTA1LAorCVJBRElVU19BVFRSX0RJR0VTVF9SRVNQT05TRV9BVVRIPTEwNiwKKwlSQURJVVNfQVRUUl9ESUdFU1RfTkVYVE5PTkNFID0gMTA3LAorCVJBRElVU19BVFRSX0RJR0VTVF9NRVRIT0QgPSAxMDgsCisJUkFESVVTX0FUVFJfRElHRVNUX1VSSSA9IDEwOSwKKwlSQURJVVNfQVRUUl9ESUdFU1RfUU9QID0gMTEwLAorCVJBRElVU19BVFRSX0RJR0VTVF9BTEdPUklUSE0gPSAxMTEsCisJUkFESVVTX0FUVFJfRElHRVNUX0VOVElUWV9CT0RZX0hBU0g9MTEyLAorCVJBRElVU19BVFRSX0RJR0VTVF9DTk9OQ0UgPSAxMTMsCisJUkFESVVTX0FUVFJfRElHRVNUX05PTkNFX0NPVU5UID0gMTE0LAorCVJBRElVU19BVFRSX0RJR0VTVF9VU0VSTkFNRSA9IDExNSwKKwlSQURJVVNfQVRUUl9ESUdFU1RfSEExID0gMTIxLAorCVJBRElVU19BVFRSX1NJUF9BT1IgPSAxMjIKK307CisKK2VudW0geyAgRElBTV9BVFRSX1VTRVJfTkFNRSA9IDEsCisJRElBTV9BVFRSX1VTRVJfUEFTU1dPUkQgPSAyLAorCURJQU1fQVRUUl9OQVNfSVBfQUREUkVTUyA9IDQsCisJRElBTV9BVFRSX05BU19QT1JUID0gNSwKKwlESUFNX0FUVFJfU0VSVklDRV9UWVBFID0gNiwKKwlESUFNX0FUVFJfRlJBTUVEX1BST1RPQ09MID0gNywKKwlESUFNX0FUVFJfRlJBTUVEX0lQX0FERFJFU1MgPSA4LAorCURJQU1fQVRUUl9GUkFNRURfSVBfTkVUTUFTSyA9IDksCisJRElBTV9BVFRSX0ZSQU1FRF9ST1VUSU5HID0gMTAsCisJRElBTV9BVFRSX0ZJTFRFUl9JRCA9IDExLAorCURJQU1fQVRUUl9GUkFNRURfTVRVID0gMTIsCisJRElBTV9BVFRSX0ZSQU1FRF9DT01QUkVTU0lPTiA9IDEzLAorCURJQU1fQVRUUl9MT0dJTl9JUF9IT1NUID0gMTQsCisJRElBTV9BVFRSX0xPR0lOX1NFUlZJQ0UgPSAxNSwKKwlESUFNX0FUVFJfTE9HSU5fVENQX1BPUlQgPSAxNiwKKwlESUFNX0FUVFJfUkVQTFlfTUVTU0FHRSA9IDE4LAorCURJQU1fQVRUUl9DQUxMQkFDS19OVU1CRVIgPSAxOSwKKwlESUFNX0FUVFJfQ0FMTEJBQ0tfSUQgPSAyMCwKKwlESUFNX0FUVFJfRlJBTUVEX1JPVVRFID0gMjIsCisJRElBTV9BVFRSX0ZSQU1FRF9JUFhfTkVUV09SSyA9IDIzLAorCURJQU1fQVRUUl9TVEFURSA9IDI0LAorCURJQU1fQVRUUl9DTEFTUyA9IDI1LAorCURJQU1fQVRUUl9JRExFX1RJTUVPVVQgPSAyOCwKKwlESUFNX0FUVFJfTkFTX0lERU5USUZJRVIgPSAzMiwKKwlESUFNX0FUVFJfTE9HSU5fTEFUX1NFUlZJQ0UgPSAzNCwKKwlESUFNX0FUVFJfTE9HSU5fTEFUX05PREUgPSAzNSwKKwlESUFNX0FUVFJfTE9HSU5fTEFUX0dST1VQID0gMzYsCisJRElBTV9BVFRSX0ZSQU1FRF9BUFBMRVRBTEtfTElOSyA9IDM3LAorCURJQU1fQVRUUl9GUkFNRURfQVBQTEVUQUxLX05FVFdPUksgPSAzOCwKKwlESUFNX0FUVFJfRlJBTUVEX0FQUExFVEFMS19aT05FID0gMzksCisJRElBTV9BVFRSX0FDQ1RfU0VTU0lPTl9JRCA9IDQ0LAorCURJQU1fQVRUUl9BQ0NUX01VTFRJX1NFU1NJT05fSUQgPSA1MCwKKwlESUFNX0FUVFJfRVZFTlRfVElNRVNUQU1QID0gNTUsCisJRElBTV9BVFRSX05BU19QT1JUX1RZUEUgPSA2MSwKKwlESUFNX0FUVFJfUE9SVF9MSU1JVCA9IDYyLAorCURJQU1fQVRUUl9MT0dJTl9MQVRfUE9SVCA9IDYzLAorCURJQU1fQVRUUl9UVU5ORUxfVFlQRSA9IDY0LAorCURJQU1fQVRUUl9UVU5ORUxfTUVESVVNX1RZUEUgPSA2NSwKKwlESUFNX0FUVFJfVFVOTkVMX0NMSUVOVF9FTkRQT0lOVCA9IDY2LAorCURJQU1fQVRUUl9UVU5ORUxfU0VSVkVSX0VORFBPSU5UID0gNjcsCisJRElBTV9BVFRSX1RVTk5FTF9QQVNTV09SRCA9IDY5LAorCURJQU1fQVRUUl9BUkFQX0ZFQVRVUkVTID0gNzEsCisJRElBTV9BVFRSX0FSQVBfWk9ORV9BQ0NFU1MgPSA3MiwKKwlESUFNX0FUVFJfQVJBUF9TRUNVUklUWSA9IDczLAorCURJQU1fQVRUUl9BUkFQX1NFQ1VSSVRZX0RBVEEgPSA3NCwKKwlESUFNX0FUVFJfUEFTU1dPUkRfUkVUUlkgPSA3NSwKKwlESUFNX0FUVFJfUFJPTVBUID0gNzYsCisJRElBTV9BVFRSX0NPTkZJR1VSQVRJT05fVE9LRU4gPSA3OCwKKwlESUFNX0FUVFJfVFVOTkVMX1BSSVZBVEVfR1JPVVBfSUQgPSA4MSwKKwlESUFNX0FUVFJfVFVOTkVMX0FTU0lHTk1FTlRfSUQgPSA4MiwKKwlESUFNX0FUVFJfVFVOTkVMX1BSRUZFUkVOQ0UgPSA4MywKKwlESUFNX0FUVFJfQVJBUF9DSEFMTEVOR0VfUkVTUE9OU0UgPSA4NCwKKwlESUFNX0FUVFJfQUNDVF9JTlRFUklNX0lOVEVSVkFMID0gODUsCisJRElBTV9BVFRSX05BU19QT1JUX0lEID0gODcsCisJRElBTV9BVFRSX0ZSQU1FRF9QT09MID0gODgsCisJRElBTV9BVFRSX1RVTk5FTF9DTElFTlRfQVVUSF9JRCA9IDkwLAorCURJQU1fQVRUUl9UVU5ORUxfU0VSVkVSX0FVVEhfSUQgPSA5MSwKKwlESUFNX0FUVFJfTkFTX0lQVjZfQUREUkVTUyA9IDk1LAorCURJQU1fQVRUUl9GUkFNRURfSU5URVJGQUNFX0lEID0gOTYsCisJRElBTV9BVFRSX0ZSQU1FRF9JUFY2X1BSRUZJWCA9IDk3LAorCURJQU1fQVRUUl9MT0dJTl9JUFY2X0hPU1QgPSA5OCwKKwlESUFNX0FUVFJfRlJBTUVEX0lQVjZfUk9VVEUgPSA5OSwKKwlESUFNX0FUVFJfRlJBTUVEX0lQVjZfUE9PTCA9IDEwMCwKKwlESUFNX0FUVFJfRUFQX0tFWV9OQU1FID0gMTAyLAorCURJQU1fQVRUUl9ESUdFU1RfUkVTUE9OU0UgPSAxMDMsCisJRElBTV9BVFRSX0RJR0VTVF9SRUFMTSA9IDEwNCwKKwlESUFNX0FUVFJfRElHRVNUX05PTkNFID0gMTA1LAorCURJQU1fQVRUUl9ESUdFU1RfUkVTUE9OU0VfQVVUSD0xMDYsCisJRElBTV9BVFRSX0RJR0VTVF9ORVhUTk9OQ0UgPSAxMDcsCisJRElBTV9BVFRSX0RJR0VTVF9NRVRIT0QgPSAxMDgsCisJRElBTV9BVFRSX0RJR0VTVF9VUkkgPSAxMDksCisJRElBTV9BVFRSX0RJR0VTVF9RT1AgPSAxMTAsCisJRElBTV9BVFRSX0RJR0VTVF9BTEdPUklUSE0gPSAxMTEsCisJRElBTV9BVFRSX0RJR0VTVF9FTlRJVFlfQk9EWV9IQVNIPTExMiwKKwlESUFNX0FUVFJfRElHRVNUX0NOT05DRSA9IDExMywKKwlESUFNX0FUVFJfRElHRVNUX05PTkNFX0NPVU5UID0gMTE0LAorCURJQU1fQVRUUl9ESUdFU1RfVVNFUk5BTUUgPSAxMTUsCisJRElBTV9BVFRSX0RJR0VTVF9IQTEgPSAxMjEsCisJRElBTV9BVFRSX1NJUF9BT1IgPSAxMjIsCisJRElBTV9BVFRSX0FVVEhfQVBQTElDQVRJT05fSUQgPSAyNTgsCisJRElBTV9BVFRSX0FDQ1RfQVBQTElDQVRJT05fSUQgPSAyNTksCisJRElBTV9BVFRSX1ZFTkRPUl9TUEVDSUZJQ19BUFBMSUNBVElPTl9JRCA9IDI2MCwKKwlESUFNX0FUVFJfU0VTU0lPTl9JRCA9IDI2MywKKwlESUFNX0FUVFJfT1JJR0lOX0hPU1QgPSAyNjQsCisJRElBTV9BVFRSX01VTFRJX1JPVU5EX1RJTUVPVVQgPSAyNzIsCisJRElBTV9BVFRSX0FVVEhfUkVRVUVTVF9UWVBFID0gMjc0LAorCURJQU1fQVRUUl9BVVRIX0dSQUNFX1BFUklPRCA9IDI3NiwKKwlESUFNX0FUVFJfQVVUSF9TRVNTSU9OX1NUQVRFID0gMjc3LAorCURJQU1fQVRUUl9PUklHSU5fU1RBVEVfSUQgPSAyNzgsCisJRElBTV9BVFRSX0ZBSUxFRF9BVlAgPSAyNzksCisJRElBTV9BVFRSX0VSUk9SX01FU1NBR0UgPSAyODEsCisJRElBTV9BVFRSX1JPVVRFX1JFQ09SRCA9IDI4MiwKKwlESUFNX0FUVFJfUFJPWFlfSU5GTyA9IDI4NCwKKwlESUFNX0FUVFJfQUNDT1VOVElOR19TVUJfU0VTU0lPTl9JRCA9IDI4NywKKwlESUFNX0FUVFJfRVJST1JfUkVQT1JUSU5HX0hPU1QgPSAyOTQsCisJRElBTV9BVFRSX1RFUk1JTkFUSU9OX0NBVVNFID0gMjk1LAorCURJQU1fQVRUUl9PUklHSU5fUkVBTE0gPSAyOTYsCisJRElBTV9BVFRSX1NJUF9BVVRIX0RBVEFfSVRFTSA9IDM3NiwKKwlESUFNX0FUVFJfU0lQX0FVVEhFTlRJQ0FUSU9OX1NDSEVNRSA9IDM3NywKKwlESUFNX0FUVFJfU0lQX0FVVEhFTlRJQ0FURSA9IDM3OSwKKwlESUFNX0FUVFJfU0lQX05VTUJFUl9BVVRIX0lURU1TID0gMzgyLAorCURJQU1fQVRUUl9OQVNfRklMVEVSX1JVTEUgPSA0MDAsCisJRElBTV9BVFRSX1RVTk5FTElORyA9IDQwMSwKKwlESUFNX0FUVFJfUU9TX0ZJTFRFUl9SVUxFID0gNDA3LAorCURJQU1fQVRUUl9PUklHSU5fQUFBX1BST1RPQ09MID0gNDA4LAorCURJQU1fQVRUUl9FQVBfUEFZTE9BRCA9IDQ2MiwKKwlESUFNX0FUVFJfRUFQX1JFSVNTVUVEX1BBWUxPQUQgPSA0NjMsCisJRElBTV9BVFRSX0VBUF9NQVNURVJfU0VTU0lPTl9LRVkgPSA0NjQsCisJRElBTV9BVFRSX0FDQ09VTlRJTkdfRUFQX0FVVEhfTUVUSE9EID0gNDY1LAorCURJQU1fQVRUUl9BQ0NPVU5USU5HX1JFQ09SRF9UWVBFID0gNDgwLAorCURJQU1fQVRUUl9BQ0NPVU5USU5HX1JFQUxUSU1FX1JFUVVJUkVEID0gNDgzLAorCURJQU1fQVRUUl9BQ0NPVU5USU5HX1JFQ09SRF9OVU1CRVIgPSA0ODUKK307CisKK2NvbnN0IGNoYXIgKiByZ3dfbXNnX2F0dHJ0eXBlX3N0cih1bnNpZ25lZCBjaGFyIGMpOworY29uc3QgY2hhciAqIHJnd19tc2dfY29kZV9zdHIodW5zaWduZWQgY2hhciBjKTsKKworI2VuZGlmIC8qIF9SR1dfQ09NTU9OX0ggKi8KKyAgCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2FwcF9yYWRndy9yZ3dfY29uZi5sIGIvZXh0ZW5zaW9ucy9hcHBfcmFkZ3cvcmd3X2NvbmYubApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWZkNzc5Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9hcHBfcmFkZ3cvcmd3X2NvbmYubApAQCAtMCwwICsxLDI3NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTMsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTGV4IGNvbmZpZ3VyYXRpb24gcGFyc2VyIGZvciByYWRpdXNfZ3cgZXh0ZW5zaW9uLgorICoKKyAqLworCisleworI2luY2x1ZGUgInJndy5oIgorI2luY2x1ZGUgInJnd19jb25mLnRhYi5oIgorCisvKiBVcGRhdGUgdGhlIGNvbHVtbiBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBZWV9VU0VSX0FDVElPTiB7IAkJCQkJCVwKKwl5eWxsb2MtPmZpcnN0X2NvbHVtbiA9IHl5bGxvYy0+bGFzdF9jb2x1bW4gKyAxOyAJCVwKKwl5eWxsb2MtPmxhc3RfY29sdW1uID0geXlsbG9jLT5maXJzdF9jb2x1bW4gKyB5eWxlbmcgLSAxOwlcCit9CisKKy8qICVvcHRpb24gbm9pbnB1dCA/ICovCisjZGVmaW5lIFlZX05PX0lOUFVUCislfQorCislb3B0aW9uIGJpc29uLWJyaWRnZSBiaXNvbi1sb2NhdGlvbnMKKyVvcHRpb24gbm95eXdyYXAKKyVvcHRpb24gbm91bnB1dAorCisvKiBVc2UgdGhlIGZvbGxvd2luZyBzdGFydCBjb25kaXRpb24gdG8gcGFyc2UgYW4gVVJJICovCisleAlJTl9QTEcKKyV4CUlOX0NMSTEKKyV4CUlOX0NMSTIKKyV4CUVYUEVDVF9JUDQKKyV4CUVYUEVDVF9JUDYKKyV4CUVYUEVDVF9ERUNJTlQKKworLyogUXVvdGVkIHN0cmluZy4gTXVsdGlsaW5lcyBkbyBub3QgbWF0Y2guICovCitxc3RyaW5nCQlcIlteXCJcbl0qXCIKKworLyogVXNlZCB0byBtYXRjaCBJUCwgSVA2LCBhbmQgcG9ydCAqLworSVA0CQlbMC05XXsxLDN9XC5bMC05XXsxLDN9XC5bMC05XXsxLDN9XC5bMC05XXsxLDN9CitJUDYJCVtbOnhkaWdpdDpdXSo6W1s6eGRpZ2l0Ol1dKjpbWzp4ZGlnaXQ6XS46XSoKK0JSX1BPUlQJCVtbXVswLTldK1tdXQorCisKKyUlCisKKwkvKiBBbGwgc2VjdGlvbnMgKi8KKzwqPlxuCQkJeyAKKwkJCQkvKiBVcGRhdGUgdGhlIGxpbmUgY291bnQgKi8KKwkJCQl5eWxsb2MtPmZpcnN0X2xpbmUrKzsgCisJCQkJeXlsbG9jLT5sYXN0X2xpbmUrKzsgCisJCQkJeXlsbG9jLT5sYXN0X2NvbHVtbj0wOyAKKwkJCX0gCisKKzwqPihbWzpzcGFjZTpdXXstfVtcbl0pKwk7IC8qIEVhdCBhbGwgc3BhY2VzLCBub3QgbmV3IGxpbmVzICovCis8Kj4jLiokCQkJOyAvKiBFYXQgYWxsIGNvbW1lbnRzICovCisKKzwqPntxc3RyaW5nfQkJeworCQkJCS8qIEZpcnN0IGNvcHkgdGhlIHN0cmluZyB3aXRob3V0IHRoZSBxdW90ZXMgZm9yIHVzZSBpbiB0aGUgeWFjYyBwYXJzZXIgKi8KKwkJCQl5eWx2YWwtPnN0cmluZyA9IHN0cmR1cCh5eXRleHQrMSk7CisJCQkJaWYgKHl5bHZhbC0+c3RyaW5nID09IE5VTEwpIHsKKwkJCQkJZmRfbG9nX2RlYnVnKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5OiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCQkJCXJldHVybiBMRVhfRVJST1I7IC8qIHRyaWcgYW4gZXJyb3IgaW4geWFjYyBwYXJzZXIgKi8KKwkJCQl9CisKKwkJCQl5eWx2YWwtPnN0cmluZ1t5eWxlbmctMl0gPSAnXDAnOworCQkJCQorCQkJCS8qIHRoZSB5YWNjIHBhcnNlciB3aWxsIGNoZWNrIHRoZSBzdHJpbmcgaXMgdmFsaWQgKi8KKwkJCQlyZXR1cm4gUVNUUklORzsKKwkJCX0KKworCisJLyogRXh0ZW5zaW9uIHNlY3Rpb24gKi8JCQkKKyg/aToiUkdXWCIpCQl7IEJFR0lOKElOX1BMRyk7IHJldHVybiBQTEdfUFJFRklYOyAJCX0KKworPElOX1BMRz4oP2k6ImF1dGgiKQl7IHJldHVybiBBVVRIOyB9Cis8SU5fUExHPig/aToiYWNjdCIpCXsgcmV0dXJuIEFDQ1Q7IH0KKworPElOX1BMRyxJTl9DTEkyPltbOnhkaWdpdDpdXSsJeworCQkJCS8qIENvbnZlcnQgdGhpcyB0byBhbiBpbnRlZ2VyIHZhbHVlICovCisJCQkJaW50IHJldCA9IHNzY2FuZih5eXRleHQsICIleCIsICZ5eWx2YWwtPmludGVnZXIpOworCQkJCWlmIChyZXQgIT0gMSkgeworCQkJCQkvKiBObyBtYXRjaGluZzogYW4gZXJyb3Igb2NjdXJyZWQgKi8KKwkJCQkJZmRfbG9nX2RlYnVnKCJVbmFibGUgdG8gY29udmVydCB0aGUgdmFsdWUgJyVzJyB0byBhIHZhbGlkIG51bWJlcjogJXMiLCB5eXRleHQsIHN0cmVycm9yKGVycm5vKSk7CisJCQkJCXJldHVybiBMRVhfRVJST1I7IC8qIHRyaWcgYW4gZXJyb3IgaW4geWFjYyBwYXJzZXIgKi8KKwkJCQkJLyogTWF5YmUgd2UgY291bGQgUkVKRUNUIGluc3RlYWQgb2YgZmFpbGluZyBoZXJlPyAqLworCQkJCX0KKwkJCQlyZXR1cm4gSU5URUdFUjsKKwkJCX0KKworPElOX1BMRz5bOl0JCXsgcmV0dXJuIHl5dGV4dFswXTsgfQorCisKKwkvKiBDbGllbnQgc2VjdGlvbiAqLworKD9pOiJuYXMifCJjbGkiKQl7IEJFR0lOKElOX0NMSTEpOyB5eWx2YWwtPmludGVnZXI9UkdXX0NMSV9OQVM7IHJldHVybiBOQVNfT1JfUFhZOyAJCX0KKyg/aToicHh5IikJCXsgQkVHSU4oSU5fQ0xJMSk7IHl5bHZhbC0+aW50ZWdlcj1SR1dfQ0xJX1BYWTsgcmV0dXJuIE5BU19PUl9QWFk7IAkJfQorCisJLyogTWF0Y2ggYW4gSVAgKDQgb3IgNikgYW5kIG9wdGlvbmFsIHBvcnQgKi8KKzxJTl9DTEkxPih7SVA0fXx7SVA2fSl7QlJfUE9SVH0/CXsKKwkJCQljaGFyICogd29yazsKKwkJCQljaGFyICogcG9ydDsKKwkJCQl1bnNpZ25lZCBzaG9ydCBwID0gMDsKKwkJCQkKKwkJCQl3b3JrID0gc3RyZHVwKHl5dGV4dCk7CisJCQkJaWYgKCB3b3JrID09IE5VTEwgKSB7CisJCQkJCWZkX2xvZ19kZWJ1ZygiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeTogJXMiLCBzdHJlcnJvcihlcnJubykpOworCQkJCQlyZXR1cm4gTEVYX0VSUk9SOyAvKiB0cmlnIGFuIGVycm9yIGluIHlhY2MgcGFyc2VyICovCisJCQkJfQorCQkJCQorCQkJCWlmICgocG9ydCA9IHN0cmNocih3b3JrLCAnWycpKSAhPSBOVUxMKSB7CisJCQkJCSpwb3J0ID0gJ1wwJzsKKwkJCQkJcG9ydCsrOworCQkJCQlpZiAoc3NjYW5mKHBvcnQsICIlaHVdIiwgJnApICE9IDEpIHsKKwkJCQkJCWZkX2xvZ19kZWJ1ZygiJyVzJyBpcyBub3QgYSB2YWxpZCBwb3J0OiAlcyIsIHBvcnQsIHN0cmVycm9yKGVycm5vKSk7CisJCQkJCQlmcmVlKHdvcmspOworCQkJCQkJcmV0dXJuIExFWF9FUlJPUjsgLyogdHJpZyBhbiBlcnJvciBpbiB5YWNjIHBhcnNlciAqLworCQkJCQl9CisJCQkJfQorCQkJCQorCQkJCS8qIERvIHdlIGhhdmUgYW4gSVAgb3IgSVB2Nj8gTGV0J3MgY2hlY2sgaWYgd2UgaGF2ZSAnOicgY2hhciBzb21ld2hlcmUgaW4gdGhlIGJlZ2lubmluZyAqLworCQkJCWlmIChtZW1jaHIod29yaywgJzonLCA1KSAhPSBOVUxMKSB7CisJCQkJCXN0cnVjdCBzb2NrYWRkcl9pbjYgKiBzaW42ID0gTlVMTDsKKwkJCQkKKwkJCQkJc2luNiA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNikpOworCQkJCQlpZiAoc2luNiA9PSBOVUxMKSB7CisJCQkJCQlmZF9sb2dfZGVidWcoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnk6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCQkJCWZyZWUod29yayk7CisJCQkJCQlyZXR1cm4gTEVYX0VSUk9SOyAvKiB0cmlnIGFuIGVycm9yIGluIHlhY2MgcGFyc2VyICovCisJCQkJCX0KKwkJCQkJCisJCQkJCW1lbXNldChzaW42LCAwLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNikpOworCQkJCQlzaW42LT5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OworCQkJCQlpZiAoaW5ldF9wdG9uKEFGX0lORVQ2LCB3b3JrLCAmc2luNi0+c2luNl9hZGRyKSAhPSAxKSB7CisJCQkJCQlmZF9sb2dfZGVidWcoIiclcycgaXMgbm90IGEgdmFsaWQgSVB2NiBhZGRyZXNzOiAlcyIsIHdvcmssIHN0cmVycm9yKGVycm5vKSk7CisJCQkJCQlmcmVlKHdvcmspOworCQkJCQkJZnJlZShzaW42KTsKKwkJCQkJCXJldHVybiBMRVhfRVJST1I7IC8qIHRyaWcgYW4gZXJyb3IgaW4geWFjYyBwYXJzZXIgKi8KKwkJCQkJfQorCQkJCQlzaW42LT5zaW42X3BvcnQgPSBodG9ucyhwKTsKKwkJCQkJeXlsdmFsLT5zcyA9IChzdHJ1Y3Qgc29ja2FkZHIgKilzaW42OworCQkJCX0gZWxzZSB7CisJCQkJCXN0cnVjdCBzb2NrYWRkcl9pbiAqIHNpbiA9IE5VTEw7CisJCQkJCisJCQkJCXNpbiA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSk7CisJCQkJCWlmIChzaW4gPT0gTlVMTCkgeworCQkJCQkJZmRfbG9nX2RlYnVnKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5OiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCQkJCQlmcmVlKHdvcmspOworCQkJCQkJcmV0dXJuIExFWF9FUlJPUjsgLyogdHJpZyBhbiBlcnJvciBpbiB5YWNjIHBhcnNlciAqLworCQkJCQl9CisJCQkJCQorCQkJCQltZW1zZXQoc2luLCAwLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSk7CisJCQkJCXNpbi0+c2luX2ZhbWlseSA9IEFGX0lORVQ7CisJCQkJCWlmIChpbmV0X3B0b24oQUZfSU5FVCwgd29yaywgJnNpbi0+c2luX2FkZHIpICE9IDEpIHsKKwkJCQkJCWZkX2xvZ19kZWJ1ZygiJyVzJyBpcyBub3QgYSB2YWxpZCBJUCBhZGRyZXNzOiAlcyIsIHdvcmssIHN0cmVycm9yKGVycm5vKSk7CisJCQkJCQlmcmVlKHdvcmspOworCQkJCQkJZnJlZShzaW4pOworCQkJCQkJcmV0dXJuIExFWF9FUlJPUjsgLyogdHJpZyBhbiBlcnJvciBpbiB5YWNjIHBhcnNlciAqLworCQkJCQl9CisJCQkJCQorCQkJCQlzaW4tPnNpbl9wb3J0ID0gaHRvbnMocCk7CisJCQkJCXl5bHZhbC0+c3MgPSAoc3RydWN0IHNvY2thZGRyICopc2luOworCQkJCX0KKwkJCQlmcmVlKHdvcmspOworCQkJCXJldHVybiBJUDsKKwkJCX0KKworCis8SU5fQ0xJMT4iLyIJCXsgQkVHSU4oSU5fQ0xJMik7IHJldHVybiAnLyc7CSAJCX0KKworCisJLyogU2VydmVycyBzZWN0aW9uICovCisoP2k6ImF1dGhfc2VydmVyX2VuYWJsZSIpCXsgQkVHSU4oRVhQRUNUX0RFQ0lOVCk7IHJldHVybiBBVVRIX0VOQUJMRTsgCX0KKyg/aToiYXV0aF9zZXJ2ZXJfcG9ydCIpCQl7IEJFR0lOKEVYUEVDVF9ERUNJTlQpOyByZXR1cm4gQVVUSF9QT1JUOyAJfQorKD9pOiJhdXRoX3NlcnZlcl9pcDQiKQkJeyBCRUdJTihFWFBFQ1RfSVA0KTsgcmV0dXJuIEFVVEhfSVA0OyAJCX0KKyg/aToiYXV0aF9zZXJ2ZXJfaXA2IikJCXsgQkVHSU4oRVhQRUNUX0lQNik7IHJldHVybiBBVVRIX0lQNjsgCQl9CisoP2k6ImFjY3Rfc2VydmVyX2VuYWJsZSIpCXsgQkVHSU4oRVhQRUNUX0RFQ0lOVCk7IHJldHVybiBBQ0NUX0VOQUJMRTsgCX0KKyg/aToiYWNjdF9zZXJ2ZXJfcG9ydCIpCQl7IEJFR0lOKEVYUEVDVF9ERUNJTlQpOyByZXR1cm4gQUNDVF9QT1JUOyAJfQorKD9pOiJhY2N0X3NlcnZlcl9pcDQiKQkJeyBCRUdJTihFWFBFQ1RfSVA0KTsgcmV0dXJuIEFDQ1RfSVA0OyAJCX0KKyg/aToiYWNjdF9zZXJ2ZXJfaXA2IikJCXsgQkVHSU4oRVhQRUNUX0lQNik7IHJldHVybiBBQ0NUX0lQNjsgCQl9CisKKzxFWFBFQ1RfREVDSU5UPltbOmRpZ2l0Ol1dKwl7CisJCQkJCS8qIE1hdGNoIGFuIGludGVnZXIgKG5vdCBoZXhhKSAqLworCQkJCQlpbnQgcmV0ID0gc3NjYW5mKHl5dGV4dCwgIiVkIiwgJnl5bHZhbC0+aW50ZWdlcik7CisJCQkJCWlmIChyZXQgIT0gMSkgeworCQkJCQkJLyogTm8gbWF0Y2hpbmc6IGFuIGVycm9yIG9jY3VycmVkICovCisJCQkJCQlmZF9sb2dfZGVidWcoIlVuYWJsZSB0byBjb252ZXJ0IHRoZSB2YWx1ZSAnJXMnIHRvIGEgdmFsaWQgbnVtYmVyOiAlcyIsIHl5dGV4dCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCQkJCXJldHVybiBMRVhfRVJST1I7IC8qIHRyaWcgYW4gZXJyb3IgaW4geWFjYyBwYXJzZXIgKi8KKwkJCQkJCS8qIE1heWJlIHdlIGNvdWxkIFJFSkVDVCBpbnN0ZWFkIG9mIGZhaWxpbmcgaGVyZT8gKi8KKwkJCQkJfQorCQkJCQlyZXR1cm4gSU5URUdFUjsKKwkJCQl9CisKKzxFWFBFQ1RfSVA0LEVYUEVDVF9JUDY+KD9pOiJkaXNhYmxlIikJeyByZXR1cm4gRElTQUJMRUQ7IAkJCQl9CisJCQkJCis8RVhQRUNUX0lQND57SVA0fQkJeworCQkJCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gKiBzaW4gPSBOVUxMOworCQkJCQorCQkJCQlzaW4gPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpOworCQkJCQlpZiAoc2luID09IE5VTEwpIHsKKwkJCQkJCWZkX2xvZ19kZWJ1ZygiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeTogJXMiLCBzdHJlcnJvcihlcnJubykpOworCQkJCQkJcmV0dXJuIExFWF9FUlJPUjsgLyogdHJpZyBhbiBlcnJvciBpbiB5YWNjIHBhcnNlciAqLworCQkJCQl9CisJCQkJCQorCQkJCQltZW1zZXQoc2luLCAwLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSk7CisJCQkJCXNpbi0+c2luX2ZhbWlseSA9IEFGX0lORVQ7CisJCQkJCWlmIChpbmV0X3B0b24oQUZfSU5FVCwgeXl0ZXh0LCAmc2luLT5zaW5fYWRkcikgIT0gMSkgeworCQkJCQkJZmRfbG9nX2RlYnVnKCInJXMnIGlzIG5vdCBhIHZhbGlkIElQIGFkZHJlc3M6ICVzIiwgeXl0ZXh0LCBzdHJlcnJvcihlcnJubykpOworCQkJCQkJZnJlZShzaW4pOworCQkJCQkJcmV0dXJuIExFWF9FUlJPUjsgLyogdHJpZyBhbiBlcnJvciBpbiB5YWNjIHBhcnNlciAqLworCQkJCQl9CisJCQkJCXl5bHZhbC0+c3MgPSAoc3RydWN0IHNvY2thZGRyICopc2luOworCQkJCQlyZXR1cm4gSVA7CisJCQkJfQorCis8RVhQRUNUX0lQNj57SVA2fQkJeworCQkJCQlzdHJ1Y3Qgc29ja2FkZHJfaW42ICogc2luNiA9IE5VTEw7CisJCQkJCisJCQkJCXNpbjYgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpKTsKKwkJCQkJaWYgKHNpbjYgPT0gTlVMTCkgeworCQkJCQkJZmRfbG9nX2RlYnVnKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5OiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCQkJCQlyZXR1cm4gTEVYX0VSUk9SOyAvKiB0cmlnIGFuIGVycm9yIGluIHlhY2MgcGFyc2VyICovCisJCQkJCX0KKwkJCQkJCisJCQkJCW1lbXNldChzaW42LCAwLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNikpOworCQkJCQlzaW42LT5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OworCQkJCQlpZiAoaW5ldF9wdG9uKEFGX0lORVQ2LCB5eXRleHQsICZzaW42LT5zaW42X2FkZHIpICE9IDEpIHsKKwkJCQkJCWZkX2xvZ19kZWJ1ZygiJyVzJyBpcyBub3QgYSB2YWxpZCBJUHY2IGFkZHJlc3M6ICVzIiwgeXl0ZXh0LCBzdHJlcnJvcihlcnJubykpOworCQkJCQkJZnJlZShzaW42KTsKKwkJCQkJCXJldHVybiBMRVhfRVJST1I7IC8qIHRyaWcgYW4gZXJyb3IgaW4geWFjYyBwYXJzZXIgKi8KKwkJCQkJfQorCQkJCQl5eWx2YWwtPnNzID0gKHN0cnVjdCBzb2NrYWRkciAqKXNpbjY7CisJCQkJCXJldHVybiBJUDsKKwkJCQl9CisKKwkKKwkvKiBWYWxpZCBzaW5nbGUgY2hhcmFjdGVycyBmb3IgeXlwYXJzZSBpbiBhbGwgY29udGV4dHMgKi8KKzwqPls9XQkJCXsgcmV0dXJuIHl5dGV4dFswXTsgfQorPCo+WztdCQkJeyBCRUdJTihJTklUSUFMKTsgcmV0dXJuIHl5dGV4dFswXTsgfQorCisJLyogVW5yZWNvZ25pemVkIHRva2VuICovCis8Kj5bWzphbG51bTpdXSsJCXwJLyogVGhpcyBydWxlIGlzIG9ubHkgdXNlZnVsIHRvIHByaW50IGEgY29tcGxldGUgdG9rZW4gaW4gZXJyb3IgbWVzc2FnZXMgKi8KKwkvKiBVbnJlY29nbml6ZWQgY2hhcmFjdGVyICovCis8Kj4uCQkJeyAKKwkJCQlmZF9sb2dfZGVidWcoIlVucmVjb2duaXplZCB0ZXh0IG9uIGxpbmUgJWQgY29sICVkOiAnJXMnLiIsIHl5bGxvYy0+Zmlyc3RfbGluZSwgeXlsbG9jLT5maXJzdF9jb2x1bW4sIHl5dGV4dCk7CisJCQkgCXJldHVybiBMRVhfRVJST1I7IAorCQkJfQorCislJQpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9hcHBfcmFkZ3cvcmd3X2NvbmYueSBiL2V4dGVuc2lvbnMvYXBwX3JhZGd3L3Jnd19jb25mLnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNhYjc0NgotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvYXBwX3JhZGd3L3Jnd19jb25mLnkKQEAgLTAsMCArMSw0MDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDEzLCBXSURFIFByb2plY3QgYW5kIE5JQ1QJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFdJREUgUHJvamVjdCBvciBOSUNUIG5vciB0aGUgCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgV0lERSBQcm9qZWN0IGFuZCAJCQkJCQkgKgorKiAgIE5JQ1QuCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogWWFjYyBleHRlbnNpb24ncyBjb25maWd1cmF0aW9uIHBhcnNlci4KKyAqIFNlZSBkb2MvYXBwX3JhZGd3LmNvbmYuc2FtcGxlIGZvciBjb25maWd1cmF0aW9uIGZpbGUgZm9ybWF0CisgKi8KKworLyogRm9yIGRldmVsb3BtZW50IG9ubHkgOiAqLworJWRlYnVnIAorJWVycm9yLXZlcmJvc2UKKworLyogVGhlIHBhcnNlciByZWNlaXZlcyB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGZpbGVuYW1lIGFzIHBhcmFtZXRlciAqLworJXBhcnNlLXBhcmFtIHtjaGFyICogY29uZmZpbGV9CisKKy8qIEtlZXAgdHJhY2sgb2YgbG9jYXRpb24gKi8KKyVsb2NhdGlvbnMgCislcHVyZS1wYXJzZXIKKworJXsKKyNpbmNsdWRlICJyZ3cuaCIKKyNpbmNsdWRlICJyZ3dfY29uZi50YWIuaCIJLyogYmlzb24gaXMgbm90IHNtYXJ0IGVub3VnaCB0byBkZWZpbmUgdGhlIFlZTFRZUEUgYmVmb3JlIGluY2x1ZGluZyB0aGlzIGNvZGUsIHNvLi4uICovCisKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbiAqLworaW50IHl5cGFyc2UoY2hhciAqIGNvbmZmaWxlKTsKKworLyogUGFyc2UgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSAqLworaW50IHJnd19jb25mX2hhbmRsZShjaGFyICogY29uZmZpbGUpCit7CisJZXh0ZXJuIEZJTEUgKiByZ3dfY29uZmluOworCWludCByZXQ7CisJCisJcmd3X2NvbmZpbiA9IGZvcGVuKGNvbmZmaWxlLCAiciIpOworCWlmIChyZ3dfY29uZmluID09IE5VTEwpIHsKKwkJcmV0ID0gZXJybm87CisJCWZkX2xvZ19kZWJ1ZygiVW5hYmxlIHRvIG9wZW4gZXh0ZW5zaW9uIGNvbmZpZ3VyYXRpb24gZmlsZSAlcyBmb3IgcmVhZGluZzogJXMiLCBjb25mZmlsZSwgc3RyZXJyb3IocmV0KSk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gcmd3X2NvbmZwYXJzZShjb25mZmlsZSk7CisKKwlmY2xvc2Uocmd3X2NvbmZpbik7CisKKwlpZiAocmV0ICE9IDApIHsKKwkJcmV0dXJuIEVJTlZBTDsKKwl9CisJCisJcmV0dXJuIDA7Cit9CisKKy8qIFRoZSBMZXggcGFyc2VyIHByb3RvdHlwZSAqLworaW50IHJnd19jb25mbGV4KFlZU1RZUEUgKmx2YWxwLCBZWUxUWVBFICpsbG9jcCk7CisKKy8qIEZ1bmN0aW9uIHRvIHJlcG9ydCB0aGUgZXJyb3JzICovCit2b2lkIHl5ZXJyb3IgKFlZTFRZUEUgKnBsb2MsIGNoYXIgKiBjb25mZmlsZSwgY2hhciBjb25zdCAqcykKK3sKKwlpZiAocGxvYy0+Zmlyc3RfbGluZSAhPSBwbG9jLT5sYXN0X2xpbmUpCisJCWZkX2xvZ19kZWJ1ZygiJXM6JWQuJWQtJWQuJWQgOiAlcyIsIGNvbmZmaWxlLCBwbG9jLT5maXJzdF9saW5lLCBwbG9jLT5maXJzdF9jb2x1bW4sIHBsb2MtPmxhc3RfbGluZSwgcGxvYy0+bGFzdF9jb2x1bW4sIHMpOworCWVsc2UgaWYgKHBsb2MtPmZpcnN0X2NvbHVtbiAhPSBwbG9jLT5sYXN0X2NvbHVtbikKKwkJZmRfbG9nX2RlYnVnKCIlczolZC4lZC0lZCA6ICVzIiwgY29uZmZpbGUsIHBsb2MtPmZpcnN0X2xpbmUsIHBsb2MtPmZpcnN0X2NvbHVtbiwgcGxvYy0+bGFzdF9jb2x1bW4sIHMpOworCWVsc2UKKwkJZmRfbG9nX2RlYnVnKCIlczolZC4lZCA6ICVzIiwgY29uZmZpbGUsIHBsb2MtPmZpcnN0X2xpbmUsIHBsb2MtPmZpcnN0X2NvbHVtbiwgcyk7Cit9CisKKy8qIFZlcnkgc2ltcGxlIGJ5dGUgc3RhY2sgbWFuYWdlbWVudCAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgKiBidWYgPSBOVUxMOworc3RhdGljIHNpemVfdCBidWZfc3ogPSAwOworc3RhdGljIHNpemVfdCBidWZfcnN6ID0gMDsKK3N0YXRpYyBpbmxpbmUgaW50IGJ1Zl9hZGQodW5zaWduZWQgY2hhciB2YWwpIC8qIGFkZCBhIHZhbHVlIGluIHRoZSBhcnJheSAqLworeworCWJ1Zl9zeisrOworCQorCWlmIChidWZfc3ogPiBidWZfcnN6KSB7CisJCXZvaWQgKiByZXo9TlVMTDsKKwkJYnVmX3JzeiArPSAyNTY7CisJCXJleiA9IHJlYWxsb2MoYnVmLCBidWZfcnN6KTsKKwkJaWYgKHJleiA9PSBOVUxMKSB7CisJCQlmZF9sb2dfZGVidWcoIkVycm9yIG9uIG1lbW9yeSBhbGxvY2F0aW9uOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlidWYgPSAodW5zaWduZWQgY2hhciAqKXJlejsKKwl9CisJYnVmW2J1Zl9zeiAtIDFdID0gdmFsOworCXJldHVybiAxOyAgIAorfQorc3RhdGljIGlubGluZSB2b2lkIGJ1Zl9yZWluaXQodm9pZCkKK3sKKwlmcmVlKGJ1Zik7CisJYnVmID0gTlVMTDsKKwlidWZfc3ogPSAwOworCWJ1Zl9yc3ogPSAwOworfQorCitzdGF0aWMgaW50IHBvcnQgPSAwOworc3RhdGljIGNoYXIgKiBwbGdjb25mZmlsZSA9IE5VTEw7CisKKyV9CisKKy8qIFZhbHVlcyByZXR1cm5lZCBieSBsZXggZm9yIHRva2VuICovCisldW5pb24geworCWNoYXIgCQkqc3RyaW5nOwkvKiBUaGUgc3RyaW5nIGlzIGFsbG9jYXRlZCBieSBzdHJkdXAgaW4gbGV4LiovCisJaW50CQkgaW50ZWdlcjsJLyogU3RvcmUgaW50ZWdlciB2YWx1ZXMgKi8KKwlzdHJ1Y3Qgc29ja2FkZHIgKnNzOwkJLyogc29ja2FkZHIgdG8gZnJlZSBhZnRlciB1c2UgKGFsbG9jIGluIGxleCkgKi8KK30KKworLyogdHlwZWQgZGF0YSAqLworJXRva2VuIDxzdHJpbmc+CVFTVFJJTkcKKyV0b2tlbiA8aW50ZWdlcj4gSU5URUdFUgorJXRva2VuIDxzcz4JSVAKKworJXR5cGUgPHN0cmluZz4JRklOREZJTEVFWFQKKworJXRva2VuIDxpbnRlZ2VyPiBOQVNfT1JfUFhZCisKKy8qIHNpbXBsZSB0b2tlbnMgKi8KKyV0b2tlbgkJRElTQUJMRUQKKyV0b2tlbgkJQVVUSAorJXRva2VuCQlBQ0NUCisKKyV0b2tlbiAJCVBMR19QUkVGSVgKKworJXRva2VuCQlBVVRIX0VOQUJMRQorJXRva2VuCQlBVVRIX1BPUlQKKyV0b2tlbgkJQVVUSF9JUDQKKyV0b2tlbgkJQVVUSF9JUDYKKyV0b2tlbgkJQUNDVF9FTkFCTEUKKyV0b2tlbgkJQUNDVF9QT1JUCisldG9rZW4JCUFDQ1RfSVA0CisldG9rZW4JCUFDQ1RfSVA2CisKKy8qIEluIGNhc2Ugb2YgZXJyb3IgaW4gdGhlIGxleGljYWwgYW5hbHlzaXMgKi8KKyV0b2tlbiAJCUxFWF9FUlJPUgorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCislJQorCisJLyogVGhlIGdyYW1tYXIgZGVmaW5pdGlvbiAqLworY29uZmZpbGU6CQkvKiBlbXB0eSBncmFtbWFyIGlzIE9LICovCisJCQl8IGNvbmZmaWxlIHBsdWdpbgorCQkJfCBjb25mZmlsZSBjbGllbnRkZWYKKwkJCXwgY29uZmZpbGUgYXV0aHNlcnYKKwkJCXwgY29uZmZpbGUgYWNjdHNlcnYKKwkJCTsKKworCQkJCQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK0ZJTkRGSUxFRVhUOgkJUVNUUklORworCQkJeworCQkJCWNoYXIgKiBmbmFtZSA9ICQxOworCQkJCUZJTEUgKiBmZDsKKwkJCQkKKwkJCQkvKiBGaXJzdCwgY2hlY2sgaWYgdGhlIGZpbGUgZXhpc3RzICovCisJCQkJZmQgPSBmb3BlbihmbmFtZSwgInIiKTsKKwkJCQlpZiAoKGZkID09IE5VTEwpICYmICgqZm5hbWUgIT0gJy8nKSkgeworCQkJCQljaGFyICogYmtwID0gZm5hbWU7CisJCQkJCUNIRUNLX01BTExPQ19ETyggZm5hbWUgPSBtYWxsb2MoIHN0cmxlbihia3ApICsgc3RybGVuKERFRkFVTFRfRVhURU5TSU9OU19QQVRIKSArIDIgKSwKKwkJCQkJCXsgeXllcnJvciAoJnl5bGxvYywgY29uZmZpbGUsICJOb3QgZW5vdWdoIG1lbW9yeSIpOyBZWUVSUk9SOyB9ICk7CisJCQkJCXNwcmludGYoZm5hbWUsIERFRkFVTFRfRVhURU5TSU9OU19QQVRIICIvJXMiLCBia3ApOworCQkJCQlmcmVlKGJrcCk7CisJCQkJCWZkID0gZm9wZW4oZm5hbWUsICJyIik7CisJCQkJfQorCQkJCWlmIChmZCA9PSBOVUxMKSB7CisJCQkJCWludCByZXQgPSBlcnJubzsKKwkJCQkJVFJBQ0VfREVCVUcoSU5GTywgIlVuYWJsZSB0byBvcGVuIGZpbGUgJXMgZm9yIHJlYWRpbmc6ICVzIiwgZm5hbWUsIHN0cmVycm9yKHJldCkpOworCQkJCQl5eWVycm9yICgmeXlsbG9jLCBjb25mZmlsZSwgIkVycm9yIGFkZGluZyBwbHVnaW4iKTsgCisJCQkJCVlZRVJST1I7CisJCQkJfQorCQkJCWZjbG9zZShmZCk7CisJCQkJCisJCQkJJCQgPSBmbmFtZTsKKwkJCX0KKwkJCTsKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitwbHVnaW46CQkJeworCQkJCS8qIFJlc2V0IHRoZSBwYXJhbWV0ZXJzICovCisJCQkJYnVmX3JlaW5pdCgpOworCQkJCXBvcnQgPSBSR1dfUExHX1RZUEVfQVVUSCB8IFJHV19QTEdfVFlQRV9BQ0NUIDsKKwkJCQlmcmVlKHBsZ2NvbmZmaWxlKTsgcGxnY29uZmZpbGUgPSBOVUxMOworCQkJfQorCQkJUExHX1BSRUZJWCAnPScgRklOREZJTEVFWFQgcGxnX2F0dHJpYnV0ZXMgJzsnCisJCQl7CisJCQkJLyogQWRkIHRoaXMgZXh0ZW5zaW9uIGluIHRoZSBsaXN0ICovCisJCQkJaWYgKCByZ3dfcGxnX2FkZCggJDQsIHBsZ2NvbmZmaWxlLCBwb3J0LCAmYnVmLCBidWZfc3ogKSApIHsKKwkJCQkJeXllcnJvciAoJnl5bGxvYywgY29uZmZpbGUsICJFcnJvciBwYXJzaW5nIC8gYWRkaW5nIGV4dGVuc2lvbiAhIik7CisJCQkJCVlZRVJST1I7CisJCQkJfQorCQkJCQorCQkJCS8qIEZyZWUgdGhlIGFycmF5ICovCisJCQkJYnVmX3JlaW5pdCgpOworCQkJCQorCQkJCS8qIHN0b3AgY29uZmZpbGUgZnJvbSBiZWluZyBmcmVlZCBoZXJlICovCisJCQkJcGxnY29uZmZpbGUgPSBOVUxMOworCQkJfQorCQkJOworCitwbGdfYXR0cmlidXRlczoJCS8qIGVtcHR5ICovCisJCQl8IHBsZ19hdHRyaWJ1dGVzICc6JyBRU1RSSU5HCisJCQl7CisJCQkJcGxnY29uZmZpbGUgPSAkMzsKKwkJCX0KKwkJCXwgcGxnX2F0dHJpYnV0ZXMgJzonIEFVVEgKKwkJCXsKKwkJCQlwb3J0ID0gUkdXX1BMR19UWVBFX0FVVEg7CisJCQl9CisJCQl8IHBsZ19hdHRyaWJ1dGVzICc6JyBBQ0NUCisJCQl7CisJCQkJcG9ydCA9IFJHV19QTEdfVFlQRV9BQ0NUOworCQkJfQorCQkJfCBwbGdfYXR0cmlidXRlcyAnOicgZXh0Y29kZXNfbGlzdAorCQkJOworCitleHRjb2Rlc19saXN0OgkJLyogZW1wdHkgKi8KKwkJCXwgZXh0Y29kZXNfbGlzdCBJTlRFR0VSCisJCQl7CisJCQkJaWYgKCQyIDwgMCB8fCAkMiA+IDI1NSkgeworCQkJCQl5eWVycm9yICgmeXlsbG9jLCBjb25mZmlsZSwgIkludmFsaWQgY29tbWFuZCBjb2RlIHZhbHVlISIpOworCQkJCQlZWUVSUk9SOworCQkJCX0KKwkJCQlpZiAoICEgYnVmX2FkZCgodW5zaWduZWQgY2hhcikkMikgKSB7CisJCQkJCXl5ZXJyb3IgKCZ5eWxsb2MsIGNvbmZmaWxlLCAiRXJyb3IgYWxsb2NhdGluZyBtZW1vcnkhIik7CisJCQkJCVlZRVJST1I7CisJCQkJfQorCQkJfQorCQkJOworCQkJCQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworY2xpZW50ZGVmOgkJeworCQkJCWJ1Zl9yZWluaXQoKTsKKwkJCX0KKwkJCU5BU19PUl9QWFkgJz0nIElQICcvJyBjbGlzZWNyZXRfa2V5ICc7JworCQkJeworCQkJCS8qIEFkZCB0aGlzIGNsaWVudCAqLworCQkJCWlmICggcmd3X2NsaWVudHNfYWRkKCAkNCwgJmJ1ZiwgYnVmX3N6LCAkMiApICkgeworCQkJCQl5eWVycm9yICgmeXlsbG9jLCBjb25mZmlsZSwgIkVycm9yIHBhcnNpbmcgLyBhZGRpbmcgY2xpZW50ICEiKTsKKwkJCQkJWVlFUlJPUjsKKwkJCQl9CisJCQkJCisJCQkJLyogcmVpbml0IHRoZSBidWZmZXIgKi8KKwkJCQlidWZfcmVpbml0KCk7CisJCQl9CisJCQk7CisKK2NsaXNlY3JldF9rZXk6CQkvKiBlbXB0eSAqLworCQkJfCBjbGlzZWNyZXRfa2V5IFFTVFJJTkcKKwkJCXsKKwkJCQlpbnQgaTsKKwkJCQlzaXplX3QgbGVuID0gc3RybGVuKCQyKTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJCQkJaWYgKCAhIGJ1Zl9hZGQoICQyIFtpXSApICkgeworCQkJCQkJeXllcnJvciAoJnl5bGxvYywgY29uZmZpbGUsICJNZW1vcnkgYWxsb2NhdGlvbiBlcnJvci4iKTsKKwkJCQkJCVlZRVJST1I7CisJCQkJCX0KKwkJCQl9CisJCQkJCisJCQkJZnJlZSgkMik7CisJCQl9CisJCQl8IGNsaXNlY3JldF9rZXkgSU5URUdFUgorCQkJeworCQkJCWlmICggJDIgPCAwIHx8ICQyID4gMjU1ICkgeworCQkJCQl5eWVycm9yICgmeXlsbG9jLCBjb25mZmlsZSwgIkludmFsaWQgdmFsdWUgaW4ga2V5LiIpOworCQkJCQlZWUVSUk9SOworCQkJCX0KKwkJCQkKKwkJCQlpZiAoICEgYnVmX2FkZCggJDIgKSApIHsKKwkJCQkJeXllcnJvciAoJnl5bGxvYywgY29uZmZpbGUsICJNZW1vcnkgYWxsb2NhdGlvbiBlcnJvci4iKTsKKwkJCQkJWVlFUlJPUjsKKwkJCQl9CisJCQl9CisJCQk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2F1dGhzZXJ2OgkJQVVUSF9FTkFCTEUgJz0nIElOVEVHRVIgJzsnCisJCQl7CisJCQkJaWYgKCQzID09IDApIHsKKwkJCQkJcmd3X3NlcnZlcnMuYXV0aF9zZXJ2LmRpc2FibGVkID0gMTsKKwkJCQl9IGVsc2UgeworCQkJCQlyZ3dfc2VydmVycy5hdXRoX3NlcnYuZGlzYWJsZWQgPSAwOworCQkJCX0KKwkJCX0KKwkJCXwgQVVUSF9QT1JUICc9JyBJTlRFR0VSICc7JworCQkJeworCQkJCWlmICgkMyA8PSAwIHx8ICQzID4gNjU1MzUpIHsKKwkJCQkJeXllcnJvciAoJnl5bGxvYywgY29uZmZpbGUsICJJbnZhbGlkIHBvcnQgbnVtYmVyICEiKTsKKwkJCQkJWVlFUlJPUjsKKwkJCQl9CisJCQkJCQorCQkJCXJnd19zZXJ2ZXJzLmF1dGhfc2Vydi5wb3J0ID0gaHRvbnMoJDMpOworCQkJfQorCQkJfCBBVVRIX0lQNCAnPScgRElTQUJMRUQgJzsnCisJCQl7CisJCQkJcmd3X3NlcnZlcnMuYXV0aF9zZXJ2LmlwX2Rpc2FibGVkID0gMTsKKwkJCX0KKwkJCXwgQVVUSF9JUDQgJz0nIElQICc7JworCQkJeworCQkJCWlmICgoKHN0cnVjdCBzb2NrYWRkciAqKSgkMykpLT5zYV9mYW1pbHkgIT0gQUZfSU5FVCkgeworCQkJCQl5eWVycm9yICgmeXlsbG9jLCBjb25mZmlsZSwgIkludmFsaWQgYWRkcmVzcyBzcGVjaWZpY2F0aW9uICEiKTsKKwkJCQkJWVlFUlJPUjsKKwkJCQl9CisJCQkJbWVtY3B5KCAmIHJnd19zZXJ2ZXJzLmF1dGhfc2Vydi5pcF9lbmRwb2ludCwgJigoc3RydWN0IHNvY2thZGRyX2luICopKCQzKSktPnNpbl9hZGRyLCBzaXplb2Yoc3RydWN0IGluX2FkZHIpICk7CisJCQkJZnJlZSgkMyk7CisJCQkJcmd3X3NlcnZlcnMuYXV0aF9zZXJ2LmlwX2Rpc2FibGVkID0gMDsKKwkJCX0KKwkJCXwgQVVUSF9JUDYgJz0nIERJU0FCTEVEICc7JworCQkJeworCQkJCXJnd19zZXJ2ZXJzLmF1dGhfc2Vydi5pcDZfZGlzYWJsZWQgPSAxOworCQkJfQorCQkJfCBBVVRIX0lQNiAnPScgSVAgJzsnCisJCQl7CisJCQkJaWYgKCgoc3RydWN0IHNvY2thZGRyICopKCQzKSkgLT4gc2FfZmFtaWx5ICE9IEFGX0lORVQ2KSB7CisJCQkJCXl5ZXJyb3IgKCZ5eWxsb2MsIGNvbmZmaWxlLCAiSW52YWxpZCBhZGRyZXNzIHNwZWNpZmljYXRpb24gISIpOworCQkJCQlZWUVSUk9SOworCQkJCX0KKwkJCQltZW1jcHkoICYgcmd3X3NlcnZlcnMuYXV0aF9zZXJ2LmlwNl9lbmRwb2ludCwgJigoc3RydWN0IHNvY2thZGRyX2luNiAqKSgkMykpLT5zaW42X2FkZHIsIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpICk7CisJCQkJZnJlZSgkMyk7CisJCQkJcmd3X3NlcnZlcnMuYXV0aF9zZXJ2LmlwNl9kaXNhYmxlZCA9IDA7CisJCQl9CisJCQk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2FjY3RzZXJ2OgkJQUNDVF9FTkFCTEUgJz0nIElOVEVHRVIgJzsnCisJCQl7CisJCQkJaWYgKCQzID09IDApIHsKKwkJCQkJcmd3X3NlcnZlcnMuYWNjdF9zZXJ2LmRpc2FibGVkID0gMTsKKwkJCQl9IGVsc2UgeworCQkJCQlyZ3dfc2VydmVycy5hY2N0X3NlcnYuZGlzYWJsZWQgPSAwOworCQkJCX0KKwkJCX0KKwkJCXwgQUNDVF9QT1JUICc9JyBJTlRFR0VSICc7JworCQkJeworCQkJCWlmICgkMyA8PSAwIHx8ICQzID4gNjU1MzUpIHsKKwkJCQkJeXllcnJvciAoJnl5bGxvYywgY29uZmZpbGUsICJJbnZhbGlkIHBvcnQgbnVtYmVyICEiKTsKKwkJCQkJWVlFUlJPUjsKKwkJCQl9CisJCQkJCQorCQkJCXJnd19zZXJ2ZXJzLmFjY3Rfc2Vydi5wb3J0ID0gaHRvbnMoJDMpOworCQkJfQorCQkJfCBBQ0NUX0lQNCAnPScgRElTQUJMRUQgJzsnCisJCQl7CisJCQkJcmd3X3NlcnZlcnMuYWNjdF9zZXJ2LmlwX2Rpc2FibGVkID0gMTsKKwkJCX0KKwkJCXwgQUNDVF9JUDQgJz0nIElQICc7JworCQkJeworCQkJCWlmICgoKHN0cnVjdCBzb2NrYWRkciAqKSgkMykpIC0+IHNhX2ZhbWlseSAhPSBBRl9JTkVUKSB7CisJCQkJCXl5ZXJyb3IgKCZ5eWxsb2MsIGNvbmZmaWxlLCAiSW52YWxpZCBhZGRyZXNzIHNwZWNpZmljYXRpb24gISIpOworCQkJCQlZWUVSUk9SOworCQkJCX0KKwkJCQltZW1jcHkoICYgcmd3X3NlcnZlcnMuYXV0aF9zZXJ2LmlwX2VuZHBvaW50LCAmKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikoJDMpKS0+c2luX2FkZHIsIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikgKTsKKwkJCQlmcmVlKCQzKTsKKwkJCQlyZ3dfc2VydmVycy5hY2N0X3NlcnYuaXBfZGlzYWJsZWQgPSAwOworCQkJfQorCQkJfCBBQ0NUX0lQNiAnPScgRElTQUJMRUQgJzsnCisJCQl7CisJCQkJcmd3X3NlcnZlcnMuYWNjdF9zZXJ2LmlwNl9kaXNhYmxlZCA9IDE7CisJCQl9CisJCQl8IEFDQ1RfSVA2ICc9JyBJUCAnOycKKwkJCXsKKwkJCQlpZiAoKChzdHJ1Y3Qgc29ja2FkZHIgKikoJDMpKSAtPiBzYV9mYW1pbHkgIT0gQUZfSU5FVDYpIHsKKwkJCQkJeXllcnJvciAoJnl5bGxvYywgY29uZmZpbGUsICJJbnZhbGlkIGFkZHJlc3Mgc3BlY2lmaWNhdGlvbiAhIik7CisJCQkJCVlZRVJST1I7CisJCQkJfQorCQkJCW1lbWNweSggJiByZ3dfc2VydmVycy5hdXRoX3NlcnYuaXA2X2VuZHBvaW50LCAmKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopKCQzKSktPnNpbjZfYWRkciwgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikgKTsKKwkJCQlmcmVlKCQzKTsKKwkJCQlyZ3dfc2VydmVycy5hY2N0X3NlcnYuaXA2X2Rpc2FibGVkID0gMDsKKwkJCX0KKwkJCTsKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvYXBwX3JhZGd3L3Jnd19tYWluLmMgYi9leHRlbnNpb25zL2FwcF9yYWRndy9yZ3dfbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNzZlZjEKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2FwcF9yYWRndy9yZ3dfbWFpbi5jCkBAIC0wLDAgKzEsNzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDEzLCBXSURFIFByb2plY3QgYW5kIE5JQ1QJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFdJREUgUHJvamVjdCBvciBOSUNUIG5vciB0aGUgCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgV0lERSBQcm9qZWN0IGFuZCAJCQkJCQkgKgorKiAgIE5JQ1QuCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIAorICogTWFpbiBmaWxlIG9mIHRoZSBhcHBfcmFkZ3cgZXh0ZW5zaW9uLgorICovCisKKyNpbmNsdWRlICJyZ3cuaCIKKworLyogRXh0ZW5zaW9uIGVudHJ5IHBvaW50IGNhbGxlZCBieSBmcmVlRGlhbWV0ZXIgKi8KK3N0YXRpYyBpbnQgcmd3X21haW4oY2hhciAqIGNvbmZmaWxlKSAKK3sKKwlDSEVDS19GQ1QoIHJnd19jbGllbnRzX2luaXQoKSApOworCQorCUNIRUNLX0ZDVCggcmd3X3NlcnZlcnNfaW5pdCgpICk7CisJCisJQ0hFQ0tfRkNUKCByZ3dfY29uZl9oYW5kbGUoY29uZmZpbGUpICk7CisJCisJTE9HX0QoICJFeHRlbnNpb24gUkFESVVTIEdhdGV3YXkgaW5pdGlhbGl6ZWQgd2l0aCBjb25maWd1cmF0aW9uOiAnJXMnIiwgY29uZmZpbGUpOworCXJnd19zZXJ2ZXJzX2R1bXAoKTsKKwlyZ3dfY2xpZW50c19kdW1wKCk7CisJcmd3X3BsZ19kdW1wKCk7CisJCisJLyogU3RhcnQgbWFraW5nIGV4dGVuc2lvbiBsaXN0IGFjY2VsZXJhdG9ycyAqLworCXJnd19wbGdfc3RhcnRfY2FjaGUoKTsKKwkKKwkvKiBTdGFydCB0aGUgd29ya2VyIHRocmVhZHMgKi8KKwlDSEVDS19GQ1QoIHJnd193b3JrX3N0YXJ0KCkgKTsKKwkKKwkvKiBTdGFydCB0aGUgc2VydmVycyAqLworCUNIRUNLX0ZDVCggcmd3X3NlcnZlcnNfc3RhcnQoKSApOworCQorCXJldHVybiAwOworfQorCisvKiBVbmxvYWQgKi8KK3ZvaWQgZmRfZXh0X2Zpbmkodm9pZCkKK3sKKwlyZ3dfc2VydmVyc19maW5pKCk7CisJcmd3X3dvcmtfZmluaSgpOworCXJnd19wbGdfZmluaSgpOworCXJnd19jbGllbnRzX2ZpbmkoKTsKK30KKworRVhURU5TSU9OX0VOVFJZKCJhcHBfcmFkZ3ciLCByZ3dfbWFpbik7CmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2FwcF9yYWRndy9yZ3dfbXNnX2F0dHJ0eXBlLmMgYi9leHRlbnNpb25zL2FwcF9yYWRndy9yZ3dfbXNnX2F0dHJ0eXBlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE0ZTU0YwotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvYXBwX3JhZGd3L3Jnd19tc2dfYXR0cnR5cGUuYwpAQCAtMCwwICsxLDMwMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTEsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgInJnd19jb21tb24uaCIKKworLyogVGhlIGNvbnRlbnQgb2YgdGhpcyBmaWxlIHdhcyBzZW1pLWF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZyb20gdGhlIElBTkEgcmVnaXN0cnkuICovCisKKy8qICBOYW1lIG9mIFJBRElVUyBhdHRyaWJ1dGUgZnJvbSBpdHMgY29kZSAqLworY29uc3QgY2hhciAqIHJnd19tc2dfYXR0cnR5cGVfc3RyKHVuc2lnbmVkIGNoYXIgYykgeworCQkvKiAxICAgICAgICAgVXNlci1OYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlpZiAoIGMgPT0gMSkgcmV0dXJuICJVc2VyLU5hbWUgIjsKKwkJLyogMiAgICAgICAgIFVzZXItUGFzc3dvcmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJaWYgKCBjID09IDIpIHJldHVybiAiVXNlci1QYXNzd29yZCAiOworCQkvKiAzICAgICAgICAgQ0hBUC1QYXNzd29yZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlpZiAoIGMgPT0gMykgcmV0dXJuICJDSEFQLVBhc3N3b3JkICI7CisJCS8qIDQgICAgICAgICBOQVMtSVAtQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCWlmICggYyA9PSA0KSByZXR1cm4gIk5BUy1JUC1BZGRyZXNzICI7CisJCS8qIDUgICAgICAgICBOQVMtUG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCWlmICggYyA9PSA1KSByZXR1cm4gIk5BUy1Qb3J0ICI7CisJCS8qIDYgICAgICAgICBTZXJ2aWNlLVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCWlmICggYyA9PSA2KSByZXR1cm4gIlNlcnZpY2UtVHlwZSAiOworCQkvKiA3ICAgICAgICAgRnJhbWVkLVByb3RvY29sICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlpZiAoIGMgPT0gNykgcmV0dXJuICJGcmFtZWQtUHJvdG9jb2wgIjsKKwkJLyogOCAgICAgICAgIEZyYW1lZC1JUC1BZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICovCisJaWYgKCBjID09IDgpIHJldHVybiAiRnJhbWVkLUlQLUFkZHJlc3MgIjsKKwkJLyogOSAgICAgICAgIEZyYW1lZC1JUC1OZXRtYXNrICAgICAgICAgICAgICAgICAgICAgICAgICovCisJaWYgKCBjID09IDkpIHJldHVybiAiRnJhbWVkLUlQLU5ldG1hc2sgIjsKKwkJLyogMTAgICAgICAgIEZyYW1lZC1Sb3V0aW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJaWYgKCBjID09IDEwKSByZXR1cm4gIkZyYW1lZC1Sb3V0aW5nICI7CisJCS8qIDExICAgICAgICBGaWx0ZXItSWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCWlmICggYyA9PSAxMSkgcmV0dXJuICJGaWx0ZXItSWQgIjsKKwkJLyogMTIgICAgICAgIEZyYW1lZC1NVFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJaWYgKCBjID09IDEyKSByZXR1cm4gIkZyYW1lZC1NVFUgIjsKKwkJLyogMTMgICAgICAgIEZyYW1lZC1Db21wcmVzc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICovCisJaWYgKCBjID09IDEzKSByZXR1cm4gIkZyYW1lZC1Db21wcmVzc2lvbiAiOworCQkvKiAxNCAgICAgICAgTG9naW4tSVAtSG9zdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlpZiAoIGMgPT0gMTQpIHJldHVybiAiTG9naW4tSVAtSG9zdCAiOworCQkvKiAxNSAgICAgICAgTG9naW4tU2VydmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlpZiAoIGMgPT0gMTUpIHJldHVybiAiTG9naW4tU2VydmljZSAiOworCQkvKiAxNiAgICAgICAgTG9naW4tVENQLVBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlpZiAoIGMgPT0gMTYpIHJldHVybiAiTG9naW4tVENQLVBvcnQgIjsKKwkJLyogMTcgICAgICAgIFVuYXNzaWduZWQgKi8KKwlpZiAoIGMgPT0gMTcpIHJldHVybiAiVW5hc3NpZ25lZCAiOworCQkvKiAxOCAgICAgICAgUmVwbHktTWVzc2FnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlpZiAoIGMgPT0gMTgpIHJldHVybiAiUmVwbHktTWVzc2FnZSAiOworCQkvKiAxOSAgICAgICAgQ2FsbGJhY2stTnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlpZiAoIGMgPT0gMTkpIHJldHVybiAiQ2FsbGJhY2stTnVtYmVyICI7CisJCS8qIDIwICAgICAgICBDYWxsYmFjay1JZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCWlmICggYyA9PSAyMCkgcmV0dXJuICJDYWxsYmFjay1JZCAiOworCQkvKiAyMSAgICAgICAgVW5hc3NpZ25lZCAqLworCWlmICggYyA9PSAyMSkgcmV0dXJuICJVbmFzc2lnbmVkICI7CisJCS8qIDIyICAgICAgICBGcmFtZWQtUm91dGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCWlmICggYyA9PSAyMikgcmV0dXJuICJGcmFtZWQtUm91dGUgIjsKKwkJLyogMjMgICAgICAgIEZyYW1lZC1JUFgtTmV0d29yayAgICAgICAgICAgICAgICAgICAgICAgICovCisJaWYgKCBjID09IDIzKSByZXR1cm4gIkZyYW1lZC1JUFgtTmV0d29yayAiOworCQkvKiAyNCAgICAgICAgU3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlpZiAoIGMgPT0gMjQpIHJldHVybiAiU3RhdGUgIjsKKwkJLyogMjUgICAgICAgIENsYXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJaWYgKCBjID09IDI1KSByZXR1cm4gIkNsYXNzICI7CisJCS8qIDI2ICAgICAgICBWZW5kb3ItU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCWlmICggYyA9PSAyNikgcmV0dXJuICJWZW5kb3ItU3BlY2lmaWMgIjsKKwkJLyogMjcgICAgICAgIFNlc3Npb24tVGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJaWYgKCBjID09IDI3KSByZXR1cm4gIlNlc3Npb24tVGltZW91dCAiOworCQkvKiAyOCAgICAgICAgSWRsZS1UaW1lb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlpZiAoIGMgPT0gMjgpIHJldHVybiAiSWRsZS1UaW1lb3V0ICI7CisJCS8qIDI5ICAgICAgICBUZXJtaW5hdGlvbi1BY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAqLworCWlmICggYyA9PSAyOSkgcmV0dXJuICJUZXJtaW5hdGlvbi1BY3Rpb24gIjsKKwkJLyogMzAgICAgICAgIENhbGxlZC1TdGF0aW9uLUlkICAgICAgICAgICAgICAgICAgICAgICAgICovCisJaWYgKCBjID09IDMwKSByZXR1cm4gIkNhbGxlZC1TdGF0aW9uLUlkICI7CisJCS8qIDMxICAgICAgICBDYWxsaW5nLVN0YXRpb24tSWQgICAgICAgICAgICAgICAgICAgICAgICAqLworCWlmICggYyA9PSAzMSkgcmV0dXJuICJDYWxsaW5nLVN0YXRpb24tSWQgIjsKKwkJLyogMzIgICAgICAgIE5BUy1JZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJaWYgKCBjID09IDMyKSByZXR1cm4gIk5BUy1JZGVudGlmaWVyICI7CisJCS8qIDMzICAgICAgICBQcm94eS1TdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCWlmICggYyA9PSAzMykgcmV0dXJuICJQcm94eS1TdGF0ZSAiOworCQkvKiAzNCAgICAgICAgTG9naW4tTEFULVNlcnZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlpZiAoIGMgPT0gMzQpIHJldHVybiAiTG9naW4tTEFULVNlcnZpY2UgIjsKKwkJLyogMzUgICAgICAgIExvZ2luLUxBVC1Ob2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJaWYgKCBjID09IDM1KSByZXR1cm4gIkxvZ2luLUxBVC1Ob2RlICI7CisJCS8qIDM2ICAgICAgICBMb2dpbi1MQVQtR3JvdXAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCWlmICggYyA9PSAzNikgcmV0dXJuICJMb2dpbi1MQVQtR3JvdXAgIjsKKwkJLyogMzcgICAgICAgIEZyYW1lZC1BcHBsZVRhbGstTGluayAgICAgICAgICAgICAgICAgICAgICovCisJaWYgKCBjID09IDM3KSByZXR1cm4gIkZyYW1lZC1BcHBsZVRhbGstTGluayAiOworCQkvKiAzOCAgICAgICAgRnJhbWVkLUFwcGxlVGFsay1OZXR3b3JrICAgICAgICAgICAgICAgICAgKi8KKwlpZiAoIGMgPT0gMzgpIHJldHVybiAiRnJhbWVkLUFwcGxlVGFsay1OZXR3b3JrICI7CisJCS8qIDM5ICAgICAgICBGcmFtZWQtQXBwbGVUYWxrLVpvbmUgICAgICAgICAgICAgICAgICAgICAqLworCWlmICggYyA9PSAzOSkgcmV0dXJuICJGcmFtZWQtQXBwbGVUYWxrLVpvbmUgIjsKKwkJLyogNDAgICAgICAgIEFjY3QtU3RhdHVzLVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgW1JGQzI4NjZdICovCisJaWYgKCBjID09IDQwKSByZXR1cm4gIkFjY3QtU3RhdHVzLVR5cGUgW1JGQzI4NjZdIjsKKwkJLyogNDEgICAgICAgIEFjY3QtRGVsYXktVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgW1JGQzI4NjZdICovCisJaWYgKCBjID09IDQxKSByZXR1cm4gIkFjY3QtRGVsYXktVGltZSBbUkZDMjg2Nl0iOworCQkvKiA0MiAgICAgICAgQWNjdC1JbnB1dC1PY3RldHMgICAgICAgICAgICAgICAgICAgICAgICBbUkZDMjg2Nl0gKi8KKwlpZiAoIGMgPT0gNDIpIHJldHVybiAiQWNjdC1JbnB1dC1PY3RldHMgW1JGQzI4NjZdIjsKKwkJLyogNDMgICAgICAgIEFjY3QtT3V0cHV0LU9jdGV0cyAgICAgICAgICAgICAgICAgICAgICAgW1JGQzI4NjZdICovCisJaWYgKCBjID09IDQzKSByZXR1cm4gIkFjY3QtT3V0cHV0LU9jdGV0cyBbUkZDMjg2Nl0iOworCQkvKiA0NCAgICAgICAgQWNjdC1TZXNzaW9uLUlkICAgICAgICAgICAgICAgICAgICAgICAgICBbUkZDMjg2Nl0gKi8KKwlpZiAoIGMgPT0gNDQpIHJldHVybiAiQWNjdC1TZXNzaW9uLUlkIFtSRkMyODY2XSI7CisJCS8qIDQ1ICAgICAgICBBY2N0LUF1dGhlbnRpYyAgICAgICAgICAgICAgICAgICAgICAgICAgIFtSRkMyODY2XSAqLworCWlmICggYyA9PSA0NSkgcmV0dXJuICJBY2N0LUF1dGhlbnRpYyBbUkZDMjg2Nl0iOworCQkvKiA0NiAgICAgICAgQWNjdC1TZXNzaW9uLVRpbWUgICAgICAgICAgICAgICAgICAgICAgICBbUkZDMjg2Nl0gKi8KKwlpZiAoIGMgPT0gNDYpIHJldHVybiAiQWNjdC1TZXNzaW9uLVRpbWUgW1JGQzI4NjZdIjsKKwkJLyogNDcgICAgICAgIEFjY3QtSW5wdXQtUGFja2V0cyAgICAgICAgICAgICAgICAgICAgICAgW1JGQzI4NjZdICovCisJaWYgKCBjID09IDQ3KSByZXR1cm4gIkFjY3QtSW5wdXQtUGFja2V0cyBbUkZDMjg2Nl0iOworCQkvKiA0OCAgICAgICAgQWNjdC1PdXRwdXQtUGFja2V0cyAgICAgICAgICAgICAgICAgICAgICBbUkZDMjg2Nl0gKi8KKwlpZiAoIGMgPT0gNDgpIHJldHVybiAiQWNjdC1PdXRwdXQtUGFja2V0cyBbUkZDMjg2Nl0iOworCQkvKiA0OSAgICAgICAgQWNjdC1UZXJtaW5hdGUtQ2F1c2UgICAgICAgICAgICAgICAgICAgICBbUkZDMjg2Nl0gKi8KKwlpZiAoIGMgPT0gNDkpIHJldHVybiAiQWNjdC1UZXJtaW5hdGUtQ2F1c2UgW1JGQzI4NjZdIjsKKwkJLyogNTAgICAgICAgIEFjY3QtTXVsdGktU2Vzc2lvbi1JZCAgICAgICAgICAgICAgICAgICAgW1JGQzI4NjZdICovCisJaWYgKCBjID09IDUwKSByZXR1cm4gIkFjY3QtTXVsdGktU2Vzc2lvbi1JZCBbUkZDMjg2Nl0iOworCQkvKiA1MSAgICAgICAgQWNjdC1MaW5rLUNvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICBbUkZDMjg2Nl0gKi8KKwlpZiAoIGMgPT0gNTEpIHJldHVybiAiQWNjdC1MaW5rLUNvdW50IFtSRkMyODY2XSI7CisJCS8qIDUyICAgICAgICBBY2N0LUlucHV0LUdpZ2F3b3JkcyAgICAgICAgICAgICAgICAgICAgIFtSRkMyODY5XSAqLworCWlmICggYyA9PSA1MikgcmV0dXJuICJBY2N0LUlucHV0LUdpZ2F3b3JkcyBbUkZDMjg2OV0iOworCQkvKiA1MyAgICAgICAgQWNjdC1PdXRwdXQtR2lnYXdvcmRzICAgICAgICAgICAgICAgICAgICBbUkZDMjg2OV0gKi8KKwlpZiAoIGMgPT0gNTMpIHJldHVybiAiQWNjdC1PdXRwdXQtR2lnYXdvcmRzIFtSRkMyODY5XSI7CisJCS8qIDU0ICAgICAgICBVbmFzc2lnbmVkICovCisJaWYgKCBjID09IDU0KSByZXR1cm4gIlVuYXNzaWduZWQgIjsKKwkJLyogNTUgICAgICAgIEV2ZW50LVRpbWVzdGFtcCAgICAgICAgICAgICAgICAgICAgICAgICAgW1JGQzI4NjldICovCisJaWYgKCBjID09IDU1KSByZXR1cm4gIkV2ZW50LVRpbWVzdGFtcCBbUkZDMjg2OV0iOworCQkvKiA1NiAgICAgICAgRWdyZXNzLVZMQU5JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICBbUkZDNDY3NV0gKi8KKwlpZiAoIGMgPT0gNTYpIHJldHVybiAiRWdyZXNzLVZMQU5JRCBbUkZDNDY3NV0iOworCQkvKiA1NyAgICAgICAgSW5ncmVzcy1GaWx0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICBbUkZDNDY3NV0gKi8KKwlpZiAoIGMgPT0gNTcpIHJldHVybiAiSW5ncmVzcy1GaWx0ZXJzIFtSRkM0Njc1XSI7CisJCS8qIDU4ICAgICAgICBFZ3Jlc3MtVkxBTi1OYW1lICAgICAgICAgICAgICAgICAgICAgICAgIFtSRkM0Njc1XSAqLworCWlmICggYyA9PSA1OCkgcmV0dXJuICJFZ3Jlc3MtVkxBTi1OYW1lIFtSRkM0Njc1XSI7CisJCS8qIDU5ICAgICAgICBVc2VyLVByaW9yaXR5LVRhYmxlICAgICAgICAgICAgICAgICAgICAgIFtSRkM0Njc1XSAqLworCWlmICggYyA9PSA1OSkgcmV0dXJuICJVc2VyLVByaW9yaXR5LVRhYmxlIFtSRkM0Njc1XSI7CisJCS8qIDYwICAgICAgICBDSEFQLUNoYWxsZW5nZSAqLworCWlmICggYyA9PSA2MCkgcmV0dXJuICJDSEFQLUNoYWxsZW5nZSAiOworCQkvKiA2MSAgICAgICAgTkFTLVBvcnQtVHlwZSAqLworCWlmICggYyA9PSA2MSkgcmV0dXJuICJOQVMtUG9ydC1UeXBlICI7CisJCS8qIDYyICAgICAgICBQb3J0LUxpbWl0ICovCisJaWYgKCBjID09IDYyKSByZXR1cm4gIlBvcnQtTGltaXQgIjsKKwkJLyogNjMgICAgICAgIExvZ2luLUxBVC1Qb3J0ICovCisJaWYgKCBjID09IDYzKSByZXR1cm4gIkxvZ2luLUxBVC1Qb3J0ICI7CisJCS8qIDY0ICAgICAgICBUdW5uZWwtVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtSRkMyODY4XSAqLworCWlmICggYyA9PSA2NCkgcmV0dXJuICJUdW5uZWwtVHlwZSBbUkZDMjg2OF0iOworCQkvKiA2NSAgICAgICAgVHVubmVsLU1lZGl1bS1UeXBlICAgICAgICAgICAgICAgICAgICAgICBbUkZDMjg2OF0gKi8KKwlpZiAoIGMgPT0gNjUpIHJldHVybiAiVHVubmVsLU1lZGl1bS1UeXBlIFtSRkMyODY4XSI7CisJCS8qIDY2ICAgICAgICBUdW5uZWwtQ2xpZW50LUVuZHBvaW50ICAgICAgICAgICAgICAgICAgIFtSRkMyODY4XSAqLworCWlmICggYyA9PSA2NikgcmV0dXJuICJUdW5uZWwtQ2xpZW50LUVuZHBvaW50IFtSRkMyODY4XSI7CisJCS8qIDY3ICAgICAgICBUdW5uZWwtU2VydmVyLUVuZHBvaW50ICAgICAgICAgICAgICAgICAgIFtSRkMyODY4XSAqLworCWlmICggYyA9PSA2NykgcmV0dXJuICJUdW5uZWwtU2VydmVyLUVuZHBvaW50IFtSRkMyODY4XSI7CisJCS8qIDY4ICAgICAgICBBY2N0LVR1bm5lbC1Db25uZWN0aW9uICAgICAgICAgICAgICAgICAgIFtSRkMyODY3XSAqLworCWlmICggYyA9PSA2OCkgcmV0dXJuICJBY2N0LVR1bm5lbC1Db25uZWN0aW9uIFtSRkMyODY3XSI7CisJCS8qIDY5ICAgICAgICBUdW5uZWwtUGFzc3dvcmQgICAgICAgICAgICAgICAgICAgICAgICAgIFtSRkMyODY4XSAqLworCWlmICggYyA9PSA2OSkgcmV0dXJuICJUdW5uZWwtUGFzc3dvcmQgW1JGQzI4NjhdIjsKKwkJLyogNzAgICAgICAgIEFSQVAtUGFzc3dvcmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1JGQzI4NjldICovCisJaWYgKCBjID09IDcwKSByZXR1cm4gIkFSQVAtUGFzc3dvcmQgW1JGQzI4NjldIjsKKwkJLyogNzEgICAgICAgIEFSQVAtRmVhdHVyZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1JGQzI4NjldICovCisJaWYgKCBjID09IDcxKSByZXR1cm4gIkFSQVAtRmVhdHVyZXMgW1JGQzI4NjldIjsKKwkJLyogNzIgICAgICAgIEFSQVAtWm9uZS1BY2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgW1JGQzI4NjldICovCisJaWYgKCBjID09IDcyKSByZXR1cm4gIkFSQVAtWm9uZS1BY2Nlc3MgW1JGQzI4NjldIjsKKwkJLyogNzMgICAgICAgIEFSQVAtU2VjdXJpdHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1JGQzI4NjldICovCisJaWYgKCBjID09IDczKSByZXR1cm4gIkFSQVAtU2VjdXJpdHkgW1JGQzI4NjldIjsKKwkJLyogNzQgICAgICAgIEFSQVAtU2VjdXJpdHktRGF0YSAgICAgICAgICAgICAgICAgICAgICAgW1JGQzI4NjldICovCisJaWYgKCBjID09IDc0KSByZXR1cm4gIkFSQVAtU2VjdXJpdHktRGF0YSBbUkZDMjg2OV0iOworCQkvKiA3NSAgICAgICAgUGFzc3dvcmQtUmV0cnkgICAgICAgICAgICAgICAgICAgICAgICAgICBbUkZDMjg2OV0gKi8KKwlpZiAoIGMgPT0gNzUpIHJldHVybiAiUGFzc3dvcmQtUmV0cnkgW1JGQzI4NjldIjsKKwkJLyogNzYgICAgICAgIFByb21wdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1JGQzI4NjldICovCisJaWYgKCBjID09IDc2KSByZXR1cm4gIlByb21wdCBbUkZDMjg2OV0iOworCQkvKiA3NyAgICAgICAgQ29ubmVjdC1JbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbUkZDMjg2OV0gKi8KKwlpZiAoIGMgPT0gNzcpIHJldHVybiAiQ29ubmVjdC1JbmZvIFtSRkMyODY5XSI7CisJCS8qIDc4ICAgICAgICBDb25maWd1cmF0aW9uLVRva2VuICAgICAgICAgICAgICAgICAgICAgIFtSRkMyODY5XSAqLworCWlmICggYyA9PSA3OCkgcmV0dXJuICJDb25maWd1cmF0aW9uLVRva2VuIFtSRkMyODY5XSI7CisJCS8qIDc5ICAgICAgICBFQVAtTWVzc2FnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtSRkMyODY5XSAqLworCWlmICggYyA9PSA3OSkgcmV0dXJuICJFQVAtTWVzc2FnZSBbUkZDMjg2OV0iOworCQkvKiA4MCAgICAgICAgTWVzc2FnZS1BdXRoZW50aWNhdG9yICAgICAgICAgICAgICAgICAgICBbUkZDMjg2OV0gKi8KKwlpZiAoIGMgPT0gODApIHJldHVybiAiTWVzc2FnZS1BdXRoZW50aWNhdG9yIFtSRkMyODY5XSI7CisJCS8qIDgxICAgICAgICBUdW5uZWwtUHJpdmF0ZS1Hcm91cC1JRCAgICAgICAgICAgICAgICAgIFtSRkMyODY4XSAqLworCWlmICggYyA9PSA4MSkgcmV0dXJuICJUdW5uZWwtUHJpdmF0ZS1Hcm91cC1JRCBbUkZDMjg2OF0iOworCQkvKiA4MiAgICAgICAgVHVubmVsLUFzc2lnbm1lbnQtSUQgICAgICAgICAgICAgICAgICAgICBbUkZDMjg2OF0gKi8KKwlpZiAoIGMgPT0gODIpIHJldHVybiAiVHVubmVsLUFzc2lnbm1lbnQtSUQgW1JGQzI4NjhdIjsKKwkJLyogODMgICAgICAgIFR1bm5lbC1QcmVmZXJlbmNlICAgICAgICAgICAgICAgICAgICAgICAgW1JGQzI4NjhdICovCisJaWYgKCBjID09IDgzKSByZXR1cm4gIlR1bm5lbC1QcmVmZXJlbmNlIFtSRkMyODY4XSI7CisJCS8qIDg0ICAgICAgICBBUkFQLUNoYWxsZW5nZS1SZXNwb25zZSAgICAgICAgICAgICAgICAgIFtSRkMyODY5XSAqLworCWlmICggYyA9PSA4NCkgcmV0dXJuICJBUkFQLUNoYWxsZW5nZS1SZXNwb25zZSBbUkZDMjg2OV0iOworCQkvKiA4NSAgICAgICAgQWNjdC1JbnRlcmltLUludGVydmFsICAgICAgICAgICAgICAgICAgICBbUkZDMjg2OV0gKi8KKwlpZiAoIGMgPT0gODUpIHJldHVybiAiQWNjdC1JbnRlcmltLUludGVydmFsIFtSRkMyODY5XSI7CisJCS8qIDg2ICAgICAgICBBY2N0LVR1bm5lbC1QYWNrZXRzLUxvc3QgICAgICAgICAgICAgICAgIFtSRkMyODY3XSAqLworCWlmICggYyA9PSA4NikgcmV0dXJuICJBY2N0LVR1bm5lbC1QYWNrZXRzLUxvc3QgW1JGQzI4NjddIjsKKwkJLyogODcgICAgICAgIE5BUy1Qb3J0LUlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1JGQzI4NjldICovCisJaWYgKCBjID09IDg3KSByZXR1cm4gIk5BUy1Qb3J0LUlkIFtSRkMyODY5XSI7CisJCS8qIDg4ICAgICAgICBGcmFtZWQtUG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtSRkMyODY5XSAqLworCWlmICggYyA9PSA4OCkgcmV0dXJuICJGcmFtZWQtUG9vbCBbUkZDMjg2OV0iOworCQkvKiA4OSAgICAgICAgQ1VJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbUkZDNDM3Ml0gKi8KKwlpZiAoIGMgPT0gODkpIHJldHVybiAiQ1VJIFtSRkM0MzcyXSI7CisJCS8qIDkwICAgICAgICBUdW5uZWwtQ2xpZW50LUF1dGgtSUQgICAgICAgICAgICAgICAgICAgIFtSRkMyODY4XSAqLworCWlmICggYyA9PSA5MCkgcmV0dXJuICJUdW5uZWwtQ2xpZW50LUF1dGgtSUQgW1JGQzI4NjhdIjsKKwkJLyogOTEgICAgICAgIFR1bm5lbC1TZXJ2ZXItQXV0aC1JRCAgICAgICAgICAgICAgICAgICAgW1JGQzI4NjhdICovCisJaWYgKCBjID09IDkxKSByZXR1cm4gIlR1bm5lbC1TZXJ2ZXItQXV0aC1JRCBbUkZDMjg2OF0iOworCQkvKiA5MiAgICAgICAgTkFTLUZpbHRlci1SdWxlICAgICAgICAgICAgICAgICAgICAgICAgICBbUkZDNDg0OV0gKi8KKwlpZiAoIGMgPT0gOTIpIHJldHVybiAiTkFTLUZpbHRlci1SdWxlIFtSRkM0ODQ5XSI7CisJCS8qIDkzICAgICAgICBVbmFzc2lnbmVkICovCisJaWYgKCBjID09IDkzKSByZXR1cm4gIlVuYXNzaWduZWQgIjsKKwkJLyogOTQgICAgICAgIE9yaWdpbmF0aW5nLUxpbmUtSW5mbyAgICAgICAgICAgICAgICAgICAgW1JGQzQwMDVdICovCisJaWYgKCBjID09IDk0KSByZXR1cm4gIk9yaWdpbmF0aW5nLUxpbmUtSW5mbyBbUkZDNDAwNV0iOworCQkvKiA5NSAgICAgICAgTkFTLUlQdjYtQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICBbUkZDMzE2Ml0gKi8KKwlpZiAoIGMgPT0gOTUpIHJldHVybiAiTkFTLUlQdjYtQWRkcmVzcyBbUkZDMzE2Ml0iOworCQkvKiA5NiAgICAgICAgRnJhbWVkLUludGVyZmFjZS1JZCAgICAgICAgICAgICAgICAgICAgICBbUkZDMzE2Ml0gKi8KKwlpZiAoIGMgPT0gOTYpIHJldHVybiAiRnJhbWVkLUludGVyZmFjZS1JZCBbUkZDMzE2Ml0iOworCQkvKiA5NyAgICAgICAgRnJhbWVkLUlQdjYtUHJlZml4ICAgICAgICAgICAgICAgICAgICAgICBbUkZDMzE2Ml0gKi8KKwlpZiAoIGMgPT0gOTcpIHJldHVybiAiRnJhbWVkLUlQdjYtUHJlZml4IFtSRkMzMTYyXSI7CisJCS8qIDk4ICAgICAgICBMb2dpbi1JUHY2LUhvc3QgICAgICAgICAgICAgICAgICAgICAgICAgIFtSRkMzMTYyXSAqLworCWlmICggYyA9PSA5OCkgcmV0dXJuICJMb2dpbi1JUHY2LUhvc3QgW1JGQzMxNjJdIjsKKwkJLyogOTkgICAgICAgIEZyYW1lZC1JUHY2LVJvdXRlICAgICAgICAgICAgICAgICAgICAgICAgW1JGQzMxNjJdICovCisJaWYgKCBjID09IDk5KSByZXR1cm4gIkZyYW1lZC1JUHY2LVJvdXRlIFtSRkMzMTYyXSI7CisJCS8qIDEwMCAgICAgICBGcmFtZWQtSVB2Ni1Qb29sICAgICAgICAgICAgICAgICAgICAgICAgIFtSRkMzMTYyXSAqLworCWlmICggYyA9PSAxMDApIHJldHVybiAiRnJhbWVkLUlQdjYtUG9vbCBbUkZDMzE2Ml0iOworCQkvKiAxMDEgICAgICAgRXJyb3ItQ2F1c2UgQXR0cmlidXRlICAgICAgICAgICAgICAgICAgICBbUkZDMzU3Nl0gKi8KKwlpZiAoIGMgPT0gMTAxKSByZXR1cm4gIkVycm9yLUNhdXNlIEF0dHJpYnV0ZVtSRkMzNTc2XSI7CisJCS8qIDEwMiAgICAgICBFQVAtS2V5LU5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtSRkM0MDcyXSAqLworCWlmICggYyA9PSAxMDIpIHJldHVybiAiRUFQLUtleS1OYW1lIFtSRkM0MDcyXSI7CisJCS8qIDEwMyAgICAgICBEaWdlc3QtUmVzcG9uc2UgICAgICAgICAgICAgICAgICAgICAgICAgIFtSRkM1MDkwXSAqLworCWlmICggYyA9PSAxMDMpIHJldHVybiAiRGlnZXN0LVJlc3BvbnNlIFtSRkM1MDkwXSI7CisJCS8qIDEwNCAgICAgICBEaWdlc3QtUmVhbG0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtSRkM1MDkwXSAqLworCWlmICggYyA9PSAxMDQpIHJldHVybiAiRGlnZXN0LVJlYWxtIFtSRkM1MDkwXSI7CisJCS8qIDEwNSAgICAgICBEaWdlc3QtTm9uY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtSRkM1MDkwXSAgICovCisJaWYgKCBjID09IDEwNSkgcmV0dXJuICJEaWdlc3QtTm9uY2UgW1JGQzUwOTBdIjsKKwkJLyogMTA2ICAgICAgIERpZ2VzdC1SZXNwb25zZS1BdXRoICAgICAgICAgICAgICAgICAgICAgW1JGQzUwOTBdICovCisJaWYgKCBjID09IDEwNikgcmV0dXJuICJEaWdlc3QtUmVzcG9uc2UtQXV0aCBbUkZDNTA5MF0iOworCQkvKiAxMDcgICAgICAgRGlnZXN0LU5leHRub25jZSAgICAgICAgICAgICAgICAgICAgICAgICBbUkZDNTA5MF0gKi8KKwlpZiAoIGMgPT0gMTA3KSByZXR1cm4gIkRpZ2VzdC1OZXh0bm9uY2UgW1JGQzUwOTBdIjsKKwkJLyogMTA4ICAgICAgIERpZ2VzdC1NZXRob2QgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1JGQzUwOTBdICovCisJaWYgKCBjID09IDEwOCkgcmV0dXJuICJEaWdlc3QtTWV0aG9kIFtSRkM1MDkwXSI7CisJCS8qIDEwOSAgICAgICBEaWdlc3QtVVJJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtSRkM1MDkwXSAgKi8KKwlpZiAoIGMgPT0gMTA5KSByZXR1cm4gIkRpZ2VzdC1VUkkgW1JGQzUwOTBdIjsKKwkJLyogMTEwICAgICAgIERpZ2VzdC1Rb3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1JGQzUwOTBdICAqLworCWlmICggYyA9PSAxMTApIHJldHVybiAiRGlnZXN0LVFvcCBbUkZDNTA5MF0iOworCQkvKiAxMTEgICAgICAgRGlnZXN0LUFsZ29yaXRobSAgICAgICAgICAgICAgICAgICAgICAgICBbUkZDNTA5MF0gICovCisJaWYgKCBjID09IDExMSkgcmV0dXJuICJEaWdlc3QtQWxnb3JpdGhtIFtSRkM1MDkwXSI7CisJCS8qIDExMiAgICAgICBEaWdlc3QtRW50aXR5LUJvZHktSGFzaCAgICAgICAgICAgICAgICAgIFtSRkM1MDkwXSAgKi8KKwlpZiAoIGMgPT0gMTEyKSByZXR1cm4gIkRpZ2VzdC1FbnRpdHktQm9keS1IYXNoIFtSRkM1MDkwXSI7CisJCS8qIDExMyAgICAgICBEaWdlc3QtQ05vbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtSRkM1MDkwXSAgKi8KKwlpZiAoIGMgPT0gMTEzKSByZXR1cm4gIkRpZ2VzdC1DTm9uY2UgW1JGQzUwOTBdIjsKKwkJLyogMTE0ICAgICAgIERpZ2VzdC1Ob25jZS1Db3VudCAgICAgICAgICAgICAgICAgICAgICAgW1JGQzUwOTBdICAqLworCWlmICggYyA9PSAxMTQpIHJldHVybiAiRGlnZXN0LU5vbmNlLUNvdW50IFtSRkM1MDkwXSI7CisJCS8qIDExNSAgICAgICBEaWdlc3QtVXNlcm5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgIFtSRkM1MDkwXSAgKi8KKwlpZiAoIGMgPT0gMTE1KSByZXR1cm4gIkRpZ2VzdC1Vc2VybmFtZSBbUkZDNTA5MF0iOworCQkvKiAxMTYgICAgICAgRGlnZXN0LU9wYXF1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBbUkZDNTA5MF0gICovCisJaWYgKCBjID09IDExNikgcmV0dXJuICJEaWdlc3QtT3BhcXVlIFtSRkM1MDkwXSI7CisJCS8qIDExNyAgICAgICBEaWdlc3QtQXV0aC1QYXJhbSAgICAgICAgICAgICAgICAgICAgICAgIFtSRkM1MDkwXSAgKi8KKwlpZiAoIGMgPT0gMTE3KSByZXR1cm4gIkRpZ2VzdC1BdXRoLVBhcmFtIFtSRkM1MDkwXSI7CisJCS8qIDExOCAgICAgICBEaWdlc3QtQUtBLUF1dHMgICAgICAgICAgICAgICAgICAgICAgICAgIFtSRkM1MDkwXSAgKi8KKwlpZiAoIGMgPT0gMTE4KSByZXR1cm4gIkRpZ2VzdC1BS0EtQXV0cyBbUkZDNTA5MF0iOworCQkvKiAxMTkgICAgICAgRGlnZXN0LURvbWFpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbUkZDNTA5MF0gICovCisJaWYgKCBjID09IDExOSkgcmV0dXJuICJEaWdlc3QtRG9tYWluIFtSRkM1MDkwXSI7CisJCS8qIDEyMCAgICAgICBEaWdlc3QtU3RhbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtSRkM1MDkwXSAgKi8KKwlpZiAoIGMgPT0gMTIwKSByZXR1cm4gIkRpZ2VzdC1TdGFsZSBbUkZDNTA5MF0iOworCQkvKiAxMjEgICAgICAgRGlnZXN0LUhBMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbUkZDNTA5MF0gICovCisJaWYgKCBjID09IDEyMSkgcmV0dXJuICJEaWdlc3QtSEExIFtSRkM1MDkwXSI7CisJCS8qIDEyMiAgICAgICBTSVAtQU9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtSRkM1MDkwXSAgKi8KKwlpZiAoIGMgPT0gMTIyKSByZXR1cm4gIlNJUC1BT1IgW1JGQzUwOTBdIjsKKwkJLyogMTIzICAgICAgIERlbGVnYXRlZC1JUHY2LVByZWZpeCAgICAgICAgICAgICAgICAgICAgW1JGQzQ4MThdICovCisJaWYgKCBjID09IDEyMykgcmV0dXJuICJEZWxlZ2F0ZWQtSVB2Ni1QcmVmaXggW1JGQzQ4MThdIjsKKwkJLyogMTI0ICAgICAgIE1JUDYtRmVhdHVyZS1WZWN0b3IgICAgICAgICAgICAgICAgICAgICAgW1JGQzU0NDddICovCisJaWYgKCBjID09IDEyNCkgcmV0dXJuICJNSVA2LUZlYXR1cmUtVmVjdG9yIFtSRkM1NDQ3XSI7CisJCS8qIDEyNSAgICAgICBNSVA2LUhvbWUtTGluay1QcmVmaXggICAgICAgICAgICAgICAgICAgIFtSRkM1NDQ3XSAqLworCWlmICggYyA9PSAxMjUpIHJldHVybiAiTUlQNi1Ib21lLUxpbmstUHJlZml4IFtSRkM1NDQ3XSI7CisJCS8qIDEyNi0xOTEgICBVbmFzc2lnbmVkICovCisJaWYgKChjID49IDEyNikgJiYgKGMgPD0gMTkxKSkgcmV0dXJuICJVbmFzc2lnbmVkICI7CisJCS8qIDE5Mi0yMjMgICBFeHBlcmltZW50YWwgVXNlICAgICAgICAgICAgICAgICAgICAgICAgIFtSRkMzNTc1XSAqLworCWlmICgoYyA+PSAxOTIpICYmIChjIDw9IDIyMykpIHJldHVybiAiRXhwZXJpbWVudGFsIFVzZVtSRkMzNTc1XSI7CisJCS8qIDIyNC0yNDAgICBJbXBsZW1lbnRhdGlvbiBTcGVjaWZpYyAgICAgICAgICAgICAgICAgIFtSRkMzNTc1XSAqLworCWlmICgoYyA+PSAyMjQpICYmIChjIDw9IDI0MCkpIHJldHVybiAiSW1wbGVtZW50YXRpb24gU3BlY2lmaWNbUkZDMzU3NV0iOworCQkvKiAyNDEtMjU1ICAgUmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbUkZDMzU3NV0gICAgKi8KKwlpZiAoKGMgPj0gMjQxKSkgcmV0dXJuICJSZXNlcnZlZCBbUkZDMzU3NV0iOworCS8qIGZhbGxiYWNrICovIHJldHVybiAiW1Vua25vd25dIjsKK30KZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvYXBwX3JhZGd3L3Jnd19tc2dfY29kZXMuYyBiL2V4dGVuc2lvbnMvYXBwX3JhZGd3L3Jnd19tc2dfY29kZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWIzZTcyCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9hcHBfcmFkZ3cvcmd3X21zZ19jb2Rlcy5jCkBAIC0wLDAgKzEsMTIwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxMSwgV0lERSBQcm9qZWN0IGFuZCBOSUNUCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBXSURFIFByb2plY3Qgb3IgTklDVCBub3IgdGhlIAkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFdJREUgUHJvamVjdCBhbmQgCQkJCQkJICoKKyogICBOSUNULgkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAicmd3X2NvbW1vbi5oIgorCisvKiBUaGUgY29udGVudCBvZiB0aGlzIGZpbGUgd2FzIHNlbWktYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZnJvbSB0aGUgSUFOQSByZWdpc3RyeS4gKi8KKworLyogIE5hbWUgb2YgUkFESVVTIGNvbW1hbmQgZnJvbSBpdHMgY29tbWFuZCBjb2RlICovCitjb25zdCBjaGFyICogcmd3X21zZ19jb2RlX3N0cih1bnNpZ25lZCBjaGFyIGMpIHsKKwkJLyogMSAgICAgICAgQWNjZXNzLVJlcXVlc3QgICAgICAgICAgICAgICAgICAgICAgICAgICBbUkZDMjg2NV0gKi8KKwlpZiAoIGMgPT0gMSkgcmV0dXJuICJBY2Nlc3MtUmVxdWVzdCBbUkZDMjg2NV0iOworCQkvKiAyICAgICAgICBBY2Nlc3MtQWNjZXB0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtSRkMyODY1XSAqLworCWlmICggYyA9PSAyKSByZXR1cm4gIkFjY2Vzcy1BY2NlcHQgW1JGQzI4NjVdIjsKKwkJLyogMyAgICAgICAgQWNjZXNzLVJlamVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBbUkZDMjg2NV0gKi8KKwlpZiAoIGMgPT0gMykgcmV0dXJuICJBY2Nlc3MtUmVqZWN0IFtSRkMyODY1XSI7CisJCS8qIDQgICAgICAgIEFjY291bnRpbmctUmVxdWVzdCAgICAgICAgICAgICAgICAgICAgICAgW1JGQzI4NjVdICovCisJaWYgKCBjID09IDQpIHJldHVybiAiQWNjb3VudGluZy1SZXF1ZXN0IFtSRkMyODY1XSI7CisJCS8qIDUgICAgICAgIEFjY291bnRpbmctUmVzcG9uc2UgICAgICAgICAgICAgICAgICAgICAgW1JGQzI4NjVdICovCisJaWYgKCBjID09IDUpIHJldHVybiAiQWNjb3VudGluZy1SZXNwb25zZSBbUkZDMjg2NV0iOworCQkvKiA2ICAgICAgICBBY2NvdW50aW5nLVN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgIFtSRkMzNTc1XSAqLworCWlmICggYyA9PSA2KSByZXR1cm4gIkFjY291bnRpbmctU3RhdHVzIFtSRkMzNTc1XSI7CisJCS8qIDcgICAgICAgIFBhc3N3b3JkLVJlcXVlc3QgICAgICAgICAgICAgICAgICAgICAgICAgW1JGQzM1NzVdICovCisJaWYgKCBjID09IDcpIHJldHVybiAiUGFzc3dvcmQtUmVxdWVzdCBbUkZDMzU3NV0iOworCQkvKiA4ICAgICAgICBQYXNzd29yZC1BY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtSRkMzNTc1XSAqLworCWlmICggYyA9PSA4KSByZXR1cm4gIlBhc3N3b3JkLUFjayBbUkZDMzU3NV0iOworCQkvKiA5ICAgICAgICBQYXNzd29yZC1SZWplY3QgICAgICAgICAgICAgICAgICAgICAgICAgIFtSRkMzNTc1XSAqLworCWlmICggYyA9PSA5KSByZXR1cm4gIlBhc3N3b3JkLVJlamVjdCBbUkZDMzU3NV0iOworCQkvKiAxMCAgICAgICBBY2NvdW50aW5nLU1lc3NhZ2UgICAgICAgICAgICAgICAgICAgICAgIFtSRkMzNTc1XSAqLworCWlmICggYyA9PSAxMCkgcmV0dXJuICJBY2NvdW50aW5nLU1lc3NhZ2UgW1JGQzM1NzVdIjsKKwkJLyogMTEgICAgICAgQWNjZXNzLUNoYWxsZW5nZSAgICAgICAgICAgICAgICAgICAgICAgICBbUkZDMjg2NV0gKi8KKwlpZiAoIGMgPT0gMTEpIHJldHVybiAiQWNjZXNzLUNoYWxsZW5nZSBbUkZDMjg2NV0iOworCQkvKiAxMiAgICAgICBTdGF0dXMtU2VydmVyIChleHBlcmltZW50YWwpICAgICAgICAgICAgIFtSRkMyODY1XSAqLworCWlmICggYyA9PSAxMikgcmV0dXJuICJTdGF0dXMtU2VydmVyIChleHBlcmltZW50YWwpW1JGQzI4NjVdIjsKKwkJLyogMTMgICAgICAgU3RhdHVzLUNsaWVudCAoZXhwZXJpbWVudGFsKSAgICAgICAgICAgICBbUkZDMjg2NV0gKi8KKwlpZiAoIGMgPT0gMTMpIHJldHVybiAiU3RhdHVzLUNsaWVudCAoZXhwZXJpbWVudGFsKVtSRkMyODY1XSI7CisJCS8qIDIxICAgICAgIFJlc291cmNlLUZyZWUtUmVxdWVzdCAgICAgICAgICAgICAgICAgICAgW1JGQzM1NzVdICovCisJaWYgKCBjID09IDIxKSByZXR1cm4gIlJlc291cmNlLUZyZWUtUmVxdWVzdCBbUkZDMzU3NV0iOworCQkvKiAyMiAgICAgICBSZXNvdXJjZS1GcmVlLVJlc3BvbnNlICAgICAgICAgICAgICAgICAgIFtSRkMzNTc1XSAqLworCWlmICggYyA9PSAyMikgcmV0dXJuICJSZXNvdXJjZS1GcmVlLVJlc3BvbnNlIFtSRkMzNTc1XSI7CisJCS8qIDIzICAgICAgIFJlc291cmNlLVF1ZXJ5LVJlcXVlc3QgICAgICAgICAgICAgICAgICAgW1JGQzM1NzVdICovCisJaWYgKCBjID09IDIzKSByZXR1cm4gIlJlc291cmNlLVF1ZXJ5LVJlcXVlc3QgW1JGQzM1NzVdIjsKKwkJLyogMjQgICAgICAgUmVzb3VyY2UtUXVlcnktUmVzcG9uc2UgICAgICAgICAgICAgICAgICBbUkZDMzU3NV0gKi8KKwlpZiAoIGMgPT0gMjQpIHJldHVybiAiUmVzb3VyY2UtUXVlcnktUmVzcG9uc2UgW1JGQzM1NzVdIjsKKwkJLyogMjUgICAgICAgQWx0ZXJuYXRlLVJlc291cmNlLVJlY2xhaW0tUmVxdWVzdCAgICAgICBbUkZDMzU3NV0gKi8KKwlpZiAoIGMgPT0gMjUpIHJldHVybiAiQWx0ZXJuYXRlLVJlc291cmNlLVJlY2xhaW0tUmVxdWVzdCBbUkZDMzU3NV0iOworCQkvKiAyNiAgICAgICBOQVMtUmVib290LVJlcXVlc3QgICAgICAgICAgICAgICAgICAgICAgIFtSRkMzNTc1XSAqLworCWlmICggYyA9PSAyNikgcmV0dXJuICJOQVMtUmVib290LVJlcXVlc3QgW1JGQzM1NzVdIjsKKwkJLyogMjcgICAgICAgTkFTLVJlYm9vdC1SZXNwb25zZSAgICAgICAgICAgICAgICAgICAgICBbUkZDMzU3NV0gKi8KKwlpZiAoIGMgPT0gMjcpIHJldHVybiAiTkFTLVJlYm9vdC1SZXNwb25zZSBbUkZDMzU3NV0iOworCQkvKiAyOCAgICAgICBSZXNlcnZlZCAqLworCWlmICggYyA9PSAyOCkgcmV0dXJuICJSZXNlcnZlZCAiOworCQkvKiAyOSAgICAgICBOZXh0LVBhc3Njb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtSRkMzNTc1XSAqLworCWlmICggYyA9PSAyOSkgcmV0dXJuICJOZXh0LVBhc3Njb2RlIFtSRkMzNTc1XSI7CisJCS8qIDMwICAgICAgIE5ldy1QaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1JGQzM1NzVdICovCisJaWYgKCBjID09IDMwKSByZXR1cm4gIk5ldy1QaW4gW1JGQzM1NzVdIjsKKwkJLyogMzEgICAgICAgVGVybWluYXRlLVNlc3Npb24gICAgICAgICAgICAgICAgICAgICAgICBbUkZDMzU3NV0gKi8KKwlpZiAoIGMgPT0gMzEpIHJldHVybiAiVGVybWluYXRlLVNlc3Npb24gW1JGQzM1NzVdIjsKKwkJLyogMzIgICAgICAgUGFzc3dvcmQtRXhwaXJlZCAgICAgICAgICAgICAgICAgICAgICAgICBbUkZDMzU3NV0gKi8KKwlpZiAoIGMgPT0gMzIpIHJldHVybiAiUGFzc3dvcmQtRXhwaXJlZCBbUkZDMzU3NV0iOworCQkvKiAzMyAgICAgICBFdmVudC1SZXF1ZXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtSRkMzNTc1XSAqLworCWlmICggYyA9PSAzMykgcmV0dXJuICJFdmVudC1SZXF1ZXN0IFtSRkMzNTc1XSI7CisJCS8qIDM0ICAgICAgIEV2ZW50LVJlc3BvbnNlICAgICAgICAgICAgICAgICAgICAgICAgICAgW1JGQzM1NzVdICovCisJaWYgKCBjID09IDM0KSByZXR1cm4gIkV2ZW50LVJlc3BvbnNlIFtSRkMzNTc1XSI7CisJCS8qIDQwICAgICAgIERpc2Nvbm5lY3QtUmVxdWVzdCAgICAgICAgICAgICAgICAgICAgICAgW1JGQzM1NzVdW1JGQzUxNzZdICovCisJaWYgKCBjID09IDQwKSByZXR1cm4gIkRpc2Nvbm5lY3QtUmVxdWVzdCBbUkZDMzU3NV1bUkZDNTE3Nl0iOworCQkvKiA0MSAgICAgICBEaXNjb25uZWN0LUFDSyAgICAgICAgICAgICAgICAgICAgICAgICAgIFtSRkMzNTc1XVtSRkM1MTc2XSAqLworCWlmICggYyA9PSA0MSkgcmV0dXJuICJEaXNjb25uZWN0LUFDSyBbUkZDMzU3NV1bUkZDNTE3Nl0iOworCQkvKiA0MiAgICAgICBEaXNjb25uZWN0LU5BSyAgICAgICAgICAgICAgICAgICAgICAgICAgIFtSRkMzNTc1XVtSRkM1MTc2XSAqLworCWlmICggYyA9PSA0MikgcmV0dXJuICJEaXNjb25uZWN0LU5BSyBbUkZDMzU3NV1bUkZDNTE3Nl0iOworCQkvKiA0MyAgICAgICBDb0EtUmVxdWVzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtSRkMzNTc1XVtSRkM1MTc2XSAqLworCWlmICggYyA9PSA0MykgcmV0dXJuICJDb0EtUmVxdWVzdCBbUkZDMzU3NV1bUkZDNTE3Nl0iOworCQkvKiA0NCAgICAgICBDb0EtQUNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtSRkMzNTc1XVtSRkM1MTc2XSAqLworCWlmICggYyA9PSA0NCkgcmV0dXJuICJDb0EtQUNLIFtSRkMzNTc1XVtSRkM1MTc2XSI7CisJCS8qIDQ1ICAgICAgIENvQS1OQUsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1JGQzM1NzVdW1JGQzUxNzZdICovCisJaWYgKCBjID09IDQ1KSByZXR1cm4gIkNvQS1OQUsgW1JGQzM1NzVdW1JGQzUxNzZdIjsKKwkJLyogNTAgICAgICAgSVAtQWRkcmVzcy1BbGxvY2F0ZSAgICAgICAgICAgICAgICAgICAgICBbUkZDMzU3NV0gKi8KKwlpZiAoIGMgPT0gNTApIHJldHVybiAiSVAtQWRkcmVzcy1BbGxvY2F0ZSBbUkZDMzU3NV0iOworCQkvKiA1MSAgICAgICBJUC1BZGRyZXNzLVJlbGVhc2UgICAgICAgICAgICAgICAgICAgICAgIFtSRkMzNTc1XSAqLworCWlmICggYyA9PSA1MSkgcmV0dXJuICJJUC1BZGRyZXNzLVJlbGVhc2UgW1JGQzM1NzVdIjsKKwkJLyogNTItMjQ5ICAgVW5hc3NpZ25lZCAqLworCWlmICgoYyA+PSA1MikgJiYgKGMgPD0gMjQ5KSkgcmV0dXJuICJVbmFzc2lnbmVkICI7CisJCS8qIDI1MC0yNTMgIEV4cGVyaW1lbnRhbCBVc2UgICAgICAgICAgICAgICAgICAgICAgICAgW1JGQzM1NzVdICovCisJaWYgKChjID49IDI1MCkgJiYgKGMgPD0gMjUzKSkgcmV0dXJuICJFeHBlcmltZW50YWwgVXNlW1JGQzM1NzVdIjsKKwkJLyogMjU0ICAgICAgUmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbUkZDMzU3NV0gKi8KKwlpZiAoIGMgPT0gMjU0KSByZXR1cm4gIlJlc2VydmVkIFtSRkMzNTc1XSI7CisJCS8qIDI1NSAgICAgIFJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1JGQzM1NzVdICovCisJaWYgKCBjID09IDI1NSkgcmV0dXJuICJSZXNlcnZlZCBbUkZDMzU3NV0iOworCS8qIGZhbGxiYWNrICovIHJldHVybiAiW1Vua25vd25dIjsKK30KZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvYXBwX3JhZGd3L3Jnd19wbHVnaW5zLmMgYi9leHRlbnNpb25zL2FwcF9yYWRndy9yZ3dfcGx1Z2lucy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZDQ1MjYKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2FwcF9yYWRndy9yZ3dfcGx1Z2lucy5jCkBAIC0wLDAgKzEsNDkxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxMywgV0lERSBQcm9qZWN0IGFuZCBOSUNUCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBXSURFIFByb2plY3Qgb3IgTklDVCBub3IgdGhlIAkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFdJREUgUHJvamVjdCBhbmQgCQkJCQkJICoKKyogICBOSUNULgkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIE1hbmFnZSB0aGUgbGlzdCBvZiBwbHVnaW5zIHRoYXQgcHJvdmlkZSBoYW5kbGVycyBmb3IgUkFESVVTIG1lc3NhZ2VzIGFuZCBhdHRyaWJ1dGVzICovCisKKyNpbmNsdWRlICJyZ3cuaCIKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgPGxpYmdlbi5oPgorCisvKiBMaXN0IG9mIHBsdWdpbnMsIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLiAqLworc3RhdGljIHN0cnVjdCBmZF9saXN0IHBsZ19saXN0ID0gRkRfTElTVF9JTklUSUFMSVpFUihwbGdfbGlzdCk7CisKKy8qIEEgcGx1Z2luIGVudHJ5ICovCitzdHJ1Y3QgcGxnX2Rlc2NyIHsKKwlzdHJ1Y3QgZmRfbGlzdAkJIGNoYWluOyAJLyogY2hhaW5pbmcgaW4gcGxnX2xpc3QgKi8KKwkKKwl2b2lkIAkJCSpkbG87CQkvKiBwb2ludGVyIHJldHVybmVkIGJ5IGRsb3BlbiBmb3IgdGhlIGV4dGVuc2lvbiwgdG8gdXNlIHdpdGggZGxjbG9zZSBsYXRlciAqLworCXN0cnVjdCByZ3dfYXBpCQkqZGVzY3JpcHRvcjsJLyogUG9pbnRzIHRvIHRoZSByZXNvbHZlZCBwbHVnaW4ncyByZ3dwX2Rlc2NyaXB0b3IgKi8KKwlzdHJ1Y3Qgcmd3cF9jb25maWcgCSpjczsJCS8qIHRoZSAocHJpdmF0ZSkgc3RhdGUgcmV0dXJuZWQgYnkgcmd3cF9jb25mX3BhcnNlICovCisJCisJaW50CQkJIHR5cGU7CQkvKiB0aGlzIGV4dGVuc2lvbiBpcyBjYWxsZWQgZm9yIG1lc3NhZ2VzIHJlY2VpdmVkIG9uIHRoaXModGhlc2UpIHNlcnZlciBwb3J0KHMpIG9ubHkgKi8KKwl1bnNpZ25lZCBjaGFyIAkJKmNjOwkJLyogYXJyYXkgb2YgY29tbWFuZCBjb2Rlcywgb3IgTlVMTCBmb3IgYWxsIGNjICovCisJc2l6ZV90CQkJIGNjX2xlbjsgCS8qIHNpemUgb2YgdGhlIHByZXZpb3VzIGFycmF5ICovCit9OworCisvKiBBY2NlbGVyYXRvcnMgZm9yIGVhY2ggY29tbWFuZCBjb2RlIChvbmUgZm9yIGVhY2ggcG9ydCkuIFRoZXNlIGFjY2VsZXJhdG9ycyBhcmUgYnVpbHQgb24tZGVtYW5kLCBhcyBhIGNhY2hlLCBhZnRlciBzdGFydF9jYWNoZSBmdW5jdGlvbiBoYXMgYmVlbiBjYWxsZWQuICAqLworc3RhdGljIHN0cnVjdCBmZF9saXN0IHBsZ19hY2NlbF9hdXRoID0gRkRfTElTVF9JTklUSUFMSVpFUihwbGdfYWNjZWxfYXV0aCk7CitzdGF0aWMgc3RydWN0IGZkX2xpc3QgcGxnX2FjY2VsX2FjY3QgPSBGRF9MSVNUX0lOSVRJQUxJWkVSKHBsZ19hY2NlbF9hY2N0KTsKKworLyogQWNjZWxlcmF0b3IgbGlzdCBpdGVtLCBvbmUgcGVyIGNvbW1hbmQgY29kZSB2YWx1ZSAob25seSB0aGUgb25lcyBhY3R1YWxseSB1c2VkKSAqLworc3RydWN0IHBsZ19hY2NlbCB7CisJc3RydWN0IGZkX2xpc3QJCWNoYWluOwkvKiBsaW5rIGluIHRoZSBwbGdfYWNjZWxfKiBsaXN0LiBMaXN0IG9yZGVyZWQgYnkgY2NvZGUuICovCisJdW5zaWduZWQgY2hhcgkJY2NvZGU7CS8qIHRoZSBjb21tYW5kIGNvZGUgZm9yIHRoaXMgYWNjZWxlcmF0b3IuIFdlIGRvbid0IGhhbmRsZSBleHRlbmRlZCBDQyB5ZXQgKi8KKwlzdHJ1Y3QgZmRfbGlzdAkJcGx1Z2luczsvKiBoZWFkIGZvciB0aGUgbGlzdCBvZiBwbGdfYWNjZWxfaXRlbSwgY29ycmVzcG9uZGluZyB0byB0aGUgZXh0ZW5zaW9ucyB0byBiZSBjYWxsZWQgZm9yIHRoaXMgY29tbWFuZCBjb2RlLiAqLworfTsKKworLyogQWNjZWxlcmF0b3IgaXRlbSAqLworc3RydWN0IHBsZ19hY2NlbF9pdGVtIHsKKwlzdHJ1Y3QgZmRfbGlzdAkJY2hhaW47IAkvKiBsaW5rIGluIHRoZSBwbGdfYWNjZWwgInBsdWdpbnMiIGxpc3QgKi8KKwlzdHJ1Y3QgcGxnX2Rlc2NyICoJcGxnOwkvKiBwb2ludGVyIHRvIHRoZSBwbHVnaW4gKi8KKwkvKiBOb3RlOiB3ZSBjYW4gZnVydGhlciBvcHRpbWl6ZSBieSBjYWNoaW5nIHRoZSBsb2NhdGlvbiBvZiBwbGctPmRlc2NyaXB0b3ItPnJnd3BfcmFkX3JlcSBldGMuLi4gYXQgdGhpcyBsZXZlbC4gKi8KK307CisKKy8qIFJXbG9jayB0byBwcm90ZWN0IGFsbCB0aGUgcHJldmlvdXMgbGlzdHMgKi8KK3N0YXRpYyBwdGhyZWFkX3J3bG9ja190IHBsZ19sb2NrID0gUFRIUkVBRF9SV0xPQ0tfSU5JVElBTElaRVI7CisKKy8qIEhhcyBzdGFydF9jYWNoZSBiZWVuIGNhbGxlZD8gKi8KK3N0YXRpYyBpbnQgY2FjaGVfc3RhcnRlZCA9IDA7CisKKworLyogVGhlIHJlYWQgbG9jayBtdXN0IGJlIGhlbGQgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiAqLworc3RhdGljIGludCBnZXRfYWNjZWxlcmF0b3Ioc3RydWN0IGZkX2xpc3QgKiogbGlzdCwgdW5zaWduZWQgY2hhciBjY29kZSwgaW50IHR5cGUpCit7CisJc3RydWN0IGZkX2xpc3QgKnJlZmVyLCAqc2VhcmNoOworCXN0cnVjdCBwbGdfYWNjZWwgKiBhY2NlbCA9IE5VTEw7CisJc3RydWN0IHBsZ19hY2NlbF9pdGVtICogaXRlbSA9IE5VTEw7CisJaW50IHVwZ3JhZGVkID0gMDsKKwkKKwlUUkFDRV9FTlRSWSgiJXAgJWhodSAlaSIsIGxpc3QsIGNjb2RlLCB0eXBlKTsKKwkKKwlDSEVDS19QQVJBTVMoIGNhY2hlX3N0YXJ0ZWQgJiYgbGlzdCAmJiAoKHR5cGUgPT0gUkdXX1BMR19UWVBFX0FVVEgpIHx8ICh0eXBlID09IFJHV19QTEdfVFlQRV9BQ0NUKSkgKTsKKwkKKwlpZiAodHlwZSA9PSBSR1dfUExHX1RZUEVfQVVUSCkKKwkJcmVmZXIgPSAmcGxnX2FjY2VsX2F1dGg7CisJZWxzZQorCQlyZWZlciA9ICZwbGdfYWNjZWxfYWNjdDsKK3Jlc3RhcnQ6CQorCS8qIENoZWNrIGlmIHdlIGhhdmUgYWxyZWFkeSBhbiBhY2NlbGVyYXRvciBmb3IgdGhpcyBjY29kZSAqLworCWZvciAoc2VhcmNoID0gcmVmZXItPm5leHQ7IHNlYXJjaCAhPSByZWZlcjsgc2VhcmNoID0gc2VhcmNoLT5uZXh0KSB7CisJCXN0cnVjdCBwbGdfYWNjZWwgKiBsb2MgPSAoc3RydWN0IHBsZ19hY2NlbCAqKXNlYXJjaDsKKwkJCisJCWlmIChsb2MtPmNjb2RlIDwgY2NvZGUpCisJCQljb250aW51ZTsKKwkJCisJCWlmIChsb2MtPmNjb2RlID4gY2NvZGUpCisJCQlicmVhazsgLyogd2UgZG9uJ3QgaGF2ZSBhbiBhY2NlbGVyYXRvciBmb3IgdGhpcyB2YWx1ZSB5ZXQgKi8KKwkJCisJCS8qIFdlIGZvdW5kIHRoZSBtYXRjaGluZyBhY2NlbGVyYXRvciwganVzdCByZXR1cm4gdGhpcyBsaXN0ICovCisJCSpsaXN0ID0gJmxvYy0+cGx1Z2luczsKKwkJcmV0dXJuIDA7CisJfQorCQorCS8qIFdlIG11c3QgY3JlYXRlIHRoZSBhY2NlbGVyYXRvciBsaXN0LCB0aGVuIHNhdmUgaXQganVzdCBiZWZvcmUgInNlYXJjaCIgKi8KKwkKKwkvKiBGaXJzdCAsIHVwZ3JhZGUgdGhlIGxvY2sgdG8gd3JpdGUgbG9jaywgYW5kIHJlc3RhcnQgdGhlIHNlYXJjaC4gVGhpcyBpcyB0aGUgb25seSByb2J1c3Qgc29sdXRpb24gdG8gYXZvaWQgZGVhZGxvY2tzICovCisJaWYgKCEgdXBncmFkZWQpIHsKKwkJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfcndsb2NrX3VubG9jaygmcGxnX2xvY2spICk7CisJCUNIRUNLX1BPU0lYKCBwdGhyZWFkX3J3bG9ja193cmxvY2soJnBsZ19sb2NrKSApOworCQl1cGdyYWRlZCA9IDE7CisJCWdvdG8gcmVzdGFydDsKKwl9CisJCisJLyogTm93IGNyZWF0ZSB0aGUgbmV3IGVsZW1lbnQgKi8KKwlDSEVDS19NQUxMT0MoIGFjY2VsID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgcGxnX2FjY2VsKSkgKTsKKwltZW1zZXQoYWNjZWwsIDAsIHNpemVvZihzdHJ1Y3QgcGxnX2FjY2VsKSApOworCWZkX2xpc3RfaW5pdCgmYWNjZWwtPmNoYWluLCBOVUxMKTsKKwlmZF9saXN0X2luaXQoJmFjY2VsLT5wbHVnaW5zLCBhY2NlbCk7CisJYWNjZWwtPmNjb2RlID0gY2NvZGU7CisJCisJLyogQ2hlY2sgZWFjaCBleHRlbnNpb24gZnJvbSB0aGUgZ2xvYmFsIGxpc3QgZm9yIHRoaXMgcG9ydCBhbmQgY2NvZGUgKi8KKwlmb3IgKHJlZmVyID0gcGxnX2xpc3QubmV4dDsgcmVmZXIgIT0gJnBsZ19saXN0OyByZWZlciA9IHJlZmVyLT5uZXh0KSB7CisJCXN0cnVjdCBwbGdfZGVzY3IgKiBsb2MgPSAoc3RydWN0IHBsZ19kZXNjciAqKXJlZmVyOworCQkKKwkJLyogU2tpcCBpZiB0aGlzIGV4dGVuc2lvbiBpcyBub3QgcmVnaXN0ZXJlZCBmb3IgdGhpcyBwb3J0ICovCisJCWlmICghIChsb2MtPnR5cGUgJiB0eXBlKSApCisJCQljb250aW51ZTsKKwkJCisJCS8qIENoZWNrIGlmIHRoZSBjY29kZSBpcyB0aGVyZSAqLworCQlpZiAobG9jLT5jYykgeworCQkJaW50IGk7CisJCQlpbnQgbWF0Y2ggPSAwOworCQkJZm9yIChpPTA7IGk8IGxvYy0+Y2NfbGVuOyBpKyspIHsKKwkJCQlpZiAobG9jLT5jY1tpXSA8IGNjb2RlKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAobG9jLT5jY1tpXSA9PSBjY29kZSkKKwkJCQkJbWF0Y2ggPSAxOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCFtYXRjaCkKKwkJCQljb250aW51ZTsKKwkJfQorCQkKKwkJLyogT2ssIHRoaXMgZXh0ZW5zaW9uIG11c3QgYmUgY2FsbGVkIGZvciB0aGlzIHBvcnQgLyBjY29kZSwgYWRkIHRvIHRoZSBhY2NlbGVyYXRvciAqLworCQlDSEVDS19NQUxMT0MoIGl0ZW0gPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBwbGdfYWNjZWxfaXRlbSkpICk7CisJCW1lbXNldChpdGVtLCAwLCBzaXplb2Yoc3RydWN0IHBsZ19hY2NlbF9pdGVtKSk7CisJCWZkX2xpc3RfaW5pdCgmaXRlbS0+Y2hhaW4sIE5VTEwpOworCQlpdGVtLT5wbGcgPSBsb2M7CisJCS8qIEFkZCBhcyBsYXN0IGVsZW1lbnQgb2YgdGhlIGFjY2VsZXJhdG9yICovCisJCWZkX2xpc3RfaW5zZXJ0X2JlZm9yZSgmYWNjZWwtPnBsdWdpbnMsICZpdGVtLT5jaGFpbik7CisJfQorCQorCS8qIE5vdywgc2F2ZSB0aGlzIGFjY2VsZXJhdG9yIGVudHJ5IGluIHRoZSBnbG9iYWwgbGlzdCAqLworCWZkX2xpc3RfaW5zZXJ0X2JlZm9yZShzZWFyY2gsICZhY2NlbC0+Y2hhaW4pOworCSpsaXN0ID0gJmFjY2VsLT5wbHVnaW5zOworCQorCXJldHVybiAwOworfQorCisKK2ludCByZ3dfcGxnX2FkZCggY2hhciAqIHBsZ2ZpbGUsIGNoYXIgKiBjb25mZmlsZSwgaW50IHR5cGUsIHVuc2lnbmVkIGNoYXIgKiogY29kZXNfYXJyYXksIHNpemVfdCBjb2Rlc19zeiApCit7CisJc3RydWN0IHBsZ19kZXNjciAqIG5ldzsKKwkKKwlUUkFDRV9FTlRSWSgiJXAgJXAgJWQgJXAgJXppIiwgcGxnZmlsZSwgY29uZmZpbGUsIHR5cGUsIGNvZGVzX2FycmF5LCBjb2Rlc19zeik7CisJCisJQ0hFQ0tfUEFSQU1TKCBwbGdmaWxlICYmIHR5cGUgJiYgY29kZXNfYXJyYXkgJiYgKGNhY2hlX3N0YXJ0ZWQgPT0gMCkgKTsKKwkKKwlDSEVDS19NQUxMT0MoIG5ldyA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHBsZ19kZXNjcikpICk7CisJbWVtc2V0KG5ldywgMCwgc2l6ZW9mKHN0cnVjdCBwbGdfZGVzY3IpKTsKKwkKKwlmZF9saXN0X2luaXQoJm5ldy0+Y2hhaW4sIG5ldyk7CisJCisJLyogVHJ5IGFuZCBsb2FkIHRoZSBwbHVnaW4gKi8KKwlUUkFDRV9ERUJVRyhGVUxMLCAiTG9hZGluZyBwbHVnaW46ICVzIiwgcGxnZmlsZSk7CisJbmV3LT5kbG8gPSBkbG9wZW4ocGxnZmlsZSwgUlRMRF9OT1cgfCBSVExEX0dMT0JBTCk7CisJaWYgKG5ldy0+ZGxvID09IE5VTEwpIHsKKwkJLyogQW4gZXJyb3Igb2NjdXJlZCAqLworCQlmZF9sb2dfZGVidWcoIkxvYWRpbmcgb2YgcGx1Z2luICclcycgZmFpbGVkOiAlcyIsIHBsZ2ZpbGUsIGRsZXJyb3IoKSk7CisJCWdvdG8gZXJyb3I7CisJfQorCQorCS8qIFJlc29sdmUgdGhlIGRlc2NyaXB0b3IgKi8KKwluZXctPmRlc2NyaXB0b3IgPSBkbHN5bSggbmV3LT5kbG8sICJyZ3dwX2Rlc2NyaXB0b3IiICk7CisJaWYgKG5ldy0+ZGVzY3JpcHRvciA9PSBOVUxMKSB7CisJCS8qIEFuIGVycm9yIG9jY3VyZWQgKi8KKwkJZmRfbG9nX2RlYnVnKCJVbmFibGUgdG8gcmVzb2x2ZSAncmd3cF9kZXNjcmlwdG9yJyBpbiBwbHVnaW4gJyVzJzogJXMiLCBwbGdmaWxlLCBkbGVycm9yKCkpOworCQlnb3RvIGVycm9yOworCX0KKwkKKwlUUkFDRV9ERUJVRyhGVUxMLCAiUGx1Z2luICclcycgZm91bmQgaW4gZmlsZSAnJXMnIiwgbmV3LT5kZXNjcmlwdG9yLT5yZ3dwX25hbWUsIHBsZ2ZpbGUpOworCQorCS8qIE5vdyBwYXJzZSB0aGUgY29uZmlndXJhdGlvbiBmaWxlLCB0aGlzIHdpbGwgaW5pdGlhbGl6ZSBhbGwgcGx1Z2luIHN0YXRlcyBhbmQgc3RvcmUgaXQgaW4gdGhlICJjcyIgcG9pbnRlciAodGhlIHBsdWdpbiBtdXN0IGJlIHJlLWVudHJhbnQsIHNvIG5vIGdsb2JhbCBzdGF0ZSkgKi8KKwlpZiAobmV3LT5kZXNjcmlwdG9yLT5yZ3dwX2NvbmZfcGFyc2UpIHsKKwkJQ0hFQ0tfRkNUX0RPKCAoKihuZXctPmRlc2NyaXB0b3ItPnJnd3BfY29uZl9wYXJzZSkpKGNvbmZmaWxlLCAmbmV3LT5jcyksIAorCQkJeworCQkJCWZkX2xvZ19kZWJ1ZygiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcGFyc2luZyBjb25maWd1cmF0aW9uIGZpbGUgJyVzJyBpbiBwbHVnaW4gJyVzJywgYWJvcnRpbmcuLi4iLCBjb25mZmlsZSwgcGxnZmlsZSk7CisJCQkJZ290byBlcnJvcjsKKwkJCX0gKTsKKwl9CisJCisJLyogTm93IHNvcnQgdGhlIGFycmF5ICh2ZXJ5IHNpbXBsZSBhbGdvcml0aG0sIGJ1dCB0aGlzIGxpc3QgaXMgdXN1YWxseSBzbWFsbCkgb2YgY29tbWFuZCBjb2RlcyBhbmQgc2F2ZSAqLworCWlmICgqY29kZXNfYXJyYXkgJiYgY29kZXNfc3opIHsKKwkJaW50IGk7CisJCQorCQluZXctPmNjID0gKmNvZGVzX2FycmF5OworCQkqY29kZXNfYXJyYXkgPSBOVUxMOworCQkKKwkJZm9yIChpID0gMDsgaSA8IGNvZGVzX3N6IC0gMTsgaSsrKSB7CisJCQlpbnQgaiwgaWR4ID0gaSwgbWluID0gbmV3LT5jY1tpXTsKKwkJCQorCQkJLyogZmluZCB0aGUgc21hbGxlc3QgcmVtYWluaW5nIGVsZW1lbnQgKi8KKwkJCWZvciAoaiA9IGkgKyAxOyBqIDwgY29kZXNfc3o7IGorKykgeworCQkJCWlmIChtaW4gPiBuZXctPmNjW2pdKSB7CisJCQkJCW1pbiA9IG5ldy0+Y2Nbal07CisJCQkJCWlkeCA9IGo7CisJCQkJfQorCQkJfQorCQkJCisJCQkvKiBzd2FwIGlmIG5lZWRlZCAqLworCQkJaWYgKGlkeCAhPSBpKSB7CisJCQkJaW50IHRtcCA9IG5ldy0+Y2NbaV07CisJCQkJbmV3LT5jY1tpXSA9IG5ldy0+Y2NbaWR4XTsKKwkJCQluZXctPmNjW2lkeF0gPSB0bXA7CisJCQl9CisJCX0KKwkJbmV3LT5jY19sZW4gPSBjb2Rlc19zejsKKwl9CisJCQorCW5ldy0+dHlwZSA9IHR5cGU7CisJCisJLyogQW5kIHNhdmUgdGhpcyBuZXcgZXh0ZW5zaW9uIGluIHRoZSBsaXN0LiBXZSBkb24ndCBuZWVkIHRvIGxvY2sgYXQgdGhpcyBwb2ludCBiZWNhdXNlIHdlIGFyZSBzaW5nbGUgdGhyZWFkZWQuICovCisJZmRfbGlzdF9pbnNlcnRfYmVmb3JlKCZwbGdfbGlzdCwgJm5ldy0+Y2hhaW4pOworCQorCXJldHVybiAwOworCQorCQorZXJyb3I6CisJaWYgKG5ldyAmJiBuZXctPmRsbykKKwkJZGxjbG9zZShuZXctPmRsbyk7CisJaWYgKG5ldykKKwkJZnJlZShuZXcpOwkKKwlyZXR1cm4gRUlOVkFMOworfQorCit2b2lkIHJnd19wbGdfZHVtcCh2b2lkKQoreworCXN0cnVjdCBwbGdfZGVzY3IgKiBwbGc7CisJc3RydWN0IGZkX2xpc3QgKiBwdHIsICpwdHJhY2NlbDsKKwkKKwlpZiAoICEgVFJBQ0VfQk9PTChGVUxMKSApCisJCXJldHVybjsKKwkKKwlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9yd2xvY2tfcmRsb2NrKCZwbGdfbG9jayksICk7CisJCisJaWYgKCAhIEZEX0lTX0xJU1RfRU1QVFkoICZwbGdfbGlzdCApICkKKwkJZmRfbG9nX2RlYnVnKCJbYXBwX3JhZGd3XSAgLS0tIExpc3Qgb2YgcmVnaXN0ZXJlZCBwbHVnaW5zOiIpOworCWZvciAocHRyID0gcGxnX2xpc3QubmV4dDsgcHRyICE9ICZwbGdfbGlzdDsgcHRyID0gcHRyLT5uZXh0KSB7CisJCWNoYXIgYnVmWzEwMjRdOworCQlwbGcgPSAoc3RydWN0IHBsZ19kZXNjciAqKXB0cjsKKwkJCisJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIgICUtMjVzICggJXAgKSAtIHR5cGVzOiAlcyVzLCBjb2RlczogIiwgCisJCQkgcGxnLT5kZXNjcmlwdG9yLT5yZ3dwX25hbWUsIAorCQkJIHBsZy0+Y3MsCisJCQkgcGxnLT50eXBlICYgUkdXX1BMR19UWVBFX0FVVEggPyAiQXUiIDogIiAgIiwKKwkJCSBwbGctPnR5cGUgJiBSR1dfUExHX1RZUEVfQUNDVCA/ICJBYyIgOiAiICAiKTsKKwkJCisJCWlmIChwbGctPmNjKSB7CisJCQlpbnQgaTsKKwkJCQorCQkJZm9yIChpID0gMDsgaSA8IHBsZy0+Y2NfbGVuOyBpKyspIHsKKwkJCQlzbnByaW50ZihidWYrc3RybGVuKGJ1ZiksIHNpemVvZihidWYpLXN0cmxlbihidWYpLCAiJTAyaGh4ICIsIHBsZy0+Y2NbaV0pOworCQkJfQorCQkJZmRfbG9nX2RlYnVnKCIlcyIsIGJ1Zik7CisJCX0gZWxzZSB7CisJCQlmZF9sb2dfZGVidWcoIiVzKiIsIGJ1Zik7CisJCX0KKwl9CisJCisJQ0hFQ0tfUE9TSVhfRE8oIHB0aHJlYWRfcndsb2NrX3VubG9jaygmcGxnX2xvY2spLCApOworCQorCS8qIER1bXAgdGhlIGxpc3Qgb2YgYWNjZWxlcmF0b3JzICovCisJaWYgKCAhIFRSQUNFX0JPT0woRlVMTCArIDEpICkKKwkJcmV0dXJuOworCQorCUNIRUNLX1BPU0lYX0RPKCBwdGhyZWFkX3J3bG9ja19yZGxvY2soJnBsZ19sb2NrKSwgKTsKKwlpZiAoICFGRF9JU19MSVNUX0VNUFRZKCAmcGxnX2FjY2VsX2F1dGggKSB8fCAhRkRfSVNfTElTVF9FTVBUWSggJnBsZ19hY2NlbF9hY2N0ICkpCisJCWZkX2xvZ19kZWJ1ZygiICAtLS0gQWNjZWxlcmF0b3JzOiIpOworCQorCWZvciAocHRyYWNjZWwgPSBwbGdfYWNjZWxfYXV0aC5uZXh0OyBwdHJhY2NlbCAhPSAmcGxnX2FjY2VsX2F1dGg7IHB0cmFjY2VsID0gcHRyYWNjZWwtPm5leHQpIHsKKwkJc3RydWN0IHBsZ19hY2NlbCAqIGFjY2VsID0gKHN0cnVjdCBwbGdfYWNjZWwgKilwdHJhY2NlbDsKKwkJZmRfbG9nX2RlYnVnKCIgIGF1dGgsIGNvZGUgJTAyaGh1OiIsIGFjY2VsLT5jY29kZSk7CisKKwkJZm9yIChwdHIgPSBhY2NlbC0+cGx1Z2lucy5uZXh0OyBwdHIgIT0gJmFjY2VsLT5wbHVnaW5zOyBwdHIgPSBwdHItPm5leHQpIHsKKwkJCXN0cnVjdCBwbGdfYWNjZWxfaXRlbSAqIGl0ZW0gPSAoc3RydWN0IHBsZ19hY2NlbF9pdGVtICopcHRyOworCQkJZmRfbG9nX2RlYnVnKCIgICAgICUtMTVzICglcCkiLCBpdGVtLT5wbGctPmRlc2NyaXB0b3ItPnJnd3BfbmFtZSwgaXRlbS0+cGxnLT5jcyk7CisJCX0KKwl9CisJZm9yIChwdHJhY2NlbCA9IHBsZ19hY2NlbF9hY2N0Lm5leHQ7IHB0cmFjY2VsICE9ICZwbGdfYWNjZWxfYWNjdDsgcHRyYWNjZWwgPSBwdHJhY2NlbC0+bmV4dCkgeworCQlzdHJ1Y3QgcGxnX2FjY2VsICogYWNjZWwgPSAoc3RydWN0IHBsZ19hY2NlbCAqKXB0cmFjY2VsOworCQlmZF9sb2dfZGVidWcoIiAgYWNjdCwgY29kZSAlMDJoaHU6IiwgYWNjZWwtPmNjb2RlKTsKKworCQlmb3IgKHB0ciA9IGFjY2VsLT5wbHVnaW5zLm5leHQ7IHB0ciAhPSAmYWNjZWwtPnBsdWdpbnM7IHB0ciA9IHB0ci0+bmV4dCkgeworCQkJc3RydWN0IHBsZ19hY2NlbF9pdGVtICogaXRlbSA9IChzdHJ1Y3QgcGxnX2FjY2VsX2l0ZW0gKilwdHI7CisJCQlmZF9sb2dfZGVidWcoIiAgICAgJS0xNXMgKCVwKSIsIGl0ZW0tPnBsZy0+ZGVzY3JpcHRvci0+cmd3cF9uYW1lLCBpdGVtLT5wbGctPmNzKTsKKwkJfQorCX0KKwkKKwkKKwlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9yd2xvY2tfdW5sb2NrKCZwbGdfbG9jayksICk7CisJCit9CisKK3ZvaWQgcmd3X3BsZ19zdGFydF9jYWNoZSh2b2lkKQoreworCWNhY2hlX3N0YXJ0ZWQrKzsKK30KKworaW50IHJnd19wbGdfbG9vcF9yZXEoc3RydWN0IHJnd19yYWRpdXNfbXNnX21ldGEgKipyYWQsIHN0cnVjdCBtc2cgKipkaWFtX21zZywgc3RydWN0IHJnd19jbGllbnQgKiBjbGkpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGZkX2xpc3QgKiBoZWFkID0gTlVMTCwgKmxpOworCXN0cnVjdCByYWRpdXNfbXNnICogcmFkX2FucyA9IE5VTEw7CisJCisJVFJBQ0VfRU5UUlkoIiVwICVwICVwIiwgcmFkLCBkaWFtX21zZywgY2xpKTsKKwlDSEVDS19QQVJBTVMoIHJhZCAmJiAqcmFkICYmIGRpYW1fbXNnICYmICpkaWFtX21zZyAmJiBjbGkpOworCQorCS8qIEZpcnN0LCBnZXQgdGhlIGxpc3Qgb2YgZXh0ZW5zaW9ucyBmb3IgdGhpcyBtZXNzYWdlICovCisJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfcndsb2NrX3JkbG9jayggJnBsZ19sb2NrKSApOworCUNIRUNLX0ZDVF9ETyggcmV0ID0gZ2V0X2FjY2VsZXJhdG9yKCZoZWFkLCAoKnJhZCktPnJhZGl1cy5oZHItPmNvZGUsICgqcmFkKS0+c2Vydl90eXBlKSwgCisJCXsgQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfcndsb2NrX3VubG9jayggJnBsZ19sb2NrKSApOyByZXR1cm4gcmV0OyB9ICk7CisJCisJLyogTG9vcCBpbiB0aGUgbGlzdCBvZiBleHRlbnNpb25zICovCisJZm9yIChsaSA9IGhlYWQtPm5leHQ7IGxpICE9IGhlYWQ7IGxpID0gbGktPm5leHQpIHsKKwkJc3RydWN0IHBsZ19kZXNjciAqIHBsZyA9ICgoc3RydWN0IHBsZ19hY2NlbF9pdGVtICopIGxpKS0+cGxnOworCQkKKwkJaWYgKHBsZy0+ZGVzY3JpcHRvci0+cmd3cF9yYWRfcmVxKSB7CisJCQlUUkFDRV9ERUJVRyhBTk5PWUlORywgIkNhbGxpbmcgbmV4dCBwbHVnaW46ICVzIiwgcGxnLT5kZXNjcmlwdG9yLT5yZ3dwX25hbWUpOworCQkJcmV0ID0gKCpwbGctPmRlc2NyaXB0b3ItPnJnd3BfcmFkX3JlcSkocGxnLT5jcywgJigqcmFkKS0+cmFkaXVzLCAmcmFkX2FucywgZGlhbV9tc2csIGNsaSk7CisJCQlpZiAocmV0KQorCQkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJVFJBQ0VfREVCVUcoQU5OT1lJTkcsICJTa2lwcGluZyBleHRlbnNpb24gJyVzJyAoTlVMTCBjYWxsYmFjaykiLCBwbGctPmRlc2NyaXB0b3ItPnJnd3BfbmFtZSk7CisJCX0JCQkJCQorCX0KKwkKKwlDSEVDS19QT1NJWCggcHRocmVhZF9yd2xvY2tfdW5sb2NrKCAmcGxnX2xvY2spICk7CisJCisJLyogSWYgbm8gZXJyb3IgZW5jb3VudGVyZWQsIHdlJ3JlIGRvbmUgaGVyZSAqLworCWlmIChyZXQgPT0gMCkKKwkJcmV0dXJuIDA7CisJCisJLyogRGVzdHJveSB0aGUgRGlhbWV0ZXIgdGVtcCBtZXNzYWdlLCBpZiBhbnkgKi8KKwlpZiAoKmRpYW1fbXNnKSB7CisJCUNIRUNLX0ZDVF9ETyggZmRfbXNnX2ZyZWUoKmRpYW1fbXNnKSwgKTsKKwkJKmRpYW1fbXNnID0gTlVMTDsKKwl9CisJCisJLyogU2VuZCB0aGUgcmFkaXVzIG1lc3NhZ2UgYmFjayBpZiByZXF1aXJlZCAqLworCWlmICgocmV0ID09IC0yKSAmJiByYWRfYW5zICYmIHJhZCkgeworCQlDSEVDS19GQ1RfRE8oIHJnd19jbGllbnRfZmluaXNoX3NlbmQoJnJhZF9hbnMsICpyYWQsIGNsaSksIC8qIEl0IGZhaWxlZCwgaXQgY2FuJ3QgYmUgaGVscGVkLi4uICovKTsKKwl9CisJCisJaWYgKHJldCA+IDApIHsKKwkJLyogQ3JpdGljYWwgZXJyb3IsIGxvZyBhbmQgZXhpdCAqLworCQlUUkFDRV9ERUJVRyhOT05FLCAiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgaGFuZGxpbmcgYSBSQURJVVMgbWVzc2FnZSBmcm9tICclcyc6ICVzIiwgcmd3X2NsaWVudHNfaWQoY2xpKSwgc3RyZXJyb3IocmV0KSk7CisJCXJldHVybiByZXQ7CisJfQorCQorCS8qIE5vdywgZGlzY2FyZCB0aGUgbWVzc2FnZSBhbmQgcmV0dXJuICovCisJcmd3X21zZ19mcmVlKHJhZCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIExvb3AgaW4gdGhlIGV4dGVuc2lvbiBsaXN0IChzYW1lIGFzIHJlcSkgdG8gY29udmVydCBkYXRhIGZyb20gZGlhbV9hbnMgdG8gcmFkX2FucyAqLworaW50IHJnd19wbGdfbG9vcF9hbnMoc3RydWN0IHJnd19yYWRpdXNfbXNnX21ldGEgKnJlcSwgc3RydWN0IG1zZyAqKmRpYW1fYW5zLCBzdHJ1Y3QgcmFkaXVzX21zZyAqKiByYWRfYW5zLCBzdHJ1Y3Qgcmd3X2NsaWVudCAqIGNsaSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgZmRfbGlzdCAqIGhlYWQgPSBOVUxMLCAqbGk7CisJCisJVFJBQ0VfRU5UUlkoIiVwICVwICVwICVwIiwgcmVxLCBkaWFtX2FucywgcmFkX2FucywgY2xpKTsKKwlDSEVDS19QQVJBTVMoIHJlcSAmJiBkaWFtX2FucyAmJiAqZGlhbV9hbnMgJiYgcmFkX2FucyAmJiAqcmFkX2FucyAmJiBjbGkpOworCQorCS8qIEdldCB0aGUgbGlzdCBvZiBleHRlbnNpb25zIG9mIHRoZSBSQURJVVMgcmVxdWVzdCAqLworCUNIRUNLX1BPU0lYKCBwdGhyZWFkX3J3bG9ja19yZGxvY2soICZwbGdfbG9jaykgKTsKKwlDSEVDS19GQ1RfRE8oIHJldCA9IGdldF9hY2NlbGVyYXRvcigmaGVhZCwgcmVxLT5yYWRpdXMuaGRyLT5jb2RlLCByZXEtPnNlcnZfdHlwZSksIAorCQl7IENIRUNLX1BPU0lYKCBwdGhyZWFkX3J3bG9ja191bmxvY2soICZwbGdfbG9jaykgKTsgcmV0dXJuIHJldDsgfSApOworCQorCS8qIExvb3AgaW4gdGhlIGxpc3Qgb2YgZXh0ZW5zaW9ucyAqLworCWZvciAobGkgPSBoZWFkLT5uZXh0OyBsaSAhPSBoZWFkOyBsaSA9IGxpLT5uZXh0KSB7CisJCXN0cnVjdCBwbGdfZGVzY3IgKiBwbGcgPSAoKHN0cnVjdCBwbGdfYWNjZWxfaXRlbSAqKSBsaSktPnBsZzsKKwkJCisJCWlmIChwbGctPmRlc2NyaXB0b3ItPnJnd3BfZGlhbV9hbnMpIHsKKwkJCVRSQUNFX0RFQlVHKEFOTk9ZSU5HLCAiQ2FsbGluZyBuZXh0IHBsdWdpbjogJXMiLCBwbGctPmRlc2NyaXB0b3ItPnJnd3BfbmFtZSk7CisJCQlyZXQgPSAoKnBsZy0+ZGVzY3JpcHRvci0+cmd3cF9kaWFtX2FucykocGxnLT5jcywgZGlhbV9hbnMsIHJhZF9hbnMsICh2b2lkICopY2xpKTsKKwkJCWlmIChyZXQpCisJCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQlUUkFDRV9ERUJVRyhBTk5PWUlORywgIlNraXBwaW5nIGV4dGVuc2lvbiAnJXMnIChOVUxMIGNhbGxiYWNrKSIsIHBsZy0+ZGVzY3JpcHRvci0+cmd3cF9uYW1lKTsKKwkJfQkJCQkJCisJfQorCQorCUNIRUNLX1BPU0lYKCBwdGhyZWFkX3J3bG9ja191bmxvY2soICZwbGdfbG9jaykgKTsKKwkKKwkvKiBJZiBubyBlcnJvciBlbmNvdW50ZXJlZCwgd2UncmUgZG9uZSBoZXJlICovCisJaWYgKHJldCA9PSAwKQorCQlyZXR1cm4gMDsKKwkKKwkvKiBEZXN0cm95IHRoZSB0ZW1wb3JhcnkgUkFESVVTIGFuc3dlciAqLworCWlmICgqcmFkX2FucykgeworCQlyYWRpdXNfbXNnX2ZyZWUoKnJhZF9hbnMpOworCQlmcmVlKCpyYWRfYW5zKTsKKwkJKnJhZF9hbnMgPSBOVUxMOworCX0KKwkKKwlpZiAocmV0ID4gMCkgeworCQkvKiBDcml0aWNhbCBlcnJvciwgbG9nIGFuZCBleGl0ICovCisJCWZkX2xvZ19kZWJ1ZygiW2FwcF9yYWRnd10gQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgaGFuZGxpbmcgYSBESUFNRVRFUiBhbnN3ZXIgdG8gYSBjb252ZXJ0ZWQgUkFESVVTIHJlcXVlc3QsIHR1cm4gb24gREVCVUcgZm9yIGRldGFpbHM6ICVzIiwgc3RyZXJyb3IocmV0KSk7CisJCXJldHVybiByZXQ7CisJfQorCQorCS8qIFdlIG1pZ2h0IGRlZmluZSBvdGhlciByZXR1cm4gdmFsdWVzIHdpdGggc3BlY2lhbCBtZWFuaW5nIGhlcmUgKHJldCA9PSAtMSwgLi4uKSBmb3IgZXhhbXBsZSBjcmVhdGUgYSBuZXcgRGlhbWV0ZXIgcmVxdWVzdCAqLworCQorCS8qIC0xOiBqdXN0IGFib3JkIHRoZSB0cmFuc2xhdGlvbiB3aXRoIG5vIG1vcmUgcHJvY2Vzc2luZy4gKi8KKwkKKwlyZXR1cm4gMDsKK30KKwordm9pZCByZ3dfcGxnX2Zpbmkodm9pZCkKK3sKKwlzdHJ1Y3QgZmRfbGlzdCAqIGl0ZW0sICpzdWJpdGVtOworCQorCVRSQUNFX0VOVFJZKCk7CisJCisJQ0hFQ0tfUE9TSVhfRE8oIHB0aHJlYWRfcndsb2NrX3JkbG9jayggJnBsZ19sb2NrKSwgLyogY29udGludWUgYW55d2F5ICovICk7CisJCisJLyogUmVtb3ZlIGFsbCBlbGVtZW50cyBmcm9tIGFsbCBhY2NlbGVyYXRvcnMgKi8KKwl3aGlsZSAoICEgRkRfSVNfTElTVF9FTVBUWSgmcGxnX2FjY2VsX2F1dGgpICkgeworCQlpdGVtID0gcGxnX2FjY2VsX2F1dGgubmV4dDsKKwkJZmRfbGlzdF91bmxpbmsoaXRlbSk7CisJCXsKKwkJCXN0cnVjdCBwbGdfYWNjZWwgKiBhY2NlbCA9IChzdHJ1Y3QgcGxnX2FjY2VsICopaXRlbTsKKwkJCXdoaWxlICggISBGRF9JU19MSVNUX0VNUFRZKCZhY2NlbC0+cGx1Z2lucykgKSB7CisJCQkJc3ViaXRlbSA9IGFjY2VsLT5wbHVnaW5zLm5leHQ7CisJCQkJZmRfbGlzdF91bmxpbmsoc3ViaXRlbSk7CisJCQkJZnJlZShzdWJpdGVtKTsKKwkJCX0KKwkJfQorCQlmcmVlKGl0ZW0pOworCX0KKwl3aGlsZSAoICEgRkRfSVNfTElTVF9FTVBUWSgmcGxnX2FjY2VsX2FjY3QpICkgeworCQlpdGVtID0gcGxnX2FjY2VsX2FjY3QubmV4dDsKKwkJZmRfbGlzdF91bmxpbmsoaXRlbSk7CisJCXsKKwkJCXN0cnVjdCBwbGdfYWNjZWwgKiBhY2NlbCA9IChzdHJ1Y3QgcGxnX2FjY2VsICopaXRlbTsKKwkJCXdoaWxlICggISBGRF9JU19MSVNUX0VNUFRZKCZhY2NlbC0+cGx1Z2lucykgKSB7CisJCQkJc3ViaXRlbSA9IGFjY2VsLT5wbHVnaW5zLm5leHQ7CisJCQkJZmRfbGlzdF91bmxpbmsoc3ViaXRlbSk7CisJCQkJZnJlZShzdWJpdGVtKTsKKwkJCX0KKwkJfQorCQlmcmVlKGl0ZW0pOworCX0KKwkKKwkvKiBOb3cgZGVzdHJveSBhbGwgcGx1Z2lucyBpbmZvcm1hdGlvbiAqLworCXdoaWxlICggISBGRF9JU19MSVNUX0VNUFRZKCZwbGdfbGlzdCkgKSB7CisJCXN0cnVjdCBwbGdfZGVzY3IgKiBwbGcgPSAoc3RydWN0IHBsZ19kZXNjciAqKSBwbGdfbGlzdC5uZXh0OworCQlmZF9saXN0X3VubGluaygmcGxnLT5jaGFpbik7CisJCWZyZWUocGxnLT5jYyk7CisJCWlmIChwbGctPmRlc2NyaXB0b3IgJiYgcGxnLT5kZXNjcmlwdG9yLT5yZ3dwX2NvbmZfZnJlZSApIHsKKwkJCVRSQUNFX0RFQlVHKElORk8sICJSQURJVVMvRGlhbWV0ZXIgZ2F0ZXdheSBwbHVnaW4gJyVzJyBjbGVhbmluZyB1cC4uLiIsIHBsZy0+ZGVzY3JpcHRvci0+cmd3cF9uYW1lKTsKKwkJCSgqcGxnLT5kZXNjcmlwdG9yLT5yZ3dwX2NvbmZfZnJlZSkocGxnLT5jcyk7CisJCX0KKwkJaWYgKHBsZy0+ZGxvKQorCQkJZGxjbG9zZShwbGctPmRsbyk7CisJCWZyZWUocGxnKTsKKwl9CisJCisJQ0hFQ0tfUE9TSVhfRE8oIHB0aHJlYWRfcndsb2NrX3VubG9jayggJnBsZ19sb2NrKSwgKTsKK30KZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvYXBwX3JhZGd3L3Jnd19zZXJ2ZXJzLmMgYi9leHRlbnNpb25zL2FwcF9yYWRndy9yZ3dfc2VydmVycy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1MjRmMjAKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2FwcF9yYWRndy9yZ3dfc2VydmVycy5jCkBAIC0wLDAgKzEsMzA0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxMywgV0lERSBQcm9qZWN0IGFuZCBOSUNUCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBXSURFIFByb2plY3Qgb3IgTklDVCBub3IgdGhlIAkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFdJREUgUHJvamVjdCBhbmQgCQkJCQkJICoKKyogICBOSUNULgkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIE1hbmFnZSB0aGUgUkFESVVTIHNlcnZlcihzKTogb3BlbmluZyBzb2NrZXRzLCByZWNlaXZpbmcgbWVzc2FnZXMsIC4uLiAqLworCisjaW5jbHVkZSAicmd3LmgiCisKKyNkZWZpbmUgUkFESVVTX01BWF9NU0dfTEVOIAkzMDAwCisjZGVmaW5lIFJBRElVU19BVVRIX1BPUlQJMTgxMgorI2RlZmluZSBSQURJVVNfQUNDVF9QT1JUCTE4MTMKKworLyogRGVjbGFyZSB0aGUgcmd3X3NlcnZlcnMgKi8KK3N0cnVjdCByZ3dfc2VydnMgcmd3X3NlcnZlcnM7CisKK3ZvaWQgcmd3X3NlcnZlcnNfZHVtcCh2b2lkKQoreworCWNoYXIgaXBzdHJbSU5FVDZfQUREUlNUUkxFTl07CisJCisJTE9HX0QoIiBhdXRoIHNlcnZlcjoiKTsKKwlMT0dfRCgiICAgIGRpc2FibGVkLi4uLi4gOiAlcyIsIHJnd19zZXJ2ZXJzLmF1dGhfc2Vydi5kaXNhYmxlZCA/ICJUUlVFIjoiZmFsc2UiKTsKKwlMT0dfRCgiICAgIElQIGRpc2FibGVkLi4gOiAlcyIsIHJnd19zZXJ2ZXJzLmF1dGhfc2Vydi5pcF9kaXNhYmxlZCA/ICJUUlVFIjoiZmFsc2UiKTsKKwlMT0dfRCgiICAgIElQdjYgZGlzYWJsZWQgOiAlcyIsIHJnd19zZXJ2ZXJzLmF1dGhfc2Vydi5pcDZfZGlzYWJsZWQgPyAiVFJVRSI6ImZhbHNlIik7CisJTE9HX0QoIiAgICBwb3J0Li4uLi4uLi4uIDogJWh1IiwgbnRvaHMocmd3X3NlcnZlcnMuYXV0aF9zZXJ2LnBvcnQpKTsKKwlpbmV0X250b3AoQUZfSU5FVCwgJnJnd19zZXJ2ZXJzLmF1dGhfc2Vydi5pcF9lbmRwb2ludCxpcHN0cixzaXplb2YoaXBzdHIpKTsKKwlMT0dfRCgiICAgIElQIGJpbmQuLi4uLi4gOiAlcyIsIGlwc3RyKTsKKwlpbmV0X250b3AoQUZfSU5FVDYsICZyZ3dfc2VydmVycy5hdXRoX3NlcnYuaXA2X2VuZHBvaW50LGlwc3RyLHNpemVvZihpcHN0cikpOworCUxPR19EKCIgICAgSVB2NiBiaW5kLi4uLiA6ICVzIiwgaXBzdHIpOworCisJTE9HX0QoIiBhY2N0IHNlcnZlcjoiKTsKKwlMT0dfRCgiICAgIGRpc2FibGVkLi4uLi4gOiAlcyIsIHJnd19zZXJ2ZXJzLmFjY3Rfc2Vydi5kaXNhYmxlZCA/ICJUUlVFIjoiZmFsc2UiKTsKKwlMT0dfRCgiICAgIElQIGRpc2FibGVkLi4gOiAlcyIsIHJnd19zZXJ2ZXJzLmFjY3Rfc2Vydi5pcF9kaXNhYmxlZCA/ICJUUlVFIjoiZmFsc2UiKTsKKwlMT0dfRCgiICAgIElQdjYgZGlzYWJsZWQgOiAlcyIsIHJnd19zZXJ2ZXJzLmFjY3Rfc2Vydi5pcDZfZGlzYWJsZWQgPyAiVFJVRSI6ImZhbHNlIik7CisJTE9HX0QoIiAgICBwb3J0Li4uLi4uLi4uIDogJWh1IiwgbnRvaHMocmd3X3NlcnZlcnMuYWNjdF9zZXJ2LnBvcnQpKTsKKwlpbmV0X250b3AoQUZfSU5FVCwgJnJnd19zZXJ2ZXJzLmFjY3Rfc2Vydi5pcF9lbmRwb2ludCxpcHN0cixzaXplb2YoaXBzdHIpKTsKKwlMT0dfRCgiICAgIElQIGJpbmQuLi4uLi4gOiAlcyIsIGlwc3RyKTsKKwlpbmV0X250b3AoQUZfSU5FVDYsICZyZ3dfc2VydmVycy5hY2N0X3NlcnYuaXA2X2VuZHBvaW50LGlwc3RyLHNpemVvZihpcHN0cikpOworCUxPR19EKCIgICAgSVB2NiBiaW5kLi4uLiA6ICVzIiwgaXBzdHIpOworCit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VydmVyc19kYXRhIHsKKwlpbnQJdHlwZTsgLyogYXV0aCBvciBhY2N0ICovCisJaW50CWZhbWlseTsgLyogQUZfSU5FVCBvciBBRl9JTkVUNiAqLworCWludAlzb2NrOyAvKiB0aGUgc29ja2V0IG51bWJlciAqLworCXB0aHJlYWRfdCB0aDsgLyogdGhlIHJ1bm5pbmcgc2VydmVyIHRocmVhZCwgb3IgTlVMTCAqLworCWNoYXIgICAgbmFtZVsxMF07Cit9IFNFUlZFUlNbNF07CisKK2ludCByZ3dfc2VydmVyc19pbml0KHZvaWQpCit7CisJbWVtc2V0KCZyZ3dfc2VydmVycywgMCwgc2l6ZW9mKHJnd19zZXJ2ZXJzKSk7CisJbWVtc2V0KCZTRVJWRVJTWzBdLCAwLCBzaXplb2YoU0VSVkVSUykpOworCisJcmd3X3NlcnZlcnMuYXV0aF9zZXJ2LnBvcnQgPSBodG9ucyhSQURJVVNfQVVUSF9QT1JUKTsKKwlyZ3dfc2VydmVycy5hY2N0X3NlcnYucG9ydCA9IGh0b25zKFJBRElVU19BQ0NUX1BPUlQpOworCQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCAqIHNlcnZlcl90aHJlYWQodm9pZCAqIHBhcmFtKQoreworCXN0cnVjdCBzZXJ2ZXJzX2RhdGEgKiBtZSA9IChzdHJ1Y3Qgc2VydmVyc19kYXRhICopcGFyYW07CisJCisJVFJBQ0VfRU5UUlkoIiVwIiwgcGFyYW0pOworCQorCUNIRUNLX1BBUkFNU19ETyhwYXJhbSwgcmV0dXJuIE5VTEwpOworCQorCS8qIFNldCB0aGUgdGhyZWFkIG5hbWUgKi8KKwl7CisJCWNoYXIgYnVmWzQ4XTsKKwkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgInJhZGd3LyVzIHNlcnYiLCBtZS0+bmFtZSk7CisJCWZkX2xvZ190aHJlYWRuYW1lICggYnVmICk7CisJfQorCQorCS8qIE5vdyBsb29wIG9uIHRoaXMgc29ja2V0LCBwYXJzZSBhbmQgcXVldWUgZWFjaCBtZXNzYWdlIHJlY2VpdmVkLCB1bnRpbCB0aHJlYWQgaXMgY2FuY2VsbGVkLiAqLworCXdoaWxlICgxKSB7CisJCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGZyb207CisJCWNoYXIgc2FfYnVmW3NTQV9EVU1QX1NUUkxFTl07CisJCXNvY2tsZW5fdCBmcm9tbGVuID0gc2l6ZW9mKGZyb20pOworCQlpbnQgbGVuOworCQlzdHJ1Y3Qgcmd3X2NsaWVudCAqIG5hc19pbmZvID0gTlVMTDsKKwkJdWludDE2X3QgcG9ydCA9IDA7CisJCXVuc2lnbmVkIGNoYXIgYnVmW1JBRElVU19NQVhfTVNHX0xFTl07CisJCXN0cnVjdCByZ3dfcmFkaXVzX21zZ19tZXRhICptc2cgPSBOVUxMOworCQkKKwkJcHRocmVhZF90ZXN0Y2FuY2VsKCk7CisJCQorCQkvKiByZWNlaXZlIHRoZSBuZXh0IG1lc3NhZ2UgKi8KKwkJQ0hFQ0tfU1lTX0RPKCBsZW4gPSByZWN2ZnJvbSggbWUtPnNvY2ssICZidWZbMF0sIHNpemVvZihidWYpLCAwLCAoc3RydWN0IHNvY2thZGRyICopICZmcm9tLCAmZnJvbWxlbiksICBicmVhayApOworCQkKKwkJLyogR2V0IHRoZSBwb3J0ICovCisJCXBvcnQgPSBzU0Fwb3J0KCZmcm9tKTsKKwkJaWYgKCFwb3J0KSB7CisJCQlMT0dfRSgiSW52YWxpZCBwb3J0IChmYW1pbHk6ICVkKSwgZGlzY2FyZGluZyByZWNlaXZlZCAlZCBieXRlcy4uLiIsIGZyb20uc3NfZmFtaWx5LCBsZW4pOworCQkJY29udGludWU7CisJCX0KKwkJCisJCWZkX3NhX3NkdW1wX251bWVyaWMoc2FfYnVmLCAoc1NBKikmZnJvbSk7CisJCUxPR19EKCJSQURJVVM6IFJDViAlZEIgZnJvbSAlcyIsIGxlbiwgc2FfYnVmKTsKKwkJCisJCS8qIFNlYXJjaCB0aGUgYXNzb2NpYXRlZCBjbGllbnQgZGVmaW5pdGlvbiwgaWYgYW55ICovCisJCUNIRUNLX0ZDVF9ETyggcmd3X2NsaWVudHNfc2VhcmNoKChzdHJ1Y3Qgc29ja2FkZHIgKikgJmZyb20sICZuYXNfaW5mbyksCisJCQl7CisJCQkJTE9HX0UoIkRpc2NhcmRpbmcgJWQgYnl0ZXMgcmVjZWl2ZWQgZnJvbSB1bmtub3duIElQOiAlcyIsIGxlbiwgc2FfYnVmKTsKKwkJCQljb250aW51ZTsKKwkJCX0gKTsKKwkJCQkKKwkJCisJCS8qIHBhcnNlIHRoZSBtZXNzYWdlLCBsb29wIGlmIG1lc3NhZ2UgaXMgaW52YWxpZCAqLworCQlDSEVDS19GQ1RfRE8oIHJnd19tc2dfcGFyc2UoJmJ1ZlswXSwgbGVuLCAmbXNnKSwgCisJCQl7CisJCQkJRGlhbUlkX3QgY2xpbmFtZSA9IE5VTEw7CisJCQkJc2l6ZV90IGNsaXN6OworCQkJCUNIRUNLX0ZDVF9ETyggcmd3X2NsaWVudHNfZ2V0X29yaWdpbihuYXNfaW5mbywgJmNsaW5hbWUsICZjbGlzeiwgTlVMTCwgTlVMTCksICk7CisJCQkJTE9HX0UoICJEaXNjYXJkaW5nIGludmFsaWQgUkFESVVTIG1lc3NhZ2UgZnJvbSAnJXMnIiwgY2xpbmFtZSk7CisJCQkJcmd3X2NsaWVudHNfZGlzcG9zZSgmbmFzX2luZm8pOworCQkJCWNvbnRpbnVlOyAKKwkJCX0gKTsKKwkJCisJCW1zZy0+c2Vydl90eXBlID0gbWUtPnR5cGU7CisJCW1zZy0+cG9ydCA9IHBvcnQ7CisJCQorCQlyZ3dfbXNnX2R1bXAobXNnLCAxKTsKKwkJCisJCS8qIHF1ZXVlIHRoZSBtZXNzYWdlIGZvciBhIHdvcmtlciB0aHJlYWQgKi8KKwkJQ0hFQ0tfRkNUX0RPKCByZ3dfd29ya19hZGQobXNnLCBuYXNfaW5mbyksIGJyZWFrICk7CisJCQorCQkvKiBUaGVuIHdhaXQgZm9yIG5leHQgaW5jb21pbmcgbWVzc2FnZSAqLworCX0KKwkKKwlUUkFDRV9ERUJVRyhJTkZPLCAiU2VydmVyIHRocmVhZCB0ZXJtaW5hdGVkLiIpOworCXJldHVybiBOVUxMOworfQorCisvKiBTZXQgdGhlIHNvY2tldCBvcHRpb25zIGZvciBVRFAgc29ja2V0cywgYmVmb3JlIGJpbmQgaXMgY2FsbGVkICovCitzdGF0aWMgaW50IF91ZHBfc2V0c29ja29wdChpbnQgZmFtaWx5LCBpbnQgc2spCit7CisJaW50IHJldCA9IDA7CisJaW50IG9wdDsKKwkKKwkvKiBJbiBjYXNlIG9mIHY2IGFkZHJlc3MsIGZvcmNlIHRoZSB2Nm9ubHkgb3B0aW9uLCB3ZSB1c2UgYSBkaWZmZXJlbnQgc29ja2V0IGZvciB2NCAqLworCSNpZmRlZiBJUFY2X1Y2T05MWQorCWlmIChmYW1pbHkgPT0gQUZfSU5FVDYpIHsKKwkJb3B0ID0gMTsKKwkJcmV0ID0gc2V0c29ja29wdChzaywgSVBQUk9UT19JUFY2LCBJUFY2X1Y2T05MWSwgJm9wdCwgc2l6ZW9mKG9wdCkpOworCQlpZiAocmV0ICE9IDApIHsKKwkJCXJldCA9IGVycm5vOworCQkJVFJBQ0VfREVCVUcoSU5GTywgIlVuYWJsZSB0byBzZXQgdGhlIHNvY2tldCBJUFY2X1Y2T05MWSBvcHRpb246ICVzIiwgc3RyZXJyb3IocmV0KSk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCSNlbmRpZiAvKiBJUFY2X1Y2T05MWSAqLworCQorCXJldHVybiAwOworfQorCisvKiBXZSByZXVzZSB0aGUgc2FtZSBsb2dpYyBmb3IgYWxsIDQgcG9zc2libGUgc2VydmVycyAoSVAgLyBJUHY2LCBBdXRoIC8gQWNjdCBwb3J0cykgKi8KKyNkZWZpbmUgVURQU0VSViggX3R5cGVfLCBfcG9ydHZhbF8sIF9mYW1pbHlfICkgewkJCQkJCQkJXAorCS8qIENoZWNrIHRoYXQgdGhpcyB0eXBlIC8gZmFtaWx5IGFyZSBub3QgZGlzYWJsZWQgYnkgY29uZmlndXJhdGlvbiAqLwkJCQkJXAorCWlmICggKCEgcmd3X3NlcnZlcnMuIF90eXBlXyAjIyBfc2Vydi5kaXNhYmxlZCkgCQkJCQkJCQlcCisJCSYmICggISByZ3dfc2VydmVycy4gX3R5cGVfICMjIF9zZXJ2LmlwICMjIF9mYW1pbHlfICMjIF9kaXNhYmxlZCApICkgewkJCQlcCisJCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gIyMgX2ZhbWlseV8JIHNpbiAjIyBfZmFtaWx5XyA7CQkJCQlcCisJCQkvKiBDcmVhdGUgdGhlIHNvY2tldCAqLwkJCQkJCQkJCVwKKwkJCUNIRUNLX1NZUyggU0VSVkVSU1tpZHhdLnNvY2sgPSBzb2NrZXQoQUZfSU5FVCAjIyBfZmFtaWx5XywgU09DS19ER1JBTSwgMCkgKTsJCVwKKwkJCS8qIFNldCB0aGUgcGFyYW1ldGVycyBmb3IgYmluZCBpbnRvICJzaW4iIG9yICJzaW42IiAqLwkJCQkJXAorCQkJbWVtc2V0KCYgc2luICMjIF9mYW1pbHlfLCAwLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luICMjIF9mYW1pbHlfKSk7CQkJXAorCQkJc2luICMjIF9mYW1pbHlfIC4gc2luICMjIF9mYW1pbHlfICMjIF9mYW1pbHkgPSBBRl9JTkVUICMjIF9mYW1pbHlfOwkJCVwKKwkJCXNpbiAjIyBfZmFtaWx5XyAuIHNpbiAjIyBfZmFtaWx5XyAjIyBfcG9ydCA9IHJnd19zZXJ2ZXJzLiBfdHlwZV8gIyMgX3NlcnYgLiBwb3J0OwlcCisJCQltZW1jcHkoICZzaW4gIyMgX2ZhbWlseV8gLnNpbiAjIyBfZmFtaWx5XyAjIyBfYWRkciwgCQkJCQlcCisJCQkJCSZyZ3dfc2VydmVycy4gX3R5cGVfICMjIF9zZXJ2IC4gaXAgIyMgX2ZhbWlseV8gIyMgX2VuZHBvaW50LAkJXAorCQkJCQlzaXplb2Yoc3RydWN0IGluICMjIF9mYW1pbHlfICMjIF9hZGRyKSApOwkJCQlcCisJCQkvKiBUaGlzIHNvY2tvcHQgbXVzdCBiZSBzZXQgYmVmb3JlIGJpbmRpbmcgKi8JCQkJCQlcCisJCQlUUkFDRV9ERUJVRyhBTk5PWUlORywgIlNldHRpbmcgc29ja2V0IG9wdGlvbnMuLi4iKTsJCQkJCVwKKwkJCUNIRUNLX0ZDVCggX3VkcF9zZXRzb2Nrb3B0KEFGX0lORVQgIyMgX2ZhbWlseV8sIFNFUlZFUlNbaWR4XS5zb2NrKSApOwkJCVwKKwkJCS8qIE9LLCBub3csIGJpbmQgKi8JCQkJCQkJCQlcCisJCQlUUkFDRV9ERUJVRyhBTk5PWUlORywgIkJpbmRpbmcgIiAjX3R5cGVfICIgaXAiICNfZmFtaWx5XyAiIHNlcnZlci4uLiIpOwkJCVwKKwkJCUNIRUNLX1NZUyggYmluZCggU0VSVkVSU1tpZHhdLnNvY2ssCQkJCQkJCVwKKwkJCQkJKHN0cnVjdCBzb2NrYWRkciAqKSZzaW4gIyMgX2ZhbWlseV8sCQkJCQlcCisJCQkJCXNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4gIyMgX2ZhbWlseV8pICkgKTsJCQkJXAorCQkJLyogU2F2ZSB0aGUgc2VydmVyIGluZm9ybWF0aW9uIGluIFNFUlZFUlMgc3RydWN0dXJlICovCQkJCQlcCisJCQlTRVJWRVJTW2lkeF0udHlwZSA9IF9wb3J0dmFsXzsJCQkJCQkJCVwKKwkJCVNFUlZFUlNbaWR4XS5mYW1pbHkgPSBBRl9JTkVUICMjIF9mYW1pbHlfOwkJCQkJCVwKKwkJCXNucHJpbnRmKCZTRVJWRVJTW2lkeF0ubmFtZVswXSwgc2l6ZW9mKFNFUlZFUlNbaWR4XS5uYW1lKSwgIyBfdHlwZV8gIi9pcCIgI19mYW1pbHlfKTsJXAorCQkJLyogQ3JlYXRlIHRoZSBzZXJ2ZXIgdGhyZWFkICovCQkJCQkJCQlcCisJCQlDSEVDS19QT1NJWCggcHRocmVhZF9jcmVhdGUoJlNFUlZFUlNbaWR4XS50aCwgTlVMTCwgc2VydmVyX3RocmVhZCwgJlNFUlZFUlNbaWR4XSkgKTsJXAorCQkJaWR4Kys7CQkJCQkJCQkJCQlcCisJfQkJCQkJCQkJCQkJCQlcCit9CisKK2ludCByZ3dfc2VydmVyc19zdGFydCh2b2lkKQoreworCWludCBpZHggPSAwOworCQorCVRSQUNFX0VOVFJZKCk7CisJCisJVURQU0VSViggYXV0aCwgUkdXX1BMR19UWVBFX0FVVEgsICApOworCVVEUFNFUlYoIGF1dGgsIFJHV19QTEdfVFlQRV9BVVRILCA2ICk7CisJVURQU0VSViggYWNjdCwgUkdXX1BMR19UWVBFX0FDQ1QsICApOworCVVEUFNFUlYoIGFjY3QsIFJHV19QTEdfVFlQRV9BQ0NULCA2ICk7CisJCisJVFJBQ0VfREVCVUcoRlVMTCwgIiVkIFVEUCBzZXJ2ZXJzIHN0YXJ0ZWQgc3VjY2VzZnVsbHkuIiwgaWR4KTsKKwlyZXR1cm4gMDsKK30KKworLyogU2VuZCBhIFJBRElVUyBtZXNzYWdlICovCitpbnQgcmd3X3NlcnZlcnNfc2VuZChpbnQgdHlwZSwgdW5zaWduZWQgY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuLCBzdHJ1Y3Qgc29ja2FkZHIgKnRvLCB1aW50MTZfdCB0b19wb3J0KQoreworCWludCBpZHggPSAwOworCWludCByZXQgPSAwOworCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHN0bzsKKwljaGFyIHNhX2J1ZltzU0FfRFVNUF9TVFJMRU5dOworCQorCS8qIEZpbmQgdGhlIGFwcHJvcHJpYXRlIHNvY2tldCB0byB1c2UgKG5vdCBzdXJlIGlmIGl0IGlzIGltcG9ydGFudCkgKi8KKwlmb3IgKGlkeCA9IDA7IGlkeCA8IHNpemVvZihTRVJWRVJTKSAvIHNpemVvZihTRVJWRVJTWzBdKTsgaWR4KyspIHsKKwkJaWYgKCBTRVJWRVJTW2lkeF0uc29jayAmJiAodHlwZSA9PSBTRVJWRVJTW2lkeF0udHlwZSkgJiYgKHRvLT5zYV9mYW1pbHkgPT0gU0VSVkVSU1tpZHhdLmZhbWlseSkgKSB7CisJCQlyZXQgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisJCisJaWYgKCFyZXQpIHsKKwkJTE9HX0UoICJUcnlpbmcgdG8gc2VuZCBhIG1lc3NhZ2UgZnJvbSBhIGRpc2FibGVkIHNlcnZlcjogJXMgLyAlcyIsIAorCQkJCSh0eXBlID09IFJHV19QTEdfVFlQRV9BVVRIKSA/ICJBdXRoIiA6ICJBY2N0IiwKKwkJCQkodG8tPnNhX2ZhbWlseSA9PSBBRl9JTkVUKSAgPyAiSVAgKHY0KSIgOiAiSVB2NiIpOworCQlyZXR1cm4gRUlOVkFMOworCX0KKwkKKwkvKiBQcmVwYXJlIHRoZSBkZXN0aW5hdGlvbiBpbmZvICovCisJbWVtc2V0KCZzdG8sIDAsIHNpemVvZihzdG8pKTsKKwlpZiAodG8tPnNhX2ZhbWlseSA9PSBBRl9JTkVUKSB7CisJCW1lbWNweSgmc3RvLCB0bywgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpOworCQkoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSZzdG8pLT5zaW5fcG9ydCA9IHRvX3BvcnQ7CisJfSBlbHNlIHsKKwkJbWVtY3B5KCZzdG8sIHRvLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNikpOworCQkoKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikmc3RvKS0+c2luNl9wb3J0ID0gdG9fcG9ydDsKKwl9CisJCisJZmRfc2Ffc2R1bXBfbnVtZXJpYyhzYV9idWYsIChzU0EqKSZzdG8pOworCUxPR19EKCJSQURJVVM6IFNORCAlemRCICAgdG8gJXMiLCBidWZsZW4sIHNhX2J1Zik7CisJCisJLyogU2VuZCAqLworCXJldCA9IHNlbmR0byhTRVJWRVJTW2lkeF0uc29jaywgYnVmLCBidWZsZW4sIDAsIChzdHJ1Y3Qgc29ja2FkZHIgKikmc3RvLCBzU0FsZW4oJnN0bykpOworCWlmIChyZXQgPCAwKSB7CisJCXJldCA9IGVycm5vOworCQlUUkFDRV9ERUJVRyhJTkZPLCAiQW4gZXJyb3IgcHJldmVudGVkIHNlbmRpbmcgb2YgYSBSQURJVVMgbWVzc2FnZTogJXMiLCBzdHJlcnJvcihyZXQpKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJaWYgKHJldCAhPSBidWZsZW4pIHsKKwkJVFJBQ0VfREVCVUcoSU5GTywgIkluY29tcGxldGUgc2VuZDogJWQgYnl0ZXMgLyAlemQiLCByZXQsIGJ1Zmxlbik7CisJCXJldHVybiBFQUdBSU47CisJfQorCQorCS8qIERvbmUgOikgKi8KKwlyZXR1cm4gMDsKK30KKwordm9pZCByZ3dfc2VydmVyc19maW5pKHZvaWQpCit7CisJaW50IGlkeCA9IDA7CisJCisJZm9yIChpZHggPSAwOyBpZHggPCBzaXplb2YoU0VSVkVSUykgLyBzaXplb2YoU0VSVkVSU1swXSk7IGlkeCsrKSB7CisJCWlmIChTRVJWRVJTW2lkeF0uc29jayA9PSAwKQorCQkJYnJlYWs7CisJCQorCQlDSEVDS19GQ1RfRE8oIGZkX3Rocl90ZXJtKCZTRVJWRVJTW2lkeF0udGgpLCAvKiBjb250aW51ZSAqLyApOworCQljbG9zZShTRVJWRVJTW2lkeF0uc29jayk7CisJCVNFUlZFUlNbaWR4XS5zb2NrID0gMDsKKwl9CisJCit9CisKKwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9hcHBfcmFkZ3cvcmd3X3dvcmtlci5jIGIvZXh0ZW5zaW9ucy9hcHBfcmFkZ3cvcmd3X3dvcmtlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1Y2IxNDYKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2FwcF9yYWRndy9yZ3dfd29ya2VyLmMKQEAgLTAsMCArMSwzNDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDEzLCBXSURFIFByb2plY3QgYW5kIE5JQ1QJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFdJREUgUHJvamVjdCBvciBOSUNUIG5vciB0aGUgCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgV0lERSBQcm9qZWN0IGFuZCAJCQkJCQkgKgorKiAgIE5JQ1QuCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogTWFuYWdlIGluY29taW5nIFJBRElVUyBtZXNzYWdlcy4gKi8KKworI2luY2x1ZGUgInJndy5oIgorCisvKiBIb3cgbWFueSB0aHJlYWRzIHRvIGhhbmRsZSBtZXNzYWdlcyBpbiBwYXJhbGxlbCA/ICovCisjZGVmaW5lIE5CX1dPUktFUlMJMgorCitzdGF0aWMgcHRocmVhZF90IHdvcmtlcnNbTkJfV09SS0VSU107CitzdGF0aWMgc3RydWN0IGZpZm8gKiB3b3JrX3N0YWNrID0gTlVMTDsKKworLyogRGF0YSB0aGF0IGlzIHN0YWNrZWQgKi8KK3N0cnVjdCB3b3JrX2l0ZW0geworCXN0cnVjdCByZ3dfcmFkaXVzX21zZ19tZXRhICogbXNnOworCXN0cnVjdCByZ3dfY2xpZW50IAkgICAqIGNsaTsKK307CisKKy8qIERhdGEgc3RvcmVkIGluIGZyZWVEaWFtZXRlciB3aGlsZSBwZW5kaW5nIERpYW1ldGVyIGFuc3dlciAqLworc3RydWN0IHBlbmRpbmdfYW5zd2VyIHsKKwlzdHJ1Y3Qgcmd3X3JhZGl1c19tc2dfbWV0YSAqIHJhZDsgIC8qIHRoZSBSQURJVVMgbWVzc2FnZSB0aGF0IHdhcyByZWNlaXZlZCBhbmQgdHJhbnNsYXRlZCAqLworCXN0cnVjdCByZ3dfY2xpZW50ICAgICAgICAgICogY2xpOyAgLyogdGhlIGNsaWVudCBpdCB3YXMgcmVjZWl2ZWQgZnJvbSAqLworfTsKKworLyogQ2FsbGJhY2sgd2hlbiBhIERpYW1ldGVyIGFuc3dlciBpcyByZWNlaXZlZCAqLworc3RhdGljIHZvaWQgcmVjZWl2ZV9kaWFtX2Fuc3dlcih2b2lkICogcGFiYWNrLCBzdHJ1Y3QgbXNnICoqYW5zKTsKKworLyogV29ya2VyIHRocmVhZCwgcHJvY2Vzc2luZyBpbmNvbWluZyBSQURJVVMgbWVzc2FnZXMgKGFmdGVyIHBhcnNpbmcpICovCitzdGF0aWMgdm9pZCAqIHdvcmtfdGgodm9pZCAqIGFyZykKK3sKKwlUUkFDRV9FTlRSWSgiJXAiLCBhcmcpOworCQorCS8qIFNldCB0aGUgdGhyZWFkIG5hbWUgKi8KKwl7CisJCWNoYXIgYnVmWzQ4XTsKKwkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgInJhZGd3L3dvcmtlciAjJWxkIiwgKGxvbmcpYXJnKTsKKwkJZmRfbG9nX3RocmVhZG5hbWUgKCBidWYgKTsKKwl9CisJCisJd2hpbGUgKDEpIHsgLyogVGhlIHRocmVhZCB3aWxsIGJlIGNhbmNlbGxlZCAqLworCQkKKwkJc3RydWN0IHJnd19yYWRpdXNfbXNnX21ldGEgKiBtc2c7CisJCXN0cnVjdCByZ3dfY2xpZW50ICogY2xpOworCQlzdHJ1Y3QgbXNnICogZGlhbV9tc2c7CisJCWludCBwYiwgYTsKKwkJc3RydWN0IHBlbmRpbmdfYW5zd2VyICogcGE7CisJCisJCS8qIEdldCB0aGUgbmV4dCBpbmNvbWluZyBSQURJVVMgbWVzc2FnZSAqLworCQl7CisJCQlzdHJ1Y3Qgd29ya19pdGVtICogd2kgPSBOVUxMOworCQkJCisJCQlDSEVDS19GQ1RfRE8oIGZkX2ZpZm9fZ2V0KHdvcmtfc3RhY2ssICZ3aSksIGJyZWFrICk7CisKKwkJCW1zZyA9IHdpLT5tc2c7CisJCQljbGkgPSB3aS0+Y2xpOworCQkJZnJlZSh3aSk7CisJCX0KKwkJCisJCVRSQUNFX0RFQlVHKEFOTk9ZSU5HLCAiUHJvY2Vzc2luZyBuZXh0IFJBRElVUyBtZXNzYWdlOiAlcCByZWNlaXZlZCBvbiBjbGllbnQ6ICVwIiwgbXNnLCBjbGkpOworCQorCQkvKiBwcm9jZXNzIHRoZSBkYXRhICovCisJCQorCQkvKiBDaGVjayBhdXRoZW50aWNhdG9yLCBpZiBhbnkgKi8KKwkJQ0hFQ0tfRkNUX0RPKCByZ3dfY2xpZW50c19hdXRoX2NoZWNrKG1zZywgY2xpLCBOVUxMKSwKKwkJCXsKKwkJCQkvKiBBbiBlcnJvciBvY2N1cnJlZCwgZGlzY2FyZCBtZXNzYWdlICovCisJCQkJcmd3X21zZ19mcmVlKCZtc2cpOworCQkJCXJnd19jbGllbnRzX2Rpc3Bvc2UoJmNsaSk7CisJCQkJY29udGludWU7CisJCQl9ICApOworCQkKKwkJLyogQ2hlY2sgZHVwbGljYXRlICovCisJCUNIRUNLX0ZDVF9ETyggcmd3X2NsaWVudHNfY2hlY2tfZHVwKCZtc2csIGNsaSksCisJCQl7CisJCQkJLyogQW4gZXJyb3Igb2NjdXJyZWQsIGRpc2NhcmQgbWVzc2FnZSAqLworCQkJCXJnd19tc2dfZnJlZSgmbXNnKTsKKwkJCQlyZ3dfY2xpZW50c19kaXNwb3NlKCZjbGkpOworCQkJCWNvbnRpbnVlOworCQkJfSAgKTsKKwkJaWYgKG1zZyA9PSBOVUxMKSB7CisJCQlyZ3dfY2xpZW50c19kaXNwb3NlKCZjbGkpOworCQkJY29udGludWU7IC8qIHRoZSBtZXNzYWdlIHdhcyBhIGR1cGxpY2F0ZSAqLworCQl9CisJCQorCQlkaWFtX21zZyA9IE5VTEw7CisJCS8qIE5vdGU6IGFmdGVyIHRoaXMgcG9pbnQsIHRoZSByYWRpdXMgbWVzc2FnZSBidWZmZXIgbWF5IG5vdCBiZSBjb25zaXN0ZW50IHdpdGggdGhlIGFycmF5IG9mIGF0dHJpYnV0ZXMgYW55bW9yZS4gKi8KKwkKKwkJLyogQ2hlY2sgdGhhdCBJUCBpcyBjb2hlcmVudCB3aXRoIHRoZSBpZGVudGl0eSBpbiB0aGUgbWVzc2FnZSwgYW5kIGNyZWF0ZSBhbiBlbXB0eSBtZXNzYWdlIHdpdGggb25seSBPcmlnaW4gaW5mb3JtYXRpb24gKi8KKwkJQ0hFQ0tfRkNUX0RPKCByZ3dfY2xpZW50c19jcmVhdGVfb3JpZ2luKG1zZywgY2xpLCAmZGlhbV9tc2cpLAorCQkJeworCQkJCS8qIEFuIGVycm9yIG9jY3VycmVkLCBkaXNjYXJkIG1lc3NhZ2UgKi8KKwkJCQlpZiAoZGlhbV9tc2cpIHsKKwkJCQkJQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfZnJlZShkaWFtX21zZyksICk7CisJCQkJfQorCQkJCXJnd19tc2dfZnJlZSgmbXNnKTsKKwkJCQlyZ3dfY2xpZW50c19kaXNwb3NlKCZjbGkpOworCQkJCWNvbnRpbnVlOworCQkJfSAgKTsKKwkJCisJCS8qIFBhc3MgdGhlIG1lc3NhZ2UgdG8gdGhlIGxpc3Qgb2YgcmVnaXN0ZXJlZCBwbHVnaW5zICovCisJCUNIRUNLX0ZDVF9ETyggcmd3X3BsZ19sb29wX3JlcSgmbXNnLCAmZGlhbV9tc2csIGNsaSksIAorCQkJeworCQkJCS8qIEFuIGVycm9yIG9jY3VycmVkLCBkaXNjYXJkIG1lc3NhZ2UgKi8KKwkJCQlpZiAoZGlhbV9tc2cpIHsKKwkJCQkJQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfZnJlZShkaWFtX21zZyksICk7CisJCQkJCWRpYW1fbXNnID0gTlVMTDsKKwkJCQl9CisJCQkJcmd3X21zZ19mcmVlKCZtc2cpOworCQkJCXJnd19jbGllbnRzX2Rpc3Bvc2UoJmNsaSk7CisJCQkJY29udGludWU7CisJCQl9ICApOworCQlpZiAobXNnID09IE5VTEwpIHsgLyogRXJyb3Igb3IgUkFESVVTIGFuc3dlciBsb2NhbGx5IGdlbmVyYXRlZCAqLworCQkJcmd3X2NsaWVudHNfZGlzcG9zZSgmY2xpKTsKKwkJCWlmIChkaWFtX21zZykgeworCQkJCUNIRUNLX0ZDVF9ETyggZmRfbXNnX2ZyZWUoZGlhbV9tc2cpLCApOworCQkJCWRpYW1fbXNnID0gTlVMTDsKKwkJCX0KKwkJCWNvbnRpbnVlOyAvKiB0aGUgbWVzc2FnZSB3YXMgaGFuZGxlZCBhbHJlYWR5ICovCisJCX0KKwkJCisJCXBiID0gMDsKKwkJCisJCS8qIENoZWNrIHRoZSBjcmVhdGVkIERpYW1ldGVyIG1lc3NhZ2UgLS0gaXQgd2lsbCBiZSBpbnZhbGlkIGlmIG5vIGNhbGxiYWNrIGhhcyBoYW5kbGVkIHRoZSBSQURJVVMgbWVzc2FnZSAqLworCQlpZiAoKGRpYW1fbXNnID09IE5VTEwpIHx8ICggZmRfbXNnX3BhcnNlX3J1bGVzKGRpYW1fbXNnLCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIE5VTEwpICkgKSB7CisJCQlmZF9sb2dfZGVidWcoIltyYWRnd10gTm8gb3IgaW52YWxpZCBEaWFtZXRlciBtZXNzYWdlIHdhcyBnZW5lcmF0ZWQgYWZ0ZXIgcHJvY2Vzc2luZyB0aGUgUkFESVVTIGNvbW1hbmQgJWhoZCAoJXMpLiIKKwkJCQkJIiBJdCBtYXkgaW5kaWNhdGUgYSBnYXRld2F5IGNvbmZpZ3VyYXRpb24gcHJvYmxlbSwgb3IgaW1wbGVtZW50YXRpb24gaXNzdWUgaW4gYSBwbHVnaW4uIiwKKwkJCQkJbXNnLT5yYWRpdXMuaGRyLT5jb2RlLCByZ3dfbXNnX2NvZGVfc3RyKG1zZy0+cmFkaXVzLmhkci0+Y29kZSkpOworCQkJLyogV2Ugc2hvdWxkIGFsc28gZHVtcCB0aGUgY29uZmxpY3RpbmcgcnVsZSBoZXJlIHRvIGhlbHAgZGVidWc/ICovCisJCQlwYisrOworCQl9CisJCQorCQkvKiBDaGVjayBpZiB0aGUgZnVsbCBjb250ZW50IG9mIHRoZSBSQURJVVMgbWVzc2FnZSB3YXMgaGFuZGxlZCAqLworCQlmb3IgKGEgPSAwOyBhIDwgbXNnLT5yYWRpdXMuYXR0cl91c2VkOyBhKyspIHsKKwkJCXN0cnVjdCByYWRpdXNfYXR0cl9oZHIgKmF0dHIgPSAoc3RydWN0IHJhZGl1c19hdHRyX2hkciAqKShtc2ctPnJhZGl1cy5idWYgKyBtc2ctPnJhZGl1cy5hdHRyX3Bvc1thXSk7CisJCQlwYisrOworCQkJZmRfbG9nX2RlYnVnKCJbcmFkZ3ddIE5vIHBsdWdpbiBhdmFpbGFibGUgdG8gaGFuZGxlIGF0dHJpYnV0ZSAlaGhkICglcykgaW4gY29tbWFuZCAlaGhkICglcykhIFRyYW5zbGF0aW9uIGFib3J0ZWQuIiwKKwkJCQkJYXR0ci0+dHlwZSwgcmd3X21zZ19hdHRydHlwZV9zdHIoYXR0ci0+dHlwZSksCisJCQkJCW1zZy0+cmFkaXVzLmhkci0+Y29kZSwgcmd3X21zZ19jb2RlX3N0cihtc2ctPnJhZGl1cy5oZHItPmNvZGUpKTsKKwkJfQorCQkKKwkJaWYgKHBiKSB7CisJCQkvKiBTb21ldGhpbmcgd2VudCB3cm9uZyBkdXJpbmcgdGhlIGNvbnZlcnNpb24gKi8KKwkJCWlmIChkaWFtX21zZykgeworCQkJCUNIRUNLX0ZDVF9ETyggZmRfbXNnX2ZyZWUoZGlhbV9tc2cpLCApOworCQkJCWRpYW1fbXNnID0gTlVMTDsKKwkJCX0KKwkJCQorCQkJcmd3X21zZ19mcmVlKCZtc2cpOworCQkJcmd3X2NsaWVudHNfZGlzcG9zZSgmY2xpKTsKKwkJCQorCQkJVFJBQ0VfREVCVUcoSU5GTywgIiVkIHByb2JsZW0ocykgb2NjdXJyZWQgd2hpbGUgdHJhbnNsYXRpbmcgYSBSQURJVVMgbWVzc2FnZSwgZGF0YSBkaXNjYXJkZWQuIiwgcGIpOworCQkJY29udGludWU7CisJCX0KKwkJCisJCS8qIFNlbmQgdGhlIERpYW1ldGVyIG1lc3NhZ2UgYW5kIHJlZ2lzdGVyIGZvciByZWNlaXZpbmcgdGhlIGFuc3dlciAqLworCQlDSEVDS19NQUxMT0NfRE8oIHBhID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgcGVuZGluZ19hbnN3ZXIpKSwgYnJlYWsgKTsKKwkJbWVtc2V0KHBhLCAwLCBzaXplb2YoKnBhKSk7CisJCXBhLT5yYWQgPSBtc2c7CisJCXBhLT5jbGkgPSBjbGk7CisJCQorCQlDSEVDS19GQ1RfRE8oIGZkX21zZ19zZW5kKCAmZGlhbV9tc2csIHJlY2VpdmVfZGlhbV9hbnN3ZXIsIHBhKSwgCisJCQl7CisJCQkJLyogSWYgYW4gZXJyb3Igb2NjdXJzLCBsb2cgYW5kIGRlc3Ryb3kgdGhlIGRhdGEgKi8KKwkJCQlmZF9sb2dfZGVidWcoIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHNlbmRpbmcgRGlhbWV0ZXIgbWVzc2FnZSwgcGxlYXNlIHR1cm4gRGVidWcgb24gZm9yIGRldGFpbC4iKTsKKworCQkJCWlmIChkaWFtX21zZykgeworCQkJCQlDSEVDS19GQ1RfRE8oIGZkX21zZ19mcmVlKGRpYW1fbXNnKSwgKTsKKwkJCQkJZGlhbV9tc2cgPSBOVUxMOworCQkJCX0KKworCQkJCXJnd19tc2dfZnJlZSgmbXNnKTsKKwkJCQlyZ3dfY2xpZW50c19kaXNwb3NlKCZjbGkpOworCQkJCQorCQkJCWZyZWUocGEpOworCQkJCQorCQkJCWNvbnRpbnVlOworCQkJfSApOworCQkKKwkJLyogRG9uZSEgKi8KKwl9CisJCisJVFJBQ0VfREVCVUcoSU5GTywgIlRocmVhZCB0ZXJtaW5hdGVkISIpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCByZWNlaXZlX2RpYW1fYW5zd2VyKHZvaWQgKiBwYWJhY2ssIHN0cnVjdCBtc2cgKiphbnMpCit7CisJc3RydWN0IHBlbmRpbmdfYW5zd2VyICogcGEgPSAoc3RydWN0IHBlbmRpbmdfYW5zd2VyICopcGFiYWNrOworCXN0cnVjdCByYWRpdXNfbXNnICogcmFkX2FuczsKKwlzdHJ1Y3QgYXZwICphdnA7CisJc3RydWN0IGF2cF9oZHIgICphaGRyOworCWludCBwYiA9IDA7CisJCisJVFJBQ0VfRU5UUlkoIiVwICVwIiwgcGEsIGFucyk7CisJQ0hFQ0tfUEFSQU1TX0RPKCBwYSAmJiBhbnMsIHJldHVybiApOworCQorCS8qIENyZWF0ZSBhbiBlbXB0eSBSQURJVVMgYW5zd2VyIG1lc3NhZ2UgKi8KKwlDSEVDS19NQUxMT0NfRE8oIHJhZF9hbnMgPSByYWRpdXNfbXNnX25ldygwLCBwYS0+cmFkLT5yYWRpdXMuaGRyLT5pZGVudGlmaWVyKSwgZ290byBvdXQgKTsKKwkKKwkvKiBQYXNzIHRoZSBEaWFtZXRlciBhbnN3ZXIgdG8gdGhlIHNhbWUgZXh0ZW5zaW9ucyBhcyB0aGUgcmVxdWVzdCAqLworCUNIRUNLX0ZDVF9ETyggcmd3X3BsZ19sb29wX2FucyhwYS0+cmFkLCBhbnMsICZyYWRfYW5zLCBwYS0+Y2xpKSwgZ290byBvdXQgKTsKKworCWlmICgqYW5zICE9IE5VTEwpIHsKKworCQkvKiBOb3cgY2hlY2sgd2hhdCBBVlBzIHJlbWFpbiBpbiB0aGUgZGlhbWV0ZXIgYW5zd2VyLiBJZiBBVlBzIHdpdGggdGhlICdNJyBmbGFnIGFyZSBoZXJlLCB3ZSBoYXZlIGEgcHJvYmxlbS4uLiAqLworCQlDSEVDS19GQ1RfRE8oIGZkX21zZ19icm93c2UoKmFucywgTVNHX0JSV19GSVJTVF9DSElMRCwgJmF2cCwgTlVMTCksIHsgYXZwID0gTlVMTDsgcGIrKzsgfSApOworCQl3aGlsZSAoYXZwKSB7CisJCQlDSEVDS19GQ1RfRE8oIGZkX21zZ19hdnBfaGRyICggYXZwLCAmYWhkciApLCB7IHBiKys7IGNvbnRpbnVlOyB9ICk7CisJCQlpZiAoYWhkci0+YXZwX2ZsYWdzICYgQVZQX0ZMQUdfTUFOREFUT1JZKSB7CisJCQkJaWYgKGFoZHItPmF2cF9mbGFncyAmIEFWUF9GTEFHX1ZFTkRPUikgeworCQkJCQlUUkFDRV9ERUJVRyhGVUxMLCAiUmVtYWluaW5nIE1hbmRhdG9yeSBWZW5kb3IgQVZQLCBjb2RlICVkIiwgYWhkci0+YXZwX2NvZGUpOworCQkJCQlwYisrOworCQkJCX0gZWxzZSB7CisJCQkJCXN3aXRjaCAoYWhkci0+YXZwX2NvZGUpIHsKKwkJCQkJCS8qIEEgZmV3IEFWUHMgY2FuIGJlIHNhZmVseSBpZ25vcmVkIGhlcmU6ICovCisJCQkJCQljYXNlIERJQU1fQVRUUl9TRVNTSU9OX0lEOgorCQkJCQkJY2FzZSBESUFNX0FUVFJfUk9VVEVfUkVDT1JEOgorCQkJCQkJY2FzZSBESUFNX0FUVFJfUFJPWFlfSU5GTzoKKworCisJCQkJCQkJLyoganVzdCBpZ25vcmUgKi8KKwkJCQkJCQlicmVhazsKKworCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQlMT0dfRCgiUmVtYWluaW5nIE1hbmRhdG9yeSBBVlAsIGNvZGUgJWQiLCBhaGRyLT5hdnBfY29kZSk7CisJCQkJCQkJcGIrKzsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCUNIRUNLX0ZDVF9ETyggZmRfbXNnX2Jyb3dzZShhdnAsIE1TR19CUldfTkVYVCwgJmF2cCwgTlVMTCksIHsgcGIrKzsgYnJlYWs7IH0gKTsKKwkJfQorCisJCWlmIChwYikgeworCQkJVFJBQ0VfREVCVUcoSU5GTywgIltyYWRnd10gV0FSTklORzogJWQgbWFuZGF0b3J5IEFWUCBpbiB0aGUgRGlhbWV0ZXIgYW5zd2VyIGhhdmUgbm90IGJlZW4gdHJhbnNsYXRlZCB0byBSQURJVVMhIFBsZWFzZSB1c2UgZGVidWcucmd3eCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iLCBwYik7CisJCX0KKwl9CisJCisJCitvdXQ6CisJLyogTm93IHRyeSBhbmQgc2VuZCB0aGUgUkFESVVTIGFuc3dlciAqLworCWlmIChyYWRfYW5zKSB7CisJCUNIRUNLX0ZDVF9ETyggcmd3X2NsaWVudF9maW5pc2hfc2VuZCgmcmFkX2FucywgcGEtPnJhZCwgcGEtPmNsaSksICk7CQorCX0gZWxzZSB7CisJCS8qIFJlbW92ZSB0aGUgcmVxdWVzdCBmcm9tIHRoZSBkdXBsaWNhdGUgY2FjaGUgKi8KKwkJQ0hFQ0tfRkNUX0RPKCByZ3dfY2xpZW50X2ZpbmlzaF9ub3NlbmQocGEtPnJhZCwgcGEtPmNsaSksICk7CisJfQorCisJLyogQ2xlYXIgdGhlIERpYW1ldGVyIG1lc3NhZ2UgKi8KKwlpZiAoKmFucykgeworCQlDSEVDS19GQ1RfRE8oIGZkX21zZ19mcmVlKCphbnMpLCAgKTsKKwkJKmFucyA9IE5VTEw7CisJfQorCQorCS8qIENsZWFyIHRoZSBSQURJVVMgcmVxdWVzdCAqLworCWlmIChwYS0+cmFkKSB7CisJCXJnd19tc2dfZnJlZSgmcGEtPnJhZCk7CisJfQorCQorCS8qIFJlbGVhc2UgcmVmZXJlbmNlIG9uIHRoZSBjbGllbnQgKi8KKwlyZ3dfY2xpZW50c19kaXNwb3NlKCZwYS0+Y2xpKTsKKwkKKwkvKiBDbGVhciB0aGUgYW5zd2VyIGRhdGEgKi8KKwlmcmVlKHBhKTsKKwkKKwkvKiBGaW5pc2hlZCAqLworCXJldHVybjsKK30KKworaW50IHJnd193b3JrX3N0YXJ0KHZvaWQpCit7CisJbG9uZyBpOworCVRSQUNFX0VOVFJZKCk7CisJCisJbWVtc2V0KHdvcmtlcnMsIDAsIHNpemVvZih3b3JrZXJzKSk7CisJCisJQ0hFQ0tfRkNUKCBmZF9maWZvX25ldyAoICZ3b3JrX3N0YWNrLCAzMCApICk7CisJCisJLyogQ3JlYXRlIHRoZSB3b3JrZXIgdGhyZWFkKHMpICovCisJZm9yIChpID0gMDsgaSA8IE5CX1dPUktFUlM7IGkrKykgeworCQlDSEVDS19QT1NJWCggcHRocmVhZF9jcmVhdGUoJndvcmtlcnNbaV0sIE5VTEwsIHdvcmtfdGgsICh2b2lkICopaSkgKTsKKwl9CisJCisJcmV0dXJuIDA7Cit9CisKK2ludCByZ3dfd29ya19hZGQoc3RydWN0IHJnd19yYWRpdXNfbXNnX21ldGEgKiBtc2csIHN0cnVjdCByZ3dfY2xpZW50ICogY2xpZW50KQoreworCXN0cnVjdCB3b3JrX2l0ZW0gKiBuZXc7CisJCisJQ0hFQ0tfTUFMTE9DKCBuZXcgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCB3b3JrX2l0ZW0pKSApOworCW1lbXNldChuZXcsIDAsIHNpemVvZihzdHJ1Y3Qgd29ya19pdGVtKSk7CisJCisJbmV3LT5tc2cgPSBtc2c7CisJbmV3LT5jbGkgPSBjbGllbnQ7CisJCisJQ0hFQ0tfRkNUKCBmZF9maWZvX3Bvc3Qod29ya19zdGFjaywgJm5ldykgKTsKKwkKKwlyZXR1cm4gMDsKK30KKwordm9pZCByZ3dfd29ya19maW5pKHZvaWQpCit7CisJaW50IGk7CisJVFJBQ0VfRU5UUlkoKTsKKwkKKwlmb3IgKGkgPSAwOyBpIDwgTkJfV09SS0VSUzsgaSsrKSB7CisJCWZkX3Rocl90ZXJtKCZ3b3JrZXJzW2ldKTsKKwl9CisJCisJVE9ETygiRW1wdHkgdGhlIHN0YWNrLCB3aGF0IHRvIGRvIGFib3V0IHRoZSBSQURJVVMgbWVzc2FnZXM/Iik7CisJCisJcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9hcHBfcmFkZ3cvcmd3eF9hY2N0LmMgYi9leHRlbnNpb25zL2FwcF9yYWRndy9yZ3d4X2FjY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWYxNDgwCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9hcHBfcmFkZ3cvcmd3eF9hY2N0LmMKQEAgLTAsMCArMSwxNDYzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxMywgV0lERSBQcm9qZWN0IGFuZCBOSUNUCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBXSURFIFByb2plY3Qgb3IgTklDVCBub3IgdGhlIAkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFdJREUgUHJvamVjdCBhbmQgCQkJCQkJICoKKyogICBOSUNULgkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFJBRElVUyBBY2NvdW50aW5nLVJlcXVlc3QgbWVzc2FnZXMgdHJhbnNsYXRpb24gcGx1Z2luICovCisKKyNpbmNsdWRlICJyZ3dfY29tbW9uLmgiCisKKworLyogT3RoZXIgY29uc3RhbnRzIHdlIHVzZSAqLworI2RlZmluZSBBSV9BQ0NUCQkJMwkvKiBEaWFtZXRlciBCYXNlIEFjY291bnRpbmcgYXBwbGljYXRpb24gKi8KKyNkZWZpbmUgQ0NfQUMJCQkyNzEJLyogQUNSL0FDQSAqLworI2RlZmluZSBBQ1ZfQVJUX1NUQVJUX1JFQ09SRAkJMgkvKiBTVEFSVF9SRUNPUkQgKi8KKyNkZWZpbmUgQUNWX0FSVF9JTlRFUklNX1JFQ09SRAkJMwkvKiBJTlRFUklNX1JFQ09SRCAqLworI2RlZmluZSBBQ1ZfQVJUX1NUT1BfUkVDT1JECQk0CS8qIFNUT1BfUkVDT1JEICovCisjZGVmaW5lIEFDVl9BUlRfQVVUSE9SSVpFX0FVVEhFTlRJQ0FURQkzCS8qIEFVVEhPUklaRV9BVVRIRU5USUNBVEUgKi8KKworCisvKiBUaGUgc3RhdGUgd2Uga2VlcCBmb3IgdGhpcyBwbHVnaW4gKi8KK3N0cnVjdCByZ3dwX2NvbmZpZyB7CisJc3RydWN0IHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogQWNjb3VudGluZ19SZWNvcmRfTnVtYmVyOwkvKiBBY2NvdW50aW5nLVJlY29yZC1OdW1iZXIgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogQWNjb3VudGluZ19SZWNvcmRfVHlwZTsJLyogQWNjb3VudGluZy1SZWNvcmQtVHlwZSAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBBY2N0X0FwcGxpY2F0aW9uX0lkOwkvKiBBY2N0LUFwcGxpY2F0aW9uLUlkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIEFjY3RfRGVsYXlfVGltZTsJCS8qIEFjY3QtRGVsYXktVGltZSAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBBY2NvdW50aW5nX0lucHV0X09jdGV0czsJLyogQWNjb3VudGluZy1JbnB1dC1PY3RldHMgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogQWNjb3VudGluZ19PdXRwdXRfT2N0ZXRzOwkvKiBBY2NvdW50aW5nLU91dHB1dC1PY3RldHMgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogQWNjb3VudGluZ19JbnB1dF9QYWNrZXRzOwkvKiBBY2NvdW50aW5nLUlucHV0LVBhY2tldHMgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogQWNjb3VudGluZ19PdXRwdXRfUGFja2V0czsJLyogQWNjb3VudGluZy1PdXRwdXQtUGFja2V0cyAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBBY2N0X0xpbmtfQ291bnQ7CQkvKiBBY2N0LUxpbmstQ291bnQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogQWNjdF9BdXRoZW50aWM7CQkvKiBBY2N0LUF1dGhlbnRpYyAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBBY2N0X011bHRpX1Nlc3Npb25fSWQ7CS8qIEFjY3QtTXVsdGktU2Vzc2lvbi1JZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBBY2N0X1Nlc3Npb25fSWQ7CQkvKiBBY2N0LVNlc3Npb24tSWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogQWNjdF9TZXNzaW9uX1RpbWU7CQkvKiBBY2N0LVNlc3Npb24tVGltZSAqLworCQkKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogQVJBUF9QYXNzd29yZDsJCS8qIEFSQVAtUGFzc3dvcmQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogQVJBUF9TZWN1cml0eTsJCS8qIEFSQVAtU2VjdXJpdHkgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogQVJBUF9TZWN1cml0eV9EYXRhOwkvKiBBUkFQLVNlY3VyaXR5LURhdGEgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogQXV0aF9BcHBsaWNhdGlvbl9JZDsJLyogQXV0aC1BcHBsaWNhdGlvbi1JZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBBdXRoX1JlcXVlc3RfVHlwZTsJCS8qIEF1dGgtUmVxdWVzdC1UeXBlICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIEF1dGhvcml6YXRpb25fTGlmZXRpbWU7CS8qIEF1dGhvcml6YXRpb24tTGlmZXRpbWUgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogQ2FsbGJhY2tfTnVtYmVyOwkJLyogQ2FsbGJhY2stTnVtYmVyICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIENhbGxiYWNrX0lkOwkJLyogQ2FsbGJhY2stSWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogQ2FsbGVkX1N0YXRpb25fSWQ7CQkvKiBDYWxsZWQtU3RhdGlvbi1JZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBDYWxsaW5nX1N0YXRpb25fSWQ7CS8qIENhbGxpbmctU3RhdGlvbi1JZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBDbGFzczsJCQkvKiBDbGFzcyAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBDSEFQX0FsZ29yaXRobTsJCS8qIENIQVAtQWxnb3JpdGhtICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIENIQVBfQXV0aDsJCQkvKiBDSEFQLUF1dGggKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogQ0hBUF9DaGFsbGVuZ2U7CQkvKiBDSEFQLUNoYWxsZW5nZSAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBDSEFQX0lkZW50OwkJLyogQ0hBUC1JZGVudCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBDSEFQX1Jlc3BvbnNlOwkJLyogQ0hBUC1SZXNwb25zZSAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBDb25uZWN0X0luZm87CQkvKiBDb25uZWN0LUluZm8gKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogRGVzdGluYXRpb25fSG9zdDsJCS8qIERlc3RpbmF0aW9uLUhvc3QgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogRGVzdGluYXRpb25fUmVhbG07CQkvKiBEZXN0aW5hdGlvbi1SZWFsbSAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBFQVBfUGF5bG9hZDsJCS8qIEVBUC1QYXlsb2FkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIEVycm9yX01lc3NhZ2U7CQkvKiBFcnJvci1NZXNzYWdlICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIEVycm9yX1JlcG9ydGluZ19Ib3N0OwkvKiBFcnJvci1SZXBvcnRpbmctSG9zdCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBFdmVudF9UaW1lc3RhbXA7CQkvKiBFdmVudC1UaW1lc3RhbXAgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogRmFpbGVkX0FWUDsJCS8qIEZhaWxlZC1BVlAgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogRnJhbWVkX0FwcGxlVGFsa19MaW5rOwkvKiBGcmFtZWQtQXBwbGVUYWxrLUxpbmsgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogRnJhbWVkX0FwcGxlVGFsa19OZXR3b3JrOwkvKiBGcmFtZWQtQXBwbGVUYWxrLU5ldHdvcmsgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogRnJhbWVkX0FwcGxlVGFsa19ab25lOwkvKiBGcmFtZWQtQXBwbGVUYWxrLVpvbmUgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogRnJhbWVkX0NvbXByZXNzaW9uOwkvKiBGcmFtZWQtQ29tcHJlc3Npb24gKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogRnJhbWVkX0lQX0FkZHJlc3M7CQkvKiBGcmFtZWQtSVAtQWRkcmVzcyAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBGcmFtZWRfSVBfTmV0bWFzazsJCS8qIEZyYW1lZC1JUC1OZXRtYXNrICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIEZyYW1lZF9JbnRlcmZhY2VfSWQ7CS8qIEZyYW1lZC1JbnRlcmZhY2UtSWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogRnJhbWVkX0lQdjZfUHJlZml4OwkvKiBGcmFtZWQtSVB2Ni1QcmVmaXggKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogRnJhbWVkX0lQWF9OZXR3b3JrOwkvKiBGcmFtZWQtSVBYLU5ldHdvcmsgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogRnJhbWVkX01UVTsJCS8qIEZyYW1lZC1NVFUgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogRnJhbWVkX1Byb3RvY29sOwkJLyogRnJhbWVkLVByb3RvY29sICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIEZyYW1lZF9Qb29sOwkJLyogRnJhbWVkLVBvb2wgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogRnJhbWVkX0lQdjZfUm91dGU7CQkvKiBGcmFtZWQtSVB2Ni1Sb3V0ZSAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBGcmFtZWRfSVB2Nl9Qb29sOwkJLyogRnJhbWVkLUlQdjYtUG9vbCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBGcmFtZWRfUm91dGU7CQkvKiBGcmFtZWQtUm91dGUgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogRnJhbWVkX1JvdXRpbmc7CQkvKiBGcmFtZWQtUm91dGluZyAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBGaWx0ZXJfSWQ7CQkJLyogRmlsdGVyLUlkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIElkbGVfVGltZW91dDsJCS8qIElkbGUtVGltZW91dCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBMb2dpbl9JUF9Ib3N0OwkJLyogTG9naW4tSVAtSG9zdCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBMb2dpbl9JUHY2X0hvc3Q7CQkvKiBMb2dpbi1JUHY2LUhvc3QgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogTG9naW5fTEFUX0dyb3VwOwkJLyogTG9naW4tTEFULUdyb3VwICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIExvZ2luX0xBVF9Ob2RlOwkJLyogTG9naW4tTEFULU5vZGUgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogTG9naW5fTEFUX1BvcnQ7CQkvKiBMb2dpbi1MQVQtUG9ydCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBMb2dpbl9MQVRfU2VydmljZTsJCS8qIExvZ2luLUxBVC1TZXJ2aWNlICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIExvZ2luX1NlcnZpY2U7CQkvKiBMb2dpbi1TZXJ2aWNlICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIExvZ2luX1RDUF9Qb3J0OwkJLyogTG9naW4tVENQLVBvcnQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogTkFTX0lkZW50aWZpZXI7CQkvKiBOQVMtSWRlbnRpZmllciAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBOQVNfSVBfQWRkcmVzczsJCS8qIE5BUy1JUC1BZGRyZXNzICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIE5BU19JUHY2X0FkZHJlc3M7CQkvKiBOQVMtSVB2Ni1BZGRyZXNzICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIE5BU19Qb3J0OwkJCS8qIE5BUy1Qb3J0ICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIE5BU19Qb3J0X0lkOwkJLyogTkFTLVBvcnQtSWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogTkFTX1BvcnRfVHlwZTsJCS8qIE5BUy1Qb3J0LVR5cGUgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogT3JpZ2luX0FBQV9Qcm90b2NvbDsJLyogT3JpZ2luLUFBQS1Qcm90b2NvbCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBPcmlnaW5fSG9zdDsJCS8qIE9yaWdpbi1Ib3N0ICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIE9yaWdpbl9SZWFsbTsJCS8qIE9yaWdpbi1SZWFsbSAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBPcmlnaW5hdGluZ19MaW5lX0luZm87CS8qIE9yaWdpbmF0aW5nLUxpbmUtSW5mbyAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBQb3J0X0xpbWl0OwkJLyogUG9ydC1MaW1pdCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBSZV9BdXRoX1JlcXVlc3RfVHlwZTsJLyogUmUtQXV0aC1SZXF1ZXN0LVR5cGUgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogUmVzdWx0X0NvZGU7CQkvKiBSZXN1bHQtQ29kZSAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBTZXJ2aWNlX1R5cGU7CQkvKiBTZXJ2aWNlLVR5cGUgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogU2Vzc2lvbl9JZDsJCS8qIFNlc3Npb24tSWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogU2Vzc2lvbl9UaW1lb3V0OwkJLyogU2Vzc2lvbi1UaW1lb3V0ICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIFN0YXRlOwkJCS8qIFN0YXRlICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIFRlcm1pbmF0aW9uX0NhdXNlOwkJLyogVGVybWluYXRpb24tQ2F1c2UgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogVHVubmVsaW5nOwkJCS8qIFR1bm5lbGluZyAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBUdW5uZWxfVHlwZTsJCS8qIFR1bm5lbC1UeXBlICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIFR1bm5lbF9Bc3NpZ25tZW50X0lkOwkvKiBUdW5uZWwtQXNzaWdubWVudC1JZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBUdW5uZWxfTWVkaXVtX1R5cGU7CS8qIFR1bm5lbC1NZWRpdW0tVHlwZSAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBUdW5uZWxfQ2xpZW50X0VuZHBvaW50OwkvKiBUdW5uZWwtQ2xpZW50LUVuZHBvaW50ICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIFR1bm5lbF9TZXJ2ZXJfRW5kcG9pbnQ7CS8qIFR1bm5lbC1TZXJ2ZXItRW5kcG9pbnQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogVHVubmVsX1ByaXZhdGVfR3JvdXBfSWQ7CS8qIFR1bm5lbC1Qcml2YXRlLUdyb3VwLUlkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIFR1bm5lbF9QcmVmZXJlbmNlOwkJLyogVHVubmVsLVByZWZlcmVuY2UgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogVHVubmVsX0NsaWVudF9BdXRoX0lkOwkvKiBUdW5uZWwtQ2xpZW50LUF1dGgtSWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogVHVubmVsX1NlcnZlcl9BdXRoX0lkOwkvKiBUdW5uZWwtU2VydmVyLUF1dGgtSWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogVXNlcl9OYW1lOwkJCS8qIFVzZXItTmFtZSAqLworCQkKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogU2Vzc2lvbl9UZXJtaW5hdGlvbl9SZXF1ZXN0Oy8qIFNUUiAqLworCX0gZGljdDsgLyogY2FjaGUgb2YgdGhlIGRpY3Rpb25hcnkgb2JqZWN0cyB3ZSB1c2UgKi8KKwlzdHJ1Y3Qgc2Vzc2lvbl9oYW5kbGVyICogc2Vzc19oZGw7IC8qIFdlIHN0b3JlIFJBRElVUyByZXF1ZXN0IGF1dGhlbnRpY2F0b3IgaW5mb3JtYXRpb24gaW4gdGhlIHNlc3Npb24gKi8KKwljaGFyICogY29uZnN0cjsKKwkKKwlpbnQgaWdub3JlX25haTsKK307CisKKy8qIFRoZSBzdGF0ZSB3ZSBzdG9yZSBpbiB0aGUgc2Vzc2lvbiAqLworc3RydWN0IHNlc3Nfc3RhdGUgeworCWFwcGxpY2F0aW9uX2lkX3QgYXV0aF9hcHBsOwkvKiBBdXRoLUFwcGxpY2F0aW9uLUlkIHVzZWQgZm9yIHRoaXMgc2Vzc2lvbiwgaWYgYXZhaWxhYmxlIChzdG9yZWQgaW4gYSBDbGFzcyBhdHRyaWJ1dGUpICovCisJaW50CQkgc2VuZF9zdHI7CS8qIElmIG5vdCAwLCB3ZSBtdXN0IHNlbmQgYSBTVFIgd2hlbiB0aGUgQUNBIGlzIHJlY2VpdmVkLiAqLworCXVpbnQzMl90CSB0ZXJtX2NhdXNlOwkvKiBJZiBub3QgMCwgdGhlIFRlcm1pbmF0aW9uLUNhdXNlIHRvIHB1dCBpbiB0aGUgU1RSLiAqLworfTsKKworc3RhdGljIERFQ0xBUkVfRkRfRFVNUF9QUk9UT1RZUEUoYWNjdF9jb25mX3Nlc3Npb25fc3RhdGVfZHVtcCwgc3RydWN0IHNlc3Nfc3RhdGUgKiBzdCkKK3sKKwlyZXR1cm4gZmRfZHVtcF9leHRlbmQoIEZEX0RVTVBfU1REX1BBUkFNUywgIltyZ3d4IHNlc3Nfc3RhdGVdKEAlcCk6IGFhaToleCBzdHI6JWQgVEM6JXUiLCBzdCwgc3QtPmF1dGhfYXBwbCwgc3QtPnNlbmRfc3RyLCBzdC0+dGVybV9jYXVzZSk7Cit9CisKKy8qIEluaXRpYWxpemUgdGhlIHBsdWdpbiAqLworc3RhdGljIGludCBhY2N0X2NvbmZfcGFyc2UoY2hhciAqIGNvbmZmaWxlLCBzdHJ1Y3Qgcmd3cF9jb25maWcgKiogc3RhdGUpCit7CisJc3RydWN0IHJnd3BfY29uZmlnICogbmV3OworCXN0cnVjdCBkaWN0X29iamVjdCAqIGFwcDsKKwkKKwlUUkFDRV9FTlRSWSgiJXAgJXAiLCBjb25mZmlsZSwgc3RhdGUpOworCUNIRUNLX1BBUkFNUyggc3RhdGUgKTsKKwkKKwlDSEVDS19NQUxMT0MoIG5ldyA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHJnd3BfY29uZmlnKSkgKTsKKwltZW1zZXQobmV3LCAwLCBzaXplb2Yoc3RydWN0IHJnd3BfY29uZmlnKSk7CisJCisJQ0hFQ0tfRkNUKCBmZF9zZXNzX2hhbmRsZXJfY3JlYXRlKCAmbmV3LT5zZXNzX2hkbCwgKHZvaWQgKilmcmVlLCBhY2N0X2NvbmZfc2Vzc2lvbl9zdGF0ZV9kdW1wLCBOVUxMICkgKTsKKwluZXctPmNvbmZzdHIgPSBjb25mZmlsZTsKKwkKKwlpZiAoY29uZmZpbGUgJiYgc3Ryc3RyKGNvbmZmaWxlLCAibm9uYWkiKSkKKwkJbmV3LT5pZ25vcmVfbmFpID0gMTsKKwkKKwkvKiBSZXNvbHZlIGFsbCBkaWN0aW9uYXJ5IG9iamVjdHMgd2UgdXNlICovCisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJBY2NvdW50aW5nLVJlY29yZC1OdW1iZXIiLCAmbmV3LT5kaWN0LkFjY291bnRpbmdfUmVjb3JkX051bWJlciwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiQWNjb3VudGluZy1SZWNvcmQtVHlwZSIsICZuZXctPmRpY3QuQWNjb3VudGluZ19SZWNvcmRfVHlwZSwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiQWNjdC1BcHBsaWNhdGlvbi1JZCIsICZuZXctPmRpY3QuQWNjdF9BcHBsaWNhdGlvbl9JZCwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiQWNjdC1EZWxheS1UaW1lIiwgJm5ldy0+ZGljdC5BY2N0X0RlbGF5X1RpbWUsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIkFjY291bnRpbmctSW5wdXQtT2N0ZXRzIiwgJm5ldy0+ZGljdC5BY2NvdW50aW5nX0lucHV0X09jdGV0cywgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiQWNjb3VudGluZy1PdXRwdXQtT2N0ZXRzIiwgJm5ldy0+ZGljdC5BY2NvdW50aW5nX091dHB1dF9PY3RldHMsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIkFjY291bnRpbmctSW5wdXQtUGFja2V0cyIsICZuZXctPmRpY3QuQWNjb3VudGluZ19JbnB1dF9QYWNrZXRzLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJBY2NvdW50aW5nLU91dHB1dC1QYWNrZXRzIiwgJm5ldy0+ZGljdC5BY2NvdW50aW5nX091dHB1dF9QYWNrZXRzLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJBY2N0LUF1dGhlbnRpYyIsICZuZXctPmRpY3QuQWNjdF9BdXRoZW50aWMsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIkFjY3QtTGluay1Db3VudCIsICZuZXctPmRpY3QuQWNjdF9MaW5rX0NvdW50LCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJBY2N0LU11bHRpLVNlc3Npb24tSWQiLCAmbmV3LT5kaWN0LkFjY3RfTXVsdGlfU2Vzc2lvbl9JZCwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiQWNjdC1TZXNzaW9uLUlkIiwgJm5ldy0+ZGljdC5BY2N0X1Nlc3Npb25fSWQsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIkFjY3QtU2Vzc2lvbi1UaW1lIiwgJm5ldy0+ZGljdC5BY2N0X1Nlc3Npb25fVGltZSwgRU5PRU5UKSApOworCQorCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiQVJBUC1QYXNzd29yZCIsICZuZXctPmRpY3QuQVJBUF9QYXNzd29yZCwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiQVJBUC1TZWN1cml0eSIsICZuZXctPmRpY3QuQVJBUF9TZWN1cml0eSwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiQVJBUC1TZWN1cml0eS1EYXRhIiwgJm5ldy0+ZGljdC5BUkFQX1NlY3VyaXR5X0RhdGEsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIkF1dGgtQXBwbGljYXRpb24tSWQiLCAmbmV3LT5kaWN0LkF1dGhfQXBwbGljYXRpb25fSWQsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIkF1dGgtUmVxdWVzdC1UeXBlIiwgJm5ldy0+ZGljdC5BdXRoX1JlcXVlc3RfVHlwZSwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiQXV0aG9yaXphdGlvbi1MaWZldGltZSIsICZuZXctPmRpY3QuQXV0aG9yaXphdGlvbl9MaWZldGltZSwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiQ2FsbGJhY2stTnVtYmVyIiwgJm5ldy0+ZGljdC5DYWxsYmFja19OdW1iZXIsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIkNhbGxiYWNrLUlkIiwgJm5ldy0+ZGljdC5DYWxsYmFja19JZCwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiQ2FsbGVkLVN0YXRpb24tSWQiLCAmbmV3LT5kaWN0LkNhbGxlZF9TdGF0aW9uX0lkLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJDYWxsaW5nLVN0YXRpb24tSWQiLCAmbmV3LT5kaWN0LkNhbGxpbmdfU3RhdGlvbl9JZCwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiQ2xhc3MiLCAmbmV3LT5kaWN0LkNsYXNzLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJDb25uZWN0LUluZm8iLCAmbmV3LT5kaWN0LkNvbm5lY3RfSW5mbywgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiRGVzdGluYXRpb24tSG9zdCIsICZuZXctPmRpY3QuRGVzdGluYXRpb25fSG9zdCwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiRGVzdGluYXRpb24tUmVhbG0iLCAmbmV3LT5kaWN0LkRlc3RpbmF0aW9uX1JlYWxtLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJFQVAtUGF5bG9hZCIsICZuZXctPmRpY3QuRUFQX1BheWxvYWQsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIkVycm9yLU1lc3NhZ2UiLCAmbmV3LT5kaWN0LkVycm9yX01lc3NhZ2UsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIkVycm9yLVJlcG9ydGluZy1Ib3N0IiwgJm5ldy0+ZGljdC5FcnJvcl9SZXBvcnRpbmdfSG9zdCwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiRXZlbnQtVGltZXN0YW1wIiwgJm5ldy0+ZGljdC5FdmVudF9UaW1lc3RhbXAsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIkZhaWxlZC1BVlAiLCAmbmV3LT5kaWN0LkZhaWxlZF9BVlAsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIkZyYW1lZC1BcHBsZVRhbGstTGluayIsICZuZXctPmRpY3QuRnJhbWVkX0FwcGxlVGFsa19MaW5rLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJGcmFtZWQtQXBwbGVUYWxrLU5ldHdvcmsiLCAmbmV3LT5kaWN0LkZyYW1lZF9BcHBsZVRhbGtfTmV0d29yaywgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiRnJhbWVkLUFwcGxlVGFsay1ab25lIiwgJm5ldy0+ZGljdC5GcmFtZWRfQXBwbGVUYWxrX1pvbmUsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIkZyYW1lZC1Db21wcmVzc2lvbiIsICZuZXctPmRpY3QuRnJhbWVkX0NvbXByZXNzaW9uLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJGcmFtZWQtSVAtQWRkcmVzcyIsICZuZXctPmRpY3QuRnJhbWVkX0lQX0FkZHJlc3MsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIkZyYW1lZC1JUC1OZXRtYXNrIiwgJm5ldy0+ZGljdC5GcmFtZWRfSVBfTmV0bWFzaywgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiRnJhbWVkLUludGVyZmFjZS1JZCIsICZuZXctPmRpY3QuRnJhbWVkX0ludGVyZmFjZV9JZCwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiRnJhbWVkLUlQdjYtUHJlZml4IiwgJm5ldy0+ZGljdC5GcmFtZWRfSVB2Nl9QcmVmaXgsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIkZyYW1lZC1JUFgtTmV0d29yayIsICZuZXctPmRpY3QuRnJhbWVkX0lQWF9OZXR3b3JrLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJGcmFtZWQtTVRVIiwgJm5ldy0+ZGljdC5GcmFtZWRfTVRVLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJGcmFtZWQtUHJvdG9jb2wiLCAmbmV3LT5kaWN0LkZyYW1lZF9Qcm90b2NvbCwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiRnJhbWVkLVBvb2wiLCAmbmV3LT5kaWN0LkZyYW1lZF9Qb29sLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJGcmFtZWQtUm91dGUiLCAmbmV3LT5kaWN0LkZyYW1lZF9Sb3V0ZSwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiRnJhbWVkLUlQdjYtUm91dGUiLCAmbmV3LT5kaWN0LkZyYW1lZF9JUHY2X1JvdXRlLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJGcmFtZWQtSVB2Ni1Qb29sIiwgJm5ldy0+ZGljdC5GcmFtZWRfSVB2Nl9Qb29sLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJGcmFtZWQtUm91dGluZyIsICZuZXctPmRpY3QuRnJhbWVkX1JvdXRpbmcsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIkZpbHRlci1JZCIsICZuZXctPmRpY3QuRmlsdGVyX0lkLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJJZGxlLVRpbWVvdXQiLCAmbmV3LT5kaWN0LklkbGVfVGltZW91dCwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiTG9naW4tSVAtSG9zdCIsICZuZXctPmRpY3QuTG9naW5fSVBfSG9zdCwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiTG9naW4tSVB2Ni1Ib3N0IiwgJm5ldy0+ZGljdC5Mb2dpbl9JUHY2X0hvc3QsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIkxvZ2luLUxBVC1Hcm91cCIsICZuZXctPmRpY3QuTG9naW5fTEFUX0dyb3VwLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJMb2dpbi1MQVQtTm9kZSIsICZuZXctPmRpY3QuTG9naW5fTEFUX05vZGUsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIkxvZ2luLUxBVC1Qb3J0IiwgJm5ldy0+ZGljdC5Mb2dpbl9MQVRfUG9ydCwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiTG9naW4tTEFULVNlcnZpY2UiLCAmbmV3LT5kaWN0LkxvZ2luX0xBVF9TZXJ2aWNlLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJMb2dpbi1TZXJ2aWNlIiwgJm5ldy0+ZGljdC5Mb2dpbl9TZXJ2aWNlLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJMb2dpbi1UQ1AtUG9ydCIsICZuZXctPmRpY3QuTG9naW5fVENQX1BvcnQsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIk5BUy1JZGVudGlmaWVyIiwgJm5ldy0+ZGljdC5OQVNfSWRlbnRpZmllciwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiTkFTLUlQLUFkZHJlc3MiLCAmbmV3LT5kaWN0Lk5BU19JUF9BZGRyZXNzLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJOQVMtSVB2Ni1BZGRyZXNzIiwgJm5ldy0+ZGljdC5OQVNfSVB2Nl9BZGRyZXNzLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJOQVMtUG9ydCIsICZuZXctPmRpY3QuTkFTX1BvcnQsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIk5BUy1Qb3J0LUlkIiwgJm5ldy0+ZGljdC5OQVNfUG9ydF9JZCwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiTkFTLVBvcnQtVHlwZSIsICZuZXctPmRpY3QuTkFTX1BvcnRfVHlwZSwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiT3JpZ2luLUFBQS1Qcm90b2NvbCIsICZuZXctPmRpY3QuT3JpZ2luX0FBQV9Qcm90b2NvbCwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiT3JpZ2luLUhvc3QiLCAmbmV3LT5kaWN0Lk9yaWdpbl9Ib3N0LCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJPcmlnaW4tUmVhbG0iLCAmbmV3LT5kaWN0Lk9yaWdpbl9SZWFsbSwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiT3JpZ2luYXRpbmctTGluZS1JbmZvIiwgJm5ldy0+ZGljdC5PcmlnaW5hdGluZ19MaW5lX0luZm8sIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIlBvcnQtTGltaXQiLCAmbmV3LT5kaWN0LlBvcnRfTGltaXQsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIlJlLUF1dGgtUmVxdWVzdC1UeXBlIiwgJm5ldy0+ZGljdC5SZV9BdXRoX1JlcXVlc3RfVHlwZSwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiUmVzdWx0LUNvZGUiLCAmbmV3LT5kaWN0LlJlc3VsdF9Db2RlLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJTZXJ2aWNlLVR5cGUiLCAmbmV3LT5kaWN0LlNlcnZpY2VfVHlwZSwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiU2Vzc2lvbi1JZCIsICZuZXctPmRpY3QuU2Vzc2lvbl9JZCwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiU2Vzc2lvbi1UaW1lb3V0IiwgJm5ldy0+ZGljdC5TZXNzaW9uX1RpbWVvdXQsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIlN0YXRlIiwgJm5ldy0+ZGljdC5TdGF0ZSwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiVGVybWluYXRpb24tQ2F1c2UiLCAmbmV3LT5kaWN0LlRlcm1pbmF0aW9uX0NhdXNlLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJUdW5uZWxpbmciLCAmbmV3LT5kaWN0LlR1bm5lbGluZywgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiVHVubmVsLUFzc2lnbm1lbnQtSWQiLCAmbmV3LT5kaWN0LlR1bm5lbF9Bc3NpZ25tZW50X0lkLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJUdW5uZWwtVHlwZSIsICZuZXctPmRpY3QuVHVubmVsX1R5cGUsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIlR1bm5lbC1NZWRpdW0tVHlwZSIsICZuZXctPmRpY3QuVHVubmVsX01lZGl1bV9UeXBlLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJUdW5uZWwtQ2xpZW50LUVuZHBvaW50IiwgJm5ldy0+ZGljdC5UdW5uZWxfQ2xpZW50X0VuZHBvaW50LCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJUdW5uZWwtU2VydmVyLUVuZHBvaW50IiwgJm5ldy0+ZGljdC5UdW5uZWxfU2VydmVyX0VuZHBvaW50LCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJUdW5uZWwtUHJpdmF0ZS1Hcm91cC1JZCIsICZuZXctPmRpY3QuVHVubmVsX1ByaXZhdGVfR3JvdXBfSWQsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIlR1bm5lbC1QcmVmZXJlbmNlIiwgJm5ldy0+ZGljdC5UdW5uZWxfUHJlZmVyZW5jZSwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiVHVubmVsLUNsaWVudC1BdXRoLUlkIiwgJm5ldy0+ZGljdC5UdW5uZWxfQ2xpZW50X0F1dGhfSWQsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIlR1bm5lbC1TZXJ2ZXItQXV0aC1JZCIsICZuZXctPmRpY3QuVHVubmVsX1NlcnZlcl9BdXRoX0lkLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJVc2VyLU5hbWUiLCAmbmV3LT5kaWN0LlVzZXJfTmFtZSwgRU5PRU5UKSApOworCQorCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIlNlc3Npb24tVGVybWluYXRpb24tUmVxdWVzdCIsICZuZXctPmRpY3QuU2Vzc2lvbl9UZXJtaW5hdGlvbl9SZXF1ZXN0LCBFTk9FTlQpICk7CisJCisJLyogVGhpcyBwbHVnaW4gcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBEaWFtZXRlciBhdXRoZW50aWNhdGlvbiBhcHBsaWNhdGlvbnMgc3VwcG9ydDogKi8KKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVBQTElDQVRJT04sIEFQUExJQ0FUSU9OX0JZX05BTUUsICJEaWFtZXRlciBCYXNlIEFjY291bnRpbmciLCAmYXBwLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaXNwX2FwcF9zdXBwb3J0ICggYXBwLCBOVUxMLCAwLCAxICkgKTsKKwkKKwkqc3RhdGUgPSBuZXc7CisJcmV0dXJuIDA7Cit9CisKKy8qIGRlaW5pdGlhbGl6ZSAqLworc3RhdGljIHZvaWQgYWNjdF9jb25mX2ZyZWUoc3RydWN0IHJnd3BfY29uZmlnICogc3RhdGUpCit7CisJVFJBQ0VfRU5UUlkoIiVwIiwgc3RhdGUpOworCUNIRUNLX1BBUkFNU19ETyggc3RhdGUsIHJldHVybiApOworCUNIRUNLX0ZDVF9ETyggZmRfc2Vzc19oYW5kbGVyX2Rlc3Ryb3koICZzdGF0ZS0+c2Vzc19oZGwsIE5VTEwgKSwgICk7CisJZnJlZShzdGF0ZSk7CisJcmV0dXJuOworfQorCisvKiBJbmNvbWluZyBSQURJVVMgcmVxdWVzdCAqLworc3RhdGljIGludCBhY2N0X3JhZF9yZXEoIHN0cnVjdCByZ3dwX2NvbmZpZyAqIGNzLCBzdHJ1Y3QgcmFkaXVzX21zZyAqIHJhZF9yZXEsIHN0cnVjdCByYWRpdXNfbXNnICoqIHJhZF9hbnMsIHN0cnVjdCBtc2cgKiogZGlhbV9mdywgc3RydWN0IHJnd19jbGllbnQgKiBjbGkgKQoreworCWludCBpZHg7CisJaW50IHNlbmRfc3RyPTA7CisJdWludDMyX3Qgc3RyX2NhdXNlPTA7CisJdWludDMyX3QgZTJlaWQgPSAwOworCWFwcGxpY2F0aW9uX2lkX3QgYXV0aF9hcHBsPTA7CisJaW50IGdvdF9pZCA9IDA7CisJdWludDMyX3Qgc3RhdHVzX3R5cGU7CisJdWludDMyX3QgdGVybWluYXRpb25fYWN0aW9uID0gMDsKKwl1aW50MzJfdCBnaWdhd29yZHNfaW49MCwgZ2lnYXdvcmRzX291dD0wOworCXNpemVfdCBuYXR0cl91c2VkID0gMDsKKwl1bmlvbiBhdnBfdmFsdWUgdmFsdWU7CisJc3RydWN0IGF2cCAqKiBhdnBfdHVuID0gTlVMTCwgKmF2cCA9IE5VTEw7CisJc3RydWN0IHNlc3Npb24gKiBzZXNzOworCQorCWNvbnN0IGNoYXIgKiBwcmVmaXggPSAiRGlhbWV0ZXIvIjsKKwlzaXplX3QgcHJlZl9sZW47CisJb3MwX3Qgc2kgPSBOVUxMOworCXNpemVfdCBzaV9sZW4gPSAwOworCW9zMF90IHVuID0gTlVMTDsKKwlzaXplX3QgdW5fbGVuID0gMDsKKwkKKwlUUkFDRV9FTlRSWSgiJXAgJXAgJXAgJXAgJXAiLCBjcywgcmFkX3JlcSwgcmFkX2FucywgZGlhbV9mdywgY2xpKTsKKwlDSEVDS19QQVJBTVMocmFkX3JlcSAmJiAocmFkX3JlcS0+aGRyLT5jb2RlID09IFJBRElVU19DT0RFX0FDQ09VTlRJTkdfUkVRVUVTVCkgJiYgcmFkX2FucyAmJiBkaWFtX2Z3ICYmICpkaWFtX2Z3KTsKKwkKKwlwcmVmX2xlbiA9IHN0cmxlbihwcmVmaXgpOworCQorCS8qCisJICAgICAgRWl0aGVyIE5BUy1JUC1BZGRyZXNzIG9yIE5BUy1JZGVudGlmaWVyIE1VU1QgYmUgcHJlc2VudCBpbiBhCisJICAgICAgUkFESVVTIEFjY291bnRpbmctUmVxdWVzdC4gIEl0IFNIT1VMRCBjb250YWluIGEgTkFTLVBvcnQgb3IgTkFTLQorCSAgICAgIFBvcnQtVHlwZSBhdHRyaWJ1dGUgb3IgYm90aCB1bmxlc3MgdGhlIHNlcnZpY2UgZG9lcyBub3QgaW52b2x2ZSBhCisJICAgICAgcG9ydCBvciB0aGUgTkFTIGRvZXMgbm90IGRpc3Rpbmd1aXNoIGFtb25nIGl0cyBwb3J0cy4KKwkqLworCS8qIFdlIGFsc28gZW5mb3JjZSB0aGF0IHRoZSBtZXNzYWdlIGNvbnRhaW5zIGEgQ0xBU1MgYXR0cmlidXRlIHdpdGggRGlhbWV0ZXIvIHByZWZpeCBjb250YWluaW5nIHRoZSBTZXNzaW9uLUlkLiAqLworCWZvciAoaWR4ID0gMDsgaWR4IDwgcmFkX3JlcS0+YXR0cl91c2VkOyBpZHgrKykgeworCQlzdHJ1Y3QgcmFkaXVzX2F0dHJfaGRyICogYXR0ciA9IChzdHJ1Y3QgcmFkaXVzX2F0dHJfaGRyICopKHJhZF9yZXEtPmJ1ZiArIHJhZF9yZXEtPmF0dHJfcG9zW2lkeF0pOworCQl1aW50OF90ICogdiA9ICh1aW50OF90ICopKGF0dHIgKyAxKTsKKwkJc2l6ZV90IGF0dHJfbGVuID0gYXR0ci0+bGVuZ3RoIC0gc2l6ZW9mKHN0cnVjdCByYWRpdXNfYXR0cl9oZHIpOworCQkKKwkJc3dpdGNoIChhdHRyLT50eXBlKSB7CisJCQljYXNlIFJBRElVU19BVFRSX05BU19JUF9BRERSRVNTOgorCQkJY2FzZSBSQURJVVNfQVRUUl9OQVNfSURFTlRJRklFUjoKKwkJCWNhc2UgUkFESVVTX0FUVFJfTkFTX0lQVjZfQUREUkVTUzoKKwkJCQlnb3RfaWQgPSAxOworCQkJCWJyZWFrOworCQkJCQorCQkJY2FzZSBSQURJVVNfQVRUUl9URVJNSU5BVElPTl9BQ1RJT046CisJCQkJQ0hFQ0tfUEFSQU1TKCBhdHRyLT5sZW5ndGggPT0gNiApOworCQkJCXRlcm1pbmF0aW9uX2FjdGlvbiAgPSAodlswXSA8PCAyNCkKKwkJCQkJICAgICAgICAgICB8ICh2WzFdIDw8IDE2KQorCQkJCQkgICAgICAgICAgIHwgKHZbMl0gPDwgIDgpCisJCQkJCSAgICAgICAgICAgfCAgdlszXSA7CisJCQkJYnJlYWs7CisJCQkJCisJCQljYXNlIFJBRElVU19BVFRSX0FDQ1RfSU5QVVRfR0lHQVdPUkRTOgorCQkJCUNIRUNLX1BBUkFNUyggYXR0ci0+bGVuZ3RoID09IDYgKTsKKwkJCQlnaWdhd29yZHNfaW4gID0gKHZbMF0gPDwgMjQpCisJCQkJCSAgICAgICAgICAgfCAodlsxXSA8PCAxNikKKwkJCQkJICAgICAgICAgICB8ICh2WzJdIDw8ICA4KQorCQkJCQkgICAgICAgICAgIHwgIHZbM10gOworCQkJCWJyZWFrOworCQkJCQorCQkJY2FzZSBSQURJVVNfQVRUUl9BQ0NUX09VVFBVVF9HSUdBV09SRFM6CisJCQkJQ0hFQ0tfUEFSQU1TKCBhdHRyLT5sZW5ndGggPT0gNiApOworCQkJCWdpZ2F3b3Jkc19vdXQgID0gKHZbMF0gPDwgMjQpCisJCQkJCSAgICAgICAgICAgfCAodlsxXSA8PCAxNikKKwkJCQkJICAgICAgICAgICB8ICh2WzJdIDw8ICA4KQorCQkJCQkgICAgICAgICAgIHwgIHZbM10gOworCQkJCWJyZWFrOworCQkJCQorCQkJY2FzZSBSQURJVVNfQVRUUl9DTEFTUzoKKwkJCQlpZiAoKGF0dHJfbGVuID4gcHJlZl9sZW4gKSAmJiAhIHN0cm5jbXAoKGNoYXIgKil2LCBwcmVmaXgsIHByZWZfbGVuKSkgeworCQkJCQlpbnQgaTsKKwkJCQkJc2kgPSB2ICsgcHJlZl9sZW47CisJCQkJCXNpX2xlbiA9IGF0dHJfbGVuIC0gcHJlZl9sZW47CisJCQkJCVRSQUNFX0RFQlVHKEFOTk9ZSU5HLCAiRm91bmQgQ2xhc3MgYXR0cmlidXRlIHdpdGggJyVzJyBwcmVmaXggKGF0dHIgIyVkKSwgU0k6JyUuKnMnLiIsIHByZWZpeCwgaWR4LCAoaW50KXNpX2xlbiwgc2kpOworCQkJCQkvKiBSZW1vdmUgZnJvbSB0aGUgbWVzc2FnZSAqLworCQkJCQlmb3IgKGkgPSBpZHggKyAxOyBpIDwgcmFkX3JlcS0+YXR0cl91c2VkOyBpKyspCisJCQkJCQlyYWRfcmVxLT5hdHRyX3Bvc1tpIC0gMV0gPSByYWRfcmVxLT5hdHRyX3Bvc1tpXTsKKwkJCQkJcmFkX3JlcS0+YXR0cl91c2VkIC09IDE7CisJCQkJfQorCQkJCWJyZWFrOworCisJCQljYXNlIFJBRElVU19BVFRSX1VTRVJfTkFNRToKKwkJCQlpZiAoYXR0cl9sZW4pIHsKKwkJCQkJdW4gPSB2OworCQkJCQl1bl9sZW4gPSBhdHRyX2xlbjsKKwkJCQkJVFJBQ0VfREVCVUcoQU5OT1lJTkcsICJGb3VuZCBhIFVzZXItTmFtZSBhdHRyaWJ1dGU6ICclLipzJyIsIChpbnQpdW5fbGVuLCB1bik7CisJCQkJfQorCQkJCWJyZWFrOworCQkJCisJCX0KKwl9CisJCisJLyogQ2hlY2sgYmFzaWMgaW5mb3JtYXRpb24gaXMgdGhlcmUgKi8KKwlpZiAoIWdvdF9pZCB8fCByYWRpdXNfbXNnX2dldF9hdHRyX2ludDMyKHJhZF9yZXEsIFJBRElVU19BVFRSX0FDQ1RfU1RBVFVTX1RZUEUsICZzdGF0dXNfdHlwZSkpIHsKKwkJVFJBQ0VfREVCVUcoSU5GTywgIlthY2N0LnJnd3hdIFJBRElVUyBBY2NvdW50LVJlcXVlc3QgZnJvbSAlcyBkaWQgbm90IGNvbnRhaW4gYSBOQVMgaXAvaWRlbnRpZmllciBvciBBY2N0LVN0YXR1cy1UeXBlIGF0dHJpYnV0ZSwgcmVqZWN0LiIsIHJnd19jbGllbnRzX2lkKGNsaSkpOworCQlyZXR1cm4gRUlOVkFMOworCX0KKwkKKwkvKgorCSAgICAgIC0tIFJGQzI4NjY6CisJICAgICAgSW4gQWNjb3VudGluZy1SZXF1ZXN0IFBhY2tldHMsIHRoZSBBdXRoZW50aWNhdG9yIHZhbHVlIGlzIGEgMTYKKwkgICAgICBvY3RldCBNRDUgWzVdIGNoZWNrc3VtLCBjYWxsZWQgdGhlIFJlcXVlc3QgQXV0aGVudGljYXRvci4KKworCSAgICAgIFRoZSBOQVMgYW5kIFJBRElVUyBhY2NvdW50aW5nIHNlcnZlciBzaGFyZSBhIHNlY3JldC4gIFRoZSBSZXF1ZXN0CisJICAgICAgQXV0aGVudGljYXRvciBmaWVsZCBpbiBBY2NvdW50aW5nLVJlcXVlc3QgcGFja2V0cyBjb250YWlucyBhIG9uZS0KKwkgICAgICB3YXkgTUQ1IGhhc2ggY2FsY3VsYXRlZCBvdmVyIGEgc3RyZWFtIG9mIG9jdGV0cyBjb25zaXN0aW5nIG9mIHRoZQorCSAgICAgIENvZGUgKyBJZGVudGlmaWVyICsgTGVuZ3RoICsgMTYgemVybyBvY3RldHMgKyByZXF1ZXN0IGF0dHJpYnV0ZXMgKworCSAgICAgIHNoYXJlZCBzZWNyZXQgKHdoZXJlICsgaW5kaWNhdGVzIGNvbmNhdGVuYXRpb24pLiAgVGhlIDE2IG9jdGV0IE1ENQorCSAgICAgIGhhc2ggdmFsdWUgaXMgc3RvcmVkIGluIHRoZSBBdXRoZW50aWNhdG9yIGZpZWxkIG9mIHRoZQorCSAgICAgIEFjY291bnRpbmctUmVxdWVzdCBwYWNrZXQuCisKKwkgICAgICBOb3RlIHRoYXQgdGhlIFJlcXVlc3QgQXV0aGVudGljYXRvciBvZiBhbiBBY2NvdW50aW5nLVJlcXVlc3QgY2FuCisJICAgICAgbm90IGJlIGRvbmUgdGhlIHNhbWUgd2F5IGFzIHRoZSBSZXF1ZXN0IEF1dGhlbnRpY2F0b3Igb2YgYSBSQURJVVMKKwkgICAgICBBY2Nlc3MtUmVxdWVzdCwgYmVjYXVzZSB0aGVyZSBpcyBubyBVc2VyLVBhc3N3b3JkIGF0dHJpYnV0ZSBpbiBhbgorCSAgICAgIEFjY291bnRpbmctUmVxdWVzdC4KKwkgICAgICAKKwkgICAgICAKKwkgICAgICAtLSBSRkM1MDgwOgorCSAgICAgIFRoZSBSZXF1ZXN0IEF1dGhlbnRpY2F0b3IgZmllbGQgTVVTVCBjb250YWluIHRoZSBjb3JyZWN0IGRhdGEsIGFzCisJICAgICAgZ2l2ZW4gYnkgdGhlIGFib3ZlIGNhbGN1bGF0aW9uLiAgSW52YWxpZCBwYWNrZXRzIGFyZSBzaWxlbnRseQorCSAgICAgIGRpc2NhcmRlZC4gIE5vdGUgdGhhdCBzb21lIGVhcmx5IGltcGxlbWVudGF0aW9ucyBhbHdheXMgc2V0IHRoZQorCSAgICAgIFJlcXVlc3QgQXV0aGVudGljYXRvciB0byBhbGwgemVyb3MuICBOZXcgaW1wbGVtZW50YXRpb25zIG9mIFJBRElVUworCSAgICAgIGNsaWVudHMgTVVTVCB1c2UgdGhlIGFib3ZlIGFsZ29yaXRobSB0byBjYWxjdWxhdGUgdGhlIFJlcXVlc3QKKwkgICAgICBBdXRoZW50aWNhdG9yIGZpZWxkLiAgTmV3IFJBRElVUyBzZXJ2ZXIgaW1wbGVtZW50YXRpb25zIE1VU1QKKwkgICAgICBzaWxlbnRseSBkaXNjYXJkIGludmFsaWQgcGFja2V0cy4KKwkgICAgICAKKwkqLwkKKwl7CisJCXVpbnQ4X3Qgc2F2ZVtNRDVfTUFDX0xFTl07CisJCXVpbnQ4X3QgKiBzZWNyZXQ7CisJCXNpemVfdCBzZWNyZXRfbGVuOworCQkKKwkJLyogR2V0IHRoZSBzaGFyZWQgc2VjcmV0ICovCisJCUNIRUNLX0ZDVChyZ3dfY2xpZW50c19nZXRrZXkoY2xpLCAmc2VjcmV0LCAmc2VjcmV0X2xlbikpOworCQkKKwkJLyogQ29weSB0aGUgcmVjZWl2ZWQgUmVxdWVzdCBBdXRoZW50aWNhdG9yICovCisJCW1lbWNweSgmc2F2ZVswXSwgJnJhZF9yZXEtPmhkci0+YXV0aGVudGljYXRvclswXSwgTUQ1X01BQ19MRU4pOworCQkKKwkJLyogQ29tcHV0ZSB0aGUgc2FtZSBhdXRoZW50aWNhdG9yICovCisJCXJhZGl1c19tc2dfZmluaXNoX2FjY3QocmFkX3JlcSwgc2VjcmV0LCBzZWNyZXRfbGVuKTsKKwkJCisJCS8qIEFuZCBub3cgY29tcGFyZSB3aXRoIHRoZSByZWNlaXZlZCB2YWx1ZSAqLworCQlpZiAobWVtY21wKCZzYXZlWzBdLCAmcmFkX3JlcS0+aGRyLT5hdXRoZW50aWNhdG9yWzBdLCBNRDVfTUFDX0xFTikpIHsKKwkJCS8qIEludmFsaWQgYXV0aGVudGljYXRvciAqLworCQkJVFJBQ0VfQlVGRkVSKEZEX0xPR19ERUJVRywgRlVMTCsxLCAiUmVjZWl2ZWQgUmVxQXV0aDogIiwgJnNhdmVbMF0sIE1ENV9NQUNfTEVOLCAiIiApOworCQkJVFJBQ0VfQlVGRkVSKEZEX0xPR19ERUJVRywgRlVMTCsxLCAiRXhwZWN0ZWQgUmVxQXV0aDogIiwgJnJhZF9yZXEtPmhkci0+YXV0aGVudGljYXRvclswXSwgTUQ1X01BQ19MRU4sICIiICk7CisJCQlUUkFDRV9ERUJVRyhJTkZPLCAiW2FjY3Qucmd3eF0gSW52YWxpZCBSZXF1ZXN0IEF1dGhlbnRpY2F0b3IgaW4gQWNjb3VudC1SZXF1ZXN0IGZyb20gJXMsIGRpc2NhcmRpbmcgdGhlIG1lc3NhZ2UuIiwgcmd3X2NsaWVudHNfaWQoY2xpKSk7CisJCQlyZXR1cm4gRUlOVkFMOworCQl9CisJfQorCQorCQorCS8qIEhhbmRsZSB0aGUgQWNjb3VudGluZy1PbiBjYXNlOiBub3RoaW5nIHRvIGRvLCBqdXN0IHJlcGx5IE9LICovCisJaWYgKHN0YXR1c190eXBlID09IFJBRElVU19BQ0NUX1NUQVRVU19UWVBFX0FDQ09VTlRJTkdfT04pIHsKKwkJVFJBQ0VfREVCVUcoRlVMTCwgIlthY2N0LnJnd3hdIFJlY2VpdmVkIEFjY291bnRpbmctT24gQWNjdC1TdGF0dXMtVHlwZSBhdHRyaWJ1dGUsIHJlcGx5aW5nIHdpdGhvdXQgdHJhbnNsYXRpb24gdG8gRGlhbWV0ZXIuIik7CisJCUNIRUNLX01BTExPQyggKnJhZF9hbnMgPSByYWRpdXNfbXNnX25ldyhSQURJVVNfQ09ERV9BQ0NPVU5USU5HX1JFU1BPTlNFLCByYWRfcmVxLT5oZHItPmlkZW50aWZpZXIpICk7CisJCXJldHVybiAtMjsKKwl9CisJCisJaWYgKHN0YXR1c190eXBlID09IFJBRElVU19BQ0NUX1NUQVRVU19UWVBFX0FDQ09VTlRJTkdfT0ZGKSB7CisJCVRSQUNFX0RFQlVHKEZVTEwsICJbYWNjdC5yZ3d4XSBSZWNlaXZlZCBBY2NvdW50aW5nLU9mZiBBY2N0LVN0YXR1cy1UeXBlIGF0dHJpYnV0ZSwgd2UgbXVzdCB0ZXJtaW5hdGUgYWxsIGFjdGl2ZSBzZXNzaW9ucy4iKTsKKwkJVE9ETygiUkFESVVTIHNpZGUgaXMgcmVib290aW5nLCBzZW5kIFNUUiBvbiBhbGwgc2Vzc2lvbnM/Pz8iKTsKKwkJcmV0dXJuIEVOT1RTVVA7CisJfQorCQorCS8qIENoZWNrIGlmIHdlIGdvdCBhIHZhbGlkIHNlc3Npb24gaW5mb3JtYXRpb24sIG90aGVyd2lzZSB0aGUgc2VydmVyIHdpbGwgbm90IGJlIGFibGUgdG8gaGFuZGxlIHRoZSBkYXRhLi4uICovCisJaWYgKCFzaSkgeworCQlUUkFDRV9ERUJVRyhJTkZPLCAiW2FjY3Qucmd3eF0gUkFESVVTIEFjY291bnQtUmVxdWVzdCBmcm9tICVzIGRpZCBub3QgY29udGFpbiBhIENMQVNTIGF0dHJpYnV0ZSB3aXRoIERpYW1ldGVyIHNlc3Npb24gaW5mb3JtYXRpb24sIHJlamVjdC4iLCByZ3dfY2xpZW50c19pZChjbGkpKTsKKwkJcmV0dXJuIEVJTlZBTDsKKwl9CisJCisJLyogQWRkIHRoZSBEZXN0aW5hdGlvbi1SZWFsbSAqLworCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBjcy0+ZGljdC5EZXN0aW5hdGlvbl9SZWFsbSwgMCwgJmF2cCApICk7CisJaWR4ID0gMDsKKwlpZiAodW4gJiYgISBjcy0+aWdub3JlX25haSkgeworCQkvKiBJcyB0aGVyZSBhbiAnQCcgaW4gdGhlIHVzZXIgbmFtZT8gV2UgZG9uJ3QgY2FyZSBmb3IgZGVjb3JhdGVkIE5BSSBoZXJlICovCisJCWZvciAoaWR4ID0gdW5fbGVuIC0gMjsgaWR4ID4gMDsgaWR4LS0pIHsKKwkJCWlmICh1bltpZHhdID09ICdAJykgeworCQkJCWlkeCsrOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCWlmIChpZHggPT0gMCkgeworCQkvKiBOb3QgZm91bmQgaW4gdGhlIFVzZXItTmFtZSA9PiB3ZSB1c2UgdGhlIGxvY2FsIGRvbWFpbiBvZiB0aGlzIGdhdGV3YXkgKi8KKwkJdmFsdWUub3MuZGF0YSA9ICh1aW50OF90ICopZmRfZ19jb25maWctPmNuZl9kaWFtcmxtOworCQl2YWx1ZS5vcy5sZW4gID0gZmRfZ19jb25maWctPmNuZl9kaWFtcmxtX2xlbjsKKwl9IGVsc2UgeworCQl2YWx1ZS5vcy5kYXRhID0gdW4gKyBpZHg7CisJCXZhbHVlLm9zLmxlbiAgPSB1bl9sZW4gLSBpZHg7CisJfQorCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9zZXR2YWx1ZSAoIGF2cCwgJnZhbHVlICkgKTsKKwlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkICggKmRpYW1fZncsIE1TR19CUldfRklSU1RfQ0hJTEQsIGF2cCkgKTsKKwkKKwkvKiBDcmVhdGUgdGhlIFNlc3Npb24tSWQgQVZQICovCisJeworCQlDSEVDS19GQ1QoIGZkX3Nlc3NfZnJvbXNpZF9tc2cgKCBzaSwgc2lfbGVuLCAmc2VzcywgTlVMTCkgKTsKKwkJCisJCVRSQUNFX0RFQlVHKEZVTEwsICJbYWNjdC5yZ3d4XSBUcmFuc2xhdGluZyBuZXcgYWNjb3VudGluZyBtZXNzYWdlIGZvciBzZXNzaW9uICclLipzJy4uLiIsIChpbnQpc2lfbGVuLCBzaSk7CisJCQorCQkvKiBBZGQgdGhlIFNlc3Npb24tSWQgQVZQIGFzIGZpcnN0IEFWUCAqLworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3ICggY3MtPmRpY3QuU2Vzc2lvbl9JZCwgMCwgJmF2cCApICk7CisJCXZhbHVlLm9zLmRhdGEgPSAodW5zaWduZWQgY2hhciAqKXNpOworCQl2YWx1ZS5vcy5sZW4gPSBzaV9sZW47CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9zZXR2YWx1ZSAoIGF2cCwgJnZhbHVlICkgKTsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCAoICpkaWFtX2Z3LCBNU0dfQlJXX0ZJUlNUX0NISUxELCBhdnApICk7CisJCUNIRUNLX0ZDVCggZmRfbXNnX3Nlc3Nfc2V0KCpkaWFtX2Z3LCBzZXNzKSApOworCX0KKwkKKwkJCisJLyogQWRkIHRoZSBjb21tYW5kIGNvZGUgKi8KKwl7CisJCXN0cnVjdCBtc2dfaGRyICogaGVhZGVyID0gTlVMTDsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfaGRyICggKmRpYW1fZncsICZoZWFkZXIgKSApOworCQloZWFkZXItPm1zZ19mbGFncyA9IENNRF9GTEFHX1JFUVVFU1QgfCBDTURfRkxBR19QUk9YSUFCTEU7CisJCWhlYWRlci0+bXNnX2NvZGUgPSBDQ19BQzsKKwkJaGVhZGVyLT5tc2dfYXBwbCA9IEFJX0FDQ1Q7CisJCQorCQkvKiBBZGQgdGhlIEFjY3QtQXBwbGljYXRpb24tSWQgKi8KKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIGNzLT5kaWN0LkFjY3RfQXBwbGljYXRpb25fSWQsIDAsICZhdnAgKSApOworCQl2YWx1ZS5pMzIgPSBoZWFkZXItPm1zZ19hcHBsOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUgKCBhdnAsICZ2YWx1ZSApICk7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQgKCAqZGlhbV9mdywgTVNHX0JSV19MQVNUX0NISUxELCBhdnApICk7CisJCQorCQkvKiBzYXZlIHRoZSBlbmQgdG8gZW5kIGlkICovCisJCWUyZWlkID0gaGVhZGVyLT5tc2dfZXRlaWQ7CisJfQorCQorCS8qIENvbnZlcnQgdGhlIFJBRElVUyBhdHRyaWJ1dGVzLCBhcyB0aGV5IGFwcGVhciBpbiB0aGUgbWVzc2FnZSAqLworCWZvciAoaWR4ID0gMDsgaWR4IDwgcmFkX3JlcS0+YXR0cl91c2VkOyBpZHgrKykgeworCQlzdHJ1Y3QgcmFkaXVzX2F0dHJfaGRyICogYXR0ciA9IChzdHJ1Y3QgcmFkaXVzX2F0dHJfaGRyICopKHJhZF9yZXEtPmJ1ZiArIHJhZF9yZXEtPmF0dHJfcG9zW2lkeF0pOworCisJCXN3aXRjaCAoYXR0ci0+dHlwZSkgeworCQkJLyoJCisJCQkgICAgICBBbnkgYXR0cmlidXRlIHZhbGlkIGluIGEgUkFESVVTIEFjY2Vzcy1SZXF1ZXN0IG9yIEFjY2Vzcy1BY2NlcHQKKwkJCSAgICAgIHBhY2tldCBpcyB2YWxpZCBpbiBhIFJBRElVUyBBY2NvdW50aW5nLVJlcXVlc3QgcGFja2V0LCBleGNlcHQgdGhhdAorCQkJICAgICAgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIE1VU1QgTk9UIGJlIHByZXNlbnQgaW4gYW4gQWNjb3VudGluZy0KKwkJCSAgICAgIFJlcXVlc3Q6ICBVc2VyLVBhc3N3b3JkLCBDSEFQLVBhc3N3b3JkLCBSZXBseS1NZXNzYWdlLCBTdGF0ZS4KKwkJCSovCisJCQljYXNlIFJBRElVU19BVFRSX1VTRVJfUEFTU1dPUkQ6CisJCQljYXNlIFJBRElVU19BVFRSX0NIQVBfUEFTU1dPUkQ6CisJCQljYXNlIFJBRElVU19BVFRSX1JFUExZX01FU1NBR0U6CisJCQljYXNlIFJBRElVU19BVFRSX1NUQVRFOgorCQkJY2FzZSBSQURJVVNfQVRUUl9NRVNTQUdFX0FVVEhFTlRJQ0FUT1I6CisJCQljYXNlIFJBRElVU19BVFRSX0VBUF9NRVNTQUdFOgorCQkJCVRSQUNFX0RFQlVHKElORk8sICJbYWNjdC5yZ3d4XSBSQURJVVMgQWNjb3VudC1SZXF1ZXN0IGNvbnRhaW5zIGEgZm9yYmlkZGVuIGF0dHJpYnV0ZSAoJWhoZCksIHJlamVjdC4iLCBhdHRyLT50eXBlKTsKKwkJCQlyZXR1cm4gRUlOVkFMOworCQkJCQorCQkJCisJCQkvKiBUaGlzIG1hY3JvIGNvbnZlcnRzIGEgUkFESVVTIGF0dHJpYnV0ZSB0byBhIERpYW1ldGVyIEFWUCBvZiB0eXBlIE9jdGV0U3RyaW5nICovCisJCQkjZGVmaW5lIENPTlYyRElBTV9TVFIoIF9kaWN0b2JqXyApCVwKKwkJCQlDSEVDS19QQVJBTVMoIGF0dHItPmxlbmd0aCA+PSAyICk7CQkJCQkJXAorCQkJCS8qIENyZWF0ZSB0aGUgQVZQIHdpdGggdGhlIHNwZWNpZmllZCBkaWN0aW9uYXJ5IG1vZGVsICovCQkJXAorCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBjcy0+ZGljdC5fZGljdG9ial8sIDAsICZhdnAgKSApOwkJCVwKKwkJCQl2YWx1ZS5vcy5sZW4gPSBhdHRyLT5sZW5ndGggLSAyOwkJCQkJCVwKKwkJCQl2YWx1ZS5vcy5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikoYXR0ciArIDEpOwkJCQkJXAorCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9zZXR2YWx1ZSAoIGF2cCwgJnZhbHVlICkgKTsJCQkJXAorCQkJCS8qIEFkZCB0aGUgQVZQIGluIHRoZSBEaWFtZXRlciBtZXNzYWdlLiAqLwkJCQkJXAorCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQgKCAqZGlhbV9mdywgTVNHX0JSV19MQVNUX0NISUxELCBhdnApICk7CQlcCisJCQkJCisJCQkvKiBTYW1lIHRoaW5nLCBmb3Igc2NhbGFyIEFWUHMgb2YgMzIgYml0cyAqLworCQkJI2RlZmluZSBDT05WMkRJQU1fMzJCKCBfZGljdG9ial8gKQlcCisJCQkJQ0hFQ0tfUEFSQU1TKCBhdHRyLT5sZW5ndGggPT0gNiApOwkJCQkJCVwKKwkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3ICggY3MtPmRpY3QuX2RpY3RvYmpfLCAwLCAmYXZwICkgKTsJCQlcCisJCQkJewkJCQkJCQkJCQlcCisJCQkJCXVpbnQ4X3QgKiB2ID0gKHVpbnQ4X3QgKikoYXR0ciArIDEpOwkJCQkJXAorCQkJCQl2YWx1ZS51MzIgID0gKHZbMF0gPDwgMjQpCQkJCQkJXAorCQkJCQkgICAgICAgICAgIHwgKHZbMV0gPDwgMTYpCQkJCQkJXAorCQkJCQkgICAgICAgICAgIHwgKHZbMl0gPDwgIDgpCQkJCQkJXAorCQkJCQkgICAgICAgICAgIHwgIHZbM10gOwkJCQkJCQlcCisJCQkJfQkJCQkJCQkJCQlcCisJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX3NldHZhbHVlICggYXZwLCAmdmFsdWUgKSApOwkJCQlcCisJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCAoICpkaWFtX2Z3LCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCkgKTsJCVwKKwkJCQkKKwkJCS8qIEFuZCB0aGUgNjRiIHZlcnNpb24gKi8KKwkJCSNkZWZpbmUgQ09OVjJESUFNXzY0QiggX2RpY3RvYmpfICkJXAorCQkJCUNIRUNLX1BBUkFNUyggYXR0ci0+bGVuZ3RoID09IDEwKTsJCQkJCQlcCisJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIGNzLT5kaWN0Ll9kaWN0b2JqXywgMCwgJmF2cCApICk7CQkJXAorCQkJCXsJCQkJCQkJCQkJXAorCQkJCQl1aW50OF90ICogdiA9ICh1aW50OF90ICopKGF0dHIgKyAxKTsJCQkJCVwKKwkJCQkJdmFsdWUudTY0ICA9ICgodWludDY0X3QpKHZbMF0pIDw8IDU2KQkJCQkJXAorCQkJCQkgICAgICAgICAgIHwgKCh1aW50NjRfdCkodlsxXSkgPDwgNDgpCQkJCQlcCisJCQkJCSAgICAgICAgICAgfCAoKHVpbnQ2NF90KSh2WzJdKSA8PCA0MCkJCQkJCVwKKwkJCQkJICAgICAgICAgICB8ICgodWludDY0X3QpKHZbM10pIDw8IDMyKQkJCQkJXAorCQkJCQkgICAgICAgICAgIHwgKCh1aW50NjRfdCkodls0XSkgPDwgMjQpCQkJCQlcCisJCQkJCSAgICAgICAgICAgfCAoKHVpbnQ2NF90KSh2WzVdKSA8PCAxNikJCQkJCVwKKwkJCQkJICAgICAgICAgICB8ICgodWludDY0X3QpKHZbNl0pIDw8ICA4KQkJCQkJXAorCQkJCQkgICAgICAgICAgIHwgICh1aW50NjRfdCkodls3XSkgOwkJCQkJXAorCQkJCX0JCQkJCQkJCQkJXAorCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9zZXR2YWx1ZSAoIGF2cCwgJnZhbHVlICkgKTsJCQkJXAorCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQgKCAqZGlhbV9mdywgTVNHX0JSV19MQVNUX0NISUxELCBhdnApICk7CQlcCisJCQkJCisJCQkKKwkJCS8qIEF0dHJpYnV0ZXMgYXMgbGlzdGVkIGluIFJGQzI4NjYsIHNlY3Rpb24gNS4xMyAgYW5kIFJGQzQwMDUsIHNlY3Rpb24gMTAuMi4xICovCisJCQljYXNlIFJBRElVU19BVFRSX1VTRVJfTkFNRToKKwkJCQlDT05WMkRJQU1fU1RSKCBVc2VyX05hbWUgKTsKKwkJCQlicmVhazsKKwkJCQkKKwkJCWNhc2UgUkFESVVTX0FUVFJfTkFTX0lQX0FERFJFU1M6CisJCQkJQ09OVjJESUFNX1NUUiggTkFTX0lQX0FkZHJlc3MgKTsKKwkJCQlicmVhazsKKwkJCQkKKwkJCWNhc2UgUkFESVVTX0FUVFJfTkFTX1BPUlQ6CisJCQkJQ09OVjJESUFNXzMyQiggTkFTX1BvcnQgKTsKKwkJCQlicmVhazsKKwkJCQkKKwkJCWNhc2UgUkFESVVTX0FUVFJfU0VSVklDRV9UWVBFOgorCQkJCUNPTlYyRElBTV8zMkIoIFNlcnZpY2VfVHlwZSApOworCQkJCWJyZWFrOworCQkJCQorCQkJY2FzZSBSQURJVVNfQVRUUl9GUkFNRURfUFJPVE9DT0w6CisJCQkJQ09OVjJESUFNXzMyQiggRnJhbWVkX1Byb3RvY29sICk7CisJCQkJYnJlYWs7CisJCQkJCisJCQljYXNlIFJBRElVU19BVFRSX0ZSQU1FRF9JUF9BRERSRVNTOgorCQkJCUNPTlYyRElBTV9TVFIoIEZyYW1lZF9JUF9BZGRyZXNzICk7CisJCQkJYnJlYWs7CisJCQkJCisJCQljYXNlIFJBRElVU19BVFRSX0ZSQU1FRF9JUF9ORVRNQVNLOgorCQkJCUNPTlYyRElBTV9TVFIoIEZyYW1lZF9JUF9OZXRtYXNrICk7CisJCQkJYnJlYWs7CisJCQkJCisJCQljYXNlIFJBRElVU19BVFRSX0ZSQU1FRF9ST1VUSU5HOgorCQkJCUNPTlYyRElBTV8zMkIoIEZyYW1lZF9Sb3V0aW5nICk7CisJCQkJYnJlYWs7CisJCQkJCisJCQljYXNlIFJBRElVU19BVFRSX0ZJTFRFUl9JRDoKKwkJCQlDT05WMkRJQU1fU1RSKCBGaWx0ZXJfSWQgKTsKKwkJCQlicmVhazsKKwkJCQkKKwkJCWNhc2UgUkFESVVTX0FUVFJfRlJBTUVEX01UVToKKwkJCQlDT05WMkRJQU1fMzJCKCBGcmFtZWRfTVRVICk7CisJCQkJYnJlYWs7CisJCQkKKwkJCWNhc2UgUkFESVVTX0FUVFJfRlJBTUVEX0NPTVBSRVNTSU9OOgorCQkJCUNPTlYyRElBTV8zMkIoIEZyYW1lZF9Db21wcmVzc2lvbiApOworCQkJCWJyZWFrOworCQkJCisJCQljYXNlIFJBRElVU19BVFRSX0xPR0lOX0lQX0hPU1Q6CisJCQkJQ09OVjJESUFNX1NUUiggTG9naW5fSVBfSG9zdCApOworCQkJCWJyZWFrOworCQkJCQorCQkJY2FzZSBSQURJVVNfQVRUUl9MT0dJTl9TRVJWSUNFOgorCQkJCUNPTlYyRElBTV8zMkIoIExvZ2luX1NlcnZpY2UgKTsKKwkJCQlicmVhazsKKwkJCQkKKwkJCWNhc2UgUkFESVVTX0FUVFJfTE9HSU5fVENQX1BPUlQ6CisJCQkJQ09OVjJESUFNXzMyQiggTG9naW5fVENQX1BvcnQgKTsKKwkJCQlicmVhazsKKwkJCQkKKwkJCWNhc2UgUkFESVVTX0FUVFJfQ0FMTEJBQ0tfTlVNQkVSOgorCQkJCUNPTlYyRElBTV9TVFIoIENhbGxiYWNrX051bWJlciApOworCQkJCWJyZWFrOworCQkJCQorCQkJY2FzZSBSQURJVVNfQVRUUl9DQUxMQkFDS19JRDoKKwkJCQlDT05WMkRJQU1fU1RSKCBDYWxsYmFja19JZCApOworCQkJCWJyZWFrOworCQkJCQorCQkJY2FzZSBSQURJVVNfQVRUUl9GUkFNRURfUk9VVEU6CisJCQkJQ09OVjJESUFNX1NUUiggRnJhbWVkX1JvdXRlICk7CisJCQkJYnJlYWs7CisJCQkJCisJCQljYXNlIFJBRElVU19BVFRSX0ZSQU1FRF9JUFhfTkVUV09SSzoKKwkJCQlDT05WMkRJQU1fMzJCKCBGcmFtZWRfSVBYX05ldHdvcmsgKTsKKwkJCQlicmVhazsKKwkJCQkKKwkJCWNhc2UgUkFESVVTX0FUVFJfQ0xBU1M6CisJCQkJQ09OVjJESUFNX1NUUiggQ2xhc3MgKTsKKwkJCQkvKiBJbiBhZGRpdGlvbiwgc2F2ZSB0aGUgZGF0YSBpbiB0aGUgc2Vzc2lvbiBpZiBpdCBpcyAib3VyIiBDTEFTU19BQUlfUFJFRklYIENsYXNzIGF0dHJpYnV0ZSAqLworCQkJCXsKKwkJCQkJY2hhciBidWZbMzJdOworCQkJCQljaGFyICogYXR0cl92YWwsICphdXRoX3ZhbDsKKwkJCQkJYXR0cl92YWwgPSAoY2hhciAqKShhdHRyICsgMSk7CisJCQkJCWF1dGhfdmFsID0gYXR0cl92YWwgKyBDT05TVFNUUkxFTihDTEFTU19BQUlfUFJFRklYKTsKKwkJCQkJaWYgKAkoYXR0ci0+bGVuZ3RoID4gc2l6ZW9mKHN0cnVjdCByYWRpdXNfYXR0cl9oZHIpICsgQ09OU1RTVFJMRU4oQ0xBU1NfQUFJX1BSRUZJWCkgICkKKwkJCQkJCSYmIChhdHRyLT5sZW5ndGggPCBzaXplb2Yoc3RydWN0IHJhZGl1c19hdHRyX2hkcikgKyBDT05TVFNUUkxFTihDTEFTU19BQUlfUFJFRklYKSArIHNpemVvZihidWYpKQorCQkJCQkJJiYgISBzdHJuY21wKGF0dHJfdmFsLCBDTEFTU19BQUlfUFJFRklYLCBDT05TVFNUUkxFTihDTEFTU19BQUlfUFJFRklYKSkpIHsKKwkJCQkJCisJCQkJCQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7CisJCQkJCQltZW1jcHkoYnVmLCBhdXRoX3ZhbCwgYXR0ci0+bGVuZ3RoIC0gc2l6ZW9mKHN0cnVjdCByYWRpdXNfYXR0cl9oZHIpIC0gQ09OU1RTVFJMRU4oQ0xBU1NfQUFJX1BSRUZJWCkpOworCQkJCQkJaWYgKHNzY2FuZihidWYsICIldSIsICZhdXRoX2FwcGwpID09IDEpIHsKKwkJCQkJCQlUUkFDRV9ERUJVRyhBTk5PWUlORywgIkZvdW5kIENsYXNzIGF0dHJpYnV0ZSB3aXRoICclcycgcHJlZml4IChhdHRyICMlZCksIEFBSToldS4iLCBDTEFTU19BQUlfUFJFRklYLCBpZHgsIGF1dGhfYXBwbCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisJCQkKKwkJCWNhc2UgUkFESVVTX0FUVFJfVkVORE9SX1NQRUNJRklDOgorCQkJCWlmIChhdHRyLT5sZW5ndGggPj0gNikgeworCQkJCQl1aW50MzJfdCB2ZW5kb3JfaWQ7CisJCQkJCXVpbnQ4X3QgKiBjID0gKHVpbnQ4X3QgKikoYXR0ciArIDEpOworCQkJCQkKKwkJCQkJdmVuZG9yX2lkID0gY1swXSA8PCAyNCB8IGNbMV0gPDwgMTYgfCBjWzJdIDw8IDggfCBjWzNdOworCQkJCQljICs9IDQ7CisJCQkJCQorCQkJCQlzd2l0Y2ggKHZlbmRvcl9pZCkgeworCQkJCQkJCisJCQkJCQkvKiBGb3IgdGhlIHZlbmRvcnMgd2UgS05PVyB0aGV5IGZvbGxvdyB0aGUgVlNBIHJlY29tbWVuZGVkIGZvcm1hdCwgd2UgY29udmVydCBmb2xsb3dpbmcgdGhlIHJ1bGVzIG9mIFJGQzQwMDUgKDkuNi4yKSAqLworCQkJCQkJY2FzZSBSQURJVVNfVkVORE9SX0lEX01JQ1JPU09GVCA6IC8qIFJGQyAyNTQ4ICovCisJCQkJCQkvKiBvdGhlciB2ZW5kb3JzID8gKi8KKwkJCQkJCXsKKwkJCQkJCQlzaXplX3QgbGVmdDsKKwkJCQkJCQlzdHJ1Y3QgcmFkaXVzX2F0dHJfdmVuZG9yICp2dGx2OworCQkJCQkJCQorCQkJCQkJCWxlZnQgPSBhdHRyLT5sZW5ndGggLSA2OworCQkJCQkJCXZ0bHYgPSAoc3RydWN0IHJhZGl1c19hdHRyX3ZlbmRvciAqKWM7CisJCQkJCQkKKwkJCQkJCQl3aGlsZSAoKGxlZnQgPj0gMikgJiYgKHZ0bHYtPnZlbmRvcl9sZW5ndGggPD0gbGVmdCkpIHsKKwkJCQkJCQkJLyogU2VhcmNoIG91ciBkaWN0aW9uYXJ5IGZvciBjb3JyZXNwb25kaW5nIFZlbmRvcidzIEFWUCAqLworCQkJCQkJCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCByZXE7CisJCQkJCQkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cF9tb2RlbCA9IE5VTEw7CisJCQkJCQkJCW1lbXNldCgmcmVxLCAwLCBzaXplb2Yoc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QpKTsKKwkJCQkJCQkJcmVxLmF2cF92ZW5kb3IgPSB2ZW5kb3JfaWQ7CisJCQkJCQkJCXJlcS5hdnBfY29kZSA9IHZ0bHYtPnZlbmRvcl90eXBlOworCQkJCQkJCQkKKwkJCQkJCQkJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX0NPREVfQU5EX1ZFTkRPUiwgJnJlcSwgJmF2cF9tb2RlbCwgMCkgKTsKKwkJCQkJCQkJaWYgKCFhdnBfbW9kZWwpIHsKKwkJCQkJCQkJCVRSQUNFX0RFQlVHKEZVTEwsICJVbmtub3duIGF0dHJpYnV0ZSAodmVuZG9yIDB4JXgsIGNvZGUgMHgleCkgaWdub3JlZC4iLCByZXEuYXZwX3ZlbmRvciwgcmVxLmF2cF9jb2RlKTsKKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBhdnBfbW9kZWwsIDAsICZhdnAgKSApOworCQkJCQkJCQkJdmFsdWUub3MubGVuID0gdnRsdi0+dmVuZG9yX2xlbmd0aCAtIDI7CisJCQkJCQkJCQl2YWx1ZS5vcy5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikodnRsdiArIDEpOworCQkJCQkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX3NldHZhbHVlICggYXZwLCAmdmFsdWUgKSApOworCQkJCQkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCAoICpkaWFtX2Z3LCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCkgKTsKKwkJCQkJCQkJfQorCQkJCQkJCQljICs9IHZ0bHYtPnZlbmRvcl9sZW5ndGg7CisJCQkJCQkJCWxlZnQgLT0gdnRsdi0+dmVuZG9yX2xlbmd0aDsKKwkJCQkJCQkJdnRsdiA9IChzdHJ1Y3QgcmFkaXVzX2F0dHJfdmVuZG9yICopYzsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJCQorCQkJCQkJLyogT3RoZXIgdmVuZG9ycyB3ZSBLTk93IGhvdyB0byBjb252ZXJ0IHRoZSBhdHRyaWJ1dGVzIHdvdWxkIGJlIGFkZGVkIGhlcmUuLi4gKi8KKwkJCQkJCS8qIGNhc2UgUkFESVVTX1ZFTkRPUl9JRF9DSVNDTyA6CisJCQkJCQkJYnJlYWs7ICovCisJCQkJCQkvKiBjYXNlIFJBRElVU19WRU5ET1JfSURfSUVURiA6IChleHRlbmRlZCBSQURJVVMgYXR0cmlidXRlcykKKwkJCQkJCQlicmVhazsgKi8KKwkJCQkJCQorCQkJCQkJLyogV2hlbiB3ZSBkb24ndCBrbm93LCBqdXN0IGRpc2NhcmQgdGhlIGF0dHJpYnV0ZS4uLiBWU0EgYXJlIG9wdGlvbmFsIHdpdGggcmVnYXJkcyB0byBSQURJVVMgYW55d2F5ICovCisJCQkJCQlkZWZhdWx0OgorCQkJCQkJCS8qIGRvIG5vdGhpbmcgKi8KKwkJCQkJCQlUUkFDRV9ERUJVRyhGVUxMLCAiVlNBIGF0dHJpYnV0ZSBmcm9tIHZlbmRvciAlZCBkaXNjYXJkZWQiLCB2ZW5kb3JfaWQpOworCQkJCQkJCQorCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworCQkJCQorCQkJY2FzZSBSQURJVVNfQVRUUl9TRVNTSU9OX1RJTUVPVVQ6CisJCQkJLyogVHJhbnNsYXRpb24gZGVwZW5kcyBvbiBUZXJtaW5hdGlvbi1BY3Rpb24gOiByZmM0MDA1I3NlY3Rpb24tOS4yLjEgKi8KKwkJCQlpZiAodGVybWluYXRpb25fYWN0aW9uICE9IFJBRElVU19URVJNSU5BVElPTl9BQ1RJT05fUkFESVVTX1JFUVVFU1QpIHsKKwkJCQkJQ09OVjJESUFNXzMyQiggU2Vzc2lvbl9UaW1lb3V0ICk7CisJCQkJfSBlbHNlIHsKKwkJCQkJQ09OVjJESUFNXzMyQiggQXV0aG9yaXphdGlvbl9MaWZldGltZSApOworCQkJCQkvKiBBbmQgYWRkIHRoaXMgYWRkaXRpb25hbCBBVlAgKi8KKwkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIGNzLT5kaWN0LlJlX0F1dGhfUmVxdWVzdF9UeXBlLCAwLCAmYXZwICkgKTsKKwkJCQkJdmFsdWUudTMyID0gQUNWX0FSVF9BVVRIT1JJWkVfQVVUSEVOVElDQVRFOworCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUgKCBhdnAsICZ2YWx1ZSApICk7CisJCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQgKCAqZGlhbV9mdywgTVNHX0JSV19MQVNUX0NISUxELCBhdnApICk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJCQorCQkJY2FzZSBSQURJVVNfQVRUUl9JRExFX1RJTUVPVVQ6CisJCQkJQ09OVjJESUFNXzMyQiggSWRsZV9UaW1lb3V0ICk7CisJCQkJYnJlYWs7CisJCQkKKwkJCWNhc2UgUkFESVVTX0FUVFJfVEVSTUlOQVRJT05fQUNUSU9OOgorCQkJCS8qIEp1c3QgcmVtb3ZlICovCisJCQkJYnJlYWs7CisJCQkKKwkJCWNhc2UgUkFESVVTX0FUVFJfQ0FMTEVEX1NUQVRJT05fSUQ6CisJCQkJQ09OVjJESUFNX1NUUiggQ2FsbGVkX1N0YXRpb25fSWQgKTsKKwkJCQlicmVhazsKKwkJCQorCQkJY2FzZSBSQURJVVNfQVRUUl9DQUxMSU5HX1NUQVRJT05fSUQ6CisJCQkJQ09OVjJESUFNX1NUUiggQ2FsbGluZ19TdGF0aW9uX0lkICk7CisJCQkJYnJlYWs7CisJCQkKKwkJCWNhc2UgUkFESVVTX0FUVFJfTkFTX0lERU5USUZJRVI6CisJCQkJQ09OVjJESUFNX1NUUiggTkFTX0lkZW50aWZpZXIgKTsKKwkJCQlicmVhazsKKwkJCQorCQkJLyogUHJveHktU3RhdGUgaXMgaGFuZGxlZCBieSBlY2hvX2Ryb3Aucmd3eCBwbHVnaW4sIHdlIGlnbm9yZSBpdCBoZXJlICovCisJCQkKKwkJCWNhc2UgUkFESVVTX0FUVFJfTE9HSU5fTEFUX1NFUlZJQ0U6CisJCQkJQ09OVjJESUFNX1NUUiggTG9naW5fTEFUX1NlcnZpY2UgKTsKKwkJCQlicmVhazsKKwkJCQorCQkJY2FzZSBSQURJVVNfQVRUUl9MT0dJTl9MQVRfTk9ERToKKwkJCQlDT05WMkRJQU1fU1RSKCBMb2dpbl9MQVRfTm9kZSApOworCQkJCWJyZWFrOworCQkJCisJCQljYXNlIFJBRElVU19BVFRSX0xPR0lOX0xBVF9HUk9VUDoKKwkJCQlDT05WMkRJQU1fU1RSKCBMb2dpbl9MQVRfR3JvdXAgKTsKKwkJCQlicmVhazsKKwkJCQorCQkJY2FzZSBSQURJVVNfQVRUUl9GUkFNRURfQVBQTEVUQUxLX0xJTks6CisJCQkJQ09OVjJESUFNXzMyQiggRnJhbWVkX0FwcGxlVGFsa19MaW5rICk7CisJCQkJYnJlYWs7CisJCQkJCisJCQljYXNlIFJBRElVU19BVFRSX0ZSQU1FRF9BUFBMRVRBTEtfTkVUV09SSzoKKwkJCQlDT05WMkRJQU1fMzJCKCBGcmFtZWRfQXBwbGVUYWxrX05ldHdvcmsgKTsKKwkJCQlicmVhazsKKwkJCQkKKwkJCWNhc2UgUkFESVVTX0FUVFJfRlJBTUVEX0FQUExFVEFMS19aT05FOgorCQkJCUNPTlYyRElBTV9TVFIoIEZyYW1lZF9BcHBsZVRhbGtfWm9uZSApOworCQkJCWJyZWFrOworCQkJCisJCQljYXNlIFJBRElVU19BVFRSX0FDQ1RfU1RBVFVTX1RZUEU6CisJCQkJLyoKKwkJCQkgICAgICAtICBJZiB0aGUgUkFESVVTIG1lc3NhZ2UgcmVjZWl2ZWQgaXMgYW4gQWNjb3VudGluZy1SZXF1ZXN0LCB0aGUKKyAgICAgICAgCQkJCSBBY2N0LVN0YXR1cy1UeXBlIGF0dHJpYnV0ZSB2YWx1ZSBtdXN0IGJlIGNvbnZlcnRlZCB0byBhCisgICAgICAgIAkJCQkgQWNjb3VudGluZy1SZWNvcmQtVHlwZSBBVlAgdmFsdWUuICBJZiB0aGUgQWNjdC1TdGF0dXMtVHlwZQorICAgICAgICAJCQkJIGF0dHJpYnV0ZSB2YWx1ZSBpcyBTVE9QLCB0aGUgbG9jYWwgc2VydmVyIE1VU1QgaXNzdWUgYQorICAgICAgICAJCQkJIFNlc3Npb24tVGVybWluYXRpb24tUmVxdWVzdCBtZXNzYWdlIG9uY2UgdGhlIERpYW1ldGVyCisgICAgICAgIAkJCQkgQWNjb3VudGluZy1BbnN3ZXIgbWVzc2FnZSBoYXMgYmVlbiByZWNlaXZlZC4KKwkJCQkqLworCQkJCXN3aXRjaCAoc3RhdHVzX3R5cGUpIHsKKwkJCQkJY2FzZSBSQURJVVNfQUNDVF9TVEFUVVNfVFlQRV9TVEFSVDoKKwkJCQkJCXZhbHVlLnUzMiA9IEFDVl9BUlRfU1RBUlRfUkVDT1JEOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgUkFESVVTX0FDQ1RfU1RBVFVTX1RZUEVfU1RPUDoKKwkJCQkJCXZhbHVlLnUzMiA9IEFDVl9BUlRfU1RPUF9SRUNPUkQ7CisJCQkJCQlzZW5kX3N0ciA9IDE7IC8qIFJlZ2lzdGVyIHRoaXMgaW5mbyBpbiB0aGUgc2Vzc2lvbiAqLworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgUkFESVVTX0FDQ1RfU1RBVFVTX1RZUEVfSU5URVJJTV9VUERBVEU6CisJCQkJCQl2YWx1ZS51MzIgPSBBQ1ZfQVJUX0lOVEVSSU1fUkVDT1JEOworCQkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQ6CisJCQkJCQlUUkFDRV9ERUJVRyhJTkZPLCAiVW5rbm93biBSQURJVVNfQVRUUl9BQ0NUX1NUQVRVU19UWVBFIHZhbHVlICVkLCBhYm9ydGluZy4uLiIsIHN0YXR1c190eXBlKTsKKwkJCQkJCXJldHVybiBFTk9UU1VQOworCQkJCX0KKwkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3ICggY3MtPmRpY3QuQWNjb3VudGluZ19SZWNvcmRfVHlwZSwgMCwgJmF2cCApICk7CisJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX3NldHZhbHVlICggYXZwLCAmdmFsdWUgKSApOworCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQgKCAqZGlhbV9mdywgTVNHX0JSV19MQVNUX0NISUxELCBhdnApICk7CisJCQkJCisJCQkJLyogV2hpbGUgaGVyZSwgd2UgYWxzbyBhZGQgdGhlIEFjY291dGluZy1SZWNvcmQtTnVtYmVyIEFWUC4KKwkJCQkJICBUaGUgQWNjb3VudGluZy1SZWNvcmQtTnVtYmVyIEFWUCAoQVZQIENvZGUgNDg1KSBpcyBvZiB0eXBlIFVuc2lnbmVkMzIKKwkJCQkJICAgYW5kIGlkZW50aWZpZXMgdGhpcyByZWNvcmQgd2l0aGluIG9uZSBzZXNzaW9uLiAgQXMgU2Vzc2lvbi1JZCBBVlBzCisJCQkJCSAgIGFyZSBnbG9iYWxseSB1bmlxdWUsIHRoZSBjb21iaW5hdGlvbiBvZiBTZXNzaW9uLUlkIGFuZCBBY2NvdW50aW5nLQorCQkJCQkgICBSZWNvcmQtTnVtYmVyIEFWUHMgaXMgYWxzbyBnbG9iYWxseSB1bmlxdWUsIGFuZCBjYW4gYmUgdXNlZCBpbgorCQkJCQkgICBtYXRjaGluZyBhY2NvdW50aW5nIHJlY29yZHMgd2l0aCBjb25maXJtYXRpb25zLiAgQW4gZWFzeSB3YXkgdG8KKwkJCQkJICAgcHJvZHVjZSB1bmlxdWUgbnVtYmVycyBpcyB0byBzZXQgdGhlIHZhbHVlIHRvIDAgZm9yIHJlY29yZHMgb2YgdHlwZQorCQkJCQkgICBFVkVOVF9SRUNPUkQgYW5kIFNUQVJUX1JFQ09SRCwgYW5kIHNldCB0aGUgdmFsdWUgdG8gMSBmb3IgdGhlIGZpcnN0CisJCQkJCSAgIElOVEVSSU1fUkVDT1JELCAyIGZvciB0aGUgc2Vjb25kLCBhbmQgc28gb24gdW50aWwgdGhlIHZhbHVlIGZvcgorCQkJCQkgICBTVE9QX1JFQ09SRCBpcyBvbmUgbW9yZSB0aGFuIGZvciB0aGUgbGFzdCBJTlRFUklNX1JFQ09SRC4KKwkJCQkJICAgCisJCQkJICAtLSB3ZSBhY3R1YWxseSB1c2UgdGhlIGVuZC10by1lbmQgaWQgb2YgdGhlIG1lc3NhZ2UgaGVyZSwgd2hpY2ggcmVtYWlucyBjb25zdGFudAorCQkJCSAgICBpZiB3ZSBzZW5kIGEgZHVwbGljYXRlLCBzbyBpdCBoYXMgdGhlIHNhbWUgcHJvcGVydGllcyBhcyB0aGUgc3VnZ2VzdGVkIGFsZ29yaXRobS4KKwkJCQkgICAgQW55d2F5LCBpdCBhc3N1bWVzIHRoYXQgd2UgYXJlIG5vdCBjb252ZXJ0aW5nIHR3aWNlIHRoZSBzYW1lIFJBRElVUyBtZXNzYWdlLgorCQkJCSAgIC4gKi8KKwkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3ICggY3MtPmRpY3QuQWNjb3VudGluZ19SZWNvcmRfTnVtYmVyLCAwLCAmYXZwICkgKTsKKwkJCQl2YWx1ZS51MzIgPSBlMmVpZDsKKwkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUgKCBhdnAsICZ2YWx1ZSApICk7CisJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCAoICpkaWFtX2Z3LCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCkgKTsKKwkJCQkKKwkJCQlicmVhazsKKwkJCQorCQkJY2FzZSBSQURJVVNfQVRUUl9BQ0NUX0RFTEFZX1RJTUU6CisJCQkJQ09OVjJESUFNXzMyQiggQWNjdF9EZWxheV9UaW1lICk7CisJCQkJYnJlYWs7CisJCQkJCisJCQkvKgorCQkJICAgICAgLSAgSWYgdGhlIFJBRElVUyBtZXNzYWdlIGNvbnRhaW5zIHRoZSBBY2NvdW50aW5nLUlucHV0LU9jdGV0cywKKyAgICAgICAgCQkJIEFjY291bnRpbmctSW5wdXQtUGFja2V0cywgQWNjb3VudGluZy1PdXRwdXQtT2N0ZXRzLCBvcgorICAgICAgICAJCQkgQWNjb3VudGluZy1PdXRwdXQtUGFja2V0cywgdGhlc2UgYXR0cmlidXRlcyBtdXN0IGJlIGNvbnZlcnRlZAorICAgICAgICAJCQkgdG8gdGhlIERpYW1ldGVyIGVxdWl2YWxlbnRzLiAgRnVydGhlciwgaWYgdGhlIEFjY3QtSW5wdXQtCisgICAgICAgIAkJCSBHaWdhd29yZHMgb3IgQWNjdC1PdXRwdXQtR2lnYXdvcmRzIGF0dHJpYnV0ZXMgYXJlIHByZXNlbnQsCisgICAgICAgIAkJCSB0aGVzZSBtdXN0IGJlIHVzZWQgdG8gcHJvcGVybHkgY29tcHV0ZSB0aGUgRGlhbWV0ZXIgYWNjb3VudGluZworICAgICAgICAJCQkgQVZQcy4KKwkJCSovCisJCQljYXNlIFJBRElVU19BVFRSX0FDQ1RfSU5QVVRfT0NURVRTOgorCQkJCW1lbXNldCgmdmFsdWUsIDAsIHNpemVvZih2YWx1ZSkpOworCQkJCXsKKwkJCQkJdWludDhfdCAqIHYgPSAodWludDhfdCAqKShhdHRyICsgMSk7CisJCQkJCXZhbHVlLnU2NCAgPSAodlswXSA8PCAyNCkKKwkJCQkJICAgICAgICAgICB8ICh2WzFdIDw8IDE2KQorCQkJCQkgICAgICAgICAgIHwgKHZbMl0gPDwgIDgpCisJCQkJCSAgICAgICAgICAgfCAgdlszXSA7CisJCQkJfQorCQkJCXZhbHVlLnU2NCArPSAoKHVpbnQ2NF90KWdpZ2F3b3Jkc19pbiA8PCAzMik7CisJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIGNzLT5kaWN0LkFjY291bnRpbmdfSW5wdXRfT2N0ZXRzLCAwLCAmYXZwICkgKTsKKwkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUgKCBhdnAsICZ2YWx1ZSApICk7CisJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCAoICpkaWFtX2Z3LCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCkgKTsKKwkJCQlicmVhazsKKwkJCQkKKwkJCWNhc2UgUkFESVVTX0FUVFJfQUNDVF9PVVRQVVRfT0NURVRTOgorCQkJCW1lbXNldCgmdmFsdWUsIDAsIHNpemVvZih2YWx1ZSkpOworCQkJCXsKKwkJCQkJdWludDhfdCAqIHYgPSAodWludDhfdCAqKShhdHRyICsgMSk7CisJCQkJCXZhbHVlLnU2NCAgPSAodlswXSA8PCAyNCkKKwkJCQkJICAgICAgICAgICB8ICh2WzFdIDw8IDE2KQorCQkJCQkgICAgICAgICAgIHwgKHZbMl0gPDwgIDgpCisJCQkJCSAgICAgICAgICAgfCAgdlszXSA7CisJCQkJfQorCQkJCXZhbHVlLnU2NCArPSAoKHVpbnQ2NF90KWdpZ2F3b3Jkc19vdXQgPDwgMzIpOworCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBjcy0+ZGljdC5BY2NvdW50aW5nX091dHB1dF9PY3RldHMsIDAsICZhdnAgKSApOworCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9zZXR2YWx1ZSAoIGF2cCwgJnZhbHVlICkgKTsKKwkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkICggKmRpYW1fZncsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwKSApOworCQkJCWJyZWFrOworCQkJCQorCQkJY2FzZSBSQURJVVNfQVRUUl9BQ0NUX1NFU1NJT05fSUQ6CisJCQkJQ09OVjJESUFNX1NUUiggQWNjdF9TZXNzaW9uX0lkICk7CisJCQkJYnJlYWs7CisJCQkJCisJCQljYXNlIFJBRElVU19BVFRSX0FDQ1RfQVVUSEVOVElDOgorCQkJCUNPTlYyRElBTV8zMkIoIEFjY3RfQXV0aGVudGljICk7CisJCQkJYnJlYWs7CisJCQkJCisJCQljYXNlIFJBRElVU19BVFRSX0FDQ1RfU0VTU0lPTl9USU1FOgorCQkJCUNPTlYyRElBTV8zMkIoIEFjY3RfU2Vzc2lvbl9UaW1lICk7CisJCQkJYnJlYWs7CisJCQkJCisJCQljYXNlIFJBRElVU19BVFRSX0FDQ1RfSU5QVVRfUEFDS0VUUzoKKwkJCQltZW1zZXQoJnZhbHVlLCAwLCBzaXplb2YodmFsdWUpKTsKKwkJCQl7CisJCQkJCXVpbnQ4X3QgKiB2ID0gKHVpbnQ4X3QgKikoYXR0ciArIDEpOworCQkJCQl2YWx1ZS51NjQgID0gKHZbMF0gPDwgMjQpCisJCQkJCSAgICAgICAgICAgfCAodlsxXSA8PCAxNikKKwkJCQkJICAgICAgICAgICB8ICh2WzJdIDw8ICA4KQorCQkJCQkgICAgICAgICAgIHwgIHZbM10gOworCQkJCX0KKwkJCQkvKiB2YWx1ZS51NjQgKz0gKGdpZ2F3b3Jkc19pbiA8PCAzMik7ICovCisJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIGNzLT5kaWN0LkFjY291bnRpbmdfSW5wdXRfUGFja2V0cywgMCwgJmF2cCApICk7CisJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX3NldHZhbHVlICggYXZwLCAmdmFsdWUgKSApOworCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQgKCAqZGlhbV9mdywgTVNHX0JSV19MQVNUX0NISUxELCBhdnApICk7CisJCQkJYnJlYWs7CisJCQkJCisJCQljYXNlIFJBRElVU19BVFRSX0FDQ1RfT1VUUFVUX1BBQ0tFVFM6CisJCQkJbWVtc2V0KCZ2YWx1ZSwgMCwgc2l6ZW9mKHZhbHVlKSk7CisJCQkJeworCQkJCQl1aW50OF90ICogdiA9ICh1aW50OF90ICopKGF0dHIgKyAxKTsKKwkJCQkJdmFsdWUudTY0ICA9ICh2WzBdIDw8IDI0KQorCQkJCQkgICAgICAgICAgIHwgKHZbMV0gPDwgMTYpCisJCQkJCSAgICAgICAgICAgfCAodlsyXSA8PCAgOCkKKwkJCQkJICAgICAgICAgICB8ICB2WzNdIDsKKwkJCQl9CisJCQkJLyogdmFsdWUudTY0ICs9IChnaWdhd29yZHNfb3V0IDw8IDMyKTsgKi8KKwkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3ICggY3MtPmRpY3QuQWNjb3VudGluZ19PdXRwdXRfUGFja2V0cywgMCwgJmF2cCApICk7CisJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX3NldHZhbHVlICggYXZwLCAmdmFsdWUgKSApOworCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQgKCAqZGlhbV9mdywgTVNHX0JSV19MQVNUX0NISUxELCBhdnApICk7CisJCQkJYnJlYWs7CisJCQkJCisJCQkvKgorCQkJICAgICAgLSAgSWYgdGhlIEFjY291bnRpbmcgbWVzc2FnZSBjb250YWlucyBhbiBBY2N0LVRlcm1pbmF0aW9uLUNhdXNlCisgICAgICAgIAkJCSBhdHRyaWJ1dGUsIGl0IHNob3VsZCBiZSB0cmFuc2xhdGVkIHRvIHRoZSBlcXVpdmFsZW50CisgICAgICAgIAkJCSBUZXJtaW5hdGlvbi1DYXVzZSBBVlAgdmFsdWUuCisJCQkqLworCQkJY2FzZSBSQURJVVNfQVRUUl9BQ0NUX1RFUk1JTkFURV9DQVVTRToKKwkJCQkvKiByZmM0MDA1I3NlY3Rpb24tOS4zLjUgKi8KKwkJCQl7CisJCQkJCXVpbnQ4X3QgKiB2ID0gKHVpbnQ4X3QgKikoYXR0ciArIDEpOworCQkJCQlzdHJfY2F1c2UgID0gKHZbMF0gPDwgMjQpCisJCQkJCSAgICAgICAgICAgfCAodlsxXSA8PCAxNikKKwkJCQkJICAgICAgICAgICB8ICh2WzJdIDw8ICA4KQorCQkJCQkgICAgICAgICAgIHwgIHZbM10gOworCQkJCX0KKwkJCQlzdHJfY2F1c2UgKz0gMTA7IC8qIFRoaXMgc2VlbXMgdG8gYmUgdGhlIHJ1bGUsIHdlIGNhbiBtb2RpZnkgbGF0ZXIgaWYgbmVlZGVkICovCisJCQkJYnJlYWs7CisKKwkJCWNhc2UgUkFESVVTX0FUVFJfQUNDVF9NVUxUSV9TRVNTSU9OX0lEOgorCQkJCUNPTlYyRElBTV9TVFIoIEFjY3RfTXVsdGlfU2Vzc2lvbl9JZCApOworCQkJCWJyZWFrOworCQkJCQorCQkJY2FzZSBSQURJVVNfQVRUUl9BQ0NUX0xJTktfQ09VTlQ6CisJCQkJQ09OVjJESUFNXzMyQiggQWNjdF9MaW5rX0NvdW50ICk7CisJCQkJYnJlYWs7CisJCQkJCisJCQkvKiBDSEFQLUNoYWxsZW5nZSBpcyBub3QgcHJlc2VudCBpbiBBY2NvdW50aW5nLVJlcXVlc3QgKi8KKwkJCQorCQkJY2FzZSBSQURJVVNfQVRUUl9OQVNfUE9SVF9UWVBFOgorCQkJCUNPTlYyRElBTV8zMkIoIE5BU19Qb3J0X1R5cGUgKTsKKwkJCQlicmVhazsKKwkJCQorCQkJY2FzZSBSQURJVVNfQVRUUl9QT1JUX0xJTUlUOgorCQkJCUNPTlYyRElBTV8zMkIoIFBvcnRfTGltaXQgKTsKKwkJCQlicmVhazsKKwkJCQorCQkJY2FzZSBSQURJVVNfQVRUUl9MT0dJTl9MQVRfUE9SVDoKKwkJCQlDT05WMkRJQU1fU1RSKCBMb2dpbl9MQVRfUG9ydCApOworCQkJCWJyZWFrOworCQkJCisJCQkvKiBSRkMgMzE2MiAqLwkKKwkJCWNhc2UgUkFESVVTX0FUVFJfTkFTX0lQVjZfQUREUkVTUzoKKwkJCQlDT05WMkRJQU1fU1RSKCBOQVNfSVB2Nl9BZGRyZXNzICk7CisJCQkJYnJlYWs7CisJCQkJCisJCQljYXNlIFJBRElVU19BVFRSX0ZSQU1FRF9JTlRFUkZBQ0VfSUQ6CisJCQkJQ09OVjJESUFNXzY0QiggRnJhbWVkX0ludGVyZmFjZV9JZCApOworCQkJCWJyZWFrOworCQkJCQorCQkJY2FzZSBSQURJVVNfQVRUUl9GUkFNRURfSVBWNl9QUkVGSVg6CisJCQkJQ09OVjJESUFNX1NUUiggRnJhbWVkX0lQdjZfUHJlZml4ICk7CisJCQkJYnJlYWs7CisJCQkJCisJCQljYXNlIFJBRElVU19BVFRSX0xPR0lOX0lQVjZfSE9TVDoKKwkJCQlDT05WMkRJQU1fU1RSKCBMb2dpbl9JUHY2X0hvc3QgKTsKKwkJCQlicmVhazsKKwkJCQkKKwkJCWNhc2UgUkFESVVTX0FUVFJfRlJBTUVEX0lQVjZfUk9VVEU6CisJCQkJQ09OVjJESUFNX1NUUiggRnJhbWVkX0lQdjZfUm91dGUgKTsKKwkJCQlicmVhazsKKwkJCQkKKwkJCWNhc2UgUkFESVVTX0FUVFJfRlJBTUVEX0lQVjZfUE9PTDoKKwkJCQlDT05WMkRJQU1fU1RSKCBGcmFtZWRfSVB2Nl9Qb29sICk7CisJCQkJYnJlYWs7CisJCQkJCisJCQkvKiBSRkMgMjg2OCAqLworCQkJLyogUHJlcGFyZSB0aGUgdG9wLWxldmVsIFR1bm5lbGluZyBBVlAgZm9yIGVhY2ggdGFnIHZhbHVlcywgYXMgbmVlZGVkLCBhbmQgYWRkIHRvIHRoZSBEaWFtZXRlciBtZXNzYWdlLgorCQkJCVRoaXMgbWFjcm8gaXMgY2FsbGVkIHdoZW4gYW4gQVZQIGlzIGFkZGVkIGluc2lkZSB0aGUgZ3JvdXAsIHNvIHdlIHdpbGwgbm90IGhhdmUgZW1wdHkgZ3JvdXBlZCBBVlBzICovCisJCQkjZGVmaW5lIEFWUF9UVU5fUFJFUEFSRSgpIHsJCQkJCQkJCQkJXAorCQkJCQkJaWYgKGF2cF90dW4gPT0gTlVMTCkgewkJCQkJCQkJXAorCQkJCQkJCUNIRUNLX01BTExPQyggYXZwX3R1biA9IGNhbGxvYyhzaXplb2Yoc3RydWN0IGF2cCAqKSwgMzIgKSApOwkJXAorCQkJCQkJfQkJCQkJCQkJCQlcCisJCQkJCQl0YWcgPSAqKHVpbnQ4X3QgKikoYXR0ciArIDEpOwkJCQkJCQlcCisJCQkJCQlpZiAodGFnID4gMHgxRikgdGFnID0gMDsJCQkJCQkJXAorCQkJCQkJaWYgKGF2cF90dW5bdGFnXSA9PSBOVUxMKSB7CQkJCQkJCVwKKwkJCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3ICggY3MtPmRpY3QuVHVubmVsaW5nLCAwLCAmYXZwX3R1blt0YWddICkgKTsJXAorCQkJCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQgKCpkaWFtX2Z3LCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cF90dW5bdGFnXSkpO1wKKwkJCQkJCX0JCQkJCQkJCQkJXAorCQkJCQl9CisJCQkKKwkJCS8qIENvbnZlcnQgYW4gYXR0cmlidXRlIHRvIGFuIE9jdGV0U3RyaW5nIEFWUCBhbmQgYWRkIGluc2lkZSB0aGUgVHVubmVsaW5nIEFWUCBjb3JyZXNwb25kaW5nIHRvIHRoZSB0YWcgKi8KKwkJCSNkZWZpbmUgQ09OVjJESUFNX1RVTl9TVFIoIF9kaWN0b2JqXyApIHsJCQkJCQlcCisJCQkJdWludDhfdCB0YWc7CQkJCQkJCQkJXAorCQkJCUNIRUNLX1BBUkFNUyggYXR0ci0+bGVuZ3RoID49IDMpOwkJCQkJCVwKKwkJCQlBVlBfVFVOX1BSRVBBUkUoKTsJCQkJCQkJCVwKKwkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3ICggY3MtPmRpY3QuX2RpY3RvYmpfLCAwLCAmYXZwICkgKTsJCQlcCisJCQkJdmFsdWUub3MubGVuID0gYXR0ci0+bGVuZ3RoIC0gKHRhZyA/IDMgOiAyKTsJCQkJCVwKKwkJCQl2YWx1ZS5vcy5kYXRhID0gKCh1bnNpZ25lZCBjaGFyICopKGF0dHIgKyAxKSkgKyAodGFnID8gMSA6IDApOwkJCVwKKwkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUgKCBhdnAsICZ2YWx1ZSApICk7CQkJCVwKKwkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkICggYXZwX3R1blt0YWddLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCkgKTsJCVwKKwkJCQl9CisJCQkJCisJCQkvKiBDb252ZXJ0IGFuIGF0dHJpYnV0ZSB0byBhIHNjYWxhciBBVlAgYW5kIGFkZCBpbnNpZGUgdGhlIFR1bm5lbGluZyBBVlAgY29ycmVzcG9uZGluZyB0byB0aGUgdGFnICovCisJCQkjZGVmaW5lIENPTlYyRElBTV9UVU5fMjRCKCBfZGljdG9ial8gKSB7CQkJCQkJXAorCQkJCXVpbnQ4X3QgdGFnOwkJCQkJCQkJCVwKKwkJCQlDSEVDS19QQVJBTVMoIGF0dHItPmxlbmd0aCA9PSA2KTsJCQkJCQlcCisJCQkJQVZQX1RVTl9QUkVQQVJFKCk7CQkJCQkJCQlcCisJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIGNzLT5kaWN0Ll9kaWN0b2JqXywgMCwgJmF2cCApICk7CQkJXAorCQkJCXsJCQkJCQkJCQkJXAorCQkJCQl1aW50OF90ICogdiA9ICh1aW50OF90ICopKGF0dHIgKyAxKTsJCQkJCVwKKwkJCQkJdmFsdWUudTMyID0gKHZbMV0gPDwgMTYpIHwgKHZbMl0gPDw4KSB8IHZbM10gOwkJCQlcCisJCQkJfQkJCQkJCQkJCQlcCisJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX3NldHZhbHVlICggYXZwLCAmdmFsdWUgKSApOwkJCQlcCisJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCAoIGF2cF90dW5bdGFnXSwgTVNHX0JSV19MQVNUX0NISUxELCBhdnApICk7CQlcCisJCQkJfQorCisJCQkvKgorCQkJICAgICAgLSAgSWYgdGhlIFJBRElVUyBtZXNzYWdlIGNvbnRhaW5zIFR1bm5lbCBpbmZvcm1hdGlvbiBbUkFEVHVubmVsc10sCisgICAgICAgIAkJCSB0aGUgYXR0cmlidXRlcyBvciB0YWdnZWQgZ3JvdXBzIHNob3VsZCBlYWNoIGJlIGNvbnZlcnRlZCB0byBhCisgICAgICAgIAkJCSBEaWFtZXRlciBUdW5uZWxpbmcgR3JvdXBlZCBBVlAgc2V0LiAgSWYgdGhlIHR1bm5lbCBpbmZvcm1hdGlvbgorICAgICAgICAJCQkgY29udGFpbnMgYSBUdW5uZWwtUGFzc3dvcmQgYXR0cmlidXRlLCB0aGUgUkFESVVTIGVuY3J5cHRpb24KKyAgICAgICAgCQkJIG11c3QgYmUgcmVzb2x2ZWQsIGFuZCB0aGUgcGFzc3dvcmQgZm9yd2FyZGVkLCBieSB1c2luZyBEaWFtZXRlcgorICAgICAgICAJCQkgc2VjdXJpdHkgbWV0aG9kcy4KKwkJCQkgICAgLT4gSWYgdGhlIFJBRElVUyBtZXNzYWdlIGRvZXMgbm90IHVzZSBwcm9wZXJseSB0aGUgVGFnIGluZm8sIHJlc3VsdCBpcyB1bnByZWRpY3RhYmxlIGhlcmUuLiAKKwkJCSovCisJCQljYXNlIFJBRElVU19BVFRSX1RVTk5FTF9UWVBFOgorCQkJCUNPTlYyRElBTV9UVU5fMjRCKCBUdW5uZWxfVHlwZSApOworCQkJCWJyZWFrOworCQkJCisJCQljYXNlIFJBRElVU19BVFRSX1RVTk5FTF9NRURJVU1fVFlQRToKKwkJCQlDT05WMkRJQU1fVFVOXzI0QiggVHVubmVsX01lZGl1bV9UeXBlICk7CisJCQkJYnJlYWs7CisJCQkKKwkJCWNhc2UgUkFESVVTX0FUVFJfVFVOTkVMX0NMSUVOVF9FTkRQT0lOVDoKKwkJCQlDT05WMkRJQU1fVFVOX1NUUiggVHVubmVsX0NsaWVudF9FbmRwb2ludCApOworCQkJCWJyZWFrOworCQkJCisJCQljYXNlIFJBRElVU19BVFRSX1RVTk5FTF9TRVJWRVJfRU5EUE9JTlQ6CisJCQkJQ09OVjJESUFNX1RVTl9TVFIoIFR1bm5lbF9TZXJ2ZXJfRW5kcG9pbnQgKTsKKwkJCQlicmVhazsKKwkJCQorCQkJLyogVHVubmVsLVBhc3N3b3JkIG5ldmVyIHByZXNlbnQgaW4gYW4gQWNjb3VudGluZy1SZXF1ZXN0ICovCisKKwkJCWNhc2UgUkFESVVTX0FUVFJfVFVOTkVMX1BSSVZBVEVfR1JPVVBfSUQ6CisJCQkJQ09OVjJESUFNX1RVTl9TVFIoIFR1bm5lbF9Qcml2YXRlX0dyb3VwX0lkICk7CisJCQkJYnJlYWs7CisJCQkKKwkJCWNhc2UgUkFESVVTX0FUVFJfVFVOTkVMX0FTU0lHTk1FTlRfSUQ6CisJCQkJQ09OVjJESUFNX1RVTl9TVFIoIFR1bm5lbF9Bc3NpZ25tZW50X0lkICk7CisJCQkJYnJlYWs7CisJCQkKKwkJCS8qIFR1bm5lbC1SZWZlcmVuY2UgbmV2ZXIgcHJlc2VudCBpbiBhbiBBY2NvdW50aW5nLVJlcXVlc3QgKi8KKwkJCQorCQkJY2FzZSBSQURJVVNfQVRUUl9UVU5ORUxfQ0xJRU5UX0FVVEhfSUQ6CisJCQkJQ09OVjJESUFNX1RVTl9TVFIoIFR1bm5lbF9DbGllbnRfQXV0aF9JZCApOworCQkJCWJyZWFrOworCQkJCisJCQljYXNlIFJBRElVU19BVFRSX1RVTk5FTF9TRVJWRVJfQVVUSF9JRDoKKwkJCQlDT05WMkRJQU1fVFVOX1NUUiggVHVubmVsX1NlcnZlcl9BdXRoX0lkICk7CisJCQkJYnJlYWs7CisJCQkKKwkJLyogUkZDIDI4NjkgKi8KKwkJCS8qCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjY3QtSW5wdXQtR2lnYXdvcmRzLCBBY2N0LU91dHB1dC0KKwkJCSAgIEdpZ2F3b3JkcywgRXZlbnQtVGltZXN0YW1wLCBhbmQgTkFTLVBvcnQtSWQgbWF5IGhhdmUgMC0xIGluc3RhbmNlcyBpbgorCQkJICAgYW4gQWNjb3VudGluZy1SZXF1ZXN0IHBhY2tldC4gIENvbm5lY3QtSW5mbyBtYXkgaGF2ZSAwKyBpbnN0YW5jZXMgaW4KKwkJCSAgIGFuIEFjY291bnRpbmctUmVxdWVzdCBwYWNrZXQuICBUaGUgb3RoZXIgYXR0cmlidXRlcyBhZGRlZCBpbiB0aGlzCisJCQkgICBkb2N1bWVudCBtdXN0IG5vdCBiZSBwcmVzZW50IGluIGFuIEFjY291bnRpbmctUmVxdWVzdC4KKwkJCSovCisJCQljYXNlIFJBRElVU19BVFRSX0FDQ1RfSU5QVVRfR0lHQVdPUkRTOgorCQkJCWJyZWFrOyAvKiB3ZSBhbHJlYWR5IHNhdmVkIHRoZSB2YWx1ZSBpbiBnaWdhd29yZHNfaW4gKi8KKwkJCQkKKwkJCWNhc2UgUkFESVVTX0FUVFJfQUNDVF9PVVRQVVRfR0lHQVdPUkRTOgorCQkJCWJyZWFrOyAvKiB3ZSBhbHJlYWR5IHNhdmVkIHRoZSB2YWx1ZSBpbiBnaWdhd29yZHNfb3V0ICovCisJCQkJCisJCQljYXNlIFJBRElVU19BVFRSX0VWRU5UX1RJTUVTVEFNUDoKKwkJCQkvKiBSQURJVVM6IAorCQkJCSAgICAgIFRoZSBWYWx1ZSBmaWVsZCBpcyBmb3VyIG9jdGV0cyBlbmNvZGluZyBhbiB1bnNpZ25lZCBpbnRlZ2VyIHdpdGgKKwkJCQkgICAgICB0aGUgbnVtYmVyIG9mIHNlY29uZHMgc2luY2UgSmFudWFyeSAxLCAxOTcwIDAwOjAwIFVUQy4KKwkJCQkgICBEaWFtZXRlcjoKKwkJCQkgICAgICBUaGUgVGltZSBmb3JtYXQgaXMgZGVyaXZlZCBmcm9tIHRoZSBPY3RldFN0cmluZyBBVlAgQmFzZSBGb3JtYXQuCisJCQkJICAgICAgVGhlIHN0cmluZyBNVVNUIGNvbnRhaW4gZm91ciBvY3RldHMsIGluIHRoZSBzYW1lIGZvcm1hdCBhcyB0aGUKKwkJCQkgICAgICBmaXJzdCBmb3VyIGJ5dGVzIGFyZSBpbiB0aGUgTlRQIHRpbWVzdGFtcCBmb3JtYXQuICBUaGUgTlRQCisJCQkJICAgICAgVGltZXN0YW1wIGZvcm1hdCBpcyBkZWZpbmVkIGluIENoYXB0ZXIgMyBvZiBbUkZDNDMzMF0uCisKKwkJCQkgICAgICBUaGlzIHJlcHJlc2VudHMgdGhlIG51bWJlciBvZiBzZWNvbmRzIHNpbmNlIDBoIG9uIDEgSmFudWFyeSAxOTAwCisJCQkJICAgICAgd2l0aCByZXNwZWN0IHRvIHRoZSBDb29yZGluYXRlZCBVbml2ZXJzYWwgVGltZSAoVVRDKS4KKwkJCQkgICAgICAKKwkJCQkgICAgICAtLSBSRkM0MzMwOgorCQkJCQkgTlRQIHRpbWVzdGFtcHMgYXJlIHJlcHJlc2VudGVkIGFzIGEgNjQtYml0IHVuc2lnbmVkCisJCQkJCSAgIGZpeGVkLXBvaW50IG51bWJlciwgaW4gc2Vjb25kcyByZWxhdGl2ZSB0byAwaCBvbiAxIEphbnVhcnkgMTkwMC4gIFRoZQorCQkJCQkgICBpbnRlZ2VyIHBhcnQgaXMgaW4gdGhlIGZpcnN0IDMyIGJpdHMsIGFuZCB0aGUgZnJhY3Rpb24gcGFydCBpbiB0aGUKKwkJCQkJICAgbGFzdCAzMiBiaXRzLiAgSW4gdGhlIGZyYWN0aW9uIHBhcnQsIHRoZSBub24tc2lnbmlmaWNhbnQgbG93LW9yZGVyCisJCQkJCSAgIGJpdHMgYXJlIG5vdCBzcGVjaWZpZWQgYW5kIGFyZSBvcmRpbmFyaWx5IHNldCB0byAwLgorCQkJCSovCisJCQkJeworCQkJCQl1aW50MzJfdCB0czsKKwkJCQkJCisJCQkJCXVpbnQ4X3QgKiB2ID0gKHVpbnQ4X3QgKikoYXR0ciArIDEpOworCQkJCQkvKiBSZWFkIHRoZSBSQURJVVMgYXR0cmlidXRlIHZhbHVlICovCisJCQkJCXRzICA9ICh2WzBdIDw8IDI0KQorCQkJCQkgICAgICAgICAgIHwgKHZbMV0gPDwgMTYpCisJCQkJCSAgICAgICAgICAgfCAodlsyXSA8PCAgOCkKKwkJCQkJICAgICAgICAgICB8ICB2WzNdIDsKKwkJCQkJCisJCQkJCS8qIEFkZCB0aGUgNzAgbWlzc2luZyB5ZWFycyAqLworCQkJCQl0cyArPSAyMjA4OTg4ODAwVTsgLyogNjAgKiA2MCAqIDI0ICogKCAzNjUgKiA3MCArIDE3ICkgKi8KKwkJCQkJCisJCQkJCS8qIENvbnZlcnQgdG8gbmV0d29yayBieXRlIG9yZGVyICovCisJCQkJCXRzID0gaHRvbmwodHMpOworCQkJCQkKKwkJCQkJIC8qIERpYW1ldGVyIFRpbWUgZGF0YXR5cGUgaXMgZGVyaXZlZCBmcm9tIE9jdGV0U3RyaW5nICovCisJCQkJCXZhbHVlLm9zLmRhdGEgPSAodm9pZCAqKSAmdHM7CisJCQkJCXZhbHVlLm9zLmxlbiA9IHNpemVvZih1aW50MzJfdCk7CisJCQkJCQorCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3ICggY3MtPmRpY3QuRXZlbnRfVGltZXN0YW1wLCAwLCAmYXZwICkgKTsKKwkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX3NldHZhbHVlICggYXZwLCAmdmFsdWUgKSApOworCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkICggKmRpYW1fZncsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwKSApOworCQkJCX0KKwkJCQlicmVhazsKKwkJCQorCQkJY2FzZSBSQURJVVNfQVRUUl9OQVNfUE9SVF9JRDoKKwkJCQlDT05WMkRJQU1fU1RSKCBOQVNfUG9ydF9JZCApOworCQkJCWJyZWFrOworCQkJCQkJCisJCQljYXNlIFJBRElVU19BVFRSX0NPTk5FQ1RfSU5GTzoKKwkJCQlDT05WMkRJQU1fU1RSKCBDb25uZWN0X0luZm8gKTsKKwkJCQlicmVhazsKKwkJCQorCQkJY2FzZSBSQURJVVNfQVRUUl9GUkFNRURfUE9PTDogLyogVG8gZm9sbG93IHRoZSBJUHY2IHZlcnNpb24gKi8KKwkJCQlDT05WMkRJQU1fU1RSKCBGcmFtZWRfUG9vbCApOworCQkJCWJyZWFrOworCQkJCQorCQkJCisJCS8qIFJGQyAzNTc5ICovCisJCQkvKgorCQkJIFRoZSBFQVAtTWVzc2FnZSBhbmQgTWVzc2FnZS1BdXRoZW50aWNhdG9yIGF0dHJpYnV0ZXMgc3BlY2lmaWVkIGluCisJCQkgICB0aGlzIGRvY3VtZW50IE1VU1QgTk9UIGJlIHByZXNlbnQgaW4gYW4gQWNjb3VudGluZy1SZXF1ZXN0LgorCQkJKi8JCQkJCisJCQljYXNlIFJBRElVU19BVFRSX09SSUdJTkFUSU5HX0xJTkVfSU5GTzoKKwkJCQlDT05WMkRJQU1fU1RSKCBPcmlnaW5hdGluZ19MaW5lX0luZm8gKTsKKwkJCQlicmVhazsKKwkJCQkKKwkJLyogRGVmYXVsdCAqLwkJCisJCQlkZWZhdWx0OiAvKiB1bmtub3duIGF0dHJpYnV0ZSAqLworCQkJCS8qIFdlIGp1c3Qga2VlcCB0aGUgYXR0cmlidXRlIGluIHRoZSBSQURJVVMgbWVzc2FnZSAqLworCQkJCXJhZF9yZXEtPmF0dHJfcG9zW25hdHRyX3VzZWQrK10gPSByYWRfcmVxLT5hdHRyX3Bvc1tpZHhdOworCQl9CisJfQorCQorCS8qIFVwZGF0ZSB0aGUgcmFkaXVzIG1lc3NhZ2UgdG8gcmVtb3ZlIGFsbCBoYW5kbGVkIGF0dHJpYnV0ZXMgKi8KKwlyYWRfcmVxLT5hdHRyX3VzZWQgPSBuYXR0cl91c2VkOworCQorCS8qIFN0b3JlIHVzZWZ1bCBpbmZvcm1hdGlvbiBpbiB0aGUgc2Vzc2lvbiAqLworCXsKKwkJc3RydWN0IHNlc3Nfc3RhdGUgKiBzdDsKKwkJCisJCUNIRUNLX01BTExPQyggc3QgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzZXNzX3N0YXRlKSkgKTsKKwkJbWVtc2V0KHN0LCAwLCBzaXplb2Yoc3RydWN0IHNlc3Nfc3RhdGUpKTsKKwkJc3QtPmF1dGhfYXBwbCA9IGF1dGhfYXBwbDsKKwkJaWYgKGF1dGhfYXBwbCkgeyAvKiBXZSB1c2UgdGhlIHZhbHVlIDAgZm9yIHNlcnZlcnMgd2hpY2ggaW5kaWNhdGVkIE5PIFNUQVRFIE1BSU5UQUlORUQsIGhlbmNlIGhhdmUgbm8gbmVlZCBmb3IgU1RSICovCisJCQlzdC0+c2VuZF9zdHIgPSBzZW5kX3N0cjsKKwkJfQorCQlzdC0+dGVybV9jYXVzZSA9IHN0cl9jYXVzZTsKKwkJQ0hFQ0tfRkNUKCBmZF9zZXNzX3N0YXRlX3N0b3JlKCBjcy0+c2Vzc19oZGwsIHNlc3MsICZzdCApICk7CisJfQorCQorCXJldHVybiAwOworfQorCisvKiBDYWxsYmFjayB3aGVuIGFuIFNUQSBpcyByZWNlaXZlZCBhZnRlciBoYXZpbmcgc2VudCBhbiBTVFIuICovCitzdGF0aWMgdm9pZCBoYW5kbGVfc3RhKHZvaWQgKiBkYXRhLCBzdHJ1Y3QgbXNnICoqIGFuc3dlcikKK3sKKwlzdHJ1Y3Qgcmd3cF9jb25maWcgKiBjcyA9IGRhdGE7CisJc3RydWN0IGF2cCAqYXZwOworCXN0cnVjdCBhdnBfaGRyICphaGRyOworCQorCUNIRUNLX1BBUkFNU19ETyggZGF0YSAmJiBhbnN3ZXIgJiYgKmFuc3dlciwgZ290byBvdXQgKTsKKwkKKwkvKiBDaGVjayB0aGUgRGlhbWV0ZXIgZXJyb3IgY29kZSAqLworCUNIRUNLX0ZDVF9ETyggZmRfbXNnX3NlYXJjaF9hdnAgKCphbnN3ZXIsIGNzLT5kaWN0LlJlc3VsdF9Db2RlLCAmYXZwKSwgZ290byBvdXQgKTsKKwlDSEVDS19QQVJBTVNfRE8oIGF2cCwgZ290byBvdXQgKTsKKwlDSEVDS19GQ1RfRE8oIGZkX21zZ19hdnBfaGRyICggYXZwLCAmYWhkciApLCBnb3RvIG91dCApOworCWlmIChhaGRyLT5hdnBfdmFsdWUtPnUzMiAhPSBFUl9ESUFNRVRFUl9TVUNDRVNTKQorCQlnb3RvIG91dDsKKwkKKwkvKiBPSywgZGlzY2FyZCB0aGUgbWVzc2FnZSB3aXRob3V0IGNvbXBsYWluaW5nICovCisJZmRfbXNnX2ZyZWUoKmFuc3dlcik7CisJKmFuc3dlciA9IE5VTEw7CisJCQorb3V0OgorCWlmIChhbnN3ZXIgJiYgKmFuc3dlcikgeworCQljaGFyICogYnVmID0gTlVMTDsgc2l6ZV90IGJ1ZmxlbjsKKwkJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9tc2dfZHVtcF90cmVldmlldygmYnVmLCAmYnVmbGVuLCBOVUxMLCAqYW5zd2VyLCBOVUxMLCAwLCAxKSwgKTsKKwkJVFJBQ0VfREVCVUcoSU5GTywgIlJlY2VpdmVkIHRoZSBmb2xsb3dpbmcgcHJvYmxlbWF0aWMgU1RBIG1lc3NhZ2UsIGRpc2NhcmRpbmcgYW55d2F5OiAlcyIsIGJ1ZiA/OiAiPGVycm9yPiIpOworCQlmcmVlKGJ1Zik7CisJCQorCQlmZF9tc2dfZnJlZSgqYW5zd2VyKTsKKwkJKmFuc3dlciA9IE5VTEw7CisJfQorCXJldHVybjsKK30KKworc3RhdGljIGludCBhY2N0X2RpYW1fYW5zKCBzdHJ1Y3Qgcmd3cF9jb25maWcgKiBjcywgc3RydWN0IG1zZyAqKiBkaWFtX2Fucywgc3RydWN0IHJhZGl1c19tc2cgKiogcmFkX2Z3LCBzdHJ1Y3Qgcmd3X2NsaWVudCAqIGNsaSApCit7CisJc3RydWN0IHNlc3Npb24gKiBzZXNzOworCXN0cnVjdCBzZXNzX3N0YXRlICogc3QgPSBOVUxMLCBzdGxvYzsKKwlzdHJ1Y3QgYXZwICphdnAsICpuZXh0OworCXN0cnVjdCBhdnBfaGRyICphaGRyLCAqb2gsICpvcjsKKwlvczBfdCBzaWQgPSBOVUxMOworCXNpemVfdCBzaWRsZW47CisJCisJVFJBQ0VfRU5UUlkoIiVwICVwICVwICVwIiwgY3MsIGRpYW1fYW5zLCByYWRfZncsIGNsaSk7CisJQ0hFQ0tfUEFSQU1TKGNzKTsKKwkKKwlDSEVDS19GQ1QoIGZkX21zZ19zZXNzX2dldChmZF9nX2NvbmZpZy0+Y25mX2RpY3QsICpkaWFtX2FucywgJnNlc3MsIE5VTEwpICk7CisJaWYgKHNlc3MpIHsKKwkJQ0hFQ0tfRkNUKCBmZF9zZXNzX3N0YXRlX3JldHJpZXZlKCBjcy0+c2Vzc19oZGwsIHNlc3MsICZzdCApICk7CisJCUNIRUNLX0ZDVCggZmRfc2Vzc19nZXRzaWQoc2VzcywgJnNpZCwgJnNpZGxlbikgKTsKKwl9CisJCisJaWYgKCFzdCkgeworCQlUUkFDRV9ERUJVRyhJTkZPLCAiUmVjZWl2ZWQgYW4gQUNBIHdpdGhvdXQgY29ycmVzcG9uZGluZyBzZXNzaW9uIGluZm9ybWF0aW9uLCBjYW5ub3QgdHJhbnNsYXRlIHRvIFJBRElVUyIpOworCQlyZXR1cm4gRUlOVkFMOworCX0KKwkKKwkvKiBGcmVlIHRoZSBzdGF0ZSAqLworCW1lbWNweSgmc3Rsb2MsIHN0LCBzaXplb2Yoc3RydWN0IHNlc3Nfc3RhdGUpKTsKKwlmcmVlKHN0KTsKKwlzdCA9ICZzdGxvYzsKKwkKKwkvKiBTZWFyY2ggdGhlc2UgQVZQcyBmaXJzdCAqLworCUNIRUNLX0ZDVCggZmRfbXNnX3NlYXJjaF9hdnAgKCpkaWFtX2FucywgY3MtPmRpY3QuT3JpZ2luX0hvc3QsICZhdnApICk7CisJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2hkciAoIGF2cCwgJm9oICkgKTsKKworCUNIRUNLX0ZDVCggZmRfbXNnX3NlYXJjaF9hdnAgKCpkaWFtX2FucywgY3MtPmRpY3QuT3JpZ2luX1JlYWxtLCAmYXZwKSApOworCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9oZHIgKCBhdnAsICZvciApICk7CisKKwkvKiBDaGVjayB0aGUgRGlhbWV0ZXIgZXJyb3IgY29kZSAqLworCUNIRUNLX0ZDVCggZmRfbXNnX3NlYXJjaF9hdnAgKCpkaWFtX2FucywgY3MtPmRpY3QuUmVzdWx0X0NvZGUsICZhdnApICk7CisJQVNTRVJUKCBhdnAgKTsgLyogb3RoZXJ3aXNlIHRoZSBtZXNzYWdlIHNob3VsZCBoYXZlIGJlZW4gZGlzY2FyZGVkIGEgbG90IGVhcmxpZXIgYmVjYXVzZSBvZiBBQk5GICovCisJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2hkciAoIGF2cCwgJmFoZHIgKSApOworCXN3aXRjaCAoYWhkci0+YXZwX3ZhbHVlLT51MzIpIHsKKwkJY2FzZSBFUl9ESUFNRVRFUl9TVUNDRVNTOgorCQljYXNlIEVSX0RJQU1FVEVSX0xJTUlURURfU1VDQ0VTUzoKKwkJCSgqcmFkX2Z3KS0+aGRyLT5jb2RlID0gUkFESVVTX0NPREVfQUNDT1VOVElOR19SRVNQT05TRTsKKwkJCWJyZWFrOworCQkKKwkJZGVmYXVsdDoKKwkJCWZkX2xvZ19kZWJ1ZygiW2FjY3Qucmd3eF0gUmVjZWl2ZWQgRGlhbWV0ZXIgYW5zd2VyIHdpdGggZXJyb3IgY29kZSAnJWQnIGZyb20gc2VydmVyICclLipzJywgc2Vzc2lvbiAlLipzLCBub3QgdHJhbnNsYXRpbmcgaW50byBBY2NvdW50aW5nLVJlc3BvbnNlIiwKKwkJCQkJYWhkci0+YXZwX3ZhbHVlLT51MzIsIAorCQkJCQkoaW50KW9oLT5hdnBfdmFsdWUtPm9zLmxlbiwgb2gtPmF2cF92YWx1ZS0+b3MuZGF0YSwKKwkJCQkJKGludClzaWRsZW4sIHNpZCk7CisJCQlDSEVDS19GQ1QoIGZkX21zZ19zZWFyY2hfYXZwICgqZGlhbV9hbnMsIGNzLT5kaWN0LkVycm9yX01lc3NhZ2UsICZhdnApICk7CisJCQlpZiAoYXZwKSB7CisJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2hkciAoIGF2cCwgJmFoZHIgKSApOworCQkJCWZkX2xvZ19kZWJ1ZygiW2FjY3Qucmd3eF0gICBFcnJvci1NZXNzYWdlIGNvbnRlbnQ6ICclLipzJyIsCisJCQkJCQkoaW50KWFoZHItPmF2cF92YWx1ZS0+b3MubGVuLCBhaGRyLT5hdnBfdmFsdWUtPm9zLmRhdGEpOworCQkJfQorCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfc2VhcmNoX2F2cCAoKmRpYW1fYW5zLCBjcy0+ZGljdC5FcnJvcl9SZXBvcnRpbmdfSG9zdCwgJmF2cCkgKTsKKwkJCWlmIChhdnApIHsKKwkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfaGRyICggYXZwLCAmYWhkciApICk7CisJCQkJZmRfbG9nX2RlYnVnKCJbYWNjdC5yZ3d4XSAgIEVycm9yLVJlcG9ydGluZy1Ib3N0OiAnJS4qcyciLAorCQkJCQkJKGludClhaGRyLT5hdnBfdmFsdWUtPm9zLmxlbiwgYWhkci0+YXZwX3ZhbHVlLT5vcy5kYXRhKTsKKwkJCX0KKwkJCUNIRUNLX0ZDVCggZmRfbXNnX3NlYXJjaF9hdnAgKCpkaWFtX2FucywgY3MtPmRpY3QuRmFpbGVkX0FWUCwgJmF2cCkgKTsKKwkJCWlmIChhdnApIHsKKwkJCQlmZF9sb2dfZGVidWcoIlthY2N0LnJnd3hdICAgRmFpbGVkLUFWUCB3YXMgaW5jbHVkZWQgaW4gdGhlIG1lc3NhZ2UuIik7CisJCQkJLyogRHVtcCBpdHMgY29udGVudCA/ICovCisJCQl9CisJCQkKKwkJCS8qIE5vdywgZGVzdHJveSB0aGUgRGlhbWV0ZXIgbWVzc2FnZSwgc2luY2Ugd2Uga25vdyBpdCBpcyBub3QgY29udmVydGVkIHRvIFJBRElVUyAqLworCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfZnJlZSgqZGlhbV9hbnMpICk7CisJCQkqZGlhbV9hbnMgPSBOVUxMOworCisJCQlyZXR1cm4gLTE7CisJfQorCS8qIFJlbW92ZSB0aGlzIFJlc3VsdC1Db2RlIGF2cCAqLworCUNIRUNLX0ZDVCggZmRfbXNnX2ZyZWUoIGF2cCApICk7CisJCisJLyogSWYgaXQgd2FzIGEgcmVzcG9uc2UgdG8gYSBTVE9QIHJlY29yZCwgd2UgbXVzdCBzZW5kIGFuIFNUUiBmb3IgdGhpcyBzZXNzaW9uICovCisJaWYgKHN0LT5zZW5kX3N0cikgeworCQlzdHJ1Y3QgbXNnICogc3RyID0gTlVMTDsKKwkJc3RydWN0IG1zZ19oZHIgKiBoZHIgPSBOVUxMOworCQlEaWFtSWRfdCBmcWRuOworCQlzaXplX3QgZnFkbl9sZW47CisJCURpYW1JZF90IHJlYWxtOworCQlzaXplX3QgcmVhbG1fbGVuOworCQl1bmlvbiBhdnBfdmFsdWUgYXZwX3ZhbDsKKwkJCisJCS8qIENyZWF0ZSBhIG5ldyBTVFIgbWVzc2FnZSAqLworCQlDSEVDS19GQ1QoICBmZF9tc2dfbmV3ICggY3MtPmRpY3QuU2Vzc2lvbl9UZXJtaW5hdGlvbl9SZXF1ZXN0LCBNU0dGTF9BTExPQ19FVEVJRCwgJnN0ciApICApOworCQkKKwkJLyogU2V0IHRoZSBhcHBsaWNhdGlvbi1pZCB0byB0aGUgYXV0aCBhcHBsaWNhdGlvbiBpZiBhdmFpbGFibGUsIGFjY291bnRpbmcgb3RoZXJ3aXNlIChub3Qgc3VyZSB3aGF0IGlzIGFjdHVhbGx5IGV4cGVjdGVkLi4uKSAqLworCQlDSEVDS19GQ1QoIGZkX21zZ19oZHIgKCBzdHIsICZoZHIgKSApOworCQloZHItPm1zZ19hcHBsID0gc3QtPmF1dGhfYXBwbCA/OiBBSV9BQ0NUOworCQkKKwkJLyogQWRkIHRoZSBTZXNzaW9uLUlkIEFWUCBhcyBmaXJzdCBBVlAgKi8KKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoICBjcy0+ZGljdC5TZXNzaW9uX0lkLCAwLCAmYXZwICkgKTsKKwkJYXZwX3ZhbC5vcy5kYXRhID0gc2lkOworCQlhdnBfdmFsLm9zLmxlbiA9IHNpZGxlbjsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX3NldHZhbHVlICggYXZwLCAmYXZwX3ZhbCApICk7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQgKCBzdHIsIE1TR19CUldfRklSU1RfQ0hJTEQsIGF2cCkgKTsKKwkJQ0hFQ0tfRkNUKCBmZF9zZXNzX3JlZl9tc2coc2VzcykgKTsKKworCQkvKiBBZGQgdGhlIERlc3RpbmF0aW9uLVJlYWxtIGFzIG5leHQgQVZQICovCisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBjcy0+ZGljdC5EZXN0aW5hdGlvbl9SZWFsbSwgMCwgJmF2cCApICk7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9zZXR2YWx1ZSAoIGF2cCwgb3ItPmF2cF92YWx1ZSApICk7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQgKCBzdHIsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwKSApOworCisJCS8qIEdldCBpbmZvcm1hdGlvbiBvbiB0aGUgTkFTICovCisJCUNIRUNLX0ZDVCggcmd3X2NsaWVudHNfZ2V0X29yaWdpbihjbGksICZmcWRuLCAmZnFkbl9sZW4sICZyZWFsbSwgJnJlYWxtX2xlbikgKTsKKworCQkvKiBBZGQgdGhlIE9yaWdpbi1Ib3N0IGFzIG5leHQgQVZQICovCisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBjcy0+ZGljdC5PcmlnaW5fSG9zdCwgMCwgJmF2cCApICk7CisJCW1lbXNldCgmYXZwX3ZhbCwgMCwgc2l6ZW9mKGF2cF92YWwpKTsKKwkJYXZwX3ZhbC5vcy5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilmcWRuOworCQlhdnBfdmFsLm9zLmxlbiA9IGZxZG5fbGVuOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUgKCBhdnAsICZhdnBfdmFsICkgKTsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCAoIHN0ciwgTVNHX0JSV19MQVNUX0NISUxELCBhdnApICk7CisKKwkJLyogQWRkIHRoZSBPcmlnaW4tUmVhbG0gYXMgbmV4dCBBVlAgKi8KKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIGNzLT5kaWN0Lk9yaWdpbl9SZWFsbSwgMCwgJmF2cCApICk7CisJCW1lbXNldCgmYXZwX3ZhbCwgMCwgc2l6ZW9mKGF2cF92YWwpKTsKKwkJYXZwX3ZhbC5vcy5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilyZWFsbTsKKwkJYXZwX3ZhbC5vcy5sZW4gPSByZWFsbV9sZW47CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9zZXR2YWx1ZSAoIGF2cCwgJmF2cF92YWwgKSApOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkICggc3RyLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCkgKTsKKwkJCisJCS8qIEF1dGgtQXBwbGljYXRpb24tSWQgLS0gaWYgd2UgZGlkIG5vdCBnZXQgaXQgZnJvbSBvdXIgQ2xhc3MgYXR0cmlidXRlLCB3ZSBqdXN0IHNldCAiMCIgKi8KKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIGNzLT5kaWN0LkF1dGhfQXBwbGljYXRpb25fSWQsIDAsICZhdnAgKSApOworCQlhdnBfdmFsLnUzMiA9IHN0LT5hdXRoX2FwcGw7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9zZXR2YWx1ZSAoIGF2cCwgJmF2cF92YWwgKSApOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkICggc3RyLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCkgKTsKKwkJCisJCS8qIFRlcm1pbmF0aW9uLUNhdXNlICovCisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBjcy0+ZGljdC5UZXJtaW5hdGlvbl9DYXVzZSwgMCwgJmF2cCApICk7CisJCWF2cF92YWwudTMyID0gc3QtPnRlcm1fY2F1c2U7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9zZXR2YWx1ZSAoIGF2cCwgJmF2cF92YWwgKSApOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkICggc3RyLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCkgKTsKKwkJCisJCS8qIFNlbmQgdGhpcyBtZXNzYWdlICovCisJCUNIRUNLX0ZDVCggZmRfbXNnX3NlbmQgKCAmc3RyLCBoYW5kbGVfc3RhLCBjcyApICk7CisJfQorCQorCS8qIAorCQlObyBhdHRyaWJ1dGVzIHNob3VsZCBiZSBmb3VuZCBpbgorCQkgICBBY2NvdW50aW5nLVJlc3BvbnNlIHBhY2tldHMgZXhjZXB0IFByb3h5LVN0YXRlIGFuZCBwb3NzaWJseSBWZW5kb3ItCisJCSAgIFNwZWNpZmljLgorCSovCisKKwkvKiBOb3cgbG9vcCBpbiB0aGUgbGlzdCBvZiBBVlBzIGFuZCBjb252ZXJ0IHRob3NlIHRoYXQgd2Uga25vdyBob3cgKi8KKwlDSEVDS19GQ1QoIGZkX21zZ19icm93c2UoKmRpYW1fYW5zLCBNU0dfQlJXX0ZJUlNUX0NISUxELCAmbmV4dCwgTlVMTCkgKTsKKwkKKwl3aGlsZSAobmV4dCkgeworCQlpbnQgaGFuZGxlZCA9IDE7CisJCWF2cCA9IG5leHQ7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2Jyb3dzZShhdnAsIE1TR19CUldfTkVYVCwgJm5leHQsIE5VTEwpICk7CisJCQorCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfaGRyICggYXZwLCAmYWhkciApICk7CisJCQorCQlpZiAoIShhaGRyLT5hdnBfZmxhZ3MgJiBBVlBfRkxBR19WRU5ET1IpKSB7CisJCQlzd2l0Y2ggKGFoZHItPmF2cF9jb2RlKSB7CisJCQkJLyogQmFzZWQgb24gUkZDNDAwNSwgc2VjIDMuMTAgKi8KKwkJCQljYXNlIERJQU1fQVRUUl9TRVNTSU9OX0lEOgorCQkJCWNhc2UgRElBTV9BVFRSX09SSUdJTl9IT1NUOgorCQkJCWNhc2UgRElBTV9BVFRSX09SSUdJTl9SRUFMTToKKwkJCQljYXNlIERJQU1fQVRUUl9BQ0NPVU5USU5HX1JFQ09SRF9UWVBFOgorCQkJCWNhc2UgRElBTV9BVFRSX0FDQ09VTlRJTkdfUkVDT1JEX05VTUJFUjoKKwkJCQljYXNlIERJQU1fQVRUUl9BQ0NUX0FQUExJQ0FUSU9OX0lEOgorCQkJCWNhc2UgRElBTV9BVFRSX1ZFTkRPUl9TUEVDSUZJQ19BUFBMSUNBVElPTl9JRDoKKwkJCQljYXNlIERJQU1fQVRUUl9VU0VSX05BTUU6CisJCQkJY2FzZSBESUFNX0FUVFJfQUNDT1VOVElOR19TVUJfU0VTU0lPTl9JRDoKKwkJCQljYXNlIERJQU1fQVRUUl9BQ0NUX1NFU1NJT05fSUQ6CisJCQkJY2FzZSBESUFNX0FUVFJfQUNDVF9NVUxUSV9TRVNTSU9OX0lEOgorCQkJCWNhc2UgRElBTV9BVFRSX0VWRU5UX1RJTUVTVEFNUDoKKwkJCQljYXNlIERJQU1fQVRUUl9PUklHSU5fQUFBX1BST1RPQ09MOgorCQkJCWNhc2UgRElBTV9BVFRSX09SSUdJTl9TVEFURV9JRDoKKwkJCQljYXNlIERJQU1fQVRUUl9OQVNfSURFTlRJRklFUjoKKwkJCQljYXNlIERJQU1fQVRUUl9OQVNfSVBfQUREUkVTUzoKKwkJCQljYXNlIERJQU1fQVRUUl9OQVNfSVBWNl9BRERSRVNTOgorCQkJCWNhc2UgRElBTV9BVFRSX05BU19QT1JUOgorCQkJCWNhc2UgRElBTV9BVFRSX05BU19QT1JUX0lEOgorCQkJCWNhc2UgRElBTV9BVFRSX05BU19QT1JUX1RZUEU6CisJCQkJY2FzZSBESUFNX0FUVFJfU0VSVklDRV9UWVBFOgorCQkJCWNhc2UgRElBTV9BVFRSX1RFUk1JTkFUSU9OX0NBVVNFOgorCQkJCWNhc2UgRElBTV9BVFRSX0FDQ09VTlRJTkdfUkVBTFRJTUVfUkVRVUlSRUQ6CisJCQkJY2FzZSBESUFNX0FUVFJfQUNDVF9JTlRFUklNX0lOVEVSVkFMOgorCQkJCWNhc2UgRElBTV9BVFRSX0NMQVNTOgorCQkJCQkvKiBXZSBqdXN0IHJlbW92ZSB0aGVzZSBBVlAsIHRoZXkgYXJlIG5vdCBleHBlY3RlZCBpbiBSQURJVVMgY2xpZW50ICovCisJCQkJCWJyZWFrOworCQkJCQkKKwkJCQlkZWZhdWx0OgorCQkJCQkvKiBMZWF2ZSB0aGUgQVZQIGluIHRoZSBtZXNzYWdlIGZvciBmdXJ0aGVyIHRyZWF0bWVudCAqLworCQkJCQloYW5kbGVkID0gMDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIFZlbmRvci1zcGVjaWZpYyBBVlBzICovCisJCQlzd2l0Y2ggKGFoZHItPmF2cF92ZW5kb3IpIHsKKwkJCQkKKwkJCQlkZWZhdWx0OiAvKiB1bmtub3duIHZlbmRvciAqLworCQkJCQloYW5kbGVkID0gMDsKKwkJCX0KKwkJfQorCQkKKwkJaWYgKGhhbmRsZWQpIHsKKwkJCUNIRUNLX0ZDVCggZmRfbXNnX2ZyZWUoIGF2cCApICk7CisJCX0KKwl9CisJCisJLyoKKwkgICAgICBUaGUgQXV0aGVudGljYXRvciBmaWVsZCBpbiBhbiBBY2NvdW50aW5nLVJlc3BvbnNlIHBhY2tldCBpcyBjYWxsZWQKKwkgICAgICB0aGUgUmVzcG9uc2UgQXV0aGVudGljYXRvciwgYW5kIGNvbnRhaW5zIGEgb25lLXdheSBNRDUgaGFzaAorCSAgICAgIGNhbGN1bGF0ZWQgb3ZlciBhIHN0cmVhbSBvZiBvY3RldHMgY29uc2lzdGluZyBvZiB0aGUgQWNjb3VudGluZy0KKwkgICAgICBSZXNwb25zZSBDb2RlLCBJZGVudGlmaWVyLCBMZW5ndGgsIHRoZSBSZXF1ZXN0IEF1dGhlbnRpY2F0b3IgZmllbGQKKwkgICAgICBmcm9tIHRoZSBBY2NvdW50aW5nLVJlcXVlc3QgcGFja2V0IGJlaW5nIHJlcGxpZWQgdG8sIGFuZCB0aGUKKwkgICAgICByZXNwb25zZSBhdHRyaWJ1dGVzIGlmIGFueSwgZm9sbG93ZWQgYnkgdGhlIHNoYXJlZCBzZWNyZXQuICBUaGUKKwkgICAgICByZXN1bHRpbmcgMTYgb2N0ZXQgTUQ1IGhhc2ggdmFsdWUgaXMgc3RvcmVkIGluIHRoZSBBdXRoZW50aWNhdG9yCisJICAgICAgZmllbGQgb2YgdGhlIEFjY291bnRpbmctUmVzcG9uc2UgcGFja2V0LgorCSAgICAgIAorCSAgICAgIC0tIGRvbmUgaW4gcmFkaXVzX21zZ19maW5pc2hfc3J2IAorCSovCisKKwlyZXR1cm4gMDsKK30KKworLyogVGhlIGV4cG9ydGVkIHN5bWJvbCAqLworc3RydWN0IHJnd19hcGkgcmd3cF9kZXNjcmlwdG9yID0geworCS5yZ3dwX25hbWUgICAgICAgPSAiYWNjdCIsCisJLnJnd3BfY29uZl9wYXJzZSA9IGFjY3RfY29uZl9wYXJzZSwKKwkucmd3cF9jb25mX2ZyZWUgID0gYWNjdF9jb25mX2ZyZWUsCisJLnJnd3BfcmFkX3JlcSAgICA9IGFjY3RfcmFkX3JlcSwKKwkucmd3cF9kaWFtX2FucyAgID0gYWNjdF9kaWFtX2FucworfTsJCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2FwcF9yYWRndy9yZ3d4X2F1dGguYyBiL2V4dGVuc2lvbnMvYXBwX3JhZGd3L3Jnd3hfYXV0aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3OGI5N2UKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2FwcF9yYWRndy9yZ3d4X2F1dGguYwpAQCAtMCwwICsxLDE5NjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDEzLCBXSURFIFByb2plY3QgYW5kIE5JQ1QJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFdJREUgUHJvamVjdCBvciBOSUNUIG5vciB0aGUgCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgV0lERSBQcm9qZWN0IGFuZCAJCQkJCQkgKgorKiAgIE5JQ1QuCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogUkFESVVTIEFjY2Vzcy1SZXF1ZXN0IG1lc3NhZ2VzIHRyYW5zbGF0aW9uIHBsdWdpbiAqLworCisjaW5jbHVkZSAicmd3X2NvbW1vbi5oIgorCisvKiBBdHRyaWJ1dGVzIG1pc3NpbmcgZnJvbSByYWRpdXMuaCAqLworI2RlZmluZSBSQURJVVNfQVRUUl9DSEFQX1BBU1NXT1JECTMKKyNkZWZpbmUgUkFESVVTX0FUVFJfQVJBUF9QQVNTV09SRAk3MAorCisvKiBPdGhlciBjb25zdGFudHMgd2UgdXNlICovCisjZGVmaW5lIEFJX05BU1JFUQkJMQkvKiBEaWFtZXRlciBOQVNSRVEgKi8KKyNkZWZpbmUgQUlfRUFQCQkJNQkvKiBEaWFtZXRlciBFQVAgYXBwbGljYXRpb24gKi8KKyNkZWZpbmUgQ0NfQUEJCQkyNjUJLyogQUFSICovCisjZGVmaW5lIENDX0RJQU1FVEVSX0VBUAkJMjY4CS8qIERFUiAqLworI2RlZmluZSBBQ1ZfQVJUX0FVVEhPUklaRV9BVVRIRU5USUNBVEUJMwkvKiBBVVRIT1JJWkVfQVVUSEVOVElDQVRFICovCisjZGVmaW5lIEFDVl9PQVBfUkFESVVTCQkJMQkvKiBSQURJVVMgKi8KKyNkZWZpbmUgQUNWX0FTU19TVEFURV9NQUlOVEFJTkVECTAJLyogU1RBVEVfTUFJTlRBSU5FRCAqLworI2RlZmluZSBBQ1ZfQVNTX05PX1NUQVRFX01BSU5UQUlORUQJMQkvKiBOT19TVEFURV9NQUlOVEFJTkVEICovCisKKy8qIFRoZSBzdGF0ZSB3ZSBrZWVwIGZvciB0aGlzIHBsdWdpbiAqLworc3RydWN0IHJnd3BfY29uZmlnIHsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBBUkFQX1Bhc3N3b3JkOwkJLyogQVJBUC1QYXNzd29yZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBBUkFQX1NlY3VyaXR5OwkJLyogQVJBUC1TZWN1cml0eSAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBBUkFQX1NlY3VyaXR5X0RhdGE7CS8qIEFSQVAtU2VjdXJpdHktRGF0YSAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBBdXRoX0FwcGxpY2F0aW9uX0lkOwkvKiBBdXRoLUFwcGxpY2F0aW9uLUlkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIEF1dGhfUmVxdWVzdF9UeXBlOwkJLyogQXV0aC1SZXF1ZXN0LVR5cGUgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogQXV0aG9yaXphdGlvbl9MaWZldGltZTsJLyogQXV0aG9yaXphdGlvbi1MaWZldGltZSAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBDYWxsYmFja19OdW1iZXI7CQkvKiBDYWxsYmFjay1OdW1iZXIgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogQ2FsbGVkX1N0YXRpb25fSWQ7CQkvKiBDYWxsZWQtU3RhdGlvbi1JZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBDYWxsaW5nX1N0YXRpb25fSWQ7CS8qIENhbGxpbmctU3RhdGlvbi1JZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBDSEFQX0FsZ29yaXRobTsJCS8qIENIQVAtQWxnb3JpdGhtICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIENIQVBfQXV0aDsJCQkvKiBDSEFQLUF1dGggKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogQ0hBUF9DaGFsbGVuZ2U7CQkvKiBDSEFQLUNoYWxsZW5nZSAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBDSEFQX0lkZW50OwkJLyogQ0hBUC1JZGVudCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBDSEFQX1Jlc3BvbnNlOwkJLyogQ0hBUC1SZXNwb25zZSAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBEZXN0aW5hdGlvbl9Ib3N0OwkJLyogRGVzdGluYXRpb24tSG9zdCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBEZXN0aW5hdGlvbl9SZWFsbTsJCS8qIERlc3RpbmF0aW9uLVJlYWxtICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIENvbm5lY3RfSW5mbzsJCS8qIENvbm5lY3QtSW5mbyAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBFQVBfUGF5bG9hZDsJCS8qIEVBUC1QYXlsb2FkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIEVycm9yX01lc3NhZ2U7CQkvKiBFcnJvci1NZXNzYWdlICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIEVycm9yX1JlcG9ydGluZ19Ib3N0OwkvKiBFcnJvci1SZXBvcnRpbmctSG9zdCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBGYWlsZWRfQVZQOwkJLyogRmFpbGVkLUFWUCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBGcmFtZWRfQ29tcHJlc3Npb247CS8qIEZyYW1lZC1Db21wcmVzc2lvbiAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBGcmFtZWRfSVBfQWRkcmVzczsJCS8qIEZyYW1lZC1JUC1BZGRyZXNzICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIEZyYW1lZF9JUF9OZXRtYXNrOwkJLyogRnJhbWVkLUlQLU5ldG1hc2sgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogRnJhbWVkX0ludGVyZmFjZV9JZDsJLyogRnJhbWVkLUludGVyZmFjZS1JZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBGcmFtZWRfSVB2Nl9QcmVmaXg7CS8qIEZyYW1lZC1JUHY2LVByZWZpeCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBGcmFtZWRfTVRVOwkJLyogRnJhbWVkLU1UVSAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBGcmFtZWRfUHJvdG9jb2w7CQkvKiBGcmFtZWQtUHJvdG9jb2wgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogTG9naW5fSVBfSG9zdDsJCS8qIExvZ2luLUlQLUhvc3QgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogTG9naW5fSVB2Nl9Ib3N0OwkJLyogTG9naW4tSVB2Ni1Ib3N0ICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIExvZ2luX0xBVF9Hcm91cDsJCS8qIExvZ2luLUxBVC1Hcm91cCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBMb2dpbl9MQVRfTm9kZTsJCS8qIExvZ2luLUxBVC1Ob2RlICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIExvZ2luX0xBVF9Qb3J0OwkJLyogTG9naW4tTEFULVBvcnQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogTG9naW5fTEFUX1NlcnZpY2U7CQkvKiBMb2dpbi1MQVQtU2VydmljZSAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBOQVNfSWRlbnRpZmllcjsJCS8qIE5BUy1JZGVudGlmaWVyICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIE5BU19JUF9BZGRyZXNzOwkJLyogTkFTLUlQLUFkZHJlc3MgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogTkFTX0lQdjZfQWRkcmVzczsJCS8qIE5BUy1JUHY2LUFkZHJlc3MgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogTkFTX1BvcnQ7CQkJLyogTkFTLVBvcnQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogTkFTX1BvcnRfSWQ7CQkvKiBOQVMtUG9ydC1JZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBOQVNfUG9ydF9UeXBlOwkJLyogTkFTLVBvcnQtVHlwZSAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBPcmlnaW5fQUFBX1Byb3RvY29sOwkvKiBPcmlnaW4tQUFBLVByb3RvY29sICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIE9yaWdpbl9Ib3N0OwkJLyogT3JpZ2luLUhvc3QgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogT3JpZ2luX1JlYWxtOwkJLyogT3JpZ2luLVJlYWxtICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIE9yaWdpbmF0aW5nX0xpbmVfSW5mbzsJLyogT3JpZ2luYXRpbmctTGluZS1JbmZvICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIFBvcnRfTGltaXQ7CQkvKiBQb3J0LUxpbWl0ICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIFJlX0F1dGhfUmVxdWVzdF9UeXBlOwkvKiBSZS1BdXRoLVJlcXVlc3QtVHlwZSAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBSZXN1bHRfQ29kZTsJCS8qIFJlc3VsdC1Db2RlICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIFNlcnZpY2VfVHlwZTsJCS8qIFNlcnZpY2UtVHlwZSAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBTZXNzaW9uX0lkOwkJLyogU2Vzc2lvbi1JZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBTZXNzaW9uX1RpbWVvdXQ7CQkvKiBTZXNzaW9uLVRpbWVvdXQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogU3RhdGU7CQkJLyogU3RhdGUgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogVHVubmVsaW5nOwkJCS8qIFR1bm5lbGluZyAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBUdW5uZWxfVHlwZTsJCS8qIFR1bm5lbC1UeXBlICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIFR1bm5lbF9NZWRpdW1fVHlwZTsJLyogVHVubmVsLU1lZGl1bS1UeXBlICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIFR1bm5lbF9DbGllbnRfRW5kcG9pbnQ7CS8qIFR1bm5lbC1DbGllbnQtRW5kcG9pbnQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogVHVubmVsX1NlcnZlcl9FbmRwb2ludDsJLyogVHVubmVsLVNlcnZlci1FbmRwb2ludCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBUdW5uZWxfUHJpdmF0ZV9Hcm91cF9JZDsJLyogVHVubmVsLVByaXZhdGUtR3JvdXAtSWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogVHVubmVsX1ByZWZlcmVuY2U7CQkvKiBUdW5uZWwtUHJlZmVyZW5jZSAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBUdW5uZWxfQ2xpZW50X0F1dGhfSWQ7CS8qIFR1bm5lbC1DbGllbnQtQXV0aC1JZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBUdW5uZWxfU2VydmVyX0F1dGhfSWQ7CS8qIFR1bm5lbC1TZXJ2ZXItQXV0aC1JZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBVc2VyX05hbWU7CQkJLyogVXNlci1OYW1lICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIFVzZXJfUGFzc3dvcmQ7CQkvKiBVc2VyLVBhc3N3b3JkICovCisJCQorCX0gZGljdDsgLyogY2FjaGUgb2YgdGhlIGRpY3Rpb25hcnkgb2JqZWN0cyB3ZSB1c2UgKi8KKwlzdHJ1Y3Qgc2Vzc2lvbl9oYW5kbGVyICogc2Vzc19oZGw7IC8qIFdlIHN0b3JlIFJBRElVUyByZXF1ZXN0IGF1dGhlbnRpY2F0b3IgaW5mb3JtYXRpb24gaW4gdGhlIHNlc3Npb24gKi8KKwljaGFyICogY29uZnN0cjsKKwkKKwlpbnQgaWdub3JlX25haTsKK307CisKK3N0cnVjdCBzZXNzX3N0YXRlIHsKKwl1aW50OF90IHJlcV9hdXRoWzE2XTsKK307CisKKworLyogSW5pdGlhbGl6ZSB0aGUgcGx1Z2luICovCitzdGF0aWMgaW50IGF1dGhfY29uZl9wYXJzZShjaGFyICogY29uZnN0ciwgc3RydWN0IHJnd3BfY29uZmlnICoqIHN0YXRlKQoreworCXN0cnVjdCByZ3dwX2NvbmZpZyAqIG5ldzsKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhcHA7CisJCisJVFJBQ0VfRU5UUlkoIiVwICVwIiwgY29uZnN0ciwgc3RhdGUpOworCUNIRUNLX1BBUkFNUyggc3RhdGUgKTsKKwkKKwlDSEVDS19NQUxMT0MoIG5ldyA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHJnd3BfY29uZmlnKSkgKTsKKwltZW1zZXQobmV3LCAwLCBzaXplb2Yoc3RydWN0IHJnd3BfY29uZmlnKSk7CisJCisJQ0hFQ0tfRkNUKCBmZF9zZXNzX2hhbmRsZXJfY3JlYXRlKCAmbmV3LT5zZXNzX2hkbCwgKHZvaWQgKilmcmVlLCBOVUxMLCBOVUxMICkgKTsKKwluZXctPmNvbmZzdHIgPSBjb25mc3RyOworCQorCWlmIChjb25mc3RyICYmIHN0cnN0cihjb25mc3RyLCAibm9uYWkiKSkKKwkJbmV3LT5pZ25vcmVfbmFpID0gMTsKKwkKKwkvKiBSZXNvbHZlIGFsbCBkaWN0aW9uYXJ5IG9iamVjdHMgd2UgdXNlICovCisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJBUkFQLVBhc3N3b3JkIiwgJm5ldy0+ZGljdC5BUkFQX1Bhc3N3b3JkLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJBUkFQLVNlY3VyaXR5IiwgJm5ldy0+ZGljdC5BUkFQX1NlY3VyaXR5LCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJBUkFQLVNlY3VyaXR5LURhdGEiLCAmbmV3LT5kaWN0LkFSQVBfU2VjdXJpdHlfRGF0YSwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiQXV0aC1BcHBsaWNhdGlvbi1JZCIsICZuZXctPmRpY3QuQXV0aF9BcHBsaWNhdGlvbl9JZCwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiQXV0aC1SZXF1ZXN0LVR5cGUiLCAmbmV3LT5kaWN0LkF1dGhfUmVxdWVzdF9UeXBlLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJBdXRob3JpemF0aW9uLUxpZmV0aW1lIiwgJm5ldy0+ZGljdC5BdXRob3JpemF0aW9uX0xpZmV0aW1lLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJDYWxsYmFjay1OdW1iZXIiLCAmbmV3LT5kaWN0LkNhbGxiYWNrX051bWJlciwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiQ2FsbGVkLVN0YXRpb24tSWQiLCAmbmV3LT5kaWN0LkNhbGxlZF9TdGF0aW9uX0lkLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJDYWxsaW5nLVN0YXRpb24tSWQiLCAmbmV3LT5kaWN0LkNhbGxpbmdfU3RhdGlvbl9JZCwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiQ0hBUC1BbGdvcml0aG0iLCAmbmV3LT5kaWN0LkNIQVBfQWxnb3JpdGhtLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJDSEFQLUF1dGgiLCAmbmV3LT5kaWN0LkNIQVBfQXV0aCwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiQ0hBUC1DaGFsbGVuZ2UiLCAmbmV3LT5kaWN0LkNIQVBfQ2hhbGxlbmdlLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJDSEFQLUlkZW50IiwgJm5ldy0+ZGljdC5DSEFQX0lkZW50LCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJDSEFQLVJlc3BvbnNlIiwgJm5ldy0+ZGljdC5DSEFQX1Jlc3BvbnNlLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJDb25uZWN0LUluZm8iLCAmbmV3LT5kaWN0LkNvbm5lY3RfSW5mbywgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiRGVzdGluYXRpb24tSG9zdCIsICZuZXctPmRpY3QuRGVzdGluYXRpb25fSG9zdCwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiRGVzdGluYXRpb24tUmVhbG0iLCAmbmV3LT5kaWN0LkRlc3RpbmF0aW9uX1JlYWxtLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJFQVAtUGF5bG9hZCIsICZuZXctPmRpY3QuRUFQX1BheWxvYWQsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIkVycm9yLU1lc3NhZ2UiLCAmbmV3LT5kaWN0LkVycm9yX01lc3NhZ2UsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIkVycm9yLVJlcG9ydGluZy1Ib3N0IiwgJm5ldy0+ZGljdC5FcnJvcl9SZXBvcnRpbmdfSG9zdCwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiRmFpbGVkLUFWUCIsICZuZXctPmRpY3QuRmFpbGVkX0FWUCwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiRnJhbWVkLUNvbXByZXNzaW9uIiwgJm5ldy0+ZGljdC5GcmFtZWRfQ29tcHJlc3Npb24sIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIkZyYW1lZC1JUC1BZGRyZXNzIiwgJm5ldy0+ZGljdC5GcmFtZWRfSVBfQWRkcmVzcywgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiRnJhbWVkLUlQLU5ldG1hc2siLCAmbmV3LT5kaWN0LkZyYW1lZF9JUF9OZXRtYXNrLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJGcmFtZWQtSW50ZXJmYWNlLUlkIiwgJm5ldy0+ZGljdC5GcmFtZWRfSW50ZXJmYWNlX0lkLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJGcmFtZWQtSVB2Ni1QcmVmaXgiLCAmbmV3LT5kaWN0LkZyYW1lZF9JUHY2X1ByZWZpeCwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiRnJhbWVkLU1UVSIsICZuZXctPmRpY3QuRnJhbWVkX01UVSwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiRnJhbWVkLVByb3RvY29sIiwgJm5ldy0+ZGljdC5GcmFtZWRfUHJvdG9jb2wsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIkxvZ2luLUlQLUhvc3QiLCAmbmV3LT5kaWN0LkxvZ2luX0lQX0hvc3QsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIkxvZ2luLUlQdjYtSG9zdCIsICZuZXctPmRpY3QuTG9naW5fSVB2Nl9Ib3N0LCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJMb2dpbi1MQVQtR3JvdXAiLCAmbmV3LT5kaWN0LkxvZ2luX0xBVF9Hcm91cCwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiTG9naW4tTEFULU5vZGUiLCAmbmV3LT5kaWN0LkxvZ2luX0xBVF9Ob2RlLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJMb2dpbi1MQVQtUG9ydCIsICZuZXctPmRpY3QuTG9naW5fTEFUX1BvcnQsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIkxvZ2luLUxBVC1TZXJ2aWNlIiwgJm5ldy0+ZGljdC5Mb2dpbl9MQVRfU2VydmljZSwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiTkFTLUlkZW50aWZpZXIiLCAmbmV3LT5kaWN0Lk5BU19JZGVudGlmaWVyLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJOQVMtSVAtQWRkcmVzcyIsICZuZXctPmRpY3QuTkFTX0lQX0FkZHJlc3MsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIk5BUy1JUHY2LUFkZHJlc3MiLCAmbmV3LT5kaWN0Lk5BU19JUHY2X0FkZHJlc3MsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIk5BUy1Qb3J0IiwgJm5ldy0+ZGljdC5OQVNfUG9ydCwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiTkFTLVBvcnQtSWQiLCAmbmV3LT5kaWN0Lk5BU19Qb3J0X0lkLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJOQVMtUG9ydC1UeXBlIiwgJm5ldy0+ZGljdC5OQVNfUG9ydF9UeXBlLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJPcmlnaW4tQUFBLVByb3RvY29sIiwgJm5ldy0+ZGljdC5PcmlnaW5fQUFBX1Byb3RvY29sLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJPcmlnaW4tSG9zdCIsICZuZXctPmRpY3QuT3JpZ2luX0hvc3QsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIk9yaWdpbi1SZWFsbSIsICZuZXctPmRpY3QuT3JpZ2luX1JlYWxtLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJPcmlnaW5hdGluZy1MaW5lLUluZm8iLCAmbmV3LT5kaWN0Lk9yaWdpbmF0aW5nX0xpbmVfSW5mbywgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiUG9ydC1MaW1pdCIsICZuZXctPmRpY3QuUG9ydF9MaW1pdCwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiUmUtQXV0aC1SZXF1ZXN0LVR5cGUiLCAmbmV3LT5kaWN0LlJlX0F1dGhfUmVxdWVzdF9UeXBlLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJSZXN1bHQtQ29kZSIsICZuZXctPmRpY3QuUmVzdWx0X0NvZGUsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIlNlcnZpY2UtVHlwZSIsICZuZXctPmRpY3QuU2VydmljZV9UeXBlLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJTZXNzaW9uLUlkIiwgJm5ldy0+ZGljdC5TZXNzaW9uX0lkLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJTZXNzaW9uLVRpbWVvdXQiLCAmbmV3LT5kaWN0LlNlc3Npb25fVGltZW91dCwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiU3RhdGUiLCAmbmV3LT5kaWN0LlN0YXRlLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJUdW5uZWxpbmciLCAmbmV3LT5kaWN0LlR1bm5lbGluZywgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiVHVubmVsLVR5cGUiLCAmbmV3LT5kaWN0LlR1bm5lbF9UeXBlLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJUdW5uZWwtTWVkaXVtLVR5cGUiLCAmbmV3LT5kaWN0LlR1bm5lbF9NZWRpdW1fVHlwZSwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiVHVubmVsLUNsaWVudC1FbmRwb2ludCIsICZuZXctPmRpY3QuVHVubmVsX0NsaWVudF9FbmRwb2ludCwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiVHVubmVsLVNlcnZlci1FbmRwb2ludCIsICZuZXctPmRpY3QuVHVubmVsX1NlcnZlcl9FbmRwb2ludCwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiVHVubmVsLVByaXZhdGUtR3JvdXAtSWQiLCAmbmV3LT5kaWN0LlR1bm5lbF9Qcml2YXRlX0dyb3VwX0lkLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJUdW5uZWwtUHJlZmVyZW5jZSIsICZuZXctPmRpY3QuVHVubmVsX1ByZWZlcmVuY2UsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIlR1bm5lbC1DbGllbnQtQXV0aC1JZCIsICZuZXctPmRpY3QuVHVubmVsX0NsaWVudF9BdXRoX0lkLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJUdW5uZWwtU2VydmVyLUF1dGgtSWQiLCAmbmV3LT5kaWN0LlR1bm5lbF9TZXJ2ZXJfQXV0aF9JZCwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiVXNlci1OYW1lIiwgJm5ldy0+ZGljdC5Vc2VyX05hbWUsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIlVzZXItUGFzc3dvcmQiLCAmbmV3LT5kaWN0LlVzZXJfUGFzc3dvcmQsIEVOT0VOVCkgKTsKKwkKKwkvKiBUaGlzIHBsdWdpbiBwcm92aWRlcyB0aGUgZm9sbG93aW5nIERpYW1ldGVyIGF1dGhlbnRpY2F0aW9uIGFwcGxpY2F0aW9ucyBzdXBwb3J0OiAqLworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BUFBMSUNBVElPTiwgQVBQTElDQVRJT05fQllfTkFNRSwgIkRpYW1ldGVyIE5ldHdvcmsgQWNjZXNzIFNlcnZlciBBcHBsaWNhdGlvbiIsICZhcHAsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2Rpc3BfYXBwX3N1cHBvcnQgKCBhcHAsIE5VTEwsIDEsIDAgKSApOworCisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FQUExJQ0FUSU9OLCBBUFBMSUNBVElPTl9CWV9OQU1FLCAiRGlhbWV0ZXIgRXh0ZW5zaWJsZSBBdXRoZW50aWNhdGlvbiBQcm90b2NvbCAoRUFQKSBBcHBsaWNhdGlvbiIsICZhcHAsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2Rpc3BfYXBwX3N1cHBvcnQgKCBhcHAsIE5VTEwsIDEsIDAgKSApOworCQorCSpzdGF0ZSA9IG5ldzsKKwlyZXR1cm4gMDsKK30KKworLyogZGVpbml0aWFsaXplICovCitzdGF0aWMgdm9pZCBhdXRoX2NvbmZfZnJlZShzdHJ1Y3Qgcmd3cF9jb25maWcgKiBzdGF0ZSkKK3sKKwlUUkFDRV9FTlRSWSgiJXAiLCBzdGF0ZSk7CisJQ0hFQ0tfUEFSQU1TX0RPKCBzdGF0ZSwgcmV0dXJuICk7CisJQ0hFQ0tfRkNUX0RPKCBmZF9zZXNzX2hhbmRsZXJfZGVzdHJveSggJnN0YXRlLT5zZXNzX2hkbCwgTlVMTCApLCAgKTsKKwlmcmVlKHN0YXRlKTsKKwlyZXR1cm47Cit9CisKKy8qIEhhbmRsZSBhbiBpbmNvbWluZyBSQURJVVMgcmVxdWVzdCAqLworc3RhdGljIGludCBhdXRoX3JhZF9yZXEoIHN0cnVjdCByZ3dwX2NvbmZpZyAqIGNzLCBzdHJ1Y3QgcmFkaXVzX21zZyAqIHJhZF9yZXEsIHN0cnVjdCByYWRpdXNfbXNnICoqIHJhZF9hbnMsIHN0cnVjdCBtc2cgKiogZGlhbV9mdywgc3RydWN0IHJnd19jbGllbnQgKiBjbGkgKQoreworCWludCBpZHg7CisJaW50IGdvdF9pZCA9IDA7CisJaW50IGdvdF9tYWMgPSAwOworCWludCBnb3RfcGFzc3dkID0gMDsKKwlpbnQgZ290X2VhcCA9IDA7CisJaW50IGdvdF9lbXB0eV9lYXAgPSAwOworCWNvbnN0IGNoYXIgKiBwcmVmaXggPSAiRGlhbWV0ZXIvIjsKKwlzaXplX3QgcHJlZl9sZW47CisJb3MwX3QgZGggPSBOVUxMOworCXNpemVfdCBkaF9sZW4gPSAwOworCW9zMF90IGRyID0gTlVMTDsKKwlzaXplX3QgZHJfbGVuID0gMDsKKwlvczBfdCBzaSA9IE5VTEw7CisJc2l6ZV90IHNpX2xlbiA9IDA7CisJb3MwX3QgdW4gPSBOVUxMOworCXNpemVfdCB1bl9sZW4gPSAwOworCXNpemVfdCBuYXR0cl91c2VkID0gMDsKKwlzdHJ1Y3QgYXZwICoqIGF2cF90dW4gPSBOVUxMLCAqYXZwID0gTlVMTDsKKwl1bmlvbiBhdnBfdmFsdWUgdmFsdWU7CisJc3RydWN0IHNlc3Npb24gKiBzZXNzOworCQorCVRSQUNFX0VOVFJZKCIlcCAlcCAlcCAlcCAlcCIsIGNzLCByYWRfcmVxLCByYWRfYW5zLCBkaWFtX2Z3LCBjbGkpOworCUNIRUNLX1BBUkFNUyhjcyAmJiByYWRfcmVxICYmIChyYWRfcmVxLT5oZHItPmNvZGUgPT0gUkFESVVTX0NPREVfQUNDRVNTX1JFUVVFU1QpICYmIHJhZF9hbnMgJiYgZGlhbV9mdyAmJiAqZGlhbV9mdyk7CisJCisJcHJlZl9sZW4gPSBzdHJsZW4ocHJlZml4KTsKKwkKKwkvKgorCSAgIEd1aWRlbGluZXM6CisJICAgICBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM0MDA1I3NlY3Rpb24tOS4xCisJICAgICBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM0MDcyI3NlY3Rpb24tNi4xCisKKwkgICBXaGVuIGEgVHJhbnNsYXRpb24gQWdlbnQgcmVjZWl2ZXMgYSBSQURJVVMgbWVzc2FnZSwgdGhlIGZvbGxvd2luZworCSAgIHN0ZXBzIHNob3VsZCBiZSB0YWtlbjoKKworCSAgICAgIC0gIElmIGEgTWVzc2FnZS1BdXRoZW50aWNhdG9yIGF0dHJpYnV0ZSBpcyBwcmVzZW50LCB0aGUgdmFsdWUgTVVTVAorICAgICAgICAJIGJlIGNoZWNrZWQgYnV0IG5vdCBpbmNsdWRlZCBpbiB0aGUgRGlhbWV0ZXIgbWVzc2FnZS4gIElmIGl0IGlzCisgICAgICAgIAkgaW5jb3JyZWN0LCB0aGUgUkFESVVTIG1lc3NhZ2Ugc2hvdWxkIGJlIHNpbGVudGx5IGRpc2NhcmRlZC4KKyAgICAgICAgCSBUaGUgZ2F0ZXdheSBzeXN0ZW0gU0hPVUxEIGdlbmVyYXRlIGFuZCBpbmNsdWRlIGEgTWVzc2FnZS0KKyAgICAgICAgCSBBdXRoZW50aWNhdG9yIGluIHJldHVybmVkIFJBRElVUyByZXNwb25zZXMuCisJICAgICAgICAgICAgIC0+IGRvbmUgaW4gcmd3X21zZ19hdXRoX2NoZWNrCisKKwkgICAgICAtICBUaGUgdHJhbnNwb3J0IGFkZHJlc3Mgb2YgdGhlIHNlbmRlciBNVVNUIGJlIGNoZWNrZWQgYWdhaW5zdCB0aGUKKyAgICAgICAgCSBOQVMgaWRlbnRpZnlpbmcgYXR0cmlidXRlcy4gIFNlZSB0aGUgZGVzY3JpcHRpb24gb2YgTkFTLQorICAgICAgICAJIElkZW50aWZpZXIgYW5kIE5BUy1JUC1BZGRyZXNzIGJlbG93LgorCQkgICAgIC0+IGRvbmUgaW4gcmd3X2NsaWVudHNfY2hlY2tfb3JpZ2luCisKKwkgICAgICAtICBUaGUgVHJhbnNsYXRpb24gQWdlbnQgbXVzdCBtYWludGFpbiB0cmFuc2FjdGlvbiBzdGF0ZQorICAgICAgICAJIGluZm9ybWF0aW9uIHJlbGV2YW50IHRvIHRoZSBSQURJVVMgcmVxdWVzdCwgc3VjaCBhcyB0aGUKKyAgICAgICAgCSBJZGVudGlmaWVyIGZpZWxkIGluIHRoZSBSQURJVVMgaGVhZGVyLCBhbnkgZXhpc3RpbmcgUkFESVVTCisgICAgICAgIAkgUHJveHktU3RhdGUgYXR0cmlidXRlLCBhbmQgdGhlIHNvdXJjZSBJUCBhZGRyZXNzIGFuZCBwb3J0CisgICAgICAgIAkgbnVtYmVyIG9mIHRoZSBVRFAgcGFja2V0LiAgVGhlc2UgbWF5IGJlIG1haW50YWluZWQgbG9jYWxseSBpbiBhCisgICAgICAgIAkgc3RhdGUgdGFibGUgb3Igc2F2ZWQgaW4gYSBQcm94eS1JbmZvIEFWUCBncm91cC4gIEEgRGlhbWV0ZXIKKyAgICAgICAgCSBTZXNzaW9uLUlkIEFWUCB2YWx1ZSBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcgYSBzZXNzaW9uIHN0YXRlCisgICAgICAgIAkgbWFwcGluZyBtZWNoYW5pc20uCisJCSAgICAgLT4gSWRlbnRpZmllciwgc291cmNlIGFuZCBwb3J0IGFyZSBzYXZlZCBhbG9uZyB3aXRoIHRoZSByZXF1ZXN0LAorCQkgICAgICAgIGFuZCBhc3NvY2lhdGVkIHdpdGggdGhlIHNlc3Npb24gc3RhdGUuCisJCSAgICAgLT4gc3ViX2VjaG9fZHJvcCBzaG91bGQgaGFuZGxlIHRoZSBQcm94eS1TdGF0ZSBhdHRyaWJ1dGUgKGNvbmYgaXNzdWUpCisKKwkgICAgICAtICBUaGUgRGlhbWV0ZXIgT3JpZ2luLUhvc3QgYW5kIE9yaWdpbi1SZWFsbSBBVlBzIE1VU1QgYmUgY3JlYXRlZAorICAgICAgICAJIGFuZCBhZGRlZCBieSB1c2luZyB0aGUgaW5mb3JtYXRpb24gZnJvbSBhbiBGUUROIGNvcnJlc3BvbmRpbmcKKyAgICAgICAgCSB0byB0aGUgTkFTLUlQLUFkZHJlc3MgYXR0cmlidXRlIChwcmVmZXJyZWQgaWYgYXZhaWxhYmxlKSwKKyAgICAgICAgCSBhbmQvb3IgdG8gdGhlIE5BUy1JZGVudGlmaWVyIGF0dHJpYnV0ZS4gIChOb3RlIHRoYXQgdGhlIFJBRElVUworICAgICAgICAJIE5BUy1JZGVudGlmaWVyIGlzIG5vdCByZXF1aXJlZCB0byBiZSBhbiBGUUROLikKKwkJICAgICAtPiBkb25lIGluIHJnd19jbGllbnRzX2NyZWF0ZV9vcmlnaW4uCisKKwkgICAgICAtICBUaGUgcmVzcG9uc2UgTVVTVCBoYXZlIGFuIE9yaWdpbi1BQUEtUHJvdG9jb2wgQVZQIGFkZGVkLAorICAgICAgICAJIGluZGljYXRpbmcgdGhlIHByb3RvY29sIG9mIG9yaWdpbiBvZiB0aGUgbWVzc2FnZS4KKwkJICAgICAtPiB3aGF0ICJyZXNwb25zZSIgPz8/IEFkZGVkIHRvIHRoZSBBQVIgLyBERVIgaW4gdGhpcyBmdW5jdGlvbi4KKworCSAgICAgIC0gIFRoZSBQcm94eS1JbmZvIGdyb3VwIFNIT1VMRCBiZSBhZGRlZCwgd2l0aCB0aGUgbG9jYWwgc2VydmVyJ3MKKyAgICAgICAgCSBpZGVudGl0eSBzcGVjaWZpZWQgaW4gdGhlIFByb3h5LUhvc3QgQVZQLiAgVGhpcyBzaG91bGQgZW5zdXJlCisgICAgICAgIAkgdGhhdCB0aGUgcmVzcG9uc2UgaXMgcmV0dXJuZWQgdG8gdGhpcyBzeXN0ZW0uCisJCSAgICAgLT4gV2UgZG9uJ3QgbmVlZCB0aGlzLCBhbnN3ZXIgaXMgYWx3YXlzIHJvdXRlZCBoZXJlIGFueXdheS4KKwkJICAgICAKKwkgICAgICBGb3IgRUFQOgorCSAgICAgIAorCSAgICAgIG8gIFJBRElVUyBFQVAtTWVzc2FnZSBhdHRyaWJ1dGUocykgYXJlIHRyYW5zbGF0ZWQgdG8gYSBEaWFtZXRlcgorCQkgRUFQLVBheWxvYWQgQVZQLiAgSWYgbXVsdGlwbGUgUkFESVVTIEVBUC1NZXNzYWdlIGF0dHJpYnV0ZXMgYXJlCisJCSBwcmVzZW50LCB0aGV5IGFyZSBjb25jYXRlbmF0ZWQgYW5kIHRyYW5zbGF0ZWQgdG8gYSBzaW5nbGUgRGlhbWV0ZXIKKwkJIEVBUC1QYXlsb2FkIEFWUC4KKwkJICAgICAtPiBjb25jYXRlbmF0aW9uIGRvbmUgYnkgcmFkaXVzX21zZ19nZXRfZWFwCisKKwkgICAgICAtPiB0aGUgcmVtYWluaW5nIGlzIHNwZWNpZmljIGNvbnZlcnNpb24gcnVsZXMKKwkqLworCQorCS8qIENoZWNrIGJhc2ljIGluZm9ybWF0aW9uIGlzIHRoZXJlLCBhbmQgYWxzbyByZXRyaWV2ZSBzb21lIGF0dHJpYnV0ZSBpbmZvcm1hdGlvbiAqLworCWZvciAoaWR4ID0gMDsgaWR4IDwgcmFkX3JlcS0+YXR0cl91c2VkOyBpZHgrKykgeworCQlzdHJ1Y3QgcmFkaXVzX2F0dHJfaGRyICogYXR0ciA9IChzdHJ1Y3QgcmFkaXVzX2F0dHJfaGRyICopKHJhZF9yZXEtPmJ1ZiArIHJhZF9yZXEtPmF0dHJfcG9zW2lkeF0pOworCQl1aW50OF90ICogYXR0cl92YWwgPSAodWludDhfdCAqKShhdHRyICsgMSk7CisJCXNpemVfdCBhdHRyX2xlbiA9IGF0dHItPmxlbmd0aCAtIHNpemVvZihzdHJ1Y3QgcmFkaXVzX2F0dHJfaGRyKTsKKwkJCisJCXN3aXRjaCAoYXR0ci0+dHlwZSkgeworCQkJY2FzZSBSQURJVVNfQVRUUl9OQVNfSVBfQUREUkVTUzoKKwkJCWNhc2UgUkFESVVTX0FUVFJfTkFTX0lERU5USUZJRVI6CisJCQljYXNlIFJBRElVU19BVFRSX05BU19JUFY2X0FERFJFU1M6CisJCQkJZ290X2lkID0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUkFESVVTX0FUVFJfTUVTU0FHRV9BVVRIRU5USUNBVE9SOgorCQkJCWdvdF9tYWMgPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSBSQURJVVNfQVRUUl9FQVBfTUVTU0FHRToKKwkJCQlnb3RfZWFwID0gMTsKKwkJCQlpZiAoYXR0ci0+bGVuZ3RoID09IDIpCisJCQkJCWdvdF9lbXB0eV9lYXAgPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSBSQURJVVNfQVRUUl9VU0VSX1BBU1NXT1JEOgorCQkJY2FzZSBSQURJVVNfQVRUUl9DSEFQX1BBU1NXT1JEOgorCQkJY2FzZSBSQURJVVNfQVRUUl9BUkFQX1BBU1NXT1JEOgorCQkJCWdvdF9wYXNzd2QgKz0gMTsKKwkJCQlicmVhazsKKwkJCQkKKwkJCS8qIElzIHRoZXJlIGEgU3RhdGUgYXR0cmlidXRlIHdpdGggcHJlZml4ICJEaWFtZXRlci8iIGluIHRoZSBtZXNzYWdlPyAoaW4gdGhhdCBjYXNlOiBEaWFtZXRlci9EZXN0aW5hdGlvbi1Ib3N0L0Rlc3RpbmF0aW9uLVJlYWxtL1Nlc3Npb24tSWQpICovCisJCQkvKiBOT1RFOiBSRkM0MDA1IHNheXMgIk9yaWdpbi1Ib3N0IiBoZXJlLCBidXQgaXQncyBub3QgY29oZXJlbnQgd2l0aCB0aGUgcnVsZXMgZm9yIGFuc3dlcnMuIERlc3RpbmF0aW9uLUhvc3QgbWFrZXMgbW9yZSBzZW5zZSAqLworCQkJY2FzZSBSQURJVVNfQVRUUl9TVEFURToKKwkJCQlpZiAoKGF0dHJfbGVuID4gcHJlZl9sZW4gKyA1IC8qIGZvciB0aGUgJy8ncyBhbmQgbm9uIGVtcHR5IHN0cmluZ3MgKi8gKSAKKwkJCQkJJiYgISBtZW1jbXAoYXR0cl92YWwsIHByZWZpeCwgcHJlZl9sZW4pKSB7CisJCQkJCWludCBpLCBzdGFydDsKKworCQkJCQlUUkFDRV9ERUJVRyhBTk5PWUlORywgIkZvdW5kIGEgU3RhdGUgYXR0cmlidXRlIHdpdGggJyVzJyBwcmVmaXggKGF0dHIgIyVkKS4iLCBwcmVmaXgsIGlkeCk7CisKKwkJCQkJLyogTm93IHBhcnNlIHRoZSB2YWx1ZSBhbmQgY2hlY2sgaXRzIGNvbnRlbnQgaXMgdmFsaWQuIFVuZm9ydHVuYXRlbHkgd2UgY2Fubm90IHVzZSBzdHJjaHIgaGVyZSBzaW5jZSBzdHJpbmdzIGFyZSBub3QgXDAtdGVybWluYXRlZCAqLworCisJCQkJCWkgPSBzdGFydCA9IHByZWZfbGVuOworCQkJCQlkaCA9IGF0dHJfdmFsICsgaTsKKwkJCQkJZm9yICg7IChpIDwgYXR0cl9sZW4gLSAyKSAmJiAoYXR0cl92YWxbaV0gIT0gJy8nKTsgaSsrKSAvKiBsb29wICovOworCQkJCQlpZiAoIGkgPj0gYXR0cl9sZW4gLSAyICkgY29udGludWU7IC8qIHRoZSBhdHRyaWJ1dGUgZm9ybWF0IGlzIG5vdCBnb29kICovCisJCQkJCWRoX2xlbiA9IGkgLSBzdGFydDsKKworCQkJCQlzdGFydCA9ICsraTsKKwkJCQkJZHIgPSBhdHRyX3ZhbCArIGk7CisJCQkJCWZvciAoOyAoaSA8IGF0dHJfbGVuIC0gMSkgJiYgKGF0dHJfdmFsW2ldICE9ICcvJyk7IGkrKykgLyogbG9vcCAqLzsKKwkJCQkJaWYgKCBpID49IGF0dHJfbGVuIC0gMSApIGNvbnRpbnVlOyAvKiB0aGUgYXR0cmlidXRlIGZvcm1hdCBpcyBub3QgZ29vZCAqLworCQkJCQlkcl9sZW4gPSBpIC0gc3RhcnQ7CisKKwkJCQkJaSsrOworCQkJCQlzaSA9IGF0dHJfdmFsICsgaTsKKwkJCQkJc2lfbGVuID0gYXR0cl9sZW4gLSBpOworCisJCQkJCVRSQUNFX0RFQlVHKEFOTk9ZSU5HLCAiQXR0cmlidXRlIHBhcnNlZCBzdWNjZXNzZnVsbHk6IERIOiclLipzJyBEUjonJS4qcycgU0k6JyUuKnMnLiIsIChpbnQpZGhfbGVuLCBkaCwgKGludClkcl9sZW4sIGRyLCAoaW50KXNpX2xlbiwgc2kpOworCQkJCQkvKiBSZW1vdmUgZnJvbSB0aGUgbWVzc2FnZSAqLworCQkJCQlmb3IgKGkgPSBpZHggKyAxOyBpIDwgcmFkX3JlcS0+YXR0cl91c2VkOyBpKyspCisJCQkJCQlyYWRfcmVxLT5hdHRyX3Bvc1tpIC0gMV0gPSByYWRfcmVxLT5hdHRyX3Bvc1tpXTsKKwkJCQkJcmFkX3JlcS0+YXR0cl91c2VkIC09IDE7CisJCQkJCWlkeC0tOworCQkJCX0KKwkJCQlicmVhazsKKwkJCisJCQljYXNlIFJBRElVU19BVFRSX1VTRVJfTkFNRToKKwkJCQlUUkFDRV9ERUJVRyhBTk5PWUlORywgIkZvdW5kIGEgVXNlci1OYW1lIGF0dHJpYnV0ZTogJyUuKnMnIiwgKGludClhdHRyX2xlbiwgYXR0cl9sZW4gPyAoY2hhciAqKWF0dHJfdmFsIDogIiIpOworCQkJCXVuID0gYXR0cl92YWw7CisJCQkJdW5fbGVuID0gYXR0cl9sZW47CisJCQkJYnJlYWs7CisJCQkKKwkJfQorCX0KKwlpZiAoIWdvdF9pZCkgeworCQlUUkFDRV9ERUJVRyhJTkZPLCAiUkFESVVTIEFjY2Vzcy1SZXF1ZXN0IGRpZCBub3QgY29udGFpbiBhIE5BUyBJUCBvciBJZGVudGlmaWVyIGF0dHJpYnV0ZSwgcmVqZWN0LiIpOworCQlyZXR1cm4gRUlOVkFMOworCX0KKwkvKiBbTm90ZSAxXSBBbiBBY2Nlc3MtUmVxdWVzdCB0aGF0IGNvbnRhaW5zIGVpdGhlciBhIFVzZXItUGFzc3dvcmQgb3IKKwkgICBDSEFQLVBhc3N3b3JkIG9yIEFSQVAtUGFzc3dvcmQgb3Igb25lIG9yIG1vcmUgRUFQLU1lc3NhZ2UgYXR0cmlidXRlcworCSAgIE1VU1QgTk9UIGNvbnRhaW4gbW9yZSB0aGFuIG9uZSB0eXBlIG9mIHRob3NlIGZvdXIgYXR0cmlidXRlcy4gIElmIGl0CisJICAgZG9lcyBub3QgY29udGFpbiBhbnkgb2YgdGhvc2UgZm91ciBhdHRyaWJ1dGVzLCBpdCBTSE9VTEQgY29udGFpbiBhCisJICAgTWVzc2FnZS1BdXRoZW50aWNhdG9yLiAgSWYgYW55IHBhY2tldCB0eXBlIGNvbnRhaW5zIGFuIEVBUC1NZXNzYWdlCisJICAgYXR0cmlidXRlIGl0IE1VU1QgYWxzbyBjb250YWluIGEgTWVzc2FnZS1BdXRoZW50aWNhdG9yLiAgQSBSQURJVVMKKwkgICBzZXJ2ZXIgcmVjZWl2aW5nIGFuIEFjY2Vzcy1SZXF1ZXN0IG5vdCBjb250YWluaW5nIGFueSBvZiB0aG9zZSBmb3VyCisJICAgYXR0cmlidXRlcyBhbmQgYWxzbyBub3QgY29udGFpbmluZyBhIE1lc3NhZ2UtQXV0aGVudGljYXRvciBhdHRyaWJ1dGUKKwkgICBTSE9VTEQgc2lsZW50bHkgZGlzY2FyZCBpdC4gICovCisJaWYgKCgoZ290X2VhcCArIGdvdF9wYXNzd2QpID4gMSkgfHwgKGdvdF9lYXAgJiYgIWdvdF9tYWMpIHx8ICghZ290X2VhcCAmJiAhZ290X3Bhc3N3ZCAmJiAhZ290X21hYykpIHsKKwkJVFJBQ0VfREVCVUcoSU5GTywgIlJBRElVUyBBY2Nlc3MtUmVxdWVzdCBub3QgY29uZm9ybSB0byBSRkMzNTc5IHNlYyAzLjMgbm90ZSAxLCBkaXNjYXJkLiIpOworCQlyZXR1cm4gRUlOVkFMOworCX0KKwkKKwkKKwkKKwkvKgorCSAgICAgIC0gIElmIHRoZSBSQURJVVMgcmVxdWVzdCBjb250YWluZWQgYSBTdGF0ZSBhdHRyaWJ1dGUgYW5kIHRoZQorICAgICAgICAJIHByZWZpeCBvZiB0aGUgZGF0YSBpcyAiRGlhbWV0ZXIvIiwgdGhlIGRhdGEgZm9sbG93aW5nIHRoZQorICAgICAgICAJIHByZWZpeCBjb250YWlucyB0aGUgRGlhbWV0ZXIgT3JpZ2luLUhvc3QvT3JpZ2luLVJlYWxtL1Nlc3Npb24tCisgICAgICAgIAkgSWQuICBJZiBubyBzdWNoIGF0dHJpYnV0ZXMgYXJlIHByZXNlbnQgYW5kIHRoZSBSQURJVVMgY29tbWFuZAorICAgICAgICAJIGlzIGFuIEFjY2Vzcy1SZXF1ZXN0LCBhIG5ldyBTZXNzaW9uLUlkIGlzIGNyZWF0ZWQuICBUaGUKKyAgICAgICAgCSBTZXNzaW9uLUlkIGlzIGluY2x1ZGVkIGluIHRoZSBTZXNzaW9uLUlkIEFWUC4KKwkqLworCQorCS8qIEFkZCB0aGUgRGVzdGluYXRpb24tUmVhbG0gQVZQICovCisJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIGNzLT5kaWN0LkRlc3RpbmF0aW9uX1JlYWxtLCAwLCAmYXZwICkgKTsKKwlpZiAoZHIpIHsKKwkJdmFsdWUub3MuZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopZHI7CisJCXZhbHVlLm9zLmxlbiA9IGRyX2xlbjsKKwl9IGVsc2UgeworCQlpbnQgaSA9IDA7CisJCWlmICh1biAmJiAhIGNzLT5pZ25vcmVfbmFpKSB7CisJCQkvKiBJcyB0aGVyZSBhbiAnQCcgaW4gdGhlIHVzZXIgbmFtZT8gV2UgZG9uJ3QgY2FyZSBmb3IgZGVjb3JhdGVkIE5BSSBoZXJlICovCisJCQlmb3IgKGkgPSB1bl9sZW4gLSAyOyBpID4gMDsgaS0tKSB7CisJCQkJaWYgKHVuW2ldID09ICdAJykgeworCQkJCQlpKys7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoaSA8PSAwKSB7CisJCQkvKiBOb3QgZm91bmQgaW4gdGhlIFVzZXItTmFtZSA9PiB3ZSB1c2UgdGhlIGxvY2FsIGRvbWFpbiBvZiB0aGlzIGdhdGV3YXkgKi8KKwkJCXZhbHVlLm9zLmRhdGEgPSAodWludDhfdCAqKWZkX2dfY29uZmlnLT5jbmZfZGlhbXJsbTsKKwkJCXZhbHVlLm9zLmxlbiAgPSBmZF9nX2NvbmZpZy0+Y25mX2RpYW1ybG1fbGVuOworCQl9IGVsc2UgeworCQkJdmFsdWUub3MuZGF0YSA9IHVuICsgaTsKKwkJCXZhbHVlLm9zLmxlbiAgPSB1bl9sZW4gLSBpOworCQl9CisJfQorCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9zZXR2YWx1ZSAoIGF2cCwgJnZhbHVlICkgKTsKKwlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkICggKmRpYW1fZncsIE1TR19CUldfRklSU1RfQ0hJTEQsIGF2cCkgKTsKKwkKKwkvKiBBZGQgdGhlIERlc3RpbmF0aW9uLUhvc3QgaWYgZm91bmQgKi8KKwlpZiAoZGgpIHsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIGNzLT5kaWN0LkRlc3RpbmF0aW9uX0hvc3QsIDAsICZhdnAgKSApOworCQl2YWx1ZS5vcy5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilkaDsKKwkJdmFsdWUub3MubGVuID0gZGhfbGVuOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUgKCBhdnAsICZ2YWx1ZSApICk7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQgKCAqZGlhbV9mdywgTVNHX0JSV19GSVJTVF9DSElMRCwgYXZwKSApOworCX0KKwkKKwkvKiBDcmVhdGUgdGhlIHNlc3Npb24gaWYgaXQgaXMgbm90IGFscmVhZHkgZG9uZSAqLworCXsKKwkJb3MwX3Qgc2Vzc19zdHIgPSBOVUxMOworCQlzaXplX3Qgc2Vzc19zdHJsZW47CisJCQorCQlpZiAoc2lfbGVuKSB7CisJCQkvKiBXZSBhbHJlYWR5IGhhdmUgdGhlIFNlc3Npb24tSWQsIGp1c3QgdXNlIGl0ICovCisJCQlDSEVDS19GQ1QoIGZkX3Nlc3NfZnJvbXNpZF9tc2cgKCBzaSwgc2lfbGVuLCAmc2VzcywgTlVMTCkgKTsKKwkJfSBlbHNlIHsKKwkJCS8qIENyZWF0ZSBhIG5ldyBTZXNzaW9uLUlkIHN0cmluZyAqLworCQkJCisJCQlEaWFtSWRfdCBmcWRuOworCQkJc2l6ZV90IGZxZG5sZW47CisJCQlEaWFtSWRfdCByZWFsbTsKKwkJCXNpemVfdCByZWFsbWxlbjsKKwkJCQorCQkJLyogR2V0IGluZm9ybWF0aW9uIG9uIHRoZSBSQURJVVMgY2xpZW50ICovCisJCQlDSEVDS19GQ1QoIHJnd19jbGllbnRzX2dldF9vcmlnaW4oY2xpLCAmZnFkbiwgJmZxZG5sZW4sICZyZWFsbSwgJnJlYWxtbGVuKSApOworCQkJCisJCQkvKiBJZiB3ZSBoYXZlIGEgdXNlciBuYW1lLCBjcmVhdGUgdGhlIG5ldyBzZXNzaW9uIHdpdGggaXQgKi8KKwkJCWlmICh1bikgeworCQkJCWludCBsZW47CisJCQkJLyogSWYgbm90IGZvdW5kLCBjcmVhdGUgYSBuZXcgU2Vzc2lvbi1JZC4gT3VyIGZvcm1hdCBpczoge2ZxZG47aGkzMjtsbzMyO3VzZXJuYW1lO2RpYW1pZH0gKi8KKwkJCQlDSEVDS19NQUxMT0MoIHNlc3Nfc3RyID0gbWFsbG9jKHVuX2xlbiArIDEgLyogJzsnICovICsgZmRfZ19jb25maWctPmNuZl9kaWFtaWRfbGVuICsgMSAvKiAnXDAnICovKSApOworCQkJCWxlbiA9IHNwcmludGYoKGNoYXIgKilzZXNzX3N0ciwgIiUuKnM7JXMiLCAoaW50KXVuX2xlbiwgdW4sIGZkX2dfY29uZmlnLT5jbmZfZGlhbWlkKTsKKwkJCQlDSEVDS19GQ1QoIGZkX3Nlc3NfbmV3KCZzZXNzLCBmcWRuLCBmcWRubGVuLCBzZXNzX3N0ciwgbGVuKSApOworCQkJCWZyZWUoc2Vzc19zdHIpOworCQkJfSBlbHNlIHsKKwkJCQkvKiBXZSBkb24ndCBoYXZlIGVub3VnaCBpbmZvcm1hdGlvbiB0byBjcmVhdGUgdGhlIFNlc3Npb24tSWQsIHRoZSBSQURJVVMgbWVzc2FnZSBpcyBwcm9iYWJseSBpbnZhbGlkICovCisJCQkJVFJBQ0VfREVCVUcoSU5GTywgIlJBRElVUyBBY2Nlc3MtUmVxdWVzdCBkb2VzIG5vdCBjb250YWluIGEgVXNlci1OYW1lIGF0dHJpYnV0ZSwgcmVqZWN0aW5nLiIpOworCQkJCXJldHVybiBFSU5WQUw7CisJCQl9CQorCQl9CisJCQorCQkvKiBOb3csIGFkZCB0aGUgU2Vzc2lvbi1JZCBBVlAgYXQgYmVnaW5uaW5nIG9mIERpYW1ldGVyIG1lc3NhZ2UgKi8KKwkJQ0hFQ0tfRkNUKCBmZF9zZXNzX2dldHNpZChzZXNzLCAmc2Vzc19zdHIsICZzZXNzX3N0cmxlbikgKTsKKwkJVFJBQ0VfREVCVUcoRlVMTCwgIlthdXRoLnJnd3hdIFRyYW5zbGF0aW5nIG5ldyBtZXNzYWdlIGZvciBzZXNzaW9uICclcycuLi4iLCBzZXNzX3N0cik7CisJCQorCQkvKiBOb3cgYWRkIHRoaXMgc2Vzc2lvbiBpbiB0aGUgbWVzc2FnZSAqLworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3ICggY3MtPmRpY3QuU2Vzc2lvbl9JZCwgMCwgJmF2cCApICk7CisJCXZhbHVlLm9zLmRhdGEgPSBzZXNzX3N0cjsKKwkJdmFsdWUub3MubGVuID0gc2Vzc19zdHJsZW47CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9zZXR2YWx1ZSAoIGF2cCwgJnZhbHVlICkgKTsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCAoICpkaWFtX2Z3LCBNU0dfQlJXX0ZJUlNUX0NISUxELCBhdnApICk7CisJCUNIRUNLX0ZDVCggZmRfbXNnX3Nlc3Nfc2V0KCpkaWFtX2Z3LCBzZXNzKSApOworCX0KKwkKKwkKKwkvKiBBZGQgdGhlIGFwcHJvcHJpYXRlIGNvbW1hbmQgY29kZSAmIEF1dGgtQXBwbGljYXRpb24tSWQgKi8KKwl7CisJCXN0cnVjdCBtc2dfaGRyICogaGVhZGVyID0gTlVMTDsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfaGRyICggKmRpYW1fZncsICZoZWFkZXIgKSApOworCQloZWFkZXItPm1zZ19mbGFncyA9IENNRF9GTEFHX1JFUVVFU1QgfCBDTURfRkxBR19QUk9YSUFCTEU7CisJCWlmIChnb3RfZWFwKSB7CisJCQloZWFkZXItPm1zZ19jb2RlID0gQ0NfRElBTUVURVJfRUFQOworCQkJaGVhZGVyLT5tc2dfYXBwbCA9IEFJX0VBUDsKKwkJfSBlbHNlIHsKKwkJCWhlYWRlci0+bXNnX2NvZGUgPSBDQ19BQTsKKwkJCWhlYWRlci0+bXNnX2FwcGwgPSBBSV9OQVNSRVE7CisJCX0KKwkJCisJCS8qIEFkZCB0aGUgQXV0aC1BcHBsaWNhdGlvbi1JZCAqLworCQl7CisJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3ICggY3MtPmRpY3QuQXV0aF9BcHBsaWNhdGlvbl9JZCwgMCwgJmF2cCApICk7CisJCQl2YWx1ZS5pMzIgPSBoZWFkZXItPm1zZ19hcHBsOworCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX3NldHZhbHVlICggYXZwLCAmdmFsdWUgKSApOworCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCAoICpkaWFtX2Z3LCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCkgKTsKKwkJfQorCX0KKwkKKwkvKiAgCVRoZSB0eXBlIG9mIHJlcXVlc3QgaXMgaWRlbnRpZmllZCB0aHJvdWdoIHRoZSBBdXRoLVJlcXVlc3QtVHlwZSBBVlAKKwkJW0JBU0VdLiAgVGhlIHJlY29tbWVuZGVkIHZhbHVlIGZvciBtb3N0IFJBRElVUyBpbnRlcm9wZXJhYmlseQorCQlzaXR1YXRpb25zIGlzIEFVVEhPUklaRV9BVVRIRU5USUNBVEUuICovCisJCisJLyogQWRkIEF1dGgtUmVxdWVzdC1UeXBlIEFWUCAqLworCXsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIGNzLT5kaWN0LkF1dGhfUmVxdWVzdF9UeXBlLCAwLCAmYXZwICkgKTsKKwkJdmFsdWUuaTMyID0gQUNWX0FSVF9BVVRIT1JJWkVfQVVUSEVOVElDQVRFOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUgKCBhdnAsICZ2YWx1ZSApICk7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQgKCAqZGlhbV9mdywgTVNHX0JSV19MQVNUX0NISUxELCBhdnApICk7CisJfQorCQorCS8qIEFkZCBPcmlnaW4tQUFBLVByb3RvY29sIEFWUCAqLworCXsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIGNzLT5kaWN0Lk9yaWdpbl9BQUFfUHJvdG9jb2wsIDAsICZhdnAgKSApOworCQl2YWx1ZS5pMzIgPSBBQ1ZfT0FQX1JBRElVUzsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX3NldHZhbHVlICggYXZwLCAmdmFsdWUgKSApOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkICggKmRpYW1fZncsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwKSApOworCX0KKwkKKwkvKiBDb252ZXJ0IHRoZSBFQVAgcGF5bG9hZCAoY29uY2F0IFJBRElVUyBhdHRyaWJ1dGVzKSAqLworCWlmIChnb3RfZWFwKSB7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBjcy0+ZGljdC5FQVBfUGF5bG9hZCwgMCwgJmF2cCApICk7CisJCQorCQkvKiAgICBvICBBbiBlbXB0eSBSQURJVVMgRUFQLU1lc3NhZ2UgYXR0cmlidXRlICh3aXRoIGxlbmd0aCAyKSBzaWduaWZpZXMKKwkJCSBFQVAtU3RhcnQsIGFuZCBpdCBpcyB0cmFuc2xhdGVkIHRvIGFuIGVtcHR5IEVBUC1QYXlsb2FkIEFWUC4gKi8KKwkJaWYgKGdvdF9lbXB0eV9lYXApIHsKKwkJCXZhbHVlLm9zLmxlbiA9IDA7CisJCQl2YWx1ZS5vcy5kYXRhID0gKHVpbnQ4X3QgKikiIjsKKwkJfSBlbHNlIHsKKwkJCUNIRUNLX01BTExPQyggdmFsdWUub3MuZGF0YSA9IHJhZGl1c19tc2dfZ2V0X2VhcChyYWRfcmVxLCAmdmFsdWUub3MubGVuKSApOworCQl9CisJCQorCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUgKCBhdnAsICZ2YWx1ZSApICk7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQgKCAqZGlhbV9mdywgTVNHX0JSV19MQVNUX0NISUxELCBhdnApICk7CisJfQorCQorCS8qIFR1bm5lbCBBVlBzIG5lZWQgc29tZSBwcmVwYXJhdGlvbiAqLworCS8qIENvbnZlcnQgdGhlIGF0dHJpYnV0ZXMgb25lIGJ5IG9uZSAqLworCWZvciAoaWR4ID0gMDsgaWR4IDwgcmFkX3JlcS0+YXR0cl91c2VkOyBpZHgrKykgeworCQlzdHJ1Y3QgcmFkaXVzX2F0dHJfaGRyICogYXR0ciA9IChzdHJ1Y3QgcmFkaXVzX2F0dHJfaGRyICopKHJhZF9yZXEtPmJ1ZiArIHJhZF9yZXEtPmF0dHJfcG9zW2lkeF0pOworCisJCXN3aXRjaCAoYXR0ci0+dHlwZSkgeworCQkJCisJCQkvKiBUaGlzIG1hY3JvIGNvbnZlcnRzIGEgUkFESVVTIGF0dHJpYnV0ZSB0byBhIERpYW1ldGVyIEFWUCBvZiB0eXBlIE9jdGV0U3RyaW5nICovCisJCQkjZGVmaW5lIENPTlYyRElBTV9TVFIoIF9kaWN0b2JqXyApCVwKKwkJCQlDSEVDS19QQVJBTVMoIGF0dHItPmxlbmd0aCA+PSBzaXplb2Yoc3RydWN0IHJhZGl1c19hdHRyX2hkcikgKTsJCQlcCisJCQkJLyogQ3JlYXRlIHRoZSBBVlAgd2l0aCB0aGUgc3BlY2lmaWVkIGRpY3Rpb25hcnkgbW9kZWwgKi8JCQlcCisJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIGNzLT5kaWN0Ll9kaWN0b2JqXywgMCwgJmF2cCApICk7CQkJXAorCQkJCXZhbHVlLm9zLmxlbiA9IGF0dHItPmxlbmd0aCAtIHNpemVvZihzdHJ1Y3QgcmFkaXVzX2F0dHJfaGRyKTsJCQlcCisJCQkJdmFsdWUub3MuZGF0YSA9IChvczBfdCkoYXR0ciArIDEpOwkJCQkJCVwKKwkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUgKCBhdnAsICZ2YWx1ZSApICk7CQkJCVwKKwkJCQkvKiBBZGQgdGhlIEFWUCBpbiB0aGUgRGlhbWV0ZXIgbWVzc2FnZS4gKi8JCQkJCVwKKwkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkICggKmRpYW1fZncsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwKSApOwkJXAorCQkJCQorCQkJLyogU2FtZSB0aGluZywgZm9yIHNjYWxhciBBVlBzIG9mIDMyIGJpdHMgKi8KKwkJCSNkZWZpbmUgQ09OVjJESUFNXzMyQiggX2RpY3RvYmpfICkJXAorCQkJCUNIRUNLX1BBUkFNUyggYXR0ci0+bGVuZ3RoID09IHNpemVvZihzdHJ1Y3QgcmFkaXVzX2F0dHJfaGRyKStzaXplb2YodWludDMyX3QpICk7XAorCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBjcy0+ZGljdC5fZGljdG9ial8sIDAsICZhdnAgKSApOwkJCVwKKwkJCQl7CQkJCQkJCQkJCVwKKwkJCQkJdWludDhfdCAqIHYgPSAodWludDhfdCAqKShhdHRyICsgMSk7CQkJCQlcCisJCQkJCXZhbHVlLnUzMiAgPSAodlswXSA8PCAyNCkJCQkJCQlcCisJCQkJCSAgICAgICAgICAgfCAodlsxXSA8PCAxNikJCQkJCQlcCisJCQkJCSAgICAgICAgICAgfCAodlsyXSA8PCAgOCkJCQkJCQlcCisJCQkJCSAgICAgICAgICAgfCAgdlszXSA7CQkJCQkJCVwKKwkJCQl9CQkJCQkJCQkJCVwKKwkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUgKCBhdnAsICZ2YWx1ZSApICk7CQkJCVwKKwkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkICggKmRpYW1fZncsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwKSApOwkJXAorCQkJCQorCQkJLyogQW5kIHRoZSA2NGIgdmVyc2lvbiAqLworCQkJI2RlZmluZSBDT05WMkRJQU1fNjRCKCBfZGljdG9ial8gKQlcCisJCQkJQ0hFQ0tfUEFSQU1TKCBhdHRyLT5sZW5ndGggPT0gc2l6ZW9mKHN0cnVjdCByYWRpdXNfYXR0cl9oZHIpK3NpemVvZih1aW50NjRfdCkgKTtcCisJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIGNzLT5kaWN0Ll9kaWN0b2JqXywgMCwgJmF2cCApICk7CQkJXAorCQkJCXsJCQkJCQkJCQkJXAorCQkJCQl1aW50OF90ICogdiA9ICh1aW50OF90ICopKGF0dHIgKyAxKTsJCQkJCVwKKwkJCQkJdmFsdWUudTY0ICA9ICgodWludDY0X3QpKHZbMF0pIDw8IDU2KQkJCQkJXAorCQkJCQkgICAgICAgICAgIHwgKCh1aW50NjRfdCkodlsxXSkgPDwgNDgpCQkJCQlcCisJCQkJCSAgICAgICAgICAgfCAoKHVpbnQ2NF90KSh2WzJdKSA8PCA0MCkJCQkJCVwKKwkJCQkJICAgICAgICAgICB8ICgodWludDY0X3QpKHZbM10pIDw8IDMyKQkJCQkJXAorCQkJCQkgICAgICAgICAgIHwgKCh1aW50NjRfdCkodls0XSkgPDwgMjQpCQkJCQlcCisJCQkJCSAgICAgICAgICAgfCAoKHVpbnQ2NF90KSh2WzVdKSA8PCAxNikJCQkJCVwKKwkJCQkJICAgICAgICAgICB8ICgodWludDY0X3QpKHZbNl0pIDw8ICA4KQkJCQkJXAorCQkJCQkgICAgICAgICAgIHwgICh1aW50NjRfdCkodls3XSkgOwkJCQkJXAorCQkJCX0JCQkJCQkJCQkJXAorCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9zZXR2YWx1ZSAoIGF2cCwgJnZhbHVlICkgKTsJCQkJXAorCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQgKCAqZGlhbV9mdywgTVNHX0JSV19MQVNUX0NISUxELCBhdnApICk7CQlcCisJCQkJCisJCS8qIFJGQyAyODY1ICovCQorCQkJLyoKKwkJCSAgICAgIC0gIFRoZSBEZXN0aW5hdGlvbi1SZWFsbSBBVlAgaXMgY3JlYXRlZCBmcm9tIHRoZSBpbmZvcm1hdGlvbiBmb3VuZAorICAgICAgICAJCQkgaW4gdGhlIFJBRElVUyBVc2VyLU5hbWUgYXR0cmlidXRlLgorCQkJCSAJLT4gZG9uZSBpbiByZ3dfY2xpZW50c19jcmVhdGVfb3JpZ2luCisJCQkqLworCQkJY2FzZSBSQURJVVNfQVRUUl9VU0VSX05BTUU6CisJCQkJQ09OVjJESUFNX1NUUiggVXNlcl9OYW1lICk7CisJCQkJYnJlYWs7CisJCQkJCisJCQkvKgorCQkJICAgICAgLSAgSWYgdGhlIFJBRElVUyBVc2VyLVBhc3N3b3JkIGF0dHJpYnV0ZSBpcyBwcmVzZW50LCB0aGUgcGFzc3dvcmQKKyAgICAgICAgCQkJIG11c3QgYmUgdW5lbmNyeXB0ZWQgYnkgdXNpbmcgdGhlIGxpbmsncyBSQURJVVMgc2hhcmVkIHNlY3JldC4KKyAgICAgICAgCQkJIFRoZSB1bmVuY3J5cHRlZCB2YWx1ZSBtdXN0IGJlIGZvcndhcmRlZCBpbiBhIFVzZXItUGFzc3dvcmQgQVZQCisgICAgICAgIAkJCSB1c2luZyBEaWFtZXRlciBzZWN1cml0eS4KKwkJCSovCisJCQljYXNlIFJBRElVU19BVFRSX1VTRVJfUEFTU1dPUkQ6CisJCQkJaWYgKChhdHRyLT5sZW5ndGggLSAyKSAlIDE2KSB7CisJCQkJCVRSQUNFX0RFQlVHKElORk8sICJJbnZhbGlkIGxlbmd0aCBvZiBVc2VyLVBhc3N3b3JkIGF0dHJpYnV0ZTogJWhoZCIsIGF0dHItPmxlbmd0aCk7CisJCQkJCXJldHVybiBFSU5WQUw7CisJCQkJfQorCQkJCXsKKwkJCQkJLyogRGVjaXBoZXIgZm9sbG93aW5nIHRoaXMgbG9naWMgKHJlZmVycyB0byByZmMyODY1I3NlY3Rpb24tNS4yICkKKwkJCQkJICAgYjEgPSBNRDUoUyArIFJBKQlwMSA9IGMoMSkgeG9yIGIxCisJCQkJCSAgIGIyID0gTUQ1KFMgKyBjKDEpKSAgIHAyID0gYygyKSB4b3IgYjIKKwkJCQkJICAgLi4uCisJCQkJCSovCisJCQkJCQorCQkJCQl1aW50OF90ICpjaXBoID0gKHVpbnQ4X3QgKikoYXR0cisxKTsgCS8qIGMoaSkgKi8KKwkJCQkJc2l6ZV90IGNpcGhfbGVuID0gYXR0ci0+bGVuZ3RoIC0gMjsKKwkJCQkJdWludDhfdCBkZWNpcGhbMTI4XTsJCQkvKiBwaSAqLworCQkJCQlzaXplX3QgZGVjaXBoX2xlbiA9IDA7CisJCQkJCXVpbnQ4X3QgKiBzZWNyZXQ7CQkJLyogUyAqLworCQkJCQlzaXplX3Qgc2VjcmV0X2xlbjsKKwkJCQkJdWludDhfdCBoYXNoWzE2XTsJCQkvKiBiKGkpICovCisJCQkJCWNvbnN0IHVpbnQ4X3QgKmFkZHJbMl07CisJCQkJCXNpemVfdCBsZW5bMl07CisJCQkJCQorCQkJCQkvKiBSZXRyaWV2ZSB0aGUgc2hhcmVkIHNlY3JldCAqLworCQkJCQlDSEVDS19GQ1Qocmd3X2NsaWVudHNfZ2V0a2V5KGNsaSwgJnNlY3JldCwgJnNlY3JldF9sZW4pKTsKKwkJCQkJCisJCQkJCS8qIEluaXRpYWwgYjEgPSBNRDUoUyArIFJBKSAqLworCQkJCQlhZGRyWzBdID0gc2VjcmV0OworCQkJCQlsZW5bMF0gPSBzZWNyZXRfbGVuOworCQkJCQlhZGRyWzFdID0gcmFkX3JlcS0+aGRyLT5hdXRoZW50aWNhdG9yOworCQkJCQlsZW5bMV0gPSAxNjsKKwkJCQkJbWQ1X3ZlY3RvcigyLCBhZGRyLCBsZW4sIGhhc2gpOworCQkJCQkKKwkJCQkJLyogbG9vcCAqLworCQkJCQl3aGlsZSAoZGVjaXBoX2xlbiA8IGNpcGhfbGVuKSB7CisJCQkJCQlpbnQgaTsKKwkJCQkJCS8qIHBpID0gYyhpKSB4b3IgYmkgKi8KKwkJCQkJCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCQkJCQkJCWRlY2lwaFtkZWNpcGhfbGVuICsgaV0gPSBjaXBoW2RlY2lwaF9sZW4gKyBpXSBeIGhhc2hbaV07CisJCQkJCQkJLyogZG8gd2UgaGF2ZSB0byByZW1vdmUgdGhlIHBhZGRpbmcgJ1wwJ3MgPyAqLworCQkJCQkJCisJCQkJCQkvKiBiKGkrMSkgPSBNRDUoUyArIGMoaSkgKi8KKwkJCQkJCWFkZHJbMV0gPSBjaXBoICsgZGVjaXBoX2xlbjsKKwkJCQkJCW1kNV92ZWN0b3IoMiwgYWRkciwgbGVuLCBoYXNoKTsKKwkJCQkJCQorCQkJCQkJZGVjaXBoX2xlbiArPSAxNjsKKwkJCQkJfQorCQkJCQkKKwkJCQkJLyogTm93IHNhdmUgdGhpcyB2YWx1ZSBpbiB0aGUgQVZQICovCisJCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBjcy0+ZGljdC5Vc2VyX1Bhc3N3b3JkLCAwLCAmYXZwICkgKTsKKwkJCQkJdmFsdWUub3MuZGF0YSA9ICZkZWNpcGhbMF07CisJCQkJCXZhbHVlLm9zLmxlbiAgPSBkZWNpcGhfbGVuOworCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUgKCBhdnAsICZ2YWx1ZSApICk7CisJCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQgKCAqZGlhbV9mdywgTVNHX0JSV19MQVNUX0NISUxELCBhdnApICk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJCQorCisJCQkvKgorCQkJICAgICAgLSAgSWYgdGhlIFJBRElVUyBDSEFQLVBhc3N3b3JkIGF0dHJpYnV0ZSBpcyBwcmVzZW50LCB0aGUgSWRlbnQgYW5kCisgICAgICAgIAkJCSBEYXRhIHBvcnRpb24gb2YgdGhlIGF0dHJpYnV0ZSBhcmUgdXNlZCB0byBjcmVhdGUgdGhlIENIQVAtQXV0aAorICAgICAgICAJCQkgZ3JvdXBlZCBBVlAuCisJCQkqLworCQkJY2FzZSBSQURJVVNfQVRUUl9DSEFQX1BBU1NXT1JEOgorCQkJCUNIRUNLX1BBUkFNUyggYXR0ci0+bGVuZ3RoID09IDE5IC8qIFJGQyAyODY1ICovKTsKKwkJCQl7CisJCQkJCXVpbnQ4X3QgKiBjID0gKHVpbnQ4X3QgKikoYXR0ciArIDEpOworCQkJCQlzdHJ1Y3QgYXZwICogY2hhcF9hdXRoOworCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3ICggY3MtPmRpY3QuQ0hBUF9BdXRoLCAwLCAmY2hhcF9hdXRoICkgKTsKKwkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCAoICpkaWFtX2Z3LCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGNoYXBfYXV0aCkgKTsKKworCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3ICggY3MtPmRpY3QuQ0hBUF9BbGdvcml0aG0sIDAsICZhdnAgKSApOworCQkJCQl2YWx1ZS51MzIgPSA1OyAvKiBUaGUgb25seSB2YWx1ZSBkZWZpbmVkIGN1cnJlbnRseS4uLiAqLworCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUgKCBhdnAsICZ2YWx1ZSApICk7CisJCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQgKCBjaGFwX2F1dGgsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwKSApOworCQkJCQkKKwkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIGNzLT5kaWN0LkNIQVBfSWRlbnQsIDAsICZhdnAgKSApOworCQkJCQl2YWx1ZS5vcy5kYXRhID0gYzsKKwkJCQkJdmFsdWUub3MubGVuID0gMTsKKwkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX3NldHZhbHVlICggYXZwLCAmdmFsdWUgKSApOworCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkICggY2hhcF9hdXRoLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCkgKTsKKwkJCQkJCisJCQkJCWMrKzsKKwkJCQkJCisJCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBjcy0+ZGljdC5DSEFQX1Jlc3BvbnNlLCAwLCAmYXZwICkgKTsKKwkJCQkJdmFsdWUub3MuZGF0YSA9IGM7CisJCQkJCXZhbHVlLm9zLmxlbiA9IGF0dHItPmxlbmd0aCAtIDM7CisJCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9zZXR2YWx1ZSAoIGF2cCwgJnZhbHVlICkgKTsKKwkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCAoIGNoYXBfYXV0aCwgTVNHX0JSV19MQVNUX0NISUxELCBhdnApICk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJCQorCQkJY2FzZSBSQURJVVNfQVRUUl9OQVNfSVBfQUREUkVTUzoKKwkJCQlDT05WMkRJQU1fU1RSKCBOQVNfSVBfQWRkcmVzcyApOworCQkJCWJyZWFrOworCQkJCQorCQkJY2FzZSBSQURJVVNfQVRUUl9OQVNfUE9SVDoKKwkJCQlDT05WMkRJQU1fMzJCKCBOQVNfUG9ydCApOworCQkJCWJyZWFrOworCQkJCQorCQkJY2FzZSBSQURJVVNfQVRUUl9TRVJWSUNFX1RZUEU6CisJCQkJQ09OVjJESUFNXzMyQiggU2VydmljZV9UeXBlICk7CisJCQkJYnJlYWs7CisJCQkJCisJCQljYXNlIFJBRElVU19BVFRSX0ZSQU1FRF9QUk9UT0NPTDoKKwkJCQlDT05WMkRJQU1fMzJCKCBGcmFtZWRfUHJvdG9jb2wgKTsKKwkJCQlicmVhazsKKwkJCQkKKwkJCWNhc2UgUkFESVVTX0FUVFJfRlJBTUVEX0lQX0FERFJFU1M6CisJCQkJQ09OVjJESUFNX1NUUiggRnJhbWVkX0lQX0FkZHJlc3MgKTsKKwkJCQlicmVhazsKKwkJCQkKKwkJCWNhc2UgUkFESVVTX0FUVFJfRlJBTUVEX0lQX05FVE1BU0s6CisJCQkJQ09OVjJESUFNX1NUUiggRnJhbWVkX0lQX05ldG1hc2sgKTsKKwkJCQlicmVhazsKKwkJCQkKKwkJCS8qIEZyYW1lZC1Sb3V0aW5nIG5ldmVyIHByZXNlbnQgaW4gYW4gQWNjZXNzLVJlcXVlc3QgKi8KKwkJCS8qIEZpbHRlci1JZCBuZXZlciBwcmVzZW50IGluIGFuIEFjY2Vzcy1SZXF1ZXN0ICovCisJCQkJCisJCQljYXNlIFJBRElVU19BVFRSX0ZSQU1FRF9NVFU6CisJCQkJQ09OVjJESUFNXzMyQiggRnJhbWVkX01UVSApOworCQkJCWJyZWFrOworCQkJCisJCQljYXNlIFJBRElVU19BVFRSX0ZSQU1FRF9DT01QUkVTU0lPTjoKKwkJCQlDT05WMkRJQU1fMzJCKCBGcmFtZWRfQ29tcHJlc3Npb24gKTsKKwkJCQlicmVhazsKKwkJCQorCQkJY2FzZSBSQURJVVNfQVRUUl9MT0dJTl9JUF9IT1NUOgorCQkJCUNPTlYyRElBTV9TVFIoIExvZ2luX0lQX0hvc3QgKTsKKwkJCQlicmVhazsKKwkJCQkKKwkJCS8qIExvZ2luLVNlcnZpY2UgbmV2ZXIgcHJlc2VudCBpbiBhbiBBY2Nlc3MtUmVxdWVzdCAqLworCQkJLyogTG9naW4tVENQLVBvcnQgbmV2ZXIgcHJlc2VudCBpbiBhbiBBY2Nlc3MtUmVxdWVzdCAqLworCQkJLyogUmVwbHktTWVzc2FnZSBuZXZlciBwcmVzZW50IGluIGFuIEFjY2Vzcy1SZXF1ZXN0ICovCisJCQkKKwkJCWNhc2UgUkFESVVTX0FUVFJfQ0FMTEJBQ0tfTlVNQkVSOgorCQkJCUNPTlYyRElBTV9TVFIoIENhbGxiYWNrX051bWJlciApOworCQkJCWJyZWFrOworCQkJCQorCQkJLyogQ2FsbGJhY2stSWQgbmV2ZXIgcHJlc2VudCBpbiBhbiBBY2Nlc3MtUmVxdWVzdCAqLworCQkJLyogRnJhbWVkLVJvdXRlIG5ldmVyIHByZXNlbnQgaW4gYW4gQWNjZXNzLVJlcXVlc3QgKi8KKwkJCS8qIEZyYW1lZC1JUFgtTmV0d29yayBuZXZlciBwcmVzZW50IGluIGFuIEFjY2Vzcy1SZXF1ZXN0ICovCisJCQkJCisJCQljYXNlIFJBRElVU19BVFRSX1NUQVRFOgorCQkJCUNPTlYyRElBTV9TVFIoIFN0YXRlICk7CisJCQkJYnJlYWs7CisJCQkKKwkJCS8qIENsYXNzIG5ldmVyIHByZXNlbnQgaW4gYW4gQWNjZXNzLVJlcXVlc3QgKi8KKwkJCQkKKwkJCWNhc2UgUkFESVVTX0FUVFJfVkVORE9SX1NQRUNJRklDOgorCQkJCS8qIFJGQyA0MDA1LCBTZWN0aW9uIDkuNiA6IAorCQkJCQkgICBTeXN0ZW1zIHRoYXQgZG9uJ3QgaGF2ZSB2ZW5kb3IgZm9ybWF0IGtub3dsZWRnZSBNQVkgZGlzY2FyZCBzdWNoCisJCQkJCSAgIGF0dHJpYnV0ZXMgd2l0aG91dCBrbm93aW5nIGEgc3VpdGFibGUgdHJhbnNsYXRpb24uCisJCQkJCSAgIAorCQkJCQkgICBbY29udmVyc2lvbiBydWxlIGluIDkuNi4yXQorCQkJCSAqLworCQkJCWlmIChhdHRyLT5sZW5ndGggPj0gNikgeworCQkJCQl1aW50MzJfdCB2ZW5kb3JfaWQ7CisJCQkJCXVpbnQ4X3QgKiBjID0gKHVpbnQ4X3QgKikoYXR0ciArIDEpOworCQkJCQkKKwkJCQkJdmVuZG9yX2lkID0gY1swXSA8PCAyNCB8IGNbMV0gPDwgMTYgfCBjWzJdIDw8IDggfCBjWzNdOworCQkJCQljICs9IDQ7CisJCQkJCQorCQkJCQlzd2l0Y2ggKHZlbmRvcl9pZCkgeworCQkJCQkJCisJCQkJCQkvKiBGb3IgdGhlIHZlbmRvcnMgd2UgS05PVyB0aGV5IGZvbGxvdyB0aGUgVlNBIHJlY29tbWVuZGVkIGZvcm1hdCwgd2UgY29udmVydCBmb2xsb3dpbmcgdGhlIHJ1bGVzIG9mIFJGQzQwMDUgKDkuNi4yKSAqLworCQkJCQkJY2FzZSBSQURJVVNfVkVORE9SX0lEX01JQ1JPU09GVCA6IC8qIFJGQyAyNTQ4ICovCisJCQkJCQkvKiBvdGhlciB2ZW5kb3JzID8gKi8KKwkJCQkJCXsKKwkJCQkJCQlzaXplX3QgbGVmdDsKKwkJCQkJCQlzdHJ1Y3QgcmFkaXVzX2F0dHJfdmVuZG9yICp2dGx2OworCQkJCQkJCQorCQkJCQkJCWxlZnQgPSBhdHRyLT5sZW5ndGggLSA2OworCQkJCQkJCXZ0bHYgPSAoc3RydWN0IHJhZGl1c19hdHRyX3ZlbmRvciAqKWM7CisJCQkJCQkKKwkJCQkJCQl3aGlsZSAoKGxlZnQgPj0gMikgJiYgKHZ0bHYtPnZlbmRvcl9sZW5ndGggPD0gbGVmdCkpIHsKKwkJCQkJCQkJLyogU2VhcmNoIG91ciBkaWN0aW9uYXJ5IGZvciBjb3JyZXNwb25kaW5nIFZlbmRvcidzIEFWUCAqLworCQkJCQkJCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCByZXE7CisJCQkJCQkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cF9tb2RlbCA9IE5VTEw7CisJCQkJCQkJCW1lbXNldCgmcmVxLCAwLCBzaXplb2Yoc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QpKTsKKwkJCQkJCQkJcmVxLmF2cF92ZW5kb3IgPSB2ZW5kb3JfaWQ7CisJCQkJCQkJCXJlcS5hdnBfY29kZSA9IHZ0bHYtPnZlbmRvcl90eXBlOworCQkJCQkJCQkKKwkJCQkJCQkJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX0NPREVfQU5EX1ZFTkRPUiwgJnJlcSwgJmF2cF9tb2RlbCwgMCkgKTsKKwkJCQkJCQkJaWYgKCFhdnBfbW9kZWwpIHsKKwkJCQkJCQkJCVRSQUNFX0RFQlVHKEZVTEwsICJVbmtub3duIGF0dHJpYnV0ZSAodmVuZG9yIDB4JXgsIGNvZGUgMHgleCkgaWdub3JlZC4iLCByZXEuYXZwX3ZlbmRvciwgcmVxLmF2cF9jb2RlKTsKKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBhdnBfbW9kZWwsIDAsICZhdnAgKSApOworCQkJCQkJCQkJdmFsdWUub3MubGVuID0gdnRsdi0+dmVuZG9yX2xlbmd0aCAtIDI7CisJCQkJCQkJCQl2YWx1ZS5vcy5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikodnRsdiArIDEpOworCQkJCQkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX3NldHZhbHVlICggYXZwLCAmdmFsdWUgKSApOworCQkJCQkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCAoICpkaWFtX2Z3LCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCkgKTsKKwkJCQkJCQkJfQorCQkJCQkJCQljICs9IHZ0bHYtPnZlbmRvcl9sZW5ndGg7CisJCQkJCQkJCWxlZnQgLT0gdnRsdi0+dmVuZG9yX2xlbmd0aDsKKwkJCQkJCQkJdnRsdiA9IChzdHJ1Y3QgcmFkaXVzX2F0dHJfdmVuZG9yICopYzsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJCQorCQkJCQkJLyogT3RoZXIgdmVuZG9ycyB3ZSBLTk93IGhvdyB0byBjb252ZXJ0IHRoZSBhdHRyaWJ1dGVzIHdvdWxkIGJlIGFkZGVkIGhlcmUuLi4gKi8KKwkJCQkJCS8qIGNhc2UgUkFESVVTX1ZFTkRPUl9JRF9DSVNDTyA6CisJCQkJCQkJYnJlYWs7ICovCisJCQkJCQkvKiBjYXNlIFJBRElVU19WRU5ET1JfSURfSUVURiA6IChleHRlbmRlZCBSQURJVVMgYXR0cmlidXRlcykKKwkJCQkJCQlicmVhazsgKi8KKwkJCQkJCQorCQkJCQkJLyogV2hlbiB3ZSBkb24ndCBrbm93LCBqdXN0IGRpc2NhcmQgdGhlIGF0dHJpYnV0ZS4uLiBWU0EgYXJlIG9wdGlvbmFsIHdpdGggcmVnYXJkcyB0byBSQURJVVMgYW55d2F5ICovCisJCQkJCQlkZWZhdWx0OgorCQkJCQkJCS8qIGRvIG5vdGhpbmcgKi8KKwkJCQkJCQlUUkFDRV9ERUJVRyhGVUxMLCAiVlNBIGF0dHJpYnV0ZSBmcm9tIHZlbmRvciAlZCBkaXNjYXJkZWQiLCB2ZW5kb3JfaWQpOworCQkJCQkJCQorCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworCQkJCQorCQkJLyogU2Vzc2lvbi1UaW1lb3V0IG5ldmVyIHByZXNlbnQgaW4gYW4gQWNjZXNzLVJlcXVlc3QgKi8KKwkJCS8qIElkbGUtVGltZW91dCBuZXZlciBwcmVzZW50IGluIGFuIEFjY2Vzcy1SZXF1ZXN0ICovCisJCQkvKiBUZXJtaW5hdGlvbi1BY3Rpb24gbmV2ZXIgcHJlc2VudCBpbiBhbiBBY2Nlc3MtUmVxdWVzdCAqLworCQkJCQorCQkJY2FzZSBSQURJVVNfQVRUUl9DQUxMRURfU1RBVElPTl9JRDoKKwkJCQlDT05WMkRJQU1fU1RSKCBDYWxsZWRfU3RhdGlvbl9JZCApOworCQkJCWJyZWFrOworCQkJCisJCQljYXNlIFJBRElVU19BVFRSX0NBTExJTkdfU1RBVElPTl9JRDoKKwkJCQlDT05WMkRJQU1fU1RSKCBDYWxsaW5nX1N0YXRpb25fSWQgKTsKKwkJCQlicmVhazsKKwkJCQorCQkJY2FzZSBSQURJVVNfQVRUUl9OQVNfSURFTlRJRklFUjoKKwkJCQlDT05WMkRJQU1fU1RSKCBOQVNfSWRlbnRpZmllciApOworCQkJCWJyZWFrOworCQkJCisJCQkvKiBQcm94eS1TdGF0ZSBpcyBoYW5kbGVkIGJ5IGVjaG9fZHJvcC5yZ3d4IHBsdWdpbiwgd2UgaWdub3JlIGl0IGhlcmUgKi8KKwkJCQorCQkJY2FzZSBSQURJVVNfQVRUUl9MT0dJTl9MQVRfU0VSVklDRToKKwkJCQlDT05WMkRJQU1fU1RSKCBMb2dpbl9MQVRfU2VydmljZSApOworCQkJCWJyZWFrOworCQkJCisJCQljYXNlIFJBRElVU19BVFRSX0xPR0lOX0xBVF9OT0RFOgorCQkJCUNPTlYyRElBTV9TVFIoIExvZ2luX0xBVF9Ob2RlICk7CisJCQkJYnJlYWs7CisJCQkKKwkJCWNhc2UgUkFESVVTX0FUVFJfTE9HSU5fTEFUX0dST1VQOgorCQkJCUNPTlYyRElBTV9TVFIoIExvZ2luX0xBVF9Hcm91cCApOworCQkJCWJyZWFrOworCQkJCisJCQkvKiBGcmFtZWQtQXBwbGVUYWxrLUxpbmsgbmV2ZXIgcHJlc2VudCBpbiBhbiBBY2Nlc3MtUmVxdWVzdCAqLworCQkJLyogRnJhbWVkLUFwcGxlVGFsay1OZXR3b3JrIG5ldmVyIHByZXNlbnQgaW4gYW4gQWNjZXNzLVJlcXVlc3QgKi8KKwkJCS8qIEZyYW1lZC1BcHBsZVRhbGstWm9uZSBuZXZlciBwcmVzZW50IGluIGFuIEFjY2Vzcy1SZXF1ZXN0ICovCisJCQkKKwkJCWNhc2UgUkFESVVTX0FUVFJfQ0hBUF9DSEFMTEVOR0U6CisJCQkJQ09OVjJESUFNX1NUUiggQ0hBUF9DaGFsbGVuZ2UgKTsKKwkJCQlicmVhazsKKwkJCQorCQkJY2FzZSBSQURJVVNfQVRUUl9OQVNfUE9SVF9UWVBFOgorCQkJCUNPTlYyRElBTV8zMkIoIE5BU19Qb3J0X1R5cGUgKTsKKwkJCQlicmVhazsKKwkJCQorCQkJY2FzZSBSQURJVVNfQVRUUl9QT1JUX0xJTUlUOgorCQkJCUNPTlYyRElBTV8zMkIoIFBvcnRfTGltaXQgKTsKKwkJCQlicmVhazsKKwkJCQorCQkJY2FzZSBSQURJVVNfQVRUUl9MT0dJTl9MQVRfUE9SVDoKKwkJCQlDT05WMkRJQU1fU1RSKCBMb2dpbl9MQVRfUG9ydCApOworCQkJCWJyZWFrOworCQkJCisJCQkKKwkJLyogUkZDIDMxNjIgKi8JCisJCQljYXNlIFJBRElVU19BVFRSX05BU19JUFY2X0FERFJFU1M6CisJCQkJQ09OVjJESUFNX1NUUiggTkFTX0lQdjZfQWRkcmVzcyApOworCQkJCWJyZWFrOworCQkJCQorCQkJY2FzZSBSQURJVVNfQVRUUl9GUkFNRURfSU5URVJGQUNFX0lEOgorCQkJCUNPTlYyRElBTV82NEIoIEZyYW1lZF9JbnRlcmZhY2VfSWQgKTsKKwkJCQlicmVhazsKKwkJCQkKKwkJCWNhc2UgUkFESVVTX0FUVFJfRlJBTUVEX0lQVjZfUFJFRklYOgorCQkJCUNPTlYyRElBTV9TVFIoIEZyYW1lZF9JUHY2X1ByZWZpeCApOworCQkJCWJyZWFrOworCQkJCQorCQkJY2FzZSBSQURJVVNfQVRUUl9MT0dJTl9JUFY2X0hPU1Q6CisJCQkJQ09OVjJESUFNX1NUUiggTG9naW5fSVB2Nl9Ib3N0ICk7CisJCQkJYnJlYWs7CisJCQkJCisJCQkvKiBGcmFtZWQtSVB2Ni1Sb3V0ZSBuZXZlciBwcmVzZW50IGluIGFuIEFjY2Vzcy1SZXF1ZXN0ICovCisJCQkvKiBGcmFtZWQtSVB2Ni1Qb29sIG5ldmVyIHByZXNlbnQgaW4gYW4gQWNjZXNzLVJlcXVlc3QgKi8KKworCisJCS8qIFJGQyAyODY4ICovCisJCQkvKiBQcmVwYXJlIHRoZSB0b3AtbGV2ZWwgVHVubmVsaW5nIEFWUCBmb3IgZWFjaCB0YWcgdmFsdWVzLCBhcyBuZWVkZWQsIGFuZCBhZGQgdG8gdGhlIERpYW1ldGVyIG1lc3NhZ2UuCisJCQkJVGhpcyBtYWNybyBpcyBjYWxsZWQgd2hlbiBhbiBBVlAgaXMgYWRkZWQgaW5zaWRlIHRoZSBncm91cCwgc28gd2Ugd2lsbCBub3QgaGF2ZSBlbXB0eSBncm91cGVkIEFWUHMgKi8KKwkJCSNkZWZpbmUgQVZQX1RVTl9QUkVQQVJFKCkgewkJCQkJCQkJCQlcCisJCQkJCQlpZiAoYXZwX3R1biA9PSBOVUxMKSB7CQkJCQkJCQlcCisJCQkJCQkJQ0hFQ0tfTUFMTE9DKCBhdnBfdHVuID0gY2FsbG9jKHNpemVvZihzdHJ1Y3QgYXZwICopLCAzMiApICk7CQlcCisJCQkJCQl9CQkJCQkJCQkJCVwKKwkJCQkJCXRhZyA9ICoodWludDhfdCAqKShhdHRyICsgMSk7CQkJCQkJCVwKKwkJCQkJCWlmICh0YWcgPiAweDFGKSB0YWcgPSAwOwkJCQkJCQlcCisJCQkJCQlpZiAoYXZwX3R1blt0YWddID09IE5VTEwpIHsJCQkJCQkJXAorCQkJCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBjcy0+ZGljdC5UdW5uZWxpbmcsIDAsICZhdnBfdHVuW3RhZ10gKSApOwlcCisJCQkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCAoKmRpYW1fZncsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwX3R1blt0YWddKSk7XAorCQkJCQkJfQkJCQkJCQkJCQlcCisJCQkJCX0KKwkJCQorCQkJLyogQ29udmVydCBhbiBhdHRyaWJ1dGUgdG8gYW4gT2N0ZXRTdHJpbmcgQVZQIGFuZCBhZGQgaW5zaWRlIHRoZSBUdW5uZWxpbmcgQVZQIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHRhZyAqLworCQkJI2RlZmluZSBDT05WMkRJQU1fVFVOX1NUUiggX2RpY3RvYmpfICkgewkJCQkJCVwKKwkJCQl1aW50OF90IHRhZzsJCQkJCQkJCQlcCisJCQkJQ0hFQ0tfUEFSQU1TKCBhdHRyLT5sZW5ndGggPj0gMyk7CQkJCQkJXAorCQkJCUFWUF9UVU5fUFJFUEFSRSgpOwkJCQkJCQkJXAorCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBjcy0+ZGljdC5fZGljdG9ial8sIDAsICZhdnAgKSApOwkJCVwKKwkJCQl2YWx1ZS5vcy5sZW4gPSBhdHRyLT5sZW5ndGggLSAodGFnID8gMyA6IDIpOwkJCQkJXAorCQkJCXZhbHVlLm9zLmRhdGEgPSAoKHVuc2lnbmVkIGNoYXIgKikoYXR0ciArIDEpKSArICh0YWcgPyAxIDogMCk7CQkJXAorCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9zZXR2YWx1ZSAoIGF2cCwgJnZhbHVlICkgKTsJCQkJXAorCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQgKCBhdnBfdHVuW3RhZ10sIE1TR19CUldfTEFTVF9DSElMRCwgYXZwKSApOwkJXAorCQkJCX0KKwkJCQkKKwkJCS8qIENvbnZlcnQgYW4gYXR0cmlidXRlIHRvIGEgc2NhbGFyIEFWUCBhbmQgYWRkIGluc2lkZSB0aGUgVHVubmVsaW5nIEFWUCBjb3JyZXNwb25kaW5nIHRvIHRoZSB0YWcgKi8KKwkJCSNkZWZpbmUgQ09OVjJESUFNX1RVTl8yNEIoIF9kaWN0b2JqXyApIHsJCQkJCQlcCisJCQkJdWludDhfdCB0YWc7CQkJCQkJCQkJXAorCQkJCUNIRUNLX1BBUkFNUyggYXR0ci0+bGVuZ3RoID09IDYpOwkJCQkJCVwKKwkJCQlBVlBfVFVOX1BSRVBBUkUoKTsJCQkJCQkJCVwKKwkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3ICggY3MtPmRpY3QuX2RpY3RvYmpfLCAwLCAmYXZwICkgKTsJCQlcCisJCQkJewkJCQkJCQkJCQlcCisJCQkJCXVpbnQ4X3QgKiB2ID0gKHVpbnQ4X3QgKikoYXR0ciArIDEpOwkJCQkJXAorCQkJCQl2YWx1ZS51MzIgPSAodlsxXSA8PCAxNikgfCAodlsyXSA8PDgpIHwgdlszXSA7CQkJCVwKKwkJCQl9CQkJCQkJCQkJCVwKKwkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUgKCBhdnAsICZ2YWx1ZSApICk7CQkJCVwKKwkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkICggYXZwX3R1blt0YWddLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCkgKTsJCVwKKwkJCQl9CisKKwkJCS8qCisJCQkgICAgICAtICBJZiB0aGUgUkFESVVTIG1lc3NhZ2UgY29udGFpbnMgVHVubmVsIGluZm9ybWF0aW9uIFtSQURUdW5uZWxzXSwKKyAgICAgICAgCQkJIHRoZSBhdHRyaWJ1dGVzIG9yIHRhZ2dlZCBncm91cHMgc2hvdWxkIGVhY2ggYmUgY29udmVydGVkIHRvIGEKKyAgICAgICAgCQkJIERpYW1ldGVyIFR1bm5lbGluZyBHcm91cGVkIEFWUCBzZXQuICBJZiB0aGUgdHVubmVsIGluZm9ybWF0aW9uCisgICAgICAgIAkJCSBjb250YWlucyBhIFR1bm5lbC1QYXNzd29yZCBhdHRyaWJ1dGUsIHRoZSBSQURJVVMgZW5jcnlwdGlvbgorICAgICAgICAJCQkgbXVzdCBiZSByZXNvbHZlZCwgYW5kIHRoZSBwYXNzd29yZCBmb3J3YXJkZWQsIGJ5IHVzaW5nIERpYW1ldGVyCisgICAgICAgIAkJCSBzZWN1cml0eSBtZXRob2RzLgorCQkJCSAgICAtPiBJZiB0aGUgUkFESVVTIG1lc3NhZ2UgZG9lcyBub3QgdXNlIHByb3Blcmx5IHRoZSBUYWcgaW5mbywgcmVzdWx0IGlzIHVucHJlZGljdGFibGUgaGVyZS4uIAorCQkJKi8KKwkJCWNhc2UgUkFESVVTX0FUVFJfVFVOTkVMX1RZUEU6CisJCQkJQ09OVjJESUFNX1RVTl8yNEIoIFR1bm5lbF9UeXBlICk7CisJCQkJYnJlYWs7CisJCQkKKwkJCWNhc2UgUkFESVVTX0FUVFJfVFVOTkVMX01FRElVTV9UWVBFOgorCQkJCUNPTlYyRElBTV9UVU5fMjRCKCBUdW5uZWxfTWVkaXVtX1R5cGUgKTsKKwkJCQlicmVhazsKKwkJCQorCQkJY2FzZSBSQURJVVNfQVRUUl9UVU5ORUxfQ0xJRU5UX0VORFBPSU5UOgorCQkJCUNPTlYyRElBTV9UVU5fU1RSKCBUdW5uZWxfQ2xpZW50X0VuZHBvaW50ICk7CisJCQkJYnJlYWs7CisJCQkKKwkJCWNhc2UgUkFESVVTX0FUVFJfVFVOTkVMX1NFUlZFUl9FTkRQT0lOVDoKKwkJCQlDT05WMkRJQU1fVFVOX1NUUiggVHVubmVsX1NlcnZlcl9FbmRwb2ludCApOworCQkJCWJyZWFrOworCQkJCisJCQkvKiBUdW5uZWwtUGFzc3dvcmQgbmV2ZXIgcHJlc2VudCBpbiBhbiBBY2Nlc3MtUmVxdWVzdCAqLworCisJCQljYXNlIFJBRElVU19BVFRSX1RVTk5FTF9QUklWQVRFX0dST1VQX0lEOgorCQkJCUNPTlYyRElBTV9UVU5fU1RSKCBUdW5uZWxfUHJpdmF0ZV9Hcm91cF9JZCApOworCQkJCWJyZWFrOworCQkJCisJCQkvKiBUdW5uZWwtQXNzaWdubWVudC1JRCBuZXZlciBwcmVzZW50IGluIGFuIEFjY2Vzcy1SZXF1ZXN0ICovCisJCQkKKwkJCWNhc2UgUkFESVVTX0FUVFJfVFVOTkVMX1BSRUZFUkVOQ0U6CisJCQkJQ09OVjJESUFNX1RVTl8yNEIoIFR1bm5lbF9QcmVmZXJlbmNlICk7CisJCQkJYnJlYWs7CisJCQkKKwkJCWNhc2UgUkFESVVTX0FUVFJfVFVOTkVMX0NMSUVOVF9BVVRIX0lEOgorCQkJCUNPTlYyRElBTV9UVU5fU1RSKCBUdW5uZWxfQ2xpZW50X0F1dGhfSWQgKTsKKwkJCQlicmVhazsKKwkJCQorCQkJY2FzZSBSQURJVVNfQVRUUl9UVU5ORUxfU0VSVkVSX0FVVEhfSUQ6CisJCQkJQ09OVjJESUFNX1RVTl9TVFIoIFR1bm5lbF9TZXJ2ZXJfQXV0aF9JZCApOworCQkJCWJyZWFrOworCQkJCisJCQkKKwkJLyogUkZDIDI4NjkgKi8JCisJCQljYXNlIFJBRElVU19BVFRSX0FSQVBfUEFTU1dPUkQ6CisJCQkJQ09OVjJESUFNX1NUUiggQVJBUF9QYXNzd29yZCApOworCQkJCWJyZWFrOworCQkJCQorCQkJLyogQVJBUC1GZWF0dXJlcyBuZXZlciBwcmVzZW50IGluIGFuIEFjY2Vzcy1SZXF1ZXN0ICovCisJCQkvKiBBUkFQLVpvbmUtQWNjZXNzIG5ldmVyIHByZXNlbnQgaW4gYW4gQWNjZXNzLVJlcXVlc3QgKi8KKwkJCQorCQkJY2FzZSBSQURJVVNfQVRUUl9BUkFQX1NFQ1VSSVRZOgorCQkJCUNPTlYyRElBTV8zMkIoIEFSQVBfU2VjdXJpdHkgKTsKKwkJCQlicmVhazsKKwkJCQorCQkJY2FzZSBSQURJVVNfQVRUUl9BUkFQX1NFQ1VSSVRZX0RBVEE6CisJCQkJQ09OVjJESUFNX1NUUiggQVJBUF9TZWN1cml0eV9EYXRhICk7CisJCQkJYnJlYWs7CisJCQkKKwkJCS8qIFBhc3N3b3JkLVJldHJ5IG5ldmVyIHByZXNlbnQgaW4gYW4gQWNjZXNzLVJlcXVlc3QgKi8KKwkJCS8qIFByb21wdCBuZXZlciBwcmVzZW50IGluIGFuIEFjY2Vzcy1SZXF1ZXN0ICovCisJCQkKKwkJCWNhc2UgUkFESVVTX0FUVFJfQ09OTkVDVF9JTkZPOgorCQkJCUNPTlYyRElBTV9TVFIoIENvbm5lY3RfSW5mbyApOworCQkJCWJyZWFrOworCQkJCisJCQkvKiBDb25maWd1cmF0aW9uLVRva2VuIG5ldmVyIHByZXNlbnQgaW4gYW4gQWNjZXNzLVJlcXVlc3QgKi8KKwkJCS8qIEFSQVAtQ2hhbGxlbmdlLVJlc3BvbnNlIG5ldmVyIHByZXNlbnQgaW4gYW4gQWNjZXNzLVJlcXVlc3QgKi8KKwkJCS8qIEFjY3QtSW50ZXJpbS1JbnRlcnZhbCBuZXZlciBwcmVzZW50IGluIGFuIEFjY2Vzcy1SZXF1ZXN0ICovCisJCQkKKwkJCWNhc2UgUkFESVVTX0FUVFJfTkFTX1BPUlRfSUQ6CisJCQkJQ09OVjJESUFNX1NUUiggTkFTX1BvcnRfSWQgKTsKKwkJCQlicmVhazsKKwkJCQorCQkJLyogRnJhbWVkLVBvb2wgbmV2ZXIgcHJlc2VudCBpbiBhbiBBY2Nlc3MtUmVxdWVzdCAqLworCQkJCisJCQkJCisJCS8qIFJGQyAyODY5IC8gMzU3OSAqLwkKKwkJCWNhc2UgUkFESVVTX0FUVFJfT1JJR0lOQVRJTkdfTElORV9JTkZPOgorCQkJCUNPTlYyRElBTV9TVFIoIE9yaWdpbmF0aW5nX0xpbmVfSW5mbyApOworCQkJCWJyZWFrOworCQkJCQorCQkJY2FzZSBSQURJVVNfQVRUUl9NRVNTQUdFX0FVVEhFTlRJQ0FUT1I6CisJCQljYXNlIFJBRElVU19BVFRSX0VBUF9NRVNTQUdFOgorCQkJCS8qIEl0IHdhcyBhbHJlYWR5IGhhbmRsZWQsIGp1c3QgcmVtb3ZlIHRoZSBhdHRyaWJ1dGUgKi8KKwkJCQlicmVhazsKKwkJCQkKKwkJLyogRGVmYXVsdCAqLwkJCisJCQlkZWZhdWx0OiAvKiB1bmtub3duIGF0dHJpYnV0ZSAqLworCQkJCS8qIFdlIGp1c3Qga2VlcCB0aGUgYXR0cmlidXRlIGluIHRoZSBSQURJVVMgbWVzc2FnZSAqLworCQkJCXJhZF9yZXEtPmF0dHJfcG9zW25hdHRyX3VzZWQrK10gPSByYWRfcmVxLT5hdHRyX3Bvc1tpZHhdOworCQl9CisJfQorCQorCS8qIERlc3Ryb3kgdHVubmVsIHBvaW50ZXJzIChpZiB3ZSB1c2VkIGl0KSAqLworCWZyZWUoYXZwX3R1bik7CisJCisJLyogVXBkYXRlIHRoZSByYWRpdXMgbWVzc2FnZSB0byByZW1vdmUgYWxsIGhhbmRsZWQgYXR0cmlidXRlcyAqLworCXJhZF9yZXEtPmF0dHJfdXNlZCA9IG5hdHRyX3VzZWQ7CisKKwkvKiBTdG9yZSB0aGUgcmVxdWVzdCBpZGVudGlmaWVyIGluIHRoZSBzZXNzaW9uIChpZiBwcm92aWRlZCkgKi8KKwl7CisJCXN0cnVjdCBzZXNzX3N0YXRlICAqc3Q7CisJCUNIRUNLX01BTExPQyhzdCA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHNlc3Nfc3RhdGUpKSk7CisJCW1lbWNweShzdC0+cmVxX2F1dGgsICZyYWRfcmVxLT5oZHItPmF1dGhlbnRpY2F0b3JbMF0sIDE2KTsKKwkJCisJCUNIRUNLX0ZDVCggZmRfc2Vzc19zdGF0ZV9zdG9yZSggY3MtPnNlc3NfaGRsLCBzZXNzLCAmc3QgKSApOworCX0KKwkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdXRoX2RpYW1fYW5zKCBzdHJ1Y3Qgcmd3cF9jb25maWcgKiBjcywgc3RydWN0IG1zZyAqKiBkaWFtX2Fucywgc3RydWN0IHJhZGl1c19tc2cgKiogcmFkX2Z3LCBzdHJ1Y3Qgcmd3X2NsaWVudCAqIGNsaSApCit7CisJc3RydWN0IG1zZ19oZHIgKiBoZHI7CisJc3RydWN0IGF2cCAqYXZwLCAqbmV4dCwgKmF2cF94LCAqYXZwX3ksICphb2g7CisJc3RydWN0IGF2cF9oZHIgKmFoZHIsICpvaDsKKwl1aW50OF90IGJ1ZlsyNTRdOyAvKiB0byBzdG9yZSBzb21lIGF0dHJpYnV0ZXMgdmFsdWVzICh3aXRoIGZpbmFsICdcMCcpICovCisJc2l6ZV90IHN6OworCWludCB0YV9zZXQgPSAwOworCWludCBub19zdHIgPSAwOyAvKiBpbmRpY2F0ZSBpZiBhbiBTVFIgaXMgcmVxdWlyZWQgZm9yIHRoaXMgc2VydmVyICovCisJdWludDhfdAl0dW50YWcgPSAwOworCXN0cnVjdCBzZXNzX3N0YXRlICAqc3Q7CisJaW50IGVycm9yX2NhdXNlID0gMDsKKwlzdHJ1Y3Qgc2Vzc2lvbiAqIHNlc3M7CisJb3MwX3Qgc2lkID0gTlVMTDsKKwlzaXplX3Qgc2lkbGVuOworCQorCVRSQUNFX0VOVFJZKCIlcCAlcCAlcCAlcCIsIGNzLCBkaWFtX2FucywgcmFkX2Z3LCBjbGkpOworCUNIRUNLX1BBUkFNUyhjcyAmJiBkaWFtX2FucyAmJiAqZGlhbV9hbnMgJiYgcmFkX2Z3ICYmICpyYWRfZncpOworCQorCS8qIFJldHJpZXZlIHRoZSByZXF1ZXN0IGlkZW50aWZpZWQgd2hpY2ggd2FzIHN0b3JlZCBpbiB0aGUgc2Vzc2lvbiAqLworCUNIRUNLX0ZDVCggZmRfbXNnX3Nlc3NfZ2V0KGZkX2dfY29uZmlnLT5jbmZfZGljdCwgKmRpYW1fYW5zLCAmc2VzcywgTlVMTCkgKTsKKwlpZiAoc2VzcykgeworCQlDSEVDS19GQ1QoIGZkX3Nlc3Nfc3RhdGVfcmV0cmlldmUoIGNzLT5zZXNzX2hkbCwgc2VzcywgJnN0ICkgKTsKKwkJQ0hFQ0tfRkNUKCBmZF9zZXNzX2dldHNpZChzZXNzLCAmc2lkLCAmc2lkbGVuKSApOworCX0gLyogZWxzZSA/ICovCisJCisJLyoJCisJICAgICAgLSAgSWYgdGhlIERpYW1ldGVyIENvbW1hbmQtQ29kZSBpcyBzZXQgdG8gQUEtQW5zd2VyIGFuZCB0aGUKKyAgICAgICAgCSBSZXN1bHQtQ29kZSBBVlAgaXMgc2V0IHRvIERJQU1FVEVSX01VTFRJX1JPVU5EX0FVVEgsIHRoZQorICAgICAgICAJIGdhdGV3YXkgbXVzdCBzZW5kIGEgUkFESVVTIEFjY2Vzcy1DaGFsbGVuZ2UuICBUaGlzIG11c3QgaGF2ZQorICAgICAgICAJIHRoZSBPcmlnaW4tSG9zdCwgT3JpZ2luLVJlYWxtLCBhbmQgRGlhbWV0ZXIgU2Vzc2lvbi1JZCBBVlBzCisgICAgICAgIAkgZW5jYXBzdWxhdGVkIGluIHRoZSBSQURJVVMgU3RhdGUgYXR0cmlidXRlLCB3aXRoIHRoZSBwcmVmaXgKKyAgICAgICAgCSAiRGlhbWV0ZXIvIiwgY29uY2F0ZW5hdGVkIGluIHRoZSBhYm92ZSBvcmRlciBzZXBhcmF0ZWQgd2l0aCAiLyIKKyAgICAgICAgCSBjaGFyYWN0ZXJzLCBpbiBVVEYtOCBbVVRGLThdLiAgVGhpcyBpcyBuZWNlc3NhcnkgdG8gZW5zdXJlIHRoYXQKKyAgICAgICAgCSB0aGUgVHJhbnNsYXRpb24gQWdlbnQgcmVjZWl2aW5nIHRoZSBzdWJzZXF1ZW50IFJBRElVUyBBY2Nlc3MtCisgICAgICAgIAkgUmVxdWVzdCB3aWxsIGhhdmUgYWNjZXNzIHRvIHRoZSBTZXNzaW9uIElkZW50aWZpZXIgYW5kIGJlIGFibGUKKyAgICAgICAgCSB0byBzZXQgdGhlIERlc3RpbmF0aW9uLUhvc3QgdG8gdGhlIGNvcnJlY3QgdmFsdWUuCisJCSAJLT4gZG9uZSBoZXJlIGJlbG93CisJCSAKKwkgICAgICAtICBJZiB0aGUgQ29tbWFuZC1Db2RlIGlzIHNldCB0byBBQS1BbnN3ZXIsIHRoZSBEaWFtZXRlciBTZXNzaW9uLQorICAgICAgICAJIElkIEFWUCBpcyBzYXZlZCBpbiBhIG5ldyBSQURJVVMgQ2xhc3MgYXR0cmlidXRlIHdob3NlIGZvcm1hdAorICAgICAgICAJIGNvbnNpc3RzIG9mIHRoZSBzdHJpbmcgIkRpYW1ldGVyLyIgZm9sbG93ZWQgYnkgdGhlIERpYW1ldGVyCisgICAgICAgIAkgU2Vzc2lvbiBJZGVudGlmaWVyLiAgVGhpcyB3aWxsIGVuc3VyZSB0aGF0IHRoZSBzdWJzZXF1ZW50CisgICAgICAgIAkgQWNjb3VudGluZyBtZXNzYWdlcywgd2hpY2ggY291bGQgYmUgcmVjZWl2ZWQgYnkgYW55IFRyYW5zbGF0aW9uCisgICAgICAgIAkgQWdlbnQsIHdvdWxkIGhhdmUgYWNjZXNzIHRvIHRoZSBvcmlnaW5hbCBEaWFtZXRlciBTZXNzaW9uCisgICAgICAgIAkgSWRlbnRpZmllci4KKwkJIAktPiBkb25lIGhlcmUgYnV0IG9ubHkgZm9yIEFjY2Vzcy1BY2NlcHQgbWVzc2FnZXMgKFJlc3VsdC1Db2RlID0gc3VjY2VzcykKKwkgKi8KKwkKKwkvKiBNQUNST1MgdG8gaGVscCBpbiB0aGUgcHJvY2VzczogY29udmVydCBBVlAgZGF0YSB0byBSQURJVVMgYXR0cmlidXRlcy4gKi8KKwkvKiBDb250cm9sIGxhcmdlIGF0dHJpYnV0ZXM6ICBfdHJ1bmNfID0gMCA9PiBlcnJvcjsgX3RydW5jXyA9IDEgPT4gdHJ1bmNhdGU7IF90cnVuYyA9IDIgPT4gY3JlYXRlIHNldmVyYWwgYXR0cmlidXRlcyAqLworCSNkZWZpbmUgQ09OVjJSQURfU1RSKCBfYXR0cl8sIF9kYXRhXywgX2xlbl8sIF90cnVuY18pCXsJCQkJCVwKKwkJc2l6ZV90IF9fbCA9IChzaXplX3QpKF9sZW5fKTsJCQkJCQkJCVwKKwkJc2l6ZV90IF9fb2ZmID0gMDsJCQkJCQkJCQlcCisJCVRSQUNFX0RFQlVHKEZVTEwsICJDb252ZXJ0aW5nIEFWUCB0byAiI19hdHRyXyk7CQkJCQkJXAorCQlpZiAoKF90cnVuY18pID09IDApIHsJCQkJCQkJCQlcCisJCQlDSEVDS19QQVJBTVMoIF9fbCA8PSAyNTMgKTsJCQkJCQkJXAorCQl9CQkJCQkJCQkJCQlcCisJCWlmICgoX19sID4gMjUzKSAmJiAoX3RydW5jXyA9PSAxKSkgewkJCQkJCQlcCisJCQlUUkFDRV9ERUJVRyhJTkZPLCAiW2F1dGgucmd3eF0gQVZQIHRydW5jYXRlZCBpbiAiI19hdHRyXyk7CQkJXAorCQkJX19sID0gMjUzOwkJCQkJCQkJCVwKKwkJfQkJCQkJCQkJCQkJXAorCQlkbyB7CQkJCQkJCQkJCQlcCisJCQlzaXplX3QgX193ID0gKF9fbCA+IDI1MykgPyAyNTMgOiBfX2w7CQkJCQkJXAorCQkJQ0hFQ0tfTUFMTE9DKHJhZGl1c19tc2dfYWRkX2F0dHIoKnJhZF9mdywgKF9hdHRyXyksIChfZGF0YV8pICsgX19vZmYsIF9fdykpOwlcCisJCQlfX29mZiArPSBfX3c7CQkJCQkJCQkJXAorCQkJX19sICAgLT0gX193OwkJCQkJCQkJCVwKKwkJfSB3aGlsZSAoX19sKTsJCQkJCQkJCQkJXAorCX0KKworCSNkZWZpbmUgQ09OVjJSQURfMzJCKCBfYXR0cl8sIF9kYXRhXykJewkJCQkJCQlcCisJCXVpbnQzMl90IF9fdiA9IGh0b25sKCh1aW50MzJfdCkoX2RhdGFfKSk7CQkJCQkJXAorCQlUUkFDRV9ERUJVRyhGVUxMLCAiQ29udmVydGluZyBBVlAgdG8gIiNfYXR0cl8pOwkJCQkJCVwKKwkJQ0hFQ0tfTUFMTE9DKHJhZGl1c19tc2dfYWRkX2F0dHIoKnJhZF9mdywgKF9hdHRyXyksICh1aW50OF90ICopJl9fdiwgc2l6ZW9mKF9fdikpKTsJXAorCX0KKworCSNkZWZpbmUgQ09OVjJSQURfNjRCKCBfYXR0cl8sIF9kYXRhXykJewkJCQkJCQlcCisJCXVpbnQ2NF90IF9fdiA9IGh0b25sbCgodWludDY0X3QpKF9kYXRhXykpOwkJCQkJCVwKKwkJVFJBQ0VfREVCVUcoRlVMTCwgIkNvbnZlcnRpbmcgQVZQIHRvICIjX2F0dHJfKTsJCQkJCQlcCisJCUNIRUNLX01BTExPQyhyYWRpdXNfbXNnX2FkZF9hdHRyKCpyYWRfZncsIChfYXR0cl8pLCAodWludDhfdCAqKSZfX3YsIHNpemVvZihfX3YpKSk7CVwKKwl9CisKKwkvKiBTZWFyY2ggdGhlIGRpZmZlcmVudCBBVlBzIHdlIGhhbmRsZSBoZXJlICovCisJQ0hFQ0tfRkNUKCBmZF9tc2dfc2VhcmNoX2F2cCAoKmRpYW1fYW5zLCBjcy0+ZGljdC5PcmlnaW5fSG9zdCwgJmFvaCkgKTsKKwlDSEVDS19GQ1QoIGZkX21zZ19hdnBfaGRyICggYW9oLCAmb2ggKSApOworCisJLyogQ2hlY2sgdGhlIERpYW1ldGVyIGVycm9yIGNvZGUgKi8KKwlDSEVDS19GQ1QoIGZkX21zZ19zZWFyY2hfYXZwICgqZGlhbV9hbnMsIGNzLT5kaWN0LlJlc3VsdF9Db2RlLCAmYXZwKSApOworCUFTU0VSVCggYXZwICk7IC8qIG90aGVyd2lzZSB0aGUgbWVzc2FnZSBzaG91bGQgaGF2ZSBiZWVuIGRpc2NhcmRlZCBhIGxvdCBlYXJsaWVyIGJlY2F1c2Ugb2YgQUJORiAqLworCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9oZHIgKCBhdnAsICZhaGRyICkgKTsKKwlzd2l0Y2ggKGFoZHItPmF2cF92YWx1ZS0+dTMyKSB7CisJCWNhc2UgRVJfRElBTUVURVJfTVVMVElfUk9VTkRfQVVUSDoKKwkJCSgqcmFkX2Z3KS0+aGRyLT5jb2RlID0gUkFESVVTX0NPREVfQUNDRVNTX0NIQUxMRU5HRTsKKwkJCWJyZWFrOworCQljYXNlIEVSX0RJQU1FVEVSX1NVQ0NFU1M6CisJCWNhc2UgRVJfRElBTUVURVJfTElNSVRFRF9TVUNDRVNTOgorCQkJKCpyYWRfZncpLT5oZHItPmNvZGUgPSBSQURJVVNfQ09ERV9BQ0NFU1NfQUNDRVBUOworCQkJYnJlYWs7CisJCQorCQlkZWZhdWx0OgorCQkJLyogQ2FuIHdlIGNvbnZlcnQgdGhlIHZhbHVlIHRvIGEgbmF0dXJhbCBFcnJvci1DYXVzZSA/ICovCisJCQlzd2l0Y2ggKGFoZHItPmF2cF92YWx1ZS0+dTMyKSB7CisJCQkJY2FzZSBFUl9ESUFNRVRFUl9BVlBfVU5TVVBQT1JURUQ6CisJCQkJCWVycm9yX2NhdXNlID0gNDAxOyAvKiBVbnN1cHBvcnRlZCBBdHRyaWJ1dGUgKi8KKwkJCQkJYnJlYWs7CisJCQkJCQorCQkJCWNhc2UgRVJfRElBTUVURVJfTUlTU0lOR19BVlA6CisJCQkJCWVycm9yX2NhdXNlID0gNDAyOyAvKiBNaXNzaW5nIEF0dHJpYnV0ZSAqLworCQkJCQlicmVhazsKKwkJCQkJCisJCQkJY2FzZSBFUl9ESUFNRVRFUl9VTkFCTEVfVE9fQ09NUExZOgorCQkJCQllcnJvcl9jYXVzZSA9IDQwNDsgLyogSW52YWxpZCBSZXF1ZXN0ICovCisJCQkJCWJyZWFrOworCQkJCQkKKwkJCQljYXNlIEVSX0RJQU1FVEVSX0FQUExJQ0FUSU9OX1VOU1VQUE9SVEVEOgorCQkJCQllcnJvcl9jYXVzZSA9IDQwNTsgLyogVW5zdXBwb3J0ZWQgU2VydmljZSAqLworCQkJCQlicmVhazsKKwkJCQkJCisJCQkJY2FzZSBFUl9ESUFNRVRFUl9DT01NQU5EX1VOU1VQUE9SVEVEOgorCQkJCQllcnJvcl9jYXVzZSA9IDQwNjsgLyogVW5zdXBwb3J0ZWQgRXh0ZW5zaW9uICovCisJCQkJCWJyZWFrOworCQkJCQkKKwkJCQljYXNlIEVSX0RJQU1FVEVSX0lOVkFMSURfQVZQX1ZBTFVFOgorCQkJCQllcnJvcl9jYXVzZSA9IDQwNzsgLyogSW52YWxpZCBBdHRyaWJ1dGUgVmFsdWUgKi8KKwkJCQkJYnJlYWs7CisJCQkJCQorCQkJCWNhc2UgRVJfRElBTUVURVJfQVZQX05PVF9BTExPV0VEOgorCQkJCQllcnJvcl9jYXVzZSA9IDUwMTsgLyogQWRtaW5pc3RyYXRpdmVseSBQcm9oaWJpdGVkICovCisJCQkJCWJyZWFrOworCQkJCQkKKwkJCQljYXNlIEVSX0RJQU1FVEVSX1JFQUxNX05PVF9TRVJWRUQ6CisJCQkJY2FzZSBFUl9ESUFNRVRFUl9MT09QX0RFVEVDVEVEOgorCQkJCWNhc2UgRVJfRElBTUVURVJfVU5LTk9XTl9QRUVSOgorCQkJCWNhc2UgRVJfRElBTUVURVJfVU5BQkxFX1RPX0RFTElWRVI6CisJCQkJCWVycm9yX2NhdXNlID0gNTAyOyAvKiBSZXF1ZXN0IE5vdCBSb3V0YWJsZSAoUHJveHkpICovCisJCQkJCWJyZWFrOworCQkJCQkKKwkJCQljYXNlIEVSX0RJQU1FVEVSX1VOS05PV05fU0VTU0lPTl9JRDoKKwkJCQkJZXJyb3JfY2F1c2UgPSA1MDM7IC8qIFNlc3Npb24gQ29udGV4dCBOb3QgRm91bmQgKi8KKwkJCQkJYnJlYWs7CisJCQkJCQorCQkJCWNhc2UgRVJfRElBTUVURVJfVE9PX0JVU1k6CisJCQkJY2FzZSBFUl9ESUFNRVRFUl9PVVRfT0ZfU1BBQ0U6CisJCQkJCWVycm9yX2NhdXNlID0gNTA2OyAvKiBSZXNvdXJjZXMgVW5hdmFpbGFibGUgKi8KKwkJCQkJYnJlYWs7CisJCQkJCQorI2lmIDAKKwkJCS8qIHJlbWFpbmluZyBEaWFtZXRlciBSZXN1bHQtQ29kZSAmIFJBRElVUyBFcnJvci1DYXVzZSAqLworCQkJCWNhc2UgRVJfRElBTUVURVJfUkVESVJFQ1RfSU5ESUNBVElPTjoKKwkJCQljYXNlIEVSX0RJQU1FVEVSX0lOVkFMSURfSERSX0JJVFM6CisJCQkJY2FzZSBFUl9ESUFNRVRFUl9JTlZBTElEX0FWUF9CSVRTOgorCQkJCWNhc2UgRVJfRElBTUVURVJfQVVUSEVOVElDQVRJT05fUkVKRUNURUQ6CisJCQkJY2FzZSBFUl9FTEVDVElPTl9MT1NUOgorCQkJCWNhc2UgRVJfRElBTUVURVJfQVVUSE9SSVpBVElPTl9SRUpFQ1RFRDoKKwkJCQljYXNlIEVSX0RJQU1FVEVSX1JFU09VUkNFU19FWENFRURFRDoKKwkJCQljYXNlIEVSX0RJQU1FVEVSX0NPTlRSQURJQ1RJTkdfQVZQUzoKKwkJCQljYXNlIEVSX0RJQU1FVEVSX0FWUF9PQ0NVUlNfVE9PX01BTllfVElNRVMKKwkJCQljYXNlIEVSX0RJQU1FVEVSX05PX0NPTU1PTl9BUFBMSUNBVElPTjoKKwkJCQljYXNlIEVSX0RJQU1FVEVSX1VOU1VQUE9SVEVEX1ZFUlNJT046CisJCQkJY2FzZSBFUl9ESUFNRVRFUl9JTlZBTElEX0JJVF9JTl9IRUFERVI6CisJCQkJY2FzZSBFUl9ESUFNRVRFUl9JTlZBTElEX0FWUF9MRU5HVEg6CisJCQkJY2FzZSBFUl9ESUFNRVRFUl9JTlZBTElEX01FU1NBR0VfTEVOR1RIOgorCQkJCWNhc2UgRVJfRElBTUVURVJfSU5WQUxJRF9BVlBfQklUX0NPTUJPOgorCQkJCWNhc2UgRVJfRElBTUVURVJfTk9fQ09NTU9OX1NFQ1VSSVRZOgorCQkJCQllcnJvcl9jYXVzZSA9IDQwMzsgLyogTkFTIElkZW50aWZpY2F0aW9uIE1pc21hdGNoICovCisJCQkJCWVycm9yX2NhdXNlID0gNTA0OyAvKiBTZXNzaW9uIENvbnRleHQgTm90IFJlbW92YWJsZSAqLworCQkJCQllcnJvcl9jYXVzZSA9IDUwNTsgLyogT3RoZXIgUHJveHkgUHJvY2Vzc2luZyBFcnJvciAqLworCQkJCQllcnJvcl9jYXVzZSA9IDUwNzsgLyogUmVxdWVzdCBJbml0aWF0ZWQgKi8KKwkJCQkJZXJyb3JfY2F1c2UgPSA1MDg7IC8qIE11bHRpcGxlIFNlc3Npb24gU2VsZWN0aW9uIFVuc3VwcG9ydGVkICovCisjZW5kaWYgLyogMCAqLworCQkJfQorCQkJLyogSW4gYW55IGNhc2UsIHRoZSBmb2xsb3dpbmcgaXMgcHJvY2Vzc2VkOiAqLworCQkJKCpyYWRfZncpLT5oZHItPmNvZGUgPSBSQURJVVNfQ09ERV9BQ0NFU1NfUkVKRUNUOworCQkJZmRfbG9nX2RlYnVnKCJbYXV0aC5yZ3d4XSBSZWNlaXZlZCBEaWFtZXRlciBhbnN3ZXIgd2l0aCBlcnJvciBjb2RlICclZCcgZnJvbSBzZXJ2ZXIgJyUuKnMnLCBzZXNzaW9uICUuKnMsIHRyYW5zbGF0aW5nIGludG8gQWNjZXNzLVJlamVjdCIsCisJCQkJCWFoZHItPmF2cF92YWx1ZS0+dTMyLCAKKwkJCQkJKGludClvaC0+YXZwX3ZhbHVlLT5vcy5sZW4sIG9oLT5hdnBfdmFsdWUtPm9zLmRhdGEsCisJCQkJCShpbnQpc2lkbGVuLCBzaWQpOworCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfc2VhcmNoX2F2cCAoKmRpYW1fYW5zLCBjcy0+ZGljdC5FcnJvcl9NZXNzYWdlLCAmYXZwX3gpICk7CisJCQlpZiAoYXZwX3gpIHsKKwkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfaGRyICggYXZwX3gsICZhaGRyICkgKTsKKwkJCQlmZF9sb2dfZGVidWcoIlthdXRoLnJnd3hdICAgRXJyb3ItTWVzc2FnZSBjb250ZW50OiAnJS4qcyciLAorCQkJCQkJKGludClhaGRyLT5hdnBfdmFsdWUtPm9zLmxlbiwgYWhkci0+YXZwX3ZhbHVlLT5vcy5kYXRhKTsKKwkJCX0KKwkJCUNIRUNLX0ZDVCggZmRfbXNnX3NlYXJjaF9hdnAgKCpkaWFtX2FucywgY3MtPmRpY3QuRXJyb3JfUmVwb3J0aW5nX0hvc3QsICZhdnBfeCkgKTsKKwkJCWlmIChhdnBfeCkgeworCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9oZHIgKCBhdnBfeCwgJmFoZHIgKSApOworCQkJCWZkX2xvZ19kZWJ1ZygiW2F1dGgucmd3eF0gICBFcnJvci1SZXBvcnRpbmctSG9zdDogJyUuKnMnIiwKKwkJCQkJCShpbnQpYWhkci0+YXZwX3ZhbHVlLT5vcy5sZW4sIGFoZHItPmF2cF92YWx1ZS0+b3MuZGF0YSk7CisJCQl9CisJCQlDSEVDS19GQ1QoIGZkX21zZ19zZWFyY2hfYXZwICgqZGlhbV9hbnMsIGNzLT5kaWN0LkZhaWxlZF9BVlAsICZhdnBfeCkgKTsKKwkJCWlmIChhdnBfeCkgeworCQkJCWZkX2xvZ19kZWJ1ZygiW2F1dGgucmd3eF0gICBGYWlsZWQtQVZQIHdhcyBpbmNsdWRlZCBpbiB0aGUgbWVzc2FnZS4iKTsKKwkJCQkvKiBEdW1wIGl0cyBjb250ZW50ID8gKi8KKwkJCX0KKwl9CisJLyogUmVtb3ZlIHRoaXMgUmVzdWx0LUNvZGUgYXZwICovCisJQ0hFQ0tfRkNUKCBmZF9tc2dfZnJlZSggYXZwICkgKTsKKwkKKwkvKiBDcmVhdGlvbiBvZiB0aGUgU3RhdGUgb3IgQ2xhc3MgYXR0cmlidXRlIHdpdGggc2Vzc2lvbiBpbmZvcm1hdGlvbiAqLworCUNIRUNLX0ZDVCggZmRfbXNnX3NlYXJjaF9hdnAgKCpkaWFtX2FucywgY3MtPmRpY3QuT3JpZ2luX1JlYWxtLCAmYXZwKSApOworCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9oZHIgKCBhdnAsICZhaGRyICkgKTsKKwkKKwkvKiBOb3csIHNhdmUgdGhlIHNlc3Npb24taWQgYW5kIGV2ZW50dWFsbHkgc2VydmVyIGluZm8gaW4gYSBTVEFURSBvciBDTEFTUyBhdHRyaWJ1dGUgKi8KKwlpZiAoKCpyYWRfZncpLT5oZHItPmNvZGUgPT0gUkFESVVTX0NPREVfQUNDRVNTX0NIQUxMRU5HRSkgeworCQlpZiAoc2l6ZW9mKGJ1ZikgPCAoc3ogPSBzbnByaW50ZigoY2hhciAqKWJ1Ziwgc2l6ZW9mKGJ1ZiksICJEaWFtZXRlci8lLipzLyUuKnMvJS4qcyIsIAorCQkJCShpbnQpb2gtPmF2cF92YWx1ZS0+b3MubGVuLCAgKGNoYXIgKilvaC0+YXZwX3ZhbHVlLT5vcy5kYXRhLAorCQkJCShpbnQpYWhkci0+YXZwX3ZhbHVlLT5vcy5sZW4sICAoY2hhciAqKWFoZHItPmF2cF92YWx1ZS0+b3MuZGF0YSwKKwkJCQkoaW50KXNpZGxlbiwgKGNoYXIgKilzaWQpKSkgeworCQkJVFJBQ0VfREVCVUcoSU5GTywgIkRhdGEgdHJ1bmNhdGVkIGluIFN0YXRlIGF0dHJpYnV0ZTogJXMiLCBidWYpOworCQl9CisJCUNPTlYyUkFEX1NUUihSQURJVVNfQVRUUl9TVEFURSwgYnVmLCBzeiwgMCk7CisJfQorCisJaWYgKCgqcmFkX2Z3KS0+aGRyLT5jb2RlID09IFJBRElVU19DT0RFX0FDQ0VTU19BQ0NFUFQpIHsKKwkJLyogQWRkIHRoZSBTZXNzaW9uLUlkICovCisJCWlmIChzaXplb2YoYnVmKSA8IChzeiA9IHNucHJpbnRmKChjaGFyICopYnVmLCBzaXplb2YoYnVmKSwgIkRpYW1ldGVyLyUuKnMiLCAKKwkJCQkoaW50KXNpZGxlbiwgc2lkKSkpIHsKKwkJCVRSQUNFX0RFQlVHKElORk8sICJEYXRhIHRydW5jYXRlZCBpbiBDbGFzcyBhdHRyaWJ1dGU6ICVzIiwgYnVmKTsKKwkJfQorCQlDT05WMlJBRF9TVFIoUkFESVVTX0FUVFJfQ0xBU1MsIGJ1Ziwgc3osIDApOworCX0KKwkKKwkvKiBVbmxpbmsgdGhlIE9yaWdpbi1SZWFsbSBub3c7IHRoZSBvdGhlcnMgYXJlIHVubGlua2VkIGF0IHRoZSBlbmQgb2YgdGhpcyBmdW5jdGlvbiAqLworCUNIRUNLX0ZDVCggZmRfbXNnX2ZyZWUoIGF2cCApICk7CisJCisJQ0hFQ0tfRkNUKCBmZF9tc2dfc2VhcmNoX2F2cCAoKmRpYW1fYW5zLCBjcy0+ZGljdC5TZXNzaW9uX1RpbWVvdXQsICZhdnApICk7CisJQ0hFQ0tfRkNUKCBmZF9tc2dfc2VhcmNoX2F2cCAoKmRpYW1fYW5zLCBjcy0+ZGljdC5BdXRob3JpemF0aW9uX0xpZmV0aW1lLCAmYXZwX3gpICk7CisJQ0hFQ0tfRkNUKCBmZF9tc2dfc2VhcmNoX2F2cCAoKmRpYW1fYW5zLCBjcy0+ZGljdC5SZV9BdXRoX1JlcXVlc3RfVHlwZSwgJmF2cF95KSApOworCS8qCQorCSAgIFdoZW4gdHJhbnNsYXRpbmcgYSBEaWFtZXRlciBBQS1BbnN3ZXIgKHdpdGggc3VjY2Vzc2Z1bCByZXN1bHQgY29kZSkKKwkgICB0byBSQURJVVMgQWNjZXNzLUFjY2VwdCB0aGF0IGNvbnRhaW5zIGEgU2Vzc2lvbi1UaW1lb3V0IG9yCisJICAgQXV0aG9yaXphdGlvbi1MaWZldGltZSBBVlAsIHRha2UgdGhlIGZvbGxvd2luZyBzdGVwczoKKwkgICAKKwkgICAgICAtICBJZiB0aGUgRGlhbWV0ZXIgbWVzc2FnZSBjb250YWlucyBhIFNlc3Npb24tVGltZW91dCBBVlAgYnV0IG5vCisgICAgICAgIAkgQXV0aG9yaXphdGlvbi1MaWZldGltZSBBVlAsIHRyYW5zbGF0ZSBpdCB0byBhIFNlc3Npb24tVGltZW91dAorICAgICAgICAJIGF0dHJpYnV0ZSAobm90IGEgVGVybWluYXRpb24tQWN0aW9uKS4KKwkqLworCWlmICgoYXZwICE9IE5VTEwpICYmIChhdnBfeCA9PSBOVUxMKSkgeworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfaGRyICggYXZwLCAmYWhkciApICk7CisJCUNPTlYyUkFEXzMyQiggUkFESVVTX0FUVFJfU0VTU0lPTl9USU1FT1VULCBhaGRyLT5hdnBfdmFsdWUtPnUzMiApOworCX0KKwkKKwkvKgkKKwkgICAgICAtICBJZiB0aGUgRGlhbWV0ZXIgbWVzc2FnZSBjb250YWlucyBhbiBBdXRob3JpemF0aW9uLUxpZmV0aW1lIEFWUAorICAgICAgICAJIGJ1dCBubyBTZXNzaW9uLVRpbWVvdXQgQVZQLCB0cmFuc2xhdGUgaXQgdG8gYSBTZXNzaW9uLVRpbWVvdXQKKyAgICAgICAgCSBhdHRyaWJ1dGUgYW5kIGEgVGVybWluYXRpb24tQWN0aW9uIHNldCB0byBBQS1SRVFVRVNULiAgKFJlbW92ZQorICAgICAgICAJIEF1dGhvcml6YXRpb24tTGlmZXRpbWUgYW5kIFJlLUF1dGgtUmVxdWVzdC1UeXBlLikKKwkqLworCWlmICgoYXZwID09IE5VTEwpICYmIChhdnBfeCAhPSBOVUxMKSkgeworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfaGRyICggYXZwX3gsICZhaGRyICkgKTsKKwkJQ09OVjJSQURfMzJCKCBSQURJVVNfQVRUUl9TRVNTSU9OX1RJTUVPVVQsIGFoZHItPmF2cF92YWx1ZS0+dTMyICk7CisJCUNPTlYyUkFEXzMyQiggUkFESVVTX0FUVFJfVEVSTUlOQVRJT05fQUNUSU9OLCBSQURJVVNfVEVSTUlOQVRJT05fQUNUSU9OX1JBRElVU19SRVFVRVNUICk7CisJCXRhX3NldCA9IDE7CisJfQorCQorCS8qCQorCSAgICAgIC0gIElmIHRoZSBEaWFtZXRlciBtZXNzYWdlIGhhcyBib3RoLCB0aGUgU2Vzc2lvbi1UaW1lb3V0IG11c3QgYmUKKyAgICAgICAgCSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIEF1dGhvcml6YXRpb24tTGlmZXRpbWUgKHJlcXVpcmVkCisgICAgICAgIAkgYnkgW0JBU0VdKS4gIFRyYW5zbGF0ZSBpdCB0byBhIFNlc3Npb24tVGltZW91dCB2YWx1ZSAod2l0aAorICAgICAgICAJIHZhbHVlIGZyb20gQXV0aG9yaXphdGlvbi1MaWZldGltZSBBVlAsIHRoZSBzbWFsbGVyIG9uZSkgYW5kCisgICAgICAgIAkgd2l0aCB0aGUgVGVybWluYXRpb24tQWN0aW9uIHNldCB0byBBQS1SRVFVRVNULiAgKFJlbW92ZSB0aGUKKyAgICAgICAgCSBBdXRob3JpemF0aW9uLUxpZmV0aW1lIGFuZCBSZS1BdXRoLVJlcXVlc3QtVHlwZS4pCisJKi8KKwlpZiAoKGF2cCAhPSBOVUxMKSAmJiAoYXZwX3ggIT0gTlVMTCkpIHsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2hkciAoIGF2cF94LCAmYWhkciApICk7CisJCUNPTlYyUkFEXzMyQiggUkFESVVTX0FUVFJfU0VTU0lPTl9USU1FT1VULCBhaGRyLT5hdnBfdmFsdWUtPnUzMiApOworCQlDT05WMlJBRF8zMkIoIFJBRElVU19BVFRSX1RFUk1JTkFUSU9OX0FDVElPTiwgUkFESVVTX1RFUk1JTkFUSU9OX0FDVElPTl9SQURJVVNfUkVRVUVTVCApOworCQl0YV9zZXQgPSAxOworCX0KKwkKKwkvKiAgLT4gTm90IHRvbyBzdXJlIGFib3V0IEF1dGgtR3JhY2UtUGVyaW9kLi4uIHdlJ2xsIGp1c3QgZGlzY2FyZCBpdCBmb3Igbm93ICovCisJCisJaWYgKGF2cCkgeworCQlDSEVDS19GQ1QoIGZkX21zZ19mcmVlKCBhdnAgKSApOworCX0KKwlpZiAoYXZwX3gpIHsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfZnJlZSggYXZwX3ggKSApOworCX0KKwlpZiAoYXZwX3kpIHsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfZnJlZSggYXZwX3kgKSApOworCX0KKwkKKwkKKwkvKgorCSAgICAgIC0gIElmIGEgUHJveHktU3RhdGUgYXR0cmlidXRlIHdhcyBwcmVzZW50IGluIHRoZSBSQURJVVMgcmVxdWVzdCwKKyAgICAgICAgCSB0aGUgc2FtZSBhdHRyaWJ1dGUgaXMgYWRkZWQgaW4gdGhlIHJlc3BvbnNlLiAgVGhpcyBpbmZvcm1hdGlvbgorICAgICAgICAJIG1heSBiZSBmb3VuZCBpbiB0aGUgUHJveHktSW5mbyBBVlAgZ3JvdXAsIG9yIGluIGEgbG9jYWwgc3RhdGUKKyAgICAgICAgCSB0YWJsZS4KKwkJIAktPiBoYW5kbGVkIGJ5IHN1Yl9lY2hvX2Ryb3AKKworCSAgICAgIC0gIElmIHN0YXRlIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGUgUkFESVVTIHJlcXVlc3Qgd2FzIHNhdmVkIGluCisgICAgICAgIAkgYSBQcm94eS1JbmZvIEFWUCBvciBsb2NhbCBzdGF0ZSB0YWJsZSwgdGhlIFJBRElVUyBJZGVudGlmaWVyCisgICAgICAgIAkgYW5kIFVEUCBJUCBBZGRyZXNzIGFuZCBwb3J0IG51bWJlciBhcmUgZXh0cmFjdGVkIGFuZCB1c2VkIGluCisgICAgICAgIAkgaXNzdWluZyB0aGUgUkFESVVTIHJlcGx5LgorCQkgCS0+IHdhcyBzYXZlZCB3aXRoIHRoZSBmdWxsIHJlcXVlc3QKKwkqLworCQorCQorCS8qIE5vdyBsb29wIGluIHRoZSBsaXN0IG9mIEFWUHMgYW5kIGNvbnZlcnQgdGhvc2UgdGhhdCB3ZSBrbm93IGhvdyAqLworCUNIRUNLX0ZDVCggZmRfbXNnX2Jyb3dzZSgqZGlhbV9hbnMsIE1TR19CUldfRklSU1RfQ0hJTEQsICZuZXh0LCBOVUxMKSApOworCQorCXdoaWxlIChuZXh0KSB7CisJCWludCBoYW5kbGVkID0gMTsKKwkJYXZwID0gbmV4dDsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYnJvd3NlKGF2cCwgTVNHX0JSV19ORVhULCAmbmV4dCwgTlVMTCkgKTsKKwkJCisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9oZHIgKCBhdnAsICZhaGRyICkgKTsKKwkJCisJCWlmICghKGFoZHItPmF2cF9mbGFncyAmIEFWUF9GTEFHX1ZFTkRPUikpIHsKKwkJCXN3aXRjaCAoYWhkci0+YXZwX2NvZGUpIHsKKwkJLyogSW4gY2FzZSBvZiBEaWFtZXRlciBlcnJvciwgaW5jbHVkZSB0aGUgUmVwbHktTWVzc2FnZSBhdHRyaWJ1dGUgKi8KKwkJCQljYXNlIERJQU1fQVRUUl9FUlJPUl9NRVNTQUdFOgorCQkJCQlDT05WMlJBRF9TVFIoUkFESVVTX0FUVFJfUkVQTFlfTUVTU0FHRSwgYWhkci0+YXZwX3ZhbHVlLT5vcy5kYXRhLCBhaGRyLT5hdnBfdmFsdWUtPm9zLmxlbiwgMik7CisJCQkJCWJyZWFrOworCQkJCQkKKwkJCQljYXNlIERJQU1fQVRUUl9FUlJPUl9SRVBPUlRJTkdfSE9TVDoKKwkJCQkJeworCQkJCQkJY2hhciBidWZbMjU0XTsKKwkJCQkJCWludCBic3ogPSBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiRXJyb3ItUmVwb3J0aW5nLUhvc3Q6ICUqcyIsIChpbnQpKGFoZHItPmF2cF92YWx1ZS0+b3MubGVuKSwgYWhkci0+YXZwX3ZhbHVlLT5vcy5kYXRhKTsKKwkJCQkJCUNPTlYyUkFEX1NUUihSQURJVVNfQVRUUl9SRVBMWV9NRVNTQUdFLCAodWludDhfdCAqKWJ1ZiwgYnN6LCAyKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQkKKwkJCQljYXNlIERJQU1fQVRUUl9GQUlMRURfQVZQOgorCQkJCQl7CisJCQkJCQlzdHJ1Y3QgYXZwICogZmF2cDsKKwkJCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2Jyb3dzZShhdnAsIE1TR19CUldfRklSU1RfQ0hJTEQsICZmYXZwLCBOVUxMKSApOworCQkJCQkJaWYgKGZhdnApIHsKKwkJCQkJCQljaGFyIGJ1ZlsyNTRdOworCQkJCQkJCWludCBic3o7CisJCQkJCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogZmF2cF9tb2RlbDsKKwkJCQkJCQkKKwkJCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19tb2RlbChmYXZwLCAmZmF2cF9tb2RlbCkgKTsKKwkJCQkJCQlpZiAoZmF2cF9tb2RlbCkgeworCQkJCQkJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBmYWRhdGE7CisJCQkJCQkJCUNIRUNLX0ZDVCggZmRfZGljdF9nZXR2YWwoZmF2cF9tb2RlbCwgJmZhZGF0YSkgKTsKKwkJCQkJCQkJYnN6ID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIkZhaWxlZC1BVlA6ICVzIiwgZmFkYXRhLmF2cF9uYW1lKTsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQlzdHJ1Y3QgYXZwX2hkciAqIGZhdnBfaGRyOworCQkJCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfaGRyICggZmF2cCwgJmZhdnBfaGRyICkgKTsKKwkJCQkJCQkJYnN6ID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIkZhaWxlZC1BVlA6IGNvZGUgJXUsIHZlbmRvciAldSIsIGZhdnBfaGRyLT5hdnBfY29kZSwgZmF2cF9oZHItPmF2cF92ZW5kb3IpOworCQkJCQkJCX0KKwkJCQkJCQlDT05WMlJBRF9TVFIoUkFESVVTX0FUVFJfUkVQTFlfTUVTU0FHRSwgKHVpbnQ4X3QgKilidWYsIGJzeiwgMik7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJCQorCQkvKiBSRkMgNDAwNSAoQVZQIGluIHRoZSBvcmRlciBvZiB0aGUgQUEtUmVxdWVzdC9BbnN3ZXIgQVZQIFRhYmxlKSAqLworCQkJCWNhc2UgRElBTV9BVFRSX0FDQ1RfSU5URVJJTV9JTlRFUlZBTDoKKwkJCQkJQ09OVjJSQURfMzJCKFJBRElVU19BVFRSX0FDQ1RfSU5URVJJTV9JTlRFUlZBTCwgYWhkci0+YXZwX3ZhbHVlLT51MzIpOworCQkJCQlicmVhazsKKwkJCQkJCisJCQkJY2FzZSBESUFNX0FUVFJfQVJBUF9DSEFMTEVOR0VfUkVTUE9OU0U6CisJCQkJCUNPTlYyUkFEX1NUUihSQURJVVNfQVRUUl9BUkFQX0NIQUxMRU5HRV9SRVNQT05TRSwgYWhkci0+YXZwX3ZhbHVlLT5vcy5kYXRhLCBhaGRyLT5hdnBfdmFsdWUtPm9zLmxlbiwgMCk7CisJCQkJCWJyZWFrOworCQkJCQkKKwkJCQljYXNlIERJQU1fQVRUUl9BUkFQX0ZFQVRVUkVTOgorCQkJCQlDT05WMlJBRF9TVFIoUkFESVVTX0FUVFJfQVJBUF9GRUFUVVJFUywgYWhkci0+YXZwX3ZhbHVlLT5vcy5kYXRhLCBhaGRyLT5hdnBfdmFsdWUtPm9zLmxlbiwgMCk7CisJCQkJCWJyZWFrOworCQkJCQkKKwkJCQkvKiBBUkFQLVBhc3N3b3JkIGlzIG5vdCBwcmVzZW50IGluIGFuc3dlcnMgKi8KKwkJCQkJCisJCQkJY2FzZSBESUFNX0FUVFJfQVJBUF9TRUNVUklUWToKKwkJCQkJQ09OVjJSQURfMzJCKFJBRElVU19BVFRSX0FSQVBfU0VDVVJJVFksIGFoZHItPmF2cF92YWx1ZS0+dTMyKTsKKwkJCQkJYnJlYWs7CisJCQkJCQorCQkJCWNhc2UgRElBTV9BVFRSX0FSQVBfU0VDVVJJVFlfREFUQToKKwkJCQkJQ09OVjJSQURfU1RSKFJBRElVU19BVFRSX0FSQVBfU0VDVVJJVFlfREFUQSwgYWhkci0+YXZwX3ZhbHVlLT5vcy5kYXRhLCBhaGRyLT5hdnBfdmFsdWUtPm9zLmxlbiwgMik7CisJCQkJCWJyZWFrOworCQkJCQkKKwkJCQljYXNlIERJQU1fQVRUUl9BUkFQX1pPTkVfQUNDRVNTOgorCQkJCQlDT05WMlJBRF8zMkIoUkFESVVTX0FUVFJfQVJBUF9aT05FX0FDQ0VTUywgYWhkci0+YXZwX3ZhbHVlLT51MzIpOworCQkJCQlicmVhazsKKwkJCQkJCisJCQkJY2FzZSBESUFNX0FUVFJfQVVUSF9BUFBMSUNBVElPTl9JRDoKKwkJCQkJLyogV2UganVzdCByZW1vdmUgdGhpcyBBVlAgKi8KKwkJCQkJYnJlYWs7CisJCQkJCQorCQkJCWNhc2UgRElBTV9BVFRSX0FVVEhfR1JBQ0VfUEVSSU9EOgorCQkJCQkvKiBXZSBqdXN0IHJlbW92ZSB0aGlzIEFWUCAoPykgKi8KKwkJCQkJYnJlYWs7CisJCQkJCisJCQkJY2FzZSBESUFNX0FUVFJfQVVUSF9SRVFVRVNUX1RZUEU6CisJCQkJCS8qIFdlIG9ubHkgY2hlY2sgdGhlIHZhbHVlICovCisJCQkJCWlmIChhaGRyLT5hdnBfdmFsdWUtPnUzMiAhPSAzKSB7CisJCQkJCQlmZF9sb2dfZGVidWcoIlthdXRoLnJnd3hdIFJlY2VpdmVkIERpYW1ldGVyIGFuc3dlciB3aXRoIEF1dGgtUmVxdWVzdC1UeXBlIHNldCB0byAlZCAoJXMpIGZyb20gc2VydmVyICUuKnMsIHNlc3Npb24gJS4qcy4iCisJCQkJCQkJCSIgIFRoaXMgbWF5IGNhdXNlIGludGVyb3BlcmFiaWxpdHkgcHJvYmxlbXMgd2l0aCBSQURJVVMuIiwKKwkJCQkJCQkJYWhkci0+YXZwX3ZhbHVlLT51MzIsCisJCQkJCQkJCShhaGRyLT5hdnBfdmFsdWUtPnUzMiA9PSAxKSA/ICJBVVRIRU5USUNBVEVfT05MWSIgOgorCQkJCQkJCQkJKChhaGRyLT5hdnBfdmFsdWUtPnUzMiA9PSAyKSA/ICJBVVRIT1JJWkVfT05MWSIgOiAiPz8/IiksCisJCQkJCQkJCShpbnQpb2gtPmF2cF92YWx1ZS0+b3MubGVuLCBvaC0+YXZwX3ZhbHVlLT5vcy5kYXRhLCAKKwkJCQkJCQkJKGludClzaWRsZW4sIHNpZCk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJCisJCQkJY2FzZSBESUFNX0FUVFJfQVVUSF9TRVNTSU9OX1NUQVRFOgorCQkJCQlpZiAoKCF0YV9zZXQpICYmIChhaGRyLT5hdnBfdmFsdWUtPnUzMiA9PSBBQ1ZfQVNTX1NUQVRFX01BSU5UQUlORUQpKSB7CisJCQkJCQlDT05WMlJBRF8zMkIoIFJBRElVU19BVFRSX1RFUk1JTkFUSU9OX0FDVElPTiwgUkFESVVTX1RFUk1JTkFUSU9OX0FDVElPTl9SQURJVVNfUkVRVUVTVCApOworCQkJCQl9CisJCQkJCQorCQkJCQlpZiAoYWhkci0+YXZwX3ZhbHVlLT51MzIgPT0gQUNWX0FTU19OT19TVEFURV9NQUlOVEFJTkVEKSB7CisJCQkJCQlub19zdHIgPSAxOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCQkKKwkJCQkvKiBBdXRob3JpemF0aW9uLUxpZmV0aW1lIGFscmVhZHkgaGFuZGxlZCAqLworCQkJCQorCQkJCWNhc2UgRElBTV9BVFRSX0NBTExCQUNLX0lEOgorCQkJCQlDT05WMlJBRF9TVFIoUkFESVVTX0FUVFJfQ0FMTEJBQ0tfSUQsIGFoZHItPmF2cF92YWx1ZS0+b3MuZGF0YSwgYWhkci0+YXZwX3ZhbHVlLT5vcy5sZW4sIDEpOworCQkJCQlicmVhazsKKwkJCQkKKwkJCQljYXNlIERJQU1fQVRUUl9DQUxMQkFDS19OVU1CRVI6CisJCQkJCUNPTlYyUkFEX1NUUihSQURJVVNfQVRUUl9DQUxMQkFDS19OVU1CRVIsIGFoZHItPmF2cF92YWx1ZS0+b3MuZGF0YSwgYWhkci0+YXZwX3ZhbHVlLT5vcy5sZW4sIDEpOworCQkJCQlicmVhazsKKwkJCQkKKwkJCQkvKiBDYWxsZWQtU3RhdGlvbi1JZCBpcyBub3QgcHJlc2VudCBpbiBhbnN3ZXJzICovCisJCQkJLyogQ2FsbGluZy1TdGF0aW9uLUlkIGlzIG5vdCBwcmVzZW50IGluIGFuc3dlcnMgKi8KKwkJCQkvKiBDSEFQLUF1dGggaXMgbm90IHByZXNlbnQgaW4gYW5zd2VycyAqLworCQkJCS8qIENIQVAtQ2hhbGxlbmdlIGlzIG5vdCBwcmVzZW50IGluIGFuc3dlcnMgKi8KKwkJCQkJCisJCQkJY2FzZSBESUFNX0FUVFJfQ0xBU1M6CisJCQkJCUNPTlYyUkFEX1NUUihSQURJVVNfQVRUUl9DTEFTUywgYWhkci0+YXZwX3ZhbHVlLT5vcy5kYXRhLCBhaGRyLT5hdnBfdmFsdWUtPm9zLmxlbiwgMik7CisJCQkJCWJyZWFrOworCQkJCQorCQkJCWNhc2UgRElBTV9BVFRSX0NPTkZJR1VSQVRJT05fVE9LRU46CisJCQkJCS8qIFdlIG1pZ2h0IGFzIHdlbGwgcmVtb3ZlIGl0IHNpbmNlIGl0J3Mgbm90IHN1cHBvc2VkIHRvIGJlIHNlbnQgdG8gdGhlIE5BUy4uLiAqLworCQkJCQlDT05WMlJBRF9TVFIoUkFESVVTX0FUVFJfQ09ORklHVVJBVElPTl9UT0tFTiwgYWhkci0+YXZwX3ZhbHVlLT5vcy5kYXRhLCBhaGRyLT5hdnBfdmFsdWUtPm9zLmxlbiwgMik7CisJCQkJCWJyZWFrOworCQkJCQorCQkJCS8qIENvbm5lY3QtSW5mbyBpcyBub3QgcHJlc2VudCBpbiBhbnN3ZXJzICovCisJCQkJCisJCQkJY2FzZSBESUFNX0FUVFJfRklMVEVSX0lEOgorCQkJCQlDT05WMlJBRF9TVFIoUkFESVVTX0FUVFJfRklMVEVSX0lELCBhaGRyLT5hdnBfdmFsdWUtPm9zLmRhdGEsIGFoZHItPmF2cF92YWx1ZS0+b3MubGVuLCAyKTsKKwkJCQkJYnJlYWs7CisJCQkJCQorCQkJCWNhc2UgRElBTV9BVFRSX0ZSQU1FRF9BUFBMRVRBTEtfTElOSzoKKwkJCQkJQ09OVjJSQURfMzJCKFJBRElVU19BVFRSX0ZSQU1FRF9BUFBMRVRBTEtfTElOSywgYWhkci0+YXZwX3ZhbHVlLT51MzIpOworCQkJCQlicmVhazsKKwkJCQkJCisJCQkJY2FzZSBESUFNX0FUVFJfRlJBTUVEX0FQUExFVEFMS19ORVRXT1JLOgorCQkJCQlDT05WMlJBRF8zMkIoUkFESVVTX0FUVFJfRlJBTUVEX0FQUExFVEFMS19ORVRXT1JLLCBhaGRyLT5hdnBfdmFsdWUtPnUzMik7CisJCQkJCWJyZWFrOworCQkJCQkKKwkJCQljYXNlIERJQU1fQVRUUl9GUkFNRURfQVBQTEVUQUxLX1pPTkU6CisJCQkJCUNPTlYyUkFEX1NUUihSQURJVVNfQVRUUl9GUkFNRURfQVBQTEVUQUxLX1pPTkUsIGFoZHItPmF2cF92YWx1ZS0+b3MuZGF0YSwgYWhkci0+YXZwX3ZhbHVlLT5vcy5sZW4sIDEpOworCQkJCQlicmVhazsKKwkJCQkJCisJCQkJY2FzZSBESUFNX0FUVFJfRlJBTUVEX0NPTVBSRVNTSU9OOgorCQkJCQlDT05WMlJBRF8zMkIoUkFESVVTX0FUVFJfRlJBTUVEX0NPTVBSRVNTSU9OLCAgYWhkci0+YXZwX3ZhbHVlLT51MzIpOworCQkJCQlicmVhazsKKwkJCQkJCisJCQkJY2FzZSBESUFNX0FUVFJfRlJBTUVEX0lOVEVSRkFDRV9JRDoKKwkJCQkJQ09OVjJSQURfNjRCKFJBRElVU19BVFRSX0ZSQU1FRF9JTlRFUkZBQ0VfSUQsICBhaGRyLT5hdnBfdmFsdWUtPnU2NCk7CisJCQkJCWJyZWFrOworCQkJCQkKKwkJCQljYXNlIERJQU1fQVRUUl9GUkFNRURfSVBfQUREUkVTUzoKKwkJCQkJQ09OVjJSQURfU1RSKFJBRElVU19BVFRSX0ZSQU1FRF9JUF9BRERSRVNTLCAgYWhkci0+YXZwX3ZhbHVlLT5vcy5kYXRhLCBhaGRyLT5hdnBfdmFsdWUtPm9zLmxlbiwgMCk7CisJCQkJCWJyZWFrOworCQkJCQkKKwkJCQljYXNlIERJQU1fQVRUUl9GUkFNRURfSVBfTkVUTUFTSzoKKwkJCQkJQ09OVjJSQURfU1RSKFJBRElVU19BVFRSX0ZSQU1FRF9JUF9ORVRNQVNLLCBhaGRyLT5hdnBfdmFsdWUtPm9zLmRhdGEsIGFoZHItPmF2cF92YWx1ZS0+b3MubGVuLCAwKTsKKwkJCQkJYnJlYWs7CisJCQkJCQorCQkJCWNhc2UgRElBTV9BVFRSX0ZSQU1FRF9JUFY2X1BSRUZJWDoKKwkJCQkJQ09OVjJSQURfU1RSKFJBRElVU19BVFRSX0ZSQU1FRF9JUFY2X1BSRUZJWCwgYWhkci0+YXZwX3ZhbHVlLT5vcy5kYXRhLCBhaGRyLT5hdnBfdmFsdWUtPm9zLmxlbiwgMCk7CisJCQkJCWJyZWFrOworCQkJCQkKKwkJCQljYXNlIERJQU1fQVRUUl9GUkFNRURfSVBWNl9QT09MOgorCQkJCQlDT05WMlJBRF9TVFIoUkFESVVTX0FUVFJfRlJBTUVEX0lQVjZfUE9PTCwgYWhkci0+YXZwX3ZhbHVlLT5vcy5kYXRhLCBhaGRyLT5hdnBfdmFsdWUtPm9zLmxlbiwgMSk7CisJCQkJCWJyZWFrOworCQkJCQkKKwkJCQljYXNlIERJQU1fQVRUUl9GUkFNRURfSVBWNl9ST1VURToKKwkJCQkJQ09OVjJSQURfU1RSKFJBRElVU19BVFRSX0ZSQU1FRF9JUFY2X1JPVVRFLCBhaGRyLT5hdnBfdmFsdWUtPm9zLmRhdGEsIGFoZHItPmF2cF92YWx1ZS0+b3MubGVuLCAxKTsKKwkJCQkJYnJlYWs7CisJCQkJCQorCQkJCWNhc2UgRElBTV9BVFRSX0ZSQU1FRF9JUFhfTkVUV09SSzoKKwkJCQkJQ09OVjJSQURfMzJCKFJBRElVU19BVFRSX0ZSQU1FRF9JUFhfTkVUV09SSywgYWhkci0+YXZwX3ZhbHVlLT51MzIpOworCQkJCQlicmVhazsKKwkJCQkJCisJCQkJY2FzZSBESUFNX0FUVFJfRlJBTUVEX01UVToKKwkJCQkJQ09OVjJSQURfMzJCKFJBRElVU19BVFRSX0ZSQU1FRF9NVFUsIGFoZHItPmF2cF92YWx1ZS0+dTMyKTsKKwkJCQkJYnJlYWs7CisJCQkJCQorCQkJCWNhc2UgRElBTV9BVFRSX0ZSQU1FRF9QT09MOgorCQkJCQlDT05WMlJBRF9TVFIoUkFESVVTX0FUVFJfRlJBTUVEX1BPT0wsIGFoZHItPmF2cF92YWx1ZS0+b3MuZGF0YSwgYWhkci0+YXZwX3ZhbHVlLT5vcy5sZW4sIDEpOworCQkJCQlicmVhazsKKwkJCQkJCisJCQkJY2FzZSBESUFNX0FUVFJfRlJBTUVEX1BST1RPQ09MOgorCQkJCQlDT05WMlJBRF8zMkIoUkFESVVTX0FUVFJfRlJBTUVEX1BST1RPQ09MLCBhaGRyLT5hdnBfdmFsdWUtPnUzMik7CisJCQkJCWJyZWFrOworCQkJCQkKKwkJCQljYXNlIERJQU1fQVRUUl9GUkFNRURfUk9VVEU6CisJCQkJCUNPTlYyUkFEX1NUUihSQURJVVNfQVRUUl9GUkFNRURfUk9VVEUsIGFoZHItPmF2cF92YWx1ZS0+b3MuZGF0YSwgYWhkci0+YXZwX3ZhbHVlLT5vcy5sZW4sIDEpOworCQkJCQlicmVhazsKKwkJCQkJCisJCQkJY2FzZSBESUFNX0FUVFJfRlJBTUVEX1JPVVRJTkc6CisJCQkJCUNPTlYyUkFEXzMyQihSQURJVVNfQVRUUl9GUkFNRURfUk9VVElORywgYWhkci0+YXZwX3ZhbHVlLT51MzIpOworCQkJCQlicmVhazsKKwkJCQkJCisJCQkJY2FzZSBESUFNX0FUVFJfSURMRV9USU1FT1VUOgorCQkJCQlDT05WMlJBRF8zMkIoUkFESVVTX0FUVFJfSURMRV9USU1FT1VULCBhaGRyLT5hdnBfdmFsdWUtPnUzMik7CisJCQkJCWJyZWFrOworCQkJCQkKKwkJCQljYXNlIERJQU1fQVRUUl9MT0dJTl9JUF9IT1NUOgorCQkJCQlDT05WMlJBRF9TVFIoUkFESVVTX0FUVFJfTE9HSU5fSVBfSE9TVCwgYWhkci0+YXZwX3ZhbHVlLT5vcy5kYXRhLCBhaGRyLT5hdnBfdmFsdWUtPm9zLmxlbiwgMCk7CisJCQkJCWJyZWFrOworCQkJCQkKKwkJCQljYXNlIERJQU1fQVRUUl9MT0dJTl9JUFY2X0hPU1Q6CisJCQkJCUNPTlYyUkFEX1NUUihSQURJVVNfQVRUUl9MT0dJTl9JUFY2X0hPU1QsIGFoZHItPmF2cF92YWx1ZS0+b3MuZGF0YSwgYWhkci0+YXZwX3ZhbHVlLT5vcy5sZW4sIDApOworCQkJCQlicmVhazsKKwkJCQkJCisJCQkJY2FzZSBESUFNX0FUVFJfTE9HSU5fTEFUX0dST1VQOgorCQkJCQlDT05WMlJBRF9TVFIoUkFESVVTX0FUVFJfTE9HSU5fTEFUX0dST1VQLCBhaGRyLT5hdnBfdmFsdWUtPm9zLmRhdGEsIGFoZHItPmF2cF92YWx1ZS0+b3MubGVuLCAxKTsKKwkJCQkJYnJlYWs7CisJCQkJCQorCQkJCWNhc2UgRElBTV9BVFRSX0xPR0lOX0xBVF9OT0RFOgorCQkJCQlDT05WMlJBRF9TVFIoUkFESVVTX0FUVFJfTE9HSU5fTEFUX05PREUsIGFoZHItPmF2cF92YWx1ZS0+b3MuZGF0YSwgYWhkci0+YXZwX3ZhbHVlLT5vcy5sZW4sIDEpOworCQkJCQlicmVhazsKKwkJCQkJCisJCQkJY2FzZSBESUFNX0FUVFJfTE9HSU5fTEFUX1BPUlQ6CisJCQkJCUNPTlYyUkFEX1NUUihSQURJVVNfQVRUUl9MT0dJTl9MQVRfUE9SVCwgYWhkci0+YXZwX3ZhbHVlLT5vcy5kYXRhLCBhaGRyLT5hdnBfdmFsdWUtPm9zLmxlbiwgMSk7CisJCQkJCWJyZWFrOworCQkJCQkKKwkJCQljYXNlIERJQU1fQVRUUl9MT0dJTl9MQVRfU0VSVklDRToKKwkJCQkJQ09OVjJSQURfU1RSKFJBRElVU19BVFRSX0xPR0lOX0xBVF9TRVJWSUNFLCBhaGRyLT5hdnBfdmFsdWUtPm9zLmRhdGEsIGFoZHItPmF2cF92YWx1ZS0+b3MubGVuLCAxKTsKKwkJCQkJYnJlYWs7CisJCQkJCQorCQkJCWNhc2UgRElBTV9BVFRSX0xPR0lOX1NFUlZJQ0U6CisJCQkJCUNPTlYyUkFEXzMyQihSQURJVVNfQVRUUl9MT0dJTl9TRVJWSUNFLCBhaGRyLT5hdnBfdmFsdWUtPnUzMik7CisJCQkJCWJyZWFrOworCQkJCQkKKwkJCQljYXNlIERJQU1fQVRUUl9MT0dJTl9UQ1BfUE9SVDoKKwkJCQkJQ09OVjJSQURfMzJCKFJBRElVU19BVFRSX0xPR0lOX1RDUF9QT1JULCBhaGRyLT5hdnBfdmFsdWUtPnUzMik7CisJCQkJCWJyZWFrOworCQkJCQkKKwkJCS8qCisJCQkgICAgICAtCQkJCQkJCSAgICAgICAgSWYgdGhlCisgICAgICAgIAkJCSBNdWx0aS1Sb3VuZC1UaW1lLU91dCBBVlAgaXMgcHJlc2VudCwgdGhlIHZhbHVlIG9mIHRoZSBBVlAgTVVTVAorICAgICAgICAJCQkgYmUgaW5zZXJ0ZWQgaW4gdGhlIFJBRElVUyBTZXNzaW9uLVRpbWVvdXQgQVZQLgorCisJCQkgICAgICBvICBBcyBkZXNjcmliZWQgaW4gW05BU1JFUV0sIGlmIHRoZSBSZXN1bHQtQ29kZSBBVlAgc2V0IHRvCisJCQkJIERJQU1FVEVSX01VTFRJX1JPVU5EX0FVVEggYW5kIHRoZSBNdWx0aS1Sb3VuZC1UaW1lLU91dCBBVlAgaXMKKwkJCQkgcHJlc2VudCwgaXQgaXMgdHJhbnNsYXRlZCB0byB0aGUgUkFESVVTIFNlc3Npb24tVGltZW91dCBhdHRyaWJ1dGUuCisJCQkqLworCQkJCWNhc2UgRElBTV9BVFRSX01VTFRJX1JPVU5EX1RJTUVPVVQ6CisJCQkJCUNPTlYyUkFEXzMyQihSQURJVVNfQVRUUl9TRVNTSU9OX1RJTUVPVVQsIGFoZHItPmF2cF92YWx1ZS0+dTMyKTsKKwkJCQkJYnJlYWs7CisJCQkJCQorCQkJCWNhc2UgRElBTV9BVFRSX05BU19GSUxURVJfUlVMRToKKwkJCQkJLyogVGhpcyBpcyBub3QgdHJhbnNsYXRhYmxlIHRvIFJBRElVUyAqLworCQkJCQlmZF9sb2dfZGVidWcoIlthdXRoLnJnd3hdIFJlY2VpdmVkIERpYW1ldGVyIGFuc3dlciB3aXRoIG5vbi10cmFuc2xhdGFibGUgTkFTLUZpbHRlci1SdWxlIEFWUCBmcm9tICclLipzJyAoc2Vzc2lvbjogJyUuKnMnKSwgaWdub3JpbmcuIiwKKwkJCQkJCQkoaW50KW9oLT5hdnBfdmFsdWUtPm9zLmxlbiwgb2gtPmF2cF92YWx1ZS0+b3MuZGF0YSwKKwkJCQkJCQkoaW50KXNpZGxlbiwgc2lkKTsKKwkJCQkJaGFuZGxlZCA9IDA7CisJCQkJCWJyZWFrOworCQkJCQkKKwkJCQkvKiBOQVMtSWRlbnRpZmllciBpcyBub3QgcHJlc2VudCBpbiBhbnN3ZXJzICovCisJCQkJLyogTkFTLUlQLUFkZHJlc3MgaXMgbm90IHByZXNlbnQgaW4gYW5zd2VycyAqLworCQkJCS8qIE5BUy1JUHY2LUFkZHJlc3MgaXMgbm90IHByZXNlbnQgaW4gYW5zd2VycyAqLworCQkJCS8qIE5BUy1Qb3J0IGlzIG5vdCBwcmVzZW50IGluIGFuc3dlcnMgKi8KKwkJCQkvKiBOQVMtUG9ydC1JZCBpcyBub3QgcHJlc2VudCBpbiBhbnN3ZXJzICovCisJCQkJLyogTkFTLVBvcnQtVHlwZSBpcyBub3QgcHJlc2VudCBpbiBhbnN3ZXJzICovCisJCQkJCisJCQkJY2FzZSBESUFNX0FUVFJfT1JJR0lOX0FBQV9QUk9UT0NPTDoKKwkJCQkJLyogV2UganVzdCByZW1vdmUgdGhpcyBBVlAgKi8KKwkJCQkJYnJlYWs7CisJCQkJCQorCQkJCS8qIE9yaWdpbmF0aW5nLUxpbmUtSW5mbyBpcyBub3QgcHJlc2VudCBpbiBhbnN3ZXJzICovCisJCQkJCisJCQkJY2FzZSBESUFNX0FUVFJfUEFTU1dPUkRfUkVUUlk6CisJCQkJCUNPTlYyUkFEXzMyQihSQURJVVNfQVRUUl9QQVNTV09SRF9SRVRSWSwgYWhkci0+YXZwX3ZhbHVlLT51MzIpOworCQkJCQlicmVhazsKKwkJCQkKKwkJCQljYXNlIERJQU1fQVRUUl9QT1JUX0xJTUlUOgorCQkJCQlDT05WMlJBRF8zMkIoUkFESVVTX0FUVFJfUE9SVF9MSU1JVCwgYWhkci0+YXZwX3ZhbHVlLT51MzIpOworCQkJCQlicmVhazsKKwkJCQkKKwkJCQljYXNlIERJQU1fQVRUUl9QUk9NUFQ6CisJCQkJCUNPTlYyUkFEXzMyQihSQURJVVNfQVRUUl9QUk9NUFQsIGFoZHItPmF2cF92YWx1ZS0+dTMyKTsKKwkJCQkJYnJlYWs7CisJCQkJCQorCQkJCWNhc2UgRElBTV9BVFRSX1FPU19GSUxURVJfUlVMRToKKwkJCQkJLyogVGhpcyBpcyBub3QgdHJhbnNsYXRhYmxlIHRvIFJBRElVUyAqLworCQkJCQlmZF9sb2dfZGVidWcoIlthdXRoLnJnd3hdIFJlY2VpdmVkIERpYW1ldGVyIGFuc3dlciB3aXRoIG5vbi10cmFuc2xhdGFibGUgUW9TLUZpbHRlci1SdWxlIEFWUCBmcm9tICclLipzJyAoc2Vzc2lvbjogJyUuKnMnKSwgaWdub3JpbmcuIiwKKwkJCQkJCQkoaW50KW9oLT5hdnBfdmFsdWUtPm9zLmxlbiwgb2gtPmF2cF92YWx1ZS0+b3MuZGF0YSwKKwkJCQkJCQkoaW50KXNpZGxlbiwgc2lkKTsKKwkJCQkJaGFuZGxlZCA9IDA7CisJCQkJCWJyZWFrOworCQkJCQkKKwkJCQkvKiBSZS1BdXRoLVJlcXVlc3QtVHlwZSBhbHJlYWR5IGhhbmRsZWQgKi8KKwkJCQkKKwkJCQljYXNlIERJQU1fQVRUUl9SRVBMWV9NRVNTQUdFOgorCQkJCQlDT05WMlJBRF9TVFIoUkFESVVTX0FUVFJfUkVQTFlfTUVTU0FHRSwgYWhkci0+YXZwX3ZhbHVlLT5vcy5kYXRhLCBhaGRyLT5hdnBfdmFsdWUtPm9zLmxlbiwgMik7CisJCQkJCWJyZWFrOworCQkJCQkKKwkJCQljYXNlIERJQU1fQVRUUl9TRVJWSUNFX1RZUEU6CisJCQkJCUNPTlYyUkFEXzMyQihSQURJVVNfQVRUUl9TRVJWSUNFX1RZUEUsIGFoZHItPmF2cF92YWx1ZS0+dTMyKTsKKwkJCQkJYnJlYWs7CisJCQkJCisJCQkJY2FzZSBESUFNX0FUVFJfU1RBVEU6CisJCQkJCUNPTlYyUkFEX1NUUihSQURJVVNfQVRUUl9TVEFURSwgYWhkci0+YXZwX3ZhbHVlLT5vcy5kYXRhLCBhaGRyLT5hdnBfdmFsdWUtPm9zLmxlbiwgMik7CisJCQkJCWJyZWFrOworCQkJCQkKKwkJCQljYXNlIERJQU1fQVRUUl9UVU5ORUxJTkc6CisJCQkJCXsKKyNkZWZpbmUgQ09OVjJSQURfVFVOX1NUUiggX2F0dHJfLCBfZGF0YV8sIF9sZW5fLCBfdHJ1bmNfKQl7CQkJCVwKKwlzaXplX3QgX19sID0gKHNpemVfdCkoX2xlbl8pOwkJCQkJCQkJXAorCXNpemVfdCBfX3cgPSAoX19sID4gMjUyKSA/IDI1MiA6IF9fbDsJCQkJCQkJXAorCXNpemVfdCBfX29mZiA9IDA7CQkJCQkJCQkJXAorCWlmICgoX3RydW5jXykgPT0gMCkgewkJCQkJCQkJCVwKKwkJQ0hFQ0tfUEFSQU1TKCBfX2wgPD0gMjUyICk7CQkJCQkJCVwKKwl9CQkJCQkJCQkJCQlcCisJaWYgKChfX2wgPiAyNTIpICYmIChfdHJ1bmNfID09IDEpKSB7CQkJCQkJCVwKKwkJVFJBQ0VfREVCVUcoRlVMTCwgIkF0dHJpYnV0ZSB0cnVuY2F0ZWQhIik7CQkJCQlcCisJCV9fbCA9IDI1MjsJCQkJCQkJCQlcCisJfQkJCQkJCQkJCQkJXAorCWJ1ZlswXSA9IHR1bnRhZzsJCQkJCQkJCQlcCisJbWVtY3B5KCZidWZbMV0sIChfZGF0YV8pLCBfX3cpOwkJCQkJCQkJXAorCUNIRUNLX01BTExPQyhyYWRpdXNfbXNnX2FkZF9hdHRyKCpyYWRfZncsIChfYXR0cl8pLCAmYnVmWzBdLCBfX3cgKyAxKSk7CQkJXAorCXdoaWxlIChfX2wgLT0gX193KSB7CQkJCQkJCQkJXAorCQlfX29mZiArPSBfX3c7CQkJCQkJCQkJXAorCQlfX3cgPSAoX19sID4gMjUzKSA/IDI1MyA6IF9fbDsJCQkJCQkJXAorCQlDSEVDS19NQUxMT0MocmFkaXVzX21zZ19hZGRfYXR0cigqcmFkX2Z3LCAoX2F0dHJfKSwgKF9kYXRhXykgKyBfX29mZiwgX193KSk7CVwKKwl9CQkJCQkJCQkJCQlcCit9CisKKyNkZWZpbmUgQ09OVjJSQURfVFVOXzMyQiggX2F0dHJfLCBfZGF0YV8pCXsJCQkJCQlcCisJdWludDMyX3QgX192ID0gaHRvbmwoKHVpbnQzMl90KShfZGF0YV8pIHwgKHR1bnRhZyA8PCAyNCkpOwkJCQlcCisJQ0hFQ0tfTUFMTE9DKHJhZGl1c19tc2dfYWRkX2F0dHIoKnJhZF9mdywgKF9hdHRyXyksICh1aW50OF90ICopJl9fdiwgc2l6ZW9mKF9fdikpKTsJXAorfQorCQkJCQkJc3RydWN0IGF2cCAqaW5hdnAsICppbm5leHQ7CisJCQkJCQl0dW50YWcrKzsKKwkJCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2Jyb3dzZShhdnAsIE1TR19CUldfRklSU1RfQ0hJTEQsICZpbm5leHQsIE5VTEwpICk7CisJCQkJCQl3aGlsZSAoaW5uZXh0KSB7CisJCQkJCQkJaW5hdnAgPSBpbm5leHQ7CisJCQkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYnJvd3NlKGluYXZwLCBNU0dfQlJXX05FWFQsICZpbm5leHQsIE5VTEwpICk7CisJCQkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2hkciAoIGluYXZwLCAmYWhkciApICk7CisJCQkJCQkJCisJCQkJCQkJaWYgKCAhIChhaGRyLT5hdnBfZmxhZ3MgJiBBVlBfRkxBR19WRU5ET1IpKSB7CisJCQkJCQkJCXN3aXRjaCAoYWhkci0+YXZwX2NvZGUpIHsKKwkJCQkJCQkJCWNhc2UgRElBTV9BVFRSX1RVTk5FTF9UWVBFOgorCQkJCQkJCQkJCUNPTlYyUkFEX1RVTl8zMkIoIFJBRElVU19BVFRSX1RVTk5FTF9UWVBFLCBhaGRyLT5hdnBfdmFsdWUtPnUzMik7CisJCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCQkJCisJCQkJCQkJCQljYXNlIERJQU1fQVRUUl9UVU5ORUxfTUVESVVNX1RZUEU6CisJCQkJCQkJCQkJQ09OVjJSQURfVFVOXzMyQiggUkFESVVTX0FUVFJfVFVOTkVMX01FRElVTV9UWVBFLCBhaGRyLT5hdnBfdmFsdWUtPnUzMik7CisJCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCQkJCisJCQkJCQkJCQljYXNlIERJQU1fQVRUUl9UVU5ORUxfQ0xJRU5UX0VORFBPSU5UOgorCQkJCQkJCQkJCUNPTlYyUkFEX1RVTl9TVFIoUkFESVVTX0FUVFJfVFVOTkVMX0NMSUVOVF9FTkRQT0lOVCwgYWhkci0+YXZwX3ZhbHVlLT5vcy5kYXRhLCBhaGRyLT5hdnBfdmFsdWUtPm9zLmxlbiwgMSk7CisJCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCQkJCisJCQkJCQkJCQljYXNlIERJQU1fQVRUUl9UVU5ORUxfU0VSVkVSX0VORFBPSU5UOgorCQkJCQkJCQkJCUNPTlYyUkFEX1RVTl9TVFIoUkFESVVTX0FUVFJfVFVOTkVMX1NFUlZFUl9FTkRQT0lOVCwgYWhkci0+YXZwX3ZhbHVlLT5vcy5kYXRhLCBhaGRyLT5hdnBfdmFsdWUtPm9zLmxlbiwgMSk7CisJCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCQkJCisJCQkJCQkJCQljYXNlIERJQU1fQVRUUl9UVU5ORUxfUFJFRkVSRU5DRToKKwkJCQkJCQkJCQlDT05WMlJBRF9UVU5fMzJCKCBSQURJVVNfQVRUUl9UVU5ORUxfUFJFRkVSRU5DRSwgYWhkci0+YXZwX3ZhbHVlLT51MzIpOworCQkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQkJCQorCQkJCQkJCQkJY2FzZSBESUFNX0FUVFJfVFVOTkVMX0NMSUVOVF9BVVRIX0lEOgorCQkJCQkJCQkJCUNPTlYyUkFEX1RVTl9TVFIoUkFESVVTX0FUVFJfVFVOTkVMX0NMSUVOVF9BVVRIX0lELCBhaGRyLT5hdnBfdmFsdWUtPm9zLmRhdGEsIGFoZHItPmF2cF92YWx1ZS0+b3MubGVuLCAxKTsKKwkJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJCQkKKwkJCQkJCQkJCWNhc2UgRElBTV9BVFRSX1RVTk5FTF9TRVJWRVJfQVVUSF9JRDoKKwkJCQkJCQkJCQlDT05WMlJBRF9UVU5fU1RSKFJBRElVU19BVFRSX1RVTk5FTF9TRVJWRVJfQVVUSF9JRCwgYWhkci0+YXZwX3ZhbHVlLT5vcy5kYXRhLCBhaGRyLT5hdnBfdmFsdWUtPm9zLmxlbiwgMSk7CisJCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCQkJCisJCQkJCQkJCQljYXNlIERJQU1fQVRUUl9UVU5ORUxfQVNTSUdOTUVOVF9JRDoKKwkJCQkJCQkJCQlDT05WMlJBRF9UVU5fU1RSKFJBRElVU19BVFRSX1RVTk5FTF9BU1NJR05NRU5UX0lELCBhaGRyLT5hdnBfdmFsdWUtPm9zLmRhdGEsIGFoZHItPmF2cF92YWx1ZS0+b3MubGVuLCAxKTsKKwkJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJCQkKKwkJCQkJCQkJCWNhc2UgRElBTV9BVFRSX1RVTk5FTF9QQVNTV09SRDoKKwkJCQkJCQkJCQl7CisJCQkJCQkJCQkJCS8qIFRoaXMgQVZQIG11c3QgYmUgZW5jb2RlZCBmb3IgUkFESVVTIChzaW1pbGFyIHRvIHJhZGl1c19tc2dfYWRkX2F0dHJfdXNlcl9wYXNzd29yZCkKKwkJCQkJCQkJCQkJICAgIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKKwkJCQkJCQkJCQkJICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorCQkJCQkJCQkJCQkgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworCQkJCQkJCQkJCQkgICB8ICAgICBUeXBlICAgICAgfCAgICBMZW5ndGggICAgIHwgICAgIFRhZyAgICAgICB8ICAgU2FsdAorCQkJCQkJCQkJCQkgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworCQkJCQkJCQkJCQkgICAgICBTYWx0IChjb250KSAgfCAgIFN0cmluZyAuLi4KKwkJCQkJCQkJCQkJICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisJCQkJCQkJCQkJCSovCisJCQkJCQkJCQkJCXNpemVfdCBwb3M7CisJCQkJCQkJCQkJCWludCBpOworCQkJCQkJCQkJCQl1aW50OF90ICogc2VjcmV0OwkvKiBTICovCisJCQkJCQkJCQkJCXNpemVfdCBzZWNyZXRfbGVuOworCQkJCQkJCQkJCQl1aW50OF90IGhhc2hbMTZdOwkvKiBiKGkpICovCisJCQkJCQkJCQkJCWNvbnN0IHVpbnQ4X3QgKmFkZHJbM107CisJCQkJCQkJCQkJCXNpemVfdCBsZW5bM107CisJCQkJCQkJCQkJCQorCQkJCQkJCQkJCQkvKiBXZSBuZWVkIHRoZSByZXF1ZXN0IGF1dGhlbnRpY2F0b3IgKi8KKwkJCQkJCQkJCQkJQ0hFQ0tfUEFSQU1TKHN0KTsKKworCQkJCQkJCQkJCQkvKiBSZXRyaWV2ZSB0aGUgc2hhcmVkIHNlY3JldCAqLworCQkJCQkJCQkJCQlDSEVDS19GQ1Qocmd3X2NsaWVudHNfZ2V0a2V5KGNsaSwgJnNlY3JldCwgJnNlY3JldF9sZW4pKTsKKwkJCQkJCQkJCQkJCisJCQkJCQkJCQkJCS8qIEJlZ2lubmluZyBvZiB0aGUgYnVmZmVyICovCisJCQkJCQkJCQkJCWJ1ZlswXSA9IHR1bnRhZzsKKwkJCQkJCQkJCQkJYnVmWzFdID0gKHVpbnQ4X3QpKGxyYW5kNDgoKSk7IC8qIEEgKGhpIGJpdHMpICovCisJCQkJCQkJCQkJCWJ1ZlsyXSA9ICh1aW50OF90KShscmFuZDQ4KCkpOyAvKiBBIChsb3cgYml0cykgKi8KKwkJCQkJCQkJCQkJCisJCQkJCQkJCQkJCS8qIFRoZSBwbGFpbiB0ZXh0IHN0cmluZyBQICovCisJCQkJCQkJCQkJCUNIRUNLX1BBUkFNUyhhaGRyLT5hdnBfdmFsdWUtPm9zLmxlbiA8IDI0MCk7CisJCQkJCQkJCQkJCWJ1ZlszXSA9IGFoZHItPmF2cF92YWx1ZS0+b3MubGVuOworCQkJCQkJCQkJCQltZW1jcHkoJmJ1Zls0XSwgYWhkci0+YXZwX3ZhbHVlLT5vcy5kYXRhLCBhaGRyLT5hdnBfdmFsdWUtPm9zLmxlbik7CisJCQkJCQkJCQkJCW1lbXNldCgmYnVmWzQgKyBhaGRyLT5hdnBfdmFsdWUtPm9zLmxlbl0sIDAsIHNpemVvZihidWYpIC0gNCAtIGFoZHItPmF2cF92YWx1ZS0+b3MubGVuKTsKKwkJCQkJCQkJCQkJCisJCQkJCQkJCQkJCS8qIEluaXRpYWwgYjEgPSBNRDUoUyArIFIgKyBBKSAqLworCQkJCQkJCQkJCQlhZGRyWzBdID0gc2VjcmV0OworCQkJCQkJCQkJCQlsZW5bMF0gPSBzZWNyZXRfbGVuOworCQkJCQkJCQkJCQlhZGRyWzFdID0gc3QtPnJlcV9hdXRoOworCQkJCQkJCQkJCQlsZW5bMV0gPSAxNjsKKwkJCQkJCQkJCQkJYWRkclsyXSA9ICZidWZbMV07CisJCQkJCQkJCQkJCWxlblsyXSA9IDI7CisJCQkJCQkJCQkJCW1kNV92ZWN0b3IoMywgYWRkciwgbGVuLCBoYXNoKTsKKwkJCQkJCQkJCQkJCisJCQkJCQkJCQkJCS8qIEluaXRpYWwgYygxKSA9IHAoMSkgeG9yIGIoMSkgKi8KKwkJCQkJCQkJCQkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJCQkJCQkJCQkJCWJ1ZltpICsgM10gXj0gaGFzaFtpXTsKKwkJCQkJCQkJCQkJfQorCQkJCQkJCQkJCQlwb3MgPSAxNjsKKwkJCQkJCQkJCQkJCisJCQkJCQkJCQkJCS8qIGxvb3AgKi8KKwkJCQkJCQkJCQkJd2hpbGUgKHBvcyA8IGFoZHItPmF2cF92YWx1ZS0+b3MubGVuICsgMSkgeworCQkJCQkJCQkJCQkJYWRkclswXSA9IHNlY3JldDsKKwkJCQkJCQkJCQkJCWxlblswXSA9IHNlY3JldF9sZW47CisJCQkJCQkJCQkJCQlhZGRyWzFdID0gJmJ1Zltwb3MgLSAxM107CisJCQkJCQkJCQkJCQlsZW5bMV0gPSAxNjsKKwkJCQkJCQkJCQkJCS8qIGIoaSkgPSBNRDUoIFMgKyBjKGktMSkgKi8KKwkJCQkJCQkJCQkJCW1kNV92ZWN0b3IoMiwgYWRkciwgbGVuLCBoYXNoKTsKKwkJCQkJCQkJCQkJCQorCQkJCQkJCQkJCQkJLyogYyhpKSA9IHAoaSkgeG9yIGIoaSkgKi8KKwkJCQkJCQkJCQkJCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCQkJCQkJCQkJCQkJCWJ1Zltwb3MgKyBpICsgM10gXj0gaGFzaFtpXTsKKworCQkJCQkJCQkJCQkJcG9zICs9IDE2OworCQkJCQkJCQkJCQl9CisJCQkJCQkJCQkJCQorCQkJCQkJCQkJCQlDT05WMlJBRF9TVFIoUkFESVVTX0FUVFJfVFVOTkVMX1BBU1NXT1JELCAmYnVmWzBdLCBwb3MgKyAzLCAwKTsKKwkJCQkJCQkJCQl9CisJCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCQkJCisJCQkJCQkJCQljYXNlIERJQU1fQVRUUl9UVU5ORUxfUFJJVkFURV9HUk9VUF9JRDoKKwkJCQkJCQkJCQlDT05WMlJBRF9UVU5fU1RSKFJBRElVU19BVFRSX1RVTk5FTF9QUklWQVRFX0dST1VQX0lELCBhaGRyLT5hdnBfdmFsdWUtPm9zLmRhdGEsIGFoZHItPmF2cF92YWx1ZS0+b3MubGVuLCAxKTsKKwkJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJCQorCQkJCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQkJCQlUUkFDRV9ERUJVRyhGVUxMLCAiSWdub3JlZCB1bmtub3duIEFWUCBpbnNpZGUgVHVubmVsaW5nIEFWUCAoJWQpIiwgYWhkci0+YXZwX2NvZGUpOworCQkJCQkJCQl9CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJVFJBQ0VfREVCVUcoRlVMTCwgIklnbm9yZWQgdW5rbm93biBWZW5kb3IgQVZQIGluc2lkZSBUdW5uZWxpbmcgQVZQICglZCwgJWQpIiwgYWhkci0+YXZwX3ZlbmRvciwgYWhkci0+YXZwX2NvZGUpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQkJCisJCQkJY2FzZSBESUFNX0FUVFJfVVNFUl9OQU1FOgorCQkJCQlDT05WMlJBRF9TVFIoUkFESVVTX0FUVFJfVVNFUl9OQU1FLCBhaGRyLT5hdnBfdmFsdWUtPm9zLmRhdGEsIGFoZHItPmF2cF92YWx1ZS0+b3MubGVuLCAxKTsKKwkJCQkJYnJlYWs7CisJCQkJCisJCQkJLyogVXNlci1QYXNzd29yZCBuZXZlciBwcmVzZW50IGluIGFuc3dlcnMgKi8KKwkJCQkJCisJCS8qIFJGQyA0MDcyIChBVlAgaW4gdGhlIG9yZGVyIG9mIHRoZSBFQVAgQ29tbWFuZCBBVlAgVGFibGUpICovCisJCQkvKgorCQkJICAgICAgbyAgRGlhbWV0ZXIgQWNjb3VudGluZy1FQVAtQXV0aC1NZXRob2QgQVZQcywgaWYgcHJlc2VudCwgYXJlCisJCQkJIGRpc2NhcmRlZC4KKwkJCSovCisJCQkJY2FzZSBESUFNX0FUVFJfQUNDT1VOVElOR19FQVBfQVVUSF9NRVRIT0Q6CisJCQkJCWJyZWFrOworCQkJCQkKKwkJCS8qCisJCQkgICAgICBvICBEaWFtZXRlciBFQVAtTWFzdGVyLVNlc3Npb24tS2V5IEFWUCBjYW4gYmUgdHJhbnNsYXRlZCB0byB0aGUKKwkJCQkgdmVuZG9yLXNwZWNpZmljIFJBRElVUyBNUy1NUFBFLVJlY3YtS2V5IGFuZCBNUy1NUFBFLVNlbmQtS2V5CisJCQkJIGF0dHJpYnV0ZXMgW1JGQzI1NDhdLiAgVGhlIGZpcnN0IHVwIHRvIDMyIG9jdGV0cyBvZiB0aGUga2V5IGlzCisJCQkJIHN0b3JlZCBpbnRvIE1TLU1QUEUtUmVjdi1LZXksIGFuZCB0aGUgbmV4dCB1cCB0byAzMiBvY3RldHMgKGlmCisJCQkJIHByZXNlbnQpIGFyZSBzdG9yZWQgaW50byBNUy1NUFBFLVNlbmQtS2V5LiAgVGhlIGVuY3J5cHRpb24gb2YgdGhpcworCQkJCSBhdHRyaWJ1dGUgaXMgZGVzY3JpYmVkIGluIFtSRkMyNTQ4XS4KKwkJCSovCisJCQkJY2FzZSBESUFNX0FUVFJfRUFQX01BU1RFUl9TRVNTSU9OX0tFWToKKwkJCQkJeworCQkJCQkJdWludDhfdCAqIHNlY3JldDsJLyogUyAqLworCQkJCQkJc2l6ZV90IHNlY3JldF9sZW47CisJCQkJCQlzaXplX3QgcmVjdl9sZW4sIHNlbmRfbGVuOworCisJCQkJCQkvKiBXZSBuZWVkIHRoZSByZXF1ZXN0IGF1dGhlbnRpY2F0b3IgKi8KKwkJCQkJCUNIRUNLX1BBUkFNUyhzdCk7CisKKwkJCQkJCS8qIFJldHJpZXZlIHRoZSBzaGFyZWQgc2VjcmV0ICovCisJCQkJCQlDSEVDS19GQ1Qocmd3X2NsaWVudHNfZ2V0a2V5KGNsaSwgJnNlY3JldCwgJnNlY3JldF9sZW4pKTsKKwkJCQkJCQorCQkJCQkJaWYgKGFoZHItPmF2cF92YWx1ZS0+b3MubGVuICE9IDY0KSB7CisJCQkJCQkJVFJBQ0VfREVCVUcoSU5GTywgIlJlY2VpdmVkIEVBUC1NYXN0ZXItU2Vzc2lvbi1LZXkgYXR0cmlidXRlIHdpdGggbGVuZ3RoICV6ZCAhPSA2NC4iLCBhaGRyLT5hdnBfdmFsdWUtPm9zLmxlbikKKwkJCQkJCX0KKwkJCQkJCQorCQkJCQkJQ0hFQ0tfUEFSQU1TKGFoZHItPmF2cF92YWx1ZS0+b3MubGVuIDw9IDY0KTsKKwkJCQkJCXJlY3ZfbGVuID0gYWhkci0+YXZwX3ZhbHVlLT5vcy5sZW4gPj0gMzIgPyAzMiA6IGFoZHItPmF2cF92YWx1ZS0+b3MubGVuOworCQkJCQkJc2VuZF9sZW4gPSBhaGRyLT5hdnBfdmFsdWUtPm9zLmxlbiAtIHJlY3ZfbGVuOworCQkJCQkJCisJCQkJCQlpZiAoICEgcmFkaXVzX21zZ19hZGRfbXBwZV9rZXlzKCpyYWRfZncsIHN0LT5yZXFfYXV0aCwgc2VjcmV0LCBzZWNyZXRfbGVuLCAKKwkJCQkJCQkJYWhkci0+YXZwX3ZhbHVlLT5vcy5kYXRhICsgcmVjdl9sZW4sIHNlbmRfbGVuLAorCQkJCQkJCQlhaGRyLT5hdnBfdmFsdWUtPm9zLmRhdGEsIHJlY3ZfbGVuKSApIHsKKwkJCQkJCQlUUkFDRV9ERUJVRyhJTkZPLCAiRXJyb3Igd2hpbGUgY29udmVydGluZyBFQVAtTWFzdGVyLVNlc3Npb24tS2V5IHRvIFJBRElVUyBtZXNzYWdlIik7CisJCQkJCQkJcmV0dXJuIEVOT01FTTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQkKKwkJCQljYXNlIERJQU1fQVRUUl9FQVBfS0VZX05BTUU6CisJCQkJCUNPTlYyUkFEX1NUUihSQURJVVNfQVRUUl9FQVBfS0VZX05BTUUsIGFoZHItPmF2cF92YWx1ZS0+b3MuZGF0YSwgYWhkci0+YXZwX3ZhbHVlLT5vcy5sZW4sIDEpOworCQkJCQlicmVhazsKKwkJCQkKKwkJCS8qCisJCQkgICAgICBvICBEaWFtZXRlciBFQVAtUGF5bG9hZCBBVlAgaXMgdHJhbnNsYXRlZCB0byBSQURJVVMgRUFQLU1lc3NhZ2UKKwkJCQkgYXR0cmlidXRlKHMpLiAgSWYgbmVjZXNzYXJ5LCB0aGUgdmFsdWUgaXMgc3BsaXQgaW50byBtdWx0aXBsZQorCQkJCSBSQURJVVMgRUFQLU1lc3NhZ2UgYXR0cmlidXRlcy4KKwkJCSovCisJCQkJY2FzZSBESUFNX0FUVFJfRUFQX1BBWUxPQUQ6CisJCQkJCWlmICggISByYWRpdXNfbXNnX2FkZF9lYXAoKnJhZF9mdywgYWhkci0+YXZwX3ZhbHVlLT5vcy5kYXRhLCBhaGRyLT5hdnBfdmFsdWUtPm9zLmxlbikgKSB7CisJCQkJCQlUUkFDRV9ERUJVRyhJTkZPLCAiRXJyb3Igd2hpbGUgY29udmVydGluZyBFQVAgcGF5bG9hZCB0byBSQURJVVMgbWVzc2FnZSIpOworCQkJCQkJcmV0dXJuIEVOT01FTTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQkJCisJCQkvKgorCQkJICAgICAgbyAgRGlhbWV0ZXIgRUFQLVJlaXNzdWVkLVBheWxvYWQgQVZQIGlzIHRyYW5zbGF0ZWQgdG8gYSBtZXNzYWdlIHRoYXQKKwkJCQkgY29udGFpbnMgUkFESVVTIEVBUC1NZXNzYWdlIGF0dHJpYnV0ZShzKSwgYW5kIGEgUkFESVVTIEVycm9yLUNhdXNlCisJCQkJIGF0dHJpYnV0ZSBbUkZDMzU3Nl0gd2l0aCB2YWx1ZSAyMDIgKGRlY2ltYWwpLCAiSW52YWxpZCBFQVAgUGFja2V0CisJCQkJIChJZ25vcmVkKSIgW1JGQzM1NzldLgorCQkJKi8KKwkJCQljYXNlIERJQU1fQVRUUl9FQVBfUkVJU1NVRURfUEFZTE9BRDoKKwkJCQkJaWYgKCAhIHJhZGl1c19tc2dfYWRkX2VhcCgqcmFkX2Z3LCBhaGRyLT5hdnBfdmFsdWUtPm9zLmRhdGEsIGFoZHItPmF2cF92YWx1ZS0+b3MubGVuKSApIHsKKwkJCQkJCVRSQUNFX0RFQlVHKElORk8sICJFcnJvciB3aGlsZSBjb252ZXJ0aW5nIEVBUCByZWlzc3VlZCBwYXlsb2FkIHRvIFJBRElVUyBtZXNzYWdlIik7CisJCQkJCQlyZXR1cm4gRU5PTUVNOworCQkJCQl9CisJCQkJCQorCQkJCQllcnJvcl9jYXVzZSA9IDIwMjsgLyogSW52YWxpZCBFQVAgUGFja2V0ICovCisJCQkJCWJyZWFrOworCQkJCisJCQkJZGVmYXVsdDoKKwkJCQkJLyogTGVhdmUgdGhlIEFWUCBpbiB0aGUgbWVzc2FnZSBmb3IgZnVydGhlciB0cmVhdG1lbnQgKi8KKwkJCQkJaGFuZGxlZCA9IDA7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBWZW5kb3Itc3BlY2lmaWMgQVZQcyAqLworCQkJc3dpdGNoIChhaGRyLT5hdnBfdmVuZG9yKSB7CisJCQkJCisJCQkJZGVmYXVsdDogLyogdW5rbm93biB2ZW5kb3IgKi8KKwkJCQkJaGFuZGxlZCA9IDA7CisJCQl9CisJCX0KKwkJCisJCWlmIChoYW5kbGVkKSB7CisJCQlDSEVDS19GQ1QoIGZkX21zZ19mcmVlKCBhdnAgKSApOworCQl9CisJfQorCQorCUNIRUNLX0ZDVCggZmRfbXNnX2ZyZWUoIGFvaCApICk7CisJZnJlZShzdCk7CisJCisJaWYgKGVycm9yX2NhdXNlKSB7CisJCWlmICggISByYWRpdXNfbXNnX2FkZF9hdHRyX2ludDMyKCpyYWRfZncsIFJBRElVU19BVFRSX0VSUk9SX0NBVVNFLCBlcnJvcl9jYXVzZSkgKSB7CisJCQlUUkFDRV9ERUJVRyhJTkZPLCAiRXJyb3Igd2hpbGUgYWRkaW5nIEVycm9yLUNhdXNlIGF0dHJpYnV0ZSBpbiBSQURJVVMgbWVzc2FnZSIpOworCQkJcmV0dXJuIEVOT01FTTsKKwkJfQorCX0KKworCWlmICgoKnJhZF9mdyktPmhkci0+Y29kZSA9PSBSQURJVVNfQ09ERV9BQ0NFU1NfQUNDRVBUKSB7CisJCS8qIEFkZCB0aGUgYXV0aC1hcHBsaWNhdGlvbi1pZCByZXF1aXJlZCBmb3IgU1RSLCBvciAwIGlmIG5vIFNUUiBpcyByZXF1aXJlZCAqLworCQlDSEVDS19GQ1QoIGZkX21zZ19oZHIoICpkaWFtX2FucywgJmhkciApICk7CisJCWlmIChzaXplb2YoYnVmKSA8IChzeiA9IHNucHJpbnRmKChjaGFyICopYnVmLCBzaXplb2YoYnVmKSwgQ0xBU1NfQUFJX1BSRUZJWCAiJXUiLCAKKwkJCQlub19zdHIgPyAwIDogaGRyLT5tc2dfYXBwbCkpKSB7CisJCQlUUkFDRV9ERUJVRyhJTkZPLCAiRGF0YSB0cnVuY2F0ZWQgaW4gQ2xhc3MgYXR0cmlidXRlOiAlcyIsIGJ1Zik7CisJCX0KKwkJQ09OVjJSQURfU1RSKFJBRElVU19BVFRSX0NMQVNTLCBidWYsIHN6LCAwKTsKKwl9CisJCisJcmV0dXJuIDA7Cit9CisKKy8qIFRoZSBleHBvcnRlZCBzeW1ib2wgKi8KK3N0cnVjdCByZ3dfYXBpIHJnd3BfZGVzY3JpcHRvciA9IHsKKwkucmd3cF9uYW1lICAgICAgID0gImF1dGgiLAorCS5yZ3dwX2NvbmZfcGFyc2UgPSBhdXRoX2NvbmZfcGFyc2UsCisJLnJnd3BfY29uZl9mcmVlICA9IGF1dGhfY29uZl9mcmVlLAorCS5yZ3dwX3JhZF9yZXEgICAgPSBhdXRoX3JhZF9yZXEsCisJLnJnd3BfZGlhbV9hbnMgICA9IGF1dGhfZGlhbV9hbnMKK307CQpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9hcHBfcmFkZ3cvcmd3eF9kZWJ1Zy5jIGIvZXh0ZW5zaW9ucy9hcHBfcmFkZ3cvcmd3eF9kZWJ1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MmIwMjgKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2FwcF9yYWRndy9yZ3d4X2RlYnVnLmMKQEAgLTAsMCArMSwxNDMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDEzLCBXSURFIFByb2plY3QgYW5kIE5JQ1QJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFdJREUgUHJvamVjdCBvciBOSUNUIG5vciB0aGUgCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgV0lERSBQcm9qZWN0IGFuZCAJCQkJCQkgKgorKiAgIE5JQ1QuCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRGVidWcgcGx1Z2luIGZvciBhcHBfcmFkZ3cgKi8KKworI2luY2x1ZGUgInJnd19jb21tb24uaCIKKworLyogU3RvcmUgdGhlIGNvbmZpZ3VyYXRpb24gc3RyaW5nIGluIHRoZSBzdGF0ZSAqLworc3RhdGljIGludCBkZWJ1Z19jb25mX3BhcnNlICggY2hhciAqIGNvbmZfZmlsZSwgc3RydWN0IHJnd3BfY29uZmlnICoqIHN0YXRlICkKK3sKKwlUUkFDRV9FTlRSWSgiJXAgJXAiLCBjb25mX2ZpbGUsIHN0YXRlKTsKKwlDSEVDS19QQVJBTVMoc3RhdGUpOworCQorCSpzdGF0ZSA9ICh2b2lkICopY29uZl9maWxlOworCQorCXJldHVybiAwOworfQorCisKKy8qIEZ1bmN0aW9uIHRvIGRpc3BsYXkgdGhlIGNvbnRlbnQgb2YgYSBSQURJVVMgbWVzc2FnZSAobW9yZSBmcmllbmRseSB3YXkgdGhhbiByYWRpdXNfbXNnX2R1bXApICovCitzdGF0aWMgdm9pZCBkZWJ1Z19kdW1wX3JhZGl1cyhzdHJ1Y3QgcmFkaXVzX21zZyAqbXNnKQoreworCXVuc2lnbmVkIGNoYXIgKmF1dGg7CisJc2l6ZV90IGk7CisJCisJYXV0aCA9ICAmKG1zZy0+aGRyLT5hdXRoZW50aWNhdG9yWzBdKTsKKwlmZF9sb2dfZGVidWcoIiBpZCAgOiAweCUwMmhoeCwgY29kZTogJWhoZCAoJXMpIiwgbXNnLT5oZHItPmlkZW50aWZpZXIsIG1zZy0+aGRyLT5jb2RlLCByZ3dfbXNnX2NvZGVfc3RyKG1zZy0+aGRyLT5jb2RlKSk7CisJZmRfbG9nX2RlYnVnKCIgYXV0aDogJTAyaGh4ICUwMmhoeCAlMDJoaHggJTAyaGh4ICAlMDJoaHggJTAyaGh4ICUwMmhoeCAlMDJoaHgiLAorCQkJYXV0aFswXSwgYXV0aFsxXSwgYXV0aFsyXSwgYXV0aFszXSwgCisJCQlhdXRoWzRdLCBhdXRoWzVdLCBhdXRoWzZdLCBhdXRoWzddKTsKKwlmZF9sb2dfZGVidWcoIiAgICAgICAlMDJoaHggJTAyaGh4ICUwMmhoeCAlMDJoaHggICUwMmhoeCAlMDJoaHggJTAyaGh4ICUwMmhoeCIsCisJCQlhdXRoWzhdLCAgYXV0aFs5XSwgIGF1dGhbMTBdLCBhdXRoWzExXSwgCisJCQlhdXRoWzEyXSwgYXV0aFsxM10sIGF1dGhbMTRdLCBhdXRoWzE1XSk7CisJZm9yIChpID0gMDsgaSA8IG1zZy0+YXR0cl91c2VkOyBpKyspIHsKKwkJc3RydWN0IHJhZGl1c19hdHRyX2hkciAqYXR0ciA9IChzdHJ1Y3QgcmFkaXVzX2F0dHJfaGRyICopKG1zZy0+YnVmICsgbXNnLT5hdHRyX3Bvc1tpXSk7CisJCWZkX2xvZ19kZWJ1ZygiICAtIGxlbjolM2hodSwgdHlwZToweCUwMmhoeCAoJXMpIiwgYXR0ci0+bGVuZ3RoLCBhdHRyLT50eXBlLCByZ3dfbXNnX2F0dHJ0eXBlX3N0cihhdHRyLT50eXBlKSk7CisJCS8qIElmIHdlIG5lZWQgdG8gZHVtcCB0aGUgdmFsdWUsIGl0J3MgYmV0dGVyIHRvIGNhbGwgZGlyZWN0bHkgcmFkaXVzX21zZ19kdW1wIGluc3RlYWQuLi4gKi8KKwl9Cit9CisKKy8qIEZ1bmN0aW9uIGNhbGxlZCB3aGVuIGEgbmV3IFJBRElVUyBtZXNzYWdlIGlzIGJlaW5nIGNvbnZlcnRlZCB0byBEaWFtZXRlciAqLworc3RhdGljIGludCBkZWJ1Z19yYWRfcmVxKCBzdHJ1Y3Qgcmd3cF9jb25maWcgKiBjcywgc3RydWN0IHJhZGl1c19tc2cgKiByYWRfcmVxLCBzdHJ1Y3QgcmFkaXVzX21zZyAqKiByYWRfYW5zLCBzdHJ1Y3QgbXNnICoqIGRpYW1fZncsIHN0cnVjdCByZ3dfY2xpZW50ICogY2xpICkKK3sKKwlUUkFDRV9FTlRSWSgiJXAgJXAgJXAgJXAgJXAiLCBjcywgcmFkX3JlcSwgcmFkX2FucywgZGlhbV9mdywgY2xpKTsKKwkKKwlmZF9sb2dfZGVidWcoIi0tLS0tLS0tLS0tLS0gUkFESVVTL0RpYW1ldGVyIFJlcXVlc3QgRGVidWclcyVzJXMgLS0tLS0tLS0tLS0tLSIsIGNzID8gIiBbIiA6ICIiLCBjcyA/IChjaGFyICopY3MgOiAiIiwgY3MgPyAiXSIgOiAiIik7CisJCisJaWYgKCFyYWRfcmVxKSB7CisJCWZkX2xvZ19kZWJ1ZygiIFJBRElVUyByZXF1ZXN0OiBOVUxMIHBvaW50ZXIiKTsKKwl9IGVsc2UgeworCQlmZF9sb2dfZGVidWcoIiBSQURJVVMgcmVxdWVzdCAoJXApIERVTVA6IiwgcmFkX3JlcSk7CisJCWRlYnVnX2R1bXBfcmFkaXVzKHJhZF9yZXEpOworCX0KKwkKKwlpZiAoIXJhZF9hbnMgfHwgISAqcmFkX2FucykgeworCQlmZF9sb2dfZGVidWcoIiBSQURJVVMgYW5zd2VyOiBOVUxMIHBvaW50ZXIiKTsKKwl9IGVsc2UgeworCQlmZF9sb2dfZGVidWcoIiBSQURJVVMgYW5zd2VyICglcCkgRFVNUDoiLCAqcmFkX2Fucyk7CisJCWRlYnVnX2R1bXBfcmFkaXVzKCpyYWRfYW5zKTsKKwl9CisJCisJaWYgKCFkaWFtX2Z3IHx8ICEgKmRpYW1fZncpIHsKKwkJZmRfbG9nX2RlYnVnKCIgRGlhbWV0ZXIgbWVzc2FnZTogTlVMTCBwb2ludGVyIik7CisJfSBlbHNlIHsKKwkJY2hhciAqIGJ1ZiA9IE5VTEw7IHNpemVfdCBidWZsZW47CisJCUNIRUNLX01BTExPQyggZmRfbXNnX2R1bXBfdHJlZXZpZXcoJmJ1ZiwgJmJ1ZmxlbiwgTlVMTCwgKmRpYW1fZncsIE5VTEwsIDAsIDEpICk7CisJCWZkX2xvZ19kZWJ1ZygiIERpYW1ldGVyIG1lc3NhZ2UgKCVwKSBEVU1QOiAlcyIsICpkaWFtX2Z3LCBidWYpOworCQlmcmVlKGJ1Zik7CisJfQorCQorCWZkX2xvZ19kZWJ1ZygiPT09PT09PT09PT0gIERlYnVnJXMlcyVzIGNvbXBsZXRlID09PT09PT09PT09PT0iLCBjcyA/ICIgWyIgOiAiIiwgY3MgPyAoY2hhciAqKWNzIDogIiIsIGNzID8gIl0iIDogIiIpOworCQorCXJldHVybiAwOworfQorCisvKiBUaGlzIG9uZSwgd2hlbiBEaWFtZXRlciBhbnN3ZXIgaXMgY29udmVydGVkIHRvIFJBRElVUyAqLworc3RhdGljIGludCBkZWJ1Z19kaWFtX2Fucyggc3RydWN0IHJnd3BfY29uZmlnICogY3MsIHN0cnVjdCBtc2cgKiogZGlhbV9hbnMsIHN0cnVjdCByYWRpdXNfbXNnICoqIHJhZF9mdywgc3RydWN0IHJnd19jbGllbnQgKiBjbGkgKQoreworCVRSQUNFX0VOVFJZKCIlcCAlcCAlcCAlcCIsIGNzLCBkaWFtX2FucywgcmFkX2Z3LCBjbGkpOworCisJZmRfbG9nX2RlYnVnKCItLS0tLS0tLS0tLS0tIFJBRElVUy9EaWFtZXRlciBBbnN3ZXIgRGVidWclcyVzJXMgLS0tLS0tLS0tLS0tLSIsIGNzID8gIiBbIiA6ICIiLCBjcyA/IChjaGFyICopY3MgOiAiIiwgY3MgPyAiXSIgOiAiIik7CisJCisJaWYgKCFkaWFtX2FucyB8fCAhICpkaWFtX2FucykgeworCQlmZF9sb2dfZGVidWcoIiBEaWFtZXRlciBtZXNzYWdlOiBOVUxMIHBvaW50ZXIiKTsKKwl9IGVsc2UgeworCQljaGFyICogYnVmID0gTlVMTDsgc2l6ZV90IGJ1ZmxlbjsKKwkJQ0hFQ0tfTUFMTE9DKCBmZF9tc2dfZHVtcF90cmVldmlldygmYnVmLCAmYnVmbGVuLCBOVUxMLCAqZGlhbV9hbnMsIE5VTEwsIDAsIDEpICk7CisJCWZkX2xvZ19kZWJ1ZygiIERpYW1ldGVyIG1lc3NhZ2UgKCVwKSBEVU1QOiAlcyIsICpkaWFtX2FucywgYnVmKTsKKwkJZnJlZShidWYpOworCX0KKwkKKwlpZiAoIXJhZF9mdyB8fCAhICpyYWRfZncpIHsKKwkJZmRfbG9nX2RlYnVnKCIgUkFESVVTIGFuc3dlcjogTlVMTCBwb2ludGVyIik7CisJfSBlbHNlIHsKKwkJZmRfbG9nX2RlYnVnKCIgUkFESVVTIGFuc3dlciAoJXApIERVTVA6IiwgKnJhZF9mdyk7CisJCWRlYnVnX2R1bXBfcmFkaXVzKCpyYWRfZncpOworCX0KKwkKKwlmZF9sb2dfZGVidWcoIj09PT09PT09PT09ICBEZWJ1ZyVzJXMlcyBjb21wbGV0ZSA9PT09PT09PT09PT09IiwgY3MgPyAiIFsiIDogIiIsIGNzID8gKGNoYXIgKiljcyA6ICIiLCBjcyA/ICJdIiA6ICIiKTsKKwlyZXR1cm4gMDsKK30KKworCisvKiBUaGUgZXhwb3J0ZWQgc3ltYm9sICovCitzdHJ1Y3Qgcmd3X2FwaSByZ3dwX2Rlc2NyaXB0b3IgPSB7CisJLnJnd3BfbmFtZSAgICAgICA9ICJkZWJ1ZyIsCisJLnJnd3BfY29uZl9wYXJzZSA9IGRlYnVnX2NvbmZfcGFyc2UsCisJLnJnd3BfY29uZl9mcmVlICA9IE5VTEwsCisJLnJnd3BfcmFkX3JlcSAgICA9IGRlYnVnX3JhZF9yZXEsCisJLnJnd3BfZGlhbV9hbnMgICA9IGRlYnVnX2RpYW1fYW5zCit9OwkKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvYXBwX3JhZGd3L3Jnd3hfZWNob2Ryb3AuYyBiL2V4dGVuc2lvbnMvYXBwX3JhZGd3L3Jnd3hfZWNob2Ryb3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGY0MzMzCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9hcHBfcmFkZ3cvcmd3eF9lY2hvZHJvcC5jCkBAIC0wLDAgKzEsMzA5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxMywgV0lERSBQcm9qZWN0IGFuZCBOSUNUCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBXSURFIFByb2plY3Qgb3IgTklDVCBub3IgdGhlIAkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFdJREUgUHJvamVjdCBhbmQgCQkJCQkJICoKKyogICBOSUNULgkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFNlZSByZ3d4X2VjaG9kcm9wLmggZm9yIGRldGFpbHMgKi8KKworI2luY2x1ZGUgInJnd3hfZWNob2Ryb3AuaCIKKworc3RydWN0IHNlc3Nfc3RhdGUgeworCXN0cnVjdCBmZF9saXN0IHNlbnRpbmVsOworfTsKKworLyogSWYgYSBzZXNzaW9uIGlzIGRlc3Ryb3llZCwgZW1wdHkgdGhlIGxpc3Qgb2YgZWRfc2F2ZWRfYXR0cmlidXRlICovCitzdGF0aWMgdm9pZCBzdGF0ZV9kZWxldGUoc3RydWN0IHNlc3Nfc3RhdGUgKiBhcmcsIG9zMF90IHNpZCwgdm9pZCAqIG9wYXF1ZSkgeworCXdoaWxlICghRkRfSVNfTElTVF9FTVBUWSgmYXJnLT5zZW50aW5lbCkpIHsKKwkJc3RydWN0IGVkX3NhdmVkX2F0dHJpYnV0ZSAqIGVzYSA9IChzdHJ1Y3QgZWRfc2F2ZWRfYXR0cmlidXRlICopKGFyZy0+c2VudGluZWwubmV4dCk7CisJCWZkX2xpc3RfdW5saW5rKCZlc2EtPmNoYWluKTsKKwkJZnJlZShlc2EpOworCX0KKwlmcmVlKGFyZyk7Cit9CisKK3N0YXRpYyBERUNMQVJFX0ZEX0RVTVBfUFJPVE9UWVBFKGVkX3Nlc3Npb25fc3RhdGVfZHVtcCwgc3RydWN0IHNlc3Nfc3RhdGUgKiBzdCkKK3sKKwlzdHJ1Y3QgZmRfbGlzdCAqIGxpOworCUNIRUNLX01BTExPQ19ETyggZmRfZHVtcF9leHRlbmQoIEZEX0RVTVBfU1REX1BBUkFNUywgIltyZ3d4IHNlc3Nfc3RhdGVdKEAlcCk6XG4iLCBzdCksIHJldHVybiBOVUxMKTsJCisJZm9yIChsaSA9IHN0LT5zZW50aW5lbC5uZXh0OyBsaSAhPSAmc3QtPnNlbnRpbmVsOyBsaSA9IGxpLT5uZXh0KSB7CisJCXN0cnVjdCBlZF9zYXZlZF9hdHRyaWJ1dGUgKiBlc2EgPSAoc3RydWN0IGVkX3NhdmVkX2F0dHJpYnV0ZSAqKShsaSk7CisJCUNIRUNLX01BTExPQ19ETyggZmRfZHVtcF9leHRlbmQoIEZEX0RVTVBfU1REX1BBUkFNUywgIltyZ3d4IHNlc3Nfc3RhdGUge2VzYX1dIHQ6JTJoaHggbDolMmhoeCBkOiIsIGVzYS0+YXR0ci50eXBlLCBlc2EtPmF0dHIubGVuZ3RoKSwgcmV0dXJuIE5VTEwpOworCQlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kX2hleGR1bXAoRkRfRFVNUF9TVERfUEFSQU1TLCAoJmVzYS0+YXR0ci5sZW5ndGgpICsgMSwgZXNhLT5hdHRyLmxlbmd0aCAtIDIsIDAsMCksIHJldHVybiBOVUxMKTsKKwkJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9kdW1wX2V4dGVuZCggRkRfRFVNUF9TVERfUEFSQU1TLCAiXG4iKSwgcmV0dXJuIE5VTEwpOworCX0KKwlyZXR1cm4gKmJ1ZjsKK30KKworLyogSW5pdGlhbGl6ZSB0aGUgcGx1Z2luIGFuZCBwYXJzZSB0aGUgY29uZmlndXJhdGlvbi4gKi8KK3N0YXRpYyBpbnQgZWRfY29uZl9wYXJzZShjaGFyICogY29uZmZpbGUsIHN0cnVjdCByZ3dwX2NvbmZpZyAqKiBzdGF0ZSkKK3sKKwlzdHJ1Y3Qgcmd3cF9jb25maWcgKiBuZXc7CisJCisJVFJBQ0VfRU5UUlkoIiVwICVwIiwgY29uZmZpbGUsIHN0YXRlKTsKKwlDSEVDS19QQVJBTVMoIHN0YXRlICk7CisJQ0hFQ0tfUEFSQU1TX0RPKCBjb25mZmlsZSwgeyBmZF9sb2dfZGVidWcoIltlY2hvZHJvcC5yZ3d4XSBUaGUgY29uZmlndXJhdGlvbiBmaWxlIGlzIG5vdCBvcHRpb25hbCBmb3IgdGhpcyBwbHVnaW4uIik7IHJldHVybiBFSU5WQUw7IH0gKTsKKwkKKwlDSEVDS19NQUxMT0MoIG5ldyA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHJnd3BfY29uZmlnKSkgKTsKKwltZW1zZXQobmV3LCAwLCBzaXplb2Yoc3RydWN0IHJnd3BfY29uZmlnKSk7CisJCisJLyogSW5pdGlhbGl6ZSB0aGUgbGlzdCBvZiBhdHRyaWJ1dGVzIHRvIGhhbmRsZSAqLworCWZkX2xpc3RfaW5pdCgmbmV3LT5hdHRyaWJ1dGVzLCBOVUxMKTsKKwkKKwkvKiBDcmVhdGUgdGhlIHNlc3Npb24gaGFuZGxlciAqLworCUNIRUNLX0ZDVCggZmRfc2Vzc19oYW5kbGVyX2NyZWF0ZSggJm5ldy0+c2Vzc19oZGwsIHN0YXRlX2RlbGV0ZSwgZWRfc2Vzc2lvbl9zdGF0ZV9kdW1wLCBOVUxMICkgKTsKKwkKKwkvKiBQYXJzZSB0aGUgY29uZmlndXJhdGlvbiBmaWxlICovCisJQ0hFQ0tfRkNUKCBlZF9jb25mZmlsZV9wYXJzZShjb25mZmlsZSwgbmV3KSApOworCQorCWlmIChUUkFDRV9CT09MKEZVTEwpKSB7CisJCVRSQUNFX0RFQlVHKElORk8sICJFY2hvL0Ryb3AgcGx1Z2luIGNvbmZpZ3VyYXRpb24gKCclcycpOiIsIGNvbmZmaWxlKTsKKwkJc3RydWN0IGZkX2xpc3QgKiBsaTsKKwkJCisJCWZvciAobGkgPSBuZXctPmF0dHJpYnV0ZXMubmV4dDsgbGkgIT0gJm5ldy0+YXR0cmlidXRlczsgbGkgPSBsaS0+bmV4dCkgeworCQkJc3RydWN0IGVkX2NvbmZfYXR0cmlidXRlICogZWNhID0gKHN0cnVjdCBlZF9jb25mX2F0dHJpYnV0ZSAqKWxpOworCQkJY2hhciAqIGFjdCA9IChlY2EtPmFjdGlvbiA9PSBBQ1RfRUNITykgPyAiRUNITyIgOiAiRFJPUCI7CisJCQlpZiAoZWNhLT5leHQpIHsKKwkJCQlmZF9sb2dfZGVidWcoIiAgJXMgQ29kZTogJWhodSwgVmVuZG9yOiAldSwgRXh0LVR5cGU6ICVodSIsIGFjdCwgZWNhLT5jb2RlLCBlY2EtPnZlbmRvcl9pZCwgZWNhLT5leHR5cGUpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKGVjYS0+dGx2KSB7CisJCQkJZmRfbG9nX2RlYnVnKCIgICVzIENvZGU6ICVoaHUsIFZlbmRvcjogJXUsIFR5cGU6ICVoaHUiLCBhY3QsIGVjYS0+Y29kZSwgZWNhLT52ZW5kb3JfaWQsIGVjYS0+dHlwZSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoZWNhLT52c2EpIHsKKwkJCQlmZF9sb2dfZGVidWcoIiAgJXMgQ29kZTogJWhodSwgVmVuZG9yOiAldSIsIGFjdCwgZWNhLT5jb2RlLCBlY2EtPnZlbmRvcl9pZCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlmZF9sb2dfZGVidWcoIiAgJXMgQ29kZTogJWhodSIsIGFjdCwgZWNhLT5jb2RlKTsKKwkJfQorCX0KKwkKKwkvKiBPSywgd2UgYXJlIGRvbmUgKi8KKwkqc3RhdGUgPSBuZXc7CisJcmV0dXJuIDA7Cit9CisKKy8qIERlc3Ryb3kgdGhlIHN0YXRlICovCitzdGF0aWMgdm9pZCBlZF9jb25mX2ZyZWUoc3RydWN0IHJnd3BfY29uZmlnICogc3RhdGUpCit7CisJVFJBQ0VfRU5UUlkoIiVwIiwgc3RhdGUpOworCUNIRUNLX1BBUkFNU19ETyggc3RhdGUsIHJldHVybiApOworCUNIRUNLX0ZDVF9ETyggZmRfc2Vzc19oYW5kbGVyX2Rlc3Ryb3koICZzdGF0ZS0+c2Vzc19oZGwsIE5VTEwgKSwgICk7CisJd2hpbGUgKCEgRkRfSVNfTElTVF9FTVBUWSgmc3RhdGUtPmF0dHJpYnV0ZXMpICkgeworCQlzdHJ1Y3QgZmRfbGlzdCAqIGxpID0gc3RhdGUtPmF0dHJpYnV0ZXMubmV4dDsKKwkJZmRfbGlzdF91bmxpbmsobGkpOworCQlmcmVlKGxpKTsKKwl9CisJZnJlZShzdGF0ZSk7CisJcmV0dXJuOworfQorCisKKy8qIEhhbmRsZSBhdHRyaWJ1dGVzIGZyb20gYSBSQURJVVMgcmVxdWVzdCBhcyBzcGVjaWZpZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gKi8KK3N0YXRpYyBpbnQgZWRfcmFkX3JlcSggc3RydWN0IHJnd3BfY29uZmlnICogY3MsIHN0cnVjdCByYWRpdXNfbXNnICogcmFkX3JlcSwgc3RydWN0IHJhZGl1c19tc2cgKiogcmFkX2Fucywgc3RydWN0IG1zZyAqKiBkaWFtX2Z3LCBzdHJ1Y3Qgcmd3X2NsaWVudCAqIGNsaSApCit7CisJc2l6ZV90IG5hdHRyX3VzZWQgPSAwOworCWludCBpZHg7CisJc3RydWN0IGZkX2xpc3QgZWNob19saXN0ID0gRkRfTElTVF9JTklUSUFMSVpFUihlY2hvX2xpc3QpOworCXN0cnVjdCBmZF9saXN0ICpsaTsKKwkKKwlUUkFDRV9FTlRSWSgiJXAgJXAgJXAgJXAgJXAiLCBjcywgcmFkX3JlcSwgcmFkX2FucywgZGlhbV9mdywgY2xpKTsKKwlDSEVDS19QQVJBTVMoY3MgJiYgcmFkX3JlcSk7CisJCisJLyogRm9yIGVhY2ggYXR0cmlidXRlIGluIHRoZSBvcmlnaW5hbCBtZXNzYWdlICovCisJZm9yIChpZHggPSAwOyBpZHggPCByYWRfcmVxLT5hdHRyX3VzZWQ7IGlkeCsrKSB7CisJCWludCBhY3Rpb24gPSAwOworCQlzdHJ1Y3QgcmFkaXVzX2F0dHJfaGRyICogYXR0ciA9IChzdHJ1Y3QgcmFkaXVzX2F0dHJfaGRyICopKHJhZF9yZXEtPmJ1ZiArIHJhZF9yZXEtPmF0dHJfcG9zW2lkeF0pOworCQkKKwkJLyogTG9vayBpZiB3ZSBoYXZlIGEgbWF0Y2hpbmcgYXR0cmlidXRlIGluIG91ciBjb25maWd1cmF0aW9uICovCisJCWZvciAobGkgPSBjcy0+YXR0cmlidXRlcy5uZXh0OyBsaSAhPSAmY3MtPmF0dHJpYnV0ZXM7IGxpID0gbGktPm5leHQpIHsKKwkJCXN0cnVjdCBlZF9jb25mX2F0dHJpYnV0ZSAqIGVjYSA9IChzdHJ1Y3QgZWRfY29uZl9hdHRyaWJ1dGUgKilsaTsKKwkJCXVpbnQzMl90IHZpZDsKKwkJCXVuc2lnbmVkIGNoYXIgKiBwdHI7CisJCQkKKwkJCWlmIChlY2EtPmNvZGUgPCBhdHRyLT50eXBlKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGVjYS0+Y29kZSA+IGF0dHItPnR5cGUpCisJCQkJYnJlYWs7CisJCQkKKwkJCS8qIHRoZSBjb2RlIG1hdGNoZXMgb25lIGluIG91ciBjb25maWd1cmF0aW9uLCBjaGVjayBhZGRpdGlvbmFsIGRhdGEgaWYgbmVlZGVkICovCisJCQkKKwkJCWlmICghIGVjYS0+dnNhKSB7CisJCQkJYWN0aW9uID0gZWNhLT5hY3Rpb247CisJCQkJYnJlYWs7CisJCQl9CisJCQkKKwkJCWlmIChhdHRyLT5sZW5ndGggPCA4KQorCQkJCWNvbnRpbnVlOworCQkJCisJCQlwdHIgPSAodW5zaWduZWQgY2hhciAqKShhdHRyICsgMSk7CisJCQkvKiBzaW5jZSBhdHRyIGlzIG5vdCBhbGlnbmVkLCB3ZSBtYXkgbm90IGFjY2VzcyAqKGF0dHIrMSkgZGlyZWN0bHkgKi8KKwkJCW1lbWNweSgmdmlkLCBwdHIsIHNpemVvZih1aW50MzJfdCkpOworCQkJCisJCQlpZiAoZWNhLT52ZW5kb3JfaWQgPCBudG9obCh2aWQpKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGVjYS0+dmVuZG9yX2lkID4gbnRvaGwodmlkKSkKKwkJCQlicmVhazsKKwkJCQorCQkJLyogVGhlIHZlbmRvciBtYXRjaGVzIG91ciBjb25maWd1cmVkIGxpbmUuLi4gKi8KKwkJCQorCQkJaWYgKCAhIGVjYS0+dGx2ICYmICEgZWNhLT5leHQgKSB7CisJCQkJYWN0aW9uID0gZWNhLT5hY3Rpb247CisJCQkJYnJlYWs7CisJCQl9CisJCQkKKwkJCWlmIChhdHRyLT5sZW5ndGggPCAxMCkKKwkJCQljb250aW51ZTsKKwkJCQorCQkJaWYgKGVjYS0+dGx2KSB7CisJCQkJc3RydWN0IHJhZGl1c19hdHRyX3ZlbmRvciAqIHRsID0gKHN0cnVjdCByYWRpdXNfYXR0cl92ZW5kb3IgKikocHRyICsgc2l6ZW9mKHVpbnQzMl90KSk7CisJCQkJaWYgKHRsLT52ZW5kb3JfdHlwZSA9PSBlY2EtPnR5cGUpIHsKKwkJCQkJYWN0aW9uID0gZWNhLT5hY3Rpb247CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCQorCQkJaWYgKGVjYS0+ZXh0KSB7CisJCQkJLyogVG8gYmUgZG9uZSAqLworCQkJCWZkX2xvZ19kZWJ1ZygiRXh0ZW5kZWQgYXR0cmlidXRlcyBhcmUgbm90IGltcGxlbWVudGVkIHlldCEiKTsKKwkJCQlBU1NFUlQoMCk7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwkJCisJCXN3aXRjaCAoYWN0aW9uKSB7CisJCQljYXNlIEFDVF9EUk9QOgorCQkJCVRSQUNFX0RFQlVHKEZVTEwsICJEcm9wcGluZyBhdHRyaWJ1dGUgd2l0aCBjb2RlICVoaGQiLCBhdHRyLT50eXBlKTsKKwkJCQlicmVhazsKKwkJCQkKKwkJCWNhc2UgQUNUX0VDSE86CisJCQkJeworCQkJCQlzdHJ1Y3QgZWRfc2F2ZWRfYXR0cmlidXRlICogZXNhID0gTlVMTDsKKwkJCQkJVFJBQ0VfREVCVUcoRlVMTCwgIlNhdmluZyBhdHRyaWJ1dGUgd2l0aCBjb2RlICVoaGQiLCBhdHRyLT50eXBlKTsKKwkJCQkJQ0hFQ0tfTUFMTE9DKCBlc2EgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBlZF9zYXZlZF9hdHRyaWJ1dGUpICsgYXR0ci0+bGVuZ3RoIC0gc2l6ZW9mKHN0cnVjdCByYWRpdXNfYXR0cl9oZHIpKSApOworCQkJCQlmZF9saXN0X2luaXQoJmVzYS0+Y2hhaW4sIE5VTEwpOworCQkJCQltZW1jcHkoJmVzYS0+YXR0ciwgYXR0ciwgYXR0ci0+bGVuZ3RoKTsKKwkJCQkJZmRfbGlzdF9pbnNlcnRfYmVmb3JlKCZlY2hvX2xpc3QsICZlc2EtPmNoYWluKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQkKKwkJCWRlZmF1bHQ6IC8qIEF0dHJpYnV0ZSB3YXMgbm90IHNwZWNpZmllZCBpbiB0aGUgY29uZmlndXJhdGlvbiAqLworCQkJCS8qIFdlIGp1c3Qga2VlcCB0aGUgYXR0cmlidXRlIGluIHRoZSBSQURJVVMgbWVzc2FnZSAqLworCQkJCXJhZF9yZXEtPmF0dHJfcG9zW25hdHRyX3VzZWQrK10gPSByYWRfcmVxLT5hdHRyX3Bvc1tpZHhdOworCQl9CisJfQorCXJhZF9yZXEtPmF0dHJfdXNlZCA9IG5hdHRyX3VzZWQ7CisJCisJLyogU2F2ZSB0aGUgZWNob2VkIHZhbHVlcyBpbiB0aGUgc2Vzc2lvbiwgaWYgYW55ICovCisJaWYgKCFGRF9JU19MSVNUX0VNUFRZKCZlY2hvX2xpc3QpKSB7CisJCXN0cnVjdCBzZXNzaW9uICogc2VzczsKKwkJc3RydWN0IHNlc3Nfc3RhdGUgKiBzdDsKKwkJCisJCUNIRUNLX0ZDVCggZmRfbXNnX3Nlc3NfZ2V0KGZkX2dfY29uZmlnLT5jbmZfZGljdCwgKmRpYW1fZncsICZzZXNzLCBOVUxMKSApOworCisJCUNIRUNLX1BBUkFNU19ETyhzZXNzLAorCQkJeworCQkJCWZkX2xvZ19kZWJ1ZygJIltlY2hvZHJvcC5yZ3d4XSBUaGUgZXh0ZW5zaW9uIGlzIGNvbmZpZ3VyZWQgdG8gZWNobyBzb21lIGF0dHJpYnV0ZXMgZnJvbSB0aGlzIG1lc3NhZ2UsIGJ1dCBubyBzZXNzaW9uIG9iamVjdCBoYXMgYmVlbiBjcmVhdGVkIGZvciBpdCAoeWV0KS4iCisJCQkJCQkiIFBsZWFzZSBjaGVjayB5b3VyIGNvbmZpZ3VyYXRpb24gZmlsZSBhbmQgaW5jbHVkZSBhIHNlc3Npb24tZ2VuZXJhdGluZyBleHRlbnNpb24gQkVGT1JFIGNhbGxpbmcgZWNob2Ryb3Aucmd3eCB0byBlY2hvIGF0dHJpYnV0ZXMuIgorCQkJCQkJIiBQbGVhc2UgdXNlIGRlYnVnLnJnd3ggdG8gcmV0cmlldmUgbW9yZSBpbmZvcm1hdGlvbi4iICk7CisJCQkJcmV0dXJuIEVJTlZBTDsKKwkJCX0gKTsKKwkJCisJCS8qIE1vdmUgdGhlIHZhbHVlcyBpbiBhIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBsaXN0ICovCisJCUNIRUNLX01BTExPQyggc3QgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzZXNzX3N0YXRlKSkgKTsKKwkJZmRfbGlzdF9pbml0KCZzdC0+c2VudGluZWwsIE5VTEwpOworCQlmZF9saXN0X21vdmVfZW5kKCZzdC0+c2VudGluZWwsICZlY2hvX2xpc3QpOworCQkKKwkJLyogU2F2ZSB0aGUgbGlzdCBpbiB0aGUgc2Vzc2lvbiAqLworCQlDSEVDS19GQ1QoIGZkX3Nlc3Nfc3RhdGVfc3RvcmUoIGNzLT5zZXNzX2hkbCwgc2VzcywgJnN0ICkgKTsKKwl9CisJCisJcmV0dXJuIDA7Cit9CisKKy8qIFByb2Nlc3MgYW4gYW5zd2VyOiBhZGQgdGhlIEVDSE8gYXR0cmlidXRlcyBiYWNrLCBpZiBhbnkgKi8KK3N0YXRpYyBpbnQgZWRfZGlhbV9hbnMoIHN0cnVjdCByZ3dwX2NvbmZpZyAqIGNzLCBzdHJ1Y3QgbXNnICoqIGRpYW1fYW5zLCBzdHJ1Y3QgcmFkaXVzX21zZyAqKiByYWRfZncsIHN0cnVjdCByZ3dfY2xpZW50ICogY2xpICkKK3sKKwlzdHJ1Y3Qgc2Vzc2lvbiAqIHNlc3M7CisJc3RydWN0IHNlc3Nfc3RhdGUgKiBzdDsKKwkKKwlUUkFDRV9FTlRSWSgiJXAgJXAgJXAgJXAiLCBjcywgZGlhbV9hbnMsIHJhZF9mdywgY2xpKTsKKwlDSEVDS19QQVJBTVMoY3MpOworCQorCUNIRUNLX0ZDVCggZmRfbXNnX3Nlc3NfZ2V0KGZkX2dfY29uZmlnLT5jbmZfZGljdCwgKmRpYW1fYW5zLCAmc2VzcywgTlVMTCkgKTsKKwkKKwkvKiBJZiB0aGVyZSBpcyBubyBzZXNzaW9uIGFzc29jaWF0ZWQsIGp1c3QgZ2l2ZSB1cCAqLworCWlmICghIHNlc3MgKSB7CisJCVRSQUNFX0RFQlVHKEZVTEwsICJObyBzZXNzaW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVzc2FnZSwgbm90aGluZyB0byBkbyBoZXJlLi4uIik7CisJCXJldHVybiAwOworCX0KKwkKKwkvKiBOb3cgdHJ5IGFuZCByZXRyaWV2ZSBhbnkgZGF0YSBmcm9tIHRoZSBzZXNzaW9uICovCisJQ0hFQ0tfRkNUKCBmZF9zZXNzX3N0YXRlX3JldHJpZXZlKCBjcy0+c2Vzc19oZGwsIHNlc3MsICZzdCApICk7CisJaWYgKHN0ID09IE5VTEwpIHsKKwkJLyogTm8gYXR0cmlidXRlIHNhdmVkIGluIHRoZSBzZXNzaW9uLCBqdXN0IHJldHVybiAqLworCQlyZXR1cm4gMDsKKwl9CisJCisJLyogRnJvbSB0aGlzIHBvaW50IG9uLCB3ZSBoYXZlIGEgbGlzdCBvZiBhdHRyaWJ1dGVzIHRvIGFkZCB0byB0aGUgcmFkaXVzIG1lc3NhZ2UgKi8KKwkKKwlDSEVDS19QQVJBTVMoIHJhZF9mdyAmJiAqcmFkX2Z3KTsKKwkKKwl3aGlsZSAoISBGRF9JU19MSVNUX0VNUFRZKCZzdC0+c2VudGluZWwpICkgeworCQlzdHJ1Y3QgZWRfc2F2ZWRfYXR0cmlidXRlICogZXNhID0gKHN0cnVjdCBlZF9zYXZlZF9hdHRyaWJ1dGUgKikoc3QtPnNlbnRpbmVsLm5leHQpOworCQkKKwkJZmRfbGlzdF91bmxpbmsoJmVzYS0+Y2hhaW4pOworCQkKKwkJVFJBQ0VfREVCVUcoRlVMTCwgIkVjaG8gYXR0cmlidXRlIGluIHRoZSBSQURJVVMgYW5zd2VyOiB0eXBlICVoaHUsIGxlbjogJWhodSIsIGVzYS0+YXR0ci50eXBlLCBlc2EtPmF0dHIubGVuZ3RoKTsKKwkJCisJCS8qIEFkZCB0aGlzIGF0dHJpYnV0ZSBpbiB0aGUgUkFESVVTIG1lc3NhZ2UgKi8KKwkJQ0hFQ0tfTUFMTE9DKCByYWRpdXNfbXNnX2FkZF9hdHRyKCpyYWRfZncsIGVzYS0+YXR0ci50eXBlLCAodW5zaWduZWQgY2hhciAqKShlc2EgKyAxKSwgZXNhLT5hdHRyLmxlbmd0aCAtIHNpemVvZihzdHJ1Y3QgcmFkaXVzX2F0dHJfaGRyKSkgKTsKKwkJCisJCWZyZWUoZXNhKTsKKwl9CisJZnJlZShzdCk7CisKKwlyZXR1cm4gMDsKK30KKworCisKKy8qIFRoZSBleHBvcnRlZCBzeW1ib2wgKi8KK3N0cnVjdCByZ3dfYXBpIHJnd3BfZGVzY3JpcHRvciA9IHsKKwkucmd3cF9uYW1lICAgICAgID0gImVjaG8vZHJvcCIsCisJLnJnd3BfY29uZl9wYXJzZSA9IGVkX2NvbmZfcGFyc2UsCisJLnJnd3BfY29uZl9mcmVlICA9IGVkX2NvbmZfZnJlZSwKKwkucmd3cF9yYWRfcmVxICAgID0gZWRfcmFkX3JlcSwKKwkucmd3cF9kaWFtX2FucyAgID0gZWRfZGlhbV9hbnMKK307CQpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9hcHBfcmFkZ3cvcmd3eF9lY2hvZHJvcC5oIGIvZXh0ZW5zaW9ucy9hcHBfcmFkZ3cvcmd3eF9lY2hvZHJvcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiODRmYmQKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2FwcF9yYWRndy9yZ3d4X2VjaG9kcm9wLmgKQEAgLTAsMCArMSw4NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTEsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAgUkFESVVTIHRyYW5zbGF0aW9uIHBsdWdpbiwgdG8gaGFuZGxlIHNwZWNpZmljIFJBRElVUyBhdHRyaWJ1dGVzIGJ5IGVpdGhlciBjYWNoaW5nIHRoZW0gYW5kIAorYWRkaW5nIHRoZW0gdG8gYSBjb3JyZXNwb25kaW5nIFJBRElVUyByZXBseSwgb3IganVzdCBkcm9wcGluZyB0aGUgYXR0cmlidXRlcyAobm8gY29udmVyc2lvbiB0byBEaWFtZXRlcikgKi8KKy8qIFRoaXMgZXh0ZW5zaW9uIGlzIGEga2luZCBvZiBzd2lzcyBhcm15LWtuaWZlIGZvciBpbnRlcm9wZXJhYmlsaXR5LCBtdXN0IGJlIHVzZWQgd2l0aCBjYXJlLiAKKyAgQWxsIGF0dHJpYnV0ZSBiZWhhdmlvcnMgYXJlIHNwZWNpZmllZCB0aHJvdWdoIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgb2YgdGhlIGV4dGVuc2lvbgorICovCisKKyNpbmNsdWRlICJyZ3dfY29tbW9uLmgiCisKKy8qIEFjdGlvbiBhc3NvY2lhdGVkIHdpdGggYW4gYXR0cmlidXRlICovCisjZGVmaW5lIEFDVF9FQ0hPIDEKKyNkZWZpbmUgQUNUX0RST1AgMgorCisvKiBSZXN1bHQgb2YgY29uZmlndXJhdGlvbiBwYXJzaW5nICovCitzdHJ1Y3Qgcmd3cF9jb25maWcgeworCS8qIGxpc3Qgb2YgYXR0cmlidXRlcyBhbmQgYXNzb2NpYXRlZCBhY3Rpb25zICovCisJc3RydWN0IGZkX2xpc3QgYXR0cmlidXRlczsKKwkKKwkvKiBIYW5kbGVyIHRvIHN0b3JlIHRoZSBlY2hvJ2VkIGF0dHJpYnV0ZXMgdmFsdWVzICovCisJc3RydWN0IHNlc3Npb25faGFuZGxlciAqIHNlc3NfaGRsOworfTsKKworLyogQW4gaXRlbSBvZiB0aGUgYXR0cmlidXRlIGxpc3QgKi8KK3N0cnVjdCBlZF9jb25mX2F0dHJpYnV0ZSB7CisJc3RydWN0IGZkX2xpc3QgCWNoYWluOwkvKiBsaW5rIGluIHRoZSBsaXN0ICovCisJCisJc3RydWN0IHsKKwkJdW5zaWduZWQJYWN0aW9uIAk6MjsJLyogQUNUX0VDSE8gb3IgQUNUX0RST1AgKi8KKwkJdW5zaWduZWQJdnNhCToxOwkvKiBJbnRlcnByZXQgYXMgVmVuZG9yLVNwZWNpZmljLCBhbmQgbWF0Y2ggdGhlIHZlbmRvciBpZCBpbiBhZGRpdGlvbiB0byB0aGUgY29kZSAqLworCQl1bnNpZ25lZAl0bHYJOjE7CS8qIEludGVycHJldCBhcyBWZW5kb3ItU3BlY2lmaWMgd2l0aCBUTFYgZm9ybWF0LCBhbmQgbWF0Y2ggdGhlIHR5cGUgYWxzbyAqLworCQl1bnNpZ25lZAlleHQJOjE7CS8qIEludGVycHJldCBhcyByYWRpdXMgZXh0ZW5kZWQgYXR0cmlidXRlLCBhbmQgbWF0Y2ggdGhlIGV4dC10eXBlIGFsc28gKi8KKwl9OworCQorCXVpbnQzMl90CXZlbmRvcl9pZDsgLyogdmVuZG9yIGlkIHRvIG1hdGNoIHdoZW4gdnNhID0gMSAqLworCXVpbnQxNl90CWV4dHlwZTsgLyogRXh0LVR5cGUgdmFsdWUgdG8gbWF0Y2ggaWYgZXh0ID0gMSAqLworCXVpbnQ4X3QJCXR5cGU7IC8qIFR5cGUgdmFsdWUgdG8gbWF0Y2ggaWYgdGx2ID0gMTsgKi8KKwkKKwl1aW50OF90CQljb2RlOyAvKiBUaGUgYXR0cmlidXRlIGNvZGUsIHRoZSBsaXN0IGlzIG9yZGVyZWQgYnkgdGhpcyB2YWx1ZSAqLworfTsKKworLyogRm9yIEVDSE8gaXRlbXMsIHdlIHNhdmUgYSBsaXN0IG9mIHRoZXNlIGluIHRoZSBzZXNzaW9uICovCitzdHJ1Y3QgZWRfc2F2ZWRfYXR0cmlidXRlIHsKKwlzdHJ1Y3QgZmRfbGlzdAkJY2hhaW47CisJc3RydWN0IHJhZGl1c19hdHRyX2hkciAgYXR0cjsgLyogY29weSBvZiB0aGUgYXR0cmlidXRlICovCisJLyogVGhlIGRhdGEgb2YgdGhlIGF0dHJpYnV0ZSBmb2xsb3dzIC4uLiAqLworfTsKKworCisvKiBUaGUgeWFjYyBwYXJzZXIgKi8KK2ludCBlZF9jb25mZmlsZV9wYXJzZShjaGFyICogY29uZmZpbGUsIHN0cnVjdCByZ3dwX2NvbmZpZyAqY3MpOwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9hcHBfcmFkZ3cvcmd3eF9lY2hvZHJvcC5sIGIvZXh0ZW5zaW9ucy9hcHBfcmFkZ3cvcmd3eF9lY2hvZHJvcC5sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhYjI4NDEKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2FwcF9yYWRndy9yZ3d4X2VjaG9kcm9wLmwKQEAgLTAsMCArMSw5OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTMsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUb2tlbml6ZXIgZm9yIGVjaG8vZHJvcCBwbHVnaW4gKi8KKworJXsKKyNpbmNsdWRlICJyZ3d4X2VjaG9kcm9wLmgiCisjaW5jbHVkZSAicmd3eF9lY2hvZHJvcC50YWIuaCIKKworLyogVXBkYXRlIHRoZSBjb2x1bW4gaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgWVlfVVNFUl9BQ1RJT04geyAJCQkJCQlcCisJeXlsbG9jLT5maXJzdF9jb2x1bW4gPSB5eWxsb2MtPmxhc3RfY29sdW1uICsgMTsgCQlcCisJeXlsbG9jLT5sYXN0X2NvbHVtbiA9IHl5bGxvYy0+Zmlyc3RfY29sdW1uICsgeXlsZW5nIC0gMTsJXAorfQorCisvKiAlb3B0aW9uIG5vaW5wdXQgPyAqLworI2RlZmluZSBZWV9OT19JTlBVVAorJX0KKworJW9wdGlvbiBiaXNvbi1icmlkZ2UgYmlzb24tbG9jYXRpb25zCislb3B0aW9uIG5veXl3cmFwCislb3B0aW9uIG5vdW5wdXQKKworJSUKKworPCo+XG4JCQl7IAorCQkJCS8qIFVwZGF0ZSB0aGUgbGluZSBjb3VudCAqLworCQkJCXl5bGxvYy0+Zmlyc3RfbGluZSsrOyAKKwkJCQl5eWxsb2MtPmxhc3RfbGluZSsrOyAKKwkJCQl5eWxsb2MtPmxhc3RfY29sdW1uPTA7IAorCQkJfSAKKworPCo+KFtbOnNwYWNlOl1dey19W1xuXSkrCTsgLyogRWF0IGFsbCBzcGFjZXMsIG5vdCBuZXcgbGluZXMgKi8KKzwqPiMuKiQJCQk7IC8qIEVhdCBhbGwgY29tbWVudHMgKi8KKworW1s6ZGlnaXQ6XV0rCQl7CisJCQkJLyogTWF0Y2ggYW4gaW50ZWdlciAobm90IGhleGEpICovCisJCQkJaW50IHJldCA9IHNzY2FuZih5eXRleHQsICIlZCIsICZ5eWx2YWwtPmludGVnZXIpOworCQkJCWlmIChyZXQgIT0gMSkgeworCQkJCQkvKiBObyBtYXRjaGluZzogYW4gZXJyb3Igb2NjdXJyZWQgKi8KKwkJCQkJZmRfbG9nX2RlYnVnKCJbZWNob2Ryb3Aucmd3eF0gVW5hYmxlIHRvIGNvbnZlcnQgdGhlIHZhbHVlICclcycgdG8gYSB2YWxpZCBudW1iZXI6ICVzIiwgeXl0ZXh0LCBzdHJlcnJvcihlcnJubykpOworCQkJCQlyZXR1cm4gTEVYX0VSUk9SOyAvKiB0cmlnIGFuIGVycm9yIGluIHlhY2MgcGFyc2VyICovCisJCQkJCS8qIE1heWJlIHdlIGNvdWxkIFJFSkVDVCBpbnN0ZWFkIG9mIGZhaWxpbmcgaGVyZT8gKi8KKwkJCQl9CisJCQkJcmV0dXJuIElOVEVHRVI7CisJCQl9CisJCQkJCisoP2k6ImVjaG8iKQkJeyByZXR1cm4gVE9LX0VDSE87IAkJfQorKD9pOiJkcm9wIikJCXsgcmV0dXJuIFRPS19EUk9QOyAJCX0KKyg/aToiY29kZSIpCQl7IHJldHVybiBUT0tfQ09ERTsgCQl9CisoP2k6InZlbmRvciIpCQl7IHJldHVybiBUT0tfVkVORE9SOyAJCX0KKyg/aToidGx2IikJCXsgcmV0dXJuIFRPS19UTFY7IAkJfQorKD9pOiJleHQiKQkJeyByZXR1cm4gVE9LX0VYVDsgCQl9CisKKwkvKiBWYWxpZCBzaW5nbGUgY2hhcmFjdGVycyBmb3IgeXlwYXJzZSAqLworPCo+WztdCQkJeyByZXR1cm4geXl0ZXh0WzBdOyB9CisKKworCS8qIFVucmVjb2duaXplZCB0b2tlbiAqLworPCo+W1s6YWxudW06XV0rCQl8CS8qIFRoaXMgcnVsZSBpcyBvbmx5IHVzZWZ1bCB0byBwcmludCBhIGNvbXBsZXRlIHRva2VuIGluIGVycm9yIG1lc3NhZ2VzICovCisJLyogVW5yZWNvZ25pemVkIGNoYXJhY3RlciAqLworPCo+LgkJCXsgCisJCQkJZmRfbG9nX2RlYnVnKCJbZWNob2Ryb3Aucmd3eF0gVW5yZWNvZ25pemVkIHRleHQgb24gbGluZSAlZCBjb2wgJWQ6ICclcycuIiwgeXlsbG9jLT5maXJzdF9saW5lLCB5eWxsb2MtPmZpcnN0X2NvbHVtbiwgeXl0ZXh0KTsKKwkJCSAJcmV0dXJuIExFWF9FUlJPUjsgCisJCQl9CisKKyUlCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2FwcF9yYWRndy9yZ3d4X2VjaG9kcm9wLnkgYi9leHRlbnNpb25zL2FwcF9yYWRndy9yZ3d4X2VjaG9kcm9wLnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNjYWYwNgotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvYXBwX3JhZGd3L3Jnd3hfZWNob2Ryb3AueQpAQCAtMCwwICsxLDI1NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTMsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBZYWNjIHBhcnNlciBmb3IgZWNoby9kcm9wIHBsdWdpbi4gCitTZWUgZG9jL2VjaG9kcm9wLnJnd3guY29uZi5zYW1wbGUgZm9yIGRlc2NyaXB0aW9uIG9mIHRoZSBwYXJzZWQgZm9ybWF0LiAqLworCisKKy8qIEZvciBkZXZlbG9wbWVudCBvbmx5IDogKi8KKyVkZWJ1ZyAKKyVlcnJvci12ZXJib3NlCisKKy8qIFRoZSBwYXJzZXIgcmVjZWl2ZXMgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBmaWxlbmFtZSBhbmQgdGhlIGNvbmYgc3RydWN0dXJlIGFzIHBhcmFtZXRlciAqLworJXBhcnNlLXBhcmFtIHtjaGFyICogY29uZmZpbGV9CislcGFyc2UtcGFyYW0ge3N0cnVjdCByZ3dwX2NvbmZpZyAqY3N9CisKKy8qIEtlZXAgdHJhY2sgb2YgbG9jYXRpb24gKi8KKyVsb2NhdGlvbnMgCislcHVyZS1wYXJzZXIKKworJXsKKyNpbmNsdWRlICJyZ3d4X2VjaG9kcm9wLmgiCisjaW5jbHVkZSAicmd3eF9lY2hvZHJvcC50YWIuaCIJLyogYmlzb24gaXMgbm90IHNtYXJ0IGVub3VnaCB0byBkZWZpbmUgdGhlIFlZTFRZUEUgYmVmb3JlIGluY2x1ZGluZyB0aGlzIGNvZGUsIHNvLi4uICovCisKKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbiAqLworaW50IHl5cGFyc2UoY2hhciAqIGNvbmZmaWxlLCBzdHJ1Y3Qgcmd3cF9jb25maWcgKmNzKTsKKworLyogVGhlIExleCBwYXJzZXIgcHJvdG90eXBlICovCitpbnQgcmd3eF9lY2hvZHJvcGxleChZWVNUWVBFICpsdmFscCwgWVlMVFlQRSAqbGxvY3ApOworCisKKy8qIFBhcnNlIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgKi8KK2ludCBlZF9jb25mZmlsZV9wYXJzZShjaGFyICogY29uZmZpbGUsIHN0cnVjdCByZ3dwX2NvbmZpZyAqY3MpCit7CisJZXh0ZXJuIEZJTEUgKiByZ3d4X2VjaG9kcm9waW47CisJaW50IHJldDsKKwkKKwlyZ3d4X2VjaG9kcm9waW4gPSBmb3Blbihjb25mZmlsZSwgInIiKTsKKwlpZiAoKHJnd3hfZWNob2Ryb3BpbiA9PSBOVUxMKSAmJiAoKmNvbmZmaWxlICE9ICcvJykpIHsgLyogV2UgcmVjZWl2ZWQgYSByZWxhdGl2ZSBwYXRoLCB0cnkgYWRkaW5nIERFRkFVTFRfQ09ORl9QQVRIIHByZWZpeCAqLworCQljaGFyICogZnVsbHBhdGg7CisJCUNIRUNLX01BTExPQyggZnVsbHBhdGggPSBtYWxsb2MoIHN0cmxlbihjb25mZmlsZSkgKyBzdHJsZW4oREVGQVVMVF9DT05GX1BBVEgpICsgMiApICk7CisJCXNwcmludGYoIGZ1bGxwYXRoLCBERUZBVUxUX0NPTkZfUEFUSCAiLyVzIiwgY29uZmZpbGUgKTsKKwkJcmd3eF9lY2hvZHJvcGluID0gZm9wZW4oZnVsbHBhdGgsICJyIik7CisJCWZyZWUoZnVsbHBhdGgpOworCX0KKwlpZiAocmd3eF9lY2hvZHJvcGluID09IE5VTEwpIHsKKwkJcmV0ID0gZXJybm87CisJCWZkX2xvZ19kZWJ1ZygiW2VjaG9kcm9wLnJnd3hdIFVuYWJsZSB0byBvcGVuIHBsdWdpbiBjb25maWd1cmF0aW9uIGZpbGUgJXMgZm9yIHJlYWRpbmc6ICVzIiwgY29uZmZpbGUsIHN0cmVycm9yKHJldCkpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHJnd3hfZWNob2Ryb3BwYXJzZShjb25mZmlsZSwgY3MpOworCisJZmNsb3NlKHJnd3hfZWNob2Ryb3Bpbik7CisKKwlpZiAocmV0ICE9IDApIHsKKwkJcmV0dXJuIEVJTlZBTDsKKwl9CisJCisJcmV0dXJuIDA7Cit9CisKKy8qIEZ1bmN0aW9uIHRvIHJlcG9ydCB0aGUgZXJyb3JzICovCit2b2lkIHl5ZXJyb3IgKFlZTFRZUEUgKnBsb2MsIGNoYXIgKiBjb25mZmlsZSwgc3RydWN0IHJnd3BfY29uZmlnICpjcywgY2hhciBjb25zdCAqcykKK3sKKwlpZiAocGxvYy0+Zmlyc3RfbGluZSAhPSBwbG9jLT5sYXN0X2xpbmUpCisJCWZkX2xvZ19kZWJ1ZygiJXM6JWQuJWQtJWQuJWQgOiAlcyIsIGNvbmZmaWxlLCBwbG9jLT5maXJzdF9saW5lLCBwbG9jLT5maXJzdF9jb2x1bW4sIHBsb2MtPmxhc3RfbGluZSwgcGxvYy0+bGFzdF9jb2x1bW4sIHMpOworCWVsc2UgaWYgKHBsb2MtPmZpcnN0X2NvbHVtbiAhPSBwbG9jLT5sYXN0X2NvbHVtbikKKwkJZmRfbG9nX2RlYnVnKCIlczolZC4lZC0lZCA6ICVzIiwgY29uZmZpbGUsIHBsb2MtPmZpcnN0X2xpbmUsIHBsb2MtPmZpcnN0X2NvbHVtbiwgcGxvYy0+bGFzdF9jb2x1bW4sIHMpOworCWVsc2UKKwkJZmRfbG9nX2RlYnVnKCIlczolZC4lZCA6ICVzIiwgY29uZmZpbGUsIHBsb2MtPmZpcnN0X2xpbmUsIHBsb2MtPmZpcnN0X2NvbHVtbiwgcyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeworCXN0cnVjdCB7CisJCXVuc2lnbmVkIHZlbmRvciA6MTsKKwkJdW5zaWduZWQgdGx2IDoxOworCQl1bnNpZ25lZCBleHQgOjE7CisJfTsKKwl1aW50OF90CQl0eXBlOworCXVpbnQxNl90CWV4dHlwZTsKKwl1aW50MzJfdAl2ZW5kb3JfaWQ7Cit9IGF0dHJpbmZvOworCisKKyV9CisKKy8qIFZhbHVlcyByZXR1cm5lZCBieSBsZXggZm9yIHRva2VucyAqLworJXVuaW9uIHsKKwl1bnNpZ25lZAlpbnRlZ2VyOwkvKiBWYWx1ZSAgKi8KK30KKworLyogdHlwZWQgZGF0YSAqLworJXRva2VuIDxpbnRlZ2VyPiBJTlRFR0VSCisldHlwZSAgPGludGVnZXI+IGFjdGlvbgorCisvKiBzaW1wbGUgdG9rZW5zICovCisldG9rZW4JCVRPS19FQ0hPCisldG9rZW4JCVRPS19EUk9QCisldG9rZW4JCVRPS19DT0RFCisldG9rZW4JCVRPS19WRU5ET1IKKyV0b2tlbgkJVE9LX1RMVgorJXRva2VuCQlUT0tfRVhUCisKKy8qIEluIGNhc2Ugb2YgZXJyb3IgaW4gdGhlIGxleGljYWwgYW5hbHlzaXMgKi8KKyV0b2tlbiAJCUxFWF9FUlJPUgorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCislJQorCisJLyogVGhlIGdyYW1tYXIgZGVmaW5pdGlvbiAqLworY29uZmZpbGU6CQkvKiBlbXB0eSBncmFtbWFyIGlzIE9LICovCisJCQl8IGNvbmZmaWxlIGF0dHJkZWYKKwkJCTsKKworCS8qIEFuIGF0dHJpYnV0ZSBsaW5lICovCQkJCQorYXR0cmRlZjoJCXsKKwkJCQltZW1zZXQoJmF0dHJpbmZvLCAwLCBzaXplb2YoYXR0cmluZm8pKTsKKwkJCX0KKwkJCWFjdGlvbiBUT0tfQ09ERSBJTlRFR0VSIHZlbmRvcmRlZiAnOycKKwkJCXsKKwkJCQlzdHJ1Y3QgZWRfY29uZl9hdHRyaWJ1dGUgKiBuZXc7CisJCQkJc3RydWN0IGZkX2xpc3QgKiBsaTsKKworCQkJCWlmICgkNCA+PSAyNTYpIHsKKwkJCQkJeXllcnJvciAoJnl5bGxvYywgY29uZmZpbGUsIGNzLCAiVG9vIGJpZyB2YWx1ZSBmb3IgYXR0cmlidXRlIENPREUiKTsKKwkJCQkJWVlFUlJPUjsKKwkJCQl9CisJCQkJCisJCQkJLyogQ3JlYXRlIGEgbmV3IGxpc3QgaXRlbSAqLworCQkJCUNIRUNLX01BTExPQ19ETyggbmV3ID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgZWRfY29uZl9hdHRyaWJ1dGUpKSwgCisJCQkJCXsKKwkJCQkJCXl5ZXJyb3IgKCZ5eWxsb2MsIGNvbmZmaWxlLCBjcywgIk1lbW9yeSBhbGxvY2F0aW9uIGVycm9yIik7CisJCQkJCQlZWUVSUk9SOworCQkJCQl9ICk7CisJCQkJbWVtc2V0KG5ldywgMCwgc2l6ZW9mKHN0cnVjdCBlZF9jb25mX2F0dHJpYnV0ZSkpOworCQkJCQorCQkJCWZkX2xpc3RfaW5pdCgmbmV3LT5jaGFpbiwgTlVMTCk7CisJCQkJCisJCQkJbmV3LT5hY3Rpb24gPSAkMjsKKwkJCQluZXctPnZzYSA9IGF0dHJpbmZvLnZlbmRvcjsKKwkJCQluZXctPnRsdiA9IGF0dHJpbmZvLnRsdjsKKwkJCQluZXctPmV4dCA9IGF0dHJpbmZvLmV4dDsKKwkJCQkKKwkJCQlpZiAobmV3LT52c2EpCisJCQkJCW5ldy0+dmVuZG9yX2lkID0gYXR0cmluZm8udmVuZG9yX2lkOworCQkJCWlmIChuZXctPnRsdikKKwkJCQkJbmV3LT50eXBlID0gYXR0cmluZm8udHlwZTsKKwkJCQlpZiAobmV3LT5leHQpCisJCQkJCW5ldy0+ZXh0eXBlID0gYXR0cmluZm8uZXh0eXBlOworCQkJCQorCQkJCW5ldy0+Y29kZSA9ICQ0OworCQkJCQorCQkJCS8qIE5vdyBwbGFjZSB0aGlzIGF0dHJpYnV0ZSBpbiB0aGUgbGlzdCAqLworCQkJCWZvciAobGkgPSBjcy0+YXR0cmlidXRlcy5uZXh0OyBsaSAhPSAmY3MtPmF0dHJpYnV0ZXM7IGxpID0gbGktPm5leHQpIHsKKwkJCQkJc3RydWN0IGVkX2NvbmZfYXR0cmlidXRlICplY2EgPSAoc3RydWN0IGVkX2NvbmZfYXR0cmlidXRlICopbGk7CisJCQkJCS8qIE9yZGVyIGZpcnN0IGJ5IGF0dHJpYnV0ZSBjb2RlICovCisJCQkJCWlmIChlY2EtPmNvZGUgPiBuZXctPmNvZGUpCisJCQkJCQlicmVhazsKKwkJCQkJaWYgKGVjYS0+Y29kZSA8IG5ldy0+Y29kZSkKKwkJCQkJCWNvbnRpbnVlOworCQkJCQkKKwkJCQkJLyogVGhlbiBieSBWU0EgZmxhZyAqLworCQkJCQlpZiAoISBuZXctPnZzYSkKKwkJCQkJCWJyZWFrOworCQkJCQlpZiAoISBlY2EtPnZzYSkKKwkJCQkJCWNvbnRpbnVlOworCQkJCQkKKwkJCQkJLyogVGhlbiBieSB2ZW5kb3IgdmFsdWUgKi8KKwkJCQkJaWYgKGVjYS0+dmVuZG9yX2lkID49IG5ldy0+dmVuZG9yX2lkKQorCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJCQorCQkJCWZkX2xpc3RfaW5zZXJ0X2JlZm9yZShsaSwgJm5ldy0+Y2hhaW4pOworCQkJfQorCQkJOworCQorCS8qIFdoYXQgdG8gZG8gd2l0aCB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZSAqLworYWN0aW9uOgkJCVRPS19FQ0hPCisJCQl7CisJCQkJJCQgPSBBQ1RfRUNITzsKKwkJCX0KKwkJCXwKKwkJCVRPS19EUk9QCisJCQl7CisJCQkJJCQgPSBBQ1RfRFJPUDsKKwkJCX0KKwkJCTsKKworCS8qIFZlbmRvciBzcGVjaWZpY3MsIGlmIGFueSAqLwordmVuZG9yZGVmOgkJLyogZW1wdHkgT0sgKi8KKwkJCXwgVE9LX1ZFTkRPUiBJTlRFR0VSIHNwZWNpZgorCQkJeworCQkJCWF0dHJpbmZvLnZlbmRvcl9pZCA9ICQyOworCQkJCWF0dHJpbmZvLnZlbmRvciA9IDE7CisJCQl9CisJCQk7CisJCQkKKwkvKiBBbnkgYWRkaXRpb25hbCBzcGVjaWZpY2F0aW9uID8gKi8KK3NwZWNpZjoJCQkvKiBlbXB0eSBPSyAqLworCQkJfCBUT0tfVExWIElOVEVHRVIKKwkJCXsKKwkJCQlpZiAoJDIgPj0gKDEgPDwgOCkpIHsKKwkJCQkJeXllcnJvciAoJnl5bGxvYywgY29uZmZpbGUsIGNzLCAiVG9vIGJpZyB2YWx1ZSBmb3IgVExWIHR5cGUiKTsKKwkJCQkJWVlFUlJPUjsKKwkJCQl9CisJCQkJYXR0cmluZm8udHlwZSA9ICQyOworCQkJCWF0dHJpbmZvLnRsdiA9IDE7CisJCQl9CisJCQl8IFRPS19FWFQgSU5URUdFUgorCQkJeworCQkJCWlmICgkMiA+PSAoMSA8PCAxNikpIHsKKwkJCQkJeXllcnJvciAoJnl5bGxvYywgY29uZmZpbGUsIGNzLCAiVG9vIGJpZyB2YWx1ZSBmb3IgRXh0LVR5cGUiKTsKKwkJCQkJWVlFUlJPUjsKKwkJCQl9CisJCQkJYXR0cmluZm8uZXh0eXBlID0gJDI7CisJCQkJYXR0cmluZm8uZXh0ID0gMTsKKwkJCQl5eWVycm9yICgmeXlsbG9jLCBjb25mZmlsZSwgY3MsICJUaGUgRVhUIG9wdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgdmVyc2lvbi4iKTsKKwkJCQlZWUVSUk9SOworCQkJfQorCQkJOwkKKwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9hcHBfcmFkZ3cvcmd3eF9zYW1wbGUuYyBiL2V4dGVuc2lvbnMvYXBwX3JhZGd3L3Jnd3hfc2FtcGxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUyY2QwMwotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvYXBwX3JhZGd3L3Jnd3hfc2FtcGxlLmMKQEAgLTAsMCArMSw5NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTMsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBTYW1wbGUgcmFkaXVzL2RpYW1ldGVyIGdhdGV3YXkgcGx1Z2luLCBmb3IgZGV2ZWxvcGVycyB0byBzZWUgdGhlIHN0cnVjdHVyZSBvZiBhIHBsdWdpbi4gKi8KKworI2luY2x1ZGUgInJnd19jb21tb24uaCIKKworLyogVGhlIHN0YXRlIG9mIHRoaXMgZXh0ZW5zaW9uICovCitzdHJ1Y3Qgcmd3cF9jb25maWcgeworCS8qIEluIGEgcmVhbCBleHRlbnNpb24sIHdlIHdvdWxkIHN0b3JlIHRoZSBwYXJzZWQgY29uZmlndXJhdGlvbiBmaWxlLCBhbmQgdGhlIHN0YXRlcyBvZiB0aGUgZXh0ZW5zaW9uICovCisJaW50IGluaXQ7CisJCisJLyogSWYgbmVlZGVkIHRvIHN0b3JlIGluZm9ybWF0aW9uIGJldHdlZW4gc2VudCBEaWFtZXRlciByZXF1ZXN0IGFuZCByZWNlaXZlZCBhbnN3ZXIsIHRoZSBzZXNzaW9uIGlzIHByb2JhYmx5IHRoZSBiZXN0IHBsYWNlLgorCSAgU2VlIHJnd3hfZWNob2Ryb3AgZm9yIGFuIGV4YW1wbGUuICovCit9OworCisvKiBUaGUgZnVuY3Rpb24gY2FsbGVkIGF0IHBsdWdpbiBpbml0aWFsaXphdGlvbiAqLworc3RhdGljIGludCBzYW1wbGVfY29uZl9wYXJzZSAoIGNoYXIgKiBjb25mX2ZpbGUsIHN0cnVjdCByZ3dwX2NvbmZpZyAqKiBzdGF0ZSApCit7CisJVFJBQ0VfRU5UUlkoIiVwICVwIiwgY29uZl9maWxlLCBzdGF0ZSk7CisJQ0hFQ0tfUEFSQU1TKHN0YXRlKTsKKwkKKwlDSEVDS19NQUxMT0MoICpzdGF0ZSA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHJnd3BfY29uZmlnKSkgKTsKKwkKKwkoKnN0YXRlKS0+aW5pdCA9IDE7CisJCisJcmV0dXJuIDA7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIHBsdWdpbiBpcyB1bmxvYWRlZCwgdG8gY2xlYW51cCBhbGwgdGhlIHN0YXRlcyAqLworc3RhdGljIHZvaWQgc2FtcGxlX2NvbmZfZnJlZShzdHJ1Y3Qgcmd3cF9jb25maWcgKiBzdGF0ZSkKK3sKKwlUUkFDRV9FTlRSWSgiJXAiLCBzdGF0ZSk7CisJQ0hFQ0tfUEFSQU1TX0RPKCBzdGF0ZSwgKTsKKwlmcmVlKHN0YXRlKTsKKwlyZXR1cm47Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uIGluY29taW5nIFJBRElVUyBtZXNzYWdlcy4gSXQgc2hvdWxkIGhhbmRsZSAoc29tZSkgUkFESVVTIGRhdGEgYW5kIHN0b3JlIGludG8gdGhlIERpYW1ldGVyIG1lc3NhZ2UuICovCitzdGF0aWMgaW50IHNhbXBsZV9yYWRfcmVxKCBzdHJ1Y3Qgcmd3cF9jb25maWcgKiBjcywgc3RydWN0IHJhZGl1c19tc2cgKiByYWRfcmVxLCBzdHJ1Y3QgcmFkaXVzX21zZyAqKiByYWRfYW5zLCBzdHJ1Y3QgbXNnICoqIGRpYW1fZncsIHN0cnVjdCByZ3dfY2xpZW50ICogY2xpICkKK3sKKwlUUkFDRV9FTlRSWSgiJXAgJXAgJXAgJXAgJXAiLCBjcywgcmFkX3JlcSwgcmFkX2FucywgZGlhbV9mdywgY2xpKTsKKwlDSEVDS19QQVJBTVMoY3MpOworCVRSQUNFX0RFQlVHKElORk8sICJSQURJVVMvRGlhbWV0ZXIgU2FtcGxlIHBsdWdpbiByZWNlaXZlZCBhIG5ldyBSQURJVVMgbWVzc2FnZS4iKTsKKwlyZXR1cm4gMDsKK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhIERpYW1ldGVyIGFuc3dlciBpcyBjb21pbmcgYmFjay4gSXQgc2hvdWxkIHJlbW92ZSB0aGUgQVZQcyBhbmQgYWRkIHRoZSBhdHRyaWJ1dGVzIGluIHRoZSBSQURJVVMgbWVzc2FnZS4gKi8KK3N0YXRpYyBpbnQgc2FtcGxlX2RpYW1fYW5zKCBzdHJ1Y3Qgcmd3cF9jb25maWcgKiBjcywgc3RydWN0IG1zZyAqKiBkaWFtX2Fucywgc3RydWN0IHJhZGl1c19tc2cgKiogcmFkX2Z3LCBzdHJ1Y3Qgcmd3X2NsaWVudCAqIGNsaSApCit7CisJVFJBQ0VfRU5UUlkoIiVwICVwICVwICVwIiwgY3MsIGRpYW1fYW5zLCByYWRfZncsIGNsaSk7CisJQ0hFQ0tfUEFSQU1TKGNzKTsKKwlUUkFDRV9ERUJVRyhJTkZPLCAiUkFESVVTL0RpYW1ldGVyIFNhbXBsZSBwbHVnaW4gcmVjZWl2ZWQgYSBuZXcgRGlhbWV0ZXIgYW5zd2VyLiIpOworCXJldHVybiAwOworfQorCisKKy8qIEZpbmFsbHksIHdlIGRlY2xhcmUgdGhlIHN0cnVjdHVyZSB0aGF0IHdpbGwgYmUgbG9hZGVkIGJ5IG1haW4gUkFESVVTL0RpYW1ldGVyIGdhdGV3YXkgZXh0ZW5zaW9uICovCitzdHJ1Y3Qgcmd3X2FwaSByZ3dwX2Rlc2NyaXB0b3IgPSB7CisJLnJnd3BfbmFtZSAgICAgICA9ICJzYW1wbGUiLAorCS5yZ3dwX2NvbmZfcGFyc2UgPSBzYW1wbGVfY29uZl9wYXJzZSwKKwkucmd3cF9jb25mX2ZyZWUgID0gc2FtcGxlX2NvbmZfZnJlZSwKKwkucmd3cF9yYWRfcmVxICAgID0gc2FtcGxlX3JhZF9yZXEsCisJLnJnd3BfZGlhbV9hbnMgICA9IHNhbXBsZV9kaWFtX2FucworfTsJCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2FwcF9yYWRndy9yZ3d4X3NpcC5jIGIvZXh0ZW5zaW9ucy9hcHBfcmFkZ3cvcmd3eF9zaXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGZkOTFlCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9hcHBfcmFkZ3cvcmd3eF9zaXAuYwpAQCAtMCwwICsxLDg1NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IEFsZXhhbmRyZSBXZXN0ZmFobCA8YXdlc3RmYWhsQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTMsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDEwLCBBbGV4YW5kcmUgV2VzdGZhaGwsIFRlcmFva2EgTGFib3JhdG9yeSAoS2VpbyBVbml2ZXJzaXR5KSwgYW5kIHRoZSBXSURFIFByb2plY3QuIAkgKgkJCisqCQkJCQkJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiBCYXNlZCBvbiByZ3d4X2F1dGggcGx1Z2luIChTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4pCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFRlcmFva2EgTGFib3JhdG9yeSBub3IgdGhlIAkJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBUZXJhb2thIExhYm9yYXRvcnkgCQkJCQkJICoKKyogICAJCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKiBSQURJVVMgQWNjZXNzLVJlcXVlc3QgbWVzc2FnZXMgdHJhbnNsYXRpb24gcGx1Z2luICovCisKKyNpbmNsdWRlICJyZ3dfY29tbW9uLmgiCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4gCisKKy8qIE90aGVyIGNvbnN0YW50cyB3ZSB1c2UgKi8KKyNkZWZpbmUgQUlfU0lQCQkJCTYJLyogRGlhbWV0ZXIgU0lQIGFwcGxpY2F0aW9uICovCisjZGVmaW5lIENDX01VTFRJTUVESUFfQVVUSF9SRVFVRVNUCTI4NgkvKiBNQVIgKi8KKyNkZWZpbmUgQ0NfTVVMVElNRURJQV9BVVRIX0FOU1dFUgkyODYJLyogTUFBICovCisjZGVmaW5lIEFDVl9BU1NfU1RBVEVfTUFJTlRBSU5FRAkwCS8qIFNUQVRFX01BSU5UQUlORUQgKi8KKyNkZWZpbmUgQUNWX0FTU19OT19TVEFURV9NQUlOVEFJTkVECTEJLyogTk9fU1RBVEVfTUFJTlRBSU5FRCAqLworI2RlZmluZSBFUl9ESUFNRVRFUl9TVUNDRVNTX0FVVEhfU0VOVF9TRVJWRVJfTk9UX1NUT1JFRAkyMDA4CisjZGVmaW5lIEVSX0RJQU1FVEVSX1NVQ0NFU1NfU0VSVkVSX05BTUVfTk9UX1NUT1JFRAkyMDA2CisKKworCisvKiBUaGlzIG1hY3JvIGNvbnZlcnRzIGEgUkFESVVTIGF0dHJpYnV0ZSB0byBhIERpYW1ldGVyIEFWUCBvZiB0eXBlIE9jdGV0U3RyaW5nICovCisjZGVmaW5lIENPTlYyRElBTV9TVFIoIF9kaWN0b2JqXyApCVwKKwlDSEVDS19QQVJBTVMoIGF0dHItPmxlbmd0aCA+PSBzaXplb2Yoc3RydWN0IHJhZGl1c19hdHRyX2hkcikgKTsJCQlcCisJLyogQ3JlYXRlIHRoZSBBVlAgd2l0aCB0aGUgc3BlY2lmaWVkIGRpY3Rpb25hcnkgbW9kZWwgKi8JCQlcCisJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIGNzLT5kaWN0Ll9kaWN0b2JqXywgMCwgJmF2cCApICk7CQkJXAorCXZhbHVlLm9zLmxlbiA9IGF0dHItPmxlbmd0aCAtIHNpemVvZihzdHJ1Y3QgcmFkaXVzX2F0dHJfaGRyKTsJCQlcCisJdmFsdWUub3MuZGF0YSA9IChvczBfdCkoYXR0ciArIDEpOwkJCQkJCVwKKwlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUgKCBhdnAsICZ2YWx1ZSApICk7CQkJCVwKKwkvKiBBZGQgdGhlIEFWUCBpbiB0aGUgRGlhbWV0ZXIgbWVzc2FnZS4gKi8JCQkJCVwKKwlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkICggKmRpYW1fZncsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwKSApOwkJXAorCisjZGVmaW5lIENPTlYyRElBTV9TVFJfQVVUSCggX2RpY3RvYmpfICkJXAorCUNIRUNLX1BBUkFNUyggYXR0ci0+bGVuZ3RoID49IHNpemVvZihzdHJ1Y3QgcmFkaXVzX2F0dHJfaGRyKSApOwkJCVwKKwkvKiBDcmVhdGUgdGhlIEFWUCB3aXRoIHRoZSBzcGVjaWZpZWQgZGljdGlvbmFyeSBtb2RlbCAqLwkJCVwKKwlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3ICggY3MtPmRpY3QuX2RpY3RvYmpfLCAwLCAmYXZwICkgKTsJCQlcCisJdmFsdWUub3MubGVuID0gYXR0ci0+bGVuZ3RoIC0gc2l6ZW9mKHN0cnVjdCByYWRpdXNfYXR0cl9oZHIpOwkJCVwKKwl2YWx1ZS5vcy5kYXRhID0gKG9zMF90KShhdHRyICsgMSk7CQkJCQkJXAorCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9zZXR2YWx1ZSAoIGF2cCwgJnZhbHVlICkgKTsJCQkJXAorCS8qIEFkZCB0aGUgQVZQIGluIHRoZSBEaWFtZXRlciBtZXNzYWdlLiAqLwkJCQkJXAorCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQgKCBhdXRoLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCkgKTsJCQlcCisJCQorLyogU2FtZSB0aGluZywgZm9yIHNjYWxhciBBVlBzIG9mIDMyIGJpdHMgKi8KKyNkZWZpbmUgQ09OVjJESUFNXzMyQiggX2RpY3RvYmpfICkJXAorCUNIRUNLX1BBUkFNUyggYXR0ci0+bGVuZ3RoID09IHNpemVvZihzdHJ1Y3QgcmFkaXVzX2F0dHJfaGRyKStzaXplb2YodWludDMyX3QpICk7XAorCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBjcy0+ZGljdC5fZGljdG9ial8sIDAsICZhdnAgKSApOwkJCVwKKwl7CQkJCQkJCQkJCVwKKwkJdWludDhfdCAqIHYgPSAodWludDhfdCAqKShhdHRyICsgMSk7CQkJCQlcCisJCXZhbHVlLnUzMiAgPSAodlswXSA8PCAyNCkJCQkJCQlcCisJCQkgICB8ICh2WzFdIDw8IDE2KQkJCQkJCVwKKwkJCSAgIHwgKHZbMl0gPDwgIDgpCQkJCQkJXAorCQkJICAgfCAgdlszXSA7CQkJCQkJCVwKKwl9CQkJCQkJCQkJCVwKKwlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUgKCBhdnAsICZ2YWx1ZSApICk7CQkJCVwKKwlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkICggKmRpYW1fZncsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwKSApOwkJXAorCQkJCQorCQkJCQorCQkJCQorCQkJCQorCQkJCQorLyogVGhlIHN0YXRlIHdlIGtlZXAgZm9yIHRoaXMgcGx1Z2luICovCitzdHJ1Y3Qgcmd3cF9jb25maWcgeworCXN0cnVjdCB7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIFNlc3Npb25fSWQ7CQkKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogQXV0aF9BcHBsaWNhdGlvbl9JZDsJCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIEF1dGhfU2Vzc2lvbl9TdGF0ZTsJCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIE9yaWdpbl9Ib3N0OwkJCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIE9yaWdpbl9SZWFsbTsJCQorCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBEZXN0aW5hdGlvbl9SZWFsbTsJCQorCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBTSVBfQU9SOwkJCQorCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBTSVBfTWV0aG9kOwkJCQorCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBEZXN0aW5hdGlvbl9Ib3N0OwkJCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIFVzZXJfTmFtZTsJCQkKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogU0lQX1NlcnZlcl9VUkk7CQkKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogU0lQX051bWJlcl9BdXRoX0l0ZW1zOwkKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogU0lQX0F1dGhvcml6YXRpb247CQorCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBTSVBfQXV0aGVudGljYXRpb25fU2NoZW1lOwkKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogU0lQX0F1dGhlbnRpY2F0aW9uX0luZm87CQorCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBTSVBfQXV0aF9EYXRhX0l0ZW07CQorCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBQcm94eV9JbmZvOwkJCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIFJvdXRlX1JlY29yZDsJCQorCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBTZXJ2aWNlX1R5cGU7CQkKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogUmVzdWx0X0NvZGU7CQkKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogRGlnZXN0X1VSSTsJCQorCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBEaWdlc3RfTm9uY2U7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIERpZ2VzdF9DTm9uY2U7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIERpZ2VzdF9Ob25jZV9Db3VudDsJCQkJCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIERpZ2VzdF9SZWFsbTsJCQorCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBEaWdlc3RfUmVzcG9uc2U7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIERpZ2VzdF9NZXRob2Q7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIERpZ2VzdF9SZXNwb25zZV9BdXRoOwkJCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIERpZ2VzdF9Vc2VybmFtZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogRGlnZXN0X0FsZ29yaXRobTsJCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIERpZ2VzdF9RT1A7CisKKwkJCisJCQorCX0gZGljdDsgLyogY2FjaGUgb2YgdGhlIGRpY3Rpb25hcnkgb2JqZWN0cyB3ZSB1c2UgKi8KKwljaGFyICogY29uZnN0cjsKKwkvL0NoYWluZWQgbGlzdCBvZiBub25jZQorCXN0cnVjdCBmZF9saXN0IGxpc3Rub25jZTsKKwkvL1RoaXMgd2lsbCBiZSB1c2VkIHRvIGxvY2sgYWNjZXNzIHRvIGNoYWluZWQgbGlzdAorCXB0aHJlYWRfbXV0ZXhfdCBub25jZV9tdXRleDsgCit9OworCit0eXBlZGVmIHN0cnVjdCBub25jZWNoYWluIG5vbmNlY2hhaW47CitzdHJ1Y3Qgbm9uY2VjaGFpbgoreworCXN0cnVjdCBmZF9saXN0IGNoYWluOworICAgIG9zMF90IHNpZDsKKyAgICBzaXplX3Qgc2lkbGVuOworICAgIG9zMF90IG5vbmNlOworICAgIHNpemVfdCBub25jZWxlbjsKKyAgICAKK307CisKK3N0YXRpYyBpbnQgbm9uY2VfYWRkX2VsZW1lbnQob3MwX3Qgbm9uY2UsIHNpemVfdCBub25jZWxlbiwgb3MwX3Qgc2lkLCBzaXplX3Qgc2lkbGVuLCBzdHJ1Y3Qgcmd3cF9jb25maWcgKiBzdGF0ZSkKK3sKKwlDSEVDS19QQVJBTVMobm9uY2UgJiYgc3RhdGUgJiYgc2lkICYmIHNpZGxlbiAmJiBub25jZWxlbik7CisJCisJbm9uY2VjaGFpbiAqbmV3ZWx0OworCUNIRUNLX01BTExPQyhuZXdlbHQ9bWFsbG9jKHNpemVvZihub25jZWNoYWluKSkpOworCQorCUNIRUNLX01BTExPQyhuZXdlbHQtPm5vbmNlPSBvczBkdXAobm9uY2UsIG5vbmNlbGVuKSk7CisJbmV3ZWx0LT5ub25jZWxlbj1ub25jZWxlbjsKKwkKKwlDSEVDS19NQUxMT0MobmV3ZWx0LT5zaWQ9b3MwZHVwKHNpZCwgc2lkbGVuKSk7CisJbmV3ZWx0LT5zaWRsZW49c2lkbGVuOworCQorCWZkX2xpc3RfaW5pdCgmbmV3ZWx0LT5jaGFpbixOVUxMKTsKKwkKKwlDSEVDS19QT1NJWChwdGhyZWFkX211dGV4X2xvY2soJnN0YXRlLT5ub25jZV9tdXRleCkpOworCWZkX2xpc3RfaW5zZXJ0X2JlZm9yZSgmc3RhdGUtPmxpc3Rub25jZSwmbmV3ZWx0LT5jaGFpbik7CisJQ0hFQ0tfUE9TSVgocHRocmVhZF9tdXRleF91bmxvY2soJnN0YXRlLT5ub25jZV9tdXRleCkpOworCQorCXJldHVybiAwOworfQorLyoKK3N0YXRpYyB2b2lkIG5vbmNlX2RlbF9lbGVtZW50KGNoYXIgKiBub25jZSwgc3RydWN0IHJnd3BfY29uZmlnICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgZmRfbGlzdCAqIGxpOworCQorCUNIRUNLX1BBUkFNU19ETyhub25jZSAmJiBzdGF0ZSwgcmV0dXJuKTsKKwkKKwlmb3IobGk9c3RhdGUtPmxpc3Rub25jZS5uZXh0O2xpIT0mc3RhdGUtPmxpc3Rub25jZTtsaT1saS0+bmV4dCkKKwl7CisJCW5vbmNlY2hhaW4gKnRlbXA9KG5vbmNlY2hhaW4gKilsaTsKKwkJCisJCWlmKHN0cmNtcCh0ZW1wLT5ub25jZSxub25jZSk9PTApCisJCXsKKwkJCWZkX2xpc3RfdW5saW5rIChsaSk7CisJCQlmcmVlKHRlbXAtPnNpZCk7CisJCQlmcmVlKHRlbXAtPm5vbmNlKTsKKwkJCWZyZWUodGVtcCk7CisJCQlicmVhazsKKwkJfQorCX0KK30KKyovCisvL1JldHJpZXZlIHNpZCBmcm9tIG5vbmNlCitzdGF0aWMgb3MwX3Qgbm9uY2VfZ2V0X3NpZChvczBfdCBub25jZSwgc2l6ZV90IG5vbmNlbGVuLCBzaXplX3QgKiBzaWRsZW4sIHN0cnVjdCByZ3dwX2NvbmZpZyAqc3RhdGUpCit7CisJc3RydWN0IGZkX2xpc3QgKiBsaTsKKwlvczBfdCBzaWQ9TlVMTDsKKwkKKwlDSEVDS19QQVJBTVNfRE8obm9uY2UgJiYgc3RhdGUgJiYgbm9uY2VsZW4gJiYgc2lkbGVuLCByZXR1cm4gTlVMTCk7CisJKnNpZGxlbj0wOworCQorCS8vICoqU3RhcnQgbXV0ZXgKKwlDSEVDS19QT1NJWF9ETyhwdGhyZWFkX211dGV4X2xvY2soJnN0YXRlLT5ub25jZV9tdXRleCksKTsgCisJZm9yKGxpPXN0YXRlLT5saXN0bm9uY2UubmV4dDtsaSE9JnN0YXRlLT5saXN0bm9uY2U7bGk9bGktPm5leHQpCisJeworCQlub25jZWNoYWluICp0ZW1wPShub25jZWNoYWluICopbGk7CisJCQorCQlpZiAoIWZkX29zX2NtcCh0ZW1wLT5ub25jZSwgdGVtcC0+bm9uY2VsZW4sIG5vbmNlLCBub25jZWxlbikpCisJCXsKKwkJCWZkX2xpc3RfdW5saW5rIChsaSk7CisJCQlzaWQ9dGVtcC0+c2lkOworCQkJKnNpZGxlbj10ZW1wLT5zaWRsZW47CisJCQlmcmVlKHRlbXAtPm5vbmNlKTsKKwkJCWZyZWUodGVtcCk7CisJCQlicmVhazsKKwkJfQorCQkKKwl9CisJQ0hFQ0tfUE9TSVhfRE8ocHRocmVhZF9tdXRleF91bmxvY2soJnN0YXRlLT5ub25jZV9tdXRleCksKTsgCisJLy8gKioqU3RvcCBtdXRleAorCXJldHVybiBzaWQ7Cit9CisKK3N0YXRpYyB2b2lkIG5vbmNlX2RlbGV0ZWxpc3Rub25jZShzdHJ1Y3Qgcmd3cF9jb25maWcgKnN0YXRlKQoreworCS8vICoqU3RhcnQgbXV0ZXgKKwlDSEVDS19QT1NJWF9ETyhwdGhyZWFkX211dGV4X2xvY2soJnN0YXRlLT5ub25jZV9tdXRleCksKTsgCisJd2hpbGUoIShGRF9JU19MSVNUX0VNUFRZKCZzdGF0ZS0+bGlzdG5vbmNlKSkgKQorCXsKKwkJbm9uY2VjaGFpbiAqdGVtcD0obm9uY2VjaGFpbiAqKXN0YXRlLT5saXN0bm9uY2UubmV4dDsKKwkJCisJCWZkX2xpc3RfdW5saW5rICgmdGVtcC0+Y2hhaW4pOworCQlmcmVlKHRlbXAtPnNpZCk7CisJCWZyZWUodGVtcC0+bm9uY2UpOworCQlmcmVlKHRlbXApOworCQkKKwl9CisJQ0hFQ0tfUE9TSVhfRE8ocHRocmVhZF9tdXRleF91bmxvY2soJnN0YXRlLT5ub25jZV9tdXRleCksKTsgCisJLy8gKioqU3RvcCBtdXRleAorfQorCisvKiBJbml0aWFsaXplIHRoZSBwbHVnaW4gKi8KK3N0YXRpYyBpbnQgc2lwX2NvbmZfcGFyc2UoY2hhciAqIGNvbmZmaWxlLCBzdHJ1Y3Qgcmd3cF9jb25maWcgKiogc3RhdGUpCit7CisJc3RydWN0IHJnd3BfY29uZmlnICogbmV3OworCXN0cnVjdCBkaWN0X29iamVjdCAqIGFwcDsKKwkKKwkKKwlUUkFDRV9FTlRSWSgiJXAgJXAiLCBjb25mZmlsZSwgc3RhdGUpOworCUNIRUNLX1BBUkFNUyggc3RhdGUgKTsKKwkKKwlDSEVDS19NQUxMT0MoIG5ldyA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHJnd3BfY29uZmlnKSkgKTsKKwltZW1zZXQobmV3LCAwLCBzaXplb2Yoc3RydWN0IHJnd3BfY29uZmlnKSk7CisJCisJbmV3LT5jb25mc3RyID0gY29uZmZpbGU7CisJCisJLyogUmVzb2x2ZSBhbGwgZGljdGlvbmFyeSBvYmplY3RzIHdlIHVzZSAqLworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiU2Vzc2lvbi1JZCIsICZuZXctPmRpY3QuU2Vzc2lvbl9JZCwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiQXV0aC1BcHBsaWNhdGlvbi1JZCIsICZuZXctPmRpY3QuQXV0aF9BcHBsaWNhdGlvbl9JZCwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiQXV0aC1TZXNzaW9uLVN0YXRlIiwgJm5ldy0+ZGljdC5BdXRoX1Nlc3Npb25fU3RhdGUsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIk9yaWdpbi1Ib3N0IiwgJm5ldy0+ZGljdC5PcmlnaW5fSG9zdCwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiT3JpZ2luLVJlYWxtIiwgJm5ldy0+ZGljdC5PcmlnaW5fUmVhbG0sIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIkRlc3RpbmF0aW9uLVJlYWxtIiwgJm5ldy0+ZGljdC5EZXN0aW5hdGlvbl9SZWFsbSwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiU0lQLUFPUiIsICZuZXctPmRpY3QuU0lQX0FPUiwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiU0lQLU1ldGhvZCIsICZuZXctPmRpY3QuU0lQX01ldGhvZCwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiRGVzdGluYXRpb24tSG9zdCIsICZuZXctPmRpY3QuRGVzdGluYXRpb25fSG9zdCwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiVXNlci1OYW1lIiwgJm5ldy0+ZGljdC5Vc2VyX05hbWUsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIlNJUC1TZXJ2ZXItVVJJIiwgJm5ldy0+ZGljdC5TSVBfU2VydmVyX1VSSSwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiU0lQLU51bWJlci1BdXRoLUl0ZW1zIiwgJm5ldy0+ZGljdC5TSVBfTnVtYmVyX0F1dGhfSXRlbXMsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIlNJUC1BdXRob3JpemF0aW9uIiwgJm5ldy0+ZGljdC5TSVBfQXV0aG9yaXphdGlvbiwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiU0lQLUF1dGgtRGF0YS1JdGVtIiwgJm5ldy0+ZGljdC5TSVBfQXV0aF9EYXRhX0l0ZW0sIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIlNJUC1BdXRoZW50aWNhdGlvbi1TY2hlbWUiLCAmbmV3LT5kaWN0LlNJUF9BdXRoZW50aWNhdGlvbl9TY2hlbWUsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIlNJUC1BdXRoZW50aWNhdGlvbi1JbmZvIiwgJm5ldy0+ZGljdC5TSVBfQXV0aGVudGljYXRpb25fSW5mbywgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiUHJveHktSW5mbyIsICZuZXctPmRpY3QuUHJveHlfSW5mbywgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiUm91dGUtUmVjb3JkIiwgJm5ldy0+ZGljdC5Sb3V0ZV9SZWNvcmQsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIlJlc3VsdC1Db2RlIiwgJm5ldy0+ZGljdC5SZXN1bHRfQ29kZSwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiRGlnZXN0LVVSSSIsICZuZXctPmRpY3QuRGlnZXN0X1VSSSwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiRGlnZXN0LU5vbmNlIiwgJm5ldy0+ZGljdC5EaWdlc3RfTm9uY2UsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIkRpZ2VzdC1NZXRob2QiLCAmbmV3LT5kaWN0LkRpZ2VzdF9NZXRob2QsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIkRpZ2VzdC1DTm9uY2UiLCAmbmV3LT5kaWN0LkRpZ2VzdF9DTm9uY2UsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIkRpZ2VzdC1Ob25jZS1Db3VudCIsICZuZXctPmRpY3QuRGlnZXN0X05vbmNlX0NvdW50LCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJEaWdlc3QtUmVhbG0iLCAmbmV3LT5kaWN0LkRpZ2VzdF9SZWFsbSwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiRGlnZXN0LVJlc3BvbnNlIiwgJm5ldy0+ZGljdC5EaWdlc3RfUmVzcG9uc2UsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIkRpZ2VzdC1SZXNwb25zZS1BdXRoIiwgJm5ldy0+ZGljdC5EaWdlc3RfUmVzcG9uc2VfQXV0aCwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiRGlnZXN0LVVzZXJuYW1lIiwgJm5ldy0+ZGljdC5EaWdlc3RfVXNlcm5hbWUsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIkRpZ2VzdC1BbGdvcml0aG0iLCAmbmV3LT5kaWN0LkRpZ2VzdF9BbGdvcml0aG0sIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIkRpZ2VzdC1Rb1AiLCAmbmV3LT5kaWN0LkRpZ2VzdF9RT1AsIEVOT0VOVCkgKTsKKworCisJCisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FQUExJQ0FUSU9OLCBBUFBMSUNBVElPTl9CWV9OQU1FLCAiRGlhbWV0ZXIgU2Vzc2lvbiBJbml0aWF0aW9uIFByb3RvY29sIChTSVApIEFwcGxpY2F0aW9uIiwgJmFwcCwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGlzcF9hcHBfc3VwcG9ydCAoIGFwcCwgTlVMTCwgMSwgMCApICk7CisJCisJLy9jaGFpbmVkIGxpc3QKKwlmZF9saXN0X2luaXQoJm5ldy0+bGlzdG5vbmNlLE5VTEwpOworCUNIRUNLX1BPU0lYKHB0aHJlYWRfbXV0ZXhfaW5pdCgmbmV3LT5ub25jZV9tdXRleCxOVUxMKSk7CisJCisJKnN0YXRlID0gbmV3OworCXJldHVybiAwOworfQorCisvKiBkZWluaXRpYWxpemUgKi8KK3N0YXRpYyB2b2lkIHNpcF9jb25mX2ZyZWUoc3RydWN0IHJnd3BfY29uZmlnICogc3RhdGUpCit7CisJVFJBQ0VfRU5UUlkoIiVwIiwgc3RhdGUpOworCUNIRUNLX1BBUkFNU19ETyggc3RhdGUsIHJldHVybiApOworCQorCW5vbmNlX2RlbGV0ZWxpc3Rub25jZShzdGF0ZSk7CisJQ0hFQ0tfUE9TSVhfRE8ocHRocmVhZF9tdXRleF9kZXN0cm95KCZzdGF0ZS0+bm9uY2VfbXV0ZXgpLCAvKmNvbnRpbnVlKi8pOworCQorCWZyZWUoc3RhdGUpOworCXJldHVybjsKK30KKworLyogSGFuZGxlIGFuIGluY29taW5nIFJBRElVUyByZXF1ZXN0ICovCitzdGF0aWMgaW50IHNpcF9yYWRfcmVxKCBzdHJ1Y3Qgcmd3cF9jb25maWcgKiBjcywgc3RydWN0IHJhZGl1c19tc2cgKiByYWRfcmVxLCBzdHJ1Y3QgcmFkaXVzX21zZyAqKiByYWRfYW5zLCBzdHJ1Y3QgbXNnICoqIGRpYW1fZncsIHN0cnVjdCByZ3dfY2xpZW50ICogY2xpICkKK3sKKwlpbnQgaWR4OworCWludCBnb3RfQU9SID0gMDsKKwlpbnQgZ290X0R1c2VybmFtZSA9IDA7CisJaW50IGdvdF9EcmVhbG0gPSAwOworCWludCBnb3RfRHVyaSA9IDA7CisJaW50IGdvdF9EbWV0aG9kID0gMDsKKwlpbnQgZ290X0Rub25jZSA9IDA7CisJaW50IGdvdF9EcmVzcG9uc2UgPSAwOworCWludCBnb3RfRGFsZ29yaXRobSA9IDA7CisJb3MwX3Qgc2lkID0gTlVMTDsKKwlzaXplX3Qgc2lkbGVuOworCW9zMF90IHVuPU5VTEw7CisJc2l6ZV90ICB1bl9sZW47CisJc2l6ZV90IG5hdHRyX3VzZWQgPSAwOworCXN0cnVjdCBhdnAgKmF1dGhfZGF0YT1OVUxMLCAqYXV0aD1OVUxMLCAqYXZwID0gTlVMTDsKKwl1bmlvbiBhdnBfdmFsdWUgdmFsdWU7CisJc3RydWN0IHNlc3Npb24gKiBzZXNzOworCQorCVRSQUNFX0VOVFJZKCIlcCAlcCAlcCAlcCAlcCIsIGNzLCByYWRfcmVxLCByYWRfYW5zLCBkaWFtX2Z3LCBjbGkpOworCQorCUNIRUNLX1BBUkFNUyhyYWRfcmVxICYmIChyYWRfcmVxLT5oZHItPmNvZGUgPT0gUkFESVVTX0NPREVfQUNDRVNTX1JFUVVFU1QpICYmIHJhZF9hbnMgJiYgZGlhbV9mdyAmJiAqZGlhbV9mdyk7CisJCisJLyoKKwkgICBSRkM1MDkwIFJBRElVUyBFeHRlbnNpb24gRGlnZXN0IEFwcGxpY2F0aW9uCisJKi8KKwlDSEVDS19GQ1QoIGZkX21zZ19zZXNzX2dldChmZF9nX2NvbmZpZy0+Y25mX2RpY3QsICpkaWFtX2Z3LCAmc2VzcywgTlVMTCkgKTsKKwlpZiAoc2VzcyAhPSBOVUxMKSB7CisJCVRSQUNFX0RFQlVHKElORk8sIklOVEVSTkFMIEVSUk9SOiBXZSBhcmUgbm90IHN1cHBvc2VkIHRvIHJlY2VpdmUgYSBzZXNzaW9uIGluIHJhZFNJUCBwbHVnaW4uIik7CisJCXJldHVybiBFSU5WQUw7CQkKKwl9CisJCisJLyogQ2hlY2sgYmFzaWMgaW5mb3JtYXRpb24gaXMgdGhlcmUgKi8KKwlmb3IgKGlkeCA9IDA7IGlkeCA8IHJhZF9yZXEtPmF0dHJfdXNlZDsgaWR4KyspIHsKKwkJc3RydWN0IHJhZGl1c19hdHRyX2hkciAqIGF0dHIgPSAoc3RydWN0IHJhZGl1c19hdHRyX2hkciAqKShyYWRfcmVxLT5idWYgKyByYWRfcmVxLT5hdHRyX3Bvc1tpZHhdKTsKKwkJCisJCQorCQlzd2l0Y2ggKGF0dHItPnR5cGUpIHsKKwkJCQorCQkJY2FzZSBSQURJVVNfQVRUUl9VU0VSX05BTUU6CisJCQkJaWYgKGF0dHItPmxlbmd0aD5zaXplb2Yoc3RydWN0IHJhZGl1c19hdHRyX2hkcikpIAorCQkJCXsKKwkJCQkJVFJBQ0VfREVCVUcoQU5OT1lJTkcsICJGb3VuZCBhIFVzZXItTmFtZSBhdHRyaWJ1dGU6ICclLipzJyIsIChpbnQpKGF0dHItPmxlbmd0aC0gc2l6ZW9mKHN0cnVjdCByYWRpdXNfYXR0cl9oZHIpKSwgKGNoYXIgKikoYXR0cisxKSk7CisJCQkJCXVuID0gKG9zMF90KShhdHRyICsgMSk7CisJCQkJCXVuX2xlbiA9YXR0ci0+bGVuZ3RoIC0gc2l6ZW9mKHN0cnVjdCByYWRpdXNfYXR0cl9oZHIpOworCQkJCX0KKwkJCWJyZWFrOworCQkJY2FzZSBSQURJVVNfQVRUUl9ESUdFU1RfVVNFUk5BTUU6CisJCQkJZ290X0R1c2VybmFtZSA9IDE7CisJCQlicmVhazsKKwkJCWNhc2UgUkFESVVTX0FUVFJfRElHRVNUX1JFQUxNOgorCQkJCWdvdF9EcmVhbG0gPSAxOworCQkJYnJlYWs7CisJCQljYXNlIFJBRElVU19BVFRSX0RJR0VTVF9VUkk6CisJCQkJZ290X0R1cmkgPSAxOworCQkJYnJlYWs7CisJCQljYXNlIFJBRElVU19BVFRSX0RJR0VTVF9NRVRIT0Q6CisJCQkJZ290X0RtZXRob2QgPSAxOworCQkJYnJlYWs7CisJCQkvLyBjYXNlIFJBRElVU19BVFRSX0RJR0VTVF9RT1A6CisJCQkvLyAJZ290X0Rxb3AgPSAxOworCQkJLy8gYnJlYWs7CisJCQkvLyBjYXNlIFJBRElVU19BVFRSX0RJR0VTVF9OT05DRV9DT1VOVDoKKwkJCS8vIAlnb3RfRG5vbmNlX2NvdW50ID0gMTsKKwkJCS8vIGJyZWFrOworCQkJY2FzZSBSQURJVVNfQVRUUl9ESUdFU1RfTk9OQ0U6CisJCQkJZ290X0Rub25jZSA9IDE7CisJCQkJCisJCQkJc2lkPW5vbmNlX2dldF9zaWQoKG9zMF90KShhdHRyKzEpLCBhdHRyLT5sZW5ndGggLSBzaXplb2Yoc3RydWN0IHJhZGl1c19hdHRyX2hkciksICZzaWRsZW4sIGNzKTsKKwkJCQlpZighc2lkKQorCQkJCXsKKwkJCQkJVFJBQ0VfREVCVUcoSU5GTywiV2UgaGF2ZW4ndCBmb3VuZCB0aGUgc2Vzc2lvbi4nIik7CisJCQkJCXJldHVybiBFSU5WQUw7CisJCQkJfQorCQkJCUNIRUNLX0ZDVChmZF9zZXNzX2Zyb21zaWRfbXNnIChzaWQsIHNpZGxlbiwgJnNlc3MsIE5VTEwpKTsKKwkJCQlmcmVlKHNpZCk7CisJCQkJCQkJCisJCQkJCisJCQlicmVhazsKKwkJCS8vIGNhc2UgUkFESVVTX0FUVFJfRElHRVNUX0NOT05DRToKKwkJCS8vIAlnb3RfRGNub25jZSA9IDE7CisJCQkvLyBicmVhazsKKwkJCWNhc2UgUkFESVVTX0FUVFJfRElHRVNUX1JFU1BPTlNFOgorCQkJCWdvdF9EcmVzcG9uc2UgPSAxOworCQkJYnJlYWs7CQkJCisJCQljYXNlIFJBRElVU19BVFRSX0RJR0VTVF9BTEdPUklUSE06CisJCQkJZ290X0RhbGdvcml0aG0gPSAxOworCQkJYnJlYWs7CisJCQljYXNlIFJBRElVU19BVFRSX1NJUF9BT1I6CisJCQkJZ290X0FPUiA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZighdW4pCisJeworCQlUUkFDRV9ERUJVRyhJTkZPLCJObyBVc2VybmFtZSBpbiByZXF1ZXN0Iik7CisJCXJldHVybiBFSU5WQUw7CisJfQorCisJLyogQ3JlYXRlIHRoZSBzZXNzaW9uIGlmIGl0IGlzIG5vdCBhbHJlYWR5IGRvbmUgKi8KKwlpZiAoIXNlc3MpIHsKKwkJCisJCURpYW1JZF90IGZxZG47CisJCXNpemVfdCBmcWRuX2xlbjsKKwkJRGlhbUlkX3QgcmVhbG07CisJCXNpemVfdCByZWFsbV9sZW47CisJCQorCQkvKiBHZXQgaW5mb3JtYXRpb24gb24gdGhlIFJBRElVUyBjbGllbnQgKi8KKwkJQ0hFQ0tfRkNUKCByZ3dfY2xpZW50c19nZXRfb3JpZ2luKGNsaSwgJmZxZG4sICZmcWRuX2xlbiwgJnJlYWxtLCAmcmVhbG1fbGVuKSApOworCQkKKwkJLyogQ3JlYXRlIGEgbmV3IFNlc3Npb24tSWQuIFRoZSBmb3JtYXQgaXM6IHtmcWRuO2hpMzI7bG8zMjt1c2VybmFtZTtkaWFtaWR9ICovCisJCUNIRUNLX01BTExPQyggc2lkID0gbWFsbG9jKHVuX2xlbiArIDEgLyogJzsnICovICsgZmRfZ19jb25maWctPmNuZl9kaWFtaWRfbGVuICsgMSAvKiAnXDAnICovKSApOworCQlzaWRsZW4gPSBzcHJpbnRmKChjaGFyICopc2lkLCAiJS4qczslcyIsIChpbnQpdW5fbGVuLCB1biwgZmRfZ19jb25maWctPmNuZl9kaWFtaWQpOworCQlDSEVDS19GQ1QoIGZkX3Nlc3NfbmV3KCZzZXNzLCBmcWRuLCBmcWRuX2xlbiwgc2lkLCBzaWRsZW4pICk7CisJCWZyZWUoc2lkKTsKKwl9CisJCisJLyogTm93LCBhZGQgdGhlIFNlc3Npb24tSWQgQVZQIGF0IGJlZ2lubmluZyBvZiBEaWFtZXRlciBtZXNzYWdlICovCisJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIGNzLT5kaWN0LlNlc3Npb25fSWQsIDAsICZhdnAgKSApOworCXZhbHVlLm9zLmRhdGEgPSBzaWQ7CisJdmFsdWUub3MubGVuID0gc2lkbGVuOworCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9zZXR2YWx1ZSAoIGF2cCwgJnZhbHVlICkgKTsKKwlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkICggKmRpYW1fZncsIE1TR19CUldfRklSU1RfQ0hJTEQsIGF2cCkgKTsKKwkKKwlUUkFDRV9ERUJVRyhGVUxMLCAiW3NpcC5yZ3d4XSBUcmFuc2xhdGluZyBuZXcgbWVzc2FnZSBmb3Igc2Vzc2lvbiAnJXMnLi4uIiwgc2lkKTsKKwkKKwkvKiBOb3cgYWRkIHRoaXMgc2Vzc2lvbiBpbiB0aGUgbWVzc2FnZSAqLworCUNIRUNLX0ZDVCggZmRfbXNnX3Nlc3Nfc2V0KCpkaWFtX2Z3LCBzZXNzKSApOworCQkKKwkvKiBBZGQgdGhlIERlc3RpbmF0aW9uLVJlYWxtIEFWUCAqLworCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBjcy0+ZGljdC5EZXN0aW5hdGlvbl9SZWFsbSwgMCwgJmF2cCApICk7CisJCisJaW50IGkgPSAwOworCQorCS8qIElzIHRoZXJlIGFuICdAJyBpbiB0aGUgdXNlciBuYW1lPyBXZSBkb24ndCBjYXJlIGZvciBkZWNvcmF0ZWQgTkFJIGhlcmUgKi8KKwlmb3IgKGkgPSB1bl9sZW4gLSAyOyBpID4gMDsgaS0tKSB7CisJCWlmICh1bltpXSA9PSAnQCcpIHsKKwkJCWkrKzsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGkgPT0gMCkgeworCQkvKiBOb3QgZm91bmQgaW4gdGhlIFVzZXItTmFtZSA9PiB3ZSB1c2UgdGhlIGxvY2FsIGRvbWFpbiBvZiB0aGlzIGdhdGV3YXkgKi8KKwkJdmFsdWUub3MuZGF0YSA9IChvczBfdClmZF9nX2NvbmZpZy0+Y25mX2RpYW1ybG07CisJCXZhbHVlLm9zLmxlbiAgPSBmZF9nX2NvbmZpZy0+Y25mX2RpYW1ybG1fbGVuOworCX0gZWxzZSB7CisJCXZhbHVlLm9zLmRhdGEgPSB1biArIGk7CisJCXZhbHVlLm9zLmxlbiAgPSB1bl9sZW4gLSBpOworCX0KKwkKKwlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUgKCBhdnAsICZ2YWx1ZSApICk7CisJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCAoICpkaWFtX2Z3LCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCkgKTsKKwkKKwkvKgorCUlmIHRoZSBSQURJVVMgQWNjZXNzLVJlcXVlc3QgbWVzc2FnZSBkb2VzIG5vdAorCWNvbnRhaW4gYW55IERpZ2VzdC0qIGF0dHJpYnV0ZSwgdGhlbiB0aGUgUkFESVVTIGNsaWVudCBkb2VzIG5vdCB3YW50CisJdG8gYXBwbHkgSFRUUCBEaWdlc3QgYXV0aGVudGljYXRpb24sIGluIHdoaWNoIGNhc2UsIGFjdGlvbnMgYXQgdGhlCisJZ2F0ZXdheSBhcmUgb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhpcyBkb2N1bWVudC4KKwkqLworCQorCWlmKCEoZ290X0RtZXRob2QgJiYgZ290X0R1cmkpKQorCXsKKwkJVFJBQ0VfREVCVUcoSU5GTywiTm8gRGlnZXN0IGF0dHJpYnV0ZXMgaW4gcmVxdWVzdCwgd2UgZHJvcCBpdC4uLiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBBZGQgdGhlIGFwcHJvcHJpYXRlIGNvbW1hbmQgY29kZSAmIEF1dGgtQXBwbGljYXRpb24tSWQgKi8KKwl7CisJCXN0cnVjdCBtc2dfaGRyICogaGVhZGVyID0gTlVMTDsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfaGRyICggKmRpYW1fZncsICZoZWFkZXIgKSApOworCQloZWFkZXItPm1zZ19mbGFncyA9IENNRF9GTEFHX1JFUVVFU1QgfCBDTURfRkxBR19QUk9YSUFCTEU7CisJCWhlYWRlci0+bXNnX2NvZGUgPSBDQ19NVUxUSU1FRElBX0FVVEhfUkVRVUVTVDsKKwkJaGVhZGVyLT5tc2dfYXBwbCA9IEFJX1NJUDsKKwkKKwkKKwkJLyogQWRkIHRoZSBBdXRoLUFwcGxpY2F0aW9uLUlkICovCisJCXsKKwkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBjcy0+ZGljdC5BdXRoX0FwcGxpY2F0aW9uX0lkLCAwLCAmYXZwICkgKTsKKwkJCXZhbHVlLmkzMiA9IGhlYWRlci0+bXNnX2FwcGw7CisJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUgKCBhdnAsICZ2YWx1ZSApICk7CisJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkICggKmRpYW1fZncsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwKSApOworCQl9CisJfQorCS8qQWRkIEF1dGhfU2Vzc2lvbl9TdGF0ZSAgQVZQICovCisJeworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3ICggY3MtPmRpY3QuQXV0aF9TZXNzaW9uX1N0YXRlLCAwLCAmYXZwICkgKTsKKwkJdmFsdWUuaTMyID0gQUNWX0FTU19OT19TVEFURV9NQUlOVEFJTkVEOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUgKCBhdnAsICZ2YWx1ZSApICk7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQgKCAqZGlhbV9mdywgTVNHX0JSV19MQVNUX0NISUxELCBhdnApICk7CisJfQorCisJCisJLypBZGQgU0lQX051bWJlcl9BdXRoX0l0ZW1zICBBVlAgKi8KKwl7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBjcy0+ZGljdC5TSVBfTnVtYmVyX0F1dGhfSXRlbXMsIDAsICZhdnAgKSApOworCQl2YWx1ZS5pMzIgPSAxOyAvL1dlIGp1c3QgdHJlYXQgb25lIGF1dGggcGVyIHJlcXVlc3QgaW4gZ2F0ZXdheQorCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUgKCBhdnAsICZ2YWx1ZSApICk7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQgKCAqZGlhbV9mdywgTVNHX0JSV19MQVNUX0NISUxELCBhdnApICk7CisJfQorCisJLyogQWRkIFNJUF9BdXRoX0RhdGFfSXRlbSBBVlAgKi8KKwl7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBjcy0+ZGljdC5TSVBfQXV0aF9EYXRhX0l0ZW0sIDAsICZhdXRoX2RhdGEgKSApOworCX0KKwkvKiBBZGQgU0lQX0F1dGhlbnRpY2F0aW9uX1NjaGVtZSBBVlAgKi8KKwl7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBjcy0+ZGljdC5TSVBfQXV0aGVudGljYXRpb25fU2NoZW1lLCAwLCAmYXZwICkgKTsKKwkJdmFsdWUuaTMyPTA7IC8vVGhlcmUgaXMgb25seSBEaWdlc3QgQXV0aCBpbiBSRkMgZm9yIG5vdworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUgKCBhdnAsICZ2YWx1ZSApICk7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQgKCBhdXRoX2RhdGEsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwKSApOworCQorCX0KKworCQorCS8qIEFkZCBTSVBfQXV0aG9yaXphdGlvbiBBVlAgKi8KKwl7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBjcy0+ZGljdC5TSVBfQXV0aG9yaXphdGlvbiwgMCwgJmF1dGggKSApOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkICggYXV0aF9kYXRhLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF1dGgpICk7CisJfQorCisJZm9yIChpZHggPSAwOyBpZHggPCByYWRfcmVxLT5hdHRyX3VzZWQ7IGlkeCsrKSAKKwl7CisJCXN0cnVjdCByYWRpdXNfYXR0cl9oZHIgKiBhdHRyID0gKHN0cnVjdCByYWRpdXNfYXR0cl9oZHIgKikocmFkX3JlcS0+YnVmICsgcmFkX3JlcS0+YXR0cl9wb3NbaWR4XSk7CisJCQorCQlzd2l0Y2ggKGF0dHItPnR5cGUpIHsKKworCQkJY2FzZSBSQURJVVNfQVRUUl9VU0VSX05BTUU6CisJCQlDT05WMkRJQU1fU1RSKCBVc2VyX05hbWUgKTsKKwkJCQorCQkJaWYoIWdvdF9EdXNlcm5hbWUpCisJCQl7CisJCQkJQ09OVjJESUFNX1NUUl9BVVRIKERpZ2VzdF9Vc2VybmFtZSk7CisJCQkJZ290X0R1c2VybmFtZT0xOworCQkJfQorCQkJCisJCQlicmVhazsKKworCQkJY2FzZSBSQURJVVNfQVRUUl9ESUdFU1RfVVJJOgorCQkJCisJCQlDT05WMkRJQU1fU1RSX0FVVEgoRGlnZXN0X1VSSSk7CisJCQkKKwkJCS8vQWxsIG9mIHRoZXNlIGF0dHJpYnV0ZXMgYXJlIHJlcXVpcmVkIGJ5IERpYW1ldGVyIGJ1dCBub3QgZGVmaW5lZCBpbiBSRkM1MDkwIHNvIHdlIHByb3ZpZGUgRkFLRSB2YWx1ZXMgKG9ubHkgaW4gZmlyc3QgZXhjaGFuZ2UpCisJCQlpZighZ290X0FPUikKKwkJCXsKKwkJCQlDT05WMkRJQU1fU1RSKCBTSVBfQU9SICk7CisJCQkJZ290X0FPUj0xOworCQkJfQorCQkJLyoKKwkJCVdlIG11c3QgcHJvdmlkZSBhIGZha2Ugbm9uY2UgYmVjYXVzZSBvZiBSRkM0NzQwIHByb2JsZW0KKwkJCVRPRE86IHJlbW92ZSB3aGVuIFJGQyBpcyB1cGRhdGVkCisJCQk9PVNUQVJUIG9mIEZBS0UKKwkJCSovCisJCQlpZighZ290X0RyZXNwb25zZSkKKwkJCXsKKwkJCQlDT05WMkRJQU1fU1RSX0FVVEgoRGlnZXN0X1Jlc3BvbnNlKTsKKwkJCQlnb3RfRHJlc3BvbnNlPTE7CisJCQl9CisJCQkvKgorCQkJPT1FTkQgb2YgRkFLRQorCQkJKi8KKwkJCWlmKCFnb3RfRHJlYWxtKQorCQkJeworCQkJCS8vV2UgZXh0cmFjdCBSZWFsbSBmcm9tIERpZ2VzdF9VUkkKKwkJCQlEaWFtSWRfdCByZWFsbT1OVUxMOworCQkJCXNpemVfdCByZWFsbV9sZW4gPSAwOworCQkJCW9zMF90IHRlbXA7CisJCQkJCisJCQkJdGVtcCA9IChvczBfdCkoYXR0ciArIDEpOworCQkJCQorCQkJCWZvciAoaT1hdHRyLT5sZW5ndGggLSBzaXplb2Yoc3RydWN0IHJhZGl1c19hdHRyX2hkcikgLSAxOyBpPj0wOyBpLS0pIHsKKwkJCQkJaWYgKHRlbXBbaV0gPT0gJ0AnKSB7CisJCQkJCQlyZWFsbSA9IChEaWFtSWRfdCl0ZW1wICsgaSArIDE7CisJCQkJCQlDSEVDS19GQ1RfRE8oIGZkX29zX3ZhbGlkYXRlX0RpYW1ldGVySWRlbnRpdHkoJnJlYWxtLCAmcmVhbG1fbGVuLCAxKSwKKwkJCQkJCQlyZWFsbSA9IE5VTEwgKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJCisJCQkJaWYocmVhbG0hPU5VTEwpCisJCQkJeworCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3ICggY3MtPmRpY3QuRGlnZXN0X1JlYWxtLCAwLCAmYXZwICkgKTsKKwkJCQkJdmFsdWUub3MuZGF0YT0ob3MwX3QpcmVhbG07CisJCQkJCXZhbHVlLm9zLmxlbj1yZWFsbV9sZW47CisJCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9zZXR2YWx1ZSAoIGF2cCwgJnZhbHVlICkgKTsKKwkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCAoIGF1dGgsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwKSApOworCQkJCQkKKwkJCQkJLy9XZSBhZGQgU0lQLVNlcnZlci1VUkkgQVZQIGJlY2F1c2UgU0lQIHNlcnZlciBpcyByZWdpc3RyYXIgKHRocm91Z2ggZ2F0ZXdheSkKKwkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIGNzLT5kaWN0LlNJUF9TZXJ2ZXJfVVJJLCAwLCAmYXZwICkgKTsKKwkJCQkJdmFsdWUub3MuZGF0YT0ob3MwX3QpcmVhbG07CisJCQkJCXZhbHVlLm9zLmxlbj1yZWFsbV9sZW47CisJCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9zZXR2YWx1ZSAoIGF2cCwgJnZhbHVlICkgKTsKKwkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCAoICpkaWFtX2Z3LCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCkgKTsKKwkJCQkJCisJCQkJCWZyZWUocmVhbG0pOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlUUkFDRV9ERUJVRyhJTkZPLCAiQ2FuJ3QgZXh0cmFjdCBkb21haW4gZnJvbSBVUkksIGRyb3BpbmcgcmVxdWVzdC4uLiIpOworCQkJCQlyZXR1cm4gMTsKKwkJCQl9CQorCQkJCWdvdF9EcmVhbG09MTsKKwkJCX0KKwkJCWJyZWFrOworCisJCQljYXNlIFJBRElVU19BVFRSX0RJR0VTVF9NRVRIT0Q6CisJCQlDT05WMkRJQU1fU1RSKFNJUF9NZXRob2QpOworCQkJQ09OVjJESUFNX1NUUl9BVVRIKERpZ2VzdF9NZXRob2QpOworCQkJYnJlYWs7CisJCQljYXNlIFJBRElVU19BVFRSX0RJR0VTVF9SRUFMTToKKwkJCUNPTlYyRElBTV9TVFJfQVVUSChEaWdlc3RfUmVhbG0pOworCQkJCisJCQkvL1dlIGFkZCBTSVAtU2VydmVyLVVSSSBBVlAgYmVjYXVzZSBTSVAgc2VydmVyIGlzIHJlZ2lzdHJhciAodGhyb3VnaCBnYXRld2F5KQorCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIGNzLT5kaWN0LlNJUF9TZXJ2ZXJfVVJJLCAwLCAmYXZwICkgKTsKKwkJCW9zMF90IHRlbXA7CisJCQkjZGVmaW5lIFNJUF9QUkVGSVgJInNpcDoiCisJCQlzaXplX3QgdGVtcF9sZW4gPSBhdHRyLT5sZW5ndGggLSBzaXplb2Yoc3RydWN0IHJhZGl1c19hdHRyX2hkcikgKyBDT05TVFNUUkxFTihTSVBfUFJFRklYKSArIDE7CisJCQlDSEVDS19NQUxMT0MoIHRlbXAgPSBtYWxsb2ModGVtcF9sZW4pICk7CisJCQl0ZW1wX2xlbiA9IHNucHJpbnRmKChjaGFyICopdGVtcCwgdGVtcF9sZW4sIFNJUF9QUkVGSVggIiUuKnMiLCAoaW50KShhdHRyLT5sZW5ndGggLSBzaXplb2Yoc3RydWN0IHJhZGl1c19hdHRyX2hkcikpLCAoY2hhciAqKShhdHRyICsgMSkpOworCQkJCisJCQl2YWx1ZS5vcy5kYXRhPXRlbXA7CisJCQl2YWx1ZS5vcy5sZW49dGVtcF9sZW47CisJCQkKKwkJCWZyZWUodGVtcCk7CisJCQkKKwkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9zZXR2YWx1ZSAoIGF2cCwgJnZhbHVlICkgKTsKKwkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQgKCAqZGlhbV9mdywgTVNHX0JSV19MQVNUX0NISUxELCBhdnApICk7CisJCQlicmVhazsKKwkJCQorCQkJY2FzZSBSQURJVVNfQVRUUl9ESUdFU1RfVVNFUk5BTUU6CisJCQlDT05WMkRJQU1fU1RSX0FVVEgoRGlnZXN0X1VzZXJuYW1lKTsKKwkJCWJyZWFrOworCQkJCQorCQkJY2FzZSBSQURJVVNfQVRUUl9ESUdFU1RfUU9QOgorCQkJQ09OVjJESUFNX1NUUl9BVVRIKCBEaWdlc3RfUU9QICk7CisJCQlicmVhazsKKwkJCWNhc2UgUkFESVVTX0FUVFJfRElHRVNUX0FMR09SSVRITToJCQorCQkJQ09OVjJESUFNX1NUUl9BVVRIKCBEaWdlc3RfQWxnb3JpdGhtICk7CisJCQlicmVhazsKKwkJCWNhc2UgUkFESVVTX0FUVFJfRElHRVNUX0NOT05DRToKKwkJCUNPTlYyRElBTV9TVFJfQVVUSCggRGlnZXN0X0NOb25jZSApOworCQkJYnJlYWs7CisJCQljYXNlIFJBRElVU19BVFRSX0RJR0VTVF9OT05DRToKKwkJCQlDT05WMkRJQU1fU1RSX0FVVEgoIERpZ2VzdF9Ob25jZSApOworCQkJYnJlYWs7CisJCQljYXNlIFJBRElVU19BVFRSX0RJR0VTVF9OT05DRV9DT1VOVDoKKwkJCUNPTlYyRElBTV9TVFJfQVVUSCggRGlnZXN0X05vbmNlX0NvdW50ICk7CisJCQlicmVhazsKKwkJCWNhc2UgUkFESVVTX0FUVFJfRElHRVNUX1JFU1BPTlNFOgorCQkJQ09OVjJESUFNX1NUUl9BVVRIKCBEaWdlc3RfUmVzcG9uc2UgKTsKKwkJCWJyZWFrOworCQkJY2FzZSBSQURJVVNfQVRUUl9TSVBfQU9SOgorCQkJQ09OVjJESUFNX1NUUiggU0lQX0FPUiApOworCQkJYnJlYWs7CisJCQkJCisJCQlkZWZhdWx0OgorCQkJaWYoIWdvdF9EYWxnb3JpdGhtKQorCQkJeworCQkJCS8vW05vdGUgM10gSWYgRGlnZXN0LUFsZ29yaXRobSBpcyBtaXNzaW5nLCAnTUQ1JyBpcyBhc3N1bWVkLgorCQkJCSNkZWZpbmUgRElHRVNUX0FMR09fTUQ1CSJNRDUiCisJCQkJCQkJCQkJCisJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIGNzLT5kaWN0LkRpZ2VzdF9BbGdvcml0aG0sIDAsICZhdnAgKSApOwkJCQorCQkJCQkJCQkJCQorCQkJCXZhbHVlLm9zLmRhdGEgPSAob3MwX3QpRElHRVNUX0FMR09fTUQ1OworCQkJCXZhbHVlLm9zLmxlbiA9IENPTlNUU1RSTEVOKERJR0VTVF9BTEdPX01ENSkgLSAxOworCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9zZXR2YWx1ZSAoIGF2cCwgJnZhbHVlICkgKTsJCQkJCQorCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQgKCBhdXRoLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCkgKTsJCisJCQkJZ290X0RhbGdvcml0aG09MTsJCisJCQl9CisJCQkKKwkJCWlmKCFnb3RfRG5vbmNlKQorCQkJeworCQkJCS8vV2UgZ2l2ZSBhIGZha2Ugbm9uY2UgYmVjYXVzZSBpdCB3aWxsIGJlIGNhbGN1bGF0ZWQgYXQgdGhlIHNlcnZlci4KKwkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3ICggY3MtPmRpY3QuRGlnZXN0X05vbmNlLCAwLCAmYXZwICkgKTsKKwkJCQl2YWx1ZS5vcy5kYXRhPSh1bnNpZ25lZCBjaGFyICopIm5vbmNlIjsKKwkJCQl2YWx1ZS5vcy5sZW49c3RybGVuKChjb25zdCBjaGFyICopdmFsdWUub3MuZGF0YSk7CisJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX3NldHZhbHVlICggYXZwLCAmdmFsdWUgKSApOworCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQgKCBhdXRoLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCkgKTsJCisJCQkJZ290X0Rub25jZT0xOworCQkJfQorCQkJYnJlYWs7CisJCisJCX0KKwl9CisKKwkKKwlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkICggKmRpYW1fZncsIE1TR19CUldfTEFTVF9DSElMRCwgYXV0aF9kYXRhKSApOworCQorCS8qIFVwZGF0ZSB0aGUgcmFkaXVzIG1lc3NhZ2UgdG8gcmVtb3ZlIGFsbCBoYW5kbGVkIGF0dHJpYnV0ZXMgKi8KKwlyYWRfcmVxLT5hdHRyX3VzZWQgPSBuYXR0cl91c2VkOworCisJLy9mZF9tc2dfZHVtcF93YWxrKDEsKmRpYW1fZncpOworCQorCQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNpcF9kaWFtX2Fucyggc3RydWN0IHJnd3BfY29uZmlnICogY3MsIHN0cnVjdCBtc2cgKiogZGlhbV9hbnMsIHN0cnVjdCByYWRpdXNfbXNnICoqIHJhZF9mdywgc3RydWN0IHJnd19jbGllbnQgKiBjbGkgKQoreworCQorCQorCXN0cnVjdCBhdnAgKmF2cCwgKm5leHQ7CisJc3RydWN0IGF2cF9oZHIgKmFoZHI7CisJLy9jaGFyIGJ1ZlsyNTRdOyAvKiB0byBzdG9yZSBzb21lIGF0dHJpYnV0ZXMgdmFsdWVzICh3aXRoIGZpbmFsICdcMCcpICovCisJc3RydWN0IHNlc3Npb24gKiBzZXNzOworCW9zMF90IHNpZCA9IE5VTEw7CisJc2l6ZV90IHNpZGxlbjsKKwkKKwlUUkFDRV9FTlRSWSgiJXAgJXAgJXAgJXAiLCBjcywgZGlhbV9hbnMsIHJhZF9mdywgY2xpKTsKKwlDSEVDS19QQVJBTVMoY3MgJiYgZGlhbV9hbnMgJiYgKmRpYW1fYW5zICYmIHJhZF9mdyAmJiAqcmFkX2Z3KTsKKwkKKwkKKwkvKiBNQUNST1MgdG8gaGVscCBpbiB0aGUgcHJvY2VzczogY29udmVydCBBVlAgZGF0YSB0byBSQURJVVMgYXR0cmlidXRlcy4gKi8KKwkvKiBDb250cm9sIGxhcmdlIGF0dHJpYnV0ZXM6ICBfdHJ1bmNfID0gMCA9PiBlcnJvcjsgX3RydW5jXyA9IDEgPT4gdHJ1bmNhdGU7IF90cnVuYyA9IDIgPT4gY3JlYXRlIHNldmVyYWwgYXR0cmlidXRlcyAqLworCSNkZWZpbmUgQ09OVjJSQURfU1RSKCBfYXR0cl8sIF9kYXRhXywgX2xlbl8sIF90cnVuY18pCXsJCQkJCVwKKwkJc2l6ZV90IF9fbCA9IChzaXplX3QpKF9sZW5fKTsJCQkJCQkJCVwKKwkJc2l6ZV90IF9fb2ZmID0gMDsJCQkJCQkJCQlcCisJCVRSQUNFX0RFQlVHKEZVTEwsICJDb252ZXJ0aW5nIEFWUCB0byAiI19hdHRyXyk7CQkJCQkJXAorCQlpZiAoKF90cnVuY18pID09IDApIHsJCQkJCQkJCQlcCisJCQlDSEVDS19QQVJBTVMoIF9fbCA8PSAyNTMgKTsJCQkJCQkJXAorCQl9CQkJCQkJCQkJCQlcCisJCWlmICgoX19sID4gMjUzKSAmJiAoX3RydW5jXyA9PSAxKSkgewkJCQkJCQlcCisJCQlUUkFDRV9ERUJVRyhJTkZPLCAiW2F1dGhTSVAucmd3eF0gQVZQIHRydW5jYXRlZCBpbiAiI19hdHRyXyk7CQkJXAorCQkJX19sID0gMjUzOwkJCQkJCQkJCVwKKwkJfQkJCQkJCQkJCQkJXAorCQlkbyB7CQkJCQkJCQkJCQlcCisJCQlzaXplX3QgX193ID0gKF9fbCA+IDI1MykgPyAyNTMgOiBfX2w7CQkJCQkJXAorCQkJQ0hFQ0tfTUFMTE9DKHJhZGl1c19tc2dfYWRkX2F0dHIoKnJhZF9mdywgKF9hdHRyXyksIChfZGF0YV8pICsgX19vZmYsIF9fdykpOwlcCisJCQlfX29mZiArPSBfX3c7CQkJCQkJCQkJXAorCQkJX19sICAgLT0gX193OwkJCQkJCQkJCVwKKwkJfSB3aGlsZSAoX19sKTsJCQkJCQkJCQkJXAorCX0KKworCSNkZWZpbmUgQ09OVjJSQURfMzJCKCBfYXR0cl8sIF9kYXRhXykJewkJCQkJCQlcCisJCXVpbnQzMl90IF9fdiA9IGh0b25sKCh1aW50MzJfdCkoX2RhdGFfKSk7CQkJCQkJXAorCQlUUkFDRV9ERUJVRyhGVUxMLCAiQ29udmVydGluZyBBVlAgdG8gIiNfYXR0cl8pOwkJCQkJCVwKKwkJQ0hFQ0tfTUFMTE9DKHJhZGl1c19tc2dfYWRkX2F0dHIoKnJhZF9mdywgKF9hdHRyXyksICh1aW50OF90ICopJl9fdiwgc2l6ZW9mKF9fdikpKTsJXAorCX0KKworCS8qIFNlYXJjaCB0aGUgZGlmZmVyZW50IEFWUHMgd2UgaGFuZGxlIGhlcmUgKi8KKwlDSEVDS19GQ1QoIGZkX21zZ19zZXNzX2dldChmZF9nX2NvbmZpZy0+Y25mX2RpY3QsICpkaWFtX2FucywgJnNlc3MsIE5VTEwpICk7CisJaWYgKHNlc3MpIHsKKwkJQ0hFQ0tfRkNUKCBmZF9zZXNzX2dldHNpZChzZXNzLCAmc2lkLCAmc2lkbGVuKSApOworCX0KKworCisJLyogQ2hlY2sgdGhlIERpYW1ldGVyIGVycm9yIGNvZGUgKi8KKwlDSEVDS19GQ1QoIGZkX21zZ19zZWFyY2hfYXZwICgqZGlhbV9hbnMsIGNzLT5kaWN0LlJlc3VsdF9Db2RlLCAmYXZwKSApOworCUFTU0VSVCggYXZwICk7IC8qIG90aGVyd2lzZSB0aGUgbWVzc2FnZSBzaG91bGQgaGF2ZSBiZWVuIGRpc2NhcmRlZCBhIGxvdCBlYXJsaWVyIGJlY2F1c2Ugb2YgQUJORiAqLworCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9oZHIgKCBhdnAsICZhaGRyICkgKTsKKwlzd2l0Y2ggKGFoZHItPmF2cF92YWx1ZS0+dTMyKSB7CisJCWNhc2UgRVJfRElBTUVURVJfTVVMVElfUk9VTkRfQVVUSDoKKwkJY2FzZSBFUl9ESUFNRVRFUl9TVUNDRVNTX0FVVEhfU0VOVF9TRVJWRVJfTk9UX1NUT1JFRDoJCQorCQkJKCpyYWRfZncpLT5oZHItPmNvZGUgPSBSQURJVVNfQ09ERV9BQ0NFU1NfQ0hBTExFTkdFOworCQkJLy9zdHJ1Y3QgdGltZXNwZWMgbm93dHM7CisJCQkvL0NIRUNLX1NZUyhjbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmbm93dHMpKTsKKwkJCS8vbm93dHMudHZfc2VjKz02MDA7CisJCQkvL0NIRUNLX0ZDVChmZF9zZXNzX3NldHRpbWVvdXQoc2Vzc2lvbiwgJm5vd3RzICkpOworCQkJYnJlYWs7CisJCWNhc2UgRVJfRElBTUVURVJfU1VDQ0VTU19TRVJWRVJfTkFNRV9OT1RfU1RPUkVEOgorCQljYXNlIEVSX0RJQU1FVEVSX1NVQ0NFU1M6CisJCQkoKnJhZF9mdyktPmhkci0+Y29kZSA9IFJBRElVU19DT0RFX0FDQ0VTU19BQ0NFUFQ7CisJCQkvLyBpbl9zdWNjZXNzPTE7CisJCQlicmVhazsKKwkJCisJCWRlZmF1bHQ6CisJCQkoKnJhZF9mdyktPmhkci0+Y29kZSA9IFJBRElVU19DT0RFX0FDQ0VTU19SRUpFQ1Q7CisJCQlmZF9sb2dfZGVidWcoIltzaXAucmd3eF0gUmVjZWl2ZWQgRGlhbWV0ZXIgYW5zd2VyIHdpdGggZXJyb3IgY29kZSAnJWQnLCBzZXNzaW9uICUuKnMsIHRyYW5zbGF0aW5nIGludG8gQWNjZXNzLVJlamVjdCIsCisJCQkJCWFoZHItPmF2cF92YWx1ZS0+dTMyLCAoaW50KXNpZGxlbiwgc2lkKTsKKwkJCXJldHVybiAwOworCX0KKwkvKiBSZW1vdmUgdGhpcyBSZXN1bHQtQ29kZSBhdnAgKi8KKwlDSEVDS19GQ1QoIGZkX21zZ19mcmVlKCBhdnAgKSApOworCQorCS8qIE5vdyBsb29wIGluIHRoZSBsaXN0IG9mIEFWUHMgYW5kIGNvbnZlcnQgdGhvc2UgdGhhdCB3ZSBrbm93IGhvdyAqLworCUNIRUNLX0ZDVCggZmRfbXNnX2Jyb3dzZSgqZGlhbV9hbnMsIE1TR19CUldfRklSU1RfQ0hJTEQsICZuZXh0LCBOVUxMKSApOworCQorCXdoaWxlIChuZXh0KSB7CisJCWludCBoYW5kbGVkID0gMTsKKwkJYXZwID0gbmV4dDsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYnJvd3NlKGF2cCwgTVNHX0JSV19XQUxLLCAmbmV4dCwgTlVMTCkgKTsKKwkJCisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9oZHIgKCBhdnAsICZhaGRyICkgKTsKKwkJCisJCWlmICghKGFoZHItPmF2cF9mbGFncyAmIEFWUF9GTEFHX1ZFTkRPUikpIHsKKwkJCXN3aXRjaCAoYWhkci0+YXZwX2NvZGUpIHsKKwkJCQkKKwkJCQkKKwkJCQljYXNlIERJQU1fQVRUUl9ESUdFU1RfTk9OQ0U6CisJCQkJCUNPTlYyUkFEX1NUUihESUFNX0FUVFJfRElHRVNUX05PTkNFLCBhaGRyLT5hdnBfdmFsdWUtPm9zLmRhdGEsIGFoZHItPmF2cF92YWx1ZS0+b3MubGVuLCAwKTsKKwkJCQkJbm9uY2VfYWRkX2VsZW1lbnQoYWhkci0+YXZwX3ZhbHVlLT5vcy5kYXRhLCBhaGRyLT5hdnBfdmFsdWUtPm9zLmxlbiwgc2lkLCBzaWRsZW4sIGNzKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBESUFNX0FUVFJfRElHRVNUX1JFQUxNOgorCQkJCQlDT05WMlJBRF9TVFIoRElBTV9BVFRSX0RJR0VTVF9SRUFMTSwgYWhkci0+YXZwX3ZhbHVlLT5vcy5kYXRhLCBhaGRyLT5hdnBfdmFsdWUtPm9zLmxlbiwgMSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRElBTV9BVFRSX0RJR0VTVF9RT1A6CisJCQkJCUNPTlYyUkFEX1NUUihESUFNX0FUVFJfRElHRVNUX1FPUCwgYWhkci0+YXZwX3ZhbHVlLT5vcy5kYXRhLCBhaGRyLT5hdnBfdmFsdWUtPm9zLmxlbiwgMSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRElBTV9BVFRSX0RJR0VTVF9BTEdPUklUSE06CisJCQkJCUNPTlYyUkFEX1NUUihESUFNX0FUVFJfRElHRVNUX0FMR09SSVRITSwgYWhkci0+YXZwX3ZhbHVlLT5vcy5kYXRhLCBhaGRyLT5hdnBfdmFsdWUtPm9zLmxlbiwgMSk7CisJCQkJCWJyZWFrOwkJCisJCQkJY2FzZSBESUFNX0FUVFJfRElHRVNUX1JFU1BPTlNFX0FVVEg6CisJCQkJCUNPTlYyUkFEX1NUUihESUFNX0FUVFJfRElHRVNUX1JFU1BPTlNFX0FVVEgsIGFoZHItPmF2cF92YWx1ZS0+b3MuZGF0YSwgYWhkci0+YXZwX3ZhbHVlLT5vcy5sZW4sIDApOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQloYW5kbGVkPTA7CisJCQkJCWJyZWFrOworCQkJfQorCQl9IAorCQllbHNlIAorCQl7CisJCQkvKiBWZW5kb3Itc3BlY2lmaWMgQVZQcyAqLworCQkJc3dpdGNoIChhaGRyLT5hdnBfdmVuZG9yKSB7CisJCQkJCisJCQkJZGVmYXVsdDogLyogdW5rbm93biB2ZW5kb3IgKi8KKwkJCQkJaGFuZGxlZCA9IDA7CisJCQl9CisJCX0KKwkJaWYgKGhhbmRsZWQpIHsKKwkJCUNIRUNLX0ZDVCggZmRfbXNnX2ZyZWUoIGF2cCApICk7CisJCX0KKwl9CisJCisJcmV0dXJuIDA7Cit9CisKKy8qIFRoZSBleHBvcnRlZCBzeW1ib2wgKi8KK3N0cnVjdCByZ3dfYXBpIHJnd3BfZGVzY3JpcHRvciA9IHsKKwkucmd3cF9uYW1lICAgICAgID0gInNpcCIsCisJLnJnd3BfY29uZl9wYXJzZSA9IHNpcF9jb25mX3BhcnNlLAorCS5yZ3dwX2NvbmZfZnJlZSAgPSBzaXBfY29uZl9mcmVlLAorCS5yZ3dwX3JhZF9yZXEgICAgPSBzaXBfcmFkX3JlcSwKKwkucmd3cF9kaWFtX2FucyAgID0gc2lwX2RpYW1fYW5zCit9OwkKKwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9hcHBfcmVkaXJlY3QvQ01ha2VMaXN0cy50eHQgYi9leHRlbnNpb25zL2FwcF9yZWRpcmVjdC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjYxOTE1Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9hcHBfcmVkaXJlY3QvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw0MiBAQAorIyBUaGUgYXBwX3JlZGlyZWN0IGV4dGVuc2lvbgorUFJPSkVDVCgiQ29uZmlndXJhYmxlIFJlZGlyZWN0cyBzZXJ2ZXIgZXh0ZW5zaW9uIiBDKQorCisjIENoZWNrIGlmIFJFR19TVEFSVEVORCBpcyBwcm92aWRlZCBvbiB0aGUgaG9zdAorU0VUKENIRUNLX1JFR19TVEFSVEVORF9TT1VSQ0VfQ09ERSAiCisJI2luY2x1ZGUgPHVuaXN0ZC5oPgorCSNpbmNsdWRlIDxyZWdleC5oPgorCWludCBtYWluKCkgeworCSAgIHJldHVybiByZWdleGVjKE5VTEwsIE5VTEwsIDAsIE5VTEwsIFJFR19TVEFSVEVORCk7CisJfQorCSIpCitDSEVDS19DX1NPVVJDRV9DT01QSUxFUygiJHtDSEVDS19SRUdfU1RBUlRFTkRfU09VUkNFX0NPREV9IiBIQVZFX1JFR19TVEFSVEVORCkKKyMgR2VuZXJhdGUgdGhlIGhvc3QuaCBmaWxlCitDT05GSUdVUkVfRklMRSgke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vYXJkLWhvc3QuaC5pbiAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vYXJkLWhvc3QuaCkKKworIyBQYXJzZXIgZmlsZXMKK0JJU09OX0ZJTEUoYXJkX2NvbmYueSkKK0ZMRVhfRklMRShhcmRfY29uZi5sKQorU0VUX1NPVVJDRV9GSUxFU19QUk9QRVJUSUVTKGxleC5hcmRfY29uZi5jIGFyZF9jb25mLnRhYi5jIFBST1BFUlRJRVMgQ09NUElMRV9GTEFHUyAiLUkgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9IikKKworIyBMaXN0IG9mIHNvdXJjZSBmaWxlcworU0VUKCBBUFBfUkVESVJfU1JDCisJYXBwX3JlZGlyLmMKKwlhcHBfcmVkaXIuaAorCWxleC5hcmRfY29uZi5jCisJYXJkX2NvbmYudGFiLmMKKwlhcmRfY29uZi50YWIuaAorCWFyZF9ydWxlcy5jCispCisKK0lOQ0xVREVfRElSRUNUT1JJRVMoJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9KQorCisjIENvbXBpbGUgdGhlc2UgZmlsZXMgYXMgYSBmcmVlRGlhbWV0ZXIgZXh0ZW5zaW9uCitGRF9BRERfRVhURU5TSU9OKGFwcF9yZWRpcmVjdCAke0FQUF9SRURJUl9TUkN9KQorCisKKyMjIyMKKyMjIElOU1RBTEwgc2VjdGlvbiAjIworCitJTlNUQUxMKFRBUkdFVFMgYXBwX3JlZGlyZWN0CisJTElCUkFSWSBERVNUSU5BVElPTiAke0lOU1RBTExfRVhURU5TSU9OU19TVUZGSVh9CisJQ09NUE9ORU5UIGZyZWVEaWFtZXRlci1hcHBfcmVkaXJlY3QpCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2FwcF9yZWRpcmVjdC9hcHBfcmVkaXIuYyBiL2V4dGVuc2lvbnMvYXBwX3JlZGlyZWN0L2FwcF9yZWRpci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxOTk2ODcKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2FwcF9yZWRpcmVjdC9hcHBfcmVkaXIuYwpAQCAtMCwwICsxLDEwMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTEsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAKKyAqIENvbmZpZ3VyYWJsZSByb3V0aW5nIG9mIG1lc3NhZ2VzIGZvciBmcmVlRGlhbWV0ZXIuCisgKi8KKworI2luY2x1ZGUgImFwcF9yZWRpci5oIgorCitzdGF0aWMgc3RydWN0IGZkX3J0X2Z3ZF9oZGwgKiBhcmRfZndkX2NiID0gTlVMTDsKKworLyogZW50cnkgcG9pbnQgKi8KK3N0YXRpYyBpbnQgYXJkX2VudHJ5KGNoYXIgKiBjb25mZmlsZSkKK3sKKwlUUkFDRV9FTlRSWSgiJXAiLCBjb25mZmlsZSk7CisJCisJLyogUGFyc2UgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSAqLworCUNIRUNLX0ZDVCggYXJkX2NvbmZfaGFuZGxlKGNvbmZmaWxlKSApOworCQorCS8qIFJlc29sdmUgdGhlIGRpY3Rpb25hcnkgb2JqZWN0cyB3ZSB1c2UgKi8KKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoICggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJSZWRpcmVjdC1Ib3N0IiwgJmF2cF9SZWRpcmVjdF9Ib3N0LCBFTk9FTlQgKSk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiUmVkaXJlY3QtSG9zdC1Vc2FnZSIsICZhdnBfUmVkaXJlY3RfSG9zdF9Vc2FnZSwgRU5PRU5UICkpOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2ggKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIlJlZGlyZWN0LU1heC1DYWNoZS1UaW1lIiwgJmF2cF9SZWRpcmVjdF9NYXhfQ2FjaGVfVGltZSwgRU5PRU5UICkpOworCQorCS8qIFJlZ2lzdGVyIHRoZSBwcm94eSBjYWxsYmFjayAqLworCUNIRUNLX0ZDVCggZmRfcnRfZndkX3JlZ2lzdGVyKGFyZF9ydWxlX2FwcGx5LCBOVUxMLCBSVF9GV0RfUkVRLCAmYXJkX2Z3ZF9jYikgKTsKKwkKKwkvKiBXZSdyZSBkb25lICovCisJcmV0dXJuIDA7Cit9CisKKy8qIFVubG9hZCAqLwordm9pZCBmZF9leHRfZmluaSh2b2lkKQoreworCVRSQUNFX0VOVFJZKCk7CisJCisJLyogVW5yZWdpc3RlciB0aGUgcHJveHkgY2FsbGJhY2sgKi8KKwlpZiAoYXJkX2Z3ZF9jYikgeworCQlDSEVDS19GQ1RfRE8oIGZkX3J0X2Z3ZF91bnJlZ2lzdGVyKGFyZF9md2RfY2IsIE5VTEwpLCApOworCX0KKwkKKwkvKiBEZXN0cm95IGFsbCBydWxlcyAqLworCXdoaWxlICghRkRfSVNfTElTVF9FTVBUWSgmYXJkX2NvbmYtPnJ1bGVzKSkgeworCQlzdHJ1Y3QgYXJkX3J1bGUgKiByID0gYXJkX2NvbmYtPnJ1bGVzLm5leHQtPm87CisJCWZkX2xpc3RfdW5saW5rKCZyLT5jaGFpbik7CisJCXdoaWxlICghRkRfSVNfTElTVF9FTVBUWSgmci0+Y3JpdGVyaWEpKSB7CisJCQlzdHJ1Y3QgYXJkX2NyaXRlcmlhICogYyA9IHItPmNyaXRlcmlhLm5leHQtPm87CisJCQlmZF9saXN0X3VubGluaygmYy0+Y2hhaW4pOworCQkJaWYgKGMtPmlzX3JlZ2V4KSB7CisJCQkJcmVnZnJlZSgmYy0+cHJlZyk7CisJCQl9CisJCQlmcmVlKGMtPnMpOworCQkJZnJlZShjKTsKKwkJfQorCQl3aGlsZSAoIUZEX0lTX0xJU1RfRU1QVFkoJnItPnRhcmdldHMpKSB7CisJCQlzdHJ1Y3QgYXJkX3RhcmdldCAqIHQgPSByLT50YXJnZXRzLm5leHQtPm87CisJCQlmZF9saXN0X3VubGluaygmdC0+Y2hhaW4pOworCQkJZnJlZSh0LT5zKTsKKwkJCWZyZWUodCk7CisJCX0KKwkJZnJlZShyKTsKKwl9CisJCisJLyogRG9uZSAqLworCXJldHVybiA7Cit9CisKK0VYVEVOU0lPTl9FTlRSWSgiYXBwX3JlZGlyZWN0IiwgYXJkX2VudHJ5KTsKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvYXBwX3JlZGlyZWN0L2FwcF9yZWRpci5oIGIvZXh0ZW5zaW9ucy9hcHBfcmVkaXJlY3QvYXBwX3JlZGlyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMyYzMzZAotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvYXBwX3JlZGlyZWN0L2FwcF9yZWRpci5oCkBAIC0wLDAgKzEsMTIxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxMSwgV0lERSBQcm9qZWN0IGFuZCBOSUNUCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBXSURFIFByb2plY3Qgb3IgTklDVCBub3IgdGhlIAkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFdJREUgUHJvamVjdCBhbmQgCQkJCQkJICoKKyogICBOSUNULgkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEhlYWRlciBmaWxlIGZvciB0aGUgYXBwX3JlZGlyZWN0IGV4dGVuc2lvbi4gCisgKgorICogIFNlZSB0aGUgYXBwX3JlZGlyZWN0LmNvbmYuc2FtcGxlIGZpbGUgZm9yIHRoZSBmb3JtYXQgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4KKyAqLworIAorLyogRnJlZURpYW1ldGVyJ3MgY29tbW9uIGluY2x1ZGUgZmlsZSAqLworI2luY2x1ZGUgPGZyZWVEaWFtZXRlci9leHRlbnNpb24uaD4KKworLyogSG9zdCBjb25maWd1cmF0aW9uIGZvciB0aGlzIHNwZWNpZmljIGV4dGVuc2lvbiAqLworI2luY2x1ZGUgPGFyZC1ob3N0Lmg+CisjaW5jbHVkZSA8cmVnZXguaD4KKworLyogRXh0ZW5zaW9uJ3MgY29uZmlndXJhdGlvbiAqLworc3RydWN0IGFyZF9jb25maWcgeworCXVpbnQzMl90CWRlZmF1bHRfcmN0OyAvKiByZWRpcmVjdC1jYWNoZS10aW1lIHRvIHVzZSB1bmxlc3Mgb3ZlcndyaXR0ZW4gYnkgYSBydWxlICovCisJc3RydWN0IGZkX2xpc3QgIHJ1bGVzOwkgICAgIC8qIHRoZSBsaXN0IG9mIHJ1bGVzIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbiB0aGUgY29uZiBmaWxlLiAqLworfTsKK2V4dGVybiBzdHJ1Y3QgYXJkX2NvbmZpZyAqIGFyZF9jb25mOyAvKiBpbml0aWFsaXplZCBpbiBhcmRfY29uZi55ICovCisKKy8qIFRoZSB0eXBlcyBvZiByZWRpcmVjdHMgKGZyb20gUmVkaXJlY3QtSG9zdC1Vc2FnZSBBVlAgdmFsdWUpICovCitlbnVtIHJlZGlyX2hfdSB7CisJRE9OVF9DQUNIRSA9IDAsCisJQUxMX1NFU1NJT04sCisJQUxMX1JFQUxNLAorCVJFQUxNX0FORF9BUFBMSUNBVElPTiwKKwlBTExfQVBQTElDQVRJT04sCisJQUxMX0hPU1QsCisJQUxMX1VTRVIKK307CisjZGVmaW5lIEhfVV9NQVgJQUxMX1VTRVIKKworLyogQSBydWxlICovCitzdHJ1Y3QgYXJkX3J1bGUgeworCXN0cnVjdCBmZF9saXN0CWNoYWluOyAvKiBsaW5rIGluIGNvbmZpZ3VyYXRpb24gKi8KKwkKKwllbnVtIHJlZGlyX2hfdSAJdHlwZTsgLyogV2hhdCBraW5kIG9mIHJ1bGUgaXMgdGhpcz8gKi8KKwl1aW50MzJfdAlyY3Q7ICAvKiBvdmVyd3JpdGUgZGVmYXVsdF9yY3QgaXMgbm90IDAgKi8KKwkKKwlzdHJ1Y3QgZmRfbGlzdCAgY3JpdGVyaWE7IC8qIGxpc3Qgb2YgY3JpdGVyaWEgdG8gbWF0Y2guIFRoZSBydWxlIGlzIGFwcGxpZWQgaWYgYWxsIGNyaXRlcmlhIG1hdGNoICovCisJCisJc3RydWN0IGZkX2xpc3QgIHRhcmdldHM7ICAvKiBsaXN0IG9mIFJlZGlyZWN0LUhvc3QgdmFsdWVzIHRvIHNlbmQuICovCit9OworCisvKiBXaGF0IGtpbmQgb2YgY3JpdGVyaWEgZXhpc3QgKi8KK2VudW0gcnVsZV9jcml0ZXJpYSB7IC8qIG5vdGU6IHRoZSBvcmRlciBvZiB0aGUgdmFsdWVzIHJlZmxlY3RzIHRoZSBjb21wbGV4aXR5IG9mIG1hdGNoaW5nIC0tIGl0IHNob3VsZCBiZSBrZXB0IHRoaXMgd2F5ICovCisJQVBQX0lELAorCUZST01fSUQsCisJRlJPTV9SRUFMTSwKKwlBVlBfSU5ULAorCUFWUF9TVFIKK307CisKKy8qIEEgY3JpdGVyaWEgaW4gdGhlIGxpc3QgKi8KK3N0cnVjdCBhcmRfY3JpdGVyaWEgeworCXN0cnVjdCBmZF9saXN0ICBjaGFpbjsgLyogbGluayBpbiBhcmRfcnVsZS0+Y3JpdGVyaWEgKi8KKwllbnVtIHJ1bGVfY3JpdGVyaWEgdHlwZTsgLyogV2hhdCBpcyB0aGlzIHJ1bGUgKi8KKwkKKwkvKiB0aGUgZGF0YSB0aGF0IG11c3QgYmUgbWF0Y2hlZCAtLSBldmVyeXRoaW5nIGlzIG5vdCB1c2VkIGJ5IGFsbCBjcml0ZXJpYSB0eXBlcyAqLworCWNoYXIgKiBzOworCXNpemVfdCBzbDsKKwlpbnQgaXNfcmVnZXg7CisJcmVnZXhfdCAgcHJlZzsKKwl1aW50MzJfdCBpOworCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGF2cF9pbmZvOworfTsKKworLyogQSB0YXJnZXQgZW50cnkgaW4gdGhlIGFyZF9ydWxlLT50YXJnZXRzIGxpc3QgKi8KK3N0cnVjdCBhcmRfdGFyZ2V0IHsKKwlzdHJ1Y3QgZmRfbGlzdCBjaGFpbjsKKwlvczBfdCAgczsgLyogbXVzdCBiZSBmcmVlZCBhZnRlcndhcmRzICovCisJc2l6ZV90IGw7Cit9OworCisvKiBUaGUgQVZQcyB3ZSB1c2UgKi8KK2V4dGVybiBzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnBfUmVkaXJlY3RfSG9zdDsKK2V4dGVybiBzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnBfUmVkaXJlY3RfSG9zdF9Vc2FnZTsKK2V4dGVybiBzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnBfUmVkaXJlY3RfTWF4X0NhY2hlX1RpbWU7CisKKy8qIFBhcnNlIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgKi8KK2ludCBhcmRfY29uZl9oYW5kbGUoY2hhciAqIGNvbmZmaWxlKTsKKworLyogRHVtcCBhIHJ1bGUgKGRlYnVnKSAqLwordm9pZCBhcmRfcnVsZV9kdW1wKHN0cnVjdCBhcmRfcnVsZSAqIHIpOworCisvKiBDaGVjayBpZiBhIHJ1bGUgYXBwbGllcywgYW5kIGlmIGZvdW5kLCBjcmVhdGUgdGhlIHJlcGx5ICovCitpbnQgYXJkX3J1bGVfYXBwbHkodm9pZCAqIGNiZGF0YSwgc3RydWN0IG1zZyAqKiBtc2cpOwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9hcHBfcmVkaXJlY3QvYXJkLWhvc3QuaC5pbiBiL2V4dGVuc2lvbnMvYXBwX3JlZGlyZWN0L2FyZC1ob3N0LmguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRlMDVhNQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvYXBwX3JlZGlyZWN0L2FyZC1ob3N0LmguaW4KQEAgLTAsMCArMSw0MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTEsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBDb25maWd1cmF0aW9uIGZyb20gY29tcGlsZS10aW1lICovCisjaWZuZGVmIFJURF9JU19DT05GSUcKKyNkZWZpbmUgUlREX0lTX0NPTkZJRworCisjY21ha2VkZWZpbmUgSEFWRV9SRUdfU1RBUlRFTkQKKworI2VuZGlmIC8qIFJURF9JU19DT05GSUcgKi8KZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvYXBwX3JlZGlyZWN0L2FyZF9jb25mLmwgYi9leHRlbnNpb25zL2FwcF9yZWRpcmVjdC9hcmRfY29uZi5sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMzk5NDkKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2FwcF9yZWRpcmVjdC9hcmRfY29uZi5sCkBAIC0wLDAgKzEsMTQwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxMywgV0lERSBQcm9qZWN0IGFuZCBOSUNUCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBXSURFIFByb2plY3Qgb3IgTklDVCBub3IgdGhlIAkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFdJREUgUHJvamVjdCBhbmQgCQkJCQkJICoKKyogICBOSUNULgkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRva2VuaXplcgorICoKKyAqLworCisleworI2luY2x1ZGUgImFwcF9yZWRpci5oIgorLyogSW5jbHVkZSB5YWNjIHRva2VucyBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgImFyZF9jb25mLnRhYi5oIgorCisvKiBVcGRhdGUgdGhlIGNvbHVtbiBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBZWV9VU0VSX0FDVElPTiB7IAkJCQkJCVwKKwl5eWxsb2MtPmZpcnN0X2NvbHVtbiA9IHl5bGxvYy0+bGFzdF9jb2x1bW4gKyAxOyAJCVwKKwl5eWxsb2MtPmxhc3RfY29sdW1uID0geXlsbG9jLT5maXJzdF9jb2x1bW4gKyB5eWxlbmcgLSAxOwlcCit9CisKKy8qIEF2b2lkIHdhcm5pbmcgd2l0aCBuZXdlciBmbGV4ICovCisjZGVmaW5lIFlZX05PX0lOUFVUCisKKyV9CisKK3FzdHJpbmcJCVwiW15cIlxuXSpcIgorCisKKyVvcHRpb24gYmlzb24tYnJpZGdlIGJpc29uLWxvY2F0aW9ucworJW9wdGlvbiBub3l5d3JhcAorJW9wdGlvbiBub3VucHV0CisKKyUlCisKKwkvKiBVcGRhdGUgdGhlIGxpbmUgY291bnQgKi8KK1xuCQkJeworCQkJCXl5bGxvYy0+Zmlyc3RfbGluZSsrOyAKKwkJCQl5eWxsb2MtPmxhc3RfbGluZSsrOyAKKwkJCQl5eWxsb2MtPmxhc3RfY29sdW1uPTA7IAorCQkJfQorCSAKKwkvKiBFYXQgYWxsIHNwYWNlcyBidXQgbm90IG5ldyBsaW5lcyAqLworKFtbOnNwYWNlOl1dey19W1xuXSkrCTsKKwkvKiBFYXQgYWxsIGNvbW1lbnRzICovCisjLiokCQkJOworCisJLyogUmVjb2duaXplIGFueSBpbnRlZ2VyICovCitbWzpkaWdpdDpdXSsJCXsKKwkJCQkvKiBDb252ZXJ0IHRoaXMgdG8gYW4gdTMyIHZhbHVlICovCisJCQkJaW50IHJldD0wOworCQkJCXJldCA9IHNzY2FuZih5eXRleHQsICIldSIsICZ5eWx2YWwtPnUzMik7CisJCQkJaWYgKHJldCAhPSAxKSB7CisJCQkJCS8qIE5vIG1hdGNoaW5nOiBhbiBlcnJvciBvY2N1cnJlZCAqLworCQkJCQlmZF9sb2dfZGVidWcoIlVuYWJsZSB0byBjb252ZXJ0IHRoZSB2YWx1ZSAnJXMnIHRvIGEgdmFsaWQgbnVtYmVyOiAlcyIsIHl5dGV4dCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCQkJcmV0dXJuIFRPS19MRVhfRVJST1I7IC8qIHRyaWcgYW4gZXJyb3IgaW4geWFjYyBwYXJzZXIgKi8KKwkJCQkJLyogTWF5YmUgd2UgY291bGQgUkVKRUNUIGluc3RlYWQgb2YgZmFpbGluZyBoZXJlPyAqLworCQkJCX0KKwkJCQlyZXR1cm4gVE9LX1UzMlZBTDsKKwkJCX0KKwkJCQorCS8qIFJlY29nbml6ZSBicmFja2V0ZWQgcXVvdGVkIHN0cmluZ3MgKi8KK1tbXXtxc3RyaW5nfVtdXSAJeworCQkJCS8qIE1hdGNoIGEgcXVvdGVkIHN0cmluZyBjb250YWluaW5nIGEgcmVnZXggKi8KKwkJCQlDSEVDS19NQUxMT0NfRE8oIHl5bHZhbC0+dHN0cmluZy5zdHIgPSBzdHJkdXAoeXl0ZXh0KzIpLCAKKwkJCQl7CisJCQkJCVRSQUNFX0RFQlVHKElORk8sICJVbmFibGUgdG8gY29weSB0aGUgc3RyaW5nICclcyc6ICVzIiwgeXl0ZXh0LCBzdHJlcnJvcihlcnJubykpOworCQkJCQlyZXR1cm4gVE9LX0xFWF9FUlJPUjsgLyogdHJpZyBhbiBlcnJvciBpbiB5YWNjIHBhcnNlciAqLworCQkJCX0gKTsKKwkJCQl5eWx2YWwtPnRzdHJpbmcuc3RyW3N0cmxlbih5eXRleHQpIC0gNF0gPSAnXDAnOworCQkJCXl5bHZhbC0+dHN0cmluZy5yZWdleCA9IDE7CisJCQkJcmV0dXJuIFRPS19UU1RSSU5HOworCQkJfQorCQkJCisJLyogUmVjb2duaXplIHF1b3RlZCBzdHJpbmdzIChzaW5jZSBpdCBjb21lcyBhZnRlciB0aGUgcHJldmlvdXMgcnVsZSwgdGhlIHN0cmluZyBzaG91bGQgbm90IGJlIHF1b3RlZCkgKi8KK3txc3RyaW5nfQkJeworCQkJCS8qIE1hdGNoIGEgcXVvdGVkIHN0cmluZy4gKi8KKwkJCQlDSEVDS19NQUxMT0NfRE8oIHl5bHZhbC0+dHN0cmluZy5zdHIgPSBzdHJkdXAoeXl0ZXh0KzEpLCAKKwkJCQl7CisJCQkJCVRSQUNFX0RFQlVHKElORk8sICJVbmFibGUgdG8gY29weSB0aGUgc3RyaW5nICclcyc6ICVzIiwgeXl0ZXh0LCBzdHJlcnJvcihlcnJubykpOworCQkJCQlyZXR1cm4gVE9LX0xFWF9FUlJPUjsgLyogdHJpZyBhbiBlcnJvciBpbiB5YWNjIHBhcnNlciAqLworCQkJCX0gKTsKKwkJCQl5eWx2YWwtPnRzdHJpbmcuc3RyW3N0cmxlbih5eXRleHQpIC0gMl0gPSAnXDAnOworCQkJCXl5bHZhbC0+dHN0cmluZy5yZWdleCA9IDA7CisJCQkJcmV0dXJuIFRPS19UU1RSSU5HOworCQkJfQorCQorCS8qIFRoZSBrZXkgd29yZHMgKi8JCisoP2k6ImRlZmF1bHRfcmVkaXJlY3RfY2FjaGVfdGltZSIpCXsgcmV0dXJuIFRPS19ERUZBVUxUX1JDVDsJCX0KKyg/aToidG8iKQkgCQkJeyByZXR1cm4gVE9LX1RPOwkJCX0KKyg/aToiRE9OVF9DQUNIRSIpCSAJCXsgcmV0dXJuIFRPS19ET05UX0NBQ0hFOwkJfQorKD9pOiJBTExfU0VTU0lPTiIpCSAJCXsgcmV0dXJuIFRPS19BTExfU0VTU0lPTjsJCX0KKyg/aToiQUxMX1JFQUxNIikJIAkJeyByZXR1cm4gVE9LX0FMTF9SRUFMTTsJCQl9CisoP2k6IlJFQUxNX0FORF9BUFBMSUNBVElPTiIpCSAJeyByZXR1cm4gVE9LX1JFQUxNX0FORF9BUFBMSUNBVElPTjsJfQorKD9pOiJBTExfQVBQTElDQVRJT04iKQkgCQl7IHJldHVybiBUT0tfQUxMX0FQUExJQ0FUSU9OOwkJfQorKD9pOiJBTExfSE9TVCIpCSAJCQl7IHJldHVybiBUT0tfQUxMX0hPU1Q7CQkJfQorKD9pOiJBTExfVVNFUiIpCSAJCQl7IHJldHVybiBUT0tfQUxMX1VTRVI7CQkJfQorKD9pOiJmcm9tLmlkIikJIAkJCXsgcmV0dXJuIFRPS19GUk9NX0lEOwkJCX0KKyg/aToiZnJvbS5yZWFsbSIpCSAJCXsgcmV0dXJuIFRPS19GUk9NX1JFQUxNOwkJfQorKD9pOiJhcHAiKQkgCQkJeyByZXR1cm4gVE9LX0FQUDsJCQl9CisJCQkKKwkvKiBWYWxpZCBzaW5nbGUgY2hhcmFjdGVycyBmb3IgeXlwYXJzZSAqLworWzo9O10JCXsgcmV0dXJuIHl5dGV4dFswXTsgfQorCisJLyogVW5yZWNvZ25pemVkIHNlcXVlbmNlLCBpZiBpdCBkaWQgbm90IG1hdGNoIGFueSBwcmV2aW91cyBwYXR0ZXJuICovCitbXls6c3BhY2U6XVwiOj07XG5dKwl7IAorCQkJCWZkX2xvZ19kZWJ1ZygiVW5yZWNvZ25pemVkIHRleHQgb24gbGluZSAlZCBjb2wgJWQ6ICclcycuIiwgeXlsbG9jLT5maXJzdF9saW5lLCB5eWxsb2MtPmZpcnN0X2NvbHVtbiwgeXl0ZXh0KTsKKwkJCSAJcmV0dXJuIFRPS19MRVhfRVJST1I7IAorCQkJfQorCislJQpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9hcHBfcmVkaXJlY3QvYXJkX2NvbmYueSBiL2V4dGVuc2lvbnMvYXBwX3JlZGlyZWN0L2FyZF9jb25mLnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRhMTI4MAotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvYXBwX3JlZGlyZWN0L2FyZF9jb25mLnkKQEAgLTAsMCArMSw0NTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDEzLCBXSURFIFByb2plY3QgYW5kIE5JQ1QJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFdJREUgUHJvamVjdCBvciBOSUNUIG5vciB0aGUgCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgV0lERSBQcm9qZWN0IGFuZCAJCQkJCQkgKgorKiAgIE5JQ1QuCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogWWFjYyBleHRlbnNpb24ncyBjb25maWd1cmF0aW9uIHBhcnNlci4KKyAqIFNlZSBkb2MvYXBwX3JlZGlyZWN0LmNvbmYuc2FtcGxlIGZvciBjb25maWd1cmF0aW9uIGZpbGUgZm9ybWF0CisgKi8KKworLyogRm9yIGRldmVsb3BtZW50IG9ubHkgOiAqLworJWRlYnVnIAorJWVycm9yLXZlcmJvc2UKKworLyogVGhlIHBhcnNlciByZWNlaXZlcyB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGZpbGVuYW1lIGFzIHBhcmFtZXRlciAqLworJXBhcnNlLXBhcmFtIHtjaGFyICogY29uZmZpbGV9CisKKy8qIEtlZXAgdHJhY2sgb2YgbG9jYXRpb24gKi8KKyVsb2NhdGlvbnMgCislcHVyZS1wYXJzZXIKKworJXsKKyNpbmNsdWRlICJhcHBfcmVkaXIuaCIKKyNpbmNsdWRlICJhcmRfY29uZi50YWIuaCIJLyogYmlzb24gaXMgbm90IHNtYXJ0IGVub3VnaCB0byBkZWZpbmUgdGhlIFlZTFRZUEUgYmVmb3JlIGluY2x1ZGluZyB0aGlzIGNvZGUsIHNvLi4uICovCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb24gKi8KK2ludCB5eXBhcnNlKGNoYXIgKiBjb25mZmlsZSk7CisKK3N0YXRpYyBpbnQgcnVsZXNfYWRkZWQgPSAwOworCisvKiBXZSBpbml0aWFsaXplIHN0YXRpY2FsbHkgdGhlIGNvbmZpZyAqLworc3RhdGljIHN0cnVjdCBhcmRfY29uZmlnIGxvY2FsX2NvbmYgPSB7IC5kZWZhdWx0X3JjdCA9IDg2NDAwLCAucnVsZXMgPSBGRF9MSVNUX0lOSVRJQUxJWkVSKGxvY2FsX2NvbmYucnVsZXMpIH07CitzdHJ1Y3QgYXJkX2NvbmZpZyAqIGFyZF9jb25mID0gJmxvY2FsX2NvbmY7CisKKy8qIFdlIHVzZSB0aGVzZSBsaXN0cyBpbiB0aGUgcnVsZXMgcGFyc2luZyAqLworc3RhdGljIHN0cnVjdCBmZF9saXN0IHRlbXBfbGlzdF9jcml0ZXJpYSA9IEZEX0xJU1RfSU5JVElBTElaRVIodGVtcF9saXN0X2NyaXRlcmlhKTsKK3N0YXRpYyBzdHJ1Y3QgZmRfbGlzdCB0ZW1wX2xpc3RfdGFyZ2V0ID0gRkRfTElTVF9JTklUSUFMSVpFUih0ZW1wX2xpc3RfdGFyZ2V0KTsKKworLyogTG9jYWwgdmFyaWFibGUgKi8KK3N0YXRpYyBzdHJ1Y3QgYXJkX2NyaXRlcmlhICogYzsKKworLyogRHVtcCB0aGUgY29uZmlndXJhdGlvbiAqLworc3RhdGljIHZvaWQgYXJkX2NvbmZfZHVtcCgpCit7CisJc3RydWN0IGZkX2xpc3QgKiBsaTsKKwlpZiAoIVRSQUNFX0JPT0woRlVMTCkpCisJCXJldHVybjsKKwkJCisJZmRfbG9nX2RlYnVnKCJhcHBfcmVkaXJlY3Q6IGNvbmZpZ3VyYXRpb24gZHVtcDoiKTsKKwlmZF9sb2dfZGVidWcoIiAgIGRlZmF1bHRfcmVkaXJlY3RfY2FjaGVfdGltZSA6ICV1IHNlYyIsIGFyZF9jb25mLT5kZWZhdWx0X3JjdCk7CisJZm9yIChsaSA9IGFyZF9jb25mLT5ydWxlcy5uZXh0OyBsaSAhPSAmYXJkX2NvbmYtPnJ1bGVzOyBsaSA9IGxpLT5uZXh0KSB7CisJCWFyZF9ydWxlX2R1bXAobGktPm8pOworCX0KKwlmZF9sb2dfZGVidWcoImFwcF9yZWRpcmVjdDogZW5kIG9mIGNvbmZpZ3VyYXRpb24gZHVtcCIpOworfQorCisvKiBQYXJzZSB0aGUgY29uZmlndXJhdGlvbiBmaWxlICovCitpbnQgYXJkX2NvbmZfaGFuZGxlKGNoYXIgKiBjb25mZmlsZSkKK3sKKwlleHRlcm4gRklMRSAqIGFyZF9jb25maW47CisJaW50IHJldDsKKwkKKwlUUkFDRV9FTlRSWSgiJXAiLCBjb25mZmlsZSk7CisJCisJVFJBQ0VfREVCVUcgKEZVTEwsICJQYXJzaW5nIGNvbmZpZ3VyYXRpb24gZmlsZTogJXMuLi4iLCBjb25mZmlsZSk7CisJCisJYXJkX2NvbmZpbiA9IGZvcGVuKGNvbmZmaWxlLCAiciIpOworCWlmIChhcmRfY29uZmluID09IE5VTEwpIHsKKwkJcmV0ID0gZXJybm87CisJCVRSQUNFX0RFQlVHKElORk8sICJVbmFibGUgdG8gb3BlbiBleHRlbnNpb24gY29uZmlndXJhdGlvbiBmaWxlICVzIGZvciByZWFkaW5nOiAlcyIsIGNvbmZmaWxlLCBzdHJlcnJvcihyZXQpKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSB5eXBhcnNlKGNvbmZmaWxlKTsKKworCWZjbG9zZShhcmRfY29uZmluKTsKKworCWlmIChyZXQgIT0gMCkgeworCQlUUkFDRV9ERUJVRyAoSU5GTywgIlVuYWJsZSB0byBwYXJzZSB0aGUgY29uZmlndXJhdGlvbiBmaWxlLiIpOworCQlyZXR1cm4gRUlOVkFMOworCX0gZWxzZSB7CisJCVRSQUNFX0RFQlVHKEZVTEwsICJBZGRlZCAlZCBSZWRpcmVjdCBSVUxFUyBzdWNjZXNzZnVsbHkuIiwgcnVsZXNfYWRkZWQpOworCQlhcmRfY29uZl9kdW1wKCk7CisJfQorCQorCXJldHVybiAwOworfQorCisvKiBUaGUgTGV4IHBhcnNlciBwcm90b3R5cGUgKi8KK2ludCBhcmRfY29uZmxleChZWVNUWVBFICpsdmFscCwgWVlMVFlQRSAqbGxvY3ApOworCisvKiBGdW5jdGlvbiB0byByZXBvcnQgdGhlIGVycm9ycyAqLwordm9pZCB5eWVycm9yIChZWUxUWVBFICpwbG9jLCBjaGFyICogY29uZmZpbGUsIGNoYXIgY29uc3QgKnMpCit7CisJVFJBQ0VfREVCVUcoSU5GTywgIkVycm9yIGluIGNvbmZpZ3VyYXRpb24gcGFyc2luZyIpOworCQorCWlmIChwbG9jLT5maXJzdF9saW5lICE9IHBsb2MtPmxhc3RfbGluZSkgeworCQlUUkFDRV9ERUJVRyAoSU5GTywgIiVzOiVkLiVkLSVkLiVkIDogJXMiLCBjb25mZmlsZSwgcGxvYy0+Zmlyc3RfbGluZSwgcGxvYy0+Zmlyc3RfY29sdW1uLCBwbG9jLT5sYXN0X2xpbmUsIHBsb2MtPmxhc3RfY29sdW1uLCBzKTsKKwl9IGVsc2UgaWYgKHBsb2MtPmZpcnN0X2NvbHVtbiAhPSBwbG9jLT5sYXN0X2NvbHVtbikgeworCQlUUkFDRV9ERUJVRyAoSU5GTywgIiVzOiVkLiVkLSVkIDogJXMiLCBjb25mZmlsZSwgcGxvYy0+Zmlyc3RfbGluZSwgcGxvYy0+Zmlyc3RfY29sdW1uLCBwbG9jLT5sYXN0X2NvbHVtbiwgcyk7CisJfSBlbHNlIHsKKwkJVFJBQ0VfREVCVUcgKElORk8sICIlczolZC4lZCA6ICVzIiwgY29uZmZpbGUsIHBsb2MtPmZpcnN0X2xpbmUsIHBsb2MtPmZpcnN0X2NvbHVtbiwgcyk7CisJfQorfQorCisvKiBDb21waWxlIGEgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4gKi8KK3N0YXRpYyBpbnQgY29tcGlsZV9yZWdleCggcmVnZXhfdCAgKiBwcmVnLCBjaGFyICogc3RyICkKK3sKKwlpbnQgZXJyOworCQorCS8qIENvbXBpbGUgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiAqLworCWVyciA9IHJlZ2NvbXAocHJlZywgc3RyLCBSRUdfRVhURU5ERUQgfCBSRUdfTk9TVUIpOworCWlmIChlcnIgIT0gMCkgeworCQljaGFyICogYnVmOworCQlzaXplX3QgYmw7CisJCQorCQkvKiBFcnJvciB3aGlsZSBjb21waWxpbmcgdGhlIHJlZ2V4ICovCisJCVRSQUNFX0RFQlVHKElORk8sICJFcnJvciB3aGlsZSBjb21waWxpbmcgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiAnJXMnOiIsIHN0cik7CisJCQorCQkvKiBHZXQgdGhlIGVycm9yIG1lc3NhZ2Ugc2l6ZSAqLworCQlibCA9IHJlZ2Vycm9yKGVyciwgcHJlZywgTlVMTCwgMCk7CisJCQorCQkvKiBBbGxvYyB0aGUgYnVmZmVyIGZvciBlcnJvciBtZXNzYWdlICovCisJCUNIRUNLX01BTExPQyggYnVmID0gbWFsbG9jKGJsKSApOworCQkKKwkJLyogR2V0IHRoZSBlcnJvciBtZXNzYWdlIGNvbnRlbnQgKi8KKwkJcmVnZXJyb3IoZXJyLCBwcmVnLCBidWYsIGJsKTsKKwkJVFJBQ0VfREVCVUcoSU5GTywgIlx0JXMiLCBidWYpOworCQkKKwkJLyogRnJlZSB0aGUgYnVmZmVyLCByZXR1cm4gdGhlIGVycm9yICovCisJCWZyZWUoYnVmKTsKKwkJcmV0dXJuIEVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCislfQorCisvKiBWYWx1ZXMgcmV0dXJuZWQgYnkgbGV4IGZvciB0b2tlbiAqLworJXVuaW9uIHsKKwkvKiByZXR1cm5lZCBieSBsZXggKi8KKwl1aW50MzJfdAkgdTMyOwkvKiBTdG9yZSBpbnRlZ2VyIHZhbHVlcyAqLworCXN0cnVjdCB7CisJCWNoYXIgKiBzdHI7CisJCWludCByZWdleDsgLyogdHJ1ZSBvciBmYWxzZSAqLworCX0JIHRzdHJpbmc7CS8qIHR5cGVkIHN0cmluZyAqLworfQorCisvKiBJbiBjYXNlIG9mIGVycm9yIGluIHRoZSBsZXhpY2FsIGFuYWx5c2lzICovCisldG9rZW4gCQlUT0tfTEVYX0VSUk9SCisKKy8qIEEgc3RyaW5nIChtYWxsb2MnZCBpbiBsZXggcGFyc2VyOyBpdCBtdXN0IGJlIGZyZWVkIGFmdGVyIHVzZSk6Ki8KKyV0b2tlbiA8dHN0cmluZz4gVE9LX1RTVFJJTkcKKworLyogQW4gaW50ZWdlciB2YWx1ZSAqLworJXRva2VuIDx1MzI+IAlUT0tfVTMyVkFMCisKKyV0eXBlIDx1MzI+CXJ1bGVfdHlwZQorJXR5cGUgPHUzMj4JcnVsZV9kdXJhdGlvbgorCisvKiBUb2tlbnMgKi8KKyV0b2tlbiAJCVRPS19ERUZBVUxUX1JDVAorCisldG9rZW4gCQlUT0tfVE8KKworJXRva2VuIAkJVE9LX0RPTlRfQ0FDSEUKKyV0b2tlbiAJCVRPS19BTExfU0VTU0lPTgorJXRva2VuIAkJVE9LX0FMTF9SRUFMTQorJXRva2VuIAkJVE9LX1JFQUxNX0FORF9BUFBMSUNBVElPTgorJXRva2VuIAkJVE9LX0FMTF9BUFBMSUNBVElPTgorJXRva2VuIAkJVE9LX0FMTF9IT1NUCisldG9rZW4gCQlUT0tfQUxMX1VTRVIKKworJXRva2VuIAkJVE9LX0ZST01fSUQKKyV0b2tlbiAJCVRPS19GUk9NX1JFQUxNCisKKyV0b2tlbiAJCVRPS19BUFAKKworCisKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworJSUKKworCS8qIFRoZSBncmFtbWFyIGRlZmluaXRpb24gKi8KK2NvbmZmaWxlOgkJLyogZW1wdHkgZ3JhbW1hciBpcyBPSyAqLworCQkJfCBjb25mZmlsZSBkZWZfcmN0CisJCQl8IGNvbmZmaWxlIHJ1bGUKKwkJCTsKKwkJCQorCS8qIE92ZXJ3cml0ZSBkZWZhdWx0IGNhY2hlIHRpbWUgdmFsdWUgKi8KK2RlZl9yY3Q6CQlUT0tfREVGQVVMVF9SQ1QgJz0nIFRPS19VMzJWQUwgJzsnCisJCQl7CisJCQkJYXJkX2NvbmYtPmRlZmF1bHRfcmN0ID0gJDM7CisJCQl9CisJCQk7CisJCQkKKwkvKiBhIFJVTEUgZW50cnkgKi8KK3J1bGU6CQkJcnVsZV90eXBlIHJ1bGVfZHVyYXRpb24gJzonIGNyaXRlcmlhX2xpc3QgVE9LX1RPIHRhcmdldF9saXN0ICc7JworCQkJeworCQkJCXN0cnVjdCBhcmRfcnVsZSAqIHI7CisJCQkJLyogQ3JlYXRlIHRoZSBuZXcgcnVsZSB3aXRoIGRhdGEgaW4gZmlsZSAqLworCQkJCUNIRUNLX01BTExPQ19ETyggciA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGFyZF9ydWxlKSksCisJCQkJCXsKKwkJCQkJCXl5ZXJyb3IgKCZ5eWxsb2MsIGNvbmZmaWxlLCAiRXJyb3Igd2hpbGUgYWxsb2NhdGluZyBuZXcgbWVtb3J5Li4uIik7CisJCQkJCQlZWUVSUk9SOworCQkJCQl9ICk7CisJCQkJbWVtc2V0KHIsIDAsIHNpemVvZihzdHJ1Y3QgYXJkX3J1bGUpKTsKKwkJCQlmZF9saXN0X2luaXQoJnItPmNoYWluLCByKTsKKwkJCQlyLT50eXBlID0gJDE7CisJCQkJci0+cmN0ID0gJDI7CisJCQkJZmRfbGlzdF9pbml0KCZyLT5jcml0ZXJpYSwgTlVMTCk7CisJCQkJZmRfbGlzdF9tb3ZlX2VuZCgmci0+Y3JpdGVyaWEsICZ0ZW1wX2xpc3RfY3JpdGVyaWEpOworCQkJCWZkX2xpc3RfaW5pdCgmci0+dGFyZ2V0cywgTlVMTCk7CisJCQkJZmRfbGlzdF9tb3ZlX2VuZCgmci0+dGFyZ2V0cywgJnRlbXBfbGlzdF90YXJnZXQpOworCQkJCQorCQkJCS8qIEFkZCB0aGUgbmV3IHJ1bGUgaW4gY29uZmlnICovCisJCQkJZmRfbGlzdF9pbnNlcnRfYmVmb3JlKCZhcmRfY29uZi0+cnVsZXMsICZyLT5jaGFpbik7CisJCQkJcnVsZXNfYWRkZWQrKzsKKwkJCX0KKwkJCTsKKworcnVsZV90eXBlOgkJVE9LX0RPTlRfQ0FDSEUKKwkJCXsKKwkJCQkkJCA9IERPTlRfQ0FDSEU7CisJCQl9CisJCQl8IFRPS19BTExfU0VTU0lPTgorCQkJeworCQkJCSQkID0gQUxMX1NFU1NJT047CisJCQl9CisJCQl8IFRPS19BTExfUkVBTE0KKwkJCXsKKwkJCQkkJCA9IEFMTF9SRUFMTTsKKwkJCX0KKwkJCXwgVE9LX1JFQUxNX0FORF9BUFBMSUNBVElPTgorCQkJeworCQkJCSQkID0gUkVBTE1fQU5EX0FQUExJQ0FUSU9OOworCQkJfQorCQkJfCBUT0tfQUxMX0FQUExJQ0FUSU9OCisJCQl7CisJCQkJJCQgPSBBTExfQVBQTElDQVRJT047CisJCQl9CisJCQl8IFRPS19BTExfSE9TVAorCQkJeworCQkJCSQkID0gQUxMX0hPU1Q7CisJCQl9CisJCQl8IFRPS19BTExfVVNFUgorCQkJeworCQkJCSQkID0gQUxMX1VTRVI7CisJCQl9CisJCQk7CisJCQkKK3J1bGVfZHVyYXRpb246CQkvKiBlbXB0eSAqLworCQkJeworCQkJCSQkID0gMDsKKwkJCX0KKwkJCXwKKwkJCVRPS19VMzJWQUwKKwkJCXsKKwkJCQkkJCA9ICQxOworCQkJfQorCQkJOworCitjcml0ZXJpYV9saXN0OgkJLyogZW1wdHkgaXMgT0sgKi8KKwkJCXwgY3JpdGVyaWFfbGlzdCBjcml0ZXJpYV9pdGVtOworCQkJOworCitjcml0ZXJpYV9pdGVtOgkJeworCQkJCS8qIENyZWF0ZSB0aGUgbmV3IGNyaXRlcmlhICovCisJCQkJQ0hFQ0tfTUFMTE9DX0RPKCBjID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXJkX2NyaXRlcmlhKSksCisJCQkJCXsKKwkJCQkJCXl5ZXJyb3IgKCZ5eWxsb2MsIGNvbmZmaWxlLCAiRXJyb3Igd2hpbGUgYWxsb2NhdGluZyBuZXcgbWVtb3J5Li4uIik7CisJCQkJCQlZWUVSUk9SOworCQkJCQl9ICk7CisJCQkJbWVtc2V0KGMsIDAsIHNpemVvZihzdHJ1Y3QgYXJkX2NyaXRlcmlhKSk7CisJCQkJZmRfbGlzdF9pbml0KCZjLT5jaGFpbiwgYyk7CisJCQl9CisJCQljcml0ZXJpYV9pdGVtX2luc2lkZQorCQkJeworCQkJCXN0cnVjdCBmZF9saXN0ICogbGk7CisJCQkJLyogSWYgdGhlcmUgaXMgYSBzdHJpbmcsIHNhdmUgaXRzIGxlbmd0aCAqLworCQkJCWlmIChjLT5zKQorCQkJCQljLT5zbCA9IHN0cmxlbihjLT5zKTsKKwkJCQkvKiBJZiB0aGUgY3JpdGVyaWEgY29udGFpbnMgYSByZWdleCwgcGFyc2UgaXQgKi8KKwkJCQlpZiAoYy0+aXNfcmVnZXgpIHsKKwkJCQkJQ0hFQ0tfRkNUX0RPKCBjb21waWxlX3JlZ2V4KCAmYy0+cHJlZywgYy0+cyApLAorCQkJCQkJeworCQkJCQkJCXl5ZXJyb3IgKCZ5eWxsb2MsIGNvbmZmaWxlLCAiRXJyb3IgcGFyc2luZyBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4uLiIpOworCQkJCQkJCVlZRVJST1I7CisJCQkJCQl9ICk7CisJCQkJfQorCQkJCQorCQkJCS8qIE5vdyBsaW5rIHRoaXMgbmV3IGNyaXRlcmlhIGluIHRoZSBsaXN0LiBPcmRlciBieSBjcml0ZXJpYSB0eXBlIHRvIGFjY2VsZXJhdGUgdGhlIHNlYXJjaCAqLworCQkJCWZvciAobGkgPSB0ZW1wX2xpc3RfY3JpdGVyaWEubmV4dDsgbGkgIT0gJnRlbXBfbGlzdF9jcml0ZXJpYTsgbGkgPSBsaS0+bmV4dCkgeworCQkJCQlzdHJ1Y3QgYXJkX2NyaXRlcmlhICogbmMgPSBsaS0+bzsKKwkJCQkJaWYgKG5jLT50eXBlID49IGMtPnR5cGUpCisJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJZmRfbGlzdF9pbnNlcnRfYmVmb3JlKGxpLCAmYy0+Y2hhaW4pOworCQkJfQorCQkJOworCitjcml0ZXJpYV9pdGVtX2luc2lkZToJVE9LX0ZST01fSUQgJz0nIFRPS19UU1RSSU5HCisJCQl7CisJCQkJYy0+dHlwZSA9IEZST01fSUQ7CisJCQkJYy0+cyA9ICQzLnN0cjsKKwkJCQljLT5pc19yZWdleCA9ICQzLnJlZ2V4OworCQkJfQorCQkJfAorCQkJVE9LX0ZST01fUkVBTE0gJz0nIFRPS19UU1RSSU5HCisJCQl7CisJCQkJYy0+dHlwZSA9IEZST01fUkVBTE07CisJCQkJYy0+cyA9ICQzLnN0cjsKKwkJCQljLT5pc19yZWdleCA9ICQzLnJlZ2V4OworCQkJfQorCQkJfAorCQkJVE9LX0FQUCAnPScgVE9LX1UzMlZBTAorCQkJeworCQkJCWMtPnR5cGUgPSBBUFBfSUQ7CisJCQkJYy0+aSA9ICQzOworCQkJfQorCQkJfAorCQkJVE9LX1RTVFJJTkcgJz0nIFRPS19VMzJWQUwKKwkJCXsKKwkJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnAgPSBOVUxMOworCQkJCWlmICgkMS5yZWdleCkgeworCQkJCQl5eWVycm9yKCZ5eWxsb2MsIGNvbmZmaWxlLCAiRXJyb3I6IHRoZSBBVlAgbmFtZSBjYW5ub3QgYmUgc3BlY2lmaWVkIGFzIHJlZ3VsYXIgZXhwcmVzc2lvbiIpOworCQkJCQlZWUVSUk9SOworCQkJCX0KKwkJCQlDSEVDS19GQ1RfRE8oIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRV9BTExfVkVORE9SUywgJDEuc3RyLCAmYXZwLCBFTk9FTlQgKSwKKwkJCQkJeworCQkJCQkJVFJBQ0VfREVCVUcoSU5GTywgIkVycm9yIHdoaWxlIHNlYXJjaGluZyBmb3IgQVZQICclcycuIERpZCB5b3UgbG9hZCB0aGUgcmVsZXZhbnQgZGljdGlvbmFyeSBleHRlbnNpb25zPyIsICQxLnN0cik7CisJCQkJCQl5eWVycm9yKCZ5eWxsb2MsIGNvbmZmaWxlLCAiVW5hYmxlIHRvIHJlc29sdmUgc3BlY2lmaWVkIEFWUCBuYW1lLiIpOworCQkJCQkJWVlFUlJPUjsKKwkJCQkJfSAgKTsKKwkJCQlDSEVDS19GQ1RfRE8oIGZkX2RpY3RfZ2V0dmFsKGF2cCwgJmMtPmF2cF9pbmZvKSwKKwkJCQkJeworCQkJCQkJVFJBQ0VfREVCVUcoSU5GTywgIkVycm9yIHdoaWxlIHJldHJpZXZpbmcgdGhlIGRlc2NyaXB0aW9uIGZvciBBVlAgJyVzJyIsICQxLnN0cik7CisJCQkJCQl5eWVycm9yKCZ5eWxsb2MsIGNvbmZmaWxlLCAiVW5hYmxlIHRvIHJldHJpZXZlIHNwZWNpZmllZCBBVlAncyBkYXRhLiIpOworCQkJCQkJWVlFUlJPUjsKKwkJCQkJfSAgKTsKKwkJCQlpZiAoYy0+YXZwX2luZm8uYXZwX2Jhc2V0eXBlICE9IEFWUF9UWVBFX1VOU0lHTkVEMzIpIHsKKwkJCQkJVFJBQ0VfREVCVUcoSU5GTywgIlRoZSBBVlAgJyVzJyBpcyBub3Qgb2YgdHlwZSBVTlNJR05FRDMyLCBtYXRjaGluZyBpcyBub3Qgc3VwcG9ydGVkICh5ZXQpIiwgJDEuc3RyKTsKKwkJCQkJeXllcnJvcigmeXlsbG9jLCBjb25mZmlsZSwgIkludmFsaWQgQVZQIGZvciB0aGlzIG9wZXJhdGlvbi4iKTsKKwkJCQkJWVlFUlJPUjsKKwkJCQl9CisJCQkJCisJCQkJYy0+dHlwZSA9IEFWUF9JTlQ7CisJCQkJYy0+aSA9ICQzOworCQkJfQorCQkJfAorCQkJVE9LX1RTVFJJTkcgJz0nIFRPS19UU1RSSU5HCisJCQl7CisJCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwID0gTlVMTDsKKwkJCQlpZiAoJDEucmVnZXgpIHsKKwkJCQkJeXllcnJvcigmeXlsbG9jLCBjb25mZmlsZSwgIkVycm9yOiB0aGUgQVZQIG5hbWUgY2Fubm90IGJlIHNwZWNpZmllZCBhcyByZWd1bGFyIGV4cHJlc3Npb24iKTsKKwkJCQkJWVlFUlJPUjsKKwkJCQl9CisJCQkJQ0hFQ0tfRkNUX0RPKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUVfQUxMX1ZFTkRPUlMsICQxLnN0ciwgJmF2cCwgRU5PRU5UICksCisJCQkJCXsKKwkJCQkJCVRSQUNFX0RFQlVHKElORk8sICJFcnJvciB3aGlsZSBzZWFyY2hpbmcgZm9yIEFWUCAnJXMnLiBEaWQgeW91IGxvYWQgdGhlIHJlbGV2YW50IGRpY3Rpb25hcnkgZXh0ZW5zaW9ucz8iLCAkMS5zdHIpOworCQkJCQkJeXllcnJvcigmeXlsbG9jLCBjb25mZmlsZSwgIlVuYWJsZSB0byByZXNvbHZlIHNwZWNpZmllZCBBVlAgbmFtZS4iKTsKKwkJCQkJCVlZRVJST1I7CisJCQkJCX0gICk7CisJCQkJQ0hFQ0tfRkNUX0RPKCBmZF9kaWN0X2dldHZhbChhdnAsICZjLT5hdnBfaW5mbyksCisJCQkJCXsKKwkJCQkJCVRSQUNFX0RFQlVHKElORk8sICJFcnJvciB3aGlsZSByZXRyaWV2aW5nIHRoZSBkZXNjcmlwdGlvbiBmb3IgQVZQICclcyciLCAkMS5zdHIpOworCQkJCQkJeXllcnJvcigmeXlsbG9jLCBjb25mZmlsZSwgIlVuYWJsZSB0byByZXRyaWV2ZSBzcGVjaWZpZWQgQVZQJ3MgZGF0YS4iKTsKKwkJCQkJCVlZRVJST1I7CisJCQkJCX0gICk7CisJCQkJaWYgKGMtPmF2cF9pbmZvLmF2cF9iYXNldHlwZSAhPSBBVlBfVFlQRV9PQ1RFVFNUUklORykgeworCQkJCQlUUkFDRV9ERUJVRyhJTkZPLCAiVGhlIEFWUCAnJXMnIGlzIG5vdCBvZiB0eXBlIE9DVEVUU1RSSU5HLCBtYXRjaGluZyBpcyBub3Qgc3VwcG9ydGVkICh5ZXQpIiwgJDEuc3RyKTsKKwkJCQkJeXllcnJvcigmeXlsbG9jLCBjb25mZmlsZSwgIkludmFsaWQgQVZQIGZvciB0aGlzIG9wZXJhdGlvbi4iKTsKKwkJCQkJWVlFUlJPUjsKKwkJCQl9CisJCQkJCisJCQkJYy0+dHlwZSA9IEFWUF9TVFI7CisJCQkJYy0+cyA9ICQzLnN0cjsKKwkJCQljLT5pc19yZWdleCA9ICQzLnJlZ2V4OworCQkJfQorCQkJOworCit0YXJnZXRfbGlzdDoJCS8qIFRoaXMgbGlzdCBjYW5ub3QgYmUgZW1wdHkgKi8KKwkJCXRhcmdldF9pdGVtCisJCQl8IHRhcmdldF9saXN0IHRhcmdldF9pdGVtCisJCQk7CisKK3RhcmdldF9pdGVtOgkJVE9LX1RTVFJJTkcKKwkJCXsKKwkJCQlzdHJ1Y3QgYXJkX3RhcmdldCAqIHQ7CisJCQkJCisJCQkJaWYgKCQxLnJlZ2V4KSB7CisJCQkJCXl5ZXJyb3IoJnl5bGxvYywgY29uZmZpbGUsICJSZWd1bGFyIGV4cHJlc3Npb25zIGFyZSBub3QgYWxsb3dlZCBpbiBSZWRpcmVjdC1Ib3N0IHNwZWNpZmljYXRpb24uIik7CisJCQkJCVlZRVJST1I7CisJCQkJfQorCQkJCQorCQkJCS8qIENoZWNrIGlmIHRoZSBmb3JtYXQgaXMgdmFsaWQgKi8KKwkJCQlDSEVDS19GQ1RfRE8oIGZkX29zX3BhcnNlX0RpYW1ldGVyVVJJKCh1aW50OF90ICopJDEuc3RyLCBzdHJsZW4oJDEuc3RyKSwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCksCisJCQkJCXsKKwkJCQkJCVRSQUNFX0RFQlVHKElORk8sICJFcnJvciB3aGlsZSBwYXJzaW5nIERpYW1ldGVyVVJJICclcyciLCAkMS5zdHIpOworCQkJCQkJeXllcnJvcigmeXlsbG9jLCBjb25mZmlsZSwgIlNwZWNpZmllZCBEaWFtZXRlclVSSSBpcyBpbnZhbGlkLiIpOworCQkJCQkJWVlFUlJPUjsKKwkJCQkJfSAgKTsKKwkJCQkKKwkJCQkvKiBPay4gd2UgY3JlYXRlIHRoZSBuZXcgdGFyZ2V0ICovCisJCQkJQ0hFQ0tfTUFMTE9DX0RPKCB0ID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXJkX3RhcmdldCkpLAorCQkJCQl7CisJCQkJCQl5eWVycm9yICgmeXlsbG9jLCBjb25mZmlsZSwgIkVycm9yIHdoaWxlIGFsbG9jYXRpbmcgbmV3IG1lbW9yeS4uLiIpOworCQkJCQkJWVlFUlJPUjsKKwkJCQkJfSApOworCQkJCW1lbXNldCh0LCAwLCBzaXplb2Yoc3RydWN0IGFyZF90YXJnZXQpKTsKKwkJCQlmZF9saXN0X2luaXQoJnQtPmNoYWluLCB0KTsKKwkJCQkKKwkJCQl0LT5zID0gKG9zMF90KSAkMS5zdHI7CisJCQkJdC0+bCA9IHN0cmxlbigkMS5zdHIpOworCQkJCQorCQkJCWZkX2xpc3RfaW5zZXJ0X2JlZm9yZSgmdGVtcF9saXN0X3RhcmdldCwgJnQtPmNoYWluKTsKKwkJCX0KKwkJCTsKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvYXBwX3JlZGlyZWN0L2FyZF9ydWxlcy5jIGIvZXh0ZW5zaW9ucy9hcHBfcmVkaXJlY3QvYXJkX3J1bGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdhMzg2MQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvYXBwX3JlZGlyZWN0L2FyZF9ydWxlcy5jCkBAIC0wLDAgKzEsMjk4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxMywgV0lERSBQcm9qZWN0IGFuZCBOSUNUCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBXSURFIFByb2plY3Qgb3IgTklDVCBub3IgdGhlIAkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFdJREUgUHJvamVjdCBhbmQgCQkJCQkJICoKKyogICBOSUNULgkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJhcHBfcmVkaXIuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgKiByZWRpcl90eXBlX3N0cltdID0geworCSJET05UX0NBQ0hFIiwKKwkiQUxMX1NFU1NJT04iLAorCSJBTExfUkVBTE0iLAorCSJSRUFMTV9BTkRfQVBQTElDQVRJT04iLAorCSJBTExfQVBQTElDQVRJT04iLAorCSJBTExfSE9TVCIsCisJIkFMTF9VU0VSIgorfTsKKworc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwX1JlZGlyZWN0X0hvc3QgPSBOVUxMOworc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwX1JlZGlyZWN0X0hvc3RfVXNhZ2UgPSBOVUxMOworc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwX1JlZGlyZWN0X01heF9DYWNoZV9UaW1lID0gTlVMTDsKKwkKKwordm9pZCBhcmRfcnVsZV9kdW1wKHN0cnVjdCBhcmRfcnVsZSAqIHIpCit7CisJc3RydWN0IGZkX2xpc3QgKiBsaTsKKwlmZF9sb2dfZGVidWcoIiAgIHJ1bGUgQCVwOiAlcywgJXVzIiwgciwgcmVkaXJfdHlwZV9zdHJbci0+dHlwZV0sIHItPnJjdCk7CisJZm9yIChsaSA9IHItPmNyaXRlcmlhLm5leHQ7IGxpICE9ICZyLT5jcml0ZXJpYTsgbGkgPSBsaS0+bmV4dCkgeworCQlzdHJ1Y3QgYXJkX2NyaXRlcmlhICogYyA9IGxpLT5vOworCQlzd2l0Y2ggKGMtPnR5cGUpIHsKKwkJCWNhc2UgRlJPTV9JRDoKKwkJCQlmZF9sb2dfZGVidWcoIiAgICAgIENyaXRlcmlhOiByZWNlaXZlZCBmcm9tIHBlZXIgJXMnJXMnIiwgYy0+aXNfcmVnZXg/IlJFR0VYIjoiIiwgYy0+cyk7CisJCQkJYnJlYWs7CisJCQljYXNlIEZST01fUkVBTE06CisJCQkJZmRfbG9nX2RlYnVnKCIgICAgICBDcml0ZXJpYTogcmVjZWl2ZWQgZnJvbSByZWFsbSAlcyclcyciLCBjLT5pc19yZWdleD8iUkVHRVgiOiIiLCBjLT5zKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQVBQX0lEOgorCQkJCWZkX2xvZ19kZWJ1ZygiICAgICAgQ3JpdGVyaWE6IGFwcGxpY2F0aW9uIGlkIGlzICV1IiwgYy0+aSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEFWUF9JTlQ6CisJCQkJZmRfbG9nX2RlYnVnKCIgICAgICBDcml0ZXJpYTogY29udGFpbnMgJyVzJyBBVlAgd2l0aCB2YWx1ZSAnJWQnIiwgYy0+YXZwX2luZm8uYXZwX25hbWUsIGMtPmkpOworCQkJCWJyZWFrOworCQkJY2FzZSBBVlBfU1RSOgorCQkJCWZkX2xvZ19kZWJ1ZygiICAgICAgQ3JpdGVyaWE6IGNvbnRhaW5zICclcycgQVZQIHdpdGggdmFsdWUgJXMnJXMnIiwgYy0+YXZwX2luZm8uYXZwX25hbWUsIGMtPmlzX3JlZ2V4PyJSRUdFWCI6IiIsIGMtPnMpOworCQkJCWJyZWFrOworCQkKKwkJCWRlZmF1bHQ6CisJCQkJZmRfbG9nX2RlYnVnKCIgICAgICBDcml0ZXJpYTogaW52YWxpZCAoJWQpISIsIGMtPnR5cGUpOworCQl9CisJfQorCWZvciAobGkgPSByLT50YXJnZXRzLm5leHQ7IGxpICE9ICZyLT50YXJnZXRzOyBsaSA9IGxpLT5uZXh0KSB7CisJCXN0cnVjdCBhcmRfdGFyZ2V0ICogdCA9IGxpLT5vOworCQlmZF9sb2dfZGVidWcoIiAgICAgIFJlZGlyZWN0IHRvOiAnJXMnIiwgdC0+cyk7CisJfQorfQorCisvKiBUZWxscyBpZiB0aGUgc3RyaW5nIGluIHMgKGlzMHRlcm0gb3Igbm90KSBtYXRjaGVzIHRoZSBzdHJpbmcgaW4gdGhlIGNyaXRlcmlhIChyZWdleCBvciBub3QpICovCitzdGF0aWMgaW50IHN0cl9tYXRjaChzdHJ1Y3QgYXJkX2NyaXRlcmlhICogYywgdWludDhfdCAqcywgc2l6ZV90IGwsIGludCBpczB0ZXJtLCBpbnQgKiBtYXRjaCkKK3sKKwlUUkFDRV9FTlRSWSgiJXAgJXAgJXpkICVkICVwIiwgYywgcywgbCwgaXMwdGVybSwgbWF0Y2gpOworCQorCSptYXRjaCA9IDA7CisJCisJaWYgKGMtPmlzX3JlZ2V4ID09IDApIHsKKwkJaWYgKCAhIGZkX29zX2FsbW9zdGNhc2VzcmNoKGMtPnMsIGMtPnNsLCBzLCBsLCBOVUxMKSApCisJCQkqbWF0Y2ggPSAxOworCX0gZWxzZSB7CisJCWludCBlcnI7CisjaWZkZWYgSEFWRV9SRUdfU1RBUlRFTkQKKwkJcmVnbWF0Y2hfdCBwbWF0Y2hbMV07CisJCW1lbXNldChwbWF0Y2gsIDAsIHNpemVvZihwbWF0Y2gpKTsKKwkJcG1hdGNoWzBdLnJtX3NvID0gMDsKKwkJcG1hdGNoWzBdLnJtX2VvID0gbDsKKwkJZXJyID0gcmVnZXhlYygmYy0+cHJlZywgKGNoYXIgKilzLCAwLCBwbWF0Y2gsIFJFR19TVEFSVEVORCk7CisjZWxzZSAvKiBIQVZFX1JFR19TVEFSVEVORCAqLworCQlpZiAoIWlzMHRlcm0pIHsKKwkJCS8qIFdlIGhhdmUgdG8gY3JlYXRlIGEgY29weSBvZiB0aGUgc3RyaW5nIGluIHRoaXMgY2FzZSAqLworCQkJY2hhciAqbXlzdHJjcHk7CisJCQlDSEVDS19NQUxMT0MoIG15c3RyY3B5ID0gKGNoYXIgKilvczBkdXAocywgbCkgKTsKKwkJCWVyciA9IHJlZ2V4ZWMoJmMtPnByZWcsIG15c3RyY3B5LCAwLCBOVUxMLCAwKTsKKwkJCWZyZWUobXlzdHJjcHkpOworCQl9IGVsc2UgeworCQkJZXJyID0gcmVnZXhlYygmYy0+cHJlZywgKGNoYXIgKilzLCAwLCBOVUxMLCAwKTsKKwkJfQorI2VuZGlmIC8qIEhBVkVfUkVHX1NUQVJURU5EICovCisJCQorCQkvKiBOb3cgY2hlY2sgdGhlIHJlc3VsdCAqLworCQlpZiAoZXJyID09IDApIHsKKwkJCS8qIFdlIGhhdmUgYSBtYXRjaCAqLworCQkJKm1hdGNoID0gMTsKKwkJfSBlbHNlIGlmIChlcnIgIT0gUkVHX05PTUFUQ0gpIHsKKwkJCS8qIEFuIGVycm9yIG9jY3VycmVkICovCisJCQljaGFyICogYnVmOworCQkJc2l6ZV90IGJsOworCisJCQkvKiBFcnJvciB3aGlsZSBjb21waWxpbmcgdGhlIHJlZ2V4ICovCisJCQlUUkFDRV9ERUJVRyhJTkZPLCAiRXJyb3Igd2hpbGUgZXhlY3V0aW5nIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gJyVzJzoiLCBjLT5zKTsKKworCQkJLyogR2V0IHRoZSBlcnJvciBtZXNzYWdlIHNpemUgKi8KKwkJCWJsID0gcmVnZXJyb3IoZXJyLCAmYy0+cHJlZywgTlVMTCwgMCk7CisKKwkJCS8qIEFsbG9jIHRoZSBidWZmZXIgZm9yIGVycm9yIG1lc3NhZ2UgKi8KKwkJCUNIRUNLX01BTExPQyggYnVmID0gbWFsbG9jKGJsKSApOworCisJCQkvKiBHZXQgdGhlIGVycm9yIG1lc3NhZ2UgY29udGVudCAqLworCQkJcmVnZXJyb3IoZXJyLCAmYy0+cHJlZywgYnVmLCBibCk7CisJCQlUUkFDRV9ERUJVRyhJTkZPLCAiXHQlcyIsIGJ1Zik7CisKKwkJCS8qIEZyZWUgdGhlIGJ1ZmZlciwgcmV0dXJuIHRoZSBlcnJvciAqLworCQkJZnJlZShidWYpOworCQkJcmV0dXJuIChlcnIgPT0gUkVHX0VTUEFDRSkgPyBFTk9NRU0gOiBFSU5WQUw7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIFNlYXJjaCB0aGUgZmlyc3QgbWF0Y2hpbmcgcnVsZSBpbiB0aGUgY29uZmlnICovCitzdGF0aWMgaW50IGZpbmRfcnVsZShzdHJ1Y3QgbXNnICogbXNnLCBzdHJ1Y3QgYXJkX3J1bGUgKiogZm91bmQpCit7CisJc3RydWN0IGZkX2xpc3QgKiBsaTsKKwlzdHJ1Y3QgbXNnX2hkciAqIG1oZHIgPSBOVUxMOworCXN0cnVjdCBwZWVyX2hkciAqIHBoZHIgPSBOVUxMOworCQorCUFTU0VSVChtc2cgJiYgZm91bmQpOworCSpmb3VuZCA9IE5VTEw7CisJCisJLyogR2V0IHRoZSBtZXNzYWdlJ3MgaGVhZGVyICovCisJQ0hFQ0tfRkNUKCBmZF9tc2dfaGRyKG1zZywgJm1oZHIpICk7CisJCisJLyogR2V0IHRoZSBtZXNzYWdlJ3Mgb3JpZ2luICovCisJeworCQlEaWFtSWRfdCBpZDsKKwkJc2l6ZV90IGxlbjsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfc291cmNlX2dldChtc2csICZpZCwgJmxlbikgKTsKKwkJQ0hFQ0tfRkNUKCBmZF9wZWVyX2dldGJ5aWQoaWQsIGxlbiwgMCwgJnBoZHIpICk7CisJfQorCQorCS8qIE5vdyBmb3IgZWFjaCBydWxlIGNoZWNrIGlmIGFsbCBjcml0ZXJpYSBtYXRjaCAqLworCWZvciAobGkgPSBhcmRfY29uZi0+cnVsZXMubmV4dDsgbGkgIT0gJmFyZF9jb25mLT5ydWxlczsgbGkgPSBsaS0+bmV4dCkgeworCQlzdHJ1Y3QgZmRfbGlzdCAqIGxpYzsKKwkJc3RydWN0IGFyZF9ydWxlICogciA9IGxpLT5vOworCQlpbnQgaXNfbWF0Y2ggPSAxOworCQkKKwkJZm9yIChsaWMgPSByLT5jcml0ZXJpYS5uZXh0OyBpc19tYXRjaCAmJiAobGljICE9ICZyLT5jcml0ZXJpYSk7IGxpYyA9IGxpYy0+bmV4dCkgeworCQkJc3RydWN0IGFyZF9jcml0ZXJpYSAqIGMgPSBsaWMtPm87CisJCQkKKwkJCS8qIERvZXMgdGhpcyBjcml0ZXJpYSBtYXRjaCA/ICovCisJCQlzd2l0Y2ggKGMtPnR5cGUpIHsKKwkJCQljYXNlIEFQUF9JRDoKKwkJCQkJaWYgKGMtPmkgIT0gbWhkci0+bXNnX2FwcGwpCisJCQkJCQlpc19tYXRjaCA9IDA7CisJCQkJCWJyZWFrOworCQkJCQkKKwkJCQljYXNlIEZST01fSUQ6CisJCQkJCUNIRUNLX0ZDVCggc3RyX21hdGNoKGMsICh1aW50OF90ICopcGhkci0+aW5mby5waV9kaWFtaWQsIHBoZHItPmluZm8ucGlfZGlhbWlkbGVuLCAxLCAmaXNfbWF0Y2gpICk7CisJCQkJCWJyZWFrOworCQkJCQorCQkJCWNhc2UgRlJPTV9SRUFMTToKKwkJCQkJaWYgKHBoZHItPmluZm8ucnVudGltZS5waXJfcmVhbG0pIHsKKwkJCQkJCUNIRUNLX0ZDVCggc3RyX21hdGNoKGMsICh1aW50OF90ICopcGhkci0+aW5mby5ydW50aW1lLnBpcl9yZWFsbSwgcGhkci0+aW5mby5ydW50aW1lLnBpcl9yZWFsbWxlbiwgMSwgJmlzX21hdGNoKSApOworCQkJCQl9IGVsc2UgeworCQkJCQkJLyogc2luY2Ugd2UgZG9uJ3QgaGF2ZSB0aGUgcmVhbG0gaXQgd2FzIHJlY2VpdmVkIGZyb20sIGFzc3VtZSBpdCBkb2VzIG5vdCBtYXRjaCAqLworCQkJCQkJVFJBQ0VfREVCVUcoSU5GTywgIk1pc3NpbmcgcmVhbG0gaW5mbyBmb3IgcGVlciAnJXMnLCBza2lwcGluZyBydWxlICVwIiwgcGhkci0+aW5mby5waV9kaWFtaWQsIHIpOworCQkJCQkJaXNfbWF0Y2ggPSAwOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCQorCQkJCWNhc2UgQVZQX0lOVDoKKwkJCQljYXNlIEFWUF9TVFI6CisJCQkJCS8qIFdlIGhhdmUgdG8gc2VhcmNoIHRoZSB3aG9sZSBtZXNzYWdlIGZvciB0aGUgbWF0Y2hpbmcgQVZQICovCisJCQkJCXsKKwkJCQkJCWlzX21hdGNoID0gMDsKKwkJCQkJCXN0cnVjdCBhdnAgKiBhdnAgPSBOVUxMOworCQkJCQkJQ0hFQ0tfRkNUKCAgZmRfbXNnX2Jyb3dzZShtc2csIE1TR19CUldfRklSU1RfQ0hJTEQsICZhdnAsIE5VTEwpICApOworCQkJCQkJd2hpbGUgKGF2cCAmJiAhaXNfbWF0Y2gpIHsKKwkJCQkJCQlzdHJ1Y3QgYXZwX2hkciAqIGFoZHIgPSBOVUxMOworCQkJCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9oZHIoYXZwLCAmYWhkcikgKTsKKworCQkJCQkJCWlmICggKGFoZHItPmF2cF9jb2RlID09IGMtPmF2cF9pbmZvLmF2cF9jb2RlKQorCQkJCQkJCSAgJiYgKGFoZHItPmF2cF92ZW5kb3IgPT0gYy0+YXZwX2luZm8uYXZwX3ZlbmRvcikgKSAgLyogYWx3YXlzIDAgaWYgbm8gViBmbGFnICovCisJCQkJCQkJeworCQkJCQkJCQkvKiBkaWN0LXBhcnNlIHRoaXMgQVZQIHRvIGVuc3VyZSBpdCBoYXMgYSB2YWx1ZSAqLworCQkJCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19wYXJzZV9kaWN0KCBhdnAsIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgTlVMTCApICk7CisKKwkJCQkJCQkJLyogTm93IGNoZWNrIGlmIHRoZSB2YWx1ZSBtYXRjaGVzIG91ciBjcml0ZXJpYSAqLworCQkJCQkJCQlpZiAoYy0+dHlwZSA9PSBBVlBfSU5UKSB7CisJCQkJCQkJCQlpZiAoYWhkci0+YXZwX3ZhbHVlLT51MzIgPT0gYy0+aSkKKwkJCQkJCQkJCQlpc19tYXRjaCA9IDE7CisJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQkvKiBpdCBpcyBBVlBfU1RSICovCisJCQkJCQkJCQlDSEVDS19GQ1QoIHN0cl9tYXRjaChjLCBhaGRyLT5hdnBfdmFsdWUtPm9zLmRhdGEsIGFoZHItPmF2cF92YWx1ZS0+b3MubGVuLCAwLCAmaXNfbWF0Y2gpICk7CisJCQkJCQkJCX0KKworCQkJCQkJCQlpZiAoaXNfbWF0Y2gpCisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisKKwkJCQkJCQkvKiBnbyB0byBuZXh0ICovCisJCQkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYnJvd3NlKGF2cCwgTVNHX0JSV19ORVhULCAmYXZwLCBOVUxMKSApOworCQkJCQkJfQorCisJCQkJCX0KKwkJCQkKKwkJCQkJYnJlYWs7CisJCQkKKwkJCX0KKwkJfQorCQkKKwkJaWYgKGlzX21hdGNoKSB7CisJCQkvKiBXZSBmb3VuZCB0aGUgZmlyc3QgcnVsZSB0aGF0IG1hdGNoZXMgZm9yIHRoaXMgbWVzc2FnZSAqLworCQkJKmZvdW5kID0gcjsKKwkJCWJyZWFrOworCQl9CisJfQorCQorCXJldHVybiAwOworfQorCisvKiBUaGUgZm9yd2FyZCBjYWxsYmFjayAqLworaW50IGFyZF9ydWxlX2FwcGx5KHZvaWQgKiBjYmRhdGEsIHN0cnVjdCBtc2cgKiogbXNnKQoreworCXN0cnVjdCBhcmRfcnVsZSAqIHJ1bGUgPSBOVUxMOworCQorCVRSQUNFX0VOVFJZKCIlcCAlcCIsIGNiZGF0YSwgbXNnKTsKKwlDSEVDS19QQVJBTVMobXNnICYmICptc2cpOworCQorCS8qIEZpcnN0LCBjaGVjayBpZiB3ZSBoYXZlIGEgcnVsZSB0aGF0IGFwcGxpZXMgdG8gdGhpcyBtZXNzYWdlICovCisJQ0hFQ0tfRkNUKCBmaW5kX3J1bGUoKm1zZywgJnJ1bGUpICk7CisJCisJaWYgKHJ1bGUpIHsKKwkJc3RydWN0IGF2cCAqIGF2cDsKKwkJdW5pb24gYXZwX3ZhbHVlIHZhbDsKKwkJc3RydWN0IGZkX2xpc3QgKiBsaTsKKwkJCisJCS8qIFdlIGhhdmUgdG8gcmVwbHkgYSBSZWRpcmVjdCBtZXNzYWdlIGluIHRoaXMgY2FzZSAqLworCQlDSEVDS19GQ1QoIGZkX21zZ19uZXdfYW5zd2VyX2Zyb21fcmVxKGZkX2dfY29uZmlnLT5jbmZfZGljdCwgbXNnLCBNU0dGTF9BTlNXX0VSUk9SKSApOworCQkKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfcmVzY29kZV9zZXQoICptc2csICJESUFNRVRFUl9SRURJUkVDVF9JTkRJQ0FUSU9OIiwgTlVMTCwgTlVMTCwgMSApICk7CisJCQorCQkvKiBOb3cgYWRkIHRoZSBSZWRpcmVjdC0qIEFWUHMgKi8KKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyggYXZwX1JlZGlyZWN0X0hvc3RfVXNhZ2UsIDAsICZhdnAgKSApOworCQl2YWwudTMyID0gcnVsZS0+dHlwZTsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX3NldHZhbHVlKCBhdnAsICZ2YWwgKSApOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkKCAqbXNnLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCApICk7CisJCQorCQlpZiAocnVsZS0+dHlwZSkgeworCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyggYXZwX1JlZGlyZWN0X01heF9DYWNoZV9UaW1lLCAwLCAmYXZwICkgKTsKKwkJCXZhbC51MzIgPSBydWxlLT5yY3QgPzogYXJkX2NvbmYtPmRlZmF1bHRfcmN0OworCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX3NldHZhbHVlKCBhdnAsICZ2YWwgKSApOworCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCggKm1zZywgTVNHX0JSV19MQVNUX0NISUxELCBhdnAgKSApOworCQl9CisJCQorCQlmb3IgKGxpID0gcnVsZS0+dGFyZ2V0cy5uZXh0OyBsaSAhPSAmcnVsZS0+dGFyZ2V0czsgbGkgPSBsaS0+bmV4dCkgeworCQkJc3RydWN0IGFyZF90YXJnZXQgKiB0ID0gbGktPm87CisJCQkKKwkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcoIGF2cF9SZWRpcmVjdF9Ib3N0LCAwLCAmYXZwICkgKTsKKwkJCXZhbC5vcy5kYXRhID0gdC0+czsKKwkJCXZhbC5vcy5sZW4gID0gdC0+bDsKKwkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9zZXR2YWx1ZSggYXZwLCAmdmFsICkgKTsKKwkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQoICptc2csIE1TR19CUldfTEFTVF9DSElMRCwgYXZwICkgKTsKKwkJfQorCQkKKwkJLyogU2VuZCB0aGlzIGFuc3dlciAqLworCQlDSEVDS19GQ1QoIGZkX21zZ19zZW5kKCBtc2csIE5VTEwsIE5VTEwpICk7CisJfQorCQorCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2FwcF9zaXAvQ01ha2VMaXN0cy50eHQgYi9leHRlbnNpb25zL2FwcF9zaXAvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJkODlkMQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvYXBwX3NpcC9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDQ3IEBACisjIFRoZSBhcHBfc2lwIGV4dGVuc2lvbgorUFJPSkVDVCgiRGlhbWV0ZXIgU0lQIEFwcGxpY2F0aW9uIChSRkM0NzQwKSIgQykKKworRklORF9QQUNLQUdFKE15U1FMIFJFUVVJUkVEKQorSU5DTFVERV9ESVJFQ1RPUklFUygke015U1FMX0lOQ0xVREVfRElSfSkgCisKKyMgUGFyc2VyIGZpbGVzCitCSVNPTl9GSUxFKGFwcF9zaXAueSkKK0ZMRVhfRklMRShhcHBfc2lwLmwpCitTRVRfU09VUkNFX0ZJTEVTX1BST1BFUlRJRVMobGV4LmFwcF9zaXAuYyBhcHBfc2lwLnRhYi5jIFBST1BFUlRJRVMgQ09NUElMRV9GTEFHUyAiLUkgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9IikKKworIyBMaXN0IG9mIHNvdXJjZSBmaWxlcworU0VUKCBESUFNX1NJUF9TUkMKKwlsZXguYXBwX3NpcC5jCisJYXBwX3NpcC50YWIuYworCWFwcF9zaXAudGFiLmgKKwlhcHBfc2lwLmMKKwlhcHBfc2lwLmgKKwlsaWJhcHBfc2lwLmMKKwltZDUuYworCW11bHRpbWVkaWFhdXRoLmMKKwlyZWdpc3RyYXRpb250ZXJtaW5hdGlvbi5jCisJdXNlcmF1dGhvcml6YXRpb24uYworCXB1c2hwcm9maWxlLmMKKwlzZXJ2ZXJhc3NpZ25tZW50LmMKKwlsb2NhdGlvbmluZm8uYworCWxvY2F0aW9uaW5mb3NsLmMKKykKKworIyBDb21waWxlIGFzIGEgbW9kdWxlCitGRF9BRERfRVhURU5TSU9OKGFwcF9zaXAgJHtESUFNX1NJUF9TUkN9KQorCitUQVJHRVRfTElOS19MSUJSQVJJRVMoYXBwX3NpcCAke015U1FMX0xJQlJBUklFU30pCisKK1NVQkRJUlModG9vbHMpCisKKyMjIyMKKyMjIElOU1RBTEwgc2VjdGlvbiAjIworCitJTlNUQUxMKFRBUkdFVFMgYXBwX3NpcAorCUxJQlJBUlkgREVTVElOQVRJT04gJHtJTlNUQUxMX0VYVEVOU0lPTlNfU1VGRklYfQorCUNPTVBPTkVOVCBmcmVlRGlhbWV0ZXItc2lwLXNlcnZlcikKKworSU5TVEFMTChGSUxFUyBSRUFETUUgVE9ETworCURFU1RJTkFUSU9OIC91c3Ivc2hhcmUvZG9jL2ZyZWVEaWFtZXRlci1zaXAtc2VydmVyCisJQ09ORklHVVJBVElPTlMgRGViaWFuUGFja2FnZSAKKwlDT01QT05FTlQgZnJlZURpYW1ldGVyLXNpcC1zZXJ2ZXIpCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2FwcF9zaXAvUkVBRE1FIGIvZXh0ZW5zaW9ucy9hcHBfc2lwL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmM1NTM2Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9hcHBfc2lwL1JFQURNRQpAQCAtMCwwICsxLDM5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogQWxleGFuZHJlIFdlc3RmYWhsIDxhd2VzdGZhaGxAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTAsIEFsZXhhbmRyZSBXZXN0ZmFobCwgVGVyYW9rYSBMYWJvcmF0b3J5IChLZWlvIFVuaXZlcnNpdHkpLCBhbmQgdGhlIFdJREUgUHJvamVjdC4gCSAqCQkKKyoJCQkJCQkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVGVyYW9rYSBMYWJvcmF0b3J5IG5vciB0aGUgCQkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFRlcmFva2EgTGFib3JhdG9yeSAJCQkJCQkgKgorKiAgIAkJCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK0RpYW1ldGVyLVNJUCBBcHBsaWNhdGlvbiB3aWxsIGJlIGZ1bGx5IGNvbXBsaWFudCB3aXRoIFJGQzQ3NDAgKHNlcnZlciBwYXJ0KS4gSG93ZXZlciwgdGhlcmUgaXMgc3RpbGwgc29tZSB3b3JrIHRvIGRvIHNvIGl0IHNob3VsZCBiZSBjb25zaWRlcmVkIGFzIGV4cGVyaW1lbnRhbCBmb3Igbm93LgorCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2FwcF9zaXAvVE9ETyBiL2V4dGVuc2lvbnMvYXBwX3NpcC9UT0RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2MWZhY2UKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2FwcF9zaXAvVE9ETwpAQCAtMCwwICsxLDU3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogQWxleGFuZHJlIFdlc3RmYWhsIDxhd2VzdGZhaGxAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTAsIEFsZXhhbmRyZSBXZXN0ZmFobCwgVGVyYW9rYSBMYWJvcmF0b3J5IChLZWlvIFVuaXZlcnNpdHkpLCBhbmQgdGhlIFdJREUgUHJvamVjdC4gCSAqCQkKKyoJCQkJCQkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVGVyYW9rYSBMYWJvcmF0b3J5IG5vciB0aGUgCQkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFRlcmFva2EgTGFib3JhdG9yeSAJCQkJCQkgKgorKiAgIAkJCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitEaWFtZXRlci1TSVAgaW1wbGVtZW50YXRpb24gaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQuIAorCitUT0RPIExpc3QKKyogYWRkIGluIG1hbGxvYyB0aGUgc2l6ZSBvZiBjaGFyCisqIHdoZW4gZ2V0dGluZyByZXN1bHRzIGZyb20gbXlzcWwsIGNoZWNrIGxlbmdodAorKiBzb3J0IGNhcGFiaWxpdGllcyBpbiBMSVIvTElBCisqIG1ha2UgZnVuY3Rpb25zIGZvciBkYXRhYmFzZSBhY2Nlc3MgaW4gTUFSL01BQQorKiBvcmRlciBkaWFtc2lwLmggYmVjYXVzZSBpdCdzIGJlY29taW5nIGEgbWVzcyBeXgorKiByZXBsYWNlIHBhc3N3b3JkIGluIE1BUi9NQUEgYW5kIGxpYmRpYW1zaXAgZnJvbSB0YWJsZSB0byBtYWxsb2MgY2hhciEKKyogZGlzcGxheSBlcnJvcnMgb2YgbXlzcWwKKyogY2hlY2sgdGhhdCBhbGwgdXNlciBkYXRhIGluc2VydGVkIGluIHJlcXVlc3RzIGFyZSBwdXJpZmllZAorKiBhZGQgYWNjb3VudGluZyBzZXJ2ZXIgdXJpIGluIGRhdGFiYXNlIGFuZCBkaWFtc2lwCisqIGFkZCBtdXRleCBvbiBteXNxbCB3cml0aW5nCisqIGNoZWNrIG11bHRpdGhyZWFkaW5nIG9mIG15c3FsIQorKiBnZXQgZGVzdGluYXRpb24gaG9zdCBpbiBkYXRhYmFzZSBmb3IgUlRSIGFuZCBQUFIKKworCisKKworCisKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvYXBwX3NpcC9hcHBfc2lwLmMgYi9leHRlbnNpb25zL2FwcF9zaXAvYXBwX3NpcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmYWJkY2MKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2FwcF9zaXAvYXBwX3NpcC5jCkBAIC0wLDAgKzEsMjUyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogQWxleGFuZHJlIFdlc3RmYWhsIDxhd2VzdGZhaGxAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTAsIEFsZXhhbmRyZSBXZXN0ZmFobCwgVGVyYW9rYSBMYWJvcmF0b3J5IChLZWlvIFVuaXZlcnNpdHkpLCBhbmQgdGhlIFdJREUgUHJvamVjdC4gCSAqCQkKKyoJCQkJCQkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVGVyYW9rYSBMYWJvcmF0b3J5IG5vciB0aGUgCQkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFRlcmFva2EgTGFib3JhdG9yeSAJCQkJCQkgKgorKiAgIAkJCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgImFwcF9zaXAuaCIKKworLy9EaWFtZXRlci1TSVAgc2VydmVyCitzdHJ1Y3QgZGlzcF9oZGwgKiBhcHBfc2lwX01BUl9oZGw9TlVMTDsKK3N0cnVjdCBkaXNwX2hkbCAqIGFwcF9zaXBfTElSX2hkbD1OVUxMOworc3RydWN0IGRpc3BfaGRsICogYXBwX3NpcF9VQVJfaGRsPU5VTEw7CitzdHJ1Y3QgZGlzcF9oZGwgKiBhcHBfc2lwX1NBUl9oZGw9TlVMTDsKK3N0cnVjdCBkaXNwX2hkbCAqIGFwcF9zaXBfUFBBX2hkbD1OVUxMOworc3RydWN0IGRpc3BfaGRsICogYXBwX3NpcF9SVEFfaGRsPU5VTEw7CisKKy8vU3VzY3JpYmVyIExvY2F0b3IKK3N0cnVjdCBkaXNwX2hkbCAqIGFwcF9zaXBfU0xfTElSX2hkbD1OVUxMOworCisKKworc3RydWN0IGRpc3BfaGRsICogYXBwX3NpcF9kZWZhdWx0X2hkbD1OVUxMOworc3RydWN0IHNlc3Npb25faGFuZGxlciAqIGRzX3Nlc3NfaGRsOworCisvL2NvbmZpZ3VyYXRpb24gc3R1Y3R1cmUKK3N0cnVjdCBhc19jb25mICogYXNfY29uZj1OVUxMOworc3RhdGljIHN0cnVjdCBhc19jb25mIGFwcF9zaXBfY29uZjsKKworLy9kaWN0aW9uYXJ5IG9mIFNJUAorc3RydWN0IGFwcF9zaXBfZGljdCBzaXBfZGljdDsKKworaW50IGFwcF9zaXBfZGVmYXVsdF9jYiggc3RydWN0IG1zZyAqKiBtc2csIHN0cnVjdCBhdnAgKiBhdnAsIHN0cnVjdCBzZXNzaW9uICogc2Vzcywgdm9pZCAqIG9wYXF1ZSwgZW51bSBkaXNwX2FjdGlvbiAqIGFjdCkKK3sKKwlUUkFDRV9FTlRSWSgiJXAgJXAgJXAgJXAgJXAiLCBtc2csIGF2cCwgc2Vzcywgb3BhcXVlLCBhY3QpOworCQorCXJldHVybiAwOworfQorCit2b2lkIGR1bXBfY29uZmlnKCkKK3sKKwlUUkFDRV9ERUJVRyhGVUxMLCIqKipDb25maWd1cmF0aW9uIG9mIERpYW1ldGVyLVNJUCBleHRlbnNpb24qKioiKTsKKwlUUkFDRV9ERUJVRyhGVUxMLCIjIG1vZGU6IColZCoiLGFzX2NvbmYtPm1vZGUpOworCVRSQUNFX0RFQlVHKEZVTEwsIiMgZGF0YXNvdXJjZTogKiVkKiIsYXNfY29uZi0+ZGF0YXNvdXJjZSk7CisJVFJBQ0VfREVCVUcoRlVMTCwiIyBteXNxbF9sb2dpbjogKiVzKiIsYXNfY29uZi0+bXlzcWxfbG9naW4pOworCVRSQUNFX0RFQlVHKEZVTEwsIiMgbXlzcWxfcGFzc3dvcmQ6IColcyoiLGFzX2NvbmYtPm15c3FsX3Bhc3N3b3JkKTsKKwlUUkFDRV9ERUJVRyhGVUxMLCIjIG15c3FsX2RhdGFiYXNlOiAqJXMqIixhc19jb25mLT5teXNxbF9kYXRhYmFzZSk7CisJVFJBQ0VfREVCVUcoRlVMTCwiIyBteXNxbF9zZXJ2ZXI6IColcyoiLGFzX2NvbmYtPm15c3FsX3NlcnZlcik7CisJVFJBQ0VfREVCVUcoRlVMTCwiIyBteXNxbF9wb3J0OiAqJWQqIixhc19jb25mLT5teXNxbF9wb3J0KTsKKwlUUkFDRV9ERUJVRyhGVUxMLCIjIG15c3FsX3BvcnQ6IColcyoiLGFzX2NvbmYtPm15c3FsX3ByZWZpeCk7CisJVFJBQ0VfREVCVUcoRlVMTCwiKioqRW5kIG9mIERpYW1ldGVyLVNJUCBjb25maWd1cmF0aW9uIGV4dGVuc2lvbioqKiIpOworfQorCitzdGF0aWMgaW50IGFzX2NvbmZfaW5pdCh2b2lkKQoreworCWFzX2NvbmY9JmFwcF9zaXBfY29uZjsKKwkvL21lbXNldChhcHBfc2lwX2NvbmYsIDAsIHNpemVvZihzdHJ1Y3QgYXNfY29uZikpOworCQorCisJcmV0dXJuIDA7Cit9CisKKy8qIGVudHJ5IHBvaW50ICovCitpbnQgYXNfZW50cnkoY2hhciAqIGNvbmZmaWxlKQoreworCVRSQUNFX0VOVFJZKCIlcCIsIGNvbmZmaWxlKTsKKwkKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhcHA9TlVMTDsKKwlzdHJ1Y3QgZGlzcF93aGVuIGRhdGE7CisJcHRocmVhZF90IHJ0cl90aHJlYWQsIHBwcl90aHJlYWQ7CisJCisJLyogSW5pdGlhbGl6ZSBjb25maWd1cmF0aW9uICovCisJQ0hFQ0tfRkNUKCBhc19jb25mX2luaXQoKSApOworCQorCQorCS8vV2UgcGFyc2UgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZQorCWlmIChjb25mZmlsZSAhPSBOVUxMKSB7CisJCUNIRUNLX0ZDVCggYXNfY29uZl9oYW5kbGUoY29uZmZpbGUpICk7CisJfQorCWVsc2UKKwl7CisJCVRSQUNFX0RFQlVHKElORk8sICJXZSBuZWVkIGEgY29uZmlndXJhdGlvbiBmaWxlIGZvciBEaWFtZXRlci1TSVAgZXh0ZW5zaW9uLiBTZWUgZG9jLyBmb3IgYW4gZXhhbXBsZS4iKTsKKwl9CisJCisJLy9UT0RPOiByZXBsYWNlIGJ5IGNvbmZpZ3VyYXRpb24gZmlsZSEhCisJc3RyY3B5KGFzX2NvbmYtPm15c3FsX3ByZWZpeCwiYXNfIik7CisJCisJLy9XZSBjYW4gZHVtcCB0aGUgY29uZmlndXJhdGlvbiBleHRyYWN0ZWQgZnJvbSBhcHBfc2lwLmNvbmYKKwkvL2R1bXBfY29uZmlnKCk7CisJCisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FQUExJQ0FUSU9OLCBBUFBMSUNBVElPTl9CWV9OQU1FLCAiRGlhbWV0ZXIgU2Vzc2lvbiBJbml0aWF0aW9uIFByb3RvY29sIChTSVApIEFwcGxpY2F0aW9uIiwgJmFwcCwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGlzcF9hcHBfc3VwcG9ydCAoIGFwcCwgTlVMTCwgMSwgMCApICk7CisJCisJCisJCisJLy9XZSBzZXQgdXNlZnVsIEFWUHMgCisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJBdXRoLVNlc3Npb24tU3RhdGUiLCAmc2lwX2RpY3QuQXV0aF9TZXNzaW9uX1N0YXRlLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJBdXRoLUFwcGxpY2F0aW9uLUlkIiwgJnNpcF9kaWN0LkF1dGhfQXBwbGljYXRpb25fSWQsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIkRlc3RpbmF0aW9uLUhvc3QiLCAmc2lwX2RpY3QuRGVzdGluYXRpb25fSG9zdCwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiRGVzdGluYXRpb24tUmVhbG0iLCAmc2lwX2RpY3QuRGVzdGluYXRpb25fUmVhbG0sIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIlNlc3Npb24tSWQiLCAmc2lwX2RpY3QuU2Vzc2lvbl9JZCwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiUmVkaXJlY3QtSG9zdCIsICZzaXBfZGljdC5SZWRpcmVjdF9Ib3N0LCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJSZWRpcmVjdC1Ib3N0LVVzYWdlIiwgJnNpcF9kaWN0LlJlZGlyZWN0X0hvc3RfVXNhZ2UsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIlNJUC1BdXRoLURhdGEtSXRlbSIsICZzaXBfZGljdC5TSVBfQXV0aF9EYXRhX0l0ZW0sIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIlNJUC1BdXRob3JpemF0aW9uIiwgJnNpcF9kaWN0LlNJUF9BdXRob3JpemF0aW9uLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJTSVAtQXV0aGVudGljYXRlIiwgJnNpcF9kaWN0LlNJUF9BdXRoZW50aWNhdGUsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIlNJUC1OdW1iZXItQXV0aC1JdGVtcyIsICZzaXBfZGljdC5TSVBfTnVtYmVyX0F1dGhfSXRlbXMsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIlNJUC1BdXRoZW50aWNhdGlvbi1TY2hlbWUiLCAmc2lwX2RpY3QuU0lQX0F1dGhlbnRpY2F0aW9uX1NjaGVtZSwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiU0lQLUF1dGhlbnRpY2F0aW9uLUluZm8iLCAmc2lwX2RpY3QuU0lQX0F1dGhlbnRpY2F0aW9uX0luZm8sIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIlNJUC1TZXJ2ZXItVVJJIiwgJnNpcF9kaWN0LlNJUF9TZXJ2ZXJfVVJJLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJTSVAtU2VydmVyLUNhcGFiaWxpdGllcyIsICZzaXBfZGljdC5TSVBfU2VydmVyX0NhcGFiaWxpdGllcywgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiU0lQLU1hbmRhdG9yeS1DYXBhYmlsaXR5IiwgJnNpcF9kaWN0LlNJUF9NYW5kYXRvcnlfQ2FwYWJpbGl0eSwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiU0lQLU9wdGlvbmFsLUNhcGFiaWxpdHkiLCAmc2lwX2RpY3QuU0lQX09wdGlvbmFsX0NhcGFiaWxpdHksIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIlNJUC1NZXRob2QiLCAmc2lwX2RpY3QuU0lQX01ldGhvZCwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiU0lQLUFPUiIsICZzaXBfZGljdC5TSVBfQU9SLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJTSVAtRGVyZWdpc3RyYXRpb24tUmVhc29uIiwgJnNpcF9kaWN0LlNJUF9EZXJlZ2lzdHJhdGlvbl9SZWFzb24sIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIlNJUC1SZWFzb24tQ29kZSIsICZzaXBfZGljdC5TSVBfUmVhc29uX0NvZGUsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIlNJUC1SZWFzb24tSW5mbyIsICZzaXBfZGljdC5TSVBfUmVhc29uX0luZm8sIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIlNJUC1BY2NvdW50aW5nLUluZm9ybWF0aW9uIiwgJnNpcF9kaWN0LlNJUF9BY2NvdW50aW5nX0luZm9ybWF0aW9uLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJTSVAtQWNjb3VudGluZy1TZXJ2ZXItVVJJIiwgJnNpcF9kaWN0LlNJUF9BY2NvdW50aW5nX1NlcnZlcl9VUkksIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIlNJUC1DcmVkaXQtQ29udHJvbC1TZXJ2ZXItVVJJIiwgJnNpcF9kaWN0LlNJUF9DcmVkaXRfQ29udHJvbF9TZXJ2ZXJfVVJJLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJTSVAtU2VydmVyLUFzc2lnbm1lbnQtVHlwZSIsICZzaXBfZGljdC5TSVBfU2VydmVyX0Fzc2lnbm1lbnRfVHlwZSwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiU0lQLUl0ZW0tTnVtYmVyIiwgJnNpcF9kaWN0LlNJUF9JdGVtX051bWJlciwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiU0lQLVVzZXItQXV0aG9yaXphdGlvbi1UeXBlIiwgJnNpcF9kaWN0LlNJUF9Vc2VyX0F1dGhvcml6YXRpb25fVHlwZSwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiU0lQLVN1cHBvcnRlZC1Vc2VyLURhdGEtVHlwZSIsICZzaXBfZGljdC5TSVBfU3VwcG9ydGVkX1VzZXJfRGF0YV9UeXBlLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJTSVAtVXNlci1EYXRhIiwgJnNpcF9kaWN0LlNJUF9Vc2VyX0RhdGEsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIlNJUC1Vc2VyLURhdGEtVHlwZSIsICZzaXBfZGljdC5TSVBfVXNlcl9EYXRhX1R5cGUsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIlNJUC1Vc2VyLURhdGEtQ29udGVudHMiLCAmc2lwX2RpY3QuU0lQX1VzZXJfRGF0YV9Db250ZW50cywgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiU0lQLVVzZXItRGF0YS1BbHJlYWR5LUF2YWlsYWJsZSIsICZzaXBfZGljdC5TSVBfVXNlcl9EYXRhX0FscmVhZHlfQXZhaWxhYmxlLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJTSVAtVmlzaXRlZC1OZXR3b3JrLUlkIiwgJnNpcF9kaWN0LlNJUF9WaXNpdGVkX05ldHdvcmtfSWQsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIkRpZ2VzdC1SZWFsbSIsICZzaXBfZGljdC5EaWdlc3RfUmVhbG0sIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIkRpZ2VzdC1VUkkiLCAmc2lwX2RpY3QuRGlnZXN0X1VSSSwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiRGlnZXN0LU5vbmNlIiwgJnNpcF9kaWN0LkRpZ2VzdF9Ob25jZSwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiRGlnZXN0LUNOb25jZSIsICZzaXBfZGljdC5EaWdlc3RfQ05vbmNlLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJEaWdlc3QtTWV0aG9kIiwgJnNpcF9kaWN0LkRpZ2VzdF9NZXRob2QsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIkRpZ2VzdC1Ob25jZS1Db3VudCIsICZzaXBfZGljdC5EaWdlc3RfTm9uY2VfQ291bnQsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIkRpZ2VzdC1SZWFsbSIsICZzaXBfZGljdC5EaWdlc3RfUmVhbG0sIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIkRpZ2VzdC1SZXNwb25zZSIsICZzaXBfZGljdC5EaWdlc3RfUmVzcG9uc2UsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIkRpZ2VzdC1SZXNwb25zZS1BdXRoIiwgJnNpcF9kaWN0LkRpZ2VzdF9SZXNwb25zZV9BdXRoLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJEaWdlc3QtVXNlcm5hbWUiLCAmc2lwX2RpY3QuRGlnZXN0X1VzZXJuYW1lLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJEaWdlc3QtQWxnb3JpdGhtIiwgJnNpcF9kaWN0LkRpZ2VzdF9BbGdvcml0aG0sIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIkRpZ2VzdC1Rb1AiLCAmc2lwX2RpY3QuRGlnZXN0X1FPUCwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiVXNlci1OYW1lIiwgJnNpcF9kaWN0LlVzZXJfTmFtZSwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiRGlnZXN0LUhBMSIsICZzaXBfZGljdC5EaWdlc3RfSEExLCBFTk9FTlQpICk7CisJCisJCisJLy9SZWdpc3RlciBBcHBsaWNhdGlvbgorCW1lbXNldCgmZGF0YSwgMCwgc2l6ZW9mKGRhdGEpKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVBQTElDQVRJT04sIEFQUExJQ0FUSU9OX0JZX05BTUUsICJEaWFtZXRlciBTZXNzaW9uIEluaXRpYXRpb24gUHJvdG9jb2wgKFNJUCkgQXBwbGljYXRpb24iLCAmZGF0YS5hcHAsIEVOT0VOVCkgKTsKKwkKKwlpZihhc19jb25mLT5tb2RlPT0xKQorCXsKKwkgIC8vICoqQ29tbWFuZCBDb2RlcworCSAgLy9NQVIKKwkgIENIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIk11bHRpbWVkaWEtQXV0aC1SZXF1ZXN0IiwgJmRhdGEuY29tbWFuZCwgRU5PRU5UKSApOworCSAgQ0hFQ0tfRkNUKCBmZF9kaXNwX3JlZ2lzdGVyKCBhcHBfc2lwX01BUl9jYiwgRElTUF9IT1dfQ0MsICZkYXRhLCBOVUxMLCAmYXBwX3NpcF9NQVJfaGRsICkgKTsKKwkgIC8vUlRBCisJICBDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJSZWdpc3RyYXRpb24tVGVybWluYXRpb24tQW5zd2VyIiwgJmRhdGEuY29tbWFuZCwgRU5PRU5UKSApOworCSAgQ0hFQ0tfRkNUKCBmZF9kaXNwX3JlZ2lzdGVyKCBhcHBfc2lwX1JUQV9jYiwgRElTUF9IT1dfQ0MsICZkYXRhLCBOVUxMLCAmYXBwX3NpcF9SVEFfaGRsICkgKTsKKwkgIC8vUFBBCisJICBDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJQdXNoLVByb2ZpbGUtQW5zd2VyIiwgJmRhdGEuY29tbWFuZCwgRU5PRU5UKSApOworCSAgQ0hFQ0tfRkNUKCBmZF9kaXNwX3JlZ2lzdGVyKCBhcHBfc2lwX1BQQV9jYiwgRElTUF9IT1dfQ0MsICZkYXRhLCBOVUxMLCAmYXBwX3NpcF9QUEFfaGRsICkgKTsKKwkgIC8vTElSCisJICBDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJMb2NhdGlvbi1JbmZvLVJlcXVlc3QiLCAmZGF0YS5jb21tYW5kLCBFTk9FTlQpICk7CisJICBDSEVDS19GQ1QoIGZkX2Rpc3BfcmVnaXN0ZXIoIGFwcF9zaXBfTElSX2NiLCBESVNQX0hPV19DQywgJmRhdGEsIE5VTEwsICZhcHBfc2lwX0xJUl9oZGwgKSApOworCSAgLy9VQVIKKwkgIENIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIlVzZXItQXV0aG9yaXphdGlvbi1SZXF1ZXN0IiwgJmRhdGEuY29tbWFuZCwgRU5PRU5UKSApOworCSAgQ0hFQ0tfRkNUKCBmZF9kaXNwX3JlZ2lzdGVyKCBhcHBfc2lwX1VBUl9jYiwgRElTUF9IT1dfQ0MsICZkYXRhLCBOVUxMLCAmYXBwX3NpcF9VQVJfaGRsICkgKTsKKwkgIC8vU0FSCisJICBDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJTZXJ2ZXItQXNzaWdubWVudC1SZXF1ZXN0IiwgJmRhdGEuY29tbWFuZCwgRU5PRU5UKSApOworCSAgQ0hFQ0tfRkNUKCBmZF9kaXNwX3JlZ2lzdGVyKCBhcHBfc2lwX1NBUl9jYiwgRElTUF9IT1dfQ0MsICZkYXRhLCBOVUxMLCAmYXBwX3NpcF9TQVJfaGRsICkgKTsKKwl9CisJaWYoYXNfY29uZi0+bW9kZT09MikKKwl7CisJICAvL0xJUgorCSAgQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0NPTU1BTkQsIENNRF9CWV9OQU1FLCAiTG9jYXRpb24tSW5mby1SZXF1ZXN0IiwgJmRhdGEuY29tbWFuZCwgRU5PRU5UKSApOworCSAgQ0hFQ0tfRkNUKCBmZF9kaXNwX3JlZ2lzdGVyKCBhcHBfc2lwX1NMX0xJUl9jYiwgRElTUF9IT1dfQ0MsICZkYXRhLCBOVUxMLCAmYXBwX3NpcF9TTF9MSVJfaGRsICkgKTsKKwl9CisJLy9DYWxsYmFjayBmb3IgdW5leHBlY3RlZCBtZXNzYWdlcworCUNIRUNLX0ZDVCggZmRfZGlzcF9yZWdpc3RlciggYXBwX3NpcF9kZWZhdWx0X2NiLCBESVNQX0hPV19BUFBJRCwgJmRhdGEsIE5VTEwsICZhcHBfc2lwX2RlZmF1bHRfaGRsICkgKTsKKwkKKwkKKwkvL1dlIHN0YXJ0IGRhdGFiYXNlIGNvbm5lY3Rpb24KKwlpZihzdGFydF9teXNxbF9jb25uZWN0aW9uKCkpCisJCXJldHVybiBFSU5WQUw7CisJCisJQ0hFQ0tfRkNUKGZkX3Nlc3NfaGFuZGxlcl9jcmVhdGUoJmRzX3Nlc3NfaGRsLCAodm9pZCAqKWZyZWUsIE5VTEwsIE5VTEwpKTsKKwkKKwkvL0NyZWF0aW9uIG9mIHRocmVhZCBmb3IgUmVnaXN0cmF0aW9uIFRlcm1pbmF0aW9uCQorCWlmKHB0aHJlYWRfY3JlYXRlKCZydHJfdGhyZWFkLCBOVUxMLHJ0cl9zb2NrZXQsIE5VTEwpKQorCXsKKwkJVFJBQ0VfREVCVUcoSU5GTywiQ3JlYXRpb24gb2YgdGhyZWFkIGZhaWxlZCwgYWJvcnQhIik7CisJCXJldHVybiBFSU5WQUw7CisJfQorCS8vQ3JlYXRpb24gb2YgdGhyZWFkIGZvciBQdXNoIFByb2ZpbGUJCisJaWYocHRocmVhZF9jcmVhdGUoJnBwcl90aHJlYWQsIE5VTEwscHByX3NvY2tldCwgTlVMTCkpCisJeworCQlUUkFDRV9ERUJVRyhJTkZPLCJDcmVhdGlvbiBvZiB0aHJlYWQgZmFpbGVkLCBhYm9ydCEiKTsKKwkJcmV0dXJuIEVJTlZBTDsKKwl9CisJCisJCisJcmV0dXJuIDA7Cit9CisKKy8vQ2xlYW51cCBjYWxsYmFjawordm9pZCBmZF9leHRfZmluaSh2b2lkKQoreworCS8vVE9ETzp1bnJlZ2lzdGVyIG90aGVyIGNhbGxiYWNrcworCQorCSh2b2lkKSBmZF9kaXNwX3VucmVnaXN0ZXIoJmFwcF9zaXBfTUFSX2hkbCwgTlVMTCk7CisJQ0hFQ0tfRkNUX0RPKCBmZF9zZXNzX2hhbmRsZXJfZGVzdHJveSgmZHNfc2Vzc19oZGwsIE5VTEwpLHJldHVybik7CisJCisJCisJLy9XZSBjbG9zZSBkYXRhYmFzZSBjb25uZWN0aW9uCisJY2xvc2VfbXlzcWxfY29ubmVjdGlvbigpOworCQorCisJCisJVFJBQ0VfRU5UUlkoKTsKKwlyZXR1cm4gOworfQorCitFWFRFTlNJT05fRU5UUlkoImFwcF9zaXAiLCBhc19lbnRyeSwgImRpY3Rfc2lwIik7CmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2FwcF9zaXAvYXBwX3NpcC5oIGIvZXh0ZW5zaW9ucy9hcHBfc2lwL2FwcF9zaXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjUzMmI3Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9hcHBfc2lwL2FwcF9zaXAuaApAQCAtMCwwICsxLDI2NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IEFsZXhhbmRyZSBXZXN0ZmFobCA8YXdlc3RmYWhsQGZyZWVzaXBzZXJ2ZXIubmV0PgkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxMCwgQWxleGFuZHJlIFdlc3RmYWhsLCBUZXJhb2thIExhYm9yYXRvcnkgKEtlaW8gVW5pdmVyc2l0eSksIGFuZCB0aGUgV0lERSBQcm9qZWN0LiAJICoJCQorKgkJCQkJCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBUZXJhb2thIExhYm9yYXRvcnkgbm9yIHRoZSAJCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgVGVyYW9rYSBMYWJvcmF0b3J5IAkJCQkJCSAqCisqICAgCQkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8ZnJlZURpYW1ldGVyL2V4dGVuc2lvbi5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KK0dDQ19ESUFHX09GRigiLVdkZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIpCisjaW5jbHVkZSA8Z2NyeXB0Lmg+CitHQ0NfRElBR19PTigiLVdkZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIpCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bXlzcWwuaD4KKyNpbmNsdWRlICJtZDUuaCIKKworCisjZGVmaW5lIE5PTkNFX1NJWkUgMTYKKyNkZWZpbmUgRElHRVNUX0xFTiAxNgorCisKKy8qIE1vZGUgZm9yIHRoZSBleHRlbnNpb24gKi8KKyNkZWZpbmUgTU9ERV9EU1NFUlZFUgkweDEKKyNkZWZpbmUJTU9ERV9TTAkweDIKKworLy9SZWRpcmVjdF9Ib3N0X1VzYWdlCisjZGVmaW5lIEFMTF9VU0VSCTYKKworLyogVGhlIG1vZHVsZSBjb25maWd1cmF0aW9uICovCitzdHJ1Y3QgYXNfY29uZiB7CisJaW50CQltb2RlOwkJLyogZGVmYXVsdCBNT0RFX0RTU0VSVkVSIHwgTU9ERV9TTCAqLworCWVudW0ge0FTTVlTUUx9IGRhdGFzb3VyY2U7IAorCWNoYXIgKiBteXNxbF9sb2dpbjsKKwljaGFyICogbXlzcWxfcGFzc3dvcmQ7CisJY2hhciAqIG15c3FsX2RhdGFiYXNlOworCWNoYXIgKiBteXNxbF9zZXJ2ZXI7CisJY2hhciBteXNxbF9wcmVmaXhbMTBdOyAvL2RlZmF1bHQ6IGFzXworCXVpbnQxNl90ICBteXNxbF9wb3J0OyAvL2lmIDAsIGRlZmF1bHQgcG9ydCB3aWxsIGJlIHVzZWQKKwl1aW50MTZfdCBydHJfcG9ydDsKKwl1aW50MTZfdCBwcHJfcG9ydDsKK307CitleHRlcm4gc3RydWN0IGFzX2NvbmYgKiBhc19jb25mOworCisvKiBQYXJzZSB0aGUgY29uZmlndXJhdGlvbiBmaWxlICovCitpbnQgYXNfY29uZl9oYW5kbGUoY2hhciAqIGNvbmZmaWxlKTsKKworCitleHRlcm4gTVlTUUwgKmNvbm47CisKKworCit2b2lkIGNhbGNfbWQ1KGNoYXIgKmJ1ZmZlciwgY2hhciAqIGRhdGEpOwordm9pZCBjbGVhcl9kaWdlc3QodWludDhfdCAqIGRpZ2VzdCwgY2hhciAqIHJlYWRhYmxlX2RpZ2VzdCwgaW50IGRpZ2VzdGxlbmd0aCk7CitzdHJ1Y3QgYXZwX2hkciAqIHdhbGtfZGlnZXN0KHN0cnVjdCBhdnAgKmF2cCwgaW50IGF2cF9jb2RlKTsKKworCisvL015U1FMIHBhcnQKK2ludCBzdGFydF9teXNxbF9jb25uZWN0aW9uKCk7Cit2b2lkIHJlcXVlc3RfbXlzcWwoY2hhciAqcXVlcnkpOwordm9pZCBjbG9zZV9teXNxbF9jb25uZWN0aW9uKCk7CitpbnQgZ2V0X3NpcHNlcnZlcl91cmkoY29uc3QgdW5zaWduZWQgY2hhciAqc2lwX2FvciwgY29uc3Qgc2l6ZV90IHNpcGFvcmxlbiwgdW5zaWduZWQgY2hhciAqKiBzaXBzZXJ2ZXJfdXJpLCBzaXplX3QgKnNpcHNlcnZlcnVyaWxlbik7CitpbnQgZXhpc3RfdXNlcm5hbWUoY29uc3QgdW5zaWduZWQgY2hhciAqc2lwX2FvciwgY29uc3Qgc2l6ZV90IHNpcGFvcmxlbik7CitpbnQgZ2V0X3NpcHNlcnZlcl9jYXAoY29uc3QgdW5zaWduZWQgY2hhciAqc2lwX2FvciwgY29uc3Qgc2l6ZV90IHNpcGFvcmxlbiwgc3RydWN0IGF2cCAqKmNhcGFiaWxpdGllcyk7CitpbnQgZ2V0X3Bhc3N3b3JkKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnVzZXJuYW1lLCBjb25zdCBzaXplX3QgdXNlcm5hbWVsZW4sIGNoYXIgKnBhc3N3b3JkKTsKK2ludCBjaGVja19zaXBhb3IoY29uc3QgdW5zaWduZWQgY2hhciAgKnVzZXJuYW1lLCBjb25zdCBzaXplX3QgdXNlcm5hbWVsZW4sIGNvbnN0IGNoYXIgKiBzaXBfYW9yLGNvbnN0IHNpemVfdCBzaXBhb3JsZW4pOworaW50IGFkZF91c2VyX2RhdGF0eXBlKGNvbnN0IHVuc2lnbmVkIGNoYXIgICpzaXBfYW9yLCBjb25zdCBzaXplX3Qgc2lwYW9ybGVuLHN0cnVjdCBtc2cgKm1lc3NhZ2UpOworaW50IHNldF9wZW5kaW5nX2ZsYWcoY29uc3QgdW5zaWduZWQgY2hhciAgKnVzZXJuYW1lLCBjb25zdCBzaXplX3QgdXNlcm5hbWVsZW4pOworaW50IGNsZWFyX3BlbmRpbmdfZmxhZyhjb25zdCB1bnNpZ25lZCBjaGFyICAqdXNlcm5hbWUsIGNvbnN0IHNpemVfdCB1c2VybmFtZWxlbik7CitpbnQgc2V0X3JlYWxfc2lwc2VydmVyX3VyaShjb25zdCB1bnNpZ25lZCBjaGFyICAqdXNlcm5hbWUsIGNvbnN0IHNpemVfdCB1c2VybmFtZWxlbiwgY29uc3QgdW5zaWduZWQgY2hhciAqc2lwc2VydmVyX3VyaSxjb25zdCBzaXplX3Qgc2lwc2VydmVydXJpbGVuKTsKK2ludCBzZXRfc2lwc2VydmVyX3VyaShjb25zdCB1bnNpZ25lZCBjaGFyICAqdXNlcm5hbWUsIGNvbnN0IHNpemVfdCB1c2VybmFtZWxlbiwgY29uc3QgdW5zaWduZWQgY2hhciAqc2lwc2VydmVyX3VyaSxjb25zdCBzaXplX3Qgc2lwc2VydmVydXJpbGVuKTsKKy8vaW50IGdldF9zaXBzZXJ2ZXJfdXJpKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNpcF9hb3IsIGNvbnN0IHNpemVfdCBzaXBhb3JsZW4sIHVuc2lnbmVkIGNoYXIgKiogc2lwc2VydmVyX3VyaSwgc2l6ZV90ICpzaXBzZXJ2ZXJ1cmlsZW4pOworaW50IGFsbG93X3JvYW1pbmcoY29uc3QgdW5zaWduZWQgY2hhciAgKnVzZXJuYW1lLCBjb25zdCBzaXplX3QgdXNlcm5hbWVsZW4sIGNvbnN0IGNoYXIgKiBuZXR3b3JrLGNvbnN0IHNpemVfdCBuZXR3b3JrbGVuKTsKK2ludCBnZXRfZGlhbWV0ZXJfdXJpKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNpcF9hb3IsIGNvbnN0IHNpemVfdCBzaXBhb3JsZW4sIGNoYXIgKiogZGlhbWV0ZXJfdXJpLCBzaXplX3QgKmRpYW1ldGVydXJpbGVuKTsKKy8vY291bnQgZnVuY3Rpb25zCitpbnQgY291bnRfYXZwKHN0cnVjdCBtc2cgKiBtZXNzYWdlLCBpbnQgY29kZSwgaW50IHZlbmRvcik7CisKKwordm9pZCBEaWdlc3RDYWxjSEExKGNoYXIgKiBwc3pBbGcsY2hhciAqIHBzelVzZXJOYW1lLGNoYXIgKiBwc3pSZWFsbSxjaGFyICogcHN6UGFzc3dvcmQsY2hhciAqIHBzek5vbmNlLGNoYXIgKiBwc3pDTm9uY2UsSEFTSEhFWCBTZXNzaW9uS2V5KTsKK3ZvaWQgRGlnZXN0Q2FsY1Jlc3BvbnNlKEhBU0hIRVggSEExLGNoYXIgKiBwc3pOb25jZSxjaGFyICogcHN6Tm9uY2VDb3VudCxjaGFyICogcHN6Q05vbmNlLGNoYXIgKiBwc3pRb3AsY2hhciAqIHBzek1ldGhvZCxjaGFyICogcHN6RGlnZXN0VXJpLEhBU0hIRVggSEVudGl0eSxIQVNISEVYIFJlc3BvbnNlKTsKK3ZvaWQgRGlnZXN0Q2FsY1Jlc3BvbnNlQXV0aChIQVNISEVYIEhBMSxjaGFyICogcHN6Tm9uY2UsY2hhciAqIHBzek5vbmNlQ291bnQsY2hhciAqIHBzekNOb25jZSxjaGFyICogcHN6UW9wLGNoYXIgKiBwc3pNZXRob2QsY2hhciAqIHBzekRpZ2VzdFVyaSxIQVNISEVYIEhFbnRpdHksSEFTSEhFWCBSZXNwb25zZSk7CisKK2ludCBmZF9hdnBfc2VhcmNoX2F2cCAoIHN0cnVjdCBhdnAgKiBncm91cGVkYXZwLCBzdHJ1Y3QgZGljdF9vYmplY3QgKiB3aGF0LCBzdHJ1Y3QgYXZwICoqIGF2cCApOworCisvL3RocmVhZCBwcm9jZWR1cmUKK3ZvaWQgKnJ0cl9zb2NrZXQodm9pZCAqKTsKK3ZvaWQgKnBwcl9zb2NrZXQodm9pZCAqKTsKKworc3RydWN0IHJ0cnNpcGFvcgoreworCWNoYXIgdXNlcm5hbWVbMjAwXTsKKwljaGFyIHNpcF9hb3IxWzIwMF07CisJY2hhciBzaXBfYW9yMlsyMDBdOworCWNoYXIgc2lwX2FvcjNbMjAwXTsKKwljaGFyIHN0cnJlYXNvblsyMDBdOworCWNoYXIgZGVzdGhvc3RbMjAwXTsKKwlpbnQgcmVhc29uOworfTsKK3N0cnVjdCBwcHJzaXBhb3IKK3sKKwljaGFyIHVzZXJuYW1lWzIwMF07CisJY2hhciBkYXRhdHlwZTFbMjU1XTsKKwljaGFyIGRhdGF0eXBlMlsyNTVdOworCWNoYXIgZGF0YXR5cGUzWzI1NV07CisJaW50IGFjY291bnRpbmc7Cit9OworCitpbnQgYXBwX3NpcF9SVFJfY2Ioc3RydWN0IHJ0cnNpcGFvciAqc3RydWN0dXJlKTsKK2ludCBhcHBfc2lwX1BQUl9jYihzdHJ1Y3QgcHByc2lwYW9yICpzdHJ1Y3R1cmUpOworCisKK2ludCBkc19lbnRyeSgpOwordm9pZCBmZF9leHRfZmluaSh2b2lkKTsKK2ludCBhcHBfc2lwX2RlZmF1bHRfY2IoIHN0cnVjdCBtc2cgKiogbXNnLCBzdHJ1Y3QgYXZwICogYXZwLCBzdHJ1Y3Qgc2Vzc2lvbiAqIHNlc3MsIHZvaWQgKiBvcGFxdWUsIGVudW0gZGlzcF9hY3Rpb24gKiBhY3QpOworaW50IGFwcF9zaXBfTUFSX2NiKCBzdHJ1Y3QgbXNnICoqIG1zZywgc3RydWN0IGF2cCAqIGF2cCwgc3RydWN0IHNlc3Npb24gKiBzZXNzLCB2b2lkICogb3BhcXVlLCBlbnVtIGRpc3BfYWN0aW9uICogYWN0KTsKK2ludCBhcHBfc2lwX1JUQV9jYiggc3RydWN0IG1zZyAqKiBtc2csIHN0cnVjdCBhdnAgKiBhdnAsIHN0cnVjdCBzZXNzaW9uICogc2Vzcywgdm9pZCAqIG9wYXF1ZSwgZW51bSBkaXNwX2FjdGlvbiAqIGFjdCk7CitpbnQgYXBwX3NpcF9QUEFfY2IoIHN0cnVjdCBtc2cgKiogbXNnLCBzdHJ1Y3QgYXZwICogYXZwLCBzdHJ1Y3Qgc2Vzc2lvbiAqIHNlc3MsIHZvaWQgKiBvcGFxdWUsIGVudW0gZGlzcF9hY3Rpb24gKiBhY3QpOworaW50IGFwcF9zaXBfTElSX2NiKCBzdHJ1Y3QgbXNnICoqIG1zZywgc3RydWN0IGF2cCAqIGF2cCwgc3RydWN0IHNlc3Npb24gKiBzZXNzLCB2b2lkICogb3BhcXVlLCBlbnVtIGRpc3BfYWN0aW9uICogYWN0KTsKK2ludCBhcHBfc2lwX1VBUl9jYiggc3RydWN0IG1zZyAqKiBtc2csIHN0cnVjdCBhdnAgKiBhdnAsIHN0cnVjdCBzZXNzaW9uICogc2Vzcywgdm9pZCAqIG9wYXF1ZSwgZW51bSBkaXNwX2FjdGlvbiAqIGFjdCk7CitpbnQgYXBwX3NpcF9TQVJfY2IoIHN0cnVjdCBtc2cgKiogbXNnLCBzdHJ1Y3QgYXZwICogYXZwLCBzdHJ1Y3Qgc2Vzc2lvbiAqIHNlc3MsIHZvaWQgKiBvcGFxdWUsIGVudW0gZGlzcF9hY3Rpb24gKiBhY3QpOworCisvL1N1c2NyaWJlciBMb2NhdG9yCitpbnQgYXBwX3NpcF9TTF9MSVJfY2IoIHN0cnVjdCBtc2cgKiogbXNnLCBzdHJ1Y3QgYXZwICogcGFyYW1hdnAsIHN0cnVjdCBzZXNzaW9uICogc2Vzcywgdm9pZCAqIG9wYXF1ZSwgZW51bSBkaXNwX2FjdGlvbiAqIGFjdCk7CisvL2ludCBhcHBfc2lwX1NMX1NBUl9jYiggc3RydWN0IG1zZyAqKiBtc2csIHN0cnVjdCBhdnAgKiBwYXJhbWF2cCwgc3RydWN0IHNlc3Npb24gKiBzZXNzLCB2b2lkICogb3BhcXVlLCBlbnVtIGRpc3BfYWN0aW9uICogYWN0KTsKKworI2RlZmluZSBTUUxfR0VUUEFTU1dPUkQgIlNFTEVDVCBgcGFzc3dvcmRgIEZST00gZHNfdXNlcnMgV0hFUkUgYHVzZXJuYW1lYCA9JyVzJyIKKyNkZWZpbmUgU1FMX0dFVFBBU1NXT1JEX0xFTiBzaXplb2YoU1FMX0dFVFBBU1NXT1JEKS0yCisKKy8vdXNlcm5hbWUgYnkgU0lQLUFPUgorI2RlZmluZSBTUUxfR0VUVVNFUk5BTUUgICJTRUxFQ1QgYHVzZXJuYW1lYCBGUk9NIGRzX3VzZXJzLCBkc19zaXBfYW9yIFdIRVJFIGBzaXBfYW9yYCA9JyVzJyBBTkQgYGRzX3NpcF9hb3JgLmBpZF91c2VyYCA9IGBkc191c2Vyc2AuYGlkX3VzZXJgIgorI2RlZmluZSBTUUxfR0VUVVNFUk5BTUVfTEVOIHNpemVvZihTUUxfR0VUVVNFUk5BTUUpLTIKKworLy9zaXAgc2VydmVyIHVyaSBieSB1c2VybmFtZQorI2RlZmluZSBTUUxfR0VUU0lQVVJJICAiU0VMRUNUIGBzaXBfc2VydmVyX3VyaWAgRlJPTSBkc191c2VycyBXSEVSRSBgdXNlcm5hbWVgID0nJXMnIgorI2RlZmluZSBTUUxfR0VUU0lQVVJJX0xFTiBzaXplb2YoU1FMX0dFVFNJUFVSSSktMgorCisvL3NpcCBzZXJ2ZXIgdXJpIGJ5IFNJUC1BT1IKKyNkZWZpbmUgU1FMX0dFVFNJUFNFUlVSSSAgIlNFTEVDVCBgZHNfc2lwX2FvcmAuYHNpcF9zZXJ2ZXJfdXJpYCBGUk9NIGRzX3VzZXJzLCBkc19zaXBfYW9yIFdIRVJFIGBzaXBfYW9yYCA9JyVzJyBBTkQgYGRzX3NpcF9hb3JgLmBpZF91c2VyYCA9IGBkc191c2Vyc2AuYGlkX3VzZXJgIgorI2RlZmluZSBTUUxfR0VUU0lQU0VSVVJJX0xFTiBzaXplb2YoU1FMX0dFVFNJUFNFUlVSSSktMgorCisvL3NpcCBjYXBhYmlsaXRpZXMgZm9yIGEgU0lQLUFPUgorI2RlZmluZSBTUUxfR0VUU0lQU0VSQ0FQICAiU0VMRUNUIGBjb21wdWxzb3J5YCxgaWRfc2VydmljZWAgRlJPTSBkc191c2VyX3NlcnZpY2VzLCBkc19zaXBfYW9yIFdIRVJFIGBzaXBfYW9yYCA9JyVzJyBBTkQgYGRzX3NpcF9hb3JgLmBpZF91c2VyYCA9IGBkc191c2VyX3NlcnZpY2VzYC5gaWRfdXNlcmAiCisjZGVmaW5lIFNRTF9HRVRTSVBTRVJDQVBfTEVOIHNpemVvZihTUUxfR0VUU0lQU0VSQ0FQKS0yCisKKy8vdXNlciBkYXRhIGZvciBhIHVzZXIgZGF0YSBzdXBwb3J0ZWQKKyNkZWZpbmUgU1FMX0dFVFNJUERBVEEgICJTRUxFQ1QgYGxhYmVsX3R5cGVgLGBkYXRhYCBGUk9NIGRzX3NpcF9hb3IsIGRzX3VzZXJfZGF0YSwgZHNfZGF0YV90eXBlcyBXSEVSRSBgc2lwX2FvcmAgPSclcycgQU5EIGBkc19zaXBfYW9yYC5gaWRfc2lwX2FvcmAgPSBgZHNfdXNlcl9kYXRhYC5gaWRfc2lwX2FvcmAgQU5EIGBkc19kYXRhX3R5cGVzYC5gaWRfZGF0YV90eXBlYD1gZHNfdXNlcl9kYXRhYC5gaWRfZGF0YV90eXBlYCIKKyNkZWZpbmUgU1FMX0dFVFNJUERBVEFfTEVOIHNpemVvZihTUUxfR0VUU0lQREFUQSktMgorCisjZGVmaW5lIFNRTF9HRVRESUFNVVJJICJTRUxFQ1QgYHNpcHNlcnZlcl91cmlgIEZST00gZHNfc2lwX2Fvcl9tYXAgV0hFUkUgYHNpcF9hb3JgID0nJXMnIgorI2RlZmluZSBTUUxfR0VURElBTVVSSV9MRU4gc2l6ZW9mKFNRTF9HRVRESUFNVVJJKS0yCisKKy8vbmV0d29ya3MgZm9yIHRoaXMgdXNlcgorI2RlZmluZSBTUUxfR0VUVVNFUk5FVCAiU0VMRUNUIGBsYWJlbF9uZXR3b3JrYCBGUk9NIGRzX3VzZXJzLCBkc191c2VyX25ldHdvcmtzLCBkc19uZXR3b3JrcyBXSEVSRSBgZHNfdXNlcnNgLmB1c2VybmFtZWAgPSclcycgQU5EIGBkc191c2VyX25ldHdvcmtzYC5gaWRfdXNlcmAgPSBgZHNfdXNlcnNgLmBpZF91c2VyYCBBTkQgYGRzX3VzZXJfbmV0d29ya3NgLmBpZF9uZXR3b3JrYCA9IGBkc19uZXR3b3Jrc2AuYGlkX25ldHdvcmtgIgorI2RlZmluZSBTUUxfR0VUVVNFUk5FVF9MRU4gc2l6ZW9mKFNRTF9HRVRVU0VSTkVUKS0yCisKKyNkZWZpbmUgU1FMX1NFVFNJUFVSSSAiVVBEQVRFIGRzX3VzZXJzIFNFVCBgdGVtcF9zaXBfc2VydmVyX3VyaWA9JyVzJyBXSEVSRSBgdXNlcm5hbWVgID0nJXMnIgorI2RlZmluZSBTUUxfU0VUU0lQVVJJX0xFTiBzaXplb2YoU1FMX1NFVFNJUFVSSSktNAorCisvL1RPRE8gVE9ETyBUT0RPIFRPRE8gVE9ETyBUT0RPIFRPRE8gVE9ETyBUT0RPIFRPRE8gVE9ETyBUT0RPIFRPRE8gVE9ETyBUT0RPIFRPRE8gCisjZGVmaW5lIFNRTF9STVNJUFVSSSAiVVBEQVRFIGRzX3VzZXJzIFNFVCBgdGVtcF9zaXBfc2VydmVyX3VyaWA9JycsIGBzaXBfc2VydmVyX3VyaWA9JycgV0hFUkUgYGlkX3VzZXJgID0nJXMnIgorI2RlZmluZSBTUUxfUk1TSVBVUklfTEVOIHNpemVvZihTUUxfUk1TSVBVUkkpLTIKKy8vVE9ETyBUT0RPIFRPRE8gVE9ETyBUT0RPIFRPRE8gVE9ETyBUT0RPIFRPRE8gVE9ETyBUT0RPIFRPRE8gVE9ETyBUT0RPIFRPRE8gVE9ETyAKKworI2RlZmluZSBTUUxfU0VUUkVBTFNJUFVSSSAiVVBEQVRFIGRzX3VzZXJzIFNFVCBgc2lwX3NlcnZlcl91cmlgPSclcycgV0hFUkUgYHVzZXJuYW1lYCA9JyVzJyIKKyNkZWZpbmUgU1FMX1NFVFJFQUxTSVBVUklfTEVOIHNpemVvZihTUUxfU0VUUkVBTFNJUFVSSSktNAorCisjZGVmaW5lIFNRTF9TRVRGTEFHICJVUERBVEUgZHNfdXNlcnMgU0VUIGBhdXRoZW50aWNhdGlvbl9wZW5kaW5nYD0xIFdIRVJFIGB1c2VybmFtZWAgPSclcyciCisjZGVmaW5lIFNRTF9TRVRGTEFHX0xFTiBzaXplb2YoU1FMX1NFVEZMQUcpLTIKKworI2RlZmluZSBTUUxfQ0xFQVJGTEFHICJVUERBVEUgZHNfdXNlcnMgU0VUIGBhdXRoZW50aWNhdGlvbl9wZW5kaW5nYD0wLCBgcmVnaXN0cmF0ZWRgPTEgV0hFUkUgYHVzZXJuYW1lYCA9JyVzJyIKKyNkZWZpbmUgU1FMX0NMRUFSRkxBR19MRU4gc2l6ZW9mKFNRTF9DTEVBUkZMQUcpLTIKKworI2RlZmluZSBTUUxfR0VUU0lQQU9SICJTRUxFQ1QgYHNpcF9hb3JgIEZST00gYGRzX3NpcF9hb3JgLCBgZHNfdXNlcnNgIFdIRVJFIGBkc19zaXBfYW9yYC5gaWRfdXNlcmAgPSBgZHNfdXNlcnNgLmBpZF91c2VyYCBBTkQgYGRzX3VzZXJzYC5gdXNlcm5hbWVgID0gJyVzJyIKKyNkZWZpbmUgU1FMX0dFVFNJUEFPUl9MRU4gc2l6ZW9mKFNRTF9HRVRTSVBBT1IpLTIKKworLy8jZGVmaW5lIFNRTF9DTEVBUkZMQUcgIlVQREFURSBkc191c2VycyBTRVQgYGF1dGhlbnRpY2F0aW9uX3BlbmRpbmdgPTAgV0hFUkUgYHVzZXJuYW1lYCA9JyVzJyIKKy8vI2RlZmluZSBTUUxfQ0xFQVJGTEFHX0xFTiA2NworCitleHRlcm4gc3RydWN0IHNlc3Npb25faGFuZGxlciAqIGRzX3Nlc3NfaGRsOworCisvL0FWUCBjb2RlCisjZGVmaW5lIENPREVfU0lQX1VTRVJfREFUQV9UWVBFCTM4OAorI2RlZmluZSBDT0RFX1NJUF9BT1IJMTIyCisKKy8vU3RvcmFnZSBmb3Igc29tZSB1c2VmdWwgQVZQcworc3RydWN0IGFwcF9zaXBfZGljdHsKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBBdXRoX1Nlc3Npb25fU3RhdGU7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogQXV0aF9BcHBsaWNhdGlvbl9JZDsKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBEZXN0aW5hdGlvbl9Ib3N0OworCXN0cnVjdCBkaWN0X29iamVjdCAqIERlc3RpbmF0aW9uX1JlYWxtOworCXN0cnVjdCBkaWN0X29iamVjdCAqIFVzZXJfTmFtZTsKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBTZXNzaW9uX0lkOworCXN0cnVjdCBkaWN0X29iamVjdCAqIFJlZGlyZWN0X0hvc3Q7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogUmVkaXJlY3RfSG9zdF9Vc2FnZTsKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBTSVBfQXV0aF9EYXRhX0l0ZW07CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogU0lQX0FjY291bnRpbmdfSW5mb3JtYXRpb247CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogU0lQX0FjY291bnRpbmdfU2VydmVyX1VSSTsKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBTSVBfQ3JlZGl0X0NvbnRyb2xfU2VydmVyX1VSSTsKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBTSVBfU2VydmVyX0Fzc2lnbm1lbnRfVHlwZTsKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBTSVBfSXRlbV9OdW1iZXI7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogU0lQX1VzZXJfQXV0aG9yaXphdGlvbl9UeXBlOworCXN0cnVjdCBkaWN0X29iamVjdCAqIFNJUF9TdXBwb3J0ZWRfVXNlcl9EYXRhX1R5cGU7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogU0lQX1VzZXJfRGF0YTsKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBTSVBfVXNlcl9EYXRhX1R5cGU7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogU0lQX1VzZXJfRGF0YV9Db250ZW50czsKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBTSVBfVXNlcl9EYXRhX0FscmVhZHlfQXZhaWxhYmxlOworCXN0cnVjdCBkaWN0X29iamVjdCAqIFNJUF9WaXNpdGVkX05ldHdvcmtfSWQ7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogU0lQX0F1dGhvcml6YXRpb247CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogU0lQX0F1dGhlbnRpY2F0ZTsKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBTSVBfTnVtYmVyX0F1dGhfSXRlbXM7CQorCXN0cnVjdCBkaWN0X29iamVjdCAqIFNJUF9BdXRoZW50aWNhdGlvbl9TY2hlbWU7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogU0lQX0F1dGhlbnRpY2F0aW9uX0luZm87CQorCXN0cnVjdCBkaWN0X29iamVjdCAqIFNJUF9TZXJ2ZXJfVVJJOworCXN0cnVjdCBkaWN0X29iamVjdCAqIFNJUF9TZXJ2ZXJfQ2FwYWJpbGl0aWVzOworCXN0cnVjdCBkaWN0X29iamVjdCAqIFNJUF9NYW5kYXRvcnlfQ2FwYWJpbGl0eTsKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBTSVBfT3B0aW9uYWxfQ2FwYWJpbGl0eTsKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBTSVBfTWV0aG9kOworCXN0cnVjdCBkaWN0X29iamVjdCAqIFNJUF9BT1I7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogU0lQX0RlcmVnaXN0cmF0aW9uX1JlYXNvbjsKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBTSVBfUmVhc29uX0NvZGU7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogU0lQX1JlYXNvbl9JbmZvOworCXN0cnVjdCBkaWN0X29iamVjdCAqIERpZ2VzdF9VUkk7CQkKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBEaWdlc3RfTm9uY2U7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogRGlnZXN0X05vbmNlX0NvdW50OworCXN0cnVjdCBkaWN0X29iamVjdCAqIERpZ2VzdF9DTm9uY2U7CQkKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBEaWdlc3RfUmVhbG07CQkKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBEaWdlc3RfUmVzcG9uc2U7CQorCXN0cnVjdCBkaWN0X29iamVjdCAqIERpZ2VzdF9SZXNwb25zZV9BdXRoOwkKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBEaWdlc3RfVXNlcm5hbWU7CQorCXN0cnVjdCBkaWN0X29iamVjdCAqIERpZ2VzdF9NZXRob2Q7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogRGlnZXN0X1FPUDsJCisJc3RydWN0IGRpY3Rfb2JqZWN0ICogRGlnZXN0X0FsZ29yaXRobTsKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBEaWdlc3RfSEExOworfTsKKworZXh0ZXJuICBzdHJ1Y3QgYXBwX3NpcF9kaWN0ICBzaXBfZGljdDsKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvYXBwX3NpcC9hcHBfc2lwLmwgYi9leHRlbnNpb25zL2FwcF9zaXAvYXBwX3NpcC5sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ZTkwNDQKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2FwcF9zaXAvYXBwX3NpcC5sCkBAIC0wLDAgKzEsMTYyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogQWxleGFuZHJlIFdlc3RmYWhsIDxhd2VzdGZhaGxAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTAsIEFsZXhhbmRyZSBXZXN0ZmFobCwgVGVyYW9rYSBMYWJvcmF0b3J5IChLZWlvIFVuaXZlcnNpdHkpLCBhbmQgdGhlIFdJREUgUHJvamVjdC4gCSAqCQkKKyoJCQkJCQkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIEJhc2VkIG9uIHRhX2NvbmYubCAoU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+KQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBUZXJhb2thIExhYm9yYXRvcnkgbm9yIHRoZSAJCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgVGVyYW9rYSBMYWJvcmF0b3J5IAkJCQkJCSAqCisqICAgCQkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworCisleworI2luY2x1ZGUgImFwcF9zaXAuaCIKKy8qIEluY2x1ZGUgeWFjYyB0b2tlbnMgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlICJhcHBfc2lwLnRhYi5oIgorCisvKiBVcGRhdGUgdGhlIGNvbHVtbiBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBZWV9VU0VSX0FDVElPTiB7IAkJCQkJCVwKKwl5eWxsb2MtPmZpcnN0X2NvbHVtbiA9IHl5bGxvYy0+bGFzdF9jb2x1bW4gKyAxOyAJCVwKKwl5eWxsb2MtPmxhc3RfY29sdW1uID0geXlsbG9jLT5maXJzdF9jb2x1bW4gKyB5eWxlbmcgLSAxOwlcCit9CisKKy8qIEF2b2lkIHdhcm5pbmcgd2l0aCBuZXdlciBmbGV4ICovCisjZGVmaW5lIFlZX05PX0lOUFVUCisKKyV9CisKKyVvcHRpb24gYmlzb24tYnJpZGdlIGJpc29uLWxvY2F0aW9ucworJW9wdGlvbiBub3l5d3JhcAorJW9wdGlvbiBub3VucHV0CisKKyUlCisKKwkvKiBVcGRhdGUgdGhlIGxpbmUgY291bnQgKi8KK1xuCQkJeworCQkJCXl5bGxvYy0+Zmlyc3RfbGluZSsrOyAKKwkJCQl5eWxsb2MtPmxhc3RfbGluZSsrOyAKKwkJCQl5eWxsb2MtPmxhc3RfY29sdW1uPTA7IAorCQkJfQorCSAKKwkvKiBFYXQgYWxsIHNwYWNlcyBidXQgbm90IG5ldyBsaW5lcyAqLworKFtbOnNwYWNlOl1dey19W1xuXSkrCTsKKwkvKiBFYXQgYWxsIGNvbW1lbnRzICovCisjLiokCQkJOworCisJLyogUmVjb2duaXplIGFueSBpbnRlZ2VyICovCitbLV0/W1s6ZGlnaXQ6XV0rCQl7CisJCQkJLyogQ29udmVydCB0aGlzIHRvIGFuIGludGVnZXIgdmFsdWUgKi8KKwkJCQlpbnQgcmV0PTA7CisJCQkJcmV0ID0gc3NjYW5mKHl5dGV4dCwgIiVpIiwgJnl5bHZhbC0+aW50ZWdlcik7CisJCQkJaWYgKHJldCAhPSAxKSB7CisJCQkJCS8qIE5vIG1hdGNoaW5nOiBhbiBlcnJvciBvY2N1cnJlZCAqLworCQkJCQlmZF9sb2dfZGVidWcoIlVuYWJsZSB0byBjb252ZXJ0IHRoZSB2YWx1ZSAnJXMnIHRvIGEgdmFsaWQgbnVtYmVyOiAlcyIsIHl5dGV4dCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCQkJcmV0dXJuIExFWF9FUlJPUjsgLyogdHJpZyBhbiBlcnJvciBpbiB5YWNjIHBhcnNlciAqLworCQkJCQkvKiBNYXliZSB3ZSBjb3VsZCBSRUpFQ1QgaW5zdGVhZCBvZiBmYWlsaW5nIGhlcmU/ICovCisJCQkJfQorCQkJCXJldHVybiBJTlRFR0VSOworCQkJfQorCisJLyogUmVjb2duaXplIHF1b3RlZCBzdHJpbmdzIC0tIHdlIGRvIG5vdCBzdXBwb3J0IGVzY2FwZWQgXCIgaW4gdGhlIHN0cmluZyBjdXJyZW50bHkuICovCitcIlteXCJdK1wiCQl7CisJCQkJLyogTWF0Y2ggYSBxdW90ZWQgc3RyaW5nLiBMZXQncyBiZSB2ZXJ5IHBlcm1pc3NpdmUuICovCisJCQkJeXlsdmFsLT5zdHJpbmcgPSBzdHJkdXAoeXl0ZXh0KzEpOworCQkJCWlmICgheXlsdmFsLT5zdHJpbmcpIHsKKwkJCQkJZmRfbG9nX2RlYnVnKCJVbmFibGUgdG8gY29weSB0aGUgc3RyaW5nICclcyc6ICVzIiwgeXl0ZXh0LCBzdHJlcnJvcihlcnJubykpOworCQkJCQlUUkFDRV9ERUJVRyhJTkZPLCAic3RyZHVwIGZhaWxlZCIpOworCQkJCQlyZXR1cm4gTEVYX0VSUk9SOyAvKiB0cmlnIGFuIGVycm9yIGluIHlhY2MgcGFyc2VyICovCisJCQkJfQorCQkJCXl5bHZhbC0+c3RyaW5nW3N0cmxlbih5eXRleHQpIC0gMl0gPSAnXDAnOworCQkJCXJldHVybiBRU1RSSU5HOworCQkJfQorCisKKworCS8qIFJlY29nbml6ZSB0aGUgdG9rZW5zICovCQorKD9pOiJteXNxbF9sb2dpbiIpCXsKKwkJCQlyZXR1cm4gQVNNWVNRTF9MT0dJTjsKKwkJCX0KKworKD9pOiJteXNxbF9wYXNzd29yZCIpCQl7CisJCQkJcmV0dXJuIEFTTVlTUUxfUEFTU1dPUkQ7CisJCQl9CisKKyg/aToibXlzcWxfZGF0YWJhc2UiKQkJeworCQkJCXJldHVybiBBU01ZU1FMX0RBVEFCQVNFOworCQkJfQorCisoP2k6Im15c3FsX3NlcnZlciIpCQl7CisJCQkJcmV0dXJuIEFTTVlTUUxfU0VSVkVSOworCQkJfQorCisoP2k6Im15c3FsX3BvcnQiKQkJeworCQkJCXJldHVybiBBU01ZU1FMX1BPUlQ7CisJCQl9CisoP2k6InJ0cl9wb3J0IikJCXsKKwkJCQlyZXR1cm4gUlRSX1BPUlQ7CisJCQl9CisoP2k6InBwcl9wb3J0IikJCXsKKwkJCQlyZXR1cm4gUFBSX1BPUlQ7CisJCQl9CisoP2k6Im1vZGUiKQkJeworCQkJCXJldHVybiBNT0RFOworCQkJfQorCisoP2k6ImRhdGFzb3VyY2UiKQkJeworCQkJCXJldHVybiBEQVRBU09VUkNFOworCQkJfQorCQkJCisoP2k6Im15c3FsIikJCXsKKwkJCQl5eWx2YWwtPmludGVnZXIgPSBBU01ZU1FMOworCQkJCXJldHVybiBJTlRFR0VSOworCQkJfQorKD9pOiJkc3NlcnZlciIpCQl7CisJCQkJeXlsdmFsLT5pbnRlZ2VyID0gTU9ERV9EU1NFUlZFUjsKKwkJCQlyZXR1cm4gSU5URUdFUjsKKwkJCX0KKworKD9pOiJzbCIpCXsKKwkJCQl5eWx2YWwtPmludGVnZXIgPSBNT0RFX1NMOworCQkJCXJldHVybiBJTlRFR0VSOworCQkJfQorCisKKwkJCQorCS8qIFZhbGlkIHNpbmdsZSBjaGFyYWN0ZXJzIGZvciB5eXBhcnNlICovCitbPTtdCQkJeyByZXR1cm4geXl0ZXh0WzBdOyB9CisKKwkvKiBVbnJlY29nbml6ZWQgc2VxdWVuY2UsIGlmIGl0IGRpZCBub3QgbWF0Y2ggYW55IHByZXZpb3VzIHBhdHRlcm4gKi8KK1teWzpzcGFjZTpdIio9Pjtcbl0rCXsgCisJCQkJZmRfbG9nX2RlYnVnKCJVbnJlY29nbml6ZWQgdGV4dCBvbiBsaW5lICVkIGNvbCAlZDogJyVzJy4iLCB5eWxsb2MtPmZpcnN0X2xpbmUsIHl5bGxvYy0+Zmlyc3RfY29sdW1uLCB5eXRleHQpOworCQkJIAlyZXR1cm4gTEVYX0VSUk9SOyAKKwkJCX0KKworJSUKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvYXBwX3NpcC9hcHBfc2lwLnkgYi9leHRlbnNpb25zL2FwcF9zaXAvYXBwX3NpcC55Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMjg4YTQKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2FwcF9zaXAvYXBwX3NpcC55CkBAIC0wLDAgKzEsMjA4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogQWxleGFuZHJlIFdlc3RmYWhsIDxhd2VzdGZhaGxAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTAsIEFsZXhhbmRyZSBXZXN0ZmFobCwgVGVyYW9rYSBMYWJvcmF0b3J5IChLZWlvIFVuaXZlcnNpdHkpLCBhbmQgdGhlIFdJREUgUHJvamVjdC4gCSAqCQkKKyoJCQkJCQkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIEJhc2VkIG9uIHRhX2NvbmYueSAgKFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PikJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVGVyYW9rYSBMYWJvcmF0b3J5IG5vciB0aGUgCQkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFRlcmFva2EgTGFib3JhdG9yeSAJCQkJCQkgKgorKiAgIAkJCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKworLyogRm9yIGRldmVsb3BtZW50IG9ubHkgOiAqLworJWRlYnVnIAorJWVycm9yLXZlcmJvc2UKKworLyogVGhlIHBhcnNlciByZWNlaXZlcyB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGZpbGVuYW1lIGFzIHBhcmFtZXRlciAqLworJXBhcnNlLXBhcmFtIHtjaGFyICogY29uZmZpbGV9CisKKy8qIEtlZXAgdHJhY2sgb2YgbG9jYXRpb24gKi8KKyVsb2NhdGlvbnMgCislcHVyZS1wYXJzZXIKKworJXsKKyNpbmNsdWRlICJhcHBfc2lwLmgiCisjaW5jbHVkZSAiYXBwX3NpcC50YWIuaCIJLyogYmlzb24gaXMgbm90IHNtYXJ0IGVub3VnaCB0byBkZWZpbmUgdGhlIFlZTFRZUEUgYmVmb3JlIGluY2x1ZGluZyB0aGlzIGNvZGUsIHNvLi4uICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9uICovCitpbnQgeXlwYXJzZShjaGFyICogY29uZmZpbGUpOworCisvKiBQYXJzZSB0aGUgY29uZmlndXJhdGlvbiBmaWxlICovCitpbnQgYXNfY29uZl9oYW5kbGUoY2hhciAqIGNvbmZmaWxlKQoreworCWV4dGVybiBGSUxFICogYXBwX3NpcGluOworCWludCByZXQ7CisJCisJVFJBQ0VfRU5UUlkoIiVwIiwgY29uZmZpbGUpOworCQorCVRSQUNFX0RFQlVHIChGVUxMLCAiUGFyc2luZyBjb25maWd1cmF0aW9uIGZpbGU6ICVzLi4uIiwgY29uZmZpbGUpOworCQorCWFwcF9zaXBpbiA9IGZvcGVuKGNvbmZmaWxlLCAiciIpOworCWlmIChhcHBfc2lwaW4gPT0gTlVMTCkgeworCQlyZXQgPSBlcnJubzsKKwkJZmRfbG9nX2RlYnVnKCJVbmFibGUgdG8gb3BlbiBleHRlbnNpb24gY29uZmlndXJhdGlvbiBmaWxlICVzIGZvciByZWFkaW5nOiAlcyIsIGNvbmZmaWxlLCBzdHJlcnJvcihyZXQpKTsKKwkJVFJBQ0VfREVCVUcgKElORk8sICJFcnJvciBvY2N1cnJlZCwgbWVzc2FnZSBsb2dnZWQgLS0gY29uZmlndXJhdGlvbiBmaWxlLiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHl5cGFyc2UoY29uZmZpbGUpOworCisJZmNsb3NlKGFwcF9zaXBpbik7CisKKwlpZiAocmV0ICE9IDApIHsKKwkJVFJBQ0VfREVCVUcgKElORk8sICJVbmFibGUgdG8gcGFyc2UgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4iKTsKKwkJcmV0dXJuIEVJTlZBTDsKKwl9CisJCisJcmV0dXJuIDA7Cit9CisKKy8qIFRoZSBMZXggcGFyc2VyIHByb3RvdHlwZSAqLworaW50IGFwcF9zaXBsZXgoWVlTVFlQRSAqbHZhbHAsIFlZTFRZUEUgKmxsb2NwKTsKKworLyogRnVuY3Rpb24gdG8gcmVwb3J0IHRoZSBlcnJvcnMgKi8KK3ZvaWQgeXllcnJvciAoWVlMVFlQRSAqcGxvYywgY2hhciAqIGNvbmZmaWxlLCBjaGFyIGNvbnN0ICpzKQoreworCVRSQUNFX0RFQlVHKElORk8sICJFcnJvciBpbiBjb25maWd1cmF0aW9uIHBhcnNpbmciKTsKKwkKKwlpZiAocGxvYy0+Zmlyc3RfbGluZSAhPSBwbG9jLT5sYXN0X2xpbmUpCisJCWZkX2xvZ19kZWJ1ZygiJXM6JWQuJWQtJWQuJWQgOiAlcyIsIGNvbmZmaWxlLCBwbG9jLT5maXJzdF9saW5lLCBwbG9jLT5maXJzdF9jb2x1bW4sIHBsb2MtPmxhc3RfbGluZSwgcGxvYy0+bGFzdF9jb2x1bW4sIHMpOworCWVsc2UgaWYgKHBsb2MtPmZpcnN0X2NvbHVtbiAhPSBwbG9jLT5sYXN0X2NvbHVtbikKKwkJZmRfbG9nX2RlYnVnKCIlczolZC4lZC0lZCA6ICVzIiwgY29uZmZpbGUsIHBsb2MtPmZpcnN0X2xpbmUsIHBsb2MtPmZpcnN0X2NvbHVtbiwgcGxvYy0+bGFzdF9jb2x1bW4sIHMpOworCWVsc2UKKwkJZmRfbG9nX2RlYnVnKCIlczolZC4lZCA6ICVzIiwgY29uZmZpbGUsIHBsb2MtPmZpcnN0X2xpbmUsIHBsb2MtPmZpcnN0X2NvbHVtbiwgcyk7Cit9CisKKyV9CisKKy8qIFZhbHVlcyByZXR1cm5lZCBieSBsZXggZm9yIHRva2VuICovCisldW5pb24geworCWNoYXIgCQkqc3RyaW5nOwkvKiBUaGUgc3RyaW5nIGlzIGFsbG9jYXRlZCBieSBzdHJkdXAgaW4gbGV4LiovCisJaW50CQkgaW50ZWdlcjsJCS8qIFN0b3JlIGludGVnZXIgdmFsdWVzICovCit9CisKKy8qIEluIGNhc2Ugb2YgZXJyb3IgaW4gdGhlIGxleGljYWwgYW5hbHlzaXMgKi8KKyV0b2tlbiAJCUxFWF9FUlJPUgorCisvKiBLZXkgd29yZHMgKi8KKyV0b2tlbiAJCU1PREUKKyV0b2tlbiAJCURBVEFTT1VSQ0UKKyV0b2tlbiAJCUFTTVlTUUxfTE9HSU4KKyV0b2tlbiAJCUFTTVlTUUxfUEFTU1dPUkQKKyV0b2tlbiAJCUFTTVlTUUxfREFUQUJBU0UKKyV0b2tlbiAJCUFTTVlTUUxfU0VSVkVSCisldG9rZW4gCQlBU01ZU1FMX1BPUlQKKyV0b2tlbiAJCVJUUl9QT1JUCisldG9rZW4gCQlQUFJfUE9SVAorCisvKiBUb2tlbnMgYW5kIHR5cGVzIGZvciByb3V0aW5nIHRhYmxlIGRlZmluaXRpb24gKi8KKy8qIEEgKGRlKXF1b3RlZCBzdHJpbmcgKG1hbGxvYydkIGluIGxleCBwYXJzZXI7IGl0IG11c3QgYmUgZnJlZWQgYWZ0ZXIgdXNlKSAqLworJXRva2VuIDxzdHJpbmc+CVFTVFJJTkcKKworLyogQW4gaW50ZWdlciB2YWx1ZSAqLworJXRva2VuIDxpbnRlZ2VyPiBJTlRFR0VSCisKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworJSUKKworCS8qIFRoZSBncmFtbWFyIGRlZmluaXRpb24gKi8KK2NvbmZmaWxlOgkJLyogZW1wdHkgZ3JhbW1hciBpcyBPSyAqLworCQkJfCBjb25mZmlsZSBtb2RlCisJCQl8IGNvbmZmaWxlIGRhdGFzb3VyY2UKKwkJCXwgY29uZmZpbGUgbXlzcWxfbG9naW4KKwkJCXwgY29uZmZpbGUgbXlzcWxfcGFzc3dvcmQKKwkJCXwgY29uZmZpbGUgbXlzcWxfZGF0YWJhc2UKKwkJCXwgY29uZmZpbGUgbXlzcWxfc2VydmVyCisJCQl8IGNvbmZmaWxlIG15c3FsX3BvcnQKKwkJCXwgY29uZmZpbGUgcnRyX3BvcnQKKwkJCXwgY29uZmZpbGUgcHByX3BvcnQKKwkJCTsKKworbW9kZToJCQlNT0RFICc9JyBJTlRFR0VSICc7JworCQkJeworCQkJCWFzX2NvbmYtPm1vZGUgPSAkMzsKKwkJCX0KKwkJCTsKKworZGF0YXNvdXJjZToJCQlEQVRBU09VUkNFICc9JyBJTlRFR0VSICc7JworCQkJeworCQkJCWFzX2NvbmYtPmRhdGFzb3VyY2UgPSAkMzsKKwkJCX0KKwkJCTsKKworbXlzcWxfbG9naW46CQkJQVNNWVNRTF9MT0dJTiAnPScgUVNUUklORyAnOycKKwkJCXsKKwkJCQlmcmVlKGFzX2NvbmYtPm15c3FsX2xvZ2luKTsKKwkJCQlhc19jb25mLT5teXNxbF9sb2dpbiA9ICQzOworCQkJfQorCQkJOworCitteXNxbF9wYXNzd29yZDoJCQlBU01ZU1FMX1BBU1NXT1JEICc9JyBRU1RSSU5HICc7JworCQkJeworCQkJCWZyZWUoYXNfY29uZi0+bXlzcWxfcGFzc3dvcmQpOworCQkJCWFzX2NvbmYtPm15c3FsX3Bhc3N3b3JkID0gJDM7CisJCQl9CisJCQk7CisKK215c3FsX2RhdGFiYXNlOgkJCUFTTVlTUUxfREFUQUJBU0UgJz0nIFFTVFJJTkcgJzsnCisJCQl7CisJCQkJZnJlZShhc19jb25mLT5teXNxbF9kYXRhYmFzZSk7CisJCQkJYXNfY29uZi0+bXlzcWxfZGF0YWJhc2UgPSAkMzsKKwkJCX0KKwkJCTsKKworbXlzcWxfc2VydmVyOgkJQVNNWVNRTF9TRVJWRVIgJz0nIFFTVFJJTkcgJzsnCisJCQl7CisJCQkJZnJlZShhc19jb25mLT5teXNxbF9zZXJ2ZXIpOworCQkJCWFzX2NvbmYtPm15c3FsX3NlcnZlciA9ICQzOworCQkJfQorCQkJOworCitteXNxbF9wb3J0OgkJQVNNWVNRTF9QT1JUICc9JyBJTlRFR0VSICc7JworCQkJeworCQkJCWFzX2NvbmYtPm15c3FsX3BvcnQgPSAodWludDE2X3QpJDM7CisJCQl9CisJCQk7CitydHJfcG9ydDoJCVJUUl9QT1JUICc9JyBJTlRFR0VSICc7JworCQkJeworCQkJCWFzX2NvbmYtPnJ0cl9wb3J0ID0gKHVpbnQxNl90KSQzOworCQkJfQorCQkJOworcHByX3BvcnQ6CQlQUFJfUE9SVCAnPScgSU5URUdFUiAnOycKKwkJCXsKKwkJCQlhc19jb25mLT5wcHJfcG9ydCA9ICh1aW50MTZfdCkkMzsKKwkJCX0KKwkJCTsKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvYXBwX3NpcC9saWJhcHBfc2lwLmMgYi9leHRlbnNpb25zL2FwcF9zaXAvbGliYXBwX3NpcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NDJmZjQKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2FwcF9zaXAvbGliYXBwX3NpcC5jCkBAIC0wLDAgKzEsMTA3OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IEFsZXhhbmRyZSBXZXN0ZmFobCA8YXdlc3RmYWhsQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDEwLCBBbGV4YW5kcmUgV2VzdGZhaGwsIFRlcmFva2EgTGFib3JhdG9yeSAoS2VpbyBVbml2ZXJzaXR5KSwgYW5kIHRoZSBXSURFIFByb2plY3QuIAkgKgkJCisqCQkJCQkJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFRlcmFva2EgTGFib3JhdG9yeSBub3IgdGhlIAkJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBUZXJhb2thIExhYm9yYXRvcnkgCQkJCQkJICoKKyogICAJCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vI2luY2x1ZGUgPG15c3FsLmg+CisjaW5jbHVkZSAiYXBwX3NpcC5oIgorCitNWVNRTCAqY29ubjsKKwordm9pZCBjbGVhcl9kaWdlc3QodWludDhfdCAqIGRpZ2VzdCwgY2hhciAqIHJlYWRhYmxlX2RpZ2VzdCwgaW50IGRpZ2VzdGxlbmd0aCkKK3sKKwlpbnQgaT0wOworCWZvcihpPTA7aTxkaWdlc3RsZW5ndGggKiAyO2krKykKKwkJc3ByaW50ZigmcmVhZGFibGVfZGlnZXN0WzIgKiBpXSwgIiUyLjJoaHgiLCBkaWdlc3RbaV0pOworCXJlYWRhYmxlX2RpZ2VzdFsyICogZGlnZXN0bGVuZ3RoXT0nXDAnOworCQorCXJldHVybjsKK30KKworLy8gWW91IG11c3QgY3JlYXRlIGEgdGFibGUgbGlrZSB0aGlzICJjaGFyICBjbGVhckRpZ2VzdFtESUdFU1RfTEVOKjIrMV07Igordm9pZCBjYWxjX21kNShjaGFyICpjbGVhckRpZ2VzdCwgY2hhciAqIGRhdGEpCit7CisJZ2NyeV9tZF9oZF90IG1kNTsKKwl1aW50OF90ICogYmluRGlnZXN0PU5VTEw7CisJCisJQ0hFQ0tfTUFMTE9DX0RPKGJpbkRpZ2VzdD1tYWxsb2MoRElHRVNUX0xFTikscmV0dXJuKTsKKwkKKwlnY3J5X21kX29wZW4oJm1kNSxHQ1JZX01EX01ENSwgMCk7IAorCWdjcnlfbWRfd3JpdGUobWQ1LCAoY2hhciAqKWRhdGEsIHNpemVvZihkYXRhKSk7CisJbWVtY3B5KGJpbkRpZ2VzdCwgZ2NyeV9tZF9yZWFkKG1kNSwgIEdDUllfTURfTUQ1KSxnY3J5X21kX2dldF9hbGdvX2RsZW4oR0NSWV9NRF9NRDUpKTsKKwlnY3J5X21kX2Nsb3NlKG1kNSk7CisJCisJY2xlYXJfZGlnZXN0KGJpbkRpZ2VzdCwgY2xlYXJEaWdlc3QsIERJR0VTVF9MRU4pOworCWZyZWUoYmluRGlnZXN0KTsKKwlyZXR1cm47Cit9CisKKworLyogU2VhcmNoIGEgZ2l2ZW4gQVZQIG1vZGVsIGluIGFuIEFWUCAoZXh0cmFjdGVkIGZyb20gbGliZnJlZWRpYW1ldGVyL21lc3NhZ2UuYyApICovCitpbnQgZmRfYXZwX3NlYXJjaF9hdnAgKCBzdHJ1Y3QgYXZwICogZ3JvdXBlZGF2cCwgc3RydWN0IGRpY3Rfb2JqZWN0ICogd2hhdCwgc3RydWN0IGF2cCAqKiBhdnAgKQoreworCXN0cnVjdCBhdnAgKiBuZXh0YXZwOworCXN0cnVjdCBhdnBfaGRyICogbmV4dGF2cGhkcjsKKwlzdHJ1Y3QgZGljdF9hdnBfZGF0YSAJZGljdGRhdGE7CisJCisJCisJVFJBQ0VfRU5UUlkoIiVwICVwICVwIiwgZ3JvdXBlZGF2cCwgd2hhdCwgYXZwKTsKKwkKKwlDSEVDS19GQ1QoICBmZF9kaWN0X2dldHZhbCh3aGF0LCAmZGljdGRhdGEpICApOworCQorCS8vIExvb3Agb25seSBpbiB0aGUgZ3JvdXAgQVZQIAorCUNIRUNLX0ZDVCggIGZkX21zZ19icm93c2UoZ3JvdXBlZGF2cCwgTVNHX0JSV19GSVJTVF9DSElMRCwgKHZvaWQgKikmbmV4dGF2cCwgTlVMTCkgICk7CisJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2hkciggbmV4dGF2cCwgJm5leHRhdnBoZHIgKSAgKTsKKwkKKwl3aGlsZSAobmV4dGF2cGhkcikgeworCQkKKwkJaWYgKCAobmV4dGF2cGhkci0+YXZwX2NvZGUgICA9PSBkaWN0ZGF0YS5hdnBfY29kZSkgJiYgKG5leHRhdnBoZHItPmF2cF92ZW5kb3IgPT0gZGljdGRhdGEuYXZwX3ZlbmRvcikgKSAvLyBhbHdheXMgMCBpZiBubyBWZW5kb3IgZmxhZworCQl7CisJCQlicmVhazsKKwkJfQorCQkKKwkJLy8gT3RoZXJ3aXNlIG1vdmUgdG8gbmV4dCBBVlAgaW4gdGhlIGdyb3VwZWQgQVZQIAorCQlDSEVDS19GQ1QoIGZkX21zZ19icm93c2UobmV4dGF2cCwgTVNHX0JSV19ORVhULCAodm9pZCAqKSZuZXh0YXZwLCBOVUxMKSApOworCQkKKwkJaWYobmV4dGF2cCE9TlVMTCkKKwkJeworCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2hkciggbmV4dGF2cCwgJm5leHRhdnBoZHIgKSAgKTsKKwkJfQorCQllbHNlCisJCQluZXh0YXZwaGRyPU5VTEw7CisJfQorCWlmIChhdnApCisJCSphdnAgPSBuZXh0YXZwOworCQorCWlmIChhdnAgJiYgbmV4dGF2cCkgeworCQlzdHJ1Y3QgZGljdGlvbmFyeSAqIGRpY3Q7CisJCUNIRUNLX0ZDVCggZmRfZGljdF9nZXRkaWN0KCB3aGF0LCAmZGljdCkgKTsKKwkJQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfcGFyc2VfZGljdCggbmV4dGF2cCwgZGljdCwgTlVMTCApLCAgKTsKKwl9CisJCisJaWYgKGF2cCB8fCBuZXh0YXZwKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiBFTk9FTlQ7Cit9CitzdHJ1Y3QgYXZwX2hkciAqd2Fsa19kaWdlc3Qoc3RydWN0IGF2cCAqYXZwLCBpbnQgYXZwX2NvZGUpCit7CisJc3RydWN0IGF2cF9oZHIgKnRlbXBoZHI9TlVMTDsKKwlDSEVDS19GQ1RfRE8oZmRfbXNnX2Jyb3dzZSAoIGF2cCwgTVNHX0JSV19XQUxLLCAmYXZwLCBOVUxMKSxyZXR1cm4gTlVMTCk7CisJCisJd2hpbGUoYXZwIT1OVUxMKQorCXsKKwkJCisJCUNIRUNLX0ZDVF9ETyggZmRfbXNnX2F2cF9oZHIoIGF2cCwmdGVtcGhkciApLHJldHVybiBOVUxMKTsKKworCQlpZih0ZW1waGRyLT5hdnBfY29kZT09YXZwX2NvZGUpCisJCXsKKwkJCS8vV2UgZm91bmQgdGhlIEFWUCBzbyB3ZSBzZXQgYXZwIHRvIE5VTEwgdG8gZXhpdCB0aGUgbG9vcAorCQkJYXZwPU5VTEw7CisJCQlyZXR1cm4gdGVtcGhkcjsKKwkJCQorCQl9CisJCWVsc2UgaWYodGVtcGhkci0+YXZwX2NvZGU9PTM4MCkvL1NJUC1BdXRob3JpemF0aW9uIEFWUAorCQl7CisJCQkvL1dlIGRpZG4ndCBmb3VuZCB0aGUgQVZQIGJ1dCB3ZSBmaW5pc2hlZCBicm93c2luZyB0aGUgQXV0aGVudGljYXRpb24gQVZQCisJCQlhdnA9TlVMTDsKKwkJCXRlbXBoZHI9TlVMTDsKKwkJCQorCQkJcmV0dXJuIHRlbXBoZHI7CisJCX0KKwkJZWxzZQorCQl7CisJCQlDSEVDS19GQ1RfRE8oZmRfbXNnX2Jyb3dzZSAoIGF2cCwgTVNHX0JSV19XQUxLLCAmYXZwLCBOVUxMKSxyZXR1cm4gTlVMTCk7CisJCQl0ZW1waGRyPU5VTEw7CisJCQkKKwkJfQorCX0KKwkKKwlyZXR1cm4gdGVtcGhkcjsKK30KKworaW50IHN0YXJ0X215c3FsX2Nvbm5lY3Rpb24oKQoreworCWNvbm4gPSBteXNxbF9pbml0KE5VTEwpOworCQorCW15c3FsX29wdGlvbnMoY29ubiwgTVlTUUxfT1BUX1JFQ09OTkVDVCwgInRydWUiKTsKKwkKKwlpZiAoIW15c3FsX3JlYWxfY29ubmVjdChjb25uLCBhc19jb25mLT5teXNxbF9zZXJ2ZXIsYXNfY29uZi0+bXlzcWxfbG9naW4sIGFzX2NvbmYtPm15c3FsX3Bhc3N3b3JkLCBhc19jb25mLT5teXNxbF9kYXRhYmFzZSwgYXNfY29uZi0+bXlzcWxfcG9ydCwgTlVMTCwgMCkpIAorCXsvL1RPRE86IGRpc3BsYXkgZXJyb3IgZnJvbSBteXNxbAorCQlUUkFDRV9ERUJVRyhJTkZPLCJVbmFibGUgdG8gY29ubmVjdCB0byBkYXRhYmFzZSAoJXMpIHdpdGggbG9naW46JXMiLGFzX2NvbmYtPm15c3FsX2RhdGFiYXNlLGFzX2NvbmYtPm15c3FsX2xvZ2luKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworCQorfQorCisKK3ZvaWQgcmVxdWVzdF9teXNxbChjaGFyICpxdWVyeSkKK3sKKwkvL1dlIGNoZWNrIGlmIHRoZSBjb25uZWN0aW9uIGlzIHN0aWxsIHVwCisJbXlzcWxfcGluZyhjb25uKTsKKwkKKwlpZiAobXlzcWxfcXVlcnkoY29ubiwgcXVlcnkpKSAKKwl7CisJCVRSQUNFX0RFQlVHKElORk8sIlF1ZXJ5ICVzIGZhaWxlZCIsIHF1ZXJ5KTsKKwkJCisJfQorCQorfQorCit2b2lkIGNsb3NlX215c3FsX2Nvbm5lY3Rpb24oKQoreworCW15c3FsX2Nsb3NlKGNvbm4pOworCQorfQorCisvL0lmIHBhc3N3b3JkIGlzIG51bGwsIHdlIGp1c3QgdmVyaWZ5IHRoaXMgdXNlciBleGlzdAorLy9XZSBkb24ndCBuZWVkIHRoZSBwYXNzd29yZCBsZW5ndGggYmVjYXVzZSBpdCBpcyBhIHRhYmxlJworaW50IGdldF9wYXNzd29yZChjb25zdCB1bnNpZ25lZCBjaGFyICp1c2VybmFtZSwgY29uc3Qgc2l6ZV90IHVzZXJuYW1lbGVuLCBjaGFyICpwYXNzd29yZCkKK3sKKwlDSEVDS19QQVJBTVModXNlcm5hbWUgJiYgdXNlcm5hbWVsZW4pOworCQorCWludCBub3RfZm91bmQ9MjsKKwlzaXplX3QgcXVlcnlsZW4sIHVzZXJuYW1lcHVyZWxlbjsKKwljaGFyICpxdWVyeSwgKnVzZXJuYW1lX3B1cmU7CisJCisJc3dpdGNoKGFzX2NvbmYtPmRhdGFzb3VyY2UpCisJeworCQkvL015U1FMCisJCWNhc2UgQVNNWVNRTDoKKwkJCS8vV2UgYWxsb2NhdGUgdGhlIGRvdWJsZSBzaXplIG9mIHVzZXJuYW1lIGJlY2F1c2UgYXQgd29yc3QgaXQgY2FuIGJlIGFsbCBxdW90ZXMKKwkJCXVzZXJuYW1lX3B1cmU9bWFsbG9jKHVzZXJuYW1lbGVuKjIrMSk7CisJCQkvL1dlIHB1cmlmeSB1c2VybmFtZSBub3QgdG8gaGF2ZSBmb3JiaWRkZW4gY2hhcmFjdGVycworCQkJdXNlcm5hbWVwdXJlbGVuPW15c3FsX3JlYWxfZXNjYXBlX3N0cmluZyhjb25uLCB1c2VybmFtZV9wdXJlLCAoY29uc3QgY2hhciAqKXVzZXJuYW1lLCB1c2VybmFtZWxlbik7CisJCQkKKwkJCS8vV2UgY29weSB1c2VybmFtZSBpbiBxdWVyeQorCQkJcXVlcnlsZW49U1FMX0dFVFBBU1NXT1JEX0xFTiArIHVzZXJuYW1lcHVyZWxlbjsKKwkJCXF1ZXJ5ID0gbWFsbG9jKHF1ZXJ5bGVuKzIpOworCQkJc25wcmludGYocXVlcnksIHF1ZXJ5bGVuKzEsIFNRTF9HRVRQQVNTV09SRCwgdXNlcm5hbWVfcHVyZSk7CisJCQkKKwkJCU1ZU1FMX1JFUyAqcmVzOworCQkJTVlTUUxfUk9XIHJvdzsKKwkJCQorCQkJLy9XZSBtYWtlIHRoZSBxdWVyeQkKKwkJCXJlcXVlc3RfbXlzcWwocXVlcnkpOworCQkJcmVzPW15c3FsX3VzZV9yZXN1bHQoY29ubik7CisJCQlpZihyZXM9PU5VTEwpCisJCQl7CisJCQkJaWYocGFzc3dvcmQhPU5VTEwpCisJCQkJCXBhc3N3b3JkWzBdPSdcMCc7CisJCQkJZnJlZShxdWVyeSk7CisJCQkJcmV0dXJuIDI7CisJCQl9CisJCQkKKwkJCQorCQkJCisJCQl3aGlsZSAoKHJvdyA9IG15c3FsX2ZldGNoX3JvdyhyZXMpKSAhPSBOVUxMKQorCQkJeworCQkJCWlmKHN0cmxlbihyb3dbMF0pPjApCisJCQkJeworCQkJCQlpZihwYXNzd29yZCE9TlVMTCkKKwkJCQkJCXN0cmNweShwYXNzd29yZCxyb3dbMF0pOworCQkJCQkKKwkJCQkJbm90X2ZvdW5kPTA7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCW15c3FsX2ZyZWVfcmVzdWx0KHJlcyk7CisJCQlmcmVlKHF1ZXJ5KTsKKwkJYnJlYWs7CisJfQorCXJldHVybiBub3RfZm91bmQ7Cit9CisKK2ludCBjaGVja19zaXBhb3IoY29uc3QgdW5zaWduZWQgY2hhciAgKnVzZXJuYW1lLCBjb25zdCBzaXplX3QgdXNlcm5hbWVsZW4sIGNvbnN0IGNoYXIgKiBzaXBfYW9yLGNvbnN0IHNpemVfdCBzaXBhb3JsZW4pCit7CisJQ0hFQ0tfUEFSQU1TKHVzZXJuYW1lICYmIHVzZXJuYW1lbGVuICYmIHNpcF9hb3IgJiYgc2lwYW9ybGVuKTsKKwkKKwlpbnQgbm90X2ZvdW5kPTI7CisJc2l6ZV90IHF1ZXJ5bGVuLCB1c2VybmFtZXB1cmVsZW47CisJY2hhciAqcXVlcnksICp1c2VybmFtZV9wdXJlOworCQorCXN3aXRjaChhc19jb25mLT5kYXRhc291cmNlKQorCXsKKwkJLy9NeVNRTAorCQljYXNlIEFTTVlTUUw6CisJCQkvL1dlIGFsbG9jYXRlIHRoZSBkb3VibGUgc2l6ZSBvZiB1c2VybmFtZSBiZWNhdXNlIGF0IHdvcnN0IGl0IGNhbiBiZSBhbGwgcXVvdGVzCisJCQl1c2VybmFtZV9wdXJlPW1hbGxvYyh1c2VybmFtZWxlbioyKzEpOworCQkJLy9XZSBwdXJpZnkgdXNlcm5hbWUgbm90IHRvIGhhdmUgZm9yYmlkZGVuIGNoYXJhY3RlcnMKKwkJCXVzZXJuYW1lcHVyZWxlbj1teXNxbF9yZWFsX2VzY2FwZV9zdHJpbmcoY29ubiwgdXNlcm5hbWVfcHVyZSwgKGNvbnN0IGNoYXIgKil1c2VybmFtZSwgdXNlcm5hbWVsZW4pOworCQorCQkJLy9XZSBnZXQgdGhlIGxpc3Qgb2YgQU9SIG93bmVkIGJ5IHRoaXMgdXNlcgorCQkJcXVlcnlsZW49U1FMX0dFVFNJUEFPUl9MRU4gKyB1c2VybmFtZXB1cmVsZW47CisJCQlxdWVyeSA9IG1hbGxvYyhxdWVyeWxlbisyKTsKKwkJCXNucHJpbnRmKHF1ZXJ5LCBxdWVyeWxlbisxLCBTUUxfR0VUU0lQQU9SLCB1c2VybmFtZV9wdXJlKTsKKwkJCQorCQkJTVlTUUxfUkVTICpyZXM7CisJCQlNWVNRTF9ST1cgcm93OworCQkJCisJCQkvL1dlIG1ha2UgdGhlIHF1ZXJ5CisJCQlyZXF1ZXN0X215c3FsKHF1ZXJ5KTsKKwkJCXJlcz1teXNxbF91c2VfcmVzdWx0KGNvbm4pOworCQkJaWYocmVzPT1OVUxMKQorCQkJeworCQkJCWZyZWUocXVlcnkpOworCQkJCXJldHVybiAyOworCQkJfQorCQkJCisJCQkKKwkJCW5vdF9mb3VuZD0xOworCQkJd2hpbGUgKChyb3cgPSBteXNxbF9mZXRjaF9yb3cocmVzKSkgIT0gTlVMTCkKKwkJCXsKKwkJCQlpZihzdHJuY21wKChjb25zdCBjaGFyICopc2lwX2Fvcixyb3dbMF0sc2lwYW9ybGVuKT09MCkKKwkJCQl7CisJCQkJCW5vdF9mb3VuZD0wOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlteXNxbF9mcmVlX3Jlc3VsdChyZXMpOworCQkJZnJlZShxdWVyeSk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gbm90X2ZvdW5kOworfQorCitpbnQgZ2V0X2RpYW1ldGVyX3VyaShjb25zdCB1bnNpZ25lZCBjaGFyICpzaXBfYW9yLCBjb25zdCBzaXplX3Qgc2lwYW9ybGVuLCBjaGFyICoqIGRpYW1ldGVyX3VyaSwgc2l6ZV90ICpkaWFtZXRlcnVyaWxlbikKK3sKKwlDSEVDS19QQVJBTVMoc2lwX2FvciAmJiBzaXBhb3JsZW4pOworCisJc2l6ZV90IHF1ZXJ5bGVuLCBzaXBhb3JwdXJlbGVuOworCWNoYXIgKnF1ZXJ5LCAqc2lwYW9yX3B1cmU7CisJaW50IG5vdF9mb3VuZD0yOworCisKKworCisJLy9hIHNpcCBhb3IgbXVzdCBiZWdpbiBieSAic2lwOiIgb3IgInNpcHM6IiBzbyBpdCBtdXN0IGF0IGxlYXN0IGJlIGxvbmdlciB0aGFuIDQgY2hhcnMKKwlpZihzaXBhb3JsZW48NSkKKwkJcmV0dXJuIDI7CisKKwkvL05PVEU6IGVhY2ggbWV0aG9kIGhhcyB0byBwdXJpZnkgc2lwX2FvciBpdHNlbGYuIFlvdSBtdXN0IHJlbW92ZSBxdW90ZXMgb3Igc3BlY2lhbCBjaGFycyBmb3Igc2VjdXJpdHkKKwlzd2l0Y2goYXNfY29uZi0+ZGF0YXNvdXJjZSkKKwl7CisJCS8vTXlTUUwKKwkJY2FzZSBBU01ZU1FMOgorCisJCQlxdWVyeWxlbj1TUUxfR0VURElBTVVSSV9MRU4gKyBzaXBhb3JsZW47CisKKwkJCQorCQkJLy9XZSBhbGxvY2F0ZSB0aGUgZG91YmxlIHNpemUgb2YgU0lQLVVSSSBiZWNhdXNlIGF0IHdvcnN0IGl0IGNhbiBiZSBhbGwgcXVvdGVzCisJCQlDSEVDS19NQUxMT0Moc2lwYW9yX3B1cmU9bWFsbG9jKHNpcGFvcmxlbioyKzEpKTsKKwkJCS8vV2UgcHVyaWZ5IFNJUC1VUkkgbm90IHRvIGhhdmUgZm9yYmlkZGVuIGNoYXJhY3RlcnMKKwkJCXNpcGFvcnB1cmVsZW49bXlzcWxfcmVhbF9lc2NhcGVfc3RyaW5nKGNvbm4sIHNpcGFvcl9wdXJlLCAoY29uc3QgY2hhciAqKXNpcF9hb3IsIHNpcGFvcmxlbik7CisJCQkKKwkJCQorCQkJcXVlcnkgPSBtYWxsb2MocXVlcnlsZW4rc2lwYW9ycHVyZWxlbisgMik7CisJCQlzbnByaW50ZihxdWVyeSwgcXVlcnlsZW4rMSwgU1FMX0dFVERJQU1VUkksIHNpcGFvcl9wdXJlKTsKKwkJCQorCQkJTVlTUUxfUkVTICpyZXM7CisJCQlNWVNRTF9ST1cgcm93OworCQkJCisKKwkJCS8vV2UgbWFrZSB0aGUgcXVlcnkJCisJCQlyZXF1ZXN0X215c3FsKHF1ZXJ5KTsKKwkJCXJlcz1teXNxbF91c2VfcmVzdWx0KGNvbm4pOworCQkJaWYocmVzPT1OVUxMKQorCQkJeworCQkJCS8vV2UgY291bGRuJ3QgbWFrZSB0aGUgcmVxdWVzdAorCQkJCWRpYW1ldGVyX3VyaT1OVUxMOworCQkJCXJldHVybiAyOworCQkJfQorCQkJCisJCQl3aGlsZSAoKHJvdyA9IG15c3FsX2ZldGNoX3JvdyhyZXMpKSAhPSBOVUxMKQorCQkJeworCQkJCSpkaWFtZXRlcnVyaWxlbj1zdHJsZW4ocm93WzBdKTsKKwkJCQlpZigqZGlhbWV0ZXJ1cmlsZW4+MCkKKwkJCQl7CisJCQkJCUNIRUNLX01BTExPQygqZGlhbWV0ZXJfdXJpPW1hbGxvYygqZGlhbWV0ZXJ1cmlsZW4rMSkpOworCQkJCQlzdHJjcHkoKmRpYW1ldGVyX3VyaSxyb3dbMF0pOworCQkJCQlub3RfZm91bmQ9MDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJbXlzcWxfZnJlZV9yZXN1bHQocmVzKTsKKwkJCWZyZWUocXVlcnkpOworCQkJZnJlZShzaXBhb3JfcHVyZSk7CisJCWJyZWFrOworICAgICAgCisgICAgZGVmYXVsdDoKKyAgICAgIAorICAgICAgLy9XZSBtdXN0IG5ldmVyIGdvIGhlcmUsIGlmIHNvLCB3ZSBtdXN0IHN0b3AgZGlhbWV0ZXJfc2lwCisgICAgICBkaWFtZXRlcl91cmk9TlVMTDsKKyAgICAgIHJldHVybiAyOworICAgICAgCisgICAgICBicmVhazsKKyAgfQorICAKKyAgLy8wIGlmIGl0IHdhcyBmb3VuZAorICByZXR1cm4gbm90X2ZvdW5kOworICAKK30KKworCitpbnQgZXhpc3RfdXNlcm5hbWUoY29uc3QgdW5zaWduZWQgY2hhciAqc2lwX2FvciwgY29uc3Qgc2l6ZV90IHNpcGFvcmxlbikKK3sKKwlDSEVDS19QQVJBTVMoc2lwX2FvciAmJiBzaXBhb3JsZW4pOworCQorCXNpemVfdCBxdWVyeWxlbiwgc2lwYW9ycHVyZWxlbjsKKwljaGFyICpxdWVyeSwgKnNpcGFvcl9wdXJlOworCWludCBub3RfZm91bmQ9MTsKKwkKKwkvL2Egc2lwIGFvciBtdXN0IGJlZ2luIGJ5ICJzaXA6IiBvciAic2lwczoiIHNvIGl0IG11c3QgYXQgbGVhc3QgYmUgbG9uZ2VyIHRoYW4gNCBjaGFycworCWlmKHNpcGFvcmxlbjw1KQorCQlyZXR1cm4gMjsKKwkKKwkvL05PVEU6IGVhY2ggbWV0aG9kIGhhcyB0byBwdXJpZnkgc2lwX2FvciBpdHNlbGYuIFlvdSBtdXN0IHJlbW92ZSBxdW90ZXMgb3Igc3BlY2lhbCBjaGFycyBmb3Igc2VjdXJpdHkKKwkKKwlzd2l0Y2goYXNfY29uZi0+ZGF0YXNvdXJjZSkKKwl7CisJCS8vTXlTUUwKKwkJY2FzZSBBU01ZU1FMOgorCQkJCisJCQlxdWVyeWxlbj1TUUxfR0VUVVNFUk5BTUVfTEVOICsgc2lwYW9ybGVuOworCQkJCisJCQkKKwkJCS8vV2UgYWxsb2NhdGUgdGhlIGRvdWJsZSBzaXplIG9mIFNJUC1VUkkgYmVjYXVzZSBhdCB3b3JzdCBpdCBjYW4gYmUgYWxsIHF1b3RlcworCQkJQ0hFQ0tfTUFMTE9DKHNpcGFvcl9wdXJlPW1hbGxvYyhzaXBhb3JsZW4qMisxKSk7CisJCQkvL1dlIHB1cmlmeSBTSVAtVVJJIG5vdCB0byBoYXZlIGZvcmJpZGRlbiBjaGFyYWN0ZXJzCisJCQlzaXBhb3JwdXJlbGVuPW15c3FsX3JlYWxfZXNjYXBlX3N0cmluZyhjb25uLCBzaXBhb3JfcHVyZSwgKGNvbnN0IGNoYXIgKilzaXBfYW9yLCBzaXBhb3JsZW4pOworCQkJCisJCQkKKwkJCXF1ZXJ5ID0gbWFsbG9jKHF1ZXJ5bGVuK3NpcGFvcnB1cmVsZW4rIDIpOworCQkJc25wcmludGYocXVlcnksIHF1ZXJ5bGVuKzEsIFNRTF9HRVRVU0VSTkFNRSwgc2lwYW9yX3B1cmUpOworCQkJCisJCQlNWVNRTF9SRVMgKnJlczsKKwkJCU1ZU1FMX1JPVyByb3c7CisJCQkKKwkJCQorCQkJLy9XZSBtYWtlIHRoZSBxdWVyeQkKKwkJCXJlcXVlc3RfbXlzcWwocXVlcnkpOworCQkJcmVzPW15c3FsX3VzZV9yZXN1bHQoY29ubik7CisJCQlpZihyZXM9PU5VTEwpCisJCQl7CisJCQkJLy9XZSBjb3VsZG4ndCBtYWtlIHRoZSByZXF1ZXN0CisJCQkJcmV0dXJuIDI7CisJCQl9CisJCQkKKwkJCXdoaWxlICgocm93ID0gbXlzcWxfZmV0Y2hfcm93KHJlcykpICE9IE5VTEwpCisJCQl7CisJCQkJaWYoc3RybGVuKHJvd1swXSk+MCkKKwkJCQl7CisJCQkJCW5vdF9mb3VuZD0wOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlteXNxbF9mcmVlX3Jlc3VsdChyZXMpOworCQkJZnJlZShxdWVyeSk7CisJCQlmcmVlKHNpcGFvcl9wdXJlKTsKKwkJCWJyZWFrOworCQkJCisJCWRlZmF1bHQ6CisJCQkKKwkJCS8vV2UgbXVzdCBuZXZlciBnbyBoZXJlLCBpZiBzbywgd2UgbXVzdCBzdG9wIGRpYW1ldGVyX3NpcAorCQkJVFJBQ0VfREVCVUcoSU5GTywiRkFUQUwgRVJST1I6IHRoZSBkYXRhc291cmNlIGlzIHVua25vd24sIHBsZWFzZSBjaGVjayB5b3VyIGNvbmZpZyBmaWxlISIpOworCQkJcmV0dXJuIDI7CisJCQkKKwkJCWJyZWFrOworCX0KKwkKKwkvLzAgaWYgaXQgd2FzIGZvdW5kCisJcmV0dXJuIG5vdF9mb3VuZDsKKwkKK30KKworLy9XZSBjaGVjayBpZiB0aGlzIHVzZXIgY2FuIGdvIGluIHRoZSBnaXZlbiBuZXR3b3JrCitpbnQgYWxsb3dfcm9hbWluZyhjb25zdCB1bnNpZ25lZCBjaGFyICAqdXNlcm5hbWUsIGNvbnN0IHNpemVfdCB1c2VybmFtZWxlbiwgY29uc3QgY2hhciAqIG5ldHdvcmssY29uc3Qgc2l6ZV90IG5ldHdvcmtsZW4pCit7CisJQ0hFQ0tfUEFSQU1TKHVzZXJuYW1lICYmIHVzZXJuYW1lbGVuICYmIG5ldHdvcmsgJiYgbmV0d29ya2xlbik7CisJCisJaW50IG5vdF9mb3VuZD0yOworCXNpemVfdCBxdWVyeWxlbiwgdXNlcm5hbWVwdXJlbGVuOworCWNoYXIgKnF1ZXJ5LCAqdXNlcm5hbWVfcHVyZTsKKwkKKwlzd2l0Y2goYXNfY29uZi0+ZGF0YXNvdXJjZSkKKwl7CisJCS8vTXlTUUwKKwkJY2FzZSBBU01ZU1FMOgorCQkJLy9XZSBhbGxvY2F0ZSB0aGUgZG91YmxlIHNpemUgb2YgdXNlcm5hbWUgYmVjYXVzZSBhdCB3b3JzdCBpdCBjYW4gYmUgYWxsIHF1b3RlcworCQkJdXNlcm5hbWVfcHVyZT1tYWxsb2ModXNlcm5hbWVsZW4qMisxKTsKKwkJCS8vV2UgcHVyaWZ5IHVzZXJuYW1lIG5vdCB0byBoYXZlIGZvcmJpZGRlbiBjaGFyYWN0ZXJzCisJCQl1c2VybmFtZXB1cmVsZW49bXlzcWxfcmVhbF9lc2NhcGVfc3RyaW5nKGNvbm4sIHVzZXJuYW1lX3B1cmUsIChjb25zdCBjaGFyICopdXNlcm5hbWUsIHVzZXJuYW1lbGVuKTsKKwkJCQorCQkJLy9XZSBnZXQgdGhlIGxpc3Qgb2YgQU9SIG93bmVkIGJ5IHRoaXMgdXNlcgorCQkJcXVlcnlsZW49U1FMX0dFVFVTRVJORVRfTEVOICsgdXNlcm5hbWVwdXJlbGVuOworCQkJcXVlcnkgPSBtYWxsb2MocXVlcnlsZW4rMik7CisJCQlzbnByaW50ZihxdWVyeSwgcXVlcnlsZW4rMSwgU1FMX0dFVFVTRVJORVQsIHVzZXJuYW1lX3B1cmUpOworCQkJCisJCQkKKwkJCU1ZU1FMX1JFUyAqcmVzOworCQkJTVlTUUxfUk9XIHJvdzsKKwkJCQorCQkJCisJCQkvL1dlIG1ha2UgdGhlIHF1ZXJ5CisJCQlyZXF1ZXN0X215c3FsKHF1ZXJ5KTsKKwkJCXJlcz1teXNxbF91c2VfcmVzdWx0KGNvbm4pOworCQkJaWYocmVzPT1OVUxMKQorCQkJeworCQkJCWZyZWUocXVlcnkpOworCQkJCXJldHVybiAyOworCQkJfQorCQkJCisJCQkKKwkJCW5vdF9mb3VuZD0xOworCQkJd2hpbGUgKChyb3cgPSBteXNxbF9mZXRjaF9yb3cocmVzKSkgIT0gTlVMTCkKKwkJCXsKKwkJCQlpZihzdHJuY21wKChjb25zdCBjaGFyICopbmV0d29yayxyb3dbMF0sbmV0d29ya2xlbik9PTApCisJCQkJeworCQkJCQlub3RfZm91bmQ9MDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJbXlzcWxfZnJlZV9yZXN1bHQocmVzKTsKKwkJCWZyZWUocXVlcnkpOworCQkJYnJlYWs7CisJfQorCXJldHVybiBub3RfZm91bmQ7Cit9CisKKy8vU0lQLVNlcnZlci1DYXBhYmlsaXRpZXMgZm9yIHRoZSBTSVAtQU9SCitpbnQgZ2V0X3NpcHNlcnZlcl9jYXAoY29uc3QgdW5zaWduZWQgY2hhciAqc2lwX2FvciwgY29uc3Qgc2l6ZV90IHNpcGFvcmxlbiwgc3RydWN0IGF2cCAqKmNhcGFiaWxpdGllcykKK3sKKwlDSEVDS19QQVJBTVMoc2lwX2FvciAmJiBzaXBhb3JsZW4gJiYgY2FwYWJpbGl0aWVzKTsKKwkKKwlzaXplX3QgcXVlcnlsZW4sIHNpcGFvcnB1cmVsZW47CisJY2hhciAqcXVlcnksICpzaXBhb3JfcHVyZTsKKwlpbnQgbm90X2ZvdW5kPTI7CisJdW5pb24gYXZwX3ZhbHVlIHZhbHVlOworCXN0cnVjdCBhdnAgKmF2cDsKKwkKKwkvL2Egc2lwIGFvciBtdXN0IGJlZ2luIGJ5ICJzaXA6IiBvciAic2lwczoiIHNvIGl0IG11c3QgYXQgbGVhc3QgYmUgbG9uZ2VyIHRoYW4gNCBjaGFycworCWlmKHNpcGFvcmxlbjw1KQorCQlyZXR1cm4gMjsKKwkKKwkvL05PVEU6IGVhY2ggbWV0aG9kIGhhcyB0byBwdXJpZnkgc2lwX2FvciBpdHNlbGYuIFlvdSBtdXN0IHJlbW92ZSBxdW90ZXMgb3Igc3BlY2lhbCBjaGFycyBmb3Igc2VjdXJpdHkKKwlzd2l0Y2goYXNfY29uZi0+ZGF0YXNvdXJjZSkKKwl7CisJCS8vTXlTUUwKKwkJY2FzZSBBU01ZU1FMOgorCQkJCisJCQlxdWVyeWxlbj1TUUxfR0VUU0lQU0VSQ0FQX0xFTiArIHNpcGFvcmxlbjsKKwkJCQorCQkJCisJCQkvL1dlIGFsbG9jYXRlIHRoZSBkb3VibGUgc2l6ZSBvZiBTSVAtVVJJIGJlY2F1c2UgYXQgd29yc3QgaXQgY2FuIGJlIGFsbCBxdW90ZXMKKwkJCUNIRUNLX01BTExPQyhzaXBhb3JfcHVyZT1tYWxsb2Moc2lwYW9ybGVuKjIrMSkpOworCQkJLy9XZSBwdXJpZnkgU0lQLVVSSSBub3QgdG8gaGF2ZSBmb3JiaWRkZW4gY2hhcmFjdGVycworCQkJc2lwYW9ycHVyZWxlbj1teXNxbF9yZWFsX2VzY2FwZV9zdHJpbmcoY29ubiwgc2lwYW9yX3B1cmUsIChjb25zdCBjaGFyICopc2lwX2Fvciwgc2lwYW9ybGVuKTsKKwkJCQorCQkJCisJCQlxdWVyeSA9IG1hbGxvYyhxdWVyeWxlbitzaXBhb3JwdXJlbGVuKyAyKTsKKwkJCXNucHJpbnRmKHF1ZXJ5LCBxdWVyeWxlbisxLCBTUUxfR0VUU0lQU0VSQ0FQLCBzaXBhb3JfcHVyZSk7CisJCQkKKwkJCU1ZU1FMX1JFUyAqcmVzOworCQkJTVlTUUxfUk9XIHJvdzsKKwkJCQorCQkJLy9XZSBtYWtlIHRoZSBxdWVyeQkKKwkJCXJlcXVlc3RfbXlzcWwocXVlcnkpOworCQkJcmVzPW15c3FsX3VzZV9yZXN1bHQoY29ubik7CisJCQlpZihyZXM9PU5VTEwpCisJCQl7CisJCQkJLy9XZSBjb3VsZG4ndCBtYWtlIHRoZSByZXF1ZXN0CisJCQkJcmV0dXJuIDI7CisJCQl9CisJCQlub3RfZm91bmQ9MTsKKwkJCXdoaWxlICgocm93ID0gbXlzcWxfZmV0Y2hfcm93KHJlcykpICE9IE5VTEwpCisJCQl7CisJCQkJaWYoYXRvaShyb3dbMF0pPT0xKQorCQkJCXsvL21hbmRhdG9yeQorCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3ICggc2lwX2RpY3QuU0lQX01hbmRhdG9yeV9DYXBhYmlsaXR5LCAwLCAmYXZwICkgKTsKKwkJCQkJdmFsdWUuaTMyPSh1aW50MzJfdClhdG9pKHJvd1sxXSk7CisJCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9zZXR2YWx1ZSAoIGF2cCwgJnZhbHVlICkgKTsKKwkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCAoICpjYXBhYmlsaXRpZXMsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwKSApOworCQkJCQkKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsvL29wdGlvbmFsCisJCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBzaXBfZGljdC5TSVBfT3B0aW9uYWxfQ2FwYWJpbGl0eSwgMCwgJmF2cCApICk7CisJCQkJCXZhbHVlLmkzMj0odWludDMyX3QpYXRvaShyb3dbMV0pOworCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUgKCBhdnAsICZ2YWx1ZSApICk7CisJCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQgKCAqY2FwYWJpbGl0aWVzLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCkgKTsKKwkJCQl9CisJCQkJbm90X2ZvdW5kPTA7CisJCQl9CisJCQkKKwkJCW15c3FsX2ZyZWVfcmVzdWx0KHJlcyk7CisJCQlmcmVlKHF1ZXJ5KTsKKwkJCWZyZWUoc2lwYW9yX3B1cmUpOworCQkJYnJlYWs7CisJCQkKKwkJZGVmYXVsdDoKKwkJCQorCQkJLy9XZSBtdXN0IG5ldmVyIGdvIGhlcmUsIGlmIHNvLCB3ZSBtdXN0IHN0b3AgZGlhbWV0ZXJfc2lwCisJCQlUUkFDRV9ERUJVRyhJTkZPLCJGQVRBTCBFUlJPUjogdGhlIGRhdGFzb3VyY2UgaXMgdW5rbm93biwgcGxlYXNlIGNoZWNrIHlvdXIgY29uZmlnIGZpbGUhIik7CisJCQlyZXR1cm4gMjsKKwkJCQorCQkJYnJlYWs7CisJfQorCQorCS8vMCBpZiBpdCB3YXMgZm91bmQKKwlyZXR1cm4gbm90X2ZvdW5kOworCQorfQorCisKKy8vV2UgcmV0cmlldmUgZGF0YXR5cGUKK2ludCBhZGRfdXNlcl9kYXRhdHlwZShjb25zdCB1bnNpZ25lZCBjaGFyICAqc2lwX2FvciwgY29uc3Qgc2l6ZV90IHNpcGFvcmxlbixzdHJ1Y3QgbXNnICptZXNzYWdlKQoreworCUNIRUNLX1BBUkFNUyhzaXBfYW9yICYmIHNpcGFvcmxlbiAmJiBtZXNzYWdlICk7CisJCisJc2l6ZV90IHF1ZXJ5bGVuLCBzaXBhb3JwdXJlbGVuOworCWNoYXIgKnF1ZXJ5LCAqc2lwYW9yX3B1cmU7CisJaW50IG5vdF9mb3VuZD0yOworCXVuaW9uIGF2cF92YWx1ZSB2YWx1ZTsKKwlzdHJ1Y3QgYXZwICphdnAsICpyb290YXZwOworCXVuc2lnbmVkIGxvbmcgKmxlbmd0aDsKKwkKKwkvL2Egc2lwIGFvciBtdXN0IGJlZ2luIGJ5ICJzaXA6IiBvciAic2lwczoiIHNvIGl0IG11c3QgYXQgbGVhc3QgYmUgbG9uZ2VyIHRoYW4gNCBjaGFycworCWlmKHNpcGFvcmxlbjw1KQorCQlyZXR1cm4gMjsKKwkKKwkvL05PVEU6IGVhY2ggbWV0aG9kIGhhcyB0byBwdXJpZnkgc2lwX2FvciBpdHNlbGYuIFlvdSBtdXN0IHJlbW92ZSBxdW90ZXMgb3Igc3BlY2lhbCBjaGFycyBmb3Igc2VjdXJpdHkKKwlzd2l0Y2goYXNfY29uZi0+ZGF0YXNvdXJjZSkKKwl7CisJCS8vTXlTUUwKKwkJY2FzZSBBU01ZU1FMOgorCQkJCisJCQlxdWVyeWxlbj1TUUxfR0VUU0lQREFUQV9MRU4gKyBzaXBhb3JsZW47CisJCQkKKwkJCQorCQkJLy9XZSBhbGxvY2F0ZSB0aGUgZG91YmxlIHNpemUgb2YgU0lQLVVSSSBiZWNhdXNlIGF0IHdvcnN0IGl0IGNhbiBiZSBhbGwgcXVvdGVzCisJCQlDSEVDS19NQUxMT0Moc2lwYW9yX3B1cmU9bWFsbG9jKHNpcGFvcmxlbioyKzEpKTsKKwkJCS8vV2UgcHVyaWZ5IFNJUC1VUkkgbm90IHRvIGhhdmUgZm9yYmlkZGVuIGNoYXJhY3RlcnMKKwkJCXNpcGFvcnB1cmVsZW49bXlzcWxfcmVhbF9lc2NhcGVfc3RyaW5nKGNvbm4sIHNpcGFvcl9wdXJlLCAoY29uc3QgY2hhciAqKXNpcF9hb3IsIHNpcGFvcmxlbik7CisJCQkKKwkJCQorCQkJcXVlcnkgPSBtYWxsb2MocXVlcnlsZW4rc2lwYW9ycHVyZWxlbisgMik7CisJCQlzbnByaW50ZihxdWVyeSwgcXVlcnlsZW4rMSwgU1FMX0dFVFNJUERBVEEsIHNpcGFvcl9wdXJlKTsKKwkJCQorCQkJTVlTUUxfUkVTICpyZXM7CisJCQlNWVNRTF9ST1cgcm93OworCQkJCisJCQkvL1dlIG1ha2UgdGhlIHF1ZXJ5CQorCQkJcmVxdWVzdF9teXNxbChxdWVyeSk7CisJCQlyZXM9bXlzcWxfdXNlX3Jlc3VsdChjb25uKTsKKwkJCWlmKHJlcz09TlVMTCkKKwkJCXsKKwkJCQkvL1dlIGNvdWxkbid0IG1ha2UgdGhlIHJlcXVlc3QKKwkJCQlyZXR1cm4gMjsKKwkJCX0KKwkJCW5vdF9mb3VuZD0xOworCQkJd2hpbGUgKChyb3cgPSBteXNxbF9mZXRjaF9yb3cocmVzKSkgIT0gTlVMTCkKKwkJCXsKKwkJCQlsZW5ndGg9bXlzcWxfZmV0Y2hfbGVuZ3RocyhyZXMpOworCQkJCQorCQkJCWlmKHN0cmxlbihyb3dbMF0pPjEpCisJCQkJeworCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3ICggc2lwX2RpY3QuU0lQX1VzZXJfRGF0YSwgMCwgJnJvb3RhdnAgKSApOworCQkJCQkKKwkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIHNpcF9kaWN0LlNJUF9Vc2VyX0RhdGFfVHlwZSwgMCwgJmF2cCApICk7CisJCQkJCUNIRUNLX01BTExPQyh2YWx1ZS5vcy5kYXRhPW1hbGxvYyhsZW5ndGhbMF0qc2l6ZW9mKHVuc2lnbmVkIGNoYXIpKSk7CisJCQkJCXN0cm5jcHkoKGNoYXIgKil2YWx1ZS5vcy5kYXRhLChjaGFyICopcm93WzBdLGxlbmd0aFswXSk7CisJCQkJCXZhbHVlLm9zLmxlbj0oc2l6ZV90KWxlbmd0aFswXTsKKwkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX3NldHZhbHVlICggYXZwLCAmdmFsdWUgKSApOworCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkICggcm9vdGF2cCwgTVNHX0JSV19MQVNUX0NISUxELCBhdnApICk7CisJCQkJCQorCQkJCQkKKwkJCQkJCisJCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBzaXBfZGljdC5TSVBfVXNlcl9EYXRhX0NvbnRlbnRzLCAwLCAmYXZwICkgKTsKKwkJCQkJQ0hFQ0tfTUFMTE9DKHZhbHVlLm9zLmRhdGE9bWFsbG9jKGxlbmd0aFsxXSpzaXplb2YodW5zaWduZWQgY2hhcikpKTsKKwkJCQkJbWVtY3B5KHZhbHVlLm9zLmRhdGEscm93WzFdLGxlbmd0aFsxXSk7CisJCQkJCXZhbHVlLm9zLmxlbj0oc2l6ZV90KWxlbmd0aFsxXTsKKwkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX3NldHZhbHVlICggYXZwLCAmdmFsdWUgKSApOworCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkICggcm9vdGF2cCwgTVNHX0JSV19MQVNUX0NISUxELCBhdnApICk7CisJCQkJCQorCQkJCQkvL1dlIGFkZCBTSVBfVXNlcl9EYXRhIHRvIG1lc3NhZ2UKKwkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCAoIG1lc3NhZ2UsIE1TR19CUldfTEFTVF9DSElMRCwgcm9vdGF2cCkgKTsKKwkJCQkJbm90X2ZvdW5kPTA7CisJCQkJfQorCQkJCQorCQkJfQorCQkJCisJCQlteXNxbF9mcmVlX3Jlc3VsdChyZXMpOworCQkJZnJlZShxdWVyeSk7CisJCQlmcmVlKHNpcGFvcl9wdXJlKTsKKwkJCWJyZWFrOworCQkJCisJCQlkZWZhdWx0OgorCQkJCQorCQkJCS8vV2UgbXVzdCBuZXZlciBnbyBoZXJlLCBpZiBzbywgd2UgbXVzdCBzdG9wIGRpYW1ldGVyX3NpcAorCQkJCVRSQUNFX0RFQlVHKElORk8sIkZBVEFMIEVSUk9SOiB0aGUgZGF0YXNvdXJjZSBpcyB1bmtub3duLCBwbGVhc2UgY2hlY2sgeW91ciBjb25maWcgZmlsZSEiKTsKKwkJCQlyZXR1cm4gMjsKKwkJCQkKKwkJCQlicmVhazsKKwl9CisJCisJLy8wIGlmIGl0IHdhcyBmb3VuZAorCXJldHVybiBub3RfZm91bmQ7CisJCisJCisJCit9CisKK2ludCBzZXRfcGVuZGluZ19mbGFnKGNvbnN0IHVuc2lnbmVkIGNoYXIgICp1c2VybmFtZSwgY29uc3Qgc2l6ZV90IHVzZXJuYW1lbGVuKQoreworCUNIRUNLX1BBUkFNUyh1c2VybmFtZSAmJiB1c2VybmFtZWxlbik7CisJCisJCisJc2l6ZV90IHF1ZXJ5bGVuLCB1c2VybmFtZXB1cmVsZW47CisJY2hhciAqcXVlcnksICp1c2VybmFtZV9wdXJlOworCQorCXN3aXRjaChhc19jb25mLT5kYXRhc291cmNlKQorCXsKKwkJLy9NeVNRTAorCQljYXNlIEFTTVlTUUw6CisJCQkvL1dlIGFsbG9jYXRlIHRoZSBkb3VibGUgc2l6ZSBvZiB1c2VybmFtZSBiZWNhdXNlIGF0IHdvcnN0IGl0IGNhbiBiZSBhbGwgcXVvdGVzCisJCQl1c2VybmFtZV9wdXJlPW1hbGxvYyh1c2VybmFtZWxlbioyKzEpOworCQkJLy9XZSBwdXJpZnkgdXNlcm5hbWUgbm90IHRvIGhhdmUgZm9yYmlkZGVuIGNoYXJhY3RlcnMKKwkJCXVzZXJuYW1lcHVyZWxlbj1teXNxbF9yZWFsX2VzY2FwZV9zdHJpbmcoY29ubiwgdXNlcm5hbWVfcHVyZSwgKGNvbnN0IGNoYXIgKil1c2VybmFtZSwgdXNlcm5hbWVsZW4pOworCQkJCisJCQkKKwkJCQorCQkJLy9XZSBjbGVhciB0aGUgZmxhZyAiYXV0aGVudGljYXRpb24gcGVuZGluZyIKKwkJCXF1ZXJ5bGVuPVNRTF9TRVRGTEFHX0xFTiArIHVzZXJuYW1lcHVyZWxlbjsKKwkJCXF1ZXJ5ID0gbWFsbG9jKHF1ZXJ5bGVuKzIpOworCQkJc25wcmludGYocXVlcnksIHF1ZXJ5bGVuKzEsIFNRTF9TRVRGTEFHLCB1c2VybmFtZV9wdXJlKTsKKwkJCQorCQkJaWYgKG15c3FsX3F1ZXJ5KGNvbm4sIHF1ZXJ5KSkgCisJCQl7CisJCQkJVFJBQ0VfREVCVUcoSU5GTywiUXVlcnkgJXMgZmFpbGVkIiwgcXVlcnkpOworCQkJCWZyZWUocXVlcnkpOworCQkJCXJldHVybiAyOworCQkJfQorCQkJCisJCQlmcmVlKHF1ZXJ5KTsKKwkJCWJyZWFrOworCX0JCisJcmV0dXJuIDA7Cit9CitpbnQgY2xlYXJfcGVuZGluZ19mbGFnKGNvbnN0IHVuc2lnbmVkIGNoYXIgICp1c2VybmFtZSwgY29uc3Qgc2l6ZV90IHVzZXJuYW1lbGVuKQoreworCUNIRUNLX1BBUkFNUyh1c2VybmFtZSAmJiB1c2VybmFtZWxlbik7CisJCisJCisJc2l6ZV90IHF1ZXJ5bGVuLCB1c2VybmFtZXB1cmVsZW47CisJY2hhciAqcXVlcnksICp1c2VybmFtZV9wdXJlOworCQorCXN3aXRjaChhc19jb25mLT5kYXRhc291cmNlKQorCXsKKwkJLy9NeVNRTAorCQljYXNlIEFTTVlTUUw6CisJCQkvL1dlIGFsbG9jYXRlIHRoZSBkb3VibGUgc2l6ZSBvZiB1c2VybmFtZSBiZWNhdXNlIGF0IHdvcnN0IGl0IGNhbiBiZSBhbGwgcXVvdGVzCisJCQl1c2VybmFtZV9wdXJlPW1hbGxvYyh1c2VybmFtZWxlbioyKzEpOworCQkJLy9XZSBwdXJpZnkgdXNlcm5hbWUgbm90IHRvIGhhdmUgZm9yYmlkZGVuIGNoYXJhY3RlcnMKKwkJCXVzZXJuYW1lcHVyZWxlbj1teXNxbF9yZWFsX2VzY2FwZV9zdHJpbmcoY29ubiwgdXNlcm5hbWVfcHVyZSwgKGNvbnN0IGNoYXIgKil1c2VybmFtZSwgdXNlcm5hbWVsZW4pOworCQkJCisJCQkKKwkJCQorCQkJLy9XZSBjbGVhciB0aGUgZmxhZyAiYXV0aGVudGljYXRpb24gcGVuZGluZyIKKwkJCXF1ZXJ5bGVuPVNRTF9DTEVBUkZMQUdfTEVOICsgdXNlcm5hbWVwdXJlbGVuOworCQkJcXVlcnkgPSBtYWxsb2MocXVlcnlsZW4rMik7CisJCQlzbnByaW50ZihxdWVyeSwgcXVlcnlsZW4rMSwgU1FMX0NMRUFSRkxBRywgdXNlcm5hbWVfcHVyZSk7CisJCQkKKwkJCWlmIChteXNxbF9xdWVyeShjb25uLCBxdWVyeSkpIAorCQkJeworCQkJCVRSQUNFX0RFQlVHKElORk8sIlF1ZXJ5ICVzIGZhaWxlZCIsIHF1ZXJ5KTsKKwkJCQlmcmVlKHF1ZXJ5KTsKKwkJCQlyZXR1cm4gMjsKKwkJCX0KKwkJCQorCQkJZnJlZShxdWVyeSk7CisJCWJyZWFrOworCX0JCisJcmV0dXJuIDA7Cit9CisKKworCitpbnQgc2V0X3NpcHNlcnZlcl91cmkoY29uc3QgdW5zaWduZWQgY2hhciAgKnVzZXJuYW1lLCBjb25zdCBzaXplX3QgdXNlcm5hbWVsZW4sIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNpcHNlcnZlcl91cmksY29uc3Qgc2l6ZV90IHNpcHNlcnZlcnVyaWxlbikKK3sKKwlDSEVDS19QQVJBTVModXNlcm5hbWUgJiYgdXNlcm5hbWVsZW4gJiYgc2lwc2VydmVyX3VyaSAmJiBzaXBzZXJ2ZXJ1cmlsZW4pOworCQorCQorCXNpemVfdCBxdWVyeWxlbiwgdXNlcm5hbWVwdXJlbGVuLCBzaXBzZXJ2ZXJ1cmlwdXJlbGVuOworCWNoYXIgKnF1ZXJ5LCAqdXNlcm5hbWVfcHVyZSwgKnNpcHNlcnZlcnVyaV9wdXJlOworCQorCXN3aXRjaChhc19jb25mLT5kYXRhc291cmNlKQorCXsKKwkJLy9NeVNRTAorCQljYXNlIEFTTVlTUUw6CisJCQkvL1dlIGFsbG9jYXRlIHRoZSBkb3VibGUgc2l6ZSBvZiB1c2VybmFtZSBiZWNhdXNlIGF0IHdvcnN0IGl0IGNhbiBiZSBhbGwgcXVvdGVzCisJCQl1c2VybmFtZV9wdXJlPW1hbGxvYyh1c2VybmFtZWxlbioyKzEpOworCQkJLy9XZSBwdXJpZnkgdXNlcm5hbWUgbm90IHRvIGhhdmUgZm9yYmlkZGVuIGNoYXJhY3RlcnMKKwkJCXVzZXJuYW1lcHVyZWxlbj1teXNxbF9yZWFsX2VzY2FwZV9zdHJpbmcoY29ubiwgdXNlcm5hbWVfcHVyZSwgKGNvbnN0IGNoYXIgKil1c2VybmFtZSwgdXNlcm5hbWVsZW4pOworCQkJCisJCQkvL1dlIGFsbG9jYXRlIHRoZSBkb3VibGUgc2l6ZSBvZiB1c2VybmFtZSBiZWNhdXNlIGF0IHdvcnN0IGl0IGNhbiBiZSBhbGwgcXVvdGVzCisJCQlzaXBzZXJ2ZXJ1cmlfcHVyZT1tYWxsb2Moc2lwc2VydmVydXJpbGVuKjIrMSk7CisJCQkvL1dlIHB1cmlmeSB1c2VybmFtZSBub3QgdG8gaGF2ZSBmb3JiaWRkZW4gY2hhcmFjdGVycworCQkJc2lwc2VydmVydXJpcHVyZWxlbj1teXNxbF9yZWFsX2VzY2FwZV9zdHJpbmcoY29ubiwgc2lwc2VydmVydXJpX3B1cmUsIChjb25zdCBjaGFyICopc2lwc2VydmVyX3VyaSwgc2lwc2VydmVydXJpbGVuKTsKKwkJCQorCQkJLy9XZSBjbGVhciB0aGUgZmxhZyAiYXV0aGVudGljYXRpb24gcGVuZGluZyIKKwkJCXF1ZXJ5bGVuPVNRTF9TRVRTSVBVUklfTEVOICsgdXNlcm5hbWVwdXJlbGVuICsgc2lwc2VydmVydXJpcHVyZWxlbjsKKwkJCXF1ZXJ5ID0gbWFsbG9jKHF1ZXJ5bGVuKzIpOworCQkJc25wcmludGYocXVlcnksIHF1ZXJ5bGVuKzEsIFNRTF9TRVRTSVBVUkksIHNpcHNlcnZlcnVyaV9wdXJlLHVzZXJuYW1lX3B1cmUpOworCQkJCisJCQlpZiAobXlzcWxfcXVlcnkoY29ubiwgcXVlcnkpKSAKKwkJCXsKKwkJCQlUUkFDRV9ERUJVRyhJTkZPLCJRdWVyeSAlcyBmYWlsZWQiLCBxdWVyeSk7CisJCQkJZnJlZShxdWVyeSk7CisJCQkJcmV0dXJuIDI7CisJCQl9CisJCQkKKwkJCWZyZWUocXVlcnkpOworCQkJYnJlYWs7CisJfQkKKwlyZXR1cm4gMDsKK30KK2ludCByZW1vdmVfc2lwc2VydmVyX3VyaShjb25zdCB1bnNpZ25lZCBjaGFyICpzaXBzZXJ2ZXJfdXJpLGNvbnN0IHNpemVfdCBzaXBzZXJ2ZXJ1cmlsZW4pCit7CisJQ0hFQ0tfUEFSQU1TKHNpcHNlcnZlcl91cmkgJiYgc2lwc2VydmVydXJpbGVuKTsKKwkKKworCXNpemVfdCBxdWVyeWxlbiwgc2lwc2VydmVydXJpcHVyZWxlbjsKKwljaGFyICpxdWVyeSwgKnNpcHNlcnZlcnVyaV9wdXJlOworCQorCXN3aXRjaChhc19jb25mLT5kYXRhc291cmNlKQorCXsKKwkJLy9NeVNRTAorCQljYXNlIEFTTVlTUUw6CisJCQkvL1dlIGFsbG9jYXRlIHRoZSBkb3VibGUgc2l6ZSBvZiB1c2VybmFtZSBiZWNhdXNlIGF0IHdvcnN0IGl0IGNhbiBiZSBhbGwgcXVvdGVzCisJCQlzaXBzZXJ2ZXJ1cmlfcHVyZT1tYWxsb2Moc2lwc2VydmVydXJpbGVuKjIrMSk7CisJCQkvL1dlIHB1cmlmeSB1c2VybmFtZSBub3QgdG8gaGF2ZSBmb3JiaWRkZW4gY2hhcmFjdGVycworCQkJc2lwc2VydmVydXJpcHVyZWxlbj1teXNxbF9yZWFsX2VzY2FwZV9zdHJpbmcoY29ubiwgc2lwc2VydmVydXJpX3B1cmUsIChjb25zdCBjaGFyICopc2lwc2VydmVyX3VyaSwgc2lwc2VydmVydXJpbGVuKTsKKwkJCQorCQkJLy9XZSBjbGVhciB0aGUgZmxhZyAiYXV0aGVudGljYXRpb24gcGVuZGluZyIKKwkJCXF1ZXJ5bGVuPVNRTF9STVNJUFVSSV9MRU4gKyBzaXBzZXJ2ZXJ1cmlwdXJlbGVuOworCQkJcXVlcnkgPSBtYWxsb2MocXVlcnlsZW4rMik7CisJCQlzbnByaW50ZihxdWVyeSwgcXVlcnlsZW4rMSwgU1FMX1JNU0lQVVJJLCBzaXBzZXJ2ZXJ1cmlfcHVyZSk7CisJCQkKKwkJCWlmIChteXNxbF9xdWVyeShjb25uLCBxdWVyeSkpIAorCQkJeworCQkJCVRSQUNFX0RFQlVHKElORk8sIlF1ZXJ5ICVzIGZhaWxlZCIsIHF1ZXJ5KTsKKwkJCQlmcmVlKHF1ZXJ5KTsKKwkJCQlyZXR1cm4gMjsKKwkJCX0KKwkJCQorCQkJZnJlZShxdWVyeSk7CisJCQlicmVhazsKKwl9CQorCXJldHVybiAwOworfQoraW50IHNldF9yZWFsX3NpcHNlcnZlcl91cmkoY29uc3QgdW5zaWduZWQgY2hhciAgKnVzZXJuYW1lLCBjb25zdCBzaXplX3QgdXNlcm5hbWVsZW4sIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNpcHNlcnZlcl91cmksY29uc3Qgc2l6ZV90IHNpcHNlcnZlcnVyaWxlbikKK3sKKwlDSEVDS19QQVJBTVModXNlcm5hbWUgJiYgdXNlcm5hbWVsZW4gJiYgc2lwc2VydmVyX3VyaSAmJiBzaXBzZXJ2ZXJ1cmlsZW4pOworCQorCQorCXNpemVfdCBxdWVyeWxlbiwgdXNlcm5hbWVwdXJlbGVuLCBzaXBzZXJ2ZXJ1cmlwdXJlbGVuOworCWNoYXIgKnF1ZXJ5LCAqdXNlcm5hbWVfcHVyZSwgKnNpcHNlcnZlcnVyaV9wdXJlOworCQorCXN3aXRjaChhc19jb25mLT5kYXRhc291cmNlKQorCXsKKwkJLy9NeVNRTAorCQljYXNlIEFTTVlTUUw6CisJCQkvL1dlIGFsbG9jYXRlIHRoZSBkb3VibGUgc2l6ZSBvZiB1c2VybmFtZSBiZWNhdXNlIGF0IHdvcnN0IGl0IGNhbiBiZSBhbGwgcXVvdGVzCisJCQl1c2VybmFtZV9wdXJlPW1hbGxvYyh1c2VybmFtZWxlbioyKzEpOworCQkJLy9XZSBwdXJpZnkgdXNlcm5hbWUgbm90IHRvIGhhdmUgZm9yYmlkZGVuIGNoYXJhY3RlcnMKKwkJCXVzZXJuYW1lcHVyZWxlbj1teXNxbF9yZWFsX2VzY2FwZV9zdHJpbmcoY29ubiwgdXNlcm5hbWVfcHVyZSwgKGNvbnN0IGNoYXIgKil1c2VybmFtZSwgdXNlcm5hbWVsZW4pOworCQkJCisJCQkvL1dlIGFsbG9jYXRlIHRoZSBkb3VibGUgc2l6ZSBvZiB1c2VybmFtZSBiZWNhdXNlIGF0IHdvcnN0IGl0IGNhbiBiZSBhbGwgcXVvdGVzCisJCQlzaXBzZXJ2ZXJ1cmlfcHVyZT1tYWxsb2Moc2lwc2VydmVydXJpbGVuKjIrMSk7CisJCQkvL1dlIHB1cmlmeSB1c2VybmFtZSBub3QgdG8gaGF2ZSBmb3JiaWRkZW4gY2hhcmFjdGVycworCQkJc2lwc2VydmVydXJpcHVyZWxlbj1teXNxbF9yZWFsX2VzY2FwZV9zdHJpbmcoY29ubiwgc2lwc2VydmVydXJpX3B1cmUsIChjb25zdCBjaGFyICopc2lwc2VydmVyX3VyaSwgc2lwc2VydmVydXJpbGVuKTsKKwkJCQorCQkJLy9XZSBjbGVhciB0aGUgZmxhZyAiYXV0aGVudGljYXRpb24gcGVuZGluZyIKKwkJCXF1ZXJ5bGVuPVNRTF9TRVRSRUFMU0lQVVJJX0xFTiArIHVzZXJuYW1lcHVyZWxlbiArIHNpcHNlcnZlcnVyaXB1cmVsZW47CisJCQlxdWVyeSA9IG1hbGxvYyhxdWVyeWxlbisyKTsKKwkJCXNucHJpbnRmKHF1ZXJ5LCBxdWVyeWxlbisxLCBTUUxfU0VUUkVBTFNJUFVSSSwgc2lwc2VydmVydXJpX3B1cmUsdXNlcm5hbWVfcHVyZSk7CisJCQkKKwkJCWlmIChteXNxbF9xdWVyeShjb25uLCBxdWVyeSkpIAorCQkJeworCQkJCVRSQUNFX0RFQlVHKElORk8sIlF1ZXJ5ICVzIGZhaWxlZCIsIHF1ZXJ5KTsKKwkJCQlmcmVlKHF1ZXJ5KTsKKwkJCQlyZXR1cm4gMjsKKwkJCX0KKwkJCQorCQkJZnJlZShxdWVyeSk7CisJCQlicmVhazsKKwl9CQorCXJldHVybiAwOworfQorCitpbnQgZ2V0X3NpcHNlcnZlcl91cmkoY29uc3QgdW5zaWduZWQgY2hhciAqc2lwX2FvciwgY29uc3Qgc2l6ZV90IHNpcGFvcmxlbiwgdW5zaWduZWQgY2hhciAqKiBzaXBzZXJ2ZXJfdXJpLCBzaXplX3QgKnNpcHNlcnZlcnVyaWxlbikKK3sKKwlDSEVDS19QQVJBTVMoc2lwX2FvciAmJiBzaXBhb3JsZW4gJiYgc2lwc2VydmVyX3VyaSAmJiBzaXBzZXJ2ZXJ1cmlsZW4gKTsKKwkKKwlzaXplX3QgcXVlcnlsZW4sIHNpcGFvcnB1cmVsZW47CisJY2hhciAqcXVlcnksICpzaXBhb3JfcHVyZTsKKwlpbnQgbm90X2ZvdW5kPTI7CisJCisJCisJCisJCisJLy9hIHNpcCBhb3IgbXVzdCBiZWdpbiBieSAic2lwOiIgb3IgInNpcHM6IiBzbyBpdCBtdXN0IGF0IGxlYXN0IGJlIGxvbmdlciB0aGFuIDQgY2hhcnMKKwlpZihzaXBhb3JsZW48NSkKKwkJcmV0dXJuIDI7CisJCisJLy9OT1RFOiBlYWNoIG1ldGhvZCBoYXMgdG8gcHVyaWZ5IHNpcF9hb3IgaXRzZWxmLiBZb3UgbXVzdCByZW1vdmUgcXVvdGVzIG9yIHNwZWNpYWwgY2hhcnMgZm9yIHNlY3VyaXR5CisJCisJc3dpdGNoKGFzX2NvbmYtPmRhdGFzb3VyY2UpCisJeworCQkvL015U1FMCisJCWNhc2UgQVNNWVNRTDoKKwkJCQorCQkJcXVlcnlsZW49U1FMX0dFVFNJUFNFUlVSSV9MRU4gKyBzaXBhb3JsZW47CisJCQkKKwkJCS8vV2UgYWxsb2NhdGUgdGhlIGRvdWJsZSBzaXplIG9mIFNJUC1VUkkgYmVjYXVzZSBhdCB3b3JzdCBpdCBjYW4gYmUgYWxsIHF1b3RlcworCQkJQ0hFQ0tfTUFMTE9DKHNpcGFvcl9wdXJlPW1hbGxvYyhzaXBhb3JsZW4qMisxKSk7CisJCQkvL1dlIHB1cmlmeSBTSVAtVVJJIG5vdCB0byBoYXZlIGZvcmJpZGRlbiBjaGFyYWN0ZXJzCisJCQlzaXBhb3JwdXJlbGVuPW15c3FsX3JlYWxfZXNjYXBlX3N0cmluZyhjb25uLCBzaXBhb3JfcHVyZSwgKGNvbnN0IGNoYXIgKilzaXBfYW9yLCBzaXBhb3JsZW4pOworCQkJCisJCQkKKwkJCXF1ZXJ5ID0gbWFsbG9jKHF1ZXJ5bGVuK3NpcGFvcnB1cmVsZW4rIDIpOworCQkJc25wcmludGYocXVlcnksIHF1ZXJ5bGVuKzEsIFNRTF9HRVRTSVBTRVJVUkksIHNpcGFvcl9wdXJlKTsKKwkJCQorCQkJTVlTUUxfUkVTICpyZXM7CisJCQlNWVNRTF9ST1cgcm93OworCQkJCisJCQkvL1dlIG1ha2UgdGhlIHF1ZXJ5CQorCQkJcmVxdWVzdF9teXNxbChxdWVyeSk7CisJCQlyZXM9bXlzcWxfdXNlX3Jlc3VsdChjb25uKTsKKwkJCWlmKHJlcz09TlVMTCkKKwkJCXsKKwkJCQkvL1dlIGNvdWxkbid0IG1ha2UgdGhlIHJlcXVlc3QKKwkJCQlzaXBzZXJ2ZXJfdXJpPU5VTEw7CisJCQkJcmV0dXJuIDI7CisJCQl9CisJCQkKKwkJCW5vdF9mb3VuZD0xOworCQkJd2hpbGUgKChyb3cgPSBteXNxbF9mZXRjaF9yb3cocmVzKSkgIT0gTlVMTCkKKwkJCXsKKwkJCQkqc2lwc2VydmVydXJpbGVuPXN0cmxlbihyb3dbMF0pOworCQkJCWlmKCpzaXBzZXJ2ZXJ1cmlsZW4+NCkKKwkJCQl7CisJCQkJCUNIRUNLX01BTExPQygqc2lwc2VydmVyX3VyaT1tYWxsb2MoKnNpcHNlcnZlcnVyaWxlbisxKSk7CisJCQkJCXN0cmNweSgoY2hhciAqKSpzaXBzZXJ2ZXJfdXJpLHJvd1swXSk7CisJCQkJCW5vdF9mb3VuZD0wOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlteXNxbF9mcmVlX3Jlc3VsdChyZXMpOworCQkJZnJlZShxdWVyeSk7CisJCQlmcmVlKHNpcGFvcl9wdXJlKTsKKwkJCWJyZWFrOworCQkJCisJCWRlZmF1bHQ6CisJCQkKKwkJCS8vV2UgbXVzdCBuZXZlciBnbyBoZXJlLCBpZiBzbywgd2UgbXVzdCBzdG9wIGRpYW1ldGVyX3NpcAorCQkJVFJBQ0VfREVCVUcoSU5GTywiRkFUQUwgRVJST1I6IHRoZSBkYXRhc291cmNlIGlzIHVua25vd24sIHBsZWFzZSBjaGVjayB5b3VyIGNvbmZpZyBmaWxlISIpOworCQkJc2lwc2VydmVyX3VyaT1OVUxMOworCQkJcmV0dXJuIDI7CisJCQkKKwkJCWJyZWFrOworCX0KKwkKKwkvLzAgaWYgaXQgd2FzIGZvdW5kCisJcmV0dXJuIG5vdF9mb3VuZDsKKwkKK30KKworCitpbnQgY291bnRfYXZwKHN0cnVjdCBtc2cgKiBtZXNzYWdlLCBpbnQgY29kZSwgaW50IHZlbmRvcikKK3sKKwlDSEVDS19QQVJBTVMobWVzc2FnZSk7CisJCisJc3RydWN0IGF2cF9oZHIgKnRlbXBoZHI7CisJc3RydWN0IGF2cCAqYXZwOworCWludCBjb3VudGVyPTA7CisJCisJQ0hFQ0tfRkNUKGZkX21zZ19icm93c2UgKG1lc3NhZ2UsIE1TR19CUldfV0FMSywgJmF2cCwgTlVMTCkpOworCQorCXdoaWxlKGF2cCE9TlVMTCkKKwl7CisJCQorCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfaGRyKCBhdnAsJnRlbXBoZHIgKSk7CisJCQorCQlpZih0ZW1waGRyLT5hdnBfY29kZT09Y29kZSAmJiB0ZW1waGRyLT5hdnBfdmVuZG9yPT12ZW5kb3IpCisJCXsKKwkJCWNvdW50ZXIrKzsKKwkJfQorCQkKKwkJQ0hFQ0tfRkNUKGZkX21zZ19icm93c2UgKGF2cCwgTVNHX0JSV19XQUxLLCAmYXZwLCBOVUxMKSk7CisJfQorCXJldHVybiBjb3VudGVyOworfQorLyogCit2b2lkIG5vbmNlX2FkZF9lbGVtZW50KGNoYXIgKiBub25jZSkKK3sKKwlub25jZWNoYWluICpuZXdlbHQ9bWFsbG9jKHNpemVvZihub25jZWNoYWluKSk7CisJCisJbmV3ZWx0LT5ub25jZT1ub25jZTsKKwkKKwluZXdlbHQtPnRpbWVzdGFtcD0oaW50KXRpbWUoTlVMTCk7CisJbmV3ZWx0LT5uZXh0PU5VTEw7CisJCisJaWYobGlzdG5vbmNlPT1OVUxMKQorCXsKKwkJbGlzdG5vbmNlPW5ld2VsdDsKKwl9CisJZWxzZQorCXsKKwkJbm9uY2VjaGFpbiogdGVtcD1saXN0bm9uY2U7CisJCQorCQl3aGlsZSh0ZW1wLT5uZXh0ICE9IE5VTEwpCisJCXsKKwkJCWlmKHRlbXAtPnRpbWVzdGFtcCA8ICgoaW50KXRpbWUoTlVMTCktMzAwKSkKKwkJCXsKKwkJCQlsaXN0bm9uY2U9dGVtcC0+bmV4dDsKKwkJCQlmcmVlKHRlbXApOworCQkJCXRlbXA9bGlzdG5vbmNlOworCQkJfQorCQkJdGVtcCA9IHRlbXAtPm5leHQ7CisJCX0KKwkJdGVtcC0+bmV4dCA9IG5ld2VsdDsKKwl9CisJCit9Cit2b2lkIG5vbmNlX2RlbF9lbGVtZW50KGNoYXIgKiBub25jZSkKK3sKKwlpZihsaXN0bm9uY2UhPU5VTEwpCisJeworCQlub25jZWNoYWluICp0ZW1wPWxpc3Rub25jZSwgKnRlbXBiZWZvcmU9TlVMTDsKKwkJCisJCWlmKGxpc3Rub25jZS0+bmV4dD09TlVMTCAmJiBzdHJjbXAobGlzdG5vbmNlLT5ub25jZSxub25jZSk9PTApCisJCXsKKwkJCWZyZWUobGlzdG5vbmNlKTsKKwkJCWxpc3Rub25jZT1OVUxMOworCQkJcmV0dXJuOworCQl9CisJCXdoaWxlKHRlbXAtPm5leHQgIT0gTlVMTCkKKwkJeworCQkJaWYoc3RyY21wKHRlbXAtPm5vbmNlLG5vbmNlKT09MCkKKwkJCXsKKwkJCQlpZih0ZW1wYmVmb3JlPT1OVUxMKQorCQkJCXsKKwkJCQkJbGlzdG5vbmNlPXRlbXAtPm5leHQ7CisJCQkJCWZyZWUodGVtcCk7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQkJdGVtcGJlZm9yZS0+bmV4dD10ZW1wLT5uZXh0OworCQkJCWZyZWUodGVtcCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQl0ZW1wYmVmb3JlPXRlbXA7CisJCQl0ZW1wID0gdGVtcC0+bmV4dDsKKwkJfQorCQkKKwl9CisJCit9CitpbnQgbm9uY2VfY2hlY2tfZWxlbWVudChjaGFyICogbm9uY2UpCit7CisJaWYobGlzdG5vbmNlPT1OVUxMKQorCXsKKwkJLy9Ob3QgZm91bmQKKwkJcmV0dXJuIDA7CisJfQorCWVsc2UKKwl7CisJCW5vbmNlY2hhaW4qIHRlbXA9bGlzdG5vbmNlOworCQkKKwkJd2hpbGUodGVtcC0+bmV4dCAhPSBOVUxMKQorCQl7CisJCQlpZihzdHJjbXAodGVtcC0+bm9uY2Usbm9uY2UpPT0wKQorCQkJCXJldHVybiAxOworCQkJZWxzZQorCQkJCXRlbXAgPSB0ZW1wLT5uZXh0OworCQl9CisJfQorCXJldHVybiAwOworfQorCit2b2lkIG5vbmNlX2RlbGV0ZWxpc3Rub25jZSgpCit7CisJaWYobGlzdG5vbmNlICE9TlVMTCkKKwl7CisJCW5vbmNlY2hhaW4qIHRlbXA9bGlzdG5vbmNlOworCQorCQl3aGlsZShsaXN0bm9uY2UtPm5leHQgIT0gTlVMTCkKKwkJeworCQkJdGVtcCA9IGxpc3Rub25jZS0+bmV4dDsKKwkJCisJCQlmcmVlKGxpc3Rub25jZSk7CisJCQorCQkJbGlzdG5vbmNlPXRlbXA7CisJCX0KKwkJZnJlZShsaXN0bm9uY2UpOworCX0KK30KKyovCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2FwcF9zaXAvbG9jYXRpb25pbmZvLmMgYi9leHRlbnNpb25zL2FwcF9zaXAvbG9jYXRpb25pbmZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJjMzcyYQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvYXBwX3NpcC9sb2NhdGlvbmluZm8uYwpAQCAtMCwwICsxLDIwOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IEFsZXhhbmRyZSBXZXN0ZmFobCA8YXdlc3RmYWhsQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDEwLCBBbGV4YW5kcmUgV2VzdGZhaGwsIFRlcmFva2EgTGFib3JhdG9yeSAoS2VpbyBVbml2ZXJzaXR5KSwgYW5kIHRoZSBXSURFIFByb2plY3QuIAkgKgkJCisqCQkJCQkJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFRlcmFva2EgTGFib3JhdG9yeSBub3IgdGhlIAkJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBUZXJhb2thIExhYm9yYXRvcnkgCQkJCQkJICoKKyogICAJCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJhcHBfc2lwLmgiCisKKworaW50IGFwcF9zaXBfTElSX2NiKCBzdHJ1Y3QgbXNnICoqIG1zZywgc3RydWN0IGF2cCAqIHBhcmFtYXZwLCBzdHJ1Y3Qgc2Vzc2lvbiAqIHNlc3MsIHZvaWQgKiBvcGFxdWUsIGVudW0gZGlzcF9hY3Rpb24gKiBhY3QpCit7CisJVFJBQ0VfRU5UUlkoIiVwICVwICVwICVwIiwgbXNnLCBwYXJhbWF2cCwgc2VzcywgYWN0KTsKKwkKKwlzdHJ1Y3QgbXNnICphbnMsICpxcnk7CisJc3RydWN0IGF2cCAqYXZwLCAqZ3JvdXBlZGF2cDsKKwlzdHJ1Y3QgYXZwX2hkciAqYXZwaGRyOworCXVuaW9uIGF2cF92YWx1ZSB2YWx1ZTsKKwlpbnQgcmV0PTA7CisJCisJLy9SZXN1bHRfQ29kZSB0byByZXR1cm4gaW4gdGhlIGFuc3dlcgorCWNoYXIgcmVzdWx0WzU1XTsKKwkKKwlpZiAobXNnID09IE5VTEwpCisJCXJldHVybiBFSU5WQUw7CisKKwkKKwkvLyBDcmVhdGUgYW5zd2VyIGhlYWRlciAKKwlxcnkgPSAqbXNnOworCUNIRUNLX0ZDVCggZmRfbXNnX25ld19hbnN3ZXJfZnJvbV9yZXEgKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIG1zZywgMCApICk7CisJYW5zID0gKm1zZzsKKwkKKwkvL0FkZCB0aGUgQXV0aC1BcHBsaWNhdGlvbi1JZCAKKwl7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBzaXBfZGljdC5BdXRoX0FwcGxpY2F0aW9uX0lkLCAwLCAmYXZwICkgKTsKKwkJdmFsdWUuaTMyID0gNjsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX3NldHZhbHVlICggYXZwLCAmdmFsdWUgKSApOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkICggYW5zLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCkgKTsKKwl9CisJLy8gQWRkIHRoZSBBdXRoLVNlc3Npb24tU3RhdGUgQVZQIAorCXsKKwkJCisJCUNIRUNLX0ZDVCggZmRfbXNnX3NlYXJjaF9hdnAgKCBxcnksIHNpcF9kaWN0LkF1dGhfU2Vzc2lvbl9TdGF0ZSwgJmF2cCkgKTsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2hkciggYXZwLCAmYXZwaGRyICkgICk7CisJCQorCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3ICggc2lwX2RpY3QuQXV0aF9TZXNzaW9uX1N0YXRlLCAwLCAmYXZwICkgKTsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX3NldHZhbHVlKCBhdnAsIGF2cGhkci0+YXZwX3ZhbHVlICkgKTsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCggYW5zLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCApICk7CisJfQorCQorCQorCS8vQWRkIGEgU0lQX1NlcnZlcl9VUkkKKwl7CisJCUNIRUNLX0ZDVCggZmRfbXNnX3NlYXJjaF9hdnAgKCBxcnksIHNpcF9kaWN0LlNJUF9BT1IsICZhdnApICk7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9oZHIoIGF2cCwgJmF2cGhkciApICApOworCQkKKwkJCisJCQorCQkKKwkJCisJCXJldD1leGlzdF91c2VybmFtZShhdnBoZHItPmF2cF92YWx1ZS0+b3MuZGF0YSwgYXZwaGRyLT5hdnBfdmFsdWUtPm9zLmxlbik7CisJCQorCQkKKwkJaWYocmV0PT0yKQorCQl7Ly9lcnJvcgorCQkJLyoKKwkJCUlmIHRoZSBEaWFtZXRlciBzZXJ2ZXIgY2Fubm90IHByb2Nlc3MgdGhlIERpYW1ldGVyIExJUiBjb21tYW5kLCBlLmcuLAorCQkJZHVlIHRvIGEgZGF0YWJhc2UgZXJyb3IsIHRoZSBEaWFtZXRlciBzZXJ2ZXIgTVVTVCBzZXQgdGhlIFJlc3VsdC1Db2RlCisJCQlBVlAgdmFsdWUgdG8gRElBTUVURVJfVU5BQkxFX1RPX0NPTVBMWSBhbmQgcmV0dXJuIGl0IGluIGEgRGlhbWV0ZXIKKwkJCUxJQSBtZXNzYWdlLgorCQkJKi8KKwkJCXN0cmNweShyZXN1bHQsIkRJQU1FVEVSX1VOQUJMRV9UT19DT01QTFkiKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWVsc2UgaWYocmV0PT0xKQorCQl7Ly9ub3QgZm91bmQKKwkJCS8qCisJCQlPbmUgb2YgdGhlIGVycm9ycyB0aGF0IHRoZSBEaWFtZXRlciBzZXJ2ZXIgbWF5IGZpbmQgaXMgdGhhdCB0aGUKKwkJCVNJUC1BT1IgQVZQIHZhbHVlIGlzIG5vdCBhIHZhbGlkIHVzZXIgaW4gdGhlIHJlYWxtLiAgSW4gc3VjaCBjYXNlcywKKwkJCXRoZSBEaWFtZXRlciBzZXJ2ZXIgTVVTVCBzZXQgdGhlIFJlc3VsdC1Db2RlIEFWUCB2YWx1ZSB0bworCQkJRElBTUVURVJfRVJST1JfVVNFUl9VTktOT1dOIGFuZCByZXR1cm4gaXQgaW4gYSBEaWFtZXRlciBMSUEgbWVzc2FnZS4KKwkJCQorCQkJKi8KKwkJCXN0cmNweShyZXN1bHQsIkRJQU1FVEVSX0VSUk9SX1VTRVJfVU5LTk9XTiIpOworCQkJZ290byBvdXQ7CisJCX0KKwkJCisJCS8vSWYgd2UgYXJyaXZlIGhlcmUsIHRoZSB1c2VyIGlzIGtub3duCisJCXNpemVfdCBzaXBzZXJ2ZXJ1cmlsZW47CisJCXVuc2lnbmVkIGNoYXIgKiBzaXBzZXJ2ZXJfdXJpPU5VTEw7CisJCQorCQlyZXQ9Z2V0X3NpcHNlcnZlcl91cmkoYXZwaGRyLT5hdnBfdmFsdWUtPm9zLmRhdGEsIGF2cGhkci0+YXZwX3ZhbHVlLT5vcy5sZW4sICZzaXBzZXJ2ZXJfdXJpLCAmc2lwc2VydmVydXJpbGVuKTsKKwkJCisJCQorCQlpZihyZXQ9PTApCisJCXsvL2ZvdW5kCisJCQlpZihzaXBzZXJ2ZXJfdXJpPT1OVUxMKQorCQkJeworCQkJCS8vVGhlcmUgaXMgYSBwcm9ibGVtIGJlY2F1c2Ugd2UgbXVzdCBnZXQgYSBEaWFtZXRlcl9VUkkgaGVyZQorCQkJCXN0cmNweShyZXN1bHQsIkRJQU1FVEVSX1VOQUJMRV9UT19DT01QTFkiKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3ICggc2lwX2RpY3QuU0lQX1NlcnZlcl9VUkksIDAsICZhdnAgKSApOworCQkJCXZhbHVlLm9zLmRhdGE9KHVuc2lnbmVkIGNoYXIgKilzaXBzZXJ2ZXJfdXJpOworCQkJCXZhbHVlLm9zLmxlbj1zaXBzZXJ2ZXJ1cmlsZW47CisJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX3NldHZhbHVlICggYXZwLCAmdmFsdWUgKSApOworCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQgKCBhbnMsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwKSApOworCQkJCQorCQkJCXN0cmNweShyZXN1bHQsIkRJQU1FVEVSX1NVQ0NFU1MiKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmKHJldD09MSkKKwkJey8vbm90IGZvdW5kCisJCQkvL1dlIGRvbid0IGtub3cgdGhpcyBTSVBfQU9SIGluIFNMLCB0aGF0IG1lYW5zIAorCQkJc3RyY3B5KHJlc3VsdCwiRElBTUVURVJfRVJST1JfVVNFUl9VTktOT1dOIik7CisJCQlnb3RvIG91dDsKKwkJfQorCQllbHNlCisJCXsvLyByZXR1cm5lZCAyLCBpbXBvc3NpYmxlIHRvIG1ha2UgcmVxdWVzdAorCQkJLy9XZSBjb3VsZG4ndCBtYWtlIHRoZSByZXF1ZXN0LCB3ZSBtdXN0IHN0b3AgcHJvY2VzcyEKKwkJCXN0cmNweShyZXN1bHQsIkRJQU1FVEVSX1VOQUJMRV9UT19DT01QTFkiKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCQorCQkvL0FkZGluZyBTSVAtU2VydmVyLUNhcGFiaWxpdGllcworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3ICggc2lwX2RpY3QuU0lQX1NlcnZlcl9DYXBhYmlsaXRpZXMsIDAsICZncm91cGVkYXZwICkgKTsKKwkJLy9XZSBhZGQgbWFuZGF0b3J5IGFuZCBvcHRpb25hbCBjYXBhYmlsaXRpZXMKKwkJcmV0PWdldF9zaXBzZXJ2ZXJfY2FwKGF2cGhkci0+YXZwX3ZhbHVlLT5vcy5kYXRhLCBhdnBoZHItPmF2cF92YWx1ZS0+b3MubGVuLCAmZ3JvdXBlZGF2cCk7CisJCQorCQkKKwkJaWYocmV0PT0wKQorCQl7Ly9mb3VuZAorCQlpZihzaXBzZXJ2ZXJfdXJpPT1OVUxMKQorCQl7CisJCQkvL1RoZXJlIGlzIGEgcHJvYmxlbSBiZWNhdXNlIHdlIG11c3QgZ2V0IGEgRGlhbWV0ZXJfVVJJIGhlcmUKKwkJCXN0cmNweShyZXN1bHQsIkRJQU1FVEVSX1VOQUJMRV9UT19DT01QTFkiKTsKKwkJCUNIRUNLX0ZDVCggZmRfbXNnX2ZyZWUoIGdyb3VwZWRhdnAgKSApOworCQkJZ290byBvdXQ7CisJCX0KKwkJZWxzZQorCQl7CisJCQkKKwkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQgKCBhbnMsIE1TR19CUldfTEFTVF9DSElMRCwgZ3JvdXBlZGF2cCkgKTsKKwkJCQorCQkJc3RyY3B5KHJlc3VsdCwiRElBTUVURVJfU1VDQ0VTUyIpOworCQl9CisJCX0KKwkJZWxzZSBpZihyZXQ9PTEpCisJCXsvL25vdCBmb3VuZAorCQkJLy9XZSBkb24ndCBrbm93IHRoaXMgU0lQX0FPUiBpbiBTTCwgdGhhdCBtZWFucyAKKwkJCXN0cmNweShyZXN1bHQsIkRJQU1FVEVSX0VSUk9SX0lERU5USVRZX05PVF9SRUdJU1RFUkVEIik7CisJCQlDSEVDS19GQ1QoIGZkX21zZ19mcmVlKCBncm91cGVkYXZwICkgKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWVsc2UKKwkJey8vIHJldHVybmVkIDIsIGltcG9zc2libGUgdG8gbWFrZSByZXF1ZXN0CisJCQkvL1dlIGNvdWxkbid0IG1ha2UgdGhlIHJlcXVlc3QsIHdlIG11c3Qgc3RvcCBwcm9jZXNzIQorCQkJc3RyY3B5KHJlc3VsdCwiRElBTUVURVJfVU5BQkxFX1RPX0NPTVBMWSIpOworCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfZnJlZSggZ3JvdXBlZGF2cCApICk7CisJCQlnb3RvIG91dDsKKwkJfQorCQkKKwkJCisJCQorCX0KKwkKKwkKKwkKKwkKK291dDoKKwlDSEVDS19GQ1QoIGZkX21zZ19yZXNjb2RlX3NldCggYW5zLCByZXN1bHQsIE5VTEwsIE5VTEwsIDEgKSApOworCQorCUNIRUNLX0ZDVCggZmRfbXNnX3NlbmQoIG1zZywgTlVMTCwgTlVMTCApKTsKKwkKKwkKKwkKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvYXBwX3NpcC9sb2NhdGlvbmluZm9zbC5jIGIvZXh0ZW5zaW9ucy9hcHBfc2lwL2xvY2F0aW9uaW5mb3NsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI4YmVlZgotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvYXBwX3NpcC9sb2NhdGlvbmluZm9zbC5jCkBAIC0wLDAgKzEsMTQ0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogQWxleGFuZHJlIFdlc3RmYWhsIDxhd2VzdGZhaGxAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTAsIEFsZXhhbmRyZSBXZXN0ZmFobCwgVGVyYW9rYSBMYWJvcmF0b3J5IChLZWlvIFVuaXZlcnNpdHkpLCBhbmQgdGhlIFdJREUgUHJvamVjdC4gCSAqCQkKKyoJCQkJCQkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVGVyYW9rYSBMYWJvcmF0b3J5IG5vciB0aGUgCQkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFRlcmFva2EgTGFib3JhdG9yeSAJCQkJCQkgKgorKiAgIAkJCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgImFwcF9zaXAuaCIKKworLy9UaGlzIGNhbGxiYWNrIGlzIHNwZWNpZmljIHRvIFNVU0NSSUJFUiBMT0NBVE9SLiBXZSBtdXN0IGxvb2sgZm9yIHRoZSAic2VydmluZyIgU0lQIHNlcnZlcgoraW50IGFwcF9zaXBfU0xfTElSX2NiKCBzdHJ1Y3QgbXNnICoqIG1zZywgc3RydWN0IGF2cCAqIHBhcmFtYXZwLCBzdHJ1Y3Qgc2Vzc2lvbiAqIHNlc3MsIHZvaWQgKiBvcGFxdWUsIGVudW0gZGlzcF9hY3Rpb24gKiBhY3QpCit7CisJVFJBQ0VfRU5UUlkoIiVwICVwICVwICVwIiwgbXNnLCBwYXJhbWF2cCwgc2VzcywgYWN0KTsKKwkKKwlzdHJ1Y3QgbXNnICphbnMsICpxcnk7CisJc3RydWN0IGF2cCAqYXZwOworCXN0cnVjdCBhdnBfaGRyICphdnBoZHI7CisJdW5pb24gYXZwX3ZhbHVlIHZhbHVlOworCQorCS8vUmVzdWx0X0NvZGUgdG8gcmV0dXJuIGluIHRoZSBhbnN3ZXIKKwljaGFyIHJlc3VsdFs1NV07CisJaW50IHJldD0wOworCQorCQorCWlmIChtc2cgPT0gTlVMTCkKKwkJcmV0dXJuIEVJTlZBTDsKKworCQorCQorCS8vIENyZWF0ZSBhbnN3ZXIgaGVhZGVyIAorCXFyeSA9ICptc2c7CisJQ0hFQ0tfRkNUKCBmZF9tc2dfbmV3X2Fuc3dlcl9mcm9tX3JlcSAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgbXNnLCAwICkgKTsKKwlhbnMgPSAqbXNnOworCQorCQorCS8vQWRkIHRoZSBBdXRoLUFwcGxpY2F0aW9uLUlkIAorCXsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIHNpcF9kaWN0LkF1dGhfQXBwbGljYXRpb25fSWQsIDAsICZhdnAgKSApOworCQl2YWx1ZS5pMzIgPSA2OworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUgKCBhdnAsICZ2YWx1ZSApICk7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQgKCBhbnMsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwKSApOworCX0KKwkKKwkvLyBBZGQgdGhlIEF1dGgtU2Vzc2lvbi1TdGF0ZSBBVlAgCisJeworCQkKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfc2VhcmNoX2F2cCAoIHFyeSwgc2lwX2RpY3QuQXV0aF9TZXNzaW9uX1N0YXRlLCAmYXZwKSApOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfaGRyKCBhdnAsICZhdnBoZHIgKSAgKTsKKwkJCisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBzaXBfZGljdC5BdXRoX1Nlc3Npb25fU3RhdGUsIDAsICZhdnAgKSApOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUoIGF2cCwgYXZwaGRyLT5hdnBfdmFsdWUgKSApOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkKCBhbnMsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwICkgKTsKKwl9CisJCisJCisJLy8gQWRkIHRoZSBSZWRpcmVjdCBIb3N0IEFWUCAKKwl7CisJCUNIRUNLX0ZDVCggZmRfbXNnX3NlYXJjaF9hdnAgKCBxcnksIHNpcF9kaWN0LlNJUF9BT1IsICZhdnApICk7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9oZHIoIGF2cCwgJmF2cGhkciApICApOworCQlzaXplX3QgZGlhbWV0ZXJ1cmlsZW47CisJCWNoYXIgKiBkaWFtZXRlcl91cmk9TlVMTDsKKwkJCisJCQorCQkKKwkJcmV0PWdldF9kaWFtZXRlcl91cmkoYXZwaGRyLT5hdnBfdmFsdWUtPm9zLmRhdGEsIGF2cGhkci0+YXZwX3ZhbHVlLT5vcy5sZW4sICZkaWFtZXRlcl91cmksICZkaWFtZXRlcnVyaWxlbik7CisJCQorCQkvL2ZvdW5kCisJCWlmKHJldD09MCkKKwkJeworCQkgIGlmKGRpYW1ldGVyX3VyaT09TlVMTCkKKwkJICB7CisJCQkgIC8vVGhlcmUgaXMgYSBwcm9ibGVtIGJlY2F1c2Ugd2UgbXVzdCBnZXQgYSBEaWFtZXRlcl9VUkkgaGVyZQorCQkJICBzdHJjcHkocmVzdWx0LCJESUFNRVRFUl9VTkFCTEVfVE9fQ09NUExZIik7CisJCQkgIGdvdG8gb3V0OworCQkgIH0KKwkJICBlbHNlCisJCSAgeworCQkgICAgQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIHNpcF9kaWN0LlJlZGlyZWN0X0hvc3QsIDAsICZhdnAgKSApOworCQkgICAgdmFsdWUub3MuZGF0YT0odW5zaWduZWQgY2hhciAqKWRpYW1ldGVyX3VyaTsKKwkJICAgIHZhbHVlLm9zLmxlbj1kaWFtZXRlcnVyaWxlbjsKKwkJICAgIENIRUNLX0ZDVCggZmRfbXNnX2F2cF9zZXR2YWx1ZSggYXZwLCAmdmFsdWUgKSApOworCQkgICAgQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCggYW5zLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCApICk7CisJCSAgICAKKwkJICAgIENIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBzaXBfZGljdC5SZWRpcmVjdF9Ib3N0X1VzYWdlLCAwLCAmYXZwICkgKTsKKwkJICAgIHZhbHVlLmkzMj1BTExfVVNFUjsgLy9BbGwgdGhlIHJlcXVlc3QgYWJvdXQgdGhlIHNhbWUgdXNlciBtdXN0IGJlIHNlbnQgdG8gdGhpcyBzZXJ2ZXIKKwkJICAgIENIRUNLX0ZDVCggZmRfbXNnX2F2cF9zZXR2YWx1ZSggYXZwLCAmdmFsdWUgKSApOworCQkgICAgQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCggYW5zLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCApICk7CisJCSAgICBzdHJjcHkocmVzdWx0LCJESUFNRVRFUl9TVUNDRVNTIik7CisJCSAgfQorCQl9CisJCWVsc2UgaWYocmV0PT0xKQorCQl7Ly9ub3QgZm91bmQKKwkJCS8vV2UgZG9uJ3Qga25vdyB0aGlzIFNJUF9BT1IgaW4gU0wKKwkJCXN0cmNweShyZXN1bHQsIkRJQU1FVEVSX0VSUk9SX1VTRVJfVU5LTk9XTiIpOworCQkJZ290byBvdXQ7CisJCX0KKwkJZWxzZQorCQl7Ly8gcmV0dXJuZWQgMiwgaW1wb3NzaWJsZSB0byBtYWtlIHJlcXVlc3QKKwkJCS8vV2UgY291bGRuJ3QgbWFrZSB0aGUgcmVxdWVzdCwgd2UgbXVzdCBzdG9wIHByb2Nlc3MhCisJCQlzdHJjcHkocmVzdWx0LCJESUFNRVRFUl9VTkFCTEVfVE9fQ09NUExZIik7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKwkKKwkKK291dDoKKwlDSEVDS19GQ1QoIGZkX21zZ19yZXNjb2RlX3NldCggYW5zLCByZXN1bHQsIE5VTEwsIE5VTEwsIDEgKSApOworCQorCQorCQorCUNIRUNLX0ZDVCggZmRfbXNnX3NlbmQoIG1zZywgTlVMTCwgTlVMTCApKTsKKwkKKwkKKwkKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvYXBwX3NpcC9tZDUuYyBiL2V4dGVuc2lvbnMvYXBwX3NpcC9tZDUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDc5YmRhCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9hcHBfc2lwL21kNS5jCkBAIC0wLDAgKzEsNDIxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogZnJlZURpYW1ldGVyIGF1dGhvciBub3RlOgorICogIFRoZSBjb250ZW50IGZyb20gdGhpcyBmaWxlIGNvbWVzIGRpcmVjdGx5IGZyb20gdGhlIGhvc3RhcCBwcm9qZWN0LgorICogSXQgaXMgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEJTRCBsaWNlbnNlLCBhcyBhbGxvd2VkCisgKiBieSB0aGUgb3JpZ2luYWwgY29weXJpZ2h0IHJlcHJvZHVjZWQgYmVsb3cuCisgKiAgSW4gYWRkaXRpb24gdG8gdGhpcyBub3RpY2UsIG9ubHkgdGhlICNpbmNsdWRlIGRpcmVjdGl2ZXMgaGF2ZSBiZWVuIG1vZGlmaWVkLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSJhcHBfc2lwLmgiCisgCisvKgorICogTUQ1IGhhc2ggaW1wbGVtZW50YXRpb24gYW5kIGludGVyZmFjZSBmdW5jdGlvbnMKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA1LCBKb3VuaSBNYWxpbmVuIDxqQHcxLmZpPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIEJTRAorICogbGljZW5zZS4KKyAqCisgKiBTZWUgUkVBRE1FIGFuZCBDT1BZSU5HIGZvciBtb3JlIGRldGFpbHMuCisgKi8KK3ZvaWQgQ3Z0SGV4KAorICAgIElOIEhBU0ggQmluLAorICAgIE9VVCBIQVNISEVYIEhleAorICAgICkKK3sKKyAgICB1bnNpZ25lZCBzaG9ydCBpOworICAgIHVuc2lnbmVkIGNoYXIgajsKKworICAgIGZvciAoaSA9IDA7IGkgPCBIQVNITEVOOyBpKyspIHsKKyAgICAgICAgaiA9IChCaW5baV0gPj4gNCkgJiAweGY7CisgICAgICAgIGlmIChqIDw9IDkpCisgICAgICAgICAgICBIZXhbaSoyXSA9IChqICsgJzAnKTsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEhleFtpKjJdID0gKGogKyAnYScgLSAxMCk7CisgICAgICAgIGogPSBCaW5baV0gJiAweGY7CisgICAgICAgIGlmIChqIDw9IDkpCisgICAgICAgICAgICBIZXhbaSoyKzFdID0gKGogKyAnMCcpOworICAgICAgICAgZWxzZQorICAgICAgICAgICAgSGV4W2kqMisxXSA9IChqICsgJ2EnIC0gMTApOworICAgIH0KKyAgICBIZXhbSEFTSEhFWExFTl0gPSAnXDAnOworfQorCisvLyBjYWxjdWxhdGUgSChBMSkgYXMgcGVyIHNwZWMgCit2b2lkIERpZ2VzdENhbGNIQTEoY2hhciAqIHBzekFsZyxjaGFyICogcHN6VXNlck5hbWUsY2hhciAqIHBzelJlYWxtLGNoYXIgKiBwc3pQYXNzd29yZCxjaGFyICogcHN6Tm9uY2UsY2hhciAqIHBzekNOb25jZSxIQVNISEVYIFNlc3Npb25LZXkpCit7CisgICAgICBNRDVfQ1RYIE1kNUN0eDsKKyAgICAgIEhBU0ggSEExOworCisgICAgICBNRDVJbml0KCZNZDVDdHgpOworICAgICAgTUQ1VXBkYXRlKCZNZDVDdHgsIChjb25zdCB1bnNpZ25lZCBjaGFyICopcHN6VXNlck5hbWUsIHN0cmxlbihwc3pVc2VyTmFtZSkpOworICAgICAgTUQ1VXBkYXRlKCZNZDVDdHgsIChjb25zdCB1bnNpZ25lZCBjaGFyICopIjoiLCAxKTsKKyAgICAgIE1ENVVwZGF0ZSgmTWQ1Q3R4LCAoY29uc3QgdW5zaWduZWQgY2hhciAqKXBzelJlYWxtLCBzdHJsZW4ocHN6UmVhbG0pKTsKKyAgICAgIE1ENVVwZGF0ZSgmTWQ1Q3R4LCAoY29uc3QgdW5zaWduZWQgY2hhciAqKSI6IiwgMSk7CisgICAgICBNRDVVcGRhdGUoJk1kNUN0eCwgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilwc3pQYXNzd29yZCwgc3RybGVuKHBzelBhc3N3b3JkKSk7CisgICAgICBNRDVGaW5hbCgodW5zaWduZWQgY2hhciAqKUhBMSwgJk1kNUN0eCk7CisgICAgICBpZiAoc3RyY21wKHBzekFsZywgIm1kNS1zZXNzIikgPT0gMCkgewkKKwkJTUQ1SW5pdCgmTWQ1Q3R4KTsKKwkJTUQ1VXBkYXRlKCZNZDVDdHgsIChjb25zdCB1bnNpZ25lZCBjaGFyICopSEExLCBIQVNITEVOKTsKKwkJTUQ1VXBkYXRlKCZNZDVDdHgsIChjb25zdCB1bnNpZ25lZCBjaGFyICopIjoiLCAxKTsKKwkJTUQ1VXBkYXRlKCZNZDVDdHgsIChjb25zdCB1bnNpZ25lZCBjaGFyICopcHN6Tm9uY2UsIHN0cmxlbihwc3pOb25jZSkpOworCQlNRDVVcGRhdGUoJk1kNUN0eCwgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikiOiIsIDEpOworCQlNRDVVcGRhdGUoJk1kNUN0eCwgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilwc3pDTm9uY2UsIHN0cmxlbihwc3pDTm9uY2UpKTsKKwkJTUQ1RmluYWwoKHVuc2lnbmVkIGNoYXIgKilIQTEsICZNZDVDdHgpOworICAgICAgfQorICAgICAgQ3Z0SGV4KEhBMSwgU2Vzc2lvbktleSk7Cit9CisKKy8vIGNhbGN1bGF0ZSByZXF1ZXN0LWRpZ2VzdCBhcyAgU0lQIERpZ2VzdCBzcGVjIFJGQzUwOTAKK3ZvaWQgRGlnZXN0Q2FsY1Jlc3BvbnNlKEhBU0hIRVggSEExLGNoYXIgKiBwc3pOb25jZSxjaGFyICogcHN6Tm9uY2VDb3VudCxjaGFyICogcHN6Q05vbmNlLGNoYXIgKiBwc3pRb3AsY2hhciAqIHBzek1ldGhvZCxjaGFyICogcHN6RGlnZXN0VXJpLEhBU0hIRVggSEVudGl0eSxIQVNISEVYIFJlc3BvbnNlKQoreworICAgICAgTUQ1X0NUWCBNZDVDdHg7CisgICAgICBIQVNIIEhBMjsKKyAgICAgIEhBU0ggUmVzcEhhc2g7CisgICAgICAgSEFTSEhFWCBIQTJIZXg7CisKKyAgICAgIC8vIGNhbGN1bGF0ZSBIKEEyKQorICAgICAgTUQ1SW5pdCgmTWQ1Q3R4KTsKKyAgICAgIE1ENVVwZGF0ZSgmTWQ1Q3R4LCAoY29uc3QgdW5zaWduZWQgY2hhciAqKXBzek1ldGhvZCwgc3RybGVuKHBzek1ldGhvZCkpOworICAgICAgTUQ1VXBkYXRlKCZNZDVDdHgsIChjb25zdCB1bnNpZ25lZCBjaGFyICopIjoiLCAxKTsKKyAgICAgIE1ENVVwZGF0ZSgmTWQ1Q3R4LCAoY29uc3QgdW5zaWduZWQgY2hhciAqKXBzekRpZ2VzdFVyaSwgc3RybGVuKHBzekRpZ2VzdFVyaSkpOworICAgICAgaWYgKHN0cmNtcChwc3pRb3AsICJhdXRoLWludCIpID09IDApIHsKKyAgICAgICAgICAgIE1ENVVwZGF0ZSgmTWQ1Q3R4LCAoY29uc3QgdW5zaWduZWQgY2hhciAqKSI6IiwgMSk7CisgICAgICAgICAgICBNRDVVcGRhdGUoJk1kNUN0eCwgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilIRW50aXR5LCBIQVNISEVYTEVOKTsKKyAgICAgIH0KKyAgICAgIE1ENUZpbmFsKCh1bnNpZ25lZCBjaGFyICopSEEyLCAmTWQ1Q3R4KTsKKyAgICAgICBDdnRIZXgoSEEyLCBIQTJIZXgpOworICAgICAgIAorICAgICAgLy8gY2FsY3VsYXRlIHJlc3BvbnNlCisgICAgICBNRDVJbml0KCZNZDVDdHgpOworICAgICAgTUQ1VXBkYXRlKCZNZDVDdHgsIChjb25zdCB1bnNpZ25lZCBjaGFyICopSEExLCBIQVNISEVYTEVOKTsKKyAgICAgIE1ENVVwZGF0ZSgmTWQ1Q3R4LCAoY29uc3QgdW5zaWduZWQgY2hhciAqKSI6IiwgMSk7CisgICAgICBNRDVVcGRhdGUoJk1kNUN0eCwoY29uc3QgdW5zaWduZWQgY2hhciAqKSBwc3pOb25jZSwgc3RybGVuKHBzek5vbmNlKSk7CisgICAgICBNRDVVcGRhdGUoJk1kNUN0eCwgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikiOiIsIDEpOworICAgICAgaWYgKCpwc3pRb3ApIHsKKyAgICAgICAgICBNRDVVcGRhdGUoJk1kNUN0eCwgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilwc3pOb25jZUNvdW50LCBzdHJsZW4ocHN6Tm9uY2VDb3VudCkpOworICAgICAgICAgIE1ENVVwZGF0ZSgmTWQ1Q3R4LCAoY29uc3QgdW5zaWduZWQgY2hhciAqKSI6IiwgMSk7CisgICAgICAgICAgTUQ1VXBkYXRlKCZNZDVDdHgsIChjb25zdCB1bnNpZ25lZCBjaGFyICopcHN6Q05vbmNlLCBzdHJsZW4ocHN6Q05vbmNlKSk7CisgICAgICAgICAgTUQ1VXBkYXRlKCZNZDVDdHgsIChjb25zdCB1bnNpZ25lZCBjaGFyICopIjoiLCAxKTsKKyAgICAgICAgICBNRDVVcGRhdGUoJk1kNUN0eCwgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilwc3pRb3AsIHN0cmxlbihwc3pRb3ApKTsKKyAgICAgICAgICBNRDVVcGRhdGUoJk1kNUN0eCwgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikiOiIsIDEpOworICAgICAgfQorICAgICAgTUQ1VXBkYXRlKCZNZDVDdHgsIChjb25zdCB1bnNpZ25lZCBjaGFyICopSEEySGV4LCBIQVNISEVYTEVOKTsKKyAgICAgIE1ENUZpbmFsKCh1bnNpZ25lZCBjaGFyICopUmVzcEhhc2gsICZNZDVDdHgpOworICAgICAgQ3Z0SGV4KFJlc3BIYXNoLCBSZXNwb25zZSk7Cit9CisvLyBjYWxjdWxhdGUgRGlnZXN0X3Jlc3BvbnNlX0F1dGggYXMgcGVyIFNJUCBEaWdlc3Qgc3BlYyBSRkM1MDkwCit2b2lkIERpZ2VzdENhbGNSZXNwb25zZUF1dGgoSEFTSEhFWCBIQTEsY2hhciAqIHBzek5vbmNlLGNoYXIgKiBwc3pOb25jZUNvdW50LGNoYXIgKiBwc3pDTm9uY2UsY2hhciAqIHBzelFvcCxjaGFyICogcHN6TWV0aG9kLGNoYXIgKiBwc3pEaWdlc3RVcmksSEFTSEhFWCBIRW50aXR5LEhBU0hIRVggUmVzcG9uc2UpCit7CisgICAgICBNRDVfQ1RYIE1kNUN0eDsKKyAgICAgIEhBU0ggSEEyOworICAgICAgSEFTSCBSZXNwSGFzaDsKKyAgICAgICBIQVNISEVYIEhBMkhleDsKKworICAgICAgLy8gY2FsY3VsYXRlIEgoQTIpCisgICAgICBNRDVJbml0KCZNZDVDdHgpOworICAgICAgTUQ1VXBkYXRlKCZNZDVDdHgsIChjb25zdCB1bnNpZ25lZCBjaGFyICopIjoiLCAxKTsKKyAgICAgIE1ENVVwZGF0ZSgmTWQ1Q3R4LCAoY29uc3QgdW5zaWduZWQgY2hhciAqKXBzekRpZ2VzdFVyaSwgc3RybGVuKHBzekRpZ2VzdFVyaSkpOworICAgICAgaWYgKHN0cmNtcChwc3pRb3AsICJhdXRoLWludCIpID09IDApIHsKKyAgICAgICAgICAgIE1ENVVwZGF0ZSgmTWQ1Q3R4LCAoY29uc3QgdW5zaWduZWQgY2hhciAqKSI6IiwgMSk7CisgICAgICAgICAgICBNRDVVcGRhdGUoJk1kNUN0eCwgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilIRW50aXR5LCBIQVNISEVYTEVOKTsKKyAgICAgIH0KKyAgICAgIE1ENUZpbmFsKCh1bnNpZ25lZCBjaGFyICopSEEyLCAmTWQ1Q3R4KTsKKyAgICAgICBDdnRIZXgoSEEyLCBIQTJIZXgpOworICAgICAgIAorICAgICAgLy8gY2FsY3VsYXRlIHJlc3BvbnNlCisgICAgICBNRDVJbml0KCZNZDVDdHgpOworICAgICAgTUQ1VXBkYXRlKCZNZDVDdHgsIChjb25zdCB1bnNpZ25lZCBjaGFyICopSEExLCBIQVNISEVYTEVOKTsKKyAgICAgIE1ENVVwZGF0ZSgmTWQ1Q3R4LCAoY29uc3QgdW5zaWduZWQgY2hhciAqKSI6IiwgMSk7CisgICAgICBNRDVVcGRhdGUoJk1kNUN0eCwgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilwc3pOb25jZSwgc3RybGVuKHBzek5vbmNlKSk7CisgICAgICBNRDVVcGRhdGUoJk1kNUN0eCwgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikiOiIsIDEpOworICAgICAgaWYgKCpwc3pRb3ApIHsKKyAgICAgICAgICBNRDVVcGRhdGUoJk1kNUN0eCwgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilwc3pOb25jZUNvdW50LCBzdHJsZW4ocHN6Tm9uY2VDb3VudCkpOworICAgICAgICAgIE1ENVVwZGF0ZSgmTWQ1Q3R4LCAoY29uc3QgdW5zaWduZWQgY2hhciAqKSI6IiwgMSk7CisgICAgICAgICAgTUQ1VXBkYXRlKCZNZDVDdHgsIChjb25zdCB1bnNpZ25lZCBjaGFyICopcHN6Q05vbmNlLCBzdHJsZW4ocHN6Q05vbmNlKSk7CisgICAgICAgICAgTUQ1VXBkYXRlKCZNZDVDdHgsIChjb25zdCB1bnNpZ25lZCBjaGFyICopIjoiLCAxKTsKKyAgICAgICAgICBNRDVVcGRhdGUoJk1kNUN0eCwgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilwc3pRb3AsIHN0cmxlbihwc3pRb3ApKTsKKyAgICAgICAgICBNRDVVcGRhdGUoJk1kNUN0eCwgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikiOiIsIDEpOworICAgICAgfQorICAgICAgTUQ1VXBkYXRlKCZNZDVDdHgsIChjb25zdCB1bnNpZ25lZCBjaGFyICopSEEySGV4LCBIQVNISEVYTEVOKTsKKyAgICAgIE1ENUZpbmFsKCh1bnNpZ25lZCBjaGFyICopUmVzcEhhc2gsICZNZDVDdHgpOworICAgICAgQ3Z0SGV4KFJlc3BIYXNoLCBSZXNwb25zZSk7Cit9CisKKworCisKKworc3RhdGljIHZvaWQgTUQ1VHJhbnNmb3JtKHUzMiBidWZbNF0sIHUzMiBjb25zdCBpblsxNl0pOworCisKKworCisvKioKKyAqIG1kNV92ZWN0b3IgLSBNRDUgaGFzaCBmb3IgZGF0YSB2ZWN0b3IKKyAqIEBudW1fZWxlbTogTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBkYXRhIHZlY3RvcgorICogQGFkZHI6IFBvaW50ZXJzIHRvIHRoZSBkYXRhIGFyZWFzCisgKiBAbGVuOiBMZW5ndGhzIG9mIHRoZSBkYXRhIGJsb2NrcworICogQG1hYzogQnVmZmVyIGZvciB0aGUgaGFzaAorICovCit2b2lkIG1kNV92ZWN0b3Ioc2l6ZV90IG51bV9lbGVtLCBjb25zdCB1OCAqYWRkcltdLCBjb25zdCBzaXplX3QgKmxlbiwgdTggKm1hYykKK3sKKwlNRDVfQ1RYIGN0eDsKKwlzaXplX3QgaTsKKworCU1ENUluaXQoJmN0eCk7CisJZm9yIChpID0gMDsgaSA8IG51bV9lbGVtOyBpKyspCisJCU1ENVVwZGF0ZSgmY3R4LCBhZGRyW2ldLCBsZW5baV0pOworCU1ENUZpbmFsKG1hYywgJmN0eCk7Cit9CisKKworLyogPT09PT0gc3RhcnQgLSBwdWJsaWMgZG9tYWluIE1ENSBpbXBsZW1lbnRhdGlvbiA9PT09PSAqLworLyoKKyAqIFRoaXMgY29kZSBpbXBsZW1lbnRzIHRoZSBNRDUgbWVzc2FnZS1kaWdlc3QgYWxnb3JpdGhtLgorICogVGhlIGFsZ29yaXRobSBpcyBkdWUgdG8gUm9uIFJpdmVzdC4gIFRoaXMgY29kZSB3YXMKKyAqIHdyaXR0ZW4gYnkgQ29saW4gUGx1bWIgaW4gMTk5Mywgbm8gY29weXJpZ2h0IGlzIGNsYWltZWQuCisgKiBUaGlzIGNvZGUgaXMgaW4gdGhlIHB1YmxpYyBkb21haW47IGRvIHdpdGggaXQgd2hhdCB5b3Ugd2lzaC4KKyAqCisgKiBFcXVpdmFsZW50IGNvZGUgaXMgYXZhaWxhYmxlIGZyb20gUlNBIERhdGEgU2VjdXJpdHksIEluYy4KKyAqIFRoaXMgY29kZSBoYXMgYmVlbiB0ZXN0ZWQgYWdhaW5zdCB0aGF0LCBhbmQgaXMgZXF1aXZhbGVudCwKKyAqIGV4Y2VwdCB0aGF0IHlvdSBkb24ndCBuZWVkIHRvIGluY2x1ZGUgdHdvIHBhZ2VzIG9mIGxlZ2FsZXNlCisgKiB3aXRoIGV2ZXJ5IGNvcHkuCisgKgorICogVG8gY29tcHV0ZSB0aGUgbWVzc2FnZSBkaWdlc3Qgb2YgYSBjaHVuayBvZiBieXRlcywgZGVjbGFyZSBhbgorICogTUQ1Q29udGV4dCBzdHJ1Y3R1cmUsIHBhc3MgaXQgdG8gTUQ1SW5pdCwgY2FsbCBNRDVVcGRhdGUgYXMKKyAqIG5lZWRlZCBvbiBidWZmZXJzIGZ1bGwgb2YgYnl0ZXMsIGFuZCB0aGVuIGNhbGwgTUQ1RmluYWwsIHdoaWNoCisgKiB3aWxsIGZpbGwgYSBzdXBwbGllZCAxNi1ieXRlIGFycmF5IHdpdGggdGhlIGRpZ2VzdC4KKyAqLworCisjaWZuZGVmIFdPUkRTX0JJR0VORElBTgorI2RlZmluZSBieXRlUmV2ZXJzZShidWYsIGxlbikJLyogTm90aGluZyAqLworI2Vsc2UKKy8qCisgKiBOb3RlOiB0aGlzIGNvZGUgaXMgaGFybWxlc3Mgb24gbGl0dGxlLWVuZGlhbiBtYWNoaW5lcy4KKyAqLworc3RhdGljIHZvaWQgYnl0ZVJldmVyc2UodW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBsb25ncykKK3sKKyAgICB1MzIgdDsKKyAgICBkbyB7CisJdCA9ICh1MzIpICgodW5zaWduZWQpIGJ1ZlszXSA8PCA4IHwgYnVmWzJdKSA8PCAxNiB8CisJICAgICgodW5zaWduZWQpIGJ1ZlsxXSA8PCA4IHwgYnVmWzBdKTsKKwkqKHUzMiAqKSBidWYgPSB0OworCWJ1ZiArPSA0OworICAgIH0gd2hpbGUgKC0tbG9uZ3MpOworfQorI2VuZGlmCisKKy8qCisgKiBTdGFydCBNRDUgYWNjdW11bGF0aW9uLiAgU2V0IGJpdCBjb3VudCB0byAwIGFuZCBidWZmZXIgdG8gbXlzdGVyaW91cworICogaW5pdGlhbGl6YXRpb24gY29uc3RhbnRzLgorICovCit2b2lkIE1ENUluaXQoc3RydWN0IE1ENUNvbnRleHQgKmN0eCkKK3sKKyAgICBjdHgtPmJ1ZlswXSA9IDB4Njc0NTIzMDE7CisgICAgY3R4LT5idWZbMV0gPSAweGVmY2RhYjg5OworICAgIGN0eC0+YnVmWzJdID0gMHg5OGJhZGNmZTsKKyAgICBjdHgtPmJ1ZlszXSA9IDB4MTAzMjU0NzY7CisKKyAgICBjdHgtPmJpdHNbMF0gPSAwOworICAgIGN0eC0+Yml0c1sxXSA9IDA7Cit9CisKKy8qCisgKiBVcGRhdGUgY29udGV4dCB0byByZWZsZWN0IHRoZSBjb25jYXRlbmF0aW9uIG9mIGFub3RoZXIgYnVmZmVyIGZ1bGwKKyAqIG9mIGJ5dGVzLgorICovCit2b2lkIE1ENVVwZGF0ZShzdHJ1Y3QgTUQ1Q29udGV4dCAqY3R4LCB1bnNpZ25lZCBjaGFyIGNvbnN0ICpidWYsIHVuc2lnbmVkIGxlbikKK3sKKyAgICB1MzIgdDsKKworICAgIC8qIFVwZGF0ZSBiaXRjb3VudCAqLworCisgICAgdCA9IGN0eC0+Yml0c1swXTsKKyAgICBpZiAoKGN0eC0+Yml0c1swXSA9IHQgKyAoKHUzMikgbGVuIDw8IDMpKSA8IHQpCisJY3R4LT5iaXRzWzFdKys7CQkvKiBDYXJyeSBmcm9tIGxvdyB0byBoaWdoICovCisgICAgY3R4LT5iaXRzWzFdICs9IGxlbiA+PiAyOTsKKworICAgIHQgPSAodCA+PiAzKSAmIDB4M2Y7CS8qIEJ5dGVzIGFscmVhZHkgaW4gc2hzSW5mby0+ZGF0YSAqLworCisgICAgLyogSGFuZGxlIGFueSBsZWFkaW5nIG9kZC1zaXplZCBjaHVua3MgKi8KKworICAgIGlmICh0KSB7CisJdW5zaWduZWQgY2hhciAqcCA9ICh1bnNpZ25lZCBjaGFyICopIGN0eC0+aW4gKyB0OworCisJdCA9IDY0IC0gdDsKKwlpZiAobGVuIDwgdCkgeworCSAgICBvc19tZW1jcHkocCwgYnVmLCBsZW4pOworCSAgICByZXR1cm47CisJfQorCW9zX21lbWNweShwLCBidWYsIHQpOworCWJ5dGVSZXZlcnNlKGN0eC0+aW4sIDE2KTsKKwlNRDVUcmFuc2Zvcm0oY3R4LT5idWYsICh1MzIgKikgY3R4LT5pbik7CisJYnVmICs9IHQ7CisJbGVuIC09IHQ7CisgICAgfQorICAgIC8qIFByb2Nlc3MgZGF0YSBpbiA2NC1ieXRlIGNodW5rcyAqLworCisgICAgd2hpbGUgKGxlbiA+PSA2NCkgeworCW9zX21lbWNweShjdHgtPmluLCBidWYsIDY0KTsKKwlieXRlUmV2ZXJzZShjdHgtPmluLCAxNik7CisJTUQ1VHJhbnNmb3JtKGN0eC0+YnVmLCAodTMyICopIGN0eC0+aW4pOworCWJ1ZiArPSA2NDsKKwlsZW4gLT0gNjQ7CisgICAgfQorCisgICAgLyogSGFuZGxlIGFueSByZW1haW5pbmcgYnl0ZXMgb2YgZGF0YS4gKi8KKworICAgIG9zX21lbWNweShjdHgtPmluLCBidWYsIGxlbik7Cit9CisKKy8qCisgKiBGaW5hbCB3cmFwdXAgLSBwYWQgdG8gNjQtYnl0ZSBib3VuZGFyeSB3aXRoIHRoZSBiaXQgcGF0dGVybgorICogMSAwKiAoNjQtYml0IGNvdW50IG9mIGJpdHMgcHJvY2Vzc2VkLCBNU0ItZmlyc3QpCisgKi8KK3ZvaWQgTUQ1RmluYWwodW5zaWduZWQgY2hhciBkaWdlc3RbMTZdLCBzdHJ1Y3QgTUQ1Q29udGV4dCAqY3R4KQoreworICAgIHVuc2lnbmVkIGNvdW50OworICAgIHVuc2lnbmVkIGNoYXIgKnA7CisKKyAgICAvKiBDb21wdXRlIG51bWJlciBvZiBieXRlcyBtb2QgNjQgKi8KKyAgICBjb3VudCA9IChjdHgtPmJpdHNbMF0gPj4gMykgJiAweDNGOworCisgICAgLyogU2V0IHRoZSBmaXJzdCBjaGFyIG9mIHBhZGRpbmcgdG8gMHg4MC4gIFRoaXMgaXMgc2FmZSBzaW5jZSB0aGVyZSBpcworICAgICAgIGFsd2F5cyBhdCBsZWFzdCBvbmUgYnl0ZSBmcmVlICovCisgICAgcCA9IGN0eC0+aW4gKyBjb3VudDsKKyAgICAqcCsrID0gMHg4MDsKKworICAgIC8qIEJ5dGVzIG9mIHBhZGRpbmcgbmVlZGVkIHRvIG1ha2UgNjQgYnl0ZXMgKi8KKyAgICBjb3VudCA9IDY0IC0gMSAtIGNvdW50OworCisgICAgLyogUGFkIG91dCB0byA1NiBtb2QgNjQgKi8KKyAgICBpZiAoY291bnQgPCA4KSB7CisJLyogVHdvIGxvdHMgb2YgcGFkZGluZzogIFBhZCB0aGUgZmlyc3QgYmxvY2sgdG8gNjQgYnl0ZXMgKi8KKwlvc19tZW1zZXQocCwgMCwgY291bnQpOworCWJ5dGVSZXZlcnNlKGN0eC0+aW4sIDE2KTsKKwlNRDVUcmFuc2Zvcm0oY3R4LT5idWYsICh1MzIgKikgY3R4LT5pbik7CisKKwkvKiBOb3cgZmlsbCB0aGUgbmV4dCBibG9jayB3aXRoIDU2IGJ5dGVzICovCisJb3NfbWVtc2V0KGN0eC0+aW4sIDAsIDU2KTsKKyAgICB9IGVsc2UgeworCS8qIFBhZCBibG9jayB0byA1NiBieXRlcyAqLworCW9zX21lbXNldChwLCAwLCBjb3VudCAtIDgpOworICAgIH0KKyAgICBieXRlUmV2ZXJzZShjdHgtPmluLCAxNCk7CisKKyAgICAvKiBBcHBlbmQgbGVuZ3RoIGluIGJpdHMgYW5kIHRyYW5zZm9ybSAqLworICAgICgodTMyICopIGN0eC0+aW4pWzE0XSA9IGN0eC0+Yml0c1swXTsKKyAgICAoKHUzMiAqKSBjdHgtPmluKVsxNV0gPSBjdHgtPmJpdHNbMV07CisKKyAgICBNRDVUcmFuc2Zvcm0oY3R4LT5idWYsICh1MzIgKikgY3R4LT5pbik7CisgICAgYnl0ZVJldmVyc2UoKHVuc2lnbmVkIGNoYXIgKikgY3R4LT5idWYsIDQpOworICAgIG9zX21lbWNweShkaWdlc3QsIGN0eC0+YnVmLCAxNik7CisgICAgb3NfbWVtc2V0KGN0eCwgMCwgc2l6ZW9mKCpjdHgpKTsJLyogSW4gY2FzZSBpdCdzIHNlbnNpdGl2ZSAqLworfQorCisvKiBUaGUgZm91ciBjb3JlIGZ1bmN0aW9ucyAtIEYxIGlzIG9wdGltaXplZCBzb21ld2hhdCAqLworCisvKiAjZGVmaW5lIEYxKHgsIHksIHopICh4ICYgeSB8IH54ICYgeikgKi8KKyNkZWZpbmUgRjEoeCwgeSwgeikgKHogXiAoeCAmICh5IF4geikpKQorI2RlZmluZSBGMih4LCB5LCB6KSBGMSh6LCB4LCB5KQorI2RlZmluZSBGMyh4LCB5LCB6KSAoeCBeIHkgXiB6KQorI2RlZmluZSBGNCh4LCB5LCB6KSAoeSBeICh4IHwgfnopKQorCisvKiBUaGlzIGlzIHRoZSBjZW50cmFsIHN0ZXAgaW4gdGhlIE1ENSBhbGdvcml0aG0uICovCisjZGVmaW5lIE1ENVNURVAoZiwgdywgeCwgeSwgeiwgZGF0YSwgcykgXAorCSggdyArPSBmKHgsIHksIHopICsgZGF0YSwgIHcgPSB3PDxzIHwgdz4+KDMyLXMpLCAgdyArPSB4ICkKKworLyoKKyAqIFRoZSBjb3JlIG9mIHRoZSBNRDUgYWxnb3JpdGhtLCB0aGlzIGFsdGVycyBhbiBleGlzdGluZyBNRDUgaGFzaCB0bworICogcmVmbGVjdCB0aGUgYWRkaXRpb24gb2YgMTYgbG9uZ3dvcmRzIG9mIG5ldyBkYXRhLiAgTUQ1VXBkYXRlIGJsb2NrcworICogdGhlIGRhdGEgYW5kIGNvbnZlcnRzIGJ5dGVzIGludG8gbG9uZ3dvcmRzIGZvciB0aGlzIHJvdXRpbmUuCisgKi8KK3N0YXRpYyB2b2lkIE1ENVRyYW5zZm9ybSh1MzIgYnVmWzRdLCB1MzIgY29uc3QgaW5bMTZdKQoreworICAgIHJlZ2lzdGVyIHUzMiBhLCBiLCBjLCBkOworCisgICAgYSA9IGJ1ZlswXTsKKyAgICBiID0gYnVmWzFdOworICAgIGMgPSBidWZbMl07CisgICAgZCA9IGJ1ZlszXTsKKworICAgIE1ENVNURVAoRjEsIGEsIGIsIGMsIGQsIGluWzBdICsgMHhkNzZhYTQ3OCwgNyk7CisgICAgTUQ1U1RFUChGMSwgZCwgYSwgYiwgYywgaW5bMV0gKyAweGU4YzdiNzU2LCAxMik7CisgICAgTUQ1U1RFUChGMSwgYywgZCwgYSwgYiwgaW5bMl0gKyAweDI0MjA3MGRiLCAxNyk7CisgICAgTUQ1U1RFUChGMSwgYiwgYywgZCwgYSwgaW5bM10gKyAweGMxYmRjZWVlLCAyMik7CisgICAgTUQ1U1RFUChGMSwgYSwgYiwgYywgZCwgaW5bNF0gKyAweGY1N2MwZmFmLCA3KTsKKyAgICBNRDVTVEVQKEYxLCBkLCBhLCBiLCBjLCBpbls1XSArIDB4NDc4N2M2MmEsIDEyKTsKKyAgICBNRDVTVEVQKEYxLCBjLCBkLCBhLCBiLCBpbls2XSArIDB4YTgzMDQ2MTMsIDE3KTsKKyAgICBNRDVTVEVQKEYxLCBiLCBjLCBkLCBhLCBpbls3XSArIDB4ZmQ0Njk1MDEsIDIyKTsKKyAgICBNRDVTVEVQKEYxLCBhLCBiLCBjLCBkLCBpbls4XSArIDB4Njk4MDk4ZDgsIDcpOworICAgIE1ENVNURVAoRjEsIGQsIGEsIGIsIGMsIGluWzldICsgMHg4YjQ0ZjdhZiwgMTIpOworICAgIE1ENVNURVAoRjEsIGMsIGQsIGEsIGIsIGluWzEwXSArIDB4ZmZmZjViYjEsIDE3KTsKKyAgICBNRDVTVEVQKEYxLCBiLCBjLCBkLCBhLCBpblsxMV0gKyAweDg5NWNkN2JlLCAyMik7CisgICAgTUQ1U1RFUChGMSwgYSwgYiwgYywgZCwgaW5bMTJdICsgMHg2YjkwMTEyMiwgNyk7CisgICAgTUQ1U1RFUChGMSwgZCwgYSwgYiwgYywgaW5bMTNdICsgMHhmZDk4NzE5MywgMTIpOworICAgIE1ENVNURVAoRjEsIGMsIGQsIGEsIGIsIGluWzE0XSArIDB4YTY3OTQzOGUsIDE3KTsKKyAgICBNRDVTVEVQKEYxLCBiLCBjLCBkLCBhLCBpblsxNV0gKyAweDQ5YjQwODIxLCAyMik7CisKKyAgICBNRDVTVEVQKEYyLCBhLCBiLCBjLCBkLCBpblsxXSArIDB4ZjYxZTI1NjIsIDUpOworICAgIE1ENVNURVAoRjIsIGQsIGEsIGIsIGMsIGluWzZdICsgMHhjMDQwYjM0MCwgOSk7CisgICAgTUQ1U1RFUChGMiwgYywgZCwgYSwgYiwgaW5bMTFdICsgMHgyNjVlNWE1MSwgMTQpOworICAgIE1ENVNURVAoRjIsIGIsIGMsIGQsIGEsIGluWzBdICsgMHhlOWI2YzdhYSwgMjApOworICAgIE1ENVNURVAoRjIsIGEsIGIsIGMsIGQsIGluWzVdICsgMHhkNjJmMTA1ZCwgNSk7CisgICAgTUQ1U1RFUChGMiwgZCwgYSwgYiwgYywgaW5bMTBdICsgMHgwMjQ0MTQ1MywgOSk7CisgICAgTUQ1U1RFUChGMiwgYywgZCwgYSwgYiwgaW5bMTVdICsgMHhkOGExZTY4MSwgMTQpOworICAgIE1ENVNURVAoRjIsIGIsIGMsIGQsIGEsIGluWzRdICsgMHhlN2QzZmJjOCwgMjApOworICAgIE1ENVNURVAoRjIsIGEsIGIsIGMsIGQsIGluWzldICsgMHgyMWUxY2RlNiwgNSk7CisgICAgTUQ1U1RFUChGMiwgZCwgYSwgYiwgYywgaW5bMTRdICsgMHhjMzM3MDdkNiwgOSk7CisgICAgTUQ1U1RFUChGMiwgYywgZCwgYSwgYiwgaW5bM10gKyAweGY0ZDUwZDg3LCAxNCk7CisgICAgTUQ1U1RFUChGMiwgYiwgYywgZCwgYSwgaW5bOF0gKyAweDQ1NWExNGVkLCAyMCk7CisgICAgTUQ1U1RFUChGMiwgYSwgYiwgYywgZCwgaW5bMTNdICsgMHhhOWUzZTkwNSwgNSk7CisgICAgTUQ1U1RFUChGMiwgZCwgYSwgYiwgYywgaW5bMl0gKyAweGZjZWZhM2Y4LCA5KTsKKyAgICBNRDVTVEVQKEYyLCBjLCBkLCBhLCBiLCBpbls3XSArIDB4Njc2ZjAyZDksIDE0KTsKKyAgICBNRDVTVEVQKEYyLCBiLCBjLCBkLCBhLCBpblsxMl0gKyAweDhkMmE0YzhhLCAyMCk7CisKKyAgICBNRDVTVEVQKEYzLCBhLCBiLCBjLCBkLCBpbls1XSArIDB4ZmZmYTM5NDIsIDQpOworICAgIE1ENVNURVAoRjMsIGQsIGEsIGIsIGMsIGluWzhdICsgMHg4NzcxZjY4MSwgMTEpOworICAgIE1ENVNURVAoRjMsIGMsIGQsIGEsIGIsIGluWzExXSArIDB4NmQ5ZDYxMjIsIDE2KTsKKyAgICBNRDVTVEVQKEYzLCBiLCBjLCBkLCBhLCBpblsxNF0gKyAweGZkZTUzODBjLCAyMyk7CisgICAgTUQ1U1RFUChGMywgYSwgYiwgYywgZCwgaW5bMV0gKyAweGE0YmVlYTQ0LCA0KTsKKyAgICBNRDVTVEVQKEYzLCBkLCBhLCBiLCBjLCBpbls0XSArIDB4NGJkZWNmYTksIDExKTsKKyAgICBNRDVTVEVQKEYzLCBjLCBkLCBhLCBiLCBpbls3XSArIDB4ZjZiYjRiNjAsIDE2KTsKKyAgICBNRDVTVEVQKEYzLCBiLCBjLCBkLCBhLCBpblsxMF0gKyAweGJlYmZiYzcwLCAyMyk7CisgICAgTUQ1U1RFUChGMywgYSwgYiwgYywgZCwgaW5bMTNdICsgMHgyODliN2VjNiwgNCk7CisgICAgTUQ1U1RFUChGMywgZCwgYSwgYiwgYywgaW5bMF0gKyAweGVhYTEyN2ZhLCAxMSk7CisgICAgTUQ1U1RFUChGMywgYywgZCwgYSwgYiwgaW5bM10gKyAweGQ0ZWYzMDg1LCAxNik7CisgICAgTUQ1U1RFUChGMywgYiwgYywgZCwgYSwgaW5bNl0gKyAweDA0ODgxZDA1LCAyMyk7CisgICAgTUQ1U1RFUChGMywgYSwgYiwgYywgZCwgaW5bOV0gKyAweGQ5ZDRkMDM5LCA0KTsKKyAgICBNRDVTVEVQKEYzLCBkLCBhLCBiLCBjLCBpblsxMl0gKyAweGU2ZGI5OWU1LCAxMSk7CisgICAgTUQ1U1RFUChGMywgYywgZCwgYSwgYiwgaW5bMTVdICsgMHgxZmEyN2NmOCwgMTYpOworICAgIE1ENVNURVAoRjMsIGIsIGMsIGQsIGEsIGluWzJdICsgMHhjNGFjNTY2NSwgMjMpOworCisgICAgTUQ1U1RFUChGNCwgYSwgYiwgYywgZCwgaW5bMF0gKyAweGY0MjkyMjQ0LCA2KTsKKyAgICBNRDVTVEVQKEY0LCBkLCBhLCBiLCBjLCBpbls3XSArIDB4NDMyYWZmOTcsIDEwKTsKKyAgICBNRDVTVEVQKEY0LCBjLCBkLCBhLCBiLCBpblsxNF0gKyAweGFiOTQyM2E3LCAxNSk7CisgICAgTUQ1U1RFUChGNCwgYiwgYywgZCwgYSwgaW5bNV0gKyAweGZjOTNhMDM5LCAyMSk7CisgICAgTUQ1U1RFUChGNCwgYSwgYiwgYywgZCwgaW5bMTJdICsgMHg2NTViNTljMywgNik7CisgICAgTUQ1U1RFUChGNCwgZCwgYSwgYiwgYywgaW5bM10gKyAweDhmMGNjYzkyLCAxMCk7CisgICAgTUQ1U1RFUChGNCwgYywgZCwgYSwgYiwgaW5bMTBdICsgMHhmZmVmZjQ3ZCwgMTUpOworICAgIE1ENVNURVAoRjQsIGIsIGMsIGQsIGEsIGluWzFdICsgMHg4NTg0NWRkMSwgMjEpOworICAgIE1ENVNURVAoRjQsIGEsIGIsIGMsIGQsIGluWzhdICsgMHg2ZmE4N2U0ZiwgNik7CisgICAgTUQ1U1RFUChGNCwgZCwgYSwgYiwgYywgaW5bMTVdICsgMHhmZTJjZTZlMCwgMTApOworICAgIE1ENVNURVAoRjQsIGMsIGQsIGEsIGIsIGluWzZdICsgMHhhMzAxNDMxNCwgMTUpOworICAgIE1ENVNURVAoRjQsIGIsIGMsIGQsIGEsIGluWzEzXSArIDB4NGUwODExYTEsIDIxKTsKKyAgICBNRDVTVEVQKEY0LCBhLCBiLCBjLCBkLCBpbls0XSArIDB4Zjc1MzdlODIsIDYpOworICAgIE1ENVNURVAoRjQsIGQsIGEsIGIsIGMsIGluWzExXSArIDB4YmQzYWYyMzUsIDEwKTsKKyAgICBNRDVTVEVQKEY0LCBjLCBkLCBhLCBiLCBpblsyXSArIDB4MmFkN2QyYmIsIDE1KTsKKyAgICBNRDVTVEVQKEY0LCBiLCBjLCBkLCBhLCBpbls5XSArIDB4ZWI4NmQzOTEsIDIxKTsKKworICAgIGJ1ZlswXSArPSBhOworICAgIGJ1ZlsxXSArPSBiOworICAgIGJ1ZlsyXSArPSBjOworICAgIGJ1ZlszXSArPSBkOworfQorLyogPT09PT0gZW5kIC0gcHVibGljIGRvbWFpbiBNRDUgaW1wbGVtZW50YXRpb24gPT09PT0gKi8KKwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9hcHBfc2lwL21kNS5oIGIvZXh0ZW5zaW9ucy9hcHBfc2lwL21kNS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNTU4NzIKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2FwcF9zaXAvbWQ1LmgKQEAgLTAsMCArMSw1OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGZyZWVEaWFtZXRlciBhdXRob3Igbm90ZToKKyAqICBUaGUgY29udGVudCBmcm9tIHRoaXMgZmlsZSBjb21lcyBkaXJlY3RseSBmcm9tIHRoZSBob3N0YXAgcHJvamVjdC4KKyAqIEl0IGlzIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBCU0QgbGljZW5zZSwgYXMgYWxsb3dlZAorICogYnkgdGhlIG9yaWdpbmFsIGNvcHlyaWdodCByZXByb2R1Y2VkIGJlbG93LgorICogIFRoZSBmaWxlIGhhcyBub3QgYmVlbiBtb2RpZmllZCwgZXhjZXB0IGZvciB0aGlzIG5vdGljZS4KKyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIE1ENSBoYXNoIGltcGxlbWVudGF0aW9uIGFuZCBpbnRlcmZhY2UgZnVuY3Rpb25zCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNSwgSm91bmkgTWFsaW5lbiA8akB3MS5maT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBCU0QKKyAqIGxpY2Vuc2UuCisgKgorICogU2VlIFJFQURNRSBhbmQgQ09QWUlORyBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgTUQ1X0gKKyNkZWZpbmUgTUQ1X0gKKworI2RlZmluZSBNRDVfTUFDX0xFTiAxNgorCit0eXBlZGVmIHVpbnQ2NF90IHU2NDsKK3R5cGVkZWYgdWludDMyX3QgdTMyOwordHlwZWRlZiB1aW50MTZfdCB1MTY7Cit0eXBlZGVmIHVpbnQ4X3QgdTg7Cit0eXBlZGVmIGludDY0X3QgczY0OwordHlwZWRlZiBpbnQzMl90IHMzMjsKK3R5cGVkZWYgaW50MTZfdCBzMTY7Cit0eXBlZGVmIGludDhfdCBzODsKKworI2RlZmluZSBIQVNITEVOIDE2Cit0eXBlZGVmIGNoYXIgSEFTSFtIQVNITEVOXTsKKyNkZWZpbmUgSEFTSEhFWExFTiAzMgordHlwZWRlZiBjaGFyIEhBU0hIRVhbSEFTSEhFWExFTisxXTsKKyNkZWZpbmUgSU4KKyNkZWZpbmUgT1VUCisKK3N0cnVjdCBNRDVDb250ZXh0IHsKKwl1MzIgYnVmWzRdOworCXUzMiBiaXRzWzJdOworCXU4IGluWzY0XTsKK307Cit0eXBlZGVmIHN0cnVjdCBNRDVDb250ZXh0IE1ENV9DVFg7CisjZGVmaW5lIG9zX21lbWNweShkLCBzLCBuKSBtZW1jcHkoKGQpLCAocyksIChuKSkKKyNkZWZpbmUgb3NfbWVtc2V0KHMsIGMsIG4pIG1lbXNldChzLCBjLCBuKQorCisKK3ZvaWQgTUQ1SW5pdChzdHJ1Y3QgTUQ1Q29udGV4dCAqY3R4KTsKK3ZvaWQgTUQ1VXBkYXRlKHN0cnVjdCBNRDVDb250ZXh0ICpjdHgsIHVuc2lnbmVkIGNoYXIgY29uc3QgKmJ1ZiwgdW5zaWduZWQgbGVuKTsKK3ZvaWQgTUQ1RmluYWwodW5zaWduZWQgY2hhciBkaWdlc3RbMTZdLCBzdHJ1Y3QgTUQ1Q29udGV4dCAqY3R4KTsKKworI2VuZGlmIC8qIE1ENV9IICovCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2FwcF9zaXAvbXVsdGltZWRpYWF1dGguYyBiL2V4dGVuc2lvbnMvYXBwX3NpcC9tdWx0aW1lZGlhYXV0aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYzFiY2IKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2FwcF9zaXAvbXVsdGltZWRpYWF1dGguYwpAQCAtMCwwICsxLDc2MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IEFsZXhhbmRyZSBXZXN0ZmFobCA8YXdlc3RmYWhsQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDEwLCBBbGV4YW5kcmUgV2VzdGZhaGwsIFRlcmFva2EgTGFib3JhdG9yeSAoS2VpbyBVbml2ZXJzaXR5KSwgYW5kIHRoZSBXSURFIFByb2plY3QuIAkgKgkJCisqCQkJCQkJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFRlcmFva2EgTGFib3JhdG9yeSBub3IgdGhlIAkJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBUZXJhb2thIExhYm9yYXRvcnkgCQkJCQkJICoKKyogICAJCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJhcHBfc2lwLmgiCisKK3N0cnVjdCBzZXNzX3N0YXRlCit7CisJY2hhciAqbm9uY2U7Cit9OworCisKK2ludCBhcHBfc2lwX01BUl9jYiggc3RydWN0IG1zZyAqKiBtc2csIHN0cnVjdCBhdnAgKiBwYXJhbWF2cCwgc3RydWN0IHNlc3Npb24gKiBzZXNzLCB2b2lkICogb3BhcXVlLCBlbnVtIGRpc3BfYWN0aW9uICogYWN0KQoreworCXN0cnVjdCBtc2cgKmFucywgKnFyeTsKKwlzdHJ1Y3QgYXZwICphdnAsICphMiwgKmF1dGhkYXRhaXRlbTsKKwkvL3N0cnVjdCBtc2dfaGRyICogaGVhZGVyID0gTlVMTDsKKwlzdHJ1Y3QgYXZwX2hkciAqIGF2cGhkcj1OVUxMLCAqYXZwaGVhZGVyPU5VTEwsICphdnBoZWFkZXJfYXV0aD1OVUxMLCpkaWdlc3RoZWFkZXI9TlVMTDsKKwl1bmlvbiBhdnBfdmFsdWUgdmFsOworCWludCBmb3VuZF9jbm9uY2U9MDsKKwlzdHJ1Y3QgYXZwICogdGVtcGF2cD1OVUxMLCpzaXBBdXRoZW50aWNhdGlvbj1OVUxMLCpzaXBBdXRoZW50aWNhdGU9TlVMTDsKKwljaGFyICogcmVzdWx0OworCWNoYXIgcGFzc3dvcmRbNTFdOworCWludCBpZHg9MCwgbnVtYmVyX29mX2F1dGhfaXRlbXM9MCxpPTAsIHJldD0wOworCS8vRmxhZ3MgYW5kIHZhcmlhYmxlcyBmb3IgRGF0YWJhc2UKKwlpbnQgc2lwdXJpbm90c3RvcmVkPTAsIGF1dGhlbnRpY2F0aW9ucGVuZGluZz0wOyAKKwlzaXplX3QgcXVlcnlsZW49MCwgdXNlcm5hbWVsZW49MDsKKwljaGFyICpxdWVyeT1OVUxMOworCXVuc2lnbmVkIGNoYXIgKnVzZXJuYW1lPU5VTEw7CisJCisJLy9UaGUgbm9uY2Ugd2Ugd2lsbCBzdG9yZSBhbmQgcmV0cmlldmUgaW4gc2Vzc2lvbgorCXN0cnVjdCBzZXNzX3N0YXRlICpzdG9yZWRub25jZT1OVUxMOworCQorCQorCVRSQUNFX0VOVFJZKCIlcCAlcCAlcCAlcCIsIG1zZywgcGFyYW1hdnAsIHNlc3MsIGFjdCk7CisJCisJaWYgKG1zZyA9PSBOVUxMKQorCQlyZXR1cm4gRUlOVkFMOworCisJCisJLyogQ3JlYXRlIGFuc3dlciBoZWFkZXIgKi8KKwlxcnkgPSAqbXNnOworCUNIRUNLX0ZDVCggZmRfbXNnX25ld19hbnN3ZXJfZnJvbV9yZXEgKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIG1zZywgMCApICk7CisJYW5zID0gKm1zZzsKKwkKKworCisJLyogQWRkIHRoZSBhcHByb3ByaWF0ZSBjb21tYW5kIGNvZGUgJiBBdXRoLUFwcGxpY2F0aW9uLUlkIAorCXsKKwkJCisJCUNIRUNLX0ZDVCggZmRfbXNnX2hkciAoICptc2csICZoZWFkZXIgKSApOworCQloZWFkZXItPm1zZ19mbGFncyA9IENNRF9GTEFHX1BST1hJQUJMRTsKKwkJaGVhZGVyLT5tc2dfY29kZSA9IDI4NjsKKwkJaGVhZGVyLT5tc2dfYXBwbCA9IDY7CisJCQorCQkKKwkJLy8gQWRkIHRoZSBBdXRoLUFwcGxpY2F0aW9uLUlkIAorCQl7CisJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3ICggc2lwX2RpY3QuQXV0aF9BcHBsaWNhdGlvbl9JZCwgMCwgJmF2cCApICk7CisJCQlBU1NFUlQoYXZwKTsKKwkJCXZhbC5pMzIgPSBoZWFkZXItPm1zZ19hcHBsOworCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX3NldHZhbHVlICggYXZwLCAmdmFsICkgKTsKKwkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQgKCBhbnMsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwKSApOworCQl9CisJfSovCisJCisJCisJLyogQWRkIHRoZSBBdXRoLVNlc3Npb24tU3RhdGUgQVZQICovCisJeworCQkKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfc2VhcmNoX2F2cCAoIHFyeSwgc2lwX2RpY3QuQXV0aF9TZXNzaW9uX1N0YXRlLCAmYXZwKSApOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfaGRyKCBhdnAsICZhdnBoZHIgKSAgKTsKKwkJCisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBzaXBfZGljdC5BdXRoX1Nlc3Npb25fU3RhdGUsIDAsICZhdnAgKSApOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUoIGF2cCwgYXZwaGRyLT5hdnBfdmFsdWUgKSApOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkKCBhbnMsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwICkgKTsKKwl9CisKKwkKKwkKKwkvKiBDaGVjayBpZiBtZXRob2QgaXMgUkVHSVNURVIgdGhlbiBVc2VyLU5hbWUgbXVzdCBiZSBwcmVzZW50ICovCisJeworCQkKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfc2VhcmNoX2F2cCAoIHFyeSwgc2lwX2RpY3QuU0lQX01ldGhvZCwgJmF2cCkgKTsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2hkciggYXZwLCAmYXZwaGVhZGVyICkpOworCQkKKworCQljaGFyICptZXRob2Q9TlVMTDsKKwkJCisJCUNIRUNLX0ZDVCggZmRfbXNnX3NlYXJjaF9hdnAgKCBxcnksIHNpcF9kaWN0LlVzZXJfTmFtZSwgJmF2cCkgKTsKKwkJaWYoYXZwIT1OVUxMKQorCQl7CisJCQkKKwkJCWludCBub3RfZm91bmQ9MTsKKwkJCU1ZU1FMX1JFUyAqcmVzPU5VTEw7CisJCQlNWVNRTF9ST1cgcm93OworCQkJCisJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfaGRyKCBhdnAsICZhdnBoZHIgKSAgKTsKKwkJCQorCQkJCisJCQkKKwkJCQorCQkJaWYoKHN0cm5jbXAoKGNvbnN0IGNoYXIgKilhdnBoZWFkZXItPmF2cF92YWx1ZS0+b3MuZGF0YSwiUkVHSVNURVIiLGF2cGhlYWRlci0+YXZwX3ZhbHVlLT5vcy5sZW4pPT0wKSkKKwkJCXsKKwkJCQlub3RfZm91bmQ9MTsKKwkJCQkKKwkJCQkvL1RPRE8gVE9ETyBUT0RPIFRPRE8gVE9ETyBUT0RPIFRPRE86IG1heWJlIGRvZXNuJ3Qgd29yayEhJworCQkJCXJldD1nZXRfcGFzc3dvcmQoYXZwaGRyLT5hdnBfdmFsdWUtPm9zLmRhdGEsIGF2cGhkci0+YXZwX3ZhbHVlLT5vcy5sZW4sIChjaGFyICopJnBhc3N3b3JkKTsKKwkJCQkKKwkJCQlpZihyZXQ+MSkKKwkJCQl7CisJCQkJCS8vV2UgY291bGRuJ3QgbWFrZSB0aGUgcmVxdWVzdAorCQkJCQlyZXN1bHQ9IkRJQU1FVEVSX1VOQUJMRV9UT19DT01QTFkiOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQkJbm90X2ZvdW5kPXJldDsKKwkJCQkKKwkJCQlpZihub3RfZm91bmQpCisJCQkJeworCQkJCQlUUkFDRV9ERUJVRyhGVUxMLCJUaGUgdXNlciAlcyBkb2Vzbid0IGV4aXN0ISIsdXNlcm5hbWUpOworCQkJCQlyZXN1bHQ9IkRJQU1FVEVSX0VSUk9SX1VTRVJfVU5LTk9XTiI7CisJCQkJCWZyZWUodXNlcm5hbWUpOwkKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJCisJCQkKKwkJCQkvL1dlIGFsbG9jYXRlIHRoZSBkb3VibGUgc2l6ZSBvZiB1c2VybmFtZSBiZWNhdXNlIGF0IHdvcnN0IGl0IGNhbiBiZSBhbGwgcXVvdGVzCisJCQkJdXNlcm5hbWU9bWFsbG9jKGF2cGhkci0+YXZwX3ZhbHVlLT5vcy5sZW4qMisxKTsKKwkJCQkvL1dlIHB1cmlmeSB1c2VybmFtZSBub3QgdG8gaGF2ZSBmb3JiaWRkZW4gY2hhcmFjdGVycworCQkJCXVzZXJuYW1lbGVuPW15c3FsX3JlYWxfZXNjYXBlX3N0cmluZyhjb25uLCAoY2hhciAqKXVzZXJuYW1lLCAoY29uc3QgY2hhciAqKWF2cGhkci0+YXZwX3ZhbHVlLT5vcy5kYXRhLCBhdnBoZHItPmF2cF92YWx1ZS0+b3MubGVuKTsKKwkJCQkKKwkJCQkvL05vdyB0aGF0IHdlIGtub3cgdGhlIHVzZXIgZXhpc3QsIHdlIGdldCB0aGUgbGlzdCBvZiBBT1Igb3duZWQgYnkgdGhpcyB1c2VyCisJCQkJcXVlcnlsZW49U1FMX0dFVFNJUEFPUl9MRU4gKyB1c2VybmFtZWxlbjsKKwkJCQlxdWVyeSA9IG1hbGxvYyhxdWVyeWxlbisyKTsKKwkJCQlzbnByaW50ZihxdWVyeSwgcXVlcnlsZW4rMSwgU1FMX0dFVFNJUEFPUiwgdXNlcm5hbWUpOworCQkJCisJCQkJLy9XZSBtYWtlIHRoZSBxdWVyeQorCQkJCXJlcXVlc3RfbXlzcWwocXVlcnkpOworCQkJCXJlcz1teXNxbF91c2VfcmVzdWx0KGNvbm4pOworCQkJCWlmKHJlcz09TlVMTCkKKwkJCQl7CisJCQkJCS8vV2UgY291bGRuJ3QgbWFrZSB0aGUgcmVxdWVzdAorCQkJCQlyZXN1bHQ9IkRJQU1FVEVSX1VOQUJMRV9UT19DT01QTFkiOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQkKKwkJCQkvL1dlIHJldHJpZXZlIHRoZSBTSVAtQU9SIGZyb20gQVZQIHRvIGNoZWNrIGlmIHRoZSB1c2VyIGNhbiB1cyBpdAorCQkJCUNIRUNLX0ZDVCggZmRfbXNnX3NlYXJjaF9hdnAgKCBxcnksIHNpcF9kaWN0LlNJUF9BT1IsICZhdnApICk7CisJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2hkciggYXZwLCAmYXZwaGRyICkgICk7CisJCQkKKwkJCQlub3RfZm91bmQ9MTsKKwkJCQl3aGlsZSAoKHJvdyA9IG15c3FsX2ZldGNoX3JvdyhyZXMpKSAhPSBOVUxMKQorCQkJCXsKKwkJCQkJaWYoc3RybmNtcCgoY29uc3QgY2hhciAqKWF2cGhkci0+YXZwX3ZhbHVlLT5vcy5kYXRhLHJvd1swXSxhdnBoZHItPmF2cF92YWx1ZS0+b3MubGVuKT09MCkKKwkJCQkJeworCQkJCQkJbm90X2ZvdW5kPTA7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCQlteXNxbF9mcmVlX3Jlc3VsdChyZXMpOworCQkJCWZyZWUocXVlcnkpOworICAgICAgCQkJCQorCQkJCWlmKG5vdF9mb3VuZCkKKwkJCQl7CisJCQkJCVRSQUNFX0RFQlVHKEZVTEwsIlRoZSB1c2VyICVzIGNhbid0IHVzZSB0aGlzIFNJUC1BT1IhIix1c2VybmFtZSk7CisJCQkJCXJlc3VsdD0iRElBTUVURVJfRVJST1JfSURFTlRJVElFU19ET05UX01BVENIIjsKKwkJCQkJZnJlZSh1c2VybmFtZSk7CQorCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQkJCisJCQl9CisKKwkJCUNIRUNLX0ZDVCggZmRfbXNnX3NlYXJjaF9hdnAgKCBxcnksIHNpcF9kaWN0LlNJUF9TZXJ2ZXJfVVJJLCAmYXZwKSApOworCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2hkciggYXZwLCAmYXZwaGRyICkpOworCQkJCisJCQlpZihhdnBoZHIhPU5VTEwpCisJCQl7CisJCQkJdW5zaWduZWQgY2hhciAqc2lwdXJpPU5VTEw7CisJCQkJaW50IHNpcHVyaWxlbj0wOworCisJCQkJLy9XZSBhbGxvY2F0ZSB0aGUgZG91YmxlIHNpemUgb2YgU0lQLVVSSSBiZWNhdXNlIGF0IHdvcnN0IGl0IGNhbiBiZSBhbGwgcXVvdGVzCisJCQkJQ0hFQ0tfTUFMTE9DKHNpcHVyaT1tYWxsb2MoYXZwaGRyLT5hdnBfdmFsdWUtPm9zLmxlbioyKzEpKTsKKwkJCQkvL1dlIHB1cmlmeSBTSVAtVVJJIG5vdCB0byBoYXZlIGZvcmJpZGRlbiBjaGFyYWN0ZXJzCisJCQkJc2lwdXJpbGVuPW15c3FsX3JlYWxfZXNjYXBlX3N0cmluZyhjb25uLCAoY2hhciAqKXNpcHVyaSwgKGNvbnN0IGNoYXIgKilhdnBoZHItPmF2cF92YWx1ZS0+b3MuZGF0YSwgYXZwaGRyLT5hdnBfdmFsdWUtPm9zLmxlbik7CisJCQkJCisJCQkJCisJCQkJLy9XZSBnZXQgdGhlIFNJUC1VUkkgYXNzaWduYXRlZCB0byB0aGUgdXNlcgorCQkJCXF1ZXJ5bGVuPVNRTF9HRVRTSVBVUklfTEVOICsgdXNlcm5hbWVsZW47CisJCQkJQ0hFQ0tfTUFMTE9DKHF1ZXJ5ID0gbWFsbG9jKHF1ZXJ5bGVuKzIpKTsKKwkJCQlzbnByaW50ZihxdWVyeSwgcXVlcnlsZW4rMSwgU1FMX0dFVFNJUFVSSSwgdXNlcm5hbWUpOworCisJCQkJLy9XZSBtYWtlIHRoZSBxdWVyeQorCQkJCXJlcXVlc3RfbXlzcWwocXVlcnkpOworCQkJCXJlcz1teXNxbF91c2VfcmVzdWx0KGNvbm4pOworCQkJCWlmKHJlcz09TlVMTCkKKwkJCQl7CisJCQkJCS8vV2UgY291bGRuJ3QgbWFrZSB0aGUgcmVxdWVzdAorCQkJCQlyZXN1bHQ9IkRJQU1FVEVSX1VOQUJMRV9UT19DT01QTFkiOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQkJbm90X2ZvdW5kPTE7CisJCQkJd2hpbGUgKChyb3cgPSBteXNxbF9mZXRjaF9yb3cocmVzKSkgIT0gTlVMTCkKKwkJCQl7CisJCQkJCWlmKHN0cm5jbXAoKGNvbnN0IGNoYXIgKilhdnBoZHItPmF2cF92YWx1ZS0+b3MuZGF0YSxyb3dbMF0sYXZwaGRyLT5hdnBfdmFsdWUtPm9zLmxlbik9PTApCisJCQkJCXsKKwkJCQkJCW5vdF9mb3VuZD0wOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQkJbXlzcWxfZnJlZV9yZXN1bHQocmVzKTsKKwkJCQlmcmVlKHF1ZXJ5KTsKKworCQkJCWlmKG5vdF9mb3VuZCkKKwkJCQl7CisJCQkJCS8vVGVtcG9yYXJ5CisJCQkJCXNldF9zaXBzZXJ2ZXJfdXJpKHVzZXJuYW1lLCB1c2VybmFtZWxlbiwgc2lwdXJpLHNpcHVyaWxlbik7CisJCQkJCQorCQkJCQkKKwkJCQkJc2V0X3BlbmRpbmdfZmxhZyh1c2VybmFtZSwgdXNlcm5hbWVsZW4pOworCQkJCQkKKwkJCQkJCisJCQkJCWF1dGhlbnRpY2F0aW9ucGVuZGluZz0xOworCQkJCX0KKwkJCQlmcmVlKHNpcHVyaSk7CisJCQkJCisJCQl9CisJCQllbHNlCisJCQkJc2lwdXJpbm90c3RvcmVkPTE7CisKKwkJfQorCQllbHNlCisJCXsKKwkJCXJlc3VsdD0iRElBTUVURVJfVVNFUl9OQU1FX1JFUVVJUkVEIjsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJCQorCQlmcmVlKG1ldGhvZCk7CisKKwl9CisKKwkKKwkvL1RPRE86IHJlbW92ZSBsb29wIGZvciBhdXRoZGF0YWl0ZW0gYmVjYXVzZSBSRkMgc2F5IG9ubHkgb25lICh3YWl0IGZvciBhbnN3ZXIgZnJvbSBHYXJjaWEpCisJLy8gSG93IG1hbnkgQXV0aCBEYXRhIEl0ZW1zPworCUNIRUNLX0ZDVCggZmRfbXNnX3NlYXJjaF9hdnAgKCBxcnksIHNpcF9kaWN0LlNJUF9OdW1iZXJfQXV0aF9JdGVtcywgJmF2cCkgKTsKKwlDSEVDS19GQ1QoIGZkX21zZ19hdnBfaGRyKCBhdnAsICZhdnBoZWFkZXIgKSAgKTsKKwkKKwkKKwlpZihhdnAhPU5VTEwpCisJeworCQlDSEVDS19GQ1QoZmRfbXNnX3NlYXJjaF9hdnAgKCBxcnksIHNpcF9kaWN0LlNJUF9BdXRoX0RhdGFfSXRlbSwgJmF2cCkpOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfaGRyKCBhdnAsICZhdnBoZHIgKSAgKTsKKwkJCisJCWlmKGF2cCE9TlVMTCkKKwkJeworCQkJLy9GaXJzdCBpcyBBdXRoZW50aWNhdGlvbiBTY2hlbWUKKwkJCUNIRUNLX0ZDVChmZF9tc2dfYnJvd3NlICggYXZwLCBNU0dfQlJXX0ZJUlNUX0NISUxELCAmYXZwLCBOVUxMKSApOworCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2hkciggYXZwLCAmYXZwaGRyICkgICk7CisJCQkKKwkJCS8vRGlnZXN0LUF1dGhlbnRpY2F0aW9uPworCQkJaWYoYXZwaGRyLT5hdnBfdmFsdWUtPmkzMj09MCkKKwkJCXsKKwkJCQkKKwkJCQlmb3IoaWR4PTA7aWR4PGF2cGhlYWRlci0+YXZwX3ZhbHVlLT5pMzI7aWR4KyspCisJCQkJeworCQkJCQkvL1dlIGxvb2sgZm9yIFNJUCBBdXRoIGl0ZW1zCisJCQkJCUNIRUNLX0ZDVChmZF9tc2dfYnJvd3NlICggYXZwLCBNU0dfQlJXX1dBTEssICZhdnAsIE5VTEwpICk7CisJCQkJCQorCQkJCQlpZihhdnAhPU5VTEwpCisJCQkJCXsKKwkJCQkJCQorCQkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2hkciggYXZwLCZhdnBoZHIgKSk7CisJCQorCQkJCQkJaWYoYXZwaGRyLT5hdnBfY29kZT09MzgwKSAvL1dlIG9ubHkgY3JlYXRlIEF1dGgtRGF0YS1JdGVtIHRvIGFuc3dlciBBdXRoLURhdGEtSXRlbQorCQkJCQkJeworCQkJCQkJCS8qIEFkZCB0aGUgQXV0aC1EYXRhLUl0ZW0gQVZQICovCisJCQkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIHNpcF9kaWN0LlNJUF9BdXRoX0RhdGFfSXRlbSwgMCwgJmF1dGhkYXRhaXRlbSApICk7CisJCQkJCQorCQkJCQkJCS8qIEFkZCB0aGUgQXV0aGVudGljYXRpb24gU2NoZW1lIEFWUCAqLworCQkJCQkJCXsKKwkJCQkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIHNpcF9kaWN0LlNJUF9BdXRoZW50aWNhdGlvbl9TY2hlbWUsIDAsICZhMiApICk7CisJCQkJCQkJCXZhbC5pMzI9MDsgLy9XZSBvbmx5IGtub3cgRGlnZXN0IEF1dGhlbnRpY2F0aW9uCisJCQkJCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9zZXR2YWx1ZSggYTIsICZ2YWwgKSApOworCQkJCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkKCBhdXRoZGF0YWl0ZW0sIE1TR19CUldfTEFTVF9DSElMRCwgYTIgKSApOworCQkJCQkJCX0KKwkJCQkJCQkKKwkJCQkJCQkvL1dlIG5lZWQgdG8ga25vdyBpZiB0aGVyZSBpcyBhIENub25jZSBhdHRyaWJ1dGUgKG9ubHkgaW4gdGhlIHNlY29uZCBNQVIgcmVxdWVzdCkKKwkJCQkJCQkKKwkJCQkJCQkvL0NIRUNLX0ZDVChmZF9tc2dfYnJvd3NlICggYXZwLCBNU0dfQlJXX1dBTEssICZhdnAsIE5VTEwpICk7CisJCQkJCQkJCisJCQkJCQkJCisJCQkJCQkJQ0hFQ0tfRkNUKGZkX2F2cF9zZWFyY2hfYXZwIChhdnAsIHNpcF9kaWN0LkRpZ2VzdF9DTm9uY2UsICZhMiApKTsKKwkJCQkJCQkKKwkJCQkJCQlpZihhMiE9TlVMTCkKKwkJCQkJCQkJZm91bmRfY25vbmNlPTE7CisJCQkJCQkJZWxzZQorCQkJCQkJCQlmb3VuZF9jbm9uY2U9MDsKKwkJCQkJCQkJCisJCQkJCQkJaWYoIWZvdW5kX2Nub25jZSkKKwkJCQkJCQl7CisJCQkJCQkJCS8qCisJCQkJCQkJCVdlIGFyZSBpbiB0aGUgY2FzZSBvZiBmaXJzdCBhY2Nlc3MgcmVxdWVzdCBzbyB3ZSBuZWVkIHRvIGNoYWxsZW5nZSB0aGUgdXNlci4KKwkJCQkJCQkJKi8KKwkJCQkJCQkJVFJBQ0VfREVCVUcoRlVMTCwiRmlyc3QgQXV0aG9yaXphdGlvbiBpbiBwcm9ncmVzcy4uLiIpOworCisJCQkJCQkJCS8qIENyZWF0ZSBhIG5ldyBzZXNzaW9uICovIC8vdGhpcyBjcmVhdGUgYSBuZXcgc2Vzc2lvbiBJZCAhISEKKwkJCQkJCQkJLy9DSEVDS19GQ1RfRE8oIGZkX3Nlc3NfbmV3KCAmc2VzcywgZmRfZ19jb25maWctPmNuZl9kaWFtaWQsICJkaWFtc2lwIiwgNyksIGdvdG8gb3V0ICk7CisJCQkJCQkJCQorCisJCQkJCQkJCS8qIENyZWF0ZSB0aGUgU0lQLUF1dGhlbnRpY2F0ZSBBVlAgKi8KKwkJCQkJCQkJeworCQkJCQkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIHNpcF9kaWN0LlNJUF9BdXRoZW50aWNhdGUsIDAsICZzaXBBdXRoZW50aWNhdGUgKSApOworCQkJCQkJCQl9CQkJCQkJCisKKwkJCQkJCQkJLyogQWRkIHRoZSBEaWdlc3QgUU9QIEFWUCAqLworCQkJCQkJCQl7CisJCQkJCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3ICggc2lwX2RpY3QuRGlnZXN0X1FPUCwgMCwgJmEyICkgKTsKKwkJCQkJCQkJCXZhbC5vcy5kYXRhPSh1bnNpZ25lZCBjaGFyICopImF1dGgiOworCQkJCQkJCQkJdmFsLm9zLmxlbj1zdHJsZW4oKGNvbnN0IGNoYXIgKil2YWwub3MuZGF0YSk7CisJCQkJCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUoIGEyLCAmdmFsICkgKTsKKwkJCQkJCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQoIHNpcEF1dGhlbnRpY2F0ZSwgTVNHX0JSV19MQVNUX0NISUxELCBhMiApICk7CisJCQkJCQkJCX0KKwkJCQkJCQkJLyogQWRkIHRoZSBEaWdlc3QgTm9uY2UgQVZQICovCisJCQkJCQkJCXsKKwkJCQkJCQkJCXVpbnQ4X3QgYnVmZmVyW05PTkNFX1NJWkVdOworCQkJCQkJCQkJY2hhciBub25jZVtOT05DRV9TSVpFICogMiArIDFdOworCQkJCQkJCQorCQkJCQkJCQkKKwkJCQkJCQkJCWdjcnlfY3JlYXRlX25vbmNlICgodWludDhfdCAqKWJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworCQkJCQkJCQorCQkJCQkJCQkJZm9yKGk9MDtpPE5PTkNFX1NJWkU7aSsrKQorCQkJCQkJCQkJCXNwcmludGYoJm5vbmNlWzIgKiBpXSwgIiUyLjJoaHgiLCBidWZmZXJbaV0pOworCQkJCQkJCQkKKwkJCQkJCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBzaXBfZGljdC5EaWdlc3RfTm9uY2UsIDAsICZhMiApICk7CisJCQkJCQkJCQkKKwkJCQkJCQkJCQorCQkJCQkJCQkJLy9XZSBzdG9yZSB0aGUgbm9uY2UgKHN0b3JlZG5vbmNlIHN0cnVjdHVyZSkgaW5zaWRlIHRoZSBzZXNzaW9uCisJCQkJCQkJCQlzdG9yZWRub25jZT1tYWxsb2Moc2l6ZW9mKHN0cnVjdCBzZXNzX3N0YXRlKSk7CisJCQkJCQkJCQltZW1zZXQoc3RvcmVkbm9uY2UsMCxzaXplb2Yoc3RydWN0IHNlc3Nfc3RhdGUpKTsKKwkJCQkJCQkJCUNIRUNLX01BTExPQyhzdG9yZWRub25jZS0+bm9uY2U9bWFsbG9jKE5PTkNFX1NJWkUqMisxKSk7CisJCQkJCQkJCQltZW1jcHkoc3RvcmVkbm9uY2UtPm5vbmNlLChjaGFyICopbm9uY2UsTk9OQ0VfU0laRSoyKzEpOworCQkJCQkJCQkJQ0hFQ0tfRkNUKCBmZF9zZXNzX3N0YXRlX3N0b3JlICggZHNfc2Vzc19oZGwsIHNlc3MsICZzdG9yZWRub25jZSApKTsgIAorCQkJCQkJCQkJCisJCQkJCQkJCQl2YWwub3MuZGF0YT0odW5zaWduZWQgY2hhciAqKW5vbmNlOworCQkJCQkJCQkJdmFsLm9zLmxlbj1OT05DRV9TSVpFICogMjsKKwkJCQkJCQkJCQorCQkJCQkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX3NldHZhbHVlKCBhMiwgJnZhbCApICk7CisJCQkJCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkKCBzaXBBdXRoZW50aWNhdGUsIE1TR19CUldfTEFTVF9DSElMRCwgYTIgKSApOworCQkJCQkJCQl9CisJCQkJCQkJCS8qIEFkZCB0aGUgRGlnZXN0IEFsZ29yaXRobSBBVlAgKi8KKwkJCQkJCQkJeworCQkJCQkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIHNpcF9kaWN0LkRpZ2VzdF9BbGdvcml0aG0sIDAsICZhMiApICk7CisJCQkJCQkJCQl2YWwub3MuZGF0YT0odW5zaWduZWQgY2hhciAqKSJNRDUiOworCQkJCQkJCQkJdmFsLm9zLmxlbj1zdHJsZW4oKGNvbnN0IGNoYXIgKil2YWwub3MuZGF0YSk7CisJCQkJCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUoIGEyLCAmdmFsICkgKTsKKwkJCQkJCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQoIHNpcEF1dGhlbnRpY2F0ZSwgTVNHX0JSV19MQVNUX0NISUxELCBhMiApICk7CisJCQkJCQkJCisJCQkJCQkJCX0KKwkJCQkJCQkJLyogQWRkIHRoZSBEaWdlc3QgUmVhbG0gQVZQICovCisJCQkJCQkJCXsKKwkJCQkJCQkJCXRlbXBhdnA9YXZwOworCQkJCQkJCQkKKwkJCQkJCQkJCWF2cGhlYWRlcl9hdXRoPXdhbGtfZGlnZXN0KHRlbXBhdnAsIDEwNCk7CisJCQkJCQkJCQlpZihhdnBoZWFkZXJfYXV0aCE9TlVMTCkKKwkJCQkJCQkJCXsKKwkJCQkJCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3ICggc2lwX2RpY3QuRGlnZXN0X1JlYWxtLCAwLCAmYTIgKSApOworCQkJCQkJCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9zZXR2YWx1ZSggYTIsIGF2cGhlYWRlcl9hdXRoLT5hdnBfdmFsdWUgKSApOworCQkJCQkJCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQoIHNpcEF1dGhlbnRpY2F0ZSwgTVNHX0JSV19MQVNUX0NISUxELCBhMiApICk7CisJCQkJCQkJCQorCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkKKwkJCQkJCQorCQkJCQkJCQkvL1dlIGFkZCBTSVAgQXV0aGVudGljYXRlIHRvIEF1dGggRGF0YSBJdGVtCisJCQkJCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQoIGF1dGhkYXRhaXRlbSwgTVNHX0JSV19MQVNUX0NISUxELCBzaXBBdXRoZW50aWNhdGUgKSApOworCQkJCQkJCQkvL1dlIGFkZCBBdXRoIERhdGEgSXRlbSB0byBBbnN3ZXIKKwkJCQkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCggYW5zLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF1dGhkYXRhaXRlbSApICk7CisJCQkJCQkKKwkJCQkJCQkJbnVtYmVyX29mX2F1dGhfaXRlbXMrKzsKKwkJCQkJCQkJaWYoc2lwdXJpbm90c3RvcmVkKQorCQkJCQkJCQkJcmVzdWx0PSJESUFNRVRFUl9TVUNDRVNTX0FVVEhfU0VOVF9TRVJWRVJfTk9UX1NUT1JFRCI7CisJCQkJCQkJCWVsc2UKKwkJCQkJCQkJCXJlc3VsdD0iRElBTUVURVJfTVVMVElfUk9VTkRfQVVUSCI7CisJCQkJCQkJCWZvdW5kX2Nub25jZT0wOworCQkJCQkJCX0KKwkJCQkJCQllbHNlCisJCQkJCQkJeworCQkJCQkJCQkvKgorCQkJCQkJCQlXZSBhcmUgaW4gdGhlIGNhc2Ugb2YgYWNjZXNzIHJlcXVlc3QgYWZ0ZXIgY2hhbGxlbmdlIHNvIHdlIG5lZWQgdG8gY2hlY2sgY3JlZGVudGlhbHMuCisJCQkJCQkJCSovCisJCQkJCQkJCVRSQUNFX0RFQlVHKEZVTEwsIkF1dGhlbnRpY2F0aW9uIGFmdGVyIGNoYWxsZW5nZSIpOworCQkJCQkJCQkKKwkJCQkJCQkJLyogU2VhcmNoIHRoZSBzZXNzaW9uLCByZXRyaWV2ZSBpdHMgZGF0YSAqLworCQkJCQkJCQl7CisJCQkJCQkJCQkvL2ludCBuZXc9MDsKKwkJCQkJCQkJCQorCQkJCQkJCQkJLy9UUkFDRV9ERUJVRyhGVUxMLCJuZXc6IColZCoiLG5ldyk7CisJCQkJCQkJCQkvL0FTU0VSVCggbmV3ID09IDAgKTsKKwkJCQkJCQkJCUNIRUNLX0ZDVCggZmRfc2Vzc19zdGF0ZV9yZXRyaWV2ZSggZHNfc2Vzc19oZGwsIHNlc3MsICZzdG9yZWRub25jZSApKTsKKwkJCQkJCQkJCWlmKHN0b3JlZG5vbmNlID09TlVMTCkKKwkJCQkJCQkJCXsKKwkJCQkJCQkJCQlyZXN1bHQ9IkRJQU1FVEVSX1VOQUJMRV9UT19DT01QTFkiOworCQkJCQkJCQkJCQkJCisJCQkJCQkJCQkJaWYodXNlcm5hbWUhPU5VTEwpCisJCQkJCQkJCQkJCWZyZWUodXNlcm5hbWUpOworCQkJCQkJCQkJCWdvdG8gb3V0OworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJCQorCQkJCQkJCQkvKiBDcmVhdGUgdGhlIFNJUC1BdXRoZW50aWNhdGlvbi1JbmZvIEFWUCAqLworCQkJCQkJCQl7CisJCQkJCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3ICggc2lwX2RpY3QuU0lQX0F1dGhlbnRpY2F0aW9uX0luZm8sIDAsICZzaXBBdXRoZW50aWNhdGlvbiApICk7CisJCQkJCQkJCX0KKwkJCQkJCQkJCisJCQkJCQkJCQorCQkJCQkJCQorCQkJCQkJCQkvKiBBZGQgdGhlIERpZ2VzdCByZXNwb25zZSBBdXRoIEFWUCAqLworCQkJCQkJCQl7CisJCQkJCQkJCQkvL3VpbnQ4X3QgYnVmZmVycmVzcFtESUdFU1RfTEVOXTsKKwkJCQkJCQkJCS8vY2hhciByZXNwb25zZVtESUdFU1RfTEVOKjIrMV07CisJCQkJCQkJCQkKKwkJCQkJCQkJCQorCQkJCQkJCQkJLy9XZSBleHRyYWN0IGFsbCB0aGUgZGF0YSB3ZSBuZWVkCisJCQkJCQkJCQl0ZW1wYXZwPWF2cDsKKwkJCQkJCQkJCQorCQkJCQkJCQkJY2hhciAqIGRpZ2VzdF91c2VybmFtZT1OVUxMLCAqZGlnZXN0X3VyaT1OVUxMLCAqZGlnZXN0X3Jlc3BvbnNlPU5VTEwsICpkaWdlc3RfcmVhbG09TlVMTCwgKmRpZ2VzdF9ub25jZT1OVUxMLCAqZGlnZXN0X21ldGhvZD1OVUxMLCAqZGlnZXN0X3FvcD1OVUxMLCAqZGlnZXN0X2FsZ29yaXRobT1OVUxMLCAqZGlnZXN0X2Nub25jZT1OVUxMLCAqZGlnZXN0X25vbmNlY291bnQ9TlVMTDsKKwkJCQkJCQkJCQorCQkJCQkJCQkJCisJCQkJCQkJCQlDSEVDS19GQ1QoZmRfYXZwX3NlYXJjaF9hdnAgKGF2cCwgc2lwX2RpY3QuRGlnZXN0X05vbmNlLCAmYTIgKSk7CisJCQkJCQkJCQlpZihhMiE9TlVMTCkKKwkJCQkJCQkJCXsKKwkJCQkJCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfaGRyKCBhMiwgJmRpZ2VzdGhlYWRlciApICApOworCQkJCQkJCQkJCWlmKGRpZ2VzdGhlYWRlciE9TlVMTCkKKwkJCQkJCQkJCQl7CisJCQkJCQkJCQkJCQorCQkJCQkJCQkJCQlkaWdlc3Rfbm9uY2UgPSBtYWxsb2MoZGlnZXN0aGVhZGVyLT5hdnBfdmFsdWUtPm9zLmxlbiArIDEpOworCQkJCQkJCQkJCQltZW1jcHkoZGlnZXN0X25vbmNlLCBkaWdlc3RoZWFkZXItPmF2cF92YWx1ZS0+b3MuZGF0YSwKKwkJCQkJCQkJCQkJZGlnZXN0aGVhZGVyLT5hdnBfdmFsdWUtPm9zLmxlbik7CisJCQkJCQkJCQkJCWRpZ2VzdF9ub25jZVtkaWdlc3RoZWFkZXItPmF2cF92YWx1ZS0+b3MubGVuXT0nXDAnOworCQkJCQkJCQkJCQlUUkFDRV9ERUJVRyhGVUxMLCJFbGVtZW50OiolcyoiLGRpZ2VzdF9ub25jZSk7CQorCQkJCQkJCQkJCQlUUkFDRV9ERUJVRyhGVUxMLCJTdG9yZWQgTm9uY2U6KiVzKiIsc3RvcmVkbm9uY2UtPm5vbmNlKTsKKwkJCQkJCQkJCQkJCisJCQkJCQkJCQkJCWlmKHN0cmNtcChkaWdlc3Rfbm9uY2Usc3RvcmVkbm9uY2UtPm5vbmNlKSE9MCkKKwkJCQkJCQkJCQkJeworCQkJCQkJCQkJCQkJZnJlZShkaWdlc3Rfbm9uY2UpOworCQkJCQkJCQkJCQkJZnJlZShzdG9yZWRub25jZS0+bm9uY2UpOworCQkJCQkJCQkJCQkJZnJlZShzdG9yZWRub25jZSk7CisJCQkJCQkJCQkJCQlyZXN1bHQ9IkRJQU1FVEVSX1VOQUJMRV9UT19DT01QTFkiOworCQkJCQkJCQkJCQkJCisJCQkJCQkJCQkJCQlpZih1c2VybmFtZSE9TlVMTCkKKwkJCQkJCQkJCQkJCQlmcmVlKHVzZXJuYW1lKTsKKwkJCQkJCQkJCQkJCWdvdG8gb3V0OworCQkJCQkJCQkJCQl9CisJCQkJCQkJCQkJCQorCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQkJCisJCQkJCQkJCQl9CisJCQkJCQkJCQlDSEVDS19GQ1QoZmRfYXZwX3NlYXJjaF9hdnAgKGF2cCwgc2lwX2RpY3QuRGlnZXN0X1Jlc3BvbnNlLCAmYTIgKSk7CisJCQkJCQkJCQlpZihhMiE9TlVMTCkKKwkJCQkJCQkJCXsKKwkJCQkJCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfaGRyKCBhMiwgJmRpZ2VzdGhlYWRlciApICApOworCQkJCQkJCQkJCWlmKGRpZ2VzdGhlYWRlciE9TlVMTCkKKwkJCQkJCQkJCQl7CisJCQkJCQkJCQkJCWRpZ2VzdF9yZXNwb25zZSA9IG1hbGxvYyhkaWdlc3RoZWFkZXItPmF2cF92YWx1ZS0+b3MubGVuICsgMSk7CisJCQkJCQkJCQkJCW1lbWNweShkaWdlc3RfcmVzcG9uc2UsIGRpZ2VzdGhlYWRlci0+YXZwX3ZhbHVlLT5vcy5kYXRhLAorCQkJCQkJCQkJCQlkaWdlc3RoZWFkZXItPmF2cF92YWx1ZS0+b3MubGVuKTsKKwkJCQkJCQkJCQkJZGlnZXN0X3Jlc3BvbnNlW2RpZ2VzdGhlYWRlci0+YXZwX3ZhbHVlLT5vcy5sZW5dPSdcMCc7CisJCQkJCQkJCQkJCVRSQUNFX0RFQlVHKEZVTEwsIkVsZW1lbnQ6KiVzKiIsZGlnZXN0X3Jlc3BvbnNlKTsJCisJCQkJCQkJCQkJfQorCQkJCQkJCQkJCQorCQkJCQkJCQkJfQorCQkJCQkJCQkJQ0hFQ0tfRkNUKGZkX2F2cF9zZWFyY2hfYXZwIChhdnAsIHNpcF9kaWN0LkRpZ2VzdF9SZWFsbSwgJmEyICkpOworCQkJCQkJCQkJaWYoYTIhPU5VTEwpCisJCQkJCQkJCQl7CisJCQkJCQkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2hkciggYTIsICZkaWdlc3RoZWFkZXIgKSAgKTsKKwkJCQkJCQkJCQlpZihkaWdlc3RoZWFkZXIhPU5VTEwpCisJCQkJCQkJCQkJeworCQkJCQkJCQkJCQlkaWdlc3RfcmVhbG0gPSBtYWxsb2MoZGlnZXN0aGVhZGVyLT5hdnBfdmFsdWUtPm9zLmxlbiArIDEpOworCQkJCQkJCQkJCQltZW1jcHkoZGlnZXN0X3JlYWxtLCBkaWdlc3RoZWFkZXItPmF2cF92YWx1ZS0+b3MuZGF0YSwKKwkJCQkJCQkJCQkJZGlnZXN0aGVhZGVyLT5hdnBfdmFsdWUtPm9zLmxlbik7CisJCQkJCQkJCQkJCWRpZ2VzdF9yZWFsbVtkaWdlc3RoZWFkZXItPmF2cF92YWx1ZS0+b3MubGVuXT0nXDAnOworCQkJCQkJCQkJCQlUUkFDRV9ERUJVRyhGVUxMLCJFbGVtZW50OiolcyoiLGRpZ2VzdF9yZWFsbSk7CQorCQkJCQkJCQkJCX0KKwkJCQkJCQkJCX0KKwkJCQkJCQkJCQorCQkJCQkJCQkJQ0hFQ0tfRkNUKGZkX2F2cF9zZWFyY2hfYXZwIChhdnAsIHNpcF9kaWN0LkRpZ2VzdF9NZXRob2QsICZhMiApKTsKKwkJCQkJCQkJCWlmKGEyIT1OVUxMKQorCQkJCQkJCQkJeworCQkJCQkJCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9oZHIoIGEyLCAmZGlnZXN0aGVhZGVyICkgICk7CisJCQkJCQkJCQkJaWYoZGlnZXN0aGVhZGVyIT1OVUxMKQorCQkJCQkJCQkJCXsKKwkJCQkJCQkJCQkJZGlnZXN0X21ldGhvZCA9IG1hbGxvYyhkaWdlc3RoZWFkZXItPmF2cF92YWx1ZS0+b3MubGVuICsgMSk7CisJCQkJCQkJCQkJCW1lbWNweShkaWdlc3RfbWV0aG9kLCBkaWdlc3RoZWFkZXItPmF2cF92YWx1ZS0+b3MuZGF0YSwKKwkJCQkJCQkJCQkJZGlnZXN0aGVhZGVyLT5hdnBfdmFsdWUtPm9zLmxlbik7CisJCQkJCQkJCQkJCWRpZ2VzdF9tZXRob2RbZGlnZXN0aGVhZGVyLT5hdnBfdmFsdWUtPm9zLmxlbl09J1wwJzsKKwkJCQkJCQkJCQkJVFJBQ0VfREVCVUcoRlVMTCwiRWxlbWVudDoqJXMqIixkaWdlc3RfbWV0aG9kKTsJCisJCQkJCQkJCQkJfQorCQkJCQkJCQkJfQorCQkJCQkJCQkJZWxzZQorCQkJCQkJCQkJCWRpZ2VzdF9tZXRob2Q9IiI7CisJCQkJCQkJCQkKKwkJCQkJCQkJCUNIRUNLX0ZDVChmZF9hdnBfc2VhcmNoX2F2cCAoYXZwLCBzaXBfZGljdC5EaWdlc3RfVVJJLCAmYTIgKSk7CisJCQkJCQkJCQlpZihhMiE9TlVMTCkKKwkJCQkJCQkJCXsKKwkJCQkJCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfaGRyKCBhMiwgJmRpZ2VzdGhlYWRlciApICApOworCQkJCQkJCQkJCWlmKGRpZ2VzdGhlYWRlciE9TlVMTCkKKwkJCQkJCQkJCQl7CisJCQkJCQkJCQkJCWRpZ2VzdF91cmkgPSBtYWxsb2MoZGlnZXN0aGVhZGVyLT5hdnBfdmFsdWUtPm9zLmxlbiArIDEpOworCQkJCQkJCQkJCQltZW1jcHkoZGlnZXN0X3VyaSwgZGlnZXN0aGVhZGVyLT5hdnBfdmFsdWUtPm9zLmRhdGEsCisJCQkJCQkJCQkJCWRpZ2VzdGhlYWRlci0+YXZwX3ZhbHVlLT5vcy5sZW4pOworCQkJCQkJCQkJCQlkaWdlc3RfdXJpW2RpZ2VzdGhlYWRlci0+YXZwX3ZhbHVlLT5vcy5sZW5dPSdcMCc7CisJCQkJCQkJCQkJCVRSQUNFX0RFQlVHKEZVTEwsIkVsZW1lbnQ6KiVzKiIsZGlnZXN0X3VyaSk7CQorCQkJCQkJCQkJCX0KKwkJCQkJCQkJCX0KKwkJCQkJCQkJCQorCQkJCQkJCQkJQ0hFQ0tfRkNUKGZkX2F2cF9zZWFyY2hfYXZwIChhdnAsIHNpcF9kaWN0LkRpZ2VzdF9RT1AsICZhMiApKTsKKwkJCQkJCQkJCWlmKGEyIT1OVUxMKQorCQkJCQkJCQkJeworCQkJCQkJCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9oZHIoIGEyLCAmZGlnZXN0aGVhZGVyICkgICk7CisJCQkJCQkJCQkJaWYoZGlnZXN0aGVhZGVyIT1OVUxMKQorCQkJCQkJCQkJCXsKKwkJCQkJCQkJCQkJZGlnZXN0X3FvcCA9IG1hbGxvYyhkaWdlc3RoZWFkZXItPmF2cF92YWx1ZS0+b3MubGVuICsgMSk7CisJCQkJCQkJCQkJCW1lbWNweShkaWdlc3RfcW9wLCBkaWdlc3RoZWFkZXItPmF2cF92YWx1ZS0+b3MuZGF0YSwKKwkJCQkJCQkJCQkJZGlnZXN0aGVhZGVyLT5hdnBfdmFsdWUtPm9zLmxlbik7CisJCQkJCQkJCQkJCWRpZ2VzdF9xb3BbZGlnZXN0aGVhZGVyLT5hdnBfdmFsdWUtPm9zLmxlbl09J1wwJzsKKwkJCQkJCQkJCQkJVFJBQ0VfREVCVUcoRlVMTCwiRWxlbWVudDoqJXMqIixkaWdlc3RfcW9wKTsJCisJCQkJCQkJCQkJfQorCQkJCQkJCQkJfQorCQkJCQkJCQkJZWxzZQorCQkJCQkJCQkJCWRpZ2VzdF9xb3A9TlVMTDsKKwkJCQkJCQkJCUNIRUNLX0ZDVChmZF9hdnBfc2VhcmNoX2F2cCAoYXZwLCBzaXBfZGljdC5EaWdlc3RfQWxnb3JpdGhtLCAmYTIgKSk7CisJCQkJCQkJCQlpZihhMiE9TlVMTCkKKwkJCQkJCQkJCXsKKwkJCQkJCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfaGRyKCBhMiwgJmRpZ2VzdGhlYWRlciApICApOworCQkJCQkJCQkJCWlmKGRpZ2VzdGhlYWRlciE9TlVMTCkKKwkJCQkJCQkJCQl7CisJCQkJCQkJCQkJCWRpZ2VzdF9hbGdvcml0aG0gPSBtYWxsb2MoZGlnZXN0aGVhZGVyLT5hdnBfdmFsdWUtPm9zLmxlbiArIDEpOworCQkJCQkJCQkJCQltZW1jcHkoZGlnZXN0X2FsZ29yaXRobSwgZGlnZXN0aGVhZGVyLT5hdnBfdmFsdWUtPm9zLmRhdGEsCisJCQkJCQkJCQkJCWRpZ2VzdGhlYWRlci0+YXZwX3ZhbHVlLT5vcy5sZW4pOworCQkJCQkJCQkJCQlkaWdlc3RfYWxnb3JpdGhtW2RpZ2VzdGhlYWRlci0+YXZwX3ZhbHVlLT5vcy5sZW5dPSdcMCc7CisJCQkJCQkJCQkJCVRSQUNFX0RFQlVHKEZVTEwsIkVsZW1lbnQ6KiVzKiIsZGlnZXN0X2FsZ29yaXRobSk7CQorCQkJCQkJCQkJCX0KKwkJCQkJCQkJCX0KKwkJCQkJCQkJCWVsc2UKKwkJCQkJCQkJCQlkaWdlc3RfYWxnb3JpdGhtPU5VTEw7CisJCQkJCQkJCQlDSEVDS19GQ1QoZmRfYXZwX3NlYXJjaF9hdnAgKGF2cCwgc2lwX2RpY3QuRGlnZXN0X0NOb25jZSwgJmEyICkpOworCQkJCQkJCQkJaWYoYTIhPU5VTEwpCisJCQkJCQkJCQl7CisJCQkJCQkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2hkciggYTIsICZkaWdlc3RoZWFkZXIgKSAgKTsKKwkJCQkJCQkJCQlpZihkaWdlc3RoZWFkZXIhPU5VTEwpCisJCQkJCQkJCQkJeworCQkJCQkJCQkJCQlkaWdlc3RfY25vbmNlID0gbWFsbG9jKGRpZ2VzdGhlYWRlci0+YXZwX3ZhbHVlLT5vcy5sZW4gKyAxKTsKKwkJCQkJCQkJCQkJbWVtY3B5KGRpZ2VzdF9jbm9uY2UsIGRpZ2VzdGhlYWRlci0+YXZwX3ZhbHVlLT5vcy5kYXRhLAorCQkJCQkJCQkJCQlkaWdlc3RoZWFkZXItPmF2cF92YWx1ZS0+b3MubGVuKTsKKwkJCQkJCQkJCQkJZGlnZXN0X2Nub25jZVtkaWdlc3RoZWFkZXItPmF2cF92YWx1ZS0+b3MubGVuXT0nXDAnOworCQkJCQkJCQkJCQlUUkFDRV9ERUJVRyhGVUxMLCJFbGVtZW50OiolcyoiLGRpZ2VzdF9jbm9uY2UpOwkKKwkJCQkJCQkJCQl9CisJCQkJCQkJCQl9CisJCQkJCQkJCQllbHNlCisJCQkJCQkJCQkJZGlnZXN0X2Nub25jZT0iIjsKKwkJCQkJCQkJCUNIRUNLX0ZDVChmZF9hdnBfc2VhcmNoX2F2cCAoYXZwLCBzaXBfZGljdC5EaWdlc3RfTm9uY2VfQ291bnQsICZhMiApKTsKKwkJCQkJCQkJCWlmKGEyIT1OVUxMKQorCQkJCQkJCQkJeworCQkJCQkJCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9oZHIoIGEyLCAmZGlnZXN0aGVhZGVyICkgICk7CisJCQkJCQkJCQkJaWYoZGlnZXN0aGVhZGVyIT1OVUxMKQorCQkJCQkJCQkJCXsKKwkJCQkJCQkJCQkJZGlnZXN0X25vbmNlY291bnQgPSBtYWxsb2MoZGlnZXN0aGVhZGVyLT5hdnBfdmFsdWUtPm9zLmxlbiArIDEpOworCQkJCQkJCQkJCQltZW1jcHkoZGlnZXN0X25vbmNlY291bnQsIGRpZ2VzdGhlYWRlci0+YXZwX3ZhbHVlLT5vcy5kYXRhLAorCQkJCQkJCQkJCQlkaWdlc3RoZWFkZXItPmF2cF92YWx1ZS0+b3MubGVuKTsKKwkJCQkJCQkJCQkJZGlnZXN0X25vbmNlY291bnRbZGlnZXN0aGVhZGVyLT5hdnBfdmFsdWUtPm9zLmxlbl09J1wwJzsKKwkJCQkJCQkJCQkJVFJBQ0VfREVCVUcoRlVMTCwiRWxlbWVudDoqJXMqIixkaWdlc3Rfbm9uY2Vjb3VudCk7CQorCQkJCQkJCQkJCX0KKwkJCQkJCQkJCX0KKwkJCQkJCQkJCWVsc2UKKwkJCQkJCQkJCQlkaWdlc3Rfbm9uY2Vjb3VudD0iIjsKKwkJCQkJCQkJCUNIRUNLX0ZDVChmZF9hdnBfc2VhcmNoX2F2cCAoYXZwLCBzaXBfZGljdC5EaWdlc3RfVXNlcm5hbWUsICZhMiApKTsKKwkJCQkJCQkJCWlmKGEyIT1OVUxMKQorCQkJCQkJCQkJeworCQkJCQkJCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9oZHIoIGEyLCAmZGlnZXN0aGVhZGVyICkgICk7CisJCQkJCQkJCQkJaWYoZGlnZXN0aGVhZGVyIT1OVUxMKQorCQkJCQkJCQkJCXsKKwkJCQkJCQkJCQkJZGlnZXN0X3VzZXJuYW1lID0gbWFsbG9jKGRpZ2VzdGhlYWRlci0+YXZwX3ZhbHVlLT5vcy5sZW4gKyAxKTsKKwkJCQkJCQkJCQkJbWVtY3B5KGRpZ2VzdF91c2VybmFtZSwgZGlnZXN0aGVhZGVyLT5hdnBfdmFsdWUtPm9zLmRhdGEsCisJCQkJCQkJCQkJCWRpZ2VzdGhlYWRlci0+YXZwX3ZhbHVlLT5vcy5sZW4pOworCQkJCQkJCQkJCQlkaWdlc3RfdXNlcm5hbWVbZGlnZXN0aGVhZGVyLT5hdnBfdmFsdWUtPm9zLmxlbl09J1wwJzsKKwkJCQkJCQkJCQkJVFJBQ0VfREVCVUcoRlVMTCwiRWxlbWVudDoqJXMqIixkaWdlc3RfdXNlcm5hbWUpOwkKKwkJCQkJCQkJCQl9CisJCQkJCQkJCQl9CisJCQkJCQkJCQkvL1RPRE86IHJlcGxhY2UgYnkgYXV0aGVudGljYXRpb24gZnVuY3Rpb24KKwkJCQkJCQkJCQorCQkJCQkJCQkJSEFTSEhFWCBIQTE7CisJCQkJCQkJCQlIQVNISEVYIEhBMiA9ICIiOworCQkJCQkJCQkJSEFTSEhFWCByZXNwb25zZSwgcmVzcG9uc2VhdXRoOworCisJCQkJCQkJCQkKKwkJCQkJCQkJCURpZ2VzdENhbGNIQTEoZGlnZXN0X2FsZ29yaXRobSwgZGlnZXN0X3VzZXJuYW1lLCBkaWdlc3RfcmVhbG0sIHBhc3N3b3JkLCBkaWdlc3Rfbm9uY2UsZGlnZXN0X2Nub25jZSwgSEExKTsKKyAgICAgIAkJCQkJCQkJRGlnZXN0Q2FsY1Jlc3BvbnNlKEhBMSwgZGlnZXN0X25vbmNlLCBkaWdlc3Rfbm9uY2Vjb3VudCwgZGlnZXN0X2Nub25jZSwgZGlnZXN0X3FvcCxkaWdlc3RfbWV0aG9kLCBkaWdlc3RfdXJpLCBIQTIsIHJlc3BvbnNlKTsKKyAgICAgIAkJCQkJCQkJCQorCQkKKwkJCQkJCQkJCS8vIFdlIGNoZWNrIHRoYXQgdGhlIERpZ2VzdC1SZXNwb25zZSBpcyB0aGUgc2FtZSAoVUEsIERpYW1ldGVyKQorCQkJCQkJCQkJaWYoc3RyY21wKHJlc3BvbnNlLGRpZ2VzdF9yZXNwb25zZSkhPTApCisJCQkJCQkJCQl7CisJCQkJCQkJCQkJVFJBQ0VfREVCVUcoRlVMTCwiUmVzcG9uc2UgY2FsY3VsYXRlZCBieSBEaWFtZXRlciBzZXJ2ZXI6JXMiLHJlc3BvbnNlKTsKKwkJCQkJCQkJCQlUUkFDRV9ERUJVRyhGVUxMLCJSZXNwb25zZSBjYWxjdWxhdGVkIGJ5IFVBOiVzIixkaWdlc3RfcmVzcG9uc2UpOworCQkJCQkJCQkJCVRSQUNFX0RFQlVHKElORk8sIkRpZ2VzdC1SZXNwb25zZSBkb2VzIG5vdCBtYXRjaCEiKTsKKwkJCQkJCQkJCQlyZXN1bHQ9IkRJQU1FVEVSX1VOQUJMRV9UT19DT01QTFkiOworCQkJCQkJCQkJCWZyZWUoZGlnZXN0X2FsZ29yaXRobSk7CisJCQkJCQkJCQkJZnJlZShkaWdlc3RfY25vbmNlKTsKKwkJCQkJCQkJCQlmcmVlKGRpZ2VzdF9ub25jZSk7CisJCQkJCQkJCQkJZnJlZShkaWdlc3Rfbm9uY2Vjb3VudCk7CisJCQkJCQkJCQkJZnJlZShkaWdlc3RfbWV0aG9kKTsKKwkJCQkJCQkJCQlmcmVlKGRpZ2VzdF91c2VybmFtZSk7CisJCQkJCQkJCQkJZnJlZShkaWdlc3RfdXJpKTsKKwkJCQkJCQkJCQlmcmVlKGRpZ2VzdF9xb3ApOworCQkJCQkJCQkJCWZyZWUoZGlnZXN0X3Jlc3BvbnNlKTsKKwkJCQkJCQkJCQlmcmVlKGRpZ2VzdF9yZWFsbSk7CisJCQkJCQkJCQkJZnJlZShzdG9yZWRub25jZS0+bm9uY2UpOworCQkJCQkJCQkJCWZyZWUoc3RvcmVkbm9uY2UpOworCQkJCQkJCQkJCWlmKHVzZXJuYW1lIT1OVUxMKQorCQkJCQkJCQkJCQlmcmVlKHVzZXJuYW1lKTsKKwkJCQkJCQkJCQlnb3RvIG91dDsKKwkJCQkJCQkJCQkKKwkJCQkJCQkJCX0KKwkJCQkJCQkJCS8vV2UgY2FsY3VsYXRlIERpZ2VzdF9SZXNwb25zZV9BdXRoCisJCQkJCQkJCQlEaWdlc3RDYWxjUmVzcG9uc2VBdXRoKEhBMSwgZGlnZXN0X25vbmNlLCBkaWdlc3Rfbm9uY2Vjb3VudCwgZGlnZXN0X2Nub25jZSwgZGlnZXN0X3FvcCxkaWdlc3RfbWV0aG9kLCBkaWdlc3RfdXJpLCBIQTIsIHJlc3BvbnNlYXV0aCk7CisJCQkJCQkJCQkKKwkJCQkJCQkJCVRSQUNFX0RFQlVHKEZVTEwsIlJlc3BvbnNlIGNhbGN1bGF0ZWQgYnkgRGlhbWV0ZXIgc2VydmVyOiVzIixyZXNwb25zZSk7CisJCQkJCQkJCQkJVFJBQ0VfREVCVUcoRlVMTCwiUmVzcG9uc2UgY2FsY3VsYXRlZCBieSBVQTolcyIsZGlnZXN0X3Jlc3BvbnNlKTsKKwkJCQkJCQkJCWlmKHN0cmNtcChkaWdlc3RfcW9wLCJhdXRoLWludCIpPT0wKQorCQkJCQkJCQkJeworCQkJCQkJCQkJCS8vRGlnZXN0LUhBMSBNVVNUIGJlIHVzZWQgaW5zdGVhZCBvZiBEaWdlc3QtUmVzcG9uc2UtQXV0aCBpZiBEaWdlc3QtUW9wIGlzICdhdXRoLWludCcuCisJCQkJCQkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIHNpcF9kaWN0LkRpZ2VzdF9IQTEsIDAsICZhMiApICk7CisJCQkJCQkJCQkJdmFsLm9zLmRhdGE9KHVuc2lnbmVkIGNoYXIgKilIQTE7CisJCQkJCQkJCQkJdmFsLm9zLmxlbj1IQVNISEVYTEVOKzE7CisJCQkJCQkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX3NldHZhbHVlKCBhMiwgJnZhbCApICk7CisJCQkJCQkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCggc2lwQXV0aGVudGljYXRpb24sIE1TR19CUldfTEFTVF9DSElMRCwgYTIgKSApOworCQkJCQkJCQkJfQorCQkJCQkJCQkJZWxzZQorCQkJCQkJCQkJeworCQkJCQkJCQkJCS8vRGlnZXN0LVJlc3BvbnNlLUF1dGggTVVTVCBiZSB1c2VkIGluc3RlYWQgb2YgRGlnZXN0LUhBMSBpZiBEaWdlc3QtUW9wIGlzICdhdXRoJy4KKwkJCQkJCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3ICggc2lwX2RpY3QuRGlnZXN0X1Jlc3BvbnNlX0F1dGgsIDAsICZhMiApICk7CisJCQkJCQkJCQkJdmFsLm9zLmRhdGE9KHVuc2lnbmVkIGNoYXIgKilyZXNwb25zZWF1dGg7CisJCQkJCQkJCQkJdmFsLm9zLmxlbj1ESUdFU1RfTEVOKjI7CisJCQkJCQkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX3NldHZhbHVlKCBhMiwgJnZhbCApICk7CisJCQkJCQkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCggc2lwQXV0aGVudGljYXRpb24sIE1TR19CUldfTEFTVF9DSElMRCwgYTIgKSApOworCQkJCQkJCQkJfQorCQkJCQkJCQkJZnJlZShkaWdlc3RfYWxnb3JpdGhtKTsKKwkJCQkJCQkJCWZyZWUoZGlnZXN0X2Nub25jZSk7CisJCQkJCQkJCQlmcmVlKGRpZ2VzdF9ub25jZSk7CisJCQkJCQkJCQlmcmVlKGRpZ2VzdF9ub25jZWNvdW50KTsKKwkJCQkJCQkJCWZyZWUoZGlnZXN0X21ldGhvZCk7CisJCQkJCQkJCQlmcmVlKGRpZ2VzdF91c2VybmFtZSk7CisJCQkJCQkJCQlmcmVlKGRpZ2VzdF91cmkpOworCQkJCQkJCQkJZnJlZShkaWdlc3RfcW9wKTsKKwkJCQkJCQkJCWZyZWUoZGlnZXN0X3Jlc3BvbnNlKTsKKwkJCQkJCQkJCWZyZWUoZGlnZXN0X3JlYWxtKTsKKwkJCQkJCQkJCWZyZWUoc3RvcmVkbm9uY2UtPm5vbmNlKTsKKwkJCQkJCQkJCWZyZWUoc3RvcmVkbm9uY2UpOworCQkJCQkJCQkKKwkJCQkJCQkJCW51bWJlcl9vZl9hdXRoX2l0ZW1zKys7CisJCQkJCQkJCX0JCisJCQkJCQkJCQorCQkJCQkJCQkKKwkJCQkJCQkJLy9XZSBhZGQgU0lQIEF1dGhlbnRpY2F0aW9uLUluZm8gdG8gQXV0aCBEYXRhIEl0ZW0KKwkJCQkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCggYXV0aGRhdGFpdGVtLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIHNpcEF1dGhlbnRpY2F0aW9uICkgKTsKKwkJCQkJCQkJLy9XZSBhZGQgQXV0aCBEYXRhIEl0ZW0gdG8gQW5zd2VyCisJCQkJCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQoIGFucywgTVNHX0JSV19MQVNUX0NISUxELCBhdXRoZGF0YWl0ZW0gKSApOworCQkJCQkJCQkKKwkJCQkJCQkJCisJCQkJCQkJCWlmKHVzZXJuYW1lIT1OVUxMICYmIGF1dGhlbnRpY2F0aW9ucGVuZGluZykKKwkJCQkJCQkJeworCQkJCQkJCQkJLy9XZSBjbGVhciB0aGUgcGVuZGluZyBmbGFnCisJCQkJCQkJCQljbGVhcl9wZW5kaW5nX2ZsYWcodXNlcm5hbWUsIHVzZXJuYW1lbGVuKTsKKwkJCQkJCQkJfQorCQkJCQkJCQkKKwkJCQkJCQkJaWYoc2lwdXJpbm90c3RvcmVkKQorCQkJCQkJCQkJcmVzdWx0PSJESUFNRVRFUl9TVUNDRVNTX1NFUlZFUl9OQU1FX05PVF9TVE9SRUQiOworCQkJCQkJCQllbHNlCisJCQkJCQkJCQlyZXN1bHQ9IkRJQU1FVEVSX1NVQ0NFU1MiOworCQkJCQkJCQlmb3VuZF9jbm9uY2U9MDsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQkJVFJBQ0VfREVCVUcoSU5GTywiTm8gYXV0aCBkYXRhIGl0ZW1zISIpOworCQkJCX0KKwkJCQkvKkFkZCBTSVBfTnVtYmVyX0F1dGhfSXRlbXMgIEFWUCAqLworCQkJCXsKKwkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIHNpcF9kaWN0LlNJUF9OdW1iZXJfQXV0aF9JdGVtcywgMCwgJmF2cCApICk7CisJCQkJCXZhbC5pMzIgPSBudW1iZXJfb2ZfYXV0aF9pdGVtczsKKwkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX3NldHZhbHVlICggYXZwLCAmdmFsICkgKTsKKwkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCAoIGFucywgTVNHX0JSV19MQVNUX0NISUxELCBhdnApICk7CisJCQkJfQorCQkJCQorCQkJCQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCVRSQUNFX0RFQlVHKElORk8sIldlIG9ubHkgc3VwcG9ydCBESUdFU1QgZm9yIG5vdywgdW5hYmxlIHRvIGNvbXBseSIpOworCQkJCXJlc3VsdD0iRElBTUVURVJfRVJST1JfQVVUSF9TQ0hFTUVfTk9UX1NVUFBPUlRFRCI7CisJCQkJaWYodXNlcm5hbWUhPU5VTEwpCisJCQkJCWZyZWUodXNlcm5hbWUpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisJfQorCWVsc2UKKwl7CisJCS8vVE9ETzogcmVtb3ZlIHRoaXMgYmVjYXVzZSBOdW1iZXJfQXV0aF9JdGVtcyBpcyBub3QgY29tcHVsc29yeQorCQlUUkFDRV9ERUJVRyhGVUxMLCJOdW1iZXItQXV0aC1JdGVtcyBpcyBub3QgaW5jbHVkZWQuIik7CisJCXJlc3VsdD0iRElBTUVURVJfVU5BQkxFX1RPX0NPTVBMWSI7CisJCWlmKHVzZXJuYW1lIT1OVUxMKQorCQkJZnJlZSh1c2VybmFtZSk7CisJCWdvdG8gb3V0OworCX0KKwkKKwlpZih1c2VybmFtZSE9TlVMTCkKKwkJZnJlZSh1c2VybmFtZSk7CisJCisKK291dDoKKwkvKiBTZXQgdGhlIE9yaWdpbi1Ib3N0LCBPcmlnaW4tUmVhbG0sIFJlc3VsdC1Db2RlIEFWUHMgKi8KKwlDSEVDS19GQ1QoIGZkX21zZ19yZXNjb2RlX3NldCggYW5zLCByZXN1bHQsIE5VTEwsIE5VTEwsIDEgKSApOworCQorCQorCS8qIFNlbmQgdGhlIGFuc3dlciAqLworCUNIRUNLX0ZDVCggZmRfbXNnX3NlbmQoIG1zZywgTlVMTCwgTlVMTCApICk7CisJCisJCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2FwcF9zaXAvcHVzaHByb2ZpbGUuYyBiL2V4dGVuc2lvbnMvYXBwX3NpcC9wdXNocHJvZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MjMzZWQKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2FwcF9zaXAvcHVzaHByb2ZpbGUuYwpAQCAtMCwwICsxLDMxOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IEFsZXhhbmRyZSBXZXN0ZmFobCA8YXdlc3RmYWhsQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDEwLCBBbGV4YW5kcmUgV2VzdGZhaGwsIFRlcmFva2EgTGFib3JhdG9yeSAoS2VpbyBVbml2ZXJzaXR5KSwgYW5kIHRoZSBXSURFIFByb2plY3QuIAkgKgkJCisqCQkJCQkJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFRlcmFva2EgTGFib3JhdG9yeSBub3IgdGhlIAkJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBUZXJhb2thIExhYm9yYXRvcnkgCQkJCQkJICoKKyogICAJCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJhcHBfc2lwLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KK3R5cGVkZWYgaW50IFNPQ0tFVDsKK3R5cGVkZWYgc3RydWN0IHNvY2thZGRyX2luIFNPQ0tBRERSX0lOOwordHlwZWRlZiBzdHJ1Y3Qgc29ja2FkZHIgU09DS0FERFI7CisKKy8vUHJvY2VkdXJlIHdoaWNoIGFsd2F5cyB3YWl0IGZvciBkYXRhIG9uIHNvY2tldCAKK3ZvaWQgKnBwcl9zb2NrZXQodm9pZCAqYXJnKQoreworCQorCVNPQ0tFVCBzb2NrOworICAgIFNPQ0tBRERSX0lOIHNpbiwgY3NpbjsKKyAgICBzdHJ1Y3QgcHByc2lwYW9yIHBwcnNpcDsKKyAgICBpbnQgcmN2Ynl0ZXM9MDsKKwlzb2NrID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKTsKKwlzaW4uc2luX2FkZHIuc19hZGRyID0gaW5ldF9hZGRyKCIxMjcuMC4wLjEiKTsKKyAgICBzaW4uc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJc2luLnNpbl9wb3J0ID0gaHRvbnMoYXNfY29uZi0+cHByX3BvcnQpOworICAgIHNvY2tsZW5fdCBzaW5zaXplID0gc2l6ZW9mKGNzaW4pOworCWludCBhY2NlcHRlZD0wOworCisgICAgCisJaWYoIWJpbmQoc29jaywgKFNPQ0tBRERSKikmc2luLCBzaXplb2Yoc2luKSkpCisJeworCQlpZihsaXN0ZW4oc29jaywxKSkKKwkJeworCQkJVFJBQ0VfREVCVUcoSU5GTywiRVJST1Igb24gbGlzdGVuISIpOworCQl9CisJCQorCQl3aGlsZSgxKQorCQl7CisJCQlhY2NlcHRlZD1hY2NlcHQoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSZjc2luLCZzaW5zaXplKTsKKwkJCWlmKGFjY2VwdGVkPi0xKQorCQkJeworCQkJCXJjdmJ5dGVzPXJlY3YoYWNjZXB0ZWQsICZwcHJzaXAsIHNpemVvZihzdHJ1Y3QgcHByc2lwYW9yKSwwKTsKKwkJCQkKKwkJCQlpZihyY3ZieXRlcz4tMSkKKwkJCQl7CisJCQkJCS8vV2UgcmVjZWl2ZWQgc29tZXRoaW5nLCB3ZSBjYW4gc2VuZCBhbiBQUFIKKwkJCQkJYXBwX3NpcF9QUFJfY2IoJnBwcnNpcCk7CisJCQkJfQorCQkJfQorCQl9CisJCQorCQkKKwl9CisJZWxzZQorCQlUUkFDRV9ERUJVRyhJTkZPLCJDYW4ndCBjcmVhdGUgc29ja2V0ISIpOworCisJCisJcHRocmVhZF9leGl0KE5VTEwpOworCQorfQorLy9DYWxsZWQgdG8gc2VuZCBhIFBQUgoraW50IGFwcF9zaXBfUFBSX2NiKHN0cnVjdCBwcHJzaXBhb3IgKnN0cnVjdHVyZSkKK3sKKwkvKgorCVRSQUNFX0VOVFJZKCIlcCIsIHN0cnVjdHVyZSk7CisJCisJaW50IGdvdF91c2VybmFtZT0wOworCWludCBnb3Rfc3RyZWFzb249MDsKKwlpbnQgbnVtX2Fvcj0wOy8vSG93IG1hbnkgU0lQLUFPUj8KKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBydHJfbW9kZWw9TlVMTDsKKwlzdHJ1Y3QgbXNnICogbWVzc2FnZT1OVUxMOworCXN0cnVjdCBhdnAgKmdyb3VwZWRhdnA9TlVMTCwgKmF2cD1OVUxMOworCXN0cnVjdCBzZXNzaW9uICpzZXNzPU5VTEw7CisJdW5pb24gYXZwX3ZhbHVlIHZhbHVlOworCQorCS8vV2UgbXVzdCBjaGVjayB0aGF0IHdlIGhhdmUgYWxsIG5lZWRlZCB2YWx1ZSBpbiBzdHJ1Y3R1cmUKKwlpZihzdHJ1Y3R1cmUudXNlcm5hbWVbMF0hPSdcMCcpCisJCWdvdF91c2VybmFtZT0xOworCQorCWlmKHN0cnVjdHVyZS5zaXBfYW9yMVswXSE9J1wwJykKKwl7CQorCQludW1fYW9yKys7CisJCWlmKHN0cnVjdHVyZS5zaXBfYW9yMlswXSE9J1wwJykKKwkJeworCQkJbnVtX2FvcisrOworCQkJaWYoc3RydWN0dXJlLnNpcF9hb3IzWzBdIT0nXDAnKQorCQkJCW51bV9hb3IrKzsKKwkJfQorCX0KKwkKKwlpZihzdHJ1Y3R1cmUuc3RycmVhc29uIT0nXDAnKQorCQlnb3Rfc3RyZWFzb249MTsKKwkKKwkKKwlUUkFDRV9ERUJVRyhJTkZPLCJXZSBoYXZlICVkIFNJUF9BT1IiLG51bV9hb3IpOworCQorCWlmKChnb3RfdXNlcm5hbWUgKyBudW1fYW9yKT09MCkKKwl7CisJCS8vV2UgbXVzdCBoYXZlIGEgbGVhc3QgYSBTSVBfQU9SIG9yIGEgVXNlcm5hbWUKKwkJVFJBQ0VfREVCVUcoSU5GTywiQ2FuIG5vdCBwcm9jZWVkIGJlY2F1c2UgdGhlcmUgaXMgbm8gU0lQX0FPUiBvciBVc2VybmFtZSIpOworCQlyZXR1cm4gRUlOVkFMOworCX0KKwlpZihzdHJ1Y3R1cmUucmVhc29uPDApCisJeworCQkvL1dlIG11c3QgaGF2ZSBhIGxlYXN0IGEgU0lQX0FPUiBvciBhIFVzZXJuYW1lCisJCVRSQUNFX0RFQlVHKElORk8sIkluY29ycmVjdCBSZWFzb24tQ29kZSIpOworCQlyZXR1cm4gRUlOVkFMOworCX0KKwkKKwlpZihzdHJ1Y3R1cmUuZGVzdGhvc3RbMF09PSdcMCcpCisJeworCQkvL1dlIG11c3QgaGF2ZSBhIGxlYXN0IGEgU0lQX0FPUiBvciBhIFVzZXJuYW1lCisJCVRSQUNFX0RFQlVHKElORk8sIk5vIERlc3RpbmF0aW9uX0hvc3Qgd2FzIHByb3ZpZGVkISIpOworCQlyZXR1cm4gRUlOVkFMOworCX0KKwkvL0NyZWF0ZSB0aGUgYmFzZSBtZXNzYWdlIGZvciBhbiBSVFIKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJSZWdpc3RyYXRpb24tVGVybWluYXRpb24tUmVxdWVzdCIsICZydHJfbW9kZWwsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX21zZ19uZXcgKHJ0cl9tb2RlbCwgMCwgJm1lc3NhZ2UpKTsKKwkKKwkvLyBDcmVhdGUgYSBuZXcgc2Vzc2lvbiAKKwl7CisJCUNIRUNLX0ZDVCggZmRfc2Vzc19uZXcoICZzZXNzLCBmZF9nX2NvbmZpZy0+Y25mX2RpYW1pZCwgImFwcF9zaXAiLCA3ICkpOworCQljaGFyICogc2lkOworCQlDSEVDS19GQ1QoIGZkX3Nlc3NfZ2V0c2lkICggc2VzcywgJnNpZCApKTsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIHNpcF9kaWN0LlNlc3Npb25fSWQsIDAsICZhdnAgKSk7CisJCXZhbHVlLm9zLmRhdGEgPSAodWludDhfdCAqKXNpZDsKKwkJdmFsdWUub3MubGVuICA9IHN0cmxlbihzaWQpOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUoIGF2cCwgJnZhbHVlICkpOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkKCBtZXNzYWdlLCBNU0dfQlJXX0ZJUlNUX0NISUxELCBhdnAgKSk7CisJfQorCQorCQorCS8vQXV0aF9TZXNzaW9uX1N0YXRlCisJeworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3ICggc2lwX2RpY3QuQXV0aF9TZXNzaW9uX1N0YXRlLCAwLCAmYXZwICkgKTsKKwkJdmFsdWUuaTMyPTE7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9zZXR2YWx1ZSggYXZwLCAmdmFsdWUgKSApOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkKCBtZXNzYWdlLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCApICk7CisJfQorCQorCS8vT3JpZ2luX0hvc3QgJiBPcmlnaW5fUmVhbG0KKwlDSEVDS19GQ1QoIGZkX21zZ19hZGRfb3JpZ2luICggbWVzc2FnZSwgMCApKTsKKwkKKwkvL0Rlc3RpbmF0aW9uX0hvc3QKKwl7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBzaXBfZGljdC5EZXN0aW5hdGlvbl9Ib3N0LCAwLCAmYXZwICkgKTsKKwkJdmFsdWUub3MuZGF0YT0odW5zaWduZWQgY2hhciAqKXN0cnVjdHVyZS5kZXN0aG9zdDsKKwkJdmFsdWUub3MubGVuPShzaXplX3Qpc3RybGVuKHN0cnVjdHVyZS5kZXN0aG9zdCk7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9zZXR2YWx1ZSggYXZwLCAmdmFsdWUgKSApOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkKCBtZXNzYWdlLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCApICk7CisJfQorCQorCQorCS8vU0lQIERlcmVnaXN0cmF0aW9uIFJlYXNvbiAoR3JvdXBlZCBBVlApCisJeworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3ICggc2lwX2RpY3QuU0lQX0RlcmVnaXN0cmF0aW9uX1JlYXNvbiwgMCwgJmdyb3VwZWRhdnAgKSApOworCQkKKwkJLy9SZWFzb24gQ29kZQorCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3ICggc2lwX2RpY3QuU0lQX1JlYXNvbl9Db2RlLCAwLCAmYXZwICkgKTsKKwkJdmFsdWUuaTMyPXN0cnVjdHVyZS5yZWFzb247CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9zZXR2YWx1ZSggYXZwLCAmdmFsdWUgKSApOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkKCBncm91cGVkYXZwLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCApICk7CisJCQorCQlpZihnb3Rfc3RyZWFzb24pCisJCXsKKwkJCS8vUmVhc29uIEluZm8KKwkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBzaXBfZGljdC5TSVBfUmVhc29uX0luZm8sIDAsICZhdnAgKSApOworCQkJdmFsdWUub3MuZGF0YT0odW5zaWduZWQgY2hhciAqKXN0cnVjdHVyZS5zdHJyZWFzb247CisJCQl2YWx1ZS5vcy5sZW49KHNpemVfdClzdHJsZW4oc3RydWN0dXJlLnN0cnJlYXNvbik7CisJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUoIGF2cCwgJnZhbHVlICkgKTsKKwkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQoIGdyb3VwZWRhdnAsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwICkgKTsKKwkJfQorCQkKKwkJLy9XZSBhZGQgdGhlIGdyb3VwZWQgQVZQIHRvIHRoZSBtZXNzYWdlCisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQoIG1lc3NhZ2UsIE1TR19CUldfTEFTVF9DSElMRCwgZ3JvdXBlZGF2cCApICk7CisJfQorCQorCS8vVXNlcm5hbWUKKwl7CisJCWlmKGdvdF91c2VybmFtZSkKKwkJeworCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIHNpcF9kaWN0LlVzZXJfTmFtZSwgMCwgJmF2cCApICk7CisJCQl2YWx1ZS5vcy5kYXRhPSh1bnNpZ25lZCBjaGFyICopc3RydWN0dXJlLnVzZXJuYW1lOworCQkJdmFsdWUub3MubGVuPShzaXplX3Qpc3RybGVuKHN0cnVjdHVyZS51c2VybmFtZSk7CisJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUoIGF2cCwgJnZhbHVlICkgKTsKKwkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQoIG1lc3NhZ2UsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwICkgKTsKKwkJfQorCX0KKwkKKwkvL1NJUF9BT1IKKwl7CisJCWlmKG51bV9hb3I+MCkKKwkJeworCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIHNpcF9kaWN0LlNJUF9BT1IsIDAsICZhdnAgKSApOworCQkJdmFsdWUub3MuZGF0YT0odW5zaWduZWQgY2hhciAqKXN0cnVjdHVyZS5zaXBfYW9yMTsKKwkJCXZhbHVlLm9zLmxlbj0oc2l6ZV90KXN0cmxlbihzdHJ1Y3R1cmUuc2lwX2FvcjEpOworCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX3NldHZhbHVlKCBhdnAsICZ2YWx1ZSApICk7CisJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkKCBtZXNzYWdlLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCApICk7CisJCQlpZihudW1fYW9yPjEpCisJCQl7CisJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIHNpcF9kaWN0LlNJUF9BT1IsIDAsICZhdnAgKSApOworCQkJCXZhbHVlLm9zLmRhdGE9KHVuc2lnbmVkIGNoYXIgKilzdHJ1Y3R1cmUuc2lwX2FvcjI7CisJCQkJdmFsdWUub3MubGVuPShzaXplX3Qpc3RybGVuKHN0cnVjdHVyZS5zaXBfYW9yMik7CisJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX3NldHZhbHVlKCBhdnAsICZ2YWx1ZSApICk7CisJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCggbWVzc2FnZSwgTVNHX0JSV19MQVNUX0NISUxELCBhdnAgKSApOworCQkJCWlmKG51bV9hb3I+MikKKwkJCQl7CisJCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBzaXBfZGljdC5TSVBfQU9SLCAwLCAmYXZwICkgKTsKKwkJCQkJdmFsdWUub3MuZGF0YT0odW5zaWduZWQgY2hhciAqKXN0cnVjdHVyZS5zaXBfYW9yMzsKKwkJCQkJdmFsdWUub3MubGVuPShzaXplX3Qpc3RybGVuKHN0cnVjdHVyZS5zaXBfYW9yMyk7CisJCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9zZXR2YWx1ZSggYXZwLCAmdmFsdWUgKSApOworCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkKCBtZXNzYWdlLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCApICk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCQorCWZkX21zZ19kdW1wX3dhbGsoSU5GTyxtZXNzYWdlKTsKKwlDSEVDS19GQ1QoIGZkX21zZ19zZW5kKCAmbWVzc2FnZSwgTlVMTCwgTlVMTCApKTsKKwkqLworCXJldHVybiAwOworfQorCisvL0NhbGxlZCB3aGVuIGFuIFBQQSBhcnJpdmUKK2ludCBhcHBfc2lwX1BQQV9jYiggc3RydWN0IG1zZyAqKiBtc2csIHN0cnVjdCBhdnAgKiBwYXJhbWF2cCwgc3RydWN0IHNlc3Npb24gKiBzZXNzLCB2b2lkICogb3BhcXVlLCBlbnVtIGRpc3BfYWN0aW9uICogYWN0KQoreworCS8vVE9ETzogUFBBIHJlY2VwdGlvbgorLyoKKwkvL1RPRE86cmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMKKwlzdHJ1Y3QgbXNnICphbnMsICpxcnk7CisJc3RydWN0IGF2cCAqYXZwLCAqYTIsICphdXRoZGF0YWl0ZW07CisJc3RydWN0IG1zZ19oZHIgKiBoZWFkZXIgPSBOVUxMOworCXN0cnVjdCBhdnBfaGRyICogYXZwaGRyPU5VTEwsICphdnBoZWFkZXI9TlVMTCwgKmF2cGhlYWRlcl9hdXRoPU5VTEwsKmRpZ2VzdGhlYWRlcj1OVUxMOworCXVuaW9uIGF2cF92YWx1ZSB2YWw7CisJaW50IGZvdW5kX2Nub25jZT0wOworCXN0cnVjdCBhdnAgKiB0ZW1wYXZwPU5VTEwsKnNpcEF1dGhlbnRpY2F0aW9uPU5VTEwsKnNpcEF1dGhlbnRpY2F0ZT1OVUxMOworCWNoYXIgKiByZXN1bHQ7CisJaW50IGlkeD0wLCBpZHgyPTAsIG51bWJlcl9vZl9hdXRoX2l0ZW1zPTAsaT0wOworCS8vRmxhZ3MgYW5kIHZhcmlhYmxlcyBmb3IgRGF0YWJhc2UKKwlpbnQgc2lwdXJpbm90c3RvcmVkPTAsIGF1dGhlbnRpY2F0aW9ucGVuZGluZz0wLCBxdWVyeWxlbj0wLCB1c2VybmFtZWxlbj0wOworCWNoYXIgKnF1ZXJ5PU5VTEwsKnVzZXJuYW1lPU5VTEw7CisJCisJCisJCisJVFJBQ0VfRU5UUlkoIiVwICVwICVwICVwIiwgbXNnLCBhdnAsIHNlc3MsIGFjdCk7CisJCisJaWYgKG1zZyA9PSBOVUxMKQorCQlyZXR1cm4gRUlOVkFMOworCQorCQorCS8vIENyZWF0ZSBhbnN3ZXIgaGVhZGVyIAorCXFyeSA9ICptc2c7CisJQ0hFQ0tfRkNUKCBmZF9tc2dfbmV3X2Fuc3dlcl9mcm9tX3JlcSAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgbXNnLCAwICkgKTsKKwlhbnMgPSAqbXNnOwkKKwkKKwkKKwkvLyBBZGQgdGhlIEF1dGgtU2Vzc2lvbi1TdGF0ZSBBVlAgCisJeworCQkKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfc2VhcmNoX2F2cCAoIHFyeSwgc2lwX2RpY3QuQXV0aF9TZXNzaW9uX1N0YXRlLCAmYXZwKSApOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfaGRyKCBhdnAsICZhdnBoZHIgKSAgKTsKKwkJCisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBzaXBfZGljdC5BdXRoX1Nlc3Npb25fU3RhdGUsIDAsICZhdnAgKSApOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUoIGF2cCwgYXZwaGRyLT5hdnBfdmFsdWUgKSApOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkKCBhbnMsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwICkgKTsKKwl9CisJCisJQ0hFQ0tfRkNUKCBmZF9tc2dfc2VhcmNoX2F2cCAoIHFyeSwgc2lwX2RpY3QuU0lQX0RlcmVnaXN0cmF0aW9uX1JlYXNvbiwgJmF2cCkgKTsKKwlDSEVDS19GQ1QoIGZkX21zZ19hdnBfaGRyKCBhdnAsICZhdnBoZHIgKSAgKTsKKwkKKwkKKwkKKwkKKwkKKwkKKwkKKwkKKwkKKwkKKwkKKwkKKwkKKwkqLworCXJldHVybiAwOworCQorfQorCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2FwcF9zaXAvcmVnaXN0cmF0aW9udGVybWluYXRpb24uYyBiL2V4dGVuc2lvbnMvYXBwX3NpcC9yZWdpc3RyYXRpb250ZXJtaW5hdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMDA0NjcKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2FwcF9zaXAvcmVnaXN0cmF0aW9udGVybWluYXRpb24uYwpAQCAtMCwwICsxLDMxNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IEFsZXhhbmRyZSBXZXN0ZmFobCA8YXdlc3RmYWhsQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDEwLCBBbGV4YW5kcmUgV2VzdGZhaGwsIFRlcmFva2EgTGFib3JhdG9yeSAoS2VpbyBVbml2ZXJzaXR5KSwgYW5kIHRoZSBXSURFIFByb2plY3QuIAkgKgkJCisqCQkJCQkJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFRlcmFva2EgTGFib3JhdG9yeSBub3IgdGhlIAkJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBUZXJhb2thIExhYm9yYXRvcnkgCQkJCQkJICoKKyogICAJCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJhcHBfc2lwLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KK3R5cGVkZWYgaW50IFNPQ0tFVDsKK3R5cGVkZWYgc3RydWN0IHNvY2thZGRyX2luIFNPQ0tBRERSX0lOOwordHlwZWRlZiBzdHJ1Y3Qgc29ja2FkZHIgU09DS0FERFI7CisKKy8vUHJvY2VkdXJlIHdoaWNoIGFsd2F5cyB3YWl0IGZvciBkYXRhIG9uIHNvY2tldCAKK3ZvaWQgKnJ0cl9zb2NrZXQodm9pZCAqYXJnKQoreworCVNPQ0tFVCBzb2NrOworCVNPQ0tBRERSX0lOIHNpbiwgY3NpbjsKKwlzdHJ1Y3QgcnRyc2lwYW9yIHJ0cnNpcDsKKwlpbnQgcmN2Ynl0ZXM9MDsKKwlzb2NrID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKTsKKwlzaW4uc2luX2FkZHIuc19hZGRyID0gaW5ldF9hZGRyKCIxMjcuMC4wLjEiKTsKKwlzaW4uc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJc2luLnNpbl9wb3J0ID0gaHRvbnMoYXNfY29uZi0+cnRyX3BvcnQpOworCXNvY2tsZW5fdCBzaW5zaXplID0gc2l6ZW9mKGNzaW4pOworCWludCBhY2NlcHRlZD0wOworCisJaWYoIWJpbmQoc29jaywgKFNPQ0tBRERSKikmc2luLCBzaXplb2Yoc2luKSkpCisJeworCQlpZihsaXN0ZW4oc29jaywxKSkKKwkJeworCQkJVFJBQ0VfREVCVUcoSU5GTywiRVJST1Igb24gbGlzdGVuISIpOworCQl9CisJCQorCQl3aGlsZSgxKQorCQl7CisJCQlhY2NlcHRlZD1hY2NlcHQoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSZjc2luLCZzaW5zaXplKTsKKwkJCWlmKGFjY2VwdGVkPi0xKQorCQkJeworCQkJCXJjdmJ5dGVzPXJlY3YoYWNjZXB0ZWQsICZydHJzaXAsIHNpemVvZihzdHJ1Y3QgcnRyc2lwYW9yKSwwKTsKKwkJCQkKKwkJCQlpZihyY3ZieXRlcz4tMSkKKwkJCQl7CisJCQkJCS8vV2UgcmVjZWl2ZWQgc29tZXRoaW5nLCB3ZSBjYW4gc2VuZCBhbiBSVFIKKwkJCQkJYXBwX3NpcF9SVFJfY2IoJnJ0cnNpcCk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCWVsc2UKKwkJVFJBQ0VfREVCVUcoSU5GTywiQ2FuJ3QgY3JlYXRlIHNvY2tldCEiKTsKKworCQorCXB0aHJlYWRfZXhpdChOVUxMKTsKKwkKK30KKy8vQ2FsbGVkIHRvIHNlbmQgYSBSVFIKK2ludCBhcHBfc2lwX1JUUl9jYihzdHJ1Y3QgcnRyc2lwYW9yICpzdHJ1Y3R1cmUpCit7CisJVFJBQ0VfRU5UUlkoIiVwIiwgc3RydWN0dXJlKTsKKwkKKwlpbnQgZ290X3VzZXJuYW1lPTA7CisJaW50IGdvdF9zdHJlYXNvbj0wOworCWludCBudW1fYW9yPTA7Ly9Ib3cgbWFueSBTSVAtQU9SPworCXN0cnVjdCBkaWN0X29iamVjdCAqIHJ0cl9tb2RlbD1OVUxMOworCXN0cnVjdCBtc2cgKiBtZXNzYWdlPU5VTEw7CisJc3RydWN0IGF2cCAqZ3JvdXBlZGF2cD1OVUxMLCAqYXZwPU5VTEw7CisJdW5pb24gYXZwX3ZhbHVlIHZhbHVlOworCQorCS8vV2UgbXVzdCBjaGVjayB0aGF0IHdlIGhhdmUgYWxsIG5lZWRlZCB2YWx1ZSBpbiBzdHJ1Y3R1cmUKKwlpZihzdHJ1Y3R1cmUtPnVzZXJuYW1lWzBdIT0nXDAnKQorCQlnb3RfdXNlcm5hbWU9MTsKKwkKKwlpZihzdHJ1Y3R1cmUtPnNpcF9hb3IxWzBdIT0nXDAnKQorCXsJCisJCW51bV9hb3IrKzsKKwkJaWYoc3RydWN0dXJlLT5zaXBfYW9yMlswXSE9J1wwJykKKwkJeworCQkJbnVtX2FvcisrOworCQkJaWYoc3RydWN0dXJlLT5zaXBfYW9yM1swXSE9J1wwJykKKwkJCQludW1fYW9yKys7CisJCX0KKwl9CisJCisJaWYoc3RydWN0dXJlLT5zdHJyZWFzb24hPSdcMCcpCisJCWdvdF9zdHJlYXNvbj0xOworCQorCQorCVRSQUNFX0RFQlVHKEZVTEwsIlJlcXVlc3QgZm9yICVkIFNJUF9BT1IgdG8gYmUgZGVyZWdpc3RyZWQuIixudW1fYW9yKTsKKwkKKwlpZigoZ290X3VzZXJuYW1lICsgbnVtX2Fvcik9PTApCisJeworCQkvL1dlIG11c3QgaGF2ZSBhIGxlYXN0IGEgU0lQX0FPUiBvciBhIFVzZXJuYW1lCisJCVRSQUNFX0RFQlVHKElORk8sIkNhbiBub3QgcHJvY2VlZCBiZWNhdXNlIHRoZXJlIGlzIG5vIFNJUF9BT1Igb3IgVXNlcm5hbWUiKTsKKwkJcmV0dXJuIEVJTlZBTDsKKwl9CisJaWYoc3RydWN0dXJlLT5yZWFzb248MCkKKwl7CisJCS8vV2UgbXVzdCBoYXZlIGEgbGVhc3QgYSBTSVBfQU9SIG9yIGEgVXNlcm5hbWUKKwkJVFJBQ0VfREVCVUcoSU5GTywiSW5jb3JyZWN0IFJlYXNvbi1Db2RlIik7CisJCXJldHVybiBFSU5WQUw7CisJfQorCQorCWlmKHN0cnVjdHVyZS0+ZGVzdGhvc3RbMF09PSdcMCcpCisJeworCQkvL1dlIG11c3QgaGF2ZSBhIGxlYXN0IGEgU0lQX0FPUiBvciBhIFVzZXJuYW1lCisJCVRSQUNFX0RFQlVHKElORk8sIk5vIERlc3RpbmF0aW9uX0hvc3Qgd2FzIHByb3ZpZGVkISIpOworCQlyZXR1cm4gRUlOVkFMOworCX0KKwkvL0NyZWF0ZSB0aGUgYmFzZSBtZXNzYWdlIGZvciBhbiBSVFIKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJSZWdpc3RyYXRpb24tVGVybWluYXRpb24tUmVxdWVzdCIsICZydHJfbW9kZWwsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX21zZ19uZXcgKHJ0cl9tb2RlbCwgMCwgJm1lc3NhZ2UpKTsKKwkKKwkvLyBDcmVhdGUgYSBuZXcgc2Vzc2lvbiAKKwl7CisJCSNkZWZpbmUgQVBQX1NJUF9TSURfT1BUICAiYXBwX3NpcCIKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfbmV3X3Nlc3Npb24oIG1lc3NhZ2UsIChvczBfdClBUFBfU0lQX1NJRF9PUFQsIENPTlNUU1RSTEVOKEFQUF9TSVBfU0lEX09QVCkgKSApOworCX0KKwkKKwkvL0FkZCB0aGUgQXV0aC1BcHBsaWNhdGlvbi1JZCAKKwl7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBzaXBfZGljdC5BdXRoX0FwcGxpY2F0aW9uX0lkLCAwLCAmYXZwICkgKTsKKwkJdmFsdWUuaTMyID0gNjsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX3NldHZhbHVlICggYXZwLCAmdmFsdWUgKSApOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkICggbWVzc2FnZSwgTVNHX0JSV19MQVNUX0NISUxELCBhdnApICk7CisJfQorCQorCS8vQXV0aF9TZXNzaW9uX1N0YXRlCisJeworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3ICggc2lwX2RpY3QuQXV0aF9TZXNzaW9uX1N0YXRlLCAwLCAmYXZwICkgKTsKKwkJdmFsdWUuaTMyPTE7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9zZXR2YWx1ZSggYXZwLCAmdmFsdWUgKSApOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkKCBtZXNzYWdlLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCApICk7CisJfQorCQorCS8vT3JpZ2luX0hvc3QgJiBPcmlnaW5fUmVhbG0KKwlDSEVDS19GQ1QoIGZkX21zZ19hZGRfb3JpZ2luICggbWVzc2FnZSwgMCApKTsKKwkKKwkvL0Rlc3RpbmF0aW9uX0hvc3QKKwl7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBzaXBfZGljdC5EZXN0aW5hdGlvbl9Ib3N0LCAwLCAmYXZwICkgKTsKKwkJdmFsdWUub3MuZGF0YT0odW5zaWduZWQgY2hhciAqKXN0cnVjdHVyZS0+ZGVzdGhvc3Q7CisJCXZhbHVlLm9zLmxlbj0oc2l6ZV90KXN0cmxlbihzdHJ1Y3R1cmUtPmRlc3Rob3N0KTsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX3NldHZhbHVlKCBhdnAsICZ2YWx1ZSApICk7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQoIG1lc3NhZ2UsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwICkgKTsKKwl9CisJCisJCisJLy9TSVAgRGVyZWdpc3RyYXRpb24gUmVhc29uIChHcm91cGVkIEFWUCkKKwl7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBzaXBfZGljdC5TSVBfRGVyZWdpc3RyYXRpb25fUmVhc29uLCAwLCAmZ3JvdXBlZGF2cCApICk7CisJCQorCQkvL1JlYXNvbiBDb2RlCisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBzaXBfZGljdC5TSVBfUmVhc29uX0NvZGUsIDAsICZhdnAgKSApOworCQl2YWx1ZS5pMzI9c3RydWN0dXJlLT5yZWFzb247CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9zZXR2YWx1ZSggYXZwLCAmdmFsdWUgKSApOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkKCBncm91cGVkYXZwLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCApICk7CisJCQorCQlpZihnb3Rfc3RyZWFzb24pCisJCXsKKwkJCS8vUmVhc29uIEluZm8KKwkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBzaXBfZGljdC5TSVBfUmVhc29uX0luZm8sIDAsICZhdnAgKSApOworCQkJdmFsdWUub3MuZGF0YT0odW5zaWduZWQgY2hhciAqKXN0cnVjdHVyZS0+c3RycmVhc29uOworCQkJdmFsdWUub3MubGVuPShzaXplX3Qpc3RybGVuKHN0cnVjdHVyZS0+c3RycmVhc29uKTsKKwkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9zZXR2YWx1ZSggYXZwLCAmdmFsdWUgKSApOworCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCggZ3JvdXBlZGF2cCwgTVNHX0JSV19MQVNUX0NISUxELCBhdnAgKSApOworCQl9CisJCQorCQkvL1dlIGFkZCB0aGUgZ3JvdXBlZCBBVlAgdG8gdGhlIG1lc3NhZ2UKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCggbWVzc2FnZSwgTVNHX0JSV19MQVNUX0NISUxELCBncm91cGVkYXZwICkgKTsKKwl9CisJCisJLy9Vc2VybmFtZQorCXsKKwkJaWYoZ290X3VzZXJuYW1lKQorCQl7CisJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3ICggc2lwX2RpY3QuVXNlcl9OYW1lLCAwLCAmYXZwICkgKTsKKwkJCXZhbHVlLm9zLmRhdGE9KHVuc2lnbmVkIGNoYXIgKilzdHJ1Y3R1cmUtPnVzZXJuYW1lOworCQkJdmFsdWUub3MubGVuPShzaXplX3Qpc3RybGVuKHN0cnVjdHVyZS0+dXNlcm5hbWUpOworCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX3NldHZhbHVlKCBhdnAsICZ2YWx1ZSApICk7CisJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkKCBtZXNzYWdlLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCApICk7CisJCX0KKwl9CisJCisJLy9TSVBfQU9SCisJeworCQlpZihudW1fYW9yPjApCisJCXsKKwkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBzaXBfZGljdC5TSVBfQU9SLCAwLCAmYXZwICkgKTsKKwkJCXZhbHVlLm9zLmRhdGE9KHVuc2lnbmVkIGNoYXIgKilzdHJ1Y3R1cmUtPnNpcF9hb3IxOworCQkJdmFsdWUub3MubGVuPShzaXplX3Qpc3RybGVuKHN0cnVjdHVyZS0+c2lwX2FvcjEpOworCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX3NldHZhbHVlKCBhdnAsICZ2YWx1ZSApICk7CisJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkKCBtZXNzYWdlLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCApICk7CisJCQlpZihudW1fYW9yPjEpCisJCQl7CisJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIHNpcF9kaWN0LlNJUF9BT1IsIDAsICZhdnAgKSApOworCQkJCXZhbHVlLm9zLmRhdGE9KHVuc2lnbmVkIGNoYXIgKilzdHJ1Y3R1cmUtPnNpcF9hb3IyOworCQkJCXZhbHVlLm9zLmxlbj0oc2l6ZV90KXN0cmxlbihzdHJ1Y3R1cmUtPnNpcF9hb3IyKTsKKwkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUoIGF2cCwgJnZhbHVlICkgKTsKKwkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkKCBtZXNzYWdlLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCApICk7CisJCQkJaWYobnVtX2Fvcj4yKQorCQkJCXsKKwkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIHNpcF9kaWN0LlNJUF9BT1IsIDAsICZhdnAgKSApOworCQkJCQl2YWx1ZS5vcy5kYXRhPSh1bnNpZ25lZCBjaGFyICopc3RydWN0dXJlLT5zaXBfYW9yMzsKKwkJCQkJdmFsdWUub3MubGVuPShzaXplX3Qpc3RybGVuKHN0cnVjdHVyZS0+c2lwX2FvcjMpOworCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUoIGF2cCwgJnZhbHVlICkgKTsKKwkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCggbWVzc2FnZSwgTVNHX0JSV19MQVNUX0NISUxELCBhdnAgKSApOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwkKKwkvL1RPRE86cmVtb3ZlIGZvciBkZWJ1ZworCS8vZmRfbXNnX2R1bXBfd2FsayhJTkZPLG1lc3NhZ2UpOworCUNIRUNLX0ZDVCggZmRfbXNnX3NlbmQoICZtZXNzYWdlLCBOVUxMLCBOVUxMICkpOworCQorCXJldHVybiAwOworfQorCisvL0NhbGxlZCB3aGVuIGFuIFJUQSBhcnJpdmUKK2ludCBhcHBfc2lwX1JUQV9jYiggc3RydWN0IG1zZyAqKiBtc2csIHN0cnVjdCBhdnAgKiBwYXJhbWF2cCwgc3RydWN0IHNlc3Npb24gKiBzZXNzLCB2b2lkICogb3BhcXVlLCBlbnVtIGRpc3BfYWN0aW9uICogYWN0KQoreworCS8vVE9ETzogUlRBIHJlY2VwdGlvbgorLyoKKwkvL1RPRE86cmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMKKwlzdHJ1Y3QgbXNnICphbnMsICpxcnk7CisJc3RydWN0IGF2cCAqYXZwLCAqYTIsICphdXRoZGF0YWl0ZW07CisJc3RydWN0IG1zZ19oZHIgKiBoZWFkZXIgPSBOVUxMOworCXN0cnVjdCBhdnBfaGRyICogYXZwaGRyPU5VTEwsICphdnBoZWFkZXI9TlVMTCwgKmF2cGhlYWRlcl9hdXRoPU5VTEwsKmRpZ2VzdGhlYWRlcj1OVUxMOworCXVuaW9uIGF2cF92YWx1ZSB2YWw7CisJaW50IGZvdW5kX2Nub25jZT0wOworCXN0cnVjdCBhdnAgKiB0ZW1wYXZwPU5VTEwsKnNpcEF1dGhlbnRpY2F0aW9uPU5VTEwsKnNpcEF1dGhlbnRpY2F0ZT1OVUxMOworCWNoYXIgKiByZXN1bHQ7CisJaW50IGlkeD0wLCBpZHgyPTAsIG51bWJlcl9vZl9hdXRoX2l0ZW1zPTAsaT0wOworCS8vRmxhZ3MgYW5kIHZhcmlhYmxlcyBmb3IgRGF0YWJhc2UKKwlpbnQgc2lwdXJpbm90c3RvcmVkPTAsIGF1dGhlbnRpY2F0aW9ucGVuZGluZz0wLCBxdWVyeWxlbj0wLCB1c2VybmFtZWxlbj0wOworCWNoYXIgKnF1ZXJ5PU5VTEwsKnVzZXJuYW1lPU5VTEw7CisJCisJCisJCisJVFJBQ0VfRU5UUlkoIiVwICVwICVwICVwIiwgbXNnLCBhdnAsIHNlc3MsIGFjdCk7CisJCisJaWYgKG1zZyA9PSBOVUxMKQorCQlyZXR1cm4gRUlOVkFMOworCQorCQorCS8vIENyZWF0ZSBhbnN3ZXIgaGVhZGVyIAorCXFyeSA9ICptc2c7CisJQ0hFQ0tfRkNUKCBmZF9tc2dfbmV3X2Fuc3dlcl9mcm9tX3JlcSAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgbXNnLCAwICkgKTsKKwlhbnMgPSAqbXNnOwkKKwkKKwkKKwkvLyBBZGQgdGhlIEF1dGgtU2Vzc2lvbi1TdGF0ZSBBVlAgCisJeworCQkKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfc2VhcmNoX2F2cCAoIHFyeSwgc2lwX2RpY3QuQXV0aF9TZXNzaW9uX1N0YXRlLCAmYXZwKSApOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfaGRyKCBhdnAsICZhdnBoZHIgKSAgKTsKKwkJCisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBzaXBfZGljdC5BdXRoX1Nlc3Npb25fU3RhdGUsIDAsICZhdnAgKSApOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUoIGF2cCwgYXZwaGRyLT5hdnBfdmFsdWUgKSApOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkKCBhbnMsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwICkgKTsKKwl9CisJCisJQ0hFQ0tfRkNUKCBmZF9tc2dfc2VhcmNoX2F2cCAoIHFyeSwgc2lwX2RpY3QuU0lQX0RlcmVnaXN0cmF0aW9uX1JlYXNvbiwgJmF2cCkgKTsKKwlDSEVDS19GQ1QoIGZkX21zZ19hdnBfaGRyKCBhdnAsICZhdnBoZHIgKSAgKTsKKwkKKwkKKwkKKwkKKwkKKwkKKwkKKwkKKwkKKwkKKwkKKwkKKwkKKwkqLworCXJldHVybiAwOworCQorfQorCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2FwcF9zaXAvc2VydmVyYXNzaWdubWVudC5jIGIvZXh0ZW5zaW9ucy9hcHBfc2lwL3NlcnZlcmFzc2lnbm1lbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTMxYTgxCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9hcHBfc2lwL3NlcnZlcmFzc2lnbm1lbnQuYwpAQCAtMCwwICsxLDQ4NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IEFsZXhhbmRyZSBXZXN0ZmFobCA8YXdlc3RmYWhsQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDEwLCBBbGV4YW5kcmUgV2VzdGZhaGwsIFRlcmFva2EgTGFib3JhdG9yeSAoS2VpbyBVbml2ZXJzaXR5KSwgYW5kIHRoZSBXSURFIFByb2plY3QuIAkgKgkJCisqCQkJCQkJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFRlcmFva2EgTGFib3JhdG9yeSBub3IgdGhlIAkJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBUZXJhb2thIExhYm9yYXRvcnkgCQkJCQkJICoKKyogICAJCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJhcHBfc2lwLmgiCisKKworaW50IGFwcF9zaXBfU0FSX2NiKCBzdHJ1Y3QgbXNnICoqIG1zZywgc3RydWN0IGF2cCAqIHBhcmFtYXZwLCBzdHJ1Y3Qgc2Vzc2lvbiAqIHNlc3MsIHZvaWQgKiBvcGFxdWUsIGVudW0gZGlzcF9hY3Rpb24gKiBhY3QpCit7CisJVFJBQ0VfRU5UUlkoIiVwICVwICVwICVwIiwgbXNnLCBwYXJhbWF2cCwgc2VzcywgYWN0KTsKKwkKKwlzdHJ1Y3QgbXNnICphbnMsICpxcnk7CisJc3RydWN0IGF2cCAqYXZwOworCXN0cnVjdCBhdnBfaGRyICphdnBoZHIsICpzaXBhb3JoZHIsICp1c2VybmFtZWhkciwgKnNpcHVzZXJkYXRhYWxyZWFkeWF2YWlsYWJsZTsKKwl1bmlvbiBhdnBfdmFsdWUgdmFsdWU7CisJaW50IHJldD0wLCBhc3NpZ25tZW50X3R5cGU9MCwgZ290X2RhdGF0eXBlPTE7CisJCisJCisJc3RydWN0IGxpc3RkYXRhdHlwZQorCXsKKwkJc3RydWN0IGZkX2xpc3QgZGF0YXR5cGU7CisJCWNoYXIgKiB0eXBlOworCQlzaXplX3QgdHlwZWxlbjsKKwl9OworCQorCS8vUmVzdWx0X0NvZGUgdG8gcmV0dXJuIGluIHRoZSBhbnN3ZXIKKwljaGFyIHJlc3VsdFs1NV07CisJCisJaWYgKG1zZyA9PSBOVUxMKQorCQlyZXR1cm4gRUlOVkFMOworCQorCQorCS8vIENyZWF0ZSBhbnN3ZXIgaGVhZGVyIAorCXFyeSA9ICptc2c7CisJQ0hFQ0tfRkNUKCBmZF9tc2dfbmV3X2Fuc3dlcl9mcm9tX3JlcSAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgbXNnLCAwICkgKTsKKwlhbnMgPSAqbXNnOworCQorCS8vQWRkIHRoZSBBdXRoLUFwcGxpY2F0aW9uLUlkIAorCXsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIHNpcF9kaWN0LkF1dGhfQXBwbGljYXRpb25fSWQsIDAsICZhdnAgKSApOworCQl2YWx1ZS5pMzIgPSA2OworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUgKCBhdnAsICZ2YWx1ZSApICk7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQgKCBhbnMsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwKSApOworCX0KKwkvLyBBZGQgdGhlIEF1dGgtU2Vzc2lvbi1TdGF0ZSBBVlAgCisJeworCQkKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfc2VhcmNoX2F2cCAoIHFyeSwgc2lwX2RpY3QuQXV0aF9TZXNzaW9uX1N0YXRlLCAmYXZwKSApOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfaGRyKCBhdnAsICZhdnBoZHIgKSAgKTsKKwkJCisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBzaXBfZGljdC5BdXRoX1Nlc3Npb25fU3RhdGUsIDAsICZhdnAgKSApOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUoIGF2cCwgYXZwaGRyLT5hdnBfdmFsdWUgKSApOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkKCBhbnMsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwICkgKTsKKwl9CisJLy9SZXRyaWV2ZSBTSVAtQU9SCisJeworCQlDSEVDS19GQ1QoIGZkX21zZ19zZWFyY2hfYXZwICggcXJ5LCBzaXBfZGljdC5TSVBfQU9SLCAmYXZwKSApOworCQlpZihhdnAhPU5VTEwpCisJCXsKKwkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9oZHIoIGF2cCwgJnNpcGFvcmhkciApICApOworCQl9CisJCWVsc2UKKwkJCXNpcGFvcmhkcj1OVUxMOworCQkKKwl9CisJCisJLy9XZSBjaGVjayBpZiB3ZSBoYXZlIGEgdXNlcm5hbWUgQVZQCisJeworCQlDSEVDS19GQ1QoIGZkX21zZ19zZWFyY2hfYXZwICggcXJ5LCBzaXBfZGljdC5Vc2VyX05hbWUsICZhdnApICk7CisJCWlmKGF2cCE9TlVMTCkKKwkJeworCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2hkciggYXZwLCAmdXNlcm5hbWVoZHIgKSAgKTsKKwkJCQorCQkJcmV0PWdldF9wYXNzd29yZCh1c2VybmFtZWhkci0+YXZwX3ZhbHVlLT5vcy5kYXRhLCB1c2VybmFtZWhkci0+YXZwX3ZhbHVlLT5vcy5sZW4sIE5VTEwpOworCQkJCisJCQkKKwkJCWlmKHJldD09MSkKKwkJCXsvL25vdCBmb3VuZAorCQkJCXN0cmNweShyZXN1bHQsIkRJQU1FVEVSX0VSUk9SX1VTRVJfVU5LTk9XTiIpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJZWxzZSBpZihyZXQ9PTIpCisJCQl7Ly9lcnJvcgorCQkJCS8vV2UgY291bGRuJ3QgbWFrZSB0aGUgcmVxdWVzdCwgd2UgbXVzdCBzdG9wIHByb2Nlc3MhCisJCQkJc3RyY3B5KHJlc3VsdCwiRElBTUVURVJfVU5BQkxFX1RPX0NPTVBMWSIpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJZWxzZSBpZihyZXQ9PTApCisJCQl7Ly9mb3VuZAorCQkJCQorCQkJCWlmKHNpcGFvcmhkciE9TlVMTCkKKwkJCQl7CisJCQkJCS8vV2UgbXVzdCBjaGVjayB0aGF0IHRoaXMgdXNlciBjYW4gdXNlIHRoaXMgU0lQLUFPUgorCQkJCQlyZXQ9Y2hlY2tfc2lwYW9yKHVzZXJuYW1laGRyLT5hdnBfdmFsdWUtPm9zLmRhdGEsIHVzZXJuYW1laGRyLT5hdnBfdmFsdWUtPm9zLmxlbiwoY29uc3QgY2hhciAqKSBzaXBhb3JoZHItPmF2cF92YWx1ZS0+b3MuZGF0YSxzaXBhb3JoZHItPmF2cF92YWx1ZS0+b3MubGVuKTsKKwkJCQkJCisJCQkJCWlmKHJldD09MCkKKwkJCQkJeworCQkJCQkJLy9UaGUgU0lQLUFPUiBhbmQgVXNlcm5hbWUgYXJlIG9rIQorCQkJCQkJcmV0PWNsZWFyX3BlbmRpbmdfZmxhZyh1c2VybmFtZWhkci0+YXZwX3ZhbHVlLT5vcy5kYXRhLCB1c2VybmFtZWhkci0+YXZwX3ZhbHVlLT5vcy5sZW4pOworCQkJCQkJaWYocmV0PT0yKQorCQkJCQkJeworCQkJCQkJCVRSQUNFX0RFQlVHKElORk8sIkVSUk9SOiBXZSBjb3VsZG4ndCBjbGVhciB0aGUgZmxhZyBvZiBwZW5kaW5nIGF1dGhlbnRpY2F0aW9uLiciKTsKKwkJCQkJCQlzdHJjcHkocmVzdWx0LCJESUFNRVRFUl9VTkFCTEVfVE9fQ09NUExZIik7CisJCQkJCQkJZ290byBvdXQ7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJZWxzZSBpZihyZXQ9PTEpCisJCQkJCXsvL25vdCBmb3VuZAorCQkJCQkJc3RyY3B5KHJlc3VsdCwiRElBTUVURVJfRVJST1JfSURFTlRJVElFU19ET05UX01BVENIIik7CisJCQkJCQlnb3RvIG91dDsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsvL2Vycm9yCisJCQkJCQkvL1dlIGNvdWxkbid0IG1ha2UgdGhlIHJlcXVlc3QsIHdlIG11c3Qgc3RvcCBwcm9jZXNzIQorCQkJCQkJc3RyY3B5KHJlc3VsdCwiRElBTUVURVJfVU5BQkxFX1RPX0NPTVBMWSIpOworCQkJCQkJZ290byBvdXQ7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJVFJBQ0VfREVCVUcoSU5GTywiRVJST1I6IFRoZXJlIGlzIG5vIFNJUC1BT1IgQVZQISciKTsKKwkJCQkJc3RyY3B5KHJlc3VsdCwiRElBTUVURVJfRVJST1JfSURFTlRJVElFU19ET05UX01BVENIIik7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCWlmKHNpcGFvcmhkciE9TlVMTCkKKwkJCXsvL0lmIHdlIGhhdmUgYSBTSVAtQU9SLCB3ZSB3YW50IHRoZSB1c2VyIHRvIGNoZWNrIGl0LgorCQkJCXN0cmNweShyZXN1bHQsIkRJQU1FVEVSX1VTRVJfTkFNRV9SRVFVSVJFRCIpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJdXNlcm5hbWVoZHI9TlVMTDsKKwkJfQorCQkJCisJfQorCQorCS8vV2UgZ2V0IHRoZSBTSVBfU2VydmVyX0Fzc2lnbm1lbnRfVHlwZQorCXsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfc2VhcmNoX2F2cCAoIHFyeSwgc2lwX2RpY3QuU0lQX1NlcnZlcl9Bc3NpZ25tZW50X1R5cGUsICZhdnApICk7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9oZHIoIGF2cCwgJmF2cGhkciApICApOworCQkKKwkJYXNzaWdubWVudF90eXBlPWF2cGhkci0+YXZwX3ZhbHVlLT5pMzI7CisJfQorCQorCQorCQorCQorCQorCS8vV2UgZ2V0IFNJUF9Vc2VyX0RhdGFfQWxyZWFkeV9BdmFpbGFibGUgQVZQCisJeworCQlDSEVDS19GQ1QoIGZkX21zZ19zZWFyY2hfYXZwICggcXJ5LCBzaXBfZGljdC5TSVBfVXNlcl9EYXRhX0FscmVhZHlfQXZhaWxhYmxlLCAmYXZwKSApOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfaGRyKCBhdnAsICZzaXB1c2VyZGF0YWFscmVhZHlhdmFpbGFibGUgKSAgKTsKKwl9CisJCisJaWYoYXNzaWdubWVudF90eXBlPT0xIHx8IGFzc2lnbm1lbnRfdHlwZT09MikKKwl7Ly9yZWdpc3RyYXRpb24gJiByZS1yZWdpc3RyYXRpb24KKwkJaWYoY291bnRfYXZwKHFyeSxDT0RFX1NJUF9BT1IsMCk9PTEpCisJCXsKKwkJCQorCQkJaWYoc2lwdXNlcmRhdGFhbHJlYWR5YXZhaWxhYmxlLT5hdnBfdmFsdWUtPmkzMj09MCkKKwkJCXsvL0RhdGEgbm90IGF2YWlsYWJsZSwgd2UgbXVzdCBwcm92aWRlIGl0CisJCQkJcmV0PWFkZF91c2VyX2RhdGF0eXBlKHNpcGFvcmhkci0+YXZwX3ZhbHVlLT5vcy5kYXRhLCBzaXBhb3JoZHItPmF2cF92YWx1ZS0+b3MubGVuLGFucyk7CisJCQkJCisJCQkJaWYocmV0PT0wKQorCQkJCXsKKwkJCQkJLy9XZSBmb3VuZCBhbmQgYWRkZWQgZGF0YXR5cGUKKwkJCQkJZ290X2RhdGF0eXBlPTE7CisJCQkJfQorCQkJCWVsc2UgaWYocmV0PT0xKQorCQkJCXsKKwkJCQkJLy9ObyBkYXRhIHR5cGUgd2FzIGZvdW5kCisJCQkJCWdvdF9kYXRhdHlwZT0wOworCQkJCX0KKwkJCQllbHNlCisJCQkJey8vZXJyb3IKKwkJCQkvL1dlIGNvdWxkbid0IG1ha2UgdGhlIHJlcXVlc3QsIHdlIG11c3Qgc3RvcCBwcm9jZXNzIQorCQkJCXN0cmNweShyZXN1bHQsIkRJQU1FVEVSX1VOQUJMRV9UT19DT01QTFkiKTsKKwkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQl9CisJCQlzdHJjcHkocmVzdWx0LCJESUFNRVRFUl9TVUNDRVNTIik7CisJCQlnb3RvIG91dDsKKwkJfQorCQllbHNlCisJCXsvL1RoZXJlIGlzIG1vcmUgdGhhbiAxIFNJUC1BT1IgQVZQCisJCQlzdHJjcHkocmVzdWx0LCJESUFNRVRFUl9BVlBfT0NDVVJTX1RPT19NQU5ZX1RJTUVTIik7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKwllbHNlIGlmKGFzc2lnbm1lbnRfdHlwZT09MykKKwl7Ly9VbnJlZ2lzdGVyZWQgdXNlcgorCQkKKwkJLy9UT0RPOnBsYWNlIHVzZXIgdW5rbm93biBoZXJlIQorCQlpZihjb3VudF9hdnAocXJ5LENPREVfU0lQX0FPUiwwKT09MSkKKwkJeworCQkJaWYoc2lwdXNlcmRhdGFhbHJlYWR5YXZhaWxhYmxlLT5hdnBfdmFsdWUtPmkzMj09MCkKKwkJCXsvL0RhdGEgbm90IGF2YWlsYWJsZSwgd2UgbXVzdCBwcm92aWRlIGl0CisJCQkJaWYoZ290X2RhdGF0eXBlPT0xKQorCQkJCXsKKwkJCQkJcmV0PWFkZF91c2VyX2RhdGF0eXBlKHNpcGFvcmhkci0+YXZwX3ZhbHVlLT5vcy5kYXRhLCBzaXBhb3JoZHItPmF2cF92YWx1ZS0+b3MubGVuLGFucyk7CisJCQkJCQorCQkJCQlpZihyZXQ9PTApCisJCQkJCXsKKwkJCQkJCS8vV2UgZm91bmQgYW5kIGFkZGVkIGRhdGF0eXBlCisJCQkJCQlnb3RfZGF0YXR5cGU9MTsKKwkJCQkJfQorCQkJCQllbHNlIGlmKHJldD09MSkKKwkJCQkJeworCQkJCQkJLy9ObyBkYXRhIHR5cGUgd2FzIGZvdW5kCisJCQkJCQlnb3RfZGF0YXR5cGU9MDsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsvL2Vycm9yCisJCQkJCQkvL1dlIGNvdWxkbid0IG1ha2UgdGhlIHJlcXVlc3QsIHdlIG11c3Qgc3RvcCBwcm9jZXNzIQorCQkJCQkJc3RyY3B5KHJlc3VsdCwiRElBTUVURVJfVU5BQkxFX1RPX0NPTVBMWSIpOworCQkJCQkJZ290byBvdXQ7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlzdHJjcHkocmVzdWx0LCJESUFNRVRFUl9TVUNDRVNTIik7CisJCQlnb3RvIG91dDsKKwkJfQorCQllbHNlCisJCXsvL1RoZXJlIGlzIG1vcmUgdGhhbiAxIFNJUC1BT1IgQVZQCisJCQlzdHJjcHkocmVzdWx0LCJESUFNRVRFUl9BVlBfT0NDVVJTX1RPT19NQU5ZX1RJTUVTIik7CisJCQlnb3RvIG91dDsKKwkJfQorCQkKKwkJaWYoc2lwdXNlcmRhdGFhbHJlYWR5YXZhaWxhYmxlLT5hdnBfdmFsdWUtPmkzMj09MCkKKwkJey8vRGF0YSBub3QgYXZhaWxhYmxlLCB3ZSBtdXN0IHByb3ZpZGUgaXQKKwkJCWlmKGdvdF9kYXRhdHlwZT09MSkKKwkJCXsKKwkJCQlyZXQ9YWRkX3VzZXJfZGF0YXR5cGUoc2lwYW9yaGRyLT5hdnBfdmFsdWUtPm9zLmRhdGEsIHNpcGFvcmhkci0+YXZwX3ZhbHVlLT5vcy5sZW4sYW5zKTsKKwkJCQkKKwkJCQlpZihyZXQ9PTApCisJCQkJeworCQkJCQkvL1dlIGZvdW5kIGFuZCBhZGRlZCBkYXRhdHlwZQorCQkJCQlnb3RfZGF0YXR5cGU9MTsKKwkJCQl9CisJCQkJZWxzZSBpZihyZXQ9PTEpCisJCQkJeworCQkJCQkvL05vIGRhdGEgdHlwZSB3YXMgZm91bmQKKwkJCQkJZ290X2RhdGF0eXBlPTA7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7Ly9lcnJvcgorCQkJCQkvL1dlIGNvdWxkbid0IG1ha2UgdGhlIHJlcXVlc3QsIHdlIG11c3Qgc3RvcCBwcm9jZXNzIQorCQkJCQlzdHJjcHkocmVzdWx0LCJESUFNRVRFUl9VTkFCTEVfVE9fQ09NUExZIik7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCX0KKwkJfQorCQkKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfc2VhcmNoX2F2cCAoIHFyeSwgc2lwX2RpY3QuU0lQX1NlcnZlcl9VUkksICZhdnApICk7CisJCWlmKGF2cCE9TlVMTCkKKwkJeworCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2hkciggYXZwLCAmYXZwaGRyICkpOworCQkJCisJCQlzZXRfcmVhbF9zaXBzZXJ2ZXJfdXJpKHVzZXJuYW1laGRyLT5hdnBfdmFsdWUtPm9zLmRhdGEsIHVzZXJuYW1laGRyLT5hdnBfdmFsdWUtPm9zLmxlbiwgYXZwaGRyLT5hdnBfdmFsdWUtPm9zLmRhdGEsYXZwaGRyLT5hdnBfdmFsdWUtPm9zLmxlbik7CisJCQlzdHJjcHkocmVzdWx0LCJESUFNRVRFUl9TVUNDRVNTIik7CisJCQlnb3RvIG91dDsKKwkJfQorCQllbHNlCisJCXsKKwkJCVRSQUNFX0RFQlVHKElORk8sIlRoZXJlIGlzIG5vIFNJUF9TZXJ2ZXJfVVJJIEFWUCBpbiB0aGlzIFVucmVnaXN0ZXJlZCBVc2VyIFJlcXVlc3QhIik7CisJCQlzdHJjcHkocmVzdWx0LCJESUFNRVRFUl9VTkFCTEVfVE9fQ09NUExZIik7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKwllbHNlIGlmKGFzc2lnbm1lbnRfdHlwZT09NCB8fCBhc3NpZ25tZW50X3R5cGU9PTUgfHwgYXNzaWdubWVudF90eXBlPT0xMSB8fCBhc3NpZ25tZW50X3R5cGU9PTgpCisJey8vVW5yZWdpc3RlcmVkIHVzZXIKKwkJCisJCWlmKGdvdF9kYXRhdHlwZT09MSkKKwkJeworCQkJaWYoc2lwdXNlcmRhdGFhbHJlYWR5YXZhaWxhYmxlLT5hdnBfdmFsdWUtPmkzMj09MCkKKwkJCXsvL0RhdGEgbm90IGF2YWlsYWJsZSwgd2UgbXVzdCBwcm92aWRlIGl0CisJCQkJCisJCQkJcmV0PWFkZF91c2VyX2RhdGF0eXBlKHNpcGFvcmhkci0+YXZwX3ZhbHVlLT5vcy5kYXRhLCBzaXBhb3JoZHItPmF2cF92YWx1ZS0+b3MubGVuLGFucyk7CisJCQkJCisJCQkJaWYocmV0PT0wKQorCQkJCXsKKwkJCQkJLy9XZSBmb3VuZCBhbmQgYWRkZWQgZGF0YXR5cGUKKwkJCQkJZ290X2RhdGF0eXBlPTE7CisJCQkJfQorCQkJCWVsc2UgaWYocmV0PT0xKQorCQkJCXsKKwkJCQkJLy9ObyBkYXRhIHR5cGUgd2FzIGZvdW5kCisJCQkJCWdvdF9kYXRhdHlwZT0wOworCQkJCX0KKwkJCQllbHNlCisJCQkJey8vZXJyb3IKKwkJCQkJLy9XZSBjb3VsZG4ndCBtYWtlIHRoZSByZXF1ZXN0LCB3ZSBtdXN0IHN0b3AgcHJvY2VzcyEKKwkJCQkJc3RyY3B5KHJlc3VsdCwiRElBTUVURVJfVU5BQkxFX1RPX0NPTVBMWSIpOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQl9CisJCX0KKwkJCisJCWlmKHNpcGFvcmhkcj09TlVMTCkKKwkJeworCQkJLy9XZSBkb24ndCBoYXZlIGFueSBTSVAtQU9SIHRvIHVucmVnaXN0ZXIsIHRoaXMgaXMgc3RyYW5nZSEnCisJCQlUUkFDRV9ERUJVRyhJTkZPLCAiVGhlcmUgd2FzIG5vIFNJUC1BT1IgaW4gdGhpcyByZXF1ZXN0LCB3ZSBjYW4ndCBwcm9jZWVkIHJlcXVlc3QhJyIpOworCQkJc3RyY3B5KHJlc3VsdCwiRElBTUVURVJfVU5BQkxFX1RPX0NPTVBMWSIpOworCQkJZ290byBvdXQ7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvL1RPRE86IHVucmVnaXN0ZXIgU0lQLVNlcnZlci1VUkkgZm9yIGFsbCBTSVAtQU9SCisJCX0KKwkJc3RyY3B5KHJlc3VsdCwiRElBTUVURVJfU1VDQ0VTUyIpOworCQlnb3RvIG91dDsKKwl9CisJZWxzZSBpZihhc3NpZ25tZW50X3R5cGU9PTYgfHwgYXNzaWdubWVudF90eXBlPT03KQorCXsKKwkJCisJCQorCQlDSEVDS19GQ1QoIGZkX21zZ19zZWFyY2hfYXZwICggcXJ5LCBzaXBfZGljdC5TSVBfU2VydmVyX1VSSSwgJmF2cCkgKTsKKwkJaWYoYXZwIT1OVUxMKQorCQl7CisJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfaGRyKCBhdnAsICZhdnBoZHIgKSk7CisJCQkKKwkJCS8vVE9ETzogc2V0IFNJUCBzZXJ2ZXIgVVJJIGZvciBlYWNoIEFPUgorCQkJCisJCQkvL1RPRE86IHVucmVnaXN0ZXIgYWxsIFNJUC1BT1IgcHJvdmlkZWQKKwkJCQorCQkJLy9zZXRfcmVhbF9zaXBzZXJ2ZXJfdXJpKHVzZXJuYW1laGRyLT5hdnBfdmFsdWUtPm9zLmRhdGEsIHVzZXJuYW1laGRyLT5hdnBfdmFsdWUtPm9zLmxlbiwgYXZwaGRyLT5hdnBfdmFsdWUtPm9zLmRhdGEsYXZwaGRyLT5hdnBfdmFsdWUtPm9zLmxlbik7CisJCQlzdHJjcHkocmVzdWx0LCJESUFNRVRFUl9TVUNDRVNTIik7CisJCQlnb3RvIG91dDsKKwkJfQorCQllbHNlCisJCXsKKwkJCQorCQkJCisJCQkvL1RPRE86IHVucmVnaXN0ZXIgYWxsIFNJUC1BT1IgcHJvdmlkZWQKKwkJCQorCQkJLy9UT0RPOiBjbGVhciBzaXAgc2VydmVyIHVyaSBpbiBkYXRhYmFzZSBmb3IgdGhlIHNpcC1hb3IKKwkJCQorCQkJCisJCQlUUkFDRV9ERUJVRyhJTkZPLCJUaGVyZSBpcyBubyBTSVBfU2VydmVyX1VSSSBBVlAgaW4gdGhpcyBEZXJlZ2lzdHJhdGlvbiBVc2VyIFJlcXVlc3QhIFdlIGp1c3QgdW5yZWdpc3RlciBTSVAtQU9SIik7CisJCQlzdHJjcHkocmVzdWx0LCJESUFNRVRFUl9TVUNDRVNTX1NFUlZFUl9OQU1FX05PVF9TVE9SRUQiKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCWVsc2UgaWYoYXNzaWdubWVudF90eXBlPT0wKQorCXsKKwkJCisJCQorCQlDSEVDS19GQ1QoIGZkX21zZ19zZWFyY2hfYXZwICggcXJ5LCBzaXBfZGljdC5TSVBfU2VydmVyX1VSSSwgJmF2cCkgKTsKKwkJaWYoYXZwIT1OVUxMKQorCQl7CisJCQl1bnNpZ25lZCBjaGFyICogc2lwc2VydmVyX3VyaTsKKwkJCXNpemVfdCBzaXBzZXJ2ZXJ1cmlsZW47CisJCQkKKwkJCQorCQkJCisJCQkKKwkJCXJldD1nZXRfc2lwc2VydmVyX3VyaShzaXBhb3JoZHItPmF2cF92YWx1ZS0+b3MuZGF0YSwgc2lwYW9yaGRyLT5hdnBfdmFsdWUtPm9zLmxlbiwgJnNpcHNlcnZlcl91cmksICZzaXBzZXJ2ZXJ1cmlsZW4pOworCQkJCisJCQlpZihyZXQ9PTApCisJCQl7Ly9mb3VuZAorCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9oZHIoIGF2cCwgJmF2cGhkciApKTsKKwkJCQkKKwkJCQkKKwkJCQkKKwkJCQkKKwkJCQlpZihzdHJuY21wKChjaGFyICopYXZwaGRyLT5hdnBfdmFsdWUtPm9zLmRhdGEsKGNoYXIgKilzaXBzZXJ2ZXJfdXJpLHNpcHNlcnZlcnVyaWxlbikpCisJCQkJeworCQkJCQlpZihnb3RfZGF0YXR5cGU9PTEpCisJCQkJCXsKKwkJCQkJCWlmKHNpcHVzZXJkYXRhYWxyZWFkeWF2YWlsYWJsZS0+YXZwX3ZhbHVlLT5pMzI9PTApCisJCQkJCQl7Ly9EYXRhIG5vdCBhdmFpbGFibGUsIHdlIG11c3QgcHJvdmlkZSBpdAorCQkJCQkJCQorCQkJCQkJCXJldD1hZGRfdXNlcl9kYXRhdHlwZShzaXBhb3JoZHItPmF2cF92YWx1ZS0+b3MuZGF0YSwgc2lwYW9yaGRyLT5hdnBfdmFsdWUtPm9zLmxlbixhbnMpOworCQkJCQkJCQorCQkJCQkJCWlmKHJldD09MCkKKwkJCQkJCQl7CisJCQkJCQkJCS8vV2UgZm91bmQgYW5kIGFkZGVkIGRhdGF0eXBlCisJCQkJCQkJCWdvdF9kYXRhdHlwZT0xOworCQkJCQkJCX0KKwkJCQkJCQllbHNlIGlmKHJldD09MSkKKwkJCQkJCQl7CisJCQkJCQkJCS8vTm8gZGF0YSB0eXBlIHdhcyBmb3VuZAorCQkJCQkJCQlnb3RfZGF0YXR5cGU9MDsKKwkJCQkJCQl9CisJCQkJCQkJZWxzZQorCQkJCQkJCXsvL2Vycm9yCisJCQkJCQkJCS8vV2UgY291bGRuJ3QgbWFrZSB0aGUgcmVxdWVzdCwgd2UgbXVzdCBzdG9wIHByb2Nlc3MhCisJCQkJCQkJCXN0cmNweShyZXN1bHQsIkRJQU1FVEVSX1VOQUJMRV9UT19DT01QTFkiKTsKKwkJCQkJCQkJZ290byBvdXQ7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7Ly9lcnJvcgorCQkJCQlUUkFDRV9ERUJVRyhGVUxMLCJTSVBfU2VydmVyX1VSSSBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgb25lIGluIGRhdGFiYXNlIik7CisJCQkJCXN0cmNweShyZXN1bHQsIkRJQU1FVEVSX1VOQUJMRV9UT19DT01QTFkiKTsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCVRSQUNFX0RFQlVHKEZVTEwsIlNJUF9TZXJ2ZXJfVVJJIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBvbmUgaW4gZGF0YWJhc2UiKTsKKwkJCQlzdHJjcHkocmVzdWx0LCJESUFNRVRFUl9VTkFCTEVfVE9fQ09NUExZIik7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQkKKwkJCQorCQkJCisJCQkKKwkJCQorCQkJCisJCQkKKwkJCS8vc2V0X3JlYWxfc2lwc2VydmVyX3VyaSh1c2VybmFtZWhkci0+YXZwX3ZhbHVlLT5vcy5kYXRhLCB1c2VybmFtZWhkci0+YXZwX3ZhbHVlLT5vcy5sZW4sIGF2cGhkci0+YXZwX3ZhbHVlLT5vcy5kYXRhLGF2cGhkci0+YXZwX3ZhbHVlLT5vcy5sZW4pOworCQkJc3RyY3B5KHJlc3VsdCwiRElBTUVURVJfU1VDQ0VTUyIpOworCQkJZ290byBvdXQ7CisJCX0KKwkJZWxzZQorCQl7CisJCQlUUkFDRV9ERUJVRyhJTkZPLCAiVGhlcmUgd2FzIG5vIFNJUF9TZXJ2ZXJfVVJJIGluIHRoaXMgcmVxdWVzdCwgd2UgY2FuJ3QgcHJvY2VlZCByZXF1ZXN0ISciKTsKKwkJCXN0cmNweShyZXN1bHQsIkRJQU1FVEVSX1VOQUJMRV9UT19DT01QTFkiKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCWVsc2UgaWYoYXNzaWdubWVudF90eXBlPT05IHx8IGFzc2lnbm1lbnRfdHlwZT09MTApCisJeworCQlpZihjb3VudF9hdnAocXJ5LCBDT0RFX1NJUF9BT1IsMCk9PTEpCisJCXsKKwkJCS8vVE9ETzogcmVtb3ZlIFNJUC1zZXJ2ZXIgVVJJIGZvciBzaXBfYW9yCisJCQkvL1RPRE86IHVucmVnaXN0ZXIgaXQKKwkJCXN0cmNweShyZXN1bHQsIkRJQU1FVEVSX1NVQ0NFU1MiKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWVsc2UKKwkJey8vVGhlcmUgaXMgbW9yZSB0aGFuIDEgU0lQLUFPUiBBVlAKKwkJCXN0cmNweShyZXN1bHQsIkRJQU1FVEVSX0FWUF9PQ0NVUlNfVE9PX01BTllfVElNRVMiKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCW91dDoKKwlDSEVDS19GQ1QoIGZkX21zZ19yZXNjb2RlX3NldCggYW5zLCByZXN1bHQsIE5VTEwsIE5VTEwsIDEgKSApOworCQorCQorCS8vZmRfbXNnX2R1bXBfd2FsayhJTkZPLGFucyk7CisJCisJQ0hFQ0tfRkNUKCBmZF9tc2dfc2VuZCggbXNnLCBOVUxMLCBOVUxMICkpOworCQorCQorCQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9hcHBfc2lwL3Rvb2xzL0NNYWtlTGlzdHMudHh0IGIvZXh0ZW5zaW9ucy9hcHBfc2lwL3Rvb2xzL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MGNjZmYKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2FwcF9zaXAvdG9vbHMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxMiBAQAorIyBVdGlsaXRpZXMgZm9yIGFwcF9zaXAKK1BST0pFQ1QoIkRpYW1ldGVyIFNJUCBBcHBsaWNhdGlvbiAoUkZDNDc0MCkgdG9vbHMiIEMpCisKK0FERF9FWEVDVVRBQkxFKGZyZWVkaWFtZXRlci1zaXAtcnRyIGFwcF9zaXBfcnRyLmMpCitBRERfRVhFQ1VUQUJMRShmcmVlZGlhbWV0ZXItc2lwLXBwciBhcHBfc2lwX3Bwci5jKQorCisjIyMjCisjIyBJTlNUQUxMIHNlY3Rpb24gIyMKKworSU5TVEFMTChUQVJHRVRTIGZyZWVkaWFtZXRlci1zaXAtcnRyIGZyZWVkaWFtZXRlci1zaXAtcHByCisJUlVOVElNRSBERVNUSU5BVElPTiAke0lOU1RBTExfREFFTU9OX1NVRkZJWH0KKwlDT01QT05FTlQgZnJlZURpYW1ldGVyLXNpcC1zZXJ2ZXIpCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2FwcF9zaXAvdG9vbHMvYXBwX3NpcF9wcHIuYyBiL2V4dGVuc2lvbnMvYXBwX3NpcC90b29scy9hcHBfc2lwX3Bwci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4ZDgwNTYKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2FwcF9zaXAvdG9vbHMvYXBwX3NpcF9wcHIuYwpAQCAtMCwwICsxLDIzNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IEFsZXhhbmRyZSBXZXN0ZmFobCA8YXdlc3RmYWhsQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDEwLCBBbGV4YW5kcmUgV2VzdGZhaGwsIFRlcmFva2EgTGFib3JhdG9yeSAoS2VpbyBVbml2ZXJzaXR5KSwgYW5kIHRoZSBXSURFIFByb2plY3QuIAkgKgkJCisqCQkJCQkJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFRlcmFva2EgTGFib3JhdG9yeSBub3IgdGhlIAkJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBUZXJhb2thIExhYm9yYXRvcnkgCQkJCQkJICoKKyogICAJCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvLyBUaGlzIGZpbGUgaXMgc2VwYXJhdGVkIGZyb20gdGhlIHNvdXJjZSBjb2RlIGJlY2F1c2UgaXQgaXMgYSBzZXBhcmF0ZSBjb21tYW5kIHdoaWNoIHdpbGwgY2FsbCBwdXNoIHByb2ZpbGUgZnVuY3Rpb24gaW4gRGlhbWV0ZXItU0lQCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KK3R5cGVkZWYgaW50IFNPQ0tFVDsKK3R5cGVkZWYgc3RydWN0IHNvY2thZGRyX2luIFNPQ0tBRERSX0lOOwordHlwZWRlZiBzdHJ1Y3Qgc29ja2FkZHIgU09DS0FERFI7CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGVycm5vLmg+CisKK3N0cnVjdCBwcHJzaXBhb3IKK3sKKwljaGFyIHVzZXJuYW1lWzIwMF07CisJY2hhciBkYXRhdHlwZTFbMjU1XTsKKwljaGFyIGRhdGF0eXBlMlsyNTVdOworCWNoYXIgZGF0YXR5cGUzWzI1NV07CisJaW50IGFjY291bnRpbmc7Cit9OworCitpbnQgbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCVNPQ0tFVCBzb2NrOworICAgIFNPQ0tBRERSX0lOIHNpbjsKKyAgICBzdHJ1Y3QgcHByc2lwYW9yIHBwcnNpcDsKKyAgICBpbnQgbnVtZGF0YXR5cGU9MCxpPTA7CisgICAgaW50IHBvcnQ9NjY3OworCQorCXNvY2sgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDApOworCXNpbi5zaW5fYWRkci5zX2FkZHIgPSBpbmV0X2FkZHIoIjEyNy4wLjAuMSIpOworICAgIHNpbi5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgICAKKyAgICAKKyAgICAvL1dlIGluaXRpYWxpemUgdGhlIHN0cnVjdHVyZQorICAgIHBwcnNpcC51c2VybmFtZVswXT0nXDAnOworICAgIHBwcnNpcC5kYXRhdHlwZTFbMF09J1wwJzsKKyAgICBwcHJzaXAuZGF0YXR5cGUyWzBdPSdcMCc7CisgICAgcHByc2lwLmRhdGF0eXBlM1swXT0nXDAnOworICAgIHBwcnNpcC5hY2NvdW50aW5nPTA7CisgICAgCisJLy9TdGFydCBvZiBhcmd1bWVudHMgY2hlY2sKKwlpZihhcmdjPDMpCisJeworCQlmcHJpbnRmKHN0ZGVyciwiTWlzc2luZyBhcmd1bWVudHMhIFlvdSBtdXN0IGF0IGxlYXN0IHByb3ZpZGUgYSB1c2VybmFtZS5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisJCisJCisJZm9yIChpPTE7aTxhcmdjO2krKykKKwl7CisJCS8vV2UgbXVzdCBjaGVjayBpZiBpdCBpcyBhIHZhbHVlIG9yIHRoZSBuYW1lCisJCWlmKHN0cm5jbXAoYXJndltpXSwiLSIsMSk9PTApCisJCXsKKwkJCWlmKHN0cmNtcChhcmd2W2ldLCItdSIpPT0wKQorCQkJeworCQkJCS8vVXNlcm5hbWUKKwkJCQlpZihzdHJsZW4oYXJndltpKzFdKTwxOTkpCisJCQkJeworCQkJCQlzdHJjcHkocHByc2lwLnVzZXJuYW1lLGFyZ3ZbaSsxXSk7CisJCQkJCS8vV2UgbXVzdCBub3QgY2hlY2sgdGhlIHZhbHVlCisJCQkJCWkrKzsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJZnByaW50ZihzdGRlcnIsIlVzZXJuYW1lIGlzIHRvbyBsb25nIVxuIik7CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZihzdHJjbXAoYXJndltpXSwiLXQiKT09MCkKKwkJCXsvL1VzZXItZGF0YSB0eXBlcworCQkJCWkrKzsKKwkJCQlpbnQgaj1pOworCQkJCisJCQkJZm9yKGo9aTtqPGFyZ2M7aisrKQorCQkJCXsKKwkJCQkJCisJCQkJCWlmKHN0cm5jbXAoYXJndltpXSwiLSIsMSkhPTApCisJCQkJCXsKKwkJCQkJCWlmKHN0cmxlbihhcmd2W2ldKT4yNTQpCisJCQkJCQl7CisJCQkJCQkJZnByaW50ZihzdGRlcnIsIlVzZXItZGF0YSB0eXBlIGlzIHRvbyBsb25nIVxuIik7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJaWYobnVtZGF0YXR5cGU8MykKKwkJCQkJCQl7CisJCQkJCQkJCXN3aXRjaChudW1kYXRhdHlwZSkKKwkJCQkJCQkJeworCQkJCQkJCQkJY2FzZSAwOgorCQkJCQkJCQkJCXN0cmNweShwcHJzaXAuZGF0YXR5cGUxLGFyZ3ZbaV0pOworCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCQljYXNlIDE6CisJCQkJCQkJCQkJc3RyY3B5KHBwcnNpcC5kYXRhdHlwZTIsYXJndltpXSk7CisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJCWNhc2UgMjoKKwkJCQkJCQkJCQlzdHJjcHkocHByc2lwLmRhdGF0eXBlMyxhcmd2W2ldKTsKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQl9CisJCQkJCQkJCW51bWRhdGF0eXBlKys7CisJCQkJCQkJfQorCQkJCQkJCWVsc2UKKwkJCQkJCQl7CisJCQkJCQkJCWZwcmludGYoc3RkZXJyLCJZb3UgY2FuIG5vdCBwcm92aWRlIG1vcmUgdGhhbiAzIFVzZXItZGF0YSB0eXBlIGF0IHRoZSBzYW1lIHRpbWUhXG4iKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJaT1qKzE7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQkvL1dlIGhhdmUgYSBuZXcgYXJndW1lbnQKKwkJCQkJCWktLTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZihzdHJjbXAoYXJndltpXSwiLWEiKT09MCkKKwkJCXsKKwkJCQlwcHJzaXAuYWNjb3VudGluZz0xOworCQkJCQorCQkJCQorCQkJfQorCQkJZWxzZSBpZihzdHJjbXAoYXJndltpXSwiLXAiKT09MCkKKwkJCXsKKwkJCQkKKwkJCQlpZihzc2NhbmYoYXJndltpKzFdLCIlZCIsICZwb3J0KSE9MSkKKwkJCQl7CisJCQkJCWZwcmludGYoc3RkZXJyLCJJbmNvcnJlY3QgcG9ydCBudW1iZXIhXG4iKTsKKwkJCQkJcmV0dXJuIDE7CisJCQkJfQorCQkJCQorCQkJCQorCQkJCWkrKzsKKwkJCX0KKwkJCQorCQl9CisJCWVsc2UKKwkJeworCQkJZnByaW50ZihzdGRlcnIsIlVua25vd24gYXJndW1lbnQ6ICVzXG4iLGFyZ3ZbaV0pOworCQkJaSsrOworCQl9CisJCQkKKwl9CisJCisJLy9XZSBzZXQgdGhlIHBvcnQgbnVtYmVyCisJc2luLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7CisJCisJCisJLy9XZSB3YW50IGEgdXNlcm5hbWUKKwlpZihzdHJsZW4ocHByc2lwLnVzZXJuYW1lKT09MCkKKwl7CisJCWZwcmludGYoc3RkZXJyLCJZb3UgbXVzdCBwcm92aWRlIGEgdXNlcm5hbWUhXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCQorICAgIAorICAgIGZwcmludGYoc3RkZXJyLCIlZCFcbiIscG9ydCk7CisgICAKKyAgICAvKgorICAgIC8vREVCVUcKKyAgICBmcHJpbnRmKHN0ZGVyciwiKiVzKlxuIixwcHJzaXAudXNlcm5hbWUpOworCWZwcmludGYoc3RkZXJyLCIqJXMqXG4iLHBwcnNpcC5kYXRhdHlwZTEpOworCWZwcmludGYoc3RkZXJyLCIqJXMqXG4iLHBwcnNpcC5kYXRhdHlwZTIpOworCWZwcmludGYoc3RkZXJyLCIqJXMqXG4iLHBwcnNpcC5kYXRhdHlwZTMpOworCWZwcmludGYoc3RkZXJyLCIqJWQqXG4iLHBwcnNpcC5hY2NvdW50aW5nKTsKKwkKKwlyZXR1cm4gMDsKKwkqLworCQorCQorCS8vVE9ETzogY2hlY2sgYXJncworCWlmKCFjb25uZWN0KHNvY2ssIChTT0NLQUREUiopJnNpbiwgc2l6ZW9mKHNpbikpKQorICAgIHsKKyAgICAgICBmcHJpbnRmKHN0ZGVyciwiQ29ubmV4aW9uIHN1Y2NlZWQhXG4iKTsKKyAgICAgICAgCisgCisgICAgICAgIGlmKHNlbmQoc29jaywgJnBwcnNpcCwgc2l6ZW9mKHN0cnVjdCBwcHJzaXBhb3IpLCAwKSkKKwkJCWZwcmludGYoc3RkZXJyLCJzZW50IE9LIVxuIik7CisJCWVsc2UKKwkJCWZwcmludGYoc3RkZXJyLCJub3Qgc2VudFxuIik7CisgICAgICAgIAorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwiVW5hYmxlIHRvIGNvbm5lY3RcbiIpOworICAgIH0KKyAKKyAgICBjbG9zZShzb2NrKTsKKworCXJldHVybiAwOworfQorCisKKworCisKKwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9hcHBfc2lwL3Rvb2xzL2FwcF9zaXBfcnRyLmMgYi9leHRlbnNpb25zL2FwcF9zaXAvdG9vbHMvYXBwX3NpcF9ydHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWMzYzYwCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9hcHBfc2lwL3Rvb2xzL2FwcF9zaXBfcnRyLmMKQEAgLTAsMCArMSwzMDMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBBbGV4YW5kcmUgV2VzdGZhaGwgPGF3ZXN0ZmFobEBmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxMCwgQWxleGFuZHJlIFdlc3RmYWhsLCBUZXJhb2thIExhYm9yYXRvcnkgKEtlaW8gVW5pdmVyc2l0eSksIGFuZCB0aGUgV0lERSBQcm9qZWN0LiAJICoJCQorKgkJCQkJCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBUZXJhb2thIExhYm9yYXRvcnkgbm9yIHRoZSAJCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgVGVyYW9rYSBMYWJvcmF0b3J5IAkJCQkJCSAqCisqICAgCQkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLy8gVGhpcyBmaWxlIGlzIHNlcGFyYXRlZCBmcm9tIHRoZSBzb3VyY2UgY29kZSBiZWNhdXNlIGl0IGlzIGEgc2VwYXJhdGUgY29tbWFuZCB3aGljaCB3aWxsIGNhbGwgcmVnaXN0cmF0aW9uIHRlcm1pbmF0aW9uIGZ1bmN0aW9uIGluIERpYW1ldGVyLVNJUAorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+Cit0eXBlZGVmIGludCBTT0NLRVQ7Cit0eXBlZGVmIHN0cnVjdCBzb2NrYWRkcl9pbiBTT0NLQUREUl9JTjsKK3R5cGVkZWYgc3RydWN0IHNvY2thZGRyIFNPQ0tBRERSOworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworc3RydWN0IHJ0cnNpcGFvcgoreworCWNoYXIgdXNlcm5hbWVbMjAwXTsKKwljaGFyIHNpcF9hb3IxWzIwMF07CisJY2hhciBzaXBfYW9yMlsyMDBdOworCWNoYXIgc2lwX2FvcjNbMjAwXTsKKwljaGFyIHN0cnJlYXNvblsyMDBdOworCWNoYXIgZGVzdGhvc3RbMjAwXTsKKwlpbnQgcmVhc29uOworfTsKKworaW50IG1haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlTT0NLRVQgc29jazsKKyAgICBTT0NLQUREUl9JTiBzaW47CisgICAgc3RydWN0IHJ0cnNpcGFvciBydHJzaXA7CisgICAgaW50IG51bWFvcj0wLGk9MDsKKwlpbnQgcG9ydD02NjY7CisJCisJc29jayA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7CisJc2luLnNpbl9hZGRyLnNfYWRkciA9IGluZXRfYWRkcigiMTI3LjAuMC4xIik7CisgICAgc2luLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICAgIAorICAgIAorICAgIC8vV2UgaW5pdGlhbGl6ZSB0aGUgc3RydWN0dXJlCisgICAgcnRyc2lwLnVzZXJuYW1lWzBdPSdcMCc7CisgICAgcnRyc2lwLnNpcF9hb3IxWzBdPSdcMCc7CisgICAgcnRyc2lwLnNpcF9hb3IyWzBdPSdcMCc7CisgICAgcnRyc2lwLnNpcF9hb3IzWzBdPSdcMCc7CisgICAgcnRyc2lwLnN0cnJlYXNvblswXT0nXDAnOworICAgIHJ0cnNpcC5kZXN0aG9zdFswXT0nXDAnOworICAgIHJ0cnNpcC5yZWFzb249LTE7CisgICAgCisgICAgCisJLy9TdGFydCBvZiBhcmd1bWVudHMgY2hlY2sKKwlpZihhcmdjPDMpCisJeworCQlmcHJpbnRmKHN0ZGVyciwiTWlzc2luZyBhcmd1bWVudHMhIFlvdSBtdXN0IGF0IGxlYXN0IHByb3ZpZGUgYSB1c2VybmFtZS5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisJCisJCisJZm9yIChpPTE7aTxhcmdjO2krKykKKwl7CisJCS8vV2UgbXVzdCBjaGVjayBpZiBpdCBpcyBhIHZhbHVlIG9yIHRoZSBuYW1lCisJCWlmKHN0cm5jbXAoYXJndltpXSwiLSIsMSk9PTApCisJCXsKKwkJCWlmKHN0cmNtcChhcmd2W2ldLCItdSIpPT0wKQorCQkJeworCQkJCS8vVXNlcm5hbWUKKwkJCQlpZihzdHJsZW4oYXJndltpKzFdKTwxOTkpCisJCQkJeworCQkJCQlzdHJjcHkocnRyc2lwLnVzZXJuYW1lLGFyZ3ZbaSsxXSk7CisJCQkJCS8vV2UgbXVzdCBub3QgY2hlY2sgdGhlIHZhbHVlCisJCQkJCWkrKzsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJZnByaW50ZihzdGRlcnIsIlVzZXJuYW1lIGlzIHRvbyBsb25nIVxuIik7CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZihzdHJjbXAoYXJndltpXSwiLWEiKT09MCkKKwkJCXsKKwkJCQlpKys7CisJCQkJaW50IGo9aTsKKwkJCQorCQkJCWZvcihqPWk7ajxhcmdjO2orKykKKwkJCQl7CisJCQkJCQorCQkJCQlpZihzdHJuY21wKGFyZ3ZbaV0sIi0iLDEpIT0wKQorCQkJCQl7CisJCQkJCQlpZihzdHJsZW4oYXJndltpXSk+MTk5KQorCQkJCQkJeworCQkJCQkJCWZwcmludGYoc3RkZXJyLCJTSVAtQU9SIGlzIHRvbyBsb25nIVxuIik7CisJCQkJCQl9CisJCQkJCQllbHNlIGlmKHN0cm5jbXAoYXJndltpXSwic2lwIiwzKSE9MCkKKwkJCQkJCXsKKwkJCQkJCQkvL0JhZCBmb3JtYXQgb2YgU0lQLUFPUgorCQkJCQkJCWZwcmludGYoc3RkZXJyLCJBIFNJUC1BT1IgbXVzdCBzdGFydCBieSAnc2lwOicgb3IgJ3NpcHM6Jy4gQWJvcnRpbmcuLi5cbiIpOworCQkJCQkJCXJldHVybiAxOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCWlmKG51bWFvcjwzKQorCQkJCQkJCXsKKwkJCQkJCQkJc3dpdGNoKG51bWFvcikKKwkJCQkJCQkJeworCQkJCQkJCQkJY2FzZSAwOgorCQkJCQkJCQkJCXN0cmNweShydHJzaXAuc2lwX2FvcjEsYXJndltpXSk7CisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJCWNhc2UgMToKKwkJCQkJCQkJCQlzdHJjcHkocnRyc2lwLnNpcF9hb3IyLGFyZ3ZbaV0pOworCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCQljYXNlIDI6CisJCQkJCQkJCQkJc3RyY3B5KHJ0cnNpcC5zaXBfYW9yMyxhcmd2W2ldKTsKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQl9CisJCQkJCQkJCW51bWFvcisrOworCQkJCQkJCX0KKwkJCQkJCQllbHNlCisJCQkJCQkJeworCQkJCQkJCQlmcHJpbnRmKHN0ZGVyciwiWW91IGNhbiBub3QgcHJvdmlkZSBtb3JlIHRoYW4gMyBTSVAtQU9SIGF0IHRoZSBzYW1lIHRpbWUhXG4iKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJaT1qKzE7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQkvL1dlIGhhdmUgYSBuZXcgYXJndW1lbnQKKwkJCQkJCWktLTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZihzdHJjbXAoYXJndltpXSwiLXIiKT09MCkKKwkJCXsKKwkJCQkKKwkJCQlpZihzdHJsZW4oYXJndltpKzFdKT4xOTkpCisJCQkJeworCQkJCQlmcHJpbnRmKHN0ZGVyciwiRGVyZWdpc3RyYXRpb24gcmVhc29uIGlzIHRvbyBsb25nIVxuIik7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCXN0cmNweShydHJzaXAuc3RycmVhc29uLGFyZ3ZbaSsxXSk7CisJCQkJfQorCQkJCWkrKzsKKwkJCX0KKwkJCWVsc2UgaWYoc3RyY21wKGFyZ3ZbaV0sIi1oIik9PTApCisJCQl7CisJCQkJLy9SZW1vdGUgU0lQIFNlcnZlcgorCQkJCWlmKHN0cmxlbihhcmd2W2krMV0pPjE5OSkKKwkJCQl7CisJCQkJCWZwcmludGYoc3RkZXJyLCJIb3N0IGlzIHRvbyBsb25nIVxuIik7CisJCQkJfQorCQkJCWVsc2UgaWYoc3RybGVuKGFyZ3ZbaSsxXSk8NSkKKwkJCQl7CisJCQkJCWZwcmludGYoc3RkZXJyLCJIb3N0IGlzIHRvbyBzaG9ydCFcbiIpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlzdHJjcHkocnRyc2lwLmRlc3Rob3N0LGFyZ3ZbaSsxXSk7CisJCQkJfQorCQkJCWkrKzsKKwkJCX0KKwkJCWVsc2UgaWYoc3RyY21wKGFyZ3ZbaV0sIi1wdCIpPT0wKQorCQkJeworCQkJCS8vUGVybWFuZW50IFRlcm1pbmF0aW9uCisJCQkJcnRyc2lwLnJlYXNvbj0wOworCQkJfQorCQkJZWxzZSBpZihzdHJjbXAoYXJndltpXSwiLW5zc2EiKT09MCkKKwkJCXsKKwkJCQkvL05ldyBTSVAgU2VydmVyIEFzc2lnbmVkCisJCQkJcnRyc2lwLnJlYXNvbj0xOworCQkJfQorCQkJZWxzZSBpZihzdHJjbXAoYXJndltpXSwiLXNzYyIpPT0wKQorCQkJeworCQkJCS8vU0lQIFNlcnZlciBDaGFuZ2UKKwkJCQlydHJzaXAucmVhc29uPTI7CisJCQl9CisJCQllbHNlIGlmKHN0cmNtcChhcmd2W2ldLCItcnNzIik9PTApCisJCQl7CisJCQkJLy9SZW1vdGUgU0lQIFNlcnZlcgorCQkJCXJ0cnNpcC5yZWFzb249MzsKKwkJCX0KKwkJCWVsc2UgaWYoc3RyY21wKGFyZ3ZbaV0sIi1wIik9PTApCisJCQl7CisJCQkJCisJCQkJaWYoc3NjYW5mKGFyZ3ZbaSsxXSwiJWQiLCAmcG9ydCkhPTEpCisJCQkJeworCQkJCQlmcHJpbnRmKHN0ZGVyciwiSW5jb3JyZWN0IHBvcnQgbnVtYmVyIVxuIik7CisJCQkJCXJldHVybiAxOworCQkJCX0KKwkJCQkKKwkJCQkKKwkJCQlpKys7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJZnByaW50ZihzdGRlcnIsIlVua25vd24gYXJndW1lbnQ6ICVzXG4iLGFyZ3ZbaV0pOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJZnByaW50ZihzdGRlcnIsIlVua25vd24gYXJndW1lbnQ6ICVzXG4iLGFyZ3ZbaV0pOworCQkJaSsrOworCQl9CisJCQkKKwl9CisJCisJLy9JZiBubyBTSVAtQU9SIHByb3ZpZGVkLCB3ZSByZW1vdmUgYWxsCisJaWYobnVtYW9yPDEpCisJeworCQlmcHJpbnRmKHN0ZGVyciwiQWxsIFNJUC1BT1Igb2YgJXMgd2lsbCBiZSBkZXJlZ2lzdHJhdGVkLlxuIixydHJzaXAudXNlcm5hbWUpOworCX0KKwkKKwkvL1dlIHdhbnQgYSB1c2VybmFtZQorCWlmKHN0cmxlbihydHJzaXAudXNlcm5hbWUpPT0wKQorCXsKKwkJZnByaW50ZihzdGRlcnIsIllvdSBtdXN0IHByb3ZpZGUgYSB1c2VybmFtZSFcbiIpOworCQlyZXR1cm4gMTsKKwl9CisJCisJaWYocnRyc2lwLmRlc3Rob3N0WzBdPT0nXDAnKQorCXsKKwkJZnByaW50ZihzdGRlcnIsIllvdSBtdXN0IHByb3ZpZGUgdGhlIGhvc3RuYW1lIG9mIFNJUC1TZXJ2ZXIhXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorICAgIAorICAgIC8vV2Ugc2V0IHRoZSBwb3J0IG51bWJlcgorICAgIHNpbi5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworICAgCisgICAgCisgICAgLyoKKyAgICBmcHJpbnRmKHN0ZGVyciwiKiVzKlxuIixydHJzaXAudXNlcm5hbWUpOworCWZwcmludGYoc3RkZXJyLCIqJXMqXG4iLHJ0cnNpcC5zaXBfYW9yMSk7CisJZnByaW50ZihzdGRlcnIsIiolcypcbiIscnRyc2lwLnNpcF9hb3IyKTsKKwlmcHJpbnRmKHN0ZGVyciwiKiVzKlxuIixydHJzaXAuc2lwX2FvcjMpOworCWZwcmludGYoc3RkZXJyLCIqJWQqXG4iLHJ0cnNpcC5yZWFzb24pOworCWZwcmludGYoc3RkZXJyLCIqJXMqXG4iLHJ0cnNpcC5zdHJyZWFzb24pOworCQorCS8vcmV0dXJuIDA7CisJKi8KKwkKKwkKKwkvL1RPRE86IGNoZWNrIGFyZ3MKKwlpZighY29ubmVjdChzb2NrLCAoU09DS0FERFIqKSZzaW4sIHNpemVvZihzaW4pKSkKKyAgICB7CisgICAgICAgZnByaW50ZihzdGRlcnIsIkNvbm5leGlvbiBzdWNjZWVkIVxuIik7CisgICAgICAgIAorIAorICAgICAgICBpZihzZW5kKHNvY2ssICZydHJzaXAsIHNpemVvZihzdHJ1Y3QgcnRyc2lwYW9yKSwgMCkpCisJCQlmcHJpbnRmKHN0ZGVyciwic2VudCBPSyFcbiIpOworCQllbHNlCisJCQlmcHJpbnRmKHN0ZGVyciwibm90IHNlbnRcbiIpOworICAgICAgICAKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIlVuYWJsZSB0byBjb25uZWN0XG4iKTsKKyAgICB9CisgCisgICAgY2xvc2Uoc29jayk7CisKKwlyZXR1cm4gMDsKK30KKworCisKKworCisKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvYXBwX3NpcC91c2VyYXV0aG9yaXphdGlvbi5jIGIvZXh0ZW5zaW9ucy9hcHBfc2lwL3VzZXJhdXRob3JpemF0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg3Y2ViNgotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvYXBwX3NpcC91c2VyYXV0aG9yaXphdGlvbi5jCkBAIC0wLDAgKzEsMzM3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogQWxleGFuZHJlIFdlc3RmYWhsIDxhd2VzdGZhaGxAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTAsIEFsZXhhbmRyZSBXZXN0ZmFobCwgVGVyYW9rYSBMYWJvcmF0b3J5IChLZWlvIFVuaXZlcnNpdHkpLCBhbmQgdGhlIFdJREUgUHJvamVjdC4gCSAqCQkKKyoJCQkJCQkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVGVyYW9rYSBMYWJvcmF0b3J5IG5vciB0aGUgCQkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFRlcmFva2EgTGFib3JhdG9yeSAJCQkJCQkgKgorKiAgIAkJCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgImFwcF9zaXAuaCIKKworCitpbnQgYXBwX3NpcF9VQVJfY2IoIHN0cnVjdCBtc2cgKiogbXNnLCBzdHJ1Y3QgYXZwICogcGFyYW1hdnAsIHN0cnVjdCBzZXNzaW9uICogc2Vzcywgdm9pZCAqIG9wYXF1ZSwgZW51bSBkaXNwX2FjdGlvbiAqIGFjdCkKK3sKKwlUUkFDRV9FTlRSWSgiJXAgJXAgJXAgJXAiLCBtc2csIHBhcmFtYXZwLCBzZXNzLCBhY3QpOworCQorCXN0cnVjdCBtc2cgKmFucywgKnFyeTsKKwlzdHJ1Y3QgYXZwICphdnAsICpncm91cGVkYXZwPU5VTEw7CisJc3RydWN0IGF2cF9oZHIgKmF2cGhkciwgKnNpcGFvcmhkciwgKnZpc2l0ZWRuZXRoZHIsICp1c2VybmFtZWhkcjsKKwl1bmlvbiBhdnBfdmFsdWUgdmFsdWU7CisJaW50IHJldD0wLCBoYXNjYXA9MDsKKwkKKwkvL1Jlc3VsdF9Db2RlIHRvIHJldHVybiBpbiB0aGUgYW5zd2VyCisJY2hhciByZXN1bHRbNTVdOworCQorCWlmIChtc2cgPT0gTlVMTCkKKwkJcmV0dXJuIEVJTlZBTDsKKworCQorCS8vIENyZWF0ZSBhbnN3ZXIgaGVhZGVyIAorCXFyeSA9ICptc2c7CisJQ0hFQ0tfRkNUKCBmZF9tc2dfbmV3X2Fuc3dlcl9mcm9tX3JlcSAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgbXNnLCAwICkgKTsKKwlhbnMgPSAqbXNnOworCQorCS8vQWRkIHRoZSBBdXRoLUFwcGxpY2F0aW9uLUlkIAorCXsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIHNpcF9kaWN0LkF1dGhfQXBwbGljYXRpb25fSWQsIDAsICZhdnAgKSApOworCQl2YWx1ZS5pMzIgPSA2OworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUgKCBhdnAsICZ2YWx1ZSApICk7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQgKCBhbnMsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwKSApOworCX0KKwkvLyBBZGQgdGhlIEF1dGgtU2Vzc2lvbi1TdGF0ZSBBVlAgCisJeworCQkKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfc2VhcmNoX2F2cCAoIHFyeSwgc2lwX2RpY3QuQXV0aF9TZXNzaW9uX1N0YXRlLCAmYXZwKSApOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfaGRyKCBhdnAsICZhdnBoZHIgKSAgKTsKKwkJCisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBzaXBfZGljdC5BdXRoX1Nlc3Npb25fU3RhdGUsIDAsICZhdnAgKSApOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUoIGF2cCwgYXZwaGRyLT5hdnBfdmFsdWUgKSApOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkKCBhbnMsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwICkgKTsKKwl9CisJCisJLy9SZXRyaWV2ZSBTSVAtQU9SCisJeworCQlDSEVDS19GQ1QoIGZkX21zZ19zZWFyY2hfYXZwICggcXJ5LCBzaXBfZGljdC5TSVBfQU9SLCAmYXZwKSApOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfaGRyKCBhdnAsICZzaXBhb3JoZHIgKSAgKTsKKwl9CisJCisJLy9XZSBjaGVjayBpZiB3ZSBoYXZlIGEgVXNlci1OYW1lIEFWUAorCXsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfc2VhcmNoX2F2cCAoIHFyeSwgc2lwX2RpY3QuVXNlcl9OYW1lLCAmYXZwKSApOworCQlpZihhdnAhPU5VTEwpCisJCXsKKwkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9oZHIoIGF2cCwgJnVzZXJuYW1laGRyICkgICk7CisJCQkKKwkJCXJldD1nZXRfcGFzc3dvcmQodXNlcm5hbWVoZHItPmF2cF92YWx1ZS0+b3MuZGF0YSwgdXNlcm5hbWVoZHItPmF2cF92YWx1ZS0+b3MubGVuLCBOVUxMKTsKKwkJCQorCQkJCisJCQlpZihyZXQ9PTEpCisJCQl7Ly9ub3QgZm91bmQKKwkJCQlzdHJjcHkocmVzdWx0LCJESUFNRVRFUl9FUlJPUl9VU0VSX1VOS05PV04iKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWVsc2UgaWYocmV0PT0yKQorCQkJey8vZXJyb3IKKwkJCQkvL1dlIGNvdWxkbid0IG1ha2UgdGhlIHJlcXVlc3QsIHdlIG11c3Qgc3RvcCBwcm9jZXNzIQorCQkJCXN0cmNweShyZXN1bHQsIkRJQU1FVEVSX1VOQUJMRV9UT19DT01QTFkiKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWVsc2UgaWYocmV0PT0wKQorCQkJey8vZm91bmQKKwkJCQkKKwkJCQkvL1dlIG11c3QgY2hlY2sgdGhhdCB0aGlzIHVzZXIgY2FuIHVzZSB0aGlzIFNJUC1BT1IKKwkJCQlyZXQ9Y2hlY2tfc2lwYW9yKHVzZXJuYW1laGRyLT5hdnBfdmFsdWUtPm9zLmRhdGEsIHVzZXJuYW1laGRyLT5hdnBfdmFsdWUtPm9zLmxlbiwgKGNvbnN0IGNoYXIgKilzaXBhb3JoZHItPmF2cF92YWx1ZS0+b3MuZGF0YSxzaXBhb3JoZHItPmF2cF92YWx1ZS0+b3MubGVuKTsKKwkJCQkKKwkJCQlpZihyZXQ9PTApCisJCQkJeworCQkJCQkvL1RoZSBTSVAtQU9SIGFuZCBVc2VybmFtZSBhcmUgb2shCisJCQkJfQorCQkJCWVsc2UgaWYocmV0PT0xKQorCQkJCXsvL25vdCBmb3VuZAorCQkJCQlzdHJjcHkocmVzdWx0LCJESUFNRVRFUl9FUlJPUl9JREVOVElUSUVTX0RPTlRfTUFUQ0giKTsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7Ly9lcnJvcgorCQkJCQkvL1dlIGNvdWxkbid0IG1ha2UgdGhlIHJlcXVlc3QsIHdlIG11c3Qgc3RvcCBwcm9jZXNzIQorCQkJCQlzdHJjcHkocmVzdWx0LCJESUFNRVRFUl9VTkFCTEVfVE9fQ09NUExZIik7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwkKKwkvL1dlIGNoZWNrIGlmIHdlIGhhdmUgYSBTSVAtVmlzaXRlZC1OZXR3b3JrLUlkIEFWUAorCXsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfc2VhcmNoX2F2cCAoIHFyeSwgc2lwX2RpY3QuU0lQX1Zpc2l0ZWRfTmV0d29ya19JZCwgJmF2cCkgKTsKKwkJCisJCWlmKGF2cCE9TlVMTCkKKwkJeworCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2hkciggYXZwLCAmdmlzaXRlZG5ldGhkciApICApOworCQl9CisJCWVsc2UKKwkJCXZpc2l0ZWRuZXRoZHI9TlVMTDsKKwl9CisJCisJLy9XZSBjaGVjayBpZiB3ZSBoYXZlIGEgU0lQX1VzZXJfQXV0aG9yaXphdGlvbl9UeXBlCisJeworCQlpbnQgYXV0aF90eXBlOworCQkKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfc2VhcmNoX2F2cCAoIHFyeSwgc2lwX2RpY3QuU0lQX1VzZXJfQXV0aG9yaXphdGlvbl9UeXBlLCAmYXZwKSApOworCQkKKwkJaWYoYXZwIT1OVUxMKQorCQl7CisJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfaGRyKCBhdnAsICZhdnBoZHIgKSAgKTsKKwkJCWF1dGhfdHlwZT1hdnBoZHItPmF2cF92YWx1ZS0+aTMyOworCQkJCisJCQlpZihhdXRoX3R5cGU9PTAgfHwgYXV0aF90eXBlPT0yKQorCQkJeworCQkJCWlmKHZpc2l0ZWRuZXRoZHIhPU5VTEwpCisJCQkJeworCQkJCQkvKgorCQkJCQlJZiB0aGVyZSBpcyBhIFNJUC1WaXNpdGVkLU5ldHdvcmstSWQgQVZQIGluIHRoZSBEaWFtZXRlciBVQVIgbWVzc2FnZSwKKwkJCQkJYW5kIHRoZSBTSVAtVXNlci1BdXRob3JpemF0aW9uLVR5cGUgQVZQIHZhbHVlIHJlY2VpdmVkIGluIHRoZQorCQkJCQlEaWFtZXRlciBVQVIgbWVzc2FnZSBpcyBzZXQgdG8gUkVHSVNUUkFUSU9OIG9yIFJFR0lTVFJBVElPTiYKKwkJCQkJQ0FQQUJJTElUSUVTLCB0aGVuIHRoZSBEaWFtZXRlciBzZXJ2ZXIgU0hPVUxEIHZlcmlmeSB3aGV0aGVyIHRoZSB1c2VyCisJCQkJCWlzIGFsbG93ZWQgdG8gcm9hbSBpbnRvIHRoZSBuZXR3b3JrIHNwZWNpZmllZCBpbiB0aGUKKwkJCQkJU0lQLVZpc2l0ZWQtTmV0d29yay1JZCBBVlAgaW4gdGhlIERpYW1ldGVyIFVBUiBtZXNzYWdlLiAgSWYgdGhlIHVzZXIKKwkJCQkJaXMgbm90IGFsbG93ZWQgdG8gcm9hbSBpbnRvIHRoYXQgbmV0d29yaywgdGhlIERpYW1ldGVyIEFBQSBzZXJ2ZXIKKwkJCQkJTVVTVCBzZXQgdGhlIFJlc3VsdC1Db2RlIEFWUCB2YWx1ZSBpbiB0aGUgRGlhbWV0ZXIgVUFBIG1lc3NhZ2UgdG8KKwkJCQkJRElBTUVURVJfRVJST1JfUk9BTUlOR19OT1RfQUxMT1dFRC4KKwkJCQkJKi8KKwkJCQkJcmV0PWFsbG93X3JvYW1pbmcodXNlcm5hbWVoZHItPmF2cF92YWx1ZS0+b3MuZGF0YSwgdXNlcm5hbWVoZHItPmF2cF92YWx1ZS0+b3MubGVuLCAoY29uc3QgY2hhciAqKXZpc2l0ZWRuZXRoZHItPmF2cF92YWx1ZS0+b3MuZGF0YSx2aXNpdGVkbmV0aGRyLT5hdnBfdmFsdWUtPm9zLmxlbik7CisJCQkJCQorCQkJCQlpZihyZXQ9PTApCisJCQkJCXsKKwkJCQkJCS8vVGhpcyB1c2VyIGNhbiBjb21lIGluIHRoaXMgbmV0d29yaworCQkJCQl9CisJCQkJCWVsc2UgaWYocmV0PT0xKQorCQkJCQl7CisJCQkJCQlzdHJjcHkocmVzdWx0LCJESUFNRVRFUl9FUlJPUl9ST0FNSU5HX05PVF9BTExPV0VEIik7CisJCQkJCQlnb3RvIG91dDsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXN0cmNweShyZXN1bHQsIkRJQU1FVEVSX1VOQUJMRV9UT19DT01QTFkiKTsKKwkJCQkJCWdvdG8gb3V0OworCQkJCQl9CisJCQkJCQorCQkJCX0KKwkJCQkvKgorCQkJCUlmIHRoZSBTSVAtVXNlci1BdXRob3JpemF0aW9uLVR5cGUgQVZQIHZhbHVlIHJlY2VpdmVkIGluIHRoZSBEaWFtZXRlcgorCQkJCVVBUiBtZXNzYWdlIGlzIHNldCB0byBSRUdJU1RSQVRJT04gb3IgUkVHSVNUUkFUSU9OJkNBUEFCSUxJVElFUywgdGhlbgorCQkJCXRoZSBEaWFtZXRlciBzZXJ2ZXIgU0hPVUxEIHZlcmlmeSB3aGV0aGVyIHRoZSBTSVAtQU9SIEFWUCB2YWx1ZSBpcworCQkJCWF1dGhvcml6ZWQgdG8gcmVnaXN0ZXIgaW4gdGhlIEhvbWUgUmVhbG0uICBXaGVyZSB0aGUgU0lQIEFPUiBpcyBub3QKKwkJCQlhdXRob3JpemVkIHRvIHJlZ2lzdGVyIGluIHRoZSBIb21lIFJlYWxtLCB0aGUgRGlhbWV0ZXIgc2VydmVyIE1VU1QKKwkJCQlzZXQgdGhlIFJlc3VsdC1Db2RlIEFWUCB0byBESUFNRVRFUl9BVVRIT1JJWkFUSU9OX1JFSkVDVEVEIGFuZCBzZW5kCisJCQkJaXQgaW4gYSBEaWFtZXRlciBVQUEgbWVzc2FnZS4KKwkJCQkqLworCQkJCXJldD1leGlzdF91c2VybmFtZShzaXBhb3JoZHItPmF2cF92YWx1ZS0+b3MuZGF0YSwgc2lwYW9yaGRyLT5hdnBfdmFsdWUtPm9zLmxlbik7CisJCQkJaWYocmV0PT0wKQorCQkJCXsKKwkJCQkJLy9UaGUgU0lQX0FPUiBleGlzdHMgaW4gdGhpcyByZWFsbQorCQkJCX0KKwkJCQllbHNlIGlmKHJldD09MSkKKwkJCQl7CisJCQkJCXN0cmNweShyZXN1bHQsIkRJQU1FVEVSX0FVVEhPUklaQVRJT05fUkVKRUNURUQiKTsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCXN0cmNweShyZXN1bHQsIkRJQU1FVEVSX1VOQUJMRV9UT19DT01QTFkiKTsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJfQorCQl9CisJCWVsc2UKKwkJCWF1dGhfdHlwZT0wOyAvL1JlZ2lzdHJhdGlvbiBvbmx5IChkZWZhdWx0IHZhbHVlIGlmIGFic2VudCkKKwkJCisJCQorCQkvL0xldCdzIGxvb2sgZm9yIHRoZSBTSVBfU2VydmVyX1VSSScKKwkJdW5zaWduZWQgY2hhciAqc2lwc2VydmVyX3VyaTsKKwkJc2l6ZV90IHNpcHNlcnZlcnVyaWxlbjsKKwkJCisJCXJldD1nZXRfc2lwc2VydmVyX3VyaShzaXBhb3JoZHItPmF2cF92YWx1ZS0+b3MuZGF0YSwgc2lwYW9yaGRyLT5hdnBfdmFsdWUtPm9zLmxlbiwgJnNpcHNlcnZlcl91cmksICZzaXBzZXJ2ZXJ1cmlsZW4pOworCQkKKwkJaWYocmV0PT0wKQorCQl7Ly9XZSBrbm93IGEgU0lQIFNlcnZlciBzbyB3ZSBtdXN0IHByb3ZpZGUgaXQKKwkJCS8vV2Ugb25seSBhZGQgdGhpcyBBVlAgd2hlbiB3ZSBoYXZlIHJlZ2lzdHJhdGlvbiBvciBkZXJlZ2lzdHJhdGlvbgorCQkJaWYoYXV0aF90eXBlPT0wIHx8YXV0aF90eXBlPT0xKQorCQkJeworCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBzaXBfZGljdC5TSVBfU2VydmVyX1VSSSwgMCwgJmF2cCApICk7CisJCQkJdmFsdWUub3MuZGF0YT1zaXBzZXJ2ZXJfdXJpOworCQkJCXZhbHVlLm9zLmxlbj1zaXBzZXJ2ZXJ1cmlsZW47CisJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX3NldHZhbHVlKCBhdnAsICZ2YWx1ZSApICk7CisJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCggYW5zLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCApICk7CisJCQl9CisJCX0KKwkJZWxzZSBpZihyZXQ9PTEpCisJCXsKKwkJCXNpcHNlcnZlcl91cmk9TlVMTDsKKwkJCXNpcHNlcnZlcnVyaWxlbj0wOworCQkJCisJCX0KKwkJZWxzZQorCQl7CisJCQlzdHJjcHkocmVzdWx0LCJESUFNRVRFUl9VTkFCTEVfVE9fQ09NUExZIik7CisJCQlnb3RvIG91dDsKKwkJfQorCQkKKwkJLy9JZiB3ZSBoYXZlIGEgUkVHSVNUUkFUSU9OIG9yIFJFR0lTVFJBVElPTiAmIENBUEFCSUxJVElFUworCQlpZihhdXRoX3R5cGU9PTAgfHxhdXRoX3R5cGU9PTIpCisJCXsKKwkJCS8vQWRkaW5nIFNJUC1TZXJ2ZXItQ2FwYWJpbGl0aWVzCisJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3ICggc2lwX2RpY3QuU0lQX1NlcnZlcl9DYXBhYmlsaXRpZXMsIDAsICZncm91cGVkYXZwICkgKTsKKwkJCQorCQkJcmV0PWdldF9zaXBzZXJ2ZXJfY2FwKHNpcGFvcmhkci0+YXZwX3ZhbHVlLT5vcy5kYXRhLCBzaXBhb3JoZHItPmF2cF92YWx1ZS0+b3MubGVuLCZncm91cGVkYXZwKTsKKwkJCQorCQkJaWYocmV0PT0wKQorCQkJeworCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQgKCBhbnMsIE1TR19CUldfTEFTVF9DSElMRCwgZ3JvdXBlZGF2cCkgKTsKKwkJCQloYXNjYXA9MTsKKwkJCX0KKwkJCWVsc2UgaWYocmV0PT0xKQorCQkJeworCQkJCQorCQkJCWhhc2NhcD0wOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2ZyZWUoIGdyb3VwZWRhdnAgKSApOworCQkJCXN0cmNweShyZXN1bHQsIkRJQU1FVEVSX1VOQUJMRV9UT19DT01QTFkiKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCQkKKwkJCisJCQorCQlpZihhdXRoX3R5cGU9PTApCisJCXsvL1JlZ2lzdHJhdGlvbgorCQkJCisJCQlpZihzaXBzZXJ2ZXJfdXJpPT1OVUxMKQorCQkJeworCQkJCXN0cmNweShyZXN1bHQsIkRJQU1FVEVSX0ZJUlNUX1JFR0lTVFJBVElPTiIpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmKGhhc2NhcD09MSkKKwkJCQl7CisJCQkJCXN0cmNweShyZXN1bHQsIkRJQU1FVEVSX1NFUlZFUl9TRUxFQ1RJT04iKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJLy9XZSBmcmVlIHRoZSBDYXBhYmlsaXRpZXMgQVZQIGJlY2F1c2Ugd2UgZGlkbid0IGZvdW5kIGFueScKKwkJCQkJaWYoZ3JvdXBlZGF2cCE9TlVMTCkKKwkJCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2ZyZWUoIGdyb3VwZWRhdnAgKSApOworCQkJCQlzdHJjcHkocmVzdWx0LCJESUFNRVRFUl9TVUJTRVFVRU5UX1JFR0lTVFJBVElPTiIpOworCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlIGlmKGF1dGhfdHlwZT09MikKKwkJey8vUmVnaXN0cmF0aW9uICYgQ2FwYWJpbGl0aWVzCisJCQkvL1dlIGxldCB0aGUgZ3JvdXBlZGF2cCBpbiB0aGUgbWVzc2FnZSBldmVuIGlmIHRoZXJlIGlzIG5vIGNhcGFiaWxpdGllcworCQkJCisJCQlpZihoYXNjYXA9PTApCisJCQl7CisJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCAoIGFucywgTVNHX0JSV19MQVNUX0NISUxELCBncm91cGVkYXZwKSApOworCQkJfQorCQkJc3RyY3B5KHJlc3VsdCwiRElBTUVURVJfU1VDQ0VTUyIpOwkKKwkJfQorCQllbHNlIGlmKGF1dGhfdHlwZT09MSkKKwkJey8vRGVyZWdpc3RyYXRpb24KKwkJCWlmKHNpcHNlcnZlcl91cmk9PU5VTEwpCisJCQl7CisJCQkJc3RyY3B5KHJlc3VsdCwiRElBTUVURVJfRVJST1JfSURFTlRJVFlfTk9UX1JFR0lTVEVSRUQiKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlzdHJjcHkocmVzdWx0LCJESUFNRVRFUl9TVUNDRVNTIik7CQorCQkJfQorCQl9CisJCWVsc2UKKwkJey8vV2Ugc2hvdWxkIG5ldmVyIGJlIGhlcmUhIQorCQkJc3RyY3B5KHJlc3VsdCwiRElBTUVURVJfVU5BQkxFX1RPX0NPTVBMWSIpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisJCisJCitvdXQ6CisJQ0hFQ0tfRkNUKCBmZF9tc2dfcmVzY29kZV9zZXQoIGFucywgcmVzdWx0LCBOVUxMLCBOVUxMLCAxICkgKTsKKwkKKwkKKwkvL2ZkX21zZ19kdW1wX3dhbGsoSU5GTyxhbnMpOworCQorCUNIRUNLX0ZDVCggZmRfbXNnX3NlbmQoIG1zZywgTlVMTCwgTlVMTCApKTsKKwkKKwkKKwkKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGJnX2ludGVyYWN0aXZlL0NNYWtlTGlzdHMudHh0IGIvZXh0ZW5zaW9ucy9kYmdfaW50ZXJhY3RpdmUvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJiM2ViMAotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGJnX2ludGVyYWN0aXZlL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNzcgQEAKKyMgVGhlIGRiZ19pbnRlcmFjdGl2ZSBleHRlbnNpb24KK1BST0pFQ1QoIkludGVyYWN0aXZlIGRlYnVnIGZhY2lsaXR5IGJhc2VkIG9uIFNXSUciIEMpCisKKworIyBUaGlzIG1vZHVsZSBpcyB1c2luZyBQeXRob24KK1NFVChQeXRob25fQURESVRJT05BTF9WRVJTSU9OUyAyLjcgMi42IDIuNSAyLjQgMi4zIDIuMiAyLjEgMi4wKQorRklORF9QQUNLQUdFKFB5dGhvbkxpYnMpCitJTkNMVURFX0RJUkVDVE9SSUVTKCR7UFlUSE9OX0lOQ0xVREVfUEFUSH0pCisKKyMjIyMjIAorIyBXcmFwcGVyIHRvIGZEIGluIHB5dGhvbgorRklORF9QQUNLQUdFKFNXSUcgUkVRVUlSRUQpCitJTkNMVURFKCR7U1dJR19VU0VfRklMRX0pCitTRVQoQ01BS0VfU1dJR19GTEFHUyAtY2FzdG1vZGUgLXRocmVhZHMpCisKKyMgQWRkIHRoZSBkZXBlbmRlbmNpZXMgZm9yIHJlLXN3aWctaW5nIHRoZSBmaWxlCitTRVQoU1dJR19NT0RVTEVfZkRweV9FWFRSQV9ERVBTIAorCSR7Q01BS0VfQklOQVJZX0RJUn0vaW5jbHVkZS9mcmVlRGlhbWV0ZXIvZnJlZURpYW1ldGVyLWhvc3QuaCAKKwkke0NNQUtFX1NPVVJDRV9ESVJ9L2luY2x1ZGUvZnJlZURpYW1ldGVyL2xpYmZkY29yZS5oIAorCSR7Q01BS0VfU09VUkNFX0RJUn0vaW5jbHVkZS9mcmVlRGlhbWV0ZXIvbGliZmRwcm90by5oIAorCWxpc3RzLmkKKwlkaWN0aW9uYXJ5LmkKKwlzZXNzaW9ucy5pCisJcm91dGluZy5pCisJbWVzc2FnZXMuaQorCWRpc3BhdGNoLmkKKwlxdWV1ZXMuaQorCXBlZXJzLmkKKwlldmVudHMuaQorCWVuZHBvaW50cy5pCisJcG9zaXguaQorCWhvb2tzLmkKKwkpCitTRVRfU09VUkNFX0ZJTEVTX1BST1BFUlRJRVMoZGJnX2ludGVyYWN0aXZlLmkgUFJPUEVSVElFUyBTV0lHX01PRFVMRV9OQU1FIGZEcHkpCisKKyMgVGhlIGZvbGxvd2luZyBjb2RlIGlzIGluc3BpcmVkIGZyb20gU1dJR19BRERfTU9EVUxFLCBidXQgd2UgZG8gb25seSB3aGF0IHdlIG5lZWQKK1NXSUdfTU9EVUxFX0lOSVRJQUxJWkUoZkRweSBweXRob24pCitTV0lHX0FERF9TT1VSQ0VfVE9fTU9EVUxFKGZEcHkgc3dpZ19nZW5lcmF0ZWRfc291cmNlcyAiZGJnX2ludGVyYWN0aXZlLmkiKQorCQorIyBJbiBvcmRlciB0byBhdm9pZCBzaGlwcGluZyB0aGUgcHl0aG9uIGZpbGUgdGhhdCBjb250YWlucyB0aGUgc2hhZG93IGNsYXNzIGRlZmluaXRpb25zLCAKKyMgd2UgdHJhbnNmb3JtIHRoaXMgZmlsZSBpbiBhIEMtc3R5bGUgc3RyaW5nIGFuZCBjb21waWxlIGl0IHdpdGhpbiBvdXIgc29mdHdhcmUuCisjIFdlIHVzZSBmb3IgdGhpcyBwdXJwb3NlIHh4ZCB0b29sIHByb3ZpZGVkIHdpdGggdmltIHBhY2thZ2UuCitGSU5EX1BST0dSQU0oWFhEX0VYRUNVVEFCTEUgeHhkKQorIyBUbyBhdm9pZCB0aGUgZGVwZW5kZW5jeSwgc2ltcGx5IGNvbXBpbGUgaXQgaWYgbm90IHByb3ZpZGVkCitpZiAoTk9UIFhYRF9FWEVDVVRBQkxFKSAKKyAgIFNFVF9TT1VSQ0VfRklMRVNfUFJPUEVSVElFUyhoZWxwZXIveHhkLmMgUFJPUEVSVElFUyBDT01QSUxFX0RFRklOSVRJT05TIFVOSVgpCisgICBBRERfRVhFQ1VUQUJMRSh4eGQgaGVscGVyL3h4ZC5jKQorICAgU0VUKFhYRF9FWEVDVVRBQkxFIHh4ZCkKK2VuZGlmIChOT1QgWFhEX0VYRUNVVEFCTEUpIAorIyBBbmQgbm93IHRoZSBtYWdpYyBjb21tYW5kCitBRERfQ1VTVE9NX0NPTU1BTkQoCisgICAgT1VUUFVUICJmRHB5LWluYy5jIgorICAgIENPTU1BTkQgIiR7WFhEX0VYRUNVVEFCTEV9IgorICAgIEFSR1MgIi1pIgorICAgICJmRHB5LnB5IgorICAgICJmRHB5LWluYy5jIgorICAgIE1BSU5fREVQRU5ERU5DWSAiJHtzd2lnX2V4dHJhX2dlbmVyYXRlZF9maWxlc30iCisgICAgQ09NTUVOVCAiU2hhZG93IGRlZmluaXRpb25zIikgCisKKyMgRW5zdXJlIHRoYXQgdGhlIGdlbmVyYXRlZCBzb3VyY2UgZmlsZXMgYXJlIHJlbW92ZWQKK0dFVF9ESVJFQ1RPUllfUFJPUEVSVFkoc3dpZ19leHRyYV9jbGVhbl9maWxlcyBBRERJVElPTkFMX01BS0VfQ0xFQU5fRklMRVMpCitTRVRfRElSRUNUT1JZX1BST1BFUlRJRVMoUFJPUEVSVElFUworICAgICAgICBBRERJVElPTkFMX01BS0VfQ0xFQU5fRklMRVMgIiR7c3dpZ19leHRyYV9jbGVhbl9maWxlc307JHtzd2lnX2dlbmVyYXRlZF9zb3VyY2VzfTtmRHB5LWluYy5jIikKKworCisjIyMjIworIyBFeHRlbnNpb24gdGhhdCBlbWJlZHMgdGhlIHB5dGhvbiBpbnRlcnByZXRlcgorRkRfQUREX0VYVEVOU0lPTihkYmdfaW50ZXJhY3RpdmUgZGJnX2ludGVyYWN0aXZlLmMgJHtzd2lnX2dlbmVyYXRlZF9zb3VyY2VzfSBmRHB5LWluYy5jKQorVEFSR0VUX0xJTktfTElCUkFSSUVTKGRiZ19pbnRlcmFjdGl2ZSAke1BZVEhPTl9MSUJSQVJJRVN9KQorCisKKyMjIyMKKyMjIElOU1RBTEwgc2VjdGlvbiAjIworCitJTlNUQUxMKFRBUkdFVFMgZGJnX2ludGVyYWN0aXZlCisJTElCUkFSWSBERVNUSU5BVElPTiAke0lOU1RBTExfRVhURU5TSU9OU19TVUZGSVh9CisJQ09NUE9ORU5UIGZyZWVEaWFtZXRlci1kZWJ1Zy10b29scykKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGJnX2ludGVyYWN0aXZlL2RiZ19pbnRlcmFjdGl2ZS5jIGIvZXh0ZW5zaW9ucy9kYmdfaW50ZXJhY3RpdmUvZGJnX2ludGVyYWN0aXZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEzNDdhMgotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGJnX2ludGVyYWN0aXZlL2RiZ19pbnRlcmFjdGl2ZS5jCkBAIC0wLDAgKzEsMTQwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxMywgV0lERSBQcm9qZWN0IGFuZCBOSUNUCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBXSURFIFByb2plY3Qgb3IgTklDVCBub3IgdGhlIAkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFdJREUgUHJvamVjdCBhbmQgCQkJCQkJICoKKyogICBOSUNULgkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxQeXRob24uaD4KKyNpbmNsdWRlIDxmcmVlRGlhbWV0ZXIvZXh0ZW5zaW9uLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKy8qIHdyYXBwZXIgZ2VuZXJhdGVkIGJ5IFNXSUcgKi8KKyNpZiBQWV9WRVJTSU9OX0hFWCA+PSAweDAzMDAwMDAwCisJZXh0ZXJuIHZvaWQgUHlJbml0X19mRHB5KHZvaWQpOworCSNkZWZpbmUgV1JBUFBFUl9JTklUCVB5SW5pdF9fZkRweSgpCisjZWxzZSAvKiBQWV9WRVJTSU9OX0hFWCAqLworCWV4dGVybiB2b2lkIGluaXRfZkRweSh2b2lkKTsKKwkjZGVmaW5lIFdSQVBQRVJfSU5JVAlpbml0X2ZEcHkoKQorI2VuZGlmIC8qIFBZX1ZFUlNJT05fSEVYICovCisJCisvKiBUaGUgc3RyaW5nIGNyZWF0ZWQgaW4gdGhlIHNoYWRvdyBwcm94eSBDIHN0cmluZyBmaWxlICovCitleHRlcm4gdW5zaWduZWQgY2hhciBmRHB5X3B5W107CitleHRlcm4gdW5zaWduZWQgaW50IGZEcHlfcHlfbGVuOworCisvKiBSdW4gYW4gaW50ZXJhY3RpdmUgaW50ZXJwcmV0ZXIgaW4gYSBzZXBhcmF0ZSB0aHJlYWQgKi8KK3N0YXRpYyBwdGhyZWFkX3QgcHlpbnRlcnAgPSAocHRocmVhZF90KU5VTEw7CitzdGF0aWMgdm9pZCAqIG15aW50ZXJwICh2b2lkICogYXJnKQoreworCWNoYXIgKiBkdW1bM10gPSB7ICI8ZGJnX2ludGVyYWN0aXZlPiIsIGFyZywgTlVMTCB9OworCisJVFJBQ0VfRU5UUlkoIiVwIiwgYXJnKTsKKwkKKwlmZF9sb2dfdGhyZWFkbmFtZSAoICJmRHB5IiApOworCQorCUNIRUNLX0ZDVF9ETyhmZF9jb3JlX3dhaXRzdGFydGNvbXBsZXRlKCksIGdvdG8gZW5kKTsKKwkKKwlpZiAoYXJnKSB7CisJCWZkX2xvZ19kZWJ1ZygiU3RhcnRpbmcgcHl0aG9uIGludGVycHJldGVyIHdpdGggYSBzY3JpcHQgZmlsZSBbZXhwZXJpbWVudGFsXS4iKTsKKwkJUHlfTWFpbigyLCBkdW0pOworCX0gZWxzZSB7CisJCWlmICghaXNhdHR5KGZpbGVubyhzdGRpbikpIHx8ICFpc2F0dHkoZmlsZW5vKHN0ZG91dCkpKSB7CisJCQlUUkFDRV9FUlJPUigiW2RiZ19pbnRlcmFjdGl2ZV06IHRoaXMgZXh0ZW5zaW9uIHJlcXVpcmVzIGZyZWVEaWFtZXRlciB0byBiZSBydW4gZnJvbSBhIGNvbnNvbGUgdGVybWluYWwhIik7CisJCQlnb3RvIGVuZDsKKwkJfQorCQlwcmludGYoIlN0YXJ0aW5nIGludGVyYWN0aXZlIHB5dGhvbiBpbnRlcnByZXRlciBbZXhwZXJpbWVudGFsXS5cbiIpOworCQlwcmludGYoIlBsZWFzZSB1c2UgQ3RybC1EIHRvIGV4aXQuXG4iKTsKKwkJcHJpbnRmKCJFeGFtcGxlIHN5bnRheDpcbiIpOworCQlwcmludGYoIiAgID4+PiBwcmludCBjdmFyLmZkX2dfY29uZmlnLmNuZl9kaWFtaWRcbiIpOworCQlwcmludGYoIiAgICclcydcbiIsIGZkX2dfY29uZmlnLT5jbmZfZGlhbWlkKTsKKwkJUHlfTWFpbigxLCBkdW0pOworCQlwcmludGYoIlB5dGhvbiBpbnRlcnByZXRlciBoYXMgZXhpdGVkLi4uXG4iKTsKKwl9CisJCitlbmQ6CQorCS8qIFVwb24gZXhpdCwgaXNzdWUgdGhlIG9yZGVyIG9mIHRlcm1pbmF0aW5nIHRvIGZELCBpZiB0aGUgaW50ZXJwcmV0ZXIgd2FzIHN0YXJ0ZWQgd2l0aG91dCBhIGZpbGUgKi8KKwlpZiAoIWFyZykgeworCQkodm9pZClmZF9jb3JlX3NodXRkb3duKCk7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIFJlZ2lzdGVyIHRoZSBjYWxsYmFja3MgdG8gdGhlIGRhZW1vbiAqLworc3RhdGljIGludCBkaV9tYWluKGNoYXIgKiBjb25mZmlsZSkKK3sKKwljaGFyICogc2hhZG93X2hscCA9IE5VTEw7CisJaW50IG11c3RmcmVlID0gMDsKKwlUUkFDRV9FTlRSWSgiJXAiLCBjb25mZmlsZSk7CisJCisJUHlfSW5pdGlhbGl6ZUV4KDApOworCQorCVdSQVBQRVJfSU5JVDsKKwkKKwkvKiBTbWFsbCBoYWNrIHRvIGF2b2lkIGR1cGxpY2F0aW5nIHRoZSBzdHJpbmcsIHdlIHJlcGxhY2UgdGhlIGxhc3QgY2hhciBieSBhIFwwLgorCSAgSXQgd29ya3MgaWYgdGhlIHB5dGhvbiBmaWxlIGlzIHRlcm1pbmF0ZWQgd2l0aCBzZXZlcmFsIFxuICovCisJaWYgKCAgIChmRHB5X3B5W2ZEcHlfcHlfbGVuIC0gMl0gPT0gJ1xuJykKKwkgICAgJiYgKGZEcHlfcHlbZkRweV9weV9sZW4gLSAxXSA9PSAnXG4nKSkgeworCQlmRHB5X3B5W2ZEcHlfcHlfbGVuIC0gMV0gPSAnXDAnOworCQlzaGFkb3dfaGxwID0gKGNoYXIgKikmZkRweV9weVswXTsKKwl9IGVsc2UgeworCQlDSEVDS19NQUxMT0Moc2hhZG93X2hscCA9IG1hbGxvYyhmRHB5X3B5X2xlbiArIDEpKTsKKwkJbWVtY3B5KHNoYWRvd19obHAsIGZEcHlfcHksIGZEcHlfcHlfbGVuKTsKKwkJc2hhZG93X2hscFtmRHB5X3B5X2xlbl0gPSAnXDAnOworCQltdXN0ZnJlZT0xOworCX0KKwkKKwlQeVJ1bl9TaW1wbGVTdHJpbmcoIl9fZmlsZV9fID0gXCJcIlxuIik7CisJUHlSdW5fU2ltcGxlU3RyaW5nKHNoYWRvd19obHApOworCQorCWlmIChtdXN0ZnJlZSkKKwkJZnJlZShzaGFkb3dfaGxwKTsKKwkJCisJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfY3JlYXRlKCZweWludGVycCwgTlVMTCwgbXlpbnRlcnAsIGNvbmZmaWxlKSApOworIAorCXJldHVybiAwOworfQorCisvKiBUZXJtaW5hdGUgdGhlIGV4dGVuc2lvbiAqLwordm9pZCBmZF9leHRfZmluaSh2b2lkKQoreworCVRSQUNFX0VOVFJZKCk7CisJdm9pZCAqIHJldDsKKwkKKwkvKiBDbGVhbnVwIHRoZSBweXRob24gaW50ZXJwcmV0ZXIgKi8KKwlQeV9GaW5hbGl6ZSgpOworCXB0aHJlYWRfam9pbihweWludGVycCwgJnJldCk7CisJCisJcmV0dXJuIDsKK30KKworLyogRGVmaW5lIHRoZSBlbnRyeSBwb2ludCBmdW5jdGlvbiAqLworRVhURU5TSU9OX0VOVFJZKCJkYmdfaW50ZXJhY3RpdmUiLCBkaV9tYWluKTsKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGJnX2ludGVyYWN0aXZlL2RiZ19pbnRlcmFjdGl2ZS5pIGIvZXh0ZW5zaW9ucy9kYmdfaW50ZXJhY3RpdmUvZGJnX2ludGVyYWN0aXZlLmkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ0NTg0ZgotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGJnX2ludGVyYWN0aXZlL2RiZ19pbnRlcmFjdGl2ZS5pCkBAIC0wLDAgKzEsMjA5IEBACisvKiBUaGlzIGludGVyZmFjZSBmaWxlIGlzIHByb2Nlc3NlZCBieSBTV0lHIHRvIGNyZWF0ZSBhIHB5dGhvbiB3cmFwcGVyIGludGVyZmFjZSB0byBmcmVlRGlhbWV0ZXIgZnJhbWV3b3JrLiAqLworJW1vZHVsZSBmRHB5CislYmVnaW4gJXsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDEzLCBXSURFIFByb2plY3QgYW5kIE5JQ1QJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFdJREUgUHJvamVjdCBvciBOSUNUIG5vciB0aGUgCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgV0lERSBQcm9qZWN0IGFuZCAJCQkJCQkgKgorKiAgIE5JQ1QuCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyV9CisKKyV7CisvKiBUaGlzIHRleHQgaXMgaW5jbHVkZWQgaW4gdGhlIGdlbmVyYXRlZCB3cmFwcGVyIHZlcmJhdGltICovCisjZGVmaW5lIFNXSUcKKyNpbmNsdWRlIDxmcmVlRGlhbWV0ZXIvZXh0ZW5zaW9uLmg+CislfQorCisKKy8qIEluY2x1ZGUgc3RhbmRhcmQgdHlwZXMgJiBmdW5jdGlvbnMgdXNlZCBpbiBmcmVlRGlhbWV0ZXIgaGVhZGVycyAqLworJWluY2x1ZGUgPHN0ZGludC5pPgorLy8laW5jbHVkZSA8Y2RhdGEuaT4KKyVpbmNsdWRlIDxjc3RyaW5nLmk+CislaW5jbHVkZSA8dHlwZW1hcHMuaT4KKworCisvKiBJbmxpbmUgZnVuY3Rpb25zIHNlZW1zIHRvIGdpdmUgcHJvYmxlbXMgdG8gU1dJRyAtLSBqdXN0IHJlbW92ZSB0aGUgaW5saW5lIGRlZmluaXRpb24gKi8KKyVkZWZpbmUgX19pbmxpbmVfXyAKKyVlbmRkZWYKKworCisvKiBNYWtlIHNvbWUgZ2xvYmFsLXZhcmlhYmxlcyByZWFkLW9ubHkgKG1haW5seSB0byBhdm9pZCB3YXJuaW5ncykgKi8KKyVpbW11dGFibGUgZmRfZ19jb25maWc7CislaW1tdXRhYmxlIHBlZXJfc3RhdGVfc3RyOworCisjcHJhZ21hIFNXSUcgbm93YXJuPTQ1MQorCisvKioqKioqKioqKioqKioqKioKKyAqICBFeGNlcHRpb25zICAqCisqKioqKioqKioqKioqKioqKi8KKyV7CisvKiBUaGlzIGlzIG5vdCB0aHJlYWQtc2FmZSBldGMuIGJ1dCBpdCBzaG91bGQgd29yayAvbW9zdCBvZiB0aGUgdGltZS8uICovCitzdGF0aWMgaW50IHdyYXBwZXJfZXJybm87CitzdGF0aWMgUHlPYmplY3QqIHdyYXBwZXJfZXJybm9fcHk7CitzdGF0aWMgY29uc3QgY2hhciAqIHdyYXBwZXJfZXJyb3JfdHh0OyAvKiBpZiBOVUxMLCB1c2Ugc3RyZXJyb3IoZXJybm8pICovCisjZGVmaW5lIERJX0VSUk9SKGNvZGUsIHB5Y29kZSwgc3RyKSB7CVwKKwlmZF9sb2dfZGVidWcoIltkYmdfaW50ZXJhY3RpdmVdIEVSUk9SOiAlczogJXMiLCBfX1BSRVRUWV9GVU5DVElPTl9fLCBzdHIgPyBzdHIgOiBzdHJlcnJvcihjb2RlKSk7IFwKKwl3cmFwcGVyX2Vycm5vID0gY29kZTsJCVwKKwl3cmFwcGVyX2Vycm5vX3B5ID0gcHljb2RlOwlcCisJd3JhcHBlcl9lcnJvcl90eHQgPSBzdHI7CVwKK30KKworI2RlZmluZSBESV9FUlJPUl9NQUxMT0MJXAorCSBESV9FUlJPUihFTk9NRU0sIFB5RXhjX01lbW9yeUVycm9yLCBOVUxMKQorCislfQorCislZXhjZXB0aW9uIHsKKwkvKiByZXNldCB0aGUgZXJybm8gKi8KKwl3cmFwcGVyX2Vycm5vID0gMDsKKwkvKiBDYWxsIHRoZSBmdW5jdGlvbiAgLS0gaXQgd2lsbCB1c2UgRElfRVJST1IgbWFjcm8gaW4gY2FzZSBvZiBlcnJvciAqLworCSRhY3Rpb24KKwkvKiBOb3csIHRlc3QgZm9yIGVycm9yICovCisJaWYgKHdyYXBwZXJfZXJybm8pIHsKKwkJY29uc3QgY2hhciAqIHN0ciA9IHdyYXBwZXJfZXJyb3JfdHh0ID8gd3JhcHBlcl9lcnJvcl90eHQgOiBzdHJlcnJvcih3cmFwcGVyX2Vycm5vKTsKKwkJUHlPYmplY3QgKiBleGMgPSB3cmFwcGVyX2Vycm5vX3B5OworCQlpZiAoIWV4YykgeworCQkJc3dpdGNoICh3cmFwcGVyX2Vycm5vKSB7CisJCQkJY2FzZSBFTk9NRU06IGV4YyA9IFB5RXhjX01lbW9yeUVycm9yOyBicmVhazsKKwkJCQljYXNlIEVJTlZBTDogZXhjID0gUHlFeGNfVmFsdWVFcnJvcjsgYnJlYWs7CisJCQkJZGVmYXVsdDogZXhjID0gUHlFeGNfUnVudGltZUVycm9yOworCQkJfQorCQl9CisJCVNXSUdfUFlUSE9OX1RIUkVBRF9CRUdJTl9CTE9DSzsKKwkJUHlFcnJfU2V0U3RyaW5nKGV4Yywgc3RyKTsKKwkJU1dJR19mYWlsOworCQlTV0lHX1BZVEhPTl9USFJFQURfRU5EX0JMT0NLOworCX0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBTb21lIHR5cGVzICYgdHlwZW1hcHMgZm9yIHVzYWJpbGl0eSAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworJWFwcGx5IChjaGFyICpTVFJJTkcsIHNpemVfdCBMRU5HVEgpIHsgKCBjaGFyICogc3RyaW5nLCBzaXplX3QgbGVuICkgfTsKKyVhcHBseSAoY2hhciAqU1RSSU5HLCBzaXplX3QgTEVOR1RIKSB7ICggdWludDhfdCAqIHN0cmluZywgc2l6ZV90IGxlbiApIH07CisKKy8qIEdlbmVyaWMgdHlwZW1hcCBmb3IgZnVuY3Rpb25zIHRoYXQgY3JlYXRlIHNvbWV0aGluZyAqLworJXR5cGVtYXAoaW4sIG51bWlucHV0cz0wLG5vYmxvY2s9MSkgU1dJR1RZUEUgKiogT1VUUFVUICh2b2lkICp0ZW1wID0gTlVMTCkgeworCSQxID0gKHZvaWQgKikmdGVtcDsKK30KKyV0eXBlbWFwKGFyZ291dCxub2Jsb2NrPTEpIFNXSUdUWVBFICoqIE9VVFBVVCB7CisJJWFwcGVuZF9vdXRwdXQoU1dJR19OZXdQb2ludGVyT2JqKCokMSwgJCoxX2Rlc2NyaXB0b3IsIDApKTsKK30KKworLyogQ2FzZSBvZiB0aGUgZmRfKl9kdW1wIGZ1bmN0aW9ucyAqLworJXR5cGVtYXAoaW4sbm9ibG9jaz0xLG51bWlucHV0cz0wKSAoY2hhciAqKiBidWYsIHNpemVfdCAqbGVuLCBzaXplX3QgKm9mZnNldCkgKCQqMV9sdHlwZSB0ZW1wID0gTlVMTCwgJCoyX2x0eXBlIHRlbXBuID0gMCkgeworCSQxID0gJnRlbXA7ICQyID0gJnRlbXBuOyAkMyA9IE5VTEw7Cit9CisldHlwZW1hcChmcmVlYXJnLG1hdGNoPSJpbiIpIChjaGFyICoqIGJ1Ziwgc2l6ZV90ICpsZW4sIHNpemVfdCAqb2Zmc2V0KSAiIjsKKyV0eXBlbWFwKGFyZ291dCxub2Jsb2NrPTEsZnJhZ21lbnQ9IlNXSUdfRnJvbUNoYXJQdHIiKShjaGFyICoqIGJ1Ziwgc2l6ZV90ICpsZW4sIHNpemVfdCAqb2Zmc2V0KSB7IAorICBpZiAoKiQxKSB7CisgICAgJWFwcGVuZF9vdXRwdXQoU1dJR19Gcm9tQ2hhclB0cigqJDEpKTsKKyAgICBmcmVlKCokMSk7CQkJCQkgIAkgICAgIAorICB9CQkJCQkgIAkgICAgIAorfQkJCQkJCQkgICAgIAorCisvKiBUeXBlbWFwIHRvIHJldHVybiBhIGJvb2xlYW4gdmFsdWUgYXMgb3V0cHV0IHBhcmFtZXRlciAqLworJXR5cGVtYXAoaW4sIG51bWlucHV0cz0wLG5vYmxvY2s9MSkgaW50ICogQk9PTF9PVVQgKGludCB0ZW1wKSB7CisJJDEgPSAmdGVtcDsKK30KKyV0eXBlbWFwKGFyZ291dCxub2Jsb2NrPTEpIGludCAqIEJPT0xfT1VUIHsKKwlQeU9iamVjdCAqIHI7CisJaWYgKCokMSkKKwkJciA9IFB5X1RydWU7CisJZWxzZQorCQlyID0gUHlfRmFsc2U7CisJUHlfWElOQ1JFRihyKTsKKwklYXBwZW5kX291dHB1dChyKTsKK30KKworLyogVG8gYWxsb3cgcGFzc2luZyBjYWxsYmFjayBmdW5jdGlvbnMgZGVmaW5lZCBpbiBweXRob24gKi8KKyV0eXBlbWFwKGluKSBQeU9iamVjdCAqUHlDYiB7CisJaWYgKCEkaW5wdXQgfHwgKCRpbnB1dCA9PSBQeV9Ob25lKSkgeworCQkkMSA9IE5VTEw7CisJfSBlbHNlIHsKKwkJaWYgKCFQeUNhbGxhYmxlX0NoZWNrKCRpbnB1dCkpIHsKKwkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJOZWVkIGEgY2FsbGFibGUgb2JqZWN0ISIpOworCQkJU1dJR19mYWlsOworCQl9CisJCSQxID0gJGlucHV0OworCX0KK30KKworJXsKKy8qIEZvcndhcmQgZGVjbGFyYXRpb24gZm9yIHRoZSBwZWVycyBtb2R1bGUgKi8KK3N0YXRpYyB2b2lkIGZkX2FkZF9jYihzdHJ1Y3QgcGVlcl9pbmZvICpwZWVyLCB2b2lkICpkYXRhKTsKKworLyogVGhpcyBvbmUgZ2l2ZXMgcHJvYmxlbXMgd2hlbiBpbmNsdWRlZCBmcm9tIHRoZSBoZWFkZXIgZmlsZSAqLwordm9pZCBmZF9sb2dfdmEoIGludCwgY29uc3QgY2hhciAqLCB2YV9saXN0KTsKK3ZvaWQgZmRfbG9nX2RlcHJlY2F0ZWQoIGludCBsZXZlbCwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4gKSBNQVJLX0RFUFJFQ0FURUQKK3sgCisJdmFfbGlzdCBhcDsKKwl2YV9zdGFydChhcCwgZm9ybWF0KTsKKwlmZF9sb2dfdmEobGV2ZWwsIGZvcm1hdCwgYXApOworCXZhX2VuZChhcCk7Cit9CisKKyV9CisKKy8qIE92ZXJ3cml0ZSBkZWNsYXJhdGlvbiB0byBhcHBseSB0eXBlbWFwcyAqLworaW50IGZkX3Nlc3NfZnJvbXNpZCAoIHVpbnQ4X3QgKiBzdHJpbmcsIHNpemVfdCBsZW4sIHN0cnVjdCBzZXNzaW9uICoqIE9VVFBVVCwgaW50ICogQk9PTF9PVVQpOworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIE5vdywgY3JlYXRlIHdyYXBwZXJzIGZvciAoYWxtb3N0KSBhbGwgb2JqZWN0cyBmcm9tIGZEIEFQSSAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCislaW5jbHVkZSAiZnJlZURpYW1ldGVyL2ZyZWVEaWFtZXRlci1ob3N0LmgiCislaW5jbHVkZSAiZnJlZURpYW1ldGVyL2xpYmZkcHJvdG8uaCIKKyVpbmNsdWRlICJmcmVlRGlhbWV0ZXIvbGliZmRjb3JlLmgiCisKKy8qIE1vc3Qgb2YgdGhlIGZ1bmN0aW9ucyBmcm9tIHRoZSBBUEkgYXJlIG5vdCBkaXJlY3RseSB1c2FibGUgImFzIGlzIi4KK1NlZSB0aGUgc3BlY2lmaWMgZm9sbG93aW5nIGZpbGVzIGFuZCB0aGUgZGJnX2ludGVyYWN0aXZlLnB5LnNhbXBsZSBmaWxlCitmb3IgbW9yZSB1c2FibGUgcHl0aG9uLXN0eWxlIHZlcnNpb25zLgorKi8KKworJWluY2x1ZGUgImxpc3RzLmkiCislaW5jbHVkZSAiZGljdGlvbmFyeS5pIgorJWluY2x1ZGUgInNlc3Npb25zLmkiCislaW5jbHVkZSAicm91dGluZy5pIgorJWluY2x1ZGUgIm1lc3NhZ2VzLmkiCislaW5jbHVkZSAiZGlzcGF0Y2guaSIKKyVpbmNsdWRlICJxdWV1ZXMuaSIKKworJWluY2x1ZGUgInBlZXJzLmkiCislaW5jbHVkZSAiZXZlbnRzLmkiCislaW5jbHVkZSAiZW5kcG9pbnRzLmkiCislaW5jbHVkZSAiaG9va3MuaSIKKworJWluY2x1ZGUgInBvc2l4LmkiCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RiZ19pbnRlcmFjdGl2ZS9kaWN0aW9uYXJ5LmkgYi9leHRlbnNpb25zL2RiZ19pbnRlcmFjdGl2ZS9kaWN0aW9uYXJ5LmkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFjOWJlOAotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGJnX2ludGVyYWN0aXZlL2RpY3Rpb25hcnkuaQpAQCAtMCwwICsxLDQxNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTMsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBEbyBub3QgaW5jbHVkZSB0aGlzIGRpcmVjdGx5LCB1c2UgZGJnX2ludGVyYWN0aXZlLmkgaW5zdGVhZCAqLworCisvKioqKioqIERJQ1RJT05BUlkgKioqKioqKioqLworCitzdHJ1Y3QgZGljdGlvbmFyeSB7Cit9OworCislZXh0ZW5kIGRpY3Rpb25hcnkgeworCWRpY3Rpb25hcnkoKSB7CisJCXN0cnVjdCBkaWN0aW9uYXJ5ICogciA9IE5VTEw7CisJCWludCByZXQgPSBmZF9kaWN0X2luaXQoJnIpOworCQlpZiAocmV0ICE9IDApIHsKKwkJCURJX0VSUk9SKHJldCwgTlVMTCwgTlVMTCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlyZXR1cm4gcjsKKwl9CisJfmRpY3Rpb25hcnkoKSB7CisJCXN0cnVjdCBkaWN0aW9uYXJ5ICpkID0gc2VsZjsKKwkJaW50IHJldCA9IGZkX2RpY3RfZmluaSgmZCk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJRElfRVJST1IocmV0LCBOVUxMLCBOVUxMKTsKKwkJfQorCQlyZXR1cm47CisJfQorCXZvaWQgZHVtcCgpIHsKKwkJY2hhciAqIGJ1ZiA9IE5VTEw7CisJCXNpemVfdCBsZW47CisJCXByaW50ZigiJXMiLCBmZF9kaWN0X2R1bXAoJmJ1ZiwgJmxlbiwgTlVMTCwgJHNlbGYpKTsKKwkJZnJlZShidWYpOworCX0KKwlQeU9iamVjdCAqIHZlbmRvcnNfbGlzdCgpIHsKKwkJdWludDMyX3QgKmxpc3QgPSBOVUxMLCAqbGk7CisJCVB5T2JqZWN0ICogcmV0OworCQlTV0lHX1BZVEhPTl9USFJFQURfQkVHSU5fQkxPQ0s7CisJCXJldCA9IFB5TGlzdF9OZXcoMCk7CisJCWxpc3QgPSBmZF9kaWN0X2dldF92ZW5kb3JpZF9saXN0KCRzZWxmKTsKKwkJZm9yIChsaSA9IGxpc3Q7ICpsaSAhPSAwOyBsaSsrKSB7CisJCQlQeUxpc3RfQXBwZW5kKHJldCwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpKmxpKSk7CisJCX0KKwkJZnJlZShsaXN0KTsKKwkJU1dJR19QWVRIT05fVEhSRUFEX0VORF9CTE9DSzsKKwkJcmV0dXJuIHJldDsKKwl9CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogbmV3X29iaihlbnVtIGRpY3Rfb2JqZWN0X3R5cGUgdHlwZSwgdm9pZCAqIGRhdGEsIHN0cnVjdCBkaWN0X29iamVjdCAqIHBhcmVudCA9IE5VTEwpIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogb2JqID0gTlVMTDsKKwkJaW50IHJldCA9IGZkX2RpY3RfbmV3KCRzZWxmLCB0eXBlLCBkYXRhLCBwYXJlbnQsICZvYmopOworCQlpZiAocmV0ICE9IDApIHsKKwkJCURJX0VSUk9SKHJldCwgTlVMTCwgTlVMTCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlyZXR1cm4gb2JqOworCX0KKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBzZWFyY2goZW51bSBkaWN0X29iamVjdF90eXBlIHR5cGUsIGludCBjcml0ZXJpYSwgaW50IHdoYXRfYnlfdmFsKSB7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIG9iaiA9IE5VTEw7CisJCWludCByZXQgPSBmZF9kaWN0X3NlYXJjaCAoICRzZWxmLCB0eXBlLCBjcml0ZXJpYSwgJndoYXRfYnlfdmFsLCAmb2JqLCBFTk9FTlQgKTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlESV9FUlJPUihyZXQsIE5VTEwsIE5VTEwpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJcmV0dXJuIG9iajsKKwl9CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogc2VhcmNoKGVudW0gZGljdF9vYmplY3RfdHlwZSB0eXBlLCBpbnQgY3JpdGVyaWEsIGNoYXIgKiB3aGF0X2J5X3N0cmluZykgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBvYmogPSBOVUxMOworCQlpbnQgcmV0ID0gZmRfZGljdF9zZWFyY2ggKCAkc2VsZiwgdHlwZSwgY3JpdGVyaWEsIHdoYXRfYnlfc3RyaW5nLCAmb2JqLCBFTk9FTlQgKTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlESV9FUlJPUihyZXQsIE5VTEwsIE5VTEwpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJcmV0dXJuIG9iajsKKwl9CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogc2VhcmNoKGVudW0gZGljdF9vYmplY3RfdHlwZSB0eXBlLCBpbnQgY3JpdGVyaWEsIHZvaWQgKiB3aGF0KSB7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIG9iaiA9IE5VTEw7CisJCWludCByZXQgPSBmZF9kaWN0X3NlYXJjaCAoICRzZWxmLCB0eXBlLCBjcml0ZXJpYSwgd2hhdCwgJm9iaiwgRU5PRU5UICk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJRElfRVJST1IocmV0LCBOVUxMLCBOVUxMKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXJldHVybiBvYmo7CisJfQorCXN0cnVjdCBkaWN0X29iamVjdCAqIGVycm9yX2NtZCgpIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogb2JqID0gTlVMTDsKKwkJaW50IHJldCA9IGZkX2RpY3RfZ2V0X2Vycm9yX2NtZCAoICRzZWxmLCAmb2JqICk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJRElfRVJST1IocmV0LCBOVUxMLCBOVUxMKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXJldHVybiBvYmo7CisJfQorfQorCislbm9kZWZhdWx0Y3RvciBkaWN0X29iamVjdDsKK3N0cnVjdCBkaWN0X29iamVjdCB7Cit9OworCislZXh0ZW5kIGRpY3Rfb2JqZWN0IHsKKwl2b2lkIGR1bXAoKSB7CisJCWNoYXIgKiBidWYgPSBOVUxMOworCQlzaXplX3QgbGVuOworCQlwcmludGYoIiVzIiwgZmRfZGljdF9kdW1wX29iamVjdCgmYnVmLCAmbGVuLCBOVUxMLCAkc2VsZikpOworCQlmcmVlKGJ1Zik7CisJfQorCWVudW0gZGljdF9vYmplY3RfdHlwZSBnZXR0eXBlKCkgeworCQllbnVtIGRpY3Rfb2JqZWN0X3R5cGUgdDsKKwkJaW50IHJldCA9IGZkX2RpY3RfZ2V0dHlwZSAoICRzZWxmLCAmdCk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJRElfRVJST1IocmV0LCBOVUxMLCBOVUxMKTsKKwkJCXJldHVybiAwOworCQl9CisJCXJldHVybiB0OworCX0KKwlzdHJ1Y3QgZGljdGlvbmFyeSAqIGdldGRpY3QoKSB7CisJCXN0cnVjdCBkaWN0aW9uYXJ5ICpkOworCQlpbnQgcmV0ID0gZmRfZGljdF9nZXRkaWN0ICggJHNlbGYsICZkICk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJRElfRVJST1IocmV0LCBOVUxMLCBOVUxMKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXJldHVybiBkOworCX0KKwkvKiBTaW5jZSBjYXN0aW5nIHRoZSBwb2ludGVyIHJlcXVpcmVzIGludGVsbGlnZW5jZSwgd2UgZG8gaXQgaGVyZSBpbnN0ZWFkIG9mIGdpdmluZyBpdCB0byBTV0lHICovCisJUHlPYmplY3QgKiBnZXR2YWwoKSB7CisJCS8qIGZpcnN0LCBnZXQgdGhlIHR5cGUgKi8KKwkJZW51bSBkaWN0X29iamVjdF90eXBlIHQ7CisJCWludCByZXQgPSBmZF9kaWN0X2dldHR5cGUgKCAkc2VsZiwgJnQpOworCQlpZiAocmV0ICE9IDApIHsKKwkJCURJX0VSUk9SKHJldCwgTlVMTCwgTlVMTCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlzd2l0Y2ggKHQpIHsKKyVkZWZpbmUgJUdFVFZBTF9DQVNFKFRZUEUsU1RSVUNUKQorCQkJY2FzZSBUWVBFOiB7CisJCQkJUHlPYmplY3QgKiB2ID0gTlVMTDsKKwkJCQlzdHJ1Y3QgU1RSVUNUICogZGF0YSA9IE5VTEw7CisJCQkJZGF0YSA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IFNUUlVDVCkpOworCQkJCWlmICghZGF0YSkgeworCQkJCQlESV9FUlJPUl9NQUxMT0M7CisJCQkJCXJldHVybiBOVUxMOworCQkJCX0KKwkJCQlyZXQgPSBmZF9kaWN0X2dldHZhbCgkc2VsZiwgZGF0YSk7CisJCQkJaWYgKHJldCAhPSAwKSB7CisJCQkJCURJX0VSUk9SKHJldCwgTlVMTCwgTlVMTCk7CisJCQkJCWZyZWUoZGF0YSk7CisJCQkJCXJldHVybiBOVUxMOworCQkJCX0KKwkJCQlTV0lHX1BZVEhPTl9USFJFQURfQkVHSU5fQkxPQ0s7CisJCQkJdiA9IFNXSUdfTmV3UG9pbnRlck9iaigodm9pZCAqKWRhdGEsIFNXSUdUWVBFX3BfIyNTVFJVQ1QsIFNXSUdfUE9JTlRFUl9PV04gKTsKKwkJCQlQeV9YSU5DUkVGKHYpOworCQkJCVNXSUdfUFlUSE9OX1RIUkVBRF9FTkRfQkxPQ0s7CisJCQkJcmV0dXJuIHY7CisJCQl9IGJyZWFrCislZW5kZGVmCisJCQklR0VUVkFMX0NBU0UoIERJQ1RfVkVORE9SLCAJZGljdF92ZW5kb3JfZGF0YSApOworCQkJJUdFVFZBTF9DQVNFKCBESUNUX0FQUExJQ0FUSU9OLCBkaWN0X2FwcGxpY2F0aW9uX2RhdGEgKTsKKwkJCSVHRVRWQUxfQ0FTRSggRElDVF9UWVBFLCAJZGljdF90eXBlX2RhdGEgKTsKKwkJCSVHRVRWQUxfQ0FTRSggRElDVF9FTlVNVkFMLCAJZGljdF9lbnVtdmFsX2RhdGEgKTsKKwkJCSVHRVRWQUxfQ0FTRSggRElDVF9BVlAsIAlkaWN0X2F2cF9kYXRhICk7CisJCQklR0VUVkFMX0NBU0UoIERJQ1RfQ09NTUFORCwgCWRpY3RfY21kX2RhdGEgKTsKKwkJCSVHRVRWQUxfQ0FTRSggRElDVF9SVUxFLCAJZGljdF9ydWxlX2RhdGEgKTsKKwkJCWRlZmF1bHQ6CisJCQkJRElfRVJST1IoRUlOVkFMLCBQeUV4Y19TeXN0ZW1FcnJvciwgIkludGVybmFsIGVycm9yOiBHb3QgaW52YWxpZCBvYmplY3QgdHlwZSIpOworCQl9CisJCXJldHVybiBOVUxMOworCX0KK30KKworCisvKiBUaGUgZm9sbG93aW5nIHdyYXBwZXIgbGVha3MgbWVtb3J5IGVhY2ggdGltZSBhbiB1bmlvbiBhdnBfdmFsdWUgaXMgYXNzaWduZWQgYW4gb2N0ZXQgc3RyaW5nLgorIFRPRE86IGZpeCB0aGlzIGxlYWsgYnkgYmV0dGVyIHVuZGVyc3RhbmRpbmcgU1dJRy4uLiAKKyAgIC0tIHRoZSBhbHRlcm5hdGl2ZSBpcyB0byB1bmNvbW1lbnQgdGhlICJmcmVlIiBzdGF0ZW1lbnRzIGJlbG93LCBidXQgdGhlbiBpdCBpcyBlYXN5IHRvCisgICBjcmVhdGUgYSBzZWdtZW50YXRpb24gZmF1bHQgYnkgYXNzaWduaW5nIGZpcnN0IGFuIGludGVnZXIsIHRoZW4gYW4gb2N0ZXRzdHJpbmcuCisgKi8KKyVleHRlbmQgYXZwX3ZhbHVlIHsKKwkvKiBUaGUgZm9sbG93aW5nIGhhY2sgaW4gdGhlIHByb3h5IGZpbGUgYWxsb3dzIGFzc2lnbmluZyB0aGUgb2N0ZXQgc3RyaW5nIGRpcmVjdGx5IGxpa2UgdGhpczoKKwlhdnBfdmFsdWUub3MgPSAiYmxhYmxhIgorCSovCisJJXB5dGhvbmNvZGUKKwl7CisgICAgX19zd2lnX3NldG1ldGhvZHNfX1sib3MiXSA9IF9mRHB5LmF2cF92YWx1ZV9vc19zZXQKKyAgICBpZiBfbmV3Y2xhc3M6b3MgPSBfc3dpZ19wcm9wZXJ0eShfZkRweS5hdnBfdmFsdWVfb3NfZ2V0LCBfZkRweS5hdnBfdmFsdWVfb3Nfc2V0KQorCX0KKwl2b2lkIG9zX3NldChjaGFyICpTVFJJTkcsIHNpemVfdCBMRU5HVEgpIHsKKwkJLyogZnJlZSgkc2VsZi0+b3MuZGF0YSk7ICAtLSBkbyBub3QgZnJlZSwgaW4gY2FzZSB0aGUgcHJldmlvdXMgdmFsdWUgd2FzIG5vdCBhbiBPUyAqLworCQkkc2VsZi0+b3MuZGF0YSA9IG1hbGxvYyhMRU5HVEgpOworCQlpZiAoISRzZWxmLT5vcy5kYXRhKSB7CisJCQlESV9FUlJPUl9NQUxMT0M7CisJCQlyZXR1cm47CisJCX0KKwkJbWVtY3B5KCRzZWxmLT5vcy5kYXRhLCBTVFJJTkcsIExFTkdUSCk7CisJCSRzZWxmLT5vcy5sZW4gPSBMRU5HVEg7CisJfQorCXZvaWQgb3Nfc2V0KGF2cF92YWx1ZV9vcyAqIG9zKSB7CisJCS8qIGZyZWUoJHNlbGYtPm9zLmRhdGEpOyAgLS0gZG8gbm90IGZyZWUsIGluIGNhc2UgdGhlIHByZXZpb3VzIHZhbHVlIHdhcyBub3QgYW4gT1MgKi8KKwkJJHNlbGYtPm9zLmRhdGEgPSBtYWxsb2Mob3MtPmxlbik7CisJCWlmICghJHNlbGYtPm9zLmRhdGEpIHsKKwkJCURJX0VSUk9SX01BTExPQzsKKwkJCXJldHVybjsKKwkJfQorCQltZW1jcHkoJHNlbGYtPm9zLmRhdGEsIG9zLT5kYXRhLCBvcy0+bGVuKTsKKwkJJHNlbGYtPm9zLmxlbiA9IG9zLT5sZW47CisJfQorfTsKKworJWV4dGVuZCBhdnBfdmFsdWVfb3MgeworCXZvaWQgZHVtcCgpIHsKKwkJJSNkZWZpbmUgTEVOX01BWCAyMAorCQlpbnQgaSwgbj1MRU5fTUFYOworCQlpZiAoJHNlbGYtPmxlbiA8IExFTl9NQVgpCisJCQluID0gJHNlbGYtPmxlbjsKKwkJZmRfbG9nX2RlYnVnKCJsOiV1LCB2OlsiLCAkc2VsZi0+bGVuKTsKKwkJZm9yIChpPTA7IGkgPCBuOyBpKyspCisJCQlmZF9sb2dfZGVidWcoIiUwMi4yWCIsICRzZWxmLT5kYXRhW2ldKTsKKwkJZmRfbG9nX2RlYnVnKCJdICclLipzJXMnIiwgbiwgJHNlbGYtPmRhdGEsIG4gPT0gTEVOX01BWCA/ICIuLi4iIDogIiIpOworCX0KKwklY3N0cmluZ19vdXRwdXRfYWxsb2NhdGVfc2l6ZShjaGFyICoqIG91dGJ1ZmZlciwgc2l6ZV90ICogb3V0bGVuLCBmcmVlKCokMSkpOworCXZvaWQgYXNfc3RyICggY2hhciAqKiBvdXRidWZmZXIsIHNpemVfdCAqIG91dGxlbiApIHsKKwkJY2hhciAqIGI7CisJCWlmICghJHNlbGYtPmxlbikgeworCQkJKm91dGxlbiA9IDA7CisJCQkqb3V0YnVmZmVyID0gTlVMTDsKKwkJCXJldHVybjsKKwkJfQorCQliID0gbWFsbG9jKCRzZWxmLT5sZW4pOworCQlpZiAoIWIpIHsKKwkJCURJX0VSUk9SX01BTExPQzsKKwkJCXJldHVybjsKKwkJfQorCQltZW1jcHkoYiwgJHNlbGYtPmRhdGEsICRzZWxmLT5sZW4pOworCQkqb3V0bGVuID0gJHNlbGYtPmxlbjsKKwkJKm91dGJ1ZmZlciA9IGI7CisJfQorfQorCisKKy8qIEFsbG93IGNvbnN0cnVjdG9ycyB3aXRoIHBhcmFtZXRlcnMgZm9yIHRoZSBkaWN0XypfZGF0YSAqLworJWV4dGVuZCBkaWN0X3ZlbmRvcl9kYXRhIHsKKwlkaWN0X3ZlbmRvcl9kYXRhKHVpbnQzMl90IGlkID0gMCwgY2hhciAqIG5hbWUgPSBOVUxMKSB7CisJCXN0cnVjdCBkaWN0X3ZlbmRvcl9kYXRhICogZCA9IChzdHJ1Y3QgZGljdF92ZW5kb3JfZGF0YSAqKWNhbGxvYygxLCBzaXplb2Yoc3RydWN0IGRpY3RfdmVuZG9yX2RhdGEpKTsKKwkJaWYgKCFkKSB7CisJCQlESV9FUlJPUl9NQUxMT0M7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlkLT52ZW5kb3JfaWQgPSBpZDsKKwkJaWYgKG5hbWUpIHsKKwkJCWQtPnZlbmRvcl9uYW1lID0gc3RyZHVwKG5hbWUpOworCQkJaWYgKCFkLT52ZW5kb3JfbmFtZSkgeworCQkJCURJX0VSUk9SX01BTExPQzsKKwkJCQlmcmVlKGQpOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQl9CisJCXJldHVybiBkOworCX0KK30KKworJWV4dGVuZCBkaWN0X2FwcGxpY2F0aW9uX2RhdGEgeworCWRpY3RfYXBwbGljYXRpb25fZGF0YSh1aW50MzJfdCBpZCA9IDAsIGNoYXIgKiBuYW1lID0gTlVMTCkgeworCQlzdHJ1Y3QgZGljdF9hcHBsaWNhdGlvbl9kYXRhICogZCA9IChzdHJ1Y3QgZGljdF9hcHBsaWNhdGlvbl9kYXRhICopY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgZGljdF9hcHBsaWNhdGlvbl9kYXRhKSk7CisJCWlmICghZCkgeworCQkJRElfRVJST1JfTUFMTE9DOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJZC0+YXBwbGljYXRpb25faWQgPSBpZDsKKwkJaWYgKG5hbWUpIHsKKwkJCWQtPmFwcGxpY2F0aW9uX25hbWUgPSBzdHJkdXAobmFtZSk7CisJCQlpZiAoIWQtPmFwcGxpY2F0aW9uX25hbWUpIHsKKwkJCQlESV9FUlJPUl9NQUxMT0M7CisJCQkJZnJlZShkKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZDsKKwl9Cit9CisKKyVleHRlbmQgZGljdF90eXBlX2RhdGEgeworCWRpY3RfdHlwZV9kYXRhKGVudW0gZGljdF9hdnBfYmFzZXR5cGUgYmFzZSA9IDAsIGNoYXIgKiBuYW1lID0gTlVMTCkgeworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgKiBkID0gKHN0cnVjdCBkaWN0X3R5cGVfZGF0YSAqKWNhbGxvYygxLCBzaXplb2Yoc3RydWN0IGRpY3RfdHlwZV9kYXRhKSk7CisJCWlmICghZCkgeworCQkJRElfRVJST1JfTUFMTE9DOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJZC0+dHlwZV9iYXNlID0gYmFzZTsKKwkJaWYgKG5hbWUpIHsKKwkJCWQtPnR5cGVfbmFtZSA9IHN0cmR1cChuYW1lKTsKKwkJCWlmICghZC0+dHlwZV9uYW1lKSB7CisJCQkJRElfRVJST1JfTUFMTE9DOworCQkJCWZyZWUoZCk7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCX0KKwkJcmV0dXJuIGQ7CisJfQorfQorCislZXh0ZW5kIGRpY3RfZW51bXZhbF9kYXRhIHsKKwlkaWN0X2VudW12YWxfZGF0YShjaGFyICogbmFtZSA9IE5VTEwsIHVpbnQzMl90IHYgPSAwKSB7CisJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAqIGQgPSAoc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICopY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEpKTsKKwkJaWYgKCFkKSB7CisJCQlESV9FUlJPUl9NQUxMT0M7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlpZiAobmFtZSkgeworCQkJZC0+ZW51bV9uYW1lID0gc3RyZHVwKG5hbWUpOworCQkJaWYgKCFkLT5lbnVtX25hbWUpIHsKKwkJCQlESV9FUlJPUl9NQUxMT0M7CisJCQkJZnJlZShkKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJfQorCQlkLT5lbnVtX3ZhbHVlLnUzMiA9IHY7CisJCXJldHVybiBkOworCX0KK30KKworJWV4dGVuZCBkaWN0X2F2cF9kYXRhIHsKKwlkaWN0X2F2cF9kYXRhKHVpbnQzMl90IGNvZGUgPSAwLCBjaGFyICogbmFtZSA9IE5VTEwsIGVudW0gZGljdF9hdnBfYmFzZXR5cGUgYmFzZXR5cGUgPSAwLCB1aW50MzJfdCB2ZW5kb3IgPSAwLCBpbnQgbWFuZGF0b3J5PTApIHsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgKiBkID0gKHN0cnVjdCBkaWN0X2F2cF9kYXRhICopY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgZGljdF9hdnBfZGF0YSkpOworCQlpZiAoIWQpIHsKKwkJCURJX0VSUk9SX01BTExPQzsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWlmIChuYW1lKSB7CisJCQlkLT5hdnBfbmFtZSA9IHN0cmR1cChuYW1lKTsKKwkJCWlmICghZC0+YXZwX25hbWUpIHsKKwkJCQlESV9FUlJPUl9NQUxMT0M7CisJCQkJZnJlZShkKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJfQorCQlkLT5hdnBfY29kZSA9IGNvZGU7CisJCWQtPmF2cF9iYXNldHlwZSA9IGJhc2V0eXBlOworCQlkLT5hdnBfdmVuZG9yID0gdmVuZG9yOworCQlpZiAodmVuZG9yKSB7CisJCQlkLT5hdnBfZmxhZ192YWwgfD0gQVZQX0ZMQUdfVkVORE9SOworCQkJZC0+YXZwX2ZsYWdfbWFzayB8PSBBVlBfRkxBR19WRU5ET1I7CisJCX0KKwkJZC0+YXZwX2ZsYWdfbWFzayB8PSBBVlBfRkxBR19NQU5EQVRPUlk7CisJCWlmIChtYW5kYXRvcnkpCisJCQlkLT5hdnBfZmxhZ192YWwgfD0gQVZQX0ZMQUdfTUFOREFUT1JZOworCQlyZXR1cm4gZDsKKwl9Cit9CisKKyVleHRlbmQgZGljdF9jbWRfZGF0YSB7CisJZGljdF9jbWRfZGF0YSh1aW50MzJfdCBjb2RlID0gMCwgY2hhciAqIG5hbWUgPSBOVUxMLCBpbnQgcmVxdWVzdCA9IDEpIHsKKwkJc3RydWN0IGRpY3RfY21kX2RhdGEgKiBkID0gKHN0cnVjdCBkaWN0X2NtZF9kYXRhICopY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgZGljdF9jbWRfZGF0YSkpOworCQlpZiAoIWQpIHsKKwkJCURJX0VSUk9SX01BTExPQzsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWlmIChuYW1lKSB7CisJCQlkLT5jbWRfbmFtZSA9IHN0cmR1cChuYW1lKTsKKwkJCWlmICghZC0+Y21kX25hbWUpIHsKKwkJCQlESV9FUlJPUl9NQUxMT0M7CisJCQkJZnJlZShkKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJfQorCQlkLT5jbWRfY29kZSA9IGNvZGU7CisJCWQtPmNtZF9mbGFnX21hc2sgPSBDTURfRkxBR19SRVFVRVNUIHwgQ01EX0ZMQUdfUFJPWElBQkxFOworCQlkLT5jbWRfZmxhZ192YWwgPSBDTURfRkxBR19QUk9YSUFCTEUgfCAoIHJlcXVlc3QgPyBDTURfRkxBR19SRVFVRVNUIDogMCApOworCQlyZXR1cm4gZDsKKwl9Cit9CisKKyVleHRlbmQgZGljdF9ydWxlX2RhdGEgeworCWRpY3RfcnVsZV9kYXRhKHN0cnVjdCBkaWN0X29iamVjdCAqYXZwID0gTlVMTCwgZW51bSBydWxlX3Bvc2l0aW9uIHBvcyA9IDAsIGludCBtaW4gPSAtMSwgaW50IG1heCA9IC0xICkgeworCQlzdHJ1Y3QgZGljdF9ydWxlX2RhdGEgKiBkID0gKHN0cnVjdCBkaWN0X3J1bGVfZGF0YSAqKWNhbGxvYygxLCBzaXplb2Yoc3RydWN0IGRpY3RfcnVsZV9kYXRhKSk7CisJCWlmICghZCkgeworCQkJRElfRVJST1JfTUFMTE9DOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJZC0+cnVsZV9hdnAgPSBhdnA7CisJCWQtPnJ1bGVfcG9zaXRpb24gPSBwb3M7CisJCWQtPnJ1bGVfb3JkZXIgPSAxOworCQlkLT5ydWxlX21pbiA9IG1pbjsKKwkJZC0+cnVsZV9tYXggPSBtYXg7CisJCXJldHVybiBkOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kYmdfaW50ZXJhY3RpdmUvZGlzcGF0Y2guaSBiL2V4dGVuc2lvbnMvZGJnX2ludGVyYWN0aXZlL2Rpc3BhdGNoLmkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMzOTI1MQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGJnX2ludGVyYWN0aXZlL2Rpc3BhdGNoLmkKQEAgLTAsMCArMSwxNDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDEzLCBXSURFIFByb2plY3QgYW5kIE5JQ1QJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFdJREUgUHJvamVjdCBvciBOSUNUIG5vciB0aGUgCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgV0lERSBQcm9qZWN0IGFuZCAJCQkJCQkgKgorKiAgIE5JQ1QuCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRG8gbm90IGluY2x1ZGUgdGhpcyBkaXJlY3RseSwgdXNlIGRiZ19pbnRlcmFjdGl2ZS5pIGluc3RlYWQgKi8KKworLyoqKioqKiBESVNQQVRDSCAqKioqKioqKiovCisKKworJXsKKy8qIGNhbGwgaXQgKHdpbGwgYmUgY2FsbGVkIGZyb20gYSBkaWZmZXJlbnQgdGhyZWFkIHRoYW4gdGhlIGludGVycHJldGVyLCB3aGVuIG1lc3NhZ2UgYXJyaXZlcykgKi8KK3N0YXRpYyBpbnQgY2FsbF90aGVfcHl0aG9uX2Rpc3BhdGNoX2NhbGxiYWNrKHN0cnVjdCBtc2cgKiptc2csIHN0cnVjdCBhdnAgKmF2cCwgc3RydWN0IHNlc3Npb24gKnNlc3Npb24sIHZvaWQgKiBweWNiLCBlbnVtIGRpc3BfYWN0aW9uICphY3Rpb24pIHsKKwlQeU9iamVjdCAqUHlNc2csICpQeUF2cCwgKlB5U2VzczsKKwlQeU9iamVjdCAqY2IsICpyZXN1bHQgPSBOVUxMOworCWludCByZXQgPSAwOworCQorCWlmICghcHljYikgeworCQlmZF9sb2dfZGVidWcoIkludGVybmFsIGVycm9yOiBtaXNzaW5nIHRoZSBjYWxsYmFjayEiKTsKKwkJcmV0dXJuIEVOT1RTVVA7CisJfQorCWNiID0gcHljYjsKKwkKKwlTV0lHX1BZVEhPTl9USFJFQURfQkVHSU5fQkxPQ0s7CisJLyogQ29udmVydCB0aGUgYXJndW1lbnRzICovCisJUHlNc2cgID0gU1dJR19OZXdQb2ludGVyT2JqKCh2b2lkICopKm1zZywgICAgIFNXSUdUWVBFX3BfbXNnLCAgICAgMCApOworCVB5QXZwICA9IFNXSUdfTmV3UG9pbnRlck9iaigodm9pZCAqKSBhdnAsICAgICBTV0lHVFlQRV9wX2F2cCwgICAgIDAgKTsKKwlQeVNlc3MgPSBTV0lHX05ld1BvaW50ZXJPYmooKHZvaWQgKikgc2Vzc2lvbiwgU1dJR1RZUEVfcF9zZXNzaW9uLCAwICk7CisJCisJLyogQ2FsbCB0aGUgZnVuY3Rpb24gKi8KKwlyZXN1bHQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oY2IsICIoT09PKSIsIFB5TXNnLCBQeUF2cCwgUHlTZXNzKTsKKwkKKwkvKiBUaGUgcmVzdWx0IGlzIHN1cHBvc2VkbHkgY29tcG9zZWQgb2Y6IFsgcmV0LCAqbXNnLCAqYWN0aW9uIF0gKi8KKwlpZiAoKHJlc3VsdCA9PSBOVUxMKSB8fCAoIVB5TGlzdF9DaGVjayhyZXN1bHQpKSB8fCAoUHlMaXN0X1NpemUocmVzdWx0KSAhPSAzKSkgeworCQlmZF9sb2dfZGVidWcoIkVycm9yOiBUaGUgUHl0aG9uIGNhbGxiYWNrIGRpZCBub3QgcmV0dXJuIFsgcmV0LCBtc2csIGFjdGlvbiBdLiIpOworCQlyZXQgPSBFSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKwkKKwkvKiBDb252ZXJ0IHRoZSByZXR1cm4gdmFsdWVzICovCisJaWYgKCFTV0lHX0lzT0soU1dJR19Bc1ZhbF9pbnQoUHlMaXN0X0dldEl0ZW0ocmVzdWx0LCAwKSwgJnJldCkpKSB7CisJCWZkX2xvZ19kZWJ1ZygiRXJyb3I6IENhbm5vdCBjb252ZXJ0IHRoZSBmaXJzdCByZXR1cm4gdmFsdWUgdG8gaW50ZWdlci4iKTsKKwkJcmV0ID0gRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisJaWYgKHJldCkgeworCQlUUkFDRV9ERUJVRyhJTkZPLCAiVGhlIFB5dGhvbiBjYWxsYmFjayByZXR1cm5lZCB0aGUgZXJyb3IgY29kZSAlZCAoJXMpIiwgcmV0LCBzdHJlcnJvcihyZXQpKTsKKwkJZ290byBvdXQ7CisJfQorCQorCWlmICghU1dJR19Jc09LKFNXSUdfQ29udmVydFB0cihQeUxpc3RfR2V0SXRlbShyZXN1bHQsIDEpLCAodm9pZCAqKW1zZywgU1dJR1RZUEVfcF9tc2csIFNXSUdfUE9JTlRFUl9ESVNPV04pKSkgeworCQlmZF9sb2dfZGVidWcoIkVycm9yOiBDYW5ub3QgY29udmVydCB0aGUgc2Vjb25kIHJldHVybiB2YWx1ZSB0byBtZXNzYWdlLiIpOworCQlyZXQgPSBFSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKwkKKwlpZiAoIVNXSUdfSXNPSyhTV0lHX0FzVmFsX2ludChQeUxpc3RfR2V0SXRlbShyZXN1bHQsIDIpLCAoaW50ICopYWN0aW9uKSkpIHsKKwkJZmRfbG9nX2RlYnVnKCJFcnJvcjogQ2Fubm90IGNvbnZlcnQgdGhlIHRoaXJkIHJldHVybiB2YWx1ZSB0byBpbnRlZ2VyLiIpOworCQlyZXQgPSBFSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKwkKKwlUUkFDRV9ERUJVRyhGVUxMLCAiUHl0aG9uIGNhbGxiYWNrIHJldHVybjogKmFjdGlvbiA9ICVkIiwgKmFjdGlvbik7CitvdXQ6CQorCVB5X1hERUNSRUYocmVzdWx0KTsKKwkKKwlTV0lHX1BZVEhPTl9USFJFQURfRU5EX0JMT0NLOworCXJldHVybiByZXQ7Cit9CislfQorCitzdHJ1Y3QgZGlzcF9oZGwgeworfTsKKworJW5vZGVmYXVsdGN0b3IgZGlzcF9oZGw7CislZXh0ZW5kIGRpc3BfaGRsIHsKKwlkaXNwX2hkbChQeU9iamVjdCAqIFB5Q2IsIGVudW0gZGlzcF9ob3cgaG93LCBzdHJ1Y3QgZGlzcF93aGVuICogd2hlbikgeworCQlzdHJ1Y3QgZGlzcF9oZGwgKiBoZGwgPSBOVUxMOworCQlpbnQgcmV0OworCQkKKwkJUHlfWElOQ1JFRihQeUNiKTsKKwkJCisJCXJldCA9IGZkX2Rpc3BfcmVnaXN0ZXIgKCBjYWxsX3RoZV9weXRob25fZGlzcGF0Y2hfY2FsbGJhY2ssIGhvdywgd2hlbiwgUHlDYiwgJmhkbCApOworCQlpZiAocmV0ICE9IDApIHsKKwkJCURJX0VSUk9SKHJldCwgTlVMTCwgTlVMTCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlyZXR1cm4gaGRsOworCX0KKwl+ZGlzcF9oZGwoKSB7CisJCXN0cnVjdCBkaXNwX2hkbCAqIGhkbCA9IHNlbGY7CisJCVB5T2JqZWN0ICogY2IgPSBOVUxMOworCQlpbnQgcmV0ID0gZmRfZGlzcF91bnJlZ2lzdGVyKCZoZGwsICh2b2lkICopJmNiKTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlESV9FUlJPUihyZXQsIE5VTEwsIE5VTEwpOworCQl9CisJCVB5X1hERUNSRUYoY2IpOworCQlyZXR1cm47CisJfQorfQorCisKKyVleHRlbmQgZGlzcF93aGVuIHsKKwlkaXNwX3doZW4oc3RydWN0IGRpY3Rfb2JqZWN0ICogYXBwID0gTlVMTCwgc3RydWN0IGRpY3Rfb2JqZWN0ICogY29tbWFuZCA9IE5VTEwsIHN0cnVjdCBkaWN0X29iamVjdCAqIGF2cCA9IE5VTEwsIHN0cnVjdCBkaWN0X29iamVjdCAqIHZhbHVlID0gTlVMTCkgeworICAgICAgCQlzdHJ1Y3QgZGlzcF93aGVuICogdyA9IChzdHJ1Y3QgZGlzcF93aGVuICopY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgZGlzcF93aGVuKSk7CisJCWlmICghdykgeworCQkJRElfRVJST1JfTUFMTE9DOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJdy0+YXBwID0gYXBwOworCQl3LT5jb21tYW5kID0gY29tbWFuZDsKKwkJdy0+YXZwID0gYXZwOworCQl3LT52YWx1ZSA9IHZhbHVlOworCQlyZXR1cm4gdzsKKwl9Cit9CmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RiZ19pbnRlcmFjdGl2ZS9lbmRwb2ludHMuaSBiL2V4dGVuc2lvbnMvZGJnX2ludGVyYWN0aXZlL2VuZHBvaW50cy5pCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyOWYzNzkKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RiZ19pbnRlcmFjdGl2ZS9lbmRwb2ludHMuaQpAQCAtMCwwICsxLDEzMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTMsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBEbyBub3QgaW5jbHVkZSB0aGlzIGRpcmVjdGx5LCB1c2UgZGJnX2ludGVyYWN0aXZlLmkgaW5zdGVhZCAqLworCisvKioqKioqIEVORFBPSU5UUyAqKioqKioqKiovCisKKyV7CisKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKworJX0KKworJWV4dGVuZCBmZF9lbmRwb2ludCB7CisJZmRfZW5kcG9pbnQoKSB7CisJCXN0cnVjdCBmZF9lbmRwb2ludCAqbnAgPSAoc3RydWN0IGZkX2VuZHBvaW50ICopY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgZmRfZW5kcG9pbnQpKTsKKwkJaWYgKCFucCkgeworCQkJRElfRVJST1JfTUFMTE9DOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJZmRfbGlzdF9pbml0KCZucC0+Y2hhaW4sIG5wKTsKKwkJcmV0dXJuIG5wOworCX0KKwkKKwlmZF9lbmRwb2ludChjb25zdCBjaGFyICogZW5kcG9pbnQsIHVpbnQxNl90IHBvcnQgPSAwLCB1aW50MzJfdCBmbGFncyA9IEVQX0ZMX0NPTkYpIHsKKwkJc3RydWN0IGFkZHJpbmZvIGhpbnRzOworCQlzdHJ1Y3QgYWRkcmluZm8gKmFpID0gTlVMTDsKKwkJaW50IHJldDsKKwkJCisJCW1lbXNldCgmaGludHMsIDAsIHNpemVvZihoaW50cykpOworCQloaW50cy5haV9mYW1pbHk9IEFGX1VOU1BFQzsKKwkJaGludHMuYWlfZmxhZ3MgPSBBSV9OVU1FUklDSE9TVDsKKwkJCisJCXJldCA9IGdldGFkZHJpbmZvKGVuZHBvaW50LCBOVUxMLCAmaGludHMsICZhaSk7CisJCWlmIChyZXQpIHsKKwkJCURJX0VSUk9SKHJldCwgUHlFeGNfVmFsdWVFcnJvciwgZ2FpX3N0cmVycm9yKHJldCkpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJCisJCWlmIChwb3J0KSB7CisJCQlzd2l0Y2ggKGFpLT5haV9mYW1pbHkpIHsKKwkJCQljYXNlIEFGX0lORVQ6CisJCQkJCSgoc1NBNCAqKWFpLT5haV9hZGRyKS0+c2luX3BvcnQgPSBodG9ucyhwb3J0KTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBBRl9JTkVUNjoKKwkJCQkJKChzU0E2ICopYWktPmFpX2FkZHIpLT5zaW42X3BvcnQgPSBodG9ucyhwb3J0KTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJRElfRVJST1IoRUlOVkFMLCBQeUV4Y19SdW50aW1lRXJyb3IsICJVbmtub3duIGZhbWlseSByZXR1cm5lZCBieSBnZXRhZGRyaW5mbyIpOworCQkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJfQorCQkKKwkJc3RydWN0IGZkX2VuZHBvaW50ICpucCA9IChzdHJ1Y3QgZmRfZW5kcG9pbnQgKiljYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBmZF9lbmRwb2ludCkpOworCQlpZiAoIW5wKSB7CisJCQlESV9FUlJPUl9NQUxMT0M7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlmZF9saXN0X2luaXQoJm5wLT5jaGFpbiwgbnApOworCQkKKwkJbWVtY3B5KCZucC0+cy5zYSwgYWktPmFpX2FkZHIsIGFpLT5haV9hZGRybGVuKTsKKwkJCisJCWZyZWVhZGRyaW5mbyhhaSk7CisJCQorCQlucC0+ZmxhZ3MgPSBmbGFnczsKKwkJCisJCXJldHVybiBucDsKKwl9CisJCisJfmZkX2VuZHBvaW50KCkgeworCQlmZF9saXN0X3VubGluaygmJHNlbGYtPmNoYWluKTsKKwkJZnJlZSgkc2VsZik7CisJfQorCQorCS8qIE1lcmdlIHRvIGEgbGlzdCAqLworCSVkZWxvYmplY3QgYWRkX21lcmdlOworCXZvaWQgYWRkX21lcmdlKHN0cnVjdCBmZF9saXN0ICogZXBsaXN0KSB7CisJCWludCByZXQ7CisJCQorCQlpZiAoIWVwbGlzdCkgeworCQkJRElfRVJST1IoRUlOVkFMLCBOVUxMLCBOVUxMKTsKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJcmV0ID0gZmRfZXBfYWRkX21lcmdlKCBlcGxpc3QsICYkc2VsZi0+cy5zYSwgc1NBbGVuKCYkc2VsZi0+cy5zYSksICRzZWxmLT5mbGFncyApOworCQlpZiAocmV0KSB7CisJCQlESV9FUlJPUihyZXQsIE5VTEwsIE5VTEwpOworCQkJcmV0dXJuOworCQl9CisJCQorCQlyZXR1cm47CisJfQorCQorCXZvaWQgZHVtcCgpIHsKKwkJY2hhciAqIGJ1ZiA9IE5VTEw7CisJCXNpemVfdCBsZW47CisJCXByaW50ZigiJXMiLCBmZF9lcF9kdW1wX29uZSgmYnVmLCAmbGVuLCBOVUxMLCAxLCAkc2VsZikpOworCQlmcmVlKGJ1Zik7CisJfQorfQpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kYmdfaW50ZXJhY3RpdmUvZXZlbnRzLmkgYi9leHRlbnNpb25zL2RiZ19pbnRlcmFjdGl2ZS9ldmVudHMuaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzBjODllCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kYmdfaW50ZXJhY3RpdmUvZXZlbnRzLmkKQEAgLTAsMCArMSw3MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTEsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBEbyBub3QgaW5jbHVkZSB0aGlzIGRpcmVjdGx5LCB1c2UgZGJnX2ludGVyYWN0aXZlLmkgaW5zdGVhZCAqLworCisvKioqKioqIEVWRU5UUyAqKioqKioqKiovCisKKyVleHRlbmQgZmRfZXZlbnQgeworCWZkX2V2ZW50KGludCBjb2RlLCBjaGFyICpTVFJJTkcsIHNpemVfdCBMRU5HVEgpIHsKKwkJc3RydWN0IGZkX2V2ZW50ICogZmQgPSBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBmZF9ldmVudCkpOworCQlpZiAoIWZkKSB7CisJCQlESV9FUlJPUl9NQUxMT0M7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlmZC0+Y29kZSA9IGNvZGU7CisJCWZkLT5kYXRhID0gb3MwZHVwKFNUUklORywgTEVOR1RIKTsKKwkJaWYgKCFmZC0+ZGF0YSkgeworCQkJRElfRVJST1JfTUFMTE9DOworCQkJcmV0dXJuIE5VTEw7CisJCX07CisJCWZkLT5zaXplID0gTEVOR1RIOworCQlyZXR1cm4gZmQ7CisJfQorCQorCWZkX2V2ZW50KGludCBjb2RlLCBpbnQgdmFsdWUpIHsKKwkJc3RydWN0IGZkX2V2ZW50ICogZmQgPSBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBmZF9ldmVudCkpOworCQlpZiAoIWZkKSB7CisJCQlESV9FUlJPUl9NQUxMT0M7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlmZC0+Y29kZSA9IGNvZGU7CisJCWZkLT5kYXRhID0gbWFsbG9jKHNpemVvZihpbnQpKTsKKwkJaWYgKCFmZC0+ZGF0YSkgeworCQkJRElfRVJST1JfTUFMTE9DOworCQkJcmV0dXJuIE5VTEw7CisJCX07CisJCSooKGludCAqKWZkLT5kYXRhKSA9IHZhbHVlOworCQlmZC0+c2l6ZSA9IHNpemVvZihpbnQpOworCQlyZXR1cm4gZmQ7CisJfQorfQkKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGJnX2ludGVyYWN0aXZlL2hlbHBlci94eGQuYyBiL2V4dGVuc2lvbnMvZGJnX2ludGVyYWN0aXZlL2hlbHBlci94eGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTBmNTcxCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kYmdfaW50ZXJhY3RpdmUvaGVscGVyL3h4ZC5jCkBAIC0wLDAgKzEsNzg3IEBACisvKiBmRCBub3RlOiBUaGlzIHNvdXJjZSBmaWxlIGNvbWVzIGZyb20gdGhlIFZJTSBzb3VyY2UgcGFja2FnZS4gQWxsIGNyZWRpdHMgZ28gdG8gdGhlIG9yaWdpbmFsIGF1dGhvcnMgKi8KKworLyogeHhkOiBteSBoZXhkdW1wIGZhY2lsaXR5LiBqdworICoKKyAqICAyLjEwLjkwIGNoYW5nZWQgdG8gd29yZCBvdXRwdXQKKyAqICAzLjAzLjkzIG5ldyBpbmRlbnQgc3R5bGUsIGR1bWIgYnVnIGluc2VydGVkIGFuZCBmaXhlZC4KKyAqCSAgICAtYyBvcHRpb24sIG1scworICogMjYuMDQuOTQgYmV0dGVyIG9wdGlvbiBwYXJzZXIsIC1wcywgLWwsIC1zIGFkZGVkLgorICogIDEuMDcuOTQgLXIgYmFkbHkgbmVlZHMgLSBhcyBpbnB1dCBmaWxlLiAgUGVyIGRlZmF1bHQgYXV0b3NraXAgb3ZlcgorICoJICAgICAgIGNvbnNlY3V0aXZlIGxpbmVzIG9mIHplcm9lcywgYXMgdW5peCBvZCBkb2VzLgorICoJICAgIC1hIHNob3dzIHRoZW0gdG9vLgorICoJICAgIC1pIGR1bXAgYXMgYy1zdHlsZSAjaW5jbHVkZSAiZmlsZS5oIgorICogIDEuMTEuOTUgaWYgInh4ZCAtaSIga25vd3MgdGhlIGZpbGVuYW1lLCBhbiAndW5zaWduZWQgY2hhciBmaWxlbmFtZV9iaXRzW10nCisgKgkgICAgYXJyYXkgaXMgd3JpdHRlbiBpbiBjb3JyZWN0IGMtc3ludGF4LgorICoJICAgIC1zIGltcHJvdmVkLCBub3cgZGVmYXVsdHMgdG8gYWJzb2x1dGUgc2VlaywgcmVsYXRpdmUgcmVxdWlyZXMgYSAnKycuCisgKgkgICAgLXIgaW1wcm92ZWQsIG5vdyAtciAtcyAtMHguLi4gaXMgc3VwcG9ydGVkLgorICoJICAgICAgIGNoYW5nZS9zdXBwcmVzcyBsZWFkaW5nICdcMCcgYnl0ZXMuCisgKgkgICAgLWwgbiBpbXByb3ZlZDogc3RvcHMgZXhhY3RseSBhZnRlciBuIGJ5dGVzLgorICoJICAgIC1yIGltcHJvdmVkLCBiZXR0ZXIgaGFuZGxpbmcgb2YgcGFydGlhbCBsaW5lcyB3aXRoIHRyYWlsaW5nIGdhcmJhZ2UuCisgKgkgICAgLXIgaW1wcm92ZWQsIG5vdyAtciAtcCB3b3JrcyBhZ2FpbiEKKyAqCSAgICAtciBpbXByb3ZlZCwgbGVzcyBmbHVzaGluZywgbXVjaCBmYXN0ZXIgbm93ISAodGhhdCB3YXMgc2lsbHkpCisgKiAgMy4wNC45NiBQZXIgcmVwZWF0ZWQgcmVxdWVzdCBvZiBhIHNpbmdsZSBwZXJzb246IGF1dG9za2lwIGRlZmF1bHRzIHRvIG9mZi4KKyAqIDE1LjA1Ljk2IC12IGFkZGVkLiBUaGV5IHdhbnQgdG8ga25vdyB0aGUgdmVyc2lvbi4KKyAqCSAgICAtYSBmaXhlZCwgdG8gc2hvdyBsYXN0IGxpbmUgaW5mIGZpbGUgZW5kcyBpbiBhbGwgemVyb3MuCisgKgkgICAgLXUgYWRkZWQ6IFByaW50IHVwcGVyIGNhc2UgaGV4LWxldHRlcnMsIGFzIHByZWZlcnJlZCBieSB1bml4IGJjLgorICoJICAgIC1oIGFkZGVkIHRvIHVzYWdlIG1lc3NhZ2UuIFVzYWdlIG1lc3NhZ2UgZXh0ZW5kZWQuCisgKgkgICAgTm93IHVzaW5nIG91dGZpbGUgaWYgc3BlY2lmaWVkIGV2ZW4gaW4gbm9ybWFsIG1vZGUsIGFlaGVtLgorICoJICAgIE5vIGxvbmdlciBtaXhpbmcgb2YgaW50cyBhbmQgbG9uZ3MuIE1heSBoZWxwIGRvemUgcGVvcGxlLgorICoJICAgIEFkZGVkIGJpbmlmeSBpb2N0bCBmb3Igc2FtZSByZWFzb24uIChFbm91Z2ggRG96ZSBzdHJlc3MgZm9yIDE5OTYhKQorICogMTYuMDUuOTYgLXAgaW1wcm92ZWQsIHJlbW92ZWQgb2NjYXNpb25hbCBzdXBlcmZsdW91cyBsaW5lZmVlZC4KKyAqIDIwLjA1Ljk2IC1sIDAgZml4ZWQuIHRyaWVkIHRvIHJlYWQgYW55d2F5LgorICogMjEuMDUuOTYgLWkgZml4ZWQuIG5vdyBob25vdXJzIC11LCBhbmQgcHJlcGVuZHMgX18gdG8gbnVtZXJpYyBmaWxlbmFtZXMuCisgKgkgICAgY29tcGlsZSAtRFdJTjMyIGZvciBOVCBvciBXOTUuIEdlb3JnZSBWLiBSZWlsbHksICogLXYgaW1wcm92ZWQgOi0pCisgKgkgICAgc3VwcG9ydCAtLWdudWlzaC1sb25naG9ybi1vcHRpb25zCisgKiAyNS4wNS45NiBNQUMgc3VwcG9ydCBhZGRlZDogQ29kZVdhcnJpb3IgYWxyZWFkeSB1c2VzIGBgb3V0bGluZScnIGluIFR5cGVzLmgKKyAqCSAgICB3aGljaCBpcyBpbmNsdWRlZCBieSBNYWNIZWFkZXJzIChBeGVsIEtpZWxob3JuKS4gUmVuYW1lZCB0bworICoJICAgIHh4ZGxpbmUoKS4KKyAqICA3LjA2Ljk2IC1pIHByaW50ZWQgJ2ludCcgaW5zdGVhZCBvZiAnY2hhcicuICpibHVzaCoKKyAqCSAgICBhZGRlZCBCcmFtJ3MgT1MyIGlmZGVmcy4uLgorICogMTguMDcuOTYgZ2NjIC1XYWxsIEAgU3VuT1M0IGlzIG5vdyBzbGllbnQuCisgKgkgICAgQWRkZWQgb3N2ZXIgZm9yIE1TRE9TL0RKR1BQL1dJTjMyLgorICogMjkuMDguOTYgQWRkZWQgc2l6ZV90IHRvIHN0cm5jbXAoKSBmb3IgQW1pZ2EuCisgKiAyNC4wMy45NyBXaW5kb3dzIE5UIHN1cHBvcnQgKFBoaWwgSGFubmEpLiBDbGVhbiBleGl0IGZvciBBbWlnYSBXQiAoQnJhbSkKKyAqIDAyLjA0Ljk3IEFkZGVkIC1FIG9wdGlvbiwgdG8gaGF2ZSBFQkNESUMgdHJhbnNsYXRpb24gaW5zdGVhZCBvZiBBU0NJSQorICoJICAgIChhemMxMEB5YWhvby5jb20pCisgKiAyMi4wNS45NyBhZGRlZCAtZyAoZ3JvdXAgb2N0ZXRzKSBvcHRpb24gKGpjb29rQG5hbWVyaWNhLmtsYS5jb20pLgorICogMjMuMDkuOTggbmFzdHkgLXAgLXIgbWlzZmVhdHVyZSBmaXhlZDogc2xpZ2h0bHkgd3Jvbmcgb3V0cHV0LCB3aGVuIC1jIHdhcworICoJICAgIG1pc3Npbmcgb3Igd3JvbmcuCisgKiAyNi4wOS45OCBGaXhlZDogJ3h4ZCAtaSBpbmZpbGUgb3V0ZmlsZScgZGlkIG5vdCB0cnVuY2F0ZSBvdXRmaWxlLgorICogMjcuMTAuOTggRml4ZWQ6IC1nIG9wdGlvbiBwYXJzZXIgcmVxdWlyZWQgYmxhbmsuCisgKgkgICAgb3B0aW9uIC1iIGFkZGVkOiAwMTAwMDEwMSBiaW5hcnkgb3V0cHV0IGluIG5vcm1hbCBmb3JtYXQuCisgKiAxNi4wNS4wMCBBZGRlZCBWQVhDIGNoYW5nZXMgYnkgU3RlcGhlbiBQLiBXYWxsCisgKiAxNi4wNS4wMCBJbXByb3ZlZCBNTVMgZmlsZSBhbmQgbWVyZ2UgZm9yIFZNUyBieSBab2x0YW4gQXJwYWRmZnkKKyAqCisgKiAoYykgMTk5MC0xOTk4IGJ5IEp1ZXJnZW4gV2VpZ2VydCAoam53ZWlnZXJAaW5mb3JtYXRpay51bmktZXJsYW5nZW4uZGUpCisgKgorICogU21hbGwgY2hhbmdlcyBtYWRlIGFmdGVyd2FyZHMgYnkgQnJhbSBNb29sZW5hYXIgZXQgYWwuCisgKgorICogRGlzdHJpYnV0ZSBmcmVlbHkgYW5kIGNyZWRpdCBtZSwKKyAqIG1ha2UgbW9uZXkgYW5kIHNoYXJlIHdpdGggbWUsCisgKiBsb3NlIG1vbmV5IGFuZCBkb24ndCBhc2sgbWUuCisgKi8KKworLyogVmlzdWFsIFN0dWRpbyAyMDA1IGhhcyAnZGVwcmVjYXRlZCcgbWFueSBvZiB0aGUgc3RhbmRhcmQgQ1JUIGZ1bmN0aW9ucyAqLworI2lmIF9NU0NfVkVSID49IDE0MDAKKyMgZGVmaW5lIF9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURQorIyBkZWZpbmUgX0NSVF9OT05TVERDX05PX0RFUFJFQ0FURQorI2VuZGlmCisjaWYgIWRlZmluZWQoQ1lHV0lOKSAmJiAoZGVmaW5lZChDWUdXSU4zMikgfHwgZGVmaW5lZChfX0NZR1dJTl9fKSB8fCBkZWZpbmVkKF9fQ1lHV0lOMzJfXykpCisjIGRlZmluZSBDWUdXSU4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpZmRlZiBWQVhDCisjIGluY2x1ZGUgPGZpbGUuaD4KKyNlbHNlCisjIGluY2x1ZGUgPGZjbnRsLmg+CisjZW5kaWYKKyNpZmRlZiBfX1RTQ19fCisjIGRlZmluZSBNU0RPUworI2VuZGlmCisjaWYgIWRlZmluZWQoT1MyKSAmJiBkZWZpbmVkKF9fRU1YX18pCisjIGRlZmluZSBPUzIKKyNlbmRpZgorI2lmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoT1MyKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykgXAorICB8fCBkZWZpbmVkKENZR1dJTikKKyMgaW5jbHVkZSA8aW8uaD4JLyogZm9yIHNldG1vZGUoKSAqLworI2Vsc2UKKyMgaWZkZWYgVU5JWAorIyAgaW5jbHVkZSA8dW5pc3RkLmg+CisjIGVuZGlmCisjZW5kaWYKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4JLyogZm9yIHN0cm5jbXAoKSAqLworI2luY2x1ZGUgPGN0eXBlLmg+CS8qIGZvciBpc2FsbnVtKCkgKi8KKyNpZiBfX01XRVJLU19fICYmICFkZWZpbmVkKEJFQk9YKQorIyBpbmNsdWRlIDx1bml4Lmg+CS8qIGZvciBmZG9wZW4oKSBvbiBNQUMgKi8KKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pICYmIF9fQk9STEFORENfXyA8PSAweDA0MTAgJiYgIWRlZmluZWQoZmlsZW5vKQorLyogTWlzc2luZyBkZWZpbmUgYW5kIHByb3RvdHlwZSBncmFiYmVkIGZyb20gdGhlIEJDIDQuMCA8c3RkaW8uaD4gKi8KKyMgZGVmaW5lIGZpbGVubyhmKSAgICAgICAoKGYpLT5mZCkKK0ZJTEUgICBfRkFSICpfQ2RlY2wgX0ZBUkZVTkMgZmRvcGVuKGludCBfX2hhbmRsZSwgY2hhciBfRkFSICpfX3R5cGUpOworI2VuZGlmCisKKworLyogIFRoaXMgY29ycmVjdHMgdGhlIHByb2JsZW0gb2YgbWlzc2luZyBwcm90b3R5cGVzIGZvciBjZXJ0YWluIGZ1bmN0aW9ucworICogIGluIHNvbWUgR05VIGluc3RhbGxhdGlvbnMgKGUuZy4gU3VuT1MgNC4xLngpLgorICogIERhcnJlbiBIaWViZXJ0IDxkYXJyZW5AaG1pLmNvbT4gKHNwYXJjLXN1bi1zdW5vczQuMS4zX1UxLzIuNy4yLjIpCisgKi8KKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fU1REQ19fKQorIyBpZm5kZWYgX19VU0VfRklYRURfUFJPVE9UWVBFU19fCisjICBkZWZpbmUgX19VU0VfRklYRURfUFJPVE9UWVBFU19fCisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBfX1VTRV9GSVhFRF9QUk9UT1RZUEVTX18KKy8qCisgKiBUaGlzIGlzIGhpc3RvcmljIGFuZCB3b3JrcyBvbmx5IGlmIHRoZSBjb21waWxlciByZWFsbHkgaGFzIG5vIHByb3RvdHlwZXM6CisgKgorICogSW5jbHVkZSBwcm90b3R5cGVzIGZvciBTdW4gT1MgNC54LCB3aGVuIHVzaW5nIGFuIEFOU0kgY29tcGlsZXIuCisgKiBGSUxFIGlzIGRlZmluZWQgb24gT1MgNC54LCBub3Qgb24gNS54IChTb2xhcmlzKS4KKyAqIGlmIF9fU1ZSNCBpcyBkZWZpbmVkIChzb21lIFNvbGFyaXMgdmVyc2lvbnMpLCBkb24ndCBpbmNsdWRlIHRoaXMuCisgKi8KKyNpZiBkZWZpbmVkKHN1bikgJiYgZGVmaW5lZChGSUxFKSAmJiAhZGVmaW5lZChfX1NWUjQpICYmIGRlZmluZWQoX19TVERDX18pCisjICBkZWZpbmUgX19QKGEpIGEKKy8qIGV4Y2VycHQgZnJvbSBteSBzdW5fc3RkbGliLmggKi8KK2V4dGVybiBpbnQgZnByaW50ZiBfX1AoKEZJTEUgKiwgY2hhciAqLCAuLi4pKTsKK2V4dGVybiBpbnQgZnB1dHMgICBfX1AoKGNoYXIgKiwgRklMRSAqKSk7CitleHRlcm4gaW50IF9mbHNidWYgX19QKCh1bnNpZ25lZCBjaGFyLCBGSUxFICopKTsKK2V4dGVybiBpbnQgX2ZpbGJ1ZiBfX1AoKEZJTEUgKikpOworZXh0ZXJuIGludCBmZmx1c2ggIF9fUCgoRklMRSAqKSk7CitleHRlcm4gaW50IGZjbG9zZSAgX19QKChGSUxFICopKTsKK2V4dGVybiBpbnQgZnNlZWsgICBfX1AoKEZJTEUgKiwgbG9uZywgaW50KSk7CitleHRlcm4gaW50IHJld2luZCAgX19QKChGSUxFICopKTsKKworZXh0ZXJuIHZvaWQgcGVycm9yIF9fUCgoY2hhciAqKSk7CisjIGVuZGlmCisjZW5kaWYKKworZXh0ZXJuIGxvbmcgaW50IHN0cnRvbCgpOworZXh0ZXJuIGxvbmcgaW50IGZ0ZWxsKCk7CisKK2NoYXIgdmVyc2lvbltdID0gInh4ZCBWMS4xMCAyN29jdDk4IGJ5IEp1ZXJnZW4gV2VpZ2VydCI7CisjaWZkZWYgV0lOMzIKK2NoYXIgb3N2ZXJbXSA9ICIgKFdpbjMyKSI7CisjZWxzZQorIyBpZmRlZiBESkdQUAorY2hhciBvc3ZlcltdID0gIiAoZG9zIDMyIGJpdCkiOworIyBlbHNlCisjICBpZmRlZiBNU0RPUworY2hhciBvc3ZlcltdID0gIiAoZG9zIDE2IGJpdCkiOworIyAgZWxzZQorY2hhciBvc3ZlcltdID0gIiI7CisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKE9TMikKKyMgZGVmaW5lIEJJTl9SRUFEKHllcykgICgoeWVzKSA/ICJyYiIgOiAicnQiKQorIyBkZWZpbmUgQklOX1dSSVRFKHllcykgKCh5ZXMpID8gIndiIiA6ICJ3dCIpCisjIGRlZmluZSBCSU5fQ1JFQVQoeWVzKSAoKHllcykgPyAoT19DUkVBVHxPX0JJTkFSWSkgOiBPX0NSRUFUKQorIyBkZWZpbmUgQklOX0FTU0lHTihmcCwgeWVzKSBzZXRtb2RlKGZpbGVubyhmcCksICh5ZXMpID8gT19CSU5BUlkgOiBPX1RFWFQpCisjIGRlZmluZSBQQVRIX1NFUCAnXFwnCisjZWxpZiBkZWZpbmVkKENZR1dJTikKKyMgZGVmaW5lIEJJTl9SRUFEKHllcykgICgoeWVzKSA/ICJyYiIgOiAicnQiKQorIyBkZWZpbmUgQklOX1dSSVRFKHllcykgKCh5ZXMpID8gIndiIiA6ICJ3IikKKyMgZGVmaW5lIEJJTl9DUkVBVCh5ZXMpICgoeWVzKSA/IChPX0NSRUFUfE9fQklOQVJZKSA6IE9fQ1JFQVQpCisjIGRlZmluZSBCSU5fQVNTSUdOKGZwLCB5ZXMpICgoeWVzKSA/ICh2b2lkKSBzZXRtb2RlKGZpbGVubyhmcCksIE9fQklOQVJZKSA6ICh2b2lkKSAoZnApKQorIyBkZWZpbmUgUEFUSF9TRVAgJy8nCisjZWxzZQorIyBpZmRlZiBWTVMKKyMgIGRlZmluZSBCSU5fUkVBRChkdW1teSkgICJyIgorIyAgZGVmaW5lIEJJTl9XUklURShkdW1teSkgInciCisjICBkZWZpbmUgQklOX0NSRUFUKGR1bW15KSBPX0NSRUFUCisjICBkZWZpbmUgQklOX0FTU0lHTihmcCwgZHVtbXkpIGZwCisjICBkZWZpbmUgUEFUSF9TRVAgJ10nCisjICBkZWZpbmUgRklMRV9TRVAgJy4nCisjIGVsc2UKKyMgIGRlZmluZSBCSU5fUkVBRChkdW1teSkgICJyIgorIyAgZGVmaW5lIEJJTl9XUklURShkdW1teSkgInciCisjICBkZWZpbmUgQklOX0NSRUFUKGR1bW15KSBPX0NSRUFUCisjICBkZWZpbmUgQklOX0FTU0lHTihmcCwgZHVtbXkpIGZwCisjICBkZWZpbmUgUEFUSF9TRVAgJy8nCisjIGVuZGlmCisjZW5kaWYKKworLyogb3BlbiBoYXMgb25seSB0byBhcmd1bWVudHMgb24gdGhlIE1hYyAqLworI2lmIF9fTVdFUktTX18KKyMgZGVmaW5lIE9QRU4obmFtZSwgbW9kZSwgdW1hc2spIG9wZW4obmFtZSwgbW9kZSkKKyNlbHNlCisjIGRlZmluZSBPUEVOKG5hbWUsIG1vZGUsIHVtYXNrKSBvcGVuKG5hbWUsIG1vZGUsIHVtYXNrKQorI2VuZGlmCisKKyNpZmRlZiBBTUlHQQorIyBkZWZpbmUgU1RSTkNNUChzMSwgczIsIGwpIHN0cm5jbXAoczEsIHMyLCAoc2l6ZV90KWwpCisjZWxzZQorIyBkZWZpbmUgU1RSTkNNUChzMSwgczIsIGwpIHN0cm5jbXAoczEsIHMyLCBsKQorI2VuZGlmCisKKyNpZm5kZWYgX19QCisjIGlmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoT1MyKSBcCisJCXx8IGRlZmluZWQoX19CT1JMQU5EQ19fKQorIyAgZGVmaW5lIF9fUChhKSBhCisjIGVsc2UKKyMgIGRlZmluZSBfX1AoYSkgKCkKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBMZXQncyBjb2xsZWN0IHNvbWUgcHJvdG90eXBlcyAqLworLyogQ29kZVdhcnJpb3IgaXMgcmVhbGx5IHBpY2t5IGFib3V0IG1pc3NpbmcgcHJvdG90eXBlcyAqLworc3RhdGljIHZvaWQgZXhpdF93aXRoX3VzYWdlIF9fUCgoY2hhciAqKSk7CitzdGF0aWMgaW50IGh1bnR5cGUgX19QKChGSUxFICosIEZJTEUgKiwgRklMRSAqLCBjaGFyICosIGludCwgaW50LCBsb25nKSk7CitzdGF0aWMgdm9pZCB4eGRsaW5lIF9fUCgoRklMRSAqLCBjaGFyICosIGludCkpOworCisjZGVmaW5lIFRSWV9TRUVLCS8qIGF0dGVtcHQgdG8gdXNlIGxzZWVrLCBvciBza2lwIGZvcndhcmQgYnkgcmVhZGluZyAqLworI2RlZmluZSBDT0xTIDI1NgkvKiBjaGFuZ2UgaGVyZSwgaWYgeW91IGV2ZXIgbmVlZCBtb3JlIGNvbHVtbnMgKi8KKyNkZWZpbmUgTExFTiAoMTEgKyAoOSpDT0xTLTEpLzEgKyBDT0xTICsgMikKKworY2hhciBoZXh4YVtdID0gIjAxMjM0NTY3ODlhYmNkZWYwMTIzNDU2Nzg5QUJDREVGIiwgKmhleHggPSBoZXh4YTsKKworLyogdGhlIGRpZmZlcmVudCBoZXh0eXBlcyBrbm93biBieSB0aGlzIHByb2dyYW06ICovCisjZGVmaW5lIEhFWF9OT1JNQUwgMAorI2RlZmluZSBIRVhfUE9TVFNDUklQVCAxCisjZGVmaW5lIEhFWF9DSU5DTFVERSAyCisjZGVmaW5lIEhFWF9CSVRTIDMJCS8qIG5vdCBoZXggYSBkdW1wLCBidXQgYml0czogMDExMTEwMDEgKi8KKworc3RhdGljIHZvaWQKK2V4aXRfd2l0aF91c2FnZShwbmFtZSkKK2NoYXIgKnBuYW1lOworeworICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOlxuICAgICAgICVzIFtvcHRpb25zXSBbaW5maWxlIFtvdXRmaWxlXV1cbiIsIHBuYW1lKTsKKyAgZnByaW50ZihzdGRlcnIsICIgICAgb3JcbiAgICAgICAlcyAtciBbLXMgWy1db2Zmc2V0XSBbLWMgY29sc10gWy1wc10gW2luZmlsZSBbb3V0ZmlsZV1dXG4iLCBwbmFtZSk7CisgIGZwcmludGYoc3RkZXJyLCAiT3B0aW9uczpcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgICAtYSAgICAgICAgICB0b2dnbGUgYXV0b3NraXA6IEEgc2luZ2xlICcqJyByZXBsYWNlcyBudWwtbGluZXMuIERlZmF1bHQgb2ZmLlxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAgIC1iICAgICAgICAgIGJpbmFyeSBkaWdpdCBkdW1wIChpbmNvbXBhdGlibGUgd2l0aCAtcHMsLWksLXIpLiBEZWZhdWx0IGhleC5cbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgICAtYyBjb2xzICAgICBmb3JtYXQgPGNvbHM+IG9jdGV0cyBwZXIgbGluZS4gRGVmYXVsdCAxNiAoLWk6IDEyLCAtcHM6IDMwKS5cbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgICAtRSAgICAgICAgICBzaG93IGNoYXJhY3RlcnMgaW4gRUJDRElDLiBEZWZhdWx0IEFTQ0lJLlxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAgIC1nICAgICAgICAgIG51bWJlciBvZiBvY3RldHMgcGVyIGdyb3VwIGluIG5vcm1hbCBvdXRwdXQuIERlZmF1bHQgMi5cbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgICAtaCAgICAgICAgICBwcmludCB0aGlzIHN1bW1hcnkuXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgICAgLWkgICAgICAgICAgb3V0cHV0IGluIEMgaW5jbHVkZSBmaWxlIHN0eWxlLlxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAgIC1sIGxlbiAgICAgIHN0b3AgYWZ0ZXIgPGxlbj4gb2N0ZXRzLlxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAgIC1wcyAgICAgICAgIG91dHB1dCBpbiBwb3N0c2NyaXB0IHBsYWluIGhleGR1bXAgc3R5bGUuXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgICAgLXIgICAgICAgICAgcmV2ZXJzZSBvcGVyYXRpb246IGNvbnZlcnQgKG9yIHBhdGNoKSBoZXhkdW1wIGludG8gYmluYXJ5LlxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAgIC1yIC1zIG9mZiAgIHJldmVydCB3aXRoIDxvZmY+IGFkZGVkIHRvIGZpbGUgcG9zaXRpb25zIGZvdW5kIGluIGhleGR1bXAuXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgICAgLXMgJXNzZWVrICBzdGFydCBhdCA8c2Vlaz4gYnl0ZXMgYWJzLiAlc2luZmlsZSBvZmZzZXQuXG4iLAorI2lmZGVmIFRSWV9TRUVLCisJICAiWytdWy1dIiwgIihvciArOiByZWwuKSAiKTsKKyNlbHNlCisJICAiIiwgIiIpOworI2VuZGlmCisgIGZwcmludGYoc3RkZXJyLCAiICAgIC11ICAgICAgICAgIHVzZSB1cHBlciBjYXNlIGhleCBsZXR0ZXJzLlxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAgIC12ICAgICAgICAgIHNob3cgdmVyc2lvbjogXCIlcyVzXCIuXG4iLCB2ZXJzaW9uLCBvc3Zlcik7CisgIGV4aXQoMSk7Cit9CisKKy8qCisgKiBNYXguIGNvbHMgYmluYXJ5IGNoYXJhY3RlcnMgYXJlIGRlY29kZWQgZnJvbSB0aGUgaW5wdXQgc3RyZWFtIHBlciBsaW5lLgorICogVHdvIGFkamFjZW50IGdhcmJhZ2UgY2hhcmFjdGVycyBhZnRlciBldmFsdWF0ZWQgZGF0YSBkZWxpbWl0IHZhbGlkIGRhdGEuCisgKiBFdmVyeXRoaW5nIHVwIHRvIHRoZSBuZXh0IG5ld2xpbmUgaXMgZGlzY2FyZGVkLgorICoKKyAqIFRoZSBuYW1lIGlzIGhpc3RvcmljIGFuZCBjYW1lIGZyb20gJ3VuZG8gdHlwZSBvcHQgaCcuCisgKi8KK3N0YXRpYyBpbnQKK2h1bnR5cGUoZnBpLCBmcG8sIGZwZXJyLCBwbmFtZSwgY29scywgaGV4dHlwZSwgYmFzZV9vZmYpCitGSUxFICpmcGksICpmcG8sICpmcGVycjsKK2NoYXIgKnBuYW1lOworaW50IGNvbHMsIGhleHR5cGU7Citsb25nIGJhc2Vfb2ZmOworeworICBpbnQgYywgaWduX2dhcmIgPSAxLCBuMSA9IC0xLCBuMiA9IDAsIG4zLCBwID0gY29sczsKKyAgbG9uZyBoYXZlX29mZiA9IDAsIHdhbnRfb2ZmID0gMDsKKworICByZXdpbmQoZnBpKTsKKworICB3aGlsZSAoKGMgPSBnZXRjKGZwaSkpICE9IEVPRikKKyAgICB7CisgICAgICBpZiAoYyA9PSAnXHInKQkvKiBEb3plIHN0eWxlIGlucHV0IGZpbGU/ICovCisJY29udGludWU7CisKKyAgICAgIC8qIEFsbG93IG11bHRpcGxlIHNwYWNlcy4gIFRoaXMgZG9lc24ndCB3b3JrIHdoZW4gdGhlcmUgaXMgbm9ybWFsIHRleHQKKyAgICAgICAqIGFmdGVyIHRoZSBoZXggY29kZXMgaW4gdGhlIGxhc3QgbGluZSB0aGF0IGxvb2tzIGxpa2UgaGV4LCB0aHVzIG9ubHkKKyAgICAgICAqIHVzZSBpdCBmb3IgUG9zdFNjcmlwdCBmb3JtYXQuICovCisgICAgICBpZiAoaGV4dHlwZSA9PSBIRVhfUE9TVFNDUklQVCAmJiAoYyA9PSAnICcgfHwgYyA9PSAnXG4nIHx8IGMgPT0gJ1x0JykpCisJY29udGludWU7CisKKyAgICAgIG4zID0gbjI7CisgICAgICBuMiA9IG4xOworCisgICAgICBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpCisJbjEgPSBjIC0gJzAnOworICAgICAgZWxzZSBpZiAoYyA+PSAnYScgJiYgYyA8PSAnZicpCisJbjEgPSBjIC0gJ2EnICsgMTA7CisgICAgICBlbHNlIGlmIChjID49ICdBJyAmJiBjIDw9ICdGJykKKwluMSA9IGMgLSAnQScgKyAxMDsKKyAgICAgIGVsc2UKKwl7CisJICBuMSA9IC0xOworCSAgaWYgKGlnbl9nYXJiKQorCSAgICBjb250aW51ZTsKKwl9CisKKyAgICAgIGlnbl9nYXJiID0gMDsKKworICAgICAgaWYgKHAgPj0gY29scykKKwl7CisJICBpZiAoIWhleHR5cGUpCisJICAgIHsKKwkgICAgICBpZiAobjEgPCAwKQorCQl7CisJCSAgcCA9IDA7CisJCSAgY29udGludWU7CisJCX0KKwkgICAgICB3YW50X29mZiA9ICh3YW50X29mZiA8PCA0KSB8IG4xOworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisJICBlbHNlCisJICAgIHAgPSAwOworCX0KKworICAgICAgaWYgKGJhc2Vfb2ZmICsgd2FudF9vZmYgIT0gaGF2ZV9vZmYpCisJeworCSAgZmZsdXNoKGZwbyk7CisjaWZkZWYgVFJZX1NFRUsKKwkgIGMgPSBmc2VlayhmcG8sIGJhc2Vfb2ZmICsgd2FudF9vZmYgLSBoYXZlX29mZiwgMSk7CisJICBpZiAoYyA+PSAwKQorCSAgICBoYXZlX29mZiA9IGJhc2Vfb2ZmICsgd2FudF9vZmY7CisjZW5kaWYKKwkgIGlmIChiYXNlX29mZiArIHdhbnRfb2ZmIDwgaGF2ZV9vZmYpCisJICAgIHsKKwkgICAgICBmcHJpbnRmKGZwZXJyLCAiJXM6IHNvcnJ5LCBjYW5ub3Qgc2VlayBiYWNrd2FyZHMuXG4iLCBwbmFtZSk7CisJICAgICAgcmV0dXJuIDU7CisJICAgIH0KKwkgIGZvciAoOyBoYXZlX29mZiA8IGJhc2Vfb2ZmICsgd2FudF9vZmY7IGhhdmVfb2ZmKyspCisJICAgIHB1dGMoMCwgZnBvKTsKKwl9CisKKyAgICAgIGlmIChuMiA+PSAwICYmIG4xID49IDApCisJeworCSAgcHV0YygobjIgPDwgNCkgfCBuMSwgZnBvKTsKKwkgIGhhdmVfb2ZmKys7CisJICB3YW50X29mZisrOworCSAgbjEgPSAtMTsKKwkgIGlmICgoKytwID49IGNvbHMpICYmICFoZXh0eXBlKQorCSAgICB7CisJICAgICAgLyogc2tpcCByZXN0IG9mIGxpbmUgYXMgZ2FyYmFnZSAqLworCSAgICAgIHdhbnRfb2ZmID0gMDsKKwkgICAgICB3aGlsZSAoKGMgPSBnZXRjKGZwaSkpICE9ICdcbicgJiYgYyAhPSBFT0YpCisJCTsKKwkgICAgICBpZ25fZ2FyYiA9IDE7CisJICAgIH0KKwl9CisgICAgICBlbHNlIGlmIChuMSA8IDAgJiYgbjIgPCAwICYmIG4zIDwgMCkKKwl7CisJICAvKiBhbHJlYWR5IHN0dW1ibGVkIGludG8gZ2FyYmFnZSwgc2tpcCBsaW5lLCB3YWl0IGFuZCBzZWUgKi8KKwkgIGlmICghaGV4dHlwZSkKKwkgICAgd2FudF9vZmYgPSAwOworCSAgd2hpbGUgKChjID0gZ2V0YyhmcGkpKSAhPSAnXG4nICYmIGMgIT0gRU9GKQorCSAgICA7CisJICBpZ25fZ2FyYiA9IDE7CisJfQorICAgIH0KKyAgZmZsdXNoKGZwbyk7CisjaWZkZWYgVFJZX1NFRUsKKyAgZnNlZWsoZnBvLCAwTCwgMik7CisjZW5kaWYKKyAgZmNsb3NlKGZwbyk7CisgIGZjbG9zZShmcGkpOworICByZXR1cm4gMDsKK30KKworLyoKKyAqIFByaW50IGxpbmUgbC4gSWYgbnogaXMgZmFsc2UsIHh4ZGxpbmUgcmVnYXJkcyB0aGUgbGluZSBhIGxpbmUgb2YKKyAqIHplcm9lcy4gSWYgdGhlcmUgYXJlIHRocmVlIG9yIG1vcmUgY29uc2VjdXRpdmUgbGluZXMgb2YgemVyb2VzLAorICogdGhleSBhcmUgcmVwbGFjZWQgYnkgYSBzaW5nbGUgJyonIGNoYXJhY3Rlci4KKyAqCisgKiBJZiB0aGUgb3V0cHV0IGVuZHMgd2l0aCBtb3JlIHRoYW4gdHdvIGxpbmVzIG9mIHplcm9lcywgeW91CisgKiBzaG91bGQgY2FsbCB4eGRsaW5lIGFnYWluIHdpdGggbCBiZWluZyB0aGUgbGFzdCBsaW5lIGFuZCBuegorICogbmVnYXRpdmUuIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBsYXN0IGxpbmUgaXMgc2hvd24gZXZlbiB3aGVuCisgKiBpdCBpcyBhbGwgemVyb2VzLgorICoKKyAqIElmIG56IGlzIGFsd2F5cyBwb3NpdGl2ZSwgbGluZXMgYXJlIG5ldmVyIHN1cHByZXNzZWQuCisgKi8KK3N0YXRpYyB2b2lkCit4eGRsaW5lKGZwLCBsLCBueikKK0ZJTEUgKmZwOworY2hhciAqbDsKK2ludCBuejsKK3sKKyAgc3RhdGljIGNoYXIgeltMTEVOKzFdOworICBzdGF0aWMgaW50IHplcm9fc2VlbiA9IDA7CisKKyAgaWYgKCFueiAmJiB6ZXJvX3NlZW4gPT0gMSkKKyAgICBzdHJjcHkoeiwgbCk7CisKKyAgaWYgKG56IHx8ICF6ZXJvX3NlZW4rKykKKyAgICB7CisgICAgICBpZiAobnopCisJeworCSAgaWYgKG56IDwgMCkKKwkgICAgemVyb19zZWVuLS07CisJICBpZiAoemVyb19zZWVuID09IDIpCisJICAgIGZwdXRzKHosIGZwKTsKKwkgIGlmICh6ZXJvX3NlZW4gPiAyKQorCSAgICBmcHV0cygiKlxuIiwgZnApOworCX0KKyAgICAgIGlmIChueiA+PSAwIHx8IHplcm9fc2VlbiA+IDApCisJZnB1dHMobCwgZnApOworICAgICAgaWYgKG56KQorCXplcm9fc2VlbiA9IDA7CisgICAgfQorfQorCisvKiBUaGlzIGlzIGFuIEVCQ0RJQyB0byBBU0NJSSBjb252ZXJzaW9uIHRhYmxlICovCisvKiBmcm9tIGEgcHJvcG9zZWQgQlRMIHN0YW5kYXJkIEFwcmlsIDE2LCAxOTc5ICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBldG9hNjRbXSA9Cit7CisgICAgMDA0MCwwMjQwLDAyNDEsMDI0MiwwMjQzLDAyNDQsMDI0NSwwMjQ2LAorICAgIDAyNDcsMDI1MCwwMzI1LDAwNTYsMDA3NCwwMDUwLDAwNTMsMDE3NCwKKyAgICAwMDQ2LDAyNTEsMDI1MiwwMjUzLDAyNTQsMDI1NSwwMjU2LDAyNTcsCisgICAgMDI2MCwwMjYxLDAwNDEsMDA0NCwwMDUyLDAwNTEsMDA3MywwMTc2LAorICAgIDAwNTUsMDA1NywwMjYyLDAyNjMsMDI2NCwwMjY1LDAyNjYsMDI2NywKKyAgICAwMjcwLDAyNzEsMDMxMywwMDU0LDAwNDUsMDEzNywwMDc2LDAwNzcsCisgICAgMDI3MiwwMjczLDAyNzQsMDI3NSwwMjc2LDAyNzcsMDMwMCwwMzAxLAorICAgIDAzMDIsMDE0MCwwMDcyLDAwNDMsMDEwMCwwMDQ3LDAwNzUsMDA0MiwKKyAgICAwMzAzLDAxNDEsMDE0MiwwMTQzLDAxNDQsMDE0NSwwMTQ2LDAxNDcsCisgICAgMDE1MCwwMTUxLDAzMDQsMDMwNSwwMzA2LDAzMDcsMDMxMCwwMzExLAorICAgIDAzMTIsMDE1MiwwMTUzLDAxNTQsMDE1NSwwMTU2LDAxNTcsMDE2MCwKKyAgICAwMTYxLDAxNjIsMDEzNiwwMzE0LDAzMTUsMDMxNiwwMzE3LDAzMjAsCisgICAgMDMyMSwwMzQ1LDAxNjMsMDE2NCwwMTY1LDAxNjYsMDE2NywwMTcwLAorICAgIDAxNzEsMDE3MiwwMzIyLDAzMjMsMDMyNCwwMTMzLDAzMjYsMDMyNywKKyAgICAwMzMwLDAzMzEsMDMzMiwwMzMzLDAzMzQsMDMzNSwwMzM2LDAzMzcsCisgICAgMDM0MCwwMzQxLDAzNDIsMDM0MywwMzQ0LDAxMzUsMDM0NiwwMzQ3LAorICAgIDAxNzMsMDEwMSwwMTAyLDAxMDMsMDEwNCwwMTA1LDAxMDYsMDEwNywKKyAgICAwMTEwLDAxMTEsMDM1MCwwMzUxLDAzNTIsMDM1MywwMzU0LDAzNTUsCisgICAgMDE3NSwwMTEyLDAxMTMsMDExNCwwMTE1LDAxMTYsMDExNywwMTIwLAorICAgIDAxMjEsMDEyMiwwMzU2LDAzNTcsMDM2MCwwMzYxLDAzNjIsMDM2MywKKyAgICAwMTM0LDAyMzcsMDEyMywwMTI0LDAxMjUsMDEyNiwwMTI3LDAxMzAsCisgICAgMDEzMSwwMTMyLDAzNjQsMDM2NSwwMzY2LDAzNjcsMDM3MCwwMzcxLAorICAgIDAwNjAsMDA2MSwwMDYyLDAwNjMsMDA2NCwwMDY1LDAwNjYsMDA2NywKKyAgICAwMDcwLDAwNzEsMDM3MiwwMzczLDAzNzQsMDM3NSwwMzc2LDAzNzcKK307CisKK2ludAorbWFpbihhcmdjLCBhcmd2KQoraW50IGFyZ2M7CitjaGFyICphcmd2W107Cit7CisgIEZJTEUgKmZwLCAqZnBvOworICBpbnQgYywgZSwgcCA9IDAsIHJlbHNlZWsgPSAxLCBuZWdzZWVrID0gMCwgcmV2ZXJ0ID0gMDsKKyAgaW50IGNvbHMgPSAwLCBub256ZXJvID0gMCwgYXV0b3NraXAgPSAwLCBoZXh0eXBlID0gSEVYX05PUk1BTDsKKyAgaW50IGViY2RpYyA9IDA7CisgIGludCBvY3RzcGVyZ3JwID0gLTE7CS8qIG51bWJlciBvZiBvY3RldHMgZ3JvdXBlZCBpbiBvdXRwdXQgKi8KKyAgaW50IGdycGxlbjsJCS8qIHRvdGFsIGNoYXJzIHBlciBvY3RldCBncm91cCAqLworICBsb25nIGxlbmd0aCA9IC0xLCBuID0gMCwgc2Vla29mZiA9IDA7CisgIGNoYXIgbFtMTEVOKzFdOworICBjaGFyICpwbmFtZSwgKnBwOworCisjaWZkZWYgQU1JR0EKKyAgLyogVGhpcyBwcm9ncmFtIGRvZXNuJ3Qgd29yayB3aGVuIHN0YXJ0ZWQgZnJvbSB0aGUgV29ya2JlbmNoICovCisgIGlmIChhcmdjID09IDApCisgICAgZXhpdCgxKTsKKyNlbmRpZgorCisgIHBuYW1lID0gYXJndlswXTsKKyAgZm9yIChwcCA9IHBuYW1lOyAqcHA7ICkKKyAgICBpZiAoKnBwKysgPT0gUEFUSF9TRVApCisgICAgICBwbmFtZSA9IHBwOworI2lmZGVmIEZJTEVfU0VQCisgIGZvciAocHAgPSBwbmFtZTsgKnBwOyBwcCsrKQorICAgIGlmICgqcHAgPT0gRklMRV9TRVApCisgICAgICB7CisJKnBwID0gJ1wwJzsKKwlicmVhazsKKyAgICAgIH0KKyNlbmRpZgorCisgIHdoaWxlIChhcmdjID49IDIpCisgICAgeworICAgICAgcHAgPSBhcmd2WzFdICsgKCFTVFJOQ01QKGFyZ3ZbMV0sICItLSIsIDIpICYmIGFyZ3ZbMV1bMl0pOworCSAgIGlmICghU1RSTkNNUChwcCwgIi1hIiwgMikpIGF1dG9za2lwID0gMSAtIGF1dG9za2lwOworICAgICAgZWxzZSBpZiAoIVNUUk5DTVAocHAsICItYiIsIDIpKSBoZXh0eXBlID0gSEVYX0JJVFM7CisgICAgICBlbHNlIGlmICghU1RSTkNNUChwcCwgIi11IiwgMikpIGhleHggPSBoZXh4YSArIDE2OworICAgICAgZWxzZSBpZiAoIVNUUk5DTVAocHAsICItcCIsIDIpKSBoZXh0eXBlID0gSEVYX1BPU1RTQ1JJUFQ7CisgICAgICBlbHNlIGlmICghU1RSTkNNUChwcCwgIi1pIiwgMikpIGhleHR5cGUgPSBIRVhfQ0lOQ0xVREU7CisgICAgICBlbHNlIGlmICghU1RSTkNNUChwcCwgIi1yIiwgMikpIHJldmVydCsrOworICAgICAgZWxzZSBpZiAoIVNUUk5DTVAocHAsICItRSIsIDIpKSBlYmNkaWMrKzsKKyAgICAgIGVsc2UgaWYgKCFTVFJOQ01QKHBwLCAiLXYiLCAyKSkKKwl7CisJICBmcHJpbnRmKHN0ZGVyciwgIiVzJXNcbiIsIHZlcnNpb24sIG9zdmVyKTsKKwkgIGV4aXQoMCk7CisJfQorICAgICAgZWxzZSBpZiAoIVNUUk5DTVAocHAsICItYyIsIDIpKQorCXsKKwkgIGlmIChwcFsyXSAmJiBTVFJOQ01QKCJvbHMiLCBwcCArIDIsIDMpKQorCSAgICBjb2xzID0gKGludClzdHJ0b2wocHAgKyAyLCBOVUxMLCAwKTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmICghYXJndlsyXSkKKwkJZXhpdF93aXRoX3VzYWdlKHBuYW1lKTsKKwkgICAgICBjb2xzID0gKGludClzdHJ0b2woYXJndlsyXSwgTlVMTCwgMCk7CisJICAgICAgYXJndisrOworCSAgICAgIGFyZ2MtLTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UgaWYgKCFTVFJOQ01QKHBwLCAiLWciLCAyKSkKKwl7CisJICBpZiAocHBbMl0gJiYgU1RSTkNNUCgiZ3JvdXAiLCBwcCArIDIsIDUpKQorCSAgICBvY3RzcGVyZ3JwID0gKGludClzdHJ0b2wocHAgKyAyLCBOVUxMLCAwKTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmICghYXJndlsyXSkKKwkJZXhpdF93aXRoX3VzYWdlKHBuYW1lKTsKKwkgICAgICBvY3RzcGVyZ3JwID0gKGludClzdHJ0b2woYXJndlsyXSwgTlVMTCwgMCk7CisJICAgICAgYXJndisrOworCSAgICAgIGFyZ2MtLTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UgaWYgKCFTVFJOQ01QKHBwLCAiLXMiLCAyKSkKKwl7CisJICByZWxzZWVrID0gMDsKKwkgIG5lZ3NlZWsgPSAwOworCSAgaWYgKHBwWzJdICYmIFNUUk5DTVAoImtpcCIsIHBwKzIsIDMpICYmIFNUUk5DTVAoImVlayIsIHBwKzIsIDMpKQorCSAgICB7CisjaWZkZWYgVFJZX1NFRUsKKwkgICAgICBpZiAocHBbMl0gPT0gJysnKQorCQlyZWxzZWVrKys7CisJICAgICAgaWYgKHBwWzIrcmVsc2Vla10gPT0gJy0nKQorCQluZWdzZWVrKys7CisjZW5kaWYKKwkgICAgICBzZWVrb2ZmID0gc3RydG9sKHBwICsgMityZWxzZWVrK25lZ3NlZWssIChjaGFyICoqKU5VTEwsIDApOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpZiAoIWFyZ3ZbMl0pCisJCWV4aXRfd2l0aF91c2FnZShwbmFtZSk7CisjaWZkZWYgVFJZX1NFRUsKKwkgICAgICBpZiAoYXJndlsyXVswXSA9PSAnKycpCisJCXJlbHNlZWsrKzsKKwkgICAgICBpZiAoYXJndlsyXVtyZWxzZWVrXSA9PSAnLScpCisJCW5lZ3NlZWsrKzsKKyNlbmRpZgorCSAgICAgIHNlZWtvZmYgPSBzdHJ0b2woYXJndlsyXSArIHJlbHNlZWsrbmVnc2VlaywgKGNoYXIgKiopTlVMTCwgMCk7CisJICAgICAgYXJndisrOworCSAgICAgIGFyZ2MtLTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UgaWYgKCFTVFJOQ01QKHBwLCAiLWwiLCAyKSkKKwl7CisJICBpZiAocHBbMl0gJiYgU1RSTkNNUCgiZW4iLCBwcCArIDIsIDIpKQorCSAgICBsZW5ndGggPSBzdHJ0b2wocHAgKyAyLCAoY2hhciAqKilOVUxMLCAwKTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmICghYXJndlsyXSkKKwkJZXhpdF93aXRoX3VzYWdlKHBuYW1lKTsKKwkgICAgICBsZW5ndGggPSBzdHJ0b2woYXJndlsyXSwgKGNoYXIgKiopTlVMTCwgMCk7CisJICAgICAgYXJndisrOworCSAgICAgIGFyZ2MtLTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UgaWYgKCFzdHJjbXAocHAsICItLSIpKQkvKiBlbmQgb2Ygb3B0aW9ucyAqLworCXsKKwkgIGFyZ3YrKzsKKwkgIGFyZ2MtLTsKKwkgIGJyZWFrOworCX0KKyAgICAgIGVsc2UgaWYgKHBwWzBdID09ICctJyAmJiBwcFsxXSkJLyogdW5rbm93biBvcHRpb24gKi8KKwlleGl0X3dpdGhfdXNhZ2UocG5hbWUpOworICAgICAgZWxzZQorCWJyZWFrOwkJCQkvKiBub3QgYW4gb3B0aW9uICovCisKKyAgICAgIGFyZ3YrKzsJCQkJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCisgICAgICBhcmdjLS07CisgICAgfQorCisgIGlmICghY29scykKKyAgICBzd2l0Y2ggKGhleHR5cGUpCisgICAgICB7CisgICAgICBjYXNlIEhFWF9QT1NUU0NSSVBUOgljb2xzID0gMzA7IGJyZWFrOworICAgICAgY2FzZSBIRVhfQ0lOQ0xVREU6CWNvbHMgPSAxMjsgYnJlYWs7CisgICAgICBjYXNlIEhFWF9CSVRTOgkJY29scyA9IDY7IGJyZWFrOworICAgICAgY2FzZSBIRVhfTk9STUFMOgorICAgICAgZGVmYXVsdDoJCQljb2xzID0gMTY7IGJyZWFrOworICAgICAgfQorCisgIGlmIChvY3RzcGVyZ3JwIDwgMCkKKyAgICBzd2l0Y2ggKGhleHR5cGUpCisgICAgICB7CisgICAgICBjYXNlIEhFWF9CSVRTOgkJb2N0c3BlcmdycCA9IDE7IGJyZWFrOworICAgICAgY2FzZSBIRVhfTk9STUFMOgkJb2N0c3BlcmdycCA9IDI7IGJyZWFrOworICAgICAgY2FzZSBIRVhfUE9TVFNDUklQVDoKKyAgICAgIGNhc2UgSEVYX0NJTkNMVURFOgorICAgICAgZGVmYXVsdDoJCQlvY3RzcGVyZ3JwID0gMDsgYnJlYWs7CisgICAgICB9CisKKyAgaWYgKGNvbHMgPCAxIHx8ICgoaGV4dHlwZSA9PSBIRVhfTk9STUFMIHx8IGhleHR5cGUgPT0gSEVYX0JJVFMpCisJCQkJCQkJICAgICYmIChjb2xzID4gQ09MUykpKQorICAgIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGludmFsaWQgbnVtYmVyIG9mIGNvbHVtbnMgKG1heC4gJWQpLlxuIiwgcG5hbWUsIENPTFMpOworICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgaWYgKG9jdHNwZXJncnAgPCAxKQorICAgIG9jdHNwZXJncnAgPSBjb2xzOworCisgIGlmIChhcmdjID4gMykKKyAgICBleGl0X3dpdGhfdXNhZ2UocG5hbWUpOworCisgIGlmIChhcmdjID09IDEgfHwgKGFyZ3ZbMV1bMF0gPT0gJy0nICYmICFhcmd2WzFdWzFdKSkKKyAgICBCSU5fQVNTSUdOKGZwID0gc3RkaW4sICFyZXZlcnQpOworICBlbHNlCisgICAgeworICAgICAgaWYgKChmcCA9IGZvcGVuKGFyZ3ZbMV0sIEJJTl9SRUFEKCFyZXZlcnQpKSkgPT0gTlVMTCkKKwl7CisJICBmcHJpbnRmKHN0ZGVyciwiJXM6ICIsIHBuYW1lKTsKKwkgIHBlcnJvcihhcmd2WzFdKTsKKwkgIHJldHVybiAyOworCX0KKyAgICB9CisKKyAgaWYgKGFyZ2MgPCAzIHx8IChhcmd2WzJdWzBdID09ICctJyAmJiAhYXJndlsyXVsxXSkpCisgICAgQklOX0FTU0lHTihmcG8gPSBzdGRvdXQsIHJldmVydCk7CisgIGVsc2UKKyAgICB7CisgICAgICBpbnQgZmQ7CisgICAgICBpbnQgbW9kZSA9IHJldmVydCA/IE9fV1JPTkxZIDogKE9fVFJVTkN8T19XUk9OTFkpOworCisgICAgICBpZiAoKChmZCA9IE9QRU4oYXJndlsyXSwgbW9kZSB8IEJJTl9DUkVBVChyZXZlcnQpLCAwNjY2KSkgPCAwKSB8fAorCSAgKGZwbyA9IGZkb3BlbihmZCwgQklOX1dSSVRFKHJldmVydCkpKSA9PSBOVUxMKQorCXsKKwkgIGZwcmludGYoc3RkZXJyLCAiJXM6ICIsIHBuYW1lKTsKKwkgIHBlcnJvcihhcmd2WzJdKTsKKwkgIHJldHVybiAzOworCX0KKyAgICAgIHJld2luZChmcG8pOworICAgIH0KKworICBpZiAocmV2ZXJ0KQorICAgIHsKKyAgICAgIGlmIChoZXh0eXBlICYmIChoZXh0eXBlICE9IEhFWF9QT1NUU0NSSVBUKSkKKwl7CisJICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBzb3JyeSwgY2Fubm90IHJldmVydCB0aGlzIHR5cGUgb2YgaGV4ZHVtcFxuIiwgcG5hbWUpOworCSAgcmV0dXJuIC0xOworCX0KKyAgICAgIHJldHVybiBodW50eXBlKGZwLCBmcG8sIHN0ZGVyciwgcG5hbWUsIGNvbHMsIGhleHR5cGUsCisJCW5lZ3NlZWsgPyAtc2Vla29mZiA6IHNlZWtvZmYpOworICAgIH0KKworICBpZiAoc2Vla29mZiB8fCBuZWdzZWVrIHx8ICFyZWxzZWVrKQorICAgIHsKKyNpZmRlZiBUUllfU0VFSworICAgICAgaWYgKHJlbHNlZWspCisJZSA9IGZzZWVrKGZwLCBuZWdzZWVrID8gLXNlZWtvZmYgOiBzZWVrb2ZmLCAxKTsKKyAgICAgIGVsc2UKKwllID0gZnNlZWsoZnAsIG5lZ3NlZWsgPyAtc2Vla29mZiA6IHNlZWtvZmYsIG5lZ3NlZWsgPyAyIDogMCk7CisgICAgICBpZiAoZSA8IDAgJiYgbmVnc2VlaykKKwl7CisJICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBzb3JyeSBjYW5ub3Qgc2Vlay5cbiIsIHBuYW1lKTsKKwkgIHJldHVybiA0OworCX0KKyAgICAgIGlmIChlID49IDApCisJc2Vla29mZiA9IGZ0ZWxsKGZwKTsKKyAgICAgIGVsc2UKKyNlbmRpZgorCXsKKwkgIGxvbmcgcyA9IHNlZWtvZmY7CisKKwkgIHdoaWxlIChzLS0pCisJICAgICh2b2lkKWdldGMoZnApOworCX0KKyAgICB9CisKKyAgaWYgKGhleHR5cGUgPT0gSEVYX0NJTkNMVURFKQorICAgIHsKKyAgICAgIGlmIChmcCAhPSBzdGRpbikKKwl7CisJICBmcHJpbnRmKGZwbywgInVuc2lnbmVkIGNoYXIgJXMiLCBpc2RpZ2l0KChpbnQpYXJndlsxXVswXSkgPyAiX18iIDogIiIpOworCSAgZm9yIChlID0gMDsgKGMgPSBhcmd2WzFdW2VdKSAhPSAwOyBlKyspCisJICAgIHB1dGMoaXNhbG51bShjKSA/IGMgOiAnXycsIGZwbyk7CisJICBmcHV0cygiW10gPSB7XG4iLCBmcG8pOworCX0KKworICAgICAgcCA9IDA7CisgICAgICB3aGlsZSAoKGxlbmd0aCA8IDAgfHwgcCA8IGxlbmd0aCkgJiYgKGMgPSBnZXRjKGZwKSkgIT0gRU9GKQorCXsKKwkgIGZwcmludGYoZnBvLCAoaGV4eCA9PSBoZXh4YSkgPyAiJXMweCUwMngiIDogIiVzMFglMDJYIiwKKwkgICAgKHAgJSBjb2xzKSA/ICIsICIgOiAiLFxuICAiKzIqIXAsICBjKTsKKwkgIHArKzsKKwl9CisKKyAgICAgIGlmIChwKQorCWZwdXRzKCJcbn07XG4iKzMqKGZwID09IHN0ZGluKSwgZnBvKTsKKworICAgICAgaWYgKGZwICE9IHN0ZGluKQorCXsKKwkgIGZwcmludGYoZnBvLCAidW5zaWduZWQgaW50ICVzIiwgaXNkaWdpdCgoaW50KWFyZ3ZbMV1bMF0pID8gIl9fIiA6ICIiKTsKKwkgIGZvciAoZSA9IDA7IChjID0gYXJndlsxXVtlXSkgIT0gMDsgZSsrKQorCSAgICBwdXRjKGlzYWxudW0oYykgPyBjIDogJ18nLCBmcG8pOworCSAgZnByaW50ZihmcG8sICJfbGVuID0gJWQ7XG4iLCBwKTsKKwl9CisKKyAgICAgIGZjbG9zZShmcCk7CisgICAgICBmY2xvc2UoZnBvKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBpZiAoaGV4dHlwZSA9PSBIRVhfUE9TVFNDUklQVCkKKyAgICB7CisgICAgICBwID0gY29sczsKKyAgICAgIHdoaWxlICgobGVuZ3RoIDwgMCB8fCBuIDwgbGVuZ3RoKSAmJiAoZSA9IGdldGMoZnApKSAhPSBFT0YpCisJeworCSAgcHV0Y2hhcihoZXh4WyhlID4+IDQpICYgMHhmXSk7CisJICBwdXRjaGFyKGhleHhbKGUgICAgICkgJiAweGZdKTsKKwkgIG4rKzsKKwkgIGlmICghLS1wKQorCSAgICB7CisJICAgICAgcHV0Y2hhcignXG4nKTsKKwkgICAgICBwID0gY29sczsKKwkgICAgfQorCX0KKyAgICAgIGlmIChwIDwgY29scykKKwlwdXRjaGFyKCdcbicpOworICAgICAgZmNsb3NlKGZwKTsKKyAgICAgIGZjbG9zZShmcG8pOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIC8qIGhleHR5cGU6IEhFWF9OT1JNQUwgb3IgSEVYX0JJVFMgKi8KKworICBpZiAoaGV4dHlwZSA9PSBIRVhfTk9STUFMKQorICAgIGdycGxlbiA9IG9jdHNwZXJncnAgKyBvY3RzcGVyZ3JwICsgMTsJLyogY2hhcnMgcGVyIG9jdGV0IGdyb3VwICovCisgIGVsc2UJLyogaGV4dHlwZSA9PSBIRVhfQklUUyAqLworICAgIGdycGxlbiA9IDggKiBvY3RzcGVyZ3JwICsgMTsKKworICB3aGlsZSAoKGxlbmd0aCA8IDAgfHwgbiA8IGxlbmd0aCkgJiYgKGUgPSBnZXRjKGZwKSkgIT0gRU9GKQorICAgIHsKKyAgICAgIGlmIChwID09IDApCisJeworCSAgc3ByaW50ZihsLCAiJTA3bHg6ICIsIG4gKyBzZWVrb2ZmKTsKKwkgIGZvciAoYyA9IDk7IGMgPCBMTEVOOyBsW2MrK10gPSAnICcpOworCX0KKyAgICAgIGlmIChoZXh0eXBlID09IEhFWF9OT1JNQUwpCisJeworCSAgbFtjID0gKDkgKyAoZ3JwbGVuICogcCkgLyBvY3RzcGVyZ3JwKV0gPSBoZXh4WyhlID4+IDQpICYgMHhmXTsKKwkgIGxbKytjXQkJCSAgICAgICA9IGhleHhbIGUgICAgICAgJiAweGZdOworCX0KKyAgICAgIGVsc2UgLyogaGV4dHlwZSA9PSBIRVhfQklUUyAqLworCXsKKwkgIGludCBpOworCisJICBjID0gKDkgKyAoZ3JwbGVuICogcCkgLyBvY3RzcGVyZ3JwKSAtIDE7CisJICBmb3IgKGkgPSA3OyBpID49IDA7IGktLSkKKwkgICAgbFsrK2NdID0gKGUgJiAoMSA8PCBpKSkgPyAnMScgOiAnMCc7CisJfQorICAgICAgaWYgKGViY2RpYykKKwllID0gKGUgPCA2NCkgPyAnLicgOiBldG9hNjRbZS02NF07CisgICAgICAvKiBXaGVuIGNoYW5naW5nIHRoaXMgdXBkYXRlIGRlZmluaXRpb24gb2YgTExFTiBhYm92ZS4gKi8KKyAgICAgIGxbMTEgKyAoZ3JwbGVuICogY29scyAtIDEpL29jdHNwZXJncnAgKyBwXSA9CisjaWZkZWYgX19NVlNfXworCSAgKGUgPj0gNjQpCisjZWxzZQorCSAgKGUgPiAzMSAmJiBlIDwgMTI3KQorI2VuZGlmCisJICA/IGUgOiAnLic7CisgICAgICBpZiAoZSkKKwlub256ZXJvKys7CisgICAgICBuKys7CisgICAgICBpZiAoKytwID09IGNvbHMpCisJeworCSAgbFtjID0gKDExICsgKGdycGxlbiAqIGNvbHMgLSAxKS9vY3RzcGVyZ3JwICsgcCldID0gJ1xuJzsgbFsrK2NdID0gJ1wwJzsKKwkgIHh4ZGxpbmUoZnBvLCBsLCBhdXRvc2tpcCA/IG5vbnplcm8gOiAxKTsKKwkgIG5vbnplcm8gPSAwOworCSAgcCA9IDA7CisJfQorICAgIH0KKyAgaWYgKHApCisgICAgeworICAgICAgbFtjID0gKDExICsgKGdycGxlbiAqIGNvbHMgLSAxKS9vY3RzcGVyZ3JwICsgcCldID0gJ1xuJzsgbFsrK2NdID0gJ1wwJzsKKyAgICAgIHh4ZGxpbmUoZnBvLCBsLCAxKTsKKyAgICB9CisgIGVsc2UgaWYgKGF1dG9za2lwKQorICAgIHh4ZGxpbmUoZnBvLCBsLCAtMSk7CS8qIGxhc3QgY2hhbmNlIHRvIGZsdXNoIG91dCBzdXBwcmVzc2VkIGxpbmVzICovCisKKyAgZmNsb3NlKGZwKTsKKyAgZmNsb3NlKGZwbyk7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kYmdfaW50ZXJhY3RpdmUvaG9va3MuaSBiL2V4dGVuc2lvbnMvZGJnX2ludGVyYWN0aXZlL2hvb2tzLmkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThjYmM1OAotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGJnX2ludGVyYWN0aXZlL2hvb2tzLmkKQEAgLTAsMCArMSwxOTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDEzLCBXSURFIFByb2plY3QgYW5kIE5JQ1QJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFdJREUgUHJvamVjdCBvciBOSUNUIG5vciB0aGUgCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgV0lERSBQcm9qZWN0IGFuZCAJCQkJCQkgKgorKiAgIE5JQ1QuCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRG8gbm90IGluY2x1ZGUgdGhpcyBkaXJlY3RseSwgdXNlIGRiZ19pbnRlcmFjdGl2ZS5pIGluc3RlYWQgKi8KKworLyoqKioqKiBIT09LUyAqKioqKioqKiovCisKKworLyogRnVuY3Rpb25zIHRvIGhhbmRsZSB0aGUgUE1EICovCisleworCitzdHJ1Y3QgZmRfaG9va19wZXJtc2dkYXRhIHsKKwlQeU9iamVjdCAqUHlQTUw7Cit9OworCitzdGF0aWMgdm9pZCBpbml0X3Blcm1zZ2RhdGEgKHN0cnVjdCBmZF9ob29rX3Blcm1zZ2RhdGEgKiBwbWQpIHsKKwkvKiBUaGUgUE1EIGlzIE5vbmUgYnkgZGVmYXVsdCAqLworCVB5X0lOQ1JFRihQeV9Ob25lKTsKKwlwbWQtPlB5UE1MID0gUHlfTm9uZTsKK30KKworc3RhdGljIHZvaWQgZmluaV9wZXJtc2dkYXRhIChzdHJ1Y3QgZmRfaG9va19wZXJtc2dkYXRhICogcG1kKSB7CisJUHlfREVDUkVGKHBtZC0+UHlQTUwpOworfQorCislfQorCitzdHJ1Y3QgZmRfaG9va19kYXRhX2hkbCB7Cit9OworCislbm9kZWZhdWx0Y3RvciBmZF9ob29rX2RhdGFfaGRsOworJWV4dGVuZCBmZF9ob29rX2RhdGFfaGRsIHsKKwlmZF9ob29rX2RhdGFfaGRsKCkgeworCQlzdHJ1Y3QgZmRfaG9va19kYXRhX2hkbCAqIGhkbCA9IE5VTEw7CisJCWludCByZXQ7CisJCQorCQlyZXQgPSBmZF9ob29rX2RhdGFfcmVnaXN0ZXIgKCBzaXplb2Yoc3RydWN0IGZkX2hvb2tfcGVybXNnZGF0YSksIGluaXRfcGVybXNnZGF0YSwgZmluaV9wZXJtc2dkYXRhLCAmaGRsICk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJRElfRVJST1IocmV0LCBOVUxMLCBOVUxMKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXJldHVybiBoZGw7CisJfQorfQorCisKKy8qIE5vdyB0aGUgaG9vayBpdHNlbGYgKi8KKyV7CitzdGF0aWMgdm9pZCBjYWxsX3RoZV9weXRob25faG9va19jYWxsYmFjayhlbnVtIGZkX2hvb2tfdHlwZSB0eXBlLCBzdHJ1Y3QgbXNnICogbXNnLCBzdHJ1Y3QgcGVlcl9oZHIgKiBwZWVyLCB2b2lkICogb3RoZXIsIHN0cnVjdCBmZF9ob29rX3Blcm1zZ2RhdGEgKnBtZCwgdm9pZCAqIHJlZ2RhdGEpIHsKKwlQeU9iamVjdCAqY2IsICpyZXN1bHQgPSBOVUxMOworCVB5T2JqZWN0ICpQeVR5cGUsICpQeU1zZywgKlB5UGVlciwgKlB5T3RoZXIsICpQeU9sZFBtZDsKKwkKKwlpZiAoIXJlZ2RhdGEpIHsKKwkJTE9HX0UoIkludGVybmFsIGVycm9yOiBtaXNzaW5nIHRoZSBjYWxsYmFjayEiKTsKKwkJcmV0dXJuOworCX0KKwljYiA9IHJlZ2RhdGE7CisKKwlTV0lHX1BZVEhPTl9USFJFQURfQkVHSU5fQkxPQ0s7CisJLyogQ29udmVydCB0aGUgYXJndW1lbnRzICovCisJUHlUeXBlID0gUHlMb25nX0Zyb21Mb25nKHR5cGUpOworCVB5X0lOQ1JFRihQeVR5cGUpOworCQorCVB5TXNnICA9IFNXSUdfTmV3UG9pbnRlck9iaigodm9pZCAqKSBtc2csICAgICBTV0lHVFlQRV9wX21zZywgICAgIDAgKTsKKwkKKwlQeVBlZXIgPSBTV0lHX05ld1BvaW50ZXJPYmooKHZvaWQgKikgcGVlciwgICAgU1dJR1RZUEVfcF9wZWVyX2hkciwgICAgIDAgKTsKKwlpZiAob3RoZXIgPT0gTlVMTCkgeworCQlQeU90aGVyPVB5X05vbmU7CisJCVB5X0lOQ1JFRihQeV9Ob25lKTsKKwl9IGVsc2UgeworCQlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBIT09LX0RBVEFfUkVDRUlWRUQ6CisJCQlQeU90aGVyPSBTV0lHX05ld1BvaW50ZXJPYmooIG90aGVyLCBTV0lHVFlQRV9wX2ZkX2NueF9yY3ZkYXRhLCAwICk7CisJCQlicmVhazsKKwkJCQorCQljYXNlIEhPT0tfTUVTU0FHRV9SRUNFSVZFRDoKKwkJY2FzZSBIT09LX01FU1NBR0VfUk9VVElOR19FUlJPUjoKKwkJY2FzZSBIT09LX01FU1NBR0VfRFJPUFBFRDoKKwkJY2FzZSBIT09LX1BFRVJfQ09OTkVDVF9GQUlMRUQ6CisJCQlQeU90aGVyPSBTV0lHX05ld1BvaW50ZXJPYmooIG90aGVyLCBTV0lHVFlQRV9wX2NoYXIsIDAgKTsKKwkJCWJyZWFrOworCQkJCisJCWNhc2UgSE9PS19NRVNTQUdFX1BBUlNJTkdfRVJST1I6CisJCQlpZiAobXNnKSB7CisJCQkJUHlPdGhlcj0gU1dJR19OZXdQb2ludGVyT2JqKCBvdGhlciwgU1dJR1RZUEVfcF9jaGFyLCAwICk7CisJCQl9IGVsc2UgeworCQkJCVB5T3RoZXI9IFNXSUdfTmV3UG9pbnRlck9iaiggb3RoZXIsIFNXSUdUWVBFX3BfZmRfY254X3JjdmRhdGEsIDAgKTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLyogSW4gb3RoZXIgY2FzZXMsIG90aGVyIHNob3VsZCBiZSBOVUxMICovCisJCQlMT0dfRSgiSW50ZXJuYWwgZXJyb3I6IGdvdCBhIHZhbHVlIG9mICpvdGhlciIpOworCQl9CisJCQorCX0KKwkKKwlpZiAocG1kID09IE5VTEwpIHsKKwkJUHlfSU5DUkVGKFB5X05vbmUpOworCQlQeU9sZFBtZD1QeV9Ob25lOworCX0gZWxzZSB7CisJCVB5T2xkUG1kPXBtZC0+UHlQTUw7CisJfQorCQorCS8qIENhbGwgdGhlIGZ1bmN0aW9uICovCisJcmVzdWx0ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGNiLCAiKE9PT09PKSIsIFB5VHlwZSwgUHlNc2csIFB5UGVlciwgUHlPdGhlciwgUHlPbGRQbWQpOworCQorCVNXSUdfUFlUSE9OX1RIUkVBRF9FTkRfQkxPQ0s7CisJaWYgKHBtZCA9PSBOVUxMKQorCQlyZXR1cm47CisJCisJUHlfREVDUkVGKHBtZC0+UHlQTUwpOworCVB5X0lOQ1JFRihyZXN1bHQpOworCXBtZC0+UHlQTUwgPSByZXN1bHQ7Cit9CislfQorCisKKworc3RydWN0IGZkX2hvb2tfaGRsIHsKK307CisKKyVub2RlZmF1bHRjdG9yIGZkX2hvb2tfaGRsOworJWV4dGVuZCBmZF9ob29rX2hkbCB7CisJZmRfaG9va19oZGwodWludDMyX3QgdHlwZV9tYXNrLCBQeU9iamVjdCAqIFB5Q2IpIHsKKwkJc3RydWN0IGZkX2hvb2tfaGRsICpoZGw7CisJCWludCByZXQ7CisJCQorCQlQeV9YSU5DUkVGKFB5Q2IpOworCQkKKwkJcmV0ID0gZmRfaG9va19yZWdpc3RlciAoIHR5cGVfbWFzaywgY2FsbF90aGVfcHl0aG9uX2hvb2tfY2FsbGJhY2ssIFB5Q2IsIE5VTEwsICZoZGwgKTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlESV9FUlJPUihyZXQsIE5VTEwsIE5VTEwpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJcmV0dXJuIGhkbDsKKwl9CisJZmRfaG9va19oZGwodWludDMyX3QgdHlwZV9tYXNrLCBQeU9iamVjdCAqIFB5Q2IsIHN0cnVjdCBmZF9ob29rX2RhdGFfaGRsICpkYXRhaGRsKSB7CisJCXN0cnVjdCBmZF9ob29rX2hkbCAqaGRsOworCQlpbnQgcmV0OworCQkKKwkJUHlfWElOQ1JFRihQeUNiKTsKKwkJCisJCXJldCA9IGZkX2hvb2tfcmVnaXN0ZXIgKCB0eXBlX21hc2ssIGNhbGxfdGhlX3B5dGhvbl9ob29rX2NhbGxiYWNrLCBQeUNiLCBkYXRhaGRsLCAmaGRsICk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJRElfRVJST1IocmV0LCBOVUxMLCBOVUxMKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXJldHVybiBoZGw7CisJfQorCX5mZF9ob29rX2hkbCgpIHsKKwkJc3RydWN0IGZkX2hvb2tfaGRsICogaGRsID0gc2VsZjsKKwkJaW50IHJldCA9IGZkX2hvb2tfdW5yZWdpc3RlcihoZGwpOworCQlpZiAocmV0ICE9IDApIHsKKwkJCURJX0VSUk9SKHJldCwgTlVMTCwgTlVMTCk7CisJCX0KKwkJcmV0dXJuOworCX0KK30KZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGJnX2ludGVyYWN0aXZlL2xpc3RzLmkgYi9leHRlbnNpb25zL2RiZ19pbnRlcmFjdGl2ZS9saXN0cy5pCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhYzI2ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RiZ19pbnRlcmFjdGl2ZS9saXN0cy5pCkBAIC0wLDAgKzEsMTMyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxMywgV0lERSBQcm9qZWN0IGFuZCBOSUNUCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBXSURFIFByb2plY3Qgb3IgTklDVCBub3IgdGhlIAkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFdJREUgUHJvamVjdCBhbmQgCQkJCQkJICoKKyogICBOSUNULgkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIERvIG5vdCBpbmNsdWRlIHRoaXMgZGlyZWN0bHksIHVzZSBkYmdfaW50ZXJhY3RpdmUuaSBpbnN0ZWFkICovCisKKy8qKioqKiogTElTVFMgKioqKioqKioqLworCislZXh0ZW5kIGZkX2xpc3QgeworCS8qIGFsbG93IGEgcGFyYW1ldGVyIGluIHRoZSBjb25zdHJ1Y3RvciwgYW5kIHBlcmZvcm0gdGhlIGZkX2xpc3RfaW5pdCBvcGVyYXRpb24gKi8KKwlmZF9saXN0KHZvaWQgKiBvID0gTlVMTCkgeworCQlzdHJ1Y3QgZmRfbGlzdCAqIGxpOworCQlsaSA9IChzdHJ1Y3QgZmRfbGlzdCAqKSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBmZF9saXN0KSk7CisJCWlmICghbGkpIHsKKwkJCURJX0VSUk9SX01BTExPQzsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWZkX2xpc3RfaW5pdChsaSwgbyk7CisJCXJldHVybiBsaTsKKwl9CisJLyogVW5saW5rIGJlZm9yZSBmcmVlaW5nICovCisJfmZkX2xpc3QoKSB7CisJCWZkX2xpc3RfdW5saW5rKCRzZWxmKTsKKwkJZnJlZSgkc2VsZik7CisJfQorCS8qIEZvciBkZWJ1Zywgc2hvdyB0aGUgdmFsdWVzIG9mIHRoZSBsaXN0ICovCisJdm9pZCBkdW1wKCkgeworCQlmZF9sb2dfZGVidWcoImxpc3Q6ICVwIiwgJHNlbGYpOworCQlmZF9sb2dfZGVidWcoIiAgLSBuZXh0OiAlcCIsICRzZWxmLT5uZXh0KTsKKwkJZmRfbG9nX2RlYnVnKCIgIC0gcHJldjogJXAiLCAkc2VsZi0+cHJldik7CisJCWZkX2xvZ19kZWJ1ZygiICAtIGhlYWQ6ICVwIiwgJHNlbGYtPmhlYWQpOworCQlmZF9sb2dfZGVidWcoIiAgLSBvICAgOiAlcCIsICRzZWxmLT5vKTsKKwl9CisJLyogSW5zZXJ0IGJlZm9yZS9hZnRlciB3cmFwcGVyICovCisJdm9pZCBpbnNlcnRfcHJldihzdHJ1Y3QgZmRfbGlzdCAqIGxpKSB7CisJCWZkX2xpc3RfaW5zZXJ0X2JlZm9yZSgkc2VsZiwgbGkpOworCX0KKwl2b2lkIGluc2VydF9uZXh0KHN0cnVjdCBmZF9saXN0ICogbGkpIHsKKwkJZmRfbGlzdF9pbnNlcnRfYWZ0ZXIoJHNlbGYsIGxpKTsKKwl9CisJLyogVGVzdCBmb3IgZW1wdHluZXNzICovCisJUHlPYmplY3QgKiBpc2VtcHR5KCkgeworCQlQeU9iamVjdCAqIHJldDsKKwkJaWYgKEZEX0lTX0xJU1RfRU1QVFkoJHNlbGYpKQorCQkJcmV0ID0gUHlfVHJ1ZTsKKwkJZWxzZQorCQkJcmV0ID0gUHlfRmFsc2U7CisJCVB5X1hJTkNSRUYocmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJLyogQ29uY2F0ZW5hdGUgdHdvIGxpc3RzICovCisJdm9pZCBjb25jYXQoc3RydWN0IGZkX2xpc3QgKiBsaSkgeworCQlmZF9saXN0X21vdmVfZW5kKCRzZWxmLCBsaSk7CisJfQorCS8qIFVubGluayB3aXRob3V0IGZyZWVpbmcgKi8KKwl2b2lkIGRldGFjaCgpIHsKKwkJZmRfbGlzdF91bmxpbmsoJHNlbGYpOworCX0KKwkKKwkvKiBSZXR1cm4gdGhlIGxpc3QgYXMgcHl0aG9uIGxpc3Qgb2YgZWxlbWVudHMgKi8KKwlQeU9iamVjdCAqIGVudW1fYXMoY2hhciAqIHR5cGUgPSBOVUxMLCBpbnQgZG9udF91c2VfbyA9IDApIHsKKwkJc3RydWN0IGZkX2xpc3QgKmxpOworCQlzd2lnX3R5cGVfaW5mbyAqIGRlc3R0eXBlID0gTlVMTDsKKwkJUHlPYmplY3QgKiBybDsKKwkJCisJCWlmICgkc2VsZi0+aGVhZCAhPSAkc2VsZikgeworCQkJRElfRVJST1IoRUlOVkFMLCBOVUxMLCAiVGhpcyBtZXRob2QgY2FuIG9ubHkgYmUgY2FsbGVkIG9uIHRoZSBsaXN0IHNlbnRpbmVsLiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJCisJCWlmICh0eXBlKSB7CisJCQlkZXN0dHlwZSA9IFNXSUdfVHlwZVF1ZXJ5KHR5cGUpOworCQkJaWYgKCFkZXN0dHlwZSkgeworCQkJCURJX0VSUk9SKEVJTlZBTCwgTlVMTCwgIlVuYWJsZSB0byByZXNvbHZlIHRoaXMgdHlwZS4gUGxlYXNlIGNoZWNrIHRoZSBmb3JtOiAnc3RydWN0IGJsYWhibGEgKiciKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJfQorCQlpZiAoZGVzdHR5cGUgPT0gTlVMTCkgeworCQkJLyogZmFsbGJhY2sgdG8gZmRfbGlzdCAqLworCQkJZGVzdHR5cGUgPSBTV0lHVFlQRV9wX2ZkX2xpc3Q7CisJCQkvKiBpbiB0aGlzIGNhc2UsIGRvbid0IGZvbGxvdyB0aGUgJ28nIGxpbmsgKi8KKwkJCWRvbnRfdXNlX28gPSAxOworCQl9CisJCQorCQlybCA9IFB5TGlzdF9OZXcoMCk7CisJCVNXSUdfUFlUSE9OX1RIUkVBRF9CRUdJTl9CTE9DSzsKKwkJZm9yIChsaSA9ICRzZWxmLT5uZXh0OyBsaSAhPSAkc2VsZjsgbGkgPSBsaS0+bmV4dCkgeworCQkJdm9pZCAqIG9iaiA9IE5VTEw7CisJCQlpZiAoZG9udF91c2VfbyB8fCBsaS0+byA9PSBOVUxMKQorCQkJCW9iaiA9IGxpOworCQkJZWxzZQorCQkJCW9iaiA9IGxpLT5vOworCQkJUHlMaXN0X0FwcGVuZChybCwgU1dJR19OZXdQb2ludGVyT2JqKG9iaiwgZGVzdHR5cGUsIDAgKSk7CisJCX0KKwkJUHlfWElOQ1JFRihybCk7CisJCVNXSUdfUFlUSE9OX1RIUkVBRF9FTkRfQkxPQ0s7CisJCQorCQlyZXR1cm4gcmw7CisJfQorfTsKKwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kYmdfaW50ZXJhY3RpdmUvbWVzc2FnZXMuaSBiL2V4dGVuc2lvbnMvZGJnX2ludGVyYWN0aXZlL21lc3NhZ2VzLmkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QxM2U1ZAotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGJnX2ludGVyYWN0aXZlL21lc3NhZ2VzLmkKQEAgLTAsMCArMSw2MTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDEzLCBXSURFIFByb2plY3QgYW5kIE5JQ1QJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFdJREUgUHJvamVjdCBvciBOSUNUIG5vciB0aGUgCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgV0lERSBQcm9qZWN0IGFuZCAJCQkJCQkgKgorKiAgIE5JQ1QuCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRG8gbm90IGluY2x1ZGUgdGhpcyBkaXJlY3RseSwgdXNlIGRiZ19pbnRlcmFjdGl2ZS5pIGluc3RlYWQgKi8KKworLyoqKioqKiBNRVNTQUdFUyAqKioqKioqKiovCisKKyV7CitzdHJ1Y3QgYW5zY2JfcHlfbGF5ZXIgeworCVB5T2JqZWN0ICogY2I7CisJUHlPYmplY3QgKiBleHBjYjsKKwlQeU9iamVjdCAqIGRhdGE7Cit9OworCisvKiBJZiBhIHB5dGhvbiBjYWxsYmFjayB3YXMgcHJvdmlkZWQsIGl0IGlzIHJlY2VpdmVkIGluIGNiZGF0YSAqLworc3RhdGljIHZvaWQgYW5zY2JfcHl0aG9uKHZvaWQgKmNiZGF0YSwgc3RydWN0IG1zZyAqKiBtc2cpIHsKKwkvKiBUaGUgcHl0aG9uIGNhbGxiYWNrIGlzIHJlY2VpdmVkIGluIGNiZGF0YSAqLworCVB5T2JqZWN0ICogcmVzdWx0LCAqUHlNc2c7CisJc3RydWN0IGFuc2NiX3B5X2xheWVyICogbCA9IGNiZGF0YTsKKwkKKwlpZiAoIWwpIHsKKwkJZmRfbG9nX2RlYnVnKCJJbnRlcm5hbCBlcnJvciEgUHl0aG9uIGNhbGxiYWNrIGRpc2FwcGVhcmVkLi4uIik7CisJCXJldHVybjsKKwl9CisJCisJaWYgKGwtPmNiKSB7CisJCisJCVNXSUdfUFlUSE9OX1RIUkVBRF9CRUdJTl9CTE9DSzsKKworCQlpZiAoIW1zZyB8fCAhKm1zZykgeworCQkJUHlNc2cgPSBQeV9Ob25lOworCQl9IGVsc2UgeworCQkJUHlNc2cgPSBTV0lHX05ld1BvaW50ZXJPYmooKHZvaWQgKikqbXNnLCAgICAgU1dJR1RZUEVfcF9tc2csICAgICAwICk7CisJCX0KKworCQlyZXN1bHQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24obC0+Y2IsICIoT08pIiwgUHlNc2csIGwtPmRhdGEpOworCQlQeV9YREVDUkVGKGwtPmNiKTsKKwkJUHlfWERFQ1JFRihsLT5leHBjYik7CisJCVB5X1hERUNSRUYobC0+ZGF0YSk7CisJCWZyZWUobCk7CisKKwkJLyogVGhlIGNhbGxiYWNrIGlzIHN1cHBvc2VkIHRvIHJldHVybiBhIG1lc3NhZ2Ugb3IgTlVMTCAqLworCQlpZiAoIVNXSUdfSXNPSyhTV0lHX0NvbnZlcnRQdHIocmVzdWx0LCAodm9pZCAqKW1zZywgU1dJR1RZUEVfcF9tc2csIFNXSUdfUE9JTlRFUl9ESVNPV04pKSkgeworCQkJZmRfbG9nX2RlYnVnKCJFcnJvcjogQ2Fubm90IGNvbnZlcnQgdGhlIHJldHVybiB2YWx1ZSB0byBtZXNzYWdlLiIpOworCQkJKm1zZyA9IE5VTEw7CisJCX0KKworCQlQeV9YREVDUkVGKHJlc3VsdCk7CisKKwkJU1dJR19QWVRIT05fVEhSRUFEX0VORF9CTE9DSzsKKwkJCisJfQorCS8qIGVsc2UgKi8KKwkJLyogT25seSB0aGUgdGltZW91dCB3YXMgc3BlY2lmaWVkLCB3aXRob3V0IGEgY2FsbGJhY2sgKi8KKwkJLyogaW4gdGhpcyBjYXNlLCBqdXN0IGRlbGV0ZSB0aGUgbWVzc2FnZSAqLworCQkvKiBpdCBhY3R1YWxseSBoYXBwZW5zIGF1dG9tYXRpY2FsbHkgd2hlbiB3ZSBkbyBub3RoaW5nLiAqLworfQorCitzdGF0aWMgdm9pZCBleHBjYl9weXRob24odm9pZCAqY2JkYXRhLCBEaWFtSWRfdCBzZW50dG8sIHNpemVfdCBzZW50dG9sZW4sIHN0cnVjdCBtc2cgKiogbXNnKSB7CisJLyogVGhlIHB5dGhvbiBjYWxsYmFjayBpcyByZWNlaXZlZCBpbiBjYmRhdGEgKi8KKwlQeU9iamVjdCAqIHJlc3VsdCwgKlB5TXNnOworCXN0cnVjdCBhbnNjYl9weV9sYXllciAqIGwgPSBjYmRhdGE7CisJCisJaWYgKCFsKSB7CisJCWZkX2xvZ19kZWJ1ZygiSW50ZXJuYWwgZXJyb3IhIFB5dGhvbiBjYWxsYmFjayBkaXNhcHBlYXJlZC4uLiIpOworCQlyZXR1cm47CisJfQorCQorCVNXSUdfUFlUSE9OX1RIUkVBRF9CRUdJTl9CTE9DSzsKKworCWlmICghbXNnIHx8ICEqbXNnKSB7CisJCVB5TXNnID0gUHlfTm9uZTsKKwl9IGVsc2UgeworCQlQeU1zZyA9IFNXSUdfTmV3UG9pbnRlck9iaigodm9pZCAqKSptc2csICAgICBTV0lHVFlQRV9wX21zZywgICAgIDAgKTsKKwl9CisKKwlyZXN1bHQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24obC0+ZXhwY2IsICIoT3MjTykiLCBQeU1zZywgc2VudHRvLCBzZW50dG9sZW4sIGwtPmRhdGEpOworCVB5X1hERUNSRUYobC0+Y2IpOworCVB5X1hERUNSRUYobC0+ZXhwY2IpOworCVB5X1hERUNSRUYobC0+ZGF0YSk7CisJZnJlZShsKTsKKworCS8qIFRoZSBjYWxsYmFjayBpcyBzdXBwb3NlZCB0byByZXR1cm4gYSBtZXNzYWdlIG9yIE5VTEwgKi8KKwlpZiAoIVNXSUdfSXNPSyhTV0lHX0NvbnZlcnRQdHIocmVzdWx0LCAodm9pZCAqKW1zZywgU1dJR1RZUEVfcF9tc2csIFNXSUdfUE9JTlRFUl9ESVNPV04pKSkgeworCQlmZF9sb2dfZGVidWcoIkVycm9yOiBDYW5ub3QgY29udmVydCB0aGUgcmV0dXJuIHZhbHVlIHRvIG1lc3NhZ2UuIik7CisJCSptc2cgPSBOVUxMOworCX0KKworCVB5X1hERUNSRUYocmVzdWx0KTsKKworCVNXSUdfUFlUSE9OX1RIUkVBRF9FTkRfQkxPQ0s7CisJCQorfQorCisKKworJX0KKworc3RydWN0IG1zZyB7Cit9OworCislZXh0ZW5kIG1zZyB7CisJbXNnKHN0cnVjdCBkaWN0X29iamVjdCAqIG1vZGVsPU5VTEwsIGludCBmbGFncyA9IE1TR0ZMX0FMTE9DX0VURUlEKSB7CisJCXN0cnVjdCBtc2cgKiBtID0gTlVMTDsKKwkJaW50IHJldCA9IGZkX21zZ19uZXcoIG1vZGVsLCBmbGFncywgJm0pOworCQlpZiAocmV0ICE9IDApIHsKKwkJCURJX0VSUk9SKHJldCwgTlVMTCwgTlVMTCk7CisJCX0KKwkJcmV0dXJuIG07CisJfQorCS8qIGNvbnN0cnVjdCBhbHNvIGZyb20gYSBiaW5hcnkgYnVmZmVyICovCisJbXNnKGNoYXIgKiBTVFJJTkcsIHNpemVfdCBMRU5HVEgpIHsKKwkJaW50IHJldDsKKwkJc3RydWN0IG1zZyAqIG0gPSBOVUxMOworCQkvKiBGaXJzdCwgY29weSB0aGUgc3RyaW5nICovCisJCXVuc2lnbmVkIGNoYXIgKiBidWYgPSBtYWxsb2MoTEVOR1RIKTsKKwkJaWYgKGJ1ZiA9PSBOVUxMKSB7CisJCQlESV9FUlJPUl9NQUxMT0M7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQltZW1jcHkoYnVmLCBTVFJJTkcsIExFTkdUSCk7CisJCXJldCA9IGZkX21zZ19wYXJzZV9idWZmZXIoJmJ1ZiwgTEVOR1RILCAmbSk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJRElfRVJST1IocmV0LCBOVUxMLCBOVUxMKTsKKwkJCWZyZWUoYnVmKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXJldHVybiBtOworCX0KKwl+bXNnKCkgeworCQlpbnQgcmV0ID0gZmRfbXNnX2ZyZWUoJHNlbGYpOworCQlpZiAocmV0ICE9IDApIHsKKwkJCURJX0VSUk9SKHJldCwgTlVMTCwgTlVMTCk7CisJCX0KKwl9CisJCisJLyogU0VORCBUSEUgTUVTU0FHRSAqLworCSVkZWxvYmplY3Qgc2VuZDsgLyogd2hlbiB0aGlzIGhhcyBiZWVuIGNhbGxlZCwgdGhlIG1zZyBtdXN0IG5vdCBiZSBmcmVlZCBhbnltb3JlICovCisJdm9pZCBzZW5kKFB5T2JqZWN0ICogUHlDYiA9IE5VTEwsIFB5T2JqZWN0ICogZGF0YSA9IE5VTEwsIFB5T2JqZWN0ICogUHlFeHBDYiA9IE5VTEwsIHVuc2lnbmVkIGludCB0aW1lb3V0ID0gMCkgeworCQlpbnQgcmV0OworCQlzdHJ1Y3QgbXNnICogbSA9ICRzZWxmOworCQlzdHJ1Y3QgYW5zY2JfcHlfbGF5ZXIgKiBsID0gTlVMTDsKKwkJCisJCWlmIChQeUNiIHx8IHRpbWVvdXQpIHsKKwkJCWwgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBhbnNjYl9weV9sYXllcikpOworCQkJaWYgKCFsKSB7CisJCQkJRElfRVJST1JfTUFMTE9DOworCQkJCXJldHVybjsKKwkJCX0KKworCQkJUHlfWElOQ1JFRihQeUNiKTsKKwkJCVB5X1hJTkNSRUYoZGF0YSk7CisJCQlQeV9YSU5DUkVGKFB5RXhwQ2IpOworCQkJbC0+ZXhwY2IgPSBQeUV4cENiOworCQkJbC0+Y2IgPSBQeUNiOworCQkJbC0+ZGF0YSA9IGRhdGE7CisJCX0KKwkJCisJCWlmICh0aW1lb3V0KSB7CisJCQlzdHJ1Y3QgdGltZXNwZWMgdHM7CisJCQkodm9pZCkgY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJnRzKTsKKwkJCXRzLnR2X3NlYyArPSB0aW1lb3V0OworCQkJcmV0ID0gZmRfbXNnX3NlbmRfdGltZW91dCgmbSwgYW5zY2JfcHl0aG9uLCBsLCBleHBjYl9weXRob24sICZ0cyk7CisJCX0gZWxzZSB7CisJCQlyZXQgPSBmZF9tc2dfc2VuZCgmbSwgUHlDYiA/IGFuc2NiX3B5dGhvbiA6IE5VTEwsIGwpOworCQl9CisJCWlmIChyZXQgIT0gMCkgeworCQkJRElfRVJST1IocmV0LCBOVUxMLCBOVUxMKTsKKwkJfQorCX0KKwkKKwkvKiBDcmVhdGUgYW4gYW5zd2VyICovCisJJWRlbG9iamVjdCBjcmVhdGVfYW5zd2VyOyAvKiB3aGVuIHRoaXMgaGFzIGJlZW4gY2FsbGVkLCB0aGUgb3JpZ2luYWwgbXNnIHNob3VsZCBub3QgYmUgZnJlZWQgYW55bW9yZSAqLworCXN0cnVjdCBtc2cgKiBjcmVhdGVfYW5zd2VyKHN0cnVjdCBkaWN0aW9uYXJ5ICogZGljdCA9IE5VTEwsIGludCBmbGFncyA9IDApIHsKKwkJLyogaWYgZGljdCBpcyBub3QgcHJvdmlkZWQsIGF0dGVtcHQgdG8gZ2V0IGl0IGZyb20gdGhlIHJlcXVlc3QgbW9kZWwgKi8KKwkJc3RydWN0IGRpY3Rpb25hcnkgKiBkID0gZGljdDsKKwkJc3RydWN0IG1zZyAqIG0gPSAkc2VsZjsKKwkJaW50IHJldDsKKwkJaWYgKCFkKSB7CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBtbyA9IE5VTEw7CisJCQlyZXQgPSBmZF9tc2dfbW9kZWwoJHNlbGYsICZtbyk7CisJCQlpZiAocmV0ICE9IDApIHsKKwkJCQlESV9FUlJPUihyZXQsIE5VTEwsICJFcnJvciByZXRyaWV2aW5nIHF1ZXJ5IG1vZGVsLiIpOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQkJaWYgKG1vID09IE5VTEwpIHsKKwkJCQkvKiB1c2UgdGhlIGZEIGRpY3Rpb25hcnkgYnkgZGVmYXVsdCAqLworCQkJCWQgPSBmZF9nX2NvbmZpZy0+Y25mX2RpY3Q7CisJCQl9IGVsc2UgeworCQkJCXJldCA9IGZkX2RpY3RfZ2V0ZGljdCAoIG1vLCAmZCApOworCQkJCWlmIChyZXQgIT0gMCkgeworCQkJCQlESV9FUlJPUihyZXQsIE5VTEwsICJFcnJvciByZXRyaWV2aW5nIHF1ZXJ5J3MgZGljdGlvbmFyeS4iKTsKKwkJCQkJcmV0dXJuIE5VTEw7CisJCQkJfQorCQkJfQorCQl9CisJCXJldCA9IGZkX21zZ19uZXdfYW5zd2VyX2Zyb21fcmVxKGQsICZtLCBmbGFncyk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJRElfRVJST1IocmV0LCBOVUxMLCAiQ2Fubm90IGd1ZXNzIHRoZSBkaWN0aW9uYXJ5IHRvIHVzZSwgcGxlYXNlIHByb3ZpZGUgaXQgYXMgcGFyYW1ldGVyLiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJCisJCXJldHVybiBtOworCX0KKwkvKiBSZXR1cm4gdGhlIGZpcnN0IGNoaWxkIEFWUCBpZiBhbnkgKi8KKwlzdHJ1Y3QgYXZwICogZmlyc3RfY2hpbGQoKSB7CisJCXN0cnVjdCBhdnAgKiBhID0gTlVMTDsKKwkJaW50IHJldCA9IGZkX21zZ19icm93c2UoJHNlbGYsIE1TR19CUldfRklSU1RfQ0hJTEQsICZhLCBOVUxMKTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlESV9FUlJPUihyZXQsIE5VTEwsIE5VTEwpOworCQl9CisJCXJldHVybiBhOworCX0KKwkKKwkvKiBFbnVtZXJhYmxlIGxpc3Qgb2YgY2hpbGRyZW4gQVZQICovCisJJW5ld29iamVjdCBjaGlsZHJlbjsKKwlQeU9iamVjdCAqIGNoaWxkcmVuKCkgeworCQlzdHJ1Y3QgYXZwICogYSA9IE5VTEw7CisJCVB5T2JqZWN0ICogcmw7CisJCWludCByZXQgPSBmZF9tc2dfYnJvd3NlKCRzZWxmLCBNU0dfQlJXX0ZJUlNUX0NISUxELCAmYSwgTlVMTCk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJRElfRVJST1IocmV0LCBOVUxMLCBOVUxMKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCVNXSUdfUFlUSE9OX1RIUkVBRF9CRUdJTl9CTE9DSzsKKwkJcmwgPSBQeUxpc3RfTmV3KDApOworCQl3aGlsZSAoYSkgeworCQkJUHlMaXN0X0FwcGVuZChybCwgU1dJR19OZXdQb2ludGVyT2JqKCh2b2lkICopYSwgU1dJR1RZUEVfcF9hdnAsIDAgLyogZG8gbm90IG93biB0aGUgQVZQcyAqLyApKTsKKwkJCXJldCA9IGZkX21zZ19icm93c2UoYSwgTVNHX0JSV19ORVhULCAmYSwgTlVMTCk7CisJCQlpZiAocmV0ICE9IDApIHsKKwkJCQlESV9FUlJPUihyZXQsIE5VTEwsIE5VTEwpOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQl9CisJCVB5X1hJTkNSRUYocmwpOworCQlTV0lHX1BZVEhPTl9USFJFQURfRU5EX0JMT0NLOworCQlyZXR1cm4gcmw7CisJfQorCQorCS8qIEFkZCBhIG5ldyBBVlAgKi8KKwl2b2lkIGFkZF9jaGlsZChzdHJ1Y3QgYXZwICpESVNPV04sIGludCBiZWdpbiA9IDApIHsKKwkJaW50IHJldCA9IGZkX21zZ19hdnBfYWRkICggJHNlbGYsIGJlZ2luID8gTVNHX0JSV19GSVJTVF9DSElMRCA6IE1TR19CUldfTEFTVF9DSElMRCwgRElTT1dOKTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlESV9FUlJPUihyZXQsIE5VTEwsIE5VTEwpOworCQl9CisJfQorCQorCS8qIFNlYXJjaCBhbiBBVlAgKi8KKwlzdHJ1Y3QgYXZwICogc2VhcmNoKHN0cnVjdCBkaWN0X29iamVjdCAqIHdoYXQpIHsKKwkJc3RydWN0IGF2cCAqIGEgPSBOVUxMOworCQlpbnQgcmV0ID0gZmRfbXNnX3NlYXJjaF9hdnAoJHNlbGYsIHdoYXQsICZhKTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlESV9FUlJPUihyZXQsIE5VTEwsIE5VTEwpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJcmV0dXJuIGE7CisJfQorCQorCS8qIER1bXAgKi8KKwl2b2lkIGR1bXAgKGludCB0cmVlID0gMSkgeworCQljaGFyICogYnVmID0gTlVMTDsKKwkJc2l6ZV90IGxlbjsKKwkJcHJpbnRmKCIlcyIsIGZkX21zZ19kdW1wX3RyZWV2aWV3KCZidWYsICZsZW4sIE5VTEwsICRzZWxmLCBOVUxMLCAwLCB0cmVlKSk7CisJCWZyZWUoYnVmKTsKKwl9CisJCisJLyogTW9kZWwgKi8KKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBtb2RlbCgpIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogbSA9IE5VTEw7CisJCWludCByZXQgPSBmZF9tc2dfbW9kZWwoJHNlbGYsICZtKTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlESV9FUlJPUihyZXQsIE5VTEwsIE5VTEwpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJcmV0dXJuIG07CisJfQorCQorCS8qIEhlYWRlciAqLworCXN0cnVjdCBtc2dfaGRyICogaGVhZGVyKCkgeworCQlzdHJ1Y3QgbXNnX2hkciAqIGggPSBOVUxMOworCQlpbnQgcmV0ID0gZmRfbXNnX2hkcigkc2VsZiwgJmgpOworCQlpZiAocmV0ICE9IDApIHsKKwkJCURJX0VSUk9SKHJldCwgTlVMTCwgTlVMTCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlyZXR1cm4gaDsKKwl9CisJCisJLyogR2V0IHF1ZXJ5IGlmIG1lc3NhZ2UgaXMgYW4gYW5zd2VyICovCisJc3RydWN0IG1zZyAqIGdldF9xdWVyeSgpIHsKKwkJc3RydWN0IG1zZyAqIHEgPSBOVUxMOworCQlpbnQgcmV0ID0gZmRfbXNnX2Fuc3dfZ2V0cSgkc2VsZiwgJnEpOworCQlpZiAocmV0ICE9IDApIHsKKwkJCURJX0VSUk9SKHJldCwgTlVMTCwgTlVMTCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlyZXR1cm4gcTsKKwl9CisJCisJLyogR2V0IC8gU2V0IHJvdXRpbmcgZGF0YSAqLworCXN0cnVjdCBydF9kYXRhICogZ2V0X3J0ZCgpIHsKKwkJc3RydWN0IHJ0X2RhdGEgKiByID0gTlVMTDsKKwkJaW50IHJldCA9IGZkX21zZ19ydF9nZXQoJHNlbGYsICZyKTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlESV9FUlJPUihyZXQsIE5VTEwsIE5VTEwpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJcmV0dXJuIHI7CisJfQorCXZvaWQgc2V0X3J0ZChzdHJ1Y3QgcnRfZGF0YSAqRElTT1dOKSB7CisJCXN0cnVjdCBydF9kYXRhICogciA9IERJU09XTjsKKwkJaW50IHJldCA9IGZkX21zZ19ydF9hc3NvY2lhdGUoJHNlbGYsIHIpOworCQlpZiAocmV0ICE9IDApIHsKKwkJCURJX0VSUk9SKHJldCwgTlVMTCwgTlVMTCk7CisJCX0KKwkJcmV0dXJuOworCX0KKwkKKwkvKiBJcyByb3V0YWJsZT8gKi8KKwlQeU9iamVjdCAqIGlzX3JvdXRhYmxlKCkgeworCQlQeU9iamVjdCAqIHI7CisJCWlmIChmZF9tc2dfaXNfcm91dGFibGUoJHNlbGYpKQorCQkJciA9IFB5X1RydWU7CisJCWVsc2UKKwkJCXIgPSBQeV9GYWxzZTsKKwkJUHlfWElOQ1JFRihyKTsKKwkJcmV0dXJuIHI7CisJfQorCQorCS8qIElzIHJlcXVlc3Q/IChzaG9ydGN1dCkgKi8KKwlQeU9iamVjdCAqIGlzX3JlcXVlc3QoKSB7CisJCVB5T2JqZWN0ICogcjsKKwkJaW50IHJldDsKKwkJc3RydWN0IG1zZ19oZHIgKiBoOworCQkKKwkJcmV0ID0gZmRfbXNnX2hkcigkc2VsZiwgJmgpOworCQlpZiAocmV0ICE9IDApIHsKKwkJCURJX0VSUk9SKHJldCwgTlVMTCwgTlVMTCk7CisJCX0KKwkJaWYgKGgtPm1zZ19mbGFncyAmIENNRF9GTEFHX1JFUVVFU1QpIAorCQkJciA9IFB5X1RydWU7CisJCWVsc2UKKwkJCXIgPSBQeV9GYWxzZTsKKwkJUHlfWElOQ1JFRihyKTsKKwkJcmV0dXJuIHI7CisJfQorCQorCS8qIEdldCB0aGUgc291cmNlICovCisJJWNzdHJpbmdfb3V0cHV0X2FsbG9jYXRlX3NpemUoY2hhciAqKiBvdXRpZCwgc2l6ZV90ICogb3V0bGVuLCAvKiBkbyBub3QgZnJlZSAqLyk7CisJdm9pZCBzb3VyY2UoY2hhciAqKiBvdXRpZCwgc2l6ZV90ICogb3V0bGVuKSB7CisJCWludCByZXQgPSBmZF9tc2dfc291cmNlX2dldCgkc2VsZiwgb3V0aWQsIG91dGxlbik7CisJCWlmIChyZXQgIT0gMCkgeworCQkJRElfRVJST1IocmV0LCBOVUxMLCBOVUxMKTsKKwkJCXJldHVybjsKKwkJfQorCQlyZXR1cm47CisJfQorCQorCS8qIEdldCB0aGUgc2Vzc2lvbiAqLworCSVuZXdvYmplY3QgZ2V0X3Nlc3Npb247IC8qIGl0IG1heSBiZSBjcmVhdGVkIG9yIG5vdCwgaXQgaXMgaGFybWxlc3MgYmVjYXVzZSB3ZSBvbmx5IHJlY2xhaW0gaW4gfnNlc3Npb24gKi8KKwlzdHJ1Y3Qgc2Vzc2lvbiAqZ2V0X3Nlc3Npb24oc3RydWN0IGRpY3Rpb25hcnkgKiBkaWN0ID0gTlVMTCkgeworCQlzdHJ1Y3Qgc2Vzc2lvbiAqcyA9IE5VTEw7CisJCXN0cnVjdCBkaWN0aW9uYXJ5ICogZCA9IGRpY3Q7CisJCWludCByZXQgPSAwOworCQlpZiAoZCA9PSBOVUxMKQorCQkJZCA9IGZkX2dfY29uZmlnLT5jbmZfZGljdDsgLyogZGVmYXVsdDogdXNlIGRhZW1vbidzICovCisJCXJldCA9IGZkX21zZ19zZXNzX2dldChkLCAkc2VsZiwgJnMsIE5VTEwpOworCQlpZiAocmV0ICE9IDApIHsKKwkJCURJX0VSUk9SKHJldCwgTlVMTCwgTlVMTCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlyZXR1cm4gczsKKwl9CisJCisJLyogQnVmZmVyaXplICovCisJJWNzdHJpbmdfb3V0cHV0X2FsbG9jYXRlX3NpemUoY2hhciAqKiBvdXRidWZmZXIsIHNpemVfdCAqIG91dGxlbiwgZnJlZSgqJDEpKTsKKwl2b2lkIGJ1ZmZlcml6ZSAoIGNoYXIgKiogb3V0YnVmZmVyLCBzaXplX3QgKiBvdXRsZW4gKSB7CisJCWludCByZXQgPSBmZF9tc2dfYnVmZmVyaXplICggJHNlbGYsICh2b2lkICopb3V0YnVmZmVyLCBvdXRsZW4gKTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlESV9FUlJPUihyZXQsIE5VTEwsIE5VTEwpOworCQl9CisJfQorCQorCS8qIERpY3Rpb25hcnkgcGFyc2luZyAqLworCSVuZXdvYmplY3QgcGFyc2VfZGljdDsKKwlzdHJ1Y3QgZmRfcGVpICogcGFyc2VfZGljdChzdHJ1Y3QgZGljdGlvbmFyeSAqIGRpY3Q9TlVMTCkgeworCQlpbnQgcmV0OworCQlzdHJ1Y3QgZmRfcGVpIHBlaSwgKmUgPSBOVUxMOworCQlzdHJ1Y3QgZGljdGlvbmFyeSAqIGQgPSBkaWN0OworCQltZW1zZXQoJnBlaSwgMCwgc2l6ZW9mKHN0cnVjdCBmZF9wZWkpKTsKKwkJaWYgKGQgPT0gTlVMTCkKKwkJCWQgPSBmZF9nX2NvbmZpZy0+Y25mX2RpY3Q7IC8qIGRlZmF1bHQ6IHVzZSBkYWVtb24ncyAqLworCQkKKwkJcmV0ID0gZmRfbXNnX3BhcnNlX2RpY3QgKCAkc2VsZiwgZCwgJnBlaSApOworCQlpZiAocmV0ICE9IDApIHsKKwkJCWUgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBmZF9wZWkpKTsKKwkJCWlmICghZSkgeworCQkJCURJX0VSUk9SX01BTExPQzsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJCW1lbWNweShlLCAmcGVpLCBzaXplb2Yoc3RydWN0IGZkX3BlaSkpOworCQl9CisJCXJldHVybiBlOyAvKiByZXR1cm5zIE5VTEwgd2hlbiBldmVyeXRoaW5nIHdlbnQgT0sgKi8KKwl9CisJCisJLyogUnVsZXMgcGFyc2luZyAqLworCSVuZXdvYmplY3QgcGFyc2VfcnVsZXM7CisJc3RydWN0IGZkX3BlaSAqIHBhcnNlX3J1bGVzKHN0cnVjdCBkaWN0aW9uYXJ5ICogZGljdD1OVUxMKSB7CisJCWludCByZXQ7CisJCXN0cnVjdCBmZF9wZWkgcGVpLCAqZSA9IE5VTEw7CisJCXN0cnVjdCBkaWN0aW9uYXJ5ICogZCA9IGRpY3Q7CisJCW1lbXNldCgmcGVpLCAwLCBzaXplb2Yoc3RydWN0IGZkX3BlaSkpOworCQlpZiAoZCA9PSBOVUxMKQorCQkJZCA9IGZkX2dfY29uZmlnLT5jbmZfZGljdDsgLyogZGVmYXVsdDogdXNlIGRhZW1vbidzICovCisJCQorCQlyZXQgPSBmZF9tc2dfcGFyc2VfcnVsZXMgKCAkc2VsZiwgZCwgJnBlaSApOworCQlpZiAocmV0ICE9IDApIHsKKwkJCWUgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBmZF9wZWkpKTsKKwkJCWlmICghZSkgeworCQkJCURJX0VSUk9SX01BTExPQzsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJCW1lbWNweShlLCAmcGVpLCBzaXplb2Yoc3RydWN0IGZkX3BlaSkpOworCQl9CisJCXJldHVybiBlOyAvKiByZXR1cm5zIE5VTEwgd2hlbiBldmVyeXRoaW5nIHdlbnQgT0sgKi8KKwl9CisJCisJLyogVXBkYXRlIHRoZSBsZW5ndGggaW5mbyBpbiBoZWFkZXIgKi8KKwl2b2lkIHVwZGF0ZV9sZW5ndGgoKSB7CisJCWludCByZXQgPSBmZF9tc2dfdXBkYXRlX2xlbmd0aCAoICRzZWxmICk7CisJCWlmIChyZXQpIHsKKwkJCURJX0VSUk9SKHJldCwgTlVMTCwgTlVMTCk7CisJCX0KKwl9CisJCisJLyogU2V0IHRoZSByZXN1bHQgY29kZSAqLworCXZvaWQgcmVzY29kZV9zZXQoY2hhciAqIHJlc2NvZGUgPSAiRElBTUVURVJfU1VDQ0VTUyIsIGNoYXIgKiBlcnJvcm1zZyA9IE5VTEwsIHN0cnVjdCBhdnAgKiBvcHRhdnAgPSBOVUxMLCBpbnQgdHlwZV9pZCA9IDApIHsKKwkJaW50IHJldCA9IGZkX21zZ19yZXNjb2RlX3NldCggJHNlbGYsIHJlc2NvZGUsIGVycm9ybXNnLCBvcHRhdnAsIHR5cGVfaWQgKTsKKwkJaWYgKHJldCkgeworCQkJRElfRVJST1IocmV0LCBOVUxMLCBOVUxMKTsKKwkJfQorCX0KKwkKKwkvKiBBZGQgdGhlIG9yaWdpbiAqLworCXZvaWQgYWRkX29yaWdpbihpbnQgb3NpID0gMCkgeworCQlpbnQgcmV0ID0gZmRfbXNnX2FkZF9vcmlnaW4oICRzZWxmLCBvc2kgKTsKKwkJaWYgKHJldCkgeworCQkJRElfRVJST1IocmV0LCBOVUxMLCBOVUxMKTsKKwkJfQorCX0KKwkKK30KKworc3RydWN0IGF2cCB7Cit9OworCislZXh0ZW5kIGF2cCB7CisJYXZwKHN0cnVjdCBkaWN0X29iamVjdCAqIG1vZGVsID0gTlVMTCwgaW50IGZsYWdzID0gMCkgeworCQlzdHJ1Y3QgYXZwICogYSA9IE5VTEw7CisJCWludCByZXQgPSBmZF9tc2dfYXZwX25ldyggbW9kZWwsIGZsYWdzLCAmYSk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJRElfRVJST1IocmV0LCBOVUxMLCBOVUxMKTsKKwkJfQorCQlyZXR1cm4gYTsKKwl9CisJfmF2cCgpIHsKKwkJaW50IHJldCA9IGZkX21zZ19mcmVlKCRzZWxmKTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlESV9FUlJPUihyZXQsIE5VTEwsIE5VTEwpOworCQl9CisJfQorCQorCS8qIFJldHVybiB0aGUgZmlyc3QgY2hpbGQgQVZQIGlmIGFueSAqLworCXN0cnVjdCBhdnAgKiBmaXJzdF9jaGlsZCgpIHsKKwkJc3RydWN0IGF2cCAqIGEgPSBOVUxMOworCQlpbnQgcmV0ID0gZmRfbXNnX2Jyb3dzZSgkc2VsZiwgTVNHX0JSV19GSVJTVF9DSElMRCwgJmEsIE5VTEwpOworCQlpZiAocmV0ICE9IDApIHsKKwkJCURJX0VSUk9SKHJldCwgTlVMTCwgTlVMTCk7CisJCX0KKwkJcmV0dXJuIGE7CisJfQorCQorCS8qIEVudW1lcmFibGUgbGlzdCBvZiBjaGlsZHJlbiBBVlAgKi8KKwklbmV3b2JqZWN0IGNoaWxkcmVuOworCVB5T2JqZWN0ICogY2hpbGRyZW4oKSB7CisJCXN0cnVjdCBhdnAgKiBhID0gTlVMTDsKKwkJUHlPYmplY3QgKiBybDsKKwkJaW50IHJldCA9IGZkX21zZ19icm93c2UoJHNlbGYsIE1TR19CUldfRklSU1RfQ0hJTEQsICZhLCBOVUxMKTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlESV9FUlJPUihyZXQsIE5VTEwsIE5VTEwpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJU1dJR19QWVRIT05fVEhSRUFEX0JFR0lOX0JMT0NLOworCQlybCA9IFB5TGlzdF9OZXcoMCk7CisJCXdoaWxlIChhKSB7CisJCQlQeUxpc3RfQXBwZW5kKHJsLCBTV0lHX05ld1BvaW50ZXJPYmooKHZvaWQgKilhLCBTV0lHVFlQRV9wX2F2cCwgMCAvKiB0aGUgQVZQcyBhcmUgbm90IG93bmVkICovICkpOworCQkJcmV0ID0gZmRfbXNnX2Jyb3dzZShhLCBNU0dfQlJXX05FWFQsICZhLCBOVUxMKTsKKwkJCWlmIChyZXQgIT0gMCkgeworCQkJCURJX0VSUk9SKHJldCwgTlVMTCwgTlVMTCk7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCX0KKwkJUHlfWElOQ1JFRihybCk7CisJCVNXSUdfUFlUSE9OX1RIUkVBRF9FTkRfQkxPQ0s7CisJCXJldHVybiBybDsKKwl9CisJCisJLyogQWRkIGEgbmV3IEFWUCAqLworCXZvaWQgYWRkX25leHQoc3RydWN0IGF2cCAqYXZwKSB7CisJCWludCByZXQgPSBmZF9tc2dfYXZwX2FkZCAoICRzZWxmLCBNU0dfQlJXX05FWFQsIGF2cCk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJRElfRVJST1IocmV0LCBOVUxMLCBOVUxMKTsKKwkJfQorCX0KKwl2b2lkIGFkZF9wcmV2KHN0cnVjdCBhdnAgKmF2cCkgeworCQlpbnQgcmV0ID0gZmRfbXNnX2F2cF9hZGQgKCAkc2VsZiwgTVNHX0JSV19QUkVWLCBhdnApOworCQlpZiAocmV0ICE9IDApIHsKKwkJCURJX0VSUk9SKHJldCwgTlVMTCwgTlVMTCk7CisJCX0KKwl9CisJdm9pZCBhZGRfY2hpbGQoc3RydWN0IGF2cCAqRElTT1dOLCBpbnQgYmVnaW4gPSAwKSB7CisJCWludCByZXQgPSBmZF9tc2dfYXZwX2FkZCAoICRzZWxmLCBiZWdpbiA/IE1TR19CUldfRklSU1RfQ0hJTEQgOiBNU0dfQlJXX0xBU1RfQ0hJTEQsIERJU09XTik7CisJCWlmIChyZXQgIT0gMCkgeworCQkJRElfRVJST1IocmV0LCBOVUxMLCBOVUxMKTsKKwkJfQorCX0KKwkKKwkvKiBHZXQgdGhlIG5leHQgQVZQIGF0IHRoZSBzYW1lIGxldmVsICovCisJc3RydWN0IGF2cCAqIGdldF9uZXh0KCkgeworCQlzdHJ1Y3QgYXZwICogYSA9IE5VTEw7CisJCWludCByZXQgPSBmZF9tc2dfYnJvd3NlKCRzZWxmLCBNU0dfQlJXX05FWFQsICZhLCBOVUxMKTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlESV9FUlJPUihyZXQsIE5VTEwsIE5VTEwpOworCQl9CisJCXJldHVybiBhOworCX0KKwkKKwkvKiBEdW1wICovCisJdm9pZCBkdW1wIChpbnQgdHJlZSA9IDEpIHsKKwkJY2hhciAqIGJ1ZiA9IE5VTEw7CisJCXNpemVfdCBsZW47CisJCXByaW50ZigiJXMiLCBmZF9tc2dfZHVtcF90cmVldmlldygmYnVmLCAmbGVuLCBOVUxMLCAkc2VsZiwgTlVMTCwgMCwgdHJlZSkpOworCQlmcmVlKGJ1Zik7CisJfQorCQorCS8qIE1vZGVsICovCisJc3RydWN0IGRpY3Rfb2JqZWN0ICogbW9kZWwoKSB7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIG0gPSBOVUxMOworCQlpbnQgcmV0ID0gZmRfbXNnX21vZGVsKCRzZWxmLCAmbSk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJRElfRVJST1IocmV0LCBOVUxMLCBOVUxMKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXJldHVybiBtOworCX0KKwkKKwkvKiBIZWFkZXIgKi8KKwlzdHJ1Y3QgYXZwX2hkciAqIGhlYWRlcigpIHsKKwkJc3RydWN0IGF2cF9oZHIgKiBoID0gTlVMTDsKKwkJaW50IHJldCA9IGZkX21zZ19hdnBfaGRyKCRzZWxmLCAmaCk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJRElfRVJST1IocmV0LCBOVUxMLCBOVUxMKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXJldHVybiBoOworCX0KKwkKKwkvKiBzZXQgdmFsdWUgKi8KKwl2b2lkIHNldHZhbCh1bmlvbiBhdnBfdmFsdWUgKiB2YWwpIHsKKwkJaW50IHJldCA9IGZkX21zZ19hdnBfc2V0dmFsdWUgKCAkc2VsZiwgdmFsICk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJRElfRVJST1IocmV0LCBOVUxMLCBOVUxMKTsKKwkJfQorCX0KKwkKKwkvKiBVcGRhdGUgdGhlIGxlbmd0aCBpbmZvIGluIGhlYWRlciAqLworCXZvaWQgdXBkYXRlX2xlbmd0aCgpIHsKKwkJaW50IHJldCA9IGZkX21zZ191cGRhdGVfbGVuZ3RoICggJHNlbGYgKTsKKwkJaWYgKHJldCkgeworCQkJRElfRVJST1IocmV0LCBOVUxMLCBOVUxMKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGJnX2ludGVyYWN0aXZlL3BlZXJzLmkgYi9leHRlbnNpb25zL2RiZ19pbnRlcmFjdGl2ZS9wZWVycy5pCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNTZjZjcKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RiZ19pbnRlcmFjdGl2ZS9wZWVycy5pCkBAIC0wLDAgKzEsMjI3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxMywgV0lERSBQcm9qZWN0IGFuZCBOSUNUCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBXSURFIFByb2plY3Qgb3IgTklDVCBub3IgdGhlIAkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFdJREUgUHJvamVjdCBhbmQgCQkJCQkJICoKKyogICBOSUNULgkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIERvIG5vdCBpbmNsdWRlIHRoaXMgZGlyZWN0bHksIHVzZSBkYmdfaW50ZXJhY3RpdmUuaSBpbnN0ZWFkICovCisKKy8qKioqKiogUEVFUlMgKioqKioqKioqLworCisleworc3RhdGljIHZvaWQgZmRfYWRkX2NiKHN0cnVjdCBwZWVyX2luZm8gKnBlZXIsIHZvaWQgKmRhdGEpIHsKKwkvKiBDYWxsYmFjayBjYWxsZWQgd2hlbiB0aGUgcGVlciBjb25uZWN0aW9uIGNvbXBsZXRlcyAob3IgZmFpbHMpICovCisJUHlPYmplY3QgKlB5UGVlciwgKlB5RnVuYzsKKwlQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKKwkKKwlpZiAoIWRhdGEpIHsKKwkJVFJBQ0VfREVCVUcoSU5GTywgIkludGVybmFsIGVycm9yOiBtaXNzaW5nIGNhbGxiYWNrIik7CisJCXJldHVybjsKKwl9CisJUHlGdW5jID0gZGF0YTsKKwkKKwlTV0lHX1BZVEhPTl9USFJFQURfQkVHSU5fQkxPQ0s7CisJCisJLyogQ29udmVydCB0aGUgYXJndW1lbnQgKi8KKwlQeVBlZXIgID0gU1dJR19OZXdQb2ludGVyT2JqKCh2b2lkICopcGVlciwgICAgIFNXSUdUWVBFX3BfcGVlcl9pbmZvLCAgICAgMCApOworCQorCS8qIENhbGwgdGhlIGZ1bmN0aW9uICovCisJcmVzdWx0ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKFB5RnVuYywgIihPKSIsIFB5UGVlcik7CisJCisJUHlfWERFQ1JFRihyZXN1bHQpOworCVB5X1hERUNSRUYoUHlGdW5jKTsKKwkKKwlTV0lHX1BZVEhPTl9USFJFQURfRU5EX0JMT0NLOworCXJldHVybjsKK30KKyV9CisKKyVleHRlbmQgcGVlcl9pbmZvIHsKKwlwZWVyX2luZm8gKCkgeworCQlzdHJ1Y3QgcGVlcl9pbmZvICpucCA9IChzdHJ1Y3QgcGVlcl9pbmZvICopY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcGVlcl9pbmZvKSk7CisJCWlmICghbnApIHsKKwkJCURJX0VSUk9SX01BTExPQzsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCQorCQlmZF9saXN0X2luaXQoJm5wLT5waV9lbmRwb2ludHMsIE5VTEwpOworCQkKKwkJcmV0dXJuIG5wOworCX0KKworCS8qIFdyYXBwZXIgYXJvdW5kIGZkX3BlZXJfYWRkIHRvIGFsbG93IGNhbGxpbmcgdGhlIHB5dGhvbiBjYWxsYmFjayAqLworCSVkZWxvYmplY3QgYWRkOworCXZvaWQgYWRkKFB5T2JqZWN0ICogUHlDYj1OVUxMKSB7CisJCWludCByZXQ7CisJCQorCQlpZiAoUHlDYikgeworCQkJUHlfWElOQ1JFRihQeUNiKTsKKwkJCXJldCA9IGZkX3BlZXJfYWRkICggJHNlbGYsICJkYmdfaW50ZXJhY3RpdmUiLCBmZF9hZGRfY2IsIFB5Q2IgKTsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IGZkX3BlZXJfYWRkICggJHNlbGYsICJkYmdfaW50ZXJhY3RpdmUiLCBOVUxMLCBOVUxMICk7CisJCX0KKwkJaWYgKHJldCAhPSAwKSB7CisJCQlESV9FUlJPUihyZXQsIE5VTEwsIE5VTEwpOworCQl9CisJfQorfQorCislaW5saW5lICV7CitzdGF0aWMgc3RydWN0IHBlZXJfaGRyICogcGVlcl9zZWFyY2goY2hhciAqU1RSSU5HLCBzaXplX3QgTEVOR1RIKSB7CisJc3RydWN0IHBlZXJfaGRyICpyID0gTlVMTDsKKwlpbnQgcmV0ID0gZmRfcGVlcl9nZXRieWlkKCBTVFJJTkcsIExFTkdUSCwgMCwgJnIgKTsKKwlpZiAocmV0KSB7CisJCURJX0VSUk9SKHJldCwgTlVMTCwgTlVMTCk7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gcjsKK30KKyV9CisKKyV7CitzdGF0aWMgUHlPYmplY3QgKiB2YWxpZGF0ZV9jYl9weSA9IE5VTEw7CitzdGF0aWMgUHlPYmplY3QgKiB2YWxpZGF0ZV9jYjJfcHkgPSBOVUxMOworCisvKiBDIHdyYXBwZXIgdGhhdCBjYWxscyB2YWxpZGF0ZV9jYjJfcHkgKi8KK2ludCBjYWxsX3RoZV9weXRob25fdmFsaWRhdGVfY2FsbGJhY2syKHN0cnVjdCBwZWVyX2luZm8gKiBpbmZvKSB7CisJUHlPYmplY3QgKlB5SW5mbzsKKwlQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKKwlpbnQgcmV0ID0gMDsKKwkKKwlpZiAoIXZhbGlkYXRlX2NiMl9weSkgeworCQlmZF9sb2dfZGVidWcoIkludGVybmFsIGVycm9yOiBtaXNzaW5nIHRoZSBjYWxsYmFjazIhIik7CisJCXJldHVybiBFTk9UU1VQOworCX0KKwkKKwlTV0lHX1BZVEhPTl9USFJFQURfQkVHSU5fQkxPQ0s7CisJLyogQ29udmVydCB0aGUgYXJndW1lbnRzICovCisJUHlJbmZvICA9IFNXSUdfTmV3UG9pbnRlck9iaigodm9pZCAqKWluZm8sICAgICBTV0lHVFlQRV9wX3BlZXJfaW5mbywgICAgIDAgKTsKKwkKKwkvKiBDYWxsIHRoZSBmdW5jdGlvbiAqLworCXJlc3VsdCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbih2YWxpZGF0ZV9jYjJfcHksICIoTykiLCBQeUluZm8pOworCQorCS8qIFRoZSByZXN1bHQgaXMgYW4gaW50ZWdlciAqLworCWlmICgocmVzdWx0ID09IE5VTEwpIHx8ICFTV0lHX0lzT0soU1dJR19Bc1ZhbF9pbnQocmVzdWx0LCAmcmV0KSkpIHsKKwkJZmRfbG9nX2RlYnVnKCJFcnJvcjogVGhlIFB5dGhvbiBjYWxsYmFjayBkaWQgbm90IHJldHVybiBhbiBpbnRlZ2VyLiIpOworCQlyZXQgPSBFSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKwkKK291dDoJCisJUHlfWERFQ1JFRihyZXN1bHQpOworCVNXSUdfUFlUSE9OX1RIUkVBRF9FTkRfQkxPQ0s7CisJcmV0dXJuIHJldDsKK30KKworLyogQyB3cmFwcGVyIHRoYXQgY2FsbHMgdmFsaWRhdGVfY2JfcHkgKi8KK2ludCBjYWxsX3RoZV9weXRob25fdmFsaWRhdGVfY2FsbGJhY2soc3RydWN0IHBlZXJfaW5mbyAqIGluZm8sIGludCAqIGF1dGgsIGludCAoKipjYjIpKHN0cnVjdCBwZWVyX2luZm8gKikpIHsKKwlQeU9iamVjdCAqUHlJbmZvOworCVB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOworCWludCByZXQgPSAwOworCQorCWlmICghdmFsaWRhdGVfY2JfcHkpIHsKKwkJZmRfbG9nX2RlYnVnKCJJbnRlcm5hbCBlcnJvcjogbWlzc2luZyB0aGUgY2FsbGJhY2shIik7CisJCXJldHVybiBFTk9UU1VQOworCX0KKwkKKwlTV0lHX1BZVEhPTl9USFJFQURfQkVHSU5fQkxPQ0s7CisJLyogQ29udmVydCB0aGUgYXJndW1lbnRzICovCisJUHlJbmZvICA9IFNXSUdfTmV3UG9pbnRlck9iaigodm9pZCAqKWluZm8sICAgICBTV0lHVFlQRV9wX3BlZXJfaW5mbywgICAgIDAgKTsKKwkKKwkvKiBDYWxsIHRoZSBmdW5jdGlvbiAqLworCXJlc3VsdCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbih2YWxpZGF0ZV9jYl9weSwgIihPKSIsIFB5SW5mbyk7CisJCisJLyogVGhlIHJlc3VsdCBpcyBzdXBwb3NlZGx5IC0xLCAxLCBvciBhIGNiMiAqLworCWlmIChyZXN1bHQgPT0gTlVMTCkgeworCQlmZF9sb2dfZGVidWcoIkVycm9yOiBUaGUgUHl0aG9uIGNhbGxiYWNrIGRpZCBub3QgcmV0dXJuIGEgdmFsdWUuIik7CisJCXJldCA9IEVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCQorCWlmIChQeUNhbGxhYmxlX0NoZWNrKHJlc3VsdCkpIHsKKwkJaWYgKGNiMikgeworCQkJaWYgKHZhbGlkYXRlX2NiMl9weSAmJiAodmFsaWRhdGVfY2IyX3B5ICE9IHJlc3VsdCkpIHsKKwkJCQlmZF9sb2dfZGVidWcoIk9ubHkgMSByZWdpc3RlciBjYWxsYmFjazIgaXMgc3VwcG9ydGVkIGN1cnJlbnRseSIpOworCQkJCXJldCA9IEVOT1RTVVA7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQl2YWxpZGF0ZV9jYjJfcHkgPSByZXN1bHQ7CisJCQkqY2IyID0gY2FsbF90aGVfcHl0aG9uX3ZhbGlkYXRlX2NhbGxiYWNrMjsKKwkJCSphdXRoID0gMTsKKwkJCWdvdG8gb3V0X25vZGVjOworCQl9IGVsc2UgeworCQkJKmF1dGggPSAxOworCQkJZ290byBvdXQ7IC8qIGlnbm9yZSB0aGUgY2FsbGJhY2sgc2luY2UgaXQgd29uJ3QgYmUgdXNlZCAqLworCQl9CisJfSBlbHNlIHsgLyogSW4gdGhpcyBjYXNlLCB0aGUgcmV0dXJuIHZhbHVlIG11c3QgYmUgLTEsIDAsIG9yIDEgKi8KKwkJaWYgKCFTV0lHX0lzT0soU1dJR19Bc1ZhbF9pbnQocmVzdWx0LCBhdXRoKSkpIHsKKwkJCWZkX2xvZ19kZWJ1ZygiRXJyb3I6IENhbm5vdCBjb252ZXJ0IHRoZSByZXR1cm4gdmFsdWUgdG8gaW50ZWdlci4iKTsKKwkJCXJldCA9IEVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCQorb3V0OgkKKwlQeV9YREVDUkVGKHJlc3VsdCk7CitvdXRfbm9kZWM6CQorCVNXSUdfUFlUSE9OX1RIUkVBRF9FTkRfQkxPQ0s7CisJVFJBQ0VfREVCVUcoRlVMTCwgInJldD0lZCwgKmF1dGg9JWQsIGNiMj0lcCwgKmNiMj0lcCIsIHJldCwgKmF1dGgsIGNiMiwgY2IyID8gKmNiMiA6IE5VTEwpOworCXJldHVybiByZXQ7Cit9CisKKyV9CisKKyVpbmxpbmUgJXsKK3N0YXRpYyB2b2lkIHBlZXJfdmFsaWRhdGVfcmVnaXN0ZXIoUHlPYmplY3QgKiBQeUNiKSB7CisJaW50IHJldCA7CisJCisJaWYgKCFQeUNiKSB7CisJCURJX0VSUk9SKEVJTlZBTCwgTlVMTCwgIlRoZSBjYWxsYmFjayBtdXN0IGJlIHByb3ZpZGVkIik7CisJCXJldHVybjsKKwl9CisJCisJaWYgKHZhbGlkYXRlX2NiX3B5KSB7CisJCWlmIChQeUNiICE9IHZhbGlkYXRlX2NiX3B5KSB7CisJCQlESV9FUlJPUihFTk9UU1VQLCBQeUV4Y19SdW50aW1lRXJyb3IsICJPbmx5IDEgcmVnaXN0ZXIgY2FsbGJhY2sgaXMgc3VwcG9ydGVkIGN1cnJlbnRseSIpOworCQkJcmV0dXJuOworCQl9CisJfSBlbHNlIHsKKwkJdmFsaWRhdGVfY2JfcHkgPSBQeUNiOworCQlQeV9YSU5DUkVGKFB5Q2IpOworCX0KKwkKKwlyZXQgPSBmZF9wZWVyX3ZhbGlkYXRlX3JlZ2lzdGVyICggY2FsbF90aGVfcHl0aG9uX3ZhbGlkYXRlX2NhbGxiYWNrICk7CisJaWYgKHJldCkgeworCQlESV9FUlJPUihyZXQsIE5VTEwsIE5VTEwpOworCX0KK30KKyV9CmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RiZ19pbnRlcmFjdGl2ZS9wb3NpeC5pIGIvZXh0ZW5zaW9ucy9kYmdfaW50ZXJhY3RpdmUvcG9zaXguaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWFmZWI2Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kYmdfaW50ZXJhY3RpdmUvcG9zaXguaQpAQCAtMCwwICsxLDE5NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTIsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBEbyBub3QgaW5jbHVkZSB0aGlzIGRpcmVjdGx5LCB1c2UgZGJnX2ludGVyYWN0aXZlLmkgaW5zdGVhZCAqLworCisvKioqKioqIFBPU0lYIHdyYXBwZXJzIGFyb3VuZCB1c2VmdWwgZnVuY3Rpb25zIGZvciBmRCAqKioqKioqKiovCisKKy8qKioqIE1VVEVYICoqKiovCit0eXBlZGVmIHN0cnVjdCB7Cit9IHB0aHJlYWRfbXV0ZXhfdDsKKworJWV4dGVuZCBwdGhyZWFkX211dGV4X3QgeworCXB0aHJlYWRfbXV0ZXhfdCgpIHsKKwkJaW50IHJldCA9IDA7CisJCXB0aHJlYWRfbXV0ZXhfdCAqIHIgPSBjYWxsb2MoMSwgc2l6ZW9mKHB0aHJlYWRfbXV0ZXhfdCkpOworCQlpZiAoIXIpIHsKKwkJCURJX0VSUk9SX01BTExPQzsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXJldCA9IHB0aHJlYWRfbXV0ZXhfaW5pdChyLCBOVUxMKTsKKwkJaWYgKHJldCkgeworCQkJRElfRVJST1IocmV0LCBOVUxMLCBOVUxMKTsKKwkJCWZyZWUocik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlyZXR1cm4gcjsKKwl9CisJfnB0aHJlYWRfbXV0ZXhfdCgpIHsKKwkJaW50IHJldCA9IDA7CisJCXJldCA9IHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgkc2VsZik7CisJCWlmIChyZXQpIHsKKwkJCURJX0VSUk9SKHJldCwgTlVMTCwgTlVMTCk7CisJCQlyZXR1cm47CisJCX0KKwkJZnJlZSgkc2VsZik7CisJCXJldHVybjsKKwl9CisJdm9pZCBsb2NrKCkgeworCQlpbnQgcmV0ID0gcHRocmVhZF9tdXRleF9sb2NrKCRzZWxmKTsKKwkJaWYgKHJldCkgeworCQkJRElfRVJST1IocmV0LCBOVUxMLCBOVUxMKTsKKwkJfQorCX0KKwl2b2lkIHVubG9jaygpIHsKKwkJaW50IHJldCA9IHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCRzZWxmKTsKKwkJaWYgKHJldCkgeworCQkJRElfRVJST1IocmV0LCBOVUxMLCBOVUxMKTsKKwkJfQorCX0KK30KKworLyoqKiogQ09ORFZBUiAqKioqLwordHlwZWRlZiBzdHJ1Y3QgeworfSBwdGhyZWFkX2NvbmRfdDsKKworJWV4dGVuZCBwdGhyZWFkX2NvbmRfdCB7CisJcHRocmVhZF9jb25kX3QoKSB7CisJCWludCByZXQgPSAwOworCQlwdGhyZWFkX2NvbmRfdCAqIHIgPSBjYWxsb2MoMSwgc2l6ZW9mKHB0aHJlYWRfY29uZF90KSk7CisJCWlmICghcikgeworCQkJRElfRVJST1JfTUFMTE9DOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJcmV0ID0gcHRocmVhZF9jb25kX2luaXQociwgTlVMTCk7CisJCWlmIChyZXQpIHsKKwkJCURJX0VSUk9SKHJldCwgTlVMTCwgTlVMTCk7CisJCQlmcmVlKHIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJcmV0dXJuIHI7CisJfQorCX5wdGhyZWFkX2NvbmRfdCgpIHsKKwkJaW50IHJldCA9IDA7CisJCXJldCA9IHB0aHJlYWRfY29uZF9kZXN0cm95KCRzZWxmKTsKKwkJaWYgKHJldCkgeworCQkJRElfRVJST1IocmV0LCBOVUxMLCBOVUxMKTsKKwkJCXJldHVybjsKKwkJfQorCQlmcmVlKCRzZWxmKTsKKwkJcmV0dXJuOworCX0KKwl2b2lkIHNpZ25hbCgpIHsKKwkJaW50IHJldCA9IHB0aHJlYWRfY29uZF9zaWduYWwoJHNlbGYpOworCQlpZiAocmV0KSB7CisJCQlESV9FUlJPUihyZXQsIE5VTEwsIE5VTEwpOworCQl9CisJfQorCXZvaWQgYnJvYWRjYXN0KCkgeworCQlpbnQgcmV0ID0gcHRocmVhZF9jb25kX2Jyb2FkY2FzdCgkc2VsZik7CisJCWlmIChyZXQpIHsKKwkJCURJX0VSUk9SKHJldCwgTlVMTCwgTlVMTCk7CisJCX0KKwl9CisJdm9pZCB3YWl0KHB0aHJlYWRfbXV0ZXhfdCAqIG11dGV4KSB7CisJCWludCByZXQgPSBwdGhyZWFkX2NvbmRfd2FpdCgkc2VsZiwgbXV0ZXgpOworCQlpZiAocmV0KSB7CisJCQlESV9FUlJPUihyZXQsIE5VTEwsIE5VTEwpOworCQl9CisJfQorCXZvaWQgdGltZWR3YWl0KHB0aHJlYWRfbXV0ZXhfdCAqIG11dGV4LCBsb25nIHNlY29uZHMpIHsKKwkJc3RydWN0IHRpbWVzcGVjIHRzOworCQlpbnQgcmV0OworCQkKKwkJY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJnRzKTsKKwkJdHMudHZfc2VjICs9IHNlY29uZHM7CisJCQorCQlyZXQgPSBwdGhyZWFkX2NvbmRfdGltZWR3YWl0KCRzZWxmLCBtdXRleCwgJnRzKTsKKwkJaWYgKHJldCAmJiAocmV0ICE9IEVUSU1FRE9VVCkpIHsKKwkJCURJX0VSUk9SKHJldCwgTlVMTCwgTlVMTCk7CisJCX0KKwl9Cit9CisKKy8qKioqIFJXTE9DSyAqKioqLwordHlwZWRlZiBzdHJ1Y3QgeworfSBwdGhyZWFkX3J3bG9ja190OworCislZXh0ZW5kIHB0aHJlYWRfcndsb2NrX3QgeworCXB0aHJlYWRfcndsb2NrX3QoKSB7CisJCWludCByZXQgPSAwOworCQlwdGhyZWFkX3J3bG9ja190ICogciA9IGNhbGxvYygxLCBzaXplb2YocHRocmVhZF9yd2xvY2tfdCkpOworCQlpZiAoIXIpIHsKKwkJCURJX0VSUk9SX01BTExPQzsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXJldCA9IHB0aHJlYWRfcndsb2NrX2luaXQociwgTlVMTCk7CisJCWlmIChyZXQpIHsKKwkJCURJX0VSUk9SKHJldCwgTlVMTCwgTlVMTCk7CisJCQlmcmVlKHIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJcmV0dXJuIHI7CisJfQorCX5wdGhyZWFkX3J3bG9ja190KCkgeworCQlpbnQgcmV0ID0gMDsKKwkJcmV0ID0gcHRocmVhZF9yd2xvY2tfZGVzdHJveSgkc2VsZik7CisJCWlmIChyZXQpIHsKKwkJCURJX0VSUk9SKHJldCwgTlVMTCwgTlVMTCk7CisJCQlyZXR1cm47CisJCX0KKwkJZnJlZSgkc2VsZik7CisJCXJldHVybjsKKwl9CisJdm9pZCByZGxvY2soKSB7CisJCWludCByZXQgPSBwdGhyZWFkX3J3bG9ja19yZGxvY2soJHNlbGYpOworCQlpZiAocmV0KSB7CisJCQlESV9FUlJPUihyZXQsIE5VTEwsIE5VTEwpOworCQl9CisJfQorCXZvaWQgd3Jsb2NrKCkgeworCQlpbnQgcmV0ID0gcHRocmVhZF9yd2xvY2tfd3Jsb2NrKCRzZWxmKTsKKwkJaWYgKHJldCkgeworCQkJRElfRVJST1IocmV0LCBOVUxMLCBOVUxMKTsKKwkJfQorCX0KKwl2b2lkIHVubG9jaygpIHsKKwkJaW50IHJldCA9IHB0aHJlYWRfcndsb2NrX3VubG9jaygkc2VsZik7CisJCWlmIChyZXQpIHsKKwkJCURJX0VSUk9SKHJldCwgTlVMTCwgTlVMTCk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RiZ19pbnRlcmFjdGl2ZS9xdWV1ZXMuaSBiL2V4dGVuc2lvbnMvZGJnX2ludGVyYWN0aXZlL3F1ZXVlcy5pCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMTcyOGQKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RiZ19pbnRlcmFjdGl2ZS9xdWV1ZXMuaQpAQCAtMCwwICsxLDE5OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTMsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBEbyBub3QgaW5jbHVkZSB0aGlzIGRpcmVjdGx5LCB1c2UgZGJnX2ludGVyYWN0aXZlLmkgaW5zdGVhZCAqLworCisvKioqKioqIEZJRk8gUVVFVUVTICoqKioqKioqKi8KKworc3RydWN0IGZpZm8geworfTsKKworJWV4dGVuZCBmaWZvIHsKKwlmaWZvKGludCBtYXggPSAwKSB7CisJCXN0cnVjdCBmaWZvICogcSA9IE5VTEw7CisJCWludCByZXQgPSBmZF9maWZvX25ldygmcSwgbWF4KTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlESV9FUlJPUihyZXQsIE5VTEwsIE5VTEwpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJcmV0dXJuIHE7CisJfQorCX5maWZvKCkgeworCQlzdHJ1Y3QgZmlmbyAqcSA9IHNlbGY7CisJCWZkX2ZpZm9fZGVsKCZxKTsKKwl9CisJCisJLyogTW92ZSBhbGwgZWxlbWVudHMgdG8gYW5vdGhlciBxdWV1ZSAqLworCXZvaWQgbW92ZShzdHJ1Y3QgZmlmbyAqIHRvKSB7CisJCWludCByZXQgPSBmZF9maWZvX21vdmUoJHNlbGYsIHRvLCBOVUxMKTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlESV9FUlJPUihyZXQsIE5VTEwsIE5VTEwpOworCQl9CisJfQorCQorCS8qIEdldCB0aGUgbGVuZ3RoIG9mIHRoZSBxdWV1ZSAobmIgZWxlbWVudHMpICovCisJaW50IGxlbmd0aCgpIHsKKwkJcmV0dXJuIGZkX2ZpZm9fbGVuZ3RoICggJHNlbGYgKSA7CisJfQorCisJLyogSXMgdGhlIHRocmVhc2hvbGQgZnVuY3Rpb24gdXNlZnVsIGhlcmU/IFRPRE8uLi4gKi8KKwkKKwkvKiBQb3N0IGFuIGl0ZW0gKi8KKwl2b2lkIHBvc3QoUHlPYmplY3QgKiBpdGVtLCBjaGFyICogdHlwZSA9IE5VTEwpIHsKKwkJaW50IHJldDsKKwkJaWYgKHR5cGUpIHsKKwkJCXZvaWQgKiByZWFsX29iaiA9IE5VTEw7CisJCQlzd2lnX3R5cGVfaW5mbyAqIGRlc3R0eXBlID0gTlVMTDsKKwkJCWRlc3R0eXBlID0gU1dJR19UeXBlUXVlcnkodHlwZSk7CisJCQlpZiAoIWRlc3R0eXBlKSB7CisJCQkJRElfRVJST1IoRUlOVkFMLCBOVUxMLCAiVW5hYmxlIHRvIHJlc29sdmUgdGhpcyB0eXBlLiBQbGVhc2UgY2hlY2sgdGhlIGZvcm06ICdzdHJ1Y3QgYmxhaGJsYSAqJyIpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCS8qIE5vdywgZ2V0IHRoZSAicmVhbCIgdmFsdWUgdW5kZXIgdGhlIHNoYWRvdyB1bWJyZWxsYSAqLworCQkJcmV0ID0gU1dJR19Db252ZXJ0UHRyKGl0ZW0sICZyZWFsX29iaiwgZGVzdHR5cGUsIFNXSUdfUE9JTlRFUl9ESVNPV04gKTsKKwkJCWlmICghU1dJR19Jc09LKHJldCkpIHsKKwkJCQlESV9FUlJPUihFSU5WQUwsIFNXSUdfRXJyb3JUeXBlKHJldCksICJVbmFibGUgdG8gY29udmVydCB0aGUgaXRlbSB0byBnaXZlbiB0eXBlIik7CisJCQkJcmV0dXJuOworCQkJfQorCQkJcmV0ID0gZmRfZmlmb19wb3N0KCRzZWxmLCAmcmVhbF9vYmopOworCQl9IGVsc2UgeworCQkJUHlPYmplY3QgKiBpID0gaXRlbTsKKwkJCVB5X1hJTkNSRUYoaSk7CisJCQlyZXQgPSBmZF9maWZvX3Bvc3QoJHNlbGYsICZpKTsKKwkJfQorCQlpZiAocmV0ICE9IDApIHsKKwkJCURJX0VSUk9SKHJldCwgTlVMTCwgTlVMTCk7CisJCX0KKwl9CisJCisJLyogR2V0IChibG9ja2luZykgKi8KKwlQeU9iamVjdCAqIGdldChjaGFyICogdHlwZSA9IE5VTEwpIHsKKwkJaW50IHJldDsKKwkJUHlPYmplY3QgKiBpID0gTlVMTDsKKwkJdm9pZCAqIG9iaiA9IE5VTEw7CisJCXN3aWdfdHlwZV9pbmZvICogZGVzdHR5cGUgPSBOVUxMOworCQlpZiAodHlwZSkgeworCQkJZGVzdHR5cGUgPSBTV0lHX1R5cGVRdWVyeSh0eXBlKTsKKwkJCWlmICghZGVzdHR5cGUpIHsKKwkJCQlESV9FUlJPUihFSU5WQUwsIE5VTEwsICJVbmFibGUgdG8gcmVzb2x2ZSB0aGlzIHR5cGUuIFBsZWFzZSBjaGVjayB0aGUgZm9ybTogJ3N0cnVjdCBibGFoYmxhIConIik7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCX0KKwkJCisJCXJldCA9IGZkX2ZpZm9fZ2V0KCRzZWxmLCAmb2JqKTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlESV9FUlJPUihyZXQsIE5VTEwsIE5VTEwpOworCQl9CisJCQorCQlpZiAodHlwZSkgeworCQkJcmV0dXJuIFNXSUdfTmV3UG9pbnRlck9iaihvYmosIGRlc3R0eXBlLCAwICk7CisJCX0gZWxzZSB7CisJCQlpID0gb2JqOworCQkJcmV0dXJuIGk7CisJCX0KKwl9CisJCisJLyogVHJ5R2V0IChub24tYmxvY2tpbmcsIHJldHVybnMgTm9uZSBvbiBlbXB0eSBxdWV1ZSkgKi8KKwlQeU9iamVjdCAqIHRyeWdldChjaGFyICogdHlwZSA9IE5VTEwpIHsKKwkJaW50IHJldDsKKwkJUHlPYmplY3QgKiBpID0gTlVMTDsKKwkJdm9pZCAqIG9iaiA9IE5VTEw7CisJCXN3aWdfdHlwZV9pbmZvICogZGVzdHR5cGUgPSBOVUxMOworCQlpZiAodHlwZSkgeworCQkJZGVzdHR5cGUgPSBTV0lHX1R5cGVRdWVyeSh0eXBlKTsKKwkJCWlmICghZGVzdHR5cGUpIHsKKwkJCQlESV9FUlJPUihFSU5WQUwsIE5VTEwsICJVbmFibGUgdG8gcmVzb2x2ZSB0aGlzIHR5cGUuIFBsZWFzZSBjaGVjayB0aGUgZm9ybTogJ3N0cnVjdCBibGFoYmxhIConIik7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCX0KKwkJCisJCXJldCA9IGZkX2ZpZm9fdHJ5Z2V0KCRzZWxmLCAmb2JqKTsKKwkJaWYgKHJldCA9PSBFV09VTERCTE9DSykgeworCQkJUHlfSU5DUkVGKFB5X05vbmUpOworCQkJcmV0dXJuIFB5X05vbmU7CisJCX0KKwkJaWYgKHJldCAhPSAwKSB7CisJCQlESV9FUlJPUihyZXQsIE5VTEwsIE5VTEwpOworCQl9CisJCQorCQlpZiAodHlwZSkgeworCQkJcmV0dXJuIFNXSUdfTmV3UG9pbnRlck9iaihvYmosIGRlc3R0eXBlLCAwICk7CisJCX0gZWxzZSB7CisJCQlpID0gb2JqOworCQkJcmV0dXJuIGk7CisJCX0KKwl9CisJCisJLyogVGltZWRHZXQgKGJsb2NraW5nIGZvciBhIHdoaWxlKSAqLworCVB5T2JqZWN0ICogdGltZWRnZXQobG9uZyBzZWNvbmRzLCBjaGFyICogdHlwZSA9IE5VTEwpIHsKKwkJaW50IHJldDsKKwkJUHlPYmplY3QgKiBpID0gTlVMTDsKKwkJc3RydWN0IHRpbWVzcGVjIHRzOworCQl2b2lkICogb2JqID0gTlVMTDsKKwkJc3dpZ190eXBlX2luZm8gKiBkZXN0dHlwZSA9IE5VTEw7CisJCWlmICh0eXBlKSB7CisJCQlkZXN0dHlwZSA9IFNXSUdfVHlwZVF1ZXJ5KHR5cGUpOworCQkJaWYgKCFkZXN0dHlwZSkgeworCQkJCURJX0VSUk9SKEVJTlZBTCwgTlVMTCwgIlVuYWJsZSB0byByZXNvbHZlIHRoaXMgdHlwZS4gUGxlYXNlIGNoZWNrIHRoZSBmb3JtOiAnc3RydWN0IGJsYWhibGEgKiciKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJfQorCQkKKwkJY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJnRzKTsKKwkJdHMudHZfc2VjICs9IHNlY29uZHM7CisJCQorCQlyZXQgPSBmZF9maWZvX3RpbWVkZ2V0KCRzZWxmLCAmb2JqLCAmdHMpOworCQlpZiAocmV0ID09IEVUSU1FRE9VVCkgeworCQkJUHlfSU5DUkVGKFB5X05vbmUpOworCQkJcmV0dXJuIFB5X05vbmU7CisJCX0KKwkJaWYgKHJldCAhPSAwKSB7CisJCQlESV9FUlJPUihyZXQsIE5VTEwsIE5VTEwpOworCQl9CisJCQorCQlpZiAodHlwZSkgeworCQkJcmV0dXJuIFNXSUdfTmV3UG9pbnRlck9iaihvYmosIGRlc3R0eXBlLCAwICk7CisJCX0gZWxzZSB7CisJCQlpID0gb2JqOworCQkJcmV0dXJuIGk7CisJCX0KKwl9CisJCit9CQkKKwkKKwkKKwkKKwkKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGJnX2ludGVyYWN0aXZlL3JvdXRpbmcuaSBiL2V4dGVuc2lvbnMvZGJnX2ludGVyYWN0aXZlL3JvdXRpbmcuaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjQ2NzRmCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kYmdfaW50ZXJhY3RpdmUvcm91dGluZy5pCkBAIC0wLDAgKzEsMjUxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxMywgV0lERSBQcm9qZWN0IGFuZCBOSUNUCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBXSURFIFByb2plY3Qgb3IgTklDVCBub3IgdGhlIAkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFdJREUgUHJvamVjdCBhbmQgCQkJCQkJICoKKyogICBOSUNULgkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIERvIG5vdCBpbmNsdWRlIHRoaXMgZGlyZWN0bHksIHVzZSBkYmdfaW50ZXJhY3RpdmUuaSBpbnN0ZWFkICovCisKKy8qKioqKiogUk9VVElORyAqKioqKioqKiovCisKK3N0cnVjdCBydF9kYXRhIHsKK307CisKKyVleHRlbmQgcnRfZGF0YSB7CisJcnRfZGF0YSgpIHsKKwkJc3RydWN0IHJ0X2RhdGEgKiByID0gTlVMTDsKKwkJaW50IHJldCA9IGZkX3J0ZF9pbml0KCZyKTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlESV9FUlJPUihyZXQsIE5VTEwsIE5VTEwpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJcmV0dXJuIHI7CisJfQorCX5ydF9kYXRhKCkgeworCQlzdHJ1Y3QgcnRfZGF0YSAqciA9IHNlbGY7CisJCWZkX3J0ZF9mcmVlKCZyKTsKKwl9CisJJWFwcGx5IChjaGFyICpTVFJJTkcsIGludCBMRU5HVEgpIHsgKGNoYXIgKiBwZWVyaWQsIHNpemVfdCBwZWVyaWRsZW4pIH07CisJJWFwcGx5IChjaGFyICpTVFJJTkcsIGludCBMRU5HVEgpIHsgKGNoYXIgKiByZWFsbSwgc2l6ZV90IHJlYWxtbGVuKSB9OworCXZvaWQgYWRkKGNoYXIgKiBwZWVyaWQsIHNpemVfdCBwZWVyaWRsZW4sIGNoYXIgKiByZWFsbSwgc2l6ZV90IHJlYWxtbGVuKSB7CisJCWludCByZXQgPSBmZF9ydGRfY2FuZGlkYXRlX2FkZCgkc2VsZiwgcGVlcmlkLCBwZWVyaWRsZW4sIHJlYWxtLCByZWFsbWxlbik7CisJCWlmIChyZXQgIT0gMCkgeworCQkJRElfRVJST1IocmV0LCBOVUxMLCBOVUxMKTsKKwkJfQorCX0KKwl2b2lkIHJlbW92ZShjaGFyICogU1RSSU5HLCBzaXplX3QgTEVOR1RIKSB7CisJCWZkX3J0ZF9jYW5kaWRhdGVfZGVsKCRzZWxmLCAob3MwX3QpU1RSSU5HLCBMRU5HVEgpOworCX0KKwlpbnQgZXJyb3IoY2hhciAqIHBlZXJpZCwgc2l6ZV90IHBlZXJpZGxlbiwgY2hhciAqIFNUUklORywgc2l6ZV90IExFTkdUSCwgdWludDMyX3QgcmNvZGUpIHsKKwkJaW50IG47CisJCWludCByZXQgPSAgZmRfcnRkX2Vycm9yX2FkZCgkc2VsZiwgcGVlcmlkLCBwZWVyaWRsZW4sIChvczBfdClTVFJJTkcsIExFTkdUSCwgcmNvZGUsIE5VTEwsICZuKTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlESV9FUlJPUihyZXQsIE5VTEwsIE5VTEwpOworCQl9CisJCXJldHVybiBuOworCX0KKwlzdHJ1Y3QgZmRfbGlzdCAqIGV4dHJhY3QoaW50IHNjb3JlID0gMCkgeworCQlzdHJ1Y3QgZmRfbGlzdCAqIGxpID0gTlVMTDsKKwkJZmRfcnRkX2NhbmRpZGF0ZV9leHRyYWN0KCRzZWxmLCAmbGksIHNjb3JlKTsKKwkJcmV0dXJuIGxpOworCX0KK30KKworCisKKyVleHRlbmQgcnRkX2NhbmRpZGF0ZSB7CisJdm9pZCBkdW1wKCkgeworCQlmZF9sb2dfZGVidWcoImNhbmRpZGF0ZSAlcCIsICRzZWxmKTsKKwkJZmRfbG9nX2RlYnVnKCIgIGlkIDogJXMiLCAgJHNlbGYtPmRpYW1pZCk7CisJCWZkX2xvZ19kZWJ1ZygiICBybG06ICVzIiwgJHNlbGYtPnJlYWxtKTsKKwkJZmRfbG9nX2RlYnVnKCIgIHNjIDogJWQiLCAkc2VsZi0+c2NvcmUpOworCX0KK30KKworCisleworLyogY2FsbCBpdCAod2lsbCBiZSBjYWxsZWQgZnJvbSBhIGRpZmZlcmVudCB0aHJlYWQgdGhhbiB0aGUgaW50ZXJwcmV0ZXIsIHdoZW4gbWVzc2FnZSBhcnJpdmVzKSAqLworc3RhdGljIGludCBjYWxsX3RoZV9weXRob25fcnRfZndkX2NhbGxiYWNrKHZvaWQgKiBweWNiLCBzdHJ1Y3QgbXNnICoqbXNnKSB7CisJUHlPYmplY3QgKlB5TXNnOworCVB5T2JqZWN0ICpjYiwgKnJlc3VsdCA9IE5VTEw7CisJaW50IHJldCA9IDA7CisJCisJaWYgKCFweWNiKSB7CisJCWZkX2xvZ19kZWJ1ZygiSW50ZXJuYWwgZXJyb3I6IG1pc3NpbmcgdGhlIGNhbGxiYWNrISIpOworCQlyZXR1cm4gRU5PVFNVUDsKKwl9CisJY2IgPSBweWNiOworCQorCVNXSUdfUFlUSE9OX1RIUkVBRF9CRUdJTl9CTE9DSzsKKwkvKiBDb252ZXJ0IHRoZSBhcmd1bWVudHMgKi8KKwlQeU1zZyAgPSBTV0lHX05ld1BvaW50ZXJPYmooKHZvaWQgKikqbXNnLCAgICAgU1dJR1RZUEVfcF9tc2csICAgICAwICk7CisJCisJLyogQ2FsbCB0aGUgZnVuY3Rpb24gKi8KKwlyZXN1bHQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oY2IsICIoTykiLCBQeU1zZyk7CisJCisJLyogVGhlIHJlc3VsdCBpcyBzdXBwb3NlZGx5IGNvbXBvc2VkIG9mOiBbIHJldCwgKm1zZyBdICovCisJaWYgKChyZXN1bHQgPT0gTlVMTCkgfHwgKCFQeUxpc3RfQ2hlY2socmVzdWx0KSkgfHwgKFB5TGlzdF9TaXplKHJlc3VsdCkgIT0gMikpIHsKKwkJZmRfbG9nX2RlYnVnKCJFcnJvcjogVGhlIFB5dGhvbiBjYWxsYmFjayBkaWQgbm90IHJldHVybiBbIHJldCwgbXNnIF0uIik7CisJCXJldCA9IEVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCQorCS8qIENvbnZlcnQgdGhlIHJldHVybiB2YWx1ZXMgKi8KKwlpZiAoIVNXSUdfSXNPSyhTV0lHX0FzVmFsX2ludChQeUxpc3RfR2V0SXRlbShyZXN1bHQsIDApLCAmcmV0KSkpIHsKKwkJZmRfbG9nX2RlYnVnKCJFcnJvcjogQ2Fubm90IGNvbnZlcnQgdGhlIGZpcnN0IHJldHVybiB2YWx1ZSB0byBpbnRlZ2VyLiIpOworCQlyZXQgPSBFSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKwlpZiAocmV0KSB7CisJCVRSQUNFX0RFQlVHKElORk8sICJUaGUgUHl0aG9uIGNhbGxiYWNrIHJldHVybmVkIHRoZSBlcnJvciBjb2RlICVkICglcykiLCByZXQsIHN0cmVycm9yKHJldCkpOworCQlnb3RvIG91dDsKKwl9CisJCisJaWYgKCFTV0lHX0lzT0soU1dJR19Db252ZXJ0UHRyKFB5TGlzdF9HZXRJdGVtKHJlc3VsdCwgMSksICh2b2lkICopbXNnLCBTV0lHVFlQRV9wX21zZywgU1dJR19QT0lOVEVSX0RJU09XTikpKSB7CisJCWZkX2xvZ19kZWJ1ZygiRXJyb3I6IENhbm5vdCBjb252ZXJ0IHRoZSBzZWNvbmQgcmV0dXJuIHZhbHVlIHRvIG1lc3NhZ2UuIik7CisJCXJldCA9IEVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCQorb3V0OgkKKwlQeV9YREVDUkVGKHJlc3VsdCk7CisJCisJU1dJR19QWVRIT05fVEhSRUFEX0VORF9CTE9DSzsKKwlyZXR1cm4gcmV0OworfQorJX0KKworCitzdHJ1Y3QgZmRfcnRfZndkX2hkbCB7Cit9OworCislZXh0ZW5kIGZkX3J0X2Z3ZF9oZGx7CisJZmRfcnRfZndkX2hkbChQeU9iamVjdCAqIFB5Q2IsIGVudW0gZmRfcnRfZndkX2RpciBkaXIpIHsKKwkJc3RydWN0IGZkX3J0X2Z3ZF9oZGwgKiByID0gTlVMTDsKKwkJaW50IHJldDsKKwkJCisJCVB5X1hJTkNSRUYoUHlDYik7CisKKwkJcmV0ID0gZmRfcnRfZndkX3JlZ2lzdGVyKCBjYWxsX3RoZV9weXRob25fcnRfZndkX2NhbGxiYWNrLCBQeUNiLCBkaXIsICZyICk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJRElfRVJST1IocmV0LCBOVUxMLCBOVUxMKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXJldHVybiByOworCX0KKwkKKwl+ZmRfcnRfZndkX2hkbCgpIHsKKwkJUHlPYmplY3QgKiBmdW5jOworCQlpbnQgcmV0ID0gZmRfcnRfZndkX3VucmVnaXN0ZXIgKCAkc2VsZiwgKHZvaWQgKikgJmZ1bmMgKTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlESV9FUlJPUihyZXQsIE5VTEwsIE5VTEwpOworCQkJcmV0dXJuOworCQl9CisJCVB5X1hERUNSRUYoZnVuYyk7CisJCXJldHVybjsKKwl9Cit9CisKKworJXsKKy8qIGNhbGwgaXQgKHdpbGwgYmUgY2FsbGVkIGZyb20gYSBkaWZmZXJlbnQgdGhyZWFkIHRoYW4gdGhlIGludGVycHJldGVyLCB3aGVuIG1lc3NhZ2UgYXJyaXZlcykgKi8KK3N0YXRpYyBpbnQgY2FsbF90aGVfcHl0aG9uX3J0X291dF9jYWxsYmFjayh2b2lkICogcHljYiwgc3RydWN0IG1zZyAqKm1zZywgc3RydWN0IGZkX2xpc3QgKiBjYW5kaWRhdGVzKSB7CisJUHlPYmplY3QgKlB5TXNnLCAqUHlDYW5kczsKKwlQeU9iamVjdCAqY2IsICpyZXN1bHQgPSBOVUxMOworCWludCByZXQgPSAwOworCQorCWlmICghcHljYikgeworCQlmZF9sb2dfZGVidWcoIkludGVybmFsIGVycm9yOiBtaXNzaW5nIHRoZSBjYWxsYmFjayEiKTsKKwkJcmV0dXJuIEVOT1RTVVA7CisJfQorCWNiID0gcHljYjsKKwkKKwlTV0lHX1BZVEhPTl9USFJFQURfQkVHSU5fQkxPQ0s7CisJLyogQ29udmVydCB0aGUgYXJndW1lbnRzICovCisJUHlNc2cgICA9IFNXSUdfTmV3UG9pbnRlck9iaigodm9pZCAqKSptc2csICAgICAgIFNXSUdUWVBFX3BfbXNnLCAgICAgMCApOworCVB5Q2FuZHMgPSBTV0lHX05ld1BvaW50ZXJPYmooKHZvaWQgKiljYW5kaWRhdGVzLCBTV0lHVFlQRV9wX2ZkX2xpc3QsIDAgKTsKKwkKKwkvKiBDYWxsIHRoZSBmdW5jdGlvbiAqLworCXJlc3VsdCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihjYiwgIihPTykiLCBQeU1zZywgUHlDYW5kcyk7CisJCisJLyogVGhlIHJlc3VsdCBpcyBzdXBwb3NlZGx5IGNvbXBvc2VkIG9mOiBbIHJldCwgKm1zZyBdICovCisJaWYgKHJlc3VsdCA9PSBOVUxMKXsKKwkJZmRfbG9nX2RlYnVnKCJFcnJvcjogVGhlIFB5dGhvbiBjYWxsYmFjayByYWlzZWQgYW4gZXhjZXB0aW9uLiIpOworCQlyZXQgPSBFSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKwkKKwkvKiBDb252ZXJ0IHRoZSByZXR1cm4gdmFsdWVzICovCisJaWYgKCFTV0lHX0lzT0soU1dJR19Bc1ZhbF9pbnQocmVzdWx0LCAmcmV0KSkpIHsKKwkJZmRfbG9nX2RlYnVnKCJFcnJvcjogQ2Fubm90IGNvbnZlcnQgdGhlIHJldHVybiB2YWx1ZSB0byBpbnRlZ2VyLiIpOworCQlyZXQgPSBFSU5WQUw7CisJCWdvdG8gb3V0OworCX0KK291dDoJCisJUHlfWERFQ1JFRihyZXN1bHQpOworCQorCVNXSUdfUFlUSE9OX1RIUkVBRF9FTkRfQkxPQ0s7CisJcmV0dXJuIHJldDsKK30KKyV9CisKKworc3RydWN0IGZkX3J0X291dF9oZGwgeworfTsKKworJWV4dGVuZCBmZF9ydF9vdXRfaGRseworCWZkX3J0X291dF9oZGwoUHlPYmplY3QgKiBQeUNiLCBpbnQgcHJpb3JpdHkgPSAwKSB7CisJCXN0cnVjdCBmZF9ydF9vdXRfaGRsICogciA9IE5VTEw7CisJCWludCByZXQ7CisJCQorCQlQeV9YSU5DUkVGKFB5Q2IpOworCisJCXJldCA9IGZkX3J0X291dF9yZWdpc3RlciggY2FsbF90aGVfcHl0aG9uX3J0X291dF9jYWxsYmFjaywgUHlDYiwgcHJpb3JpdHksICZyICk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJRElfRVJST1IocmV0LCBOVUxMLCBOVUxMKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXJldHVybiByOworCX0KKwkKKwl+ZmRfcnRfb3V0X2hkbCgpIHsKKwkJUHlPYmplY3QgKiBmdW5jOworCQlpbnQgcmV0ID0gZmRfcnRfb3V0X3VucmVnaXN0ZXIgKCAkc2VsZiwgKHZvaWQgKikgJmZ1bmMgKTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlESV9FUlJPUihyZXQsIE5VTEwsIE5VTEwpOworCQkJcmV0dXJuOworCQl9CisJCVB5X1hERUNSRUYoZnVuYyk7CisJCXJldHVybjsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGJnX2ludGVyYWN0aXZlL3Nlc3Npb25zLmkgYi9leHRlbnNpb25zL2RiZ19pbnRlcmFjdGl2ZS9zZXNzaW9ucy5pCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MGExNTAKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RiZ19pbnRlcmFjdGl2ZS9zZXNzaW9ucy5pCkBAIC0wLDAgKzEsMjEwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxMywgV0lERSBQcm9qZWN0IGFuZCBOSUNUCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBXSURFIFByb2plY3Qgb3IgTklDVCBub3IgdGhlIAkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFdJREUgUHJvamVjdCBhbmQgCQkJCQkJICoKKyogICBOSUNULgkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIERvIG5vdCBpbmNsdWRlIHRoaXMgZGlyZWN0bHksIHVzZSBkYmdfaW50ZXJhY3RpdmUuaSBpbnN0ZWFkICovCisKKy8qKioqKiogU0VTU0lPTlMgKioqKioqKioqLworCisleworc3RydWN0IHNlc3Nfc3RhdGUgeworCVB5T2JqZWN0ICogcHlzdGF0ZTsKK307CisKKy8qIGNhbGwgaXQgKG1pZ2h0IGJlIGNhbGxlZCBmcm9tIGEgZGlmZmVyZW50IHRocmVhZCB0aGFuIHRoZSBpbnRlcnByZXRlciwgd2hlbiBzZXNzaW9uIHRpbWVzIG91dCkgKi8KK3N0YXRpYyB2b2lkIGNhbGxfdGhlX3B5dGhvbl9jbGVhbnVwX2NhbGxiYWNrKHN0cnVjdCBzZXNzX3N0YXRlICogc3RhdGUsIG9zMF90IHNpZCwgdm9pZCAqIGNiKSB7CisJUHlPYmplY3QgKnJlc3VsdDsKKwlpZiAoIWNiKSB7CisJCWZkX2xvZ19kZWJ1ZygiSW50ZXJuYWwgZXJyb3I6IG1pc3NpbmcgY2FsbGJhY2sgb2JqZWN0ISIpOworCQlyZXR1cm47CisJfQorCQorCS8qIENhbGwgdGhlIGZ1bmN0aW9uICovCisJU1dJR19QWVRIT05fVEhSRUFEX0JFR0lOX0JMT0NLOworCXJlc3VsdCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbigoUHlPYmplY3QgKiljYiwgIihPcykiLCBzdGF0ZSwgc2lkKTsKKwlQeV9YREVDUkVGKHJlc3VsdCk7CisJU1dJR19QWVRIT05fVEhSRUFEX0VORF9CTE9DSzsKKwlyZXR1cm47Cit9CislfQorCitzdHJ1Y3Qgc2Vzc2lvbl9oYW5kbGVyIHsKK307CisKKyVub2RlZmF1bHRjdG9yIHNlc3Npb25faGFuZGxlcjsKKyVleHRlbmQgc2Vzc2lvbl9oYW5kbGVyIHsKKwlzZXNzaW9uX2hhbmRsZXIoUHlPYmplY3QgKiBQeUNiKSB7CisJCXN0cnVjdCBzZXNzaW9uX2hhbmRsZXIgKiBoZGwgPSBOVUxMOworCQlpbnQgcmV0OworCQkKKwkJUHlfWElOQ1JFRihQeUNiKTsKKwkJCisJCXJldCA9IGZkX3Nlc3NfaGFuZGxlcl9jcmVhdGUgKCAmaGRsLCBjYWxsX3RoZV9weXRob25fY2xlYW51cF9jYWxsYmFjaywgTlVMTCwgUHlDYiApOworCQlpZiAocmV0ICE9IDApIHsKKwkJCURJX0VSUk9SKHJldCwgTlVMTCwgTlVMTCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlyZXR1cm4gaGRsOworCX0KKwl+c2Vzc2lvbl9oYW5kbGVyKCkgeworCQlzdHJ1Y3Qgc2Vzc2lvbl9oYW5kbGVyICogaGRsID0gc2VsZjsKKwkJUHlPYmplY3QgKiBjYiA9IE5VTEw7CisJCQorCQlpbnQgcmV0ID0gZmRfc2Vzc19oYW5kbGVyX2Rlc3Ryb3koJmhkbCwgKHZvaWQgKikmY2IpOworCQlpZiAocmV0ICE9IDApIHsKKwkJCURJX0VSUk9SKHJldCwgTlVMTCwgTlVMTCk7CisJCX0KKwkJLyogTm93IGZyZWUgdGhlIGNhbGxiYWNrICovCisJCVB5X1hERUNSRUYoY2IpOworCQlyZXR1cm47CisJfQorCXZvaWQgZHVtcCgpIHsKKwkJY2hhciAqIGJ1ZiA9IE5VTEw7CisJCXNpemVfdCBsZW47CisJCXByaW50ZigiJXMiLCBmZF9zZXNzX2R1bXBfaGRsKCZidWYsICZsZW4sIE5VTEwsICRzZWxmKSk7CisJCWZyZWUoYnVmKTsKKwl9Cit9CisKKworc3RydWN0IHNlc3Npb24geworfTsKKworJWV4dGVuZCBzZXNzaW9uIHsKKwkvKiBUaGUgZmlyc3QgdHdvIHZlcnNpb25zIGNyZWF0ZSBhIG5ldyBzZXNzaW9uIHN0cmluZy4gVGhlIHRoaXJkIG9uZSBhbGxvdyB0byB1c2UgYW4gZXhpc3Rpbmcgc3RyaW5nLiAqLworCXNlc3Npb24oKSB7CisJCWludCByZXQ7CisJCXN0cnVjdCBzZXNzaW9uICogcyA9IE5VTEw7CisJCXJldCA9IGZkX3Nlc3NfbmV3KCZzLCBmZF9nX2NvbmZpZy0+Y25mX2RpYW1pZCwgZmRfZ19jb25maWctPmNuZl9kaWFtaWRfbGVuLCAob3MwX3QpImRiZ19pbnRlcmFjdGl2ZSIsIENPTlNUU1RSTEVOKCJkYmdfaW50ZXJhY3RpdmUiKSk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJRElfRVJST1IocmV0LCBOVUxMLCBOVUxMKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXJldHVybiBzOworCX0KKwlzZXNzaW9uKGNoYXIgKiBkaWFtaWQsIGNoYXIgKiBTVFJJTkcsIHNpemVfdCBMRU5HVEgpIHsKKwkJaW50IHJldDsKKwkJc3RydWN0IHNlc3Npb24gKiBzID0gTlVMTDsKKwkJcmV0ID0gZmRfc2Vzc19uZXcoJnMsIGRpYW1pZCwgMCwgKG9zMF90KVNUUklORywgTEVOR1RIKTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlESV9FUlJPUihyZXQsIE5VTEwsIE5VTEwpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJcmV0dXJuIHM7CisJfQorCXNlc3Npb24oY2hhciAqIFNUUklORywgc2l6ZV90IExFTkdUSCkgeworCQlpbnQgcmV0LCBuOworCQlzdHJ1Y3Qgc2Vzc2lvbiAqIHMgPSBOVUxMOworCQlyZXQgPSBmZF9zZXNzX2Zyb21zaWQoKG9zMF90KVNUUklORywgTEVOR1RILCAmcywgJm4pOworCQlpZiAocmV0ICE9IDApIHsKKwkJCURJX0VSUk9SKHJldCwgTlVMTCwgTlVMTCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQkvKiBXaGVuIGRlZmluaW5nIG4gYXMgT1VUUFVUIHBhcmFtZXRlciwgd2UgZ2V0IHNvbWV0aGluZyBzdHJhbmdlLi4uIFVzZSBmZF9zZXNzX2Zyb21zaWQgaWYgeW91IG5lZWQgaXQgKi8KKwkJI2lmIDAKKwkJaWYgKG4pIHsKKwkJCWZkX2xvZ19kZWJ1ZygiQSBuZXcgc2Vzc2lvbiBoYXMgYmVlbiBjcmVhdGVkIik7CisJCX0gZWxzZSB7CisJCQlmZF9sb2dfZGVidWcoIkEgc2Vzc2lvbiB3aXRoIHNhbWUgaWQgYWxyZWFkeSBleGlzdGVkIik7CisJCX0KKwkJI2VuZGlmIC8qIDAgKi8KKwkJCisJCXJldHVybiBzOworCX0KKwl+c2Vzc2lvbigpIHsKKwkJc3RydWN0IHNlc3Npb24gKiBzID0gc2VsZjsKKwkJaW50IHJldCA9IGZkX3Nlc3NfcmVjbGFpbSgmcyk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJRElfRVJST1IocmV0LCBOVUxMLCBOVUxMKTsKKwkJfQorCQlyZXR1cm47CisJfQorCQorCSVjc3RyaW5nX291dHB1dF9hbGxvY2F0ZV9zaXplKGNoYXIgKiogb3V0c2lkLCBzaXplX3QgKiBzaWRsZW4sIC8qIGRvIG5vdCBmcmVlICovKTsKKwl2b2lkIGdldHNpZChjaGFyICoqIG91dHNpZCwgc2l6ZV90ICogc2lkbGVuKSB7CisJCWludCByZXQ7CisJCXJldCA9IGZkX3Nlc3NfZ2V0c2lkKCAkc2VsZiwgKHZvaWQgKilvdXRzaWQsIHNpZGxlbik7CisJCWlmIChyZXQgIT0gMCkgeworCQkJRElfRVJST1IocmV0LCBOVUxMLCBOVUxMKTsKKwkJCXJldHVybjsKKwkJfQorCQlyZXR1cm47CisJfQorCXZvaWQgc2V0dGltZW91dChsb25nIHNlY29uZHMpIHsKKwkJc3RydWN0IHRpbWVzcGVjIHRpbWVvdXQ7CisJCWludCByZXQ7CisJCWNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZ0aW1lb3V0KTsKKwkJdGltZW91dC50dl9zZWMgKz0gc2Vjb25kczsKKwkJcmV0ID0gZmRfc2Vzc19zZXR0aW1lb3V0KCAkc2VsZiwgJnRpbWVvdXQgKTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlESV9FUlJPUihyZXQsIE5VTEwsIE5VTEwpOworCQl9CisJfQorCXZvaWQgZHVtcCgpIHsKKwkJY2hhciAqIGJ1ZiA9IE5VTEw7CisJCXNpemVfdCBsZW4gPSAwOworCQlwcmludGYoIiVzIiwgZmRfc2Vzc19kdW1wKCZidWYsICZsZW4sIE5VTEwsICRzZWxmLCAxKSApOworCQlmcmVlKGJ1Zik7CisJfQorCXZvaWQgc3RvcmUoc3RydWN0IHNlc3Npb25faGFuZGxlciAqIGhhbmRsZXIsIFB5T2JqZWN0ICogRElTT1dOKSB7CisJCWludCByZXQ7CisJCXN0cnVjdCBzZXNzX3N0YXRlICogc3QgPSBOVUxMOworCQlzdCA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHNlc3Nfc3RhdGUpKTsKKwkJc3QtPnB5c3RhdGUgPSBESVNPV047CisJCVB5X1hJTkNSRUYoRElTT1dOKTsKKwkJcmV0ID0gZmRfc2Vzc19zdGF0ZV9zdG9yZShoYW5kbGVyLCAkc2VsZiwgKHZvaWQgKikgJnN0KTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlESV9FUlJPUihyZXQsIE5VTEwsIE5VTEwpOworCQl9CisJfQorCSVuZXdvYmplY3QgcmV0cmlldmU7CisJUHlPYmplY3QgKiByZXRyaWV2ZShzdHJ1Y3Qgc2Vzc2lvbl9oYW5kbGVyICogaGFuZGxlcikgeworCQlpbnQgcmV0OworCQlzdHJ1Y3Qgc2Vzc19zdGF0ZSAqIHN0ID0gTlVMTDsKKwkJUHlPYmplY3QgKiBzdGF0ZSA9IE5VTEw7CisJCXJldCA9IGZkX3Nlc3Nfc3RhdGVfcmV0cmlldmUoaGFuZGxlciwgJHNlbGYsICh2b2lkICopICZzdCk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJRElfRVJST1IocmV0LCBOVUxMLCBOVUxMKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWlmIChzdCA9PSBOVUxMKSB7CisJCQlQeV9JTkNSRUYoUHlfTm9uZSk7CisJCQlyZXR1cm4gUHlfTm9uZTsKKwkJfQorCQlzdGF0ZSA9IHN0LT5weXN0YXRlOworCQlmcmVlKHN0KTsKKwkJcmV0dXJuIHN0YXRlOworCX0KK30JCisKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGJnX21vbml0b3IvQ01ha2VMaXN0cy50eHQgYi9leHRlbnNpb25zL2RiZ19tb25pdG9yL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkYzhkZjcKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RiZ19tb25pdG9yL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTIgQEAKKyMgTW9uaXRvcmluZyBleHRlbnNpb24KK1BST0pFQ1QoIk1vbml0b3IgZXh0ZW5zaW9uIiBDKQorRkRfQUREX0VYVEVOU0lPTihkYmdfbW9uaXRvciBkYmdfbW9uaXRvci5jKQorCisKKyMjIyMKKyMjIElOU1RBTEwgc2VjdGlvbiAjIworCitJTlNUQUxMKFRBUkdFVFMgZGJnX21vbml0b3IKKwlMSUJSQVJZIERFU1RJTkFUSU9OICR7SU5TVEFMTF9FWFRFTlNJT05TX1NVRkZJWH0KKwlDT01QT05FTlQgZnJlZURpYW1ldGVyLWRlYnVnLXRvb2xzKQorCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RiZ19tb25pdG9yL2RiZ19tb25pdG9yLmMgYi9leHRlbnNpb25zL2RiZ19tb25pdG9yL2RiZ19tb25pdG9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU3YzEzYQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGJnX21vbml0b3IvZGJnX21vbml0b3IuYwpAQCAtMCwwICsxLDE3MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTMsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBNb25pdG9yaW5nIGV4dGVuc2lvbjoKKyAtIHBlcmlvZGljYWxseSBkaXNwbGF5IHF1ZXVlcyBhbmQgcGVlcnMgaW5mb3JtYXRpb24KKyAtIHVwb24gU0lHVVNSMiwgZGlzcGxheSBhZGRpdGlvbmFsIGRlYnVnIGluZm9ybWF0aW9uCisgKi8KKworI2luY2x1ZGUgPGZyZWVEaWFtZXRlci9leHRlbnNpb24uaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKworI2lmbmRlZiBNT05JVE9SX1NJR05BTAorI2RlZmluZSBNT05JVE9SX1NJR05BTAlTSUdVU1IyCisjZW5kaWYgLyogTU9OSVRPUl9TSUdOQUwgKi8KKworc3RhdGljIGludCAJIG1vbml0b3JfbWFpbihjaGFyICogY29uZmZpbGUpOworCitFWFRFTlNJT05fRU5UUlkoImRiZ19tb25pdG9yIiwgbW9uaXRvcl9tYWluKTsKKworCisKKy8qIERpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgYSBxdWV1ZSAqLworc3RhdGljIHZvaWQgZGlzcGxheV9pbmZvKGNoYXIgKiBxdWV1ZV9kZXNjLCBjaGFyICogcGVlciwgaW50IGN1cnJlbnRfY291bnQsIGludCBsaW1pdF9jb3VudCwgaW50IGhpZ2hlc3RfY291bnQsIGxvbmcgbG9uZyB0b3RhbF9jb3VudCwKKwkJCXN0cnVjdCB0aW1lc3BlYyAqIHRvdGFsLCBzdHJ1Y3QgdGltZXNwZWMgKiBibG9ja2luZywgc3RydWN0IHRpbWVzcGVjICogbGFzdCkKK3sKKwlsb25nIGxvbmcgdXMgPSAodG90YWwtPnR2X3NlYyAqIDEwMDAwMDApICsgKHRvdGFsLT50dl9uc2VjIC8gMTAwMCk7CisJbG9uZyBkb3VibGUgdGhyb3VnaHB1dCA9IChsb25nIGRvdWJsZSl0b3RhbF9jb3VudCAqIDEwMDAwMDA7CisJdGhyb3VnaHB1dCAvPSB1czsKKwlpZiAocGVlcikgeworCQlUUkFDRV9ERUJVRyhJTkZPLCAiJyVzJ0AnJXMnOiBjdXI6JWQvJWQsIGg6JWQsIFQ6JWxsZCBpbiAlbGQuJTA2bGRzICglLjJMRml0ZW1zL3MpLCBibG9ja2VkOiVsZC4lMDZsZHMsIGxhc3QgcHJvY2Vzc2luZzolbGQuJTA2bGRzIiwKKwkJCXF1ZXVlX2Rlc2MsIHBlZXIsIGN1cnJlbnRfY291bnQsIGxpbWl0X2NvdW50LCBoaWdoZXN0X2NvdW50LAorCQkJdG90YWxfY291bnQsIHRvdGFsLT50dl9zZWMsIHRvdGFsLT50dl9uc2VjLzEwMDAsIHRocm91Z2hwdXQsCisJCQlibG9ja2luZy0+dHZfc2VjLCBibG9ja2luZy0+dHZfbnNlYy8xMDAwLCBsYXN0LT50dl9zZWMsIGxhc3QtPnR2X25zZWMvMTAwMCk7CisJfSBlbHNlIHsKKwkJVFJBQ0VfREVCVUcoSU5GTywgIkdsb2JhbCAnJXMnOiBjdXI6JWQvJWQsIGg6JWQsIFQ6JWxsZCBpbiAlbGQuJTA2bGRzICglLjJMRml0ZW1zL3MpLCBibG9ja2VkOiVsZC4lMDZsZHMsIGxhc3QgcHJvY2Vzc2luZzolbGQuJTA2bGRzIiwKKwkJCXF1ZXVlX2Rlc2MsIGN1cnJlbnRfY291bnQsIGxpbWl0X2NvdW50LCBoaWdoZXN0X2NvdW50LAorCQkJdG90YWxfY291bnQsIHRvdGFsLT50dl9zZWMsIHRvdGFsLT50dl9uc2VjLzEwMDAsIHRocm91Z2hwdXQsCisJCQlibG9ja2luZy0+dHZfc2VjLCBibG9ja2luZy0+dHZfbnNlYy8xMDAwLCBsYXN0LT50dl9zZWMsIGxhc3QtPnR2X25zZWMvMTAwMCk7CisJfQorfQorCisvKiBUaHJlYWQgdG8gZGlzcGxheSBwZXJpb2RpY2FsIGRlYnVnIGluZm9ybWF0aW9uICovCitzdGF0aWMgcHRocmVhZF90IHRocjsKK3N0YXRpYyB2b2lkICogbW5fdGhyKHZvaWQgKiBhcmcpCit7CisJaW50IGkgPSAwOworCWZkX2xvZ190aHJlYWRuYW1lKCJNb25pdG9yIHRocmVhZCIpOworCWNoYXIgKiBidWYgPSBOVUxMOworCXNpemVfdCBsZW47CisJCisJLyogTG9vcCAqLworCXdoaWxlICgxKSB7CisJCWludCBjdXJyZW50X2NvdW50LCBsaW1pdF9jb3VudCwgaGlnaGVzdF9jb3VudDsKKwkJbG9uZyBsb25nIHRvdGFsX2NvdW50OworCQlzdHJ1Y3QgdGltZXNwZWMgdG90YWwsIGJsb2NraW5nLCBsYXN0OworCQlzdHJ1Y3QgZmRfbGlzdCAqIGxpOworCQorCQkjaWZkZWYgREVCVUcKKwkJZm9yIChpKys7IGkgJSAzMDsgaSsrKSB7CisJCQlmZF9sb2dfZGVidWcoIltkYmdfbW9uaXRvcl0gJWloJSppbSUqaXMiLCBpLzM2MDAsIDIsIChpLzYwKSAlIDYwICwgMiwgaSU2MCk7IC8qIFRoaXMgbWFrZXMgaXQgZWFzaWVyIHRvIGRldGVjdCBpbmFjdGl2aXR5IHBlcmlvZHMgaW4gdGhlIGxvZyBmaWxlICovCisJCQlzbGVlcCgxKTsKKwkJfQorCQkjZWxzZSAvKiBERUJVRyAqLworCQlzbGVlcCgzNTk5KTsgLyogMSBob3VyICovCisJCSNlbmRpZiAvKiBERUJVRyAqLworCQlUUkFDRV9ERUJVRyhJTkZPLCAiW2RiZ19tb25pdG9yXSBEdW1waW5nIHF1ZXVlcyBzdGF0aXN0aWNzIik7CisJCQorCQlDSEVDS19GQ1RfRE8oIGZkX3N0YXRfZ2V0c3RhdHMoU1RBVF9HX0xPQ0FMLCBOVUxMLCAmY3VycmVudF9jb3VudCwgJmxpbWl0X2NvdW50LCAmaGlnaGVzdF9jb3VudCwgJnRvdGFsX2NvdW50LCAmdG90YWwsICZibG9ja2luZywgJmxhc3QpLCApOworCQlkaXNwbGF5X2luZm8oIkxvY2FsIGRlbGl2ZXJ5IiwgTlVMTCwgY3VycmVudF9jb3VudCwgbGltaXRfY291bnQsIGhpZ2hlc3RfY291bnQsIHRvdGFsX2NvdW50LCAmdG90YWwsICZibG9ja2luZywgJmxhc3QpOworCQkKKwkJQ0hFQ0tfRkNUX0RPKCBmZF9zdGF0X2dldHN0YXRzKFNUQVRfR19JTkNPTUlORywgTlVMTCwgJmN1cnJlbnRfY291bnQsICZsaW1pdF9jb3VudCwgJmhpZ2hlc3RfY291bnQsICZ0b3RhbF9jb3VudCwgJnRvdGFsLCAmYmxvY2tpbmcsICZsYXN0KSwgKTsKKwkJZGlzcGxheV9pbmZvKCJUb3RhbCByZWNlaXZlZCIsIE5VTEwsIGN1cnJlbnRfY291bnQsIGxpbWl0X2NvdW50LCBoaWdoZXN0X2NvdW50LCB0b3RhbF9jb3VudCwgJnRvdGFsLCAmYmxvY2tpbmcsICZsYXN0KTsKKwkJCisJCUNIRUNLX0ZDVF9ETyggZmRfc3RhdF9nZXRzdGF0cyhTVEFUX0dfT1VUR09JTkcsIE5VTEwsICZjdXJyZW50X2NvdW50LCAmbGltaXRfY291bnQsICZoaWdoZXN0X2NvdW50LCAmdG90YWxfY291bnQsICZ0b3RhbCwgJmJsb2NraW5nLCAmbGFzdCksICk7CisJCWRpc3BsYXlfaW5mbygiVG90YWwgc2VuZGluZyIsIE5VTEwsIGN1cnJlbnRfY291bnQsIGxpbWl0X2NvdW50LCBoaWdoZXN0X2NvdW50LCB0b3RhbF9jb3VudCwgJnRvdGFsLCAmYmxvY2tpbmcsICZsYXN0KTsKKwkJCisJCQorCQlDSEVDS19GQ1RfRE8oIHB0aHJlYWRfcndsb2NrX3JkbG9jaygmZmRfZ19wZWVyc19ydyksIC8qIGNvbnRpbnVlICovICk7CisKKwkJZm9yIChsaSA9IGZkX2dfcGVlcnMubmV4dDsgbGkgIT0gJmZkX2dfcGVlcnM7IGxpID0gbGktPm5leHQpIHsKKwkJCXN0cnVjdCBwZWVyX2hkciAqIHAgPSAoc3RydWN0IHBlZXJfaGRyICopbGktPm87CisJCQkKKwkJCVRSQUNFX0RFQlVHKElORk8sICIlcyIsIGZkX3BlZXJfZHVtcCgmYnVmLCAmbGVuLCBOVUxMLCBwLCAxKSk7CisJCQkKKwkJCUNIRUNLX0ZDVF9ETyggZmRfc3RhdF9nZXRzdGF0cyhTVEFUX1BfUFNNLCBwLCAmY3VycmVudF9jb3VudCwgJmxpbWl0X2NvdW50LCAmaGlnaGVzdF9jb3VudCwgJnRvdGFsX2NvdW50LCAmdG90YWwsICZibG9ja2luZywgJmxhc3QpLCApOworCQkJZGlzcGxheV9pbmZvKCJFdmVudHMsIGluY2wuIHJlY2VwdCIsIHAtPmluZm8ucGlfZGlhbWlkLCBjdXJyZW50X2NvdW50LCBsaW1pdF9jb3VudCwgaGlnaGVzdF9jb3VudCwgdG90YWxfY291bnQsICZ0b3RhbCwgJmJsb2NraW5nLCAmbGFzdCk7CisJCQkKKwkJCUNIRUNLX0ZDVF9ETyggZmRfc3RhdF9nZXRzdGF0cyhTVEFUX1BfVE9TRU5ELCBwLCAmY3VycmVudF9jb3VudCwgJmxpbWl0X2NvdW50LCAmaGlnaGVzdF9jb3VudCwgJnRvdGFsX2NvdW50LCAmdG90YWwsICZibG9ja2luZywgJmxhc3QpLCApOworCQkJZGlzcGxheV9pbmZvKCJPdXRnb2luZyIsIHAtPmluZm8ucGlfZGlhbWlkLCBjdXJyZW50X2NvdW50LCBsaW1pdF9jb3VudCwgaGlnaGVzdF9jb3VudCwgdG90YWxfY291bnQsICZ0b3RhbCwgJmJsb2NraW5nLCAmbGFzdCk7CisJCQkKKwkJfQorCisJCUNIRUNLX0ZDVF9ETyggcHRocmVhZF9yd2xvY2tfdW5sb2NrKCZmZF9nX3BlZXJzX3J3KSwgLyogY29udGludWUgKi8gKTsKKwkJCisJCVRSQUNFX0RFQlVHKElORk8sICJbZGJnX21vbml0b3JdIER1bXBpbmcgc2VydmVycyBpbmZvcm1hdGlvbiIpOworCQlUUkFDRV9ERUJVRyhJTkZPLCAiJXMiLCBmZF9zZXJ2ZXJzX2R1bXAoJmJ1ZiwgJmxlbiwgTlVMTCwgMSkpOworCQkKKwkJc2xlZXAoMSk7CisJfQorCQorCWZyZWUoYnVmKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyogRnVuY3Rpb24gY2FsbGVkIG9uIHJlY2VpcHQgb2YgTU9OSVRPUl9TSUdOQUwgKi8KK3N0YXRpYyB2b2lkIGdvdF9zaWcoKQoreworCWNoYXIgKiBidWYgPSBOVUxMOworCXNpemVfdCBsZW47CisJVFJBQ0VfREVCVUcoSU5GTywgIltkYmdfbW9uaXRvcl0gRHVtcGluZyBjb25maWcgaW5mb3JtYXRpb24iKTsKKwlUUkFDRV9ERUJVRyhJTkZPLCAiJXMiLCBmZF9jb25mX2R1bXAoJmJ1ZiwgJmxlbiwgTlVMTCkpOworCVRSQUNFX0RFQlVHKElORk8sICJbZGJnX21vbml0b3JdIER1bXBpbmcgZXh0ZW5zaW9ucyBpbmZvcm1hdGlvbiIpOworCVRSQUNFX0RFQlVHKElORk8sICIlcyIsIGZkX2V4dF9kdW1wKCZidWYsICZsZW4sIE5VTEwpKTsKKwlUUkFDRV9ERUJVRyhJTkZPLCAiW2RiZ19tb25pdG9yXSBEdW1waW5nIGRpY3Rpb25hcnkgaW5mb3JtYXRpb24iKTsKKwlUUkFDRV9ERUJVRyhJTkZPLCAiJXMiLCBmZF9kaWN0X2R1bXAoJmJ1ZiwgJmxlbiwgTlVMTCwgZmRfZ19jb25maWctPmNuZl9kaWN0KSk7CisJZnJlZShidWYpOworfQorCisvKiBFbnRyeSBwb2ludCAqLworc3RhdGljIGludCBtb25pdG9yX21haW4oY2hhciAqIGNvbmZmaWxlKQoreworCVRSQUNFX0VOVFJZKCIlcCIsIGNvbmZmaWxlKTsKKwkKKwkvKiBDYXRjaCBzaWduYWwgU0lHVVNSMSAqLworCUNIRUNLX0ZDVCggZmRfZXZlbnRfdHJpZ19yZWdjYihNT05JVE9SX1NJR05BTCwgImRiZ19tb25pdG9yIiwgZ290X3NpZykpOworCQorCUNIRUNLX1BPU0lYKCBwdGhyZWFkX2NyZWF0ZSggJnRociwgTlVMTCwgbW5fdGhyLCBOVUxMICkgKTsKKwlyZXR1cm4gMDsKK30KKworLyogQ2xlYW51cCAqLwordm9pZCBmZF9leHRfZmluaSh2b2lkKQoreworCVRSQUNFX0VOVFJZKCk7CisJQ0hFQ0tfRkNUX0RPKCBmZF90aHJfdGVybSgmdGhyKSwgLyogY29udGludWUgKi8gKTsKKwlyZXR1cm4gOworfQorCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RiZ19tc2dfZHVtcHMvQ01ha2VMaXN0cy50eHQgYi9leHRlbnNpb25zL2RiZ19tc2dfZHVtcHMvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM0OGFjOQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGJnX21zZ19kdW1wcy9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDExIEBACitQUk9KRUNUKCJNZXNzYWdlcyBkdW1wIGV4dGVuc2lvbiIgQykKK0ZEX0FERF9FWFRFTlNJT04oZGJnX21zZ19kdW1wcyBkYmdfbXNnX2R1bXBzLmMpCisKKworIyMjIworIyMgSU5TVEFMTCBzZWN0aW9uICMjCisKK0lOU1RBTEwoVEFSR0VUUyBkYmdfbXNnX2R1bXBzCisJTElCUkFSWSBERVNUSU5BVElPTiAke0lOU1RBTExfRVhURU5TSU9OU19TVUZGSVh9CisJQ09NUE9ORU5UIGZyZWVEaWFtZXRlci1kZWJ1Zy10b29scykKKwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kYmdfbXNnX2R1bXBzL2RiZ19tc2dfZHVtcHMuYyBiL2V4dGVuc2lvbnMvZGJnX21zZ19kdW1wcy9kYmdfbXNnX2R1bXBzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI2YjE0YwotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGJnX21zZ19kdW1wcy9kYmdfbXNnX2R1bXBzLmMKQEAgLTAsMCArMSw0MTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDE1LCBXSURFIFByb2plY3QgYW5kIE5JQ1QJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFdJREUgUHJvamVjdCBvciBOSUNUIG5vciB0aGUgCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgV0lERSBQcm9qZWN0IGFuZCAJCQkJCQkgKgorKiAgIE5JQ1QuCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVGhpcyBleHRlbnNpb24gdXNlcyB0aGUgaG9va3MgbWVjaGFuaXNtIHRvIGRpc3BsYXkgdGhlIGZ1bGwgY29udGVudCBvZiByZWNlaXZlZCBhbmQgc2VudCBtZXNzYWdlcywgZm9yCisgICBsZWFybmluZyAmIGRlYnVnZ2luZyBwdXJwb3NlLgorICAgRG8gTk9UIHVzZSB0aGlzIGV4dGVuc2lvbiBpbiBwcm9kdWN0aW9uIGVudmlyb25tZW50IGJlY2F1c2UgaXQgd2lsbCBzbG93IGRvd24gYWxsIG9wZXJhdGlvbi4gKi8KKyAgIAorLyogWW91IGNhbiBhZGQgYSBjb25maWd1cmF0aW9uIHBhcmFtZXRlciBvbiB0aGUgTG9hZEV4dGVuc2lvbiBsaW5lLCBlLmcuIAorTG9hZEV4dGVuc2lvbj0iZGJnX21zZ19kdW1wLmZkeCI6IjB4MTQ5IjsKK1RoZSB2YWx1ZSBpcyBhbiBoZXhhZGVjaW1hbCB2YWx1ZSB3aXRoIHRoZSBmb2xsb3dpbmcgYml0cyBtZWFuaW5nOiAqLworI2RlZmluZSBIS19FUlJPUlNfUVVJRVQgICAgMHgwMDAxCSAvKiBlcnJvcnMgYXJlIG5vdCBkdW1wZWQgLS0gcmVtb3ZlcyB0aGUgZGVmYXVsdCBoYW5kbGluZyBhcyB3ZWxsICovCisjZGVmaW5lIEhLX0VSUk9SU19DT01QQUNUICAweDAwMDIJIC8qIGVycm9ycyBpbiBjb21wYWN0IG1vZGUgKi8KKyNkZWZpbmUgSEtfRVJST1JTX0ZVTEwgICAgIDB4MDAwNCAgCSAvKiBlcnJvcnMgaW4gZnVsbCBtb2RlICgxIGxpbmUgd2l0aCBhbGwgdGhlIGRhdGEpICovCisjZGVmaW5lIEhLX0VSUk9SU19UUkVFICAgICAweDAwMDggIAkgLyogZXJyb3JzIGluIHRyZWV2aWV3IG1vZGUgKG1lc3NhZ2Ugc3BsaXQgb3ZlciBtdWx0aXBsZSBsaW5lcykgKi8KKworI2RlZmluZSBIS19TTkRSQ1ZfUVVJRVQgICAgMHgwMDEwCSAvKiBzZW5kK3JjdiBhcmUgbm90IGR1bXBlZCAtLSByZW1vdmVzIHRoZSBkZWZhdWx0IGhhbmRsaW5nIGFzIHdlbGwgKi8KKyNkZWZpbmUgSEtfU05EUkNWX0NPTVBBQ1QgIDB4MDAyMAkgLyogc2VuZCtyY3YgaW4gY29tcGFjdCBtb2RlICovCisjZGVmaW5lIEhLX1NORFJDVl9GVUxMICAgICAweDAwNDAgIAkgLyogc2VuZCtyY3YgaW4gZnVsbCBtb2RlICovCisjZGVmaW5lIEhLX1NORFJDVl9UUkVFICAgICAweDAwODAgIAkgLyogc2VuZCtyY3YgaW4gdHJlZSBtb2RlICovCisKKyNkZWZpbmUgSEtfUk9VVElOR19RVUlFVCAgIDB4MDEwMCAgCSAvKiByb3V0aW5nIGRlY2lzaW9ucyBhcmUgbm90IGR1bXBlZCAtLSByZW1vdmVzIHRoZSBkZWZhdWx0IGhhbmRsaW5nIGFzIHdlbGwgKi8KKyNkZWZpbmUgSEtfUk9VVElOR19DT01QQUNUIDB4MDIwMCAgCSAvKiByb3V0aW5nIGRlY2lzaW9ucyBpbiBjb21wYWN0IG1vZGUgKi8KKyNkZWZpbmUgSEtfUk9VVElOR19GVUxMICAgIDB4MDQwMCAgCSAvKiByb3V0aW5nIGRlY2lzaW9ucyBpbiBmdWxsIG1vZGUgKi8KKyNkZWZpbmUgSEtfUk9VVElOR19UUkVFICAgIDB4MDgwMCAgCSAvKiByb3V0aW5nIGRlY2lzaW9ucyBpbiB0cmVlIG1vZGUgKi8KKworI2RlZmluZSBIS19QRUVSU19RVUlFVCAgICAgMHgxMDAwICAJIC8qIHBlZXJzIGNvbm5lY3Rpb25zIGV2ZW50cyBhcmUgbm90IGR1bXBlZCAtLSByZW1vdmVzIHRoZSBkZWZhdWx0IGhhbmRsaW5nIGFzIHdlbGwgKi8KKyNkZWZpbmUgSEtfUEVFUlNfQ09NUEFDVCAgIDB4MjAwMCAgCSAvKiBwZWVycyBjb25uZWN0aW9ucyBldmVudHMgaW4gY29tcGFjdCBtb2RlICovCisjZGVmaW5lIEhLX1BFRVJTX0ZVTEwgICAgICAweDQwMDAgIAkgLyogcGVlcnMgY29ubmVjdGlvbnMgZXZlbnRzIGluIGZ1bGwgbW9kZSAqLworI2RlZmluZSBIS19QRUVSU19UUkVFICAgICAgMHg4MDAwICAJIC8qIHBlZXJzIGNvbm5lY3Rpb25zIGV2ZW50cyBpbiB0cmVlIG1vZGUgKi8KKy8qCitEZWZhdWx0IHZhbHVlIGlzIEhLX0VSUk9SU19UUkVFICsgSEtfU05EUkNWX1RSRUUgKyBIS19QRUVSU19UUkVFCisqLworCisjaW5jbHVkZSA8ZnJlZURpYW1ldGVyL2V4dGVuc2lvbi5oPgorCitzdGF0aWMgc3RydWN0IGZkX2hvb2tfaGRsICptZF9oZGxbNF0gPSB7TlVMTCxOVUxMLE5VTEwsTlVMTH07CitzdGF0aWMgdWludDMyX3QgZHVtcF9sZXZlbCA9IEhLX0VSUk9SU19UUkVFIHwgSEtfU05EUkNWX1RSRUUgfCBIS19QRUVSU19UUkVFOyAvKiBkZWZhdWx0ICovCitzdGF0aWMgY2hhciAqIGJ1ZiA9IE5VTEw7CitzdGF0aWMgc2l6ZV90IGxlbjsKK3N0YXRpYyBwdGhyZWFkX211dGV4X3QgbXR4ID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKKworLyogVGhlIGNhbGxiYWNrIGNhbGxlZCB3aGVuIG1lc3NhZ2VzIGFyZSByZWNlaXZlZCBhbmQgc2VudCAqLworc3RhdGljIHZvaWQgbWRfaG9va19jYl90cmVlKGVudW0gZmRfaG9va190eXBlIHR5cGUsIHN0cnVjdCBtc2cgKiBtc2csIHN0cnVjdCBwZWVyX2hkciAqIHBlZXIsIHZvaWQgKiBvdGhlciwgc3RydWN0IGZkX2hvb2tfcGVybXNnZGF0YSAqcG1kLCB2b2lkICogcmVnZGF0YSkKK3sKKwljaGFyICogcGVlcl9uYW1lID0gcGVlciA/IHBlZXItPmluZm8ucGlfZGlhbWlkIDogIjx1bmtub3duIHBlZXI+IjsKKwkKKwlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9tdXRleF9sb2NrKCZtdHgpLCApOworCQorCWlmIChtc2cpIHsKKwkJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9tc2dfZHVtcF90cmVldmlldygmYnVmLCAmbGVuLCBOVUxMLCBtc2csIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgKHR5cGUgPT0gSE9PS19NRVNTQUdFX1BBUlNJTkdfRVJST1IpID8gMCA6IDEsIDEpLCAKKwkJCXsgTE9HX0UoIkVycm9yIHdoaWxlIGR1bXBpbmcgYSBtZXNzYWdlIik7IHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdHgpOyByZXR1cm47IH0gKTsKKwl9CisJCisJc3dpdGNoICh0eXBlKSB7CisvKiBlcnJvcnMgKi8KKwljYXNlIEhPT0tfTUVTU0FHRV9GQUlMT1ZFUjoKKwkJTE9HX0UoIkZBSUxPVkVSIGZyb20gJyVzJzoiLCBwZWVyX25hbWUpOworCQlMT0dfU1BMSVQoRkRfTE9HX0VSUk9SLCAiICAgICAiLCBidWYsIE5VTEwpOworCQlicmVhazsKKwljYXNlIEhPT0tfTUVTU0FHRV9QQVJTSU5HX0VSUk9SOgorCQlpZiAobXNnKSB7CisJCQlEaWFtSWRfdCBpZCA9IE5VTEw7CisJCQlpZiAoZmRfbXNnX3NvdXJjZV9nZXQoIG1zZywgJmlkLCBOVUxMICkpCisJCQkJaWQgPSAoRGlhbUlkX3QpIjxlcnJvciBnZXR0aW5nIHNvdXJjZT4iOworCQkJaWYgKCFpZCkKKwkJCQlpZCA9IChEaWFtSWRfdCkiPGxvY2FsPiI7CisJCQlMT0dfRSgiUEFSU0lORyBFUlJPUjogJyVzJyBmcm9tICclcyc6ICIsIChjaGFyICopb3RoZXIsIChjaGFyICopaWQpOworCQkJTE9HX1NQTElUKEZEX0xPR19FUlJPUiwgIiAgICAgIiwgYnVmLCBOVUxMKTsKKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCBmZF9jbnhfcmN2ZGF0YSAqcmN2X2RhdGEgPSBvdGhlcjsKKwkJCUNIRUNLX01BTExPQ19ETyhmZF9kdW1wX2V4dGVuZF9oZXhkdW1wKCZidWYsICZsZW4sIE5VTEwsIHJjdl9kYXRhLT5idWZmZXIsIHJjdl9kYXRhLT5sZW5ndGgsIDAsIDApLCBicmVhayk7CisJCQlMT0dfRSgiUEFSU0lORyBFUlJPUjogJXpkQiBtc2cgZnJvbSAnJXMnOiAlcyIsIHJjdl9kYXRhLT5sZW5ndGgsIHBlZXJfbmFtZSwgYnVmKTsKKwkJfQorCQlicmVhazsKKwljYXNlIEhPT0tfTUVTU0FHRV9QQVJTSU5HX0VSUk9SMjoKKwkJTE9HX0UoIlBBUlNJTkcgRVJST1IsIHJldHVybmluZzoiKTsKKwkJTE9HX1NQTElUKEZEX0xPR19FUlJPUiwgIiAgICAgIiwgYnVmLCBOVUxMKTsKKwkJYnJlYWs7CisJY2FzZSBIT09LX01FU1NBR0VfUk9VVElOR19FUlJPUjoKKwkJTE9HX0UoIlJPVVRJTkcgRVJST1IgJyVzJyBmb3I6ICIsIChjaGFyICopb3RoZXIpOworCQlMT0dfU1BMSVQoRkRfTE9HX0VSUk9SLCAiICAgICAiLCBidWYsIE5VTEwpOworCQlicmVhazsKKwljYXNlIEhPT0tfTUVTU0FHRV9EUk9QUEVEOgorCQlMT0dfRSgiRFJPUFBFRCAnJXMnIiwgKGNoYXIgKilvdGhlcik7CisJCUxPR19TUExJVChGRF9MT0dfRVJST1IsICIgICAgICIsIGJ1ZiwgTlVMTCk7CisJCWJyZWFrOworCQorLyogc2VuZCByZWNlaXZlICovCisJY2FzZSBIT09LX01FU1NBR0VfUkVDRUlWRUQ6CisJCUxPR19OKCJSQ1YgZnJvbSAnJXMnOiIsIHBlZXJfbmFtZSk7CisJCUxPR19TUExJVChGRF9MT0dfTk9USUNFLCAiICAgICAiLCBidWYsIE5VTEwpOworCQlicmVhazsKKwljYXNlIEhPT0tfTUVTU0FHRV9TRU5ESU5HOgorCQlMT0dfTigiU05ESU5HIHRvICclcyc6IiwgcGVlcl9uYW1lKTsKKwkJTE9HX1NQTElUKEZEX0xPR19OT1RJQ0UsICIgICAgICIsIGJ1ZiwgTlVMTCk7CisJCWJyZWFrOworCWNhc2UgSE9PS19NRVNTQUdFX1NFTlQ6CisJCUxPR19OKCJTTkQgdG8gJyVzJzoiLCBwZWVyX25hbWUpOworCQlMT0dfU1BMSVQoRkRfTE9HX05PVElDRSwgIiAgICAgIiwgYnVmLCBOVUxMKTsKKwkJYnJlYWs7CisJCisvKiByb3V0aW5nICovCisJY2FzZSBIT09LX01FU1NBR0VfTE9DQUw6CisJCUxPR19OKCJJU1NVRUQ6Iik7CisJCUxPR19TUExJVChGRF9MT0dfTk9USUNFLCAiICAgICAiLCBidWYsIE5VTEwpOworCQlicmVhazsKKwljYXNlIEhPT0tfTUVTU0FHRV9ST1VUSU5HX0ZPUldBUkQ6CisJCUxPR19OKCJGT1JXQVJESU5HOiAlcyIsIGJ1Zik7CisJCUxPR19TUExJVChGRF9MT0dfTk9USUNFLCAiICAgICAiLCBidWYsIE5VTEwpOworCQlicmVhazsKKwljYXNlIEhPT0tfTUVTU0FHRV9ST1VUSU5HX0xPQ0FMOgorCQlMT0dfTigiRElTUEFUQ0hJTkc6ICVzIiwgYnVmKTsKKwkJTE9HX1NQTElUKEZEX0xPR19OT1RJQ0UsICIgICAgICIsIGJ1ZiwgTlVMTCk7CisJCWJyZWFrOworCQorLyogcGVlcnMgKi8KKwljYXNlIEhPT0tfUEVFUl9DT05ORUNUX0ZBSUxFRDoKKwkJTE9HX04oIkNPTk5FQ1QgRkFJTEVEIHRvICVzOiAlcyIsIHBlZXJfbmFtZSwgKGNoYXIgKilvdGhlcik7CisJCWJyZWFrOworCWNhc2UgSE9PS19QRUVSX0NPTk5FQ1RfU1VDQ0VTUzoKKwkJeworCQkJY2hhciBwcm90b2J1Zls0MF07CisJCQlpZiAocGVlcikgeworCQkJCUNIRUNLX0ZDVF9ETyhmZF9wZWVyX2NueF9wcm90b19pbmZvKHBlZXIsIHByb3RvYnVmLCBzaXplb2YocHJvdG9idWYpKSwgYnJlYWsgKTsKKwkJCX0gZWxzZSB7CisJCQkJcHJvdG9idWZbMF0gPSAnLSc7CisJCQkJcHJvdG9idWZbMV0gPSAnXDAnOworCQkJfQorCQkJTE9HX04oIkNPTk5FQ1RFRCBUTyAnJXMnICglcyk6IiwgcGVlcl9uYW1lLCBwcm90b2J1Zik7CisJCQlMT0dfU1BMSVQoRkRfTE9HX05PVElDRSwgIiAgICAgIiwgYnVmLCBOVUxMKTsKKwkJfQorCQlicmVhazsKKworLyogTm90IGhhbmRsZWQgKi8KKwljYXNlIEhPT0tfREFUQV9SRUNFSVZFRDoKKwkJYnJlYWs7CisJfQorCQorCUNIRUNLX1BPU0lYX0RPKCBwdGhyZWFkX211dGV4X3VubG9jaygmbXR4KSwgKTsKK30KKworc3RhdGljIHZvaWQgbWRfaG9va19jYl9mdWxsKGVudW0gZmRfaG9va190eXBlIHR5cGUsIHN0cnVjdCBtc2cgKiBtc2csIHN0cnVjdCBwZWVyX2hkciAqIHBlZXIsIHZvaWQgKiBvdGhlciwgc3RydWN0IGZkX2hvb2tfcGVybXNnZGF0YSAqcG1kLCB2b2lkICogcmVnZGF0YSkKK3sKKwljaGFyICogcGVlcl9uYW1lID0gcGVlciA/IHBlZXItPmluZm8ucGlfZGlhbWlkIDogIjx1bmtub3duIHBlZXI+IjsKKwkKKwlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9tdXRleF9sb2NrKCZtdHgpLCApOworCQorCWlmIChtc2cpIHsKKwkJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9tc2dfZHVtcF9mdWxsKCZidWYsICZsZW4sIE5VTEwsIG1zZywgZmRfZ19jb25maWctPmNuZl9kaWN0LCAodHlwZSA9PSBIT09LX01FU1NBR0VfUEFSU0lOR19FUlJPUikgPyAwIDogMSwgMSksIAorCQkJeyBMT0dfRSgiRXJyb3Igd2hpbGUgZHVtcGluZyBhIG1lc3NhZ2UiKTsgcHRocmVhZF9tdXRleF91bmxvY2soJm10eCk7IHJldHVybjsgfSApOworCX0KKwkKKwlzd2l0Y2ggKHR5cGUpIHsKKy8qIGVycm9ycyAqLworCWNhc2UgSE9PS19NRVNTQUdFX0ZBSUxPVkVSOgorCQlMT0dfRSgiRkFJTE9WRVIgZnJvbSAnJXMnOiAlcyIsIHBlZXJfbmFtZSwgYnVmKTsKKwkJYnJlYWs7CisJY2FzZSBIT09LX01FU1NBR0VfUEFSU0lOR19FUlJPUjoKKwkJaWYgKG1zZykgeworCQkJRGlhbUlkX3QgaWQgPSBOVUxMOworCQkJaWYgKGZkX21zZ19zb3VyY2VfZ2V0KCBtc2csICZpZCwgTlVMTCApKQorCQkJCWlkID0gKERpYW1JZF90KSI8ZXJyb3IgZ2V0dGluZyBzb3VyY2U+IjsKKwkJCWlmICghaWQpCisJCQkJaWQgPSAoRGlhbUlkX3QpIjxsb2NhbD4iOworCQkJTE9HX0UoIlBBUlNJTkcgRVJST1I6ICclcycgZnJvbSAnJXMnOiAlcyIsIChjaGFyICopb3RoZXIsIChjaGFyICopaWQsIGJ1Zik7CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3QgZmRfY254X3JjdmRhdGEgKnJjdl9kYXRhID0gb3RoZXI7CisJCQlDSEVDS19NQUxMT0NfRE8oZmRfZHVtcF9leHRlbmRfaGV4ZHVtcCgmYnVmLCAmbGVuLCBOVUxMLCByY3ZfZGF0YS0+YnVmZmVyLCByY3ZfZGF0YS0+bGVuZ3RoLCAwLCAwKSwgYnJlYWspOworCQkJTE9HX0UoIlBBUlNJTkcgRVJST1I6ICV6ZEIgbXNnIGZyb20gJyVzJzogJXMiLCByY3ZfZGF0YS0+bGVuZ3RoLCBwZWVyX25hbWUsIGJ1Zik7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBIT09LX01FU1NBR0VfUEFSU0lOR19FUlJPUjI6CisJCUxPR19FKCJQQVJTSU5HIEVSUk9SLCByZXR1cm5pbmc6ICVzIiwgYnVmKTsKKwkJYnJlYWs7CisJY2FzZSBIT09LX01FU1NBR0VfUk9VVElOR19FUlJPUjoKKwkJTE9HX0UoIlJPVVRJTkcgRVJST1IgJyVzJyBmb3I6ICVzIiwgKGNoYXIgKilvdGhlciwgYnVmKTsKKwkJYnJlYWs7CisJY2FzZSBIT09LX01FU1NBR0VfRFJPUFBFRDoKKwkJTE9HX0UoIkRST1BQRUQgJyVzJyAlcyIsIChjaGFyICopb3RoZXIsIGJ1Zik7CisJCWJyZWFrOworCQorLyogc2VuZCByZWNlaXZlICovCisJY2FzZSBIT09LX01FU1NBR0VfUkVDRUlWRUQ6CisJCUxPR19OKCJSQ1YgZnJvbSAnJXMnOiAlcyIsIHBlZXJfbmFtZSwgYnVmKTsKKwkJYnJlYWs7CisJY2FzZSBIT09LX01FU1NBR0VfU0VORElORzoKKwkJTE9HX04oIlNORElORyB0byAnJXMnOiAlcyIsIHBlZXJfbmFtZSwgYnVmKTsKKwkJYnJlYWs7CisJY2FzZSBIT09LX01FU1NBR0VfU0VOVDoKKwkJTE9HX04oIlNORCB0byAnJXMnOiAlcyIsIHBlZXJfbmFtZSwgYnVmKTsKKwkJYnJlYWs7CisJCisvKiByb3V0aW5nICovCisJY2FzZSBIT09LX01FU1NBR0VfTE9DQUw6CisJCUxPR19OKCJJU1NVRUQ6ICVzIiwgYnVmKTsKKwkJYnJlYWs7CisJY2FzZSBIT09LX01FU1NBR0VfUk9VVElOR19GT1JXQVJEOgorCQlMT0dfTigiRk9SV0FSRElORzogJXMiLCBidWYpOworCQlicmVhazsKKwljYXNlIEhPT0tfTUVTU0FHRV9ST1VUSU5HX0xPQ0FMOgorCQlMT0dfTigiRElTUEFUQ0hJTkc6ICVzIiwgYnVmKTsKKwkJYnJlYWs7CisJCisvKiBwZWVycyAqLworCWNhc2UgSE9PS19QRUVSX0NPTk5FQ1RfRkFJTEVEOgorCQlMT0dfTigiQ09OTkVDVCBGQUlMRUQgdG8gJXM6ICVzIiwgcGVlcl9uYW1lLCAoY2hhciAqKW90aGVyKTsKKwkJYnJlYWs7CisJY2FzZSBIT09LX1BFRVJfQ09OTkVDVF9TVUNDRVNTOiB7CisJCQljaGFyIHByb3RvYnVmWzQwXTsKKwkJCWlmIChwZWVyKSB7CisJCQkJQ0hFQ0tfRkNUX0RPKGZkX3BlZXJfY254X3Byb3RvX2luZm8ocGVlciwgcHJvdG9idWYsIHNpemVvZihwcm90b2J1ZikpLCBicmVhayApOworCQkJfSBlbHNlIHsKKwkJCQlwcm90b2J1ZlswXSA9ICctJzsKKwkJCQlwcm90b2J1ZlsxXSA9ICdcMCc7CisJCQl9CisJCQlMT0dfTigiQ09OTkVDVEVEIFRPICclcycgKCVzKTogJXMiLCBwZWVyX25hbWUsIHByb3RvYnVmLCBidWYpOworCQl9CisJCWJyZWFrOworLyogTm90IGhhbmRsZWQgKi8KKwljYXNlIEhPT0tfREFUQV9SRUNFSVZFRDoKKwkJYnJlYWs7CisJfQorCQorCUNIRUNLX1BPU0lYX0RPKCBwdGhyZWFkX211dGV4X3VubG9jaygmbXR4KSwgKTsKK30KKworc3RhdGljIHZvaWQgbWRfaG9va19jYl9jb21wYWN0KGVudW0gZmRfaG9va190eXBlIHR5cGUsIHN0cnVjdCBtc2cgKiBtc2csIHN0cnVjdCBwZWVyX2hkciAqIHBlZXIsIHZvaWQgKiBvdGhlciwgc3RydWN0IGZkX2hvb2tfcGVybXNnZGF0YSAqcG1kLCB2b2lkICogcmVnZGF0YSkKK3sKKwljaGFyICogcGVlcl9uYW1lID0gcGVlciA/IHBlZXItPmluZm8ucGlfZGlhbWlkIDogIjx1bmtub3duIHBlZXI+IjsKKwkKKwlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9tdXRleF9sb2NrKCZtdHgpLCApOworCQorCWlmIChtc2cpIHsKKwkJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9tc2dfZHVtcF9zdW1tYXJ5KCZidWYsICZsZW4sIE5VTEwsIG1zZywgZmRfZ19jb25maWctPmNuZl9kaWN0LCAwLCAwKSwgCisJCQl7IExPR19FKCJFcnJvciB3aGlsZSBkdW1waW5nIGEgbWVzc2FnZSIpOyBwdGhyZWFkX211dGV4X3VubG9jaygmbXR4KTsgcmV0dXJuOyB9ICk7CisJfQorCQorCXN3aXRjaCAodHlwZSkgeworLyogZXJyb3JzICovCisJY2FzZSBIT09LX01FU1NBR0VfRkFJTE9WRVI6CisJCUxPR19FKCJGQUlMT1ZFUiBmcm9tICclcyc6ICVzIiwgcGVlcl9uYW1lLCBidWYpOworCQlicmVhazsKKwljYXNlIEhPT0tfTUVTU0FHRV9QQVJTSU5HX0VSUk9SOgorCQlpZiAobXNnKSB7CisJCQlEaWFtSWRfdCBpZCA9IE5VTEw7CisJCQlpZiAoZmRfbXNnX3NvdXJjZV9nZXQoIG1zZywgJmlkLCBOVUxMICkpCisJCQkJaWQgPSAoRGlhbUlkX3QpIjxlcnJvciBnZXR0aW5nIHNvdXJjZT4iOworCQkJaWYgKCFpZCkKKwkJCQlpZCA9IChEaWFtSWRfdCkiPGxvY2FsPiI7CisJCQlMT0dfRSgiUEFSU0lORyBFUlJPUjogJyVzJyBmcm9tICclcyc6ICVzIiwgKGNoYXIgKilvdGhlciwgKGNoYXIgKilpZCwgYnVmKTsKKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCBmZF9jbnhfcmN2ZGF0YSAqcmN2X2RhdGEgPSBvdGhlcjsKKwkJCUNIRUNLX01BTExPQ19ETyhmZF9kdW1wX2V4dGVuZF9oZXhkdW1wKCZidWYsICZsZW4sIE5VTEwsIHJjdl9kYXRhLT5idWZmZXIsIHJjdl9kYXRhLT5sZW5ndGgsIDAsIDApLCBicmVhayk7CisJCQlMT0dfRSgiUEFSU0lORyBFUlJPUjogJXpkQiBtc2cgZnJvbSAnJXMnOiAlcyIsIHJjdl9kYXRhLT5sZW5ndGgsIHBlZXJfbmFtZSwgYnVmKTsKKwkJfQorCQlicmVhazsKKwljYXNlIEhPT0tfTUVTU0FHRV9QQVJTSU5HX0VSUk9SMjoKKwkJTE9HX0UoIlBBUlNJTkcgRVJST1IsIHJldHVybmluZzogJXMiLCBidWYpOworCQlicmVhazsKKwljYXNlIEhPT0tfTUVTU0FHRV9ST1VUSU5HX0VSUk9SOgorCQlMT0dfRSgiUk9VVElORyBFUlJPUiAnJXMnIGZvcjogJXMiLCAoY2hhciAqKW90aGVyLCBidWYpOworCQlicmVhazsKKwljYXNlIEhPT0tfTUVTU0FHRV9EUk9QUEVEOgorCQlMT0dfRSgiRFJPUFBFRCAnJXMnICVzIiwgKGNoYXIgKilvdGhlciwgYnVmKTsKKwkJYnJlYWs7CisJCisvKiBzZW5kIHJlY2VpdmUgKi8KKwljYXNlIEhPT0tfTUVTU0FHRV9SRUNFSVZFRDoKKwkJTE9HX04oIlJDViBmcm9tICclcyc6ICVzIiwgcGVlcl9uYW1lLCBidWYpOworCQlicmVhazsKKwljYXNlIEhPT0tfTUVTU0FHRV9TRU5ESU5HOgorCQlMT0dfTigiU05ESU5HIHRvICclcyc6ICVzIiwgcGVlcl9uYW1lLCBidWYpOworCQlicmVhazsKKwljYXNlIEhPT0tfTUVTU0FHRV9TRU5UOgorCQlMT0dfTigiU05EIHRvICclcyc6ICVzIiwgcGVlcl9uYW1lLCBidWYpOworCQlicmVhazsKKwkKKy8qIHJvdXRpbmcgKi8KKwljYXNlIEhPT0tfTUVTU0FHRV9MT0NBTDoKKwkJTE9HX04oIklTU1VFRDogJXMiLCBidWYpOworCQlicmVhazsKKwljYXNlIEhPT0tfTUVTU0FHRV9ST1VUSU5HX0ZPUldBUkQ6CisJCUxPR19OKCJGT1JXQVJESU5HOiAlcyIsIGJ1Zik7CisJCWJyZWFrOworCWNhc2UgSE9PS19NRVNTQUdFX1JPVVRJTkdfTE9DQUw6CisJCUxPR19OKCJESVNQQVRDSElORzogJXMiLCBidWYpOworCQlicmVhazsKKwkKKy8qIHBlZXJzICovCisJY2FzZSBIT09LX1BFRVJfQ09OTkVDVF9GQUlMRUQ6CisJCUxPR19OKCJDT05ORUNUIEZBSUxFRCB0byAlczogJXMiLCBwZWVyX25hbWUsIChjaGFyICopb3RoZXIpOworCQlicmVhazsKKwljYXNlIEhPT0tfUEVFUl9DT05ORUNUX1NVQ0NFU1M6IHsKKwkJCWNoYXIgcHJvdG9idWZbNDBdOworCQkJaWYgKHBlZXIpIHsKKwkJCQlDSEVDS19GQ1RfRE8oZmRfcGVlcl9jbnhfcHJvdG9faW5mbyhwZWVyLCBwcm90b2J1Ziwgc2l6ZW9mKHByb3RvYnVmKSksIGJyZWFrICk7CisJCQl9IGVsc2UgeworCQkJCXByb3RvYnVmWzBdID0gJy0nOworCQkJCXByb3RvYnVmWzFdID0gJ1wwJzsKKwkJCX0KKwkJCUxPR19OKCJDT05ORUNURUQgVE8gJyVzJyAoJXMpIiwgcGVlcl9uYW1lLCBwcm90b2J1Zik7CisJCX0KKwkJYnJlYWs7CisvKiBOb3QgaGFuZGxlZCAqLworCWNhc2UgSE9PS19EQVRBX1JFQ0VJVkVEOgorCQlicmVhazsKKwl9CisJCisJQ0hFQ0tfUE9TSVhfRE8oIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdHgpLCApOworfQorCitzdGF0aWMgdm9pZCBtZF9ob29rX2NiX3F1aWV0KGVudW0gZmRfaG9va190eXBlIHR5cGUsIHN0cnVjdCBtc2cgKiBtc2csIHN0cnVjdCBwZWVyX2hkciAqIHBlZXIsIHZvaWQgKiBvdGhlciwgc3RydWN0IGZkX2hvb2tfcGVybXNnZGF0YSAqcG1kLCB2b2lkICogcmVnZGF0YSkKK3sKK30KKworLyogRW50cnkgcG9pbnQgKi8KK3N0YXRpYyBpbnQgbWRfbWFpbihjaGFyICogY29uZmZpbGUpCit7CisJdWludDMyX3QgbWFza19lcnJvcnMsIG1hc2tfc25kcmN2LCBtYXNrX3JvdXRpbmcsIG1hc2tfcGVlcnM7CisJdWludDMyX3QgbWFza19xdWlldCwgbWFza19jb21wYWN0LCBtYXNrX2Z1bGwsIG1hc2tfdHJlZTsKKwlUUkFDRV9FTlRSWSgiJXAiLCBjb25mZmlsZSk7CisJCisJaWYgKGNvbmZmaWxlICE9IE5VTEwpIHsKKwkJY2hhciAqIGVuZHA7CisJCWR1bXBfbGV2ZWwgPSAodWludDMyX3Qpc3RydG91bChjb25mZmlsZSwgJmVuZHAsIDE2KTsKKwkJQ0hFQ0tfUEFSQU1TX0RPKCAqZW5kcCA9PSAnXDAnLCB7CisJCQlMT0dfRSgiQ29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgbXVzdCBiZSBpbiB0aGUgZm9ybSBcIjB4Tk5OTlwiIik7CisJCQlyZXR1cm4gRUlOVkFMOyB9KTsKKwl9CisJCisJbWFza19lcnJvcnMgPSBIT09LX01BU0soIEhPT0tfTUVTU0FHRV9GQUlMT1ZFUiwgSE9PS19NRVNTQUdFX1BBUlNJTkdfRVJST1IsIEhPT0tfTUVTU0FHRV9QQVJTSU5HX0VSUk9SMiwgSE9PS19NRVNTQUdFX1JPVVRJTkdfRVJST1IsIEhPT0tfTUVTU0FHRV9EUk9QUEVEICApOworCW1hc2tfc25kcmN2ID0gSE9PS19NQVNLKCBIT09LX01FU1NBR0VfUkVDRUlWRUQsIEhPT0tfTUVTU0FHRV9TRU5UICk7IC8qIFdlIGRvbiB0IGFjY2VzcyBTRU5ESU5HIGhvb2sgaGVyZSAqLworCW1hc2tfcm91dGluZz0gSE9PS19NQVNLKCBIT09LX01FU1NBR0VfTE9DQUwsIEhPT0tfTUVTU0FHRV9ST1VUSU5HX0ZPUldBUkQsIEhPT0tfTUVTU0FHRV9ST1VUSU5HX0xPQ0FMICk7CisJbWFza19wZWVycyAgPSBIT09LX01BU0soIEhPT0tfUEVFUl9DT05ORUNUX0ZBSUxFRCwgSE9PS19QRUVSX0NPTk5FQ1RfU1VDQ0VTUyApOworCQorCW1hc2tfcXVpZXQgID0gKGR1bXBfbGV2ZWwgJiBIS19FUlJPUlNfUVVJRVQpICA/IG1hc2tfZXJyb3JzIDogMDsKKwltYXNrX3F1aWV0IHw9IChkdW1wX2xldmVsICYgSEtfU05EUkNWX1FVSUVUKSAgPyBtYXNrX3NuZHJjdiA6IDA7CisJbWFza19xdWlldCB8PSAoZHVtcF9sZXZlbCAmIEhLX1JPVVRJTkdfUVVJRVQpID8gbWFza19yb3V0aW5nIDogMDsKKwltYXNrX3F1aWV0IHw9IChkdW1wX2xldmVsICYgSEtfUEVFUlNfUVVJRVQpICAgPyBtYXNrX3BlZXJzIDogMDsKKwkKKwltYXNrX2NvbXBhY3QgID0gKGR1bXBfbGV2ZWwgJiBIS19FUlJPUlNfQ09NUEFDVCkgID8gbWFza19lcnJvcnMgOiAwOworCW1hc2tfY29tcGFjdCB8PSAoZHVtcF9sZXZlbCAmIEhLX1NORFJDVl9DT01QQUNUKSAgPyBtYXNrX3NuZHJjdiA6IDA7CisJbWFza19jb21wYWN0IHw9IChkdW1wX2xldmVsICYgSEtfUk9VVElOR19DT01QQUNUKSA/IG1hc2tfcm91dGluZyA6IDA7CisJbWFza19jb21wYWN0IHw9IChkdW1wX2xldmVsICYgSEtfUEVFUlNfQ09NUEFDVCkgICA/IG1hc2tfcGVlcnMgOiAwOworCQorCW1hc2tfZnVsbCAgPSAoZHVtcF9sZXZlbCAmIEhLX0VSUk9SU19GVUxMKSAgPyBtYXNrX2Vycm9ycyA6IDA7CisJbWFza19mdWxsIHw9IChkdW1wX2xldmVsICYgSEtfU05EUkNWX0ZVTEwpICA/IG1hc2tfc25kcmN2IDogMDsKKwltYXNrX2Z1bGwgfD0gKGR1bXBfbGV2ZWwgJiBIS19ST1VUSU5HX0ZVTEwpID8gbWFza19yb3V0aW5nIDogMDsKKwltYXNrX2Z1bGwgfD0gKGR1bXBfbGV2ZWwgJiBIS19QRUVSU19GVUxMKSAgID8gbWFza19wZWVycyA6IDA7CisJCisJbWFza190cmVlICA9IChkdW1wX2xldmVsICYgSEtfRVJST1JTX1RSRUUpICA/IG1hc2tfZXJyb3JzIDogMDsKKwltYXNrX3RyZWUgfD0gKGR1bXBfbGV2ZWwgJiBIS19TTkRSQ1ZfVFJFRSkgID8gbWFza19zbmRyY3YgOiAwOworCW1hc2tfdHJlZSB8PSAoZHVtcF9sZXZlbCAmIEhLX1JPVVRJTkdfVFJFRSkgPyBtYXNrX3JvdXRpbmcgOiAwOworCW1hc2tfdHJlZSB8PSAoZHVtcF9sZXZlbCAmIEhLX1BFRVJTX1RSRUUpICAgPyBtYXNrX3BlZXJzIDogMDsKKwkKKwlpZiAobWFza19xdWlldCkgeworCQlDSEVDS19GQ1QoIGZkX2hvb2tfcmVnaXN0ZXIoIG1hc2tfcXVpZXQsIG1kX2hvb2tfY2JfcXVpZXQsIE5VTEwsIE5VTEwsICZtZF9oZGxbMF0pICk7CisJfQorCWlmIChtYXNrX2NvbXBhY3QpIHsKKwkJQ0hFQ0tfRkNUKCBmZF9ob29rX3JlZ2lzdGVyKCBtYXNrX2NvbXBhY3QsIG1kX2hvb2tfY2JfY29tcGFjdCwgTlVMTCwgTlVMTCwgJm1kX2hkbFsxXSkgKTsKKwl9CisJaWYgKG1hc2tfZnVsbCkgeworCQlDSEVDS19GQ1QoIGZkX2hvb2tfcmVnaXN0ZXIoIG1hc2tfZnVsbCwgbWRfaG9va19jYl9mdWxsLCBOVUxMLCBOVUxMLCAmbWRfaGRsWzJdKSApOworCX0KKwlpZiAobWFza190cmVlKSB7CisJCUNIRUNLX0ZDVCggZmRfaG9va19yZWdpc3RlciggbWFza190cmVlLCBtZF9ob29rX2NiX3RyZWUsIE5VTEwsIE5VTEwsICZtZF9oZGxbM10pICk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIENsZWFudXAgKi8KK3ZvaWQgZmRfZXh0X2Zpbmkodm9pZCkKK3sKKwlUUkFDRV9FTlRSWSgpOworCWlmIChtZF9oZGxbMF0pIHsgQ0hFQ0tfRkNUX0RPKCBmZF9ob29rX3VucmVnaXN0ZXIoIG1kX2hkbFswXSApLCApOyB9CisJaWYgKG1kX2hkbFsxXSkgeyBDSEVDS19GQ1RfRE8oIGZkX2hvb2tfdW5yZWdpc3RlciggbWRfaGRsWzFdICksICk7IH0KKwlpZiAobWRfaGRsWzJdKSB7IENIRUNLX0ZDVF9ETyggZmRfaG9va191bnJlZ2lzdGVyKCBtZF9oZGxbMl0gKSwgKTsgfQorCWlmIChtZF9oZGxbMl0pIHsgQ0hFQ0tfRkNUX0RPKCBmZF9ob29rX3VucmVnaXN0ZXIoIG1kX2hkbFszXSApLCApOyB9CisJcmV0dXJuIDsKK30KKworRVhURU5TSU9OX0VOVFJZKCJkYmdfbXNnX2R1bXBzIiwgbWRfbWFpbik7CmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RiZ19tc2dfdGltaW5ncy9DTWFrZUxpc3RzLnR4dCBiL2V4dGVuc2lvbnMvZGJnX21zZ190aW1pbmdzL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzOGEzZTAKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RiZ19tc2dfdGltaW5ncy9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDEyIEBACisjIE1lc3NhZ2VzIHRpbWluZyBleHRlbnNpb24KK1BST0pFQ1QoIk1lc3NhZ2VzIHRpbWluZyBleHRlbnNpb24iIEMpCitGRF9BRERfRVhURU5TSU9OKGRiZ19tc2dfdGltaW5ncyBkYmdfbXNnX3RpbWluZ3MuYykKKworCisjIyMjCisjIyBJTlNUQUxMIHNlY3Rpb24gIyMKKworSU5TVEFMTChUQVJHRVRTIGRiZ19tc2dfdGltaW5ncworCUxJQlJBUlkgREVTVElOQVRJT04gJHtJTlNUQUxMX0VYVEVOU0lPTlNfU1VGRklYfQorCUNPTVBPTkVOVCBmcmVlRGlhbWV0ZXItZGVidWctdG9vbHMpCisKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGJnX21zZ190aW1pbmdzL2RiZ19tc2dfdGltaW5ncy5jIGIvZXh0ZW5zaW9ucy9kYmdfbXNnX3RpbWluZ3MvZGJnX21zZ190aW1pbmdzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM2NjA2OQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGJnX21zZ190aW1pbmdzL2RiZ19tc2dfdGltaW5ncy5jCkBAIC0wLDAgKzEsMTMzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxMywgV0lERSBQcm9qZWN0IGFuZCBOSUNUCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBXSURFIFByb2plY3Qgb3IgTklDVCBub3IgdGhlIAkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFdJREUgUHJvamVjdCBhbmQgCQkJCQkJICoKKyogICBOSUNULgkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoaXMgZXh0ZW5zaW9uIHVzZXMgdGhlIGhvb2tzIG1lY2hhbmlzbSB0byBjb21wdXRlIHNvbWUgdGltaW5nIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gbWVzc2FnZXMgKi8KKworI2luY2x1ZGUgPGZyZWVEaWFtZXRlci9leHRlbnNpb24uaD4KKworc3RydWN0IGZkX2hvb2tfcGVybXNnZGF0YSB7CisJc3RydWN0IHRpbWVzcGVjIHJlY2VpdmVkX29uOworCXN0cnVjdCB0aW1lc3BlYyBzZW50X29uOworfTsKKworc3RhdGljIHN0cnVjdCBmZF9ob29rX2RhdGFfaGRsICptdF9kYXRhX2hkbCA9IE5VTEw7CitzdGF0aWMgc3RydWN0IGZkX2hvb2tfaGRsICptdF9oZGwgPSBOVUxMOworCisvKiBUaGUgY2FsbGJhY2sgY2FsbGVkIHdoZW4gbWVzc2FnZXMgYXJlIHJlY2VpdmVkIGFuZCBzZW50ICovCitzdGF0aWMgdm9pZCBtdF9ob29rX2NiKGVudW0gZmRfaG9va190eXBlIHR5cGUsIHN0cnVjdCBtc2cgKiBtc2csIHN0cnVjdCBwZWVyX2hkciAqIHBlZXIsIHZvaWQgKiBvdGhlciwgc3RydWN0IGZkX2hvb2tfcGVybXNnZGF0YSAqcG1kLCB2b2lkICogcmVnZGF0YSkKK3sKKwlzdHJ1Y3QgbXNnX2hkciAqIGhkcjsKKwljaGFyICogYnVmID0gTlVMTDsKKwlzaXplX3QgbGVuOworCQorCUFTU0VSVChwbWQpOworCQorCWlmICh0eXBlID09IEhPT0tfREFUQV9SRUNFSVZFRCkgeworCQkvKiBXZSBqdXN0IHN0b3JlIHRoZSB0aW1lc3RhbXAgaXQgd2FzIHJlY2VpdmVkIG9uICovCisJCSh2b2lkKWNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZwbWQtPnJlY2VpdmVkX29uKTsKKwkJcmV0dXJuOworCX0KKwkKKwlBU1NFUlQobXNnKTsKKwkKKwkvKiBDaGVjayBpZiB0aGlzIG1lc3NhZ2UgaXMgcmVxdWVzdCBvciBhbnN3ZXIgKi8KKwlDSEVDS19GQ1RfRE8oIGZkX21zZ19oZHIobXNnLCAmaGRyKSwgcmV0dXJuKTsKKwkKKwlpZiAodHlwZSA9PSBIT09LX01FU1NBR0VfUkVDRUlWRUQpIHsKKwkJQVNTRVJUKHBtZC0+cmVjZWl2ZWRfb24udHZfc2VjKTsgLyogb3RoZXJ3aXNlIGl0IG1lYW5zIHRoZSBIT09LX0RBVEFfUkVDRUlWRUQgaG9vayB3YXMgbm90IHRyaWdnZWQgZm9yIHRoaXMgbWVzc2FnZSAqLworCQlpZiAoaGRyLT5tc2dfZmxhZ3MgJiBDTURfRkxBR19SRVFVRVNUKSB7CisJCQkvKiBXZSBoYXZlIHJlY2VpdmVkIGEgbmV3IHJlcXVlc3QsIG5vdGhpbmcgc3BlY2lhbCB0byBkbyAqLworCQl9IGVsc2UgeworCQkJLyogVGhpcyBpcyBhbiBhbnN3ZXIsIGNoZWNrIGhvdyBsb25nIGl0IHRvb2sgdG8gZ2V0IGl0ICovCisJCQlzdHJ1Y3QgZmRfaG9va19wZXJtc2dkYXRhICpxcG1kID0gZmRfaG9va19nZXRfcmVxdWVzdF9wbWQobXRfZGF0YV9oZGwsIG1zZyk7CisJCQlzdHJ1Y3QgdGltZXNwZWMgZGVsYXk7CisJCQlBU1NFUlQocXBtZCk7IC8qIElmIHdlIGRvIG5vdCBoYXZlIGl0LCB3ZSBtdXN0IGZpbmQgb3V0IHdoeSAqLworCQkJQVNTRVJUKHFwbWQtPnNlbnRfb24udHZfc2VjKTsgLyogc2FtZSwgd291bGQgbWVhbiB0aGUgSE9PS19NRVNTQUdFX1NFTlQgaG9vayB3YXMgbm90IHRyaWdnZWQgKi8KKwkJCVRTX0RJRkZFUkVOQ0UoICZkZWxheSwgJnFwbWQtPnNlbnRfb24sICZwbWQtPnJlY2VpdmVkX29uICk7CisJCQlDSEVDS19NQUxMT0NfRE8oIGZkX21zZ19kdW1wX3N1bW1hcnkoJmJ1ZiwgJmxlbiwgTlVMTCwgbXNnLCBOVUxMLCAwLCAxKSwgcmV0dXJuICk7CisJCQlMT0dfTigiW1RJTUlOR10gUkNWIEFOUyAlbGQuJTA2bGQgc2VjIDwtJyVzJzogJXMiLCAobG9uZylkZWxheS50dl9zZWMsIGRlbGF5LnR2X25zZWMgLyAxMDAwLCBwZWVyID8gcGVlci0+aW5mby5waV9kaWFtaWQgOiAiPHVuaWRlbnRpZmllZD4iLCBidWYpOworCQl9CisJfSBlbHNlIGlmICh0eXBlID09IEhPT0tfTUVTU0FHRV9TRU5UKSB7CisJCURpYW1JZF90IHNvdXJjZSA9IE5VTEw7CisJCQorCQkodm9pZCljbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmcG1kLT5zZW50X29uKTsKKwkJCisJCS8qIElzIHRoaXMgYSBmb3J3YXJkZWQgbWVzc2FnZSA/ICovCisJCUNIRUNLX0ZDVF9ETyggZmRfbXNnX3NvdXJjZV9nZXQobXNnLCAmc291cmNlLCBOVUxMKSwgcmV0dXJuICk7CisJCWlmIChzb3VyY2UpIHsKKwkJCXN0cnVjdCB0aW1lc3BlYyBkZWxheTsKKwkJCUFTU0VSVChwbWQtPnJlY2VpdmVkX29uLnR2X3NlYyk7CisJCQlUU19ESUZGRVJFTkNFKCAmZGVsYXksICZwbWQtPnJlY2VpdmVkX29uLCAmcG1kLT5zZW50X29uICk7CisJCQlDSEVDS19NQUxMT0NfRE8oIGZkX21zZ19kdW1wX3N1bW1hcnkoJmJ1ZiwgJmxlbiwgTlVMTCwgbXNnLCBOVUxMLCAwLCAxKSwgcmV0dXJuICk7CisJCQlMT0dfTigiW1RJTUlOR10gRldEICVsZC4lMDZsZCBzZWMgJyVzJy0+JyVzJzogJXMiLCAobG9uZylkZWxheS50dl9zZWMsIGRlbGF5LnR2X25zZWMgLyAxMDAwLCBzb3VyY2UsIHBlZXIgPyBwZWVyLT5pbmZvLnBpX2RpYW1pZCA6ICI8dW5pZGVudGlmaWVkPiIsIGJ1Zik7CisJCX0gZWxzZSBpZiAoaGRyLT5tc2dfZmxhZ3MgJiBDTURfRkxBR19SRVFVRVNUKSB7CisJCQkvKiBXZSBhcmUgc2VuZGluZyBhIHJlcXVlc3QgaXNzdWVkIGxvY2FsbHksIG5vdGhpbmcgc3BlY2lhbCB0byBsb2cgKi8KKwkJfSBlbHNlIHsKKwkJCS8qIFdlIGhhdmUgZ2VuZXJhdGVkIGFuIGFud2VyLCBsb2cgdGhlIHRpbWUgaXQgdG9vayBzaW5jZSB0aGUgY29ycmVzcG9uZGluZyByZXF1ZXN0IHdhcyByZWNlaXZlZCAqLworCQkJc3RydWN0IGZkX2hvb2tfcGVybXNnZGF0YSAqcXBtZCA9IGZkX2hvb2tfZ2V0X3JlcXVlc3RfcG1kKG10X2RhdGFfaGRsLCBtc2cpOworCQkJaWYgKHFwbWQtPnJlY2VpdmVkX29uLnR2X3NlYykgeworCQkJCXN0cnVjdCB0aW1lc3BlYyBkZWxheTsKKwkJCQlUU19ESUZGRVJFTkNFKCAmZGVsYXksICZxcG1kLT5yZWNlaXZlZF9vbiwgJnBtZC0+c2VudF9vbiApOworCQkJCUNIRUNLX01BTExPQ19ETyggZmRfbXNnX2R1bXBfc3VtbWFyeSgmYnVmLCAmbGVuLCBOVUxMLCBtc2csIE5VTEwsIDAsIDEpLCByZXR1cm4gKTsKKwkJCQlMT0dfTigiW1RJTUlOR10gQU5TICVsZC4lMDZsZCBzZWMgLT4nJXMnOiAlcyIsIChsb25nKWRlbGF5LnR2X3NlYywgZGVsYXkudHZfbnNlYyAvIDEwMDAsIHBlZXIgPyBwZWVyLT5pbmZvLnBpX2RpYW1pZCA6ICI8dW5pZGVudGlmaWVkPiIsIGJ1Zik7CisJCQl9CisJCX0KKwl9CisJCQorCWZyZWUoYnVmKTsKK30KKworLyogRW50cnkgcG9pbnQgKi8KK3N0YXRpYyBpbnQgbXRfbWFpbihjaGFyICogY29uZmZpbGUpCit7CisJVFJBQ0VfRU5UUlkoIiVwIiwgY29uZmZpbGUpOworCQorCUNIRUNLX0ZDVCggZmRfaG9va19kYXRhX3JlZ2lzdGVyKCBzaXplb2Yoc3RydWN0IGZkX2hvb2tfcGVybXNnZGF0YSksIE5VTEwsIE5VTEwsICZtdF9kYXRhX2hkbCApICk7CisJCisJQ0hFQ0tfRkNUKCBmZF9ob29rX3JlZ2lzdGVyKCBIT09LX01BU0soIEhPT0tfTUVTU0FHRV9SRUNFSVZFRCwgSE9PS19NRVNTQUdFX1NFTlQsIEhPT0tfREFUQV9SRUNFSVZFRCApLCAKKwkJCQkJbXRfaG9va19jYiwgTlVMTCwgbXRfZGF0YV9oZGwsICZtdF9oZGwpICk7CisJCisJcmV0dXJuIDA7Cit9CisKKy8qIENsZWFudXAgKi8KK3ZvaWQgZmRfZXh0X2Zpbmkodm9pZCkKK3sKKwlUUkFDRV9FTlRSWSgpOworCUNIRUNLX0ZDVF9ETyggZmRfaG9va191bnJlZ2lzdGVyKCBtdF9oZGwgKSwgKTsKKwlyZXR1cm4gOworfQorCitFWFRFTlNJT05fRU5UUlkoImRiZ19tc2dfdGltaW5nIiwgbXRfbWFpbik7CmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RiZ19ydC9DTWFrZUxpc3RzLnR4dCBiL2V4dGVuc2lvbnMvZGJnX3J0L0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZTcwODQKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RiZ19ydC9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDEzIEBACisjIFRoZSBydF9kZWJ1ZyBleHRlbnNpb24KK1BST0pFQ1QoIlJvdXRpbmcgbW9kdWxlIGRlYnVnIGV4dGVuc2lvbiIgQykKKworIyBDb21waWxlIGFzIGEgbW9kdWxlCitGRF9BRERfRVhURU5TSU9OKGRiZ19ydCBkYmdfcnQuYykKKworCisjIyMjCisjIyBJTlNUQUxMIHNlY3Rpb24gIyMKKworSU5TVEFMTChUQVJHRVRTIGRiZ19ydAorCUxJQlJBUlkgREVTVElOQVRJT04gJHtJTlNUQUxMX0VYVEVOU0lPTlNfU1VGRklYfQorCUNPTVBPTkVOVCBmcmVlRGlhbWV0ZXItZGVidWctdG9vbHMpCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RiZ19ydC9kYmdfcnQuYyBiL2V4dGVuc2lvbnMvZGJnX3J0L2RiZ19ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNmUxOGUKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RiZ19ydC9kYmdfcnQuYwpAQCAtMCwwICsxLDEwNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTMsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAKKyAqIERlYnVnLW9ubHkgZXh0ZW5zaW9uIGZvciByb3V0aW5nIG1vZHVsZTsgCisgKiBkaXNwbGF5cyBzdGF0ZSBpbmZvcm1hdGlvbiBhdCB0aGUgZW5kIG9mIHJvdXRpbmcgaW5mb3JtYXRpb24gcHJvY2Vzcy4KKyAqLworI2luY2x1ZGUgPGZyZWVEaWFtZXRlci9leHRlbnNpb24uaD4KKworc3RhdGljIHN0cnVjdCBmZF9ydF9md2RfaGRsICogZndkX2hkbCA9IE5VTEw7CitzdGF0aWMgc3RydWN0IGZkX3J0X291dF9oZGwgKiBvdXRfaGRsID0gTlVMTDsKKworLyogUHJveHlpbmcgZGVidWcgY2FsbGJhY2sgKi8KK3N0YXRpYyBpbnQgZGJncnRfZndkX2NiKHZvaWQgKiBjYmRhdGEsIHN0cnVjdCBtc2cgKiogbXNnKQoreworCWNoYXIgKiBidWYgPSBOVUxMOyBzaXplX3QgYnVmbGVuOworCVRSQUNFX0VOVFJZKCIlcCAlcCIsIGNiZGF0YSwgbXNnKTsKKwkKKwlMT0dfRCgiW2RiZ19ydF0gRldEIHJvdXRpbmcgbWVzc2FnZTogJXAiLCBtc2cgPyAqbXNnIDogTlVMTCk7CisJaWYgKG1zZykgeworCQlDSEVDS19NQUxMT0MoIGZkX21zZ19kdW1wX3RyZWV2aWV3KCZidWYsICZidWZsZW4sIE5VTEwsICptc2csIE5VTEwsIDAsIDEpICk7CisJCUxPR19EKCIlcyIsIGJ1Zik7CisJfQorCWZyZWUoYnVmKTsKKwlyZXR1cm4gMDsKK30KKworLyogUGF0aCBzZWxlY3Rpb24gZGVidWcgY2FsbGJhY2sgKi8KK3N0YXRpYyBpbnQgZGJncnRfb3V0X2NiKHZvaWQgKiBjYmRhdGEsIHN0cnVjdCBtc2cgKiogcG1zZywgc3RydWN0IGZkX2xpc3QgKiBjYW5kaWRhdGVzKQoreworCXN0cnVjdCBmZF9saXN0ICogbGk7CisJc3RydWN0IG1zZyAqIG1zZyA9ICpwbXNnOworCWNoYXIgKiBidWYgPSBOVUxMOyBzaXplX3QgYnVmbGVuOworCQorCVRSQUNFX0VOVFJZKCIlcCAlcCAlcCIsIGNiZGF0YSwgbXNnLCBjYW5kaWRhdGVzKTsKKwkKKwlMT0dfRCgiW2RiZ19ydF0gT1VUIHJvdXRpbmcgbWVzc2FnZTogJXAiLCBtc2cpOworCUNIRUNLX01BTExPQyggZmRfbXNnX2R1bXBfdHJlZXZpZXcoJmJ1ZiwgJmJ1ZmxlbiwgTlVMTCwgbXNnLCBOVUxMLCAwLCAxKSApOworCUxPR19EKCIlcyIsIGJ1Zik7CisJTE9HX0QoIltkYmdfcnRdIEN1cnJlbnQgbGlzdCBvZiBjYW5kaWRhdGVzICglcCk6IChzY29yZSAtIGlkKSIsIG1zZyk7CisJCisJZm9yIChsaSA9IGNhbmRpZGF0ZXMtPm5leHQ7IGxpICE9IGNhbmRpZGF0ZXM7IGxpID0gbGktPm5leHQpIHsKKwkJc3RydWN0IHJ0ZF9jYW5kaWRhdGUgKmMgPSAoc3RydWN0IHJ0ZF9jYW5kaWRhdGUgKikgbGk7CisJCUxPR19EKCJbZGJnX3J0XSAgICVkIC1cdCVzIiwgYy0+c2NvcmUsIGMtPmRpYW1pZCk7CisJfQorCQorCXJldHVybiAwOworfQorCisvKiBSZWdpc3RlciB0aGUgY2FsbGJhY2tzIHRvIHRoZSBkYWVtb24gKi8KK3N0YXRpYyBpbnQgZGJncnRfbWFpbihjaGFyICogY29uZmZpbGUpCit7CisJVFJBQ0VfRU5UUlkoIiVwIiwgY29uZmZpbGUpOworCQorCUNIRUNLX0ZDVCggZmRfcnRfZndkX3JlZ2lzdGVyICggZGJncnRfZndkX2NiLCBOVUxMLCBSVF9GV0RfQUxMLCAmZndkX2hkbCApICk7CisJQ0hFQ0tfRkNUKCBmZF9ydF9vdXRfcmVnaXN0ZXIgKCBkYmdydF9vdXRfY2IsIE5VTEwsIC0xIC8qIHNvIHRoYXQgaXQgaXMgY2FsbGVkIGxhdGUgKi8sICZvdXRfaGRsICkgKTsKKworCXJldHVybiAwOworfQorCisvKiBDbGVhbnVwIHRoZSBjYWxsYmFja3MgKi8KK3ZvaWQgZmRfZXh0X2Zpbmkodm9pZCkKK3sKKwlUUkFDRV9FTlRSWSgpOworCQorCS8qIFVucmVnaXN0ZXIgdGhlIG1vZHVsZXMgKi8KKwlDSEVDS19GQ1RfRE8oIGZkX3J0X2Z3ZF91bnJlZ2lzdGVyICggZndkX2hkbCwgTlVMTCApLCAvKiBjb250aW51ZSAqLyApOworCUNIRUNLX0ZDVF9ETyggZmRfcnRfb3V0X3VucmVnaXN0ZXIgKCBvdXRfaGRsLCBOVUxMICksIC8qIGNvbnRpbnVlICovICk7CisJCisJcmV0dXJuIDsKK30KKworLyogRGVmaW5lIHRoZSBlbnRyeSBwb2ludCBmdW5jdGlvbiAqLworRVhURU5TSU9OX0VOVFJZKCJkYmdfcnQiLCBkYmdydF9tYWluKTsKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF8zZ3BwMl9hdnBzLzNncHAyX2F2cHMuZGlkIGIvZXh0ZW5zaW9ucy9kaWN0XzNncHAyX2F2cHMvM2dwcDJfYXZwcy5kaWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MxZGEzYwotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF8zZ3BwMl9hdnBzLzNncHAyX2F2cHMuZGlkCkBAIC0wLDAgKzEgQEAKK2RpY3RfM2dwcDJfYXZwcwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0XzNncHAyX2F2cHMvQ01ha2VMaXN0cy50eHQgYi9leHRlbnNpb25zL2RpY3RfM2dwcDJfYXZwcy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWRhMTkwCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kaWN0XzNncHAyX2F2cHMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxNiBAQAorIyBUaGUgZGljdF8zZ3BwMl9hdnBzIGV4dGVuc2lvbgorUFJPSkVDVCgiZGljdF8zZ3BwMl9hdnBzIGxpYnJhcnkgZ2VuZXJhdGVkIGJ5IEZkR2VuICIgQykKKworIyBDb21waWxlIGFzIGEgbW9kdWxlCitGRF9BRERfRVhURU5TSU9OKGRpY3RfM2dwcDJfYXZwcyBkaWN0XzNncHAyX2F2cHMuYykKKworCisjIyMjCisjIyBJTlNUQUxMIHNlY3Rpb24gIyMKKworSU5TVEFMTChUQVJHRVRTIGRpY3RfM2dwcDJfYXZwcworCUxJQlJBUlkgREVTVElOQVRJT04gJHtJTlNUQUxMX0VYVEVOU0lPTlNfU1VGRklYfQorQ09NUE9ORU5UIGZyZWVEaWFtZXRlci1kaWN0aW9uYXJ5LTNHUFAyX0FWUFMpCisKKworCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfM2dwcDJfYXZwcy9kaWN0XzNncHAyX2F2cHMuYyBiL2V4dGVuc2lvbnMvZGljdF8zZ3BwMl9hdnBzL2RpY3RfM2dwcDJfYXZwcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwM2I1MWMKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfM2dwcDJfYXZwcy9kaWN0XzNncHAyX2F2cHMuYwpAQCAtMCwwICsxLDE4NCBAQAorLyoKKyogQ29weXJpZ2h0IChjKSAyMDE3IFNwcmludAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvKioqKioqKioqKioqKioqKgorIEdlbmVyYXRlZCBCeTogZmR0b29sIGVuaGFuY2VtZW50cyB0byBkaWFmdXp6ZXIKKyBMaWNlbnNlOiBzYW1lIGFzIGZyZWVEaWFtZXRlcgorKioqKioqKioqKioqKioqKi8KKworCisvKiAKKyAqIERpY3Rpb25hcnkgZGVmaW5pdGlvbnMgb2Ygb2JqZWN0cyBzcGVjaWZpZWQgaW4gM2dwcDJfYXZwcy4KKyAqLworI2luY2x1ZGUgPGZyZWVEaWFtZXRlci9leHRlbnNpb24uaD4KKworI2RlZmluZSBQUk9UT19WRVIgInVuc3BlY2lmaWVkIgorI2RlZmluZSBHRU5fREFURSAgMTUwNjY5NzE4NC45MQorCitjb25zdCBjaGFyICpfM2dwcDJfYXZwc19wcm90b192ZXIgPSBQUk9UT19WRVI7Citjb25zdCBkb3VibGUgXzNncHAyX2F2cHNfZ2VuX2RhdGUgPSBHRU5fREFURTsKKworLyogVGhlIGNvbnRlbnQgb2YgdGhpcyBmaWxlIGZvbGxvd3MgdGhlIHNhbWUgc3RydWN0dXJlIGFzIGRpY3RfYmFzZV9wcm90by5jICovCisKKyNkZWZpbmUgQ0hFQ0tfZGljdF9uZXcoIF90eXBlLCBfZGF0YSwgX3BhcmVudCwgX3JlZiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgX3JldCA9IGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIChfdHlwZSksIChfZGF0YSksIChfcGFyZW50KSwgKF9yZWYpICk7IFwKKyAgICBpZiAoIF9yZXQgIT0gMCAmJiBfcmV0ICE9IEVFWElTVCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICByZXR1cm4gX3JldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBDSEVDS19kaWN0X3NlYXJjaCggX3R5cGUsIF9jcml0ZXJpYSwgX3doYXQsIF9yZXN1bHQgKQkJXAorICAgIENIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIChfdHlwZSksIChfY3JpdGVyaWEpLCAoX3doYXQpLCAoX3Jlc3VsdCksIEVOT0VOVCkgKTsKKworc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24geworICAgIHN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lOworICAgIGVudW0gcnVsZV9wb3NpdGlvbglwb3NpdGlvbjsKKyAgICBpbnQgCQkJbWluOworICAgIGludAkJCW1heDsKK307CisKKyNkZWZpbmUgUlVMRV9PUkRFUiggX3Bvc2l0aW9uICkgKCgoKF9wb3NpdGlvbikgPT0gUlVMRV9GSVhFRF9IRUFEKSB8fCAoKF9wb3NpdGlvbikgPT0gUlVMRV9GSVhFRF9UQUlMKSkgPyAxIDogMCApCisKKy8qIEF0dGVudGlvbiEgVGhpcyB2ZXJzaW9uIG9mIHRoZSBtYWNybyB1c2VzIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsIGluIGNvbnRyYXN0IHRvIG1vc3Qgb3RoZXIgY29waWVzISAqLworI2RlZmluZSBQQVJTRV9sb2NfcnVsZXMoIF9ydWxlYXJyYXksIF9wYXJlbnQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBfX2FyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yIChfX2FyPTA7IF9fYXIgPCBzaXplb2YoX3J1bGVhcnJheSkgLyBzaXplb2YoKF9ydWxlYXJyYXkpWzBdKTsgX19hcisrKSB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHN0cnVjdCBkaWN0X3J1bGVfZGF0YSBfX2RhdGEgPSB7IE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ucG9zaXRpb24sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLm1pbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ubWF4fTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfX2RhdGEucnVsZV9vcmRlciA9IFJVTEVfT1JERVIoX19kYXRhLnJ1bGVfcG9zaXRpb24pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIENIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIERJQ1RfQVZQLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAmKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICZfX2RhdGEucnVsZV9hdnAsIDAgKSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmICggIV9fZGF0YS5ydWxlX2F2cCApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9ERUJVRyhJTkZPLCAiQVZQIE5vdCBmb3VuZDogJyVzJyIsIChfcnVsZWFycmF5KVtfX2FyXS5hdnBfdmVuZG9yX3BsdXNfbmFtZS5hdnBfbmFtZSk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFTk9FTlQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgX3JldCA9IGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfUlVMRSwgJihfX2RhdGEpLCAoX3BhcmVudCksIE5VTEwgKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggX3JldCAhPSAwICYmIF9yZXQgIT0gRUVYSVNUICkgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFX0RFQlVHKElORk8sICJFcnJvciBvbiBydWxlIHdpdGggQVZQICclcyciLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLmF2cF9uYW1lKTsgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRUlOVkFMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgQ0hFQ0tfdmVuZG9yX25ldyggX2RhdGEgKSB7IFwKKyAgICAgICAgc3RydWN0IGRpY3Rfb2JqZWN0ICogdmVuZG9yX2ZvdW5kOyBcCisgICAgICAgIGlmIChmZF9kaWN0X3NlYXJjaChmZF9nX2NvbmZpZy0+Y25mX2RpY3QsRElDVF9WRU5ET1IsVkVORE9SX0JZX0lELCZfZGF0YS52ZW5kb3JfaWQsJnZlbmRvcl9mb3VuZCxFTk9FTlQpID09IEVOT0VOVCkgeyBcCisgICAgICAgICAgICAgICAgQ0hFQ0tfRkNUKGZkX2RpY3RfbmV3KGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9WRU5ET1IsICZfZGF0YSwgTlVMTCwgTlVMTCkpOyBcCisgICAgICAgIH0gXAorfQorCisjZGVmaW5lIGVudW12YWxfZGVmX3UzMiggX3ZhbF8sIF9zdHJfICkJCVwKKyAgICB7IF9zdHJfLCAJCXsgLnUzMiA9IF92YWxfIH19CisKKyNkZWZpbmUgZW51bXZhbF9kZWZfb3MoIF9sZW5fLCBfdmFsXywgX3N0cl8gKQkJCQlcCisgICAgeyBfc3RyXywgCQl7IC5vcyA9IHsgLmRhdGEgPSAodW5zaWduZWQgY2hhciAqKV92YWxfLCAubGVuID0gX2xlbl8gfX19CisKKworc3RhdGljIGludCBkaWN0XzNncHAyX2F2cHNfbG9hZF9kZWZzKGNoYXIgKiBjb25mZmlsZSkKK3sKKyAgIFRSQUNFX0VOVFJZKCIlcCIsIGNvbmZmaWxlKTsKKwkvKiBBcHBsaWNhdGlvbiBTZWN0aW9uICovCisJeworCQkvKiBDcmVhdGUgdGhlIHZlbmRvcnMgKi8JCXsKKwkJCXN0cnVjdCBkaWN0X3ZlbmRvcl9kYXRhIHZlbmRvcl9kYXRhID0geyA1NTM1LCAiM0dQUDIiIH07CisJCQlDSEVDS19kaWN0X25ldyhESUNUX1ZFTkRPUiwgJnZlbmRvcl9kYXRhLCBOVUxMLCBOVUxMKQorCQl9CisJfQorCisKKyAgIC8qIEFWUCBzZWN0aW9uICovCisgICB7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIEFkZHJlc3NfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogVVRGOFN0cmluZ190eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBEaWFtZXRlcklkZW50aXR5X3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIERpYW1ldGVyVVJJX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIFRpbWVfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogSVBGaWx0ZXJSdWxlX3R5cGU7CisKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiQWRkcmVzcyIsICZBZGRyZXNzX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJVVEY4U3RyaW5nIiwgJlVURjhTdHJpbmdfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkRpYW1ldGVySWRlbnRpdHkiLCAmRGlhbWV0ZXJJZGVudGl0eV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiRGlhbWV0ZXJVUkkiLCAmRGlhbWV0ZXJVUklfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIlRpbWUiLCAmVGltZV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiSVBGaWx0ZXJSdWxlIiwgJklQRmlsdGVyUnVsZV90eXBlKTsKKwkJLyogM0dQUDItQlNJRCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTkwMTAsCS8qIENvZGUgKi8KKwkJCQk1NTM1LAkvKiBWZW5kb3IgKi8KKwkJCQkiM0dQUDItQlNJRCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKworCQorICAgfQorCisgICAvKiBDb21tYW5kcyBzZWN0aW9uICovCisgICB7CisKKyAgIH0KKworICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGljdF8zZ3BwMl9hdnBzX2xvYWRfcnVsZXMoY2hhciAqIGNvbmZmaWxlKQoreworICAgLyogR3JvdXBlZCBBVlAgc2VjdGlvbiAqLworICAgeworCisgICB9CQorCisgICAvKiBDb21tYW5kcyBzZWN0aW9uICovCisgICB7CisKKyAgIH0KKworICAgTE9HX0QoICJFeHRlbnNpb24gJ0RpY3Rpb25hcnkgZGVmaW5pdGlvbnMgZm9yIDNncHAyX2F2cHMgKE5vbmUpJyBpbml0aWFsaXplZCIpOworICAgcmV0dXJuIDA7Cit9CisKK2ludCBkaWN0X2VudHJ5KGNoYXIgKiBjb25mZmlsZSkKK3sKKwlkaWN0XzNncHAyX2F2cHNfbG9hZF9kZWZzKGNvbmZmaWxlKTsKKwlyZXR1cm4gZGljdF8zZ3BwMl9hdnBzX2xvYWRfcnVsZXMoY29uZmZpbGUpOworfQorCitjb25zdCBjaGFyKiBkaWN0XzNncHAyX2F2cHNfcHJvdG9fdmVyKGNoYXIgKiBjb25mZmlsZSkgeworCXJldHVybiBfM2dwcDJfYXZwc19wcm90b192ZXI7Cit9CisKK2NvbnN0IGRvdWJsZSBkaWN0XzNncHAyX2F2cHNfZ2VuX3RzKGNoYXIgKiBjb25mZmlsZSkgeworCXJldHVybiBfM2dwcDJfYXZwc19nZW5fZGF0ZTsKK30KKworRVhURU5TSU9OX0VOVFJZMigiZGljdF8zZ3BwMl9hdnBzIiwgZGljdF8zZ3BwMl9hdnBzX2xvYWRfZGVmcywgZGljdF8zZ3BwMl9hdnBzX2xvYWRfcnVsZXMpOworCisKKwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X0NyZWRpdENvbnRyb2wvQ01ha2VMaXN0cy50eHQgYi9leHRlbnNpb25zL2RpY3RfQ3JlZGl0Q29udHJvbC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWU3ZDQzCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kaWN0X0NyZWRpdENvbnRyb2wvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxNiBAQAorIyBUaGUgZGljdF9DcmVkaXRDb250cm9sIGV4dGVuc2lvbgorUFJPSkVDVCgiZGljdF9DcmVkaXRDb250cm9sIGxpYnJhcnkgZ2VuZXJhdGVkIGJ5IEZkR2VuICIgQykKKworIyBDb21waWxlIGFzIGEgbW9kdWxlCitGRF9BRERfRVhURU5TSU9OKGRpY3RfQ3JlZGl0Q29udHJvbCBkaWN0X0NyZWRpdENvbnRyb2wuYykKKworCisjIyMjCisjIyBJTlNUQUxMIHNlY3Rpb24gIyMKKworSU5TVEFMTChUQVJHRVRTIGRpY3RfQ3JlZGl0Q29udHJvbAorCUxJQlJBUlkgREVTVElOQVRJT04gJHtJTlNUQUxMX0VYVEVOU0lPTlNfU1VGRklYfQorQ09NUE9ORU5UIGZyZWVEaWFtZXRlci1kaWN0aW9uYXJ5LUNSRURJVENPTlRST0wpCisKKworCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfQ3JlZGl0Q29udHJvbC9DcmVkaXRDb250cm9sLmRpZCBiL2V4dGVuc2lvbnMvZGljdF9DcmVkaXRDb250cm9sL0NyZWRpdENvbnRyb2wuZGlkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2OGFiYWEKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfQ3JlZGl0Q29udHJvbC9DcmVkaXRDb250cm9sLmRpZApAQCAtMCwwICsxLDUgQEAKK2RpY3RfcmZjNDAwNF9hdnBzCitkaWN0X3JmYzcxNTVfYXZwcworZGljdF9yZmM1Nzc3X2F2cHMKK2RpY3RfcmZjNDAwNmJpc19hdnBzCitkaWN0X0NyZWRpdENvbnRyb2wKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF9DcmVkaXRDb250cm9sL2RpY3RfQ3JlZGl0Q29udHJvbC5jIGIvZXh0ZW5zaW9ucy9kaWN0X0NyZWRpdENvbnRyb2wvZGljdF9DcmVkaXRDb250cm9sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QzYmE3YwotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF9DcmVkaXRDb250cm9sL2RpY3RfQ3JlZGl0Q29udHJvbC5jCkBAIC0wLDAgKzEsMjg2IEBACisvKgorKiBDb3B5cmlnaHQgKGMpIDIwMTcgU3ByaW50CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKy8qKioqKioqKioqKioqKioqCisgR2VuZXJhdGVkIEJ5OiBmZHRvb2wgZW5oYW5jZW1lbnRzIHRvIGRpYWZ1enplcgorIExpY2Vuc2U6IHNhbWUgYXMgZnJlZURpYW1ldGVyCisqKioqKioqKioqKioqKioqLworCisKKy8qIAorICogRGljdGlvbmFyeSBkZWZpbml0aW9ucyBvZiBvYmplY3RzIHNwZWNpZmllZCBpbiBDcmVkaXRDb250cm9sIChyZmM0MDA2YmlzKS4KKyAqLworI2luY2x1ZGUgPGZyZWVEaWFtZXRlci9leHRlbnNpb24uaD4KKworI2RlZmluZSBQUk9UT19WRVIgInJmYzQwMDZiaXMiCisjZGVmaW5lIEdFTl9EQVRFICAxNTA2Njk3MTIxLjcyCisKK2NvbnN0IGNoYXIgKmNyZWRpdGNvbnRyb2xfcHJvdG9fdmVyID0gUFJPVE9fVkVSOworY29uc3QgZG91YmxlIGNyZWRpdGNvbnRyb2xfZ2VuX2RhdGUgPSBHRU5fREFURTsKKworLyogVGhlIGNvbnRlbnQgb2YgdGhpcyBmaWxlIGZvbGxvd3MgdGhlIHNhbWUgc3RydWN0dXJlIGFzIGRpY3RfYmFzZV9wcm90by5jICovCisKKyNkZWZpbmUgQ0hFQ0tfZGljdF9uZXcoIF90eXBlLCBfZGF0YSwgX3BhcmVudCwgX3JlZiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgX3JldCA9IGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIChfdHlwZSksIChfZGF0YSksIChfcGFyZW50KSwgKF9yZWYpICk7IFwKKyAgICBpZiAoIF9yZXQgIT0gMCAmJiBfcmV0ICE9IEVFWElTVCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICByZXR1cm4gX3JldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBDSEVDS19kaWN0X3NlYXJjaCggX3R5cGUsIF9jcml0ZXJpYSwgX3doYXQsIF9yZXN1bHQgKQkJXAorICAgIENIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIChfdHlwZSksIChfY3JpdGVyaWEpLCAoX3doYXQpLCAoX3Jlc3VsdCksIEVOT0VOVCkgKTsKKworc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24geworICAgIHN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lOworICAgIGVudW0gcnVsZV9wb3NpdGlvbglwb3NpdGlvbjsKKyAgICBpbnQgCQkJbWluOworICAgIGludAkJCW1heDsKK307CisKKyNkZWZpbmUgUlVMRV9PUkRFUiggX3Bvc2l0aW9uICkgKCgoKF9wb3NpdGlvbikgPT0gUlVMRV9GSVhFRF9IRUFEKSB8fCAoKF9wb3NpdGlvbikgPT0gUlVMRV9GSVhFRF9UQUlMKSkgPyAxIDogMCApCisKKy8qIEF0dGVudGlvbiEgVGhpcyB2ZXJzaW9uIG9mIHRoZSBtYWNybyB1c2VzIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsIGluIGNvbnRyYXN0IHRvIG1vc3Qgb3RoZXIgY29waWVzISAqLworI2RlZmluZSBQQVJTRV9sb2NfcnVsZXMoIF9ydWxlYXJyYXksIF9wYXJlbnQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBfX2FyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yIChfX2FyPTA7IF9fYXIgPCBzaXplb2YoX3J1bGVhcnJheSkgLyBzaXplb2YoKF9ydWxlYXJyYXkpWzBdKTsgX19hcisrKSB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHN0cnVjdCBkaWN0X3J1bGVfZGF0YSBfX2RhdGEgPSB7IE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ucG9zaXRpb24sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLm1pbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ubWF4fTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfX2RhdGEucnVsZV9vcmRlciA9IFJVTEVfT1JERVIoX19kYXRhLnJ1bGVfcG9zaXRpb24pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIENIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIERJQ1RfQVZQLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAmKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICZfX2RhdGEucnVsZV9hdnAsIDAgKSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmICggIV9fZGF0YS5ydWxlX2F2cCApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9ERUJVRyhJTkZPLCAiQVZQIE5vdCBmb3VuZDogJyVzJyIsIChfcnVsZWFycmF5KVtfX2FyXS5hdnBfdmVuZG9yX3BsdXNfbmFtZS5hdnBfbmFtZSk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFTk9FTlQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgX3JldCA9IGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfUlVMRSwgJihfX2RhdGEpLCAoX3BhcmVudCksIE5VTEwgKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggX3JldCAhPSAwICYmIF9yZXQgIT0gRUVYSVNUICkgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFX0RFQlVHKElORk8sICJFcnJvciBvbiBydWxlIHdpdGggQVZQICclcyciLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLmF2cF9uYW1lKTsgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRUlOVkFMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgQ0hFQ0tfdmVuZG9yX25ldyggX2RhdGEgKSB7IFwKKyAgICAgICAgc3RydWN0IGRpY3Rfb2JqZWN0ICogdmVuZG9yX2ZvdW5kOyBcCisgICAgICAgIGlmIChmZF9kaWN0X3NlYXJjaChmZF9nX2NvbmZpZy0+Y25mX2RpY3QsRElDVF9WRU5ET1IsVkVORE9SX0JZX0lELCZfZGF0YS52ZW5kb3JfaWQsJnZlbmRvcl9mb3VuZCxFTk9FTlQpID09IEVOT0VOVCkgeyBcCisgICAgICAgICAgICAgICAgQ0hFQ0tfRkNUKGZkX2RpY3RfbmV3KGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9WRU5ET1IsICZfZGF0YSwgTlVMTCwgTlVMTCkpOyBcCisgICAgICAgIH0gXAorfQorCisjZGVmaW5lIGVudW12YWxfZGVmX3UzMiggX3ZhbF8sIF9zdHJfICkJCVwKKyAgICB7IF9zdHJfLCAJCXsgLnUzMiA9IF92YWxfIH19CisKKyNkZWZpbmUgZW51bXZhbF9kZWZfb3MoIF9sZW5fLCBfdmFsXywgX3N0cl8gKQkJCQlcCisgICAgeyBfc3RyXywgCQl7IC5vcyA9IHsgLmRhdGEgPSAodW5zaWduZWQgY2hhciAqKV92YWxfLCAubGVuID0gX2xlbl8gfX19CisKKworc3RhdGljIGludCBkaWN0X2NyZWRpdGNvbnRyb2xfbG9hZF9kZWZzKGNoYXIgKiBjb25mZmlsZSkKK3sKKyAgIFRSQUNFX0VOVFJZKCIlcCIsIGNvbmZmaWxlKTsKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhcHBfaWQ0OworCisJLyogQXBwbGljYXRpb24gU2VjdGlvbiAqLworCXsKKwkgIHsKKwkJCXN0cnVjdCBkaWN0X2FwcGxpY2F0aW9uX2RhdGEgZGF0YSA9IHsgNCwgIkNyZWRpdENvbnRyb2wiIH07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BUFBMSUNBVElPTiwgJmRhdGEsIE5VTEwsICZhcHBfaWQ0KQorCSAgfQorCSAgLyogUmVzdWx0IGNvZGVzICovCisJICB7CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKnR5cGU7CisJCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkVudW1lcmF0ZWQoUmVzdWx0LUNvZGUpIiwmdHlwZSk7CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgImlzIiwgeyAudTMyPTEwIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJTZXJ2aWNlcyIsIHsgLnUzMj0zIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMgPSB7ICJLUyIsIHsgLnUzMj02NjI1MSB9fTsKKworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMsIHR5cGUsIE5VTEwpOworCisJICB9CisJfQorCisKKyAgIC8qIEFWUCBzZWN0aW9uICovCisgICB7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIEFkZHJlc3NfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogVVRGOFN0cmluZ190eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBEaWFtZXRlcklkZW50aXR5X3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIERpYW1ldGVyVVJJX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIFRpbWVfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogSVBGaWx0ZXJSdWxlX3R5cGU7CisKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiQWRkcmVzcyIsICZBZGRyZXNzX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJVVEY4U3RyaW5nIiwgJlVURjhTdHJpbmdfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkRpYW1ldGVySWRlbnRpdHkiLCAmRGlhbWV0ZXJJZGVudGl0eV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiRGlhbWV0ZXJVUkkiLCAmRGlhbWV0ZXJVUklfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIlRpbWUiLCAmVGltZV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiSVBGaWx0ZXJSdWxlIiwgJklQRmlsdGVyUnVsZV90eXBlKTsKKworCQorICAgfQorCisgICAvKiBDb21tYW5kcyBzZWN0aW9uICovCisgICB7CisJCS8qIENyZWRpdC1Db250cm9sLVJlcXVlc3QgKi8KKwkJeworCQkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCQlzdHJ1Y3QgZGljdF9jbWRfZGF0YSBkYXRhID0geworCQkJCTI3MiwJLyogQ29kZSAqLworCQkJCSJDcmVkaXQtQ29udHJvbC1SZXF1ZXN0IiwJLyogTmFtZSAqLworCQkJCUNNRF9GTEFHX1JFUVVFU1QgfCBDTURfRkxBR19FUlJPUiwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlDTURfRkxBR19SRVFVRVNUIHwgQ01EX0ZMQUdfUFJPWElBQkxFLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJfTsKKworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQ09NTUFORCwgJmRhdGEgLCBhcHBfaWQ0LCAmY21kKQorCQl9CisJCS8qIENyZWRpdC1Db250cm9sLUFuc3dlciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJCXN0cnVjdCBkaWN0X2NtZF9kYXRhIGRhdGEgPSB7CisJCQkJMjcyLAkvKiBDb2RlICovCisJCQkJIkNyZWRpdC1Db250cm9sLUFuc3dlciIsCS8qIE5hbWUgKi8KKwkJCQlDTURfRkxBR19SRVFVRVNULAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUNNRF9GTEFHX1BST1hJQUJMRSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCX07CisKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0NPTU1BTkQsICZkYXRhICwgYXBwX2lkNCwgJmNtZCkKKwkJfQorCisgICB9CisKKyAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRpY3RfY3JlZGl0Y29udHJvbF9sb2FkX3J1bGVzKGNoYXIgKiBjb25mZmlsZSkKK3sKKyAgIC8qIEdyb3VwZWQgQVZQIHNlY3Rpb24gKi8KKyAgIHsKKworICAgfQkKKworICAgLyogQ29tbWFuZHMgc2VjdGlvbiAqLworICAgeworCSAgLyogQ3JlZGl0LUNvbnRyb2wtUmVxdWVzdCAqLworCSAgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJDcmVkaXQtQ29udHJvbC1SZXF1ZXN0IiwgJmNtZCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTZXNzaW9uLUlkIn0sIFJVTEVfRklYRURfSEVBRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLUhvc3QifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLVJlYWxtIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRlc3RpbmF0aW9uLVJlYWxtIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkF1dGgtQXBwbGljYXRpb24tSWQifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU2VydmljZS1Db250ZXh0LUlkIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkNDLVJlcXVlc3QtVHlwZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJDQy1SZXF1ZXN0LU51bWJlciJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEZXN0aW5hdGlvbi1Ib3N0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlVzZXItTmFtZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJDQy1TdWItU2Vzc2lvbi1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBY2N0LU11bHRpLVNlc3Npb24tSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLVN0YXRlLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkV2ZW50LVRpbWVzdGFtcCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTdWJzY3JpcHRpb24tSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU3Vic2NyaXB0aW9uLUlkLUV4dGVuc2lvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTZXJ2aWNlLUlkZW50aWZpZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVGVybWluYXRpb24tQ2F1c2UifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUmVxdWVzdGVkLVNlcnZpY2UtVW5pdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSZXF1ZXN0ZWQtQWN0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlVzZWQtU2VydmljZS1Vbml0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk11bHRpcGxlLVNlcnZpY2VzLUluZGljYXRvciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJNdWx0aXBsZS1TZXJ2aWNlcy1DcmVkaXQtQ29udHJvbCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTZXJ2aWNlLVBhcmFtZXRlci1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkNDLUNvcnJlbGF0aW9uLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlVzZXItRXF1aXBtZW50LUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVXNlci1FcXVpcG1lbnQtSW5mby1FeHRlbnNpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUHJveHktSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSb3V0ZS1SZWNvcmQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKHJ1bGVzLCBjbWQpOworCSAgfQorCSAgLyogQ3JlZGl0LUNvbnRyb2wtQW5zd2VyICovCisJICB7CisJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIkNyZWRpdC1Db250cm9sLUFuc3dlciIsICZjbWQpCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU2Vzc2lvbi1JZCJ9LCBSVUxFX0ZJWEVEX0hFQUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJlc3VsdC1Db2RlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1Ib3N0In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBdXRoLUFwcGxpY2F0aW9uLUlkIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkNDLVJlcXVlc3QtVHlwZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJDQy1SZXF1ZXN0LU51bWJlciJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJVc2VyLU5hbWUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQ0MtU2Vzc2lvbi1GYWlsb3ZlciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJDQy1TdWItU2Vzc2lvbi1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBY2N0LU11bHRpLVNlc3Npb24tSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLVN0YXRlLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkV2ZW50LVRpbWVzdGFtcCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJHcmFudGVkLVNlcnZpY2UtVW5pdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJNdWx0aXBsZS1TZXJ2aWNlcy1DcmVkaXQtQ29udHJvbCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJDb3N0LUluZm9ybWF0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkZpbmFsLVVuaXQtSW5kaWNhdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJRb1MtRmluYWwtVW5pdC1JbmRpY2F0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkNoZWNrLUJhbGFuY2UtUmVzdWx0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkNyZWRpdC1Db250cm9sLUZhaWx1cmUtSGFuZGxpbmcifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRGlyZWN0LURlYml0aW5nLUZhaWx1cmUtSGFuZGxpbmcifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVmFsaWRpdHktVGltZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSZWRpcmVjdC1Ib3N0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJlZGlyZWN0LUhvc3QtVXNhZ2UifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUmVkaXJlY3QtTWF4LUNhY2hlLVRpbWUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUHJveHktSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSb3V0ZS1SZWNvcmQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRmFpbGVkLUFWUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMocnVsZXMsIGNtZCk7CisJICB9CisKKyAgIH0KKworICAgTE9HX0QoICJFeHRlbnNpb24gJ0RpY3Rpb25hcnkgZGVmaW5pdGlvbnMgZm9yIENyZWRpdENvbnRyb2wgKHJmYzQwMDZiaXMpJyBpbml0aWFsaXplZCIpOworICAgcmV0dXJuIDA7Cit9CisKK2ludCBkaWN0X2VudHJ5KGNoYXIgKiBjb25mZmlsZSkKK3sKKwlkaWN0X2NyZWRpdGNvbnRyb2xfbG9hZF9kZWZzKGNvbmZmaWxlKTsKKwlyZXR1cm4gZGljdF9jcmVkaXRjb250cm9sX2xvYWRfcnVsZXMoY29uZmZpbGUpOworfQorCitjb25zdCBjaGFyKiBkaWN0X2NyZWRpdGNvbnRyb2xfcHJvdG9fdmVyKGNoYXIgKiBjb25mZmlsZSkgeworCXJldHVybiBjcmVkaXRjb250cm9sX3Byb3RvX3ZlcjsKK30KKworY29uc3QgZG91YmxlIGRpY3RfY3JlZGl0Y29udHJvbF9nZW5fdHMoY2hhciAqIGNvbmZmaWxlKSB7CisJcmV0dXJuIGNyZWRpdGNvbnRyb2xfZ2VuX2RhdGU7Cit9CisKK0VYVEVOU0lPTl9FTlRSWTIoImRpY3RfY3JlZGl0Y29udHJvbCIsIGRpY3RfY3JlZGl0Y29udHJvbF9sb2FkX2RlZnMsIGRpY3RfY3JlZGl0Y29udHJvbF9sb2FkX3J1bGVzLCAiZGljdF9yZmM0MDA2YmlzX2F2cHMiLCAiZGljdF9yZmM3MTU1X2F2cHMiLCAiZGljdF9yZmM1Nzc3X2F2cHMiKTsKKworCisKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF9DeER4L0NNYWtlTGlzdHMudHh0IGIvZXh0ZW5zaW9ucy9kaWN0X0N4RHgvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE2YzEzNgotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF9DeER4L0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTYgQEAKKyMgVGhlIGRpY3RfQ3hEeCBleHRlbnNpb24KK1BST0pFQ1QoImRpY3RfQ3hEeCBsaWJyYXJ5IGdlbmVyYXRlZCBieSBGZEdlbiAiIEMpCisKKyMgQ29tcGlsZSBhcyBhIG1vZHVsZQorRkRfQUREX0VYVEVOU0lPTihkaWN0X0N4RHggZGljdF9DeER4LmMpCisKKworIyMjIworIyMgSU5TVEFMTCBzZWN0aW9uICMjCisKK0lOU1RBTEwoVEFSR0VUUyBkaWN0X0N4RHgKKwlMSUJSQVJZIERFU1RJTkFUSU9OICR7SU5TVEFMTF9FWFRFTlNJT05TX1NVRkZJWH0KK0NPTVBPTkVOVCBmcmVlRGlhbWV0ZXItZGljdGlvbmFyeS1DWERYKQorCisKKwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X0N4RHgvQ3hEeC5kaWQgYi9leHRlbnNpb25zL2RpY3RfQ3hEeC9DeER4LmRpZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjQwN2ZiCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kaWN0X0N4RHgvQ3hEeC5kaWQKQEAgLTAsMCArMSw5IEBACitkaWN0X3RzMjkyMjlfYXZwcworZGljdF9yZmM3NjgzX2F2cHMKK2RpY3RfZXRzaTI4MzAzNF9hdnBzCitkaWN0X3JmYzQ1OTBfYXZwcworZGljdF9kcmFmdGxvYWRfYXZwcworZGljdF9yZmM3OTQ0X2F2cHMKK2RpY3RfcmZjNDAwNF9hdnBzCitkaWN0X3JmYzcxNTVfYXZwcworZGljdF9DeER4CmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfQ3hEeC9kaWN0X0N4RHguYyBiL2V4dGVuc2lvbnMvZGljdF9DeER4L2RpY3RfQ3hEeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmYzg3ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfQ3hEeC9kaWN0X0N4RHguYwpAQCAtMCwwICsxLDY1NiBAQAorLyoKKyogQ29weXJpZ2h0IChjKSAyMDE3IFNwcmludAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvKioqKioqKioqKioqKioqKgorIEdlbmVyYXRlZCBCeTogZmR0b29sIGVuaGFuY2VtZW50cyB0byBkaWFmdXp6ZXIKKyBMaWNlbnNlOiBzYW1lIGFzIGZyZWVEaWFtZXRlcgorKioqKioqKioqKioqKioqKi8KKworCisvKiAKKyAqIERpY3Rpb25hcnkgZGVmaW5pdGlvbnMgb2Ygb2JqZWN0cyBzcGVjaWZpZWQgaW4gQ3hEeCAoZTEwKS4KKyAqLworI2luY2x1ZGUgPGZyZWVEaWFtZXRlci9leHRlbnNpb24uaD4KKworI2RlZmluZSBQUk9UT19WRVIgImUxMCIKKyNkZWZpbmUgR0VOX0RBVEUgIDE1MDY2OTcyMTIuMjUKKworY29uc3QgY2hhciAqY3hkeF9wcm90b192ZXIgPSBQUk9UT19WRVI7Citjb25zdCBkb3VibGUgY3hkeF9nZW5fZGF0ZSA9IEdFTl9EQVRFOworCisvKiBUaGUgY29udGVudCBvZiB0aGlzIGZpbGUgZm9sbG93cyB0aGUgc2FtZSBzdHJ1Y3R1cmUgYXMgZGljdF9iYXNlX3Byb3RvLmMgKi8KKworI2RlZmluZSBDSEVDS19kaWN0X25ldyggX3R5cGUsIF9kYXRhLCBfcGFyZW50LCBfcmVmICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBfcmV0ID0gZmRfZGljdF9uZXcoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgKF90eXBlKSwgKF9kYXRhKSwgKF9wYXJlbnQpLCAoX3JlZikgKTsgXAorICAgIGlmICggX3JldCAhPSAwICYmIF9yZXQgIT0gRUVYSVNUICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHJldHVybiBfcmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIENIRUNLX2RpY3Rfc2VhcmNoKCBfdHlwZSwgX2NyaXRlcmlhLCBfd2hhdCwgX3Jlc3VsdCApCQlcCisgICAgQ0hFQ0tfRkNUKCAgZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgKF90eXBlKSwgKF9jcml0ZXJpYSksIChfd2hhdCksIChfcmVzdWx0KSwgRU5PRU5UKSApOworCitzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiB7CisgICAgc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWU7CisgICAgZW51bSBydWxlX3Bvc2l0aW9uCXBvc2l0aW9uOworICAgIGludCAJCQltaW47CisgICAgaW50CQkJbWF4OworfTsKKworI2RlZmluZSBSVUxFX09SREVSKCBfcG9zaXRpb24gKSAoKCgoX3Bvc2l0aW9uKSA9PSBSVUxFX0ZJWEVEX0hFQUQpIHx8ICgoX3Bvc2l0aW9uKSA9PSBSVUxFX0ZJWEVEX1RBSUwpKSA/IDEgOiAwICkKKworLyogQXR0ZW50aW9uISBUaGlzIHZlcnNpb24gb2YgdGhlIG1hY3JvIHVzZXMgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgaW4gY29udHJhc3QgdG8gbW9zdCBvdGhlciBjb3BpZXMhICovCisjZGVmaW5lIFBBUlNFX2xvY19ydWxlcyggX3J1bGVhcnJheSwgX3BhcmVudCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IF9fYXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKF9fYXI9MDsgX19hciA8IHNpemVvZihfcnVsZWFycmF5KSAvIHNpemVvZigoX3J1bGVhcnJheSlbMF0pOyBfX2FyKyspIHsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgc3RydWN0IGRpY3RfcnVsZV9kYXRhIF9fZGF0YSA9IHsgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5wb3NpdGlvbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ubWluLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5tYXh9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIF9fZGF0YS5ydWxlX29yZGVyID0gUlVMRV9PUkRFUihfX2RhdGEucnVsZV9wb3NpdGlvbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgQ0hFQ0tfRkNUKCAgZmRfZGljdF9zZWFyY2goICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgRElDVF9BVlAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICYoX3J1bGVhcnJheSlbX19hcl0uYXZwX3ZlbmRvcl9wbHVzX25hbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgJl9fZGF0YS5ydWxlX2F2cCwgMCApICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYgKCAhX19kYXRhLnJ1bGVfYXZwICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFX0RFQlVHKElORk8sICJBVlAgTm90IGZvdW5kOiAnJXMnIiwgKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLmF2cF9uYW1lKTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVOT0VOVDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBfcmV0ID0gZmRfZGljdF9uZXcoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9SVUxFLCAmKF9fZGF0YSksIChfcGFyZW50KSwgTlVMTCApOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBfcmV0ICE9IDAgJiYgX3JldCAhPSBFRVhJU1QgKSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfREVCVUcoSU5GTywgIkVycm9yIG9uIHJ1bGUgd2l0aCBBVlAgJyVzJyIsICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0uYXZwX3ZlbmRvcl9wbHVzX25hbWUuYXZwX25hbWUpOyAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFSU5WQUw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBDSEVDS192ZW5kb3JfbmV3KCBfZGF0YSApIHsgXAorICAgICAgICBzdHJ1Y3QgZGljdF9vYmplY3QgKiB2ZW5kb3JfZm91bmQ7IFwKKyAgICAgICAgaWYgKGZkX2RpY3Rfc2VhcmNoKGZkX2dfY29uZmlnLT5jbmZfZGljdCxESUNUX1ZFTkRPUixWRU5ET1JfQllfSUQsJl9kYXRhLnZlbmRvcl9pZCwmdmVuZG9yX2ZvdW5kLEVOT0VOVCkgPT0gRU5PRU5UKSB7IFwKKyAgICAgICAgICAgICAgICBDSEVDS19GQ1QoZmRfZGljdF9uZXcoZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1ZFTkRPUiwgJl9kYXRhLCBOVUxMLCBOVUxMKSk7IFwKKyAgICAgICAgfSBcCit9CisKKyNkZWZpbmUgZW51bXZhbF9kZWZfdTMyKCBfdmFsXywgX3N0cl8gKQkJXAorICAgIHsgX3N0cl8sIAkJeyAudTMyID0gX3ZhbF8gfX0KKworI2RlZmluZSBlbnVtdmFsX2RlZl9vcyggX2xlbl8sIF92YWxfLCBfc3RyXyApCQkJCVwKKyAgICB7IF9zdHJfLCAJCXsgLm9zID0geyAuZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopX3ZhbF8sIC5sZW4gPSBfbGVuXyB9fX0KKworCitzdGF0aWMgaW50IGRpY3RfY3hkeF9sb2FkX2RlZnMoY2hhciAqIGNvbmZmaWxlKQoreworICAgVFJBQ0VfRU5UUlkoIiVwIiwgY29uZmZpbGUpOworCXN0cnVjdCBkaWN0X29iamVjdCAqIGFwcF9pZDE2Nzc3MjE2OworCisJLyogQXBwbGljYXRpb24gU2VjdGlvbiAqLworCXsKKwkgIHsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIHZlbmRvcjsKKwkJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfVkVORE9SLCBWRU5ET1JfQllfTkFNRSwgIjNHUFAiLCAmdmVuZG9yKQorCQkJc3RydWN0IGRpY3RfYXBwbGljYXRpb25fZGF0YSBkYXRhID0geyAxNjc3NzIxNiwgIkN4RHgiIH07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BUFBMSUNBVElPTiwgJmRhdGEsIHZlbmRvciwgJmFwcF9pZDE2Nzc3MjE2KQorCSAgfQorCSAgLyogUmVzdWx0IGNvZGVzICovCisJICB7CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKnR5cGU7CisJCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkVudW1lcmF0ZWQoUmVzdWx0LUNvZGUpIiwmdHlwZSk7CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIkRpc2NvdmVyeV9vZl9zdXBwb3J0ZWRfaW50ZXJmYWNlX3ZlcnNpb25zIiwgeyAudTMyPTEgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIlN1cHBvcnRlZF9mZWF0dXJlcyIsIHsgLnUzMj0yIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMgPSB7ICJJbnRlcmZhY2VfdmVyc2lvbnMiLCB7IC51MzI9MyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF80ID0geyAiQXBwbGljYXRpb25fSURfdmFsdWUiLCB7IC51MzI9NCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF81ID0geyAiU3BlY2lhbF9SZXF1aXJlbWVudHMiLCB7IC51MzI9NyB9fTsKKworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF81LCB0eXBlLCBOVUxMKTsKKworCSAgfQorCX0KKworCisgICAvKiBBVlAgc2VjdGlvbiAqLworICAgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBBZGRyZXNzX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIFVURjhTdHJpbmdfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogRGlhbWV0ZXJJZGVudGl0eV90eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBEaWFtZXRlclVSSV90eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBUaW1lX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIElQRmlsdGVyUnVsZV90eXBlOworCisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkFkZHJlc3MiLCAmQWRkcmVzc190eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiVVRGOFN0cmluZyIsICZVVEY4U3RyaW5nX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJEaWFtZXRlcklkZW50aXR5IiwgJkRpYW1ldGVySWRlbnRpdHlfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkRpYW1ldGVyVVJJIiwgJkRpYW1ldGVyVVJJX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJUaW1lIiwgJlRpbWVfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIklQRmlsdGVyUnVsZSIsICZJUEZpbHRlclJ1bGVfdHlwZSk7CisKKwkKKyAgIH0KKworICAgLyogQ29tbWFuZHMgc2VjdGlvbiAqLworICAgeworCQkvKiBVc2VyLUF1dGhvcml6YXRpb24tUmVxdWVzdCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJCXN0cnVjdCBkaWN0X2NtZF9kYXRhIGRhdGEgPSB7CisJCQkJMzAwLAkvKiBDb2RlICovCisJCQkJIlVzZXItQXV0aG9yaXphdGlvbi1SZXF1ZXN0IiwJLyogTmFtZSAqLworCQkJCUNNRF9GTEFHX1JFUVVFU1QgfCBDTURfRkxBR19FUlJPUiwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlDTURfRkxBR19SRVFVRVNUIHwgQ01EX0ZMQUdfUFJPWElBQkxFLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJfTsKKworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQ09NTUFORCwgJmRhdGEgLCBhcHBfaWQxNjc3NzIxNiwgJmNtZCkKKwkJfQorCQkvKiBVc2VyLUF1dGhvcml6YXRpb24tQW5zd2VyICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQkJc3RydWN0IGRpY3RfY21kX2RhdGEgZGF0YSA9IHsKKwkJCQkzMDAsCS8qIENvZGUgKi8KKwkJCQkiVXNlci1BdXRob3JpemF0aW9uLUFuc3dlciIsCS8qIE5hbWUgKi8KKwkJCQlDTURfRkxBR19SRVFVRVNULAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUNNRF9GTEFHX1BST1hJQUJMRSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCX07CisKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0NPTU1BTkQsICZkYXRhICwgYXBwX2lkMTY3NzcyMTYsICZjbWQpCisJCX0KKwkJLyogU2VydmVyLUFzc2lnbm1lbnQtUmVxdWVzdCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJCXN0cnVjdCBkaWN0X2NtZF9kYXRhIGRhdGEgPSB7CisJCQkJMzAxLAkvKiBDb2RlICovCisJCQkJIlNlcnZlci1Bc3NpZ25tZW50LVJlcXVlc3QiLAkvKiBOYW1lICovCisJCQkJQ01EX0ZMQUdfUkVRVUVTVCB8IENNRF9GTEFHX0VSUk9SLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUNNRF9GTEFHX1JFUVVFU1QgfCBDTURfRkxBR19QUk9YSUFCTEUsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQl9OworCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9DT01NQU5ELCAmZGF0YSAsIGFwcF9pZDE2Nzc3MjE2LCAmY21kKQorCQl9CisJCS8qIFNlcnZlci1Bc3NpZ25tZW50LUFuc3dlciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJCXN0cnVjdCBkaWN0X2NtZF9kYXRhIGRhdGEgPSB7CisJCQkJMzAxLAkvKiBDb2RlICovCisJCQkJIlNlcnZlci1Bc3NpZ25tZW50LUFuc3dlciIsCS8qIE5hbWUgKi8KKwkJCQlDTURfRkxBR19SRVFVRVNULAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUNNRF9GTEFHX1BST1hJQUJMRSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCX07CisKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0NPTU1BTkQsICZkYXRhICwgYXBwX2lkMTY3NzcyMTYsICZjbWQpCisJCX0KKwkJLyogTG9jYXRpb24tSW5mby1SZXF1ZXN0ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQkJc3RydWN0IGRpY3RfY21kX2RhdGEgZGF0YSA9IHsKKwkJCQkzMDIsCS8qIENvZGUgKi8KKwkJCQkiTG9jYXRpb24tSW5mby1SZXF1ZXN0IiwJLyogTmFtZSAqLworCQkJCUNNRF9GTEFHX1JFUVVFU1QgfCBDTURfRkxBR19FUlJPUiwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlDTURfRkxBR19SRVFVRVNUIHwgQ01EX0ZMQUdfUFJPWElBQkxFLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJfTsKKworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQ09NTUFORCwgJmRhdGEgLCBhcHBfaWQxNjc3NzIxNiwgJmNtZCkKKwkJfQorCQkvKiBMb2NhdGlvbi1JbmZvLUFuc3dlciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJCXN0cnVjdCBkaWN0X2NtZF9kYXRhIGRhdGEgPSB7CisJCQkJMzAyLAkvKiBDb2RlICovCisJCQkJIkxvY2F0aW9uLUluZm8tQW5zd2VyIiwJLyogTmFtZSAqLworCQkJCUNNRF9GTEFHX1JFUVVFU1QsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQ01EX0ZMQUdfUFJPWElBQkxFLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJfTsKKworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQ09NTUFORCwgJmRhdGEgLCBhcHBfaWQxNjc3NzIxNiwgJmNtZCkKKwkJfQorCQkvKiBNdWx0aW1lZGlhLUF1dGgtUmVxdWVzdCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJCXN0cnVjdCBkaWN0X2NtZF9kYXRhIGRhdGEgPSB7CisJCQkJMzAzLAkvKiBDb2RlICovCisJCQkJIk11bHRpbWVkaWEtQXV0aC1SZXF1ZXN0IiwJLyogTmFtZSAqLworCQkJCUNNRF9GTEFHX1JFUVVFU1QgfCBDTURfRkxBR19FUlJPUiwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlDTURfRkxBR19SRVFVRVNUIHwgQ01EX0ZMQUdfUFJPWElBQkxFLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJfTsKKworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQ09NTUFORCwgJmRhdGEgLCBhcHBfaWQxNjc3NzIxNiwgJmNtZCkKKwkJfQorCQkvKiBNdWx0aW1lZGlhLUF1dGgtQW5zd2VyICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQkJc3RydWN0IGRpY3RfY21kX2RhdGEgZGF0YSA9IHsKKwkJCQkzMDMsCS8qIENvZGUgKi8KKwkJCQkiTXVsdGltZWRpYS1BdXRoLUFuc3dlciIsCS8qIE5hbWUgKi8KKwkJCQlDTURfRkxBR19SRVFVRVNULAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUNNRF9GTEFHX1BST1hJQUJMRSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCX07CisKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0NPTU1BTkQsICZkYXRhICwgYXBwX2lkMTY3NzcyMTYsICZjbWQpCisJCX0KKwkJLyogUmVnaXN0cmF0aW9uLVRlcm1pbmF0aW9uLVJlcXVlc3QgKi8KKwkJeworCQkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCQlzdHJ1Y3QgZGljdF9jbWRfZGF0YSBkYXRhID0geworCQkJCTMwNCwJLyogQ29kZSAqLworCQkJCSJSZWdpc3RyYXRpb24tVGVybWluYXRpb24tUmVxdWVzdCIsCS8qIE5hbWUgKi8KKwkJCQlDTURfRkxBR19SRVFVRVNUIHwgQ01EX0ZMQUdfRVJST1IsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQ01EX0ZMQUdfUkVRVUVTVCB8IENNRF9GTEFHX1BST1hJQUJMRSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCX07CisKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0NPTU1BTkQsICZkYXRhICwgYXBwX2lkMTY3NzcyMTYsICZjbWQpCisJCX0KKwkJLyogUmVnaXN0cmF0aW9uLVRlcm1pbmF0aW9uLUFuc3dlciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJCXN0cnVjdCBkaWN0X2NtZF9kYXRhIGRhdGEgPSB7CisJCQkJMzA0LAkvKiBDb2RlICovCisJCQkJIlJlZ2lzdHJhdGlvbi1UZXJtaW5hdGlvbi1BbnN3ZXIiLAkvKiBOYW1lICovCisJCQkJQ01EX0ZMQUdfUkVRVUVTVCwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlDTURfRkxBR19QUk9YSUFCTEUsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQl9OworCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9DT01NQU5ELCAmZGF0YSAsIGFwcF9pZDE2Nzc3MjE2LCAmY21kKQorCQl9CisJCS8qIFB1c2gtUHJvZmlsZS1SZXF1ZXN0ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQkJc3RydWN0IGRpY3RfY21kX2RhdGEgZGF0YSA9IHsKKwkJCQkzMDUsCS8qIENvZGUgKi8KKwkJCQkiUHVzaC1Qcm9maWxlLVJlcXVlc3QiLAkvKiBOYW1lICovCisJCQkJQ01EX0ZMQUdfUkVRVUVTVCB8IENNRF9GTEFHX0VSUk9SLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUNNRF9GTEFHX1JFUVVFU1QgfCBDTURfRkxBR19QUk9YSUFCTEUsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQl9OworCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9DT01NQU5ELCAmZGF0YSAsIGFwcF9pZDE2Nzc3MjE2LCAmY21kKQorCQl9CisJCS8qIFB1c2gtUHJvZmlsZS1BbnN3ZXIgKi8KKwkJeworCQkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCQlzdHJ1Y3QgZGljdF9jbWRfZGF0YSBkYXRhID0geworCQkJCTMwNSwJLyogQ29kZSAqLworCQkJCSJQdXNoLVByb2ZpbGUtQW5zd2VyIiwJLyogTmFtZSAqLworCQkJCUNNRF9GTEFHX1JFUVVFU1QsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQ01EX0ZMQUdfUFJPWElBQkxFLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJfTsKKworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQ09NTUFORCwgJmRhdGEgLCBhcHBfaWQxNjc3NzIxNiwgJmNtZCkKKwkJfQorCisgICB9CisKKyAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRpY3RfY3hkeF9sb2FkX3J1bGVzKGNoYXIgKiBjb25mZmlsZSkKK3sKKyAgIC8qIEdyb3VwZWQgQVZQIHNlY3Rpb24gKi8KKyAgIHsKKworICAgfQkKKworICAgLyogQ29tbWFuZHMgc2VjdGlvbiAqLworICAgeworCSAgLyogVXNlci1BdXRob3JpemF0aW9uLVJlcXVlc3QgKi8KKwkgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX0NPTU1BTkQsIENNRF9CWV9OQU1FLCAiVXNlci1BdXRob3JpemF0aW9uLVJlcXVlc3QiLCAmY21kKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlNlc3Npb24tSWQifSwgUlVMRV9GSVhFRF9IRUFELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEUk1QIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlZlbmRvci1TcGVjaWZpYy1BcHBsaWNhdGlvbi1JZCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBdXRoLVNlc3Npb24tU3RhdGUifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLUhvc3QifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLVJlYWxtIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRlc3RpbmF0aW9uLUhvc3QifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRGVzdGluYXRpb24tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVXNlci1OYW1lIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9DLVN1cHBvcnRlZC1GZWF0dXJlcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU3VwcG9ydGVkLUZlYXR1cmVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQdWJsaWMtSWRlbnRpdHkifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlZpc2l0ZWQtTmV0d29yay1JZGVudGlmaWVyIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJVc2VyLUF1dGhvcml6YXRpb24tVHlwZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVUFSLUZsYWdzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlByb3h5LUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUm91dGUtUmVjb3JkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyhydWxlcywgY21kKTsKKwkgIH0KKwkgIC8qIFVzZXItQXV0aG9yaXphdGlvbi1BbnN3ZXIgKi8KKwkgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX0NPTU1BTkQsIENNRF9CWV9OQU1FLCAiVXNlci1BdXRob3JpemF0aW9uLUFuc3dlciIsICZjbWQpCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU2Vzc2lvbi1JZCJ9LCBSVUxFX0ZJWEVEX0hFQUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRSTVAifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVmVuZG9yLVNwZWNpZmljLUFwcGxpY2F0aW9uLUlkIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJlc3VsdC1Db2RlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkV4cGVyaW1lbnRhbC1SZXN1bHQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQXV0aC1TZXNzaW9uLVN0YXRlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1Ib3N0In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPQy1TdXBwb3J0ZWQtRmVhdHVyZXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT0MtT0xSIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkxvYWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlN1cHBvcnRlZC1GZWF0dXJlcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU2VydmVyLU5hbWUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNlcnZlci1DYXBhYmlsaXRpZXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRmFpbGVkLUFWUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJQcm94eS1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJvdXRlLVJlY29yZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMocnVsZXMsIGNtZCk7CisJICB9CisJICAvKiBTZXJ2ZXItQXNzaWdubWVudC1SZXF1ZXN0ICovCisJICB7CisJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIlNlcnZlci1Bc3NpZ25tZW50LVJlcXVlc3QiLCAmY21kKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlNlc3Npb24tSWQifSwgUlVMRV9GSVhFRF9IRUFELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEUk1QIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlZlbmRvci1TcGVjaWZpYy1BcHBsaWNhdGlvbi1JZCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBdXRoLVNlc3Npb24tU3RhdGUifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLUhvc3QifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLVJlYWxtIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRlc3RpbmF0aW9uLUhvc3QifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRGVzdGluYXRpb24tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVXNlci1OYW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9DLVN1cHBvcnRlZC1GZWF0dXJlcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU3VwcG9ydGVkLUZlYXR1cmVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQdWJsaWMtSWRlbnRpdHkifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIldpbGRjYXJkZWQtUHVibGljLUlkZW50aXR5In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTZXJ2ZXItTmFtZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU2VydmVyLUFzc2lnbm1lbnQtVHlwZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVXNlci1EYXRhLUFscmVhZHktQXZhaWxhYmxlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTQ1NDRi1SZXN0b3JhdGlvbi1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNdWx0aXBsZS1SZWdpc3RyYXRpb24tSW5kaWNhdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU2Vzc2lvbi1Qcmlvcml0eSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU0FSLUZsYWdzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlByb3h5LUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUm91dGUtUmVjb3JkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyhydWxlcywgY21kKTsKKwkgIH0KKwkgIC8qIFNlcnZlci1Bc3NpZ25tZW50LUFuc3dlciAqLworCSAgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJTZXJ2ZXItQXNzaWdubWVudC1BbnN3ZXIiLCAmY21kKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlNlc3Npb24tSWQifSwgUlVMRV9GSVhFRF9IRUFELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEUk1QIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlZlbmRvci1TcGVjaWZpYy1BcHBsaWNhdGlvbi1JZCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSZXN1bHQtQ29kZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJFeHBlcmltZW50YWwtUmVzdWx0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkF1dGgtU2Vzc2lvbi1TdGF0ZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tSG9zdCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVXNlci1OYW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9DLVN1cHBvcnRlZC1GZWF0dXJlcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPQy1PTFIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiTG9hZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU3VwcG9ydGVkLUZlYXR1cmVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJVc2VyLURhdGEifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNoYXJnaW5nLUluZm9ybWF0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBc3NvY2lhdGVkLUlkZW50aXRpZXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkxvb3NlLVJvdXRlLUluZGljYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNDU0NGLVJlc3RvcmF0aW9uLUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFzc29jaWF0ZWQtUmVnaXN0ZXJlZC1JZGVudGl0aWVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTZXJ2ZXItTmFtZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiV2lsZGNhcmRlZC1QdWJsaWMtSWRlbnRpdHkifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlByaXZpbGVkZ2VkLVNlbmRlci1JbmRpY2F0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBbGxvd2VkLVdBRi1XV1NGLUlkZW50aXRpZXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRmFpbGVkLUFWUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJQcm94eS1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJvdXRlLVJlY29yZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMocnVsZXMsIGNtZCk7CisJICB9CisJICAvKiBMb2NhdGlvbi1JbmZvLVJlcXVlc3QgKi8KKwkgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX0NPTU1BTkQsIENNRF9CWV9OQU1FLCAiTG9jYXRpb24tSW5mby1SZXF1ZXN0IiwgJmNtZCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTZXNzaW9uLUlkIn0sIFJVTEVfRklYRURfSEVBRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRFJNUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJWZW5kb3ItU3BlY2lmaWMtQXBwbGljYXRpb24tSWQifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQXV0aC1TZXNzaW9uLVN0YXRlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1Ib3N0In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEZXN0aW5hdGlvbi1Ib3N0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRlc3RpbmF0aW9uLVJlYWxtIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJPcmlnaW5hdGluZy1SZXF1ZXN0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9DLVN1cHBvcnRlZC1GZWF0dXJlcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU3VwcG9ydGVkLUZlYXR1cmVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQdWJsaWMtSWRlbnRpdHkifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlVzZXItQXV0aG9yaXphdGlvbi1UeXBlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTZXNzaW9uLVByaW9yaXR5In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlByb3h5LUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUm91dGUtUmVjb3JkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyhydWxlcywgY21kKTsKKwkgIH0KKwkgIC8qIExvY2F0aW9uLUluZm8tQW5zd2VyICovCisJICB7CisJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIkxvY2F0aW9uLUluZm8tQW5zd2VyIiwgJmNtZCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTZXNzaW9uLUlkIn0sIFJVTEVfRklYRURfSEVBRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRFJNUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJWZW5kb3ItU3BlY2lmaWMtQXBwbGljYXRpb24tSWQifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUmVzdWx0LUNvZGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRXhwZXJpbWVudGFsLVJlc3VsdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBdXRoLVNlc3Npb24tU3RhdGUifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLUhvc3QifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLVJlYWxtIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9DLVN1cHBvcnRlZC1GZWF0dXJlcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPQy1PTFIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiTG9hZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU3VwcG9ydGVkLUZlYXR1cmVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTZXJ2ZXItTmFtZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU2VydmVyLUNhcGFiaWxpdGllcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiV2lsZGNhcmRlZC1QdWJsaWMtSWRlbnRpdHkifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkxJQS1GbGFncyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJGYWlsZWQtQVZQIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlByb3h5LUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUm91dGUtUmVjb3JkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyhydWxlcywgY21kKTsKKwkgIH0KKwkgIC8qIE11bHRpbWVkaWEtQXV0aC1SZXF1ZXN0ICovCisJICB7CisJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIk11bHRpbWVkaWEtQXV0aC1SZXF1ZXN0IiwgJmNtZCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTZXNzaW9uLUlkIn0sIFJVTEVfRklYRURfSEVBRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRFJNUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJWZW5kb3ItU3BlY2lmaWMtQXBwbGljYXRpb24tSWQifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQXV0aC1TZXNzaW9uLVN0YXRlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1Ib3N0In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEZXN0aW5hdGlvbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEZXN0aW5hdGlvbi1Ib3N0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlVzZXItTmFtZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPQy1TdXBwb3J0ZWQtRmVhdHVyZXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlN1cHBvcnRlZC1GZWF0dXJlcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUHVibGljLUlkZW50aXR5In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTSVAtQXV0aC1EYXRhLUl0ZW0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNJUC1OdW1iZXItQXV0aC1JdGVtcyJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU2VydmVyLU5hbWUifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUHJveHktSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSb3V0ZS1SZWNvcmQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKHJ1bGVzLCBjbWQpOworCSAgfQorCSAgLyogTXVsdGltZWRpYS1BdXRoLUFuc3dlciAqLworCSAgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJNdWx0aW1lZGlhLUF1dGgtQW5zd2VyIiwgJmNtZCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTZXNzaW9uLUlkIn0sIFJVTEVfRklYRURfSEVBRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRFJNUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJWZW5kb3ItU3BlY2lmaWMtQXBwbGljYXRpb24tSWQifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUmVzdWx0LUNvZGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRXhwZXJpbWVudGFsLVJlc3VsdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBdXRoLVNlc3Npb24tU3RhdGUifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLUhvc3QifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLVJlYWxtIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlVzZXItTmFtZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPQy1TdXBwb3J0ZWQtRmVhdHVyZXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT0MtT0xSIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkxvYWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlN1cHBvcnRlZC1GZWF0dXJlcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUHVibGljLUlkZW50aXR5In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTSVAtTnVtYmVyLUF1dGgtSXRlbXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNJUC1BdXRoLURhdGEtSXRlbSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJGYWlsZWQtQVZQIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlByb3h5LUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUm91dGUtUmVjb3JkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyhydWxlcywgY21kKTsKKwkgIH0KKwkgIC8qIFJlZ2lzdHJhdGlvbi1UZXJtaW5hdGlvbi1SZXF1ZXN0ICovCisJICB7CisJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIlJlZ2lzdHJhdGlvbi1UZXJtaW5hdGlvbi1SZXF1ZXN0IiwgJmNtZCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTZXNzaW9uLUlkIn0sIFJVTEVfRklYRURfSEVBRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRFJNUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJWZW5kb3ItU3BlY2lmaWMtQXBwbGljYXRpb24tSWQifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQXV0aC1TZXNzaW9uLVN0YXRlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1Ib3N0In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEZXN0aW5hdGlvbi1Ib3N0In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRlc3RpbmF0aW9uLVJlYWxtIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlVzZXItTmFtZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQXNzb2NpYXRlZC1JZGVudGl0aWVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTdXBwb3J0ZWQtRmVhdHVyZXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlB1YmxpYy1JZGVudGl0eSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRGVyZWdpc3RyYXRpb24tUmVhc29uIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlByb3h5LUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUm91dGUtUmVjb3JkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyhydWxlcywgY21kKTsKKwkgIH0KKwkgIC8qIFJlZ2lzdHJhdGlvbi1UZXJtaW5hdGlvbi1BbnN3ZXIgKi8KKwkgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX0NPTU1BTkQsIENNRF9CWV9OQU1FLCAiUmVnaXN0cmF0aW9uLVRlcm1pbmF0aW9uLUFuc3dlciIsICZjbWQpCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU2Vzc2lvbi1JZCJ9LCBSVUxFX0ZJWEVEX0hFQUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlNlc3Npb24tSWQifSwgUlVMRV9GSVhFRF9IRUFELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEUk1QIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlZlbmRvci1TcGVjaWZpYy1BcHBsaWNhdGlvbi1JZCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSZXN1bHQtQ29kZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJFeHBlcmltZW50YWwtUmVzdWx0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkF1dGgtU2Vzc2lvbi1TdGF0ZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tSG9zdCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFzc29jaWF0ZWQtSWRlbnRpdGllcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU3VwcG9ydGVkLUZlYXR1cmVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJJZGVudGl0eS13aXRoLUVtZXJnZW5jeS1SZWdpc3RyYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRmFpbGVkLUFWUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJQcm94eS1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJvdXRlLVJlY29yZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMocnVsZXMsIGNtZCk7CisJICB9CisJICAvKiBQdXNoLVByb2ZpbGUtUmVxdWVzdCAqLworCSAgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJQdXNoLVByb2ZpbGUtUmVxdWVzdCIsICZjbWQpCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU2Vzc2lvbi1JZCJ9LCBSVUxFX0ZJWEVEX0hFQUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRSTVAifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVmVuZG9yLVNwZWNpZmljLUFwcGxpY2F0aW9uLUlkIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkF1dGgtU2Vzc2lvbi1TdGF0ZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tSG9zdCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRGVzdGluYXRpb24tSG9zdCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEZXN0aW5hdGlvbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJVc2VyLU5hbWUifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlN1cHBvcnRlZC1GZWF0dXJlcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVXNlci1EYXRhIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDaGFyZ2luZy1JbmZvcm1hdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU0lQLUF1dGgtRGF0YS1JdGVtIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBbGxvd2VkLVdBRi1XV1NGLUlkZW50aXRpZXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUHJveHktSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSb3V0ZS1SZWNvcmQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKHJ1bGVzLCBjbWQpOworCSAgfQorCSAgLyogUHVzaC1Qcm9maWxlLUFuc3dlciAqLworCSAgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJQdXNoLVByb2ZpbGUtQW5zd2VyIiwgJmNtZCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTZXNzaW9uLUlkIn0sIFJVTEVfRklYRURfSEVBRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRFJNUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJWZW5kb3ItU3BlY2lmaWMtQXBwbGljYXRpb24tSWQifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUmVzdWx0LUNvZGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRXhwZXJpbWVudGFsLVJlc3VsdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBdXRoLVNlc3Npb24tU3RhdGUifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLUhvc3QifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLVJlYWxtIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTdXBwb3J0ZWQtRmVhdHVyZXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRmFpbGVkLUFWUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJQcm94eS1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJvdXRlLVJlY29yZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMocnVsZXMsIGNtZCk7CisJICB9CisKKyAgIH0KKworICAgTE9HX0QoICJFeHRlbnNpb24gJ0RpY3Rpb25hcnkgZGVmaW5pdGlvbnMgZm9yIEN4RHggKGUxMCknIGluaXRpYWxpemVkIik7CisgICByZXR1cm4gMDsKK30KKworaW50IGRpY3RfZW50cnkoY2hhciAqIGNvbmZmaWxlKQoreworCWRpY3RfY3hkeF9sb2FkX2RlZnMoY29uZmZpbGUpOworCXJldHVybiBkaWN0X2N4ZHhfbG9hZF9ydWxlcyhjb25mZmlsZSk7Cit9CisKK2NvbnN0IGNoYXIqIGRpY3RfY3hkeF9wcm90b192ZXIoY2hhciAqIGNvbmZmaWxlKSB7CisJcmV0dXJuIGN4ZHhfcHJvdG9fdmVyOworfQorCitjb25zdCBkb3VibGUgZGljdF9jeGR4X2dlbl90cyhjaGFyICogY29uZmZpbGUpIHsKKwlyZXR1cm4gY3hkeF9nZW5fZGF0ZTsKK30KKworRVhURU5TSU9OX0VOVFJZMigiZGljdF9jeGR4IiwgZGljdF9jeGR4X2xvYWRfZGVmcywgZGljdF9jeGR4X2xvYWRfcnVsZXMsICJkaWN0X3RzMjkyMjlfYXZwcyIsICJkaWN0X2RyYWZ0bG9hZF9hdnBzIiwgImRpY3RfcmZjNDU5MF9hdnBzIiwgImRpY3RfcmZjNzY4M19hdnBzIiwgImRpY3RfcmZjNzE1NV9hdnBzIiwgImRpY3RfZXRzaTI4MzAzNF9hdnBzIiwgImRpY3RfcmZjNzk0NF9hdnBzIik7CisKKworCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfR3gvQ01ha2VMaXN0cy50eHQgYi9leHRlbnNpb25zL2RpY3RfR3gvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA0NTI2ZQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF9HeC9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDE2IEBACisjIFRoZSBkaWN0X0d4IGV4dGVuc2lvbgorUFJPSkVDVCgiZGljdF9HeCBsaWJyYXJ5IGdlbmVyYXRlZCBieSBGZEdlbiAiIEMpCisKKyMgQ29tcGlsZSBhcyBhIG1vZHVsZQorRkRfQUREX0VYVEVOU0lPTihkaWN0X0d4IGRpY3RfR3guYykKKworCisjIyMjCisjIyBJTlNUQUxMIHNlY3Rpb24gIyMKKworSU5TVEFMTChUQVJHRVRTIGRpY3RfR3gKKwlMSUJSQVJZIERFU1RJTkFUSU9OICR7SU5TVEFMTF9FWFRFTlNJT05TX1NVRkZJWH0KK0NPTVBPTkVOVCBmcmVlRGlhbWV0ZXItZGljdGlvbmFyeS1HWCkKKworCisKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF9HeC9HeC5kaWQgYi9leHRlbnNpb25zL2RpY3RfR3gvR3guZGlkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZDNlNWYKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfR3gvR3guZGlkCkBAIC0wLDAgKzEsMzkgQEAKK2RpY3RfcmZjNjk0Ml9hdnBzCitkaWN0X3RzMjk0NjhfYXZwcworZGljdF90czI5MTU0X2F2cHMKK2RpY3RfdHMyOTIxNF9hdnBzCitkaWN0X3RzMjkyMTVfYXZwcworZGljdF90czI5MjE3X2F2cHMKK2RpY3RfM2dwcDJfYXZwcworZGljdF90czI5MzQzX2F2cHMKK2RpY3RfdHMyOTMzOF9hdnBzCitkaWN0X3RzMjkxMjhfYXZwcworZGljdF90czI5MzQ0X2F2cHMKK2RpY3RfdHMyOTM0NV9hdnBzCitkaWN0X3RzMzIyOTlfYXZwcworZGljdF9yZmM2NzM0X2F2cHMKK2RpY3RfcmZjNTc3OF9hdnBzCitkaWN0X3JmYzU1ODBfYXZwcworZGljdF9yZmM0MDcyX2F2cHMKK2RpY3RfdHMyOTI3M19hdnBzCitkaWN0X3RzMjkxNzNfYXZwcworZGljdF90czI5MzM3X2F2cHMKK2RpY3RfZXRzaTI4MzAzNF9hdnBzCitkaWN0X3JmYzQ1OTBfYXZwcworZGljdF90czI5MjI5X2F2cHMKK2RpY3RfZHJhZnRsb2FkX2F2cHMKK2RpY3RfdHMyOTMyOV9hdnBzCitkaWN0X3RzMjkzNjhfYXZwcworZGljdF90czI5MzM2X2F2cHMKK2RpY3RfdHMyOTA2MV9hdnBzCitkaWN0X3JmYzU0NDdfYXZwcworZGljdF90czI5MjcyX2F2cHMKK2RpY3RfcmZjNzY4M19hdnBzCitkaWN0X3JmYzc5NDRfYXZwcworZGljdF90czI5MjEyX2F2cHMKK2RpY3RfQ3JlZGl0Q29udHJvbAorZGljdF9yZmM0MDA0X2F2cHMKK2RpY3RfcmZjNzE1NV9hdnBzCitkaWN0X3JmYzU3NzdfYXZwcworZGljdF9yZmM0MDA2YmlzX2F2cHMKK2RpY3RfR3gKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF9HeC9kaWN0X0d4LmMgYi9leHRlbnNpb25zL2RpY3RfR3gvZGljdF9HeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZjU5OTAKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfR3gvZGljdF9HeC5jCkBAIC0wLDAgKzEsNDM3IEBACisvKgorKiBDb3B5cmlnaHQgKGMpIDIwMTcgU3ByaW50CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKy8qKioqKioqKioqKioqKioqCisgR2VuZXJhdGVkIEJ5OiBmZHRvb2wgZW5oYW5jZW1lbnRzIHRvIGRpYWZ1enplcgorIExpY2Vuc2U6IHNhbWUgYXMgZnJlZURpYW1ldGVyCisqKioqKioqKioqKioqKioqLworCisKKy8qIAorICogRGljdGlvbmFyeSBkZWZpbml0aW9ucyBvZiBvYmplY3RzIHNwZWNpZmllZCBpbiBHeCAoZTMwKS4KKyAqLworI2luY2x1ZGUgPGZyZWVEaWFtZXRlci9leHRlbnNpb24uaD4KKworI2RlZmluZSBQUk9UT19WRVIgImUzMCIKKyNkZWZpbmUgR0VOX0RBVEUgIDE1MDY2OTcyMDUuMDcKKworY29uc3QgY2hhciAqZ3hfcHJvdG9fdmVyID0gUFJPVE9fVkVSOworY29uc3QgZG91YmxlIGd4X2dlbl9kYXRlID0gR0VOX0RBVEU7CisKKy8qIFRoZSBjb250ZW50IG9mIHRoaXMgZmlsZSBmb2xsb3dzIHRoZSBzYW1lIHN0cnVjdHVyZSBhcyBkaWN0X2Jhc2VfcHJvdG8uYyAqLworCisjZGVmaW5lIENIRUNLX2RpY3RfbmV3KCBfdHlwZSwgX2RhdGEsIF9wYXJlbnQsIF9yZWYgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IF9yZXQgPSBmZF9kaWN0X25ldyggZmRfZ19jb25maWctPmNuZl9kaWN0LCAoX3R5cGUpLCAoX2RhdGEpLCAoX3BhcmVudCksIChfcmVmKSApOyBcCisgICAgaWYgKCBfcmV0ICE9IDAgJiYgX3JldCAhPSBFRVhJU1QgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgcmV0dXJuIF9yZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgQ0hFQ0tfZGljdF9zZWFyY2goIF90eXBlLCBfY3JpdGVyaWEsIF93aGF0LCBfcmVzdWx0ICkJCVwKKyAgICBDSEVDS19GQ1QoICBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCAoX3R5cGUpLCAoX2NyaXRlcmlhKSwgKF93aGF0KSwgKF9yZXN1bHQpLCBFTk9FTlQpICk7CisKK3N0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHsKKyAgICBzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZTsKKyAgICBlbnVtIHJ1bGVfcG9zaXRpb24JcG9zaXRpb247CisgICAgaW50IAkJCW1pbjsKKyAgICBpbnQJCQltYXg7Cit9OworCisjZGVmaW5lIFJVTEVfT1JERVIoIF9wb3NpdGlvbiApICgoKChfcG9zaXRpb24pID09IFJVTEVfRklYRURfSEVBRCkgfHwgKChfcG9zaXRpb24pID09IFJVTEVfRklYRURfVEFJTCkpID8gMSA6IDAgKQorCisvKiBBdHRlbnRpb24hIFRoaXMgdmVyc2lvbiBvZiB0aGUgbWFjcm8gdXNlcyBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCBpbiBjb250cmFzdCB0byBtb3N0IG90aGVyIGNvcGllcyEgKi8KKyNkZWZpbmUgUEFSU0VfbG9jX3J1bGVzKCBfcnVsZWFycmF5LCBfcGFyZW50KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgX19hcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoX19hcj0wOyBfX2FyIDwgc2l6ZW9mKF9ydWxlYXJyYXkpIC8gc2l6ZW9mKChfcnVsZWFycmF5KVswXSk7IF9fYXIrKykgeyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgZGljdF9ydWxlX2RhdGEgX19kYXRhID0geyBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLnBvc2l0aW9uLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5taW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLm1heH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgX19kYXRhLnJ1bGVfb3JkZXIgPSBSVUxFX09SREVSKF9fZGF0YS5ydWxlX3Bvc2l0aW9uKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBDSEVDS19GQ1QoICBmZF9kaWN0X3NlYXJjaCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgZmRfZ19jb25maWctPmNuZl9kaWN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBESUNUX0FWUCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgJihfcnVsZWFycmF5KVtfX2FyXS5hdnBfdmVuZG9yX3BsdXNfbmFtZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAmX19kYXRhLnJ1bGVfYXZwLCAwICkgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpZiAoICFfX2RhdGEucnVsZV9hdnAgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfREVCVUcoSU5GTywgIkFWUCBOb3QgZm91bmQ6ICclcyciLCAoX3J1bGVhcnJheSlbX19hcl0uYXZwX3ZlbmRvcl9wbHVzX25hbWUuYXZwX25hbWUpOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRU5PRU5UOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IF9yZXQgPSBmZF9kaWN0X25ldyggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1JVTEUsICYoX19kYXRhKSwgKF9wYXJlbnQpLCBOVUxMICk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIF9yZXQgIT0gMCAmJiBfcmV0ICE9IEVFWElTVCApICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9ERUJVRyhJTkZPLCAiRXJyb3Igb24gcnVsZSB3aXRoIEFWUCAnJXMnIiwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5hdnBfdmVuZG9yX3BsdXNfbmFtZS5hdnBfbmFtZSk7ICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVJTlZBTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIENIRUNLX3ZlbmRvcl9uZXcoIF9kYXRhICkgeyBcCisgICAgICAgIHN0cnVjdCBkaWN0X29iamVjdCAqIHZlbmRvcl9mb3VuZDsgXAorICAgICAgICBpZiAoZmRfZGljdF9zZWFyY2goZmRfZ19jb25maWctPmNuZl9kaWN0LERJQ1RfVkVORE9SLFZFTkRPUl9CWV9JRCwmX2RhdGEudmVuZG9yX2lkLCZ2ZW5kb3JfZm91bmQsRU5PRU5UKSA9PSBFTk9FTlQpIHsgXAorICAgICAgICAgICAgICAgIENIRUNLX0ZDVChmZF9kaWN0X25ldyhmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfVkVORE9SLCAmX2RhdGEsIE5VTEwsIE5VTEwpKTsgXAorICAgICAgICB9IFwKK30KKworI2RlZmluZSBlbnVtdmFsX2RlZl91MzIoIF92YWxfLCBfc3RyXyApCQlcCisgICAgeyBfc3RyXywgCQl7IC51MzIgPSBfdmFsXyB9fQorCisjZGVmaW5lIGVudW12YWxfZGVmX29zKCBfbGVuXywgX3ZhbF8sIF9zdHJfICkJCQkJXAorICAgIHsgX3N0cl8sIAkJeyAub3MgPSB7IC5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilfdmFsXywgLmxlbiA9IF9sZW5fIH19fQorCisKK3N0YXRpYyBpbnQgZGljdF9neF9sb2FkX2RlZnMoY2hhciAqIGNvbmZmaWxlKQoreworICAgVFJBQ0VfRU5UUlkoIiVwIiwgY29uZmZpbGUpOworCXN0cnVjdCBkaWN0X29iamVjdCAqIGFwcF9pZDE2Nzc3MjI0OworCisJLyogQXBwbGljYXRpb24gU2VjdGlvbiAqLworCXsKKwkgIHsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIHZlbmRvcjsKKwkJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfVkVORE9SLCBWRU5ET1JfQllfTkFNRSwgIjNHUFAiLCAmdmVuZG9yKQorCQkJc3RydWN0IGRpY3RfYXBwbGljYXRpb25fZGF0YSBkYXRhID0geyAxNjc3NzIyNCwgIkd4IiB9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVBQTElDQVRJT04sICZkYXRhLCB2ZW5kb3IsICZhcHBfaWQxNjc3NzIyNCkKKwkgIH0KKwkgIC8qIFJlc3VsdCBjb2RlcyAqLworCSAgeworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICp0eXBlOworCQkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJFbnVtZXJhdGVkKFJlc3VsdC1Db2RlKSIsJnR5cGUpOworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJESUFNRVRFUl9VU0VSX1VOS05PV04iLCB7IC51MzI9NTAzMCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiRElBTUVURVJfRVJST1JfTEFURV9PVkVSTEFQUElOR19SRVFVRVNUIiwgeyAudTMyPTU0NTMgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMyA9IHsgIkRJQU1FVEVSX0VSUk9SX1RJTUVEX09VVF9SRVFVRVNUIiwgeyAudTMyPTU0NTQgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNCA9IHsgIkRJQU1FVEVSX0VSUk9SX0lOSVRJQUxfUEFSQU1FVEVSUyIsIHsgLnUzMj01MTQwIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzUgPSB7ICJESUFNRVRFUl9FUlJPUl9UUklHR0VSX0VWRU5UIiwgeyAudTMyPTUxNDEgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNiA9IHsgIkRJQU1FVEVSX1BDQ19SVUxFX0VWRU5UIiwgeyAudTMyPTUxNDIgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNyA9IHsgIkRJQU1FVEVSX0VSUk9SX0JFQVJFUl9OT1RfQVVUSE9SSVpFRCIsIHsgLnUzMj01MTQzIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzggPSB7ICJESUFNRVRFUl9FUlJPUl9UUkFGRklDX01BUFBJTkdfSU5GT19SRUpFQ1RFRCIsIHsgLnUzMj01MTQ0IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzkgPSB7ICJESUFNRVRFUl9FUlJPUl9DT05GTElDVElOR19SRVFVRVNUIiwgeyAudTMyPTUxNDcgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTAgPSB7ICJESUFNRVRFUl9BRENfUlVMRV9FVkVOVCIsIHsgLnUzMj01MTQ4IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzExID0geyAiRElBTUVURVJfRVJST1JfTkJJRk9NX05PVF9BVVRIT1JJWkVEIiwgeyAudTMyPTUxNDkgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTIgPSB7ICJESUFNRVRFUl9QQ0NfQkVBUkVSX0VWRU5UIiwgeyAudTMyPTQxNDEgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTMgPSB7ICJESUFNRVRFUl9BTl9HV19GQUlMRUQiLCB7IC51MzI9NDE0MyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xNCA9IHsgIkRJQU1FVEVSX1BFTkRJTkdfVFJBTlNBQ1RJT04iLCB7IC51MzI9NDE0NCB9fTsKKworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF81LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzYsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF84LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzksIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTAsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTMsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTQsIHR5cGUsIE5VTEwpOworCisJICB9CisJfQorCisKKyAgIC8qIEFWUCBzZWN0aW9uICovCisgICB7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIEFkZHJlc3NfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogVVRGOFN0cmluZ190eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBEaWFtZXRlcklkZW50aXR5X3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIERpYW1ldGVyVVJJX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIFRpbWVfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogSVBGaWx0ZXJSdWxlX3R5cGU7CisKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiQWRkcmVzcyIsICZBZGRyZXNzX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJVVEY4U3RyaW5nIiwgJlVURjhTdHJpbmdfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkRpYW1ldGVySWRlbnRpdHkiLCAmRGlhbWV0ZXJJZGVudGl0eV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiRGlhbWV0ZXJVUkkiLCAmRGlhbWV0ZXJVUklfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIlRpbWUiLCAmVGltZV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiSVBGaWx0ZXJSdWxlIiwgJklQRmlsdGVyUnVsZV90eXBlKTsKKworCQorICAgfQorCisgICAvKiBDb21tYW5kcyBzZWN0aW9uICovCisgICB7CisKKyAgIH0KKworICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGljdF9neF9sb2FkX3J1bGVzKGNoYXIgKiBjb25mZmlsZSkKK3sKKyAgIC8qIEdyb3VwZWQgQVZQIHNlY3Rpb24gKi8KKyAgIHsKKworICAgfQkKKworICAgLyogQ29tbWFuZHMgc2VjdGlvbiAqLworICAgeworCSAgLyogQ3JlZGl0LUNvbnRyb2wtUmVxdWVzdCAqLworCSAgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJDcmVkaXQtQ29udHJvbC1SZXF1ZXN0IiwgJmNtZCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTZXNzaW9uLUlkIn0sIFJVTEVfRklYRURfSEVBRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRFJNUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBdXRoLUFwcGxpY2F0aW9uLUlkIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1Ib3N0In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEZXN0aW5hdGlvbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJDQy1SZXF1ZXN0LVR5cGUifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQ0MtUmVxdWVzdC1OdW1iZXIifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNyZWRpdC1NYW5hZ2VtZW50LVN0YXR1cyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEZXN0aW5hdGlvbi1Ib3N0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1TdGF0ZS1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTdWJzY3JpcHRpb24tSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT0MtU3VwcG9ydGVkLUZlYXR1cmVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTdXBwb3J0ZWQtRmVhdHVyZXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlRERi1JbmZvcm1hdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTmV0d29yay1SZXF1ZXN0LVN1cHBvcnQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlBhY2tldC1GaWx0ZXItSW5mb3JtYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlBhY2tldC1GaWx0ZXItT3BlcmF0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJCZWFyZXItSWRlbnRpZmllciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQmVhcmVyLU9wZXJhdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRHluYW1pYy1BZGRyZXNzLUZsYWcifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkR5bmFtaWMtQWRkcmVzcy1GbGFnLUV4dGVuc2lvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUEROLUNvbm5lY3Rpb24tQ2hhcmdpbmctSUQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRnJhbWVkLUlQLUFkZHJlc3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRnJhbWVkLUlQdjYtUHJlZml4In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJJUC1DQU4tVHlwZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiM0dQUC1SQVQtVHlwZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQU4tVHJ1c3RlZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUkFULVR5cGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVGVybWluYXRpb24tQ2F1c2UifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVXNlci1FcXVpcG1lbnQtSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUW9TLUluZm9ybWF0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJRb1MtTmVnb3RpYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlFvUy1VcGdyYWRlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJEZWZhdWx0LUVQUy1CZWFyZXItUW9TIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJEZWZhdWx0LVFvUy1JbmZvcm1hdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQU4tR1ctQWRkcmVzcyJ9LCBSVUxFX09QVElPTkFMLCAwLCAyIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFOLUdXLVN0YXR1cyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiM0dQUC1TR1NOLU1DQy1NTkMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIjNHUFAtU0dTTi1BZGRyZXNzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICIzR1BQLVNHU04tSXB2Ni1BZGRyZXNzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICIzR1BQLUdHU04tQWRkcmVzcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiM0dQUC1HR1NOLUlwdjYtQWRkcmVzcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiM0dQUC1TZWxlY3Rpb24tTW9kZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUkFJIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICIzR1BQLVVzZXItTG9jYXRpb24tSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRml4ZWQtVXNlci1Mb2NhdGlvbi1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJVc2VyLUxvY2F0aW9uLUluZm8tVGltZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVXNlci1DU0ctSW5mb3JtYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlRXQU4tSWRlbnRpZmllciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiM0dQUC1NUy1UaW1lWm9uZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUkFOLU5BUy1SZWxlYXNlLUNhdXNlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICIzR1BQLUNoYXJnaW5nLUNoYXJhY3RlcmlzdGljcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJDYWxsZWQtU3RhdGlvbi1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUEROLUNvbm5lY3Rpb24tSUQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkJlYXJlci1Vc2FnZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiT25saW5lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJPZmZsaW5lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJURlQtUGFja2V0LUZpbHRlci1JbmZvcm1hdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ2hhcmdpbmctUnVsZS1SZXBvcnQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFwcGxpY2F0aW9uLURldGVjdGlvbi1JbmZvcm1hdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRXZlbnQtVHJpZ2dlciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRXZlbnQtUmVwb3J0LUluZGljYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFjY2Vzcy1OZXR3b3JrLUNoYXJnaW5nLUFkZHJlc3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFjY2Vzcy1OZXR3b3JrLUNoYXJnaW5nLUlkZW50aWZpZXItR3gifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNvQS1JbmZvcm1hdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVXNhZ2UtTW9uaXRvcmluZy1JbmZvcm1hdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTkJJRk9NLVN1cHBvcnQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk5CSUZPTS1Nb2RlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJEZWZhdWx0LUFjY2VzcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiT3JpZ2luYXRpb24tVGltZS1TdGFtcCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTWF4aW11bS1XYWl0LVRpbWUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFjY2Vzcy1BdmFpbGFiaWxpdHktQ2hhbmdlLVJlYXNvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUm91dGluZy1SdWxlLUluc3RhbGwifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJvdXRpbmctUnVsZS1SZW1vdmUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkhlTkItTG9jYWwtSVAtQWRkcmVzcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVUUtTG9jYWwtSVAtQWRkcmVzcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVURQLVNvdXJjZS1Qb3J0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQcmVzZW5jZS1SZXBvcnRpbmctQXJlYS1JbmZvcm1hdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEzMDE5LCAuYXZwX25hbWUgPSAiTG9naWNhbC1BY2Nlc3MtSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMzAxOSwgLmF2cF9uYW1lID0gIlBoeXNpY2FsLUFjY2Vzcy1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJQcm94eS1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJvdXRlLVJlY29yZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiM0dQUC1QUy1EYXRhLU9mZi1TdGF0dXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKHJ1bGVzLCBjbWQpOworCSAgfQorCSAgLyogQ3JlZGl0LUNvbnRyb2wtQW5zd2VyICovCisJICB7CisJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIkNyZWRpdC1Db250cm9sLUFuc3dlciIsICZjbWQpCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU2Vzc2lvbi1JZCJ9LCBSVUxFX0ZJWEVEX0hFQUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRSTVAifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQXV0aC1BcHBsaWNhdGlvbi1JZCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tSG9zdCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUmVzdWx0LUNvZGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRXhwZXJpbWVudGFsLVJlc3VsdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJDQy1SZXF1ZXN0LVR5cGUifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQ0MtUmVxdWVzdC1OdW1iZXIifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT0MtU3VwcG9ydGVkLUZlYXR1cmVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9DLU9MUiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU3VwcG9ydGVkLUZlYXR1cmVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJCZWFyZXItQ29udHJvbC1Nb2RlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJFdmVudC1UcmlnZ2VyIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJFdmVudC1SZXBvcnQtSW5kaWNhdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tU3RhdGUtSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUmVkaXJlY3QtSG9zdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSZWRpcmVjdC1Ib3N0LVVzYWdlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJlZGlyZWN0LU1heC1DYWNoZS1UaW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDaGFyZ2luZy1SdWxlLVJlbW92ZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ2hhcmdpbmctUnVsZS1JbnN0YWxsIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDaGFyZ2luZy1JbmZvcm1hdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiT25saW5lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJPZmZsaW5lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJRb1MtSW5mb3JtYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJldmFsaWRhdGlvbi1UaW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJEZWZhdWx0LUVQUy1CZWFyZXItUW9TIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJEZWZhdWx0LVFvUy1JbmZvcm1hdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQmVhcmVyLVVzYWdlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJVc2FnZS1Nb25pdG9yaW5nLUluZm9ybWF0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDU0ctSW5mb3JtYXRpb24tUmVwb3J0aW5nIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJVc2VyLUNTRy1JbmZvcm1hdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUFJBLUluc3RhbGwifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlBSQS1SZW1vdmUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlByZXNlbmNlLVJlcG9ydGluZy1BcmVhLUluZm9ybWF0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTZXNzaW9uLVJlbGVhc2UtQ2F1c2UifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk5CSUZPTS1TdXBwb3J0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJOQklGT00tTW9kZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRGVmYXVsdC1BY2Nlc3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJBTi1SdWxlLVN1cHBvcnQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJvdXRpbmctUnVsZS1SZXBvcnQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNvbmRpdGlvbmFsLVBvbGljeS1JbmZvcm1hdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAwLCA0IH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJlbW92YWwtT2YtQWNjZXNzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJJUC1DQU4tVHlwZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJFcnJvci1NZXNzYWdlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkVycm9yLVJlcG9ydGluZy1Ib3N0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkZhaWxlZC1BVlAifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUHJveHktSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSb3V0ZS1SZWNvcmQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiTG9hZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMocnVsZXMsIGNtZCk7CisJICB9CisJICAvKiBSZS1BdXRoLVJlcXVlc3QgKi8KKwkgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX0NPTU1BTkQsIENNRF9CWV9OQU1FLCAiUmUtQXV0aC1SZXF1ZXN0IiwgJmNtZCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTZXNzaW9uLUlkIn0sIFJVTEVfRklYRURfSEVBRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRFJNUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBdXRoLUFwcGxpY2F0aW9uLUlkIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1Ib3N0In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEZXN0aW5hdGlvbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEZXN0aW5hdGlvbi1Ib3N0In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJlLUF1dGgtUmVxdWVzdC1UeXBlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTZXNzaW9uLVJlbGVhc2UtQ2F1c2UifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLVN0YXRlLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9DLVN1cHBvcnRlZC1GZWF0dXJlcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRXZlbnQtVHJpZ2dlciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRXZlbnQtUmVwb3J0LUluZGljYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNoYXJnaW5nLVJ1bGUtUmVtb3ZlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDaGFyZ2luZy1SdWxlLUluc3RhbGwifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkRlZmF1bHQtRVBTLUJlYXJlci1Rb1MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlFvUy1JbmZvcm1hdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRGVmYXVsdC1Rb1MtSW5mb3JtYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJldmFsaWRhdGlvbi1UaW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJVc2FnZS1Nb25pdG9yaW5nLUluZm9ybWF0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQQ1NDRi1SZXN0b3JhdGlvbi1JbmRpY2F0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDb25kaXRpb25hbC1Qb2xpY3ktSW5mb3JtYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgMCwgNCB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJSZW1vdmFsLU9mLUFjY2VzcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiSVAtQ0FOLVR5cGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlBSQS1JbnN0YWxsIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQUkEtUmVtb3ZlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlByb3h5LUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUm91dGUtUmVjb3JkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyhydWxlcywgY21kKTsKKwkgIH0KKwkgIC8qIFJlLUF1dGgtQW5zd2VyICovCisJICB7CisJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIlJlLUF1dGgtQW5zd2VyIiwgJmNtZCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTZXNzaW9uLUlkIn0sIFJVTEVfRklYRURfSEVBRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRFJNUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tSG9zdCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUmVzdWx0LUNvZGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRXhwZXJpbWVudGFsLVJlc3VsdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tU3RhdGUtSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT0MtU3VwcG9ydGVkLUZlYXR1cmVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9DLU9MUiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiSVAtQ0FOLVR5cGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJBVC1UeXBlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBTi1UcnVzdGVkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBTi1HVy1BZGRyZXNzIn0sIFJVTEVfT1BUSU9OQUwsIDAsIDIgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiM0dQUC1TR1NOLU1DQy1NTkMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIjNHUFAtU0dTTi1BZGRyZXNzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICIzR1BQLVNHU04tSXB2Ni1BZGRyZXNzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJSQUkifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIjNHUFAtVXNlci1Mb2NhdGlvbi1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJVc2VyLUxvY2F0aW9uLUluZm8tVGltZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTmV0TG9jLUFjY2Vzcy1TdXBwb3J0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJVc2VyLUNTRy1JbmZvcm1hdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiM0dQUC1NUy1UaW1lWm9uZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRGVmYXVsdC1Rb1MtSW5mb3JtYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNoYXJnaW5nLVJ1bGUtUmVwb3J0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkVycm9yLU1lc3NhZ2UifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRXJyb3ItUmVwb3J0aW5nLUhvc3QifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRmFpbGVkLUFWUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJQcm94eS1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyhydWxlcywgY21kKTsKKwkgIH0KKworICAgfQorCisgICBMT0dfRCggIkV4dGVuc2lvbiAnRGljdGlvbmFyeSBkZWZpbml0aW9ucyBmb3IgR3ggKGUzMCknIGluaXRpYWxpemVkIik7CisgICByZXR1cm4gMDsKK30KKworaW50IGRpY3RfZW50cnkoY2hhciAqIGNvbmZmaWxlKQoreworCWRpY3RfZ3hfbG9hZF9kZWZzKGNvbmZmaWxlKTsKKwlyZXR1cm4gZGljdF9neF9sb2FkX3J1bGVzKGNvbmZmaWxlKTsKK30KKworY29uc3QgY2hhciogZGljdF9neF9wcm90b192ZXIoY2hhciAqIGNvbmZmaWxlKSB7CisJcmV0dXJuIGd4X3Byb3RvX3ZlcjsKK30KKworY29uc3QgZG91YmxlIGRpY3RfZ3hfZ2VuX3RzKGNoYXIgKiBjb25mZmlsZSkgeworCXJldHVybiBneF9nZW5fZGF0ZTsKK30KKworRVhURU5TSU9OX0VOVFJZMigiZGljdF9neCIsIGRpY3RfZ3hfbG9hZF9kZWZzLCBkaWN0X2d4X2xvYWRfcnVsZXMsICJkaWN0X3RzMzIyOTlfYXZwcyIsICJkaWN0X3RzMjkyMTJfYXZwcyIsICJkaWN0X3RzMjkyNzNfYXZwcyIsICJkaWN0X3RzMjkyMTRfYXZwcyIsICJkaWN0X3RzMjkyNzJfYXZwcyIsICJkaWN0X3RzMjkyMjlfYXZwcyIsICJkaWN0X3RzMjkwNjFfYXZwcyIsICJkaWN0X0NyZWRpdENvbnRyb2wiLCAiZGljdF9yZmM0MDA2YmlzX2F2cHMiLCAiZGljdF9kcmFmdGxvYWRfYXZwcyIsICJkaWN0X3JmYzc2ODNfYXZwcyIsICJkaWN0X3JmYzcxNTVfYXZwcyIsICJkaWN0X2V0c2kyODMwMzRfYXZwcyIsICJkaWN0XzNncHAyX2F2cHMiLCAiZGljdF9yZmM3OTQ0X2F2cHMiKTsKKworCisKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF9OQVMvQ01ha2VMaXN0cy50eHQgYi9leHRlbnNpb25zL2RpY3RfTkFTL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjZTQ5ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfTkFTL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTYgQEAKKyMgVGhlIGRpY3RfTkFTIGV4dGVuc2lvbgorUFJPSkVDVCgiZGljdF9OQVMgbGlicmFyeSBnZW5lcmF0ZWQgYnkgRmRHZW4gIiBDKQorCisjIENvbXBpbGUgYXMgYSBtb2R1bGUKK0ZEX0FERF9FWFRFTlNJT04oZGljdF9OQVMgZGljdF9OQVMuYykKKworCisjIyMjCisjIyBJTlNUQUxMIHNlY3Rpb24gIyMKKworSU5TVEFMTChUQVJHRVRTIGRpY3RfTkFTCisJTElCUkFSWSBERVNUSU5BVElPTiAke0lOU1RBTExfRVhURU5TSU9OU19TVUZGSVh9CitDT01QT05FTlQgZnJlZURpYW1ldGVyLWRpY3Rpb25hcnktZGljdF9OQVMpCisKKworCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfTkFTL05BUy5kaWQgYi9leHRlbnNpb25zL2RpY3RfTkFTL05BUy5kaWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU2YWY5ZQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF9OQVMvTkFTLmRpZApAQCAtMCwwICsxLDMgQEAKK2RpY3RfcmZjNDAwNF9hdnBzCitkaWN0X3JmYzcxNTVfYXZwcworZGljdF9OQVMKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF9OQVMvZGljdF9OQVMuYyBiL2V4dGVuc2lvbnMvZGljdF9OQVMvZGljdF9OQVMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWFhOGMwCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kaWN0X05BUy9kaWN0X05BUy5jCkBAIC0wLDAgKzEsNTU1IEBACisvKgorKiBDb3B5cmlnaHQgKGMpIDIwMTcgU3ByaW50CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKy8qKioqKioqKioqKioqKioqCisgR2VuZXJhdGVkIEJ5OiBmZHRvb2wgZW5oYW5jZW1lbnRzIHRvIGRpYWZ1enplcgorIExpY2Vuc2U6IHNhbWUgYXMgZnJlZURpYW1ldGVyCisqKioqKioqKioqKioqKioqLworCisKKy8qIAorICogRGljdGlvbmFyeSBkZWZpbml0aW9ucyBvZiBvYmplY3RzIHNwZWNpZmllZCBpbiBOQVMuCisgKi8KKyNpbmNsdWRlIDxmcmVlRGlhbWV0ZXIvZXh0ZW5zaW9uLmg+CisKKyNkZWZpbmUgUFJPVE9fVkVSICJ1bnNwZWNpZmllZCIKKyNkZWZpbmUgR0VOX0RBVEUgIDE1MDY2OTcxMjEuNTgKKworY29uc3QgY2hhciAqbmFzX3Byb3RvX3ZlciA9IFBST1RPX1ZFUjsKK2NvbnN0IGRvdWJsZSBuYXNfZ2VuX2RhdGUgPSBHRU5fREFURTsKKworLyogVGhlIGNvbnRlbnQgb2YgdGhpcyBmaWxlIGZvbGxvd3MgdGhlIHNhbWUgc3RydWN0dXJlIGFzIGRpY3RfYmFzZV9wcm90by5jICovCisKKyNkZWZpbmUgQ0hFQ0tfZGljdF9uZXcoIF90eXBlLCBfZGF0YSwgX3BhcmVudCwgX3JlZiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgX3JldCA9IGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIChfdHlwZSksIChfZGF0YSksIChfcGFyZW50KSwgKF9yZWYpICk7IFwKKyAgICBpZiAoIF9yZXQgIT0gMCAmJiBfcmV0ICE9IEVFWElTVCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICByZXR1cm4gX3JldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBDSEVDS19kaWN0X3NlYXJjaCggX3R5cGUsIF9jcml0ZXJpYSwgX3doYXQsIF9yZXN1bHQgKQkJXAorICAgIENIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIChfdHlwZSksIChfY3JpdGVyaWEpLCAoX3doYXQpLCAoX3Jlc3VsdCksIEVOT0VOVCkgKTsKKworc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24geworICAgIHN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lOworICAgIGVudW0gcnVsZV9wb3NpdGlvbglwb3NpdGlvbjsKKyAgICBpbnQgCQkJbWluOworICAgIGludAkJCW1heDsKK307CisKKyNkZWZpbmUgUlVMRV9PUkRFUiggX3Bvc2l0aW9uICkgKCgoKF9wb3NpdGlvbikgPT0gUlVMRV9GSVhFRF9IRUFEKSB8fCAoKF9wb3NpdGlvbikgPT0gUlVMRV9GSVhFRF9UQUlMKSkgPyAxIDogMCApCisKKy8qIEF0dGVudGlvbiEgVGhpcyB2ZXJzaW9uIG9mIHRoZSBtYWNybyB1c2VzIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsIGluIGNvbnRyYXN0IHRvIG1vc3Qgb3RoZXIgY29waWVzISAqLworI2RlZmluZSBQQVJTRV9sb2NfcnVsZXMoIF9ydWxlYXJyYXksIF9wYXJlbnQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBfX2FyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yIChfX2FyPTA7IF9fYXIgPCBzaXplb2YoX3J1bGVhcnJheSkgLyBzaXplb2YoKF9ydWxlYXJyYXkpWzBdKTsgX19hcisrKSB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHN0cnVjdCBkaWN0X3J1bGVfZGF0YSBfX2RhdGEgPSB7IE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ucG9zaXRpb24sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLm1pbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ubWF4fTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfX2RhdGEucnVsZV9vcmRlciA9IFJVTEVfT1JERVIoX19kYXRhLnJ1bGVfcG9zaXRpb24pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIENIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIERJQ1RfQVZQLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAmKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICZfX2RhdGEucnVsZV9hdnAsIDAgKSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmICggIV9fZGF0YS5ydWxlX2F2cCApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9ERUJVRyhJTkZPLCAiQVZQIE5vdCBmb3VuZDogJyVzJyIsIChfcnVsZWFycmF5KVtfX2FyXS5hdnBfdmVuZG9yX3BsdXNfbmFtZS5hdnBfbmFtZSk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFTk9FTlQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgX3JldCA9IGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfUlVMRSwgJihfX2RhdGEpLCAoX3BhcmVudCksIE5VTEwgKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggX3JldCAhPSAwICYmIF9yZXQgIT0gRUVYSVNUICkgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFX0RFQlVHKElORk8sICJFcnJvciBvbiBydWxlIHdpdGggQVZQICclcyciLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLmF2cF9uYW1lKTsgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRUlOVkFMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgQ0hFQ0tfdmVuZG9yX25ldyggX2RhdGEgKSB7IFwKKyAgICAgICAgc3RydWN0IGRpY3Rfb2JqZWN0ICogdmVuZG9yX2ZvdW5kOyBcCisgICAgICAgIGlmIChmZF9kaWN0X3NlYXJjaChmZF9nX2NvbmZpZy0+Y25mX2RpY3QsRElDVF9WRU5ET1IsVkVORE9SX0JZX0lELCZfZGF0YS52ZW5kb3JfaWQsJnZlbmRvcl9mb3VuZCxFTk9FTlQpID09IEVOT0VOVCkgeyBcCisgICAgICAgICAgICAgICAgQ0hFQ0tfRkNUKGZkX2RpY3RfbmV3KGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9WRU5ET1IsICZfZGF0YSwgTlVMTCwgTlVMTCkpOyBcCisgICAgICAgIH0gXAorfQorCisjZGVmaW5lIGVudW12YWxfZGVmX3UzMiggX3ZhbF8sIF9zdHJfICkJCVwKKyAgICB7IF9zdHJfLCAJCXsgLnUzMiA9IF92YWxfIH19CisKKyNkZWZpbmUgZW51bXZhbF9kZWZfb3MoIF9sZW5fLCBfdmFsXywgX3N0cl8gKQkJCQlcCisgICAgeyBfc3RyXywgCQl7IC5vcyA9IHsgLmRhdGEgPSAodW5zaWduZWQgY2hhciAqKV92YWxfLCAubGVuID0gX2xlbl8gfX19CisKKworc3RhdGljIGludCBkaWN0X25hc19sb2FkX2RlZnMoY2hhciAqIGNvbmZmaWxlKQoreworICAgVFJBQ0VfRU5UUlkoIiVwIiwgY29uZmZpbGUpOworCXN0cnVjdCBkaWN0X29iamVjdCAqIGFwcF9pZDA7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXBwX2lkMTsKKworCS8qIEFwcGxpY2F0aW9uIFNlY3Rpb24gKi8KKwl7CisJICB7CisJCQlzdHJ1Y3QgZGljdF9hcHBsaWNhdGlvbl9kYXRhIGRhdGEgPSB7IDAsICJOQVMtYXBwMCIgfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FQUExJQ0FUSU9OLCAmZGF0YSwgTlVMTCwgJmFwcF9pZDApCisJICB9CisJICB7CisJCQlzdHJ1Y3QgZGljdF9hcHBsaWNhdGlvbl9kYXRhIGRhdGEgPSB7IDEsICJOQVMiIH07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BUFBMSUNBVElPTiwgJmRhdGEsIE5VTEwsICZhcHBfaWQxKQorCSAgfQorCSAgLyogUmVzdWx0IGNvZGVzICovCisJICB7CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKnR5cGU7CisJCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkVudW1lcmF0ZWQoUmVzdWx0LUNvZGUpIiwmdHlwZSk7CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIkJhbmdrb2siLCB7IC51MzI9MTAyNjAgfX07CisKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCisJICB9CisJfQorCisKKyAgIC8qIEFWUCBzZWN0aW9uICovCisgICB7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIEFkZHJlc3NfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogVVRGOFN0cmluZ190eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBEaWFtZXRlcklkZW50aXR5X3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIERpYW1ldGVyVVJJX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIFRpbWVfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogSVBGaWx0ZXJSdWxlX3R5cGU7CisKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiQWRkcmVzcyIsICZBZGRyZXNzX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJVVEY4U3RyaW5nIiwgJlVURjhTdHJpbmdfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkRpYW1ldGVySWRlbnRpdHkiLCAmRGlhbWV0ZXJJZGVudGl0eV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiRGlhbWV0ZXJVUkkiLCAmRGlhbWV0ZXJVUklfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIlRpbWUiLCAmVGltZV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiSVBGaWx0ZXJSdWxlIiwgJklQRmlsdGVyUnVsZV90eXBlKTsKKworCQorICAgfQorCisgICAvKiBDb21tYW5kcyBzZWN0aW9uICovCisgICB7CisJCS8qIEFBLVJlcXVlc3QgKi8KKwkJeworCQkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCQlzdHJ1Y3QgZGljdF9jbWRfZGF0YSBkYXRhID0geworCQkJCTI2NSwJLyogQ29kZSAqLworCQkJCSJBQS1SZXF1ZXN0IiwJLyogTmFtZSAqLworCQkJCUNNRF9GTEFHX1JFUVVFU1QgfCBDTURfRkxBR19FUlJPUiwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlDTURfRkxBR19SRVFVRVNUIHwgQ01EX0ZMQUdfUFJPWElBQkxFLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJfTsKKworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQ09NTUFORCwgJmRhdGEgLCBhcHBfaWQxLCAmY21kKQorCQl9CisJCS8qIEFBLUFuc3dlciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJCXN0cnVjdCBkaWN0X2NtZF9kYXRhIGRhdGEgPSB7CisJCQkJMjY1LAkvKiBDb2RlICovCisJCQkJIkFBLUFuc3dlciIsCS8qIE5hbWUgKi8KKwkJCQlDTURfRkxBR19SRVFVRVNULAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUNNRF9GTEFHX1BST1hJQUJMRSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCX07CisKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0NPTU1BTkQsICZkYXRhICwgYXBwX2lkMSwgJmNtZCkKKwkJfQorCisgICB9CisKKyAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRpY3RfbmFzX2xvYWRfcnVsZXMoY2hhciAqIGNvbmZmaWxlKQoreworICAgLyogR3JvdXBlZCBBVlAgc2VjdGlvbiAqLworICAgeworCisgICB9CQorCisgICAvKiBDb21tYW5kcyBzZWN0aW9uICovCisgICB7CisJICAvKiBBQS1SZXF1ZXN0ICovCisJICB7CisJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIkFBLVJlcXVlc3QiLCAmY21kKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlNlc3Npb24tSWQifSwgUlVMRV9GSVhFRF9IRUFELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBdXRoLUFwcGxpY2F0aW9uLUlkIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1Ib3N0In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEZXN0aW5hdGlvbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBdXRoLVJlcXVlc3QtVHlwZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEZXN0aW5hdGlvbi1Ib3N0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk5BUy1JZGVudGlmaWVyIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk5BUy1JUC1BZGRyZXNzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk5BUy1JUHY2LUFkZHJlc3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiTkFTLVBvcnQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiTkFTLVBvcnQtSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiTkFTLVBvcnQtVHlwZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tQUFBLVByb3RvY29sIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1TdGF0ZS1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJQb3J0LUxpbWl0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlVzZXItTmFtZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJVc2VyLVBhc3N3b3JkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlNlcnZpY2UtVHlwZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTdGF0ZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBdXRob3JpemF0aW9uLUxpZmV0aW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkF1dGgtR3JhY2UtUGVyaW9kIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkF1dGgtU2Vzc2lvbi1TdGF0ZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJDYWxsYmFjay1OdW1iZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQ2FsbGVkLVN0YXRpb24tSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQ2FsbGluZy1TdGF0aW9uLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbmF0aW5nLUxpbmUtSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJDb25uZWN0LUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQ0hBUC1BdXRoIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkNIQVAtQ2hhbGxlbmdlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkZyYW1lZC1Db21wcmVzc2lvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJGcmFtZWQtSW50ZXJmYWNlLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkZyYW1lZC1JUC1BZGRyZXNzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkZyYW1lZC1JUHY2LVByZWZpeCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJGcmFtZWQtSVAtTmV0bWFzayJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJGcmFtZWQtTVRVIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkZyYW1lZC1Qcm90b2NvbCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBUkFQLVBhc3N3b3JkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyhydWxlcywgY21kKTsKKwkgIH0KKwkgIC8qIEFBLUFuc3dlciAqLworCSAgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJBQS1BbnN3ZXIiLCAmY21kKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlNlc3Npb24tSWQifSwgUlVMRV9GSVhFRF9IRUFELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBdXRoLUFwcGxpY2F0aW9uLUlkIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkF1dGgtUmVxdWVzdC1UeXBlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJlc3VsdC1Db2RlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1Ib3N0In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJVc2VyLU5hbWUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU2VydmljZS1UeXBlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkNsYXNzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyhydWxlcywgY21kKTsKKwkgIH0KKwkgIC8qIFJlLUF1dGgtUmVxdWVzdCAqLworCSAgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJSZS1BdXRoLVJlcXVlc3QiLCAmY21kKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlNlc3Npb24tSWQifSwgUlVMRV9GSVhFRF9IRUFELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tSG9zdCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRGVzdGluYXRpb24tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRGVzdGluYXRpb24tSG9zdCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBdXRoLUFwcGxpY2F0aW9uLUlkIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJlLUF1dGgtUmVxdWVzdC1UeXBlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlVzZXItTmFtZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tQUFBLVByb3RvY29sIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1TdGF0ZS1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJOQVMtSWRlbnRpZmllciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJOQVMtSVAtQWRkcmVzcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJOQVMtSVB2Ni1BZGRyZXNzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk5BUy1Qb3J0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk5BUy1Qb3J0LUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk5BUy1Qb3J0LVR5cGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU2VydmljZS1UeXBlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkZyYW1lZC1JUC1BZGRyZXNzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyhydWxlcywgY21kKTsKKwkgIH0KKwkgIC8qIFJlLUF1dGgtQW5zd2VyICovCisJICB7CisJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIlJlLUF1dGgtQW5zd2VyIiwgJmNtZCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTZXNzaW9uLUlkIn0sIFJVTEVfRklYRURfSEVBRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUmVzdWx0LUNvZGUifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLUhvc3QifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLVJlYWxtIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlVzZXItTmFtZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tQUFBLVByb3RvY29sIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1TdGF0ZS1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJFcnJvci1NZXNzYWdlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkVycm9yLVJlcG9ydGluZy1Ib3N0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkZhaWxlZC1BVlAifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUmVkaXJlY3QtSG9zdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSZWRpcmVjdC1Ib3N0LVVzYWdlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJlZGlyZWN0LU1heC1DYWNoZS1UaW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlNlcnZpY2UtVHlwZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJDb25maWd1cmF0aW9uLVRva2VuIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIklkbGUtVGltZW91dCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBdXRob3JpemF0aW9uLUxpZmV0aW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkF1dGgtR3JhY2UtUGVyaW9kIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJlLUF1dGgtUmVxdWVzdC1UeXBlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlN0YXRlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkNsYXNzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJlcGx5LU1lc3NhZ2UifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUHJvbXB0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyhydWxlcywgY21kKTsKKwkgIH0KKwkgIC8qIEFib3J0LVNlc3Npb24tUmVxdWVzdCAqLworCSAgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJBYm9ydC1TZXNzaW9uLVJlcXVlc3QiLCAmY21kKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlNlc3Npb24tSWQifSwgUlVMRV9GSVhFRF9IRUFELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tSG9zdCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRGVzdGluYXRpb24tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRGVzdGluYXRpb24tSG9zdCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBdXRoLUFwcGxpY2F0aW9uLUlkIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlVzZXItTmFtZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tQUFBLVByb3RvY29sIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1TdGF0ZS1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJOQVMtSWRlbnRpZmllciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJOQVMtSVAtQWRkcmVzcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJOQVMtSVB2Ni1BZGRyZXNzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk5BUy1Qb3J0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk5BUy1Qb3J0LUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk5BUy1Qb3J0LVR5cGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU2VydmljZS1UeXBlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkZyYW1lZC1JUC1BZGRyZXNzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkZyYW1lZC1JUHY2LVByZWZpeCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJGcmFtZWQtSW50ZXJmYWNlLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyhydWxlcywgY21kKTsKKwkgIH0KKwkgIC8qIEFib3J0LVNlc3Npb24tQW5zd2VyICovCisJICB7CisJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIkFib3J0LVNlc3Npb24tQW5zd2VyIiwgJmNtZCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTZXNzaW9uLUlkIn0sIFJVTEVfRklYRURfSEVBRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUmVzdWx0LUNvZGUifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLUhvc3QifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLVJlYWxtIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlVzZXItTmFtZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tQUFBLVByb3RvY29sIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1TdGF0ZS1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTdGF0ZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJFcnJvci1NZXNzYWdlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkVycm9yLVJlcG9ydGluZy1Ib3N0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkZhaWxlZC1BVlAifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUmVkaXJlY3QtSG9zdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSZWRpcmVjdC1Ib3N0LVVzYWdlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJlZGlyZWN0LU1heC1DYWNoZS1UaW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlByb3h5LUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKHJ1bGVzLCBjbWQpOworCSAgfQorCSAgLyogU2Vzc2lvbi1UZXJtaW5hdGlvbi1SZXF1ZXN0ICovCisJICB7CisJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIlNlc3Npb24tVGVybWluYXRpb24tUmVxdWVzdCIsICZjbWQpCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU2Vzc2lvbi1JZCJ9LCBSVUxFX0ZJWEVEX0hFQUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1Ib3N0In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEZXN0aW5hdGlvbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBdXRoLUFwcGxpY2F0aW9uLUlkIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlRlcm1pbmF0aW9uLUNhdXNlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlVzZXItTmFtZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEZXN0aW5hdGlvbi1Ib3N0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkNsYXNzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1BQUEtUHJvdG9jb2wifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLVN0YXRlLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlByb3h5LUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUm91dGUtUmVjb3JkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyhydWxlcywgY21kKTsKKwkgIH0KKwkgIC8qIFNlc3Npb24tVGVybWluYXRpb24tQW5zd2VyICovCisJICB7CisJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIlNlc3Npb24tVGVybWluYXRpb24tQW5zd2VyIiwgJmNtZCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTZXNzaW9uLUlkIn0sIFJVTEVfRklYRURfSEVBRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUmVzdWx0LUNvZGUifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLUhvc3QifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLVJlYWxtIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlVzZXItTmFtZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJDbGFzcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJFcnJvci1NZXNzYWdlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkVycm9yLVJlcG9ydGluZy1Ib3N0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkZhaWxlZC1BVlAifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLUFBQS1Qcm90b2NvbCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tU3RhdGUtSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUmVkaXJlY3QtSG9zdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSZWRpcmVjdC1Ib3N0LVVzYWdlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJlZGlyZWN0LU1heC1DYWNoZS1UaW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlByb3h5LUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKHJ1bGVzLCBjbWQpOworCSAgfQorCSAgLyogQWNjb3VudGluZy1SZXF1ZXN0ICovCisJICB7CisJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIkFjY291bnRpbmctUmVxdWVzdCIsICZjbWQpCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU2Vzc2lvbi1JZCJ9LCBSVUxFX0ZJWEVEX0hFQUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1Ib3N0In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEZXN0aW5hdGlvbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBY2NvdW50aW5nLVJlY29yZC1UeXBlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkFjY291bnRpbmctUmVjb3JkLU51bWJlciJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBY2N0LUFwcGxpY2F0aW9uLUlkIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlVzZXItTmFtZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBY2NvdW50aW5nLVN1Yi1TZXNzaW9uLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkFjY3QtU2Vzc2lvbi1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBY2N0LU11bHRpLVNlc3Npb24tSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLUFBQS1Qcm90b2NvbCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tU3RhdGUtSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRGVzdGluYXRpb24tSG9zdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJFdmVudC1UaW1lc3RhbXAifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQWNjdC1EZWxheS1UaW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk5BUy1JZGVudGlmaWVyIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk5BUy1JUC1BZGRyZXNzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk5BUy1JUHY2LUFkZHJlc3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiTkFTLVBvcnQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiTkFTLVBvcnQtSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiTkFTLVBvcnQtVHlwZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJDbGFzcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTZXJ2aWNlLVR5cGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVGVybWluYXRpb24tQ2F1c2UifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQWNjb3VudGluZy1JbnB1dC1PY3RldHMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQWNjb3VudGluZy1JbnB1dC1QYWNrZXRzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkFjY291bnRpbmctT3V0cHV0LU9jdGV0cyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBY2NvdW50aW5nLU91dHB1dC1QYWNrZXRzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkFjY3QtQXV0aGVudGljIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkFjY291bnRpbmctQXV0aC1NZXRob2QifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQWNjdC1MaW5rLUNvdW50In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkFjY3QtU2Vzc2lvbi1UaW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkFjY3QtVHVubmVsLUNvbm5lY3Rpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQWNjdC1UdW5uZWwtUGFja2V0cy1Mb3N0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkNhbGxiYWNrLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkNhbGxiYWNrLU51bWJlciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJDYWxsZWQtU3RhdGlvbi1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJDYWxsaW5nLVN0YXRpb24tSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQ29ubmVjdC1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbmF0aW5nLUxpbmUtSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBdXRob3JpemF0aW9uLUxpZmV0aW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlNlc3Npb24tVGltZW91dCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJJZGxlLVRpbWVvdXQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUG9ydC1MaW1pdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBY2NvdW50aW5nLVJlYWx0aW1lLVJlcXVpcmVkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkFjY3QtSW50ZXJpbS1JbnRlcnZhbCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJGaWx0ZXItSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiTkFTLUZpbHRlci1SdWxlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlFvUy1GaWx0ZXItUnVsZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJGcmFtZWQtQXBwbGV0YWxrLUxpbmsifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRnJhbWVkLUFwcGxldGFsay1OZXR3b3JrIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkZyYW1lZC1BcHBsZXRhbGstWm9uZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJGcmFtZWQtQ29tcHJlc3Npb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRnJhbWVkLUludGVyZmFjZS1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJGcmFtZWQtSVAtQWRkcmVzcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJGcmFtZWQtSVAtTmV0bWFzayJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJGcmFtZWQtSVB2Ni1QcmVmaXgifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRnJhbWVkLUlQdjYtUG9vbCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJGcmFtZWQtSVB2Ni1Sb3V0ZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJGcmFtZWQtSVBYLU5ldHdvcmsifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRnJhbWVkLU1UVSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJGcmFtZWQtUG9vbCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJGcmFtZWQtUHJvdG9jb2wifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRnJhbWVkLVJvdXRlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkZyYW1lZC1Sb3V0aW5nIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkxvZ2luLUlQLUhvc3QifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiTG9naW4tSVB2Ni1Ib3N0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkxvZ2luLUxBVC1Hcm91cCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJMb2dpbi1MQVQtTm9kZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJMb2dpbi1MQVQtUG9ydCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJMb2dpbi1MQVQtU2VydmljZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJMb2dpbi1TZXJ2aWNlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkxvZ2luLVRDUC1Qb3J0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlR1bm5lbGluZyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJQcm94eS1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJvdXRlLVJlY29yZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMocnVsZXMsIGNtZCk7CisJICB9CisJICAvKiBBY2NvdW50aW5nLUFuc3dlciAqLworCSAgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJBY2NvdW50aW5nLUFuc3dlciIsICZjbWQpCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU2Vzc2lvbi1JZCJ9LCBSVUxFX0ZJWEVEX0hFQUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJlc3VsdC1Db2RlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1Ib3N0In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBY2NvdW50aW5nLVJlY29yZC1UeXBlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkFjY291bnRpbmctUmVjb3JkLU51bWJlciJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBY2N0LUFwcGxpY2F0aW9uLUlkIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlVzZXItTmFtZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBY2NvdW50aW5nLVN1Yi1TZXNzaW9uLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkFjY3QtU2Vzc2lvbi1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBY2N0LU11bHRpLVNlc3Npb24tSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRXZlbnQtVGltZXN0YW1wIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkVycm9yLU1lc3NhZ2UifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRXJyb3ItUmVwb3J0aW5nLUhvc3QifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRmFpbGVkLUFWUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tQUFBLVByb3RvY29sIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1TdGF0ZS1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJOQVMtSWRlbnRpZmllciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJOQVMtSVAtQWRkcmVzcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJOQVMtSVB2Ni1BZGRyZXNzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk5BUy1Qb3J0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk5BUy1Qb3J0LUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk5BUy1Qb3J0LVR5cGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU2VydmljZS1UeXBlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlRlcm1pbmF0aW9uLUNhdXNlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkFjY291bnRpbmctUmVhbHRpbWUtUmVxdWlyZWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKHJ1bGVzLCBjbWQpOworCSAgfQorCisgICB9CisKKyAgIExPR19EKCAiRXh0ZW5zaW9uICdEaWN0aW9uYXJ5IGRlZmluaXRpb25zIGZvciBOQVMgKE5vbmUpJyBpbml0aWFsaXplZCIpOworICAgcmV0dXJuIDA7Cit9CisKK2ludCBkaWN0X2VudHJ5KGNoYXIgKiBjb25mZmlsZSkKK3sKKwlkaWN0X25hc19sb2FkX2RlZnMoY29uZmZpbGUpOworCXJldHVybiBkaWN0X25hc19sb2FkX3J1bGVzKGNvbmZmaWxlKTsKK30KKworY29uc3QgY2hhciogZGljdF9uYXNfcHJvdG9fdmVyKGNoYXIgKiBjb25mZmlsZSkgeworCXJldHVybiBuYXNfcHJvdG9fdmVyOworfQorCitjb25zdCBkb3VibGUgZGljdF9uYXNfZ2VuX3RzKGNoYXIgKiBjb25mZmlsZSkgeworCXJldHVybiBuYXNfZ2VuX2RhdGU7Cit9CisKK0VYVEVOU0lPTl9FTlRSWTIoImRpY3RfbmFzIiwgZGljdF9uYXNfbG9hZF9kZWZzLCBkaWN0X25hc19sb2FkX3J1bGVzLCAiZGljdF9yZmM3MTU1X2F2cHMiKTsKKworCisKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF9SZi9DTWFrZUxpc3RzLnR4dCBiL2V4dGVuc2lvbnMvZGljdF9SZi9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDczNjcxCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kaWN0X1JmL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTYgQEAKKyMgVGhlIGRpY3RfUmYgZXh0ZW5zaW9uCitQUk9KRUNUKCJkaWN0X1JmIGxpYnJhcnkgZ2VuZXJhdGVkIGJ5IEZkR2VuICIgQykKKworIyBDb21waWxlIGFzIGEgbW9kdWxlCitGRF9BRERfRVhURU5TSU9OKGRpY3RfUmYgZGljdF9SZi5jKQorCisKKyMjIyMKKyMjIElOU1RBTEwgc2VjdGlvbiAjIworCitJTlNUQUxMKFRBUkdFVFMgZGljdF9SZgorCUxJQlJBUlkgREVTVElOQVRJT04gJHtJTlNUQUxMX0VYVEVOU0lPTlNfU1VGRklYfQorQ09NUE9ORU5UIGZyZWVEaWFtZXRlci1kaWN0aW9uYXJ5LVJGKQorCisKKwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X1JmL1JmLmRpZCBiL2V4dGVuc2lvbnMvZGljdF9SZi9SZi5kaWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJmZjRmNgotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF9SZi9SZi5kaWQKQEAgLTAsMCArMSwzOCBAQAorZGljdF9yZmM2OTQyX2F2cHMKK2RpY3RfdHMyOTQ2OF9hdnBzCitkaWN0X3RzMjkxNTRfYXZwcworZGljdF90czI5MjE0X2F2cHMKK2RpY3RfdHMyOTIxNV9hdnBzCitkaWN0X3RzMjkyMTdfYXZwcworZGljdF90czI5MzM3X2F2cHMKK2RpY3RfdHMyOTM0M19hdnBzCitkaWN0X3RzMjkzMzhfYXZwcworZGljdF90czI5MTI4X2F2cHMKK2RpY3RfdHMyOTM0NF9hdnBzCitkaWN0X3RzMjkzNDVfYXZwcworZGljdF90czI5MTczX2F2cHMKK2RpY3RfdHMzMjI5OV9hdnBzCitkaWN0X3JmYzY3MzRfYXZwcworZGljdF9yZmM1NTgwX2F2cHMKK2RpY3RfcmZjNDA3Ml9hdnBzCitkaWN0X3RzMjkyNzNfYXZwcworZGljdF9yZmM0MDA2YmlzX2F2cHMKK2RpY3RfdHMyOTIxMl9hdnBzCitkaWN0X3RzMjkwNjFfYXZwcworZGljdF90czI5MjcyX2F2cHMKK2RpY3RfcmZjNTQ0N19hdnBzCitkaWN0X3JmYzU3NzhfYXZwcworZGljdF9yZmM1Nzc3X2F2cHMKK2RpY3RfdHMyOTMzNl9hdnBzCitkaWN0X2V0c2kyODMwMzRfYXZwcworZGljdF9yZmM0NTkwX2F2cHMKK2RpY3RfcmZjNDAwNF9hdnBzCitkaWN0X3JmYzcxNTVfYXZwcworZGljdF90czI5MjI5X2F2cHMKK2RpY3RfcmZjNzY4M19hdnBzCitkaWN0X2RyYWZ0bG9hZF9hdnBzCitkaWN0X3JmYzc5NDRfYXZwcworZGljdF90czI5MzI5X2F2cHMKK2RpY3RfdHMyOTM2OF9hdnBzCitkaWN0XzNncHAyX2F2cHMKK2RpY3RfUmYKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF9SZi9kaWN0X1JmLmMgYi9leHRlbnNpb25zL2RpY3RfUmYvZGljdF9SZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlZGVlNjEKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfUmYvZGljdF9SZi5jCkBAIC0wLDAgKzEsMjM1IEBACisvKgorKiBDb3B5cmlnaHQgKGMpIDIwMTcgU3ByaW50CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKy8qKioqKioqKioqKioqKioqCisgR2VuZXJhdGVkIEJ5OiBmZHRvb2wgZW5oYW5jZW1lbnRzIHRvIGRpYWZ1enplcgorIExpY2Vuc2U6IHNhbWUgYXMgZnJlZURpYW1ldGVyCisqKioqKioqKioqKioqKioqLworCisKKy8qIAorICogRGljdGlvbmFyeSBkZWZpbml0aW9ucyBvZiBvYmplY3RzIHNwZWNpZmllZCBpbiBSZiAoZTMwKS4KKyAqLworI2luY2x1ZGUgPGZyZWVEaWFtZXRlci9leHRlbnNpb24uaD4KKworI2RlZmluZSBQUk9UT19WRVIgImUzMCIKKyNkZWZpbmUgR0VOX0RBVEUgIDE1MDY2OTcxMjUuNgorCitjb25zdCBjaGFyICpyZl9wcm90b192ZXIgPSBQUk9UT19WRVI7Citjb25zdCBkb3VibGUgcmZfZ2VuX2RhdGUgPSBHRU5fREFURTsKKworLyogVGhlIGNvbnRlbnQgb2YgdGhpcyBmaWxlIGZvbGxvd3MgdGhlIHNhbWUgc3RydWN0dXJlIGFzIGRpY3RfYmFzZV9wcm90by5jICovCisKKyNkZWZpbmUgQ0hFQ0tfZGljdF9uZXcoIF90eXBlLCBfZGF0YSwgX3BhcmVudCwgX3JlZiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgX3JldCA9IGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIChfdHlwZSksIChfZGF0YSksIChfcGFyZW50KSwgKF9yZWYpICk7IFwKKyAgICBpZiAoIF9yZXQgIT0gMCAmJiBfcmV0ICE9IEVFWElTVCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICByZXR1cm4gX3JldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBDSEVDS19kaWN0X3NlYXJjaCggX3R5cGUsIF9jcml0ZXJpYSwgX3doYXQsIF9yZXN1bHQgKQkJXAorICAgIENIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIChfdHlwZSksIChfY3JpdGVyaWEpLCAoX3doYXQpLCAoX3Jlc3VsdCksIEVOT0VOVCkgKTsKKworc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24geworICAgIHN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lOworICAgIGVudW0gcnVsZV9wb3NpdGlvbglwb3NpdGlvbjsKKyAgICBpbnQgCQkJbWluOworICAgIGludAkJCW1heDsKK307CisKKyNkZWZpbmUgUlVMRV9PUkRFUiggX3Bvc2l0aW9uICkgKCgoKF9wb3NpdGlvbikgPT0gUlVMRV9GSVhFRF9IRUFEKSB8fCAoKF9wb3NpdGlvbikgPT0gUlVMRV9GSVhFRF9UQUlMKSkgPyAxIDogMCApCisKKy8qIEF0dGVudGlvbiEgVGhpcyB2ZXJzaW9uIG9mIHRoZSBtYWNybyB1c2VzIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsIGluIGNvbnRyYXN0IHRvIG1vc3Qgb3RoZXIgY29waWVzISAqLworI2RlZmluZSBQQVJTRV9sb2NfcnVsZXMoIF9ydWxlYXJyYXksIF9wYXJlbnQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBfX2FyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yIChfX2FyPTA7IF9fYXIgPCBzaXplb2YoX3J1bGVhcnJheSkgLyBzaXplb2YoKF9ydWxlYXJyYXkpWzBdKTsgX19hcisrKSB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHN0cnVjdCBkaWN0X3J1bGVfZGF0YSBfX2RhdGEgPSB7IE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ucG9zaXRpb24sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLm1pbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ubWF4fTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfX2RhdGEucnVsZV9vcmRlciA9IFJVTEVfT1JERVIoX19kYXRhLnJ1bGVfcG9zaXRpb24pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIENIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIERJQ1RfQVZQLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAmKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICZfX2RhdGEucnVsZV9hdnAsIDAgKSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmICggIV9fZGF0YS5ydWxlX2F2cCApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9ERUJVRyhJTkZPLCAiQVZQIE5vdCBmb3VuZDogJyVzJyIsIChfcnVsZWFycmF5KVtfX2FyXS5hdnBfdmVuZG9yX3BsdXNfbmFtZS5hdnBfbmFtZSk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFTk9FTlQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgX3JldCA9IGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfUlVMRSwgJihfX2RhdGEpLCAoX3BhcmVudCksIE5VTEwgKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggX3JldCAhPSAwICYmIF9yZXQgIT0gRUVYSVNUICkgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFX0RFQlVHKElORk8sICJFcnJvciBvbiBydWxlIHdpdGggQVZQICclcyciLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLmF2cF9uYW1lKTsgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRUlOVkFMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgQ0hFQ0tfdmVuZG9yX25ldyggX2RhdGEgKSB7IFwKKyAgICAgICAgc3RydWN0IGRpY3Rfb2JqZWN0ICogdmVuZG9yX2ZvdW5kOyBcCisgICAgICAgIGlmIChmZF9kaWN0X3NlYXJjaChmZF9nX2NvbmZpZy0+Y25mX2RpY3QsRElDVF9WRU5ET1IsVkVORE9SX0JZX0lELCZfZGF0YS52ZW5kb3JfaWQsJnZlbmRvcl9mb3VuZCxFTk9FTlQpID09IEVOT0VOVCkgeyBcCisgICAgICAgICAgICAgICAgQ0hFQ0tfRkNUKGZkX2RpY3RfbmV3KGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9WRU5ET1IsICZfZGF0YSwgTlVMTCwgTlVMTCkpOyBcCisgICAgICAgIH0gXAorfQorCisjZGVmaW5lIGVudW12YWxfZGVmX3UzMiggX3ZhbF8sIF9zdHJfICkJCVwKKyAgICB7IF9zdHJfLCAJCXsgLnUzMiA9IF92YWxfIH19CisKKyNkZWZpbmUgZW51bXZhbF9kZWZfb3MoIF9sZW5fLCBfdmFsXywgX3N0cl8gKQkJCQlcCisgICAgeyBfc3RyXywgCQl7IC5vcyA9IHsgLmRhdGEgPSAodW5zaWduZWQgY2hhciAqKV92YWxfLCAubGVuID0gX2xlbl8gfX19CisKKworc3RhdGljIGludCBkaWN0X3JmX2xvYWRfZGVmcyhjaGFyICogY29uZmZpbGUpCit7CisgICBUUkFDRV9FTlRSWSgiJXAiLCBjb25mZmlsZSk7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXBwX2lkMzsKKworCS8qIEFwcGxpY2F0aW9uIFNlY3Rpb24gKi8KKwl7CisJICB7CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiB2ZW5kb3I7CisJCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX1ZFTkRPUiwgVkVORE9SX0JZX05BTUUsICIzR1BQIiwgJnZlbmRvcikKKwkJCXN0cnVjdCBkaWN0X2FwcGxpY2F0aW9uX2RhdGEgZGF0YSA9IHsgMywgIlJmIiB9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVBQTElDQVRJT04sICZkYXRhLCB2ZW5kb3IsICZhcHBfaWQzKQorCSAgfQorCX0KKworCisgICAvKiBBVlAgc2VjdGlvbiAqLworICAgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBBZGRyZXNzX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIFVURjhTdHJpbmdfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogRGlhbWV0ZXJJZGVudGl0eV90eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBEaWFtZXRlclVSSV90eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBUaW1lX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIElQRmlsdGVyUnVsZV90eXBlOworCisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkFkZHJlc3MiLCAmQWRkcmVzc190eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiVVRGOFN0cmluZyIsICZVVEY4U3RyaW5nX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJEaWFtZXRlcklkZW50aXR5IiwgJkRpYW1ldGVySWRlbnRpdHlfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkRpYW1ldGVyVVJJIiwgJkRpYW1ldGVyVVJJX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJUaW1lIiwgJlRpbWVfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIklQRmlsdGVyUnVsZSIsICZJUEZpbHRlclJ1bGVfdHlwZSk7CisKKwkKKyAgIH0KKworICAgLyogQ29tbWFuZHMgc2VjdGlvbiAqLworICAgeworCisgICB9CisKKyAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRpY3RfcmZfbG9hZF9ydWxlcyhjaGFyICogY29uZmZpbGUpCit7CisgICAvKiBHcm91cGVkIEFWUCBzZWN0aW9uICovCisgICB7CisKKyAgIH0JCisKKyAgIC8qIENvbW1hbmRzIHNlY3Rpb24gKi8KKyAgIHsKKwkgIC8qIEFjY291bnRpbmctUmVxdWVzdCAqLworCSAgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJBY2NvdW50aW5nLVJlcXVlc3QiLCAmY21kKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlNlc3Npb24tSWQifSwgUlVMRV9GSVhFRF9IRUFELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tSG9zdCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRGVzdGluYXRpb24tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQWNjb3VudGluZy1SZWNvcmQtVHlwZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBY2NvdW50aW5nLVJlY29yZC1OdW1iZXIifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQWNjdC1BcHBsaWNhdGlvbi1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJWZW5kb3ItU3BlY2lmaWMtQXBwbGljYXRpb24tSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVXNlci1OYW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRlc3RpbmF0aW9uLUhvc3QifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQWNjb3VudGluZy1TdWItU2Vzc2lvbi1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBY2N0LVNlc3Npb24tSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQWNjdC1NdWx0aS1TZXNzaW9uLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkFjY3QtSW50ZXJpbS1JbnRlcnZhbCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBY2NvdW50aW5nLVJlYWx0aW1lLVJlcXVpcmVkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1TdGF0ZS1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJFdmVudC1UaW1lc3RhbXAifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUHJveHktSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSb3V0ZS1SZWNvcmQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU2VydmljZS1Db250ZXh0LUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTZXJ2aWNlLUluZm9ybWF0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyhydWxlcywgY21kKTsKKwkgIH0KKwkgIC8qIEFjY291bnRpbmctQW5zd2VyICovCisJICB7CisJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIkFjY291bnRpbmctQW5zd2VyIiwgJmNtZCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTZXNzaW9uLUlkIn0sIFJVTEVfRklYRURfSEVBRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUmVzdWx0LUNvZGUifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLUhvc3QifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLVJlYWxtIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkFjY291bnRpbmctUmVjb3JkLVR5cGUifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQWNjb3VudGluZy1SZWNvcmQtTnVtYmVyIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkFjY3QtQXBwbGljYXRpb24tSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVmVuZG9yLVNwZWNpZmljLUFwcGxpY2F0aW9uLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlVzZXItTmFtZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBY2NvdW50aW5nLVN1Yi1TZXNzaW9uLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkFjY3QtU2Vzc2lvbi1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBY2N0LU11bHRpLVNlc3Npb24tSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRXJyb3ItTWVzc2FnZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJFcnJvci1SZXBvcnRpbmctSG9zdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBY2N0LUludGVyaW0tSW50ZXJ2YWwifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRmFpbGVkLUFWUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBY2NvdW50aW5nLVJlYWx0aW1lLVJlcXVpcmVkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1TdGF0ZS1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJFdmVudC1UaW1lc3RhbXAifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUHJveHktSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMocnVsZXMsIGNtZCk7CisJICB9CisKKyAgIH0KKworICAgTE9HX0QoICJFeHRlbnNpb24gJ0RpY3Rpb25hcnkgZGVmaW5pdGlvbnMgZm9yIFJmIChlMzApJyBpbml0aWFsaXplZCIpOworICAgcmV0dXJuIDA7Cit9CisKK2ludCBkaWN0X2VudHJ5KGNoYXIgKiBjb25mZmlsZSkKK3sKKwlkaWN0X3JmX2xvYWRfZGVmcyhjb25mZmlsZSk7CisJcmV0dXJuIGRpY3RfcmZfbG9hZF9ydWxlcyhjb25mZmlsZSk7Cit9CisKK2NvbnN0IGNoYXIqIGRpY3RfcmZfcHJvdG9fdmVyKGNoYXIgKiBjb25mZmlsZSkgeworCXJldHVybiByZl9wcm90b192ZXI7Cit9CisKK2NvbnN0IGRvdWJsZSBkaWN0X3JmX2dlbl90cyhjaGFyICogY29uZmZpbGUpIHsKKwlyZXR1cm4gcmZfZ2VuX2RhdGU7Cit9CisKK0VYVEVOU0lPTl9FTlRSWTIoImRpY3RfcmYiLCBkaWN0X3JmX2xvYWRfZGVmcywgZGljdF9yZl9sb2FkX3J1bGVzLCAiZGljdF90czMyMjk5X2F2cHMiLCAiZGljdF90czI5MjcyX2F2cHMiLCAiZGljdF90czI5MjczX2F2cHMiLCAiZGljdF90czI5MjEyX2F2cHMiLCAiZGljdF90czI5MzM2X2F2cHMiLCAiZGljdF90czI5MTI4X2F2cHMiLCAiZGljdF90czI5MjE0X2F2cHMiLCAiZGljdF90czI5MzQ1X2F2cHMiLCAiZGljdF90czI5MzM3X2F2cHMiLCAiZGljdF90czI5MzQ0X2F2cHMiLCAiZGljdF90czI5MzY4X2F2cHMiLCAiZGljdF90czI5MjE3X2F2cHMiLCAiZGljdF90czI5MjI5X2F2cHMiLCAiZGljdF90czI5MzM4X2F2cHMiLCAiZGljdF90czI5NDY4X2F2cHMiLCAiZGljdF90czI5MzI5X2F2cHMiLCAiZGljdF90czI5MDYxX2F2cHMiLCAiZGljdF9yZmM1Nzc4X2F2cHMiLCAiZGljdF90czI5MTczX2F2cHMiLCAiZGljdF9yZmM0MDA2YmlzX2F2cHMiLCAiZGljdF90czI5MzQzX2F2cHMiLCAiZGljdF9yZmM3MTU1X2F2cHMiLCAiZGljdF9yZmM1NDQ3X2F2cHMiLCAiZGljdF9yZmM3NjgzX2F2cHMiLCAiZGljdF9yZmM0NTkwX2F2cHMiLCAiZGljdF9kcmFmdGxvYWRfYXZwcyIsICJkaWN0X3JmYzQwMDRfYXZwcyIsICJkaWN0X3JmYzU3NzdfYXZwcyIsICJkaWN0X2V0c2kyODMwMzRfYXZwcyIsICJkaWN0XzNncHAyX2F2cHMiLCAiZGljdF9yZmM3OTQ0X2F2cHMiKTsKKworCisKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF9Sby9DTWFrZUxpc3RzLnR4dCBiL2V4dGVuc2lvbnMvZGljdF9Sby9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzdjN2RlCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kaWN0X1JvL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTYgQEAKKyMgVGhlIGRpY3RfUm8gZXh0ZW5zaW9uCitQUk9KRUNUKCJkaWN0X1JvIGxpYnJhcnkgZ2VuZXJhdGVkIGJ5IEZkR2VuICIgQykKKworIyBDb21waWxlIGFzIGEgbW9kdWxlCitGRF9BRERfRVhURU5TSU9OKGRpY3RfUm8gZGljdF9Sby5jKQorCisKKyMjIyMKKyMjIElOU1RBTEwgc2VjdGlvbiAjIworCitJTlNUQUxMKFRBUkdFVFMgZGljdF9SbworCUxJQlJBUlkgREVTVElOQVRJT04gJHtJTlNUQUxMX0VYVEVOU0lPTlNfU1VGRklYfQorQ09NUE9ORU5UIGZyZWVEaWFtZXRlci1kaWN0aW9uYXJ5LVJPKQorCisKKwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X1JvL1JvLmRpZCBiL2V4dGVuc2lvbnMvZGljdF9Sby9Sby5kaWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYwMGQ4NQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF9Sby9Sby5kaWQKQEAgLTAsMCArMSwzOSBAQAorZGljdF9DcmVkaXRDb250cm9sCitkaWN0X3JmYzY5NDJfYXZwcworZGljdF90czI5NDY4X2F2cHMKK2RpY3RfdHMyOTE1NF9hdnBzCitkaWN0X3RzMjkyMTRfYXZwcworZGljdF90czI5MjE1X2F2cHMKK2RpY3RfdHMyOTIxN19hdnBzCitkaWN0X3RzMjkzMzdfYXZwcworZGljdF90czI5MzQzX2F2cHMKK2RpY3RfdHMyOTMzOF9hdnBzCitkaWN0X3RzMjkxMjhfYXZwcworZGljdF90czI5MzQ0X2F2cHMKK2RpY3RfdHMyOTM0NV9hdnBzCitkaWN0X3RzMjkxNzNfYXZwcworZGljdF90czMyMjk5X2F2cHMKK2RpY3RfcmZjNjczNF9hdnBzCitkaWN0X3JmYzU1ODBfYXZwcworZGljdF9yZmM0MDcyX2F2cHMKK2RpY3RfdHMyOTI3M19hdnBzCitkaWN0X3JmYzQwMDZiaXNfYXZwcworZGljdF90czI5MjEyX2F2cHMKK2RpY3RfdHMyOTA2MV9hdnBzCitkaWN0X3RzMjkyNzJfYXZwcworZGljdF9yZmM1NDQ3X2F2cHMKK2RpY3RfcmZjNTc3OF9hdnBzCitkaWN0X3JmYzU3NzdfYXZwcworZGljdF90czI5MzM2X2F2cHMKK2RpY3RfZXRzaTI4MzAzNF9hdnBzCitkaWN0X3JmYzQ1OTBfYXZwcworZGljdF9yZmM0MDA0X2F2cHMKK2RpY3RfcmZjNzE1NV9hdnBzCitkaWN0X3RzMjkyMjlfYXZwcworZGljdF9yZmM3NjgzX2F2cHMKK2RpY3RfZHJhZnRsb2FkX2F2cHMKK2RpY3RfcmZjNzk0NF9hdnBzCitkaWN0X3RzMjkzMjlfYXZwcworZGljdF90czI5MzY4X2F2cHMKK2RpY3RfM2dwcDJfYXZwcworZGljdF9SbwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X1JvL2RpY3RfUm8uYyBiL2V4dGVuc2lvbnMvZGljdF9Sby9kaWN0X1JvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg3OTlmNwotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF9Sby9kaWN0X1JvLmMKQEAgLTAsMCArMSwzMTAgQEAKKy8qCisqIENvcHlyaWdodCAoYykgMjAxNyBTcHJpbnQKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLyoqKioqKioqKioqKioqKioKKyBHZW5lcmF0ZWQgQnk6IGZkdG9vbCBlbmhhbmNlbWVudHMgdG8gZGlhZnV6emVyCisgTGljZW5zZTogc2FtZSBhcyBmcmVlRGlhbWV0ZXIKKyoqKioqKioqKioqKioqKiovCisKKworLyogCisgKiBEaWN0aW9uYXJ5IGRlZmluaXRpb25zIG9mIG9iamVjdHMgc3BlY2lmaWVkIGluIFJvIChlMzApLgorICovCisjaW5jbHVkZSA8ZnJlZURpYW1ldGVyL2V4dGVuc2lvbi5oPgorCisjZGVmaW5lIFBST1RPX1ZFUiAiZTMwIgorI2RlZmluZSBHRU5fREFURSAgMTUwNjY5NzEyOS42MgorCitjb25zdCBjaGFyICpyb19wcm90b192ZXIgPSBQUk9UT19WRVI7Citjb25zdCBkb3VibGUgcm9fZ2VuX2RhdGUgPSBHRU5fREFURTsKKworLyogVGhlIGNvbnRlbnQgb2YgdGhpcyBmaWxlIGZvbGxvd3MgdGhlIHNhbWUgc3RydWN0dXJlIGFzIGRpY3RfYmFzZV9wcm90by5jICovCisKKyNkZWZpbmUgQ0hFQ0tfZGljdF9uZXcoIF90eXBlLCBfZGF0YSwgX3BhcmVudCwgX3JlZiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgX3JldCA9IGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIChfdHlwZSksIChfZGF0YSksIChfcGFyZW50KSwgKF9yZWYpICk7IFwKKyAgICBpZiAoIF9yZXQgIT0gMCAmJiBfcmV0ICE9IEVFWElTVCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICByZXR1cm4gX3JldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBDSEVDS19kaWN0X3NlYXJjaCggX3R5cGUsIF9jcml0ZXJpYSwgX3doYXQsIF9yZXN1bHQgKQkJXAorICAgIENIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIChfdHlwZSksIChfY3JpdGVyaWEpLCAoX3doYXQpLCAoX3Jlc3VsdCksIEVOT0VOVCkgKTsKKworc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24geworICAgIHN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lOworICAgIGVudW0gcnVsZV9wb3NpdGlvbglwb3NpdGlvbjsKKyAgICBpbnQgCQkJbWluOworICAgIGludAkJCW1heDsKK307CisKKyNkZWZpbmUgUlVMRV9PUkRFUiggX3Bvc2l0aW9uICkgKCgoKF9wb3NpdGlvbikgPT0gUlVMRV9GSVhFRF9IRUFEKSB8fCAoKF9wb3NpdGlvbikgPT0gUlVMRV9GSVhFRF9UQUlMKSkgPyAxIDogMCApCisKKy8qIEF0dGVudGlvbiEgVGhpcyB2ZXJzaW9uIG9mIHRoZSBtYWNybyB1c2VzIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsIGluIGNvbnRyYXN0IHRvIG1vc3Qgb3RoZXIgY29waWVzISAqLworI2RlZmluZSBQQVJTRV9sb2NfcnVsZXMoIF9ydWxlYXJyYXksIF9wYXJlbnQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBfX2FyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yIChfX2FyPTA7IF9fYXIgPCBzaXplb2YoX3J1bGVhcnJheSkgLyBzaXplb2YoKF9ydWxlYXJyYXkpWzBdKTsgX19hcisrKSB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHN0cnVjdCBkaWN0X3J1bGVfZGF0YSBfX2RhdGEgPSB7IE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ucG9zaXRpb24sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLm1pbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ubWF4fTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfX2RhdGEucnVsZV9vcmRlciA9IFJVTEVfT1JERVIoX19kYXRhLnJ1bGVfcG9zaXRpb24pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIENIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIERJQ1RfQVZQLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAmKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICZfX2RhdGEucnVsZV9hdnAsIDAgKSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmICggIV9fZGF0YS5ydWxlX2F2cCApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9ERUJVRyhJTkZPLCAiQVZQIE5vdCBmb3VuZDogJyVzJyIsIChfcnVsZWFycmF5KVtfX2FyXS5hdnBfdmVuZG9yX3BsdXNfbmFtZS5hdnBfbmFtZSk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFTk9FTlQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgX3JldCA9IGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfUlVMRSwgJihfX2RhdGEpLCAoX3BhcmVudCksIE5VTEwgKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggX3JldCAhPSAwICYmIF9yZXQgIT0gRUVYSVNUICkgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFX0RFQlVHKElORk8sICJFcnJvciBvbiBydWxlIHdpdGggQVZQICclcyciLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLmF2cF9uYW1lKTsgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRUlOVkFMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgQ0hFQ0tfdmVuZG9yX25ldyggX2RhdGEgKSB7IFwKKyAgICAgICAgc3RydWN0IGRpY3Rfb2JqZWN0ICogdmVuZG9yX2ZvdW5kOyBcCisgICAgICAgIGlmIChmZF9kaWN0X3NlYXJjaChmZF9nX2NvbmZpZy0+Y25mX2RpY3QsRElDVF9WRU5ET1IsVkVORE9SX0JZX0lELCZfZGF0YS52ZW5kb3JfaWQsJnZlbmRvcl9mb3VuZCxFTk9FTlQpID09IEVOT0VOVCkgeyBcCisgICAgICAgICAgICAgICAgQ0hFQ0tfRkNUKGZkX2RpY3RfbmV3KGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9WRU5ET1IsICZfZGF0YSwgTlVMTCwgTlVMTCkpOyBcCisgICAgICAgIH0gXAorfQorCisjZGVmaW5lIGVudW12YWxfZGVmX3UzMiggX3ZhbF8sIF9zdHJfICkJCVwKKyAgICB7IF9zdHJfLCAJCXsgLnUzMiA9IF92YWxfIH19CisKKyNkZWZpbmUgZW51bXZhbF9kZWZfb3MoIF9sZW5fLCBfdmFsXywgX3N0cl8gKQkJCQlcCisgICAgeyBfc3RyXywgCQl7IC5vcyA9IHsgLmRhdGEgPSAodW5zaWduZWQgY2hhciAqKV92YWxfLCAubGVuID0gX2xlbl8gfX19CisKKworc3RhdGljIGludCBkaWN0X3JvX2xvYWRfZGVmcyhjaGFyICogY29uZmZpbGUpCit7CisgICBUUkFDRV9FTlRSWSgiJXAiLCBjb25mZmlsZSk7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXBwX2lkMzsKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhcHBfaWQ0OworCisJLyogQXBwbGljYXRpb24gU2VjdGlvbiAqLworCXsKKwkgIHsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIHZlbmRvcjsKKwkJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfVkVORE9SLCBWRU5ET1JfQllfTkFNRSwgIjNHUFAiLCAmdmVuZG9yKQorCQkJc3RydWN0IGRpY3RfYXBwbGljYXRpb25fZGF0YSBkYXRhID0geyAzLCAiUm8tYXBwMyIgfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FQUExJQ0FUSU9OLCAmZGF0YSwgdmVuZG9yLCAmYXBwX2lkMykKKwkgIH0KKwkgIHsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIHZlbmRvcjsKKwkJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfVkVORE9SLCBWRU5ET1JfQllfTkFNRSwgIjNHUFAiLCAmdmVuZG9yKQorCQkJc3RydWN0IGRpY3RfYXBwbGljYXRpb25fZGF0YSBkYXRhID0geyA0LCAiUm8iIH07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BUFBMSUNBVElPTiwgJmRhdGEsIHZlbmRvciwgJmFwcF9pZDQpCisJICB9CisJfQorCisKKyAgIC8qIEFWUCBzZWN0aW9uICovCisgICB7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIEFkZHJlc3NfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogVVRGOFN0cmluZ190eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBEaWFtZXRlcklkZW50aXR5X3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIERpYW1ldGVyVVJJX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIFRpbWVfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogSVBGaWx0ZXJSdWxlX3R5cGU7CisKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiQWRkcmVzcyIsICZBZGRyZXNzX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJVVEY4U3RyaW5nIiwgJlVURjhTdHJpbmdfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkRpYW1ldGVySWRlbnRpdHkiLCAmRGlhbWV0ZXJJZGVudGl0eV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiRGlhbWV0ZXJVUkkiLCAmRGlhbWV0ZXJVUklfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIlRpbWUiLCAmVGltZV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiSVBGaWx0ZXJSdWxlIiwgJklQRmlsdGVyUnVsZV90eXBlKTsKKworCQorICAgfQorCisgICAvKiBDb21tYW5kcyBzZWN0aW9uICovCisgICB7CisKKyAgIH0KKworICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGljdF9yb19sb2FkX3J1bGVzKGNoYXIgKiBjb25mZmlsZSkKK3sKKyAgIC8qIEdyb3VwZWQgQVZQIHNlY3Rpb24gKi8KKyAgIHsKKworICAgfQkKKworICAgLyogQ29tbWFuZHMgc2VjdGlvbiAqLworICAgeworCSAgLyogQ3JlZGl0LUNvbnRyb2wtUmVxdWVzdCAqLworCSAgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJDcmVkaXQtQ29udHJvbC1SZXF1ZXN0IiwgJmNtZCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTZXNzaW9uLUlkIn0sIFJVTEVfRklYRURfSEVBRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLUhvc3QifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLVJlYWxtIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRlc3RpbmF0aW9uLVJlYWxtIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkF1dGgtQXBwbGljYXRpb24tSWQifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU2VydmljZS1Db250ZXh0LUlkIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkNDLVJlcXVlc3QtVHlwZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJDQy1SZXF1ZXN0LU51bWJlciJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEZXN0aW5hdGlvbi1Ib3N0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlVzZXItTmFtZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJDQy1TdWItU2Vzc2lvbi1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBY2N0LU11bHRpLVNlc3Npb24tSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLVN0YXRlLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkV2ZW50LVRpbWVzdGFtcCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTdWJzY3JpcHRpb24tSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU2VydmljZS1JZGVudGlmaWVyIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlRlcm1pbmF0aW9uLUNhdXNlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJlcXVlc3RlZC1TZXJ2aWNlLVVuaXQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUmVxdWVzdGVkLUFjdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJVc2VkLVNlcnZpY2UtVW5pdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQW9DLVJlcXVlc3QtVHlwZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJNdWx0aXBsZS1TZXJ2aWNlcy1JbmRpY2F0b3IifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiTXVsdGlwbGUtU2VydmljZXMtQ3JlZGl0LUNvbnRyb2wifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU2VydmljZS1QYXJhbWV0ZXItSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJDQy1Db3JyZWxhdGlvbi1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJVc2VyLUVxdWlwbWVudC1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlByb3h5LUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUm91dGUtUmVjb3JkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTZXJ2aWNlLUluZm9ybWF0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyhydWxlcywgY21kKTsKKwkgIH0KKwkgIC8qIENyZWRpdC1Db250cm9sLUFuc3dlciAqLworCSAgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJDcmVkaXQtQ29udHJvbC1BbnN3ZXIiLCAmY21kKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlNlc3Npb24tSWQifSwgUlVMRV9GSVhFRF9IRUFELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSZXN1bHQtQ29kZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tSG9zdCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQXV0aC1BcHBsaWNhdGlvbi1JZCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJDQy1SZXF1ZXN0LVR5cGUifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQ0MtUmVxdWVzdC1OdW1iZXIifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVXNlci1OYW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkNDLVNlc3Npb24tRmFpbG92ZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQ0MtU3ViLVNlc3Npb24tSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQWNjdC1NdWx0aS1TZXNzaW9uLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1TdGF0ZS1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJFdmVudC1UaW1lc3RhbXAifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiR3JhbnRlZC1TZXJ2aWNlLVVuaXQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiTXVsdGlwbGUtU2VydmljZXMtQ3JlZGl0LUNvbnRyb2wifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQ29zdC1JbmZvcm1hdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTG93LUJhbGFuY2UtSW5kaWNhdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUmVtYWluaW5nLUJhbGFuY2UifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRmluYWwtVW5pdC1JbmRpY2F0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkNoZWNrLUJhbGFuY2UtUmVzdWx0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkNyZWRpdC1Db250cm9sLUZhaWx1cmUtSGFuZGxpbmcifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRGlyZWN0LURlYml0aW5nLUZhaWx1cmUtSGFuZGxpbmcifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVmFsaWRpdHktVGltZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSZWRpcmVjdC1Ib3N0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJlZGlyZWN0LUhvc3QtVXNhZ2UifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUmVkaXJlY3QtTWF4LUNhY2hlLVRpbWUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUHJveHktSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSb3V0ZS1SZWNvcmQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRmFpbGVkLUFWUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU2VydmljZS1JbmZvcm1hdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMocnVsZXMsIGNtZCk7CisJICB9CisJICAvKiBSZS1BdXRoLVJlcXVlc3QgKi8KKwkgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX0NPTU1BTkQsIENNRF9CWV9OQU1FLCAiUmUtQXV0aC1SZXF1ZXN0IiwgJmNtZCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTZXNzaW9uLUlkIn0sIFJVTEVfRklYRURfSEVBRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLUhvc3QifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLVJlYWxtIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRlc3RpbmF0aW9uLVJlYWxtIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRlc3RpbmF0aW9uLUhvc3QifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQXV0aC1BcHBsaWNhdGlvbi1JZCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSZS1BdXRoLVJlcXVlc3QtVHlwZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJVc2VyLU5hbWUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLVN0YXRlLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlByb3h5LUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUm91dGUtUmVjb3JkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkNDLVN1Yi1TZXNzaW9uLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkctUy1VLVBvb2wtSWRlbnRpZmllciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTZXJ2aWNlLUlkZW50aWZpZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUmF0aW5nLUdyb3VwIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyhydWxlcywgY21kKTsKKwkgIH0KKwkgIC8qIFJlLUF1dGgtQW5zd2VyICovCisJICB7CisJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIlJlLUF1dGgtQW5zd2VyIiwgJmNtZCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTZXNzaW9uLUlkIn0sIFJVTEVfRklYRURfSEVBRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUmVzdWx0LUNvZGUifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLUhvc3QifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLVJlYWxtIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlVzZXItTmFtZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tU3RhdGUtSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRXJyb3ItTWVzc2FnZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJFcnJvci1SZXBvcnRpbmctSG9zdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJGYWlsZWQtQVZQIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJlZGlyZWN0LUhvc3QifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUmVkaXJlY3QtSG9zdC1Vc2FnZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSZWRpcmVjdC1NYXgtQ2FjaGUtVGltZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJQcm94eS1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkNDLVN1Yi1TZXNzaW9uLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkctUy1VLVBvb2wtSWRlbnRpZmllciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTZXJ2aWNlLUlkZW50aWZpZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUmF0aW5nLUdyb3VwIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyhydWxlcywgY21kKTsKKwkgIH0KKworICAgfQorCisgICBMT0dfRCggIkV4dGVuc2lvbiAnRGljdGlvbmFyeSBkZWZpbml0aW9ucyBmb3IgUm8gKGUzMCknIGluaXRpYWxpemVkIik7CisgICByZXR1cm4gMDsKK30KKworaW50IGRpY3RfZW50cnkoY2hhciAqIGNvbmZmaWxlKQoreworCWRpY3Rfcm9fbG9hZF9kZWZzKGNvbmZmaWxlKTsKKwlyZXR1cm4gZGljdF9yb19sb2FkX3J1bGVzKGNvbmZmaWxlKTsKK30KKworY29uc3QgY2hhciogZGljdF9yb19wcm90b192ZXIoY2hhciAqIGNvbmZmaWxlKSB7CisJcmV0dXJuIHJvX3Byb3RvX3ZlcjsKK30KKworY29uc3QgZG91YmxlIGRpY3Rfcm9fZ2VuX3RzKGNoYXIgKiBjb25mZmlsZSkgeworCXJldHVybiByb19nZW5fZGF0ZTsKK30KKworRVhURU5TSU9OX0VOVFJZMigiZGljdF9ybyIsIGRpY3Rfcm9fbG9hZF9kZWZzLCBkaWN0X3JvX2xvYWRfcnVsZXMsICJkaWN0X3RzMzIyOTlfYXZwcyIsICJkaWN0X3RzMjkyNzJfYXZwcyIsICJkaWN0X3RzMjkyNzNfYXZwcyIsICJkaWN0X3RzMjkyMTJfYXZwcyIsICJkaWN0X3RzMjkzMzZfYXZwcyIsICJkaWN0X3RzMjkxMjhfYXZwcyIsICJkaWN0X3RzMjkyMTRfYXZwcyIsICJkaWN0X3RzMjkzNDVfYXZwcyIsICJkaWN0X3RzMjkzMzdfYXZwcyIsICJkaWN0X3RzMjkzNDRfYXZwcyIsICJkaWN0X3RzMjkzNjhfYXZwcyIsICJkaWN0X3RzMjkyMTdfYXZwcyIsICJkaWN0X3RzMjkyMjlfYXZwcyIsICJkaWN0X3RzMjkzMzhfYXZwcyIsICJkaWN0X3RzMjk0NjhfYXZwcyIsICJkaWN0X3RzMjkzMjlfYXZwcyIsICJkaWN0X3RzMjkwNjFfYXZwcyIsICJkaWN0X3JmYzU3NzhfYXZwcyIsICJkaWN0X3RzMjkxNzNfYXZwcyIsICJkaWN0X0NyZWRpdENvbnRyb2wiLCAiZGljdF9yZmM0MDA2YmlzX2F2cHMiLCAiZGljdF90czI5MzQzX2F2cHMiLCAiZGljdF9yZmM3MTU1X2F2cHMiLCAiZGljdF9yZmM1NDQ3X2F2cHMiLCAiZGljdF9yZmM3NjgzX2F2cHMiLCAiZGljdF9yZmM0NTkwX2F2cHMiLCAiZGljdF9kcmFmdGxvYWRfYXZwcyIsICJkaWN0X3JmYzQwMDRfYXZwcyIsICJkaWN0X3JmYzU3NzdfYXZwcyIsICJkaWN0X2V0c2kyODMwMzRfYXZwcyIsICJkaWN0XzNncHAyX2F2cHMiLCAiZGljdF9yZmM3OTQ0X2F2cHMiKTsKKworCisKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF9SeC9DTWFrZUxpc3RzLnR4dCBiL2V4dGVuc2lvbnMvZGljdF9SeC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWM5OTljCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kaWN0X1J4L0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTYgQEAKKyMgVGhlIGRpY3RfUnggZXh0ZW5zaW9uCitQUk9KRUNUKCJkaWN0X1J4IGxpYnJhcnkgZ2VuZXJhdGVkIGJ5IEZkR2VuICIgQykKKworIyBDb21waWxlIGFzIGEgbW9kdWxlCitGRF9BRERfRVhURU5TSU9OKGRpY3RfUnggZGljdF9SeC5jKQorCisKKyMjIyMKKyMjIElOU1RBTEwgc2VjdGlvbiAjIworCitJTlNUQUxMKFRBUkdFVFMgZGljdF9SeAorCUxJQlJBUlkgREVTVElOQVRJT04gJHtJTlNUQUxMX0VYVEVOU0lPTlNfU1VGRklYfQorQ09NUE9ORU5UIGZyZWVEaWFtZXRlci1kaWN0aW9uYXJ5LVJYKQorCisKKwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X1J4L1J4LmRpZCBiL2V4dGVuc2lvbnMvZGljdF9SeC9SeC5kaWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUxNjkzNQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF9SeC9SeC5kaWQKQEAgLTAsMCArMSwzOSBAQAorZGljdF9OQVMKK2RpY3RfcmZjNjk0Ml9hdnBzCitkaWN0X3JmYzY3MzRfYXZwcworZGljdF9yZmM1NTgwX2F2cHMKK2RpY3RfdHMyOTQ2OF9hdnBzCitkaWN0X3RzMjkxNTRfYXZwcworZGljdF90czI5MjE0X2F2cHMKK2RpY3RfdHMyOTIxNV9hdnBzCitkaWN0X3RzMjkyMTdfYXZwcworZGljdF8zZ3BwMl9hdnBzCitkaWN0X3RzMjkzNDNfYXZwcworZGljdF90czI5MTI4X2F2cHMKK2RpY3RfdHMyOTM0NF9hdnBzCitkaWN0X3RzMjkzNDVfYXZwcworZGljdF90czMyMjk5X2F2cHMKK2RpY3RfcmZjNTc3OF9hdnBzCitkaWN0X3RzMjkzMzhfYXZwcworZGljdF90czI5MTczX2F2cHMKK2RpY3RfdHMyOTMzN19hdnBzCitkaWN0X2V0c2kyODMwMzRfYXZwcworZGljdF9yZmM0NTkwX2F2cHMKK2RpY3RfdHMyOTIyOV9hdnBzCitkaWN0X2RyYWZ0bG9hZF9hdnBzCitkaWN0X3RzMjkzMjlfYXZwcworZGljdF90czI5MzY4X2F2cHMKK2RpY3RfdHMyOTMzNl9hdnBzCitkaWN0X3RzMjkwNjFfYXZwcworZGljdF90czI5MjcyX2F2cHMKK2RpY3RfcmZjNzY4M19hdnBzCitkaWN0X3JmYzU3NzdfYXZwcworZGljdF9yZmM0MDA2YmlzX2F2cHMKK2RpY3RfdHMyOTIxMl9hdnBzCitkaWN0X3JmYzQwNzJfYXZwcworZGljdF9yZmM1NDQ3X2F2cHMKK2RpY3RfdHMyOTI3M19hdnBzCitkaWN0X3JmYzQwMDRfYXZwcworZGljdF9yZmM3MTU1X2F2cHMKK2RpY3RfcmZjNzk0NF9hdnBzCitkaWN0X1J4CmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfUngvZGljdF9SeC5jIGIvZXh0ZW5zaW9ucy9kaWN0X1J4L2RpY3RfUnguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWFkNTdkCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kaWN0X1J4L2RpY3RfUnguYwpAQCAtMCwwICsxLDQ3MSBAQAorLyoKKyogQ29weXJpZ2h0IChjKSAyMDE3IFNwcmludAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvKioqKioqKioqKioqKioqKgorIEdlbmVyYXRlZCBCeTogZmR0b29sIGVuaGFuY2VtZW50cyB0byBkaWFmdXp6ZXIKKyBMaWNlbnNlOiBzYW1lIGFzIGZyZWVEaWFtZXRlcgorKioqKioqKioqKioqKioqKi8KKworCisvKiAKKyAqIERpY3Rpb25hcnkgZGVmaW5pdGlvbnMgb2Ygb2JqZWN0cyBzcGVjaWZpZWQgaW4gUnggKGUzMCkuCisgKi8KKyNpbmNsdWRlIDxmcmVlRGlhbWV0ZXIvZXh0ZW5zaW9uLmg+CisKKyNkZWZpbmUgUFJPVE9fVkVSICJlMzAiCisjZGVmaW5lIEdFTl9EQVRFICAxNTA2Njk3MjA4LjYKKworY29uc3QgY2hhciAqcnhfcHJvdG9fdmVyID0gUFJPVE9fVkVSOworY29uc3QgZG91YmxlIHJ4X2dlbl9kYXRlID0gR0VOX0RBVEU7CisKKy8qIFRoZSBjb250ZW50IG9mIHRoaXMgZmlsZSBmb2xsb3dzIHRoZSBzYW1lIHN0cnVjdHVyZSBhcyBkaWN0X2Jhc2VfcHJvdG8uYyAqLworCisjZGVmaW5lIENIRUNLX2RpY3RfbmV3KCBfdHlwZSwgX2RhdGEsIF9wYXJlbnQsIF9yZWYgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IF9yZXQgPSBmZF9kaWN0X25ldyggZmRfZ19jb25maWctPmNuZl9kaWN0LCAoX3R5cGUpLCAoX2RhdGEpLCAoX3BhcmVudCksIChfcmVmKSApOyBcCisgICAgaWYgKCBfcmV0ICE9IDAgJiYgX3JldCAhPSBFRVhJU1QgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgcmV0dXJuIF9yZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgQ0hFQ0tfZGljdF9zZWFyY2goIF90eXBlLCBfY3JpdGVyaWEsIF93aGF0LCBfcmVzdWx0ICkJCVwKKyAgICBDSEVDS19GQ1QoICBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCAoX3R5cGUpLCAoX2NyaXRlcmlhKSwgKF93aGF0KSwgKF9yZXN1bHQpLCBFTk9FTlQpICk7CisKK3N0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHsKKyAgICBzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZTsKKyAgICBlbnVtIHJ1bGVfcG9zaXRpb24JcG9zaXRpb247CisgICAgaW50IAkJCW1pbjsKKyAgICBpbnQJCQltYXg7Cit9OworCisjZGVmaW5lIFJVTEVfT1JERVIoIF9wb3NpdGlvbiApICgoKChfcG9zaXRpb24pID09IFJVTEVfRklYRURfSEVBRCkgfHwgKChfcG9zaXRpb24pID09IFJVTEVfRklYRURfVEFJTCkpID8gMSA6IDAgKQorCisvKiBBdHRlbnRpb24hIFRoaXMgdmVyc2lvbiBvZiB0aGUgbWFjcm8gdXNlcyBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCBpbiBjb250cmFzdCB0byBtb3N0IG90aGVyIGNvcGllcyEgKi8KKyNkZWZpbmUgUEFSU0VfbG9jX3J1bGVzKCBfcnVsZWFycmF5LCBfcGFyZW50KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgX19hcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoX19hcj0wOyBfX2FyIDwgc2l6ZW9mKF9ydWxlYXJyYXkpIC8gc2l6ZW9mKChfcnVsZWFycmF5KVswXSk7IF9fYXIrKykgeyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgZGljdF9ydWxlX2RhdGEgX19kYXRhID0geyBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLnBvc2l0aW9uLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5taW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLm1heH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgX19kYXRhLnJ1bGVfb3JkZXIgPSBSVUxFX09SREVSKF9fZGF0YS5ydWxlX3Bvc2l0aW9uKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBDSEVDS19GQ1QoICBmZF9kaWN0X3NlYXJjaCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgZmRfZ19jb25maWctPmNuZl9kaWN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBESUNUX0FWUCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgJihfcnVsZWFycmF5KVtfX2FyXS5hdnBfdmVuZG9yX3BsdXNfbmFtZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAmX19kYXRhLnJ1bGVfYXZwLCAwICkgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpZiAoICFfX2RhdGEucnVsZV9hdnAgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfREVCVUcoSU5GTywgIkFWUCBOb3QgZm91bmQ6ICclcyciLCAoX3J1bGVhcnJheSlbX19hcl0uYXZwX3ZlbmRvcl9wbHVzX25hbWUuYXZwX25hbWUpOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRU5PRU5UOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IF9yZXQgPSBmZF9kaWN0X25ldyggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1JVTEUsICYoX19kYXRhKSwgKF9wYXJlbnQpLCBOVUxMICk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIF9yZXQgIT0gMCAmJiBfcmV0ICE9IEVFWElTVCApICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9ERUJVRyhJTkZPLCAiRXJyb3Igb24gcnVsZSB3aXRoIEFWUCAnJXMnIiwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5hdnBfdmVuZG9yX3BsdXNfbmFtZS5hdnBfbmFtZSk7ICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVJTlZBTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIENIRUNLX3ZlbmRvcl9uZXcoIF9kYXRhICkgeyBcCisgICAgICAgIHN0cnVjdCBkaWN0X29iamVjdCAqIHZlbmRvcl9mb3VuZDsgXAorICAgICAgICBpZiAoZmRfZGljdF9zZWFyY2goZmRfZ19jb25maWctPmNuZl9kaWN0LERJQ1RfVkVORE9SLFZFTkRPUl9CWV9JRCwmX2RhdGEudmVuZG9yX2lkLCZ2ZW5kb3JfZm91bmQsRU5PRU5UKSA9PSBFTk9FTlQpIHsgXAorICAgICAgICAgICAgICAgIENIRUNLX0ZDVChmZF9kaWN0X25ldyhmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfVkVORE9SLCAmX2RhdGEsIE5VTEwsIE5VTEwpKTsgXAorICAgICAgICB9IFwKK30KKworI2RlZmluZSBlbnVtdmFsX2RlZl91MzIoIF92YWxfLCBfc3RyXyApCQlcCisgICAgeyBfc3RyXywgCQl7IC51MzIgPSBfdmFsXyB9fQorCisjZGVmaW5lIGVudW12YWxfZGVmX29zKCBfbGVuXywgX3ZhbF8sIF9zdHJfICkJCQkJXAorICAgIHsgX3N0cl8sIAkJeyAub3MgPSB7IC5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilfdmFsXywgLmxlbiA9IF9sZW5fIH19fQorCisKK3N0YXRpYyBpbnQgZGljdF9yeF9sb2FkX2RlZnMoY2hhciAqIGNvbmZmaWxlKQoreworICAgVFJBQ0VfRU5UUlkoIiVwIiwgY29uZmZpbGUpOworCXN0cnVjdCBkaWN0X29iamVjdCAqIGFwcF9pZDE2Nzc3MjI0OworCXN0cnVjdCBkaWN0X29iamVjdCAqIGFwcF9pZDE2Nzc3MjI5OworCisJLyogQXBwbGljYXRpb24gU2VjdGlvbiAqLworCXsKKwkgIHsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIHZlbmRvcjsKKwkJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfVkVORE9SLCBWRU5ET1JfQllfTkFNRSwgIjNHUFAiLCAmdmVuZG9yKQorCQkJc3RydWN0IGRpY3RfYXBwbGljYXRpb25fZGF0YSBkYXRhID0geyAxNjc3NzIyNCwgIlJ4IiB9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVBQTElDQVRJT04sICZkYXRhLCB2ZW5kb3IsICZhcHBfaWQxNjc3NzIyNCkKKwkgIH0KKwkgIHsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIHZlbmRvcjsKKwkJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfVkVORE9SLCBWRU5ET1JfQllfTkFNRSwgIjNHUFAiLCAmdmVuZG9yKQorCQkJc3RydWN0IGRpY3RfYXBwbGljYXRpb25fZGF0YSBkYXRhID0geyAxNjc3NzIyOSwgIlJ4LWFwcDE2Nzc3MjI5IiB9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVBQTElDQVRJT04sICZkYXRhLCB2ZW5kb3IsICZhcHBfaWQxNjc3NzIyOSkKKwkgIH0KKwkgIC8qIFJlc3VsdCBjb2RlcyAqLworCSAgeworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICp0eXBlOworCQkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJFbnVtZXJhdGVkKFJlc3VsdC1Db2RlKSIsJnR5cGUpOworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJSRVFVRVNURURfU0VSVklDRV9URU1QT1JBUklMWV9OT1RfQVVUSE9SSVpFRCIsIHsgLnUzMj00MjYxIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJJTlZBTElEX1NFUlZJQ0VfSU5GT1JNQVRJT04iLCB7IC51MzI9NTA2MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAiRklMVEVSX1JFU1RSSUNUSU9OUyIsIHsgLnUzMj01MDYyIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzQgPSB7ICJSRVFVRVNURURfU0VSVklDRV9OT1RfQVVUSE9SSVpFRCIsIHsgLnUzMj01MDYzIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzUgPSB7ICJEVVBMSUNBVEVEX0FGX1NFU1NJT04iLCB7IC51MzI9NTA2NCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF82ID0geyAiSVAtQ0FOX1NFU1NJT05fTk9UX0FWQUlMQUJMRSIsIHsgLnUzMj01MDY1IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzcgPSB7ICJVTkFVVEhPUklaRURfTk9OX0VNRVJHRU5DWV9TRVNTSU9OIiwgeyAudTMyPTUwNjYgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfOCA9IHsgIlVOQVVUSE9SSVpFRF9TUE9OU09SRURfREFUQV9DT05ORUNUSVZJVFkiLCB7IC51MzI9NTA2NyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF85ID0geyAiVEVNUE9SQVJZX05FVFdPUktfRkFJTFVSRSIsIHsgLnUzMj01MDY4IH19OworCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF80LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzUsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF83LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzgsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfOSwgdHlwZSwgTlVMTCk7CisKKwkgIH0KKwl9CisKKworICAgLyogQVZQIHNlY3Rpb24gKi8KKyAgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogQWRkcmVzc190eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBVVEY4U3RyaW5nX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIERpYW1ldGVySWRlbnRpdHlfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogRGlhbWV0ZXJVUklfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogVGltZV90eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBJUEZpbHRlclJ1bGVfdHlwZTsKKworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJBZGRyZXNzIiwgJkFkZHJlc3NfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIlVURjhTdHJpbmciLCAmVVRGOFN0cmluZ190eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiRGlhbWV0ZXJJZGVudGl0eSIsICZEaWFtZXRlcklkZW50aXR5X3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJEaWFtZXRlclVSSSIsICZEaWFtZXRlclVSSV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiVGltZSIsICZUaW1lX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJJUEZpbHRlclJ1bGUiLCAmSVBGaWx0ZXJSdWxlX3R5cGUpOworCisJCisgICB9CisKKyAgIC8qIENvbW1hbmRzIHNlY3Rpb24gKi8KKyAgIHsKKworICAgfQorCisgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkaWN0X3J4X2xvYWRfcnVsZXMoY2hhciAqIGNvbmZmaWxlKQoreworICAgLyogR3JvdXBlZCBBVlAgc2VjdGlvbiAqLworICAgeworCisgICB9CQorCisgICAvKiBDb21tYW5kcyBzZWN0aW9uICovCisgICB7CisJICAvKiBBQS1SZXF1ZXN0ICovCisJICB7CisJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIkFBLVJlcXVlc3QiLCAmY21kKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlNlc3Npb24tSWQifSwgUlVMRV9GSVhFRF9IRUFELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEUk1QIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkF1dGgtQXBwbGljYXRpb24tSWQifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLUhvc3QifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLVJlYWxtIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRlc3RpbmF0aW9uLVJlYWxtIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRlc3RpbmF0aW9uLUhvc3QifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIklQLURvbWFpbi1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBdXRoLVNlc3Npb24tU3RhdGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFGLUFwcGxpY2F0aW9uLUlkZW50aWZpZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1lZGlhLUNvbXBvbmVudC1EZXNjcmlwdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU2VydmljZS1JbmZvLVN0YXR1cyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQUYtQ2hhcmdpbmctSWRlbnRpZmllciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU0lQLUZvcmtpbmctSW5kaWNhdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU3BlY2lmaWMtQWN0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlN1YnNjcmlwdGlvbi1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPQy1TdXBwb3J0ZWQtRmVhdHVyZXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlN1cHBvcnRlZC1GZWF0dXJlcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEzMDE5LCAuYXZwX25hbWUgPSAiUmVzZXJ2YXRpb24tUHJpb3JpdHkifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRnJhbWVkLUlQLUFkZHJlc3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRnJhbWVkLUlQdjYtUHJlZml4In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkNhbGxlZC1TdGF0aW9uLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTZXJ2aWNlLVVSTiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU3BvbnNvcmVkLUNvbm5lY3Rpdml0eS1EYXRhIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNUFMtSWRlbnRpZmllciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiR0NTLUlkZW50aWZpZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1DUFRULUlkZW50aWZpZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJ4LVJlcXVlc3QtVHlwZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUmVxdWlyZWQtQWNjZXNzLUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFGLVJlcXVlc3RlZC1EYXRhIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJSZWZlcmVuY2UtSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlByZS1lbXB0aW9uLUNvbnRyb2wtSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tU3RhdGUtSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUHJveHktSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSb3V0ZS1SZWNvcmQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKHJ1bGVzLCBjbWQpOworCSAgfQorCSAgLyogQUEtQW5zd2VyICovCisJICB7CisJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIkFBLUFuc3dlciIsICZjbWQpCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU2Vzc2lvbi1JZCJ9LCBSVUxFX0ZJWEVEX0hFQUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRSTVAifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQXV0aC1BcHBsaWNhdGlvbi1JZCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tSG9zdCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUmVzdWx0LUNvZGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRXhwZXJpbWVudGFsLVJlc3VsdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBdXRoLVNlc3Npb24tU3RhdGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFjY2Vzcy1OZXR3b3JrLUNoYXJnaW5nLUlkZW50aWZpZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFjY2Vzcy1OZXR3b3JrLUNoYXJnaW5nLUFkZHJlc3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFjY2VwdGFibGUtU2VydmljZS1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBTi1HVy1BZGRyZXNzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBTi1UcnVzdGVkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTZXJ2aWNlLUF1dGhvcml6YXRpb24tSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiSVAtQ0FOLVR5cGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk5ldExvYy1BY2Nlc3MtU3VwcG9ydCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUkFULVR5cGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkZsb3dzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9DLVN1cHBvcnRlZC1GZWF0dXJlcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPQy1PTFIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlN1cHBvcnRlZC1GZWF0dXJlcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTdWJzY3JpcHRpb24tSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVXNlci1FcXVpcG1lbnQtSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiM0dQUC1TR1NOLU1DQy1NTkMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQ2xhc3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRXJyb3ItTWVzc2FnZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJFcnJvci1SZXBvcnRpbmctSG9zdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJGYWlsZWQtQVZQIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJSZXRyeS1JbnRlcnZhbCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tU3RhdGUtSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUmVkaXJlY3QtSG9zdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSZWRpcmVjdC1Ib3N0LVVzYWdlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJlZGlyZWN0LU1heC1DYWNoZS1UaW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlByb3h5LUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiTG9hZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMocnVsZXMsIGNtZCk7CisJICB9CisJICAvKiBSZS1BdXRoLVJlcXVlc3QgKi8KKwkgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX0NPTU1BTkQsIENNRF9CWV9OQU1FLCAiUmUtQXV0aC1SZXF1ZXN0IiwgJmNtZCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTZXNzaW9uLUlkIn0sIFJVTEVfRklYRURfSEVBRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRFJNUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tSG9zdCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRGVzdGluYXRpb24tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRGVzdGluYXRpb24tSG9zdCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBdXRoLUFwcGxpY2F0aW9uLUlkIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTcGVjaWZpYy1BY3Rpb24ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT0MtU3VwcG9ydGVkLUZlYXR1cmVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBY2Nlc3MtTmV0d29yay1DaGFyZ2luZy1JZGVudGlmaWVyIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBY2Nlc3MtTmV0d29yay1DaGFyZ2luZy1BZGRyZXNzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBTi1HVy1BZGRyZXNzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBTi1UcnVzdGVkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJGbG93cyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTdWJzY3JpcHRpb24tSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFib3J0LUNhdXNlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJJUC1DQU4tVHlwZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTmV0TG9jLUFjY2Vzcy1TdXBwb3J0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJSQVQtVHlwZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU3BvbnNvcmVkLUNvbm5lY3Rpdml0eS1EYXRhIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICIzR1BQLVVzZXItTG9jYXRpb24tSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVXNlci1Mb2NhdGlvbi1JbmZvLVRpbWUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIjNHUFAtTVMtVGltZVpvbmUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJBTi1OQVMtUmVsZWFzZS1DYXVzZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiM0dQUC1TR1NOLU1DQy1NTkMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlRXQU4tSWRlbnRpZmllciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVENQLVNvdXJjZS1Qb3J0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJVRFAtU291cmNlLVBvcnQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlVFLUxvY2FsLUlQLUFkZHJlc3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLVN0YXRlLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkNsYXNzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlByb3h5LUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUm91dGUtUmVjb3JkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyhydWxlcywgY21kKTsKKwkgIH0KKwkgIC8qIFJlLUF1dGgtQW5zd2VyICovCisJICB7CisJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIlJlLUF1dGgtQW5zd2VyIiwgJmNtZCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTZXNzaW9uLUlkIn0sIFJVTEVfRklYRURfSEVBRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRFJNUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tSG9zdCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUmVzdWx0LUNvZGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRXhwZXJpbWVudGFsLVJlc3VsdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPQy1TdXBwb3J0ZWQtRmVhdHVyZXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT0MtT0xSIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNZWRpYS1Db21wb25lbnQtRGVzY3JpcHRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNlcnZpY2UtVVJOIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1TdGF0ZS1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJDbGFzcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJFcnJvci1NZXNzYWdlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkVycm9yLVJlcG9ydGluZy1Ib3N0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJlZGlyZWN0LUhvc3QifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUmVkaXJlY3QtSG9zdC1Vc2FnZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSZWRpcmVjdC1NYXgtQ2FjaGUtVGltZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJGYWlsZWQtQVZQIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlByb3h5LUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKHJ1bGVzLCBjbWQpOworCSAgfQorCSAgLyogU2Vzc2lvbi1UZXJtaW5hdGlvbi1SZXF1ZXN0ICovCisJICB7CisJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIlNlc3Npb24tVGVybWluYXRpb24tUmVxdWVzdCIsICZjbWQpCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU2Vzc2lvbi1JZCJ9LCBSVUxFX0ZJWEVEX0hFQUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRSTVAifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLUhvc3QifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLVJlYWxtIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRlc3RpbmF0aW9uLVJlYWxtIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkF1dGgtQXBwbGljYXRpb24tSWQifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVGVybWluYXRpb24tQ2F1c2UifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRGVzdGluYXRpb24tSG9zdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPQy1TdXBwb3J0ZWQtRmVhdHVyZXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJlcXVpcmVkLUFjY2Vzcy1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkNsYXNzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1TdGF0ZS1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJQcm94eS1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJvdXRlLVJlY29yZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMocnVsZXMsIGNtZCk7CisJICB9CisJICAvKiBTZXNzaW9uLVRlcm1pbmF0aW9uLUFuc3dlciAqLworCSAgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJTZXNzaW9uLVRlcm1pbmF0aW9uLUFuc3dlciIsICZjbWQpCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU2Vzc2lvbi1JZCJ9LCBSVUxFX0ZJWEVEX0hFQUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRSTVAifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLUhvc3QifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLVJlYWxtIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJlc3VsdC1Db2RlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkVycm9yLU1lc3NhZ2UifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRXJyb3ItUmVwb3J0aW5nLUhvc3QifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT0MtU3VwcG9ydGVkLUZlYXR1cmVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9DLU9MUiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJGYWlsZWQtQVZQIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTcG9uc29yZWQtQ29ubmVjdGl2aXR5LURhdGEifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLVN0YXRlLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICIzR1BQLVVzZXItTG9jYXRpb24tSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVXNlci1Mb2NhdGlvbi1JbmZvLVRpbWUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIjNHUFAtTVMtVGltZVpvbmUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJBTi1OQVMtUmVsZWFzZS1DYXVzZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiM0dQUC1TR1NOLU1DQy1NTkMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlRXQU4tSWRlbnRpZmllciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVENQLVNvdXJjZS1Qb3J0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJVRFAtU291cmNlLVBvcnQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlVFLUxvY2FsLUlQLUFkZHJlc3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk5ldExvYy1BY2Nlc3MtU3VwcG9ydCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJDbGFzcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSZWRpcmVjdC1Ib3N0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJlZGlyZWN0LUhvc3QtVXNhZ2UifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUmVkaXJlY3QtTWF4LUNhY2hlLVRpbWUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUHJveHktSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJMb2FkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyhydWxlcywgY21kKTsKKwkgIH0KKwkgIC8qIEFib3J0LVNlc3Npb24tUmVxdWVzdCAqLworCSAgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJBYm9ydC1TZXNzaW9uLVJlcXVlc3QiLCAmY21kKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlNlc3Npb24tSWQifSwgUlVMRV9GSVhFRF9IRUFELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEUk1QIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1Ib3N0In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEZXN0aW5hdGlvbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEZXN0aW5hdGlvbi1Ib3N0In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkF1dGgtQXBwbGljYXRpb24tSWQifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT0MtU3VwcG9ydGVkLUZlYXR1cmVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBYm9ydC1DYXVzZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tU3RhdGUtSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUHJveHktSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSb3V0ZS1SZWNvcmQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKHJ1bGVzLCBjbWQpOworCSAgfQorCSAgLyogQWJvcnQtU2Vzc2lvbi1BbnN3ZXIgKi8KKwkgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX0NPTU1BTkQsIENNRF9CWV9OQU1FLCAiQWJvcnQtU2Vzc2lvbi1BbnN3ZXIiLCAmY21kKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlNlc3Npb24tSWQifSwgUlVMRV9GSVhFRF9IRUFELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEUk1QIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1Ib3N0In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSZXN1bHQtQ29kZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPQy1TdXBwb3J0ZWQtRmVhdHVyZXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT0MtT0xSIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1TdGF0ZS1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJFcnJvci1NZXNzYWdlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkVycm9yLVJlcG9ydGluZy1Ib3N0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkZhaWxlZC1BVlAifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUmVkaXJlY3QtSG9zdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSZWRpcmVjdC1Ib3N0LVVzYWdlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJlZGlyZWN0LU1heC1DYWNoZS1UaW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlByb3h5LUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKHJ1bGVzLCBjbWQpOworCSAgfQorCisgICB9CisKKyAgIExPR19EKCAiRXh0ZW5zaW9uICdEaWN0aW9uYXJ5IGRlZmluaXRpb25zIGZvciBSeCAoZTMwKScgaW5pdGlhbGl6ZWQiKTsKKyAgIHJldHVybiAwOworfQorCitpbnQgZGljdF9lbnRyeShjaGFyICogY29uZmZpbGUpCit7CisJZGljdF9yeF9sb2FkX2RlZnMoY29uZmZpbGUpOworCXJldHVybiBkaWN0X3J4X2xvYWRfcnVsZXMoY29uZmZpbGUpOworfQorCitjb25zdCBjaGFyKiBkaWN0X3J4X3Byb3RvX3ZlcihjaGFyICogY29uZmZpbGUpIHsKKwlyZXR1cm4gcnhfcHJvdG9fdmVyOworfQorCitjb25zdCBkb3VibGUgZGljdF9yeF9nZW5fdHMoY2hhciAqIGNvbmZmaWxlKSB7CisJcmV0dXJuIHJ4X2dlbl9kYXRlOworfQorCitFWFRFTlNJT05fRU5UUlkyKCJkaWN0X3J4IiwgZGljdF9yeF9sb2FkX2RlZnMsIGRpY3RfcnhfbG9hZF9ydWxlcywgImRpY3RfdHMzMjI5OV9hdnBzIiwgImRpY3RfdHMyOTIxNF9hdnBzIiwgImRpY3RfdHMyOTIxMl9hdnBzIiwgImRpY3RfdHMyOTI3M19hdnBzIiwgImRpY3RfdHMyOTIyOV9hdnBzIiwgImRpY3RfdHMyOTE1NF9hdnBzIiwgImRpY3RfdHMyOTA2MV9hdnBzIiwgImRpY3RfTkFTIiwgImRpY3RfcmZjNDAwNmJpc19hdnBzIiwgImRpY3RfZHJhZnRsb2FkX2F2cHMiLCAiZGljdF9yZmM3NjgzX2F2cHMiLCAiZGljdF9yZmM3MTU1X2F2cHMiLCAiZGljdF9ldHNpMjgzMDM0X2F2cHMiLCAiZGljdF9yZmM3OTQ0X2F2cHMiKTsKKworCisKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF9TNmFzNmQvQ01ha2VMaXN0cy50eHQgYi9leHRlbnNpb25zL2RpY3RfUzZhczZkL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyODkwMGQKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfUzZhczZkL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTYgQEAKKyMgVGhlIGRpY3RfUzZhczZkIGV4dGVuc2lvbgorUFJPSkVDVCgiZGljdF9TNmFzNmQgbGlicmFyeSBnZW5lcmF0ZWQgYnkgRmRHZW4gIiBDKQorCisjIENvbXBpbGUgYXMgYSBtb2R1bGUKK0ZEX0FERF9FWFRFTlNJT04oZGljdF9TNmFzNmQgZGljdF9TNmFzNmQuYykKKworCisjIyMjCisjIyBJTlNUQUxMIHNlY3Rpb24gIyMKKworSU5TVEFMTChUQVJHRVRTIGRpY3RfUzZhczZkCisJTElCUkFSWSBERVNUSU5BVElPTiAke0lOU1RBTExfRVhURU5TSU9OU19TVUZGSVh9CitDT01QT05FTlQgZnJlZURpYW1ldGVyLWRpY3Rpb25hcnktUzZBUzZEKQorCisKKwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X1M2YXM2ZC9TNmFzNmQuZGlkIGIvZXh0ZW5zaW9ucy9kaWN0X1M2YXM2ZC9TNmFzNmQuZGlkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YmRiMzQKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfUzZhczZkL1M2YXM2ZC5kaWQKQEAgLTAsMCArMSwzOCBAQAorZGljdF9yZmM2OTQyX2F2cHMKK2RpY3RfdHMyOTQ2OF9hdnBzCitkaWN0X3RzMjkzNDNfYXZwcworZGljdF90czI5MTI4X2F2cHMKK2RpY3RfdHMyOTM0NF9hdnBzCitkaWN0X3RzMjkzNDVfYXZwcworZGljdF90czI5MzM3X2F2cHMKK2RpY3RfM2dwcDJfYXZwcworZGljdF90czI5MTU0X2F2cHMKK2RpY3RfdHMyOTIxNF9hdnBzCitkaWN0X3RzMjkyMTVfYXZwcworZGljdF90czI5MjE3X2F2cHMKK2RpY3RfdHMyOTMzOF9hdnBzCitkaWN0X3RzMjkxNzNfYXZwcworZGljdF90czI5MzM2X2F2cHMKK2RpY3RfcmZjNDU5MF9hdnBzCitkaWN0X3RzMjkyMjlfYXZwcworZGljdF90czI5MzI5X2F2cHMKK2RpY3RfdHMyOTM2OF9hdnBzCitkaWN0X3RzMzIyOTlfYXZwcworZGljdF9yZmM2NzM0X2F2cHMKK2RpY3RfcmZjNTc3OF9hdnBzCitkaWN0X2RyYWZ0bG9hZF9hdnBzCitkaWN0X2V0c2kyODMwMzRfYXZwcworZGljdF9yZmM1NTgwX2F2cHMKK2RpY3RfcmZjNDA3Ml9hdnBzCitkaWN0X3RzMjkyNzNfYXZwcworZGljdF90czI5MjcyX2F2cHMKK2RpY3RfcmZjNzY4M19hdnBzCitkaWN0X3JmYzc5NDRfYXZwcworZGljdF9yZmM1Nzc3X2F2cHMKK2RpY3RfcmZjNDAwNmJpc19hdnBzCitkaWN0X3JmYzcxNTVfYXZwcworZGljdF90czI5MjEyX2F2cHMKK2RpY3RfdHMyOTA2MV9hdnBzCitkaWN0X3JmYzQwMDRfYXZwcworZGljdF9yZmM1NDQ3X2F2cHMKK2RpY3RfUzZhczZkCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfUzZhczZkL2RpY3RfUzZhczZkLmMgYi9leHRlbnNpb25zL2RpY3RfUzZhczZkL2RpY3RfUzZhczZkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM5Yjc1ZAotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF9TNmFzNmQvZGljdF9TNmFzNmQuYwpAQCAtMCwwICsxLDcyMiBAQAorLyoKKyogQ29weXJpZ2h0IChjKSAyMDE3IFNwcmludAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvKioqKioqKioqKioqKioqKgorIEdlbmVyYXRlZCBCeTogZmR0b29sIGVuaGFuY2VtZW50cyB0byBkaWFmdXp6ZXIKKyBMaWNlbnNlOiBzYW1lIGFzIGZyZWVEaWFtZXRlcgorKioqKioqKioqKioqKioqKi8KKworCisvKiAKKyAqIERpY3Rpb25hcnkgZGVmaW5pdGlvbnMgb2Ygb2JqZWN0cyBzcGVjaWZpZWQgaW4gUzZhczZkIChlMzApLgorICovCisjaW5jbHVkZSA8ZnJlZURpYW1ldGVyL2V4dGVuc2lvbi5oPgorCisjZGVmaW5lIFBST1RPX1ZFUiAiZTMwIgorI2RlZmluZSBHRU5fREFURSAgMTUwNjY5NzE5NC41NQorCitjb25zdCBjaGFyICpzNmFzNmRfcHJvdG9fdmVyID0gUFJPVE9fVkVSOworY29uc3QgZG91YmxlIHM2YXM2ZF9nZW5fZGF0ZSA9IEdFTl9EQVRFOworCisvKiBUaGUgY29udGVudCBvZiB0aGlzIGZpbGUgZm9sbG93cyB0aGUgc2FtZSBzdHJ1Y3R1cmUgYXMgZGljdF9iYXNlX3Byb3RvLmMgKi8KKworI2RlZmluZSBDSEVDS19kaWN0X25ldyggX3R5cGUsIF9kYXRhLCBfcGFyZW50LCBfcmVmICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBfcmV0ID0gZmRfZGljdF9uZXcoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgKF90eXBlKSwgKF9kYXRhKSwgKF9wYXJlbnQpLCAoX3JlZikgKTsgXAorICAgIGlmICggX3JldCAhPSAwICYmIF9yZXQgIT0gRUVYSVNUICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHJldHVybiBfcmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIENIRUNLX2RpY3Rfc2VhcmNoKCBfdHlwZSwgX2NyaXRlcmlhLCBfd2hhdCwgX3Jlc3VsdCApCQlcCisgICAgQ0hFQ0tfRkNUKCAgZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgKF90eXBlKSwgKF9jcml0ZXJpYSksIChfd2hhdCksIChfcmVzdWx0KSwgRU5PRU5UKSApOworCitzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiB7CisgICAgc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWU7CisgICAgZW51bSBydWxlX3Bvc2l0aW9uCXBvc2l0aW9uOworICAgIGludCAJCQltaW47CisgICAgaW50CQkJbWF4OworfTsKKworI2RlZmluZSBSVUxFX09SREVSKCBfcG9zaXRpb24gKSAoKCgoX3Bvc2l0aW9uKSA9PSBSVUxFX0ZJWEVEX0hFQUQpIHx8ICgoX3Bvc2l0aW9uKSA9PSBSVUxFX0ZJWEVEX1RBSUwpKSA/IDEgOiAwICkKKworLyogQXR0ZW50aW9uISBUaGlzIHZlcnNpb24gb2YgdGhlIG1hY3JvIHVzZXMgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgaW4gY29udHJhc3QgdG8gbW9zdCBvdGhlciBjb3BpZXMhICovCisjZGVmaW5lIFBBUlNFX2xvY19ydWxlcyggX3J1bGVhcnJheSwgX3BhcmVudCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IF9fYXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKF9fYXI9MDsgX19hciA8IHNpemVvZihfcnVsZWFycmF5KSAvIHNpemVvZigoX3J1bGVhcnJheSlbMF0pOyBfX2FyKyspIHsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgc3RydWN0IGRpY3RfcnVsZV9kYXRhIF9fZGF0YSA9IHsgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5wb3NpdGlvbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ubWluLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5tYXh9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIF9fZGF0YS5ydWxlX29yZGVyID0gUlVMRV9PUkRFUihfX2RhdGEucnVsZV9wb3NpdGlvbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgQ0hFQ0tfRkNUKCAgZmRfZGljdF9zZWFyY2goICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgRElDVF9BVlAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICYoX3J1bGVhcnJheSlbX19hcl0uYXZwX3ZlbmRvcl9wbHVzX25hbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgJl9fZGF0YS5ydWxlX2F2cCwgMCApICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYgKCAhX19kYXRhLnJ1bGVfYXZwICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFX0RFQlVHKElORk8sICJBVlAgTm90IGZvdW5kOiAnJXMnIiwgKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLmF2cF9uYW1lKTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVOT0VOVDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBfcmV0ID0gZmRfZGljdF9uZXcoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9SVUxFLCAmKF9fZGF0YSksIChfcGFyZW50KSwgTlVMTCApOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBfcmV0ICE9IDAgJiYgX3JldCAhPSBFRVhJU1QgKSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfREVCVUcoSU5GTywgIkVycm9yIG9uIHJ1bGUgd2l0aCBBVlAgJyVzJyIsICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0uYXZwX3ZlbmRvcl9wbHVzX25hbWUuYXZwX25hbWUpOyAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFSU5WQUw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBDSEVDS192ZW5kb3JfbmV3KCBfZGF0YSApIHsgXAorICAgICAgICBzdHJ1Y3QgZGljdF9vYmplY3QgKiB2ZW5kb3JfZm91bmQ7IFwKKyAgICAgICAgaWYgKGZkX2RpY3Rfc2VhcmNoKGZkX2dfY29uZmlnLT5jbmZfZGljdCxESUNUX1ZFTkRPUixWRU5ET1JfQllfSUQsJl9kYXRhLnZlbmRvcl9pZCwmdmVuZG9yX2ZvdW5kLEVOT0VOVCkgPT0gRU5PRU5UKSB7IFwKKyAgICAgICAgICAgICAgICBDSEVDS19GQ1QoZmRfZGljdF9uZXcoZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1ZFTkRPUiwgJl9kYXRhLCBOVUxMLCBOVUxMKSk7IFwKKyAgICAgICAgfSBcCit9CisKKyNkZWZpbmUgZW51bXZhbF9kZWZfdTMyKCBfdmFsXywgX3N0cl8gKQkJXAorICAgIHsgX3N0cl8sIAkJeyAudTMyID0gX3ZhbF8gfX0KKworI2RlZmluZSBlbnVtdmFsX2RlZl9vcyggX2xlbl8sIF92YWxfLCBfc3RyXyApCQkJCVwKKyAgICB7IF9zdHJfLCAJCXsgLm9zID0geyAuZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopX3ZhbF8sIC5sZW4gPSBfbGVuXyB9fX0KKworCitzdGF0aWMgaW50IGRpY3RfczZhczZkX2xvYWRfZGVmcyhjaGFyICogY29uZmZpbGUpCit7CisgICBUUkFDRV9FTlRSWSgiJXAiLCBjb25mZmlsZSk7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXBwX2lkMTY3NzcyNTE7CisKKwkvKiBBcHBsaWNhdGlvbiBTZWN0aW9uICovCisJeworCSAgeworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogdmVuZG9yOworCQkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9WRU5ET1IsIFZFTkRPUl9CWV9OQU1FLCAiM0dQUCIsICZ2ZW5kb3IpCisJCQlzdHJ1Y3QgZGljdF9hcHBsaWNhdGlvbl9kYXRhIGRhdGEgPSB7IDE2Nzc3MjUxLCAiUzZhczZkIiB9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVBQTElDQVRJT04sICZkYXRhLCB2ZW5kb3IsICZhcHBfaWQxNjc3NzI1MSkKKwkgIH0KKwkgIC8qIFJlc3VsdCBjb2RlcyAqLworCSAgeworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICp0eXBlOworCQkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJFbnVtZXJhdGVkKFJlc3VsdC1Db2RlKSIsJnR5cGUpOworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJHZW5lcmFsIiwgeyAudTMyPTEgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIkhTU19iZWhhdmlvdXIiLCB7IC51MzI9MiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAiTU1FX1NHU05fYmVoYXZpb3VyIiwgeyAudTMyPTMgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNCA9IHsgIlRyYW5zaWVudF9GYWlsdXJlcyIsIHsgLnUzMj00IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzUgPSB7ICJVc2VyX2lkZW50aXR5X3RvX0hTU19yZXNvbHV0aW9uIiwgeyAudTMyPTggfX07CisKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzQsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNSwgdHlwZSwgTlVMTCk7CisKKwkgIH0KKwl9CisKKworICAgLyogQVZQIHNlY3Rpb24gKi8KKyAgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogQWRkcmVzc190eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBVVEY4U3RyaW5nX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIERpYW1ldGVySWRlbnRpdHlfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogRGlhbWV0ZXJVUklfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogVGltZV90eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBJUEZpbHRlclJ1bGVfdHlwZTsKKworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJBZGRyZXNzIiwgJkFkZHJlc3NfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIlVURjhTdHJpbmciLCAmVVRGOFN0cmluZ190eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiRGlhbWV0ZXJJZGVudGl0eSIsICZEaWFtZXRlcklkZW50aXR5X3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJEaWFtZXRlclVSSSIsICZEaWFtZXRlclVSSV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiVGltZSIsICZUaW1lX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJJUEZpbHRlclJ1bGUiLCAmSVBGaWx0ZXJSdWxlX3R5cGUpOworCisJCisgICB9CisKKyAgIC8qIENvbW1hbmRzIHNlY3Rpb24gKi8KKyAgIHsKKwkJLyogVXBkYXRlLUxvY2F0aW9uLVJlcXVlc3QgKi8KKwkJeworCQkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCQlzdHJ1Y3QgZGljdF9jbWRfZGF0YSBkYXRhID0geworCQkJCTMxNiwJLyogQ29kZSAqLworCQkJCSJVcGRhdGUtTG9jYXRpb24tUmVxdWVzdCIsCS8qIE5hbWUgKi8KKwkJCQlDTURfRkxBR19SRVFVRVNUIHwgQ01EX0ZMQUdfRVJST1IsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQ01EX0ZMQUdfUkVRVUVTVCB8IENNRF9GTEFHX1BST1hJQUJMRSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCX07CisKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0NPTU1BTkQsICZkYXRhICwgYXBwX2lkMTY3NzcyNTEsICZjbWQpCisJCX0KKwkJLyogVXBkYXRlLUxvY2F0aW9uLUFuc3dlciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJCXN0cnVjdCBkaWN0X2NtZF9kYXRhIGRhdGEgPSB7CisJCQkJMzE2LAkvKiBDb2RlICovCisJCQkJIlVwZGF0ZS1Mb2NhdGlvbi1BbnN3ZXIiLAkvKiBOYW1lICovCisJCQkJQ01EX0ZMQUdfUkVRVUVTVCwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlDTURfRkxBR19QUk9YSUFCTEUsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQl9OworCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9DT01NQU5ELCAmZGF0YSAsIGFwcF9pZDE2Nzc3MjUxLCAmY21kKQorCQl9CisJCS8qIENhbmNlbC1Mb2NhdGlvbi1SZXF1ZXN0ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQkJc3RydWN0IGRpY3RfY21kX2RhdGEgZGF0YSA9IHsKKwkJCQkzMTcsCS8qIENvZGUgKi8KKwkJCQkiQ2FuY2VsLUxvY2F0aW9uLVJlcXVlc3QiLAkvKiBOYW1lICovCisJCQkJQ01EX0ZMQUdfUkVRVUVTVCB8IENNRF9GTEFHX0VSUk9SLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUNNRF9GTEFHX1JFUVVFU1QgfCBDTURfRkxBR19QUk9YSUFCTEUsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQl9OworCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9DT01NQU5ELCAmZGF0YSAsIGFwcF9pZDE2Nzc3MjUxLCAmY21kKQorCQl9CisJCS8qIENhbmNlbC1Mb2NhdGlvbi1BbnN3ZXIgKi8KKwkJeworCQkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCQlzdHJ1Y3QgZGljdF9jbWRfZGF0YSBkYXRhID0geworCQkJCTMxNywJLyogQ29kZSAqLworCQkJCSJDYW5jZWwtTG9jYXRpb24tQW5zd2VyIiwJLyogTmFtZSAqLworCQkJCUNNRF9GTEFHX1JFUVVFU1QsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQ01EX0ZMQUdfUFJPWElBQkxFLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJfTsKKworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQ09NTUFORCwgJmRhdGEgLCBhcHBfaWQxNjc3NzI1MSwgJmNtZCkKKwkJfQorCQkvKiBBdXRoZW50aWNhdGlvbi1JbmZvcm1hdGlvbi1SZXF1ZXN0ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQkJc3RydWN0IGRpY3RfY21kX2RhdGEgZGF0YSA9IHsKKwkJCQkzMTgsCS8qIENvZGUgKi8KKwkJCQkiQXV0aGVudGljYXRpb24tSW5mb3JtYXRpb24tUmVxdWVzdCIsCS8qIE5hbWUgKi8KKwkJCQlDTURfRkxBR19SRVFVRVNUIHwgQ01EX0ZMQUdfRVJST1IsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQ01EX0ZMQUdfUkVRVUVTVCB8IENNRF9GTEFHX1BST1hJQUJMRSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCX07CisKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0NPTU1BTkQsICZkYXRhICwgYXBwX2lkMTY3NzcyNTEsICZjbWQpCisJCX0KKwkJLyogQXV0aGVudGljYXRpb24tSW5mb3JtYXRpb24tQW5zd2VyICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQkJc3RydWN0IGRpY3RfY21kX2RhdGEgZGF0YSA9IHsKKwkJCQkzMTgsCS8qIENvZGUgKi8KKwkJCQkiQXV0aGVudGljYXRpb24tSW5mb3JtYXRpb24tQW5zd2VyIiwJLyogTmFtZSAqLworCQkJCUNNRF9GTEFHX1JFUVVFU1QsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQ01EX0ZMQUdfUFJPWElBQkxFLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJfTsKKworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQ09NTUFORCwgJmRhdGEgLCBhcHBfaWQxNjc3NzI1MSwgJmNtZCkKKwkJfQorCQkvKiBJbnNlcnQtU3Vic2NyaWJlci1EYXRhLVJlcXVlc3QgKi8KKwkJeworCQkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCQlzdHJ1Y3QgZGljdF9jbWRfZGF0YSBkYXRhID0geworCQkJCTMxOSwJLyogQ29kZSAqLworCQkJCSJJbnNlcnQtU3Vic2NyaWJlci1EYXRhLVJlcXVlc3QiLAkvKiBOYW1lICovCisJCQkJQ01EX0ZMQUdfUkVRVUVTVCB8IENNRF9GTEFHX0VSUk9SLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUNNRF9GTEFHX1JFUVVFU1QgfCBDTURfRkxBR19QUk9YSUFCTEUsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQl9OworCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9DT01NQU5ELCAmZGF0YSAsIGFwcF9pZDE2Nzc3MjUxLCAmY21kKQorCQl9CisJCS8qIEluc2VydC1TdWJzY3JpYmVyLURhdGEtQW5zd2VyICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQkJc3RydWN0IGRpY3RfY21kX2RhdGEgZGF0YSA9IHsKKwkJCQkzMTksCS8qIENvZGUgKi8KKwkJCQkiSW5zZXJ0LVN1YnNjcmliZXItRGF0YS1BbnN3ZXIiLAkvKiBOYW1lICovCisJCQkJQ01EX0ZMQUdfUkVRVUVTVCwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlDTURfRkxBR19QUk9YSUFCTEUsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQl9OworCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9DT01NQU5ELCAmZGF0YSAsIGFwcF9pZDE2Nzc3MjUxLCAmY21kKQorCQl9CisJCS8qIERlbGV0ZS1TdWJzY3JpYmVyLURhdGEtUmVxdWVzdCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJCXN0cnVjdCBkaWN0X2NtZF9kYXRhIGRhdGEgPSB7CisJCQkJMzIwLAkvKiBDb2RlICovCisJCQkJIkRlbGV0ZS1TdWJzY3JpYmVyLURhdGEtUmVxdWVzdCIsCS8qIE5hbWUgKi8KKwkJCQlDTURfRkxBR19SRVFVRVNUIHwgQ01EX0ZMQUdfRVJST1IsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQ01EX0ZMQUdfUkVRVUVTVCB8IENNRF9GTEFHX1BST1hJQUJMRSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCX07CisKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0NPTU1BTkQsICZkYXRhICwgYXBwX2lkMTY3NzcyNTEsICZjbWQpCisJCX0KKwkJLyogRGVsZXRlLVN1YnNjcmliZXItRGF0YS1BbnN3ZXIgKi8KKwkJeworCQkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCQlzdHJ1Y3QgZGljdF9jbWRfZGF0YSBkYXRhID0geworCQkJCTMyMCwJLyogQ29kZSAqLworCQkJCSJEZWxldGUtU3Vic2NyaWJlci1EYXRhLUFuc3dlciIsCS8qIE5hbWUgKi8KKwkJCQlDTURfRkxBR19SRVFVRVNULAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUNNRF9GTEFHX1BST1hJQUJMRSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCX07CisKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0NPTU1BTkQsICZkYXRhICwgYXBwX2lkMTY3NzcyNTEsICZjbWQpCisJCX0KKwkJLyogUHVyZ2UtVUUtUmVxdWVzdCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJCXN0cnVjdCBkaWN0X2NtZF9kYXRhIGRhdGEgPSB7CisJCQkJMzIxLAkvKiBDb2RlICovCisJCQkJIlB1cmdlLVVFLVJlcXVlc3QiLAkvKiBOYW1lICovCisJCQkJQ01EX0ZMQUdfUkVRVUVTVCB8IENNRF9GTEFHX0VSUk9SLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUNNRF9GTEFHX1JFUVVFU1QgfCBDTURfRkxBR19QUk9YSUFCTEUsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQl9OworCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9DT01NQU5ELCAmZGF0YSAsIGFwcF9pZDE2Nzc3MjUxLCAmY21kKQorCQl9CisJCS8qIFB1cmdlLVVFLUFuc3dlciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJCXN0cnVjdCBkaWN0X2NtZF9kYXRhIGRhdGEgPSB7CisJCQkJMzIxLAkvKiBDb2RlICovCisJCQkJIlB1cmdlLVVFLUFuc3dlciIsCS8qIE5hbWUgKi8KKwkJCQlDTURfRkxBR19SRVFVRVNULAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUNNRF9GTEFHX1BST1hJQUJMRSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCX07CisKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0NPTU1BTkQsICZkYXRhICwgYXBwX2lkMTY3NzcyNTEsICZjbWQpCisJCX0KKwkJLyogUmVzZXQtUmVxdWVzdCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJCXN0cnVjdCBkaWN0X2NtZF9kYXRhIGRhdGEgPSB7CisJCQkJMzIyLAkvKiBDb2RlICovCisJCQkJIlJlc2V0LVJlcXVlc3QiLAkvKiBOYW1lICovCisJCQkJQ01EX0ZMQUdfUkVRVUVTVCB8IENNRF9GTEFHX0VSUk9SLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUNNRF9GTEFHX1JFUVVFU1QgfCBDTURfRkxBR19QUk9YSUFCTEUsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQl9OworCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9DT01NQU5ELCAmZGF0YSAsIGFwcF9pZDE2Nzc3MjUxLCAmY21kKQorCQl9CisJCS8qIFJlc2V0LUFuc3dlciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJCXN0cnVjdCBkaWN0X2NtZF9kYXRhIGRhdGEgPSB7CisJCQkJMzIyLAkvKiBDb2RlICovCisJCQkJIlJlc2V0LUFuc3dlciIsCS8qIE5hbWUgKi8KKwkJCQlDTURfRkxBR19SRVFVRVNULAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUNNRF9GTEFHX1BST1hJQUJMRSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCX07CisKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0NPTU1BTkQsICZkYXRhICwgYXBwX2lkMTY3NzcyNTEsICZjbWQpCisJCX0KKworICAgfQorCisgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkaWN0X3M2YXM2ZF9sb2FkX3J1bGVzKGNoYXIgKiBjb25mZmlsZSkKK3sKKyAgIC8qIEdyb3VwZWQgQVZQIHNlY3Rpb24gKi8KKyAgIHsKKworICAgfQkKKworICAgLyogQ29tbWFuZHMgc2VjdGlvbiAqLworICAgeworCSAgLyogVXBkYXRlLUxvY2F0aW9uLVJlcXVlc3QgKi8KKwkgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX0NPTU1BTkQsIENNRF9CWV9OQU1FLCAiVXBkYXRlLUxvY2F0aW9uLVJlcXVlc3QiLCAmY21kKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlNlc3Npb24tSWQifSwgUlVMRV9GSVhFRF9IRUFELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEUk1QIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlZlbmRvci1TcGVjaWZpYy1BcHBsaWNhdGlvbi1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBdXRoLVNlc3Npb24tU3RhdGUifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLUhvc3QifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLVJlYWxtIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRlc3RpbmF0aW9uLUhvc3QifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRGVzdGluYXRpb24tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVXNlci1OYW1lIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9DLVN1cHBvcnRlZC1GZWF0dXJlcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU3VwcG9ydGVkLUZlYXR1cmVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUZXJtaW5hbC1JbmZvcm1hdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUkFULVR5cGUifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlVMUi1GbGFncyJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVUUtU1JWQ0MtQ2FwYWJpbGl0eSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVmlzaXRlZC1QTE1OLUlkIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTR1NOLU51bWJlciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiSG9tb2dlbmVvdXMtU3VwcG9ydC1vZi1JTVMtVm9pY2UtT3Zlci1QUy1TZXNzaW9ucyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiR01MQy1BZGRyZXNzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBY3RpdmUtQVBOIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJFcXVpdmFsZW50LVBMTU4tTGlzdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTU1FLU51bWJlci1mb3ItTVQtU01TIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTTVMtUmVnaXN0ZXItUmVxdWVzdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU0dzLU1NRS1JZGVudGl0eSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ291cGxlZC1Ob2RlLURpYW1ldGVyLUlEIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBZGphY2VudC1QTE1OcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU3VwcG9ydGVkLVNlcnZpY2VzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlByb3h5LUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUm91dGUtUmVjb3JkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyhydWxlcywgY21kKTsKKwkgIH0KKwkgIC8qIFVwZGF0ZS1Mb2NhdGlvbi1BbnN3ZXIgKi8KKwkgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX0NPTU1BTkQsIENNRF9CWV9OQU1FLCAiVXBkYXRlLUxvY2F0aW9uLUFuc3dlciIsICZjbWQpCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU2Vzc2lvbi1JZCJ9LCBSVUxFX0ZJWEVEX0hFQUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRSTVAifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVmVuZG9yLVNwZWNpZmljLUFwcGxpY2F0aW9uLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJlc3VsdC1Db2RlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkV4cGVyaW1lbnRhbC1SZXN1bHQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkVycm9yLURpYWdub3N0aWMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQXV0aC1TZXNzaW9uLVN0YXRlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1Ib3N0In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPQy1TdXBwb3J0ZWQtRmVhdHVyZXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT0MtT0xSIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkxvYWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlN1cHBvcnRlZC1GZWF0dXJlcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVUxBLUZsYWdzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTdWJzY3JpcHRpb24tRGF0YSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUmVzZXQtSUQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRmFpbGVkLUFWUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJQcm94eS1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJvdXRlLVJlY29yZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMocnVsZXMsIGNtZCk7CisJICB9CisJICAvKiBDYW5jZWwtTG9jYXRpb24tUmVxdWVzdCAqLworCSAgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJDYW5jZWwtTG9jYXRpb24tUmVxdWVzdCIsICZjbWQpCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU2Vzc2lvbi1JZCJ9LCBSVUxFX0ZJWEVEX0hFQUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRSTVAifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVmVuZG9yLVNwZWNpZmljLUFwcGxpY2F0aW9uLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkF1dGgtU2Vzc2lvbi1TdGF0ZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tSG9zdCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRGVzdGluYXRpb24tSG9zdCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEZXN0aW5hdGlvbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJVc2VyLU5hbWUifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlN1cHBvcnRlZC1GZWF0dXJlcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ2FuY2VsbGF0aW9uLVR5cGUifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNMUi1GbGFncyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJQcm94eS1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJvdXRlLVJlY29yZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMocnVsZXMsIGNtZCk7CisJICB9CisJICAvKiBDYW5jZWwtTG9jYXRpb24tQW5zd2VyICovCisJICB7CisJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIkNhbmNlbC1Mb2NhdGlvbi1BbnN3ZXIiLCAmY21kKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlNlc3Npb24tSWQifSwgUlVMRV9GSVhFRF9IRUFELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEUk1QIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlZlbmRvci1TcGVjaWZpYy1BcHBsaWNhdGlvbi1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU3VwcG9ydGVkLUZlYXR1cmVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJlc3VsdC1Db2RlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkV4cGVyaW1lbnRhbC1SZXN1bHQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQXV0aC1TZXNzaW9uLVN0YXRlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1Ib3N0In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJGYWlsZWQtQVZQIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlByb3h5LUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUm91dGUtUmVjb3JkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyhydWxlcywgY21kKTsKKwkgIH0KKwkgIC8qIEF1dGhlbnRpY2F0aW9uLUluZm9ybWF0aW9uLVJlcXVlc3QgKi8KKwkgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX0NPTU1BTkQsIENNRF9CWV9OQU1FLCAiQXV0aGVudGljYXRpb24tSW5mb3JtYXRpb24tUmVxdWVzdCIsICZjbWQpCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU2Vzc2lvbi1JZCJ9LCBSVUxFX0ZJWEVEX0hFQUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRSTVAifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVmVuZG9yLVNwZWNpZmljLUFwcGxpY2F0aW9uLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkF1dGgtU2Vzc2lvbi1TdGF0ZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tSG9zdCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRGVzdGluYXRpb24tSG9zdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEZXN0aW5hdGlvbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJVc2VyLU5hbWUifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT0MtU3VwcG9ydGVkLUZlYXR1cmVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTdXBwb3J0ZWQtRmVhdHVyZXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJlcXVlc3RlZC1FVVRSQU4tQXV0aGVudGljYXRpb24tSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUmVxdWVzdGVkLVVUUkFOLUdFUkFOLUF1dGhlbnRpY2F0aW9uLUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlZpc2l0ZWQtUExNTi1JZCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQUlSLUZsYWdzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlByb3h5LUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUm91dGUtUmVjb3JkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyhydWxlcywgY21kKTsKKwkgIH0KKwkgIC8qIEF1dGhlbnRpY2F0aW9uLUluZm9ybWF0aW9uLUFuc3dlciAqLworCSAgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJBdXRoZW50aWNhdGlvbi1JbmZvcm1hdGlvbi1BbnN3ZXIiLCAmY21kKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlNlc3Npb24tSWQifSwgUlVMRV9GSVhFRF9IRUFELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEUk1QIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlZlbmRvci1TcGVjaWZpYy1BcHBsaWNhdGlvbi1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSZXN1bHQtQ29kZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJFeHBlcmltZW50YWwtUmVzdWx0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJFcnJvci1EaWFnbm9zdGljIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkF1dGgtU2Vzc2lvbi1TdGF0ZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tSG9zdCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT0MtU3VwcG9ydGVkLUZlYXR1cmVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9DLU9MUiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJMb2FkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTdXBwb3J0ZWQtRmVhdHVyZXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkF1dGhlbnRpY2F0aW9uLUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlVFLVVzYWdlLVR5cGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRmFpbGVkLUFWUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJQcm94eS1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJvdXRlLVJlY29yZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMocnVsZXMsIGNtZCk7CisJICB9CisJICAvKiBJbnNlcnQtU3Vic2NyaWJlci1EYXRhLVJlcXVlc3QgKi8KKwkgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX0NPTU1BTkQsIENNRF9CWV9OQU1FLCAiSW5zZXJ0LVN1YnNjcmliZXItRGF0YS1SZXF1ZXN0IiwgJmNtZCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTZXNzaW9uLUlkIn0sIFJVTEVfRklYRURfSEVBRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRFJNUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJWZW5kb3ItU3BlY2lmaWMtQXBwbGljYXRpb24tSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQXV0aC1TZXNzaW9uLVN0YXRlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1Ib3N0In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEZXN0aW5hdGlvbi1Ib3N0In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRlc3RpbmF0aW9uLVJlYWxtIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlVzZXItTmFtZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU3VwcG9ydGVkLUZlYXR1cmVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTdWJzY3JpcHRpb24tRGF0YSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiSURSLUZsYWdzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJSZXNldC1JRCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJQcm94eS1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJvdXRlLVJlY29yZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMocnVsZXMsIGNtZCk7CisJICB9CisJICAvKiBJbnNlcnQtU3Vic2NyaWJlci1EYXRhLUFuc3dlciAqLworCSAgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJJbnNlcnQtU3Vic2NyaWJlci1EYXRhLUFuc3dlciIsICZjbWQpCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU2Vzc2lvbi1JZCJ9LCBSVUxFX0ZJWEVEX0hFQUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRSTVAifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVmVuZG9yLVNwZWNpZmljLUFwcGxpY2F0aW9uLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTdXBwb3J0ZWQtRmVhdHVyZXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUmVzdWx0LUNvZGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRXhwZXJpbWVudGFsLVJlc3VsdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBdXRoLVNlc3Npb24tU3RhdGUifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLUhvc3QifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLVJlYWxtIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJJTVMtVm9pY2UtT3Zlci1QUy1TZXNzaW9ucy1TdXBwb3J0ZWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkxhc3QtVUUtQWN0aXZpdHktVGltZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUkFULVR5cGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIklEQS1GbGFncyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRVBTLVVzZXItU3RhdGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkVQUy1Mb2NhdGlvbi1JbmZvcm1hdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTG9jYWwtVGltZS1ab25lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTdXBwb3J0ZWQtU2VydmljZXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1vbml0b3JpbmctRXZlbnQtUmVwb3J0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNb25pdG9yaW5nLUV2ZW50LUNvbmZpZy1TdGF0dXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRmFpbGVkLUFWUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJQcm94eS1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJvdXRlLVJlY29yZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMocnVsZXMsIGNtZCk7CisJICB9CisJICAvKiBEZWxldGUtU3Vic2NyaWJlci1EYXRhLVJlcXVlc3QgKi8KKwkgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX0NPTU1BTkQsIENNRF9CWV9OQU1FLCAiRGVsZXRlLVN1YnNjcmliZXItRGF0YS1SZXF1ZXN0IiwgJmNtZCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTZXNzaW9uLUlkIn0sIFJVTEVfRklYRURfSEVBRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRFJNUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJWZW5kb3ItU3BlY2lmaWMtQXBwbGljYXRpb24tSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQXV0aC1TZXNzaW9uLVN0YXRlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1Ib3N0In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEZXN0aW5hdGlvbi1Ib3N0In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRlc3RpbmF0aW9uLVJlYWxtIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlVzZXItTmFtZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU3VwcG9ydGVkLUZlYXR1cmVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJEU1ItRmxhZ3MifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNDRUYtSUQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNvbnRleHQtSWRlbnRpZmllciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVHJhY2UtUmVmZXJlbmNlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUUy1Db2RlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTUy1Db2RlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlByb3h5LUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUm91dGUtUmVjb3JkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyhydWxlcywgY21kKTsKKwkgIH0KKwkgIC8qIERlbGV0ZS1TdWJzY3JpYmVyLURhdGEtQW5zd2VyICovCisJICB7CisJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIkRlbGV0ZS1TdWJzY3JpYmVyLURhdGEtQW5zd2VyIiwgJmNtZCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTZXNzaW9uLUlkIn0sIFJVTEVfRklYRURfSEVBRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRFJNUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJWZW5kb3ItU3BlY2lmaWMtQXBwbGljYXRpb24tSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlN1cHBvcnRlZC1GZWF0dXJlcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSZXN1bHQtQ29kZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJFeHBlcmltZW50YWwtUmVzdWx0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkF1dGgtU2Vzc2lvbi1TdGF0ZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tSG9zdCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkRTQS1GbGFncyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJGYWlsZWQtQVZQIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlByb3h5LUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUm91dGUtUmVjb3JkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyhydWxlcywgY21kKTsKKwkgIH0KKwkgIC8qIFB1cmdlLVVFLVJlcXVlc3QgKi8KKwkgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX0NPTU1BTkQsIENNRF9CWV9OQU1FLCAiUHVyZ2UtVUUtUmVxdWVzdCIsICZjbWQpCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU2Vzc2lvbi1JZCJ9LCBSVUxFX0ZJWEVEX0hFQUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRSTVAifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVmVuZG9yLVNwZWNpZmljLUFwcGxpY2F0aW9uLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkF1dGgtU2Vzc2lvbi1TdGF0ZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tSG9zdCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRGVzdGluYXRpb24tSG9zdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEZXN0aW5hdGlvbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJVc2VyLU5hbWUifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT0MtU3VwcG9ydGVkLUZlYXR1cmVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQVVItRmxhZ3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlN1cHBvcnRlZC1GZWF0dXJlcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRVBTLUxvY2F0aW9uLUluZm9ybWF0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlByb3h5LUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUm91dGUtUmVjb3JkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyhydWxlcywgY21kKTsKKwkgIH0KKwkgIC8qIFB1cmdlLVVFLUFuc3dlciAqLworCSAgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJQdXJnZS1VRS1BbnN3ZXIiLCAmY21kKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlNlc3Npb24tSWQifSwgUlVMRV9GSVhFRF9IRUFELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEUk1QIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlZlbmRvci1TcGVjaWZpYy1BcHBsaWNhdGlvbi1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU3VwcG9ydGVkLUZlYXR1cmVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJlc3VsdC1Db2RlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkV4cGVyaW1lbnRhbC1SZXN1bHQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQXV0aC1TZXNzaW9uLVN0YXRlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1Ib3N0In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPQy1TdXBwb3J0ZWQtRmVhdHVyZXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT0MtT0xSIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkxvYWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlBVQS1GbGFncyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJGYWlsZWQtQVZQIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlByb3h5LUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUm91dGUtUmVjb3JkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyhydWxlcywgY21kKTsKKwkgIH0KKwkgIC8qIFJlc2V0LVJlcXVlc3QgKi8KKwkgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX0NPTU1BTkQsIENNRF9CWV9OQU1FLCAiUmVzZXQtUmVxdWVzdCIsICZjbWQpCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU2Vzc2lvbi1JZCJ9LCBSVUxFX0ZJWEVEX0hFQUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRSTVAifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVmVuZG9yLVNwZWNpZmljLUFwcGxpY2F0aW9uLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkF1dGgtU2Vzc2lvbi1TdGF0ZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tSG9zdCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRGVzdGluYXRpb24tSG9zdCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEZXN0aW5hdGlvbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU3VwcG9ydGVkLUZlYXR1cmVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJVc2VyLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJSZXNldC1JRCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU3Vic2NyaXB0aW9uLURhdGEifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlN1YnNjcmlwdGlvbi1EYXRhLURlbGV0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlByb3h5LUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUm91dGUtUmVjb3JkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyhydWxlcywgY21kKTsKKwkgIH0KKwkgIC8qIFJlc2V0LUFuc3dlciAqLworCSAgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJSZXNldC1BbnN3ZXIiLCAmY21kKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlNlc3Npb24tSWQifSwgUlVMRV9GSVhFRF9IRUFELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEUk1QIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlZlbmRvci1TcGVjaWZpYy1BcHBsaWNhdGlvbi1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU3VwcG9ydGVkLUZlYXR1cmVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJlc3VsdC1Db2RlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkV4cGVyaW1lbnRhbC1SZXN1bHQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQXV0aC1TZXNzaW9uLVN0YXRlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1Ib3N0In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJGYWlsZWQtQVZQIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlByb3h5LUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUm91dGUtUmVjb3JkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyhydWxlcywgY21kKTsKKwkgIH0KKworICAgfQorCisgICBMT0dfRCggIkV4dGVuc2lvbiAnRGljdGlvbmFyeSBkZWZpbml0aW9ucyBmb3IgUzZhczZkIChlMzApJyBpbml0aWFsaXplZCIpOworICAgcmV0dXJuIDA7Cit9CisKK2ludCBkaWN0X2VudHJ5KGNoYXIgKiBjb25mZmlsZSkKK3sKKwlkaWN0X3M2YXM2ZF9sb2FkX2RlZnMoY29uZmZpbGUpOworCXJldHVybiBkaWN0X3M2YXM2ZF9sb2FkX3J1bGVzKGNvbmZmaWxlKTsKK30KKworY29uc3QgY2hhciogZGljdF9zNmFzNmRfcHJvdG9fdmVyKGNoYXIgKiBjb25mZmlsZSkgeworCXJldHVybiBzNmFzNmRfcHJvdG9fdmVyOworfQorCitjb25zdCBkb3VibGUgZGljdF9zNmFzNmRfZ2VuX3RzKGNoYXIgKiBjb25mZmlsZSkgeworCXJldHVybiBzNmFzNmRfZ2VuX2RhdGU7Cit9CisKK0VYVEVOU0lPTl9FTlRSWTIoImRpY3RfczZhczZkIiwgZGljdF9zNmFzNmRfbG9hZF9kZWZzLCBkaWN0X3M2YXM2ZF9sb2FkX3J1bGVzLCAiZGljdF90czI5MjcyX2F2cHMiLCAiZGljdF90czMyMjk5X2F2cHMiLCAiZGljdF90czI5MjczX2F2cHMiLCAiZGljdF90czI5MzM2X2F2cHMiLCAiZGljdF90czI5MjEyX2F2cHMiLCAiZGljdF90czI5MjE0X2F2cHMiLCAiZGljdF90czI5MzQ0X2F2cHMiLCAiZGljdF90czI5MzM4X2F2cHMiLCAiZGljdF90czI5MjE3X2F2cHMiLCAiZGljdF90czI5MTczX2F2cHMiLCAiZGljdF90czI5MzI5X2F2cHMiLCAiZGljdF90czI5MjI5X2F2cHMiLCAiZGljdF9yZmM1Nzc4X2F2cHMiLCAiZGljdF90czI5MDYxX2F2cHMiLCAiZGljdF9yZmM1NDQ3X2F2cHMiLCAiZGljdF9kcmFmdGxvYWRfYXZwcyIsICJkaWN0X3JmYzc2ODNfYXZwcyIsICJkaWN0X3JmYzQwMDRfYXZwcyIsICJkaWN0X3JmYzU3NzdfYXZwcyIsICJkaWN0X3JmYzc5NDRfYXZwcyIpOworCisKKwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X1M2Yy9DTWFrZUxpc3RzLnR4dCBiL2V4dGVuc2lvbnMvZGljdF9TNmMvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY5ZTUxNQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF9TNmMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxNiBAQAorIyBUaGUgUzZjIGV4dGVuc2lvbgorUFJPSkVDVCgiUzZjIGxpYnJhcnkgZ2VuZXJhdGVkIGJ5IEZkR2VuICIgQykKKworIyBDb21waWxlIGFzIGEgbW9kdWxlCitGRF9BRERfRVhURU5TSU9OKGRpY3RfUzZjIGRpY3RfUzZjLmMpCisKKworIyMjIworIyMgSU5TVEFMTCBzZWN0aW9uICMjCisKK0lOU1RBTEwoVEFSR0VUUyBkaWN0X1M2YworCUxJQlJBUlkgREVTVElOQVRJT04gJHtJTlNUQUxMX0VYVEVOU0lPTlNfU1VGRklYfQorQ09NUE9ORU5UIGZyZWVEaWFtZXRlci1kaWN0aW9uYXJ5LVM2QykKKworCisKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF9TNmMvUzZjLmRpZCBiL2V4dGVuc2lvbnMvZGljdF9TNmMvUzZjLmRpZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGJiOWRiCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kaWN0X1M2Yy9TNmMuZGlkCkBAIC0wLDAgKzEsMzggQEAKK2RpY3RfcmZjNjk0Ml9hdnBzCitkaWN0X3RzMjk0NjhfYXZwcworZGljdF90czI5MTU0X2F2cHMKK2RpY3RfdHMyOTIxNF9hdnBzCitkaWN0X3RzMjkyMTVfYXZwcworZGljdF90czI5MjE3X2F2cHMKK2RpY3RfM2dwcDJfYXZwcworZGljdF90czI5MzQzX2F2cHMKK2RpY3RfdHMyOTMzOF9hdnBzCitkaWN0X3RzMjkxMjhfYXZwcworZGljdF90czI5MzQ0X2F2cHMKK2RpY3RfdHMyOTM0NV9hdnBzCitkaWN0X3RzMzIyOTlfYXZwcworZGljdF9yZmM2NzM0X2F2cHMKK2RpY3RfcmZjNTc3OF9hdnBzCitkaWN0X3JmYzU1ODBfYXZwcworZGljdF9yZmM0MDcyX2F2cHMKK2RpY3RfdHMyOTI3M19hdnBzCitkaWN0X3JmYzU3NzdfYXZwcworZGljdF9yZmM0MDA2YmlzX2F2cHMKK2RpY3RfdHMyOTIxMl9hdnBzCitkaWN0X3RzMjkwNjFfYXZwcworZGljdF9yZmM1NDQ3X2F2cHMKK2RpY3RfdHMyOTI3Ml9hdnBzCitkaWN0X3RzMjkxNzNfYXZwcworZGljdF90czI5MzM3X2F2cHMKK2RpY3RfZXRzaTI4MzAzNF9hdnBzCitkaWN0X3JmYzQ1OTBfYXZwcworZGljdF9yZmM0MDA0X2F2cHMKK2RpY3RfcmZjNzE1NV9hdnBzCitkaWN0X3RzMjkyMjlfYXZwcworZGljdF9yZmM3NjgzX2F2cHMKK2RpY3RfZHJhZnRsb2FkX2F2cHMKK2RpY3RfdHMyOTMyOV9hdnBzCitkaWN0X3RzMjkzNjhfYXZwcworZGljdF90czI5MzM2X2F2cHMKK2RpY3RfcmZjNzk0NF9hdnBzCitkaWN0X1M2YwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X1M2Yy9kaWN0X1M2Yy5jIGIvZXh0ZW5zaW9ucy9kaWN0X1M2Yy9kaWN0X1M2Yy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMDZiODMKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfUzZjL2RpY3RfUzZjLmMKQEAgLTAsMCArMSw0MTMgQEAKKy8qCisqIENvcHlyaWdodCAoYykgMjAxNyBTcHJpbnQKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLyoqKioqKioqKioqKioqKioKKyBHZW5lcmF0ZWQgQnk6IGZkdG9vbCBlbmhhbmNlbWVudHMgdG8gZGlhZnV6emVyCisgTGljZW5zZTogc2FtZSBhcyBmcmVlRGlhbWV0ZXIKKyoqKioqKioqKioqKioqKiovCisKKworLyogCisgKiBEaWN0aW9uYXJ5IGRlZmluaXRpb25zIG9mIG9iamVjdHMgc3BlY2lmaWVkIGluIFM2YyAoZTEwKS4KKyAqLworI2luY2x1ZGUgPGZyZWVEaWFtZXRlci9leHRlbnNpb24uaD4KKworI2RlZmluZSBQUk9UT19WRVIgImUxMCIKKyNkZWZpbmUgR0VOX0RBVEUgIDE1MDY2OTcxMjEuNTMKKworY29uc3QgY2hhciAqczZjX3Byb3RvX3ZlciA9IFBST1RPX1ZFUjsKK2NvbnN0IGRvdWJsZSBzNmNfZ2VuX2RhdGUgPSBHRU5fREFURTsKKworLyogVGhlIGNvbnRlbnQgb2YgdGhpcyBmaWxlIGZvbGxvd3MgdGhlIHNhbWUgc3RydWN0dXJlIGFzIGRpY3RfYmFzZV9wcm90by5jICovCisKKyNkZWZpbmUgQ0hFQ0tfZGljdF9uZXcoIF90eXBlLCBfZGF0YSwgX3BhcmVudCwgX3JlZiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgX3JldCA9IGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIChfdHlwZSksIChfZGF0YSksIChfcGFyZW50KSwgKF9yZWYpICk7IFwKKyAgICBpZiAoIF9yZXQgIT0gMCAmJiBfcmV0ICE9IEVFWElTVCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICByZXR1cm4gX3JldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBDSEVDS19kaWN0X3NlYXJjaCggX3R5cGUsIF9jcml0ZXJpYSwgX3doYXQsIF9yZXN1bHQgKQkJXAorICAgIENIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIChfdHlwZSksIChfY3JpdGVyaWEpLCAoX3doYXQpLCAoX3Jlc3VsdCksIEVOT0VOVCkgKTsKKworc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24geworICAgIHN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lOworICAgIGVudW0gcnVsZV9wb3NpdGlvbglwb3NpdGlvbjsKKyAgICBpbnQgCQkJbWluOworICAgIGludAkJCW1heDsKK307CisKKyNkZWZpbmUgUlVMRV9PUkRFUiggX3Bvc2l0aW9uICkgKCgoKF9wb3NpdGlvbikgPT0gUlVMRV9GSVhFRF9IRUFEKSB8fCAoKF9wb3NpdGlvbikgPT0gUlVMRV9GSVhFRF9UQUlMKSkgPyAxIDogMCApCisKKy8qIEF0dGVudGlvbiEgVGhpcyB2ZXJzaW9uIG9mIHRoZSBtYWNybyB1c2VzIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsIGluIGNvbnRyYXN0IHRvIG1vc3Qgb3RoZXIgY29waWVzISAqLworI2RlZmluZSBQQVJTRV9sb2NfcnVsZXMoIF9ydWxlYXJyYXksIF9wYXJlbnQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBfX2FyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yIChfX2FyPTA7IF9fYXIgPCBzaXplb2YoX3J1bGVhcnJheSkgLyBzaXplb2YoKF9ydWxlYXJyYXkpWzBdKTsgX19hcisrKSB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHN0cnVjdCBkaWN0X3J1bGVfZGF0YSBfX2RhdGEgPSB7IE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ucG9zaXRpb24sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLm1pbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ubWF4fTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfX2RhdGEucnVsZV9vcmRlciA9IFJVTEVfT1JERVIoX19kYXRhLnJ1bGVfcG9zaXRpb24pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIENIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIERJQ1RfQVZQLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAmKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICZfX2RhdGEucnVsZV9hdnAsIDAgKSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmICggIV9fZGF0YS5ydWxlX2F2cCApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9ERUJVRyhJTkZPLCAiQVZQIE5vdCBmb3VuZDogJyVzJyIsIChfcnVsZWFycmF5KVtfX2FyXS5hdnBfdmVuZG9yX3BsdXNfbmFtZS5hdnBfbmFtZSk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFTk9FTlQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgX3JldCA9IGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfUlVMRSwgJihfX2RhdGEpLCAoX3BhcmVudCksIE5VTEwgKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggX3JldCAhPSAwICYmIF9yZXQgIT0gRUVYSVNUICkgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFX0RFQlVHKElORk8sICJFcnJvciBvbiBydWxlIHdpdGggQVZQICclcyciLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLmF2cF9uYW1lKTsgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRUlOVkFMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgQ0hFQ0tfdmVuZG9yX25ldyggX2RhdGEgKSB7IFwKKyAgICAgICAgc3RydWN0IGRpY3Rfb2JqZWN0ICogdmVuZG9yX2ZvdW5kOyBcCisgICAgICAgIGlmIChmZF9kaWN0X3NlYXJjaChmZF9nX2NvbmZpZy0+Y25mX2RpY3QsRElDVF9WRU5ET1IsVkVORE9SX0JZX0lELCZfZGF0YS52ZW5kb3JfaWQsJnZlbmRvcl9mb3VuZCxFTk9FTlQpID09IEVOT0VOVCkgeyBcCisgICAgICAgICAgICAgICAgQ0hFQ0tfRkNUKGZkX2RpY3RfbmV3KGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9WRU5ET1IsICZfZGF0YSwgTlVMTCwgTlVMTCkpOyBcCisgICAgICAgIH0gXAorfQorCisjZGVmaW5lIGVudW12YWxfZGVmX3UzMiggX3ZhbF8sIF9zdHJfICkJCVwKKyAgICB7IF9zdHJfLCAJCXsgLnUzMiA9IF92YWxfIH19CisKKyNkZWZpbmUgZW51bXZhbF9kZWZfb3MoIF9sZW5fLCBfdmFsXywgX3N0cl8gKQkJCQlcCisgICAgeyBfc3RyXywgCQl7IC5vcyA9IHsgLmRhdGEgPSAodW5zaWduZWQgY2hhciAqKV92YWxfLCAubGVuID0gX2xlbl8gfX19CisKKworc3RhdGljIGludCBkaWN0X3M2Y19sb2FkX2RlZnMoY2hhciAqIGNvbmZmaWxlKQoreworICAgVFJBQ0VfRU5UUlkoIiVwIiwgY29uZmZpbGUpOworCXN0cnVjdCBkaWN0X29iamVjdCAqIGFwcF9pZDE2Nzc3MzEyOworCisJLyogQXBwbGljYXRpb24gU2VjdGlvbiAqLworCXsKKwkgIHsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIHZlbmRvcjsKKwkJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfVkVORE9SLCBWRU5ET1JfQllfTkFNRSwgIjNHUFAiLCAmdmVuZG9yKQorCQkJc3RydWN0IGRpY3RfYXBwbGljYXRpb25fZGF0YSBkYXRhID0geyAxNjc3NzMxMiwgIlM2YyIgfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FQUExJQ0FUSU9OLCAmZGF0YSwgdmVuZG9yLCAmYXBwX2lkMTY3NzczMTIpCisJICB9CisJICAvKiBSZXN1bHQgY29kZXMgKi8KKwkgIHsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqdHlwZTsKKwkJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiRW51bWVyYXRlZChSZXN1bHQtQ29kZSkiLCZ0eXBlKTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiR2VuZXJhbCIsIHsgLnUzMj0xIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJQZXJtYW5lbnRfRmFpbHVyZXMiLCB7IC51MzI9MyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAiVHJhbnNpZW50X0ZhaWx1cmVzIiwgeyAudTMyPTQgfX07CisKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zLCB0eXBlLCBOVUxMKTsKKworCSAgfQorCX0KKworCisgICAvKiBBVlAgc2VjdGlvbiAqLworICAgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBBZGRyZXNzX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIFVURjhTdHJpbmdfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogRGlhbWV0ZXJJZGVudGl0eV90eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBEaWFtZXRlclVSSV90eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBUaW1lX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIElQRmlsdGVyUnVsZV90eXBlOworCisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkFkZHJlc3MiLCAmQWRkcmVzc190eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiVVRGOFN0cmluZyIsICZVVEY4U3RyaW5nX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJEaWFtZXRlcklkZW50aXR5IiwgJkRpYW1ldGVySWRlbnRpdHlfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkRpYW1ldGVyVVJJIiwgJkRpYW1ldGVyVVJJX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJUaW1lIiwgJlRpbWVfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIklQRmlsdGVyUnVsZSIsICZJUEZpbHRlclJ1bGVfdHlwZSk7CisKKwkKKyAgIH0KKworICAgLyogQ29tbWFuZHMgc2VjdGlvbiAqLworICAgeworCQkvKiBTZW5kLVJvdXRpbmctSW5mby1mb3ItU00tUmVxdWVzdCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJCXN0cnVjdCBkaWN0X2NtZF9kYXRhIGRhdGEgPSB7CisJCQkJODM4ODY0NywJLyogQ29kZSAqLworCQkJCSJTZW5kLVJvdXRpbmctSW5mby1mb3ItU00tUmVxdWVzdCIsCS8qIE5hbWUgKi8KKwkJCQlDTURfRkxBR19SRVFVRVNUIHwgQ01EX0ZMQUdfRVJST1IsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQ01EX0ZMQUdfUkVRVUVTVCB8IENNRF9GTEFHX1BST1hJQUJMRSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCX07CisKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0NPTU1BTkQsICZkYXRhICwgYXBwX2lkMTY3NzczMTIsICZjbWQpCisJCX0KKwkJLyogU2VuZC1Sb3V0aW5nLUluZm8tZm9yLVNNLUFuc3dlciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJCXN0cnVjdCBkaWN0X2NtZF9kYXRhIGRhdGEgPSB7CisJCQkJODM4ODY0NywJLyogQ29kZSAqLworCQkJCSJTZW5kLVJvdXRpbmctSW5mby1mb3ItU00tQW5zd2VyIiwJLyogTmFtZSAqLworCQkJCUNNRF9GTEFHX1JFUVVFU1QsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQ01EX0ZMQUdfUFJPWElBQkxFLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJfTsKKworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQ09NTUFORCwgJmRhdGEgLCBhcHBfaWQxNjc3NzMxMiwgJmNtZCkKKwkJfQorCQkvKiBBbGVydC1TZXJ2aWNlLUNlbnRyZS1SZXF1ZXN0ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQkJc3RydWN0IGRpY3RfY21kX2RhdGEgZGF0YSA9IHsKKwkJCQk4Mzg4NjQ4LAkvKiBDb2RlICovCisJCQkJIkFsZXJ0LVNlcnZpY2UtQ2VudHJlLVJlcXVlc3QiLAkvKiBOYW1lICovCisJCQkJQ01EX0ZMQUdfUkVRVUVTVCB8IENNRF9GTEFHX0VSUk9SLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUNNRF9GTEFHX1JFUVVFU1QgfCBDTURfRkxBR19QUk9YSUFCTEUsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQl9OworCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9DT01NQU5ELCAmZGF0YSAsIGFwcF9pZDE2Nzc3MzEyLCAmY21kKQorCQl9CisJCS8qIEFsZXJ0LVNlcnZpY2UtQ2VudHJlLUFuc3dlciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJCXN0cnVjdCBkaWN0X2NtZF9kYXRhIGRhdGEgPSB7CisJCQkJODM4ODY0OCwJLyogQ29kZSAqLworCQkJCSJBbGVydC1TZXJ2aWNlLUNlbnRyZS1BbnN3ZXIiLAkvKiBOYW1lICovCisJCQkJQ01EX0ZMQUdfUkVRVUVTVCwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlDTURfRkxBR19QUk9YSUFCTEUsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQl9OworCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9DT01NQU5ELCAmZGF0YSAsIGFwcF9pZDE2Nzc3MzEyLCAmY21kKQorCQl9CisJCS8qIFJlcG9ydC1TTS1EZWxpdmVyeS1TdGF0dXMtUmVxdWVzdCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJCXN0cnVjdCBkaWN0X2NtZF9kYXRhIGRhdGEgPSB7CisJCQkJODM4ODY0OSwJLyogQ29kZSAqLworCQkJCSJSZXBvcnQtU00tRGVsaXZlcnktU3RhdHVzLVJlcXVlc3QiLAkvKiBOYW1lICovCisJCQkJQ01EX0ZMQUdfUkVRVUVTVCB8IENNRF9GTEFHX0VSUk9SLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUNNRF9GTEFHX1JFUVVFU1QgfCBDTURfRkxBR19QUk9YSUFCTEUsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQl9OworCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9DT01NQU5ELCAmZGF0YSAsIGFwcF9pZDE2Nzc3MzEyLCAmY21kKQorCQl9CisJCS8qIFJlcG9ydC1TTS1EZWxpdmVyeS1TdGF0dXMtQW5zd2VyICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQkJc3RydWN0IGRpY3RfY21kX2RhdGEgZGF0YSA9IHsKKwkJCQk4Mzg4NjQ5LAkvKiBDb2RlICovCisJCQkJIlJlcG9ydC1TTS1EZWxpdmVyeS1TdGF0dXMtQW5zd2VyIiwJLyogTmFtZSAqLworCQkJCUNNRF9GTEFHX1JFUVVFU1QsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQ01EX0ZMQUdfUFJPWElBQkxFLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJfTsKKworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQ09NTUFORCwgJmRhdGEgLCBhcHBfaWQxNjc3NzMxMiwgJmNtZCkKKwkJfQorCisgICB9CisKKyAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRpY3RfczZjX2xvYWRfcnVsZXMoY2hhciAqIGNvbmZmaWxlKQoreworICAgLyogR3JvdXBlZCBBVlAgc2VjdGlvbiAqLworICAgeworCisgICB9CQorCisgICAvKiBDb21tYW5kcyBzZWN0aW9uICovCisgICB7CisJICAvKiBTZW5kLVJvdXRpbmctSW5mby1mb3ItU00tUmVxdWVzdCAqLworCSAgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJTZW5kLVJvdXRpbmctSW5mby1mb3ItU00tUmVxdWVzdCIsICZjbWQpCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU2Vzc2lvbi1JZCJ9LCBSVUxFX0ZJWEVEX0hFQUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRSTVAifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVmVuZG9yLVNwZWNpZmljLUFwcGxpY2F0aW9uLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkF1dGgtU2Vzc2lvbi1TdGF0ZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tSG9zdCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRGVzdGluYXRpb24tSG9zdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEZXN0aW5hdGlvbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTVNJU0ROIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlVzZXItTmFtZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU01TTUktQ29ycmVsYXRpb24tSUQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlN1cHBvcnRlZC1GZWF0dXJlcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU0MtQWRkcmVzcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU00tUlAtTVRJIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTTS1SUC1TTUVBIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTUlItRmxhZ3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNNLURlbGl2ZXJ5LU5vdC1JbnRlbmRlZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJQcm94eS1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJvdXRlLVJlY29yZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMocnVsZXMsIGNtZCk7CisJICB9CisJICAvKiBTZW5kLVJvdXRpbmctSW5mby1mb3ItU00tQW5zd2VyICovCisJICB7CisJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIlNlbmQtUm91dGluZy1JbmZvLWZvci1TTS1BbnN3ZXIiLCAmY21kKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlNlc3Npb24tSWQifSwgUlVMRV9GSVhFRF9IRUFELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEUk1QIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlZlbmRvci1TcGVjaWZpYy1BcHBsaWNhdGlvbi1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSZXN1bHQtQ29kZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJFeHBlcmltZW50YWwtUmVzdWx0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkF1dGgtU2Vzc2lvbi1TdGF0ZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tSG9zdCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVXNlci1OYW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTdXBwb3J0ZWQtRmVhdHVyZXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNlcnZpbmctTm9kZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQWRkaXRpb25hbC1TZXJ2aW5nLU5vZGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkxNU0kifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlVzZXItSWRlbnRpZmllciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTVdELVN0YXR1cyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTU1FLUFic2VudC1Vc2VyLURpYWdub3N0aWMtU00ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1TQy1BYnNlbnQtVXNlci1EaWFnbm9zdGljLVNNIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTR1NOLUFic2VudC1Vc2VyLURpYWdub3N0aWMtU00ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRmFpbGVkLUFWUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJQcm94eS1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJvdXRlLVJlY29yZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMocnVsZXMsIGNtZCk7CisJICB9CisJICAvKiBBbGVydC1TZXJ2aWNlLUNlbnRyZS1SZXF1ZXN0ICovCisJICB7CisJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIkFsZXJ0LVNlcnZpY2UtQ2VudHJlLVJlcXVlc3QiLCAmY21kKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlNlc3Npb24tSWQifSwgUlVMRV9GSVhFRF9IRUFELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEUk1QIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlZlbmRvci1TcGVjaWZpYy1BcHBsaWNhdGlvbi1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBdXRoLVNlc3Npb24tU3RhdGUifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLUhvc3QifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLVJlYWxtIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRlc3RpbmF0aW9uLUhvc3QifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRGVzdGluYXRpb24tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNDLUFkZHJlc3MifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlVzZXItSWRlbnRpZmllciJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU01TTUktQ29ycmVsYXRpb24tSUQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1heGltdW0tVUUtQXZhaWxhYmlsaXR5LVRpbWUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNNUy1HTVNDLUFsZXJ0LUV2ZW50In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTZXJ2aW5nLU5vZGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlN1cHBvcnRlZC1GZWF0dXJlcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJQcm94eS1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJvdXRlLVJlY29yZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMocnVsZXMsIGNtZCk7CisJICB9CisJICAvKiBBbGVydC1TZXJ2aWNlLUNlbnRyZS1BbnN3ZXIgKi8KKwkgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX0NPTU1BTkQsIENNRF9CWV9OQU1FLCAiQWxlcnQtU2VydmljZS1DZW50cmUtQW5zd2VyIiwgJmNtZCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTZXNzaW9uLUlkIn0sIFJVTEVfRklYRURfSEVBRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRFJNUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJWZW5kb3ItU3BlY2lmaWMtQXBwbGljYXRpb24tSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUmVzdWx0LUNvZGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRXhwZXJpbWVudGFsLVJlc3VsdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBdXRoLVNlc3Npb24tU3RhdGUifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLUhvc3QifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLVJlYWxtIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTdXBwb3J0ZWQtRmVhdHVyZXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRmFpbGVkLUFWUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJQcm94eS1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJvdXRlLVJlY29yZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMocnVsZXMsIGNtZCk7CisJICB9CisJICAvKiBSZXBvcnQtU00tRGVsaXZlcnktU3RhdHVzLVJlcXVlc3QgKi8KKwkgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX0NPTU1BTkQsIENNRF9CWV9OQU1FLCAiUmVwb3J0LVNNLURlbGl2ZXJ5LVN0YXR1cy1SZXF1ZXN0IiwgJmNtZCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTZXNzaW9uLUlkIn0sIFJVTEVfRklYRURfSEVBRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRFJNUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJWZW5kb3ItU3BlY2lmaWMtQXBwbGljYXRpb24tSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQXV0aC1TZXNzaW9uLVN0YXRlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1Ib3N0In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEZXN0aW5hdGlvbi1Ib3N0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRlc3RpbmF0aW9uLVJlYWxtIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTdXBwb3J0ZWQtRmVhdHVyZXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlVzZXItSWRlbnRpZmllciJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU01TTUktQ29ycmVsYXRpb24tSUQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNDLUFkZHJlc3MifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNNLURlbGl2ZXJ5LU91dGNvbWUifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJEUi1GbGFncyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJQcm94eS1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJvdXRlLVJlY29yZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMocnVsZXMsIGNtZCk7CisJICB9CisJICAvKiBSZXBvcnQtU00tRGVsaXZlcnktU3RhdHVzLUFuc3dlciAqLworCSAgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJSZXBvcnQtU00tRGVsaXZlcnktU3RhdHVzLUFuc3dlciIsICZjbWQpCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU2Vzc2lvbi1JZCJ9LCBSVUxFX0ZJWEVEX0hFQUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRSTVAifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVmVuZG9yLVNwZWNpZmljLUFwcGxpY2F0aW9uLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJlc3VsdC1Db2RlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkV4cGVyaW1lbnRhbC1SZXN1bHQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQXV0aC1TZXNzaW9uLVN0YXRlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1Ib3N0In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU3VwcG9ydGVkLUZlYXR1cmVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJVc2VyLUlkZW50aWZpZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRmFpbGVkLUFWUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJQcm94eS1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJvdXRlLVJlY29yZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMocnVsZXMsIGNtZCk7CisJICB9CisKKyAgIH0KKworICAgTE9HX0QoICJFeHRlbnNpb24gJ0RpY3Rpb25hcnkgZGVmaW5pdGlvbnMgZm9yIFM2YyAoZTEwKScgaW5pdGlhbGl6ZWQiKTsKKyAgIHJldHVybiAwOworfQorCitpbnQgZGljdF9lbnRyeShjaGFyICogY29uZmZpbGUpCit7CisJZGljdF9zNmNfbG9hZF9kZWZzKGNvbmZmaWxlKTsKKwlyZXR1cm4gZGljdF9zNmNfbG9hZF9ydWxlcyhjb25mZmlsZSk7Cit9CisKK2NvbnN0IGNoYXIqIGRpY3RfczZjX3Byb3RvX3ZlcihjaGFyICogY29uZmZpbGUpIHsKKwlyZXR1cm4gczZjX3Byb3RvX3ZlcjsKK30KKworY29uc3QgZG91YmxlIGRpY3RfczZjX2dlbl90cyhjaGFyICogY29uZmZpbGUpIHsKKwlyZXR1cm4gczZjX2dlbl9kYXRlOworfQorCitFWFRFTlNJT05fRU5UUlkyKCJkaWN0X3M2YyIsIGRpY3RfczZjX2xvYWRfZGVmcywgZGljdF9zNmNfbG9hZF9ydWxlcywgImRpY3RfdHMyOTMzOF9hdnBzIiwgImRpY3RfdHMyOTI3Ml9hdnBzIiwgImRpY3RfdHMyOTMzNl9hdnBzIiwgImRpY3RfdHMyOTE3M19hdnBzIiwgImRpY3RfdHMyOTMyOV9hdnBzIiwgImRpY3RfdHMyOTIyOV9hdnBzIiwgImRpY3RfcmZjNzk0NF9hdnBzIik7CisKKworCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfUzZtUzZuL0NNYWtlTGlzdHMudHh0IGIvZXh0ZW5zaW9ucy9kaWN0X1M2bVM2bi9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGYyMDA4Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kaWN0X1M2bVM2bi9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDE2IEBACisjIFRoZSBkaWN0X1M2bVM2biBleHRlbnNpb24KK1BST0pFQ1QoImRpY3RfUzZtUzZuIGxpYnJhcnkgZ2VuZXJhdGVkIGJ5IEZkR2VuICIgQykKKworIyBDb21waWxlIGFzIGEgbW9kdWxlCitGRF9BRERfRVhURU5TSU9OKGRpY3RfUzZtUzZuIGRpY3RfUzZtUzZuLmMpCisKKworIyMjIworIyMgSU5TVEFMTCBzZWN0aW9uICMjCisKK0lOU1RBTEwoVEFSR0VUUyBkaWN0X1M2bVM2bgorCUxJQlJBUlkgREVTVElOQVRJT04gJHtJTlNUQUxMX0VYVEVOU0lPTlNfU1VGRklYfQorQ09NUE9ORU5UIGZyZWVEaWFtZXRlci1kaWN0aW9uYXJ5LVM2TVM2TikKKworCisKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF9TNm1TNm4vUzZtUzZuLmRpZCBiL2V4dGVuc2lvbnMvZGljdF9TNm1TNm4vUzZtUzZuLmRpZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2FiYTg0Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kaWN0X1M2bVM2bi9TNm1TNm4uZGlkCkBAIC0wLDAgKzEsMzggQEAKK2RpY3RfcmZjNjk0Ml9hdnBzCitkaWN0X3RzMjk0NjhfYXZwcworZGljdF90czI5MTU0X2F2cHMKK2RpY3RfdHMyOTIxNF9hdnBzCitkaWN0X3RzMjkyMTVfYXZwcworZGljdF90czI5MjE3X2F2cHMKK2RpY3RfM2dwcDJfYXZwcworZGljdF90czI5MzM3X2F2cHMKK2RpY3RfdHMyOTM0M19hdnBzCitkaWN0X3RzMjkzMzhfYXZwcworZGljdF90czI5MTI4X2F2cHMKK2RpY3RfdHMyOTM0NF9hdnBzCitkaWN0X3RzMjkzNDVfYXZwcworZGljdF90czI5MTczX2F2cHMKK2RpY3RfdHMzMjI5OV9hdnBzCitkaWN0X3JmYzY3MzRfYXZwcworZGljdF9yZmM1NTgwX2F2cHMKK2RpY3RfcmZjNDA3Ml9hdnBzCitkaWN0X3RzMjkyNzNfYXZwcworZGljdF9yZmM0MDA2YmlzX2F2cHMKK2RpY3RfdHMyOTIxMl9hdnBzCitkaWN0X3RzMjkwNjFfYXZwcworZGljdF90czI5MjcyX2F2cHMKK2RpY3RfcmZjNTQ0N19hdnBzCitkaWN0X3JmYzU3NzhfYXZwcworZGljdF9yZmM1Nzc3X2F2cHMKK2RpY3RfdHMyOTMzNl9hdnBzCitkaWN0X2V0c2kyODMwMzRfYXZwcworZGljdF9yZmM0NTkwX2F2cHMKK2RpY3RfcmZjNDAwNF9hdnBzCitkaWN0X3JmYzcxNTVfYXZwcworZGljdF90czI5MjI5X2F2cHMKK2RpY3RfcmZjNzY4M19hdnBzCitkaWN0X2RyYWZ0bG9hZF9hdnBzCitkaWN0X3JmYzc5NDRfYXZwcworZGljdF90czI5MzI5X2F2cHMKK2RpY3RfdHMyOTM2OF9hdnBzCitkaWN0X1M2bVM2bgpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X1M2bVM2bi9kaWN0X1M2bVM2bi5jIGIvZXh0ZW5zaW9ucy9kaWN0X1M2bVM2bi9kaWN0X1M2bVM2bi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0YjM4YzcKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfUzZtUzZuL2RpY3RfUzZtUzZuLmMKQEAgLTAsMCArMSwyNTAgQEAKKy8qCisqIENvcHlyaWdodCAoYykgMjAxNyBTcHJpbnQKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLyoqKioqKioqKioqKioqKioKKyBHZW5lcmF0ZWQgQnk6IGZkdG9vbCBlbmhhbmNlbWVudHMgdG8gZGlhZnV6emVyCisgTGljZW5zZTogc2FtZSBhcyBmcmVlRGlhbWV0ZXIKKyoqKioqKioqKioqKioqKiovCisKKworLyogCisgKiBEaWN0aW9uYXJ5IGRlZmluaXRpb25zIG9mIG9iamVjdHMgc3BlY2lmaWVkIGluIFM2bVM2biAoZTEwKS4KKyAqLworI2luY2x1ZGUgPGZyZWVEaWFtZXRlci9leHRlbnNpb24uaD4KKworI2RlZmluZSBQUk9UT19WRVIgImUxMCIKKyNkZWZpbmUgR0VOX0RBVEUgIDE1MDY2OTcxOTcuODYKKworY29uc3QgY2hhciAqczZtczZuX3Byb3RvX3ZlciA9IFBST1RPX1ZFUjsKK2NvbnN0IGRvdWJsZSBzNm1zNm5fZ2VuX2RhdGUgPSBHRU5fREFURTsKKworLyogVGhlIGNvbnRlbnQgb2YgdGhpcyBmaWxlIGZvbGxvd3MgdGhlIHNhbWUgc3RydWN0dXJlIGFzIGRpY3RfYmFzZV9wcm90by5jICovCisKKyNkZWZpbmUgQ0hFQ0tfZGljdF9uZXcoIF90eXBlLCBfZGF0YSwgX3BhcmVudCwgX3JlZiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgX3JldCA9IGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIChfdHlwZSksIChfZGF0YSksIChfcGFyZW50KSwgKF9yZWYpICk7IFwKKyAgICBpZiAoIF9yZXQgIT0gMCAmJiBfcmV0ICE9IEVFWElTVCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICByZXR1cm4gX3JldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBDSEVDS19kaWN0X3NlYXJjaCggX3R5cGUsIF9jcml0ZXJpYSwgX3doYXQsIF9yZXN1bHQgKQkJXAorICAgIENIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIChfdHlwZSksIChfY3JpdGVyaWEpLCAoX3doYXQpLCAoX3Jlc3VsdCksIEVOT0VOVCkgKTsKKworc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24geworICAgIHN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lOworICAgIGVudW0gcnVsZV9wb3NpdGlvbglwb3NpdGlvbjsKKyAgICBpbnQgCQkJbWluOworICAgIGludAkJCW1heDsKK307CisKKyNkZWZpbmUgUlVMRV9PUkRFUiggX3Bvc2l0aW9uICkgKCgoKF9wb3NpdGlvbikgPT0gUlVMRV9GSVhFRF9IRUFEKSB8fCAoKF9wb3NpdGlvbikgPT0gUlVMRV9GSVhFRF9UQUlMKSkgPyAxIDogMCApCisKKy8qIEF0dGVudGlvbiEgVGhpcyB2ZXJzaW9uIG9mIHRoZSBtYWNybyB1c2VzIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsIGluIGNvbnRyYXN0IHRvIG1vc3Qgb3RoZXIgY29waWVzISAqLworI2RlZmluZSBQQVJTRV9sb2NfcnVsZXMoIF9ydWxlYXJyYXksIF9wYXJlbnQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBfX2FyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yIChfX2FyPTA7IF9fYXIgPCBzaXplb2YoX3J1bGVhcnJheSkgLyBzaXplb2YoKF9ydWxlYXJyYXkpWzBdKTsgX19hcisrKSB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHN0cnVjdCBkaWN0X3J1bGVfZGF0YSBfX2RhdGEgPSB7IE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ucG9zaXRpb24sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLm1pbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ubWF4fTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfX2RhdGEucnVsZV9vcmRlciA9IFJVTEVfT1JERVIoX19kYXRhLnJ1bGVfcG9zaXRpb24pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIENIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIERJQ1RfQVZQLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAmKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICZfX2RhdGEucnVsZV9hdnAsIDAgKSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmICggIV9fZGF0YS5ydWxlX2F2cCApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9ERUJVRyhJTkZPLCAiQVZQIE5vdCBmb3VuZDogJyVzJyIsIChfcnVsZWFycmF5KVtfX2FyXS5hdnBfdmVuZG9yX3BsdXNfbmFtZS5hdnBfbmFtZSk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFTk9FTlQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgX3JldCA9IGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfUlVMRSwgJihfX2RhdGEpLCAoX3BhcmVudCksIE5VTEwgKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggX3JldCAhPSAwICYmIF9yZXQgIT0gRUVYSVNUICkgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFX0RFQlVHKElORk8sICJFcnJvciBvbiBydWxlIHdpdGggQVZQICclcyciLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLmF2cF9uYW1lKTsgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRUlOVkFMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgQ0hFQ0tfdmVuZG9yX25ldyggX2RhdGEgKSB7IFwKKyAgICAgICAgc3RydWN0IGRpY3Rfb2JqZWN0ICogdmVuZG9yX2ZvdW5kOyBcCisgICAgICAgIGlmIChmZF9kaWN0X3NlYXJjaChmZF9nX2NvbmZpZy0+Y25mX2RpY3QsRElDVF9WRU5ET1IsVkVORE9SX0JZX0lELCZfZGF0YS52ZW5kb3JfaWQsJnZlbmRvcl9mb3VuZCxFTk9FTlQpID09IEVOT0VOVCkgeyBcCisgICAgICAgICAgICAgICAgQ0hFQ0tfRkNUKGZkX2RpY3RfbmV3KGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9WRU5ET1IsICZfZGF0YSwgTlVMTCwgTlVMTCkpOyBcCisgICAgICAgIH0gXAorfQorCisjZGVmaW5lIGVudW12YWxfZGVmX3UzMiggX3ZhbF8sIF9zdHJfICkJCVwKKyAgICB7IF9zdHJfLCAJCXsgLnUzMiA9IF92YWxfIH19CisKKyNkZWZpbmUgZW51bXZhbF9kZWZfb3MoIF9sZW5fLCBfdmFsXywgX3N0cl8gKQkJCQlcCisgICAgeyBfc3RyXywgCQl7IC5vcyA9IHsgLmRhdGEgPSAodW5zaWduZWQgY2hhciAqKV92YWxfLCAubGVuID0gX2xlbl8gfX19CisKKworc3RhdGljIGludCBkaWN0X3M2bXM2bl9sb2FkX2RlZnMoY2hhciAqIGNvbmZmaWxlKQoreworICAgVFJBQ0VfRU5UUlkoIiVwIiwgY29uZmZpbGUpOworCXN0cnVjdCBkaWN0X29iamVjdCAqIGFwcF9pZDE2Nzc3MzEwOworCisJLyogQXBwbGljYXRpb24gU2VjdGlvbiAqLworCXsKKwkgIHsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIHZlbmRvcjsKKwkJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfVkVORE9SLCBWRU5ET1JfQllfTkFNRSwgIjNHUFAiLCAmdmVuZG9yKQorCQkJc3RydWN0IGRpY3RfYXBwbGljYXRpb25fZGF0YSBkYXRhID0geyAxNjc3NzMxMCwgIlM2bVM2biIgfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FQUExJQ0FUSU9OLCAmZGF0YSwgdmVuZG9yLCAmYXBwX2lkMTY3NzczMTApCisJICB9CisJfQorCisKKyAgIC8qIEFWUCBzZWN0aW9uICovCisgICB7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIEFkZHJlc3NfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogVVRGOFN0cmluZ190eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBEaWFtZXRlcklkZW50aXR5X3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIERpYW1ldGVyVVJJX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIFRpbWVfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogSVBGaWx0ZXJSdWxlX3R5cGU7CisKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiQWRkcmVzcyIsICZBZGRyZXNzX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJVVEY4U3RyaW5nIiwgJlVURjhTdHJpbmdfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkRpYW1ldGVySWRlbnRpdHkiLCAmRGlhbWV0ZXJJZGVudGl0eV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiRGlhbWV0ZXJVUkkiLCAmRGlhbWV0ZXJVUklfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIlRpbWUiLCAmVGltZV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiSVBGaWx0ZXJSdWxlIiwgJklQRmlsdGVyUnVsZV90eXBlKTsKKworCQorICAgfQorCisgICAvKiBDb21tYW5kcyBzZWN0aW9uICovCisgICB7CisJCS8qIFN1YnNjcmliZXItSW5mb3JtYXRpb24tUmVxdWVzdCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJCXN0cnVjdCBkaWN0X2NtZF9kYXRhIGRhdGEgPSB7CisJCQkJODM4ODY0MSwJLyogQ29kZSAqLworCQkJCSJTdWJzY3JpYmVyLUluZm9ybWF0aW9uLVJlcXVlc3QiLAkvKiBOYW1lICovCisJCQkJQ01EX0ZMQUdfUkVRVUVTVCB8IENNRF9GTEFHX0VSUk9SLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUNNRF9GTEFHX1JFUVVFU1QgfCBDTURfRkxBR19QUk9YSUFCTEUsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQl9OworCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9DT01NQU5ELCAmZGF0YSAsIGFwcF9pZDE2Nzc3MzEwLCAmY21kKQorCQl9CisJCS8qIFN1YnNjcmliZXItSW5mb3JtYXRpb24tQW5zd2VyICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQkJc3RydWN0IGRpY3RfY21kX2RhdGEgZGF0YSA9IHsKKwkJCQk4Mzg4NjQxLAkvKiBDb2RlICovCisJCQkJIlN1YnNjcmliZXItSW5mb3JtYXRpb24tQW5zd2VyIiwJLyogTmFtZSAqLworCQkJCUNNRF9GTEFHX1JFUVVFU1QsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQ01EX0ZMQUdfUFJPWElBQkxFLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJfTsKKworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQ09NTUFORCwgJmRhdGEgLCBhcHBfaWQxNjc3NzMxMCwgJmNtZCkKKwkJfQorCisgICB9CisKKyAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRpY3RfczZtczZuX2xvYWRfcnVsZXMoY2hhciAqIGNvbmZmaWxlKQoreworICAgLyogR3JvdXBlZCBBVlAgc2VjdGlvbiAqLworICAgeworCisgICB9CQorCisgICAvKiBDb21tYW5kcyBzZWN0aW9uICovCisgICB7CisJICAvKiBTdWJzY3JpYmVyLUluZm9ybWF0aW9uLVJlcXVlc3QgKi8KKwkgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX0NPTU1BTkQsIENNRF9CWV9OQU1FLCAiU3Vic2NyaWJlci1JbmZvcm1hdGlvbi1SZXF1ZXN0IiwgJmNtZCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTZXNzaW9uLUlkIn0sIFJVTEVfRklYRURfSEVBRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRFJNUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBdXRoLVNlc3Npb24tU3RhdGUifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLUhvc3QifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLVJlYWxtIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRlc3RpbmF0aW9uLUhvc3QifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRGVzdGluYXRpb24tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlVzZXItSWRlbnRpZmllciJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU2VydmljZS1JRCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU0NTLUlkZW50aXR5In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTZXJ2aWNlLVBhcmFtZXRlcnMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNJUi1GbGFncyJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPQy1TdXBwb3J0ZWQtRmVhdHVyZXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlN1cHBvcnRlZC1GZWF0dXJlcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJQcm94eS1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJvdXRlLVJlY29yZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMocnVsZXMsIGNtZCk7CisJICB9CisJICAvKiBTdWJzY3JpYmVyLUluZm9ybWF0aW9uLUFuc3dlciAqLworCSAgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJTdWJzY3JpYmVyLUluZm9ybWF0aW9uLUFuc3dlciIsICZjbWQpCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU2Vzc2lvbi1JZCJ9LCBSVUxFX0ZJWEVEX0hFQUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRSTVAifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUmVzdWx0LUNvZGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRXhwZXJpbWVudGFsLVJlc3VsdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBdXRoLVNlc3Npb24tU3RhdGUifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLUhvc3QifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLVJlYWxtIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9DLVN1cHBvcnRlZC1GZWF0dXJlcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPQy1PTFIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiTG9hZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU3VwcG9ydGVkLUZlYXR1cmVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJVc2VyLUlkZW50aWZpZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNlcnZpY2UtRGF0YSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJGYWlsZWQtQVZQIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlByb3h5LUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUm91dGUtUmVjb3JkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyhydWxlcywgY21kKTsKKwkgIH0KKworICAgfQorCisgICBMT0dfRCggIkV4dGVuc2lvbiAnRGljdGlvbmFyeSBkZWZpbml0aW9ucyBmb3IgUzZtUzZuIChlMTApJyBpbml0aWFsaXplZCIpOworICAgcmV0dXJuIDA7Cit9CisKK2ludCBkaWN0X2VudHJ5KGNoYXIgKiBjb25mZmlsZSkKK3sKKwlkaWN0X3M2bXM2bl9sb2FkX2RlZnMoY29uZmZpbGUpOworCXJldHVybiBkaWN0X3M2bXM2bl9sb2FkX3J1bGVzKGNvbmZmaWxlKTsKK30KKworY29uc3QgY2hhciogZGljdF9zNm1zNm5fcHJvdG9fdmVyKGNoYXIgKiBjb25mZmlsZSkgeworCXJldHVybiBzNm1zNm5fcHJvdG9fdmVyOworfQorCitjb25zdCBkb3VibGUgZGljdF9zNm1zNm5fZ2VuX3RzKGNoYXIgKiBjb25mZmlsZSkgeworCXJldHVybiBzNm1zNm5fZ2VuX2RhdGU7Cit9CisKK0VYVEVOU0lPTl9FTlRSWTIoImRpY3RfczZtczZuIiwgZGljdF9zNm1zNm5fbG9hZF9kZWZzLCBkaWN0X3M2bXM2bl9sb2FkX3J1bGVzLCAiZGljdF90czMyMjk5X2F2cHMiLCAiZGljdF90czI5MzM2X2F2cHMiLCAiZGljdF90czI5MjcyX2F2cHMiLCAiZGljdF90czI5MzM4X2F2cHMiLCAiZGljdF90czI5MzY4X2F2cHMiLCAiZGljdF90czI5MzI5X2F2cHMiLCAiZGljdF90czI5MjI5X2F2cHMiLCAiZGljdF90czI5MjE3X2F2cHMiLCAiZGljdF90czI5MTczX2F2cHMiLCAiZGljdF9yZmM1Nzc4X2F2cHMiLCAiZGljdF9kcmFmdGxvYWRfYXZwcyIsICJkaWN0X3JmYzc2ODNfYXZwcyIsICJkaWN0X3JmYzU3NzdfYXZwcyIsICJkaWN0X3JmYzc5NDRfYXZwcyIpOworCisKKwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X1M2dC9DTWFrZUxpc3RzLnR4dCBiL2V4dGVuc2lvbnMvZGljdF9TNnQvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU3ODJlMgotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF9TNnQvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxNiBAQAorIyBUaGUgZGljdF9TNnQgZXh0ZW5zaW9uCitQUk9KRUNUKCJkaWN0X1M2dCBsaWJyYXJ5IGdlbmVyYXRlZCBieSBGZEdlbiAiIEMpCisKKyMgQ29tcGlsZSBhcyBhIG1vZHVsZQorRkRfQUREX0VYVEVOU0lPTihkaWN0X1M2dCBkaWN0X1M2dC5jKQorCisKKyMjIyMKKyMjIElOU1RBTEwgc2VjdGlvbiAjIworCitJTlNUQUxMKFRBUkdFVFMgZGljdF9TNnQKKwlMSUJSQVJZIERFU1RJTkFUSU9OICR7SU5TVEFMTF9FWFRFTlNJT05TX1NVRkZJWH0KK0NPTVBPTkVOVCBmcmVlRGlhbWV0ZXItZGljdGlvbmFyeS1TNlQpCisKKworCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfUzZ0L1M2dC5kaWQgYi9leHRlbnNpb25zL2RpY3RfUzZ0L1M2dC5kaWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFkNmE1YgotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF9TNnQvUzZ0LmRpZApAQCAtMCwwICsxLDM4IEBACitkaWN0X3JmYzY5NDJfYXZwcworZGljdF90czI5NDY4X2F2cHMKK2RpY3RfdHMyOTE1NF9hdnBzCitkaWN0X3RzMjkyMTRfYXZwcworZGljdF90czI5MjE1X2F2cHMKK2RpY3RfdHMyOTIxN19hdnBzCitkaWN0XzNncHAyX2F2cHMKK2RpY3RfdHMyOTMzN19hdnBzCitkaWN0X3RzMjkzNDNfYXZwcworZGljdF90czI5MzM4X2F2cHMKK2RpY3RfdHMyOTEyOF9hdnBzCitkaWN0X3RzMjkzNDRfYXZwcworZGljdF90czI5MzQ1X2F2cHMKK2RpY3RfdHMyOTE3M19hdnBzCitkaWN0X3RzMzIyOTlfYXZwcworZGljdF9yZmM2NzM0X2F2cHMKK2RpY3RfcmZjNTU4MF9hdnBzCitkaWN0X3JmYzQwNzJfYXZwcworZGljdF90czI5MjczX2F2cHMKK2RpY3RfcmZjNDAwNmJpc19hdnBzCitkaWN0X3RzMjkyMTJfYXZwcworZGljdF90czI5MDYxX2F2cHMKK2RpY3RfdHMyOTI3Ml9hdnBzCitkaWN0X3JmYzU0NDdfYXZwcworZGljdF9yZmM1Nzc4X2F2cHMKK2RpY3RfcmZjNTc3N19hdnBzCitkaWN0X3RzMjkzMzZfYXZwcworZGljdF9ldHNpMjgzMDM0X2F2cHMKK2RpY3RfcmZjNDU5MF9hdnBzCitkaWN0X3JmYzQwMDRfYXZwcworZGljdF9yZmM3MTU1X2F2cHMKK2RpY3RfdHMyOTIyOV9hdnBzCitkaWN0X3JmYzc2ODNfYXZwcworZGljdF9kcmFmdGxvYWRfYXZwcworZGljdF9yZmM3OTQ0X2F2cHMKK2RpY3RfdHMyOTMyOV9hdnBzCitkaWN0X3RzMjkzNjhfYXZwcworZGljdF9TNnQKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF9TNnQvZGljdF9TNnQuYyBiL2V4dGVuc2lvbnMvZGljdF9TNnQvZGljdF9TNnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2JjZTcxCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kaWN0X1M2dC9kaWN0X1M2dC5jCkBAIC0wLDAgKzEsMzk3IEBACisvKgorKiBDb3B5cmlnaHQgKGMpIDIwMTcgU3ByaW50CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKy8qKioqKioqKioqKioqKioqCisgR2VuZXJhdGVkIEJ5OiBmZHRvb2wgZW5oYW5jZW1lbnRzIHRvIGRpYWZ1enplcgorIExpY2Vuc2U6IHNhbWUgYXMgZnJlZURpYW1ldGVyCisqKioqKioqKioqKioqKioqLworCisKKy8qIAorICogRGljdGlvbmFyeSBkZWZpbml0aW9ucyBvZiBvYmplY3RzIHNwZWNpZmllZCBpbiBTNnQgKGUxMCkuCisgKi8KKyNpbmNsdWRlIDxmcmVlRGlhbWV0ZXIvZXh0ZW5zaW9uLmg+CisKKyNkZWZpbmUgUFJPVE9fVkVSICJlMTAiCisjZGVmaW5lIEdFTl9EQVRFICAxNTA4MDEwMjEwLjE5CisKK2NvbnN0IGNoYXIgKnM2dF9wcm90b192ZXIgPSBQUk9UT19WRVI7Citjb25zdCBkb3VibGUgczZ0X2dlbl9kYXRlID0gR0VOX0RBVEU7CisKKy8qIFRoZSBjb250ZW50IG9mIHRoaXMgZmlsZSBmb2xsb3dzIHRoZSBzYW1lIHN0cnVjdHVyZSBhcyBkaWN0X2Jhc2VfcHJvdG8uYyAqLworCisjZGVmaW5lIENIRUNLX2RpY3RfbmV3KCBfdHlwZSwgX2RhdGEsIF9wYXJlbnQsIF9yZWYgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IF9yZXQgPSBmZF9kaWN0X25ldyggZmRfZ19jb25maWctPmNuZl9kaWN0LCAoX3R5cGUpLCAoX2RhdGEpLCAoX3BhcmVudCksIChfcmVmKSApOyBcCisgICAgaWYgKCBfcmV0ICE9IDAgJiYgX3JldCAhPSBFRVhJU1QgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgcmV0dXJuIF9yZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgQ0hFQ0tfZGljdF9zZWFyY2goIF90eXBlLCBfY3JpdGVyaWEsIF93aGF0LCBfcmVzdWx0ICkJCVwKKyAgICBDSEVDS19GQ1QoICBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCAoX3R5cGUpLCAoX2NyaXRlcmlhKSwgKF93aGF0KSwgKF9yZXN1bHQpLCBFTk9FTlQpICk7CisKK3N0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHsKKyAgICBzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZTsKKyAgICBlbnVtIHJ1bGVfcG9zaXRpb24JcG9zaXRpb247CisgICAgaW50IAkJCW1pbjsKKyAgICBpbnQJCQltYXg7Cit9OworCisjZGVmaW5lIFJVTEVfT1JERVIoIF9wb3NpdGlvbiApICgoKChfcG9zaXRpb24pID09IFJVTEVfRklYRURfSEVBRCkgfHwgKChfcG9zaXRpb24pID09IFJVTEVfRklYRURfVEFJTCkpID8gMSA6IDAgKQorCisvKiBBdHRlbnRpb24hIFRoaXMgdmVyc2lvbiBvZiB0aGUgbWFjcm8gdXNlcyBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCBpbiBjb250cmFzdCB0byBtb3N0IG90aGVyIGNvcGllcyEgKi8KKyNkZWZpbmUgUEFSU0VfbG9jX3J1bGVzKCBfcnVsZWFycmF5LCBfcGFyZW50KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgX19hcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoX19hcj0wOyBfX2FyIDwgc2l6ZW9mKF9ydWxlYXJyYXkpIC8gc2l6ZW9mKChfcnVsZWFycmF5KVswXSk7IF9fYXIrKykgeyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgZGljdF9ydWxlX2RhdGEgX19kYXRhID0geyBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLnBvc2l0aW9uLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5taW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLm1heH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgX19kYXRhLnJ1bGVfb3JkZXIgPSBSVUxFX09SREVSKF9fZGF0YS5ydWxlX3Bvc2l0aW9uKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBDSEVDS19GQ1QoICBmZF9kaWN0X3NlYXJjaCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgZmRfZ19jb25maWctPmNuZl9kaWN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBESUNUX0FWUCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgJihfcnVsZWFycmF5KVtfX2FyXS5hdnBfdmVuZG9yX3BsdXNfbmFtZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAmX19kYXRhLnJ1bGVfYXZwLCAwICkgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpZiAoICFfX2RhdGEucnVsZV9hdnAgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfREVCVUcoSU5GTywgIkFWUCBOb3QgZm91bmQ6ICclcyciLCAoX3J1bGVhcnJheSlbX19hcl0uYXZwX3ZlbmRvcl9wbHVzX25hbWUuYXZwX25hbWUpOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRU5PRU5UOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IF9yZXQgPSBmZF9kaWN0X25ldyggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1JVTEUsICYoX19kYXRhKSwgKF9wYXJlbnQpLCBOVUxMICk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIF9yZXQgIT0gMCAmJiBfcmV0ICE9IEVFWElTVCApICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9ERUJVRyhJTkZPLCAiRXJyb3Igb24gcnVsZSB3aXRoIEFWUCAnJXMnIiwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5hdnBfdmVuZG9yX3BsdXNfbmFtZS5hdnBfbmFtZSk7ICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVJTlZBTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIENIRUNLX3ZlbmRvcl9uZXcoIF9kYXRhICkgeyBcCisgICAgICAgIHN0cnVjdCBkaWN0X29iamVjdCAqIHZlbmRvcl9mb3VuZDsgXAorICAgICAgICBpZiAoZmRfZGljdF9zZWFyY2goZmRfZ19jb25maWctPmNuZl9kaWN0LERJQ1RfVkVORE9SLFZFTkRPUl9CWV9JRCwmX2RhdGEudmVuZG9yX2lkLCZ2ZW5kb3JfZm91bmQsRU5PRU5UKSA9PSBFTk9FTlQpIHsgXAorICAgICAgICAgICAgICAgIENIRUNLX0ZDVChmZF9kaWN0X25ldyhmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfVkVORE9SLCAmX2RhdGEsIE5VTEwsIE5VTEwpKTsgXAorICAgICAgICB9IFwKK30KKworI2RlZmluZSBlbnVtdmFsX2RlZl91MzIoIF92YWxfLCBfc3RyXyApCQlcCisgICAgeyBfc3RyXywgCQl7IC51MzIgPSBfdmFsXyB9fQorCisjZGVmaW5lIGVudW12YWxfZGVmX29zKCBfbGVuXywgX3ZhbF8sIF9zdHJfICkJCQkJXAorICAgIHsgX3N0cl8sIAkJeyAub3MgPSB7IC5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilfdmFsXywgLmxlbiA9IF9sZW5fIH19fQorCisKK3N0YXRpYyBpbnQgZGljdF9zNnRfbG9hZF9kZWZzKGNoYXIgKiBjb25mZmlsZSkKK3sKKyAgIFRSQUNFX0VOVFJZKCIlcCIsIGNvbmZmaWxlKTsKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhcHBfaWQxNjc3NzM0NTsKKworCS8qIEFwcGxpY2F0aW9uIFNlY3Rpb24gKi8KKwl7CisJICB7CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiB2ZW5kb3I7CisJCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX1ZFTkRPUiwgVkVORE9SX0JZX05BTUUsICIzR1BQIiwgJnZlbmRvcikKKwkJCXN0cnVjdCBkaWN0X2FwcGxpY2F0aW9uX2RhdGEgZGF0YSA9IHsgMTY3NzczNDUsICJTNnQiIH07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BUFBMSUNBVElPTiwgJmRhdGEsIHZlbmRvciwgJmFwcF9pZDE2Nzc3MzQ1KQorCSAgfQorCX0KKworCisgICAvKiBBVlAgc2VjdGlvbiAqLworICAgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBBZGRyZXNzX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIFVURjhTdHJpbmdfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogRGlhbWV0ZXJJZGVudGl0eV90eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBEaWFtZXRlclVSSV90eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBUaW1lX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIElQRmlsdGVyUnVsZV90eXBlOworCisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkFkZHJlc3MiLCAmQWRkcmVzc190eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiVVRGOFN0cmluZyIsICZVVEY4U3RyaW5nX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJEaWFtZXRlcklkZW50aXR5IiwgJkRpYW1ldGVySWRlbnRpdHlfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkRpYW1ldGVyVVJJIiwgJkRpYW1ldGVyVVJJX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJUaW1lIiwgJlRpbWVfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIklQRmlsdGVyUnVsZSIsICZJUEZpbHRlclJ1bGVfdHlwZSk7CisKKwkKKyAgIH0KKworICAgLyogQ29tbWFuZHMgc2VjdGlvbiAqLworICAgeworCQkvKiBDb25maWd1cmF0aW9uLUluZm9ybWF0aW9uLVJlcXVlc3QgKi8KKwkJeworCQkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCQlzdHJ1Y3QgZGljdF9jbWRfZGF0YSBkYXRhID0geworCQkJCTgzODg3MTgsCS8qIENvZGUgKi8KKwkJCQkiQ29uZmlndXJhdGlvbi1JbmZvcm1hdGlvbi1SZXF1ZXN0IiwJLyogTmFtZSAqLworCQkJCUNNRF9GTEFHX1JFUVVFU1QgfCBDTURfRkxBR19FUlJPUiwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlDTURfRkxBR19SRVFVRVNUIHwgQ01EX0ZMQUdfUFJPWElBQkxFLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJfTsKKworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQ09NTUFORCwgJmRhdGEgLCBhcHBfaWQxNjc3NzM0NSwgJmNtZCkKKwkJfQorCQkvKiBDb25maWd1cmF0aW9uLUluZm9ybWF0aW9uLUFuc3dlciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJCXN0cnVjdCBkaWN0X2NtZF9kYXRhIGRhdGEgPSB7CisJCQkJODM4ODcxOCwJLyogQ29kZSAqLworCQkJCSJDb25maWd1cmF0aW9uLUluZm9ybWF0aW9uLUFuc3dlciIsCS8qIE5hbWUgKi8KKwkJCQlDTURfRkxBR19SRVFVRVNULAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUNNRF9GTEFHX1BST1hJQUJMRSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCX07CisKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0NPTU1BTkQsICZkYXRhICwgYXBwX2lkMTY3NzczNDUsICZjbWQpCisJCX0KKwkJLyogUmVwb3J0aW5nLUluZm9ybWF0aW9uLVJlcXVlc3QgKi8KKwkJeworCQkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCQlzdHJ1Y3QgZGljdF9jbWRfZGF0YSBkYXRhID0geworCQkJCTgzODg3MTksCS8qIENvZGUgKi8KKwkJCQkiUmVwb3J0aW5nLUluZm9ybWF0aW9uLVJlcXVlc3QiLAkvKiBOYW1lICovCisJCQkJQ01EX0ZMQUdfUkVRVUVTVCB8IENNRF9GTEFHX0VSUk9SLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUNNRF9GTEFHX1JFUVVFU1QgfCBDTURfRkxBR19QUk9YSUFCTEUsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQl9OworCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9DT01NQU5ELCAmZGF0YSAsIGFwcF9pZDE2Nzc3MzQ1LCAmY21kKQorCQl9CisJCS8qIFJlcG9ydGluZy1JbmZvcm1hdGlvbi1BbnN3ZXIgKi8KKwkJeworCQkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCQlzdHJ1Y3QgZGljdF9jbWRfZGF0YSBkYXRhID0geworCQkJCTgzODg3MTksCS8qIENvZGUgKi8KKwkJCQkiUmVwb3J0aW5nLUluZm9ybWF0aW9uLUFuc3dlciIsCS8qIE5hbWUgKi8KKwkJCQlDTURfRkxBR19SRVFVRVNULAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUNNRF9GTEFHX1BST1hJQUJMRSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCX07CisKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0NPTU1BTkQsICZkYXRhICwgYXBwX2lkMTY3NzczNDUsICZjbWQpCisJCX0KKwkJLyogTklERC1JbmZvcm1hdGlvbi1SZXF1ZXN0ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQkJc3RydWN0IGRpY3RfY21kX2RhdGEgZGF0YSA9IHsKKwkJCQk4Mzg4NzI2LAkvKiBDb2RlICovCisJCQkJIk5JREQtSW5mb3JtYXRpb24tUmVxdWVzdCIsCS8qIE5hbWUgKi8KKwkJCQlDTURfRkxBR19SRVFVRVNUIHwgQ01EX0ZMQUdfRVJST1IsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQ01EX0ZMQUdfUkVRVUVTVCB8IENNRF9GTEFHX1BST1hJQUJMRSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCX07CisKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0NPTU1BTkQsICZkYXRhICwgYXBwX2lkMTY3NzczNDUsICZjbWQpCisJCX0KKwkJLyogTklERC1JbmZvcm1hdGlvbi1BbnN3ZXIgKi8KKwkJeworCQkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCQlzdHJ1Y3QgZGljdF9jbWRfZGF0YSBkYXRhID0geworCQkJCTgzODg3MjYsCS8qIENvZGUgKi8KKwkJCQkiTklERC1JbmZvcm1hdGlvbi1BbnN3ZXIiLAkvKiBOYW1lICovCisJCQkJQ01EX0ZMQUdfUkVRVUVTVCwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlDTURfRkxBR19QUk9YSUFCTEUsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQl9OworCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9DT01NQU5ELCAmZGF0YSAsIGFwcF9pZDE2Nzc3MzQ1LCAmY21kKQorCQl9CisKKyAgIH0KKworICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGljdF9zNnRfbG9hZF9ydWxlcyhjaGFyICogY29uZmZpbGUpCit7CisgICAvKiBHcm91cGVkIEFWUCBzZWN0aW9uICovCisgICB7CisKKyAgIH0JCisKKyAgIC8qIENvbW1hbmRzIHNlY3Rpb24gKi8KKyAgIHsKKwkgIC8qIENvbmZpZ3VyYXRpb24tSW5mb3JtYXRpb24tUmVxdWVzdCAqLworCSAgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJDb25maWd1cmF0aW9uLUluZm9ybWF0aW9uLVJlcXVlc3QiLCAmY21kKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlNlc3Npb24tSWQifSwgUlVMRV9GSVhFRF9IRUFELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEUk1QIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkF1dGgtU2Vzc2lvbi1TdGF0ZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tSG9zdCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRGVzdGluYXRpb24tSG9zdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEZXN0aW5hdGlvbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVXNlci1JZGVudGlmaWVyIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9DLVN1cHBvcnRlZC1GZWF0dXJlcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU3VwcG9ydGVkLUZlYXR1cmVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNb25pdG9yaW5nLUV2ZW50LUNvbmZpZ3VyYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNJUi1GbGFncyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQUVTRS1Db21tdW5pY2F0aW9uLVBhdHRlcm4ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkVuaGFuY2VkLUNvdmVyYWdlLVJlc3RyaWN0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJHcm91cC1SZXBvcnRpbmctR3VhcmQtVGltZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUHJveHktSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSb3V0ZS1SZWNvcmQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKHJ1bGVzLCBjbWQpOworCSAgfQorCSAgLyogQ29uZmlndXJhdGlvbi1JbmZvcm1hdGlvbi1BbnN3ZXIgKi8KKwkgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX0NPTU1BTkQsIENNRF9CWV9OQU1FLCAiQ29uZmlndXJhdGlvbi1JbmZvcm1hdGlvbi1BbnN3ZXIiLCAmY21kKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlNlc3Npb24tSWQifSwgUlVMRV9GSVhFRF9IRUFELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEUk1QIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJlc3VsdC1Db2RlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkV4cGVyaW1lbnRhbC1SZXN1bHQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQXV0aC1TZXNzaW9uLVN0YXRlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1Ib3N0In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPQy1TdXBwb3J0ZWQtRmVhdHVyZXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT0MtT0xSIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkxvYWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlN1cHBvcnRlZC1GZWF0dXJlcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVXNlci1JZGVudGlmaWVyIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNb25pdG9yaW5nLUV2ZW50LVJlcG9ydCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTW9uaXRvcmluZy1FdmVudC1Db25maWctU3RhdHVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBRVNFLUNvbW11bmljYXRpb24tUGF0dGVybi1Db25maWctU3RhdHVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTdXBwb3J0ZWQtU2VydmljZXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlM2dC1IU1MtQ2F1c2UifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkVuaGFuY2VkLUNvdmVyYWdlLVJlc3RyaWN0aW9uLURhdGEifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNJQS1GbGFncyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJGYWlsZWQtQVZQIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlByb3h5LUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUm91dGUtUmVjb3JkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyhydWxlcywgY21kKTsKKwkgIH0KKwkgIC8qIFJlcG9ydGluZy1JbmZvcm1hdGlvbi1SZXF1ZXN0ICovCisJICB7CisJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIlJlcG9ydGluZy1JbmZvcm1hdGlvbi1SZXF1ZXN0IiwgJmNtZCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTZXNzaW9uLUlkIn0sIFJVTEVfRklYRURfSEVBRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRFJNUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBdXRoLVNlc3Npb24tU3RhdGUifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLUhvc3QifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLVJlYWxtIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRlc3RpbmF0aW9uLUhvc3QifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRGVzdGluYXRpb24tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlN1cHBvcnRlZC1GZWF0dXJlcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVXNlci1JZGVudGlmaWVyIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNb25pdG9yaW5nLUV2ZW50LVJlcG9ydCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiR3JvdXAtTW9uaXRvcmluZy1FdmVudC1SZXBvcnQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJJUi1GbGFncyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU3VwcG9ydGVkLVNlcnZpY2VzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlByb3h5LUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUm91dGUtUmVjb3JkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyhydWxlcywgY21kKTsKKwkgIH0KKwkgIC8qIFJlcG9ydGluZy1JbmZvcm1hdGlvbi1BbnN3ZXIgKi8KKwkgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX0NPTU1BTkQsIENNRF9CWV9OQU1FLCAiUmVwb3J0aW5nLUluZm9ybWF0aW9uLUFuc3dlciIsICZjbWQpCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU2Vzc2lvbi1JZCJ9LCBSVUxFX0ZJWEVEX0hFQUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRSTVAifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUmVzdWx0LUNvZGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRXhwZXJpbWVudGFsLVJlc3VsdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBdXRoLVNlc3Npb24tU3RhdGUifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLUhvc3QifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLVJlYWxtIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTdXBwb3J0ZWQtRmVhdHVyZXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRmFpbGVkLUFWUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJQcm94eS1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJvdXRlLVJlY29yZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMocnVsZXMsIGNtZCk7CisJICB9CisJICAvKiBOSURELUluZm9ybWF0aW9uLVJlcXVlc3QgKi8KKwkgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX0NPTU1BTkQsIENNRF9CWV9OQU1FLCAiTklERC1JbmZvcm1hdGlvbi1SZXF1ZXN0IiwgJmNtZCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTZXNzaW9uLUlkIn0sIFJVTEVfRklYRURfSEVBRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRFJNUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBdXRoLVNlc3Npb24tU3RhdGUifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLUhvc3QifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLVJlYWxtIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRlc3RpbmF0aW9uLUhvc3QifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRGVzdGluYXRpb24tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlVzZXItSWRlbnRpZmllciJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPQy1TdXBwb3J0ZWQtRmVhdHVyZXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlN1cHBvcnRlZC1GZWF0dXJlcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTklERC1BdXRob3JpemF0aW9uLVJlcXVlc3QifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk5JREQtQXV0aG9yaXphdGlvbi1VcGRhdGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUHJveHktSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSb3V0ZS1SZWNvcmQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKHJ1bGVzLCBjbWQpOworCSAgfQorCSAgLyogTklERC1JbmZvcm1hdGlvbi1BbnN3ZXIgKi8KKwkgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX0NPTU1BTkQsIENNRF9CWV9OQU1FLCAiTklERC1JbmZvcm1hdGlvbi1BbnN3ZXIiLCAmY21kKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlNlc3Npb24tSWQifSwgUlVMRV9GSVhFRF9IRUFELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEUk1QIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJlc3VsdC1Db2RlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkV4cGVyaW1lbnRhbC1SZXN1bHQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQXV0aC1TZXNzaW9uLVN0YXRlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1Ib3N0In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPQy1TdXBwb3J0ZWQtRmVhdHVyZXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT0MtT0xSIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkxvYWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlN1cHBvcnRlZC1GZWF0dXJlcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVXNlci1JZGVudGlmaWVyIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJOSURELUF1dGhvcml6YXRpb24tUmVzcG9uc2UifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRmFpbGVkLUFWUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJQcm94eS1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJvdXRlLVJlY29yZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMocnVsZXMsIGNtZCk7CisJICB9CisKKyAgIH0KKworICAgTE9HX0QoICJFeHRlbnNpb24gJ0RpY3Rpb25hcnkgZGVmaW5pdGlvbnMgZm9yIFM2dCAoZTEwKScgaW5pdGlhbGl6ZWQiKTsKKyAgIHJldHVybiAwOworfQorCitpbnQgZGljdF9lbnRyeShjaGFyICogY29uZmZpbGUpCit7CisJZGljdF9zNnRfbG9hZF9kZWZzKGNvbmZmaWxlKTsKKwlyZXR1cm4gZGljdF9zNnRfbG9hZF9ydWxlcyhjb25mZmlsZSk7Cit9CisKK2NvbnN0IGNoYXIqIGRpY3RfcHJvdG9fdmVyKGNoYXIgKiBjb25mZmlsZSkgeworCXJldHVybiBzNnRfcHJvdG9fdmVyOworfQorCitjb25zdCBkb3VibGUgZGljdF9nZW5fdHMoY2hhciAqIGNvbmZmaWxlKSB7CisJcmV0dXJuIHM2dF9nZW5fZGF0ZTsKK30KKworRVhURU5TSU9OX0VOVFJZMigiZGljdF9zNnQiLCBkaWN0X3M2dF9sb2FkX2RlZnMsIGRpY3RfczZ0X2xvYWRfcnVsZXMsICJkaWN0X3RzMzIyOTlfYXZwcyIsICJkaWN0X3RzMjkzMzZfYXZwcyIsICJkaWN0X3RzMjkyNzJfYXZwcyIsICJkaWN0X3RzMjkzMzhfYXZwcyIsICJkaWN0X3RzMjkzNjhfYXZwcyIsICJkaWN0X3RzMjkzMjlfYXZwcyIsICJkaWN0X3RzMjkyMjlfYXZwcyIsICJkaWN0X3RzMjkyMTdfYXZwcyIsICJkaWN0X3RzMjkxNzNfYXZwcyIsICJkaWN0X3JmYzU3NzhfYXZwcyIsICJkaWN0X2RyYWZ0bG9hZF9hdnBzIiwgImRpY3RfcmZjNzY4M19hdnBzIiwgImRpY3RfcmZjNTc3N19hdnBzIiwgImRpY3RfcmZjNzk0NF9hdnBzIik7CisKKworCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfUzkvQ01ha2VMaXN0cy50eHQgYi9leHRlbnNpb25zL2RpY3RfUzkvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY1MjRkZQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF9TOS9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDE2IEBACisjIFRoZSBkaWN0X1M5IGV4dGVuc2lvbgorUFJPSkVDVCgiZGljdF9TOSBsaWJyYXJ5IGdlbmVyYXRlZCBieSBGZEdlbiAiIEMpCisKKyMgQ29tcGlsZSBhcyBhIG1vZHVsZQorRkRfQUREX0VYVEVOU0lPTihkaWN0X1M5IGRpY3RfUzkuYykKKworCisjIyMjCisjIyBJTlNUQUxMIHNlY3Rpb24gIyMKKworSU5TVEFMTChUQVJHRVRTIGRpY3RfUzkKKwlMSUJSQVJZIERFU1RJTkFUSU9OICR7SU5TVEFMTF9FWFRFTlNJT05TX1NVRkZJWH0KK0NPTVBPTkVOVCBmcmVlRGlhbWV0ZXItZGljdGlvbmFyeS1TOSkKKworCisKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF9TOS9TOS5kaWQgYi9leHRlbnNpb25zL2RpY3RfUzkvUzkuZGlkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ZjY5ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfUzkvUzkuZGlkCkBAIC0wLDAgKzEsMzggQEAKK2RpY3RfcmZjNjk0Ml9hdnBzCitkaWN0X3JmYzY3MzRfYXZwcworZGljdF9yZmM1NTgwX2F2cHMKK2RpY3RfdHMyOTQ2OF9hdnBzCitkaWN0X3RzMjkxNTRfYXZwcworZGljdF90czI5MjE0X2F2cHMKK2RpY3RfdHMyOTIxNV9hdnBzCitkaWN0X3RzMjkyMTdfYXZwcworZGljdF8zZ3BwMl9hdnBzCitkaWN0X3RzMjkzNDNfYXZwcworZGljdF90czI5MTI4X2F2cHMKK2RpY3RfdHMyOTM0NF9hdnBzCitkaWN0X3RzMjkzNDVfYXZwcworZGljdF90czMyMjk5X2F2cHMKK2RpY3RfcmZjNTc3OF9hdnBzCitkaWN0X3RzMjkzMzhfYXZwcworZGljdF90czI5MTczX2F2cHMKK2RpY3RfdHMyOTMzN19hdnBzCitkaWN0X2V0c2kyODMwMzRfYXZwcworZGljdF9yZmM0NTkwX2F2cHMKK2RpY3RfdHMyOTIyOV9hdnBzCitkaWN0X2RyYWZ0bG9hZF9hdnBzCitkaWN0X3RzMjkzMjlfYXZwcworZGljdF90czI5MzY4X2F2cHMKK2RpY3RfdHMyOTMzNl9hdnBzCitkaWN0X3RzMjkwNjFfYXZwcworZGljdF90czI5MjcyX2F2cHMKK2RpY3RfcmZjNzY4M19hdnBzCitkaWN0X3JmYzU3NzdfYXZwcworZGljdF9yZmM0MDA2YmlzX2F2cHMKK2RpY3RfdHMyOTIxMl9hdnBzCitkaWN0X3JmYzQwNzJfYXZwcworZGljdF9yZmM1NDQ3X2F2cHMKK2RpY3RfdHMyOTI3M19hdnBzCitkaWN0X3JmYzQwMDRfYXZwcworZGljdF9yZmM3MTU1X2F2cHMKK2RpY3RfcmZjNzk0NF9hdnBzCitkaWN0X1M5CmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfUzkvZGljdF9TOS5jIGIvZXh0ZW5zaW9ucy9kaWN0X1M5L2RpY3RfUzkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTkzYzhjCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kaWN0X1M5L2RpY3RfUzkuYwpAQCAtMCwwICsxLDQ3MSBAQAorLyoKKyogQ29weXJpZ2h0IChjKSAyMDE3IFNwcmludAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvKioqKioqKioqKioqKioqKgorIEdlbmVyYXRlZCBCeTogZmR0b29sIGVuaGFuY2VtZW50cyB0byBkaWFmdXp6ZXIKKyBMaWNlbnNlOiBzYW1lIGFzIGZyZWVEaWFtZXRlcgorKioqKioqKioqKioqKioqKi8KKworCisvKiAKKyAqIERpY3Rpb25hcnkgZGVmaW5pdGlvbnMgb2Ygb2JqZWN0cyBzcGVjaWZpZWQgaW4gUzkgKGUxMCkuCisgKi8KKyNpbmNsdWRlIDxmcmVlRGlhbWV0ZXIvZXh0ZW5zaW9uLmg+CisKKyNkZWZpbmUgUFJPVE9fVkVSICJlMTAiCisjZGVmaW5lIEdFTl9EQVRFICAxNTA2Njk3MTE3LjU3CisKK2NvbnN0IGNoYXIgKnM5X3Byb3RvX3ZlciA9IFBST1RPX1ZFUjsKK2NvbnN0IGRvdWJsZSBzOV9nZW5fZGF0ZSA9IEdFTl9EQVRFOworCisvKiBUaGUgY29udGVudCBvZiB0aGlzIGZpbGUgZm9sbG93cyB0aGUgc2FtZSBzdHJ1Y3R1cmUgYXMgZGljdF9iYXNlX3Byb3RvLmMgKi8KKworI2RlZmluZSBDSEVDS19kaWN0X25ldyggX3R5cGUsIF9kYXRhLCBfcGFyZW50LCBfcmVmICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBfcmV0ID0gZmRfZGljdF9uZXcoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgKF90eXBlKSwgKF9kYXRhKSwgKF9wYXJlbnQpLCAoX3JlZikgKTsgXAorICAgIGlmICggX3JldCAhPSAwICYmIF9yZXQgIT0gRUVYSVNUICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHJldHVybiBfcmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIENIRUNLX2RpY3Rfc2VhcmNoKCBfdHlwZSwgX2NyaXRlcmlhLCBfd2hhdCwgX3Jlc3VsdCApCQlcCisgICAgQ0hFQ0tfRkNUKCAgZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgKF90eXBlKSwgKF9jcml0ZXJpYSksIChfd2hhdCksIChfcmVzdWx0KSwgRU5PRU5UKSApOworCitzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiB7CisgICAgc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWU7CisgICAgZW51bSBydWxlX3Bvc2l0aW9uCXBvc2l0aW9uOworICAgIGludCAJCQltaW47CisgICAgaW50CQkJbWF4OworfTsKKworI2RlZmluZSBSVUxFX09SREVSKCBfcG9zaXRpb24gKSAoKCgoX3Bvc2l0aW9uKSA9PSBSVUxFX0ZJWEVEX0hFQUQpIHx8ICgoX3Bvc2l0aW9uKSA9PSBSVUxFX0ZJWEVEX1RBSUwpKSA/IDEgOiAwICkKKworLyogQXR0ZW50aW9uISBUaGlzIHZlcnNpb24gb2YgdGhlIG1hY3JvIHVzZXMgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgaW4gY29udHJhc3QgdG8gbW9zdCBvdGhlciBjb3BpZXMhICovCisjZGVmaW5lIFBBUlNFX2xvY19ydWxlcyggX3J1bGVhcnJheSwgX3BhcmVudCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IF9fYXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKF9fYXI9MDsgX19hciA8IHNpemVvZihfcnVsZWFycmF5KSAvIHNpemVvZigoX3J1bGVhcnJheSlbMF0pOyBfX2FyKyspIHsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgc3RydWN0IGRpY3RfcnVsZV9kYXRhIF9fZGF0YSA9IHsgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5wb3NpdGlvbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ubWluLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5tYXh9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIF9fZGF0YS5ydWxlX29yZGVyID0gUlVMRV9PUkRFUihfX2RhdGEucnVsZV9wb3NpdGlvbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgQ0hFQ0tfRkNUKCAgZmRfZGljdF9zZWFyY2goICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgRElDVF9BVlAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICYoX3J1bGVhcnJheSlbX19hcl0uYXZwX3ZlbmRvcl9wbHVzX25hbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgJl9fZGF0YS5ydWxlX2F2cCwgMCApICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYgKCAhX19kYXRhLnJ1bGVfYXZwICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFX0RFQlVHKElORk8sICJBVlAgTm90IGZvdW5kOiAnJXMnIiwgKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLmF2cF9uYW1lKTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVOT0VOVDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBfcmV0ID0gZmRfZGljdF9uZXcoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9SVUxFLCAmKF9fZGF0YSksIChfcGFyZW50KSwgTlVMTCApOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBfcmV0ICE9IDAgJiYgX3JldCAhPSBFRVhJU1QgKSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfREVCVUcoSU5GTywgIkVycm9yIG9uIHJ1bGUgd2l0aCBBVlAgJyVzJyIsICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0uYXZwX3ZlbmRvcl9wbHVzX25hbWUuYXZwX25hbWUpOyAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFSU5WQUw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBDSEVDS192ZW5kb3JfbmV3KCBfZGF0YSApIHsgXAorICAgICAgICBzdHJ1Y3QgZGljdF9vYmplY3QgKiB2ZW5kb3JfZm91bmQ7IFwKKyAgICAgICAgaWYgKGZkX2RpY3Rfc2VhcmNoKGZkX2dfY29uZmlnLT5jbmZfZGljdCxESUNUX1ZFTkRPUixWRU5ET1JfQllfSUQsJl9kYXRhLnZlbmRvcl9pZCwmdmVuZG9yX2ZvdW5kLEVOT0VOVCkgPT0gRU5PRU5UKSB7IFwKKyAgICAgICAgICAgICAgICBDSEVDS19GQ1QoZmRfZGljdF9uZXcoZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1ZFTkRPUiwgJl9kYXRhLCBOVUxMLCBOVUxMKSk7IFwKKyAgICAgICAgfSBcCit9CisKKyNkZWZpbmUgZW51bXZhbF9kZWZfdTMyKCBfdmFsXywgX3N0cl8gKQkJXAorICAgIHsgX3N0cl8sIAkJeyAudTMyID0gX3ZhbF8gfX0KKworI2RlZmluZSBlbnVtdmFsX2RlZl9vcyggX2xlbl8sIF92YWxfLCBfc3RyXyApCQkJCVwKKyAgICB7IF9zdHJfLCAJCXsgLm9zID0geyAuZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopX3ZhbF8sIC5sZW4gPSBfbGVuXyB9fX0KKworCitzdGF0aWMgaW50IGRpY3RfczlfbG9hZF9kZWZzKGNoYXIgKiBjb25mZmlsZSkKK3sKKyAgIFRSQUNFX0VOVFJZKCIlcCIsIGNvbmZmaWxlKTsKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhcHBfaWQxNjc3NzI2NzsKKworCS8qIEFwcGxpY2F0aW9uIFNlY3Rpb24gKi8KKwl7CisJICB7CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiB2ZW5kb3I7CisJCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX1ZFTkRPUiwgVkVORE9SX0JZX05BTUUsICIzR1BQIiwgJnZlbmRvcikKKwkJCXN0cnVjdCBkaWN0X2FwcGxpY2F0aW9uX2RhdGEgZGF0YSA9IHsgMTY3NzcyNjcsICJTOSIgfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FQUExJQ0FUSU9OLCAmZGF0YSwgdmVuZG9yLCAmYXBwX2lkMTY3NzcyNjcpCisJICB9CisJICAvKiBSZXN1bHQgY29kZXMgKi8KKwkgIHsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqdHlwZTsKKwkJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiRW51bWVyYXRlZChSZXN1bHQtQ29kZSkiLCZ0eXBlKTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiRElBTUVURVJfVVNFUl9VTktOT1dOIiwgeyAudTMyPTUwMzAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIkRJQU1FVEVSX0VSUk9SX0xBVEVfT1ZFUkxBUFBJTkdfUkVRVUVTVCIsIHsgLnUzMj01NDUzIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMgPSB7ICJESUFNRVRFUl9FUlJPUl9USU1FRF9PVVRfUkVRVUVTVCIsIHsgLnUzMj01NDU0IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzQgPSB7ICJESUFNRVRFUl9FUlJPUl9JTklUSUFMX1BBUkFNRVRFUlMiLCB7IC51MzI9NTE0MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF81ID0geyAiRElBTUVURVJfRVJST1JfVFJJR0dFUl9FVkVOVCIsIHsgLnUzMj01MTQxIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzYgPSB7ICJESUFNRVRFUl9QQ0NfUlVMRV9FVkVOVCIsIHsgLnUzMj01MTQyIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzcgPSB7ICJESUFNRVRFUl9FUlJPUl9CRUFSRVJfTk9UX0FVVEhPUklaRUQiLCB7IC51MzI9NTE0MyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF84ID0geyAiRElBTUVURVJfRVJST1JfVFJBRkZJQ19NQVBQSU5HX0lORk9fUkVKRUNURUQiLCB7IC51MzI9NTE0NCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF85ID0geyAiRElBTUVURVJfRVJST1JfQ09ORkxJQ1RJTkdfUkVRVUVTVCIsIHsgLnUzMj01MTQ3IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEwID0geyAiRElBTUVURVJfQURDX1JVTEVfRVZFTlQiLCB7IC51MzI9NTE0OCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xMSA9IHsgIkRJQU1FVEVSX0VSUk9SX05CSUZPTV9OT1RfQVVUSE9SSVpFRCIsIHsgLnUzMj01MTQ5IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEyID0geyAiRElBTUVURVJfRVJST1JfU1VCU0VTU0lPTiIsIHsgLnUzMj01NDcwIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEzID0geyAiRElBTUVURVJfRVJST1JfT05HT0lOR19TRVNTSU9OX0VTVEFCTElTSE1FTlQiLCB7IC51MzI9NTQ3MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xNCA9IHsgIkRJQU1FVEVSX1BDQ19CRUFSRVJfRVZFTlQiLCB7IC51MzI9NDE0MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xNSA9IHsgIkRJQU1FVEVSX0FOX0dXX0ZBSUxFRCIsIHsgLnUzMj00MTQzIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzE2ID0geyAiRElBTUVURVJfUEVORElOR19UUkFOU0FDVElPTiIsIHsgLnUzMj00MTQ0IH19OworCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF80LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzUsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF83LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzgsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfOSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xNCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xNSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xNiwgdHlwZSwgTlVMTCk7CisKKwkgIH0KKwl9CisKKworICAgLyogQVZQIHNlY3Rpb24gKi8KKyAgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogQWRkcmVzc190eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBVVEY4U3RyaW5nX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIERpYW1ldGVySWRlbnRpdHlfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogRGlhbWV0ZXJVUklfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogVGltZV90eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBJUEZpbHRlclJ1bGVfdHlwZTsKKworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJBZGRyZXNzIiwgJkFkZHJlc3NfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIlVURjhTdHJpbmciLCAmVVRGOFN0cmluZ190eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiRGlhbWV0ZXJJZGVudGl0eSIsICZEaWFtZXRlcklkZW50aXR5X3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJEaWFtZXRlclVSSSIsICZEaWFtZXRlclVSSV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiVGltZSIsICZUaW1lX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJJUEZpbHRlclJ1bGUiLCAmSVBGaWx0ZXJSdWxlX3R5cGUpOworCisJCisgICB9CisKKyAgIC8qIENvbW1hbmRzIHNlY3Rpb24gKi8KKyAgIHsKKwkJLyogUmUtQXV0aG9yaXphdGlvbi1SZXF1ZXN0ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQkJc3RydWN0IGRpY3RfY21kX2RhdGEgZGF0YSA9IHsKKwkJCQkyNTgsCS8qIENvZGUgKi8KKwkJCQkiUmUtQXV0aG9yaXphdGlvbi1SZXF1ZXN0IiwJLyogTmFtZSAqLworCQkJCUNNRF9GTEFHX1JFUVVFU1QgfCBDTURfRkxBR19FUlJPUiwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlDTURfRkxBR19SRVFVRVNUIHwgQ01EX0ZMQUdfUFJPWElBQkxFLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJfTsKKworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQ09NTUFORCwgJmRhdGEgLCBhcHBfaWQxNjc3NzI2NywgJmNtZCkKKwkJfQorCQkvKiBSZS1BdXRob3JpemF0aW9uLUFuc3dlciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJCXN0cnVjdCBkaWN0X2NtZF9kYXRhIGRhdGEgPSB7CisJCQkJMjU4LAkvKiBDb2RlICovCisJCQkJIlJlLUF1dGhvcml6YXRpb24tQW5zd2VyIiwJLyogTmFtZSAqLworCQkJCUNNRF9GTEFHX1JFUVVFU1QsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQ01EX0ZMQUdfUFJPWElBQkxFLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJfTsKKworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQ09NTUFORCwgJmRhdGEgLCBhcHBfaWQxNjc3NzI2NywgJmNtZCkKKwkJfQorCQkvKiBUcmlnZ2VyLUVzdGFibGlzaG1lbnQtUmVxdWVzdCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJCXN0cnVjdCBkaWN0X2NtZF9kYXRhIGRhdGEgPSB7CisJCQkJODM4ODY1NiwJLyogQ29kZSAqLworCQkJCSJUcmlnZ2VyLUVzdGFibGlzaG1lbnQtUmVxdWVzdCIsCS8qIE5hbWUgKi8KKwkJCQlDTURfRkxBR19SRVFVRVNUIHwgQ01EX0ZMQUdfRVJST1IsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQ01EX0ZMQUdfUkVRVUVTVCB8IENNRF9GTEFHX1BST1hJQUJMRSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCX07CisKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0NPTU1BTkQsICZkYXRhICwgYXBwX2lkMTY3NzcyNjcsICZjbWQpCisJCX0KKwkJLyogVHJpZ2dlci1Fc3RhYmxpc2htZW50LUFuc3dlciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJCXN0cnVjdCBkaWN0X2NtZF9kYXRhIGRhdGEgPSB7CisJCQkJODM4ODY1NiwJLyogQ29kZSAqLworCQkJCSJUcmlnZ2VyLUVzdGFibGlzaG1lbnQtQW5zd2VyIiwJLyogTmFtZSAqLworCQkJCUNNRF9GTEFHX1JFUVVFU1QsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQ01EX0ZMQUdfUFJPWElBQkxFLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJfTsKKworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQ09NTUFORCwgJmRhdGEgLCBhcHBfaWQxNjc3NzI2NywgJmNtZCkKKwkJfQorCisgICB9CisKKyAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRpY3RfczlfbG9hZF9ydWxlcyhjaGFyICogY29uZmZpbGUpCit7CisgICAvKiBHcm91cGVkIEFWUCBzZWN0aW9uICovCisgICB7CisKKyAgIH0JCisKKyAgIC8qIENvbW1hbmRzIHNlY3Rpb24gKi8KKyAgIHsKKwkgIC8qIENDLVJlcXVlc3QgKi8KKwkgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX0NPTU1BTkQsIENNRF9CWV9OQU1FLCAiQ0MtUmVxdWVzdCIsICZjbWQpCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU2Vzc2lvbi1JZCJ9LCBSVUxFX0ZJWEVEX0hFQUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRSTVAifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQXV0aC1BcHBsaWNhdGlvbi1JZCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tSG9zdCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRGVzdGluYXRpb24tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQ0MtUmVxdWVzdC1UeXBlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkNDLVJlcXVlc3QtTnVtYmVyIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRlc3RpbmF0aW9uLUhvc3QifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLVN0YXRlLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlN1YnNjcmlwdGlvbi1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJGcmFtZWQtSVAtQWRkcmVzcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJGcmFtZWQtSVB2Ni1QcmVmaXgifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlN1cHBvcnRlZC1GZWF0dXJlcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPQy1TdXBwb3J0ZWQtRmVhdHVyZXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlFvUy1JbmZvcm1hdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUW9TLVJ1bGUtUmVwb3J0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBTi1HVy1BZGRyZXNzIn0sIFJVTEVfT1BUSU9OQUwsIDAsIDIgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTmV0d29yay1SZXF1ZXN0LVN1cHBvcnQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlBhY2tldC1GaWx0ZXItSW5mb3JtYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlBhY2tldC1GaWx0ZXItT3BlcmF0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTdWJzZXNzaW9uLUVuZm9yY2VtZW50LUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIklQLUNBTi1UeXBlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJSQVQtVHlwZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJUZXJtaW5hdGlvbi1DYXVzZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJVc2VyLUVxdWlwbWVudC1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJRb1MtTmVnb3RpYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlFvUy1VcGdyYWRlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICIzR1BQLVNHU04tTUNDLU1OQyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiM0dQUC1TR1NOLUFkZHJlc3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIjNHUFAtU0dTTi1JcHY2LUFkZHJlc3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJBSSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiM0dQUC1Vc2VyLUxvY2F0aW9uLUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIjNHUFAtTVMtVGltZVpvbmUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSA1NTM1LCAuYXZwX25hbWUgPSAiM0dQUDItQlNJRCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRXZlbnQtVHJpZ2dlciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTXVsdGlwbGUtQkJFUkYtQWN0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJVc2VyLUNTRy1JbmZvcm1hdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJQcm94eS1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJvdXRlLVJlY29yZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMocnVsZXMsIGNtZCk7CisJICB9CisJICAvKiBDQy1BbnN3ZXIgKi8KKwkgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX0NPTU1BTkQsIENNRF9CWV9OQU1FLCAiQ0MtQW5zd2VyIiwgJmNtZCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTZXNzaW9uLUlkIn0sIFJVTEVfRklYRURfSEVBRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRFJNUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBdXRoLUFwcGxpY2F0aW9uLUlkIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1Ib3N0In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSZXN1bHQtQ29kZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJFeHBlcmltZW50YWwtUmVzdWx0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkNDLVJlcXVlc3QtVHlwZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJDQy1SZXF1ZXN0LU51bWJlciJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU3VwcG9ydGVkLUZlYXR1cmVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9DLVN1cHBvcnRlZC1GZWF0dXJlcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPQy1PTFIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlFvUy1SdWxlLUluc3RhbGwifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlFvUy1SdWxlLVJlbW92ZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUW9TLUluZm9ybWF0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJCZWFyZXItQ29udHJvbC1Nb2RlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJFdmVudC1UcmlnZ2VyIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDaGFyZ2luZy1JbmZvcm1hdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU3Vic2Vzc2lvbi1EZWNpc2lvbi1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDU0ctSW5mb3JtYXRpb24tUmVwb3J0aW5nIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBTi1HVy1BZGRyZXNzIn0sIFJVTEVfT1BUSU9OQUwsIDAsIDIgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tU3RhdGUtSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRXJyb3ItTWVzc2FnZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJFcnJvci1SZXBvcnRpbmctSG9zdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJGYWlsZWQtQVZQIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlByb3h5LUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUm91dGUtUmVjb3JkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkxvYWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKHJ1bGVzLCBjbWQpOworCSAgfQorCSAgLyogUmUtQXV0aG9yaXphdGlvbi1SZXF1ZXN0ICovCisJICB7CisJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIlJlLUF1dGhvcml6YXRpb24tUmVxdWVzdCIsICZjbWQpCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU2Vzc2lvbi1JZCJ9LCBSVUxFX0ZJWEVEX0hFQUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRSTVAifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQXV0aC1BcHBsaWNhdGlvbi1JZCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tSG9zdCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRGVzdGluYXRpb24tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRGVzdGluYXRpb24tSG9zdCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSZS1BdXRoLVJlcXVlc3QtVHlwZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tU3RhdGUtSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT0MtU3VwcG9ydGVkLUZlYXR1cmVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJRb1MtUnVsZS1JbnN0YWxsIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJRb1MtUnVsZS1SZW1vdmUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlFvUy1JbmZvcm1hdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRXZlbnQtVHJpZ2dlciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU3Vic2Vzc2lvbi1EZWNpc2lvbi1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBTi1HVy1BZGRyZXNzIn0sIFJVTEVfT1BUSU9OQUwsIDAsIDIgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU2Vzc2lvbi1SZWxlYXNlLUNhdXNlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJIZU5CLUxvY2FsLUlQLUFkZHJlc3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlVFLUxvY2FsLUlQLUFkZHJlc3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlVEUC1Tb3VyY2UtUG9ydCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJQcm94eS1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkNhbGxlZC1TdGF0aW9uLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJvdXRlLVJlY29yZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMocnVsZXMsIGNtZCk7CisJICB9CisJICAvKiBSZS1BdXRob3JpemF0aW9uLUFuc3dlciAqLworCSAgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJSZS1BdXRob3JpemF0aW9uLUFuc3dlciIsICZjbWQpCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU2Vzc2lvbi1JZCJ9LCBSVUxFX0ZJWEVEX0hFQUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRSTVAifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLUhvc3QifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLVJlYWxtIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJlc3VsdC1Db2RlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkV4cGVyaW1lbnRhbC1SZXN1bHQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLVN0YXRlLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkZyYW1lZC1JUC1BZGRyZXNzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkZyYW1lZC1JUHY2LVByZWZpeCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiSVAtQ0FOLVR5cGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJBVC1UeXBlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICIzR1BQLVNHU04tTUNDLU1OQyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiM0dQUC1TR1NOLUFkZHJlc3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIjNHUFAtU0dTTi1JcHY2LUFkZHJlc3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJBSSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiM0dQUC1Vc2VyLUxvY2F0aW9uLUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIjNHUFAtTVMtVGltZVpvbmUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSA1NTM1LCAuYXZwX25hbWUgPSAiM0dQUDItQlNJRCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPQy1TdXBwb3J0ZWQtRmVhdHVyZXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT0MtT0xSIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJRb1MtSW5mb3JtYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlFvUy1SdWxlLVJlcG9ydCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQU4tR1ctQWRkcmVzcyJ9LCBSVUxFX09QVElPTkFMLCAwLCAyIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlN1YnNlc3Npb24tRW5mb3JjZW1lbnQtSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVXNlci1DU0ctSW5mb3JtYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRXJyb3ItTWVzc2FnZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJFcnJvci1SZXBvcnRpbmctSG9zdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJGYWlsZWQtQVZQIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlByb3h5LUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiTG9hZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMocnVsZXMsIGNtZCk7CisJICB9CisJICAvKiBUcmlnZ2VyLUVzdGFibGlzaG1lbnQtUmVxdWVzdCAqLworCSAgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJUcmlnZ2VyLUVzdGFibGlzaG1lbnQtUmVxdWVzdCIsICZjbWQpCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU2Vzc2lvbi1JZCJ9LCBSVUxFX0ZJWEVEX0hFQUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRSTVAifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQXV0aC1BcHBsaWNhdGlvbi1JZCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tSG9zdCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRGVzdGluYXRpb24tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRGVzdGluYXRpb24tSG9zdCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBdXRoLVNlc3Npb24tU3RhdGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLVN0YXRlLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlN1YnNjcmlwdGlvbi1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPQy1TdXBwb3J0ZWQtRmVhdHVyZXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQ2FsbGVkLVN0YXRpb24tSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlVFLUxvY2FsLUlQLUFkZHJlc3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkhlTkItTG9jYWwtSVAtQWRkcmVzcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRFJBLUJpbmRpbmcifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlVEUC1Tb3VyY2UtUG9ydCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJQcm94eS1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJvdXRlLVJlY29yZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMocnVsZXMsIGNtZCk7CisJICB9CisJICAvKiBUcmlnZ2VyLUVzdGFibGlzaG1lbnQtQW5zd2VyICovCisJICB7CisJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIlRyaWdnZXItRXN0YWJsaXNobWVudC1BbnN3ZXIiLCAmY21kKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlNlc3Npb24tSWQifSwgUlVMRV9GSVhFRF9IRUFELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEUk1QIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1Ib3N0In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSZXN1bHQtQ29kZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJFeHBlcmltZW50YWwtUmVzdWx0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1TdGF0ZS1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRFJBLURlcGxveW1lbnQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT0MtU3VwcG9ydGVkLUZlYXR1cmVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9DLU9MUiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJFcnJvci1NZXNzYWdlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkVycm9yLVJlcG9ydGluZy1Ib3N0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkZhaWxlZC1BVlAifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUHJveHktSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJMb2FkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyhydWxlcywgY21kKTsKKwkgIH0KKworICAgfQorCisgICBMT0dfRCggIkV4dGVuc2lvbiAnRGljdGlvbmFyeSBkZWZpbml0aW9ucyBmb3IgUzkgKGUxMCknIGluaXRpYWxpemVkIik7CisgICByZXR1cm4gMDsKK30KKworaW50IGRpY3RfZW50cnkoY2hhciAqIGNvbmZmaWxlKQoreworCWRpY3RfczlfbG9hZF9kZWZzKGNvbmZmaWxlKTsKKwlyZXR1cm4gZGljdF9zOV9sb2FkX3J1bGVzKGNvbmZmaWxlKTsKK30KKworY29uc3QgY2hhciogZGljdF9zOV9wcm90b192ZXIoY2hhciAqIGNvbmZmaWxlKSB7CisJcmV0dXJuIHM5X3Byb3RvX3ZlcjsKK30KKworY29uc3QgZG91YmxlIGRpY3RfczlfZ2VuX3RzKGNoYXIgKiBjb25mZmlsZSkgeworCXJldHVybiBzOV9nZW5fZGF0ZTsKK30KKworRVhURU5TSU9OX0VOVFJZMigiZGljdF9zOSIsIGRpY3RfczlfbG9hZF9kZWZzLCBkaWN0X3M5X2xvYWRfcnVsZXMsICJkaWN0X3RzMzIyOTlfYXZwcyIsICJkaWN0X3RzMjkyMTJfYXZwcyIsICJkaWN0X3RzMjkyMTVfYXZwcyIsICJkaWN0X3RzMjkyNzNfYXZwcyIsICJkaWN0X3RzMjkyMTRfYXZwcyIsICJkaWN0X3RzMjkyNzJfYXZwcyIsICJkaWN0X3RzMjkyMjlfYXZwcyIsICJkaWN0X3RzMjkwNjFfYXZwcyIsICJkaWN0X3JmYzQwMDZiaXNfYXZwcyIsICJkaWN0X2RyYWZ0bG9hZF9hdnBzIiwgImRpY3RfcmZjNzY4M19hdnBzIiwgImRpY3RfcmZjNzE1NV9hdnBzIiwgImRpY3RfZXRzaTI4MzAzNF9hdnBzIiwgImRpY3RfM2dwcDJfYXZwcyIsICJkaWN0X3JmYzc5NDRfYXZwcyIpOworCisKKwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X1NHZC9DTWFrZUxpc3RzLnR4dCBiL2V4dGVuc2lvbnMvZGljdF9TR2QvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JjNTkwMQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF9TR2QvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxNiBAQAorIyBUaGUgZGljdF9TR2QgZXh0ZW5zaW9uCitQUk9KRUNUKCJkaWN0X1NHZCBsaWJyYXJ5IGdlbmVyYXRlZCBieSBGZEdlbiAiIEMpCisKKyMgQ29tcGlsZSBhcyBhIG1vZHVsZQorRkRfQUREX0VYVEVOU0lPTihkaWN0X1NHZCBkaWN0X1NHZC5jKQorCisKKyMjIyMKKyMjIElOU1RBTEwgc2VjdGlvbiAjIworCitJTlNUQUxMKFRBUkdFVFMgZGljdF9TR2QKKwlMSUJSQVJZIERFU1RJTkFUSU9OICR7SU5TVEFMTF9FWFRFTlNJT05TX1NVRkZJWH0KK0NPTVBPTkVOVCBmcmVlRGlhbWV0ZXItZGljdGlvbmFyeS1TR0QpCisKKworCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfU0dkL1NHZC5kaWQgYi9leHRlbnNpb25zL2RpY3RfU0dkL1NHZC5kaWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZmZGRlNgotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF9TR2QvU0dkLmRpZApAQCAtMCwwICsxLDM5IEBACitkaWN0X1M2YworZGljdF9yZmM2OTQyX2F2cHMKK2RpY3RfdHMyOTQ2OF9hdnBzCitkaWN0X3RzMjkxNTRfYXZwcworZGljdF90czI5MjE0X2F2cHMKK2RpY3RfdHMyOTIxNV9hdnBzCitkaWN0X3RzMjkyMTdfYXZwcworZGljdF8zZ3BwMl9hdnBzCitkaWN0X3RzMjkzNDNfYXZwcworZGljdF90czI5MzM4X2F2cHMKK2RpY3RfdHMyOTEyOF9hdnBzCitkaWN0X3RzMjkzNDRfYXZwcworZGljdF90czI5MzQ1X2F2cHMKK2RpY3RfdHMzMjI5OV9hdnBzCitkaWN0X3JmYzY3MzRfYXZwcworZGljdF9yZmM1Nzc4X2F2cHMKK2RpY3RfcmZjNTU4MF9hdnBzCitkaWN0X3JmYzQwNzJfYXZwcworZGljdF90czI5MjczX2F2cHMKK2RpY3RfcmZjNTc3N19hdnBzCitkaWN0X3JmYzQwMDZiaXNfYXZwcworZGljdF90czI5MjEyX2F2cHMKK2RpY3RfdHMyOTA2MV9hdnBzCitkaWN0X3JmYzU0NDdfYXZwcworZGljdF90czI5MjcyX2F2cHMKK2RpY3RfdHMyOTE3M19hdnBzCitkaWN0X3RzMjkzMzdfYXZwcworZGljdF9ldHNpMjgzMDM0X2F2cHMKK2RpY3RfcmZjNDU5MF9hdnBzCitkaWN0X3JmYzQwMDRfYXZwcworZGljdF9yZmM3MTU1X2F2cHMKK2RpY3RfdHMyOTIyOV9hdnBzCitkaWN0X3JmYzc2ODNfYXZwcworZGljdF9kcmFmdGxvYWRfYXZwcworZGljdF90czI5MzI5X2F2cHMKK2RpY3RfdHMyOTM2OF9hdnBzCitkaWN0X3RzMjkzMzZfYXZwcworZGljdF9yZmM3OTQ0X2F2cHMKK2RpY3RfU0dkCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfU0dkL2RpY3RfU0dkLmMgYi9leHRlbnNpb25zL2RpY3RfU0dkL2RpY3RfU0dkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc5MjhhZAotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF9TR2QvZGljdF9TR2QuYwpAQCAtMCwwICsxLDM4NSBAQAorLyoKKyogQ29weXJpZ2h0IChjKSAyMDE3IFNwcmludAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvKioqKioqKioqKioqKioqKgorIEdlbmVyYXRlZCBCeTogZmR0b29sIGVuaGFuY2VtZW50cyB0byBkaWFmdXp6ZXIKKyBMaWNlbnNlOiBzYW1lIGFzIGZyZWVEaWFtZXRlcgorKioqKioqKioqKioqKioqKi8KKworCisvKiAKKyAqIERpY3Rpb25hcnkgZGVmaW5pdGlvbnMgb2Ygb2JqZWN0cyBzcGVjaWZpZWQgaW4gU0dkIChlMTApLgorICovCisjaW5jbHVkZSA8ZnJlZURpYW1ldGVyL2V4dGVuc2lvbi5oPgorCisjZGVmaW5lIFBST1RPX1ZFUiAiZTEwIgorI2RlZmluZSBHRU5fREFURSAgMTUwNjY5NzIyMi44NAorCitjb25zdCBjaGFyICpzZ2RfcHJvdG9fdmVyID0gUFJPVE9fVkVSOworY29uc3QgZG91YmxlIHNnZF9nZW5fZGF0ZSA9IEdFTl9EQVRFOworCisvKiBUaGUgY29udGVudCBvZiB0aGlzIGZpbGUgZm9sbG93cyB0aGUgc2FtZSBzdHJ1Y3R1cmUgYXMgZGljdF9iYXNlX3Byb3RvLmMgKi8KKworI2RlZmluZSBDSEVDS19kaWN0X25ldyggX3R5cGUsIF9kYXRhLCBfcGFyZW50LCBfcmVmICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBfcmV0ID0gZmRfZGljdF9uZXcoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgKF90eXBlKSwgKF9kYXRhKSwgKF9wYXJlbnQpLCAoX3JlZikgKTsgXAorICAgIGlmICggX3JldCAhPSAwICYmIF9yZXQgIT0gRUVYSVNUICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHJldHVybiBfcmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIENIRUNLX2RpY3Rfc2VhcmNoKCBfdHlwZSwgX2NyaXRlcmlhLCBfd2hhdCwgX3Jlc3VsdCApCQlcCisgICAgQ0hFQ0tfRkNUKCAgZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgKF90eXBlKSwgKF9jcml0ZXJpYSksIChfd2hhdCksIChfcmVzdWx0KSwgRU5PRU5UKSApOworCitzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiB7CisgICAgc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWU7CisgICAgZW51bSBydWxlX3Bvc2l0aW9uCXBvc2l0aW9uOworICAgIGludCAJCQltaW47CisgICAgaW50CQkJbWF4OworfTsKKworI2RlZmluZSBSVUxFX09SREVSKCBfcG9zaXRpb24gKSAoKCgoX3Bvc2l0aW9uKSA9PSBSVUxFX0ZJWEVEX0hFQUQpIHx8ICgoX3Bvc2l0aW9uKSA9PSBSVUxFX0ZJWEVEX1RBSUwpKSA/IDEgOiAwICkKKworLyogQXR0ZW50aW9uISBUaGlzIHZlcnNpb24gb2YgdGhlIG1hY3JvIHVzZXMgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgaW4gY29udHJhc3QgdG8gbW9zdCBvdGhlciBjb3BpZXMhICovCisjZGVmaW5lIFBBUlNFX2xvY19ydWxlcyggX3J1bGVhcnJheSwgX3BhcmVudCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IF9fYXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKF9fYXI9MDsgX19hciA8IHNpemVvZihfcnVsZWFycmF5KSAvIHNpemVvZigoX3J1bGVhcnJheSlbMF0pOyBfX2FyKyspIHsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgc3RydWN0IGRpY3RfcnVsZV9kYXRhIF9fZGF0YSA9IHsgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5wb3NpdGlvbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ubWluLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5tYXh9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIF9fZGF0YS5ydWxlX29yZGVyID0gUlVMRV9PUkRFUihfX2RhdGEucnVsZV9wb3NpdGlvbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgQ0hFQ0tfRkNUKCAgZmRfZGljdF9zZWFyY2goICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgRElDVF9BVlAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICYoX3J1bGVhcnJheSlbX19hcl0uYXZwX3ZlbmRvcl9wbHVzX25hbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgJl9fZGF0YS5ydWxlX2F2cCwgMCApICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYgKCAhX19kYXRhLnJ1bGVfYXZwICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFX0RFQlVHKElORk8sICJBVlAgTm90IGZvdW5kOiAnJXMnIiwgKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLmF2cF9uYW1lKTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVOT0VOVDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBfcmV0ID0gZmRfZGljdF9uZXcoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9SVUxFLCAmKF9fZGF0YSksIChfcGFyZW50KSwgTlVMTCApOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBfcmV0ICE9IDAgJiYgX3JldCAhPSBFRVhJU1QgKSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfREVCVUcoSU5GTywgIkVycm9yIG9uIHJ1bGUgd2l0aCBBVlAgJyVzJyIsICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0uYXZwX3ZlbmRvcl9wbHVzX25hbWUuYXZwX25hbWUpOyAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFSU5WQUw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBDSEVDS192ZW5kb3JfbmV3KCBfZGF0YSApIHsgXAorICAgICAgICBzdHJ1Y3QgZGljdF9vYmplY3QgKiB2ZW5kb3JfZm91bmQ7IFwKKyAgICAgICAgaWYgKGZkX2RpY3Rfc2VhcmNoKGZkX2dfY29uZmlnLT5jbmZfZGljdCxESUNUX1ZFTkRPUixWRU5ET1JfQllfSUQsJl9kYXRhLnZlbmRvcl9pZCwmdmVuZG9yX2ZvdW5kLEVOT0VOVCkgPT0gRU5PRU5UKSB7IFwKKyAgICAgICAgICAgICAgICBDSEVDS19GQ1QoZmRfZGljdF9uZXcoZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1ZFTkRPUiwgJl9kYXRhLCBOVUxMLCBOVUxMKSk7IFwKKyAgICAgICAgfSBcCit9CisKKyNkZWZpbmUgZW51bXZhbF9kZWZfdTMyKCBfdmFsXywgX3N0cl8gKQkJXAorICAgIHsgX3N0cl8sIAkJeyAudTMyID0gX3ZhbF8gfX0KKworI2RlZmluZSBlbnVtdmFsX2RlZl9vcyggX2xlbl8sIF92YWxfLCBfc3RyXyApCQkJCVwKKyAgICB7IF9zdHJfLCAJCXsgLm9zID0geyAuZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopX3ZhbF8sIC5sZW4gPSBfbGVuXyB9fX0KKworCitzdGF0aWMgaW50IGRpY3Rfc2dkX2xvYWRfZGVmcyhjaGFyICogY29uZmZpbGUpCit7CisgICBUUkFDRV9FTlRSWSgiJXAiLCBjb25mZmlsZSk7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXBwX2lkMTY3NzczMTI7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXBwX2lkMTY3NzczMTM7CisKKwkvKiBBcHBsaWNhdGlvbiBTZWN0aW9uICovCisJeworCSAgeworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogdmVuZG9yOworCQkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9WRU5ET1IsIFZFTkRPUl9CWV9OQU1FLCAiM0dQUCIsICZ2ZW5kb3IpCisJCQlzdHJ1Y3QgZGljdF9hcHBsaWNhdGlvbl9kYXRhIGRhdGEgPSB7IDE2Nzc3MzEyLCAiU0dkLWFwcDE2Nzc3MzEyIiB9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVBQTElDQVRJT04sICZkYXRhLCB2ZW5kb3IsICZhcHBfaWQxNjc3NzMxMikKKwkgIH0KKwkgIHsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIHZlbmRvcjsKKwkJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfVkVORE9SLCBWRU5ET1JfQllfTkFNRSwgIjNHUFAiLCAmdmVuZG9yKQorCQkJc3RydWN0IGRpY3RfYXBwbGljYXRpb25fZGF0YSBkYXRhID0geyAxNjc3NzMxMywgIlNHZCIgfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FQUExJQ0FUSU9OLCAmZGF0YSwgdmVuZG9yLCAmYXBwX2lkMTY3NzczMTMpCisJICB9CisJICAvKiBSZXN1bHQgY29kZXMgKi8KKwkgIHsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqdHlwZTsKKwkJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiRW51bWVyYXRlZChSZXN1bHQtQ29kZSkiLCZ0eXBlKTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiR2VuZXJhbCIsIHsgLnUzMj0xIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJQZXJtYW5lbnRfRmFpbHVyZXMiLCB7IC51MzI9MyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAiVHJhbnNpZW50X0ZhaWx1cmVzIiwgeyAudTMyPTQgfX07CisKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zLCB0eXBlLCBOVUxMKTsKKworCSAgfQorCX0KKworCisgICAvKiBBVlAgc2VjdGlvbiAqLworICAgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBBZGRyZXNzX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIFVURjhTdHJpbmdfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogRGlhbWV0ZXJJZGVudGl0eV90eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBEaWFtZXRlclVSSV90eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBUaW1lX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIElQRmlsdGVyUnVsZV90eXBlOworCisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkFkZHJlc3MiLCAmQWRkcmVzc190eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiVVRGOFN0cmluZyIsICZVVEY4U3RyaW5nX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJEaWFtZXRlcklkZW50aXR5IiwgJkRpYW1ldGVySWRlbnRpdHlfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkRpYW1ldGVyVVJJIiwgJkRpYW1ldGVyVVJJX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJUaW1lIiwgJlRpbWVfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIklQRmlsdGVyUnVsZSIsICZJUEZpbHRlclJ1bGVfdHlwZSk7CisKKwkKKyAgIH0KKworICAgLyogQ29tbWFuZHMgc2VjdGlvbiAqLworICAgeworCQkvKiBNTy1Gb3J3YXJkLVNob3J0LU1lc3NhZ2UtUmVxdWVzdCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJCXN0cnVjdCBkaWN0X2NtZF9kYXRhIGRhdGEgPSB7CisJCQkJODM4ODY0NSwJLyogQ29kZSAqLworCQkJCSJNTy1Gb3J3YXJkLVNob3J0LU1lc3NhZ2UtUmVxdWVzdCIsCS8qIE5hbWUgKi8KKwkJCQlDTURfRkxBR19SRVFVRVNUIHwgQ01EX0ZMQUdfRVJST1IsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQ01EX0ZMQUdfUkVRVUVTVCB8IENNRF9GTEFHX1BST1hJQUJMRSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCX07CisKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0NPTU1BTkQsICZkYXRhICwgYXBwX2lkMTY3NzczMTMsICZjbWQpCisJCX0KKwkJLyogTU8tRm9yd2FyZC1TaG9ydC1NZXNzYWdlLUFuc3dlciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJCXN0cnVjdCBkaWN0X2NtZF9kYXRhIGRhdGEgPSB7CisJCQkJODM4ODY0NSwJLyogQ29kZSAqLworCQkJCSJNTy1Gb3J3YXJkLVNob3J0LU1lc3NhZ2UtQW5zd2VyIiwJLyogTmFtZSAqLworCQkJCUNNRF9GTEFHX1JFUVVFU1QsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQ01EX0ZMQUdfUFJPWElBQkxFLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJfTsKKworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQ09NTUFORCwgJmRhdGEgLCBhcHBfaWQxNjc3NzMxMywgJmNtZCkKKwkJfQorCQkvKiBNVC1Gb3J3YXJkLVNob3J0LU1lc3NhZ2UtUmVxdWVzdCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJCXN0cnVjdCBkaWN0X2NtZF9kYXRhIGRhdGEgPSB7CisJCQkJODM4ODY0NiwJLyogQ29kZSAqLworCQkJCSJNVC1Gb3J3YXJkLVNob3J0LU1lc3NhZ2UtUmVxdWVzdCIsCS8qIE5hbWUgKi8KKwkJCQlDTURfRkxBR19SRVFVRVNUIHwgQ01EX0ZMQUdfRVJST1IsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQ01EX0ZMQUdfUkVRVUVTVCB8IENNRF9GTEFHX1BST1hJQUJMRSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCX07CisKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0NPTU1BTkQsICZkYXRhICwgYXBwX2lkMTY3NzczMTMsICZjbWQpCisJCX0KKwkJLyogTVQtRm9yd2FyZC1TaG9ydC1NZXNzYWdlLUFuc3dlciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJCXN0cnVjdCBkaWN0X2NtZF9kYXRhIGRhdGEgPSB7CisJCQkJODM4ODY0NiwJLyogQ29kZSAqLworCQkJCSJNVC1Gb3J3YXJkLVNob3J0LU1lc3NhZ2UtQW5zd2VyIiwJLyogTmFtZSAqLworCQkJCUNNRF9GTEFHX1JFUVVFU1QsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQ01EX0ZMQUdfUFJPWElBQkxFLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJfTsKKworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQ09NTUFORCwgJmRhdGEgLCBhcHBfaWQxNjc3NzMxMywgJmNtZCkKKwkJfQorCisgICB9CisKKyAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRpY3Rfc2dkX2xvYWRfcnVsZXMoY2hhciAqIGNvbmZmaWxlKQoreworICAgLyogR3JvdXBlZCBBVlAgc2VjdGlvbiAqLworICAgeworCisgICB9CQorCisgICAvKiBDb21tYW5kcyBzZWN0aW9uICovCisgICB7CisJICAvKiBNTy1Gb3J3YXJkLVNob3J0LU1lc3NhZ2UtUmVxdWVzdCAqLworCSAgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJNTy1Gb3J3YXJkLVNob3J0LU1lc3NhZ2UtUmVxdWVzdCIsICZjbWQpCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU2Vzc2lvbi1JZCJ9LCBSVUxFX0ZJWEVEX0hFQUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRSTVAifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVmVuZG9yLVNwZWNpZmljLUFwcGxpY2F0aW9uLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkF1dGgtU2Vzc2lvbi1TdGF0ZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tSG9zdCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRGVzdGluYXRpb24tSG9zdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEZXN0aW5hdGlvbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU0MtQWRkcmVzcyJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiT0ZSLUZsYWdzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTdXBwb3J0ZWQtRmVhdHVyZXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlVzZXItSWRlbnRpZmllciJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU00tUlAtVUkifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNNU01JLUNvcnJlbGF0aW9uLUlEIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTTS1EZWxpdmVyeS1PdXRjb21lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlByb3h5LUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUm91dGUtUmVjb3JkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyhydWxlcywgY21kKTsKKwkgIH0KKwkgIC8qIE1PLUZvcndhcmQtU2hvcnQtTWVzc2FnZS1BbnN3ZXIgKi8KKwkgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX0NPTU1BTkQsIENNRF9CWV9OQU1FLCAiTU8tRm9yd2FyZC1TaG9ydC1NZXNzYWdlLUFuc3dlciIsICZjbWQpCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU2Vzc2lvbi1JZCJ9LCBSVUxFX0ZJWEVEX0hFQUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRSTVAifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVmVuZG9yLVNwZWNpZmljLUFwcGxpY2F0aW9uLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJlc3VsdC1Db2RlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkV4cGVyaW1lbnRhbC1SZXN1bHQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQXV0aC1TZXNzaW9uLVN0YXRlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1Ib3N0In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU3VwcG9ydGVkLUZlYXR1cmVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyhydWxlcywgY21kKTsKKwkgIH0KKwkgIC8qIE1ULUZvcndhcmQtU2hvcnQtTWVzc2FnZS1SZXF1ZXN0ICovCisJICB7CisJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIk1ULUZvcndhcmQtU2hvcnQtTWVzc2FnZS1SZXF1ZXN0IiwgJmNtZCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTZXNzaW9uLUlkIn0sIFJVTEVfRklYRURfSEVBRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRFJNUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJWZW5kb3ItU3BlY2lmaWMtQXBwbGljYXRpb24tSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQXV0aC1TZXNzaW9uLVN0YXRlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1Ib3N0In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEZXN0aW5hdGlvbi1Ib3N0In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRlc3RpbmF0aW9uLVJlYWxtIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlVzZXItTmFtZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU3VwcG9ydGVkLUZlYXR1cmVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTTVNNSS1Db3JyZWxhdGlvbi1JRCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU0MtQWRkcmVzcyJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU00tUlAtVUkifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1NRS1OdW1iZXItZm9yLU1ULVNNUyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU0dTTi1OdW1iZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlRGUi1GbGFncyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU00tRGVsaXZlcnktVGltZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNNLURlbGl2ZXJ5LVN0YXJ0LVRpbWUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1heGltdW0tUmV0cmFuc21pc3Npb24tVGltZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU01TLUdNU0MtQWRkcmVzcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJQcm94eS1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJvdXRlLVJlY29yZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMocnVsZXMsIGNtZCk7CisJICB9CisJICAvKiBNVC1Gb3J3YXJkLVNob3J0LU1lc3NhZ2UtQW5zd2VyICovCisJICB7CisJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIk1ULUZvcndhcmQtU2hvcnQtTWVzc2FnZS1BbnN3ZXIiLCAmY21kKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlNlc3Npb24tSWQifSwgUlVMRV9GSVhFRF9IRUFELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEUk1QIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlZlbmRvci1TcGVjaWZpYy1BcHBsaWNhdGlvbi1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSZXN1bHQtQ29kZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJFeHBlcmltZW50YWwtUmVzdWx0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkF1dGgtU2Vzc2lvbi1TdGF0ZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tSG9zdCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlN1cHBvcnRlZC1GZWF0dXJlcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQWJzZW50LVVzZXItRGlhZ25vc3RpYy1TTSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMocnVsZXMsIGNtZCk7CisJICB9CisJICAvKiBBbGVydC1TZXJ2aWNlLUNlbnRyZS1SZXF1ZXN0ICovCisJICB7CisJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIkFsZXJ0LVNlcnZpY2UtQ2VudHJlLVJlcXVlc3QiLCAmY21kKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlNlc3Npb24tSWQifSwgUlVMRV9GSVhFRF9IRUFELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEUk1QIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlZlbmRvci1TcGVjaWZpYy1BcHBsaWNhdGlvbi1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBdXRoLVNlc3Npb24tU3RhdGUifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLUhvc3QifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLVJlYWxtIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRlc3RpbmF0aW9uLUhvc3QifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRGVzdGluYXRpb24tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNDLUFkZHJlc3MifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlVzZXItSWRlbnRpZmllciJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU01TTUktQ29ycmVsYXRpb24tSUQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1heGltdW0tVUUtQXZhaWxhYmlsaXR5LVRpbWUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNNUy1HTVNDLUFsZXJ0LUV2ZW50In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTZXJ2aW5nLU5vZGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlN1cHBvcnRlZC1GZWF0dXJlcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJQcm94eS1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJvdXRlLVJlY29yZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMocnVsZXMsIGNtZCk7CisJICB9CisJICAvKiBBbGVydC1TZXJ2aWNlLUNlbnRyZS1BbnN3ZXIgKi8KKwkgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX0NPTU1BTkQsIENNRF9CWV9OQU1FLCAiQWxlcnQtU2VydmljZS1DZW50cmUtQW5zd2VyIiwgJmNtZCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTZXNzaW9uLUlkIn0sIFJVTEVfRklYRURfSEVBRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRFJNUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJWZW5kb3ItU3BlY2lmaWMtQXBwbGljYXRpb24tSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUmVzdWx0LUNvZGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRXhwZXJpbWVudGFsLVJlc3VsdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBdXRoLVNlc3Npb24tU3RhdGUifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLUhvc3QifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLVJlYWxtIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTdXBwb3J0ZWQtRmVhdHVyZXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRmFpbGVkLUFWUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJQcm94eS1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJvdXRlLVJlY29yZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMocnVsZXMsIGNtZCk7CisJICB9CisKKyAgIH0KKworICAgTE9HX0QoICJFeHRlbnNpb24gJ0RpY3Rpb25hcnkgZGVmaW5pdGlvbnMgZm9yIFNHZCAoZTEwKScgaW5pdGlhbGl6ZWQiKTsKKyAgIHJldHVybiAwOworfQorCitpbnQgZGljdF9lbnRyeShjaGFyICogY29uZmZpbGUpCit7CisJZGljdF9zZ2RfbG9hZF9kZWZzKGNvbmZmaWxlKTsKKwlyZXR1cm4gZGljdF9zZ2RfbG9hZF9ydWxlcyhjb25mZmlsZSk7Cit9CisKK2NvbnN0IGNoYXIqIGRpY3Rfc2dkX3Byb3RvX3ZlcihjaGFyICogY29uZmZpbGUpIHsKKwlyZXR1cm4gc2dkX3Byb3RvX3ZlcjsKK30KKworY29uc3QgZG91YmxlIGRpY3Rfc2dkX2dlbl90cyhjaGFyICogY29uZmZpbGUpIHsKKwlyZXR1cm4gc2dkX2dlbl9kYXRlOworfQorCitFWFRFTlNJT05fRU5UUlkyKCJkaWN0X3NnZCIsIGRpY3Rfc2dkX2xvYWRfZGVmcywgZGljdF9zZ2RfbG9hZF9ydWxlcywgImRpY3RfUzZjIiwgImRpY3RfdHMyOTMzOF9hdnBzIiwgImRpY3RfdHMyOTI3Ml9hdnBzIiwgImRpY3RfdHMyOTMzNl9hdnBzIiwgImRpY3RfdHMyOTE3M19hdnBzIiwgImRpY3RfdHMyOTMyOV9hdnBzIiwgImRpY3RfdHMyOTIyOV9hdnBzIiwgImRpY3RfcmZjNzk0NF9hdnBzIik7CisKKworCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfU0xoL0NNYWtlTGlzdHMudHh0IGIvZXh0ZW5zaW9ucy9kaWN0X1NMaC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWQxOGIxCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kaWN0X1NMaC9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDE2IEBACisjIFRoZSBkaWN0X1NMaCBleHRlbnNpb24KK1BST0pFQ1QoImRpY3RfU0xoIGxpYnJhcnkgZ2VuZXJhdGVkIGJ5IEZkR2VuICIgQykKKworIyBDb21waWxlIGFzIGEgbW9kdWxlCitGRF9BRERfRVhURU5TSU9OKGRpY3RfU0xoIGRpY3RfU0xoLmMpCisKKworIyMjIworIyMgSU5TVEFMTCBzZWN0aW9uICMjCisKK0lOU1RBTEwoVEFSR0VUUyBkaWN0X1NMaAorCUxJQlJBUlkgREVTVElOQVRJT04gJHtJTlNUQUxMX0VYVEVOU0lPTlNfU1VGRklYfQorQ09NUE9ORU5UIGZyZWVEaWFtZXRlci1kaWN0aW9uYXJ5LVNMSCkKKworCisKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF9TTGgvU0xoLmRpZCBiL2V4dGVuc2lvbnMvZGljdF9TTGgvU0xoLmRpZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDRmYWZmCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kaWN0X1NMaC9TTGguZGlkCkBAIC0wLDAgKzEsMzggQEAKK2RpY3RfcmZjNjk0Ml9hdnBzCitkaWN0X3JmYzY3MzRfYXZwcworZGljdF9yZmM1NTgwX2F2cHMKK2RpY3RfdHMyOTQ2OF9hdnBzCitkaWN0X3RzMjkxNTRfYXZwcworZGljdF90czI5MjE0X2F2cHMKK2RpY3RfdHMyOTIxNV9hdnBzCitkaWN0X3RzMjkyMTdfYXZwcworZGljdF8zZ3BwMl9hdnBzCitkaWN0X3RzMjkzNDNfYXZwcworZGljdF90czI5MTI4X2F2cHMKK2RpY3RfdHMyOTM0NF9hdnBzCitkaWN0X3RzMjkzNDVfYXZwcworZGljdF90czMyMjk5X2F2cHMKK2RpY3RfcmZjNTc3OF9hdnBzCitkaWN0X3RzMjkzMzhfYXZwcworZGljdF90czI5MTczX2F2cHMKK2RpY3RfdHMyOTMzN19hdnBzCitkaWN0X2V0c2kyODMwMzRfYXZwcworZGljdF9yZmM0NTkwX2F2cHMKK2RpY3RfdHMyOTIyOV9hdnBzCitkaWN0X2RyYWZ0bG9hZF9hdnBzCitkaWN0X3RzMjkzMjlfYXZwcworZGljdF90czI5MzY4X2F2cHMKK2RpY3RfdHMyOTMzNl9hdnBzCitkaWN0X3RzMjkwNjFfYXZwcworZGljdF90czI5MjcyX2F2cHMKK2RpY3RfcmZjNzY4M19hdnBzCitkaWN0X3JmYzc5NDRfYXZwcworZGljdF9yZmM1Nzc3X2F2cHMKK2RpY3RfcmZjNDAwNmJpc19hdnBzCitkaWN0X3RzMjkyMTJfYXZwcworZGljdF9yZmM3MTU1X2F2cHMKK2RpY3RfcmZjNDA3Ml9hdnBzCitkaWN0X3JmYzQwMDRfYXZwcworZGljdF9yZmM1NDQ3X2F2cHMKK2RpY3RfdHMyOTI3M19hdnBzCitkaWN0X1NMaApkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X1NMaC9kaWN0X1NMaC5jIGIvZXh0ZW5zaW9ucy9kaWN0X1NMaC9kaWN0X1NMaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZDU0YmIKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfU0xoL2RpY3RfU0xoLmMKQEAgLTAsMCArMSwyNTAgQEAKKy8qCisqIENvcHlyaWdodCAoYykgMjAxNyBTcHJpbnQKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLyoqKioqKioqKioqKioqKioKKyBHZW5lcmF0ZWQgQnk6IGZkdG9vbCBlbmhhbmNlbWVudHMgdG8gZGlhZnV6emVyCisgTGljZW5zZTogc2FtZSBhcyBmcmVlRGlhbWV0ZXIKKyoqKioqKioqKioqKioqKiovCisKKworLyogCisgKiBEaWN0aW9uYXJ5IGRlZmluaXRpb25zIG9mIG9iamVjdHMgc3BlY2lmaWVkIGluIFNMaCAoZTAwKS4KKyAqLworI2luY2x1ZGUgPGZyZWVEaWFtZXRlci9leHRlbnNpb24uaD4KKworI2RlZmluZSBQUk9UT19WRVIgImUwMCIKKyNkZWZpbmUgR0VOX0RBVEUgIDE1MDY2OTcyMTUuNjcKKworY29uc3QgY2hhciAqc2xoX3Byb3RvX3ZlciA9IFBST1RPX1ZFUjsKK2NvbnN0IGRvdWJsZSBzbGhfZ2VuX2RhdGUgPSBHRU5fREFURTsKKworLyogVGhlIGNvbnRlbnQgb2YgdGhpcyBmaWxlIGZvbGxvd3MgdGhlIHNhbWUgc3RydWN0dXJlIGFzIGRpY3RfYmFzZV9wcm90by5jICovCisKKyNkZWZpbmUgQ0hFQ0tfZGljdF9uZXcoIF90eXBlLCBfZGF0YSwgX3BhcmVudCwgX3JlZiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgX3JldCA9IGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIChfdHlwZSksIChfZGF0YSksIChfcGFyZW50KSwgKF9yZWYpICk7IFwKKyAgICBpZiAoIF9yZXQgIT0gMCAmJiBfcmV0ICE9IEVFWElTVCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICByZXR1cm4gX3JldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBDSEVDS19kaWN0X3NlYXJjaCggX3R5cGUsIF9jcml0ZXJpYSwgX3doYXQsIF9yZXN1bHQgKQkJXAorICAgIENIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIChfdHlwZSksIChfY3JpdGVyaWEpLCAoX3doYXQpLCAoX3Jlc3VsdCksIEVOT0VOVCkgKTsKKworc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24geworICAgIHN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lOworICAgIGVudW0gcnVsZV9wb3NpdGlvbglwb3NpdGlvbjsKKyAgICBpbnQgCQkJbWluOworICAgIGludAkJCW1heDsKK307CisKKyNkZWZpbmUgUlVMRV9PUkRFUiggX3Bvc2l0aW9uICkgKCgoKF9wb3NpdGlvbikgPT0gUlVMRV9GSVhFRF9IRUFEKSB8fCAoKF9wb3NpdGlvbikgPT0gUlVMRV9GSVhFRF9UQUlMKSkgPyAxIDogMCApCisKKy8qIEF0dGVudGlvbiEgVGhpcyB2ZXJzaW9uIG9mIHRoZSBtYWNybyB1c2VzIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsIGluIGNvbnRyYXN0IHRvIG1vc3Qgb3RoZXIgY29waWVzISAqLworI2RlZmluZSBQQVJTRV9sb2NfcnVsZXMoIF9ydWxlYXJyYXksIF9wYXJlbnQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBfX2FyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yIChfX2FyPTA7IF9fYXIgPCBzaXplb2YoX3J1bGVhcnJheSkgLyBzaXplb2YoKF9ydWxlYXJyYXkpWzBdKTsgX19hcisrKSB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHN0cnVjdCBkaWN0X3J1bGVfZGF0YSBfX2RhdGEgPSB7IE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ucG9zaXRpb24sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLm1pbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ubWF4fTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfX2RhdGEucnVsZV9vcmRlciA9IFJVTEVfT1JERVIoX19kYXRhLnJ1bGVfcG9zaXRpb24pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIENIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIERJQ1RfQVZQLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAmKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICZfX2RhdGEucnVsZV9hdnAsIDAgKSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmICggIV9fZGF0YS5ydWxlX2F2cCApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9ERUJVRyhJTkZPLCAiQVZQIE5vdCBmb3VuZDogJyVzJyIsIChfcnVsZWFycmF5KVtfX2FyXS5hdnBfdmVuZG9yX3BsdXNfbmFtZS5hdnBfbmFtZSk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFTk9FTlQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgX3JldCA9IGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfUlVMRSwgJihfX2RhdGEpLCAoX3BhcmVudCksIE5VTEwgKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggX3JldCAhPSAwICYmIF9yZXQgIT0gRUVYSVNUICkgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFX0RFQlVHKElORk8sICJFcnJvciBvbiBydWxlIHdpdGggQVZQICclcyciLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLmF2cF9uYW1lKTsgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRUlOVkFMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgQ0hFQ0tfdmVuZG9yX25ldyggX2RhdGEgKSB7IFwKKyAgICAgICAgc3RydWN0IGRpY3Rfb2JqZWN0ICogdmVuZG9yX2ZvdW5kOyBcCisgICAgICAgIGlmIChmZF9kaWN0X3NlYXJjaChmZF9nX2NvbmZpZy0+Y25mX2RpY3QsRElDVF9WRU5ET1IsVkVORE9SX0JZX0lELCZfZGF0YS52ZW5kb3JfaWQsJnZlbmRvcl9mb3VuZCxFTk9FTlQpID09IEVOT0VOVCkgeyBcCisgICAgICAgICAgICAgICAgQ0hFQ0tfRkNUKGZkX2RpY3RfbmV3KGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9WRU5ET1IsICZfZGF0YSwgTlVMTCwgTlVMTCkpOyBcCisgICAgICAgIH0gXAorfQorCisjZGVmaW5lIGVudW12YWxfZGVmX3UzMiggX3ZhbF8sIF9zdHJfICkJCVwKKyAgICB7IF9zdHJfLCAJCXsgLnUzMiA9IF92YWxfIH19CisKKyNkZWZpbmUgZW51bXZhbF9kZWZfb3MoIF9sZW5fLCBfdmFsXywgX3N0cl8gKQkJCQlcCisgICAgeyBfc3RyXywgCQl7IC5vcyA9IHsgLmRhdGEgPSAodW5zaWduZWQgY2hhciAqKV92YWxfLCAubGVuID0gX2xlbl8gfX19CisKKworc3RhdGljIGludCBkaWN0X3NsaF9sb2FkX2RlZnMoY2hhciAqIGNvbmZmaWxlKQoreworICAgVFJBQ0VfRU5UUlkoIiVwIiwgY29uZmZpbGUpOworCXN0cnVjdCBkaWN0X29iamVjdCAqIGFwcF9pZDE2Nzc3MjkxOworCisJLyogQXBwbGljYXRpb24gU2VjdGlvbiAqLworCXsKKwkgIHsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIHZlbmRvcjsKKwkJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfVkVORE9SLCBWRU5ET1JfQllfTkFNRSwgIjNHUFAiLCAmdmVuZG9yKQorCQkJc3RydWN0IGRpY3RfYXBwbGljYXRpb25fZGF0YSBkYXRhID0geyAxNjc3NzI5MSwgIlNMaCIgfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FQUExJQ0FUSU9OLCAmZGF0YSwgdmVuZG9yLCAmYXBwX2lkMTY3NzcyOTEpCisJICB9CisJfQorCisKKyAgIC8qIEFWUCBzZWN0aW9uICovCisgICB7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIEFkZHJlc3NfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogVVRGOFN0cmluZ190eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBEaWFtZXRlcklkZW50aXR5X3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIERpYW1ldGVyVVJJX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIFRpbWVfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogSVBGaWx0ZXJSdWxlX3R5cGU7CisKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiQWRkcmVzcyIsICZBZGRyZXNzX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJVVEY4U3RyaW5nIiwgJlVURjhTdHJpbmdfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkRpYW1ldGVySWRlbnRpdHkiLCAmRGlhbWV0ZXJJZGVudGl0eV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiRGlhbWV0ZXJVUkkiLCAmRGlhbWV0ZXJVUklfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIlRpbWUiLCAmVGltZV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiSVBGaWx0ZXJSdWxlIiwgJklQRmlsdGVyUnVsZV90eXBlKTsKKworCQorICAgfQorCisgICAvKiBDb21tYW5kcyBzZWN0aW9uICovCisgICB7CisJCS8qIExDUy1Sb3V0aW5nLUluZm8tUmVxdWVzdCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJCXN0cnVjdCBkaWN0X2NtZF9kYXRhIGRhdGEgPSB7CisJCQkJODM4ODYyMiwJLyogQ29kZSAqLworCQkJCSJMQ1MtUm91dGluZy1JbmZvLVJlcXVlc3QiLAkvKiBOYW1lICovCisJCQkJQ01EX0ZMQUdfUkVRVUVTVCB8IENNRF9GTEFHX0VSUk9SLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUNNRF9GTEFHX1JFUVVFU1QgfCBDTURfRkxBR19QUk9YSUFCTEUsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQl9OworCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9DT01NQU5ELCAmZGF0YSAsIGFwcF9pZDE2Nzc3MjkxLCAmY21kKQorCQl9CisJCS8qIExDUy1Sb3V0aW5nLUluZm8tQW5zd2VyICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQkJc3RydWN0IGRpY3RfY21kX2RhdGEgZGF0YSA9IHsKKwkJCQk4Mzg4NjIyLAkvKiBDb2RlICovCisJCQkJIkxDUy1Sb3V0aW5nLUluZm8tQW5zd2VyIiwJLyogTmFtZSAqLworCQkJCUNNRF9GTEFHX1JFUVVFU1QsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQ01EX0ZMQUdfUFJPWElBQkxFLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJfTsKKworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQ09NTUFORCwgJmRhdGEgLCBhcHBfaWQxNjc3NzI5MSwgJmNtZCkKKwkJfQorCisgICB9CisKKyAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRpY3Rfc2xoX2xvYWRfcnVsZXMoY2hhciAqIGNvbmZmaWxlKQoreworICAgLyogR3JvdXBlZCBBVlAgc2VjdGlvbiAqLworICAgeworCisgICB9CQorCisgICAvKiBDb21tYW5kcyBzZWN0aW9uICovCisgICB7CisJICAvKiBMQ1MtUm91dGluZy1JbmZvLVJlcXVlc3QgKi8KKwkgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX0NPTU1BTkQsIENNRF9CWV9OQU1FLCAiTENTLVJvdXRpbmctSW5mby1SZXF1ZXN0IiwgJmNtZCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTZXNzaW9uLUlkIn0sIFJVTEVfRklYRURfSEVBRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVmVuZG9yLVNwZWNpZmljLUFwcGxpY2F0aW9uLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkF1dGgtU2Vzc2lvbi1TdGF0ZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tSG9zdCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRGVzdGluYXRpb24tSG9zdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEZXN0aW5hdGlvbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJVc2VyLU5hbWUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1TSVNETiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiR01MQy1OdW1iZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlN1cHBvcnRlZC1GZWF0dXJlcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJQcm94eS1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJvdXRlLVJlY29yZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMocnVsZXMsIGNtZCk7CisJICB9CisJICAvKiBMQ1MtUm91dGluZy1JbmZvLUFuc3dlciAqLworCSAgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJMQ1MtUm91dGluZy1JbmZvLUFuc3dlciIsICZjbWQpCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU2Vzc2lvbi1JZCJ9LCBSVUxFX0ZJWEVEX0hFQUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlZlbmRvci1TcGVjaWZpYy1BcHBsaWNhdGlvbi1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSZXN1bHQtQ29kZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJFeHBlcmltZW50YWwtUmVzdWx0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkF1dGgtU2Vzc2lvbi1TdGF0ZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tSG9zdCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlN1cHBvcnRlZC1GZWF0dXJlcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJVc2VyLU5hbWUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1TSVNETiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTE1TSSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU2VydmluZy1Ob2RlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBZGRpdGlvbmFsLVNlcnZpbmctTm9kZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiR01MQy1BZGRyZXNzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQUFItQWRkcmVzcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUklBLUZsYWdzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkZhaWxlZC1BVlAifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUHJveHktSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSb3V0ZS1SZWNvcmQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKHJ1bGVzLCBjbWQpOworCSAgfQorCisgICB9CisKKyAgIExPR19EKCAiRXh0ZW5zaW9uICdEaWN0aW9uYXJ5IGRlZmluaXRpb25zIGZvciBTTGggKGUwMCknIGluaXRpYWxpemVkIik7CisgICByZXR1cm4gMDsKK30KKworaW50IGRpY3RfZW50cnkoY2hhciAqIGNvbmZmaWxlKQoreworCWRpY3Rfc2xoX2xvYWRfZGVmcyhjb25mZmlsZSk7CisJcmV0dXJuIGRpY3Rfc2xoX2xvYWRfcnVsZXMoY29uZmZpbGUpOworfQorCitjb25zdCBjaGFyKiBkaWN0X3NsaF9wcm90b192ZXIoY2hhciAqIGNvbmZmaWxlKSB7CisJcmV0dXJuIHNsaF9wcm90b192ZXI7Cit9CisKK2NvbnN0IGRvdWJsZSBkaWN0X3NsaF9nZW5fdHMoY2hhciAqIGNvbmZmaWxlKSB7CisJcmV0dXJuIHNsaF9nZW5fZGF0ZTsKK30KKworRVhURU5TSU9OX0VOVFJZMigiZGljdF9zbGgiLCBkaWN0X3NsaF9sb2FkX2RlZnMsIGRpY3Rfc2xoX2xvYWRfcnVsZXMsICJkaWN0X3RzMjkyNzJfYXZwcyIsICJkaWN0X3RzMjkxNzNfYXZwcyIsICJkaWN0X3RzMjkyNzNfYXZwcyIsICJkaWN0X3RzMjkzMjlfYXZwcyIsICJkaWN0X3RzMjkyMjlfYXZwcyIpOworCisKKwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X1NkL0NNYWtlTGlzdHMudHh0IGIvZXh0ZW5zaW9ucy9kaWN0X1NkL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZDJlZjAKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfU2QvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxNiBAQAorIyBUaGUgZGljdF9TZCBleHRlbnNpb24KK1BST0pFQ1QoImRpY3RfU2QgbGlicmFyeSBnZW5lcmF0ZWQgYnkgRmRHZW4gIiBDKQorCisjIENvbXBpbGUgYXMgYSBtb2R1bGUKK0ZEX0FERF9FWFRFTlNJT04oZGljdF9TZCBkaWN0X1NkLmMpCisKKworIyMjIworIyMgSU5TVEFMTCBzZWN0aW9uICMjCisKK0lOU1RBTEwoVEFSR0VUUyBkaWN0X1NkCisJTElCUkFSWSBERVNUSU5BVElPTiAke0lOU1RBTExfRVhURU5TSU9OU19TVUZGSVh9CitDT01QT05FTlQgZnJlZURpYW1ldGVyLWRpY3Rpb25hcnktU0QpCisKKworCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfU2QvU2QuZGlkIGIvZXh0ZW5zaW9ucy9kaWN0X1NkL1NkLmRpZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjZmNjdkCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kaWN0X1NkL1NkLmRpZApAQCAtMCwwICsxLDM5IEBACitkaWN0X3JmYzY5NDJfYXZwcworZGljdF90czI5NDY4X2F2cHMKK2RpY3RfdHMyOTE1NF9hdnBzCitkaWN0X3RzMjkyMTRfYXZwcworZGljdF90czI5MjE1X2F2cHMKK2RpY3RfdHMyOTIxN19hdnBzCitkaWN0XzNncHAyX2F2cHMKK2RpY3RfdHMyOTM0M19hdnBzCitkaWN0X3RzMjkzMzhfYXZwcworZGljdF90czI5MTI4X2F2cHMKK2RpY3RfdHMyOTM0NF9hdnBzCitkaWN0X3RzMjkzNDVfYXZwcworZGljdF90czMyMjk5X2F2cHMKK2RpY3RfcmZjNjczNF9hdnBzCitkaWN0X3JmYzU3NzhfYXZwcworZGljdF9yZmM1NTgwX2F2cHMKK2RpY3RfcmZjNDA3Ml9hdnBzCitkaWN0X3RzMjkyNzNfYXZwcworZGljdF90czI5MTczX2F2cHMKK2RpY3RfdHMyOTMzN19hdnBzCitkaWN0X2V0c2kyODMwMzRfYXZwcworZGljdF9yZmM0NTkwX2F2cHMKK2RpY3RfdHMyOTIyOV9hdnBzCitkaWN0X2RyYWZ0bG9hZF9hdnBzCitkaWN0X3RzMjkzMjlfYXZwcworZGljdF90czI5MzY4X2F2cHMKK2RpY3RfdHMyOTMzNl9hdnBzCitkaWN0X3RzMjkwNjFfYXZwcworZGljdF9yZmM1NDQ3X2F2cHMKK2RpY3RfdHMyOTI3Ml9hdnBzCitkaWN0X3JmYzc2ODNfYXZwcworZGljdF9yZmM3OTQ0X2F2cHMKK2RpY3RfdHMyOTIxMl9hdnBzCitkaWN0X0NyZWRpdENvbnRyb2wKK2RpY3RfcmZjNDAwNF9hdnBzCitkaWN0X3JmYzcxNTVfYXZwcworZGljdF9yZmM1Nzc3X2F2cHMKK2RpY3RfcmZjNDAwNmJpc19hdnBzCitkaWN0X1NkCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfU2QvZGljdF9TZC5jIGIvZXh0ZW5zaW9ucy9kaWN0X1NkL2RpY3RfU2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWRkOGViCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kaWN0X1NkL2RpY3RfU2QuYwpAQCAtMCwwICsxLDQzMiBAQAorLyoKKyogQ29weXJpZ2h0IChjKSAyMDE3IFNwcmludAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvKioqKioqKioqKioqKioqKgorIEdlbmVyYXRlZCBCeTogZmR0b29sIGVuaGFuY2VtZW50cyB0byBkaWFmdXp6ZXIKKyBMaWNlbnNlOiBzYW1lIGFzIGZyZWVEaWFtZXRlcgorKioqKioqKioqKioqKioqKi8KKworCisvKiAKKyAqIERpY3Rpb25hcnkgZGVmaW5pdGlvbnMgb2Ygb2JqZWN0cyBzcGVjaWZpZWQgaW4gU2QgKGUzMCkuCisgKi8KKyNpbmNsdWRlIDxmcmVlRGlhbWV0ZXIvZXh0ZW5zaW9uLmg+CisKKyNkZWZpbmUgUFJPVE9fVkVSICJlMzAiCisjZGVmaW5lIEdFTl9EQVRFICAxNTA2Njk3MjEyLjE3CisKK2NvbnN0IGNoYXIgKnNkX3Byb3RvX3ZlciA9IFBST1RPX1ZFUjsKK2NvbnN0IGRvdWJsZSBzZF9nZW5fZGF0ZSA9IEdFTl9EQVRFOworCisvKiBUaGUgY29udGVudCBvZiB0aGlzIGZpbGUgZm9sbG93cyB0aGUgc2FtZSBzdHJ1Y3R1cmUgYXMgZGljdF9iYXNlX3Byb3RvLmMgKi8KKworI2RlZmluZSBDSEVDS19kaWN0X25ldyggX3R5cGUsIF9kYXRhLCBfcGFyZW50LCBfcmVmICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBfcmV0ID0gZmRfZGljdF9uZXcoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgKF90eXBlKSwgKF9kYXRhKSwgKF9wYXJlbnQpLCAoX3JlZikgKTsgXAorICAgIGlmICggX3JldCAhPSAwICYmIF9yZXQgIT0gRUVYSVNUICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHJldHVybiBfcmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIENIRUNLX2RpY3Rfc2VhcmNoKCBfdHlwZSwgX2NyaXRlcmlhLCBfd2hhdCwgX3Jlc3VsdCApCQlcCisgICAgQ0hFQ0tfRkNUKCAgZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgKF90eXBlKSwgKF9jcml0ZXJpYSksIChfd2hhdCksIChfcmVzdWx0KSwgRU5PRU5UKSApOworCitzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiB7CisgICAgc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWU7CisgICAgZW51bSBydWxlX3Bvc2l0aW9uCXBvc2l0aW9uOworICAgIGludCAJCQltaW47CisgICAgaW50CQkJbWF4OworfTsKKworI2RlZmluZSBSVUxFX09SREVSKCBfcG9zaXRpb24gKSAoKCgoX3Bvc2l0aW9uKSA9PSBSVUxFX0ZJWEVEX0hFQUQpIHx8ICgoX3Bvc2l0aW9uKSA9PSBSVUxFX0ZJWEVEX1RBSUwpKSA/IDEgOiAwICkKKworLyogQXR0ZW50aW9uISBUaGlzIHZlcnNpb24gb2YgdGhlIG1hY3JvIHVzZXMgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgaW4gY29udHJhc3QgdG8gbW9zdCBvdGhlciBjb3BpZXMhICovCisjZGVmaW5lIFBBUlNFX2xvY19ydWxlcyggX3J1bGVhcnJheSwgX3BhcmVudCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IF9fYXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKF9fYXI9MDsgX19hciA8IHNpemVvZihfcnVsZWFycmF5KSAvIHNpemVvZigoX3J1bGVhcnJheSlbMF0pOyBfX2FyKyspIHsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgc3RydWN0IGRpY3RfcnVsZV9kYXRhIF9fZGF0YSA9IHsgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5wb3NpdGlvbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ubWluLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5tYXh9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIF9fZGF0YS5ydWxlX29yZGVyID0gUlVMRV9PUkRFUihfX2RhdGEucnVsZV9wb3NpdGlvbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgQ0hFQ0tfRkNUKCAgZmRfZGljdF9zZWFyY2goICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgRElDVF9BVlAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICYoX3J1bGVhcnJheSlbX19hcl0uYXZwX3ZlbmRvcl9wbHVzX25hbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgJl9fZGF0YS5ydWxlX2F2cCwgMCApICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYgKCAhX19kYXRhLnJ1bGVfYXZwICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFX0RFQlVHKElORk8sICJBVlAgTm90IGZvdW5kOiAnJXMnIiwgKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLmF2cF9uYW1lKTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVOT0VOVDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBfcmV0ID0gZmRfZGljdF9uZXcoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9SVUxFLCAmKF9fZGF0YSksIChfcGFyZW50KSwgTlVMTCApOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBfcmV0ICE9IDAgJiYgX3JldCAhPSBFRVhJU1QgKSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfREVCVUcoSU5GTywgIkVycm9yIG9uIHJ1bGUgd2l0aCBBVlAgJyVzJyIsICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0uYXZwX3ZlbmRvcl9wbHVzX25hbWUuYXZwX25hbWUpOyAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFSU5WQUw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBDSEVDS192ZW5kb3JfbmV3KCBfZGF0YSApIHsgXAorICAgICAgICBzdHJ1Y3QgZGljdF9vYmplY3QgKiB2ZW5kb3JfZm91bmQ7IFwKKyAgICAgICAgaWYgKGZkX2RpY3Rfc2VhcmNoKGZkX2dfY29uZmlnLT5jbmZfZGljdCxESUNUX1ZFTkRPUixWRU5ET1JfQllfSUQsJl9kYXRhLnZlbmRvcl9pZCwmdmVuZG9yX2ZvdW5kLEVOT0VOVCkgPT0gRU5PRU5UKSB7IFwKKyAgICAgICAgICAgICAgICBDSEVDS19GQ1QoZmRfZGljdF9uZXcoZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1ZFTkRPUiwgJl9kYXRhLCBOVUxMLCBOVUxMKSk7IFwKKyAgICAgICAgfSBcCit9CisKKyNkZWZpbmUgZW51bXZhbF9kZWZfdTMyKCBfdmFsXywgX3N0cl8gKQkJXAorICAgIHsgX3N0cl8sIAkJeyAudTMyID0gX3ZhbF8gfX0KKworI2RlZmluZSBlbnVtdmFsX2RlZl9vcyggX2xlbl8sIF92YWxfLCBfc3RyXyApCQkJCVwKKyAgICB7IF9zdHJfLCAJCXsgLm9zID0geyAuZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopX3ZhbF8sIC5sZW4gPSBfbGVuXyB9fX0KKworCitzdGF0aWMgaW50IGRpY3Rfc2RfbG9hZF9kZWZzKGNoYXIgKiBjb25mZmlsZSkKK3sKKyAgIFRSQUNFX0VOVFJZKCIlcCIsIGNvbmZmaWxlKTsKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhcHBfaWQxNjc3NzMwMzsKKworCS8qIEFwcGxpY2F0aW9uIFNlY3Rpb24gKi8KKwl7CisJICB7CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiB2ZW5kb3I7CisJCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX1ZFTkRPUiwgVkVORE9SX0JZX05BTUUsICIzR1BQIiwgJnZlbmRvcikKKwkJCXN0cnVjdCBkaWN0X2FwcGxpY2F0aW9uX2RhdGEgZGF0YSA9IHsgMTY3NzczMDMsICJTZCIgfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FQUExJQ0FUSU9OLCAmZGF0YSwgdmVuZG9yLCAmYXBwX2lkMTY3NzczMDMpCisJICB9CisJICAvKiBSZXN1bHQgY29kZXMgKi8KKwkgIHsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqdHlwZTsKKwkJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiRW51bWVyYXRlZChSZXN1bHQtQ29kZSkiLCZ0eXBlKTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiUENFRl9Jbml0aWF0ZWRfSVBfQ0FOX1Nlc3Npb25fTW9kaWZpY2F0aW9uIiwgeyAudTMyPTEgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIlBDUkZfSW5pdGlhdGVkX0lQX0NBTl9TZXNzaW9uX01vZGlmaWNhdGlvbiIsIHsgLnUzMj0yIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMgPSB7ICJJUF9DQU5fU2Vzc2lvbl9UZXJtaW5hdGlvbiIsIHsgLnUzMj0zIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzQgPSB7ICJJUF9DQU5fU2Vzc2lvbl9Nb2RpZmljYXRpb24iLCB7IC51MzI9NCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF81ID0geyAiQURDX3J1bGUiLCB7IC51MzI9NSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF82ID0geyAiU3Vic2NyaWJlcl9JZGVudGlmaWVyIiwgeyAudTMyPTYgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNyA9IHsgIkRlZmF1bHRfUW9TX2NvbnRyb2wiLCB7IC51MzI9NyB9fTsKKworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF81LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzYsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNywgdHlwZSwgTlVMTCk7CisKKwkgIH0KKwl9CisKKworICAgLyogQVZQIHNlY3Rpb24gKi8KKyAgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogQWRkcmVzc190eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBVVEY4U3RyaW5nX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIERpYW1ldGVySWRlbnRpdHlfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogRGlhbWV0ZXJVUklfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogVGltZV90eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBJUEZpbHRlclJ1bGVfdHlwZTsKKworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJBZGRyZXNzIiwgJkFkZHJlc3NfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIlVURjhTdHJpbmciLCAmVVRGOFN0cmluZ190eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiRGlhbWV0ZXJJZGVudGl0eSIsICZEaWFtZXRlcklkZW50aXR5X3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJEaWFtZXRlclVSSSIsICZEaWFtZXRlclVSSV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiVGltZSIsICZUaW1lX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJJUEZpbHRlclJ1bGUiLCAmSVBGaWx0ZXJSdWxlX3R5cGUpOworCisJCisgICB9CisKKyAgIC8qIENvbW1hbmRzIHNlY3Rpb24gKi8KKyAgIHsKKwkJLyogVFMtUmVxdWVzdCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJCXN0cnVjdCBkaWN0X2NtZF9kYXRhIGRhdGEgPSB7CisJCQkJODM4ODYzNywJLyogQ29kZSAqLworCQkJCSJUUy1SZXF1ZXN0IiwJLyogTmFtZSAqLworCQkJCUNNRF9GTEFHX1JFUVVFU1QgfCBDTURfRkxBR19FUlJPUiwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlDTURfRkxBR19SRVFVRVNUIHwgQ01EX0ZMQUdfUFJPWElBQkxFLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJfTsKKworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQ09NTUFORCwgJmRhdGEgLCBhcHBfaWQxNjc3NzMwMywgJmNtZCkKKwkJfQorCQkvKiBUUy1BbnN3ZXIgKi8KKwkJeworCQkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCQlzdHJ1Y3QgZGljdF9jbWRfZGF0YSBkYXRhID0geworCQkJCTgzODg2MzcsCS8qIENvZGUgKi8KKwkJCQkiVFMtQW5zd2VyIiwJLyogTmFtZSAqLworCQkJCUNNRF9GTEFHX1JFUVVFU1QsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQ01EX0ZMQUdfUFJPWElBQkxFLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJfTsKKworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQ09NTUFORCwgJmRhdGEgLCBhcHBfaWQxNjc3NzMwMywgJmNtZCkKKwkJfQorCisgICB9CisKKyAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRpY3Rfc2RfbG9hZF9ydWxlcyhjaGFyICogY29uZmZpbGUpCit7CisgICAvKiBHcm91cGVkIEFWUCBzZWN0aW9uICovCisgICB7CisKKyAgIH0JCisKKyAgIC8qIENvbW1hbmRzIHNlY3Rpb24gKi8KKyAgIHsKKwkgIC8qIFRTLVJlcXVlc3QgKi8KKwkgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX0NPTU1BTkQsIENNRF9CWV9OQU1FLCAiVFMtUmVxdWVzdCIsICZjbWQpCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU2Vzc2lvbi1JZCJ9LCBSVUxFX0ZJWEVEX0hFQUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRSTVAifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVmVuZG9yLVNwZWNpZmljLUFwcGxpY2F0aW9uLUlkIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1Ib3N0In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEZXN0aW5hdGlvbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEZXN0aW5hdGlvbi1Ib3N0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1TdGF0ZS1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPQy1TdXBwb3J0ZWQtRmVhdHVyZXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU3Vic2NyaXB0aW9uLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTdXBwb3J0ZWQtRmVhdHVyZXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRnJhbWVkLUlQLUFkZHJlc3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRnJhbWVkLUlQdjYtUHJlZml4In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJJUC1DQU4tVHlwZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUkFULVR5cGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFOLVRydXN0ZWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVXNlci1FcXVpcG1lbnQtSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUW9TLUluZm9ybWF0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBTi1HVy1BZGRyZXNzIn0sIFJVTEVfT1BUSU9OQUwsIDAsIDIgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiM0dQUC1TR1NOLUFkZHJlc3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIjNHUFAtU0dTTi1JcHY2LUFkZHJlc3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIjNHUFAtR0dTTi1BZGRyZXNzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICIzR1BQLUdHU04tSXB2Ni1BZGRyZXNzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICIzR1BQLVNlbGVjdGlvbi1Nb2RlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJEeW5hbWljLUFkZHJlc3MtRmxhZyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRHluYW1pYy1BZGRyZXNzLUZsYWctRXh0ZW5zaW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQRE4tQ29ubmVjdGlvbi1DaGFyZ2luZy1JRCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiM0dQUC1TR1NOLU1DQy1NTkMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJBSSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiM0dQUC1Vc2VyLUxvY2F0aW9uLUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkZpeGVkLVVzZXItTG9jYXRpb24tSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVXNlci1DU0ctSW5mb3JtYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlRXQU4tSWRlbnRpZmllciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiM0dQUC1NUy1UaW1lWm9uZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiM0dQUC1DaGFyZ2luZy1DaGFyYWN0ZXJpc3RpY3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQ2FsbGVkLVN0YXRpb24tSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNoYXJnaW5nLUluZm9ybWF0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJPbmxpbmUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk9mZmxpbmUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFEQy1SdWxlLUluc3RhbGwifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJldmFsaWRhdGlvbi1UaW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJVc2FnZS1Nb25pdG9yaW5nLUluZm9ybWF0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDU0ctSW5mb3JtYXRpb24tUmVwb3J0aW5nIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJFdmVudC1UcmlnZ2VyIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQcmVzZW5jZS1SZXBvcnRpbmctQXJlYS1JbmZvcm1hdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEzMDE5LCAuYXZwX25hbWUgPSAiTG9naWNhbC1BY2Nlc3MtSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMzAxOSwgLmF2cF9uYW1lID0gIlBoeXNpY2FsLUFjY2Vzcy1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDU1MzUsIC5hdnBfbmFtZSA9ICIzR1BQMi1CU0lEIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlByb3h5LUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUm91dGUtUmVjb3JkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyhydWxlcywgY21kKTsKKwkgIH0KKwkgIC8qIFRTLUFuc3dlciAqLworCSAgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJUUy1BbnN3ZXIiLCAmY21kKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlNlc3Npb24tSWQifSwgUlVMRV9GSVhFRF9IRUFELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEUk1QIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlZlbmRvci1TcGVjaWZpYy1BcHBsaWNhdGlvbi1JZCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tSG9zdCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUmVzdWx0LUNvZGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRXhwZXJpbWVudGFsLVJlc3VsdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tU3RhdGUtSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT0MtU3VwcG9ydGVkLUZlYXR1cmVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9DLU9MUiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU3VwcG9ydGVkLUZlYXR1cmVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBREMtUnVsZS1SZXBvcnQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkV2ZW50LVJlcG9ydC1JbmRpY2F0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkVycm9yLU1lc3NhZ2UifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRXJyb3ItUmVwb3J0aW5nLUhvc3QifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRmFpbGVkLUFWUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJQcm94eS1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJvdXRlLVJlY29yZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJMb2FkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyhydWxlcywgY21kKTsKKwkgIH0KKwkgIC8qIENyZWRpdC1Db250cm9sLVJlcXVlc3QgKi8KKwkgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX0NPTU1BTkQsIENNRF9CWV9OQU1FLCAiQ3JlZGl0LUNvbnRyb2wtUmVxdWVzdCIsICZjbWQpCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU2Vzc2lvbi1JZCJ9LCBSVUxFX0ZJWEVEX0hFQUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRSTVAifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQXV0aC1BcHBsaWNhdGlvbi1JZCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tSG9zdCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRGVzdGluYXRpb24tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT0MtU3VwcG9ydGVkLUZlYXR1cmVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkNDLVJlcXVlc3QtVHlwZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJDQy1SZXF1ZXN0LU51bWJlciJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ3JlZGl0LU1hbmFnZW1lbnQtU3RhdHVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRlc3RpbmF0aW9uLUhvc3QifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLVN0YXRlLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkZyYW1lZC1JUC1BZGRyZXNzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkZyYW1lZC1JUHY2LVByZWZpeCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQURDLVJ1bGUtUmVwb3J0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBcHBsaWNhdGlvbi1EZXRlY3Rpb24tSW5mb3JtYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkV2ZW50LVRyaWdnZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkV2ZW50LVJlcG9ydC1JbmRpY2F0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJVc2FnZS1Nb25pdG9yaW5nLUluZm9ybWF0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlByb3h5LUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUm91dGUtUmVjb3JkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTdXBwb3J0ZWQtRmVhdHVyZXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKHJ1bGVzLCBjbWQpOworCSAgfQorCSAgLyogQ3JlZGl0LUNvbnRyb2wtQW5zd2VyICovCisJICB7CisJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIkNyZWRpdC1Db250cm9sLUFuc3dlciIsICZjbWQpCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU2Vzc2lvbi1JZCJ9LCBSVUxFX0ZJWEVEX0hFQUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRSTVAifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQXV0aC1BcHBsaWNhdGlvbi1JZCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tSG9zdCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUmVzdWx0LUNvZGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRXhwZXJpbWVudGFsLVJlc3VsdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJDQy1SZXF1ZXN0LVR5cGUifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQ0MtUmVxdWVzdC1OdW1iZXIifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT0MtU3VwcG9ydGVkLUZlYXR1cmVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9DLU9MUiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJGcmFtZWQtSVB2Ni1QcmVmaXgifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlFvUy1JbmZvcm1hdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRXZlbnQtVHJpZ2dlciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRXZlbnQtUmVwb3J0LUluZGljYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLVN0YXRlLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJlZGlyZWN0LUhvc3QifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUmVkaXJlY3QtSG9zdC1Vc2FnZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSZWRpcmVjdC1NYXgtQ2FjaGUtVGltZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQURDLVJ1bGUtUmVtb3ZlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBREMtUnVsZS1JbnN0YWxsIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJSZXZhbGlkYXRpb24tVGltZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVXNhZ2UtTW9uaXRvcmluZy1JbmZvcm1hdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJFcnJvci1NZXNzYWdlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkVycm9yLVJlcG9ydGluZy1Ib3N0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkZhaWxlZC1BVlAifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUHJveHktSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSb3V0ZS1SZWNvcmQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlN1cHBvcnRlZC1GZWF0dXJlcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJMb2FkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyhydWxlcywgY21kKTsKKwkgIH0KKwkgIC8qIFJlLUF1dGgtUmVxdWVzdCAqLworCSAgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJSZS1BdXRoLVJlcXVlc3QiLCAmY21kKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlNlc3Npb24tSWQifSwgUlVMRV9GSVhFRF9IRUFELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEUk1QIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkF1dGgtQXBwbGljYXRpb24tSWQifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLUhvc3QifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLVJlYWxtIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRlc3RpbmF0aW9uLVJlYWxtIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRlc3RpbmF0aW9uLUhvc3QifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUmUtQXV0aC1SZXF1ZXN0LVR5cGUifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNlc3Npb24tUmVsZWFzZS1DYXVzZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tU3RhdGUtSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT0MtU3VwcG9ydGVkLUZlYXR1cmVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJRb1MtSW5mb3JtYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkV2ZW50LVRyaWdnZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkV2ZW50LVJlcG9ydC1JbmRpY2F0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBREMtUnVsZS1SZW1vdmUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFEQy1SdWxlLUluc3RhbGwifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJldmFsaWRhdGlvbi1UaW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJVc2FnZS1Nb25pdG9yaW5nLUluZm9ybWF0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlByb3h5LUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUm91dGUtUmVjb3JkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyhydWxlcywgY21kKTsKKwkgIH0KKwkgIC8qIFJlLUF1dGgtQW5zd2VyICovCisJICB7CisJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIlJlLUF1dGgtQW5zd2VyIiwgJmNtZCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTZXNzaW9uLUlkIn0sIFJVTEVfRklYRURfSEVBRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRFJNUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tSG9zdCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUmVzdWx0LUNvZGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRXhwZXJpbWVudGFsLVJlc3VsdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tU3RhdGUtSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT0MtU3VwcG9ydGVkLUZlYXR1cmVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9DLU9MUiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQURDLVJ1bGUtUmVwb3J0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJFdmVudC1SZXBvcnQtSW5kaWNhdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJFcnJvci1NZXNzYWdlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkVycm9yLVJlcG9ydGluZy1Ib3N0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkZhaWxlZC1BVlAifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUHJveHktSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJMb2FkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyhydWxlcywgY21kKTsKKwkgIH0KKworICAgfQorCisgICBMT0dfRCggIkV4dGVuc2lvbiAnRGljdGlvbmFyeSBkZWZpbml0aW9ucyBmb3IgU2QgKGUzMCknIGluaXRpYWxpemVkIik7CisgICByZXR1cm4gMDsKK30KKworaW50IGRpY3RfZW50cnkoY2hhciAqIGNvbmZmaWxlKQoreworCWRpY3Rfc2RfbG9hZF9kZWZzKGNvbmZmaWxlKTsKKwlyZXR1cm4gZGljdF9zZF9sb2FkX3J1bGVzKGNvbmZmaWxlKTsKK30KKworY29uc3QgY2hhciogZGljdF9zZF9wcm90b192ZXIoY2hhciAqIGNvbmZmaWxlKSB7CisJcmV0dXJuIHNkX3Byb3RvX3ZlcjsKK30KKworY29uc3QgZG91YmxlIGRpY3Rfc2RfZ2VuX3RzKGNoYXIgKiBjb25mZmlsZSkgeworCXJldHVybiBzZF9nZW5fZGF0ZTsKK30KKworRVhURU5TSU9OX0VOVFJZMigiZGljdF9zZCIsIGRpY3Rfc2RfbG9hZF9kZWZzLCBkaWN0X3NkX2xvYWRfcnVsZXMsICJkaWN0X3RzMzIyOTlfYXZwcyIsICJkaWN0X3RzMjkyMTJfYXZwcyIsICJkaWN0X3RzMjkyNzNfYXZwcyIsICJkaWN0X3RzMjkyMTRfYXZwcyIsICJkaWN0X3RzMjkyNzJfYXZwcyIsICJkaWN0X3RzMjkyMjlfYXZwcyIsICJkaWN0X3RzMjkwNjFfYXZwcyIsICJkaWN0X0NyZWRpdENvbnRyb2wiLCAiZGljdF9yZmM0MDA2YmlzX2F2cHMiLCAiZGljdF9kcmFmdGxvYWRfYXZwcyIsICJkaWN0X3JmYzc2ODNfYXZwcyIsICJkaWN0X3JmYzcxNTVfYXZwcyIsICJkaWN0X2V0c2kyODMwMzRfYXZwcyIsICJkaWN0XzNncHAyX2F2cHMiLCAiZGljdF9yZmM3OTQ0X2F2cHMiKTsKKworCisKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF9TaC9DTWFrZUxpc3RzLnR4dCBiL2V4dGVuc2lvbnMvZGljdF9TaC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjVlNmNiCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kaWN0X1NoL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTYgQEAKKyMgVGhlIGRpY3RfU2ggZXh0ZW5zaW9uCitQUk9KRUNUKCJkaWN0X1NoIGxpYnJhcnkgZ2VuZXJhdGVkIGJ5IEZkR2VuICIgQykKKworIyBDb21waWxlIGFzIGEgbW9kdWxlCitGRF9BRERfRVhURU5TSU9OKGRpY3RfU2ggZGljdF9TaC5jKQorCisKKyMjIyMKKyMjIElOU1RBTEwgc2VjdGlvbiAjIworCitJTlNUQUxMKFRBUkdFVFMgZGljdF9TaAorCUxJQlJBUlkgREVTVElOQVRJT04gJHtJTlNUQUxMX0VYVEVOU0lPTlNfU1VGRklYfQorQ09NUE9ORU5UIGZyZWVEaWFtZXRlci1kaWN0aW9uYXJ5LVNIKQorCisKKwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X1NoL1NoLmRpZCBiL2V4dGVuc2lvbnMvZGljdF9TaC9TaC5kaWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUyYjJhYwotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF9TaC9TaC5kaWQKQEAgLTAsMCArMSwxMCBAQAorZGljdF9ldHNpMjgzMDM0X2F2cHMKK2RpY3RfcmZjNDU5MF9hdnBzCitkaWN0X3JmYzQwMDRfYXZwcworZGljdF9yZmM3MTU1X2F2cHMKK2RpY3RfdHMyOTIyOV9hdnBzCitkaWN0X3JmYzc2ODNfYXZwcworZGljdF90czI5MzI5X2F2cHMKK2RpY3RfZHJhZnRsb2FkX2F2cHMKK2RpY3RfcmZjNzk0NF9hdnBzCitkaWN0X1NoCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfU2gvZGljdF9TaC5jIGIvZXh0ZW5zaW9ucy9kaWN0X1NoL2RpY3RfU2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODdkZTJiCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kaWN0X1NoL2RpY3RfU2guYwpAQCAtMCwwICsxLDUxNiBAQAorLyoKKyogQ29weXJpZ2h0IChjKSAyMDE3IFNwcmludAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvKioqKioqKioqKioqKioqKgorIEdlbmVyYXRlZCBCeTogZmR0b29sIGVuaGFuY2VtZW50cyB0byBkaWFmdXp6ZXIKKyBMaWNlbnNlOiBzYW1lIGFzIGZyZWVEaWFtZXRlcgorKioqKioqKioqKioqKioqKi8KKworCisvKiAKKyAqIERpY3Rpb25hcnkgZGVmaW5pdGlvbnMgb2Ygb2JqZWN0cyBzcGVjaWZpZWQgaW4gU2ggKGUyMCkuCisgKi8KKyNpbmNsdWRlIDxmcmVlRGlhbWV0ZXIvZXh0ZW5zaW9uLmg+CisKKyNkZWZpbmUgUFJPVE9fVkVSICJlMjAiCisjZGVmaW5lIEdFTl9EQVRFICAxNTA2Njk3MjEyLjMxCisKK2NvbnN0IGNoYXIgKnNoX3Byb3RvX3ZlciA9IFBST1RPX1ZFUjsKK2NvbnN0IGRvdWJsZSBzaF9nZW5fZGF0ZSA9IEdFTl9EQVRFOworCisvKiBUaGUgY29udGVudCBvZiB0aGlzIGZpbGUgZm9sbG93cyB0aGUgc2FtZSBzdHJ1Y3R1cmUgYXMgZGljdF9iYXNlX3Byb3RvLmMgKi8KKworI2RlZmluZSBDSEVDS19kaWN0X25ldyggX3R5cGUsIF9kYXRhLCBfcGFyZW50LCBfcmVmICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBfcmV0ID0gZmRfZGljdF9uZXcoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgKF90eXBlKSwgKF9kYXRhKSwgKF9wYXJlbnQpLCAoX3JlZikgKTsgXAorICAgIGlmICggX3JldCAhPSAwICYmIF9yZXQgIT0gRUVYSVNUICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHJldHVybiBfcmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIENIRUNLX2RpY3Rfc2VhcmNoKCBfdHlwZSwgX2NyaXRlcmlhLCBfd2hhdCwgX3Jlc3VsdCApCQlcCisgICAgQ0hFQ0tfRkNUKCAgZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgKF90eXBlKSwgKF9jcml0ZXJpYSksIChfd2hhdCksIChfcmVzdWx0KSwgRU5PRU5UKSApOworCitzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiB7CisgICAgc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWU7CisgICAgZW51bSBydWxlX3Bvc2l0aW9uCXBvc2l0aW9uOworICAgIGludCAJCQltaW47CisgICAgaW50CQkJbWF4OworfTsKKworI2RlZmluZSBSVUxFX09SREVSKCBfcG9zaXRpb24gKSAoKCgoX3Bvc2l0aW9uKSA9PSBSVUxFX0ZJWEVEX0hFQUQpIHx8ICgoX3Bvc2l0aW9uKSA9PSBSVUxFX0ZJWEVEX1RBSUwpKSA/IDEgOiAwICkKKworLyogQXR0ZW50aW9uISBUaGlzIHZlcnNpb24gb2YgdGhlIG1hY3JvIHVzZXMgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgaW4gY29udHJhc3QgdG8gbW9zdCBvdGhlciBjb3BpZXMhICovCisjZGVmaW5lIFBBUlNFX2xvY19ydWxlcyggX3J1bGVhcnJheSwgX3BhcmVudCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IF9fYXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKF9fYXI9MDsgX19hciA8IHNpemVvZihfcnVsZWFycmF5KSAvIHNpemVvZigoX3J1bGVhcnJheSlbMF0pOyBfX2FyKyspIHsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgc3RydWN0IGRpY3RfcnVsZV9kYXRhIF9fZGF0YSA9IHsgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5wb3NpdGlvbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ubWluLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5tYXh9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIF9fZGF0YS5ydWxlX29yZGVyID0gUlVMRV9PUkRFUihfX2RhdGEucnVsZV9wb3NpdGlvbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgQ0hFQ0tfRkNUKCAgZmRfZGljdF9zZWFyY2goICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgRElDVF9BVlAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICYoX3J1bGVhcnJheSlbX19hcl0uYXZwX3ZlbmRvcl9wbHVzX25hbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgJl9fZGF0YS5ydWxlX2F2cCwgMCApICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYgKCAhX19kYXRhLnJ1bGVfYXZwICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFX0RFQlVHKElORk8sICJBVlAgTm90IGZvdW5kOiAnJXMnIiwgKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLmF2cF9uYW1lKTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVOT0VOVDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBfcmV0ID0gZmRfZGljdF9uZXcoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9SVUxFLCAmKF9fZGF0YSksIChfcGFyZW50KSwgTlVMTCApOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBfcmV0ICE9IDAgJiYgX3JldCAhPSBFRVhJU1QgKSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfREVCVUcoSU5GTywgIkVycm9yIG9uIHJ1bGUgd2l0aCBBVlAgJyVzJyIsICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0uYXZwX3ZlbmRvcl9wbHVzX25hbWUuYXZwX25hbWUpOyAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFSU5WQUw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBDSEVDS192ZW5kb3JfbmV3KCBfZGF0YSApIHsgXAorICAgICAgICBzdHJ1Y3QgZGljdF9vYmplY3QgKiB2ZW5kb3JfZm91bmQ7IFwKKyAgICAgICAgaWYgKGZkX2RpY3Rfc2VhcmNoKGZkX2dfY29uZmlnLT5jbmZfZGljdCxESUNUX1ZFTkRPUixWRU5ET1JfQllfSUQsJl9kYXRhLnZlbmRvcl9pZCwmdmVuZG9yX2ZvdW5kLEVOT0VOVCkgPT0gRU5PRU5UKSB7IFwKKyAgICAgICAgICAgICAgICBDSEVDS19GQ1QoZmRfZGljdF9uZXcoZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1ZFTkRPUiwgJl9kYXRhLCBOVUxMLCBOVUxMKSk7IFwKKyAgICAgICAgfSBcCit9CisKKyNkZWZpbmUgZW51bXZhbF9kZWZfdTMyKCBfdmFsXywgX3N0cl8gKQkJXAorICAgIHsgX3N0cl8sIAkJeyAudTMyID0gX3ZhbF8gfX0KKworI2RlZmluZSBlbnVtdmFsX2RlZl9vcyggX2xlbl8sIF92YWxfLCBfc3RyXyApCQkJCVwKKyAgICB7IF9zdHJfLCAJCXsgLm9zID0geyAuZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopX3ZhbF8sIC5sZW4gPSBfbGVuXyB9fX0KKworCitzdGF0aWMgaW50IGRpY3Rfc2hfbG9hZF9kZWZzKGNoYXIgKiBjb25mZmlsZSkKK3sKKyAgIFRSQUNFX0VOVFJZKCIlcCIsIGNvbmZmaWxlKTsKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhcHBfaWQxNjc3NzIxNzsKKworCS8qIEFwcGxpY2F0aW9uIFNlY3Rpb24gKi8KKwl7CisJICB7CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiB2ZW5kb3I7CisJCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX1ZFTkRPUiwgVkVORE9SX0JZX05BTUUsICIzR1BQIiwgJnZlbmRvcikKKwkJCXN0cnVjdCBkaWN0X2FwcGxpY2F0aW9uX2RhdGEgZGF0YSA9IHsgMTY3NzcyMTcsICJTaCIgfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FQUExJQ0FUSU9OLCAmZGF0YSwgdmVuZG9yLCAmYXBwX2lkMTY3NzcyMTcpCisJICB9CisJICAvKiBSZXN1bHQgY29kZXMgKi8KKwkgIHsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqdHlwZTsKKwkJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiRW51bWVyYXRlZChSZXN1bHQtQ29kZSkiLCZ0eXBlKTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAidXNlZF9pbl9TaCIsIHsgLnUzMj0xIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJDb21tYW5kX0NvZGVfdmFsdWVzIiwgeyAudTMyPTMgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMyA9IHsgIkFwcGxpY2F0aW9uX0lEX3ZhbHVlIiwgeyAudTMyPTQgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNCA9IHsgIlNwZWNpYWxfUmVxdWlyZW1lbnRzIiwgeyAudTMyPTcgfX07CisKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzQsIHR5cGUsIE5VTEwpOworCisJICB9CisJfQorCisKKyAgIC8qIEFWUCBzZWN0aW9uICovCisgICB7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIEFkZHJlc3NfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogVVRGOFN0cmluZ190eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBEaWFtZXRlcklkZW50aXR5X3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIERpYW1ldGVyVVJJX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIFRpbWVfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogSVBGaWx0ZXJSdWxlX3R5cGU7CisKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiQWRkcmVzcyIsICZBZGRyZXNzX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJVVEY4U3RyaW5nIiwgJlVURjhTdHJpbmdfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkRpYW1ldGVySWRlbnRpdHkiLCAmRGlhbWV0ZXJJZGVudGl0eV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiRGlhbWV0ZXJVUkkiLCAmRGlhbWV0ZXJVUklfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIlRpbWUiLCAmVGltZV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiSVBGaWx0ZXJSdWxlIiwgJklQRmlsdGVyUnVsZV90eXBlKTsKKworCQorICAgfQorCisgICAvKiBDb21tYW5kcyBzZWN0aW9uICovCisgICB7CisJCS8qIFVzZXItRGF0YS1SZXF1ZXN0ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQkJc3RydWN0IGRpY3RfY21kX2RhdGEgZGF0YSA9IHsKKwkJCQkzMDYsCS8qIENvZGUgKi8KKwkJCQkiVXNlci1EYXRhLVJlcXVlc3QiLAkvKiBOYW1lICovCisJCQkJQ01EX0ZMQUdfUkVRVUVTVCB8IENNRF9GTEFHX0VSUk9SLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUNNRF9GTEFHX1JFUVVFU1QgfCBDTURfRkxBR19QUk9YSUFCTEUsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQl9OworCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9DT01NQU5ELCAmZGF0YSAsIGFwcF9pZDE2Nzc3MjE3LCAmY21kKQorCQl9CisJCS8qIFVzZXItRGF0YS1BbnN3ZXIgKi8KKwkJeworCQkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCQlzdHJ1Y3QgZGljdF9jbWRfZGF0YSBkYXRhID0geworCQkJCTMwNiwJLyogQ29kZSAqLworCQkJCSJVc2VyLURhdGEtQW5zd2VyIiwJLyogTmFtZSAqLworCQkJCUNNRF9GTEFHX1JFUVVFU1QsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQ01EX0ZMQUdfUFJPWElBQkxFLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJfTsKKworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQ09NTUFORCwgJmRhdGEgLCBhcHBfaWQxNjc3NzIxNywgJmNtZCkKKwkJfQorCQkvKiBQcm9maWxlLVVwZGF0ZS1SZXF1ZXN0ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQkJc3RydWN0IGRpY3RfY21kX2RhdGEgZGF0YSA9IHsKKwkJCQkzMDcsCS8qIENvZGUgKi8KKwkJCQkiUHJvZmlsZS1VcGRhdGUtUmVxdWVzdCIsCS8qIE5hbWUgKi8KKwkJCQlDTURfRkxBR19SRVFVRVNUIHwgQ01EX0ZMQUdfRVJST1IsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQ01EX0ZMQUdfUkVRVUVTVCB8IENNRF9GTEFHX1BST1hJQUJMRSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCX07CisKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0NPTU1BTkQsICZkYXRhICwgYXBwX2lkMTY3NzcyMTcsICZjbWQpCisJCX0KKwkJLyogUHJvZmlsZS1VcGRhdGUtQW5zd2VyICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQkJc3RydWN0IGRpY3RfY21kX2RhdGEgZGF0YSA9IHsKKwkJCQkzMDcsCS8qIENvZGUgKi8KKwkJCQkiUHJvZmlsZS1VcGRhdGUtQW5zd2VyIiwJLyogTmFtZSAqLworCQkJCUNNRF9GTEFHX1JFUVVFU1QsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQ01EX0ZMQUdfUFJPWElBQkxFLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJfTsKKworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQ09NTUFORCwgJmRhdGEgLCBhcHBfaWQxNjc3NzIxNywgJmNtZCkKKwkJfQorCQkvKiBTdWJzY3JpYmUtTm90aWZpY2F0aW9ucy1SZXF1ZXN0ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQkJc3RydWN0IGRpY3RfY21kX2RhdGEgZGF0YSA9IHsKKwkJCQkzMDgsCS8qIENvZGUgKi8KKwkJCQkiU3Vic2NyaWJlLU5vdGlmaWNhdGlvbnMtUmVxdWVzdCIsCS8qIE5hbWUgKi8KKwkJCQlDTURfRkxBR19SRVFVRVNUIHwgQ01EX0ZMQUdfRVJST1IsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQ01EX0ZMQUdfUkVRVUVTVCB8IENNRF9GTEFHX1BST1hJQUJMRSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCX07CisKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0NPTU1BTkQsICZkYXRhICwgYXBwX2lkMTY3NzcyMTcsICZjbWQpCisJCX0KKwkJLyogU3Vic2NyaWJlLU5vdGlmaWNhdGlvbnMtQW5zd2VyICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQkJc3RydWN0IGRpY3RfY21kX2RhdGEgZGF0YSA9IHsKKwkJCQkzMDgsCS8qIENvZGUgKi8KKwkJCQkiU3Vic2NyaWJlLU5vdGlmaWNhdGlvbnMtQW5zd2VyIiwJLyogTmFtZSAqLworCQkJCUNNRF9GTEFHX1JFUVVFU1QsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQ01EX0ZMQUdfUFJPWElBQkxFLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJfTsKKworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQ09NTUFORCwgJmRhdGEgLCBhcHBfaWQxNjc3NzIxNywgJmNtZCkKKwkJfQorCQkvKiBQdXNoLU5vdGlmaWNhdGlvbi1SZXF1ZXN0ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQkJc3RydWN0IGRpY3RfY21kX2RhdGEgZGF0YSA9IHsKKwkJCQkzMDksCS8qIENvZGUgKi8KKwkJCQkiUHVzaC1Ob3RpZmljYXRpb24tUmVxdWVzdCIsCS8qIE5hbWUgKi8KKwkJCQlDTURfRkxBR19SRVFVRVNUIHwgQ01EX0ZMQUdfRVJST1IsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQ01EX0ZMQUdfUkVRVUVTVCB8IENNRF9GTEFHX1BST1hJQUJMRSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCX07CisKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0NPTU1BTkQsICZkYXRhICwgYXBwX2lkMTY3NzcyMTcsICZjbWQpCisJCX0KKwkJLyogUHVzaC1Ob3RpZmljYXRpb24tQW5zd2VyICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQkJc3RydWN0IGRpY3RfY21kX2RhdGEgZGF0YSA9IHsKKwkJCQkzMDksCS8qIENvZGUgKi8KKwkJCQkiUHVzaC1Ob3RpZmljYXRpb24tQW5zd2VyIiwJLyogTmFtZSAqLworCQkJCUNNRF9GTEFHX1JFUVVFU1QsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQ01EX0ZMQUdfUFJPWElBQkxFLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJfTsKKworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQ09NTUFORCwgJmRhdGEgLCBhcHBfaWQxNjc3NzIxNywgJmNtZCkKKwkJfQorCisgICB9CisKKyAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRpY3Rfc2hfbG9hZF9ydWxlcyhjaGFyICogY29uZmZpbGUpCit7CisgICAvKiBHcm91cGVkIEFWUCBzZWN0aW9uICovCisgICB7CisKKyAgIH0JCisKKyAgIC8qIENvbW1hbmRzIHNlY3Rpb24gKi8KKyAgIHsKKwkgIC8qIFVzZXItRGF0YS1SZXF1ZXN0ICovCisJICB7CisJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIlVzZXItRGF0YS1SZXF1ZXN0IiwgJmNtZCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTZXNzaW9uLUlkIn0sIFJVTEVfRklYRURfSEVBRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRFJNUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJWZW5kb3ItU3BlY2lmaWMtQXBwbGljYXRpb24tSWQifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQXV0aC1TZXNzaW9uLVN0YXRlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1Ib3N0In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEZXN0aW5hdGlvbi1Ib3N0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRlc3RpbmF0aW9uLVJlYWxtIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTdXBwb3J0ZWQtRmVhdHVyZXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlVzZXItSWRlbnRpdHkifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIldpbGRjYXJkZWQtUHVibGljLUlkZW50aXR5In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJXaWxkY2FyZGVkLUlNUFUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNlcnZlci1OYW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTZXJ2aWNlLUluZGljYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkRhdGEtUmVmZXJlbmNlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJJZGVudGl0eS1TZXQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJlcXVlc3RlZC1Eb21haW4ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkN1cnJlbnQtTG9jYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkRTQUktVGFnIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTZXNzaW9uLVByaW9yaXR5In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlVzZXItTmFtZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUmVxdWVzdGVkLU5vZGVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTZXJ2aW5nLU5vZGUtSW5kaWNhdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUHJlLXBhZ2luZy1TdXBwb3J0ZWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkxvY2FsLVRpbWUtWm9uZS1JbmRpY2F0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJVRFItRmxhZ3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNhbGwtUmVmZXJlbmNlLUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT0MtU3VwcG9ydGVkLUZlYXR1cmVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlByb3h5LUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUm91dGUtUmVjb3JkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyhydWxlcywgY21kKTsKKwkgIH0KKwkgIC8qIFVzZXItRGF0YS1BbnN3ZXIgKi8KKwkgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX0NPTU1BTkQsIENNRF9CWV9OQU1FLCAiVXNlci1EYXRhLUFuc3dlciIsICZjbWQpCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU2Vzc2lvbi1JZCJ9LCBSVUxFX0ZJWEVEX0hFQUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRSTVAifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVmVuZG9yLVNwZWNpZmljLUFwcGxpY2F0aW9uLUlkIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJlc3VsdC1Db2RlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkV4cGVyaW1lbnRhbC1SZXN1bHQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQXV0aC1TZXNzaW9uLVN0YXRlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1Ib3N0In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU3VwcG9ydGVkLUZlYXR1cmVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJXaWxkY2FyZGVkLVB1YmxpYy1JZGVudGl0eSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiV2lsZGNhcmRlZC1JTVBVIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJVc2VyLURhdGEifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT0MtU3VwcG9ydGVkLUZlYXR1cmVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9DLU9MUiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJMb2FkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkZhaWxlZC1BVlAifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUHJveHktSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSb3V0ZS1SZWNvcmQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKHJ1bGVzLCBjbWQpOworCSAgfQorCSAgLyogUHJvZmlsZS1VcGRhdGUtUmVxdWVzdCAqLworCSAgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJQcm9maWxlLVVwZGF0ZS1SZXF1ZXN0IiwgJmNtZCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTZXNzaW9uLUlkIn0sIFJVTEVfRklYRURfSEVBRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRFJNUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJWZW5kb3ItU3BlY2lmaWMtQXBwbGljYXRpb24tSWQifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQXV0aC1TZXNzaW9uLVN0YXRlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1Ib3N0In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEZXN0aW5hdGlvbi1Ib3N0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRlc3RpbmF0aW9uLVJlYWxtIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTdXBwb3J0ZWQtRmVhdHVyZXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlVzZXItSWRlbnRpdHkifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIldpbGRjYXJkZWQtUHVibGljLUlkZW50aXR5In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJXaWxkY2FyZGVkLUlNUFUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVXNlci1OYW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJEYXRhLVJlZmVyZW5jZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVXNlci1EYXRhIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9DLVN1cHBvcnRlZC1GZWF0dXJlcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJQcm94eS1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJvdXRlLVJlY29yZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMocnVsZXMsIGNtZCk7CisJICB9CisJICAvKiBQcm9maWxlLVVwZGF0ZS1BbnN3ZXIgKi8KKwkgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX0NPTU1BTkQsIENNRF9CWV9OQU1FLCAiUHJvZmlsZS1VcGRhdGUtQW5zd2VyIiwgJmNtZCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTZXNzaW9uLUlkIn0sIFJVTEVfRklYRURfSEVBRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRFJNUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJWZW5kb3ItU3BlY2lmaWMtQXBwbGljYXRpb24tSWQifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUmVzdWx0LUNvZGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRXhwZXJpbWVudGFsLVJlc3VsdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBdXRoLVNlc3Npb24tU3RhdGUifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLUhvc3QifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLVJlYWxtIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJXaWxkY2FyZGVkLVB1YmxpYy1JZGVudGl0eSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiV2lsZGNhcmRlZC1JTVBVIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJSZXBvc2l0b3J5LURhdGEtSUQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkRhdGEtUmVmZXJlbmNlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTdXBwb3J0ZWQtRmVhdHVyZXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT0MtU3VwcG9ydGVkLUZlYXR1cmVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9DLU9MUiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJMb2FkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkZhaWxlZC1BVlAifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUHJveHktSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSb3V0ZS1SZWNvcmQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKHJ1bGVzLCBjbWQpOworCSAgfQorCSAgLyogU3Vic2NyaWJlLU5vdGlmaWNhdGlvbnMtUmVxdWVzdCAqLworCSAgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJTdWJzY3JpYmUtTm90aWZpY2F0aW9ucy1SZXF1ZXN0IiwgJmNtZCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTZXNzaW9uLUlkIn0sIFJVTEVfRklYRURfSEVBRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRFJNUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJWZW5kb3ItU3BlY2lmaWMtQXBwbGljYXRpb24tSWQifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQXV0aC1TZXNzaW9uLVN0YXRlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1Ib3N0In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEZXN0aW5hdGlvbi1Ib3N0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRlc3RpbmF0aW9uLVJlYWxtIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTdXBwb3J0ZWQtRmVhdHVyZXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlVzZXItSWRlbnRpdHkifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIldpbGRjYXJkZWQtUHVibGljLUlkZW50aXR5In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJXaWxkY2FyZGVkLUlNUFUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNlcnZpY2UtSW5kaWNhdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU2VuZC1EYXRhLUluZGljYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNlcnZlci1OYW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTdWJzLVJlcS1UeXBlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJEYXRhLVJlZmVyZW5jZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiSWRlbnRpdHktU2V0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJFeHBpcnktVGltZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRFNBSS1UYWcifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk9uZS1UaW1lLU5vdGlmaWNhdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJVc2VyLU5hbWUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT0MtU3VwcG9ydGVkLUZlYXR1cmVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlByb3h5LUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUm91dGUtUmVjb3JkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyhydWxlcywgY21kKTsKKwkgIH0KKwkgIC8qIFN1YnNjcmliZS1Ob3RpZmljYXRpb25zLUFuc3dlciAqLworCSAgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJTdWJzY3JpYmUtTm90aWZpY2F0aW9ucy1BbnN3ZXIiLCAmY21kKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlNlc3Npb24tSWQifSwgUlVMRV9GSVhFRF9IRUFELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEUk1QIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlZlbmRvci1TcGVjaWZpYy1BcHBsaWNhdGlvbi1JZCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBdXRoLVNlc3Npb24tU3RhdGUifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUmVzdWx0LUNvZGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRXhwZXJpbWVudGFsLVJlc3VsdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tSG9zdCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIldpbGRjYXJkZWQtUHVibGljLUlkZW50aXR5In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJXaWxkY2FyZGVkLUlNUFUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlN1cHBvcnRlZC1GZWF0dXJlcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVXNlci1EYXRhIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJFeHBpcnktVGltZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPQy1TdXBwb3J0ZWQtRmVhdHVyZXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT0MtT0xSIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkxvYWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRmFpbGVkLUFWUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJQcm94eS1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJvdXRlLVJlY29yZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMocnVsZXMsIGNtZCk7CisJICB9CisJICAvKiBQdXNoLU5vdGlmaWNhdGlvbi1SZXF1ZXN0ICovCisJICB7CisJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIlB1c2gtTm90aWZpY2F0aW9uLVJlcXVlc3QiLCAmY21kKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlNlc3Npb24tSWQifSwgUlVMRV9GSVhFRF9IRUFELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEUk1QIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlZlbmRvci1TcGVjaWZpYy1BcHBsaWNhdGlvbi1JZCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBdXRoLVNlc3Npb24tU3RhdGUifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLUhvc3QifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLVJlYWxtIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRlc3RpbmF0aW9uLUhvc3QifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRGVzdGluYXRpb24tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlN1cHBvcnRlZC1GZWF0dXJlcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVXNlci1JZGVudGl0eSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiV2lsZGNhcmRlZC1QdWJsaWMtSWRlbnRpdHkifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIldpbGRjYXJkZWQtSU1QVSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJVc2VyLU5hbWUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlVzZXItRGF0YSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJQcm94eS1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJvdXRlLVJlY29yZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMocnVsZXMsIGNtZCk7CisJICB9CisJICAvKiBQdXNoLU5vdGlmaWNhdGlvbi1BbnN3ZXIgKi8KKwkgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX0NPTU1BTkQsIENNRF9CWV9OQU1FLCAiUHVzaC1Ob3RpZmljYXRpb24tQW5zd2VyIiwgJmNtZCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTZXNzaW9uLUlkIn0sIFJVTEVfRklYRURfSEVBRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRFJNUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJWZW5kb3ItU3BlY2lmaWMtQXBwbGljYXRpb24tSWQifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUmVzdWx0LUNvZGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRXhwZXJpbWVudGFsLVJlc3VsdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBdXRoLVNlc3Npb24tU3RhdGUifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLUhvc3QifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLVJlYWxtIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTdXBwb3J0ZWQtRmVhdHVyZXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRmFpbGVkLUFWUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJQcm94eS1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJvdXRlLVJlY29yZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMocnVsZXMsIGNtZCk7CisJICB9CisKKyAgIH0KKworICAgTE9HX0QoICJFeHRlbnNpb24gJ0RpY3Rpb25hcnkgZGVmaW5pdGlvbnMgZm9yIFNoIChlMjApJyBpbml0aWFsaXplZCIpOworICAgcmV0dXJuIDA7Cit9CisKK2ludCBkaWN0X2VudHJ5KGNoYXIgKiBjb25mZmlsZSkKK3sKKwlkaWN0X3NoX2xvYWRfZGVmcyhjb25mZmlsZSk7CisJcmV0dXJuIGRpY3Rfc2hfbG9hZF9ydWxlcyhjb25mZmlsZSk7Cit9CisKK2NvbnN0IGNoYXIqIGRpY3Rfc2hfcHJvdG9fdmVyKGNoYXIgKiBjb25mZmlsZSkgeworCXJldHVybiBzaF9wcm90b192ZXI7Cit9CisKK2NvbnN0IGRvdWJsZSBkaWN0X3NoX2dlbl90cyhjaGFyICogY29uZmZpbGUpIHsKKwlyZXR1cm4gc2hfZ2VuX2RhdGU7Cit9CisKK0VYVEVOU0lPTl9FTlRSWTIoImRpY3Rfc2giLCBkaWN0X3NoX2xvYWRfZGVmcywgZGljdF9zaF9sb2FkX3J1bGVzLCAiZGljdF90czI5MzI5X2F2cHMiLCAiZGljdF90czI5MjI5X2F2cHMiLCAiZGljdF9kcmFmdGxvYWRfYXZwcyIsICJkaWN0X3JmYzc2ODNfYXZwcyIsICJkaWN0X3JmYzc5NDRfYXZwcyIpOworCisKKwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X1Q0L0NNYWtlTGlzdHMudHh0IGIvZXh0ZW5zaW9ucy9kaWN0X1Q0L0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxM2I4YmYKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfVDQvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxNiBAQAorIyBUaGUgZGljdF9UNCBleHRlbnNpb24KK1BST0pFQ1QoImRpY3RfVDQgbGlicmFyeSBnZW5lcmF0ZWQgYnkgRmRHZW4gIiBDKQorCisjIENvbXBpbGUgYXMgYSBtb2R1bGUKK0ZEX0FERF9FWFRFTlNJT04oZGljdF9UNCBkaWN0X1Q0LmMpCisKKworIyMjIworIyMgSU5TVEFMTCBzZWN0aW9uICMjCisKK0lOU1RBTEwoVEFSR0VUUyBkaWN0X1Q0CisJTElCUkFSWSBERVNUSU5BVElPTiAke0lOU1RBTExfRVhURU5TSU9OU19TVUZGSVh9CitDT01QT05FTlQgZnJlZURpYW1ldGVyLWRpY3Rpb25hcnktZGljdF9UNCkKKworCisKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF9UNC9UNC5kaWQgYi9leHRlbnNpb25zL2RpY3RfVDQvVDQuZGlkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZDdmY2IKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfVDQvVDQuZGlkCkBAIC0wLDAgKzEsMzggQEAKK2RpY3RfcmZjNjk0Ml9hdnBzCitkaWN0X3RzMjk0NjhfYXZwcworZGljdF90czI5MTU0X2F2cHMKK2RpY3RfdHMyOTIxNF9hdnBzCitkaWN0X3RzMjkyMTVfYXZwcworZGljdF90czI5MjE3X2F2cHMKK2RpY3RfM2dwcDJfYXZwcworZGljdF90czI5MzM3X2F2cHMKK2RpY3RfdHMyOTM0M19hdnBzCitkaWN0X3RzMjkzMzhfYXZwcworZGljdF90czI5MTI4X2F2cHMKK2RpY3RfdHMyOTM0NF9hdnBzCitkaWN0X3RzMjkzNDVfYXZwcworZGljdF90czI5MTczX2F2cHMKK2RpY3RfdHMzMjI5OV9hdnBzCitkaWN0X3JmYzY3MzRfYXZwcworZGljdF9yZmM1NTgwX2F2cHMKK2RpY3RfcmZjNDA3Ml9hdnBzCitkaWN0X3RzMjkyNzNfYXZwcworZGljdF9yZmM0MDA2YmlzX2F2cHMKK2RpY3RfdHMyOTIxMl9hdnBzCitkaWN0X3RzMjkwNjFfYXZwcworZGljdF90czI5MjcyX2F2cHMKK2RpY3RfcmZjNTQ0N19hdnBzCitkaWN0X3JmYzU3NzhfYXZwcworZGljdF9yZmM1Nzc3X2F2cHMKK2RpY3RfdHMyOTMzNl9hdnBzCitkaWN0X2V0c2kyODMwMzRfYXZwcworZGljdF9yZmM0NTkwX2F2cHMKK2RpY3RfcmZjNDAwNF9hdnBzCitkaWN0X3JmYzcxNTVfYXZwcworZGljdF90czI5MjI5X2F2cHMKK2RpY3RfcmZjNzY4M19hdnBzCitkaWN0X2RyYWZ0bG9hZF9hdnBzCitkaWN0X3JmYzc5NDRfYXZwcworZGljdF90czI5MzI5X2F2cHMKK2RpY3RfdHMyOTM2OF9hdnBzCitkaWN0X1Q0CmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfVDQvZGljdF9UNC5jIGIvZXh0ZW5zaW9ucy9kaWN0X1Q0L2RpY3RfVDQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDJkZjU3Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kaWN0X1Q0L2RpY3RfVDQuYwpAQCAtMCwwICsxLDMzOCBAQAorLyoKKyogQ29weXJpZ2h0IChjKSAyMDE3IFNwcmludAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvKioqKioqKioqKioqKioqKgorIEdlbmVyYXRlZCBCeTogZmR0b29sIGVuaGFuY2VtZW50cyB0byBkaWFmdXp6ZXIKKyBMaWNlbnNlOiBzYW1lIGFzIGZyZWVEaWFtZXRlcgorKioqKioqKioqKioqKioqKi8KKworCisvKiAKKyAqIERpY3Rpb25hcnkgZGVmaW5pdGlvbnMgb2Ygb2JqZWN0cyBzcGVjaWZpZWQgaW4gVDQgKGUwMCkuCisgKi8KKyNpbmNsdWRlIDxmcmVlRGlhbWV0ZXIvZXh0ZW5zaW9uLmg+CisKKyNkZWZpbmUgUFJPVE9fVkVSICJlMDAiCisjZGVmaW5lIEdFTl9EQVRFICAxNTA2Njk3MjE5LjMxCisKK2NvbnN0IGNoYXIgKnQ0X3Byb3RvX3ZlciA9IFBST1RPX1ZFUjsKK2NvbnN0IGRvdWJsZSB0NF9nZW5fZGF0ZSA9IEdFTl9EQVRFOworCisvKiBUaGUgY29udGVudCBvZiB0aGlzIGZpbGUgZm9sbG93cyB0aGUgc2FtZSBzdHJ1Y3R1cmUgYXMgZGljdF9iYXNlX3Byb3RvLmMgKi8KKworI2RlZmluZSBDSEVDS19kaWN0X25ldyggX3R5cGUsIF9kYXRhLCBfcGFyZW50LCBfcmVmICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBfcmV0ID0gZmRfZGljdF9uZXcoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgKF90eXBlKSwgKF9kYXRhKSwgKF9wYXJlbnQpLCAoX3JlZikgKTsgXAorICAgIGlmICggX3JldCAhPSAwICYmIF9yZXQgIT0gRUVYSVNUICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHJldHVybiBfcmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIENIRUNLX2RpY3Rfc2VhcmNoKCBfdHlwZSwgX2NyaXRlcmlhLCBfd2hhdCwgX3Jlc3VsdCApCQlcCisgICAgQ0hFQ0tfRkNUKCAgZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgKF90eXBlKSwgKF9jcml0ZXJpYSksIChfd2hhdCksIChfcmVzdWx0KSwgRU5PRU5UKSApOworCitzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiB7CisgICAgc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWU7CisgICAgZW51bSBydWxlX3Bvc2l0aW9uCXBvc2l0aW9uOworICAgIGludCAJCQltaW47CisgICAgaW50CQkJbWF4OworfTsKKworI2RlZmluZSBSVUxFX09SREVSKCBfcG9zaXRpb24gKSAoKCgoX3Bvc2l0aW9uKSA9PSBSVUxFX0ZJWEVEX0hFQUQpIHx8ICgoX3Bvc2l0aW9uKSA9PSBSVUxFX0ZJWEVEX1RBSUwpKSA/IDEgOiAwICkKKworLyogQXR0ZW50aW9uISBUaGlzIHZlcnNpb24gb2YgdGhlIG1hY3JvIHVzZXMgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgaW4gY29udHJhc3QgdG8gbW9zdCBvdGhlciBjb3BpZXMhICovCisjZGVmaW5lIFBBUlNFX2xvY19ydWxlcyggX3J1bGVhcnJheSwgX3BhcmVudCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IF9fYXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKF9fYXI9MDsgX19hciA8IHNpemVvZihfcnVsZWFycmF5KSAvIHNpemVvZigoX3J1bGVhcnJheSlbMF0pOyBfX2FyKyspIHsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgc3RydWN0IGRpY3RfcnVsZV9kYXRhIF9fZGF0YSA9IHsgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5wb3NpdGlvbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ubWluLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5tYXh9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIF9fZGF0YS5ydWxlX29yZGVyID0gUlVMRV9PUkRFUihfX2RhdGEucnVsZV9wb3NpdGlvbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgQ0hFQ0tfRkNUKCAgZmRfZGljdF9zZWFyY2goICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgRElDVF9BVlAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICYoX3J1bGVhcnJheSlbX19hcl0uYXZwX3ZlbmRvcl9wbHVzX25hbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgJl9fZGF0YS5ydWxlX2F2cCwgMCApICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYgKCAhX19kYXRhLnJ1bGVfYXZwICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFX0RFQlVHKElORk8sICJBVlAgTm90IGZvdW5kOiAnJXMnIiwgKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLmF2cF9uYW1lKTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVOT0VOVDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBfcmV0ID0gZmRfZGljdF9uZXcoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9SVUxFLCAmKF9fZGF0YSksIChfcGFyZW50KSwgTlVMTCApOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBfcmV0ICE9IDAgJiYgX3JldCAhPSBFRVhJU1QgKSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfREVCVUcoSU5GTywgIkVycm9yIG9uIHJ1bGUgd2l0aCBBVlAgJyVzJyIsICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0uYXZwX3ZlbmRvcl9wbHVzX25hbWUuYXZwX25hbWUpOyAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFSU5WQUw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBDSEVDS192ZW5kb3JfbmV3KCBfZGF0YSApIHsgXAorICAgICAgICBzdHJ1Y3QgZGljdF9vYmplY3QgKiB2ZW5kb3JfZm91bmQ7IFwKKyAgICAgICAgaWYgKGZkX2RpY3Rfc2VhcmNoKGZkX2dfY29uZmlnLT5jbmZfZGljdCxESUNUX1ZFTkRPUixWRU5ET1JfQllfSUQsJl9kYXRhLnZlbmRvcl9pZCwmdmVuZG9yX2ZvdW5kLEVOT0VOVCkgPT0gRU5PRU5UKSB7IFwKKyAgICAgICAgICAgICAgICBDSEVDS19GQ1QoZmRfZGljdF9uZXcoZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1ZFTkRPUiwgJl9kYXRhLCBOVUxMLCBOVUxMKSk7IFwKKyAgICAgICAgfSBcCit9CisKKyNkZWZpbmUgZW51bXZhbF9kZWZfdTMyKCBfdmFsXywgX3N0cl8gKQkJXAorICAgIHsgX3N0cl8sIAkJeyAudTMyID0gX3ZhbF8gfX0KKworI2RlZmluZSBlbnVtdmFsX2RlZl9vcyggX2xlbl8sIF92YWxfLCBfc3RyXyApCQkJCVwKKyAgICB7IF9zdHJfLCAJCXsgLm9zID0geyAuZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopX3ZhbF8sIC5sZW4gPSBfbGVuXyB9fX0KKworCitzdGF0aWMgaW50IGRpY3RfdDRfbG9hZF9kZWZzKGNoYXIgKiBjb25mZmlsZSkKK3sKKyAgIFRSQUNFX0VOVFJZKCIlcCIsIGNvbmZmaWxlKTsKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhcHBfaWQxNjc3NzMxMTsKKworCS8qIEFwcGxpY2F0aW9uIFNlY3Rpb24gKi8KKwl7CisJICB7CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiB2ZW5kb3I7CisJCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX1ZFTkRPUiwgVkVORE9SX0JZX05BTUUsICIzR1BQIiwgJnZlbmRvcikKKwkJCXN0cnVjdCBkaWN0X2FwcGxpY2F0aW9uX2RhdGEgZGF0YSA9IHsgMTY3NzczMTEsICJUNCIgfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FQUExJQ0FUSU9OLCAmZGF0YSwgdmVuZG9yLCAmYXBwX2lkMTY3NzczMTEpCisJICB9CisJICAvKiBSZXN1bHQgY29kZXMgKi8KKwkgIHsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqdHlwZTsKKwkJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiRW51bWVyYXRlZChSZXN1bHQtQ29kZSkiLCZ0eXBlKTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiR2VuZXJhbCIsIHsgLnUzMj0xIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJTTVNfU0NfYW5kX01UQ19JV0ZfYmVoYXZpb3VyIiwgeyAudTMyPTIgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMyA9IHsgIlBlcm1hbmVudF9GYWlsdXJlcyIsIHsgLnUzMj0zIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzQgPSB7ICJWb2lkIiwgeyAudTMyPTQgfX07CisKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzQsIHR5cGUsIE5VTEwpOworCisJICB9CisJfQorCisKKyAgIC8qIEFWUCBzZWN0aW9uICovCisgICB7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIEFkZHJlc3NfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogVVRGOFN0cmluZ190eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBEaWFtZXRlcklkZW50aXR5X3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIERpYW1ldGVyVVJJX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIFRpbWVfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogSVBGaWx0ZXJSdWxlX3R5cGU7CisKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiQWRkcmVzcyIsICZBZGRyZXNzX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJVVEY4U3RyaW5nIiwgJlVURjhTdHJpbmdfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkRpYW1ldGVySWRlbnRpdHkiLCAmRGlhbWV0ZXJJZGVudGl0eV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiRGlhbWV0ZXJVUkkiLCAmRGlhbWV0ZXJVUklfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIlRpbWUiLCAmVGltZV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiSVBGaWx0ZXJSdWxlIiwgJklQRmlsdGVyUnVsZV90eXBlKTsKKworCQorICAgfQorCisgICAvKiBDb21tYW5kcyBzZWN0aW9uICovCisgICB7CisJCS8qIERldmljZS1UcmlnZ2VyLVJlcXVlc3QgKi8KKwkJeworCQkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCQlzdHJ1Y3QgZGljdF9jbWRfZGF0YSBkYXRhID0geworCQkJCTgzODg2NDMsCS8qIENvZGUgKi8KKwkJCQkiRGV2aWNlLVRyaWdnZXItUmVxdWVzdCIsCS8qIE5hbWUgKi8KKwkJCQlDTURfRkxBR19SRVFVRVNUIHwgQ01EX0ZMQUdfRVJST1IsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQ01EX0ZMQUdfUkVRVUVTVCB8IENNRF9GTEFHX1BST1hJQUJMRSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCX07CisKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0NPTU1BTkQsICZkYXRhICwgYXBwX2lkMTY3NzczMTEsICZjbWQpCisJCX0KKwkJLyogRGV2aWNlLVRyaWdnZXItQW5zd2VyICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQkJc3RydWN0IGRpY3RfY21kX2RhdGEgZGF0YSA9IHsKKwkJCQk4Mzg4NjQzLAkvKiBDb2RlICovCisJCQkJIkRldmljZS1UcmlnZ2VyLUFuc3dlciIsCS8qIE5hbWUgKi8KKwkJCQlDTURfRkxBR19SRVFVRVNULAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUNNRF9GTEFHX1BST1hJQUJMRSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCX07CisKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0NPTU1BTkQsICZkYXRhICwgYXBwX2lkMTY3NzczMTEsICZjbWQpCisJCX0KKwkJLyogRGVsaXZlcnktUmVwb3J0LVJlcXVlc3QgKi8KKwkJeworCQkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCQlzdHJ1Y3QgZGljdF9jbWRfZGF0YSBkYXRhID0geworCQkJCTgzODg2NDQsCS8qIENvZGUgKi8KKwkJCQkiRGVsaXZlcnktUmVwb3J0LVJlcXVlc3QiLAkvKiBOYW1lICovCisJCQkJQ01EX0ZMQUdfUkVRVUVTVCB8IENNRF9GTEFHX0VSUk9SLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUNNRF9GTEFHX1JFUVVFU1QgfCBDTURfRkxBR19QUk9YSUFCTEUsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQl9OworCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9DT01NQU5ELCAmZGF0YSAsIGFwcF9pZDE2Nzc3MzExLCAmY21kKQorCQl9CisJCS8qIERlbGl2ZXJ5LVJlcG9ydC1BbnN3ZXIgKi8KKwkJeworCQkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCQlzdHJ1Y3QgZGljdF9jbWRfZGF0YSBkYXRhID0geworCQkJCTgzODg2NDQsCS8qIENvZGUgKi8KKwkJCQkiRGVsaXZlcnktUmVwb3J0LUFuc3dlciIsCS8qIE5hbWUgKi8KKwkJCQlDTURfRkxBR19SRVFVRVNULAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUNNRF9GTEFHX1BST1hJQUJMRSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCX07CisKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0NPTU1BTkQsICZkYXRhICwgYXBwX2lkMTY3NzczMTEsICZjbWQpCisJCX0KKworICAgfQorCisgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkaWN0X3Q0X2xvYWRfcnVsZXMoY2hhciAqIGNvbmZmaWxlKQoreworICAgLyogR3JvdXBlZCBBVlAgc2VjdGlvbiAqLworICAgeworCisgICB9CQorCisgICAvKiBDb21tYW5kcyBzZWN0aW9uICovCisgICB7CisJICAvKiBEZXZpY2UtVHJpZ2dlci1SZXF1ZXN0ICovCisJICB7CisJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIkRldmljZS1UcmlnZ2VyLVJlcXVlc3QiLCAmY21kKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlNlc3Npb24tSWQifSwgUlVMRV9GSVhFRF9IRUFELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEUk1QIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkF1dGgtU2Vzc2lvbi1TdGF0ZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tSG9zdCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRGVzdGluYXRpb24tSG9zdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEZXN0aW5hdGlvbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVXNlci1JZGVudGlmaWVyIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTTS1SUC1TTUVBIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQYXlsb2FkIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTZXJ2aW5nLU5vZGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFkZGl0aW9uYWwtU2VydmluZy1Ob2RlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJSZWZlcmVuY2UtTnVtYmVyIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlZhbGlkaXR5LVRpbWUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlByaW9yaXR5LUluZGljYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFwcGxpY2F0aW9uLVBvcnQtSWRlbnRpZmllciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiT2xkLVJlZmVyZW5jZS1OdW1iZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlRyaWdnZXItQWN0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTdXBwb3J0ZWQtRmVhdHVyZXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUHJveHktSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSb3V0ZS1SZWNvcmQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKHJ1bGVzLCBjbWQpOworCSAgfQorCSAgLyogRGV2aWNlLVRyaWdnZXItQW5zd2VyICovCisJICB7CisJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIkRldmljZS1UcmlnZ2VyLUFuc3dlciIsICZjbWQpCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU2Vzc2lvbi1JZCJ9LCBSVUxFX0ZJWEVEX0hFQUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRSTVAifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVmVuZG9yLVNwZWNpZmljLUFwcGxpY2F0aW9uLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJlc3VsdC1Db2RlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkV4cGVyaW1lbnRhbC1SZXN1bHQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1UQy1FcnJvci1EaWFnbm9zdGljIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkF1dGgtU2Vzc2lvbi1TdGF0ZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tSG9zdCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk9sZC1SZWZlcmVuY2UtTnVtYmVyIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUcmlnZ2VyLUFjdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU3VwcG9ydGVkLUZlYXR1cmVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkZhaWxlZC1BVlAifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUHJveHktSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSb3V0ZS1SZWNvcmQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKHJ1bGVzLCBjbWQpOworCSAgfQorCSAgLyogRGVsaXZlcnktUmVwb3J0LVJlcXVlc3QgKi8KKwkgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX0NPTU1BTkQsIENNRF9CWV9OQU1FLCAiRGVsaXZlcnktUmVwb3J0LVJlcXVlc3QiLCAmY21kKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlNlc3Npb24tSWQifSwgUlVMRV9GSVhFRF9IRUFELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEUk1QIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkF1dGgtU2Vzc2lvbi1TdGF0ZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tSG9zdCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRGVzdGluYXRpb24tSG9zdCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEZXN0aW5hdGlvbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVXNlci1JZGVudGlmaWVyIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTTS1SUC1TTUVBIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTTS1EZWxpdmVyeS1PdXRjb21lLVQ0In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBYnNlbnQtU3Vic2NyaWJlci1EaWFnbm9zdGljLVQ0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJSZWZlcmVuY2UtTnVtYmVyIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTdXBwb3J0ZWQtRmVhdHVyZXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUHJveHktSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSb3V0ZS1SZWNvcmQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKHJ1bGVzLCBjbWQpOworCSAgfQorCSAgLyogRGVsaXZlcnktUmVwb3J0LUFuc3dlciAqLworCSAgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJEZWxpdmVyeS1SZXBvcnQtQW5zd2VyIiwgJmNtZCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTZXNzaW9uLUlkIn0sIFJVTEVfRklYRURfSEVBRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRFJNUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJWZW5kb3ItU3BlY2lmaWMtQXBwbGljYXRpb24tSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUmVzdWx0LUNvZGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRXhwZXJpbWVudGFsLVJlc3VsdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBdXRoLVNlc3Npb24tU3RhdGUifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLUhvc3QifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLVJlYWxtIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTdXBwb3J0ZWQtRmVhdHVyZXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRmFpbGVkLUFWUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJQcm94eS1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJvdXRlLVJlY29yZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMocnVsZXMsIGNtZCk7CisJICB9CisKKyAgIH0KKworICAgTE9HX0QoICJFeHRlbnNpb24gJ0RpY3Rpb25hcnkgZGVmaW5pdGlvbnMgZm9yIFQ0IChlMDApJyBpbml0aWFsaXplZCIpOworICAgcmV0dXJuIDA7Cit9CisKK2ludCBkaWN0X2VudHJ5KGNoYXIgKiBjb25mZmlsZSkKK3sKKwlkaWN0X3Q0X2xvYWRfZGVmcyhjb25mZmlsZSk7CisJcmV0dXJuIGRpY3RfdDRfbG9hZF9ydWxlcyhjb25mZmlsZSk7Cit9CisKK2NvbnN0IGNoYXIqIGRpY3RfdDRfcHJvdG9fdmVyKGNoYXIgKiBjb25mZmlsZSkgeworCXJldHVybiB0NF9wcm90b192ZXI7Cit9CisKK2NvbnN0IGRvdWJsZSBkaWN0X3Q0X2dlbl90cyhjaGFyICogY29uZmZpbGUpIHsKKwlyZXR1cm4gdDRfZ2VuX2RhdGU7Cit9CisKK0VYVEVOU0lPTl9FTlRSWTIoImRpY3RfdDQiLCBkaWN0X3Q0X2xvYWRfZGVmcywgZGljdF90NF9sb2FkX3J1bGVzLCAiZGljdF90czI5MzM3X2F2cHMiLCAiZGljdF90czI5MzM2X2F2cHMiLCAiZGljdF90czI5MzM4X2F2cHMiLCAiZGljdF90czI5MjcyX2F2cHMiLCAiZGljdF90czI5MzY4X2F2cHMiLCAiZGljdF90czI5MTczX2F2cHMiLCAiZGljdF90czI5MjI5X2F2cHMiLCAiZGljdF90czI5MzI5X2F2cHMiLCAiZGljdF9yZmM0MDA2YmlzX2F2cHMiLCAiZGljdF9yZmM3MTU1X2F2cHMiLCAiZGljdF9yZmM3OTQ0X2F2cHMiKTsKKworCisKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF9UNmFUNmJUNy9DTWFrZUxpc3RzLnR4dCBiL2V4dGVuc2lvbnMvZGljdF9UNmFUNmJUNy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjU1ZTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kaWN0X1Q2YVQ2YlQ3L0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTYgQEAKKyMgVGhlIGRpY3RfVDZhVDZiVDcgZXh0ZW5zaW9uCitQUk9KRUNUKCJkaWN0X1Q2YVQ2YlQ3IGxpYnJhcnkgZ2VuZXJhdGVkIGJ5IEZkR2VuICIgQykKKworIyBDb21waWxlIGFzIGEgbW9kdWxlCitGRF9BRERfRVhURU5TSU9OKGRpY3RfVDZhVDZiVDcgZGljdF9UNmFUNmJUNy5jKQorCisKKyMjIyMKKyMjIElOU1RBTEwgc2VjdGlvbiAjIworCitJTlNUQUxMKFRBUkdFVFMgZGljdF9UNmFUNmJUNworCUxJQlJBUlkgREVTVElOQVRJT04gJHtJTlNUQUxMX0VYVEVOU0lPTlNfU1VGRklYfQorQ09NUE9ORU5UIGZyZWVEaWFtZXRlci1kaWN0aW9uYXJ5LVQ2QVQ2QlQ3KQorCisKKwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X1Q2YVQ2YlQ3L1Q2YVQ2YlQ3LmRpZCBiL2V4dGVuc2lvbnMvZGljdF9UNmFUNmJUNy9UNmFUNmJUNy5kaWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EzOWFkNQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF9UNmFUNmJUNy9UNmFUNmJUNy5kaWQKQEAgLTAsMCArMSwzOCBAQAorZGljdF9yZmM2OTQyX2F2cHMKK2RpY3RfdHMyOTQ2OF9hdnBzCitkaWN0X3RzMjkxNTRfYXZwcworZGljdF90czI5MjE0X2F2cHMKK2RpY3RfdHMyOTIxNV9hdnBzCitkaWN0X3RzMjkyMTdfYXZwcworZGljdF8zZ3BwMl9hdnBzCitkaWN0X3RzMjkzNDNfYXZwcworZGljdF90czI5MzM4X2F2cHMKK2RpY3RfdHMyOTEyOF9hdnBzCitkaWN0X3RzMjkzNDRfYXZwcworZGljdF90czI5MzQ1X2F2cHMKK2RpY3RfdHMzMjI5OV9hdnBzCitkaWN0X3JmYzY3MzRfYXZwcworZGljdF9yZmM1Nzc4X2F2cHMKK2RpY3RfcmZjNTU4MF9hdnBzCitkaWN0X3JmYzQwNzJfYXZwcworZGljdF90czI5MjczX2F2cHMKK2RpY3RfdHMyOTE3M19hdnBzCitkaWN0X3RzMjkzMzdfYXZwcworZGljdF9ldHNpMjgzMDM0X2F2cHMKK2RpY3RfcmZjNDU5MF9hdnBzCitkaWN0X3RzMjkyMjlfYXZwcworZGljdF9kcmFmdGxvYWRfYXZwcworZGljdF90czI5MzI5X2F2cHMKK2RpY3RfdHMyOTM2OF9hdnBzCitkaWN0X3RzMjkzMzZfYXZwcworZGljdF90czI5MDYxX2F2cHMKK2RpY3RfcmZjNTQ0N19hdnBzCitkaWN0X3RzMjkyNzJfYXZwcworZGljdF9yZmM3NjgzX2F2cHMKK2RpY3RfcmZjNzk0NF9hdnBzCitkaWN0X3JmYzU3NzdfYXZwcworZGljdF9yZmM0MDA2YmlzX2F2cHMKK2RpY3RfcmZjNDAwNF9hdnBzCitkaWN0X3JmYzcxNTVfYXZwcworZGljdF90czI5MjEyX2F2cHMKK2RpY3RfVDZhVDZiVDcKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF9UNmFUNmJUNy9kaWN0X1Q2YVQ2YlQ3LmMgYi9leHRlbnNpb25zL2RpY3RfVDZhVDZiVDcvZGljdF9UNmFUNmJUNy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMzdhNGEKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfVDZhVDZiVDcvZGljdF9UNmFUNmJUNy5jCkBAIC0wLDAgKzEsNDg1IEBACisvKgorKiBDb3B5cmlnaHQgKGMpIDIwMTcgU3ByaW50CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKy8qKioqKioqKioqKioqKioqCisgR2VuZXJhdGVkIEJ5OiBmZHRvb2wgZW5oYW5jZW1lbnRzIHRvIGRpYWZ1enplcgorIExpY2Vuc2U6IHNhbWUgYXMgZnJlZURpYW1ldGVyCisqKioqKioqKioqKioqKioqLworCisKKy8qIAorICogRGljdGlvbmFyeSBkZWZpbml0aW9ucyBvZiBvYmplY3RzIHNwZWNpZmllZCBpbiBUNmFUNmJUNyAoZTIwKS4KKyAqLworI2luY2x1ZGUgPGZyZWVEaWFtZXRlci9leHRlbnNpb24uaD4KKworI2RlZmluZSBQUk9UT19WRVIgImUyMCIKKyNkZWZpbmUgR0VOX0RBVEUgIDE1MDY2OTcyMzAuMjMKKworY29uc3QgY2hhciAqdDZhdDZidDdfcHJvdG9fdmVyID0gUFJPVE9fVkVSOworY29uc3QgZG91YmxlIHQ2YXQ2YnQ3X2dlbl9kYXRlID0gR0VOX0RBVEU7CisKKy8qIFRoZSBjb250ZW50IG9mIHRoaXMgZmlsZSBmb2xsb3dzIHRoZSBzYW1lIHN0cnVjdHVyZSBhcyBkaWN0X2Jhc2VfcHJvdG8uYyAqLworCisjZGVmaW5lIENIRUNLX2RpY3RfbmV3KCBfdHlwZSwgX2RhdGEsIF9wYXJlbnQsIF9yZWYgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IF9yZXQgPSBmZF9kaWN0X25ldyggZmRfZ19jb25maWctPmNuZl9kaWN0LCAoX3R5cGUpLCAoX2RhdGEpLCAoX3BhcmVudCksIChfcmVmKSApOyBcCisgICAgaWYgKCBfcmV0ICE9IDAgJiYgX3JldCAhPSBFRVhJU1QgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgcmV0dXJuIF9yZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgQ0hFQ0tfZGljdF9zZWFyY2goIF90eXBlLCBfY3JpdGVyaWEsIF93aGF0LCBfcmVzdWx0ICkJCVwKKyAgICBDSEVDS19GQ1QoICBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCAoX3R5cGUpLCAoX2NyaXRlcmlhKSwgKF93aGF0KSwgKF9yZXN1bHQpLCBFTk9FTlQpICk7CisKK3N0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHsKKyAgICBzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZTsKKyAgICBlbnVtIHJ1bGVfcG9zaXRpb24JcG9zaXRpb247CisgICAgaW50IAkJCW1pbjsKKyAgICBpbnQJCQltYXg7Cit9OworCisjZGVmaW5lIFJVTEVfT1JERVIoIF9wb3NpdGlvbiApICgoKChfcG9zaXRpb24pID09IFJVTEVfRklYRURfSEVBRCkgfHwgKChfcG9zaXRpb24pID09IFJVTEVfRklYRURfVEFJTCkpID8gMSA6IDAgKQorCisvKiBBdHRlbnRpb24hIFRoaXMgdmVyc2lvbiBvZiB0aGUgbWFjcm8gdXNlcyBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCBpbiBjb250cmFzdCB0byBtb3N0IG90aGVyIGNvcGllcyEgKi8KKyNkZWZpbmUgUEFSU0VfbG9jX3J1bGVzKCBfcnVsZWFycmF5LCBfcGFyZW50KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgX19hcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoX19hcj0wOyBfX2FyIDwgc2l6ZW9mKF9ydWxlYXJyYXkpIC8gc2l6ZW9mKChfcnVsZWFycmF5KVswXSk7IF9fYXIrKykgeyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgZGljdF9ydWxlX2RhdGEgX19kYXRhID0geyBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLnBvc2l0aW9uLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5taW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLm1heH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgX19kYXRhLnJ1bGVfb3JkZXIgPSBSVUxFX09SREVSKF9fZGF0YS5ydWxlX3Bvc2l0aW9uKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBDSEVDS19GQ1QoICBmZF9kaWN0X3NlYXJjaCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgZmRfZ19jb25maWctPmNuZl9kaWN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBESUNUX0FWUCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgJihfcnVsZWFycmF5KVtfX2FyXS5hdnBfdmVuZG9yX3BsdXNfbmFtZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAmX19kYXRhLnJ1bGVfYXZwLCAwICkgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpZiAoICFfX2RhdGEucnVsZV9hdnAgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfREVCVUcoSU5GTywgIkFWUCBOb3QgZm91bmQ6ICclcyciLCAoX3J1bGVhcnJheSlbX19hcl0uYXZwX3ZlbmRvcl9wbHVzX25hbWUuYXZwX25hbWUpOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRU5PRU5UOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IF9yZXQgPSBmZF9kaWN0X25ldyggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1JVTEUsICYoX19kYXRhKSwgKF9wYXJlbnQpLCBOVUxMICk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIF9yZXQgIT0gMCAmJiBfcmV0ICE9IEVFWElTVCApICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9ERUJVRyhJTkZPLCAiRXJyb3Igb24gcnVsZSB3aXRoIEFWUCAnJXMnIiwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5hdnBfdmVuZG9yX3BsdXNfbmFtZS5hdnBfbmFtZSk7ICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVJTlZBTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIENIRUNLX3ZlbmRvcl9uZXcoIF9kYXRhICkgeyBcCisgICAgICAgIHN0cnVjdCBkaWN0X29iamVjdCAqIHZlbmRvcl9mb3VuZDsgXAorICAgICAgICBpZiAoZmRfZGljdF9zZWFyY2goZmRfZ19jb25maWctPmNuZl9kaWN0LERJQ1RfVkVORE9SLFZFTkRPUl9CWV9JRCwmX2RhdGEudmVuZG9yX2lkLCZ2ZW5kb3JfZm91bmQsRU5PRU5UKSA9PSBFTk9FTlQpIHsgXAorICAgICAgICAgICAgICAgIENIRUNLX0ZDVChmZF9kaWN0X25ldyhmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfVkVORE9SLCAmX2RhdGEsIE5VTEwsIE5VTEwpKTsgXAorICAgICAgICB9IFwKK30KKworI2RlZmluZSBlbnVtdmFsX2RlZl91MzIoIF92YWxfLCBfc3RyXyApCQlcCisgICAgeyBfc3RyXywgCQl7IC51MzIgPSBfdmFsXyB9fQorCisjZGVmaW5lIGVudW12YWxfZGVmX29zKCBfbGVuXywgX3ZhbF8sIF9zdHJfICkJCQkJXAorICAgIHsgX3N0cl8sIAkJeyAub3MgPSB7IC5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilfdmFsXywgLmxlbiA9IF9sZW5fIH19fQorCisKK3N0YXRpYyBpbnQgZGljdF90NmF0NmJ0N19sb2FkX2RlZnMoY2hhciAqIGNvbmZmaWxlKQoreworICAgVFJBQ0VfRU5UUlkoIiVwIiwgY29uZmZpbGUpOworCXN0cnVjdCBkaWN0X29iamVjdCAqIGFwcF9pZDE2Nzc3MzQ2OworCisJLyogQXBwbGljYXRpb24gU2VjdGlvbiAqLworCXsKKwkgIHsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIHZlbmRvcjsKKwkJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfVkVORE9SLCBWRU5ET1JfQllfTkFNRSwgIjNHUFAiLCAmdmVuZG9yKQorCQkJc3RydWN0IGRpY3RfYXBwbGljYXRpb25fZGF0YSBkYXRhID0geyAxNjc3NzM0NiwgIlQ2YVQ2YlQ3IiB9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVBQTElDQVRJT04sICZkYXRhLCB2ZW5kb3IsICZhcHBfaWQxNjc3NzM0NikKKwkgIH0KKwl9CisKKworICAgLyogQVZQIHNlY3Rpb24gKi8KKyAgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogQWRkcmVzc190eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBVVEY4U3RyaW5nX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIERpYW1ldGVySWRlbnRpdHlfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogRGlhbWV0ZXJVUklfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogVGltZV90eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBJUEZpbHRlclJ1bGVfdHlwZTsKKworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJBZGRyZXNzIiwgJkFkZHJlc3NfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIlVURjhTdHJpbmciLCAmVVRGOFN0cmluZ190eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiRGlhbWV0ZXJJZGVudGl0eSIsICZEaWFtZXRlcklkZW50aXR5X3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJEaWFtZXRlclVSSSIsICZEaWFtZXRlclVSSV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiVGltZSIsICZUaW1lX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJJUEZpbHRlclJ1bGUiLCAmSVBGaWx0ZXJSdWxlX3R5cGUpOworCisJCisgICB9CisKKyAgIC8qIENvbW1hbmRzIHNlY3Rpb24gKi8KKyAgIHsKKwkJLyogQ29ubmVjdGlvbi1NYW5hZ2VtZW50LVJlcXVlc3QgKi8KKwkJeworCQkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCQlzdHJ1Y3QgZGljdF9jbWRfZGF0YSBkYXRhID0geworCQkJCTgzODg3MzIsCS8qIENvZGUgKi8KKwkJCQkiQ29ubmVjdGlvbi1NYW5hZ2VtZW50LVJlcXVlc3QiLAkvKiBOYW1lICovCisJCQkJQ01EX0ZMQUdfUkVRVUVTVCB8IENNRF9GTEFHX0VSUk9SLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUNNRF9GTEFHX1JFUVVFU1QgfCBDTURfRkxBR19QUk9YSUFCTEUsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQl9OworCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9DT01NQU5ELCAmZGF0YSAsIGFwcF9pZDE2Nzc3MzQ2LCAmY21kKQorCQl9CisJCS8qIENvbm5lY3Rpb24tTWFuYWdlbWVudC1BbnN3ZXIgKi8KKwkJeworCQkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCQlzdHJ1Y3QgZGljdF9jbWRfZGF0YSBkYXRhID0geworCQkJCTgzODg3MzIsCS8qIENvZGUgKi8KKwkJCQkiQ29ubmVjdGlvbi1NYW5hZ2VtZW50LUFuc3dlciIsCS8qIE5hbWUgKi8KKwkJCQlDTURfRkxBR19SRVFVRVNULAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUNNRF9GTEFHX1BST1hJQUJMRSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCX07CisKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0NPTU1BTkQsICZkYXRhICwgYXBwX2lkMTY3NzczNDYsICZjbWQpCisJCX0KKwkJLyogTU8tRGF0YS1SZXF1ZXN0ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQkJc3RydWN0IGRpY3RfY21kX2RhdGEgZGF0YSA9IHsKKwkJCQk4Mzg4NzMzLAkvKiBDb2RlICovCisJCQkJIk1PLURhdGEtUmVxdWVzdCIsCS8qIE5hbWUgKi8KKwkJCQlDTURfRkxBR19SRVFVRVNUIHwgQ01EX0ZMQUdfRVJST1IsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQ01EX0ZMQUdfUkVRVUVTVCB8IENNRF9GTEFHX1BST1hJQUJMRSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCX07CisKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0NPTU1BTkQsICZkYXRhICwgYXBwX2lkMTY3NzczNDYsICZjbWQpCisJCX0KKwkJLyogTU8tRGF0YS1BbnN3ZXIgKi8KKwkJeworCQkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCQlzdHJ1Y3QgZGljdF9jbWRfZGF0YSBkYXRhID0geworCQkJCTgzODg3MzMsCS8qIENvZGUgKi8KKwkJCQkiTU8tRGF0YS1BbnN3ZXIiLAkvKiBOYW1lICovCisJCQkJQ01EX0ZMQUdfUkVRVUVTVCwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlDTURfRkxBR19QUk9YSUFCTEUsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQl9OworCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9DT01NQU5ELCAmZGF0YSAsIGFwcF9pZDE2Nzc3MzQ2LCAmY21kKQorCQl9CisJCS8qIE1ULURhdGEtUmVxdWVzdCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJCXN0cnVjdCBkaWN0X2NtZF9kYXRhIGRhdGEgPSB7CisJCQkJODM4ODczNCwJLyogQ29kZSAqLworCQkJCSJNVC1EYXRhLVJlcXVlc3QiLAkvKiBOYW1lICovCisJCQkJQ01EX0ZMQUdfUkVRVUVTVCB8IENNRF9GTEFHX0VSUk9SLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUNNRF9GTEFHX1JFUVVFU1QgfCBDTURfRkxBR19QUk9YSUFCTEUsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQl9OworCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9DT01NQU5ELCAmZGF0YSAsIGFwcF9pZDE2Nzc3MzQ2LCAmY21kKQorCQl9CisJCS8qIE1ULURhdGEtQW5zd2VyICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQkJc3RydWN0IGRpY3RfY21kX2RhdGEgZGF0YSA9IHsKKwkJCQk4Mzg4NzM0LAkvKiBDb2RlICovCisJCQkJIk1ULURhdGEtQW5zd2VyIiwJLyogTmFtZSAqLworCQkJCUNNRF9GTEFHX1JFUVVFU1QsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQ01EX0ZMQUdfUFJPWElBQkxFLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJfTsKKworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQ09NTUFORCwgJmRhdGEgLCBhcHBfaWQxNjc3NzM0NiwgJmNtZCkKKwkJfQorCisgICB9CisKKyAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRpY3RfdDZhdDZidDdfbG9hZF9ydWxlcyhjaGFyICogY29uZmZpbGUpCit7CisgICAvKiBHcm91cGVkIEFWUCBzZWN0aW9uICovCisgICB7CisKKyAgIH0JCisKKyAgIC8qIENvbW1hbmRzIHNlY3Rpb24gKi8KKyAgIHsKKwkgIC8qIENvbmZpZ3VyYXRpb24tSW5mb3JtYXRpb24tUmVxdWVzdCAqLworCSAgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJDb25maWd1cmF0aW9uLUluZm9ybWF0aW9uLVJlcXVlc3QiLCAmY21kKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlNlc3Npb24tSWQifSwgUlVMRV9GSVhFRF9IRUFELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEUk1QIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkF1dGgtU2Vzc2lvbi1TdGF0ZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tSG9zdCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRGVzdGluYXRpb24tSG9zdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEZXN0aW5hdGlvbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU3VwcG9ydGVkLUZlYXR1cmVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNb25pdG9yaW5nLUV2ZW50LUNvbmZpZ3VyYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUHJveHktSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSb3V0ZS1SZWNvcmQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKHJ1bGVzLCBjbWQpOworCSAgfQorCSAgLyogQ29uZmlndXJhdGlvbi1JbmZvcm1hdGlvbi1BbnN3ZXIgKi8KKwkgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX0NPTU1BTkQsIENNRF9CWV9OQU1FLCAiQ29uZmlndXJhdGlvbi1JbmZvcm1hdGlvbi1BbnN3ZXIiLCAmY21kKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlNlc3Npb24tSWQifSwgUlVMRV9GSVhFRF9IRUFELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEUk1QIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJlc3VsdC1Db2RlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkV4cGVyaW1lbnRhbC1SZXN1bHQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQXV0aC1TZXNzaW9uLVN0YXRlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1Ib3N0In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU3VwcG9ydGVkLUZlYXR1cmVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNb25pdG9yaW5nLUV2ZW50LVJlcG9ydCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTW9uaXRvcmluZy1FdmVudC1Db25maWctU3RhdHVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkZhaWxlZC1BVlAifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUHJveHktSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSb3V0ZS1SZWNvcmQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKHJ1bGVzLCBjbWQpOworCSAgfQorCSAgLyogUmVwb3J0aW5nLUluZm9ybWF0aW9uLVJlcXVlc3QgKi8KKwkgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX0NPTU1BTkQsIENNRF9CWV9OQU1FLCAiUmVwb3J0aW5nLUluZm9ybWF0aW9uLVJlcXVlc3QiLCAmY21kKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlNlc3Npb24tSWQifSwgUlVMRV9GSVhFRF9IRUFELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEUk1QIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkF1dGgtU2Vzc2lvbi1TdGF0ZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tSG9zdCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRGVzdGluYXRpb24tSG9zdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEZXN0aW5hdGlvbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPQy1TdXBwb3J0ZWQtRmVhdHVyZXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlN1cHBvcnRlZC1GZWF0dXJlcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTW9uaXRvcmluZy1FdmVudC1SZXBvcnQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKHJ1bGVzLCBjbWQpOworCSAgfQorCSAgLyogUmVwb3J0aW5nLUluZm9ybWF0aW9uLUFuc3dlciAqLworCSAgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJSZXBvcnRpbmctSW5mb3JtYXRpb24tQW5zd2VyIiwgJmNtZCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTZXNzaW9uLUlkIn0sIFJVTEVfRklYRURfSEVBRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRFJNUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSZXN1bHQtQ29kZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJFeHBlcmltZW50YWwtUmVzdWx0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkF1dGgtU2Vzc2lvbi1TdGF0ZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tSG9zdCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT0MtU3VwcG9ydGVkLUZlYXR1cmVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9DLU9MUiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJMb2FkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTdXBwb3J0ZWQtRmVhdHVyZXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRmFpbGVkLUFWUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJQcm94eS1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJvdXRlLVJlY29yZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMocnVsZXMsIGNtZCk7CisJICB9CisJICAvKiBDb25uZWN0aW9uLU1hbmFnZW1lbnQtUmVxdWVzdCAqLworCSAgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJDb25uZWN0aW9uLU1hbmFnZW1lbnQtUmVxdWVzdCIsICZjbWQpCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU2Vzc2lvbi1JZCJ9LCBSVUxFX0ZJWEVEX0hFQUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJVc2VyLUlkZW50aWZpZXIifSwgUlVMRV9GSVhFRF9IRUFELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQmVhcmVyLUlkZW50aWZpZXIifSwgUlVMRV9GSVhFRF9IRUFELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEUk1QIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkF1dGgtU2Vzc2lvbi1TdGF0ZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tSG9zdCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRGVzdGluYXRpb24tSG9zdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEZXN0aW5hdGlvbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPQy1TdXBwb3J0ZWQtRmVhdHVyZXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNNUi1GbGFncyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTWF4aW11bS1VRS1BdmFpbGFiaWxpdHktVGltZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU3VwcG9ydGVkLUZlYXR1cmVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDb25uZWN0aW9uLUFjdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTZXJ2aWNlLVNlbGVjdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU2VydmluZy1QTE1OLVJhdGUtQ29udHJvbCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRXh0ZW5kZWQtUENPIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICIzR1BQLUNoYXJnaW5nLUNoYXJhY3RlcmlzdGljcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUkFULVR5cGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlRlcm1pbmFsLUluZm9ybWF0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJWaXNpdGVkLVBMTU4tSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUHJveHktSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSb3V0ZS1SZWNvcmQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKHJ1bGVzLCBjbWQpOworCSAgfQorCSAgLyogQ29ubmVjdGlvbi1NYW5hZ2VtZW50LUFuc3dlciAqLworCSAgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJDb25uZWN0aW9uLU1hbmFnZW1lbnQtQW5zd2VyIiwgJmNtZCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTZXNzaW9uLUlkIn0sIFJVTEVfRklYRURfSEVBRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRFJNUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSZXN1bHQtQ29kZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJFeHBlcmltZW50YWwtUmVzdWx0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkF1dGgtU2Vzc2lvbi1TdGF0ZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tSG9zdCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT0MtU3VwcG9ydGVkLUZlYXR1cmVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9DLU9MUiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJMb2FkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTdXBwb3J0ZWQtRmVhdHVyZXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlBETi1Db25uZWN0aW9uLUNoYXJnaW5nLUlEIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJFeHRlbmRlZC1QQ08ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRmFpbGVkLUFWUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJQcm94eS1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJvdXRlLVJlY29yZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMocnVsZXMsIGNtZCk7CisJICB9CisJICAvKiBNTy1EYXRhLVJlcXVlc3QgKi8KKwkgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX0NPTU1BTkQsIENNRF9CWV9OQU1FLCAiTU8tRGF0YS1SZXF1ZXN0IiwgJmNtZCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTZXNzaW9uLUlkIn0sIFJVTEVfRklYRURfSEVBRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlVzZXItSWRlbnRpZmllciJ9LCBSVUxFX0ZJWEVEX0hFQUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJCZWFyZXItSWRlbnRpZmllciJ9LCBSVUxFX0ZJWEVEX0hFQUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRSTVAifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQXV0aC1TZXNzaW9uLVN0YXRlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1Ib3N0In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEZXN0aW5hdGlvbi1Ib3N0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRlc3RpbmF0aW9uLVJlYWxtIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9DLVN1cHBvcnRlZC1GZWF0dXJlcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU3VwcG9ydGVkLUZlYXR1cmVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJOb24tSVAtRGF0YSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJQcm94eS1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJvdXRlLVJlY29yZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUlJDLUNhdXNlLUNvdW50ZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKHJ1bGVzLCBjbWQpOworCSAgfQorCSAgLyogTU8tRGF0YS1BbnN3ZXIgKi8KKwkgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX0NPTU1BTkQsIENNRF9CWV9OQU1FLCAiTU8tRGF0YS1BbnN3ZXIiLCAmY21kKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlNlc3Npb24tSWQifSwgUlVMRV9GSVhFRF9IRUFELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEUk1QIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJlc3VsdC1Db2RlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkV4cGVyaW1lbnRhbC1SZXN1bHQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQXV0aC1TZXNzaW9uLVN0YXRlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1Ib3N0In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPQy1TdXBwb3J0ZWQtRmVhdHVyZXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT0MtT0xSIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkxvYWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlN1cHBvcnRlZC1GZWF0dXJlcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJGYWlsZWQtQVZQIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlByb3h5LUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUm91dGUtUmVjb3JkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyhydWxlcywgY21kKTsKKwkgIH0KKwkgIC8qIE1ULURhdGEtUmVxdWVzdCAqLworCSAgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJNVC1EYXRhLVJlcXVlc3QiLCAmY21kKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlNlc3Npb24tSWQifSwgUlVMRV9GSVhFRF9IRUFELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVXNlci1JZGVudGlmaWVyIn0sIFJVTEVfRklYRURfSEVBRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkJlYXJlci1JZGVudGlmaWVyIn0sIFJVTEVfRklYRURfSEVBRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRFJNUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBdXRoLVNlc3Npb24tU3RhdGUifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLUhvc3QifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLVJlYWxtIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRlc3RpbmF0aW9uLUhvc3QifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRGVzdGluYXRpb24tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT0MtU3VwcG9ydGVkLUZlYXR1cmVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTdXBwb3J0ZWQtRmVhdHVyZXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk5vbi1JUC1EYXRhIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTQ0VGLVdhaXQtVGltZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTWF4aW11bS1SZXRyYW5zbWlzc2lvbi1UaW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlByb3h5LUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUm91dGUtUmVjb3JkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyhydWxlcywgY21kKTsKKwkgIH0KKwkgIC8qIE1ULURhdGEtQW5zd2VyICovCisJICB7CisJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIk1ULURhdGEtQW5zd2VyIiwgJmNtZCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTZXNzaW9uLUlkIn0sIFJVTEVfRklYRURfSEVBRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRFJNUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSZXN1bHQtQ29kZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJFeHBlcmltZW50YWwtUmVzdWx0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkF1dGgtU2Vzc2lvbi1TdGF0ZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tSG9zdCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT0MtU3VwcG9ydGVkLUZlYXR1cmVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9DLU9MUiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJMb2FkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJSZXF1ZXN0ZWQtUmV0cmFuc21pc3Npb24tVGltZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU3VwcG9ydGVkLUZlYXR1cmVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkZhaWxlZC1BVlAifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUHJveHktSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSb3V0ZS1SZWNvcmQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKHJ1bGVzLCBjbWQpOworCSAgfQorCisgICB9CisKKyAgIExPR19EKCAiRXh0ZW5zaW9uICdEaWN0aW9uYXJ5IGRlZmluaXRpb25zIGZvciBUNmFUNmJUNyAoZTIwKScgaW5pdGlhbGl6ZWQiKTsKKyAgIHJldHVybiAwOworfQorCitpbnQgZGljdF9lbnRyeShjaGFyICogY29uZmZpbGUpCit7CisJZGljdF90NmF0NmJ0N19sb2FkX2RlZnMoY29uZmZpbGUpOworCXJldHVybiBkaWN0X3Q2YXQ2YnQ3X2xvYWRfcnVsZXMoY29uZmZpbGUpOworfQorCitjb25zdCBjaGFyKiBkaWN0X3Q2YXQ2YnQ3X3Byb3RvX3ZlcihjaGFyICogY29uZmZpbGUpIHsKKwlyZXR1cm4gdDZhdDZidDdfcHJvdG9fdmVyOworfQorCitjb25zdCBkb3VibGUgZGljdF90NmF0NmJ0N19nZW5fdHMoY2hhciAqIGNvbmZmaWxlKSB7CisJcmV0dXJuIHQ2YXQ2YnQ3X2dlbl9kYXRlOworfQorCitFWFRFTlNJT05fRU5UUlkyKCJkaWN0X3Q2YXQ2YnQ3IiwgZGljdF90NmF0NmJ0N19sb2FkX2RlZnMsIGRpY3RfdDZhdDZidDdfbG9hZF9ydWxlcywgImRpY3RfdHMzMjI5OV9hdnBzIiwgImRpY3RfdHMyOTI3Ml9hdnBzIiwgImRpY3RfdHMyOTEyOF9hdnBzIiwgImRpY3RfUzZ0IiwgImRpY3RfdHMyOTMzNl9hdnBzIiwgImRpY3RfdHMyOTIxMl9hdnBzIiwgImRpY3RfdHMyOTIxN19hdnBzIiwgImRpY3RfdHMyOTMzOF9hdnBzIiwgImRpY3RfdHMyOTIyOV9hdnBzIiwgImRpY3RfdHMyOTA2MV9hdnBzIiwgImRpY3RfZHJhZnRsb2FkX2F2cHMiLCAiZGljdF9yZmM3NjgzX2F2cHMiLCAiZGljdF9yZmM1Nzc4X2F2cHMiLCAiZGljdF9yZmM3OTQ0X2F2cHMiKTsKKworCisKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF9Uc3AvQ01ha2VMaXN0cy50eHQgYi9leHRlbnNpb25zL2RpY3RfVHNwL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ZWRhNWIKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfVHNwL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTYgQEAKKyMgVGhlIGRpY3RfVHNwIGV4dGVuc2lvbgorUFJPSkVDVCgiZGljdF9Uc3AgbGlicmFyeSBnZW5lcmF0ZWQgYnkgRmRHZW4gIiBDKQorCisjIENvbXBpbGUgYXMgYSBtb2R1bGUKK0ZEX0FERF9FWFRFTlNJT04oZGljdF9Uc3AgZGljdF9Uc3AuYykKKworCisjIyMjCisjIyBJTlNUQUxMIHNlY3Rpb24gIyMKKworSU5TVEFMTChUQVJHRVRTIGRpY3RfVHNwCisJTElCUkFSWSBERVNUSU5BVElPTiAke0lOU1RBTExfRVhURU5TSU9OU19TVUZGSVh9CitDT01QT05FTlQgZnJlZURpYW1ldGVyLWRpY3Rpb25hcnktVFNQKQorCisKKwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X1RzcC9Uc3AuZGlkIGIvZXh0ZW5zaW9ucy9kaWN0X1RzcC9Uc3AuZGlkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1YjMyNWYKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfVHNwL1RzcC5kaWQKQEAgLTAsMCArMSwzOCBAQAorZGljdF9yZmM2OTQyX2F2cHMKK2RpY3RfdHMyOTQ2OF9hdnBzCitkaWN0X3RzMjkxNTRfYXZwcworZGljdF90czI5MjE0X2F2cHMKK2RpY3RfdHMyOTIxNV9hdnBzCitkaWN0X3RzMjkyMTdfYXZwcworZGljdF8zZ3BwMl9hdnBzCitkaWN0X3RzMjkzMzdfYXZwcworZGljdF90czI5MzQzX2F2cHMKK2RpY3RfdHMyOTMzOF9hdnBzCitkaWN0X3RzMjkxMjhfYXZwcworZGljdF90czI5MzQ0X2F2cHMKK2RpY3RfdHMyOTM0NV9hdnBzCitkaWN0X3RzMjkxNzNfYXZwcworZGljdF90czMyMjk5X2F2cHMKK2RpY3RfcmZjNjczNF9hdnBzCitkaWN0X3JmYzU1ODBfYXZwcworZGljdF9yZmM0MDcyX2F2cHMKK2RpY3RfdHMyOTI3M19hdnBzCitkaWN0X3JmYzQwMDZiaXNfYXZwcworZGljdF90czI5MjEyX2F2cHMKK2RpY3RfdHMyOTA2MV9hdnBzCitkaWN0X3RzMjkyNzJfYXZwcworZGljdF9yZmM1NDQ3X2F2cHMKK2RpY3RfcmZjNTc3OF9hdnBzCitkaWN0X3JmYzU3NzdfYXZwcworZGljdF90czI5MzM2X2F2cHMKK2RpY3RfZXRzaTI4MzAzNF9hdnBzCitkaWN0X3JmYzQ1OTBfYXZwcworZGljdF9yZmM0MDA0X2F2cHMKK2RpY3RfcmZjNzE1NV9hdnBzCitkaWN0X3RzMjkyMjlfYXZwcworZGljdF9yZmM3NjgzX2F2cHMKK2RpY3RfZHJhZnRsb2FkX2F2cHMKK2RpY3RfcmZjNzk0NF9hdnBzCitkaWN0X3RzMjkzMjlfYXZwcworZGljdF90czI5MzY4X2F2cHMKK2RpY3RfVHNwCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfVHNwL2RpY3RfVHNwLmMgYi9leHRlbnNpb25zL2RpY3RfVHNwL2RpY3RfVHNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFlZWQwZgotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF9Uc3AvZGljdF9Uc3AuYwpAQCAtMCwwICsxLDMzNCBAQAorLyoKKyogQ29weXJpZ2h0IChjKSAyMDE3IFNwcmludAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvKioqKioqKioqKioqKioqKgorIEdlbmVyYXRlZCBCeTogZmR0b29sIGVuaGFuY2VtZW50cyB0byBkaWFmdXp6ZXIKKyBMaWNlbnNlOiBzYW1lIGFzIGZyZWVEaWFtZXRlcgorKioqKioqKioqKioqKioqKi8KKworCisvKiAKKyAqIERpY3Rpb25hcnkgZGVmaW5pdGlvbnMgb2Ygb2JqZWN0cyBzcGVjaWZpZWQgaW4gVHNwIChlMTApLgorICovCisjaW5jbHVkZSA8ZnJlZURpYW1ldGVyL2V4dGVuc2lvbi5oPgorCisjZGVmaW5lIFBST1RPX1ZFUiAiZTEwIgorI2RlZmluZSBHRU5fREFURSAgMTUwNjY5NzIyNi4yCisKK2NvbnN0IGNoYXIgKnRzcF9wcm90b192ZXIgPSBQUk9UT19WRVI7Citjb25zdCBkb3VibGUgdHNwX2dlbl9kYXRlID0gR0VOX0RBVEU7CisKKy8qIFRoZSBjb250ZW50IG9mIHRoaXMgZmlsZSBmb2xsb3dzIHRoZSBzYW1lIHN0cnVjdHVyZSBhcyBkaWN0X2Jhc2VfcHJvdG8uYyAqLworCisjZGVmaW5lIENIRUNLX2RpY3RfbmV3KCBfdHlwZSwgX2RhdGEsIF9wYXJlbnQsIF9yZWYgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IF9yZXQgPSBmZF9kaWN0X25ldyggZmRfZ19jb25maWctPmNuZl9kaWN0LCAoX3R5cGUpLCAoX2RhdGEpLCAoX3BhcmVudCksIChfcmVmKSApOyBcCisgICAgaWYgKCBfcmV0ICE9IDAgJiYgX3JldCAhPSBFRVhJU1QgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgcmV0dXJuIF9yZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgQ0hFQ0tfZGljdF9zZWFyY2goIF90eXBlLCBfY3JpdGVyaWEsIF93aGF0LCBfcmVzdWx0ICkJCVwKKyAgICBDSEVDS19GQ1QoICBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCAoX3R5cGUpLCAoX2NyaXRlcmlhKSwgKF93aGF0KSwgKF9yZXN1bHQpLCBFTk9FTlQpICk7CisKK3N0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHsKKyAgICBzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZTsKKyAgICBlbnVtIHJ1bGVfcG9zaXRpb24JcG9zaXRpb247CisgICAgaW50IAkJCW1pbjsKKyAgICBpbnQJCQltYXg7Cit9OworCisjZGVmaW5lIFJVTEVfT1JERVIoIF9wb3NpdGlvbiApICgoKChfcG9zaXRpb24pID09IFJVTEVfRklYRURfSEVBRCkgfHwgKChfcG9zaXRpb24pID09IFJVTEVfRklYRURfVEFJTCkpID8gMSA6IDAgKQorCisvKiBBdHRlbnRpb24hIFRoaXMgdmVyc2lvbiBvZiB0aGUgbWFjcm8gdXNlcyBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCBpbiBjb250cmFzdCB0byBtb3N0IG90aGVyIGNvcGllcyEgKi8KKyNkZWZpbmUgUEFSU0VfbG9jX3J1bGVzKCBfcnVsZWFycmF5LCBfcGFyZW50KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgX19hcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoX19hcj0wOyBfX2FyIDwgc2l6ZW9mKF9ydWxlYXJyYXkpIC8gc2l6ZW9mKChfcnVsZWFycmF5KVswXSk7IF9fYXIrKykgeyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgZGljdF9ydWxlX2RhdGEgX19kYXRhID0geyBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLnBvc2l0aW9uLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5taW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLm1heH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgX19kYXRhLnJ1bGVfb3JkZXIgPSBSVUxFX09SREVSKF9fZGF0YS5ydWxlX3Bvc2l0aW9uKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBDSEVDS19GQ1QoICBmZF9kaWN0X3NlYXJjaCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgZmRfZ19jb25maWctPmNuZl9kaWN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBESUNUX0FWUCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgJihfcnVsZWFycmF5KVtfX2FyXS5hdnBfdmVuZG9yX3BsdXNfbmFtZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAmX19kYXRhLnJ1bGVfYXZwLCAwICkgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpZiAoICFfX2RhdGEucnVsZV9hdnAgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfREVCVUcoSU5GTywgIkFWUCBOb3QgZm91bmQ6ICclcyciLCAoX3J1bGVhcnJheSlbX19hcl0uYXZwX3ZlbmRvcl9wbHVzX25hbWUuYXZwX25hbWUpOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRU5PRU5UOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IF9yZXQgPSBmZF9kaWN0X25ldyggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1JVTEUsICYoX19kYXRhKSwgKF9wYXJlbnQpLCBOVUxMICk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIF9yZXQgIT0gMCAmJiBfcmV0ICE9IEVFWElTVCApICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9ERUJVRyhJTkZPLCAiRXJyb3Igb24gcnVsZSB3aXRoIEFWUCAnJXMnIiwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5hdnBfdmVuZG9yX3BsdXNfbmFtZS5hdnBfbmFtZSk7ICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVJTlZBTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIENIRUNLX3ZlbmRvcl9uZXcoIF9kYXRhICkgeyBcCisgICAgICAgIHN0cnVjdCBkaWN0X29iamVjdCAqIHZlbmRvcl9mb3VuZDsgXAorICAgICAgICBpZiAoZmRfZGljdF9zZWFyY2goZmRfZ19jb25maWctPmNuZl9kaWN0LERJQ1RfVkVORE9SLFZFTkRPUl9CWV9JRCwmX2RhdGEudmVuZG9yX2lkLCZ2ZW5kb3JfZm91bmQsRU5PRU5UKSA9PSBFTk9FTlQpIHsgXAorICAgICAgICAgICAgICAgIENIRUNLX0ZDVChmZF9kaWN0X25ldyhmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfVkVORE9SLCAmX2RhdGEsIE5VTEwsIE5VTEwpKTsgXAorICAgICAgICB9IFwKK30KKworI2RlZmluZSBlbnVtdmFsX2RlZl91MzIoIF92YWxfLCBfc3RyXyApCQlcCisgICAgeyBfc3RyXywgCQl7IC51MzIgPSBfdmFsXyB9fQorCisjZGVmaW5lIGVudW12YWxfZGVmX29zKCBfbGVuXywgX3ZhbF8sIF9zdHJfICkJCQkJXAorICAgIHsgX3N0cl8sIAkJeyAub3MgPSB7IC5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilfdmFsXywgLmxlbiA9IF9sZW5fIH19fQorCisKK3N0YXRpYyBpbnQgZGljdF90c3BfbG9hZF9kZWZzKGNoYXIgKiBjb25mZmlsZSkKK3sKKyAgIFRSQUNFX0VOVFJZKCIlcCIsIGNvbmZmaWxlKTsKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhcHBfaWQxNjc3NzMwOTsKKworCS8qIEFwcGxpY2F0aW9uIFNlY3Rpb24gKi8KKwl7CisJICB7CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiB2ZW5kb3I7CisJCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX1ZFTkRPUiwgVkVORE9SX0JZX05BTUUsICIzR1BQIiwgJnZlbmRvcikKKwkJCXN0cnVjdCBkaWN0X2FwcGxpY2F0aW9uX2RhdGEgZGF0YSA9IHsgMTY3NzczMDksICJUc3AiIH07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BUFBMSUNBVElPTiwgJmRhdGEsIHZlbmRvciwgJmFwcF9pZDE2Nzc3MzA5KQorCSAgfQorCSAgLyogUmVzdWx0IGNvZGVzICovCisJICB7CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKnR5cGU7CisJCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkVudW1lcmF0ZWQoUmVzdWx0LUNvZGUpIiwmdHlwZSk7CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIkdlbmVyYWwiLCB7IC51MzI9MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiU0NTX2JlaGF2aW91ciIsIHsgLnUzMj0yIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMgPSB7ICJNVENfSVdGX2JlaGF2aW91ciIsIHsgLnUzMj0zIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzQgPSB7ICJSZXBsYWNlX0ZhaWx1cmUiLCB7IC51MzI9NCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF81ID0geyAiRGVsaXZlcnlfb2ZfYV9NU0lTRE5fbGVzc19NT19TTVMiLCB7IC51MzI9OSB9fTsKKworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF81LCB0eXBlLCBOVUxMKTsKKworCSAgfQorCX0KKworCisgICAvKiBBVlAgc2VjdGlvbiAqLworICAgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBBZGRyZXNzX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIFVURjhTdHJpbmdfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogRGlhbWV0ZXJJZGVudGl0eV90eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBEaWFtZXRlclVSSV90eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBUaW1lX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIElQRmlsdGVyUnVsZV90eXBlOworCisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkFkZHJlc3MiLCAmQWRkcmVzc190eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiVVRGOFN0cmluZyIsICZVVEY4U3RyaW5nX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJEaWFtZXRlcklkZW50aXR5IiwgJkRpYW1ldGVySWRlbnRpdHlfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkRpYW1ldGVyVVJJIiwgJkRpYW1ldGVyVVJJX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJUaW1lIiwgJlRpbWVfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIklQRmlsdGVyUnVsZSIsICZJUEZpbHRlclJ1bGVfdHlwZSk7CisKKwkKKyAgIH0KKworICAgLyogQ29tbWFuZHMgc2VjdGlvbiAqLworICAgeworCQkvKiBEZXZpY2UtQWN0aW9uLVJlcXVlc3QgKi8KKwkJeworCQkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCQlzdHJ1Y3QgZGljdF9jbWRfZGF0YSBkYXRhID0geworCQkJCTgzODg2MzksCS8qIENvZGUgKi8KKwkJCQkiRGV2aWNlLUFjdGlvbi1SZXF1ZXN0IiwJLyogTmFtZSAqLworCQkJCUNNRF9GTEFHX1JFUVVFU1QgfCBDTURfRkxBR19FUlJPUiwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlDTURfRkxBR19SRVFVRVNUIHwgQ01EX0ZMQUdfUFJPWElBQkxFLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJfTsKKworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQ09NTUFORCwgJmRhdGEgLCBhcHBfaWQxNjc3NzMwOSwgJmNtZCkKKwkJfQorCQkvKiBEZXZpY2UtQWN0aW9uLUFuc3dlciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJCXN0cnVjdCBkaWN0X2NtZF9kYXRhIGRhdGEgPSB7CisJCQkJODM4ODYzOSwJLyogQ29kZSAqLworCQkJCSJEZXZpY2UtQWN0aW9uLUFuc3dlciIsCS8qIE5hbWUgKi8KKwkJCQlDTURfRkxBR19SRVFVRVNULAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUNNRF9GTEFHX1BST1hJQUJMRSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCX07CisKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0NPTU1BTkQsICZkYXRhICwgYXBwX2lkMTY3NzczMDksICZjbWQpCisJCX0KKwkJLyogRGV2aWNlLU5vdGlmaWNhdGlvbi1SZXF1ZXN0ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQkJc3RydWN0IGRpY3RfY21kX2RhdGEgZGF0YSA9IHsKKwkJCQk4Mzg4NjQwLAkvKiBDb2RlICovCisJCQkJIkRldmljZS1Ob3RpZmljYXRpb24tUmVxdWVzdCIsCS8qIE5hbWUgKi8KKwkJCQlDTURfRkxBR19SRVFVRVNUIHwgQ01EX0ZMQUdfRVJST1IsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQ01EX0ZMQUdfUkVRVUVTVCB8IENNRF9GTEFHX1BST1hJQUJMRSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCX07CisKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0NPTU1BTkQsICZkYXRhICwgYXBwX2lkMTY3NzczMDksICZjbWQpCisJCX0KKwkJLyogRGV2aWNlLU5vdGlmaWNhdGlvbi1BbnN3ZXIgKi8KKwkJeworCQkJc3RydWN0IGRpY3Rfb2JqZWN0KiBjbWQ7CisJCQlzdHJ1Y3QgZGljdF9jbWRfZGF0YSBkYXRhID0geworCQkJCTgzODg2NDAsCS8qIENvZGUgKi8KKwkJCQkiRGV2aWNlLU5vdGlmaWNhdGlvbi1BbnN3ZXIiLAkvKiBOYW1lICovCisJCQkJQ01EX0ZMQUdfUkVRVUVTVCwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlDTURfRkxBR19QUk9YSUFCTEUsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQl9OworCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9DT01NQU5ELCAmZGF0YSAsIGFwcF9pZDE2Nzc3MzA5LCAmY21kKQorCQl9CisKKyAgIH0KKworICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGljdF90c3BfbG9hZF9ydWxlcyhjaGFyICogY29uZmZpbGUpCit7CisgICAvKiBHcm91cGVkIEFWUCBzZWN0aW9uICovCisgICB7CisKKyAgIH0JCisKKyAgIC8qIENvbW1hbmRzIHNlY3Rpb24gKi8KKyAgIHsKKwkgIC8qIERldmljZS1BY3Rpb24tUmVxdWVzdCAqLworCSAgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJEZXZpY2UtQWN0aW9uLVJlcXVlc3QiLCAmY21kKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlNlc3Npb24tSWQifSwgUlVMRV9GSVhFRF9IRUFELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBdXRoLUFwcGxpY2F0aW9uLUlkIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkF1dGgtU2Vzc2lvbi1TdGF0ZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tSG9zdCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRGVzdGluYXRpb24tUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRGVzdGluYXRpb24tSG9zdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tU3RhdGUtSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkRldmljZS1BY3Rpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUHJveHktSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSb3V0ZS1SZWNvcmQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlN1cHBvcnRlZC1GZWF0dXJlcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMocnVsZXMsIGNtZCk7CisJICB9CisJICAvKiBEZXZpY2UtQWN0aW9uLUFuc3dlciAqLworCSAgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJEZXZpY2UtQWN0aW9uLUFuc3dlciIsICZjbWQpCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU2Vzc2lvbi1JZCJ9LCBSVUxFX0ZJWEVEX0hFQUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkF1dGgtQXBwbGljYXRpb24tSWQifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQXV0aC1TZXNzaW9uLVN0YXRlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1Ib3N0In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSZXN1bHQtQ29kZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJFeHBlcmltZW50YWwtUmVzdWx0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkVycm9yLU1lc3NhZ2UifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRXJyb3ItUmVwb3J0aW5nLUhvc3QifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRmFpbGVkLUFWUCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcmlnaW4tU3RhdGUtSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkRldmljZS1Ob3RpZmljYXRpb24ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUmVkaXJlY3QtSG9zdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSZWRpcmVjdC1Ib3N0LVVzYWdlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJlZGlyZWN0LU1heC1DYWNoZS1UaW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlByb3h5LUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlN1cHBvcnRlZC1GZWF0dXJlcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRmVhdHVyZS1TdXBwb3J0ZWQtSW4tRmluYWwtVGFyZ2V0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkxvYWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKHJ1bGVzLCBjbWQpOworCSAgfQorCSAgLyogRGV2aWNlLU5vdGlmaWNhdGlvbi1SZXF1ZXN0ICovCisJICB7CisJCXN0cnVjdCBkaWN0X29iamVjdCogY21kOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIkRldmljZS1Ob3RpZmljYXRpb24tUmVxdWVzdCIsICZjbWQpCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU2Vzc2lvbi1JZCJ9LCBSVUxFX0ZJWEVEX0hFQUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkF1dGgtQXBwbGljYXRpb24tSWQifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQXV0aC1TZXNzaW9uLVN0YXRlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1Ib3N0In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEZXN0aW5hdGlvbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEZXN0aW5hdGlvbi1Ib3N0In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1TdGF0ZS1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRGV2aWNlLU5vdGlmaWNhdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJQcm94eS1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJvdXRlLVJlY29yZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMocnVsZXMsIGNtZCk7CisJICB9CisJICAvKiBEZXZpY2UtTm90aWZpY2F0aW9uLUFuc3dlciAqLworCSAgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QqIGNtZDsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJEZXZpY2UtTm90aWZpY2F0aW9uLUFuc3dlciIsICZjbWQpCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU2Vzc2lvbi1JZCJ9LCBSVUxFX0ZJWEVEX0hFQUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkF1dGgtQXBwbGljYXRpb24tSWQifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQXV0aC1TZXNzaW9uLVN0YXRlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1Ib3N0In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSZXN1bHQtQ29kZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJFeHBlcmltZW50YWwtUmVzdWx0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1TdGF0ZS1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJFcnJvci1NZXNzYWdlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkVycm9yLVJlcG9ydGluZy1Ib3N0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJlZGlyZWN0LUhvc3QifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUmVkaXJlY3QtSG9zdC1Vc2FnZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSZWRpcmVjdC1NYXgtQ2FjaGUtVGltZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJGYWlsZWQtQVZQIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlByb3h5LUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKHJ1bGVzLCBjbWQpOworCSAgfQorCisgICB9CisKKyAgIExPR19EKCAiRXh0ZW5zaW9uICdEaWN0aW9uYXJ5IGRlZmluaXRpb25zIGZvciBUc3AgKGUxMCknIGluaXRpYWxpemVkIik7CisgICByZXR1cm4gMDsKK30KKworaW50IGRpY3RfZW50cnkoY2hhciAqIGNvbmZmaWxlKQoreworCWRpY3RfdHNwX2xvYWRfZGVmcyhjb25mZmlsZSk7CisJcmV0dXJuIGRpY3RfdHNwX2xvYWRfcnVsZXMoY29uZmZpbGUpOworfQorCitjb25zdCBjaGFyKiBkaWN0X3RzcF9wcm90b192ZXIoY2hhciAqIGNvbmZmaWxlKSB7CisJcmV0dXJuIHRzcF9wcm90b192ZXI7Cit9CisKK2NvbnN0IGRvdWJsZSBkaWN0X3RzcF9nZW5fdHMoY2hhciAqIGNvbmZmaWxlKSB7CisJcmV0dXJuIHRzcF9nZW5fZGF0ZTsKK30KKworRVhURU5TSU9OX0VOVFJZMigiZGljdF90c3AiLCBkaWN0X3RzcF9sb2FkX2RlZnMsIGRpY3RfdHNwX2xvYWRfcnVsZXMsICJkaWN0X3RzMjkzNjhfYXZwcyIsICJkaWN0X3RzMjkzMzdfYXZwcyIsICJkaWN0X3RzMjkzMzZfYXZwcyIsICJkaWN0X3RzMjkzMzhfYXZwcyIsICJkaWN0X3RzMjkzMjlfYXZwcyIsICJkaWN0X3RzMjkyMjlfYXZwcyIsICJkaWN0X2RyYWZ0bG9hZF9hdnBzIiwgImRpY3RfcmZjNDAwNmJpc19hdnBzIik7CisKKworCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfZGNjYS9DTWFrZUxpc3RzLnR4dCBiL2V4dGVuc2lvbnMvZGljdF9kY2NhL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyYWI2YjkKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfZGNjYS9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDEzIEBACisjIFRoZSBkaWN0X2RjY2EgZXh0ZW5zaW9uCitQUk9KRUNUKCJEaWFtZXRlciBEQ0NBIChEaWFtZXRlciBDcmVkaXQgQ29udHJvbCBBcHBsaWNhdGlvbiApIGRpY3Rpb25hcnkgZGVmaW5pdGlvbnMiIEMpCisKKyMgQ29tcGlsZSBhcyBhIG1vZHVsZQorRkRfQUREX0VYVEVOU0lPTihkaWN0X2RjY2EgZGljdF9kY2NhLmMpCisKKworIyMjIworIyMgSU5TVEFMTCBzZWN0aW9uICMjCisKK0lOU1RBTEwoVEFSR0VUUyBkaWN0X2RjY2EKKwlMSUJSQVJZIERFU1RJTkFUSU9OICR7SU5TVEFMTF9FWFRFTlNJT05TX1NVRkZJWH0KKwlDT01QT05FTlQgZnJlZURpYW1ldGVyLWRpY3Rpb25hcnktcmZjNDAwNikKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF9kY2NhL2RpY3RfZGNjYS5jIGIvZXh0ZW5zaW9ucy9kaWN0X2RjY2EvZGljdF9kY2NhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ5NDYwMwotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF9kY2NhL2RpY3RfZGNjYS5jCkBAIC0wLDAgKzEsMTQ4NyBAQAorLyoqKioqKioqKioqKioqKioKKyBDb250cmlidXRlZCBieTogS29uc3RhbnRpbiBDaGVrdXNoaW4gPGtvY2hAbG10Lmx2PiBhbmQgVGhvbWFzIEtsYXVzbmVyIDx0a0BnaWdhLm9yLmF0PgorIExpY2Vuc2U6IHNhbWUgYXMgZnJlZURpYW1ldGVyCisqKioqKioqKioqKioqKioqLworCisKKy8qIAorICogRGljdGlvbmFyeSBkZWZpbml0aW9ucyBvZiBvYmplY3RzIHNwZWNpZmllZCBpbiBEQ0NBIChyZmM0MDA2KS4KKyAqLworI2luY2x1ZGUgPGZyZWVEaWFtZXRlci9leHRlbnNpb24uaD4KKworCisvKiBUaGUgY29udGVudCBvZiB0aGlzIGZpbGUgZm9sbG93cyB0aGUgc2FtZSBzdHJ1Y3R1cmUgYXMgZGljdF9iYXNlX3Byb3RvLmMgKi8KKworI2RlZmluZSBDSEVDS19kaWN0X25ldyggX3R5cGUsIF9kYXRhLCBfcGFyZW50LCBfcmVmICkJCQlcCisgICAgQ0hFQ0tfRkNUKCAgZmRfZGljdF9uZXcoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgKF90eXBlKSwgKF9kYXRhKSwgKF9wYXJlbnQpLCAoX3JlZikpICApOworCisjZGVmaW5lIENIRUNLX2RpY3Rfc2VhcmNoKCBfdHlwZSwgX2NyaXRlcmlhLCBfd2hhdCwgX3Jlc3VsdCApCQlcCisgICAgQ0hFQ0tfRkNUKCAgZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgKF90eXBlKSwgKF9jcml0ZXJpYSksIChfd2hhdCksIChfcmVzdWx0KSwgRU5PRU5UKSApOworCitzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiB7CisgICAgY2hhciAJCQkqYXZwX25hbWU7CisgICAgZW51bSBydWxlX3Bvc2l0aW9uCXBvc2l0aW9uOworICAgIGludCAJCQltaW47CisgICAgaW50CQkJbWF4OworfTsKKworI2RlZmluZSBSVUxFX09SREVSKCBfcG9zaXRpb24gKSAoKCgoX3Bvc2l0aW9uKSA9PSBSVUxFX0ZJWEVEX0hFQUQpIHx8ICgoX3Bvc2l0aW9uKSA9PSBSVUxFX0ZJWEVEX1RBSUwpKSA/IDEgOiAwICkKKworI2RlZmluZSBQQVJTRV9sb2NfcnVsZXMoIF9ydWxlYXJyYXksIF9wYXJlbnQpIHsJCQkJXAorCWludCBfX2FyOwkJCQkJCQlcCisJZm9yIChfX2FyPTA7IF9fYXIgPCBzaXplb2YoX3J1bGVhcnJheSkgLyBzaXplb2YoKF9ydWxlYXJyYXkpWzBdKTsgX19hcisrKSB7IFwKKwkgICAgc3RydWN0IGRpY3RfcnVsZV9kYXRhIF9fZGF0YSA9IHsgTlVMTCwJCQlcCisJCQkJCSAgICAgKF9ydWxlYXJyYXkpW19fYXJdLnBvc2l0aW9uLCBcCisJCQkJCSAgICAgMCwJCQkJXAorCQkJCQkgICAgIChfcnVsZWFycmF5KVtfX2FyXS5taW4sCVwKKwkJCQkJICAgICAoX3J1bGVhcnJheSlbX19hcl0ubWF4fTsJXAorCSAgICBfX2RhdGEucnVsZV9vcmRlciA9IFJVTEVfT1JERVIoX19kYXRhLnJ1bGVfcG9zaXRpb24pOwlcCisJICAgIENIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoKAkJCQkJXAorCQkJICAgIGZkX2dfY29uZmlnLT5jbmZfZGljdCwJCQlcCisJCQkgICAgRElDVF9BVlAsCQkJCQlcCisJCQkgICAgQVZQX0JZX05BTUUsCQkJCVwKKwkJCSAgICAoX3J1bGVhcnJheSlbX19hcl0uYXZwX25hbWUsCQlcCisJCQkgICAgJl9fZGF0YS5ydWxlX2F2cCwgMCApICk7CQkJXAorCSAgICBpZiAoICFfX2RhdGEucnVsZV9hdnAgKSB7CQkJCQlcCisJCVRSQUNFX0RFQlVHKElORk8sICJBVlAgTm90IGZvdW5kOiAnJXMnIiwgKF9ydWxlYXJyYXkpW19fYXJdLmF2cF9uYW1lICk7CVwKKwkJcmV0dXJuIEVOT0VOVDsJCQkJCQlcCisJICAgIH0JCQkJCQkJCVwKKwkgICAgQ0hFQ0tfRkNUX0RPKCBmZF9kaWN0X25ldyggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1JVTEUsICZfX2RhdGEsIF9wYXJlbnQsIE5VTEwpLCBcCisJCQkgIHsJCQkJCQlcCisJCQkgICAgICBUUkFDRV9ERUJVRyhJTkZPLCAiRXJyb3Igb24gcnVsZSB3aXRoIEFWUCAnJXMnIiwgXAorCQkJCQkgIChfcnVsZWFycmF5KVtfX2FyXS5hdnBfbmFtZSApOyBcCisJCQkgICAgICByZXR1cm4gRUlOVkFMOwkJCQlcCisJCQkgIH0gKTsJCQkJCQlcCisJfQkJCQkJCQkJXAorICAgIH0KKworI2RlZmluZSBlbnVtdmFsX2RlZl91MzIoIF92YWxfLCBfc3RyXyApCQlcCisgICAgeyBfc3RyXywgCQl7IC51MzIgPSBfdmFsXyB9fQorCisjZGVmaW5lIGVudW12YWxfZGVmX29zKCBfbGVuXywgX3ZhbF8sIF9zdHJfICkJCQkJXAorICAgIHsgX3N0cl8sIAkJeyAub3MgPSB7IC5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilfdmFsXywgLmxlbiA9IF9sZW5fIH19fQorCisKK3N0YXRpYyBpbnQgZGljdF9kY2NhX2VudHJ5KGNoYXIgKiBjb25mZmlsZSkKK3sKKyAgICBzdHJ1Y3QgZGljdF9vYmplY3QgKiBkY2NhOworICAgIFRSQUNFX0VOVFJZKCIlcCIsIGNvbmZmaWxlKTsJCQorCQorICAgIC8qIEFwcGxpY2F0aW9ucyBzZWN0aW9uICovCisgICAgeworCS8qIERDQ0EgKi8KKwl7CisJICAgIHN0cnVjdCBkaWN0X2FwcGxpY2F0aW9uX2RhdGEgZGF0YSA9IHsgICAgICAgIDQsICJEaWFtZXRlciBDcmVkaXQgQ29udHJvbCBBcHBsaWNhdGlvbiIgCQkJfTsKKwkgICAgQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVBQTElDQVRJT04sICZkYXRhLCBOVUxMLCAmZGNjYSk7CisJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgfQorCQorICAgIC8qIFJlc3VsdCBjb2RlcyAqLworICAgIHsKKyAgICAgICAgc3RydWN0IGRpY3Rfb2JqZWN0ICpSZXN1bHRDb2RlVHlwZTsKKyAgICAgICAgQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJFbnVtZXJhdGVkKFJlc3VsdC1Db2RlKSIsICZSZXN1bHRDb2RlVHlwZSk7CisKKyAgICAgICAgeworICAgICAgICAgICAgc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIGVycm9yX2NvZGUgPSB7IkVORF9VU0VSX1NFUlZJQ0VfREVOSUVEIiwKKwkJCQkJCSAgIHsgLnUzMiA9IDQwMTB9fTsKKyAgICAgICAgICAgIENIRUNLX2RpY3RfbmV3KERJQ1RfRU5VTVZBTCwgJmVycm9yX2NvZGUsIFJlc3VsdENvZGVUeXBlLCBOVUxMKTsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICBzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgZXJyb3JfY29kZSA9IHsiQ1JFRElUX0NPTlRST0xfTk9UX0FQUExJQ0FCTEUiLAorCQkJCQkJICAgeyAudTMyID0gNDAxMX19OworICAgICAgICAgICAgQ0hFQ0tfZGljdF9uZXcoRElDVF9FTlVNVkFMLCAmZXJyb3JfY29kZSwgUmVzdWx0Q29kZVR5cGUsIE5VTEwpOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSBlcnJvcl9jb2RlID0geyJDUkVESVRfTElNSVRfUkVBQ0hFRCIsCisJCQkJCQkgICB7IC51MzIgPSA0MDEyfX07CisgICAgICAgICAgICBDSEVDS19kaWN0X25ldyhESUNUX0VOVU1WQUwsICZlcnJvcl9jb2RlLCBSZXN1bHRDb2RlVHlwZSwgTlVMTCk7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIGVycm9yX2NvZGUgPSB7IlVTRVJfVU5LTk9XTiIsCisJCQkJCQkgICB7IC51MzIgPSA1MDMwfX07CisgICAgICAgICAgICBDSEVDS19kaWN0X25ldyhESUNUX0VOVU1WQUwsICZlcnJvcl9jb2RlLCBSZXN1bHRDb2RlVHlwZSwgTlVMTCk7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIGVycm9yX2NvZGUgPSB7IlJBVElOR19GQUlMRUQiLAorCQkJCQkJICAgeyAudTMyID0gNTAzMX19OworICAgICAgICAgICAgQ0hFQ0tfZGljdF9uZXcoRElDVF9FTlVNVkFMLCAmZXJyb3JfY29kZSwgUmVzdWx0Q29kZVR5cGUsIE5VTEwpOworICAgICAgICB9CisKKyAgICB9CisKKworCQorICAgIC8qIEFWUCBzZWN0aW9uICovCisgICAgeworCXN0cnVjdCBkaWN0X29iamVjdCAqIEFkZHJlc3NfdHlwZTsKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBVVEY4U3RyaW5nX3R5cGU7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogRGlhbWV0ZXJJZGVudGl0eV90eXBlOworCXN0cnVjdCBkaWN0X29iamVjdCAqIERpYW1ldGVyVVJJX3R5cGU7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogVGltZV90eXBlOworCXN0cnVjdCBkaWN0X29iamVjdCAqIElQRmlsdGVyUnVsZV90eXBlOworCisJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiQWRkcmVzcyIsICZBZGRyZXNzX3R5cGUpOworCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIlVURjhTdHJpbmciLCAmVVRGOFN0cmluZ190eXBlKTsKKwlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJEaWFtZXRlcklkZW50aXR5IiwgJkRpYW1ldGVySWRlbnRpdHlfdHlwZSk7CisJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiRGlhbWV0ZXJVUkkiLCAmRGlhbWV0ZXJVUklfdHlwZSk7CisJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiVGltZSIsICZUaW1lX3R5cGUpOworCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIklQRmlsdGVyUnVsZSIsICZJUEZpbHRlclJ1bGVfdHlwZSk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgCisJLyogQ0MtQ29ycmVsYXRpb24tSWQgKi8KKwl7CisJICAgIC8qIAorCSAgICAgICBPY3RldFN0cmluZy4gCisJICAgICovCisJICAgIHN0cnVjdCBkaWN0X2F2cF9kYXRhICAgIGRhdGEgPSB7IAorCQk0MTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29kZSAqLworCQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVuZG9yICovCisJCSJDQy1Db3JyZWxhdGlvbi1JZCIsICAgICAgICAgICAgICAgICAgICAvKiBOYW1lICovCisJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgICAvKiBGaXhlZCBmbGFncyAqLworCQlBVlBfRkxBR19NQU5EQVRPUlksICAgICAgICAgICAgICAgICAgICAgLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJQVZQX1RZUEVfT0NURVRTVFJJTkcgICAgICAgICAgICAgICAgICAgIC8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJICAgIH07CisKKwkgICAgQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsIE5VTEwpOworCX0KKyAgICAgICAgICAgICAgICAKKwkvKiBDQy1JbnB1dC1PY3RldHMgKi8KKwl7CisJICAgIC8qIAorCSAgICAgICBVbnNpZ25lZDY0LiAKKwkgICAgKi8KKwkgICAgc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCTQxMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb2RlICovCisJCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWZW5kb3IgKi8KKwkJIkNDLUlucHV0LU9jdGV0cyIsICAgICAgICAgICAgICAgICAgICAgIC8qIE5hbWUgKi8KKwkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAgIC8qIEZpeGVkIGZsYWdzICovCisJCUFWUF9GTEFHX01BTkRBVE9SWSwgICAgICAgICAgICAgICAgICAgICAvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQlBVlBfVFlQRV9VTlNJR05FRDY0ICAgICAgICAgICAgICAgICAgICAgLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkgICAgfTsKKwkgICAgQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsIE5VTEwpOworCX0KKyAgICAgICAgICAgICAgICAKKwkvKiBDQy1PdXRwdXQtT2N0ZXRzICovCisJeworCSAgICAvKiAKKwkgICAgICAgVW5zaWduZWQ2NC4gCisJICAgICovCisJICAgIHN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQk0MTQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29kZSAqLworCQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVuZG9yICovCisJCSJDQy1PdXRwdXQtT2N0ZXRzIiwgICAgICAgICAgICAgICAgICAgICAvKiBOYW1lICovCisJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgICAvKiBGaXhlZCBmbGFncyAqLworCQlBVlBfRkxBR19NQU5EQVRPUlksICAgICAgICAgICAgICAgICAgICAgLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJQVZQX1RZUEVfVU5TSUdORUQ2NCAgICAgICAgICAgICAgICAgICAgIC8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJICAgIH07CisJICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCBOVUxMKTsKKwl9CisgICAgICAgICAgICAgICAgCisJLyogQ0MtUmVxdWVzdC1OdW1iZXIgKi8KKwl7CisJICAgIC8qIAorCSAgICAgICBVbnNpZ25lZDMyLiAKKwkgICAgKi8KKwkgICAgc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCTQxNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb2RlICovCisJCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWZW5kb3IgKi8KKwkJIkNDLVJlcXVlc3QtTnVtYmVyIiwgICAgICAgICAgICAgICAgICAgIC8qIE5hbWUgKi8KKwkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAgIC8qIEZpeGVkIGZsYWdzICovCisJCUFWUF9GTEFHX01BTkRBVE9SWSwgICAgICAgICAgICAgICAgICAgICAvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQlBVlBfVFlQRV9VTlNJR05FRDMyICAgICAgICAgICAgICAgICAgICAgLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkgICAgfTsKKwkgICAgQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsIE5VTEwpOworCX0KKworCS8qIENDLVJlcXVlc3QtVHlwZSAqLworCXsKKwkgICAgLyogCisJICAgICAgIEVudW1lcmF0ZWQuIAorCSAgICAqLworCisJICAgIHN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgICAgICAgKnR5cGU7CisJICAgIHN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgICAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIkVudW1lcmF0ZWQoQ0MtUmVxdWVzdC1UeXBlKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkgICAgc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJJTklUSUFMX1JFUVVFU1QiLCB7IC5pMzIgPSAxIH19OworCSAgICBzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIlVQREFURV9SRVFVRVNUIiwgeyAuaTMyID0gMiB9fTsKKwkgICAgc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMgPSB7ICJURVJNSU5BVElPTl9SRVFVRVNUIiwgeyAuaTMyID0gMyB9fTsKKwkgICAgc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzQgPSB7ICJFVkVOVF9SRVFVRVNUIiwgeyAuaTMyID0gNCB9fTsKKyAgICAgICAgICAgICAgICAgIAorCisJICAgIHN0cnVjdCBkaWN0X2F2cF9kYXRhICAgIGRhdGEgPSB7IAorCQk0MTYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29kZSAqLworCQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVuZG9yICovCisJCSJDQy1SZXF1ZXN0LVR5cGUiLCAgICAgICAgICAgICAgICAgICAgICAvKiBOYW1lICovCisJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgICAvKiBGaXhlZCBmbGFncyAqLworCQlBVlBfRkxBR19NQU5EQVRPUlksICAgICAgICAgICAgICAgICAgICAgLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJQVZQX1RZUEVfSU5URUdFUjMyICAgICAgICAgICAgICAgICAgICAgIC8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJICAgIH07CisJICAgIC8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSAsIE5VTEwsICZ0eXBlKTsKKwkgICAgQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSAsIHR5cGUsIE5VTEwpOworCSAgICBDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yICwgdHlwZSwgTlVMTCk7CisJICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMgLCB0eXBlLCBOVUxMKTsKKwkgICAgQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNCAsIHR5cGUsIE5VTEwpOworCSAgICBDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgdHlwZSwgTlVMTCk7CisJfQorICAgICAgICAgICAgICAgIAorCisJLyogQ0MtU2VydmljZS1TcGVjaWZpYy1Vbml0cyAqLworCXsKKwkgICAgLyogCisJICAgICAgIFVuc2lnbmVkNjQuIAorCSAgICAqLworCSAgICBzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJNDE3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvZGUgKi8KKwkJMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZlbmRvciAqLworCQkiQ0MtU2VydmljZS1TcGVjaWZpYy1Vbml0cyIsICAgICAgICAgICAgLyogTmFtZSAqLworCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksICAgLyogRml4ZWQgZmxhZ3MgKi8KKwkJQVZQX0ZMQUdfTUFOREFUT1JZLCAgICAgICAgICAgICAgICAgICAgIC8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCUFWUF9UWVBFX1VOU0lHTkVENjQgICAgICAgICAgICAgICAgICAgICAvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCSAgICB9OworCSAgICBDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgTlVMTCk7CisJfQorICAgCisJLyogQ0MtU2Vzc2lvbi1GYWlsb3ZlciAqLworCXsKKwkgICAgLyogCisJICAgICAgIEVudW1lcmF0ZWQuIAorCSAgICAqLworCisJICAgIHN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgICAgICAgKnR5cGU7CisJICAgIHN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgICAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIkVudW1lcmF0ZWQoQ0MtU2Vzc2lvbi1GYWlsb3ZlcikiICwgTlVMTCwgTlVMTCwgTlVMTCB9OworCSAgICBzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIkZBSUxPVkVSX05PVF9TVVBQT1JURUQiLCB7IC5pMzIgPSAwIH19OworCSAgICBzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIkZBSUxPVkVSX1NVUFBPUlRFRCIsIHsgLmkzMiA9IDEgfX07CisgICAgICAgICAgICAgICAgICAKKworCSAgICBzdHJ1Y3QgZGljdF9hdnBfZGF0YSAgICBkYXRhID0geyAKKwkJNDE4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvZGUgKi8KKwkJMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZlbmRvciAqLworCQkiQ0MtU2Vzc2lvbi1GYWlsb3ZlciIsICAgICAgICAgICAgICAgICAgLyogTmFtZSAqLworCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksICAgLyogRml4ZWQgZmxhZ3MgKi8KKwkJQVZQX0ZMQUdfTUFOREFUT1JZLCAgICAgICAgICAgICAgICAgICAgIC8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCUFWUF9UWVBFX0lOVEVHRVIzMiAgICAgICAgICAgICAgICAgICAgICAvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCSAgICB9OworCSAgICAvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCSAgICBDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEgLCBOVUxMLCAmdHlwZSk7CisJICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEgLCB0eXBlLCBOVUxMKTsgICAgICAgICAgICAgICAgICAKKwkgICAgQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiAsIHR5cGUsIE5VTEwpOworCSAgICBDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgdHlwZSwgTlVMTCk7CisJfQorICAgICAgICAgICAgICAgIAorCS8qIENDLVN1Yi1TZXNzaW9uLUlkICovCisJeworCSAgICAvKiAKKwkgICAgICAgVW5zaWduZWQ2NC4gCisJICAgICovCisJICAgIHN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQk0MTksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29kZSAqLworCQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVuZG9yICovCisJCSJDQy1TdWItU2Vzc2lvbi1JZCIsICAgICAgICAgICAgICAgICAgICAvKiBOYW1lICovCisJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgICAvKiBGaXhlZCBmbGFncyAqLworCQlBVlBfRkxBR19NQU5EQVRPUlksICAgICAgICAgICAgICAgICAgICAgLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJQVZQX1RZUEVfVU5TSUdORUQ2NCAgICAgICAgICAgICAgICAgICAgIC8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJICAgIH07CisJICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCBOVUxMKTsKKwl9CisgICAgICAgICAgICAgICAgCisJLyogQ0MtVGltZSAqLworCXsKKwkgICAgLyogCisJICAgICAgIFVuc2lnbmVkMzIuIAorCSAgICAqLworCSAgICBzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJNDIwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvZGUgKi8KKwkJMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZlbmRvciAqLworCQkiQ0MtVGltZSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTmFtZSAqLworCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksICAgLyogRml4ZWQgZmxhZ3MgKi8KKwkJQVZQX0ZMQUdfTUFOREFUT1JZLCAgICAgICAgICAgICAgICAgICAgIC8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCUFWUF9UWVBFX1VOU0lHTkVEMzIgICAgICAgICAgICAgICAgICAgICAvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCSAgICB9OworCSAgICBDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgTlVMTCk7CisJfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCS8qIENDLVRvdGFsLU9jdGV0cyAqLworCXsKKwkgICAgLyogCisJICAgICAgIFVuc2lnbmVkNjQuIAorCSAgICAqLworCSAgICBzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJNDIxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvZGUgKi8KKwkJMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZlbmRvciAqLworCQkiQ0MtVG90YWwtT2N0ZXRzIiwgICAgICAgICAgICAgICAgICAgICAgLyogTmFtZSAqLworCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksICAgLyogRml4ZWQgZmxhZ3MgKi8KKwkJQVZQX0ZMQUdfTUFOREFUT1JZLCAgICAgICAgICAgICAgICAgICAgIC8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCUFWUF9UWVBFX1VOU0lHTkVENjQgICAgICAgICAgICAgICAgICAgICAvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCSAgICB9OworCSAgICBDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgTlVMTCk7CisJfQorICAgICAgICAgICAgICAgIAorCS8qIENDLVVuaXQtVHlwZSAqLworCXsKKwkgICAgLyogCisJICAgICAgIEVudW1lcmF0ZWQuIAorCSAgICAqLworCisJICAgIHN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgICAgICAgKnR5cGU7CisJICAgIHN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgICAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIkVudW1lcmF0ZWQoQ0MtVW5pdC1UeXBlKSIgLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJICAgIHN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiVElNRSIsIHsgLmkzMiA9IDAgfX07CisJICAgIHN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiTU9ORVkiLCB7IC5pMzIgPSAxIH19OworCSAgICBzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMyA9IHsgIlRPVEFMLU9DVEVUUyIsIHsgLmkzMiA9IDIgfX07CisJICAgIHN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF80ID0geyAiSU5QVVQtT0NURVRTIiwgeyAuaTMyID0gMyB9fTsKKwkgICAgc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzUgPSB7ICJPVVRQVVQtT0NURVRTIiwgeyAuaTMyID0gNCB9fTsKKwkgICAgc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzYgPSB7ICJTRVJWSUNFLVNQRUNJRklDLVVOSVRTIiwgeyAuaTMyID0gNSB9fTsKKyAgICAgICAgICAgICAgICAgIAorCisJICAgIHN0cnVjdCBkaWN0X2F2cF9kYXRhICAgIGRhdGEgPSB7IAorCQk0NTQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29kZSAqLworCQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVuZG9yICovCisJCSJDQy1Vbml0LVR5cGUiLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOYW1lICovCisJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgICAvKiBGaXhlZCBmbGFncyAqLworCQlBVlBfRkxBR19NQU5EQVRPUlksICAgICAgICAgICAgICAgICAgICAgLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJQVZQX1RZUEVfSU5URUdFUjMyICAgICAgICAgICAgICAgICAgICAgIC8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJICAgIH07CisJICAgIC8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSAsIE5VTEwsICZ0eXBlKTsKKwkgICAgQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSAsIHR5cGUsIE5VTEwpOyAgIAorCSAgICBDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yICwgdHlwZSwgTlVMTCk7IAorCSAgICBDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zICwgdHlwZSwgTlVMTCk7IAorCSAgICBDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF80ICwgdHlwZSwgTlVMTCk7IAorCSAgICBDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF81ICwgdHlwZSwgTlVMTCk7IAorCSAgICBDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF82ICwgdHlwZSwgTlVMTCk7IAorCSAgICBDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgdHlwZSwgTlVMTCk7CisJfQorCisJLyogQ2hlY2stQmFsYW5jZS1SZXN1bHQgKi8KKwl7CisJICAgIC8qIAorCSAgICAgICBFbnVtZXJhdGVkLiAKKwkgICAgKi8KKworCSAgICBzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICAgICAgICp0eXBlOworCSAgICBzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgICAgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICJFbnVtZXJhdGVkKENoZWNrLUJhbGFuY2UtUmVzdWx0KSIgLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJICAgIHN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiRU5PVUdIX0NSRURJVCIsIHsgLmkzMiA9IDAgfX07CisJICAgIHN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiTk9fQ1JFRElUIiwgeyAuaTMyID0gMSB9fTsKKyAgICAgICAgICAgICAgICAgIAorCisJICAgIHN0cnVjdCBkaWN0X2F2cF9kYXRhICAgIGRhdGEgPSB7IAorCQk0MjIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29kZSAqLworCQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVuZG9yICovCisJCSJDaGVjay1CYWxhbmNlLVJlc3VsdCIsICAgICAgICAgICAgICAgICAvKiBOYW1lICovCisJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgICAvKiBGaXhlZCBmbGFncyAqLworCQlBVlBfRkxBR19NQU5EQVRPUlksICAgICAgICAgICAgICAgICAgICAgLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJQVZQX1RZUEVfSU5URUdFUjMyICAgICAgICAgICAgICAgICAgICAgIC8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJICAgIH07CisJICAgIC8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSAsIE5VTEwsICZ0eXBlKTsKKwkgICAgQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSAsIHR5cGUsIE5VTEwpOyAgCisJICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIgLCB0eXBlLCBOVUxMKTsgCisJICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCB0eXBlLCBOVUxMKTsKKwl9CisgICAgICAgICAgICAgICAgCisJLyogQ29zdC1Vbml0ICovCisJeworCSAgICAvKiAKKwkgICAgICAgVVRGOFN0cmluZy4gCisJICAgICovCisJICAgIHN0cnVjdCBkaWN0X2F2cF9kYXRhICAgIGRhdGEgPSB7IAorCQk0MjQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29kZSAqLworCQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVuZG9yICovCisJCSJDb3N0LVVuaXQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOYW1lICovCisJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgICAvKiBGaXhlZCBmbGFncyAqLworCQlBVlBfRkxBR19NQU5EQVRPUlksICAgICAgICAgICAgICAgICAgICAgLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJQVZQX1RZUEVfT0NURVRTVFJJTkcgICAgICAgICAgICAgICAgICAgIC8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJICAgIH07CisJICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCX0gCisgICAgICAgICAgICAgICAgCisJLyogQ3JlZGl0LUNvbnRyb2wgKi8KKwl7CisJICAgIC8qIAorCSAgICAgICBFbnVtZXJhdGVkLiAKKwkgICAgKi8KKworCSAgICBzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICAgICAgICp0eXBlOworCSAgICBzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgICAgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICJFbnVtZXJhdGVkKENyZWRpdC1Db250cm9sKSIgLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJICAgIHN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiQ1JFRElUX0FVVEhPUklaQVRJT04iLCB7IC5pMzIgPSAwIH19OworCSAgICBzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIlJFX0FVVEhPUklaQVRJT04iLCB7IC5pMzIgPSAxIH19OworICAgICAgICAgICAgICAgICAgCisJICAgIHN0cnVjdCBkaWN0X2F2cF9kYXRhICAgIGRhdGEgPSB7IAorCQk0MjYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29kZSAqLworCQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVuZG9yICovCisJCSJDcmVkaXQtQ29udHJvbCIsICAgICAgICAgICAgICAgICAgICAgICAvKiBOYW1lICovCisJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgICAvKiBGaXhlZCBmbGFncyAqLworCQlBVlBfRkxBR19NQU5EQVRPUlksICAgICAgICAgICAgICAgICAgICAgLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJQVZQX1RZUEVfSU5URUdFUjMyICAgICAgICAgICAgICAgICAgICAgIC8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJICAgIH07CisJICAgIC8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSAsIE5VTEwsICZ0eXBlKTsKKwkgICAgQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7IAorCSAgICBDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkgICAgQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIHR5cGUsIE5VTEwpOworCX0KKyAgIAorCS8qIENyZWRpdC1Db250cm9sLUZhaWx1cmUtSGFuZGxpbmcgKi8KKwl7CisJICAgIC8qIAorCSAgICAgICBFbnVtZXJhdGVkLiAKKwkgICAgKi8KKworCSAgICBzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICAgICAgICp0eXBlOworCSAgICBzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgICAgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICJFbnVtZXJhdGVkKENyZWRpdC1Db250cm9sLUZhaWx1cmUtSGFuZGxpbmcpIiAsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkgICAgc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJURVJNSU5BVEUiLCB7IC5pMzIgPSAwIH19OworCSAgICBzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIkNPTlRJTlVFIiwgeyAuaTMyID0gMSB9fTsKKwkgICAgc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMgPSB7ICJSRVRSWV9BTkRfVEVSTUlOQVRFIiwgeyAuaTMyID0gMiB9fTsKKyAgICAgICAgICAgICAgICAgIAorCSAgICBzdHJ1Y3QgZGljdF9hdnBfZGF0YSAgICBkYXRhID0geyAKKwkJNDI3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvZGUgKi8KKwkJMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZlbmRvciAqLworCQkiQ3JlZGl0LUNvbnRyb2wtRmFpbHVyZS1IYW5kbGluZyIsICAgICAgLyogTmFtZSAqLworCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksICAgLyogRml4ZWQgZmxhZ3MgKi8KKwkJQVZQX0ZMQUdfTUFOREFUT1JZLCAgICAgICAgICAgICAgICAgICAgIC8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCUFWUF9UWVBFX0lOVEVHRVIzMiAgICAgICAgICAgICAgICAgICAgICAvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCSAgICB9OworCSAgICAvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCSAgICBDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEgLCBOVUxMLCAmdHlwZSk7CisJICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEgLCB0eXBlLCBOVUxMKTsgICAKKwkgICAgQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiAsIHR5cGUsIE5VTEwpOworCSAgICBDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zICwgdHlwZSwgTlVMTCk7CisJICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCB0eXBlLCBOVUxMKTsKKwl9CisKKwkvKiBDdXJyZW5jeS1Db2RlICovCisJeworCSAgICAvKiAKKwkgICAgICAgVW5zaWduZWQzMi4gCisJICAgICovCisJICAgIHN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQk0MjUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29kZSAqLworCQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVuZG9yICovCisJCSJDdXJyZW5jeS1Db2RlIiwgICAgICAgICAgICAgICAgICAgICAgICAvKiBOYW1lICovCisJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgICAvKiBGaXhlZCBmbGFncyAqLworCQlBVlBfRkxBR19NQU5EQVRPUlksICAgICAgICAgICAgICAgICAgICAgLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJQVZQX1RZUEVfVU5TSUdORUQzMiAgICAgICAgICAgICAgICAgICAgIC8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJICAgIH07CisJICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCBOVUxMKTsKKwl9CisKKwkvKiBEaXJlY3QtRGViaXRpbmctRmFpbHVyZS1IYW5kbGluZyAqLworCXsKKwkgICAgLyogCisJICAgICAgIEVudW1lcmF0ZWQuIAorCSAgICAqLworCisJICAgIHN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgICAgICAgKnR5cGU7CisJICAgIHN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgICAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIkVudW1lcmF0ZWQoRGlyZWN0LURlYml0aW5nLUZhaWx1cmUtSGFuZGxpbmcpIiAsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkgICAgc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJURVJNSU5BVEVfT1JfQlVGRkVSIiwgeyAuaTMyID0gMCB9fTsKKwkgICAgc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJDT05USU5VRSIsIHsgLmkzMiA9IDEgfX07CisgICAgICAgICAgICAgICAgICAKKwkgICAgc3RydWN0IGRpY3RfYXZwX2RhdGEgICAgZGF0YSA9IHsgCisJCTQyOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb2RlICovCisJCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWZW5kb3IgKi8KKwkJIkRpcmVjdC1EZWJpdGluZy1GYWlsdXJlLUhhbmRsaW5nIiwgICAgIC8qIE5hbWUgKi8KKwkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAgIC8qIEZpeGVkIGZsYWdzICovCisJCUFWUF9GTEFHX01BTkRBVE9SWSwgICAgICAgICAgICAgICAgICAgICAvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQlBVlBfVFlQRV9JTlRFR0VSMzIgICAgICAgICAgICAgICAgICAgICAgLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkgICAgfTsKKwkgICAgLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkgICAgQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhICwgTlVMTCwgJnR5cGUpOworCSAgICBDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xICwgdHlwZSwgTlVMTCk7IAorCSAgICBDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yICwgdHlwZSwgTlVMTCk7CisJICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCB0eXBlLCBOVUxMKTsKKwl9CisKKwkvKiBFeHBvbmVudCAqLworCXsKKwkgICAgLyogCisJICAgICAgIEludGVnZXIzMi4gCisJICAgICovCisJICAgIHN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQk0MjksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29kZSAqLworCQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVuZG9yICovCisJCSJFeHBvbmVudCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOYW1lICovCisJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgICAvKiBGaXhlZCBmbGFncyAqLworCQlBVlBfRkxBR19NQU5EQVRPUlksICAgICAgICAgICAgICAgICAgICAgLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJQVZQX1RZUEVfSU5URUdFUjMyICAgICAgICAgICAgICAgICAgICAgIC8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJICAgIH07CisJICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCBOVUxMKTsKKwl9CisgICAgICAgICAgICAgICAgCisJLyogRmluYWwtVW5pdC1BY3Rpb24gKi8KKwl7CisJICAgIC8qIAorCSAgICAgICBFbnVtZXJhdGVkLiAKKwkgICAgKi8KKworCSAgICBzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICAgICAgICp0eXBlOworCSAgICBzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgICAgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICJFbnVtZXJhdGVkKEZpbmFsLVVuaXQtQWN0aW9uKSIgLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJICAgIHN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiVEVSTUlOQVRFIiwgeyAuaTMyID0gMCB9fTsKKwkgICAgc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJSRURJUkVDVCIsIHsgLmkzMiA9IDEgfX07CisJICAgIHN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAiUkVTVFJJQ1RfQUNDRVNTIiwgeyAuaTMyID0gMiB9fTsKKyAgICAgICAgICAgICAgICAgIAorCSAgICBzdHJ1Y3QgZGljdF9hdnBfZGF0YSAgICBkYXRhID0geyAKKwkJNDQ5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvZGUgKi8KKwkJMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZlbmRvciAqLworCQkiRmluYWwtVW5pdC1BY3Rpb24iLCAgICAgICAgICAgICAgICAgICAgLyogTmFtZSAqLworCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksICAgLyogRml4ZWQgZmxhZ3MgKi8KKwkJQVZQX0ZMQUdfTUFOREFUT1JZLCAgICAgICAgICAgICAgICAgICAgIC8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCUFWUF9UWVBFX0lOVEVHRVIzMiAgICAgICAgICAgICAgICAgICAgICAvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCSAgICB9OworCSAgICAvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCSAgICBDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEgLCBOVUxMLCAmdHlwZSk7CisJICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEgLCB0eXBlLCBOVUxMKTsgIAorCSAgICBDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yICwgdHlwZSwgTlVMTCk7IAorCSAgICBDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zICwgdHlwZSwgTlVMTCk7IAorCSAgICBDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgdHlwZSwgTlVMTCk7CisJfQorCisJLyogRy1TLVUtUG9vbC1JZGVudGlmaWVyICovCisJeworCSAgICAvKiAKKwkgICAgICAgVW5zaWduZWQzMi4gCisJICAgICovCisJICAgIHN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQk0NTMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29kZSAqLworCQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVuZG9yICovCisJCSJHLVMtVS1Qb29sLUlkZW50aWZpZXIiLCAgICAgICAgICAgICAgICAvKiBOYW1lICovCisJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgICAvKiBGaXhlZCBmbGFncyAqLworCQlBVlBfRkxBR19NQU5EQVRPUlksICAgICAgICAgICAgICAgICAgICAgLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJQVZQX1RZUEVfVU5TSUdORUQzMiAgICAgICAgICAgICAgICAgICAgIC8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJICAgIH07CisJICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCBOVUxMKTsKKwl9CisgICAgICAgICAgICAgICAgCisJLyogTXVsdGlwbGUtU2VydmljZXMtSW5kaWNhdG9yICovCisJeworCSAgICAvKiAKKwkgICAgICAgRW51bWVyYXRlZC4gCisJICAgICovCisKKwkgICAgc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAgICAgICAqdHlwZTsKKwkgICAgc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICAgICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiRW51bWVyYXRlZChNdWx0aXBsZS1TZXJ2aWNlcy1JbmRpY2F0b3IpIiAsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkgICAgc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJNVUxUSVBMRV9TRVJWSUNFU19OT1RfU1VQUE9SVEVEIiwgeyAuaTMyID0gMCB9fTsKKwkgICAgc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJNVUxUSVBMRV9TRVJWSUNFU19TVVBQT1JURUQiLCB7IC5pMzIgPSAxIH19OworICAgICAgICAgICAgICAgICAgCisJICAgIHN0cnVjdCBkaWN0X2F2cF9kYXRhICAgIGRhdGEgPSB7IAorCQk0NTUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29kZSAqLworCQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVuZG9yICovCisJCSJNdWx0aXBsZS1TZXJ2aWNlcy1JbmRpY2F0b3IiLCAgICAgICAgICAvKiBOYW1lICovCisJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgICAvKiBGaXhlZCBmbGFncyAqLworCQlBVlBfRkxBR19NQU5EQVRPUlksICAgICAgICAgICAgICAgICAgICAgLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJQVZQX1RZUEVfSU5URUdFUjMyICAgICAgICAgICAgICAgICAgICAgIC8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJICAgIH07CisJICAgIC8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSAsIE5VTEwsICZ0eXBlKTsKKwkgICAgQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSAsIHR5cGUsIE5VTEwpOyAKKwkgICAgQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiAsIHR5cGUsIE5VTEwpOworCSAgICBDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgdHlwZSwgTlVMTCk7CisJfQorICAgICAgICAgICAgICAgIAorCS8qIFJhdGluZy1Hcm91cCAqLworCXsKKwkgICAgLyogCisJICAgICAgIFVuc2lnbmVkMzIuIAorCSAgICAqLworCSAgICBzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJNDMyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvZGUgKi8KKwkJMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZlbmRvciAqLworCQkiUmF0aW5nLUdyb3VwIiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogTmFtZSAqLworCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksICAgLyogRml4ZWQgZmxhZ3MgKi8KKwkJQVZQX0ZMQUdfTUFOREFUT1JZLCAgICAgICAgICAgICAgICAgICAgIC8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCUFWUF9UWVBFX1VOU0lHTkVEMzIgICAgICAgICAgICAgICAgICAgICAvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCSAgICB9OworCSAgICBDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgTlVMTCk7CisJfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkvKiBSZWRpcmVjdC1BZGRyZXNzLVR5cGUgKi8KKwl7CisJICAgIC8qIAorCSAgICAgICBFbnVtZXJhdGVkLiAKKwkgICAgKi8KKworCSAgICBzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICAgICAgICp0eXBlOworCSAgICBzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgICAgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICJFbnVtZXJhdGVkKFJlZGlyZWN0LUFkZHJlc3MtVHlwZSkiICwgTlVMTCwgTlVMTCwgTlVMTCB9OworCSAgICBzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIklQVjRfQUREUkVTUyIsIHsgLmkzMiA9IDAgfX07CisJICAgIHN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiSVBWNl9BRERSRVNTIiwgeyAuaTMyID0gMSB9fTsKKwkgICAgc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMgPSB7ICJVUkwiLCB7IC5pMzIgPSAyIH19OworCSAgICBzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNCA9IHsgIlNJUF9VUkkiLCB7IC5pMzIgPSAzIH19OworICAgICAgICAgICAgICAgICAgCisJICAgIHN0cnVjdCBkaWN0X2F2cF9kYXRhICAgIGRhdGEgPSB7IAorCQk0MzMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29kZSAqLworCQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVuZG9yICovCisJCSJSZWRpcmVjdC1BZGRyZXNzLVR5cGUiLCAgICAgICAgICAgICAgICAvKiBOYW1lICovCisJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgICAvKiBGaXhlZCBmbGFncyAqLworCQlBVlBfRkxBR19NQU5EQVRPUlksICAgICAgICAgICAgICAgICAgICAgLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJQVZQX1RZUEVfSU5URUdFUjMyICAgICAgICAgICAgICAgICAgICAgIC8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJICAgIH07CisJICAgIC8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSAsIE5VTEwsICZ0eXBlKTsKKwkgICAgQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSAsIHR5cGUsIE5VTEwpOyAgCisJICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIgLCB0eXBlLCBOVUxMKTsgCisJICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMgLCB0eXBlLCBOVUxMKTsgCisJICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzQgLCB0eXBlLCBOVUxMKTsgCisJICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCB0eXBlLCBOVUxMKTsKKwl9ICAgICAgICAgICAKKworCS8qIFJlZGlyZWN0LVNlcnZlci1BZGRyZXNzICovCisJeworCSAgICAvKiAKKwkgICAgICAgVVRGOFN0cmluZy4gCisJICAgICovCisJICAgIHN0cnVjdCBkaWN0X2F2cF9kYXRhICAgIGRhdGEgPSB7IAorCQk0MzUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29kZSAqLworCQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVuZG9yICovCisJCSJSZWRpcmVjdC1TZXJ2ZXItQWRkcmVzcyIsICAgICAgICAgICAgICAvKiBOYW1lICovCisJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgICAvKiBGaXhlZCBmbGFncyAqLworCQlBVlBfRkxBR19NQU5EQVRPUlksICAgICAgICAgICAgICAgICAgICAgLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJQVZQX1RZUEVfT0NURVRTVFJJTkcgICAgICAgICAgICAgICAgICAgIC8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJICAgIH07CisJICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCX0KKyAgICAgICAgICAgICAgICAKKwkvKiBSZXF1ZXN0ZWQtQWN0aW9uICovCisJeworCSAgICAvKiAKKwkgICAgICAgRW51bWVyYXRlZC4gCisJICAgICovCisKKwkgICAgc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAgICAgICAqdHlwZTsKKwkgICAgc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICAgICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiRW51bWVyYXRlZChSZXF1ZXN0ZWQtQWN0aW9uKSIgLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJICAgIHN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiRElSRUNUX0RFQklUSU5HIiwgeyAuaTMyID0gMCB9fTsKKwkgICAgc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJSRUZVTkRfQUNDT1VOVCIsIHsgLmkzMiA9IDEgfX07CisJICAgIHN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAiQ0hFQ0tfQkFMQU5DRSIsIHsgLmkzMiA9IDIgfX07CisJICAgIHN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF80ID0geyAiUFJJQ0VfRU5RVUlSWSIsIHsgLmkzMiA9IDMgfX07CisgICAgICAgICAgICAgICAgICAKKwkgICAgc3RydWN0IGRpY3RfYXZwX2RhdGEgICAgZGF0YSA9IHsgCisJCTQzNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb2RlICovCisJCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWZW5kb3IgKi8KKwkJIlJlcXVlc3RlZC1BY3Rpb24iLCAgICAgICAgICAgICAgICAgICAgIC8qIE5hbWUgKi8KKwkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAgIC8qIEZpeGVkIGZsYWdzICovCisJCUFWUF9GTEFHX01BTkRBVE9SWSwgICAgICAgICAgICAgICAgICAgICAvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQlBVlBfVFlQRV9JTlRFR0VSMzIgICAgICAgICAgICAgICAgICAgICAgLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkgICAgfTsKKwkgICAgLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkgICAgQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhICwgTlVMTCwgJnR5cGUpOworCSAgICBDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xICwgdHlwZSwgTlVMTCk7IAorCSAgICBDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yICwgdHlwZSwgTlVMTCk7CisJICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMgLCB0eXBlLCBOVUxMKTsKKwkgICAgQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNCAsIHR5cGUsIE5VTEwpOworCSAgICBDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgdHlwZSwgTlVMTCk7CisJfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJLyogUmVzdHJpY3Rpb24tRmlsdGVyLVJ1bGUgKi8KKwl7CisJICAgIC8qIAorCSAgICAgICBJUEZpbHRyUnVsZS4gCisJICAgICovCisJICAgIHN0cnVjdCBkaWN0X2F2cF9kYXRhICAgIGRhdGEgPSB7IAorCQk0MzgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29kZSAqLworCQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVuZG9yICovCisJCSJSZXN0cmljdGlvbi1GaWx0ZXItUnVsZSIsICAgICAgICAgICAgICAvKiBOYW1lICovCisJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgICAvKiBGaXhlZCBmbGFncyAqLworCQlBVlBfRkxBR19NQU5EQVRPUlksICAgICAgICAgICAgICAgICAgICAgLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJQVZQX1RZUEVfT0NURVRTVFJJTkcgICAgICAgICAgICAgICAgICAgIC8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJICAgIH07CisJICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBJUEZpbHRlclJ1bGVfdHlwZSwgTlVMTCk7CisJfQorCS8qU2VydmljZS1Db250ZXh0LUlkICAqLworCXsKKwkgICAgLyogCisJICAgICAgIFVURjhTdHJpbmcuIAorCSAgICAqLworCSAgICBzdHJ1Y3QgZGljdF9hdnBfZGF0YSAgICBkYXRhID0geyAKKwkJNDYxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvZGUgKi8KKwkJMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZlbmRvciAqLworCQkiU2VydmljZS1Db250ZXh0LUlkIiwgICAgICAgICAgICAgICAgICAgLyogTmFtZSAqLworCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksICAgLyogRml4ZWQgZmxhZ3MgKi8KKwkJQVZQX0ZMQUdfTUFOREFUT1JZLCAgICAgICAgICAgICAgICAgICAgIC8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCUFWUF9UWVBFX09DVEVUU1RSSU5HICAgICAgICAgICAgICAgICAgICAvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCSAgICB9OworCSAgICBDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwl9CisKKwkvKiBTZXJ2aWNlLUlkZW50aWZpZXIgKi8KKwl7CisJICAgIC8qIAorCSAgICAgICBVbnNpZ25lZDMyLiAKKwkgICAgKi8KKwkgICAgc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCTQzOSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb2RlICovCisJCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWZW5kb3IgKi8KKwkJIlNlcnZpY2UtSWRlbnRpZmllciIsICAgICAgICAgICAgICAgICAgIC8qIE5hbWUgKi8KKwkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAgIC8qIEZpeGVkIGZsYWdzICovCisJCUFWUF9GTEFHX01BTkRBVE9SWSwgICAgICAgICAgICAgICAgICAgICAvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQlBVlBfVFlQRV9VTlNJR05FRDMyICAgICAgICAgICAgICAgICAgICAgLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkgICAgfTsKKwkgICAgQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsIE5VTEwpOworCX0gICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCS8qIFNlcnZpY2UtUGFyYW1ldGVyLVR5cGUgKi8KKwl7CisJICAgIC8qIAorCSAgICAgICBVbnNpZ25lZDMyLiAKKwkgICAgKi8KKwkgICAgc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCTQ0MSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb2RlICovCisJCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWZW5kb3IgKi8KKwkJIlNlcnZpY2UtUGFyYW1ldGVyLVR5cGUiLCAgICAgICAgICAgICAgIC8qIE5hbWUgKi8KKwkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAgIC8qIEZpeGVkIGZsYWdzICovCisJCUFWUF9GTEFHX01BTkRBVE9SWSwgICAgICAgICAgICAgICAgICAgICAvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQlBVlBfVFlQRV9VTlNJR05FRDMyICAgICAgICAgICAgICAgICAgICAgLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkgICAgfTsKKwkgICAgQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsIE5VTEwpOworCX0KKyAgICAgICAgICAgICAgICAKKwkvKiBTZXJ2aWNlLVBhcmFtZXRlci1WYWx1ZSAqLworCXsKKwkgICAgLyogCisJICAgICAgIE9jdGV0U3RyaW5nLiAKKwkgICAgKi8KKwkgICAgc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCTQ0MiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb2RlICovCisJCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWZW5kb3IgKi8KKwkJIlNlcnZpY2UtUGFyYW1ldGVyLVZhbHVlIiwgICAgICAgICAgICAgIC8qIE5hbWUgKi8KKwkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAgIC8qIEZpeGVkIGZsYWdzICovCisJCUFWUF9GTEFHX01BTkRBVE9SWSwgICAgICAgICAgICAgICAgICAgICAvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQlBVlBfVFlQRV9PQ1RFVFNUUklORyAgICAgICAgICAgICAgICAgICAgLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkgICAgfTsKKwkgICAgQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsIE5VTEwpOworCX0KKworCS8qIFN1YnNjcmlwdGlvbi1JZC1EYXRhICovCisJeworCSAgICAvKiAKKwkgICAgICAgVVRGOFN0cmluZy4gCisJICAgICovCisJICAgIHN0cnVjdCBkaWN0X2F2cF9kYXRhICAgIGRhdGEgPSB7IAorCQk0NDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29kZSAqLworCQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVuZG9yICovCisJCSJTdWJzY3JpcHRpb24tSWQtRGF0YSIsICAgICAgICAgICAgICAgICAvKiBOYW1lICovCisJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgICAvKiBGaXhlZCBmbGFncyAqLworCQlBVlBfRkxBR19NQU5EQVRPUlksICAgICAgICAgICAgICAgICAgICAgLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJQVZQX1RZUEVfT0NURVRTVFJJTkcgICAgICAgICAgICAgICAgICAgIC8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJICAgIH07CisJICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCX0gICAgICAgICAgICAKKyAgICAKKwkvKiBTdWJzY3JpcHRpb24tSWQtVHlwZSAqLworCXsKKwkgICAgLyogCisJICAgICAgIEVudW1lcmF0ZWQuIAorCSAgICAqLworCisJICAgIHN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgICAgICAgKnR5cGU7CisJICAgIHN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgICAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIkVudW1lcmF0ZWQoU3Vic2NyaXB0aW9uLUlkLVR5cGUpIiAsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkgICAgc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJFTkRfVVNFUl9FMTY0IiwgeyAuaTMyID0gMCB9fTsKKwkgICAgc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJFTkRfVVNFUl9JTVNJIiwgeyAuaTMyID0gMSB9fTsKKwkgICAgc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMgPSB7ICJFTkRfVVNFUl9TSVBfVVJJIiwgeyAuaTMyID0gMiB9fTsKKwkgICAgc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzQgPSB7ICJFTkRfVVNFUl9OQUkiLCB7IC5pMzIgPSAzIH19OworICAgICAgICAgICAgICAgICAgCisJICAgIHN0cnVjdCBkaWN0X2F2cF9kYXRhICAgIGRhdGEgPSB7IAorCQk0NTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29kZSAqLworCQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVuZG9yICovCisJCSJTdWJzY3JpcHRpb24tSWQtVHlwZSIsICAgICAgICAgICAgICAgICAvKiBOYW1lICovCisJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgICAvKiBGaXhlZCBmbGFncyAqLworCQlBVlBfRkxBR19NQU5EQVRPUlksICAgICAgICAgICAgICAgICAgICAgLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJQVZQX1RZUEVfSU5URUdFUjMyICAgICAgICAgICAgICAgICAgICAgIC8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJICAgIH07CisJICAgIC8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSAsIE5VTEwsICZ0eXBlKTsKKwkgICAgQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSAsIHR5cGUsIE5VTEwpOyAKKwkgICAgQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiAsIHR5cGUsIE5VTEwpOworCSAgICBDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zICwgdHlwZSwgTlVMTCk7CisJICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzQgLCB0eXBlLCBOVUxMKTsKKwkgICAgQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIHR5cGUsIE5VTEwpOworCX0KKyAgICAgICAgICAgICAgICAKKwkvKiBUYXJpZmYtQ2hhbmdlLVVzYWdlICovCisJeworCSAgICAvKiAKKwkgICAgICAgRW51bWVyYXRlZC4gCisJICAgICovCisKKwkgICAgc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAgICAgICAqdHlwZTsKKwkgICAgc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICAgICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiRW51bWVyYXRlZChUYXJpZmYtQ2hhbmdlLVVzYWdlKSIgLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJICAgIHN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiVU5JVF9CRUZPUkVfVEFSSUZGX0NIQU5HRSIsIHsgLmkzMiA9IDAgfX07CisJICAgIHN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiVU5JVF9BRlRFUl9UQVJJRkZfQ0hBTkdFIiwgeyAuaTMyID0gMSB9fTsKKwkgICAgc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMgPSB7ICJVTklUX0lOREVURVJNSU5BVEUiLCB7IC5pMzIgPSAyIH19OworICAgICAgICAgICAgICAgICAgCisJICAgIHN0cnVjdCBkaWN0X2F2cF9kYXRhICAgIGRhdGEgPSB7IAorCQk0NTIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29kZSAqLworCQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVuZG9yICovCisJCSJUYXJpZmYtQ2hhbmdlLVVzYWdlIiwgICAgICAgICAgICAgICAgICAvKiBOYW1lICovCisJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgICAvKiBGaXhlZCBmbGFncyAqLworCQlBVlBfRkxBR19NQU5EQVRPUlksICAgICAgICAgICAgICAgICAgICAgLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJQVZQX1RZUEVfSU5URUdFUjMyICAgICAgICAgICAgICAgICAgICAgIC8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJICAgIH07CisJICAgIC8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSAsIE5VTEwsICZ0eXBlKTsKKwkgICAgQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSAsIHR5cGUsIE5VTEwpOyAKKwkgICAgQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiAsIHR5cGUsIE5VTEwpOworCSAgICBDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zICwgdHlwZSwgTlVMTCk7CisJICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCB0eXBlLCBOVUxMKTsKKwl9CisgICAgICAgICAgICAgICAgCisJLyogVGFyaWZmLVRpbWUtQ2hhbmdlICovCisJeworCSAgICAvKgorCSAgICAgIFRpbWUuIAorCSAgICAqLworCSAgICBzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJNDUxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvZGUgKi8KKwkJMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZlbmRvciAqLworCQkiVGFyaWZmLVRpbWUtQ2hhbmdlIiwgICAgICAgICAgICAgICAgICAgLyogTmFtZSAqLworCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksICAgLyogRml4ZWQgZmxhZ3MgKi8KKwkJQVZQX0ZMQUdfTUFOREFUT1JZLCAgICAgICAgICAgICAgICAgICAgIC8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCUFWUF9UWVBFX09DVEVUU1RSSU5HICAgICAgICAgICAgICAgICAgICAvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCSAgICB9OworCSAgICBDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgVGltZV90eXBlLCBOVUxMKTsKKwl9CisKKwkvKiBVc2VyLUVxdWlwbWVudC1JbmZvLVR5cGUgKi8KKwl7CisJICAgIC8qIAorCSAgICAgICBFbnVtZXJhdGVkLiAKKwkgICAgKi8KKworCSAgICBzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICAgICAgICp0eXBlOworCSAgICBzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgICAgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICJFbnVtZXJhdGVkKFVzZXItRXF1aXBtZW50LUluZm8tVHlwZSkiICwgTlVMTCwgTlVMTCwgTlVMTCB9OworCSAgICBzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIklNRUlTViIsIHsgLmkzMiA9IDAgfX07CisJICAgIHN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiTUFDIiwgeyAuaTMyID0gMSB9fTsKKwkgICAgc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMgPSB7ICJFVUk2NCIsIHsgLmkzMiA9IDIgfX07CisgICAgICAgICAgICAgICAgICAKKwkgICAgc3RydWN0IGRpY3RfYXZwX2RhdGEgICAgZGF0YSA9IHsgCisJCTQ1OSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb2RlICovCisJCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWZW5kb3IgKi8KKwkJIlVzZXItRXF1aXBtZW50LUluZm8tVHlwZSIsICAgICAgICAgICAgIC8qIE5hbWUgKi8KKwkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAgIC8qIEZpeGVkIGZsYWdzICovCisJCUFWUF9GTEFHX01BTkRBVE9SWSwgICAgICAgICAgICAgICAgICAgICAvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQlBVlBfVFlQRV9JTlRFR0VSMzIgICAgICAgICAgICAgICAgICAgICAgLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkgICAgfTsKKwkgICAgLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkgICAgQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhICwgTlVMTCwgJnR5cGUpOworCSAgICBDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xICwgdHlwZSwgTlVMTCk7CisJICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIgLCB0eXBlLCBOVUxMKTsKKwkgICAgQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMyAsIHR5cGUsIE5VTEwpOworCSAgICBDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgdHlwZSwgTlVMTCk7CisJfSAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgCisJLyogVXNlci1FcXVpcG1lbnQtSW5mby1WYWx1ZSAqLworCXsKKwkgICAgLyogCisJICAgICAgIE9jdGV0U3RyaW5nLiAKKwkgICAgKi8KKwkgICAgc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCTQ2MCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb2RlICovCisJCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWZW5kb3IgKi8KKwkJIlVzZXItRXF1aXBtZW50LUluZm8tVmFsdWUiLCAgICAgICAgICAgIC8qIE5hbWUgKi8KKwkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAgIC8qIEZpeGVkIGZsYWdzICovCisJCUFWUF9GTEFHX01BTkRBVE9SWSwgICAgICAgICAgICAgICAgICAgICAvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQlBVlBfVFlQRV9PQ1RFVFNUUklORyAgICAgICAgICAgICAgICAgICAgLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkgICAgfTsKKwkgICAgQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsIE5VTEwpOworCX0KKworCS8qIFZhbHVlLURpZ2l0cyAqLworCXsKKwkgICAgLyogCisJICAgICAgIEludGVnZXI2NC4gCisJICAgICovCisJICAgIHN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQk0NDcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29kZSAqLworCQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVuZG9yICovCisJCSJWYWx1ZS1EaWdpdHMiLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOYW1lICovCisJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgICAvKiBGaXhlZCBmbGFncyAqLworCQlBVlBfRkxBR19NQU5EQVRPUlksICAgICAgICAgICAgICAgICAgICAgLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJQVZQX1RZUEVfSU5URUdFUjY0ICAgICAgICAgICAgICAgICAgICAgIC8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJICAgIH07CisJICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCBOVUxMKTsKKwl9ICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAKKwkvKiBWYWxpZGl0eS1UaW1lICovCisJeworCSAgICAvKiAKKwkgICAgICAgVW5zaWduZWQzMi4gCisJICAgICovCisJICAgIHN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQk0NDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29kZSAqLworCQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVuZG9yICovCisJCSJWYWxpZGl0eS1UaW1lIiwgICAgICAgICAgICAgICAgICAgICAgICAvKiBOYW1lICovCisJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgICAvKiBGaXhlZCBmbGFncyAqLworCQlBVlBfRkxBR19NQU5EQVRPUlksICAgICAgICAgICAgICAgICAgICAgLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJQVZQX1RZUEVfVU5TSUdORUQzMiAgICAgICAgICAgICAgICAgICAgIC8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJICAgIH07CisJICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCBOVUxMKTsKKwl9CisKKworCS8qIEdyb3VwZWQgQVZQcyBiZWxvdyBzaW5jZSB0aGV5IGhhdmUgZGVwZW5kZW5jaWVzIG9uIHR5cGVzIGFib3ZlICovCisKKwkvKiBSZWRpcmVjdC1TZXJ2ZXIgKi8KKwl7CisJICAgIC8qCisJICAgICAgR3JvdXBlZAorCSAgICAqLworCSAgICBzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJICAgIHN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCTQzNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb2RlICovCisJCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWZW5kb3IgKi8KKwkJIlJlZGlyZWN0LVNlcnZlciIsICAgICAgICAgICAgICAgICAgICAgIC8qIE5hbWUgKi8KKwkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAgIC8qIEZpeGVkIGZsYWdzICovCisJCUFWUF9GTEFHX01BTkRBVE9SWSwgICAgICAgICAgICAgICAgICAgICAvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQlBVlBfVFlQRV9HUk9VUEVEICAgICAgICAgICAgICAgICAgICAgICAgLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkgICAgfTsKKwkgICAgc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9IHsKKwkJeyAgIlJlZGlyZWN0LUFkZHJlc3MtVHlwZSIsCVJVTEVfUkVRVUlSRUQsCS0xLCAxIH0sCisJCXsgICJSZWRpcmVjdC1TZXJ2ZXItQWRkcmVzcyIsCVJVTEVfUkVRVUlSRUQsCS0xLCAxIH0KKwkgICAgfTsKKwkgICAgQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCSAgICBQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwl9CisKKwkvKiBTZXJ2aWNlLVBhcmFtZXRlci1JbmZvICovCisJeworCSAgICAvKgorCSAgICAgIEdyb3VwZWQKKwkgICAgKi8KKwkgICAgc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCSAgICBzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQk0NDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29kZSAqLworCQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVuZG9yICovCisJCSJTZXJ2aWNlLVBhcmFtZXRlci1JbmZvIiwgICAgICAgICAgICAgICAvKiBOYW1lICovCisJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgICAvKiBGaXhlZCBmbGFncyAqLworCQlBVlBfRkxBR19NQU5EQVRPUlksICAgICAgICAgICAgICAgICAgICAgLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJQVZQX1RZUEVfR1JPVVBFRCAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJICAgIH07CisJICAgIHN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPSB7CisJCXsgICJTZXJ2aWNlLVBhcmFtZXRlci1UeXBlIiwJUlVMRV9SRVFVSVJFRCwJLTEsIDEgfSwKKwkJeyAgIlNlcnZpY2UtUGFyYW1ldGVyLVZhbHVlIiwJUlVMRV9SRVFVSVJFRCwJLTEsIDEgfQorCSAgICB9OworCSAgICBDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJICAgIFBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCX0gICAgICAgICAgICAgICAgICAgICAgICAKKworCS8qIFN1YnNjcmlwdGlvbi1JZCAqLworCXsKKwkgICAgLyoKKwkgICAgICBHcm91cGVkCisJICAgICovCisJICAgIHN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkgICAgc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJNDQzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvZGUgKi8KKwkJMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZlbmRvciAqLworCQkiU3Vic2NyaXB0aW9uLUlkIiwgICAgICAgICAgICAgICAgICAgICAgLyogTmFtZSAqLworCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksICAgLyogRml4ZWQgZmxhZ3MgKi8KKwkJQVZQX0ZMQUdfTUFOREFUT1JZLCAgICAgICAgICAgICAgICAgICAgIC8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCUFWUF9UWVBFX0dST1VQRUQgICAgICAgICAgICAgICAgICAgICAgICAvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCSAgICB9OworCSAgICBzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0geworCQl7ICAiU3Vic2NyaXB0aW9uLUlkLVR5cGUiLAlSVUxFX1JFUVVJUkVELAktMSwgMSB9LAorCQl7ICAiU3Vic2NyaXB0aW9uLUlkLURhdGEiLAlSVUxFX1JFUVVJUkVELAktMSwgMSB9CisJICAgIH07CisJICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkgICAgUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCS8qIFVuaXQtVmFsdWUgKi8KKwl7CisJICAgIC8qCisJICAgICAgR3JvdXBlZAorCSAgICAqLworCSAgICBzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJICAgIHN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCTQ0NSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb2RlICovCisJCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWZW5kb3IgKi8KKwkJIlVuaXQtVmFsdWUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5hbWUgKi8KKwkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAgIC8qIEZpeGVkIGZsYWdzICovCisJCUFWUF9GTEFHX01BTkRBVE9SWSwgICAgICAgICAgICAgICAgICAgICAvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQlBVlBfVFlQRV9HUk9VUEVEICAgICAgICAgICAgICAgICAgICAgICAgLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkgICAgfTsKKwkgICAgc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9IHsKKwkJeyAgIlZhbHVlLURpZ2l0cyIsCVJVTEVfUkVRVUlSRUQsCS0xLCAxIH0sCisJCXsgICJFeHBvbmVudCIsCQlSVUxFX09QVElPTkFMLAktMSwgMSB9CisJICAgIH07CisJICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkgICAgUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJfQorCisJLyogVXNlci1FcXVpcG1lbnQtSW5mbyAqLworCXsKKwkgICAgLyoKKwkgICAgICBHcm91cGVkCisJICAgICovCisJICAgIHN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkgICAgc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJNDU4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvZGUgKi8KKwkJMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZlbmRvciAqLworCQkiVXNlci1FcXVpcG1lbnQtSW5mbyIsICAgICAgICAgICAgICAgICAgLyogTmFtZSAqLworCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksICAgLyogRml4ZWQgZmxhZ3MgKi8KKwkJQVZQX0ZMQUdfTUFOREFUT1JZLCAgICAgICAgICAgICAgICAgICAgIC8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCUFWUF9UWVBFX0dST1VQRUQgICAgICAgICAgICAgICAgICAgICAgICAvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCSAgICB9OworCSAgICBzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0geworCQl7ICAiVXNlci1FcXVpcG1lbnQtSW5mby1UeXBlIiwJUlVMRV9SRVFVSVJFRCwJLTEsIDEgfSwKKwkJeyAgIlVzZXItRXF1aXBtZW50LUluZm8tVmFsdWUiLAlSVUxFX1JFUVVJUkVELAktMSwgMSB9CisJICAgIH07CisJICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkgICAgUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJfQorCisJLyogZ3JvdXBlZCBBVlBzIHVzaW5nIGdyb3VwZWQgQVZQcyAqLyAKKworCS8qIENDLU1vbmV5ICovCisJeworCSAgICAvKgorCSAgICAgIEdyb3VwZWQKKwkgICAgKi8KKwkgICAgc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCSAgICBzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQk0MTMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29kZSAqLworCQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVuZG9yICovCisJCSJDQy1Nb25leSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOYW1lICovCisJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgICAvKiBGaXhlZCBmbGFncyAqLworCQlBVlBfRkxBR19NQU5EQVRPUlksICAgICAgICAgICAgICAgICAgICAgLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJQVZQX1RZUEVfR1JPVVBFRCAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJICAgIH07CisJICAgIHN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPSB7CisJCXsgICJVbml0LVZhbHVlIiwJUlVMRV9SRVFVSVJFRCwJLTEsIDEgfSwKKwkJeyAgIkN1cnJlbmN5LUNvZGUiLAlSVUxFX09QVElPTkFMLAktMSwgMSB9CisJICAgIH07CisJICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkgICAgUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJfQorCisJLyogQ29zdC1JbmZvcm1hdGlvbiAqLworCXsKKwkgICAgLyoKKwkgICAgICBHcm91cGVkCisJICAgICovCisJICAgIHN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkgICAgc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJNDIzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvZGUgKi8KKwkJMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZlbmRvciAqLworCQkiQ29zdC1JbmZvcm1hdGlvbiIsICAgICAgICAgICAgICAgICAgICAgLyogTmFtZSAqLworCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksICAgLyogRml4ZWQgZmxhZ3MgKi8KKwkJQVZQX0ZMQUdfTUFOREFUT1JZLCAgICAgICAgICAgICAgICAgICAgIC8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCUFWUF9UWVBFX0dST1VQRUQgICAgICAgICAgICAgICAgICAgICAgICAvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCSAgICB9OworCSAgICBzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0geworCQl7ICAiVW5pdC1WYWx1ZSIsCVJVTEVfUkVRVUlSRUQsCS0xLCAxIH0sCisJCXsgICJDdXJyZW5jeS1Db2RlIiwJUlVMRV9SRVFVSVJFRCwJLTEsIDEgfSwKKwkJeyAgIkNvc3QtVW5pdCIsCQlSVUxFX09QVElPTkFMLAktMSwgMSB9CisJICAgIH07CisJICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkgICAgUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJfQorCisJLyogRmluYWwtVW5pdC1JbmRpY2F0aW9uICovCisJeworCSAgICAvKgorCSAgICAgIEdyb3VwZWQKKwkgICAgKi8KKwkgICAgc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCSAgICBzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQk0MzAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29kZSAqLworCQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVuZG9yICovCisJCSJGaW5hbC1Vbml0LUluZGljYXRpb24iLCAgICAgICAgICAgICAgICAvKiBOYW1lICovCisJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgICAvKiBGaXhlZCBmbGFncyAqLworCQlBVlBfRkxBR19NQU5EQVRPUlksICAgICAgICAgICAgICAgICAgICAgLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJQVZQX1RZUEVfR1JPVVBFRCAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJICAgIH07CisJICAgIHN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPSB7CisJCXsgICJGaW5hbC1Vbml0LUFjdGlvbiIsCQlSVUxFX1JFUVVJUkVELAktMSwgMSB9LAorCQl7ICAiUmVzdHJpY3Rpb24tRmlsdGVyLVJ1bGUiLAlSVUxFX09QVElPTkFMLAktMSwgLTEgfSwKKwkJeyAgIkZpbHRlci1JZCIsCQkJUlVMRV9PUFRJT05BTCwJLTEsIC0xIH0sCisJCXsgICJSZWRpcmVjdC1TZXJ2ZXIiLAkJUlVMRV9PUFRJT05BTCwJLTEsIDEgfSwKKwkgICAgfTsKKwkgICAgQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCSAgICBQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwl9CisgICAgICAgICAgICAgICAgCisJLyogR3JhbnRlZC1TZXJ2aWNlLVVuaXQgKi8KKwl7CisJICAgIC8qCisJICAgICAgR3JvdXBlZAorCSAgICAqLworCSAgICBzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJICAgIHN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCTQzMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb2RlICovCisJCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWZW5kb3IgKi8KKwkJIkdyYW50ZWQtU2VydmljZS1Vbml0IiwgICAgICAgICAgICAgICAgIC8qIE5hbWUgKi8KKwkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAgIC8qIEZpeGVkIGZsYWdzICovCisJCUFWUF9GTEFHX01BTkRBVE9SWSwgICAgICAgICAgICAgICAgICAgICAvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQlBVlBfVFlQRV9HUk9VUEVEICAgICAgICAgICAgICAgICAgICAgICAgLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkgICAgfTsKKwkgICAgc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9IHsKKwkJeyAgIlRhcmlmZi1UaW1lLUNoYW5nZSIsCVJVTEVfT1BUSU9OQUwsCS0xLCAxIH0sCisJCXsgICJDQy1UaW1lIiwJICAgICAgIAkJUlVMRV9PUFRJT05BTCwJLTEsIDEgfSwKKwkJeyAgIkNDLU1vbmV5IiwJCQlSVUxFX09QVElPTkFMLAktMSwgMSB9LAorCQl7ICAiQ0MtVG90YWwtT2N0ZXRzIiwJCVJVTEVfT1BUSU9OQUwsCS0xLCAxIH0sCisJCXsgICJDQy1JbnB1dC1PY3RldHMiLAkJUlVMRV9PUFRJT05BTCwJLTEsIDEgfSwKKwkJeyAgIkNDLU91dHB1dC1PY3RldHMiLAkJUlVMRV9PUFRJT05BTCwJLTEsIDEgfSwKKwkJeyAgIkNDLVNlcnZpY2UtU3BlY2lmaWMtVW5pdHMiLAlSVUxFX09QVElPTkFMLAktMSwgMSB9CisJCS8qIHBsdXMgYW55IGFkZGl0aW9uYWwgQVZQcyB7ICJBVlAiLCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSAqLworCSAgICB9OworCSAgICBDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJICAgIFBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCX0KKworCS8qIEctUy1VLVBvb2wtUmVmZXJlbmNlICovCisJeworCSAgICAvKgorCSAgICAgIEdyb3VwZWQKKwkgICAgKi8KKwkgICAgc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCSAgICBzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQk0NTcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29kZSAqLworCQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVuZG9yICovCisJCSJHLVMtVS1Qb29sLVJlZmVyZW5jZSIsICAgICAgICAgICAgICAgICAvKiBOYW1lICovCisJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgICAvKiBGaXhlZCBmbGFncyAqLworCQlBVlBfRkxBR19NQU5EQVRPUlksICAgICAgICAgICAgICAgICAgICAgLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJQVZQX1RZUEVfR1JPVVBFRCAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJICAgIH07CisJICAgIHN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPSB7CisJCXsgICJHLVMtVS1Qb29sLUlkZW50aWZpZXIiLAlSVUxFX1JFUVVJUkVELAktMSwgMSB9LAorCQl7ICAiQ0MtVW5pdC1UeXBlIiwJCVJVTEVfUkVRVUlSRUQsCS0xLCAxIH0sCisJCXsgICJVbml0LVZhbHVlIiwJCVJVTEVfUkVRVUlSRUQsCS0xLCAxIH0KKwkgICAgfTsKKwkgICAgQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCSAgICBQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwl9ICAgICAgICAgICAgICAgICAgICAgCisKKwkvKiBSZXF1ZXN0ZWQtU2VydmljZS1Vbml0ICovCisJeworCSAgICAvKgorCSAgICAgIEdyb3VwZWQKKwkgICAgKi8KKwkgICAgc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCSAgICBzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQk0MzcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29kZSAqLworCQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVuZG9yICovCisJCSJSZXF1ZXN0ZWQtU2VydmljZS1Vbml0IiwgICAgICAgICAgICAgICAvKiBOYW1lICovCisJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgICAvKiBGaXhlZCBmbGFncyAqLworCQlBVlBfRkxBR19NQU5EQVRPUlksICAgICAgICAgICAgICAgICAgICAgLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJQVZQX1RZUEVfR1JPVVBFRCAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJICAgIH07CisJICAgIHN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPSB7CisJCXsgICJDQy1UaW1lIiwJICAgICAgIAkJUlVMRV9PUFRJT05BTCwJLTEsIDEgfSwKKwkJeyAgIkNDLU1vbmV5IiwJCQlSVUxFX09QVElPTkFMLAktMSwgMSB9LAorCQl7ICAiQ0MtVG90YWwtT2N0ZXRzIiwJCVJVTEVfT1BUSU9OQUwsCS0xLCAxIH0sCisJCXsgICJDQy1JbnB1dC1PY3RldHMiLAkJUlVMRV9PUFRJT05BTCwJLTEsIDEgfSwKKwkJeyAgIkNDLU91dHB1dC1PY3RldHMiLAkJUlVMRV9PUFRJT05BTCwJLTEsIDEgfSwKKwkJeyAgIkNDLVNlcnZpY2UtU3BlY2lmaWMtVW5pdHMiLAlSVUxFX09QVElPTkFMLAktMSwgMSB9CisJCS8qIHBsdXMgYW55IGFkZGl0aW9uYWwgQVZQcyB7ICJBVlAiLCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSAqLworCSAgICB9OworCSAgICBDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJICAgIFBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCX0KKworCS8qIFVzZWQtU2VydmljZS1Vbml0ICovCisJeworCSAgICAvKgorCSAgICAgIEdyb3VwZWQKKwkgICAgKi8KKwkgICAgc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCSAgICBzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQk0NDYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29kZSAqLworCQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVuZG9yICovCisJCSJVc2VkLVNlcnZpY2UtVW5pdCIsICAgICAgICAgICAgICAgICAgICAvKiBOYW1lICovCisJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgICAvKiBGaXhlZCBmbGFncyAqLworCQlBVlBfRkxBR19NQU5EQVRPUlksICAgICAgICAgICAgICAgICAgICAgLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJQVZQX1RZUEVfR1JPVVBFRCAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJICAgIH07CisJICAgIHN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPSB7CisJCXsgICJUYXJpZmYtQ2hhbmdlLVVzYWdlIiwJUlVMRV9PUFRJT05BTCwJLTEsIDEgfSwKKwkJeyAgIkNDLVRpbWUiLAkgICAgICAgCQlSVUxFX09QVElPTkFMLAktMSwgMSB9LAorCQl7ICAiQ0MtTW9uZXkiLAkJCVJVTEVfT1BUSU9OQUwsCS0xLCAxIH0sCisJCXsgICJDQy1Ub3RhbC1PY3RldHMiLAkJUlVMRV9PUFRJT05BTCwJLTEsIDEgfSwKKwkJeyAgIkNDLUlucHV0LU9jdGV0cyIsCQlSVUxFX09QVElPTkFMLAktMSwgMSB9LAorCQl7ICAiQ0MtT3V0cHV0LU9jdGV0cyIsCQlSVUxFX09QVElPTkFMLAktMSwgMSB9LAorCQl7ICAiQ0MtU2VydmljZS1TcGVjaWZpYy1Vbml0cyIsCVJVTEVfT1BUSU9OQUwsCS0xLCAxIH0KKwkJLyogcGx1cyBhbnkgYWRkaXRpb25hbCBBVlBzIHsgIkFWUCIsIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9ICovCisJICAgIH07CisJICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkgICAgUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJfQorCisJLyogYXQgbGVhc3QgdGhyZWUgbGV2ZWxzIG9mIGdyb3VwaW5nICovCisJLyogTXVsdGlwbGUtU2VydmljZXMtQ3JlZGl0LUNvbnRyb2wgKi8KKwl7CisJICAgIC8qCisJICAgICAgR3JvdXBlZAorCSAgICAqLworCSAgICBzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJICAgIHN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCTQ1NiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb2RlICovCisJCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWZW5kb3IgKi8KKwkJIk11bHRpcGxlLVNlcnZpY2VzLUNyZWRpdC1Db250cm9sIiwgICAgIC8qIE5hbWUgKi8KKwkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAgIC8qIEZpeGVkIGZsYWdzICovCisJCUFWUF9GTEFHX01BTkRBVE9SWSwgICAgICAgICAgICAgICAgICAgICAvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQlBVlBfVFlQRV9HUk9VUEVEICAgICAgICAgICAgICAgICAgICAgICAgLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkgICAgfTsKKwkgICAgc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9IHsKKwkJeyAgIkdyYW50ZWQtU2VydmljZS1Vbml0IiwJUlVMRV9PUFRJT05BTCwJLTEsIDEgfSwKKwkJeyAgIlJlcXVlc3RlZC1TZXJ2aWNlLVVuaXQiLAlSVUxFX09QVElPTkFMLAktMSwgMSB9LAorCQl7ICAiVXNlZC1TZXJ2aWNlLVVuaXQiLAkJUlVMRV9PUFRJT05BTCwJLTEsIC0xIH0sCisJCXsgICJUYXJpZmYtQ2hhbmdlLVVzYWdlIiwJUlVMRV9PUFRJT05BTCwJLTEsIDEgfSwKKwkJeyAgIlNlcnZpY2UtSWRlbnRpZmllciIsCVJVTEVfT1BUSU9OQUwsCS0xLCAtMSB9LAorCQl7ICAiUmF0aW5nLUdyb3VwIiwJCVJVTEVfT1BUSU9OQUwsCS0xLCAxIH0sCisJCXsgICJHLVMtVS1Qb29sLVJlZmVyZW5jZSIsCVJVTEVfT1BUSU9OQUwsCS0xLCAtMSB9LAorCQl7ICAiVmFsaWRpdHktVGltZSIsCQlSVUxFX09QVElPTkFMLAktMSwgMSB9LAorCQl7ICAiUmVzdWx0LUNvZGUiLAkJUlVMRV9PUFRJT05BTCwJLTEsIDEgfSwKKwkJeyAgIkZpbmFsLVVuaXQtSW5kaWNhdGlvbiIsCVJVTEVfT1BUSU9OQUwsCS0xLCAxIH0KKwkJLyogcGx1cyBhbnkgYWRkaXRpb25hbCBBVlBzIHsgIkFWUCIsIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9ICovCisJICAgIH07CisJICAgIENIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkgICAgUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJfQorICAgICAgICAgICAgICAgIAorCisgICAgfQorCisKKyAgICAvKiBDb21tYW5kcyBzZWN0aW9uICovCisgICAgeworCS8qIENyZWRpdC1Db250cm9sLVJlcXVlc3QgKENDUikgQ29tbWFuZCAqLworCXsKKwkgICAgLyoKKwkgICAgICBGcm9tIFJGQyA0MDA2OgorCisJICAgICAgMy4xLiAgQ3JlZGl0LUNvbnRyb2wtUmVxdWVzdCAoQ0NSKSBDb21tYW5kCisJCSAgCisJICAgICAgVGhlIENyZWRpdC1Db250cm9sLVJlcXVlc3QgbWVzc2FnZSAoQ0NSKSBpcyBpbmRpY2F0ZWQgYnkgdGhlCisJICAgICAgY29tbWFuZC1jb2RlIGZpZWxkIGJlaW5nIHNldCB0byAyNzIgYW5kIHRoZSAnUicgYml0IGJlaW5nIHNldCBpbiB0aGUKKwkgICAgICBDb21tYW5kIEZsYWdzIGZpZWxkLiAgSXQgaXMgdXNlZCBiZXR3ZWVuIHRoZSBEaWFtZXRlciBjcmVkaXQtY29udHJvbAorCSAgICAgIGNsaWVudCBhbmQgdGhlIGNyZWRpdC1jb250cm9sIHNlcnZlciB0byByZXF1ZXN0IGNyZWRpdCBhdXRob3JpemF0aW9uCisJICAgICAgZm9yIGEgZ2l2ZW4gc2VydmljZS4KKwkJICAKKwkgICAgICBUaGUgQXV0aC1BcHBsaWNhdGlvbi1JZCBNVVNUIGJlIHNldCB0byB0aGUgdmFsdWUgNCwgaW5kaWNhdGluZyB0aGUKKwkgICAgICBEaWFtZXRlciBjcmVkaXQtY29udHJvbCBhcHBsaWNhdGlvbi4KKwkJICAKKwkgICAgICBNZXNzYWdlIEZvcm1hdAorCQkgIAorCSAgICAgIDxDcmVkaXQtQ29udHJvbC1SZXF1ZXN0PiA6Oj0gPCBEaWFtZXRlciBIZWFkZXI6IDI3MiwgUkVRLCBQWFkgPgorCQkJIAkgICAgICAgICAgPCBTZXNzaW9uLUlkID4KKwkJCSAJICAgICAgICAgIHsgT3JpZ2luLUhvc3QgfQorCQkJIAkgICAgICAgICAgeyBPcmlnaW4tUmVhbG0gfQorCQkJIAkgICAgICAgICAgeyBEZXN0aW5hdGlvbi1SZWFsbSB9CisJCQkgCSAgICAgICAgICB7IEF1dGgtQXBwbGljYXRpb24tSWQgfQorCQkJIAkgICAgICAgICAgeyBTZXJ2aWNlLUNvbnRleHQtSWQgfQorCQkJIAkgICAgICAgICAgeyBDQy1SZXF1ZXN0LVR5cGUgfQorCQkJIAkgICAgICAgICAgeyBDQy1SZXF1ZXN0LU51bWJlciB9CisJCQkgCSAgICAgICAgICBbIERlc3RpbmF0aW9uLUhvc3QgXQorCQkJIAkgICAgICAgICAgWyBVc2VyLU5hbWUgXQorCQkJIAkgICAgICAgICAgWyBDQy1TdWItU2Vzc2lvbi1JZCBdCisJCQkgCSAgICAgICAgICBbIEFjY3QtTXVsdGktU2Vzc2lvbi1JZCBdCisJCQkgCSAgICAgICAgICBbIE9yaWdpbi1TdGF0ZS1JZCBdCisJCQkgCSAgICAgICAgICBbIEV2ZW50LVRpbWVzdGFtcCBdCisJCQkgCSAgICAgICAgICpbIFN1YnNjcmlwdGlvbi1JZCBdCisJCQkgCSAgICAgICAgICBbIFNlcnZpY2UtSWRlbnRpZmllciBdCisJCQkgCSAgICAgICAgICBbIFRlcm1pbmF0aW9uLUNhdXNlIF0KKwkJCSAJICAgICAgICAgIFsgUmVxdWVzdGVkLVNlcnZpY2UtVW5pdCBdCisJCQkgCSAgICAgICAgICBbIFJlcXVlc3RlZC1BY3Rpb24gXQorCQkJIAkgICAgICAgICAqWyBVc2VkLVNlcnZpY2UtVW5pdCBdCisJCQkgCSAgICAgICAgICBbIE11bHRpcGxlLVNlcnZpY2VzLUluZGljYXRvciBdCisJCQkgCSAgICAgICAgICpbIE11bHRpcGxlLVNlcnZpY2VzLUNyZWRpdC1Db250cm9sIF0KKwkJCSAJICAgICAgICAgKlsgU2VydmljZS1QYXJhbWV0ZXItSW5mbyBdCisJCQkgCSAgICAgICAgICBbIENDLUNvcnJlbGF0aW9uLUlkIF0KKwkJCSAJICAgICAgICAgIFsgVXNlci1FcXVpcG1lbnQtSW5mbyBdCisJCQkgCSAgICAgICAgICpbIFByb3h5LUluZm8gXQorCQkJIAkgICAgICAgICAqWyBSb3V0ZS1SZWNvcmQgXQorCQkJIAkgICAgICAgICAqWyBBVlAgXQorCQkJIAkgICAgICAgICAgCQkgIAorCSAgICAgIDEwLjEuICBDcmVkaXQtQ29udHJvbCBBVlAgVGFibGUKKwkJICAKKwkgICAgICBUaGUgdGFibGUgaW4gdGhpcyBzZWN0aW9uIGlzIHVzZWQgdG8gcmVwcmVzZW50IHdoaWNoIGNyZWRpdC1jb250cm9sCisJICAgICAgYXBwbGljYXRpb25zIHNwZWNpZmljIEFWUHMgZGVmaW5lZCBpbiB0aGlzIGRvY3VtZW50IGFyZSB0byBiZSBwcmVzZW50CisJICAgICAgaW4gdGhlIGNyZWRpdC1jb250cm9sIG1lc3NhZ2VzLgorCQkgIAorCSAgICAgICstLS0tLS0tLS0tLSsKKwkgICAgICB8ICBDb21tYW5kICB8CisJICAgICAgfCAgIENvZGUgICAgfAorCSAgICAgIHwtLS0tLSstLS0tLSsKKwkgICAgICBBdHRyaWJ1dGUgTmFtZSAgICAgICAgICAgICAgICB8IENDUiB8IENDQSB8CisJICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tKy0tLS0tKworCSAgICAgIEFjY3QtTXVsdGktU2Vzc2lvbi1JZCAgICAgICAgIHwgMC0xIHwgMC0xIHwKKwkgICAgICBBdXRoLUFwcGxpY2F0aW9uLUlkICAgICAgICAgICB8IDEgICB8IDEgICB8CisJICAgICAgQ0MtQ29ycmVsYXRpb24tSWQgICAgICAgICAgICAgfCAwLTEgfCAwICAgfAorCSAgICAgIENDLVNlc3Npb24tRmFpbG92ZXIgICAgICAgICAgIHwgMCAgIHwgMC0xIHwKKwkgICAgICBDQy1SZXF1ZXN0LU51bWJlciAgICAgICAgICAgICB8IDEgICB8IDEgICB8CisJICAgICAgQ0MtUmVxdWVzdC1UeXBlICAgICAgICAgICAgICAgfCAxICAgfCAxICAgfAorCSAgICAgIENDLVN1Yi1TZXNzaW9uLUlkICAgICAgICAgICAgIHwgMC0xIHwgMC0xIHwKKwkgICAgICBDaGVjay1CYWxhbmNlLVJlc3VsdCAgICAgICAgICB8IDAgICB8IDAtMSB8CisJICAgICAgQ29zdC1JbmZvcm1hdGlvbiAgICAgICAgICAgICAgfCAwICAgfCAwLTEgfAorCSAgICAgIENyZWRpdC1Db250cm9sLUZhaWx1cmUtICAgICAgIHwgMCAgIHwgMC0xIHwKKwkgICAgICBIYW5kbGluZyAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8ICAgICB8CisJICAgICAgRGVzdGluYXRpb24tSG9zdCAgICAgICAgICAgICAgfCAwLTEgfCAwICAgfAorCSAgICAgIERlc3RpbmF0aW9uLVJlYWxtICAgICAgICAgICAgIHwgMSAgIHwgMCAgIHwKKwkgICAgICBEaXJlY3QtRGViaXRpbmctRmFpbHVyZS0gICAgICB8IDAgICB8IDAtMSB8CisJICAgICAgSGFuZGxpbmcgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCAgICAgfAorCSAgICAgIEV2ZW50LVRpbWVzdGFtcCAgICAgICAgICAgICAgIHwgMC0xIHwgMC0xIHwKKwkgICAgICBGYWlsZWQtQVZQICAgICAgICAgICAgICAgICAgICB8IDAgICB8IDArICB8CisJICAgICAgRmluYWwtVW5pdC1JbmRpY2F0aW9uICAgICAgICAgfCAwICAgfCAwLTEgfAorCSAgICAgIEdyYW50ZWQtU2VydmljZS1Vbml0ICAgICAgICAgIHwgMCAgIHwgMC0xIHwKKwkgICAgICBNdWx0aXBsZS1TZXJ2aWNlcy1DcmVkaXQtICAgICB8IDArICB8IDArICB8CisJICAgICAgQ29udHJvbCAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCAgICAgfAorCSAgICAgIE11bHRpcGxlLVNlcnZpY2VzLUluZGljYXRvciAgIHwgMC0xIHwgMCAgIHwKKwkgICAgICBPcmlnaW4tSG9zdCAgICAgICAgICAgICAgICAgICB8IDEgICB8IDEgICB8CisJICAgICAgT3JpZ2luLVJlYWxtICAgICAgICAgICAgICAgICAgfCAxICAgfCAxICAgfAorCSAgICAgIE9yaWdpbi1TdGF0ZS1JZCAgICAgICAgICAgICAgIHwgMC0xIHwgMC0xIHwKKwkgICAgICBQcm94eS1JbmZvICAgICAgICAgICAgICAgICAgICB8IDArICB8IDArICB8CisJICAgICAgUmVkaXJlY3QtSG9zdCAgICAgICAgICAgICAgICAgfCAwICAgfCAwKyAgfAorCSAgICAgIFJlZGlyZWN0LUhvc3QtVXNhZ2UgICAgICAgICAgIHwgMCAgIHwgMC0xIHwKKwkgICAgICBSZWRpcmVjdC1NYXgtQ2FjaGUtVGltZSAgICAgICB8IDAgICB8IDAtMSB8CisJICAgICAgUmVxdWVzdGVkLUFjdGlvbiAgICAgICAgICAgICAgfCAwLTEgfCAwICAgfAorCSAgICAgIFJlcXVlc3RlZC1TZXJ2aWNlLVVuaXQgICAgICAgIHwgMC0xIHwgMCAgIHwKKwkgICAgICBSb3V0ZS1SZWNvcmQgICAgICAgICAgICAgICAgICB8IDArICB8IDArICB8CisJICAgICAgUmVzdWx0LUNvZGUgICAgICAgICAgICAgICAgICAgfCAwICAgfCAxICAgfAorCSAgICAgIFNlcnZpY2UtQ29udGV4dC1JZCAgICAgICAgICAgIHwgMSAgIHwgMCAgIHwKKwkgICAgICBTZXJ2aWNlLUlkZW50aWZpZXIgICAgICAgICAgICB8IDAtMSB8IDAgICB8CisJICAgICAgU2VydmljZS1QYXJhbWV0ZXItSW5mbyAgICAgICAgfCAwKyAgfCAwICAgfAorCSAgICAgIFNlc3Npb24tSWQgICAgICAgICAgICAgICAgICAgIHwgMSAgIHwgMSAgIHwKKwkgICAgICBTdWJzY3JpcHRpb24tSWQgICAgICAgICAgICAgICB8IDArICB8IDAgICB8CisJICAgICAgVGVybWluYXRpb24tQ2F1c2UgICAgICAgICAgICAgfCAwLTEgfCAwICAgfAorCSAgICAgIFVzZXItRXF1aXBtZW50LUluZm8gICAgICAgICAgIHwgMC0xIHwgMCAgIHwKKwkgICAgICBVc2VkLVNlcnZpY2UtVW5pdCAgICAgICAgICAgICB8IDArICB8IDAgICB8CisJICAgICAgVXNlci1OYW1lICAgICAgICAgICAgICAgICAgICAgfCAwLTEgfCAwLTEgfAorCSAgICAgIFZhbGlkaXR5LVRpbWUgICAgICAgICAgICAgICAgIHwgMCAgIHwgMC0xIHwKKwkgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0rLS0tLS0rCisJCSAgCisKKwkgICAgKi8KKwkgICAgc3RydWN0IGRpY3Rfb2JqZWN0ICogY21kOworCSAgICBzdHJ1Y3QgZGljdF9jbWRfZGF0YSBkYXRhID0geyAKKwkJMjcyLCAJCQkJCS8qIENvZGUgKi8KKwkJIkNyZWRpdC1Db250cm9sLVJlcXVlc3QiLCAJCS8qIE5hbWUgKi8KKwkJQ01EX0ZMQUdfUkVRVUVTVCB8IENNRF9GTEFHX1BST1hJQUJMRSwgCS8qIEZpeGVkIGZsYWdzICovCisJCUNNRF9GTEFHX1JFUVVFU1QgfCBDTURfRkxBR19QUk9YSUFCTEUgCQkJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkgICAgfTsKKwkgICAgc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9IAorCQl7IAkgCisJCSAgICB7ICJTZXNzaW9uLUlkIiwgUlVMRV9GSVhFRF9IRUFELCAtMSwgMSB9LAorCQkgICAgeyAiT3JpZ2luLUhvc3QiLCBSVUxFX1JFUVVJUkVELCAtMSwgMSB9LAorCQkgICAgeyAiT3JpZ2luLVJlYWxtIiwgUlVMRV9SRVFVSVJFRCwgLTEsIDEgfSwKKwkJICAgIHsgIkRlc3RpbmF0aW9uLVJlYWxtIiwgUlVMRV9SRVFVSVJFRCwgLTEsIDEgfSwKKwkJICAgIHsgIkF1dGgtQXBwbGljYXRpb24tSWQiLCBSVUxFX1JFUVVJUkVELCAtMSwgMSB9LAorCQkgICAgeyAiU2VydmljZS1Db250ZXh0LUlkIiwgUlVMRV9SRVFVSVJFRCwgLTEsIDEgfSwKKwkJICAgIHsgIkNDLVJlcXVlc3QtVHlwZSIsIFJVTEVfUkVRVUlSRUQsIC0xLCAxIH0sCisJCSAgICB7ICJDQy1SZXF1ZXN0LU51bWJlciIsIFJVTEVfUkVRVUlSRUQsIC0xLCAxIH0sCisJCSAgICB7ICJEZXN0aW5hdGlvbi1Ib3N0IiwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJICAgIHsgIlVzZXItTmFtZSIsIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCSAgICB7ICJDQy1TdWItU2Vzc2lvbi1JZCIsIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCSAgICB7ICJBY2N0LU11bHRpLVNlc3Npb24tSWQiLCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkgICAgeyAiT3JpZ2luLVN0YXRlLUlkIiwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJICAgIHsgIkV2ZW50LVRpbWVzdGFtcCIsIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCSAgICB7ICJTdWJzY3JpcHRpb24tSWQiLCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJICAgIHsgIlNlcnZpY2UtSWRlbnRpZmllciIsIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCSAgICB7ICJUZXJtaW5hdGlvbi1DYXVzZSIsIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCSAgICB7ICJSZXF1ZXN0ZWQtU2VydmljZS1Vbml0IiwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJICAgIHsgIlJlcXVlc3RlZC1BY3Rpb24iLCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkgICAgeyAiVXNlZC1TZXJ2aWNlLVVuaXQiLCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJICAgIHsgIk11bHRpcGxlLVNlcnZpY2VzLUluZGljYXRvciIsIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCSAgICB7ICJNdWx0aXBsZS1TZXJ2aWNlcy1DcmVkaXQtQ29udHJvbCIsIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkgICAgeyAiU2VydmljZS1QYXJhbWV0ZXItSW5mbyIsIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkgICAgeyAiQ0MtQ29ycmVsYXRpb24tSWQiLCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkgICAgeyAiVXNlci1FcXVpcG1lbnQtSW5mbyIsIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCSAgICB7ICJQcm94eS1JbmZvIiwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCSAgICB7ICJSb3V0ZS1SZWNvcmQiLCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQkgICAgLyogcGx1cyBhbnkgYWRkaXRpb25hbCBBVlBzIHsgIkFWUCIsIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9ICovCisJCX07CisKKwkgICAgQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQ09NTUFORCwgJmRhdGEsIGRjY2EsICZjbWQpOworCSAgICBQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBjbWQgKTsKKwl9CisKKwkvKiBDcmVkaXQtQ29udHJvbC1BbnN3ZXIgKENDQSkgQ29tbWFuZCAqLworCXsKKwkgICAgLyoKKwkgICAgICBGcm9tIFJGQyA0MDA2OgorCSAgICAgIDMuMi4gIENyZWRpdC1Db250cm9sLUFuc3dlciAoQ0NBKSBDb21tYW5kCisJCSAgCisJICAgICAgVGhlIENyZWRpdC1Db250cm9sLUFuc3dlciBtZXNzYWdlIChDQ0EpIGlzIGluZGljYXRlZCBieSB0aGUgY29tbWFuZC0KKwkgICAgICBjb2RlIGZpZWxkIGJlaW5nIHNldCB0byAyNzIgYW5kIHRoZSAnUicgYml0IGJlaW5nIGNsZWFyZWQgaW4gdGhlCisJICAgICAgQ29tbWFuZCBGbGFncyBmaWVsZC4gIEl0IGlzIHVzZWQgYmV0d2VlbiB0aGUgY3JlZGl0LWNvbnRyb2wgc2VydmVyCisJICAgICAgYW5kIHRoZSBEaWFtZXRlciBjcmVkaXQtY29udHJvbCBjbGllbnQgdG8gYWNrbm93bGVkZ2UgYSBDcmVkaXQtCisJICAgICAgQ29udHJvbC1SZXF1ZXN0IGNvbW1hbmQuCisJCSAgCisJICAgICAgTWVzc2FnZSBGb3JtYXQKKwkJICAKKwkgICAgICA8Q3JlZGl0LUNvbnRyb2wtQW5zd2VyPiA6Oj0gPCBEaWFtZXRlciBIZWFkZXI6IDI3MiwgUFhZID4KKwkJCSAJICAgICAgICAgIDwgU2Vzc2lvbi1JZCA+CisJCQkgCSAgICAgICAgICB7IFJlc3VsdC1Db2RlIH0KKwkJCSAJICAgICAgICAgIHsgT3JpZ2luLUhvc3QgfQorCQkJIAkgICAgICAgICAgeyBPcmlnaW4tUmVhbG0gfQorCQkJIAkgICAgICAgICAgeyBBdXRoLUFwcGxpY2F0aW9uLUlkIH0KKwkJCSAJICAgICAgICAgIHsgQ0MtUmVxdWVzdC1UeXBlIH0KKwkJCSAJICAgICAgICAgIHsgQ0MtUmVxdWVzdC1OdW1iZXIgfQorCQkJIAkgICAgICAgICAgWyBVc2VyLU5hbWUgXQorCQkJIAkgICAgICAgICAgWyBDQy1TZXNzaW9uLUZhaWxvdmVyIF0KKwkJCSAJICAgICAgICAgIFsgQ0MtU3ViLVNlc3Npb24tSWQgXQorCQkJIAkgICAgICAgICAgWyBBY2N0LU11bHRpLVNlc3Npb24tSWQgXQorCQkJIAkgICAgICAgICAgWyBPcmlnaW4tU3RhdGUtSWQgXQorCQkJIAkgICAgICAgICAgWyBFdmVudC1UaW1lc3RhbXAgXQorCQkJIAkgICAgICAgICAgWyBHcmFudGVkLVNlcnZpY2UtVW5pdCBdCisJCQkgCSAgICAgICAgICpbIE11bHRpcGxlLVNlcnZpY2VzLUNyZWRpdC1Db250cm9sIF0KKwkJCSAJICAgICAgICAgIFsgQ29zdC1JbmZvcm1hdGlvbl0KKwkJCSAJICAgICAgICAgIFsgRmluYWwtVW5pdC1JbmRpY2F0aW9uIF0KKwkJCSAJICAgICAgICAgIFsgQ2hlY2stQmFsYW5jZS1SZXN1bHQgXQorCQkJIAkgICAgICAgICAgWyBDcmVkaXQtQ29udHJvbC1GYWlsdXJlLUhhbmRsaW5nIF0KKwkJCSAJICAgICAgICAgIFsgRGlyZWN0LURlYml0aW5nLUZhaWx1cmUtSGFuZGxpbmcgXQorCQkJIAkgICAgICAgICAgWyBWYWxpZGl0eS1UaW1lXQorCQkJIAkgICAgICAgICAqWyBSZWRpcmVjdC1Ib3N0XQorCQkJIAkgICAgICAgICAgWyBSZWRpcmVjdC1Ib3N0LVVzYWdlIF0KKwkJCSAJICAgICAgICAgIFsgUmVkaXJlY3QtTWF4LUNhY2hlLVRpbWUgXQorCQkJIAkgICAgICAgICAqWyBQcm94eS1JbmZvIF0KKwkJCSAJICAgICAgICAgKlsgUm91dGUtUmVjb3JkIF0KKwkJCSAJICAgICAgICAgKlsgRmFpbGVkLUFWUCBdCisJCQkgCSAgICAgICAgICpbIEFWUCBdCisJCQkgCSAgICAgICAgICAJCSAgCisJICAgICAgKi8KKwkgICAgc3RydWN0IGRpY3Rfb2JqZWN0ICogY21kOworCSAgICBzdHJ1Y3QgZGljdF9jbWRfZGF0YSBkYXRhID0geyAKKwkJMjcyLCAJCQkJCS8qIENvZGUgKi8KKwkJIkNyZWRpdC1Db250cm9sLUFuc3dlciIsIAkJLyogTmFtZSAqLworCQlDTURfRkxBR19SRVFVRVNUIHwgQ01EX0ZMQUdfUFJPWElBQkxFIHwgQ01EX0ZMQUdfRVJST1IsCS8qIEZpeGVkIGZsYWdzICovCisJCUNNRF9GTEFHX1BST1hJQUJMRSAJCQkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCSAgICB9OworCSAgICBzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0gCisJCXsgCSAKKwkJICAgIHsgIlNlc3Npb24tSWQiLCBSVUxFX0ZJWEVEX0hFQUQsIC0xLCAxIH0sCisJCSAgICB7ICJSZXN1bHQtQ29kZSIsIFJVTEVfUkVRVUlSRUQsIC0xLCAxIH0sCisJCSAgICB7ICJPcmlnaW4tSG9zdCIsIFJVTEVfUkVRVUlSRUQsIC0xLCAxIH0sCisJCSAgICB7ICJPcmlnaW4tUmVhbG0iLCBSVUxFX1JFUVVJUkVELCAtMSwgMSB9LAorCQkgICAgeyAiQXV0aC1BcHBsaWNhdGlvbi1JZCIsIFJVTEVfUkVRVUlSRUQsIC0xLCAxIH0sCisJCSAgICB7ICJDQy1SZXF1ZXN0LVR5cGUiLCBSVUxFX1JFUVVJUkVELCAtMSwgMSB9LAorCQkgICAgeyAiQ0MtUmVxdWVzdC1OdW1iZXIiLCBSVUxFX1JFUVVJUkVELCAtMSwgMSB9LAorCQkgICAgeyAiVXNlci1OYW1lIiwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJICAgIHsgIkNDLVNlc3Npb24tRmFpbG92ZXIiLCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkgICAgeyAiQ0MtU3ViLVNlc3Npb24tSWQiLCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkgICAgeyAiQWNjdC1NdWx0aS1TZXNzaW9uLUlkIiwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJICAgIHsgIk9yaWdpbi1TdGF0ZS1JZCIsIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCSAgICB7ICJFdmVudC1UaW1lc3RhbXAiLCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkgICAgeyAiR3JhbnRlZC1TZXJ2aWNlLVVuaXQiLCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkgICAgeyAiTXVsdGlwbGUtU2VydmljZXMtQ3JlZGl0LUNvbnRyb2wiLCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJICAgIHsgIkNvc3QtSW5mb3JtYXRpb24iLCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkgICAgeyAiRmluYWwtVW5pdC1JbmRpY2F0aW9uIiwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJICAgIHsgIkNoZWNrLUJhbGFuY2UtUmVzdWx0IiwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJICAgIHsgIkNyZWRpdC1Db250cm9sLUZhaWx1cmUtSGFuZGxpbmciLCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkgICAgeyAiRGlyZWN0LURlYml0aW5nLUZhaWx1cmUtSGFuZGxpbmciLCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkgICAgeyAiVmFsaWRpdHktVGltZSIsIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCSAgICB7ICJSZWRpcmVjdC1Ib3N0IiwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCSAgICB7ICJSZWRpcmVjdC1Ib3N0LVVzYWdlIiwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJICAgIHsgIlJlZGlyZWN0LU1heC1DYWNoZS1UaW1lIiwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJICAgIHsgIlByb3h5LUluZm8iLCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJICAgIHsgIlJvdXRlLVJlY29yZCIsIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkgICAgeyAiRmFpbGVkLUFWUCIsIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCSAgICAvKiBwbHVzIGFueSBhZGRpdGlvbmFsIEFWUHMgeyAiQVZQIiwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0gKi8KKwkJfTsKKworCSAgICBDSEVDS19kaWN0X25ldyggRElDVF9DT01NQU5ELCAmZGF0YSwgZGNjYSwgJmNtZCk7CisJICAgIFBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGNtZCApOworCX0KKyAgICB9CisgICAgTE9HX0QoICJFeHRlbnNpb24gJ0RpY3Rpb25hcnkgZGVmaW5pdGlvbnMgZm9yIERDQ0EgKHJmYzQwMDYpJyBpbml0aWFsaXplZCIpOworICAgIHJldHVybiAwOworfQorCisvKiBuZWVkcyBkaWN0X25hc3JlcSBmb3IgRmlsdGVyLUlkICovCitFWFRFTlNJT05fRU5UUlkoImRpY3RfZGNjYSIsIGRpY3RfZGNjYV9lbnRyeSwgImRpY3RfbmFzcmVxIik7CmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfZGNjYV8zZ3BwL0NNYWtlTGlzdHMudHh0IGIvZXh0ZW5zaW9ucy9kaWN0X2RjY2FfM2dwcC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTA1YzE1Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kaWN0X2RjY2FfM2dwcC9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDEzIEBACisjIFRoZSBkaWN0X2RjY2FfM2dwcCBleHRlbnNpb24KK1BST0pFQ1QoIkRpYW1ldGVyIERDQ0EgKERpYW1ldGVyIENyZWRpdCBDb250cm9sIEFwcGxpY2F0aW9uKSAzR1BQIGRpY3Rpb25hcnkgZGVmaW5pdGlvbnMiIEMpCisKKyMgQ29tcGlsZSBhcyBhIG1vZHVsZQorRkRfQUREX0VYVEVOU0lPTihkaWN0X2RjY2FfM2dwcCBkaWN0X2RjY2FfM2dwcC5jKQorCisKKyMjIyMKKyMjIElOU1RBTEwgc2VjdGlvbiAjIworCitJTlNUQUxMKFRBUkdFVFMgZGljdF9kY2NhXzNncHAKKwlMSUJSQVJZIERFU1RJTkFUSU9OICR7SU5TVEFMTF9FWFRFTlNJT05TX1NVRkZJWH0KKwlDT01QT05FTlQgZnJlZURpYW1ldGVyLWRpY3Rpb25hcnktcmZjNDAwNi1leHRlbnNpb24tM2dwcCkKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF9kY2NhXzNncHAvZGljdF9kY2NhXzNncHAuYyBiL2V4dGVuc2lvbnMvZGljdF9kY2NhXzNncHAvZGljdF9kY2NhXzNncHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDc5YmU0Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kaWN0X2RjY2FfM2dwcC9kaWN0X2RjY2FfM2dwcC5jCkBAIC0wLDAgKzEsMTA5MjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBBdXRob3I6IFRob21hcyBLbGF1c25lciA8dGtAZ2lnYS5vci5hdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgVGhvbWFzIEtsYXVzbmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFdyaXR0ZW4gdW5kZXIgY29udHJhY3QgYnkgbmZvdGV4IElUIEdtYkgsIGh0dHA6Ly9uZm90ZXguY29tLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyAqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisgKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorICogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgICAgICoKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAgICAqCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorICogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyAqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAKKyAqIERpY3Rpb25hcnkgZGVmaW5pdGlvbnMgZm9yIG9iamVjdHMgc3BlY2lmaWVkIGZvciBEQ0NBIGJ5IDNHUFAuCisgKgorICogVGhpcyBleHRlbnNpb25zIGNvbnRhaW5zIGEgbG90IG9mIEFWUHMgZnJvbSB2YXJpb3VzIDNHUFAgc3RhbmRhcmRzCisgKiBkb2N1bWVudHMsIGFuZCBzb21lIHJ1bGVzIGZvciB0aGUgZ3JvdXBlZCBBVlBzIGRlc2NyaWJlZCB0aGVyZWluLgorICoKKyAqIFRoaXMgZXh0ZW5zaW9uIGRvZXMgbm90IGNvbnRhaW4gQUxMIEFWUHMgZGVzY3JpYmVkIGJ5IDNHUFAsIGJ1dAorICogcXVpdGUgYSBiaWcgbnVtYmVyIG9mIHRoZW0uCisgKgorICogV2hlbiBleHRlbmRpbmcgdGhlIEFWUHMsIHBsZWFzZSBlZGl0IGRpY3RfZGNjYV8zZ3BwLm9yZyBpbnN0ZWFkIGFuZAorICogY3JlYXRlIHBhc3RhYmxlIGNvZGUgd2l0aCBjb250cmliL3Rvb2xzL29yZ190b19mZC5wbC4KKyAqCisgKiBTb21lIHBvaW50cyBvZiBjb25zaWRlcmF0aW9uOgorICogMS4gVGhpcyBkaWN0aW9uYXJ5IGNvdWxkIGJlIHNwbGl0IHVwIHBlciBkb2N1bWVudC4KKyAqCisgKiArIHBybzogeW91IGNhbiBvbmx5IGxvYWQgdGhlIEFWUHMvUnVsZXMgeW91J3JlIGludGVyZXN0ZWQgaW4gLT4KKyAqIHNtYWxsZXIgbWVtb3J5IHNpemUKKyAqCisgKiAtIGNvbjogdGhlIGRvY3VtZW50cyB1c2UgQVZQcyBmcm9tIGVhY2ggb3RoZXIgQSBMT1QsIHNvIHNldHRpbmcgdGhlCisgKiBkZXBlbmRlbmNpZXMgY29ycmVjdGx5IHdpbGwgYmUgYW5ub3lpbmcKKyAqCisgKiAtIGNvbjogeW91IG5lZWQgdG8gbG9hZCBhbGwgb2YgdGhlbSBhcyBleHRlbnNpb25zCisgKgorICogMi4gVGhpcyBkaWN0aW9uYXJ5IGNvbnRhaW5zIE9ORSBBVlAgaW4gdGhlICIzR1BQMiIgdmVuZG9yIHNwYWNlLAorICogc2luY2UgSSBmb3VuZCBpdCB3YXN0ZWZ1bCB0byB3cml0ZSBhIHNlcGFyYXRlIGRpY3Rpb25hcnkganVzdCBmb3IKKyAqIG9uZSBBVlAuIEFsc28sIGl0IGlzIGRlZmluZWQgaW4gYSAzR1BQIGRvY3VtZW50LgorICoKKyAqIDMuIFdoaWxlIHRoZXJlIGFyZSBxdWl0ZSBhIG51bWJlciBvZiBydWxlcyBoZXJlIGFscmVhZHksIG1hbnkgbW9yZQorICogYXJlIG1pc3NpbmcuIEkndmUgb25seSBhZGRlZCBydWxlcyBmb3IgdGhvc2UgZ3JvdXBlZCBBVlBzIG9yCisgKiBjb21tYW5kcyBpbiB3aGljaCBJIHdhcyBjb25jcmV0ZWx5IGludGVyZXN0ZWQgc28gZmFyOyBtYW55IG1vcmUKKyAqIHdpbGwgbmVlZCB0byBiZSBhZGRlZCB0byBtYWtlIHRoaXMgY29tcGxldGUuCisgKgorICogVGhhdCBiZWluZyBzYWlkLCBJIGhvcGUgdGhpcyB3aWxsIGJlIHVzZWZ1bCBmb3IgeW91LgorICoKKyAqLworCisKKy8qCisgKiBTb21lIGNvbW1lbnRzIG9uIHRoZSAzR1BQIFN0YW5kYXJkcyBkb2N1bWVudHMgdGhlbXNlbHZlczoKKyAqCisgKiAxLiBJdCB3b3VsZCBiZSBnb29kIGlmIDI5LjA2MSB3YXMgcmV2aWV3ZWQgdG8gY2hlY2sgZm9yIGVhY2ggQVZQIGlmCisgKiBpdCBpcyBNYW5kYXRvcnkgb3Igbm90LiBUaGUgZGF0YSBjdXJyZW50bHkgaW4gdGhlIGRvY3VtZW50IGRvZXMgbm90CisgKiBtYXRjaCB3aGF0IHdhcyBpbiB0aGUgcHJldmlvdXMgdmVyc2lvbiBvZiB0aGUgZnJlZURpYW1ldGVyCisgKiBleHRlbnNpb24gKHRoZSBvbmUgdGhhdCBleGlzdGVkYmVmb3JlIEkgcmV3cm90ZSBpdCkgb3Igd2hhdCBJIHNhdworICogc28gZmFyLiBJSVJDLCBldmVuIHRoZSB0YWJsZSBhbmQgdGhlIGRvY3VtZW50IGNvbnRyYWRpY3QgZWFjaAorICogb3RoZXIuIFRoZSBBVlAgdGFibGUgaXMgYWxzbyBtaXNzaW5nIGFuIGVudHJ5IGZvcgorICogIkV4dGVybmFsLUlkZW50aWZpZXIiLCAyOC4KKyAqCisgKiAyLiAyOS4xNDAgaGFzIGNvbmZsaWN0aW5nIEFWUCBuYW1lcyB3aXRoIG90aGVyIGRvY3VtZW50czoKKyAqICAgLSBTZXF1ZW5jZS1OdW1iZXIgaXMgYWxzbyBpbiAzMi4zMjkKKyAqICAgLSBSZWNpcGllbnQtQWRkcmVzcyBpcyBhbHNvIGluIDMyLjI5OQorICogICAtIFN0YXR1cyBpcyBhbHNvIGluIDMyLjI5OQorICoKKyAqIDMuIDI5LjIyOSBoYXMgbmFtZSBjb25mbGljdCB3aXRoIDI5LjMyOSBhYm91dCBVc2VyLURhdGEgKGRpZmZlcmVudAorICogQVZQIGNvZGUgNzAyLCBpbnN0ZWFkIG9mIDYwNikgLS0gdGhlIHdlaXJkIHRoaW5nIGlzLCB0aGUgbGF0dGVyCisgKiB1c2VzIHNvbWUgQVZQcyBmcm9tIHRoZSBmb3JtZXIsIGJ1dCBub3QgdGhpcyBvbmUuCisqLworI2luY2x1ZGUgPGZyZWVEaWFtZXRlci9leHRlbnNpb24uaD4KKworCisvKiBUaGUgY29udGVudCBvZiB0aGlzIGZpbGUgZm9sbG93cyB0aGUgc2FtZSBzdHJ1Y3R1cmUgYXMgZGljdF9iYXNlX3Byb3RvLmMgKi8KKworI2RlZmluZSBDSEVDS19kaWN0X25ldyggX3R5cGUsIF9kYXRhLCBfcGFyZW50LCBfcmVmICkJXAorCUNIRUNLX0ZDVCggIGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIChfdHlwZSksIChfZGF0YSksIChfcGFyZW50KSwgKF9yZWYpKSAgKTsKKworI2RlZmluZSBDSEVDS19kaWN0X3NlYXJjaCggX3R5cGUsIF9jcml0ZXJpYSwgX3doYXQsIF9yZXN1bHQgKQlcCisJQ0hFQ0tfRkNUKCAgZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgKF90eXBlKSwgKF9jcml0ZXJpYSksIChfd2hhdCksIChfcmVzdWx0KSwgRU5PRU5UKSApOworCitzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiB7CisJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWU7CisJZW51bSBydWxlX3Bvc2l0aW9uCXBvc2l0aW9uOworCWludCAJCQltaW47CisJaW50CQkJbWF4OworfTsKKworI2RlZmluZSBSVUxFX09SREVSKCBfcG9zaXRpb24gKSAoKCgoX3Bvc2l0aW9uKSA9PSBSVUxFX0ZJWEVEX0hFQUQpIHx8ICgoX3Bvc2l0aW9uKSA9PSBSVUxFX0ZJWEVEX1RBSUwpKSA/IDEgOiAwICkKKworLyogQXR0ZW50aW9uISBUaGlzIHZlcnNpb24gb2YgdGhlIG1hY3JvIHVzZXMgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgaW4gY29udHJhc3QgdG8gbW9zdCBvdGhlciBjb3BpZXMhICovCisjZGVmaW5lIFBBUlNFX2xvY19ydWxlcyggX3J1bGVhcnJheSwgX3BhcmVudCkgewkJCQkJCQkJXAorCWludCBfX2FyOwkJCQkJCQkJCQkJXAorCWZvciAoX19hcj0wOyBfX2FyIDwgc2l6ZW9mKF9ydWxlYXJyYXkpIC8gc2l6ZW9mKChfcnVsZWFycmF5KVswXSk7IF9fYXIrKykgewkJCVwKKwkJc3RydWN0IGRpY3RfcnVsZV9kYXRhIF9fZGF0YSA9IHsgTlVMTCwgCQkJCQkJCVwKKwkJCShfcnVsZWFycmF5KVtfX2FyXS5wb3NpdGlvbiwJCQkJCQkJXAorCQkJMCwgCQkJCQkJCQkJCVwKKwkJCShfcnVsZWFycmF5KVtfX2FyXS5taW4sCQkJCQkJCQlcCisJCQkoX3J1bGVhcnJheSlbX19hcl0ubWF4fTsJCQkJCQkJXAorCQlfX2RhdGEucnVsZV9vcmRlciA9IFJVTEVfT1JERVIoX19kYXRhLnJ1bGVfcG9zaXRpb24pOwkJCQkJXAorCQlDSEVDS19GQ1QoICBmZF9kaWN0X3NlYXJjaCggCQkJCQkJCQlcCisJCQlmZF9nX2NvbmZpZy0+Y25mX2RpY3QsCQkJCQkJCQlcCisJCQlESUNUX0FWUCwgCQkJCQkJCQkJXAorCQkJQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgCQkJCQkJCVwKKwkJCSYoX3J1bGVhcnJheSlbX19hcl0uYXZwX3ZlbmRvcl9wbHVzX25hbWUsCQkJCQlcCisJCQkmX19kYXRhLnJ1bGVfYXZwLCAwICkgKTsJCQkJCQkJXAorCQlpZiAoICFfX2RhdGEucnVsZV9hdnAgKSB7CQkJCQkJCQlcCisJCQlUUkFDRV9ERUJVRyhJTkZPLCAiQVZQIE5vdCBmb3VuZDogJyVzJyIsIChfcnVsZWFycmF5KVtfX2FyXS5hdnBfdmVuZG9yX3BsdXNfbmFtZS5hdnBfbmFtZSk7CQlcCisJCQlyZXR1cm4gRU5PRU5UOwkJCQkJCQkJCVwKKwkJfQkJCQkJCQkJCQkJXAorCQlDSEVDS19GQ1RfRE8oIGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfUlVMRSwgJl9fZGF0YSwgX3BhcmVudCwgTlVMTCksCVwKKwkJCXsJCQkJCQkJICAgICAgICAJCVwKKwkJCQlUUkFDRV9ERUJVRyhJTkZPLCAiRXJyb3Igb24gcnVsZSB3aXRoIEFWUCAnJXMnIiwgICAgICAJCQlcCisJCQkJCSAgICAoX3J1bGVhcnJheSlbX19hcl0uYXZwX3ZlbmRvcl9wbHVzX25hbWUuYXZwX25hbWUpOwkJXAorCQkJCXJldHVybiBFSU5WQUw7CQkJCQkgICAgICAJCQlcCisJCQl9ICk7CQkJCQkJCSAgICAgIAkJCVwKKwl9CQkJCQkJCQkJICAgICAgCQkJXAorfQorCisjZGVmaW5lIGVudW12YWxfZGVmX3UzMiggX3ZhbF8sIF9zdHJfICkgXAorCQl7IF9zdHJfLCAJCXsgLnUzMiA9IF92YWxfIH19CisKKyNkZWZpbmUgZW51bXZhbF9kZWZfb3MoIF9sZW5fLCBfdmFsXywgX3N0cl8gKSBcCisJCXsgX3N0cl8sIAkJeyAub3MgPSB7IC5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilfdmFsXywgLmxlbiA9IF9sZW5fIH19fQorCisKK3N0YXRpYyBpbnQgZGljdF9kY2NhXzNncHBfZW50cnkoY2hhciAqIGNvbmZmaWxlKQoreworCS8qIEFwcGxpY2F0aW9ucyBzZWN0aW9uICovCisJewkJCisgICAgICAgICAgICAgICAgLyogQ3JlYXRlIHRoZSB2ZW5kb3JzICovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRpY3RfdmVuZG9yX2RhdGEgdmVuZG9yX2RhdGEgPSB7IDEwNDE1LCAiM0dQUCIgfTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX0ZDVChmZF9kaWN0X25ldyhmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfVkVORE9SLCAmdmVuZG9yX2RhdGEsIE5VTEwsIE5VTEwpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRpY3RfdmVuZG9yX2RhdGEgdmVuZG9yX2RhdGEgPSB7IDU1MzUsICIzR1BQMiIgfTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX0ZDVChmZF9kaWN0X25ldyhmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfVkVORE9SLCAmdmVuZG9yX2RhdGEsIE5VTEwsIE5VTEwpKTsKKyAgICAgICAgICAgICAgICB9CisKKwl9CisJCisKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBBZGRyZXNzX3R5cGU7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogRGlhbWV0ZXJJZGVudGl0eV90eXBlOworCXN0cnVjdCBkaWN0X29iamVjdCAqIERpYW1ldGVyVVJJX3R5cGU7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogSVBGaWx0ZXJSdWxlX3R5cGU7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogVGltZV90eXBlOworCXN0cnVjdCBkaWN0X29iamVjdCAqIFVURjhTdHJpbmdfdHlwZTsKKworCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkFkZHJlc3MiLCAmQWRkcmVzc190eXBlKTsKKwlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJEaWFtZXRlcklkZW50aXR5IiwgJkRpYW1ldGVySWRlbnRpdHlfdHlwZSk7CisJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiRGlhbWV0ZXJVUkkiLCAmRGlhbWV0ZXJVUklfdHlwZSk7CisJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiSVBGaWx0ZXJSdWxlIiwgJklQRmlsdGVyUnVsZV90eXBlKTsKKwlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJUaW1lIiwgJlRpbWVfdHlwZSk7CisJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiVVRGOFN0cmluZyIsICZVVEY4U3RyaW5nX3R5cGUpOworCQorCisJLyogVGhlIGZvbGxvd2luZyBpcyBjcmVhdGVkIGF1dG9tYXRpY2FsbHkuIERvIG5vdCBtb2RpZnkuICovCisJLyogQ2hhbmdlcyB3aWxsIGJlIGxvc3QgZHVyaW5nIHRoZSBuZXh0IHVwZGF0ZS4gTW9kaWZ5IHRoZSBzb3VyY2Ugb3JnIGZpbGUgaW5zdGVhZC4gKi8KKworCS8qIDNHUFAgMjkuMDYxLWMwMCAoMTIuMC4wIDIwMTIuMTIuMjApICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCS8qIDNHUFAgMjkuMDYxIGlzIG5vdCB2ZXJ5IGNsZWFyIGFuZCBzZWxmLWluY29uc2lzdGVudCBhYm91dCBNICAqLworCS8qIGZvciB0aGlzIHJlYXNvbiwgb3RoZXIgc291cmNlcyBhcmUgYXNzdW1lZCBtb3JlIHRydXN0d29ydGh5ICAqLworCS8qIE0gaW5jb25zaXN0ZW50bHkgc3BlY2lmaWVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCS8qIDNHUFAtSU1TSSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTEsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSIzR1BQLUlNU0kiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCX07CisKKwkvKiAyOS4wNjEgc2F5cyBPY3RldFN0cmluZzsgZHVtcHMgc2F5IFVJbnQzMjsgbWFudWFsbHkgY2hhbmdlZCAgKi8KKwkvKiAyOS4wNjEgc2F5cyBNVVNUIE5PVCBNOyBkdW1wcyBzYXkgTVVTVCAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkvKiAzR1BQLUNoYXJnaW5nLUlkICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMiwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIjNHUFAtQ2hhcmdpbmctSWQiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiAyOS4wNjEgc2F5cyBNVVNUIE5PVCBNOyBkdW1wcyBzYXkgTVVTVCAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkvKiAzR1BQLVBEUC1UeXBlICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIjNHUFAtUERQLVR5cGUiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZCgzR1BQLVBEUC1UeXBlKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogM0dQUC1DRy1BZGRyZXNzICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJNCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIjNHUFAtQ0ctQWRkcmVzcyIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogMjkuMDYxIHNheXMgTVVTVCBOT1QgTTsgb2xkIGNvbnRyaWIvM2dwcCBzYXlzIE1VU1QgICAgICAgICAgICovCisJLyogM0dQUC1HUFJTLU5lZ290aWF0ZWQtUW9TLVByb2ZpbGUgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk1LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiM0dQUC1HUFJTLU5lZ290aWF0ZWQtUW9TLVByb2ZpbGUiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCX07CisKKwkvKiBNIGluY29uc2lzdGVudGx5IHNwZWNpZmllZDsgb2xkIGNvbnRyaWIvM2dnIHNheXMgTVVTVCBOT1QgICAgKi8KKwkvKiAzR1BQLVNHU04tQWRkcmVzcyAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTYsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSIzR1BQLVNHU04tQWRkcmVzcyIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogM0dQUC1HR1NOLUFkZHJlc3MgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk3LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiM0dQUC1HR1NOLUFkZHJlc3MiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIDI5LjA2MSBzYXlzIE1VU1QgTk9UIE07IGR1bXBzIHNheSBNVVNUICAgICAgICAgICAgICAgICAgICAgICAqLworCS8qIDNHUFAtSU1TSS1NQ0MtTU5DICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJOCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIjNHUFAtSU1TSS1NQ0MtTU5DIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwl9OworCisJLyogMjkuMDYxIHNheXMgTVVTVCBOT1QgTTsgb2xkIGNvbnRyaWIvM2dwcCBzYXlzIE1VU1QgICAgICAgICAgICovCisJLyogM0dQUC1HR1NOLU1DQy1NTkMgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk5LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiM0dQUC1HR1NOLU1DQy1NTkMiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCX07CisKKwkvKiAyOS4wNjEgc2F5cyBNVVNUIE5PVCBNOyBvbGQgY29udHJpYi8zZ3BwIHNheXMgTVVTVCAgICAgICAgICAgKi8KKwkvKiAzR1BQLU5TQVBJICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTAsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSIzR1BQLU5TQVBJIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIGFkZGVkIG1hbnVhbGx5LCBtaXNzaW5nIGluIEFWUCB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAqLworCS8qIDNHUFAtU2Vzc2lvbi1TdG9wLUluZGljYXRvciAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTExLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiM0dQUC1TZXNzaW9uLVN0b3AtSW5kaWNhdG9yIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiAyOS4wNjEgc2F5cyBNVVNUIE5PVCBNOyBvbGQgY29udHJpYi8zZ3BwIHNheXMgTVVTVCAgICAgICAgICAgKi8KKwkvKiAzR1BQLVNlbGVjdGlvbi1Nb2RlICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTIsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSIzR1BQLVNlbGVjdGlvbi1Nb2RlIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwl9OworCisJLyogMjkuMDYxIHNheXMgTVVTVCBOT1QgTTsgb2xkIGNvbnRyaWIvM2dwcCBzYXlzIE1VU1QgICAgICAgICAgICovCisJLyogM0dQUC1DaGFyZ2luZy1DaGFyYWN0ZXJpc3RpY3MgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIjNHUFAtQ2hhcmdpbmctQ2hhcmFjdGVyaXN0aWNzIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwl9OworCisJLyogMjkuMDYxIHNheXMgTVVTVCBOT1QgTTsgb2xkIGNvbnRyaWIvM2dwcCBzYXlzIE1VU1QgICAgICAgICAgICovCisJLyogM0dQUC1DRy1JUHY2LUFkZHJlc3MgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIjNHUFAtQ0ctSVB2Ni1BZGRyZXNzIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIE0gaW5jb25zaXN0ZW50bHkgc3BlY2lmaWVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCS8qIDI5LjA2MSBzYXlzIE1VU1QgTk9UIE07IG9sZCBjb250cmliLzNncHAgc2F5cyBNVVNUICAgICAgICAgICAqLworCS8qIDNHUFAtU0dTTi1JUHY2LUFkZHJlc3MgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIjNHUFAtU0dTTi1JUHY2LUFkZHJlc3MiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogMjkuMDYxIHNheXMgTVVTVCBOT1QgTTsgb2xkIGNvbnRyaWIvM2dwcCBzYXlzIE1VU1QgICAgICAgICAgICovCisJLyogM0dQUC1HR1NOLUlQdjYtQWRkcmVzcyAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTE2LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiM0dQUC1HR1NOLUlQdjYtQWRkcmVzcyIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiAyOS4wNjEgc2F5cyBNVVNUIE5PVCBNOyBvbGQgY29udHJpYi8zZ3BwIHNheXMgTVVTVCAgICAgICAgICAgKi8KKwkvKiAzR1BQLUlQdjYtRE5TLVNlcnZlcnMgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIjNHUFAtSVB2Ni1ETlMtU2VydmVycyIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiAyOS4wNjEgc2F5cyBNVVNUIE5PVCBNOyBvbGQgY29udHJpYi8zZ3BwIHNheXMgTVVTVCAgICAgICAgICAgKi8KKwkvKiAzR1BQLVNHU04tTUNDLU1OQyAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTE4LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiM0dQUC1TR1NOLU1DQy1NTkMiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCX07CisKKwkvKiBNIGluY29uc2lzdGVudGx5IHNwZWNpZmllZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkvKiAzR1BQLUlNRUlTViAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTIwLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiM0dQUC1JTUVJU1YiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogTSBpbmNvbnNpc3RlbnRseSBzcGVjaWZpZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJLyogM0dQUC1SQVQtVHlwZSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTIxLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiM0dQUC1SQVQtVHlwZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBNIGluY29uc2lzdGVudGx5IHNwZWNpZmllZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkvKiAzR1BQLVVzZXItTG9jYXRpb24tSW5mbyAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTIyLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiM0dQUC1Vc2VyLUxvY2F0aW9uLUluZm8iLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogTSBpbmNvbnNpc3RlbnRseSBzcGVjaWZpZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJLyogM0dQUC1NUy1UaW1lWm9uZSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTIzLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiM0dQUC1NUy1UaW1lWm9uZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiAzR1BQLUNBTUVMLUNoYXJnaW5nLUluZm8gKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkyNCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIjNHUFAtQ0FNRUwtQ2hhcmdpbmctSW5mbyIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogM0dQUC1QYWNrZXQtRmlsdGVyICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMjUsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSIzR1BQLVBhY2tldC1GaWx0ZXIiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIDNHUFAtTmVnb3RpYXRlZC1EU0NQICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMjYsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSIzR1BQLU5lZ290aWF0ZWQtRFNDUCIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogM0dQUC1BbGxvY2F0ZS1JUC1UeXBlICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMjcsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSIzR1BQLUFsbG9jYXRlLUlQLVR5cGUiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIGFkZGVkIG1hbnVhbGx5LCBtaXNzaW5nIGluIEFWUCB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAqLworCS8qIEV4dGVybmFsLUlkZW50aWZpZXIgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkyOCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkV4dGVybmFsLUlkZW50aWZpZXIiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIFRNR0kgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk5MDAsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJUTUdJIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIFJlcXVpcmVkLU1CTVMtQmVhcmVyLUNhcGFiaWxpdGllcyAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTkwMSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlJlcXVpcmVkLU1CTVMtQmVhcmVyLUNhcGFiaWxpdGllcyIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIE1CTVMtU3RhcnRTdG9wLUluZGljYXRpb24gKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk5MDIsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJNQk1TLVN0YXJ0U3RvcC1JbmRpY2F0aW9uIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoTUJNUy1TdGFydFN0b3AtSW5kaWNhdGlvbikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIE1CTVMtU2VydmljZS1BcmVhICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJOTAzLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiTUJNUy1TZXJ2aWNlLUFyZWEiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogTUJNUy1TZXNzaW9uLUR1cmF0aW9uICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJOTA0LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiTUJNUy1TZXNzaW9uLUR1cmF0aW9uIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIEFsdGVybmF0aXZlLUFQTiAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTkwNSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkFsdGVybmF0aXZlLUFQTiIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIE1CTVMtU2VydmljZS1UeXBlICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJOTA2LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiTUJNUy1TZXJ2aWNlLVR5cGUiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChNQk1TLVNlcnZpY2UtVHlwZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIE1CTVMtMkctM0ctSW5kaWNhdG9yICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJOTA3LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiTUJNUy0yRy0zRy1JbmRpY2F0b3IiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChNQk1TLTJHLTNHLUluZGljYXRvcikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIE1CTVMtU2Vzc2lvbi1JZGVudGl0eSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTkwOCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIk1CTVMtU2Vzc2lvbi1JZGVudGl0eSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBSQUkgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk5MDksCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJSQUkiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCX07CisKKwkvKiBBZGRpdGlvbmFsLU1CTVMtVHJhY2UtSW5mbyAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTkxMCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkFkZGl0aW9uYWwtTUJNUy1UcmFjZS1JbmZvIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIE1CTVMtVGltZS1Uby1EYXRhLVRyYW5zZmVyICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJOTExLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiTUJNUy1UaW1lLVRvLURhdGEtVHJhbnNmZXIiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogTUJNUy1TZXNzaW9uLVJlcGV0aXRpb24tTnVtYmVyICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJOTEyLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiTUJNUy1TZXNzaW9uLVJlcGV0aXRpb24tTnVtYmVyIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIE1CTVMtUmVxdWlyZWQtUW9TICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJOTEzLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiTUJNUy1SZXF1aXJlZC1Rb1MiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCX07CisKKwkvKiBNQk1TLUNvdW50aW5nLUluZm9ybWF0aW9uICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJOTE0LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiTUJNUy1Db3VudGluZy1JbmZvcm1hdGlvbiIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKE1CTVMtQ291bnRpbmctSW5mb3JtYXRpb24pIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQlDSEVDS19kaWN0X25ldyhESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCX07CisKKwkvKiBNQk1TLVVzZXItRGF0YS1Nb2RlLUluZGljYXRpb24gKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk5MTUsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJNQk1TLVVzZXItRGF0YS1Nb2RlLUluZGljYXRpb24iLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChNQk1TLVVzZXItRGF0YS1Nb2RlLUluZGljYXRpb24pIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQlDSEVDS19kaWN0X25ldyhESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCX07CisKKwkvKiBNQk1TLUdHU04tQWRkcmVzcyAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTkxNiwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIk1CTVMtR0dTTi1BZGRyZXNzIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIE1CTVMtR0dTTi1JUHY2LUFkZHJlc3MgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk5MTcsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJNQk1TLUdHU04tSVB2Ni1BZGRyZXNzIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIE1CTVMtQk1TQy1TU00tSVAtQWRkcmVzcyAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTkxOCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIk1CTVMtQk1TQy1TU00tSVAtQWRkcmVzcyIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBNQk1TLUJNU0MtU1NNLUlQdjYtQWRkcmVzcyAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTkxOSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIk1CTVMtQk1TQy1TU00tSVB2Ni1BZGRyZXNzIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIE1CTVMtRmxvdy1JZGVudGlmaWVyICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJOTIwLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiTUJNUy1GbG93LUlkZW50aWZpZXIiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogQ04tSVAtTXVsdGljYXN0LURpc3RyaWJ1dGlvbiAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTkyMSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkNOLUlQLU11bHRpY2FzdC1EaXN0cmlidXRpb24iLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChDTi1JUC1NdWx0aWNhc3QtRGlzdHJpYnV0aW9uKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogTUJNUy1IQy1JbmRpY2F0b3IgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk5MjIsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJNQk1TLUhDLUluZGljYXRvciIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKE1CTVMtSEMtSW5kaWNhdG9yKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogM0dQUCAyOS4xNDAtNzAwICg3LjAuMCAyMDA3LjA3LjA1KSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJLyogU2VydmVkLVVzZXItSWRlbnRpdHkgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMTAwLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiU2VydmVkLVVzZXItSWRlbnRpdHkiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiByZXVzZXM6IE1TSVNETiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkvKiBWQVNQLUlEICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTEwMSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlZBU1AtSUQiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCX07CisKKwkvKiBWQVMtSUQgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMTAyLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiVkFTLUlEIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwl9OworCisJLyogVHJpZ2dlci1FdmVudCAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTExMDMsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJUcmlnZ2VyLUV2ZW50IiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoVHJpZ2dlci1FdmVudCkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIHJldXNlczogM0dQUC1JTVNJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCS8qIFNlbmRlci1BZGRyZXNzICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTEwNCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlNlbmRlci1BZGRyZXNzIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwl9OworCisJLyogSW5pdGlhbC1SZWNpcGllbnQtQWRkcmVzcyAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTExMDUsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJJbml0aWFsLVJlY2lwaWVudC1BZGRyZXNzIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogUmVzdWx0LVJlY2lwaWVudC1BZGRyZXNzICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTEwNiwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlJlc3VsdC1SZWNpcGllbnQtQWRkcmVzcyIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIGNvbmZsaWN0cyB3aXRoIG9uZSBpbiAobW9yZSBjb21tb24pIDMyLjMyOSAgICAgICAgICAgICAgICAgICAqLworCS8qIFNlcXVlbmNlLU51bWJlci0yOS4xNDAgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMTA3LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiU2VxdWVuY2UtTnVtYmVyLTI5LjE0MCIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIGNvbmZsaWN0cyB3aXRoIG9uZSBpbiAobW9yZSBjb21tb24pIDMyLjI5OSAgICAgICAgICAgICAgICAgICAqLworCS8qIFJlY2lwaWVudC1BZGRyZXNzLTI5LjE0MCAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTExMDgsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJSZWNpcGllbnQtQWRkcmVzcy0yOS4xNDAiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCX07CisKKwkvKiBSb3V0ZWluZy1BZGRyZXNzICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTEwOSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlJvdXRlaW5nLUFkZHJlc3MiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCX07CisKKwkvKiBPcmlnaW5hdGluZy1JbnRlcmZhY2UgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMTEwLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiT3JpZ2luYXRpbmctSW50ZXJmYWNlIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoT3JpZ2luYXRpbmctSW50ZXJmYWNlKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogRGVsaXZlcnktUmVwb3J0ICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTExMSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkRlbGl2ZXJ5LVJlcG9ydCIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKERlbGl2ZXJ5LVJlcG9ydCkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIFJlYWQtUmVwbHkgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMTEyLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiUmVhZC1SZXBseSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFJlYWQtUmVwbHkpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQlDSEVDS19kaWN0X25ldyhESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCX07CisKKwkvKiBTZW5kZXItVmlzaWJpbGl0eSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTExMTMsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJTZW5kZXItVmlzaWJpbGl0eSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFNlbmRlci1WaXNpYmlsaXR5KSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogU2VydmljZS1LZXkgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMTE0LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiU2VydmljZS1LZXkiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCX07CisKKwkvKiBCaWxsaW5nLUluZm9ybWF0aW9uICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTExNSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkJpbGxpbmctSW5mb3JtYXRpb24iLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCX07CisKKwkvKiBjb25mbGljdHMgd2l0aCBvbmUgaW4gKG1vcmUgY29tbW9uKSAzMi4yOTkgICAgICAgICAgICAgICAgICAgKi8KKwkvKiBTdGF0dXMtMjkuMTQwICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTExNiwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlN0YXR1cy0yOS4xNDAiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBTdGF0dXMtQ29kZSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTExMTcsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJTdGF0dXMtQ29kZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIFN0YXR1cy1UZXh0ICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTExOCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlN0YXR1cy1UZXh0IiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwl9OworCisJLyogUm91dGVpbmctQWRkcmVzcy1SZXNvbHV0aW9uICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTExOSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlJvdXRlaW5nLUFkZHJlc3MtUmVzb2x1dGlvbiIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFJvdXRlaW5nLUFkZHJlc3MtUmVzb2x1dGlvbikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIDNHUFAgMjkuMTczLWMwMCAoMTIuMC4wIDIwMTMuMDMuMTMpICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCS8qIExNU0kgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkyNDAwLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiTE1TSSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBTZXJ2aW5nLU5vZGUgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkyNDAxLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiU2VydmluZy1Ob2RlIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogTU1FLU5hbWUgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkyNDAyLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiTU1FLU5hbWUiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBEaWFtZXRlcklkZW50aXR5X3R5cGUsIE5VTEwpOworCX07CisKKwkvKiBNU0MtTnVtYmVyICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMjQwMywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIk1TQy1OdW1iZXIiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogTENTLUNhcGFiaWxpdGllcy1TZXRzICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMjQwNCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkxDUy1DYXBhYmlsaXRpZXMtU2V0cyIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIEdNTEMtQWRkcmVzcyAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTI0MDUsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJHTUxDLUFkZHJlc3MiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBBZGRyZXNzX3R5cGUsIE5VTEwpOworCX07CisKKwkvKiBBZGRpdGlvbmFsLVNlcnZpbmctTm9kZSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTI0MDYsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJBZGRpdGlvbmFsLVNlcnZpbmctTm9kZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIFBQUi1BZGRyZXNzICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMjQwNywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlBQUi1BZGRyZXNzIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgQWRkcmVzc190eXBlLCBOVUxMKTsKKwl9OworCisJLyogTU1FLVJlYWxtICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMjQwOCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIk1NRS1SZWFsbSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBEaWFtZXRlcklkZW50aXR5X3R5cGUsIE5VTEwpOworCX07CisKKwkvKiBTR1NOLU5hbWUgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkyNDA5LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiU0dTTi1OYW1lIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIERpYW1ldGVySWRlbnRpdHlfdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIFNHU04tUmVhbG0gKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkyNDEwLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiU0dTTi1SZWFsbSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBEaWFtZXRlcklkZW50aXR5X3R5cGUsIE5VTEwpOworCX07CisKKwkvKiAzR1BQIDI5LjIxMC02NzAgKDYuNy4wIDIwMDYtMTItMTgpICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkvKiBQRFAtU2Vzc2lvbi1PcGVyYXRpb24gKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMDE1LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiUERQLVNlc3Npb24tT3BlcmF0aW9uIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoUERQLVNlc3Npb24tT3BlcmF0aW9uKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogM0dQUCAyOS4yMTItYzAwICgxMi4wLjAgMjAxMy4wMy4xNSkgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJLyogR3gtc3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJLyogQURDLVJldmFsaWRhdGlvbi1UaW1lICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMjgwMSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkFEQy1SZXZhbGlkYXRpb24tVGltZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBUaW1lX3R5cGUsIE5VTEwpOworCX07CisKKwkvKiBBREMtUnVsZS1JbnN0YWxsICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTA5MiwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkFEQy1SdWxlLUluc3RhbGwiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogQURDLVJ1bGUtUmVtb3ZlICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTA5MywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkFEQy1SdWxlLVJlbW92ZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBBREMtUnVsZS1EZWZpbml0aW9uICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTA5NCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkFEQy1SdWxlLURlZmluaXRpb24iLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogQURDLVJ1bGUtQmFzZS1OYW1lICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTA5NSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkFEQy1SdWxlLUJhc2UtTmFtZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCX07CisKKwkvKiBBREMtUnVsZS1OYW1lICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTA5NiwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkFEQy1SdWxlLU5hbWUiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIEFEQy1SdWxlLVJlcG9ydCAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTEwOTcsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJBREMtUnVsZS1SZXBvcnQiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogQXBwbGljYXRpb24tRGV0ZWN0aW9uLUluZm9ybWF0aW9uICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTA5OCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkFwcGxpY2F0aW9uLURldGVjdGlvbi1JbmZvcm1hdGlvbiIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBBY2Nlc3MtTmV0d29yay1DaGFyZ2luZy1JZGVudGlmaWVyLUd4ICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTAyMiwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkFjY2Vzcy1OZXR3b3JrLUNoYXJnaW5nLUlkZW50aWZpZXItR3giLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBBbGxvY2F0aW9uLVJldGVudGlvbi1Qcmlvcml0eSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTEwMzQsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJBbGxvY2F0aW9uLVJldGVudGlvbi1Qcmlvcml0eSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBBTi1HVy1BZGRyZXNzICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTA1MCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkFOLUdXLUFkZHJlc3MiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgQWRkcmVzc190eXBlLCBOVUxMKTsKKwl9OworCisJLyogQVBOLUFnZ3JlZ2F0ZS1NYXgtQml0cmF0ZS1ETCAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTEwNDAsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJBUE4tQWdncmVnYXRlLU1heC1CaXRyYXRlLURMIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIEFQTi1BZ2dyZWdhdGUtTWF4LUJpdHJhdGUtVUwgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMDQxLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiQVBOLUFnZ3JlZ2F0ZS1NYXgtQml0cmF0ZS1VTCIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBCZWFyZXItQ29udHJvbC1Nb2RlICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTAyMywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkJlYXJlci1Db250cm9sLU1vZGUiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChCZWFyZXItQ29udHJvbC1Nb2RlKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogQmVhcmVyLUlkZW50aWZpZXIgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMDIwLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiQmVhcmVyLUlkZW50aWZpZXIiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogQmVhcmVyLU9wZXJhdGlvbiAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTEwMjEsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJCZWFyZXItT3BlcmF0aW9uIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoQmVhcmVyLU9wZXJhdGlvbikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIEJlYXJlci1Vc2FnZSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTEwMDAsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJCZWFyZXItVXNhZ2UiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChCZWFyZXItVXNhZ2UpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQlDSEVDS19kaWN0X25ldyhESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCX07CisKKwkvKiBDaGFyZ2luZy1SdWxlLUluc3RhbGwgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMDAxLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiQ2hhcmdpbmctUnVsZS1JbnN0YWxsIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogQ2hhcmdpbmctUnVsZS1SZW1vdmUgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMDAyLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiQ2hhcmdpbmctUnVsZS1SZW1vdmUiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBDaGFyZ2luZy1SdWxlLURlZmluaXRpb24gKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMDAzLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiQ2hhcmdpbmctUnVsZS1EZWZpbml0aW9uIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogQ2hhcmdpbmctUnVsZS1CYXNlLU5hbWUgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMDA0LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiQ2hhcmdpbmctUnVsZS1CYXNlLU5hbWUiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCX07CisKKwkvKiBDaGFyZ2luZy1SdWxlLU5hbWUgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMDA1LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiQ2hhcmdpbmctUnVsZS1OYW1lIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIENoYXJnaW5nLVJ1bGUtUmVwb3J0ICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTAxOCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkNoYXJnaW5nLVJ1bGUtUmVwb3J0IiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogQ2hhcmdpbmctQ29ycmVsYXRpb24tSW5kaWNhdG9yICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTA3MywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkNoYXJnaW5nLUNvcnJlbGF0aW9uLUluZGljYXRvciIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChDaGFyZ2luZy1Db3JyZWxhdGlvbi1JbmRpY2F0b3IpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQlDSEVDS19kaWN0X25ldyhESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCX07CisKKwkvKiBDb0EtSVAtQWRkcmVzcyAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTEwMzUsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJDb0EtSVAtQWRkcmVzcyIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBBZGRyZXNzX3R5cGUsIE5VTEwpOworCX07CisKKwkvKiBDb0EtSW5mb3JtYXRpb24gKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMDM5LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiQ29BLUluZm9ybWF0aW9uIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIENTRy1JbmZvcm1hdGlvbi1SZXBvcnRpbmcgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMDcxLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiQ1NHLUluZm9ybWF0aW9uLVJlcG9ydGluZyIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChDU0ctSW5mb3JtYXRpb24tUmVwb3J0aW5nKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogRGVmYXVsdC1FUFMtQmVhcmVyLVFvUyAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTEwNDksCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJEZWZhdWx0LUVQUy1CZWFyZXItUW9TIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIEV2ZW50LVJlcG9ydC1JbmRpY2F0aW9uICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTAzMywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkV2ZW50LVJlcG9ydC1JbmRpY2F0aW9uIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIEV2ZW50LVRyaWdnZXIgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMDA2LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiRXZlbnQtVHJpZ2dlciIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKEV2ZW50LVRyaWdnZXIpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQlDSEVDS19kaWN0X25ldyhESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCX07CisKKwkvKiBGbG93LURpcmVjdGlvbiAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTEwODAsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJGbG93LURpcmVjdGlvbiIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChGbG93LURpcmVjdGlvbikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIEZsb3ctSW5mb3JtYXRpb24gKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMDU4LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiRmxvdy1JbmZvcm1hdGlvbiIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBGbG93LUxhYmVsICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTA1NywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkZsb3ctTGFiZWwiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIElQLUNBTi1UeXBlICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTAyNywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIklQLUNBTi1UeXBlIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoSVAtQ0FOLVR5cGUpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQlDSEVDS19kaWN0X25ldyhESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCX07CisKKwkvKiBHdWFyYW50ZWVkLUJpdHJhdGUtREwgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMDI1LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiR3VhcmFudGVlZC1CaXRyYXRlLURMIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogR3VhcmFudGVlZC1CaXRyYXRlLVVMICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTAyNiwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkd1YXJhbnRlZWQtQml0cmF0ZS1VTCIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIEhlTkItTG9jYWwtSVAtQWRkcmVzcyAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTI4MDQsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJIZU5CLUxvY2FsLUlQLUFkZHJlc3MiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgQWRkcmVzc190eXBlLCBOVUxMKTsKKwl9OworCisJLyogTWV0ZXJpbmctTWV0aG9kICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTAwNywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIk1ldGVyaW5nLU1ldGhvZCIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKE1ldGVyaW5nLU1ldGhvZCkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIE1vbml0b3JpbmctS2V5ICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTA2NiwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIk1vbml0b3JpbmctS2V5IiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBNdXRlLU5vdGlmaWNhdGlvbiAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTI4MDksCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJNdXRlLU5vdGlmaWNhdGlvbiIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChNdXRlLU5vdGlmaWNhdGlvbikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIE1vbml0b3JpbmctVGltZSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTI4MTAsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJNb25pdG9yaW5nLVRpbWUiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgVGltZV90eXBlLCBOVUxMKTsKKwl9OworCisJLyogTmV0d29yay1SZXF1ZXN0LVN1cHBvcnQgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMDI0LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiTmV0d29yay1SZXF1ZXN0LVN1cHBvcnQiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChOZXR3b3JrLVJlcXVlc3QtU3VwcG9ydCkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIE9mZmxpbmUgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMDA4LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiT2ZmbGluZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKE9mZmxpbmUpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQlDSEVDS19kaWN0X25ldyhESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCX07CisKKwkvKiBPbmxpbmUgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMDA5LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiT25saW5lIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoT25saW5lKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogUGFja2V0LUZpbHRlci1Db250ZW50ICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTA1OSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlBhY2tldC1GaWx0ZXItQ29udGVudCIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBJUEZpbHRlclJ1bGVfdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIFBhY2tldC1GaWx0ZXItSWRlbnRpZmllciAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTEwNjAsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJQYWNrZXQtRmlsdGVyLUlkZW50aWZpZXIiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIFBhY2tldC1GaWx0ZXItSW5mb3JtYXRpb24gKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMDYxLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiUGFja2V0LUZpbHRlci1JbmZvcm1hdGlvbiIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBQYWNrZXQtRmlsdGVyLU9wZXJhdGlvbiAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTEwNjIsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJQYWNrZXQtRmlsdGVyLU9wZXJhdGlvbiIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChQYWNrZXQtRmlsdGVyLU9wZXJhdGlvbikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIFBhY2tldC1GaWx0ZXItVXNhZ2UgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMDcyLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiUGFja2V0LUZpbHRlci1Vc2FnZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChQYWNrZXQtRmlsdGVyLVVzYWdlKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogUEROLUNvbm5lY3Rpb24tSUQgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMDY1LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiUEROLUNvbm5lY3Rpb24tSUQiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBQcmVjZWRlbmNlICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTAxMCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlByZWNlZGVuY2UiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBQcmUtZW1wdGlvbi1DYXBhYmlsaXR5ICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTA0NywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlByZS1lbXB0aW9uLUNhcGFiaWxpdHkiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoUHJlLWVtcHRpb24tQ2FwYWJpbGl0eSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIFByZS1lbXB0aW9uLVZ1bG5lcmFiaWxpdHkgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMDQ4LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiUHJlLWVtcHRpb24tVnVsbmVyYWJpbGl0eSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChQcmUtZW1wdGlvbi1WdWxuZXJhYmlsaXR5KSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogUHJpb3JpdHktTGV2ZWwgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMDQ2LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiUHJpb3JpdHktTGV2ZWwiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogUmVkaXJlY3QtSW5mb3JtYXRpb24gKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMDg1LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiUmVkaXJlY3QtSW5mb3JtYXRpb24iLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogUmVkaXJlY3QtU3VwcG9ydCAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTEwODYsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJSZWRpcmVjdC1TdXBwb3J0IiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFJlZGlyZWN0LVN1cHBvcnQpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQlDSEVDS19kaWN0X25ldyhESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCX07CisKKwkvKiBSZXBvcnRpbmctTGV2ZWwgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMDExLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiUmVwb3J0aW5nLUxldmVsIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoUmVwb3J0aW5nLUxldmVsKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogUm91dGluZy1GaWx0ZXIgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMDc4LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiUm91dGluZy1GaWx0ZXIiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogUm91dGluZy1JUC1BZGRyZXNzICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTA3OSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlJvdXRpbmctSVAtQWRkcmVzcyIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBBZGRyZXNzX3R5cGUsIE5VTEwpOworCX07CisKKwkvKiBSb3V0aW5nLVJ1bGUtRGVmaW5pdGlvbiAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTEwNzYsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJSb3V0aW5nLVJ1bGUtRGVmaW5pdGlvbiIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBSb3V0aW5nLVJ1bGUtSWRlbnRpZmllciAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTEwNzcsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJSb3V0aW5nLVJ1bGUtSWRlbnRpZmllciIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogUm91dGluZy1SdWxlLUluc3RhbGwgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMDgxLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiUm91dGluZy1SdWxlLUluc3RhbGwiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogUm91dGluZy1SdWxlLVJlbW92ZSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTEwNzUsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJSb3V0aW5nLVJ1bGUtUmVtb3ZlIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIFBDQy1SdWxlLVN0YXR1cyAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTEwMTksCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJQQ0MtUnVsZS1TdGF0dXMiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChQQ0MtUnVsZS1TdGF0dXMpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQlDSEVDS19kaWN0X25ldyhESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCX07CisKKwkvKiBTZXNzaW9uLVJlbGVhc2UtQ2F1c2UgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMDQ1LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiU2Vzc2lvbi1SZWxlYXNlLUNhdXNlIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoU2Vzc2lvbi1SZWxlYXNlLUNhdXNlKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogVERGLUluZm9ybWF0aW9uICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTA4NywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlRERi1JbmZvcm1hdGlvbiIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBUREYtQXBwbGljYXRpb24tSWRlbnRpZmllciAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTEwODgsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJUREYtQXBwbGljYXRpb24tSWRlbnRpZmllciIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogVERGLUFwcGxpY2F0aW9uLUluc3RhbmNlLUlkZW50aWZpZXIgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkyODAyLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiVERGLUFwcGxpY2F0aW9uLUluc3RhbmNlLUlkZW50aWZpZXIiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIFRERi1EZXN0aW5hdGlvbi1Ib3N0ICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTA4OSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlRERi1EZXN0aW5hdGlvbi1Ib3N0IiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIERpYW1ldGVySWRlbnRpdHlfdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIFRERi1EZXN0aW5hdGlvbi1SZWFsbSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTEwOTAsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJUREYtRGVzdGluYXRpb24tUmVhbG0iLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgRGlhbWV0ZXJJZGVudGl0eV90eXBlLCBOVUxMKTsKKwl9OworCisJLyogVERGLUlQLUFkZHJlc3MgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMDkxLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiVERGLUlQLUFkZHJlc3MiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgQWRkcmVzc190eXBlLCBOVUxMKTsKKwl9OworCisJLyogUW9TLUNsYXNzLUlkZW50aWZpZXIgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMDI4LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiUW9TLUNsYXNzLUlkZW50aWZpZXIiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChRb1MtQ2xhc3MtSWRlbnRpZmllcikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIFFvUy1JbmZvcm1hdGlvbiAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTEwMTYsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJRb1MtSW5mb3JtYXRpb24iLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBRb1MtTmVnb3RpYXRpb24gKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMDI5LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiUW9TLU5lZ290aWF0aW9uIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoUW9TLU5lZ290aWF0aW9uKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogUW9TLVVwZ3JhZGUgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMDMwLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiUW9TLVVwZ3JhZGUiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChRb1MtVXBncmFkZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIFBTLXRvLUNTLVNlc3Npb24tQ29udGludWl0eSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTEwOTksCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJQUy10by1DUy1TZXNzaW9uLUNvbnRpbnVpdHkiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFBTLXRvLUNTLVNlc3Npb24tQ29udGludWl0eSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIFJlc291cmNlLUFsbG9jYXRpb24tTm90aWZpY2F0aW9uICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTA2MywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlJlc291cmNlLUFsbG9jYXRpb24tTm90aWZpY2F0aW9uIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFJlc291cmNlLUFsbG9jYXRpb24tTm90aWZpY2F0aW9uKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogUnVsZS1GYWlsdXJlLUNvZGUgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMDMxLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiUnVsZS1GYWlsdXJlLUNvZGUiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChSdWxlLUZhaWx1cmUtQ29kZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIFNlY3VyaXR5LVBhcmFtZXRlci1JbmRleCAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTEwNTYsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJTZWN1cml0eS1QYXJhbWV0ZXItSW5kZXgiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIFRGVC1GaWx0ZXIgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMDEyLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiVEZULUZpbHRlciIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIElQRmlsdGVyUnVsZV90eXBlLCBOVUxMKTsKKwl9OworCisJLyogVEZULVBhY2tldC1GaWx0ZXItSW5mb3JtYXRpb24gKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMDEzLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiVEZULVBhY2tldC1GaWx0ZXItSW5mb3JtYXRpb24iLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBUb1MtVHJhZmZpYy1DbGFzcyAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTEwMTQsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJUb1MtVHJhZmZpYy1DbGFzcyIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBUdW5uZWwtSGVhZGVyLUZpbHRlciAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTEwMzYsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJUdW5uZWwtSGVhZGVyLUZpbHRlciIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBJUEZpbHRlclJ1bGVfdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIFR1bm5lbC1IZWFkZXItTGVuZ3RoICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTAzNywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlR1bm5lbC1IZWFkZXItTGVuZ3RoIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIFR1bm5lbC1JbmZvcm1hdGlvbiAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTEwMzgsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJUdW5uZWwtSW5mb3JtYXRpb24iLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogUkFULVR5cGUgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMDMyLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiUkFULVR5cGUiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoUkFULVR5cGUpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQlDSEVDS19kaWN0X25ldyhESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCX07CisKKwkvKiBSZXZhbGlkYXRpb24tVGltZSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTEwNDIsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJSZXZhbGlkYXRpb24tVGltZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIFRpbWVfdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIFJ1bGUtQWN0aXZhdGlvbi1UaW1lICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTA0MywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlJ1bGUtQWN0aXZhdGlvbi1UaW1lIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgVGltZV90eXBlLCBOVUxMKTsKKwl9OworCisJLyogVURQLVNvdXJjZS1Qb3J0ICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMjgwNiwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlVEUC1Tb3VyY2UtUG9ydCIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBVRS1Mb2NhbC1JUC1BZGRyZXNzICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMjgwNSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlVFLUxvY2FsLUlQLUFkZHJlc3MiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgQWRkcmVzc190eXBlLCBOVUxMKTsKKwl9OworCisJLyogVXNhZ2UtTW9uaXRvcmluZy1JbmZvcm1hdGlvbiAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTEwNjcsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJVc2FnZS1Nb25pdG9yaW5nLUluZm9ybWF0aW9uIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIFJ1bGUtRGVhY3RpdmF0aW9uLVRpbWUgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMDQ0LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiUnVsZS1EZWFjdGl2YXRpb24tVGltZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIFRpbWVfdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIFVzYWdlLU1vbml0b3JpbmctTGV2ZWwgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMDY4LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiVXNhZ2UtTW9uaXRvcmluZy1MZXZlbCIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChVc2FnZS1Nb25pdG9yaW5nLUxldmVsKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogVXNhZ2UtTW9uaXRvcmluZy1SZXBvcnQgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMDY5LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiVXNhZ2UtTW9uaXRvcmluZy1SZXBvcnQiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoVXNhZ2UtTW9uaXRvcmluZy1SZXBvcnQpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQlDSEVDS19kaWN0X25ldyhESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCX07CisKKwkvKiBVc2FnZS1Nb25pdG9yaW5nLVN1cHBvcnQgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMDcwLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiVXNhZ2UtTW9uaXRvcmluZy1TdXBwb3J0IiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFVzYWdlLU1vbml0b3JpbmctU3VwcG9ydCkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIEd4eC1zcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCS8qIFFvUy1SdWxlLUluc3RhbGwgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMDUxLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiUW9TLVJ1bGUtSW5zdGFsbCIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIFFvUy1SdWxlLVJlbW92ZSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTEwNTIsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJRb1MtUnVsZS1SZW1vdmUiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBRb1MtUnVsZS1EZWZpbml0aW9uICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTA1MywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlFvUy1SdWxlLURlZmluaXRpb24iLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBRb1MtUnVsZS1OYW1lICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTA1NCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlFvUy1SdWxlLU5hbWUiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogUW9TLVJ1bGUtQmFzZS1OYW1lICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTA3NCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlFvUy1SdWxlLUJhc2UtTmFtZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCX07CisKKwkvKiBRb1MtUnVsZS1SZXBvcnQgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMDU1LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiUW9TLVJ1bGUtUmVwb3J0IiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogU2Vzc2lvbi1MaW5raW5nLUluZGljYXRvciAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTEwNjQsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJTZXNzaW9uLUxpbmtpbmctSW5kaWNhdG9yIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoU2Vzc2lvbi1MaW5raW5nLUluZGljYXRvcikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIFMxNS1zcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCS8qIENTLVNlcnZpY2UtUW9zLVJlcXVlc3QtSWRlbnRpZmllciAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTI4MDcsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJDUy1TZXJ2aWNlLVFvcy1SZXF1ZXN0LUlkZW50aWZpZXIiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogQ1MtU2VydmljZS1Rb1MtUmVxdWVzdC1PcGVyYXRpb24gKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkyODA4LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiQ1MtU2VydmljZS1Rb1MtUmVxdWVzdC1PcGVyYXRpb24iLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChDUy1TZXJ2aWNlLVFvUy1SZXF1ZXN0LU9wZXJhdGlvbikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIDNHUFAgMjkuMjE0LWI4MCAoMTEuOC4wIDIwMTMuMDMuMTUpICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCS8qIEFib3J0LUNhdXNlICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJNTAwLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiQWJvcnQtQ2F1c2UiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChBYm9ydC1DYXVzZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIEFjY2Vzcy1OZXR3b3JrLUNoYXJnaW5nLUFkZHJlc3MgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk1MDEsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJBY2Nlc3MtTmV0d29yay1DaGFyZ2luZy1BZGRyZXNzIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgQWRkcmVzc190eXBlLCBOVUxMKTsKKwl9OworCisJLyogQWNjZXNzLU5ldHdvcmstQ2hhcmdpbmctSWRlbnRpZmllciAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTUwMiwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkFjY2Vzcy1OZXR3b3JrLUNoYXJnaW5nLUlkZW50aWZpZXIiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBBY2Nlc3MtTmV0d29yay1DaGFyZ2luZy1JZGVudGlmaWVyLVZhbHVlICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJNTAzLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiQWNjZXNzLU5ldHdvcmstQ2hhcmdpbmctSWRlbnRpZmllci1WYWx1ZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBBY2NlcHRhYmxlLVNlcnZpY2UtSW5mbyAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTUyNiwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkFjY2VwdGFibGUtU2VydmljZS1JbmZvIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogQUYtQXBwbGljYXRpb24tSWRlbnRpZmllciAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTUwNCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkFGLUFwcGxpY2F0aW9uLUlkZW50aWZpZXIiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogQUYtQ2hhcmdpbmctSWRlbnRpZmllciAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTUwNSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkFGLUNoYXJnaW5nLUlkZW50aWZpZXIiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogQXBwbGljYXRpb24tU2VydmljZS1Qcm92aWRlci1JZGVudGl0eSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTUzMiwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkFwcGxpY2F0aW9uLVNlcnZpY2UtUHJvdmlkZXItSWRlbnRpdHkiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwl9OworCisJLyogQ29kZWMtRGF0YSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTUyNCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkNvZGVjLURhdGEiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogRmxvdy1EZXNjcmlwdGlvbiAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTUwNywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkZsb3ctRGVzY3JpcHRpb24iLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBJUEZpbHRlclJ1bGVfdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIEZsb3ctTnVtYmVyICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJNTA5LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiRmxvdy1OdW1iZXIiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBGbG93cyAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTUxMCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkZsb3dzIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogRmxvdy1TdGF0dXMgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk1MTEsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJGbG93LVN0YXR1cyIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKEZsb3ctU3RhdHVzKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogRmxvdy1Vc2FnZSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTUxMiwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkZsb3ctVXNhZ2UiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChGbG93LVVzYWdlKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogU2VydmljZS1VUk4gKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk1MjUsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJTZXJ2aWNlLVVSTiIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBTcGVjaWZpYy1BY3Rpb24gKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk1MTMsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJTcGVjaWZpYy1BY3Rpb24iLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChTcGVjaWZpYy1BY3Rpb24pIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQlDSEVDS19kaWN0X25ldyhESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCX07CisKKwkvKiBNYXgtUmVxdWVzdGVkLUJhbmR3aWR0aC1ETCAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTUxNSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIk1heC1SZXF1ZXN0ZWQtQmFuZHdpZHRoLURMIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogTWF4LVJlcXVlc3RlZC1CYW5kd2lkdGgtVUwgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk1MTYsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJNYXgtUmVxdWVzdGVkLUJhbmR3aWR0aC1VTCIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIE1lZGlhLUNvbXBvbmVudC1EZXNjcmlwdGlvbiAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTUxNywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIk1lZGlhLUNvbXBvbmVudC1EZXNjcmlwdGlvbiIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIE1lZGlhLUNvbXBvbmVudC1OdW1iZXIgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk1MTgsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJNZWRpYS1Db21wb25lbnQtTnVtYmVyIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogTWVkaWEtU3ViLUNvbXBvbmVudCAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTUxOSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIk1lZGlhLVN1Yi1Db21wb25lbnQiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBNZWRpYS1UeXBlICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJNTIwLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiTWVkaWEtVHlwZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKE1lZGlhLVR5cGUpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQlDSEVDS19kaWN0X25ldyhESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCX07CisKKwkvKiBNUFMtSWRlbnRpZmllciAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTUyOCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIk1QUy1JZGVudGlmaWVyIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBNaW4tUmVxdWVzdGVkLUJhbmR3aWR0aC1ETCAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTUzNCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIk1pbi1SZXF1ZXN0ZWQtQmFuZHdpZHRoLURMIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIE1pbi1SZXF1ZXN0ZWQtQmFuZHdpZHRoLVVMICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJNTM1LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiTWluLVJlcXVlc3RlZC1CYW5kd2lkdGgtVUwiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogUlItQmFuZHdpZHRoICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJNTIxLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiUlItQmFuZHdpZHRoIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogUlMtQmFuZHdpZHRoICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJNTIyLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiUlMtQmFuZHdpZHRoIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogU2VydmljZS1JbmZvLVN0YXR1cyAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTUyNywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlNlcnZpY2UtSW5mby1TdGF0dXMiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChTZXJ2aWNlLUluZm8tU3RhdHVzKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogU0lQLUZvcmtpbmctSW5kaWNhdGlvbiAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTUyMywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlNJUC1Gb3JraW5nLUluZGljYXRpb24iLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChTSVAtRm9ya2luZy1JbmRpY2F0aW9uKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogU3BvbnNvci1JZGVudGl0eSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTUzMSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlNwb25zb3ItSWRlbnRpdHkiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwl9OworCisJLyogU3BvbnNvcmVkLUNvbm5lY3Rpdml0eS1EYXRhICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJNTMwLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiU3BvbnNvcmVkLUNvbm5lY3Rpdml0eS1EYXRhIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIEFGLVNpZ25hbGxpbmctUHJvdG9jb2wgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk1MjksCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJBRi1TaWduYWxsaW5nLVByb3RvY29sIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKEFGLVNpZ25hbGxpbmctUHJvdG9jb2wpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQlDSEVDS19kaWN0X25ldyhESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCX07CisKKwkvKiBSZXF1aXJlZC1BY2Nlc3MtSW5mbyAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTUzNiwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlJlcXVpcmVkLUFjY2Vzcy1JbmZvIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFJlcXVpcmVkLUFjY2Vzcy1JbmZvKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogUngtUmVxdWVzdC1UeXBlICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJNTMzLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiUngtUmVxdWVzdC1UeXBlIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFJ4LVJlcXVlc3QtVHlwZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIElQLURvbWFpbi1JZCAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTUzNywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIklQLURvbWFpbi1JZCIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogM0dQUCAyOS4yMjktYjIwICgxMS4yLjAgMjAxMi4xMi4yMSkgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJLyogQXNzb2NpYXRlZC1JZGVudGl0aWVzICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJNjMyLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiQXNzb2NpYXRlZC1JZGVudGl0aWVzIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIEFzc29jaWF0ZWQtUmVnaXN0ZXJlZC1JZGVudGl0aWVzICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJNjQ3LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiQXNzb2NpYXRlZC1SZWdpc3RlcmVkLUlkZW50aXRpZXMiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogQ2FsbC1JRC1TSVAtSGVhZGVyICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJNjQzLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiQ2FsbC1JRC1TSVAtSGVhZGVyIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBDaGFyZ2luZy1JbmZvcm1hdGlvbiAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTYxOCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkNoYXJnaW5nLUluZm9ybWF0aW9uIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogQ29uZmlkZW50aWFsaXR5LUtleSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTYyNSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkNvbmZpZGVudGlhbGl0eS1LZXkiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogQ29udGFjdCAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTY0MSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkNvbnRhY3QiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIERlcmVnaXN0cmF0aW9uLVJlYXNvbiAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTYxNSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkRlcmVnaXN0cmF0aW9uLVJlYXNvbiIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIERpZ2VzdC1BbGdvcml0aG0gKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMTEsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJEaWdlc3QtQWxnb3JpdGhtIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIERpZ2VzdC1IQTEgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMjEsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJEaWdlc3QtSEExIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIERpZ2VzdC1Rb1AgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMTAsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJEaWdlc3QtUW9QIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIERpZ2VzdC1SZWFsbSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTEwNCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkRpZ2VzdC1SZWFsbSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCX07CisKKwkvKiBGZWF0dXJlLUxpc3QgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk2MzAsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJGZWF0dXJlLUxpc3QiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogRmVhdHVyZS1MaXN0LUlEICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJNjI5LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiRmVhdHVyZS1MaXN0LUlEIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIEZyb20tU0lQLUhlYWRlciAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTY0NCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkZyb20tU0lQLUhlYWRlciIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogSWRlbnRpdHktd2l0aC1FbWVyZ2VuY3ktUmVnaXN0cmF0aW9uICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJNjUxLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiSWRlbnRpdHktd2l0aC1FbWVyZ2VuY3ktUmVnaXN0cmF0aW9uIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIEludGVncml0eS1LZXkgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk2MjYsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJJbnRlZ3JpdHktS2V5IiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIExJQS1GbGFncyAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTY1MywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkxJQS1GbGFncyIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBMb29zZS1Sb3V0ZS1JbmRpY2F0aW9uICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJNjM4LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiTG9vc2UtUm91dGUtSW5kaWNhdGlvbiIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChMb29zZS1Sb3V0ZS1JbmRpY2F0aW9uKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogTWFuZGF0b3J5LUNhcGFiaWxpdHkgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk2MDQsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJNYW5kYXRvcnktQ2FwYWJpbGl0eSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIE11bHRpcGxlLVJlZ2lzdHJhdGlvbi1JbmRpY2F0aW9uICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJNjQ4LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiTXVsdGlwbGUtUmVnaXN0cmF0aW9uLUluZGljYXRpb24iLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoTXVsdGlwbGUtUmVnaXN0cmF0aW9uLUluZGljYXRpb24pIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQlDSEVDS19kaWN0X25ldyhESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCX07CisKKwkvKiBPcHRpb25hbC1DYXBhYmlsaXR5ICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJNjA1LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiT3B0aW9uYWwtQ2FwYWJpbGl0eSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIE9yaWdpbmF0aW5nLVJlcXVlc3QgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk2MzMsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJPcmlnaW5hdGluZy1SZXF1ZXN0IiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoT3JpZ2luYXRpbmctUmVxdWVzdCkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIFBhdGggKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk2NDAsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJQYXRoIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBQcmltYXJ5LUNoYXJnaW5nLUNvbGxlY3Rpb24tRnVuY3Rpb24tTmFtZSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTYyMSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlByaW1hcnktQ2hhcmdpbmctQ29sbGVjdGlvbi1GdW5jdGlvbi1OYW1lIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgRGlhbWV0ZXJVUklfdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIFByaW1hcnktRXZlbnQtQ2hhcmdpbmctRnVuY3Rpb24tTmFtZSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTYxOSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlByaW1hcnktRXZlbnQtQ2hhcmdpbmctRnVuY3Rpb24tTmFtZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIERpYW1ldGVyVVJJX3R5cGUsIE5VTEwpOworCX07CisKKwkvKiBQcml2aWxlZGdlZC1TZW5kZXItSW5kaWNhdGlvbiAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTY1MiwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlByaXZpbGVkZ2VkLVNlbmRlci1JbmRpY2F0aW9uIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFByaXZpbGVkZ2VkLVNlbmRlci1JbmRpY2F0aW9uKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogUHVibGljLUlkZW50aXR5ICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJNjAxLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiUHVibGljLUlkZW50aXR5IiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwl9OworCisJLyogUmVhc29uLUNvZGUgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk2MTYsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJSZWFzb24tQ29kZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFJlYXNvbi1Db2RlKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogUmVhc29uLUluZm8gKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk2MTcsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJSZWFzb24tSW5mbyIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIFJlY29yZC1Sb3V0ZSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTY0NiwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlJlY29yZC1Sb3V0ZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogUmVzdG9yYXRpb24tSW5mbyAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTY0OSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlJlc3RvcmF0aW9uLUluZm8iLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogU0NTQ0YtUmVzdG9yYXRpb24tSW5mbyAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTYzOSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlNDU0NGLVJlc3RvcmF0aW9uLUluZm8iLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogU0lQLUF1dGgtRGF0YS1JdGVtICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJNjEyLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiU0lQLUF1dGgtRGF0YS1JdGVtIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogU0lQLUF1dGhlbnRpY2F0ZSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTYwOSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlNJUC1BdXRoZW50aWNhdGUiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogU0lQLUF1dGhlbnRpY2F0aW9uLUNvbnRleHQgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk2MTEsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJTSVAtQXV0aGVudGljYXRpb24tQ29udGV4dCIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBTSVAtQXV0aGVudGljYXRpb24tU2NoZW1lICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJNjA4LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiU0lQLUF1dGhlbnRpY2F0aW9uLVNjaGVtZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIFNJUC1BdXRob3JpemF0aW9uICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJNjEwLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiU0lQLUF1dGhvcml6YXRpb24iLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogU0lQLURpZ2VzdC1BdXRoZW50aWNhdGUgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk2MzUsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJTSVAtRGlnZXN0LUF1dGhlbnRpY2F0ZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBTSVAtSXRlbS1OdW1iZXIgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk2MTMsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJTSVAtSXRlbS1OdW1iZXIiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBTSVAtTnVtYmVyLUF1dGgtSXRlbXMgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk2MDcsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJTSVAtTnVtYmVyLUF1dGgtSXRlbXMiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBTZWNvbmRhcnktQ2hhcmdpbmctQ29sbGVjdGlvbi1GdW5jdGlvbi1OYW1lICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJNjIyLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiU2Vjb25kYXJ5LUNoYXJnaW5nLUNvbGxlY3Rpb24tRnVuY3Rpb24tTmFtZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIERpYW1ldGVyVVJJX3R5cGUsIE5VTEwpOworCX07CisKKwkvKiBTZWNvbmRhcnktRXZlbnQtQ2hhcmdpbmctRnVuY3Rpb24tTmFtZSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTYyMCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlNlY29uZGFyeS1FdmVudC1DaGFyZ2luZy1GdW5jdGlvbi1OYW1lIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgRGlhbWV0ZXJVUklfdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIFNlcnZlci1Bc3NpZ25tZW50LVR5cGUgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk2MTQsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJTZXJ2ZXItQXNzaWdubWVudC1UeXBlIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoU2VydmVyLUFzc2lnbm1lbnQtVHlwZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIFNlcnZlci1DYXBhYmlsaXRpZXMgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk2MDMsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJTZXJ2ZXItQ2FwYWJpbGl0aWVzIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogU2VydmVyLU5hbWUgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk2MDIsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJTZXJ2ZXItTmFtZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIFNlc3Npb24tUHJpb3JpdHkgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk2NTAsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJTZXNzaW9uLVByaW9yaXR5IiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFNlc3Npb24tUHJpb3JpdHkpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQlDSEVDS19kaWN0X25ldyhESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCX07CisKKwkvKiBTdWJzY3JpcHRpb24tSW5mbyAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTY0MiwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlN1YnNjcmlwdGlvbi1JbmZvIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIFN1cHBvcnRlZC1BcHBsaWNhdGlvbnMgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk2MzEsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJTdXBwb3J0ZWQtQXBwbGljYXRpb25zIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIFN1cHBvcnRlZC1GZWF0dXJlcyAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTYyOCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlN1cHBvcnRlZC1GZWF0dXJlcyIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogVG8tU0lQLUhlYWRlciAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTY0NSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlRvLVNJUC1IZWFkZXIiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIFVBUi1GbGFncyAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTYzNywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlVBUi1GbGFncyIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBVc2VyLUF1dGhvcml6YXRpb24tVHlwZSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTYyMywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlVzZXItQXV0aG9yaXphdGlvbi1UeXBlIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoVXNlci1BdXRob3JpemF0aW9uLVR5cGUpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQlDSEVDS19kaWN0X25ldyhESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCX07CisKKwkvKiBVc2VyLURhdGEgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk2MDYsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJVc2VyLURhdGEiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogVXNlci1EYXRhLUFscmVhZHktQXZhaWxhYmxlICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJNjI0LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiVXNlci1EYXRhLUFscmVhZHktQXZhaWxhYmxlIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoVXNlci1EYXRhLUFscmVhZHktQXZhaWxhYmxlKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogVmlzaXRlZC1OZXR3b3JrLUlkZW50aWZpZXIgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk2MDAsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJWaXNpdGVkLU5ldHdvcmstSWRlbnRpZmllciIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBXaWxkY2FyZGVkLVB1YmxpYy1JZGVudGl0eSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTYzNCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIldpbGRjYXJkZWQtUHVibGljLUlkZW50aXR5IiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIDNHUFAgMzIuMjk5LWI2MCAoMTEuNi4wIDIwMTIuMTIuMjEpICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCS8qIEFGLUNvcnJlbGF0aW9uLUluZm9ybWF0aW9uICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTI3NiwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkFGLUNvcnJlbGF0aW9uLUluZm9ybWF0aW9uIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogQWNjZXNzLU5ldHdvcmstSW5mb3JtYXRpb24gKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMjYzLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiQWNjZXNzLU5ldHdvcmstSW5mb3JtYXRpb24iLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogQWNjZXNzLVRyYW5zZmVyLUluZm9ybWF0aW9uICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMjcwOSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkFjY2Vzcy1UcmFuc2Zlci1JbmZvcm1hdGlvbiIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIEFjY2Vzcy1UcmFuc2Zlci1UeXBlICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMjcxMCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkFjY2Vzcy1UcmFuc2Zlci1UeXBlIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoQWNjZXNzLVRyYW5zZmVyLVR5cGUpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQlDSEVDS19kaWN0X25ldyhESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCX07CisKKwkvKiBBY2NvdW50LUV4cGlyYXRpb24gKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkyMzA5LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiQWNjb3VudC1FeHBpcmF0aW9uIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgVGltZV90eXBlLCBOVUxMKTsKKwl9OworCisJLyogQWNjdW11bGF0ZWQtQ29zdCAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTIwNTIsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJBY2N1bXVsYXRlZC1Db3N0IiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogQWRhcHRhdGlvbnMgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMjE3LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiQWRhcHRhdGlvbnMiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChBZGFwdGF0aW9ucykiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIEFkZGl0aW9uYWwtQ29udGVudC1JbmZvcm1hdGlvbiAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTEyMDcsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJBZGRpdGlvbmFsLUNvbnRlbnQtSW5mb3JtYXRpb24iLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBBZGRpdGlvbmFsLVR5cGUtSW5mb3JtYXRpb24gKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMjA1LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiQWRkaXRpb25hbC1UeXBlLUluZm9ybWF0aW9uIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwl9OworCisJLyogQWRkcmVzcy1EYXRhICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJODk3LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiQWRkcmVzcy1EYXRhIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwl9OworCisJLyogQWRkcmVzcy1Eb21haW4gKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk4OTgsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJBZGRyZXNzLURvbWFpbiIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIEFkZHJlc3MtVHlwZSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTg5OSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkFkZHJlc3MtVHlwZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKEFkZHJlc3MtVHlwZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIEFkZHJlc3NlZS1UeXBlICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTIwOCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkFkZHJlc3NlZS1UeXBlIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoQWRkcmVzc2VlLVR5cGUpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQlDSEVDS19kaWN0X25ldyhESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCX07CisKKwkvKiBBbHRlcm5hdGUtQ2hhcmdlZC1QYXJ0eS1BZGRyZXNzICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTI4MCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkFsdGVybmF0ZS1DaGFyZ2VkLVBhcnR5LUFkZHJlc3MiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCX07CisKKwkvKiBBb0MtQ29zdC1JbmZvcm1hdGlvbiAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTIwNTMsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJBb0MtQ29zdC1JbmZvcm1hdGlvbiIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIEFvQy1Gb3JtYXQgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkyMzEwLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiQW9DLUZvcm1hdCIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKEFvQy1Gb3JtYXQpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQlDSEVDS19kaWN0X25ldyhESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCX07CisKKwkvKiBBb0MtSW5mb3JtYXRpb24gKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkyMDU0LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiQW9DLUluZm9ybWF0aW9uIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogQW9DLVJlcXVlc3QtVHlwZSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTIwNTUsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJBb0MtUmVxdWVzdC1UeXBlIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoQW9DLVJlcXVlc3QtVHlwZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIEFvQy1TZXJ2aWNlICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMjMxMSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkFvQy1TZXJ2aWNlIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogQW9DLVNlcnZpY2UtT2JsaWdhdG9yeS1UeXBlICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMjMxMiwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkFvQy1TZXJ2aWNlLU9ibGlnYXRvcnktVHlwZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKEFvQy1TZXJ2aWNlLU9ibGlnYXRvcnktVHlwZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIEFvQy1TZXJ2aWNlLVR5cGUgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkyMzEzLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiQW9DLVNlcnZpY2UtVHlwZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKEFvQy1TZXJ2aWNlLVR5cGUpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQlDSEVDS19kaWN0X25ldyhESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCX07CisKKwkvKiBBb0MtU3Vic2NyaXB0aW9uLUluZm9ybWF0aW9uICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMjMxNCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkFvQy1TdWJzY3JpcHRpb24tSW5mb3JtYXRpb24iLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBBcHBsaWMtSUQgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMjE4LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiQXBwbGljLUlEIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwl9OworCisJLyogQXBwbGljYXRpb24tU2VydmVyICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJODM2LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiQXBwbGljYXRpb24tU2VydmVyIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwl9OworCisJLyogQXBwbGljYXRpb24tU2VydmVyLUluZm9ybWF0aW9uICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJODUwLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiQXBwbGljYXRpb24tU2VydmVyLUluZm9ybWF0aW9uIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogQXBwbGljYXRpb24tUHJvdmlkZWQtQ2FsbGVkLVBhcnR5LUFkZHJlc3MgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk4MzcsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJBcHBsaWNhdGlvbi1Qcm92aWRlZC1DYWxsZWQtUGFydHktQWRkcmVzcyIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIEFzc29jaWF0ZWQtUGFydHktQWRkcmVzcyAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTIwMzUsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJBc3NvY2lhdGVkLVBhcnR5LUFkZHJlc3MiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCX07CisKKwkvKiBBc3NvY2lhdGVkLVVSSSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTg1NiwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkFzc29jaWF0ZWQtVVJJIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwl9OworCisJLyogQXV4LUFwcGxpYy1JbmZvICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTIxOSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkF1eC1BcHBsaWMtSW5mbyIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIEJhc2UtVGltZS1JbnRlcnZhbCAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTEyNjUsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJCYXNlLVRpbWUtSW50ZXJ2YWwiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBCZWFyZXItU2VydmljZSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTg1NCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkJlYXJlci1TZXJ2aWNlIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIENHLUFkZHJlc3MgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk4NDYsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJDRy1BZGRyZXNzIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgQWRkcmVzc190eXBlLCBOVUxMKTsKKwl9OworCisJLyogQ1NHLUFjY2Vzcy1Nb2RlICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMjMxNywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkNTRy1BY2Nlc3MtTW9kZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKENTRy1BY2Nlc3MtTW9kZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIENTRy1NZW1iZXJzaGlwLUluZGljYXRpb24gKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkyMzE4LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiQ1NHLU1lbWJlcnNoaXAtSW5kaWNhdGlvbiIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKENTRy1NZW1iZXJzaGlwLUluZGljYXRpb24pIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQlDSEVDS19kaWN0X25ldyhESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCX07CisKKwkvKiBDVUctSW5mb3JtYXRpb24gKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkyMzA0LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiQ1VHLUluZm9ybWF0aW9uIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIENhbGxlZC1Bc3NlcnRlZC1JZGVudGl0eSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTEyNTAsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJDYWxsZWQtQXNzZXJ0ZWQtSWRlbnRpdHkiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCX07CisKKwkvKiBDYWxsZWQtUGFydHktQWRkcmVzcyAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTgzMiwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkNhbGxlZC1QYXJ0eS1BZGRyZXNzIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwl9OworCisJLyogQ2FsbGluZy1QYXJ0eS1BZGRyZXNzICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJODMxLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiQ2FsbGluZy1QYXJ0eS1BZGRyZXNzIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwl9OworCisJLyogQ2Fycmllci1TZWxlY3QtUm91dGluZy1JbmZvcm1hdGlvbiAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTIwMjMsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJDYXJyaWVyLVNlbGVjdC1Sb3V0aW5nLUluZm9ybWF0aW9uIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwl9OworCisJLyogQ2F1c2UtQ29kZSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTg2MSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkNhdXNlLUNvZGUiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIENoYW5nZS1Db25kaXRpb24gKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkyMDM3LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiQ2hhbmdlLUNvbmRpdGlvbiIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogQ2hhbmdlLVRpbWUgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkyMDM4LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiQ2hhbmdlLVRpbWUiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBUaW1lX3R5cGUsIE5VTEwpOworCX07CisKKwkvKiBDaGFyZ2UtUmVhc29uLUNvZGUgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkyMTE4LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiQ2hhcmdlLVJlYXNvbi1Db2RlIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoQ2hhcmdlLVJlYXNvbi1Db2RlKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogQ2hhcmdlZC1QYXJ0eSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTg1NywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkNoYXJnZWQtUGFydHkiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCX07CisKKwkvKiBDaGFyZ2luZy1DaGFyYWN0ZXJpc3RpY3MtU2VsZWN0aW9uLU1vZGUgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkyMDY2LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiQ2hhcmdpbmctQ2hhcmFjdGVyaXN0aWNzLVNlbGVjdGlvbi1Nb2RlIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoQ2hhcmdpbmctQ2hhcmFjdGVyaXN0aWNzLVNlbGVjdGlvbi1Nb2RlKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogQ2xhc3MtSWRlbnRpZmllciAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTEyMTQsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJDbGFzcy1JZGVudGlmaWVyIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoQ2xhc3MtSWRlbnRpZmllcikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIENsaWVudC1BZGRyZXNzICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMjAxOCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkNsaWVudC1BZGRyZXNzIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgQWRkcmVzc190eXBlLCBOVUxMKTsKKwl9OworCisJLyogQ29udGVudC1DbGFzcyAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTEyMjAsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJDb250ZW50LUNsYXNzIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoQ29udGVudC1DbGFzcykiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIENvbnRlbnQtRGlzcG9zaXRpb24gKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk4MjgsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJDb250ZW50LURpc3Bvc2l0aW9uIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwl9OworCisJLyogQ29udGVudC1MZW5ndGggKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk4MjcsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJDb250ZW50LUxlbmd0aCIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIENvbnRlbnQtU2l6ZSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTEyMDYsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJDb250ZW50LVNpemUiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBDb250ZW50LVR5cGUgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk4MjYsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJDb250ZW50LVR5cGUiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCX07CisKKwkvKiBDdXJyZW50LVRhcmlmZiAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTIwNTYsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJDdXJyZW50LVRhcmlmZiIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIERSTS1Db250ZW50ICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTIyMSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkRSTS1Db250ZW50IiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoRFJNLUNvbnRlbnQpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQlDSEVDS19kaWN0X25ldyhESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCX07CisKKwkvKiBEYXRhLUNvZGluZy1TY2hlbWUgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkyMDAxLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiRGF0YS1Db2RpbmctU2NoZW1lIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBEZWZlcnJlZC1Mb2NhdGlvbi1FdmVudC1UeXBlICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTIzMCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkRlZmVycmVkLUxvY2F0aW9uLUV2ZW50LVR5cGUiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCX07CisKKwkvKiBEZWxpdmVyeS1SZXBvcnQtUmVxdWVzdGVkICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTIxNiwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkRlbGl2ZXJ5LVJlcG9ydC1SZXF1ZXN0ZWQiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChEZWxpdmVyeS1SZXBvcnQtUmVxdWVzdGVkKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogRGVzdGluYXRpb24tSW50ZXJmYWNlICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMjAwMiwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkRlc3RpbmF0aW9uLUludGVyZmFjZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIERpYWdub3N0aWNzICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMjAzOSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkRpYWdub3N0aWNzIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBEb21haW4tTmFtZSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTEyMDAsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJEb21haW4tTmFtZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIER5bmFtaWMtQWRkcmVzcy1GbGFnICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMjA1MSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkR5bmFtaWMtQWRkcmVzcy1GbGFnIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoRHluYW1pYy1BZGRyZXNzLUZsYWcpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQlDSEVDS19kaWN0X25ldyhESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCX07CisKKwkvKiBEeW5hbWljLUFkZHJlc3MtRmxhZy1FeHRlbnNpb24gKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkyMDY4LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiRHluYW1pYy1BZGRyZXNzLUZsYWctRXh0ZW5zaW9uIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoRHluYW1pYy1BZGRyZXNzLUZsYWctRXh0ZW5zaW9uKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogRWFybHktTWVkaWEtRGVzY3JpcHRpb24gKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMjcyLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiRWFybHktTWVkaWEtRGVzY3JpcHRpb24iLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBFbnZlbG9wZSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTEyNjYsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJFbnZlbG9wZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIEVudmVsb3BlLUVuZC1UaW1lICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTI2NywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkVudmVsb3BlLUVuZC1UaW1lIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgVGltZV90eXBlLCBOVUxMKTsKKwl9OworCisJLyogRW52ZWxvcGUtUmVwb3J0aW5nICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTI2OCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkVudmVsb3BlLVJlcG9ydGluZyIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKEVudmVsb3BlLVJlcG9ydGluZykiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIEVudmVsb3BlLVN0YXJ0LVRpbWUgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMjY5LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiRW52ZWxvcGUtU3RhcnQtVGltZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIFRpbWVfdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIEV2ZW50ICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJODI1LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiRXZlbnQiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCX07CisKKwkvKiBFdmVudC1DaGFyZ2luZy1UaW1lU3RhbXAgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMjU4LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiRXZlbnQtQ2hhcmdpbmctVGltZVN0YW1wIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgVGltZV90eXBlLCBOVUxMKTsKKwl9OworCisJLyogRXZlbnQtVHlwZSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTgyMywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkV2ZW50LVR5cGUiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBFeHBpcmVzICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJODg4LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiRXhwaXJlcyIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIEZpbGUtUmVwYWlyLVN1cHBvcnRlZCAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTEyMjQsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJGaWxlLVJlcGFpci1TdXBwb3J0ZWQiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChGaWxlLVJlcGFpci1TdXBwb3J0ZWQpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQlDSEVDS19kaWN0X25ldyhESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCX07CisKKwkvKiBGcm9tLUFkZHJlc3MgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkyNzA4LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiRnJvbS1BZGRyZXNzIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwl9OworCisJLyogR0dTTi1BZGRyZXNzICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJODQ3LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiR0dTTi1BZGRyZXNzIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgQWRkcmVzc190eXBlLCBOVUxMKTsKKwl9OworCisJLyogSU1TLUFwcGxpY2F0aW9uLVJlZmVyZW5jZS1JZGVudGlmaWVyICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMjYwMSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIklNUy1BcHBsaWNhdGlvbi1SZWZlcmVuY2UtSWRlbnRpZmllciIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIElNUy1DaGFyZ2luZy1JZGVudGlmaWVyICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJODQxLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiSU1TLUNoYXJnaW5nLUlkZW50aWZpZXIiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCX07CisKKwkvKiBJTVMtQ29tbXVuaWNhdGlvbi1TZXJ2aWNlLUlkZW50aWZpZXIgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMjgxLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiSU1TLUNvbW11bmljYXRpb24tU2VydmljZS1JZGVudGlmaWVyIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwl9OworCisJLyogSU1TLUVtZXJnZW5jeS1JbmRpY2F0b3IgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkyMzIyLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiSU1TLUVtZXJnZW5jeS1JbmRpY2F0b3IiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChJTVMtRW1lcmdlbmN5LUluZGljYXRvcikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIElNUy1JbmZvcm1hdGlvbiAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTg3NiwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIklNUy1JbmZvcm1hdGlvbiIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIElNU0ktVW5hdXRoZW50aWNhdGVkLUZsYWcgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkyMzA4LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiSU1TSS1VbmF1dGhlbnRpY2F0ZWQtRmxhZyIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKElNU0ktVW5hdXRoZW50aWNhdGVkLUZsYWcpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQlDSEVDS19kaWN0X25ldyhESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCX07CisKKwkvKiBJUC1SZWFsbS1EZWZhdWx0LUluZGljYXRpb24gKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkyNjAzLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiSVAtUmVhbG0tRGVmYXVsdC1JbmRpY2F0aW9uIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoSVAtUmVhbG0tRGVmYXVsdC1JbmRpY2F0aW9uKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogSW5jb21pbmctVHJ1bmstR3JvdXAtSWQgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk4NTIsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJJbmNvbWluZy1UcnVuay1Hcm91cC1JZCIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIEluY3JlbWVudGFsLUNvc3QgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkyMDYyLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiSW5jcmVtZW50YWwtQ29zdCIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIEluaXRpYWwtSU1TLUNoYXJnaW5nLUlkZW50aWZpZXIgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkyMzIxLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiSW5pdGlhbC1JTVMtQ2hhcmdpbmctSWRlbnRpZmllciIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIEludGVyLU9wZXJhdG9yLUlkZW50aWZpZXIgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk4MzgsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJJbnRlci1PcGVyYXRvci1JZGVudGlmaWVyIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogSW50ZXJmYWNlLUlkICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMjAwMywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkludGVyZmFjZS1JZCIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIEludGVyZmFjZS1Qb3J0ICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMjAwNCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkludGVyZmFjZS1Qb3J0IiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwl9OworCisJLyogSW50ZXJmYWNlLVRleHQgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkyMDA1LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiSW50ZXJmYWNlLVRleHQiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCX07CisKKwkvKiBJbnRlcmZhY2UtVHlwZSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTIwMDYsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJJbnRlcmZhY2UtVHlwZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKEludGVyZmFjZS1UeXBlKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogTENTLUFQTiAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTEyMzEsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJMQ1MtQVBOIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwl9OworCisJLyogTENTLUNsaWVudC1EaWFsZWQtQnktTVMgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMjMzLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiTENTLUNsaWVudC1EaWFsZWQtQnktTVMiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCX07CisKKwkvKiBMQ1MtQ2xpZW50LUV4dGVybmFsLUlEICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTIzNCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkxDUy1DbGllbnQtRXh0ZXJuYWwtSUQiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCX07CisKKwkvKiBMQ1MtQ2xpZW50LUlkICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTIzMiwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkxDUy1DbGllbnQtSWQiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBMQ1MtQ2xpZW50LU5hbWUgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMjM1LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiTENTLUNsaWVudC1OYW1lIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogTENTLUNsaWVudC1UeXBlICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTI0MSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkxDUy1DbGllbnQtVHlwZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKExDUy1DbGllbnQtVHlwZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIExDUy1EYXRhLUNvZGluZy1TY2hlbWUgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMjM2LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiTENTLURhdGEtQ29kaW5nLVNjaGVtZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIExDUy1Gb3JtYXQtSW5kaWNhdG9yICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTIzNywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkxDUy1Gb3JtYXQtSW5kaWNhdG9yIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoTENTLUZvcm1hdC1JbmRpY2F0b3IpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQlDSEVDS19kaWN0X25ldyhESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCX07CisKKwkvKiBMQ1MtSW5mb3JtYXRpb24gKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk4NzgsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJMQ1MtSW5mb3JtYXRpb24iLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBMQ1MtTmFtZS1TdHJpbmcgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMjM4LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiTENTLU5hbWUtU3RyaW5nIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwl9OworCisJLyogTENTLVJlcXVlc3Rvci1JZCAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTEyMzksCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJMQ1MtUmVxdWVzdG9yLUlkIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogTENTLVJlcXVlc3Rvci1JZC1TdHJpbmcgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMjQwLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiTENTLVJlcXVlc3Rvci1JZC1TdHJpbmciLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCX07CisKKwkvKiBMb2NhbC1HVy1JbnNlcnRlZC1JbmRpY2F0aW9uICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMjYwNCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkxvY2FsLUdXLUluc2VydGVkLUluZGljYXRpb24iLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChMb2NhbC1HVy1JbnNlcnRlZC1JbmRpY2F0aW9uKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogTG9jYWwtU2VxdWVuY2UtTnVtYmVyICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMjA2MywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkxvY2FsLVNlcXVlbmNlLU51bWJlciIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIExvY2F0aW9uLUVzdGltYXRlICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTI0MiwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkxvY2F0aW9uLUVzdGltYXRlIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIExvY2F0aW9uLUVzdGltYXRlLVR5cGUgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMjQzLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiTG9jYXRpb24tRXN0aW1hdGUtVHlwZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKExvY2F0aW9uLUVzdGltYXRlLVR5cGUpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQlDSEVDS19kaWN0X25ldyhESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCX07CisKKwkvKiBMb2NhdGlvbi1UeXBlICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTI0NCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkxvY2F0aW9uLVR5cGUiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBMb3ctQmFsYW5jZS1JbmRpY2F0aW9uICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMjAyMCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkxvdy1CYWxhbmNlLUluZGljYXRpb24iLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChMb3ctQmFsYW5jZS1JbmRpY2F0aW9uKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogTG93LVByaW9yaXR5LUluZGljYXRvciAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTI2MDIsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJMb3ctUHJpb3JpdHktSW5kaWNhdG9yIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoTG93LVByaW9yaXR5LUluZGljYXRvcikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIE1CTVNHVy1BZGRyZXNzICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMjMwNywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIk1CTVNHVy1BZGRyZXNzIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgQWRkcmVzc190eXBlLCBOVUxMKTsKKwl9OworCisJLyogTUJNUy1JbmZvcm1hdGlvbiAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTg4MCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIk1CTVMtSW5mb3JtYXRpb24iLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBNQk1TLVVzZXItU2VydmljZS1UeXBlICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTIyNSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIk1CTVMtVXNlci1TZXJ2aWNlLVR5cGUiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChNQk1TLVVzZXItU2VydmljZS1UeXBlKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogTU0tQ29udGVudC1UeXBlICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTIwMywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIk1NLUNvbnRlbnQtVHlwZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIE1NQm94LVN0b3JhZ2UtUmVxdWVzdGVkICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTI0OCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIk1NQm94LVN0b3JhZ2UtUmVxdWVzdGVkIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoTU1Cb3gtU3RvcmFnZS1SZXF1ZXN0ZWQpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQlDSEVDS19kaWN0X25ldyhESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCX07CisKKwkvKiBNTVMtSW5mb3JtYXRpb24gKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk4NzcsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJNTVMtSW5mb3JtYXRpb24iLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBNTVRlbC1JbmZvcm1hdGlvbiAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTIwMzAsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJNTVRlbC1JbmZvcm1hdGlvbiIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIE1NVGVsLVNTZXJ2aWNlLVR5cGUgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkyMDMxLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiTU1UZWwtU1NlcnZpY2UtVHlwZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIE1lZGlhLUluaXRpYXRvci1GbGFnICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJODgyLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiTWVkaWEtSW5pdGlhdG9yLUZsYWciLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChNZWRpYS1Jbml0aWF0b3ItRmxhZykiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIE1lZGlhLUluaXRpYXRvci1QYXJ0eSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTEyODgsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJNZWRpYS1Jbml0aWF0b3ItUGFydHkiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCX07CisKKwkvKiBNZXNzYWdlLUJvZHkgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk4ODksCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJNZXNzYWdlLUJvZHkiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBNZXNzYWdlLUNsYXNzICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTIxMywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIk1lc3NhZ2UtQ2xhc3MiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBNZXNzYWdlLUlEICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTIxMCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIk1lc3NhZ2UtSUQiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCX07CisKKwkvKiBNZXNzYWdlLVNpemUgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMjEyLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiTWVzc2FnZS1TaXplIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogTWVzc2FnZS1UeXBlICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTIxMSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIk1lc3NhZ2UtVHlwZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKE1lc3NhZ2UtVHlwZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIE5OSS1JbmZvcm1hdGlvbiAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTI3MDMsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJOTkktSW5mb3JtYXRpb24iLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBOTkktVHlwZSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTI3MDQsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJOTkktVHlwZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKE5OSS1UeXBlKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogTmVpZ2hib3VyLU5vZGUtQWRkcmVzcyAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTI3MDUsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJOZWlnaGJvdXItTm9kZS1BZGRyZXNzIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgQWRkcmVzc190eXBlLCBOVUxMKTsKKwl9OworCisJLyogTmV4dC1UYXJpZmYgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkyMDU3LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiTmV4dC1UYXJpZmYiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBOb2RlLUZ1bmN0aW9uYWxpdHkgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk4NjIsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJOb2RlLUZ1bmN0aW9uYWxpdHkiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChOb2RlLUZ1bmN0aW9uYWxpdHkpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQlDSEVDS19kaWN0X25ldyhESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCX07CisKKwkvKiBOb2RlLUlkICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMjA2NCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIk5vZGUtSWQiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCX07CisKKwkvKiBOdW1iZXItT2YtRGl2ZXJzaW9ucyAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTIwMzQsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJOdW1iZXItT2YtRGl2ZXJzaW9ucyIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIE51bWJlci1PZi1NZXNzYWdlcy1TZW50ICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMjAxOSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIk51bWJlci1PZi1NZXNzYWdlcy1TZW50IiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogTnVtYmVyLU9mLVBhcnRpY2lwYW50cyAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTg4NSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIk51bWJlci1PZi1QYXJ0aWNpcGFudHMiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBOdW1iZXItT2YtUmVjZWl2ZWQtVGFsay1CdXJzdHMgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMjgyLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiTnVtYmVyLU9mLVJlY2VpdmVkLVRhbGstQnVyc3RzIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogTnVtYmVyLU9mLVRhbGstQnVyc3RzICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTI4MywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIk51bWJlci1PZi1UYWxrLUJ1cnN0cyIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIE51bWJlci1Qb3J0YWJpbGl0eS1Sb3V0aW5nLUluZm9ybWF0aW9uICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMjAyNCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIk51bWJlci1Qb3J0YWJpbGl0eS1Sb3V0aW5nLUluZm9ybWF0aW9uIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwl9OworCisJLyogT2ZmbGluZS1DaGFyZ2luZyAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTEyNzgsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJPZmZsaW5lLUNoYXJnaW5nIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogT25saW5lLUNoYXJnaW5nLUZsYWcgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkyMzAzLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiT25saW5lLUNoYXJnaW5nLUZsYWciLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChPbmxpbmUtQ2hhcmdpbmctRmxhZykiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIE9yaWdpbmF0aW5nLUlPSSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTgzOSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIk9yaWdpbmF0aW5nLUlPSSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIE9yaWdpbmF0b3IgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk4NjQsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJPcmlnaW5hdG9yIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoT3JpZ2luYXRvcikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIE9yaWdpbmF0b3ItQWRkcmVzcyAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTg4NiwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIk9yaWdpbmF0b3ItQWRkcmVzcyIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIE9yaWdpbmF0b3ItSW50ZXJmYWNlICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMjAwOSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIk9yaWdpbmF0b3ItSW50ZXJmYWNlIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogT3JpZ2luYXRvci1SZWNlaXZlZC1BZGRyZXNzICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMjAyNywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIk9yaWdpbmF0b3ItUmVjZWl2ZWQtQWRkcmVzcyIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIE9yaWdpbmF0b3ItU0NDUC1BZGRyZXNzICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMjAwOCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIk9yaWdpbmF0b3ItU0NDUC1BZGRyZXNzIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgQWRkcmVzc190eXBlLCBOVUxMKTsKKwl9OworCisJLyogT3V0Z29pbmctU2Vzc2lvbi1JZCAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTIzMjAsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJPdXRnb2luZy1TZXNzaW9uLUlkIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwl9OworCisJLyogT3V0Z29pbmctVHJ1bmstR3JvdXAtSWQgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk4NTMsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJPdXRnb2luZy1UcnVuay1Hcm91cC1JZCIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIFBERy1BZGRyZXNzICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJODk1LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiUERHLUFkZHJlc3MiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBBZGRyZXNzX3R5cGUsIE5VTEwpOworCX07CisKKwkvKiBQREctQ2hhcmdpbmctSWQgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk4OTYsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJQREctQ2hhcmdpbmctSWQiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBQRE4tQ29ubmVjdGlvbi1DaGFyZ2luZy1JRCAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTIwNTAsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJQRE4tQ29ubmVjdGlvbi1DaGFyZ2luZy1JRCIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIFBEUC1BZGRyZXNzICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTIyNywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlBEUC1BZGRyZXNzIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgQWRkcmVzc190eXBlLCBOVUxMKTsKKwl9OworCisJLyogUERQLUFkZHJlc3MtUHJlZml4LUxlbmd0aCAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTI2MDYsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJQRFAtQWRkcmVzcy1QcmVmaXgtTGVuZ3RoIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogUERQLUNvbnRleHQtVHlwZSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTEyNDcsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJQRFAtQ29udGV4dC1UeXBlIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoUERQLUNvbnRleHQtVHlwZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIFBTLUFwcGVuZC1GcmVlLUZvcm1hdC1EYXRhICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJODY3LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiUFMtQXBwZW5kLUZyZWUtRm9ybWF0LURhdGEiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChQUy1BcHBlbmQtRnJlZS1Gb3JtYXQtRGF0YSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIFBTLUZyZWUtRm9ybWF0LURhdGEgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk4NjYsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJQUy1GcmVlLUZvcm1hdC1EYXRhIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIFBTLUZ1cm5pc2gtQ2hhcmdpbmctSW5mb3JtYXRpb24gKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk4NjUsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJQUy1GdXJuaXNoLUNoYXJnaW5nLUluZm9ybWF0aW9uIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogUFMtSW5mb3JtYXRpb24gKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk4NzQsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJQUy1JbmZvcm1hdGlvbiIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIFBhcnRpY2lwYW50LUFjY2Vzcy1Qcmlvcml0eSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTEyNTksCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJQYXJ0aWNpcGFudC1BY2Nlc3MtUHJpb3JpdHkiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChQYXJ0aWNpcGFudC1BY2Nlc3MtUHJpb3JpdHkpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQlDSEVDS19kaWN0X25ldyhESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCX07CisKKwkvKiBQYXJ0aWNpcGFudC1BY3Rpb24tVHlwZSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTIwNDksCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJQYXJ0aWNpcGFudC1BY3Rpb24tVHlwZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFBhcnRpY2lwYW50LUFjdGlvbi1UeXBlKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogUGFydGljaXBhbnQtR3JvdXAgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMjYwLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiUGFydGljaXBhbnQtR3JvdXAiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBQYXJ0aWNpcGFudHMtSW52b2x2ZWQgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk4ODcsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJQYXJ0aWNpcGFudHMtSW52b2x2ZWQiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCX07CisKKwkvKiBQb0MtQ2hhbmdlLUNvbmRpdGlvbiAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTEyNjEsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJQb0MtQ2hhbmdlLUNvbmRpdGlvbiIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFBvQy1DaGFuZ2UtQ29uZGl0aW9uKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogUG9DLUNoYW5nZS1UaW1lICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTI2MiwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlBvQy1DaGFuZ2UtVGltZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIFRpbWVfdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIFBvQy1Db250cm9sbGluZy1BZGRyZXNzICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJODU4LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiUG9DLUNvbnRyb2xsaW5nLUFkZHJlc3MiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCX07CisKKwkvKiBQb0MtRXZlbnQtVHlwZSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTIwMjUsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJQb0MtRXZlbnQtVHlwZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFBvQy1FdmVudC1UeXBlKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogUG9DLUdyb3VwLU5hbWUgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk4NTksCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJQb0MtR3JvdXAtTmFtZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIFBvQy1JbmZvcm1hdGlvbiAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTg3OSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlBvQy1JbmZvcm1hdGlvbiIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIFBvQy1TZXJ2ZXItUm9sZSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTg4MywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlBvQy1TZXJ2ZXItUm9sZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFBvQy1TZXJ2ZXItUm9sZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIFBvQy1TZXNzaW9uLUlkICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTIyOSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlBvQy1TZXNzaW9uLUlkIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwl9OworCisJLyogUG9DLVNlc3Npb24tSW5pdGlhdGlvbi10eXBlICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTI3NywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlBvQy1TZXNzaW9uLUluaXRpYXRpb24tdHlwZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFBvQy1TZXNzaW9uLUluaXRpYXRpb24tdHlwZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIFBvQy1TZXNzaW9uLVR5cGUgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk4ODQsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJQb0MtU2Vzc2lvbi1UeXBlIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoUG9DLVNlc3Npb24tVHlwZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIFBvQy1Vc2VyLVJvbGUgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMjUyLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiUG9DLVVzZXItUm9sZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIFBvQy1Vc2VyLVJvbGUtSURzICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTI1MywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlBvQy1Vc2VyLVJvbGUtSURzIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwl9OworCisJLyogUG9DLVVzZXItUm9sZS1pbmZvLVVuaXRzICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTI1NCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlBvQy1Vc2VyLVJvbGUtaW5mby1Vbml0cyIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFBvQy1Vc2VyLVJvbGUtaW5mby1Vbml0cykiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIFBvc2l0aW9uaW5nLURhdGEgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMjQ1LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiUG9zaXRpb25pbmctRGF0YSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIFByZWZlcnJlZC1Bb0MtQ3VycmVuY3kgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkyMzE1LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiUHJlZmVycmVkLUFvQy1DdXJyZW5jeSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIFByaW9yaXR5ICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTIwOSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlByaW9yaXR5IiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoUHJpb3JpdHkpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQlDSEVDS19kaWN0X25ldyhESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCX07CisKKwkvKiBRdW90YS1Db25zdW1wdGlvbi1UaW1lICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJODgxLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiUXVvdGEtQ29uc3VtcHRpb24tVGltZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIFF1b3RhLUhvbGRpbmctVGltZSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTg3MSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlF1b3RhLUhvbGRpbmctVGltZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIFJhdGUtRWxlbWVudCAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTIwNTgsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJSYXRlLUVsZW1lbnQiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBSZWFkLVJlcGx5LVJlcG9ydC1SZXF1ZXN0ZWQgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMjIyLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiUmVhZC1SZXBseS1SZXBvcnQtUmVxdWVzdGVkIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoUmVhZC1SZXBseS1SZXBvcnQtUmVxdWVzdGVkKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogUmVhbC1UaW1lLVRhcmlmZi1JbmZvcm1hdGlvbiAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTIzMDUsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJSZWFsLVRpbWUtVGFyaWZmLUluZm9ybWF0aW9uIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogUmVjZWl2ZWQtVGFsay1CdXJzdC1UaW1lICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTI4NCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlJlY2VpdmVkLVRhbGstQnVyc3QtVGltZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIFJlY2VpdmVkLVRhbGstQnVyc3QtVm9sdW1lICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTI4NSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlJlY2VpdmVkLVRhbGstQnVyc3QtVm9sdW1lIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogUmVjaXBpZW50LUFkZHJlc3MgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMjAxLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiUmVjaXBpZW50LUFkZHJlc3MiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBSZWNpcGllbnQtSW5mbyAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTIwMjYsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJSZWNpcGllbnQtSW5mbyIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIFJlY2lwaWVudC1SZWNlaXZlZC1BZGRyZXNzICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMjAyOCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlJlY2lwaWVudC1SZWNlaXZlZC1BZGRyZXNzIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogUmVjaXBpZW50LVNDQ1AtQWRkcmVzcyAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTIwMTAsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJSZWNpcGllbnQtU0NDUC1BZGRyZXNzIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgQWRkcmVzc190eXBlLCBOVUxMKTsKKwl9OworCisJLyogUmVmdW5kLUluZm9ybWF0aW9uICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMjAyMiwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlJlZnVuZC1JbmZvcm1hdGlvbiIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBSZWxhdGlvbnNoaXAtTW9kZSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTI3MDYsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJSZWxhdGlvbnNoaXAtTW9kZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFJlbGF0aW9uc2hpcC1Nb2RlKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogUmVtYWluaW5nLUJhbGFuY2UgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkyMDIxLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiUmVtYWluaW5nLUJhbGFuY2UiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBSZXBseS1BcHBsaWMtSUQgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMjIzLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiUmVwbHktQXBwbGljLUlEIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwl9OworCisJLyogUmVwbHktUGF0aC1SZXF1ZXN0ZWQgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkyMDExLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiUmVwbHktUGF0aC1SZXF1ZXN0ZWQiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChSZXBseS1QYXRoLVJlcXVlc3RlZCkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIFJlcG9ydGluZy1SZWFzb24gKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk4NzIsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJSZXBvcnRpbmctUmVhc29uIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoUmVwb3J0aW5nLVJlYXNvbikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIFJlcXVlc3RlZC1QYXJ0eS1BZGRyZXNzICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTI1MSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlJlcXVlc3RlZC1QYXJ0eS1BZGRyZXNzIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwl9OworCisJLyogUm9sZS1PZi1Ob2RlICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJODI5LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiUm9sZS1PZi1Ob2RlIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoUm9sZS1PZi1Ob2RlKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogU0RQLUFuc3dlci1UaW1lc3RhbXAgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMjc1LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiU0RQLUFuc3dlci1UaW1lc3RhbXAiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBUaW1lX3R5cGUsIE5VTEwpOworCX07CisKKwkvKiBTRFAtTWVkaWEtQ29tcG9uZW50ICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJODQzLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiU0RQLU1lZGlhLUNvbXBvbmVudCIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIFNEUC1NZWRpYS1EZXNjcmlwdGlvbiAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTg0NSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlNEUC1NZWRpYS1EZXNjcmlwdGlvbiIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIFNEUC1NZWRpYS1OYW1lICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJODQ0LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiU0RQLU1lZGlhLU5hbWUiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCX07CisKKwkvKiBTRFAtT2ZmZXItVGltZXN0YW1wICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTI3NCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlNEUC1PZmZlci1UaW1lc3RhbXAiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBUaW1lX3R5cGUsIE5VTEwpOworCX07CisKKwkvKiBTRFAtU2Vzc2lvbi1EZXNjcmlwdGlvbiAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTg0MiwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlNEUC1TZXNzaW9uLURlc2NyaXB0aW9uIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwl9OworCisJLyogU0RQLVRpbWVTdGFtcHMgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMjczLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiU0RQLVRpbWVTdGFtcHMiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBTRFAtVHlwZSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTIwMzYsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJTRFAtVHlwZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFNEUC1UeXBlKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogU0dTTi1BZGRyZXNzICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTIyOCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlNHU04tQWRkcmVzcyIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIEFkZHJlc3NfdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIFNHVy1BZGRyZXNzICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMjA2NywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlNHVy1BZGRyZXNzIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgQWRkcmVzc190eXBlLCBOVUxMKTsKKwl9OworCisJLyogU0dXLUNoYW5nZSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTIwNjUsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJTR1ctQ2hhbmdlIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoU0dXLUNoYW5nZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIFNJUC1NZXRob2QgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk4MjQsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJTSVAtTWV0aG9kIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwl9OworCisJLyogU0lQLVJlcXVlc3QtVGltZXN0YW1wICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJODM0LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiU0lQLVJlcXVlc3QtVGltZXN0YW1wIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgVGltZV90eXBlLCBOVUxMKTsKKwl9OworCisJLyogU0lQLVJlcXVlc3QtVGltZXN0YW1wLUZyYWN0aW9uICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMjMwMSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlNJUC1SZXF1ZXN0LVRpbWVzdGFtcC1GcmFjdGlvbiIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIFNJUC1SZXNwb25zZS1UaW1lc3RhbXAgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk4MzUsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJTSVAtUmVzcG9uc2UtVGltZXN0YW1wIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgVGltZV90eXBlLCBOVUxMKTsKKwl9OworCisJLyogU0lQLVJlc3BvbnNlLVRpbWVzdGFtcC1GcmFjdGlvbiAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTIzMDIsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJTSVAtUmVzcG9uc2UtVGltZXN0YW1wLUZyYWN0aW9uIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogU00tRGlzY2hhcmdlLVRpbWUgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkyMDEyLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiU00tRGlzY2hhcmdlLVRpbWUiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBUaW1lX3R5cGUsIE5VTEwpOworCX07CisKKwkvKiBTTS1NZXNzYWdlLVR5cGUgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkyMDA3LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiU00tTWVzc2FnZS1UeXBlIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoU00tTWVzc2FnZS1UeXBlKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogU00tUHJvdG9jb2wtSUQgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkyMDEzLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiU00tUHJvdG9jb2wtSUQiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogU00tU2VydmljZS1UeXBlICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMjAyOSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlNNLVNlcnZpY2UtVHlwZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFNNLVNlcnZpY2UtVHlwZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIFNNLVN0YXR1cyAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTIwMTQsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJTTS1TdGF0dXMiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogU00tVXNlci1EYXRhLUhlYWRlciAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTIwMTUsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJTTS1Vc2VyLURhdGEtSGVhZGVyIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIFNNUy1JbmZvcm1hdGlvbiAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTIwMDAsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJTTVMtSW5mb3JtYXRpb24iLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBTTVMtTm9kZSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTIwMTYsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJTTVMtTm9kZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFNNUy1Ob2RlKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogU01TQy1BZGRyZXNzICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMjAxNywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlNNU0MtQWRkcmVzcyIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIEFkZHJlc3NfdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIFNjYWxlLUZhY3RvciAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTIwNTksCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJTY2FsZS1GYWN0b3IiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBTZXJ2ZWQtUGFydHktSVAtQWRkcmVzcyAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTg0OCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlNlcnZlZC1QYXJ0eS1JUC1BZGRyZXNzIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgQWRkcmVzc190eXBlLCBOVUxMKTsKKwl9OworCisJLyogU2VydmljZS1EYXRhLUNvbnRhaW5lciAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTIwNDAsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJTZXJ2aWNlLURhdGEtQ29udGFpbmVyIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogU2VydmljZS1JZCAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTg1NSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlNlcnZpY2UtSWQiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCX07CisKKwkvKiBTZXJ2aWNlLUluZm9ybWF0aW9uICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJODczLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiU2VydmljZS1JbmZvcm1hdGlvbiIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIFNlcnZpY2UtTW9kZSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTIwMzIsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJTZXJ2aWNlLU1vZGUiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBTZXJ2aWNlLVNwZWNpZmljLURhdGEgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk4NjMsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJTZXJ2aWNlLVNwZWNpZmljLURhdGEiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCX07CisKKwkvKiBTZXJ2aWNlLVNwZWNpZmljLUluZm8gKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMjQ5LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiU2VydmljZS1TcGVjaWZpYy1JbmZvIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogU2VydmljZS1TcGVjaWZpYy1UeXBlICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTI1NywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlNlcnZpY2UtU3BlY2lmaWMtVHlwZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIFNlcnZpbmctTm9kZS1UeXBlICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMjA0NywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlNlcnZpbmctTm9kZS1UeXBlIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoU2VydmluZy1Ob2RlLVR5cGUpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQlDSEVDS19kaWN0X25ldyhESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCX07CisKKwkvKiBTZXNzaW9uLURpcmVjdGlvbiAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTI3MDcsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJTZXNzaW9uLURpcmVjdGlvbiIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFNlc3Npb24tRGlyZWN0aW9uKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogU3RhcnQtVGltZSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTIwNDEsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJTdGFydC1UaW1lIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgVGltZV90eXBlLCBOVUxMKTsKKwl9OworCisJLyogU3RhdHVzICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMjcwMiwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlN0YXR1cyIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFN0YXR1cykiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIFN0b3AtVGltZSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTIwNDIsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJTdG9wLVRpbWUiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBUaW1lX3R5cGUsIE5VTEwpOworCX07CisKKwkvKiBTdWJtaXNzaW9uLVRpbWUgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMjAyLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiU3VibWlzc2lvbi1UaW1lIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgVGltZV90eXBlLCBOVUxMKTsKKwl9OworCisJLyogU3Vic2NyaWJlci1Sb2xlICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMjAzMywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlN1YnNjcmliZXItUm9sZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFN1YnNjcmliZXItUm9sZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIFN1cHBsZW1lbnRhcnktU2VydmljZSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTIwNDgsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJTdXBwbGVtZW50YXJ5LVNlcnZpY2UiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBUYWxrLUJ1cnN0LUV4Y2hhbmdlICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTI1NSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlRhbGstQnVyc3QtRXhjaGFuZ2UiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBUYWxrLUJ1cnN0LVRpbWUgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMjg2LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiVGFsay1CdXJzdC1UaW1lIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogVGFsay1CdXJzdC1Wb2x1bWUgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMjg3LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiVGFsay1CdXJzdC1Wb2x1bWUiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBUYXJpZmYtSW5mb3JtYXRpb24gKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkyMDYwLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiVGFyaWZmLUluZm9ybWF0aW9uIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogVGFyaWZmLVhNTCAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTIzMDYsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJUYXJpZmYtWE1MIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwl9OworCisJLyogVGVybWluYXRpbmctSU9JICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJODQwLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiVGVybWluYXRpbmctSU9JIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwl9OworCisJLyogVGltZS1GaXJzdC1Vc2FnZSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTIwNDMsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJUaW1lLUZpcnN0LVVzYWdlIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgVGltZV90eXBlLCBOVUxMKTsKKwl9OworCisJLyogVGltZS1MYXN0LVVzYWdlICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMjA0NCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlRpbWUtTGFzdC1Vc2FnZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIFRpbWVfdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIFRpbWUtUXVvdGEtTWVjaGFuaXNtICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTI3MCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlRpbWUtUXVvdGEtTWVjaGFuaXNtIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogVGltZS1RdW90YS1UaHJlc2hvbGQgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk4NjgsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJUaW1lLVF1b3RhLVRocmVzaG9sZCIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIFRpbWUtUXVvdGEtVHlwZSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTEyNzEsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJUaW1lLVF1b3RhLVR5cGUiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChUaW1lLVF1b3RhLVR5cGUpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQlDSEVDS19kaWN0X25ldyhESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCX07CisKKwkvKiBUaW1lLVN0YW1wcyAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTgzMywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlRpbWUtU3RhbXBzIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogVGltZS1Vc2FnZSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTIwNDUsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJUaW1lLVVzYWdlIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogVG9rZW4tVGV4dCAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTEyMTUsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJUb2tlbi1UZXh0IiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwl9OworCisJLyogVHJhZmZpYy1EYXRhLVZvbHVtZXMgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkyMDQ2LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiVHJhZmZpYy1EYXRhLVZvbHVtZXMiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBUcmFuc2NvZGVyLUluc2VydGVkLUluZGljYXRpb24gKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkyNjA1LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiVHJhbnNjb2Rlci1JbnNlcnRlZC1JbmRpY2F0aW9uIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoVHJhbnNjb2Rlci1JbnNlcnRlZC1JbmRpY2F0aW9uKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogVHJhbnNpdC1JT0ktTGlzdCAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTI3MDEsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJUcmFuc2l0LUlPSS1MaXN0IiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwl9OworCisJLyogVHJpZ2dlciAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTEyNjQsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJUcmlnZ2VyIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogVHJpZ2dlci1UeXBlICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJODcwLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiVHJpZ2dlci1UeXBlIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoVHJpZ2dlci1UeXBlKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogVHJ1bmstR3JvdXAtSWQgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk4NTEsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJUcnVuay1Hcm91cC1JZCIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIFR5cGUtTnVtYmVyICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTIwNCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlR5cGUtTnVtYmVyIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoVHlwZS1OdW1iZXIpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQlDSEVDS19kaWN0X25ldyhESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCX07CisKKwkvKiBVbml0LUNvc3QgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkyMDYxLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiVW5pdC1Db3N0IiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogVW5pdC1RdW90YS1UaHJlc2hvbGQgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMjI2LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiVW5pdC1RdW90YS1UaHJlc2hvbGQiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBVc2VyLUNTRy1JbmZvcm1hdGlvbiAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTIzMTksCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJVc2VyLUNTRy1JbmZvcm1hdGlvbiIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIFVzZXItUGFydGljaXBhdGluZy1UeXBlICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTI3OSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlVzZXItUGFydGljaXBhdGluZy1UeXBlIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoVXNlci1QYXJ0aWNpcGF0aW5nLVR5cGUpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQlDSEVDS19kaWN0X25ldyhESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCX07CisKKwkvKiBVc2VyLVNlc3Npb24tSWQgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk4MzAsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJVc2VyLVNlc3Npb24tSWQiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCX07CisKKwkvKiBWb2x1bWUtUXVvdGEtVGhyZXNob2xkICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJODY5LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiVm9sdW1lLVF1b3RhLVRocmVzaG9sZCIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIFdBRy1BZGRyZXNzICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJODkwLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiV0FHLUFkZHJlc3MiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBBZGRyZXNzX3R5cGUsIE5VTEwpOworCX07CisKKwkvKiBXQUctUExNTi1JZCAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTg5MSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIldBRy1QTE1OLUlkIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIFdMQU4tSW5mb3JtYXRpb24gKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk4NzUsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJXTEFOLUluZm9ybWF0aW9uIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogV0xBTi1SYWRpby1Db250YWluZXIgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk4OTIsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJXTEFOLVJhZGlvLUNvbnRhaW5lciIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIFdMQU4tU2Vzc2lvbi1JZCAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTEyNDYsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJXTEFOLVNlc3Npb24tSWQiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCX07CisKKwkvKiBXTEFOLVRlY2hub2xvZ3kgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk4OTMsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJXTEFOLVRlY2hub2xvZ3kiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBXTEFOLVVFLUxvY2FsLUlQQWRkcmVzcyAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTg5NCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIldMQU4tVUUtTG9jYWwtSVBBZGRyZXNzIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgQWRkcmVzc190eXBlLCBOVUxMKTsKKwl9OworCisJLyogM0dQUCAyOS4yNzItYzAwICgxMi4wLjAgMjAxMy4wMy4xMykgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJLyogU3Vic2NyaXB0aW9uLURhdGEgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNDAwLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiU3Vic2NyaXB0aW9uLURhdGEiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBUZXJtaW5hbC1JbmZvcm1hdGlvbiAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTE0MDEsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJUZXJtaW5hbC1JbmZvcm1hdGlvbiIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIElNRUkgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNDAyLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiSU1FSSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIFNvZnR3YXJlLVZlcnNpb24gKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNDAzLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiU29mdHdhcmUtVmVyc2lvbiIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIFFvUy1TdWJzY3JpYmVkICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTQwNCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlFvUy1TdWJzY3JpYmVkIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIFVMUi1GbGFncyAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTE0MDUsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJVTFItRmxhZ3MiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBVTEEtRmxhZ3MgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNDA2LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiVUxBLUZsYWdzIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogVmlzaXRlZC1QTE1OLUlkICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTQwNywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlZpc2l0ZWQtUExNTi1JZCIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBSZXF1ZXN0ZWQtRVVUUkFOLUF1dGhlbnRpY2F0aW9uLUluZm8gKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNDA4LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiUmVxdWVzdGVkLUVVVFJBTi1BdXRoZW50aWNhdGlvbi1JbmZvIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogUmVxdWVzdGVkLVVUUkFOLUdFUkFOLUF1dGhlbnRpY2F0aW9uLUluZm8gKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNDA5LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiUmVxdWVzdGVkLVVUUkFOLUdFUkFOLUF1dGhlbnRpY2F0aW9uLUluZm8iLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBOdW1iZXItT2YtUmVxdWVzdGVkLVZlY3RvcnMgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNDEwLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiTnVtYmVyLU9mLVJlcXVlc3RlZC1WZWN0b3JzIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogUmUtU3luY2hyb25pemF0aW9uLUluZm8gKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNDExLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiUmUtU3luY2hyb25pemF0aW9uLUluZm8iLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogSW1tZWRpYXRlLVJlc3BvbnNlLVByZWZlcnJlZCAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTE0MTIsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJJbW1lZGlhdGUtUmVzcG9uc2UtUHJlZmVycmVkIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogQXV0aGVudGljYXRpb24tSW5mbyAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTE0MTMsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJBdXRoZW50aWNhdGlvbi1JbmZvIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogRS1VVFJBTi1WZWN0b3IgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNDE0LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiRS1VVFJBTi1WZWN0b3IiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBVVFJBTi1WZWN0b3IgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNDE1LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiVVRSQU4tVmVjdG9yIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogR0VSQU4tVmVjdG9yICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTQxNiwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkdFUkFOLVZlY3RvciIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIE5ldHdvcmstQWNjZXNzLU1vZGUgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNDE3LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiTmV0d29yay1BY2Nlc3MtTW9kZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKE5ldHdvcmstQWNjZXNzLU1vZGUpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQlDSEVDS19kaWN0X25ldyhESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCX07CisKKwkvKiBIUExNTi1PREIgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNDE4LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiSFBMTU4tT0RCIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogSXRlbS1OdW1iZXIgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNDE5LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiSXRlbS1OdW1iZXIiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBDYW5jZWxsYXRpb24tVHlwZSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTE0MjAsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJDYW5jZWxsYXRpb24tVHlwZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKENhbmNlbGxhdGlvbi1UeXBlKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogRFNSLUZsYWdzICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTQyMSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkRTUi1GbGFncyIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIERTQS1GbGFncyAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTE0MjIsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJEU0EtRmxhZ3MiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBDb250ZXh0LUlkZW50aWZpZXIgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNDIzLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiQ29udGV4dC1JZGVudGlmaWVyIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogU3Vic2NyaWJlci1TdGF0dXMgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNDI0LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiU3Vic2NyaWJlci1TdGF0dXMiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChTdWJzY3JpYmVyLVN0YXR1cykiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIE9wZXJhdG9yLURldGVybWluZWQtQmFycmluZyAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTE0MjUsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJPcGVyYXRvci1EZXRlcm1pbmVkLUJhcnJpbmciLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBBY2Nlc3MtUmVzdHJpY3Rpb24tRGF0YSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTE0MjYsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJBY2Nlc3MtUmVzdHJpY3Rpb24tRGF0YSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIEFQTi1PSS1SZXBsYWNlbWVudCAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTE0MjcsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJBUE4tT0ktUmVwbGFjZW1lbnQiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCX07CisKKwkvKiBBbGwtQVBOLUNvbmZpZ3VyYXRpb25zLUluY2x1ZGVkLUluZGljYXRvciAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTE0MjgsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJBbGwtQVBOLUNvbmZpZ3VyYXRpb25zLUluY2x1ZGVkLUluZGljYXRvciIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKEFsbC1BUE4tQ29uZmlndXJhdGlvbnMtSW5jbHVkZWQtSW5kaWNhdG9yKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogQVBOLUNvbmZpZ3VyYXRpb24tUHJvZmlsZSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTE0MjksCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJBUE4tQ29uZmlndXJhdGlvbi1Qcm9maWxlIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogQVBOLUNvbmZpZ3VyYXRpb24gKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNDMwLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiQVBOLUNvbmZpZ3VyYXRpb24iLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBFUFMtU3Vic2NyaWJlZC1Rb1MtUHJvZmlsZSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTE0MzEsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJFUFMtU3Vic2NyaWJlZC1Rb1MtUHJvZmlsZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIFZQTE1OLUR5bmFtaWMtQWRkcmVzcy1BbGxvd2VkICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTQzMiwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlZQTE1OLUR5bmFtaWMtQWRkcmVzcy1BbGxvd2VkIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoVlBMTU4tRHluYW1pYy1BZGRyZXNzLUFsbG93ZWQpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQlDSEVDS19kaWN0X25ldyhESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCX07CisKKwkvKiBTVE4tU1IgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNDMzLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiU1ROLVNSIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIEFsZXJ0LVJlYXNvbiAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTE0MzQsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJBbGVydC1SZWFzb24iLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChBbGVydC1SZWFzb24pIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQlDSEVDS19kaWN0X25ldyhESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCX07CisKKwkvKiBBTUJSICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTQzNSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkFNQlIiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBDU0ctU3Vic2NyaXB0aW9uLURhdGEgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNDM2LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiQ1NHLVN1YnNjcmlwdGlvbi1EYXRhIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogQ1NHLUlkICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTQzNywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkNTRy1JZCIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIFBETi1HVy1BbGxvY2F0aW9uLVR5cGUgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNDM4LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiUEROLUdXLUFsbG9jYXRpb24tVHlwZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFBETi1HVy1BbGxvY2F0aW9uLVR5cGUpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQlDSEVDS19kaWN0X25ldyhESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCX07CisKKwkvKiBFeHBpcmF0aW9uLURhdGUgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNDM5LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiRXhwaXJhdGlvbi1EYXRlIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgVGltZV90eXBlLCBOVUxMKTsKKwl9OworCisJLyogUkFULUZyZXF1ZW5jeS1TZWxlY3Rpb24tUHJpb3JpdHktSUQgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNDQwLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiUkFULUZyZXF1ZW5jeS1TZWxlY3Rpb24tUHJpb3JpdHktSUQiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBJREEtRmxhZ3MgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNDQxLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiSURBLUZsYWdzIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogUFVBLUZsYWdzICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTQ0MiwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlBVQS1GbGFncyIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIE5PUi1GbGFncyAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTE0NDMsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJOT1ItRmxhZ3MiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBVc2VyLUlkICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTQ0NCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlVzZXItSWQiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwl9OworCisJLyogRXF1aXBtZW50LVN0YXR1cyAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTE0NDUsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJFcXVpcG1lbnQtU3RhdHVzIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoRXF1aXBtZW50LVN0YXR1cykiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIFJlZ2lvbmFsLVN1YnNjcmlwdGlvbi1ab25lLUNvZGUgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNDQ2LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiUmVnaW9uYWwtU3Vic2NyaXB0aW9uLVpvbmUtQ29kZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBSQU5EICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTQ0NywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlJBTkQiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogWFJFUyAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTE0NDgsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJYUkVTIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIEFVVE4gKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNDQ5LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiQVVUTiIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBLQVNNRSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTE0NTAsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJLQVNNRSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBUcmFjZS1Db2xsZWN0aW9uLUVudGl0eSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTE0NTIsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJUcmFjZS1Db2xsZWN0aW9uLUVudGl0eSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIEFkZHJlc3NfdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIEtjICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTQ1MywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIktjIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIFNSRVMgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNDU0LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiU1JFUyIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBQRE4tVHlwZSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTE0NTYsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJQRE4tVHlwZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFBETi1UeXBlKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogUm9hbWluZy1SZXN0cmljdGVkLUR1ZS1Uby1VbnN1cHBvcnRlZC1GZWF0dXJlICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTQ1NywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlJvYW1pbmctUmVzdHJpY3RlZC1EdWUtVG8tVW5zdXBwb3J0ZWQtRmVhdHVyZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFJvYW1pbmctUmVzdHJpY3RlZC1EdWUtVG8tVW5zdXBwb3J0ZWQtRmVhdHVyZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIFRyYWNlLURhdGEgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNDU4LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiVHJhY2UtRGF0YSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIFRyYWNlLVJlZmVyZW5jZSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTE0NTksCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJUcmFjZS1SZWZlcmVuY2UiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogVHJhY2UtRGVwdGggKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNDYyLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiVHJhY2UtRGVwdGgiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChUcmFjZS1EZXB0aCkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIFRyYWNlLU5FLVR5cGUtTGlzdCAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTE0NjMsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJUcmFjZS1ORS1UeXBlLUxpc3QiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogVHJhY2UtSW50ZXJmYWNlLUxpc3QgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNDY0LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiVHJhY2UtSW50ZXJmYWNlLUxpc3QiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogVHJhY2UtRXZlbnQtTGlzdCAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTE0NjUsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJUcmFjZS1FdmVudC1MaXN0IiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIE9NQy1JZCAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTE0NjYsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJPTUMtSWQiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogR1BSUy1TdWJzY3JpcHRpb24tRGF0YSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTE0NjcsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJHUFJTLVN1YnNjcmlwdGlvbi1EYXRhIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogQ29tcGxldGUtRGF0YS1MaXN0LUluY2x1ZGVkLUluZGljYXRvciAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTE0NjgsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJDb21wbGV0ZS1EYXRhLUxpc3QtSW5jbHVkZWQtSW5kaWNhdG9yIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoQ29tcGxldGUtRGF0YS1MaXN0LUluY2x1ZGVkLUluZGljYXRvcikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIFBEUC1Db250ZXh0ICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTQ2OSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlBEUC1Db250ZXh0IiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogUERQLVR5cGUgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNDcwLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiUERQLVR5cGUiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogM0dQUDItTUVJRCAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTE0NzEsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSIzR1BQMi1NRUlEIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIFNwZWNpZmljLUFQTi1JbmZvICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTQ3MiwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlNwZWNpZmljLUFQTi1JbmZvIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogTENTLUluZm8gKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNDczLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiTENTLUluZm8iLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBHTUxDLU51bWJlciAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTE0NzQsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJHTUxDLU51bWJlciIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBMQ1MtUHJpdmFjeUV4Y2VwdGlvbiAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTE0NzUsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJMQ1MtUHJpdmFjeUV4Y2VwdGlvbiIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIFNTLUNvZGUgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNDc2LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiU1MtQ29kZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBTUy1TdGF0dXMgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNDc3LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiU1MtU3RhdHVzIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogTm90aWZpY2F0aW9uLVRvLVVFLVVzZXIgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNDc4LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiTm90aWZpY2F0aW9uLVRvLVVFLVVzZXIiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChOb3RpZmljYXRpb24tVG8tVUUtVXNlcikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIEV4dGVybmFsLUNsaWVudCAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTE0NzksCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJFeHRlcm5hbC1DbGllbnQiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBDbGllbnQtSWRlbnRpdHkgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNDgwLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiQ2xpZW50LUlkZW50aXR5IiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIEdNTEMtUmVzdHJpY3Rpb24gKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNDgxLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiR01MQy1SZXN0cmljdGlvbiIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKEdNTEMtUmVzdHJpY3Rpb24pIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQlDSEVDS19kaWN0X25ldyhESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCX07CisKKwkvKiBQTE1OLUNsaWVudCAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTE0ODIsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJQTE1OLUNsaWVudCIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFBMTU4tQ2xpZW50KSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogU2VydmljZS1UeXBlICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTQ4MywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlNlcnZpY2UtVHlwZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIFNlcnZpY2VUeXBlSWRlbnRpdHkgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNDg0LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiU2VydmljZVR5cGVJZGVudGl0eSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIE1PLUxSICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTQ4NSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIk1PLUxSIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogVGVsZXNlcnZpY2UtTGlzdCAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTE0ODYsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJUZWxlc2VydmljZS1MaXN0IiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogVFMtQ29kZSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTE0ODcsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJUUy1Db2RlIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIENhbGwtQmFycmluZy1JbmZvci1MaXN0ICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTQ4OCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkNhbGwtQmFycmluZy1JbmZvci1MaXN0IiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogU0dTTi1OdW1iZXIgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNDg5LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiU0dTTi1OdW1iZXIiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogSURSLUZsYWdzICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTQ5MCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIklEUi1GbGFncyIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIElDUy1JbmRpY2F0b3IgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNDkxLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiSUNTLUluZGljYXRvciIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChJQ1MtSW5kaWNhdG9yKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogSU1TLVZvaWNlLU92ZXItUFMtU2Vzc2lvbnMtU3VwcG9ydGVkICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTQ5MiwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIklNUy1Wb2ljZS1PdmVyLVBTLVNlc3Npb25zLVN1cHBvcnRlZCIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChJTVMtVm9pY2UtT3Zlci1QUy1TZXNzaW9ucy1TdXBwb3J0ZWQpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQlDSEVDS19kaWN0X25ldyhESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCX07CisKKwkvKiBIb21vZ2VuZW91cy1TdXBwb3J0LW9mLUlNUy1Wb2ljZS1PdmVyLVBTLVNlc3Npb25zICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTQ5MywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkhvbW9nZW5lb3VzLVN1cHBvcnQtb2YtSU1TLVZvaWNlLU92ZXItUFMtU2Vzc2lvbnMiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoSG9tb2dlbmVvdXMtU3VwcG9ydC1vZi1JTVMtVm9pY2UtT3Zlci1QUy1TZXNzaW9ucykiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIExhc3QtVUUtQWN0aXZpdHktVGltZSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTE0OTQsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJMYXN0LVVFLUFjdGl2aXR5LVRpbWUiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgVGltZV90eXBlLCBOVUxMKTsKKwl9OworCisJLyogRVBTLVVzZXItU3RhdGUgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNDk1LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiRVBTLVVzZXItU3RhdGUiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogRVBTLUxvY2F0aW9uLUluZm9ybWF0aW9uICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTQ5NiwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkVQUy1Mb2NhdGlvbi1JbmZvcm1hdGlvbiIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBNTUUtVXNlci1TdGF0ZSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTE0OTcsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJNTUUtVXNlci1TdGF0ZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBTR1NOLVVzZXItU3RhdGUgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNDk4LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiU0dTTi1Vc2VyLVN0YXRlIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIFVzZXItU3RhdGUgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNDk5LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiVXNlci1TdGF0ZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChVc2VyLVN0YXRlKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogTU1FLUxvY2F0aW9uSW5mb3JtYXRpb24gKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNjAwLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiTU1FLUxvY2F0aW9uSW5mb3JtYXRpb24iLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogU0dTTi1Mb2NhdGlvbi1JbmZvcm1hdGlvbiAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTE2MDEsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJTR1NOLUxvY2F0aW9uLUluZm9ybWF0aW9uIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIEUtVVRSQU4tQ2VsbC1HbG9iYWwtSWRlbnRpdHkgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNjAyLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiRS1VVFJBTi1DZWxsLUdsb2JhbC1JZGVudGl0eSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogVHJhY2tpbmctQXJlYS1JZGVudGl0eSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTE2MDMsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJUcmFja2luZy1BcmVhLUlkZW50aXR5IiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBDZWxsLUdsb2JhbC1JZGVudGl0eSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTE2MDQsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJDZWxsLUdsb2JhbC1JZGVudGl0eSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogUm91dGluZy1BcmVhLUlkZW50aXR5ICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTYwNSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlJvdXRpbmctQXJlYS1JZGVudGl0eSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogTG9jYXRpb24tQXJlYS1JZGVudGl0eSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTE2MDYsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJMb2NhdGlvbi1BcmVhLUlkZW50aXR5IiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBTZXJ2aWNlLUFyZWEtSWRlbnRpdHkgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNjA3LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiU2VydmljZS1BcmVhLUlkZW50aXR5IiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBHZW9ncmFwaGljYWwtSW5mb3JtYXRpb24gKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNjA4LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiR2VvZ3JhcGhpY2FsLUluZm9ybWF0aW9uIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBHZW9kZXRpYy1JbmZvcm1hdGlvbiAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTE2MDksCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJHZW9kZXRpYy1JbmZvcm1hdGlvbiIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogQ3VycmVudC1Mb2NhdGlvbi1SZXRyaWV2ZWQgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNjEwLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiQ3VycmVudC1Mb2NhdGlvbi1SZXRyaWV2ZWQiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoQ3VycmVudC1Mb2NhdGlvbi1SZXRyaWV2ZWQpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQlDSEVDS19kaWN0X25ldyhESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCX07CisKKwkvKiBBZ2UtT2YtTG9jYXRpb24tSW5mb3JtYXRpb24gKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNjExLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiQWdlLU9mLUxvY2F0aW9uLUluZm9ybWF0aW9uIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIEFjdGl2ZS1BUE4gKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNjEyLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiQWN0aXZlLUFQTiIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBFcnJvci1EaWFnbm9zdGljICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTYxNCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkVycm9yLURpYWdub3N0aWMiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoRXJyb3ItRGlhZ25vc3RpYykiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIEV4dC1QRFAtQWRkcmVzcyAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTE2MjEsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJFeHQtUERQLUFkZHJlc3MiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgQWRkcmVzc190eXBlLCBOVUxMKTsKKwl9OworCisJLyogVUUtU1JWQ0MtQ2FwYWJpbGl0eSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTE2MTUsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJVRS1TUlZDQy1DYXBhYmlsaXR5IiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFVFLVNSVkNDLUNhcGFiaWxpdHkpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQlDSEVDS19kaWN0X25ldyhESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCX07CisKKwkvKiBNUFMtUHJpb3JpdHkgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNjE2LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiTVBTLVByaW9yaXR5IiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIFZQTE1OLUxJUEEtQWxsb3dlZCAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTE2MTcsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJWUExNTi1MSVBBLUFsbG93ZWQiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoVlBMTU4tTElQQS1BbGxvd2VkKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogTElQQS1QZXJtaXNzaW9uICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTYxOCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkxJUEEtUGVybWlzc2lvbiIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChMSVBBLVBlcm1pc3Npb24pIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQlDSEVDS19kaWN0X25ldyhESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCX07CisKKwkvKiBTdWJzY3JpYmVkLVBlcmlvZGljLVJBVS1UQVUtVGltZXIgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNjE5LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiU3Vic2NyaWJlZC1QZXJpb2RpYy1SQVUtVEFVLVRpbWVyIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIEV4dC1QRFAtVHlwZSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTE2MjAsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJFeHQtUERQLVR5cGUiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIFNJUFRPLVBlcm1pc3Npb24gKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNjEzLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiU0lQVE8tUGVybWlzc2lvbiIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChTSVBUTy1QZXJtaXNzaW9uKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogTURULUNvbmZpZ3VyYXRpb24gKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNjIyLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiTURULUNvbmZpZ3VyYXRpb24iLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogSm9iLVR5cGUgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNjIzLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiSm9iLVR5cGUiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoSm9iLVR5cGUpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQlDSEVDS19kaWN0X25ldyhESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCX07CisKKwkvKiBBcmVhLVNjb3BlICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTYyNCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkFyZWEtU2NvcGUiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogTGlzdC1PZi1NZWFzdXJlbWVudHMgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNjI1LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiTGlzdC1PZi1NZWFzdXJlbWVudHMiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogUmVwb3J0aW5nLVRyaWdnZXIgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNjI2LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiUmVwb3J0aW5nLVRyaWdnZXIiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogUmVwb3J0LUludGVydmFsICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTYyNywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlJlcG9ydC1JbnRlcnZhbCIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChSZXBvcnQtSW50ZXJ2YWwpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQlDSEVDS19kaWN0X25ldyhESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCX07CisKKwkvKiBSZXBvcnQtQW1vdW50ICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTYyOCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlJlcG9ydC1BbW91bnQiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoUmVwb3J0LUFtb3VudCkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIEV2ZW50LVRocmVzaG9sZC1SU1JQICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTYyOSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkV2ZW50LVRocmVzaG9sZC1SU1JQIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIEV2ZW50LVRocmVzaG9sZC1SU1JRICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTYzMCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkV2ZW50LVRocmVzaG9sZC1SU1JRIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIExvZ2dpbmctSW50ZXJ2YWwgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNjMxLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiTG9nZ2luZy1JbnRlcnZhbCIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChMb2dnaW5nLUludGVydmFsKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogTG9nZ2luZy1EdXJhdGlvbiAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTE2MzIsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJMb2dnaW5nLUR1cmF0aW9uIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKExvZ2dpbmctRHVyYXRpb24pIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQlDSEVDS19kaWN0X25ldyhESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCX07CisKKwkvKiBSZWxheS1Ob2RlLUluZGljYXRvciAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTE2MzMsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJSZWxheS1Ob2RlLUluZGljYXRvciIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChSZWxheS1Ob2RlLUluZGljYXRvcikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIE1EVC1Vc2VyLUNvbnNlbnQgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNjM0LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiTURULVVzZXItQ29uc2VudCIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChNRFQtVXNlci1Db25zZW50KSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogUFVSLUZsYWdzICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTYzNSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlBVUi1GbGFncyIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBTdWJzY3JpYmVkLVZTUlZDQyAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTE2MzYsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJTdWJzY3JpYmVkLVZTUlZDQyIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChTdWJzY3JpYmVkLVZTUlZDQykiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIEVxdWl2YWxlbnQtUExNTi1MaXN0ICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTYzNywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkVxdWl2YWxlbnQtUExNTi1MaXN0IiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIENMUi1GbGFncyAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTE2MzgsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJDTFItRmxhZ3MiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogVVZSLUZsYWdzICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTYzOSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlVWUi1GbGFncyIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIFVWQS1GbGFncyAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTE2NDAsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJVVkEtRmxhZ3MiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBWUExNTi1DU0ctU3Vic2NyaXB0aW9uLURhdGEgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNjQxLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiVlBMTU4tQ1NHLVN1YnNjcmlwdGlvbi1EYXRhIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogVGltZS1ab25lICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTY0MiwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlRpbWUtWm9uZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCX07CisKKwkvKiBBLU1TSVNETiAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTE2NDMsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJBLU1TSVNETiIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogTU1FLU51bWJlci1mb3ItTVQtU01TICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTY0NSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIk1NRS1OdW1iZXItZm9yLU1ULVNNUyIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogU01TLVJlZ2lzdGVyLVJlcXVlc3QgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNjQ4LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiU01TLVJlZ2lzdGVyLVJlcXVlc3QiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoU01TLVJlZ2lzdGVyLVJlcXVlc3QpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQlDSEVDS19kaWN0X25ldyhESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCX07CisKKwkvKiBMb2NhbC1UaW1lLVpvbmUgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNjQ5LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiTG9jYWwtVGltZS1ab25lIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIERheWxpZ2h0LVNhdmluZy1UaW1lICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTY1MCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkRheWxpZ2h0LVNhdmluZy1UaW1lIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKERheWxpZ2h0LVNhdmluZy1UaW1lKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogU3Vic2NyaXB0aW9uLURhdGEtRmxhZ3MgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNjU0LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiU3Vic2NyaXB0aW9uLURhdGEtRmxhZ3MiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogTWVhc3VyZW1lbnQtUGVyaW9kLVVNVFMgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNjU1LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiTWVhc3VyZW1lbnQtUGVyaW9kLVVNVFMiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoTWVhc3VyZW1lbnQtUGVyaW9kLVVNVFMpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQlDSEVDS19kaWN0X25ldyhESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCX07CisKKwkvKiBNZWFzdXJlbWVudC1QZXJpb2QtTFRFICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTY1NiwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIk1lYXN1cmVtZW50LVBlcmlvZC1MVEUiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoTWVhc3VyZW1lbnQtUGVyaW9kLUxURSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIENvbGxlY3Rpb24tUGVyaW9kLVJSTS1MVEUgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNjU3LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiQ29sbGVjdGlvbi1QZXJpb2QtUlJNLUxURSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChDb2xsZWN0aW9uLVBlcmlvZC1SUk0tTFRFKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogQ29sbGVjdGlvbi1QZXJpb2QtUlJNLVVNVFMgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNjU4LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiQ29sbGVjdGlvbi1QZXJpb2QtUlJNLVVNVFMiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoQ29sbGVjdGlvbi1QZXJpb2QtUlJNLVVNVFMpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQlDSEVDS19kaWN0X25ldyhESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCX07CisKKwkvKiBQb3NpdGlvbmluZy1NZXRob2QgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxNjU5LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiUG9zaXRpb25pbmctTWV0aG9kIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBNZWFzdXJlbWVudC1RdWFudGl0eSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTE2NjAsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJNZWFzdXJlbWVudC1RdWFudGl0eSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogRXZlbnQtVGhyZXNob2xkLUV2ZW50LTFGICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTY2MSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkV2ZW50LVRocmVzaG9sZC1FdmVudC0xRiIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIEV2ZW50LVRocmVzaG9sZC1FdmVudC0xSSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTE2NjIsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJFdmVudC1UaHJlc2hvbGQtRXZlbnQtMUkiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiAzR1BQIDI5LjMyOS1iNTAgKDExLjUuMCAyMDEyLjEyLjIxKSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkvKiBVc2VyLUlkZW50aXR5ICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJNzAwLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiVXNlci1JZGVudGl0eSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIE1TSVNETiAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTcwMSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIk1TSVNETiIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBOYW1lIGNvbmZsaWN0IHdpdGggMjkuMjI5IFVzZXItRGF0YSAoNjA2KSwgcmVuYW1lZCAgICAgICAgICAgKi8KKwkvKiBVc2VyLURhdGEtMjkuMzI5ICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJNzAyLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiVXNlci1EYXRhLTI5LjMyOSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBEYXRhLVJlZmVyZW5jZSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTcwMywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkRhdGEtUmVmZXJlbmNlIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoRGF0YS1SZWZlcmVuY2UpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQlDSEVDS19kaWN0X25ldyhESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCX07CisKKwkvKiBTZXJ2aWNlLUluZGljYXRpb24gKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk3MDQsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJTZXJ2aWNlLUluZGljYXRpb24iLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogU3Vicy1SZXEtVHlwZSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTcwNSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlN1YnMtUmVxLVR5cGUiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChTdWJzLVJlcS1UeXBlKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogUmVxdWVzdGVkLURvbWFpbiAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTcwNiwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlJlcXVlc3RlZC1Eb21haW4iLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChSZXF1ZXN0ZWQtRG9tYWluKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogQ3VycmVudC1Mb2NhdGlvbiAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTcwNywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkN1cnJlbnQtTG9jYXRpb24iLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChDdXJyZW50LUxvY2F0aW9uKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwl9OworCisJLyogSWRlbnRpdHktU2V0ICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJNzA4LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiSWRlbnRpdHktU2V0IiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKElkZW50aXR5LVNldCkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIEV4cGlyeS1UaW1lICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJNzA5LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiRXhwaXJ5LVRpbWUiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgVGltZV90eXBlLCBOVUxMKTsKKwl9OworCisJLyogU2VuZC1EYXRhLUluZGljYXRpb24gKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk3MTAsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJTZW5kLURhdGEtSW5kaWNhdGlvbiIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChTZW5kLURhdGEtSW5kaWNhdGlvbikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIGluIDI5LjIyOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCS8qIFNlcnZlci1OYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCS8qIFN1cHBvcnRlZC1GZWF0dXJlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCS8qIEZlYXR1cmUtTGlzdC1JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCS8qIEZlYXR1cmUtTGlzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCS8qIFN1cHBvcnRlZC1BcHBsaWNhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCS8qIFB1YmxpYy1JZGVudGl0eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCS8qIERTQUktVGFnICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJNzExLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiRFNBSS1UYWciLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogaW4gMjkuMjI5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJLyogV2lsZGNhcmRlZC1QdWJsaWMtSWRlbnRpdHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJLyogV2lsZGNhcmRlZC1JTVBVICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJNjM2LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiV2lsZGNhcmRlZC1JTVBVIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIGluIDI5LjIyOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCS8qIFNlc3Npb24tUHJpb3JpdHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCS8qIE9uZS1UaW1lLU5vdGlmaWNhdGlvbiAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTcxMiwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIk9uZS1UaW1lLU5vdGlmaWNhdGlvbiIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChPbmUtVGltZS1Ob3RpZmljYXRpb24pIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQlDSEVDS19kaWN0X25ldyhESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCX07CisKKwkvKiBSZXF1ZXN0ZWQtTm9kZXMgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk3MTMsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJSZXF1ZXN0ZWQtTm9kZXMiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogU2VydmluZy1Ob2RlLUluZGljYXRpb24gKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk3MTQsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJTZXJ2aW5nLU5vZGUtSW5kaWNhdGlvbiIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChTZXJ2aW5nLU5vZGUtSW5kaWNhdGlvbikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIFJlcG9zaXRvcnktRGF0YS1JRCAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTcxNSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlJlcG9zaXRvcnktRGF0YS1JRCIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBTZXF1ZW5jZS1OdW1iZXIgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk3MTYsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJTZXF1ZW5jZS1OdW1iZXIiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogVURSLUZsYWdzICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJNzE5LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiVURSLUZsYWdzIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIE9NQSBERFMgQ2hhcmdpbmdfRGF0YSBWMS4wIDIwMTEwMjAxLUEgICAgICAgICAgICAgICAgICAgICAgICAqLworCS8qIEFwcGxpY2F0aW9uLVNlcnZlci1JZCAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTIxMDEsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJBcHBsaWNhdGlvbi1TZXJ2ZXItSWQiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCX07CisKKwkvKiBBcHBsaWNhdGlvbi1TZXJ2aWNlLVR5cGUgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkyMTAyLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiQXBwbGljYXRpb24tU2VydmljZS1UeXBlIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwl9OworCisJLyogQXBwbGljYXRpb24tU2Vzc2lvbi1JZCAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTIxMDMsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJBcHBsaWNhdGlvbi1TZXNzaW9uLUlkIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwl9OworCisJLyogQ29udGVudC1JRCAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTIxMTYsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJDb250ZW50LUlEIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwl9OworCisJLyogQ29udGVudC1wcm92aWRlci1JRCAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTIxMTcsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJDb250ZW50LXByb3ZpZGVyLUlEIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwl9OworCisJLyogRENELUluZm9ybWF0aW9uICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMjExNSwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIkRDRC1JbmZvcm1hdGlvbiIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIERlbGl2ZXJ5LVN0YXR1cyAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTIxMDQsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJEZWxpdmVyeS1TdGF0dXMiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCX07CisKKwkvKiBJTS1JbmZvcm1hdGlvbiAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTIxMTAsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJJTS1JbmZvcm1hdGlvbiIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIE51bWJlci1PZi1NZXNzYWdlcy1TdWNjZXNzZnVsbHktRXhwbG9kZWQgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkyMTExLAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiTnVtYmVyLU9mLU1lc3NhZ2VzLVN1Y2Nlc3NmdWxseS1FeHBsb2RlZCIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIE51bWJlci1PZi1NZXNzYWdlcy1TdWNjZXNzZnVsbHktU2VudCAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTIxMTIsCS8qIENvZGUgKi8KKwkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCSJOdW1iZXItT2YtTWVzc2FnZXMtU3VjY2Vzc2Z1bGx5LVNlbnQiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBTZXJ2aWNlLUdlbmVyaWMtSW5mb3JtYXRpb24gKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMjU2LAkvKiBDb2RlICovCisJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkiU2VydmljZS1HZW5lcmljLUluZm9ybWF0aW9uIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogVG90YWwtTnVtYmVyLU9mLU1lc3NhZ2VzLUV4cGxvZGVkICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMjExMywJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlRvdGFsLU51bWJlci1PZi1NZXNzYWdlcy1FeHBsb2RlZCIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIFRvdGFsLU51bWJlci1PZi1NZXNzYWdlcy1TZW50ICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMjExNCwJLyogQ29kZSAqLworCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJIlRvdGFsLU51bWJlci1PZi1NZXNzYWdlcy1TZW50IiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisKKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCS8qIGVuZCBvZiBnZW5lcmF0ZWQgZGF0YSwgcnVsZXMgYmVsb3cgYWRkZWQgbWFudWFsbHkgKi8KKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworCQorCS8qIDNHUFAyLUJTSUQgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk5MDEwLAkvKiBDb2RlICovCisJCQk1NTM1LAkvKiBWZW5kb3IgKi8KKwkJCSIzR1BQMi1CU0lEIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLyAvKiBYWFg6IGd1ZXNzZWQgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogMjkuMjEyICovCisJCisJeworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKnJ1bGVfYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCB2cGE7CisJCXZwYS5hdnBfdmVuZG9yID0gMTA0MTU7CisJCXZwYS5hdnBfbmFtZSA9ICJBbGxvY2F0aW9uLVJldGVudGlvbi1Qcmlvcml0eSI7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmdnBhLCAmcnVsZV9hdnApOworCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJCXsKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlByaW9yaXR5LUxldmVsIiB9LCBSVUxFX1JFUVVJUkVELCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUHJlLWVtcHRpb24tQ2FwYWJpbGl0eSIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlByZS1lbXB0aW9uLVZ1bG5lcmFiaWxpdHkiIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQl9OworCQkJUEFSU0VfbG9jX3J1bGVzKHJ1bGVzLCBydWxlX2F2cCk7CisgICAgICAgIH0KKworCXsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICpydWxlX2F2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgdnBhOworCQl2cGEuYXZwX3ZlbmRvciA9IDEwNDE1OworCQl2cGEuYXZwX25hbWUgPSAiUW9TLUluZm9ybWF0aW9uIjsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZ2cGEsICZydWxlX2F2cCk7CisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQkJeworCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUW9TLUNsYXNzLUlkZW50aWZpZXIiIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNYXgtUmVxdWVzdGVkLUJhbmR3aWR0aC1VTCIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1heC1SZXF1ZXN0ZWQtQmFuZHdpZHRoLURMIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiR3VhcmFudGVlZC1CaXRyYXRlLVVMIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiR3VhcmFudGVlZC1CaXRyYXRlLURMIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQmVhcmVyLUlkZW50aWZpZXIiIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBbGxvY2F0aW9uLVJldGVudGlvbi1Qcmlvcml0eSIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFQTi1BZ2dyZWdhdGUtTWF4LUJpdHJhdGUtVUwiIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBUE4tQWdncmVnYXRlLU1heC1CaXRyYXRlLURMIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJfTsKKwkJCVBBUlNFX2xvY19ydWxlcyhydWxlcywgcnVsZV9hdnApOworICAgICAgICB9CisKKwkvKiAzMi4yOTkgKi8KKworCXsKKwkJLyogYWRkaXRpb25hbCBhbGxvd2VkIEFWUHMgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICpjY3I7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJDcmVkaXQtQ29udHJvbC1SZXF1ZXN0IiwgJmNjcik7CisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPSAKKwkJCXsKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFvQy1SZXF1ZXN0LVR5cGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNlcnZpY2UtSW5mb3JtYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCX07CisJCVBBUlNFX2xvY19ydWxlcyhydWxlcywgY2NyKTsKKyAgICAgICAgfQorCisJeworCQkvKiBhZGRpdGlvbmFsIGFsbG93ZWQgQVZQcyAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKmNjcjsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIkNyZWRpdC1Db250cm9sLUFuc3dlciIsICZjY3IpOworCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0gCisJCQl7CisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJMb3ctQmFsYW5jZS1JbmRpY2F0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJSZW1haW5pbmctQmFsYW5jZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU2VydmljZS1JbmZvcm1hdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKHJ1bGVzLCBjY3IpOworICAgICAgICB9CisKKwl7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqcnVsZV9hdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IHZwYTsKKwkJdnBhLmF2cF92ZW5kb3IgPSAxMDQxNTsKKwkJdnBhLmF2cF9uYW1lID0gIkFkZHJlc3MtRG9tYWluIjsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZ2cGEsICZydWxlX2F2cCk7CisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQkJeworCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRG9tYWluLU5hbWUiIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICIzR1BQLUlNU0ktTUNDLU1OQyIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCX07CisJCQlQQVJTRV9sb2NfcnVsZXMocnVsZXMsIHJ1bGVfYXZwKTsKKyAgICAgICAgfQorCisJeworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKnJ1bGVfYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCB2cGE7CisJCXZwYS5hdnBfdmVuZG9yID0gMTA0MTU7CisJCXZwYS5hdnBfbmFtZSA9ICJBcHBsaWNhdGlvbi1TZXJ2ZXItSW5mb3JtYXRpb24iOworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJnZwYSwgJnJ1bGVfYXZwKTsKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCQl7CisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBcHBsaWNhdGlvbi1TZXJ2ZXIiIH0sIFJVTEVfUkVRVUlSRUQsIC0xLCAxIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBcHBsaWNhdGlvbi1Qcm92aWRlZC1DYWxsZWQtUGFydHktQWRkcmVzcyIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl9OworCQkJUEFSU0VfbG9jX3J1bGVzKHJ1bGVzLCBydWxlX2F2cCk7CisgICAgICAgIH0KKworCXsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICpydWxlX2F2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgdnBhOworCQl2cGEuYXZwX3ZlbmRvciA9IDEwNDE1OworCQl2cGEuYXZwX25hbWUgPSAiRGVzdGluYXRpb24tSW50ZXJmYWNlIjsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZ2cGEsICZydWxlX2F2cCk7CisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQkJeworCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiSW50ZXJmYWNlLUlkIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiSW50ZXJmYWNlLVRleHQiIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJJbnRlcmZhY2UtUG9ydCIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkludGVyZmFjZS1UeXBlIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJfTsKKwkJCVBBUlNFX2xvY19ydWxlcyhydWxlcywgcnVsZV9hdnApOworICAgICAgICB9CisKKwl7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqcnVsZV9hdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IHZwYTsKKwkJdnBhLmF2cF92ZW5kb3IgPSAxMDQxNTsKKwkJdnBhLmF2cF9uYW1lID0gIkVudmVsb3BlIjsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZ2cGEsICZydWxlX2F2cCk7CisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQkJeworCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRW52ZWxvcGUtU3RhcnQtVGltZSIgfSwgUlVMRV9SRVFVSVJFRCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkVudmVsb3BlLUVuZC1UaW1lIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsICAgICAuYXZwX25hbWUgPSAiQ0MtVG90YWwtT2N0ZXRzIiB9LCBSVUxFX1JFUVVJUkVELCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsICAgICAuYXZwX25hbWUgPSAiQ0MtSW5wdXQtT2N0ZXRzIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsICAgICAuYXZwX25hbWUgPSAiQ0MtT3V0cHV0LU9jdGV0cyIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAgICAgLmF2cF9uYW1lID0gIkNDLVNlcnZpY2UtU3BlY2lmaWMtVW5pdHMiIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQl9OworCQkJUEFSU0VfbG9jX3J1bGVzKHJ1bGVzLCBydWxlX2F2cCk7CisgICAgICAgIH0KKworCXsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICpydWxlX2F2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgdnBhOworCQl2cGEuYXZwX3ZlbmRvciA9IDEwNDE1OworCQl2cGEuYXZwX25hbWUgPSAiRXZlbnQtVHlwZSI7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmdnBhLCAmcnVsZV9hdnApOworCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJCXsKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNJUC1NZXRob2QiIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJFdmVudCIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkV4cGlyZXMiIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQl9OworCQkJUEFSU0VfbG9jX3J1bGVzKHJ1bGVzLCBydWxlX2F2cCk7CisgICAgICAgIH0KKworCXsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICpydWxlX2F2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgdnBhOworCQl2cGEuYXZwX3ZlbmRvciA9IDEwNDE1OworCQl2cGEuYXZwX25hbWUgPSAiSU1TLUluZm9ybWF0aW9uIjsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZ2cGEsICZydWxlX2F2cCk7CisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQkJeworCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRXZlbnQtVHlwZSIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJvbGUtT2YtTm9kZSIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk5vZGUtRnVuY3Rpb25hbGl0eSIgfSwgUlVMRV9SRVFVSVJFRCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlVzZXItU2Vzc2lvbi1JZCIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk91dGdvaW5nLVNlc3Npb24tSWQiIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTZXNzaW9uLVByaW9yaXR5IiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ2FsbGluZy1QYXJ0eS1BZGRyZXNzIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNhbGxlZC1QYXJ0eS1BZGRyZXNzIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ2FsbGVkLUFzc2VydGVkLUlkZW50aXR5IiB9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk51bWJlci1Qb3J0YWJpbGl0eS1Sb3V0aW5nLUluZm9ybWF0aW9uIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ2Fycmllci1TZWxlY3QtUm91dGluZy1JbmZvcm1hdGlvbiIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFsdGVybmF0ZS1DaGFyZ2VkLVBhcnR5LUFkZHJlc3MiIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJSZXF1ZXN0ZWQtUGFydHktQWRkcmVzcyIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBc3NvY2lhdGVkLVVSSSIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUaW1lLVN0YW1wcyIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFwcGxpY2F0aW9uLVNlcnZlci1JbmZvcm1hdGlvbiIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJJbnRlci1PcGVyYXRvci1JZGVudGlmaWVyIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlRyYW5zaXQtSU9JLUxpc3QiIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJJTVMtQ2hhcmdpbmctSWRlbnRpZmllciIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNEUC1TZXNzaW9uLURlc2NyaXB0aW9uIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNEUC1NZWRpYS1Db21wb25lbnQiIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU2VydmVkLVBhcnR5LUlQLUFkZHJlc3MiIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTZXJ2ZXItQ2FwYWJpbGl0aWVzIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVHJ1bmstR3JvdXAtSWQiIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJCZWFyZXItU2VydmljZSIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNlcnZpY2UtSWQiIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTZXJ2aWNlLVNwZWNpZmljLUluZm8iIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTWVzc2FnZS1Cb2R5IiB9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNhdXNlLUNvZGUiIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBY2Nlc3MtTmV0d29yay1JbmZvcm1hdGlvbiIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkVhcmx5LU1lZGlhLURlc2NyaXB0aW9uIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIklNUy1Db21tdW5pY2F0aW9uLVNlcnZpY2UtSWRlbnRpZmllciIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIklNUy1BcHBsaWNhdGlvbi1SZWZlcmVuY2UtSWRlbnRpZmllciIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk9ubGluZS1DaGFyZ2luZy1GbGFnIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUmVhbC1UaW1lLVRhcmlmZi1JbmZvcm1hdGlvbiIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFjY291bnQtRXhwaXJhdGlvbiIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkluaXRpYWwtSU1TLUNoYXJnaW5nLUlkZW50aWZpZXIiIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJOTkktSW5mb3JtYXRpb24iIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRnJvbS1BZGRyZXNzIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiSU1TLUVtZXJnZW5jeS1JbmRpY2F0b3IiIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBY2Nlc3MtVHJhbnNmZXItSW5mb3JtYXRpb24iIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJfTsKKwkJCVBBUlNFX2xvY19ydWxlcyhydWxlcywgcnVsZV9hdnApOworICAgICAgICB9CisKKwl7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqcnVsZV9hdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IHZwYTsKKwkJdnBhLmF2cF92ZW5kb3IgPSAxMDQxNTsKKwkJdnBhLmF2cF9uYW1lID0gIk1lc3NhZ2UtQ2xhc3MiOworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJnZwYSwgJnJ1bGVfYXZwKTsKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCQl7CisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDbGFzcy1JZGVudGlmaWVyIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVG9rZW4tVGV4dCIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCX07CisJCQlQQVJTRV9sb2NfcnVsZXMocnVsZXMsIHJ1bGVfYXZwKTsKKyAgICAgICAgfQorCisJeworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKnJ1bGVfYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCB2cGE7CisJCXZwYS5hdnBfdmVuZG9yID0gMTA0MTU7CisJCXZwYS5hdnBfbmFtZSA9ICJNTVMtSW5mb3JtYXRpb24iOworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJnZwYSwgJnJ1bGVfYXZwKTsKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCQl7CisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJPcmlnaW5hdG9yLUFkZHJlc3MiIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJSZWNpcGllbnQtQWRkcmVzcyIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTdWJtaXNzaW9uLVRpbWUiIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNTS1Db250ZW50LVR5cGUiIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQcmlvcml0eSIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNZXNzYWdlLUlEIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTWVzc2FnZS1UeXBlIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTWVzc2FnZS1TaXplIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTWVzc2FnZS1DbGFzcyIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkRlbGl2ZXJ5LVJlcG9ydC1SZXF1ZXN0ZWQiIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJSZWFkLVJlcGx5LVJlcG9ydC1SZXF1ZXN0ZWQiIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNTUJveC1TdG9yYWdlLVJlcXVlc3RlZCIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFwcGxpYy1JRCIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJlcGx5LUFwcGxpYy1JRCIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkF1eC1BcHBsaWMtSW5mbyIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNvbnRlbnQtQ2xhc3MiIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJEUk0tQ29udGVudCIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFkYXB0YXRpb25zIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVkFTUC1JRCIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlZBUy1JRCIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCX07CisJCQlQQVJTRV9sb2NfcnVsZXMocnVsZXMsIHJ1bGVfYXZwKTsKKyAgICAgICAgfQorCisgICAgICAgIHsKKwkJLyogTXVsdGlwbGUtU2VydmljZXMtQ3JlZGl0LUNvbnRyb2wgKi8KKwkJLyogYWRkaXRpb25hbCBhbGxvd2VkIEFWUHMgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICpydWxlX2F2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgdnBhOworCQl2cGEuYXZwX3ZlbmRvciA9IDA7CisJCXZwYS5hdnBfbmFtZSA9ICJNdWx0aXBsZS1TZXJ2aWNlcy1DcmVkaXQtQ29udHJvbCI7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmdnBhLCAmcnVsZV9hdnApOworCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJCXsKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlRpbWUtUXVvdGEtVGhyZXNob2xkIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVm9sdW1lLVF1b3RhLVRocmVzaG9sZCIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlVuaXQtUXVvdGEtVGhyZXNob2xkIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUXVvdGEtSG9sZGluZy1UaW1lIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUXVvdGEtQ29uc3VtcHRpb24tVGltZSIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJlcG9ydGluZy1SZWFzb24iIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVHJpZ2dlciIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlBTLUZ1cm5pc2gtQ2hhcmdpbmctSW5mb3JtYXRpb24iIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJSZWZ1bmQtSW5mb3JtYXRpb24iIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBRi1Db3JyZWxhdGlvbi1JbmZvcm1hdGlvbiIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJFbnZlbG9wZSIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJFbnZlbG9wZS1SZXBvcnRpbmciIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUaW1lLVF1b3RhLU1lY2hhbmlzbSIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNlcnZpY2UtU3BlY2lmaWMtSW5mbyIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJRb1MtSW5mb3JtYXRpb24iIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQl9OworCQlQQVJTRV9sb2NfcnVsZXMocnVsZXMsIHJ1bGVfYXZwKTsKKyAgICAgICAgfQorCisJeworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKnJ1bGVfYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCB2cGE7CisJCXZwYS5hdnBfdmVuZG9yID0gMTA0MTU7CisJCXZwYS5hdnBfbmFtZSA9ICJPZmZsaW5lLUNoYXJnaW5nIjsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZ2cGEsICZydWxlX2F2cCk7CisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQkJeworCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUXVvdGEtQ29uc3VtcHRpb24tVGltZSIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlRpbWUtUXVvdGEtTWVjaGFuaXNtIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRW52ZWxvcGUtUmVwb3J0aW5nIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsICAgICAuYXZwX25hbWUgPSAiTXVsdGlwbGUtU2VydmljZXMtQ3JlZGl0LUNvbnRyb2wiIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJfTsKKwkJCVBBUlNFX2xvY19ydWxlcyhydWxlcywgcnVsZV9hdnApOworICAgICAgICB9CisKKwl7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqcnVsZV9hdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IHZwYTsKKwkJdnBhLmF2cF92ZW5kb3IgPSAxMDQxNTsKKwkJdnBhLmF2cF9uYW1lID0gIk9yaWdpbmF0b3ItQWRkcmVzcyI7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmdnBhLCAmcnVsZV9hdnApOworCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJCXsKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFkZHJlc3MtVHlwZSIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFkZHJlc3MtRGF0YSIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFkZHJlc3MtRG9tYWluIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJfTsKKwkJCVBBUlNFX2xvY19ydWxlcyhydWxlcywgcnVsZV9hdnApOworICAgICAgICB9CisKKwl7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqcnVsZV9hdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IHZwYTsKKwkJdnBhLmF2cF92ZW5kb3IgPSAxMDQxNTsKKwkJdnBhLmF2cF9uYW1lID0gIk9yaWdpbmF0b3ItSW50ZXJmYWNlIjsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZ2cGEsICZydWxlX2F2cCk7CisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQkJeworCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiSW50ZXJmYWNlLUlkIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiSW50ZXJmYWNlLVRleHQiIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJJbnRlcmZhY2UtUG9ydCIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkludGVyZmFjZS1UeXBlIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJfTsKKwkJCVBBUlNFX2xvY19ydWxlcyhydWxlcywgcnVsZV9hdnApOworICAgICAgICB9CisKKwl7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqcnVsZV9hdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IHZwYTsKKwkJdnBhLmF2cF92ZW5kb3IgPSAxMDQxNTsKKwkJdnBhLmF2cF9uYW1lID0gIlBTLUZ1cm5pc2gtQ2hhcmdpbmctSW5mb3JtYXRpb24iOworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJnZwYSwgJnJ1bGVfYXZwKTsKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCQl7CisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICIzR1BQLUNoYXJnaW5nLUlkIiB9LCBSVUxFX1JFUVVJUkVELCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUFMtRnJlZS1Gb3JtYXQtRGF0YSIgfSwgUlVMRV9SRVFVSVJFRCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlBTLUFwcGVuZC1GcmVlLUZvcm1hdC1EYXRhIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJfTsKKwkJCVBBUlNFX2xvY19ydWxlcyhydWxlcywgcnVsZV9hdnApOworICAgICAgICB9CisKKwl7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqcnVsZV9hdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IHZwYTsKKwkJdnBhLmF2cF92ZW5kb3IgPSAxMDQxNTsKKwkJdnBhLmF2cF9uYW1lID0gIlBTLUluZm9ybWF0aW9uIjsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZ2cGEsICZydWxlX2F2cCk7CisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQkJeworCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiM0dQUC1DaGFyZ2luZy1JZCIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlBETi1Db25uZWN0aW9uLUNoYXJnaW5nLUlEIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTm9kZS1JZCIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIjNHUFAtUERQLVR5cGUiIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQRFAtQWRkcmVzcyIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQRFAtQWRkcmVzcy1QcmVmaXgtTGVuZ3RoIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRHluYW1pYy1BZGRyZXNzLUZsYWciIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJEeW5hbWljLUFkZHJlc3MtRmxhZy1FeHRlbnNpb24iIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJRb1MtSW5mb3JtYXRpb24iIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTR1NOLUFkZHJlc3MiIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiR0dTTi1BZGRyZXNzIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNHVy1BZGRyZXNzIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNHLUFkZHJlc3MiIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTZXJ2aW5nLU5vZGUtVHlwZSIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNHVy1DaGFuZ2UiIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICIzR1BQLUlNU0ktTUNDLU1OQyIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIklNU0ktVW5hdXRoZW50aWNhdGVkLUZsYWciIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICIzR1BQLUdHU04tTUNDLU1OQyIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIjNHUFAtTlNBUEkiIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgICAgIC5hdnBfbmFtZSA9ICJDYWxsZWQtU3RhdGlvbi1JZCIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIjNHUFAtU2Vzc2lvbi1TdG9wLUluZGljYXRvciIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIjNHUFAtU2VsZWN0aW9uLU1vZGUiIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICIzR1BQLUNoYXJnaW5nLUNoYXJhY3RlcmlzdGljcyIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNoYXJnaW5nLUNoYXJhY3RlcmlzdGljcy1TZWxlY3Rpb24tTW9kZSIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIjNHUFAtU0dTTi1NQ0MtTU5DIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiM0dQUC1NUy1UaW1lWm9uZSIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNoYXJnaW5nLVJ1bGUtQmFzZS1OYW1lIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiM0dQUC1Vc2VyLUxvY2F0aW9uLUluZm8iIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJVc2VyLUNTRy1JbmZvcm1hdGlvbiIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSA1NTM1LCAgLmF2cF9uYW1lID0gIjNHUFAyLUJTSUQiIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICIzR1BQLVJBVC1UeXBlIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUFMtRnVybmlzaC1DaGFyZ2luZy1JbmZvcm1hdGlvbiIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlBEUC1Db250ZXh0LVR5cGUiIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJPZmZsaW5lLUNoYXJnaW5nIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVHJhZmZpYy1EYXRhLVZvbHVtZXMiIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU2VydmljZS1EYXRhLUNvbnRhaW5lciIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgICAgIC5hdnBfbmFtZSA9ICJVc2VyLUVxdWlwbWVudC1JbmZvIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVGVybWluYWwtSW5mb3JtYXRpb24iIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTdGFydC1UaW1lIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU3RvcC1UaW1lIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ2hhbmdlLUNvbmRpdGlvbiIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkRpYWdub3N0aWNzIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTG93LVByaW9yaXR5LUluZGljYXRvciIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1NRS1OdW1iZXItZm9yLU1ULVNNUyIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1NRS1OYW1lIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTU1FLVJlYWxtIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJfTsKKwkJCVBBUlNFX2xvY19ydWxlcyhydWxlcywgcnVsZV9hdnApOworICAgICAgICB9CisKKwl7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqcnVsZV9hdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IHZwYTsKKwkJdnBhLmF2cF92ZW5kb3IgPSAxMDQxNTsKKwkJdnBhLmF2cF9uYW1lID0gIlJlY2lwaWVudC1BZGRyZXNzIjsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZ2cGEsICZydWxlX2F2cCk7CisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQkJeworCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQWRkcmVzcy1UeXBlIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQWRkcmVzcy1EYXRhIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQWRkcmVzcy1Eb21haW4iIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBZGRyZXNzZWUtVHlwZSIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCX07CisJCQlQQVJTRV9sb2NfcnVsZXMocnVsZXMsIHJ1bGVfYXZwKTsKKyAgICAgICAgfQorCisJeworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKnJ1bGVfYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCB2cGE7CisJCXZwYS5hdnBfdmVuZG9yID0gMTA0MTU7CisJCXZwYS5hdnBfbmFtZSA9ICJSZWNpcGllbnQtSW5mbyI7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmdnBhLCAmcnVsZV9hdnApOworCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJCXsKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkRlc3RpbmF0aW9uLUludGVyZmFjZSIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJlY2lwaWVudC1BZGRyZXNzIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJlY2lwaWVudC1SZWNlaXZlZC1BZGRyZXNzIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJlY2lwaWVudC1TQ0NQLUFkZHJlc3MiIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTTS1Qcm90b2NvbC1JRCIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCX07CisJCQlQQVJTRV9sb2NfcnVsZXMocnVsZXMsIHJ1bGVfYXZwKTsKKyAgICAgICAgfQorCisJeworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKnJ1bGVfYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCB2cGE7CisJCXZwYS5hdnBfdmVuZG9yID0gMTA0MTU7CisJCXZwYS5hdnBfbmFtZSA9ICJSZWNpcGllbnQtUmVjZWl2ZWQtQWRkcmVzcyI7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmdnBhLCAmcnVsZV9hdnApOworCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJCXsKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFkZHJlc3MtVHlwZSIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFkZHJlc3MtRGF0YSIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFkZHJlc3MtRG9tYWluIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJfTsKKwkJCVBBUlNFX2xvY19ydWxlcyhydWxlcywgcnVsZV9hdnApOworICAgICAgICB9CisKKwl7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqcnVsZV9hdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IHZwYTsKKwkJdnBhLmF2cF92ZW5kb3IgPSAxMDQxNTsKKwkJdnBhLmF2cF9uYW1lID0gIlNEUC1NZWRpYS1Db21wb25lbnQiOworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJnZwYSwgJnJ1bGVfYXZwKTsKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCQl7CisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTRFAtTWVkaWEtTmFtZSIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNEUC1NZWRpYS1EZXNjcmlwdGlvbiIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJMb2NhbC1HVy1JbnNlcnRlZC1JbmRpY2F0aW9uIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiSVAtUmVhbG0tRGVmYXVsdC1JbmRpY2F0aW9uIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVHJhbnNjb2Rlci1JbnNlcnRlZC1JbmRpY2F0aW9uIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTWVkaWEtSW5pdGlhdG9yLUZsYWciIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNZWRpYS1Jbml0aWF0b3ItUGFydHkiIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICIzR1BQLUNoYXJnaW5nLUlkIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQWNjZXNzLU5ldHdvcmstQ2hhcmdpbmctSWRlbnRpZmllci1WYWx1ZSIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNEUC1UeXBlIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJfTsKKwkJCVBBUlNFX2xvY19ydWxlcyhydWxlcywgcnVsZV9hdnApOworICAgICAgICB9CisKKwl7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqcnVsZV9hdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IHZwYTsKKwkJdnBhLmF2cF92ZW5kb3IgPSAxMDQxNTsKKwkJdnBhLmF2cF9uYW1lID0gIlNlcnZpY2UtSW5mb3JtYXRpb24iOworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJnZwYSwgJnJ1bGVfYXZwKTsKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCQl7CisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgICAgIC5hdnBfbmFtZSA9ICJTdWJzY3JpcHRpb24tSWQiIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQW9DLUluZm9ybWF0aW9uIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUFMtSW5mb3JtYXRpb24iIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJXTEFOLUluZm9ybWF0aW9uIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiSU1TLUluZm9ybWF0aW9uIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTU1TLUluZm9ybWF0aW9uIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTENTLUluZm9ybWF0aW9uIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUG9DLUluZm9ybWF0aW9uIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTUJNUy1JbmZvcm1hdGlvbiIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNNUy1JbmZvcm1hdGlvbiIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1NVGVsLUluZm9ybWF0aW9uIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU2VydmljZS1HZW5lcmljLUluZm9ybWF0aW9uIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiSU0tSW5mb3JtYXRpb24iIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJEQ0QtSW5mb3JtYXRpb24iIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQl9OworCQkJUEFSU0VfbG9jX3J1bGVzKHJ1bGVzLCBydWxlX2F2cCk7CisgICAgICAgIH0KKworCXsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICpydWxlX2F2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgdnBhOworCQl2cGEuYXZwX3ZlbmRvciA9IDEwNDE1OworCQl2cGEuYXZwX25hbWUgPSAiU01TLUluZm9ybWF0aW9uIjsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZ2cGEsICZydWxlX2F2cCk7CisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQkJeworCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU01TLU5vZGUiIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDbGllbnQtQWRkcmVzcyIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk9yaWdpbmF0b3ItU0NDUC1BZGRyZXNzIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU01TQy1BZGRyZXNzIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRGF0YS1Db2RpbmctU2NoZW1lIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU00tRGlzY2hhcmdlLVRpbWUiIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTTS1NZXNzYWdlLVR5cGUiIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJPcmlnaW5hdG9yLUludGVyZmFjZSIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNNLVByb3RvY29sLUlEIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUmVwbHktUGF0aC1SZXF1ZXN0ZWQiIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTTS1TdGF0dXMiIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTTS1Vc2VyLURhdGEtSGVhZGVyIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTnVtYmVyLU9mLU1lc3NhZ2VzLVNlbnQiIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJSZWNpcGllbnQtSW5mbyIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJPcmlnaW5hdG9yLVJlY2VpdmVkLUFkZHJlc3MiIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTTS1TZXJ2aWNlLVR5cGUiIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQl9OworCQkJUEFSU0VfbG9jX3J1bGVzKHJ1bGVzLCBydWxlX2F2cCk7CisgICAgICAgIH0KKworCXsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICpydWxlX2F2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgdnBhOworCQl2cGEuYXZwX3ZlbmRvciA9IDEwNDE1OworCQl2cGEuYXZwX25hbWUgPSAiVGltZS1RdW90YS1NZWNoYW5pc20iOworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJnZwYSwgJnJ1bGVfYXZwKTsKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCQl7CisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUaW1lLVF1b3RhLVR5cGUiIH0sIFJVTEVfUkVRVUlSRUQsIC0xLCAxIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJCYXNlLVRpbWUtSW50ZXJ2YWwiIH0sIFJVTEVfUkVRVUlSRUQsIC0xLCAxIH0sCisJCQl9OworCQkJUEFSU0VfbG9jX3J1bGVzKHJ1bGVzLCBydWxlX2F2cCk7CisgICAgICAgIH0KKworCXsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICpydWxlX2F2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgdnBhOworCQl2cGEuYXZwX3ZlbmRvciA9IDEwNDE1OworCQl2cGEuYXZwX25hbWUgPSAiVGltZS1TdGFtcHMiOworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJnZwYSwgJnJ1bGVfYXZwKTsKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCQl7CisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTSVAtUmVxdWVzdC1UaW1lc3RhbXAiIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTSVAtUmVzcG9uc2UtVGltZXN0YW1wIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU0lQLVJlcXVlc3QtVGltZXN0YW1wLUZyYWN0aW9uIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU0lQLVJlc3BvbnNlLVRpbWVzdGFtcC1GcmFjdGlvbiIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCX07CisJCQlQQVJTRV9sb2NfcnVsZXMocnVsZXMsIHJ1bGVfYXZwKTsKKyAgICAgICAgfQorCisJeworCQkvKiBVc2VkLVNlcnZpY2UtVW5pdCAqLworCQkvKiBhZGRpdGlvbmFsIGFsbG93ZWQgQVZQcyAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKnJ1bGVfYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCB2cGE7CisJCXZwYS5hdnBfdmVuZG9yID0gMDsKKwkJdnBhLmF2cF9uYW1lID0gIlVzZWQtU2VydmljZS1Vbml0IjsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZ2cGEsICZydWxlX2F2cCk7CisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQkJeworCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUmVwb3J0aW5nLVJlYXNvbiIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkV2ZW50LUNoYXJnaW5nLVRpbWVTdGFtcCIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl9OworCQlQQVJTRV9sb2NfcnVsZXMocnVsZXMsIHJ1bGVfYXZwKTsKKyAgICAgICAgfQorCisJLyogT01BICovCisJeworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKnJ1bGVfYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCB2cGE7CisJCXZwYS5hdnBfdmVuZG9yID0gMTA0MTU7CisJCXZwYS5hdnBfbmFtZSA9ICJEQ0QtSW5mb3JtYXRpb24iOworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJnZwYSwgJnJ1bGVfYXZwKTsKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCQl7CisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDb250ZW50LUlEIiB9LCBSVUxFX09QVElPTkFMLCAtMSwgMSB9LAorCQkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ29udGVudC1wcm92aWRlci1JRCIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCX07CisJCQlQQVJTRV9sb2NfcnVsZXMocnVsZXMsIHJ1bGVfYXZwKTsKKyAgICAgICAgfQorCXsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICpydWxlX2F2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgdnBhOworCQl2cGEuYXZwX3ZlbmRvciA9IDEwNDE1OworCQl2cGEuYXZwX25hbWUgPSAiSU0tSW5mb3JtYXRpb24iOworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJnZwYSwgJnJ1bGVfYXZwKTsKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCQl7CisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUb3RhbC1OdW1iZXItT2YtTWVzc2FnZXMtU2VudCIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlRvdGFsLU51bWJlci1PZi1NZXNzYWdlcy1FeHBsb2RlZCIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk51bWJlci1PZi1NZXNzYWdlcy1TdWNjZXNzZnVsbHktU2VudCIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk51bWJlci1PZi1NZXNzYWdlcy1TdWNjZXNzZnVsbHktRXhwbG9kZWQiIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQl9OworCQkJUEFSU0VfbG9jX3J1bGVzKHJ1bGVzLCBydWxlX2F2cCk7CisgICAgICAgIH0KKwl7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqcnVsZV9hdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IHZwYTsKKwkJdnBhLmF2cF92ZW5kb3IgPSAxMDQxNTsKKwkJdnBhLmF2cF9uYW1lID0gIlNlcnZpY2UtR2VuZXJpYy1JbmZvcm1hdGlvbiI7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmdnBhLCAmcnVsZV9hdnApOworCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJCXsKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFwcGxpY2F0aW9uLVNlcnZlci1JZCIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFwcGxpY2F0aW9uLVNlcnZpY2UtVHlwZSIgfSwgUlVMRV9PUFRJT05BTCwgLTEsIDEgfSwKKwkJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFwcGxpY2F0aW9uLVNlc3Npb24tSWQiIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJEZWxpdmVyeS1TdGF0dXMiIH0sIFJVTEVfT1BUSU9OQUwsIC0xLCAxIH0sCisJCQl9OworCQkJUEFSU0VfbG9jX3J1bGVzKHJ1bGVzLCBydWxlX2F2cCk7CisgICAgICAgIH0KKwkKKwlMT0dfRCggIkV4dGVuc2lvbiAnRGljdGlvbmFyeSBkZWZpbml0aW9ucyBmb3IgRENDQSAzR1BQJyBpbml0aWFsaXplZCIpOworCXJldHVybiAwOworfQorCitFWFRFTlNJT05fRU5UUlkoImRpY3RfZGNjYV8zZ3BwIiwgZGljdF9kY2NhXzNncHBfZW50cnksICJkaWN0X2RjY2EiKTsKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF9kY2NhXzNncHAvZGljdF9kY2NhXzNncHAub3JnIGIvZXh0ZW5zaW9ucy9kaWN0X2RjY2FfM2dwcC9kaWN0X2RjY2FfM2dwcC5vcmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdlYjM0ZgotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF9kY2NhXzNncHAvZGljdF9kY2NhXzNncHAub3JnCkBAIC0wLDAgKzEsNzg5IEBACit8IEF0dHJpYnV0ZSBOYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBDb2RlIHwgU2VjdGlvbiBkZWZpbmVkIHwgVmFsdWUgVHlwZSAgICAgICB8IE1VU1QgfCBNQVkgfCBTSExEIE5PVCB8IE1VU1QgTk9UIHwgRW5jciB8Cit8ICMgM0dQUCAyOS4wNjEtYzAwICgxMi4wLjAgMjAxMi4xMi4yMCkgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8ICMgM0dQUCAyOS4wNjEgaXMgbm90IHZlcnkgY2xlYXIgYW5kIHNlbGYtaW5jb25zaXN0ZW50IGFib3V0IE0gfCAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8ICMgZm9yIHRoaXMgcmVhc29uLCBvdGhlciBzb3VyY2VzIGFyZSBhc3N1bWVkIG1vcmUgdHJ1c3R3b3J0aHkgfCAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8ICMgTSBpbmNvbnNpc3RlbnRseSBzcGVjaWZpZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IDNHUFAtSU1TSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAxIHwgICAgICAgICAgMTYuNC43IHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8ICMgMjkuMDYxIHNheXMgT2N0ZXRTdHJpbmc7IGR1bXBzIHNheSBVSW50MzI7IG1hbnVhbGx5IGNoYW5nZWQgfCAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8ICMgMjkuMDYxIHNheXMgTVVTVCBOT1QgTTsgZHVtcHMgc2F5IE1VU1QgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IDNHUFAtQ2hhcmdpbmctSWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAyIHwgICAgICAgICAgMTYuNC43IHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8ICMgMjkuMDYxIHNheXMgTVVTVCBOT1QgTTsgZHVtcHMgc2F5IE1VU1QgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IDNHUFAtUERQLVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAzIHwgICAgICAgICAgMTYuNC43IHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IDNHUFAtQ0ctQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA0IHwgICAgICAgICAgMTYuNC43IHwgT2N0ZXRTdHJpbmcgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgICAgICB8Cit8ICMgMjkuMDYxIHNheXMgTVVTVCBOT1QgTTsgb2xkIGNvbnRyaWIvM2dwcCBzYXlzIE1VU1QgICAgICAgICAgfCAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IDNHUFAtR1BSUy1OZWdvdGlhdGVkLVFvUy1Qcm9maWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA1IHwgICAgICAgICAgMTYuNC43IHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8ICMgTSBpbmNvbnNpc3RlbnRseSBzcGVjaWZpZWQ7IG9sZCBjb250cmliLzNnZyBzYXlzIE1VU1QgTk9UICAgfCAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IDNHUFAtU0dTTi1BZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA2IHwgICAgICAgICAgMTYuNC43IHwgT2N0ZXRTdHJpbmcgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgICAgICB8Cit8IDNHUFAtR0dTTi1BZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA3IHwgICAgICAgICAgMTYuNC43IHwgT2N0ZXRTdHJpbmcgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgICAgICB8Cit8ICMgMjkuMDYxIHNheXMgTVVTVCBOT1QgTTsgZHVtcHMgc2F5IE1VU1QgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IDNHUFAtSU1TSS1NQ0MtTU5DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA4IHwgICAgICAgICAgMTYuNC43IHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8ICMgMjkuMDYxIHNheXMgTVVTVCBOT1QgTTsgb2xkIGNvbnRyaWIvM2dwcCBzYXlzIE1VU1QgICAgICAgICAgfCAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IDNHUFAtR0dTTi1NQ0MtTU5DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA5IHwgICAgICAgICAgMTYuNC43IHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8ICMgMjkuMDYxIHNheXMgTVVTVCBOT1QgTTsgb2xkIGNvbnRyaWIvM2dwcCBzYXlzIE1VU1QgICAgICAgICAgfCAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IDNHUFAtTlNBUEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDEwIHwgICAgICAgICAgMTYuNC43IHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8ICMgYWRkZWQgbWFudWFsbHksIG1pc3NpbmcgaW4gQVZQIHRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IDNHUFAtU2Vzc2lvbi1TdG9wLUluZGljYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDExIHwgICAgICAgICAgMTYuNC43IHwgT2N0ZXRTdHJpbmcgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgICAgICB8Cit8ICMgMjkuMDYxIHNheXMgTVVTVCBOT1QgTTsgb2xkIGNvbnRyaWIvM2dwcCBzYXlzIE1VU1QgICAgICAgICAgfCAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IDNHUFAtU2VsZWN0aW9uLU1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDEyIHwgICAgICAgICAgMTYuNC43IHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8ICMgMjkuMDYxIHNheXMgTVVTVCBOT1QgTTsgb2xkIGNvbnRyaWIvM2dwcCBzYXlzIE1VU1QgICAgICAgICAgfCAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IDNHUFAtQ2hhcmdpbmctQ2hhcmFjdGVyaXN0aWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDEzIHwgICAgICAgICAgMTYuNC43IHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8ICMgMjkuMDYxIHNheXMgTVVTVCBOT1QgTTsgb2xkIGNvbnRyaWIvM2dwcCBzYXlzIE1VU1QgICAgICAgICAgfCAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IDNHUFAtQ0ctSVB2Ni1BZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDE0IHwgICAgICAgICAgMTYuNC43IHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8ICMgTSBpbmNvbnNpc3RlbnRseSBzcGVjaWZpZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8ICMgMjkuMDYxIHNheXMgTVVTVCBOT1QgTTsgb2xkIGNvbnRyaWIvM2dwcCBzYXlzIE1VU1QgICAgICAgICAgfCAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IDNHUFAtU0dTTi1JUHY2LUFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDE1IHwgICAgICAgICAgMTYuNC43IHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8ICMgMjkuMDYxIHNheXMgTVVTVCBOT1QgTTsgb2xkIGNvbnRyaWIvM2dwcCBzYXlzIE1VU1QgICAgICAgICAgfCAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IDNHUFAtR0dTTi1JUHY2LUFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDE2IHwgICAgICAgICAgMTYuNC43IHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8ICMgMjkuMDYxIHNheXMgTVVTVCBOT1QgTTsgb2xkIGNvbnRyaWIvM2dwcCBzYXlzIE1VU1QgICAgICAgICAgfCAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IDNHUFAtSVB2Ni1ETlMtU2VydmVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDE3IHwgICAgICAgICAgMTYuNC43IHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8ICMgMjkuMDYxIHNheXMgTVVTVCBOT1QgTTsgb2xkIGNvbnRyaWIvM2dwcCBzYXlzIE1VU1QgICAgICAgICAgfCAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IDNHUFAtU0dTTi1NQ0MtTU5DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDE4IHwgICAgICAgICAgMTYuNC43IHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8ICMgTSBpbmNvbnNpc3RlbnRseSBzcGVjaWZpZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IDNHUFAtSU1FSVNWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDIwIHwgICAgICAgICAgMTYuNC43IHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8ICMgTSBpbmNvbnNpc3RlbnRseSBzcGVjaWZpZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IDNHUFAtUkFULVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDIxIHwgICAgICAgICAgMTYuNC43IHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8ICMgTSBpbmNvbnNpc3RlbnRseSBzcGVjaWZpZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IDNHUFAtVXNlci1Mb2NhdGlvbi1JbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDIyIHwgICAgICAgICAgMTYuNC43IHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8ICMgTSBpbmNvbnNpc3RlbnRseSBzcGVjaWZpZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IDNHUFAtTVMtVGltZVpvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDIzIHwgICAgICAgICAgMTYuNC43IHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IDNHUFAtQ0FNRUwtQ2hhcmdpbmctSW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDI0IHwgICAgICAgICAgMTYuNC43IHwgT2N0ZXRTdHJpbmcgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgICAgICB8Cit8IDNHUFAtUGFja2V0LUZpbHRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDI1IHwgICAgICAgICAgMTYuNC43IHwgT2N0ZXRTdHJpbmcgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgICAgICB8Cit8IDNHUFAtTmVnb3RpYXRlZC1EU0NQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDI2IHwgICAgICAgICAgMTYuNC43IHwgT2N0ZXRTdHJpbmcgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgICAgICB8Cit8IDNHUFAtQWxsb2NhdGUtSVAtVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDI3IHwgICAgICAgICAgMTYuNC43IHwgT2N0ZXRTdHJpbmcgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgICAgICB8Cit8ICMgYWRkZWQgbWFudWFsbHksIG1pc3NpbmcgaW4gQVZQIHRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IEV4dGVybmFsLUlkZW50aWZpZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDI4IHwgICAgICAgICAgMTYuNC43IHwgT2N0ZXRTdHJpbmcgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgICAgICB8Cit8IFRNR0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgOTAwIHwgICAgICAgIDE3LjA3LjAyIHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IFJlcXVpcmVkLU1CTVMtQmVhcmVyLUNhcGFiaWxpdGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgOTAxIHwgICAgICAgIDE3LjA3LjAzIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IE1CTVMtU3RhcnRTdG9wLUluZGljYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgOTAyIHwgICAgICAgIDE3LjA3LjA1IHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IE1CTVMtU2VydmljZS1BcmVhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgOTAzIHwgICAgICAgIDE3LjA3LjA2IHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IE1CTVMtU2Vzc2lvbi1EdXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgOTA0IHwgICAgICAgIDE3LjA3LjA3IHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IEFsdGVybmF0aXZlLUFQTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgOTA1IHwgICAgICAgIDE3LjA3LjA4IHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IE1CTVMtU2VydmljZS1UeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgOTA2IHwgICAgICAgIDE3LjA3LjA5IHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IE1CTVMtMkctM0ctSW5kaWNhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgOTA3IHwgICAgICAgIDE3LjA3LjEwIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IE1CTVMtU2Vzc2lvbi1JZGVudGl0eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgOTA4IHwgICAgICAgIDE3LjA3LjExIHwgT2N0ZXRTdHJpbmcgICAgICB8IE0uViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IFJBSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgOTA5IHwgICAgICAgIDE3LjA3LjEyIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IEFkZGl0aW9uYWwtTUJNUy1UcmFjZS1JbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgOTEwIHwgICAgICAgIDE3LjA3LjEzIHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IE1CTVMtVGltZS1Uby1EYXRhLVRyYW5zZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgOTExIHwgICAgICAgIDE3LjA3LjE0IHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IE1CTVMtU2Vzc2lvbi1SZXBldGl0aW9uLU51bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgOTEyIHwgICAgICAgIDE3LjA3LjE1IHwgT2N0ZXRTdHJpbmcgICAgICB8IE0uViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IE1CTVMtUmVxdWlyZWQtUW9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgOTEzIHwgICAgICAgIDE3LjA3LjE2IHwgVVRGOFN0cmluZyAgICAgICB8IE0uViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IE1CTVMtQ291bnRpbmctSW5mb3JtYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgOTE0IHwgICAgICAgIDE3LjA3LjE3IHwgRW51bWVyYXRlZCAgICAgICB8IE0uViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IE1CTVMtVXNlci1EYXRhLU1vZGUtSW5kaWNhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgOTE1IHwgICAgICAgIDE3LjA3LjE4IHwgRW51bWVyYXRlZCAgICAgICB8IE0uViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IE1CTVMtR0dTTi1BZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgOTE2IHwgICAgICAgIDE3LjA3LjE5IHwgT2N0ZXRTdHJpbmcgICAgICB8IE0uViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IE1CTVMtR0dTTi1JUHY2LUFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgOTE3IHwgICAgICAgIDE3LjA3LjIwIHwgT2N0ZXRTdHJpbmcgICAgICB8IE0uViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IE1CTVMtQk1TQy1TU00tSVAtQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgOTE4IHwgICAgICAgIDE3LjA3LjIxIHwgT2N0ZXRTdHJpbmcgICAgICB8IE0uViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IE1CTVMtQk1TQy1TU00tSVB2Ni1BZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgOTE5IHwgICAgICAgIDE3LjA3LjIyIHwgT2N0ZXRTdHJpbmcgICAgICB8IE0uViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IE1CTVMtRmxvdy1JZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgOTIwIHwgICAgICAgICAxNy43LjIzIHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IENOLUlQLU11bHRpY2FzdC1EaXN0cmlidXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgOTIxIHwgICAgICAgICAxNy43LjI0IHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IE1CTVMtSEMtSW5kaWNhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgOTIyIHwgICAgICAgICAxNy43LjI1IHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8ICMgM0dQUCAyOS4xNDAtNzAwICg3LjAuMCAyMDA3LjA3LjA1KSAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IFNlcnZlZC1Vc2VyLUlkZW50aXR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMTAwIHwgICAgICAgICAgIDYuMy4xIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8ICMgcmV1c2VzOiBNU0lTRE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNzAxIHwgICAgICAgICAgIDYuMy4yIHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFZBU1AtSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMTAxIHwgICAgICAgICAgIDYuMy4zIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFZBUy1JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMTAyIHwgICAgICAgICAgIDYuMy40IHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFRyaWdnZXItRXZlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMTAzIHwgICAgICAgICAgIDYuMy41IHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8ICMgcmV1c2VzOiAzR1BQLUlNU0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAxIHwgICAgICAgICAgIDYuMy42IHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNlbmRlci1BZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMTA0IHwgICAgICAgICAgIDYuMy43IHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEluaXRpYWwtUmVjaXBpZW50LUFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMTA1IHwgICAgICAgICAgIDYuMy44IHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFJlc3VsdC1SZWNpcGllbnQtQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMTA2IHwgICAgICAgICAgIDYuMy45IHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8ICMgY29uZmxpY3RzIHdpdGggb25lIGluIChtb3JlIGNvbW1vbikgMzIuMzI5ICAgICAgICAgICAgICAgICAgfCAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IFNlcXVlbmNlLU51bWJlci0yOS4xNDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMTA3IHwgICAgICAgICAgNi4zLjEwIHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8ICMgY29uZmxpY3RzIHdpdGggb25lIGluIChtb3JlIGNvbW1vbikgMzIuMjk5ICAgICAgICAgICAgICAgICAgfCAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IFJlY2lwaWVudC1BZGRyZXNzLTI5LjE0MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMTA4IHwgICAgICAgICAgNi4zLjExIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFJvdXRlaW5nLUFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMTA5IHwgICAgICAgICAgNi4zLjEyIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IE9yaWdpbmF0aW5nLUludGVyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMTEwIHwgICAgICAgICAgNi4zLjEzIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IERlbGl2ZXJ5LVJlcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMTExIHwgICAgICAgICAgNi4zLjE0IHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFJlYWQtUmVwbHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMTEyIHwgICAgICAgICAgNi4zLjE1IHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNlbmRlci1WaXNpYmlsaXR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMTEzIHwgICAgICAgICAgNi4zLjE2IHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNlcnZpY2UtS2V5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMTE0IHwgICAgICAgICAgNi4zLjE3IHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEJpbGxpbmctSW5mb3JtYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMTE1IHwgICAgICAgICAgNi4zLjE4IHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8ICMgY29uZmxpY3RzIHdpdGggb25lIGluIChtb3JlIGNvbW1vbikgMzIuMjk5ICAgICAgICAgICAgICAgICAgfCAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IFN0YXR1cy0yOS4xNDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMTE2IHwgICAgICAgICAgNi4zLjE5IHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFN0YXR1cy1Db2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMTE3IHwgICAgICAgICAgNi4zLjIwIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFN0YXR1cy1UZXh0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMTE4IHwgICAgICAgICAgNi4zLjIxIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFJvdXRlaW5nLUFkZHJlc3MtUmVzb2x1dGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMTE5IHwgICAgICAgICAgNi4zLjIyIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8ICMgM0dQUCAyOS4xNzMtYzAwICgxMi4wLjAgMjAxMy4wMy4xMykgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IExNU0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyNDAwIHwgICAgICAgICAgIDYuNC4yIHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNlcnZpbmctTm9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyNDAxIHwgICAgICAgICAgIDYuNC4zIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IE1NRS1OYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyNDAyIHwgICAgICAgICAgIDYuNC40IHwgRGlhbWV0ZXJJZGVudGl0eSB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IE1TQy1OdW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyNDAzIHwgICAgICAgICAgIDYuNC41IHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IExDUy1DYXBhYmlsaXRpZXMtU2V0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyNDA0IHwgICAgICAgICAgIDYuNC42IHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEdNTEMtQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyNDA1IHwgICAgICAgICAgIDYuNC43IHwgQWRkcmVzcyAgICAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEFkZGl0aW9uYWwtU2VydmluZy1Ob2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyNDA2IHwgICAgICAgICAgIDYuNC44IHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFBQUi1BZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyNDA3IHwgICAgICAgICAgIDYuNC45IHwgQWRkcmVzcyAgICAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IE1NRS1SZWFsbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyNDA4IHwgICAgICAgICAgNi40LjEyIHwgRGlhbWV0ZXJJZGVudGl0eSB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IFNHU04tTmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyNDA5IHwgICAgICAgICAgNi40LjEzIHwgRGlhbWV0ZXJJZGVudGl0eSB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IFNHU04tUmVhbG0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyNDEwIHwgICAgICAgICAgNi40LjE0IHwgRGlhbWV0ZXJJZGVudGl0eSB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8ICMgM0dQUCAyOS4yMTAtNjcwICg2LjcuMCAyMDA2LTEyLTE4KSAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IFBEUC1TZXNzaW9uLU9wZXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDE1IHwgICAgICAgICAgNS4yLjIxIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8ICMgM0dQUCAyOS4yMTItYzAwICgxMi4wLjAgMjAxMy4wMy4xNSkgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8ICMgR3gtc3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IEFEQy1SZXZhbGlkYXRpb24tVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyODAxIHwgICAgICAgICAgNS4zLjkzIHwgVGltZSAgICAgICAgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IEFEQy1SdWxlLUluc3RhbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDkyIHwgICAgICAgICAgNS4zLjg1IHwgR3JvdXBlZCAgICAgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IEFEQy1SdWxlLVJlbW92ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDkzIHwgICAgICAgICAgNS4zLjg2IHwgR3JvdXBlZCAgICAgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IEFEQy1SdWxlLURlZmluaXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDk0IHwgICAgICAgICAgNS4zLjg3IHwgR3JvdXBlZCAgICAgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IEFEQy1SdWxlLUJhc2UtTmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDk1IHwgICAgICAgICAgNS4zLjg4IHwgVVRGOFN0cmluZyAgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IEFEQy1SdWxlLU5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDk2IHwgICAgICAgICAgNS4zLjg5IHwgT2N0ZXRTdHJpbmcgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IEFEQy1SdWxlLVJlcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDk3IHwgICAgICAgICAgNS4zLjkwIHwgR3JvdXBlZCAgICAgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IEFwcGxpY2F0aW9uLURldGVjdGlvbi1JbmZvcm1hdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDk4IHwgICAgICAgICAgNS4zLjkxIHwgR3JvdXBlZCAgICAgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IEFjY2Vzcy1OZXR3b3JrLUNoYXJnaW5nLUlkZW50aWZpZXItR3ggICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDIyIHwgICAgICAgICAgNS4zLjIyIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IEFsbG9jYXRpb24tUmV0ZW50aW9uLVByaW9yaXR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDM0IHwgICAgICAgICAgNS4zLjMyIHwgR3JvdXBlZCAgICAgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IEFOLUdXLUFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDUwIHwgICAgICAgICAgNS4zLjQ5IHwgQWRkcmVzcyAgICAgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IEFQTi1BZ2dyZWdhdGUtTWF4LUJpdHJhdGUtREwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDQwIHwgICAgICAgICAgNS4zLjM5IHwgVW5zaWduZWQzMiAgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IEFQTi1BZ2dyZWdhdGUtTWF4LUJpdHJhdGUtVUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDQxIHwgICAgICAgICAgNS4zLjQwIHwgVW5zaWduZWQzMiAgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IEJlYXJlci1Db250cm9sLU1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDIzIHwgICAgICAgICAgNS4zLjIzIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IEJlYXJlci1JZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDIwIHwgICAgICAgICAgNS4zLjIwIHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IEJlYXJlci1PcGVyYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDIxIHwgICAgICAgICAgNS4zLjIxIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IEJlYXJlci1Vc2FnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDAwIHwgICAgICAgICAgIDUuMy4xIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IENoYXJnaW5nLVJ1bGUtSW5zdGFsbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDAxIHwgICAgICAgICAgIDUuMy4yIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IENoYXJnaW5nLVJ1bGUtUmVtb3ZlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDAyIHwgICAgICAgICAgIDUuMy4zIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IENoYXJnaW5nLVJ1bGUtRGVmaW5pdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDAzIHwgICAgICAgICAgIDUuMy40IHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IENoYXJnaW5nLVJ1bGUtQmFzZS1OYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDA0IHwgICAgICAgICAgIDUuMy41IHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IENoYXJnaW5nLVJ1bGUtTmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDA1IHwgICAgICAgICAgIDUuMy42IHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IENoYXJnaW5nLVJ1bGUtUmVwb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDE4IHwgICAgICAgICAgNS4zLjE4IHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IENoYXJnaW5nLUNvcnJlbGF0aW9uLUluZGljYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDczIHwgICAgICAgICAgNS4zLjY3IHwgRW51bWVyYXRlZCAgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IENvQS1JUC1BZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDM1IHwgICAgICAgICAgNS4zLjMzIHwgQWRkcmVzcyAgICAgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IENvQS1JbmZvcm1hdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDM5IHwgICAgICAgICAgNS4zLjM3IHwgR3JvdXBlZCAgICAgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IENTRy1JbmZvcm1hdGlvbi1SZXBvcnRpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDcxIHwgICAgICAgICAgNS4zLjY0IHwgRW51bWVyYXRlZCAgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IERlZmF1bHQtRVBTLUJlYXJlci1Rb1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDQ5IHwgICAgICAgICAgNS4zLjQ4IHwgR3JvdXBlZCAgICAgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IEV2ZW50LVJlcG9ydC1JbmRpY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDMzIHwgICAgICAgICAgNS4zLjMwIHwgR3JvdXBlZCAgICAgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IEV2ZW50LVRyaWdnZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDA2IHwgICAgICAgICAgIDUuMy43IHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IEZsb3ctRGlyZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDgwIHwgICAgICAgICAgNS4zLjY1IHwgRW51bWVyYXRlZCAgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IEZsb3ctSW5mb3JtYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDU4IHwgICAgICAgICAgNS4zLjUzIHwgR3JvdXBlZCAgICAgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IEZsb3ctTGFiZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDU3IHwgICAgICAgICAgNS4zLjUyIHwgT2N0ZXRTdHJpbmcgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IElQLUNBTi1UeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDI3IHwgICAgICAgICAgNS4zLjI3IHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IEd1YXJhbnRlZWQtQml0cmF0ZS1ETCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDI1IHwgICAgICAgICAgNS4zLjI1IHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IEd1YXJhbnRlZWQtQml0cmF0ZS1VTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDI2IHwgICAgICAgICAgNS4zLjI2IHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IEhlTkItTG9jYWwtSVAtQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyODA0IHwgICAgICAgICAgNS4zLjk1IHwgQWRkcmVzcyAgICAgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IE1ldGVyaW5nLU1ldGhvZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDA3IHwgICAgICAgICAgIDUuMy44IHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IE1vbml0b3JpbmctS2V5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDY2IHwgICAgICAgICAgNS4zLjU5IHwgT2N0ZXRTdHJpbmcgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IE11dGUtTm90aWZpY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyODA5IHwgICAgICAgICAgNS4zLjk4IHwgRW51bWVyYXRlZCAgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IE1vbml0b3JpbmctVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyODEwIHwgICAgICAgICAgNS4zLjk5IHwgVGltZSAgICAgICAgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IE5ldHdvcmstUmVxdWVzdC1TdXBwb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDI0IHwgICAgICAgICAgNS4zLjI0IHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IE9mZmxpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDA4IHwgICAgICAgICAgIDUuMy45IHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IE9ubGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDA5IHwgICAgICAgICAgNS4zLjEwIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IFBhY2tldC1GaWx0ZXItQ29udGVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDU5IHwgICAgICAgICAgNS4zLjU0IHwgSVBGaWx0ZXJSdWxlICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IFBhY2tldC1GaWx0ZXItSWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDYwIHwgICAgICAgICAgNS4zLjU1IHwgT2N0ZXRTdHJpbmcgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IFBhY2tldC1GaWx0ZXItSW5mb3JtYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDYxIHwgICAgICAgICAgNS4zLjU2IHwgR3JvdXBlZCAgICAgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IFBhY2tldC1GaWx0ZXItT3BlcmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDYyIHwgICAgICAgICAgNS4zLjU3IHwgRW51bWVyYXRlZCAgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IFBhY2tldC1GaWx0ZXItVXNhZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDcyIHwgICAgICAgICAgNS4zLjY2IHwgRW51bWVyYXRlZCAgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IFBETi1Db25uZWN0aW9uLUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDY1IHwgICAgICAgICAgNS4zLjU4IHwgT2N0ZXRTdHJpbmcgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IFByZWNlZGVuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDEwIHwgICAgICAgICAgNS4zLjExIHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IFByZS1lbXB0aW9uLUNhcGFiaWxpdHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDQ3IHwgICAgICAgICAgNS4zLjQ2IHwgRW51bWVyYXRlZCAgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IFByZS1lbXB0aW9uLVZ1bG5lcmFiaWxpdHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDQ4IHwgICAgICAgICAgNS4zLjQ3IHwgRW51bWVyYXRlZCAgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IFByaW9yaXR5LUxldmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDQ2IHwgICAgICAgICAgNS4zLjQ1IHwgVW5zaWduZWQzMiAgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IFJlZGlyZWN0LUluZm9ybWF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDg1IHwgICAgICAgICAgNS4zLjgyIHwgR3JvdXBlZCAgICAgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IFJlZGlyZWN0LVN1cHBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDg2IHwgICAgICAgICAgNS4zLjgzIHwgRW51bWVyYXRlZCAgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IFJlcG9ydGluZy1MZXZlbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDExIHwgICAgICAgICAgNS4zLjEyIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IFJvdXRpbmctRmlsdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDc4IHwgICAgICAgICAgNS4zLjcyIHwgR3JvdXBlZCAgICAgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IFJvdXRpbmctSVAtQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDc5IHwgICAgICAgICAgNS4zLjczIHwgQWRkcmVzcyAgICAgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IFJvdXRpbmctUnVsZS1EZWZpbml0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDc2IHwgICAgICAgICAgNS4zLjcwIHwgR3JvdXBlZCAgICAgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IFJvdXRpbmctUnVsZS1JZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDc3IHwgICAgICAgICAgNS4zLjcxIHwgT2N0ZXRTdHJpbmcgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IFJvdXRpbmctUnVsZS1JbnN0YWxsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDgxIHwgICAgICAgICAgNS4zLjY4IHwgR3JvdXBlZCAgICAgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IFJvdXRpbmctUnVsZS1SZW1vdmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDc1IHwgICAgICAgICAgNS4zLjY5IHwgR3JvdXBlZCAgICAgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IFBDQy1SdWxlLVN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDE5IHwgICAgICAgICAgNS4zLjE5IHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IFNlc3Npb24tUmVsZWFzZS1DYXVzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDQ1IHwgICAgICAgICAgNS4zLjQ0IHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IFRERi1JbmZvcm1hdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDg3IHwgICAgICAgICAgNS4zLjc4IHwgR3JvdXBlZCAgICAgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IFRERi1BcHBsaWNhdGlvbi1JZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDg4IHwgICAgICAgICAgNS4zLjc3IHwgT2N0ZXRTdHJpbmcgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IFRERi1BcHBsaWNhdGlvbi1JbnN0YW5jZS1JZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyODAyIHwgICAgICAgICAgNS4zLjkyIHwgT2N0ZXRTdHJpbmcgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IFRERi1EZXN0aW5hdGlvbi1Ib3N0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDg5IHwgICAgICAgICAgNS4zLjgwIHwgRGlhbWV0ZXJJZGVudGl0eSB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IFRERi1EZXN0aW5hdGlvbi1SZWFsbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDkwIHwgICAgICAgICAgNS4zLjc5IHwgRGlhbWV0ZXJJZGVudGl0eSB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IFRERi1JUC1BZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDkxIHwgICAgICAgICAgNS4zLjgxIHwgQWRkcmVzcyAgICAgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IFFvUy1DbGFzcy1JZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDI4IHwgICAgICAgICAgNS4zLjE3IHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IFFvUy1JbmZvcm1hdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDE2IHwgICAgICAgICAgNS4zLjE2IHwgR3JvdXBlZCAgICAgICAgICB8IE0uViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IFFvUy1OZWdvdGlhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDI5IHwgICAgICAgICAgNS4zLjI4IHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IFFvUy1VcGdyYWRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDMwIHwgICAgICAgICAgNS4zLjI5IHwgRW51bWVyYXRlZCAgICAgICB8IE0uViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IFBTLXRvLUNTLVNlc3Npb24tQ29udGludWl0eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDk5IHwgICAgICAgICAgNS4zLjg0IHwgRW51bWVyYXRlZCAgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IFJlc291cmNlLUFsbG9jYXRpb24tTm90aWZpY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDYzIHwgICAgICAgICAgNS4zLjUwIHwgRW51bWVyYXRlZCAgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IFJ1bGUtRmFpbHVyZS1Db2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDMxIHwgICAgICAgICAgNS4zLjM4IHwgRW51bWVyYXRlZCAgICAgICB8IE0uViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IFNlY3VyaXR5LVBhcmFtZXRlci1JbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDU2IHwgICAgICAgICAgNS4zLjUxIHwgT2N0ZXRTdHJpbmcgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IFRGVC1GaWx0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDEyIHwgICAgICAgICAgNS4zLjEzIHwgSVBGaWx0ZXJSdWxlICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IFRGVC1QYWNrZXQtRmlsdGVyLUluZm9ybWF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDEzIHwgICAgICAgICAgNS4zLjE0IHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IFRvUy1UcmFmZmljLUNsYXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDE0IHwgICAgICAgICAgNS4zLjE1IHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IFR1bm5lbC1IZWFkZXItRmlsdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDM2IHwgICAgICAgICAgNS4zLjM0IHwgSVBGaWx0ZXJSdWxlICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IFR1bm5lbC1IZWFkZXItTGVuZ3RoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDM3IHwgICAgICAgICAgNS4zLjM1IHwgVW5zaWduZWQzMiAgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IFR1bm5lbC1JbmZvcm1hdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDM4IHwgICAgICAgICAgNS4zLjM2IHwgR3JvdXBlZCAgICAgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IFJBVC1UeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDMyIHwgICAgICAgICAgNS4zLjMxIHwgRW51bWVyYXRlZCAgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IFJldmFsaWRhdGlvbi1UaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDQyIHwgICAgICAgICAgNS4zLjQxIHwgVGltZSAgICAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IFJ1bGUtQWN0aXZhdGlvbi1UaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDQzIHwgICAgICAgICAgNS4zLjQyIHwgVGltZSAgICAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IFVEUC1Tb3VyY2UtUG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyODA2IHwgICAgICAgICAgNS4zLjk3IHwgVW5zaWduZWQzMiAgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IFVFLUxvY2FsLUlQLUFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyODA1IHwgICAgICAgICAgNS4zLjk2IHwgQWRkcmVzcyAgICAgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IFVzYWdlLU1vbml0b3JpbmctSW5mb3JtYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDY3IHwgICAgICAgICAgNS4zLjYwIHwgR3JvdXBlZCAgICAgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IFJ1bGUtRGVhY3RpdmF0aW9uLVRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDQ0IHwgICAgICAgICAgNS4zLjQzIHwgVGltZSAgICAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IFVzYWdlLU1vbml0b3JpbmctTGV2ZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDY4IHwgICAgICAgICAgNS4zLjYxIHwgRW51bWVyYXRlZCAgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IFVzYWdlLU1vbml0b3JpbmctUmVwb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDY5IHwgICAgICAgICAgNS4zLjYyIHwgRW51bWVyYXRlZCAgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IFVzYWdlLU1vbml0b3JpbmctU3VwcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDcwIHwgICAgICAgICAgNS4zLjYzIHwgRW51bWVyYXRlZCAgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8ICMgR3h4LXNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IFFvUy1SdWxlLUluc3RhbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDUxIHwgICAgICAgICAgNWEuMy4xIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IFFvUy1SdWxlLVJlbW92ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDUyIHwgICAgICAgICAgNWEuMy4yIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IFFvUy1SdWxlLURlZmluaXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDUzIHwgICAgICAgICAgNWEuMy4zIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IFFvUy1SdWxlLU5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDU0IHwgICAgICAgICAgNWEuMy40IHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IFFvUy1SdWxlLUJhc2UtTmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDc0IHwgICAgICAgICAgNWEuMy43IHwgVVRGOFN0cmluZyAgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IFFvUy1SdWxlLVJlcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDU1IHwgICAgICAgICAgNWEuMy41IHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IFNlc3Npb24tTGlua2luZy1JbmRpY2F0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDY0IHwgICAgICAgICAgNWEuMy42IHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8ICMgUzE1LXNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IENTLVNlcnZpY2UtUW9zLVJlcXVlc3QtSWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyODA3IHwgICAgICAgICBFLjYuMy4yIHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IENTLVNlcnZpY2UtUW9TLVJlcXVlc3QtT3BlcmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyODA4IHwgICAgICAgICBFLjYuMy4zIHwgRW51bWVyYXRlZCAgICAgICB8IE0uViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8ICMgM0dQUCAyOS4yMTQtYjgwICgxMS44LjAgMjAxMy4wMy4xNSkgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IEFib3J0LUNhdXNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNTAwIHwgICAgICAgICAgIDUuMy4xIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IEFjY2Vzcy1OZXR3b3JrLUNoYXJnaW5nLUFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNTAxIHwgICAgICAgICAgIDUuMy4yIHwgQWRkcmVzcyAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IEFjY2Vzcy1OZXR3b3JrLUNoYXJnaW5nLUlkZW50aWZpZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNTAyIHwgICAgICAgICAgIDUuMy4zIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IEFjY2Vzcy1OZXR3b3JrLUNoYXJnaW5nLUlkZW50aWZpZXItVmFsdWUgICAgICAgICAgICAgICAgICAgICAgfCAgNTAzIHwgICAgICAgICAgIDUuMy40IHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IEFjY2VwdGFibGUtU2VydmljZS1JbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNTI2IHwgICAgICAgICAgNS4zLjI0IHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IEFGLUFwcGxpY2F0aW9uLUlkZW50aWZpZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNTA0IHwgICAgICAgICAgIDUuMy41IHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IEFGLUNoYXJnaW5nLUlkZW50aWZpZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNTA1IHwgICAgICAgICAgIDUuMy42IHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IEFwcGxpY2F0aW9uLVNlcnZpY2UtUHJvdmlkZXItSWRlbnRpdHkgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNTMyIHwgICAgICAgICAgNS4zLjI5IHwgVVRGOFN0cmluZyAgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IENvZGVjLURhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNTI0IHwgICAgICAgICAgIDUuMy43IHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IEZsb3ctRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNTA3IHwgICAgICAgICAgIDUuMy44IHwgSVBGaWx0ZXJSdWxlICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IEZsb3ctTnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNTA5IHwgICAgICAgICAgIDUuMy45IHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IEZsb3dzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNTEwIHwgICAgICAgICAgNS4zLjEwIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IEZsb3ctU3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNTExIHwgICAgICAgICAgNS4zLjExIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IEZsb3ctVXNhZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNTEyIHwgICAgICAgICAgNS4zLjEyIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IFNlcnZpY2UtVVJOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNTI1IHwgICAgICAgICAgNS4zLjIzIHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IFNwZWNpZmljLUFjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNTEzIHwgICAgICAgICAgNS4zLjEzIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IE1heC1SZXF1ZXN0ZWQtQmFuZHdpZHRoLURMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNTE1IHwgICAgICAgICAgNS4zLjE0IHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IE1heC1SZXF1ZXN0ZWQtQmFuZHdpZHRoLVVMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNTE2IHwgICAgICAgICAgNS4zLjE1IHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IE1lZGlhLUNvbXBvbmVudC1EZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNTE3IHwgICAgICAgICAgNS4zLjE2IHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IE1lZGlhLUNvbXBvbmVudC1OdW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNTE4IHwgICAgICAgICAgNS4zLjE3IHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IE1lZGlhLVN1Yi1Db21wb25lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNTE5IHwgICAgICAgICAgNS4zLjE4IHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IE1lZGlhLVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNTIwIHwgICAgICAgICAgNS4zLjE5IHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IE1QUy1JZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNTI4IHwgICAgICAgICAgNS4zLjMwIHwgT2N0ZXRTdHJpbmcgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IE1pbi1SZXF1ZXN0ZWQtQmFuZHdpZHRoLURMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNTM0IHwgICAgICAgICAgNS4zLjMyIHwgVW5zaWduZWQzMiAgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IE1pbi1SZXF1ZXN0ZWQtQmFuZHdpZHRoLVVMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNTM1IHwgICAgICAgICAgNS4zLjMzIHwgVW5zaWduZWQzMiAgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IFJSLUJhbmR3aWR0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNTIxIHwgICAgICAgICAgNS4zLjIwIHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IFJTLUJhbmR3aWR0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNTIyIHwgICAgICAgICAgNS4zLjIxIHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IFNlcnZpY2UtSW5mby1TdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNTI3IHwgICAgICAgICAgNS4zLjI1IHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IFNJUC1Gb3JraW5nLUluZGljYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNTIzIHwgICAgICAgICAgNS4zLjIyIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IFNwb25zb3ItSWRlbnRpdHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNTMxIHwgICAgICAgICAgNS4zLjI4IHwgVVRGOFN0cmluZyAgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IFNwb25zb3JlZC1Db25uZWN0aXZpdHktRGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNTMwIHwgICAgICAgICAgNS4zLjI3IHwgR3JvdXBlZCAgICAgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IEFGLVNpZ25hbGxpbmctUHJvdG9jb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNTI5IHwgICAgICAgICAgNS4zLjI2IHwgRW51bWVyYXRlZCAgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IFJlcXVpcmVkLUFjY2Vzcy1JbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNTM2IHwgICAgICAgICAgNS4zLjM0IHwgRW51bWVyYXRlZCAgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IFJ4LVJlcXVlc3QtVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNTMzIHwgICAgICAgICAgNS4zLjMxIHwgRW51bWVyYXRlZCAgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8IElQLURvbWFpbi1JZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNTM3IHwgICAgICAgICAgNS4zLjM1IHwgT2N0ZXRTdHJpbmcgICAgICB8IFYgICAgfCBQICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgWSAgICB8Cit8ICMgM0dQUCAyOS4yMjktYjIwICgxMS4yLjAgMjAxMi4xMi4yMSkgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IEFzc29jaWF0ZWQtSWRlbnRpdGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjMyIHwgICAgICAgICAgNi4zLjMzIHwgR3JvdXBlZCAgICAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IEFzc29jaWF0ZWQtUmVnaXN0ZXJlZC1JZGVudGl0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjQ3IHwgICAgICAgICAgNi4zLjUwIHwgR3JvdXBlZCAgICAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IENhbGwtSUQtU0lQLUhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjQzIHwgICAgICAgIDYuMy40OS4xIHwgT2N0ZXRTdHJpbmcgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IENoYXJnaW5nLUluZm9ybWF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjE4IHwgICAgICAgICAgNi4zLjE5IHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IENvbmZpZGVudGlhbGl0eS1LZXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjI1IHwgICAgICAgICAgNi4zLjI3IHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IENvbnRhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjQxIHwgICAgICAgICAgNi4zLjQ4IHwgT2N0ZXRTdHJpbmcgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IERlcmVnaXN0cmF0aW9uLVJlYXNvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjE1IHwgICAgICAgICAgNi4zLjE2IHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IERpZ2VzdC1BbGdvcml0aG0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMTExIHwgICAgICAgICAgNi4zLjM5IHwgVVRGOFN0cmluZyAgICAgICB8IE0gICAgfCAgICAgfCAgICAgICAgICB8IFYgICAgICAgIHwgTiAgICB8Cit8IERpZ2VzdC1IQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMTIxIHwgICAgICAgICAgNi4zLjQxIHwgVVRGOFN0cmluZyAgICAgICB8IE0gICAgfCAgICAgfCAgICAgICAgICB8IFYgICAgICAgIHwgTiAgICB8Cit8IERpZ2VzdC1Rb1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMTEwIHwgICAgICAgICAgNi4zLjQwIHwgVVRGOFN0cmluZyAgICAgICB8IE0gICAgfCAgICAgfCAgICAgICAgICB8IFYgICAgICAgIHwgTiAgICB8Cit8IERpZ2VzdC1SZWFsbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMTA0IHwgICAgICAgICAgNi4zLjM3IHwgVVRGOFN0cmluZyAgICAgICB8IE0gICAgfCAgICAgfCAgICAgICAgICB8IFYgICAgICAgIHwgTiAgICB8Cit8IEZlYXR1cmUtTGlzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjMwIHwgICAgICAgICAgNi4zLjMxIHwgVW5zaWduZWQzMiAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IEZlYXR1cmUtTGlzdC1JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjI5IHwgICAgICAgICAgNi4zLjMwIHwgVW5zaWduZWQzMiAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IEZyb20tU0lQLUhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjQ0IHwgICAgICAgIDYuMy40OS4yIHwgT2N0ZXRTdHJpbmcgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IElkZW50aXR5LXdpdGgtRW1lcmdlbmN5LVJlZ2lzdHJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjUxIHwgICAgICAgICAgNi4zLjU3IHwgR3JvdXBlZCAgICAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IEludGVncml0eS1LZXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjI2IHwgICAgICAgICAgNi4zLjI4IHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IExJQS1GbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjUzIHwgICAgICAgICAgNi4zLjU5IHwgVW5zaWduZWQzMiAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IExvb3NlLVJvdXRlLUluZGljYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjM4IHwgICAgICAgICAgNi4zLjQ1IHwgRW51bWVyYXRlZCAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IE1hbmRhdG9yeS1DYXBhYmlsaXR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjA0IHwgICAgICAgICAgIDYuMy41IHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IE11bHRpcGxlLVJlZ2lzdHJhdGlvbi1JbmRpY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjQ4IHwgICAgICAgICAgNi4zLjUxIHwgRW51bWVyYXRlZCAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IE9wdGlvbmFsLUNhcGFiaWxpdHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjA1IHwgICAgICAgICAgIDYuMy42IHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IE9yaWdpbmF0aW5nLVJlcXVlc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjMzIHwgICAgICAgICAgNi4zLjM0IHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFBhdGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjQwIHwgICAgICAgICAgNi4zLjQ3IHwgT2N0ZXRTdHJpbmcgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IFByaW1hcnktQ2hhcmdpbmctQ29sbGVjdGlvbi1GdW5jdGlvbi1OYW1lICAgICAgICAgICAgICAgICAgICAgfCAgNjIxIHwgICAgICAgICAgNi4zLjIyIHwgRGlhbWV0ZXJVUkkgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFByaW1hcnktRXZlbnQtQ2hhcmdpbmctRnVuY3Rpb24tTmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjE5IHwgICAgICAgICAgNi4zLjIwIHwgRGlhbWV0ZXJVUkkgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFByaXZpbGVkZ2VkLVNlbmRlci1JbmRpY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjUyIHwgICAgICAgICAgNi4zLjU4IHwgRW51bWVyYXRlZCAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IFB1YmxpYy1JZGVudGl0eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjAxIHwgICAgICAgICAgIDYuMy4yIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFJlYXNvbi1Db2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjE2IHwgICAgICAgICAgNi4zLjE3IHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFJlYXNvbi1JbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjE3IHwgICAgICAgICAgNi4zLjE4IHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFJlY29yZC1Sb3V0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjQ2IHwgICAgICAgIDYuMy40OS40IHwgT2N0ZXRTdHJpbmcgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IFJlc3RvcmF0aW9uLUluZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjQ5IHwgICAgICAgICAgNi4zLjUyIHwgR3JvdXBlZCAgICAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IFNDU0NGLVJlc3RvcmF0aW9uLUluZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjM5IHwgICAgICAgICAgNi4zLjQ2IHwgR3JvdXBlZCAgICAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IFNJUC1BdXRoLURhdGEtSXRlbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjEyIHwgICAgICAgICAgNi4zLjEzIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNJUC1BdXRoZW50aWNhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjA5IHwgICAgICAgICAgNi4zLjEwIHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNJUC1BdXRoZW50aWNhdGlvbi1Db250ZXh0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjExIHwgICAgICAgICAgNi4zLjEyIHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNJUC1BdXRoZW50aWNhdGlvbi1TY2hlbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjA4IHwgICAgICAgICAgIDYuMy45IHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNJUC1BdXRob3JpemF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjEwIHwgICAgICAgICAgNi4zLjExIHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNJUC1EaWdlc3QtQXV0aGVudGljYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjM1IHwgICAgICAgICAgNi4zLjM2IHwgR3JvdXBlZCAgICAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IFNJUC1JdGVtLU51bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjEzIHwgICAgICAgICAgNi4zLjE0IHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNJUC1OdW1iZXItQXV0aC1JdGVtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjA3IHwgICAgICAgICAgIDYuMy44IHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNlY29uZGFyeS1DaGFyZ2luZy1Db2xsZWN0aW9uLUZ1bmN0aW9uLU5hbWUgICAgICAgICAgICAgICAgICAgfCAgNjIyIHwgICAgICAgICAgNi4zLjIzIHwgRGlhbWV0ZXJVUkkgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNlY29uZGFyeS1FdmVudC1DaGFyZ2luZy1GdW5jdGlvbi1OYW1lICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjIwIHwgICAgICAgICAgNi4zLjIxIHwgRGlhbWV0ZXJVUkkgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNlcnZlci1Bc3NpZ25tZW50LVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjE0IHwgICAgICAgICAgNi4zLjE1IHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNlcnZlci1DYXBhYmlsaXRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjAzIHwgICAgICAgICAgIDYuMy40IHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNlcnZlci1OYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjAyIHwgICAgICAgICAgIDYuMy4zIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNlc3Npb24tUHJpb3JpdHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjUwIHwgICAgICAgICAgNi4zLjU2IHwgRW51bWVyYXRlZCAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IFN1YnNjcmlwdGlvbi1JbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjQyIHwgICAgICAgICAgNi4zLjQ5IHwgR3JvdXBlZCAgICAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IFN1cHBvcnRlZC1BcHBsaWNhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjMxIHwgICAgICAgICAgNi4zLjMyIHwgR3JvdXBlZCAgICAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IFN1cHBvcnRlZC1GZWF0dXJlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjI4IHwgICAgICAgICAgNi4zLjI5IHwgR3JvdXBlZCAgICAgICAgICB8IFYgICAgfCBNICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFRvLVNJUC1IZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjQ1IHwgICAgICAgIDYuMy40OS4zIHwgT2N0ZXRTdHJpbmcgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IFVBUi1GbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjM3IHwgICAgICAgICAgNi4zLjQ0IHwgVW5zaWduZWQzMiAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IFVzZXItQXV0aG9yaXphdGlvbi1UeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjIzIHwgICAgICAgICAgNi4zLjI0IHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFVzZXItRGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjA2IHwgICAgICAgICAgIDYuMy43IHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFVzZXItRGF0YS1BbHJlYWR5LUF2YWlsYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjI0IHwgICAgICAgICAgNi4zLjI2IHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFZpc2l0ZWQtTmV0d29yay1JZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjAwIHwgICAgICAgICAgIDYuMy4xIHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFdpbGRjYXJkZWQtUHVibGljLUlkZW50aXR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjM0IHwgICAgICAgICAgNi4zLjM1IHwgVVRGOFN0cmluZyAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8ICMgM0dQUCAzMi4yOTktYjYwICgxMS42LjAgMjAxMi4xMi4yMSkgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IEFGLUNvcnJlbGF0aW9uLUluZm9ybWF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjc2IHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEFjY2Vzcy1OZXR3b3JrLUluZm9ybWF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjYzIHwgICAgICAgICAgICAgICAgIHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEFjY2Vzcy1UcmFuc2Zlci1JbmZvcm1hdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyNzA5IHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEFjY2Vzcy1UcmFuc2Zlci1UeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyNzEwIHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEFjY291bnQtRXhwaXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMzA5IHwgICAgICAgICAgICAgICAgIHwgVGltZSAgICAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEFjY3VtdWxhdGVkLUNvc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDUyIHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEFkYXB0YXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjE3IHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEFkZGl0aW9uYWwtQ29udGVudC1JbmZvcm1hdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjA3IHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEFkZGl0aW9uYWwtVHlwZS1JbmZvcm1hdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjA1IHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEFkZHJlc3MtRGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODk3IHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEFkZHJlc3MtRG9tYWluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODk4IHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEFkZHJlc3MtVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODk5IHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEFkZHJlc3NlZS1UeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjA4IHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEFsdGVybmF0ZS1DaGFyZ2VkLVBhcnR5LUFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjgwIHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IFYuTSAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEFvQy1Db3N0LUluZm9ybWF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDUzIHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEFvQy1Gb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMzEwIHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEFvQy1JbmZvcm1hdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDU0IHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IFYuTSAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEFvQy1SZXF1ZXN0LVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDU1IHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IFYuTSAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEFvQy1TZXJ2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMzExIHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEFvQy1TZXJ2aWNlLU9ibGlnYXRvcnktVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMzEyIHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEFvQy1TZXJ2aWNlLVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMzEzIHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEFvQy1TdWJzY3JpcHRpb24tSW5mb3JtYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMzE0IHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEFwcGxpYy1JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjE4IHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEFwcGxpY2F0aW9uLVNlcnZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODM2IHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEFwcGxpY2F0aW9uLVNlcnZlci1JbmZvcm1hdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODUwIHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEFwcGxpY2F0aW9uLVByb3ZpZGVkLUNhbGxlZC1QYXJ0eS1BZGRyZXNzICAgICAgICAgICAgICAgICAgICAgfCAgODM3IHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEFzc29jaWF0ZWQtUGFydHktQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDM1IHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEFzc29jaWF0ZWQtVVJJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODU2IHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEF1eC1BcHBsaWMtSW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjE5IHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEJhc2UtVGltZS1JbnRlcnZhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjY1IHwgICAgICAgICAgICAgICAgIHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEJlYXJlci1TZXJ2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODU0IHwgICAgICAgICAgICAgICAgIHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IENHLUFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODQ2IHwgICAgICAgICAgICAgICAgIHwgQWRkcmVzcyAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IENTRy1BY2Nlc3MtTW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMzE3IHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IENTRy1NZW1iZXJzaGlwLUluZGljYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMzE4IHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IENVRy1JbmZvcm1hdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMzA0IHwgICAgICAgICAgICAgICAgIHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IENhbGxlZC1Bc3NlcnRlZC1JZGVudGl0eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjUwIHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IENhbGxlZC1QYXJ0eS1BZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODMyIHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IENhbGxpbmctUGFydHktQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODMxIHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IENhcnJpZXItU2VsZWN0LVJvdXRpbmctSW5mb3JtYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDIzIHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IENhdXNlLUNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODYxIHwgICAgICAgICAgICAgICAgIHwgSW50ZWdlcjMyICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IENoYW5nZS1Db25kaXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDM3IHwgICAgICAgICAgICAgICAgIHwgSW50ZWdlcjMyICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IENoYW5nZS1UaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDM4IHwgICAgICAgICAgICAgICAgIHwgVGltZSAgICAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IENoYXJnZS1SZWFzb24tQ29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMTE4IHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IENoYXJnZWQtUGFydHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODU3IHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IENoYXJnaW5nLUNoYXJhY3RlcmlzdGljcy1TZWxlY3Rpb24tTW9kZSAgICAgICAgICAgICAgICAgICAgICAgfCAyMDY2IHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IENsYXNzLUlkZW50aWZpZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjE0IHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IENsaWVudC1BZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDE4IHwgICAgICAgICAgICAgICAgIHwgQWRkcmVzcyAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IENvbnRlbnQtQ2xhc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjIwIHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IENvbnRlbnQtRGlzcG9zaXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODI4IHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IENvbnRlbnQtTGVuZ3RoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODI3IHwgICAgICAgICAgICAgICAgIHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IENvbnRlbnQtU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjA2IHwgICAgICAgICAgICAgICAgIHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IENvbnRlbnQtVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODI2IHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEN1cnJlbnQtVGFyaWZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDU2IHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IERSTS1Db250ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjIxIHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IERhdGEtQ29kaW5nLVNjaGVtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDAxIHwgICAgICAgICAgICAgICAgIHwgSW50ZWdlcjMyICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IERlZmVycmVkLUxvY2F0aW9uLUV2ZW50LVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjMwIHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IERlbGl2ZXJ5LVJlcG9ydC1SZXF1ZXN0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjE2IHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IERlc3RpbmF0aW9uLUludGVyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDAyIHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IERpYWdub3N0aWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDM5IHwgICAgICAgICAgICAgICAgIHwgSW50ZWdlcjMyICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IERvbWFpbi1OYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjAwIHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IER5bmFtaWMtQWRkcmVzcy1GbGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDUxIHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IER5bmFtaWMtQWRkcmVzcy1GbGFnLUV4dGVuc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDY4IHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEVhcmx5LU1lZGlhLURlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjcyIHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEVudmVsb3BlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjY2IHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEVudmVsb3BlLUVuZC1UaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjY3IHwgICAgICAgICAgICAgICAgIHwgVGltZSAgICAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEVudmVsb3BlLVJlcG9ydGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjY4IHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEVudmVsb3BlLVN0YXJ0LVRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjY5IHwgICAgICAgICAgICAgICAgIHwgVGltZSAgICAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEV2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODI1IHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEV2ZW50LUNoYXJnaW5nLVRpbWVTdGFtcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjU4IHwgICAgICAgICAgICAgICAgIHwgVGltZSAgICAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEV2ZW50LVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODIzIHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEV4cGlyZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODg4IHwgICAgICAgICAgICAgICAgIHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEZpbGUtUmVwYWlyLVN1cHBvcnRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjI0IHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IEZyb20tQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyNzA4IHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEdHU04tQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODQ3IHwgICAgICAgICAgICAgICAgIHwgQWRkcmVzcyAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IElNUy1BcHBsaWNhdGlvbi1SZWZlcmVuY2UtSWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyNjAxIHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IElNUy1DaGFyZ2luZy1JZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODQxIHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IElNUy1Db21tdW5pY2F0aW9uLVNlcnZpY2UtSWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjgxIHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IElNUy1FbWVyZ2VuY3ktSW5kaWNhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMzIyIHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IElNUy1JbmZvcm1hdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODc2IHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IElNU0ktVW5hdXRoZW50aWNhdGVkLUZsYWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMzA4IHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IElQLVJlYWxtLURlZmF1bHQtSW5kaWNhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyNjAzIHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEluY29taW5nLVRydW5rLUdyb3VwLUlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODUyIHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEluY3JlbWVudGFsLUNvc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDYyIHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEluaXRpYWwtSU1TLUNoYXJnaW5nLUlkZW50aWZpZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMzIxIHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEludGVyLU9wZXJhdG9yLUlkZW50aWZpZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODM4IHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEludGVyZmFjZS1JZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDAzIHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEludGVyZmFjZS1Qb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDA0IHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEludGVyZmFjZS1UZXh0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDA1IHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEludGVyZmFjZS1UeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDA2IHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IExDUy1BUE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjMxIHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IExDUy1DbGllbnQtRGlhbGVkLUJ5LU1TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjMzIHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IExDUy1DbGllbnQtRXh0ZXJuYWwtSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjM0IHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IExDUy1DbGllbnQtSWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjMyIHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IExDUy1DbGllbnQtTmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjM1IHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IExDUy1DbGllbnQtVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjQxIHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IExDUy1EYXRhLUNvZGluZy1TY2hlbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjM2IHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IExDUy1Gb3JtYXQtSW5kaWNhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjM3IHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IExDUy1JbmZvcm1hdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODc4IHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IExDUy1OYW1lLVN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjM4IHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IExDUy1SZXF1ZXN0b3ItSWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjM5IHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IExDUy1SZXF1ZXN0b3ItSWQtU3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjQwIHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IExvY2FsLUdXLUluc2VydGVkLUluZGljYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyNjA0IHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IExvY2FsLVNlcXVlbmNlLU51bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDYzIHwgICAgICAgICAgICAgICAgIHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IExvY2F0aW9uLUVzdGltYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjQyIHwgICAgICAgICAgICAgICAgIHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IExvY2F0aW9uLUVzdGltYXRlLVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjQzIHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IExvY2F0aW9uLVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjQ0IHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IExvdy1CYWxhbmNlLUluZGljYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDIwIHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IExvdy1Qcmlvcml0eS1JbmRpY2F0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyNjAyIHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IE1CTVMgR1ctQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMzA3IHwgICAgICAgICAgICAgICAgIHwgQWRkcmVzcyAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IE1CTVMtSW5mb3JtYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODgwIHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IE1CTVMtVXNlci1TZXJ2aWNlLVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjI1IHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IE1NLUNvbnRlbnQtVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjAzIHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IE1NQm94LVN0b3JhZ2UtUmVxdWVzdGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjQ4IHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IE1NUy1JbmZvcm1hdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODc3IHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IE1NVGVsLUluZm9ybWF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDMwIHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IE1NVGVsLVNTZXJ2aWNlLVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDMxIHwgICAgICAgICAgICAgICAgIHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IE1lZGlhLUluaXRpYXRvci1GbGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODgyIHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IE1lZGlhLUluaXRpYXRvci1QYXJ0eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjg4IHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IE1lc3NhZ2UtQm9keSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODg5IHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IE1lc3NhZ2UtQ2xhc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjEzIHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IE1lc3NhZ2UtSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjEwIHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IE1lc3NhZ2UtU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjEyIHwgICAgICAgICAgICAgICAgIHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IE1lc3NhZ2UtVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjExIHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IE5OSS1JbmZvcm1hdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyNzAzIHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IE5OSS1UeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyNzA0IHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IE5laWdoYm91ci1Ob2RlLUFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyNzA1IHwgICAgICAgICAgICAgICAgIHwgQWRkcmVzcyAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IE5leHQtVGFyaWZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDU3IHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IFYvTSAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IE5vZGUtRnVuY3Rpb25hbGl0eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODYyIHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IE5vZGUtSWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDY0IHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IE51bWJlci1PZi1EaXZlcnNpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDM0IHwgICAgICAgICAgICAgICAgIHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IE51bWJlci1PZi1NZXNzYWdlcy1TZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDE5IHwgICAgICAgICAgICAgICAgIHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IE51bWJlci1PZi1QYXJ0aWNpcGFudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODg1IHwgICAgICAgICAgICAgICAgIHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IE51bWJlci1PZi1SZWNlaXZlZC1UYWxrLUJ1cnN0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjgyIHwgICAgICAgICAgICAgICAgIHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IE51bWJlci1PZi1UYWxrLUJ1cnN0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjgzIHwgICAgICAgICAgICAgICAgIHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IE51bWJlci1Qb3J0YWJpbGl0eS1Sb3V0aW5nLUluZm9ybWF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDI0IHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IE9mZmxpbmUtQ2hhcmdpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjc4IHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IE9ubGluZS1DaGFyZ2luZy1GbGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMzAzIHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IE9yaWdpbmF0aW5nLUlPSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODM5IHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IE9yaWdpbmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODY0IHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IE9yaWdpbmF0b3ItQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODg2IHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IE9yaWdpbmF0b3ItSW50ZXJmYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDA5IHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IE9yaWdpbmF0b3ItUmVjZWl2ZWQtQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDI3IHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IE9yaWdpbmF0b3ItU0NDUC1BZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDA4IHwgICAgICAgICAgICAgICAgIHwgQWRkcmVzcyAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IE91dGdvaW5nLVNlc3Npb24tSWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMzIwIHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IE91dGdvaW5nLVRydW5rLUdyb3VwLUlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODUzIHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFBERy1BZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODk1IHwgICAgICAgICAgICAgICAgIHwgQWRkcmVzcyAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFBERy1DaGFyZ2luZy1JZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODk2IHwgICAgICAgICAgICAgICAgIHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFBETi1Db25uZWN0aW9uLUNoYXJnaW5nLUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDUwIHwgICAgICAgICAgICAgICAgIHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFBEUC1BZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjI3IHwgICAgICAgICAgICAgICAgIHwgQWRkcmVzcyAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IFBEUC1BZGRyZXNzLVByZWZpeC1MZW5ndGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyNjA2IHwgICAgICAgICAgICAgICAgIHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IFBEUC1Db250ZXh0LVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjQ3IHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFBTLUFwcGVuZC1GcmVlLUZvcm1hdC1EYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODY3IHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFBTLUZyZWUtRm9ybWF0LURhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODY2IHwgICAgICAgICAgICAgICAgIHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFBTLUZ1cm5pc2gtQ2hhcmdpbmctSW5mb3JtYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODY1IHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFBTLUluZm9ybWF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODc0IHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFBhcnRpY2lwYW50LUFjY2Vzcy1Qcmlvcml0eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjU5IHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFBhcnRpY2lwYW50LUFjdGlvbi1UeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDQ5IHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFBhcnRpY2lwYW50LUdyb3VwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjYwIHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFBhcnRpY2lwYW50cy1JbnZvbHZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODg3IHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFBvQy1DaGFuZ2UtQ29uZGl0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjYxIHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFBvQy1DaGFuZ2UtVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjYyIHwgICAgICAgICAgICAgICAgIHwgVGltZSAgICAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFBvQy1Db250cm9sbGluZy1BZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODU4IHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFBvQy1FdmVudC1UeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDI1IHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFBvQy1Hcm91cC1OYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODU5IHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFBvQy1JbmZvcm1hdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODc5IHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFBvQy1TZXJ2ZXItUm9sZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODgzIHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFBvQy1TZXNzaW9uLUlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjI5IHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFBvQy1TZXNzaW9uLUluaXRpYXRpb24tdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjc3IHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFBvQy1TZXNzaW9uLVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODg0IHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFBvQy1Vc2VyLVJvbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjUyIHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFBvQy1Vc2VyLVJvbGUtSURzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjUzIHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFBvQy1Vc2VyLVJvbGUtaW5mby1Vbml0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjU0IHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFBvc2l0aW9uaW5nLURhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjQ1IHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFByZWZlcnJlZC1Bb0MtQ3VycmVuY3kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMzE1IHwgICAgICAgICAgICAgICAgIHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFByaW9yaXR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjA5IHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFF1b3RhLUNvbnN1bXB0aW9uLVRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODgxIHwgICAgICAgICAgICAgICAgIHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFF1b3RhLUhvbGRpbmctVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODcxIHwgICAgICAgICAgICAgICAgIHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFJhdGUtRWxlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDU4IHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFJlYWQtUmVwbHktUmVwb3J0LVJlcXVlc3RlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjIyIHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFJlYWwtVGltZS1UYXJpZmYtSW5mb3JtYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMzA1IHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFJlY2VpdmVkLVRhbGstQnVyc3QtVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjg0IHwgICAgICAgICAgICAgICAgIHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFJlY2VpdmVkLVRhbGstQnVyc3QtVm9sdW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjg1IHwgICAgICAgICAgICAgICAgIHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFJlY2lwaWVudC1BZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjAxIHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFJlY2lwaWVudC1JbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDI2IHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFJlY2lwaWVudC1SZWNlaXZlZC1BZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDI4IHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFJlY2lwaWVudC1TQ0NQLUFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDEwIHwgICAgICAgICAgICAgICAgIHwgQWRkcmVzcyAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFJlZnVuZC1JbmZvcm1hdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDIyIHwgICAgICAgICAgICAgICAgIHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFJlbGF0aW9uc2hpcC1Nb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyNzA2IHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFJlbWFpbmluZy1CYWxhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDIxIHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFJlcGx5LUFwcGxpYy1JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjIzIHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFJlcGx5LVBhdGgtUmVxdWVzdGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDExIHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFJlcG9ydGluZy1SZWFzb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODcyIHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFJlcXVlc3RlZC1QYXJ0eS1BZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjUxIHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFJvbGUtT2YtTm9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODI5IHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNEUC1BbnN3ZXItVGltZXN0YW1wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjc1IHwgICAgICAgICAgICAgICAgIHwgVGltZSAgICAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNEUC1NZWRpYS1Db21wb25lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODQzIHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNEUC1NZWRpYS1EZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODQ1IHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNEUC1NZWRpYS1OYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODQ0IHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNEUC1PZmZlci1UaW1lc3RhbXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjc0IHwgICAgICAgICAgICAgICAgIHwgVGltZSAgICAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNEUC1TZXNzaW9uLURlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODQyIHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNEUC1UaW1lU3RhbXBzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjczIHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNEUC1UeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDM2IHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNHU04tQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjI4IHwgICAgICAgICAgICAgICAgIHwgQWRkcmVzcyAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNHVy1BZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDY3IHwgICAgICAgICAgICAgICAgIHwgQWRkcmVzcyAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNHVy1DaGFuZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDY1IHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNJUC1NZXRob2QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODI0IHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNJUC1SZXF1ZXN0LVRpbWVzdGFtcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODM0IHwgICAgICAgICAgICAgICAgIHwgVGltZSAgICAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNJUC1SZXF1ZXN0LVRpbWVzdGFtcC1GcmFjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMzAxIHwgICAgICAgICAgICAgICAgIHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNJUC1SZXNwb25zZS1UaW1lc3RhbXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODM1IHwgICAgICAgICAgICAgICAgIHwgVGltZSAgICAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNJUC1SZXNwb25zZS1UaW1lc3RhbXAtRnJhY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMzAyIHwgICAgICAgICAgICAgICAgIHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNNLURpc2NoYXJnZS1UaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDEyIHwgICAgICAgICAgICAgICAgIHwgVGltZSAgICAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNNLU1lc3NhZ2UtVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDA3IHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNNLVByb3RvY29sLUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDEzIHwgICAgICAgICAgICAgICAgIHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNNLVNlcnZpY2UtVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDI5IHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNNLVN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDE0IHwgICAgICAgICAgICAgICAgIHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNNLVVzZXItRGF0YS1IZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDE1IHwgICAgICAgICAgICAgICAgIHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNNUy1JbmZvcm1hdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDAwIHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNNUy1Ob2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDE2IHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNNU0MtQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDE3IHwgICAgICAgICAgICAgICAgIHwgQWRkcmVzcyAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNjYWxlLUZhY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDU5IHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNlcnZlZC1QYXJ0eS1JUC1BZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODQ4IHwgICAgICAgICAgICAgICAgIHwgQWRkcmVzcyAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNlcnZpY2UtRGF0YS1Db250YWluZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDQwIHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNlcnZpY2UtSWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODU1IHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNlcnZpY2UtSW5mb3JtYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODczIHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNlcnZpY2UtTW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDMyIHwgICAgICAgICAgICAgICAgIHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNlcnZpY2UtU3BlY2lmaWMtRGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODYzIHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNlcnZpY2UtU3BlY2lmaWMtSW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjQ5IHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNlcnZpY2UtU3BlY2lmaWMtVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjU3IHwgICAgICAgICAgICAgICAgIHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNlcnZpbmctTm9kZS1UeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDQ3IHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNlc3Npb24tRGlyZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyNzA3IHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFN0YXJ0LVRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDQxIHwgICAgICAgICAgICAgICAgIHwgVGltZSAgICAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyNzAyIHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFN0b3AtVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDQyIHwgICAgICAgICAgICAgICAgIHwgVGltZSAgICAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFN1Ym1pc3Npb24tVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjAyIHwgICAgICAgICAgICAgICAgIHwgVGltZSAgICAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFN1YnNjcmliZXItUm9sZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDMzIHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFN1cHBsZW1lbnRhcnktU2VydmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDQ4IHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFRhbGstQnVyc3QtRXhjaGFuZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjU1IHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFRhbGstQnVyc3QtVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjg2IHwgICAgICAgICAgICAgICAgIHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFRhbGstQnVyc3QtVm9sdW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjg3IHwgICAgICAgICAgICAgICAgIHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFRhcmlmZi1JbmZvcm1hdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDYwIHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFRhcmlmZi1YTUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMzA2IHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFRlcm1pbmF0aW5nLUlPSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODQwIHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFRpbWUtRmlyc3QtVXNhZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDQzIHwgICAgICAgICAgICAgICAgIHwgVGltZSAgICAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFRpbWUtTGFzdC1Vc2FnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDQ0IHwgICAgICAgICAgICAgICAgIHwgVGltZSAgICAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFRpbWUtUXVvdGEtTWVjaGFuaXNtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjcwIHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFRpbWUtUXVvdGEtVGhyZXNob2xkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODY4IHwgICAgICAgICAgICAgICAgIHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFRpbWUtUXVvdGEtVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjcxIHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFRpbWUtU3RhbXBzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODMzIHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFRpbWUtVXNhZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDQ1IHwgICAgICAgICAgICAgICAgIHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFRva2VuLVRleHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjE1IHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFRyYWZmaWMtRGF0YS1Wb2x1bWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDQ2IHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFRyYW5zY29kZXItSW5zZXJ0ZWQtSW5kaWNhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyNjA1IHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFRyYW5zaXQtSU9JLUxpc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyNzAxIHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFRyaWdnZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjY0IHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFRyaWdnZXItVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODcwIHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFRydW5rLUdyb3VwLUlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODUxIHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFR5cGUtTnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjA0IHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFVuaXQtQ29zdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDYxIHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFVuaXQtUXVvdGEtVGhyZXNob2xkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjI2IHwgICAgICAgICAgICAgICAgIHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFVzZXItQ1NHLUluZm9ybWF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMzE5IHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFVzZXItUGFydGljaXBhdGluZy1UeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjc5IHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFVzZXItU2Vzc2lvbi1JZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODMwIHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFZvbHVtZS1RdW90YS1UaHJlc2hvbGQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODY5IHwgICAgICAgICAgICAgICAgIHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFdBRy1BZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODkwIHwgICAgICAgICAgICAgICAgIHwgQWRkcmVzcyAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFdBRy1QTE1OLUlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODkxIHwgICAgICAgICAgICAgICAgIHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFdMQU4tSW5mb3JtYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODc1IHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFdMQU4tUmFkaW8tQ29udGFpbmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODkyIHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFdMQU4tU2Vzc2lvbi1JZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjQ2IHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFdMQU4tVGVjaG5vbG9neSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODkzIHwgICAgICAgICAgICAgICAgIHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFdMQU4tVUUtTG9jYWwtSVBBZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODk0IHwgICAgICAgICAgICAgICAgIHwgQWRkcmVzcyAgICAgICAgICB8IE0sViAgfCBQICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8ICMgM0dQUCAyOS4yNzItYzAwICgxMi4wLjAgMjAxMy4wMy4xMykgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IFN1YnNjcmlwdGlvbi1EYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDAwIHwgICAgICAgICAgIDcuMy4yIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFRlcm1pbmFsLUluZm9ybWF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDAxIHwgICAgICAgICAgIDcuMy4zIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IElNRUkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDAyIHwgICAgICAgICAgIDcuMy40IHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNvZnR3YXJlLVZlcnNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDAzIHwgICAgICAgICAgIDcuMy41IHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFFvUy1TdWJzY3JpYmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDA0IHwgICAgICAgICAgNy4zLjc3IHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFVMUi1GbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDA1IHwgICAgICAgICAgIDcuMy43IHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFVMQS1GbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDA2IHwgICAgICAgICAgIDcuMy44IHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFZpc2l0ZWQtUExNTi1JZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDA3IHwgICAgICAgICAgIDcuMy45IHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFJlcXVlc3RlZC1FVVRSQU4tQXV0aGVudGljYXRpb24tSW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDA4IHwgICAgICAgICAgNy4zLjExIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFJlcXVlc3RlZC1VVFJBTi0gR0VSQU4tQXV0aGVudGljYXRpb24tSW5mbyAgICAgICAgICAgICAgICAgICAgfCAxNDA5IHwgICAgICAgICAgNy4zLjEyIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IE51bWJlci1PZi1SZXF1ZXN0ZWQtVmVjdG9ycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDEwIHwgICAgICAgICAgNy4zLjE0IHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFJlLVN5bmNocm9uaXphdGlvbi1JbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDExIHwgICAgICAgICAgNy4zLjE1IHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEltbWVkaWF0ZS1SZXNwb25zZS1QcmVmZXJyZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDEyIHwgICAgICAgICAgNy4zLjE2IHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEF1dGhlbnRpY2F0aW9uLUluZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDEzIHwgICAgICAgICAgNy4zLjE3IHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEUtVVRSQU4tVmVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDE0IHwgICAgICAgICAgNy4zLjE4IHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFVUUkFOLVZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDE1IHwgICAgICAgICAgNy4zLjE5IHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEdFUkFOLVZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDE2IHwgICAgICAgICAgNy4zLjIwIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IE5ldHdvcmstQWNjZXNzLU1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDE3IHwgICAgICAgICAgNy4zLjIxIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEhQTE1OLU9EQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDE4IHwgICAgICAgICAgNy4zLjIyIHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEl0ZW0tTnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDE5IHwgICAgICAgICAgNy4zLjIzIHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IENhbmNlbGxhdGlvbi1UeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDIwIHwgICAgICAgICAgNy4zLjI0IHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IERTUi1GbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDIxIHwgICAgICAgICAgNy4zLjI1IHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IERTQS1GbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDIyIHwgICAgICAgICAgNy4zLjI2IHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IENvbnRleHQtSWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDIzIHwgICAgICAgICAgNy4zLjI3IHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFN1YnNjcmliZXItU3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDI0IHwgICAgICAgICAgNy4zLjI5IHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IE9wZXJhdG9yLURldGVybWluZWQtQmFycmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDI1IHwgICAgICAgICAgNy4zLjMwIHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEFjY2Vzcy1SZXN0cmljdGlvbi1EYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDI2IHwgICAgICAgICAgNy4zLjMxIHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEFQTi1PSS1SZXBsYWNlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDI3IHwgICAgICAgICAgNy4zLjMyIHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEFsbC1BUE4tQ29uZmlndXJhdGlvbnMtSW5jbHVkZWQtSW5kaWNhdG9yICAgICAgICAgICAgICAgICAgICAgfCAxNDI4IHwgICAgICAgICAgNy4zLjMzIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEFQTi1Db25maWd1cmF0aW9uLVByb2ZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDI5IHwgICAgICAgICAgNy4zLjM0IHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEFQTi1Db25maWd1cmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDMwIHwgICAgICAgICAgNy4zLjM1IHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEVQUy1TdWJzY3JpYmVkLVFvUy1Qcm9maWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDMxIHwgICAgICAgICAgNy4zLjM3IHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFZQTE1OLUR5bmFtaWMtQWRkcmVzcy1BbGxvd2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDMyIHwgICAgICAgICAgNy4zLjM4IHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNUTi1TUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDMzIHwgICAgICAgICAgNy4zLjM5IHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEFsZXJ0LVJlYXNvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDM0IHwgICAgICAgICAgNy4zLjgzIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEFNQlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDM1IHwgICAgICAgICAgNy4zLjQxIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IENTRy1TdWJzY3JpcHRpb24tRGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDM2IHwgICAgICAgICAgNy4zLjc4IHwgR3JvdXBlZCAgICAgICAgICB8IE0uIFYgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IENTRy1JZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDM3IHwgICAgICAgICAgNy4zLjc5IHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFBETi1HVy1BbGxvY2F0aW9uLVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDM4IHwgICAgICAgICAgNy4zLjQ0IHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEV4cGlyYXRpb24tRGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDM5IHwgICAgICAgICAgNy4zLjgwIHwgVGltZSAgICAgICAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFJBVC1GcmVxdWVuY3ktU2VsZWN0aW9uLVByaW9yaXR5LUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDQwIHwgICAgICAgICAgNy4zLjQ2IHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IElEQS1GbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDQxIHwgICAgICAgICAgNy4zLjQ3IHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFBVQS1GbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDQyIHwgICAgICAgICAgNy4zLjQ4IHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IE5PUi1GbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDQzIHwgICAgICAgICAgNy4zLjQ5IHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFVzZXItSWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDQ0IHwgICAgICAgICAgNy4zLjUwIHwgVVRGOFN0cmluZyAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IEVxdWlwbWVudC1TdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDQ1IHwgICAgICAgICAgNy4zLjUxIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFJlZ2lvbmFsLVN1YnNjcmlwdGlvbi1ab25lLUNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDQ2IHwgICAgICAgICAgNy4zLjUyIHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFJBTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDQ3IHwgICAgICAgICAgNy4zLjUzIHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFhSRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDQ4IHwgICAgICAgICAgNy4zLjU0IHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEFVVE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDQ5IHwgICAgICAgICAgNy4zLjU1IHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEtBU01FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDUwIHwgICAgICAgICAgNy4zLjU2IHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFRyYWNlLUNvbGxlY3Rpb24tRW50aXR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDUyIHwgICAgICAgICAgNy4zLjk4IHwgQWRkcmVzcyAgICAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEtjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDUzIHwgICAgICAgICAgNy4zLjU5IHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNSRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDU0IHwgICAgICAgICAgNy4zLjYwIHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFBETi1UeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDU2IHwgICAgICAgICAgNy4zLjYyIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFJvYW1pbmctUmVzdHJpY3RlZC1EdWUtVG8tVW5zdXBwb3J0ZWQtRmVhdHVyZSAgICAgICAgICAgICAgICAgfCAxNDU3IHwgICAgICAgICAgNy4zLjgxIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFRyYWNlLURhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDU4IHwgICAgICAgICAgNy4zLjYzIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFRyYWNlLVJlZmVyZW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDU5IHwgICAgICAgICAgNy4zLjY0IHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFRyYWNlLURlcHRoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDYyIHwgICAgICAgICAgNy4zLjY3IHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFRyYWNlLU5FLVR5cGUtTGlzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDYzIHwgICAgICAgICAgNy4zLjY4IHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFRyYWNlLUludGVyZmFjZS1MaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDY0IHwgICAgICAgICAgNy4zLjY5IHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFRyYWNlLUV2ZW50LUxpc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDY1IHwgICAgICAgICAgNy4zLjcwIHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IE9NQy1JZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDY2IHwgICAgICAgICAgNy4zLjcxIHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEdQUlMtU3Vic2NyaXB0aW9uLURhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDY3IHwgICAgICAgICAgNy4zLjcyIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IENvbXBsZXRlLURhdGEtTGlzdC1JbmNsdWRlZC1JbmRpY2F0b3IgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDY4IHwgICAgICAgICAgNy4zLjczIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFBEUC1Db250ZXh0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDY5IHwgICAgICAgICAgNy4zLjc0IHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFBEUC1UeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDcwIHwgICAgICAgICAgNy4zLjc1IHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IDNHUFAyLU1FSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDcxIHwgICAgICAgICAgIDcuMy42IHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNwZWNpZmljLUFQTi1JbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDcyIHwgICAgICAgICAgNy4zLjgyIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IExDUy1JbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDczIHwgICAgICAgICAgNy4zLjg0IHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEdNTEMtTnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDc0IHwgICAgICAgICAgNy4zLjg1IHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IExDUy1Qcml2YWN5RXhjZXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDc1IHwgICAgICAgICAgNy4zLjg2IHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNTLUNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDc2IHwgICAgICAgICAgNy4zLjg3IHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNTLVN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDc3IHwgICAgICAgICAgNy4zLjg4IHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IE5vdGlmaWNhdGlvbi1Uby1VRS1Vc2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDc4IHwgICAgICAgICAgNy4zLjg5IHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEV4dGVybmFsLUNsaWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDc5IHwgICAgICAgICAgNy4zLjkwIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IENsaWVudC1JZGVudGl0eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDgwIHwgICAgICAgICAgNy4zLjkxIHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEdNTEMtUmVzdHJpY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDgxIHwgICAgICAgICAgNy4zLjkyIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFBMTU4tQ2xpZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDgyIHwgICAgICAgICAgNy4zLjkzIHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNlcnZpY2UtVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDgzIHwgICAgICAgICAgNy4zLjk0IHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNlcnZpY2VUeXBlSWRlbnRpdHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDg0IHwgICAgICAgICAgNy4zLjk1IHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IE1PLUxSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDg1IHwgICAgICAgICAgNy4zLjk2IHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFRlbGVzZXJ2aWNlLUxpc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDg2IHwgICAgICAgICAgNy4zLjk5IHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFRTLUNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDg3IHwgICAgICAgICA3LjMuMTAwIHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IENhbGwtQmFycmluZy1JbmZvci1MaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDg4IHwgICAgICAgICA3LjMuMTAxIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNHU04tTnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDg5IHwgICAgICAgICA3LjMuMTAyIHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IElEUi1GbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDkwIHwgICAgICAgICA3LjMuMTAzIHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IElDUy1JbmRpY2F0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDkxIHwgICAgICAgICA3LjMuMTA0IHwgRW51bWVyYXRlZCAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IElNUy1Wb2ljZS1PdmVyLVBTLVNlc3Npb25zLVN1cHBvcnRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDkyIHwgICAgICAgICA3LjMuMTA2IHwgRW51bWVyYXRlZCAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IEhvbW9nZW5lb3VzLVN1cHBvcnQtb2YtSU1TLVZvaWNlLU92ZXItUFMtU2Vzc2lvbnMgICAgICAgICAgICAgfCAxNDkzIHwgICAgICAgICA3LjMuMTA3IHwgRW51bWVyYXRlZCAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IExhc3QtVUUtQWN0aXZpdHktVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDk0IHwgICAgICAgICA3LjMuMTA4IHwgVGltZSAgICAgICAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IEVQUy1Vc2VyLVN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDk1IHwgICAgICAgICA3LjMuMTEwIHwgR3JvdXBlZCAgICAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IEVQUy1Mb2NhdGlvbi1JbmZvcm1hdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDk2IHwgICAgICAgICA3LjMuMTExIHwgR3JvdXBlZCAgICAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IE1NRS1Vc2VyLVN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDk3IHwgICAgICAgICA3LjMuMTEyIHwgR3JvdXBlZCAgICAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IFNHU04tVXNlci1TdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDk4IHwgICAgICAgICA3LjMuMTEzIHwgR3JvdXBlZCAgICAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IFVzZXItU3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDk5IHwgICAgICAgICA3LjMuMTE0IHwgRW51bWVyYXRlZCAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IE1NRS1Mb2NhdGlvbiBJbmZvcm1hdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjAwIHwgICAgICAgICA3LjMuMTE1IHwgR3JvdXBlZCAgICAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IFNHU04tTG9jYXRpb24tSW5mb3JtYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjAxIHwgICAgICAgICA3LjMuMTE2IHwgR3JvdXBlZCAgICAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IEUtVVRSQU4tQ2VsbC1HbG9iYWwtSWRlbnRpdHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjAyIHwgICAgICAgICA3LjMuMTE3IHwgT2N0ZXRTdHJpbmcgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IFRyYWNraW5nLUFyZWEtSWRlbnRpdHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjAzIHwgICAgICAgICA3LjMuMTE4IHwgT2N0ZXRTdHJpbmcgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IENlbGwtR2xvYmFsLUlkZW50aXR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjA0IHwgICAgICAgICA3LjMuMTE5IHwgT2N0ZXRTdHJpbmcgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IFJvdXRpbmctQXJlYS1JZGVudGl0eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjA1IHwgICAgICAgICA3LjMuMTIwIHwgT2N0ZXRTdHJpbmcgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IExvY2F0aW9uLUFyZWEtSWRlbnRpdHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjA2IHwgICAgICAgICA3LjMuMTIxIHwgT2N0ZXRTdHJpbmcgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IFNlcnZpY2UtQXJlYS1JZGVudGl0eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjA3IHwgICAgICAgICA3LjMuMTIyIHwgT2N0ZXRTdHJpbmcgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IEdlb2dyYXBoaWNhbC1JbmZvcm1hdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjA4IHwgICAgICAgICA3LjMuMTIzIHwgT2N0ZXRTdHJpbmcgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IEdlb2RldGljLUluZm9ybWF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjA5IHwgICAgICAgICA3LjMuMTI0IHwgT2N0ZXRTdHJpbmcgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IEN1cnJlbnQtTG9jYXRpb24tUmV0cmlldmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjEwIHwgICAgICAgICA3LjMuMTI1IHwgRW51bWVyYXRlZCAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IEFnZS1PZi1Mb2NhdGlvbi1JbmZvcm1hdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjExIHwgICAgICAgICA3LjMuMTI2IHwgVW5zaWduZWQzMiAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IEFjdGl2ZS1BUE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjEyIHwgICAgICAgICA3LjMuMTI3IHwgR3JvdXBlZCAgICAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IEVycm9yLURpYWdub3N0aWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjE0IHwgICAgICAgICA3LjMuMTI4IHwgRW51bWVyYXRlZCAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IEV4dC1QRFAtQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjIxIHwgICAgICAgICA3LjMuMTI5IHwgQWRkcmVzcyAgICAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IFVFLVNSVkNDLUNhcGFiaWxpdHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjE1IHwgICAgICAgICA3LjMuMTMwIHwgRW51bWVyYXRlZCAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IE1QUy1Qcmlvcml0eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjE2IHwgICAgICAgICA3LjMuMTMxIHwgVW5zaWduZWQzMiAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IFZQTE1OLUxJUEEtQWxsb3dlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjE3IHwgICAgICAgICA3LjMuMTMyIHwgRW51bWVyYXRlZCAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IExJUEEtUGVybWlzc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjE4IHwgICAgICAgICA3LjMuMTMzIHwgRW51bWVyYXRlZCAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IFN1YnNjcmliZWQtUGVyaW9kaWMtUkFVLVRBVS1UaW1lciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjE5IHwgICAgICAgICA3LjMuMTM0IHwgVW5zaWduZWQzMiAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IEV4dC1QRFAtVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjIwIHwgICAgICAgICA3LjMuNzVBIHwgT2N0ZXRTdHJpbmcgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IFNJUFRPLVBlcm1pc3Npb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjEzIHwgICAgICAgICA3LjMuMTM1IHwgRW51bWVyYXRlZCAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IE1EVC1Db25maWd1cmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjIyIHwgICAgICAgICA3LjMuMTM2IHwgR3JvdXBlZCAgICAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IEpvYi1UeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjIzIHwgICAgICAgICA3LjMuMTM3IHwgRW51bWVyYXRlZCAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IEFyZWEtU2NvcGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjI0IHwgICAgICAgICA3LjMuMTM4IHwgR3JvdXBlZCAgICAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IExpc3QtT2YtTWVhc3VyZW1lbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjI1IHwgICAgICAgICA3LjMuMTM5IHwgVW5zaWduZWQzMiAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IFJlcG9ydGluZy1UcmlnZ2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjI2IHwgICAgICAgICA3LjMuMTQwIHwgVW5zaWduZWQzMiAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IFJlcG9ydC1JbnRlcnZhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjI3IHwgICAgICAgICA3LjMuMTQxIHwgRW51bWVyYXRlZCAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IFJlcG9ydC1BbW91bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjI4IHwgICAgICAgICA3LjMuMTQyIHwgRW51bWVyYXRlZCAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IEV2ZW50LVRocmVzaG9sZC1SU1JQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjI5IHwgICAgICAgICA3LjMuMTQzIHwgVW5zaWduZWQzMiAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IEV2ZW50LVRocmVzaG9sZC1SU1JRICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjMwIHwgICAgICAgICA3LjMuMTQ0IHwgVW5zaWduZWQzMiAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IExvZ2dpbmctSW50ZXJ2YWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjMxIHwgICAgICAgICA3LjMuMTQ1IHwgRW51bWVyYXRlZCAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IExvZ2dpbmctRHVyYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjMyIHwgICAgICAgICA3LjMuMTQ2IHwgRW51bWVyYXRlZCAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IFJlbGF5LU5vZGUtSW5kaWNhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjMzIHwgICAgICAgICA3LjMuMTQ3IHwgRW51bWVyYXRlZCAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IE1EVC1Vc2VyLUNvbnNlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjM0IHwgICAgICAgICA3LjMuMTQ4IHwgRW51bWVyYXRlZCAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IFBVUi1GbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjM1IHwgICAgICAgICA3LjMuMTQ5IHwgVW5zaWduZWQzMiAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IFN1YnNjcmliZWQtVlNSVkNDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjM2IHwgICAgICAgICA3LjMuMTUwIHwgRW51bWVyYXRlZCAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IEVxdWl2YWxlbnQtUExNTi1MaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjM3IHwgICAgICAgICA3LjMuMTUxIHwgR3JvdXBlZCAgICAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IENMUi1GbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjM4IHwgICAgICAgICA3LjMuMTUyIHwgVW5zaWduZWQzMiAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IFVWUi1GbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjM5IHwgICAgICAgICA3LjMuMTUzIHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFVWQS1GbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjQwIHwgICAgICAgICA3LjMuMTU0IHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFZQTE1OLUNTRy1TdWJzY3JpcHRpb24tRGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjQxIHwgICAgICAgICA3LjMuMTU1IHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFRpbWUtWm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjQyIHwgICAgICAgICA3LjMuMTYzIHwgVVRGOFN0cmluZyAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IEEtTVNJU0ROICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjQzIHwgICAgICAgICA3LjMuMTU3IHwgT2N0ZXRTdHJpbmcgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IE1NRS1OdW1iZXItZm9yLU1ULVNNUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjQ1IHwgICAgICAgICA3LjMuMTU5IHwgT2N0ZXRTdHJpbmcgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IFNNUy1SZWdpc3Rlci1SZXF1ZXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjQ4IHwgICAgICAgICA3LjMuMTYyIHwgRW51bWVyYXRlZCAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IExvY2FsLVRpbWUtWm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjQ5IHwgICAgICAgICA3LjMuMTU2IHwgR3JvdXBlZCAgICAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IERheWxpZ2h0LVNhdmluZy1UaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjUwIHwgICAgICAgICA3LjMuMTY0IHwgRW51bWVyYXRlZCAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IFN1YnNjcmlwdGlvbi1EYXRhLUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjU0IHwgICAgICAgICA3LjMuMTY1IHwgVW5zaWduZWQzMiAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IE1lYXN1cmVtZW50LVBlcmlvZC1VTVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjU1IHwgICAgICAgICA3LjMuMTY2IHwgRW51bWVyYXRlZCAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IE1lYXN1cmVtZW50LVBlcmlvZC1MVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjU2IHwgICAgICAgICA3LjMuMTY3IHwgRW51bWVyYXRlZCAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IENvbGxlY3Rpb24tUGVyaW9kLVJSTS1MVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjU3IHwgICAgICAgICA3LjMuMTY4IHwgRW51bWVyYXRlZCAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IENvbGxlY3Rpb24tUGVyaW9kLVJSTS1VTVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjU4IHwgICAgICAgICA3LjMuMTY5IHwgRW51bWVyYXRlZCAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IFBvc2l0aW9uaW5nLU1ldGhvZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjU5IHwgICAgICAgICA3LjMuMTcwIHwgT2N0ZXRTdHJpbmcgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IE1lYXN1cmVtZW50LVF1YW50aXR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjYwIHwgICAgICAgICA3LjMuMTcxIHwgT2N0ZXRTdHJpbmcgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IEV2ZW50LVRocmVzaG9sZC1FdmVudC0xRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjYxIHwgICAgICAgICA3LjMuMTcyIHwgSW50ZWdlcjMyICAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IEV2ZW50LVRocmVzaG9sZC1FdmVudC0xSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjYyIHwgICAgICAgICA3LjMuMTczIHwgSW50ZWdlcjMyICAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8ICMgM0dQUCAyOS4zMjktYjUwICgxMS41LjAgMjAxMi4xMi4yMSkgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IFVzZXItSWRlbnRpdHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNzAwIHwgICAgICAgICAgIDYuMy4xIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IE1TSVNETiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNzAxIHwgICAgICAgICAgIDYuMy4yIHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8ICMgTmFtZSBjb25mbGljdCB3aXRoIDI5LjIyOSBVc2VyLURhdGEgKDYwNiksIHJlbmFtZWQgICAgICAgICAgfCAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IFVzZXItRGF0YS0yOS4zMjkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNzAyIHwgICAgICAgICAgIDYuMy4zIHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IERhdGEtUmVmZXJlbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNzAzIHwgICAgICAgICAgIDYuMy40IHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFNlcnZpY2UtSW5kaWNhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNzA0IHwgICAgICAgICAgIDYuMy41IHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFN1YnMtUmVxLVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNzA1IHwgICAgICAgICAgIDYuMy42IHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IFJlcXVlc3RlZC1Eb21haW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNzA2IHwgICAgICAgICAgIDYuMy43IHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IEN1cnJlbnQtTG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNzA3IHwgICAgICAgICAgIDYuMy44IHwgRW51bWVyYXRlZCAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IElkZW50aXR5LVNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNzA4IHwgICAgICAgICAgNi4zLjEwIHwgRW51bWVyYXRlZCAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IEV4cGlyeS1UaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNzA5IHwgICAgICAgICAgNi4zLjE2IHwgVGltZSAgICAgICAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IFNlbmQtRGF0YS1JbmRpY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNzEwIHwgICAgICAgICAgNi4zLjE3IHwgRW51bWVyYXRlZCAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8ICMgaW4gMjkuMjI5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8ICMgU2VydmVyLU5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjAyIHwgICAgICAgICAgIDYuMy45IHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8ICMgU3VwcG9ydGVkLUZlYXR1cmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjI4IHwgICAgICAgICAgNi4zLjExIHwgR3JvdXBlZCAgICAgICAgICB8IFYgICAgfCBNICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8ICMgRmVhdHVyZS1MaXN0LUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjI5IHwgICAgICAgICAgNi4zLjEyIHwgVW5zaWduZWQzMiAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8ICMgRmVhdHVyZS1MaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjMwIHwgICAgICAgICAgNi4zLjEzIHwgVW5zaWduZWQzMiAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8ICMgU3VwcG9ydGVkLUFwcGxpY2F0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjMxIHwgICAgICAgICAgNi4zLjE0IHwgR3JvdXBlZCAgICAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8ICMgUHVibGljLUlkZW50aXR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjAxIHwgICAgICAgICAgNi4zLjE1IHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8IERTQUktVGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNzExIHwgICAgICAgICAgNi4zLjE4IHwgT2N0ZXRTdHJpbmcgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgTiAgICB8Cit8ICMgaW4gMjkuMjI5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8ICMgV2lsZGNhcmRlZC1QdWJsaWMtSWRlbnRpdHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjM0IHwgICAgICAgICAgNi4zLjE5IHwgVVRGOFN0cmluZyAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IFdpbGRjYXJkZWQtSU1QVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjM2IHwgICAgICAgICAgNi4zLjIwIHwgVVRGOFN0cmluZyAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8ICMgaW4gMjkuMjI5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8ICMgU2Vzc2lvbi1Qcmlvcml0eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjUwIHwgICAgICAgICAgNi4zLjIxIHwgRW51bWVyYXRlZCAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IE9uZS1UaW1lLU5vdGlmaWNhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNzEyIHwgICAgICAgICAgNi4zLjIyIHwgRW51bWVyYXRlZCAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IFJlcXVlc3RlZC1Ob2RlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNzEzIHwgICAgICAgICAgNi4zLjdBIHwgVW5zaWduZWQzMiAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IFNlcnZpbmctTm9kZS1JbmRpY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNzE0IHwgICAgICAgICAgNi4zLjIzIHwgRW51bWVyYXRlZCAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IFJlcG9zaXRvcnktRGF0YS1JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNzE1IHwgICAgICAgICAgNi4zLjI0IHwgR3JvdXBlZCAgICAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IFNlcXVlbmNlLU51bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNzE2IHwgICAgICAgICAgNi4zLjI1IHwgVW5zaWduZWQzMiAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8IFVEUi1GbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNzE5IHwgICAgICAgICAgNi4zLjI4IHwgVW5zaWduZWQzMiAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8IE0gICAgICAgIHwgTiAgICB8Cit8ICMgT01BIEREUyBDaGFyZ2luZ19EYXRhIFYxLjAgMjAxMTAyMDEtQSAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IEFwcGxpY2F0aW9uLVNlcnZlci1JZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMTAxIHwgICAgICAgICAgICAgOC40IHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IEFwcGxpY2F0aW9uLVNlcnZpY2UtVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMTAyIHwgICAgICAgICAgICAgOC40IHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IEFwcGxpY2F0aW9uLVNlc3Npb24tSWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMTAzIHwgICAgICAgICAgICAgOC40IHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IENvbnRlbnQtSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMTE2IHwgICAgICAgICAgICAgOC40IHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IENvbnRlbnQtcHJvdmlkZXItSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMTE3IHwgICAgICAgICAgICAgOC40IHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IERDRC1JbmZvcm1hdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMTE1IHwgICAgICAgICAgIDguNS41IHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IERlbGl2ZXJ5LVN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMTA0IHwgICAgICAgICAgICAgOC40IHwgVVRGOFN0cmluZyAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IElNLUluZm9ybWF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMTEwIHwgICAgICAgICAgIDguNS42IHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IE51bWJlci1PZi1NZXNzYWdlcy1TdWNjZXNzZnVsbHktRXhwbG9kZWQgICAgICAgICAgICAgICAgICAgICAgfCAyMTExIHwgICAgICAgICAgICAgOC40IHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IE51bWJlci1PZi1NZXNzYWdlcy1TdWNjZXNzZnVsbHktU2VudCAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMTEyIHwgICAgICAgICAgICAgOC40IHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IFNlcnZpY2UtR2VuZXJpYy1JbmZvcm1hdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMjU2IHwgICAgICAgICAgOC41LjEwIHwgR3JvdXBlZCAgICAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IFRvdGFsLU51bWJlci1PZi1NZXNzYWdlcy1FeHBsb2RlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMTEzIHwgICAgICAgICAgICAgOC40IHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8Cit8IFRvdGFsLU51bWJlci1PZi1NZXNzYWdlcy1TZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMTE0IHwgICAgICAgICAgICAgOC40IHwgVW5zaWduZWQzMiAgICAgICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgWSAgICB8CmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfZGNjYV9zdGFyZW50L0NNYWtlTGlzdHMudHh0IGIvZXh0ZW5zaW9ucy9kaWN0X2RjY2Ffc3RhcmVudC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTUyYTAyCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kaWN0X2RjY2Ffc3RhcmVudC9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDE0IEBACisjIFRoZSBkaWN0X2RjY2Ffc3RhcmVudCBleHRlbnNpb24KK1BST0pFQ1QoIkRpYW1ldGVyIERDQ0EgKERpYW1ldGVyIENyZWRpdCBDb250cm9sIEFwcGxpY2F0aW9uKSBTdGFyZW50IGRpY3Rpb25hcnkgZGVmaW5pdGlvbnMgIiBDKQorCisjIENvbXBpbGUgYXMgYSBtb2R1bGUKK0ZEX0FERF9FWFRFTlNJT04oZGljdF9kY2NhX3N0YXJlbnQgZGljdF9kY2NhX3N0YXJlbnQuYykKKworCisjIyMjCisjIyBJTlNUQUxMIHNlY3Rpb24gIyMKKworSU5TVEFMTChUQVJHRVRTIGRpY3RfZGNjYV9zdGFyZW50CisJTElCUkFSWSBERVNUSU5BVElPTiAke0lOU1RBTExfRVhURU5TSU9OU19TVUZGSVh9CisJQ09NUE9ORU5UIGZyZWVEaWFtZXRlci1kaWN0aW9uYXJ5LXJmYzQwMDYtZXh0ZW5zaW9uLXN0YXJlbnQpCisKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF9kY2NhX3N0YXJlbnQvZGljdF9kY2NhX3N0YXJlbnQuYyBiL2V4dGVuc2lvbnMvZGljdF9kY2NhX3N0YXJlbnQvZGljdF9kY2NhX3N0YXJlbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzkxZjFmCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kaWN0X2RjY2Ffc3RhcmVudC9kaWN0X2RjY2Ffc3RhcmVudC5jCkBAIC0wLDAgKzEsNDc4IEBACisvKiAKKyAqIERpY3Rpb25hcnkgZGVmaW5pdGlvbnMgb2Ygb2JqZWN0cyBzcGVjaWZpZWQgaW4gRENDQSBieSBTdGFyZW50LgorICovCisjaW5jbHVkZSA8ZnJlZURpYW1ldGVyL2V4dGVuc2lvbi5oPgorCisKKy8qIFRoZSBjb250ZW50IG9mIHRoaXMgZmlsZSBmb2xsb3dzIHRoZSBzYW1lIHN0cnVjdHVyZSBhcyBkaWN0X2Jhc2VfcHJvdG8uYyAqLworCisjZGVmaW5lIENIRUNLX2RpY3RfbmV3KCBfdHlwZSwgX2RhdGEsIF9wYXJlbnQsIF9yZWYgKQlcCisJQ0hFQ0tfRkNUKCAgZmRfZGljdF9uZXcoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgKF90eXBlKSwgKF9kYXRhKSwgKF9wYXJlbnQpLCAoX3JlZikpICApOworCisjZGVmaW5lIENIRUNLX2RpY3Rfc2VhcmNoKCBfdHlwZSwgX2NyaXRlcmlhLCBfd2hhdCwgX3Jlc3VsdCApCVwKKwlDSEVDS19GQ1QoICBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCAoX3R5cGUpLCAoX2NyaXRlcmlhKSwgKF93aGF0KSwgKF9yZXN1bHQpLCBFTk9FTlQpICk7CisKK3N0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHsKKwljaGFyIAkJCSphdnBfbmFtZTsKKwllbnVtIHJ1bGVfcG9zaXRpb24JcG9zaXRpb247CisJaW50IAkJCW1pbjsKKwlpbnQJCQltYXg7Cit9OworCisjZGVmaW5lIFJVTEVfT1JERVIoIF9wb3NpdGlvbiApICgoKChfcG9zaXRpb24pID09IFJVTEVfRklYRURfSEVBRCkgfHwgKChfcG9zaXRpb24pID09IFJVTEVfRklYRURfVEFJTCkpID8gMSA6IDAgKQorCisvKiBBdHRlbnRpb24hIFRoaXMgdmVyc2lvbiBvZiB0aGUgbWFjcm8gdXNlcyBBVlBfQllfTkFNRV9BTExfVkVORE9SUywgaW4gY29udHJhc3QgdG8gbW9zdCBvdGhlciBjb3BpZXMhICovCisjZGVmaW5lIFBBUlNFX2xvY19ydWxlcyggX3J1bGVhcnJheSwgX3BhcmVudCkgewkJCQkJCQkJXAorCWludCBfX2FyOwkJCQkJCQkJCQkJXAorCWZvciAoX19hcj0wOyBfX2FyIDwgc2l6ZW9mKF9ydWxlYXJyYXkpIC8gc2l6ZW9mKChfcnVsZWFycmF5KVswXSk7IF9fYXIrKykgewkJCVwKKwkJc3RydWN0IGRpY3RfcnVsZV9kYXRhIF9fZGF0YSA9IHsgTlVMTCwgCQkJCQkJCVwKKwkJCShfcnVsZWFycmF5KVtfX2FyXS5wb3NpdGlvbiwJCQkJCQkJXAorCQkJMCwgCQkJCQkJCQkJCVwKKwkJCShfcnVsZWFycmF5KVtfX2FyXS5taW4sCQkJCQkJCQlcCisJCQkoX3J1bGVhcnJheSlbX19hcl0ubWF4fTsJCQkJCQkJXAorCQlfX2RhdGEucnVsZV9vcmRlciA9IFJVTEVfT1JERVIoX19kYXRhLnJ1bGVfcG9zaXRpb24pOwkJCQkJXAorCQlDSEVDS19GQ1QoICBmZF9kaWN0X3NlYXJjaCggCQkJCQkJCQlcCisJCQlmZF9nX2NvbmZpZy0+Y25mX2RpY3QsCQkJCQkJCQlcCisJCQlESUNUX0FWUCwgCQkJCQkJCQkJXAorCQkJQVZQX0JZX05BTUVfQUxMX1ZFTkRPUlMsIAkJCQkJCQlcCisJCQkoX3J1bGVhcnJheSlbX19hcl0uYXZwX25hbWUsIAkJCQkJCQlcCisJCQkmX19kYXRhLnJ1bGVfYXZwLCAwICkgKTsJCQkJCQkJXAorCQlpZiAoICFfX2RhdGEucnVsZV9hdnAgKSB7CQkJCQkJCQlcCisJCQlUUkFDRV9ERUJVRyhJTkZPLCAiQVZQIE5vdCBmb3VuZDogJyVzJyIsIChfcnVsZWFycmF5KVtfX2FyXS5hdnBfbmFtZSApOwkJXAorCQkJcmV0dXJuIEVOT0VOVDsJCQkJCQkJCQlcCisJCX0JCQkJCQkJCQkJCVwKKwkJQ0hFQ0tfRkNUX0RPKCBmZF9kaWN0X25ldyggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1JVTEUsICZfX2RhdGEsIF9wYXJlbnQsIE5VTEwpLAlcCisJCQl7CQkJCQkJCSAgICAgICAgCQlcCisJCQkJVFJBQ0VfREVCVUcoSU5GTywgIkVycm9yIG9uIHJ1bGUgd2l0aCBBVlAgJyVzJyIsICAgICAgCQkJXAorCQkJCQkgKF9ydWxlYXJyYXkpW19fYXJdLmF2cF9uYW1lICk7CQkgICAgICAJCQlcCisJCQkJcmV0dXJuIEVJTlZBTDsJCQkJCSAgICAgIAkJCVwKKwkJCX0gKTsJCQkJCQkJICAgICAgCQkJXAorCX0JCQkJCQkJCQkgICAgICAJCQlcCit9CisKKyNkZWZpbmUgZW51bXZhbF9kZWZfdTMyKCBfdmFsXywgX3N0cl8gKSBcCisJCXsgX3N0cl8sIAkJeyAudTMyID0gX3ZhbF8gfX0KKworI2RlZmluZSBlbnVtdmFsX2RlZl9vcyggX2xlbl8sIF92YWxfLCBfc3RyXyApIFwKKwkJeyBfc3RyXywgCQl7IC5vcyA9IHsgLmRhdGEgPSAodW5zaWduZWQgY2hhciAqKV92YWxfLCAubGVuID0gX2xlbl8gfX19CisKKworc3RhdGljIGludCBkaWN0X2RjY2Ffc3RhcmVudF9lbnRyeShjaGFyICogY29uZmZpbGUpCit7CisJLyogQXBwbGljYXRpb25zIHNlY3Rpb24gKi8KKwl7CQkKKyAgICAgICAgICAgICAgICAvKiBDcmVhdGUgdGhlIHZlbmRvcnMgKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGljdF92ZW5kb3JfZGF0YSB2ZW5kb3JfZGF0YSA9IHsgODE2NCwgIlN0YXJlbnQiIH07CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19GQ1QoZmRfZGljdF9uZXcoZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1ZFTkRPUiwgJnZlbmRvcl9kYXRhLCBOVUxMLCBOVUxMKSk7CisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIAorCX0KKwkKKworCXN0cnVjdCBkaWN0X29iamVjdCAqIEFkZHJlc3NfdHlwZTsKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBEaWFtZXRlcklkZW50aXR5X3R5cGU7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogRGlhbWV0ZXJVUklfdHlwZTsKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBJUEZpbHRlclJ1bGVfdHlwZTsKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBUaW1lX3R5cGU7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogVVRGOFN0cmluZ190eXBlOworCisJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiQWRkcmVzcyIsICZBZGRyZXNzX3R5cGUpOworCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkRpYW1ldGVySWRlbnRpdHkiLCAmRGlhbWV0ZXJJZGVudGl0eV90eXBlKTsKKwlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJEaWFtZXRlclVSSSIsICZEaWFtZXRlclVSSV90eXBlKTsKKwlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJJUEZpbHRlclJ1bGUiLCAmSVBGaWx0ZXJSdWxlX3R5cGUpOworCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIlRpbWUiLCAmVGltZV90eXBlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIlVURjhTdHJpbmciLCAmVVRGOFN0cmluZ190eXBlKTsKKworCS8qIFRoZSBmb2xsb3dpbmcgaXMgY3JlYXRlZCBhdXRvbWF0aWNhbGx5LiBEbyBub3QgbW9kaWZ5LiAqLworCS8qIENoYW5nZXMgd2lsbCBiZSBsb3N0IGR1cmluZyB0aGUgbmV4dCB1cGRhdGUuIE1vZGlmeSB0aGUgc291cmNlIG9yZyBmaWxlIGluc3RlYWQuICovCisKKwkvKiBDaXNjbyBBU1IgNTAwMCBTZXJpZXMgQUFBIEludGVyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCS8qIEFkbWluaXN0cmF0aW9uIGFuZCBSZWZlcmVuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJLyogUmVsZWFzZSA4LnggYW5kIDkuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkvKiBMYXN0IFVwZGF0ZWQgSnVuZSAzMCwgMjAxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCS8qIHVwZGF0ZWQgdXNpbmcgdjE1IGRvY3MgZnJvbSBKYW4gMjAxNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJLyogd3d3LmNpc2NvLmNvbS9jL2RhbS9lbi91cy90ZC9kb2NzL3dpcmVsZXNzL2Fzcl81MDAwLzE1LTAvMTUtMC1BQUEtUmVmZXJlbmNlLnBkZiAgKi8KKwkvKiBTTi1Wb2x1bWUtUXVvdGEtVGhyZXNob2xkICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJNTAxLAkvKiBDb2RlICovCisJCQk4MTY0LAkvKiBWZW5kb3IgKi8KKwkJCSJTTi1Wb2x1bWUtUXVvdGEtVGhyZXNob2xkIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogU04tVW5pdC1RdW90YS1UaHJlc2hvbGQgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk1MDIsCS8qIENvZGUgKi8KKwkJCTgxNjQsCS8qIFZlbmRvciAqLworCQkJIlNOLVVuaXQtUXVvdGEtVGhyZXNob2xkIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogU04tVGltZS1RdW90YS1UaHJlc2hvbGQgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk1MDMsCS8qIENvZGUgKi8KKwkJCTgxNjQsCS8qIFZlbmRvciAqLworCQkJIlNOLVRpbWUtUXVvdGEtVGhyZXNob2xkIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogU04tVG90YWwtVXNlZC1TZXJ2aWNlLVVuaXQgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk1MDQsCS8qIENvZGUgKi8KKwkJCTgxNjQsCS8qIFZlbmRvciAqLworCQkJIlNOLVRvdGFsLVVzZWQtU2VydmljZS1Vbml0IiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBTTi1BYnNvbHV0ZS1WYWxpZGl0eS1UaW1lICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJNTA1LAkvKiBDb2RlICovCisJCQk4MTY0LAkvKiBWZW5kb3IgKi8KKwkJCSJTTi1BYnNvbHV0ZS1WYWxpZGl0eS1UaW1lIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBUaW1lX3R5cGUsIE5VTEwpOworCX07CisKKwkvKiBTTi1CYW5kd2lkdGgtQ29udHJvbCAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTUxMiwJLyogQ29kZSAqLworCQkJODE2NCwJLyogVmVuZG9yICovCisJCQkiU04tQmFuZHdpZHRoLUNvbnRyb2wiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCXN0cnVjdCBkaWN0X29iamVjdAkJKnR5cGU7CisJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIlN0YXJlbnQvRW51bWVyYXRlZChTTi1CYW5kd2lkdGgtQ29udHJvbCkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIFNOLVRyYW5zcGFyZW50LURhdGEgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk1MTMsCS8qIENvZGUgKi8KKwkJCTgxNjQsCS8qIFZlbmRvciAqLworCQkJIlNOLVRyYW5zcGFyZW50LURhdGEiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBTTi1UcmFmZmljLVBvbGljeSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTUxNCwJLyogQ29kZSAqLworCQkJODE2NCwJLyogVmVuZG9yICovCisJCQkiU04tVHJhZmZpYy1Qb2xpY3kiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIFNOLUZpcmV3YWxsLVBvbGljeSAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTUxNSwJLyogQ29kZSAqLworCQkJODE2NCwJLyogVmVuZG9yICovCisJCQkiU04tRmlyZXdhbGwtUG9saWN5IiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCX07CisKKwkvKiBTTi1Vc2FnZS1Nb25pdG9yaW5nLUNvbnRyb2wgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk1MTcsCS8qIENvZGUgKi8KKwkJCTgxNjQsCS8qIFZlbmRvciAqLworCQkJIlNOLVVzYWdlLU1vbml0b3JpbmctQ29udHJvbCIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogU04tTW9uaXRvcmluZy1LZXkgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk1MTgsCS8qIENvZGUgKi8KKwkJCTgxNjQsCS8qIFZlbmRvciAqLworCQkJIlNOLU1vbml0b3JpbmctS2V5IiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBTTi1Vc2FnZS1Wb2x1bWUgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk1MTksCS8qIENvZGUgKi8KKwkJCTgxNjQsCS8qIFZlbmRvciAqLworCQkJIlNOLVVzYWdlLVZvbHVtZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX1VOU0lHTkVENjQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogU04tU2VydmljZS1GbG93LURldGVjdGlvbiAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTUyMCwJLyogQ29kZSAqLworCQkJODE2NCwJLyogVmVuZG9yICovCisJCQkiU04tU2VydmljZS1GbG93LURldGVjdGlvbiIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlzdHJ1Y3QgZGljdF9vYmplY3QJCSp0eXBlOworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICJTdGFyZW50L0VudW1lcmF0ZWQoU04tU2VydmljZS1GbG93LURldGVjdGlvbikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIFNOLVVzYWdlLU1vbml0b3JpbmcgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk1MjEsCS8qIENvZGUgKi8KKwkJCTgxNjQsCS8qIFZlbmRvciAqLworCQkJIlNOLVVzYWdlLU1vbml0b3JpbmciLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0CQkqdHlwZTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiU3RhcmVudC9FbnVtZXJhdGVkKFNOLVVzYWdlLU1vbml0b3JpbmcpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQlDSEVDS19kaWN0X25ldyhESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCX07CisKKwkvKiBTTi1TZXNzaW9uLVN0YXJ0LUluZGljYXRvciAqLworCXsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCTUyMiwJLyogQ29kZSAqLworCQkJODE2NCwJLyogVmVuZG9yICovCisJCQkiU04tU2Vzc2lvbi1TdGFydC1JbmRpY2F0b3IiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogU04tUGhhc2UwLVBTQVBOYW1lICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJNTIzLAkvKiBDb2RlICovCisJCQk4MTY0LAkvKiBWZW5kb3IgKi8KKwkJCSJTTi1QaGFzZTAtUFNBUE5hbWUiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJfTsKKworCS8qIFNOLUNoYXJnaW5nLUlkICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJNTI1LAkvKiBDb2RlICovCisJCQk4MTY0LAkvKiBWZW5kb3IgKi8KKwkJCSJTTi1DaGFyZ2luZy1JZCIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIFNOLVJlbWFpbmluZy1TZXJ2aWNlLVVuaXQgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk1MjYsCS8qIENvZGUgKi8KKwkJCTgxNjQsCS8qIFZlbmRvciAqLworCQkJIlNOLVJlbWFpbmluZy1TZXJ2aWNlLVVuaXQiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJfTsKKworCS8qIFNOLVNlcnZpY2UtU3RhcnQtVGltZXN0YW1wICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJNTI3LAkvKiBDb2RlICovCisJCQk4MTY0LAkvKiBWZW5kb3IgKi8KKwkJCSJTTi1TZXJ2aWNlLVN0YXJ0LVRpbWVzdGFtcCIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgVGltZV90eXBlLCBOVUxMKTsKKwl9OworCisJLyogU04tUnVsZWJhc2UtSWQgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk1MjgsCS8qIENvZGUgKi8KKwkJCTgxNjQsCS8qIFZlbmRvciAqLworCQkJIlNOLVJ1bGViYXNlLUlkIiwJLyogTmFtZSAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwl9OworCisJLyogU04tQ0YtUG9saWN5LUlEICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJNTI5LAkvKiBDb2RlICovCisJCQk4MTY0LAkvKiBWZW5kb3IgKi8KKwkJCSJTTi1DRi1Qb2xpY3ktSUQiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKwkvKiBTTi1DaGFyZ2luZy1Db2xsZWN0aW9uLUZ1bmN0aW9uLU5hbWUgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQk1MzAsCS8qIENvZGUgKi8KKwkJCTgxNjQsCS8qIFZlbmRvciAqLworCQkJIlNOLUNoYXJnaW5nLUNvbGxlY3Rpb24tRnVuY3Rpb24tTmFtZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCX07CisJCUNIRUNLX2RpY3RfbmV3KERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwl9OworCisJLyogU04tRmFzdC1SZWF1dGgtVXNlcm5hbWUgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkxMTAxMCwJLyogQ29kZSAqLworCQkJODE2NCwJLyogVmVuZG9yICovCisJCQkiU04tRmFzdC1SZWF1dGgtVXNlcm5hbWUiLAkvKiBOYW1lICovCisJCQlBVlBfRkxBR19WRU5ET1IgfEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwl9OworCisJLyogU04tUHNldWRvbnltLVVzZXJuYW1lICovCisJeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJMTEwMTEsCS8qIENvZGUgKi8KKwkJCTgxNjQsCS8qIFZlbmRvciAqLworCQkJIlNOLVBzZXVkb255bS1Vc2VybmFtZSIsCS8qIE5hbWUgKi8KKwkJCUFWUF9GTEFHX1ZFTkRPUiB8QVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJQVZQX0ZMQUdfVkVORE9SIHxBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQl9OworCQlDSEVDS19kaWN0X25ldyhESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCX07CisKKworCisJLyogUnVsZXMgc2VjdGlvbiAqLworCisJLyogU04tUmVtYWluaW5nLVNlcnZpY2UtVW5pdCAqLworCXsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICpydWxlX2F2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgdnBhOworCQl2cGEuYXZwX3ZlbmRvciA9IDgxNjQ7CisJCXZwYS5hdnBfbmFtZSA9ICJTTi1SZW1haW5pbmctU2VydmljZS1Vbml0IjsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZ2cGEsICZydWxlX2F2cCk7CisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPSB7CisJCQl7ICAiVGFyaWZmLUNoYW5nZS1Vc2FnZSIsCVJVTEVfT1BUSU9OQUwsCS0xLCAxIH0sCisJCQl7ICAiQ0MtVGltZSIsCSAgICAgICAJCVJVTEVfT1BUSU9OQUwsCS0xLCAxIH0sCisJCQl7ICAiQ0MtVG90YWwtT2N0ZXRzIiwJCVJVTEVfT1BUSU9OQUwsCS0xLCAxIH0sCisJCQl7ICAiQ0MtSW5wdXQtT2N0ZXRzIiwJCVJVTEVfT1BUSU9OQUwsCS0xLCAxIH0sCisJCQl7ICAiQ0MtT3V0cHV0LU9jdGV0cyIsCQlSVUxFX09QVElPTkFMLAktMSwgMSB9LAorCQkJeyAgIkNDLVNlcnZpY2UtU3BlY2lmaWMtVW5pdHMiLAlSVUxFX09QVElPTkFMLAktMSwgMSB9LAorCQkJeyAgIlJlcG9ydGluZy1SZWFzb24iLAkJUlVMRV9PUFRJT05BTCwJLTEsIDEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBydWxlX2F2cCApOworCX0KKworCS8qIFNOLVRvdGFsLVVzZWQtU2VydmljZS1Vbml0ICovCisJeworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKnJ1bGVfYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCB2cGE7CisJCXZwYS5hdnBfdmVuZG9yID0gODE2NDsKKwkJdnBhLmF2cF9uYW1lID0gIlNOLVRvdGFsLVVzZWQtU2VydmljZS1Vbml0IjsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZ2cGEsICZydWxlX2F2cCk7CisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPSB7CisJCQl7ICAiVGFyaWZmLUNoYW5nZS1Vc2FnZSIsCVJVTEVfT1BUSU9OQUwsCS0xLCAxIH0sCisJCQl7ICAiQ0MtVGltZSIsCSAgICAgICAJCVJVTEVfT1BUSU9OQUwsCS0xLCAxIH0sCisJCQl7ICAiQ0MtVG90YWwtT2N0ZXRzIiwJCVJVTEVfT1BUSU9OQUwsCS0xLCAxIH0sCisJCQl7ICAiQ0MtSW5wdXQtT2N0ZXRzIiwJCVJVTEVfT1BUSU9OQUwsCS0xLCAxIH0sCisJCQl7ICAiQ0MtT3V0cHV0LU9jdGV0cyIsCQlSVUxFX09QVElPTkFMLAktMSwgMSB9LAorCQkJeyAgIkNDLVNlcnZpY2UtU3BlY2lmaWMtVW5pdHMiLAlSVUxFX09QVElPTkFMLAktMSwgMSB9LAorCQkJeyAgIlJlcG9ydGluZy1SZWFzb24iLAkJUlVMRV9PUFRJT05BTCwJLTEsIDEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBydWxlX2F2cCApOworCX0KKworCS8qIFNOLVVzYWdlLU1vbml0b3JpbmctQ29udHJvbCAqLworCXsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICpydWxlX2F2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgdnBhOworCQl2cGEuYXZwX3ZlbmRvciA9IDgxNjQ7CisJCXZwYS5hdnBfbmFtZSA9ICJTTi1Vc2FnZS1Nb25pdG9yaW5nLUNvbnRyb2wiOworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJnZwYSwgJnJ1bGVfYXZwKTsKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9IHsKKwkJCXsgICJTTi1Nb25pdG9yaW5nLUtleSIsCQlSVUxFX09QVElPTkFMLAktMSwgMSB9LAorCQkJeyAgIlNOLVVzYWdlLU1vbml0b3JpbmciLAlSVUxFX09QVElPTkFMLAktMSwgMSB9LAorCQkJeyAgIlNOLVVzYWdlLVZvbHVtZSIsCQlSVUxFX09QVElPTkFMLAktMSwgMSB9LAorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBydWxlX2F2cCApOworCX0KKworCUxPR19EKCAiRXh0ZW5zaW9uICdEaWN0aW9uYXJ5IGRlZmluaXRpb25zIGZvciBEQ0NBIFN0YXJlbnQnIGluaXRpYWxpemVkIik7CisJcmV0dXJuIDA7Cit9CisKK0VYVEVOU0lPTl9FTlRSWSgiZGljdF9kY2NhX3N0YXJlbnQiLCBkaWN0X2RjY2Ffc3RhcmVudF9lbnRyeSwgImRpY3RfZGNjYV8zZ3BwIik7CmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfZGNjYV9zdGFyZW50L2RpY3RfZGNjYV9zdGFyZW50Lm9yZyBiL2V4dGVuc2lvbnMvZGljdF9kY2NhX3N0YXJlbnQvZGljdF9kY2NhX3N0YXJlbnQub3JnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MTRkOWYKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfZGNjYV9zdGFyZW50L2RpY3RfZGNjYV9zdGFyZW50Lm9yZwpAQCAtMCwwICsxLDMxIEBACit8IEF0dHJpYnV0ZSBOYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBDb2RlIHwgU2VjdGlvbiBkZWZpbmVkIHwgVmFsdWUgVHlwZSAgfCBNVVNUIHwgTUFZIHwgU0hMRCBOT1QgfCBNVVNUIE5PVCB8IEVuY3IgfAorfCAjIENpc2NvIEFTUiA1MDAwIFNlcmllcyBBQUEgSW50ZXJmYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8ICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIHwgICAgICB8ICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgIHwKK3wgIyBBZG1pbmlzdHJhdGlvbiBhbmQgUmVmZXJlbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfCAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICB8ICAgICAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8ICMgUmVsZWFzZSA4LnggYW5kIDkuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgfCAgICAgIHwgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgfAorfCAjIExhc3QgVXBkYXRlZCBKdW5lIDMwLCAyMDEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8ICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIHwgICAgICB8ICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgIHwKK3wgIyB1cGRhdGVkIHVzaW5nIHYxNSBkb2NzIGZyb20gSmFuIDIwMTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfCAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICB8ICAgICAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8ICMgd3d3LmNpc2NvLmNvbS9jL2RhbS9lbi91cy90ZC9kb2NzL3dpcmVsZXNzL2Fzcl81MDAwLzE1LTAvMTUtMC1BQUEtUmVmZXJlbmNlLnBkZiB8ICAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgfCAgICAgIHwgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgfAorfCBTTi1Wb2x1bWUtUXVvdGEtVGhyZXNob2xkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDUwMSB8ICAgICAgICAgICAgICAgICB8IFVuc2lnbmVkMzIgIHwgTSxWICB8ICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgIHwKK3wgU04tVW5pdC1RdW90YS1UaHJlc2hvbGQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA1MDIgfCAgICAgICAgICAgICAgICAgfCBVbnNpZ25lZDMyICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IFNOLVRpbWUtUXVvdGEtVGhyZXNob2xkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgNTAzIHwgICAgICAgICAgICAgICAgIHwgVW5zaWduZWQzMiAgfCBNLFYgIHwgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgfAorfCBTTi1Ub3RhbC1Vc2VkLVNlcnZpY2UtVW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDUwNCB8ICAgICAgICAgICAgICAgICB8IEdyb3VwZWQgICAgIHwgViAgICB8ICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgIHwKK3wgU04tQWJzb2x1dGUtVmFsaWRpdHktVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA1MDUgfCAgICAgICAgICAgICAgICAgfCBUaW1lICAgICAgICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IFNOLUJhbmR3aWR0aC1Db250cm9sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgNTEyIHwgICAgICAgICAgICAgICAgIHwgRW51bWVyYXRlZCAgfCBNLFYgIHwgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgfAorfCBTTi1UcmFuc3BhcmVudC1EYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDUxMyB8ICAgICAgICAgICAgICAgICB8IE9jdGV0U3RyaW5nIHwgViAgICB8ICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgIHwKK3wgU04tVHJhZmZpYy1Qb2xpY3kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA1MTQgfCAgICAgICAgICAgICAgICAgfCBVVEY4U3RyaW5nICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IFNOLUZpcmV3YWxsLVBvbGljeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgNTE1IHwgICAgICAgICAgICAgICAgIHwgVVRGOFN0cmluZyAgfCBWICAgIHwgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgfAorfCBTTi1Vc2FnZS1Nb25pdG9yaW5nLUNvbnRyb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDUxNyB8ICAgICAgICAgICAgICAgICB8IEdyb3VwZWQgICAgIHwgViAgICB8ICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgIHwKK3wgU04tTW9uaXRvcmluZy1LZXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA1MTggfCAgICAgICAgICAgICAgICAgfCBVbnNpZ25lZDMyICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IFNOLVVzYWdlLVZvbHVtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgNTE5IHwgICAgICAgICAgICAgICAgIHwgVW5zaWduZWQ2NCAgfCBWICAgIHwgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgfAorfCBTTi1TZXJ2aWNlLUZsb3ctRGV0ZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDUyMCB8ICAgICAgICAgICAgICAgICB8IEVudW1lcmF0ZWQgIHwgViAgICB8ICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgIHwKK3wgU04tVXNhZ2UtTW9uaXRvcmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA1MjEgfCAgICAgICAgICAgICAgICAgfCBFbnVtZXJhdGVkICB8IFYgICAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IFNOLVNlc3Npb24tU3RhcnQtSW5kaWNhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgNTIyIHwgICAgICAgICAgICAgICAgIHwgT2N0ZXRTdHJpbmcgfCBNLFYgIHwgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgfAorfCBTTi1QaGFzZTAtUFNBUE5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDUyMyB8ICAgICAgICAgICAgICAgICB8IFVURjhTdHJpbmcgIHwgViAgICB8ICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgIHwKK3wgU04tQ2hhcmdpbmctSWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA1MjUgfCAgICAgICAgICAgICAgICAgfCBPY3RldFN0cmluZyB8IFYgICAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IFNOLVJlbWFpbmluZy1TZXJ2aWNlLVVuaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgNTI2IHwgICAgICAgICAgICAgICAgIHwgR3JvdXBlZCAgICAgfCBWICAgIHwgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgfAorfCBTTi1TZXJ2aWNlLVN0YXJ0LVRpbWVzdGFtcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDUyNyB8ICAgICAgICAgICAgICAgICB8IFRpbWUgICAgICAgIHwgViAgICB8ICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgIHwKK3wgU04tUnVsZWJhc2UtSWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA1MjggfCAgICAgICAgICAgICAgICAgfCBVVEY4U3RyaW5nICB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IFNOLUNGLVBvbGljeS1JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgNTI5IHwgICAgICAgICAgICAgICAgIHwgVW5zaWduZWQzMiAgfCBNLFYgIHwgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgfAorfCBTTi1DaGFyZ2luZy1Db2xsZWN0aW9uLUZ1bmN0aW9uLU5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDUzMCB8ICAgICAgICAgICAgICAgICB8IFVURjhTdHJpbmcgIHwgViAgICB8ICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgIHwKK3wgU04tRmFzdC1SZWF1dGgtVXNlcm5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTEwMTAgfCAgICAgICAgICAgICAgICAgfCBPY3RldFN0cmluZyB8IE0sViAgfCAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8Cit8IFNOLVBzZXVkb255bS1Vc2VybmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDExMDExIHwgICAgICAgICAgICAgICAgIHwgT2N0ZXRTdHJpbmcgfCBNLFYgIHwgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgfApkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X2RyYWZ0bG9hZF9hdnBzL0NNYWtlTGlzdHMudHh0IGIvZXh0ZW5zaW9ucy9kaWN0X2RyYWZ0bG9hZF9hdnBzL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwYzgyNDQKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfZHJhZnRsb2FkX2F2cHMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxNiBAQAorIyBUaGUgZGljdF9kcmFmdGxvYWRfYXZwcyBleHRlbnNpb24KK1BST0pFQ1QoImRpY3RfZHJhZnRsb2FkX2F2cHMgbGlicmFyeSBnZW5lcmF0ZWQgYnkgRmRHZW4gIiBDKQorCisjIENvbXBpbGUgYXMgYSBtb2R1bGUKK0ZEX0FERF9FWFRFTlNJT04oZGljdF9kcmFmdGxvYWRfYXZwcyBkaWN0X2RyYWZ0bG9hZF9hdnBzLmMpCisKKworIyMjIworIyMgSU5TVEFMTCBzZWN0aW9uICMjCisKK0lOU1RBTEwoVEFSR0VUUyBkaWN0X2RyYWZ0bG9hZF9hdnBzCisJTElCUkFSWSBERVNUSU5BVElPTiAke0lOU1RBTExfRVhURU5TSU9OU19TVUZGSVh9CitDT01QT05FTlQgZnJlZURpYW1ldGVyLWRpY3Rpb25hcnktRFJBRlRMT0FEX0FWUFMpCisKKworCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfZHJhZnRsb2FkX2F2cHMvZGljdF9kcmFmdGxvYWRfYXZwcy5jIGIvZXh0ZW5zaW9ucy9kaWN0X2RyYWZ0bG9hZF9hdnBzL2RpY3RfZHJhZnRsb2FkX2F2cHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYThjNzYwCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kaWN0X2RyYWZ0bG9hZF9hdnBzL2RpY3RfZHJhZnRsb2FkX2F2cHMuYwpAQCAtMCwwICsxLDIzNiBAQAorLyoKKyogQ29weXJpZ2h0IChjKSAyMDE3IFNwcmludAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvKioqKioqKioqKioqKioqKgorIEdlbmVyYXRlZCBCeTogZmR0b29sIGVuaGFuY2VtZW50cyB0byBkaWFmdXp6ZXIKKyBMaWNlbnNlOiBzYW1lIGFzIGZyZWVEaWFtZXRlcgorKioqKioqKioqKioqKioqKi8KKworCisvKiAKKyAqIERpY3Rpb25hcnkgZGVmaW5pdGlvbnMgb2Ygb2JqZWN0cyBzcGVjaWZpZWQgaW4gZHJhZnRsb2FkX2F2cHMuCisgKi8KKyNpbmNsdWRlIDxmcmVlRGlhbWV0ZXIvZXh0ZW5zaW9uLmg+CisKKyNkZWZpbmUgUFJPVE9fVkVSICJ1bnNwZWNpZmllZCIKKyNkZWZpbmUgR0VOX0RBVEUgIDE1MDY2OTcxNDMuNAorCitjb25zdCBjaGFyICpkcmFmdGxvYWRfYXZwc19wcm90b192ZXIgPSBQUk9UT19WRVI7Citjb25zdCBkb3VibGUgZHJhZnRsb2FkX2F2cHNfZ2VuX2RhdGUgPSBHRU5fREFURTsKKworLyogVGhlIGNvbnRlbnQgb2YgdGhpcyBmaWxlIGZvbGxvd3MgdGhlIHNhbWUgc3RydWN0dXJlIGFzIGRpY3RfYmFzZV9wcm90by5jICovCisKKyNkZWZpbmUgQ0hFQ0tfZGljdF9uZXcoIF90eXBlLCBfZGF0YSwgX3BhcmVudCwgX3JlZiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgX3JldCA9IGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIChfdHlwZSksIChfZGF0YSksIChfcGFyZW50KSwgKF9yZWYpICk7IFwKKyAgICBpZiAoIF9yZXQgIT0gMCAmJiBfcmV0ICE9IEVFWElTVCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICByZXR1cm4gX3JldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBDSEVDS19kaWN0X3NlYXJjaCggX3R5cGUsIF9jcml0ZXJpYSwgX3doYXQsIF9yZXN1bHQgKQkJXAorICAgIENIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIChfdHlwZSksIChfY3JpdGVyaWEpLCAoX3doYXQpLCAoX3Jlc3VsdCksIEVOT0VOVCkgKTsKKworc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24geworICAgIHN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lOworICAgIGVudW0gcnVsZV9wb3NpdGlvbglwb3NpdGlvbjsKKyAgICBpbnQgCQkJbWluOworICAgIGludAkJCW1heDsKK307CisKKyNkZWZpbmUgUlVMRV9PUkRFUiggX3Bvc2l0aW9uICkgKCgoKF9wb3NpdGlvbikgPT0gUlVMRV9GSVhFRF9IRUFEKSB8fCAoKF9wb3NpdGlvbikgPT0gUlVMRV9GSVhFRF9UQUlMKSkgPyAxIDogMCApCisKKy8qIEF0dGVudGlvbiEgVGhpcyB2ZXJzaW9uIG9mIHRoZSBtYWNybyB1c2VzIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsIGluIGNvbnRyYXN0IHRvIG1vc3Qgb3RoZXIgY29waWVzISAqLworI2RlZmluZSBQQVJTRV9sb2NfcnVsZXMoIF9ydWxlYXJyYXksIF9wYXJlbnQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBfX2FyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yIChfX2FyPTA7IF9fYXIgPCBzaXplb2YoX3J1bGVhcnJheSkgLyBzaXplb2YoKF9ydWxlYXJyYXkpWzBdKTsgX19hcisrKSB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHN0cnVjdCBkaWN0X3J1bGVfZGF0YSBfX2RhdGEgPSB7IE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ucG9zaXRpb24sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLm1pbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ubWF4fTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfX2RhdGEucnVsZV9vcmRlciA9IFJVTEVfT1JERVIoX19kYXRhLnJ1bGVfcG9zaXRpb24pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIENIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIERJQ1RfQVZQLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAmKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICZfX2RhdGEucnVsZV9hdnAsIDAgKSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmICggIV9fZGF0YS5ydWxlX2F2cCApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9ERUJVRyhJTkZPLCAiQVZQIE5vdCBmb3VuZDogJyVzJyIsIChfcnVsZWFycmF5KVtfX2FyXS5hdnBfdmVuZG9yX3BsdXNfbmFtZS5hdnBfbmFtZSk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFTk9FTlQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgX3JldCA9IGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfUlVMRSwgJihfX2RhdGEpLCAoX3BhcmVudCksIE5VTEwgKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggX3JldCAhPSAwICYmIF9yZXQgIT0gRUVYSVNUICkgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFX0RFQlVHKElORk8sICJFcnJvciBvbiBydWxlIHdpdGggQVZQICclcyciLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLmF2cF9uYW1lKTsgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRUlOVkFMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgQ0hFQ0tfdmVuZG9yX25ldyggX2RhdGEgKSB7IFwKKyAgICAgICAgc3RydWN0IGRpY3Rfb2JqZWN0ICogdmVuZG9yX2ZvdW5kOyBcCisgICAgICAgIGlmIChmZF9kaWN0X3NlYXJjaChmZF9nX2NvbmZpZy0+Y25mX2RpY3QsRElDVF9WRU5ET1IsVkVORE9SX0JZX0lELCZfZGF0YS52ZW5kb3JfaWQsJnZlbmRvcl9mb3VuZCxFTk9FTlQpID09IEVOT0VOVCkgeyBcCisgICAgICAgICAgICAgICAgQ0hFQ0tfRkNUKGZkX2RpY3RfbmV3KGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9WRU5ET1IsICZfZGF0YSwgTlVMTCwgTlVMTCkpOyBcCisgICAgICAgIH0gXAorfQorCisjZGVmaW5lIGVudW12YWxfZGVmX3UzMiggX3ZhbF8sIF9zdHJfICkJCVwKKyAgICB7IF9zdHJfLCAJCXsgLnUzMiA9IF92YWxfIH19CisKKyNkZWZpbmUgZW51bXZhbF9kZWZfb3MoIF9sZW5fLCBfdmFsXywgX3N0cl8gKQkJCQlcCisgICAgeyBfc3RyXywgCQl7IC5vcyA9IHsgLmRhdGEgPSAodW5zaWduZWQgY2hhciAqKV92YWxfLCAubGVuID0gX2xlbl8gfX19CisKKworc3RhdGljIGludCBkaWN0X2RyYWZ0bG9hZF9hdnBzX2xvYWRfZGVmcyhjaGFyICogY29uZmZpbGUpCit7CisgICBUUkFDRV9FTlRSWSgiJXAiLCBjb25mZmlsZSk7CisKKyAgIC8qIEFWUCBzZWN0aW9uICovCisgICB7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIEFkZHJlc3NfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogVVRGOFN0cmluZ190eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBEaWFtZXRlcklkZW50aXR5X3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIERpYW1ldGVyVVJJX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIFRpbWVfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogSVBGaWx0ZXJSdWxlX3R5cGU7CisKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiQWRkcmVzcyIsICZBZGRyZXNzX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJVVEY4U3RyaW5nIiwgJlVURjhTdHJpbmdfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkRpYW1ldGVySWRlbnRpdHkiLCAmRGlhbWV0ZXJJZGVudGl0eV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiRGlhbWV0ZXJVUkkiLCAmRGlhbWV0ZXJVUklfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIlRpbWUiLCAmVGltZV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiSVBGaWx0ZXJSdWxlIiwgJklQRmlsdGVyUnVsZV90eXBlKTsKKwkJLyogTG9hZC1UeXBlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNjUxLAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIkxvYWQtVHlwZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICJFbnVtZXJhdGVkKExvYWQtVHlwZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIkhPU1QiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiUEVFUiIsIHsgLmkzMj0xIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBMb2FkLVZhbHVlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNjUyLAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIkxvYWQtVmFsdWUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDY0CS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFNvdXJjZUlEICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNjQ5LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIlNvdXJjZUlEIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBEaWFtZXRlcklkZW50aXR5X3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBMb2FkICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNjUwLAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIkxvYWQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisKKwkKKyAgIH0KKworICAgLyogQ29tbWFuZHMgc2VjdGlvbiAqLworICAgeworCisgICB9CisKKyAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRpY3RfZHJhZnRsb2FkX2F2cHNfbG9hZF9ydWxlcyhjaGFyICogY29uZmZpbGUpCit7CisgICAvKiBHcm91cGVkIEFWUCBzZWN0aW9uICovCisgICB7CisJICAvKiBMb2FkICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkxvYWQifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiTG9hZC1UeXBlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkxvYWQtVmFsdWUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU291cmNlSUQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisKKyAgIH0JCisKKyAgIC8qIENvbW1hbmRzIHNlY3Rpb24gKi8KKyAgIHsKKworICAgfQorCisgICBMT0dfRCggIkV4dGVuc2lvbiAnRGljdGlvbmFyeSBkZWZpbml0aW9ucyBmb3IgZHJhZnRsb2FkX2F2cHMgKE5vbmUpJyBpbml0aWFsaXplZCIpOworICAgcmV0dXJuIDA7Cit9CisKK2ludCBkaWN0X2VudHJ5KGNoYXIgKiBjb25mZmlsZSkKK3sKKwlkaWN0X2RyYWZ0bG9hZF9hdnBzX2xvYWRfZGVmcyhjb25mZmlsZSk7CisJcmV0dXJuIGRpY3RfZHJhZnRsb2FkX2F2cHNfbG9hZF9ydWxlcyhjb25mZmlsZSk7Cit9CisKK2NvbnN0IGNoYXIqIGRpY3RfZHJhZnRsb2FkX2F2cHNfcHJvdG9fdmVyKGNoYXIgKiBjb25mZmlsZSkgeworCXJldHVybiBkcmFmdGxvYWRfYXZwc19wcm90b192ZXI7Cit9CisKK2NvbnN0IGRvdWJsZSBkaWN0X2RyYWZ0bG9hZF9hdnBzX2dlbl90cyhjaGFyICogY29uZmZpbGUpIHsKKwlyZXR1cm4gZHJhZnRsb2FkX2F2cHNfZ2VuX2RhdGU7Cit9CisKK0VYVEVOU0lPTl9FTlRSWTIoImRpY3RfZHJhZnRsb2FkX2F2cHMiLCBkaWN0X2RyYWZ0bG9hZF9hdnBzX2xvYWRfZGVmcywgZGljdF9kcmFmdGxvYWRfYXZwc19sb2FkX3J1bGVzKTsKKworCisKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF9kcmFmdGxvYWRfYXZwcy9kcmFmdGxvYWRfYXZwcy5kaWQgYi9leHRlbnNpb25zL2RpY3RfZHJhZnRsb2FkX2F2cHMvZHJhZnRsb2FkX2F2cHMuZGlkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMDQzMGUKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfZHJhZnRsb2FkX2F2cHMvZHJhZnRsb2FkX2F2cHMuZGlkCkBAIC0wLDAgKzEgQEAKK2RpY3RfZHJhZnRsb2FkX2F2cHMKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF9lYXAvQ01ha2VMaXN0cy50eHQgYi9leHRlbnNpb25zL2RpY3RfZWFwL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMGI1NTcKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfZWFwL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTMgQEAKKyMgVGhlIGRpY3RfZWFwIGV4dGVuc2lvbgorUFJPSkVDVCgiRGlhbWV0ZXIgRUFQIChSRkM0MDcyKSBkaWN0aW9uYXJ5IGRlZmluaXRpb25zIiBDKQorCisjIENvbXBpbGUgYXMgYSBtb2R1bGUKK0ZEX0FERF9FWFRFTlNJT04oZGljdF9lYXAgZGljdF9lYXAuYykKKworCisjIyMjCisjIyBJTlNUQUxMIHNlY3Rpb24gIyMKKworSU5TVEFMTChUQVJHRVRTIGRpY3RfZWFwCisJTElCUkFSWSBERVNUSU5BVElPTiAke0lOU1RBTExfRVhURU5TSU9OU19TVUZGSVh9CisJQ09NUE9ORU5UIGZyZWVEaWFtZXRlci1kaWN0aW9uYXJ5LVJGQzQwNzIpCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfZWFwL2RpY3RfZWFwLmMgYi9leHRlbnNpb25zL2RpY3RfZWFwL2RpY3RfZWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRlNTczMQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF9lYXAvZGljdF9lYXAuYwpAQCAtMCwwICsxLDUxOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTMsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAKKyAqIERpY3Rpb25hcnkgZGVmaW5pdGlvbnMgb2Ygb2JqZWN0cyBzcGVjaWZpZWQgaW4gRGlhbWV0ZXIgRUFQIGFwcGxpY2F0aW9uIChSRkM0MDcyKS4KKyAqLworI2luY2x1ZGUgPGZyZWVEaWFtZXRlci9leHRlbnNpb24uaD4KKworLyogVGhlIGNvbnRlbnQgb2YgdGhpcyBmaWxlIGZvbGxvd3MgdGhlIHNhbWUgc3RydWN0dXJlIGFzIGRpY3RfYmFzZV9wcm90by5jICovCisKKyNkZWZpbmUgQ0hFQ0tfZGljdF9uZXcoIF90eXBlLCBfZGF0YSwgX3BhcmVudCwgX3JlZiApCVwKKwlDSEVDS19GQ1QoICBmZF9kaWN0X25ldyggZmRfZ19jb25maWctPmNuZl9kaWN0LCAoX3R5cGUpLCAoX2RhdGEpLCAoX3BhcmVudCksIChfcmVmKSkgICk7CisKKyNkZWZpbmUgQ0hFQ0tfZGljdF9zZWFyY2goIF90eXBlLCBfY3JpdGVyaWEsIF93aGF0LCBfcmVzdWx0ICkJXAorCUNIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIChfdHlwZSksIChfY3JpdGVyaWEpLCAoX3doYXQpLCAoX3Jlc3VsdCksIEVOT0VOVCkgKTsKKworc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24geworCWNoYXIgCQkJKmF2cF9uYW1lOworCWVudW0gcnVsZV9wb3NpdGlvbglwb3NpdGlvbjsKKwlpbnQgCQkJbWluOworCWludAkJCW1heDsKK307CisKKyNkZWZpbmUgUlVMRV9PUkRFUiggX3Bvc2l0aW9uICkgKCgoKF9wb3NpdGlvbikgPT0gUlVMRV9GSVhFRF9IRUFEKSB8fCAoKF9wb3NpdGlvbikgPT0gUlVMRV9GSVhFRF9UQUlMKSkgPyAxIDogMCApCisKKyNkZWZpbmUgUEFSU0VfbG9jX3J1bGVzKCBfcnVsZWFycmF5LCBfcGFyZW50KSB7CQkJCQkJCQlcCisJaW50IF9fYXI7CQkJCQkJCQkJCQlcCisJZm9yIChfX2FyPTA7IF9fYXIgPCBzaXplb2YoX3J1bGVhcnJheSkgLyBzaXplb2YoKF9ydWxlYXJyYXkpWzBdKTsgX19hcisrKSB7CQkJXAorCQlzdHJ1Y3QgZGljdF9ydWxlX2RhdGEgX19kYXRhID0geyBOVUxMLCAJCQkJCQkJXAorCQkJKF9ydWxlYXJyYXkpW19fYXJdLnBvc2l0aW9uLAkJCQkJCQlcCisJCQkwLCAJCQkJCQkJCQkJXAorCQkJKF9ydWxlYXJyYXkpW19fYXJdLm1pbiwJCQkJCQkJCVwKKwkJCShfcnVsZWFycmF5KVtfX2FyXS5tYXh9OwkJCQkJCQlcCisJCV9fZGF0YS5ydWxlX29yZGVyID0gUlVMRV9PUkRFUihfX2RhdGEucnVsZV9wb3NpdGlvbik7CQkJCQlcCisJCUNIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoKCAJCQkJCQkJCVwKKwkJCWZkX2dfY29uZmlnLT5jbmZfZGljdCwJCQkJCQkJCVwKKwkJCURJQ1RfQVZQLCAJCQkJCQkJCQlcCisJCQlBVlBfQllfTkFNRSwgCQkJCQkJCQkJXAorCQkJKF9ydWxlYXJyYXkpW19fYXJdLmF2cF9uYW1lLCAJCQkJCQkJXAorCQkJJl9fZGF0YS5ydWxlX2F2cCwgMCApICk7CQkJCQkJCVwKKwkJaWYgKCAhX19kYXRhLnJ1bGVfYXZwICkgewkJCQkJCQkJXAorCQkJVFJBQ0VfREVCVUcoSU5GTywgIkFWUCBOb3QgZm91bmQ6ICclcyciLCAoX3J1bGVhcnJheSlbX19hcl0uYXZwX25hbWUgKTsJCVwKKwkJCXJldHVybiBFTk9FTlQ7CQkJCQkJCQkJXAorCQl9CQkJCQkJCQkJCQlcCisJCUNIRUNLX0ZDVF9ETyggZmRfZGljdF9uZXcoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9SVUxFLCAmX19kYXRhLCBfcGFyZW50LCBOVUxMKSwJXAorCQkJewkJCQkJCQkgICAgICAgIAkJXAorCQkJCVRSQUNFX0RFQlVHKElORk8sICJFcnJvciBvbiBydWxlIHdpdGggQVZQICclcyciLCAgICAgIAkJCVwKKwkJCQkJIChfcnVsZWFycmF5KVtfX2FyXS5hdnBfbmFtZSApOwkJICAgICAgCQkJXAorCQkJCXJldHVybiBFSU5WQUw7CQkJCQkgICAgICAJCQlcCisJCQl9ICk7CQkJCQkJCSAgICAgIAkJCVwKKwl9CQkJCQkJCQkJICAgICAgCQkJXAorfQorCisjZGVmaW5lIGVudW12YWxfZGVmX3UzMiggX3ZhbF8sIF9zdHJfICkgXAorCQl7IF9zdHJfLCAJCXsgLnUzMiA9IF92YWxfIH19CisKKyNkZWZpbmUgZW51bXZhbF9kZWZfb3MoIF9sZW5fLCBfdmFsXywgX3N0cl8gKSBcCisJCXsgX3N0cl8sIAkJeyAub3MgPSB7IC5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilfdmFsXywgLmxlbiA9IF9sZW5fIH19fQorCisKK3N0YXRpYyBpbnQgZGVhcF9lbnRyeShjaGFyICogY29uZmZpbGUpCit7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogZWFwOworCVRSQUNFX0VOVFJZKCIlcCIsIGNvbmZmaWxlKTsKKwkKKwkvKiBBcHBsaWNhdGlvbnMgc2VjdGlvbiAqLworCXsKKwkJLyogRUFQIChSRkMgNDA3MikgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXBwbGljYXRpb25fZGF0YSBkYXRhICA9IHsgCTUsICJEaWFtZXRlciBFeHRlbnNpYmxlIEF1dGhlbnRpY2F0aW9uIFByb3RvY29sIChFQVApIEFwcGxpY2F0aW9uIgl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVBQTElDQVRJT04sICZkYXRhICwgTlVMTCwgJmVhcCk7CisJCX0KKwl9CisJCisJLyogQVZQIHNlY3Rpb24gKi8KKwl7CisJCS8qIEVBUC1QYXlsb2FkICovCisJCXsKKwkJCS8qCisJCQkJVGhlIEVBUC1QYXlsb2FkIEFWUCAoQVZQIENvZGUgNDYyKSBpcyBvZiB0eXBlIE9jdGV0U3RyaW5nIGFuZCBpcyB1c2VkCisJCQkJdG8gZW5jYXBzdWxhdGUgdGhlIGFjdHVhbCBFQVAgcGFja2V0IHRoYXQgaXMgYmVpbmcgZXhjaGFuZ2VkIGJldHdlZW4KKwkJCQl0aGUgRUFQIGNsaWVudCBhbmQgdGhlIGhvbWUgRGlhbWV0ZXIgc2VydmVyLgorCQkJKi8KKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQkJCQk0NjIsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiRUFQLVBheWxvYWQiLCAJCQkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgTlVMTCk7CisJCX0KKwkJCisJCS8qIEVBUC1SZWlzc3VlZC1QYXlsb2FkICovCisJCXsKKwkJCS8qCisJCQkJVGhlIEVBUC1SZWlzc3VlZC1QYXlsb2FkIEFWUCAoQVZQIENvZGUgNDYzKSBpcyBvZiB0eXBlIE9jdGV0U3RyaW5nLgorCQkJKi8KKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQkJCQk0NjMsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiRUFQLVJlaXNzdWVkLVBheWxvYWQiLCAJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORyAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsIE5VTEwpOworCQl9CisJCQorCQkvKiBFQVAtTWFzdGVyLVNlc3Npb24tS2V5ICovCisJCXsKKwkJCS8qCisJCQkJVGhlIEVBUC1NYXN0ZXItU2Vzc2lvbi1LZXkgQVZQIChBVlAgQ29kZSA0NjQpIGlzIG9mIHR5cGUgT2N0ZXRTdHJpbmcuCisJCQkJSXQgY29udGFpbnMga2V5aW5nIG1hdGVyaWFsIGZvciBwcm90ZWN0aW5nIHRoZSBjb21tdW5pY2F0aW9ucyBiZXR3ZWVuCisJCQkJdGhlIHVzZXIgYW5kIHRoZSBOQVMuICBFeGFjdGx5IGhvdyB0aGlzIGtleWluZyBtYXRlcmlhbCBpcyB1c2VkCisJCQkJZGVwZW5kcyBvbiB0aGUgbGluayBsYXllciBpbiBxdWVzdGlvbiwgYW5kIGlzIGJleW9uZCB0aGUgc2NvcGUgb2YKKwkJCQl0aGlzIGRvY3VtZW50LgorCQkJKi8KKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQkJCQk0NjQsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiRUFQLU1hc3Rlci1TZXNzaW9uLUtleSIsIAkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgTlVMTCk7CisJCX0KKwkJCisJCS8qIEVBUC1LZXktTmFtZSAqLworCQl7CisJCQkvKgorCQkJCVRoZSBFQVAtS2V5LU5hbWUgQVZQIChSYWRpdXMgQXR0cmlidXRlIFR5cGUgMTAyKSBpcyBvZiB0eXBlCisJCQkJT2N0ZXRTdHJpbmcuICBJdCBjb250YWlucyBhbiBvcGFxdWUga2V5IGlkZW50aWZpZXIgKG5hbWUpIGdlbmVyYXRlZAorCQkJCWJ5IHRoZSBFQVAgbWV0aG9kLiAgRXhhY3RseSBob3cgdGhpcyBuYW1lIGlzIHVzZWQgZGVwZW5kcyBvbiB0aGUgbGluaworCQkJCWxheWVyIGluIHF1ZXN0aW9uLCBhbmQgaXMgYmV5b25kIHRoZSBzY29wZSBvZiB0aGlzIGRvY3VtZW50IChzZWUKKwkJCQlbRUFQS2V5XSBmb3IgbW9yZSBkaXNjdXNzaW9uKS4KKworCQkJCU5vdGUgdGhhdCBub3QgYWxsIGxpbmsgbGF5ZXJzIHVzZSB0aGlzIG5hbWUsIGFuZCBjdXJyZW50bHkgbW9zdCBFQVAKKwkJCQltZXRob2RzIGRvIG5vdCBnZW5lcmF0ZSBpdC4gIFNpbmNlIHRoZSBOQVMgb3BlcmF0ZXMgaW4gcGFzcy10aHJvdWdoCisJCQkJbW9kZSwgaXQgY2Fubm90IGtub3cgdGhlIEtleS1OYW1lIGJlZm9yZSByZWNlaXZpbmcgaXQgZnJvbSB0aGUgQUFBCisJCQkJc2VydmVyLiAgQXMgYSByZXN1bHQsIGEgS2V5LU5hbWUgQVZQIHNlbnQgaW4gYSBEaWFtZXRlci1FQVAtUmVxdWVzdAorCQkJCU1VU1QgTk9UIGNvbnRhaW4gYW55IGRhdGEuICBBIGhvbWUgRGlhbWV0ZXIgc2VydmVyIHJlY2VpdmluZyBhCisJCQkJRGlhbWV0ZXItRUFQLVJlcXVlc3Qgd2l0aCBhIEtleS1OYW1lIEFWUCB3aXRoIG5vbi1lbXB0eSBkYXRhIE1VU1QKKwkJCQlzaWxlbnRseSBkaXNjYXJkIHRoZSBBVlAuICBJbiBhZGRpdGlvbiwgdGhlIGhvbWUgRGlhbWV0ZXIgc2VydmVyCisJCQkJU0hPVUxEIGluY2x1ZGUgdGhpcyBBVlAgaW4gRGlhbWV0ZXItRUFQLVJlc3BvbnNlIG9ubHkgaWYgYW4gZW1wdHkKKwkJCQlFQVAtS2V5LU5hbWUgQVZQIHdhcyBwcmVzZW50IGluIERpYW1ldGVyLUVBUC1SZXF1ZXN0LgorCQkJKi8KKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQkJCQkxMDIsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiRUFQLUtleS1OYW1lIiwgCQkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgTlVMTCk7CisJCX0KKwkJCisJCS8qIEFjY291bnRpbmctRUFQLUF1dGgtTWV0aG9kICovCisJCXsKKwkJCS8qCisJCQkJVGhlIEFjY291bnRpbmctRUFQLUF1dGgtTWV0aG9kIEFWUCAoQVZQIENvZGUgNDY1KSBpcyBvZiB0eXBlCisJCQkJVW5zaWduZWQ2NC4gIEluIGNhc2Ugb2YgZXhwYW5kZWQgdHlwZXMgW0VBUCwgU2VjdGlvbiA1LjddLCB0aGlzIEFWUAorCQkJCWNvbnRhaW5zIHRoZSB2YWx1ZSAoKFZlbmRvci1JZCAqIDJeMzIpICsgVmVuZG9yLVR5cGUpLgorCQkJKi8KKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQkJCQk0NjUsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiQWNjb3VudGluZy1FQVAtQXV0aC1NZXRob2QiLCAJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9VTlNJR05FRDY0IAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgTlVMTCk7CisJCX0KKwkJCisJfQorCisvKioqKioqKioqKioqKioqKioqKiovCQkKKy8qIENvbW1hbmRzIHNlY3Rpb24gKi8KKy8qKioqKioqKioqKioqKioqKioqKi8JCQorCXsKKwkJLyogVG8gYXZvaWQgZGVmaW5pbmcgZ2xvYmFsIHZhcmlhYmxlcyBmb3IgYWxsIHRoZSBBVlAgdGhhdCB3ZSB1c2UgaGVyZSwgd2UgZG8gc2VhcmNoIHRoZSBkaWN0aW9uYXJ5IGluIGVhY2ggc3ViLWJsb2NrLgorCQkgKiBUaGlzIGlzIGZhciBmcm9tIG9wdGltYWwsIGJ1dCB0aGUgY29kZSBpcyBjbGVhcmVyIGxpa2UgdGhpcywgYW5kIHRoZSB0aW1lIGl0IHJlcXVpcmVzIGF0IGV4ZWN1dGlvbiBpcyBub3Qgbm90aWNlYWJsZS4KKwkJICovCisJCS8qIERpYW1ldGVyLUVBUC1SZXF1ZXN0IChERVIpIENvbW1hbmQgKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgRGlhbWV0ZXItRUFQLVJlcXVlc3QgKERFUikgY29tbWFuZCwgaW5kaWNhdGVkIGJ5IHRoZSBDb21tYW5kLUNvZGUKKwkJCQlmaWVsZCBzZXQgdG8gMjY4IGFuZCB0aGUgJ1InIGJpdCBzZXQgaW4gdGhlIENvbW1hbmQgRmxhZ3MgZmllbGQsIGlzCisJCQkJc2VudCBieSBhIERpYW1ldGVyIGNsaWVudCB0byBhIERpYW1ldGVyIHNlcnZlciwgYW5kIGNvbnZleXMgYW4KKwkJCQlFQVAtUmVzcG9uc2UgZnJvbSB0aGUgRUFQIGNsaWVudC4gIFRoZSBEaWFtZXRlci1FQVAtUmVxdWVzdCBNVVNUCisJCQkJY29udGFpbiBvbmUgRUFQLVBheWxvYWQgQVZQIGNvbnRhaW5pbmcgdGhlIGFjdHVhbCBFQVAgcGF5bG9hZC4gIEFuCisJCQkJRUFQLVBheWxvYWQgQVZQIHdpdGggbm8gZGF0YSBNQVkgYmUgc2VudCB0byB0aGUgRGlhbWV0ZXIgc2VydmVyIHRvCisJCQkJaW5pdGlhdGUgYW4gRUFQIGF1dGhlbnRpY2F0aW9uIHNlc3Npb24uCisKKwkJCQlUaGUgREVSIG1lc3NhZ2UgTUFZIGJlIHRoZSByZXN1bHQgb2YgYSBtdWx0aS1yb3VuZCBhdXRoZW50aWNhdGlvbgorCQkJCWV4Y2hhbmdlIHRoYXQgb2NjdXJzIHdoZW4gdGhlIERFQSBpcyByZWNlaXZlZCB3aXRoIHRoZSBSZXN1bHQtQ29kZQorCQkJCUFWUCBzZXQgdG8gRElBTUVURVJfTVVMVElfUk9VTkRfQVVUSCBbQkFTRV0uICBBIHN1YnNlcXVlbnQgREVSCisJCQkJbWVzc2FnZSBNVVNUIGluY2x1ZGUgYW55IFN0YXRlIEFWUHMgW05BU1JFUV0gdGhhdCB3ZXJlIHByZXNlbnQgaW4gdGhlCisJCQkJREVBLiAgRm9yIHJlLWF1dGhlbnRpY2F0aW9uLCBpdCBpcyByZWNvbW1lbmRlZCB0aGF0IHRoZSBJZGVudGl0eQorCQkJCXJlcXVlc3QgYmUgc2tpcHBlZCBpbiBvcmRlciB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBhdXRoZW50aWNhdGlvbgorCQkJCXJvdW5kIHRyaXBzLiAgVGhpcyBpcyBvbmx5IHBvc3NpYmxlIHdoZW4gdGhlIHVzZXIncyBpZGVudGl0eSBpcworCQkJCWFscmVhZHkga25vd24gYnkgdGhlIGhvbWUgRGlhbWV0ZXIgc2VydmVyLgorCisJCQkJTWVzc2FnZSBmb3JtYXQKKworCQkJCTxEaWFtZXRlci1FQVAtUmVxdWVzdD4gOjo9IDwgRGlhbWV0ZXIgSGVhZGVyOiAyNjgsIFJFUSwgUFhZID4KKyAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkgPCBTZXNzaW9uLUlkID4KKyAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkgeyBBdXRoLUFwcGxpY2F0aW9uLUlkIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkgeyBPcmlnaW4tSG9zdCB9CisgICAgICAgICAgICAgICAgICAgICAgICAJCQkJIHsgT3JpZ2luLVJlYWxtIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkgeyBEZXN0aW5hdGlvbi1SZWFsbSB9CisgICAgICAgICAgICAgICAgICAgICAgICAJCQkJIHsgQXV0aC1SZXF1ZXN0LVR5cGUgfQorICAgICAgICAgICAgICAgICAgICAgICAgCQkJCSBbIERlc3RpbmF0aW9uLUhvc3QgXQorICAgICAgICAgICAgICAgICAgICAgICAgCQkJCSBbIE5BUy1JZGVudGlmaWVyIF0KKyAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkgWyBOQVMtSVAtQWRkcmVzcyBdCisgICAgICAgICAgICAgICAgICAgICAgICAJCQkJIFsgTkFTLUlQdjYtQWRkcmVzcyBdCisgICAgICAgICAgICAgICAgICAgICAgICAJCQkJIFsgTkFTLVBvcnQgXQorICAgICAgICAgICAgICAgICAgICAgICAgCQkJCSBbIE5BUy1Qb3J0LUlkIF0KKyAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkgWyBOQVMtUG9ydC1UeXBlIF0KKyAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkgWyBPcmlnaW4tU3RhdGUtSWQgXQorICAgICAgICAgICAgICAgICAgICAgICAgCQkJCSBbIFBvcnQtTGltaXQgXQorICAgICAgICAgICAgICAgICAgICAgICAgCQkJCSBbIFVzZXItTmFtZSBdCisgICAgICAgICAgICAgICAgICAgICAgICAJCQkJIHsgRUFQLVBheWxvYWQgfQorICAgICAgICAgICAgICAgICAgICAgICAgCQkJCSBbIEVBUC1LZXktTmFtZSBdCisgICAgICAgICAgICAgICAgICAgICAgICAJCQkJIFsgU2VydmljZS1UeXBlIF0KKyAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkgWyBTdGF0ZSBdCisgICAgICAgICAgICAgICAgICAgICAgICAJCQkJIFsgQXV0aG9yaXphdGlvbi1MaWZldGltZSBdCisgICAgICAgICAgICAgICAgICAgICAgICAJCQkJIFsgQXV0aC1HcmFjZS1QZXJpb2QgXQorICAgICAgICAgICAgICAgICAgICAgICAgCQkJCSBbIEF1dGgtU2Vzc2lvbi1TdGF0ZSBdCisgICAgICAgICAgICAgICAgICAgICAgICAJCQkJIFsgQ2FsbGJhY2stTnVtYmVyIF0KKyAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkgWyBDYWxsZWQtU3RhdGlvbi1JZCBdCisgICAgICAgICAgICAgICAgICAgICAgICAJCQkJIFsgQ2FsbGluZy1TdGF0aW9uLUlkIF0KKyAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkgWyBPcmlnaW5hdGluZy1MaW5lLUluZm8gXQorICAgICAgICAgICAgICAgICAgICAgICAgCQkJCSBbIENvbm5lY3QtSW5mbyBdCisgICAgICAgICAgICAgICAgCQkJCSAgICAgICAqIFsgRnJhbWVkLUNvbXByZXNzaW9uIF0KKyAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkgWyBGcmFtZWQtSW50ZXJmYWNlLUlkIF0KKyAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkgWyBGcmFtZWQtSVAtQWRkcmVzcyBdCisgICAgICAgICAgICAgICAgCQkJCSAgICAgICAqIFsgRnJhbWVkLUlQdjYtUHJlZml4IF0KKyAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkgWyBGcmFtZWQtSVAtTmV0bWFzayBdCisgICAgICAgICAgICAgICAgICAgICAgICAJCQkJIFsgRnJhbWVkLU1UVSBdCisgICAgICAgICAgICAgICAgICAgICAgICAJCQkJIFsgRnJhbWVkLVByb3RvY29sIF0KKyAgICAgICAgICAgICAgICAJCQkJICAgICAgICogWyBUdW5uZWxpbmcgXQorICAgICAgICAgICAgICAgIAkJCQkgICAgICAgKiBbIFByb3h5LUluZm8gXQorICAgICAgICAgICAgICAgIAkJCQkgICAgICAgKiBbIFJvdXRlLVJlY29yZCBdCisgICAgICAgICAgICAgICAgCQkJCSAgICAgICAqIFsgQVZQIF0KKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBjbWQ7CisJCQlzdHJ1Y3QgZGljdF9jbWRfZGF0YSBkYXRhID0geyAKKwkJCQkJMjY4LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJIkRpYW1ldGVyLUVBUC1SZXF1ZXN0IiwgCQkvKiBOYW1lICovCisJCQkJCUNNRF9GTEFHX1JFUVVFU1QgfCBDTURfRkxBR19QUk9YSUFCTEUgfCBDTURfRkxBR19FUlJPUiwgLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQ01EX0ZMQUdfUkVRVUVTVCB8IENNRF9GTEFHX1BST1hJQUJMRSAJCQkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQl9OworCQkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9IAorCQkJCQkJeyAJIHsgICJTZXNzaW9uLUlkIiwgCQkJUlVMRV9GSVhFRF9IRUFELCAtMSwgMSB9CisJCQkJCQkgCSx7ICAiQXV0aC1BcHBsaWNhdGlvbi1JZCIsIAkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCQkJCQkgCSx7ICAiT3JpZ2luLUhvc3QiLCAJCQlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIk9yaWdpbi1SZWFsbSIsCQkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJEZXN0aW5hdGlvbi1SZWFsbSIsCQlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJCQkJCSAJLHsgICJBdXRoLVJlcXVlc3QtVHlwZSIsIAkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJEZXN0aW5hdGlvbi1Ib3N0IiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIk5BUy1JZGVudGlmaWVyIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIk5BUy1JUC1BZGRyZXNzIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIk5BUy1JUHY2LUFkZHJlc3MiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiTkFTLVBvcnQiLAkJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIk5BUy1Qb3J0LUlkIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIk5BUy1Qb3J0LVR5cGUiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiT3JpZ2luLVN0YXRlLUlkIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIlBvcnQtTGltaXQiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiVXNlci1OYW1lIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkVBUC1QYXlsb2FkIiwJCQlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkVBUC1LZXktTmFtZSIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJTZXJ2aWNlLVR5cGUiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiU3RhdGUiLAkJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkF1dGhvcml6YXRpb24tTGlmZXRpbWUiLAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJBdXRoLUdyYWNlLVBlcmlvZCIsCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkF1dGgtU2Vzc2lvbi1TdGF0ZSIsCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkNhbGxiYWNrLU51bWJlciIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJDYWxsZWQtU3RhdGlvbi1JZCIsCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkNhbGxpbmctU3RhdGlvbi1JZCIsCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIk9yaWdpbmF0aW5nLUxpbmUtSW5mbyIsCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkNvbm5lY3QtSW5mbyIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJGcmFtZWQtQ29tcHJlc3Npb24iLAkJUlVMRV9PUFRJT05BTCwgICAtMSwtMSB9CisJCQkJCQkJLHsgICJGcmFtZWQtSW50ZXJmYWNlLUlkIiwJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiRnJhbWVkLUlQLUFkZHJlc3MiLAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJGcmFtZWQtSVB2Ni1QcmVmaXgiLAkJUlVMRV9PUFRJT05BTCwgICAtMSwtMSB9CisJCQkJCQkJLHsgICJGcmFtZWQtSVAtTmV0bWFzayIsCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkZyYW1lZC1NVFUiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiRnJhbWVkLVByb3RvY29sIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIlR1bm5lbGluZyIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwtMSB9CisJCQkJCQkJLHsgICJQcm94eS1JbmZvIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLC0xIH0KKwkJCQkJCQkseyAgIlJvdXRlLVJlY29yZCIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwtMSB9CisJCQkJCQl9OworCQkJCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9DT01NQU5ELCAmZGF0YSAsIGVhcCwgJmNtZCk7CisJCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBjbWQgKTsKKwkJfQorCQkKKwkJLyogRGlhbWV0ZXItRUFQLUFuc3dlciAoREVBKSBDb21tYW5kICovCisJCXsKKwkJCS8qCisJCQkJVGhlIERpYW1ldGVyLUVBUC1BbnN3ZXIgKERFQSkgbWVzc2FnZSwgaW5kaWNhdGVkIGJ5IHRoZSBDb21tYW5kLUNvZGUKKwkJCQlmaWVsZCBzZXQgdG8gMjY4IGFuZCB0aGUgJ1InIGJpdCBjbGVhcmVkIGluIHRoZSBDb21tYW5kIEZsYWdzIGZpZWxkLAorCQkJCWlzIHNlbnQgYnkgdGhlIERpYW1ldGVyIHNlcnZlciB0byB0aGUgY2xpZW50IGZvciBvbmUgb2YgdGhlIGZvbGxvd2luZworCQkJCXJlYXNvbnM6CisKKwkJCQkxLiAgVGhlIG1lc3NhZ2UgaXMgcGFydCBvZiBhIG11bHRpLXJvdW5kIGF1dGhlbnRpY2F0aW9uIGV4Y2hhbmdlLCBhbmQKKwkJCQl0aGUgc2VydmVyIGlzIGV4cGVjdGluZyBhIHN1YnNlcXVlbnQgRGlhbWV0ZXItRUFQLVJlcXVlc3QuICBUaGlzCisJCQkJaXMgaW5kaWNhdGVkIGJ5IHNldHRpbmcgdGhlIFJlc3VsdC1Db2RlIHRvCisJCQkJRElBTUVURVJfTVVMVElfUk9VTkRfQVVUSCwgYW5kIE1BWSBpbmNsdWRlIHplcm8gb3IgbW9yZSBTdGF0ZQorCQkJCUFWUHMuCisKKwkJCQkyLiAgVGhlIEVBUCBjbGllbnQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGF1dGhlbnRpY2F0ZWQgYW5kCisJCQkJYXV0aG9yaXplZCwgaW4gd2hpY2ggY2FzZSB0aGUgbWVzc2FnZSBNVVNUIGluY2x1ZGUgdGhlCisJCQkJUmVzdWx0LUNvZGUgQVZQIGluZGljYXRpbmcgc3VjY2VzcywgYW5kIFNIT1VMRCBpbmNsdWRlIGFuCisJCQkJRUFQLVBheWxvYWQgb2YgdHlwZSBFQVAtU3VjY2Vzcy4gIFRoaXMgZXZlbnQgTVVTVCBjYXVzZSB0aGUKKwkJCQlhY2Nlc3MgZGV2aWNlIHRvIHByb3ZpZGUgc2VydmljZSB0byB0aGUgRUFQIGNsaWVudC4KKworCQkJCTMuICBUaGUgRUFQIGNsaWVudCBoYXMgbm90IGJlZW4gc3VjY2Vzc2Z1bGx5IGF1dGhlbnRpY2F0ZWQgYW5kL29yCisJCQkJYXV0aG9yaXplZCwgYW5kIHRoZSBSZXN1bHQtQ29kZSBBVlAgaXMgc2V0IHRvIGluZGljYXRlIGZhaWx1cmUuCisJCQkJVGhpcyBtZXNzYWdlIFNIT1VMRCBpbmNsdWRlIGFuIEVBUC1QYXlsb2FkLCBidXQgdGhpcyBBVlAgaXMgbm90CisJCQkJdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciBzZXJ2aWNlIGlzIHRvIGJlIHByb3ZpZGVkLgorCisJCQkJSWYgdGhlIG1lc3NhZ2UgZnJvbSB0aGUgRGlhbWV0ZXIgY2xpZW50IGluY2x1ZGVkIGEgcmVxdWVzdCBmb3IKKwkJCQlhdXRob3JpemF0aW9uLCBhIHN1Y2Nlc3NmdWwgcmVzcG9uc2UgTVVTVCBpbmNsdWRlIHRoZSBhdXRob3JpemF0aW9uCisJCQkJQVZQcyB0aGF0IGFyZSByZWxldmFudCB0byB0aGUgc2VydmljZSBiZWluZyBwcm92aWRlZC4KKworCQkJCU1lc3NhZ2UgZm9ybWF0CisKKwkJCQk8RGlhbWV0ZXItRUFQLUFuc3dlcj4gOjo9IDwgRGlhbWV0ZXIgSGVhZGVyOiAyNjgsIFBYWSA+CisgICAgICAgICAgICAgICAgICAgICAgICAJCQkJPCBTZXNzaW9uLUlkID4KKyAgICAgICAgICAgICAgICAgICAgICAgIAkJCQl7IEF1dGgtQXBwbGljYXRpb24tSWQgfQorICAgICAgICAgICAgICAgICAgICAgICAgCQkJCXsgQXV0aC1SZXF1ZXN0LVR5cGUgfQorICAgICAgICAgICAgICAgICAgICAgICAgCQkJCXsgUmVzdWx0LUNvZGUgfQorICAgICAgICAgICAgICAgICAgICAgICAgCQkJCXsgT3JpZ2luLUhvc3QgfQorICAgICAgICAgICAgICAgICAgICAgICAgCQkJCXsgT3JpZ2luLVJlYWxtIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIAkJCQlbIFVzZXItTmFtZSBdCisgICAgICAgICAgICAgICAgICAgICAgICAJCQkJWyBFQVAtUGF5bG9hZCBdCisgICAgICAgICAgICAgICAgICAgICAgICAJCQkJWyBFQVAtUmVpc3N1ZWQtUGF5bG9hZCBdCisgICAgICAgICAgICAgICAgICAgICAgICAJCQkJWyBFQVAtTWFzdGVyLVNlc3Npb24tS2V5IF0KKyAgICAgICAgICAgICAgICAgICAgICAgIAkJCQlbIEVBUC1LZXktTmFtZSBdCisgICAgICAgICAgICAgICAgICAgICAgICAJCQkJWyBNdWx0aS1Sb3VuZC1UaW1lLU91dCBdCisgICAgICAgICAgICAgICAgICAgICAgICAJCQkJWyBBY2NvdW50aW5nLUVBUC1BdXRoLU1ldGhvZCBdCisgICAgICAgICAgICAgICAgICAgICAgICAJCQkJWyBTZXJ2aWNlLVR5cGUgXQorICAgICAgICAgICAgICAgIAkJCQkgICAgICAqIFsgQ2xhc3MgXQorICAgICAgICAgICAgICAgIAkJCQkgICAgICAqIFsgQ29uZmlndXJhdGlvbi1Ub2tlbiBdCisgICAgICAgICAgICAgICAgICAgICAgICAJCQkJWyBBY2N0LUludGVyaW0tSW50ZXJ2YWwgXQorICAgICAgICAgICAgICAgICAgICAgICAgCQkJCVsgRXJyb3ItTWVzc2FnZSBdCisgICAgICAgICAgICAgICAgICAgICAgICAJCQkJWyBFcnJvci1SZXBvcnRpbmctSG9zdCBdCisgICAgICAgICAgICAgICAgCQkJCSAgICAgICogWyBGYWlsZWQtQVZQIF0KKyAgICAgICAgICAgICAgICAgICAgICAgIAkJCQlbIElkbGUtVGltZW91dCBdCisgICAgICAgICAgICAgICAgICAgICAgICAJCQkJWyBBdXRob3JpemF0aW9uLUxpZmV0aW1lIF0KKyAgICAgICAgICAgICAgICAgICAgICAgIAkJCQlbIEF1dGgtR3JhY2UtUGVyaW9kIF0KKyAgICAgICAgICAgICAgICAgICAgICAgIAkJCQlbIEF1dGgtU2Vzc2lvbi1TdGF0ZSBdCisgICAgICAgICAgICAgICAgICAgICAgICAJCQkJWyBSZS1BdXRoLVJlcXVlc3QtVHlwZSBdCisgICAgICAgICAgICAgICAgICAgICAgICAJCQkJWyBTZXNzaW9uLVRpbWVvdXQgXQorICAgICAgICAgICAgICAgICAgICAgICAgCQkJCVsgU3RhdGUgXQorICAgICAgICAgICAgICAgIAkJCQkgICAgICAqIFsgUmVwbHktTWVzc2FnZSBdCisgICAgICAgICAgICAgICAgICAgICAgICAJCQkJWyBPcmlnaW4tU3RhdGUtSWQgXQorICAgICAgICAgICAgICAgIAkJCQkgICAgICAqIFsgRmlsdGVyLUlkIF0KKyAgICAgICAgICAgICAgICAgICAgICAgIAkJCQlbIFBvcnQtTGltaXQgXQorICAgICAgICAgICAgICAgICAgICAgICAgCQkJCVsgQ2FsbGJhY2stSWQgXQorICAgICAgICAgICAgICAgICAgICAgICAgCQkJCVsgQ2FsbGJhY2stTnVtYmVyIF0KKyAgICAgICAgICAgICAgICAgICAgICAgIAkJCQlbIEZyYW1lZC1BcHBsZXRhbGstTGluayBdCisgICAgICAgICAgICAgICAgCQkJCSAgICAgICogWyBGcmFtZWQtQXBwbGV0YWxrLU5ldHdvcmsgXQorICAgICAgICAgICAgICAgICAgICAgICAgCQkJCVsgRnJhbWVkLUFwcGxldGFsay1ab25lIF0KKyAgICAgICAgICAgICAgICAJCQkJICAgICAgKiBbIEZyYW1lZC1Db21wcmVzc2lvbiBdCisgICAgICAgICAgICAgICAgICAgICAgICAJCQkJWyBGcmFtZWQtSW50ZXJmYWNlLUlkIF0KKyAgICAgICAgICAgICAgICAgICAgICAgIAkJCQlbIEZyYW1lZC1JUC1BZGRyZXNzIF0KKyAgICAgICAgICAgICAgICAJCQkJICAgICAgKiBbIEZyYW1lZC1JUHY2LVByZWZpeCBdCisgICAgICAgICAgICAgICAgICAgICAgICAJCQkJWyBGcmFtZWQtSVB2Ni1Qb29sIF0KKyAgICAgICAgICAgICAgICAJCQkJICAgICAgKiBbIEZyYW1lZC1JUHY2LVJvdXRlIF0KKyAgICAgICAgICAgICAgICAgICAgICAgIAkJCQlbIEZyYW1lZC1JUC1OZXRtYXNrIF0KKyAgICAgICAgICAgICAgICAJCQkJICAgICAgKiBbIEZyYW1lZC1Sb3V0ZSBdCisgICAgICAgICAgICAgICAgICAgICAgICAJCQkJWyBGcmFtZWQtUG9vbCBdCisgICAgICAgICAgICAgICAgICAgICAgICAJCQkJWyBGcmFtZWQtSVBYLU5ldHdvcmsgXQorICAgICAgICAgICAgICAgICAgICAgICAgCQkJCVsgRnJhbWVkLU1UVSBdCisgICAgICAgICAgICAgICAgICAgICAgICAJCQkJWyBGcmFtZWQtUHJvdG9jb2wgXQorICAgICAgICAgICAgICAgICAgICAgICAgCQkJCVsgRnJhbWVkLVJvdXRpbmcgXQorICAgICAgICAgICAgICAgIAkJCQkgICAgICAqIFsgTkFTLUZpbHRlci1SdWxlIF0KKyAgICAgICAgICAgICAgICAJCQkJICAgICAgKiBbIFFvUy1GaWx0ZXItUnVsZSBdCisgICAgICAgICAgICAgICAgCQkJCSAgICAgICogWyBUdW5uZWxpbmcgXQorICAgICAgICAgICAgICAgIAkJCQkgICAgICAqIFsgUmVkaXJlY3QtSG9zdCBdCisgICAgICAgICAgICAgICAgICAgICAgICAJCQkJWyBSZWRpcmVjdC1Ib3N0LVVzYWdlIF0KKyAgICAgICAgICAgICAgICAgICAgICAgIAkJCQlbIFJlZGlyZWN0LU1heC1DYWNoZS1UaW1lIF0KKyAgICAgICAgICAgICAgICAJCQkJICAgICAgKiBbIFByb3h5LUluZm8gXQorICAgICAgICAgICAgICAgIAkJCQkgICAgICAqIFsgQVZQIF0KKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBjbWQ7CisJCQlzdHJ1Y3QgZGljdF9jbWRfZGF0YSBkYXRhID0geyAKKwkJCQkJMjY4LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJIkRpYW1ldGVyLUVBUC1BbnN3ZXIiLCAJCQkvKiBOYW1lICovCisJCQkJCUNNRF9GTEFHX1JFUVVFU1QgfCBDTURfRkxBR19QUk9YSUFCTEUsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCQkJICAgQ01EX0ZMQUdfUFJPWElBQkxFCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCX07CisJCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0gCisJCQkJCQl7IAkgeyAgIlNlc3Npb24tSWQiLCAJCQlSVUxFX0ZJWEVEX0hFQUQsIC0xLCAxIH0KKwkJCQkJCSAJLHsgICJBdXRoLUFwcGxpY2F0aW9uLUlkIiwgCQlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJCQkJCSAJLHsgICJBdXRoLVJlcXVlc3QtVHlwZSIsIAkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCQkJCQkgCSx7ICAiUmVzdWx0LUNvZGUiLCAJCQlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJCQkJCSAJLHsgICJPcmlnaW4tSG9zdCIsIAkJCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiT3JpZ2luLVJlYWxtIiwJCQlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIlVzZXItTmFtZSIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJFQVAtUGF5bG9hZCIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJFQVAtUmVpc3N1ZWQtUGF5bG9hZCIsCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkVBUC1NYXN0ZXItU2Vzc2lvbi1LZXkiLAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJFQVAtS2V5LU5hbWUiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiTXVsdGktUm91bmQtVGltZS1PdXQiLAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJBY2NvdW50aW5nLUVBUC1BdXRoLU1ldGhvZCIsCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiU2VydmljZS1UeXBlIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkNsYXNzIiwJCQkJUlVMRV9PUFRJT05BTCwgICAtMSwtMSB9CisJCQkJCQkJLHsgICJDb25maWd1cmF0aW9uLVRva2VuIiwJCVJVTEVfT1BUSU9OQUwsICAgLTEsLTEgfQorCQkJCQkJCSx7ICAiQWNjdC1JbnRlcmltLUludGVydmFsIiwJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiRXJyb3ItTWVzc2FnZSIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJFcnJvci1SZXBvcnRpbmctSG9zdCIsCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkZhaWxlZC1BVlAiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsLTEgfQorCQkJCQkJCSx7ICAiSWRsZS1UaW1lb3V0IiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkF1dGhvcml6YXRpb24tTGlmZXRpbWUiLAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJBdXRoLUdyYWNlLVBlcmlvZCIsCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkF1dGgtU2Vzc2lvbi1TdGF0ZSIsCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIlJlLUF1dGgtUmVxdWVzdC1UeXBlIiwJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiU2Vzc2lvbi1UaW1lb3V0IiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIlN0YXRlIiwJCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJSZXBseS1NZXNzYWdlIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLC0xIH0KKwkJCQkJCQkseyAgIk9yaWdpbi1TdGF0ZS1JZCIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJGaWx0ZXItSWQiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsLTEgfQorCQkJCQkJCSx7ICAiUG9ydC1MaW1pdCIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJDYWxsYmFjay1JZCIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJDYWxsYmFjay1OdW1iZXIiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiRnJhbWVkLUFwcGxlVGFsay1MaW5rIiwJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiRnJhbWVkLUFwcGxlVGFsay1OZXR3b3JrIiwJCVJVTEVfT1BUSU9OQUwsICAgLTEsLTEgfQorCQkJCQkJCSx7ICAiRnJhbWVkLUFwcGxlVGFsay1ab25lIiwJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiRnJhbWVkLUNvbXByZXNzaW9uIiwJCVJVTEVfT1BUSU9OQUwsICAgLTEsLTEgfQorCQkJCQkJCSx7ICAiRnJhbWVkLUludGVyZmFjZS1JZCIsCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkZyYW1lZC1JUC1BZGRyZXNzIiwJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiRnJhbWVkLUlQdjYtUHJlZml4IiwJCVJVTEVfT1BUSU9OQUwsICAgLTEsLTEgfQorCQkJCQkJCSx7ICAiRnJhbWVkLUlQdjYtUG9vbCIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJGcmFtZWQtSVB2Ni1Sb3V0ZSIsCQlSVUxFX09QVElPTkFMLCAgIC0xLC0xIH0KKwkJCQkJCQkseyAgIkZyYW1lZC1JUC1OZXRtYXNrIiwJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiRnJhbWVkLVJvdXRlIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLC0xIH0KKwkJCQkJCQkseyAgIkZyYW1lZC1Qb29sIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkZyYW1lZC1JUFgtTmV0d29yayIsCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkZyYW1lZC1NVFUiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiRnJhbWVkLVByb3RvY29sIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkZyYW1lZC1Sb3V0aW5nIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIk5BUy1GaWx0ZXItUnVsZSIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwtMSB9CisJCQkJCQkJLHsgICJRb1MtRmlsdGVyLVJ1bGUiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsLTEgfQorCQkJCQkJCSx7ICAiVHVubmVsaW5nIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLC0xIH0KKwkJCQkJCQkseyAgIlJlZGlyZWN0LUhvc3QiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsLTEgfQorCQkJCQkJCSx7ICAiUmVkaXJlY3QtSG9zdC1Vc2FnZSIsCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIlJlZGlyZWN0LU1heC1DYWNoZS1UaW1lIiwJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiUHJveHktSW5mbyIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwtMSB9CisJCQkJCQl9OworCQkJCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9DT01NQU5ELCAmZGF0YSAsIGVhcCwgJmNtZCk7CisJCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBjbWQgKTsKKwkJfQorCQkKKwkJLyogQWNjb3VudGluZy1SZXF1ZXN0ICovCisJCXsKKwkJCS8qCisJCQkJQWRkIGFkZGl0aW9uYWwgcnVsZXMgb2YgdGhlIEFCTkYgKGNvbXBhcmVkIHRvIEJhc2UgZGVmaW5pdGlvbik6CisKKwkJCQlBdHRyaWJ1dGUgTmFtZSAgICAgICAgICAgICAgICAgICAgICAgICB8IEFDUiB8IEFDQSB8CisJCQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tKy0tLS0tKworCQkJCUFjY291bnRpbmctRUFQLUF1dGgtTWV0aG9kICAgICAgICAgICAgIHwgIDArIHwgIDAgIHwKKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBjbWQ7CisJCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0gCisJCQkJCQl7IAkgeyAgIkFjY291bnRpbmctRUFQLUF1dGgtTWV0aG9kIiwJUlVMRV9PUFRJT05BTCwgICAtMSwtMSB9CisJCQkJCQl9OworCQkJCisJCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIkFjY291bnRpbmctUmVxdWVzdCIsICZjbWQpOworCQkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgY21kICk7CisJCX0KKwkJCisJfQorCQorCUxPR19EKCAiRXh0ZW5zaW9uICdEaWN0aW9uYXJ5IGRlZmluaXRpb25zIGZvciBFQVAnIGluaXRpYWxpemVkIik7CisJcmV0dXJuIDA7Cit9CisKK0VYVEVOU0lPTl9FTlRSWSgiZGljdF9lYXAiLCBkZWFwX2VudHJ5LCAiZGljdF9uYXNyZXEiKTsKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF9ldHNpMjgzMDM0X2F2cHMvQ01ha2VMaXN0cy50eHQgYi9leHRlbnNpb25zL2RpY3RfZXRzaTI4MzAzNF9hdnBzL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNGFhMjUKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfZXRzaTI4MzAzNF9hdnBzL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTYgQEAKKyMgVGhlIGRpY3RfZXRzaTI4MzAzNF9hdnBzIGV4dGVuc2lvbgorUFJPSkVDVCgiZGljdF9ldHNpMjgzMDM0X2F2cHMgbGlicmFyeSBnZW5lcmF0ZWQgYnkgRmRHZW4gIiBDKQorCisjIENvbXBpbGUgYXMgYSBtb2R1bGUKK0ZEX0FERF9FWFRFTlNJT04oZGljdF9ldHNpMjgzMDM0X2F2cHMgZGljdF9ldHNpMjgzMDM0X2F2cHMuYykKKworCisjIyMjCisjIyBJTlNUQUxMIHNlY3Rpb24gIyMKKworSU5TVEFMTChUQVJHRVRTIGRpY3RfZXRzaTI4MzAzNF9hdnBzCisJTElCUkFSWSBERVNUSU5BVElPTiAke0lOU1RBTExfRVhURU5TSU9OU19TVUZGSVh9CitDT01QT05FTlQgZnJlZURpYW1ldGVyLWRpY3Rpb25hcnktRVRTSTI4MzAzNF9BVlBTKQorCisKKwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X2V0c2kyODMwMzRfYXZwcy9kaWN0X2V0c2kyODMwMzRfYXZwcy5jIGIvZXh0ZW5zaW9ucy9kaWN0X2V0c2kyODMwMzRfYXZwcy9kaWN0X2V0c2kyODMwMzRfYXZwcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZDEyMjEKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfZXRzaTI4MzAzNF9hdnBzL2RpY3RfZXRzaTI4MzAzNF9hdnBzLmMKQEAgLTAsMCArMSwyNTAgQEAKKy8qCisqIENvcHlyaWdodCAoYykgMjAxNyBTcHJpbnQKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLyoqKioqKioqKioqKioqKioKKyBHZW5lcmF0ZWQgQnk6IGZkdG9vbCBlbmhhbmNlbWVudHMgdG8gZGlhZnV6emVyCisgTGljZW5zZTogc2FtZSBhcyBmcmVlRGlhbWV0ZXIKKyoqKioqKioqKioqKioqKiovCisKKworLyogCisgKiBEaWN0aW9uYXJ5IGRlZmluaXRpb25zIG9mIG9iamVjdHMgc3BlY2lmaWVkIGluIGV0c2kyODMwMzRfYXZwcy4KKyAqLworI2luY2x1ZGUgPGZyZWVEaWFtZXRlci9leHRlbnNpb24uaD4KKworI2RlZmluZSBQUk9UT19WRVIgInVuc3BlY2lmaWVkIgorI2RlZmluZSBHRU5fREFURSAgMTUwNjY5NzE4NC45MQorCitjb25zdCBjaGFyICpldHNpMjgzMDM0X2F2cHNfcHJvdG9fdmVyID0gUFJPVE9fVkVSOworY29uc3QgZG91YmxlIGV0c2kyODMwMzRfYXZwc19nZW5fZGF0ZSA9IEdFTl9EQVRFOworCisvKiBUaGUgY29udGVudCBvZiB0aGlzIGZpbGUgZm9sbG93cyB0aGUgc2FtZSBzdHJ1Y3R1cmUgYXMgZGljdF9iYXNlX3Byb3RvLmMgKi8KKworI2RlZmluZSBDSEVDS19kaWN0X25ldyggX3R5cGUsIF9kYXRhLCBfcGFyZW50LCBfcmVmICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBfcmV0ID0gZmRfZGljdF9uZXcoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgKF90eXBlKSwgKF9kYXRhKSwgKF9wYXJlbnQpLCAoX3JlZikgKTsgXAorICAgIGlmICggX3JldCAhPSAwICYmIF9yZXQgIT0gRUVYSVNUICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHJldHVybiBfcmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIENIRUNLX2RpY3Rfc2VhcmNoKCBfdHlwZSwgX2NyaXRlcmlhLCBfd2hhdCwgX3Jlc3VsdCApCQlcCisgICAgQ0hFQ0tfRkNUKCAgZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgKF90eXBlKSwgKF9jcml0ZXJpYSksIChfd2hhdCksIChfcmVzdWx0KSwgRU5PRU5UKSApOworCitzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiB7CisgICAgc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWU7CisgICAgZW51bSBydWxlX3Bvc2l0aW9uCXBvc2l0aW9uOworICAgIGludCAJCQltaW47CisgICAgaW50CQkJbWF4OworfTsKKworI2RlZmluZSBSVUxFX09SREVSKCBfcG9zaXRpb24gKSAoKCgoX3Bvc2l0aW9uKSA9PSBSVUxFX0ZJWEVEX0hFQUQpIHx8ICgoX3Bvc2l0aW9uKSA9PSBSVUxFX0ZJWEVEX1RBSUwpKSA/IDEgOiAwICkKKworLyogQXR0ZW50aW9uISBUaGlzIHZlcnNpb24gb2YgdGhlIG1hY3JvIHVzZXMgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgaW4gY29udHJhc3QgdG8gbW9zdCBvdGhlciBjb3BpZXMhICovCisjZGVmaW5lIFBBUlNFX2xvY19ydWxlcyggX3J1bGVhcnJheSwgX3BhcmVudCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IF9fYXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKF9fYXI9MDsgX19hciA8IHNpemVvZihfcnVsZWFycmF5KSAvIHNpemVvZigoX3J1bGVhcnJheSlbMF0pOyBfX2FyKyspIHsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgc3RydWN0IGRpY3RfcnVsZV9kYXRhIF9fZGF0YSA9IHsgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5wb3NpdGlvbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ubWluLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5tYXh9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIF9fZGF0YS5ydWxlX29yZGVyID0gUlVMRV9PUkRFUihfX2RhdGEucnVsZV9wb3NpdGlvbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgQ0hFQ0tfRkNUKCAgZmRfZGljdF9zZWFyY2goICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgRElDVF9BVlAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICYoX3J1bGVhcnJheSlbX19hcl0uYXZwX3ZlbmRvcl9wbHVzX25hbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgJl9fZGF0YS5ydWxlX2F2cCwgMCApICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYgKCAhX19kYXRhLnJ1bGVfYXZwICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFX0RFQlVHKElORk8sICJBVlAgTm90IGZvdW5kOiAnJXMnIiwgKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLmF2cF9uYW1lKTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVOT0VOVDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBfcmV0ID0gZmRfZGljdF9uZXcoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9SVUxFLCAmKF9fZGF0YSksIChfcGFyZW50KSwgTlVMTCApOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBfcmV0ICE9IDAgJiYgX3JldCAhPSBFRVhJU1QgKSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfREVCVUcoSU5GTywgIkVycm9yIG9uIHJ1bGUgd2l0aCBBVlAgJyVzJyIsICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0uYXZwX3ZlbmRvcl9wbHVzX25hbWUuYXZwX25hbWUpOyAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFSU5WQUw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBDSEVDS192ZW5kb3JfbmV3KCBfZGF0YSApIHsgXAorICAgICAgICBzdHJ1Y3QgZGljdF9vYmplY3QgKiB2ZW5kb3JfZm91bmQ7IFwKKyAgICAgICAgaWYgKGZkX2RpY3Rfc2VhcmNoKGZkX2dfY29uZmlnLT5jbmZfZGljdCxESUNUX1ZFTkRPUixWRU5ET1JfQllfSUQsJl9kYXRhLnZlbmRvcl9pZCwmdmVuZG9yX2ZvdW5kLEVOT0VOVCkgPT0gRU5PRU5UKSB7IFwKKyAgICAgICAgICAgICAgICBDSEVDS19GQ1QoZmRfZGljdF9uZXcoZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1ZFTkRPUiwgJl9kYXRhLCBOVUxMLCBOVUxMKSk7IFwKKyAgICAgICAgfSBcCit9CisKKyNkZWZpbmUgZW51bXZhbF9kZWZfdTMyKCBfdmFsXywgX3N0cl8gKQkJXAorICAgIHsgX3N0cl8sIAkJeyAudTMyID0gX3ZhbF8gfX0KKworI2RlZmluZSBlbnVtdmFsX2RlZl9vcyggX2xlbl8sIF92YWxfLCBfc3RyXyApCQkJCVwKKyAgICB7IF9zdHJfLCAJCXsgLm9zID0geyAuZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopX3ZhbF8sIC5sZW4gPSBfbGVuXyB9fX0KKworCitzdGF0aWMgaW50IGRpY3RfZXRzaTI4MzAzNF9hdnBzX2xvYWRfZGVmcyhjaGFyICogY29uZmZpbGUpCit7CisgICBUUkFDRV9FTlRSWSgiJXAiLCBjb25mZmlsZSk7CisJLyogQXBwbGljYXRpb24gU2VjdGlvbiAqLworCXsKKwkJLyogQ3JlYXRlIHRoZSB2ZW5kb3JzICovCQl7CisJCQlzdHJ1Y3QgZGljdF92ZW5kb3JfZGF0YSB2ZW5kb3JfZGF0YSA9IHsgMTMwMTksICJFVFNJIiB9OworCQkJQ0hFQ0tfZGljdF9uZXcoRElDVF9WRU5ET1IsICZ2ZW5kb3JfZGF0YSwgTlVMTCwgTlVMTCkKKwkJfQorCX0KKworCisgICAvKiBBVlAgc2VjdGlvbiAqLworICAgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBBZGRyZXNzX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIFVURjhTdHJpbmdfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogRGlhbWV0ZXJJZGVudGl0eV90eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBEaWFtZXRlclVSSV90eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBUaW1lX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIElQRmlsdGVyUnVsZV90eXBlOworCisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkFkZHJlc3MiLCAmQWRkcmVzc190eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiVVRGOFN0cmluZyIsICZVVEY4U3RyaW5nX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJEaWFtZXRlcklkZW50aXR5IiwgJkRpYW1ldGVySWRlbnRpdHlfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkRpYW1ldGVyVVJJIiwgJkRpYW1ldGVyVVJJX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJUaW1lIiwgJlRpbWVfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIklQRmlsdGVyUnVsZSIsICZJUEZpbHRlclJ1bGVfdHlwZSk7CisJCS8qIEFkZHJlc3MtUmVhbG0gKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzMDEsCS8qIENvZGUgKi8KKwkJCQkxMzAxOSwJLyogVmVuZG9yICovCisJCQkJIkFkZHJlc3MtUmVhbG0iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBMb2dpY2FsLUFjY2Vzcy1JZCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTMwMiwJLyogQ29kZSAqLworCQkJCTEzMDE5LAkvKiBWZW5kb3IgKi8KKwkJCQkiTG9naWNhbC1BY2Nlc3MtSWQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBQaHlzaWNhbC1BY2Nlc3MtSWQgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzMDMsCS8qIENvZGUgKi8KKwkJCQkxMzAxOSwJLyogVmVuZG9yICovCisJCQkJIlBoeXNpY2FsLUFjY2Vzcy1JZCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogTGluZS1JZGVudGlmaWVyICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNTAwLAkvKiBDb2RlICovCisJCQkJMTMwMTksCS8qIFZlbmRvciAqLworCQkJCSJMaW5lLUlkZW50aWZpZXIiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFJlc2VydmF0aW9uLVByaW9yaXR5ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNDU4LAkvKiBDb2RlICovCisJCQkJMTMwMTksCS8qIFZlbmRvciAqLworCQkJCSJSZXNlcnZhdGlvbi1Qcmlvcml0eSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICJFVFNJL0VudW1lcmF0ZWQoUmVzZXJ2YXRpb24tUHJpb3JpdHkpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJQUklPUklUWV9PTkUiLCB7IC5pMzI9MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiUFJJT1JJVFlfVFdPIiwgeyAuaTMyPTIgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMyA9IHsgIlBSSU9SSVRZX1RIUkVFIiwgeyAuaTMyPTMgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNCA9IHsgIlBSSU9SSVRZX0ZPVVIiLCB7IC5pMzI9NCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF81ID0geyAiUFJJT1JJVFlfRklWRSIsIHsgLmkzMj01IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzYgPSB7ICJQUklPUklUWV9TSVgiLCB7IC5pMzI9NiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF83ID0geyAiUFJJT1JJVFlfU0VWRU4iLCB7IC5pMzI9NyB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzQsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF82LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzcsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisKKwkKKyAgIH0KKworICAgLyogQ29tbWFuZHMgc2VjdGlvbiAqLworICAgeworCisgICB9CisKKyAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRpY3RfZXRzaTI4MzAzNF9hdnBzX2xvYWRfcnVsZXMoY2hhciAqIGNvbmZmaWxlKQoreworICAgLyogR3JvdXBlZCBBVlAgc2VjdGlvbiAqLworICAgeworCisgICB9CQorCisgICAvKiBDb21tYW5kcyBzZWN0aW9uICovCisgICB7CisKKyAgIH0KKworICAgTE9HX0QoICJFeHRlbnNpb24gJ0RpY3Rpb25hcnkgZGVmaW5pdGlvbnMgZm9yIGV0c2kyODMwMzRfYXZwcyAoTm9uZSknIGluaXRpYWxpemVkIik7CisgICByZXR1cm4gMDsKK30KKworaW50IGRpY3RfZW50cnkoY2hhciAqIGNvbmZmaWxlKQoreworCWRpY3RfZXRzaTI4MzAzNF9hdnBzX2xvYWRfZGVmcyhjb25mZmlsZSk7CisJcmV0dXJuIGRpY3RfZXRzaTI4MzAzNF9hdnBzX2xvYWRfcnVsZXMoY29uZmZpbGUpOworfQorCitjb25zdCBjaGFyKiBkaWN0X2V0c2kyODMwMzRfYXZwc19wcm90b192ZXIoY2hhciAqIGNvbmZmaWxlKSB7CisJcmV0dXJuIGV0c2kyODMwMzRfYXZwc19wcm90b192ZXI7Cit9CisKK2NvbnN0IGRvdWJsZSBkaWN0X2V0c2kyODMwMzRfYXZwc19nZW5fdHMoY2hhciAqIGNvbmZmaWxlKSB7CisJcmV0dXJuIGV0c2kyODMwMzRfYXZwc19nZW5fZGF0ZTsKK30KKworRVhURU5TSU9OX0VOVFJZMigiZGljdF9ldHNpMjgzMDM0X2F2cHMiLCBkaWN0X2V0c2kyODMwMzRfYXZwc19sb2FkX2RlZnMsIGRpY3RfZXRzaTI4MzAzNF9hdnBzX2xvYWRfcnVsZXMpOworCisKKwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X2V0c2kyODMwMzRfYXZwcy9ldHNpMjgzMDM0X2F2cHMuZGlkIGIvZXh0ZW5zaW9ucy9kaWN0X2V0c2kyODMwMzRfYXZwcy9ldHNpMjgzMDM0X2F2cHMuZGlkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyZTJjMWYKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfZXRzaTI4MzAzNF9hdnBzL2V0c2kyODMwMzRfYXZwcy5kaWQKQEAgLTAsMCArMSBAQAorZGljdF9ldHNpMjgzMDM0X2F2cHMKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF9sZWdhY3lfeG1sL0NNYWtlTGlzdHMudHh0IGIvZXh0ZW5zaW9ucy9kaWN0X2xlZ2FjeV94bWwvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYxZmJjNQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF9sZWdhY3lfeG1sL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMzUgQEAKKyMgVGhlIGRpY3RfbGVnYWN5X3htbCBleHRlbnNpb24KK1BST0pFQ1QoIkxlZ2FjeSBYTUwgZGljdGlvbmFyeSBmaWxlcyBzdXBwb3J0IiBDKQorCisjIFBhcnNlciBmaWxlcworQklTT05fRklMRShkaWN0X2x4bWwueSkKK0ZMRVhfRklMRShkaWN0X2x4bWwubCkKK1NFVF9TT1VSQ0VfRklMRVNfUFJPUEVSVElFUyhsZXguZGljdF9seG1sLmMgZGljdF9seG1sLnRhYi5jIFBST1BFUlRJRVMgQ09NUElMRV9GTEFHUyAiLUkgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9IikKKworIyBXZSB1c2UgTGliWG1sMiAoZnJvbSBHTk9NRSkgdG8gcGFyc2UgWE1MIGZpbGVzCitGSU5EX1BBQ0tBR0UoTGliWG1sMiBSRVFVSVJFRCkKKworIyBMaXN0IG9mIHNvdXJjZSBmaWxlcworU0VUKCBESUNUX0xYTUxfU1JDCisJZGljdF9seG1sLmMKKwlkaWN0X2x4bWxfeG1sLmMKKwlkaWN0X2x4bWwuaAorCWxleC5kaWN0X2x4bWwuYworCWRpY3RfbHhtbC50YWIuYworCWRpY3RfbHhtbC50YWIuaAorKQorSU5DTFVERV9ESVJFQ1RPUklFUygke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0pCitJTkNMVURFX0RJUkVDVE9SSUVTKCR7TElCWE1MMl9JTkNMVURFX0RJUn0pCisKKyMgQ29tcGlsZSB0aGVzZSBmaWxlcyBhcyBhIGZyZWVEaWFtZXRlciBleHRlbnNpb24KK0ZEX0FERF9FWFRFTlNJT04oZGljdF9sZWdhY3lfeG1sICR7RElDVF9MWE1MX1NSQ30pCisKK1RBUkdFVF9MSU5LX0xJQlJBUklFUyhkaWN0X2xlZ2FjeV94bWwgJHtMSUJYTUwyX0xJQlJBUklFU30gKQorCisKKyMjIyMKKyMjIElOU1RBTEwgc2VjdGlvbiAjIworCitJTlNUQUxMKFRBUkdFVFMgZGljdF9sZWdhY3lfeG1sCisJTElCUkFSWSBERVNUSU5BVElPTiAke0lOU1RBTExfRVhURU5TSU9OU19TVUZGSVh9CisJQ09NUE9ORU5UIGZyZWVEaWFtZXRlci1kaWN0aW9uYXJ5LWxlZ2FjeSkKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF9sZWdhY3lfeG1sL2RpY3RfbHhtbC5jIGIvZXh0ZW5zaW9ucy9kaWN0X2xlZ2FjeV94bWwvZGljdF9seG1sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRiOGQ4ZgotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF9sZWdhY3lfeG1sL2RpY3RfbHhtbC5jCkBAIC0wLDAgKzEsNTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDExLCBXSURFIFByb2plY3QgYW5kIE5JQ1QJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFdJREUgUHJvamVjdCBvciBOSUNUIG5vciB0aGUgCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgV0lERSBQcm9qZWN0IGFuZCAJCQkJCQkgKgorKiAgIE5JQ1QuCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogCisgKiBMZWdhY3kgWE1MIGRpY3Rpb25hcnkgZmlsZXMgc3VwcG9ydCBmb3IgZnJlZURpYW1ldGVyLgorICovCisKKyNpbmNsdWRlICJkaWN0X2x4bWwuaCIKKworLyogZW50cnkgcG9pbnQgKi8KK3N0YXRpYyBpbnQgZGljdF9seG1sX2VudHJ5KGNoYXIgKiBjb25mZmlsZSkKK3sKKwlUUkFDRV9FTlRSWSgiJXAiLCBjb25mZmlsZSk7CisJCisJLyogUGFyc2UgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSAtLSBldmVyeXRoaW5nIGhhcHBlbnMgdGhlcmUgKi8KKwlDSEVDS19GQ1QoIGRpY3RfbHhtbF9oYW5kbGUoY29uZmZpbGUpICk7CisJCisJLyogV2UncmUgZG9uZSAqLworCXJldHVybiAwOworfQorCitFWFRFTlNJT05fRU5UUlkoImRpY3RfbGVnYWN5X3htbCIsIGRpY3RfbHhtbF9lbnRyeSk7CmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfbGVnYWN5X3htbC9kaWN0X2x4bWwuaCBiL2V4dGVuc2lvbnMvZGljdF9sZWdhY3lfeG1sL2RpY3RfbHhtbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NjJkNjIKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfbGVnYWN5X3htbC9kaWN0X2x4bWwuaApAQCAtMCwwICsxLDQ4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxMSwgV0lERSBQcm9qZWN0IGFuZCBOSUNUCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBXSURFIFByb2plY3Qgb3IgTklDVCBub3IgdGhlIAkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFdJREUgUHJvamVjdCBhbmQgCQkJCQkJICoKKyogICBOSUNULgkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEhlYWRlciBmaWxlIGZvciB0aGUgZGljdF9sZWdhY3lfeG1sIGV4dGVuc2lvbi4gCisgKgorICogIFNlZSB0aGUgZGljdF9sZWdhY3lfeG1sLmNvbmYuc2FtcGxlIGZpbGUgZm9yIHRoZSBmb3JtYXQgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4KKyAqLworIAorLyogRnJlZURpYW1ldGVyJ3MgY29tbW9uIGluY2x1ZGUgZmlsZSAqLworI2luY2x1ZGUgPGZyZWVEaWFtZXRlci9leHRlbnNpb24uaD4KKworLyogUGFyc2UgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSAqLworaW50IGRpY3RfbHhtbF9oYW5kbGUoY2hhciAqIGNvbmZmaWxlKTsKKworLyogUGFyc2UgYW4gWE1MIGZpbGUgYW5kIHJldHVybiB0aGUgbnVtYmVyIG9mIGRpY3Rpb25hcnkgb2JqZWN0cyBvciAtMSBvbiBlcnJvciAqLworaW50IGRpY3RfbHhtbF9wYXJzZShjaGFyICogeG1sZmlsZW5hbWUpOwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X2xlZ2FjeV94bWwvZGljdF9seG1sLmwgYi9leHRlbnNpb25zL2RpY3RfbGVnYWN5X3htbC9kaWN0X2x4bWwubApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzYxMmJiCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kaWN0X2xlZ2FjeV94bWwvZGljdF9seG1sLmwKQEAgLTAsMCArMSw5OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTMsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUb2tlbml6ZXIKKyAqCisgKi8KKworJXsKKyNpbmNsdWRlICJkaWN0X2x4bWwuaCIKKy8qIEluY2x1ZGUgeWFjYyB0b2tlbnMgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlICJkaWN0X2x4bWwudGFiLmgiCisKKy8qIFVwZGF0ZSB0aGUgY29sdW1uIGluZm9ybWF0aW9uICovCisjZGVmaW5lIFlZX1VTRVJfQUNUSU9OIHsgCQkJCQkJXAorCXl5bGxvYy0+Zmlyc3RfY29sdW1uID0geXlsbG9jLT5sYXN0X2NvbHVtbiArIDE7IAkJXAorCXl5bGxvYy0+bGFzdF9jb2x1bW4gPSB5eWxsb2MtPmZpcnN0X2NvbHVtbiArIHl5bGVuZyAtIDE7CVwKK30KKworLyogQXZvaWQgd2FybmluZyB3aXRoIG5ld2VyIGZsZXggKi8KKyNkZWZpbmUgWVlfTk9fSU5QVVQKKworJX0KKworcXN0cmluZwkJXCJbXlwiXG5dKlwiCisKKworJW9wdGlvbiBiaXNvbi1icmlkZ2UgYmlzb24tbG9jYXRpb25zCislb3B0aW9uIG5veXl3cmFwCislb3B0aW9uIG5vdW5wdXQKKworJSUKKworCS8qIFVwZGF0ZSB0aGUgbGluZSBjb3VudCAqLworXG4JCQl7CisJCQkJeXlsbG9jLT5maXJzdF9saW5lKys7IAorCQkJCXl5bGxvYy0+bGFzdF9saW5lKys7IAorCQkJCXl5bGxvYy0+bGFzdF9jb2x1bW49MDsgCisJCQl9CisJIAorCS8qIEVhdCBhbGwgc3BhY2VzIGJ1dCBub3QgbmV3IGxpbmVzICovCisoW1s6c3BhY2U6XV17LX1bXG5dKSsJOworCS8qIEVhdCBhbGwgY29tbWVudHMgKi8KKyMuKiQJCQk7CisKKwkvKiBSZWNvZ25pemUgcXVvdGVkIHN0cmluZ3MgKi8KK3txc3RyaW5nfQkJeworCQkJCS8qIE1hdGNoIGEgcXVvdGVkIHN0cmluZy4gKi8KKwkJCQlDSEVDS19NQUxMT0NfRE8oIHl5bHZhbC0+c3RyaW5nID0gc3RyZHVwKHl5dGV4dCsxKSwgCisJCQkJeworCQkJCQlUUkFDRV9ERUJVRyhJTkZPLCAiVW5hYmxlIHRvIGNvcHkgdGhlIHN0cmluZyAnJXMnOiAlcyIsIHl5dGV4dCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCQkJcmV0dXJuIExFWF9FUlJPUjsgLyogdHJpZyBhbiBlcnJvciBpbiB5YWNjIHBhcnNlciAqLworCQkJCX0gKTsKKwkJCQl5eWx2YWwtPnN0cmluZ1tzdHJsZW4oeXl0ZXh0KSAtIDJdID0gJ1wwJzsKKwkJCQlyZXR1cm4gUVNUUklORzsKKwkJCX0KKwkKKwkvKiBWYWxpZCBzaW5nbGUgY2hhcmFjdGVycyBmb3IgeXlwYXJzZSAqLworWztdCQkJeyByZXR1cm4geXl0ZXh0WzBdOyB9CisKKwkvKiBVbnJlY29nbml6ZWQgc2VxdWVuY2UsIGlmIGl0IGRpZCBub3QgbWF0Y2ggYW55IHByZXZpb3VzIHBhdHRlcm4gKi8KK1teWzpzcGFjZTpdXCI7XG5dKwl7IAorCQkJCWZkX2xvZ19kZWJ1ZygiVW5yZWNvZ25pemVkIHRleHQgb24gbGluZSAlZCBjb2wgJWQ6ICclcycuIiwgeXlsbG9jLT5maXJzdF9saW5lLCB5eWxsb2MtPmZpcnN0X2NvbHVtbiwgeXl0ZXh0KTsKKwkJCSAJcmV0dXJuIExFWF9FUlJPUjsgCisJCQl9CisKKyUlCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfbGVnYWN5X3htbC9kaWN0X2x4bWwueSBiL2V4dGVuc2lvbnMvZGljdF9sZWdhY3lfeG1sL2RpY3RfbHhtbC55Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjYWZiNGYKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfbGVnYWN5X3htbC9kaWN0X2x4bWwueQpAQCAtMCwwICsxLDE0MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTMsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBZYWNjIGV4dGVuc2lvbidzIGNvbmZpZ3VyYXRpb24gcGFyc2VyLgorICogU2VlIGRvYy9kaWN0X2xlZ2FjeV94bWwuY29uZi5zYW1wbGUgZm9yIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3JtYXQKKyAqLworCisvKiBGb3IgZGV2ZWxvcG1lbnQgb25seSA6ICovCislZGVidWcgCislZXJyb3ItdmVyYm9zZQorCisvKiBUaGUgcGFyc2VyIHJlY2VpdmVzIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgZmlsZW5hbWUgYXMgcGFyYW1ldGVyICovCislcGFyc2UtcGFyYW0ge2NoYXIgKiBjb25mZmlsZX0KKworLyogS2VlcCB0cmFjayBvZiBsb2NhdGlvbiAqLworJWxvY2F0aW9ucyAKKyVwdXJlLXBhcnNlcgorCisleworI2luY2x1ZGUgImRpY3RfbHhtbC5oIgorI2luY2x1ZGUgImRpY3RfbHhtbC50YWIuaCIJLyogYmlzb24gaXMgbm90IHNtYXJ0IGVub3VnaCB0byBkZWZpbmUgdGhlIFlZTFRZUEUgYmVmb3JlIGluY2x1ZGluZyB0aGlzIGNvZGUsIHNvLi4uICovCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb24gKi8KK2ludCB5eXBhcnNlKGNoYXIgKiBjb25mZmlsZSk7CisKK3N0YXRpYyBpbnQgbmJfZmlsZXMgPSAwOworc3RhdGljIGludCBuYl9kaWN0ID0gMDsKKworLyogUGFyc2UgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSAqLworaW50IGRpY3RfbHhtbF9oYW5kbGUoY2hhciAqIGNvbmZmaWxlKQoreworCWV4dGVybiBGSUxFICogZGljdF9seG1saW47CisJaW50IHJldDsKKwkKKwlUUkFDRV9FTlRSWSgiJXAiLCBjb25mZmlsZSk7CisJCisJVFJBQ0VfREVCVUcgKEZVTEwsICJQYXJzaW5nIGNvbmZpZ3VyYXRpb24gZmlsZTogJXMuLi4iLCBjb25mZmlsZSk7CisJCisJZGljdF9seG1saW4gPSBmb3Blbihjb25mZmlsZSwgInIiKTsKKwlpZiAoZGljdF9seG1saW4gPT0gTlVMTCkgeworCQlyZXQgPSBlcnJubzsKKwkJZmRfbG9nX2RlYnVnKCJVbmFibGUgdG8gb3BlbiBleHRlbnNpb24gY29uZmlndXJhdGlvbiBmaWxlICVzIGZvciByZWFkaW5nOiAlcyIsIGNvbmZmaWxlLCBzdHJlcnJvcihyZXQpKTsKKwkJVFJBQ0VfREVCVUcgKElORk8sICJFcnJvciBvY2N1cnJlZCwgbWVzc2FnZSBsb2dnZWQgLS0gY29uZmlndXJhdGlvbiBmaWxlLiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHl5cGFyc2UoY29uZmZpbGUpOworCisJZmNsb3NlKGRpY3RfbHhtbGluKTsKKworCWlmIChyZXQgIT0gMCkgeworCQlUUkFDRV9ERUJVRyAoSU5GTywgIlVuYWJsZSB0byBwYXJzZSB0aGUgY29uZmlndXJhdGlvbiBmaWxlLiIpOworCQlyZXR1cm4gRUlOVkFMOworCX0gZWxzZSB7CisJCVRSQUNFX0RFQlVHKEZVTEwsICIlZCBYTUwgZGljdGlvbmFyeSBmaWxlcyBwYXJzZWQgc3VjY2Vzc2Z1bGx5LCAlZCBkaWN0aW9uYXJ5IG9iamVjdHMgYWRkZWQuIiwgbmJfZmlsZXMsIG5iX2RpY3QpOworCX0KKwkKKwlyZXR1cm4gMDsKK30KKworLyogVGhlIExleCBwYXJzZXIgcHJvdG90eXBlICovCitpbnQgZGljdF9seG1sbGV4KFlZU1RZUEUgKmx2YWxwLCBZWUxUWVBFICpsbG9jcCk7CisKKy8qIEZ1bmN0aW9uIHRvIHJlcG9ydCB0aGUgZXJyb3JzICovCit2b2lkIHl5ZXJyb3IgKFlZTFRZUEUgKnBsb2MsIGNoYXIgKiBjb25mZmlsZSwgY2hhciBjb25zdCAqcykKK3sKKwlUUkFDRV9ERUJVRyhJTkZPLCAiRXJyb3IgaW4gY29uZmlndXJhdGlvbiBwYXJzaW5nIik7CisJCisJaWYgKHBsb2MtPmZpcnN0X2xpbmUgIT0gcGxvYy0+bGFzdF9saW5lKQorCQlmZF9sb2dfZGVidWcoIiVzOiVkLiVkLSVkLiVkIDogJXMiLCBjb25mZmlsZSwgcGxvYy0+Zmlyc3RfbGluZSwgcGxvYy0+Zmlyc3RfY29sdW1uLCBwbG9jLT5sYXN0X2xpbmUsIHBsb2MtPmxhc3RfY29sdW1uLCBzKTsKKwllbHNlIGlmIChwbG9jLT5maXJzdF9jb2x1bW4gIT0gcGxvYy0+bGFzdF9jb2x1bW4pCisJCWZkX2xvZ19kZWJ1ZygiJXM6JWQuJWQtJWQgOiAlcyIsIGNvbmZmaWxlLCBwbG9jLT5maXJzdF9saW5lLCBwbG9jLT5maXJzdF9jb2x1bW4sIHBsb2MtPmxhc3RfY29sdW1uLCBzKTsKKwllbHNlCisJCWZkX2xvZ19kZWJ1ZygiJXM6JWQuJWQgOiAlcyIsIGNvbmZmaWxlLCBwbG9jLT5maXJzdF9saW5lLCBwbG9jLT5maXJzdF9jb2x1bW4sIHMpOworfQorCislfQorCisvKiBWYWx1ZXMgcmV0dXJuZWQgYnkgbGV4IGZvciB0b2tlbiAqLworJXVuaW9uIHsKKwljaGFyIAkJKnN0cmluZzsJLyogVGhlIHN0cmluZyBpcyBhbGxvY2F0ZWQgYnkgc3RyZHVwIGluIGxleC4qLworfQorCisvKiBJbiBjYXNlIG9mIGVycm9yIGluIHRoZSBsZXhpY2FsIGFuYWx5c2lzICovCisldG9rZW4gCQlMRVhfRVJST1IKKworLyogQSAoZGUpcXVvdGVkIHN0cmluZyAobWFsbG9jJ2QgaW4gbGV4IHBhcnNlcjsgaXQgbXVzdCBiZSBmcmVlZCBhZnRlciB1c2UpICovCisldG9rZW4gPHN0cmluZz4JUVNUUklORworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworJSUKKworCS8qIFRoZSBncmFtbWFyIGRlZmluaXRpb24gKi8KK2NvbmZmaWxlOgkJLyogZW1wdHkgZ3JhbW1hciBpcyBPSyAqLworCQkJfCBjb25mZmlsZSB4bWxmaWxlCisJCQk7CisJCQkKKwkvKiBhIFJVTEUgZW50cnkgKi8KK3htbGZpbGU6CQlRU1RSSU5HICc7JworCQkJeworCQkJCWludCByZXQgPSBkaWN0X2x4bWxfcGFyc2UoJDEpOworCQkJCWlmIChyZXQgPCAwKSB7CisJCQkJCXl5ZXJyb3IgKCZ5eWxsb2MsIGNvbmZmaWxlLCAiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcGFyc2luZyBhIGZpbGUsIGFib3J0aW5nLi4uIik7CisJCQkJCVlZRVJST1I7CisJCQkJfQorCQkJCW5iX2ZpbGVzKys7CisJCQkJbmJfZGljdCArPSByZXQ7CisJCQl9CisJCQk7CmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfbGVnYWN5X3htbC9kaWN0X2x4bWxfeG1sLmMgYi9leHRlbnNpb25zL2RpY3RfbGVnYWN5X3htbC9kaWN0X2x4bWxfeG1sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ4YzQzZgotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF9sZWdhY3lfeG1sL2RpY3RfbHhtbF94bWwuYwpAQCAtMCwwICsxLDE4MTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDEzLCBXSURFIFByb2plY3QgYW5kIE5JQ1QJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFdJREUgUHJvamVjdCBvciBOSUNUIG5vciB0aGUgCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgV0lERSBQcm9qZWN0IGFuZCAJCQkJCQkgKgorKiAgIE5JQ1QuCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImRpY3RfbHhtbC5oIgorCisvKgorVGhlIGludGVybmFsIGZyZWVEaWFtZXRlciBkaWN0aW9uYXJ5IGhhcyBzdHJvbmcgZGVwZW5kZW5jeSByZWxhdGlvbnMgYmV0d2VlbgordGhlIGRpZmZlcmVudCBvYmplY3RzLCBhcyBmb2xsb3c6CisKKyAgICAgICAgICAgdmVuZG9yCisgICAgICAgICAgIC8gICAgXAorICAgYXBwbGljYXRpb24gICBcCisgICAgIC8gICAgXCAgICAgIHwKKyBjb21tYW5kICAgXCAgICAgfAorICB8ICAgICAgIHR5cGUgICB8CisgIHwgICAgICAgLyAgIFwgIHwKKyAgIFwgIGVudW12YWwgIFwgfCAKKyAgICBcICAgICAgICAgIGF2cAorICAgICBcICAgIF9fX19fLyAgICAKKyAgICAgIFwgIC8KKyAgICAgIHJ1bGUKKworSXQgbWVhbnMgYW4gQVZQIGNhbm5vdCBiZSBkZWZpbmVkIHVubGVzcyB0aGUgcGFyZW50IFRZUEUgaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkLCAKK2luIHR1cm4gZGVwZW5kaW5nIG9uIHBhcmVudCBBUFBMSUNBVElPTiwgZXRjLiAodG9wLXRvLWJvdHRvbSBkZXBlbmRlbmNpZXMgb24gdGhlIGdyYXBoKQorCitPbiB0aGUgb3RoZXIgaGFuZCwgdGhlIGhpZXJhcmNoeSBvZiB0aGUgWE1MIGZvcm1hdCBkZXNjcmliZWQgaW4gZHJhZnQtZnJhc2NvbmUteG1sLWRpY3Rpb25hcnktMDAgCitkb2VzIG5vdCBlbmZvcmNlIG1vc3Qgb2YgdGhlc2UgZGVwZW5kZW5jaWVzLCB0aGUgc3RydWN0dXJlIGlzIGFzIGZvbGxvd3M6CisKKyB2ZW5kb3IgICAgIGFwcGxpY2F0aW9uCisJICAgLyAgICAgfCAgICAgXAorICAgICAgY29tbWFuZCAgICB8ICAgICBhdnAgCisJIC8gICAgICB0eXBlICAgICBcCisgICAgICAgcnVsZQkgICAgICAgIGVudW12YWwKKworKGluIGFkZGl0aW9uIGlmIERURCB2YWxpZGF0aW9uIHdhcyBwZXJmb3JtZWQsIGNvbW1hbmQgYW5kIGF2cCByZWZlciB0byB2ZW5kb3IsIGF2cCByZWZlcnMgdG8gdHlwZSwgCitidXQgd2UgZG8gbm90IGRvIGl0IGZvciBsYXJnZXIgY29tcGF0aWJpbGl0eSAtLSB3ZSBqdXN0IHJlcG9ydCB3aGVuIGVycm9ycyBhcmUgZm91bmQpCisKK0FzIGEgY29uc2VxdWVuY2Ugb2YgdGhpcyBkaWZmZXJlbmNlLCBpdCBpcyBpbXBvc3NpYmxlIHRvIHBhcnNlIHRoZSBYTUwgdHJlZSBhbmQgY3JlYXRlIHRoZSBkaWN0aW9uYXJ5IG9iamVjdHMgaW4gZnJlZURpYW1ldGVyCitpbiBvbmx5IDEgcGFzcy4gVG8gYXZvaWQgcGFyc2luZyB0aGUgdHJlZSBzZXZlcmFsIHRpbWVzLCB3ZSB1c2UgYSB0ZW1wb3Jhcnkgc3RydWN0dXJlIGluIG1lbW9yeSB0byBjb250YWluIGFsbCB0aGUgZGF0YQorZnJvbSB0aGUgWE1MIGZpbGUsIGFuZCB3aGVuIHRoZSBwYXJzaW5nIGlzIGNvbXBsZXRlIHdlIHN0b3JlIGFsbCB0aGUgb2JqZWN0cyBpbiB0aGUgZGljdGlvbmFyeS4gCisqLworCisvKiBXZSB1c2UgdGhlIFNBWCBpbnRlcmZhY2Ugb2YgbGlieG1sMiAoZnJvbSBHTk9NRSkgdG8gcGFyc2UgdGhlIFhNTCBmaWxlLiAqLyAKKyNpbmNsdWRlIDxsaWJ4bWwvcGFyc2VyLmg+CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIC8qIEhlbHBlciBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgeG1sdG9pbnQoeG1sQ2hhciAqIHhtbGludGVnZXIsIHVpbnQzMl90ICogY29udikgeworCVRSQUNFX0VOVFJZKCIlcCAlcCIsIHhtbGludGVnZXIsIGNvbnYpOworCQorCS8qIEF0dGVtcHQgYXQgY29udmVydGluZyB0aGUgc3RyaW5nIHRvIGFuIGludGVnZXIgKi8KKwlpZiAoc3NjYW5mKChjaGFyICopeG1saW50ZWdlciwgIiV1IiwgY29udikgIT0gMSkgeworCQlUUkFDRV9ERUJVRyhJTkZPLCAiVW5hYmxlIHRvIGNvbnZlcnQgJyVzJyB0byBpbnRlZ2VyLiIsIChjaGFyICopeG1saW50ZWdlcikKKwkJcmV0dXJuIEVJTlZBTDsKKwl9CisJCisJcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBUaGUgdGVtcG9yYXJ5IHN0cnVjdHVyZSB0aGF0IGlzIGJlaW5nIGJ1aWx0IHdoZW4gdGhlIFhNTCBmaWxlIGlzIHBhcnNlZCAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBWRU5ET1IgKi8KK3N0cnVjdCB0X3ZlbmQgeworCXN0cnVjdCBmZF9saXN0IAljaGFpbjsgLyogbGluayBpbiB0aGUgdF9kaWN0aW9uYXJ5LT52ZW5kb3JzICovCisJdWludDMyX3QJaWQ7CisJdWludDhfdCAqCW5hbWU7Cit9OworCitzdGF0aWMgaW50IG5ld192ZW5kb3Ioc3RydWN0IGZkX2xpc3QgKiBwYXJlbnQsIHhtbENoYXIgKiB4bWxpZCwgeG1sQ2hhciAqIHhtbG5hbWUpIHsKKwlzdHJ1Y3QgdF92ZW5kICogbmV3OworCXVpbnQzMl90IGlkID0gMDsKKwkKKwlUUkFDRV9FTlRSWSgiJXAgJXAgJXAiLCBwYXJlbnQsIHhtbGlkLCB4bWxuYW1lKTsKKwlDSEVDS19QQVJBTVMoIHBhcmVudCAmJiB4bWxpZCAmJiB4bWxuYW1lICk7CisJCisJQ0hFQ0tfRkNUKCB4bWx0b2ludCh4bWxpZCwgJmlkKSApOworCQorCUNIRUNLX01BTExPQyggbmV3ID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgdF92ZW5kKSkgKTsKKwltZW1zZXQobmV3LCAwLCBzaXplb2Yoc3RydWN0IHRfdmVuZCkpOworCWZkX2xpc3RfaW5pdCgmbmV3LT5jaGFpbiwgTlVMTCk7CisJbmV3LT5pZCA9IGlkOworCUNIRUNLX01BTExPQyggbmV3LT5uYW1lID0gKHVpbnQ4X3QgKilzdHJkdXAoKGNoYXIgKil4bWxuYW1lKSApOworCQorCWZkX2xpc3RfaW5zZXJ0X2JlZm9yZShwYXJlbnQsICZuZXctPmNoYWluKTsKKwkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZHVtcF92ZW5kb3Ioc3RydWN0IHRfdmVuZCAqIHYpIHsKKwlmZF9sb2dfZGVidWcoIiBWZW5kb3IgJWQ6JyVzJyIsIHYtPmlkLCAoY2hhciAqKXYtPm5hbWUpOworfQorCitzdGF0aWMgdm9pZCBkZWxfdmVuZG9yX2NvbnRlbnRzKHN0cnVjdCB0X3ZlbmQgKiB2KSB7CisJVFJBQ0VfRU5UUlkoIiVwIiwgdik7CisJZnJlZSh2LT5uYW1lKTsKK30KKworCisvKiBSVUxFICovCitzdHJ1Y3QgdF9ydWxlIHsKKwlzdHJ1Y3QgZmRfbGlzdCAgY2hhaW47CS8qIGxpbmsgaW4gZWl0aGVyIHRfY21kIG9yIHRfYXZwICovCisJdWludDhfdCAqCWF2cG5hbWU7CisJaW50CQltYXg7CisJaW50CQltaW47Cit9OworCitzdGF0aWMgaW50IG5ld19ydWxlKHN0cnVjdCBmZF9saXN0ICogcGFyZW50LCB4bWxDaGFyICogeG1sbmFtZSwgLyogcG9zaXRpb24gaXMgbmV2ZXIgdXNlZCAqLyB4bWxDaGFyICogeG1sbWF4aW11bSwgeG1sQ2hhciAqIHhtbG1pbmltdW0pIHsKKwlzdHJ1Y3QgdF9ydWxlICogbmV3OworCXVpbnQzMl90IG1pbiwgbWF4OworCQorCVRSQUNFX0VOVFJZKCIlcCAlcCAlcCAlcCIsIHBhcmVudCwgeG1sbmFtZSwgeG1sbWF4aW11bSwgeG1sbWluaW11bSk7CisJQ0hFQ0tfUEFSQU1TKCBwYXJlbnQgJiYgeG1sbmFtZSApOworCQorCUNIRUNLX01BTExPQyggbmV3ID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgdF9ydWxlKSkgKTsKKwltZW1zZXQobmV3LCAwLCBzaXplb2Yoc3RydWN0IHRfcnVsZSkpOworCWZkX2xpc3RfaW5pdCgmbmV3LT5jaGFpbiwgTlVMTCk7CisJaWYgKHhtbG1pbmltdW0pIHsKKwkJQ0hFQ0tfRkNUKCB4bWx0b2ludCh4bWxtaW5pbXVtLCAmbWluKSApOworCQluZXctPm1pbiA9IChpbnQpIG1pbjsKKwl9IGVsc2UgeworCQluZXctPm1pbiA9IC0xOworCX0KKwlpZiAoeG1sbWF4aW11bSkgeworCQlDSEVDS19GQ1QoIHhtbHRvaW50KHhtbG1heGltdW0sICZtYXgpICk7CisJCW5ldy0+bWF4ID0gKGludCkgbWF4OworCX0gZWxzZSB7CisJCW5ldy0+bWF4ID0gLTE7CisJfQorCUNIRUNLX01BTExPQyggbmV3LT5hdnBuYW1lID0gKHVpbnQ4X3QgKilzdHJkdXAoKGNoYXIgKil4bWxuYW1lKSApOworCQorCWZkX2xpc3RfaW5zZXJ0X2JlZm9yZShwYXJlbnQsICZuZXctPmNoYWluKTsKKwkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZHVtcF9ydWxlKHN0cnVjdCB0X3J1bGUgKiByLCBjaGFyICogcHJlZml4KSB7CisJZmRfbG9nX2RlYnVnKCIlcyAiLCBwcmVmaXgpOworCWlmIChyLT5taW4gIT0gLTEpCisJCWZkX2xvZ19kZWJ1ZygibTolZCAiLCByLT5taW4pOworCWlmIChyLT5tYXggIT0gLTEpCisJCWZkX2xvZ19kZWJ1ZygiTTolZCAiLCByLT5tYXgpOworCWZkX2xvZ19kZWJ1ZygiJXMiLCAoY2hhciAqKXItPmF2cG5hbWUpOworfQorCitzdGF0aWMgdm9pZCBkZWxfcnVsZV9jb250ZW50cyhzdHJ1Y3QgdF9ydWxlICogcikgeworCVRSQUNFX0VOVFJZKCIlcCIscik7CisJZnJlZShyLT5hdnBuYW1lKTsKK30KKworCisvKiBDT01NQU5EICovCitzdHJ1Y3QgdF9jbWQgeworCXN0cnVjdCBmZF9saXN0ICBjaGFpbjsgICAgLyogbGluayBpbiB0X2FwcGwtPmNvbW1hbmRzICovCisJdWludDMyX3QJY29kZTsKKwl1aW50OF90ICoJbmFtZTsKKwl1aW50OF90CQlmbGFnczsKKwl1aW50OF90CQlmbWFzazsKKwlzdHJ1Y3QgZmRfbGlzdCAgcmVxcnVsZXNfZml4ZWQ7ICAgICAvKiBsaXN0IG9mIHRfcnVsZSAqLworCXN0cnVjdCBmZF9saXN0ICByZXFydWxlc19yZXF1aXJlZDsgIC8qIGxpc3Qgb2YgdF9ydWxlICovCisJc3RydWN0IGZkX2xpc3QgIHJlcXJ1bGVzX29wdGlvbmFsOyAgLyogbGlzdCBvZiB0X3J1bGUgKi8KKwlzdHJ1Y3QgZmRfbGlzdCAgYW5zcnVsZXNfZml4ZWQ7ICAgICAvKiBsaXN0IG9mIHRfcnVsZSAqLworCXN0cnVjdCBmZF9saXN0ICBhbnNydWxlc19yZXF1aXJlZDsgIC8qIGxpc3Qgb2YgdF9ydWxlICovCisJc3RydWN0IGZkX2xpc3QgIGFuc3J1bGVzX29wdGlvbmFsOyAgLyogbGlzdCBvZiB0X3J1bGUgKi8KK307CisKK3N0YXRpYyBpbnQgbmV3X2NtZChzdHJ1Y3QgZmRfbGlzdCAqIHBhcmVudCwgeG1sQ2hhciAqIHhtbGNvZGUsIHhtbENoYXIgKiB4bWxuYW1lIC8qLCBpZ25vcmUgdGhlIHZlbmRvciBpZCBiZWNhdXNlIHdlIGRvbid0IHVzZSBpdCAqLywgeG1sQ2hhciAqIHhtbHBiaXQsIHN0cnVjdCB0X2NtZCAqKnJldCkgeworCXN0cnVjdCB0X2NtZCAqIG5ldzsKKwl1aW50MzJfdCBjb2RlOworCXVpbnQzMl90IGZsYWcgPSAwOworCXVpbnQzMl90IGZtYXNrID0gMDsKKwkKKwlUUkFDRV9FTlRSWSgiJXAgJXAgJXAgJXAiLCBwYXJlbnQsIHhtbGNvZGUsIHhtbG5hbWUsIHhtbHBiaXQpOworCUNIRUNLX1BBUkFNUyggcGFyZW50ICYmIHhtbGNvZGUgJiYgeG1sbmFtZSApOworCQorCUNIRUNLX0ZDVCggeG1sdG9pbnQoeG1sY29kZSwgJmNvZGUpICk7CisJCisJaWYgKHhtbHBiaXQpIHsKKwkJdWludDMyX3QgdmFsOworCQlDSEVDS19GQ1QoIHhtbHRvaW50KHhtbHBiaXQsICZ2YWwpICk7CisJCWZtYXNrIHw9IENNRF9GTEFHX1BST1hJQUJMRTsKKwkJaWYgKHZhbCkKKwkJCWZsYWcgfD0gQ01EX0ZMQUdfUFJPWElBQkxFOworCX0KKwkKKwlDSEVDS19NQUxMT0MoIG5ldyA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHRfY21kKSkgKTsKKwltZW1zZXQobmV3LCAwLCBzaXplb2Yoc3RydWN0IHRfY21kKSk7CisJZmRfbGlzdF9pbml0KCZuZXctPmNoYWluLCBOVUxMKTsKKwluZXctPmNvZGUgPSBjb2RlOworCUNIRUNLX01BTExPQyggbmV3LT5uYW1lID0gKHVpbnQ4X3QgKilzdHJkdXAoKGNoYXIgKil4bWxuYW1lKSApOworCW5ldy0+ZmxhZ3MgPSBmbGFnOworCW5ldy0+Zm1hc2sgPSBmbWFzazsKKwlmZF9saXN0X2luaXQoJm5ldy0+cmVxcnVsZXNfZml4ZWQsIE5VTEwpOworCWZkX2xpc3RfaW5pdCgmbmV3LT5yZXFydWxlc19yZXF1aXJlZCwgTlVMTCk7CisJZmRfbGlzdF9pbml0KCZuZXctPnJlcXJ1bGVzX29wdGlvbmFsLCBOVUxMKTsKKwlmZF9saXN0X2luaXQoJm5ldy0+YW5zcnVsZXNfZml4ZWQsIE5VTEwpOworCWZkX2xpc3RfaW5pdCgmbmV3LT5hbnNydWxlc19yZXF1aXJlZCwgTlVMTCk7CisJZmRfbGlzdF9pbml0KCZuZXctPmFuc3J1bGVzX29wdGlvbmFsLCBOVUxMKTsKKwkKKwlmZF9saXN0X2luc2VydF9iZWZvcmUocGFyZW50LCAmbmV3LT5jaGFpbik7CisJCisJKnJldCA9IG5ldzsKKwkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZHVtcF9jbWQoc3RydWN0IHRfY21kICogYykgeworCXN0cnVjdCBmZF9saXN0ICogbGk7CisJZmRfbG9nX2RlYnVnKCIgIENvbW1hbmQgJWQgJXM6ICVzIiwgYy0+Y29kZSwgCisJCWMtPmZtYXNrID8gKCBjLT5mbGFncyA/ICJbUD0xXSIgOiAiW1A9MF0iKSA6ICIiLCBjLT5uYW1lKTsKKwlmb3IgKGxpID0gYy0+cmVxcnVsZXNfZml4ZWQubmV4dDsgbGkgIT0gJmMtPnJlcXJ1bGVzX2ZpeGVkOyBsaSA9IGxpLT5uZXh0KQorCQlkdW1wX3J1bGUoKHN0cnVjdCB0X3J1bGUgKilsaSwgIiAgICBSZXF1ZXN0IGZpeGVkICAgIEFWUDoiKTsKKwlmb3IgKGxpID0gYy0+cmVxcnVsZXNfcmVxdWlyZWQubmV4dDsgbGkgIT0gJmMtPnJlcXJ1bGVzX3JlcXVpcmVkOyBsaSA9IGxpLT5uZXh0KQorCQlkdW1wX3J1bGUoKHN0cnVjdCB0X3J1bGUgKilsaSwgIiAgICBSZXF1ZXN0IHJlcXVpcmVkIEFWUDoiKTsKKwlmb3IgKGxpID0gYy0+cmVxcnVsZXNfb3B0aW9uYWwubmV4dDsgbGkgIT0gJmMtPnJlcXJ1bGVzX29wdGlvbmFsOyBsaSA9IGxpLT5uZXh0KQorCQlkdW1wX3J1bGUoKHN0cnVjdCB0X3J1bGUgKilsaSwgIiAgICBSZXF1ZXN0IG9wdGlvbmFsIEFWUDoiKTsKKwlmb3IgKGxpID0gYy0+YW5zcnVsZXNfZml4ZWQubmV4dDsgbGkgIT0gJmMtPmFuc3J1bGVzX2ZpeGVkOyBsaSA9IGxpLT5uZXh0KQorCQlkdW1wX3J1bGUoKHN0cnVjdCB0X3J1bGUgKilsaSwgIiAgICBBbnN3ZXIgZml4ZWQgICAgQVZQOiIpOworCWZvciAobGkgPSBjLT5hbnNydWxlc19yZXF1aXJlZC5uZXh0OyBsaSAhPSAmYy0+YW5zcnVsZXNfcmVxdWlyZWQ7IGxpID0gbGktPm5leHQpCisJCWR1bXBfcnVsZSgoc3RydWN0IHRfcnVsZSAqKWxpLCAiICAgIEFuc3dlciByZXF1aXJlZCBBVlA6Iik7CisJZm9yIChsaSA9IGMtPmFuc3J1bGVzX29wdGlvbmFsLm5leHQ7IGxpICE9ICZjLT5hbnNydWxlc19vcHRpb25hbDsgbGkgPSBsaS0+bmV4dCkKKwkJZHVtcF9ydWxlKChzdHJ1Y3QgdF9ydWxlICopbGksICIgICAgQW5zd2VyIG9wdGlvbmFsIEFWUDoiKTsKK30KKworc3RhdGljIHZvaWQgZGVsX2NtZF9jb250ZW50cyhzdHJ1Y3QgdF9jbWQgKiBjKSB7CisJVFJBQ0VfRU5UUlkoIiVwIiwgYyk7CisJZnJlZShjLT5uYW1lKTsKKwl3aGlsZSAoIUZEX0lTX0xJU1RfRU1QVFkoJmMtPnJlcXJ1bGVzX2ZpeGVkKSkgeworCQlzdHJ1Y3QgZmRfbGlzdCAqIGxpID0gYy0+cmVxcnVsZXNfZml4ZWQubmV4dDsKKwkJZmRfbGlzdF91bmxpbmsobGkpOworCQlkZWxfcnVsZV9jb250ZW50cygoc3RydWN0IHRfcnVsZSAqKWxpKTsKKwkJZnJlZShsaSk7CisJfQorCXdoaWxlICghRkRfSVNfTElTVF9FTVBUWSgmYy0+cmVxcnVsZXNfcmVxdWlyZWQpKSB7CisJCXN0cnVjdCBmZF9saXN0ICogbGkgPSBjLT5yZXFydWxlc19yZXF1aXJlZC5uZXh0OworCQlmZF9saXN0X3VubGluayhsaSk7CisJCWRlbF9ydWxlX2NvbnRlbnRzKChzdHJ1Y3QgdF9ydWxlICopbGkpOworCQlmcmVlKGxpKTsKKwl9CisJd2hpbGUgKCFGRF9JU19MSVNUX0VNUFRZKCZjLT5yZXFydWxlc19vcHRpb25hbCkpIHsKKwkJc3RydWN0IGZkX2xpc3QgKiBsaSA9IGMtPnJlcXJ1bGVzX29wdGlvbmFsLm5leHQ7CisJCWZkX2xpc3RfdW5saW5rKGxpKTsKKwkJZGVsX3J1bGVfY29udGVudHMoKHN0cnVjdCB0X3J1bGUgKilsaSk7CisJCWZyZWUobGkpOworCX0KKwl3aGlsZSAoIUZEX0lTX0xJU1RfRU1QVFkoJmMtPmFuc3J1bGVzX2ZpeGVkKSkgeworCQlzdHJ1Y3QgZmRfbGlzdCAqIGxpID0gYy0+YW5zcnVsZXNfZml4ZWQubmV4dDsKKwkJZmRfbGlzdF91bmxpbmsobGkpOworCQlkZWxfcnVsZV9jb250ZW50cygoc3RydWN0IHRfcnVsZSAqKWxpKTsKKwkJZnJlZShsaSk7CisJfQorCXdoaWxlICghRkRfSVNfTElTVF9FTVBUWSgmYy0+YW5zcnVsZXNfcmVxdWlyZWQpKSB7CisJCXN0cnVjdCBmZF9saXN0ICogbGkgPSBjLT5hbnNydWxlc19yZXF1aXJlZC5uZXh0OworCQlmZF9saXN0X3VubGluayhsaSk7CisJCWRlbF9ydWxlX2NvbnRlbnRzKChzdHJ1Y3QgdF9ydWxlICopbGkpOworCQlmcmVlKGxpKTsKKwl9CisJd2hpbGUgKCFGRF9JU19MSVNUX0VNUFRZKCZjLT5hbnNydWxlc19vcHRpb25hbCkpIHsKKwkJc3RydWN0IGZkX2xpc3QgKiBsaSA9IGMtPmFuc3J1bGVzX29wdGlvbmFsLm5leHQ7CisJCWZkX2xpc3RfdW5saW5rKGxpKTsKKwkJZGVsX3J1bGVfY29udGVudHMoKHN0cnVjdCB0X3J1bGUgKilsaSk7CisJCWZyZWUobGkpOworCX0KK30KKworLyogVFlQRSAqLworc3RydWN0IHRfdHlwZWRlZm4geworCXN0cnVjdCBmZF9saXN0ICBjaGFpbjsJLyogbGluayBpbiB0X2FwcGwtPnR5cGVzICovCisJdWludDhfdCAqCW5hbWU7CisJdWludDhfdCAqCXBhcmVudF9uYW1lOworfTsKKworc3RhdGljIGludCBuZXdfdHlwZShzdHJ1Y3QgZmRfbGlzdCAqIHBhcmVudCwgeG1sQ2hhciAqIHhtbG5hbWUsIHhtbENoYXIgKiB4bWxwYXJlbnQgLyosIHhtbENoYXIgKiB4bWxkZXNjcmlwdGlvbiAtLSBpZ25vcmUgKi8pIHsKKwlzdHJ1Y3QgdF90eXBlZGVmbiAqIG5ldzsKKwkKKwlUUkFDRV9FTlRSWSgiJXAgJXAgJXAiLCBwYXJlbnQsIHhtbG5hbWUsIHhtbHBhcmVudCk7CisJQ0hFQ0tfUEFSQU1TKCBwYXJlbnQgJiYgeG1sbmFtZSApOworCQorCUNIRUNLX01BTExPQyggbmV3ID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgdF90eXBlZGVmbikpICk7CisJbWVtc2V0KG5ldywgMCwgc2l6ZW9mKHN0cnVjdCB0X3R5cGVkZWZuKSk7CisJZmRfbGlzdF9pbml0KCZuZXctPmNoYWluLCBOVUxMKTsKKwlDSEVDS19NQUxMT0MoIG5ldy0+bmFtZSA9ICh1aW50OF90ICopc3RyZHVwKChjaGFyICopeG1sbmFtZSkgKTsKKwlpZiAoeG1scGFyZW50KSB7CisJCUNIRUNLX01BTExPQyggbmV3LT5wYXJlbnRfbmFtZSA9ICh1aW50OF90ICopc3RyZHVwKChjaGFyICopeG1scGFyZW50KSApOworCX0KKwkKKwlmZF9saXN0X2luc2VydF9iZWZvcmUocGFyZW50LCAmbmV3LT5jaGFpbik7CisJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfdHlwZShzdHJ1Y3QgdF90eXBlZGVmbiAqIHQpIHsKKwlmZF9sb2dfZGVidWcoIiAgVHlwZSAlcyVzJXMlcyIsIChjaGFyICopdC0+bmFtZSwKKwkJICAgICB0LT5wYXJlbnRfbmFtZSA/ICIocGFyZW50OiAiIDogIiIsIAorCQkgICAgIHQtPnBhcmVudF9uYW1lID8gKGNoYXIgKil0LT5wYXJlbnRfbmFtZSA6ICIiLCAKKwkJICAgICB0LT5wYXJlbnRfbmFtZSA/ICIpIiA6ICIiKTsKK30KKworc3RhdGljIHZvaWQgZGVsX3R5cGVfY29udGVudHMoc3RydWN0IHRfdHlwZWRlZm4gKiB0KSB7CisJVFJBQ0VfRU5UUlkoIiVwIiwgdCk7CisJZnJlZSh0LT5uYW1lKTsKKwlmcmVlKHQtPnBhcmVudF9uYW1lKTsKK30KKwkKKworLyogVFlQRSBJTlNJREUgQVZQICovCitzdHJ1Y3QgdF9hdnB0eXBlIHsKKwlzdHJ1Y3QgZmRfbGlzdCAgY2hhaW47ICAvKiBsaW5rIGluIHRfYXZwLT50eXBlICovCisJdWludDhfdCAqCXR5cGVfbmFtZTsKK307CisKK3N0YXRpYyBpbnQgbmV3X2F2cHR5cGUoc3RydWN0IGZkX2xpc3QgKiBwYXJlbnQsIHhtbENoYXIgKiB4bWxuYW1lKSB7CisJc3RydWN0IHRfYXZwdHlwZSAqIG5ldzsKKwkKKwlUUkFDRV9FTlRSWSgiJXAgJXAiLCBwYXJlbnQsIHhtbG5hbWUpOworCUNIRUNLX1BBUkFNUyggcGFyZW50ICYmIHhtbG5hbWUgKTsKKwkKKwlDSEVDS19NQUxMT0MoIG5ldyA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHRfYXZwdHlwZSkpICk7CisJbWVtc2V0KG5ldywgMCwgc2l6ZW9mKHN0cnVjdCB0X2F2cHR5cGUpKTsKKwlmZF9saXN0X2luaXQoJm5ldy0+Y2hhaW4sIE5VTEwpOworCUNIRUNLX01BTExPQyggbmV3LT50eXBlX25hbWUgPSAodWludDhfdCAqKXN0cmR1cCgoY2hhciAqKXhtbG5hbWUpICk7CisJCisJZmRfbGlzdF9pbnNlcnRfYmVmb3JlKHBhcmVudCwgJm5ldy0+Y2hhaW4pOworCQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkdW1wX2F2cHR5cGUoc3RydWN0IHRfYXZwdHlwZSAqIHQpIHsKKwlmZF9sb2dfZGVidWcoIiAgICBkYXRhIHR5cGU6ICVzIiwgdC0+dHlwZV9uYW1lKTsKK30KKworc3RhdGljIHZvaWQgZGVsX2F2cHR5cGVfY29udGVudHMoc3RydWN0IHRfYXZwdHlwZSAqIHQpIHsKKwlUUkFDRV9FTlRSWSgiJXAiLCB0KTsKKwlmcmVlKHQtPnR5cGVfbmFtZSk7Cit9CisJCisKKy8qIEVOVU0gKi8KK3N0cnVjdCB0X2VudW0geworCXN0cnVjdCBmZF9saXN0ICBjaGFpbjsgIC8qIGxpbmsgaW4gdF9hdnAtPmVudW1zICovCisJdWludDMyX3QJY29kZTsKKwl1aW50OF90ICoJbmFtZTsKK307CisKK3N0YXRpYyBpbnQgbmV3X2VudW0oc3RydWN0IGZkX2xpc3QgKiBwYXJlbnQsIHhtbENoYXIgKiB4bWxjb2RlLCB4bWxDaGFyICogeG1sbmFtZSkgeworCXN0cnVjdCB0X2VudW0gKiBuZXc7CisJdWludDMyX3QgY29kZSA9IDA7CisJCisJVFJBQ0VfRU5UUlkoIiVwICVwICVwIiwgcGFyZW50LCB4bWxjb2RlLCB4bWxuYW1lKTsKKwlDSEVDS19QQVJBTVMoIHBhcmVudCAmJiB4bWxjb2RlICYmIHhtbG5hbWUgKTsKKwkKKwlDSEVDS19GQ1QoIHhtbHRvaW50KHhtbGNvZGUsICZjb2RlKSApOworCQorCUNIRUNLX01BTExPQyggbmV3ID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgdF9lbnVtKSkgKTsKKwltZW1zZXQobmV3LCAwLCBzaXplb2Yoc3RydWN0IHRfZW51bSkpOworCWZkX2xpc3RfaW5pdCgmbmV3LT5jaGFpbiwgTlVMTCk7CisJbmV3LT5jb2RlID0gY29kZTsKKwlDSEVDS19NQUxMT0MoIG5ldy0+bmFtZSA9ICh1aW50OF90ICopc3RyZHVwKChjaGFyICopeG1sbmFtZSkgKTsKKwkKKwlmZF9saXN0X2luc2VydF9iZWZvcmUocGFyZW50LCAmbmV3LT5jaGFpbik7CisJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfZW51bShzdHJ1Y3QgdF9lbnVtICogZSkgeworCWZkX2xvZ19kZWJ1ZygiICAgIFZhbHVlOiAlZCA9PSAlcyIsIGUtPmNvZGUsIGUtPm5hbWUpOworfQkKKworc3RhdGljIHZvaWQgZGVsX2VudW1fY29udGVudHMoc3RydWN0IHRfZW51bSAqIGUpIHsKKwlUUkFDRV9FTlRSWSgiJXAiLCBlKTsKKwlmcmVlKGUtPm5hbWUpOworfQorCisvKiBBVlAgKi8KK3N0cnVjdCB0X2F2cCB7CisJc3RydWN0IGZkX2xpc3QgIGNoYWluOyAgLyogbGluayBpbiB0X2FwcGwtPmF2cHMgKi8KKwl1aW50MzJfdAljb2RlOworCXVpbnQ4X3QgKgluYW1lOworCXVpbnQ4X3QJCWZsYWdzOworCXVpbnQ4X3QJCWZtYXNrOworCXVpbnQzMl90CXZlbmRvcjsKKwlzdHJ1Y3QgZmRfbGlzdCAgdHlwZTsgICAgICAgICAgICAgLyogbGlzdCBvZiB0X2F2cHR5cGUgLS0gdGhlcmUgbXVzdCBiZSBhdCBtYXggMSBpdGVtIGluIHRoZSBsaXN0ICovCisJc3RydWN0IGZkX2xpc3QgIGVudW1zOyAgICAgICAgICAgIC8qIGxpc3Qgb2YgdF9lbnVtICovCisJc3RydWN0IGZkX2xpc3QgIGdyb3VwZWRfZml4ZWQ7ICAgIC8qIGxpc3Qgb2YgdF9ydWxlICovCisJc3RydWN0IGZkX2xpc3QgIGdyb3VwZWRfcmVxdWlyZWQ7IC8qIGxpc3Qgb2YgdF9ydWxlICovCisJc3RydWN0IGZkX2xpc3QgIGdyb3VwZWRfb3B0aW9uYWw7IC8qIGxpc3Qgb2YgdF9ydWxlICovCit9OworCitzdGF0aWMgaW50IG5ld19hdnAoc3RydWN0IGZkX2xpc3QgKiBwYXJlbnQsIHhtbENoYXIgKiB4bWxjb2RlLCB4bWxDaGFyICogeG1sbmFtZSwgeG1sQ2hhciAqIHhtbG1hbmRhdG9yeSwgeG1sQ2hhciAqIHhtbHZlbmRvciwgc3RydWN0IHRfYXZwICoqcmV0KSB7CisJLyogd2UgaWdub3JlIGRlc2NyaXB0aW9uLCBtYXktZW5jcnlwdCwgcHJvdGVjdGVkLCAuLi4gKi8KKwlzdHJ1Y3QgdF9hdnAgKiBuZXc7CisJdWludDMyX3QgY29kZTsKKwl1aW50MzJfdCB2ZW5kb3IgPSAwOworCXVpbnQzMl90IGZsYWcgPSAwOworCXVpbnQzMl90IGZtYXNrID0gMDsKKwkKKwlUUkFDRV9FTlRSWSgiJXAgJXAgJXAgJXAgJXAiLCBwYXJlbnQsIHhtbGNvZGUsIHhtbG5hbWUsIHhtbG1hbmRhdG9yeSwgeG1sdmVuZG9yKTsKKwlDSEVDS19QQVJBTVMoIHBhcmVudCAmJiB4bWxjb2RlICYmIHhtbG5hbWUgKTsKKwkKKwlDSEVDS19GQ1QoIHhtbHRvaW50KHhtbGNvZGUsICZjb2RlKSApOworCQorCWlmICh4bWxtYW5kYXRvcnkgJiYgIXN0cmNhc2VjbXAoKGNoYXIgKil4bWxtYW5kYXRvcnksICJtdXN0IikpIHsKKwkJZmxhZyB8PSBBVlBfRkxBR19NQU5EQVRPUlk7CisJCWZtYXNrIHw9IEFWUF9GTEFHX01BTkRBVE9SWTsKKwl9CisJCisJaWYgKHhtbHZlbmRvcikgeworCQlDSEVDS19GQ1QoIHhtbHRvaW50KHhtbHZlbmRvciwgJnZlbmRvcikgKTsKKwkJaWYgKHZlbmRvcikKKwkJCWZsYWcgfD0gQVZQX0ZMQUdfVkVORE9SOworCQlmbWFzayB8PSBBVlBfRkxBR19WRU5ET1I7CisJfQorCQorCUNIRUNLX01BTExPQyggbmV3ID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgdF9hdnApKSApOworCW1lbXNldChuZXcsIDAsIHNpemVvZihzdHJ1Y3QgdF9hdnApKTsKKwlmZF9saXN0X2luaXQoJm5ldy0+Y2hhaW4sIE5VTEwpOworCW5ldy0+Y29kZSA9IGNvZGU7CisJQ0hFQ0tfTUFMTE9DKCBuZXctPm5hbWUgPSAodWludDhfdCAqKXN0cmR1cCgoY2hhciAqKXhtbG5hbWUpICk7CisJbmV3LT5mbGFncyA9IGZsYWc7CisJbmV3LT5mbWFzayA9IGZtYXNrOworCW5ldy0+dmVuZG9yPSB2ZW5kb3I7IAorCWZkX2xpc3RfaW5pdCgmbmV3LT50eXBlLCBOVUxMKTsKKwlmZF9saXN0X2luaXQoJm5ldy0+ZW51bXMsIE5VTEwpOworCWZkX2xpc3RfaW5pdCgmbmV3LT5ncm91cGVkX2ZpeGVkLCBOVUxMKTsKKwlmZF9saXN0X2luaXQoJm5ldy0+Z3JvdXBlZF9yZXF1aXJlZCwgTlVMTCk7CisJZmRfbGlzdF9pbml0KCZuZXctPmdyb3VwZWRfb3B0aW9uYWwsIE5VTEwpOworCQorCWZkX2xpc3RfaW5zZXJ0X2JlZm9yZShwYXJlbnQsICZuZXctPmNoYWluKTsKKwkKKwkqcmV0ID0gbmV3OworCQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkdW1wX2F2cChzdHJ1Y3QgdF9hdnAgKiBhKSB7CisJc3RydWN0IGZkX2xpc3QgKiBsaTsKKwlmZF9sb2dfZGVidWcoIiAgQVZQICVkICVzJXM6ICVzIiwgYS0+Y29kZSwgCisJCWEtPmZtYXNrICYgQVZQX0ZMQUdfTUFOREFUT1JZID8gKCBhLT5mbGFncyAmIEFWUF9GTEFHX01BTkRBVE9SWSA/ICJbTT0xXSIgOiAiW009MF0iKSA6ICIiLCAKKwkJYS0+Zm1hc2sgJiBBVlBfRkxBR19WRU5ET1IgPyAoIGEtPmZsYWdzICYgQVZQX0ZMQUdfVkVORE9SID8gIltWPTFdIiA6ICJbVj0wXSIpIDogIiIsIAorCQlhLT5uYW1lKTsKKwlpZiAoYS0+Zm1hc2sgJiBBVlBfRkxBR19WRU5ET1IpCisJCWZkX2xvZ19kZWJ1ZygiICAgIHZlbmRvcjogJWQiLCBhLT52ZW5kb3IpOworCWZvciAobGkgPSBhLT50eXBlLm5leHQ7IGxpICE9ICZhLT50eXBlOyBsaSA9IGxpLT5uZXh0KQorCQlkdW1wX2F2cHR5cGUoKHN0cnVjdCB0X2F2cHR5cGUgKilsaSk7CisJZm9yIChsaSA9IGEtPmVudW1zLm5leHQ7IGxpICE9ICZhLT5lbnVtczsgbGkgPSBsaS0+bmV4dCkKKwkJZHVtcF9lbnVtKChzdHJ1Y3QgdF9lbnVtICopbGkpOworCWZvciAobGkgPSBhLT5ncm91cGVkX2ZpeGVkLm5leHQ7IGxpICE9ICZhLT5ncm91cGVkX2ZpeGVkOyBsaSA9IGxpLT5uZXh0KQorCQlkdW1wX3J1bGUoKHN0cnVjdCB0X3J1bGUgKilsaSwgIiAgICBHcm91cGVkLCBmaXhlZCAgICBBVlA6Iik7CisJZm9yIChsaSA9IGEtPmdyb3VwZWRfcmVxdWlyZWQubmV4dDsgbGkgIT0gJmEtPmdyb3VwZWRfcmVxdWlyZWQ7IGxpID0gbGktPm5leHQpCisJCWR1bXBfcnVsZSgoc3RydWN0IHRfcnVsZSAqKWxpLCAiICAgIEdyb3VwZWQsIHJlcXVpcmVkIEFWUDoiKTsKKwlmb3IgKGxpID0gYS0+Z3JvdXBlZF9vcHRpb25hbC5uZXh0OyBsaSAhPSAmYS0+Z3JvdXBlZF9vcHRpb25hbDsgbGkgPSBsaS0+bmV4dCkKKwkJZHVtcF9ydWxlKChzdHJ1Y3QgdF9ydWxlICopbGksICIgICAgR3JvdXBlZCwgb3B0aW9uYWwgQVZQOiIpOworfQorCitzdGF0aWMgdm9pZCBkZWxfYXZwX2NvbnRlbnRzKHN0cnVjdCB0X2F2cCAqIGEpIHsKKwlUUkFDRV9FTlRSWSgiJXAiLCBhKTsKKwlmcmVlKGEtPm5hbWUpOworCXdoaWxlICghRkRfSVNfTElTVF9FTVBUWSgmYS0+dHlwZSkpIHsKKwkJc3RydWN0IGZkX2xpc3QgKiBsaSA9IGEtPnR5cGUubmV4dDsKKwkJZmRfbGlzdF91bmxpbmsobGkpOworCQlkZWxfYXZwdHlwZV9jb250ZW50cygoc3RydWN0IHRfYXZwdHlwZSAqKWxpKTsKKwkJZnJlZShsaSk7CisJfQorCXdoaWxlICghRkRfSVNfTElTVF9FTVBUWSgmYS0+ZW51bXMpKSB7CisJCXN0cnVjdCBmZF9saXN0ICogbGkgPSBhLT5lbnVtcy5uZXh0OworCQlmZF9saXN0X3VubGluayhsaSk7CisJCWRlbF9lbnVtX2NvbnRlbnRzKChzdHJ1Y3QgdF9lbnVtICopbGkpOworCQlmcmVlKGxpKTsKKwl9CisJd2hpbGUgKCFGRF9JU19MSVNUX0VNUFRZKCZhLT5ncm91cGVkX2ZpeGVkKSkgeworCQlzdHJ1Y3QgZmRfbGlzdCAqIGxpID0gYS0+Z3JvdXBlZF9maXhlZC5uZXh0OworCQlmZF9saXN0X3VubGluayhsaSk7CisJCWRlbF9ydWxlX2NvbnRlbnRzKChzdHJ1Y3QgdF9ydWxlICopbGkpOworCQlmcmVlKGxpKTsKKwl9CisJd2hpbGUgKCFGRF9JU19MSVNUX0VNUFRZKCZhLT5ncm91cGVkX3JlcXVpcmVkKSkgeworCQlzdHJ1Y3QgZmRfbGlzdCAqIGxpID0gYS0+Z3JvdXBlZF9yZXF1aXJlZC5uZXh0OworCQlmZF9saXN0X3VubGluayhsaSk7CisJCWRlbF9ydWxlX2NvbnRlbnRzKChzdHJ1Y3QgdF9ydWxlICopbGkpOworCQlmcmVlKGxpKTsKKwl9CisJd2hpbGUgKCFGRF9JU19MSVNUX0VNUFRZKCZhLT5ncm91cGVkX29wdGlvbmFsKSkgeworCQlzdHJ1Y3QgZmRfbGlzdCAqIGxpID0gYS0+Z3JvdXBlZF9vcHRpb25hbC5uZXh0OworCQlmZF9saXN0X3VubGluayhsaSk7CisJCWRlbF9ydWxlX2NvbnRlbnRzKChzdHJ1Y3QgdF9ydWxlICopbGkpOworCQlmcmVlKGxpKTsKKwl9Cit9CisKKworLyogQVBQTElDQVRJT04gKi8KK3N0cnVjdCB0X2FwcGwgeworCXN0cnVjdCBmZF9saXN0IAljaGFpbjsgLyogbGluayBpbiB0aGUgdF9kaWN0aW9uYXJ5LT5iYXNlX2FuZF9hcHBsaWNhdGlvbnMsIHRoZSBzZW50aW5lbCBjb3JyZXNwb25kcyB0byAiYmFzZSIgKi8KKwl1aW50MzJfdAlpZDsKKwl1aW50OF90ICoJbmFtZTsKKwlzdHJ1Y3QgZmRfbGlzdCAgY29tbWFuZHM7IC8qIGxpc3Qgb2YgdF9jbWQgKi8KKwlzdHJ1Y3QgZmRfbGlzdAl0eXBlczsgICAgLyogbGlzdCBvZiB0X3R5cGVkZWZuICovCisJc3RydWN0IGZkX2xpc3QgIGF2cHM7ICAgICAvKiBsaXN0IG9mIHRfYXZwICovCit9OworCitzdGF0aWMgaW50IG5ld19hcHBsKHN0cnVjdCBmZF9saXN0ICogcGFyZW50LCB4bWxDaGFyICogeG1saWQsIHhtbENoYXIgKiB4bWxuYW1lIC8qIFdlIGlnbm9yZSB0aGUgVVJJICovLCBzdHJ1Y3QgdF9hcHBsICoqcmV0KSB7CisJc3RydWN0IHRfYXBwbCAqIG5ldzsKKwl1aW50MzJfdCBpZCA9IDA7CisJCisJVFJBQ0VfRU5UUlkoIiVwICVwICVwIiwgcGFyZW50LCB4bWxpZCwgeG1sbmFtZSk7CisJQ0hFQ0tfUEFSQU1TKCBwYXJlbnQgJiYgeG1saWQgJiYgeG1sbmFtZSApOworCQorCUNIRUNLX0ZDVCggeG1sdG9pbnQoeG1saWQsICZpZCkgKTsKKwkKKwlDSEVDS19NQUxMT0MoIG5ldyA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHRfYXBwbCkpICk7CisJbWVtc2V0KG5ldywgMCwgc2l6ZW9mKHN0cnVjdCB0X2FwcGwpKTsKKwlmZF9saXN0X2luaXQoJm5ldy0+Y2hhaW4sIE5VTEwpOworCW5ldy0+aWQgPSBpZDsKKwlDSEVDS19NQUxMT0MoIG5ldy0+bmFtZSA9ICh1aW50OF90ICopc3RyZHVwKChjaGFyICopeG1sbmFtZSkgKTsKKwkKKwlmZF9saXN0X2luaXQoJm5ldy0+Y29tbWFuZHMsIE5VTEwpOworCWZkX2xpc3RfaW5pdCgmbmV3LT50eXBlcywgTlVMTCk7CisJZmRfbGlzdF9pbml0KCZuZXctPmF2cHMsIE5VTEwpOworCQorCWZkX2xpc3RfaW5zZXJ0X2JlZm9yZShwYXJlbnQsICZuZXctPmNoYWluKTsKKwkKKwkqcmV0ID0gbmV3OworCQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkdW1wX2FwcGwoc3RydWN0IHRfYXBwbCAqIGEpIHsKKwlzdHJ1Y3QgZmRfbGlzdCAqIGxpOworCWZkX2xvZ19kZWJ1ZygiIEFwcGxpY2F0aW9uICVkOiAlcyIsIGEtPmlkLCBhLT5uYW1lKTsKKwlmb3IgKGxpID0gYS0+Y29tbWFuZHMubmV4dDsgbGkgIT0gJmEtPmNvbW1hbmRzOyBsaSA9IGxpLT5uZXh0KQorCQlkdW1wX2NtZCgoc3RydWN0IHRfY21kICopbGkpOworCWZvciAobGkgPSBhLT50eXBlcy5uZXh0OyBsaSAhPSAmYS0+dHlwZXM7IGxpID0gbGktPm5leHQpCisJCWR1bXBfdHlwZSgoc3RydWN0IHRfdHlwZWRlZm4gKilsaSk7CisJZm9yIChsaSA9IGEtPmF2cHMubmV4dDsgbGkgIT0gJmEtPmF2cHM7IGxpID0gbGktPm5leHQpCisJCWR1bXBfYXZwKChzdHJ1Y3QgdF9hdnAgKilsaSk7Cit9CisKK3N0YXRpYyB2b2lkIGRlbF9hcHBsX2NvbnRlbnRzKHN0cnVjdCB0X2FwcGwgKiBhKSB7CisJVFJBQ0VfRU5UUlkoIiVwIiwgYSk7CisJZnJlZShhLT5uYW1lKTsKKwl3aGlsZSAoIUZEX0lTX0xJU1RfRU1QVFkoJmEtPmNvbW1hbmRzKSkgeworCQlzdHJ1Y3QgZmRfbGlzdCAqIGxpID0gYS0+Y29tbWFuZHMubmV4dDsKKwkJZmRfbGlzdF91bmxpbmsobGkpOworCQlkZWxfY21kX2NvbnRlbnRzKChzdHJ1Y3QgdF9jbWQgKilsaSk7CisJCWZyZWUobGkpOworCX0KKwl3aGlsZSAoIUZEX0lTX0xJU1RfRU1QVFkoJmEtPnR5cGVzKSkgeworCQlzdHJ1Y3QgZmRfbGlzdCAqIGxpID0gYS0+dHlwZXMubmV4dDsKKwkJZmRfbGlzdF91bmxpbmsobGkpOworCQlkZWxfdHlwZV9jb250ZW50cygoc3RydWN0IHRfdHlwZWRlZm4gKilsaSk7CisJCWZyZWUobGkpOworCX0KKwl3aGlsZSAoIUZEX0lTX0xJU1RfRU1QVFkoJmEtPmF2cHMpKSB7CisJCXN0cnVjdCBmZF9saXN0ICogbGkgPSBhLT5hdnBzLm5leHQ7CisJCWZkX2xpc3RfdW5saW5rKGxpKTsKKwkJZGVsX2F2cF9jb250ZW50cygoc3RydWN0IHRfYXZwICopbGkpOworCQlmcmVlKGxpKTsKKwl9Cit9CisKKy8qIERJQ1RJT05BUlkgKi8JCitzdHJ1Y3QgdF9kaWN0aW9uYXJ5IHsKKwlzdHJ1Y3QgZmRfbGlzdCAgdmVuZG9yczsKKwlzdHJ1Y3QgdF9hcHBsICAgYmFzZV9hbmRfYXBwbGljYXRpb25zOworfTsKKworc3RhdGljIHZvaWQgZHVtcF9kaWN0KHN0cnVjdCB0X2RpY3Rpb25hcnkgKiBkKSB7CisJc3RydWN0IGZkX2xpc3QgKiBsaTsKKwlmb3IgKGxpID0gZC0+dmVuZG9ycy5uZXh0OyBsaSAhPSAmZC0+dmVuZG9yczsgbGkgPSBsaS0+bmV4dCkKKwkJZHVtcF92ZW5kb3IoKHN0cnVjdCB0X3ZlbmQgKilsaSk7CisJZHVtcF9hcHBsKCZkLT5iYXNlX2FuZF9hcHBsaWNhdGlvbnMpOworCWZvciAobGkgPSBkLT5iYXNlX2FuZF9hcHBsaWNhdGlvbnMuY2hhaW4ubmV4dDsgbGkgIT0gJmQtPmJhc2VfYW5kX2FwcGxpY2F0aW9ucy5jaGFpbjsgbGkgPSBsaS0+bmV4dCkKKwkJZHVtcF9hcHBsKChzdHJ1Y3QgdF9hcHBsICopbGkpOworfQorCitzdGF0aWMgdm9pZCBkZWxfZGljdF9jb250ZW50cyhzdHJ1Y3QgdF9kaWN0aW9uYXJ5ICogZCkgeworCVRSQUNFX0VOVFJZKCIlcCIsIGQpOworCXdoaWxlICghRkRfSVNfTElTVF9FTVBUWSgmZC0+dmVuZG9ycykpIHsKKwkJc3RydWN0IGZkX2xpc3QgKiBsaSA9IGQtPnZlbmRvcnMubmV4dDsKKwkJZmRfbGlzdF91bmxpbmsobGkpOworCQlkZWxfdmVuZG9yX2NvbnRlbnRzKChzdHJ1Y3QgdF92ZW5kICopbGkpOworCQlmcmVlKGxpKTsKKwl9CisJd2hpbGUgKCFGRF9JU19MSVNUX0VNUFRZKCZkLT5iYXNlX2FuZF9hcHBsaWNhdGlvbnMuY2hhaW4pKSB7CisJCXN0cnVjdCBmZF9saXN0ICogbGkgPSBkLT5iYXNlX2FuZF9hcHBsaWNhdGlvbnMuY2hhaW4ubmV4dDsKKwkJZmRfbGlzdF91bmxpbmsobGkpOworCQlkZWxfYXBwbF9jb250ZW50cygoc3RydWN0IHRfYXBwbCAqKWxpKTsKKwkJZnJlZShsaSk7CisJfQorCWQtPmJhc2VfYW5kX2FwcGxpY2F0aW9ucy5uYW1lID0gTlVMTDsKKwlkZWxfYXBwbF9jb250ZW50cygmZC0+YmFzZV9hbmRfYXBwbGljYXRpb25zKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkKKy8qIFRoZSBzdGF0ZXMgZm9yIHRoZSBTQVggcGFyc2VyLCBjb3JyZXNwb25kaW5nIHJvdWdobHkgdG8gdGhlIGV4cGVjdGVkIHN0cnVjdHVyZSBvZiB0aGUgWE1MIGZpbGUuIAorV2UgdXNlIHRoZSBzdGF0ZXMgbW9zdGx5IHRvIHZhbGlkYXRlIHRoZSBYTUwgZmlsZS4gKi8KK2VudW0gc3RhdGUgeworCUlOSVQgPSAwLAorCVNUQVJULCAvKiBJbiAiZGljdGlvbmFyeSIgKi8KKwkgSU5fVkVORE9SLAorCSBJTl9BUFBMSUNBVElPTiwgICAgICAgIC8qIG5vdGUgdGhhdCAiYmFzZSIgaXMgZXF1aXZhbGVudCB0byAiYXBwbGljYXRpb24iIGZvciBvdXIgc3RhdGUgbWFjaGluZSAqLworCSAgSU5fQ09NTUFORCwKKwkgICBJTl9SRVFSVUxFUywKKwkgICAgSU5fUkVRUlVMRVNfRklYRUQsCisJICAgIElOX1JFUVJVTEVTX1JFUVVJUkVELAorCSAgICBJTl9SRVFSVUxFU19PUFRJT05BTCwKKwkgICBJTl9BTlNSVUxFUywKKwkgICAgSU5fQU5TUlVMRVNfRklYRUQsCisJICAgIElOX0FOU1JVTEVTX1JFUVVJUkVELAorCSAgICBJTl9BTlNSVUxFU19PUFRJT05BTCwKKwkgIElOX1RZUEVERUZOLAorCSAgSU5fQVZQLAorCSAgIElOX0FWUF9UWVBFLAorCSAgIElOX0FWUF9FTlVNLAorCSAgIElOX0FWUF9HUk9VUEVELAorCSAgICBJTl9BVlBfR1JPVVBFRF9GSVhFRCwKKwkgICAgSU5fQVZQX0dST1VQRURfUkVRVUlSRUQsCisJICAgIElOX0FWUF9HUk9VUEVEX09QVElPTkFMCit9OworCisKKy8qIFRoZSBjb250ZXh0IHBhc3NlZCB0byB0aGUgU0FYIHBhcnNlciAqLworc3RydWN0IHBhcnNlcl9jdHggeworCWVudW0gc3RhdGUgCQlzdGF0ZTsgCSAgICAgLyogdGhlIGN1cnJlbnQgc3RhdGUgKi8KKwlpbnQgICAgICAgIAkJZXJyb3JfZGVwdGg7IC8qIGlmIG5vbiAwLCB3ZSBhcmUgaW4gYW4gdW5leHBlY3RlZCBlbGVtZW50LCB3YWl0IHVudGlsIHRoZSBjb3VudCBnb2VzIGJhY2sgdG8gMCB0byByZXN1bWUgbm9ybWFsIHBhcnNpbmcuICovCisJc3RydWN0IHRfZGljdGlvbmFyeSAJZGljdDsgICAgICAgIC8qIFRoZSBkaWN0aW9uYXJ5IGJlaW5nIGJ1aWx0ICovCisJc3RydWN0IHRfYXBwbCAqCQljdXJfYXBwOworCXN0cnVjdCB0X2NtZCAgKgkJY3VyX2NtZDsKKwlzdHJ1Y3QgdF9hdnAgICoJCWN1cl9hdnA7CisJY2hhciAqIAkJCXhtbGZpbGVuYW1lOyAvKiBOYW1lIG9mIHRoZSBmaWxlLCBmb3IgZXJyb3IgbWVzc2FnZXMgKi8KK307CisKKy8qIEZpbmQgYW4gYXR0cmlidXRlIHdpdGggZ2l2ZW4gbmFtZSBpbiB0aGUgbGlzdCAqLworc3RhdGljIHZvaWQgZ2V0X2F0dHIoY29uc3QgeG1sQ2hhciAqKiBhdHRzX2FycmF5LCBjb25zdCBjaGFyICogYXR0cl9uYW1lLCB4bWxDaGFyICoqIGF0dHJfdmFsKSB7CisJaW50IGk7CisJKmF0dHJfdmFsID0gTlVMTDsKKwlpZiAoYXR0c19hcnJheSA9PSBOVUxMKQorCQlyZXR1cm47CisJZm9yIChpPTA7IGF0dHNfYXJyYXlbaV0gIT0gTlVMTDsgaSs9MikgeworCQlpZiAoIXN0cmNhc2VjbXAoKGNoYXIgKilhdHRzX2FycmF5W2ldLCBhdHRyX25hbWUpKSB7CisJCQkvKiBmb3VuZCAqLworCQkJKmF0dHJfdmFsID0gKHhtbENoYXIgKilhdHRzX2FycmF5W2krMV07CisJCQlyZXR1cm47CisJCX0KKwl9CisJLyogbm90IGZvdW5kICovCisJcmV0dXJuOworfQorCisvKiBUaGUgZm9sbG93aW5nIG1hY3JvIGF2b2lkcyBkdXBsaWNhdGluZyBhIGxvdCBvZiBjb2RlIGluIHRoZSBzdGF0ZSBtYWNoaW5lICovCisjZGVmaW5lIEFERF9SVUxFKCBfcGFyZW50X2xpc3QgKSB7IAkJCQlcCisJeG1sQ2hhciAqeG5hbWUsICp4bWluLCAqeG1heDsJCQkJXAorCS8qIFdlIGFyZSBleHBlY3RpbmcgYW4gPGF2cHJ1bGU+IHRhZyBhdCB0aGlzIHBvaW50ICovCVwKKwlpZiAoc3RyY2FzZWNtcCgoY2hhciAqKW5hbWUsICJhdnBydWxlIikpCQlcCisJCWdvdG8geG1sX3RyZWVfZXJyb3I7CQkJCVwKKwkvKiBTZWFyY2ggdGhlIGV4cGVjdGVkIGF0dHJpYnV0ZXMgKi8JCQlcCisJZ2V0X2F0dHIoYXR0cywgIm5hbWUiLCAmeG5hbWUpOwkJCQlcCisJZ2V0X2F0dHIoYXR0cywgIm1heGltdW0iLCAmeG1heCk7CQkJXAorCWdldF9hdHRyKGF0dHMsICJtaW5pbXVtIiwgJnhtaW4pOwkJCVwKKwkvKiBDaGVjayB0aGUgbWFuZGF0b3J5IG5hbWUgaXMgaGVyZSAqLwkJCVwKKwlDSEVDS19QQVJBTVNfRE8oeG5hbWUsIAkJCQkJXAorCQl7IFRSQUNFX0RFQlVHKElORk8sICJJbnZhbGlkICdhdnBydWxlJyB0YWcgZm91bmQgd2l0aG91dCAnbmFtZScgYXR0cmlidXRlLiIpOyBnb3RvIHhtbF90cmVlX2Vycm9yOyB9ICk7CVwKKwkvKiBDcmVhdGUgdGhlIHJ1bGUgYW5kIGFkZCBpbnRvIHRoZSBwYXJlbnQgbGlzdCAqLwlcCisJQ0hFQ0tfRkNUX0RPKCBuZXdfcnVsZSgoX3BhcmVudF9saXN0KSwgeG5hbWUsIHhtYXgsIHhtaW4pLFwKKwkJeyBUUkFDRV9ERUJVRyhJTkZPLCAiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcGFyc2luZyBhbiBhdnBydWxlIHRhZy4gRW50cnkgaWdub3JlZC4iKTsgZ290byB4bWxfdHJlZV9lcnJvcjsgfSApOyBcCisJLyogRG9uZS4gd2UgZG9uJ3QgY2hhbmdlIHRoZSBzdGF0ZSAqLwkJCVwKK30KKwkKKwkKKy8qIFRoZSBmdW5jdGlvbiBjYWxsZWQgb24gZWFjaCBYTUwgZWxlbWVudCBzdGFydCB0YWcgKHN0YXJ0RWxlbWVudFNBWEZ1bmMpICovCitzdGF0aWMgdm9pZCBTQVhzdGFydGVsZW0gKHZvaWQgKiBjdHgsIGNvbnN0IHhtbENoYXIgKiBuYW1lLCBjb25zdCB4bWxDaGFyICoqIGF0dHMpCit7CisJc3RydWN0IHBhcnNlcl9jdHggKiBkYXRhID0gY3R4OworCVRSQUNFX0VOVFJZKCIlcCAlcCAlcCIsIGN0eCwgbmFtZSwgYXR0cyk7CisJQ0hFQ0tfUEFSQU1TX0RPKCBjdHggJiYgbmFtZSwgeyByZXR1cm47IH0gKTsKKwkKKwlUUkFDRV9ERUJVRyhDQUxMLCAiVGFnOiA8JXM+IiwgKGNoYXIgKiluYW1lKTsKKwkKKwlpZiAoZGF0YS0+ZXJyb3JfZGVwdGgpIC8qIHdlIGFyZSBpbiBhbiB1bmtub3duIGVsZW1lbnQsIGp1c3Qgc2tpcCB1bnRpbCBpdCBpcyBjbG9zZWQgKi8KKwkJZ290byB4bWxfdHJlZV9lcnJvcjsKKwkKKwlzd2l0Y2ggKGRhdGEtPnN0YXRlKSB7CisJCWNhc2UgSU5JVDogLyogd2UgYXJlIGp1c3Qgc3RhcnRpbmcuIFdlIG9ubHkgZXhwZWN0IGEgPGRpY3Rpb25hcnk+IHRhZywgcmVqZWN0IGFueXRoaW5nIGVsc2UuICovCisJCQlpZiAoc3RyY2FzZWNtcCgoY2hhciAqKW5hbWUsICJkaWN0aW9uYXJ5IikpCisJCQkJZ290byB4bWxfdHJlZV9lcnJvcjsKKwkJCQorCQkJZGF0YS0+c3RhdGUgPSBTVEFSVDsKKwkJCWJyZWFrOworCQkJCisJCWNhc2UgU1RBUlQ6IAorCQkJLyogV2UgYXJlIGluIDxkaWN0aW9uYXJ5PiAKKwkJCQlWYWxpZCB0YWdzIGFyZTogPHZlbmRvcj4sIDxiYXNlPiwgPGFwcGxpY2F0aW9uPiAqLworCQkJaWYgKCFzdHJjYXNlY21wKChjaGFyICopbmFtZSwgInZlbmRvciIpKSB7CisJCQkJeG1sQ2hhciAqeGlkLCAqeG5hbWU7CisJCQkJCisJCQkJZ2V0X2F0dHIoYXR0cywgImlkIiwgJnhpZCk7CisJCQkJZ2V0X2F0dHIoYXR0cywgIm5hbWUiLCAmeG5hbWUpOworCQkJCQorCQkJCS8qIGlkIGFuZCBuYW1lIGFyZSByZXF1aXJlZCAqLworCQkJCUNIRUNLX1BBUkFNU19ETyh4aWQgJiYgeG5hbWUsIAorCQkJCQl7IFRSQUNFX0RFQlVHKElORk8sICJJbnZhbGlkICd2ZW5kb3InIHRhZyBmb3VuZCB3aXRob3V0ICdpZCcgb3IgJ25hbWUnIGF0dHJpYnV0ZS4iKTsgZ290byB4bWxfdHJlZV9lcnJvcjsgfSApOworCQkJCQorCQkJCQorCQkJCUNIRUNLX0ZDVF9ETyggbmV3X3ZlbmRvcigmZGF0YS0+ZGljdC52ZW5kb3JzLCB4aWQsIHhuYW1lKSwKKwkJCQkJeyBUUkFDRV9ERUJVRyhJTkZPLCAiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcGFyc2luZyBhIHZlbmRvciB0YWcuIEVudHJ5IGlnbm9yZWQuIik7IGdvdG8geG1sX3RyZWVfZXJyb3I7IH0gKQorCQkJCQorCQkJCWRhdGEtPnN0YXRlID0gSU5fVkVORE9SOworCQkJCWJyZWFrOworCQkJfQorCQkJCisJCQlpZiAoIXN0cmNhc2VjbXAoKGNoYXIgKiluYW1lLCAiYmFzZSIpKSB7CisJCQkJLyogd2UgZG9uJ3QgY2FyZSBmb3IgdGhlICd1cmknIGF0dHJpYnV0ZSAqLworCQkJCWRhdGEtPmN1cl9hcHAgPSAmZGF0YS0+ZGljdC5iYXNlX2FuZF9hcHBsaWNhdGlvbnM7CisJCQkJZGF0YS0+c3RhdGUgPSBJTl9BUFBMSUNBVElPTjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCQorCQkJaWYgKCFzdHJjYXNlY21wKChjaGFyICopbmFtZSwgImFwcGxpY2F0aW9uIikpIHsKKwkJCQkvKiB3ZSBkb24ndCBjYXJlIGZvciB0aGUgJ3VyaScgYXR0cmlidXRlICovCisJCQkJeG1sQ2hhciAqeGlkLCAqeG5hbWU7CisJCQkJY2hhciBidWZbNTBdOworCQkJCQorCQkJCWdldF9hdHRyKGF0dHMsICJpZCIsICZ4aWQpOworCQkJCWdldF9hdHRyKGF0dHMsICJuYW1lIiwgJnhuYW1lKTsKKwkJCQkKKwkJCQlDSEVDS19QQVJBTVNfRE8oeGlkLCAKKwkJCQkJeyBUUkFDRV9ERUJVRyhJTkZPLCAiSW52YWxpZCAnYXBwbGljYXRpb24nIHRhZyBmb3VuZCB3aXRob3V0ICdpZCcgYXR0cmlidXRlLiIpOyBnb3RvIHhtbF90cmVlX2Vycm9yOyB9ICk7CisJCQkJCisJCQkJLyogTmFtZSBpcyBvcHRpb25hbCwgaWYgbm90IHByb3ZpZGVkIHdlIGNyZWF0ZSBhIG5hbWUgKi8KKwkJCQlpZiAoIXhuYW1lKSB7CisJCQkJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJBcHBsaWNhdGlvbiAlcyIsIHhpZCk7CisJCQkJCXhuYW1lID0gKHhtbENoYXIgKilidWY7CisJCQkJfQorCQkJCQorCQkJCUNIRUNLX0ZDVF9ETyggbmV3X2FwcGwoJmRhdGEtPmRpY3QuYmFzZV9hbmRfYXBwbGljYXRpb25zLmNoYWluLCB4aWQsIHhuYW1lLCAmZGF0YS0+Y3VyX2FwcCksCisJCQkJCXsgVFJBQ0VfREVCVUcoSU5GTywgIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHBhcnNpbmcgYW4gYXBwbGljYXRpb24gdGFnLiBFbnRyeSBpZ25vcmVkLiIpOyBnb3RvIHhtbF90cmVlX2Vycm9yOyB9ICkKKwkJCQkKKwkJCQlkYXRhLT5zdGF0ZSA9IElOX0FQUExJQ0FUSU9OOworCQkJCWJyZWFrOworCQkJfQorCQkJCisJCQkvKiBPdGhlciB0YWdzIGFyZSBlcnJvcnMgKi8KKwkJCWdvdG8geG1sX3RyZWVfZXJyb3I7CisJCQkKKwkJCQorCQljYXNlIElOX1ZFTkRPUjogLyogbm90aGluZyBpcyBhbGxvd2VkIGluc2lkZSA8dmVuZG9yPiAqLworCQkJZ290byB4bWxfdHJlZV9lcnJvcjsKKwkJCQkKKwkJY2FzZSBJTl9BUFBMSUNBVElPTjogCisJCQkvKiBXZSBhcmUgaW4gPGJhc2U+IG9yIDxhcHBsaWNhdGlvbj4KKwkJCQlWYWxpZCB0YWdzIGFyZTogPGNvbW1hbmQ+LCA8dHlwZWRlZm4+LCA8YXZwPiAqLworCQkJaWYgKCFzdHJjYXNlY21wKChjaGFyICopbmFtZSwgImNvbW1hbmQiKSkgeworCQkJCS8qIHdlIGRvbid0IGNhcmUgZm9yIHRoZSAndmVuZG9yLWlkJyBhdHRyaWJ1dGUuICovCisJCQkJeG1sQ2hhciAqeGNvZGUsICp4bmFtZSwgKnhwYml0OworCQkJCQorCQkJCWdldF9hdHRyKGF0dHMsICJjb2RlIiwgJnhjb2RlKTsKKwkJCQlnZXRfYXR0cihhdHRzLCAibmFtZSIsICZ4bmFtZSk7CisJCQkJZ2V0X2F0dHIoYXR0cywgInBiaXQiLCAmeHBiaXQpOworCQkJCQorCQkJCS8qIGNvZGUgYW5kIG5hbWUgYXJlIHJlcXVpcmVkICovCisJCQkJQ0hFQ0tfUEFSQU1TX0RPKHhjb2RlICYmIHhuYW1lLCAKKwkJCQkJeyBUUkFDRV9ERUJVRyhJTkZPLCAiSW52YWxpZCAnY29tbWFuZCcgdGFnIGZvdW5kIHdpdGhvdXQgJ2NvZGUnIG9yICduYW1lJyBhdHRyaWJ1dGUuIik7IGdvdG8geG1sX3RyZWVfZXJyb3I7IH0gKTsKKwkJCQkKKwkJCQlDSEVDS19GQ1RfRE8oIG5ld19jbWQoICZkYXRhLT5jdXJfYXBwLT5jb21tYW5kcywgeGNvZGUsIHhuYW1lLCB4cGJpdCwgJmRhdGEtPmN1cl9jbWQpLAorCQkJCQl7IFRSQUNFX0RFQlVHKElORk8sICJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBwYXJzaW5nIGEgY29tbWFuZCB0YWcuIEVudHJ5IGlnbm9yZWQuIik7IGdvdG8geG1sX3RyZWVfZXJyb3I7IH0gKQorCQkJCQorCQkJCWRhdGEtPnN0YXRlID0gSU5fQ09NTUFORDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCQorCQkJaWYgKCFzdHJjYXNlY21wKChjaGFyICopbmFtZSwgInR5cGVkZWZuIikpIHsKKwkJCQkvKiB3ZSBkb24ndCBjYXJlIGZvciB0aGUgJ2Rlc2NyaXB0aW9uJyBhdHRyaWJ1dGUuICovCisJCQkJeG1sQ2hhciAqeG5hbWUsICp4cGFyZW50OworCQkJCQorCQkJCWdldF9hdHRyKGF0dHMsICJ0eXBlLW5hbWUiLCAmeG5hbWUpOworCQkJCWdldF9hdHRyKGF0dHMsICJ0eXBlLXBhcmVudCIsICZ4cGFyZW50KTsKKwkJCQkKKwkJCQkvKiBuYW1lIGlzIHJlcXVpcmVkICovCisJCQkJQ0hFQ0tfUEFSQU1TX0RPKHhuYW1lLCAKKwkJCQkJeyBUUkFDRV9ERUJVRyhJTkZPLCAiSW52YWxpZCAndHlwZWRlZm4nIHRhZyBmb3VuZCB3aXRob3V0ICduYW1lJyBhdHRyaWJ1dGUuIik7IGdvdG8geG1sX3RyZWVfZXJyb3I7IH0gKTsKKwkJCQkKKwkJCQlDSEVDS19GQ1RfRE8oIG5ld190eXBlKCAmZGF0YS0+Y3VyX2FwcC0+dHlwZXMsIHhuYW1lLCB4cGFyZW50KSwKKwkJCQkJeyBUUkFDRV9ERUJVRyhJTkZPLCAiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcGFyc2luZyBhIHR5cGVkZWZuIHRhZy4gRW50cnkgaWdub3JlZC4iKTsgZ290byB4bWxfdHJlZV9lcnJvcjsgfSApCisJCQkJCisJCQkJZGF0YS0+c3RhdGUgPSBJTl9UWVBFREVGTjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCQorCQkJaWYgKCFzdHJjYXNlY21wKChjaGFyICopbmFtZSwgImF2cCIpKSB7CisJCQkJLyogd2UgZG9uJ3QgY2FyZSBmb3IgdGhlIGRlc2NyaXB0aW9uLCBtYXktZW5jcnlwdCwgYW5kIHByb3RlY3RlZCBhdHRyaWJ1dGVzICovCisJCQkJeG1sQ2hhciAqeG5hbWUsICp4Y29kZSwgKnhtYW5kYXRvcnksICp4dmVuZG9yOworCQkJCQorCQkJCWdldF9hdHRyKGF0dHMsICJuYW1lIiwgJnhuYW1lKTsKKwkJCQlnZXRfYXR0cihhdHRzLCAiY29kZSIsICZ4Y29kZSk7CisJCQkJZ2V0X2F0dHIoYXR0cywgIm1hbmRhdG9yeSIsICZ4bWFuZGF0b3J5KTsKKwkJCQlnZXRfYXR0cihhdHRzLCAidmVuZG9yLWlkIiwgJnh2ZW5kb3IpOworCQkJCQorCQkJCS8qIGNvZGUgYW5kIG5hbWUgYXJlIHJlcXVpcmVkICovCisJCQkJQ0hFQ0tfUEFSQU1TX0RPKHhjb2RlICYmIHhuYW1lLCAKKwkJCQkJeyBUUkFDRV9ERUJVRyhJTkZPLCAiSW52YWxpZCAnYXZwJyB0YWcgZm91bmQgd2l0aG91dCAnY29kZScgb3IgJ25hbWUnIGF0dHJpYnV0ZS4iKTsgZ290byB4bWxfdHJlZV9lcnJvcjsgfSApOworCQkJCQorCQkJCUNIRUNLX0ZDVF9ETyggbmV3X2F2cCgmZGF0YS0+Y3VyX2FwcC0+YXZwcywgeGNvZGUsIHhuYW1lLCB4bWFuZGF0b3J5LCB4dmVuZG9yLCAmZGF0YS0+Y3VyX2F2cCksCisJCQkJCXsgVFJBQ0VfREVCVUcoSU5GTywgIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHBhcnNpbmcgYW4gYXZwIHRhZy4gRW50cnkgaWdub3JlZC4iKTsgZ290byB4bWxfdHJlZV9lcnJvcjsgfSApCisJCQkJCisJCQkJZGF0YS0+c3RhdGUgPSBJTl9BVlA7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBPdGhlciB0YWdzIGFyZSBlcnJvcnMgKi8KKwkJCWdvdG8geG1sX3RyZWVfZXJyb3I7CisJCQorCQkJCisJCWNhc2UgSU5fQ09NTUFORDogCisJCQkvKiBXZSBhcmUgaW4gPGNvbW1hbmQ+CisJCQkJVmFsaWQgdGFncyBhcmU6IDxyZXF1ZXN0cnVsZXM+LCA8YW5zd2VycnVsZXM+ICovCisJCQlpZiAoIXN0cmNhc2VjbXAoKGNoYXIgKiluYW1lLCAicmVxdWVzdHJ1bGVzIikpIHsKKwkJCQlkYXRhLT5zdGF0ZSA9IElOX1JFUVJVTEVTOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCFzdHJjYXNlY21wKChjaGFyICopbmFtZSwgImFuc3dlcnJ1bGVzIikpIHsKKwkJCQlkYXRhLT5zdGF0ZSA9IElOX0FOU1JVTEVTOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogT3RoZXIgdGFncyBhcmUgZXJyb3JzICovCisJCQlnb3RvIHhtbF90cmVlX2Vycm9yOworCQkKKwkJY2FzZSBJTl9SRVFSVUxFUzogCisJCQkvKiBXZSBhcmUgaW4gPHJlcXVlc3RydWxlcz4KKwkJCQlWYWxpZCB0YWdzIGFyZTogPGZpeGVkPiwgPHJlcXVpcmVkPiwgPG9wdGlvbmFsPiAqLworCQkJaWYgKCFzdHJjYXNlY21wKChjaGFyICopbmFtZSwgImZpeGVkIikpIHsKKwkJCQlkYXRhLT5zdGF0ZSA9IElOX1JFUVJVTEVTX0ZJWEVEOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCFzdHJjYXNlY21wKChjaGFyICopbmFtZSwgInJlcXVpcmVkIikpIHsKKwkJCQlkYXRhLT5zdGF0ZSA9IElOX1JFUVJVTEVTX1JFUVVJUkVEOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCFzdHJjYXNlY21wKChjaGFyICopbmFtZSwgIm9wdGlvbmFsIikpIHsKKwkJCQlkYXRhLT5zdGF0ZSA9IElOX1JFUVJVTEVTX09QVElPTkFMOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogT3RoZXIgdGFncyBhcmUgZXJyb3JzICovCisJCQlnb3RvIHhtbF90cmVlX2Vycm9yOworCQkKKwkJY2FzZSBJTl9BTlNSVUxFUzogCisJCQkvKiBXZSBhcmUgaW4gPGFuc3dlcnJ1bGVzPgorCQkJCVZhbGlkIHRhZ3MgYXJlOiA8Zml4ZWQ+LCA8cmVxdWlyZWQ+LCA8b3B0aW9uYWw+ICovCisJCQlpZiAoIXN0cmNhc2VjbXAoKGNoYXIgKiluYW1lLCAiZml4ZWQiKSkgeworCQkJCWRhdGEtPnN0YXRlID0gSU5fQU5TUlVMRVNfRklYRUQ7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoIXN0cmNhc2VjbXAoKGNoYXIgKiluYW1lLCAicmVxdWlyZWQiKSkgeworCQkJCWRhdGEtPnN0YXRlID0gSU5fQU5TUlVMRVNfUkVRVUlSRUQ7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoIXN0cmNhc2VjbXAoKGNoYXIgKiluYW1lLCAib3B0aW9uYWwiKSkgeworCQkJCWRhdGEtPnN0YXRlID0gSU5fQU5TUlVMRVNfT1BUSU9OQUw7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBPdGhlciB0YWdzIGFyZSBlcnJvcnMgKi8KKwkJCWdvdG8geG1sX3RyZWVfZXJyb3I7CisJCQkKKwkJY2FzZSBJTl9SRVFSVUxFU19GSVhFRDoKKwkJCS8qIFdlIGFyZSBpbiA8Y29tbWFuZD48YW5zd2VycnVsZXM+PGZpeGVkPgorCQkJCVZhbGlkIHRhZ3MgYXJlOiA8YXZwcnVsZT4gKi8KKwkJCUFERF9SVUxFKCAmZGF0YS0+Y3VyX2NtZC0+cmVxcnVsZXNfZml4ZWQgKTsKKwkJCWJyZWFrOworCQljYXNlIElOX1JFUVJVTEVTX1JFUVVJUkVEOgorCQkJQUREX1JVTEUoICZkYXRhLT5jdXJfY21kLT5yZXFydWxlc19yZXF1aXJlZCApOworCQkJYnJlYWs7CisJCWNhc2UgSU5fUkVRUlVMRVNfT1BUSU9OQUw6CisJCQlBRERfUlVMRSggJmRhdGEtPmN1cl9jbWQtPnJlcXJ1bGVzX29wdGlvbmFsICk7CisJCQlicmVhazsKKwkJY2FzZSBJTl9BTlNSVUxFU19GSVhFRDoKKwkJCUFERF9SVUxFKCAmZGF0YS0+Y3VyX2NtZC0+YW5zcnVsZXNfZml4ZWQgKTsKKwkJCWJyZWFrOworCQljYXNlIElOX0FOU1JVTEVTX1JFUVVJUkVEOgorCQkJQUREX1JVTEUoICZkYXRhLT5jdXJfY21kLT5hbnNydWxlc19yZXF1aXJlZCApOworCQkJYnJlYWs7CisJCWNhc2UgSU5fQU5TUlVMRVNfT1BUSU9OQUw6CisJCQlBRERfUlVMRSggJmRhdGEtPmN1cl9jbWQtPmFuc3J1bGVzX29wdGlvbmFsICk7CisJCQlicmVhazsKKwkJCQorCQkKKwkJY2FzZSBJTl9UWVBFREVGTjogLyogbm90aGluZyBpcyBhbGxvd2VkIGluc2lkZSA8dHlwZWRlZm4+ICovCisJCQlnb3RvIHhtbF90cmVlX2Vycm9yOworCQkJCQorCQkKKwkJY2FzZSBJTl9BVlA6IAorCQkJLyogV2UgYXJlIGluIDxhdnA+CisJCQkJVmFsaWQgdGFncyBhcmU6IDx0eXBlPiwgPGVudW0+LCA8Z3JvdXBlZD4gKi8KKwkJCWlmICghc3RyY2FzZWNtcCgoY2hhciAqKW5hbWUsICJ0eXBlIikpIHsKKwkJCQl4bWxDaGFyICp4bmFtZTsKKwkJCQkKKwkJCQlnZXRfYXR0cihhdHRzLCAidHlwZS1uYW1lIiwgJnhuYW1lKTsKKwkJCQkKKwkJCQkvKiBuYW1lIGlzIHJlcXVpcmVkICovCisJCQkJQ0hFQ0tfUEFSQU1TX0RPKHhuYW1lLCAKKwkJCQkJeyBUUkFDRV9ERUJVRyhJTkZPLCAiSW52YWxpZCAndHlwZScgdGFnIGZvdW5kIHdpdGhvdXQgJ25hbWUnIGF0dHJpYnV0ZS4iKTsgZ290byB4bWxfdHJlZV9lcnJvcjsgfSApOworCQkJCQorCQkJCS8qIENoZWNrIHRoZXJlIGlzIG9ubHkgMSB0eXBlICovCisJCQkJaWYgKCFGRF9JU19MSVNUX0VNUFRZKCZkYXRhLT5jdXJfYXZwLT50eXBlKSkgeworCQkJCQlUUkFDRV9ERUJVRyhJTkZPLCAiTXVsdGlwbGUgJ3R5cGUnIHRhZ3MgZm91bmQgZm9yIEFWUC4iKTsKKwkJCQkJZ290byB4bWxfdHJlZV9lcnJvcjsKKwkJCQl9CisJCQkJCisJCQkJLyogQWRkIHRoZSBuZXcgdHlwZSAqLworCQkJCUNIRUNLX0ZDVF9ETyggbmV3X2F2cHR5cGUoJmRhdGEtPmN1cl9hdnAtPnR5cGUsIHhuYW1lKSwKKwkJCQkJeyBUUkFDRV9ERUJVRyhJTkZPLCAiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcGFyc2luZyBhIHR5cGUgdGFnLiBFbnRyeSBpZ25vcmVkLiIpOyBnb3RvIHhtbF90cmVlX2Vycm9yOyB9ICkKKwkJCQkKKwkJCQlkYXRhLT5zdGF0ZSA9IElOX0FWUF9UWVBFOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCFzdHJjYXNlY21wKChjaGFyICopbmFtZSwgImVudW0iKSkgeworCQkJCXhtbENoYXIgKnhjb2RlLCAqeG5hbWU7CisJCQkJCisJCQkJZ2V0X2F0dHIoYXR0cywgImNvZGUiLCAmeGNvZGUpOworCQkJCWdldF9hdHRyKGF0dHMsICJuYW1lIiwgJnhuYW1lKTsKKwkJCQkKKwkJCQkvKiBjb2RlIGFuZCBuYW1lIGFyZSByZXF1aXJlZCAqLworCQkJCUNIRUNLX1BBUkFNU19ETyh4Y29kZSAmJiB4bmFtZSwgCisJCQkJCXsgVFJBQ0VfREVCVUcoSU5GTywgIkludmFsaWQgJ2VudW0nIHRhZyBmb3VuZCB3aXRob3V0ICdjb2RlJyBvciAnbmFtZScgYXR0cmlidXRlLiIpOyBnb3RvIHhtbF90cmVlX2Vycm9yOyB9ICk7CisJCQkJCisJCQkJQ0hFQ0tfRkNUX0RPKCBuZXdfZW51bSgmZGF0YS0+Y3VyX2F2cC0+ZW51bXMsIHhjb2RlLCB4bmFtZSksCisJCQkJCXsgVFJBQ0VfREVCVUcoSU5GTywgIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHBhcnNpbmcgYSBjb21tYW5kIHRhZy4gRW50cnkgaWdub3JlZC4iKTsgZ290byB4bWxfdHJlZV9lcnJvcjsgfSApCisJCQkKKwkJCQlkYXRhLT5zdGF0ZSA9IElOX0FWUF9FTlVNOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCFzdHJjYXNlY21wKChjaGFyICopbmFtZSwgImdyb3VwZWQiKSkgeworCQkJCS8qIG5vIGF0dHJpYnV0ZSBmb3IgdGhpcyBvbmUgKi8KKwkJCQlkYXRhLT5zdGF0ZSA9IElOX0FWUF9HUk9VUEVEOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogT3RoZXIgdGFncyBhcmUgZXJyb3JzICovCisJCQlnb3RvIHhtbF90cmVlX2Vycm9yOworCQkKKwkJY2FzZSBJTl9BVlBfVFlQRTogLyogbm90aGluZyBpcyBhbGxvd2VkIGluc2lkZSA8dHlwZT4gKi8KKwkJCWdvdG8geG1sX3RyZWVfZXJyb3I7CisJCQkKKwkJY2FzZSBJTl9BVlBfRU5VTTogLyogbm90aGluZyBpcyBhbGxvd2VkIGluc2lkZSA8ZW51bT4gKi8KKwkJCWdvdG8geG1sX3RyZWVfZXJyb3I7CisJCQkKKwkJY2FzZSBJTl9BVlBfR1JPVVBFRDogCisJCQkvKiBXZSBhcmUgaW4gPGF2cD48Z3JvdXBlZD4KKwkJCQlWYWxpZCB0YWdzIGFyZTogPGZpeGVkPiwgPHJlcXVpcmVkPiwgPG9wdGlvbmFsPiAqLworCQkJaWYgKCFzdHJjYXNlY21wKChjaGFyICopbmFtZSwgImZpeGVkIikpIHsKKwkJCQlkYXRhLT5zdGF0ZSA9IElOX0FWUF9HUk9VUEVEX0ZJWEVEOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCFzdHJjYXNlY21wKChjaGFyICopbmFtZSwgInJlcXVpcmVkIikpIHsKKwkJCQlkYXRhLT5zdGF0ZSA9IElOX0FWUF9HUk9VUEVEX1JFUVVJUkVEOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCFzdHJjYXNlY21wKChjaGFyICopbmFtZSwgIm9wdGlvbmFsIikpIHsKKwkJCQlkYXRhLT5zdGF0ZSA9IElOX0FWUF9HUk9VUEVEX09QVElPTkFMOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogT3RoZXIgdGFncyBhcmUgZXJyb3JzICovCisJCQlnb3RvIHhtbF90cmVlX2Vycm9yOworCQkJCisJCWNhc2UgSU5fQVZQX0dST1VQRURfRklYRUQ6CisJCQkvKiBXZSBhcmUgaW4gPGF2cD48Z3JvdXBlZD48Zml4ZWQ+CisJCQkJVmFsaWQgdGFncyBhcmU6IDxhdnBydWxlPiAqLworCQkJQUREX1JVTEUoICZkYXRhLT5jdXJfYXZwLT5ncm91cGVkX2ZpeGVkICk7CisJCQlicmVhazsKKwkJY2FzZSBJTl9BVlBfR1JPVVBFRF9SRVFVSVJFRDoKKwkJCUFERF9SVUxFKCAmZGF0YS0+Y3VyX2F2cC0+Z3JvdXBlZF9yZXF1aXJlZCApOworCQkJYnJlYWs7CisJCWNhc2UgSU5fQVZQX0dST1VQRURfT1BUSU9OQUw6CisJCQlBRERfUlVMRSggJmRhdGEtPmN1cl9hdnAtPmdyb3VwZWRfb3B0aW9uYWwgKTsKKwkJCWJyZWFrOworCQkKKwkJCQorCQlkZWZhdWx0OgorCQkJVFJBQ0VfREVCVUcoSU5GTywgIkludGVybmFsIHBhcnNpbmcgZXJyb3IsIHVuZXhwZWN0ZWQgc3RhdGUgJWQuIiwgZGF0YS0+c3RhdGUpOworCX0KKwkKKwlyZXR1cm47CisJCit4bWxfdHJlZV9lcnJvcjoKKwlpZiAoIWRhdGEtPmVycm9yX2RlcHRoKSB7CisJCVRSQUNFX0RFQlVHKElORk8sICJVbmV4cGVjdGVkIFhNTCBlbGVtZW50IGZvdW5kOiAnJXMnLiBJZ25vcmluZy4uLiIsIG5hbWUpOworCX0KKwlkYXRhLT5lcnJvcl9kZXB0aCArPSAxOworCWlmIChkYXRhLT5jdXJfYXBwIHx8IGRhdGEtPmN1cl9jbWQgfHwgZGF0YS0+Y3VyX2F2cCkgeworCQlUUkFDRV9ERUJVRyhJTkZPLCAiRXJyb3IgZW5jb3VudGVyZWQgd2hpbGUgcGFyc2luZyB0YWcgb2Y6Iik7CisJCWlmIChkYXRhLT5jdXJfYXBwKQorCQkJZmRfbG9nX2RlYnVnKCIgIEFwcGxpY2F0aW9uOiAnJXMnIiwgZGF0YS0+Y3VyX2FwcC0+bmFtZSk7CisJCWlmIChkYXRhLT5jdXJfY21kKQorCQkJZmRfbG9nX2RlYnVnKCIgIENvbW1hbmQgICAgOiAnJXMnIiwgZGF0YS0+Y3VyX2NtZC0+bmFtZSk7CisJCWlmIChkYXRhLT5jdXJfYXZwKQorCQkJZmRfbG9nX2RlYnVnKCIgIEFWUCAgICAgICAgOiAnJXMnIiwgZGF0YS0+Y3VyX2F2cC0+bmFtZSk7CisJfQorCXJldHVybjsKK30KKworLyogVGhlIGZ1bmN0aW9uIGNhbGxlZCBvbiBlYWNoIFhNTCBlbGVtZW50IGVuZCB0YWcgKGVuZEVsZW1lbnRTQVhGdW5jKSAqLworc3RhdGljIHZvaWQgU0FYZW5kZWxlbSAodm9pZCAqIGN0eCwgY29uc3QgeG1sQ2hhciAqIG5hbWUpCit7CisJc3RydWN0IHBhcnNlcl9jdHggKiBkYXRhID0gY3R4OworCVRSQUNFX0VOVFJZKCIlcCAlcCIsIGN0eCwgbmFtZSk7CisJQ0hFQ0tfUEFSQU1TX0RPKCBjdHggJiYgbmFtZSwgeyByZXR1cm47IH0gKTsKKwkKKwlUUkFDRV9ERUJVRyhDQUxMLCAiVGFnOiA8LyVzPiIsIChjaGFyICopbmFtZSk7CisJCisJaWYgKGRhdGEtPmVycm9yX2RlcHRoKSB7CisJCS8qIHdlIGFyZSByZWNvdmVyaW5nIGZyb20gYW4gZXJyb25lb3VzIGVsZW1lbnQgKi8KKwkJZGF0YS0+ZXJyb3JfZGVwdGggLT0gMTsKKwkJcmV0dXJuOworCX0KKwkKKwlzd2l0Y2ggKGRhdGEtPnN0YXRlKSB7CisJCWNhc2UgSU5JVDogCisJCQlnb3RvIHN0YXRlX21hY2hpbmVfZXJyb3I7CisJCQkKKwkJY2FzZSBTVEFSVDoKKwkJCWlmIChzdHJjYXNlY21wKChjaGFyICopbmFtZSwgImRpY3Rpb25hcnkiKSkKKwkJCQlnb3RvIHN0YXRlX21hY2hpbmVfZXJyb3I7CisJCQkKKwkJCWRhdGEtPnN0YXRlID0gMDsKKwkJCWJyZWFrOworCQkKKwkJY2FzZSBJTl9WRU5ET1I6CisJCQlpZiAoc3RyY2FzZWNtcCgoY2hhciAqKW5hbWUsICJ2ZW5kb3IiKSkKKwkJCQlnb3RvIHN0YXRlX21hY2hpbmVfZXJyb3I7CisJCQkKKwkJCWRhdGEtPnN0YXRlID0gU1RBUlQ7CisJCQlicmVhazsKKwkJCisJCWNhc2UgSU5fQVBQTElDQVRJT046CisJCQlpZiAoc3RyY2FzZWNtcCgoY2hhciAqKW5hbWUsICJiYXNlIikgJiYgc3RyY2FzZWNtcCgoY2hhciAqKW5hbWUsICJhcHBsaWNhdGlvbiIpKQorCQkJCWdvdG8gc3RhdGVfbWFjaGluZV9lcnJvcjsKKwkJCQorCQkJZGF0YS0+Y3VyX2FwcCA9IE5VTEw7CisJCQlkYXRhLT5zdGF0ZSA9IFNUQVJUOworCQkJYnJlYWs7CisJCQorCQljYXNlIElOX0NPTU1BTkQ6CisJCQlpZiAoc3RyY2FzZWNtcCgoY2hhciAqKW5hbWUsICJjb21tYW5kIikpCisJCQkJZ290byBzdGF0ZV9tYWNoaW5lX2Vycm9yOworCQkJCisJCQlkYXRhLT5jdXJfY21kID0gTlVMTDsKKwkJCWRhdGEtPnN0YXRlID0gSU5fQVBQTElDQVRJT047CisJCQlicmVhazsKKwkJCQorCQljYXNlIElOX1JFUVJVTEVTOgorCQkJaWYgKHN0cmNhc2VjbXAoKGNoYXIgKiluYW1lLCAicmVxdWVzdHJ1bGVzIikpCisJCQkJZ290byBzdGF0ZV9tYWNoaW5lX2Vycm9yOworCQkJCisJCQlkYXRhLT5zdGF0ZSA9IElOX0NPTU1BTkQ7CisJCQlicmVhazsKKwkJCisJCWNhc2UgSU5fUkVRUlVMRVNfRklYRUQ6CisJCQlpZiAoIXN0cmNhc2VjbXAoKGNoYXIgKiluYW1lLCAiYXZwcnVsZSIpKQorCQkJCS8qIHdlIGRvbid0IGhhdmUgYSBzcGVjaWFsIHN0YXRlIGZvciB0aGVzZSwganVzdCBpZ25vcmUgKi8KKwkJCQlyZXR1cm47CisJCQlpZiAoc3RyY2FzZWNtcCgoY2hhciAqKW5hbWUsICJmaXhlZCIpKQorCQkJCWdvdG8gc3RhdGVfbWFjaGluZV9lcnJvcjsKKwkJCWRhdGEtPnN0YXRlID0gSU5fUkVRUlVMRVM7CisJCQlicmVhazsKKwkJY2FzZSBJTl9SRVFSVUxFU19SRVFVSVJFRDoKKwkJCWlmICghc3RyY2FzZWNtcCgoY2hhciAqKW5hbWUsICJhdnBydWxlIikpCisJCQkJLyogd2UgZG9uJ3QgaGF2ZSBhIHNwZWNpYWwgc3RhdGUgZm9yIHRoZXNlLCBqdXN0IGlnbm9yZSAqLworCQkJCXJldHVybjsKKwkJCWlmIChzdHJjYXNlY21wKChjaGFyICopbmFtZSwgInJlcXVpcmVkIikpCisJCQkJZ290byBzdGF0ZV9tYWNoaW5lX2Vycm9yOworCQkJZGF0YS0+c3RhdGUgPSBJTl9SRVFSVUxFUzsKKwkJCWJyZWFrOworCQljYXNlIElOX1JFUVJVTEVTX09QVElPTkFMOgorCQkJaWYgKCFzdHJjYXNlY21wKChjaGFyICopbmFtZSwgImF2cHJ1bGUiKSkKKwkJCQkvKiB3ZSBkb24ndCBoYXZlIGEgc3BlY2lhbCBzdGF0ZSBmb3IgdGhlc2UsIGp1c3QgaWdub3JlICovCisJCQkJcmV0dXJuOworCQkJaWYgKHN0cmNhc2VjbXAoKGNoYXIgKiluYW1lLCAib3B0aW9uYWwiKSkKKwkJCQlnb3RvIHN0YXRlX21hY2hpbmVfZXJyb3I7CisJCQlkYXRhLT5zdGF0ZSA9IElOX1JFUVJVTEVTOworCQkJYnJlYWs7CisJCQkKKwkJY2FzZSBJTl9BTlNSVUxFUzogCisJCQlpZiAoc3RyY2FzZWNtcCgoY2hhciAqKW5hbWUsICJhbnN3ZXJydWxlcyIpKQorCQkJCWdvdG8gc3RhdGVfbWFjaGluZV9lcnJvcjsKKwkJCQorCQkJZGF0YS0+c3RhdGUgPSBJTl9DT01NQU5EOworCQkJYnJlYWs7CQkJCisJCWNhc2UgSU5fQU5TUlVMRVNfRklYRUQ6CisJCQlpZiAoIXN0cmNhc2VjbXAoKGNoYXIgKiluYW1lLCAiYXZwcnVsZSIpKQorCQkJCS8qIHdlIGRvbid0IGhhdmUgYSBzcGVjaWFsIHN0YXRlIGZvciB0aGVzZSwganVzdCBpZ25vcmUgKi8KKwkJCQlyZXR1cm47CisJCQlpZiAoc3RyY2FzZWNtcCgoY2hhciAqKW5hbWUsICJmaXhlZCIpKQorCQkJCWdvdG8gc3RhdGVfbWFjaGluZV9lcnJvcjsKKwkJCWRhdGEtPnN0YXRlID0gSU5fQU5TUlVMRVM7CisJCQlicmVhazsKKwkJY2FzZSBJTl9BTlNSVUxFU19SRVFVSVJFRDoKKwkJCWlmICghc3RyY2FzZWNtcCgoY2hhciAqKW5hbWUsICJhdnBydWxlIikpCisJCQkJLyogd2UgZG9uJ3QgaGF2ZSBhIHNwZWNpYWwgc3RhdGUgZm9yIHRoZXNlLCBqdXN0IGlnbm9yZSAqLworCQkJCXJldHVybjsKKwkJCWlmIChzdHJjYXNlY21wKChjaGFyICopbmFtZSwgInJlcXVpcmVkIikpCisJCQkJZ290byBzdGF0ZV9tYWNoaW5lX2Vycm9yOworCQkJZGF0YS0+c3RhdGUgPSBJTl9BTlNSVUxFUzsKKwkJCWJyZWFrOworCQljYXNlIElOX0FOU1JVTEVTX09QVElPTkFMOgorCQkJaWYgKCFzdHJjYXNlY21wKChjaGFyICopbmFtZSwgImF2cHJ1bGUiKSkKKwkJCQkvKiB3ZSBkb24ndCBoYXZlIGEgc3BlY2lhbCBzdGF0ZSBmb3IgdGhlc2UsIGp1c3QgaWdub3JlICovCisJCQkJcmV0dXJuOworCQkJaWYgKHN0cmNhc2VjbXAoKGNoYXIgKiluYW1lLCAib3B0aW9uYWwiKSkKKwkJCQlnb3RvIHN0YXRlX21hY2hpbmVfZXJyb3I7CisJCQlkYXRhLT5zdGF0ZSA9IElOX0FOU1JVTEVTOworCQkJYnJlYWs7CisJCQorCQkKKwkJY2FzZSBJTl9UWVBFREVGTjoKKwkJCWlmIChzdHJjYXNlY21wKChjaGFyICopbmFtZSwgInR5cGVkZWZuIikpCisJCQkJZ290byBzdGF0ZV9tYWNoaW5lX2Vycm9yOworCQkJCisJCQlkYXRhLT5zdGF0ZSA9IElOX0FQUExJQ0FUSU9OOworCQkJYnJlYWs7CisJCQorCQljYXNlIElOX0FWUDogCisJCQlpZiAoc3RyY2FzZWNtcCgoY2hhciAqKW5hbWUsICJhdnAiKSkKKwkJCQlnb3RvIHN0YXRlX21hY2hpbmVfZXJyb3I7CisJCQkKKwkJCWRhdGEtPmN1cl9hdnAgPSBOVUxMOworCQkJZGF0YS0+c3RhdGUgPSBJTl9BUFBMSUNBVElPTjsKKwkJCWJyZWFrOworCQkKKwkJY2FzZSBJTl9BVlBfVFlQRToKKwkJCWlmIChzdHJjYXNlY21wKChjaGFyICopbmFtZSwgInR5cGUiKSkKKwkJCQlnb3RvIHN0YXRlX21hY2hpbmVfZXJyb3I7CisJCQkKKwkJCWRhdGEtPnN0YXRlID0gSU5fQVZQOworCQkJYnJlYWs7CisJCQorCQljYXNlIElOX0FWUF9FTlVNOgorCQkJaWYgKHN0cmNhc2VjbXAoKGNoYXIgKiluYW1lLCAiZW51bSIpKQorCQkJCWdvdG8gc3RhdGVfbWFjaGluZV9lcnJvcjsKKwkJCQorCQkJZGF0YS0+c3RhdGUgPSBJTl9BVlA7CisJCQlicmVhazsKKwkJCisJCWNhc2UgSU5fQVZQX0dST1VQRUQ6CisJCQlpZiAoc3RyY2FzZWNtcCgoY2hhciAqKW5hbWUsICJncm91cGVkIikpCisJCQkJZ290byBzdGF0ZV9tYWNoaW5lX2Vycm9yOworCQkJCisJCQlkYXRhLT5zdGF0ZSA9IElOX0FWUDsKKwkJCWJyZWFrOworCQkKKwkJY2FzZSBJTl9BVlBfR1JPVVBFRF9GSVhFRDoKKwkJCWlmICghc3RyY2FzZWNtcCgoY2hhciAqKW5hbWUsICJhdnBydWxlIikpCisJCQkJLyogd2UgZG9uJ3QgaGF2ZSBhIHNwZWNpYWwgc3RhdGUgZm9yIHRoZXNlLCBqdXN0IGlnbm9yZSAqLworCQkJCXJldHVybjsKKwkJCWlmIChzdHJjYXNlY21wKChjaGFyICopbmFtZSwgImZpeGVkIikpCisJCQkJZ290byBzdGF0ZV9tYWNoaW5lX2Vycm9yOworCQkJZGF0YS0+c3RhdGUgPSBJTl9BVlBfR1JPVVBFRDsKKwkJCWJyZWFrOworCQljYXNlIElOX0FWUF9HUk9VUEVEX1JFUVVJUkVEOgorCQkJaWYgKCFzdHJjYXNlY21wKChjaGFyICopbmFtZSwgImF2cHJ1bGUiKSkKKwkJCQlyZXR1cm47CisJCQlpZiAoc3RyY2FzZWNtcCgoY2hhciAqKW5hbWUsICJyZXF1aXJlZCIpKQorCQkJCWdvdG8gc3RhdGVfbWFjaGluZV9lcnJvcjsKKwkJCWRhdGEtPnN0YXRlID0gSU5fQVZQX0dST1VQRUQ7CisJCQlicmVhazsKKwkJY2FzZSBJTl9BVlBfR1JPVVBFRF9PUFRJT05BTDoKKwkJCWlmICghc3RyY2FzZWNtcCgoY2hhciAqKW5hbWUsICJhdnBydWxlIikpCisJCQkJcmV0dXJuOworCQkJaWYgKHN0cmNhc2VjbXAoKGNoYXIgKiluYW1lLCAib3B0aW9uYWwiKSkKKwkJCQlnb3RvIHN0YXRlX21hY2hpbmVfZXJyb3I7CisJCQlkYXRhLT5zdGF0ZSA9IElOX0FWUF9HUk9VUEVEOworCQkJYnJlYWs7CisJCQkKKwkJZGVmYXVsdDoKKwkJCVRSQUNFX0RFQlVHKElORk8sICJJbnRlcm5hbCBwYXJzaW5nIGVycm9yLCB1bmV4cGVjdGVkIHN0YXRlICVkLiIsIGRhdGEtPnN0YXRlKTsKKwl9CisJCisJcmV0dXJuOworCQorc3RhdGVfbWFjaGluZV9lcnJvcjoKKwlUUkFDRV9ERUJVRyhJTkZPLCAiSW50ZXJuYWwgcGFyc2luZyBlcnJvciwgaWdub3JlZCBbc3RhdGUgJWQsIGNsb3NpbmcgdGFnICclcyddLiIsIGRhdGEtPnN0YXRlLCBuYW1lKTsKKwlyZXR1cm47Cit9CisKKy8qIFRoZSBTQVggcGFyc2VyIHNlbmRzIGEgd2FybmluZywgZXJyb3IsIGZhdGFsZXJyb3IgLS0gZG8gd2UgbmVlZCB0aGVzZSA/CitzdGF0aWMgdm9pZCBTQVh3YXJuaW5nICh2b2lkICogY3R4LCBjb25zdCBjaGFyICogbXNnLCAuLi4pCit7CisKK30KK3N0YXRpYyB2b2lkIFNBWGVycm9yICh2b2lkICogY3R4LCBjb25zdCBjaGFyICogbXNnLCAuLi4pCit7CisKK30KK3N0YXRpYyB2b2lkIFNBWGZhdGFsICh2b2lkICogY3R4LCBjb25zdCBjaGFyICogbXNnLCAuLi4pCit7CisKK30KKyovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgLyogMm5kIHBhc3M6IGZyb20gbWVtb3J5IHRvIGZEIGRpY3Rpb25hcnkgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEZpbmQgb3IgY3JlYXRlIGEgdmVuZG9yICovCitzdGF0aWMgaW50IHZlbmRfdG9fZkQoc3RydWN0IHRfdmVuZCAqIHYsIHN0cnVjdCBkaWN0aW9uYXJ5ICogZkRfZGljdCwgc3RydWN0IGRpY3Rfb2JqZWN0ICoqIGZkX3YsIGludCAqIG5iX2FkZGVkKQoreworCWludCByZXQ7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogcHJldiA9IE5VTEw7CisJc3RydWN0IGRpY3RfdmVuZG9yX2RhdGEgdmQ7CisKKwlUUkFDRV9FTlRSWSgiJXAgJXAgJXAgJXAiLCB2LCBmRF9kaWN0LCBmZF92LCBuYl9hZGRlZCk7CisJCisJQ0hFQ0tfUEFSQU1TKHYgJiYgZkRfZGljdCk7CisJCisJLyogUHJlcGFyZSB0aGUgZGF0YSBpbiBmRCdzIGZvcm1hdCAqLworCW1lbXNldCgmdmQsIDAsIHNpemVvZih2ZCkpOworCXZkLnZlbmRvcl9pZCAgID0gdi0+aWQ7CisJdmQudmVuZG9yX25hbWUgPSAoY2hhciAqKXYtPm5hbWU7CisJCisJLyogQ3JlYXRlIG9yIHNlYXJjaCBpbiB0aGUgZGljdGlvbmFyeSAqLworCXJldCA9IGZkX2RpY3RfbmV3ICggZkRfZGljdCwgRElDVF9WRU5ET1IsICZ2ZCwgTlVMTCwgJnByZXYgKTsKKwlpZiAoZmRfdikKKwkJKmZkX3YgPSBwcmV2OworCWlmIChyZXQgPT0gRUVYSVNUKSB7CisJCS8qIENvbmZsaWN0IHdpdGggZXhpc3RpbmcgZW50cnkgKi8KKwkJQ0hFQ0tfRkNUKCBmZF9kaWN0X2dldHZhbChwcmV2LCAmdmQpICk7CisJCVRSQUNFX0RFQlVHKElORk8sICJbZGljdF9sZWdhY3lfeG1sXSBXYXJuaW5nOiBDb25mbGljdGluZyBlbnRyeS4iKTsKKwkJVFJBQ0VfREVCVUcoSU5GTywgIltkaWN0X2xlZ2FjeV94bWxdICAgTmV3IGVudHJ5IChpZ25vcmVkKTogJXUgLSAnJXMnIiwgdi0+aWQsIChjaGFyICopdi0+bmFtZSk7CisJCVRSQUNFX0RFQlVHKElORk8sICJbZGljdF9sZWdhY3lfeG1sXSAgIE9sZCBlbnRyeSAgICAgICAgICA6ICV1IC0gJyVzJyIsIHZkLnZlbmRvcl9pZCwgdmQudmVuZG9yX25hbWUpOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQkvKiBvdGhlciBlcnJvcnMgYXJlIHN0b3BwZXJzICovCisJCUNIRUNLX0ZDVChyZXQpOworCX0KKwkKKwkvKiBVcGRhdGUgY291bnQgKi8KKwlpZiAobmJfYWRkZWQpCisJCSpuYl9hZGRlZCArPSAxOworCQorCS8qIERvbmUgKi8KKwlyZXR1cm4gMDsKK30KKworLyogRmluZCB0aGUgYmFzZSBmRCB0eXBlIGZyb20gYSB0eXBlIG5hbWUgKi8KK3N0YXRpYyBpbnQgcmVzb2x2ZV9iYXNlX3R5cGUoc3RydWN0IGRpY3Rpb25hcnkgKiBmRF9kaWN0LCB1aW50OF90ICogdHlwZV9uYW1lLCBlbnVtIGRpY3RfYXZwX2Jhc2V0eXBlICogYmFzZXR5cGUsIHN0cnVjdCBkaWN0X29iamVjdCAqKnR5cGUpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgdGQ7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICp0OworCQorCVRSQUNFX0VOVFJZKCIlcCwgJXAgJXAiLCBmRF9kaWN0LCB0eXBlX25hbWUsIGJhc2V0eXBlKTsKKwlDSEVDS19QQVJBTVMoIGZEX2RpY3QgJiYgdHlwZV9uYW1lICYmIGJhc2V0eXBlICk7CisJCisJLyogRmlyc3QsIGNoZWNrIGlmIHRoZSB0eXBlIGlzIGFscmVhZHkgaW4gdGhlIGRpY3Rpb25hcnkgKi8KKwlyZXQgPSBmZF9kaWN0X3NlYXJjaCAoIGZEX2RpY3QsIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCB0eXBlX25hbWUsICZ0LCBFTk9FTlQpOworCXN3aXRjaCAocmV0KSB7CisJCWNhc2UgMDogLyogdGhlIHR5cGUgaXMgYWxyZWFkeSBpbiB0aGUgZGljdGlvbmFyeSAqLworCQkJQ0hFQ0tfRkNUKCBmZF9kaWN0X2dldHZhbCh0LCAmdGQpICk7CisJCQkqYmFzZXR5cGUgPSB0ZC50eXBlX2Jhc2U7CisJCQlpZiAodHlwZSkKKwkJCQkqdHlwZSA9IHQ7CisJCQlyZXR1cm4gMDsKKwkJCisJCWNhc2UgRU5PRU5UOiAvKiBXZSBkaWQgbm90IGZpbmQgaXQsIGl0IGlzIG1heWJlIG5vcm1hbCAqLworCQkJYnJlYWs7CisJCQkKKwkJZGVmYXVsdDoKKwkJCS8qIEFuIHVuZXhwZWN0ZWQgZXJyb3Igb2NjdXJyZWQgKi8KKwkJCUNIRUNLX0ZDVChyZXQpOworCX0KKwkKKwkvKiBhdCB0aGlzIHBvaW50IHdlIGRpZCBub3QgZmluZCB0aGUgdHlwZSBpbiB0aGUgZGljdGlvbmFyeSAqLworI2RlZmluZSBQUkVERUZfVFlQRVMoIF90eXBlbmFtZV8sIF9iYXNldHlwZV8gKQkJCVwKKwlpZiAoIXN0cmNhc2VjbXAoKGNoYXIgKil0eXBlX25hbWUsIChfdHlwZW5hbWVfKSkpIHsJXAorCQkqYmFzZXR5cGUgPSAoX2Jhc2V0eXBlXyk7CQkJXAorCQlyZXR1cm4gMDsJCQkJCVwKKwl9CisJCisJUFJFREVGX1RZUEVTKCAiT2N0ZXRTdHJpbmciLCBBVlBfVFlQRV9PQ1RFVFNUUklORyApOworCVBSRURFRl9UWVBFUyggIkludGVnZXIzMiIsICAgQVZQX1RZUEVfSU5URUdFUjMyICAgKTsKKwlQUkVERUZfVFlQRVMoICJJbnRlZ2VyNjQiLCAgIEFWUF9UWVBFX0lOVEVHRVI2NCAgICk7CisJUFJFREVGX1RZUEVTKCAiVW5zaWduZWQzMiIsICBBVlBfVFlQRV9VTlNJR05FRDMyICApOworCVBSRURFRl9UWVBFUyggIkVudW1lcmF0ZWQiLCAgQVZQX1RZUEVfSU5URUdFUjMyICApOworCVBSRURFRl9UWVBFUyggIlVuc2lnbmVkNjQiLCAgQVZQX1RZUEVfVU5TSUdORUQ2NCAgKTsKKwlQUkVERUZfVFlQRVMoICJGbG9hdDMyIiwgICAgIEFWUF9UWVBFX0ZMT0FUMzIgICAgICk7CisJUFJFREVGX1RZUEVTKCAiRmxvYXQ2NCIsICAgICBBVlBfVFlQRV9GTE9BVDY0ICAgICApOworCQorCS8qIFdoZW4gd2UgcmVhY2ggdGhpcyBwb2ludCwgd2UgaGF2ZSBub3QgeWV0IGZvdW5kIHRoaXMgdHlwZSBhbnl3aGVyZS4gKi8KKwlUT0RPKCJUeXBlIG5vdCBmb3VuZC4gTWF5YmUgc2VhcmNoIGluIHdob2xlIHhtbGRpY3Rpb25hcnkgaWYgaXQgaXMgZGVmaW5lZCBsYXRlcj8iKTsKKwlUUkFDRV9ERUJVRyhJTkZPLCAiVGhlIHR5cGUgJyVzJyBjb3VsZCBub3QgYmUgcmVzb2x2ZWQuIFBsZWFzZSBjaGVjayBpdCBpcyBkZWZpbmVkIGJlZm9yZSB1c2UuIiwgdHlwZV9uYW1lKTsKKwlyZXR1cm4gRU5PRU5UOworfQorCisvKiBGaW5kIG9yIGNyZWF0ZSBhIHR5cGUuICovCitzdGF0aWMgaW50IHR5cGRlZm5fdG9fZkQoc3RydWN0IHRfdHlwZWRlZm4gKiB0LCBzdHJ1Y3QgZGljdGlvbmFyeSAqIGZEX2RpY3QsIHN0cnVjdCBkaWN0X29iamVjdCAqIGZkX2FwcGwsIHN0cnVjdCBkaWN0X29iamVjdCAqKiBmZF90LCBpbnQgKiBuYl9hZGRlZCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBkaWN0X29iamVjdCAqIHByZXYgPSBOVUxMOworCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSB0ZDsKKworCVRSQUNFX0VOVFJZKCIlcCAlcCAlcCAlcCAlcCIsIHQsIGZEX2RpY3QsIGZkX2FwcGwsIGZkX3QsIG5iX2FkZGVkKTsKKwkKKwlDSEVDS19QQVJBTVModCAmJiBmRF9kaWN0KTsKKwkKKwkvKiBQcmVwYXJlIHRoZSBkYXRhIGluIGZEJ3MgZm9ybWF0ICovCisJbWVtc2V0KCZ0ZCwgMCwgc2l6ZW9mKHRkKSk7CisJdGQudHlwZV9uYW1lID0gKGNoYXIgKil0LT5uYW1lOworCQorCS8qIGluZmVyIHRkLnR5cGVfYmFzZSBmcm9tIHQtPnBhcmVudF9uYW1lICovCisJQ0hFQ0tfRkNUKCByZXNvbHZlX2Jhc2VfdHlwZShmRF9kaWN0LCB0LT5wYXJlbnRfbmFtZSwgJnRkLnR5cGVfYmFzZSwgTlVMTCkgKTsKKwkKKwkvKiBDcmVhdGUgb3Igc2VhcmNoIGluIHRoZSBkaWN0aW9uYXJ5ICovCisJcmV0ID0gZmRfZGljdF9uZXcgKCBmRF9kaWN0LCBESUNUX1RZUEUsICZ0ZCwgZmRfYXBwbCwgJnByZXYgKTsKKwlpZiAoZmRfdCkKKwkJKmZkX3QgPSBwcmV2OworCWlmIChyZXQgPT0gRUVYSVNUKSB7CisJCS8qIENvbmZsaWN0IHdpdGggZXhpc3RpbmcgZW50cnkgKi8KKwkJZW51bSBkaWN0X2F2cF9iYXNldHlwZSB4bWxidCA9IHRkLnR5cGVfYmFzZTsKKwkJZXh0ZXJuIGNvbnN0IGNoYXIgKiB0eXBlX2Jhc2VfbmFtZVtdOyAvKiBpbiBsaWJmcmVlRGlhbWV0ZXIvZGljdGlvbmFyeS5jICovCisJCUNIRUNLX0ZDVCggZmRfZGljdF9nZXR2YWwocHJldiwgJnRkKSApOworCQlUUkFDRV9ERUJVRyhJTkZPLCAiW2RpY3RfbGVnYWN5X3htbF0gV2FybmluZzogQ29uZmxpY3RpbmcgZW50cnkuIik7CisJCVRSQUNFX0RFQlVHKElORk8sICJbZGljdF9sZWdhY3lfeG1sXSAgIE5ldyBlbnRyeSAoaWdub3JlZCk6ICclcycgKCVkIC0gJXMpIiwgdC0+bmFtZSwgeG1sYnQsIHR5cGVfYmFzZV9uYW1lW3htbGJ0XSApOworCQlUUkFDRV9ERUJVRyhJTkZPLCAiW2RpY3RfbGVnYWN5X3htbF0gICBPbGQgZW50cnkgICAgICAgICAgOiAnJXMnICglZCAtICVzKSIsIHRkLnR5cGVfbmFtZSwgdGQudHlwZV9iYXNlLCB0eXBlX2Jhc2VfbmFtZVt0ZC50eXBlX2Jhc2VdKTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJLyogb3RoZXIgZXJyb3JzIGFyZSBzdG9wcGVycyAqLworCQlDSEVDS19GQ1QocmV0KTsKKwl9CisJCisJLyogVXBkYXRlIGNvdW50ICovCisJaWYgKG5iX2FkZGVkKQorCQkqbmJfYWRkZWQgKz0gMTsKKwkKKwkvKiBEb25lICovCisJcmV0dXJuIDA7Cit9CisKKy8qIFByb2Nlc3Mgb25lIGxpc3Qgb2YgcnVsZXMgKi8KK3N0YXRpYyBpbnQgcnVsZXNfdG9fZkRfb25lbGlzdChzdHJ1Y3QgZGljdGlvbmFyeSAqIGZEX2RpY3QsIHN0cnVjdCBkaWN0X29iamVjdCAqIHBhcmVudCwgZW51bSBydWxlX3Bvc2l0aW9uIHBvc2l0aW9uLCBzdHJ1Y3QgZmRfbGlzdCAqIGxpc3QsIGludCAqIG5iX2FkZGVkKQoreworCXN0cnVjdCBkaWN0X3J1bGVfZGF0YSByZDsKKwlzdHJ1Y3QgZmRfbGlzdCAqIGxpOworCWludCBvcmRlciA9IDA7CisJaW50IHJldDsKKworCVRSQUNFX0VOVFJZKCIlcCAlcCAlZCAlcCAlcCIsIGZEX2RpY3QsIHBhcmVudCwgcG9zaXRpb24sIGxpc3QsIG5iX2FkZGVkKTsKKwkKKwlDSEVDS19QQVJBTVMoZkRfZGljdCAmJiBwYXJlbnQgJiYgcG9zaXRpb24gJiYgbGlzdCk7CisJCisJZm9yIChsaSA9IGxpc3QtPm5leHQ7IGxpICE9IGxpc3Q7IGxpID0gbGktPm5leHQpIHsKKwkJc3RydWN0IHRfcnVsZSAqIHIgPSAoc3RydWN0IHRfcnVsZSAqKWxpOworCQkKKwkJLyogVGhlIFtBVlBdIHJ1bGUgaW4gYWxsIEFCTkYgZGVmaW5pdGlvbnMgaXMgaW1wbGljaXQgaW4gZnJlZURpYW1ldGVyLCBza2lwIGl0ICovCisJCWlmICghc3RyY21wKChjaGFyICopci0+YXZwbmFtZSwgIkFWUCIpKQorCQkJY29udGludWU7CisJCQorCQkvKiBQcmVwYXJlIHJ1bGUgZGF0YSAqLworCQltZW1zZXQoJnJkLCAwLCBzaXplb2YocmQpKTsKKwkJcmQucnVsZV9wb3NpdGlvbiA9IHBvc2l0aW9uOworCQlyZC5ydWxlX29yZGVyID0gKytvcmRlcjsgLyogYWN0dWFsbHkgb25seSB1c2VkIGZvciBmaXhlZCBydWxlcywgYnV0IG5vIGhhcm0gZm9yIG90aGVycyAqLworCQlyZC5ydWxlX21pbiA9IHItPm1pbjsKKwkJcmQucnVsZV9tYXggPSByLT5tYXg7CisJCQorCQkvKiBSZXNvbHZlIHRoZSBBVlAgKi8KKwkJcmV0ID0gZmRfZGljdF9zZWFyY2goZkRfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FX0FMTF9WRU5ET1JTLCByLT5hdnBuYW1lLCAmcmQucnVsZV9hdnAsIEVOT0VOVCk7CisJCWlmIChyZXQgPT0gRU5PRU5UKSB7CisJCQlUUkFDRV9ERUJVRyhJTkZPLCAiW2RpY3RfbGVnYWN5X3htbF0gRXJyb3I6IEFWUCAnJXMnIHVzZWQgaW4gYSBydWxlIGJlZm9yZSBiZWluZyBkZWZpbmVkLiIsIHItPmF2cG5hbWUpOworCQl9CisJCUNIRUNLX0ZDVChyZXQpOworCQkKKwkJLyogTm93IGNyZWF0ZSB0aGUgbmV3IHJ1bGUgKi8KKwkJQ0hFQ0tfRkNUX0RPKCByZXQgPSBmZF9kaWN0X25ldyAoIGZEX2RpY3QsIERJQ1RfUlVMRSwgJnJkLCBwYXJlbnQsIE5VTEwgKSwKKwkJCXsgVFJBQ0VfREVCVUcoSU5GTywgIkVycm9yIGNyZWF0aW5nIHJ1bGUgZm9yIHN1Yi1BVlAgJyVzJyIsIHItPmF2cG5hbWUpOyByZXR1cm4gcmV0OyB9ICk7CisJCWlmIChuYl9hZGRlZCkKKwkJCSpuYl9hZGRlZCArPSAxOworCX0KKwkKKwlyZXR1cm4gMDsKK30KKworLyogUHJvY2VzcyBsaXN0cyBvZiBydWxlcyAqLworc3RhdGljIGludCBydWxlc190b19mRChzdHJ1Y3QgZGljdGlvbmFyeSAqIGZEX2RpY3QsIHN0cnVjdCBkaWN0X29iamVjdCAqIHBhcmVudCwgc3RydWN0IGZkX2xpc3QgKiBmaXhlZCwgc3RydWN0IGZkX2xpc3QgKiByZXF1aXJlZCwgc3RydWN0IGZkX2xpc3QgKiBvcHRpb25hbCwgaW50ICogbmJfYWRkZWQpCit7CisJaW50IHJldDsKKwkKKwlUUkFDRV9FTlRSWSgiJXAgJXAgJXAgJXAgJXAgJXAiLCBmRF9kaWN0LCBwYXJlbnQsIGZpeGVkLCByZXF1aXJlZCwgb3B0aW9uYWwsIG5iX2FkZGVkKTsKKwkKKwkvKiBQcm9jZXNzIHRoZSBydWxlcyAqLworCUNIRUNLX0ZDVF9ETyggcmV0ID0gcnVsZXNfdG9fZkRfb25lbGlzdChmRF9kaWN0LCBwYXJlbnQsIFJVTEVfRklYRURfSEVBRCwgZml4ZWQsIG5iX2FkZGVkKSwKKwkJeyBUUkFDRV9ERUJVRyhJTkZPLCAiRXJyb3IgcHJvY2Vzc2luZyBGSVhFRCBydWxlcyIpOyByZXR1cm4gcmV0OyB9ICk7CisJQ0hFQ0tfRkNUX0RPKCByZXQgPSBydWxlc190b19mRF9vbmVsaXN0KGZEX2RpY3QsIHBhcmVudCwgUlVMRV9SRVFVSVJFRCwgcmVxdWlyZWQsIG5iX2FkZGVkKSwKKwkJeyBUUkFDRV9ERUJVRyhJTkZPLCAiRXJyb3IgcHJvY2Vzc2luZyBSRVFVSVJFRCBydWxlcyIpOyByZXR1cm4gcmV0OyB9ICk7CisJQ0hFQ0tfRkNUX0RPKCByZXQgPSBydWxlc190b19mRF9vbmVsaXN0KGZEX2RpY3QsIHBhcmVudCwgUlVMRV9PUFRJT05BTCwgb3B0aW9uYWwsIG5iX2FkZGVkKSwKKwkJeyBUUkFDRV9ERUJVRyhJTkZPLCAiRXJyb3IgcHJvY2Vzc2luZyBPUFRJT05BTCBydWxlcyIpOyByZXR1cm4gcmV0OyB9ICk7CisJCisJcmV0dXJuIDA7Cit9CisKKy8qIEZpbmQgb3IgY3JlYXRlIGFuIEFWUCAoYW5kIGRlcGVuZGVudCBvYmplY3RzKSAqLworc3RhdGljIGludCBhdnBfdG9fZkQoc3RydWN0IHRfYXZwICogYSwgc3RydWN0IGRpY3Rpb25hcnkgKiBmRF9kaWN0LCBzdHJ1Y3QgZGljdF9vYmplY3QgKiBmZF9hcHBsLCBzdHJ1Y3QgZGljdF9vYmplY3QgKiogZmRfYSwgaW50ICogbmJfYWRkZWQpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBwcmV2ID0gTlVMTCwgKnR5cGUgPSBOVUxMOworCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGFkOworCXN0cnVjdCBmZF9saXN0ICogbGk7CisKKwlUUkFDRV9FTlRSWSgiJXAgJXAgJXAgJXAgJXAiLCBhLCBmRF9kaWN0LCBmZF9hcHBsLCBmZF9hLCBuYl9hZGRlZCk7CisJCisJQ0hFQ0tfUEFSQU1TKGEgJiYgZkRfZGljdCk7CisJCisJLyogUHJlcGFyZSB0aGUgZGF0YSBpbiBmRCdzIGZvcm1hdCAqLworCW1lbXNldCgmYWQsIDAsIHNpemVvZihhZCkpOworCWFkLmF2cF9jb2RlICAgPSBhLT5jb2RlOworCWFkLmF2cF92ZW5kb3IgPSBhLT52ZW5kb3I7CisJYWQuYXZwX25hbWUgICA9IChjaGFyICopYS0+bmFtZTsKKwlhZC5hdnBfZmxhZ19tYXNrID0gYS0+Zm1hc2sgfCBBVlBfRkxBR19WRU5ET1I7CisJYWQuYXZwX2ZsYWdfdmFsICA9IGEtPmZsYWdzOworCQorCWlmICghRkRfSVNfTElTVF9FTVBUWSgmYS0+dHlwZSkpIHsKKwkJLyogc3BlY2lhbCBleGNlcHRpb246IHdlIHVzZSBwZXItQVZQIGVudW1lcmF0ZWQgdHlwZXMgaW4gZkQgKi8KKwkJaWYgKCFzdHJjYXNlY21wKCJFbnVtZXJhdGVkIiwgKGNoYXIgKikoKHN0cnVjdCB0X2F2cHR5cGUgKilhLT50eXBlLm5leHQpLT50eXBlX25hbWUpKQorCQkJZ290byBlbnVtZXJhdGVkOworCQkvKiBMZXQncyBhbGxvdyAiSW50ZWdlcjMyIiBpbnN0ZWFkIG9mICJFbnVtZXJhdGVkIiBhbHNvLi4uICovCisJCWlmICgoIUZEX0lTX0xJU1RfRU1QVFkoJmEtPmVudW1zKSkgJiYgKCFzdHJjYXNlY21wKCJJbnRlZ2VyMzIiLCAoY2hhciAqKSgoc3RydWN0IHRfYXZwdHlwZSAqKWEtPnR5cGUubmV4dCktPnR5cGVfbmFtZSkpKQorCQkJZ290byBlbnVtZXJhdGVkOworCQkKKwkJLyogVGhlIHR5cGUgd2FzIGV4cGxpY2l0bHkgc3BlY2lmaWVkLCByZXNvbHZlIGl0ICovCisJCUNIRUNLX0ZDVCggcmVzb2x2ZV9iYXNlX3R5cGUoZkRfZGljdCwgKChzdHJ1Y3QgdF9hdnB0eXBlICopYS0+dHlwZS5uZXh0KS0+dHlwZV9uYW1lLCAmYWQuYXZwX2Jhc2V0eXBlLCAmdHlwZSkgKTsKKwl9IGVsc2UgeworCQkvKiBUaGUgdHlwZSB3YXMgbm90IHNwZWNpZmllZCwgdHJ5IHRvIGluZmVyIGl0IGZyb20gcHJvdmlkZWQgZGF0YSAqLworCQlpZiAoICAgICAgICFGRF9JU19MSVNUX0VNUFRZKCZhLT5ncm91cGVkX29wdGlvbmFsKQorCQkJfHwgIUZEX0lTX0xJU1RfRU1QVFkoJmEtPmdyb3VwZWRfcmVxdWlyZWQpCisJCQl8fCAhRkRfSVNfTElTVF9FTVBUWSgmYS0+Z3JvdXBlZF9maXhlZCkgKSB7CisJCQkvKiBUaGUgQVZQIGhhcyBydWxlcywgaXQgaXMgYSBncm91cGVkIEFWUCAqLworCQkJQ0hFQ0tfUEFSQU1TX0RPKCBGRF9JU19MSVNUX0VNUFRZKCZhLT5lbnVtcyksIAorCQkJCXsgVFJBQ0VfREVCVUcoSU5GTywgIkNvbmZsaWN0OiBUaGUgQVZQICclcycgaGFzIGJvdGggZW51bSB2YWx1ZXMgYW5kIHJ1bGVzLiIsIGFkLmF2cF9uYW1lKTsgcmV0dXJuIEVJTlZBTDsgfSApOworCQkJYWQuYXZwX2Jhc2V0eXBlID0gQVZQX1RZUEVfR1JPVVBFRDsKKwkJfSBlbHNlIHsKKwkJCS8qIEl0IHNob3VsZCBiZSBhbiBlbnVtZXJhdGVkIEFWUC4uLiAqLworCQkJaWYgKEZEX0lTX0xJU1RfRU1QVFkoJmEtPmVudW1zKSkgeworCQkJCVRSQUNFX0RFQlVHKElORk8sICJFcnJvcjogTWlzc2luZyB0eXBlIGluZm9ybWF0aW9uIGZvciBBVlAgJyVzJyIsIGFkLmF2cF9uYW1lKTsKKwkJCQlyZXR1cm4gRUlOVkFMOworCQkJfSBlbHNlIHsKKwkJCQkvKiBXZSBjcmVhdGUgYSBuZXcgdHlwZSB0byBob2xkIHRoZSBlbnVtZXJhdGVkIHZhbHVlcyAtLSBmRCBzcGVjaWZpY3MgKi8KKwkJCQljaGFyIHR5cGVuYW1lWzI1Nl07CisJCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhIAl0ZGF0YTsKKwkJCQkKK2VudW1lcmF0ZWQ6CisJCQkJc25wcmludGYodHlwZW5hbWUsIHNpemVvZih0eXBlbmFtZSksICJFbnVtZXJhdGVkKCVzKSIsIGFkLmF2cF9uYW1lKTsKKwkJCQltZW1zZXQoJnRkYXRhLCAwLCBzaXplb2YodGRhdGEpKTsKKwkJCQl0ZGF0YS50eXBlX2Jhc2UgPSBBVlBfVFlQRV9JTlRFR0VSMzI7CisJCQkJdGRhdGEudHlwZV9uYW1lID0gJnR5cGVuYW1lWzBdOworCQkJCUNIRUNLX0ZDVCggZmRfZGljdF9uZXcgKCBmRF9kaWN0LCBESUNUX1RZUEUsICZ0ZGF0YSwgZmRfYXBwbCwgJnR5cGUgKSApOworCQkJCWlmIChuYl9hZGRlZCkKKwkJCQkJKm5iX2FkZGVkICs9IDE7CisJCQkJCisJCQkJYWQuYXZwX2Jhc2V0eXBlID0gQVZQX1RZUEVfSU5URUdFUjMyOworCQkJfQorCQl9CisJfQorCQorCS8qIEF0IHRoaXMgcG9pbnQsIGFkLmF2cF9iYXNldHlwZSBpcyBkZWZpbmVkIGFuZCB0eXBlIG1pZ2h0IGFsc28gYmUgKi8KKwkKKwkvKiBDcmVhdGUgb3Igc2VhcmNoIGluIHRoZSBkaWN0aW9uYXJ5ICovCisJcmV0ID0gZmRfZGljdF9uZXcgKCBmRF9kaWN0LCBESUNUX0FWUCwgJmFkLCB0eXBlLCAmcHJldiApOworCWlmIChmZF9hKQorCQkqZmRfYSA9IHByZXY7CisJaWYgKHJldCA9PSBFRVhJU1QpIHsKKwkJLyogQ29uZmxpY3Qgd2l0aCBleGlzdGluZyBlbnRyeSAqLworCQlDSEVDS19GQ1QoIGZkX2RpY3RfZ2V0dmFsKHByZXYsICZhZCkgKTsKKwkJVFJBQ0VfREVCVUcoSU5GTywgIltkaWN0X2xlZ2FjeV94bWxdIFdhcm5pbmc6IENvbmZsaWN0aW5nIGVudHJ5LiIpOworCQlUUkFDRV9ERUJVRyhJTkZPLCAiW2RpY3RfbGVnYWN5X3htbF0gICBOZXcgZW50cnkgKGlnbm9yZWQpOiAldSAtICclcyciLCBhLT5jb2RlLCAoY2hhciAqKWEtPm5hbWUpOworCQlUUkFDRV9ERUJVRyhJTkZPLCAiW2RpY3RfbGVnYWN5X3htbF0gICBPbGQgZW50cnkgICAgICAgICAgOiAldSAtICclcyciLCBhZC5hdnBfY29kZSwgYWQuYXZwX25hbWUpOworCQlnb3RvIGluc2lkZTsKKwl9IGVsc2UgeworCQkvKiBvdGhlciBlcnJvcnMgYXJlIHN0b3BwZXJzICovCisJCUNIRUNLX0ZDVChyZXQpOworCX0KKwkKKwkvKiBVcGRhdGUgY291bnQgKi8KKwlpZiAobmJfYWRkZWQpCisJCSpuYl9hZGRlZCArPSAxOworCQoraW5zaWRlOgorCS8qIE5vdywgdGhlIGlubmVyIGVsZW1lbnRzLCBpZiBhbnkgKi8KKwkKKwlpZiAoICghRkRfSVNfTElTVF9FTVBUWSgmYS0+ZW51bXMpKSAmJiAoYWQuYXZwX2Jhc2V0eXBlICE9IEFWUF9UWVBFX1VOU0lHTkVEMzIpKSB7CisJCVRSQUNFX0RFQlVHKElORk8sICJBVlAgJyVzJyB0eXBlIGlzIG5vdCBhbiBVbnNpZ25lZDMyIGJ1dCBpdCBoYXMgZW51bSB2YWx1ZXMgKGludmFsaWQgaW4gdGhpcyBleHRlbnNpb24pLiIsIGFkLmF2cF9uYW1lKTsKKwkJcmV0dXJuIEVJTlZBTDsKKwl9CisKKwkvKiBJbiBjYXNlIG9mIGVudW1lcmF0aW9uLCBkZWZpbmUgdGhlIGVudW0gdmFsdWVzICovCisJZm9yIChsaSA9IGEtPmVudW1zLm5leHQ7IGxpICE9ICZhLT5lbnVtczsgbGkgPSBsaS0+bmV4dCkgeworCQlzdHJ1Y3QgdF9lbnVtICogZSA9IChzdHJ1Y3QgdF9lbnVtICopbGk7CisJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSBlZDsKKwkJCisJCW1lbXNldCgmZWQsIDAsIHNpemVvZihlZCkpOworCQllZC5lbnVtX25hbWUgPSAoY2hhciAqKWUtPm5hbWU7CisJCWVkLmVudW1fdmFsdWUudTMyID0gZS0+Y29kZTsKKwkJCisJCUNIRUNLX0ZDVF9ETyggcmV0ID0gZmRfZGljdF9uZXcgKCBmRF9kaWN0LCBESUNUX0VOVU1WQUwsICZlZCwgdHlwZSwgTlVMTCApLAorCQkJeworCQkJCVRSQUNFX0RFQlVHKElORk8sICJFcnJvciBkZWZpbmluZyBjb25zdGFudCB2YWx1ZSAnJXMnIGZvciBBVlAgJyVzJzogJXMiLCBlZC5lbnVtX25hbWUsIGFkLmF2cF9uYW1lLCBzdHJlcnJvcihyZXQpKTsKKwkJCQlyZXR1cm4gcmV0OworCQkJfSApOworCQlpZiAobmJfYWRkZWQpCisJCQkqbmJfYWRkZWQgKz0gMTsKKwl9CisJCisJLyogSW4gY2FzZSBvZiBncm91cGVkIEFWUCwgY2hlY2sgdGhlIHR5cGUgaXMgcmVhbGx5IGdyb3VwZWQgKi8KKwlpZiAoICFGRF9JU19MSVNUX0VNUFRZKCZhLT5ncm91cGVkX29wdGlvbmFsKQorCSAgfHwgIUZEX0lTX0xJU1RfRU1QVFkoJmEtPmdyb3VwZWRfcmVxdWlyZWQpCisJICB8fCAhRkRfSVNfTElTVF9FTVBUWSgmYS0+Z3JvdXBlZF9maXhlZCkgKSB7CisJCUNIRUNLX1BBUkFNU19ETyggYWQuYXZwX2Jhc2V0eXBlID09IEFWUF9UWVBFX0dST1VQRUQsIAorCQkJeyBUUkFDRV9ERUJVRyhJTkZPLCAiR290IHJ1bGVzIGZvciBub24tZ3JvdXBlZCBBVlAgJyVzJyIsIGFkLmF2cF9uYW1lKTsgcmV0dXJuIEVJTlZBTDt9ICk7CisJCUNIRUNLX0ZDVF9ETyggcmV0ID0gcnVsZXNfdG9fZkQoZkRfZGljdCwgcHJldiwgJmEtPmdyb3VwZWRfZml4ZWQsICZhLT5ncm91cGVkX3JlcXVpcmVkLCAmYS0+Z3JvdXBlZF9vcHRpb25hbCwgbmJfYWRkZWQpLAorCQkJeyBUUkFDRV9ERUJVRyhJTkZPLCAiRXJyb3IgcHJvY2Vzc2luZyBydWxlcyBmb3IgQVZQICclcyc6ICVzIiwgYWQuYXZwX25hbWUsIHN0cmVycm9yKHJldCkpOyByZXR1cm4gcmV0OyB9ICk7CisJfQorCQorCS8qIGRvbmUhICovCisJcmV0dXJuIDA7Cit9CisKKy8qIEZpbmQgb3IgY3JlYXRlIGEgY29tbWFuZC4gKi8KK3N0YXRpYyBpbnQgY21kX3RvX2ZEKHN0cnVjdCB0X2NtZCAqIGMsIHN0cnVjdCBkaWN0aW9uYXJ5ICogZkRfZGljdCwgc3RydWN0IGRpY3Rfb2JqZWN0ICogZmRfYXBwbCwgc3RydWN0IGRpY3Rfb2JqZWN0ICoqIGZkX3JlcSwgaW50ICogbmJfYWRkZWQpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiByZXEgPSBOVUxMLCAqYW5zID0gTlVMTDsKKwlzdHJ1Y3QgZGljdF9jbWRfZGF0YSBjZDsKKwljaGFyIGNtZG5hbWVbNTEyXTsKKworCVRSQUNFX0VOVFJZKCIlcCAlcCAlcCAlcCAlcCIsIGMsIGZEX2RpY3QsIGZkX2FwcGwsIGZkX3JlcSwgbmJfYWRkZWQpOworCQorCUNIRUNLX1BBUkFNUyhjICYmIGZEX2RpY3QpOworCQorCS8qIFByZXBhcmUgdGhlIHJlcXVlc3QgZGF0YSBpbiBmRCdzIGZvcm1hdCAqLworCW1lbXNldCgmY2QsIDAsIHNpemVvZihjZCkpOworCWNkLmNtZF9jb2RlID0gYy0+Y29kZTsKKwlzbnByaW50ZihjbWRuYW1lLCBzaXplb2YoY21kbmFtZSksICIlcy1SZXF1ZXN0IiwgKGNoYXIgKiljLT5uYW1lKTsKKwljZC5jbWRfbmFtZSA9ICZjbWRuYW1lWzBdOworCWNkLmNtZF9mbGFnX21hc2sgPSBjLT5mbWFzayB8IENNRF9GTEFHX1JFUVVFU1QgfCBDTURfRkxBR19FUlJPUjsKKwljZC5jbWRfZmxhZ192YWwgID0gYy0+ZmxhZ3MgfCBDTURfRkxBR19SRVFVRVNUOworCQorCS8qIENyZWF0ZSBvciBzZWFyY2ggaW4gdGhlIGRpY3Rpb25hcnkgKi8KKwlyZXQgPSBmZF9kaWN0X25ldyAoIGZEX2RpY3QsIERJQ1RfQ09NTUFORCwgJmNkLCBmZF9hcHBsLCAmcmVxICk7CisJaWYgKGZkX3JlcSkKKwkJKmZkX3JlcSA9IHJlcTsKKwlpZiAocmV0ID09IEVFWElTVCkgeworCQlzdHJ1Y3QgZGljdF9jbWRfZGF0YSBwcmV2Y2Q7CisJCS8qIENvbmZsaWN0IHdpdGggZXhpc3RpbmcgZW50cnkgKi8KKwkJQ0hFQ0tfRkNUKCBmZF9kaWN0X2dldHZhbChyZXEsICZwcmV2Y2QpICk7CisJCVRSQUNFX0RFQlVHKElORk8sICJbZGljdF9sZWdhY3lfeG1sXSBXYXJuaW5nOiBDb25mbGljdGluZyBlbnRyeS4iKTsKKwkJVFJBQ0VfREVCVUcoSU5GTywgIltkaWN0X2xlZ2FjeV94bWxdICAgTmV3IGVudHJ5IChpZ25vcmVkKTogJXUgLSAnJXMnIiwgY2QuY21kX2NvZGUsIGNkLmNtZF9uYW1lKTsKKwkJVFJBQ0VfREVCVUcoSU5GTywgIltkaWN0X2xlZ2FjeV94bWxdICAgT2xkIGVudHJ5ICAgICAgICAgIDogJXUgLSAnJXMnIiwgcHJldmNkLmNtZF9jb2RlLCBwcmV2Y2QuY21kX25hbWUpOworCQlnb3RvIGFuc3dlcjsKKwl9IGVsc2UgeworCQkvKiBvdGhlciBlcnJvcnMgYXJlIHN0b3BwZXJzICovCisJCUNIRUNLX0ZDVChyZXQpOworCX0KKwkKKwkvKiBVcGRhdGUgY291bnQgKi8KKwlpZiAobmJfYWRkZWQpCisJCSpuYl9hZGRlZCArPSAxOworCQorYW5zd2VyOgorCS8qIHVwZGF0ZSBkYXRhIGZvciB0aGUgYW5zd2VyICovCisJc25wcmludGYoY21kbmFtZSwgc2l6ZW9mKGNtZG5hbWUpLCAiJXMtQW5zd2VyIiwgKGNoYXIgKiljLT5uYW1lKTsKKwljZC5jbWRfZmxhZ192YWwgJj0gfkNNRF9GTEFHX1JFUVVFU1Q7CisJY2QuY21kX2ZsYWdfbWFzayAmPSB+Q01EX0ZMQUdfRVJST1I7CisJCisJcmV0ID0gZmRfZGljdF9uZXcgKCBmRF9kaWN0LCBESUNUX0NPTU1BTkQsICZjZCwgZmRfYXBwbCwgJmFucyApOworCWlmIChyZXQgPT0gRUVYSVNUKSB7CisJCXN0cnVjdCBkaWN0X2NtZF9kYXRhIHByZXZjZDsKKwkJLyogQ29uZmxpY3Qgd2l0aCBleGlzdGluZyBlbnRyeSAqLworCQlDSEVDS19GQ1QoIGZkX2RpY3RfZ2V0dmFsKGFucywgJnByZXZjZCkgKTsKKwkJVFJBQ0VfREVCVUcoSU5GTywgIltkaWN0X2xlZ2FjeV94bWxdIFdhcm5pbmc6IENvbmZsaWN0aW5nIGVudHJ5LiIpOworCQlUUkFDRV9ERUJVRyhJTkZPLCAiW2RpY3RfbGVnYWN5X3htbF0gICBOZXcgZW50cnkgKGlnbm9yZWQpOiAldSAtICclcyciLCBjZC5jbWRfY29kZSwgY2QuY21kX25hbWUpOworCQlUUkFDRV9ERUJVRyhJTkZPLCAiW2RpY3RfbGVnYWN5X3htbF0gICBPbGQgZW50cnkgICAgICAgICAgOiAldSAtICclcyciLCBwcmV2Y2QuY21kX2NvZGUsIHByZXZjZC5jbWRfbmFtZSk7CisJCWdvdG8gcnVsZXM7CisJfSBlbHNlIHsKKwkJLyogb3RoZXIgZXJyb3JzIGFyZSBzdG9wcGVycyAqLworCQlDSEVDS19GQ1QocmV0KTsKKwl9CisJCisJLyogVXBkYXRlIGNvdW50ICovCisJaWYgKG5iX2FkZGVkKQorCQkqbmJfYWRkZWQgKz0gMTsKKwkKK3J1bGVzOgorCS8qIE5vdyBwcm9jZXNzIHRoZSBydWxlcyBpbnNpZGUgdGhlIGNvbW1hbmQgKi8KKwlDSEVDS19GQ1RfRE8oIHJldCA9IHJ1bGVzX3RvX2ZEKGZEX2RpY3QsIHJlcSwgJmMtPnJlcXJ1bGVzX2ZpeGVkLCAmYy0+cmVxcnVsZXNfcmVxdWlyZWQsICZjLT5yZXFydWxlc19vcHRpb25hbCwgbmJfYWRkZWQpLAorCQkJeworCQkJCVRSQUNFX0RFQlVHKElORk8sICJFcnJvciBjb252ZXJ0aW5nIGRhdGEgZnJvbSByZXF1ZXN0IHJ1bGVzOiAlcyIsIHN0cmVycm9yKHJldCkpOworCQkJCXJldHVybiByZXQ7CisJCQl9ICAgKTsKKwlDSEVDS19GQ1RfRE8oIHJldCA9IHJ1bGVzX3RvX2ZEKGZEX2RpY3QsIGFucywgJmMtPmFuc3J1bGVzX2ZpeGVkLCAmYy0+YW5zcnVsZXNfcmVxdWlyZWQsICZjLT5hbnNydWxlc19vcHRpb25hbCwgbmJfYWRkZWQpLAorCQkJeworCQkJCVRSQUNFX0RFQlVHKElORk8sICJFcnJvciBjb252ZXJ0aW5nIGRhdGEgZnJvbSBhbnN3ZXIgcnVsZXM6ICVzIiwgc3RyZXJyb3IocmV0KSk7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0gICApOworCQorCS8qIERvbmUgKi8KKwlyZXR1cm4gMDsKK30KKworLyogRmluZCBvciBjcmVhdGUgYW4gYXBwbGljYXRpb24gKGFuZCBkZXBlbmRlbnQgb2JqZWN0cykgKi8KK3N0YXRpYyBpbnQgYXBwbF90b19mRChzdHJ1Y3QgdF9hcHBsICogYSwgc3RydWN0IGRpY3Rpb25hcnkgKiBmRF9kaWN0LCBzdHJ1Y3QgZGljdF9vYmplY3QgKiogZmRfYSwgaW50ICogbmJfYWRkZWQpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBwcmV2ID0gTlVMTDsKKwlzdHJ1Y3QgZGljdF9hcHBsaWNhdGlvbl9kYXRhIGFkOworCXN0cnVjdCBmZF9saXN0ICogbGk7CisKKwlUUkFDRV9FTlRSWSgiJXAgJXAgJXAgJXAiLCBhLCBmRF9kaWN0LCBmZF9hLCBuYl9hZGRlZCk7CisJCisJQ0hFQ0tfUEFSQU1TKGEgJiYgZkRfZGljdCk7CisJCisJaWYgKGEtPmlkKSB7IC8qIHNraXAgYXBwIDAgKi8KKwkKKwkJLyogUHJlcGFyZSB0aGUgZGF0YSBpbiBmRCdzIGZvcm1hdCAqLworCQltZW1zZXQoJmFkLCAwLCBzaXplb2YoYWQpKTsKKwkJYWQuYXBwbGljYXRpb25faWQgICA9IGEtPmlkOworCQlhZC5hcHBsaWNhdGlvbl9uYW1lID0gKGNoYXIgKilhLT5uYW1lOworCisJCS8qIENyZWF0ZSBvciBzZWFyY2ggaW4gdGhlIGRpY3Rpb25hcnkgKi8KKwkJcmV0ID0gZmRfZGljdF9uZXcgKCBmRF9kaWN0LCAKKwkJCQkJRElDVF9BUFBMSUNBVElPTiwgCisJCQkJCSZhZCwgCisJCQkJCU5VTEwgLyogd2UgZG9uJ3QgaGF2ZSBhIHBhcmVudCB2ZW5kb3IgaW4gWE1MIGZpbGVzLCBzbyBjdXJyZW50bHkgZXZlcnl0aGluZyBsaW5rcyB0byBubyB2ZW5kb3IgKi8sIAorCQkJCQkmcHJldiApOworCQlpZiAoZmRfYSkKKwkJCSpmZF9hID0gcHJldjsKKwkJaWYgKHJldCA9PSBFRVhJU1QpIHsKKwkJCS8qIENvbmZsaWN0IHdpdGggZXhpc3RpbmcgZW50cnkgKi8KKwkJCUNIRUNLX0ZDVCggZmRfZGljdF9nZXR2YWwocHJldiwgJmFkKSApOworCQkJVFJBQ0VfREVCVUcoSU5GTywgIltkaWN0X2xlZ2FjeV94bWxdIFdhcm5pbmc6IENvbmZsaWN0aW5nIGVudHJ5LiIpOworCQkJVFJBQ0VfREVCVUcoSU5GTywgIltkaWN0X2xlZ2FjeV94bWxdICAgTmV3IGVudHJ5IChpZ25vcmVkKTogJXUgLSAnJXMnIiwgYS0+aWQsIChjaGFyICopYS0+bmFtZSk7CisJCQlUUkFDRV9ERUJVRyhJTkZPLCAiW2RpY3RfbGVnYWN5X3htbF0gICBPbGQgZW50cnkgICAgICAgICAgOiAldSAtICclcyciLCBhZC5hcHBsaWNhdGlvbl9pZCwgYWQuYXBwbGljYXRpb25fbmFtZSk7CisJCQlnb3RvIGluc2lkZTsKKwkJfSBlbHNlIHsKKwkJCS8qIG90aGVyIGVycm9ycyBhcmUgc3RvcHBlcnMgKi8KKwkJCUNIRUNLX0ZDVChyZXQpOworCQl9CisKKwkJLyogVXBkYXRlIGNvdW50ICovCisJCWlmIChuYl9hZGRlZCkKKwkJCSpuYl9hZGRlZCArPSAxOworCX0KKwkKK2luc2lkZToKKwkvKiBOb3csIHRoZSBpbm5lciBlbGVtZW50cyAqLworCQorCS8qIEZpcnN0LCBkZWZpbmUgYWxsIHRoZSB0eXBlcyAqLworCWZvciAobGkgPSBhLT50eXBlcy5uZXh0OyBsaSAhPSAmYS0+dHlwZXM7IGxpID0gbGktPm5leHQpIHsKKwkJQ0hFQ0tfRkNUX0RPKCByZXQgPSB0eXBkZWZuX3RvX2ZEKChzdHJ1Y3QgdF90eXBlZGVmbiAqKWxpLCBmRF9kaWN0LCBwcmV2LCBOVUxMLCBuYl9hZGRlZCksCisJCQl7CisJCQkJVFJBQ0VfREVCVUcoSU5GTywgIkVycm9yIGNvbnZlcnRpbmcgZGF0YSBmcm9tIHR5cGVkZWZuICclcyc6ICVzIiwgKChzdHJ1Y3QgdF90eXBlZGVmbiAqKWxpKS0+bmFtZSwgc3RyZXJyb3IocmV0KSk7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0gICk7CisJfQorCQorCS8qIFRoZW4sIEFWUHMsIGVudW1zLCBhbmQgZ3JvdXBlZCBBVlAgcnVsZXMgKi8KKwlmb3IgKGxpID0gYS0+YXZwcy5uZXh0OyBsaSAhPSAmYS0+YXZwczsgbGkgPSBsaS0+bmV4dCkgeworCQlDSEVDS19GQ1RfRE8oIHJldCA9IGF2cF90b19mRCgoc3RydWN0IHRfYXZwICopbGksIGZEX2RpY3QsIHByZXYsIE5VTEwsIG5iX2FkZGVkKSwKKwkJCXsKKwkJCQlUUkFDRV9ERUJVRyhJTkZPLCAiRXJyb3IgY29udmVydGluZyBkYXRhIGZyb20gQVZQICclcyc6ICVzIiwgKChzdHJ1Y3QgdF9hdnAgKilsaSktPm5hbWUsIHN0cmVycm9yKHJldCkpOworCQkJCXJldHVybiByZXQ7CisJCQl9ICApOworCX0KKwkKKwkvKiBGaW5hbGx5LCB0aGUgY29tbWFuZHMgYW5kIHJ1bGVzICovCisJZm9yIChsaSA9IGEtPmNvbW1hbmRzLm5leHQ7IGxpICE9ICZhLT5jb21tYW5kczsgbGkgPSBsaS0+bmV4dCkgeworCQlDSEVDS19GQ1RfRE8oIHJldCA9IGNtZF90b19mRCgoc3RydWN0IHRfY21kICopbGksIGZEX2RpY3QsIHByZXYsIE5VTEwsIG5iX2FkZGVkKSwKKwkJCXsKKwkJCQlUUkFDRV9ERUJVRyhJTkZPLCAiRXJyb3IgY29udmVydGluZyBkYXRhIGZyb20gY29tbWFuZCAnJXMnOiAlcyIsICgoc3RydWN0IHRfY21kICopbGkpLT5uYW1lLCBzdHJlcnJvcihyZXQpKTsKKwkJCQlyZXR1cm4gcmV0OworCQkJfSAgKTsKKwl9CisJCisJLyogZG9uZSEgKi8KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGRpY3RfdG9fZkQoc3RydWN0IGRpY3Rpb25hcnkgKiBmRF9kaWN0LCBzdHJ1Y3QgdF9kaWN0aW9uYXJ5ICogeG1sZGljdCwgaW50ICogbmJfYWRkZWQpCit7CisJc3RydWN0IGZkX2xpc3QgKiBsaTsKKwlpbnQgcmV0OworCQorCVRSQUNFX0VOVFJZKCIlcCAlcCAlcCIsIGZEX2RpY3QsIHhtbGRpY3QsIG5iX2FkZGVkKTsKKwkKKwlDSEVDS19QQVJBTVMoZkRfZGljdCAmJiB4bWxkaWN0ICYmIG5iX2FkZGVkKTsKKwkKKwkqbmJfYWRkZWQgPSAwOworCQorCS8qIENyZWF0ZSBhbGwgdGhlIHZlbmRvcnMgKi8KKwlmb3IgKGxpID0geG1sZGljdC0+dmVuZG9ycy5uZXh0OyBsaSAhPSAmeG1sZGljdC0+dmVuZG9yczsgbGkgPSBsaS0+bmV4dCkgeworCQlDSEVDS19GQ1RfRE8oIHJldCA9IHZlbmRfdG9fZkQoKHN0cnVjdCB0X3ZlbmQgKilsaSwgZkRfZGljdCwgTlVMTCwgbmJfYWRkZWQpLAorCQkJeworCQkJCVRSQUNFX0RFQlVHKElORk8sICJFcnJvciBjb252ZXJ0aW5nIGRhdGEgZnJvbSB2ZW5kb3IgJyVzJzogJXMiLCAoKHN0cnVjdCB0X3ZlbmQgKilsaSktPm5hbWUsIHN0cmVycm9yKHJldCkpOworCQkJCXJldHVybiByZXQ7CisJCQl9ICk7CisJfQorCQorCS8qIE5vdywgcHJvY2VzcyBlYWNoIGFwcGxpY2F0aW9uICovCisJQ0hFQ0tfRkNUX0RPKCByZXQgPSBhcHBsX3RvX2ZEKCZ4bWxkaWN0LT5iYXNlX2FuZF9hcHBsaWNhdGlvbnMsIGZEX2RpY3QsIE5VTEwsIG5iX2FkZGVkKSwKKwkJCXsKKwkJCQlUUkFDRV9ERUJVRyhJTkZPLCAiRXJyb3IgY29udmVydGluZyBkYXRhIGZyb20gQmFzZSBhcHBsaWNhdGlvbjogJXMiLCBzdHJlcnJvcihyZXQpKTsKKwkJCQlyZXR1cm4gcmV0OworCQkJfSApOworCWZvciAobGkgPSB4bWxkaWN0LT5iYXNlX2FuZF9hcHBsaWNhdGlvbnMuY2hhaW4ubmV4dDsgbGkgIT0gJnhtbGRpY3QtPmJhc2VfYW5kX2FwcGxpY2F0aW9ucy5jaGFpbjsgbGkgPSBsaS0+bmV4dCkgeworCQlDSEVDS19GQ1RfRE8oIHJldCA9IGFwcGxfdG9fZkQoKHN0cnVjdCB0X2FwcGwgKikgbGksIGZEX2RpY3QsIE5VTEwsIG5iX2FkZGVkKSwKKwkJCXsKKwkJCQlUUkFDRV9ERUJVRyhJTkZPLCAiRXJyb3IgY29udmVydGluZyBkYXRhIGZyb20gYXBwbGljYXRpb24gJyVzJzogJXMiLCAoKHN0cnVjdCB0X2FwcGwgKilsaSktPm5hbWUsIHN0cmVycm9yKHJldCkpOworCQkJCXJldHVybiByZXQ7CisJCQl9ICApOworCX0KKwkKKwkvKiBDb21wbGV0ZSEgKi8KKwlyZXR1cm4gMDsKK30KKworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgZGljdF9seG1sX3BhcnNlKGNoYXIgKiB4bWxmaWxlbmFtZSkKK3sKKwl4bWxTQVhIYW5kbGVyIGhhbmRsZXI7CisJc3RydWN0IHBhcnNlcl9jdHggZGF0YTsKKwlpbnQgcmV0OworCisJVFJBQ0VfRU5UUlkoIiVwIiwgeG1sZmlsZW5hbWUpOworCQorCUNIRUNLX1BBUkFNU19ETyh4bWxmaWxlbmFtZSwgeyByZXR1cm4gLTE7IH0gKTsKKwkKKwlUUkFDRV9ERUJVRyhGVUxMLCAiUGFyc2luZyBuZXh0IFhNTCBmaWxlOiAlcy4uLiIsIHhtbGZpbGVuYW1lKTsKKwkKKwkvKiBJbml0aWFsaXplIHRoZSBwYXJzZXIgKi8KKwltZW1zZXQoJmhhbmRsZXIsIDAsIHNpemVvZihoYW5kbGVyKSk7CisJaGFuZGxlci5zdGFydEVsZW1lbnQgPSBTQVhzdGFydGVsZW07CisJaGFuZGxlci5lbmRFbGVtZW50ICAgPSBTQVhlbmRlbGVtOworCQorCS8qIEluaXRpYWxpemUgdGhlIGRhdGEgKi8KKwltZW1zZXQoJmRhdGEsIDAsIHNpemVvZihkYXRhKSk7CisJZmRfbGlzdF9pbml0KCAmZGF0YS5kaWN0LnZlbmRvcnMsIE5VTEwgKTsKKwlmZF9saXN0X2luaXQoICZkYXRhLmRpY3QuYmFzZV9hbmRfYXBwbGljYXRpb25zLmNoYWluLCBOVUxMICk7CisJZGF0YS5kaWN0LmJhc2VfYW5kX2FwcGxpY2F0aW9ucy5uYW1lID0gKHVpbnQ4X3QgKikiW0RpYW1ldGVyIEJhc2UgUHJvdG9jb2xdIjsKKwlmZF9saXN0X2luaXQoICZkYXRhLmRpY3QuYmFzZV9hbmRfYXBwbGljYXRpb25zLmNvbW1hbmRzLCBOVUxMICk7CisJZmRfbGlzdF9pbml0KCAmZGF0YS5kaWN0LmJhc2VfYW5kX2FwcGxpY2F0aW9ucy50eXBlcywgTlVMTCApOworCWZkX2xpc3RfaW5pdCggJmRhdGEuZGljdC5iYXNlX2FuZF9hcHBsaWNhdGlvbnMuYXZwcywgTlVMTCApOworCWRhdGEueG1sZmlsZW5hbWUgPSB4bWxmaWxlbmFtZTsKKwkKKwkvKiBQYXJzZSB0aGUgZmlsZSAqLworCXJldCA9IHhtbFNBWFVzZXJQYXJzZUZpbGUoJmhhbmRsZXIsICZkYXRhLCB4bWxmaWxlbmFtZSk7CisJaWYgKHJldCA8IDApIHsKKwkJVFJBQ0VfREVCVUcoSU5GTywgIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHBhcnNpbmcgJXMsIGFib3J0aW5nLiIsIHhtbGZpbGVuYW1lKTsKKwkJZGVsX2RpY3RfY29udGVudHMoJmRhdGEuZGljdCk7CisJCXJldHVybiAtMTsKKwl9CisJCisJVFJBQ0VfREVCVUcoRlVMTCwgIlhNTCBmaWxlIHBhcnNpbmcsIDFzdCBwYXNzIGNvbXBsZXRlZC4iKTsKKwlpZiAoVFJBQ0VfQk9PTChBTk5PWUlORykpIHsKKwkJZHVtcF9kaWN0KCZkYXRhLmRpY3QpOworCX0KKwkKKwkvKiBOb3csIGNvbnZlcnQgYWxsIHRoZSBvYmplY3RzIGZyb20gdGhlIHRlbXBvcmFyeSB0cmVlIGludG8gdGhlIGZyZWVEaWFtZXRlciBkaWN0aW9uYXJ5ICovCisJQ0hFQ0tfRkNUX0RPKCBkaWN0X3RvX2ZEKGZkX2dfY29uZmlnLT5jbmZfZGljdCwgJmRhdGEuZGljdCwgJnJldCksIAorCQl7IAorCQkJVFJBQ0VfREVCVUcoSU5GTywgIkVycm9yIHdoaWxlIGNvbnZlcnRpbmcgZGF0YSByZWFkIGZyb20gZmlsZSAnJXMnIiwgeG1sZmlsZW5hbWUpOworCQkJZGVsX2RpY3RfY29udGVudHMoJmRhdGEuZGljdCk7IAorCQkJcmV0dXJuIC0xOyAKKwkJfSApOworCQorCVRSQUNFX0RFQlVHKEZVTEwsICJDb252ZXJzaW9uIGZyb20gJyVzJyB0byBmcmVlRGlhbWV0ZXIgaW50ZXJuYWwgZm9ybWF0IGNvbXBsZXRlLiIsIHhtbGZpbGVuYW1lKTsKKwkKKwkvKiBEb25lICovCisJZGVsX2RpY3RfY29udGVudHMoJmRhdGEuZGljdCk7CisJCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF9taXA2YS9DTWFrZUxpc3RzLnR4dCBiL2V4dGVuc2lvbnMvZGljdF9taXA2YS9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGE5YzkzCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kaWN0X21pcDZhL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTMgQEAKKyMgVGhlIGRpY3RfbWlwNmEgZXh0ZW5zaW9uCitQUk9KRUNUKCJEaWFtZXRlciBNb2JpbGUgSVB2NiBBdXRoIChNSVA2QSkgRGljdGlvbmFyeSBEZWZpbml0aW9ucyIgQykKKworIyBDb21waWxlIGFzIGEgbW9kdWxlCitGRF9BRERfRVhURU5TSU9OKGRpY3RfbWlwNmEgZGljdF9taXA2YS5jKQorCisKKyMjIyMKKyMjIElOU1RBTEwgc2VjdGlvbiAjIworCitJTlNUQUxMKFRBUkdFVFMgZGljdF9taXA2YQorCUxJQlJBUlkgREVTVElOQVRJT04gJHtJTlNUQUxMX0VYVEVOU0lPTlNfU1VGRklYfQorCUNPTVBPTkVOVCBmcmVlRGlhbWV0ZXItZGljdGlvbmFyeS1taXA2KQpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X21pcDZhL2RpY3RfbWlwNmEuYyBiL2V4dGVuc2lvbnMvZGljdF9taXA2YS9kaWN0X21pcDZhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMxYWVlZAotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF9taXA2YS9kaWN0X21pcDZhLmMKQEAgLTAsMCArMSwxMDk0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogRnJhbmNvaXMgQmFyZCA8ZnJhbmNvaXNAdGVyYS5pY3Mua2Vpby5hYy5qcD4JCQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDEwLCBUZXJhb2thIExhYm9yYXRvcnksIEtlaW8gVW5pdmVyc2l0eQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFRlcmFva2EgTGFib3JhdG9yeSBub3IgdGhlIAkJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBUZXJhb2thIExhYm9yYXRvcnkgCQkJCQkJICoKKyogICAJCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKworVGhlIGZvbGxvd2luZyB0YWJsZSBjb21wbGV0ZSB0aGUgb25lIGluIFJGQyA1Nzc4LCBwYWdlIDE4LiBUaGUgQVZQcyBhcmUgaW1wbGVtZW50ZWQgYmVsb3cgZm9sbG93aW5nIHRoZSBvcmRlciBvZiB0aGlzIHRhYmxlLgorV2UgdHJ5IHRvIGtlZXAgdGhlIHN0cnVjdHVyZSBvZiB0aGUgZ3JvdXBlZCBBVlAgYnkgZGVjbGFyaW5nIHRoZSBjb250YWluZWQgQVZQcyBqdXN0IGJlZm9yZSB0aGUgZ3JvdXBlZCBBVlAgdGhleSBkZXBlbmQgb24uCitUaGUgbnVtYmVyIG9mICcrJyBpbmRpY2F0ZXMgdGhlIGRlcHRoIG9mIHRoZSBjb250YWluZWQgQVZQLgorCitERVBUSAlOQU1FCQkJCQlBVlAJUkZDCQlUWVBFCQkJTk9URVMKKworCU1JUDYtRmVhdHVyZS1WZWN0b3IJCQkxMjQJNTQ0NwkJVW5zaWduZWQ2NAorCVVzZXItTmFtZQkJCQkxCTM1ODgJCVVURjhTdHJpbmcKKwlTZXJ2aWNlLVNlbGVjdGlvbgkJCTQ5Mwk1Nzc4CQlVVEY4U3RyaW5nCisJTUlQLU1OLUFBQS1TUEkJCQkJMzQxCTU3NzgJCVVuc2lnbmVkMzIKKysJTUlQLUhvbWUtQWdlbnQtQWRkcmVzcwkJCTMzNAk0MDA0CQlBZGRyZXNzCisrKwlEZXN0aW5hdGlvbi1Ib3N0CQkJMjkzCTM1ODgJCURpYW1ldGVySWRlbnRpdHkKKysrCURlc3RpbmF0aW9uLVJlYWxtCQkJMjgzCTM1ODgJCURpYW1ldGVySWRlbnRpdHkKKysJTUlQLUhvbWUtQWdlbnQtSG9zdAkJCTM0OAk0MDA0CQlHcm91cGVkCisrCU1JUDYtSG9tZS1MaW5rLVByZWZpeAkJCTEyNQk1NDQ3CQlPY3RldFN0cmluZworCU1JUDYtQWdlbnQtSW5mbwkJCQk0ODYJNTQ0NwkJR3JvdXBlZAorKwlNSVAtUmVwbGF5LU1vZGUJCQkJMzQ2CTQwMDQJCUVudW1lcmF0ZWQKKysJTUlQLUFsZ29yaXRobS1UeXBlCQkJMzQ1CTQwMDQJCUVudW1lcmF0ZWQKKysJTUlQLU1OLUhBLVNQSQkJCQk0OTEJNTc3OAkJVW5zaWduZWQzMgorKwlNSVAtTVNBLUxpZmV0aW1lCQkJMzY3CTQwMDQJCVVuc2lnbmVkMzIKKysJTUlQLVNlc3Npb24tS2V5CQkJCTM0Mwk0MDA0CQlPY3RldFN0cmluZworCU1JUC1NTi1IQS1NU0EJCQkJNDkyCTU3NzgJCUdyb3VwZWQJCQlkaWZmZXJlbnQgZnJvbSBNSVAtTU4tdG8tSEEtTVNBICgzMzEpCisJTUlQLU1vYmlsZS1Ob2RlLUFkZHJlc3MJCQkzMzMJNDAwNAkJQWRkcmVzcworCU1JUC1DYXJlb2YtQWRkcmVzcwkJCTQ4Nwk1Nzc4CQlBZGRyZXNzCisJTUlQLUF1dGhlbnRpY2F0b3IJCQk0ODgJNTc3OAkJT2N0ZXRTdHJpbmcKKwlNSVAtTUFDLU1vYmlsaXR5LURhdGEJCQk0ODkJNTc3OAkJT2N0ZXRTdHJpbmcKKwlNSVAtVGltZXN0YW1wCQkJCTQ5MAk1Nzc4CQlPY3RldFN0cmluZworCUNoYXJnZWFibGUtVXNlci1JZGVudGl0eQkJODkJNTc3OAkJT2N0ZXRTdHJpbmcKKwlNSVA2LUF1dGgtTW9kZQkJCQk0OTQJNTc3OAkJRW51bWVyYXRlZAorCitRb1MgQVZQcyAoUkZDIDU3NzcgLSBpbXBsZW1lbnRlZCBpbiB0aGUgY29ycmVzcG9uZGluZyBkaWN0aW9uYXJ5KQorCisJUW9TLUNhcGFiaWxpdHkJCQkJNTc4CTU3NzcJCUdyb3VwZWQKKwlRb1MtUmVzb3VyY2VzCQkJCTUwOAk1Nzc3CQlHcm91cGVkCisKK0FDQ09VTlRJTkcgQVZQcyAoc2VjdGlvbiA2LjIxKQorCisJQWNjb3VudGluZy1JbnB1dC1PY3RldHMJCQkzNjMJNDAwNCwgNDAwNQlVbnNpZ25lZDY0CisJQWNjb3VudGluZy1PdXRwdXQtT2N0ZXRzCQkzNjQJNDAwNCwgNDAwNQlVbnNpZ25lZDY0CisJQWNjb3VudGluZy1JbnB1dC1QYWNrZXRzCQkzNjUJNDAwNCwgNDAwNQlVbnNpZ25lZDY0CisJQWNjb3VudGluZy1PdXRwdXQtUGFja2V0cwkJMzY2CTQwMDQsIDQwMDUJVW5zaWduZWQ2NAorCUFjY3QtTXVsdGktU2Vzc2lvbi1JZAkJCTUwCTM1ODgJCVVURjhTdHJpbmcKKwlBY2N0LVNlc3Npb24tVGltZQkJCTQ2CTI4NjYsIDQwMDQJVW5zaWduZWQzMgorCU1JUDYtRmVhdHVyZS1WZWN0b3IJCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJTUlQLU1vYmlsZS1Ob2RlLUFkZHJlc3MJCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJTUlQNi1BZ2VudC1JbmZvCQkJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlDaGFyZ2VhYmxlLVVzZXItSWRlbnRpdHkJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlTZXJ2aWNlLVNlbGVjdGlvbgkJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlRb1MtUmVzb3VyY2VzCQkJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlRb1MtQ2FwYWJpbGl0eQkJCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJTUlQLUNhcmVvZi1BZGRyZXNzCQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitSQURJVVMgQVZQcyAoY29udGFpbmVkIGluIHRoZSBNSVIvTUlBKQorCisJTkFTLUlkZW50aWZpZXIJCQkJMzIJMjg2NQkJcmFkaXVzIChzZWUgYXZwKQorCU5BUy1JUC1BZGRyZXNzCQkJCTQJMjg2NSAgICAgICAgICAgIHJhZGl1cyAoc2VlIGF2cCkKKwlOQVMtSVB2Ni1BZGRyZXNzCQkJOTUJMzE2MiAgICAgICAgICAgIHJhZGl1cyAoc2VlIGF2cCkKKwlOQVMtUG9ydC1UeXBlCQkJCTYxCTI4NjUgICAgICAgICAgICByYWRpdXMgKHNlZSBhdnApCisJQ2FsbGVkLVN0YXRpb24tSWQJCQkzMAkyODY1ICAgICAgICAgICAgcmFkaXVzIChzZWUgYXZwKQorCUNhbGxpbmctU3RhdGlvbi1JZAkJCTMxCTI4NjUgICAgICAgICAgICByYWRpdXMgKHNlZSBhdnApCisKKworKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoJCQkJCQkJCQkJCQkJCQkJCSoKKyogVGhpcyB0YWJsZSBpcyBhIGNvcHkgb2YgdGhlIHJlZ2lzdHJ5IG5hbWVkICJNSVA2IEF1dGhlbnRpY2F0aW9uIE1vZGUgUmVnaXN0cnkiIGFuZCBtYW5hZ2VkIGJ5IElBTkEuCQkJCQkqCisqIHNvdXJjZSA6IGh0dHA6Ly93d3cuaWFuYS5vcmcvYXNzaWdubWVudHMvYWFhLXBhcmFtZXRlcnMvYWFhLXBhcmFtZXRlcnMudHh0CQkJCQkJCQkqCisqIHVwIHRvIGRhdGUgb24gb2N0b2JlciAyMDEwCQkJCQkJCQkJCQkJCQkqCisqCQkJCQkJCQkJCQkJCQkJCQkqCisqICAgICAgVmFsdWUgICAgICAgICAgVG9rZW4gICAgICAgUmVmZXJlbmNlCQkJCQkJCQkJCQkJKgorKiAgICAgICAgMCAgICAgICBSZXNlcnZlZCAgICAgICAgIFtSRkM1Nzc4XQkJCQkJCQkJCQkJCSoKKyogICAgICAgIDEgICAgICAgTUlQNl9BVVRIX01OX0FBQSBbUkZDNTc3OF0JCQkJCQkJCQkJCQkqCisqICAgMi00Mjk0OTY3Mjk1IFVuYXNzaWduZWQJCQkJCQkJCQkJCQkJCSoKKyoJCQkJCQkJCQkJCQkJCQkJCSoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoKKworTk9URVMKKworY2hlY2sgZm9yIG9taXNzaW9ucyAhCisKKyovCisKKyNpbmNsdWRlIDxmcmVlRGlhbWV0ZXIvZXh0ZW5zaW9uLmg+CisKKyNkZWZpbmUgQ0hFQ0tfZGljdF9uZXcoIF90eXBlLCBfZGF0YSwgX3BhcmVudCwgX3JlZiApCVwKKwlDSEVDS19GQ1QoICBmZF9kaWN0X25ldyggZmRfZ19jb25maWctPmNuZl9kaWN0LCAoX3R5cGUpLCAoX2RhdGEpLCAoX3BhcmVudCksIChfcmVmKSkgICk7CisKKyNkZWZpbmUgQ0hFQ0tfZGljdF9zZWFyY2goIF90eXBlLCBfY3JpdGVyaWEsIF93aGF0LCBfcmVzdWx0ICkJXAorCUNIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIChfdHlwZSksIChfY3JpdGVyaWEpLCAoX3doYXQpLCAoX3Jlc3VsdCksIEVOT0VOVCkgKTsKKworc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24geworCWNoYXIgCQkJKmF2cF9uYW1lOworCWVudW0gcnVsZV9wb3NpdGlvbglwb3NpdGlvbjsKKwlpbnQgCQkJbWluOworCWludAkJCW1heDsKK307CisKKyNkZWZpbmUgUlVMRV9PUkRFUiggX3Bvc2l0aW9uICkgKCgoKF9wb3NpdGlvbikgPT0gUlVMRV9GSVhFRF9IRUFEKSB8fCAoKF9wb3NpdGlvbikgPT0gUlVMRV9GSVhFRF9UQUlMKSkgPyAxIDogMCApCisKKyNkZWZpbmUgUEFSU0VfbG9jX3J1bGVzKCBfcnVsZWFycmF5LCBfcGFyZW50KSB7CQkJCQkJCQlcCisJaW50IF9fYXI7CQkJCQkJCQkJCQlcCisJZm9yIChfX2FyPTA7IF9fYXIgPCBzaXplb2YoX3J1bGVhcnJheSkgLyBzaXplb2YoKF9ydWxlYXJyYXkpWzBdKTsgX19hcisrKSB7CQkJXAorCQlzdHJ1Y3QgZGljdF9ydWxlX2RhdGEgX19kYXRhID0geyBOVUxMLCAJCQkJCQkJXAorCQkJKF9ydWxlYXJyYXkpW19fYXJdLnBvc2l0aW9uLAkJCQkJCQlcCisJCQkwLCAJCQkJCQkJCQkJXAorCQkJKF9ydWxlYXJyYXkpW19fYXJdLm1pbiwJCQkJCQkJCVwKKwkJCShfcnVsZWFycmF5KVtfX2FyXS5tYXh9OwkJCQkJCQlcCisJCV9fZGF0YS5ydWxlX29yZGVyID0gUlVMRV9PUkRFUihfX2RhdGEucnVsZV9wb3NpdGlvbik7CQkJCQlcCisJCUNIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoKCAJCQkJCQkJCVwKKwkJCWZkX2dfY29uZmlnLT5jbmZfZGljdCwJCQkJCQkJCVwKKwkJCURJQ1RfQVZQLCAJCQkJCQkJCQlcCisJCQlBVlBfQllfTkFNRSwgCQkJCQkJCQkJXAorCQkJKF9ydWxlYXJyYXkpW19fYXJdLmF2cF9uYW1lLCAJCQkJCQkJXAorCQkJJl9fZGF0YS5ydWxlX2F2cCwgMCApICk7CQkJCQkJCVwKKwkJaWYgKCAhX19kYXRhLnJ1bGVfYXZwICkgewkJCQkJCQkJXAorCQkJVFJBQ0VfREVCVUcoSU5GTywgIkFWUCBOb3QgZm91bmQ6ICclcyciLCAoX3J1bGVhcnJheSlbX19hcl0uYXZwX25hbWUgKTsJCVwKKwkJCXJldHVybiBFTk9FTlQ7CQkJCQkJCQkJXAorCQl9CQkJCQkJCQkJCQlcCisJCUNIRUNLX0ZDVF9ETyggZmRfZGljdF9uZXcoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9SVUxFLCAmX19kYXRhLCBfcGFyZW50LCBOVUxMKSwJXAorCQkJewkJCQkJCQkgICAgICAgIAkJXAorCQkJCVRSQUNFX0RFQlVHKElORk8sICJFcnJvciBvbiBydWxlIHdpdGggQVZQICclcyciLCAgICAgIAkJCVwKKwkJCQkJIChfcnVsZWFycmF5KVtfX2FyXS5hdnBfbmFtZSApOwkJICAgICAgCQkJXAorCQkJCXJldHVybiBFSU5WQUw7CQkJCQkgICAgICAJCQlcCisJCQl9ICk7CQkJCQkJCSAgICAgIAkJCVwKKwl9CQkJCQkJCQkJICAgICAgCQkJXAorfQorCisjZGVmaW5lIGVudW12YWxfZGVmX3UzMiggX3ZhbF8sIF9zdHJfICkgXAorCQl7IF9zdHJfLCAJCXsgLnUzMiA9IF92YWxfIH19CisKKyNkZWZpbmUgZW51bXZhbF9kZWZfb3MoIF9sZW5fLCBfdmFsXywgX3N0cl8gKSBcCisJCXsgX3N0cl8sIAkJeyAub3MgPSB7IC5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilfdmFsXywgLmxlbiA9IF9sZW5fIH19fQorCisKKworLyogRGVmaW5lcyBpZiB0aGVyZSBhcmUgYW55ICovCisKKy8vTmV3IFJlc3VsdC1Db2RlIGZvciBNSVAgKFJGQzU3NzgsIFNlY3Rpb24gNy4qKQorI2RlZmluZSBESUFNRVRFUl9TVUNDRVNTX1JFTE9DQVRFX0hBIDIwMDkKKyNkZWZpbmUgRElBTUVURVJfRVJST1JfTUlQNl9BVVRIX01PREUgNTA0MQorCisvL090aGVycworI2RlZmluZSBNSVA2X0FVVEhfTU5fQUFBIDEKKworLyogRGljdGlvbmFyeSAqLworCitpbnQgZGljdF9taXA2YV9pbml0KGNoYXIgKiBjb25mZmlsZSkKK3sKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBtaXA2YTsKKwl7CisJCXN0cnVjdCBkaWN0X2FwcGxpY2F0aW9uX2RhdGEgZGF0YSAgPSB7IAk4LCAiRGlhbWV0ZXIgTW9iaWxlIElQdjYgQXV0aCAoTUlQNkEpIEFwcGxpY2F0aW9uIiB9OworCQlDSEVDS19kaWN0X25ldyggRElDVF9BUFBMSUNBVElPTiwgJmRhdGEgLCBOVUxMLCAmbWlwNmEpOworCX0KKworCS8qKioqKioqKioqKioqKiovCisJLyogQVZQIHNlY3Rpb24gKi8KKwkvKioqKioqKioqKioqKioqLworCXsKKwkJLyogTG9hZGluZyBhbGwgdGhlIGRlcml2ZWQgZGF0YSBmb3JtYXRzICovCisKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogQWRkcmVzc190eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBVVEY4U3RyaW5nX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIERpYW1ldGVySWRlbnRpdHlfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogRGlhbWV0ZXJVUklfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogVGltZV90eXBlOworCQkKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiQWRkcmVzcyIsICZBZGRyZXNzX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJVVEY4U3RyaW5nIiwgJlVURjhTdHJpbmdfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkRpYW1ldGVySWRlbnRpdHkiLCAmRGlhbWV0ZXJJZGVudGl0eV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiRGlhbWV0ZXJVUkkiLCAmRGlhbWV0ZXJVUklfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIlRpbWUiLCAmVGltZV90eXBlKTsKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvKiBBVlBzIGZvciBNb2JpbGUgSVB2NiBBdXRoIEFwcGxpY2F0aW9uICovCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJCS8qIE1JUDYtRmVhdHVyZS1WZWN0b3IgLSBSRkMgNTQ0NyAqLworCQl7CisJCQkvKgorCisJCQkqLworCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJCQkJMTI0LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIk1JUDYtRmVhdHVyZS1WZWN0b3IiLCAJCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCSAJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfVU5TSUdORUQ2NAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQkKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCBOVUxMKTsKKwkJfQorCisJCS8qIFVzZXItTmFtZSAtIFJGQyAzNTg4ICovCisKKwkJCS8qCisJCQlJbXBsZW1lbnRlZCBpbiB0aGUgYmFzZSBwcm90b2NvbAorCQkJKi8KKworCQkvKiBTZXJ2aWNlLVNlbGVjdGlvbiAtIFJGQyA1Nzc4ICovCisJCXsKKwkJCS8qCisKKwkJCSovCisKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJCTQ5MywgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJTZXJ2aWNlLVNlbGVjdGlvbiIsCQkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9CisKKwkJLyogTUlQLU1OLUFBQS1TUEkgLSBSRkMgNTc3OCAqLworCQl7CisJCQkvKgorCisJCQkqLworCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCQkzNDEsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiTUlQLU1OLUFBQS1TUEkiLAkJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9VTlNJR05FRDMyIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCBOVUxMKTsKKwkJfQorCisJCS8qIERlc3RpbmF0aW9uLUhvc3QgLSBCYXNlIFByb3RvY29sICovCisKKwkJCS8qCisJCQlJbXBsZW1lbnRlZCBpbiB0aGUgYmFzZSBwcm90b2NvbAorCQkJKi8KKworCQkvKiBEZXN0aW5hdGlvbi1SZWFsbSAtIEJhc2UgUHJvdG9jb2wgKi8KKworCQkJLyoKKwkJCUltcGxlbWVudGVkIGluIHRoZSBiYXNlIHByb3RvY29sCisJCQkqLworCisJCS8qIE1JUC1Ib21lLUFnZW50LUFkZHJlc3MgLSBSRkMgNDAwNCAqLworCQl7CisJCQkvKgorCisJCQkqLworCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCQkzMzQsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiTUlQLUhvbWUtQWdlbnQtQWRkcmVzcyIsCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCSAJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgQWRkcmVzc190eXBlLCBOVUxMKTsKKwkJfQorCisJCS8qIE1JUC1Ib21lLUFnZW50LUhvc3QgLSBSRkMgNDAwNCAqLworCQl7CisJCQkvKgorCisJCQkqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkJMzQ4LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIk1JUC1Ib21lLUFnZW50LUhvc3QiLAkJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9HUk9VUEVEIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisKKwkJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQkJCQkJeyAJIHsgICJEZXN0aW5hdGlvbi1SZWFsbSIsCVJVTEVfUkVRVUlSRUQsCS0xLCAxIH0KKwkJCQkJCQkseyAgIkRlc3RpbmF0aW9uLUhvc3QiLAkJUlVMRV9SRVFVSVJFRCwJLTEsIDEgfQorCQkJCQkJfTsKKworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJCX0KKworCQkvKiBNSVA2LUhvbWUtTGluay1QcmVmaXggLSBSRkMgNTQ0NyAqLworCQl7CisJCQkvKgorCisJCQkqLworCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCQkxMjUsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiTUlQNi1Ib21lLUxpbmstUHJlZml4IiwgCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCSAJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgTlVMTCk7CisJCX0KKworCQkvKiBNSVA2LUFnZW50LUluZm8gLSBSRkMgNTQ0NyovCisJCXsKKwkJCS8qCisJCQkKKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJCQkJNDg2LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIk1JUDYtQWdlbnQtSW5mbyIsCQkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX0dST1VQRUQgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKworCQkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9IAorCQkJCQkJeyAJIHsgICJNSVAtSG9tZS1BZ2VudC1BZGRyZXNzIiwgCQlSVUxFX09QVElPTkFMLCAtMSwgMiB9CisJCQkJCQkJLHsgICJNSVAtSG9tZS1BZ2VudC1Ib3N0IiwJCVJVTEVfT1BUSU9OQUwsIC0xLCAxIH0KKwkJCQkJCQkseyAgIk1JUDYtSG9tZS1MaW5rLVByZWZpeCIsCQlSVUxFX09QVElPTkFMLCAtMSwgMSB9CisJCQkJCQl9OworCQkJCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkJfQorCisJCS8qIE1JUC1SZXBsYXktTW9kZSAtIFJGQyA1Nzc4ICYgNDAwNCAqLworCQl7CisJCQkvKgorCisJCQkqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogCSB0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhIAkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIkVudW1lcmF0ZWQoTUlQLVJlcGxheS1Nb2RlKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSB0XzAgPSB7ICJOb25lIiwgCXsgLmkzMiA9IDEgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgdF8xID0geyAiVGltZXN0YW1wIiwgCXsgLmkzMiA9IDIgfX07CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCQkzNDYsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiTUlQLVJlcGxheS1Nb2RlIiwJCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCSAJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfSU5URUdFUjMyIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEgLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8wICwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xICwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgdHlwZSwgTlVMTCk7CisJCX0KKworCQkvKiBNSVAtQWxnb3JpdGhtLVR5cGUgLSBSRkMgNTc3OCAmIDQwMDQgKi8KKwkJeworCQkJLyoKKworCQkJKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIAkgdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAJIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICJFbnVtZXJhdGVkKE1JUC1BbGdvcml0aG0tVHlwZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgdF8yID0geyAiSE1BQy1TSEEtMSBbSE1BQ10iLCB7IC5pMzIgPSAyIH19OworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkJMzQ1LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIk1JUC1BbGdvcml0aG0tVHlwZSIsCQkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX0lOVEVHRVIzMiAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhICwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiAsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIHR5cGUsIE5VTEwpOworCQl9CisKKwkJLyogTUlQLU1OLUhBLVNQSSAtIFJGQyA1Nzc4ICovCisJCXsKKwkJCS8qCisKKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCQk0OTEsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiTUlQLU1OLUhBLVNQSSIsCQkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsIE5VTEwpOworCQl9CisKKwkJLyogTUlQLU1TQS1MaWZldGltZSAtIFJGQyA0MDA0ICovCisJCXsKKwkJCS8qCisKKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCQkzNjcsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiTUlQLU1TQS1MaWZldGltZSIsCQkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsIE5VTEwpOworCQl9CisKKwkJLyogTUlQLVNlc3Npb24tS2V5IC0gUkZDIDU3NzggKi8KKwkJeworCQkJLyoKKworCQkJKi8KKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJCTM0MywgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJNSVAtU2Vzc2lvbi1LZXkiLAkJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORyAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgTlVMTCk7CisJCX0KKworCQkvKiBNSVAtTU4tSEEtTVNBIC0gUkZDIDU3NzggKi8KKwkJeworCQkJLyoKKwkJCQorCQkJKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQkJCQk0OTIsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiTUlQLU1OLUhBLU1TQSIsCQkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX0dST1VQRUQgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKworCQkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9IAorCQkJCQkJeyAJIHsgICJNSVAtU2Vzc2lvbi1LZXkiLCAJCVJVTEVfUkVRVUlSRUQsIC0xLCAxIH0KKwkJCQkJCQkseyAgIk1JUC1NU0EtTGlmZXRpbWUiLCAJUlVMRV9SRVFVSVJFRCwgLTEsIDEgfQorCQkJCQkJCSx7ICAiTUlQLU1OLUhBLVNQSSIsIAkJUlVMRV9PUFRJT05BTCwgLTEsIDEgfQorCQkJCQkJCSx7ICAiTUlQLUFsZ29yaXRobS1UeXBlIiwgCVJVTEVfT1BUSU9OQUwsIC0xLCAxIH0KKwkJCQkJCQkseyAgIk1JUC1SZXBsYXktTW9kZSIsIAkJUlVMRV9PUFRJT05BTCwgLTEsIDEgfQorCQkJCQkJfTsKKworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJCX0KKworCQkvKiBNSVAtTW9iaWxlLU5vZGUtQWRkcmVzcyAtIFJGQyA0MDA0ICovCisJCXsKKwkJCS8qCisKKwkJCSovCisKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJCTMzMywgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJNSVAtTW9iaWxlLU5vZGUtQWRkcmVzcyIsCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCSAJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgQWRkcmVzc190eXBlLCBOVUxMKTsKKwkJfQorCisJCS8qIE1JUC1DYXJlb2YtQWRkcmVzcyAtIFJGQyA1Nzc4ICovCisJCXsKKwkJCS8qCisKKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCQk0ODcsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiTUlQLUNhcmVvZi1BZGRyZXNzIiwJCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCSAJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIEFkZHJlc3NfdHlwZSwgTlVMTCk7CisJCX0KKworCQkvKiBNSVAtQXV0aGVudGljYXRvciAtIFJGQyA1Nzc4ICovCisJCXsKKwkJCS8qCisJCQkKKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJCQkJNDg4LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIk1JUC1BdXRoZW50aWNhdG9yIiwJCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCSAJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsIE5VTEwpOworCQl9CisKKwkJLyogTUlQLU1BQy1Nb2JpbGl0eS1EYXRhIC0gUkZDIDU3NzggKi8KKwkJeworCQkJLyoKKwkJCQorCQkJKi8KKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQkJCQk0ODksIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiTUlQLU1BQy1Nb2JpbGl0eS1EYXRhIiwJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORyAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgTlVMTCk7CisJCX0KKworCQkvKiBNSVAtVGltZXN0YW1wIC0gUkZDIDU3NzggKi8KKwkJeworCQkJLyoKKwkJCQorCQkJKi8KKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQkJCQk0OTAsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiTUlQLVRpbWVzdGFtcCIsCQkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCBOVUxMKTsKKwkJfQorCisJCS8qIENoYXJnZWFibGUtVXNlci1JZGVudGl0eSAtIFJGQyA1Nzc4ICovCisJCXsKKwkJCS8qCisJCQkKKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJCQkJODksIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiQ2hhcmdlYWJsZS1Vc2VyLUlkZW50aXR5IiwJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORyAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgTlVMTCk7CisJCX0KKworCQkvKiBNSVA2LUF1dGgtTW9kZSAtIFJGQyA1Nzc4ICovCisJCXsKKwkJCS8qCisJCQkKKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiAJIHR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgCSB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiRW51bWVyYXRlZChNSVA2LUF1dGgtTW9kZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgdF8wID0geyAiTm9uZSIsIAl7IC5pMzIgPSBNSVA2X0FVVEhfTU5fQUFBIH19OworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTQ5NCwgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJNSVA2LUF1dGgtTW9kZSIsCQkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX0lOVEVHRVIzMiAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhICwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMCAsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIHR5cGUsIE5VTEwpOworCQl9CisKKwkvLy8vLy8vLy8vLy8vLworCS8qIFFvUyBBVlBzICovCisJLy8vLy8vLy8vLy8vLy8KKworCQkvKiBRb1MtQ2FwYWJpbGl0eSAqLworCisJCQkvKgorCQkJSW1wbGVtZW50ZWQgaW4gUkZDIDU3NzcKKwkJCSovCisKKwkJLyogUW9TLVJlc291cmNlcyAqLworCisJCQkvKgorCQkJSW1wbGVtZW50ZWQgaW4gUkZDIDU3NzcKKwkJCSovCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvKiBBY2NvdW50aW5nIEFWUHMgKi8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCQkvKiBBY2NvdW50aW5nLUlucHV0LU9jdGV0cyAtIFJGQyA0MDA0ICovCisJCXsKKwkJCS8qCisKKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCQkzNjMsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiQWNjb3VudGluZy1JbnB1dC1PY3RldHMiLAkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX1VOU0lHTkVENjQgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsIE5VTEwpOworCQl9CisKKwkJLyogQWNjb3VudGluZy1PdXRwdXQtT2N0ZXRzIC0gUkZDIDQwMDQgKi8KKwkJeworCQkJLyoKKworCQkJKi8KKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJCTM2NCwgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJBY2NvdW50aW5nLU91dHB1dC1PY3RldHMiLAkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX1VOU0lHTkVENjQgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsIE5VTEwpOworCQl9CisKKwkJLyogQWNjb3VudGluZy1JbnB1dC1QYWNrZXRzIC0gUkZDIDQwMDQgKi8KKwkJeworCQkJLyoKKworCQkJKi8KKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJCTM2NSwgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJBY2NvdW50aW5nLUlucHV0LVBhY2tldHMiLAkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX1VOU0lHTkVENjQgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsIE5VTEwpOworCQl9CisKKwkJLyogQWNjb3VudGluZy1PdXRwdXQtUGFja2V0cyAtIFJGQyA0MDA0ICovCisJCXsKKwkJCS8qCisKKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCQkzNjYsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiQWNjb3VudGluZy1PdXRwdXQtUGFja2V0cyIsCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCSAJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfVU5TSUdORUQ2NCAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgTlVMTCk7CisJCX0KKworCQkvKiBBY2N0LU11bHRpLVNlc3Npb24tSWQgLSBSRkMgMzU4OCAqLworCisJCQkvKgorCQkJSW1wbGVtZW50ZWQgaW4gdGhlIGJhc2UgcHJvdG9jb2wKKwkJCSovCisKKwkJLyogQWNjdC1TZXNzaW9uLVRpbWUgLSBSRkMgNDAwNCAqLworCQl7CisJCQkvKgorCisJCQkqLworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkJNDYsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiQWNjdC1TZXNzaW9uLVRpbWUiLAkJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9VTlNJR05FRDMyIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCBOVUxMKTsKKwkJfQorCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8qIFJhZGl1cyBBVlBzIC0gdXNlZCBpbiBNSVIgJiBNSUEgKi8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwkvKgorCVdlIHVzZWQgdGhlIGZvbGxvd2luZyBjb3JyZXNwb25kZW5jZXMgZm9yIGRldGVybWluaW5nIHRoZSB0eXBlIG9mIHRoZSBSYWRpdXMgQVZQcworCisJCVJhZGl1cwkJRGlhbWV0ZXIKKworCQl0ZXh0CQlVVEY4U3RpbmcKKwkJc3RyaW5nCQlPY3RldFN0cmluZworCQlhZGRyZXNzCQlBZGRyZXNzCisJCWludGVnZXIJCVVuc2lnbmVkMzIKKwkJdGltZQkJVGltZQorCSovCisKKworCQkvKiBOQVMtSWRlbnRpZmllcgkJCQkzMgkzNTc1ICovCisJCXsKKwkJCS8qCisJCQlzdHJpbmcgLT4gT2N0ZXRTdHJpbmcKKwkJCSovCisKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJCTMyLCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIk5BUy1JZGVudGlmaWVyIiwJCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCSAJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgTlVMTCk7CisJCX0KKworCQkvKiBOQVMtSVAtQWRkcmVzcwkJCQk0CTM1NzUgKi8KKwkJeworCQkJLyoKKwkJCWFkZHJlc3MgLT4gQWRkcmVzcworCQkJKi8KKworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkJNCwgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJOQVMtSVAtQWRkcmVzcyIsCQkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIEFkZHJlc3NfdHlwZSwgTlVMTCk7CisJCX0KKworCQkvKiBOQVMtSVB2Ni1BZGRyZXNzCQkJOTUJMzE2MiAqLworCQl7CisJCQkvKgorCQkJYWRkcmVzcyAtPiBBZGRyZXNzCisJCQkqLworCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCQk5NSwgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJOQVMtSVB2Ni1BZGRyZXNzIiwJCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCSAJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgQWRkcmVzc190eXBlLCBOVUxMKTsKKwkJfQorCisJCS8qIE5BUy1Qb3J0LVR5cGUJCQk2MQkyODY1ICovCisJCXsKKwkJCS8qCisJCQlpbnRlZ2VyIC0+IFVuc2lnbmVkMzIKKworCQkJICAgVmFsdWUKKworCQkJICAgICAgVGhlIFZhbHVlIGZpZWxkIGlzIGZvdXIgb2N0ZXRzLiAgIlZpcnR1YWwiIHJlZmVycyB0byBhIGNvbm5lY3Rpb24KKwkJCSAgICAgIHRvIHRoZSBOQVMgdmlhIHNvbWUgdHJhbnNwb3J0IHByb3RvY29sLCBpbnN0ZWFkIG9mIHRocm91Z2ggYQorCQkJICAgICAgcGh5c2ljYWwgcG9ydC4gIEZvciBleGFtcGxlLCBpZiBhIHVzZXIgdGVsbmV0dGVkIGludG8gYSBOQVMgdG8KKwkJCSAgICAgIGF1dGhlbnRpY2F0ZSBoaW1zZWxmIGFzIGFuIE91dGJvdW5kLVVzZXIsIHRoZSBBY2Nlc3MtUmVxdWVzdCBtaWdodAorCQkJICAgICAgaW5jbHVkZSBOQVMtUG9ydC1UeXBlID0gVmlydHVhbCBhcyBhIGhpbnQgdG8gdGhlIFJBRElVUyBzZXJ2ZXIKKwkJCSAgICAgIHRoYXQgdGhlIHVzZXIgd2FzIG5vdCBvbiBhIHBoeXNpY2FsIHBvcnQuCisKKwkJCSAgICAgIDAgICAgICAgQXN5bmMKKwkJCSAgICAgIDEgICAgICAgU3luYworCQkJICAgICAgMiAgICAgICBJU0ROIFN5bmMKKwkJCSAgICAgIDMgICAgICAgSVNETiBBc3luYyBWLjEyMAorCQkJICAgICAgNCAgICAgICBJU0ROIEFzeW5jIFYuMTEwCisJCQkgICAgICA1ICAgICAgIFZpcnR1YWwKKwkJCSAgICAgIDYgICAgICAgUElBRlMKKwkJCSAgICAgIDcgICAgICAgSERMQyBDbGVhciBDaGFubmVsCisJCQkgICAgICA4ICAgICAgIFguMjUKKwkJCSAgICAgIDkgICAgICAgWC43NQorCQkJICAgICAgMTAgICAgICBHLjMgRmF4CisJCQkgICAgICAxMSAgICAgIFNEU0wgLSBTeW1tZXRyaWMgRFNMCisJCQkgICAgICAxMiAgICAgIEFEU0wtQ0FQIC0gQXN5bW1ldHJpYyBEU0wsIENhcnJpZXJsZXNzIEFtcGxpdHVkZSBQaGFzZQorCQkJCSAgICAgIE1vZHVsYXRpb24KKwkJCSAgICAgIDEzICAgICAgQURTTC1ETVQgLSBBc3ltbWV0cmljIERTTCwgRGlzY3JldGUgTXVsdGktVG9uZQorCQkJICAgICAgMTQgICAgICBJRFNMIC0gSVNETiBEaWdpdGFsIFN1YnNjcmliZXIgTGluZQorCQkJICAgICAgMTUgICAgICBFdGhlcm5ldAorCQkJICAgICAgMTYgICAgICB4RFNMIC0gRGlnaXRhbCBTdWJzY3JpYmVyIExpbmUgb2YgdW5rbm93biB0eXBlCisJCQkgICAgICAxNyAgICAgIENhYmxlCisJCQkgICAgICAxOCAgICAgIFdpcmVsZXNzIC0gT3RoZXIKKwkJCSAgICAgIDE5ICAgICAgV2lyZWxlc3MgLSBJRUVFIDgwMi4xMQorCisJCQkgICAgICBQSUFGUyBpcyBhIGZvcm0gb2Ygd2lyZWxlc3MgSVNETiBjb21tb25seSB1c2VkIGluIEphcGFuLCBhbmQKKwkJCSAgICAgIHN0YW5kcyBmb3IgUEhTIChQZXJzb25hbCBIYW5keXBob25lIFN5c3RlbSkgSW50ZXJuZXQgQWNjZXNzIEZvcnVtCisJCQkgICAgICBTdGFuZGFyZCAoUElBRlMpLgorCQkJKi8KKworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkJNjEsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiTkFTLVBvcnQtVHlwZSIsCQkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgTlVMTCk7CisJCX0KKworCQkvKiBDYWxsZWQtU3RhdGlvbi1JZAkJCTMwCTI4NjUgKi8KKwkJeworCQkJLyoKKwkJCXN0cmluZyAtPiBPY3RldFN0cmluZworCQkJKi8KKworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkJMzAsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiQ2FsbGVkLVN0YXRpb24tSWQiLAkJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCBOVUxMKTsKKwkJfQorCQkvKiBDYWxsaW5nLVN0YXRpb24tSWQJCQkzMQkyODY1ICovCisJCXsKKwkJCS8qCisJCQlzdHJpbmcgLT4gT2N0ZXRTdHJpbmcKKwkJCSovCisKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJCTMxLCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIkNhbGxpbmctU3RhdGlvbi1JZCIsCQkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsIE5VTEwpOworCQl9CisJfQorCisvKioqKioqKioqKioqKioqKioqKi8KKy8qIENvbW1hbmQgc2VjdGlvbiAqLworLyoqKioqKioqKioqKioqKioqKiovCisKKwl7CisJCS8qIE1JUDYtUmVxdWVzdCAoTUlSKSAqLworCQl7CisJCQkvKgorCisJCQlUaGUgTUlQNi1SZXF1ZXN0IChNSVIpLCBpbmRpY2F0ZWQgYnkgdGhlIENvbW1hbmQtQ29kZSBmaWVsZCBzZXQgdG8KKwkJCTMyNSBhbmQgdGhlICdSJyBiaXQgc2V0IGluIHRoZSBDb21tYW5kIEZsYWdzIGZpZWxkLCBpcyBzZW50IGJ5IHRoZQorCQkJSEEsIGFjdGluZyBhcyBhIERpYW1ldGVyIGNsaWVudCwgaW4gb3JkZXIgdG8gcmVxdWVzdCB0aGUKKwkJCWF1dGhlbnRpY2F0aW9uIGFuZCBhdXRob3JpemF0aW9uIG9mIGFuIE1OLgorCisJCQlBbHRob3VnaCB0aGUgSEEgcHJvdmlkZXMgdGhlIERpYW1ldGVyIHNlcnZlciB3aXRoIHJlcGxheSBwcm90ZWN0aW9uLQorCQkJcmVsYXRlZCBpbmZvcm1hdGlvbiwgdGhlIEhBIGlzIHJlc3BvbnNpYmxlIGZvciB0aGUgcmVwbGF5IHByb3RlY3Rpb24uCisKKwkJCVRoZSBtZXNzYWdlIGZvcm1hdCBpcyBzaG93biBiZWxvdy4KKworCQkJPE1JUDYtUmVxdWVzdD4gOjo9IDwgRGlhbWV0ZXIgSGVhZGVyOiAzMjUsIFJFUSwgUFhZID4KKwkJCQkJICAgPCBTZXNzaW9uLUlEID4KKwkJCQkJICAgeyBBdXRoLUFwcGxpY2F0aW9uLUlkIH0KKwkJCQkJICAgeyBVc2VyLU5hbWUgfQorCQkJCQkgICB7IERlc3RpbmF0aW9uLVJlYWxtIH0KKwkJCQkJICAgeyBPcmlnaW4tSG9zdCB9CisJCQkJCSAgIHsgT3JpZ2luLVJlYWxtIH0KKwkJCQkJICAgeyBBdXRoLVJlcXVlc3QtVHlwZSB9CisJCQkJCSAgIFsgRGVzdGluYXRpb24tSG9zdCBdCisJCQkJCSAgIFsgT3JpZ2luLVN0YXRlLUlkIF0KKwkJCQkJICAgWyBOQVMtSWRlbnRpZmllciBdCisJCQkJCSAgIFsgTkFTLUlQLUFkZHJlc3MgXQorCQkJCQkgICBbIE5BUy1JUHY2LUFkZHJlc3MgXQorCQkJCQkgICBbIE5BUy1Qb3J0LVR5cGUgXQorCQkJCQkgICBbIENhbGxlZC1TdGF0aW9uLUlkIF0KKwkJCQkJICAgWyBDYWxsaW5nLVN0YXRpb24tSWQgXQorCQkJCQkgICBbIE1JUDYtRmVhdHVyZS1WZWN0b3IgXQorCQkJCQkgICB7IE1JUDYtQXV0aC1Nb2RlIH0KKwkJCQkJICAgWyBNSVAtTU4tQUFBLVNQSSBdCisJCQkJCSAgIFsgTUlQLU1OLUhBLVNQSSBdCisJCQkJCTEqMnsgTUlQLU1vYmlsZS1Ob2RlLUFkZHJlc3MgfQorCQkJCQkgICB7IE1JUDYtQWdlbnQtSW5mbyB9CisJCQkJCSAgIHsgTUlQLUNhcmVvZi1BZGRyZXNzIH0KKwkJCQkJICAgWyBNSVAtQXV0aGVudGljYXRvciBdCisJCQkJCSAgIFsgTUlQLU1BQy1Nb2JpbGl0eS1EYXRhIF0KKwkJCQkJICAgWyBNSVAtVGltZXN0YW1wIF0KKwkJCQkJICAgWyBRb1MtQ2FwYWJpbGl0eSBdCisJCQkJCSAqIFsgUW9TLVJlc291cmNlcyBdCisJCQkJCSAgIFsgQ2hhcmdlYWJsZS1Vc2VyLUlkZW50aXR5IF0KKwkJCQkJICAgWyBTZXJ2aWNlLVNlbGVjdGlvbiBdCisJCQkJCSAgIFsgQXV0aG9yaXphdGlvbi1MaWZldGltZSBdCisJCQkJCSAgIFsgQXV0aC1TZXNzaW9uLVN0YXRlIF0KKwkJCQkJICogWyBQcm94eS1JbmZvIF0KKwkJCQkJICogWyBSb3V0ZS1SZWNvcmQgXQorCQkJCQkgKiBbIEFWUCBdCisKKwkJCUlmIHRoZSBNTiBpcyBib3RoIGF1dGhlbnRpY2F0ZWQgYW5kIGF1dGhvcml6ZWQgZm9yIHRoZSBtb2JpbGl0eQorCQkJc2VydmljZSwgdGhlbiB0aGUgQXV0aC1SZXF1ZXN0LVR5cGUgQVZQIGlzIHNldCB0byB0aGUgdmFsdWUKKwkJCUFVVEhPUklaRV9BVVRIRU5USUNBVEUuICBUaGlzIGlzIHRoZSBjYXNlIHdoZW4gdGhlIE1JUDYtQXV0aC1Nb2RlIGlzCisJCQlzZXQgdG8gdGhlIHZhbHVlIE1JUDZfQVVUSF9NTl9BQUEuCisKKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBjbWQ7CisJCQlzdHJ1Y3QgZGljdF9jbWRfZGF0YSBkYXRhID0geworCQkJCQkzMjUsIAkJCQkJLyogQ29kZSAqLworCQkJCQkiTUlQNi1SZXF1ZXN0IiwgCQkJLyogTmFtZSAqLworCQkJCQlDTURfRkxBR19SRVFVRVNUIHwgQ01EX0ZMQUdfUFJPWElBQkxFIHwgQ01EX0ZMQUdfRVJST1IsIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlDTURfRkxBR19SRVFVRVNUIHwgQ01EX0ZMQUdfUFJPWElBQkxFIAkJCQkJCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCX07CisJCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJCQkJCXsgCSB7ICAiU2Vzc2lvbi1JZCIsIAkJCVJVTEVfRklYRURfSEVBRCwgLTEsIDEgfQorCQkJCQkJCSx7ICAiQXV0aC1BcHBsaWNhdGlvbi1JZCIsIAkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJVc2VyLU5hbWUiLCAJCQlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkRlc3RpbmF0aW9uLVJlYWxtIiwgCQlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIk9yaWdpbi1Ib3N0IiwgCQkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJPcmlnaW4tUmVhbG0iLCAJCQlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkF1dGgtUmVxdWVzdC1UeXBlIiwgCQlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkRlc3RpbmF0aW9uLUhvc3QiLCAJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiT3JpZ2luLVN0YXRlLUlkIiwJIAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJOQVMtSWRlbnRpZmllciIsIAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiTkFTLUlQLUFkZHJlc3MiLCAJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIk5BUy1JUHY2LUFkZHJlc3MiLCAJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiTkFTLVBvcnQtVHlwZSIsIAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiQ2FsbGVkLVN0YXRpb24tSWQiLCAJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiQ2FsbGluZy1TdGF0aW9uLUlkIiwgCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIk1JUDYtRmVhdHVyZS1WZWN0b3IiLCAJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiTUlQNi1BdXRoLU1vZGUiLCAJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIk1JUC1NTi1BQUEtU1BJIiwgCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJNSVAtTU4tSEEtU1BJIiwgCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJNSVAtTW9iaWxlLU5vZGUtQWRkcmVzcyIsIAkJUlVMRV9PUFRJT05BTCwgICAgMSwgMiB9CisJCQkJCQkJLHsgICJNSVA2LUFnZW50LUluZm8iLCAJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIk1JUC1DYXJlb2YtQWRkcmVzcyIsIAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJNSVAtQXV0aGVudGljYXRvciIsIAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJNSVAtTUFDLU1vYmlsaXR5LURhdGEiLCAJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiTUlQLVRpbWVzdGFtcCIsIAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiUW9TLUNhcGFiaWxpdHkiLCAJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIlFvUy1SZXNvdXJjZXMiLCAJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAtMSB9CisJCQkJCQkJLHsgICJDaGFyZ2VhYmxlLVVzZXItSWRlbnRpdHkiLCAJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJTZXJ2aWNlLVNlbGVjdGlvbiIsIAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJBdXRob3JpemF0aW9uLUxpZmV0aW1lIiwgCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkF1dGgtU2Vzc2lvbi1TdGF0ZSIsIAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJQcm94eS1JbmZvIiwgCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgLTEgfQorCQkJCQkJCSx7ICAiUm91dGUtUmVjb3JkIiwgCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgLTEgfQorCQkJCQkJfTsKKworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQ09NTUFORCwgJmRhdGEsIG1pcDZhLCAmY21kKTsKKwkJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGNtZCApOworCQl9CisKKwkJLyogTUlQNi1BbnN3ZXIgKE1JQSkgKi8KKwkJeworCQkJLyoKKworCQkJVGhlIE1JUDYtQW5zd2VyIChNSUEpIG1lc3NhZ2UsIGluZGljYXRlZCBieSB0aGUgQ29tbWFuZC1Db2RlIGZpZWxkCisJCQlzZXQgdG8gMzI1IGFuZCB0aGUgJ1InIGJpdCBjbGVhcmVkIGluIHRoZSBDb21tYW5kIEZsYWdzIGZpZWxkLCBpcworCQkJc2VudCBieSB0aGUgRGlhbWV0ZXIgc2VydmVyIGluIHJlc3BvbnNlIHRvIHRoZSBNSVA2LVJlcXVlc3QgbWVzc2FnZS4KKworCQkJVGhlIFVzZXItTmFtZSBBVlAgTUFZIGJlIGluY2x1ZGVkIGluIHRoZSBNSUEgaWYgaXQgaXMgcHJlc2VudCBpbiB0aGUKKwkJCU1JUi4gIFRoZSBSZXN1bHQtQ29kZSBBVlAgTUFZIGNvbnRhaW4gb25lIG9mIHRoZSB2YWx1ZXMgZGVmaW5lZCBpbgorCQkJU2VjdGlvbiA3LCBpbiBhZGRpdGlvbiB0byB0aGUgdmFsdWVzIGRlZmluZWQgaW4gW1JGQzM1ODhdLgorCisJCQlBbiBNSUEgbWVzc2FnZSB3aXRoIHRoZSBSZXN1bHQtQ29kZSBBVlAgc2V0IHRvIERJQU1FVEVSX1NVQ0NFU1MgTVVTVAorCQkJaW5jbHVkZSB0aGUgTUlQLU1vYmlsZS1Ob2RlLUFkZHJlc3MgQVZQLgorCisJCQlUaGUgbWVzc2FnZSBmb3JtYXQgaXMgc2hvd24gYmVsb3cuCisKKwkJCTxNSVA2LUFuc3dlcj4gOjo9IDwgRGlhbWV0ZXIgSGVhZGVyOiAzMjUsIFBYWSA+CisJCQkJCSAgPCBTZXNzaW9uLUlkID4KKwkJCQkJICB7IEF1dGgtQXBwbGljYXRpb24tSWQgfQorCQkJCQkgIHsgUmVzdWx0LUNvZGUgfQorCQkJCQkgIHsgT3JpZ2luLUhvc3QgfQorCQkJCQkgIHsgT3JpZ2luLVJlYWxtIH0KKwkJCQkJICB7IEF1dGgtUmVxdWVzdC1UeXBlIH0KKwkJCQkJICBbIFVzZXItTmFtZSBdCisJCQkJCSAgWyBBdXRob3JpemF0aW9uLUxpZmV0aW1lIF0KKwkJCQkJICBbIEF1dGgtU2Vzc2lvbi1TdGF0ZSBdCisJCQkJCSAgWyBFcnJvci1NZXNzYWdlIF0KKwkJCQkJICBbIEVycm9yLVJlcG9ydGluZy1Ib3N0IF0KKwkJCQkJICBbIFJlLUF1dGgtUmVxdWVzdC1UeXBlIF0KKwkJCQkJICBbIE1JUDYtRmVhdHVyZS1WZWN0b3IgXQorCQkJCQkgIFsgTUlQNi1BZ2VudC1JbmZvIF0KKwkJCQkJKjJbIE1JUC1Nb2JpbGUtTm9kZS1BZGRyZXNzIF0KKwkJCQkJICBbIE1JUC1NTi1IQS1NU0EgXQorCQkJCQkqIFsgUW9TLVJlc291cmNlcyBdCisJCQkJCSAgWyBDaGFyZ2VhYmxlLVVzZXItSWRlbnRpdHkgXQorCQkJCQkgIFsgU2VydmljZS1TZWxlY3Rpb24gXQorCQkJCQkgIFsgT3JpZ2luLVN0YXRlLUlkIF0KKwkJCQkJKiBbIFByb3h5LUluZm8gXQorCQkJCQkqIFsgUmVkaXJlY3QtSG9zdCBdCisJCQkJCSAgWyBSZWRpcmVjdC1Ib3N0LVVzYWdlIF0KKwkJCQkJICBbIFJlZGlyZWN0LU1heC1DYWNoZS1UaW1lIF0KKwkJCQkJKiBbIEZhaWxlZC1BVlAgXQorCQkJCQkqIFsgQVZQIF0KKworCQkJKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGNtZDsKKwkJCXN0cnVjdCBkaWN0X2NtZF9kYXRhIGRhdGEgPSB7CisJCQkJCTMyNSwgCQkJCQkvKiBDb2RlICovCisJCQkJCSJNSVA2LUFuc3dlciIsIAkJCQkvKiBOYW1lICovCisJCQkJCUNNRF9GTEFHX1JFUVVFU1QgfCBDTURfRkxBR19QUk9YSUFCTEUgfCBDTURfRkxBR19FUlJPUiwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUNNRF9GTEFHX1BST1hJQUJMRSAJCQkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQl9OworCQkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCQkJCQl7IAkgeyAgIlNlc3Npb24tSWQiLCAJCQlSVUxFX0ZJWEVEX0hFQUQsIC0xLCAxIH0KKwkJCQkJCQkseyAgIkF1dGgtQXBwbGljYXRpb24tSWQiLCAJCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiUmVzdWx0LUNvZGUiLCAJCQlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIk9yaWdpbi1Ib3N0IiwgCQkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJPcmlnaW4tUmVhbG0iLCAJCQlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkF1dGgtUmVxdWVzdC1UeXBlIiwgCQlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIlVzZXItTmFtZSIsIAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiQXV0aG9yaXphdGlvbi1MaWZldGltZSIsIAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJBdXRoLVNlc3Npb24tU3RhdGUiLCAJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiRXJyb3ItTWVzc2FnZSIsIAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiRXJyb3ItUmVwb3J0aW5nLUhvc3QiLCAJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiUmUtQXV0aC1SZXF1ZXN0LVR5cGUiLCAJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiTUlQNi1GZWF0dXJlLVZlY3RvciIsIAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJNSVA2LUFnZW50LUluZm8iLCAJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIk1JUC1Nb2JpbGUtTm9kZS1BZGRyZXNzIiwgCQlSVUxFX09QVElPTkFMLCAgIC0xLCAyIH0KKwkJCQkJCQkseyAgIk1JUC1NTi1IQS1NU0EiLCAJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIlFvUy1SZXNvdXJjZXMiLCAJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAtMSB9CisJCQkJCQkJLHsgICJDaGFyZ2VhYmxlLVVzZXItSWRlbnRpdHkiLAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJTZXJ2aWNlLVNlbGVjdGlvbiIsIAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJPcmlnaW4tU3RhdGUtSWQiLCAJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIlByb3h5LUluZm8iLCAJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAtMSB9CisJCQkJCQkJLHsgICJSZWRpcmVjdC1Ib3N0IiwgCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgLTEgfQorCQkJCQkJCSx7ICAiUmVkaXJlY3QtSG9zdC1Vc2FnZSIsIAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJSZWRpcmVjdC1NYXgtQ2FjaGUtVGltZSIsIAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJGYWlsZWQtQVZQIiwgCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgLTEgfQorCQkJCQkJfTsKKworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQ09NTUFORCwgJmRhdGEsIG1pcDZhLCAmY21kKTsKKwkJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGNtZCApOworCQl9CisJfQorCUxPR19EKCAiRGljdGlvbmFyeSBFeHRlbnNpb24gJ0RpYW1ldGVyIE1vYmlsZSBJUHY2IEF1dGggKE1JUDZBKScgaW5pdGlhbGl6ZWQiKTsKKwlyZXR1cm4gMDsKK30KK0VYVEVOU0lPTl9FTlRSWSgiZGljdF9taXA2YSIsIGRpY3RfbWlwNmFfaW5pdCwgImRpY3RfcmZjNTc3NyIpOwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X21pcDZpL0NNYWtlTGlzdHMudHh0IGIvZXh0ZW5zaW9ucy9kaWN0X21pcDZpL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZDBjMjQKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfbWlwNmkvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxMyBAQAorIyBUaGUgZGljdF9taXA2aSBleHRlbnNpb24KK1BST0pFQ1QoIkRpYW1ldGVyIE1vYmlsZSBJUHY2IElLRSAoTUlQNkkpIERpY3Rpb25hcnkgRGVmaW5pdGlvbiIgQykKKworIyBDb21waWxlIGFzIGEgbW9kdWxlCitGRF9BRERfRVhURU5TSU9OKGRpY3RfbWlwNmkgZGljdF9taXA2aS5jKQorCisKKyMjIyMKKyMjIElOU1RBTEwgc2VjdGlvbiAjIworCitJTlNUQUxMKFRBUkdFVFMgZGljdF9taXA2aQorCUxJQlJBUlkgREVTVElOQVRJT04gJHtJTlNUQUxMX0VYVEVOU0lPTlNfU1VGRklYfQorCUNPTVBPTkVOVCBmcmVlRGlhbWV0ZXItZGljdGlvbmFyeS1taXA2KQpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X21pcDZpL2RpY3RfbWlwNmkuYyBiL2V4dGVuc2lvbnMvZGljdF9taXA2aS9kaWN0X21pcDZpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk3N2NjYwotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF9taXA2aS9kaWN0X21pcDZpLmMKQEAgLTAsMCArMSwxMTM3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogRnJhbmNvaXMgQmFyZCA8ZnJhbmNvaXNAdGVyYS5pY3Mua2Vpby5hYy5qcD4JCQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDEwLCBUZXJhb2thIExhYm9yYXRvcnksIEtlaW8gVW5pdmVyc2l0eQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFRlcmFva2EgTGFib3JhdG9yeSBub3IgdGhlIAkJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBUZXJhb2thIExhYm9yYXRvcnkgCQkJCQkJICoKKyogICAJCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKworVGhlIGZvbGxvd2luZyB0YWJsZSBjb21wbGV0ZSB0aGUgb25lIGluIFJGQyA1Nzc4LCBwYWdlIDE4LiBUaGUgQVZQcyBhcmUgaW1wbGVtZW50ZWQgYmVsb3cgZm9sbG93aW5nIHRoZSBvcmRlciBvZiB0aGlzIHRhYmxlLgorV2UgdHJ5IHRvIGtlZXAgdGhlIHN0cnVjdHVyZSBvZiB0aGUgZ3JvdXBlZCBBVlAgYnkgZGVjbGFyaW5nIHRoZSBjb250YWluZWQgQVZQcyBqdXN0IGJlZm9yZSB0aGUgZ3JvdXBlZCBBVlAgdGhleSBkZXBlbmQgb24uCitUaGUgbnVtYmVyIG9mICcrJyBpbmRpY2F0ZXMgdGhlIGRlcHRoIG9mIHRoZSBjb250YWluZWQgQVZQLgorCitERVBUSAlOQU1FCQkJCQlBVlAJUkZDCQlUWVBFCQkJTk9URVMKKwkKKwlNSVA2LUZlYXR1cmUtVmVjdG9yCQkJMTI0CTU0NDcJCVVuc2lnbmVkNjQKKwlNSVAtTW9iaWxlLU5vZGUtQWRkcmVzcwkJCTMzMwk0MDA0CQlBZGRyZXNzCisrCU1JUC1Ib21lLUFnZW50LUFkZHJlc3MJCQkzMzQJNDAwNAkJQWRkcmVzcworKysJRGVzdGluYXRpb24tSG9zdAkJCTI5MwkzNTg4CQlEaWFtZXRlcklkZW50aXR5CisrKwlEZXN0aW5hdGlvbi1SZWFsbQkJCTI4MwkzNTg4CQlEaWFtZXRlcklkZW50aXR5CisrCU1JUC1Ib21lLUFnZW50LUhvc3QJCQkzNDgJNDAwNAkJR3JvdXBlZAorKwlNSVA2LUhvbWUtTGluay1QcmVmaXgJCQkxMjUJNTQ0NwkJT2N0ZXRTdHJpbmcKKwlNSVA2LUFnZW50LUluZm8JCQkJNDg2CTU0NDcJCUdyb3VwZWQKKwlVc2VyLU5hbWUJCQkJMQkzNTg4CQlVVEY4U3RyaW5nCisJU2VydmljZS1TZWxlY3Rpb24JCQk0OTMJNTc3OAkJVVRGOFN0cmluZworKwlNSVAtUmVwbGF5LU1vZGUJCQkJMzQ2CTQwMDQJCUVudW1lcmF0ZWQKKysJTUlQLUFsZ29yaXRobS1UeXBlCQkJMzQ1CTQwMDQJCUVudW1lcmF0ZWQKKysJTUlQLU1OLUhBLVNQSQkJCQk0OTEJNTc3OAkJVW5zaWduZWQzMgorKwlNSVAtTVNBLUxpZmV0aW1lCQkJMzY3CTQwMDQJCVVuc2lnbmVkMzIKKysJTUlQLVNlc3Npb24tS2V5CQkJCTM0Mwk0MDA0CQlPY3RldFN0cmluZworCU1JUC1NTi1IQS1NU0EJCQkJNDkyCTU3NzgJCUdyb3VwZWQJCQlkaWZmZXJlbnQgZnJvbSBNSVAtTU4tdG8tSEEtTVNBICgzMzEpCisJQ2hhcmdlYWJsZS1Vc2VyLUlkZW50aXR5CQk4OQk1Nzc4CQlPY3RldFN0cmluZworCitRb1MgQVZQcyAoUkZDIDU3NzcgLSBpbXBsZW1lbnRlZCBpbiB0aGUgY29ycmVzcG9uZGluZyBkaWN0aW9uYXJ5KQorCisJUW9TLUNhcGFiaWxpdHkJCQkJNTc4CTU3NzcJCUdyb3VwZWQKKwlRb1MtUmVzb3VyY2VzCQkJCTUwOAk1Nzc3CQlHcm91cGVkCisKK0FDQ09VTlRJTkcgQVZQcyAoc2VjdGlvbiA2LjIxKQorCisJQWNjb3VudGluZy1JbnB1dC1PY3RldHMJCQkzNjMJNDAwNCwgNDAwNQlVbnNpZ25lZDY0CisJQWNjb3VudGluZy1PdXRwdXQtT2N0ZXRzCQkzNjQJNDAwNCwgNDAwNQlVbnNpZ25lZDY0CisJQWNjb3VudGluZy1JbnB1dC1QYWNrZXRzCQkzNjUJNDAwNCwgNDAwNQlVbnNpZ25lZDY0CisJQWNjb3VudGluZy1PdXRwdXQtUGFja2V0cwkJMzY2CTQwMDQsIDQwMDUJVW5zaWduZWQ2NAorCUFjY3QtTXVsdGktU2Vzc2lvbi1JZAkJCTUwCTM1ODgJCVVURjhTdHJpbmcKKwlBY2N0LVNlc3Npb24tVGltZQkJCTQ2CTI4NjYsIDQwMDQJVW5zaWduZWQzMgorCU1JUDYtRmVhdHVyZS1WZWN0b3IJCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJTUlQLU1vYmlsZS1Ob2RlLUFkZHJlc3MJCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJTUlQNi1BZ2VudC1JbmZvCQkJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlDaGFyZ2VhYmxlLVVzZXItSWRlbnRpdHkJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlTZXJ2aWNlLVNlbGVjdGlvbgkJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlRb1MtUmVzb3VyY2VzCQkJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlRb1MtQ2FwYWJpbGl0eQkJCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJTUlQLUNhcmVvZi1BZGRyZXNzCQkJNDg3CTU3NzgJCUFkZHJlc3MJCQluZWVkZWQgKGFwcGVhcnMgaW4gTUlSL01JQSkKKworUkVTVCBPRiBUSEUgQVZQcyBJTiBUSEUgTUlSICYgTUlBIEVYQ0xVRElORyAqW0FWUF0gKGFzIHdyaXR0ZW4gb24gcGFnZSAxOSBvZiBSRkMgNTc3OCkKKworTUlQNi1SZXF1ZXN0CisKKwlTZXNzaW9uLUlECQkJCTI2MwkzNTg4CisJQXV0aC1BcHBsaWNhdGlvbi1JZAkJCTI1OAkzNTg4CisJVXNlci1OYW1lCQkJCTEJMzU4OAorCURlc3RpbmF0aW9uLVJlYWxtCQkJMjgzCTM1ODgKKwlPcmlnaW4tSG9zdAkJCQkyNjQJMzU4OAorCU9yaWdpbi1SZWFsbQkJCQkyOTYJMzU4OAorCUF1dGgtUmVxdWVzdC1UeXBlCQkJMjc0CTM1ODgKKwlPcmlnaW4tU3RhdGUtSWQJCQkJMjc4CTM1ODgKKwlOQVMtSWRlbnRpZmllcgkJCQkzMgkyODY1CQlyYWRpdXMgKHNlZSBhdnApICAgICAgICBuZWVkZWQgKHJhZGl1cykKKwlOQVMtSVAtQWRkcmVzcwkJCQk0CTI4NjUgICAgICAgICAgICByYWRpdXMgKHNlZSBhdnApICAgICAgICBuZWVkZWQgKHJhZGl1cykKKwlOQVMtSVB2Ni1BZGRyZXNzCQkJOTUJMzE2MiAgICAgICAgICAgIHJhZGl1cyAoc2VlIGF2cCkgICAgICAgIG5lZWRlZCAocmFkaXVzKQorCU5BUy1Qb3J0LVR5cGUJCQkJNjEJMjg2NSAgICAgICAgICAgIHJhZGl1cyAoc2VlIGF2cCkgCW5lZWRlZCAocmFkaXVzKQorCUNhbGxlZC1TdGF0aW9uLUlkCQkJMzAJMjg2NSAgICAgICAgICAgIHJhZGl1cyAoc2VlIGF2cCkgCW5lZWRlZCAocmFkaXVzKQorCUNhbGxpbmctU3RhdGlvbi1JZAkJCTMxCTI4NjUgICAgICAgICAgICByYWRpdXMgKHNlZSBhdnApICAJbmVlZGVkIChyYWRpdXMpCisJTUlQNi1GZWF0dXJlLVZlY3RvcgkJCS0tLS0tLS0tLS0tLQorCU1JUDYtQXV0aC1Nb2RlCQkJCTQ5NAk1Nzc4CQlFbnVtZXJhdGVkCQluZWVkZWQgKG1pcDZhKQorCU1JUC1NTi1BQUEtU1BJCQkJCTM0MQk1Nzc4CQlVbnNpZ25lZDMyCQluZWVkZWQgKG1pcDZhKQorCU1JUC1NTi1IQS1TUEkJCQkJLS0tLS0tLS0tLS0tCisJTUlQLU1vYmlsZS1Ob2RlLUFkZHJlc3MJCQktLS0tLS0tLS0tLS0KKwlNSVA2LUFnZW50LUluZm8JCQkJLS0tLS0tLS0tLS0tCisJTUlQLUNhcmVvZi1BZGRyZXNzCQkJLS0tLS0tLS0tLS0tCisJTUlQLUF1dGhlbnRpY2F0b3IJCQk0ODgJNTc3OAkJT2N0ZXRTdHJpbmcJCW5lZWRlZCAobWlwNmEpCisJTUlQLU1BQy1Nb2JpbGl0eS1EYXRhCQkJNDg5CTU3NzgJCU9jdGV0U3RyaW5nCQluZWVkZWQgKG1pcDZhKQorCU1JUC1UaW1lc3RhbXAJCQkJNDkwCTU3NzgJCU9jdGV0U3RyaW5nCQluZWVkZWQgKG1pcDZhKQorCVFvUy1DYXBhYmlsaXR5CQkJCS0tLS0tLS0tLS0tLQorCVFvUy1SZXNvdXJjZXMJCQkJLS0tLS0tLS0tLS0tCisJQ2hhcmdlYWJsZS1Vc2VyLUlkZW50aXR5CQktLS0tLS0tLS0tLS0KKwlTZXJ2aWNlLVNlbGVjdGlvbgkJCS0tLS0tLS0tLS0tLQorCUF1dGhvcml6YXRpb24tTGlmZXRpbWUJCQkyOTEJMzU4OAorCUF1dGgtU2Vzc2lvbi1TdGF0ZQkJCTI3NwkzNTg4CisJUHJveHktSW5mbwkJCQkyODQJMzU4OAorCVJvdXRlLVJlY29yZAkJCQkyODIJMzU4OAorCitNSVA2LUFuc3dlciAtIEFsbCBvZiB0aGVtIGFyZSBhbHJlYWR5IGltcGxlbWVudGVkIGFzIGJhc2UgcHJvdG9jb2wgQVZQcyBvciBpbXBsZW1lbnRlZCBlYXJsaWVyLgorCisqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgkJCQkJCQkJCQkJCQkJCQkJKgorKiBUaGlzIHRhYmxlIGlzIGEgY29weSBvZiB0aGUgcmVnaXN0cnkgbmFtZWQgIk1JUDYgQXV0aGVudGljYXRpb24gTW9kZSBSZWdpc3RyeSIgYW5kIG1hbmFnZWQgYnkgSUFOQS4JCQkJCSoKKyogc291cmNlIDogaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9hYWEtcGFyYW1ldGVycy9hYWEtcGFyYW1ldGVycy50eHQJCQkJCQkJCSoKKyogdXAgdG8gZGF0ZSBvbiBvY3RvYmVyIDIwMTAJCQkJCQkJCQkJCQkJCSoKKyoJCQkJCQkJCQkJCQkJCQkJCSoKKyogICAgICBWYWx1ZSAgICAgICAgICBUb2tlbiAgICAgICBSZWZlcmVuY2UJCQkJCQkJCQkJCQkqCisqICAgICAgICAwICAgICAgIFJlc2VydmVkICAgICAgICAgW1JGQzU3NzhdCQkJCQkJCQkJCQkJKgorKiAgICAgICAgMSAgICAgICBNSVA2X0FVVEhfTU5fQUFBIFtSRkM1Nzc4XQkJCQkJCQkJCQkJCSoKKyogICAyLTQyOTQ5NjcyOTUgVW5hc3NpZ25lZAkJCQkJCQkJCQkJCQkJKgorKgkJCQkJCQkJCQkJCQkJCQkJKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKgorCitOT1RFUworCitjaGVjayBmb3Igb21pc3Npb25zICEKKworKi8KKworI2luY2x1ZGUgPGZyZWVEaWFtZXRlci9leHRlbnNpb24uaD4KKworI2RlZmluZSBDSEVDS19kaWN0X25ldyggX3R5cGUsIF9kYXRhLCBfcGFyZW50LCBfcmVmICkJXAorCUNIRUNLX0ZDVCggIGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIChfdHlwZSksIChfZGF0YSksIChfcGFyZW50KSwgKF9yZWYpKSAgKTsKKworI2RlZmluZSBDSEVDS19kaWN0X3NlYXJjaCggX3R5cGUsIF9jcml0ZXJpYSwgX3doYXQsIF9yZXN1bHQgKQlcCisJQ0hFQ0tfRkNUKCAgZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgKF90eXBlKSwgKF9jcml0ZXJpYSksIChfd2hhdCksIChfcmVzdWx0KSwgRU5PRU5UKSApOworCitzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiB7CisJY2hhciAJCQkqYXZwX25hbWU7CisJZW51bSBydWxlX3Bvc2l0aW9uCXBvc2l0aW9uOworCWludCAJCQltaW47CisJaW50CQkJbWF4OworfTsKKworI2RlZmluZSBSVUxFX09SREVSKCBfcG9zaXRpb24gKSAoKCgoX3Bvc2l0aW9uKSA9PSBSVUxFX0ZJWEVEX0hFQUQpIHx8ICgoX3Bvc2l0aW9uKSA9PSBSVUxFX0ZJWEVEX1RBSUwpKSA/IDEgOiAwICkKKworI2RlZmluZSBQQVJTRV9sb2NfcnVsZXMoIF9ydWxlYXJyYXksIF9wYXJlbnQpIHsJCQkJCQkJCVwKKwlpbnQgX19hcjsJCQkJCQkJCQkJCVwKKwlmb3IgKF9fYXI9MDsgX19hciA8IHNpemVvZihfcnVsZWFycmF5KSAvIHNpemVvZigoX3J1bGVhcnJheSlbMF0pOyBfX2FyKyspIHsJCQlcCisJCXN0cnVjdCBkaWN0X3J1bGVfZGF0YSBfX2RhdGEgPSB7IE5VTEwsIAkJCQkJCQlcCisJCQkoX3J1bGVhcnJheSlbX19hcl0ucG9zaXRpb24sCQkJCQkJCVwKKwkJCTAsIAkJCQkJCQkJCQlcCisJCQkoX3J1bGVhcnJheSlbX19hcl0ubWluLAkJCQkJCQkJXAorCQkJKF9ydWxlYXJyYXkpW19fYXJdLm1heH07CQkJCQkJCVwKKwkJX19kYXRhLnJ1bGVfb3JkZXIgPSBSVUxFX09SREVSKF9fZGF0YS5ydWxlX3Bvc2l0aW9uKTsJCQkJCVwKKwkJQ0hFQ0tfRkNUKCAgZmRfZGljdF9zZWFyY2goIAkJCQkJCQkJXAorCQkJZmRfZ19jb25maWctPmNuZl9kaWN0LAkJCQkJCQkJXAorCQkJRElDVF9BVlAsIAkJCQkJCQkJCVwKKwkJCUFWUF9CWV9OQU1FLCAJCQkJCQkJCQlcCisJCQkoX3J1bGVhcnJheSlbX19hcl0uYXZwX25hbWUsIAkJCQkJCQlcCisJCQkmX19kYXRhLnJ1bGVfYXZwLCAwICkgKTsJCQkJCQkJXAorCQlpZiAoICFfX2RhdGEucnVsZV9hdnAgKSB7CQkJCQkJCQlcCisJCQlUUkFDRV9ERUJVRyhJTkZPLCAiQVZQIE5vdCBmb3VuZDogJyVzJyIsIChfcnVsZWFycmF5KVtfX2FyXS5hdnBfbmFtZSApOwkJXAorCQkJcmV0dXJuIEVOT0VOVDsJCQkJCQkJCQlcCisJCX0JCQkJCQkJCQkJCVwKKwkJQ0hFQ0tfRkNUX0RPKCBmZF9kaWN0X25ldyggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1JVTEUsICZfX2RhdGEsIF9wYXJlbnQsIE5VTEwpLAlcCisJCQl7CQkJCQkJCSAgICAgICAgCQlcCisJCQkJVFJBQ0VfREVCVUcoSU5GTywgIkVycm9yIG9uIHJ1bGUgd2l0aCBBVlAgJyVzJyIsICAgICAgCQkJXAorCQkJCQkgKF9ydWxlYXJyYXkpW19fYXJdLmF2cF9uYW1lICk7CQkgICAgICAJCQlcCisJCQkJcmV0dXJuIEVJTlZBTDsJCQkJCSAgICAgIAkJCVwKKwkJCX0gKTsJCQkJCQkJICAgICAgCQkJXAorCX0JCQkJCQkJCQkgICAgICAJCQlcCit9CisKKyNkZWZpbmUgZW51bXZhbF9kZWZfdTMyKCBfdmFsXywgX3N0cl8gKSBcCisJCXsgX3N0cl8sIAkJeyAudTMyID0gX3ZhbF8gfX0KKworI2RlZmluZSBlbnVtdmFsX2RlZl9vcyggX2xlbl8sIF92YWxfLCBfc3RyXyApIFwKKwkJeyBfc3RyXywgCQl7IC5vcyA9IHsgLmRhdGEgPSAodW5zaWduZWQgY2hhciAqKV92YWxfLCAubGVuID0gX2xlbl8gfX19CisKKworCisvKiBEZWZpbmVzIGlmIHRoZXJlIGFyZSBhbnkgKi8KKworLy9OZXcgUmVzdWx0LUNvZGUgZm9yIE1JUCAoUkZDNTc3OCwgU2VjdGlvbiA3LiopCisjZGVmaW5lIERJQU1FVEVSX1NVQ0NFU1NfUkVMT0NBVEVfSEEgMjAwOQorI2RlZmluZSBESUFNRVRFUl9FUlJPUl9NSVA2X0FVVEhfTU9ERSA1MDQxCisKKy8vb3RoZXJzCisjZGVmaW5lIE1JUDZfQVVUSF9NTl9BQUEgMQorCisvKiBEaWN0aW9uYXJ5ICovCisKK2ludCBkaWN0X21pcDZpX2luaXQoY2hhciAqIGNvbmZmaWxlKQoreworCXN0cnVjdCBkaWN0X29iamVjdCAqIG1pcDZpOworCXsKKwkJc3RydWN0IGRpY3RfYXBwbGljYXRpb25fZGF0YSBkYXRhICA9IHsgCTcsICJEaWFtZXRlciBNb2JpbGUgSVB2NiBJS0UgKE1JUDZJKSBBcHBsaWNhdGlvbiIgfTsKKwkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVBQTElDQVRJT04sICZkYXRhICwgTlVMTCwgJm1pcDZpKTsKKwl9CisKKwkvKioqKioqKioqKioqKioqLworCS8qIEFWUCBzZWN0aW9uICovCisJLyoqKioqKioqKioqKioqKi8KKwl7CisJCS8qIExvYWRpbmcgYWxsIHRoZSBkZXJpdmVkIGRhdGEgZm9ybWF0cyAqLworCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIEFkZHJlc3NfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogVVRGOFN0cmluZ190eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBEaWFtZXRlcklkZW50aXR5X3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIERpYW1ldGVyVVJJX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIFRpbWVfdHlwZTsKKworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJBZGRyZXNzIiwgJkFkZHJlc3NfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIlVURjhTdHJpbmciLCAmVVRGOFN0cmluZ190eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiRGlhbWV0ZXJJZGVudGl0eSIsICZEaWFtZXRlcklkZW50aXR5X3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJEaWFtZXRlclVSSSIsICZEaWFtZXRlclVSSV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiVGltZSIsICZUaW1lX3R5cGUpOworCisJCS8qIE1JUDYtRmVhdHVyZS1WZWN0b3IgLSBSRkMgNTQ0NyAqLworCQl7CisJCQkvKgorCisJCQkqLworCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCQkxMjQsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiTUlQNi1GZWF0dXJlLVZlY3RvciIsIAkJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9VTlNJR05FRDY0CQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsIE5VTEwpOworCQl9CisKKwkJLyogTUlQLU1vYmlsZS1Ob2RlLUFkZHJlc3MgLSBSRkMgNDAwNCAqLworCQl7CisJCQkvKgorCisJCQkqLworCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCQkzMzMsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiTUlQLU1vYmlsZS1Ob2RlLUFkZHJlc3MiLAkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIEFkZHJlc3NfdHlwZSwgTlVMTCk7CisJCX0KKworCQkvKiBNSVAtSG9tZS1BZ2VudC1BZGRyZXNzIC0gUkZDIDQwMDQgKi8KKwkJeworCQkJLyoKKworCQkJKi8KKworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkJMzM0LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIk1JUC1Ib21lLUFnZW50LUFkZHJlc3MiLAkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIEFkZHJlc3NfdHlwZSwgTlVMTCk7CisJCX0KKworCQkvKiBEZXN0aW5hdGlvbi1Ib3N0IC0gQmFzZSBQcm90b2NvbCAqLworCisJCQkvKgorCQkJSW1wbGVtZW50ZWQgaW4gdGhlIGJhc2UgcHJvdG9jb2wKKwkJCSovCisKKwkJLyogRGVzdGluYXRpb24tUmVhbG0gLSBCYXNlIFByb3RvY29sICovCisKKwkJCS8qCisJCQlJbXBsZW1lbnRlZCBpbiB0aGUgYmFzZSBwcm90b2NvbAorCQkJKi8KKworCQkvKiBNSVAtSG9tZS1BZ2VudC1Ib3N0IC0gUkZDIDQwMDQgKi8KKwkJeworCQkJLyoKKworCQkJKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJCTM0OCwgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJNSVAtSG9tZS1BZ2VudC1Ib3N0IiwJCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCSAJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfR1JPVVBFRCAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCisJCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJCQkJCXsgCSB7ICAiRGVzdGluYXRpb24tUmVhbG0iLAlSVUxFX1JFUVVJUkVELAktMSwgMSB9CisJCQkJCQkJLHsgICJEZXN0aW5hdGlvbi1Ib3N0IiwJCVJVTEVfUkVRVUlSRUQsCS0xLCAxIH0KKwkJCQkJCX07CisKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCQl9CisKKwkJLyogTUlQNi1Ib21lLUxpbmstUHJlZml4IC0gUkZDIDU0NDcgKi8KKwkJeworCQkJLyoKKworCQkJKi8KKworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkJMTI1LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIk1JUDYtSG9tZS1MaW5rLVByZWZpeCIsIAkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsIE5VTEwpOworCQl9CisKKwkJLyogTUlQNi1BZ2VudC1JbmZvIC0gUkZDIDU0NDcgKi8KKwkJeworCQkJLyoKKworCQkJKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJCTQ4NiwgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJNSVA2LUFnZW50LUluZm8iLAkJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9HUk9VUEVEIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisKKwkJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQkJCQkJeyAJIHsgICJNSVAtSG9tZS1BZ2VudC1BZGRyZXNzIiwgCQlSVUxFX09QVElPTkFMLCAtMSwgMiB9CisJCQkJCQkJLHsgICJNSVAtSG9tZS1BZ2VudC1Ib3N0IiwJCVJVTEVfT1BUSU9OQUwsIC0xLCAxIH0KKwkJCQkJCQkseyAgIk1JUDYtSG9tZS1MaW5rLVByZWZpeCIsCQlSVUxFX09QVElPTkFMLCAtMSwgMSB9CisJCQkJCQl9OworCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkJfQorCisJCS8qIFVzZXItTmFtZSAtIFJGQyAzNTg4ICovCisKKwkJCS8qCisJCQlJbXBsZW1lbnRlZCBpbiB0aGUgYmFzZSBwcm90b2NvbAorCQkJKi8KKworCQkvKiBTZXJ2aWNlLVNlbGVjdGlvbiAtIFJGQyA1Nzc4ICovCisJCXsKKwkJCS8qCisKKwkJCSovCisKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJCTQ5MywgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJTZXJ2aWNlLVNlbGVjdGlvbiIsCQkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9CisKKwkJLyogTUlQLVJlcGxheS1Nb2RlIC0gUkZDIDU3NzggKi8KKwkJeworCQkJLyoKKworCQkJKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAJKiAJdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgCXRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsCSJFbnVtZXJhdGVkKE1JUC1SZXBsYXktTW9kZSkiCSwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIAl0XzEgPSB7ICJOb25lIiwJCXsgLmkzMiA9IDEgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgCXRfMiA9IHsgIlRpbWVzdGFtcCIsIAl7IC5pMzIgPSAyIH19OworCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSAJZGF0YSA9IHsKKwkJCQkJMzQ2LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIk1JUC1SZXBsYXktTW9kZSIsCQkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfSU5URUdFUjMyIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhICwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSAsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiAsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIHR5cGUsIE5VTEwpOworCQl9CisKKwkJLyogTUlQLUFsZ29yaXRobS1UeXBlIC0gUkZDIDU3NzggKi8KKwkJeworCQkJLyoKKwkJCVRoZSBNSVAtQWxnb3JpdGhtLVR5cGUgQVZQIChBVlAgQ29kZSAzNDUpIGlzIG9mIHR5cGUgRW51bWVyYXRlZCBhbmQKKwkJCWNvbnRhaW5zIHRoZSBBbGdvcml0aG0gaWRlbnRpZmllciBmb3IgdGhlIGFzc29jaWF0ZWQgTW9iaWxlIElQdjYKKwkJCU1OLUhBIEF1dGhlbnRpY2F0aW9uIE9wdGlvbi4gIFRoZSBEaWFtZXRlciBzZXJ2ZXIgc2VsZWN0cyB0aGUKKwkJCWFsZ29yaXRobSB0eXBlLiAgRXhpc3RpbmcgYWxnb3JpdGhtIHR5cGVzIGFyZSBkZWZpbmVkIGluIFtSRkM0MDA0XQorCQkJdGhhdCBhbHNvIGZ1bGZpbGwgY3VycmVudCBSRkMgNDI4NSByZXF1aXJlbWVudHMuIFRoaXMgQVZQIGlzIHJldXNlZAorCQkJZnJvbSBbUkZDNDAwNF0uCisJCQkqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0IAkqIAl0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSAJdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwJIkVudW1lcmF0ZWQoTUlQLUFsZ29yaXRobS1UeXBlKSIJLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgCXRfMiA9IHsgIkhNQUMtU0hBLTEgW0hNQUNdIiwJeyAuaTMyID0gMiB9fTsKKworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgCWRhdGEgPSB7CisJCQkJCTM0NSwgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJNSVAtQWxnb3JpdGhtLVR5cGUiLAkJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX0lOVEVHRVIzMiAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSAsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIgLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCB0eXBlLCBOVUxMKTsKKwkJfQorCisJCS8qIE1JUC1NTi1IQS1TUEkgLSBSRkMgNTc3OCAqLworCQl7CisJCQkvKgorCisJCQkqLworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkJNDkxLCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIk1JUC1NTi1IQS1TUEkiLAkJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9VTlNJR05FRDMyIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCBOVUxMKTsKKwkJfQorCisJCS8qIE1JUC1NU0EtTGlmZXRpbWUgLSBSRkMgNTc3OCAqLworCQl7CisJCQkvKgorCisJCQkqLworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkJMzY3LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIk1JUC1NU0EtTGlmZXRpbWUiLAkJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9VTlNJR05FRDMyIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCBOVUxMKTsKKwkJfQorCisJCS8qIE1JUC1TZXNzaW9uLUtleSAtIFJGQyA1Nzc4ICovCisJCXsKKwkJCS8qCisKKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCQkzNDMsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiTUlQLVNlc3Npb24tS2V5IiwJCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCSAJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsIE5VTEwpOworCQl9CisKKwkJLyogTUlQLU1OLUhBLU1TQSAtIFJGQyA1Nzc4ICovCisJCXsKKwkJCS8qCisKKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCQk0OTIsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiTUlQLU1OLUhBLU1TQSIsCQkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX0dST1VQRUQgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKworCQkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCQkJCQl7IAkgeyAgIk1JUC1TZXNzaW9uLUtleSIsIAkJUlVMRV9SRVFVSVJFRCwgLTEsIDEgfQorCQkJCQkJCSx7ICAiTUlQLU1TQS1MaWZldGltZSIsIAlSVUxFX1JFUVVJUkVELCAtMSwgMSB9CisJCQkJCQkJLHsgICJNSVAtTU4tSEEtU1BJIiwgCQlSVUxFX09QVElPTkFMLCAtMSwgMSB9CisJCQkJCQkJLHsgICJNSVAtQWxnb3JpdGhtLVR5cGUiLCAJUlVMRV9PUFRJT05BTCwgLTEsIDEgfQorCQkJCQkJCSx7ICAiTUlQLVJlcGxheS1Nb2RlIiwgCQlSVUxFX09QVElPTkFMLCAtMSwgMSB9CisJCQkJCQl9OworCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkJfQorCisJCS8qIENoYXJnZWFibGUtVXNlci1JZGVudGl0eSAtIFJGQyA1Nzc4ICovCisJCXsKKwkJCS8qCisKKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCQk4OSwgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJDaGFyZ2VhYmxlLVVzZXItSWRlbnRpdHkiLAkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCBOVUxMKTsKKwkJfQorCisJLy8vLy8vLy8vLy8vLy8KKwkvKiBRb1MgQVZQcyAqLworCS8vLy8vLy8vLy8vLy8vCisKKwkJLyogUW9TLUNhcGFiaWxpdHkgKi8KKworCQkJLyoKKwkJCUltcGxlbWVudGVkIGluIFJGQyA1Nzc3CisJCQkqLworCisJCS8qIFFvUy1SZXNvdXJjZXMgKi8KKworCQkJLyoKKwkJCUltcGxlbWVudGVkIGluIFJGQyA1Nzc3CisJCQkqLworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLyogQWNjb3VudGluZyBBVlBzICovCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwkJLyogQWNjb3VudGluZy1JbnB1dC1PY3RldHMgLSBSRkMgNDAwNCAqLworCQl7CisJCQkvKgorCisJCQkqLworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkJMzYzLCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIkFjY291bnRpbmctSW5wdXQtT2N0ZXRzIiwJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9VTlNJR05FRDY0IAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCBOVUxMKTsKKwkJfQorCisJCS8qIEFjY291bnRpbmctT3V0cHV0LU9jdGV0cyAtIFJGQyA0MDA0ICovCisJCXsKKwkJCS8qCisKKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCQkzNjQsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiQWNjb3VudGluZy1PdXRwdXQtT2N0ZXRzIiwJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9VTlNJR05FRDY0IAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCBOVUxMKTsKKwkJfQorCisJCS8qIEFjY291bnRpbmctSW5wdXQtUGFja2V0cyAtIFJGQyA0MDA0ICovCisJCXsKKwkJCS8qCisKKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCQkzNjUsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiQWNjb3VudGluZy1JbnB1dC1QYWNrZXRzIiwJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9VTlNJR05FRDY0IAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCBOVUxMKTsKKwkJfQorCisJCS8qIEFjY291bnRpbmctT3V0cHV0LVBhY2tldHMgLSBSRkMgNDAwNCAqLworCQl7CisJCQkvKgorCisJCQkqLworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkJMzY2LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIkFjY291bnRpbmctT3V0cHV0LVBhY2tldHMiLAkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX1VOU0lHTkVENjQgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsIE5VTEwpOworCQl9CisKKwkJLyogQWNjdC1NdWx0aS1TZXNzaW9uLUlkIC0gUkZDIDM1ODggKi8KKworCQkJLyoKKwkJCUltcGxlbWVudGVkIGluIHRoZSBiYXNlIHByb3RvY29sCisJCQkqLworCisJCS8qIEFjY3QtU2Vzc2lvbi1UaW1lIC0gUkZDIDQwMDQgKi8KKwkJeworCQkJLyoKKworCQkJKi8KKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJCTQ2LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIkFjY3QtU2Vzc2lvbi1UaW1lIiwJCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCSAJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfVU5TSUdORUQzMiAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgTlVMTCk7CisJCX0KKworCQkvKiBNSVAtQ2FyZW9mLUFkZHJlc3MgLSBSRkMgNTc3OCAqLworCQl7CisJCQkvKgorCQkJVGhpcyBBVlAgaXMgbmVlZGVkIGluIE1JUDZJIGF0IGxlYXN0IGZvciBpbXBsZW1lbnRhdGlvbiByZWFzb25zCisJCQkoaXQgYXBwZWFycyBpbiBhIGNvbW1hbmQpCisJCQkqLworCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCQk0ODcsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiTUlQLUNhcmVvZi1BZGRyZXNzIiwJCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCSAJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgQWRkcmVzc190eXBlLCBOVUxMKTsKKwkJfQorCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8qIFJhZGl1cyBBVlBzIHVzZWQgaW4gTUlSICYgTUlBICovCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJLyoKKwlXZSB1c2VkIHRoZSBmb2xsb3dpbmcgY29ycmVzcG9uZGVuY2VzIGZvciBkZXRlcm1pbmluZyB0aGUgdHlwZSBvZiB0aGUgUmFkaXVzIEFWUHMKKworCQlSYWRpdXMJCURpYW1ldGVyCisKKwkJdGV4dAkJVVRGOFN0aW5nCisJCXN0cmluZwkJT2N0ZXRTdHJpbmcKKwkJYWRkcmVzcwkJQWRkcmVzcworCQlpbnRlZ2VyCQlVbnNpZ25lZDMyCisJCXRpbWUJCVRpbWUKKwkqLworCisKKwkJLyogTkFTLUlkZW50aWZpZXIJCQkJMzIJMzU3NSAqLworCQl7CisJCQkvKgorCQkJc3RyaW5nIC0+IE9jdGV0U3RyaW5nCisJCQkqLworCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCQkzMiwgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJOQVMtSWRlbnRpZmllciIsCQkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsIE5VTEwpOworCQl9CisKKwkJLyogTkFTLUlQLUFkZHJlc3MJCQkJNAkzNTc1ICovCisJCXsKKwkJCS8qCisJCQlhZGRyZXNzIC0+IEFkZHJlc3MKKwkJCSovCisKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJCTQsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiTkFTLUlQLUFkZHJlc3MiLAkJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBBZGRyZXNzX3R5cGUsIE5VTEwpOworCQl9CisKKwkJLyogTkFTLUlQdjYtQWRkcmVzcwkJCTk1CTMxNjIgKi8KKwkJeworCQkJLyoKKwkJCWFkZHJlc3MgLT4gQWRkcmVzcworCQkJKi8KKworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkJOTUsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiTkFTLUlQdjYtQWRkcmVzcyIsCQkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIEFkZHJlc3NfdHlwZSwgTlVMTCk7CisJCX0KKworCQkvKiBOQVMtUG9ydC1UeXBlCQkJNjEJMjg2NSAqLworCQl7CisJCQkvKgorCQkJaW50ZWdlciAtPiBVbnNpZ25lZDMyCisKKwkJCSAgIFZhbHVlCisKKwkJCSAgICAgIFRoZSBWYWx1ZSBmaWVsZCBpcyBmb3VyIG9jdGV0cy4gICJWaXJ0dWFsIiByZWZlcnMgdG8gYSBjb25uZWN0aW9uCisJCQkgICAgICB0byB0aGUgTkFTIHZpYSBzb21lIHRyYW5zcG9ydCBwcm90b2NvbCwgaW5zdGVhZCBvZiB0aHJvdWdoIGEKKwkJCSAgICAgIHBoeXNpY2FsIHBvcnQuICBGb3IgZXhhbXBsZSwgaWYgYSB1c2VyIHRlbG5ldHRlZCBpbnRvIGEgTkFTIHRvCisJCQkgICAgICBhdXRoZW50aWNhdGUgaGltc2VsZiBhcyBhbiBPdXRib3VuZC1Vc2VyLCB0aGUgQWNjZXNzLVJlcXVlc3QgbWlnaHQKKwkJCSAgICAgIGluY2x1ZGUgTkFTLVBvcnQtVHlwZSA9IFZpcnR1YWwgYXMgYSBoaW50IHRvIHRoZSBSQURJVVMgc2VydmVyCisJCQkgICAgICB0aGF0IHRoZSB1c2VyIHdhcyBub3Qgb24gYSBwaHlzaWNhbCBwb3J0LgorCisJCQkgICAgICAwICAgICAgIEFzeW5jCisJCQkgICAgICAxICAgICAgIFN5bmMKKwkJCSAgICAgIDIgICAgICAgSVNETiBTeW5jCisJCQkgICAgICAzICAgICAgIElTRE4gQXN5bmMgVi4xMjAKKwkJCSAgICAgIDQgICAgICAgSVNETiBBc3luYyBWLjExMAorCQkJICAgICAgNSAgICAgICBWaXJ0dWFsCisJCQkgICAgICA2ICAgICAgIFBJQUZTCisJCQkgICAgICA3ICAgICAgIEhETEMgQ2xlYXIgQ2hhbm5lbAorCQkJICAgICAgOCAgICAgICBYLjI1CisJCQkgICAgICA5ICAgICAgIFguNzUKKwkJCSAgICAgIDEwICAgICAgRy4zIEZheAorCQkJICAgICAgMTEgICAgICBTRFNMIC0gU3ltbWV0cmljIERTTAorCQkJICAgICAgMTIgICAgICBBRFNMLUNBUCAtIEFzeW1tZXRyaWMgRFNMLCBDYXJyaWVybGVzcyBBbXBsaXR1ZGUgUGhhc2UKKwkJCQkgICAgICBNb2R1bGF0aW9uCisJCQkgICAgICAxMyAgICAgIEFEU0wtRE1UIC0gQXN5bW1ldHJpYyBEU0wsIERpc2NyZXRlIE11bHRpLVRvbmUKKwkJCSAgICAgIDE0ICAgICAgSURTTCAtIElTRE4gRGlnaXRhbCBTdWJzY3JpYmVyIExpbmUKKwkJCSAgICAgIDE1ICAgICAgRXRoZXJuZXQKKwkJCSAgICAgIDE2ICAgICAgeERTTCAtIERpZ2l0YWwgU3Vic2NyaWJlciBMaW5lIG9mIHVua25vd24gdHlwZQorCQkJICAgICAgMTcgICAgICBDYWJsZQorCQkJICAgICAgMTggICAgICBXaXJlbGVzcyAtIE90aGVyCisJCQkgICAgICAxOSAgICAgIFdpcmVsZXNzIC0gSUVFRSA4MDIuMTEKKworCQkJICAgICAgUElBRlMgaXMgYSBmb3JtIG9mIHdpcmVsZXNzIElTRE4gY29tbW9ubHkgdXNlZCBpbiBKYXBhbiwgYW5kCisJCQkgICAgICBzdGFuZHMgZm9yIFBIUyAoUGVyc29uYWwgSGFuZHlwaG9uZSBTeXN0ZW0pIEludGVybmV0IEFjY2VzcyBGb3J1bQorCQkJICAgICAgU3RhbmRhcmQgKFBJQUZTKS4KKwkJCSovCisKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJCTYxLCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIk5BUy1Qb3J0LVR5cGUiLAkJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsIE5VTEwpOworCQl9CisKKwkJLyogQ2FsbGVkLVN0YXRpb24tSWQJCQkzMAkyODY1ICovCisJCXsKKwkJCS8qCisJCQlzdHJpbmcgLT4gT2N0ZXRTdHJpbmcKKwkJCSovCisKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJCTMwLCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIkNhbGxlZC1TdGF0aW9uLUlkIiwJCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCSAJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgTlVMTCk7CisJCX0KKwkJLyogQ2FsbGluZy1TdGF0aW9uLUlkCQkJMzEJMjg2NSAqLworCQl7CisJCQkvKgorCQkJc3RyaW5nIC0+IE9jdGV0U3RyaW5nCisJCQkqLworCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCQkzMSwgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJDYWxsaW5nLVN0YXRpb24tSWQiLAkJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCBOVUxMKTsKKwkJfQorCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvKiBSRVNUIE9GIFRIRSBBVlAgSU4gVEhFIE1JUiBBTkQgTUlBIEVYQ0xVRElORyAqW0FWUF0gICAqLworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwkJLyogTUlQNi1BdXRoLU1vZGUgLSBSRkMgNTc3OCAqLworCQl7CisJCQkvKgorCisJCQkqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogCSB0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhIAkgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIkVudW1lcmF0ZWQoTUlQNi1BdXRoLU1vZGUpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIHRfMCA9IHsgIk5vbmUiLCAJeyAuaTMyID0gTUlQNl9BVVRIX01OX0FBQSB9fTsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJCTQ5NCwgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJNSVA2LUF1dGgtTW9kZSIsCQkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX0lOVEVHRVIzMiAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhICwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMCAsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIHR5cGUsIE5VTEwpOworCQl9CisKKwkJLyogTUlQLU1OLUFBQS1TUEkgLSBSRkMgNTc3OCAqLworCQl7CisJCQkvKgorCisJCQkqLworCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCQkzNDEsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiTUlQLU1OLUFBQS1TUEkiLAkJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9VTlNJR05FRDMyIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCBOVUxMKTsKKwkJfQorCisJCS8qIE1JUC1BdXRoZW50aWNhdG9yIC0gUkZDIDU3NzggKi8KKwkJeworCQkJLyoKKworCQkJKi8KKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJCTQ4OCwgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJNSVAtQXV0aGVudGljYXRvciIsCQkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCBOVUxMKTsKKwkJfQorCisJCS8qIE1JUC1NQUMtTW9iaWxpdHktRGF0YSAtIFJGQyA1Nzc4ICovCisJCXsKKwkJCS8qCisKKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCQk0ODksIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiTUlQLU1BQy1Nb2JpbGl0eS1EYXRhIiwJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORyAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgTlVMTCk7CisJCX0KKworCQkvKiBNSVAtVGltZXN0YW1wIC0gUkZDIDU3NzggKi8KKwkJeworCQkJLyoKKworCQkJKi8KKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJCTQ5MCwgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJNSVAtVGltZXN0YW1wIiwJCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCSAJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsIE5VTEwpOworCQl9CisJfQorCisvKioqKioqKioqKioqKioqKioqKi8KKy8qIENvbW1hbmQgc2VjdGlvbiAqLworLyoqKioqKioqKioqKioqKioqKiovCisKKwl7CisJCS8qIERpYW1ldGVyLUVBUC1SZXF1ZXN0IChERVIpICovCisKKwkJCS8qCisJCQlEZWZpbmVkIGluIGRpY3RfZWFwCisJCQkqLworCisJCS8qIERpYW1ldGVyLUVBUC1BbnN3ZXIgKERFQSkgLSBDT1BJRUQgRlJPTSBkaWN0X2VhcC5jLCBTRUUgSVQgRk9SIE1PUkUgUkVGRVJFTkNFICovCisKKwkJCS8qCisJCQlEZWZpbmVkIGluIGRpY3RfZWFwCisJCQkqLworCisJCS8qIE1JUDYtUmVxdWVzdCAoTUlSKSAqLworCQl7CisJCQkvKgorCisJCQlUaGUgTUlQNi1SZXF1ZXN0IChNSVIpLCBpbmRpY2F0ZWQgYnkgdGhlIENvbW1hbmQtQ29kZSBmaWVsZCBzZXQgdG8KKwkJCTMyNSBhbmQgdGhlICdSJyBiaXQgc2V0IGluIHRoZSBDb21tYW5kIEZsYWdzIGZpZWxkLCBpcyBzZW50IGJ5IHRoZQorCQkJSEEsIGFjdGluZyBhcyBhIERpYW1ldGVyIGNsaWVudCwgaW4gb3JkZXIgdG8gcmVxdWVzdCB0aGUKKwkJCWF1dGhlbnRpY2F0aW9uIGFuZCBhdXRob3JpemF0aW9uIG9mIGFuIE1OLgorCisJCQlBbHRob3VnaCB0aGUgSEEgcHJvdmlkZXMgdGhlIERpYW1ldGVyIHNlcnZlciB3aXRoIHJlcGxheSBwcm90ZWN0aW9uLQorCQkJcmVsYXRlZCBpbmZvcm1hdGlvbiwgdGhlIEhBIGlzIHJlc3BvbnNpYmxlIGZvciB0aGUgcmVwbGF5IHByb3RlY3Rpb24uCisKKwkJCVRoZSBtZXNzYWdlIGZvcm1hdCBpcyBzaG93biBiZWxvdy4KKworCQkJPE1JUDYtUmVxdWVzdD4gOjo9IDwgRGlhbWV0ZXIgSGVhZGVyOiAzMjUsIFJFUSwgUFhZID4KKwkJCQkJICAgPCBTZXNzaW9uLUlEID4KKwkJCQkJICAgeyBBdXRoLUFwcGxpY2F0aW9uLUlkIH0KKwkJCQkJICAgeyBVc2VyLU5hbWUgfQorCQkJCQkgICB7IERlc3RpbmF0aW9uLVJlYWxtIH0KKwkJCQkJICAgeyBPcmlnaW4tSG9zdCB9CisJCQkJCSAgIHsgT3JpZ2luLVJlYWxtIH0KKwkJCQkJICAgeyBBdXRoLVJlcXVlc3QtVHlwZSB9CisJCQkJCSAgIFsgRGVzdGluYXRpb24tSG9zdCBdCisJCQkJCSAgIFsgT3JpZ2luLVN0YXRlLUlkIF0KKwkJCQkJICAgWyBOQVMtSWRlbnRpZmllciBdCisJCQkJCSAgIFsgTkFTLUlQLUFkZHJlc3MgXQorCQkJCQkgICBbIE5BUy1JUHY2LUFkZHJlc3MgXQorCQkJCQkgICBbIE5BUy1Qb3J0LVR5cGUgXQorCQkJCQkgICBbIENhbGxlZC1TdGF0aW9uLUlkIF0KKwkJCQkJICAgWyBDYWxsaW5nLVN0YXRpb24tSWQgXQorCQkJCQkgICBbIE1JUDYtRmVhdHVyZS1WZWN0b3IgXQorCQkJCQkgICB7IE1JUDYtQXV0aC1Nb2RlIH0KKwkJCQkJICAgWyBNSVAtTU4tQUFBLVNQSSBdCisJCQkJCSAgIFsgTUlQLU1OLUhBLVNQSSBdCisJCQkJCTEqMnsgTUlQLU1vYmlsZS1Ob2RlLUFkZHJlc3MgfQorCQkJCQkgICB7IE1JUDYtQWdlbnQtSW5mbyB9CisJCQkJCSAgIHsgTUlQLUNhcmVvZi1BZGRyZXNzIH0KKwkJCQkJICAgWyBNSVAtQXV0aGVudGljYXRvciBdCisJCQkJCSAgIFsgTUlQLU1BQy1Nb2JpbGl0eS1EYXRhIF0KKwkJCQkJICAgWyBNSVAtVGltZXN0YW1wIF0KKwkJCQkJICAgWyBRb1MtQ2FwYWJpbGl0eSBdCisJCQkJCSAqIFsgUW9TLVJlc291cmNlcyBdCisJCQkJCSAgIFsgQ2hhcmdlYWJsZS1Vc2VyLUlkZW50aXR5IF0KKwkJCQkJICAgWyBTZXJ2aWNlLVNlbGVjdGlvbiBdCisJCQkJCSAgIFsgQXV0aG9yaXphdGlvbi1MaWZldGltZSBdCisJCQkJCSAgIFsgQXV0aC1TZXNzaW9uLVN0YXRlIF0KKwkJCQkJICogWyBQcm94eS1JbmZvIF0KKwkJCQkJICogWyBSb3V0ZS1SZWNvcmQgXQorCQkJCQkgKiBbIEFWUCBdCisKKwkJCUlmIHRoZSBNTiBpcyBib3RoIGF1dGhlbnRpY2F0ZWQgYW5kIGF1dGhvcml6ZWQgZm9yIHRoZSBtb2JpbGl0eQorCQkJc2VydmljZSwgdGhlbiB0aGUgQXV0aC1SZXF1ZXN0LVR5cGUgQVZQIGlzIHNldCB0byB0aGUgdmFsdWUKKwkJCUFVVEhPUklaRV9BVVRIRU5USUNBVEUuICBUaGlzIGlzIHRoZSBjYXNlIHdoZW4gdGhlIE1JUDYtQXV0aC1Nb2RlIGlzCisJCQlzZXQgdG8gdGhlIHZhbHVlIE1JUDZfQVVUSF9NTl9BQUEuCisKKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBjbWQ7CisJCQlzdHJ1Y3QgZGljdF9jbWRfZGF0YSBkYXRhID0geworCQkJCQkzMjUsIAkJCQkJLyogQ29kZSAqLworCQkJCQkiTUlQNi1SZXF1ZXN0IiwgCQkJLyogTmFtZSAqLworCQkJCQlDTURfRkxBR19SRVFVRVNUIHwgQ01EX0ZMQUdfUFJPWElBQkxFIHwgQ01EX0ZMQUdfRVJST1IsIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlDTURfRkxBR19SRVFVRVNUIHwgQ01EX0ZMQUdfUFJPWElBQkxFIAkJCQkJCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCX07CisJCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJCQkJCXsgCSB7ICAiU2Vzc2lvbi1JZCIsIAkJCVJVTEVfRklYRURfSEVBRCwgLTEsIDEgfQorCQkJCQkJIAkseyAgIkF1dGgtQXBwbGljYXRpb24tSWQiLCAJCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiVXNlci1OYW1lIiwgCQkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJEZXN0aW5hdGlvbi1SZWFsbSIsIAkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJPcmlnaW4tSG9zdCIsIAkJCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiT3JpZ2luLVJlYWxtIiwgCQkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJBdXRoLVJlcXVlc3QtVHlwZSIsIAkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJEZXN0aW5hdGlvbi1Ib3N0IiwgCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIk9yaWdpbi1TdGF0ZS1JZCIsCSAJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiTkFTLUlkZW50aWZpZXIiLCAJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIk5BUy1JUC1BZGRyZXNzIiwgCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJOQVMtSVB2Ni1BZGRyZXNzIiwgCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIk5BUy1Qb3J0LVR5cGUiLCAJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkNhbGxlZC1TdGF0aW9uLUlkIiwgCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkNhbGxpbmctU3RhdGlvbi1JZCIsIAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJNSVA2LUZlYXR1cmUtVmVjdG9yIiwgCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIk1JUDYtQXV0aC1Nb2RlIiwgCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJNSVAtTU4tQUFBLVNQSSIsIAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiTUlQLU1OLUhBLVNQSSIsIAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiTUlQLU1vYmlsZS1Ob2RlLUFkZHJlc3MiLCAJCVJVTEVfT1BUSU9OQUwsICAgIDEsIDIgfQorCQkJCQkJCSx7ICAiTUlQNi1BZ2VudC1JbmZvIiwgCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJNSVAtQ2FyZW9mLUFkZHJlc3MiLCAJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiTUlQLUF1dGhlbnRpY2F0b3IiLCAJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiTUlQLU1BQy1Nb2JpbGl0eS1EYXRhIiwgCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIk1JUC1UaW1lc3RhbXAiLCAJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIlFvUy1DYXBhYmlsaXR5IiwgCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJRb1MtUmVzb3VyY2VzIiwgCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgLTEgfQorCQkJCQkJCSx7ICAiQ2hhcmdlYWJsZS1Vc2VyLUlkZW50aXR5IiwgCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiU2VydmljZS1TZWxlY3Rpb24iLCAJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiQXV0aG9yaXphdGlvbi1MaWZldGltZSIsIAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJBdXRoLVNlc3Npb24tU3RhdGUiLCAJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiUHJveHktSW5mbyIsIAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIC0xIH0KKwkJCQkJCQkseyAgIlJvdXRlLVJlY29yZCIsIAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIC0xIH0KKwkJCQkJCX07CisKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0NPTU1BTkQsICZkYXRhLCBtaXA2aSwgJmNtZCk7CisJCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBjbWQgKTsKKwkJfQorCisJCS8qIE1JUDYtQW5zd2VyIChNSUEpICovCisJCXsKKwkJCS8qCisKKwkJCVRoZSBNSVA2LUFuc3dlciAoTUlBKSBtZXNzYWdlLCBpbmRpY2F0ZWQgYnkgdGhlIENvbW1hbmQtQ29kZSBmaWVsZAorCQkJc2V0IHRvIDMyNSBhbmQgdGhlICdSJyBiaXQgY2xlYXJlZCBpbiB0aGUgQ29tbWFuZCBGbGFncyBmaWVsZCwgaXMKKwkJCXNlbnQgYnkgdGhlIERpYW1ldGVyIHNlcnZlciBpbiByZXNwb25zZSB0byB0aGUgTUlQNi1SZXF1ZXN0IG1lc3NhZ2UuCisKKwkJCVRoZSBVc2VyLU5hbWUgQVZQIE1BWSBiZSBpbmNsdWRlZCBpbiB0aGUgTUlBIGlmIGl0IGlzIHByZXNlbnQgaW4gdGhlCisJCQlNSVIuICBUaGUgUmVzdWx0LUNvZGUgQVZQIE1BWSBjb250YWluIG9uZSBvZiB0aGUgdmFsdWVzIGRlZmluZWQgaW4KKwkJCVNlY3Rpb24gNywgaW4gYWRkaXRpb24gdG8gdGhlIHZhbHVlcyBkZWZpbmVkIGluIFtSRkMzNTg4XS4KKworCQkJQW4gTUlBIG1lc3NhZ2Ugd2l0aCB0aGUgUmVzdWx0LUNvZGUgQVZQIHNldCB0byBESUFNRVRFUl9TVUNDRVNTIE1VU1QKKwkJCWluY2x1ZGUgdGhlIE1JUC1Nb2JpbGUtTm9kZS1BZGRyZXNzIEFWUC4KKworCQkJVGhlIG1lc3NhZ2UgZm9ybWF0IGlzIHNob3duIGJlbG93LgorCisJCQk8TUlQNi1BbnN3ZXI+IDo6PSA8IERpYW1ldGVyIEhlYWRlcjogMzI1LCBQWFkgPgorCQkJCQkgIDwgU2Vzc2lvbi1JZCA+CisJCQkJCSAgeyBBdXRoLUFwcGxpY2F0aW9uLUlkIH0KKwkJCQkJICB7IFJlc3VsdC1Db2RlIH0KKwkJCQkJICB7IE9yaWdpbi1Ib3N0IH0KKwkJCQkJICB7IE9yaWdpbi1SZWFsbSB9CisJCQkJCSAgeyBBdXRoLVJlcXVlc3QtVHlwZSB9CisJCQkJCSAgWyBVc2VyLU5hbWUgXQorCQkJCQkgIFsgQXV0aG9yaXphdGlvbi1MaWZldGltZSBdCisJCQkJCSAgWyBBdXRoLVNlc3Npb24tU3RhdGUgXQorCQkJCQkgIFsgRXJyb3ItTWVzc2FnZSBdCisJCQkJCSAgWyBFcnJvci1SZXBvcnRpbmctSG9zdCBdCisJCQkJCSAgWyBSZS1BdXRoLVJlcXVlc3QtVHlwZSBdCisJCQkJCSAgWyBNSVA2LUZlYXR1cmUtVmVjdG9yIF0KKwkJCQkJICBbIE1JUDYtQWdlbnQtSW5mbyBdCisJCQkJCSoyWyBNSVAtTW9iaWxlLU5vZGUtQWRkcmVzcyBdCisJCQkJCSAgWyBNSVAtTU4tSEEtTVNBIF0KKwkJCQkJKiBbIFFvUy1SZXNvdXJjZXMgXQorCQkJCQkgIFsgQ2hhcmdlYWJsZS1Vc2VyLUlkZW50aXR5IF0KKwkJCQkJICBbIFNlcnZpY2UtU2VsZWN0aW9uIF0KKwkJCQkJICBbIE9yaWdpbi1TdGF0ZS1JZCBdCisJCQkJCSogWyBQcm94eS1JbmZvIF0KKwkJCQkJKiBbIFJlZGlyZWN0LUhvc3QgXQorCQkJCQkgIFsgUmVkaXJlY3QtSG9zdC1Vc2FnZSBdCisJCQkJCSAgWyBSZWRpcmVjdC1NYXgtQ2FjaGUtVGltZSBdCisJCQkJCSogWyBGYWlsZWQtQVZQIF0KKwkJCQkJKiBbIEFWUCBdCisKKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBjbWQ7CisJCQlzdHJ1Y3QgZGljdF9jbWRfZGF0YSBkYXRhID0geworCQkJCQkzMjUsIAkJCQkJLyogQ29kZSAqLworCQkJCQkiTUlQNi1BbnN3ZXIiLCAJCQkJLyogTmFtZSAqLworCQkJCQlDTURfRkxBR19SRVFVRVNUIHwgQ01EX0ZMQUdfUFJPWElBQkxFIHwgQ01EX0ZMQUdfRVJST1IsIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlDTURfRkxBR19QUk9YSUFCTEUgCQkJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJfTsKKwkJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQkJCQkJeyAJIHsgICJTZXNzaW9uLUlkIiwgCQkJUlVMRV9GSVhFRF9IRUFELCAtMSwgMSB9CisJCQkJCQkgCSx7ICAiQXV0aC1BcHBsaWNhdGlvbi1JZCIsIAkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJSZXN1bHQtQ29kZSIsIAkJCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiT3JpZ2luLUhvc3QiLCAJCQlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIk9yaWdpbi1SZWFsbSIsIAkJCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiQXV0aC1SZXF1ZXN0LVR5cGUiLCAJCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiVXNlci1OYW1lIiwgCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJBdXRob3JpemF0aW9uLUxpZmV0aW1lIiwgCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkF1dGgtU2Vzc2lvbi1TdGF0ZSIsIAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJFcnJvci1NZXNzYWdlIiwgCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJFcnJvci1SZXBvcnRpbmctSG9zdCIsIAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJSZS1BdXRoLVJlcXVlc3QtVHlwZSIsIAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJNSVA2LUZlYXR1cmUtVmVjdG9yIiwgCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIk1JUDYtQWdlbnQtSW5mbyIsIAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiTUlQLU1vYmlsZS1Ob2RlLUFkZHJlc3MiLCAJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDIgfQorCQkJCQkJCSx7ICAiTUlQLU1OLUhBLU1TQSIsIAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiUW9TLVJlc291cmNlcyIsIAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIC0xIH0KKwkJCQkJCQkseyAgIkNoYXJnZWFibGUtVXNlci1JZGVudGl0eSIsCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIlNlcnZpY2UtU2VsZWN0aW9uIiwgCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIk9yaWdpbi1TdGF0ZS1JZCIsIAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiUHJveHktSW5mbyIsIAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIC0xIH0KKwkJCQkJCQkseyAgIlJlZGlyZWN0LUhvc3QiLCAJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAtMSB9CisJCQkJCQkJLHsgICJSZWRpcmVjdC1Ib3N0LVVzYWdlIiwgCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIlJlZGlyZWN0LU1heC1DYWNoZS1UaW1lIiwgCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkZhaWxlZC1BVlAiLCAJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAtMSB9CisJCQkJCQl9OworCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9DT01NQU5ELCAmZGF0YSwgbWlwNmksICZjbWQpOworCQkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgY21kICk7CisJCX0KKwl9CisKKwlMT0dfRCggIkRpY3Rpb25hcnkgRXh0ZW5zaW9uICdEaWFtZXRlciBNb2JpbGUgSVB2NiBJS0UgKE1JUDZJKScgaW5pdGlhbGl6ZWQiKTsKKwlyZXR1cm4gMDsKK30KK0VYVEVOU0lPTl9FTlRSWSgiZGljdF9taXA2aSIsIGRpY3RfbWlwNmlfaW5pdCwgImRpY3RfcmZjNTc3NyIpOwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X25hc19taXB2Ni9DTWFrZUxpc3RzLnR4dCBiL2V4dGVuc2lvbnMvZGljdF9uYXNfbWlwdjYvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE3ZTk0OAotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF9uYXNfbWlwdjYvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxMyBAQAorIyBUaGUgZGljdF9uYXNfbWlwdjYgZXh0ZW5zaW9uCitQUk9KRUNUKCJNSVB2NiBOQVMtdG8tSEFBQSBJbnRlcmFjdGlvbiBEaWN0aW9uYXJ5IERlZmluaXRpb24iIEMpCisKKyMgQ29tcGlsZSBhcyBhIG1vZHVsZQorRkRfQUREX0VYVEVOU0lPTihkaWN0X25hc19taXB2NiBkaWN0X25hc19taXB2Ni5jKQorCisKKyMjIyMKKyMjIElOU1RBTEwgc2VjdGlvbiAjIworCitJTlNUQUxMKFRBUkdFVFMgZGljdF9uYXNfbWlwdjYKKwlMSUJSQVJZIERFU1RJTkFUSU9OICR7SU5TVEFMTF9FWFRFTlNJT05TX1NVRkZJWH0KKwlDT01QT05FTlQgZnJlZURpYW1ldGVyLWRpY3Rpb25hcnktbWlwNikKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF9uYXNfbWlwdjYvZGljdF9uYXNfbWlwdjYuYyBiL2V4dGVuc2lvbnMvZGljdF9uYXNfbWlwdjYvZGljdF9uYXNfbWlwdjYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzhlNTk2Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kaWN0X25hc19taXB2Ni9kaWN0X25hc19taXB2Ni5jCkBAIC0wLDAgKzEsMjU4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogRnJhbmNvaXMgQmFyZCA8ZnJhbmNvaXNAdGVyYS5pY3Mua2Vpby5hYy5qcD4JCQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDEwLCBUZXJhb2thIExhYm9yYXRvcnksIEtlaW8gVW5pdmVyc2l0eQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFRlcmFva2EgTGFib3JhdG9yeSBub3IgdGhlIAkJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBUZXJhb2thIExhYm9yYXRvcnkgCQkJCQkJICoKKyogICAJCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKworVGhlIGZvbGxvd2luZyB0YWJsZSBsaXN0cyB0aGUgQVZQcyBuZWVkZWQgZm9yIHRoZSBOQVMgdG8gSEFBQSBzZXJ2ZXIgaW50ZXJhY3Rpb24uCitXZSB0cnkgdG8ga2VlcCB0aGUgc3RydWN0dXJlIG9mIHRoZSBncm91cGVkIEFWUCBieSBkZWNsYXJpbmcgdGhlIGNvbnRhaW5lZCBBVlBzIGp1c3QgYmVmb3JlIHRoZSBncm91cGVkIEFWUCB0aGV5IGRlcGVuZCBvbi4KK1RoZSBudW1iZXIgb2YgJysnIGluZGljYXRlcyB0aGUgZGVwdGggb2YgdGhlIGNvbnRhaW5lZCBBVlAuCisKK0RFUFRICU5BTUUJCQkJCUFWUCBDT0RFCVJGQwlUWVBFCQkJSU1QTEVNRU5URUQJTk9URVMKKwkKKwlNSVA2LUZlYXR1cmUtVmVjdG9yCQkJMTI0CQk1NDQ3CVVuc2lnbmVkNjQJCXllcworKwlNSVAtSG9tZS1BZ2VudC1BZGRyZXNzCQkJMzM0CQk0MDA0CUFkZHJlc3MJCQlub3QgeWV0CisrKwlEZXN0aW5hdGlvbi1Ib3N0CQkJMjkzCQkzNTg4CURpYW1ldGVySWRlbnRpdHkJbm8gKEJhc2UpCisrKwlEZXN0aW5hdGlvbi1SZWFsbQkJCTI4MwkJMzU4OAlEaWFtZXRlcklkZW50aXR5CW5vIChCYXNlKQorKwlNSVAtSG9tZS1BZ2VudC1Ib3N0CQkJMzQ4CQk0MDA0CUdyb3VwZWQJCQlub3QgeWV0CisrCU1JUDYtSG9tZS1MaW5rLVByZWZpeAkJCTEyNQkJNTQ0NwlPY3RldFN0cmluZwkJeWVzCisJTUlQNi1BZ2VudC1JbmZvCQkJCTQ4NgkJNTQ0NwlHcm91cGVkCQkJeWVzCisKKyovCisKKworCisjaW5jbHVkZSA8ZnJlZURpYW1ldGVyL2V4dGVuc2lvbi5oPgorCisvKiBUaGUgY29udGVudCBvZiB0aGlzIGZpbGUgZm9sbG93cyB0aGUgc2FtZSBzdHJ1Y3R1cmUgYXMgZGljdF9iYXNlX3Byb3RvLmMgKi8KKworI2RlZmluZSBDSEVDS19kaWN0X25ldyggX3R5cGUsIF9kYXRhLCBfcGFyZW50LCBfcmVmICkJXAorCUNIRUNLX0ZDVCggIGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIChfdHlwZSksIChfZGF0YSksIChfcGFyZW50KSwgKF9yZWYpKSAgKTsKKworI2RlZmluZSBDSEVDS19kaWN0X3NlYXJjaCggX3R5cGUsIF9jcml0ZXJpYSwgX3doYXQsIF9yZXN1bHQgKQlcCisJQ0hFQ0tfRkNUKCAgZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgKF90eXBlKSwgKF9jcml0ZXJpYSksIChfd2hhdCksIChfcmVzdWx0KSwgRU5PRU5UKSApOworCitzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiB7CisJY2hhciAJCQkqYXZwX25hbWU7CisJZW51bSBydWxlX3Bvc2l0aW9uCXBvc2l0aW9uOworCWludCAJCQltaW47CisJaW50CQkJbWF4OworfTsKKworI2RlZmluZSBSVUxFX09SREVSKCBfcG9zaXRpb24gKSAoKCgoX3Bvc2l0aW9uKSA9PSBSVUxFX0ZJWEVEX0hFQUQpIHx8ICgoX3Bvc2l0aW9uKSA9PSBSVUxFX0ZJWEVEX1RBSUwpKSA/IDEgOiAwICkKKworI2RlZmluZSBQQVJTRV9sb2NfcnVsZXMoIF9ydWxlYXJyYXksIF9wYXJlbnQpIHsJCQkJCQkJCVwKKwlpbnQgX19hcjsJCQkJCQkJCQkJCVwKKwlmb3IgKF9fYXI9MDsgX19hciA8IHNpemVvZihfcnVsZWFycmF5KSAvIHNpemVvZigoX3J1bGVhcnJheSlbMF0pOyBfX2FyKyspIHsJCQlcCisJCXN0cnVjdCBkaWN0X3J1bGVfZGF0YSBfX2RhdGEgPSB7IE5VTEwsIAkJCQkJCQlcCisJCQkoX3J1bGVhcnJheSlbX19hcl0ucG9zaXRpb24sCQkJCQkJCVwKKwkJCTAsIAkJCQkJCQkJCQlcCisJCQkoX3J1bGVhcnJheSlbX19hcl0ubWluLAkJCQkJCQkJXAorCQkJKF9ydWxlYXJyYXkpW19fYXJdLm1heH07CQkJCQkJCVwKKwkJX19kYXRhLnJ1bGVfb3JkZXIgPSBSVUxFX09SREVSKF9fZGF0YS5ydWxlX3Bvc2l0aW9uKTsJCQkJCVwKKwkJQ0hFQ0tfRkNUKCAgZmRfZGljdF9zZWFyY2goIAkJCQkJCQkJXAorCQkJZmRfZ19jb25maWctPmNuZl9kaWN0LAkJCQkJCQkJXAorCQkJRElDVF9BVlAsIAkJCQkJCQkJCVwKKwkJCUFWUF9CWV9OQU1FLCAJCQkJCQkJCQlcCisJCQkoX3J1bGVhcnJheSlbX19hcl0uYXZwX25hbWUsIAkJCQkJCQlcCisJCQkmX19kYXRhLnJ1bGVfYXZwLCAwICkgKTsJCQkJCQkJXAorCQlpZiAoICFfX2RhdGEucnVsZV9hdnAgKSB7CQkJCQkJCQlcCisJCQlUUkFDRV9ERUJVRyhJTkZPLCAiQVZQIE5vdCBmb3VuZDogJyVzJyIsIChfcnVsZWFycmF5KVtfX2FyXS5hdnBfbmFtZSApOwkJXAorCQkJcmV0dXJuIEVOT0VOVDsJCQkJCQkJCQlcCisJCX0JCQkJCQkJCQkJCVwKKwkJQ0hFQ0tfRkNUX0RPKCBmZF9kaWN0X25ldyggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1JVTEUsICZfX2RhdGEsIF9wYXJlbnQsIE5VTEwpLAlcCisJCQl7CQkJCQkJCSAgICAgICAgCQlcCisJCQkJVFJBQ0VfREVCVUcoSU5GTywgIkVycm9yIG9uIHJ1bGUgd2l0aCBBVlAgJyVzJyIsICAgICAgCQkJXAorCQkJCQkgKF9ydWxlYXJyYXkpW19fYXJdLmF2cF9uYW1lICk7CQkgICAgICAJCQlcCisJCQkJcmV0dXJuIEVJTlZBTDsJCQkJCSAgICAgIAkJCVwKKwkJCX0gKTsJCQkJCQkJICAgICAgCQkJXAorCX0JCQkJCQkJCQkgICAgICAJCQlcCit9CisKKyNkZWZpbmUgZW51bXZhbF9kZWZfdTMyKCBfdmFsXywgX3N0cl8gKSBcCisJCXsgX3N0cl8sIAkJeyAudTMyID0gX3ZhbF8gfX0KKworI2RlZmluZSBlbnVtdmFsX2RlZl9vcyggX2xlbl8sIF92YWxfLCBfc3RyXyApIFwKKwkJeyBfc3RyXywgCQl7IC5vcyA9IHsgLmRhdGEgPSAodW5zaWduZWQgY2hhciAqKV92YWxfLCAubGVuID0gX2xlbl8gfX19CisKKworCisKKworCisvKiBEZWZpbmVzIGlmIHRoZXJlIGFyZSBhbnkgKi8KKworLyogRGVmaW5lIEZsYWdzIGZvciBNSVA2LUZlYXR1cmUtVmVjdG9yKi8KKworI2RlZmluZSBNSVA2X0lOVEVHUkFURUQgMHgwMDAwMDAwMDAwMDAwMDAxCisjZGVmaW5lIExPQ0FMX0hPTUVfQUdFTlRfQVNTSUdOTUVOVCAweDAwMDAwMDAwMDAwMDAwMDIKKworLyogRGljdGlvbmFyeSAqLworCitpbnQgZGljdF9uYXNfbWlwdjZfaW5pdChjaGFyICogY29uZmZpbGUpCit7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogbmFzX21pcHY2OworCXsKKwkJc3RydWN0IGRpY3RfYXBwbGljYXRpb25fZGF0YSBkYXRhID0geyA1NDQ3LCAiTUlQdjYgTkFTLXRvLUhBQUEgSW50ZXJhY3Rpb24iIH07CisJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FQUExJQ0FUSU9OLCAmZGF0YSAsIE5VTEwsICZuYXNfbWlwdjYpOworCX0KKworCS8qIEFWUCBzZWN0aW9uICovCisJeworCQkvKiBMb2FkaW5nIHRoZSBkZXJpdmVkIGRhdGEgZm9ybWF0cyAqLworCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIEFkZHJlc3NfdHlwZTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiQWRkcmVzcyIsICZBZGRyZXNzX3R5cGUpOworCisJCS8qIE1JUDYtRmVhdHVyZS1WZWN0b3IgKi8KKwkJeworCQkJLyoKKworCQkJKi8KKworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTEyNCwgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJNSVA2LUZlYXR1cmUtVmVjdG9yIiwgCQkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX1VOU0lHTkVENjQJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCQkJCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgTlVMTCk7CisJCX0KKworCQkvKiBNSVAtSG9tZS1BZ2VudC1BZGRyZXNzIC0gUkZDIDQwMDQgKi8KKwkJeworCQkJLyoKKworCQkJKi8KKworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkJMzM0LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIk1JUC1Ib21lLUFnZW50LUFkZHJlc3MiLAkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIEFkZHJlc3NfdHlwZSwgTlVMTCk7CisJCX0KKworCQkvKiBEZXN0aW5hdGlvbi1Ib3N0IC0gQmFzZSBQcm90b2NvbCAqLworCisJCS8qIERlc3RpbmF0aW9uLVJlYWxtIC0gQmFzZSBQcm90b2NvbCAqLwkKKworCQkvKiBNSVAtSG9tZS1BZ2VudC1Ib3N0IC0gUkZDIDQwMDQgKi8KKwkJeworCQkJLyoKKwkJCVRoZSBNSVAtSG9tZS1BZ2VudC1Ib3N0IEFWUCAoQVZQIENvZGUgMzQ4KSBpcyBvZiB0eXBlIEdyb3VwZWQgYW5kCisJCQljb250YWlucyB0aGUgaWRlbnRpdHkgb2YgdGhlIGFzc2lnbmVkIEhvbWUgQWdlbnQuICBJZiB0aGUgTUlQLUhvbWUtCisJCQlBZ2VudC1Ib3N0IEFWUCBpcyBwcmVzZW50IGluIHRoZSBBTVIsIHRoZSBBQUFIIE1VU1QgY29weSBpdCBpbnRvIHRoZQorCQkJSEFSLgorCisJCQkgTUlQLUhvbWUtQWdlbnQtSG9zdCA6Oj0gPCBBVlAgSGVhZGVyOiAzNDggPgorCQkJCQkJICB7IERlc3RpbmF0aW9uLVJlYWxtIH0KKwkJCQkJCSAgeyBEZXN0aW5hdGlvbi1Ib3N0IH0KKwkJCQkJCSogWyBBVlAgXQorCQkJKi8KKworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkJMzQ4LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIk1JUC1Ib21lLUFnZW50LUhvc3QiLCAJCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCSAJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfR1JPVVBFRCAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCisJCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJCQkJCXsgCSB7ICAiRGVzdGluYXRpb24tUmVhbG0iLCAJUlVMRV9SRVFVSVJFRCwgLTEsIDEgfQorCQkJCQkJCSx7ICAiRGVzdGluYXRpb24tSG9zdCIsCQlSVUxFX1JFUVVJUkVELCAtMSwgMSB9CisJCQkJCQl9OworCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkJfQorCisJCS8qIE1JUDYtSG9tZS1MaW5rLVByZWZpeCAqLworCQl7CisJCQkvKgorCisJCQkqLworCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJCQkJMTI1LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIk1JUDYtSG9tZS1MaW5rLVByZWZpeCIsIAkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCQorCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsIE5VTEwpOworCQl9CisKKwkJLyogTUlQNi1BZ2VudC1JbmZvICovCisJCXsKKwkJCS8qCisJCQkKKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJCQkJNDg2LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIk1JUDYtQWdlbnQtSW5mbyIsIAkJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9HUk9VUEVEIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisKKwkJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPSAKKwkJCQkJCXsgCSB7ICAiTUlQLUhvbWUtQWdlbnQtQWRkcmVzcyIsIAkJUlVMRV9PUFRJT05BTCwgLTEsIDIgfQorCQkJCQkJCSx7ICAiTUlQLUhvbWUtQWdlbnQtSG9zdCIsCQlSVUxFX09QVElPTkFMLCAtMSwgMSB9CisJCQkJCQkJLHsgICJNSVA2LUhvbWUtTGluay1QcmVmaXgiLAkJUlVMRV9PUFRJT05BTCwgLTEsIDEgfQorCQkJCQkJfTsKKwkJCQorCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJCX0KKwl9CisKKwlMT0dfRCggIkRpY3Rpb25hcnkgRXh0ZW5zaW9uICdNSVB2NiBOQVMtdG8tSEFBQSBJbnRlcmFjdGlvbicgaW5pdGlhbGl6ZWQiKTsKKwlyZXR1cm4gMDsKK30KK0VYVEVOU0lPTl9FTlRSWSgiZGljdF9uYXNfbWlwdjYiLCBkaWN0X25hc19taXB2Nl9pbml0KTsKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF9uYXNyZXEvQ01ha2VMaXN0cy50eHQgYi9leHRlbnNpb25zL2RpY3RfbmFzcmVxL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzOGUzYzEKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfbmFzcmVxL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTMgQEAKKyMgVGhlIGRpY3RfbmFzcmVxIGV4dGVuc2lvbgorUFJPSkVDVCgiRGlhbWV0ZXIgTkFTUkVRIChSRkM0MDA1KSBkaWN0aW9uYXJ5IGRlZmluaXRpb25zIiBDKQorCisjIENvbXBpbGUgYXMgYSBtb2R1bGUKK0ZEX0FERF9FWFRFTlNJT04oZGljdF9uYXNyZXEgZGljdF9uYXNyZXEuYykKKworCisjIyMjCisjIyBJTlNUQUxMIHNlY3Rpb24gIyMKKworSU5TVEFMTChUQVJHRVRTIGRpY3RfbmFzcmVxCisJTElCUkFSWSBERVNUSU5BVElPTiAke0lOU1RBTExfRVhURU5TSU9OU19TVUZGSVh9CisJQ09NUE9ORU5UIGZyZWVEaWFtZXRlci1kaWN0aW9uYXJ5LVJGQzQwMDUpCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfbmFzcmVxL2RpY3RfbmFzcmVxLmMgYi9leHRlbnNpb25zL2RpY3RfbmFzcmVxL2RpY3RfbmFzcmVxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg3OTA3YgotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF9uYXNyZXEvZGljdF9uYXNyZXEuYwpAQCAtMCwwICsxLDM3MzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDEzLCBXSURFIFByb2plY3QgYW5kIE5JQ1QJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFdJREUgUHJvamVjdCBvciBOSUNUIG5vciB0aGUgCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgV0lERSBQcm9qZWN0IGFuZCAJCQkJCQkgKgorKiAgIE5JQ1QuCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogCisgKiBEaWN0aW9uYXJ5IGRlZmluaXRpb25zIG9mIG9iamVjdHMgc3BlY2lmaWVkIGluIERpYW1ldGVyIE5BU1JFUSAoUkZDNDAwNSkuCisgKi8KKyNpbmNsdWRlIDxmcmVlRGlhbWV0ZXIvZXh0ZW5zaW9uLmg+CisKKy8qIFRoZSBjb250ZW50IG9mIHRoaXMgZmlsZSBmb2xsb3dzIHRoZSBzYW1lIHN0cnVjdHVyZSBhcyBkaWN0X2Jhc2VfcHJvdG8uYyAqLworCisjZGVmaW5lIENIRUNLX2RpY3RfbmV3KCBfdHlwZSwgX2RhdGEsIF9wYXJlbnQsIF9yZWYgKQlcCisJQ0hFQ0tfRkNUKCAgZmRfZGljdF9uZXcoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgKF90eXBlKSwgKF9kYXRhKSwgKF9wYXJlbnQpLCAoX3JlZikpICApOworCisjZGVmaW5lIENIRUNLX2RpY3Rfc2VhcmNoKCBfdHlwZSwgX2NyaXRlcmlhLCBfd2hhdCwgX3Jlc3VsdCApCVwKKwlDSEVDS19GQ1QoICBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCAoX3R5cGUpLCAoX2NyaXRlcmlhKSwgKF93aGF0KSwgKF9yZXN1bHQpLCBFTk9FTlQpICk7CisKK3N0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHsKKwljaGFyIAkJCSphdnBfbmFtZTsKKwllbnVtIHJ1bGVfcG9zaXRpb24JcG9zaXRpb247CisJaW50IAkJCW1pbjsKKwlpbnQJCQltYXg7Cit9OworCisjZGVmaW5lIFJVTEVfT1JERVIoIF9wb3NpdGlvbiApICgoKChfcG9zaXRpb24pID09IFJVTEVfRklYRURfSEVBRCkgfHwgKChfcG9zaXRpb24pID09IFJVTEVfRklYRURfVEFJTCkpID8gMSA6IDAgKQorCisjZGVmaW5lIFBBUlNFX2xvY19ydWxlcyggX3J1bGVhcnJheSwgX3BhcmVudCkgewkJCQkJCQkJXAorCWludCBfX2FyOwkJCQkJCQkJCQkJXAorCWZvciAoX19hcj0wOyBfX2FyIDwgc2l6ZW9mKF9ydWxlYXJyYXkpIC8gc2l6ZW9mKChfcnVsZWFycmF5KVswXSk7IF9fYXIrKykgewkJCVwKKwkJc3RydWN0IGRpY3RfcnVsZV9kYXRhIF9fZGF0YSA9IHsgTlVMTCwgCQkJCQkJCVwKKwkJCShfcnVsZWFycmF5KVtfX2FyXS5wb3NpdGlvbiwJCQkJCQkJXAorCQkJMCwgCQkJCQkJCQkJCVwKKwkJCShfcnVsZWFycmF5KVtfX2FyXS5taW4sCQkJCQkJCQlcCisJCQkoX3J1bGVhcnJheSlbX19hcl0ubWF4fTsJCQkJCQkJXAorCQlfX2RhdGEucnVsZV9vcmRlciA9IFJVTEVfT1JERVIoX19kYXRhLnJ1bGVfcG9zaXRpb24pOwkJCQkJXAorCQlDSEVDS19GQ1QoICBmZF9kaWN0X3NlYXJjaCggCQkJCQkJCQlcCisJCQlmZF9nX2NvbmZpZy0+Y25mX2RpY3QsCQkJCQkJCQlcCisJCQlESUNUX0FWUCwgCQkJCQkJCQkJXAorCQkJQVZQX0JZX05BTUUsIAkJCQkJCQkJCVwKKwkJCShfcnVsZWFycmF5KVtfX2FyXS5hdnBfbmFtZSwgCQkJCQkJCVwKKwkJCSZfX2RhdGEucnVsZV9hdnAsIDAgKSApOwkJCQkJCQlcCisJCWlmICggIV9fZGF0YS5ydWxlX2F2cCApIHsJCQkJCQkJCVwKKwkJCVRSQUNFX0RFQlVHKElORk8sICJBVlAgTm90IGZvdW5kOiAnJXMnIiwgKF9ydWxlYXJyYXkpW19fYXJdLmF2cF9uYW1lICk7CQlcCisJCQlyZXR1cm4gRU5PRU5UOwkJCQkJCQkJCVwKKwkJfQkJCQkJCQkJCQkJXAorCQlDSEVDS19GQ1RfRE8oIGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfUlVMRSwgJl9fZGF0YSwgX3BhcmVudCwgTlVMTCksCVwKKwkJCXsJCQkJCQkJICAgICAgICAJCVwKKwkJCQlUUkFDRV9ERUJVRyhJTkZPLCAiRXJyb3Igb24gcnVsZSB3aXRoIEFWUCAnJXMnIiwgICAgICAJCQlcCisJCQkJCSAoX3J1bGVhcnJheSlbX19hcl0uYXZwX25hbWUgKTsJCSAgICAgIAkJCVwKKwkJCQlyZXR1cm4gRUlOVkFMOwkJCQkJICAgICAgCQkJXAorCQkJfSApOwkJCQkJCQkgICAgICAJCQlcCisJfQkJCQkJCQkJCSAgICAgIAkJCVwKK30KKworI2RlZmluZSBlbnVtdmFsX2RlZl91MzIoIF92YWxfLCBfc3RyXyApIFwKKwkJeyBfc3RyXywgCQl7IC51MzIgPSBfdmFsXyB9fQorCisjZGVmaW5lIGVudW12YWxfZGVmX29zKCBfbGVuXywgX3ZhbF8sIF9zdHJfICkgXAorCQl7IF9zdHJfLCAJCXsgLm9zID0geyAuZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopX3ZhbF8sIC5sZW4gPSBfbGVuXyB9fX0KKworCitzdGF0aWMgaW50IGRucl9lbnRyeShjaGFyICogY29uZmZpbGUpCit7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogbmFzcmVxOworCVRSQUNFX0VOVFJZKCIlcCIsIGNvbmZmaWxlKTsKKwkKKwkvKiBObyBWZW5kb3JzIGRlZmluaXRpb25zICovCisJCisJLyogQXBwbGljYXRpb25zIHNlY3Rpb24gKi8KKwl7CisJCS8qIE5BU1JFUSAoUkZDIDQwMDUpICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2FwcGxpY2F0aW9uX2RhdGEgZGF0YSA9IHsgICAgICAgIDEsICJEaWFtZXRlciBOZXR3b3JrIEFjY2VzcyBTZXJ2ZXIgQXBwbGljYXRpb24iIAkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BUFBMSUNBVElPTiwgJmRhdGEsIE5VTEwsICZuYXNyZXEpOworCQl9CisJfQorCQorCS8qIERlcml2ZWQgQVZQIHR5cGVzIHNlY3Rpb24gKi8KKwl7CisJCS8qIFFvU0ZpbHRlclJ1bGUgKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgUW9zRmlsdGVyUnVsZSBmb3JtYXQgaXMgZGVyaXZlZCBmcm9tIHRoZSBPY3RldFN0cmluZyBBVlAgQmFzZQorCQkJCUZvcm1hdC4gIEl0IHVzZXMgdGhlIEFTQ0lJIGNoYXJzZXQuICBQYWNrZXRzIG1heSBiZSBtYXJrZWQgb3IKKwkJCQltZXRlcmVkIGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb246CisKKwkJCQkgRGlyZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAoaW4gb3Igb3V0KQorCQkJCSBTb3VyY2UgYW5kIGRlc3RpbmF0aW9uIElQIGFkZHJlc3MgIChwb3NzaWJseSBtYXNrZWQpCisJCQkJIFByb3RvY29sCisJCQkJIFNvdXJjZSBhbmQgZGVzdGluYXRpb24gcG9ydCAgICAgICAgKGxpc3RzIG9yIHJhbmdlcykKKwkJCQkgRFNDUCB2YWx1ZXMgICAgICAgICAgICAgICAgICAgICAgICAobm8gbWFzayBvciByYW5nZSkKKworCQkJCVJ1bGVzIGZvciB0aGUgYXBwcm9wcmlhdGUgZGlyZWN0aW9uIGFyZSBldmFsdWF0ZWQgaW4gb3JkZXI7IHRoZQorCQkJCWZpcnN0IG1hdGNoZWQgcnVsZSB0ZXJtaW5hdGVzIHRoZSBldmFsdWF0aW9uLiAgRWFjaCBwYWNrZXQgaXMKKwkJCQlldmFsdWF0ZWQgb25jZS4gIElmIG5vIHJ1bGUgbWF0Y2hlcywgdGhlIHBhY2tldCBpcyB0cmVhdGVkIGFzIGJlc3QKKwkJCQllZmZvcnQuICBBbiBhY2Nlc3MgZGV2aWNlIHVuYWJsZSB0byBpbnRlcnByZXQgb3IgYXBwbHkgYSBRb1MgcnVsZQorCQkJCVNIT1VMRCBOT1QgdGVybWluYXRlIHRoZSBzZXNzaW9uLgorCisJCQkJUW9TRmlsdGVyUnVsZSBmaWx0ZXJzIE1VU1QgZm9sbG93IHRoZSBmb2xsb3dpbmcgZm9ybWF0OgorCisJCQkJYWN0aW9uIGRpciBwcm90byBmcm9tIHNyYyB0byBkc3QgW29wdGlvbnNdCisKKyAgICAgICAgCQkJCXRhZyAgICAtIE1hcmsgcGFja2V0IHdpdGggYSBzcGVjaWZpYyBEU0NQCisgICAgICAgICAgICAgICAgCQkJCSBbRElGRlNFUlZdLiAgVGhlIERTQ1Agb3B0aW9uIE1VU1QgYmUKKyAgICAgICAgICAgICAgICAJCQkJIGluY2x1ZGVkLgorICAgICAgICAJCQkJbWV0ZXIgIC0gTWV0ZXIgdHJhZmZpYy4gIFRoZSBtZXRlcmluZyBvcHRpb25zCisgICAgICAgICAgICAgICAgCQkJCSBNVVNUIGJlIGluY2x1ZGVkLgorCisJCQkJZGlyICAgICAgICAgICBUaGUgZm9ybWF0IGlzIGFzIGRlc2NyaWJlZCB1bmRlciBJUEZpbHRlclJ1bGUuCisKKwkJCQlwcm90byAgICAgICAgIFRoZSBmb3JtYXQgaXMgYXMgZGVzY3JpYmVkIHVuZGVyIElQRmlsdGVyUnVsZS4KKworCQkJCXNyYyBhbmQgZHN0ICAgVGhlIGZvcm1hdCBpcyBhcyBkZXNjcmliZWQgdW5kZXIgSVBGaWx0ZXJSdWxlLgorCisJCQkJIG9wdGlvbnM6CisKKwkJCQkgRFNDUCA8Y29sb3I+CisJCQkJICAgICAgIENvbG9yIHZhbHVlcyBhcyBkZWZpbmVkIGluIFtESUZGU0VSVl0uICBFeGFjdAorCQkJCSAgICAgICBtYXRjaGluZyBvZiBEU0NQIHZhbHVlcyBpcyByZXF1aXJlZCAobm8gbWFza3Mgb3IKKwkJCQkgICAgICAgcmFuZ2VzKS4KKworCQkJCSBtZXRlcmluZyA8cmF0ZT4gPGNvbG9yX3VuZGVyPiA8Y29sb3Jfb3Zlcj4KKwkJCQkgICAgICAgVGhlIG1ldGVyaW5nIG9wdGlvbiBwcm92aWRlcyBBc3N1cmVkIEZvcndhcmRpbmcsCisJCQkJICAgICAgIGFzIGRlZmluZWQgaW4gW0RJRkZTRVJWQUZdLCBhbmQgTVVTVCBiZSBwcmVzZW50CisJCQkJICAgICAgIGlmIHRoZSBhY3Rpb24gaXMgc2V0IHRvIG1ldGVyLiAgVGhlIHJhdGUgb3B0aW9uIGlzCisJCQkJICAgICAgIHRoZSB0aHJvdWdocHV0LCBpbiBiaXRzIHBlciBzZWNvbmQsIHVzZWQKKwkJCQkgICAgICAgYnkgdGhlIGFjY2VzcyBkZXZpY2UgdG8gbWFyayBwYWNrZXRzLiAgVHJhZmZpYworCQkJCSAgICAgICBvdmVyIHRoZSByYXRlIGlzIG1hcmtlZCB3aXRoIHRoZSBjb2xvcl9vdmVyCisJCQkJICAgICAgIGNvZGVwb2ludCwgYW5kIHRyYWZmaWMgdW5kZXIgdGhlIHJhdGUgaXMgbWFya2VkCisJCQkJICAgICAgIHdpdGggdGhlIGNvbG9yX3VuZGVyIGNvZGVwb2ludC4gIFRoZSBjb2xvcl91bmRlcgorCQkJCSAgICAgICBhbmQgY29sb3Jfb3ZlciBvcHRpb25zIGNvbnRhaW4gdGhlIGRyb3AKKwkJCQkgICAgICAgcHJlZmVyZW5jZXMgYW5kIE1VU1QgY29uZm9ybSB0byB0aGUgcmVjb21tZW5kZWQKKwkJCQkgICAgICAgY29kZXBvaW50IGtleXdvcmRzIGRlc2NyaWJlZCBpbiBbRElGRlNFUlZBRl0KKwkJCQkgICAgICAgKGUuZy4sIEFGMTMpLgorCisJCQkJICAgICAgIFRoZSBtZXRlcmluZyBvcHRpb24gYWxzbyBzdXBwb3J0cyB0aGUgc3RyaWN0CisJCQkJICAgICAgIGxpbWl0IG9uIHRyYWZmaWMgcmVxdWlyZWQgYnkgRXhwZWRpdGVkCisJCQkJICAgICAgIEZvcndhcmRpbmcsIGFzIGRlZmluZWQgaW4gW0RJRkZTRVJWRUZdLiAgVGhlCisJCQkJICAgICAgIGNvbG9yX292ZXIgb3B0aW9uIG1heSBjb250YWluIHRoZSBrZXl3b3JkICJkcm9wIgorCQkJCSAgICAgICB0byBwcmV2ZW50IGZvcndhcmRpbmcgb2YgdHJhZmZpYyB0aGF0IGV4Y2VlZHMgdGhlCisJCQkJICAgICAgIHJhdGUgcGFyYW1ldGVyLgorCisJCQkJIFRoZSBydWxlIHN5bnRheCBpcyBhIG1vZGlmaWVkIHN1YnNldCBvZiBpcGZ3KDgpIGZyb20gRnJlZUJTRCwKKwkJCQkgYW5kIHRoZSBpcGZ3LmMgY29kZSBtYXkgcHJvdmlkZSBhIHVzZWZ1bCBiYXNlIGZvcgorCQkJCSBpbXBsZW1lbnRhdGlvbnMuCisJCQkqLworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhIGRhdGEgPSB7IEFWUF9UWVBFX09DVEVUU1RSSU5HLAkiUW9TRmlsdGVyUnVsZSIJCSwgTlVMTAkJCSwgTlVMTAkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmZGF0YSAsIE5VTEwsIE5VTEwpOworCQl9CisJCQorCX0KKwkKKwkvKiBBVlAgc2VjdGlvbiAqLworCXsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogVVRGOFN0cmluZ190eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBJUEZpbHRlclJ1bGVfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogUW9TRmlsdGVyUnVsZV90eXBlOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJVVEY4U3RyaW5nIiwgJlVURjhTdHJpbmdfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIklQRmlsdGVyUnVsZSIsICZJUEZpbHRlclJ1bGVfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIlFvU0ZpbHRlclJ1bGUiLCAmUW9TRmlsdGVyUnVsZV90eXBlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgTkFTIFNlc3Npb24gQVZQcyAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8JCQorCQkvKiBOQVMtUG9ydCAqLworCQl7CisJCQkvKgorCQkJCVRoZSBOQVMtUG9ydCBBVlAgKEFWUCBDb2RlIDUpIGlzIG9mIHR5cGUgVW5zaWduZWQzMiBhbmQgY29udGFpbnMgdGhlCisJCQkJcGh5c2ljYWwgb3IgdmlydHVhbCBwb3J0IG51bWJlciBvZiB0aGUgTkFTIHdoaWNoIGlzIGF1dGhlbnRpY2F0aW5nCisJCQkJdGhlIHVzZXIuICBOb3RlIHRoYXQgInBvcnQiIGlzIG1lYW50IGluIGl0cyBzZW5zZSBhcyBhIHNlcnZpY2UKKwkJCQljb25uZWN0aW9uIG9uIHRoZSBOQVMsIG5vdCBhcyBhbiBJUCBwcm90b2NvbCBpZGVudGlmaWVyLgorCisJCQkJRWl0aGVyIE5BUy1Qb3J0IG9yIE5BUy1Qb3J0LUlkIChBVlAgQ29kZSA4NykgU0hPVUxEIGJlIHByZXNlbnQgaW4KKwkJCQlBQS1SZXF1ZXN0IChBQVIpIGNvbW1hbmRzIGlmIHRoZSBOQVMgZGlmZmVyZW50aWF0ZXMgYW1vbmcgaXRzIHBvcnRzLgorCQkJKi8KKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQkJCQk1LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIk5BUy1Qb3J0IiwgCQkJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9VTlNJR05FRDMyIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgTlVMTCk7CisJCX0KKwkJCisJCS8qIE5BUy1Qb3J0LUlkICovCisJCXsKKwkJCS8qCisJCQkJVGhlIE5BUy1Qb3J0LUlkIEFWUCAoQVZQIENvZGUgODcpIGlzIG9mIHR5cGUgVVRGOFN0cmluZyBhbmQgY29uc2lzdHMKKwkJCQlvZiBBU0NJSSB0ZXh0IGlkZW50aWZ5aW5nIHRoZSBwb3J0IG9mIHRoZSBOQVMgYXV0aGVudGljYXRpbmcgdGhlCisJCQkJdXNlci4gIE5vdGUgdGhhdCAicG9ydCIgaXMgbWVhbnQgaW4gaXRzIHNlbnNlIGFzIGEgc2VydmljZSBjb25uZWN0aW9uCisJCQkJb24gdGhlIE5BUywgbm90IGFzIGFuIElQIHByb3RvY29sIGlkZW50aWZpZXIuCisKKwkJCQlFaXRoZXIgTkFTLVBvcnQgb3IgTkFTLVBvcnQtSWQgU0hPVUxEIGJlIHByZXNlbnQgaW4gQUEtUmVxdWVzdCAoQUFSKQorCQkJCWNvbW1hbmRzIGlmIHRoZSBOQVMgZGlmZmVyZW50aWF0ZXMgYW1vbmcgaXRzIHBvcnRzLiAgTkFTLVBvcnQtSWQgaXMKKwkJCQlpbnRlbmRlZCBmb3IgdXNlIGJ5IE5BU2VzIHRoYXQgY2Fubm90IGNvbnZlbmllbnRseSBudW1iZXIgdGhlaXIKKwkJCQlwb3J0cy4KKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJCQkJODcsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiTkFTLVBvcnQtSWQiLCAJCQkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfQorCQkKKwkJLyogTkFTLVBvcnQtVHlwZSAqLworCQl7CisJCQkvKgorCQkJCVRoZSBOQVMtUG9ydC1UeXBlIEFWUCAoQVZQIENvZGUgNjEpIGlzIG9mIHR5cGUgRW51bWVyYXRlZCBhbmQKKwkJCQljb250YWlucyB0aGUgdHlwZSBvZiB0aGUgcG9ydCBvbiB3aGljaCB0aGUgTkFTIGlzIGF1dGhlbnRpY2F0aW5nIHRoZQorCQkJCXVzZXIuICBUaGlzIEFWUCBTSE9VTEQgYmUgcHJlc2VudCBpZiB0aGUgTkFTIHVzZXMgdGhlIHNhbWUgTkFTLVBvcnQKKwkJCQludW1iZXIgcmFuZ2VzIGZvciBkaWZmZXJlbnQgc2VydmljZSB0eXBlcyBjb25jdXJyZW50bHkuCisKKwkJCQlUaGUgc3VwcG9ydGVkIHZhbHVlcyBhcmUgZGVmaW5lZCBpbiBbUkFESVVTVHlwZXNdLiAgVGhlIGZvbGxvd2luZworCQkJCWxpc3QgaXMgaW5mb3JtYXRpb25hbCBhbmQgc3ViamVjdCB0byBjaGFuZ2UgYnkgdGhlIElBTkEuCisJCQkJCisJCQkJaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9yYWRpdXMtdHlwZXMKKwkJCQlTdWItcmVnaXN0cnk6IFZhbHVlcyBmb3IgUkFESVVTIEF0dHJpYnV0ZSA2MSwgTkFTLVBvcnQtVHlwZQorCQkJCVJlZmVyZW5jZTogW1JGQzI4NjVdCisJCQkJCisJCQkJRXh0cmFjdCBvbiAyMDA5LjA2LjAxOgorCQkJCTAgICAgICBBc3luYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtSRkMyODY1XQorCQkJCTEgICAgICBTeW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtSRkMyODY1XQorCQkJCTIgICAgICBJU0ROIFN5bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtSRkMyODY1XQorCQkJCTMgICAgICBJU0ROIEFzeW5jIFYuMTIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtSRkMyODY1XQorCQkJCTQgICAgICBJU0ROIEFzeW5jIFYuMTEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtSRkMyODY1XQorCQkJCTUgICAgICBWaXJ0dWFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtSRkMyODY1XQorCQkJCTYgICAgICBQSUFGUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtSRkMyODY1XQorCQkJCTcgICAgICBIRExDIENsZWFyIENoYW5uZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtSRkMyODY1XQorCQkJCTggICAgICBYLjI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtSRkMyODY1XQorCQkJCTkgICAgICBYLjc1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtSRkMyODY1XQorCQkJCTEwICAgICBHLjMgRmF4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtSRkMyODY1XQorCQkJCTExICAgICBTRFNMIC0gU3ltbWV0cmljIERTTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtSRkMyODY1XQorCQkJCTEyICAgICBBRFNMLUNBUCAtIEFzeW1tZXRyaWMgRFNMLCBDYXJyaWVybGVzcyBBbXBsaXR1ZGUgUGhhc2UgTW9kdWxhdGlvbiAgIFtSRkMyODY1XQorCQkJCTEzICAgICBBRFNMLURNVCAtIEFzeW1tZXRyaWMgRFNMLCBEaXNjcmV0ZSBNdWx0aS1Ub25lICAgICAgICAgICAgICAgICAgICAgIFtSRkMyODY1XQorCQkJCTE0ICAgICBJRFNMIC0gSVNETiBEaWdpdGFsIFN1YnNjcmliZXIgTGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtSRkMyODY1XQorCQkJCTE1ICAgICBFdGhlcm5ldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtSRkMyODY1XQorCQkJCTE2ICAgICB4RFNMIC0gRGlnaXRhbCBTdWJzY3JpYmVyIExpbmUgb2YgdW5rbm93biB0eXBlICAgICAgICAgICAgICAgICAgICAgIFtSRkMyODY1XQorCQkJCTE3ICAgICBDYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtSRkMyODY1XQorCQkJCTE4ICAgICBXaXJlbGVzcyAtIE90aGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtSRkMyODY1XQorCQkJCTE5ICAgICBXaXJlbGVzcyAtIElFRUUgODAyLjExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtSRkMyODY1XQorCQkJCTIwICAgICBUb2tlbi1SaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtSRkMzNTgwXSAKKwkJCQkyMSAgICAgRkRESSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbUkZDMzU4MF0KKwkJCQkyMiAgICAgV2lyZWxlc3MgLSBDRE1BMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbTWNDYW5uXSAKKwkJCQkyMyAgICAgV2lyZWxlc3MgLSBVTVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbTWNDYW5uXQorCQkJCTI0ICAgICBXaXJlbGVzcyAtIDFYLUVWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtNY0Nhbm5dCisJCQkJMjUgICAgIElBUFAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0lFRUUgODAyLjExRl1bS2VycnldICAgCisJCQkJMjYgICAgIEZUVFAgLSBGaWJlciB0byB0aGUgUHJlbWlzZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW055Y2VdCisJCQkJMjcgICAgIFdpcmVsZXNzIC0gSUVFRSA4MDIuMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0lFRUUgODAyLjE2XSAgICAgICAgICAxMiBEZWNlbWJlciAyMDA2CisJCQkJMjggICAgIFdpcmVsZXNzIC0gSUVFRSA4MDIuMjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0lFRUUgODAyLjIwXSAgICAgICAgICAxMiBEZWNlbWJlciAyMDA2CisJCQkJMjkgICAgIFdpcmVsZXNzIC0gSUVFRSA4MDIuMjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0lFRUUgODAyLjIyXSAgICAgICAgICAxMiBEZWNlbWJlciAyMDA2CQkKKwkJCQkzMCAgICAgUFBQb0EgLSBQUFAgb3ZlciBBVE0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbUkZDNDYwM10KKwkJCQkzMSAgICAgUFBQb0VvQSAtIFBQUCBvdmVyIEV0aGVybmV0IG92ZXIgQVRNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbUkZDNDYwM10KKwkJCQkzMiAgICAgUFBQb0VvRSAtIFBQUCBvdmVyIEV0aGVybmV0IG92ZXIgRXRoZXJuZXQgICAgICAgICAgICAgICAgICAgICAgICAgICBbUkZDNDYwM10KKwkJCQkzMyAgICAgUFBQb0VvVkxBTiAtIFBQUCBvdmVyIEV0aGVybmV0IG92ZXIgVkxBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbUkZDNDYwM10KKwkJCQkzNCAgICAgUFBQb0VvUWluUSAtIFBQUCBvdmVyIEV0aGVybmV0IG92ZXIgSUVFRSA4MDIuMVFpblEgICAgICAgICAgICAgICAgICBbUkZDNDYwM10KKwkJCQkzNSAgICAgeFBPTiAtIFBhc3NpdmUgT3B0aWNhbCBOZXR3b3JrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSHVibGV0XVtZYW5dICAgICAgICAgICAxOSBKdW5lIDIwMDcKKwkJCSovCisJCQkKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAJKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgCSB0ZGF0YSA9IHsgQVZQX1RZUEVfVU5TSUdORUQzMiwJIkVudW1lcmF0ZWQoTkFTLVBvcnQtVHlwZSkiCSwgTlVMTCwgTlVMTH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgdHZhbHNbXSA9IHsKKwkJCQllbnVtdmFsX2RlZl91MzIoIDAsICJBc3luYyBbUkZDMjg2NV0iKSwKKwkJCQllbnVtdmFsX2RlZl91MzIoIDEsICJTeW5jIFtSRkMyODY1XSIpLAorCQkJCWVudW12YWxfZGVmX3UzMiggMiwgIklTRE4gU3luYyBbUkZDMjg2NV0iKSwKKwkJCQllbnVtdmFsX2RlZl91MzIoIDMsICJJU0ROIEFzeW5jIFYuMTIwIFtSRkMyODY1XSIpLAorCQkJCWVudW12YWxfZGVmX3UzMiggNCwgIklTRE4gQXN5bmMgVi4xMTAgW1JGQzI4NjVdIiksCisJCQkJZW51bXZhbF9kZWZfdTMyKCA1LCAiVmlydHVhbCBbUkZDMjg2NV0iKSwKKwkJCQllbnVtdmFsX2RlZl91MzIoIDYsICJQSUFGUyBbUkZDMjg2NV0iKSwKKwkJCQllbnVtdmFsX2RlZl91MzIoIDcsICJIRExDIENsZWFyIENoYW5uZWwgW1JGQzI4NjVdIiksCisJCQkJZW51bXZhbF9kZWZfdTMyKCA4LCAiWC4yNSBbUkZDMjg2NV0iKSwKKwkJCQllbnVtdmFsX2RlZl91MzIoIDksICJYLjc1IFtSRkMyODY1XSIpLAorCQkJCWVudW12YWxfZGVmX3UzMigxMCwgIkcuMyBGYXggW1JGQzI4NjVdIiksCisJCQkJZW51bXZhbF9kZWZfdTMyKDExLCAiU0RTTCAtIFN5bW1ldHJpYyBEU0wgW1JGQzI4NjVdIiksCisJCQkJZW51bXZhbF9kZWZfdTMyKDEyLCAiQURTTC1DQVAgLSBBc3ltbWV0cmljIERTTCwgQ2Fycmllcmxlc3MgQW1wbGl0dWRlIFBoYXNlIE1vZHVsYXRpb24gW1JGQzI4NjVdIiksCisJCQkJZW51bXZhbF9kZWZfdTMyKDEzLCAiQURTTC1ETVQgLSBBc3ltbWV0cmljIERTTCwgRGlzY3JldGUgTXVsdGktVG9uZSBbUkZDMjg2NV0iKSwKKwkJCQllbnVtdmFsX2RlZl91MzIoMTQsICJJRFNMIC0gSVNETiBEaWdpdGFsIFN1YnNjcmliZXIgTGluZSBbUkZDMjg2NV0iKSwKKwkJCQllbnVtdmFsX2RlZl91MzIoMTUsICJFdGhlcm5ldCBbUkZDMjg2NV0iKSwKKwkJCQllbnVtdmFsX2RlZl91MzIoMTYsICJ4RFNMIC0gRGlnaXRhbCBTdWJzY3JpYmVyIExpbmUgb2YgdW5rbm93biB0eXBlIFtSRkMyODY1XSIpLAorCQkJCWVudW12YWxfZGVmX3UzMigxNywgIkNhYmxlIFtSRkMyODY1XSIpLAorCQkJCWVudW12YWxfZGVmX3UzMigxOCwgIldpcmVsZXNzIC0gT3RoZXIgW1JGQzI4NjVdIiksCisJCQkJZW51bXZhbF9kZWZfdTMyKDE5LCAiV2lyZWxlc3MgLSBJRUVFIDgwMi4xMSBbUkZDMjg2NV0iKSwKKwkJCQllbnVtdmFsX2RlZl91MzIoMjAsICJUb2tlbi1SaW5nIFtSRkMzNTgwXSIpLAorCQkJCWVudW12YWxfZGVmX3UzMigyMSwgIkZEREkgW1JGQzM1ODBdIiksCisJCQkJZW51bXZhbF9kZWZfdTMyKDIyLCAiV2lyZWxlc3MgLSBDRE1BMjAwMCBbTWNDYW5uXSIpLAorCQkJCWVudW12YWxfZGVmX3UzMigyMywgIldpcmVsZXNzIC0gVU1UUyBbTWNDYW5uXSIpLAorCQkJCWVudW12YWxfZGVmX3UzMigyNCwgIldpcmVsZXNzIC0gMVgtRVYgW01jQ2Fubl0iKSwKKwkJCQllbnVtdmFsX2RlZl91MzIoMjUsICJJQVBQIFtJRUVFIDgwMi4xMUZdW0tlcnJ5XSIpLAorCQkJCWVudW12YWxfZGVmX3UzMigyNiwgIkZUVFAgLSBGaWJlciB0byB0aGUgUHJlbWlzZXMgW055Y2VdIiksCisJCQkJZW51bXZhbF9kZWZfdTMyKDI3LCAiV2lyZWxlc3MgLSBJRUVFIDgwMi4xNiBbSUVFRSA4MDIuMTZdIiksCisJCQkJZW51bXZhbF9kZWZfdTMyKDI4LCAiV2lyZWxlc3MgLSBJRUVFIDgwMi4yMCBbSUVFRSA4MDIuMjBdIiksCisJCQkJZW51bXZhbF9kZWZfdTMyKDI5LCAiV2lyZWxlc3MgLSBJRUVFIDgwMi4yMiBbSUVFRSA4MDIuMjJdIiksCisJCQkJZW51bXZhbF9kZWZfdTMyKDMwLCAiUFBQb0EgLSBQUFAgb3ZlciBBVE0gW1JGQzQ2MDNdIiksCisJCQkJZW51bXZhbF9kZWZfdTMyKDMxLCAiUFBQb0VvQSAtIFBQUCBvdmVyIEV0aGVybmV0IG92ZXIgQVRNIFtSRkM0NjAzXSIpLAorCQkJCWVudW12YWxfZGVmX3UzMigzMiwgIlBQUG9Fb0UgLSBQUFAgb3ZlciBFdGhlcm5ldCBvdmVyIEV0aGVybmV0IFtSRkM0NjAzXSIpLAorCQkJCWVudW12YWxfZGVmX3UzMigzMywgIlBQUG9Fb1ZMQU4gLSBQUFAgb3ZlciBFdGhlcm5ldCBvdmVyIFZMQU4gW1JGQzQ2MDNdIiksCisJCQkJZW51bXZhbF9kZWZfdTMyKDM0LCAiUFBQb0VvUWluUSAtIFBQUCBvdmVyIEV0aGVybmV0IG92ZXIgSUVFRSA4MDIuMVFpblEgW1JGQzQ2MDNdIiksCisJCQkJZW51bXZhbF9kZWZfdTMyKDM1LCAieFBPTiAtIFBhc3NpdmUgT3B0aWNhbCBOZXR3b3JrIFtIdWJsZXRdW1lhbl0iKQorCQkJfTsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIAlkYXRhID0geyAKKwkJCQkJNjEsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiTkFTLVBvcnQtVHlwZSIsIAkJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCWludCBpOworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGVudW1lcmF0ZWQgdmFsdWVzLCBhbmQgdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhICwgTlVMTCwgJnR5cGUpOworCQkJZm9yIChpID0gMDsgaSA8IHNpemVvZih0dmFscykgLyBzaXplb2YodHZhbHNbMF0pOyBpKyspIHsKKwkJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdHZhbHNbaV0sIHR5cGUsIE5VTEwpOworCQkJfQorCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIHR5cGUsIE5VTEwpOworCQl9CisJCQorCQkvKiBDYWxsZWQtU3RhdGlvbi1JZCAqLworCQl7CisJCQkvKgorCQkJCVRoZSBDYWxsZWQtU3RhdGlvbi1JZCBBVlAgKEFWUCBDb2RlIDMwKSBpcyBvZiB0eXBlIFVURjhTdHJpbmcgYW5kCisJCQkJYWxsb3dzIHRoZSBOQVMgdG8gc2VuZCB0aGUgQVNDSUkgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGxheWVyIDIKKwkJCQlhZGRyZXNzIHRoZSB1c2VyIGNvbnRhY3RlZCBpbiB0aGUgcmVxdWVzdC4gIEZvciBkaWFsdXAgYWNjZXNzLCB0aGlzCisJCQkJY2FuIGJlIGEgcGhvbmUgbnVtYmVyIG9idGFpbmVkIGJ5IHVzaW5nIERpYWxlZCBOdW1iZXIgSWRlbnRpZmljYXRpb24KKwkJCQkoRE5JUykgb3IgYSBzaW1pbGFyIHRlY2hub2xvZ3kuICBOb3RlIHRoYXQgdGhpcyBtYXkgYmUgZGlmZmVyZW50IGZyb20KKwkJCQl0aGUgcGhvbmUgbnVtYmVyIHRoZSBjYWxsIGNvbWVzIGluIG9uLiAgRm9yIHVzZSB3aXRoIElFRUUgODAyIGFjY2VzcywKKwkJCQl0aGUgQ2FsbGVkLVN0YXRpb24tSWQgTUFZIGNvbnRhaW4gYSBNQUMgYWRkcmVzcyBmb3JtYXR0ZWQgYXMKKwkJCQlkZXNjcmliZWQgaW4gW1JBRDgwMi4xWF0uICBJdCBTSE9VTEQgb25seSBiZSBwcmVzZW50IGluCisJCQkJYXV0aGVudGljYXRpb24gYW5kL29yIGF1dGhvcml6YXRpb24gcmVxdWVzdHMuCisKKwkJCQlJZiB0aGUgQXV0aC1SZXF1ZXN0LVR5cGUgQVZQIGlzIHNldCB0byBhdXRob3JpemF0aW9uLW9ubHkgYW5kIHRoZQorCQkJCVVzZXItTmFtZSBBVlAgaXMgYWJzZW50LCB0aGUgRGlhbWV0ZXIgU2VydmVyIE1BWSBwZXJmb3JtCisJCQkJYXV0aG9yaXphdGlvbiBiYXNlZCBvbiB0aGlzIGZpZWxkLiAgVGhpcyBjYW4gYmUgdXNlZCBieSBhIE5BUyB0bworCQkJCXJlcXVlc3Qgd2hldGhlciBhIGNhbGwgc2hvdWxkIGJlIGFuc3dlcmVkIGJhc2VkIG9uIHRoZSBETklTLgorCQkJKi8KKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQkJCQkzMCwgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJDYWxsZWQtU3RhdGlvbi1JZCIsIAkJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORyAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX0KKwkJCisJCS8qIENhbGxpbmctU3RhdGlvbi1JZCAqLworCQl7CisJCQkvKgorCQkJCVRoZSBDYWxsaW5nLVN0YXRpb24tSWQgQVZQIChBVlAgQ29kZSAzMSkgaXMgb2YgdHlwZSBVVEY4U3RyaW5nIGFuZAorCQkJCWFsbG93cyB0aGUgTkFTIHRvIHNlbmQgdGhlIEFTQ0lJIHN0cmluZyBkZXNjcmliaW5nIHRoZSBsYXllciAyCisJCQkJYWRkcmVzcyBmcm9tIHdoaWNoIHRoZSB1c2VyIGNvbm5lY3RlZCBpbiB0aGUgcmVxdWVzdC4gIEZvciBkaWFsdXAKKwkJCQlhY2Nlc3MsIHRoaXMgaXMgdGhlIHBob25lIG51bWJlciB0aGUgY2FsbCBjYW1lIGZyb20sIHVzaW5nIEF1dG9tYXRpYworCQkJCU51bWJlciBJZGVudGlmaWNhdGlvbiAoQU5JKSBvciBhIHNpbWlsYXIgdGVjaG5vbG9neS4gIEZvciB1c2Ugd2l0aAorCQkJCUlFRUUgODAyIGFjY2VzcywgdGhlIENhbGxpbmctU3RhdGlvbi1JZCBBVlAgTUFZIGNvbnRhaW4gYSBNQUMKKwkJCQlhZGRyZXNzLCBmb3JtYXRlZCBhcyBkZXNjcmliZWQgaW4gW1JBRDgwMi4xWF0uICBJdCBTSE9VTEQgb25seSBiZQorCQkJCXByZXNlbnQgaW4gYXV0aGVudGljYXRpb24gYW5kL29yIGF1dGhvcml6YXRpb24gcmVxdWVzdHMuCisKKwkJCQlJZiB0aGUgQXV0aC1SZXF1ZXN0LVR5cGUgQVZQIGlzIHNldCB0byBhdXRob3JpemF0aW9uLW9ubHkgYW5kIHRoZQorCQkJCVVzZXItTmFtZSBBVlAgaXMgYWJzZW50LCB0aGUgRGlhbWV0ZXIgU2VydmVyIE1BWSBwZXJmb3JtCisJCQkJYXV0aG9yaXphdGlvbiBiYXNlZCBvbiB0aGlzIGZpZWxkLiAgVGhpcyBjYW4gYmUgdXNlZCBieSBhIE5BUyB0bworCQkJCXJlcXVlc3Qgd2hldGhlciBhIGNhbGwgc2hvdWxkIGJlIGFuc3dlcmVkIGJhc2VkIG9uIHRoZSBsYXllciAyCisJCQkJYWRkcmVzcyAoQU5JLCBNQUMgQWRkcmVzcywgZXRjLikKKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJCQkJMzEsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiQ2FsbGluZy1TdGF0aW9uLUlkIiwgCQkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfQorCQkKKwkJLyogQ29ubmVjdC1JbmZvICovCisJCXsKKwkJCS8qCisJCQkJVGhlIENvbm5lY3QtSW5mbyBBVlAgKEFWUCBDb2RlIDc3KSBpcyBvZiB0eXBlIFVURjhTdHJpbmcgYW5kIGlzIHNlbnQKKwkJCQlpbiB0aGUgQUEtUmVxdWVzdCBtZXNzYWdlIG9yIEFDUiBTVE9QIG1lc3NhZ2UuICBXaGVuIHNlbnQgaW4gdGhlCisJCQkJQWNjZXNzLVJlcXVlc3QsIGl0IGluZGljYXRlcyB0aGUgbmF0dXJlIG9mIHRoZSB1c2VyJ3MgY29ubmVjdGlvbi4KKwkJCQlUaGUgY29ubmVjdGlvbiBzcGVlZCBTSE9VTEQgYmUgaW5jbHVkZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlyc3QKKwkJCQlDb25uZWN0LUluZm8gQVZQIGluIHRoZSBtZXNzYWdlLiAgSWYgdGhlIHRyYW5zbWl0IGFuZCByZWNlaXZlCisJCQkJY29ubmVjdGlvbiBzcGVlZHMgZGlmZmVyLCBib3RoIG1heSBiZSBpbmNsdWRlZCBpbiB0aGUgZmlyc3QgQVZQIHdpdGgKKwkJCQl0aGUgdHJhbnNtaXQgc3BlZWQgbGlzdGVkIGZpcnN0ICh0aGUgc3BlZWQgdGhlIE5BUyBtb2RlbSB0cmFuc21pdHMKKwkJCQlhdCksIHRoZW4gYSBzbGFzaCAoLyksIHRoZW4gdGhlIHJlY2VpdmUgc3BlZWQsIGFuZCB0aGVuIG90aGVyCisJCQkJb3B0aW9uYWwgaW5mb3JtYXRpb24uCisKKwkJCQlGb3IgZXhhbXBsZTogIjI4ODAwIFY0MkJJUy9MQVBNIiBvciAiNTIwMDAvMzEyMDAgVjkwIgorCisJCQkJTW9yZSB0aGFuIG9uZSBDb25uZWN0LUluZm8gYXR0cmlidXRlIG1heSBiZSBwcmVzZW50IGluIGFuCisJCQkJQWNjb3VudGluZy1SZXF1ZXN0IHBhY2tldCB0byBhY2NvbW1vZGF0ZSBleHBlY3RlZCBlZmZvcnRzIGJ5IHRoZSBJVFUKKwkJCQl0byBoYXZlIG1vZGVtcyByZXBvcnQgbW9yZSBjb25uZWN0aW9uIGluZm9ybWF0aW9uIGluIGEgc3RhbmRhcmQKKwkJCQlmb3JtYXQgdGhhdCBtaWdodCBleGNlZWQgMjUyIG9jdGV0cy4KKworCQkJCUlmIHNlbnQgaW4gdGhlIEFDUiBTVE9QLCB0aGlzIGF0dHJpYnV0ZSBtYXkgc3VtbWFyaXplIHN0YXRpc3RpY3MKKwkJCQlyZWxhdGluZyB0byBzZXNzaW9uIHF1YWxpdHkuICBGb3IgZXhhbXBsZSwgaW4gSUVFRSA4MDIuMTEsIHRoZQorCQkJCUNvbm5lY3QtSW5mbyBhdHRyaWJ1dGUgbWF5IGNvbnRhaW4gaW5mb3JtYXRpb24gb24gdGhlIG51bWJlciBvZiBsaW5rCisJCQkJbGF5ZXIgcmV0cmFuc21pc3Npb25zLiAgVGhlIGV4YWN0IGZvcm1hdCBvZiB0aGlzIGF0dHJpYnV0ZSBpcworCQkJCWltcGxlbWVudGF0aW9uIHNwZWNpZmljLgorCQkJKi8KKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQkJCQk3NywgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJDb25uZWN0LUluZm8iLCAJCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCSAJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9CisJCQorCQkvKiBPcmlnaW5hdGluZy1MaW5lLUluZm8gKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgT3JpZ2luYXRpbmctTGluZS1JbmZvIEFWUCAoQVZQIENvZGUgOTQpIGlzIG9mIHR5cGUgT2N0ZXRTdHJpbmcKKwkJCQlhbmQgaXMgc2VudCBieSB0aGUgTkFTIHN5c3RlbSB0byBjb252ZXkgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9yaWdpbgorCQkJCW9mIHRoZSBjYWxsIGZyb20gYW4gU1M3IHN5c3RlbS4KKworCQkJCVRoZSBvcmlnaW5hdGluZyBsaW5lIGluZm9ybWF0aW9uIChPTEkpIGVsZW1lbnQgaW5kaWNhdGVzIHRoZSBuYXR1cmUKKwkJCQlhbmQvb3IgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBsaW5lIGZyb20gd2hpY2ggYSBjYWxsIG9yaWdpbmF0ZWQKKwkJCQkoZS5nLiwgcGF5IHBob25lLCBob3RlbCwgY2VsbHVsYXIpLiAgVGVsZXBob25lIGNvbXBhbmllcyBhcmUgc3RhcnRpbmcKKwkJCQl0byBvZmZlciBPTEkgdG8gdGhlaXIgY3VzdG9tZXJzIGFzIGFuIG9wdGlvbiBvdmVyIFByaW1hcnkgUmF0ZQorCQkJCUludGVyZmFjZSAoUFJJKS4gIEludGVybmV0IFNlcnZpY2UgUHJvdmlkZXJzIChJU1BzKSBjYW4gdXNlIE9MSSBpbgorCQkJCWFkZGl0aW9uIHRvIENhbGxlZC1TdGF0aW9uLUlkIGFuZCBDYWxsaW5nLVN0YXRpb24tSWQgYXR0cmlidXRlcyB0bworCQkJCWRpZmZlcmVudGlhdGUgY3VzdG9tZXIgY2FsbHMgYW5kIHRvIGRlZmluZSBkaWZmZXJlbnQgc2VydmljZXMuCisKKwkJCQlUaGUgVmFsdWUgZmllbGQgY29udGFpbnMgdHdvIG9jdGV0cyAoMDAgLSA5OSkuICBBTlNJIFQxLjExMyBhbmQKKwkJCQlCRUxMQ09SRSAzOTQgY2FuIGJlIHVzZWQgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlc2UKKwkJCQl2YWx1ZXMgYW5kIHRoZWlyIHVzZS4gIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGN1cnJlbnQgYXNzaWdubWVudAorCQkJCXZhbHVlcywgc2VlIFtodHRwOi8vd3d3Lm5hbnBhLmNvbS9udW1iZXJfcmVzb3VyY2VfaW5mby9hbmlfaWlfYXNzaWdubWVudHMuaHRtbF0uCisKKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgCSp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhIAkgdGRhdGEgPSB7IEFWUF9UWVBFX09DVEVUU1RSSU5HLAkiRW51bWVyYXRlZChPcmlnaW5hdGluZy1MaW5lLUluZm8pIgksIE5VTEwsIE5VTEx9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIHR2YWxzW10gPSB7CisJCQkJZW51bXZhbF9kZWZfb3MoIDIsICIwMCIsICJQbGFpbiBPbGQgVGVsZXBob25lIFNlcnZpY2UgKFBPVFMpIiksCisJCQkJZW51bXZhbF9kZWZfb3MoIDIsICIwMSIsICJNdWx0aXBhcnR5IExpbmUgKG1vcmUgdGhhbiAyKSIpLAorCQkJCWVudW12YWxfZGVmX29zKCAyLCAiMDIiLCAiQU5JIEZhaWx1cmUiKSwKKwkJCQllbnVtdmFsX2RlZl9vcyggMiwgIjA2IiwgIlN0YXRpb24gTGV2ZWwgUmF0aW5nIiksCisJCQkJZW51bXZhbF9kZWZfb3MoIDIsICIwNyIsICJTcGVjaWFsIE9wZXJhdG9yIEhhbmRsaW5nIFJlcXVpcmVkIiksCisJCQkJZW51bXZhbF9kZWZfb3MoIDIsICIyMCIsICJBdXRvbWF0aWMgSWRlbnRpZmllZCBPdXR3YXJkIERpYWxpbmcgKEFJT0QpIiksCisJCQkJZW51bXZhbF9kZWZfb3MoIDIsICIyMyIsICJDb2luIG9yIE5vbi1Db2luIiksCisJCQkJZW51bXZhbF9kZWZfb3MoIDIsICIyNCIsICJUb2xsIEZyZWUgU2VydmljZSAoTm9uLVBheSBPcmlnaW5hdGlvbikiKSwKKwkJCQllbnVtdmFsX2RlZl9vcyggMiwgIjI1IiwgIlRvbGwgRnJlZSBTZXJ2aWNlIChQYXkgT3JpZ2luYXRpb24pIiksCisJCQkJZW51bXZhbF9kZWZfb3MoIDIsICIyNyIsICJUb2xsIEZyZWUgU2VydmljZSAoQ29pbiBDb250cm9sIE9yaWdpbmF0aW9uKSIpLAorCQkJCWVudW12YWxfZGVmX29zKCAyLCAiMjkiLCAiUHJpc29uL0lubWF0ZSBTZXJ2aWNlIiksCisJCQkJZW51bXZhbF9kZWZfb3MoIDIsICIzMCIsICJJbnRlcmNlcHQgKEJsYW5rKSIpLAorCQkJCWVudW12YWxfZGVmX29zKCAyLCAiMzEiLCAiSW50ZXJjZXB0IChUcm91YmxlKSIpLAorCQkJCWVudW12YWxfZGVmX29zKCAyLCAiMzIiLCAiSW50ZXJjZXB0IChSZWd1bGFyKSIpLAorCQkJCWVudW12YWxfZGVmX29zKCAyLCAiMzQiLCAiVGVsY28gT3BlcmF0b3IgSGFuZGxlZCBDYWxsIiksCisJCQkJZW51bXZhbF9kZWZfb3MoIDIsICI1MiIsICJPdXR3YXJkIFdpZGUgQXJlYSBUZWxlY29tbXVuaWNhdGlvbnMgU2VydmljZSAoT1VUV0FUUykiKSwKKwkJCQllbnVtdmFsX2RlZl9vcyggMiwgIjYwIiwgIlRlbGVjb21tdW5pY2F0aW9ucyBSZWxheSBTZXJ2aWNlIChUUlMpKFVucmVzdHJpY3RlZCkiKSwKKwkJCQllbnVtdmFsX2RlZl9vcyggMiwgIjYxIiwgIkNlbGx1bGFyL1dpcmVsZXNzIFBDUyAoVHlwZSAxKSIpLAorCQkJCWVudW12YWxfZGVmX29zKCAyLCAiNjIiLCAiQ2VsbHVsYXIvV2lyZWxlc3MgUENTIChUeXBlIDIpIiksCisJCQkJZW51bXZhbF9kZWZfb3MoIDIsICI2MyIsICJDZWxsdWxhci9XaXJlbGVzcyBQQ1MgKFJvYW1pbmcpIiksCisJCQkJZW51bXZhbF9kZWZfb3MoIDIsICI2NiIsICJUUlMgKEhvdGVsKSIpLAorCQkJCWVudW12YWxfZGVmX29zKCAyLCAiNjciLCAiVFJTIChSZXN0cmljdGVkKSIpLAorCQkJCWVudW12YWxfZGVmX29zKCAyLCAiNzAiLCAiUGF5IFN0YXRpb24sIE5vIENvaW4gQ29udHJvbCIpLAorCQkJCWVudW12YWxfZGVmX29zKCAyLCAiOTMiLCAiQWNjZXNzIGZvciBQcml2YXRlIFZpcnR1YWwgTmV0d29yayBTZXJ2aWNlIikKKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJCQkJOTQsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiT3JpZ2luYXRpbmctTGluZS1JbmZvIiwgCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiwgCQkJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJMCwJCSAJCQkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORyAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCQkJaW50IGk7CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgZW51bWVyYXRlZCB2YWx1ZXMsIGFuZCB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEgLCBOVUxMLCAmdHlwZSk7CisJCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHR2YWxzKSAvIHNpemVvZih0dmFsc1swXSk7IGkrKykgeworCQkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0dmFsc1tpXSwgdHlwZSwgTlVMTCk7CisJCQl9CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgdHlwZSwgTlVMTCk7CisJCX0KKwkJCisJCS8qIFJlcGx5LU1lc3NhZ2UgKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgUmVwbHktTWVzc2FnZSBBVlAgKEFWUCBDb2RlIDE4KSBpcyBvZiB0eXBlIFVURjhTdHJpbmcgYW5kCisJCQkJY29udGFpbnMgdGV4dCB0aGF0IE1BWSBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuICBXaGVuIHVzZWQgaW4gYW4KKwkJCQlBQS1BbnN3ZXIgbWVzc2FnZSB3aXRoIGEgc3VjY2Vzc2Z1bCBSZXN1bHQtQ29kZSBBVlAsIGl0IGluZGljYXRlcworCQkJCXN1Y2Nlc3MuICBXaGVuIGZvdW5kIGluIGFuIEFBQSBtZXNzYWdlIHdpdGggYSBSZXN1bHQtQ29kZSBvdGhlciB0aGFuCisJCQkJRElBTUVURVJfU1VDQ0VTUywgdGhlIEFWUCBjb250YWlucyBhIGZhaWx1cmUgbWVzc2FnZS4KKworCQkJCVRoZSBSZXBseS1NZXNzYWdlIEFWUCBNQVkgaW5kaWNhdGUgZGlhbG9nIHRleHQgdG8gcHJvbXB0IHRoZSB1c2VyCisJCQkJYmVmb3JlIGFub3RoZXIgQUEtUmVxdWVzdCBhdHRlbXB0LiAgV2hlbiB1c2VkIGluIGFuIEFBLUFuc3dlciB3aXRoIGEKKwkJCQlSZXN1bHQtQ29kZSBvZiBESUFNRVRFUl9NVUxUSV9ST1VORF9BVVRIIG9yIGluIGFuIFJlLUF1dGgtUmVxdWVzdAorCQkJCW1lc3NhZ2UsIGl0IE1BWSBjb250YWluIGEgZGlhbG9nIHRleHQgdG8gcHJvbXB0IHRoZSB1c2VyIGZvciBhCisJCQkJcmVzcG9uc2UuCisKKwkJCQlNdWx0aXBsZSBSZXBseS1NZXNzYWdlcyBNQVkgYmUgaW5jbHVkZWQsIGFuZCBpZiBhbnkgYXJlIGRpc3BsYXllZCwKKwkJCQl0aGV5IE1VU1QgYmUgZGlzcGxheWVkIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZXkgYXBwZWFyIGluIHRoZQorCQkJCURpYW1ldGVyIG1lc3NhZ2UuCisJCQkqLworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTE4LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIlJlcGx5LU1lc3NhZ2UiLCAJCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCSAJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9CisJCQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgTkFTIEF1dGhlbnRpY2F0aW9uIEFWUHMgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8JCQorCQkvKiBVc2VyLVBhc3N3b3JkICovCisJCXsKKwkJCS8qCisJCQkJVGhlIFVzZXItUGFzc3dvcmQgQVZQIChBVlAgQ29kZSAyKSBpcyBvZiB0eXBlIE9jdGV0U3RyaW5nIGFuZAorCQkJCWNvbnRhaW5zIHRoZSBwYXNzd29yZCBvZiB0aGUgdXNlciB0byBiZSBhdXRoZW50aWNhdGVkLCBvciB0aGUgdXNlcidzCisJCQkJaW5wdXQgaW4gYSBtdWx0aS1yb3VuZCBhdXRoZW50aWNhdGlvbiBleGNoYW5nZS4KKworCQkJCVRoZSBVc2VyLVBhc3N3b3JkIEFWUCBjb250YWlucyBhIHVzZXIgcGFzc3dvcmQgb3Igb25lLXRpbWUgcGFzc3dvcmQKKwkJCQlhbmQgdGhlcmVmb3JlIHJlcHJlc2VudHMgc2Vuc2l0aXZlIGluZm9ybWF0aW9uLiAgQXMgcmVxdWlyZWQgaW4KKwkJCQlbQkFTRV0sIERpYW1ldGVyIG1lc3NhZ2VzIGFyZSBlbmNyeXB0ZWQgYnkgdXNpbmcgSVBzZWMgb3IgVExTLgorCQkJCVVubGVzcyB0aGlzIEFWUCBpcyB1c2VkIGZvciBvbmUtdGltZSBwYXNzd29yZHMsIHRoZSBVc2VyLVBhc3N3b3JkIEFWUAorCQkJCVNIT1VMRCBOT1QgYmUgdXNlZCBpbiB1bnRydXN0ZWQgcHJveHkgZW52aXJvbm1lbnRzIHdpdGhvdXQgZW5jcnlwdGluZworCQkJCWl0IGJ5IHVzaW5nIGVuZC10by1lbmQgc2VjdXJpdHkgdGVjaG5pcXVlcywgc3VjaCBhcyB0aGUgcHJvcG9zZWQgQ01TCisJCQkJU2VjdXJpdHkgW0RpYW1DTVNdLgorCisJCQkJVGhlIGNsZWFyLXRleHQgcGFzc3dvcmQgKHByaW9yIHRvIGVuY3J5cHRpb24pIE1VU1QgTk9UIGJlIGxvbmdlciB0aGFuCisJCQkJMTI4IGJ5dGVzIGluIGxlbmd0aC4KKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJCQkJMiwgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJVc2VyLVBhc3N3b3JkIiwgCQkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgTlVMTCk7CisJCX0KKwkJCisJCS8qIFBhc3N3b3JkLVJldHJ5ICovCisJCXsKKwkJCS8qCisJCQkJVGhlIFBhc3N3b3JkLVJldHJ5IEFWUCAoQVZQIENvZGUgNzUpIGlzIG9mIHR5cGUgVW5zaWduZWQzMiBhbmQgTUFZIGJlCisJCQkJaW5jbHVkZWQgaW4gdGhlIEFBLUFuc3dlciBpZiB0aGUgUmVzdWx0LUNvZGUgaW5kaWNhdGVzIGFuCisJCQkJYXV0aGVudGljYXRpb24gZmFpbHVyZS4gIFRoZSB2YWx1ZSBvZiB0aGlzIEFWUCBpbmRpY2F0ZXMgaG93IG1hbnkKKwkJCQlhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyBhIHVzZXIgaXMgcGVybWl0dGVkIGJlZm9yZSBiZWluZworCQkJCWRpc2Nvbm5lY3RlZC4gIFRoaXMgQVZQIGlzIHByaW1hcmlseSBpbnRlbmRlZCBmb3IgdXNlIHdoZW4gdGhlCisJCQkJRnJhbWVkLVByb3RvY29sIEFWUCAoc2VlIHNlY3Rpb24gNi4xMC4xKSBpcyBzZXQgdG8gQVJBUC4KKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJCQkJNzUsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiUGFzc3dvcmQtUmV0cnkiLCAJCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCSAJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfVU5TSUdORUQzMiAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsIE5VTEwpOworCQl9CisJCQorCQkvKiBQcm9tcHQgKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgUHJvbXB0IEFWUCAoQVZQIENvZGUgNzYpIGlzIG9mIHR5cGUgRW51bWVyYXRlZCBhbmQgTUFZIGJlIHByZXNlbnQKKwkJCQlpbiB0aGUgQUEtQW5zd2VyIG1lc3NhZ2UuICBXaGVuIHByZXNlbnQsIGl0IGlzIHVzZWQgYnkgdGhlIE5BUyB0bworCQkJCWRldGVybWluZSB3aGV0aGVyIHRoZSB1c2VyJ3MgcmVzcG9uc2UsIHdoZW4gZW50ZXJlZCwgc2hvdWxkIGJlCisJCQkJZWNob2VkLgorCisJCQkJVGhlIHN1cHBvcnRlZCB2YWx1ZXMgYXJlIGxpc3RlZCBpbiBodHRwOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL3JhZGl1cy10eXBlcworCQkJCVN1Yi1yZWdpc3RyeTogVmFsdWVzIGZvciBSQURJVVMgQXR0cmlidXRlIDc2LCBQcm9tcHQKKwkJCQlSZWZlcmVuY2U6IFtSRkMyODY5XQorCQkJKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAJKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgCSB0ZGF0YSA9IHsgQVZQX1RZUEVfVU5TSUdORUQzMiwJIkVudW1lcmF0ZWQoUHJvbXB0KSIJLCBOVUxMLCBOVUxMfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSB0dmFsc1tdID0geworCQkJCWVudW12YWxfZGVmX3UzMiggMCwgIk5vIEVjaG8gW1JGQzI4NjldIiksCisJCQkJZW51bXZhbF9kZWZfdTMyKCAxLCAiRWNobyBbUkZDMjg2OV0iKQorCQkJfTsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQkJCQk3NiwgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJQcm9tcHQiLCAJCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCSAJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfVU5TSUdORUQzMiAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCQkJaW50IGk7CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgZW51bWVyYXRlZCB2YWx1ZXMsIGFuZCB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEgLCBOVUxMLCAmdHlwZSk7CisJCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHR2YWxzKSAvIHNpemVvZih0dmFsc1swXSk7IGkrKykgeworCQkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0dmFsc1tpXSwgdHlwZSwgTlVMTCk7CisJCQl9CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgdHlwZSwgTlVMTCk7CisJCX0KKwkJCisJCS8qIENIQVAtQWxnb3JpdGhtICovCisJCXsKKwkJCS8qCisJCQkJVGhlIENIQVAtQWxnb3JpdGhtIEFWUCAoQVZQIENvZGUgNDAzKSBpcyBvZiB0eXBlIEVudW1lcmF0ZWQgYW5kCisJCQkJY29udGFpbnMgdGhlIGFsZ29yaXRobSBpZGVudGlmaWVyIHVzZWQgaW4gdGhlIGNvbXB1dGF0aW9uIG9mIHRoZSBDSEFQCisJCQkJcmVzcG9uc2UgW1BQUENIQVBdLiAgVGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQ6CisKKwkJCQlDSEFQIHdpdGggTUQ1ICAgICAgIDUKKwkJCQkgVGhlIENIQVAgcmVzcG9uc2UgaXMgY29tcHV0ZWQgYnkgdXNpbmcgdGhlIHByb2NlZHVyZSBkZXNjcmliZWQKKwkJCQkgaW4gW1BQUENIQVBdLiAgVGhpcyBhbGdvcml0aG0gcmVxdWlyZXMgdGhhdCB0aGUgQ0hBUC1SZXNwb25zZQorCQkJCSBBVlAgTVVTVCBiZSBwcmVzZW50IGluIHRoZSBDSEFQLUF1dGggQVZQLgorCQkJKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAJKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgCSB0ZGF0YSA9IHsgQVZQX1RZUEVfVU5TSUdORUQzMiwJIkVudW1lcmF0ZWQoQ0hBUC1BbGdvcml0aG0pIgksIE5VTEwsIE5VTEx9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIHR2YWxzW10gPSB7CisJCQkJZW51bXZhbF9kZWZfdTMyKCA1LCAiQ0hBUCB3aXRoIE1ENSIpCisJCQl9OworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgYWRhdGEgPSB7IAorCQkJCQk0MDMsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiQ0hBUC1BbGdvcml0aG0iLCAJCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCQkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9VTlNJR05FRDMyIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlpbnQgaTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSAsIE5VTEwsICZ0eXBlKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBzaXplb2YodHZhbHMpIC8gc2l6ZW9mKHR2YWxzWzBdKTsgaSsrKSB7CisJCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnR2YWxzW2ldLCB0eXBlLCBOVUxMKTsKKwkJCX0KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmFkYXRhICwgdHlwZSwgTlVMTCk7CisJCX0KKwkJCisJCS8qIENIQVAtSWRlbnQgKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgQ0hBUC1JZGVudCBBVlAgKEFWUCBDb2RlIDQwNCkgaXMgb2YgdHlwZSBPY3RldFN0cmluZyBhbmQgY29udGFpbnMKKwkJCQl0aGUgMSBvY3RldCBDSEFQIElkZW50aWZpZXIgdXNlZCBpbiB0aGUgY29tcHV0YXRpb24gb2YgdGhlIENIQVAKKwkJCQlyZXNwb25zZSBbUFBQQ0hBUF0uCisJCQkqLworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgYWRhdGEgPSB7IAorCQkJCQk0MDQsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiQ0hBUC1JZGVudCIsIAkJCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCQkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORyAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmYWRhdGEgLCBOVUxMLCBOVUxMKTsKKwkJfQorCQkJCisJCS8qIENIQVAtUmVzcG9uc2UgKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgQ0hBUC1SZXNwb25zZSBBVlAgKEFWUCBDb2RlIDQwNSkgaXMgb2YgdHlwZSBPY3RldFN0cmluZyBhbmQKKwkJCQljb250YWlucyB0aGUgMTYgb2N0ZXQgYXV0aGVudGljYXRpb24gZGF0YSBwcm92aWRlZCBieSB0aGUgdXNlciBpbgorCQkJCXJlc3BvbnNlIHRvIHRoZSBDSEFQIGNoYWxsZW5nZSBbUFBQQ0hBUF0uCisJCQkqLworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgYWRhdGEgPSB7IAorCQkJCQk0MDUsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiQ0hBUC1SZXNwb25zZSIsIAkJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZhZGF0YSAsIE5VTEwsIE5VTEwpOworCQl9CisJCQkKKwkJLyogQ0hBUC1BdXRoICovCisJCXsKKwkJCS8qCisJCQkJVGhlIENIQVAtQXV0aCBBVlAgKEFWUCBDb2RlIDQwMikgaXMgb2YgdHlwZSBHcm91cGVkIGFuZCBjb250YWlucyB0aGUKKwkJCQlpbmZvcm1hdGlvbiBuZWNlc3NhcnkgdG8gYXV0aGVudGljYXRlIGEgdXNlciB1c2luZyB0aGUgUFBQCisJCQkJQ2hhbGxlbmdlLUhhbmRzaGFrZSBBdXRoZW50aWNhdGlvbiBQcm90b2NvbCAoQ0hBUCkgW1BQUENIQVBdLiAgSWYgdGhlCisJCQkJQ0hBUC1BdXRoIEFWUCBpcyBmb3VuZCBpbiBhIG1lc3NhZ2UsIHRoZSBDSEFQLUNoYWxsZW5nZSBBVlAgTVVTVCBiZQorCQkJCXByZXNlbnQgYXMgd2VsbC4gIFRoZSBvcHRpb25hbCBBVlBzIGNvbnRhaW5pbmcgdGhlIENIQVAgcmVzcG9uc2UKKwkJCQlkZXBlbmQgdXBvbiB0aGUgdmFsdWUgb2YgdGhlIENIQVAtQWxnb3JpdGhtIEFWUC4gIFRoZSBncm91cGVkIEFWUCBoYXMKKwkJCQl0aGUgZm9sbG93aW5nIEFCTkYgZ3JhbW1hcjoKKworCQkJCUNIQVAtQXV0aCAgOjo9IDwgQVZQIEhlYWRlcjogNDAyID4KKyAgICAgICAgCQkJCSAgICAgeyBDSEFQLUFsZ29yaXRobSB9CisgICAgICAgIAkJCQkgICAgIHsgQ0hBUC1JZGVudCB9CisgICAgICAgIAkJCQkgICAgIFsgQ0hBUC1SZXNwb25zZSBdCisgICAgICAgIAkJCQkgICAqIFsgQVZQIF0KKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJCQkJNDAyLCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIkNIQVAtQXV0aCIsIAkJCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCQkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9HUk9VUEVEIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0gCisJCQkJCQl7IAkgeyAgIkNIQVAtQWxnb3JpdGhtIiwgCQkJUlVMRV9SRVFVSVJFRCwgLTEsIDEgfQorCQkJCQkJCSx7ICAiQ0hBUC1JZGVudCIsCQkJUlVMRV9SRVFVSVJFRCwgLTEsIDEgfQorCQkJCQkJCSx7ICAiQ0hBUC1SZXNwb25zZSIsCQkJUlVMRV9PUFRJT05BTCwgLTEsIDEgfQorCQkJCQkJfTsKKwkJCQorCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJCX0KKwkJCisJCS8qIENIQVAtQ2hhbGxlbmdlICovCisJCXsKKwkJCS8qCisJCQkJVGhlIENIQVAtQ2hhbGxlbmdlIEFWUCAoQVZQIENvZGUgNjApIGlzIG9mIHR5cGUgT2N0ZXRTdHJpbmcgYW5kCisJCQkJY29udGFpbnMgdGhlIENIQVAgQ2hhbGxlbmdlIHNlbnQgYnkgdGhlIE5BUyB0byB0aGUgQ0hBUCBwZWVyCisJCQkJW1BQUENIQVBdLgorCQkJKi8KKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQkJCQk2MCwgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJDSEFQLUNoYWxsZW5nZSIsIAkJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORyAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsIE5VTEwpOworCQl9CisJCQorCQkvKiBBUkFQLVBhc3N3b3JkICovCisJCXsKKwkJCS8qCisJCQkJVGhlIEFSQVAtUGFzc3dvcmQgQVZQIChBVlAgQ29kZSA3MCkgaXMgb2YgdHlwZSBPY3RldFN0cmluZyBhbmQgaXMKKwkJCQlvbmx5IHByZXNlbnQgd2hlbiB0aGUgRnJhbWVkLVByb3RvY29sIEFWUCAoc2VlIHNlY3Rpb24gNi4xMC4xKSBpcworCQkJCWluY2x1ZGVkIGluIHRoZSBtZXNzYWdlIGFuZCBpcyBzZXQgdG8gQVJBUC4gIFRoaXMgQVZQIE1VU1QgTk9UIGJlCisJCQkJcHJlc2VudCBpZiBlaXRoZXIgdGhlIFVzZXItUGFzc3dvcmQgb3IgdGhlIENIQVAtQXV0aCBBVlAgaXMgcHJlc2VudC4KKwkJCQlTZWUgW1JBRElVU0V4dF0gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIGNvbnRlbnRzIG9mIHRoaXMgQVZQLgorCQkJKi8KKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQkJCQk3MCwgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJBUkFQLVBhc3N3b3JkIiwgCQkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgTlVMTCk7CisJCX0KKwkJCisJCS8qIEFSQVAtQ2hhbGxlbmdlLVJlc3BvbnNlICovCisJCXsKKwkJCS8qCisJCQkJVGhlIEFSQVAtQ2hhbGxlbmdlLVJlc3BvbnNlIEFWUCAoQVZQIENvZGUgODQpIGlzIG9mIHR5cGUgT2N0ZXRTdHJpbmcKKwkJCQlhbmQgaXMgb25seSBwcmVzZW50IHdoZW4gdGhlIEZyYW1lZC1Qcm90b2NvbCBBVlAgKHNlZSBzZWN0aW9uIDYuMTAuMSkKKwkJCQlpcyBpbmNsdWRlZCBpbiB0aGUgbWVzc2FnZSBhbmQgaXMgc2V0IHRvIEFSQVAuICBUaGlzIEFWUCBjb250YWlucyBhbgorCQkJCTggb2N0ZXQgcmVzcG9uc2UgdG8gdGhlIGRpYWwtaW4gY2xpZW50J3MgY2hhbGxlbmdlLiAgVGhlIFJBRElVUworCQkJCXNlcnZlciBjYWxjdWxhdGVzIHRoaXMgdmFsdWUgYnkgdGFraW5nIHRoZSBkaWFsLWluIGNsaWVudCdzIGNoYWxsZW5nZQorCQkJCWZyb20gdGhlIGhpZ2gtb3JkZXIgOCBvY3RldHMgb2YgdGhlIEFSQVAtUGFzc3dvcmQgQVZQIGFuZCBwZXJmb3JtaW5nCisJCQkJREVTIGVuY3J5cHRpb24gb24gdGhpcyB2YWx1ZSB3aXRoIHRoZSBhdXRoZW50aWNhdGluZyB1c2VyJ3MgcGFzc3dvcmQKKwkJCQlhcyB0aGUga2V5LiAgSWYgdGhlIHVzZXIncyBwYXNzd29yZCBpcyBmZXdlciB0aGFuIDggb2N0ZXRzIGluIGxlbmd0aCwKKwkJCQl0aGUgcGFzc3dvcmQgaXMgcGFkZGVkIGF0IHRoZSBlbmQgd2l0aCBOVUxMIG9jdGV0cyB0byBhIGxlbmd0aCBvZiA4CisJCQkJYmVmb3JlIGl0IGlzIHVzZWQgYXMgYSBrZXkuCisJCQkqLworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTg0LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIkFSQVAtQ2hhbGxlbmdlLVJlc3BvbnNlIiwgCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCSAJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCBOVUxMKTsKKwkJfQorCQkKKwkJLyogQVJBUC1TZWN1cml0eSAqLworCQl7CisJCQkvKgorCQkJCVRoZSBBUkFQLVNlY3VyaXR5IEFWUCAoQVZQIENvZGUgNzMpIGlzIG9mIHR5cGUgVW5zaWduZWQzMiBhbmQgTUFZIGJlCisJCQkJcHJlc2VudCBpbiB0aGUgQUEtQW5zd2VyIG1lc3NhZ2UgaWYgdGhlIEZyYW1lZC1Qcm90b2NvbCBBVlAgKHNlZQorCQkJCXNlY3Rpb24gNi4xMC4xKSBpcyBzZXQgdG8gdGhlIHZhbHVlIG9mIEFSQVAsIGFuZCB0aGUgUmVzdWx0LUNvZGUgQVZQCisJCQkJaXMgc2V0IHRvIERJQU1FVEVSX01VTFRJX1JPVU5EX0FVVEguICBTZWUgW1JBRElVU0V4dF0gZm9yIG1vcmUKKwkJCQlpbmZvcm1hdGlvbiBvbiB0aGUgZm9ybWF0IG9mIHRoaXMgQVZQLgorCQkJKi8KKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQkJCQk3MywgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJBUkFQLVNlY3VyaXR5IiwgCQkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCBOVUxMKTsKKwkJfQorCQkKKwkJLyogQVJBUC1TZWN1cml0eS1EYXRhICovCisJCXsKKwkJCS8qCisJCQkJVGhlIEFSQVAtU2VjdXJpdHktRGF0YSBBVlAgKEFWUCBDb2RlIDc0KSBpcyBvZiB0eXBlIE9jdGV0U3RyaW5nIGFuZCBNQVkgYmUKKwkJCQlwcmVzZW50IGluIHRoZSBBQS1SZXF1ZXN0IG9yIEFBLUFuc3dlciBtZXNzYWdlIGlmIHRoZSBGcmFtZWQtUHJvdG9jb2wKKwkJCQlBVlAgaXMgc2V0IHRvIHRoZSB2YWx1ZSBvZiBBUkFQLCBhbmQgdGhlIFJlc3VsdC1Db2RlIEFWUCBpcyBzZXQgdG8KKwkJCQlESUFNRVRFUl9NVUxUSV9ST1VORF9BVVRILiAgVGhpcyBBVlAgY29udGFpbnMgdGhlIHNlY3VyaXR5IG1vZHVsZQorCQkJCWNoYWxsZW5nZSBvciByZXNwb25zZSBhc3NvY2lhdGVkIHdpdGggdGhlIEFSQVAgU2VjdXJpdHkgTW9kdWxlCisJCQkJc3BlY2lmaWVkIGluIEFSQVAtU2VjdXJpdHkuCisJCQkqLworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTc0LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIkFSQVAtU2VjdXJpdHktRGF0YSIsIAkJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORyAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsIE5VTEwpOworCQl9CisJCQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgTkFTIEF1dGhvcml6YXRpb24gQVZQcyAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8JCQorCQkvKiBTZXJ2aWNlLVR5cGUgKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgU2VydmljZS1UeXBlIEFWUCAoQVZQIENvZGUgNikgaXMgb2YgdHlwZSBFbnVtZXJhdGVkIGFuZCBjb250YWlucworCQkJCXRoZSB0eXBlIG9mIHNlcnZpY2UgdGhlIHVzZXIgaGFzIHJlcXVlc3RlZCBvciB0aGUgdHlwZSBvZiBzZXJ2aWNlIHRvCisJCQkJYmUgcHJvdmlkZWQuICBPbmUgc3VjaCBBVlAgTUFZIGJlIHByZXNlbnQgaW4gYW4gYXV0aGVudGljYXRpb24gYW5kL29yCisJCQkJYXV0aG9yaXphdGlvbiByZXF1ZXN0IG9yIHJlc3BvbnNlLiAgQSBOQVMgaXMgbm90IHJlcXVpcmVkIHRvCisJCQkJaW1wbGVtZW50IGFsbCBvZiB0aGVzZSBzZXJ2aWNlIHR5cGVzLiAgSXQgTVVTVCB0cmVhdCB1bmtub3duIG9yCisJCQkJdW5zdXBwb3J0ZWQgU2VydmljZS1UeXBlcyByZWNlaXZlZCBpbiBhIHJlc3BvbnNlIGFzIGEgZmFpbHVyZSBhbmQgZW5kCisJCQkJdGhlIHNlc3Npb24gd2l0aCBhIERJQU1FVEVSX0lOVkFMSURfQVZQX1ZBTFVFIFJlc3VsdC1Db2RlLgorCisJCQkJV2hlbiB1c2VkIGluIGEgcmVxdWVzdCwgdGhlIFNlcnZpY2UtVHlwZSBBVlAgU0hPVUxEIGJlIGNvbnNpZGVyZWQgYQorCQkJCWhpbnQgdG8gdGhlIHNlcnZlciB0aGF0IHRoZSBOQVMgYmVsaWV2ZXMgdGhlIHVzZXIgd291bGQgcHJlZmVyIHRoZQorCQkJCWtpbmQgb2Ygc2VydmljZSBpbmRpY2F0ZWQuICBUaGUgc2VydmVyIGlzIG5vdCByZXF1aXJlZCB0byBob25vciB0aGUKKwkJCQloaW50LiAgRnVydGhlcm1vcmUsIGlmIHRoZSBzZXJ2aWNlIHNwZWNpZmllZCBieSB0aGUgc2VydmVyIGlzCisJCQkJc3VwcG9ydGVkLCBidXQgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgY3VycmVudCBtb2RlIG9mIGFjY2VzcywgdGhlCisJCQkJTkFTIE1VU1QgZmFpbCB0byBzdGFydCB0aGUgc2Vzc2lvbi4gIFRoZSBOQVMgTVVTVCBhbHNvIGdlbmVyYXRlIHRoZQorCQkJCWFwcHJvcHJpYXRlIGVycm9yIG1lc3NhZ2UocykuCisKKwkJCQlUaGUgZm9sbG93aW5nIHZhbHVlcyBoYXZlIGJlZW4gZGVmaW5lZCBmb3IgdGhlIFNlcnZpY2UtVHlwZSBBVlAuICBUaGUKKwkJCQljb21wbGV0ZSBsaXN0IG9mIGRlZmluZWQgdmFsdWVzIGNhbiBiZSBmb3VuZCBpbiBbUkFESVVTXSBhbmQKKwkJCQlbUkFESVVTVHlwZXNdLgorCisJCQkJUmVnaXN0cnkgTmFtZTogUmFkaXVzIEF0dHJpYnV0ZSBWYWx1ZXMKKwkJCQlSZWZlcmVuY2U6IFtSRkMyODY1XVtSRkMzNTc1XQorCisJCQkJU3ViLXJlZ2lzdHJ5OiBWYWx1ZXMgZm9yIFJBRElVUyBBdHRyaWJ1dGUgNiwgU2VydmljZS1UeXBlCisJCQkJUmVmZXJlbmNlOiBbUkZDMjg2NV1bUkZDMzU3NV0KKworCQkJCTEgIExvZ2luCisJCQkJMiAgRnJhbWVkCisJCQkJMyAgQ2FsbGJhY2sgTG9naW4KKwkJCQk0ICBDYWxsYmFjayBGcmFtZWQKKwkJCQk1ICBPdXRib3VuZAorCQkJCTYgIEFkbWluaXN0cmF0aXZlCisJCQkJNyAgTkFTIFByb21wdAorCQkJCTggIEF1dGhlbnRpY2F0ZSBPbmx5CisJCQkJOSAgQ2FsbGJhY2sgTkFTIFByb21wdAorCQkJCTEwICBDYWxsIENoZWNrCisJCQkJMTEgIENhbGxiYWNrIEFkbWluaXN0cmF0aXZlCisJCQkJMTIgIFZvaWNlICAgICAgICAgICBbQ2hpYmFdCisJCQkJMTMgIEZheCAgICAgICAgICAgICBbQ2hpYmFdCisJCQkJMTQgIE1vZGVtIFJlbGF5CSAgICBbQ2hpYmFdCisJCQkJMTUgIElBUFAtUmVnaXN0ZXIgICBbSUVFRSA4MDIuMTFmXVtLZXJyeV0KKwkJCQkxNiAgSUFQUC1BUC1DaGVjayAgIFtJRUVFIDgwMi4xMWZdW0tlcnJ5XQorCQkJCTE3ICBBdXRob3JpemUgT25seSAgW1JGQzM1NzZdCisKKwkJCQlUaGUgZm9sbG93aW5nIHZhbHVlcyBhcmUgZnVydGhlciBxdWFsaWZpZWQ6CisKKwkJCQlMb2dpbiAgICAgICAgICAgICAgIDEKKwkJCQkgVGhlIHVzZXIgc2hvdWxkIGJlIGNvbm5lY3RlZCB0byBhIGhvc3QuICBUaGUgbWVzc2FnZSBNQVkKKwkJCQkgaW5jbHVkZSBhZGRpdGlvbmFsIEFWUHMgZGVmaW5lZCBpbiBzZWN0aW9ucyA2LjE2IG9yIDYuMTcuCisKKwkJCQlGcmFtZWQgICAgICAgICAgICAgIDIKKwkJCQkgQSBGcmFtZWQgUHJvdG9jb2wsIHN1Y2ggYXMgUFBQIG9yIFNMSVAsIHNob3VsZCBiZSBzdGFydGVkIGZvcgorCQkJCSB0aGUgVXNlci4gIFRoZSBtZXNzYWdlIE1BWSBpbmNsdWRlIGFkZGl0aW9uYWwgQVZQcyBkZWZpbmVkIGluCisJCQkJIHNlY3Rpb24gNi4xMCwgb3Igc2VjdGlvbiA3IGZvciB0dW5uZWxpbmcgc2VydmljZXMuCisKKwkJCQlDYWxsYmFjayBMb2dpbiAgICAgIDMKKwkJCQkgVGhlIHVzZXIgc2hvdWxkIGJlIGRpc2Nvbm5lY3RlZCBhbmQgY2FsbGVkIGJhY2ssIHRoZW4gY29ubmVjdGVkCisJCQkJIHRvIGEgaG9zdC4gIFRoZSBtZXNzYWdlIE1BWSBpbmNsdWRlIGFkZGl0aW9uYWwgQVZQcyBkZWZpbmVkIGluCisJCQkJIHRoaXMgc2VjdGlvbi4KKworCQkJCUNhbGxiYWNrIEZyYW1lZCAgICAgNAorCQkJCSBUaGUgdXNlciBzaG91bGQgYmUgZGlzY29ubmVjdGVkIGFuZCBjYWxsZWQgYmFjaywgYW5kIHRoZW4gYQorCQkJCSBGcmFtZWQgUHJvdG9jb2wsIHN1Y2ggYXMgUFBQIG9yIFNMSVAsIHNob3VsZCBiZSBzdGFydGVkIGZvciB0aGUKKwkJCQkgVXNlci4gIFRoZSBtZXNzYWdlIE1BWSBpbmNsdWRlIGFkZGl0aW9uYWwgQVZQcyBkZWZpbmVkIGluCisJCQkJIHNlY3Rpb24gNi4xMCwgb3IgaW4gc2VjdGlvbiA3IGZvciB0dW5uZWxpbmcgc2VydmljZXMuCisKKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgCSp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhIAkgdGRhdGEgPSB7IEFWUF9UWVBFX1VOU0lHTkVEMzIsCSJFbnVtZXJhdGVkKFNlcnZpY2UtVHlwZSkiCSwgTlVMTCwgTlVMTH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgdHZhbHNbXSA9IHsKKwkJCQllbnVtdmFsX2RlZl91MzIoIDEsICJMb2dpbiIpLAorCQkJCWVudW12YWxfZGVmX3UzMiggMiwgIkZyYW1lZCIpLAorCQkJCWVudW12YWxfZGVmX3UzMiggMywgIkNhbGxiYWNrIExvZ2luIiksCisJCQkJZW51bXZhbF9kZWZfdTMyKCA0LCAiQ2FsbGJhY2sgRnJhbWVkIiksCisJCQkJZW51bXZhbF9kZWZfdTMyKCA1LCAiT3V0Ym91bmQiKSwKKwkJCQllbnVtdmFsX2RlZl91MzIoIDYsICJBZG1pbmlzdHJhdGl2ZSIpLAorCQkJCWVudW12YWxfZGVmX3UzMiggNywgIk5BUyBQcm9tcHQiKSwKKwkJCQllbnVtdmFsX2RlZl91MzIoIDgsICJBdXRoZW50aWNhdGUgT25seSIpLAorCQkJCWVudW12YWxfZGVmX3UzMiggOSwgIkNhbGxiYWNrIE5BUyBQcm9tcHQiKSwKKwkJCQllbnVtdmFsX2RlZl91MzIoMTAsICJDYWxsIENoZWNrIiksCisJCQkJZW51bXZhbF9kZWZfdTMyKDExLCAiQ2FsbGJhY2sgQWRtaW5pc3RyYXRpdmUiKSwKKwkJCQllbnVtdmFsX2RlZl91MzIoMTIsICJWb2ljZSBbQ2hpYmFdIiksCisJCQkJZW51bXZhbF9kZWZfdTMyKDEzLCAiRmF4IFtDaGliYV0iKSwKKwkJCQllbnVtdmFsX2RlZl91MzIoMTQsICJNb2RlbSBSZWxheSBbQ2hpYmFdIiksCisJCQkJZW51bXZhbF9kZWZfdTMyKDE1LCAiSUFQUC1SZWdpc3RlciBbSUVFRSA4MDIuMTFmXVtLZXJyeV0iKSwKKwkJCQllbnVtdmFsX2RlZl91MzIoMTYsICJJQVBQLUFQLUNoZWNrIFtJRUVFIDgwMi4xMWZdW0tlcnJ5XSIpLAorCQkJCWVudW12YWxfZGVmX3UzMigxNywgIkF1dGhvcml6ZSBPbmx5IFtSRkMzNTc2XSIpCisJCQl9OworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTYsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiU2VydmljZS1UeXBlIiwgCQkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCWludCBpOworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGVudW1lcmF0ZWQgdmFsdWVzLCBhbmQgdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhICwgTlVMTCwgJnR5cGUpOworCQkJZm9yIChpID0gMDsgaSA8IHNpemVvZih0dmFscykgLyBzaXplb2YodHZhbHNbMF0pOyBpKyspIHsKKwkJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdHZhbHNbaV0sIHR5cGUsIE5VTEwpOworCQkJfQorCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIHR5cGUsIE5VTEwpOworCQl9CisJCQorCQkvKiBDYWxsYmFjay1OdW1iZXIgKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgQ2FsbGJhY2stTnVtYmVyIEFWUCAoQVZQIENvZGUgMTkpIGlzIG9mIHR5cGUgVVRGOFN0cmluZyBhbmQKKwkJCQljb250YWlucyBhIGRpYWxpbmcgc3RyaW5nIHRvIGJlIHVzZWQgZm9yIGNhbGxiYWNrLiAgSXQgTUFZIGJlIHVzZWQgaW4KKwkJCQlhbiBhdXRoZW50aWNhdGlvbiBhbmQvb3IgYXV0aG9yaXphdGlvbiByZXF1ZXN0IGFzIGEgaGludCB0byB0aGUKKwkJCQlzZXJ2ZXIgdGhhdCBhIENhbGxiYWNrIHNlcnZpY2UgaXMgZGVzaXJlZCwgYnV0IHRoZSBzZXJ2ZXIgaXMgbm90CisJCQkJcmVxdWlyZWQgdG8gaG9ub3IgdGhlIGhpbnQgaW4gdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2UuCisJCQkqLworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTE5LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIkNhbGxiYWNrLU51bWJlciIsIAkJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORyAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX0KKwkJCisJCS8qIENhbGxiYWNrLUlkICovCisJCXsKKwkJCS8qCisJCQkJVGhlIENhbGxiYWNrLUlkIEFWUCAoQVZQIENvZGUgMjApIGlzIG9mIHR5cGUgVVRGOFN0cmluZyBhbmQgY29udGFpbnMKKwkJCQl0aGUgbmFtZSBvZiBhIHBsYWNlIHRvIGJlIGNhbGxlZCwgdG8gYmUgaW50ZXJwcmV0ZWQgYnkgdGhlIE5BUy4gIFRoaXMKKwkJCQlBVlAgTUFZIGJlIHByZXNlbnQgaW4gYW4gYXV0aGVudGljYXRpb24gYW5kL29yIGF1dGhvcml6YXRpb24KKwkJCQlyZXNwb25zZS4KKworCQkJCVRoaXMgQVZQIGlzIG5vdCByb2FtaW5nLWZyaWVuZGx5IGFzIGl0IGFzc3VtZXMgdGhhdCB0aGUgQ2FsbGJhY2stSWQKKwkJCQlpcyBjb25maWd1cmVkIG9uIHRoZSBOQVMuICBVc2luZyB0aGUgQ2FsbGJhY2stTnVtYmVyIEFWUCB0aGVyZWZvcmUKKwkJCQlwcmVmZXJhYmxlLgorCQkJKi8KKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQkJCQkyMCwgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJDYWxsYmFjay1JZCIsIAkJCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCSAJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9CisJCQorCQkvKiBJZGxlLVRpbWVvdXQgKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgSWRsZS1UaW1lb3V0IEFWUCAoQVZQIENvZGUgMjgpIGlzIG9mIHR5cGUgVW5zaWduZWQzMiBhbmQgc2V0cyB0aGUKKwkJCQltYXhpbXVtIG51bWJlciBvZiBjb25zZWN1dGl2ZSBzZWNvbmRzIG9mIGlkbGUgY29ubmVjdGlvbiBhbGxvd2FibGUgdG8KKwkJCQl0aGUgdXNlciBiZWZvcmUgdGVybWluYXRpb24gb2YgdGhlIHNlc3Npb24gb3IgYmVmb3JlIGEgcHJvbXB0IGlzCisJCQkJaXNzdWVkLiAgVGhlIGRlZmF1bHQgaXMgbm9uZSwgb3Igc3lzdGVtIHNwZWNpZmljLgorCQkJKi8KKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQkJCQkyOCwgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJJZGxlLVRpbWVvdXQiLCAJCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCSAJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfVU5TSUdORUQzMiAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsIE5VTEwpOworCQl9CisJCQorCQkvKiBQb3J0LUxpbWl0ICovCisJCXsKKwkJCS8qCisJCQkJVGhlIFBvcnQtTGltaXQgQVZQIChBVlAgQ29kZSA2MikgaXMgb2YgdHlwZSBVbnNpZ25lZDMyIGFuZCBzZXRzIHRoZQorCQkJCW1heGltdW0gbnVtYmVyIG9mIHBvcnRzIHRoZSBOQVMgcHJvdmlkZXMgdG8gdGhlIHVzZXIuICBJdCBNQVkgYmUgdXNlZAorCQkJCWluIGFuIGF1dGhlbnRpY2F0aW9uIGFuZC9vciBhdXRob3JpemF0aW9uIHJlcXVlc3QgYXMgYSBoaW50IHRvIHRoZQorCQkJCXNlcnZlciB0aGF0IG11bHRpbGluayBQUFAgW1BQUE1QXSBzZXJ2aWNlIGlzIGRlc2lyZWQsIGJ1dCB0aGUgc2VydmVyCisJCQkJaXMgbm90IHJlcXVpcmVkIHRvIGhvbm9yIHRoZSBoaW50IGluIHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlLgorCQkJKi8KKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQkJCQk2MiwgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJQb3J0LUxpbWl0IiwgCQkJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9VTlNJR05FRDMyIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgTlVMTCk7CisJCX0KKwkJCisJCS8qIE5BUy1GaWx0ZXItUnVsZSAqLworCQl7CisJCQkvKgorCQkJCVRoZSBOQVMtRmlsdGVyLVJ1bGUgQVZQIChBVlAgQ29kZSA0MDApIGlzIG9mIHR5cGUgSVBGaWx0ZXJSdWxlIGFuZAorCQkJCXByb3ZpZGVzIGZpbHRlciBydWxlcyB0aGF0IG5lZWQgdG8gYmUgY29uZmlndXJlZCBvbiB0aGUgTkFTIGZvciB0aGUKKwkJCQl1c2VyLiAgT25lIG9yIG1vcmUgb2YgdGhlc2UgQVZQcyBNQVkgYmUgcHJlc2VudCBpbiBhbiBhdXRob3JpemF0aW9uCisJCQkJcmVzcG9uc2UuCisJCQkqLworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTQwMCwgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJOQVMtRmlsdGVyLVJ1bGUiLCAJCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCSAJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBJUEZpbHRlclJ1bGVfdHlwZSwgTlVMTCk7CisJCX0KKwkJCisJCS8qIEZpbHRlci1JZCAqLworCQl7CisJCQkvKgorCQkJCVRoZSBGaWx0ZXItSWQgQVZQIChBVlAgQ29kZSAxMSkgaXMgb2YgdHlwZSBVVEY4U3RyaW5nIGFuZCBjb250YWlucworCQkJCXRoZSBuYW1lIG9mIHRoZSBmaWx0ZXIgbGlzdCBmb3IgdGhpcyB1c2VyLiAgWmVybyBvciBtb3JlIEZpbHRlci1JZAorCQkJCUFWUHMgTUFZIGJlIHNlbnQgaW4gYW4gYXV0aG9yaXphdGlvbiBhbnN3ZXIuCisKKwkJCQlJZGVudGlmeWluZyBhIGZpbHRlciBsaXN0IGJ5IG5hbWUgYWxsb3dzIHRoZSBmaWx0ZXIgdG8gYmUgdXNlZCBvbgorCQkJCWRpZmZlcmVudCBOQVNlcyB3aXRob3V0IHJlZ2FyZCB0byBmaWx0ZXItbGlzdCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLgorCQkJCUhvd2V2ZXIsIHRoaXMgQVZQIGlzIG5vdCByb2FtaW5nIGZyaWVuZGx5LCBhcyBmaWx0ZXIgbmFtaW5nIGRpZmZlcnMKKwkJCQlmcm9tIG9uZSBzZXJ2aWNlIHByb3ZpZGVyIHRvIGFub3RoZXIuCisKKwkJCQlJbiBub24tUkFESVVTIGVudmlyb25tZW50cywgaXQgaXMgUkVDT01NRU5ERUQgdGhhdCB0aGUgTkFTLUZpbHRlci0KKwkJCQlSdWxlIEFWUCBiZSB1c2VkIGluc3RlYWQuCisJCQkqLworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTExLCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIkZpbHRlci1JZCIsIAkJCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCSAJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9CisJCQorCQkvKiBDb25maWd1cmF0aW9uLVRva2VuICovCisJCXsKKwkJCS8qCisJCQkJVGhlIENvbmZpZ3VyYXRpb24tVG9rZW4gQVZQIChBVlAgQ29kZSA3OCkgaXMgb2YgdHlwZSBPY3RldFN0cmluZyBhbmQKKwkJCQlpcyBzZW50IGJ5IGEgRGlhbWV0ZXIgU2VydmVyIHRvIGEgRGlhbWV0ZXIgUHJveHkgQWdlbnQgb3IgVHJhbnNsYXRpb24KKwkJCQlBZ2VudCBpbiBhbiBBQS1BbnN3ZXIgY29tbWFuZCB0byBpbmRpY2F0ZSBhIHR5cGUgb2YgdXNlciBwcm9maWxlIHRvCisJCQkJYmUgdXNlZC4gIEl0IHNob3VsZCBub3QgYmUgc2VudCB0byBhIERpYW1ldGVyIENsaWVudCAoTkFTKS4KKworCQkJCVRoZSBmb3JtYXQgb2YgdGhlIERhdGEgZmllbGQgb2YgdGhpcyBBVlAgaXMgc2l0ZSBzcGVjaWZpYy4KKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJCQkJNzgsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiQ29uZmlndXJhdGlvbi1Ub2tlbiIsIAkJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORyAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsIE5VTEwpOworCQl9CisJCQorCQkvKiBRb1MtRmlsdGVyLVJ1bGUgKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgUW9TLUZpbHRlci1SdWxlIEFWUCAoQVZQIENvZGUgNDA3KSBpcyBvZiB0eXBlIFFvU0ZpbHRlclJ1bGUgYW5kCisJCQkJcHJvdmlkZXMgUW9TIGZpbHRlciBydWxlcyB0aGF0IG5lZWQgdG8gYmUgY29uZmlndXJlZCBvbiB0aGUgTkFTIGZvcgorCQkJCXRoZSB1c2VyLiAgT25lIG9yIG1vcmUgc3VjaCBBVlBzIE1BWSBiZSBwcmVzZW50IGluIGFuIGF1dGhvcml6YXRpb24KKwkJCQlyZXNwb25zZS4KKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJCQkJNDA3LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIlFvUy1GaWx0ZXItUnVsZSIsIAkJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORyAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIFFvU0ZpbHRlclJ1bGVfdHlwZSwgTlVMTCk7CisJCX0KKwkJCisvKioqICBGcmFtZWQgQWNjZXNzIEF1dGhvcml6YXRpb24gQVZQcyAgKioqLworCQkKKwkJLyogRnJhbWVkLVByb3RvY29sICovCisJCXsKKwkJCS8qCisJCQkJVGhlIEZyYW1lZC1Qcm90b2NvbCBBVlAgKEFWUCBDb2RlIDcpIGlzIG9mIHR5cGUgRW51bWVyYXRlZCBhbmQKKwkJCQljb250YWlucyB0aGUgZnJhbWluZyB0byBiZSB1c2VkIGZvciBmcmFtZWQgYWNjZXNzLiAgVGhpcyBBVlAgTUFZIGJlCisJCQkJcHJlc2VudCBpbiBib3RoIHJlcXVlc3RzIGFuZCByZXNwb25zZXMuICBUaGUgc3VwcG9ydGVkIHZhbHVlcyBhcmUKKwkJCQlsaXN0ZWQgaW4gW1JBRElVU1R5cGVzXS4KKworCQkJCVN1Yi1yZWdpc3RyeTogVmFsdWVzIGZvciBSQURJVVMgQXR0cmlidXRlIDcsIEZyYW1lZC1Qcm90b2NvbAorCQkJCVJlZmVyZW5jZTogW1JGQzI4NjVdCisJCQkqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0IAkqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAJIHRkYXRhID0geyBBVlBfVFlQRV9VTlNJR05FRDMyLAkiRW51bWVyYXRlZChGcmFtZWQtUHJvdG9jb2wpIgksIE5VTEwsIE5VTEx9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIHR2YWxzW10gPSB7CisJCQkJZW51bXZhbF9kZWZfdTMyKCAxLCAiUFBQIiksCisJCQkJZW51bXZhbF9kZWZfdTMyKCAyLCAiU0xJUCIpLAorCQkJCWVudW12YWxfZGVmX3UzMiggMywgIkFwcGxlVGFsayBSZW1vdGUgQWNjZXNzIFByb3RvY29sIChBUkFQKSIpLAorCQkJCWVudW12YWxfZGVmX3UzMiggNCwgIkdhbmRhbGYgcHJvcHJpZXRhcnkgU2luZ2xlTGluay9NdWx0aUxpbmsgcHJvdG9jb2wiKSwKKwkJCQllbnVtdmFsX2RlZl91MzIoIDUsICJYeWxvZ2ljcyBwcm9wcmlldGFyeSBJUFgvU0xJUCIpLAorCQkJCWVudW12YWxfZGVmX3UzMiggNiwgIlguNzUgU3luY2hyb25vdXMiKSwKKwkJCQllbnVtdmFsX2RlZl91MzIoIDcsICJHUFJTIFBEUCBDb250ZXh0IFtNb29yZV0iKQorCQkJfTsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQkJCQk3LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIkZyYW1lZC1Qcm90b2NvbCIsIAkJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9VTlNJR05FRDMyIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlpbnQgaTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBlbnVtZXJhdGVkIHZhbHVlcywgYW5kIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSAsIE5VTEwsICZ0eXBlKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBzaXplb2YodHZhbHMpIC8gc2l6ZW9mKHR2YWxzWzBdKTsgaSsrKSB7CisJCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnR2YWxzW2ldLCB0eXBlLCBOVUxMKTsKKwkJCX0KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCB0eXBlLCBOVUxMKTsKKwkJfQorCQkKKwkJLyogRnJhbWVkLVJvdXRpbmcgKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgRnJhbWVkLVJvdXRpbmcgQVZQIChBVlAgQ29kZSAxMCkgaXMgb2YgdHlwZSBFbnVtZXJhdGVkIGFuZAorCQkJCWNvbnRhaW5zIHRoZSByb3V0aW5nIG1ldGhvZCBmb3IgdGhlIHVzZXIgd2hlbiB0aGUgdXNlciBpcyBhIHJvdXRlciB0bworCQkJCWEgbmV0d29yay4gIFRoaXMgQVZQIFNIT1VMRCBvbmx5IGJlIHByZXNlbnQgaW4gYXV0aG9yaXphdGlvbgorCQkJCXJlc3BvbnNlcy4gIFRoZSBzdXBwb3J0ZWQgdmFsdWVzIGFyZSBsaXN0ZWQgaW4gW1JBRElVU1R5cGVzXS4KKworCQkJCVN1Yi1yZWdpc3RyeTogVmFsdWVzIGZvciBSQURJVVMgQXR0cmlidXRlIDEwLCBGcmFtZWQtUm91dGluZworCQkJCVJlZmVyZW5jZTogW1JGQzI4NjVdCisJCQkqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0IAkqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAJIHRkYXRhID0geyBBVlBfVFlQRV9VTlNJR05FRDMyLAkiRW51bWVyYXRlZChGcmFtZWQtUm91dGluZykiCSwgTlVMTCwgTlVMTH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgdHZhbHNbXSA9IHsKKwkJCQllbnVtdmFsX2RlZl91MzIoIDAsICJOb25lIiksCisJCQkJZW51bXZhbF9kZWZfdTMyKCAxLCAiU2VuZCByb3V0aW5nIHBhY2tldHMiKSwKKwkJCQllbnVtdmFsX2RlZl91MzIoIDIsICJMaXN0ZW4gZm9yIHJvdXRpbmcgcGFja2V0cyIpLAorCQkJCWVudW12YWxfZGVmX3UzMiggMywgIlNlbmQgYW5kIExpc3RlbiIpCisJCQl9OworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTEwLCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIkZyYW1lZC1Sb3V0aW5nIiwgCQkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCWludCBpOworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGVudW1lcmF0ZWQgdmFsdWVzLCBhbmQgdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhICwgTlVMTCwgJnR5cGUpOworCQkJZm9yIChpID0gMDsgaSA8IHNpemVvZih0dmFscykgLyBzaXplb2YodHZhbHNbMF0pOyBpKyspIHsKKwkJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdHZhbHNbaV0sIHR5cGUsIE5VTEwpOworCQkJfQorCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIHR5cGUsIE5VTEwpOworCQl9CisJCQorCQkvKiBGcmFtZWQtTVRVICovCisJCXsKKwkJCS8qCisJCQkJVGhlIEZyYW1lZC1NVFUgQVZQIChBVlAgQ29kZSAxMikgaXMgb2YgdHlwZSBVbnNpZ25lZDMyIGFuZCBjb250YWlucworCQkJCXRoZSBNYXhpbXVtIFRyYW5zbWlzc2lvbiBVbml0IHRvIGJlIGNvbmZpZ3VyZWQgZm9yIHRoZSB1c2VyLCB3aGVuIGl0CisJCQkJaXMgbm90IG5lZ290aWF0ZWQgYnkgc29tZSBvdGhlciBtZWFucyAoc3VjaCBhcyBQUFApLiAgVGhpcyBBVlAgU0hPVUxECisJCQkJb25seSBiZSBwcmVzZW50IGluIGF1dGhvcml6YXRpb24gcmVzcG9uc2VzLiAgVGhlIE1UVSB2YWx1ZSBNVVNUIGJlIGluCisJCQkJdGhlIHJhbmdlIGZyb20gNjQgdG8gNjU1MzUuCisJCQkqLworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTEyLCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIkZyYW1lZC1NVFUiLCAJCQkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCBOVUxMKTsKKwkJfQorCQkKKwkJLyogRnJhbWVkLUNvbXByZXNzaW9uICovCisJCXsKKwkJCS8qCisJCQkJVGhlIEZyYW1lZC1Db21wcmVzc2lvbiBBVlAgKEFWUCBDb2RlIDEzKSBpcyBvZiB0eXBlIEVudW1lcmF0ZWQgYW5kCisJCQkJY29udGFpbnMgdGhlIGNvbXByZXNzaW9uIHByb3RvY29sIHRvIGJlIHVzZWQgZm9yIHRoZSBsaW5rLiAgSXQgTUFZIGJlCisJCQkJdXNlZCBpbiBhbiBhdXRob3JpemF0aW9uIHJlcXVlc3QgYXMgYSBoaW50IHRvIHRoZSBzZXJ2ZXIgdGhhdCBhCisJCQkJc3BlY2lmaWMgY29tcHJlc3Npb24gdHlwZSBpcyBkZXNpcmVkLCBidXQgdGhlIHNlcnZlciBpcyBub3QgcmVxdWlyZWQKKwkJCQl0byBob25vciB0aGUgaGludCBpbiB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZS4KKworCQkJCU1vcmUgdGhhbiBvbmUgY29tcHJlc3Npb24gcHJvdG9jb2wgQVZQIE1BWSBiZSBzZW50LiAgVGhlIE5BUyBpcworCQkJCXJlc3BvbnNpYmxlIGZvciBhcHBseWluZyB0aGUgcHJvcGVyIGNvbXByZXNzaW9uIHByb3RvY29sIHRvIHRoZQorCQkJCWFwcHJvcHJpYXRlIGxpbmsgdHJhZmZpYy4KKworCQkJCVRoZSBzdXBwb3J0ZWQgdmFsdWVzIGFyZSBsaXN0ZWQgaW4gW1JBRElVU1R5cGVzXS4KKwkJCQlTdWItcmVnaXN0cnk6IFZhbHVlcyBmb3IgUkFESVVTIEF0dHJpYnV0ZSAxMywgRnJhbWVkLUNvbXByZXNzaW9uCisJCQkJUmVmZXJlbmNlOiBbUkZDMjg2NV0KKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgCSp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhIAkgdGRhdGEgPSB7IEFWUF9UWVBFX1VOU0lHTkVEMzIsCSJFbnVtZXJhdGVkKEZyYW1lZC1Db21wcmVzc2lvbikiCSwgTlVMTCwgTlVMTH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgdHZhbHNbXSA9IHsKKwkJCQllbnVtdmFsX2RlZl91MzIoIDAsICJOb25lIiksCisJCQkJZW51bXZhbF9kZWZfdTMyKCAxLCAiVkogVENQL0lQIGhlYWRlciBjb21wcmVzc2lvbiIpLAorCQkJCWVudW12YWxfZGVmX3UzMiggMiwgIklQWCBoZWFkZXIgY29tcHJlc3Npb24iKSwKKwkJCQllbnVtdmFsX2RlZl91MzIoIDMsICJTdGFjLUxaUyBjb21wcmVzc2lvbiIpCisJCQl9OworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTEzLCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIkZyYW1lZC1Db21wcmVzc2lvbiIsIAkJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9VTlNJR05FRDMyIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlpbnQgaTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBlbnVtZXJhdGVkIHZhbHVlcywgYW5kIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSAsIE5VTEwsICZ0eXBlKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBzaXplb2YodHZhbHMpIC8gc2l6ZW9mKHR2YWxzWzBdKTsgaSsrKSB7CisJCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnR2YWxzW2ldLCB0eXBlLCBOVUxMKTsKKwkJCX0KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCB0eXBlLCBOVUxMKTsKKwkJfQorCQkKKy8qKiogIElQIEFjY2VzcyBBdXRob3JpemF0aW9uIEFWUHMgICoqKi8KKwkJCisJCS8qIEZyYW1lZC1JUC1BZGRyZXNzICovCisJCXsKKwkJCS8qCisJCQkJVGhlIEZyYW1lZC1JUC1BZGRyZXNzIEFWUCAoQVZQIENvZGUgOCkgW1JBRElVU10gaXMgb2YgdHlwZQorCQkJCU9jdGV0U3RyaW5nIGFuZCBjb250YWlucyBhbiBJUHY0IGFkZHJlc3Mgb2YgdGhlIHR5cGUgc3BlY2lmaWVkIGluIHRoZQorCQkJCWF0dHJpYnV0ZSB2YWx1ZSB0byBiZSBjb25maWd1cmVkIGZvciB0aGUgdXNlci4gIEl0IE1BWSBiZSB1c2VkIGluIGFuCisJCQkJYXV0aG9yaXphdGlvbiByZXF1ZXN0IGFzIGEgaGludCB0byB0aGUgc2VydmVyIHRoYXQgYSBzcGVjaWZpYyBhZGRyZXNzCisJCQkJaXMgZGVzaXJlZCwgYnV0IHRoZSBzZXJ2ZXIgaXMgbm90IHJlcXVpcmVkIHRvIGhvbm9yIHRoZSBoaW50IGluIHRoZQorCQkJCWNvcnJlc3BvbmRpbmcgcmVzcG9uc2UuCisKKwkJCQlUd28gdmFsdWVzIGhhdmUgc3BlY2lhbCBzaWduaWZpY2FuY2U6IDB4RkZGRkZGRkYgYW5kIDB4RkZGRkZGRkUuICBUaGUKKwkJCQl2YWx1ZSAweEZGRkZGRkZGIGluZGljYXRlcyB0aGF0IHRoZSBOQVMgc2hvdWxkIGFsbG93IHRoZSB1c2VyIHRvCisJCQkJc2VsZWN0IGFuIGFkZHJlc3MgKGkuZS4sIG5lZ290aWF0ZWQpLiAgVGhlIHZhbHVlIDB4RkZGRkZGRkUgaW5kaWNhdGVzCisJCQkJdGhhdCB0aGUgTkFTIHNob3VsZCBzZWxlY3QgYW4gYWRkcmVzcyBmb3IgdGhlIHVzZXIgKGUuZy4sIGFzc2lnbmVkCisJCQkJZnJvbSBhIHBvb2wgb2YgYWRkcmVzc2VzIGtlcHQgYnkgdGhlIE5BUykuCisJCQkqLworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTgsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiRnJhbWVkLUlQLUFkZHJlc3MiLCAJCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCSAJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCBOVUxMKTsKKwkJfQorCQkKKwkJLyogRnJhbWVkLUlQLU5ldG1hc2sgKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgRnJhbWVkLUlQLU5ldG1hc2sgQVZQIChBVlAgQ29kZSA5KSBpcyBvZiB0eXBlIE9jdGV0U3RyaW5nIGFuZAorCQkJCWNvbnRhaW5zIHRoZSBmb3VyIG9jdGV0cyBvZiB0aGUgSVB2NCBuZXRtYXNrIHRvIGJlIGNvbmZpZ3VyZWQgZm9yIHRoZQorCQkJCXVzZXIgd2hlbiB0aGUgdXNlciBpcyBhIHJvdXRlciB0byBhIG5ldHdvcmsuICBJdCBNQVkgYmUgdXNlZCBpbiBhbgorCQkJCWF1dGhvcml6YXRpb24gcmVxdWVzdCBhcyBhIGhpbnQgdG8gdGhlIHNlcnZlciB0aGF0IGEgc3BlY2lmaWMgbmV0bWFzaworCQkJCWlzIGRlc2lyZWQsIGJ1dCB0aGUgc2VydmVyIGlzIG5vdCByZXF1aXJlZCB0byBob25vciB0aGUgaGludCBpbiB0aGUKKwkJCQljb3JyZXNwb25kaW5nIHJlc3BvbnNlLiAgVGhpcyBBVlAgTVVTVCBiZSBwcmVzZW50IGluIGEgcmVzcG9uc2UgaWYKKwkJCQl0aGUgcmVxdWVzdCBpbmNsdWRlZCB0aGlzIEFWUCB3aXRoIGEgdmFsdWUgb2YgMHhGRkZGRkZGRi4KKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJCQkJOSwgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJGcmFtZWQtSVAtTmV0bWFzayIsIAkJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORyAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsIE5VTEwpOworCQl9CisJCQorCQkvKiBGcmFtZWQtUm91dGUgKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgRnJhbWVkLVJvdXRlIEFWUCAoQVZQIENvZGUgMjIpIGlzIG9mIHR5cGUgVVRGOFN0cmluZyBhbmQgY29udGFpbnMKKwkJCQl0aGUgQVNDSUkgcm91dGluZyBpbmZvcm1hdGlvbiB0byBiZSBjb25maWd1cmVkIGZvciB0aGUgdXNlciBvbiB0aGUKKwkJCQlOQVMuICBaZXJvIG9yIG1vcmUgb2YgdGhlc2UgQVZQcyBNQVkgYmUgcHJlc2VudCBpbiBhbiBhdXRob3JpemF0aW9uCisJCQkJcmVzcG9uc2UuCisKKwkJCQlUaGUgc3RyaW5nIE1VU1QgY29udGFpbiBhIGRlc3RpbmF0aW9uIHByZWZpeCBpbiBkb3R0ZWQgcXVhZCBmb3JtCisJCQkJb3B0aW9uYWxseSBmb2xsb3dlZCBieSBhIHNsYXNoIGFuZCBhIGRlY2ltYWwgbGVuZ3RoIHNwZWNpZmllciBzdGF0aW5nCisJCQkJaG93IG1hbnkgaGlnaC1vcmRlciBiaXRzIG9mIHRoZSBwcmVmaXggc2hvdWxkIGJlIHVzZWQuICBUaGlzIGlzCisJCQkJZm9sbG93ZWQgYnkgYSBzcGFjZSwgYSBnYXRld2F5IGFkZHJlc3MgaW4gZG90dGVkIHF1YWQgZm9ybSwgYSBzcGFjZSwKKwkJCQlhbmQgb25lIG9yIG1vcmUgbWV0cmljcyBzZXBhcmF0ZWQgYnkgc3BhY2VzOyBmb3IgZXhhbXBsZSwKKworCQkJCSIxOTIuMTY4LjEuMC8yNCAxOTIuMTY4LjEuMSAxIi4KKworCQkJCVRoZSBsZW5ndGggc3BlY2lmaWVyIG1heSBiZSBvbWl0dGVkLCBpbiB3aGljaCBjYXNlIGl0IHNob3VsZCBkZWZhdWx0CisJCQkJdG8gOCBiaXRzIGZvciBjbGFzcyBBIHByZWZpeGVzLCB0byAxNiBiaXRzIGZvciBjbGFzcyBCIHByZWZpeGVzLCBhbmQKKwkJCQl0byAyNCBiaXRzIGZvciBjbGFzcyBDIHByZWZpeGVzOyBmb3IgZXhhbXBsZSwKKworCQkJCSIxOTIuMTY4LjEuMCAxOTIuMTY4LjEuMSAxIi4KKworCQkJCVdoZW5ldmVyIHRoZSBnYXRld2F5IGFkZHJlc3MgaXMgc3BlY2lmaWVkIGFzICIwLjAuMC4wIiB0aGUgSVAgYWRkcmVzcworCQkJCW9mIHRoZSB1c2VyIFNIT1VMRCBiZSB1c2VkIGFzIHRoZSBnYXRld2F5IGFkZHJlc3MuCisJCQkqLworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTIyLCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIkZyYW1lZC1Sb3V0ZSIsIAkJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORyAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX0KKwkJCisJCS8qIEZyYW1lZC1Qb29sICovCisJCXsKKwkJCS8qCisJCQkJVGhlIEZyYW1lZC1Qb29sIEFWUCAoQVZQIENvZGUgODgpIGlzIG9mIHR5cGUgT2N0ZXRTdHJpbmcgYW5kIGNvbnRhaW5zCisJCQkJdGhlIG5hbWUgb2YgYW4gYXNzaWduZWQgYWRkcmVzcyBwb29sIHRoYXQgU0hPVUxEIGJlIHVzZWQgdG8gYXNzaWduIGFuCisJCQkJYWRkcmVzcyBmb3IgdGhlIHVzZXIuICBJZiBhIE5BUyBkb2VzIG5vdCBzdXBwb3J0IG11bHRpcGxlIGFkZHJlc3MKKwkJCQlwb29scywgdGhlIE5BUyBTSE9VTEQgaWdub3JlIHRoaXMgQVZQLiAgQWRkcmVzcyBwb29scyBhcmUgdXN1YWxseQorCQkJCXVzZWQgZm9yIElQIGFkZHJlc3NlcyBidXQgY2FuIGJlIHVzZWQgZm9yIG90aGVyIHByb3RvY29scyBpZiB0aGUgTkFTCisJCQkJc3VwcG9ydHMgcG9vbHMgZm9yIHRob3NlIHByb3RvY29scy4KKworCQkJCUFsdGhvdWdoIHNwZWNpZmllZCBhcyB0eXBlIE9jdGV0U3RyaW5nIGZvciBjb21wYXRpYmlsaXR5IHdpdGggUkFESVVTCisJCQkJW1JBRElVU0V4dF0sIHRoZSBlbmNvZGluZyBvZiB0aGUgRGF0YSBmaWVsZCBTSE9VTEQgYWxzbyBjb25mb3JtIHRvCisJCQkJdGhlIHJ1bGVzIGZvciB0aGUgVVRGOFN0cmluZyBEYXRhIEZvcm1hdC4KKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJCQkJODgsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiRnJhbWVkLVBvb2wiLCAJCQkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgTlVMTCk7CisJCX0KKwkJCisJCS8qIEZyYW1lZC1JbnRlcmZhY2UtSWQgKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgRnJhbWVkLUludGVyZmFjZS1JZCBBVlAgKEFWUCBDb2RlIDk2KSBpcyBvZiB0eXBlIFVuc2lnbmVkNjQgYW5kCisJCQkJY29udGFpbnMgdGhlIElQdjYgaW50ZXJmYWNlIGlkZW50aWZpZXIgdG8gYmUgY29uZmlndXJlZCBmb3IgdGhlIHVzZXIuCisJCQkJSXQgTUFZIGJlIHVzZWQgaW4gYXV0aG9yaXphdGlvbiByZXF1ZXN0cyBhcyBhIGhpbnQgdG8gdGhlIHNlcnZlciB0aGF0CisJCQkJYSBzcGVjaWZpYyBpbnRlcmZhY2UgaWQgaXMgZGVzaXJlZCwgYnV0IHRoZSBzZXJ2ZXIgaXMgbm90IHJlcXVpcmVkIHRvCisJCQkJaG9ub3IgdGhlIGhpbnQgaW4gdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2UuCisJCQkqLworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTk2LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIkZyYW1lZC1JbnRlcmZhY2UtSWQiLCAJCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCSAJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfVU5TSUdORUQ2NCAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsIE5VTEwpOworCQl9CisJCQorCQkvKiBGcmFtZWQtSVB2Ni1QcmVmaXggKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgRnJhbWVkLUlQdjYtUHJlZml4IEFWUCAoQVZQIENvZGUgOTcpIGlzIG9mIHR5cGUgT2N0ZXRTdHJpbmcgYW5kCisJCQkJY29udGFpbnMgdGhlIElQdjYgcHJlZml4IHRvIGJlIGNvbmZpZ3VyZWQgZm9yIHRoZSB1c2VyLiAgT25lIG9yIG1vcmUKKwkJCQlBVlBzIE1BWSBiZSB1c2VkIGluIGF1dGhvcml6YXRpb24gcmVxdWVzdHMgYXMgYSBoaW50IHRvIHRoZSBzZXJ2ZXIKKwkJCQl0aGF0IHNwZWNpZmljIElQdjYgcHJlZml4ZXMgYXJlIGRlc2lyZWQsIGJ1dCB0aGUgc2VydmVyIGlzIG5vdAorCQkJCXJlcXVpcmVkIHRvIGhvbm9yIHRoZSBoaW50IGluIHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlLgorCQkJKi8KKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQkJCQk5NywgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJGcmFtZWQtSVB2Ni1QcmVmaXgiLCAJCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCSAJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCBOVUxMKTsKKwkJfQorCQkKKwkJLyogRnJhbWVkLUlQdjYtUm91dGUgKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgRnJhbWVkLUlQdjYtUm91dGUgQVZQIChBVlAgQ29kZSA5OSkgaXMgb2YgdHlwZSBVVEY4U3RyaW5nIGFuZAorCQkJCWNvbnRhaW5zIHRoZSBBU0NJSSByb3V0aW5nIGluZm9ybWF0aW9uIHRvIGJlIGNvbmZpZ3VyZWQgZm9yIHRoZSB1c2VyCisJCQkJb24gdGhlIE5BUy4gIFplcm8gb3IgbW9yZSBvZiB0aGVzZSBBVlBzIE1BWSBiZSBwcmVzZW50IGluIGFuCisJCQkJYXV0aG9yaXphdGlvbiByZXNwb25zZS4KKworCQkJCVRoZSBzdHJpbmcgTVVTVCBjb250YWluIGFuIElQdjYgYWRkcmVzcyBwcmVmaXggZm9sbG93ZWQgYnkgYSBzbGFzaAorCQkJCWFuZCBhIGRlY2ltYWwgbGVuZ3RoIHNwZWNpZmllciBzdGF0aW5nIGhvdyBtYW55IGhpZ2ggb3JkZXIgYml0cyBvZgorCQkJCXRoZSBwcmVmaXggc2hvdWxkIGJlIHVzZWQuICBUaGlzIGlzIGZvbGxvd2VkIGJ5IGEgc3BhY2UsIGEgZ2F0ZXdheQorCQkJCWFkZHJlc3MgaW4gaGV4YWRlY2ltYWwgbm90YXRpb24sIGEgc3BhY2UsIGFuZCBvbmUgb3IgbW9yZSBtZXRyaWNzCisJCQkJc2VwYXJhdGVkIGJ5IHNwYWNlczsgZm9yIGV4YW1wbGUsCisKKwkJCQkiMjAwMDowOjA6MTA2OjovNjQgMjAwMDo6MTA2OmEwMDoyMGZmOmZlOTk6YTk5OCAxIi4KKworCQkJCVdoZW5ldmVyIHRoZSBnYXRld2F5IGFkZHJlc3MgaXMgdGhlIElQdjYgdW5zcGVjaWZpZWQgYWRkcmVzcywgdGhlIElQCisJCQkJYWRkcmVzcyBvZiB0aGUgdXNlciBTSE9VTEQgYmUgdXNlZCBhcyB0aGUgZ2F0ZXdheSBhZGRyZXNzLCBzdWNoIGFzCisJCQkJaW46CisKKwkJCQkiMjAwMDowOjA6MTA2OjovNjQgOjogMSIuCisJCQkqLworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTk5LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIkZyYW1lZC1JUHY2LVJvdXRlIiwgCQkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfQorCQkKKwkJLyogRnJhbWVkLUlQdjYtUG9vbCAqLworCQl7CisJCQkvKgorCQkJCVRoZSBGcmFtZWQtSVB2Ni1Qb29sIEFWUCAoQVZQIENvZGUgMTAwKSBpcyBvZiB0eXBlIE9jdGV0U3RyaW5nIGFuZAorCQkJCWNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIGFzc2lnbmVkIHBvb2wgdGhhdCBTSE9VTEQgYmUgdXNlZCB0byBhc3NpZ24KKwkJCQlhbiBJUHY2IHByZWZpeCBmb3IgdGhlIHVzZXIuICBJZiB0aGUgYWNjZXNzIGRldmljZSBkb2VzIG5vdCBzdXBwb3J0CisJCQkJbXVsdGlwbGUgcHJlZml4IHBvb2xzLCBpdCBNVVNUIGlnbm9yZSB0aGlzIEFWUC4KKworCQkJCUFsdGhvdWdoIHNwZWNpZmllZCBhcyB0eXBlIE9jdGV0U3RyaW5nIGZvciBjb21wYXRpYmlsaXR5IHdpdGggUkFESVVTCisJCQkJW1JBRElVU0lQdjZdLCB0aGUgZW5jb2Rpbmcgb2YgdGhlIERhdGEgZmllbGQgU0hPVUxEIGFsc28gY29uZm9ybSB0bworCQkJCXRoZSBydWxlcyBmb3IgdGhlIFVURjhTdHJpbmcgRGF0YSBGb3JtYXQuCisJCQkqLworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTEwMCwgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJGcmFtZWQtSVB2Ni1Qb29sIiwgCQkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgTlVMTCk7CisJCX0KKwkJCisvKioqICBJUFggQWNjZXNzICAqKiovCisJCQorCQkvKiBGcmFtZWQtSVBYLU5ldHdvcmsgKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgRnJhbWVkLUlQWC1OZXR3b3JrIEFWUCAoQVZQIENvZGUgMjMpIGlzIG9mIHR5cGUgVW5zaWduZWQzMiBhbmQKKwkJCQljb250YWlucyB0aGUgSVBYIE5ldHdvcmsgbnVtYmVyIHRvIGJlIGNvbmZpZ3VyZWQgZm9yIHRoZSB1c2VyLiAgSXQKKwkJCQlNQVkgYmUgdXNlZCBpbiBhbiBhdXRob3JpemF0aW9uIHJlcXVlc3QgYXMgYSBoaW50IHRvIHRoZSBzZXJ2ZXIgdGhhdAorCQkJCWEgc3BlY2lmaWMgYWRkcmVzcyBpcyBkZXNpcmVkLCBidXQgdGhlIHNlcnZlciBpcyBub3QgcmVxdWlyZWQgdG8KKwkJCQlob25vciB0aGUgaGludCBpbiB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZS4KKworCQkJCVR3byBhZGRyZXNzZXMgaGF2ZSBzcGVjaWFsIHNpZ25pZmljYW5jZTogMHhGRkZGRkZGRiBhbmQgMHhGRkZGRkZGRS4KKwkJCQlUaGUgdmFsdWUgMHhGRkZGRkZGRiBpbmRpY2F0ZXMgdGhhdCB0aGUgTkFTIHNob3VsZCBhbGxvdyB0aGUgdXNlciB0bworCQkJCXNlbGVjdCBhbiBhZGRyZXNzIChpLmUuLCBOZWdvdGlhdGVkKS4gIFRoZSB2YWx1ZSAweEZGRkZGRkZFIGluZGljYXRlcworCQkJCXRoYXQgdGhlIE5BUyBzaG91bGQgc2VsZWN0IGFuIGFkZHJlc3MgZm9yIHRoZSB1c2VyIChlLmcuLCBhc3NpZ24gaXQKKwkJCQlmcm9tIGEgcG9vbCBvZiBvbmUgb3IgbW9yZSBJUFggbmV0d29ya3Mga2VwdCBieSB0aGUgTkFTKS4KKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJCQkJMjMsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiRnJhbWVkLUlQWC1OZXR3b3JrIiwgCQkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCBOVUxMKTsKKwkJfQorCQkKKy8qKiogIEFwcGxlVGFsayBOZXR3b3JrIEFjY2VzcyAgKioqLworCQkKKwkJLyogRnJhbWVkLUFwcGxlVGFsay1MaW5rICovCisJCXsKKwkJCS8qCisJCQkJVGhlIEZyYW1lZC1BcHBsZVRhbGstTGluayBBVlAgKEFWUCBDb2RlIDM3KSBpcyBvZiB0eXBlIFVuc2lnbmVkMzIgYW5kCisJCQkJY29udGFpbnMgdGhlIEFwcGxlVGFsayBuZXR3b3JrIG51bWJlciB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciB0aGUKKwkJCQlzZXJpYWwgbGluayB0byB0aGUgdXNlciwgd2hpY2ggaXMgYW5vdGhlciBBcHBsZVRhbGsgcm91dGVyLiAgVGhpcyBBVlAKKwkJCQlNVVNUIG9ubHkgYmUgcHJlc2VudCBpbiBhbiBhdXRob3JpemF0aW9uIHJlc3BvbnNlIGFuZCBpcyBuZXZlciB1c2VkCisJCQkJd2hlbiB0aGUgdXNlciBpcyBub3QgYW5vdGhlciByb3V0ZXIuCisKKwkJCQlEZXNwaXRlIHRoZSBzaXplIG9mIHRoZSBmaWVsZCwgdmFsdWVzIHJhbmdlIGZyb20gMCB0byA2NSw1MzUuICBUaGUKKwkJCQlzcGVjaWFsIHZhbHVlIG9mIDAgaW5kaWNhdGVzIGFuIHVubnVtYmVyZWQgc2VyaWFsIGxpbmsuICBBIHZhbHVlIG9mIDEKKwkJCQl0byA2NSw1MzUgbWVhbnMgdGhhdCB0aGUgc2VyaWFsIGxpbmUgYmV0d2VlbiB0aGUgTkFTIGFuZCB0aGUgdXNlcgorCQkJCXNob3VsZCBiZSBhc3NpZ25lZCB0aGF0IHZhbHVlIGFzIGFuIEFwcGxlVGFsayBuZXR3b3JrIG51bWJlci4KKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJCQkJMzcsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiRnJhbWVkLUFwcGxlVGFsay1MaW5rIiwgCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCSAJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfVU5TSUdORUQzMiAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsIE5VTEwpOworCQl9CisJCQorCQkvKiBGcmFtZWQtQXBwbGVUYWxrLU5ldHdvcmsgKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgRnJhbWVkLUFwcGxlVGFsay1OZXR3b3JrIEFWUCAoQVZQIENvZGUgMzgpIGlzIG9mIHR5cGUgVW5zaWduZWQzMgorCQkJCWFuZCBjb250YWlucyB0aGUgQXBwbGVUYWxrIE5ldHdvcmsgbnVtYmVyIHRoYXQgdGhlIE5BUyBzaG91bGQgcHJvYmUKKwkJCQl0byBhbGxvY2F0ZSBhbiBBcHBsZVRhbGsgbm9kZSBmb3IgdGhlIHVzZXIuICBUaGlzIEFWUCBNVVNUIG9ubHkgYmUKKwkJCQlwcmVzZW50IGluIGFuIGF1dGhvcml6YXRpb24gcmVzcG9uc2UgYW5kIGlzIG5ldmVyIHVzZWQgd2hlbiB0aGUgdXNlcgorCQkJCWlzIG5vdCBhbm90aGVyIHJvdXRlci4gIE11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGlzIEFWUCBpbmRpY2F0ZSB0aGF0CisJCQkJdGhlIE5BUyBtYXkgcHJvYmUsIHVzaW5nIGFueSBvZiB0aGUgbmV0d29yayBudW1iZXJzIHNwZWNpZmllZC4KKworCQkJCURlc3BpdGUgdGhlIHNpemUgb2YgdGhlIGZpZWxkLCB2YWx1ZXMgcmFuZ2UgZnJvbSAwIHRvIDY1LDUzNS4gIFRoZQorCQkJCXNwZWNpYWwgdmFsdWUgMCBpbmRpY2F0ZXMgdGhhdCB0aGUgTkFTIHNob3VsZCBhc3NpZ24gYSBuZXR3b3JrIGZvcgorCQkJCXRoZSB1c2VyLCB1c2luZyBpdHMgZGVmYXVsdCBjYWJsZSByYW5nZS4gIEEgdmFsdWUgYmV0d2VlbiAxIGFuZAorCQkJCTY1LDUzNSAoaW5jbHVzaXZlKSBpbmRpY2F0ZXMgdG8gdGhlIEFwcGxlVGFsayBOZXR3b3JrIHRoYXQgdGhlIE5BUworCQkJCXNob3VsZCBwcm9iZSB0byBmaW5kIGFuIGFkZHJlc3MgZm9yIHRoZSB1c2VyLgorCQkJKi8KKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQkJCQkzOCwgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJGcmFtZWQtQXBwbGVUYWxrLU5ldHdvcmsiLCAJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9VTlNJR05FRDMyIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgTlVMTCk7CisJCX0KKwkJCisJCS8qIEZyYW1lZC1BcHBsZVRhbGstWm9uZSAqLworCQl7CisJCQkvKgorCQkJCVRoZSBGcmFtZWQtQXBwbGVUYWxrLVpvbmUgQVZQIChBVlAgQ29kZSAzOSkgaXMgb2YgdHlwZSBPY3RldFN0cmluZworCQkJCWFuZCBjb250YWlucyB0aGUgQXBwbGVUYWxrIERlZmF1bHQgWm9uZSB0byBiZSB1c2VkIGZvciB0aGlzIHVzZXIuCisJCQkJVGhpcyBBVlAgTVVTVCBvbmx5IGJlIHByZXNlbnQgaW4gYW4gYXV0aG9yaXphdGlvbiByZXNwb25zZS4gIE11bHRpcGxlCisJCQkJaW5zdGFuY2VzIG9mIHRoaXMgQVZQIGluIHRoZSBzYW1lIG1lc3NhZ2UgYXJlIG5vdCBhbGxvd2VkLgorCisJCQkJVGhlIGNvZGlmaWNhdGlvbiBvZiB0aGlzIGZpZWxkJ3MgYWxsb3dlZCByYW5nZSBpcyBvdXRzaWRlIHRoZSBzY29wZQorCQkJCW9mIHRoaXMgc3BlY2lmaWNhdGlvbi4KKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJCQkJMzksIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiRnJhbWVkLUFwcGxlVGFsay1ab25lIiwgCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCSAJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCBOVUxMKTsKKwkJfQorCQkKKy8qKiogIEFwcGxlVGFsayBSZW1vdGUgQWNjZXNzIFtSRkMyODY5XSAqKiovCisJCQorCQkvKiBBUkFQLUZlYXR1cmVzICovCisJCXsKKwkJCS8qCisJCQkJVGhlIEFSQVAtRmVhdHVyZXMgQVZQIChBVlAgQ29kZSA3MSkgaXMgb2YgdHlwZSBPY3RldFN0cmluZyBhbmQgTUFZIGJlCisJCQkJcHJlc2VudCBpbiB0aGUgQUEtQWNjZXB0IG1lc3NhZ2UgaWYgdGhlIEZyYW1lZC1Qcm90b2NvbCBBVlAgaXMgc2V0IHRvCisJCQkJdGhlIHZhbHVlIG9mIEFSQVAuICBTZWUgW1JBRElVU0V4dF0gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlCisJCQkJZm9ybWF0IG9mIHRoaXMgQVZQLgorCQkJKi8KKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQkJCQk3MSwgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJBUkFQLUZlYXR1cmVzIiwgCQkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgTlVMTCk7CisJCX0KKwkJCisJCS8qIEFSQVAtWm9uZS1BY2Nlc3MgKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgQVJBUC1ab25lLUFjY2VzcyBBVlAgKEFWUCBDb2RlIDcyKSBpcyBvZiB0eXBlIEVudW1lcmF0ZWQgYW5kIE1BWQorCQkJCWJlIHByZXNlbnQgaW4gdGhlIEFBLUFjY2VwdCBtZXNzYWdlIGlmIHRoZSBGcmFtZWQtUHJvdG9jb2wgQVZQIGlzIHNldAorCQkJCXRvIHRoZSB2YWx1ZSBvZiBBUkFQLgorCisJCQkJVGhlIHN1cHBvcnRlZCB2YWx1ZXMgYXJlIGxpc3RlZCBpbiBbUkFESVVTVHlwZXNdIGFuZCBkZWZpbmVkIGluCisJCQkJW1JBRElVU0V4dF0uCisJCQkJU3ViLXJlZ2lzdHJ5OiBWYWx1ZXMgZm9yIFJBRElVUyBBdHRyaWJ1dGUgNzIsIEFSQVAtWm9uZS1BY2Nlc3MgCisJCQkJUmVmZXJlbmNlOiBbUkZDMjg2OV0KKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgCSp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhIAkgdGRhdGEgPSB7IEFWUF9UWVBFX1VOU0lHTkVEMzIsCSJFbnVtZXJhdGVkKEFSQVAtWm9uZS1BY2Nlc3MpIgksIE5VTEwsIE5VTEx9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIHR2YWxzW10gPSB7CisJCQkJZW51bXZhbF9kZWZfdTMyKCAxLCAiT25seSBhbGxvdyBhY2Nlc3MgdG8gZGVmYXVsdCB6b25lIFtSRkMyODY5XSIpLAorCQkJCWVudW12YWxfZGVmX3UzMiggMiwgIlVzZSB6b25lIGZpbHRlciBpbmNsdXNpdmVseSBbUkZDMjg2OV0iKSwKKwkJCQllbnVtdmFsX2RlZl91MzIoIDMsICJOb3QgdXNlZCBbUkZDMjg2OV0iKSwKKwkJCQllbnVtdmFsX2RlZl91MzIoIDQsICJVc2Ugem9uZSBmaWx0ZXIgZXhjbHVzaXZlbHkgW1JGQzI4NjldIikKKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJCQkJNzIsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiQVJBUC1ab25lLUFjY2VzcyIsIAkJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9VTlNJR05FRDMyIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlpbnQgaTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBlbnVtZXJhdGVkIHZhbHVlcywgYW5kIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSAsIE5VTEwsICZ0eXBlKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBzaXplb2YodHZhbHMpIC8gc2l6ZW9mKHR2YWxzWzBdKTsgaSsrKSB7CisJCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnR2YWxzW2ldLCB0eXBlLCBOVUxMKTsKKwkJCX0KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCB0eXBlLCBOVUxMKTsKKwkJfQorCQkKKy8qKiogIE5vbi1GcmFtZWQgQWNjZXNzIEF1dGhvcml6YXRpb24gQVZQcyAqKiovCisJCQorCQkvKiBMb2dpbi1JUC1Ib3N0ICovCisJCXsKKwkJCS8qCisJCQkJVGhlIExvZ2luLUlQLUhvc3QgQVZQIChBVlAgQ29kZSAxNCkgW1JBRElVU10gaXMgb2YgdHlwZSBPY3RldFN0cmluZworCQkJCWFuZCBjb250YWlucyB0aGUgSVB2NCBhZGRyZXNzIG9mIGEgaG9zdCB3aXRoIHdoaWNoIHRvIGNvbm5lY3QgdGhlCisJCQkJdXNlciB3aGVuIHRoZSBMb2dpbi1TZXJ2aWNlIEFWUCBpcyBpbmNsdWRlZC4gIEl0IE1BWSBiZSB1c2VkIGluIGFuCisJCQkJQUEtUmVxdWVzdCBjb21tYW5kIGFzIGEgaGludCB0byB0aGUgRGlhbWV0ZXIgU2VydmVyIHRoYXQgYSBzcGVjaWZpYworCQkJCWhvc3QgaXMgZGVzaXJlZCwgYnV0IHRoZSBEaWFtZXRlciBTZXJ2ZXIgaXMgbm90IHJlcXVpcmVkIHRvIGhvbm9yIHRoZQorCQkJCWhpbnQgaW4gdGhlIEFBLUFuc3dlci4KKworCQkJCVR3byBhZGRyZXNzZXMgaGF2ZSBzcGVjaWFsIHNpZ25pZmljYW5jZTogYWxsIG9uZXMgYW5kIDAuICBUaGUgdmFsdWUKKwkJCQlvZiBhbGwgb25lcyBpbmRpY2F0ZXMgdGhhdCB0aGUgTkFTIFNIT1VMRCBhbGxvdyB0aGUgdXNlciB0byBzZWxlY3QgYW4KKwkJCQlhZGRyZXNzLiAgVGhlIHZhbHVlIDAgaW5kaWNhdGVzIHRoYXQgdGhlIE5BUyBTSE9VTEQgc2VsZWN0IGEgaG9zdCB0bworCQkJCWNvbm5lY3QgdGhlIHVzZXIgdG8uCisJCQkqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0IAkqdHlwZTsKKwkJCXVpbnQzMl90CQkgYWxsemVyb3MgPSAwOworCQkJdWludDMyX3QJCSBhbGxvbmVzICA9ICh1aW50MzJfdCkgLTE7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgCSB0ZGF0YSA9IHsgQVZQX1RZUEVfT0NURVRTVFJJTkcsCSJFbnVtZXJhdGVkKExvZ2luLUlQLUhvc3QpIgksIE5VTEwsIE5VTEx9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIHR2YWxzW10gPSB7CisJCQkJZW51bXZhbF9kZWZfb3MoIDQsICZhbGx6ZXJvcywgIigwKSBOQVMgc2VsZWN0cyB0aGUgaG9zdCIpLAorCQkJCWVudW12YWxfZGVmX29zKCA0LCAmYWxsb25lcyAsICIoMSkgVXNlciBzZWxlY3RzIHRoZSBhZGRyZXNzIikKKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJCQkJMTQsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiTG9naW4tSVAtSG9zdCIsIAkJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORyAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCQkJaW50IGk7CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgZW51bWVyYXRlZCB2YWx1ZXMsIGFuZCB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEgLCBOVUxMLCAmdHlwZSk7CisJCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHR2YWxzKSAvIHNpemVvZih0dmFsc1swXSk7IGkrKykgeworCQkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0dmFsc1tpXSwgdHlwZSwgTlVMTCk7CisJCQl9CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgdHlwZSwgTlVMTCk7CisJCX0KKwkJCisJCS8qIExvZ2luLUlQdjYtSG9zdCAqLworCQl7CisJCQkvKgorCQkJCVRoZSBMb2dpbi1JUHY2LUhvc3QgQVZQIChBVlAgQ29kZSA5OCkgW1JBRElVU0lQdjZdIGlzIG9mIHR5cGUKKwkJCQlPY3RldFN0cmluZyBhbmQgY29udGFpbnMgdGhlIElQdjYgYWRkcmVzcyBvZiBhIGhvc3Qgd2l0aCB3aGljaCB0bworCQkJCWNvbm5lY3QgdGhlIHVzZXIgd2hlbiB0aGUgTG9naW4tU2VydmljZSBBVlAgaXMgaW5jbHVkZWQuICBJdCBNQVkgYmUKKwkJCQl1c2VkIGluIGFuIEFBLVJlcXVlc3QgY29tbWFuZCBhcyBhIGhpbnQgdG8gdGhlIERpYW1ldGVyIFNlcnZlciB0aGF0IGEKKwkJCQlzcGVjaWZpYyBob3N0IGlzIGRlc2lyZWQsIGJ1dCB0aGUgRGlhbWV0ZXIgU2VydmVyIGlzIG5vdCByZXF1aXJlZCB0bworCQkJCWhvbm9yIHRoZSBoaW50IGluIHRoZSBBQS1BbnN3ZXIuCisKKwkJCQlUd28gYWRkcmVzc2VzIGhhdmUgc3BlY2lhbCBzaWduaWZpY2FuY2U6CisKKwkJCQkweEZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGIGFuZCAwLiAgVGhlIHZhbHVlCisJCQkJMHhGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRiBpbmRpY2F0ZXMgdGhhdCB0aGUgTkFTIFNIT1VMRAorCQkJCWFsbG93IHRoZSB1c2VyIHRvIHNlbGVjdCBhbiBhZGRyZXNzLiAgVGhlIHZhbHVlIDAgaW5kaWNhdGVzIHRoYXQgdGhlCisJCQkJTkFTIFNIT1VMRCBzZWxlY3QgYSBob3N0IHRvIGNvbm5lY3QgdGhlIHVzZXIgdG8uCisKKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgCSp0eXBlOworCQkJdW5zaWduZWQgY2hhciAJCSBhbGx6ZXJvc1sxNl07CisJCQl1bnNpZ25lZCBjaGFyCQkgYWxsb25lc1sxNl07CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgCSB0ZGF0YSA9IHsgQVZQX1RZUEVfT0NURVRTVFJJTkcsCSJFbnVtZXJhdGVkKExvZ2luLUlQdjYtSG9zdCkiCSwgTlVMTCwgTlVMTH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgdHZhbHNbXSA9IHsKKwkJCQllbnVtdmFsX2RlZl9vcyggMTYsICZhbGx6ZXJvcywgIigwKSBOQVMgc2VsZWN0cyB0aGUgaG9zdCIpLAorCQkJCWVudW12YWxfZGVmX29zKCAxNiwgJmFsbG9uZXMgLCAiKDEpIFVzZXIgc2VsZWN0cyB0aGUgYWRkcmVzcyIpCisJCQl9OworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTk4LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIkxvZ2luLUlQdjYtSG9zdCIsIAkJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORyAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCQkJaW50IGk7CisJCQltZW1zZXQoYWxsemVyb3MsIDAsICAgc2l6ZW9mKGFsbHplcm9zKSk7CisJCQltZW1zZXQoYWxsb25lcywgMHhmZiwgc2l6ZW9mKGFsbG9uZXMpKTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBlbnVtZXJhdGVkIHZhbHVlcywgYW5kIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSAsIE5VTEwsICZ0eXBlKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBzaXplb2YodHZhbHMpIC8gc2l6ZW9mKHR2YWxzWzBdKTsgaSsrKSB7CisJCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnR2YWxzW2ldLCB0eXBlLCBOVUxMKTsKKwkJCX0KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCB0eXBlLCBOVUxMKTsKKwkJfQorCQkKKwkJLyogTG9naW4tU2VydmljZSAqLworCQl7CisJCQkvKgorCQkJCVRoZSBMb2dpbi1TZXJ2aWNlIEFWUCAoQVZQIENvZGUgMTUpIGlzIG9mIHR5cGUgRW51bWVyYXRlZCBhbmQKKwkJCQljb250YWlucyB0aGUgc2VydmljZSB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIGNvbm5lY3QgdGhlIHVzZXIgdG8gdGhlCisJCQkJbG9naW4gaG9zdC4gIFRoaXMgQVZQIFNIT1VMRCBvbmx5IGJlIHByZXNlbnQgaW4gYXV0aG9yaXphdGlvbgorCQkJCXJlc3BvbnNlcy4KKworCQkJCVRoZSBzdXBwb3J0ZWQgdmFsdWVzIGFyZSBsaXN0ZWQgaW4gW1JBRElVU1R5cGVzXS4KKwkJCQlTdWItcmVnaXN0cnk6IFZhbHVlcyBmb3IgUkFESVVTIEF0dHJpYnV0ZSAxNSwgTG9naW4tU2VydmljZQorCQkJCVJlZmVyZW5jZTogW1JGQzI4NjVdCisgICAJCQkqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0IAkqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAJIHRkYXRhID0geyBBVlBfVFlQRV9VTlNJR05FRDMyLAkiRW51bWVyYXRlZChMb2dpbi1TZXJ2aWNlKSIJLCBOVUxMLCBOVUxMfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSB0dmFsc1tdID0geworCQkJCWVudW12YWxfZGVmX3UzMiggMCwgIlRlbG5ldCIpLAorCQkJCWVudW12YWxfZGVmX3UzMiggMSwgIlJsb2dpbiIpLAorCQkJCWVudW12YWxfZGVmX3UzMiggMiwgIlRDUCBDbGVhciIpLAorCQkJCWVudW12YWxfZGVmX3UzMiggMywgIlBvcnRNYXN0ZXIgKHByb3ByaWV0YXJ5KSIpLAorCQkJCWVudW12YWxfZGVmX3UzMiggNCwgIkxBVCIpLAorCQkJCWVudW12YWxfZGVmX3UzMiggNSwgIlgyNS1QQUQiKSwKKwkJCQllbnVtdmFsX2RlZl91MzIoIDYsICJYMjUtVDNQT1MiKSwKKwkJCQllbnVtdmFsX2RlZl91MzIoIDgsICJUQ1AgQ2xlYXIgUXVpZXQgKHN1cHByZXNzZXMgYW55IE5BUy1nZW5lcmF0ZWQgY29ubmVjdCBzdHJpbmcpIikKKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJCQkJMTUsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiTG9naW4tU2VydmljZSIsIAkJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9VTlNJR05FRDMyIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlpbnQgaTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBlbnVtZXJhdGVkIHZhbHVlcywgYW5kIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSAsIE5VTEwsICZ0eXBlKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBzaXplb2YodHZhbHMpIC8gc2l6ZW9mKHR2YWxzWzBdKTsgaSsrKSB7CisJCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnR2YWxzW2ldLCB0eXBlLCBOVUxMKTsKKwkJCX0KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCB0eXBlLCBOVUxMKTsKKwkJfQorCQkKKy8qKiogIFRDUCBTZXJ2aWNlcyAgKioqLworCQkKKwkJLyogTG9naW4tVENQLVBvcnQgKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgTG9naW4tVENQLVBvcnQgQVZQIChBVlAgQ29kZSAxNikgaXMgb2YgdHlwZSBVbnNpZ25lZDMyIGFuZAorCQkJCWNvbnRhaW5zIHRoZSBUQ1AgcG9ydCB3aXRoIHdoaWNoIHRoZSB1c2VyIGlzIHRvIGJlIGNvbm5lY3RlZCB3aGVuIHRoZQorCQkJCUxvZ2luLVNlcnZpY2UgQVZQIGlzIGFsc28gcHJlc2VudC4gIFRoaXMgQVZQIFNIT1VMRCBvbmx5IGJlIHByZXNlbnQKKwkJCQlpbiBhdXRob3JpemF0aW9uIHJlc3BvbnNlcy4gIFRoZSB2YWx1ZSBNVVNUIE5PVCBiZSBncmVhdGVyIHRoYW4KKwkJCQk2NSw1MzUuCisJCQkqLworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTE2LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIkxvZ2luLVRDUC1Qb3J0IiwgCQkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCBOVUxMKTsKKwkJfQorCQkKKy8qKiogIExBVCBTZXJ2aWNlcyAgKioqLworCQkKKwkJLyogTG9naW4tTEFULVNlcnZpY2UgKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgTG9naW4tTEFULVNlcnZpY2UgQVZQIChBVlAgQ29kZSAzNCkgaXMgb2YgdHlwZSBPY3RldFN0cmluZyBhbmQKKwkJCQljb250YWlucyB0aGUgc3lzdGVtIHdpdGggd2hpY2ggdGhlIHVzZXIgaXMgdG8gYmUgY29ubmVjdGVkIGJ5IExBVC4KKwkJCQlJdCBNQVkgYmUgdXNlZCBpbiBhbiBhdXRob3JpemF0aW9uIHJlcXVlc3QgYXMgYSBoaW50IHRvIHRoZSBzZXJ2ZXIKKwkJCQl0aGF0IGEgc3BlY2lmaWMgc2VydmljZSBpcyBkZXNpcmVkLCBidXQgdGhlIHNlcnZlciBpcyBub3QgcmVxdWlyZWQgdG8KKwkJCQlob25vciB0aGUgaGludCBpbiB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZS4gIFRoaXMgQVZQIE1VU1Qgb25seSBiZQorCQkJCXByZXNlbnQgaW4gdGhlIHJlc3BvbnNlIGlmIHRoZSBMb2dpbi1TZXJ2aWNlIEFWUCBzdGF0ZXMgdGhhdCBMQVQgaXMKKwkJCQlkZXNpcmVkLgorCisJCQkJQWRtaW5pc3RyYXRvcnMgdXNlIHRoaXMgc2VydmljZSBhdHRyaWJ1dGUgd2hlbiBkZWFsaW5nIHdpdGggY2x1c3RlcmVkCisJCQkJc3lzdGVtcywgc3VjaCBhcyBhIFZBWCBvciBBbHBoYSBjbHVzdGVyLiAgSW4gdGhlc2UgZW52aXJvbm1lbnRzLAorCQkJCXNldmVyYWwgZGlmZmVyZW50IHRpbWUtc2hhcmluZyBob3N0cyBzaGFyZSB0aGUgc2FtZSByZXNvdXJjZXMgKGRpc2tzLAorCQkJCXByaW50ZXJzLCBldGMuKSwgYW5kIGFkbWluaXN0cmF0b3JzIG9mdGVuIGNvbmZpZ3VyZSBlYWNoIGhvc3QgdG8KKwkJCQlvZmZlciBhY2Nlc3MgKHNlcnZpY2UpIHRvIGVhY2ggb2YgdGhlIHNoYXJlZCByZXNvdXJjZXMuICBJbiB0aGlzCisJCQkJY2FzZSwgZWFjaCBob3N0IGluIHRoZSBjbHVzdGVyIGFkdmVydGlzZXMgaXRzIHNlcnZpY2VzIHRocm91Z2ggTEFUCisJCQkJYnJvYWRjYXN0cy4KKworCQkJCVNvcGhpc3RpY2F0ZWQgdXNlcnMgb2Z0ZW4ga25vdyB3aGljaCBzZXJ2aWNlIHByb3ZpZGVycyAobWFjaGluZXMpIGFyZQorCQkJCWZhc3RlciBhbmQgdGVuZCB0byB1c2UgYSBub2RlIG5hbWUgd2hlbiBpbml0aWF0aW5nIGEgTEFUIGNvbm5lY3Rpb24uCisJCQkJU29tZSBhZG1pbmlzdHJhdG9ycyB3YW50IHBhcnRpY3VsYXIgdXNlcnMgdG8gdXNlIGNlcnRhaW4gbWFjaGluZXMgYXMKKwkJCQlhIHByaW1pdGl2ZSBmb3JtIG9mIGxvYWQgYmFsYW5jaW5nIChhbHRob3VnaCBMQVQga25vd3MgaG93IHRvIGRvIGxvYWQKKwkJCQliYWxhbmNpbmcgaXRzZWxmKS4KKworCQkJCVRoZSBTdHJpbmcgZmllbGQgY29udGFpbnMgdGhlIGlkZW50aXR5IG9mIHRoZSBMQVQgc2VydmljZSB0byB1c2UuCisJCQkJVGhlIExBVCBBcmNoaXRlY3R1cmUgYWxsb3dzIHRoaXMgc3RyaW5nIHRvIGNvbnRhaW4gJCAoZG9sbGFyKSwgLQorCQkJCShoeXBoZW4pLCAuIChwZXJpb2QpLCBfICh1bmRlcnNjb3JlKSwgbnVtZXJpY3MsIHVwcGVyLSBhbmQgbG93ZXJjYXNlCisJCQkJYWxwaGFiZXRpY3MsIGFuZCB0aGUgSVNPIExhdGluLTEgY2hhcmFjdGVyIHNldCBleHRlbnNpb24gW0lTT0xhdGluXS4KKwkJCQlBbGwgTEFUIHN0cmluZyBjb21wYXJpc29ucyBhcmUgY2FzZSBpbnNlbnNpdGl2ZS4KKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJCQkJMzQsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiTG9naW4tTEFULVNlcnZpY2UiLCAJCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCSAJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCBOVUxMKTsKKwkJfQorCQkKKwkJLyogTG9naW4tTEFULU5vZGUgKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgTG9naW4tTEFULU5vZGUgQVZQIChBVlAgQ29kZSAzNSkgaXMgb2YgdHlwZSBPY3RldFN0cmluZyBhbmQKKwkJCQljb250YWlucyB0aGUgTm9kZSB3aXRoIHdoaWNoIHRoZSB1c2VyIGlzIHRvIGJlIGF1dG9tYXRpY2FsbHkKKwkJCQljb25uZWN0ZWQgYnkgTEFULiAgSXQgTUFZIGJlIHVzZWQgaW4gYW4gYXV0aG9yaXphdGlvbiByZXF1ZXN0IGFzIGEKKwkJCQloaW50IHRvIHRoZSBzZXJ2ZXIgdGhhdCBhIHNwZWNpZmljIExBVCBub2RlIGlzIGRlc2lyZWQsIGJ1dCB0aGUKKwkJCQlzZXJ2ZXIgaXMgbm90IHJlcXVpcmVkIHRvIGhvbm9yIHRoZSBoaW50IGluIHRoZSBjb3JyZXNwb25kaW5nCisJCQkJcmVzcG9uc2UuICBUaGlzIEFWUCBNVVNUIG9ubHkgYmUgcHJlc2VudCBpbiBhIHJlc3BvbnNlIGlmIHRoZSBMb2dpbi0KKwkJCQlTZXJ2aWNlLVR5cGUgQVZQIGlzIHNldCB0byBMQVQuCisKKwkJCQlUaGUgU3RyaW5nIGZpZWxkIGNvbnRhaW5zIHRoZSBpZGVudGl0eSBvZiB0aGUgTEFUIHNlcnZpY2UgdG8gdXNlLgorCQkJCVRoZSBMQVQgQXJjaGl0ZWN0dXJlIGFsbG93cyB0aGlzIHN0cmluZyB0byBjb250YWluICQgKGRvbGxhciksIC0KKwkJCQkoaHlwaGVuKSwgLiAocGVyaW9kKSwgXyAodW5kZXJzY29yZSksIG51bWVyaWNzLCB1cHBlci0gYW5kIGxvd2VyY2FzZQorCQkJCWFscGhhYmV0aWNzLCBhbmQgdGhlIElTTyBMYXRpbi0xIGNoYXJhY3RlciBzZXQgZXh0ZW5zaW9uIFtJU09MYXRpbl0uCisJCQkJQWxsIExBVCBzdHJpbmcgY29tcGFyaXNvbnMgYXJlIGNhc2UgaW5zZW5zaXRpdmUuCisJCQkqLworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTM1LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIkxvZ2luLUxBVC1Ob2RlIiwgCQkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgTlVMTCk7CisJCX0KKwkJCisJCS8qIExvZ2luLUxBVC1Hcm91cCAqLworCQl7CisJCQkvKgorCQkJCVRoZSBMb2dpbi1MQVQtR3JvdXAgQVZQIChBVlAgQ29kZSAzNikgaXMgb2YgdHlwZSBPY3RldFN0cmluZyBhbmQKKwkJCQljb250YWlucyBhIHN0cmluZyBpZGVudGlmeWluZyB0aGUgTEFUIGdyb3VwIGNvZGVzIHRoaXMgdXNlciBpcworCQkJCWF1dGhvcml6ZWQgdG8gdXNlLiAgSXQgTUFZIGJlIHVzZWQgaW4gYW4gYXV0aG9yaXphdGlvbiByZXF1ZXN0IGFzIGEKKwkJCQloaW50IHRvIHRoZSBzZXJ2ZXIgdGhhdCBhIHNwZWNpZmljIGdyb3VwIGlzIGRlc2lyZWQsIGJ1dCB0aGUgc2VydmVyCisJCQkJaXMgbm90IHJlcXVpcmVkIHRvIGhvbm9yIHRoZSBoaW50IGluIHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlLgorCQkJCVRoaXMgQVZQIE1VU1Qgb25seSBiZSBwcmVzZW50IGluIGEgcmVzcG9uc2UgaWYgdGhlIExvZ2luLVNlcnZpY2UtVHlwZQorCQkJCUFWUCBpcyBzZXQgdG8gTEFULgorCisJCQkJTEFUIHN1cHBvcnRzIDI1NiBkaWZmZXJlbnQgZ3JvdXAgY29kZXMsIHdoaWNoIExBVCB1c2VzIGFzIGEgZm9ybSBvZgorCQkJCWFjY2VzcyByaWdodHMuICBMQVQgZW5jb2RlcyB0aGUgZ3JvdXAgY29kZXMgYXMgYSAyNTYtYml0IGJpdG1hcC4KKworCQkJCUFkbWluaXN0cmF0b3JzIGNhbiBhc3NpZ24gb25lIG9yIG1vcmUgb2YgdGhlIGdyb3VwIGNvZGUgYml0cyBhdCB0aGUKKwkJCQlMQVQgc2VydmljZSBwcm92aWRlcjsgaXQgd2lsbCBvbmx5IGFjY2VwdCBMQVQgY29ubmVjdGlvbnMgdGhhdCBoYXZlCisJCQkJdGhlc2UgZ3JvdXAgY29kZXMgc2V0IGluIHRoZSBiaXRtYXAuICBUaGUgYWRtaW5pc3RyYXRvcnMgYXNzaWduIGEKKwkJCQliaXRtYXAgb2YgYXV0aG9yaXplZCBncm91cCBjb2RlcyB0byBlYWNoIHVzZXIuICBMQVQgZ2V0cyB0aGVzZSBmcm9tCisJCQkJdGhlIG9wZXJhdGluZyBzeXN0ZW0gYW5kIHVzZXMgdGhlbSBpbiBpdHMgcmVxdWVzdHMgdG8gdGhlIHNlcnZpY2UKKwkJCQlwcm92aWRlcnMuCisKKwkJCQlUaGUgY29kaWZpY2F0aW9uIG9mIHRoZSByYW5nZSBvZiBhbGxvd2VkIHVzYWdlIG9mIHRoaXMgZmllbGQgaXMKKwkJCQlvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGlzIHNwZWNpZmljYXRpb24uCisJCQkqLworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTM2LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIkxvZ2luLUxBVC1Hcm91cCIsIAkJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORyAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsIE5VTEwpOworCQl9CisJCQorCQkvKiBMb2dpbi1MQVQtUG9ydCAqLworCQl7CisJCQkvKgorCQkJCVRoZSBMb2dpbi1MQVQtUG9ydCBBVlAgKEFWUCBDb2RlIDYzKSBpcyBvZiB0eXBlIE9jdGV0U3RyaW5nIGFuZAorCQkJCWNvbnRhaW5zIHRoZSBQb3J0IHdpdGggd2hpY2ggdGhlIHVzZXIgaXMgdG8gYmUgY29ubmVjdGVkIGJ5IExBVC4gIEl0CisJCQkJTUFZIGJlIHVzZWQgaW4gYW4gYXV0aG9yaXphdGlvbiByZXF1ZXN0IGFzIGEgaGludCB0byB0aGUgc2VydmVyIHRoYXQKKwkJCQlhIHNwZWNpZmljIHBvcnQgaXMgZGVzaXJlZCwgYnV0IHRoZSBzZXJ2ZXIgaXMgbm90IHJlcXVpcmVkIHRvIGhvbm9yCisJCQkJdGhlIGhpbnQgaW4gdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2UuICBUaGlzIEFWUCBNVVNUIG9ubHkgYmUKKwkJCQlwcmVzZW50IGluIGEgcmVzcG9uc2UgaWYgdGhlIExvZ2luLVNlcnZpY2UtVHlwZSBBVlAgaXMgc2V0IHRvIExBVC4KKworCQkJCVRoZSBTdHJpbmcgZmllbGQgY29udGFpbnMgdGhlIGlkZW50aXR5IG9mIHRoZSBMQVQgc2VydmljZSB0byB1c2UuCisJCQkJVGhlIExBVCBBcmNoaXRlY3R1cmUgYWxsb3dzIHRoaXMgc3RyaW5nIHRvIGNvbnRhaW4gJCAoZG9sbGFyKSwgLQorCQkJCShoeXBoZW4pLCAuIChwZXJpb2QpLCBfICh1bmRlcnNjb3JlKSwgbnVtZXJpY3MsIHVwcGVyLSBhbmQgbG93ZXItY2FzZQorCQkJCWFscGhhYmV0aWNzLCBhbmQgdGhlIElTTyBMYXRpbi0xIGNoYXJhY3RlciBzZXQgZXh0ZW5zaW9uIFtJU09MYXRpbl0uCisJCQkJQWxsIExBVCBzdHJpbmcgY29tcGFyaXNvbnMgYXJlIGNhc2UgaW5zZW5zaXRpdmUuCisJCQkqLworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTYzLCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIkxvZ2luLUxBVC1Qb3J0IiwgCQkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgTlVMTCk7CisJCX0KKwkJCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBOQVMgVHVubmVsaW5nIEFWUHMgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwkJCisJCS8qIFR1bm5lbC1UeXBlICovCisJCXsKKwkJCS8qCisJCQkJVGhlIFR1bm5lbC1UeXBlIEFWUCAoQVZQIENvZGUgNjQpIGlzIG9mIHR5cGUgRW51bWVyYXRlZCBhbmQgY29udGFpbnMKKwkJCQl0aGUgdHVubmVsaW5nIHByb3RvY29sKHMpIHRvIGJlIHVzZWQgKGluIHRoZSBjYXNlIG9mIGEgdHVubmVsCisJCQkJaW5pdGlhdG9yKSBvciBpbiB1c2UgKGluIHRoZSBjYXNlIG9mIGEgdHVubmVsIHRlcm1pbmF0b3IpLiAgSXQgTUFZIGJlCisJCQkJdXNlZCBpbiBhbiBhdXRob3JpemF0aW9uIHJlcXVlc3QgYXMgYSBoaW50IHRvIHRoZSBzZXJ2ZXIgdGhhdCBhCisJCQkJc3BlY2lmaWMgdHVubmVsIHR5cGUgaXMgZGVzaXJlZCwgYnV0IHRoZSBzZXJ2ZXIgaXMgbm90IHJlcXVpcmVkIHRvCisJCQkJaG9ub3IgdGhlIGhpbnQgaW4gdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2UuCisKKwkJCQlUaGUgVHVubmVsLVR5cGUgQVZQIFNIT1VMRCBhbHNvIGJlIGluY2x1ZGVkIGluIEFjY291bnRpbmctUmVxdWVzdAorCQkJCW1lc3NhZ2VzLgorCisJCQkJQSB0dW5uZWwgaW5pdGlhdG9yIGlzIG5vdCByZXF1aXJlZCB0byBpbXBsZW1lbnQgYW55IG9mIHRoZXNlIHR1bm5lbAorCQkJCXR5cGVzLiAgSWYgYSB0dW5uZWwgaW5pdGlhdG9yIHJlY2VpdmVzIGEgcmVzcG9uc2UgdGhhdCBjb250YWlucyBvbmx5CisJCQkJdW5rbm93biBvciB1bnN1cHBvcnRlZCBUdW5uZWwtVHlwZXMsIHRoZSB0dW5uZWwgaW5pdGlhdG9yIE1VU1QgYmVoYXZlCisJCQkJYXMgdGhvdWdoIGEgcmVzcG9uc2Ugd2VyZSByZWNlaXZlZCB3aXRoIHRoZSBSZXN1bHQtQ29kZSBpbmRpY2F0aW5nIGEKKwkJCQlmYWlsdXJlLgorCisJCQkJVGhlIHN1cHBvcnRlZCB2YWx1ZXMgYXJlIGxpc3RlZCBpbiBbUkFESVVTVHlwZXNdLgorCQkJCVN1Yi1yZWdpc3RyeTogVmFsdWVzIGZvciBSQURJVVMgQXR0cmlidXRlIDY0LCBUdW5uZWwtVHlwZSAKKwkJCQlSZWZlcmVuY2U6IFtSRkMyODY4XQorCQkJKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAJKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgCSB0ZGF0YSA9IHsgQVZQX1RZUEVfVU5TSUdORUQzMiwJIkVudW1lcmF0ZWQoVHVubmVsLVR5cGUpIgksIE5VTEwsIE5VTEx9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIHR2YWxzW10gPSB7CisJCQkJZW51bXZhbF9kZWZfdTMyKCAxLCAiUG9pbnQtdG8tUG9pbnQgVHVubmVsaW5nIFByb3RvY29sIChQUFRQKSBbUkZDMjg2OF0iKSwKKwkJCQllbnVtdmFsX2RlZl91MzIoIDIsICJMYXllciBUd28gRm9yd2FyZGluZyAoTDJGKSBbUkZDMjg2OF0iKSwKKwkJCQllbnVtdmFsX2RlZl91MzIoIDMsICJMYXllciBUd28gVHVubmVsaW5nIFByb3RvY29sIChMMlRQKSBbUkZDMjg2OF0iKSwKKwkJCQllbnVtdmFsX2RlZl91MzIoIDQsICJBc2NlbmQgVHVubmVsIE1hbmFnZW1lbnQgUHJvdG9jb2wgKEFUTVApIFtSRkMyODY4XSIpLAorCQkJCWVudW12YWxfZGVmX3UzMiggNSwgIlZpcnR1YWwgVHVubmVsaW5nIFByb3RvY29sIChWVFApIFtSRkMyODY4XSIpLAorCQkJCWVudW12YWxfZGVmX3UzMiggNiwgIklQIEF1dGhlbnRpY2F0aW9uIEhlYWRlciBpbiB0aGUgVHVubmVsLW1vZGUgKEFIKSBbUkZDMjg2OF0iKSwKKwkJCQllbnVtdmFsX2RlZl91MzIoIDcsICJJUC1pbi1JUCBFbmNhcHN1bGF0aW9uIChJUC1JUCkgW1JGQzI4NjhdIiksCisJCQkJZW51bXZhbF9kZWZfdTMyKCA4LCAiTWluaW1hbCBJUC1pbi1JUCBFbmNhcHN1bGF0aW9uIChNSU4tSVAtSVApIFtSRkMyODY4XSIpLAorCQkJCWVudW12YWxfZGVmX3UzMiggOSwgIklQIEVuY2Fwc3VsYXRpbmcgU2VjdXJpdHkgUGF5bG9hZCBpbiB0aGUgVHVubmVsLW1vZGUgKEVTUCkgW1JGQzI4NjhdIiksCisJCQkJZW51bXZhbF9kZWZfdTMyKDEwLCAiR2VuZXJpYyBSb3V0ZSBFbmNhcHN1bGF0aW9uIChHUkUpIFtSRkMyODY4XSIpLAorCQkJCWVudW12YWxfZGVmX3UzMigxMSwgIkJheSBEaWFsIFZpcnR1YWwgU2VydmljZXMgKERWUykgW1JGQzI4NjhdIiksCisJCQkJZW51bXZhbF9kZWZfdTMyKDEyLCAiSVAtaW4tSVAgVHVubmVsaW5nIFtSRkMyODY4XSIpLAorCQkJCWVudW12YWxfZGVmX3UzMigxMywgIlZpcnR1YWwgTEFOcyAoVkxBTikgW1JGQzM1ODBdIikKKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBhZGF0YSA9IHsgCisJCQkJCTY0LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIlR1bm5lbC1UeXBlIiwgCQkJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCWludCBpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhICwgTlVMTCwgJnR5cGUpOworCQkJZm9yIChpID0gMDsgaSA8IHNpemVvZih0dmFscykgLyBzaXplb2YodHZhbHNbMF0pOyBpKyspIHsKKwkJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdHZhbHNbaV0sIHR5cGUsIE5VTEwpOworCQkJfQorCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmYWRhdGEgLCB0eXBlLCBOVUxMKTsKKwkJfQorCQkKKwkJLyogVHVubmVsLU1lZGl1bS1UeXBlICovCisJCXsKKwkJCS8qCisJCQkJVGhlIFR1bm5lbC1NZWRpdW0tVHlwZSBBVlAgKEFWUCBDb2RlIDY1KSBpcyBvZiB0eXBlIEVudW1lcmF0ZWQgYW5kCisJCQkJY29udGFpbnMgdGhlIHRyYW5zcG9ydCBtZWRpdW0gdG8gdXNlIHdoZW4gY3JlYXRpbmcgYSB0dW5uZWwgZm9yCisJCQkJcHJvdG9jb2xzIChzdWNoIGFzIEwyVFApIHRoYXQgY2FuIG9wZXJhdGUgb3ZlciBtdWx0aXBsZSB0cmFuc3BvcnRzLgorCQkJCUl0IE1BWSBiZSB1c2VkIGluIGFuIGF1dGhvcml6YXRpb24gcmVxdWVzdCBhcyBhIGhpbnQgdG8gdGhlIHNlcnZlcgorCQkJCXRoYXQgYSBzcGVjaWZpYyBtZWRpdW0gaXMgZGVzaXJlZCwgYnV0IHRoZSBzZXJ2ZXIgaXMgbm90IHJlcXVpcmVkIHRvCisJCQkJaG9ub3IgdGhlIGhpbnQgaW4gdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2UuCisKKwkJCQlUaGUgc3VwcG9ydGVkIHZhbHVlcyBhcmUgbGlzdGVkIGluIFtSQURJVVNUeXBlc10uCisJCQkJU3ViLXJlZ2lzdHJ5OiBWYWx1ZXMgZm9yIFJBRElVUyBBdHRyaWJ1dGUgNjUsIFR1bm5lbC1NZWRpdW0tVHlwZQorCQkJCVJlZmVyZW5jZTogW1JGQzI4NjhdCisJCQkqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0IAkqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAJIHRkYXRhID0geyBBVlBfVFlQRV9VTlNJR05FRDMyLAkiRW51bWVyYXRlZChUdW5uZWwtTWVkaXVtLVR5cGUpIgksIE5VTEwsIE5VTEx9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIHR2YWxzW10gPSB7CisJCQkJZW51bXZhbF9kZWZfdTMyKCAxLCAiSVB2NCAoSVAgdmVyc2lvbiA0KSBbUkZDMjg2OF0iKSwKKwkJCQllbnVtdmFsX2RlZl91MzIoIDIsICJJUHY2IChJUCB2ZXJzaW9uIDYpIFtSRkMyODY4XSIpLAorCQkJCWVudW12YWxfZGVmX3UzMiggMywgIk5TQVAgW1JGQzI4NjhdIiksCisJCQkJZW51bXZhbF9kZWZfdTMyKCA0LCAiSERMQyAoOC1iaXQgbXVsdGlkcm9wKSBbUkZDMjg2OF0iKSwKKwkJCQllbnVtdmFsX2RlZl91MzIoIDUsICJCQk4gMTgyMiBbUkZDMjg2OF0iKSwKKwkJCQllbnVtdmFsX2RlZl91MzIoIDYsICI4MDIgKGluY2x1ZGVzIGFsbCA4MDIgbWVkaWEgcGx1cyBFdGhlcm5ldCBcImNhbm9uaWNhbCBmb3JtYXRcIikgW1JGQzI4NjhdIiksCisJCQkJZW51bXZhbF9kZWZfdTMyKCA3LCAiRS4xNjMgKFBPVFMpIFtSRkMyODY4XSIpLAorCQkJCWVudW12YWxfZGVmX3UzMiggOCwgIkUuMTY0IChTTURTLCBGcmFtZSBSZWxheSwgQVRNKSBbUkZDMjg2OF0iKSwKKwkJCQllbnVtdmFsX2RlZl91MzIoIDksICJGLjY5IChUZWxleCkgW1JGQzI4NjhdIiksCisJCQkJZW51bXZhbF9kZWZfdTMyKDEwLCAiWC4xMjEgKFguMjUsIEZyYW1lIFJlbGF5KSBbUkZDMjg2OF0iKSwKKwkJCQllbnVtdmFsX2RlZl91MzIoMTEsICJJUFggW1JGQzI4NjhdIiksCisJCQkJZW51bXZhbF9kZWZfdTMyKDEyLCAiQXBwbGV0YWxrIFtSRkMyODY4XSIpLAorCQkJCWVudW12YWxfZGVmX3UzMigxMywgIkRlY25ldCBJViBbUkZDMjg2OF0iKSwKKwkJCQllbnVtdmFsX2RlZl91MzIoMTQsICJCYW55YW4gVmluZXMgW1JGQzI4NjhdIiksCisJCQkJZW51bXZhbF9kZWZfdTMyKDE1LCAiRS4xNjQgd2l0aCBOU0FQIGZvcm1hdCBzdWJhZGRyZXNzIFtSRkMyODY4XSIpCisJCQl9OworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgYWRhdGEgPSB7IAorCQkJCQk2NSwgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJUdW5uZWwtTWVkaXVtLVR5cGUiLCAJCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCQkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9VTlNJR05FRDMyIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlpbnQgaTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSAsIE5VTEwsICZ0eXBlKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBzaXplb2YodHZhbHMpIC8gc2l6ZW9mKHR2YWxzWzBdKTsgaSsrKSB7CisJCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnR2YWxzW2ldLCB0eXBlLCBOVUxMKTsKKwkJCX0KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmFkYXRhICwgdHlwZSwgTlVMTCk7CisJCX0KKwkJCisJCS8qIFR1bm5lbC1DbGllbnQtRW5kcG9pbnQgKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgVHVubmVsLUNsaWVudC1FbmRwb2ludCBBVlAgKEFWUCBDb2RlIDY2KSBpcyBvZiB0eXBlIFVURjhTdHJpbmcKKwkJCQlhbmQgY29udGFpbnMgdGhlIGFkZHJlc3Mgb2YgdGhlIGluaXRpYXRvciBlbmQgb2YgdGhlIHR1bm5lbC4gIEl0IE1BWQorCQkJCWJlIHVzZWQgaW4gYW4gYXV0aG9yaXphdGlvbiByZXF1ZXN0IGFzIGEgaGludCB0byB0aGUgc2VydmVyIHRoYXQgYQorCQkJCXNwZWNpZmljIGVuZHBvaW50IGlzIGRlc2lyZWQsIGJ1dCB0aGUgc2VydmVyIGlzIG5vdCByZXF1aXJlZCB0byBob25vcgorCQkJCXRoZSBoaW50IGluIHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlLgorCisJCQkJVGhpcyBBVlAgU0hPVUxEIGJlIGluY2x1ZGVkIGluIHRoZSBjb3JyZXNwb25kaW5nIEFjY291bnRpbmctUmVxdWVzdAorCQkJCW1lc3NhZ2VzLCBpbiB3aGljaCBjYXNlIGl0IGluZGljYXRlcyB0aGUgYWRkcmVzcyBmcm9tIHdoaWNoIHRoZQorCQkJCXR1bm5lbCB3YXMgaW5pdGlhdGVkLiAgVGhpcyBBVlAsIGFsb25nIHdpdGggdGhlIFR1bm5lbC1TZXJ2ZXItCisJCQkJRW5kcG9pbnQgYW5kIFNlc3Npb24tSWQgQVZQIFtCQVNFXSwgTUFZIGJlIHVzZWQgdG8gcHJvdmlkZSBhIGdsb2JhbGx5CisJCQkJdW5pcXVlIG1lYW5zIHRvIGlkZW50aWZ5IGEgdHVubmVsIGZvciBhY2NvdW50aW5nIGFuZCBhdWRpdGluZworCQkJCXB1cnBvc2VzLgorCisJCQkJSWYgVHVubmVsLU1lZGl1bS1UeXBlIGlzIElQdjQgKDEpLCB0aGVuIHRoaXMgc3RyaW5nIGlzIGVpdGhlciB0aGUKKwkJCQlmdWxseSBxdWFsaWZpZWQgZG9tYWluIG5hbWUgKEZRRE4pIG9mIHRoZSB0dW5uZWwgY2xpZW50IG1hY2hpbmUsIG9yIGEKKwkJCQkiZG90dGVkLWRlY2ltYWwiIElQIGFkZHJlc3MuICBJbXBsZW1lbnRhdGlvbnMgTVVTVCBzdXBwb3J0IHRoZQorCQkJCWRvdHRlZC1kZWNpbWFsIGZvcm1hdCBhbmQgU0hPVUxEIHN1cHBvcnQgdGhlIEZRRE4gZm9ybWF0IGZvciBJUAorCQkJCWFkZHJlc3Nlcy4KKworCQkJCUlmIFR1bm5lbC1NZWRpdW0tVHlwZSBpcyBJUHY2ICgyKSwgdGhlbiB0aGlzIHN0cmluZyBpcyBlaXRoZXIgdGhlCisJCQkJRlFETiBvZiB0aGUgdHVubmVsIGNsaWVudCBtYWNoaW5lLCBvciBhIHRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhlCisJCQkJYWRkcmVzcyBpbiBlaXRoZXIgdGhlIHByZWZlcnJlZCBvciBhbHRlcm5hdGUgZm9ybSBbSVB2NkFkZHJdLgorCQkJCUNvbmZvcm1pbmcgaW1wbGVtZW50YXRpb25zIE1VU1Qgc3VwcG9ydCB0aGUgcHJlZmVycmVkIGZvcm0gYW5kIFNIT1VMRAorCQkJCXN1cHBvcnQgYm90aCB0aGUgYWx0ZXJuYXRlIHRleHQgZm9ybSBhbmQgdGhlIEZRRE4gZm9ybWF0IGZvciBJUHY2CisJCQkJYWRkcmVzc2VzLgorCisJCQkJSWYgVHVubmVsLU1lZGl1bS1UeXBlIGlzIG5laXRoZXIgSVB2NCBub3IgSVB2NiwgdGhlbiB0aGlzIHN0cmluZyBpcyBhCisJCQkJdGFnIHJlZmVycmluZyB0byBjb25maWd1cmF0aW9uIGRhdGEgbG9jYWwgdG8gdGhlIERpYW1ldGVyIGNsaWVudCB0aGF0CisJCQkJZGVzY3JpYmVzIHRoZSBpbnRlcmZhY2Ugb3IgbWVkaXVtLXNwZWNpZmljIGNsaWVudCBhZGRyZXNzIHRvIHVzZS4KKyAgIAkJCSovCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBhZGF0YSA9IHsgCisJCQkJCTY2LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIlR1bm5lbC1DbGllbnQtRW5kcG9pbnQiLCAJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZhZGF0YSAsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX0KKwkJCisJCS8qIFR1bm5lbC1TZXJ2ZXItRW5kcG9pbnQgKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgVHVubmVsLVNlcnZlci1FbmRwb2ludCBBVlAgKEFWUCBDb2RlIDY3KSBpcyBvZiB0eXBlIFVURjhTdHJpbmcKKwkJCQlhbmQgY29udGFpbnMgdGhlIGFkZHJlc3Mgb2YgdGhlIHNlcnZlciBlbmQgb2YgdGhlIHR1bm5lbC4gIEl0IE1BWSBiZQorCQkJCXVzZWQgaW4gYW4gYXV0aG9yaXphdGlvbiByZXF1ZXN0IGFzIGEgaGludCB0byB0aGUgc2VydmVyIHRoYXQgYQorCQkJCXNwZWNpZmljIGVuZHBvaW50IGlzIGRlc2lyZWQsIGJ1dCB0aGUgc2VydmVyIGlzIG5vdCByZXF1aXJlZCB0byBob25vcgorCQkJCXRoZSBoaW50IGluIHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlLgorCisJCQkJVGhpcyBBVlAgU0hPVUxEIGJlIGluY2x1ZGVkIGluIHRoZSBjb3JyZXNwb25kaW5nIEFjY291bnRpbmctUmVxdWVzdAorCQkJCW1lc3NhZ2VzLCBpbiB3aGljaCBjYXNlIGl0IGluZGljYXRlcyB0aGUgYWRkcmVzcyBmcm9tIHdoaWNoIHRoZQorCQkJCXR1bm5lbCB3YXMgaW5pdGlhdGVkLiAgVGhpcyBBVlAsIGFsb25nIHdpdGggdGhlIFR1bm5lbC1DbGllbnQtCisJCQkJRW5kcG9pbnQgYW5kIFNlc3Npb24tSWQgQVZQIFtCQVNFXSwgTUFZIGJlIHVzZWQgdG8gcHJvdmlkZSBhIGdsb2JhbGx5CisJCQkJdW5pcXVlIG1lYW5zIHRvIGlkZW50aWZ5IGEgdHVubmVsIGZvciBhY2NvdW50aW5nIGFuZCBhdWRpdGluZworCQkJCXB1cnBvc2VzLgorCisJCQkJSWYgVHVubmVsLU1lZGl1bS1UeXBlIGlzIElQdjQgKDEpLCB0aGVuIHRoaXMgc3RyaW5nIGlzIGVpdGhlciB0aGUKKwkJCQlmdWxseSBxdWFsaWZpZWQgZG9tYWluIG5hbWUgKEZRRE4pIG9mIHRoZSB0dW5uZWwgc2VydmVyIG1hY2hpbmUsIG9yIGEKKwkJCQkiZG90dGVkLWRlY2ltYWwiIElQIGFkZHJlc3MuICBJbXBsZW1lbnRhdGlvbnMgTVVTVCBzdXBwb3J0IHRoZQorCQkJCWRvdHRlZC1kZWNpbWFsIGZvcm1hdCBhbmQgU0hPVUxEIHN1cHBvcnQgdGhlIEZRRE4gZm9ybWF0IGZvciBJUAorCQkJCWFkZHJlc3Nlcy4KKworCQkJCUlmIFR1bm5lbC1NZWRpdW0tVHlwZSBpcyBJUHY2ICgyKSwgdGhlbiB0aGlzIHN0cmluZyBpcyBlaXRoZXIgdGhlCisJCQkJRlFETiBvZiB0aGUgdHVubmVsIHNlcnZlciBtYWNoaW5lLCBvciBhIHRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhlCisJCQkJYWRkcmVzcyBpbiBlaXRoZXIgdGhlIHByZWZlcnJlZCBvciBhbHRlcm5hdGUgZm9ybSBbSVB2NkFkZHJdLgorCQkJCUltcGxlbWVudGF0aW9ucyBNVVNUIHN1cHBvcnQgdGhlIHByZWZlcnJlZCBmb3JtIGFuZCBTSE9VTEQgc3VwcG9ydAorCQkJCWJvdGggdGhlIGFsdGVybmF0ZSB0ZXh0IGZvcm0gYW5kIHRoZSBGUUROIGZvcm1hdCBmb3IgSVB2NiBhZGRyZXNzZXMuCisKKwkJCQlJZiBUdW5uZWwtTWVkaXVtLVR5cGUgaXMgbm90IElQdjQgb3IgSVB2NiwgdGhpcyBzdHJpbmcgaXMgYSB0YWcKKwkJCQlyZWZlcnJpbmcgdG8gY29uZmlndXJhdGlvbiBkYXRhIGxvY2FsIHRvIHRoZSBEaWFtZXRlciBjbGllbnQgdGhhdAorCQkJCWRlc2NyaWJlcyB0aGUgaW50ZXJmYWNlIG9yIG1lZGl1bS1zcGVjaWZpYyBzZXJ2ZXIgYWRkcmVzcyB0byB1c2UuCisgICAJCQkqLworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgYWRhdGEgPSB7IAorCQkJCQk2NywgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJUdW5uZWwtU2VydmVyLUVuZHBvaW50IiwgCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCQkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORyAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmYWRhdGEgLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9CisJCQorCQkvKiBUdW5uZWwtUGFzc3dvcmQgKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgVHVubmVsLVBhc3N3b3JkIEFWUCAoQVZQIENvZGUgNjkpIGlzIG9mIHR5cGUgT2N0ZXRTdHJpbmcgYW5kIG1heQorCQkJCWNvbnRhaW4gYSBwYXNzd29yZCB0byBiZSB1c2VkIHRvIGF1dGhlbnRpY2F0ZSB0byBhIHJlbW90ZSBzZXJ2ZXIuCisJCQkJVGhlIFR1bm5lbC1QYXNzd29yZCBBVlAgY29udGFpbnMgc2Vuc2l0aXZlIGluZm9ybWF0aW9uLiAgVGhpcyB2YWx1ZQorCQkJCWlzIG5vdCBwcm90ZWN0ZWQgaW4gdGhlIHNhbWUgbWFubmVyIGFzIFJBRElVUyBbUkFEVHVubmVsc10uCisKKwkJCQlBcyByZXF1aXJlZCBpbiBbQkFTRV0sIERpYW1ldGVyIG1lc3NhZ2VzIGFyZSBlbmNyeXB0ZWQgYnkgdXNpbmcgSVBzZWMKKwkJCQlvciBUTFMuICBUaGUgVHVubmVsLVBhc3N3b3JkIEFWUCBTSE9VTEQgTk9UIGJlIHVzZWQgaW4gdW50cnVzdGVkCisJCQkJcHJveHkgZW52aXJvbm1lbnRzIHdpdGhvdXQgZW5jcnlwdGluZyBpdCBieSB1c2luZyBlbmQtdG8tZW5kIHNlY3VyaXR5CisJCQkJdGVjaG5pcXVlcywgc3VjaCBhcyBDTVMgU2VjdXJpdHkgW0RpYW1DTVNdLgorICAgCQkJKi8KKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGFkYXRhID0geyAKKwkJCQkJNjksIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiVHVubmVsLVBhc3N3b3JkIiwgCQkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmFkYXRhICwgTlVMTCwgTlVMTCk7CisJCX0KKwkJCisJCS8qIFR1bm5lbC1Qcml2YXRlLUdyb3VwLUlkICovCisJCXsKKwkJCS8qCisJCQkJVGhlIFR1bm5lbC1Qcml2YXRlLUdyb3VwLUlkIEFWUCAoQVZQIENvZGUgODEpIGlzIG9mIHR5cGUgT2N0ZXRTdHJpbmcKKwkJCQlhbmQgY29udGFpbnMgdGhlIGdyb3VwIElkIGZvciBhIHBhcnRpY3VsYXIgdHVubmVsZWQgc2Vzc2lvbi4gIFRoZQorCQkJCVR1bm5lbC1Qcml2YXRlLUdyb3VwLUlkIEFWUCBNQVkgYmUgaW5jbHVkZWQgaW4gYW4gYXV0aG9yaXphdGlvbgorCQkJCXJlcXVlc3QgaWYgdGhlIHR1bm5lbCBpbml0aWF0b3IgY2FuIHByZWRldGVybWluZSB0aGUgZ3JvdXAgcmVzdWx0aW5nCisJCQkJZnJvbSBhIHBhcnRpY3VsYXIgY29ubmVjdGlvbi4gIEl0IFNIT1VMRCBiZSBpbmNsdWRlZCBpbiB0aGUKKwkJCQlhdXRob3JpemF0aW9uIHJlc3BvbnNlIGlmIHRoaXMgdHVubmVsIHNlc3Npb24gaXMgdG8gYmUgdHJlYXRlZCBhcworCQkJCWJlbG9uZ2luZyB0byBhIHBhcnRpY3VsYXIgcHJpdmF0ZSBncm91cC4gIFByaXZhdGUgZ3JvdXBzIG1heSBiZSB1c2VkCisJCQkJdG8gYXNzb2NpYXRlIGEgdHVubmVsZWQgc2Vzc2lvbiB3aXRoIGEgcGFydGljdWxhciBncm91cCBvZiB1c2Vycy4KKwkJCQlGb3IgZXhhbXBsZSwgaXQgTUFZIGJlIHVzZWQgdG8gZmFjaWxpdGF0ZSByb3V0aW5nIG9mIHVucmVnaXN0ZXJlZCBJUAorCQkJCWFkZHJlc3NlcyB0aHJvdWdoIGEgcGFydGljdWxhciBpbnRlcmZhY2UuICBUaGlzIEFWUCBTSE9VTEQgYmUKKwkJCQlpbmNsdWRlZCBpbiB0aGUgQWNjb3VudGluZy1SZXF1ZXN0IG1lc3NhZ2VzIHRoYXQgcGVydGFpbiB0byB0aGUKKwkJCQl0dW5uZWxlZCBzZXNzaW9uLgorICAgCQkJKi8KKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGFkYXRhID0geyAKKwkJCQkJODEsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiVHVubmVsLVByaXZhdGUtR3JvdXAtSWQiLCAJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZhZGF0YSAsIE5VTEwsIE5VTEwpOworCQl9CisJCQorCQkvKiBUdW5uZWwtQXNzaWdubWVudC1JZCAqLworCQl7CisJCQkvKgorCQkJCVRoZSBUdW5uZWwtQXNzaWdubWVudC1JZCBBVlAgKEFWUCBDb2RlIDgyKSBpcyBvZiB0eXBlIE9jdGV0U3RyaW5nIGFuZAorCQkJCWlzIHVzZWQgdG8gaW5kaWNhdGUgdG8gdGhlIHR1bm5lbCBpbml0aWF0b3IgdGhlIHBhcnRpY3VsYXIgdHVubmVsIHRvCisJCQkJd2hpY2ggYSBzZXNzaW9uIGlzIHRvIGJlIGFzc2lnbmVkLiAgU29tZSB0dW5uZWxpbmcgcHJvdG9jb2xzLCBzdWNoIGFzCisJCQkJW1BQVFBdIGFuZCBbTDJUUF0sIGFsbG93IGZvciBzZXNzaW9ucyBiZXR3ZWVuIHRoZSBzYW1lIHR3byB0dW5uZWwKKwkJCQllbmRwb2ludHMgdG8gYmUgbXVsdGlwbGV4ZWQgb3ZlciB0aGUgc2FtZSB0dW5uZWwgYW5kIGFsc28gZm9yIGEgZ2l2ZW4KKwkJCQlzZXNzaW9uIHRvIHVzZSBpdHMgb3duIGRlZGljYXRlZCB0dW5uZWwuICBUaGlzIGF0dHJpYnV0ZSBwcm92aWRlcyBhCisJCQkJbWVjaGFuaXNtIGZvciBEaWFtZXRlciB0byBpbmZvcm0gdGhlIHR1bm5lbCBpbml0aWF0b3IgKGUuZy4sIFBBQywKKwkJCQlMQUMpIHdoZXRoZXIgdG8gYXNzaWduIHRoZSBzZXNzaW9uIHRvIGEgbXVsdGlwbGV4ZWQgdHVubmVsIG9yIHRvIGEKKwkJCQlzZXBhcmF0ZSB0dW5uZWwuICBGdXJ0aGVybW9yZSwgaXQgYWxsb3dzIGZvciBzZXNzaW9ucyBzaGFyaW5nCisJCQkJbXVsdGlwbGV4ZWQgdHVubmVscyB0byBiZSBhc3NpZ25lZCB0byBkaWZmZXJlbnQgbXVsdGlwbGV4ZWQgdHVubmVscy4KKworCQkJCUEgcGFydGljdWxhciB0dW5uZWxpbmcgaW1wbGVtZW50YXRpb24gbWF5IGFzc2lnbiBkaWZmZXJpbmcKKwkJCQljaGFyYWN0ZXJpc3RpY3MgdG8gcGFydGljdWxhciB0dW5uZWxzLiAgRm9yIGV4YW1wbGUsIGRpZmZlcmVudAorCQkJCXR1bm5lbHMgbWF5IGJlIGFzc2lnbmVkIGRpZmZlcmVudCBRb1MgcGFyYW1ldGVycy4gIFN1Y2ggdHVubmVscyBtYXkKKwkJCQliZSB1c2VkIHRvIGNhcnJ5IGVpdGhlciBpbmRpdmlkdWFsIG9yIG11bHRpcGxlIHNlc3Npb25zLiAgVGhlCisJCQkJVHVubmVsLUFzc2lnbm1lbnQtSWQgYXR0cmlidXRlIHRodXMgYWxsb3dzIHRoZSBEaWFtZXRlciBzZXJ2ZXIgdG8KKwkJCQlpbmRpY2F0ZSB0aGF0IGEgcGFydGljdWxhciBzZXNzaW9uIGlzIHRvIGJlIGFzc2lnbmVkIHRvIGEgdHVubmVsCisJCQkJcHJvdmlkaW5nIGFuIGFwcHJvcHJpYXRlIGxldmVsIG9mIHNlcnZpY2UuICBJdCBpcyBleHBlY3RlZCB0aGF0IGFueQorCQkJCVFvUy1yZWxhdGVkIERpYW1ldGVyIHR1bm5lbGluZyBhdHRyaWJ1dGVzIGRlZmluZWQgaW4gdGhlIGZ1dHVyZQorCQkJCWFjY29tcGFueWluZyB0aGlzIG9uZSB3aWxsIGJlIGFzc29jaWF0ZWQgYnkgdGhlIHR1bm5lbCBpbml0aWF0b3Igd2l0aAorCQkJCXRoZSBJZCBnaXZlbiBieSB0aGlzIGF0dHJpYnV0ZS4gIEluIHRoZSBtZWFudGltZSwgYW55IHNlbWFudGljIGdpdmVuCisJCQkJdG8gYSBwYXJ0aWN1bGFyIElkIHN0cmluZyBpcyBhIG1hdHRlciBsZWZ0IHRvIGxvY2FsIGNvbmZpZ3VyYXRpb24gaW4KKwkJCQl0aGUgdHVubmVsIGluaXRpYXRvci4KKworCQkJCVRoZSBUdW5uZWwtQXNzaWdubWVudC1JZCBBVlAgaXMgb2Ygc2lnbmlmaWNhbmNlIG9ubHkgdG8gRGlhbWV0ZXIgYW5kCisJCQkJdGhlIHR1bm5lbCBpbml0aWF0b3IuICBUaGUgSWQgaXQgc3BlY2lmaWVzIGlzIG9ubHkgaW50ZW5kZWQgdG8gYmUgb2YKKwkJCQlsb2NhbCB1c2UgdG8gRGlhbWV0ZXIgYW5kIHRoZSB0dW5uZWwgaW5pdGlhdG9yLiAgVGhlIElkIGFzc2lnbmVkIGJ5CisJCQkJdGhlIHR1bm5lbCBpbml0aWF0b3IgaXMgbm90IGNvbnZleWVkIHRvIHRoZSB0dW5uZWwgcGVlci4KKworCQkJCVRoaXMgYXR0cmlidXRlIE1BWSBiZSBpbmNsdWRlZCBpbiBhdXRob3JpemF0aW9uIHJlc3BvbnNlcy4gIFRoZQorCQkJCXR1bm5lbCBpbml0aWF0b3IgcmVjZWl2aW5nIHRoaXMgYXR0cmlidXRlIE1BWSBjaG9vc2UgdG8gaWdub3JlIGl0IGFuZAorCQkJCXRvIGFzc2lnbiB0aGUgc2Vzc2lvbiB0byBhbiBhcmJpdHJhcnkgbXVsdGlwbGV4ZWQgb3Igbm9uLW11bHRpcGxleGVkCisJCQkJdHVubmVsIGJldHdlZW4gdGhlIGRlc2lyZWQgZW5kcG9pbnRzLiAgVGhpcyBBVlAgU0hPVUxEIGFsc28gYmUKKwkJCQlpbmNsdWRlZCBpbiB0aGUgQWNjb3VudGluZy1SZXF1ZXN0IG1lc3NhZ2VzIHBlcnRhaW5pbmcgdG8gdGhlCisJCQkJdHVubmVsZWQgc2Vzc2lvbi4KKworCQkJCUlmIGEgdHVubmVsIGluaXRpYXRvciBzdXBwb3J0cyB0aGUgVHVubmVsLUFzc2lnbm1lbnQtSWQgQVZQLCB0aGVuIGl0CisJCQkJc2hvdWxkIGFzc2lnbiBhIHNlc3Npb24gdG8gYSB0dW5uZWwgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXI6CisKKwkJCQktICBJZiB0aGlzIEFWUCBpcyBwcmVzZW50IGFuZCBhIHR1bm5lbCBleGlzdHMgYmV0d2VlbiB0aGUKKwkJCQkgc3BlY2lmaWVkIGVuZHBvaW50cyB3aXRoIHRoZSBzcGVjaWZpZWQgSWQsIHRoZW4gdGhlIHNlc3Npb24KKwkJCQkgc2hvdWxkIGJlIGFzc2lnbmVkIHRvIHRoYXQgdHVubmVsLgorCisJCQkJLSAgSWYgdGhpcyBBVlAgaXMgcHJlc2VudCBhbmQgbm8gdHVubmVsIGV4aXN0cyBiZXR3ZWVuIHRoZQorCQkJCSBzcGVjaWZpZWQgZW5kcG9pbnRzIHdpdGggdGhlIHNwZWNpZmllZCBJZCwgdGhlbiBhIG5ldyB0dW5uZWwKKwkJCQkgc2hvdWxkIGJlIGVzdGFibGlzaGVkIGZvciB0aGUgc2Vzc2lvbiBhbmQgdGhlIHNwZWNpZmllZCBJZAorCQkJCSBzaG91bGQgYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXcgdHVubmVsLgorCisJCQkJLSAgSWYgdGhpcyBBVlAgaXMgbm90IHByZXNlbnQsIHRoZW4gdGhlIHNlc3Npb24gaXMgYXNzaWduZWQgdG8gYW4KKwkJCQkgdW5uYW1lZCB0dW5uZWwuICBJZiBhbiB1bm5hbWVkIHR1bm5lbCBkb2VzIG5vdCB5ZXQgZXhpc3QKKwkJCQkgYmV0d2VlbiB0aGUgc3BlY2lmaWVkIGVuZHBvaW50cywgdGhlbiBpdCBpcyBlc3RhYmxpc2hlZCBhbmQKKwkJCQkgdXNlZCBmb3IgdGhpcyBzZXNzaW9uIGFuZCBmb3Igc3Vic2VxdWVudCBvbmVzIGVzdGFibGlzaGVkCisJCQkJIHdpdGhvdXQgdGhlIFR1bm5lbC1Bc3NpZ25tZW50LUlkIGF0dHJpYnV0ZS4gIEEgdHVubmVsIGluaXRpYXRvcgorCQkJCSBNVVNUIE5PVCBhc3NpZ24gYSBzZXNzaW9uIGZvciB3aGljaCBhIFR1bm5lbC1Bc3NpZ25tZW50LUlkIEFWUAorCQkJCSB3YXMgbm90IHNwZWNpZmllZCB0byBhIG5hbWVkIHR1bm5lbCAoaS5lLiwgb25lIHRoYXQgd2FzCisJCQkJIGluaXRpYXRlZCBieSBhIHNlc3Npb24gc3BlY2lmeWluZyB0aGlzIEFWUCkuCisKKwkJCQlOb3RlIHRoYXQgdGhlIHNhbWUgSWQgbWF5IGJlIHVzZWQgdG8gbmFtZSBkaWZmZXJlbnQgdHVubmVscyBpZiB0aGVzZQorCQkJCXR1bm5lbHMgYXJlIGJldHdlZW4gZGlmZmVyZW50IGVuZHBvaW50cy4KKworICAgCQkJKi8KKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGFkYXRhID0geyAKKwkJCQkJODIsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiVHVubmVsLUFzc2lnbm1lbnQtSWQiLCAJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZhZGF0YSAsIE5VTEwsIE5VTEwpOworCQl9CisJCQorCQkvKiBUdW5uZWwtUHJlZmVyZW5jZSAqLworCQl7CisJCQkvKgorCQkJCVRoZSBUdW5uZWwtUHJlZmVyZW5jZSBBVlAgKEFWUCBDb2RlIDgzKSBpcyBvZiB0eXBlIFVuc2lnbmVkMzIgYW5kIGlzCisJCQkJdXNlZCB0byBpZGVudGlmeSB0aGUgcmVsYXRpdmUgcHJlZmVyZW5jZSBhc3NpZ25lZCB0byBlYWNoIHR1bm5lbCB3aGVuCisJCQkJbW9yZSB0aGFuIG9uZSBzZXQgb2YgdHVubmVsaW5nIEFWUHMgaXMgcmV0dXJuZWQgd2l0aGluIHNlcGFyYXRlCisJCQkJR3JvdXBlZC1BVlAgQVZQcy4gIEl0IE1BWSBiZSB1c2VkIGluIGFuIGF1dGhvcml6YXRpb24gcmVxdWVzdCBhcyBhCisJCQkJaGludCB0byB0aGUgc2VydmVyIHRoYXQgYSBzcGVjaWZpYyBwcmVmZXJlbmNlIGlzIGRlc2lyZWQsIGJ1dCB0aGUKKwkJCQlzZXJ2ZXIgaXMgbm90IHJlcXVpcmVkIHRvIGhvbm9yIHRoZSBoaW50IGluIHRoZSBjb3JyZXNwb25kaW5nCisJCQkJcmVzcG9uc2UuCisKKwkJCQlGb3IgZXhhbXBsZSwgc3VwcG9zZSB0aGF0IEFWUHMgZGVzY3JpYmluZyB0d28gdHVubmVscyBhcmUgcmV0dXJuZWQgYnkKKwkJCQl0aGUgc2VydmVyLCBvbmUgd2l0aCBhIFR1bm5lbC1UeXBlIG9mIFBQVFAgYW5kIHRoZSBvdGhlciB3aXRoIGEKKwkJCQlUdW5uZWwtVHlwZSBvZiBMMlRQLiAgSWYgdGhlIHR1bm5lbCBpbml0aWF0b3Igc3VwcG9ydHMgb25seSBvbmUgb2YKKwkJCQl0aGUgVHVubmVsLVR5cGVzIHJldHVybmVkLCBpdCB3aWxsIGluaXRpYXRlIGEgdHVubmVsIG9mIHRoYXQgdHlwZS4KKwkJCQlJZiwgaG93ZXZlciwgaXQgc3VwcG9ydHMgYm90aCB0dW5uZWwgcHJvdG9jb2xzLCBpdCBTSE9VTEQgdXNlIHRoZQorCQkJCXZhbHVlIG9mIHRoZSBUdW5uZWwtUHJlZmVyZW5jZSBBVlAgdG8gZGVjaWRlIHdoaWNoIHR1bm5lbCBzaG91bGQgYmUKKwkJCQlzdGFydGVkLiAgVGhlIHR1bm5lbCB3aXRoIHRoZSBsb3dlc3QgbnVtZXJpY2FsIHZhbHVlIGluIHRoZSBWYWx1ZQorCQkJCWZpZWxkIG9mIHRoaXMgQVZQIFNIT1VMRCBiZSBnaXZlbiB0aGUgaGlnaGVzdCBwcmVmZXJlbmNlLiAgVGhlIHZhbHVlcworCQkJCWFzc2lnbmVkIHRvIHR3byBvciBtb3JlIGluc3RhbmNlcyBvZiB0aGUgVHVubmVsLVByZWZlcmVuY2UgQVZQIHdpdGhpbgorCQkJCWEgZ2l2ZW4gYXV0aG9yaXphdGlvbiByZXNwb25zZSBNQVkgYmUgaWRlbnRpY2FsLiAgSW4gdGhpcyBjYXNlLCB0aGUKKwkJCQl0dW5uZWwgaW5pdGlhdG9yIFNIT1VMRCB1c2UgbG9jYWxseSBjb25maWd1cmVkIG1ldHJpY3MgdG8gZGVjaWRlCisJCQkJd2hpY2ggc2V0IG9mIEFWUHMgdG8gdXNlLgorICAgCQkJKi8KKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGFkYXRhID0geyAKKwkJCQkJODMsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiVHVubmVsLVByZWZlcmVuY2UiLCAJCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCQkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9VTlNJR05FRDMyIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZhZGF0YSAsIE5VTEwsIE5VTEwpOworCQl9CisJCQorCQkvKiBUdW5uZWwtQ2xpZW50LUF1dGgtSWQgKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgVHVubmVsLUNsaWVudC1BdXRoLUlkIEFWUCAoQVZQIENvZGUgOTApIGlzIG9mIHR5cGUgVVRGOFN0cmluZyBhbmQKKwkJCQlzcGVjaWZpZXMgdGhlIG5hbWUgdXNlZCBieSB0aGUgdHVubmVsIGluaXRpYXRvciBkdXJpbmcgdGhlCisJCQkJYXV0aGVudGljYXRpb24gcGhhc2Ugb2YgdHVubmVsIGVzdGFibGlzaG1lbnQuICBJdCBNQVkgYmUgdXNlZCBpbiBhbgorCQkJCWF1dGhvcml6YXRpb24gcmVxdWVzdCBhcyBhIGhpbnQgdG8gdGhlIHNlcnZlciB0aGF0IGEgc3BlY2lmaWMKKwkJCQlwcmVmZXJlbmNlIGlzIGRlc2lyZWQsIGJ1dCB0aGUgc2VydmVyIGlzIG5vdCByZXF1aXJlZCB0byBob25vciB0aGUKKwkJCQloaW50IGluIHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlLiAgVGhpcyBBVlAgTVVTVCBiZSBwcmVzZW50IGluIHRoZQorCQkJCWF1dGhvcml6YXRpb24gcmVzcG9uc2UgaWYgYW4gYXV0aGVudGljYXRpb24gbmFtZSBvdGhlciB0aGFuIHRoZQorCQkJCWRlZmF1bHQgaXMgZGVzaXJlZC4gIFRoaXMgQVZQIFNIT1VMRCBiZSBpbmNsdWRlZCBpbiB0aGUgQWNjb3VudGluZy0KKwkJCQlSZXF1ZXN0IG1lc3NhZ2VzIHBlcnRhaW5pbmcgdG8gdGhlIHR1bm5lbGVkIHNlc3Npb24uCisgICAJCQkqLworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgYWRhdGEgPSB7IAorCQkJCQk5MCwgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJUdW5uZWwtQ2xpZW50LUF1dGgtSWQiLCAJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZhZGF0YSAsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX0KKwkJCisJCS8qIFR1bm5lbC1TZXJ2ZXItQXV0aC1JZCAqLworCQl7CisJCQkvKgorCQkJCVRoZSBUdW5uZWwtU2VydmVyLUF1dGgtSWQgQVZQIChBVlAgQ29kZSA5MSkgaXMgb2YgdHlwZSBVVEY4U3RyaW5nIGFuZAorCQkJCXNwZWNpZmllcyB0aGUgbmFtZSB1c2VkIGJ5IHRoZSB0dW5uZWwgdGVybWluYXRvciBkdXJpbmcgdGhlCisJCQkJYXV0aGVudGljYXRpb24gcGhhc2Ugb2YgdHVubmVsIGVzdGFibGlzaG1lbnQuICBJdCBNQVkgYmUgdXNlZCBpbiBhbgorCQkJCWF1dGhvcml6YXRpb24gcmVxdWVzdCBhcyBhIGhpbnQgdG8gdGhlIHNlcnZlciB0aGF0IGEgc3BlY2lmaWMKKwkJCQlwcmVmZXJlbmNlIGlzIGRlc2lyZWQsIGJ1dCB0aGUgc2VydmVyIGlzIG5vdCByZXF1aXJlZCB0byBob25vciB0aGUKKwkJCQloaW50IGluIHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlLiAgVGhpcyBBVlAgTVVTVCBiZSBwcmVzZW50IGluIHRoZQorCQkJCWF1dGhvcml6YXRpb24gcmVzcG9uc2UgaWYgYW4gYXV0aGVudGljYXRpb24gbmFtZSBvdGhlciB0aGFuIHRoZQorCQkJCWRlZmF1bHQgaXMgZGVzaXJlZC4gIFRoaXMgQVZQIFNIT1VMRCBiZSBpbmNsdWRlZCBpbiB0aGUgQWNjb3VudGluZy0KKwkJCQlSZXF1ZXN0IG1lc3NhZ2VzIHBlcnRhaW5pbmcgdG8gdGhlIHR1bm5lbGVkIHNlc3Npb24uCisgICAJCQkqLworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgYWRhdGEgPSB7IAorCQkJCQk5MSwgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJUdW5uZWwtU2VydmVyLUF1dGgtSWQiLCAJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZhZGF0YSAsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX0KKwkJCisJCS8qIFR1bm5lbGluZyAqLworCQl7CisJCQkvKgorCQkJCVRoZSBUdW5uZWxpbmcgQVZQIChBVlAgQ29kZSA0MDEpIGlzIG9mIHR5cGUgR3JvdXBlZCBhbmQgY29udGFpbnMgdGhlCisJCQkJZm9sbG93aW5nIEFWUHMsIHVzZWQgdG8gZGVzY3JpYmUgYSBjb21wdWxzb3J5IHR1bm5lbCBzZXJ2aWNlOgorCQkJCVtSQURUdW5uZWxzXSwgW1JBRFR1bmxBY2N0XS4gIEl0cyBkYXRhIGZpZWxkIGhhcyB0aGUgZm9sbG93aW5nIEFCTkYKKwkJCQlncmFtbWFyOgorCisJCQkJVHVubmVsaW5nICAgICA6Oj0gPCBBVlAgSGVhZGVyOiA0MDEgPgorICAgICAgICAgICAgICAgIAkJCQl7IFR1bm5lbC1UeXBlIH0KKyAgICAgICAgICAgICAgICAJCQkJeyBUdW5uZWwtTWVkaXVtLVR5cGUgfQorICAgICAgICAgICAgICAgIAkJCQl7IFR1bm5lbC1DbGllbnQtRW5kcG9pbnQgfQorICAgICAgICAgICAgICAgIAkJCQl7IFR1bm5lbC1TZXJ2ZXItRW5kcG9pbnQgfQorICAgICAgICAgICAgICAgIAkJCQlbIFR1bm5lbC1QcmVmZXJlbmNlIF0KKyAgICAgICAgICAgICAgICAJCQkJWyBUdW5uZWwtQ2xpZW50LUF1dGgtSWQgXQorICAgICAgICAgICAgICAgIAkJCQlbIFR1bm5lbC1TZXJ2ZXItQXV0aC1JZCBdCisgICAgICAgICAgICAgICAgCQkJCVsgVHVubmVsLUFzc2lnbm1lbnQtSWQgXQorICAgICAgICAgICAgICAgIAkJCQlbIFR1bm5lbC1QYXNzd29yZCBdCisgICAgICAgICAgICAgICAgCQkJCVsgVHVubmVsLVByaXZhdGUtR3JvdXAtSWQgXQorCQkJKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQkJCQk0MDEsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiVHVubmVsaW5nIiwgCQkJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX0dST1VQRUQgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPSAKKwkJCQkJCXsgCSB7ICAiVHVubmVsLVR5cGUiLCAJCQlSVUxFX1JFUVVJUkVELCAtMSwgMSB9CisJCQkJCQkJLHsgICJUdW5uZWwtTWVkaXVtLVR5cGUiLAkJUlVMRV9PUFRJT05BTCwgLTEsIDEgfQorCQkJCQkJCSx7ICAiVHVubmVsLUNsaWVudC1FbmRwb2ludCIsCQlSVUxFX09QVElPTkFMLCAtMSwgMSB9CisJCQkJCQkJLHsgICJUdW5uZWwtU2VydmVyLUVuZHBvaW50IiwJCVJVTEVfT1BUSU9OQUwsIC0xLCAxIH0KKwkJCQkJCQkseyAgIlR1bm5lbC1QcmVmZXJlbmNlIiwJCVJVTEVfT1BUSU9OQUwsIC0xLCAxIH0KKwkJCQkJCQkseyAgIlR1bm5lbC1DbGllbnQtQXV0aC1JZCIsCQlSVUxFX09QVElPTkFMLCAtMSwgMSB9CisJCQkJCQkJLHsgICJUdW5uZWwtU2VydmVyLUF1dGgtSWQiLAkJUlVMRV9PUFRJT05BTCwgLTEsIDEgfQorCQkJCQkJCSx7ICAiVHVubmVsLUFzc2lnbm1lbnQtSWQiLAkJUlVMRV9PUFRJT05BTCwgLTEsIDEgfQorCQkJCQkJCSx7ICAiVHVubmVsLVBhc3N3b3JkIiwJCQlSVUxFX09QVElPTkFMLCAtMSwgMSB9CisJCQkJCQkJLHsgICJUdW5uZWwtUHJpdmF0ZS1Hcm91cC1JZCIsCQlSVUxFX09QVElPTkFMLCAtMSwgMSB9CisJCQkJCQl9OworCQkJCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkJfQorCQkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIE5BUyBBY2NvdW50aW5nIEFWUHMgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCQkKKwkJLyogQWNjb3VudGluZy1JbnB1dC1PY3RldHMgKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgQWNjb3VudGluZy1JbnB1dC1PY3RldHMgQVZQIChBVlAgQ29kZSAzNjMpIGlzIG9mIHR5cGUgVW5zaWduZWQ2NAorCQkJCWFuZCBjb250YWlucyB0aGUgbnVtYmVyIG9mIG9jdGV0cyByZWNlaXZlZCBmcm9tIHRoZSB1c2VyLgorCQkJCQorCQkJCUZvciBOQVMgdXNhZ2UsIHRoaXMgQVZQIGluZGljYXRlcyBob3cgbWFueSBvY3RldHMgaGF2ZSBiZWVuIHJlY2VpdmVkCisJCQkJZnJvbSB0aGUgcG9ydCBpbiB0aGUgY291cnNlIG9mIHRoaXMgc2Vzc2lvbi4gIEl0IGNhbiBvbmx5IGJlIHByZXNlbnQKKwkJCQlpbiBBQ1IgbWVzc2FnZXMgd2l0aCBhbiBBY2NvdW50aW5nLVJlY29yZC1UeXBlIG9mIElOVEVSSU1fUkVDT1JEIG9yCisJCQkJU1RPUF9SRUNPUkQuCisJCQkqLworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTM2MywgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJBY2NvdW50aW5nLUlucHV0LU9jdGV0cyIsIAkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX1VOU0lHTkVENjQgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCBOVUxMKTsKKwkJfQorCQkKKwkJLyogQWNjb3VudGluZy1PdXRwdXQtT2N0ZXRzICovCisJCXsKKwkJCS8qCisJCQkJVGhlIEFjY291bnRpbmctT3V0cHV0LU9jdGV0cyBBVlAgKEFWUCBDb2RlIDM2NCkgaXMgb2YgdHlwZSBVbnNpZ25lZDY0CisJCQkJYW5kIGNvbnRhaW5zIHRoZSBudW1iZXIgb2Ygb2N0ZXRzIHNlbnQgdG8gdGhlIHVzZXIuCisKKwkJCQlGb3IgTkFTIHVzYWdlLCB0aGlzIEFWUCBpbmRpY2F0ZXMgaG93IG1hbnkgb2N0ZXRzIGhhdmUgYmVlbiBzZW50IHRvCisJCQkJdGhlIHBvcnQgaW4gdGhlIGNvdXJzZSBvZiB0aGlzIHNlc3Npb24uICBJdCBjYW4gb25seSBiZSBwcmVzZW50IGluCisJCQkJQUNSIG1lc3NhZ2VzIHdpdGggYW4gQWNjb3VudGluZy1SZWNvcmQtVHlwZSBvZiBJTlRFUklNX1JFQ09SRCBvcgorCQkJCVNUT1BfUkVDT1JELgorCQkJKi8KKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQkJCQkzNjQsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiQWNjb3VudGluZy1PdXRwdXQtT2N0ZXRzIiwgCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCSAJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfVU5TSUdORUQ2NCAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsIE5VTEwpOworCQl9CisJCQorCQkvKiBBY2NvdW50aW5nLUlucHV0LVBhY2tldHMgKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgQWNjb3VudGluZy1JbnB1dC1QYWNrZXRzIChBVlAgQ29kZSAzNjUpIGlzIG9mIHR5cGUgVW5zaWduZWQ2NCBhbmQKKwkJCQljb250YWlucyB0aGUgbnVtYmVyIG9mIHBhY2tldHMgcmVjZWl2ZWQgZnJvbSB0aGUgdXNlci4KKworCQkJCUZvciBOQVMgdXNhZ2UsIHRoaXMgQVZQIGluZGljYXRlcyBob3cgbWFueSBwYWNrZXRzIGhhdmUgYmVlbiByZWNlaXZlZAorCQkJCWZyb20gdGhlIHBvcnQgb3ZlciB0aGUgY291cnNlIG9mIGEgc2Vzc2lvbiBiZWluZyBwcm92aWRlZCB0byBhIEZyYW1lZAorCQkJCVVzZXIuICBJdCBjYW4gb25seSBiZSBwcmVzZW50IGluIEFDUiBtZXNzYWdlcyB3aXRoIGFuIEFjY291bnRpbmctCisJCQkJUmVjb3JkLVR5cGUgb2YgSU5URVJJTV9SRUNPUkQgb3IgU1RPUF9SRUNPUkQuCisJCQkqLworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTM2NSwgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJBY2NvdW50aW5nLUlucHV0LVBhY2tldHMiLCAJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9VTlNJR05FRDY0IAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgTlVMTCk7CisJCX0KKwkJCisJCS8qIEFjY291bnRpbmctT3V0cHV0LVBhY2tldHMgKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgQWNjb3VudGluZy1PdXRwdXQtUGFja2V0cyAoQVZQIENvZGUgMzY2KSBpcyBvZiB0eXBlIFVuc2lnbmVkNjQKKwkJCQlhbmQgY29udGFpbnMgdGhlIG51bWJlciBvZiBJUCBwYWNrZXRzIHNlbnQgdG8gdGhlIHVzZXIuCisKKwkJCQlGb3IgTkFTIHVzYWdlLCB0aGlzIEFWUCBpbmRpY2F0ZXMgaG93IG1hbnkgcGFja2V0cyBoYXZlIGJlZW4gc2VudCB0bworCQkJCXRoZSBwb3J0IG92ZXIgdGhlIGNvdXJzZSBvZiBhIHNlc3Npb24gYmVpbmcgcHJvdmlkZWQgdG8gYSBGcmFtZWQKKwkJCQlVc2VyLiAgSXQgY2FuIG9ubHkgYmUgcHJlc2VudCBpbiBBQ1IgbWVzc2FnZXMgd2l0aCBhbiBBY2NvdW50aW5nLQorCQkJCVJlY29yZC1UeXBlIG9mIElOVEVSSU1fUkVDT1JEIG9yIFNUT1BfUkVDT1JELgorCQkJKi8KKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQkJCQkzNjYsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiQWNjb3VudGluZy1PdXRwdXQtUGFja2V0cyIsIAkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX1VOU0lHTkVENjQgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCBOVUxMKTsKKwkJfQorCQkKKwkJLyogQWNjdC1TZXNzaW9uLVRpbWUgKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgQWNjdC1TZXNzaW9uLVRpbWUgQVZQIChBVlAgQ29kZSA0NikgaXMgb2YgdHlwZSBVbnNpZ25lZDMyIGFuZAorCQkJCWluZGljYXRlcyB0aGUgbGVuZ3RoIG9mIHRoZSBjdXJyZW50IHNlc3Npb24gaW4gc2Vjb25kcy4gIEl0IGNhbiBvbmx5CisJCQkJYmUgcHJlc2VudCBpbiBBQ1IgbWVzc2FnZXMgd2l0aCBhbiBBY2NvdW50aW5nLVJlY29yZC1UeXBlIG9mCisJCQkJSU5URVJJTV9SRUNPUkQgb3IgU1RPUF9SRUNPUkQuCisJCQkqLworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTQ2LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIkFjY3QtU2Vzc2lvbi1UaW1lIiwgCQkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCBOVUxMKTsKKwkJfQorCQkKKwkJLyogQWNjdC1BdXRoZW50aWMgKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgQWNjdC1BdXRoZW50aWMgQVZQIChBVlAgQ29kZSA0NSkgaXMgb2YgdHlwZSBFbnVtZXJhdGVkIGFuZAorCQkJCXNwZWNpZmllcyBob3cgdGhlIHVzZXIgd2FzIGF1dGhlbnRpY2F0ZWQuICBUaGUgc3VwcG9ydGVkIHZhbHVlcyBhcmUKKwkJCQlsaXN0ZWQgaW4gW1JBRElVU1R5cGVzXS4KKwkJCQlTdWItcmVnaXN0cnk6IFZhbHVlcyBmb3IgUkFESVVTIEF0dHJpYnV0ZSA0NSwgQWNjdC1BdXRoZW50aWMKKwkJCQlSZWZlcmVuY2U6IFtSRkMyODY2XQorCQkJKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAJKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgCSB0ZGF0YSA9IHsgQVZQX1RZUEVfVU5TSUdORUQzMiwJIkVudW1lcmF0ZWQoQWNjdC1BdXRoZW50aWMpIgksIE5VTEwsIE5VTEx9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIHR2YWxzW10gPSB7CisJCQkJZW51bXZhbF9kZWZfdTMyKCAxLCAiUkFESVVTIiksCisJCQkJZW51bXZhbF9kZWZfdTMyKCAyLCAiTG9jYWwiKSwKKwkJCQllbnVtdmFsX2RlZl91MzIoIDMsICJSZW1vdGUiKSwKKwkJCQllbnVtdmFsX2RlZl91MzIoIDQsICJEaWFtZXRlciIpCisJCQl9OworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTQ1LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIkFjY3QtQXV0aGVudGljIiwgCQkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCWludCBpOworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGVudW1lcmF0ZWQgdmFsdWVzLCBhbmQgdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhICwgTlVMTCwgJnR5cGUpOworCQkJZm9yIChpID0gMDsgaSA8IHNpemVvZih0dmFscykgLyBzaXplb2YodHZhbHNbMF0pOyBpKyspIHsKKwkJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdHZhbHNbaV0sIHR5cGUsIE5VTEwpOworCQkJfQorCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIHR5cGUsIE5VTEwpOworCQl9CisJCQorCQkvKiBBY2NvdW50aW5nLUF1dGgtTWV0aG9kICovCisJCXsKKwkJCS8qCisJCQkJVGhlIEFjY291bnRpbmctQXV0aC1NZXRob2QgQVZQIChBVlAgQ29kZSA0MDYpIGlzIG9mIHR5cGUgRW51bWVyYXRlZC4KKwkJCQlBIE5BUyBNQVkgaW5jbHVkZSB0aGlzIEFWUCBpbiBhbiBBY2NvdW50aW5nLVJlcXVlc3QgbWVzc2FnZSB0bworCQkJCWluZGljYXRlIHRoZSBtZXRob2QgdXNlZCB0byBhdXRoZW50aWNhdGUgdGhlIHVzZXIuICAoTm90ZSB0aGF0IHRoaXMKKwkJCQlpcyBlcXVpdmFsZW50IHRvIHRoZSBSQURJVVMgTVMtQWNjdC1BdXRoLVR5cGUgVlNBIGF0dHJpYnV0ZSkuCisKKwkJCQlUaGUgZm9sbG93aW5nIHZhbHVlcyBhcmUgZGVmaW5lZDoKKworCQkJCTEgIFBBUAorCQkJCTIgIENIQVAKKwkJCQkzICBNUy1DSEFQLTEKKwkJCQk0ICBNUy1DSEFQLTIKKwkJCQk1ICBFQVAKKwkJCQk3ICBOb25lCisJCQkqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0IAkqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAJIHRkYXRhID0geyBBVlBfVFlQRV9VTlNJR05FRDMyLAkiRW51bWVyYXRlZChBY2NvdW50aW5nLUF1dGgtTWV0aG9kKSIJLCBOVUxMLCBOVUxMfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSB0dmFsc1tdID0geworCQkJCWVudW12YWxfZGVmX3UzMiggMSwgIlBBUCIpLAorCQkJCWVudW12YWxfZGVmX3UzMiggMiwgIkNIQVAiKSwKKwkJCQllbnVtdmFsX2RlZl91MzIoIDMsICJNUy1DSEFQLTEiKSwKKwkJCQllbnVtdmFsX2RlZl91MzIoIDQsICJNUy1DSEFQLTIiKSwKKwkJCQllbnVtdmFsX2RlZl91MzIoIDUsICJFQVAiKSwKKwkJCQllbnVtdmFsX2RlZl91MzIoIDcsICJOb25lIikKKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJCQkJNDA2LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIkFjY291bnRpbmctQXV0aC1NZXRob2QiLCAJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9VTlNJR05FRDMyIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlpbnQgaTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBlbnVtZXJhdGVkIHZhbHVlcywgYW5kIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSAsIE5VTEwsICZ0eXBlKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBzaXplb2YodHZhbHMpIC8gc2l6ZW9mKHR2YWxzWzBdKTsgaSsrKSB7CisJCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnR2YWxzW2ldLCB0eXBlLCBOVUxMKTsKKwkJCX0KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCB0eXBlLCBOVUxMKTsKKwkJfQorCQkKKwkJLyogQWNjdC1EZWxheS1UaW1lICovCisJCXsKKwkJCS8qCisJCQkJVGhlIEFjY3QtRGVsYXktVGltZSBBVlAgKEFWUCBDb2RlIDQxKSBpcyBvZiB0eXBlIFVuc2lnbmVkMzIgYW5kCisJCQkJaW5kaWNhdGVzIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyB0aGUgRGlhbWV0ZXIgY2xpZW50IGhhcyBiZWVuIHRyeWluZworCQkJCXRvIHNlbmQgdGhlIEFjY291bnRpbmctUmVxdWVzdCAoQUNSKS4gIFRoZSBhY2NvdW50aW5nIHNlcnZlciBtYXkKKwkJCQlzdWJ0cmFjdCB0aGlzIHZhbHVlIGZyb20gdGhlIHRpbWUgd2hlbiB0aGUgQUNSIGFycml2ZXMgYXQgdGhlIHNlcnZlcgorCQkJCXRvIGNhbGN1bGF0ZSB0aGUgYXBwcm94aW1hdGUgdGltZSBvZiB0aGUgZXZlbnQgdGhhdCBjYXVzZWQgdGhlIEFDUiB0bworCQkJCWJlIGdlbmVyYXRlZC4KKworCQkJCVRoaXMgQVZQIGlzIG5vdCB1c2VkIGZvciByZXRyYW5zbWlzc2lvbnMgYXQgdGhlIHRyYW5zcG9ydCBsZXZlbCAoVENQCisJCQkJb3IgU0NUUCkuICBSYXRoZXIsIGl0IG1heSBiZSB1c2VkIHdoZW4gYW4gQUNSIGNvbW1hbmQgY2Fubm90IGJlCisJCQkJdHJhbnNtaXR0ZWQgYmVjYXVzZSB0aGVyZSBpcyBubyBhcHByb3ByaWF0ZSBwZWVyIHRvIHRyYW5zbWl0IGl0IHRvIG9yCisJCQkJd2FzIHJlamVjdGVkIGJlY2F1c2UgaXQgY291bGQgbm90IGJlIGRlbGl2ZXJlZC4gIEluIHRoZXNlIGNhc2VzLCB0aGUKKwkJCQljb21tYW5kIE1BWSBiZSBidWZmZXJlZCBhbmQgdHJhbnNtaXR0ZWQgbGF0ZXIsIHdoZW4gYW4gYXBwcm9wcmlhdGUKKwkJCQlwZWVyLWNvbm5lY3Rpb24gaXMgYXZhaWxhYmxlIG9yIGFmdGVyIHN1ZmZpY2llbnQgdGltZSBoYXMgcGFzc2VkIHRoYXQKKwkJCQl0aGUgZGVzdGluYXRpb24taG9zdCBtYXkgYmUgcmVhY2hhYmxlIGFuZCBvcGVyYXRpb25hbC4gIElmIHRoZSBBQ1IgaXMKKwkJCQlyZXNlbnQgaW4gdGhpcyB3YXksIHRoZSBBY2N0LURlbGF5LVRpbWUgQVZQIFNIT1VMRCBiZSBpbmNsdWRlZC4gIFRoZQorCQkJCXZhbHVlIG9mIHRoaXMgQVZQIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIHNlY29uZHMgdGhhdCBlbGFwc2VkCisJCQkJYmV0d2VlbiB0aGUgdGltZSBvZiB0aGUgZmlyc3QgYXR0ZW1wdCBhdCB0cmFuc21pc3Npb24gYW5kIHRoZSBjdXJyZW50CisJCQkJYXR0ZW1wdC4KKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJCQkJNDEsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiQWNjdC1EZWxheS1UaW1lIiwgCQkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCBOVUxMKTsKKwkJfQorCQkKKwkJLyogQWNjdC1MaW5rLUNvdW50ICovCisJCXsKKwkJCS8qCisJCQkJVGhlIEFjY3QtTGluay1Db3VudCBBVlAgKEFWUCBDb2RlIDUxKSBpcyBvZiB0eXBlIFVuc2lnbmVkMzIgYW5kCisJCQkJaW5kaWNhdGVzIHRoZSB0b3RhbCBudW1iZXIgb2YgbGlua3MgdGhhdCBoYXZlIGJlZW4gYWN0aXZlIChjdXJyZW50IG9yCisJCQkJY2xvc2VkKSBpbiBhIGdpdmVuIG11bHRpbGluayBzZXNzaW9uIGF0IHRoZSB0aW1lIHRoZSBhY2NvdW50aW5nCisJCQkJcmVjb3JkIGlzIGdlbmVyYXRlZC4gIFRoaXMgQVZQIE1BWSBiZSBpbmNsdWRlZCBpbiBBY2NvdW50aW5nLVJlcXVlc3RzCisJCQkJZm9yIGFueSBzZXNzaW9uIHRoYXQgbWF5IGJlIHBhcnQgb2YgYSBtdWx0aWxpbmsgc2VydmljZS4KKworCQkJCVRoZSBBY2N0LUxpbmstQ291bnQgQVZQIG1heSBiZSB1c2VkIHRvIG1ha2UgaXQgZWFzaWVyIGZvciBhbgorCQkJCWFjY291bnRpbmcgc2VydmVyIHRvIGtub3cgd2hlbiBpdCBoYXMgYWxsIHRoZSByZWNvcmRzIGZvciBhIGdpdmVuCisJCQkJbXVsdGlsaW5rIHNlcnZpY2UuICBXaGVuIHRoZSBudW1iZXIgb2YgQWNjb3VudGluZy1SZXF1ZXN0cyByZWNlaXZlZAorCQkJCXdpdGggQWNjb3VudGluZy1SZWNvcmQtVHlwZSA9IFNUT1BfUkVDT1JEIGFuZCB3aXRoIHRoZSBzYW1lIEFjY3QtCisJCQkJTXVsdGktU2Vzc2lvbi1JZCBhbmQgdW5pcXVlIFNlc3Npb24tSWRzIGVxdWFscyB0aGUgbGFyZ2VzdCB2YWx1ZSBvZgorCQkJCUFjY3QtTGluay1Db3VudCBzZWVuIGluIHRob3NlIEFjY291bnRpbmctUmVxdWVzdHMsIGFsbCBTVE9QX1JFQ09SRAorCQkJCUFjY291bnRpbmctUmVxdWVzdHMgZm9yIHRoYXQgbXVsdGlsaW5rIHNlcnZpY2UgaGF2ZSBiZWVuIHJlY2VpdmVkLgorCisJCQkJVGhlIGZvbGxvd2luZyBleGFtcGxlLCBzaG93aW5nIGVpZ2h0IEFjY291bnRpbmctUmVxdWVzdHMsIGlsbHVzdHJhdGVzCisJCQkJaG93IHRoZSBBY2N0LUxpbmstQ291bnQgQVZQIGlzIHVzZWQuICBJbiB0aGUgdGFibGUgYmVsb3csIG9ubHkgdGhlCisJCQkJcmVsZXZhbnQgQVZQcyBhcmUgc2hvd24sIGFsdGhvdWdoIGFkZGl0aW9uYWwgQVZQcyBjb250YWluaW5nCisJCQkJYWNjb3VudGluZyBpbmZvcm1hdGlvbiB3aWxsIGJlIHByZXNlbnQgaW4gdGhlIEFjY291bnRpbmctUmVxdWVzdHMuCisKKwkJCQlBY2N0LU11bHRpLSAgICAgICAgICAgICAgICAgICBBY2NvdW50aW5nLSAgICAgQWNjdC0KKwkJCQlTZXNzaW9uLUlkICAgICBTZXNzaW9uLUlkICAgICBSZWNvcmQtVHlwZSAgICAgTGluay1Db3VudAorCQkJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkJIi4uLjEwIiAgICAgICAgIi4uLjEwIiAgICAgIFNUQVJUX1JFQ09SRCAgICAgICAgMQorCQkJCSIuLi4xMCIgICAgICAgICIuLi4xMSIgICAgICBTVEFSVF9SRUNPUkQgICAgICAgIDIKKwkJCQkiLi4uMTAiICAgICAgICAiLi4uMTEiICAgICAgU1RPUF9SRUNPUkQgICAgICAgICAyCisJCQkJIi4uLjEwIiAgICAgICAgIi4uLjEyIiAgICAgIFNUQVJUX1JFQ09SRCAgICAgICAgMworCQkJCSIuLi4xMCIgICAgICAgICIuLi4xMyIgICAgICBTVEFSVF9SRUNPUkQgICAgICAgIDQKKwkJCQkiLi4uMTAiICAgICAgICAiLi4uMTIiICAgICAgU1RPUF9SRUNPUkQgICAgICAgICA0CisJCQkJIi4uLjEwIiAgICAgICAgIi4uLjEzIiAgICAgIFNUT1BfUkVDT1JEICAgICAgICAgNAorCQkJCSIuLi4xMCIgICAgICAgICIuLi4xMCIgICAgICBTVE9QX1JFQ09SRCAgICAgICAgIDQKKworCQkJKi8KKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQkJCQk1MSwgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJBY2N0LUxpbmstQ291bnQiLCAJCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCSAJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfVU5TSUdORUQzMiAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsIE5VTEwpOworCQl9CisJCQorCQkvKiBBY2N0LVR1bm5lbC1Db25uZWN0aW9uICovCisJCXsKKwkJCS8qCisJCQkJVGhlIEFjY3QtVHVubmVsLUNvbm5lY3Rpb24gQVZQIChBVlAgQ29kZSA2OCkgaXMgb2YgdHlwZSBPY3RldFN0cmluZworCQkJCWFuZCBjb250YWlucyB0aGUgaWRlbnRpZmllciBhc3NpZ25lZCB0byB0aGUgdHVubmVsIHNlc3Npb24uICBUaGlzCisJCQkJQVZQLCBhbG9uZyB3aXRoIHRoZSBUdW5uZWwtQ2xpZW50LUVuZHBvaW50IGFuZCBUdW5uZWwtU2VydmVyLUVuZHBvaW50CisJCQkJQVZQcywgbWF5IGJlIHVzZWQgdG8gcHJvdmlkZSBhIG1lYW5zIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGEgdHVubmVsCisJCQkJc2Vzc2lvbiBmb3IgYXVkaXRpbmcgcHVycG9zZXMuCisKKwkJCQlUaGUgZm9ybWF0IG9mIHRoZSBpZGVudGlmaWVyIGluIHRoaXMgQVZQIGRlcGVuZHMgdXBvbiB0aGUgdmFsdWUgb2YKKwkJCQl0aGUgVHVubmVsLVR5cGUgQVZQLiAgRm9yIGV4YW1wbGUsIHRvIGlkZW50aWZ5IGFuIEwyVFAgdHVubmVsCisJCQkJY29ubmVjdGlvbiBmdWxseSwgdGhlIEwyVFAgVHVubmVsIElkIGFuZCBDYWxsIElkIG1pZ2h0IGJlIGVuY29kZWQgaW4KKwkJCQl0aGlzIGZpZWxkLiAgVGhlIGV4YWN0IGVuY29kaW5nIG9mIHRoaXMgZmllbGQgaXMgaW1wbGVtZW50YXRpb24KKwkJCQlkZXBlbmRlbnQuCisJCQkqLworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTY4LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIkFjY3QtVHVubmVsLUNvbm5lY3Rpb24iLCAJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORyAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsIE5VTEwpOworCQl9CisJCQorCQkvKiBBY2N0LVR1bm5lbC1QYWNrZXRzLUxvc3QgKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgQWNjdC1UdW5uZWwtUGFja2V0cy1Mb3N0IEFWUCAoQVZQIENvZGUgODYpIGlzIG9mIHR5cGUgVW5zaWduZWQzMgorCQkJCWFuZCBjb250YWlucyB0aGUgbnVtYmVyIG9mIHBhY2tldHMgbG9zdCBvbiBhIGdpdmVuIGxpbmsuCisJCQkqLworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTg2LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIkFjY3QtVHVubmVsLVBhY2tldHMtTG9zdCIsIAkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCBOVUxMKTsKKwkJfQorCQkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvbXBhdGliaWxpdHkgd2l0aCBSQURJVVMgQVZQcyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJCS8qIE5BUy1JZGVudGlmaWVyICovCisJCXsKKwkJCS8qCisJCQkJVGhlIE5BUy1JZGVudGlmaWVyIEFWUCAoQVZQIENvZGUgMzIpIFtSQURJVVNdIGlzIG9mIHR5cGUgVVRGOFN0cmluZworCQkJCWFuZCBjb250YWlucyB0aGUgaWRlbnRpdHkgb2YgdGhlIE5BUyBwcm92aWRpbmcgc2VydmljZSB0byB0aGUgdXNlci4KKwkJCQlUaGlzIEFWUCBTSE9VTEQgb25seSBiZSBhZGRlZCBieSBhIFJBRElVUy9EaWFtZXRlciBUcmFuc2xhdGlvbiBBZ2VudC4KKwkJCQlXaGVuIHRoaXMgQVZQIGlzIHByZXNlbnQsIHRoZSBPcmlnaW4tSG9zdCBBVlAgaWRlbnRpZmllcyB0aGUgTkFTCisJCQkJcHJvdmlkaW5nIHNlcnZpY2UgdG8gdGhlIHVzZXIuCisKKwkJCQlJbiBSQURJVVMgaXQgd291bGQgYmUgcG9zc2libGUgZm9yIGEgcm9ndWUgTkFTIHRvIGZvcmdlIHRoZSBOQVMtCisJCQkJSWRlbnRpZmllciBhdHRyaWJ1dGUuICBEaWFtZXRlci9SQURJVVMgdHJhbnNsYXRpb24gYWdlbnRzIFNIT1VMRAorCQkJCWF0dGVtcHQgdG8gY2hlY2sgYSByZWNlaXZlZCBOQVMtSWRlbnRpZmllciBhdHRyaWJ1dGUgYWdhaW5zdCB0aGUKKwkJCQlzb3VyY2UgYWRkcmVzcyBvZiB0aGUgUkFESVVTIHBhY2tldCwgYnkgZG9pbmcgYW4gQS9BQUFBIFJSIHF1ZXJ5LiAgSWYKKwkJCQl0aGUgTkFTLUlkZW50aWZpZXIgYXR0cmlidXRlIGNvbnRhaW5zIGFuIEZRRE4sIHRoZW4gc3VjaCBhIHF1ZXJ5CisJCQkJd291bGQgcmVzb2x2ZSB0byBhbiBJUCBhZGRyZXNzIG1hdGNoaW5nIHRoZSBzb3VyY2UgYWRkcmVzcy4gIEhvd2V2ZXIsCisJCQkJdGhlIE5BUy1JZGVudGlmaWVyIGF0dHJpYnV0ZSBpcyBub3QgcmVxdWlyZWQgdG8gY29udGFpbiBhbiBGUUROLCBzbworCQkJCXN1Y2ggYSBxdWVyeSBjb3VsZCBmYWlsLiAgSWYgaXQgZmFpbHMsIGFuIGVycm9yIHNob3VsZCBiZSBsb2dnZWQsIGJ1dAorCQkJCW5vIGFjdGlvbiBzaG91bGQgYmUgdGFrZW4sIG90aGVyIHRoYW4gYSByZXZlcnNlIGxvb2t1cCBvbiB0aGUgc291cmNlCisJCQkJYWRkcmVzcyBhbmQgaW5zZXJ0IHRoZSByZXN1bHRpbmcgRlFETiBpbnRvIHRoZSBSb3V0ZS1SZWNvcmQgQVZQLgorCisJCQkJRGlhbWV0ZXIgYWdlbnRzIGFuZCBzZXJ2ZXJzIFNIT1VMRCBjaGVjayB3aGV0aGVyIGEgTkFTLUlkZW50aWZpZXIgQVZQCisJCQkJY29ycmVzcG9uZHMgdG8gYW4gZW50cnkgaW4gdGhlIFJvdXRlLVJlY29yZCBBVlAuICBJZiBubyBtYXRjaCBpcworCQkJCWZvdW5kLCB0aGVuIGFuIGVycm9yIGlzIGxvZ2dlZCwgYnV0IG5vIG90aGVyIGFjdGlvbiBpcyB0YWtlbi4KKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJCQkJMzIsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiTkFTLUlkZW50aWZpZXIiLCAJCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCSAJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9CisJCQorCQkvKiBOQVMtSVAtQWRkcmVzcyAqLworCQl7CisJCQkvKgorCQkJCVRoZSBOQVMtSVAtQWRkcmVzcyBBVlAgKEFWUCBDb2RlIDQpIFtSQURJVVNdIGlzIG9mIHR5cGUgT2N0ZXRTdHJpbmcKKwkJCQlhbmQgY29udGFpbnMgdGhlIElQIEFkZHJlc3Mgb2YgdGhlIE5BUyBwcm92aWRpbmcgc2VydmljZSB0byB0aGUgdXNlci4KKwkJCQlUaGlzIEFWUCBTSE9VTEQgb25seSBiZSBhZGRlZCBieSBhIFJBRElVUy9EaWFtZXRlciBUcmFuc2xhdGlvbiBBZ2VudC4KKwkJCQlXaGVuIHRoaXMgQVZQIGlzIHByZXNlbnQsIHRoZSBPcmlnaW4tSG9zdCBBVlAgaWRlbnRpZmllcyB0aGUgTkFTCisJCQkJcHJvdmlkaW5nIHNlcnZpY2UgdG8gdGhlIHVzZXIuCisKKwkJCQlJbiBSQURJVVMgaXQgd291bGQgYmUgcG9zc2libGUgZm9yIGEgcm9ndWUgTkFTIHRvIGZvcmdlIHRoZSBOQVMtSVAtCisJCQkJQWRkcmVzcyBhdHRyaWJ1dGUgdmFsdWUuICBEaWFtZXRlci9SQURJVVMgdHJhbnNsYXRpb24gYWdlbnRzIE1VU1QKKwkJCQljaGVjayBhIHJlY2VpdmVkIE5BUy1JUC1BZGRyZXNzIG9yIE5BUy1JUHY2LUFkZHJlc3MgYXR0cmlidXRlIGFnYWluc3QKKwkJCQl0aGUgc291cmNlIGFkZHJlc3Mgb2YgdGhlIFJBRElVUyBwYWNrZXQuICBJZiB0aGV5IGRvIG5vdCBtYXRjaCBhbmQKKwkJCQl0aGUgRGlhbWV0ZXIvUkFESVVTIHRyYW5zbGF0aW9uIGFnZW50IGRvZXMgbm90IGtub3cgd2hldGhlciB0aGUKKwkJCQlwYWNrZXQgd2FzIHNlbnQgYnkgYSBSQURJVVMgcHJveHkgb3IgTkFTIChlLmcuLCBubyBQcm94eS1TdGF0ZQorCQkJCWF0dHJpYnV0ZSksIHRoZW4gYnkgZGVmYXVsdCBpdCBpcyBhc3N1bWVkIHRoYXQgdGhlIHNvdXJjZSBhZGRyZXNzCisJCQkJY29ycmVzcG9uZHMgdG8gYSBSQURJVVMgcHJveHksIGFuZCB0aGF0IHRoZSBOQVMgQWRkcmVzcyBpcyBiZWhpbmQKKwkJCQl0aGF0IHByb3h5LCBwb3RlbnRpYWxseSB3aXRoIHNvbWUgYWRkaXRpb25hbCBSQURJVVMgcHJveGllcyBpbgorCQkJCWJldHdlZW4uICBUaGUgRGlhbWV0ZXIvUkFESVVTIHRyYW5zbGF0aW9uIGFnZW50IE1VU1QgaW5zZXJ0IGVudHJpZXMKKwkJCQlpbiB0aGUgUm91dGUtUmVjb3JkIEFWUCBjb3JyZXNwb25kaW5nIHRvIHRoZSBhcHBhcmVudCByb3V0ZS4gIFRoaXMKKwkJCQlpbXBsaWVzIGRvaW5nIGEgcmV2ZXJzZSBsb29rdXAgb24gdGhlIHNvdXJjZSBhZGRyZXNzIGFuZCBOQVMtSVAtCisJCQkJQWRkcmVzcyBvciBOQVMtSVB2Ni1BZGRyZXNzIGF0dHJpYnV0ZXMgdG8gZGV0ZXJtaW5lIHRoZSBjb3JyZXNwb25kaW5nCisJCQkJRlFETnMuCisKKwkJCQlJZiB0aGUgc291cmNlIGFkZHJlc3MgYW5kIHRoZSBOQVMtSVAtQWRkcmVzcyBvciBOQVMtSVB2Ni1BZGRyZXNzIGRvCisJCQkJbm90IG1hdGNoLCBhbmQgdGhlIERpYW1ldGVyL1JBRElVUyB0cmFuc2xhdGlvbiBhZ2VudCBrbm93cyB0aGF0IGl0IGlzCisJCQkJdGFsa2luZyBkaXJlY3RseSB0byB0aGUgTkFTIChlLmcuLCB0aGVyZSBhcmUgbm8gUkFESVVTIHByb3hpZXMKKwkJCQliZXR3ZWVuIGl0IGFuZCB0aGUgTkFTKSwgdGhlbiB0aGUgZXJyb3Igc2hvdWxkIGJlIGxvZ2dlZCwgYW5kIHRoZQorCQkJCXBhY2tldCBNVVNUIGJlIGRpc2NhcmRlZC4KKworCQkJCURpYW1ldGVyIGFnZW50cyBhbmQgc2VydmVycyBNVVNUIGNoZWNrIHdoZXRoZXIgdGhlIE5BUy1JUC1BZGRyZXNzIEFWUAorCQkJCWNvcnJlc3BvbmRzIHRvIGFuIGVudHJ5IGluIHRoZSBSb3V0ZS1SZWNvcmQgQVZQLiAgVGhpcyBpcyBkb25lIGJ5CisJCQkJZG9pbmcgYSByZXZlcnNlIGxvb2t1cCAoUFRSIFJSKSBmb3IgdGhlIE5BUy1JUC1BZGRyZXNzIHRvIHJldHJpZXZlCisJCQkJdGhlIGNvcnJlc3BvbmRpbmcgRlFETiwgYW5kIGJ5IGNoZWNraW5nIGZvciBhIG1hdGNoIHdpdGggdGhlIFJvdXRlLQorCQkJCVJlY29yZCBBVlAuICBJZiBubyBtYXRjaCBpcyBmb3VuZCwgdGhlbiBhbiBlcnJvciBpcyBsb2dnZWQsIGJ1dCBubworCQkJCW90aGVyIGFjdGlvbiBpcyB0YWtlbi4KKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJCQkJNCwgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJOQVMtSVAtQWRkcmVzcyIsIAkJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORyAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsIE5VTEwpOworCQl9CisJCQorCQkvKiBOQVMtSVB2Ni1BZGRyZXNzICovCisJCXsKKwkJCS8qCisJCQkJVGhlIE5BUy1JUHY2LUFkZHJlc3MgQVZQIChBVlAgQ29kZSA5NSkgW1JBRElVU0lQdjZdIGlzIG9mIHR5cGUKKwkJCQlPY3RldFN0cmluZyBhbmQgY29udGFpbnMgdGhlIElQdjYgQWRkcmVzcyBvZiB0aGUgTkFTIHByb3ZpZGluZworCQkJCXNlcnZpY2UgdG8gdGhlIHVzZXIuICBUaGlzIEFWUCBTSE9VTEQgb25seSBiZSBhZGRlZCBieSBhCisJCQkJUkFESVVTL0RpYW1ldGVyIFRyYW5zbGF0aW9uIEFnZW50LiAgV2hlbiB0aGlzIEFWUCBpcyBwcmVzZW50LCB0aGUKKwkJCQlPcmlnaW4tSG9zdCBBVlAgaWRlbnRpZmllcyB0aGUgTkFTIHByb3ZpZGluZyBzZXJ2aWNlIHRvIHRoZSB1c2VyLgorCisJCQkJSW4gUkFESVVTIGl0IHdvdWxkIGJlIHBvc3NpYmxlIGZvciBhIHJvZ3VlIE5BUyB0byBmb3JnZSB0aGUgTkFTLQorCQkJCUlQdjYtQWRkcmVzcyBhdHRyaWJ1dGUuICBEaWFtZXRlci9SQURJVVMgdHJhbnNsYXRpb24gYWdlbnRzIE1VU1QKKwkJCQljaGVjayBhIHJlY2VpdmVkIE5BUy1JUHY2LUFkZHJlc3MgYXR0cmlidXRlIGFnYWluc3QgdGhlIHNvdXJjZQorCQkJCWFkZHJlc3Mgb2YgdGhlIFJBRElVUyBwYWNrZXQuICBJZiB0aGV5IGRvIG5vdCBtYXRjaCBhbmQgdGhlCisJCQkJRGlhbWV0ZXIvUkFESVVTIHRyYW5zbGF0aW9uIGFnZW50IGRvZXMgbm90IGtub3cgd2hldGhlciB0aGUgcGFja2V0CisJCQkJd2FzIHNlbnQgYnkgYSBSQURJVVMgcHJveHkgb3IgTkFTIChlLmcuLCBubyBQcm94eS1TdGF0ZSBhdHRyaWJ1dGUpLAorCQkJCXRoZW4gYnkgZGVmYXVsdCBpdCBpcyBhc3N1bWVkIHRoYXQgdGhlIHNvdXJjZSBhZGRyZXNzIGNvcnJlc3BvbmRzIHRvCisJCQkJYSBSQURJVVMgcHJveHksIGFuZCB0aGF0IHRoZSBOQVMtSVB2Ni1BZGRyZXNzIGlzIGJlaGluZCB0aGF0IHByb3h5LAorCQkJCXBvdGVudGlhbGx5IHdpdGggc29tZSBhZGRpdGlvbmFsIFJBRElVUyBwcm94aWVzIGluIGJldHdlZW4uICBUaGUKKwkJCQlEaWFtZXRlci9SQURJVVMgdHJhbnNsYXRpb24gYWdlbnQgTVVTVCBpbnNlcnQgZW50cmllcyBpbiB0aGUgUm91dGUtCisJCQkJUmVjb3JkIEFWUCBjb3JyZXNwb25kaW5nIHRvIHRoZSBhcHBhcmVudCByb3V0ZS4gIFRoaXMgaW1wbGllcyBkb2luZyBhCisJCQkJcmV2ZXJzZSBsb29rdXAgb24gdGhlIHNvdXJjZSBhZGRyZXNzIGFuZCBOQVMtSVB2Ni1BZGRyZXNzIGF0dHJpYnV0ZXMKKwkJCQl0byBkZXRlcm1pbmUgdGhlIGNvcnJlc3BvbmRpbmcgRlFETnMuCisKKwkJCQlJZiB0aGUgc291cmNlIGFkZHJlc3MgYW5kIHRoZSBOQVMtSVB2Ni1BZGRyZXNzIGRvIG5vdCBtYXRjaCwgYW5kIHRoZQorCQkJCURpYW1ldGVyL1JBRElVUyB0cmFuc2xhdGlvbiBhZ2VudCBrbm93cyB0aGF0IGl0IGlzIHRhbGtpbmcgZGlyZWN0bHkKKwkJCQl0byB0aGUgTkFTIChlLmcuLCB0aGVyZSBhcmUgbm8gUkFESVVTIHByb3hpZXMgYmV0d2VlbiBpdCBhbmQgdGhlCisJCQkJTkFTKSwgdGhlbiB0aGUgZXJyb3Igc2hvdWxkIGJlIGxvZ2dlZCwgYW5kIHRoZSBwYWNrZXQgTVVTVCBiZQorCQkJCWRpc2NhcmRlZC4KKworCQkJCURpYW1ldGVyIGFnZW50cyBhbmQgc2VydmVycyBNVVNUIGNoZWNrIHdoZXRoZXIgdGhlIE5BUy1JUHY2LUFkZHJlc3MKKwkJCQlBVlAgY29ycmVzcG9uZHMgdG8gYW4gZW50cnkgaW4gdGhlIFJvdXRlLVJlY29yZCBBVlAuICBUaGlzIGlzIGRvbmUgYnkKKwkJCQlkb2luZyBhIHJldmVyc2UgbG9va3VwIChQVFIgUlIpIGZvciB0aGUgTkFTLUlQdjYtQWRkcmVzcyB0byByZXRyaWV2ZQorCQkJCXRoZSBjb3JyZXNwb25kaW5nIEZRRE4sIGFuZCBieSBjaGVja2luZyBmb3IgYSBtYXRjaCB3aXRoIHRoZSBSZWNvcmQtCisJCQkJUm91dGUgQVZQLiAgSWYgbm8gbWF0Y2ggaXMgZm91bmQsIHRoZW4gYW4gZXJyb3IgaXMgbG9nZ2VkLCBidXQgbm8KKwkJCQlvdGhlciBhY3Rpb24gaXMgdGFrZW4uCisJCQkqLworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTk1LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIk5BUy1JUHY2LUFkZHJlc3MiLCAJCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCSAJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCBOVUxMKTsKKwkJfQorCQkKKwkJLyogU3RhdGUgKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgU3RhdGUgQVZQIChBVlAgQ29kZSAyNCkgW1JBRElVU10gaXMgb2YgdHlwZSBPY3RldFN0cmluZyBhbmQgaGFzCisJCQkJdHdvIHVzZXMgaW4gdGhlIERpYW1ldGVyIE5BUyBhcHBsaWNhdGlvbi4KKworCQkJCVRoZSBTdGF0ZSBBVlAgTUFZIGJlIHNlbnQgYnkgYSBEaWFtZXRlciBTZXJ2ZXIgdG8gYSBOQVMgaW4gYW4gQUEtCisJCQkJUmVzcG9uc2UgY29tbWFuZCB0aGF0IGNvbnRhaW5zIGEgUmVzdWx0LUNvZGUgb2YKKwkJCQlESUFNRVRFUl9NVUxUSV9ST1VORF9BVVRILiAgSWYgc28sIHRoZSBOQVMgTVVTVCByZXR1cm4gaXQgdW5tb2RpZmllZAorCQkJCWluIHRoZSBzdWJzZXF1ZW50IEFBLVJlcXVlc3QgY29tbWFuZC4KKworCQkJCVRoZSBTdGF0ZSBBVlAgTUFZIGFsc28gYmUgc2VudCBieSBhIERpYW1ldGVyIFNlcnZlciB0byBhIE5BUyBpbiBhbgorCQkJCUFBLVJlc3BvbnNlIGNvbW1hbmQgdGhhdCBhbHNvIGluY2x1ZGVzIGEgVGVybWluYXRpb24tQWN0aW9uIEFWUCB3aXRoCisJCQkJdGhlIHZhbHVlIG9mIEFBLVJFUVVFU1QuICBJZiB0aGUgTkFTIHBlcmZvcm1zIHRoZSBUZXJtaW5hdGlvbi1BY3Rpb24KKwkJCQlieSBzZW5kaW5nIGEgbmV3IEFBLVJlcXVlc3QgY29tbWFuZCB1cG9uIHRlcm1pbmF0aW9uIG9mIHRoZSBjdXJyZW50CisJCQkJc2VydmljZSwgaXQgTVVTVCByZXR1cm4gdGhlIFN0YXRlIEFWUCB1bm1vZGlmaWVkIGluIHRoZSBuZXcgcmVxdWVzdAorCQkJCWNvbW1hbmQuCisKKwkJCQlJbiBlaXRoZXIgdXNhZ2UsIHRoZSBOQVMgTVVTVCBOT1QgaW50ZXJwcmV0IHRoZSBBVlAgbG9jYWxseS4gIFVzYWdlCisJCQkJb2YgdGhlIFN0YXRlIEFWUCBpcyBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQuCisJCQkqLworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTI0LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIlN0YXRlIiwgCQkJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORyAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsIE5VTEwpOworCQl9CisJCQorCQkvKiBUZXJtaW5hdGlvbi1DYXVzZSBtYXBwaW5nICovCisJCXsKKwkJCQorCQkJc3RydWN0IGRpY3Rfb2JqZWN0IAkqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSB0dmFsc1tdID0geworCQkJCWVudW12YWxfZGVmX3UzMigxMSwgIltSQURJVVNdIFVzZXIgUmVxdWVzdCIpLAorCQkJCWVudW12YWxfZGVmX3UzMigxMiwgIltSQURJVVNdIExvc3QgQ2FycmllciIpLAorCQkJCWVudW12YWxfZGVmX3UzMigxMywgIltSQURJVVNdIExvc3QgU2VydmljZSIpLAorCQkJCWVudW12YWxfZGVmX3UzMigxNCwgIltSQURJVVNdIElkbGUgVGltZW91dCIpLAorCQkJCWVudW12YWxfZGVmX3UzMigxNSwgIltSQURJVVNdIFNlc3Npb24gVGltZW91dCIpLAorCQkJCWVudW12YWxfZGVmX3UzMigxNiwgIltSQURJVVNdIEFkbWluIFJlc2V0IiksCisJCQkJZW51bXZhbF9kZWZfdTMyKDE3LCAiW1JBRElVU10gQWRtaW4gUmVib290IiksCisJCQkJZW51bXZhbF9kZWZfdTMyKDE4LCAiW1JBRElVU10gUG9ydCBFcnJvciIpLAorCQkJCWVudW12YWxfZGVmX3UzMigxOSwgIltSQURJVVNdIE5BUyBFcnJvciIpLAorCQkJCWVudW12YWxfZGVmX3UzMigyMCwgIltSQURJVVNdIE5BUyBSZXF1ZXN0IiksCisJCQkJZW51bXZhbF9kZWZfdTMyKDIxLCAiW1JBRElVU10gTkFTIFJlYm9vdCIpLAorCQkJCWVudW12YWxfZGVmX3UzMigyMiwgIltSQURJVVNdIFBvcnQgVW5uZWVkZWQiKSwKKwkJCQllbnVtdmFsX2RlZl91MzIoMjMsICJbUkFESVVTXSBQb3J0IFByZWVtcHRlZCIpLAorCQkJCWVudW12YWxfZGVmX3UzMigyNCwgIltSQURJVVNdIFBvcnQgU3VzcGVuZGVkIiksCisJCQkJZW51bXZhbF9kZWZfdTMyKDI1LCAiW1JBRElVU10gU2VydmljZSBVbmF2YWlsYWJsZSIpLAorCQkJCWVudW12YWxfZGVmX3UzMigyNiwgIltSQURJVVNdIENhbGxiYWNrIiksCisJCQkJZW51bXZhbF9kZWZfdTMyKDI3LCAiW1JBRElVU10gVXNlciBFcnJvciIpLAorCQkJCWVudW12YWxfZGVmX3UzMigyOCwgIltSQURJVVNdIEhvc3QgUmVxdWVzdCIpLAorCQkJCWVudW12YWxfZGVmX3UzMigyOSwgIltSQURJVVNdIFN1cHBsaWNhbnQgUmVzdGFydCIpLAorCQkJCWVudW12YWxfZGVmX3UzMigzMCwgIltSQURJVVNdIFJlYXV0aGVudGljYXRpb24gRmFpbHVyZSIpLAorCQkJCWVudW12YWxfZGVmX3UzMigzMSwgIltSQURJVVNdIFBvcnQgUmVpbml0IiksCisJCQkJZW51bXZhbF9kZWZfdTMyKDMyLCAiW1JBRElVU10gUG9ydCBEaXNhYmxlZCIpCisJCQkJfTsKKwkJCWludCBpOworCisJCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJFbnVtZXJhdGVkKFRlcm1pbmF0aW9uLUNhdXNlKSIsICZ0eXBlKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBzaXplb2YodHZhbHMpIC8gc2l6ZW9mKHR2YWxzWzBdKTsgaSsrKSB7CisJCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnR2YWxzW2ldLCB0eXBlLCBOVUxMKTsKKwkJCX0KKwkJCQorCQl9CisJCQorCQkvKiBPcmlnaW4tQUFBLVByb3RvY29sICovCisJCXsKKwkJCS8qCisJCQkJVGhlIE9yaWdpbi1BQUEtUHJvdG9jb2wgQVZQIChBVlAgQ29kZSA0MDgpIGlzIG9mIHRoZSB0eXBlIEVudW1lcmF0ZWQKKwkJCQlhbmQgc2hvdWxkIGJlIGluc2VydGVkIGluIGEgRGlhbWV0ZXIgbWVzc2FnZSB0cmFuc2xhdGVkIGJ5IGEgZ2F0ZXdheQorCQkJCXN5c3RlbSBmcm9tIGFub3RoZXIgQUFBIHByb3RvY29sLCBzdWNoIGFzIFJBRElVUy4gIEl0IGlkZW50aWZpZXMgdGhlCisJCQkJc291cmNlIHByb3RvY29sIG9mIHRoZSBtZXNzYWdlIHRvIHRoZSBEaWFtZXRlciBzeXN0ZW0gcmVjZWl2aW5nIHRoZQorCQkJCW1lc3NhZ2UuCisKKwkJCQlUaGUgc3VwcG9ydGVkIHZhbHVlcyBhcmU6CisKKwkJCQkgMSAgICAgICBSQURJVVMKKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgCSp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhIAkgdGRhdGEgPSB7IEFWUF9UWVBFX1VOU0lHTkVEMzIsCSJFbnVtZXJhdGVkKE9yaWdpbi1BQUEtUHJvdG9jb2wpIgksIE5VTEwsIE5VTEx9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIHR2YWxzW10gPSB7CisJCQkJZW51bXZhbF9kZWZfdTMyKCAxLCAiUkFESVVTIikKKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJCQkJNDA4LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIk9yaWdpbi1BQUEtUHJvdG9jb2wiLCAJCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCSAJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfVU5TSUdORUQzMiAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCQkJaW50IGk7CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgZW51bWVyYXRlZCB2YWx1ZXMsIGFuZCB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEgLCBOVUxMLCAmdHlwZSk7CisJCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHR2YWxzKSAvIHNpemVvZih0dmFsc1swXSk7IGkrKykgeworCQkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0dmFsc1tpXSwgdHlwZSwgTlVMTCk7CisJCQl9CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgdHlwZSwgTlVMTCk7CisJCX0KKwkJCisJfQorCisvKioqKioqKioqKioqKioqKioqKiovCQkKKy8qIENvbW1hbmRzIHNlY3Rpb24gKi8KKy8qKioqKioqKioqKioqKioqKioqKi8JCQorCXsKKwkJLyogVG8gYXZvaWQgZGVmaW5pbmcgZ2xvYmFsIHZhcmlhYmxlcyBmb3IgYWxsIHRoZSBBVlAgdGhhdCB3ZSB1c2UgaGVyZSwgd2UgZG8gc2VhcmNoIHRoZSBkaWN0aW9uYXJ5IGluIGVhY2ggc3ViLWJsb2NrLgorCQkgKiBUaGlzIGlzIGZhciBmcm9tIG9wdGltYWwsIGJ1dCB0aGUgY29kZSBpcyBjbGVhcmVyIGxpa2UgdGhpcywgYW5kIHRoZSB0aW1lIGl0IHJlcXVpcmVzIGF0IGV4ZWN1dGlvbiBpcyBub3Qgbm90aWNlYWJsZS4KKwkJICovCisJCQorCQkvKiBBQS1SZXF1ZXN0IChBQVIpIENvbW1hbmQgKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgQUEtUmVxdWVzdCAoQUFSKSwgd2hpY2ggaXMgaW5kaWNhdGVkIGJ5IHNldHRpbmcgdGhlIENvbW1hbmQtQ29kZQorCQkJCWZpZWxkIHRvIDI2NSBhbmQgdGhlICdSJyBiaXQgaW4gdGhlIENvbW1hbmQgRmxhZ3MgZmllbGQsIGlzIHVzZWQgdG8KKwkJCQlyZXF1ZXN0IGF1dGhlbnRpY2F0aW9uIGFuZC9vciBhdXRob3JpemF0aW9uIGZvciBhIGdpdmVuIE5BUyB1c2VyLgorCQkJCVRoZSB0eXBlIG9mIHJlcXVlc3QgaXMgaWRlbnRpZmllZCB0aHJvdWdoIHRoZSBBdXRoLVJlcXVlc3QtVHlwZSBBVlAKKwkJCQlbQkFTRV0uICBUaGUgcmVjb21tZW5kZWQgdmFsdWUgZm9yIG1vc3QgUkFESVVTIGludGVyb3BlcmFiaWx5CisJCQkJc2l0dWF0aW9ucyBpcyBBVVRIT1JJWkVfQVVUSEVOVElDQVRFLgorCisJCQkJSWYgQXV0aGVudGljYXRpb24gaXMgcmVxdWVzdGVkLCB0aGUgVXNlci1OYW1lIGF0dHJpYnV0ZSBTSE9VTEQgYmUKKwkJCQlwcmVzZW50LCBhcyB3ZWxsIGFzIGFueSBhZGRpdGlvbmFsIGF1dGhlbnRpY2F0aW9uIEFWUHMgdGhhdCB3b3VsZAorCQkJCWNhcnJ5IHRoZSBwYXNzd29yZCBpbmZvcm1hdGlvbi4gIEEgcmVxdWVzdCBmb3IgYXV0aG9yaXphdGlvbiBTSE9VTEQKKwkJCQlvbmx5IGluY2x1ZGUgdGhlIGluZm9ybWF0aW9uIGZyb20gd2hpY2ggdGhlIGF1dGhvcml6YXRpb24gd2lsbCBiZQorCQkJCXBlcmZvcm1lZCwgc3VjaCBhcyB0aGUgVXNlci1OYW1lLCBDYWxsZWQtU3RhdGlvbi1JZCwgb3IgQ2FsbGluZy0KKwkJCQlTdGF0aW9uLUlkIEFWUHMuICBBbGwgcmVxdWVzdHMgU0hPVUxEIGNvbnRhaW4gQVZQcyB1bmlxdWVseQorCQkJCWlkZW50aWZ5aW5nIHRoZSBzb3VyY2Ugb2YgdGhlIGNhbGwsIHN1Y2ggYXMgT3JpZ2luLUhvc3QgYW5kIE5BUy1Qb3J0LgorCQkJCUNlcnRhaW4gbmV0d29ya3MgTUFZIHVzZSBkaWZmZXJlbnQgQVZQcyBmb3IgYXV0aG9yaXphdGlvbiBwdXJwb3Nlcy4KKwkJCQlBIHJlcXVlc3QgZm9yIGF1dGhvcml6YXRpb24gd2lsbCBpbmNsdWRlIHNvbWUgQVZQcyBkZWZpbmVkIGluIHNlY3Rpb24KKwkJCQk2LgorCisJCQkJSXQgaXMgcG9zc2libGUgZm9yIGEgc2luZ2xlIHNlc3Npb24gdG8gYmUgYXV0aG9yaXplZCBmaXJzdCBhbmQgdGhlbgorCQkJCWZvciBhbiBhdXRoZW50aWNhdGlvbiByZXF1ZXN0IHRvIGZvbGxvdy4KKworCQkJCVRoaXMgQUEtUmVxdWVzdCBtZXNzYWdlIE1BWSBiZSB0aGUgcmVzdWx0IG9mIGEgbXVsdGktcm91bmQKKwkJCQlhdXRoZW50aWNhdGlvbiBleGNoYW5nZSwgd2hpY2ggb2NjdXJzIHdoZW4gdGhlIEFBLUFuc3dlciBtZXNzYWdlIGlzCisJCQkJcmVjZWl2ZWQgd2l0aCB0aGUgUmVzdWx0LUNvZGUgQVZQIHNldCB0byBESUFNRVRFUl9NVUxUSV9ST1VORF9BVVRILgorCQkJCUEgc3Vic2VxdWVudCBBQVIgbWVzc2FnZSBTSE9VTEQgYmUgc2VudCwgd2l0aCB0aGUgVXNlci1QYXNzd29yZCBBVlAKKwkJCQl0aGF0IGluY2x1ZGVzIHRoZSB1c2VyJ3MgcmVzcG9uc2UgdG8gdGhlIHByb21wdCwgYW5kIE1VU1QgaW5jbHVkZSBhbnkKKwkJCQlTdGF0ZSBBVlBzIHRoYXQgd2VyZSBwcmVzZW50IGluIHRoZSBBQUEgbWVzc2FnZS4KKworCQkJCU1lc3NhZ2UgRm9ybWF0CisJCQkJPEFBLVJlcXVlc3Q+IDo6PSA8IERpYW1ldGVyIEhlYWRlcjogMjY1LCBSRVEsIFBYWSA+CisgICAgICAgIAkJCQkgICAgICAgPCBTZXNzaW9uLUlkID4KKyAgICAgICAgCQkJCSAgICAgICB7IEF1dGgtQXBwbGljYXRpb24tSWQgfQorICAgICAgICAJCQkJICAgICAgIHsgT3JpZ2luLUhvc3QgfQorICAgICAgICAJCQkJICAgICAgIHsgT3JpZ2luLVJlYWxtIH0KKyAgICAgICAgCQkJCSAgICAgICB7IERlc3RpbmF0aW9uLVJlYWxtIH0KKyAgICAgICAgCQkJCSAgICAgICB7IEF1dGgtUmVxdWVzdC1UeXBlIH0KKyAgICAgICAgCQkJCSAgICAgICBbIERlc3RpbmF0aW9uLUhvc3QgXQorICAgICAgICAJCQkJICAgICAgIFsgTkFTLUlkZW50aWZpZXIgXQorICAgICAgICAJCQkJICAgICAgIFsgTkFTLUlQLUFkZHJlc3MgXQorICAgICAgICAJCQkJICAgICAgIFsgTkFTLUlQdjYtQWRkcmVzcyBdCisgICAgICAgIAkJCQkgICAgICAgWyBOQVMtUG9ydCBdCisgICAgICAgIAkJCQkgICAgICAgWyBOQVMtUG9ydC1JZCBdCisgICAgICAgIAkJCQkgICAgICAgWyBOQVMtUG9ydC1UeXBlIF0KKyAgICAgICAgCQkJCSAgICAgICBbIE9yaWdpbi1BQUEtUHJvdG9jb2wgXQorICAgICAgICAJCQkJICAgICAgIFsgT3JpZ2luLVN0YXRlLUlkIF0KKyAgICAgICAgCQkJCSAgICAgICBbIFBvcnQtTGltaXQgXQorICAgICAgICAJCQkJICAgICAgIFsgVXNlci1OYW1lIF0KKyAgICAgICAgCQkJCSAgICAgICBbIFVzZXItUGFzc3dvcmQgXQorICAgICAgICAJCQkJICAgICAgIFsgU2VydmljZS1UeXBlIF0KKyAgICAgICAgCQkJCSAgICAgICBbIFN0YXRlIF0KKyAgICAgICAgCQkJCSAgICAgICBbIEF1dGhvcml6YXRpb24tTGlmZXRpbWUgXQorICAgICAgICAJCQkJICAgICAgIFsgQXV0aC1HcmFjZS1QZXJpb2QgXQorICAgICAgICAJCQkJICAgICAgIFsgQXV0aC1TZXNzaW9uLVN0YXRlIF0KKyAgICAgICAgCQkJCSAgICAgICBbIENhbGxiYWNrLU51bWJlciBdCisgICAgICAgIAkJCQkgICAgICAgWyBDYWxsZWQtU3RhdGlvbi1JZCBdCisgICAgICAgIAkJCQkgICAgICAgWyBDYWxsaW5nLVN0YXRpb24tSWQgXQorICAgICAgICAJCQkJICAgICAgIFsgT3JpZ2luYXRpbmctTGluZS1JbmZvIF0KKyAgICAgICAgCQkJCSAgICAgICBbIENvbm5lY3QtSW5mbyBdCisgICAgICAgIAkJCQkgICAgICAgWyBDSEFQLUF1dGggXQorICAgICAgICAJCQkJICAgICAgIFsgQ0hBUC1DaGFsbGVuZ2UgXQorICAgICAgICAJCQkJICAgICAqIFsgRnJhbWVkLUNvbXByZXNzaW9uIF0KKyAgICAgICAgCQkJCSAgICAgICBbIEZyYW1lZC1JbnRlcmZhY2UtSWQgXQorICAgICAgICAJCQkJICAgICAgIFsgRnJhbWVkLUlQLUFkZHJlc3MgXQorICAgICAgICAJCQkJICAgICAqIFsgRnJhbWVkLUlQdjYtUHJlZml4IF0KKyAgICAgICAgCQkJCSAgICAgICBbIEZyYW1lZC1JUC1OZXRtYXNrIF0KKyAgICAgICAgCQkJCSAgICAgICBbIEZyYW1lZC1NVFUgXQorICAgICAgICAJCQkJICAgICAgIFsgRnJhbWVkLVByb3RvY29sIF0KKyAgICAgICAgCQkJCSAgICAgICBbIEFSQVAtUGFzc3dvcmQgXQorICAgICAgICAJCQkJICAgICAgIFsgQVJBUC1TZWN1cml0eSBdCisgICAgICAgIAkJCQkgICAgICogWyBBUkFQLVNlY3VyaXR5LURhdGEgXQorICAgICAgICAJCQkJICAgICAqIFsgTG9naW4tSVAtSG9zdCBdCisgICAgICAgIAkJCQkgICAgICogWyBMb2dpbi1JUHY2LUhvc3QgXQorICAgICAgICAJCQkJICAgICAgIFsgTG9naW4tTEFULUdyb3VwIF0KKyAgICAgICAgCQkJCSAgICAgICBbIExvZ2luLUxBVC1Ob2RlIF0KKyAgICAgICAgCQkJCSAgICAgICBbIExvZ2luLUxBVC1Qb3J0IF0KKyAgICAgICAgCQkJCSAgICAgICBbIExvZ2luLUxBVC1TZXJ2aWNlIF0KKyAgICAgICAgCQkJCSAgICAgKiBbIFR1bm5lbGluZyBdCisgICAgICAgIAkJCQkgICAgICogWyBQcm94eS1JbmZvIF0KKyAgICAgICAgCQkJCSAgICAgKiBbIFJvdXRlLVJlY29yZCBdCisgICAgICAgIAkJCQkgICAgICogWyBBVlAgXQorCQkJKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGNtZDsKKwkJCXN0cnVjdCBkaWN0X2NtZF9kYXRhIGRhdGEgPSB7IAorCQkJCQkyNjUsIAkJCQkJLyogQ29kZSAqLworCQkJCQkiQUEtUmVxdWVzdCIsIAkJCQkvKiBOYW1lICovCisJCQkJCUNNRF9GTEFHX1JFUVVFU1QgfCBDTURfRkxBR19QUk9YSUFCTEUgfCBDTURfRkxBR19FUlJPUiwgLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQ01EX0ZMQUdfUkVRVUVTVCB8IENNRF9GTEFHX1BST1hJQUJMRSAJCQkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQl9OworCQkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9IAorCQkJCQkJeyAJIHsgICJTZXNzaW9uLUlkIiwgCQkJUlVMRV9GSVhFRF9IRUFELCAtMSwgMSB9CisJCQkJCQkgCSx7ICAiQXV0aC1BcHBsaWNhdGlvbi1JZCIsIAkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCQkJCQkgCSx7ICAiT3JpZ2luLUhvc3QiLCAJCQlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIk9yaWdpbi1SZWFsbSIsCQkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJEZXN0aW5hdGlvbi1SZWFsbSIsCQlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJCQkJCSAJLHsgICJBdXRoLVJlcXVlc3QtVHlwZSIsIAkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJEZXN0aW5hdGlvbi1Ib3N0IiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIk5BUy1JZGVudGlmaWVyIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIk5BUy1JUC1BZGRyZXNzIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIk5BUy1JUHY2LUFkZHJlc3MiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiTkFTLVBvcnQiLAkJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIk5BUy1Qb3J0LUlkIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIk5BUy1Qb3J0LVR5cGUiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiT3JpZ2luLUFBQS1Qcm90b2NvbCIsCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIk9yaWdpbi1TdGF0ZS1JZCIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJQb3J0LUxpbWl0IiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIlVzZXItTmFtZSIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJVc2VyLVBhc3N3b3JkIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIlNlcnZpY2UtVHlwZSIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJTdGF0ZSIsCQkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiQXV0aG9yaXphdGlvbi1MaWZldGltZSIsCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkF1dGgtR3JhY2UtUGVyaW9kIiwJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiQXV0aC1TZXNzaW9uLVN0YXRlIiwJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiQ2FsbGJhY2stTnVtYmVyIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkNhbGxlZC1TdGF0aW9uLUlkIiwJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiQ2FsbGluZy1TdGF0aW9uLUlkIiwJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiT3JpZ2luYXRpbmctTGluZS1JbmZvIiwJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiQ29ubmVjdC1JbmZvIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkNIQVAtQXV0aCIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJDSEFQLUNoYWxsZW5nZSIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJGcmFtZWQtQ29tcHJlc3Npb24iLAkJUlVMRV9PUFRJT05BTCwgICAtMSwtMSB9CisJCQkJCQkJLHsgICJGcmFtZWQtSW50ZXJmYWNlLUlkIiwJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiRnJhbWVkLUlQLUFkZHJlc3MiLAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJGcmFtZWQtSVB2Ni1QcmVmaXgiLAkJUlVMRV9PUFRJT05BTCwgICAtMSwtMSB9CisJCQkJCQkJLHsgICJGcmFtZWQtSVAtTmV0bWFzayIsCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkZyYW1lZC1NVFUiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiRnJhbWVkLVByb3RvY29sIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkFSQVAtUGFzc3dvcmQiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiQVJBUC1TZWN1cml0eSIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJBUkFQLVNlY3VyaXR5LURhdGEiLAkJUlVMRV9PUFRJT05BTCwgICAtMSwtMSB9CisJCQkJCQkJLHsgICJMb2dpbi1JUC1Ib3N0IiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLC0xIH0KKwkJCQkJCQkseyAgIkxvZ2luLUlQdjYtSG9zdCIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwtMSB9CisJCQkJCQkJLHsgICJMb2dpbi1MQVQtR3JvdXAiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiTG9naW4tTEFULU5vZGUiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiTG9naW4tTEFULVBvcnQiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiTG9naW4tTEFULVNlcnZpY2UiLAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJUdW5uZWxpbmciLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsLTEgfQorCQkJCQkJCSx7ICAiUHJveHktSW5mbyIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwtMSB9CisJCQkJCQkJLHsgICJSb3V0ZS1SZWNvcmQiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsLTEgfQorCQkJCQkJfTsKKwkJCQorCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQ09NTUFORCwgJmRhdGEgLCBuYXNyZXEsICZjbWQpOworCQkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgY21kICk7CisJCX0KKwkJCisJCS8qIEFBLUFuc3dlciAoQUFBKSBDb21tYW5kICovCisJCXsKKwkJCS8qCisJCQkJVGhlIEFBLUFuc3dlciAoQUFBKSBtZXNzYWdlIGlzIGluZGljYXRlZCBieSBzZXR0aW5nIHRoZSBDb21tYW5kLUNvZGUKKwkJCQlmaWVsZCB0byAyNjUgYW5kIGNsZWFyaW5nIHRoZSAnUicgYml0IGluIHRoZSBDb21tYW5kIEZsYWdzIGZpZWxkLiAgSXQKKwkJCQlpcyBzZW50IGluIHJlc3BvbnNlIHRvIHRoZSBBQS1SZXF1ZXN0IChBQVIpIG1lc3NhZ2UuICBJZgorCQkJCWF1dGhvcml6YXRpb24gd2FzIHJlcXVlc3RlZCwgYSBzdWNjZXNzZnVsIHJlc3BvbnNlIHdpbGwgaW5jbHVkZSB0aGUKKwkJCQlhdXRob3JpemF0aW9uIEFWUHMgYXBwcm9wcmlhdGUgZm9yIHRoZSBzZXJ2aWNlIGJlaW5nIHByb3ZpZGVkLCBhcworCQkJCWRlZmluZWQgaW4gc2VjdGlvbiA2LgorCisJCQkJRm9yIGF1dGhlbnRpY2F0aW9uIGV4Y2hhbmdlcyByZXF1aXJpbmcgbW9yZSB0aGFuIGEgc2luZ2xlIHJvdW5kIHRyaXAsCisJCQkJdGhlIHNlcnZlciBNVVNUIHNldCB0aGUgUmVzdWx0LUNvZGUgQVZQIHRvIERJQU1FVEVSX01VTFRJX1JPVU5EX0FVVEguCisJCQkJQW4gQUFBIG1lc3NhZ2Ugd2l0aCB0aGlzIHJlc3VsdCBjb2RlIE1BWSBpbmNsdWRlIG9uZSBSZXBseS1NZXNzYWdlIG9yCisJCQkJbW9yZSBhbmQgTUFZIGluY2x1ZGUgemVybyBvciBvbmUgU3RhdGUgQVZQcy4KKworCQkJCUlmIHRoZSBSZXBseS1NZXNzYWdlIEFWUCB3YXMgcHJlc2VudCwgdGhlIG5ldHdvcmsgYWNjZXNzIHNlcnZlcgorCQkJCVNIT1VMRCBzZW5kIHRoZSB0ZXh0IHRvIHRoZSB1c2VyJ3MgY2xpZW50IHRvIGRpc3BsYXkgdG8gdGhlIHVzZXIsCisJCQkJaW5zdHJ1Y3RpbmcgdGhlIGNsaWVudCB0byBwcm9tcHQgdGhlIHVzZXIgZm9yIGEgcmVzcG9uc2UuICBGb3IKKwkJCQlleGFtcGxlLCB0aGlzIGNhcGFiaWxpdHkgY2FuIGJlIGFjaGlldmVkIGluIFBQUCB2aWEgUEFQLiAgSWYgdGhlCisJCQkJYWNjZXNzIGNsaWVudCBpcyB1bmFibGUgdG8gcHJvbXB0IHRoZSB1c2VyIGZvciBhIG5ldyByZXNwb25zZSwgaXQKKwkJCQlNVVNUIHRyZWF0IHRoZSBBQS1BbnN3ZXIgKEFBQSkgd2l0aCB0aGUgUmVwbHktTWVzc2FnZSBBVlAgYXMgYW4gZXJyb3IKKwkJCQlhbmQgZGVueSBhY2Nlc3MuCisKKwkJCQlNZXNzYWdlIEZvcm1hdAorCisJCQkJPEFBLUFuc3dlcj4gOjo9IDwgRGlhbWV0ZXIgSGVhZGVyOiAyNjUsIFBYWSA+CisgICAgICAgIAkJCQkgICAgICA8IFNlc3Npb24tSWQgPgorICAgICAgICAJCQkJICAgICAgeyBBdXRoLUFwcGxpY2F0aW9uLUlkIH0KKyAgICAgICAgCQkJCSAgICAgIHsgQXV0aC1SZXF1ZXN0LVR5cGUgfQorICAgICAgICAJCQkJICAgICAgeyBSZXN1bHQtQ29kZSB9CisgICAgICAgIAkJCQkgICAgICB7IE9yaWdpbi1Ib3N0IH0KKyAgICAgICAgCQkJCSAgICAgIHsgT3JpZ2luLVJlYWxtIH0KKyAgICAgICAgCQkJCSAgICAgIFsgVXNlci1OYW1lIF0KKyAgICAgICAgCQkJCSAgICAgIFsgU2VydmljZS1UeXBlIF0KKyAgICAgICAgCQkJCSAgICAqIFsgQ2xhc3MgXQorICAgICAgICAJCQkJICAgICogWyBDb25maWd1cmF0aW9uLVRva2VuIF0KKyAgICAgICAgCQkJCSAgICAgIFsgQWNjdC1JbnRlcmltLUludGVydmFsIF0KKyAgICAgICAgCQkJCSAgICAgIFsgRXJyb3ItTWVzc2FnZSBdCisgICAgICAgIAkJCQkgICAgICBbIEVycm9yLVJlcG9ydGluZy1Ib3N0IF0KKyAgICAgICAgCQkJCSAgICAqIFsgRmFpbGVkLUFWUCBdCisgICAgICAgIAkJCQkgICAgICBbIElkbGUtVGltZW91dCBdCisgICAgICAgIAkJCQkgICAgICBbIEF1dGhvcml6YXRpb24tTGlmZXRpbWUgXQorICAgICAgICAJCQkJICAgICAgWyBBdXRoLUdyYWNlLVBlcmlvZCBdCisgICAgICAgIAkJCQkgICAgICBbIEF1dGgtU2Vzc2lvbi1TdGF0ZSBdCisgICAgICAgIAkJCQkgICAgICBbIFJlLUF1dGgtUmVxdWVzdC1UeXBlIF0KKyAgICAgICAgCQkJCSAgICAgIFsgTXVsdGktUm91bmQtVGltZS1PdXQgXQorICAgICAgICAJCQkJICAgICAgWyBTZXNzaW9uLVRpbWVvdXQgXQorICAgICAgICAJCQkJICAgICAgWyBTdGF0ZSBdCisgICAgICAgIAkJCQkgICAgKiBbIFJlcGx5LU1lc3NhZ2UgXQorICAgICAgICAJCQkJICAgICAgWyBPcmlnaW4tQUFBLVByb3RvY29sIF0KKyAgICAgICAgCQkJCSAgICAgIFsgT3JpZ2luLVN0YXRlLUlkIF0KKyAgICAgICAgCQkJCSAgICAqIFsgRmlsdGVyLUlkIF0KKyAgICAgICAgCQkJCSAgICAgIFsgUGFzc3dvcmQtUmV0cnkgXQorICAgICAgICAJCQkJICAgICAgWyBQb3J0LUxpbWl0IF0KKyAgICAgICAgCQkJCSAgICAgIFsgUHJvbXB0IF0KKyAgICAgICAgCQkJCSAgICAgIFsgQVJBUC1DaGFsbGVuZ2UtUmVzcG9uc2UgXQorICAgICAgICAJCQkJICAgICAgWyBBUkFQLUZlYXR1cmVzIF0KKyAgICAgICAgCQkJCSAgICAgIFsgQVJBUC1TZWN1cml0eSBdCisgICAgICAgIAkJCQkgICAgKiBbIEFSQVAtU2VjdXJpdHktRGF0YSBdCisgICAgICAgIAkJCQkgICAgICBbIEFSQVAtWm9uZS1BY2Nlc3MgXQorICAgICAgICAJCQkJICAgICAgWyBDYWxsYmFjay1JZCBdCisgICAgICAgIAkJCQkgICAgICBbIENhbGxiYWNrLU51bWJlciBdCisgICAgICAgIAkJCQkgICAgICBbIEZyYW1lZC1BcHBsZXRhbGstTGluayBdCisgICAgICAgIAkJCQkgICAgKiBbIEZyYW1lZC1BcHBsZXRhbGstTmV0d29yayBdCisgICAgICAgIAkJCQkgICAgICBbIEZyYW1lZC1BcHBsZXRhbGstWm9uZSBdCisgICAgICAgIAkJCQkgICAgKiBbIEZyYW1lZC1Db21wcmVzc2lvbiBdCisgICAgICAgIAkJCQkgICAgICBbIEZyYW1lZC1JbnRlcmZhY2UtSWQgXQorICAgICAgICAJCQkJICAgICAgWyBGcmFtZWQtSVAtQWRkcmVzcyBdCisgICAgICAgIAkJCQkgICAgKiBbIEZyYW1lZC1JUHY2LVByZWZpeCBdCisgICAgICAgIAkJCQkgICAgICBbIEZyYW1lZC1JUHY2LVBvb2wgXQorICAgICAgICAJCQkJICAgICogWyBGcmFtZWQtSVB2Ni1Sb3V0ZSBdCisgICAgICAgIAkJCQkgICAgICBbIEZyYW1lZC1JUC1OZXRtYXNrIF0KKyAgICAgICAgCQkJCSAgICAqIFsgRnJhbWVkLVJvdXRlIF0KKyAgICAgICAgCQkJCSAgICAgIFsgRnJhbWVkLVBvb2wgXQorICAgICAgICAJCQkJICAgICAgWyBGcmFtZWQtSVBYLU5ldHdvcmsgXQorICAgICAgICAJCQkJICAgICAgWyBGcmFtZWQtTVRVIF0KKyAgICAgICAgCQkJCSAgICAgIFsgRnJhbWVkLVByb3RvY29sIF0KKyAgICAgICAgCQkJCSAgICAgIFsgRnJhbWVkLVJvdXRpbmcgXQorICAgICAgICAJCQkJICAgICogWyBMb2dpbi1JUC1Ib3N0IF0KKyAgICAgICAgCQkJCSAgICAqIFsgTG9naW4tSVB2Ni1Ib3N0IF0KKyAgICAgICAgCQkJCSAgICAgIFsgTG9naW4tTEFULUdyb3VwIF0KKyAgICAgICAgCQkJCSAgICAgIFsgTG9naW4tTEFULU5vZGUgXQorICAgICAgICAJCQkJICAgICAgWyBMb2dpbi1MQVQtUG9ydCBdCisgICAgICAgIAkJCQkgICAgICBbIExvZ2luLUxBVC1TZXJ2aWNlIF0KKyAgICAgICAgCQkJCSAgICAgIFsgTG9naW4tU2VydmljZSBdCisgICAgICAgIAkJCQkgICAgICBbIExvZ2luLVRDUC1Qb3J0IF0KKyAgICAgICAgCQkJCSAgICAqIFsgTkFTLUZpbHRlci1SdWxlIF0KKyAgICAgICAgCQkJCSAgICAqIFsgUW9TLUZpbHRlci1SdWxlIF0KKyAgICAgICAgCQkJCSAgICAqIFsgVHVubmVsaW5nIF0KKyAgICAgICAgCQkJCSAgICAqIFsgUmVkaXJlY3QtSG9zdCBdCisgICAgICAgIAkJCQkgICAgICBbIFJlZGlyZWN0LUhvc3QtVXNhZ2UgXQorICAgICAgICAJCQkJICAgICAgWyBSZWRpcmVjdC1NYXgtQ2FjaGUtVGltZSBdCisgICAgICAgIAkJCQkgICAgKiBbIFByb3h5LUluZm8gXQorICAgICAgICAJCQkJICAgICogWyBBVlAgXQorCQkJKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGNtZDsKKwkJCXN0cnVjdCBkaWN0X2NtZF9kYXRhIGRhdGEgPSB7IAorCQkJCQkyNjUsIAkJCQkJLyogQ29kZSAqLworCQkJCQkiQUEtQW5zd2VyIiwgCQkJCS8qIE5hbWUgKi8KKwkJCQkJQ01EX0ZMQUdfUkVRVUVTVCB8IENNRF9GTEFHX1BST1hJQUJMRSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJCQkgICBDTURfRkxBR19QUk9YSUFCTEUJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJfTsKKwkJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPSAKKwkJCQkJCXsgCSB7ICAiU2Vzc2lvbi1JZCIsIAkJCVJVTEVfRklYRURfSEVBRCwgLTEsIDEgfQorCQkJCQkJIAkseyAgIkF1dGgtQXBwbGljYXRpb24tSWQiLCAJCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkJCQkJIAkseyAgIkF1dGgtUmVxdWVzdC1UeXBlIiwgCQlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJCQkJCSAJLHsgICJSZXN1bHQtQ29kZSIsIAkJCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkJCQkJIAkseyAgIk9yaWdpbi1Ib3N0IiwgCQkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJPcmlnaW4tUmVhbG0iLAkJCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiVXNlci1OYW1lIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIlNlcnZpY2UtVHlwZSIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJDbGFzcyIsCQkJCVJVTEVfT1BUSU9OQUwsICAgLTEsLTEgfQorCQkJCQkJCSx7ICAiQ29uZmlndXJhdGlvbi1Ub2tlbiIsCQlSVUxFX09QVElPTkFMLCAgIC0xLC0xIH0KKwkJCQkJCQkseyAgIkFjY3QtSW50ZXJpbS1JbnRlcnZhbCIsCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkVycm9yLU1lc3NhZ2UiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiRXJyb3ItUmVwb3J0aW5nLUhvc3QiLAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJGYWlsZWQtQVZQIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLC0xIH0KKwkJCQkJCQkseyAgIklkbGUtVGltZW91dCIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJBdXRob3JpemF0aW9uLUxpZmV0aW1lIiwJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiQXV0aC1HcmFjZS1QZXJpb2QiLAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJBdXRoLVNlc3Npb24tU3RhdGUiLAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJSZS1BdXRoLVJlcXVlc3QtVHlwZSIsCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIk11bHRpLVJvdW5kLVRpbWUtT3V0IiwJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiU2Vzc2lvbi1UaW1lb3V0IiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIlN0YXRlIiwJCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJSZXBseS1NZXNzYWdlIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLC0xIH0KKwkJCQkJCQkseyAgIk9yaWdpbi1BQUEtUHJvdG9jb2wiLAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJPcmlnaW4tU3RhdGUtSWQiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiRmlsdGVyLUlkIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLC0xIH0KKwkJCQkJCQkseyAgIlBhc3N3b3JkLVJldHJ5IiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIlBvcnQtTGltaXQiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiUHJvbXB0IiwJCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJBUkFQLUNoYWxsZW5nZS1SZXNwb25zZSIsCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkFSQVAtRmVhdHVyZXMiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiQVJBUC1TZWN1cml0eSIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJBUkFQLVNlY3VyaXR5LURhdGEiLAkJUlVMRV9PUFRJT05BTCwgICAtMSwtMSB9CisJCQkJCQkJLHsgICJBUkFQLVpvbmUtQWNjZXNzIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkNhbGxiYWNrLUlkIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkNhbGxiYWNrLU51bWJlciIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJGcmFtZWQtQXBwbGVUYWxrLUxpbmsiLAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJGcmFtZWQtQXBwbGVUYWxrLU5ldHdvcmsiLAkJUlVMRV9PUFRJT05BTCwgICAtMSwtMSB9CisJCQkJCQkJLHsgICJGcmFtZWQtQXBwbGVUYWxrLVpvbmUiLAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJGcmFtZWQtQ29tcHJlc3Npb24iLAkJUlVMRV9PUFRJT05BTCwgICAtMSwtMSB9CisJCQkJCQkJLHsgICJGcmFtZWQtSW50ZXJmYWNlLUlkIiwJCVJVTEVfT1BUSU9OQUwsICAgLTEsLTEgfQorCQkJCQkJCSx7ICAiRnJhbWVkLUlQLUFkZHJlc3MiLAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJGcmFtZWQtSVB2Ni1QcmVmaXgiLAkJUlVMRV9PUFRJT05BTCwgICAtMSwtMSB9CisJCQkJCQkJLHsgICJGcmFtZWQtSVB2Ni1Qb29sIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkZyYW1lZC1JUHY2LVJvdXRlIiwJCVJVTEVfT1BUSU9OQUwsICAgLTEsLTEgfQorCQkJCQkJCSx7ICAiRnJhbWVkLUlQLU5ldG1hc2siLAkJUlVMRV9PUFRJT05BTCwgICAtMSwtMSB9CisJCQkJCQkJLHsgICJGcmFtZWQtUm91dGUiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsLTEgfQorCQkJCQkJCSx7ICAiRnJhbWVkLVBvb2wiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiRnJhbWVkLUlQWC1OZXR3b3JrIiwJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiRnJhbWVkLU1UVSIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJGcmFtZWQtUHJvdG9jb2wiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiRnJhbWVkLVJvdXRpbmciLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiTG9naW4tSVAtSG9zdCIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwtMSB9CisJCQkJCQkJLHsgICJMb2dpbi1JUHY2LUhvc3QiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsLTEgfQorCQkJCQkJCSx7ICAiTG9naW4tTEFULUdyb3VwIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkxvZ2luLUxBVC1Ob2RlIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkxvZ2luLUxBVC1Qb3J0IiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkxvZ2luLUxBVC1TZXJ2aWNlIiwJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiTG9naW4tU2VydmljZSIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJMb2dpbi1UQ1AtUG9ydCIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJOQVMtRmlsdGVyLVJ1bGUiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsLTEgfQorCQkJCQkJCSx7ICAiUW9TLUZpbHRlci1SdWxlIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLC0xIH0KKwkJCQkJCQkseyAgIlR1bm5lbGluZyIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwtMSB9CisJCQkJCQkJLHsgICJSZWRpcmVjdC1Ib3N0IiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLC0xIH0KKwkJCQkJCQkseyAgIlJlZGlyZWN0LUhvc3QtVXNhZ2UiLAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJSZWRpcmVjdC1NYXgtQ2FjaGUtVGltZSIsCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIlByb3h5LUluZm8iLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsLTEgfQorCQkJCQkJfTsKKwkJCQorCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQ09NTUFORCwgJmRhdGEgLCBuYXNyZXEsICZjbWQpOworCQkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgY21kICk7CisJCX0KKwkJCisJCS8qIFJlLUF1dGgtUmVxdWVzdCAqLworCQl7CisJCQkvKgorCQkJCUFkZCBhZGRpdGlvbmFsIHJ1bGVzIG9mIHRoZSBBQk5GIChjb21wYXJlZCB0byBCYXNlIGRlZmluaXRpb24pOgorCQkJCQorCQkJPFJBLVJlcXVlc3Q+ICA6Oj0gPCBEaWFtZXRlciBIZWFkZXI6IDI1OCwgUkVRLCBQWFkgPgorICAgICAgICAJCQkgICAgICAgPCBTZXNzaW9uLUlkID4KKyAgICAgICAgCQkJICAgICAgIHsgT3JpZ2luLUhvc3QgfQorICAgICAgICAJCQkgICAgICAgeyBPcmlnaW4tUmVhbG0gfQorICAgICAgICAJCQkgICAgICAgeyBEZXN0aW5hdGlvbi1SZWFsbSB9CisgICAgICAgIAkJCSAgICAgICB7IERlc3RpbmF0aW9uLUhvc3QgfQorICAgICAgICAJCQkgICAgICAgeyBBdXRoLUFwcGxpY2F0aW9uLUlkIH0KKyAgICAgICAgCQkJICAgICAgIHsgUmUtQXV0aC1SZXF1ZXN0LVR5cGUgfQorICAgICAgICAJCQkgICAgICAgWyBVc2VyLU5hbWUgXQorICAgICAgICAJCQkgICAgICAgWyBPcmlnaW4tQUFBLVByb3RvY29sIF0KKyAgICAgICAgCQkJICAgICAgIFsgT3JpZ2luLVN0YXRlLUlkIF0KKyAgICAgICAgCQkJICAgICAgIFsgTkFTLUlkZW50aWZpZXIgXQorICAgICAgICAJCQkgICAgICAgWyBOQVMtSVAtQWRkcmVzcyBdCisgICAgICAgIAkJCSAgICAgICBbIE5BUy1JUHY2LUFkZHJlc3MgXQorICAgICAgICAJCQkgICAgICAgWyBOQVMtUG9ydCBdCisgICAgICAgIAkJCSAgICAgICBbIE5BUy1Qb3J0LUlkIF0KKyAgICAgICAgCQkJICAgICAgIFsgTkFTLVBvcnQtVHlwZSBdCisgICAgICAgIAkJCSAgICAgICBbIFNlcnZpY2UtVHlwZSBdCisgICAgICAgIAkJCSAgICAgICBbIEZyYW1lZC1JUC1BZGRyZXNzIF0KKyAgICAgICAgCQkJICAgICAgIFsgRnJhbWVkLUlQdjYtUHJlZml4IF0KKyAgICAgICAgCQkJICAgICAgIFsgRnJhbWVkLUludGVyZmFjZS1JZCBdCisgICAgICAgIAkJCSAgICAgICBbIENhbGxlZC1TdGF0aW9uLUlkIF0KKyAgICAgICAgCQkJICAgICAgIFsgQ2FsbGluZy1TdGF0aW9uLUlkIF0KKyAgICAgICAgCQkJICAgICAgIFsgT3JpZ2luYXRpbmctTGluZS1JbmZvIF0KKyAgICAgICAgCQkJICAgICAgIFsgQWNjdC1TZXNzaW9uLUlkIF0KKyAgICAgICAgCQkJICAgICAgIFsgQWNjdC1NdWx0aS1TZXNzaW9uLUlkIF0KKyAgICAgICAgCQkJICAgICAgIFsgU3RhdGUgXQorICAgICAgICAJCQkgICAgICogWyBDbGFzcyBdCisgICAgICAgIAkJCSAgICAgICBbIFJlcGx5LU1lc3NhZ2UgXQorICAgICAgICAJCQkgICAgICogWyBQcm94eS1JbmZvIF0KKyAgICAgICAgCQkJICAgICAqIFsgUm91dGUtUmVjb3JkIF0KKyAgICAgICAgCQkJICAgICAqIFsgQVZQIF0KKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBjbWQ7CisJCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0gCisJCQkJCQl7IAkgeyAgIk9yaWdpbi1BQUEtUHJvdG9jb2wiLAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJOQVMtSWRlbnRpZmllciIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJOQVMtSVAtQWRkcmVzcyIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJOQVMtSVB2Ni1BZGRyZXNzIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIk5BUy1Qb3J0IiwJCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJOQVMtUG9ydC1JZCIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJOQVMtUG9ydC1UeXBlIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIlNlcnZpY2UtVHlwZSIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJGcmFtZWQtSVAtQWRkcmVzcyIsCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkZyYW1lZC1JUHY2LVByZWZpeCIsCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkZyYW1lZC1JbnRlcmZhY2UtSWQiLAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJDYWxsZWQtU3RhdGlvbi1JZCIsCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkNhbGxpbmctU3RhdGlvbi1JZCIsCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIk9yaWdpbmF0aW5nLUxpbmUtSW5mbyIsCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkFjY3QtU2Vzc2lvbi1JZCIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJBY2N0LU11bHRpLVNlc3Npb24tSWQiLAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJTdGF0ZSIsCQkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiQ2xhc3MiLAkJCQlSVUxFX09QVElPTkFMLCAgIC0xLC0xIH0KKwkJCQkJCQkseyAgIlJlcGx5LU1lc3NhZ2UiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsLTEgfQorCQkJCQkJfTsKKwkJCQorCQkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJSZS1BdXRoLVJlcXVlc3QiLCAmY21kKTsKKwkJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGNtZCApOworCQl9CisJCQorCQkvKiBSZS1BdXRoLUFuc3dlciAqLworCQl7CisJCQkvKgorCQkJCUFkZCBhZGRpdGlvbmFsIHJ1bGVzIG9mIHRoZSBBQk5GIChjb21wYXJlZCB0byBCYXNlIGRlZmluaXRpb24pOgorCQkJCQorCisJCQkJPFJBLUFuc3dlcj4gIDo6PSA8IERpYW1ldGVyIEhlYWRlcjogMjU4LCBQWFkgPgorICAgICAgICAJCQkJICAgICAgIDwgU2Vzc2lvbi1JZCA+CisgICAgICAgIAkJCQkgICAgICAgeyBSZXN1bHQtQ29kZSB9CisgICAgICAgIAkJCQkgICAgICAgeyBPcmlnaW4tSG9zdCB9CisgICAgICAgIAkJCQkgICAgICAgeyBPcmlnaW4tUmVhbG0gfQorICAgICAgICAJCQkJICAgICAgIFsgVXNlci1OYW1lIF0KKyAgICAgICAgCQkJCSAgICAgICBbIE9yaWdpbi1BQUEtUHJvdG9jb2wgXQorICAgICAgICAJCQkJICAgICAgIFsgT3JpZ2luLVN0YXRlLUlkIF0KKyAgICAgICAgCQkJCSAgICAgICBbIEVycm9yLU1lc3NhZ2UgXQorICAgICAgICAJCQkJICAgICAgIFsgRXJyb3ItUmVwb3J0aW5nLUhvc3QgXQorICAgICAgICAJCQkJICAgICAqIFsgRmFpbGVkLUFWUCBdCisgICAgICAgIAkJCQkgICAgICogWyBSZWRpcmVjdGVkLUhvc3QgXQorICAgICAgICAJCQkJICAgICAgIFsgUmVkaXJlY3RlZC1Ib3N0LVVzYWdlIF0KKyAgICAgICAgCQkJCSAgICAgICBbIFJlZGlyZWN0ZWQtSG9zdC1DYWNoZS1UaW1lIF0KKyAgICAgICAgCQkJCSAgICAgICBbIFNlcnZpY2UtVHlwZSBdCisgICAgICAgIAkJCQkgICAgICogWyBDb25maWd1cmF0aW9uLVRva2VuIF0KKyAgICAgICAgCQkJCSAgICAgICBbIElkbGUtVGltZW91dCBdCisgICAgICAgIAkJCQkgICAgICAgWyBBdXRob3JpemF0aW9uLUxpZmV0aW1lIF0KKyAgICAgICAgCQkJCSAgICAgICBbIEF1dGgtR3JhY2UtUGVyaW9kIF0KKyAgICAgICAgCQkJCSAgICAgICBbIFJlLUF1dGgtUmVxdWVzdC1UeXBlIF0KKyAgICAgICAgCQkJCSAgICAgICBbIFN0YXRlIF0KKyAgICAgICAgCQkJCSAgICAgKiBbIENsYXNzIF0KKyAgICAgICAgCQkJCSAgICAgKiBbIFJlcGx5LU1lc3NhZ2UgXQorICAgICAgICAJCQkJICAgICAgIFsgUHJvbXB0IF0KKyAgICAgICAgCQkJCSAgICAgKiBbIFByb3h5LUluZm8gXQorICAgICAgICAJCQkJICAgICAqIFsgQVZQIF0KKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBjbWQ7CisJCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0gCisJCQkJCQl7IAkgeyAgIk9yaWdpbi1BQUEtUHJvdG9jb2wiLAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJTZXJ2aWNlLVR5cGUiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiQ29uZmlndXJhdGlvbi1Ub2tlbiIsCQlSVUxFX09QVElPTkFMLCAgIC0xLC0xIH0KKwkJCQkJCQkseyAgIklkbGUtVGltZW91dCIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJBdXRob3JpemF0aW9uLUxpZmV0aW1lIiwJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiQXV0aC1HcmFjZS1QZXJpb2QiLAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJSZS1BdXRoLVJlcXVlc3QtVHlwZSIsCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIlN0YXRlIiwJCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJDbGFzcyIsCQkJCVJVTEVfT1BUSU9OQUwsICAgLTEsLTEgfQorCQkJCQkJCSx7ICAiUmVwbHktTWVzc2FnZSIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwtMSB9CisJCQkJCQkJLHsgICJQcm9tcHQiLAkJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCX07CisJCQkKKwkJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX0NPTU1BTkQsIENNRF9CWV9OQU1FLCAiUmUtQXV0aC1BbnN3ZXIiLCAmY21kKTsKKwkJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGNtZCApOworCQl9CisJCQorCQkvKiBTZXNzaW9uLVRlcm1pbmF0aW9uLVJlcXVlc3QgKi8KKwkJeworCQkJLyoKKwkJCQlBZGQgYWRkaXRpb25hbCBydWxlcyBvZiB0aGUgQUJORiAoY29tcGFyZWQgdG8gQmFzZSBkZWZpbml0aW9uKToKKwkJCQkKKworCQkJCTxTVC1SZXF1ZXN0PiA6Oj0gPCBEaWFtZXRlciBIZWFkZXI6IDI3NSwgUkVRLCBQWFkgPgorICAgICAgICAJCQkJICAgICAgPCBTZXNzaW9uLUlkID4KKyAgICAgICAgCQkJCSAgICAgIHsgT3JpZ2luLUhvc3QgfQorICAgICAgICAJCQkJICAgICAgeyBPcmlnaW4tUmVhbG0gfQorICAgICAgICAJCQkJICAgICAgeyBEZXN0aW5hdGlvbi1SZWFsbSB9CisgICAgICAgIAkJCQkgICAgICB7IEF1dGgtQXBwbGljYXRpb24tSWQgfQorICAgICAgICAJCQkJICAgICAgeyBUZXJtaW5hdGlvbi1DYXVzZSB9CisgICAgICAgIAkJCQkgICAgICBbIFVzZXItTmFtZSBdCisgICAgICAgIAkJCQkgICAgICBbIERlc3RpbmF0aW9uLUhvc3QgXQorICAgICAgICAJCQkJICAgICogWyBDbGFzcyBdCisgICAgICAgIAkJCQkgICAgICBbIE9yaWdpbi1BQUEtUHJvdG9jb2wgXQorICAgICAgICAJCQkJICAgICAgWyBPcmlnaW4tU3RhdGUtSWQgXQorICAgICAgICAJCQkJICAgICogWyBQcm94eS1JbmZvIF0KKyAgICAgICAgCQkJCSAgICAqIFsgUm91dGUtUmVjb3JkIF0KKyAgICAgICAgCQkJCSAgICAqIFsgQVZQIF0KKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBjbWQ7CisJCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0gCisJCQkJCQl7IAkgeyAgIk9yaWdpbi1BQUEtUHJvdG9jb2wiLAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQl9OworCQkJCisJCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIlNlc3Npb24tVGVybWluYXRpb24tUmVxdWVzdCIsICZjbWQpOworCQkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgY21kICk7CisJCX0KKwkJCisJCS8qIFNlc3Npb24tVGVybWluYXRpb24tQW5zd2VyICovCisJCXsKKwkJCS8qCisJCQkJQWRkIGFkZGl0aW9uYWwgcnVsZXMgb2YgdGhlIEFCTkYgKGNvbXBhcmVkIHRvIEJhc2UgZGVmaW5pdGlvbik6CisJCQkJCisJCQkJPFNULUFuc3dlcj4gIDo6PSA8IERpYW1ldGVyIEhlYWRlcjogMjc1LCBQWFkgPgorICAgICAgICAJCQkJICAgICAgIDwgU2Vzc2lvbi1JZCA+CisgICAgICAgIAkJCQkgICAgICAgeyBSZXN1bHQtQ29kZSB9CisgICAgICAgIAkJCQkgICAgICAgeyBPcmlnaW4tSG9zdCB9CisgICAgICAgIAkJCQkgICAgICAgeyBPcmlnaW4tUmVhbG0gfQorICAgICAgICAJCQkJICAgICAgIFsgVXNlci1OYW1lIF0KKyAgICAgICAgCQkJCSAgICAgKiBbIENsYXNzIF0KKyAgICAgICAgCQkJCSAgICAgICBbIEVycm9yLU1lc3NhZ2UgXQorICAgICAgICAJCQkJICAgICAgIFsgRXJyb3ItUmVwb3J0aW5nLUhvc3QgXQorICAgICAgICAJCQkJICAgICAqIFsgRmFpbGVkLUFWUCBdCisgICAgICAgIAkJCQkgICAgICAgWyBPcmlnaW4tQUFBLVByb3RvY29sIF0KKyAgICAgICAgCQkJCSAgICAgICBbIE9yaWdpbi1TdGF0ZS1JZCBdCisgICAgICAgIAkJCQkgICAgICogWyBSZWRpcmVjdC1Ib3N0IF0KKyAgICAgICAgCQkJCSAgICAgICBbIFJlZGlyZWN0LUhvc3QtVXNhc2UgXQorICAgICAgICAJCQkJICAgICAgIFsgUmVkaXJlY3QtTWF4LUNhY2hlLVRpbWUgXQorICAgICAgICAJCQkJICAgICAqIFsgUHJveHktSW5mbyBdCisgICAgICAgIAkJCQkgICAgICogWyBBVlAgXQorCQkJKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGNtZDsKKwkJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPSAKKwkJCQkJCXsgCSB7ICAiT3JpZ2luLUFBQS1Qcm90b2NvbCIsCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCX07CisJCQkKKwkJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX0NPTU1BTkQsIENNRF9CWV9OQU1FLCAiU2Vzc2lvbi1UZXJtaW5hdGlvbi1BbnN3ZXIiLCAmY21kKTsKKwkJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGNtZCApOworCQl9CisJCQorCQkvKiBBYm9ydC1TZXNzaW9uLVJlcXVlc3QgKi8KKwkJeworCQkJLyoKKwkJCQlBZGQgYWRkaXRpb25hbCBydWxlcyBvZiB0aGUgQUJORiAoY29tcGFyZWQgdG8gQmFzZSBkZWZpbml0aW9uKToKKwkJCQkKKwkJCTxBUy1SZXF1ZXN0PiAgOjo9IDwgRGlhbWV0ZXIgSGVhZGVyOiAyNzQsIFJFUSwgUFhZID4KKyAgICAgICAgCQkJICAgICAgIDwgU2Vzc2lvbi1JZCA+CisgICAgICAgIAkJCSAgICAgICB7IE9yaWdpbi1Ib3N0IH0KKyAgICAgICAgCQkJICAgICAgIHsgT3JpZ2luLVJlYWxtIH0KKyAgICAgICAgCQkJICAgICAgIHsgRGVzdGluYXRpb24tUmVhbG0gfQorICAgICAgICAJCQkgICAgICAgeyBEZXN0aW5hdGlvbi1Ib3N0IH0KKyAgICAgICAgCQkJICAgICAgIHsgQXV0aC1BcHBsaWNhdGlvbi1JZCB9CisgICAgICAgIAkJCSAgICAgICBbIFVzZXItTmFtZSBdCisgICAgICAgIAkJCSAgICAgICBbIE9yaWdpbi1BQUEtUHJvdG9jb2wgXQorICAgICAgICAJCQkgICAgICAgWyBPcmlnaW4tU3RhdGUtSWQgXQorICAgICAgICAJCQkgICAgICAgWyBOQVMtSWRlbnRpZmllciBdCisgICAgICAgIAkJCSAgICAgICBbIE5BUy1JUC1BZGRyZXNzIF0KKyAgICAgICAgCQkJICAgICAgIFsgTkFTLUlQdjYtQWRkcmVzcyBdCisgICAgICAgIAkJCSAgICAgICBbIE5BUy1Qb3J0IF0KKyAgICAgICAgCQkJICAgICAgIFsgTkFTLVBvcnQtSWQgXQorICAgICAgICAJCQkgICAgICAgWyBOQVMtUG9ydC1UeXBlIF0KKyAgICAgICAgCQkJICAgICAgIFsgU2VydmljZS1UeXBlIF0KKyAgICAgICAgCQkJICAgICAgIFsgRnJhbWVkLUlQLUFkZHJlc3MgXQorICAgICAgICAJCQkgICAgICAgWyBGcmFtZWQtSVB2Ni1QcmVmaXggXQorICAgICAgICAJCQkgICAgICAgWyBGcmFtZWQtSW50ZXJmYWNlLUlkIF0KKyAgICAgICAgCQkJICAgICAgIFsgQ2FsbGVkLVN0YXRpb24tSWQgXQorICAgICAgICAJCQkgICAgICAgWyBDYWxsaW5nLVN0YXRpb24tSWQgXQorICAgICAgICAJCQkgICAgICAgWyBPcmlnaW5hdGluZy1MaW5lLUluZm8gXQorICAgICAgICAJCQkgICAgICAgWyBBY2N0LVNlc3Npb24tSWQgXQorICAgICAgICAJCQkgICAgICAgWyBBY2N0LU11bHRpLVNlc3Npb24tSWQgXQorICAgICAgICAJCQkgICAgICAgWyBTdGF0ZSBdCisgICAgICAgIAkJCSAgICAgKiBbIENsYXNzIF0KKyAgICAgICAgCQkJICAgICAqIFsgUmVwbHktTWVzc2FnZSBdCisgICAgICAgIAkJCSAgICAgKiBbIFByb3h5LUluZm8gXQorICAgICAgICAJCQkgICAgICogWyBSb3V0ZS1SZWNvcmQgXQorICAgICAgICAJCQkgICAgICogWyBBVlAgXQorCQkJCSAgICAgCisJCQkqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogY21kOworCQkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9IAorCQkJCQkJeyAJIHsgICJPcmlnaW4tQUFBLVByb3RvY29sIiwJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiTkFTLUlkZW50aWZpZXIiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiTkFTLUlQLUFkZHJlc3MiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiTkFTLUlQdjYtQWRkcmVzcyIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJOQVMtUG9ydCIsCQkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiTkFTLVBvcnQtSWQiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiTkFTLVBvcnQtVHlwZSIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJTZXJ2aWNlLVR5cGUiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiRnJhbWVkLUlQLUFkZHJlc3MiLAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJGcmFtZWQtSVB2Ni1QcmVmaXgiLAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJGcmFtZWQtSW50ZXJmYWNlLUlkIiwJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiQ2FsbGVkLVN0YXRpb24tSWQiLAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJDYWxsaW5nLVN0YXRpb24tSWQiLAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJPcmlnaW5hdGluZy1MaW5lLUluZm8iLAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJBY2N0LVNlc3Npb24tSWQiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiQWNjdC1NdWx0aS1TZXNzaW9uLUlkIiwJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiU3RhdGUiLAkJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkNsYXNzIiwJCQkJUlVMRV9PUFRJT05BTCwgICAtMSwtMSB9CisJCQkJCQkJLHsgICJSZXBseS1NZXNzYWdlIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLC0xIH0KKwkJCQkJCX07CisJCQkKKwkJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX0NPTU1BTkQsIENNRF9CWV9OQU1FLCAiQWJvcnQtU2Vzc2lvbi1SZXF1ZXN0IiwgJmNtZCk7CisJCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBjbWQgKTsKKwkJfQorCQkKKwkJLyogQWJvcnQtU2Vzc2lvbi1BbnN3ZXIgKi8KKwkJeworCQkJLyoKKwkJCQlBZGQgYWRkaXRpb25hbCBydWxlcyBvZiB0aGUgQUJORiAoY29tcGFyZWQgdG8gQmFzZSBkZWZpbml0aW9uKToKKworCQkJCTxBUy1BbnN3ZXI+ICA6Oj0gPCBEaWFtZXRlciBIZWFkZXI6IDI3NCwgUFhZID4KKyAgICAgICAgCQkJCSAgICAgICA8IFNlc3Npb24tSWQgPgorICAgICAgICAJCQkJICAgICAgIHsgUmVzdWx0LUNvZGUgfQorICAgICAgICAJCQkJICAgICAgIHsgT3JpZ2luLUhvc3QgfQorICAgICAgICAJCQkJICAgICAgIHsgT3JpZ2luLVJlYWxtIH0KKyAgICAgICAgCQkJCSAgICAgICBbIFVzZXItTmFtZSBdCisgICAgICAgIAkJCQkgICAgICAgWyBPcmlnaW4tQUFBLVByb3RvY29sIF0KKyAgICAgICAgCQkJCSAgICAgICBbIE9yaWdpbi1TdGF0ZS1JZCBdCisgICAgICAgIAkJCQkgICAgICAgWyBTdGF0ZV0KKyAgICAgICAgCQkJCSAgICAgICBbIEVycm9yLU1lc3NhZ2UgXQorICAgICAgICAJCQkJICAgICAgIFsgRXJyb3ItUmVwb3J0aW5nLUhvc3QgXQorICAgICAgICAJCQkJICAgICAqIFsgRmFpbGVkLUFWUCBdCisgICAgICAgIAkJCQkgICAgICogWyBSZWRpcmVjdGVkLUhvc3QgXQorICAgICAgICAJCQkJICAgICAgIFsgUmVkaXJlY3RlZC1Ib3N0LVVzYWdlIF0KKyAgICAgICAgCQkJCSAgICAgICBbIFJlZGlyZWN0ZWQtTWF4LUNhY2hlLVRpbWUgXQorICAgICAgICAJCQkJICAgICAqIFsgUHJveHktSW5mbyBdCisgICAgICAgIAkJCQkgICAgICogWyBBVlAgXQorCQkJKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGNtZDsKKwkJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPSAKKwkJCQkJCXsgCSB7ICAiT3JpZ2luLUFBQS1Qcm90b2NvbCIsCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIlN0YXRlIiwgCQkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJfTsKKwkJCQorCQkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJBYm9ydC1TZXNzaW9uLUFuc3dlciIsICZjbWQpOworCQkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgY21kICk7CisJCX0KKwkJCisJCS8qIEFjY291bnRpbmctUmVxdWVzdCAqLworCQl7CisJCQkvKgorCQkJCUFkZCBhZGRpdGlvbmFsIHJ1bGVzIG9mIHRoZSBBQk5GIChjb21wYXJlZCB0byBCYXNlIGRlZmluaXRpb24pOgorCisJCQkJPEFDLVJlcXVlc3Q+IDo6PSA8IERpYW1ldGVyIEhlYWRlcjogMjcxLCBSRVEsIFBYWSA+CisgICAgICAgIAkJCQkgICAgICA8IFNlc3Npb24tSWQgPgorICAgICAgICAJCQkJICAgICAgeyBPcmlnaW4tSG9zdCB9CisgICAgICAgIAkJCQkgICAgICB7IE9yaWdpbi1SZWFsbSB9CisgICAgICAgIAkJCQkgICAgICB7IERlc3RpbmF0aW9uLVJlYWxtIH0KKyAgICAgICAgCQkJCSAgICAgIHsgQWNjb3VudGluZy1SZWNvcmQtVHlwZSB9CisgICAgICAgIAkJCQkgICAgICB7IEFjY291bnRpbmctUmVjb3JkLU51bWJlciB9CisgICAgICAgIAkJCQkgICAgICBbIEFjY3QtQXBwbGljYXRpb24tSWQgXQorICAgICAgICAJCQkJICAgICAgWyBWZW5kb3ItU3BlY2lmaWMtQXBwbGljYXRpb24tSWQgXQorICAgICAgICAJCQkJICAgICAgWyBVc2VyLU5hbWUgXQorICAgICAgICAJCQkJICAgICAgWyBBY2NvdW50aW5nLVN1Yi1TZXNzaW9uLUlkIF0KKyAgICAgICAgCQkJCSAgICAgIFsgQWNjdC1TZXNzaW9uLUlkIF0KKyAgICAgICAgCQkJCSAgICAgIFsgQWNjdC1NdWx0aS1TZXNzaW9uLUlkIF0KKyAgICAgICAgCQkJCSAgICAgIFsgT3JpZ2luLUFBQS1Qcm90b2NvbCBdCisgICAgICAgIAkJCQkgICAgICBbIE9yaWdpbi1TdGF0ZS1JZCBdCisgICAgICAgIAkJCQkgICAgICBbIERlc3RpbmF0aW9uLUhvc3QgXQorICAgICAgICAJCQkJICAgICAgWyBFdmVudC1UaW1lc3RhbXAgXQorICAgICAgICAJCQkJICAgICAgWyBBY2N0LURlbGF5LVRpbWUgXQorICAgICAgICAJCQkJICAgICAgWyBOQVMtSWRlbnRpZmllciBdCisgICAgICAgIAkJCQkgICAgICBbIE5BUy1JUC1BZGRyZXNzIF0KKyAgICAgICAgCQkJCSAgICAgIFsgTkFTLUlQdjYtQWRkcmVzcyBdCisgICAgICAgIAkJCQkgICAgICBbIE5BUy1Qb3J0IF0KKyAgICAgICAgCQkJCSAgICAgIFsgTkFTLVBvcnQtSWQgXQorICAgICAgICAJCQkJICAgICAgWyBOQVMtUG9ydC1UeXBlIF0KKyAgICAgICAgCQkJCSAgICAqIFsgQ2xhc3MgXQorICAgICAgICAJCQkJICAgICAgWyBTZXJ2aWNlLVR5cGUgXQorICAgICAgICAJCQkJICAgICAgWyBUZXJtaW5hdGlvbi1DYXVzZSBdCisgICAgICAgIAkJCQkgICAgICBbIEFjY291bnRpbmctSW5wdXQtT2N0ZXRzIF0KKyAgICAgICAgCQkJCSAgICAgIFsgQWNjb3VudGluZy1JbnB1dC1QYWNrZXRzIF0KKyAgICAgICAgCQkJCSAgICAgIFsgQWNjb3VudGluZy1PdXRwdXQtT2N0ZXRzIF0KKyAgICAgICAgCQkJCSAgICAgIFsgQWNjb3VudGluZy1PdXRwdXQtUGFja2V0cyBdCisgICAgICAgIAkJCQkgICAgICBbIEFjY3QtQXV0aGVudGljIF0KKyAgICAgICAgCQkJCSAgICAgIFsgQWNjb3VudGluZy1BdXRoLU1ldGhvZCBdCisgICAgICAgIAkJCQkgICAgICBbIEFjY3QtTGluay1Db3VudCBdCisgICAgICAgIAkJCQkgICAgICBbIEFjY3QtU2Vzc2lvbi1UaW1lIF0KKyAgICAgICAgCQkJCSAgICAgIFsgQWNjdC1UdW5uZWwtQ29ubmVjdGlvbiBdCisgICAgICAgIAkJCQkgICAgICBbIEFjY3QtVHVubmVsLVBhY2tldHMtTG9zdCBdCisgICAgICAgIAkJCQkgICAgICBbIENhbGxiYWNrLUlkIF0KKyAgICAgICAgCQkJCSAgICAgIFsgQ2FsbGJhY2stTnVtYmVyIF0KKyAgICAgICAgCQkJCSAgICAgIFsgQ2FsbGVkLVN0YXRpb24tSWQgXQorICAgICAgICAJCQkJICAgICAgWyBDYWxsaW5nLVN0YXRpb24tSWQgXQorICAgICAgICAJCQkJICAgICogWyBDb25uZWN0aW9uLUluZm8gXQorICAgICAgICAJCQkJICAgICAgWyBPcmlnaW5hdGluZy1MaW5lLUluZm8gXQorICAgICAgICAJCQkJICAgICAgWyBBdXRob3JpemF0aW9uLUxpZmV0aW1lIF0KKyAgICAgICAgCQkJCSAgICAgIFsgU2Vzc2lvbi1UaW1lb3V0IF0KKyAgICAgICAgCQkJCSAgICAgIFsgSWRsZS1UaW1lb3V0IF0KKyAgICAgICAgCQkJCSAgICAgIFsgUG9ydC1MaW1pdCBdCisgICAgICAgIAkJCQkgICAgICBbIEFjY291bnRpbmctUmVhbHRpbWUtUmVxdWlyZWQgXQorICAgICAgICAJCQkJICAgICAgWyBBY2N0LUludGVyaW0tSW50ZXJ2YWwgXQorICAgICAgICAJCQkJICAgICogWyBGaWx0ZXItSWQgXQorICAgICAgICAJCQkJICAgICogWyBOQVMtRmlsdGVyLVJ1bGUgXQorICAgICAgICAJCQkJICAgICogWyBRb3MtRmlsdGVyLVJ1bGUgXQorICAgICAgICAJCQkJICAgICAgWyBGcmFtZWQtQXBwbGVUYWxrLUxpbmsgXQorICAgICAgICAJCQkJICAgICAgWyBGcmFtZWQtQXBwbGVUYWxrLU5ldHdvcmsgXQorICAgICAgICAJCQkJICAgICAgWyBGcmFtZWQtQXBwbGVUYWxrLVpvbmUgXQorICAgICAgICAJCQkJICAgICAgWyBGcmFtZWQtQ29tcHJlc3Npb24gXQorICAgICAgICAJCQkJICAgICAgWyBGcmFtZWQtSW50ZXJmYWNlLUlkIF0KKyAgICAgICAgCQkJCSAgICAgIFsgRnJhbWVkLUlQLUFkZHJlc3MgXQorICAgICAgICAJCQkJICAgICAgWyBGcmFtZWQtSVAtTmV0bWFzayBdCisgICAgICAgIAkJCQkgICAgKiBbIEZyYW1lZC1JUHY2LVByZWZpeCBdCisgICAgICAgIAkJCQkgICAgICBbIEZyYW1lZC1JUHY2LVBvb2wgXQorICAgICAgICAJCQkJICAgICogWyBGcmFtZWQtSVB2Ni1Sb3V0ZSBdCisgICAgICAgIAkJCQkgICAgICBbIEZyYW1lZC1JUFgtTmV0d29yayBdCisgICAgICAgIAkJCQkgICAgICBbIEZyYW1lZC1NVFUgXQorICAgICAgICAJCQkJICAgICAgWyBGcmFtZWQtUG9vbCBdCisgICAgICAgIAkJCQkgICAgICBbIEZyYW1lZC1Qcm90b2NvbCBdCisgICAgICAgIAkJCQkgICAgKiBbIEZyYW1lZC1Sb3V0ZSBdCisgICAgICAgIAkJCQkgICAgICBbIEZyYW1lZC1Sb3V0aW5nIF0KKyAgICAgICAgCQkJCSAgICAqIFsgTG9naW4tSVAtSG9zdCBdCisgICAgICAgIAkJCQkgICAgKiBbIExvZ2luLUlQdjYtSG9zdCBdCisgICAgICAgIAkJCQkgICAgICBbIExvZ2luLUxBVC1Hcm91cCBdCisgICAgICAgIAkJCQkgICAgICBbIExvZ2luLUxBVC1Ob2RlIF0KKyAgICAgICAgCQkJCSAgICAgIFsgTG9naW4tTEFULVBvcnQgXQorICAgICAgICAJCQkJICAgICAgWyBMb2dpbi1MQVQtU2VydmljZSBdCisgICAgICAgIAkJCQkgICAgICBbIExvZ2luLVNlcnZpY2UgXQorICAgICAgICAJCQkJICAgICAgWyBMb2dpbi1UQ1AtUG9ydCBdCisgICAgICAgIAkJCQkgICAgKiBbIFR1bm5lbGluZyBdCisgICAgICAgIAkJCQkgICAgKiBbIFByb3h5LUluZm8gXQorICAgICAgICAJCQkJICAgICogWyBSb3V0ZS1SZWNvcmQgXQorICAgICAgICAJCQkJICAgICogWyBBVlAgXQorCQkJKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGNtZDsKKwkJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPSAKKwkJCQkJCXsgCSB7ICAiT3JpZ2luLUFBQS1Qcm90b2NvbCIsCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkFjY3QtRGVsYXktVGltZSIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJOQVMtSWRlbnRpZmllciIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJOQVMtSVAtQWRkcmVzcyIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJOQVMtSVB2Ni1BZGRyZXNzIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIk5BUy1Qb3J0IiwJCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJOQVMtUG9ydC1JZCIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJOQVMtUG9ydC1UeXBlIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkNsYXNzIiwJCQkJUlVMRV9PUFRJT05BTCwgICAtMSwtMSB9CisJCQkJCQkJLHsgICJTZXJ2aWNlLVR5cGUiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiVGVybWluYXRpb24tQ2F1c2UiLAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJBY2NvdW50aW5nLUlucHV0LU9jdGV0cyIsCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkFjY291bnRpbmctSW5wdXQtUGFja2V0cyIsCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkFjY291bnRpbmctT3V0cHV0LU9jdGV0cyIsCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkFjY291bnRpbmctT3V0cHV0LVBhY2tldHMiLAlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkFjY3QtQXV0aGVudGljIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkFjY291bnRpbmctQXV0aC1NZXRob2QiLAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJBY2N0LUxpbmstQ291bnQiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiQWNjdC1TZXNzaW9uLVRpbWUiLAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJBY2N0LVR1bm5lbC1Db25uZWN0aW9uIiwJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiQWNjdC1UdW5uZWwtUGFja2V0cy1Mb3N0IiwJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiQ2FsbGJhY2stSWQiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiQ2FsbGJhY2stTnVtYmVyIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkNhbGxlZC1TdGF0aW9uLUlkIiwJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiQ2FsbGluZy1TdGF0aW9uLUlkIiwJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiQ29ubmVjdC1JbmZvIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLC0xIH0KKwkJCQkJCQkseyAgIk9yaWdpbmF0aW5nLUxpbmUtSW5mbyIsCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkF1dGhvcml6YXRpb24tTGlmZXRpbWUiLAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJTZXNzaW9uLVRpbWVvdXQiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiSWRsZS1UaW1lb3V0IiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIlBvcnQtTGltaXQiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiRmlsdGVyLUlkIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLC0xIH0KKwkJCQkJCQkseyAgIk5BUy1GaWx0ZXItUnVsZSIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwtMSB9CisJCQkJCQkJLHsgICJRb1MtRmlsdGVyLVJ1bGUiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsLTEgfQorCQkJCQkJCSx7ICAiRnJhbWVkLUFwcGxlVGFsay1MaW5rIiwJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiRnJhbWVkLUFwcGxlVGFsay1OZXR3b3JrIiwJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiRnJhbWVkLUFwcGxlVGFsay1ab25lIiwJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiRnJhbWVkLUNvbXByZXNzaW9uIiwJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiRnJhbWVkLUludGVyZmFjZS1JZCIsCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkZyYW1lZC1JUC1BZGRyZXNzIiwJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiRnJhbWVkLUlQdjYtUHJlZml4IiwJCVJVTEVfT1BUSU9OQUwsICAgLTEsLTEgfQorCQkJCQkJCSx7ICAiRnJhbWVkLUlQdjYtUG9vbCIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJGcmFtZWQtSVB2Ni1Sb3V0ZSIsCQlSVUxFX09QVElPTkFMLCAgIC0xLC0xIH0KKwkJCQkJCQkseyAgIkZyYW1lZC1JUC1OZXRtYXNrIiwJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiRnJhbWVkLVJvdXRlIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLC0xIH0KKwkJCQkJCQkseyAgIkZyYW1lZC1Qb29sIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkZyYW1lZC1JUFgtTmV0d29yayIsCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkZyYW1lZC1NVFUiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiRnJhbWVkLVByb3RvY29sIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkZyYW1lZC1Sb3V0aW5nIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkxvZ2luLUlQLUhvc3QiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsLTEgfQorCQkJCQkJCSx7ICAiTG9naW4tSVB2Ni1Ib3N0IiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLC0xIH0KKwkJCQkJCQkseyAgIkxvZ2luLUxBVC1Hcm91cCIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJMb2dpbi1MQVQtTm9kZSIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJMb2dpbi1MQVQtUG9ydCIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJMb2dpbi1MQVQtU2VydmljZSIsCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkxvZ2luLVNlcnZpY2UiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiTG9naW4tVENQLVBvcnQiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiVHVubmVsaW5nIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLC0xIH0KKwkJCQkJCX07CisJCQkKKwkJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX0NPTU1BTkQsIENNRF9CWV9OQU1FLCAiQWNjb3VudGluZy1SZXF1ZXN0IiwgJmNtZCk7CisJCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBjbWQgKTsKKwkJfQorCQkKKwkJLyogQWNjb3VudGluZy1BbnN3ZXIgKi8KKwkJeworCQkJLyoKKwkJCQlBZGQgYWRkaXRpb25hbCBydWxlcyBvZiB0aGUgQUJORiAoY29tcGFyZWQgdG8gQmFzZSBkZWZpbml0aW9uKToKKworCQkJCTxBQy1BbnN3ZXI+IDo6PSA8IERpYW1ldGVyIEhlYWRlcjogMjcxLCBQWFkgPgorICAgICAgICAJCQkJICAgICAgPCBTZXNzaW9uLUlkID4KKyAgICAgICAgCQkJCSAgICAgIHsgUmVzdWx0LUNvZGUgfQorICAgICAgICAJCQkJICAgICAgeyBPcmlnaW4tSG9zdCB9CisgICAgICAgIAkJCQkgICAgICB7IE9yaWdpbi1SZWFsbSB9CisgICAgICAgIAkJCQkgICAgICB7IEFjY291bnRpbmctUmVjb3JkLVR5cGUgfQorICAgICAgICAJCQkJICAgICAgeyBBY2NvdW50aW5nLVJlY29yZC1OdW1iZXIgfQorICAgICAgICAJCQkJICAgICAgWyBBY2N0LUFwcGxpY2F0aW9uLUlkIF0KKyAgICAgICAgCQkJCSAgICAgIFsgVmVuZG9yLVNwZWNpZmljLUFwcGxpY2F0aW9uLUlkIF0KKyAgICAgICAgCQkJCSAgICAgIFsgVXNlci1OYW1lIF0KKyAgICAgICAgCQkJCSAgICAgIFsgQWNjb3VudGluZy1TdWItU2Vzc2lvbi1JZCBdCisgICAgICAgIAkJCQkgICAgICBbIEFjY3QtU2Vzc2lvbi1JZCBdCisgICAgICAgIAkJCQkgICAgICBbIEFjY3QtTXVsdGktU2Vzc2lvbi1JZCBdCisgICAgICAgIAkJCQkgICAgICBbIEV2ZW50LVRpbWVzdGFtcCBdCisgICAgICAgIAkJCQkgICAgICBbIEVycm9yLU1lc3NhZ2UgXQorICAgICAgICAJCQkJICAgICAgWyBFcnJvci1SZXBvcnRpbmctSG9zdCBdCisgICAgICAgIAkJCQkgICAgKiBbIEZhaWxlZC1BVlAgXQorICAgICAgICAJCQkJICAgICAgWyBPcmlnaW4tQUFBLVByb3RvY29sIF0KKyAgICAgICAgCQkJCSAgICAgIFsgT3JpZ2luLVN0YXRlLUlkIF0KKyAgICAgICAgCQkJCSAgICAgIFsgTkFTLUlkZW50aWZpZXIgXQorICAgICAgICAJCQkJICAgICAgWyBOQVMtSVAtQWRkcmVzcyBdCisgICAgICAgIAkJCQkgICAgICBbIE5BUy1JUHY2LUFkZHJlc3MgXQorICAgICAgICAJCQkJICAgICAgWyBOQVMtUG9ydCBdCisgICAgICAgIAkJCQkgICAgICBbIE5BUy1Qb3J0LUlkIF0KKyAgICAgICAgCQkJCSAgICAgIFsgTkFTLVBvcnQtVHlwZSBdCisgICAgICAgIAkJCQkgICAgICBbIFNlcnZpY2UtVHlwZSBdCisgICAgICAgIAkJCQkgICAgICBbIFRlcm1pbmF0aW9uLUNhdXNlIF0KKyAgICAgICAgCQkJCSAgICAgIFsgQWNjb3VudGluZy1SZWFsdGltZS1SZXF1aXJlZCBdCisgICAgICAgIAkJCQkgICAgICBbIEFjY3QtSW50ZXJpbS1JbnRlcnZhbCBdCisgICAgICAgIAkJCQkgICAgKiBbIENsYXNzIF0KKyAgICAgICAgCQkJCSAgICAqIFsgUHJveHktSW5mbyBdCisgICAgICAgIAkJCQkgICAgKiBbIFJvdXRlLVJlY29yZCBdCisgICAgICAgIAkJCQkgICAgKiBbIEFWUCBdCisKKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBjbWQ7CisJCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0gCisJCQkJCQl7IAkgeyAgIk9yaWdpbi1BQUEtUHJvdG9jb2wiLAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJOQVMtSWRlbnRpZmllciIsIAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiTkFTLUlQLUFkZHJlc3MiLCAJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIk5BUy1JUHY2LUFkZHJlc3MiLCAJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiTkFTLVBvcnQiLCAJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIk5BUy1Qb3J0LUlkIiwgCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJOQVMtUG9ydC1UeXBlIiwgCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJTZXJ2aWNlLVR5cGUiLCAJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIlRlcm1pbmF0aW9uLUNhdXNlIiwgCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCX07CisJCQkKKwkJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX0NPTU1BTkQsIENNRF9CWV9OQU1FLCAiQWNjb3VudGluZy1BbnN3ZXIiLCAmY21kKTsKKwkJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGNtZCApOworCQl9CisJfQorCQorCUxPR19EKCAiRXh0ZW5zaW9uICdEaWN0aW9uYXJ5IGRlZmluaXRpb25zIGZvciBOQVNSRVEnIGluaXRpYWxpemVkIik7CisJcmV0dXJuIDA7Cit9CisKK0VYVEVOU0lPTl9FTlRSWSgiZGljdF9uYXNyZXEiLCBkbnJfZW50cnkpOwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X3JmYzQwMDRfYXZwcy9DTWFrZUxpc3RzLnR4dCBiL2V4dGVuc2lvbnMvZGljdF9yZmM0MDA0X2F2cHMvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNiNjkzNgotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF9yZmM0MDA0X2F2cHMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxNiBAQAorIyBUaGUgZGljdF9yZmM0MDA0X2F2cHMgZXh0ZW5zaW9uCitQUk9KRUNUKCJkaWN0X3JmYzQwMDRfYXZwcyBsaWJyYXJ5IGdlbmVyYXRlZCBieSBGZEdlbiAiIEMpCisKKyMgQ29tcGlsZSBhcyBhIG1vZHVsZQorRkRfQUREX0VYVEVOU0lPTihkaWN0X3JmYzQwMDRfYXZwcyBkaWN0X3JmYzQwMDRfYXZwcy5jKQorCisKKyMjIyMKKyMjIElOU1RBTEwgc2VjdGlvbiAjIworCitJTlNUQUxMKFRBUkdFVFMgZGljdF9yZmM0MDA0X2F2cHMKKwlMSUJSQVJZIERFU1RJTkFUSU9OICR7SU5TVEFMTF9FWFRFTlNJT05TX1NVRkZJWH0KK0NPTVBPTkVOVCBmcmVlRGlhbWV0ZXItZGljdGlvbmFyeS1SRkM0MDA0X0FWUFMpCisKKworCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfcmZjNDAwNF9hdnBzL2RpY3RfcmZjNDAwNF9hdnBzLmMgYi9leHRlbnNpb25zL2RpY3RfcmZjNDAwNF9hdnBzL2RpY3RfcmZjNDAwNF9hdnBzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAzMGM0MgotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF9yZmM0MDA0X2F2cHMvZGljdF9yZmM0MDA0X2F2cHMuYwpAQCAtMCwwICsxLDY1NSBAQAorLyoKKyogQ29weXJpZ2h0IChjKSAyMDE3IFNwcmludAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvKioqKioqKioqKioqKioqKgorIEdlbmVyYXRlZCBCeTogZmR0b29sIGVuaGFuY2VtZW50cyB0byBkaWFmdXp6ZXIKKyBMaWNlbnNlOiBzYW1lIGFzIGZyZWVEaWFtZXRlcgorKioqKioqKioqKioqKioqKi8KKworCisvKiAKKyAqIERpY3Rpb25hcnkgZGVmaW5pdGlvbnMgb2Ygb2JqZWN0cyBzcGVjaWZpZWQgaW4gcmZjNDAwNF9hdnBzLgorICovCisjaW5jbHVkZSA8ZnJlZURpYW1ldGVyL2V4dGVuc2lvbi5oPgorCisjZGVmaW5lIFBST1RPX1ZFUiAidW5zcGVjaWZpZWQiCisjZGVmaW5lIEdFTl9EQVRFICAxNTA2Njk3MTQzLjQzCisKK2NvbnN0IGNoYXIgKnJmYzQwMDRfYXZwc19wcm90b192ZXIgPSBQUk9UT19WRVI7Citjb25zdCBkb3VibGUgcmZjNDAwNF9hdnBzX2dlbl9kYXRlID0gR0VOX0RBVEU7CisKKy8qIFRoZSBjb250ZW50IG9mIHRoaXMgZmlsZSBmb2xsb3dzIHRoZSBzYW1lIHN0cnVjdHVyZSBhcyBkaWN0X2Jhc2VfcHJvdG8uYyAqLworCisjZGVmaW5lIENIRUNLX2RpY3RfbmV3KCBfdHlwZSwgX2RhdGEsIF9wYXJlbnQsIF9yZWYgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IF9yZXQgPSBmZF9kaWN0X25ldyggZmRfZ19jb25maWctPmNuZl9kaWN0LCAoX3R5cGUpLCAoX2RhdGEpLCAoX3BhcmVudCksIChfcmVmKSApOyBcCisgICAgaWYgKCBfcmV0ICE9IDAgJiYgX3JldCAhPSBFRVhJU1QgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgcmV0dXJuIF9yZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgQ0hFQ0tfZGljdF9zZWFyY2goIF90eXBlLCBfY3JpdGVyaWEsIF93aGF0LCBfcmVzdWx0ICkJCVwKKyAgICBDSEVDS19GQ1QoICBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCAoX3R5cGUpLCAoX2NyaXRlcmlhKSwgKF93aGF0KSwgKF9yZXN1bHQpLCBFTk9FTlQpICk7CisKK3N0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHsKKyAgICBzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZTsKKyAgICBlbnVtIHJ1bGVfcG9zaXRpb24JcG9zaXRpb247CisgICAgaW50IAkJCW1pbjsKKyAgICBpbnQJCQltYXg7Cit9OworCisjZGVmaW5lIFJVTEVfT1JERVIoIF9wb3NpdGlvbiApICgoKChfcG9zaXRpb24pID09IFJVTEVfRklYRURfSEVBRCkgfHwgKChfcG9zaXRpb24pID09IFJVTEVfRklYRURfVEFJTCkpID8gMSA6IDAgKQorCisvKiBBdHRlbnRpb24hIFRoaXMgdmVyc2lvbiBvZiB0aGUgbWFjcm8gdXNlcyBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCBpbiBjb250cmFzdCB0byBtb3N0IG90aGVyIGNvcGllcyEgKi8KKyNkZWZpbmUgUEFSU0VfbG9jX3J1bGVzKCBfcnVsZWFycmF5LCBfcGFyZW50KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgX19hcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoX19hcj0wOyBfX2FyIDwgc2l6ZW9mKF9ydWxlYXJyYXkpIC8gc2l6ZW9mKChfcnVsZWFycmF5KVswXSk7IF9fYXIrKykgeyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgZGljdF9ydWxlX2RhdGEgX19kYXRhID0geyBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLnBvc2l0aW9uLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5taW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLm1heH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgX19kYXRhLnJ1bGVfb3JkZXIgPSBSVUxFX09SREVSKF9fZGF0YS5ydWxlX3Bvc2l0aW9uKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBDSEVDS19GQ1QoICBmZF9kaWN0X3NlYXJjaCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgZmRfZ19jb25maWctPmNuZl9kaWN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBESUNUX0FWUCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgJihfcnVsZWFycmF5KVtfX2FyXS5hdnBfdmVuZG9yX3BsdXNfbmFtZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAmX19kYXRhLnJ1bGVfYXZwLCAwICkgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpZiAoICFfX2RhdGEucnVsZV9hdnAgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfREVCVUcoSU5GTywgIkFWUCBOb3QgZm91bmQ6ICclcyciLCAoX3J1bGVhcnJheSlbX19hcl0uYXZwX3ZlbmRvcl9wbHVzX25hbWUuYXZwX25hbWUpOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRU5PRU5UOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IF9yZXQgPSBmZF9kaWN0X25ldyggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1JVTEUsICYoX19kYXRhKSwgKF9wYXJlbnQpLCBOVUxMICk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIF9yZXQgIT0gMCAmJiBfcmV0ICE9IEVFWElTVCApICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9ERUJVRyhJTkZPLCAiRXJyb3Igb24gcnVsZSB3aXRoIEFWUCAnJXMnIiwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5hdnBfdmVuZG9yX3BsdXNfbmFtZS5hdnBfbmFtZSk7ICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVJTlZBTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIENIRUNLX3ZlbmRvcl9uZXcoIF9kYXRhICkgeyBcCisgICAgICAgIHN0cnVjdCBkaWN0X29iamVjdCAqIHZlbmRvcl9mb3VuZDsgXAorICAgICAgICBpZiAoZmRfZGljdF9zZWFyY2goZmRfZ19jb25maWctPmNuZl9kaWN0LERJQ1RfVkVORE9SLFZFTkRPUl9CWV9JRCwmX2RhdGEudmVuZG9yX2lkLCZ2ZW5kb3JfZm91bmQsRU5PRU5UKSA9PSBFTk9FTlQpIHsgXAorICAgICAgICAgICAgICAgIENIRUNLX0ZDVChmZF9kaWN0X25ldyhmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfVkVORE9SLCAmX2RhdGEsIE5VTEwsIE5VTEwpKTsgXAorICAgICAgICB9IFwKK30KKworI2RlZmluZSBlbnVtdmFsX2RlZl91MzIoIF92YWxfLCBfc3RyXyApCQlcCisgICAgeyBfc3RyXywgCQl7IC51MzIgPSBfdmFsXyB9fQorCisjZGVmaW5lIGVudW12YWxfZGVmX29zKCBfbGVuXywgX3ZhbF8sIF9zdHJfICkJCQkJXAorICAgIHsgX3N0cl8sIAkJeyAub3MgPSB7IC5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilfdmFsXywgLmxlbiA9IF9sZW5fIH19fQorCisKK3N0YXRpYyBpbnQgZGljdF9yZmM0MDA0X2F2cHNfbG9hZF9kZWZzKGNoYXIgKiBjb25mZmlsZSkKK3sKKyAgIFRSQUNFX0VOVFJZKCIlcCIsIGNvbmZmaWxlKTsKKworICAgLyogQVZQIHNlY3Rpb24gKi8KKyAgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogQWRkcmVzc190eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBVVEY4U3RyaW5nX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIERpYW1ldGVySWRlbnRpdHlfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogRGlhbWV0ZXJVUklfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogVGltZV90eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBJUEZpbHRlclJ1bGVfdHlwZTsKKworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJBZGRyZXNzIiwgJkFkZHJlc3NfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIlVURjhTdHJpbmciLCAmVVRGOFN0cmluZ190eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiRGlhbWV0ZXJJZGVudGl0eSIsICZEaWFtZXRlcklkZW50aXR5X3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJEaWFtZXRlclVSSSIsICZEaWFtZXRlclVSSV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiVGltZSIsICZUaW1lX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJJUEZpbHRlclJ1bGUiLCAmSVBGaWx0ZXJSdWxlX3R5cGUpOworCQkvKiBNSVAtUmVnLVJlcXVlc3QgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzMjAsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiTUlQLVJlZy1SZXF1ZXN0IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogTUlQLVJlZy1SZXBseSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTMyMSwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJNSVAtUmVnLVJlcGx5IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogTUlQLU1vYmlsZS1Ob2RlLUFkZHJlc3MgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzMzMsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiTUlQLU1vYmlsZS1Ob2RlLUFkZHJlc3MiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIEFkZHJlc3NfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIE1JUC1Ib21lLUFnZW50LUFkZHJlc3MgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzMzQsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiTUlQLUhvbWUtQWdlbnQtQWRkcmVzcyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgQWRkcmVzc190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogTUlQLUNhbmRpZGF0ZS1Ib21lLUFnZW50LUhvc3QgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzMzYsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiTUlQLUNhbmRpZGF0ZS1Ib21lLUFnZW50LUhvc3QiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIERpYW1ldGVySWRlbnRpdHlfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIE1JUC1GZWF0dXJlLVZlY3RvciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTMzNywJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJNSVAtRmVhdHVyZS1WZWN0b3IiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIE1JUC1BdXRoLUlucHV0LURhdGEtTGVuZ3RoICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzM4LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIk1JUC1BdXRoLUlucHV0LURhdGEtTGVuZ3RoIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBNSVAtQXV0aGVudGljYXRvci1MZW5ndGggKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzMzksCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiTUlQLUF1dGhlbnRpY2F0b3ItTGVuZ3RoIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBNSVAtQXV0aGVudGljYXRvci1PZmZzZXQgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzNDAsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiTUlQLUF1dGhlbnRpY2F0b3ItT2Zmc2V0IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBNSVAtTU4tQUFBLVNQSSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM0MSwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJNSVAtTU4tQUFBLVNQSSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogTUlQLUZpbHRlci1SdWxlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzQyLAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIk1JUC1GaWx0ZXItUnVsZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgSVBGaWx0ZXJSdWxlX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBNSVAtRkEtQ2hhbGxlbmdlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzQ0LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIk1JUC1GQS1DaGFsbGVuZ2UiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBNSVAtSG9tZS1BZ2VudC1Ib3N0ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzQ4LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIk1JUC1Ib21lLUFnZW50LUhvc3QiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIERpYW1ldGVySWRlbnRpdHlfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIE1JUC1GQS10by1IQS1TUEkgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzMTgsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiTUlQLUZBLXRvLUhBLVNQSSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogTUlQLUZBLXRvLU1OLVNQSSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTMxOSwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJNSVAtRkEtdG8tTU4tU1BJIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBNSVAtSEEtdG8tRkEtU1BJICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzIzLAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIk1JUC1IQS10by1GQS1TUEkiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIE1JUC1Ob25jZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTMzNSwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJNSVAtTm9uY2UiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBNSVAtU2Vzc2lvbi1LZXkgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzNDMsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiTUlQLVNlc3Npb24tS2V5IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogTUlQLUFsZ29yaXRobS1UeXBlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzQ1LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIk1JUC1BbGdvcml0aG0tVHlwZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICJFbnVtZXJhdGVkKE1JUC1BbGdvcml0aG0tVHlwZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIkhNQUMtU0hBLTEiLCB7IC5pMzI9MiB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIE1JUC1SZXBsYXktTW9kZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM0NiwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJNSVAtUmVwbGF5LU1vZGUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiRW51bWVyYXRlZChNSVAtUmVwbGF5LU1vZGUpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJOb25lIiwgeyAuaTMyPTEgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIlRpbWVzdGFtcHMiLCB7IC5pMzI9MiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAiTm9uY2VzIiwgeyAuaTMyPTMgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogTUlQLU1TQS1MaWZldGltZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM2NywJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJNSVAtTVNBLUxpZmV0aW1lIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBNSVAtRkEtdG8tSEEtTVNBICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzI4LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIk1JUC1GQS10by1IQS1NU0EiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIE1JUC1NTi10by1GQS1NU0EgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzMjUsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiTUlQLU1OLXRvLUZBLU1TQSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogTUlQLU9yaWdpbmF0aW5nLUZvcmVpZ24tQUFBICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzQ3LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIk1JUC1PcmlnaW5hdGluZy1Gb3JlaWduLUFBQSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogTUlQLUhBLXRvLU1OLU1TQSAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTMzMiwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJNSVAtSEEtdG8tTU4tTVNBIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBNSVAtTU4tQUFBLUF1dGggKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzMjIsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiTUlQLU1OLUFBQS1BdXRoIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBNSVAtRkEtdG8tTU4tTVNBICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzI2LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIk1JUC1GQS10by1NTi1NU0EiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIE1JUC1IQS10by1GQS1NU0EgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzMjksCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiTUlQLUhBLXRvLUZBLU1TQSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogTUlQLU1OLXRvLUhBLU1TQSAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTMzMSwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJNSVAtTU4tdG8tSEEtTVNBIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCisJCisgICB9CisKKyAgIC8qIENvbW1hbmRzIHNlY3Rpb24gKi8KKyAgIHsKKworICAgfQorCisgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkaWN0X3JmYzQwMDRfYXZwc19sb2FkX3J1bGVzKGNoYXIgKiBjb25mZmlsZSkKK3sKKyAgIC8qIEdyb3VwZWQgQVZQIHNlY3Rpb24gKi8KKyAgIHsKKwkgIC8qIE1JUC1GQS10by1IQS1NU0EgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiTUlQLUZBLXRvLUhBLU1TQSJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJNSVAtRkEtdG8tSEEtU1BJIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk1JUC1BbGdvcml0aG0tVHlwZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJNSVAtU2Vzc2lvbi1LZXkifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBNSVAtTU4tdG8tRkEtTVNBICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk1JUC1NTi10by1GQS1NU0EifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiTUlQLUFsZ29yaXRobS1UeXBlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk1JUC1Ob25jZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIE1JUC1PcmlnaW5hdGluZy1Gb3JlaWduLUFBQSAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJNSVAtT3JpZ2luYXRpbmctRm9yZWlnbi1BQUEifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT3JpZ2luLVJlYWxtIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9yaWdpbi1Ib3N0In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogTUlQLUhBLXRvLU1OLU1TQSAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJNSVAtSEEtdG8tTU4tTVNBIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk1JUC1BbGdvcml0aG0tVHlwZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJNSVAtUmVwbGF5LU1vZGUifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiTUlQLVNlc3Npb24tS2V5In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogTUlQLU1OLUFBQS1BdXRoICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk1JUC1NTi1BQUEtQXV0aCJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJNSVAtTU4tQUFBLVNQSSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJNSVAtQXV0aC1JbnB1dC1EYXRhLUxlbmd0aCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJNSVAtQXV0aGVudGljYXRvci1MZW5ndGgifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiTUlQLUF1dGhlbnRpY2F0b3ItT2Zmc2V0In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogTUlQLUZBLXRvLU1OLU1TQSAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJNSVAtRkEtdG8tTU4tTVNBIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk1JUC1GQS10by1NTi1TUEkifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiTUlQLUFsZ29yaXRobS1UeXBlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk1JUC1TZXNzaW9uLUtleSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIE1JUC1IQS10by1GQS1NU0EgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiTUlQLUhBLXRvLUZBLU1TQSJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJNSVAtSEEtdG8tRkEtU1BJIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk1JUC1BbGdvcml0aG0tVHlwZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJNSVAtU2Vzc2lvbi1LZXkifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBNSVAtTU4tdG8tSEEtTVNBICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk1JUC1NTi10by1IQS1NU0EifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiTUlQLUFsZ29yaXRobS1UeXBlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk1JUC1SZXBsYXktTW9kZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJNSVAtTm9uY2UifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisKKyAgIH0JCisKKyAgIC8qIENvbW1hbmRzIHNlY3Rpb24gKi8KKyAgIHsKKworICAgfQorCisgICBMT0dfRCggIkV4dGVuc2lvbiAnRGljdGlvbmFyeSBkZWZpbml0aW9ucyBmb3IgcmZjNDAwNF9hdnBzIChOb25lKScgaW5pdGlhbGl6ZWQiKTsKKyAgIHJldHVybiAwOworfQorCitpbnQgZGljdF9lbnRyeShjaGFyICogY29uZmZpbGUpCit7CisJZGljdF9yZmM0MDA0X2F2cHNfbG9hZF9kZWZzKGNvbmZmaWxlKTsKKwlyZXR1cm4gZGljdF9yZmM0MDA0X2F2cHNfbG9hZF9ydWxlcyhjb25mZmlsZSk7Cit9CisKK2NvbnN0IGNoYXIqIGRpY3RfcmZjNDAwNF9hdnBzX3Byb3RvX3ZlcihjaGFyICogY29uZmZpbGUpIHsKKwlyZXR1cm4gcmZjNDAwNF9hdnBzX3Byb3RvX3ZlcjsKK30KKworY29uc3QgZG91YmxlIGRpY3RfcmZjNDAwNF9hdnBzX2dlbl90cyhjaGFyICogY29uZmZpbGUpIHsKKwlyZXR1cm4gcmZjNDAwNF9hdnBzX2dlbl9kYXRlOworfQorCitFWFRFTlNJT05fRU5UUlkyKCJkaWN0X3JmYzQwMDRfYXZwcyIsIGRpY3RfcmZjNDAwNF9hdnBzX2xvYWRfZGVmcywgZGljdF9yZmM0MDA0X2F2cHNfbG9hZF9ydWxlcyk7CisKKworCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfcmZjNDAwNF9hdnBzL3JmYzQwMDRfYXZwcy5kaWQgYi9leHRlbnNpb25zL2RpY3RfcmZjNDAwNF9hdnBzL3JmYzQwMDRfYXZwcy5kaWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM2ZWZmZAotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF9yZmM0MDA0X2F2cHMvcmZjNDAwNF9hdnBzLmRpZApAQCAtMCwwICsxIEBACitkaWN0X3JmYzQwMDRfYXZwcwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X3JmYzQwMDZiaXNfYXZwcy9DTWFrZUxpc3RzLnR4dCBiL2V4dGVuc2lvbnMvZGljdF9yZmM0MDA2YmlzX2F2cHMvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMwMmFlOQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF9yZmM0MDA2YmlzX2F2cHMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxNiBAQAorIyBUaGUgZGljdF9yZmM0MDA2YmlzX2F2cHMgZXh0ZW5zaW9uCitQUk9KRUNUKCJkaWN0X3JmYzQwMDZiaXNfYXZwcyBsaWJyYXJ5IGdlbmVyYXRlZCBieSBGZEdlbiAiIEMpCisKKyMgQ29tcGlsZSBhcyBhIG1vZHVsZQorRkRfQUREX0VYVEVOU0lPTihkaWN0X3JmYzQwMDZiaXNfYXZwcyBkaWN0X3JmYzQwMDZiaXNfYXZwcy5jKQorCisKKyMjIyMKKyMjIElOU1RBTEwgc2VjdGlvbiAjIworCitJTlNUQUxMKFRBUkdFVFMgZGljdF9yZmM0MDA2YmlzX2F2cHMKKwlMSUJSQVJZIERFU1RJTkFUSU9OICR7SU5TVEFMTF9FWFRFTlNJT05TX1NVRkZJWH0KK0NPTVBPTkVOVCBmcmVlRGlhbWV0ZXItZGljdGlvbmFyeS1SRkM0MDA2QklTX0FWUFMpCisKKworCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfcmZjNDAwNmJpc19hdnBzL2RpY3RfcmZjNDAwNmJpc19hdnBzLmMgYi9leHRlbnNpb25zL2RpY3RfcmZjNDAwNmJpc19hdnBzL2RpY3RfcmZjNDAwNmJpc19hdnBzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVlYzMxZQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF9yZmM0MDA2YmlzX2F2cHMvZGljdF9yZmM0MDA2YmlzX2F2cHMuYwpAQCAtMCwwICsxLDE0MTkgQEAKKy8qCisqIENvcHlyaWdodCAoYykgMjAxNyBTcHJpbnQKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLyoqKioqKioqKioqKioqKioKKyBHZW5lcmF0ZWQgQnk6IGZkdG9vbCBlbmhhbmNlbWVudHMgdG8gZGlhZnV6emVyCisgTGljZW5zZTogc2FtZSBhcyBmcmVlRGlhbWV0ZXIKKyoqKioqKioqKioqKioqKiovCisKKworLyogCisgKiBEaWN0aW9uYXJ5IGRlZmluaXRpb25zIG9mIG9iamVjdHMgc3BlY2lmaWVkIGluIHJmYzQwMDZiaXNfYXZwcy4KKyAqLworI2luY2x1ZGUgPGZyZWVEaWFtZXRlci9leHRlbnNpb24uaD4KKworI2RlZmluZSBQUk9UT19WRVIgInVuc3BlY2lmaWVkIgorI2RlZmluZSBHRU5fREFURSAgMTUwNjY5NzE0My40OQorCitjb25zdCBjaGFyICpyZmM0MDA2YmlzX2F2cHNfcHJvdG9fdmVyID0gUFJPVE9fVkVSOworY29uc3QgZG91YmxlIHJmYzQwMDZiaXNfYXZwc19nZW5fZGF0ZSA9IEdFTl9EQVRFOworCisvKiBUaGUgY29udGVudCBvZiB0aGlzIGZpbGUgZm9sbG93cyB0aGUgc2FtZSBzdHJ1Y3R1cmUgYXMgZGljdF9iYXNlX3Byb3RvLmMgKi8KKworI2RlZmluZSBDSEVDS19kaWN0X25ldyggX3R5cGUsIF9kYXRhLCBfcGFyZW50LCBfcmVmICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBfcmV0ID0gZmRfZGljdF9uZXcoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgKF90eXBlKSwgKF9kYXRhKSwgKF9wYXJlbnQpLCAoX3JlZikgKTsgXAorICAgIGlmICggX3JldCAhPSAwICYmIF9yZXQgIT0gRUVYSVNUICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHJldHVybiBfcmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIENIRUNLX2RpY3Rfc2VhcmNoKCBfdHlwZSwgX2NyaXRlcmlhLCBfd2hhdCwgX3Jlc3VsdCApCQlcCisgICAgQ0hFQ0tfRkNUKCAgZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgKF90eXBlKSwgKF9jcml0ZXJpYSksIChfd2hhdCksIChfcmVzdWx0KSwgRU5PRU5UKSApOworCitzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiB7CisgICAgc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWU7CisgICAgZW51bSBydWxlX3Bvc2l0aW9uCXBvc2l0aW9uOworICAgIGludCAJCQltaW47CisgICAgaW50CQkJbWF4OworfTsKKworI2RlZmluZSBSVUxFX09SREVSKCBfcG9zaXRpb24gKSAoKCgoX3Bvc2l0aW9uKSA9PSBSVUxFX0ZJWEVEX0hFQUQpIHx8ICgoX3Bvc2l0aW9uKSA9PSBSVUxFX0ZJWEVEX1RBSUwpKSA/IDEgOiAwICkKKworLyogQXR0ZW50aW9uISBUaGlzIHZlcnNpb24gb2YgdGhlIG1hY3JvIHVzZXMgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgaW4gY29udHJhc3QgdG8gbW9zdCBvdGhlciBjb3BpZXMhICovCisjZGVmaW5lIFBBUlNFX2xvY19ydWxlcyggX3J1bGVhcnJheSwgX3BhcmVudCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IF9fYXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKF9fYXI9MDsgX19hciA8IHNpemVvZihfcnVsZWFycmF5KSAvIHNpemVvZigoX3J1bGVhcnJheSlbMF0pOyBfX2FyKyspIHsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgc3RydWN0IGRpY3RfcnVsZV9kYXRhIF9fZGF0YSA9IHsgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5wb3NpdGlvbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ubWluLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5tYXh9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIF9fZGF0YS5ydWxlX29yZGVyID0gUlVMRV9PUkRFUihfX2RhdGEucnVsZV9wb3NpdGlvbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgQ0hFQ0tfRkNUKCAgZmRfZGljdF9zZWFyY2goICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgRElDVF9BVlAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICYoX3J1bGVhcnJheSlbX19hcl0uYXZwX3ZlbmRvcl9wbHVzX25hbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgJl9fZGF0YS5ydWxlX2F2cCwgMCApICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYgKCAhX19kYXRhLnJ1bGVfYXZwICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFX0RFQlVHKElORk8sICJBVlAgTm90IGZvdW5kOiAnJXMnIiwgKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLmF2cF9uYW1lKTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVOT0VOVDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBfcmV0ID0gZmRfZGljdF9uZXcoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9SVUxFLCAmKF9fZGF0YSksIChfcGFyZW50KSwgTlVMTCApOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBfcmV0ICE9IDAgJiYgX3JldCAhPSBFRVhJU1QgKSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfREVCVUcoSU5GTywgIkVycm9yIG9uIHJ1bGUgd2l0aCBBVlAgJyVzJyIsICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0uYXZwX3ZlbmRvcl9wbHVzX25hbWUuYXZwX25hbWUpOyAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFSU5WQUw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBDSEVDS192ZW5kb3JfbmV3KCBfZGF0YSApIHsgXAorICAgICAgICBzdHJ1Y3QgZGljdF9vYmplY3QgKiB2ZW5kb3JfZm91bmQ7IFwKKyAgICAgICAgaWYgKGZkX2RpY3Rfc2VhcmNoKGZkX2dfY29uZmlnLT5jbmZfZGljdCxESUNUX1ZFTkRPUixWRU5ET1JfQllfSUQsJl9kYXRhLnZlbmRvcl9pZCwmdmVuZG9yX2ZvdW5kLEVOT0VOVCkgPT0gRU5PRU5UKSB7IFwKKyAgICAgICAgICAgICAgICBDSEVDS19GQ1QoZmRfZGljdF9uZXcoZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1ZFTkRPUiwgJl9kYXRhLCBOVUxMLCBOVUxMKSk7IFwKKyAgICAgICAgfSBcCit9CisKKyNkZWZpbmUgZW51bXZhbF9kZWZfdTMyKCBfdmFsXywgX3N0cl8gKQkJXAorICAgIHsgX3N0cl8sIAkJeyAudTMyID0gX3ZhbF8gfX0KKworI2RlZmluZSBlbnVtdmFsX2RlZl9vcyggX2xlbl8sIF92YWxfLCBfc3RyXyApCQkJCVwKKyAgICB7IF9zdHJfLCAJCXsgLm9zID0geyAuZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopX3ZhbF8sIC5sZW4gPSBfbGVuXyB9fX0KKworCitzdGF0aWMgaW50IGRpY3RfcmZjNDAwNmJpc19hdnBzX2xvYWRfZGVmcyhjaGFyICogY29uZmZpbGUpCit7CisgICBUUkFDRV9FTlRSWSgiJXAiLCBjb25mZmlsZSk7CisKKyAgIC8qIEFWUCBzZWN0aW9uICovCisgICB7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIEFkZHJlc3NfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogVVRGOFN0cmluZ190eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBEaWFtZXRlcklkZW50aXR5X3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIERpYW1ldGVyVVJJX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIFRpbWVfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogSVBGaWx0ZXJSdWxlX3R5cGU7CisKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiQWRkcmVzcyIsICZBZGRyZXNzX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJVVEY4U3RyaW5nIiwgJlVURjhTdHJpbmdfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkRpYW1ldGVySWRlbnRpdHkiLCAmRGlhbWV0ZXJJZGVudGl0eV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiRGlhbWV0ZXJVUkkiLCAmRGlhbWV0ZXJVUklfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIlRpbWUiLCAmVGltZV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiSVBGaWx0ZXJSdWxlIiwgJklQRmlsdGVyUnVsZV90eXBlKTsKKwkJLyogQ0MtQ29ycmVsYXRpb24tSWQgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk0MTEsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiQ0MtQ29ycmVsYXRpb24tSWQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBDQy1JbnB1dC1PY3RldHMgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk0MTIsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiQ0MtSW5wdXQtT2N0ZXRzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQ2NAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBDQy1PdXRwdXQtT2N0ZXRzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNDE0LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIkNDLU91dHB1dC1PY3RldHMiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDY0CS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIENDLVJlcXVlc3QtTnVtYmVyICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNDE1LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIkNDLVJlcXVlc3QtTnVtYmVyIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBDQy1SZXF1ZXN0LVR5cGUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk0MTYsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiQ0MtUmVxdWVzdC1UeXBlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIkVudW1lcmF0ZWQoQ0MtUmVxdWVzdC1UeXBlKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiSU5JVElBTF9SRVFVRVNUIiwgeyAuaTMyPTEgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIlVQREFURV9SRVFVRVNUIiwgeyAuaTMyPTIgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMyA9IHsgIlRFUk1JTkFUSU9OX1JFUVVFU1QiLCB7IC5pMzI9MyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF80ID0geyAiRVZFTlRfUkVRVUVTVCIsIHsgLmkzMj00IH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogQ0MtU2VydmljZS1TcGVjaWZpYy1Vbml0cyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTQxNywJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJDQy1TZXJ2aWNlLVNwZWNpZmljLVVuaXRzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQ2NAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBDQy1TZXNzaW9uLUZhaWxvdmVyICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNDE4LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIkNDLVNlc3Npb24tRmFpbG92ZXIiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiRW51bWVyYXRlZChDQy1TZXNzaW9uLUZhaWxvdmVyKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiRkFJTE9WRVJfTk9UX1NVUFBPUlRFRCIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJGQUlMT1ZFUl9TVVBQT1JURUQiLCB7IC5pMzI9MSB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogQ0MtU3ViLVNlc3Npb24tSWQgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk0MTksCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiQ0MtU3ViLVNlc3Npb24tSWQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDY0CS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIENDLVRpbWUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk0MjAsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiQ0MtVGltZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogQ0MtVG90YWwtT2N0ZXRzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNDIxLAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIkNDLVRvdGFsLU9jdGV0cyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVENjQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogQ0MtVW5pdC1UeXBlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNDU0LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIkNDLVVuaXQtVHlwZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICJFbnVtZXJhdGVkKENDLVVuaXQtVHlwZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIlRJTUUiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiTU9ORVkiLCB7IC5pMzI9MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAiVE9UQUxfT0NURVRTIiwgeyAuaTMyPTIgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNCA9IHsgIklOUFVUX09DVEVUUyIsIHsgLmkzMj0zIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzUgPSB7ICJPVVRQVVRfT0NURVRTIiwgeyAuaTMyPTQgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNiA9IHsgIlNFUlZJQ0VfU1BFQ0lGSUNfVU5JVFMiLCB7IC5pMzI9NSB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzQsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF82LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBDaGVjay1CYWxhbmNlLVJlc3VsdCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTQyMiwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJDaGVjay1CYWxhbmNlLVJlc3VsdCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICJFbnVtZXJhdGVkKENoZWNrLUJhbGFuY2UtUmVzdWx0KSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiRU5PVUdIX0NSRURJVCIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJOT19DUkVESVQiLCB7IC5pMzI9MSB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogQ29zdC1Vbml0ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNDI0LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIkNvc3QtVW5pdCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogQ3JlZGl0LUNvbnRyb2wgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk0MjYsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiQ3JlZGl0LUNvbnRyb2wiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiRW51bWVyYXRlZChDcmVkaXQtQ29udHJvbCkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIkNSRURJVF9BVVRIT1JJWkFUSU9OIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIlJFX0FVVEhPUklaQVRJT04iLCB7IC5pMzI9MSB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogQ3JlZGl0LUNvbnRyb2wtRmFpbHVyZS1IYW5kbGluZyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTQyNywJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJDcmVkaXQtQ29udHJvbC1GYWlsdXJlLUhhbmRsaW5nIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIkVudW1lcmF0ZWQoQ3JlZGl0LUNvbnRyb2wtRmFpbHVyZS1IYW5kbGluZykiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIlRFUk1JTkFURSIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJDT05USU5VRSIsIHsgLmkzMj0xIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMgPSB7ICJSRVRSWV9BTkRfVEVSTUlOQVRFIiwgeyAuaTMyPTIgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogQ3VycmVuY3ktQ29kZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTQyNSwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJDdXJyZW5jeS1Db2RlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBEaXJlY3QtRGViaXRpbmctRmFpbHVyZS1IYW5kbGluZyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTQyOCwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJEaXJlY3QtRGViaXRpbmctRmFpbHVyZS1IYW5kbGluZyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICJFbnVtZXJhdGVkKERpcmVjdC1EZWJpdGluZy1GYWlsdXJlLUhhbmRsaW5nKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiVEVSTUlOQVRFX09SX0JVRkZFUiIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJDT05USU5VRSIsIHsgLmkzMj0xIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBFeHBvbmVudCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTQyOSwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJFeHBvbmVudCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBGaW5hbC1Vbml0LUFjdGlvbiAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTQ0OSwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJGaW5hbC1Vbml0LUFjdGlvbiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICJFbnVtZXJhdGVkKEZpbmFsLVVuaXQtQWN0aW9uKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiVEVSTUlOQVRFIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIlJFRElSRUNUIiwgeyAuaTMyPTEgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMyA9IHsgIlJFU1RSSUNUX0FDQ0VTUyIsIHsgLmkzMj0yIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIEctUy1VLVBvb2wtSWRlbnRpZmllciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTQ1MywJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJHLVMtVS1Qb29sLUlkZW50aWZpZXIiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIE11bHRpcGxlLVNlcnZpY2VzLUluZGljYXRvciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTQ1NSwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJNdWx0aXBsZS1TZXJ2aWNlcy1JbmRpY2F0b3IiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiRW51bWVyYXRlZChNdWx0aXBsZS1TZXJ2aWNlcy1JbmRpY2F0b3IpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJNVUxUSVBMRV9TRVJWSUNFU19OT1RfU1VQUE9SVEVEIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIk1VTFRJUExFX1NFUlZJQ0VTX1NVUFBPUlRFRCIsIHsgLmkzMj0xIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBSYXRpbmctR3JvdXAgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk0MzIsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiUmF0aW5nLUdyb3VwIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBSZWRpcmVjdC1BZGRyZXNzLVR5cGUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk0MzMsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiUmVkaXJlY3QtQWRkcmVzcy1UeXBlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIkVudW1lcmF0ZWQoUmVkaXJlY3QtQWRkcmVzcy1UeXBlKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiSVB2NF9BZGRyZXNzIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIklQdjZfQWRkcmVzcyIsIHsgLmkzMj0xIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMgPSB7ICJVUkwiLCB7IC5pMzI9MiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF80ID0geyAiU0lQX1VSSSIsIHsgLmkzMj0zIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogUmVkaXJlY3QtU2VydmVyLUFkZHJlc3MgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk0MzUsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiUmVkaXJlY3QtU2VydmVyLUFkZHJlc3MiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFJlZGlyZWN0LUFkZHJlc3MtSVBBZGRyZXNzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJOTk5OTYsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiUmVkaXJlY3QtQWRkcmVzcy1JUEFkZHJlc3MiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIEFkZHJlc3NfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFJlZGlyZWN0LUFkZHJlc3MtVVJMICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJOTk5OTcsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiUmVkaXJlY3QtQWRkcmVzcy1VUkwiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFJlZGlyZWN0LUFkZHJlc3MtU0lQLVVSSSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTk5OTk4LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIlJlZGlyZWN0LUFkZHJlc3MtU0lQLVVSSSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogUmVxdWVzdGVkLUFjdGlvbiAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTQzNiwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJSZXF1ZXN0ZWQtQWN0aW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIkVudW1lcmF0ZWQoUmVxdWVzdGVkLUFjdGlvbikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIkRJUkVDVF9ERUJJVElORyIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJSRUZVTkRfQUNDT1VOVCIsIHsgLmkzMj0xIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMgPSB7ICJDSEVDS19CQUxBTkNFIiwgeyAuaTMyPTIgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNCA9IHsgIlBSSUNFX0VOUVVJUlkiLCB7IC5pMzI9MyB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzQsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFJlc3RyaWN0aW9uLUZpbHRlci1SdWxlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNDM4LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIlJlc3RyaWN0aW9uLUZpbHRlci1SdWxlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBJUEZpbHRlclJ1bGVfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFNlcnZpY2UtQ29udGV4dC1JZCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTQ2MSwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJTZXJ2aWNlLUNvbnRleHQtSWQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFNlcnZpY2UtSWRlbnRpZmllciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTQzOSwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJTZXJ2aWNlLUlkZW50aWZpZXIiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFNlcnZpY2UtUGFyYW1ldGVyLVR5cGUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk0NDEsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiU2VydmljZS1QYXJhbWV0ZXItVHlwZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogU2VydmljZS1QYXJhbWV0ZXItVmFsdWUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk0NDIsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiU2VydmljZS1QYXJhbWV0ZXItVmFsdWUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBTdWJzY3JpcHRpb24tSWQtRGF0YSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTQ0NCwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJTdWJzY3JpcHRpb24tSWQtRGF0YSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogU3Vic2NyaXB0aW9uLUlkLVR5cGUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk0NTAsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiU3Vic2NyaXB0aW9uLUlkLVR5cGUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiRW51bWVyYXRlZChTdWJzY3JpcHRpb24tSWQtVHlwZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIkVORF9VU0VSX0UxNjQiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiRU5EX1VTRVJfSU1TSSIsIHsgLmkzMj0xIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMgPSB7ICJFTkRfVVNFUl9TSVBfVVJJIiwgeyAuaTMyPTIgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNCA9IHsgIkVORF9VU0VSX05BSSIsIHsgLmkzMj0zIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzUgPSB7ICJFTkRfVVNFUl9QUklWQVRFIiwgeyAuaTMyPTQgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF80LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzUsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFN1YnNjcmlwdGlvbi1JZC1FMTY0ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJOTk5OTAsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiU3Vic2NyaXB0aW9uLUlkLUUxNjQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFN1YnNjcmlwdGlvbi1JZC1JTVNJICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJOTk5OTEsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiU3Vic2NyaXB0aW9uLUlkLUlNU0kiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFN1YnNjcmlwdGlvbi1JZC1TSVAtVVJJICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJOTk5OTIsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiU3Vic2NyaXB0aW9uLUlkLVNJUC1VUkkiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFN1YnNjcmlwdGlvbi1JZC1OQUkgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk5OTk5MywJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJTdWJzY3JpcHRpb24tSWQtTkFJIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBTdWJzY3JpcHRpb24tSWQtUHJpdmF0ZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTk5OTk0LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIlN1YnNjcmlwdGlvbi1JZC1Qcml2YXRlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBUYXJpZmYtQ2hhbmdlLVVzYWdlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNDUyLAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIlRhcmlmZi1DaGFuZ2UtVXNhZ2UiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiRW51bWVyYXRlZChUYXJpZmYtQ2hhbmdlLVVzYWdlKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiVU5JVF9CRUZPUkVfVEFSSUZGX0NIQU5HRSIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJVTklUX0FGVEVSX1RBUklGRl9DSEFOR0UiLCB7IC5pMzI9MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAiVU5JVF9JTkRFVEVSTUlOQVRFIiwgeyAuaTMyPTIgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogVGFyaWZmLVRpbWUtQ2hhbmdlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNDUxLAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIlRhcmlmZi1UaW1lLUNoYW5nZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVGltZV90eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogVXNlci1FcXVpcG1lbnQtSW5mby1UeXBlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNDU5LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIlVzZXItRXF1aXBtZW50LUluZm8tVHlwZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICJFbnVtZXJhdGVkKFVzZXItRXF1aXBtZW50LUluZm8tVHlwZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIklNRUlTViIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJNQUMiLCB7IC5pMzI9MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAiRVVJNjQiLCB7IC5pMzI9MiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF80ID0geyAiTU9ESUZJRURfRVVJNjQiLCB7IC5pMzI9MyB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzQsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFVzZXItRXF1aXBtZW50LUluZm8tVmFsdWUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk0NjAsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiVXNlci1FcXVpcG1lbnQtSW5mby1WYWx1ZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFVzZXItRXF1aXBtZW50LUluZm8tSU1FSVNWICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJOTk5ODQsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiVXNlci1FcXVpcG1lbnQtSW5mby1JTUVJU1YiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBVc2VyLUVxdWlwbWVudC1JbmZvLU1BQyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTk5OTg1LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIlVzZXItRXF1aXBtZW50LUluZm8tTUFDIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogVXNlci1FcXVpcG1lbnQtSW5mby1FVUk2NCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTk5OTg2LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIlVzZXItRXF1aXBtZW50LUluZm8tRVVJNjQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBVc2VyLUVxdWlwbWVudC1JbmZvLU1vZGlmaWVkRVVJNjQgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk5OTk4NywJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJVc2VyLUVxdWlwbWVudC1JbmZvLU1vZGlmaWVkRVVJNjQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBVc2VyLUVxdWlwbWVudC1JbmZvLUlNRUkgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk5OTk4OCwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJVc2VyLUVxdWlwbWVudC1JbmZvLUlNRUkiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBWYWx1ZS1EaWdpdHMgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk0NDcsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiVmFsdWUtRGlnaXRzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjY0CS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFZhbGlkaXR5LVRpbWUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk0NDgsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiVmFsaWRpdHktVGltZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogU3Vic2NyaXB0aW9uLUlkLUV4dGVuc2lvbiAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTk5OTg5LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIlN1YnNjcmlwdGlvbi1JZC1FeHRlbnNpb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIFN1YnNjcmlwdGlvbi1JZCAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTQ0MywJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJTdWJzY3JpcHRpb24tSWQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIFNlcnZpY2UtUGFyYW1ldGVyLUluZm8gKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk0NDAsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiU2VydmljZS1QYXJhbWV0ZXItSW5mbyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogVXNlci1FcXVpcG1lbnQtSW5mbyAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTQ1OCwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJVc2VyLUVxdWlwbWVudC1JbmZvIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBVbml0LVZhbHVlICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNDQ1LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIlVuaXQtVmFsdWUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIFJlZGlyZWN0LVNlcnZlci1FeHRlbnNpb24gKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk5OTk5NSwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJSZWRpcmVjdC1TZXJ2ZXItRXh0ZW5zaW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBSZWRpcmVjdC1TZXJ2ZXIgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk0MzQsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiUmVkaXJlY3QtU2VydmVyIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBVc2VyLUVxdWlwbWVudC1JbmZvLUV4dGVuc2lvbiAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTk5OTgzLAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIlVzZXItRXF1aXBtZW50LUluZm8tRXh0ZW5zaW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBHLVMtVS1Qb29sLVJlZmVyZW5jZSAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTQ1NywJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJHLVMtVS1Qb29sLVJlZmVyZW5jZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogRmluYWwtVW5pdC1JbmRpY2F0aW9uICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNDMwLAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIkZpbmFsLVVuaXQtSW5kaWNhdGlvbiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogQ0MtTW9uZXkgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk0MTMsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiQ0MtTW9uZXkiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIENvc3QtSW5mb3JtYXRpb24gKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk0MjMsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiQ29zdC1JbmZvcm1hdGlvbiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogVXNlZC1TZXJ2aWNlLVVuaXQgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk0NDYsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiVXNlZC1TZXJ2aWNlLVVuaXQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIFJlcXVlc3RlZC1TZXJ2aWNlLVVuaXQgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk0MzcsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiUmVxdWVzdGVkLVNlcnZpY2UtVW5pdCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogR3JhbnRlZC1TZXJ2aWNlLVVuaXQgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk0MzEsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiR3JhbnRlZC1TZXJ2aWNlLVVuaXQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIFFvUy1GaW5hbC1Vbml0LUluZGljYXRpb24gKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk5OTk5OSwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJRb1MtRmluYWwtVW5pdC1JbmRpY2F0aW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBNdWx0aXBsZS1TZXJ2aWNlcy1DcmVkaXQtQ29udHJvbCAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTQ1NiwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJNdWx0aXBsZS1TZXJ2aWNlcy1DcmVkaXQtQ29udHJvbCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKworCQorICAgfQorCisgICAvKiBDb21tYW5kcyBzZWN0aW9uICovCisgICB7CisKKyAgIH0KKworICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGljdF9yZmM0MDA2YmlzX2F2cHNfbG9hZF9ydWxlcyhjaGFyICogY29uZmZpbGUpCit7CisgICAvKiBHcm91cGVkIEFWUCBzZWN0aW9uICovCisgICB7CisJICAvKiBTdWJzY3JpcHRpb24tSWQtRXh0ZW5zaW9uICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlN1YnNjcmlwdGlvbi1JZC1FeHRlbnNpb24ifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU3Vic2NyaXB0aW9uLUlkLUUxNjQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU3Vic2NyaXB0aW9uLUlkLUlNU0kifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU3Vic2NyaXB0aW9uLUlkLVNJUC1VUkkifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU3Vic2NyaXB0aW9uLUlkLU5BSSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTdWJzY3JpcHRpb24tSWQtUHJpdmF0ZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIFN1YnNjcmlwdGlvbi1JZCAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTdWJzY3JpcHRpb24tSWQifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU3Vic2NyaXB0aW9uLUlkLVR5cGUifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU3Vic2NyaXB0aW9uLUlkLURhdGEifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBTZXJ2aWNlLVBhcmFtZXRlci1JbmZvICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlNlcnZpY2UtUGFyYW1ldGVyLUluZm8ifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU2VydmljZS1QYXJhbWV0ZXItVHlwZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTZXJ2aWNlLVBhcmFtZXRlci1WYWx1ZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIFVzZXItRXF1aXBtZW50LUluZm8gKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVXNlci1FcXVpcG1lbnQtSW5mbyJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJVc2VyLUVxdWlwbWVudC1JbmZvLVR5cGUifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVXNlci1FcXVpcG1lbnQtSW5mby1WYWx1ZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIFVuaXQtVmFsdWUgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVW5pdC1WYWx1ZSJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJWYWx1ZS1EaWdpdHMifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRXhwb25lbnQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBSZWRpcmVjdC1TZXJ2ZXItRXh0ZW5zaW9uICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJlZGlyZWN0LVNlcnZlci1FeHRlbnNpb24ifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUmVkaXJlY3QtQWRkcmVzcy1JUEFkZHJlc3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUmVkaXJlY3QtQWRkcmVzcy1VUkwifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUmVkaXJlY3QtQWRkcmVzcy1TSVAtVVJJIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogUmVkaXJlY3QtU2VydmVyICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJlZGlyZWN0LVNlcnZlciJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSZWRpcmVjdC1BZGRyZXNzLVR5cGUifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUmVkaXJlY3QtU2VydmVyLUFkZHJlc3MifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBVc2VyLUVxdWlwbWVudC1JbmZvLUV4dGVuc2lvbiAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJVc2VyLUVxdWlwbWVudC1JbmZvLUV4dGVuc2lvbiJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJVc2VyLUVxdWlwbWVudC1JbmZvLUlNRUlTViJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJVc2VyLUVxdWlwbWVudC1JbmZvLU1BQyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJVc2VyLUVxdWlwbWVudC1JbmZvLUVVSTY0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlVzZXItRXF1aXBtZW50LUluZm8tTW9kaWZpZWRFVUk2NCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJVc2VyLUVxdWlwbWVudC1JbmZvLUlNRUkifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBHLVMtVS1Qb29sLVJlZmVyZW5jZSAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJHLVMtVS1Qb29sLVJlZmVyZW5jZSJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJHLVMtVS1Qb29sLUlkZW50aWZpZXIifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQ0MtVW5pdC1UeXBlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlVuaXQtVmFsdWUifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBGaW5hbC1Vbml0LUluZGljYXRpb24gKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRmluYWwtVW5pdC1JbmRpY2F0aW9uIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkZpbmFsLVVuaXQtQWN0aW9uIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJlc3RyaWN0aW9uLUZpbHRlci1SdWxlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkZpbHRlci1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSZWRpcmVjdC1TZXJ2ZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBDQy1Nb25leSAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJDQy1Nb25leSJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJVbml0LVZhbHVlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkN1cnJlbmN5LUNvZGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBDb3N0LUluZm9ybWF0aW9uICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkNvc3QtSW5mb3JtYXRpb24ifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVW5pdC1WYWx1ZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJDdXJyZW5jeS1Db2RlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkNvc3QtVW5pdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIFVzZWQtU2VydmljZS1Vbml0ICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlVzZWQtU2VydmljZS1Vbml0In07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlRhcmlmZi1DaGFuZ2UtVXNhZ2UifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQ0MtVGltZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJDQy1Nb25leSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJDQy1Ub3RhbC1PY3RldHMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQ0MtSW5wdXQtT2N0ZXRzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkNDLU91dHB1dC1PY3RldHMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQ0MtU2VydmljZS1TcGVjaWZpYy1Vbml0cyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIFJlcXVlc3RlZC1TZXJ2aWNlLVVuaXQgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUmVxdWVzdGVkLVNlcnZpY2UtVW5pdCJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJDQy1UaW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkNDLU1vbmV5In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkNDLVRvdGFsLU9jdGV0cyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJDQy1JbnB1dC1PY3RldHMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQ0MtT3V0cHV0LU9jdGV0cyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJDQy1TZXJ2aWNlLVNwZWNpZmljLVVuaXRzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogR3JhbnRlZC1TZXJ2aWNlLVVuaXQgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiR3JhbnRlZC1TZXJ2aWNlLVVuaXQifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVGFyaWZmLVRpbWUtQ2hhbmdlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkNDLVRpbWUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQ0MtTW9uZXkifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQ0MtVG90YWwtT2N0ZXRzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkNDLUlucHV0LU9jdGV0cyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJDQy1PdXRwdXQtT2N0ZXRzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkNDLVNlcnZpY2UtU3BlY2lmaWMtVW5pdHMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBRb1MtRmluYWwtVW5pdC1JbmRpY2F0aW9uICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlFvUy1GaW5hbC1Vbml0LUluZGljYXRpb24ifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRmluYWwtVW5pdC1BY3Rpb24ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRmlsdGVyLVJ1bGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRmlsdGVyLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJlZGlyZWN0LVNlcnZlci1FeHRlbnNpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBNdWx0aXBsZS1TZXJ2aWNlcy1DcmVkaXQtQ29udHJvbCAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJNdWx0aXBsZS1TZXJ2aWNlcy1DcmVkaXQtQ29udHJvbCJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJHcmFudGVkLVNlcnZpY2UtVW5pdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSZXF1ZXN0ZWQtU2VydmljZS1Vbml0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlVzZWQtU2VydmljZS1Vbml0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlRhcmlmZi1DaGFuZ2UtVXNhZ2UifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU2VydmljZS1JZGVudGlmaWVyIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJhdGluZy1Hcm91cCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJHLVMtVS1Qb29sLVJlZmVyZW5jZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJWYWxpZGl0eS1UaW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJlc3VsdC1Db2RlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkZpbmFsLVVuaXQtSW5kaWNhdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJRb1MtRmluYWwtVW5pdC1JbmRpY2F0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCisgICB9CQorCisgICAvKiBDb21tYW5kcyBzZWN0aW9uICovCisgICB7CisKKyAgIH0KKworICAgTE9HX0QoICJFeHRlbnNpb24gJ0RpY3Rpb25hcnkgZGVmaW5pdGlvbnMgZm9yIHJmYzQwMDZiaXNfYXZwcyAoTm9uZSknIGluaXRpYWxpemVkIik7CisgICByZXR1cm4gMDsKK30KKworaW50IGRpY3RfZW50cnkoY2hhciAqIGNvbmZmaWxlKQoreworCWRpY3RfcmZjNDAwNmJpc19hdnBzX2xvYWRfZGVmcyhjb25mZmlsZSk7CisJcmV0dXJuIGRpY3RfcmZjNDAwNmJpc19hdnBzX2xvYWRfcnVsZXMoY29uZmZpbGUpOworfQorCitjb25zdCBjaGFyKiBkaWN0X3JmYzQwMDZiaXNfYXZwc19wcm90b192ZXIoY2hhciAqIGNvbmZmaWxlKSB7CisJcmV0dXJuIHJmYzQwMDZiaXNfYXZwc19wcm90b192ZXI7Cit9CisKK2NvbnN0IGRvdWJsZSBkaWN0X3JmYzQwMDZiaXNfYXZwc19nZW5fdHMoY2hhciAqIGNvbmZmaWxlKSB7CisJcmV0dXJuIHJmYzQwMDZiaXNfYXZwc19nZW5fZGF0ZTsKK30KKworRVhURU5TSU9OX0VOVFJZMigiZGljdF9yZmM0MDA2YmlzX2F2cHMiLCBkaWN0X3JmYzQwMDZiaXNfYXZwc19sb2FkX2RlZnMsIGRpY3RfcmZjNDAwNmJpc19hdnBzX2xvYWRfcnVsZXMsICJkaWN0X3JmYzcxNTVfYXZwcyIsICJkaWN0X3JmYzU3NzdfYXZwcyIpOworCisKKwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X3JmYzQwMDZiaXNfYXZwcy9yZmM0MDA2YmlzX2F2cHMuZGlkIGIvZXh0ZW5zaW9ucy9kaWN0X3JmYzQwMDZiaXNfYXZwcy9yZmM0MDA2YmlzX2F2cHMuZGlkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhYWQ1NTcKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfcmZjNDAwNmJpc19hdnBzL3JmYzQwMDZiaXNfYXZwcy5kaWQKQEAgLTAsMCArMSw0IEBACitkaWN0X3JmYzQwMDRfYXZwcworZGljdF9yZmM3MTU1X2F2cHMKK2RpY3RfcmZjNTc3N19hdnBzCitkaWN0X3JmYzQwMDZiaXNfYXZwcwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X3JmYzQwNzJfYXZwcy9DTWFrZUxpc3RzLnR4dCBiL2V4dGVuc2lvbnMvZGljdF9yZmM0MDcyX2F2cHMvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY5NGE5MAotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF9yZmM0MDcyX2F2cHMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxNiBAQAorIyBUaGUgZGljdF9yZmM0MDcyX2F2cHMgZXh0ZW5zaW9uCitQUk9KRUNUKCJkaWN0X3JmYzQwNzJfYXZwcyBsaWJyYXJ5IGdlbmVyYXRlZCBieSBGZEdlbiAiIEMpCisKKyMgQ29tcGlsZSBhcyBhIG1vZHVsZQorRkRfQUREX0VYVEVOU0lPTihkaWN0X3JmYzQwNzJfYXZwcyBkaWN0X3JmYzQwNzJfYXZwcy5jKQorCisKKyMjIyMKKyMjIElOU1RBTEwgc2VjdGlvbiAjIworCitJTlNUQUxMKFRBUkdFVFMgZGljdF9yZmM0MDcyX2F2cHMKKwlMSUJSQVJZIERFU1RJTkFUSU9OICR7SU5TVEFMTF9FWFRFTlNJT05TX1NVRkZJWH0KK0NPTVBPTkVOVCBmcmVlRGlhbWV0ZXItZGljdGlvbmFyeS1SRkM0MDcyX0FWUFMpCisKKworCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfcmZjNDA3Ml9hdnBzL2RpY3RfcmZjNDA3Ml9hdnBzLmMgYi9leHRlbnNpb25zL2RpY3RfcmZjNDA3Ml9hdnBzL2RpY3RfcmZjNDA3Ml9hdnBzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjlkNzA1ZAotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF9yZmM0MDcyX2F2cHMvZGljdF9yZmM0MDcyX2F2cHMuYwpAQCAtMCwwICsxLDIyNCBAQAorLyoKKyogQ29weXJpZ2h0IChjKSAyMDE3IFNwcmludAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvKioqKioqKioqKioqKioqKgorIEdlbmVyYXRlZCBCeTogZmR0b29sIGVuaGFuY2VtZW50cyB0byBkaWFmdXp6ZXIKKyBMaWNlbnNlOiBzYW1lIGFzIGZyZWVEaWFtZXRlcgorKioqKioqKioqKioqKioqKi8KKworCisvKiAKKyAqIERpY3Rpb25hcnkgZGVmaW5pdGlvbnMgb2Ygb2JqZWN0cyBzcGVjaWZpZWQgaW4gcmZjNDA3Ml9hdnBzLgorICovCisjaW5jbHVkZSA8ZnJlZURpYW1ldGVyL2V4dGVuc2lvbi5oPgorCisjZGVmaW5lIFBST1RPX1ZFUiAidW5zcGVjaWZpZWQiCisjZGVmaW5lIEdFTl9EQVRFICAxNTA2Njk3MTQzLjY1CisKK2NvbnN0IGNoYXIgKnJmYzQwNzJfYXZwc19wcm90b192ZXIgPSBQUk9UT19WRVI7Citjb25zdCBkb3VibGUgcmZjNDA3Ml9hdnBzX2dlbl9kYXRlID0gR0VOX0RBVEU7CisKKy8qIFRoZSBjb250ZW50IG9mIHRoaXMgZmlsZSBmb2xsb3dzIHRoZSBzYW1lIHN0cnVjdHVyZSBhcyBkaWN0X2Jhc2VfcHJvdG8uYyAqLworCisjZGVmaW5lIENIRUNLX2RpY3RfbmV3KCBfdHlwZSwgX2RhdGEsIF9wYXJlbnQsIF9yZWYgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IF9yZXQgPSBmZF9kaWN0X25ldyggZmRfZ19jb25maWctPmNuZl9kaWN0LCAoX3R5cGUpLCAoX2RhdGEpLCAoX3BhcmVudCksIChfcmVmKSApOyBcCisgICAgaWYgKCBfcmV0ICE9IDAgJiYgX3JldCAhPSBFRVhJU1QgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgcmV0dXJuIF9yZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgQ0hFQ0tfZGljdF9zZWFyY2goIF90eXBlLCBfY3JpdGVyaWEsIF93aGF0LCBfcmVzdWx0ICkJCVwKKyAgICBDSEVDS19GQ1QoICBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCAoX3R5cGUpLCAoX2NyaXRlcmlhKSwgKF93aGF0KSwgKF9yZXN1bHQpLCBFTk9FTlQpICk7CisKK3N0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHsKKyAgICBzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZTsKKyAgICBlbnVtIHJ1bGVfcG9zaXRpb24JcG9zaXRpb247CisgICAgaW50IAkJCW1pbjsKKyAgICBpbnQJCQltYXg7Cit9OworCisjZGVmaW5lIFJVTEVfT1JERVIoIF9wb3NpdGlvbiApICgoKChfcG9zaXRpb24pID09IFJVTEVfRklYRURfSEVBRCkgfHwgKChfcG9zaXRpb24pID09IFJVTEVfRklYRURfVEFJTCkpID8gMSA6IDAgKQorCisvKiBBdHRlbnRpb24hIFRoaXMgdmVyc2lvbiBvZiB0aGUgbWFjcm8gdXNlcyBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCBpbiBjb250cmFzdCB0byBtb3N0IG90aGVyIGNvcGllcyEgKi8KKyNkZWZpbmUgUEFSU0VfbG9jX3J1bGVzKCBfcnVsZWFycmF5LCBfcGFyZW50KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgX19hcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoX19hcj0wOyBfX2FyIDwgc2l6ZW9mKF9ydWxlYXJyYXkpIC8gc2l6ZW9mKChfcnVsZWFycmF5KVswXSk7IF9fYXIrKykgeyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgZGljdF9ydWxlX2RhdGEgX19kYXRhID0geyBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLnBvc2l0aW9uLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5taW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLm1heH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgX19kYXRhLnJ1bGVfb3JkZXIgPSBSVUxFX09SREVSKF9fZGF0YS5ydWxlX3Bvc2l0aW9uKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBDSEVDS19GQ1QoICBmZF9kaWN0X3NlYXJjaCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgZmRfZ19jb25maWctPmNuZl9kaWN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBESUNUX0FWUCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgJihfcnVsZWFycmF5KVtfX2FyXS5hdnBfdmVuZG9yX3BsdXNfbmFtZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAmX19kYXRhLnJ1bGVfYXZwLCAwICkgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpZiAoICFfX2RhdGEucnVsZV9hdnAgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfREVCVUcoSU5GTywgIkFWUCBOb3QgZm91bmQ6ICclcyciLCAoX3J1bGVhcnJheSlbX19hcl0uYXZwX3ZlbmRvcl9wbHVzX25hbWUuYXZwX25hbWUpOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRU5PRU5UOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IF9yZXQgPSBmZF9kaWN0X25ldyggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1JVTEUsICYoX19kYXRhKSwgKF9wYXJlbnQpLCBOVUxMICk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIF9yZXQgIT0gMCAmJiBfcmV0ICE9IEVFWElTVCApICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9ERUJVRyhJTkZPLCAiRXJyb3Igb24gcnVsZSB3aXRoIEFWUCAnJXMnIiwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5hdnBfdmVuZG9yX3BsdXNfbmFtZS5hdnBfbmFtZSk7ICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVJTlZBTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIENIRUNLX3ZlbmRvcl9uZXcoIF9kYXRhICkgeyBcCisgICAgICAgIHN0cnVjdCBkaWN0X29iamVjdCAqIHZlbmRvcl9mb3VuZDsgXAorICAgICAgICBpZiAoZmRfZGljdF9zZWFyY2goZmRfZ19jb25maWctPmNuZl9kaWN0LERJQ1RfVkVORE9SLFZFTkRPUl9CWV9JRCwmX2RhdGEudmVuZG9yX2lkLCZ2ZW5kb3JfZm91bmQsRU5PRU5UKSA9PSBFTk9FTlQpIHsgXAorICAgICAgICAgICAgICAgIENIRUNLX0ZDVChmZF9kaWN0X25ldyhmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfVkVORE9SLCAmX2RhdGEsIE5VTEwsIE5VTEwpKTsgXAorICAgICAgICB9IFwKK30KKworI2RlZmluZSBlbnVtdmFsX2RlZl91MzIoIF92YWxfLCBfc3RyXyApCQlcCisgICAgeyBfc3RyXywgCQl7IC51MzIgPSBfdmFsXyB9fQorCisjZGVmaW5lIGVudW12YWxfZGVmX29zKCBfbGVuXywgX3ZhbF8sIF9zdHJfICkJCQkJXAorICAgIHsgX3N0cl8sIAkJeyAub3MgPSB7IC5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilfdmFsXywgLmxlbiA9IF9sZW5fIH19fQorCisKK3N0YXRpYyBpbnQgZGljdF9yZmM0MDcyX2F2cHNfbG9hZF9kZWZzKGNoYXIgKiBjb25mZmlsZSkKK3sKKyAgIFRSQUNFX0VOVFJZKCIlcCIsIGNvbmZmaWxlKTsKKworICAgLyogQVZQIHNlY3Rpb24gKi8KKyAgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogQWRkcmVzc190eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBVVEY4U3RyaW5nX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIERpYW1ldGVySWRlbnRpdHlfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogRGlhbWV0ZXJVUklfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogVGltZV90eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBJUEZpbHRlclJ1bGVfdHlwZTsKKworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJBZGRyZXNzIiwgJkFkZHJlc3NfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIlVURjhTdHJpbmciLCAmVVRGOFN0cmluZ190eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiRGlhbWV0ZXJJZGVudGl0eSIsICZEaWFtZXRlcklkZW50aXR5X3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJEaWFtZXRlclVSSSIsICZEaWFtZXRlclVSSV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiVGltZSIsICZUaW1lX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJJUEZpbHRlclJ1bGUiLCAmSVBGaWx0ZXJSdWxlX3R5cGUpOworCQkvKiBFQVAtUGF5bG9hZCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTQ2MiwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJFQVAtUGF5bG9hZCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIEVBUC1SZWlzc3VlZC1QYXlsb2FkICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNDYzLAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIkVBUC1SZWlzc3VlZC1QYXlsb2FkIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogRUFQLU1hc3Rlci1TZXNzaW9uLUtleSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTQ2NCwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJFQVAtTWFzdGVyLVNlc3Npb24tS2V5IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogRUFQLUtleS1OYW1lICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTAyLAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIkVBUC1LZXktTmFtZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIEFjY291bnRpbmctRUFQLUF1dGgtTWV0aG9kICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNDY1LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIkFjY291bnRpbmctRUFQLUF1dGgtTWV0aG9kIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQ2NAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCisJCisgICB9CisKKyAgIC8qIENvbW1hbmRzIHNlY3Rpb24gKi8KKyAgIHsKKworICAgfQorCisgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkaWN0X3JmYzQwNzJfYXZwc19sb2FkX3J1bGVzKGNoYXIgKiBjb25mZmlsZSkKK3sKKyAgIC8qIEdyb3VwZWQgQVZQIHNlY3Rpb24gKi8KKyAgIHsKKworICAgfQkKKworICAgLyogQ29tbWFuZHMgc2VjdGlvbiAqLworICAgeworCisgICB9CisKKyAgIExPR19EKCAiRXh0ZW5zaW9uICdEaWN0aW9uYXJ5IGRlZmluaXRpb25zIGZvciByZmM0MDcyX2F2cHMgKE5vbmUpJyBpbml0aWFsaXplZCIpOworICAgcmV0dXJuIDA7Cit9CisKK2ludCBkaWN0X2VudHJ5KGNoYXIgKiBjb25mZmlsZSkKK3sKKwlkaWN0X3JmYzQwNzJfYXZwc19sb2FkX2RlZnMoY29uZmZpbGUpOworCXJldHVybiBkaWN0X3JmYzQwNzJfYXZwc19sb2FkX3J1bGVzKGNvbmZmaWxlKTsKK30KKworY29uc3QgY2hhciogZGljdF9yZmM0MDcyX2F2cHNfcHJvdG9fdmVyKGNoYXIgKiBjb25mZmlsZSkgeworCXJldHVybiByZmM0MDcyX2F2cHNfcHJvdG9fdmVyOworfQorCitjb25zdCBkb3VibGUgZGljdF9yZmM0MDcyX2F2cHNfZ2VuX3RzKGNoYXIgKiBjb25mZmlsZSkgeworCXJldHVybiByZmM0MDcyX2F2cHNfZ2VuX2RhdGU7Cit9CisKK0VYVEVOU0lPTl9FTlRSWTIoImRpY3RfcmZjNDA3Ml9hdnBzIiwgZGljdF9yZmM0MDcyX2F2cHNfbG9hZF9kZWZzLCBkaWN0X3JmYzQwNzJfYXZwc19sb2FkX3J1bGVzLCAiZGljdF9yZmM3MTU1X2F2cHMiKTsKKworCisKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF9yZmM0MDcyX2F2cHMvcmZjNDA3Ml9hdnBzLmRpZCBiL2V4dGVuc2lvbnMvZGljdF9yZmM0MDcyX2F2cHMvcmZjNDA3Ml9hdnBzLmRpZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWFmNzU5Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kaWN0X3JmYzQwNzJfYXZwcy9yZmM0MDcyX2F2cHMuZGlkCkBAIC0wLDAgKzEsMyBAQAorZGljdF9yZmM0MDA0X2F2cHMKK2RpY3RfcmZjNzE1NV9hdnBzCitkaWN0X3JmYzQwNzJfYXZwcwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X3JmYzQ1OTBfYXZwcy9DTWFrZUxpc3RzLnR4dCBiL2V4dGVuc2lvbnMvZGljdF9yZmM0NTkwX2F2cHMvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc1NTk2MQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF9yZmM0NTkwX2F2cHMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxNiBAQAorIyBUaGUgZGljdF9yZmM0NTkwX2F2cHMgZXh0ZW5zaW9uCitQUk9KRUNUKCJkaWN0X3JmYzQ1OTBfYXZwcyBsaWJyYXJ5IGdlbmVyYXRlZCBieSBGZEdlbiAiIEMpCisKKyMgQ29tcGlsZSBhcyBhIG1vZHVsZQorRkRfQUREX0VYVEVOU0lPTihkaWN0X3JmYzQ1OTBfYXZwcyBkaWN0X3JmYzQ1OTBfYXZwcy5jKQorCisKKyMjIyMKKyMjIElOU1RBTEwgc2VjdGlvbiAjIworCitJTlNUQUxMKFRBUkdFVFMgZGljdF9yZmM0NTkwX2F2cHMKKwlMSUJSQVJZIERFU1RJTkFUSU9OICR7SU5TVEFMTF9FWFRFTlNJT05TX1NVRkZJWH0KK0NPTVBPTkVOVCBmcmVlRGlhbWV0ZXItZGljdGlvbmFyeS1SRkM0NTkwX0FWUFMpCisKKworCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfcmZjNDU5MF9hdnBzL2RpY3RfcmZjNDU5MF9hdnBzLmMgYi9leHRlbnNpb25zL2RpY3RfcmZjNDU5MF9hdnBzL2RpY3RfcmZjNDU5MF9hdnBzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA5OTAxZAotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF9yZmM0NTkwX2F2cHMvZGljdF9yZmM0NTkwX2F2cHMuYwpAQCAtMCwwICsxLDQxNiBAQAorLyoKKyogQ29weXJpZ2h0IChjKSAyMDE3IFNwcmludAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvKioqKioqKioqKioqKioqKgorIEdlbmVyYXRlZCBCeTogZmR0b29sIGVuaGFuY2VtZW50cyB0byBkaWFmdXp6ZXIKKyBMaWNlbnNlOiBzYW1lIGFzIGZyZWVEaWFtZXRlcgorKioqKioqKioqKioqKioqKi8KKworCisvKiAKKyAqIERpY3Rpb25hcnkgZGVmaW5pdGlvbnMgb2Ygb2JqZWN0cyBzcGVjaWZpZWQgaW4gcmZjNDU5MF9hdnBzLgorICovCisjaW5jbHVkZSA8ZnJlZURpYW1ldGVyL2V4dGVuc2lvbi5oPgorCisjZGVmaW5lIFBST1RPX1ZFUiAidW5zcGVjaWZpZWQiCisjZGVmaW5lIEdFTl9EQVRFICAxNTA2Njk3MTQzLjUyCisKK2NvbnN0IGNoYXIgKnJmYzQ1OTBfYXZwc19wcm90b192ZXIgPSBQUk9UT19WRVI7Citjb25zdCBkb3VibGUgcmZjNDU5MF9hdnBzX2dlbl9kYXRlID0gR0VOX0RBVEU7CisKKy8qIFRoZSBjb250ZW50IG9mIHRoaXMgZmlsZSBmb2xsb3dzIHRoZSBzYW1lIHN0cnVjdHVyZSBhcyBkaWN0X2Jhc2VfcHJvdG8uYyAqLworCisjZGVmaW5lIENIRUNLX2RpY3RfbmV3KCBfdHlwZSwgX2RhdGEsIF9wYXJlbnQsIF9yZWYgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IF9yZXQgPSBmZF9kaWN0X25ldyggZmRfZ19jb25maWctPmNuZl9kaWN0LCAoX3R5cGUpLCAoX2RhdGEpLCAoX3BhcmVudCksIChfcmVmKSApOyBcCisgICAgaWYgKCBfcmV0ICE9IDAgJiYgX3JldCAhPSBFRVhJU1QgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgcmV0dXJuIF9yZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgQ0hFQ0tfZGljdF9zZWFyY2goIF90eXBlLCBfY3JpdGVyaWEsIF93aGF0LCBfcmVzdWx0ICkJCVwKKyAgICBDSEVDS19GQ1QoICBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCAoX3R5cGUpLCAoX2NyaXRlcmlhKSwgKF93aGF0KSwgKF9yZXN1bHQpLCBFTk9FTlQpICk7CisKK3N0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHsKKyAgICBzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZTsKKyAgICBlbnVtIHJ1bGVfcG9zaXRpb24JcG9zaXRpb247CisgICAgaW50IAkJCW1pbjsKKyAgICBpbnQJCQltYXg7Cit9OworCisjZGVmaW5lIFJVTEVfT1JERVIoIF9wb3NpdGlvbiApICgoKChfcG9zaXRpb24pID09IFJVTEVfRklYRURfSEVBRCkgfHwgKChfcG9zaXRpb24pID09IFJVTEVfRklYRURfVEFJTCkpID8gMSA6IDAgKQorCisvKiBBdHRlbnRpb24hIFRoaXMgdmVyc2lvbiBvZiB0aGUgbWFjcm8gdXNlcyBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCBpbiBjb250cmFzdCB0byBtb3N0IG90aGVyIGNvcGllcyEgKi8KKyNkZWZpbmUgUEFSU0VfbG9jX3J1bGVzKCBfcnVsZWFycmF5LCBfcGFyZW50KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgX19hcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoX19hcj0wOyBfX2FyIDwgc2l6ZW9mKF9ydWxlYXJyYXkpIC8gc2l6ZW9mKChfcnVsZWFycmF5KVswXSk7IF9fYXIrKykgeyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgZGljdF9ydWxlX2RhdGEgX19kYXRhID0geyBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLnBvc2l0aW9uLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5taW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLm1heH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgX19kYXRhLnJ1bGVfb3JkZXIgPSBSVUxFX09SREVSKF9fZGF0YS5ydWxlX3Bvc2l0aW9uKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBDSEVDS19GQ1QoICBmZF9kaWN0X3NlYXJjaCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgZmRfZ19jb25maWctPmNuZl9kaWN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBESUNUX0FWUCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgJihfcnVsZWFycmF5KVtfX2FyXS5hdnBfdmVuZG9yX3BsdXNfbmFtZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAmX19kYXRhLnJ1bGVfYXZwLCAwICkgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpZiAoICFfX2RhdGEucnVsZV9hdnAgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfREVCVUcoSU5GTywgIkFWUCBOb3QgZm91bmQ6ICclcyciLCAoX3J1bGVhcnJheSlbX19hcl0uYXZwX3ZlbmRvcl9wbHVzX25hbWUuYXZwX25hbWUpOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRU5PRU5UOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IF9yZXQgPSBmZF9kaWN0X25ldyggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1JVTEUsICYoX19kYXRhKSwgKF9wYXJlbnQpLCBOVUxMICk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIF9yZXQgIT0gMCAmJiBfcmV0ICE9IEVFWElTVCApICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9ERUJVRyhJTkZPLCAiRXJyb3Igb24gcnVsZSB3aXRoIEFWUCAnJXMnIiwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5hdnBfdmVuZG9yX3BsdXNfbmFtZS5hdnBfbmFtZSk7ICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVJTlZBTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIENIRUNLX3ZlbmRvcl9uZXcoIF9kYXRhICkgeyBcCisgICAgICAgIHN0cnVjdCBkaWN0X29iamVjdCAqIHZlbmRvcl9mb3VuZDsgXAorICAgICAgICBpZiAoZmRfZGljdF9zZWFyY2goZmRfZ19jb25maWctPmNuZl9kaWN0LERJQ1RfVkVORE9SLFZFTkRPUl9CWV9JRCwmX2RhdGEudmVuZG9yX2lkLCZ2ZW5kb3JfZm91bmQsRU5PRU5UKSA9PSBFTk9FTlQpIHsgXAorICAgICAgICAgICAgICAgIENIRUNLX0ZDVChmZF9kaWN0X25ldyhmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfVkVORE9SLCAmX2RhdGEsIE5VTEwsIE5VTEwpKTsgXAorICAgICAgICB9IFwKK30KKworI2RlZmluZSBlbnVtdmFsX2RlZl91MzIoIF92YWxfLCBfc3RyXyApCQlcCisgICAgeyBfc3RyXywgCQl7IC51MzIgPSBfdmFsXyB9fQorCisjZGVmaW5lIGVudW12YWxfZGVmX29zKCBfbGVuXywgX3ZhbF8sIF9zdHJfICkJCQkJXAorICAgIHsgX3N0cl8sIAkJeyAub3MgPSB7IC5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilfdmFsXywgLmxlbiA9IF9sZW5fIH19fQorCisKK3N0YXRpYyBpbnQgZGljdF9yZmM0NTkwX2F2cHNfbG9hZF9kZWZzKGNoYXIgKiBjb25mZmlsZSkKK3sKKyAgIFRSQUNFX0VOVFJZKCIlcCIsIGNvbmZmaWxlKTsKKworICAgLyogQVZQIHNlY3Rpb24gKi8KKyAgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogQWRkcmVzc190eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBVVEY4U3RyaW5nX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIERpYW1ldGVySWRlbnRpdHlfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogRGlhbWV0ZXJVUklfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogVGltZV90eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBJUEZpbHRlclJ1bGVfdHlwZTsKKworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJBZGRyZXNzIiwgJkFkZHJlc3NfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIlVURjhTdHJpbmciLCAmVVRGOFN0cmluZ190eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiRGlhbWV0ZXJJZGVudGl0eSIsICZEaWFtZXRlcklkZW50aXR5X3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJEaWFtZXRlclVSSSIsICZEaWFtZXRlclVSSV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiVGltZSIsICZUaW1lX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJJUEZpbHRlclJ1bGUiLCAmSVBGaWx0ZXJSdWxlX3R5cGUpOworCQkvKiBNZXNzYWdlLUF1dGhlbnRpY2F0b3IgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk4MCwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJNZXNzYWdlLUF1dGhlbnRpY2F0b3IiLAkvKiBOYW1lICovCisJCQkJMCwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIERpZ2VzdC1SZXNwb25zZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEwMywJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJEaWdlc3QtUmVzcG9uc2UiLAkvKiBOYW1lICovCisJCQkJMCwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIERpZ2VzdC1SZWFsbSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEwNCwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJEaWdlc3QtUmVhbG0iLAkvKiBOYW1lICovCisJCQkJMCwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIERpZ2VzdC1Ob25jZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEwNSwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJEaWdlc3QtTm9uY2UiLAkvKiBOYW1lICovCisJCQkJMCwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIERpZ2VzdC1SZXNwb25zZS1BdXRoICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTA2LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIkRpZ2VzdC1SZXNwb25zZS1BdXRoIiwJLyogTmFtZSAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJMCwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBEaWdlc3QtTmV4dG5vbmNlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTA3LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIkRpZ2VzdC1OZXh0bm9uY2UiLAkvKiBOYW1lICovCisJCQkJMCwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIERpZ2VzdC1NZXRob2QgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMDgsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiRGlnZXN0LU1ldGhvZCIsCS8qIE5hbWUgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogRGlnZXN0LVVSSSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEwOSwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJEaWdlc3QtVVJJIiwJLyogTmFtZSAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJMCwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBEaWdlc3QtUW9QICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTEwLAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIkRpZ2VzdC1Rb1AiLAkvKiBOYW1lICovCisJCQkJMCwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIERpZ2VzdC1BbGdvcml0aG0gKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMTEsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiRGlnZXN0LUFsZ29yaXRobSIsCS8qIE5hbWUgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogRGlnZXN0LUVudGl0eS1Cb2R5LUhhc2ggKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMTIsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiRGlnZXN0LUVudGl0eS1Cb2R5LUhhc2giLAkvKiBOYW1lICovCisJCQkJMCwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIERpZ2VzdC1DTm9uY2UgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMTMsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiRGlnZXN0LUNOb25jZSIsCS8qIE5hbWUgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogRGlnZXN0LU5vbmNlLUNvdW50ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTE0LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIkRpZ2VzdC1Ob25jZS1Db3VudCIsCS8qIE5hbWUgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogRGlnZXN0LVVzZXJuYW1lICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTE1LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIkRpZ2VzdC1Vc2VybmFtZSIsCS8qIE5hbWUgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogRGlnZXN0LU9wYXF1ZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTExNiwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJEaWdlc3QtT3BhcXVlIiwJLyogTmFtZSAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJMCwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBEaWdlc3QtQXV0aC1QYXJhbSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTExNywJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJEaWdlc3QtQXV0aC1QYXJhbSIsCS8qIE5hbWUgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogRGlnZXN0LUFLQS1BdXRzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTE4LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIkRpZ2VzdC1BS0EtQXV0cyIsCS8qIE5hbWUgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogRGlnZXN0LURvbWFpbiAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTExOSwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJEaWdlc3QtRG9tYWluIiwJLyogTmFtZSAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJMCwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBEaWdlc3QtU3RhbGUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMjAsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiRGlnZXN0LVN0YWxlIiwJLyogTmFtZSAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJMCwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBEaWdlc3QtSEExICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTIxLAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIkRpZ2VzdC1IQTEiLAkvKiBOYW1lICovCisJCQkJMCwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFNJUC1BT1IgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMjIsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiU0lQLUFPUiIsCS8qIE5hbWUgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKworCQorICAgfQorCisgICAvKiBDb21tYW5kcyBzZWN0aW9uICovCisgICB7CisKKyAgIH0KKworICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGljdF9yZmM0NTkwX2F2cHNfbG9hZF9ydWxlcyhjaGFyICogY29uZmZpbGUpCit7CisgICAvKiBHcm91cGVkIEFWUCBzZWN0aW9uICovCisgICB7CisKKyAgIH0JCisKKyAgIC8qIENvbW1hbmRzIHNlY3Rpb24gKi8KKyAgIHsKKworICAgfQorCisgICBMT0dfRCggIkV4dGVuc2lvbiAnRGljdGlvbmFyeSBkZWZpbml0aW9ucyBmb3IgcmZjNDU5MF9hdnBzIChOb25lKScgaW5pdGlhbGl6ZWQiKTsKKyAgIHJldHVybiAwOworfQorCitpbnQgZGljdF9lbnRyeShjaGFyICogY29uZmZpbGUpCit7CisJZGljdF9yZmM0NTkwX2F2cHNfbG9hZF9kZWZzKGNvbmZmaWxlKTsKKwlyZXR1cm4gZGljdF9yZmM0NTkwX2F2cHNfbG9hZF9ydWxlcyhjb25mZmlsZSk7Cit9CisKK2NvbnN0IGNoYXIqIGRpY3RfcmZjNDU5MF9hdnBzX3Byb3RvX3ZlcihjaGFyICogY29uZmZpbGUpIHsKKwlyZXR1cm4gcmZjNDU5MF9hdnBzX3Byb3RvX3ZlcjsKK30KKworY29uc3QgZG91YmxlIGRpY3RfcmZjNDU5MF9hdnBzX2dlbl90cyhjaGFyICogY29uZmZpbGUpIHsKKwlyZXR1cm4gcmZjNDU5MF9hdnBzX2dlbl9kYXRlOworfQorCitFWFRFTlNJT05fRU5UUlkyKCJkaWN0X3JmYzQ1OTBfYXZwcyIsIGRpY3RfcmZjNDU5MF9hdnBzX2xvYWRfZGVmcywgZGljdF9yZmM0NTkwX2F2cHNfbG9hZF9ydWxlcyk7CisKKworCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfcmZjNDU5MF9hdnBzL3JmYzQ1OTBfYXZwcy5kaWQgYi9leHRlbnNpb25zL2RpY3RfcmZjNDU5MF9hdnBzL3JmYzQ1OTBfYXZwcy5kaWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVmM2UwOAotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF9yZmM0NTkwX2F2cHMvcmZjNDU5MF9hdnBzLmRpZApAQCAtMCwwICsxIEBACitkaWN0X3JmYzQ1OTBfYXZwcwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X3JmYzU0NDdfYXZwcy9DTWFrZUxpc3RzLnR4dCBiL2V4dGVuc2lvbnMvZGljdF9yZmM1NDQ3X2F2cHMvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA0MjVjZAotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF9yZmM1NDQ3X2F2cHMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxNiBAQAorIyBUaGUgZGljdF9yZmM1NDQ3X2F2cHMgZXh0ZW5zaW9uCitQUk9KRUNUKCJkaWN0X3JmYzU0NDdfYXZwcyBsaWJyYXJ5IGdlbmVyYXRlZCBieSBGZEdlbiAiIEMpCisKKyMgQ29tcGlsZSBhcyBhIG1vZHVsZQorRkRfQUREX0VYVEVOU0lPTihkaWN0X3JmYzU0NDdfYXZwcyBkaWN0X3JmYzU0NDdfYXZwcy5jKQorCisKKyMjIyMKKyMjIElOU1RBTEwgc2VjdGlvbiAjIworCitJTlNUQUxMKFRBUkdFVFMgZGljdF9yZmM1NDQ3X2F2cHMKKwlMSUJSQVJZIERFU1RJTkFUSU9OICR7SU5TVEFMTF9FWFRFTlNJT05TX1NVRkZJWH0KK0NPTVBPTkVOVCBmcmVlRGlhbWV0ZXItZGljdGlvbmFyeS1SRkM1NDQ3X0FWUFMpCisKKworCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfcmZjNTQ0N19hdnBzL2RpY3RfcmZjNTQ0N19hdnBzLmMgYi9leHRlbnNpb25zL2RpY3RfcmZjNTQ0N19hdnBzL2RpY3RfcmZjNTQ0N19hdnBzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY2NWNmOAotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF9yZmM1NDQ3X2F2cHMvZGljdF9yZmM1NDQ3X2F2cHMuYwpAQCAtMCwwICsxLDIxNiBAQAorLyoKKyogQ29weXJpZ2h0IChjKSAyMDE3IFNwcmludAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvKioqKioqKioqKioqKioqKgorIEdlbmVyYXRlZCBCeTogZmR0b29sIGVuaGFuY2VtZW50cyB0byBkaWFmdXp6ZXIKKyBMaWNlbnNlOiBzYW1lIGFzIGZyZWVEaWFtZXRlcgorKioqKioqKioqKioqKioqKi8KKworCisvKiAKKyAqIERpY3Rpb25hcnkgZGVmaW5pdGlvbnMgb2Ygb2JqZWN0cyBzcGVjaWZpZWQgaW4gcmZjNTQ0N19hdnBzLgorICovCisjaW5jbHVkZSA8ZnJlZURpYW1ldGVyL2V4dGVuc2lvbi5oPgorCisjZGVmaW5lIFBST1RPX1ZFUiAidW5zcGVjaWZpZWQiCisjZGVmaW5lIEdFTl9EQVRFICAxNTA2Njk3MTQzLjU0CisKK2NvbnN0IGNoYXIgKnJmYzU0NDdfYXZwc19wcm90b192ZXIgPSBQUk9UT19WRVI7Citjb25zdCBkb3VibGUgcmZjNTQ0N19hdnBzX2dlbl9kYXRlID0gR0VOX0RBVEU7CisKKy8qIFRoZSBjb250ZW50IG9mIHRoaXMgZmlsZSBmb2xsb3dzIHRoZSBzYW1lIHN0cnVjdHVyZSBhcyBkaWN0X2Jhc2VfcHJvdG8uYyAqLworCisjZGVmaW5lIENIRUNLX2RpY3RfbmV3KCBfdHlwZSwgX2RhdGEsIF9wYXJlbnQsIF9yZWYgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IF9yZXQgPSBmZF9kaWN0X25ldyggZmRfZ19jb25maWctPmNuZl9kaWN0LCAoX3R5cGUpLCAoX2RhdGEpLCAoX3BhcmVudCksIChfcmVmKSApOyBcCisgICAgaWYgKCBfcmV0ICE9IDAgJiYgX3JldCAhPSBFRVhJU1QgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgcmV0dXJuIF9yZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgQ0hFQ0tfZGljdF9zZWFyY2goIF90eXBlLCBfY3JpdGVyaWEsIF93aGF0LCBfcmVzdWx0ICkJCVwKKyAgICBDSEVDS19GQ1QoICBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCAoX3R5cGUpLCAoX2NyaXRlcmlhKSwgKF93aGF0KSwgKF9yZXN1bHQpLCBFTk9FTlQpICk7CisKK3N0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHsKKyAgICBzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZTsKKyAgICBlbnVtIHJ1bGVfcG9zaXRpb24JcG9zaXRpb247CisgICAgaW50IAkJCW1pbjsKKyAgICBpbnQJCQltYXg7Cit9OworCisjZGVmaW5lIFJVTEVfT1JERVIoIF9wb3NpdGlvbiApICgoKChfcG9zaXRpb24pID09IFJVTEVfRklYRURfSEVBRCkgfHwgKChfcG9zaXRpb24pID09IFJVTEVfRklYRURfVEFJTCkpID8gMSA6IDAgKQorCisvKiBBdHRlbnRpb24hIFRoaXMgdmVyc2lvbiBvZiB0aGUgbWFjcm8gdXNlcyBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCBpbiBjb250cmFzdCB0byBtb3N0IG90aGVyIGNvcGllcyEgKi8KKyNkZWZpbmUgUEFSU0VfbG9jX3J1bGVzKCBfcnVsZWFycmF5LCBfcGFyZW50KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgX19hcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoX19hcj0wOyBfX2FyIDwgc2l6ZW9mKF9ydWxlYXJyYXkpIC8gc2l6ZW9mKChfcnVsZWFycmF5KVswXSk7IF9fYXIrKykgeyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgZGljdF9ydWxlX2RhdGEgX19kYXRhID0geyBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLnBvc2l0aW9uLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5taW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLm1heH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgX19kYXRhLnJ1bGVfb3JkZXIgPSBSVUxFX09SREVSKF9fZGF0YS5ydWxlX3Bvc2l0aW9uKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBDSEVDS19GQ1QoICBmZF9kaWN0X3NlYXJjaCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgZmRfZ19jb25maWctPmNuZl9kaWN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBESUNUX0FWUCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgJihfcnVsZWFycmF5KVtfX2FyXS5hdnBfdmVuZG9yX3BsdXNfbmFtZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAmX19kYXRhLnJ1bGVfYXZwLCAwICkgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpZiAoICFfX2RhdGEucnVsZV9hdnAgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfREVCVUcoSU5GTywgIkFWUCBOb3QgZm91bmQ6ICclcyciLCAoX3J1bGVhcnJheSlbX19hcl0uYXZwX3ZlbmRvcl9wbHVzX25hbWUuYXZwX25hbWUpOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRU5PRU5UOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IF9yZXQgPSBmZF9kaWN0X25ldyggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1JVTEUsICYoX19kYXRhKSwgKF9wYXJlbnQpLCBOVUxMICk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIF9yZXQgIT0gMCAmJiBfcmV0ICE9IEVFWElTVCApICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9ERUJVRyhJTkZPLCAiRXJyb3Igb24gcnVsZSB3aXRoIEFWUCAnJXMnIiwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5hdnBfdmVuZG9yX3BsdXNfbmFtZS5hdnBfbmFtZSk7ICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVJTlZBTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIENIRUNLX3ZlbmRvcl9uZXcoIF9kYXRhICkgeyBcCisgICAgICAgIHN0cnVjdCBkaWN0X29iamVjdCAqIHZlbmRvcl9mb3VuZDsgXAorICAgICAgICBpZiAoZmRfZGljdF9zZWFyY2goZmRfZ19jb25maWctPmNuZl9kaWN0LERJQ1RfVkVORE9SLFZFTkRPUl9CWV9JRCwmX2RhdGEudmVuZG9yX2lkLCZ2ZW5kb3JfZm91bmQsRU5PRU5UKSA9PSBFTk9FTlQpIHsgXAorICAgICAgICAgICAgICAgIENIRUNLX0ZDVChmZF9kaWN0X25ldyhmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfVkVORE9SLCAmX2RhdGEsIE5VTEwsIE5VTEwpKTsgXAorICAgICAgICB9IFwKK30KKworI2RlZmluZSBlbnVtdmFsX2RlZl91MzIoIF92YWxfLCBfc3RyXyApCQlcCisgICAgeyBfc3RyXywgCQl7IC51MzIgPSBfdmFsXyB9fQorCisjZGVmaW5lIGVudW12YWxfZGVmX29zKCBfbGVuXywgX3ZhbF8sIF9zdHJfICkJCQkJXAorICAgIHsgX3N0cl8sIAkJeyAub3MgPSB7IC5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilfdmFsXywgLmxlbiA9IF9sZW5fIH19fQorCisKK3N0YXRpYyBpbnQgZGljdF9yZmM1NDQ3X2F2cHNfbG9hZF9kZWZzKGNoYXIgKiBjb25mZmlsZSkKK3sKKyAgIFRSQUNFX0VOVFJZKCIlcCIsIGNvbmZmaWxlKTsKKworICAgLyogQVZQIHNlY3Rpb24gKi8KKyAgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogQWRkcmVzc190eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBVVEY4U3RyaW5nX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIERpYW1ldGVySWRlbnRpdHlfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogRGlhbWV0ZXJVUklfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogVGltZV90eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBJUEZpbHRlclJ1bGVfdHlwZTsKKworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJBZGRyZXNzIiwgJkFkZHJlc3NfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIlVURjhTdHJpbmciLCAmVVRGOFN0cmluZ190eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiRGlhbWV0ZXJJZGVudGl0eSIsICZEaWFtZXRlcklkZW50aXR5X3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJEaWFtZXRlclVSSSIsICZEaWFtZXRlclVSSV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiVGltZSIsICZUaW1lX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJJUEZpbHRlclJ1bGUiLCAmSVBGaWx0ZXJSdWxlX3R5cGUpOworCQkvKiBNSVA2LUZlYXR1cmUtVmVjdG9yICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTI0LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIk1JUDYtRmVhdHVyZS1WZWN0b3IiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIE1JUDYtSG9tZS1MaW5rLVByZWZpeCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEyNSwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJNSVA2LUhvbWUtTGluay1QcmVmaXgiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBNSVA2LUFnZW50LUluZm8gKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk0ODYsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiTUlQNi1BZ2VudC1JbmZvIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCisJCisgICB9CisKKyAgIC8qIENvbW1hbmRzIHNlY3Rpb24gKi8KKyAgIHsKKworICAgfQorCisgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkaWN0X3JmYzU0NDdfYXZwc19sb2FkX3J1bGVzKGNoYXIgKiBjb25mZmlsZSkKK3sKKyAgIC8qIEdyb3VwZWQgQVZQIHNlY3Rpb24gKi8KKyAgIHsKKwkgIC8qIE1JUDYtQWdlbnQtSW5mbyAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJNSVA2LUFnZW50LUluZm8ifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiTUlQLUhvbWUtQWdlbnQtQWRkcmVzcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgMiB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk1JUC1Ib21lLUFnZW50LUhvc3QifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiTUlQNi1Ib21lLUxpbmstUHJlZml4In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCisgICB9CQorCisgICAvKiBDb21tYW5kcyBzZWN0aW9uICovCisgICB7CisKKyAgIH0KKworICAgTE9HX0QoICJFeHRlbnNpb24gJ0RpY3Rpb25hcnkgZGVmaW5pdGlvbnMgZm9yIHJmYzU0NDdfYXZwcyAoTm9uZSknIGluaXRpYWxpemVkIik7CisgICByZXR1cm4gMDsKK30KKworaW50IGRpY3RfZW50cnkoY2hhciAqIGNvbmZmaWxlKQoreworCWRpY3RfcmZjNTQ0N19hdnBzX2xvYWRfZGVmcyhjb25mZmlsZSk7CisJcmV0dXJuIGRpY3RfcmZjNTQ0N19hdnBzX2xvYWRfcnVsZXMoY29uZmZpbGUpOworfQorCitjb25zdCBjaGFyKiBkaWN0X3JmYzU0NDdfYXZwc19wcm90b192ZXIoY2hhciAqIGNvbmZmaWxlKSB7CisJcmV0dXJuIHJmYzU0NDdfYXZwc19wcm90b192ZXI7Cit9CisKK2NvbnN0IGRvdWJsZSBkaWN0X3JmYzU0NDdfYXZwc19nZW5fdHMoY2hhciAqIGNvbmZmaWxlKSB7CisJcmV0dXJuIHJmYzU0NDdfYXZwc19nZW5fZGF0ZTsKK30KKworRVhURU5TSU9OX0VOVFJZMigiZGljdF9yZmM1NDQ3X2F2cHMiLCBkaWN0X3JmYzU0NDdfYXZwc19sb2FkX2RlZnMsIGRpY3RfcmZjNTQ0N19hdnBzX2xvYWRfcnVsZXMsICJkaWN0X3JmYzQwMDRfYXZwcyIpOworCisKKwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X3JmYzU0NDdfYXZwcy9yZmM1NDQ3X2F2cHMuZGlkIGIvZXh0ZW5zaW9ucy9kaWN0X3JmYzU0NDdfYXZwcy9yZmM1NDQ3X2F2cHMuZGlkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyMjVkNWQKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfcmZjNTQ0N19hdnBzL3JmYzU0NDdfYXZwcy5kaWQKQEAgLTAsMCArMSwyIEBACitkaWN0X3JmYzQwMDRfYXZwcworZGljdF9yZmM1NDQ3X2F2cHMKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF9yZmM1NTgwX2F2cHMvQ01ha2VMaXN0cy50eHQgYi9leHRlbnNpb25zL2RpY3RfcmZjNTU4MF9hdnBzL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxZjUwMzQKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfcmZjNTU4MF9hdnBzL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTYgQEAKKyMgVGhlIGRpY3RfcmZjNTU4MF9hdnBzIGV4dGVuc2lvbgorUFJPSkVDVCgiZGljdF9yZmM1NTgwX2F2cHMgbGlicmFyeSBnZW5lcmF0ZWQgYnkgRmRHZW4gIiBDKQorCisjIENvbXBpbGUgYXMgYSBtb2R1bGUKK0ZEX0FERF9FWFRFTlNJT04oZGljdF9yZmM1NTgwX2F2cHMgZGljdF9yZmM1NTgwX2F2cHMuYykKKworCisjIyMjCisjIyBJTlNUQUxMIHNlY3Rpb24gIyMKKworSU5TVEFMTChUQVJHRVRTIGRpY3RfcmZjNTU4MF9hdnBzCisJTElCUkFSWSBERVNUSU5BVElPTiAke0lOU1RBTExfRVhURU5TSU9OU19TVUZGSVh9CitDT01QT05FTlQgZnJlZURpYW1ldGVyLWRpY3Rpb25hcnktUkZDNTU4MF9BVlBTKQorCisKKwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X3JmYzU1ODBfYXZwcy9kaWN0X3JmYzU1ODBfYXZwcy5jIGIvZXh0ZW5zaW9ucy9kaWN0X3JmYzU1ODBfYXZwcy9kaWN0X3JmYzU1ODBfYXZwcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZjU1YzEKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfcmZjNTU4MF9hdnBzL2RpY3RfcmZjNTU4MF9hdnBzLmMKQEAgLTAsMCArMSwyNjAgQEAKKy8qCisqIENvcHlyaWdodCAoYykgMjAxNyBTcHJpbnQKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLyoqKioqKioqKioqKioqKioKKyBHZW5lcmF0ZWQgQnk6IGZkdG9vbCBlbmhhbmNlbWVudHMgdG8gZGlhZnV6emVyCisgTGljZW5zZTogc2FtZSBhcyBmcmVlRGlhbWV0ZXIKKyoqKioqKioqKioqKioqKiovCisKKworLyogCisgKiBEaWN0aW9uYXJ5IGRlZmluaXRpb25zIG9mIG9iamVjdHMgc3BlY2lmaWVkIGluIHJmYzU1ODBfYXZwcy4KKyAqLworI2luY2x1ZGUgPGZyZWVEaWFtZXRlci9leHRlbnNpb24uaD4KKworI2RlZmluZSBQUk9UT19WRVIgInVuc3BlY2lmaWVkIgorI2RlZmluZSBHRU5fREFURSAgMTUwNjY5NzE5MS4zMgorCitjb25zdCBjaGFyICpyZmM1NTgwX2F2cHNfcHJvdG9fdmVyID0gUFJPVE9fVkVSOworY29uc3QgZG91YmxlIHJmYzU1ODBfYXZwc19nZW5fZGF0ZSA9IEdFTl9EQVRFOworCisvKiBUaGUgY29udGVudCBvZiB0aGlzIGZpbGUgZm9sbG93cyB0aGUgc2FtZSBzdHJ1Y3R1cmUgYXMgZGljdF9iYXNlX3Byb3RvLmMgKi8KKworI2RlZmluZSBDSEVDS19kaWN0X25ldyggX3R5cGUsIF9kYXRhLCBfcGFyZW50LCBfcmVmICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBfcmV0ID0gZmRfZGljdF9uZXcoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgKF90eXBlKSwgKF9kYXRhKSwgKF9wYXJlbnQpLCAoX3JlZikgKTsgXAorICAgIGlmICggX3JldCAhPSAwICYmIF9yZXQgIT0gRUVYSVNUICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHJldHVybiBfcmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIENIRUNLX2RpY3Rfc2VhcmNoKCBfdHlwZSwgX2NyaXRlcmlhLCBfd2hhdCwgX3Jlc3VsdCApCQlcCisgICAgQ0hFQ0tfRkNUKCAgZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgKF90eXBlKSwgKF9jcml0ZXJpYSksIChfd2hhdCksIChfcmVzdWx0KSwgRU5PRU5UKSApOworCitzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiB7CisgICAgc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWU7CisgICAgZW51bSBydWxlX3Bvc2l0aW9uCXBvc2l0aW9uOworICAgIGludCAJCQltaW47CisgICAgaW50CQkJbWF4OworfTsKKworI2RlZmluZSBSVUxFX09SREVSKCBfcG9zaXRpb24gKSAoKCgoX3Bvc2l0aW9uKSA9PSBSVUxFX0ZJWEVEX0hFQUQpIHx8ICgoX3Bvc2l0aW9uKSA9PSBSVUxFX0ZJWEVEX1RBSUwpKSA/IDEgOiAwICkKKworLyogQXR0ZW50aW9uISBUaGlzIHZlcnNpb24gb2YgdGhlIG1hY3JvIHVzZXMgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgaW4gY29udHJhc3QgdG8gbW9zdCBvdGhlciBjb3BpZXMhICovCisjZGVmaW5lIFBBUlNFX2xvY19ydWxlcyggX3J1bGVhcnJheSwgX3BhcmVudCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IF9fYXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKF9fYXI9MDsgX19hciA8IHNpemVvZihfcnVsZWFycmF5KSAvIHNpemVvZigoX3J1bGVhcnJheSlbMF0pOyBfX2FyKyspIHsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgc3RydWN0IGRpY3RfcnVsZV9kYXRhIF9fZGF0YSA9IHsgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5wb3NpdGlvbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ubWluLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5tYXh9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIF9fZGF0YS5ydWxlX29yZGVyID0gUlVMRV9PUkRFUihfX2RhdGEucnVsZV9wb3NpdGlvbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgQ0hFQ0tfRkNUKCAgZmRfZGljdF9zZWFyY2goICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgRElDVF9BVlAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICYoX3J1bGVhcnJheSlbX19hcl0uYXZwX3ZlbmRvcl9wbHVzX25hbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgJl9fZGF0YS5ydWxlX2F2cCwgMCApICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYgKCAhX19kYXRhLnJ1bGVfYXZwICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFX0RFQlVHKElORk8sICJBVlAgTm90IGZvdW5kOiAnJXMnIiwgKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLmF2cF9uYW1lKTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVOT0VOVDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBfcmV0ID0gZmRfZGljdF9uZXcoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9SVUxFLCAmKF9fZGF0YSksIChfcGFyZW50KSwgTlVMTCApOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBfcmV0ICE9IDAgJiYgX3JldCAhPSBFRVhJU1QgKSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfREVCVUcoSU5GTywgIkVycm9yIG9uIHJ1bGUgd2l0aCBBVlAgJyVzJyIsICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0uYXZwX3ZlbmRvcl9wbHVzX25hbWUuYXZwX25hbWUpOyAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFSU5WQUw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBDSEVDS192ZW5kb3JfbmV3KCBfZGF0YSApIHsgXAorICAgICAgICBzdHJ1Y3QgZGljdF9vYmplY3QgKiB2ZW5kb3JfZm91bmQ7IFwKKyAgICAgICAgaWYgKGZkX2RpY3Rfc2VhcmNoKGZkX2dfY29uZmlnLT5jbmZfZGljdCxESUNUX1ZFTkRPUixWRU5ET1JfQllfSUQsJl9kYXRhLnZlbmRvcl9pZCwmdmVuZG9yX2ZvdW5kLEVOT0VOVCkgPT0gRU5PRU5UKSB7IFwKKyAgICAgICAgICAgICAgICBDSEVDS19GQ1QoZmRfZGljdF9uZXcoZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1ZFTkRPUiwgJl9kYXRhLCBOVUxMLCBOVUxMKSk7IFwKKyAgICAgICAgfSBcCit9CisKKyNkZWZpbmUgZW51bXZhbF9kZWZfdTMyKCBfdmFsXywgX3N0cl8gKQkJXAorICAgIHsgX3N0cl8sIAkJeyAudTMyID0gX3ZhbF8gfX0KKworI2RlZmluZSBlbnVtdmFsX2RlZl9vcyggX2xlbl8sIF92YWxfLCBfc3RyXyApCQkJCVwKKyAgICB7IF9zdHJfLCAJCXsgLm9zID0geyAuZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopX3ZhbF8sIC5sZW4gPSBfbGVuXyB9fX0KKworCitzdGF0aWMgaW50IGRpY3RfcmZjNTU4MF9hdnBzX2xvYWRfZGVmcyhjaGFyICogY29uZmZpbGUpCit7CisgICBUUkFDRV9FTlRSWSgiJXAiLCBjb25mZmlsZSk7CisKKyAgIC8qIEFWUCBzZWN0aW9uICovCisgICB7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIEFkZHJlc3NfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogVVRGOFN0cmluZ190eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBEaWFtZXRlcklkZW50aXR5X3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIERpYW1ldGVyVVJJX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIFRpbWVfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogSVBGaWx0ZXJSdWxlX3R5cGU7CisKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiQWRkcmVzcyIsICZBZGRyZXNzX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJVVEY4U3RyaW5nIiwgJlVURjhTdHJpbmdfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkRpYW1ldGVySWRlbnRpdHkiLCAmRGlhbWV0ZXJJZGVudGl0eV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiRGlhbWV0ZXJVUkkiLCAmRGlhbWV0ZXJVUklfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIlRpbWUiLCAmVGltZV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiSVBGaWx0ZXJSdWxlIiwgJklQRmlsdGVyUnVsZV90eXBlKTsKKwkJLyogT3BlcmF0b3ItTmFtZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEyNiwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJPcGVyYXRvci1OYW1lIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogTG9jYXRpb24tSW5mb3JtYXRpb24gKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMjcsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiTG9jYXRpb24tSW5mb3JtYXRpb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBMb2NhdGlvbi1EYXRhICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTI4LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIkxvY2F0aW9uLURhdGEiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBCYXNpYy1Mb2NhdGlvbi1Qb2xpY3ktUnVsZXMgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMjksCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiQmFzaWMtTG9jYXRpb24tUG9saWN5LVJ1bGVzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogRXh0ZW5kZWQtTG9jYXRpb24tUG9saWN5LVJ1bGVzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTMwLAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIkV4dGVuZGVkLUxvY2F0aW9uLVBvbGljeS1SdWxlcyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIExvY2F0aW9uLUNhcGFibGUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMzEsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiTG9jYXRpb24tQ2FwYWJsZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFJlcXVlc3RlZC1Mb2NhdGlvbi1JbmZvICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTMyLAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIlJlcXVlc3RlZC1Mb2NhdGlvbi1JbmZvIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogRXJyb3ItQ2F1c2UgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMDEsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiRXJyb3ItQ2F1c2UiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCisJCisgICB9CisKKyAgIC8qIENvbW1hbmRzIHNlY3Rpb24gKi8KKyAgIHsKKworICAgfQorCisgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkaWN0X3JmYzU1ODBfYXZwc19sb2FkX3J1bGVzKGNoYXIgKiBjb25mZmlsZSkKK3sKKyAgIC8qIEdyb3VwZWQgQVZQIHNlY3Rpb24gKi8KKyAgIHsKKworICAgfQkKKworICAgLyogQ29tbWFuZHMgc2VjdGlvbiAqLworICAgeworCisgICB9CisKKyAgIExPR19EKCAiRXh0ZW5zaW9uICdEaWN0aW9uYXJ5IGRlZmluaXRpb25zIGZvciByZmM1NTgwX2F2cHMgKE5vbmUpJyBpbml0aWFsaXplZCIpOworICAgcmV0dXJuIDA7Cit9CisKK2ludCBkaWN0X2VudHJ5KGNoYXIgKiBjb25mZmlsZSkKK3sKKwlkaWN0X3JmYzU1ODBfYXZwc19sb2FkX2RlZnMoY29uZmZpbGUpOworCXJldHVybiBkaWN0X3JmYzU1ODBfYXZwc19sb2FkX3J1bGVzKGNvbmZmaWxlKTsKK30KKworY29uc3QgY2hhciogZGljdF9yZmM1NTgwX2F2cHNfcHJvdG9fdmVyKGNoYXIgKiBjb25mZmlsZSkgeworCXJldHVybiByZmM1NTgwX2F2cHNfcHJvdG9fdmVyOworfQorCitjb25zdCBkb3VibGUgZGljdF9yZmM1NTgwX2F2cHNfZ2VuX3RzKGNoYXIgKiBjb25mZmlsZSkgeworCXJldHVybiByZmM1NTgwX2F2cHNfZ2VuX2RhdGU7Cit9CisKK0VYVEVOU0lPTl9FTlRSWTIoImRpY3RfcmZjNTU4MF9hdnBzIiwgZGljdF9yZmM1NTgwX2F2cHNfbG9hZF9kZWZzLCBkaWN0X3JmYzU1ODBfYXZwc19sb2FkX3J1bGVzKTsKKworCisKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF9yZmM1NTgwX2F2cHMvcmZjNTU4MF9hdnBzLmRpZCBiL2V4dGVuc2lvbnMvZGljdF9yZmM1NTgwX2F2cHMvcmZjNTU4MF9hdnBzLmRpZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGNhNmZiCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kaWN0X3JmYzU1ODBfYXZwcy9yZmM1NTgwX2F2cHMuZGlkCkBAIC0wLDAgKzEgQEAKK2RpY3RfcmZjNTU4MF9hdnBzCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfcmZjNTc3N19hdnBzL0NNYWtlTGlzdHMudHh0IGIvZXh0ZW5zaW9ucy9kaWN0X3JmYzU3NzdfYXZwcy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDU3M2M0Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kaWN0X3JmYzU3NzdfYXZwcy9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDE2IEBACisjIFRoZSBkaWN0X3JmYzU3NzdfYXZwcyBleHRlbnNpb24KK1BST0pFQ1QoImRpY3RfcmZjNTc3N19hdnBzIGxpYnJhcnkgZ2VuZXJhdGVkIGJ5IEZkR2VuICIgQykKKworIyBDb21waWxlIGFzIGEgbW9kdWxlCitGRF9BRERfRVhURU5TSU9OKGRpY3RfcmZjNTc3N19hdnBzIGRpY3RfcmZjNTc3N19hdnBzLmMpCisKKworIyMjIworIyMgSU5TVEFMTCBzZWN0aW9uICMjCisKK0lOU1RBTEwoVEFSR0VUUyBkaWN0X3JmYzU3NzdfYXZwcworCUxJQlJBUlkgREVTVElOQVRJT04gJHtJTlNUQUxMX0VYVEVOU0lPTlNfU1VGRklYfQorQ09NUE9ORU5UIGZyZWVEaWFtZXRlci1kaWN0aW9uYXJ5LVJGQzU3NzdfQVZQUykKKworCisKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF9yZmM1Nzc3X2F2cHMvZGljdF9yZmM1Nzc3X2F2cHMuYyBiL2V4dGVuc2lvbnMvZGljdF9yZmM1Nzc3X2F2cHMvZGljdF9yZmM1Nzc3X2F2cHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjg3OTYzCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kaWN0X3JmYzU3NzdfYXZwcy9kaWN0X3JmYzU3NzdfYXZwcy5jCkBAIC0wLDAgKzEsMjA3NyBAQAorLyoKKyogQ29weXJpZ2h0IChjKSAyMDE3IFNwcmludAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvKioqKioqKioqKioqKioqKgorIEdlbmVyYXRlZCBCeTogZmR0b29sIGVuaGFuY2VtZW50cyB0byBkaWFmdXp6ZXIKKyBMaWNlbnNlOiBzYW1lIGFzIGZyZWVEaWFtZXRlcgorKioqKioqKioqKioqKioqKi8KKworCisvKiAKKyAqIERpY3Rpb25hcnkgZGVmaW5pdGlvbnMgb2Ygb2JqZWN0cyBzcGVjaWZpZWQgaW4gcmZjNTc3N19hdnBzLgorICovCisjaW5jbHVkZSA8ZnJlZURpYW1ldGVyL2V4dGVuc2lvbi5oPgorCisjZGVmaW5lIFBST1RPX1ZFUiAidW5zcGVjaWZpZWQiCisjZGVmaW5lIEdFTl9EQVRFICAxNTA2Njk3MTQzLjU2CisKK2NvbnN0IGNoYXIgKnJmYzU3NzdfYXZwc19wcm90b192ZXIgPSBQUk9UT19WRVI7Citjb25zdCBkb3VibGUgcmZjNTc3N19hdnBzX2dlbl9kYXRlID0gR0VOX0RBVEU7CisKKy8qIFRoZSBjb250ZW50IG9mIHRoaXMgZmlsZSBmb2xsb3dzIHRoZSBzYW1lIHN0cnVjdHVyZSBhcyBkaWN0X2Jhc2VfcHJvdG8uYyAqLworCisjZGVmaW5lIENIRUNLX2RpY3RfbmV3KCBfdHlwZSwgX2RhdGEsIF9wYXJlbnQsIF9yZWYgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IF9yZXQgPSBmZF9kaWN0X25ldyggZmRfZ19jb25maWctPmNuZl9kaWN0LCAoX3R5cGUpLCAoX2RhdGEpLCAoX3BhcmVudCksIChfcmVmKSApOyBcCisgICAgaWYgKCBfcmV0ICE9IDAgJiYgX3JldCAhPSBFRVhJU1QgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgcmV0dXJuIF9yZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgQ0hFQ0tfZGljdF9zZWFyY2goIF90eXBlLCBfY3JpdGVyaWEsIF93aGF0LCBfcmVzdWx0ICkJCVwKKyAgICBDSEVDS19GQ1QoICBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCAoX3R5cGUpLCAoX2NyaXRlcmlhKSwgKF93aGF0KSwgKF9yZXN1bHQpLCBFTk9FTlQpICk7CisKK3N0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHsKKyAgICBzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZTsKKyAgICBlbnVtIHJ1bGVfcG9zaXRpb24JcG9zaXRpb247CisgICAgaW50IAkJCW1pbjsKKyAgICBpbnQJCQltYXg7Cit9OworCisjZGVmaW5lIFJVTEVfT1JERVIoIF9wb3NpdGlvbiApICgoKChfcG9zaXRpb24pID09IFJVTEVfRklYRURfSEVBRCkgfHwgKChfcG9zaXRpb24pID09IFJVTEVfRklYRURfVEFJTCkpID8gMSA6IDAgKQorCisvKiBBdHRlbnRpb24hIFRoaXMgdmVyc2lvbiBvZiB0aGUgbWFjcm8gdXNlcyBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCBpbiBjb250cmFzdCB0byBtb3N0IG90aGVyIGNvcGllcyEgKi8KKyNkZWZpbmUgUEFSU0VfbG9jX3J1bGVzKCBfcnVsZWFycmF5LCBfcGFyZW50KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgX19hcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoX19hcj0wOyBfX2FyIDwgc2l6ZW9mKF9ydWxlYXJyYXkpIC8gc2l6ZW9mKChfcnVsZWFycmF5KVswXSk7IF9fYXIrKykgeyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgZGljdF9ydWxlX2RhdGEgX19kYXRhID0geyBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLnBvc2l0aW9uLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5taW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLm1heH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgX19kYXRhLnJ1bGVfb3JkZXIgPSBSVUxFX09SREVSKF9fZGF0YS5ydWxlX3Bvc2l0aW9uKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBDSEVDS19GQ1QoICBmZF9kaWN0X3NlYXJjaCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgZmRfZ19jb25maWctPmNuZl9kaWN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBESUNUX0FWUCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgJihfcnVsZWFycmF5KVtfX2FyXS5hdnBfdmVuZG9yX3BsdXNfbmFtZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAmX19kYXRhLnJ1bGVfYXZwLCAwICkgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpZiAoICFfX2RhdGEucnVsZV9hdnAgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfREVCVUcoSU5GTywgIkFWUCBOb3QgZm91bmQ6ICclcyciLCAoX3J1bGVhcnJheSlbX19hcl0uYXZwX3ZlbmRvcl9wbHVzX25hbWUuYXZwX25hbWUpOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRU5PRU5UOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IF9yZXQgPSBmZF9kaWN0X25ldyggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1JVTEUsICYoX19kYXRhKSwgKF9wYXJlbnQpLCBOVUxMICk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIF9yZXQgIT0gMCAmJiBfcmV0ICE9IEVFWElTVCApICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9ERUJVRyhJTkZPLCAiRXJyb3Igb24gcnVsZSB3aXRoIEFWUCAnJXMnIiwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5hdnBfdmVuZG9yX3BsdXNfbmFtZS5hdnBfbmFtZSk7ICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVJTlZBTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIENIRUNLX3ZlbmRvcl9uZXcoIF9kYXRhICkgeyBcCisgICAgICAgIHN0cnVjdCBkaWN0X29iamVjdCAqIHZlbmRvcl9mb3VuZDsgXAorICAgICAgICBpZiAoZmRfZGljdF9zZWFyY2goZmRfZ19jb25maWctPmNuZl9kaWN0LERJQ1RfVkVORE9SLFZFTkRPUl9CWV9JRCwmX2RhdGEudmVuZG9yX2lkLCZ2ZW5kb3JfZm91bmQsRU5PRU5UKSA9PSBFTk9FTlQpIHsgXAorICAgICAgICAgICAgICAgIENIRUNLX0ZDVChmZF9kaWN0X25ldyhmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfVkVORE9SLCAmX2RhdGEsIE5VTEwsIE5VTEwpKTsgXAorICAgICAgICB9IFwKK30KKworI2RlZmluZSBlbnVtdmFsX2RlZl91MzIoIF92YWxfLCBfc3RyXyApCQlcCisgICAgeyBfc3RyXywgCQl7IC51MzIgPSBfdmFsXyB9fQorCisjZGVmaW5lIGVudW12YWxfZGVmX29zKCBfbGVuXywgX3ZhbF8sIF9zdHJfICkJCQkJXAorICAgIHsgX3N0cl8sIAkJeyAub3MgPSB7IC5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilfdmFsXywgLmxlbiA9IF9sZW5fIH19fQorCisKK3N0YXRpYyBpbnQgZGljdF9yZmM1Nzc3X2F2cHNfbG9hZF9kZWZzKGNoYXIgKiBjb25mZmlsZSkKK3sKKyAgIFRSQUNFX0VOVFJZKCIlcCIsIGNvbmZmaWxlKTsKKworICAgLyogQVZQIHNlY3Rpb24gKi8KKyAgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogQWRkcmVzc190eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBVVEY4U3RyaW5nX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIERpYW1ldGVySWRlbnRpdHlfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogRGlhbWV0ZXJVUklfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogVGltZV90eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBJUEZpbHRlclJ1bGVfdHlwZTsKKworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJBZGRyZXNzIiwgJkFkZHJlc3NfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIlVURjhTdHJpbmciLCAmVVRGOFN0cmluZ190eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiRGlhbWV0ZXJJZGVudGl0eSIsICZEaWFtZXRlcklkZW50aXR5X3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJEaWFtZXRlclVSSSIsICZEaWFtZXRlclVSSV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiVGltZSIsICZUaW1lX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJJUEZpbHRlclJ1bGUiLCAmSVBGaWx0ZXJSdWxlX3R5cGUpOworCQkvKiBGaWx0ZXItUnVsZS1QcmVjZWRlbmNlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNTEwLAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIkZpbHRlci1SdWxlLVByZWNlZGVuY2UiLAkvKiBOYW1lICovCisJCQkJMCwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogQ2xhc3NpZmllci1JRCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTUxMiwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJDbGFzc2lmaWVyLUlEIiwJLyogTmFtZSAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJMCwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBQcm90b2NvbCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTUxMywJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJQcm90b2NvbCIsCS8qIE5hbWUgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIkVudW1lcmF0ZWQoUHJvdG9jb2wpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJIT1BPUFQiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiSUNNUCIsIHsgLmkzMj0xIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMgPSB7ICJJR01QIiwgeyAuaTMyPTIgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNCA9IHsgIkdHUCIsIHsgLmkzMj0zIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzUgPSB7ICJJUHY0IiwgeyAuaTMyPTQgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNiA9IHsgIlNUIiwgeyAuaTMyPTUgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNyA9IHsgIlRDUCIsIHsgLmkzMj02IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzggPSB7ICJDQlQiLCB7IC5pMzI9NyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF85ID0geyAiRUdQIiwgeyAuaTMyPTggfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTAgPSB7ICJJR1AiLCB7IC5pMzI9OSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xMSA9IHsgIkJCTi1SQ0MtTU9OIiwgeyAuaTMyPTEwIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEyID0geyAiTlZQLUlJIiwgeyAuaTMyPTExIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEzID0geyAiUFVQIiwgeyAuaTMyPTEyIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzE0ID0geyAiQVJHVVMiLCB7IC5pMzI9MTMgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTUgPSB7ICJFTUNPTiIsIHsgLmkzMj0xNCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xNiA9IHsgIlhORVQiLCB7IC5pMzI9MTUgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTcgPSB7ICJDSEFPUyIsIHsgLmkzMj0xNiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xOCA9IHsgIlVEUCIsIHsgLmkzMj0xNyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xOSA9IHsgIk1VWCIsIHsgLmkzMj0xOCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yMCA9IHsgIkRDTi1NRUFTIiwgeyAuaTMyPTE5IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIxID0geyAiSE1QIiwgeyAuaTMyPTIwIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIyID0geyAiUFJNIiwgeyAuaTMyPTIxIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIzID0geyAiWE5TLUlEUCIsIHsgLmkzMj0yMiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yNCA9IHsgIlRSVU5LLTEiLCB7IC5pMzI9MjMgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMjUgPSB7ICJUUlVOSy0yIiwgeyAuaTMyPTI0IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzI2ID0geyAiTEVBRi0xIiwgeyAuaTMyPTI1IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzI3ID0geyAiTEVBRi0yIiwgeyAuaTMyPTI2IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzI4ID0geyAiUkRQIiwgeyAuaTMyPTI3IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzI5ID0geyAiSVJUUCIsIHsgLmkzMj0yOCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zMCA9IHsgIklTTy1UUDQiLCB7IC5pMzI9MjkgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMzEgPSB7ICJORVRCTFQiLCB7IC5pMzI9MzAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMzIgPSB7ICJNRkUtTlNQIiwgeyAuaTMyPTMxIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMzID0geyAiTUVSSVQtSU5QIiwgeyAuaTMyPTMyIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzM0ID0geyAiRENDUCIsIHsgLmkzMj0zMyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zNSA9IHsgIjNQQyIsIHsgLmkzMj0zNCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zNiA9IHsgIklEUFIiLCB7IC5pMzI9MzUgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMzcgPSB7ICJYVFAiLCB7IC5pMzI9MzYgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMzggPSB7ICJERFAiLCB7IC5pMzI9MzcgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMzkgPSB7ICJJRFBSLUNNVFAiLCB7IC5pMzI9MzggfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNDAgPSB7ICJUUHBsdXNwbHVzIiwgeyAuaTMyPTM5IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzQxID0geyAiSUwiLCB7IC5pMzI9NDAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNDIgPSB7ICJJUHY2IiwgeyAuaTMyPTQxIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzQzID0geyAiU0RSUCIsIHsgLmkzMj00MiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF80NCA9IHsgIklQdjYtUm91dGUiLCB7IC5pMzI9NDMgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNDUgPSB7ICJJUHY2LUZyYWciLCB7IC5pMzI9NDQgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNDYgPSB7ICJJRFJQIiwgeyAuaTMyPTQ1IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzQ3ID0geyAiUlNWUCIsIHsgLmkzMj00NiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF80OCA9IHsgIkdSRSIsIHsgLmkzMj00NyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF80OSA9IHsgIkRTUiIsIHsgLmkzMj00OCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF81MCA9IHsgIkJOQSIsIHsgLmkzMj00OSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF81MSA9IHsgIkVTUCIsIHsgLmkzMj01MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF81MiA9IHsgIkFIIiwgeyAuaTMyPTUxIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzUzID0geyAiSS1OTFNQIiwgeyAuaTMyPTUyIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzU0ID0geyAiU1dJUEUiLCB7IC5pMzI9NTMgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNTUgPSB7ICJOQVJQIiwgeyAuaTMyPTU0IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzU2ID0geyAiTU9CSUxFIiwgeyAuaTMyPTU1IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzU3ID0geyAiVExTUCIsIHsgLmkzMj01NiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF81OCA9IHsgIlNLSVAiLCB7IC5pMzI9NTcgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNTkgPSB7ICJJUHY2LUlDTVAiLCB7IC5pMzI9NTggfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNjAgPSB7ICJJUHY2LU5vTnh0IiwgeyAuaTMyPTU5IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzYxID0geyAiSVB2Ni1PcHRzIiwgeyAuaTMyPTYwIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzYyID0geyAiQ0ZUUCIsIHsgLmkzMj02MiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF82MyA9IHsgIlNBVC1FWFBBSyIsIHsgLmkzMj02NCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF82NCA9IHsgIktSWVBUT0xBTiIsIHsgLmkzMj02NSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF82NSA9IHsgIlJWRCIsIHsgLmkzMj02NiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF82NiA9IHsgIklQUEMiLCB7IC5pMzI9NjcgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNjcgPSB7ICJTQVQtTU9OIiwgeyAuaTMyPTY5IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzY4ID0geyAiVklTQSIsIHsgLmkzMj03MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF82OSA9IHsgIklQQ1YiLCB7IC5pMzI9NzEgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNzAgPSB7ICJDUE5YIiwgeyAuaTMyPTcyIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzcxID0geyAiQ1BIQiIsIHsgLmkzMj03MyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF83MiA9IHsgIldTTiIsIHsgLmkzMj03NCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF83MyA9IHsgIlBWUCIsIHsgLmkzMj03NSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF83NCA9IHsgIkJSLVNBVC1NT04iLCB7IC5pMzI9NzYgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNzUgPSB7ICJTVU4tTkQiLCB7IC5pMzI9NzcgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNzYgPSB7ICJXQi1NT04iLCB7IC5pMzI9NzggfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNzcgPSB7ICJXQi1FWFBBSyIsIHsgLmkzMj03OSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF83OCA9IHsgIklTTy1JUCIsIHsgLmkzMj04MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF83OSA9IHsgIlZNVFAiLCB7IC5pMzI9ODEgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfODAgPSB7ICJTRUNVUkUtVk1UUCIsIHsgLmkzMj04MiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF84MSA9IHsgIlZJTkVTIiwgeyAuaTMyPTgzIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzgyID0geyAiVFRQIiwgeyAuaTMyPTg0IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzgzID0geyAiSVBUTSIsIHsgLmkzMj04NCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF84NCA9IHsgIk5TRk5FVC1JR1AiLCB7IC5pMzI9ODUgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfODUgPSB7ICJER1AiLCB7IC5pMzI9ODYgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfODYgPSB7ICJUQ0YiLCB7IC5pMzI9ODcgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfODcgPSB7ICJFSUdSUCIsIHsgLmkzMj04OCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF84OCA9IHsgIk9TUEZJR1AiLCB7IC5pMzI9ODkgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfODkgPSB7ICJTcHJpdGUtUlBDIiwgeyAuaTMyPTkwIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzkwID0geyAiTEFSUCIsIHsgLmkzMj05MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF85MSA9IHsgIk1UUCIsIHsgLmkzMj05MiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF85MiA9IHsgIkFYXzI1IiwgeyAuaTMyPTkzIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzkzID0geyAiSVBJUCIsIHsgLmkzMj05NCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF85NCA9IHsgIk1JQ1AiLCB7IC5pMzI9OTUgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfOTUgPSB7ICJTQ0MtU1AiLCB7IC5pMzI9OTYgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfOTYgPSB7ICJFVEhFUklQIiwgeyAuaTMyPTk3IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0Xzk3ID0geyAiRU5DQVAiLCB7IC5pMzI9OTggfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfOTggPSB7ICJHTVRQIiwgeyAuaTMyPTEwMCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF85OSA9IHsgIklGTVAiLCB7IC5pMzI9MTAxIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEwMCA9IHsgIlBOTkkiLCB7IC5pMzI9MTAyIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEwMSA9IHsgIlBJTSIsIHsgLmkzMj0xMDMgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTAyID0geyAiQVJJUyIsIHsgLmkzMj0xMDQgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTAzID0geyAiU0NQUyIsIHsgLmkzMj0xMDUgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTA0ID0geyAiUU5YIiwgeyAuaTMyPTEwNiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xMDUgPSB7ICJBX04iLCB7IC5pMzI9MTA3IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEwNiA9IHsgIklQQ29tcCIsIHsgLmkzMj0xMDggfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTA3ID0geyAiU05QIiwgeyAuaTMyPTEwOSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xMDggPSB7ICJDb21wYXEtUGVlciIsIHsgLmkzMj0xMTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTA5ID0geyAiSVBYLWluLUlQIiwgeyAuaTMyPTExMSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xMTAgPSB7ICJWUlJQIiwgeyAuaTMyPTExMiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xMTEgPSB7ICJQR00iLCB7IC5pMzI9MTEzIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzExMiA9IHsgIkwyVFAiLCB7IC5pMzI9MTE1IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzExMyA9IHsgIkREWCIsIHsgLmkzMj0xMTYgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTE0ID0geyAiSUFUUCIsIHsgLmkzMj0xMTcgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTE1ID0geyAiU1RQIiwgeyAuaTMyPTExOCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xMTYgPSB7ICJTUlAiLCB7IC5pMzI9MTE5IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzExNyA9IHsgIlVUSSIsIHsgLmkzMj0xMjAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTE4ID0geyAiU01QIiwgeyAuaTMyPTEyMSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xMTkgPSB7ICJTTSIsIHsgLmkzMj0xMjIgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTIwID0geyAiUFRQIiwgeyAuaTMyPTEyMyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xMjEgPSB7ICJJU0lTb3ZlcklQdjQiLCB7IC5pMzI9MTI0IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEyMiA9IHsgIkZJUkUiLCB7IC5pMzI9MTI1IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEyMyA9IHsgIkNSVFAiLCB7IC5pMzI9MTI2IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEyNCA9IHsgIkNSVURQIiwgeyAuaTMyPTEyNyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xMjUgPSB7ICJTU0NPUE1DRSIsIHsgLmkzMj0xMjggfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTI2ID0geyAiSVBMVCIsIHsgLmkzMj0xMjkgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTI3ID0geyAiU1BTIiwgeyAuaTMyPTEzMCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xMjggPSB7ICJQSVBFIiwgeyAuaTMyPTEzMSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xMjkgPSB7ICJTQ1RQIiwgeyAuaTMyPTEzMiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xMzAgPSB7ICJGQyIsIHsgLmkzMj0xMzMgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTMxID0geyAiUlNWUC1FMkUtSUdOT1JFIiwgeyAuaTMyPTEzNCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xMzIgPSB7ICJNb2JpbGl0eUhlYWRlciIsIHsgLmkzMj0xMzUgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTMzID0geyAiVURQTGl0ZSIsIHsgLmkzMj0xMzYgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTM0ID0geyAiTVBMUy1pbi1JUCIsIHsgLmkzMj0xMzcgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTM1ID0geyAibWFuZXQiLCB7IC5pMzI9MTM4IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEzNiA9IHsgIkhJUCIsIHsgLmkzMj0xMzkgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTM3ID0geyAiU2hpbTYiLCB7IC5pMzI9MTQwIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEzOCA9IHsgIldFU1AiLCB7IC5pMzI9MTQxIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEzOSA9IHsgIlJPSEMiLCB7IC5pMzI9MTQyIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzE0MCA9IHsgIlJlc2VydmVkIiwgeyAuaTMyPTI1NSB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzQsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF82LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzcsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfOCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF85LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEwLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzExLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEyLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEzLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzE0LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzE1LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzE2LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzE3LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzE4LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzE5LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIwLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIxLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIyLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIzLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzI0LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzI1LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzI2LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzI3LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzI4LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzI5LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMwLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMxLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMyLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMzLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzM0LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzM1LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzM2LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzM3LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzM4LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzM5LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzQwLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzQxLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzQyLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzQzLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzQ0LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzQ1LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzQ2LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzQ3LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzQ4LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzQ5LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzUwLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzUxLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzUyLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzUzLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzU0LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzU1LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzU2LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzU3LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzU4LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzU5LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzYwLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzYxLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzYyLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzYzLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzY0LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzY1LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzY2LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzY3LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzY4LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzY5LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzcwLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzcxLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzcyLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzczLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0Xzc0LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0Xzc1LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0Xzc2LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0Xzc3LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0Xzc4LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0Xzc5LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzgwLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzgxLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzgyLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzgzLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0Xzg0LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0Xzg1LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0Xzg2LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0Xzg3LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0Xzg4LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0Xzg5LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzkwLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzkxLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzkyLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzkzLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0Xzk0LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0Xzk1LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0Xzk2LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0Xzk3LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0Xzk4LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0Xzk5LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEwMCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMDEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTAyLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEwMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMDQsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTA1LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEwNiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMDcsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTA4LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEwOSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMTAsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTExLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzExMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMTMsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTE0LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzExNSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMTYsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTE3LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzExOCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMTksIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTIwLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEyMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMjIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTIzLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEyNCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMjUsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTI2LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEyNywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMjgsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTI5LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEzMCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTMyLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEzMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMzQsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTM1LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEzNiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMzcsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTM4LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEzOSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xNDAsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIERpcmVjdGlvbiAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTUxNCwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJEaXJlY3Rpb24iLAkvKiBOYW1lICovCisJCQkJMCwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICJFbnVtZXJhdGVkKERpcmVjdGlvbikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIklOIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIk9VVCIsIHsgLmkzMj0xIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMgPSB7ICJCT1RIIiwgeyAuaTMyPTIgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogTmVnYXRlZCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTUxNywJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJOZWdhdGVkIiwJLyogTmFtZSAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJMCwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiRW51bWVyYXRlZChOZWdhdGVkKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiRmFsc2UiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiVHJ1ZSIsIHsgLmkzMj0xIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBJUC1BZGRyZXNzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNTE4LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIklQLUFkZHJlc3MiLAkvKiBOYW1lICovCisJCQkJMCwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgQWRkcmVzc190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogSVAtQWRkcmVzcy1TdGFydCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTUyMCwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJJUC1BZGRyZXNzLVN0YXJ0IiwJLyogTmFtZSAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJMCwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIEFkZHJlc3NfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIElQLUFkZHJlc3MtRW5kICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNTIxLAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIklQLUFkZHJlc3MtRW5kIiwJLyogTmFtZSAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJMCwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIEFkZHJlc3NfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIElQLUJpdC1NYXNrLVdpZHRoICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNTIzLAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIklQLUJpdC1NYXNrLVdpZHRoIiwJLyogTmFtZSAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJMCwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIE1BQy1BZGRyZXNzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNTI0LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIk1BQy1BZGRyZXNzIiwJLyogTmFtZSAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJMCwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBNQUMtQWRkcmVzcy1NYXNrLVBhdHRlcm4gKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk1MjYsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiTUFDLUFkZHJlc3MtTWFzay1QYXR0ZXJuIiwJLyogTmFtZSAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJMCwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBFVUk2NC1BZGRyZXNzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNTI3LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIkVVSTY0LUFkZHJlc3MiLAkvKiBOYW1lICovCisJCQkJMCwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIEVVSTY0LUFkZHJlc3MtTWFzay1QYXR0ZXJuICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNTI5LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIkVVSTY0LUFkZHJlc3MtTWFzay1QYXR0ZXJuIiwJLyogTmFtZSAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJMCwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBQb3J0ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNTMwLAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIlBvcnQiLAkvKiBOYW1lICovCisJCQkJMCwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBQb3J0LVN0YXJ0ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNTMyLAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIlBvcnQtU3RhcnQiLAkvKiBOYW1lICovCisJCQkJMCwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBQb3J0LUVuZCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTUzMywJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJQb3J0LUVuZCIsCS8qIE5hbWUgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFVzZS1Bc3NpZ25lZC1BZGRyZXNzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNTM0LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIlVzZS1Bc3NpZ25lZC1BZGRyZXNzIiwJLyogTmFtZSAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJMCwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiRW51bWVyYXRlZChVc2UtQXNzaWduZWQtQWRkcmVzcykiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIkZhbHNlIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIlRydWUiLCB7IC5pMzI9MSB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogRGlmZnNlcnYtQ29kZS1Qb2ludCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTUzNSwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJEaWZmc2Vydi1Db2RlLVBvaW50IiwJLyogTmFtZSAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJMCwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiRW51bWVyYXRlZChEaWZmc2Vydi1Db2RlLVBvaW50KSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiQ1MwIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIkNTMSIsIHsgLmkzMj04IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMgPSB7ICJDUzIiLCB7IC5pMzI9MTYgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNCA9IHsgIkNTMyIsIHsgLmkzMj0yNCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF81ID0geyAiQ1M0IiwgeyAuaTMyPTMyIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzYgPSB7ICJDUzUiLCB7IC5pMzI9NDAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNyA9IHsgIkNTNiIsIHsgLmkzMj00OCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF84ID0geyAiQ1M3IiwgeyAuaTMyPTU2IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzkgPSB7ICJBRjExIiwgeyAuaTMyPTEwIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEwID0geyAiQUYxMiIsIHsgLmkzMj0xMiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xMSA9IHsgIkFGMTMiLCB7IC5pMzI9MTQgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTIgPSB7ICJBRjIxIiwgeyAuaTMyPTE4IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEzID0geyAiQUYyMiIsIHsgLmkzMj0yMCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xNCA9IHsgIkFGMjMiLCB7IC5pMzI9MjIgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTUgPSB7ICJBRjMxIiwgeyAuaTMyPTI2IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzE2ID0geyAiQUYzMiIsIHsgLmkzMj0yOCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xNyA9IHsgIkFGMzMiLCB7IC5pMzI9MzAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTggPSB7ICJBRjQxIiwgeyAuaTMyPTM0IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzE5ID0geyAiQUY0MiIsIHsgLmkzMj0zNiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yMCA9IHsgIkFGNDMiLCB7IC5pMzI9MzggfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMjEgPSB7ICJFRiIsIHsgLmkzMj00NiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yMiA9IHsgIlZPSUNFX0FETUlUIiwgeyAuaTMyPTQ0IH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF81LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzYsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF84LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzksIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTAsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTMsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTQsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTUsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTYsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTcsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTgsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTksIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMjAsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMjEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMjIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIEZyYWdtZW50YXRpb24tRmxhZyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTUzNiwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJGcmFnbWVudGF0aW9uLUZsYWciLAkvKiBOYW1lICovCisJCQkJMCwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICJFbnVtZXJhdGVkKEZyYWdtZW50YXRpb24tRmxhZykiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIkRGIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIk1GIiwgeyAuaTMyPTEgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIElQLU9wdGlvbi1UeXBlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNTM4LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIklQLU9wdGlvbi1UeXBlIiwJLyogTmFtZSAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJMCwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiRW51bWVyYXRlZChJUC1PcHRpb24tVHlwZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIkVPT0wiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiTk9QIiwgeyAuaTMyPTEgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMyA9IHsgIlNFQyIsIHsgLmkzMj0yIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzQgPSB7ICJMU1IiLCB7IC5pMzI9MyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF81ID0geyAiVFMiLCB7IC5pMzI9NCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF82ID0geyAiRS1TRUMiLCB7IC5pMzI9NSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF83ID0geyAiQ0lQU08iLCB7IC5pMzI9NiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF84ID0geyAiUlIiLCB7IC5pMzI9NyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF85ID0geyAiU0lEIiwgeyAuaTMyPTggfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTAgPSB7ICJTU1IiLCB7IC5pMzI9OSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xMSA9IHsgIlpTVSIsIHsgLmkzMj0xMCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xMiA9IHsgIk1UVVAiLCB7IC5pMzI9MTEgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTMgPSB7ICJNVFVSIiwgeyAuaTMyPTEyIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzE0ID0geyAiRklOTiIsIHsgLmkzMj0xMyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xNSA9IHsgIlZJU0EiLCB7IC5pMzI9MTQgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTYgPSB7ICJFTkNPREUiLCB7IC5pMzI9MTUgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTcgPSB7ICJJTUlURCIsIHsgLmkzMj0xNiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xOCA9IHsgIkVJUCIsIHsgLmkzMj0xNyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xOSA9IHsgIlRSIiwgeyAuaTMyPTE4IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIwID0geyAiQURERVhUIiwgeyAuaTMyPTE5IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIxID0geyAiUlRSQUxUIiwgeyAuaTMyPTIwIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIyID0geyAiU0RCIiwgeyAuaTMyPTIxIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIzID0geyAiRFBTIiwgeyAuaTMyPTIzIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzI0ID0geyAiVU1QIiwgeyAuaTMyPTI0IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzI1ID0geyAiUVMiLCB7IC5pMzI9MjUgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMjYgPSB7ICJFWFAiLCB7IC5pMzI9MzAgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF80LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzUsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF83LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzgsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfOSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xNCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xNSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xNiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xNywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xOCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xOSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yMCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yNCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yNSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yNiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogSVAtT3B0aW9uLVZhbHVlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNTM5LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIklQLU9wdGlvbi1WYWx1ZSIsCS8qIE5hbWUgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogVENQLU9wdGlvbi1UeXBlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNTQxLAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIlRDUC1PcHRpb24tVHlwZSIsCS8qIE5hbWUgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIkVudW1lcmF0ZWQoVENQLU9wdGlvbi1UeXBlKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiRU9MIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIk5PUCIsIHsgLmkzMj0xIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMgPSB7ICJNQVhfU0VHX1NaIiwgeyAuaTMyPTIgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNCA9IHsgIldpbmRvd19TY2FsZSIsIHsgLmkzMj0zIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzUgPSB7ICJTQUNLX1Blcm1pdHRlZCIsIHsgLmkzMj00IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzYgPSB7ICJTQUNLIiwgeyAuaTMyPTUgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNyA9IHsgIkVjaG8iLCB7IC5pMzI9NiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF84ID0geyAiRWNob19SZXBseSIsIHsgLmkzMj03IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzkgPSB7ICJUaW1lc3RhbXBzIiwgeyAuaTMyPTggfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTAgPSB7ICJQYXJ0aWFsT3JkZXJDb25uZWN0aW9uUGVybWl0dGVkIiwgeyAuaTMyPTkgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTEgPSB7ICJQYXJ0aWFsT3JkZXJTZXJ2aWNlUHJvZmlsZSIsIHsgLmkzMj0xMCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xMiA9IHsgIkNDIiwgeyAuaTMyPTExIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEzID0geyAiQ0NfTkVXIiwgeyAuaTMyPTEyIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzE0ID0geyAiQ0NfRUNITyIsIHsgLmkzMj0xMyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xNSA9IHsgIlRDUF9BbHRlcm5hdGVfQ2hlY2tzdW1fUmVxdWVzdCIsIHsgLmkzMj0xNCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xNiA9IHsgIlRDUF9BbHRlcm5hdGVfQ2hlY2tzdW1fRGF0YSIsIHsgLmkzMj0xNSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xNyA9IHsgIlNrZWV0ZXIiLCB7IC5pMzI9MTYgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTggPSB7ICJCdWJiYSIsIHsgLmkzMj0xNyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xOSA9IHsgIlRyYWlsZXJfQ2hlY2tzdW1fT3B0aW9uIiwgeyAuaTMyPTE4IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIwID0geyAiTUQ1X1NpZ25hdHVyZV9PcHRpb24iLCB7IC5pMzI9MTkgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMjEgPSB7ICJTQ1BTX0NhcGFiaWxpdGllcyIsIHsgLmkzMj0yMCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yMiA9IHsgIlNlbGVjdGl2ZV9OZWdhdGl2ZV9BY2tub3dsZWRnZW1lbnRzIiwgeyAuaTMyPTIxIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIzID0geyAiUmVjb3JkX0JvdW5kYXJpZXMiLCB7IC5pMzI9MjIgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMjQgPSB7ICJDb3JydXB0aW9uX2V4cGVyaWVuY2VkIiwgeyAuaTMyPTIzIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzI1ID0geyAiU05BUCIsIHsgLmkzMj0yNCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yNiA9IHsgIlRDUF9Db21wcmVzc2lvbl9GaWx0ZXIiLCB7IC5pMzI9MjYgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMjcgPSB7ICJRdWljay1TdGFydF9SZXNwb25zZSIsIHsgLmkzMj0yNyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yOCA9IHsgIlVzZXJfVGltZW91dF9PcHRpb24iLCB7IC5pMzI9MjggfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMjkgPSB7ICJUQ1BfQXV0aGVudGljYXRpb25fT3B0aW9uIiwgeyAuaTMyPTI5IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMwID0geyAiTXVsdGlwYXRoX1RDUCIsIHsgLmkzMj0zMCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zMSA9IHsgIlJlc2VydmVkMSIsIHsgLmkzMj0zMSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zMiA9IHsgIlJlc2VydmVkMiIsIHsgLmkzMj0zMiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zMyA9IHsgIlJlc2VydmVkMyIsIHsgLmkzMj0zMyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zNCA9IHsgIlRDUF9GYXN0X09wZW5fQ29va2llIiwgeyAuaTMyPTM0IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzM1ID0geyAiUmVzZXJ2ZWQ0IiwgeyAuaTMyPTY5IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzM2ID0geyAiUmVzZXJ2ZWQ1IiwgeyAuaTMyPTcwIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzM3ID0geyAiUmVzZXJ2ZWQ2IiwgeyAuaTMyPTc2IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzM4ID0geyAiUmVzZXJ2ZWQ3IiwgeyAuaTMyPTc3IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzM5ID0geyAiUmVzZXJ2ZWQ4IiwgeyAuaTMyPTc4IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzQwID0geyAiUkZDMzY5Mi1zdHlsZV9FeHBlcmltZW50XzEiLCB7IC5pMzI9MjUzIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzQxID0geyAiUkZDMzY5Mi1zdHlsZV9FeHBlcmltZW50XzIiLCB7IC5pMzI9MjU0IH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF81LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzYsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF84LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzksIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTAsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTMsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTQsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTUsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTYsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTcsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTgsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTksIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMjAsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMjEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMjIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMjMsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMjQsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMjUsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMjYsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMjcsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMjgsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMjksIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMzAsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMzMsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMzQsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMzUsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMzYsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMzcsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMzgsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMzksIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNDAsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNDEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFRDUC1PcHRpb24tVmFsdWUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk1NDIsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiVENQLU9wdGlvbi1WYWx1ZSIsCS8qIE5hbWUgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogVENQLUZsYWctVHlwZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTU0NCwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJUQ1AtRmxhZy1UeXBlIiwJLyogTmFtZSAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJMCwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIElDTVAtVHlwZS1OdW1iZXIgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk1NDYsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiSUNNUC1UeXBlLU51bWJlciIsCS8qIE5hbWUgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIkVudW1lcmF0ZWQoSUNNUC1UeXBlLU51bWJlcikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIkVjaG9fUmVwbHkiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiRGVzdGluYXRpb25fVW5yZWFjaGFibGUiLCB7IC5pMzI9MyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAiU291cmNlX1F1ZW5jaCIsIHsgLmkzMj00IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzQgPSB7ICJSZWRpcmVjdCIsIHsgLmkzMj01IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzUgPSB7ICJBbHRlcm5hdGVfSG9zdF9BZGRyZXNzIiwgeyAuaTMyPTYgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNiA9IHsgIkVjaG8iLCB7IC5pMzI9OCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF83ID0geyAiUm91dGVyX0FkdmVydGlzZW1lbnQiLCB7IC5pMzI9OSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF84ID0geyAiUm91dGVyX1NvbGljaXRhdGlvbiIsIHsgLmkzMj0xMCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF85ID0geyAiVGltZV9FeGNlZWRlZCIsIHsgLmkzMj0xMSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xMCA9IHsgIlBhcmFtZXRlcl9Qcm9ibGVtIiwgeyAuaTMyPTEyIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzExID0geyAiVGltZXN0YW1wIiwgeyAuaTMyPTEzIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEyID0geyAiVGltZXN0YW1wX1JlcGx5IiwgeyAuaTMyPTE0IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEzID0geyAiSW5mb3JtYXRpb25fUmVxdWVzdCIsIHsgLmkzMj0xNSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xNCA9IHsgIkluZm9ybWF0aW9uX1JlcGx5IiwgeyAuaTMyPTE2IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzE1ID0geyAiQWRkcmVzc19NYXNrX1JlcXVlc3QiLCB7IC5pMzI9MTcgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTYgPSB7ICJBZGRyZXNzX01hc2tfUmVwbHkiLCB7IC5pMzI9MTggfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTcgPSB7ICJUcmFjZXJvdXRlIiwgeyAuaTMyPTMwIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzE4ID0geyAiRGF0YWdyYW1fQ29udmVyc2lvbl9FcnJvciIsIHsgLmkzMj0zMSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xOSA9IHsgIk1vYmlsZV9Ib3N0X1JlZGlyZWN0IiwgeyAuaTMyPTMyIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIwID0geyAiSVB2Nl9XaGVyZS1BcmUtWW91IiwgeyAuaTMyPTMzIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIxID0geyAiSVB2Nl9JLUFtLUhlcmUiLCB7IC5pMzI9MzQgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMjIgPSB7ICJNb2JpbGVfUmVnaXN0cmF0aW9uX1JlcXVlc3QiLCB7IC5pMzI9MzUgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMjMgPSB7ICJNb2JpbGVfUmVnaXN0cmF0aW9uX1JlcGx5IiwgeyAuaTMyPTM2IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzI0ID0geyAiRG9tYWluX05hbWVfUmVxdWVzdCIsIHsgLmkzMj0zNyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yNSA9IHsgIkRvbWFpbl9OYW1lX1JlcGx5IiwgeyAuaTMyPTM4IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzI2ID0geyAiU0tJUCIsIHsgLmkzMj0zOSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yNyA9IHsgIlBob3R1cmlzIiwgeyAuaTMyPTQwIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzI4ID0geyAiSUNNUF9tZXNzYWdlc191dGlsaXplZF9ieV9leHBlcmltZW50YWwiLCB7IC5pMzI9NDEgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMjkgPSB7ICJSRkMzNjkyLXN0eWxlX0V4cGVyaW1lbnRfMSIsIHsgLmkzMj0yNTMgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMzAgPSB7ICJSRkMzNjkyLXN0eWxlX0V4cGVyaW1lbnRfMiIsIHsgLmkzMj0yNTQgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF80LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzUsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF83LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzgsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfOSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xNCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xNSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xNiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xNywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xOCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xOSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yMCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yNCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yNSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yNiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yNywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yOCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yOSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zMCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogSUNNUC1Db2RlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNTQ3LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIklDTVAtQ29kZSIsCS8qIE5hbWUgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIkVudW1lcmF0ZWQoSUNNUC1Db2RlKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiRWNob19SZXBseSIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJEZXN0aW5hdGlvbl9VbnJlYWNoYWJsZSIsIHsgLmkzMj0zIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMgPSB7ICJTb3VyY2VfUXVlbmNoIiwgeyAuaTMyPTQgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNCA9IHsgIlJlZGlyZWN0IiwgeyAuaTMyPTUgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNSA9IHsgIkFsdGVybmF0ZV9Ib3N0X0FkZHJlc3MiLCB7IC5pMzI9NiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF82ID0geyAiRWNobyIsIHsgLmkzMj04IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzcgPSB7ICJSb3V0ZXJfQWR2ZXJ0aXNlbWVudCIsIHsgLmkzMj05IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzggPSB7ICJSb3V0ZXJfU29saWNpdGF0aW9uIiwgeyAuaTMyPTEwIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzkgPSB7ICJUaW1lX0V4Y2VlZGVkIiwgeyAuaTMyPTExIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEwID0geyAiUGFyYW1ldGVyX1Byb2JsZW0iLCB7IC5pMzI9MTIgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTEgPSB7ICJUaW1lc3RhbXAiLCB7IC5pMzI9MTMgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTIgPSB7ICJUaW1lc3RhbXBfUmVwbHkiLCB7IC5pMzI9MTQgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTMgPSB7ICJJbmZvcm1hdGlvbl9SZXF1ZXN0IiwgeyAuaTMyPTE1IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzE0ID0geyAiSW5mb3JtYXRpb25fUmVwbHkiLCB7IC5pMzI9MTYgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTUgPSB7ICJBZGRyZXNzX01hc2tfUmVxdWVzdCIsIHsgLmkzMj0xNyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xNiA9IHsgIkFkZHJlc3NfTWFza19SZXBseSIsIHsgLmkzMj0xOCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xNyA9IHsgIlRyYWNlcm91dGUiLCB7IC5pMzI9MzAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTggPSB7ICJEYXRhZ3JhbV9Db252ZXJzaW9uX0Vycm9yIiwgeyAuaTMyPTMxIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzE5ID0geyAiTW9iaWxlX0hvc3RfUmVkaXJlY3QiLCB7IC5pMzI9MzIgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMjAgPSB7ICJJUHY2X1doZXJlLUFyZS1Zb3UiLCB7IC5pMzI9MzMgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMjEgPSB7ICJJUHY2X0ktQW0tSGVyZSIsIHsgLmkzMj0zNCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yMiA9IHsgIk1vYmlsZV9SZWdpc3RyYXRpb25fUmVxdWVzdCIsIHsgLmkzMj0zNSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yMyA9IHsgIk1vYmlsZV9SZWdpc3RyYXRpb25fUmVwbHkiLCB7IC5pMzI9MzYgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMjQgPSB7ICJEb21haW5fTmFtZV9SZXF1ZXN0IiwgeyAuaTMyPTM3IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzI1ID0geyAiRG9tYWluX05hbWVfUmVwbHkiLCB7IC5pMzI9MzggfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMjYgPSB7ICJTS0lQIiwgeyAuaTMyPTM5IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzI3ID0geyAiUGhvdHVyaXMiLCB7IC5pMzI9NDAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMjggPSB7ICJJQ01QX21lc3NhZ2VzX3V0aWxpemVkX2J5X2V4cGVyaW1lbnRhbCIsIHsgLmkzMj00MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yOSA9IHsgIlJGQzM2OTItc3R5bGVfRXhwZXJpbWVudF8xIiwgeyAuaTMyPTI1MyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zMCA9IHsgIlJGQzM2OTItc3R5bGVfRXhwZXJpbWVudF8yIiwgeyAuaTMyPTI1NCB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzQsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF82LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzcsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfOCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF85LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEwLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzExLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEyLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEzLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzE0LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzE1LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzE2LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzE3LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzE4LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzE5LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIwLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIxLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIyLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIzLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzI0LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzI1LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzI2LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzI3LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzI4LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzI5LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMwLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBFVEgtRXRoZXItVHlwZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTU1MCwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJFVEgtRXRoZXItVHlwZSIsCS8qIE5hbWUgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogRVRILVNBUCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTU1MSwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJFVEgtU0FQIiwJLyogTmFtZSAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJMCwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBTLVZJRC1TdGFydCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTU1MywJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJTLVZJRC1TdGFydCIsCS8qIE5hbWUgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBTLVZJRC1FbmQgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk1NTQsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiUy1WSUQtRW5kIiwJLyogTmFtZSAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJMCwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIEMtVklELVN0YXJ0ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNTU1LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIkMtVklELVN0YXJ0IiwJLyogTmFtZSAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJMCwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIEMtVklELUVuZCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTU1NiwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJDLVZJRC1FbmQiLAkvKiBOYW1lICovCisJCQkJMCwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogTG93LVVzZXItUHJpb3JpdHkgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk1NTgsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiTG93LVVzZXItUHJpb3JpdHkiLAkvKiBOYW1lICovCisJCQkJMCwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogSGlnaC1Vc2VyLVByaW9yaXR5ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNTU5LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIkhpZ2gtVXNlci1Qcmlvcml0eSIsCS8qIE5hbWUgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBUaW1lLU9mLURheS1TdGFydCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTU2MSwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJUaW1lLU9mLURheS1TdGFydCIsCS8qIE5hbWUgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBUaW1lLU9mLURheS1FbmQgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk1NjIsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiVGltZS1PZi1EYXktRW5kIiwJLyogTmFtZSAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJMCwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIERheS1PZi1XZWVrLU1hc2sgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk1NjMsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiRGF5LU9mLVdlZWstTWFzayIsCS8qIE5hbWUgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBEYXktT2YtTW9udGgtTWFzayAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTU2NCwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJEYXktT2YtTW9udGgtTWFzayIsCS8qIE5hbWUgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBNb250aC1PZi1ZZWFyLU1hc2sgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk1NjUsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiTW9udGgtT2YtWWVhci1NYXNrIiwJLyogTmFtZSAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJMCwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIEFic29sdXRlLVN0YXJ0LVRpbWUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk1NjYsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiQWJzb2x1dGUtU3RhcnQtVGltZSIsCS8qIE5hbWUgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBUaW1lX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBBYnNvbHV0ZS1TdGFydC1GcmFjdGlvbmFsLVNlY29uZHMgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk1NjcsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiQWJzb2x1dGUtU3RhcnQtRnJhY3Rpb25hbC1TZWNvbmRzIiwJLyogTmFtZSAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJMCwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIEFic29sdXRlLUVuZC1UaW1lICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNTY4LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIkFic29sdXRlLUVuZC1UaW1lIiwJLyogTmFtZSAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJMCwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFRpbWVfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIEFic29sdXRlLUVuZC1GcmFjdGlvbmFsLVNlY29uZHMgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk1NjksCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiQWJzb2x1dGUtRW5kLUZyYWN0aW9uYWwtU2Vjb25kcyIsCS8qIE5hbWUgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBUaW1lem9uZS1GbGFnICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNTcwLAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIlRpbWV6b25lLUZsYWciLAkvKiBOYW1lICovCisJCQkJMCwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICJFbnVtZXJhdGVkKFRpbWV6b25lLUZsYWcpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJVVEMiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiTE9DQUwiLCB7IC5pMzI9MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAiT0ZGU0VUIiwgeyAuaTMyPTIgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogVGltZXpvbmUtT2Zmc2V0ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNTcxLAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIlRpbWV6b25lLU9mZnNldCIsCS8qIE5hbWUgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFRyZWF0bWVudC1BY3Rpb24gKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk1NzIsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiVHJlYXRtZW50LUFjdGlvbiIsCS8qIE5hbWUgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIkVudW1lcmF0ZWQoVHJlYXRtZW50LUFjdGlvbikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgImRyb3AiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAic2hhcGUiLCB7IC5pMzI9MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAibWFyayIsIHsgLmkzMj0yIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzQgPSB7ICJwZXJtaXQiLCB7IC5pMzI9MyB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzQsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFFvUy1Qcm9maWxlLUlkICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNTczLAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIlFvUy1Qcm9maWxlLUlkIiwJLyogTmFtZSAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJMCwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFFvUy1TZW1hbnRpY3MgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk1NzUsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiUW9TLVNlbWFudGljcyIsCS8qIE5hbWUgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIkVudW1lcmF0ZWQoUW9TLVNlbWFudGljcykiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIlFvU19EZXNpcmVkIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIlFvU19BdmFpbGFibGUiLCB7IC5pMzI9MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAiUW9TX0RlbGl2ZXJlZCIsIHsgLmkzMj0yIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzQgPSB7ICJNaW5pbXVtX1FvUyIsIHsgLmkzMj0zIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzUgPSB7ICJRb1NfQXV0aG9yaXplZCIsIHsgLmkzMj00IH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF81LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBRb1MtUGFyYW1ldGVycyAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTU3NiwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJRb1MtUGFyYW1ldGVycyIsCS8qIE5hbWUgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBFVEgtUHJvdG8tVHlwZSAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTU0OSwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJFVEgtUHJvdG8tVHlwZSIsCS8qIE5hbWUgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBWTEFOLUlELVJhbmdlICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNTUyLAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIlZMQU4tSUQtUmFuZ2UiLAkvKiBOYW1lICovCisJCQkJMCwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogSVAtT3B0aW9uICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNTM3LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIklQLU9wdGlvbiIsCS8qIE5hbWUgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBJUC1BZGRyZXNzLU1hc2sgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk1MjIsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiSVAtQWRkcmVzcy1NYXNrIiwJLyogTmFtZSAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJMCwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIFRpbWUtT2YtRGF5LUNvbmRpdGlvbiAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTU2MCwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJUaW1lLU9mLURheS1Db25kaXRpb24iLAkvKiBOYW1lICovCisJCQkJMCwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogVENQLU9wdGlvbiAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTU0MCwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJUQ1AtT3B0aW9uIiwJLyogTmFtZSAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJMCwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIE1BQy1BZGRyZXNzLU1hc2sgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk1MjUsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiTUFDLUFkZHJlc3MtTWFzayIsCS8qIE5hbWUgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBUQ1AtRmxhZ3MgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk1NDMsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiVENQLUZsYWdzIiwJLyogTmFtZSAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJMCwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIFBvcnQtUmFuZ2UgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk1MzEsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiUG9ydC1SYW5nZSIsCS8qIE5hbWUgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBJQ01QLVR5cGUgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk1NDUsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiSUNNUC1UeXBlIiwJLyogTmFtZSAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJMCwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIFVzZXItUHJpb3JpdHktUmFuZ2UgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk1NTcsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiVXNlci1Qcmlvcml0eS1SYW5nZSIsCS8qIE5hbWUgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBRb1MtUHJvZmlsZS1UZW1wbGF0ZSAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTU3NCwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJRb1MtUHJvZmlsZS1UZW1wbGF0ZSIsCS8qIE5hbWUgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBJUC1BZGRyZXNzLVJhbmdlICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNTE5LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIklQLUFkZHJlc3MtUmFuZ2UiLAkvKiBOYW1lICovCisJCQkJMCwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogRVVJNjQtQWRkcmVzcy1NYXNrICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNTI4LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIkVVSTY0LUFkZHJlc3MtTWFzayIsCS8qIE5hbWUgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBGcm9tLVNwZWMgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk1MTUsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiRnJvbS1TcGVjIiwJLyogTmFtZSAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJMCwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIEV4Y2Vzcy1UcmVhdG1lbnQgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk1NzcsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiRXhjZXNzLVRyZWF0bWVudCIsCS8qIE5hbWUgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBFVEgtT3B0aW9uICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNTQ4LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIkVUSC1PcHRpb24iLAkvKiBOYW1lICovCisJCQkJMCwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogVG8tU3BlYyAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTUxNiwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJUby1TcGVjIiwJLyogTmFtZSAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJMCwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIFFvUy1DYXBhYmlsaXR5ICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNTc4LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIlFvUy1DYXBhYmlsaXR5IiwJLyogTmFtZSAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJMCwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIENsYXNzaWZpZXIgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk1MTEsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiQ2xhc3NpZmllciIsCS8qIE5hbWUgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBGaWx0ZXItUnVsZSAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTUwOSwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJGaWx0ZXItUnVsZSIsCS8qIE5hbWUgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBRb1MtUmVzb3VyY2VzICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNTA4LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIlFvUy1SZXNvdXJjZXMiLAkvKiBOYW1lICovCisJCQkJMCwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKworCQorICAgfQorCisgICAvKiBDb21tYW5kcyBzZWN0aW9uICovCisgICB7CisKKyAgIH0KKworICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGljdF9yZmM1Nzc3X2F2cHNfbG9hZF9ydWxlcyhjaGFyICogY29uZmZpbGUpCit7CisgICAvKiBHcm91cGVkIEFWUCBzZWN0aW9uICovCisgICB7CisJICAvKiBRb1MtUGFyYW1ldGVycyAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJRb1MtUGFyYW1ldGVycyJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKworCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIEVUSC1Qcm90by1UeXBlICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkVUSC1Qcm90by1UeXBlIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkVUSC1FdGhlci1UeXBlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkVUSC1TQVAifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBWTEFOLUlELVJhbmdlICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlZMQU4tSUQtUmFuZ2UifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUy1WSUQtU3RhcnQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUy1WSUQtRW5kIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkMtVklELVN0YXJ0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkMtVklELUVuZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIElQLU9wdGlvbiAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJJUC1PcHRpb24ifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiSVAtT3B0aW9uLVR5cGUifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiSVAtT3B0aW9uLVZhbHVlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk5lZ2F0ZWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBJUC1BZGRyZXNzLU1hc2sgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiSVAtQWRkcmVzcy1NYXNrIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIklQLUFkZHJlc3MifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiSVAtQml0LU1hc2stV2lkdGgifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBUaW1lLU9mLURheS1Db25kaXRpb24gKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVGltZS1PZi1EYXktQ29uZGl0aW9uIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlRpbWUtT2YtRGF5LVN0YXJ0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlRpbWUtT2YtRGF5LUVuZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEYXktT2YtV2Vlay1NYXNrIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRheS1PZi1Nb250aC1NYXNrIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk1vbnRoLU9mLVllYXItTWFzayJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBYnNvbHV0ZS1TdGFydC1UaW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkFic29sdXRlLUVuZC1UaW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlRpbWV6b25lLUZsYWcifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBUQ1AtT3B0aW9uICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlRDUC1PcHRpb24ifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVENQLU9wdGlvbi1UeXBlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlRDUC1PcHRpb24tVmFsdWUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiTmVnYXRlZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIE1BQy1BZGRyZXNzLU1hc2sgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiTUFDLUFkZHJlc3MtTWFzayJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJNQUMtQWRkcmVzcyJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJNQUMtQWRkcmVzcy1NYXNrLVBhdHRlcm4ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBUQ1AtRmxhZ3MgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVENQLUZsYWdzIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlRDUC1GbGFnLVR5cGUifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiTmVnYXRlZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIFBvcnQtUmFuZ2UgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUG9ydC1SYW5nZSJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJQb3J0LVN0YXJ0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlBvcnQtRW5kIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogSUNNUC1UeXBlICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIklDTVAtVHlwZSJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJJQ01QLVR5cGUtTnVtYmVyIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIklDTVAtQ29kZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJOZWdhdGVkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogVXNlci1Qcmlvcml0eS1SYW5nZSAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJVc2VyLVByaW9yaXR5LVJhbmdlIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkxvdy1Vc2VyLVByaW9yaXR5In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkhpZ2gtVXNlci1Qcmlvcml0eSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIFFvUy1Qcm9maWxlLVRlbXBsYXRlICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlFvUy1Qcm9maWxlLVRlbXBsYXRlIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlZlbmRvci1JZCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJRb1MtUHJvZmlsZS1JZCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIElQLUFkZHJlc3MtUmFuZ2UgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiSVAtQWRkcmVzcy1SYW5nZSJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJJUC1BZGRyZXNzLVN0YXJ0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIklQLUFkZHJlc3MtRW5kIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogRVVJNjQtQWRkcmVzcy1NYXNrICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkVVSTY0LUFkZHJlc3MtTWFzayJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJFVUk2NC1BZGRyZXNzIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkVVSTY0LUFkZHJlc3MtTWFzay1QYXR0ZXJuIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogRnJvbS1TcGVjICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkZyb20tU3BlYyJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJJUC1BZGRyZXNzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIklQLUFkZHJlc3MtUmFuZ2UifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiSVAtQWRkcmVzcy1NYXNrIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk1BQy1BZGRyZXNzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk1BQy1BZGRyZXNzLU1hc2sifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRVVJNjQtQWRkcmVzcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJFVUk2NC1BZGRyZXNzLU1hc2sifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUG9ydCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJQb3J0LVJhbmdlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk5lZ2F0ZWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVXNlLUFzc2lnbmVkLUFkZHJlc3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBFeGNlc3MtVHJlYXRtZW50ICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkV4Y2Vzcy1UcmVhdG1lbnQifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVHJlYXRtZW50LUFjdGlvbiJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJRb1MtUHJvZmlsZS1UZW1wbGF0ZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJRb1MtUGFyYW1ldGVycyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIEVUSC1PcHRpb24gKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRVRILU9wdGlvbiJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJFVEgtUHJvdG8tVHlwZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJWTEFOLUlELVJhbmdlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlVzZXItUHJpb3JpdHktUmFuZ2UifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBUby1TcGVjICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlRvLVNwZWMifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiSVAtQWRkcmVzcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJJUC1BZGRyZXNzLVJhbmdlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIklQLUFkZHJlc3MtTWFzayJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJNQUMtQWRkcmVzcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJNQUMtQWRkcmVzcy1NYXNrIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkVVSTY0LUFkZHJlc3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRVVJNjQtQWRkcmVzcy1NYXNrIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlBvcnQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUG9ydC1SYW5nZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJOZWdhdGVkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlVzZS1Bc3NpZ25lZC1BZGRyZXNzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogUW9TLUNhcGFiaWxpdHkgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUW9TLUNhcGFiaWxpdHkifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUW9TLVByb2ZpbGUtVGVtcGxhdGUifSwgUlVMRV9SRVFVSVJFRCwgMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIENsYXNzaWZpZXIgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQ2xhc3NpZmllciJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJDbGFzc2lmaWVyLUlEIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlByb3RvY29sIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRpcmVjdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJGcm9tLVNwZWMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVG8tU3BlYyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEaWZmc2Vydi1Db2RlLVBvaW50In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkZyYWdtZW50YXRpb24tRmxhZyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJJUC1PcHRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVENQLU9wdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJUQ1AtRmxhZ3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiSUNNUC1UeXBlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkVUSC1PcHRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBGaWx0ZXItUnVsZSAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJGaWx0ZXItUnVsZSJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJGaWx0ZXItUnVsZS1QcmVjZWRlbmNlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkNsYXNzaWZpZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVGltZS1PZi1EYXktQ29uZGl0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlRyZWF0bWVudC1BY3Rpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUW9TLVNlbWFudGljcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJRb1MtUHJvZmlsZS1UZW1wbGF0ZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJRb1MtUGFyYW1ldGVycyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJFeGNlc3MtVHJlYXRtZW50In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogUW9TLVJlc291cmNlcyAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJRb1MtUmVzb3VyY2VzIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkZpbHRlci1SdWxlIn0sIFJVTEVfUkVRVUlSRUQsIDEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisKKyAgIH0JCisKKyAgIC8qIENvbW1hbmRzIHNlY3Rpb24gKi8KKyAgIHsKKworICAgfQorCisgICBMT0dfRCggIkV4dGVuc2lvbiAnRGljdGlvbmFyeSBkZWZpbml0aW9ucyBmb3IgcmZjNTc3N19hdnBzIChOb25lKScgaW5pdGlhbGl6ZWQiKTsKKyAgIHJldHVybiAwOworfQorCitpbnQgZGljdF9lbnRyeShjaGFyICogY29uZmZpbGUpCit7CisJZGljdF9yZmM1Nzc3X2F2cHNfbG9hZF9kZWZzKGNvbmZmaWxlKTsKKwlyZXR1cm4gZGljdF9yZmM1Nzc3X2F2cHNfbG9hZF9ydWxlcyhjb25mZmlsZSk7Cit9CisKK2NvbnN0IGNoYXIqIGRpY3RfcmZjNTc3N19hdnBzX3Byb3RvX3ZlcihjaGFyICogY29uZmZpbGUpIHsKKwlyZXR1cm4gcmZjNTc3N19hdnBzX3Byb3RvX3ZlcjsKK30KKworY29uc3QgZG91YmxlIGRpY3RfcmZjNTc3N19hdnBzX2dlbl90cyhjaGFyICogY29uZmZpbGUpIHsKKwlyZXR1cm4gcmZjNTc3N19hdnBzX2dlbl9kYXRlOworfQorCitFWFRFTlNJT05fRU5UUlkyKCJkaWN0X3JmYzU3NzdfYXZwcyIsIGRpY3RfcmZjNTc3N19hdnBzX2xvYWRfZGVmcywgZGljdF9yZmM1Nzc3X2F2cHNfbG9hZF9ydWxlcyk7CisKKworCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfcmZjNTc3N19hdnBzL3JmYzU3NzdfYXZwcy5kaWQgYi9leHRlbnNpb25zL2RpY3RfcmZjNTc3N19hdnBzL3JmYzU3NzdfYXZwcy5kaWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk0ZGRkYgotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF9yZmM1Nzc3X2F2cHMvcmZjNTc3N19hdnBzLmRpZApAQCAtMCwwICsxIEBACitkaWN0X3JmYzU3NzdfYXZwcwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X3JmYzU3NzhfYXZwcy9DTWFrZUxpc3RzLnR4dCBiL2V4dGVuc2lvbnMvZGljdF9yZmM1Nzc4X2F2cHMvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZhYmU1NgotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF9yZmM1Nzc4X2F2cHMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxNiBAQAorIyBUaGUgZGljdF9yZmM1Nzc4X2F2cHMgZXh0ZW5zaW9uCitQUk9KRUNUKCJkaWN0X3JmYzU3NzhfYXZwcyBsaWJyYXJ5IGdlbmVyYXRlZCBieSBGZEdlbiAiIEMpCisKKyMgQ29tcGlsZSBhcyBhIG1vZHVsZQorRkRfQUREX0VYVEVOU0lPTihkaWN0X3JmYzU3NzhfYXZwcyBkaWN0X3JmYzU3NzhfYXZwcy5jKQorCisKKyMjIyMKKyMjIElOU1RBTEwgc2VjdGlvbiAjIworCitJTlNUQUxMKFRBUkdFVFMgZGljdF9yZmM1Nzc4X2F2cHMKKwlMSUJSQVJZIERFU1RJTkFUSU9OICR7SU5TVEFMTF9FWFRFTlNJT05TX1NVRkZJWH0KK0NPTVBPTkVOVCBmcmVlRGlhbWV0ZXItZGljdGlvbmFyeS1SRkM1Nzc4X0FWUFMpCisKKworCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfcmZjNTc3OF9hdnBzL2RpY3RfcmZjNTc3OF9hdnBzLmMgYi9leHRlbnNpb25zL2RpY3RfcmZjNTc3OF9hdnBzL2RpY3RfcmZjNTc3OF9hdnBzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ4ODU2OQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF9yZmM1Nzc4X2F2cHMvZGljdF9yZmM1Nzc4X2F2cHMuYwpAQCAtMCwwICsxLDI4NiBAQAorLyoKKyogQ29weXJpZ2h0IChjKSAyMDE3IFNwcmludAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvKioqKioqKioqKioqKioqKgorIEdlbmVyYXRlZCBCeTogZmR0b29sIGVuaGFuY2VtZW50cyB0byBkaWFmdXp6ZXIKKyBMaWNlbnNlOiBzYW1lIGFzIGZyZWVEaWFtZXRlcgorKioqKioqKioqKioqKioqKi8KKworCisvKiAKKyAqIERpY3Rpb25hcnkgZGVmaW5pdGlvbnMgb2Ygb2JqZWN0cyBzcGVjaWZpZWQgaW4gcmZjNTc3OF9hdnBzLgorICovCisjaW5jbHVkZSA8ZnJlZURpYW1ldGVyL2V4dGVuc2lvbi5oPgorCisjZGVmaW5lIFBST1RPX1ZFUiAidW5zcGVjaWZpZWQiCisjZGVmaW5lIEdFTl9EQVRFICAxNTA2Njk3MTQzLjYxCisKK2NvbnN0IGNoYXIgKnJmYzU3NzhfYXZwc19wcm90b192ZXIgPSBQUk9UT19WRVI7Citjb25zdCBkb3VibGUgcmZjNTc3OF9hdnBzX2dlbl9kYXRlID0gR0VOX0RBVEU7CisKKy8qIFRoZSBjb250ZW50IG9mIHRoaXMgZmlsZSBmb2xsb3dzIHRoZSBzYW1lIHN0cnVjdHVyZSBhcyBkaWN0X2Jhc2VfcHJvdG8uYyAqLworCisjZGVmaW5lIENIRUNLX2RpY3RfbmV3KCBfdHlwZSwgX2RhdGEsIF9wYXJlbnQsIF9yZWYgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IF9yZXQgPSBmZF9kaWN0X25ldyggZmRfZ19jb25maWctPmNuZl9kaWN0LCAoX3R5cGUpLCAoX2RhdGEpLCAoX3BhcmVudCksIChfcmVmKSApOyBcCisgICAgaWYgKCBfcmV0ICE9IDAgJiYgX3JldCAhPSBFRVhJU1QgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgcmV0dXJuIF9yZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgQ0hFQ0tfZGljdF9zZWFyY2goIF90eXBlLCBfY3JpdGVyaWEsIF93aGF0LCBfcmVzdWx0ICkJCVwKKyAgICBDSEVDS19GQ1QoICBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCAoX3R5cGUpLCAoX2NyaXRlcmlhKSwgKF93aGF0KSwgKF9yZXN1bHQpLCBFTk9FTlQpICk7CisKK3N0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHsKKyAgICBzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZTsKKyAgICBlbnVtIHJ1bGVfcG9zaXRpb24JcG9zaXRpb247CisgICAgaW50IAkJCW1pbjsKKyAgICBpbnQJCQltYXg7Cit9OworCisjZGVmaW5lIFJVTEVfT1JERVIoIF9wb3NpdGlvbiApICgoKChfcG9zaXRpb24pID09IFJVTEVfRklYRURfSEVBRCkgfHwgKChfcG9zaXRpb24pID09IFJVTEVfRklYRURfVEFJTCkpID8gMSA6IDAgKQorCisvKiBBdHRlbnRpb24hIFRoaXMgdmVyc2lvbiBvZiB0aGUgbWFjcm8gdXNlcyBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCBpbiBjb250cmFzdCB0byBtb3N0IG90aGVyIGNvcGllcyEgKi8KKyNkZWZpbmUgUEFSU0VfbG9jX3J1bGVzKCBfcnVsZWFycmF5LCBfcGFyZW50KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgX19hcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoX19hcj0wOyBfX2FyIDwgc2l6ZW9mKF9ydWxlYXJyYXkpIC8gc2l6ZW9mKChfcnVsZWFycmF5KVswXSk7IF9fYXIrKykgeyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgZGljdF9ydWxlX2RhdGEgX19kYXRhID0geyBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLnBvc2l0aW9uLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5taW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLm1heH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgX19kYXRhLnJ1bGVfb3JkZXIgPSBSVUxFX09SREVSKF9fZGF0YS5ydWxlX3Bvc2l0aW9uKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBDSEVDS19GQ1QoICBmZF9kaWN0X3NlYXJjaCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgZmRfZ19jb25maWctPmNuZl9kaWN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBESUNUX0FWUCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgJihfcnVsZWFycmF5KVtfX2FyXS5hdnBfdmVuZG9yX3BsdXNfbmFtZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAmX19kYXRhLnJ1bGVfYXZwLCAwICkgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpZiAoICFfX2RhdGEucnVsZV9hdnAgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfREVCVUcoSU5GTywgIkFWUCBOb3QgZm91bmQ6ICclcyciLCAoX3J1bGVhcnJheSlbX19hcl0uYXZwX3ZlbmRvcl9wbHVzX25hbWUuYXZwX25hbWUpOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRU5PRU5UOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IF9yZXQgPSBmZF9kaWN0X25ldyggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1JVTEUsICYoX19kYXRhKSwgKF9wYXJlbnQpLCBOVUxMICk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIF9yZXQgIT0gMCAmJiBfcmV0ICE9IEVFWElTVCApICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9ERUJVRyhJTkZPLCAiRXJyb3Igb24gcnVsZSB3aXRoIEFWUCAnJXMnIiwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5hdnBfdmVuZG9yX3BsdXNfbmFtZS5hdnBfbmFtZSk7ICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVJTlZBTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIENIRUNLX3ZlbmRvcl9uZXcoIF9kYXRhICkgeyBcCisgICAgICAgIHN0cnVjdCBkaWN0X29iamVjdCAqIHZlbmRvcl9mb3VuZDsgXAorICAgICAgICBpZiAoZmRfZGljdF9zZWFyY2goZmRfZ19jb25maWctPmNuZl9kaWN0LERJQ1RfVkVORE9SLFZFTkRPUl9CWV9JRCwmX2RhdGEudmVuZG9yX2lkLCZ2ZW5kb3JfZm91bmQsRU5PRU5UKSA9PSBFTk9FTlQpIHsgXAorICAgICAgICAgICAgICAgIENIRUNLX0ZDVChmZF9kaWN0X25ldyhmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfVkVORE9SLCAmX2RhdGEsIE5VTEwsIE5VTEwpKTsgXAorICAgICAgICB9IFwKK30KKworI2RlZmluZSBlbnVtdmFsX2RlZl91MzIoIF92YWxfLCBfc3RyXyApCQlcCisgICAgeyBfc3RyXywgCQl7IC51MzIgPSBfdmFsXyB9fQorCisjZGVmaW5lIGVudW12YWxfZGVmX29zKCBfbGVuXywgX3ZhbF8sIF9zdHJfICkJCQkJXAorICAgIHsgX3N0cl8sIAkJeyAub3MgPSB7IC5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilfdmFsXywgLmxlbiA9IF9sZW5fIH19fQorCisKK3N0YXRpYyBpbnQgZGljdF9yZmM1Nzc4X2F2cHNfbG9hZF9kZWZzKGNoYXIgKiBjb25mZmlsZSkKK3sKKyAgIFRSQUNFX0VOVFJZKCIlcCIsIGNvbmZmaWxlKTsKKworICAgLyogQVZQIHNlY3Rpb24gKi8KKyAgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogQWRkcmVzc190eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBVVEY4U3RyaW5nX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIERpYW1ldGVySWRlbnRpdHlfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogRGlhbWV0ZXJVUklfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogVGltZV90eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBJUEZpbHRlclJ1bGVfdHlwZTsKKworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJBZGRyZXNzIiwgJkFkZHJlc3NfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIlVURjhTdHJpbmciLCAmVVRGOFN0cmluZ190eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiRGlhbWV0ZXJJZGVudGl0eSIsICZEaWFtZXRlcklkZW50aXR5X3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJEaWFtZXRlclVSSSIsICZEaWFtZXRlclVSSV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiVGltZSIsICZUaW1lX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJJUEZpbHRlclJ1bGUiLCAmSVBGaWx0ZXJSdWxlX3R5cGUpOworCQkvKiBTZXJ2aWNlLVNlbGVjdGlvbiAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTQ5MywJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJTZXJ2aWNlLVNlbGVjdGlvbiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogTUlQLU1OLUhBLVNQSSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTQ5MSwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJNSVAtTU4tSEEtU1BJIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBNSVAtQ2FyZW9mLUFkZHJlc3MgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk0ODcsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiTUlQLUNhcmVvZi1BZGRyZXNzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBBZGRyZXNzX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBNSVAtQXV0aGVudGljYXRvciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTQ4OCwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJNSVAtQXV0aGVudGljYXRvciIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIE1JUC1NQUMtTW9iaWxpdHktRGF0YSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTQ4OSwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJNSVAtTUFDLU1vYmlsaXR5LURhdGEiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBNSVAtVGltZXN0YW1wICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNDkwLAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIk1JUC1UaW1lc3RhbXAiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBNSVA2LUF1dGgtTW9kZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTQ5NCwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJNSVA2LUF1dGgtTW9kZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICJFbnVtZXJhdGVkKE1JUDYtQXV0aC1Nb2RlKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiTU5fSEEiLCB7IC5pMzI9MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiTU5fQUFBIiwgeyAuaTMyPTIgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIE1JUC1NTi1IQS1NU0EgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk0OTIsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiTUlQLU1OLUhBLU1TQSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKworCQorICAgfQorCisgICAvKiBDb21tYW5kcyBzZWN0aW9uICovCisgICB7CisKKyAgIH0KKworICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGljdF9yZmM1Nzc4X2F2cHNfbG9hZF9ydWxlcyhjaGFyICogY29uZmZpbGUpCit7CisgICAvKiBHcm91cGVkIEFWUCBzZWN0aW9uICovCisgICB7CisJICAvKiBNSVAtTU4tSEEtTVNBICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk1JUC1NTi1IQS1NU0EifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiTUlQLVNlc3Npb24tS2V5In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk1JUC1NU0EtTGlmZXRpbWUifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiTUlQLU1OLUhBLVNQSSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJNSVAtQWxnb3JpdGhtLVR5cGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiTUlQLVJlcGxheS1Nb2RlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCisgICB9CQorCisgICAvKiBDb21tYW5kcyBzZWN0aW9uICovCisgICB7CisKKyAgIH0KKworICAgTE9HX0QoICJFeHRlbnNpb24gJ0RpY3Rpb25hcnkgZGVmaW5pdGlvbnMgZm9yIHJmYzU3NzhfYXZwcyAoTm9uZSknIGluaXRpYWxpemVkIik7CisgICByZXR1cm4gMDsKK30KKworaW50IGRpY3RfZW50cnkoY2hhciAqIGNvbmZmaWxlKQoreworCWRpY3RfcmZjNTc3OF9hdnBzX2xvYWRfZGVmcyhjb25mZmlsZSk7CisJcmV0dXJuIGRpY3RfcmZjNTc3OF9hdnBzX2xvYWRfcnVsZXMoY29uZmZpbGUpOworfQorCitjb25zdCBjaGFyKiBkaWN0X3JmYzU3NzhfYXZwc19wcm90b192ZXIoY2hhciAqIGNvbmZmaWxlKSB7CisJcmV0dXJuIHJmYzU3NzhfYXZwc19wcm90b192ZXI7Cit9CisKK2NvbnN0IGRvdWJsZSBkaWN0X3JmYzU3NzhfYXZwc19nZW5fdHMoY2hhciAqIGNvbmZmaWxlKSB7CisJcmV0dXJuIHJmYzU3NzhfYXZwc19nZW5fZGF0ZTsKK30KKworRVhURU5TSU9OX0VOVFJZMigiZGljdF9yZmM1Nzc4X2F2cHMiLCBkaWN0X3JmYzU3NzhfYXZwc19sb2FkX2RlZnMsIGRpY3RfcmZjNTc3OF9hdnBzX2xvYWRfcnVsZXMsICJkaWN0X3JmYzcxNTVfYXZwcyIsICJkaWN0X3JmYzU0NDdfYXZwcyIsICJkaWN0X3JmYzU3NzdfYXZwcyIsICJkaWN0X3JmYzQwMDRfYXZwcyIpOworCisKKwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X3JmYzU3NzhfYXZwcy9yZmM1Nzc4X2F2cHMuZGlkIGIvZXh0ZW5zaW9ucy9kaWN0X3JmYzU3NzhfYXZwcy9yZmM1Nzc4X2F2cHMuZGlkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkYjQyNmEKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfcmZjNTc3OF9hdnBzL3JmYzU3NzhfYXZwcy5kaWQKQEAgLTAsMCArMSw1IEBACitkaWN0X3JmYzcxNTVfYXZwcworZGljdF9yZmM1Nzc3X2F2cHMKK2RpY3RfcmZjNTQ0N19hdnBzCitkaWN0X3JmYzQwMDRfYXZwcworZGljdF9yZmM1Nzc4X2F2cHMKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF9yZmM2NzM0X2F2cHMvQ01ha2VMaXN0cy50eHQgYi9leHRlbnNpb25zL2RpY3RfcmZjNjczNF9hdnBzL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MWQ2ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfcmZjNjczNF9hdnBzL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTYgQEAKKyMgVGhlIGRpY3RfcmZjNjczNF9hdnBzIGV4dGVuc2lvbgorUFJPSkVDVCgiZGljdF9yZmM2NzM0X2F2cHMgbGlicmFyeSBnZW5lcmF0ZWQgYnkgRmRHZW4gIiBDKQorCisjIENvbXBpbGUgYXMgYSBtb2R1bGUKK0ZEX0FERF9FWFRFTlNJT04oZGljdF9yZmM2NzM0X2F2cHMgZGljdF9yZmM2NzM0X2F2cHMuYykKKworCisjIyMjCisjIyBJTlNUQUxMIHNlY3Rpb24gIyMKKworSU5TVEFMTChUQVJHRVRTIGRpY3RfcmZjNjczNF9hdnBzCisJTElCUkFSWSBERVNUSU5BVElPTiAke0lOU1RBTExfRVhURU5TSU9OU19TVUZGSVh9CitDT01QT05FTlQgZnJlZURpYW1ldGVyLWRpY3Rpb25hcnktUkZDNjczNF9BVlBTKQorCisKKwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X3JmYzY3MzRfYXZwcy9kaWN0X3JmYzY3MzRfYXZwcy5jIGIvZXh0ZW5zaW9ucy9kaWN0X3JmYzY3MzRfYXZwcy9kaWN0X3JmYzY3MzRfYXZwcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3OGRjZDcKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfcmZjNjczNF9hdnBzL2RpY3RfcmZjNjczNF9hdnBzLmMKQEAgLTAsMCArMSwyNjQgQEAKKy8qCisqIENvcHlyaWdodCAoYykgMjAxNyBTcHJpbnQKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLyoqKioqKioqKioqKioqKioKKyBHZW5lcmF0ZWQgQnk6IGZkdG9vbCBlbmhhbmNlbWVudHMgdG8gZGlhZnV6emVyCisgTGljZW5zZTogc2FtZSBhcyBmcmVlRGlhbWV0ZXIKKyoqKioqKioqKioqKioqKiovCisKKworLyogCisgKiBEaWN0aW9uYXJ5IGRlZmluaXRpb25zIG9mIG9iamVjdHMgc3BlY2lmaWVkIGluIHJmYzY3MzRfYXZwcy4KKyAqLworI2luY2x1ZGUgPGZyZWVEaWFtZXRlci9leHRlbnNpb24uaD4KKworI2RlZmluZSBQUk9UT19WRVIgInVuc3BlY2lmaWVkIgorI2RlZmluZSBHRU5fREFURSAgMTUwNjY5NzE0My42MgorCitjb25zdCBjaGFyICpyZmM2NzM0X2F2cHNfcHJvdG9fdmVyID0gUFJPVE9fVkVSOworY29uc3QgZG91YmxlIHJmYzY3MzRfYXZwc19nZW5fZGF0ZSA9IEdFTl9EQVRFOworCisvKiBUaGUgY29udGVudCBvZiB0aGlzIGZpbGUgZm9sbG93cyB0aGUgc2FtZSBzdHJ1Y3R1cmUgYXMgZGljdF9iYXNlX3Byb3RvLmMgKi8KKworI2RlZmluZSBDSEVDS19kaWN0X25ldyggX3R5cGUsIF9kYXRhLCBfcGFyZW50LCBfcmVmICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBfcmV0ID0gZmRfZGljdF9uZXcoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgKF90eXBlKSwgKF9kYXRhKSwgKF9wYXJlbnQpLCAoX3JlZikgKTsgXAorICAgIGlmICggX3JldCAhPSAwICYmIF9yZXQgIT0gRUVYSVNUICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHJldHVybiBfcmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIENIRUNLX2RpY3Rfc2VhcmNoKCBfdHlwZSwgX2NyaXRlcmlhLCBfd2hhdCwgX3Jlc3VsdCApCQlcCisgICAgQ0hFQ0tfRkNUKCAgZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgKF90eXBlKSwgKF9jcml0ZXJpYSksIChfd2hhdCksIChfcmVzdWx0KSwgRU5PRU5UKSApOworCitzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiB7CisgICAgc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWU7CisgICAgZW51bSBydWxlX3Bvc2l0aW9uCXBvc2l0aW9uOworICAgIGludCAJCQltaW47CisgICAgaW50CQkJbWF4OworfTsKKworI2RlZmluZSBSVUxFX09SREVSKCBfcG9zaXRpb24gKSAoKCgoX3Bvc2l0aW9uKSA9PSBSVUxFX0ZJWEVEX0hFQUQpIHx8ICgoX3Bvc2l0aW9uKSA9PSBSVUxFX0ZJWEVEX1RBSUwpKSA/IDEgOiAwICkKKworLyogQXR0ZW50aW9uISBUaGlzIHZlcnNpb24gb2YgdGhlIG1hY3JvIHVzZXMgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgaW4gY29udHJhc3QgdG8gbW9zdCBvdGhlciBjb3BpZXMhICovCisjZGVmaW5lIFBBUlNFX2xvY19ydWxlcyggX3J1bGVhcnJheSwgX3BhcmVudCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IF9fYXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKF9fYXI9MDsgX19hciA8IHNpemVvZihfcnVsZWFycmF5KSAvIHNpemVvZigoX3J1bGVhcnJheSlbMF0pOyBfX2FyKyspIHsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgc3RydWN0IGRpY3RfcnVsZV9kYXRhIF9fZGF0YSA9IHsgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5wb3NpdGlvbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ubWluLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5tYXh9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIF9fZGF0YS5ydWxlX29yZGVyID0gUlVMRV9PUkRFUihfX2RhdGEucnVsZV9wb3NpdGlvbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgQ0hFQ0tfRkNUKCAgZmRfZGljdF9zZWFyY2goICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgRElDVF9BVlAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICYoX3J1bGVhcnJheSlbX19hcl0uYXZwX3ZlbmRvcl9wbHVzX25hbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgJl9fZGF0YS5ydWxlX2F2cCwgMCApICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYgKCAhX19kYXRhLnJ1bGVfYXZwICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFX0RFQlVHKElORk8sICJBVlAgTm90IGZvdW5kOiAnJXMnIiwgKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLmF2cF9uYW1lKTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVOT0VOVDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBfcmV0ID0gZmRfZGljdF9uZXcoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9SVUxFLCAmKF9fZGF0YSksIChfcGFyZW50KSwgTlVMTCApOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBfcmV0ICE9IDAgJiYgX3JldCAhPSBFRVhJU1QgKSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfREVCVUcoSU5GTywgIkVycm9yIG9uIHJ1bGUgd2l0aCBBVlAgJyVzJyIsICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0uYXZwX3ZlbmRvcl9wbHVzX25hbWUuYXZwX25hbWUpOyAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFSU5WQUw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBDSEVDS192ZW5kb3JfbmV3KCBfZGF0YSApIHsgXAorICAgICAgICBzdHJ1Y3QgZGljdF9vYmplY3QgKiB2ZW5kb3JfZm91bmQ7IFwKKyAgICAgICAgaWYgKGZkX2RpY3Rfc2VhcmNoKGZkX2dfY29uZmlnLT5jbmZfZGljdCxESUNUX1ZFTkRPUixWRU5ET1JfQllfSUQsJl9kYXRhLnZlbmRvcl9pZCwmdmVuZG9yX2ZvdW5kLEVOT0VOVCkgPT0gRU5PRU5UKSB7IFwKKyAgICAgICAgICAgICAgICBDSEVDS19GQ1QoZmRfZGljdF9uZXcoZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1ZFTkRPUiwgJl9kYXRhLCBOVUxMLCBOVUxMKSk7IFwKKyAgICAgICAgfSBcCit9CisKKyNkZWZpbmUgZW51bXZhbF9kZWZfdTMyKCBfdmFsXywgX3N0cl8gKQkJXAorICAgIHsgX3N0cl8sIAkJeyAudTMyID0gX3ZhbF8gfX0KKworI2RlZmluZSBlbnVtdmFsX2RlZl9vcyggX2xlbl8sIF92YWxfLCBfc3RyXyApCQkJCVwKKyAgICB7IF9zdHJfLCAJCXsgLm9zID0geyAuZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopX3ZhbF8sIC5sZW4gPSBfbGVuXyB9fX0KKworCitzdGF0aWMgaW50IGRpY3RfcmZjNjczNF9hdnBzX2xvYWRfZGVmcyhjaGFyICogY29uZmZpbGUpCit7CisgICBUUkFDRV9FTlRSWSgiJXAiLCBjb25mZmlsZSk7CisKKyAgIC8qIEFWUCBzZWN0aW9uICovCisgICB7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIEFkZHJlc3NfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogVVRGOFN0cmluZ190eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBEaWFtZXRlcklkZW50aXR5X3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIERpYW1ldGVyVVJJX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIFRpbWVfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogSVBGaWx0ZXJSdWxlX3R5cGU7CisKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiQWRkcmVzcyIsICZBZGRyZXNzX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJVVEY4U3RyaW5nIiwgJlVURjhTdHJpbmdfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkRpYW1ldGVySWRlbnRpdHkiLCAmRGlhbWV0ZXJJZGVudGl0eV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiRGlhbWV0ZXJVUkkiLCAmRGlhbWV0ZXJVUklfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIlRpbWUiLCAmVGltZV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiSVBGaWx0ZXJSdWxlIiwgJklQRmlsdGVyUnVsZV90eXBlKTsKKwkJLyogS2V5LVR5cGUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk1ODIsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiS2V5LVR5cGUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiRW51bWVyYXRlZChLZXktVHlwZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIkRTUksiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiclJLIiwgeyAuaTMyPTEgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMyA9IHsgInJNU0siLCB7IC5pMzI9MiB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBLZXlpbmctTWF0ZXJpYWwgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk1ODMsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiS2V5aW5nLU1hdGVyaWFsIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogS2V5LUxpZmV0aW1lICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNTg0LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIktleS1MaWZldGltZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogS2V5LVNQSSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTU4NSwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJLZXktU1BJIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBLZXktTmFtZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTU4NiwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJLZXktTmFtZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIEtleSAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTU4MSwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJLZXkiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisKKwkKKyAgIH0KKworICAgLyogQ29tbWFuZHMgc2VjdGlvbiAqLworICAgeworCisgICB9CisKKyAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRpY3RfcmZjNjczNF9hdnBzX2xvYWRfcnVsZXMoY2hhciAqIGNvbmZmaWxlKQoreworICAgLyogR3JvdXBlZCBBVlAgc2VjdGlvbiAqLworICAgeworCSAgLyogS2V5ICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIktleSJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJLZXktVHlwZSJ9LCBSVUxFX0ZJWEVEX0hFQUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIktleWluZy1NYXRlcmlhbCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJLZXktTGlmZXRpbWUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiS2V5LU5hbWUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiS2V5LVNQSSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKworICAgfQkKKworICAgLyogQ29tbWFuZHMgc2VjdGlvbiAqLworICAgeworCisgICB9CisKKyAgIExPR19EKCAiRXh0ZW5zaW9uICdEaWN0aW9uYXJ5IGRlZmluaXRpb25zIGZvciByZmM2NzM0X2F2cHMgKE5vbmUpJyBpbml0aWFsaXplZCIpOworICAgcmV0dXJuIDA7Cit9CisKK2ludCBkaWN0X2VudHJ5KGNoYXIgKiBjb25mZmlsZSkKK3sKKwlkaWN0X3JmYzY3MzRfYXZwc19sb2FkX2RlZnMoY29uZmZpbGUpOworCXJldHVybiBkaWN0X3JmYzY3MzRfYXZwc19sb2FkX3J1bGVzKGNvbmZmaWxlKTsKK30KKworY29uc3QgY2hhciogZGljdF9yZmM2NzM0X2F2cHNfcHJvdG9fdmVyKGNoYXIgKiBjb25mZmlsZSkgeworCXJldHVybiByZmM2NzM0X2F2cHNfcHJvdG9fdmVyOworfQorCitjb25zdCBkb3VibGUgZGljdF9yZmM2NzM0X2F2cHNfZ2VuX3RzKGNoYXIgKiBjb25mZmlsZSkgeworCXJldHVybiByZmM2NzM0X2F2cHNfZ2VuX2RhdGU7Cit9CisKK0VYVEVOU0lPTl9FTlRSWTIoImRpY3RfcmZjNjczNF9hdnBzIiwgZGljdF9yZmM2NzM0X2F2cHNfbG9hZF9kZWZzLCBkaWN0X3JmYzY3MzRfYXZwc19sb2FkX3J1bGVzKTsKKworCisKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF9yZmM2NzM0X2F2cHMvcmZjNjczNF9hdnBzLmRpZCBiL2V4dGVuc2lvbnMvZGljdF9yZmM2NzM0X2F2cHMvcmZjNjczNF9hdnBzLmRpZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmJmYjUyCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kaWN0X3JmYzY3MzRfYXZwcy9yZmM2NzM0X2F2cHMuZGlkCkBAIC0wLDAgKzEgQEAKK2RpY3RfcmZjNjczNF9hdnBzCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfcmZjNjk0Ml9hdnBzL0NNYWtlTGlzdHMudHh0IGIvZXh0ZW5zaW9ucy9kaWN0X3JmYzY5NDJfYXZwcy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmI5ZTVmCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kaWN0X3JmYzY5NDJfYXZwcy9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDE2IEBACisjIFRoZSBkaWN0X3JmYzY5NDJfYXZwcyBleHRlbnNpb24KK1BST0pFQ1QoImRpY3RfcmZjNjk0Ml9hdnBzIGxpYnJhcnkgZ2VuZXJhdGVkIGJ5IEZkR2VuICIgQykKKworIyBDb21waWxlIGFzIGEgbW9kdWxlCitGRF9BRERfRVhURU5TSU9OKGRpY3RfcmZjNjk0Ml9hdnBzIGRpY3RfcmZjNjk0Ml9hdnBzLmMpCisKKworIyMjIworIyMgSU5TVEFMTCBzZWN0aW9uICMjCisKK0lOU1RBTEwoVEFSR0VUUyBkaWN0X3JmYzY5NDJfYXZwcworCUxJQlJBUlkgREVTVElOQVRJT04gJHtJTlNUQUxMX0VYVEVOU0lPTlNfU1VGRklYfQorQ09NUE9ORU5UIGZyZWVEaWFtZXRlci1kaWN0aW9uYXJ5LVJGQzY5NDJfQVZQUykKKworCisKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF9yZmM2OTQyX2F2cHMvZGljdF9yZmM2OTQyX2F2cHMuYyBiL2V4dGVuc2lvbnMvZGljdF9yZmM2OTQyX2F2cHMvZGljdF9yZmM2OTQyX2F2cHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTQ1ZTllCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kaWN0X3JmYzY5NDJfYXZwcy9kaWN0X3JmYzY5NDJfYXZwcy5jCkBAIC0wLDAgKzEsMjAyIEBACisvKgorKiBDb3B5cmlnaHQgKGMpIDIwMTcgU3ByaW50CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKy8qKioqKioqKioqKioqKioqCisgR2VuZXJhdGVkIEJ5OiBmZHRvb2wgZW5oYW5jZW1lbnRzIHRvIGRpYWZ1enplcgorIExpY2Vuc2U6IHNhbWUgYXMgZnJlZURpYW1ldGVyCisqKioqKioqKioqKioqKioqLworCisKKy8qIAorICogRGljdGlvbmFyeSBkZWZpbml0aW9ucyBvZiBvYmplY3RzIHNwZWNpZmllZCBpbiByZmM2OTQyX2F2cHMuCisgKi8KKyNpbmNsdWRlIDxmcmVlRGlhbWV0ZXIvZXh0ZW5zaW9uLmg+CisKKyNkZWZpbmUgUFJPVE9fVkVSICJ1bnNwZWNpZmllZCIKKyNkZWZpbmUgR0VOX0RBVEUgIDE1MDY2OTcxOTEuMzIKKworY29uc3QgY2hhciAqcmZjNjk0Ml9hdnBzX3Byb3RvX3ZlciA9IFBST1RPX1ZFUjsKK2NvbnN0IGRvdWJsZSByZmM2OTQyX2F2cHNfZ2VuX2RhdGUgPSBHRU5fREFURTsKKworLyogVGhlIGNvbnRlbnQgb2YgdGhpcyBmaWxlIGZvbGxvd3MgdGhlIHNhbWUgc3RydWN0dXJlIGFzIGRpY3RfYmFzZV9wcm90by5jICovCisKKyNkZWZpbmUgQ0hFQ0tfZGljdF9uZXcoIF90eXBlLCBfZGF0YSwgX3BhcmVudCwgX3JlZiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgX3JldCA9IGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIChfdHlwZSksIChfZGF0YSksIChfcGFyZW50KSwgKF9yZWYpICk7IFwKKyAgICBpZiAoIF9yZXQgIT0gMCAmJiBfcmV0ICE9IEVFWElTVCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICByZXR1cm4gX3JldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBDSEVDS19kaWN0X3NlYXJjaCggX3R5cGUsIF9jcml0ZXJpYSwgX3doYXQsIF9yZXN1bHQgKQkJXAorICAgIENIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIChfdHlwZSksIChfY3JpdGVyaWEpLCAoX3doYXQpLCAoX3Jlc3VsdCksIEVOT0VOVCkgKTsKKworc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24geworICAgIHN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lOworICAgIGVudW0gcnVsZV9wb3NpdGlvbglwb3NpdGlvbjsKKyAgICBpbnQgCQkJbWluOworICAgIGludAkJCW1heDsKK307CisKKyNkZWZpbmUgUlVMRV9PUkRFUiggX3Bvc2l0aW9uICkgKCgoKF9wb3NpdGlvbikgPT0gUlVMRV9GSVhFRF9IRUFEKSB8fCAoKF9wb3NpdGlvbikgPT0gUlVMRV9GSVhFRF9UQUlMKSkgPyAxIDogMCApCisKKy8qIEF0dGVudGlvbiEgVGhpcyB2ZXJzaW9uIG9mIHRoZSBtYWNybyB1c2VzIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsIGluIGNvbnRyYXN0IHRvIG1vc3Qgb3RoZXIgY29waWVzISAqLworI2RlZmluZSBQQVJTRV9sb2NfcnVsZXMoIF9ydWxlYXJyYXksIF9wYXJlbnQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBfX2FyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yIChfX2FyPTA7IF9fYXIgPCBzaXplb2YoX3J1bGVhcnJheSkgLyBzaXplb2YoKF9ydWxlYXJyYXkpWzBdKTsgX19hcisrKSB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHN0cnVjdCBkaWN0X3J1bGVfZGF0YSBfX2RhdGEgPSB7IE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ucG9zaXRpb24sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLm1pbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ubWF4fTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfX2RhdGEucnVsZV9vcmRlciA9IFJVTEVfT1JERVIoX19kYXRhLnJ1bGVfcG9zaXRpb24pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIENIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIERJQ1RfQVZQLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAmKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICZfX2RhdGEucnVsZV9hdnAsIDAgKSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmICggIV9fZGF0YS5ydWxlX2F2cCApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9ERUJVRyhJTkZPLCAiQVZQIE5vdCBmb3VuZDogJyVzJyIsIChfcnVsZWFycmF5KVtfX2FyXS5hdnBfdmVuZG9yX3BsdXNfbmFtZS5hdnBfbmFtZSk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFTk9FTlQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgX3JldCA9IGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfUlVMRSwgJihfX2RhdGEpLCAoX3BhcmVudCksIE5VTEwgKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggX3JldCAhPSAwICYmIF9yZXQgIT0gRUVYSVNUICkgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFX0RFQlVHKElORk8sICJFcnJvciBvbiBydWxlIHdpdGggQVZQICclcyciLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLmF2cF9uYW1lKTsgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRUlOVkFMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgQ0hFQ0tfdmVuZG9yX25ldyggX2RhdGEgKSB7IFwKKyAgICAgICAgc3RydWN0IGRpY3Rfb2JqZWN0ICogdmVuZG9yX2ZvdW5kOyBcCisgICAgICAgIGlmIChmZF9kaWN0X3NlYXJjaChmZF9nX2NvbmZpZy0+Y25mX2RpY3QsRElDVF9WRU5ET1IsVkVORE9SX0JZX0lELCZfZGF0YS52ZW5kb3JfaWQsJnZlbmRvcl9mb3VuZCxFTk9FTlQpID09IEVOT0VOVCkgeyBcCisgICAgICAgICAgICAgICAgQ0hFQ0tfRkNUKGZkX2RpY3RfbmV3KGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9WRU5ET1IsICZfZGF0YSwgTlVMTCwgTlVMTCkpOyBcCisgICAgICAgIH0gXAorfQorCisjZGVmaW5lIGVudW12YWxfZGVmX3UzMiggX3ZhbF8sIF9zdHJfICkJCVwKKyAgICB7IF9zdHJfLCAJCXsgLnUzMiA9IF92YWxfIH19CisKKyNkZWZpbmUgZW51bXZhbF9kZWZfb3MoIF9sZW5fLCBfdmFsXywgX3N0cl8gKQkJCQlcCisgICAgeyBfc3RyXywgCQl7IC5vcyA9IHsgLmRhdGEgPSAodW5zaWduZWQgY2hhciAqKV92YWxfLCAubGVuID0gX2xlbl8gfX19CisKKworc3RhdGljIGludCBkaWN0X3JmYzY5NDJfYXZwc19sb2FkX2RlZnMoY2hhciAqIGNvbmZmaWxlKQoreworICAgVFJBQ0VfRU5UUlkoIiVwIiwgY29uZmZpbGUpOworCisgICAvKiBBVlAgc2VjdGlvbiAqLworICAgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBBZGRyZXNzX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIFVURjhTdHJpbmdfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogRGlhbWV0ZXJJZGVudGl0eV90eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBEaWFtZXRlclVSSV90eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBUaW1lX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIElQRmlsdGVyUnVsZV90eXBlOworCisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkFkZHJlc3MiLCAmQWRkcmVzc190eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiVVRGOFN0cmluZyIsICZVVEY4U3RyaW5nX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJEaWFtZXRlcklkZW50aXR5IiwgJkRpYW1ldGVySWRlbnRpdHlfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkRpYW1ldGVyVVJJIiwgJkRpYW1ldGVyVVJJX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJUaW1lIiwgJlRpbWVfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIklQRmlsdGVyUnVsZSIsICZJUEZpbHRlclJ1bGVfdHlwZSk7CisJCS8qIEVSUC1SZWFsbSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTYxOSwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJFUlAtUmVhbG0iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIERpYW1ldGVySWRlbnRpdHlfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIEVSUC1SSy1SZXF1ZXN0ICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNjE4LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIkVSUC1SSy1SZXF1ZXN0IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCisJCisgICB9CisKKyAgIC8qIENvbW1hbmRzIHNlY3Rpb24gKi8KKyAgIHsKKworICAgfQorCisgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkaWN0X3JmYzY5NDJfYXZwc19sb2FkX3J1bGVzKGNoYXIgKiBjb25mZmlsZSkKK3sKKyAgIC8qIEdyb3VwZWQgQVZQIHNlY3Rpb24gKi8KKyAgIHsKKwkgIC8qIEVSUC1SSy1SZXF1ZXN0ICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkVSUC1SSy1SZXF1ZXN0In07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkVSUC1SZWFsbSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKworICAgfQkKKworICAgLyogQ29tbWFuZHMgc2VjdGlvbiAqLworICAgeworCisgICB9CisKKyAgIExPR19EKCAiRXh0ZW5zaW9uICdEaWN0aW9uYXJ5IGRlZmluaXRpb25zIGZvciByZmM2OTQyX2F2cHMgKE5vbmUpJyBpbml0aWFsaXplZCIpOworICAgcmV0dXJuIDA7Cit9CisKK2ludCBkaWN0X2VudHJ5KGNoYXIgKiBjb25mZmlsZSkKK3sKKwlkaWN0X3JmYzY5NDJfYXZwc19sb2FkX2RlZnMoY29uZmZpbGUpOworCXJldHVybiBkaWN0X3JmYzY5NDJfYXZwc19sb2FkX3J1bGVzKGNvbmZmaWxlKTsKK30KKworY29uc3QgY2hhciogZGljdF9yZmM2OTQyX2F2cHNfcHJvdG9fdmVyKGNoYXIgKiBjb25mZmlsZSkgeworCXJldHVybiByZmM2OTQyX2F2cHNfcHJvdG9fdmVyOworfQorCitjb25zdCBkb3VibGUgZGljdF9yZmM2OTQyX2F2cHNfZ2VuX3RzKGNoYXIgKiBjb25mZmlsZSkgeworCXJldHVybiByZmM2OTQyX2F2cHNfZ2VuX2RhdGU7Cit9CisKK0VYVEVOU0lPTl9FTlRSWTIoImRpY3RfcmZjNjk0Ml9hdnBzIiwgZGljdF9yZmM2OTQyX2F2cHNfbG9hZF9kZWZzLCBkaWN0X3JmYzY5NDJfYXZwc19sb2FkX3J1bGVzLCAiZGljdF9yZmM2NzM0X2F2cHMiKTsKKworCisKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF9yZmM2OTQyX2F2cHMvcmZjNjk0Ml9hdnBzLmRpZCBiL2V4dGVuc2lvbnMvZGljdF9yZmM2OTQyX2F2cHMvcmZjNjk0Ml9hdnBzLmRpZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzI0YzdiCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kaWN0X3JmYzY5NDJfYXZwcy9yZmM2OTQyX2F2cHMuZGlkCkBAIC0wLDAgKzEsMiBAQAorZGljdF9yZmM2NzM0X2F2cHMKK2RpY3RfcmZjNjk0Ml9hdnBzCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfcmZjNzE1NV9hdnBzL0NNYWtlTGlzdHMudHh0IGIvZXh0ZW5zaW9ucy9kaWN0X3JmYzcxNTVfYXZwcy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDE0ZTAxCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kaWN0X3JmYzcxNTVfYXZwcy9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDE2IEBACisjIFRoZSBkaWN0X3JmYzcxNTVfYXZwcyBleHRlbnNpb24KK1BST0pFQ1QoImRpY3RfcmZjNzE1NV9hdnBzIGxpYnJhcnkgZ2VuZXJhdGVkIGJ5IEZkR2VuICIgQykKKworIyBDb21waWxlIGFzIGEgbW9kdWxlCitGRF9BRERfRVhURU5TSU9OKGRpY3RfcmZjNzE1NV9hdnBzIGRpY3RfcmZjNzE1NV9hdnBzLmMpCisKKworIyMjIworIyMgSU5TVEFMTCBzZWN0aW9uICMjCisKK0lOU1RBTEwoVEFSR0VUUyBkaWN0X3JmYzcxNTVfYXZwcworCUxJQlJBUlkgREVTVElOQVRJT04gJHtJTlNUQUxMX0VYVEVOU0lPTlNfU1VGRklYfQorQ09NUE9ORU5UIGZyZWVEaWFtZXRlci1kaWN0aW9uYXJ5LVJGQzcxNTVfQVZQUykKKworCisKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF9yZmM3MTU1X2F2cHMvZGljdF9yZmM3MTU1X2F2cHMuYyBiL2V4dGVuc2lvbnMvZGljdF9yZmM3MTU1X2F2cHMvZGljdF9yZmM3MTU1X2F2cHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGYzZjE3Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kaWN0X3JmYzcxNTVfYXZwcy9kaWN0X3JmYzcxNTVfYXZwcy5jCkBAIC0wLDAgKzEsMTYzNCBAQAorLyoKKyogQ29weXJpZ2h0IChjKSAyMDE3IFNwcmludAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvKioqKioqKioqKioqKioqKgorIEdlbmVyYXRlZCBCeTogZmR0b29sIGVuaGFuY2VtZW50cyB0byBkaWFmdXp6ZXIKKyBMaWNlbnNlOiBzYW1lIGFzIGZyZWVEaWFtZXRlcgorKioqKioqKioqKioqKioqKi8KKworCisvKiAKKyAqIERpY3Rpb25hcnkgZGVmaW5pdGlvbnMgb2Ygb2JqZWN0cyBzcGVjaWZpZWQgaW4gcmZjNzE1NV9hdnBzLgorICovCisjaW5jbHVkZSA8ZnJlZURpYW1ldGVyL2V4dGVuc2lvbi5oPgorCisjZGVmaW5lIFBST1RPX1ZFUiAidW5zcGVjaWZpZWQiCisjZGVmaW5lIEdFTl9EQVRFICAxNTA2Njk3MTQzLjY3CisKK2NvbnN0IGNoYXIgKnJmYzcxNTVfYXZwc19wcm90b192ZXIgPSBQUk9UT19WRVI7Citjb25zdCBkb3VibGUgcmZjNzE1NV9hdnBzX2dlbl9kYXRlID0gR0VOX0RBVEU7CisKKy8qIFRoZSBjb250ZW50IG9mIHRoaXMgZmlsZSBmb2xsb3dzIHRoZSBzYW1lIHN0cnVjdHVyZSBhcyBkaWN0X2Jhc2VfcHJvdG8uYyAqLworCisjZGVmaW5lIENIRUNLX2RpY3RfbmV3KCBfdHlwZSwgX2RhdGEsIF9wYXJlbnQsIF9yZWYgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IF9yZXQgPSBmZF9kaWN0X25ldyggZmRfZ19jb25maWctPmNuZl9kaWN0LCAoX3R5cGUpLCAoX2RhdGEpLCAoX3BhcmVudCksIChfcmVmKSApOyBcCisgICAgaWYgKCBfcmV0ICE9IDAgJiYgX3JldCAhPSBFRVhJU1QgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgcmV0dXJuIF9yZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgQ0hFQ0tfZGljdF9zZWFyY2goIF90eXBlLCBfY3JpdGVyaWEsIF93aGF0LCBfcmVzdWx0ICkJCVwKKyAgICBDSEVDS19GQ1QoICBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCAoX3R5cGUpLCAoX2NyaXRlcmlhKSwgKF93aGF0KSwgKF9yZXN1bHQpLCBFTk9FTlQpICk7CisKK3N0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHsKKyAgICBzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZTsKKyAgICBlbnVtIHJ1bGVfcG9zaXRpb24JcG9zaXRpb247CisgICAgaW50IAkJCW1pbjsKKyAgICBpbnQJCQltYXg7Cit9OworCisjZGVmaW5lIFJVTEVfT1JERVIoIF9wb3NpdGlvbiApICgoKChfcG9zaXRpb24pID09IFJVTEVfRklYRURfSEVBRCkgfHwgKChfcG9zaXRpb24pID09IFJVTEVfRklYRURfVEFJTCkpID8gMSA6IDAgKQorCisvKiBBdHRlbnRpb24hIFRoaXMgdmVyc2lvbiBvZiB0aGUgbWFjcm8gdXNlcyBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCBpbiBjb250cmFzdCB0byBtb3N0IG90aGVyIGNvcGllcyEgKi8KKyNkZWZpbmUgUEFSU0VfbG9jX3J1bGVzKCBfcnVsZWFycmF5LCBfcGFyZW50KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgX19hcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoX19hcj0wOyBfX2FyIDwgc2l6ZW9mKF9ydWxlYXJyYXkpIC8gc2l6ZW9mKChfcnVsZWFycmF5KVswXSk7IF9fYXIrKykgeyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgZGljdF9ydWxlX2RhdGEgX19kYXRhID0geyBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLnBvc2l0aW9uLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5taW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLm1heH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgX19kYXRhLnJ1bGVfb3JkZXIgPSBSVUxFX09SREVSKF9fZGF0YS5ydWxlX3Bvc2l0aW9uKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBDSEVDS19GQ1QoICBmZF9kaWN0X3NlYXJjaCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgZmRfZ19jb25maWctPmNuZl9kaWN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBESUNUX0FWUCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgJihfcnVsZWFycmF5KVtfX2FyXS5hdnBfdmVuZG9yX3BsdXNfbmFtZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAmX19kYXRhLnJ1bGVfYXZwLCAwICkgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpZiAoICFfX2RhdGEucnVsZV9hdnAgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfREVCVUcoSU5GTywgIkFWUCBOb3QgZm91bmQ6ICclcyciLCAoX3J1bGVhcnJheSlbX19hcl0uYXZwX3ZlbmRvcl9wbHVzX25hbWUuYXZwX25hbWUpOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRU5PRU5UOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IF9yZXQgPSBmZF9kaWN0X25ldyggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1JVTEUsICYoX19kYXRhKSwgKF9wYXJlbnQpLCBOVUxMICk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIF9yZXQgIT0gMCAmJiBfcmV0ICE9IEVFWElTVCApICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9ERUJVRyhJTkZPLCAiRXJyb3Igb24gcnVsZSB3aXRoIEFWUCAnJXMnIiwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5hdnBfdmVuZG9yX3BsdXNfbmFtZS5hdnBfbmFtZSk7ICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVJTlZBTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIENIRUNLX3ZlbmRvcl9uZXcoIF9kYXRhICkgeyBcCisgICAgICAgIHN0cnVjdCBkaWN0X29iamVjdCAqIHZlbmRvcl9mb3VuZDsgXAorICAgICAgICBpZiAoZmRfZGljdF9zZWFyY2goZmRfZ19jb25maWctPmNuZl9kaWN0LERJQ1RfVkVORE9SLFZFTkRPUl9CWV9JRCwmX2RhdGEudmVuZG9yX2lkLCZ2ZW5kb3JfZm91bmQsRU5PRU5UKSA9PSBFTk9FTlQpIHsgXAorICAgICAgICAgICAgICAgIENIRUNLX0ZDVChmZF9kaWN0X25ldyhmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfVkVORE9SLCAmX2RhdGEsIE5VTEwsIE5VTEwpKTsgXAorICAgICAgICB9IFwKK30KKworI2RlZmluZSBlbnVtdmFsX2RlZl91MzIoIF92YWxfLCBfc3RyXyApCQlcCisgICAgeyBfc3RyXywgCQl7IC51MzIgPSBfdmFsXyB9fQorCisjZGVmaW5lIGVudW12YWxfZGVmX29zKCBfbGVuXywgX3ZhbF8sIF9zdHJfICkJCQkJXAorICAgIHsgX3N0cl8sIAkJeyAub3MgPSB7IC5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilfdmFsXywgLmxlbiA9IF9sZW5fIH19fQorCisKK3N0YXRpYyBpbnQgZGljdF9yZmM3MTU1X2F2cHNfbG9hZF9kZWZzKGNoYXIgKiBjb25mZmlsZSkKK3sKKyAgIFRSQUNFX0VOVFJZKCIlcCIsIGNvbmZmaWxlKTsKKworCS8qIERlcml2ZWQgQVZQIHR5cGVzIHNlY3Rpb24gKi8KKwl7CisJCS8qIFFvU0ZpbHRlclJ1bGUgKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgUW9zRmlsdGVyUnVsZSBmb3JtYXQgaXMgZGVyaXZlZCBmcm9tIHRoZSBPY3RldFN0cmluZyBBVlAgQmFzZQorCQkJCUZvcm1hdC4gIEl0IHVzZXMgdGhlIEFTQ0lJIGNoYXJzZXQuICBQYWNrZXRzIG1heSBiZSBtYXJrZWQgb3IKKwkJCQltZXRlcmVkIGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb246CisKKwkJCQkgRGlyZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAoaW4gb3Igb3V0KQorCQkJCSBTb3VyY2UgYW5kIGRlc3RpbmF0aW9uIElQIGFkZHJlc3MgIChwb3NzaWJseSBtYXNrZWQpCisJCQkJIFByb3RvY29sCisJCQkJIFNvdXJjZSBhbmQgZGVzdGluYXRpb24gcG9ydCAgICAgICAgKGxpc3RzIG9yIHJhbmdlcykKKwkJCQkgRFNDUCB2YWx1ZXMgICAgICAgICAgICAgICAgICAgICAgICAobm8gbWFzayBvciByYW5nZSkKKworCQkJCVJ1bGVzIGZvciB0aGUgYXBwcm9wcmlhdGUgZGlyZWN0aW9uIGFyZSBldmFsdWF0ZWQgaW4gb3JkZXI7IHRoZQorCQkJCWZpcnN0IG1hdGNoZWQgcnVsZSB0ZXJtaW5hdGVzIHRoZSBldmFsdWF0aW9uLiAgRWFjaCBwYWNrZXQgaXMKKwkJCQlldmFsdWF0ZWQgb25jZS4gIElmIG5vIHJ1bGUgbWF0Y2hlcywgdGhlIHBhY2tldCBpcyB0cmVhdGVkIGFzIGJlc3QKKwkJCQllZmZvcnQuICBBbiBhY2Nlc3MgZGV2aWNlIHVuYWJsZSB0byBpbnRlcnByZXQgb3IgYXBwbHkgYSBRb1MgcnVsZQorCQkJCVNIT1VMRCBOT1QgdGVybWluYXRlIHRoZSBzZXNzaW9uLgorCisJCQkJUW9TRmlsdGVyUnVsZSBmaWx0ZXJzIE1VU1QgZm9sbG93IHRoZSBmb2xsb3dpbmcgZm9ybWF0OgorCisJCQkJYWN0aW9uIGRpciBwcm90byBmcm9tIHNyYyB0byBkc3QgW29wdGlvbnNdCisKKyAgICAgICAgCQkJCXRhZyAgICAtIE1hcmsgcGFja2V0IHdpdGggYSBzcGVjaWZpYyBEU0NQCisgICAgICAgICAgICAgICAgCQkJCSBbRElGRlNFUlZdLiAgVGhlIERTQ1Agb3B0aW9uIE1VU1QgYmUKKyAgICAgICAgICAgICAgICAJCQkJIGluY2x1ZGVkLgorICAgICAgICAJCQkJbWV0ZXIgIC0gTWV0ZXIgdHJhZmZpYy4gIFRoZSBtZXRlcmluZyBvcHRpb25zCisgICAgICAgICAgICAgICAgCQkJCSBNVVNUIGJlIGluY2x1ZGVkLgorCisJCQkJZGlyICAgICAgICAgICBUaGUgZm9ybWF0IGlzIGFzIGRlc2NyaWJlZCB1bmRlciBJUEZpbHRlclJ1bGUuCisKKwkJCQlwcm90byAgICAgICAgIFRoZSBmb3JtYXQgaXMgYXMgZGVzY3JpYmVkIHVuZGVyIElQRmlsdGVyUnVsZS4KKworCQkJCXNyYyBhbmQgZHN0ICAgVGhlIGZvcm1hdCBpcyBhcyBkZXNjcmliZWQgdW5kZXIgSVBGaWx0ZXJSdWxlLgorCisJCQkJIG9wdGlvbnM6CisKKwkJCQkgRFNDUCA8Y29sb3I+CisJCQkJICAgICAgIENvbG9yIHZhbHVlcyBhcyBkZWZpbmVkIGluIFtESUZGU0VSVl0uICBFeGFjdAorCQkJCSAgICAgICBtYXRjaGluZyBvZiBEU0NQIHZhbHVlcyBpcyByZXF1aXJlZCAobm8gbWFza3Mgb3IKKwkJCQkgICAgICAgcmFuZ2VzKS4KKworCQkJCSBtZXRlcmluZyA8cmF0ZT4gPGNvbG9yX3VuZGVyPiA8Y29sb3Jfb3Zlcj4KKwkJCQkgICAgICAgVGhlIG1ldGVyaW5nIG9wdGlvbiBwcm92aWRlcyBBc3N1cmVkIEZvcndhcmRpbmcsCisJCQkJICAgICAgIGFzIGRlZmluZWQgaW4gW0RJRkZTRVJWQUZdLCBhbmQgTVVTVCBiZSBwcmVzZW50CisJCQkJICAgICAgIGlmIHRoZSBhY3Rpb24gaXMgc2V0IHRvIG1ldGVyLiAgVGhlIHJhdGUgb3B0aW9uIGlzCisJCQkJICAgICAgIHRoZSB0aHJvdWdocHV0LCBpbiBiaXRzIHBlciBzZWNvbmQsIHVzZWQKKwkJCQkgICAgICAgYnkgdGhlIGFjY2VzcyBkZXZpY2UgdG8gbWFyayBwYWNrZXRzLiAgVHJhZmZpYworCQkJCSAgICAgICBvdmVyIHRoZSByYXRlIGlzIG1hcmtlZCB3aXRoIHRoZSBjb2xvcl9vdmVyCisJCQkJICAgICAgIGNvZGVwb2ludCwgYW5kIHRyYWZmaWMgdW5kZXIgdGhlIHJhdGUgaXMgbWFya2VkCisJCQkJICAgICAgIHdpdGggdGhlIGNvbG9yX3VuZGVyIGNvZGVwb2ludC4gIFRoZSBjb2xvcl91bmRlcgorCQkJCSAgICAgICBhbmQgY29sb3Jfb3ZlciBvcHRpb25zIGNvbnRhaW4gdGhlIGRyb3AKKwkJCQkgICAgICAgcHJlZmVyZW5jZXMgYW5kIE1VU1QgY29uZm9ybSB0byB0aGUgcmVjb21tZW5kZWQKKwkJCQkgICAgICAgY29kZXBvaW50IGtleXdvcmRzIGRlc2NyaWJlZCBpbiBbRElGRlNFUlZBRl0KKwkJCQkgICAgICAgKGUuZy4sIEFGMTMpLgorCisJCQkJICAgICAgIFRoZSBtZXRlcmluZyBvcHRpb24gYWxzbyBzdXBwb3J0cyB0aGUgc3RyaWN0CisJCQkJICAgICAgIGxpbWl0IG9uIHRyYWZmaWMgcmVxdWlyZWQgYnkgRXhwZWRpdGVkCisJCQkJICAgICAgIEZvcndhcmRpbmcsIGFzIGRlZmluZWQgaW4gW0RJRkZTRVJWRUZdLiAgVGhlCisJCQkJICAgICAgIGNvbG9yX292ZXIgb3B0aW9uIG1heSBjb250YWluIHRoZSBrZXl3b3JkICJkcm9wIgorCQkJCSAgICAgICB0byBwcmV2ZW50IGZvcndhcmRpbmcgb2YgdHJhZmZpYyB0aGF0IGV4Y2VlZHMgdGhlCisJCQkJICAgICAgIHJhdGUgcGFyYW1ldGVyLgorCisJCQkJIFRoZSBydWxlIHN5bnRheCBpcyBhIG1vZGlmaWVkIHN1YnNldCBvZiBpcGZ3KDgpIGZyb20gRnJlZUJTRCwKKwkJCQkgYW5kIHRoZSBpcGZ3LmMgY29kZSBtYXkgcHJvdmlkZSBhIHVzZWZ1bCBiYXNlIGZvcgorCQkJCSBpbXBsZW1lbnRhdGlvbnMuCisJCQkqLworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhIGRhdGEgPSB7IEFWUF9UWVBFX09DVEVUU1RSSU5HLAkiUW9TRmlsdGVyUnVsZSIJCSwgTlVMTAkJCSwgTlVMTAkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmZGF0YSAsIE5VTEwsIE5VTEwpOworCQl9CisJCQorCX0KKwkKKyAgIC8qIEFWUCBzZWN0aW9uICovCisgICB7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIEFkZHJlc3NfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogVVRGOFN0cmluZ190eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBEaWFtZXRlcklkZW50aXR5X3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIERpYW1ldGVyVVJJX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIFRpbWVfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogSVBGaWx0ZXJSdWxlX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIFFvU0ZpbHRlclJ1bGVfdHlwZTsKKworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJBZGRyZXNzIiwgJkFkZHJlc3NfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIlVURjhTdHJpbmciLCAmVVRGOFN0cmluZ190eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiRGlhbWV0ZXJJZGVudGl0eSIsICZEaWFtZXRlcklkZW50aXR5X3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJEaWFtZXRlclVSSSIsICZEaWFtZXRlclVSSV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiVGltZSIsICZUaW1lX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJJUEZpbHRlclJ1bGUiLCAmSVBGaWx0ZXJSdWxlX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJRb1NGaWx0ZXJSdWxlIiwgJlFvU0ZpbHRlclJ1bGVfdHlwZSk7CisJCS8qIE5BUy1Qb3J0ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNSwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJOQVMtUG9ydCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogTkFTLVBvcnQtSWQgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk4NywJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJOQVMtUG9ydC1JZCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogTkFTLVBvcnQtVHlwZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTYxLAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIk5BUy1Qb3J0LVR5cGUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiRW51bWVyYXRlZChOQVMtUG9ydC1UeXBlKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiQVNZTkMiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiU1lOQyIsIHsgLmkzMj0xIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMgPSB7ICJJU0ROX1NZTkMiLCB7IC5pMzI9MiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF80ID0geyAiSVNETl9BU1lOQ19WMTIwIiwgeyAuaTMyPTMgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNSA9IHsgIklTRE5fQVNZTkNfVjExMCIsIHsgLmkzMj00IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzYgPSB7ICJWSVJUVUFMIiwgeyAuaTMyPTUgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNyA9IHsgIlBJQUZTIiwgeyAuaTMyPTYgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfOCA9IHsgIkhETENfQ0xFQVJfQ0hBTk5FTCIsIHsgLmkzMj03IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzkgPSB7ICJYMjUiLCB7IC5pMzI9OCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xMCA9IHsgIlg3NSIsIHsgLmkzMj05IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzExID0geyAiRy4zX0ZBWCIsIHsgLmkzMj0xMCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xMiA9IHsgIlNEU0xfU1lNTUVUUklDX0RTTCIsIHsgLmkzMj0xMSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xMyA9IHsgIklEU0xfSVNETl9ESUdJVEFMX1NVQlNDUklCRVJfTElORSIsIHsgLmkzMj0xNCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xNCA9IHsgIkVUSEVSTkVUIiwgeyAuaTMyPTE1IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzE1ID0geyAiWERTTF9ESUdJVEFMX1NVQlNDUklCRVJfTElORV9PRl9VTktOT1dOX1RZUEUiLCB7IC5pMzI9MTYgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTYgPSB7ICJDQUJMRSIsIHsgLmkzMj0xNyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xNyA9IHsgIldJUkVMRVNTX09USEVSIiwgeyAuaTMyPTE4IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzE4ID0geyAiV0lSRUxFU1NfSUVFRV84MDIuMTEiLCB7IC5pMzI9MTkgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTkgPSB7ICJUT0tFTl9SSU5HIiwgeyAuaTMyPTIwIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIwID0geyAiRkRESSIsIHsgLmkzMj0yMSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yMSA9IHsgIldJUkVMRVNTX0NETUEyMDAwIiwgeyAuaTMyPTIyIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIyID0geyAiV0lSRUxFU1NfVU1UUyIsIHsgLmkzMj0yMyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yMyA9IHsgIldJUkVMRVNTXzFYX0VWIiwgeyAuaTMyPTI0IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzI0ID0geyAiSUFQUCIsIHsgLmkzMj0yNSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yNSA9IHsgIkZUVFBfRklCRVJfVE9fVEhFX1BSRU1JU0VTIiwgeyAuaTMyPTI2IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzI2ID0geyAiV0lSRUxFU1NfSUVFRV84MDIuMTYiLCB7IC5pMzI9MjcgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMjcgPSB7ICJXSVJFTEVTU19JRUVFXzgwMi4yMCIsIHsgLmkzMj0yOCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yOCA9IHsgIldJUkVMRVNTX0lFRUVfODAyLjIyIiwgeyAuaTMyPTI5IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzI5ID0geyAiUFBQT0FfUFBQX09WRVJfQVRNIiwgeyAuaTMyPTMwIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMwID0geyAiUFBQT0VPQV9QUFBfT1ZFUl9FVEhFUk5FVF9PVkVSX0FUTSIsIHsgLmkzMj0zMSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zMSA9IHsgIlBQUE9FT0VfUFBQX09WRVJfRVRIRVJORVRfT1ZFUl9FVEhFUk5FVCIsIHsgLmkzMj0zMiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zMiA9IHsgIlBQUE9FT1ZMQU5fUFBQX09WRVJfRVRIRVJORVRfT1ZFUl9WTEFOIiwgeyAuaTMyPTMzIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMzID0geyAiUFBQT0VPUUlOUV9QUFBfT1ZFUl9FVEhFUk5FVF9PVkVSX0lFRUVfODAyLjFRSU5RIiwgeyAuaTMyPTM0IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzM0ID0geyAiWFBPTl9QQVNTSVZFX09QVElDQUxfTkVUV09SSyIsIHsgLmkzMj0zNSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zNSA9IHsgIldJUkVMRVNTX1hHUCIsIHsgLmkzMj0zNiB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzQsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF82LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzcsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfOCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF85LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEwLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzExLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEyLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEzLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzE0LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzE1LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzE2LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzE3LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzE4LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzE5LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIwLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIxLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIyLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIzLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzI0LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzI1LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzI2LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzI3LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzI4LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzI5LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMwLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMxLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMyLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMzLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzM0LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzM1LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBDYWxsZWQtU3RhdGlvbi1JZCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTMwLAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIkNhbGxlZC1TdGF0aW9uLUlkIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBDYWxsaW5nLVN0YXRpb24tSWQgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzMSwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJDYWxsaW5nLVN0YXRpb24tSWQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIENvbm5lY3QtSW5mbyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTc3LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIkNvbm5lY3QtSW5mbyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogT3JpZ2luYXRpbmctTGluZS1JbmZvICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJOTQsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiT3JpZ2luYXRpbmctTGluZS1JbmZvIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogUmVwbHktTWVzc2FnZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE4LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIlJlcGx5LU1lc3NhZ2UiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFVzZXItUGFzc3dvcmQgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyLAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIlVzZXItUGFzc3dvcmQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBQYXNzd29yZC1SZXRyeSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTc1LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIlBhc3N3b3JkLVJldHJ5IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBQcm9tcHQgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk3NiwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJQcm9tcHQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiRW51bWVyYXRlZChQcm9tcHQpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJOT19FQ0hPIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIkVDSE8iLCB7IC5pMzI9MSB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogQ0hBUC1BbGdvcml0aG0gKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk0MDMsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiQ0hBUC1BbGdvcml0aG0iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiRW51bWVyYXRlZChDSEFQLUFsZ29yaXRobSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIkNIQVBfV0lUSF9NRDUiLCB7IC5pMzI9NSB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIENIQVAtSWRlbnQgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk0MDQsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiQ0hBUC1JZGVudCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIENIQVAtUmVzcG9uc2UgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk0MDUsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiQ0hBUC1SZXNwb25zZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIENIQVAtQ2hhbGxlbmdlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNjAsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiQ0hBUC1DaGFsbGVuZ2UiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBBUkFQLVBhc3N3b3JkICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNzAsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiQVJBUC1QYXNzd29yZCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIEFSQVAtQ2hhbGxlbmdlLVJlc3BvbnNlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJODQsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiQVJBUC1DaGFsbGVuZ2UtUmVzcG9uc2UiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBBUkFQLVNlY3VyaXR5ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNzMsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiQVJBUC1TZWN1cml0eSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogQVJBUC1TZWN1cml0eS1EYXRhICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNzQsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiQVJBUC1TZWN1cml0eS1EYXRhIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogU2VydmljZS1UeXBlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNiwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJTZXJ2aWNlLVR5cGUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiRW51bWVyYXRlZChTZXJ2aWNlLVR5cGUpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJVTktOT1dOIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIkxPR0lOIiwgeyAuaTMyPTEgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMyA9IHsgIkZSQU1FRCIsIHsgLmkzMj0yIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzQgPSB7ICJDQUxMQkFDS19MT0dJTiIsIHsgLmkzMj0zIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzUgPSB7ICJDQUxMQkFDS19GUkFNRUQiLCB7IC5pMzI9NCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF82ID0geyAiT1VUQk9VTkQiLCB7IC5pMzI9NSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF83ID0geyAiQURNSU5JU1RSQVRJVkUiLCB7IC5pMzI9NiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF84ID0geyAiTkFTX1BST01QVCIsIHsgLmkzMj03IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzkgPSB7ICJBVVRIRU5USUNBVEVfT05MWSIsIHsgLmkzMj04IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEwID0geyAiQ0FMTEJBQ0tfTkFTX1BST01QVCIsIHsgLmkzMj05IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzExID0geyAiQ0FMTF9DSEVDSyIsIHsgLmkzMj0xMCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xMiA9IHsgIkNBTExCQUNLX0FETUlOSVNUUkFUSVZFIiwgeyAuaTMyPTExIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEzID0geyAiVk9JQ0UiLCB7IC5pMzI9MTIgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTQgPSB7ICJGQVgiLCB7IC5pMzI9MTMgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTUgPSB7ICJNT0RFTV9SRUxBWSIsIHsgLmkzMj0xNCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xNiA9IHsgIklBUFBfUkVHSVNURVIiLCB7IC5pMzI9MTUgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTcgPSB7ICJJQVBQX0FQX0NIRUNLIiwgeyAuaTMyPTE2IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzE4ID0geyAiQVVUSE9SSVpFX09OTFkiLCB7IC5pMzI9MTcgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTkgPSB7ICJGUkFNRURfTUFOQUdFTUVOVCIsIHsgLmkzMj0xOCB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzQsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF82LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzcsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfOCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF85LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEwLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzExLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEyLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEzLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzE0LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzE1LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzE2LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzE3LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzE4LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzE5LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBDYWxsYmFjay1OdW1iZXIgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxOSwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJDYWxsYmFjay1OdW1iZXIiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIENhbGxiYWNrLUlkICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjAsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiQ2FsbGJhY2stSWQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIElkbGUtVGltZW91dCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTI4LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIklkbGUtVGltZW91dCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogUG9ydC1MaW1pdCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTYyLAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIlBvcnQtTGltaXQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIE5BUy1GaWx0ZXItUnVsZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTQwMCwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJOQVMtRmlsdGVyLVJ1bGUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIElQRmlsdGVyUnVsZV90eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogRmlsdGVyLUlkICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTEsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiRmlsdGVyLUlkIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBDb25maWd1cmF0aW9uLVRva2VuICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNzgsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiQ29uZmlndXJhdGlvbi1Ub2tlbiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFFvUy1GaWx0ZXItUnVsZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTQwNywJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJRb1MtRmlsdGVyLVJ1bGUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFFvU0ZpbHRlclJ1bGVfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIEZyYW1lZC1Qcm90b2NvbCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTcsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiRnJhbWVkLVByb3RvY29sIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIkVudW1lcmF0ZWQoRnJhbWVkLVByb3RvY29sKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiUFBQIiwgeyAuaTMyPTEgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIlNMSVAiLCB7IC5pMzI9MiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAiQVJBUCIsIHsgLmkzMj0zIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzQgPSB7ICJHQU5EQUxGIiwgeyAuaTMyPTQgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNSA9IHsgIlhZTE9HSUNTIiwgeyAuaTMyPTUgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNiA9IHsgIlguNzUiLCB7IC5pMzI9NiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF83ID0geyAiR1BSU19QRFBfQ09OVEVYVCIsIHsgLmkzMj03IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzggPSB7ICJBU0NFTkRfQVJBIiwgeyAuaTMyPTI1NSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF85ID0geyAiTVBQIiwgeyAuaTMyPTI1NiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xMCA9IHsgIkVVUkFXIiwgeyAuaTMyPTI1NyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xMSA9IHsgIkVVVUkiLCB7IC5pMzI9MjU4IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEyID0geyAiWDI1IiwgeyAuaTMyPTI1OSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xMyA9IHsgIkNPTUIiLCB7IC5pMzI9MjYwIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzE0ID0geyAiRlIiLCB7IC5pMzI9MjYxIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF81LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzYsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF84LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzksIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTAsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTMsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTQsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIEZyYW1lZC1Sb3V0aW5nICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTAsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiRnJhbWVkLVJvdXRpbmciLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiRW51bWVyYXRlZChGcmFtZWQtUm91dGluZykiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIk5PTkUiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiU0VORF9ST1VUSU5HX1BBQ0tFVFMiLCB7IC5pMzI9MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAiTElTVEVOX0ZPUl9ST1VUSU5HX1BBQ0tFVFMiLCB7IC5pMzI9MiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF80ID0geyAiU0VORF9BTkRfTElTVEVOIiwgeyAuaTMyPTMgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF80LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBGcmFtZWQtTVRVICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTIsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiRnJhbWVkLU1UVSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogRnJhbWVkLUNvbXByZXNzaW9uICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTMsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiRnJhbWVkLUNvbXByZXNzaW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIkVudW1lcmF0ZWQoRnJhbWVkLUNvbXByZXNzaW9uKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiTk9ORSIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJJUFhfSEVBREVSX0NPTVBSRVNTSU9OIiwgeyAuaTMyPTIgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMyA9IHsgIlNUQUNfTFpTX0NPTVBSRVNTSU9OIiwgeyAuaTMyPTMgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogRnJhbWVkLUlQLUFkZHJlc3MgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk4LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIkZyYW1lZC1JUC1BZGRyZXNzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogRnJhbWVkLUlQLU5ldG1hc2sgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk5LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIkZyYW1lZC1JUC1OZXRtYXNrIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogRnJhbWVkLVJvdXRlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjIsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiRnJhbWVkLVJvdXRlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBGcmFtZWQtUG9vbCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTg4LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIkZyYW1lZC1Qb29sIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogRnJhbWVkLUludGVyZmFjZS1JZCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTk2LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIkZyYW1lZC1JbnRlcmZhY2UtSWQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDY0CS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIEZyYW1lZC1JUHY2LVByZWZpeCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTk3LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIkZyYW1lZC1JUHY2LVByZWZpeCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIEZyYW1lZC1JUHY2LVJvdXRlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJOTksCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiRnJhbWVkLUlQdjYtUm91dGUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIEZyYW1lZC1JUHY2LVBvb2wgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMDAsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiRnJhbWVkLUlQdjYtUG9vbCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIEZyYW1lZC1JUFgtTmV0d29yayAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTIzLAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIkZyYW1lZC1JUFgtTmV0d29yayIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogRnJhbWVkLUFwcGxldGFsay1MaW5rICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzcsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiRnJhbWVkLUFwcGxldGFsay1MaW5rIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBGcmFtZWQtQXBwbGV0YWxrLU5ldHdvcmsgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzOCwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJGcmFtZWQtQXBwbGV0YWxrLU5ldHdvcmsiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIEZyYW1lZC1BcHBsZXRhbGstWm9uZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM5LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIkZyYW1lZC1BcHBsZXRhbGstWm9uZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIEFSQVAtRmVhdHVyZXMgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk3MSwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJBUkFQLUZlYXR1cmVzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogQVJBUC1ab25lLUFjY2VzcyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTcyLAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIkFSQVAtWm9uZS1BY2Nlc3MiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiRW51bWVyYXRlZChBUkFQLVpvbmUtQWNjZXNzKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiT05MWV9BTExPV19BQ0NFU1NfVE9fREVGQVVMVF9aT05FIiwgeyAuaTMyPTEgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIlVTRV9aT05FX0ZJTFRFUl9JTkNMVVNJVkVMWSIsIHsgLmkzMj0yIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMgPSB7ICJVU0VfWk9ORV9GSUxURVJfRVhDTFVTSVZFTFkiLCB7IC5pMzI9MyB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBMb2dpbi1JUC1Ib3N0ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTQsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiTG9naW4tSVAtSG9zdCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIExvZ2luLUlQdjYtSG9zdCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTk4LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIkxvZ2luLUlQdjYtSG9zdCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIExvZ2luLVNlcnZpY2UgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNSwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJMb2dpbi1TZXJ2aWNlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIkVudW1lcmF0ZWQoTG9naW4tU2VydmljZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIlRFTE5FVCIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJSTE9HSU4iLCB7IC5pMzI9MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAiVENQX0NMRUFSIiwgeyAuaTMyPTIgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNCA9IHsgIlBPUlRNQVNURVIiLCB7IC5pMzI9MyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF81ID0geyAiTEFUIiwgeyAuaTMyPTQgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNiA9IHsgIlgyNV9QQUQiLCB7IC5pMzI9NSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF83ID0geyAiWDI1X1QzUE9TIiwgeyAuaTMyPTYgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfOCA9IHsgIlVOQVNTSUdORUQiLCB7IC5pMzI9NyB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzQsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF82LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzcsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfOCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogTG9naW4tVENQLVBvcnQgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNiwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJMb2dpbi1UQ1AtUG9ydCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogTG9naW4tTEFULVNlcnZpY2UgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzNCwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJMb2dpbi1MQVQtU2VydmljZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIExvZ2luLUxBVC1Ob2RlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzUsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiTG9naW4tTEFULU5vZGUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBMb2dpbi1MQVQtR3JvdXAgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzNiwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJMb2dpbi1MQVQtR3JvdXAiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBMb2dpbi1MQVQtUG9ydCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTYzLAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIkxvZ2luLUxBVC1Qb3J0IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogVHVubmVsLVR5cGUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk2NCwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJUdW5uZWwtVHlwZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICJFbnVtZXJhdGVkKFR1bm5lbC1UeXBlKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiUFBUUCIsIHsgLmkzMj0xIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJMMkYiLCB7IC5pMzI9MiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAiTDJUUCIsIHsgLmkzMj0zIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzQgPSB7ICJBVE1QIiwgeyAuaTMyPTQgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNSA9IHsgIlZUUCIsIHsgLmkzMj01IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzYgPSB7ICJBSCIsIHsgLmkzMj02IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzcgPSB7ICJJUF9JUF9FTkNBUCIsIHsgLmkzMj03IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzggPSB7ICJNSU5fSVBfSVAiLCB7IC5pMzI9OCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF85ID0geyAiRVNQIiwgeyAuaTMyPTkgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTAgPSB7ICJHUkUiLCB7IC5pMzI9MTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTEgPSB7ICJEVlMiLCB7IC5pMzI9MTEgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTIgPSB7ICJJUF9JTl9JUF9UVU5ORUxJTkciLCB7IC5pMzI9MTIgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTMgPSB7ICJWTEFOIiwgeyAuaTMyPTEzIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF81LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzYsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF84LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzksIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTAsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTMsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFR1bm5lbC1NZWRpdW0tVHlwZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTY1LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIlR1bm5lbC1NZWRpdW0tVHlwZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICJFbnVtZXJhdGVkKFR1bm5lbC1NZWRpdW0tVHlwZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIklQVjQiLCB7IC5pMzI9MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiSVBWNiIsIHsgLmkzMj0yIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMgPSB7ICJOU0FQIiwgeyAuaTMyPTMgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNCA9IHsgIkhETEMiLCB7IC5pMzI9NCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF81ID0geyAiQkJOIiwgeyAuaTMyPTUgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNiA9IHsgIklFRUVfODAyIiwgeyAuaTMyPTYgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNyA9IHsgIkVfMTYzIiwgeyAuaTMyPTcgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfOCA9IHsgIkVfMTY0IiwgeyAuaTMyPTggfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfOSA9IHsgIkZfNjkiLCB7IC5pMzI9OSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xMCA9IHsgIlhfMTIxIiwgeyAuaTMyPTEwIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzExID0geyAiSVBYIiwgeyAuaTMyPTExIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEyID0geyAiQVBQTEVUQUxLXzgwMiIsIHsgLmkzMj0xMiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xMyA9IHsgIkRFQ05FVDQiLCB7IC5pMzI9MTMgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTQgPSB7ICJWSU5FUyIsIHsgLmkzMj0xNCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xNSA9IHsgIkVfMTY0X05TQVAiLCB7IC5pMzI9MTUgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF80LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzUsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF83LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzgsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfOSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xNCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xNSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogVHVubmVsLUNsaWVudC1FbmRwb2ludCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTY2LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIlR1bm5lbC1DbGllbnQtRW5kcG9pbnQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFR1bm5lbC1TZXJ2ZXItRW5kcG9pbnQgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk2NywJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJUdW5uZWwtU2VydmVyLUVuZHBvaW50IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBUdW5uZWwtUGFzc3dvcmQgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk2OSwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJUdW5uZWwtUGFzc3dvcmQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBUdW5uZWwtUHJpdmF0ZS1Hcm91cC1JZCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTgxLAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIlR1bm5lbC1Qcml2YXRlLUdyb3VwLUlkIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogVHVubmVsLUFzc2lnbm1lbnQtSWQgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk4MiwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJUdW5uZWwtQXNzaWdubWVudC1JZCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFR1bm5lbC1QcmVmZXJlbmNlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJODMsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiVHVubmVsLVByZWZlcmVuY2UiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFR1bm5lbC1DbGllbnQtQXV0aC1JZCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTkwLAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIlR1bm5lbC1DbGllbnQtQXV0aC1JZCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogVHVubmVsLVNlcnZlci1BdXRoLUlkICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJOTEsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiVHVubmVsLVNlcnZlci1BdXRoLUlkIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBBY2NvdW50aW5nLUlucHV0LU9jdGV0cyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM2MywJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJBY2NvdW50aW5nLUlucHV0LU9jdGV0cyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVENjQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogQWNjb3VudGluZy1PdXRwdXQtT2N0ZXRzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzY0LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIkFjY291bnRpbmctT3V0cHV0LU9jdGV0cyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVENjQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogQWNjb3VudGluZy1JbnB1dC1QYWNrZXRzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzY1LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIkFjY291bnRpbmctSW5wdXQtUGFja2V0cyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVENjQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogQWNjb3VudGluZy1PdXRwdXQtUGFja2V0cyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM2NiwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJBY2NvdW50aW5nLU91dHB1dC1QYWNrZXRzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQ2NAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBBY2N0LVNlc3Npb24tVGltZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTQ2LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIkFjY3QtU2Vzc2lvbi1UaW1lIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBBY2N0LUF1dGhlbnRpYyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTQ1LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIkFjY3QtQXV0aGVudGljIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIkVudW1lcmF0ZWQoQWNjdC1BdXRoZW50aWMpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJOT05FIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIlJBRElVUyIsIHsgLmkzMj0xIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMgPSB7ICJMT0NBTCIsIHsgLmkzMj0yIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzQgPSB7ICJSRU1PVEUiLCB7IC5pMzI9MyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF81ID0geyAiRElBTUVURVIiLCB7IC5pMzI9NCB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzQsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogQWNjb3VudGluZy1BdXRoLU1ldGhvZCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTQwNiwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJBY2NvdW50aW5nLUF1dGgtTWV0aG9kIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIkVudW1lcmF0ZWQoQWNjb3VudGluZy1BdXRoLU1ldGhvZCkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIlBBUCIsIHsgLmkzMj0xIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJDSEFQIiwgeyAuaTMyPTIgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMyA9IHsgIk1TX0NIQVBfMSIsIHsgLmkzMj0zIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzQgPSB7ICJNU19DSEFQXzIiLCB7IC5pMzI9NCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF81ID0geyAiRUFQIiwgeyAuaTMyPTUgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNiA9IHsgIlVOREVGSU5FRCIsIHsgLmkzMj02IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzcgPSB7ICJOT05FIiwgeyAuaTMyPTcgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF80LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzUsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF83LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBBY2N0LURlbGF5LVRpbWUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk0MSwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJBY2N0LURlbGF5LVRpbWUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIEFjY3QtTGluay1Db3VudCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTUxLAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIkFjY3QtTGluay1Db3VudCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogQWNjdC1UdW5uZWwtQ29ubmVjdGlvbiAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTY4LAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIkFjY3QtVHVubmVsLUNvbm5lY3Rpb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBBY2N0LVR1bm5lbC1QYWNrZXRzLUxvc3QgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk4NiwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJBY2N0LVR1bm5lbC1QYWNrZXRzLUxvc3QiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIE5BUy1JZGVudGlmaWVyICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzIsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiTkFTLUlkZW50aWZpZXIiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIE5BUy1JUC1BZGRyZXNzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNCwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJOQVMtSVAtQWRkcmVzcyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIE5BUy1JUHY2LUFkZHJlc3MgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk5NSwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJOQVMtSVB2Ni1BZGRyZXNzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogT3JpZ2luLUFBQS1Qcm90b2NvbCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTQwOCwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJPcmlnaW4tQUFBLVByb3RvY29sIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIkVudW1lcmF0ZWQoT3JpZ2luLUFBQS1Qcm90b2NvbCkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIlJBRElVUyIsIHsgLmkzMj0xIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogU3RhdGUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyNCwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJTdGF0ZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFJlZGlyZWN0LUhvc3QgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyOTIsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiUmVkaXJlY3QtSG9zdCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgRGlhbWV0ZXJVUklfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFJlZGlyZWN0LUhvc3QtVXNhZ2UgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyNjEsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiUmVkaXJlY3QtSG9zdC1Vc2FnZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICJFbnVtZXJhdGVkKFJlZGlyZWN0LUhvc3QtVXNhZ2UpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJET05UX0NBQ0hFIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIkFMTF9TRVNTSU9OIiwgeyAuaTMyPTEgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMyA9IHsgIkFMTF9SRUFMTSIsIHsgLmkzMj0yIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzQgPSB7ICJSRUFMTV9BTkRfQVBQTElDQVRJT04iLCB7IC5pMzI9MyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF81ID0geyAiQUxMX0FQUExJQ0FUSU9OIiwgeyAuaTMyPTQgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNiA9IHsgIkFMTF9IT1NUIiwgeyAuaTMyPTUgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNyA9IHsgIkFMTF9VU0VSIiwgeyAuaTMyPTYgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF80LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzUsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF83LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBSZWRpcmVjdC1NYXgtQ2FjaGUtVGltZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTI2MiwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJSZWRpcmVjdC1NYXgtQ2FjaGUtVGltZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogVHVubmVsaW5nICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNDAxLAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIlR1bm5lbGluZyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogQ0hBUC1BdXRoICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNDAyLAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIkNIQVAtQXV0aCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKworCQorICAgfQorCisgICAvKiBDb21tYW5kcyBzZWN0aW9uICovCisgICB7CisKKyAgIH0KKworICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGljdF9yZmM3MTU1X2F2cHNfbG9hZF9ydWxlcyhjaGFyICogY29uZmZpbGUpCit7CisgICAvKiBHcm91cGVkIEFWUCBzZWN0aW9uICovCisgICB7CisJICAvKiBUdW5uZWxpbmcgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVHVubmVsaW5nIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlR1bm5lbC1UeXBlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlR1bm5lbC1NZWRpdW0tVHlwZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJUdW5uZWwtQ2xpZW50LUVuZHBvaW50In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlR1bm5lbC1TZXJ2ZXItRW5kcG9pbnQifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVHVubmVsLVByZWZlcmVuY2UifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVHVubmVsLUNsaWVudC1BdXRoLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlR1bm5lbC1TZXJ2ZXItQXV0aC1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJUdW5uZWwtQXNzaWdubWVudC1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJUdW5uZWwtUGFzc3dvcmQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVHVubmVsLVByaXZhdGUtR3JvdXAtSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBDSEFQLUF1dGggKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQ0hBUC1BdXRoIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkNIQVAtQWxnb3JpdGhtIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkNIQVAtSWRlbnQifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQ0hBUC1SZXNwb25zZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKworICAgfQkKKworICAgLyogQ29tbWFuZHMgc2VjdGlvbiAqLworICAgeworCisgICB9CisKKyAgIExPR19EKCAiRXh0ZW5zaW9uICdEaWN0aW9uYXJ5IGRlZmluaXRpb25zIGZvciByZmM3MTU1X2F2cHMgKE5vbmUpJyBpbml0aWFsaXplZCIpOworICAgcmV0dXJuIDA7Cit9CisKK2ludCBkaWN0X2VudHJ5KGNoYXIgKiBjb25mZmlsZSkKK3sKKwlkaWN0X3JmYzcxNTVfYXZwc19sb2FkX2RlZnMoY29uZmZpbGUpOworCXJldHVybiBkaWN0X3JmYzcxNTVfYXZwc19sb2FkX3J1bGVzKGNvbmZmaWxlKTsKK30KKworY29uc3QgY2hhciogZGljdF9yZmM3MTU1X2F2cHNfcHJvdG9fdmVyKGNoYXIgKiBjb25mZmlsZSkgeworCXJldHVybiByZmM3MTU1X2F2cHNfcHJvdG9fdmVyOworfQorCitjb25zdCBkb3VibGUgZGljdF9yZmM3MTU1X2F2cHNfZ2VuX3RzKGNoYXIgKiBjb25mZmlsZSkgeworCXJldHVybiByZmM3MTU1X2F2cHNfZ2VuX2RhdGU7Cit9CisKK0VYVEVOU0lPTl9FTlRSWTIoImRpY3RfcmZjNzE1NV9hdnBzIiwgZGljdF9yZmM3MTU1X2F2cHNfbG9hZF9kZWZzLCBkaWN0X3JmYzcxNTVfYXZwc19sb2FkX3J1bGVzLCAiZGljdF9yZmM0MDA0X2F2cHMiKTsKKworCisKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF9yZmM3MTU1X2F2cHMvcmZjNzE1NV9hdnBzLmRpZCBiL2V4dGVuc2lvbnMvZGljdF9yZmM3MTU1X2F2cHMvcmZjNzE1NV9hdnBzLmRpZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzc0ZDVlCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kaWN0X3JmYzcxNTVfYXZwcy9yZmM3MTU1X2F2cHMuZGlkCkBAIC0wLDAgKzEsMiBAQAorZGljdF9yZmM0MDA0X2F2cHMKK2RpY3RfcmZjNzE1NV9hdnBzCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfcmZjNzY4M19hdnBzL0NNYWtlTGlzdHMudHh0IGIvZXh0ZW5zaW9ucy9kaWN0X3JmYzc2ODNfYXZwcy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTU5NjZiCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kaWN0X3JmYzc2ODNfYXZwcy9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDE2IEBACisjIFRoZSBkaWN0X3JmYzc2ODNfYXZwcyBleHRlbnNpb24KK1BST0pFQ1QoImRpY3RfcmZjNzY4M19hdnBzIGxpYnJhcnkgZ2VuZXJhdGVkIGJ5IEZkR2VuICIgQykKKworIyBDb21waWxlIGFzIGEgbW9kdWxlCitGRF9BRERfRVhURU5TSU9OKGRpY3RfcmZjNzY4M19hdnBzIGRpY3RfcmZjNzY4M19hdnBzLmMpCisKKworIyMjIworIyMgSU5TVEFMTCBzZWN0aW9uICMjCisKK0lOU1RBTEwoVEFSR0VUUyBkaWN0X3JmYzc2ODNfYXZwcworCUxJQlJBUlkgREVTVElOQVRJT04gJHtJTlNUQUxMX0VYVEVOU0lPTlNfU1VGRklYfQorQ09NUE9ORU5UIGZyZWVEaWFtZXRlci1kaWN0aW9uYXJ5LVJGQzc2ODNfQVZQUykKKworCisKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF9yZmM3NjgzX2F2cHMvZGljdF9yZmM3NjgzX2F2cHMuYyBiL2V4dGVuc2lvbnMvZGljdF9yZmM3NjgzX2F2cHMvZGljdF9yZmM3NjgzX2F2cHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzFiNjc3Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kaWN0X3JmYzc2ODNfYXZwcy9kaWN0X3JmYzc2ODNfYXZwcy5jCkBAIC0wLDAgKzEsMjkxIEBACisvKgorKiBDb3B5cmlnaHQgKGMpIDIwMTcgU3ByaW50CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKy8qKioqKioqKioqKioqKioqCisgR2VuZXJhdGVkIEJ5OiBmZHRvb2wgZW5oYW5jZW1lbnRzIHRvIGRpYWZ1enplcgorIExpY2Vuc2U6IHNhbWUgYXMgZnJlZURpYW1ldGVyCisqKioqKioqKioqKioqKioqLworCisKKy8qIAorICogRGljdGlvbmFyeSBkZWZpbml0aW9ucyBvZiBvYmplY3RzIHNwZWNpZmllZCBpbiByZmM3NjgzX2F2cHMuCisgKi8KKyNpbmNsdWRlIDxmcmVlRGlhbWV0ZXIvZXh0ZW5zaW9uLmg+CisKKyNkZWZpbmUgUFJPVE9fVkVSICJ1bnNwZWNpZmllZCIKKyNkZWZpbmUgR0VOX0RBVEUgIDE1MDY2OTcxNDMuNjkKKworY29uc3QgY2hhciAqcmZjNzY4M19hdnBzX3Byb3RvX3ZlciA9IFBST1RPX1ZFUjsKK2NvbnN0IGRvdWJsZSByZmM3NjgzX2F2cHNfZ2VuX2RhdGUgPSBHRU5fREFURTsKKworLyogVGhlIGNvbnRlbnQgb2YgdGhpcyBmaWxlIGZvbGxvd3MgdGhlIHNhbWUgc3RydWN0dXJlIGFzIGRpY3RfYmFzZV9wcm90by5jICovCisKKyNkZWZpbmUgQ0hFQ0tfZGljdF9uZXcoIF90eXBlLCBfZGF0YSwgX3BhcmVudCwgX3JlZiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgX3JldCA9IGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIChfdHlwZSksIChfZGF0YSksIChfcGFyZW50KSwgKF9yZWYpICk7IFwKKyAgICBpZiAoIF9yZXQgIT0gMCAmJiBfcmV0ICE9IEVFWElTVCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICByZXR1cm4gX3JldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBDSEVDS19kaWN0X3NlYXJjaCggX3R5cGUsIF9jcml0ZXJpYSwgX3doYXQsIF9yZXN1bHQgKQkJXAorICAgIENIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIChfdHlwZSksIChfY3JpdGVyaWEpLCAoX3doYXQpLCAoX3Jlc3VsdCksIEVOT0VOVCkgKTsKKworc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24geworICAgIHN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lOworICAgIGVudW0gcnVsZV9wb3NpdGlvbglwb3NpdGlvbjsKKyAgICBpbnQgCQkJbWluOworICAgIGludAkJCW1heDsKK307CisKKyNkZWZpbmUgUlVMRV9PUkRFUiggX3Bvc2l0aW9uICkgKCgoKF9wb3NpdGlvbikgPT0gUlVMRV9GSVhFRF9IRUFEKSB8fCAoKF9wb3NpdGlvbikgPT0gUlVMRV9GSVhFRF9UQUlMKSkgPyAxIDogMCApCisKKy8qIEF0dGVudGlvbiEgVGhpcyB2ZXJzaW9uIG9mIHRoZSBtYWNybyB1c2VzIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsIGluIGNvbnRyYXN0IHRvIG1vc3Qgb3RoZXIgY29waWVzISAqLworI2RlZmluZSBQQVJTRV9sb2NfcnVsZXMoIF9ydWxlYXJyYXksIF9wYXJlbnQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBfX2FyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yIChfX2FyPTA7IF9fYXIgPCBzaXplb2YoX3J1bGVhcnJheSkgLyBzaXplb2YoKF9ydWxlYXJyYXkpWzBdKTsgX19hcisrKSB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHN0cnVjdCBkaWN0X3J1bGVfZGF0YSBfX2RhdGEgPSB7IE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ucG9zaXRpb24sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLm1pbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ubWF4fTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfX2RhdGEucnVsZV9vcmRlciA9IFJVTEVfT1JERVIoX19kYXRhLnJ1bGVfcG9zaXRpb24pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIENIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIERJQ1RfQVZQLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAmKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICZfX2RhdGEucnVsZV9hdnAsIDAgKSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmICggIV9fZGF0YS5ydWxlX2F2cCApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9ERUJVRyhJTkZPLCAiQVZQIE5vdCBmb3VuZDogJyVzJyIsIChfcnVsZWFycmF5KVtfX2FyXS5hdnBfdmVuZG9yX3BsdXNfbmFtZS5hdnBfbmFtZSk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFTk9FTlQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgX3JldCA9IGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfUlVMRSwgJihfX2RhdGEpLCAoX3BhcmVudCksIE5VTEwgKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggX3JldCAhPSAwICYmIF9yZXQgIT0gRUVYSVNUICkgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFX0RFQlVHKElORk8sICJFcnJvciBvbiBydWxlIHdpdGggQVZQICclcyciLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLmF2cF9uYW1lKTsgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRUlOVkFMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgQ0hFQ0tfdmVuZG9yX25ldyggX2RhdGEgKSB7IFwKKyAgICAgICAgc3RydWN0IGRpY3Rfb2JqZWN0ICogdmVuZG9yX2ZvdW5kOyBcCisgICAgICAgIGlmIChmZF9kaWN0X3NlYXJjaChmZF9nX2NvbmZpZy0+Y25mX2RpY3QsRElDVF9WRU5ET1IsVkVORE9SX0JZX0lELCZfZGF0YS52ZW5kb3JfaWQsJnZlbmRvcl9mb3VuZCxFTk9FTlQpID09IEVOT0VOVCkgeyBcCisgICAgICAgICAgICAgICAgQ0hFQ0tfRkNUKGZkX2RpY3RfbmV3KGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9WRU5ET1IsICZfZGF0YSwgTlVMTCwgTlVMTCkpOyBcCisgICAgICAgIH0gXAorfQorCisjZGVmaW5lIGVudW12YWxfZGVmX3UzMiggX3ZhbF8sIF9zdHJfICkJCVwKKyAgICB7IF9zdHJfLCAJCXsgLnUzMiA9IF92YWxfIH19CisKKyNkZWZpbmUgZW51bXZhbF9kZWZfb3MoIF9sZW5fLCBfdmFsXywgX3N0cl8gKQkJCQlcCisgICAgeyBfc3RyXywgCQl7IC5vcyA9IHsgLmRhdGEgPSAodW5zaWduZWQgY2hhciAqKV92YWxfLCAubGVuID0gX2xlbl8gfX19CisKKworc3RhdGljIGludCBkaWN0X3JmYzc2ODNfYXZwc19sb2FkX2RlZnMoY2hhciAqIGNvbmZmaWxlKQoreworICAgVFJBQ0VfRU5UUlkoIiVwIiwgY29uZmZpbGUpOworCisgICAvKiBBVlAgc2VjdGlvbiAqLworICAgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBBZGRyZXNzX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIFVURjhTdHJpbmdfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogRGlhbWV0ZXJJZGVudGl0eV90eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBEaWFtZXRlclVSSV90eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBUaW1lX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIElQRmlsdGVyUnVsZV90eXBlOworCisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkFkZHJlc3MiLCAmQWRkcmVzc190eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiVVRGOFN0cmluZyIsICZVVEY4U3RyaW5nX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJEaWFtZXRlcklkZW50aXR5IiwgJkRpYW1ldGVySWRlbnRpdHlfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkRpYW1ldGVyVVJJIiwgJkRpYW1ldGVyVVJJX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJUaW1lIiwgJlRpbWVfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIklQRmlsdGVyUnVsZSIsICZJUEZpbHRlclJ1bGVfdHlwZSk7CisJCS8qIE9DLUZlYXR1cmUtVmVjdG9yICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNjIyLAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIk9DLUZlYXR1cmUtVmVjdG9yIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQ2NAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBPQy1TZXF1ZW5jZS1OdW1iZXIgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk2MjQsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiT0MtU2VxdWVuY2UtTnVtYmVyIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQ2NAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBPQy1WYWxpZGl0eS1EdXJhdGlvbiAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTYyNSwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJPQy1WYWxpZGl0eS1EdXJhdGlvbiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogT0MtUmVwb3J0LVR5cGUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk2MjYsCS8qIENvZGUgKi8KKwkJCQkwLAkvKiBWZW5kb3IgKi8KKwkJCQkiT0MtUmVwb3J0LVR5cGUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiRW51bWVyYXRlZChPQy1SZXBvcnQtVHlwZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIkhPU1RfUkVQT1JUIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIlJFQUxNX1JFUE9SVCIsIHsgLmkzMj0xIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMgPSB7ICJUZXhhcyIsIHsgLmkzMj03NTAzNCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF80ID0geyAiQ0EiLCB7IC5pMzI9OTUxMzQgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF80LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBPQy1SZWR1Y3Rpb24tUGVyY2VudGFnZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTYyNywJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJPQy1SZWR1Y3Rpb24tUGVyY2VudGFnZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogT0MtU3VwcG9ydGVkLUZlYXR1cmVzICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNjIxLAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIk9DLVN1cHBvcnRlZC1GZWF0dXJlcyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogT0MtT0xSICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNjIzLAkvKiBDb2RlICovCisJCQkJMCwJLyogVmVuZG9yICovCisJCQkJIk9DLU9MUiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKworCQorICAgfQorCisgICAvKiBDb21tYW5kcyBzZWN0aW9uICovCisgICB7CisKKyAgIH0KKworICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGljdF9yZmM3NjgzX2F2cHNfbG9hZF9ydWxlcyhjaGFyICogY29uZmZpbGUpCit7CisgICAvKiBHcm91cGVkIEFWUCBzZWN0aW9uICovCisgICB7CisJICAvKiBPQy1TdXBwb3J0ZWQtRmVhdHVyZXMgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiT0MtU3VwcG9ydGVkLUZlYXR1cmVzIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9DLUZlYXR1cmUtVmVjdG9yIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogT0MtT0xSICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9DLU9MUiJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPQy1TZXF1ZW5jZS1OdW1iZXIifSwgUlVMRV9GSVhFRF9IRUFELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPQy1SZXBvcnQtVHlwZSJ9LCBSVUxFX0ZJWEVEX0hFQUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9DLVJlZHVjdGlvbi1QZXJjZW50YWdlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk9DLVZhbGlkaXR5LUR1cmF0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCisgICB9CQorCisgICAvKiBDb21tYW5kcyBzZWN0aW9uICovCisgICB7CisKKyAgIH0KKworICAgTE9HX0QoICJFeHRlbnNpb24gJ0RpY3Rpb25hcnkgZGVmaW5pdGlvbnMgZm9yIHJmYzc2ODNfYXZwcyAoTm9uZSknIGluaXRpYWxpemVkIik7CisgICByZXR1cm4gMDsKK30KKworaW50IGRpY3RfZW50cnkoY2hhciAqIGNvbmZmaWxlKQoreworCWRpY3RfcmZjNzY4M19hdnBzX2xvYWRfZGVmcyhjb25mZmlsZSk7CisJcmV0dXJuIGRpY3RfcmZjNzY4M19hdnBzX2xvYWRfcnVsZXMoY29uZmZpbGUpOworfQorCitjb25zdCBjaGFyKiBkaWN0X3JmYzc2ODNfYXZwc19wcm90b192ZXIoY2hhciAqIGNvbmZmaWxlKSB7CisJcmV0dXJuIHJmYzc2ODNfYXZwc19wcm90b192ZXI7Cit9CisKK2NvbnN0IGRvdWJsZSBkaWN0X3JmYzc2ODNfYXZwc19nZW5fdHMoY2hhciAqIGNvbmZmaWxlKSB7CisJcmV0dXJuIHJmYzc2ODNfYXZwc19nZW5fZGF0ZTsKK30KKworRVhURU5TSU9OX0VOVFJZMigiZGljdF9yZmM3NjgzX2F2cHMiLCBkaWN0X3JmYzc2ODNfYXZwc19sb2FkX2RlZnMsIGRpY3RfcmZjNzY4M19hdnBzX2xvYWRfcnVsZXMpOworCisKKwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X3JmYzc2ODNfYXZwcy9yZmM3NjgzX2F2cHMuZGlkIGIvZXh0ZW5zaW9ucy9kaWN0X3JmYzc2ODNfYXZwcy9yZmM3NjgzX2F2cHMuZGlkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNmIxNDkKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfcmZjNzY4M19hdnBzL3JmYzc2ODNfYXZwcy5kaWQKQEAgLTAsMCArMSBAQAorZGljdF9yZmM3NjgzX2F2cHMKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF9yZmM3OTQ0X2F2cHMvQ01ha2VMaXN0cy50eHQgYi9leHRlbnNpb25zL2RpY3RfcmZjNzk0NF9hdnBzL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZjhkZjgKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfcmZjNzk0NF9hdnBzL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTYgQEAKKyMgVGhlIGRpY3RfcmZjNzk0NF9hdnBzIGV4dGVuc2lvbgorUFJPSkVDVCgiZGljdF9yZmM3OTQ0X2F2cHMgbGlicmFyeSBnZW5lcmF0ZWQgYnkgRmRHZW4gIiBDKQorCisjIENvbXBpbGUgYXMgYSBtb2R1bGUKK0ZEX0FERF9FWFRFTlNJT04oZGljdF9yZmM3OTQ0X2F2cHMgZGljdF9yZmM3OTQ0X2F2cHMuYykKKworCisjIyMjCisjIyBJTlNUQUxMIHNlY3Rpb24gIyMKKworSU5TVEFMTChUQVJHRVRTIGRpY3RfcmZjNzk0NF9hdnBzCisJTElCUkFSWSBERVNUSU5BVElPTiAke0lOU1RBTExfRVhURU5TSU9OU19TVUZGSVh9CitDT01QT05FTlQgZnJlZURpYW1ldGVyLWRpY3Rpb25hcnktUkZDNzk0NF9BVlBTKQorCisKKwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X3JmYzc5NDRfYXZwcy9kaWN0X3JmYzc5NDRfYXZwcy5jIGIvZXh0ZW5zaW9ucy9kaWN0X3JmYzc5NDRfYXZwcy9kaWN0X3JmYzc5NDRfYXZwcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMWJkMTcKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfcmZjNzk0NF9hdnBzL2RpY3RfcmZjNzk0NF9hdnBzLmMKQEAgLTAsMCArMSwyMTIgQEAKKy8qCisqIENvcHlyaWdodCAoYykgMjAxNyBTcHJpbnQKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLyoqKioqKioqKioqKioqKioKKyBHZW5lcmF0ZWQgQnk6IGZkdG9vbCBlbmhhbmNlbWVudHMgdG8gZGlhZnV6emVyCisgTGljZW5zZTogc2FtZSBhcyBmcmVlRGlhbWV0ZXIKKyoqKioqKioqKioqKioqKiovCisKKworLyogCisgKiBEaWN0aW9uYXJ5IGRlZmluaXRpb25zIG9mIG9iamVjdHMgc3BlY2lmaWVkIGluIHJmYzc5NDRfYXZwcy4KKyAqLworI2luY2x1ZGUgPGZyZWVEaWFtZXRlci9leHRlbnNpb24uaD4KKworI2RlZmluZSBQUk9UT19WRVIgInVuc3BlY2lmaWVkIgorI2RlZmluZSBHRU5fREFURSAgMTUwNjY5NzE0My42OQorCitjb25zdCBjaGFyICpyZmM3OTQ0X2F2cHNfcHJvdG9fdmVyID0gUFJPVE9fVkVSOworY29uc3QgZG91YmxlIHJmYzc5NDRfYXZwc19nZW5fZGF0ZSA9IEdFTl9EQVRFOworCisvKiBUaGUgY29udGVudCBvZiB0aGlzIGZpbGUgZm9sbG93cyB0aGUgc2FtZSBzdHJ1Y3R1cmUgYXMgZGljdF9iYXNlX3Byb3RvLmMgKi8KKworI2RlZmluZSBDSEVDS19kaWN0X25ldyggX3R5cGUsIF9kYXRhLCBfcGFyZW50LCBfcmVmICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBfcmV0ID0gZmRfZGljdF9uZXcoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgKF90eXBlKSwgKF9kYXRhKSwgKF9wYXJlbnQpLCAoX3JlZikgKTsgXAorICAgIGlmICggX3JldCAhPSAwICYmIF9yZXQgIT0gRUVYSVNUICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHJldHVybiBfcmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIENIRUNLX2RpY3Rfc2VhcmNoKCBfdHlwZSwgX2NyaXRlcmlhLCBfd2hhdCwgX3Jlc3VsdCApCQlcCisgICAgQ0hFQ0tfRkNUKCAgZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgKF90eXBlKSwgKF9jcml0ZXJpYSksIChfd2hhdCksIChfcmVzdWx0KSwgRU5PRU5UKSApOworCitzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiB7CisgICAgc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWU7CisgICAgZW51bSBydWxlX3Bvc2l0aW9uCXBvc2l0aW9uOworICAgIGludCAJCQltaW47CisgICAgaW50CQkJbWF4OworfTsKKworI2RlZmluZSBSVUxFX09SREVSKCBfcG9zaXRpb24gKSAoKCgoX3Bvc2l0aW9uKSA9PSBSVUxFX0ZJWEVEX0hFQUQpIHx8ICgoX3Bvc2l0aW9uKSA9PSBSVUxFX0ZJWEVEX1RBSUwpKSA/IDEgOiAwICkKKworLyogQXR0ZW50aW9uISBUaGlzIHZlcnNpb24gb2YgdGhlIG1hY3JvIHVzZXMgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgaW4gY29udHJhc3QgdG8gbW9zdCBvdGhlciBjb3BpZXMhICovCisjZGVmaW5lIFBBUlNFX2xvY19ydWxlcyggX3J1bGVhcnJheSwgX3BhcmVudCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IF9fYXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKF9fYXI9MDsgX19hciA8IHNpemVvZihfcnVsZWFycmF5KSAvIHNpemVvZigoX3J1bGVhcnJheSlbMF0pOyBfX2FyKyspIHsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgc3RydWN0IGRpY3RfcnVsZV9kYXRhIF9fZGF0YSA9IHsgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5wb3NpdGlvbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ubWluLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5tYXh9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIF9fZGF0YS5ydWxlX29yZGVyID0gUlVMRV9PUkRFUihfX2RhdGEucnVsZV9wb3NpdGlvbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgQ0hFQ0tfRkNUKCAgZmRfZGljdF9zZWFyY2goICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgRElDVF9BVlAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICYoX3J1bGVhcnJheSlbX19hcl0uYXZwX3ZlbmRvcl9wbHVzX25hbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgJl9fZGF0YS5ydWxlX2F2cCwgMCApICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYgKCAhX19kYXRhLnJ1bGVfYXZwICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFX0RFQlVHKElORk8sICJBVlAgTm90IGZvdW5kOiAnJXMnIiwgKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLmF2cF9uYW1lKTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVOT0VOVDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBfcmV0ID0gZmRfZGljdF9uZXcoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9SVUxFLCAmKF9fZGF0YSksIChfcGFyZW50KSwgTlVMTCApOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBfcmV0ICE9IDAgJiYgX3JldCAhPSBFRVhJU1QgKSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfREVCVUcoSU5GTywgIkVycm9yIG9uIHJ1bGUgd2l0aCBBVlAgJyVzJyIsICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0uYXZwX3ZlbmRvcl9wbHVzX25hbWUuYXZwX25hbWUpOyAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFSU5WQUw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBDSEVDS192ZW5kb3JfbmV3KCBfZGF0YSApIHsgXAorICAgICAgICBzdHJ1Y3QgZGljdF9vYmplY3QgKiB2ZW5kb3JfZm91bmQ7IFwKKyAgICAgICAgaWYgKGZkX2RpY3Rfc2VhcmNoKGZkX2dfY29uZmlnLT5jbmZfZGljdCxESUNUX1ZFTkRPUixWRU5ET1JfQllfSUQsJl9kYXRhLnZlbmRvcl9pZCwmdmVuZG9yX2ZvdW5kLEVOT0VOVCkgPT0gRU5PRU5UKSB7IFwKKyAgICAgICAgICAgICAgICBDSEVDS19GQ1QoZmRfZGljdF9uZXcoZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1ZFTkRPUiwgJl9kYXRhLCBOVUxMLCBOVUxMKSk7IFwKKyAgICAgICAgfSBcCit9CisKKyNkZWZpbmUgZW51bXZhbF9kZWZfdTMyKCBfdmFsXywgX3N0cl8gKQkJXAorICAgIHsgX3N0cl8sIAkJeyAudTMyID0gX3ZhbF8gfX0KKworI2RlZmluZSBlbnVtdmFsX2RlZl9vcyggX2xlbl8sIF92YWxfLCBfc3RyXyApCQkJCVwKKyAgICB7IF9zdHJfLCAJCXsgLm9zID0geyAuZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopX3ZhbF8sIC5sZW4gPSBfbGVuXyB9fX0KKworCitzdGF0aWMgaW50IGRpY3RfcmZjNzk0NF9hdnBzX2xvYWRfZGVmcyhjaGFyICogY29uZmZpbGUpCit7CisgICBUUkFDRV9FTlRSWSgiJXAiLCBjb25mZmlsZSk7CisKKyAgIC8qIEFWUCBzZWN0aW9uICovCisgICB7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIEFkZHJlc3NfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogVVRGOFN0cmluZ190eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBEaWFtZXRlcklkZW50aXR5X3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIERpYW1ldGVyVVJJX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIFRpbWVfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogSVBGaWx0ZXJSdWxlX3R5cGU7CisKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiQWRkcmVzcyIsICZBZGRyZXNzX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJVVEY4U3RyaW5nIiwgJlVURjhTdHJpbmdfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkRpYW1ldGVySWRlbnRpdHkiLCAmRGlhbWV0ZXJJZGVudGl0eV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiRGlhbWV0ZXJVUkkiLCAmRGlhbWV0ZXJVUklfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIlRpbWUiLCAmVGltZV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiSVBGaWx0ZXJSdWxlIiwgJklQRmlsdGVyUnVsZV90eXBlKTsKKwkJLyogRFJNUCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTMwMSwJLyogQ29kZSAqLworCQkJCTAsCS8qIFZlbmRvciAqLworCQkJCSJEUk1QIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIkVudW1lcmF0ZWQoRFJNUCkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIlBSSU9SSVRZXzE1IiwgeyAuaTMyPTE1IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJQUklPUklUWV8xNCIsIHsgLmkzMj0xNCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAiUFJJT1JJVFlfMTMiLCB7IC5pMzI9MTMgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNCA9IHsgIlBSSU9SSVRZXzEyIiwgeyAuaTMyPTEyIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzUgPSB7ICJQUklPUklUWV8xMSIsIHsgLmkzMj0xMSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF82ID0geyAiUFJJT1JJVFlfMTAiLCB7IC5pMzI9MTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNyA9IHsgIlBSSU9SSVRZXzkiLCB7IC5pMzI9OSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF84ID0geyAiUFJJT1JJVFlfOCIsIHsgLmkzMj04IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzkgPSB7ICJQUklPUklUWV83IiwgeyAuaTMyPTcgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTAgPSB7ICJQUklPUklUWV82IiwgeyAuaTMyPTYgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTEgPSB7ICJQUklPUklUWV81IiwgeyAuaTMyPTUgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTIgPSB7ICJQUklPUklUWV80IiwgeyAuaTMyPTQgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTMgPSB7ICJQUklPUklUWV8zIiwgeyAuaTMyPTMgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTQgPSB7ICJQUklPUklUWV8yIiwgeyAuaTMyPTIgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTUgPSB7ICJQUklPUklUWV8xIiwgeyAuaTMyPTEgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTYgPSB7ICJQUklPUklUWV8wIiwgeyAuaTMyPTAgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF80LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzUsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF83LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzgsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfOSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xNCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xNSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xNiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKworCQorICAgfQorCisgICAvKiBDb21tYW5kcyBzZWN0aW9uICovCisgICB7CisKKyAgIH0KKworICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGljdF9yZmM3OTQ0X2F2cHNfbG9hZF9ydWxlcyhjaGFyICogY29uZmZpbGUpCit7CisgICAvKiBHcm91cGVkIEFWUCBzZWN0aW9uICovCisgICB7CisKKyAgIH0JCisKKyAgIC8qIENvbW1hbmRzIHNlY3Rpb24gKi8KKyAgIHsKKworICAgfQorCisgICBMT0dfRCggIkV4dGVuc2lvbiAnRGljdGlvbmFyeSBkZWZpbml0aW9ucyBmb3IgcmZjNzk0NF9hdnBzIChOb25lKScgaW5pdGlhbGl6ZWQiKTsKKyAgIHJldHVybiAwOworfQorCitpbnQgZGljdF9lbnRyeShjaGFyICogY29uZmZpbGUpCit7CisJZGljdF9yZmM3OTQ0X2F2cHNfbG9hZF9kZWZzKGNvbmZmaWxlKTsKKwlyZXR1cm4gZGljdF9yZmM3OTQ0X2F2cHNfbG9hZF9ydWxlcyhjb25mZmlsZSk7Cit9CisKK2NvbnN0IGNoYXIqIGRpY3RfcmZjNzk0NF9hdnBzX3Byb3RvX3ZlcihjaGFyICogY29uZmZpbGUpIHsKKwlyZXR1cm4gcmZjNzk0NF9hdnBzX3Byb3RvX3ZlcjsKK30KKworY29uc3QgZG91YmxlIGRpY3RfcmZjNzk0NF9hdnBzX2dlbl90cyhjaGFyICogY29uZmZpbGUpIHsKKwlyZXR1cm4gcmZjNzk0NF9hdnBzX2dlbl9kYXRlOworfQorCitFWFRFTlNJT05fRU5UUlkyKCJkaWN0X3JmYzc5NDRfYXZwcyIsIGRpY3RfcmZjNzk0NF9hdnBzX2xvYWRfZGVmcywgZGljdF9yZmM3OTQ0X2F2cHNfbG9hZF9ydWxlcyk7CisKKworCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfcmZjNzk0NF9hdnBzL3JmYzc5NDRfYXZwcy5kaWQgYi9leHRlbnNpb25zL2RpY3RfcmZjNzk0NF9hdnBzL3JmYzc5NDRfYXZwcy5kaWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNlNDc1YQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF9yZmM3OTQ0X2F2cHMvcmZjNzk0NF9hdnBzLmRpZApAQCAtMCwwICsxIEBACitkaWN0X3JmYzc5NDRfYXZwcwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X3NpcC9DTWFrZUxpc3RzLnR4dCBiL2V4dGVuc2lvbnMvZGljdF9zaXAvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM0MDlkNwotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF9zaXAvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxMyBAQAorIyBUaGUgZGljdF9zaXAgZXh0ZW5zaW9uCitQUk9KRUNUKCJEaWFtZXRlciBTSVAgKFJGQzQ3NDApIGRpY3Rpb25hcnkgZGVmaW5pdGlvbnMiIEMpCisKKyMgQ29tcGlsZSBhcyBhIG1vZHVsZQorRkRfQUREX0VYVEVOU0lPTihkaWN0X3NpcCBkaWN0X3NpcC5jKQorCisKKyMjIyMKKyMjIElOU1RBTEwgc2VjdGlvbiAjIworCitJTlNUQUxMKFRBUkdFVFMgZGljdF9zaXAKKwlMSUJSQVJZIERFU1RJTkFUSU9OICR7SU5TVEFMTF9FWFRFTlNJT05TX1NVRkZJWH0KKwlDT01QT05FTlQgZnJlZURpYW1ldGVyLWRpY3Rpb25hcnktUkZDNDc0MCkKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF9zaXAvZGljdF9zaXAuYyBiL2V4dGVuc2lvbnMvZGljdF9zaXAvZGljdF9zaXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzZjMGNiCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kaWN0X3NpcC9kaWN0X3NpcC5jCkBAIC0wLDAgKzEsMjk1MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IEFsZXhhbmRyZSBXZXN0ZmFobCA8YXdlc3RmYWhsQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDEwLCBBbGV4YW5kcmUgV2VzdGZhaGwsIFRlcmFva2EgTGFib3JhdG9yeSAoS2VpbyBVbml2ZXJzaXR5KSwgYW5kIHRoZSBXSURFIFByb2plY3QuIAkgKgkJCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBUZXJhb2thIExhYm9yYXRvcnkgbm9yIHRoZSAJCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgVGVyYW9rYSBMYWJvcmF0b3J5IAkJCQkJCSAqCisqICAgCQkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxmcmVlRGlhbWV0ZXIvZXh0ZW5zaW9uLmg+CisKKworCisvKiBUaGUgY29udGVudCBvZiB0aGlzIGZpbGUgZm9sbG93cyB0aGUgc2FtZSBzdHJ1Y3R1cmUgYXMgZGljdF9iYXNlX3Byb3RvLmMgKi8KKworI2RlZmluZSBDSEVDS19kaWN0X25ldyggX3R5cGUsIF9kYXRhLCBfcGFyZW50LCBfcmVmICkJXAorCUNIRUNLX0ZDVCggIGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIChfdHlwZSksIChfZGF0YSksIChfcGFyZW50KSwgKF9yZWYpKSAgKTsKKworI2RlZmluZSBDSEVDS19kaWN0X3NlYXJjaCggX3R5cGUsIF9jcml0ZXJpYSwgX3doYXQsIF9yZXN1bHQgKQlcCisJQ0hFQ0tfRkNUKCAgZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgKF90eXBlKSwgKF9jcml0ZXJpYSksIChfd2hhdCksIChfcmVzdWx0KSwgRU5PRU5UKSApOworCitzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiB7CisJY2hhciAJCQkqYXZwX25hbWU7CisJZW51bSBydWxlX3Bvc2l0aW9uCXBvc2l0aW9uOworCWludCAJCQltaW47CisJaW50CQkJbWF4OworfTsKKworI2RlZmluZSBSVUxFX09SREVSKCBfcG9zaXRpb24gKSAoKCgoX3Bvc2l0aW9uKSA9PSBSVUxFX0ZJWEVEX0hFQUQpIHx8ICgoX3Bvc2l0aW9uKSA9PSBSVUxFX0ZJWEVEX1RBSUwpKSA/IDEgOiAwICkKKworI2RlZmluZSBQQVJTRV9sb2NfcnVsZXMoIF9ydWxlYXJyYXksIF9wYXJlbnQpIHsJCQkJCQkJCVwKKwlpbnQgX19hcjsJCQkJCQkJCQkJCVwKKwlmb3IgKF9fYXI9MDsgX19hciA8IHNpemVvZihfcnVsZWFycmF5KSAvIHNpemVvZigoX3J1bGVhcnJheSlbMF0pOyBfX2FyKyspIHsJCQlcCisJCXN0cnVjdCBkaWN0X3J1bGVfZGF0YSBfX2RhdGEgPSB7IE5VTEwsIAkJCQkJCQlcCisJCQkoX3J1bGVhcnJheSlbX19hcl0ucG9zaXRpb24sCQkJCQkJCVwKKwkJCTAsIAkJCQkJCQkJCQlcCisJCQkoX3J1bGVhcnJheSlbX19hcl0ubWluLAkJCQkJCQkJXAorCQkJKF9ydWxlYXJyYXkpW19fYXJdLm1heH07CQkJCQkJCVwKKwkJX19kYXRhLnJ1bGVfb3JkZXIgPSBSVUxFX09SREVSKF9fZGF0YS5ydWxlX3Bvc2l0aW9uKTsJCQkJCVwKKwkJQ0hFQ0tfRkNUKCAgZmRfZGljdF9zZWFyY2goIAkJCQkJCQkJXAorCQkJZmRfZ19jb25maWctPmNuZl9kaWN0LAkJCQkJCQkJXAorCQkJRElDVF9BVlAsIAkJCQkJCQkJCVwKKwkJCUFWUF9CWV9OQU1FLCAJCQkJCQkJCQlcCisJCQkoX3J1bGVhcnJheSlbX19hcl0uYXZwX25hbWUsIAkJCQkJCQlcCisJCQkmX19kYXRhLnJ1bGVfYXZwLCAwICkgKTsJCQkJCQkJXAorCQlpZiAoICFfX2RhdGEucnVsZV9hdnAgKSB7CQkJCQkJCQlcCisJCQlUUkFDRV9ERUJVRyhJTkZPLCAiQVZQIE5vdCBmb3VuZDogJyVzJyIsIChfcnVsZWFycmF5KVtfX2FyXS5hdnBfbmFtZSApOwkJXAorCQkJcmV0dXJuIEVOT0VOVDsJCQkJCQkJCQlcCisJCX0JCQkJCQkJCQkJCVwKKwkJQ0hFQ0tfRkNUX0RPKCBmZF9kaWN0X25ldyggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1JVTEUsICZfX2RhdGEsIF9wYXJlbnQsIE5VTEwpLAlcCisJCQl7CQkJCQkJCSAgICAgICAgCQlcCisJCQkJVFJBQ0VfREVCVUcoSU5GTywgIkVycm9yIG9uIHJ1bGUgd2l0aCBBVlAgJyVzJyIsICAgICAgCQkJXAorCQkJCQkgKF9ydWxlYXJyYXkpW19fYXJdLmF2cF9uYW1lICk7CQkgICAgICAJCQlcCisJCQkJcmV0dXJuIEVJTlZBTDsJCQkJCSAgICAgIAkJCVwKKwkJCX0gKTsJCQkJCQkJICAgICAgCQkJXAorCX0JCQkJCQkJCQkgICAgICAJCQlcCit9CisKKyNkZWZpbmUgZW51bXZhbF9kZWZfdTMyKCBfdmFsXywgX3N0cl8gKSBcCisJCXsgX3N0cl8sIAkJeyAudTMyID0gX3ZhbF8gfX0KKworI2RlZmluZSBlbnVtdmFsX2RlZl9vcyggX2xlbl8sIF92YWxfLCBfc3RyXyApIFwKKwkJeyBfc3RyXywgCQl7IC5vcyA9IHsgLmRhdGEgPSAodW5zaWduZWQgY2hhciAqKV92YWxfLCAubGVuID0gX2xlbl8gfX19CisKKworCitpbnQgZHNfZGljdF9pbml0KGNoYXIgKiBjb25mZmlsZSkKK3sKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBzaXA7CisJeworCQlzdHJ1Y3QgZGljdF9hcHBsaWNhdGlvbl9kYXRhIGRhdGEgID0geyAJNiwgIkRpYW1ldGVyIFNlc3Npb24gSW5pdGlhdGlvbiBQcm90b2NvbCAoU0lQKSBBcHBsaWNhdGlvbiIJfTsKKwkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVBQTElDQVRJT04sICZkYXRhICwgTlVMTCwgJnNpcCk7CisJfQorCisJLyogQVZQIHNlY3Rpb24gKi8KKwl7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIFVURjhTdHJpbmdfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogRGlhbWV0ZXJVUklfdHlwZTsKKworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJVVEY4U3RyaW5nIiwgJlVURjhTdHJpbmdfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkRpYW1ldGVyVVJJIiwgJkRpYW1ldGVyVVJJX3R5cGUpOworCisJCS8qIERpZ2VzdCBBVlBzIChmcm9tIFJBRElVUykgKi8KKwkJCisJCS8qIERpZ2VzdC1SZXNwb25zZSAqLworCQl7CisJCQkvKgorCisJCQkqLworCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJCQkJMTAzLCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIkRpZ2VzdC1SZXNwb25zZSIsIAkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfQorCisJCS8qIERpZ2VzdC1SZWFsbSAqLworCQl7CisJCQkvKgorCisJCQkqLworCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJCQkJMTA0LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIkRpZ2VzdC1SZWFsbSIsIAkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfQorCisJCS8qIERpZ2VzdC1Ob25jZSAqLworCQl7CisJCQkvKgorCisJCQkqLworCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJCQkJMTA1LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIkRpZ2VzdC1Ob25jZSIsIAkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfQorCisJCS8qIERpZ2VzdC1SZXNwb25zZS1BdXRoICovCisJCXsKKwkJCS8qCisKKwkJCSovCisKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQkJCQkxMDYsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiRGlnZXN0LVJlc3BvbnNlLUF1dGgiLCAJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORyAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX0KKworCQkvKiBEaWdlc3QtTmV4dG5vbmNlICovCisJCXsKKwkJCS8qCisKKwkJCSovCisKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQkJCQkxMDcsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiRGlnZXN0LU5leHRub25jZSIsIAkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfQorCisJCS8qIERpZ2VzdC1NZXRob2QgKi8KKwkJeworCQkJLyoKKworCQkJKi8KKworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTEwOCwgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJEaWdlc3QtTWV0aG9kIiwgCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCSAJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9CisKKwkJLyogRGlnZXN0LVVSSSAqLworCQl7CisJCQkvKgorCisJCQkqLworCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJCQkJMTA5LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIkRpZ2VzdC1VUkkiLCAJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORyAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX0KKworCQkvKiBEaWdlc3QtUW9QICovCisJCXsKKwkJCS8qCisKKwkJCSovCisKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQkJCQkxMTAsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiRGlnZXN0LVFvUCIsIAkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfQorCisJCS8qIERpZ2VzdC1BbGdvcml0aG0gKi8KKwkJeworCQkJLyoKKworCQkJKi8KKworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTExMSwgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJEaWdlc3QtQWxnb3JpdGhtIiwgCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCSAJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9CisKKwkJLyogRGlnZXN0LUVudGl0eS1Cb2R5LUhhc2ggKi8KKwkJeworCQkJLyoKKworCQkJKi8KKworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTExMiwgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJEaWdlc3QtRW50aXR5LUJvZHktSGFzaCIsIAkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfQorCisJCS8qIERpZ2VzdC1DTm9uY2UgKi8KKwkJeworCQkJLyoKKworCQkJKi8KKworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTExMywgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJEaWdlc3QtQ05vbmNlIiwgCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCSAJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9CisKKwkJLyogRGlnZXN0LU5vbmNlLUNvdW50ICovCisJCXsKKwkJCS8qCisKKwkJCSovCisKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQkJCQkxMTQsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiRGlnZXN0LU5vbmNlLUNvdW50IiwgCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCSAJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9CisKKwkJLyogRGlnZXN0LVVzZXJuYW1lICovCisJCXsKKwkJCS8qCisKKwkJCSovCisKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQkJCQkxMTUsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiRGlnZXN0LVVzZXJuYW1lIiwgCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCSAJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9CisKKwkJLyogRGlnZXN0LU9wYXF1ZSAqLworCQl7CisJCQkvKgorCisJCQkqLworCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJCQkJMTE2LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIkRpZ2VzdC1PcGFxdWUiLCAJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORyAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX0KKworCQkvKiBEaWdlc3QtQXV0aC1QYXJhbSAqLworCQl7CisJCQkvKgorCisJCQkqLworCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJCQkJMTE3LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIkRpZ2VzdC1BdXRoLVBhcmFtIiwgCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCSAJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9CisKKwkJLyogRGlnZXN0LUFLQS1BdXRzICovCisJCXsKKwkJCS8qCisKKwkJCSovCisKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQkJCQkxMTgsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiRGlnZXN0LUFLQS1BdXRzIiwgCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCSAJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9CisKKwkJLyogRGlnZXN0LURvbWFpbiAqLworCQl7CisJCQkvKgorCisJCQkqLworCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJCQkJMTE5LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIkRpZ2VzdC1Eb21haW4iLCAJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORyAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX0KKworCQkvKiBEaWdlc3QtU3RhbGUgKi8KKwkJeworCQkJLyoKKworCQkJKi8KKworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTEyMCwgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJEaWdlc3QtU3RhbGUiLCAJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORyAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX0KKworCQkvKiBEaWdlc3QtSEExICovCisJCXsKKwkJCS8qCisKKwkJCSovCisKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQkJCQkxMjEsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiRGlnZXN0LUhBMSIsIAkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfQorCQkvKiBTSVAtQU9SICovCisJCXsKKwkJCS8qCisKKwkJCSovCisKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQkJCQkxMjIsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiU0lQLUFPUiIsIAkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfQorCisKKwkJLyogRGlhbWV0ZXIgU0lQIEFWUHMqLworCQkvKiBTSVAtQWNjb3VudGluZy1TZXJ2ZXItVVJJKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgU0lQLUFjY291bnRpbmctU2VydmVyLVVSSSBBVlAgKEFWUCBDb2RlIDM2OSkgaXMgb2YgdHlwZQorCQkJCURpYW1ldGVyVVJJLiAgVGhpcyBBVlAgY29udGFpbnMgdGhlIGFkZHJlc3Mgb2YgYSBEaWFtZXRlciBzZXJ2ZXIgdGhhdAorCQkJCWlzIGFibGUgdG8gcmVjZWl2ZSBTSVAtc2Vzc2lvbi1yZWxhdGVkIGFjY291bnRpbmcgaW5mb3JtYXRpb24uCisJCQkqLworCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJCQkJMzY5LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIlNJUC1BY2NvdW50aW5nLVNlcnZlci1VUkkiLCAJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORyAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIERpYW1ldGVyVVJJX3R5cGUsIE5VTEwpOworCQl9CisJCS8qIFNJUC1DcmVkaXQtQ29udHJvbC1TZXJ2ZXItVVJJICovCisJCXsKKwkJCS8qCisJCQlUaGUgU0lQLUNyZWRpdC1Db250cm9sLVNlcnZlci1VUkkgQVZQIChBVlAgQ29kZSAzNzApIGlzIG9mIHR5cGUKKwkJCURpYW1ldGVyVVJJLiAgVGhpcyBBVlAgY29udGFpbnMgdGhlIGFkZHJlc3Mgb2YgYSBEaWFtZXRlciBzZXJ2ZXIgdGhhdAorCQkJaXMgYWJsZSB0byBhdXRob3JpemUgcmVhbC10aW1lIGNyZWRpdCBjb250cm9sIHVzYWdlLiAgVGhlIERpYW1ldGVyCisJCQlDcmVkaXQtQ29udHJvbCBBcHBsaWNhdGlvbiBbUkZDNDAwNl0gbWF5IGJlIHVzZWQgZm9yIHRoaXMgcHVycG9zZS4KKworCisJCQkqLworCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJCQkJMzcwLCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIlNJUC1DcmVkaXQtQ29udHJvbC1TZXJ2ZXItVVJJIiwgCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCSAJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBEaWFtZXRlclVSSV90eXBlLCBOVUxMKTsKKwkJfQorCisJCS8qIFNJUC1BY2NvdW50aW5nLUluZm9ybWF0aW9uICovCisJCXsKKwkJCS8qCisJCQkJVGhlIFNJUC1BY2NvdW50aW5nLUluZm9ybWF0aW9uIChBVlAgQ29kZSAzNjgpIGlzIG9mIHR5cGUgR3JvdXBlZCwgYW5kCisJCQkJY29udGFpbnMgdGhlIERpYW1ldGVyIGFkZHJlc3NlcyBvZiB0aG9zZSBub2RlcyB0aGF0IGFyZSBhYmxlIHRvCisJCQkJY29sbGVjdCBhY2NvdW50aW5nIGluZm9ybWF0aW9uLgorCisJCQkJVGhlIFNJUC1BY2NvdW50aW5nLUluZm9ybWF0aW9uIEFWUCBpcyBkZWZpbmVkIGFzIGZvbGxvd3MgKHBlciB0aGUKKwkJCQlncm91cGVkLWF2cC1kZWYgb2YgUkZDIDM1ODggW1JGQzM1ODhdKToKKworCQkJCVNJUC1BY2NvdW50aW5nLUluZm9ybWF0aW9uIDo6PSA8IEFWUCBIZWFkZXI6IDM2OCA+CisJCQkJCSogWyBTSVAtQWNjb3VudGluZy1TZXJ2ZXItVVJJIF0KKwkJCQkJKiBbIFNJUC1DcmVkaXQtQ29udHJvbC1TZXJ2ZXItVVJJIF0KKwkJCQkJKiBbIEFWUF0KKworCQkJKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQkJCQkzNjgsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiU0lQLUFjY291bnRpbmctSW5mb3JtYXRpb24iLCAJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX0dST1VQRUQgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPSAKKwkJCQkJCXsgCSB7ICAiU0lQLUFjY291bnRpbmctU2VydmVyLVVSSSIsIAkJCVJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCQkJCQkJLHsgICJTSVAtQ3JlZGl0LUNvbnRyb2wtU2VydmVyLVVSSSIsCQkJUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJCQkJCX07CisJCQkKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCQl9CisKKwkJLyogU0lQLVNlcnZlci1VUkkgKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgU0lQLVNlcnZlci1VUkkgQVZQIChBVlAgQ29kZSAzNzEpIGlzIG9mIHR5cGUgVVRGOFN0cmluZy4gIFRoaXMKKwkJCQlBVlAgY29udGFpbnMgYSBTSVAgb3IgU0lQUyBVUkkgKGFzIGRlZmluZWQgaW4gUkZDIDMyNjEgW1JGQzMyNjFdKQorCQkJCXRoYXQgaWRlbnRpZmllcyBhIFNJUCBzZXJ2ZXIuCisJCQkqLworCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJCQkJMzcxLCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIlNJUC1TZXJ2ZXItVVJJIiwgCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCSAJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9CisKKwkJLyogU0lQLU1hbmRhdG9yeS1DYXBhYmlsaXR5ICovCisJCXsKKwkJCS8qCisJCQkJVGhlIFNJUC1NYW5kYXRvcnktQ2FwYWJpbGl0eSBBVlAgKEFWUCBDb2RlIDM3MykgaXMgb2YgdHlwZQorCQkJCVVuc2lnbmVkMzIuICBUaGUgdmFsdWUgcmVwcmVzZW50cyBhIGNlcnRhaW4gY2FwYWJpbGl0eSAob3Igc2V0IG9mCisJCQkJY2FwYWJpbGl0aWVzKSB0aGF0IGhhdmUgdG8gYmUgZnVsZmlsbGVkIGJ5IHRoZSBTSVAgc2VydmVyIGFsbG9jYXRlZAorCQkJCXRvIHRoZSB1c2VyLgorCisJCQkJVGhlIHNlbWFudGljcyBvZiB0aGUgZGlmZmVyZW50IHZhbHVlcyBhcmUgbm90IHN0YW5kYXJkaXplZCwgYXMgaXQgaXMKKwkJCQlhIG1hdHRlciBvZiB0aGUgYWRtaW5pc3RyYXRpdmUgbmV0d29yayB0byBhbGxvY2F0ZSBpdHMgb3duIHNlbWFudGljcworCQkJCXdpdGhpbiBpdHMgb3duIG5ldHdvcmsuICBFYWNoIHZhbHVlIGhhcyB0byByZXByZXNlbnQgYSBzaW5nbGUKKwkJCQljYXBhYmlsaXR5IHdpdGhpbiB0aGUgYWRtaW5pc3RyYXRpdmUgbmV0d29yay4KKworCQkJKi8KKworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTM3MywgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJTSVAtTWFuZGF0b3J5LUNhcGFiaWxpdHkiLCAJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9VTlNJR05FRDMyIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgTlVMTCk7CisJCX0KKwkJLyogU0lQLU9wdGlvbmFsLUNhcGFiaWxpdHkgKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgU0lQLU9wdGlvbmFsLUNhcGFiaWxpdHkgQVZQIChBVlAgQ29kZSAzNzQpIGlzIG9mIHR5cGUgVW5zaWduZWQzMi4KKwkJCQlUaGUgdmFsdWUgcmVwcmVzZW50cyBhIGNlcnRhaW4gY2FwYWJpbGl0eSAob3Igc2V0IG9mIGNhcGFiaWxpdGllcykKKwkJCQl0aGF0LCBvcHRpb25hbGx5LCBtYXkgYmUgZnVsZmlsbGVkIGJ5IHRoZSBTSVAgc2VydmVyIGFsbG9jYXRlZCB0byB0aGUKKwkJCQl1c2VyLgorCisJCQkJVGhlIHNlbWFudGljcyBvZiB0aGUgZGlmZmVyZW50IHZhbHVlcyBhcmUgbm90IHN0YW5kYXJkaXplZCwgYXMgaXQgaXMKKwkJCQlhIG1hdHRlciBvZiB0aGUgYWRtaW5pc3RyYXRpdmUgbmV0d29yayB0byBhbGxvY2F0ZSBpdHMgb3duIHNlbWFudGljcworCQkJCXdpdGhpbiBpdHMgb3duIG5ldHdvcmsuICBFYWNoIHZhbHVlIGhhcyB0byByZXByZXNlbnQgYSBzaW5nbGUKKwkJCQljYXBhYmlsaXR5IHdpdGhpbiB0aGUgYWRtaW5pc3RyYXRpdmUgbmV0d29yay4KKworCQkJKi8KKworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTM3NCwgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJTSVAtT3B0aW9uYWwtQ2FwYWJpbGl0eSIsIAkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCBOVUxMKTsKKwkJfQorCisKKwkJLyogU0lQLVNlcnZlci1DYXBhYmlsaXRpZXMgKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgU0lQLVNlcnZlci1DYXBhYmlsaXRpZXMgQVZQIChBVlAgQ29kZSAzNzIpIGlzIG9mIHR5cGUgR3JvdXBlZC4KKwkJCQlUaGUgRGlhbWV0ZXIgaW5kaWNhdGVzIGluIHRoaXMgQVZQIHRoZSByZXF1aXJlbWVudHMgZm9yIGEgcGFydGljdWxhcgorCQkJCVNJUCBjYXBhYmlsaXR5LCBzbyB0aGF0IHRoZSBEaWFtZXRlciBjbGllbnQgKFNJUCBzZXJ2ZXIpIGlzIGFibGUgdG8KKwkJCQlzZWxlY3QgYW5vdGhlciBhcHByb3ByaWF0ZSBTSVAgc2VydmVyIHRvIHNlcnZlIHRoZSB1c2VyLgorCisJCQkJVGhlIFNJUC1TZXJ2ZXItQ2FwYWJpbGl0aWVzIEFWUCBhbGxvd3MgYSBEaWFtZXRlciBjbGllbnQgKFNJUCBzZXJ2ZXIpCisJCQkJdG8gc2VsZWN0IGFub3RoZXIgU0lQIHNlcnZlciBmb3IgdHJpZ2dlcmluZyBvciBleGVjdXRpbmcgc2VydmljZXMgdG8KKwkJCQl0aGUgdXNlci4gIEEgdXNlciBtYXkgaGF2ZSBlbmFibGVkIHNvbWUgc2VydmljZXMgdGhhdCByZXF1aXJlIHRoZQorCQkJCWltcGxlbWVudGF0aW9uIG9mIGNlcnRhaW4gY2FwYWJpbGl0aWVzIGluIHRoZSBTSVAgc2VydmVyIHRoYXQKKwkJCQl0cmlnZ2VycyBvciBleGVjdXRlcyB0aG9zZSBzZXJ2aWNlcy4gIEZvciBleGFtcGxlLCB0aGUgU0lQIHNlcnZlcgorCQkJCXRoYXQgdHJpZ2dlcnMgb3IgZXhlY3V0ZXMgc2VydmljZXMgdG8gdGhpcyB1c2VyIG1heSBuZWVkIHRvIGltcGxlbWVudAorCQkJCVNJUCBzZXJ2bGV0cyBbSlNSLTAwMDExNl0sIENhbGwgUHJvY2Vzc2luZyBMYW5ndWFnZSAoQ1BMKSBbUkZDMzg4MF0sCisJCQkJb3IgYW55IG90aGVyIGtpbmQgb2YgY2FwYWJpbGl0eS4gIE9yIHBlcmhhcHMgdGhhdCB1c2VyIGJlbG9uZ3MgdG8gYQorCQkJCXByZW1pdW0gdXNlcnMgZ3JvdXAgdGhhdCBoYXMgYSBjZXJ0YWluIHN0cmluZ2VudCBxdWFsaXR5LW9mLXNlcnZpY2UKKwkJCQlhZ3JlZW1lbnQgdGhhdCByZXF1aXJlcyBhIGZhc3QgU0lQIHNlcnZlci4gIFRoZSBjYXBhYmlsaXRpZXMgcmVxdWlyZWQKKwkJCQlvciByZWNvbW1lbmRlZCB0byBhIGdpdmVuIHVzZXIgYXJlIGNvbnZleWVkIGluIHRoZQorCQkJCVNJUC1TZXJ2ZXItQ2FwYWJpbGl0aWVzIEFWUC4gIFdoZW4gaXQgcmVjZWl2ZXMgdGhlbSwgdGhlIERpYW1ldGVyCisJCQkJY2xpZW50IChTSVAgc2VydmVyKSB0aGF0IGRvZXMgdGhlIFNJUCBzZXJ2ZXIgc2VsZWN0aW9uIG5lZWRzIHRvIGhhdmUKKwkJCQl0aGUgbWVhbnMgdG8gZmluZCBvdXQgYXZhaWxhYmxlIFNJUCBzZXJ2ZXJzIHRoYXQgbWVldCB0aGUgcmVxdWlyZWQgb3IKKwkJCQlvcHRpb25hbCBjYXBhYmlsaXRpZXMuICBTdWNoIG1lYW5zIGFyZSBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGlzCisJCQkJc3BlY2lmaWNhdGlvbi4KKworCQkJCU5vdGUgdGhhdCB0aGUgU0lQLVNlcnZlci1DYXBhYmlsaXRpZXMgQVZQIGFzc2lzdHMgdGhlIERpYW1ldGVyIGNsaWVudAorCQkJCShTSVAgc2VydmVyKSB0byBwcm9kdWNlIGEgc3Vic2V0IG9mIGFsbCB0aGUgYXZhaWxhYmxlIFNJUCBzZXJ2ZXJzIHRvCisJCQkJYmUgYWxsb2NhdGVkIHRvIHRoZSB1c2VyIGluIHRoZSBIb21lIFJlYWxtOyB0aGlzIGlzIHRoZSBzdWJzZXQgdGhhdAorCQkJCWNvbmZvcm1zIHRoZSByZXF1aXJlbWVudHMgb2YgY2FwYWJpbGl0aWVzIG9uIGEgcGVyLXVzZXIgYmFzaXMuCisJCQkJVHlwaWNhbGx5IHRoaXMgc3Vic2V0IHdpbGwgYmUgZm9ybWVkIG9mIG1vcmUgdGhhbiBhIHNpbmdsZSBTSVAKKwkJCQlzZXJ2ZXIsIHNvIG9uY2UgdGhlIHN1YnNldCBvZiB0aG9zZSBTSVAgc2VydmVycyBpcyBpZGVudGlmaWVkLCBpdCBpcworCQkJCXBvc3NpYmxlIHRoYXQgc2V2ZXJhbCBpbnN0YW5jZXMgb2YgdGhlc2UgU0lQIHNlcnZlcnMgZXhpc3QsIGluIHdoaWNoCisJCQkJY2FzZSB0aGUgRGlhbWV0ZXIgY2xpZW50IChTSVAgc2VydmVyKSBzaG91bGQgY2hvb3NlIG9uZSBwYXJ0aWN1bGFyCisJCQkJU0lQIHNlcnZlciB0byBleGVjdXRlIGFuZCB0cmlnZ2VyIHNlcnZpY2VzIHRvIHRoaXMgdXNlci4gIEl0IGlzCisJCQkJZXhwZWN0ZWQgdGhhdCBhdCB0aGlzIHBvaW50IHRoZSBTSVAgc2VydmVyIChEaWFtZXRlciBjbGllbnQpIHdpbGwKKwkJCQlmb2xsb3cgdGhlIHByb2NlZHVyZXMgb2YgUkZDIDMyNjMgW1JGQzMyNjNdIHRvIGFsbG9jYXRlIG9uZSBTSVAKKwkJCQlzZXJ2ZXIgdG8gdGhlIHVzZXIuCisKKwkJCQlUaGUgU0lQLVNlcnZlci1DYXBhYmlsaXRpZXMgQVZQIGlzIGRlZmluZWQgYXMgZm9sbG93cyAocGVyIHRoZQorCQkJCWdyb3VwZWQtYXZwLWRlZiBvZiBSRkMgMzU4OCBbUkZDMzU4OF0pOgorCisJCQkJU0lQLVNlcnZlci1DYXBhYmlsaXRpZXMgOjo9IDwgQVZQIEhlYWRlcjogMzcyID4KKwkJCQkJKiBbIFNJUC1NYW5kYXRvcnktQ2FwYWJpbGl0eSBdCisJCQkJCSogWyBTSVAtT3B0aW9uYWwtQ2FwYWJpbGl0eSBdCisJCQkJCSogWyBTSVAtU2VydmVyLVVSSSBdCisJCQkJCSogWyBBVlAgXQorCQorCQkJKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQkJCQkzNzIsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiU0lQLVNlcnZlci1DYXBhYmlsaXRpZXMiLCAJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9HUk9VUEVEIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0gCisJCQkJCQl7IAkgeyAgIlNJUC1NYW5kYXRvcnktQ2FwYWJpbGl0eSIsIAlSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQkJCQkJCSx7ICAiU0lQLU9wdGlvbmFsLUNhcGFiaWxpdHkiLAkJUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJCQkJCQkseyAgIlNJUC1TZXJ2ZXItVVJJIiwJCQlSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQkJCQkJfTsKKwkJCQorCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJCX0KKworCisJCS8qIFNJUC1TZXJ2ZXItQXNzaWdubWVudC1UeXBlICovCisJCXsKKwkJCS8qCisJCQkJVGhlIFNJUC1TZXJ2ZXItQXNzaWdubWVudC1UeXBlIEFWUCAoQVZQIENvZGUgMzc1KSBpcyBvZiB0eXBlCisJCQkJRW51bWVyYXRlZCBhbmQgaW5kaWNhdGVzIHRoZSB0eXBlIG9mIHNlcnZlciB1cGRhdGUgYmVpbmcgcGVyZm9ybWVkIGluCisJCQkJYSBEaWFtZXRlciBTZXJ2ZXItQXNzaWdubWVudC1SZXF1ZXN0IChTQVIpIG9wZXJhdGlvbi4gIFRoZSBmb2xsb3dpbmcKKwkJCQl2YWx1ZXMgYXJlIGRlZmluZWQ6CisKKworCQkJCW8gIE5PX0FTU0lHTk1FTlQgKDApCisJCQkJVGhlIERpYW1ldGVyIGNsaWVudCB1c2VzIHRoaXMgdmFsdWUgdG8gcmVxdWVzdCB0aGUgdXNlciBwcm9maWxlIG9mCisJCQkJYSBTSVAgQU9SLCB3aXRob3V0IGFmZmVjdGluZyB0aGUgcmVnaXN0cmF0aW9uIHN0YXRlIG9mIHRoYXQKKwkJCQlpZGVudGl0eS4KKworCQkJCW8gIFJFR0lTVFJBVElPTiAoMSkKKwkJCQlGaXJzdCBTSVAgcmVnaXN0cmF0aW9uIG9mIGEgU0lQIEFPUi4KKworCQkJCW8gIFJFX1JFR0lTVFJBVElPTiAoMikKKwkJCQlTdWJzZXF1ZW50IFNJUCByZWdpc3RyYXRpb24gb2YgYSBTSVAgQU9SLgorCisJCQkJbyAgVU5SRUdJU1RFUkVEX1VTRVIgKDMpCisJCQkJVGhlIFNJUCBzZXJ2ZXIgaGFzIHJlY2VpdmVkIGEgU0lQIHJlcXVlc3QgKGUuZy4sIFNJUCBJTlZJVEUpCisJCQkJYWRkcmVzc2VkIGZvciBhIFNJUCBBT1IgdGhhdCBpcyBub3QgcmVnaXN0ZXJlZC4KKworCQkJCW8gIFRJTUVPVVRfREVSRUdJU1RSQVRJT04gKDQpCisJCQkJVGhlIFNJUCByZWdpc3RyYXRpb24gdGltZXIgb2YgYW4gaWRlbnRpdHkgaGFzIGV4cGlyZWQuCisKKwkJCQlvICBVU0VSX0RFUkVHSVNUUkFUSU9OICg1KQorCQkJCVRoZSBTSVAgc2VydmVyIGhhcyByZWNlaXZlZCBhIHJlcXVlc3QgdG8gZGVyZWdpc3RlciBhIFNJUCBBT1IuCisKKwkJCQlvICBUSU1FT1VUX0RFUkVHSVNUUkFUSU9OX1NUT1JFX1NFUlZFUl9OQU1FICg2KQorCQkJCVRoZSBTSVAgcmVnaXN0cmF0aW9uIHRpbWVyIG9mIGFuIGlkZW50aXR5IGhhcyBleHBpcmVkLiAgVGhlIFNJUAorCQkJCXNlcnZlciBrZWVwcyB0aGUgdXNlciBkYXRhIHN0b3JlZCBhbmQgcmVxdWVzdHMgdGhlIERpYW1ldGVyIHNlcnZlcgorCQkJCXRvIHN0b3JlIHRoZSBTSVAgc2VydmVyIGFkZHJlc3MuCisKKwkJCQlvICBVU0VSX0RFUkVHSVNUUkFUSU9OX1NUT1JFX1NFUlZFUl9OQU1FICg3KQorCQkJCVRoZSBTSVAgc2VydmVyIGhhcyByZWNlaXZlZCBhIHVzZXItaW5pdGlhdGVkIGRlcmVnaXN0cmF0aW9uCisJCQkJcmVxdWVzdC4gIFRoZSBTSVAgc2VydmVyIGtlZXBzIHRoZSB1c2VyIGRhdGEgc3RvcmVkIGFuZCByZXF1ZXN0cworCQkJCXRoZSBEaWFtZXRlciBzZXJ2ZXIgdG8gc3RvcmUgdGhlIFNJUCBzZXJ2ZXIgYWRkcmVzcy4KKworCQkJCW8gIEFETUlOSVNUUkFUSVZFX0RFUkVHSVNUUkFUSU9OICg4KQorCQkJCVRoZSBTSVAgc2VydmVyLCBkdWUgdG8gYWRtaW5pc3RyYXRpdmUgcmVhc29ucywgaGFzIGRlcmVnaXN0ZXJlZCBhCisJCQkJU0lQIEFPUi4KKworCQkJCW8gIEFVVEhFTlRJQ0FUSU9OX0ZBSUxVUkUgKDkpCisJCQkJVGhlIGF1dGhlbnRpY2F0aW9uIG9mIGEgdXNlciBoYXMgZmFpbGVkLgorCisJCQkJbyAgQVVUSEVOVElDQVRJT05fVElNRU9VVCAoMTApCisJCQkJVGhlIGF1dGhlbnRpY2F0aW9uIHRpbWVyIGhhcyBleHBpcmVkLgorCisJCQkJbyAgREVSRUdJU1RSQVRJT05fVE9PX01VQ0hfREFUQSAoMTEpCisJCQkJVGhlIFNJUCBzZXJ2ZXIgaGFzIHJlcXVlc3RlZCB1c2VyIHByb2ZpbGUgaW5mb3JtYXRpb24gZnJvbSB0aGUKKwkJCQlEaWFtZXRlciBzZXJ2ZXIgYW5kIGhhcyByZWNlaXZlZCBhIHZvbHVtZSBvZiBkYXRhIGhpZ2hlciB0aGFuIGl0CisJCQkJY2FuIGFjY2VwdC4KKworCQkJKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAJKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgCSB0ZGF0YSA9IHsgQVZQX1RZUEVfVU5TSUdORUQzMiwJIkVudW1lcmF0ZWQoU0lQLVNlcnZlci1Bc3NpZ25tZW50LVR5cGUpIgksIE5VTEwsIE5VTEx9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIHR2YWxzW10gPSB7CisJCQkJZW51bXZhbF9kZWZfdTMyKCAwLCAiTk9fQVNTSUdOTUVOVCIpLAorCQkJCWVudW12YWxfZGVmX3UzMiggMSwgIlJFR0lTVFJBVElPTiIpLAorCQkJCWVudW12YWxfZGVmX3UzMiggMiwgIlJFX1JFR0lTVFJBVElPTiIpLAorCQkJCWVudW12YWxfZGVmX3UzMiggMywgIlVOUkVHSVNURVJFRF9VU0VSIiksCisJCQkJZW51bXZhbF9kZWZfdTMyKCA0LCAiVElNRU9VVF9ERVJFR0lTVFJBVElPTiIpLAorCQkJCWVudW12YWxfZGVmX3UzMiggNSwgIlVTRVJfREVSRUdJU1RSQVRJT04iKSwKKwkJCQllbnVtdmFsX2RlZl91MzIoIDYsICJUSU1FT1VUX0RFUkVHSVNUUkFUSU9OX1NUT1JFX1NFUlZFUl9OQU1FIiksCisJCQkJZW51bXZhbF9kZWZfdTMyKCA3LCAiVVNFUl9ERVJFR0lTVFJBVElPTl9TVE9SRV9TRVJWRVJfTkFNRSIpLAorCQkJCWVudW12YWxfZGVmX3UzMiggOCwgIkFETUlOSVNUUkFUSVZFX0RFUkVHSVNUUkFUSU9OIiksCisJCQkJZW51bXZhbF9kZWZfdTMyKCA5LCAiQVVUSEVOVElDQVRJT05fRkFJTFVSRSIpLAorCQkJCWVudW12YWxfZGVmX3UzMiggMTAsICJBVVRIRU5USUNBVElPTl9USU1FT1VUIiksCisJCQkJZW51bXZhbF9kZWZfdTMyKCAxMSwgIkRFUkVHSVNUUkFUSU9OX1RPT19NVUNIX0RBVEEiKQorCQkJfTsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQkJCQkzNzUsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiU0lQLVNlcnZlci1Bc3NpZ25tZW50LVR5cGUiLCAJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9VTlNJR05FRDMyIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJaW50IGk7CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgZW51bWVyYXRlZCB2YWx1ZXMsIGFuZCB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEgLCBOVUxMLCAmdHlwZSk7CisJCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHR2YWxzKSAvIHNpemVvZih0dmFsc1swXSk7IGkrKykgeworCQkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0dmFsc1tpXSwgdHlwZSwgTlVMTCk7CisJCQl9CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgdHlwZSwgTlVMTCk7CisJCX0KKwkJCisKKwkJLyogU0lQLUF1dGhlbnRpY2F0ZSAqLworCQl7CisJCQkvKgorCQkJCVRoZSBTSVAtQXV0aGVudGljYXRlIEFWUCAoQVZQIENvZGUgMzc5KSBpcyBvZiB0eXBlIEdyb3VwZWQgYW5kCisJCQkJY29udGFpbnMgYSByZWNvbnN0cnVjdGlvbiBvZiBlaXRoZXIgdGhlIFNJUCBXV1ctQXV0aGVudGljYXRlIG9yCisJCQkJUHJveHktQXV0aGVudGljYXRpb24gaGVhZGVyIGZpZWxkcyBzcGVjaWZpZWQgaW4gUkZDIDI2MTcgW1JGQzI2MTddCisJCQkJZm9yIHRoZSBIVFRQIERpZ2VzdCBhdXRoZW50aWNhdGlvbiBzY2hlbWUuICBBZGRpdGlvbmFsbHksIHRoZSBBVlAgbWF5CisJCQkJaW5jbHVkZSBhIERpZ2VzdC1IQTEgQVZQIHRoYXQgY29udGFpbnMgSChBMSkgKGFzIGRlZmluZWQgaW4gUkZDIDI2MTcKKwkJCQlbUkZDMjYxN10pLiAgSChBMSkgYWxsb3dzIHRoZSBEaWFtZXRlciBjbGllbnQgdG8gY3JlYXRlIGFuIGV4cGVjdGVkCisJCQkJcmVzcG9uc2UgYW5kIGNvbXBhcmUgaXQgd2l0aCB0aGUgRGlnZXN0IHJlc3BvbnNlIHJlY2VpdmVkIGZyb20gdGhlCisJCQkJU0lQIFVBLgorCQkJCVRoZSBTSVAtQXV0aGVudGljYXRlIEFWUCBpcyBkZWZpbmVkIGFzIGZvbGxvd3MgKHBlciB0aGUKKwkJCQlncm91cGVkLWF2cC1kZWYgb2YgUkZDIDM1ODggW1JGQzM1ODhdKToKKworCQkJCVNJUC1BdXRoZW50aWNhdGUgOjo9IDwgQVZQIEhlYWRlcjogMzc5ID4KKwkJCQkJCSAgIHsgRGlnZXN0LVJlYWxtIH0KKwkJCQkJCSAgIHsgRGlnZXN0LU5vbmNlIH0KKwkJCQkJCSAgIFsgRGlnZXN0LURvbWFpbiBdCisJCQkJCQkgICBbIERpZ2VzdC1PcGFxdWUgXQorCQkJCQkJICAgWyBEaWdlc3QtU3RhbGUgXQorCQkJCQkJICAgWyBEaWdlc3QtQWxnb3JpdGhtIF0KKwkJCQkJCSAgIFsgRGlnZXN0LVFvUCBdCisJCQkJCQkgICBbIERpZ2VzdC1IQTFdCisJCQkJCQkgKiBbIERpZ2VzdC1BdXRoLVBhcmFtIF0KKwkJCQkJCSAqIFsgQVZQIF0KKworCisJCQkqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTM3OSwgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJTSVAtQXV0aGVudGljYXRlIiwgCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCSAJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfR1JPVVBFRCAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCQkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9IAorCQkJCQkJeyAJIHsgICJEaWdlc3QtUmVhbG0iLCAJCVJVTEVfUkVRVUlSRUQsIC0xLCAxIH0KKwkJCQkJCQkseyAgIkRpZ2VzdC1Ob25jZSIsCQlSVUxFX1JFUVVJUkVELCAtMSwgMSB9CisJCQkJCQkJLHsgICJEaWdlc3QtRG9tYWluIiwJCVJVTEVfT1BUSU9OQUwsIC0xLCAxIH0KKwkJCQkJCQkseyAgIkRpZ2VzdC1PcGFxdWUiLAkJUlVMRV9PUFRJT05BTCwgLTEsIDEgfQorCQkJCQkJCSx7ICAiRGlnZXN0LVN0YWxlIiwJCVJVTEVfT1BUSU9OQUwsIC0xLCAxIH0KKwkJCQkJCQkseyAgIkRpZ2VzdC1BbGdvcml0aG0iLAkJUlVMRV9PUFRJT05BTCwgLTEsIDEgfQorCQkJCQkJCSx7ICAiRGlnZXN0LVFvUCIsCQlSVUxFX09QVElPTkFMLCAtMSwgMSB9CisJCQkJCQkJLHsgICJEaWdlc3QtSEExIiwJCVJVTEVfT1BUSU9OQUwsIC0xLCAxIH0KKwkJCQkJCQkseyAgIkRpZ2VzdC1BdXRoLVBhcmFtIiwJUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKworCQkJCQkJfTsKKwkJCQorCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJCX0KKwkJLyogU0lQLUF1dGhvcml6YXRpb24gKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgU0lQLUF1dGhvcml6YXRpb24gQVZQIChBVlAgQ29kZSAzODApIGlzIG9mIHR5cGUgR3JvdXBlZCBhbmQKKwkJCQljb250YWlucyBhIHJlY29uc3RydWN0aW9uIG9mIGVpdGhlciB0aGUgU0lQIEF1dGhvcml6YXRpb24gb3IKKwkJCQlQcm94eS1BdXRob3JpemF0aW9uIGhlYWRlciBmaWVsZHMgc3BlY2lmaWVkIGluIFJGQyAyNjE3IFtSRkMyNjE3XSBmb3IKKwkJCQl0aGUgSFRUUCBEaWdlc3QgYXV0aGVudGljYXRpb24gc2NoZW1lLgorCisJCQkJVGhlIFNJUC1BdXRob3JpemF0aW9uIEFWUCBpcyBkZWZpbmVkIGFzIGZvbGxvd3MgKHBlciB0aGUKKwkJCQlncm91cGVkLWF2cC1kZWYgb2YgUkZDIDM1ODggW1JGQzM1ODhdKToKKworCQkJCVNJUC1BdXRob3JpemF0aW9uIDo6PSA8IEFWUCBIZWFkZXI6IDM4MCA+CisJCQkJCQkgICAgeyBEaWdlc3QtVXNlcm5hbWUgfQorCQkJCQkJICAgIHsgRGlnZXN0LVJlYWxtIH0KKwkJCQkJCSAgICB7IERpZ2VzdC1Ob25jZSB9CisJCQkJCQkgICAgeyBEaWdlc3QtVVJJIH0KKwkJCQkJCSAgICB7IERpZ2VzdC1SZXNwb25zZSB9CisJCQkJCQkgICAgWyBEaWdlc3QtQWxnb3JpdGhtIF0KKwkJCQkJCSAgICBbIERpZ2VzdC1DTm9uY2UgXQorCQkJCQkJICAgIFsgRGlnZXN0LU9wYXF1ZSBdCisJCQkJCQkgICAgWyBEaWdlc3QtUW9QIF0KKwkJCQkJCSAgICBbIERpZ2VzdC1Ob25jZS1Db3VudCBdCisJCQkJCQkgICAgWyBEaWdlc3QtTWV0aG9kXQorCQkJCQkJICAgIFsgRGlnZXN0LUVudGl0eS1Cb2R5LUhhc2ggXQorCQkJCQkJICAqIFsgRGlnZXN0LUF1dGgtUGFyYW0gXQorCQkJCQkJICAqIFsgQVZQIF0KKworCQkJKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQkJCQkzODAsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiU0lQLUF1dGhvcml6YXRpb24iLCAJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9HUk9VUEVEIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0gCisJCQkJCQl7IAkgeyAgIkRpZ2VzdC1Vc2VybmFtZSIsIAkJUlVMRV9SRVFVSVJFRCwgLTEsIDEgfQorCQkJCQkJCSx7ICAiRGlnZXN0LVJlYWxtIiwJCVJVTEVfUkVRVUlSRUQsIC0xLCAxIH0KKwkJCQkJCQkseyAgIkRpZ2VzdC1Ob25jZSIsCQlSVUxFX1JFUVVJUkVELCAtMSwgMSB9CisJCQkJCQkJLHsgICJEaWdlc3QtVVJJIiwJCVJVTEVfUkVRVUlSRUQsIC0xLCAxIH0KKwkJCQkJCQkseyAgIkRpZ2VzdC1SZXNwb25zZSIsCQlSVUxFX1JFUVVJUkVELCAtMSwgMSB9CisJCQkJCQkJLHsgICJEaWdlc3QtQWxnb3JpdGhtIiwJCVJVTEVfT1BUSU9OQUwsIC0xLCAxIH0KKwkJCQkJCQkseyAgIkRpZ2VzdC1DTm9uY2UiLAkJUlVMRV9PUFRJT05BTCwgLTEsIDEgfQorCQkJCQkJCSx7ICAiRGlnZXN0LU9wYXF1ZSIsCQlSVUxFX09QVElPTkFMLCAtMSwgMSB9CisJCQkJCQkJLHsgICJEaWdlc3QtUW9QIiwJCVJVTEVfT1BUSU9OQUwsIC0xLCAxIH0KKwkJCQkJCQkseyAgIkRpZ2VzdC1Ob25jZS1Db3VudCIsCVJVTEVfT1BUSU9OQUwsIC0xLCAxIH0KKwkJCQkJCQkseyAgIkRpZ2VzdC1NZXRob2QiLAkJUlVMRV9PUFRJT05BTCwgLTEsIDEgfQorCQkJCQkJCSx7ICAiRGlnZXN0LUVudGl0eS1Cb2R5LUhhc2giLAlSVUxFX09QVElPTkFMLCAtMSwgMSB9CisJCQkJCQkJLHsgICJEaWdlc3QtQXV0aC1QYXJhbSIsCVJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCQkJCQl9OworCQkJCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkJfQorCQkvKiBTSVAtQXV0aGVudGljYXRpb24tSW5mbyAqLworCQl7CisJCQkvKgorCQkJCVRoZSBTSVAtQXV0aGVudGljYXRpb24tSW5mbyBBVlAgKEFWUCBDb2RlIDM4MSkgaXMgb2YgdHlwZSBHcm91cGVkIGFuZAorCQkJCWNvbnRhaW5zIGEgcmVjb25zdHJ1Y3Rpb24gb2YgdGhlIFNJUCBBdXRoZW50aWNhdGlvbi1JbmZvIGhlYWRlcgorCQkJCXNwZWNpZmllZCBpbiBSRkMgMjYxNyBbUkZDMjYxN10gZm9yIHRoZSBIVFRQIERpZ2VzdCBhdXRoZW50aWNhdGlvbgorCQkJCXNjaGVtZS4KKwkJCQlUaGUgU0lQLUF1dGhlbnRpY2F0aW9uLUluZm8gQVZQIGlzIGRlZmluZWQgYXMgZm9sbG93cyAocGVyIHRoZQorCQkJCWdyb3VwZWQtYXZwLWRlZiBvZiBSRkMgMzU4OCBbUkZDMzU4OF0pOgorCisJCQkJU0lQLUF1dGhlbnRpY2F0aW9uLUluZm8gOjo9IDwgQVZQIEhlYWRlcjogMzgxID4KKwkJCQkJCQkgIFsgRGlnZXN0LU5leHRub25jZSBdCisJCQkJCQkJICBbIERpZ2VzdC1Rb1AgXQorCQkJCQkJCSAgWyBEaWdlc3QtUmVzcG9uc2UtQXV0aCBdCisJCQkJCQkJICBbIERpZ2VzdC1DTm9uY2UgXQorCQkJCQkJCSAgWyBEaWdlc3QtTm9uY2UtQ291bnQgXQorCQkJCQkJCSogWyBBVlAgXQorCisJCQkJTm90ZSB0aGF0LCBpbiBzb21lIGNhc2VzLCB0aGUgRGlnZXN0LVJlc3BvbnNlLUF1dGggQVZQIGNhbm5vdCBiZQorCQkJCWNhbGN1bGF0ZWQgYXQgdGhlIERpYW1ldGVyIHNlcnZlciwgYnV0IGhhcyB0byBiZSBjYWxjdWxhdGVkIGF0IHRoZQorCQkJCURpYW1ldGVyIGNsaWVudCAoU0lQIHNlcnZlcikuICBGb3IgZXhhbXBsZSwgaWYgdGhlIHZhbHVlIG9mIHRoZQorCQkJCXF1YWxpdHkgb2YgcHJvdGVjdGlvbiAocW9wKSBwYXJhbWV0ZXIgaW4gRGlnZXN0IGlzIHNldCB0byAiYXV0aC1pbnQiLAorCQkJCXRoZW4gdGhlIHJlc3BvbnNlLWRpZ2VzdCAocnNwYXV0aCBwYXJhbWV0ZXIgdmFsdWUgaW4gRGlnZXN0KSBpcworCQkJCWNhbGN1bGF0ZWQgd2l0aCB0aGUgaGFzaCBvZiB0aGUgYm9keSBvZiB0aGUgU0lQIHJlc3BvbnNlLCB3aGljaCBpcworCQkJCW5vdCBhdmFpbGFibGUgYXQgdGhlIERpYW1ldGVyIHNlcnZlci4gIEluIHRoaXMgY2FzZSwgdGhlIERpYW1ldGVyCisJCQkJY2xpZW50IChTSVAgc2VydmVyKSBtdXN0IGNhbGN1bGF0ZSB0aGUgcmVzcG9uc2UtZGlnZXN0IG9uY2UgdGhlIGJvZHkKKwkJCQlvZiB0aGUgU0lQIHJlc3BvbnNlIGlzIGNhbGN1bGF0ZWQuCisKKwkJCQlUaGVyZWZvcmUsIGEgdmFsdWUgb2YgImF1dGgtaW50IiBpbiB0aGUgRGlnZXN0LVFvUCBBVlAgb2YgdGhlCisJCQkJU0lQLUF1dGhlbnRpY2F0aW9uLUluZm8gQVZQIGluZGljYXRlcyB0aGF0IHRoZSBEaWFtZXRlciBjbGllbnQgKFNJUAorCQkJCXNlcnZlcikgTVVTVCBjb21wdXRlIHRoZSBEaWdlc3QgInJzcGF1dGgiIHBhcmFtZXRlciB2YWx1ZSBhdCB0aGUKKwkJCQlEaWFtZXRlciBjbGllbnQgKFNJUCBzZXJ2ZXIpLgorCisJCQkqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTM4MSwgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJTSVAtQXV0aGVudGljYXRpb24tSW5mbyIsIAkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX0dST1VQRUQgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPSAKKwkJCQkJCXsgCSB7ICAiRGlnZXN0LU5leHRub25jZSIsIAlSVUxFX09QVElPTkFMLCAtMSwgMSB9CisJCQkJCQkJLHsgICJEaWdlc3QtUW9QIiwJCVJVTEVfT1BUSU9OQUwsIC0xLCAxIH0KKwkJCQkJCQkseyAgIkRpZ2VzdC1SZXNwb25zZS1BdXRoIiwJUlVMRV9PUFRJT05BTCwgLTEsIDEgfQorCQkJCQkJCSx7ICAiRGlnZXN0LUNOb25jZSIsCQlSVUxFX09QVElPTkFMLCAtMSwgMSB9CisJCQkJCQkJLHsgICJEaWdlc3QtTm9uY2UtQ291bnQiLAlSVUxFX09QVElPTkFMLCAtMSwgMSB9CisJCQkJCQl9OworCQkJCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkJfQorCQkvKiBTSVAtQXV0aGVudGljYXRpb24tU2NoZW1lICovCisJCXsKKwkJCS8qCisJCQkJVGhlIFNJUC1BdXRoZW50aWNhdGlvbi1TY2hlbWUgQVZQIChBVlAgQ29kZSAzNzcpIGlzIG9mIHR5cGUKKwkJCQlFbnVtZXJhdGVkIGFuZCBpbmRpY2F0ZXMgdGhlIGF1dGhlbnRpY2F0aW9uIHNjaGVtZSB1c2VkIGluIHRoZQorCQkJCWF1dGhlbnRpY2F0aW9uIG9mIFNJUCBzZXJ2aWNlcy4gIFJGQyAyNjE3IGlkZW50aWZpZXMgdGhpcyB2YWx1ZSBhcyBhbgorCQkJCSJhdXRoLXNjaGVtZSIgKHNlZSBTZWN0aW9uIDEuMiBvZiBSRkMgMjYxNyBbUkZDMjYxN10pLiAgVGhlIG9ubHkKKwkJCQljdXJyZW50bHkgZGVmaW5lZCB2YWx1ZSBpczoKKworCQkJCW8gIERJR0VTVCAoMCkgdG8gaW5kaWNhdGUgSFRUUCBEaWdlc3QgYXV0aGVudGljYXRpb24gYXMgc3BlY2lmaWVkIGluCisJCQkJUkZDIDI2MTcgW1JGQzI2MTddIFNlY3Rpb24gMy4yLjEuICBEZXJpdmF0aXZlIHdvcmsgaXMgYWxzbworCQkJCWNvbnNpZGVyZWQgRGlnZXN0IGF1dGhlbnRpY2F0aW9uIHNjaGVtZSwgYXMgbG9uZyBhcyB0aGUKKwkJCQkiYXV0aC1zY2hlbWUiIGlzIGlkZW50aWZpZWQgYXMgRGlnZXN0IGluIHRoZSBTSVAgaGVhZGVycyBjYXJyeWluZworCQkJCXRoZSBIVFRQIGF1dGhlbnRpY2F0aW9uLiAgVGhpcyBpbmNsdWRlcywgZS5nLiwgdGhlIEhUVFAgRGlnZXN0CisJCQkJYXV0aGVudGljYXRpb24gdXNpbmcgQUtBIFtSRkMzMzEwXS4KKworCQkJCUVhY2ggSFRUUCBEaWdlc3QgZGlyZWN0aXZlIChwYXJhbWV0ZXIpIGlzIHRyYW5zcG9ydGVkIGluIGEKKwkJCQljb3JyZXNwb25kaW5nIEFWUCwgd2hvc2UgbmFtZSBmb2xsb3dzIHRoZSBwYXR0ZXJuIERpZ2VzdC0qLiAgVGhlCisJCQkJRGlnZXN0LSogQVZQcyBhcmUgUkFESVVTIGF0dHJpYnV0ZXMgaW1wb3J0ZWQgZnJvbSB0aGUgUkFESVVTCisJCQkJRXh0ZW5zaW9uIGZvciBEaWdlc3QgQXV0aGVudGljYXRpb24gW1JGQzQ1OTBdIG5hbWVzcGFjZSwgYWxsb3dpbmcgYQorCQkJCXNtb290aCB0cmFuc2l0aW9uIGJldHdlZW4gUkFESVVTIGFuZCBEaWFtZXRlciBhcHBsaWNhdGlvbnMgc3VwcG9ydGluZworCQkJCVNJUC4gIFRoZSBEaWFtZXRlciBTSVAgYXBwbGljYXRpb24gZ29lcyBhIHN0ZXAgZnVydGhlciBieSBncm91cGluZworCQkJCXRoZSBEaWdlc3QtKiBBVlBzIGludG8gdGhlIFNJUC1BdXRoZW50aWNhdGUsIFNJUC1BdXRob3JpemF0aW9uLCBhbmQKKwkJCQlTSVAtQXV0aGVudGljYXRpb24tSW5mbyBncm91cGVkIEFWUHMgdGhhdCBjb3JyZXNwb25kIHRvIHRoZSBTSVAgV1dXLQorCQkJCUF1dGhlbnRpY2F0ZS9Qcm94eS1BdXRoZW50aWNhdGlvbiwgQXV0aG9yaXphdGlvbi9Qcm94eS1BdXRob3JpemF0aW9uLAorCQkJCWFuZCBBdXRoZW50aWNhdGlvbi1JbmZvIGhlYWRlcnMgZmllbGRzLCByZXNwZWN0aXZlbHkuCisKKwkJCQlOb3RlOiBEdWUgdG8gdGhlIGZhY3QgdGhhdCBIVFRQIERpZ2VzdCBhdXRoZW50aWNhdGlvbiBbUkZDMjYxN10gaXMKKwkJCQl0aGUgb25seSBtYW5kYXRvcnkgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtIGluIFNJUCwgdGhpcyBtZW1vIG9ubHkKKwkJCQlwcm92aWRlcyBzdXBwb3J0IGZvciBIVFRQIERpZ2VzdCBhdXRoZW50aWNhdGlvbiBhbmQgZGVyaXZhdGl2ZQorCQkJCXdvcmsgc3VjaCBhcyBIVFRQIERpZ2VzdCBhdXRoZW50aWNhdGlvbiB1c2luZyBBS0EgW1JGQzMzMTBdLgorCQkJCUV4dGVuc2lvbnMgdG8gdGhpcyBtZW1vIGNhbiByZWdpc3RlciBuZXcgdmFsdWVzIGFuZCBuZXcgQVZQcyB0bworCQkJCXByb3ZpZGUgc3VwcG9ydCBmb3Igb3RoZXIgYXV0aGVudGljYXRpb24gc2NoZW1lcyBvciBleHRlbnNpb25zIHRvCisJCQkJSFRUUCBEaWdlc3QgYXV0aGVudGljYXRpb24uCisKKwkJCQlOb3RlOiBBbHRob3VnaCBSRkMgMjYxNyBbUkZDMjYxN10gZGVmaW5lcyB0aGUgQmFzaWMgYW5kIERpZ2VzdAorCQkJCXNjaGVtZXMgZm9yIGF1dGhlbnRpY2F0aW5nIEhUVFAgcmVxdWVzdHMsIFJGQyAzMjYxIFtSRkMzMjYxXSBvbmx5CisJCQkJaW1wb3J0cyBIVFRQIERpZ2VzdCBhcyBhIG1lY2hhbmlzbSB0byBwcm92aWRlIGF1dGhlbnRpY2F0aW9uIGluCisJCQkJU0lQLgorCisJCQkJRHVlIHRvIHN5bnRhY3RpYyByZXF1aXJlbWVudHMsIEhUVFAgRGlnZXN0IGF1dGhlbnRpY2F0aW9uIGhhcyB0bworCQkJCWVzY2FwZSBxdW90ZSBjaGFyYWN0ZXJzIGluIGNvbnRlbnRzIG9mIEhUVFAgRGlnZXN0IGRpcmVjdGl2ZXMuICBXaGVuCisJCQkJdHJhbnNsYXRpbmcgZGlyZWN0aXZlcyBpbnRvIERpZ2VzdC0qIEFWUHMsIHRoZSBEaWFtZXRlciBjbGllbnQgb3IKKwkJCQlzZXJ2ZXIgcmVtb3ZlcyB0aGUgc3Vycm91bmRpbmcgcXVvdGVzIHdoZXJlIHByZXNlbnQsIGFzIHJlcXVpcmVkIGJ5CisJCQkJdGhlIHN5bnRheCBvZiB0aGUgRGlnZXN0LSogYXR0cmlidXRlcyBkZWZpbmVkIGluIHRoZSAiUkFESVVTCisJCQkJRXh0ZW5zaW9uIGZvciBEaWdlc3QgQXV0aGVudGljYXRpb24iIFtSRkM0NTkwXS4KKworCQkJKi8KKworCQkJc3RydWN0IGRpY3Rfb2JqZWN0IAkqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAJIHRkYXRhID0geyBBVlBfVFlQRV9VTlNJR05FRDMyLAkiRW51bWVyYXRlZChTSVAtQXV0aGVudGljYXRpb24tU2NoZW1lKSIJLCBOVUxMLCBOVUxMfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSB0dmFsc1tdID0geworCQkJCWVudW12YWxfZGVmX3UzMiggMCwgIkRJR0VTVCIpCisJCQl9OworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTM3NywgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJTSVAtQXV0aGVudGljYXRpb24tU2NoZW1lIiwgCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCSAJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfVU5TSUdORUQzMiAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCWludCBpOworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGVudW1lcmF0ZWQgdmFsdWVzLCBhbmQgdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhICwgTlVMTCwgJnR5cGUpOworCQkJZm9yIChpID0gMDsgaSA8IHNpemVvZih0dmFscykgLyBzaXplb2YodHZhbHNbMF0pOyBpKyspIHsKKwkJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdHZhbHNbaV0sIHR5cGUsIE5VTEwpOworCQkJfQorCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIHR5cGUsIE5VTEwpOworCQl9CisJCS8qIFNJUC1JdGVtLU51bWJlciAqLworCQl7CisJCQkvKgorCQkJCVRoZSBTSVAtSXRlbS1OdW1iZXIgKEFWUCBDb2RlIDM3OCkgaXMgb2YgdHlwZSBVbnNpZ25lZDMyIGFuZCBpcworCQkJCWluY2x1ZGVkIGluIGEgU0lQLUF1dGgtRGF0YS1JdGVtIGdyb3VwZWQgQVZQIGluIGNpcmN1bXN0YW5jZXMgd2hlcmUKKwkJCQl0aGVyZSBhcmUgbXVsdGlwbGUgb2NjdXJyZW5jZXMgb2YgU0lQLUF1dGgtRGF0YS1JdGVtIEFWUHMgYW5kIHRoZQorCQkJCW9yZGVyIG9mIHByb2Nlc3NpbmcgaXMgcmVsZXZhbnQuICBUaGUgQVZQIGluZGljYXRlcyB0aGUgb3JkZXIgaW4KKwkJCQl3aGljaCB0aGUgR3JvdXBlZCBTSVAtQXV0aC1EYXRhLUl0ZW0gc2hvdWxkIGJlIHByb2Nlc3NlZC4gIExvd2VyCisJCQkJdmFsdWVzIG9mIHRoZSBTSVAtSXRlbS1OdW1iZXIgQVZQIGluZGljYXRlIHRoYXQgdGhlIHdob2xlCisJCQkJU0lQLUF1dGgtRGF0YS1JdGVtIFNIT1VMRCBiZSBwcm9jZXNzZWQgYmVmb3JlIG90aGVyCisJCQkJU0lQLUF1dGgtRGF0YS1JdGVtIEFWUHMgdGhhdCBjb250YWluIGhpZ2hlciB2YWx1ZXMgaW4gdGhlCisJCQkJU0lQLUl0ZW0tTnVtYmVyIEFWUC4KKworCQkJKi8KKworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTM3OCwgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJTSVAtSXRlbS1OdW1iZXIiLCAJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9VTlNJR05FRDMyIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgTlVMTCk7CisJCX0KKwkJLyogU0lQLUF1dGgtRGF0YS1JdGVtICovCisJCXsKKwkJCS8qCisJCQkJVGhlIFNJUC1BdXRoLURhdGEtSXRlbSAoQVZQIENvZGUgMzc2KSBpcyBvZiB0eXBlIEdyb3VwZWQgYW5kIGNvbnRhaW5zCisJCQkJdGhlIGF1dGhlbnRpY2F0aW9uIGFuZC9vciBhdXRob3JpemF0aW9uIGluZm9ybWF0aW9uIHBlcnRhaW5pbmcgdG8gYQorCQkJCXVzZXIuCisKKwkJCQlXaGVuIHRoZSBEaWFtZXRlciBzZXJ2ZXIgdXNlcyB0aGUgZ3JvdXBlZCBTSVAtQXV0aC1EYXRhLUl0ZW0gQVZQIHRvCisJCQkJaW5jbHVkZSBhIFNJUC1BdXRoZW50aWNhdGUgQVZQLCB0aGUgRGlhbWV0ZXIgc2VydmVyIE1VU1Qgc2VuZCBhCisJCQkJbWF4aW11bSBvZiBvbmUgYXV0aGVudGljYXRpb24gZGF0YSBpdGVtIChlLmcuLCBpbiBjYXNlIHRoZSBTSVAKKwkJCQlyZXF1ZXN0IGNvbnRhaW5lZCBzZXZlcmFsIGNyZWRlbnRpYWxzKS4gIFNlY3Rpb24gMTEgY29udGFpbnMgYQorCQkJCWRldGFpbGVkIGRpc2N1c3Npb24gYW5kIG5vcm1hdGl2ZSB0ZXh0IG9mIHRoZSBjYXNlIHdoZW4gYSBTSVAgcmVxdWVzdAorCQkJCWNvbnRhaW5zIHNldmVyYWwgY3JlZGVudGlhbHMuCisKKwkJCQlUaGUgU0lQLUF1dGgtRGF0YS1JdGVtIEFWUCBpcyBkZWZpbmVkIGFzIGZvbGxvd3MgKHBlciB0aGUKKwkJCQlncm91cGVkLWF2cC1kZWYgb2YgUkZDIDM1ODggW1JGQzM1ODhdKToKKworCQkJCVNJUC1BdXRoLURhdGEtSXRlbSA6Oj0gPCBBVlAgSGVhZGVyOiAzNzYgPgorCQkJCXsgU0lQLUF1dGhlbnRpY2F0aW9uLVNjaGVtZSB9CisJCQkJCVsgU0lQLUl0ZW0tTnVtYmVyIF0KKwkJCQkJWyBTSVAtQXV0aGVudGljYXRlIF0KKwkJCQkJWyBTSVAtQXV0aG9yaXphdGlvbiBdCisJCQkJCVsgU0lQLUF1dGhlbnRpY2F0aW9uLUluZm8gXQorCQkJCQkqIFsgQVZQIF0KKworCisJCQkqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTM3NiwgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJTSVAtQXV0aC1EYXRhLUl0ZW0iLCAJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9HUk9VUEVEIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0gCisJCQkJCQl7IAkgeyAgIlNJUC1BdXRoZW50aWNhdGlvbi1TY2hlbWUiLFJVTEVfUkVRVUlSRUQsIC0xLCAxIH0KKwkJCQkJCQkseyAgIlNJUC1JdGVtLU51bWJlciIsIAkJUlVMRV9PUFRJT05BTCwgLTEsIDEgfQorCQkJCQkJCSx7ICAiU0lQLUF1dGhlbnRpY2F0ZSIsCQlSVUxFX09QVElPTkFMLCAtMSwgMSB9CisJCQkJCQkJLHsgICJTSVAtQXV0aG9yaXphdGlvbiIsCVJVTEVfT1BUSU9OQUwsIC0xLCAxIH0KKwkJCQkJCQkseyAgIlNJUC1BdXRoZW50aWNhdGlvbi1JbmZvIiwJUlVMRV9PUFRJT05BTCwgLTEsIDEgfQorCQkJCQkJfTsKKwkJCQorCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJCX0KKwkJLyogU0lQLU51bWJlci1BdXRoLUl0ZW1zICovCisJCXsKKwkJCS8qCisJCQkJVGhlIFNJUC1OdW1iZXItQXV0aC1JdGVtcyBBVlAgKEFWUCBDb2RlIDM4MikgaXMgb2YgdHlwZSBVbnNpZ25lZDMyCisJCQkJYW5kIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGF1dGhlbnRpY2F0aW9uIGFuZC9vciBhdXRob3JpemF0aW9uCisJCQkJY3JlZGVudGlhbHMgdGhhdCB0aGUgRGlhbWV0ZXIgc2VydmVyIGluY2x1ZGVkIGluIGEgRGlhbWV0ZXIgbWVzc2FnZS4KKworCQkJCVdoZW4gdGhlIEFWUCBpcyBwcmVzZW50IGluIGEgcmVxdWVzdCwgaXQgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YKKwkJCQlTSVAtQXV0aC1EYXRhLUl0ZW1zIHRoZSBEaWFtZXRlciBjbGllbnQgaXMgcmVxdWVzdGluZy4gIFRoaXMgY2FuIGJlCisJCQkJdXNlZCwgZm9yIGluc3RhbmNlLCB3aGVuIHRoZSBTSVAgc2VydmVyIGlzIHJlcXVlc3Rpbmcgc2V2ZXJhbAorCQkJCXByZS1jYWxjdWxhdGVkIGF1dGhlbnRpY2F0aW9uIGNyZWRlbnRpYWxzLiAgSW4gdGhlIGFuc3dlciBtZXNzYWdlLAorCQkJCXRoZSBTSVAtTnVtYmVyLUF1dGgtSXRlbXMgQVZQIGluZGljYXRlcyB0aGUgYWN0dWFsIG51bWJlciBvZiBpdGVtcworCQkJCXRoYXQgdGhlIERpYW1ldGVyIHNlcnZlciBpbmNsdWRlZC4KKworCQkJKi8KKworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTM4MiwgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJTSVAtTnVtYmVyLUF1dGgtSXRlbXMiLCAJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9VTlNJR05FRDMyIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgTlVMTCk7CisJCX0KKworCQkvKiBTSVAtUmVhc29uLUNvZGUgKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgU0lQLVJlYXNvbi1Db2RlIEFWUCAoQVZQIENvZGUgMzg0KSBpcyBvZiB0eXBlIEVudW1lcmF0ZWQgYW5kCisJCQkJZGVmaW5lcyB0aGUgcmVhc29uIGZvciB0aGUgbmV0d29yayBpbml0aWF0ZWQgZGVyZWdpc3RyYXRpb24uICBUaGUKKwkJCQlmb2xsb3dpbmcgdmFsdWVzIGFyZSBkZWZpbmVkOgorCisJCQkJbyAgUEVSTUFORU5UX1RFUk1JTkFUSU9OICgwKQorCQkJCW8gIE5FV19TSVBfU0VSVkVSX0FTU0lHTkVEICgxKQorCQkJCW8gIFNJUF9TRVJWRVJfQ0hBTkdFICgyKQorCQkJCW8gIFJFTU9WRV9TSVBfU0VSVkVSICgzKQorCQkJKi8KKworCQkJc3RydWN0IGRpY3Rfb2JqZWN0IAkqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAJIHRkYXRhID0geyBBVlBfVFlQRV9VTlNJR05FRDMyLAkiRW51bWVyYXRlZChTSVAtUmVhc29uLUNvZGUpIgksIE5VTEwsIE5VTEx9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIHR2YWxzW10gPSB7CisJCQkJZW51bXZhbF9kZWZfdTMyKCAwLCAiUEVSTUFORU5UX1RFUk1JTkFUSU9OIiksCisJCQkJZW51bXZhbF9kZWZfdTMyKCAxLCAiTkVXX1NJUF9TRVJWRVJfQVNTSUdORUQiKSwKKwkJCQllbnVtdmFsX2RlZl91MzIoIDIsICJTSVBfU0VSVkVSX0NIQU5HRSIpLAorCQkJCWVudW12YWxfZGVmX3UzMiggMywgIlJFTU9WRV9TSVBfU0VSVkVSIikKKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJCQkJMzg0LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIlNJUC1SZWFzb24tQ29kZSIsIAkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlpbnQgaTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBlbnVtZXJhdGVkIHZhbHVlcywgYW5kIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSAsIE5VTEwsICZ0eXBlKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBzaXplb2YodHZhbHMpIC8gc2l6ZW9mKHR2YWxzWzBdKTsgaSsrKSB7CisJCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnR2YWxzW2ldLCB0eXBlLCBOVUxMKTsKKwkJCX0KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCB0eXBlLCBOVUxMKTsKKwkJfQorCisJCS8qIFNJUC1SZWFzb24tSW5mbyAqLworCQl7CisJCQkvKgorCQkJCVRoZSBTSVAtUmVhc29uLUluZm8gQVZQIChBVlAgQ29kZSAzODUpIGlzIG9mIHR5cGUgVVRGOFN0cmluZyBhbmQKKwkJCQljb250YWlucyB0ZXh0dWFsIGluZm9ybWF0aW9uIHRoYXQgY2FuIGJlIHJlbmRlcmVkIHRvIHRoZSB1c2VyLCBhYm91dAorCQkJCXRoZSByZWFzb24gZm9yIGEgZGVyZWdpc3RyYXRpb24uCisJCQkJCisJCQkqLworCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJCQkJMzg1LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIlNJUC1SZWFzb24tSW5mbyIsIAkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfQorCisJCS8qIFNJUC1EZXJlZ2lzdHJhdGlvbi1SZWFzb24gKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgU0lQLURlcmVnaXN0cmF0aW9uLVJlYXNvbiBBVlAgKEFWUCBDb2RlIDM4MykgaXMgb2YgdHlwZSBHcm91cGVkCisJCQkJYW5kIGluZGljYXRlcyB0aGUgcmVhc29uIGZvciBhIGRlcmVnaXN0cmF0aW9uIG9wZXJhdGlvbi4KKworCQkJCVRoZSBTSVAtRGVyZWdpc3RyYXRpb24tUmVhc29uIEFWUCBpcyBkZWZpbmVkIGFzIGZvbGxvd3MgKHBlciB0aGUKKwkJCQlncm91cGVkLWF2cC1kZWYgb2YgUkZDIDM1ODggW1JGQzM1ODhdKToKKworCQkJCVNJUC1EZXJlZ2lzdHJhdGlvbi1SZWFzb24gOjo9IDwgQVZQIEhlYWRlcjogMzgzID4KKwkJCQkJCQkgICAgeyBTSVAtUmVhc29uLUNvZGUgfQorCQkJCQkJCSAgICBbIFNJUC1SZWFzb24tSW5mbyBdCisJCQkJCQkJICAqIFsgQVZQIF0KKworCQkJKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQkJCQkzODMsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiU0lQLURlcmVnaXN0cmF0aW9uLVJlYXNvbiIsIAkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX0dST1VQRUQgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPSAKKwkJCQkJCXsgCSB7ICAiU0lQLVJlYXNvbi1Db2RlIiwgCVJVTEVfUkVRVUlSRUQsIC0xLCAxIH0KKwkJCQkJCQkseyAgIlNJUC1SZWFzb24tSW5mbyIsCVJVTEVfT1BUSU9OQUwsIC0xLCAxIH0KKwkJCQkJCX07CisJCQkKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCQl9CisKKwkJLyogU0lQLVZpc2l0ZWQtTmV0d29yay1JZCAqLworCQl7CisJCQkvKgorCQkJCVRoZSBTSVAtVmlzaXRlZC1OZXR3b3JrLUlkIEFWUCAoQVZQIENvZGUgMzg2KSBpcyBvZiB0eXBlIFVURjhTdHJpbmcuCisJCQkJVGhpcyBBVlAgY29udGFpbnMgYW4gaWRlbnRpZmllciB0aGF0IGhlbHBzIHRoZSBob21lIG5ldHdvcmsgaWRlbnRpZnkKKwkJCQl0aGUgdmlzaXRlZCBuZXR3b3JrIChlLmcuLCB0aGUgdmlzaXRlZCBuZXR3b3JrIGRvbWFpbiBuYW1lKSwgaW4gb3JkZXIKKwkJCQl0byBhdXRob3JpemUgcm9hbWluZyB0byB0aGF0IHZpc2l0ZWQgbmV0d29yay4KKwkJCQkKKwkJCSovCisKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQkJCQkzODYsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiU0lQLVZpc2l0ZWQtTmV0d29yay1JZCIsIAkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfQorCQkvKiBTSVAtVXNlci1BdXRob3JpemF0aW9uLVR5cGUgKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgU0lQLVVzZXItQXV0aG9yaXphdGlvbi1UeXBlIEFWUCAoQVZQIENvZGUgMzg3KSBpcyBvZiB0eXBlCisJCQkJRW51bWVyYXRlZCBhbmQgaW5kaWNhdGVzIHRoZSB0eXBlIG9mIHVzZXIgYXV0aG9yaXphdGlvbiBiZWluZworCQkJCXBlcmZvcm1lZCBpbiBhIFVzZXIgQXV0aG9yaXphdGlvbiBvcGVyYXRpb24sIGkuZS4sIHRoZSBEaWFtZXRlcgorCQkJCVVzZXItQXV0aG9yaXphdGlvbi1SZXF1ZXN0IChVQVIpIGNvbW1hbmQuICBUaGUgZm9sbG93aW5nIHZhbHVlcyBhcmUKKwkJCQlkZWZpbmVkOgorCisJCQkJbyAgUkVHSVNUUkFUSU9OICgwKQorCQkJCVRoaXMgdmFsdWUgaXMgdXNlZCBmb3IgaW5pdGlhbCByZWdpc3RyYXRpb24gb3IgcmUtcmVnaXN0cmF0aW9uLgorCQkJCVRoaXMgaXMgdGhlIGRlZmF1bHQgdmFsdWUuCisKKwkJCQlvICBERVJFR0lTVFJBVElPTiAoMSkKKwkJCQlUaGlzIHZhbHVlIGlzIHVzZWQgZm9yIGRlcmVnaXN0cmF0aW9uLgorCisJCQkJbyAgUkVHSVNUUkFUSU9OX0FORF9DQVBBQklMSVRJRVMgKDIpCisJCQkJVGhpcyB2YWx1ZSBpcyB1c2VkIGZvciBpbml0aWFsIHJlZ2lzdHJhdGlvbiBvciByZS1yZWdpc3RyYXRpb24KKwkJCQl3aGVuIHRoZSBTSVAgc2VydmVyIGV4cGxpY2l0bHkgcmVxdWVzdHMgdGhlIERpYW1ldGVyIHNlcnZlciB0byBnZXQKKwkJCQljYXBhYmlsaXR5IGluZm9ybWF0aW9uLiAgVGhpcyBjYXBhYmlsaXR5IGluZm9ybWF0aW9uIGhlbHBzIHRoZSBTSVAKKwkJCQlzZXJ2ZXIgdG8gYWxsb2NhdGUgYW5vdGhlciBTSVAgc2VydmVyIHRvIHNlcnZlIHRoZSB1c2VyLgorCQkJCQorCQkJKi8KKworCQkJc3RydWN0IGRpY3Rfb2JqZWN0IAkqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAJIHRkYXRhID0geyBBVlBfVFlQRV9VTlNJR05FRDMyLAkiRW51bWVyYXRlZChTSVAtVXNlci1BdXRob3JpemF0aW9uLVR5cGUpIgksIE5VTEwsIE5VTEx9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIHR2YWxzW10gPSB7CisJCQkJZW51bXZhbF9kZWZfdTMyKCAwLCAiUkVHSVNUUkFUSU9OIiksCisJCQkJZW51bXZhbF9kZWZfdTMyKCAxLCAiREVSRUdJU1RSQVRJT04iKSwKKwkJCQllbnVtdmFsX2RlZl91MzIoIDIsICJSRUdJU1RSQVRJT05fQU5EX0NBUEFCSUxJVElFUyIpCisJCQl9OworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTM4NywgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJTSVAtVXNlci1BdXRob3JpemF0aW9uLVR5cGUiLCAJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9VTlNJR05FRDMyIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJaW50IGk7CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgZW51bWVyYXRlZCB2YWx1ZXMsIGFuZCB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEgLCBOVUxMLCAmdHlwZSk7CisJCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHR2YWxzKSAvIHNpemVvZih0dmFsc1swXSk7IGkrKykgeworCQkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0dmFsc1tpXSwgdHlwZSwgTlVMTCk7CisJCQl9CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgdHlwZSwgTlVMTCk7CisJCX0KKwkJLyogU0lQLVN1cHBvcnRlZC1Vc2VyLURhdGEtVHlwZSAqLworCQl7CisJCQkvKgorCQkJCVRoZSBTSVAtU3VwcG9ydGVkLVVzZXItRGF0YS1UeXBlIEFWUCAoQVZQIENvZGUgMzg4KSBpcyBvZiB0eXBlCisJCQkJVVRGOFN0cmluZyBhbmQgY29udGFpbnMgYSBzdHJpbmcgdGhhdCBpZGVudGlmaWVzIHRoZSB0eXBlIG9mCisJCQkJc3VwcG9ydGVkIHVzZXIgZGF0YSAodXNlciBwcm9maWxlLCBzZWUgU0lQLVVzZXItRGF0YSBBVlAKKwkJCQkoU2VjdGlvbiA5LjEyKSkgc3VwcG9ydGVkIGluIHRoZSBub2RlLiAgVGhlIEFWUCBjYW4gYmUgcmVwZWF0ZWQsIGlmCisJCQkJdGhlIFNJUCBzZXJ2ZXIgc3VwcG9ydHMgc2V2ZXJhbCB1c2VyIGRhdGEgdHlwZXMuICBJbiBjYXNlIG9mCisJCQkJcmVwZXRpdGlvbiwgdGhlIERpYW1ldGVyIGNsaWVudCBzaG91bGQgb3JkZXIgdGhlIGRpZmZlcmVudCBpbnN0YW5jZXMKKwkJCQlvZiB0aGlzIEFWUCBhY2NvcmRpbmcgdG8gaXRzIHByZWZlcmVuY2VzLgorCisJCQkJV2hlbiB0aGUgRGlhbWV0ZXIgY2xpZW50IGluc2VydHMgdGhpcyBBVlAgaW4gYSBTQVIgbWVzc2FnZSwgaXQgYWxsb3dzCisJCQkJdGhlIERpYW1ldGVyIGNsaWVudCB0byBwcm92aWRlIGFuIGluZGljYXRpb24gdG8gdGhlIERpYW1ldGVyIHNlcnZlcgorCQkJCW9mIHRoZSB0eXBlcyBvZiB1c2VyIGRhdGEgc3VwcG9ydGVkIGJ5IHRoZSBTSVAgc2VydmVyLiAgVGhlIERpYW1ldGVyCisJCQkJc2VydmVyLCB1cG9uIGluc3BlY3Rpb24gb2YgdGhlc2UgQVZQcywgd2lsbCByZXR1cm4gYSBzdWl0YWJsZQorCQkJCVNJUC1Vc2VyLURhdGEgQVZQIChTZWN0aW9uIDkuMTIpIG9mIHRoZSB0eXBlIGluZGljYXRlZCBpbiB0aGUKKwkJCQlTSVAtVXNlci1EYXRhLVR5cGUgQVZQIChTZWN0aW9uIDkuMTIuMSkuCisJCQkJCisJCQkqLworCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJCQkJMzg4LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIlNJUC1TdXBwb3J0ZWQtVXNlci1EYXRhLVR5cGUiLCAJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORyAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX0KKwkJLyogU0lQLVVzZXItRGF0YS1UeXBlICovCisJCXsKKwkJCS8qCisJCQkJVGhlIFNJUC1Vc2VyLURhdGEtVHlwZSBBVlAgKEFWUCBDb2RlIDM5MCkgaXMgb2YgdHlwZSBVVEY4U3RyaW5nIGFuZAorCQkJCWNvbnRhaW5zIGEgc3RyaW5nIHRoYXQgaWRlbnRpZmllcyB0aGUgdHlwZSBvZiB1c2VyIGRhdGEgaW5jbHVkZWQgaW4KKwkJCQl0aGUgU0lQLVVzZXItRGF0YS1UeXBlIEFWUCAoU2VjdGlvbiA5LjEyKS4KKworCQkJCVRoaXMgZG9jdW1lbnQgZG9lcyBub3Qgc3BlY2lmeSBhIGNvbnZlbnRpb24gdG8gY2hhcmFjdGVyaXplIHRoZSB0eXBlCisJCQkJb2YgdXNlciBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgU0lQLVVzZXItRGF0YS1UeXBlIEFWUCAoU2VjdGlvbiA5LjEyKS4gIEl0CisJCQkJaXMgYmVsaWV2ZWQgdGhhdCBpbiBtb3N0IGNhc2VzIHRoaXMgZmVhdHVyZSB3aWxsIGJlIHVzZWQgaW4KKwkJCQllbnZpcm9ubWVudHMgY29udHJvbGxlZCBieSBhIG5ldHdvcmsgYWRtaW5pc3RyYXRvciB3aG8gY2FuIGNvbmZpZ3VyZQorCQkJCWJvdGggdGhlIGNsaWVudCBhbmQgc2VydmVyIHRvIGFzc2lnbiB0aGUgc2FtZSB2YWx1ZSB0eXBlIGF0IHRoZQorCQkJCWNsaWVudCBhbmQgc2VydmVyLiAgSXQgaXMgYWxzbyBSRUNPTU1FTkRFRCB0aGF0IG9yZ2FuaXphdGlvbnMKKwkJCQlkZXZlbG9waW5nIHRoZWlyIG93biBwcm9maWxlIG9mIFNJUC1Vc2VyLURhdGEtVHlwZSBBVlAgKFNlY3Rpb24gOS4xMikKKwkJCQlhbGxvY2F0ZSBhIHR5cGUgYmFzZWQgb24gdGhlaXIgY2Fub25pY2FsIEROUyBuYW1lLiAgRm9yIGluc3RhbmNlLAorCQkJCW9yZ2FuaXphdGlvbiAiZXhhbXBsZS5jb20iIGNhbiBkZWZpbmUgc2V2ZXJhbCB0eXBlcyBvZiBTSVAtVXNlci1EYXRhCisJCQkJYW5kIGFsbG9jYXRlIHRoZSB0eXBlcyAidHlwZTEuZHNhLmV4YW1wbGUuY29tIiwKKwkJCQkidHlwZTIuZHNhLmV4YW1wbGUuY29tIiwgYW5kIHNvIG9uLiAgVGhpcyBjb252ZW50aW9uIHdpbGwgYXZvaWQgYQorCQkJCWNsYXNoIGluIHRoZSBhbGxvY2F0aW9uIG9mIHR5cGVzIG9mIFNJUC1Vc2VyLURhdGEtVHlwZSBBVlAgKFNlY3Rpb24gOS4xMikuCisJCQkJCisJCQkqLworCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJCQkJMzkwLCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIlNJUC1Vc2VyLURhdGEtVHlwZSIsIAkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfQorCQkvKiBTSVAtVXNlci1EYXRhLUNvbnRlbnRzICovCisJCXsKKwkJCS8qCisJCQkJVGhlIFNJUC1Vc2VyLURhdGEtQ29udGVudHMgQVZQIChBVlAgQ29kZSAzOTEpIGlzIG9mIHR5cGUgT2N0ZXRTdHJpbmcuCisJCQkJVGhlIERpYW1ldGVyIHBlZXJzIGRvIG5vdCBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIHZhbHVlIG9mIHRoaXMgQVZQLgorCisJCQkJVGhlIEFWUCBjb250YWlucyB0aGUgdXNlciBwcm9maWxlIGRhdGEgcmVxdWlyZWQgZm9yIGEgU0lQIHNlcnZlciB0bworCQkJCWdpdmUgc2VydmljZSB0byB0aGUgdXNlci4KKworCQkJCQorCQkJKi8KKworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTM5MSwgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJTSVAtVXNlci1EYXRhLUNvbnRlbnRzIiwgCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCSAJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCBOVUxMKTsKKwkJfQorCisJCS8qIFNJUC1Vc2VyLURhdGEgKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgU0lQLVVzZXItRGF0YSBBVlAgKEFWUCBDb2RlIDM4OSkgaXMgb2YgdHlwZSBHcm91cGVkLiAgVGhpcyBBVlAKKwkJCQlhbGxvd3MgdGhlIERpYW1ldGVyIHNlcnZlciB0byB0cmFuc3BvcnQgdXNlci1zcGVjaWZpYyBkYXRhLCBzdWNoIGFzIGEKKwkJCQl1c2VyIHByb2ZpbGUsIHRvIHRoZSBTSVAgc2VydmVyIChpbiB0aGUgRGlhbWV0ZXIgY2xpZW50KS4gIFRoZQorCQkJCURpYW1ldGVyIHNlcnZlciBzZWxlY3RzIGEgdHlwZSBvZiB1c2VyIGRhdGEgdGhhdCBpcyB1bmRlcnN0b29kIGJ5IHRoZQorCQkJCVNJUCBzZXJ2ZXIgaW4gdGhlIERpYW1ldGVyIGNsaWVudCwgYW5kIGhhcyBiZWVuIGluZGljYXRlZCBpbiBhCisJCQkJU0lQLVN1cHBvcnRlZC1Vc2VyLURhdGEtVHlwZSBBVlAuICBJbiBjYXNlIHRoZSBEaWFtZXRlciBjbGllbnQKKwkJCQlpbmRpY2F0ZWQgc3VwcG9ydCBmb3Igc2V2ZXJhbCB0eXBlcyBvZiB1c2VyIGRhdGEsIHRoZSBEaWFtZXRlciBzZXJ2ZXIKKwkJCQlTSE9VTEQgY2hvb3NlIHRoZSBmaXJzdCB0eXBlIHN1cHBvcnRlZCBieSB0aGUgY2xpZW50LgorCisJCQkJVGhlIFNJUC1Vc2VyLURhdGEgZ3JvdXBlZCBBVlAgY29udGFpbnMgYSBTSVAtVXNlci1EYXRhLVR5cGUgQVZQIHRoYXQKKwkJCQlpbmRpY2F0ZXMgdGhlIHR5cGUgb2YgdXNlciBkYXRhIGluY2x1ZGVkIGluIHRoZQorCQkJCVNJUC1Vc2VyLURhdGEtQ29udGVudHMtQVZQLgorCisJCQkJVGhlIFNJUC1Vc2VyLURhdGEgQVZQIGlzIGRlZmluZWQgYXMgZm9sbG93cyAocGVyIHRoZSBncm91cGVkLWF2cC1kZWYKKwkJCQlvZiBSRkMgMzU4OCBbUkZDMzU4OF0pOgorCisKKwkJCQlTSVAtVXNlci1EYXRhIDo6PSA8IEFWUCBIZWFkZXI6IDM4OSA+CisJCQkJCQl7IFNJUC1Vc2VyLURhdGEtVHlwZSB9CisJCQkJCQl7IFNJUC1Vc2VyLURhdGEtQ29udGVudHMgfQorCQkJCQkgICAgICAqIFsgQVZQIF0KKwkJCQkKKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJCQkJMzg5LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIlNJUC1Vc2VyLURhdGEiLCAJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJIAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9HUk9VUEVEIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0gCisJCQkJCQl7IAkgeyAgIlNJUC1Vc2VyLURhdGEtVHlwZSIsIAlSVUxFX1JFUVVJUkVELCAtMSwgMSB9CisJCQkJCQkJLHsgICJTSVAtVXNlci1EYXRhLUNvbnRlbnRzIiwJUlVMRV9SRVFVSVJFRCwgLTEsIDEgfQorCQkJCQkJfTsKKwkJCQorCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJCX0KKwkJLyogU0lQLVVzZXItRGF0YS1BbHJlYWR5LUF2YWlsYWJsZSAqLworCQl7CisJCQkvKgorCQkJCVRoZSBTSVAtVXNlci1EYXRhLUFscmVhZHktQXZhaWxhYmxlIEFWUCAoQVZQIENvZGUgMzkyKSBpcyBvZiB0eXBlCisJCQkJRW51bWVyYXRlZCBhbmQgZ2l2ZXMgYW4gaW5kaWNhdGlvbiB0byB0aGUgRGlhbWV0ZXIgc2VydmVyIGFib3V0CisJCQkJd2hldGhlciB0aGUgRGlhbWV0ZXIgY2xpZW50IChTSVAgc2VydmVyKSBhbHJlYWR5IHJlY2VpdmVkIHRoZSBwb3J0aW9uCisJCQkJb2YgdGhlIHVzZXIgcHJvZmlsZSBuZWVkZWQgaW4gb3JkZXIgdG8gc2VydmUgdGhlIHVzZXIuICBUaGUgZm9sbG93aW5nCisJCQkJdmFsdWVzIGFyZSBkZWZpbmVkOgorCisJCQkJbyAgVVNFUl9EQVRBX05PVF9BVkFJTEFCTEUgKDApCisJCQkJVGhlIERpYW1ldGVyIGNsaWVudCAoU0lQIHNlcnZlcikgZG9lcyBub3QgaGF2ZSB0aGUgZGF0YSB0aGF0IGl0CisJCQkJbmVlZHMgdG8gc2VydmUgdGhlIHVzZXIuCisKKwkJCQlvICBVU0VSX0RBVEFfQUxSRUFEWV9BVkFJTEFCTEUgKDEpCisJCQkJVGhlIERpYW1ldGVyIGNsaWVudCAoU0lQIHNlcnZlcikgYWxyZWFkeSBoYXMgcmVjZWl2ZWQgdGhlIGRhdGEKKwkJCQl0aGF0IGl0IG5lZWRzIHRvIHNlcnZlIHRoZSB1c2VyLgorCisJCisJCQkqLworCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgCSp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhIAkgdGRhdGEgPSB7IEFWUF9UWVBFX1VOU0lHTkVEMzIsCSJFbnVtZXJhdGVkKFNJUC1Vc2VyLURhdGEtQWxyZWFkeS1BdmFpbGFibGUpIgksIE5VTEwsIE5VTEx9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIHR2YWxzW10gPSB7CisJCQkJZW51bXZhbF9kZWZfdTMyKCAwLCAiVVNFUl9EQVRBX05PVF9BVkFJTEFCTEUiKSwKKwkJCQllbnVtdmFsX2RlZl91MzIoIDEsICJVU0VSX0RBVEFfQUxSRUFEWV9BVkFJTEFCTEUiKQorCQkJfTsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQkJCQkzOTIsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiU0lQLVVzZXItRGF0YS1BbHJlYWR5LUF2YWlsYWJsZSIsIAkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlpbnQgaTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBlbnVtZXJhdGVkIHZhbHVlcywgYW5kIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSAsIE5VTEwsICZ0eXBlKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBzaXplb2YodHZhbHMpIC8gc2l6ZW9mKHR2YWxzWzBdKTsgaSsrKSB7CisJCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnR2YWxzW2ldLCB0eXBlLCBOVUxMKTsKKwkJCX0KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCB0eXBlLCBOVUxMKTsKKwkJfQorCQkvKiBTSVAtTWV0aG9kICovCisJCXsKKwkJCS8qCisJCQkJVGhlIFNJUC1NZXRob2QtQVZQIChBVlAgQ29kZSAzOTMpIGlzIG9mIHR5cGUgVVRGOFN0cmluZyBhbmQgY29udGFpbnMKKwkJCQl0aGUgbWV0aG9kIG9mIHRoZSBTSVAgcmVxdWVzdCB0aGF0IHRyaWdnZXJlZCB0aGUgRGlhbWV0ZXIgbWVzc2FnZS4KKwkJCQlUaGUgRGlhbWV0ZXIgc2VydmVyIE1VU1QgdXNlIHRoaXMgQVZQIHNvbGVseSBmb3IgYXV0aG9yaXphdGlvbiBvZiBTSVAKKwkJCQlyZXF1ZXN0cywgYW5kIE1VU1QgTk9UIHVzZSBpdCB0byBjb21wdXRlIHRoZSBEaWdlc3QgYXV0aGVudGljYXRpb24uCisJCQkJVG8gY29tcHV0ZSB0aGUgRGlnZXN0IGF1dGhlbnRpY2F0aW9uLCB0aGUgRGlhbWV0ZXIgc2VydmVyIE1VU1QgdXNlCisJCQkJdGhlIERpZ2VzdC1NZXRob2QgQVZQIGluc3RlYWQuCisKKwkJCQkKKwkJCSovCisKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQkJCQkzOTMsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiU0lQLU1ldGhvZCIsIAkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkgCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfQorCQkvKiBDb21wbGVtZW50IG9mIFJlc3VsdC1Db2RlIEFWUCB2YWx1ZXMgKi8KKwkJeworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogcmVzdWx0Y29kZV9kYXRhX3R5cGU7CisJCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX1RZUEUsVFlQRV9CWV9OQU1FLCJFbnVtZXJhdGVkKFJlc3VsdC1Db2RlKSIsJnJlc3VsdGNvZGVfZGF0YV90eXBlKTsKKwkJCisKKwkJCXsKKworCQkJCS8qIFN1Y2Nlc3MgKi8KKwkJCQl7CisJCQkJCS8qIDIwMDMgKi8KKwkJCQkJeworCQkJCQkJLyoKKwkJCQkJCQlUaGUgdXNlciB3YXMgbm90IHByZXZpb3VzbHkgcmVnaXN0ZXJlZC4gIFRoZSBEaWFtZXRlciBzZXJ2ZXIgaGFzCisJCQkJCQkJbm93IGF1dGhvcml6ZWQgdGhlIHJlZ2lzdHJhdGlvbi4KKwkJCQkJCSovCisJCQkJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgCWVycm9yX2NvZGUgPSB7ICJESUFNRVRFUl9GSVJTVF9SRUdJU1RSQVRJT04iLCAJeyAudTMyID0gMjAwMyB9fTsKKwkJCQkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZlcnJvcl9jb2RlICwgcmVzdWx0Y29kZV9kYXRhX3R5cGUsIE5VTEwpOworCQkJCQl9CisJCQkJCS8qIDIwMDQgKi8KKwkJCQkJeworCQkJCQkJLyoKKwkJCQkJCQlUaGUgdXNlciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuICBUaGUgRGlhbWV0ZXIgc2VydmVyIGhhcyBub3cKKwkJCQkJCQlhdXRob3JpemVkIHRoZSByZS1yZWdpc3RyYXRpb24uCisKKwkJCQkJCSovCisJCQkJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgCWVycm9yX2NvZGUgPSB7ICJESUFNRVRFUl9TVUJTRVFVRU5UX1JFR0lTVFJBVElPTiIsIAl7IC51MzIgPSAyMDA0IH19OworCQkJCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJmVycm9yX2NvZGUgLCByZXN1bHRjb2RlX2RhdGFfdHlwZSwgTlVMTCk7CisJCQkJCX0KKwkJCQkJLyogMjAwNSAqLworCQkJCQl7CisJCQkJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgCWVycm9yX2NvZGUgPSB7ICJESUFNRVRFUl9VTlJFR0lTVEVSRURfU0VSVklDRSIsIAl7IC51MzIgPSAyMDA1IH19OworCQkJCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJmVycm9yX2NvZGUgLCByZXN1bHRjb2RlX2RhdGFfdHlwZSwgTlVMTCk7CisJCQkJCX0KKwkJCQkJLyogMjAwNiAqLworCQkJCQl7CisJCQkJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgCWVycm9yX2NvZGUgPSB7ICJESUFNRVRFUl9TVUNDRVNTX1NFUlZFUl9OQU1FX05PVF9TVE9SRUQiLCAJeyAudTMyID0gMjAwNiB9fTsKKwkJCQkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZlcnJvcl9jb2RlICwgcmVzdWx0Y29kZV9kYXRhX3R5cGUsIE5VTEwpOworCQkJCQl9CisJCQkJCS8qIDIwMDcgKi8KKwkJCQkJeworCQkJCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIAllcnJvcl9jb2RlID0geyAiRElBTUVURVJfU0VSVkVSX1NFTEVDVElPTiIsIAl7IC51MzIgPSAyMDA3IH19OworCQkJCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJmVycm9yX2NvZGUgLCByZXN1bHRjb2RlX2RhdGFfdHlwZSwgTlVMTCk7CisJCQkJCX0KKwkJCQkJLyogMjAwOCAqLworCQkJCQl7CisJCQkJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgCWVycm9yX2NvZGUgPSB7ICJESUFNRVRFUl9TVUNDRVNTX0FVVEhfU0VOVF9TRVJWRVJfTk9UX1NUT1JFRCIsIAl7IC51MzIgPSAyMDA4IH19OworCQkJCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJmVycm9yX2NvZGUgLCByZXN1bHRjb2RlX2RhdGFfdHlwZSwgTlVMTCk7CisJCQkJCX0KKwkJCQl9CisJCQkJLyogVHJhbnNpZW50IEZhaWx1cmVzICovCisJCQkJeworCQkJCQkvKiA0MDEzICovCisJCQkJCXsKKwkJCQkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAJZXJyb3JfY29kZSA9IHsgIkRJQU1FVEVSX1VTRVJfTkFNRV9SRVFVSVJFRCIsIAl7IC51MzIgPSA0MDEzIH19OworCQkJCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJmVycm9yX2NvZGUgLCByZXN1bHRjb2RlX2RhdGFfdHlwZSwgTlVMTCk7CisJCQkJCX0KKwkJCQl9CisJCQkJLyogUGVybWFuZW50IEZhaWx1cmVzICovCisJCQkJeworCQkJCQkvKiA1MDMyICovCisJCQkJCXsKKwkJCQkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAJZXJyb3JfY29kZSA9IHsgIkRJQU1FVEVSX0VSUk9SX1VTRVJfVU5LTk9XTiIsIAl7IC51MzIgPSA1MDMyIH19OworCQkJCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJmVycm9yX2NvZGUgLCByZXN1bHRjb2RlX2RhdGFfdHlwZSwgTlVMTCk7CisJCQkJCX0KKwkJCQkJLyogNTAzMyAqLworCQkJCQl7CisJCQkJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgCWVycm9yX2NvZGUgPSB7ICJESUFNRVRFUl9FUlJPUl9JREVOVElUSUVTX0RPTlRfTUFUQ0giLCAJeyAudTMyID0gNTAzMyB9fTsKKwkJCQkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZlcnJvcl9jb2RlICwgcmVzdWx0Y29kZV9kYXRhX3R5cGUsIE5VTEwpOworCQkJCQl9CisJCQkJCS8qIDUwMzQgKi8KKwkJCQkJeworCQkJCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIAllcnJvcl9jb2RlID0geyAiRElBTUVURVJfRVJST1JfSURFTlRJVFlfTk9UX1JFR0lTVEVSRUQiLCAJeyAudTMyID0gNTAzNCB9fTsKKwkJCQkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZlcnJvcl9jb2RlICwgcmVzdWx0Y29kZV9kYXRhX3R5cGUsIE5VTEwpOworCQkJCQl9CisJCQkJCS8qIDUwMzUgKi8KKwkJCQkJeworCQkJCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIAllcnJvcl9jb2RlID0geyAiRElBTUVURVJfRVJST1JfUk9BTUlOR19OT1RfQUxMT1dFRCIsIAl7IC51MzIgPSA1MDM1IH19OworCQkJCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJmVycm9yX2NvZGUgLCByZXN1bHRjb2RlX2RhdGFfdHlwZSwgTlVMTCk7CisJCQkJCX0KKwkJCQkJLyogNTAzNiAqLworCQkJCQl7CisJCQkJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgCWVycm9yX2NvZGUgPSB7ICJESUFNRVRFUl9FUlJPUl9JREVOVElUWV9BTFJFQURZX1JFR0lTVEVSRUQiLCAJeyAudTMyID0gNTAzNiB9fTsKKwkJCQkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZlcnJvcl9jb2RlICwgcmVzdWx0Y29kZV9kYXRhX3R5cGUsIE5VTEwpOworCQkJCQl9CisJCQkJCS8qIDUwMzcgKi8KKwkJCQkJeworCQkJCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIAllcnJvcl9jb2RlID0geyAiRElBTUVURVJfRVJST1JfQVVUSF9TQ0hFTUVfTk9UX1NVUFBPUlRFRCIsIAl7IC51MzIgPSA1MDM3IH19OworCQkJCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJmVycm9yX2NvZGUgLCByZXN1bHRjb2RlX2RhdGFfdHlwZSwgTlVMTCk7CisJCQkJCX0KKwkJCQkJLyogNTAzOCAqLworCQkJCQl7CisJCQkJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgCWVycm9yX2NvZGUgPSB7ICJESUFNRVRFUl9FUlJPUl9JTl9BU1NJR05NRU5UX1RZUEUiLCAJeyAudTMyID0gNTAzOCB9fTsKKwkJCQkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZlcnJvcl9jb2RlICwgcmVzdWx0Y29kZV9kYXRhX3R5cGUsIE5VTEwpOworCQkJCQl9CisJCQkJCS8qIDUwMzkgKi8KKwkJCQkJeworCQkJCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIAllcnJvcl9jb2RlID0geyAiRElBTUVURVJfRVJST1JfVE9PX01VQ0hfREFUQSIsIAl7IC51MzIgPSA1MDM5IH19OworCQkJCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJmVycm9yX2NvZGUgLCByZXN1bHRjb2RlX2RhdGFfdHlwZSwgTlVMTCk7CisJCQkJCX0KKwkJCQkJLyogNTA0MCAqLworCQkJCQl7CisJCQkJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgCWVycm9yX2NvZGUgPSB7ICJESUFNRVRFUl9FUlJPUl9OT1QgU1VQUE9SVEVEX1VTRVJfREFUQSIsIAl7IC51MzIgPSA1MDQwIH19OworCQkJCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJmVycm9yX2NvZGUgLCByZXN1bHRjb2RlX2RhdGFfdHlwZSwgTlVMTCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQorCisJCX0gICAKKwl9CisJLyogQ29tbWFuZCBzZWN0aW9uICovCisJeworCQkvKiBVc2VyLUF1dGhvcml6YXRpb24tUmVxdWVzdCAoVUFSKSBDb21tYW5kICovCisJCXsKKwkJCS8qCisJCQlUaGUgVXNlci1BdXRob3JpemF0aW9uLVJlcXVlc3QgKFVBUikgaXMgaW5kaWNhdGVkIGJ5IHRoZSBDb21tYW5kLUNvZGUKKwkJCXNldCB0byAyODMgYW5kIHRoZSBDb21tYW5kIEZsYWdzJyAnUicgYml0IHNldC4gIFRoZSBEaWFtZXRlciBjbGllbnQKKwkJCWluIGEgU0lQIHNlcnZlciBzZW5kcyB0aGlzIGNvbW1hbmQgdG8gdGhlIERpYW1ldGVyIHNlcnZlciB0byByZXF1ZXN0CisJCQlhdXRob3JpemF0aW9uIGZvciB0aGUgU0lQIFVzZXIgQWdlbnQgdG8gcm91dGUgYSBTSVAgUkVHSVNURVIgcmVxdWVzdC4KKwkJCUJlY2F1c2UgdGhlIFNJUCBSRUdJU1RFUiByZXF1ZXN0IGltcGxpY2l0bHkgY2FycmllcyBhIHBlcm1pc3Npb24gdG8KKwkJCWJpbmQgYW4gQU9SIHRvIGEgY29udGFjdCBhZGRyZXNzLCB0aGUgRGlhbWV0ZXIgY2xpZW50IHVzZXMgdGhlCisJCQlEaWFtZXRlciBVQVIgYXMgYSBmaXJzdCBhdXRob3JpemF0aW9uIHJlcXVlc3QgdG93YXJkcyB0aGUgRGlhbWV0ZXIKKwkJCXNlcnZlciB0byBhdXRob3JpemUgdGhlIHJlZ2lzdHJhdGlvbi4gIEZvciBpbnN0YW5jZSwgdGhlIERpYW1ldGVyCisJCQlzZXJ2ZXIgY2FuIHZlcmlmeSB0aGF0IHRoZSBBT1IgaXMgYSBsZWdpdGltYXRlIHVzZXIgb2YgdGhlIHJlYWxtLgorCisJCQlUaGUgRGlhbWV0ZXIgY2xpZW50IGluIHRoZSBTSVAgc2VydmVyIHJlcXVlc3RzIGF1dGhvcml6YXRpb24gZm9yIG9uZQorCQkJb2YgdGhlIHBvc3NpYmxlIHZhbHVlcyBkZWZpbmVkIGluIHRoZSBTSVAtVXNlci1BdXRob3JpemF0aW9uLVR5cGUgQVZQCisJCQkoU2VjdGlvbiA5LjEwKS4KKworCQkJVGhlIHVzZXIgbmFtZSB1c2VkIGZvciBhdXRoZW50aWNhdGlvbiBvZiB0aGUgdXNlciBpcyBjb252ZXllZCBpbiBhCisJCQlVc2VyLU5hbWUgQVZQIChkZWZpbmVkIGluIHRoZSBEaWFtZXRlciBiYXNlIHByb3RvY29sLCBSRkMgMzU4OAorCQkJW1JGQzM1ODhdKS4gIFRoZSBsb2NhdGlvbiBvZiB0aGUgYXV0aGVudGljYXRpb24gdXNlciBuYW1lIGluIHRoZSBTSVAKKwkJCVJFR0lTVEVSIHJlcXVlc3QgdmFyaWVzIGRlcGVuZGluZyBvbiB0aGUgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtLgorCQkJV2hlbiB0aGUgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtIGlzIEhUVFAgRGlnZXN0IGFzIGRlZmluZWQgaW4gUkZDCisJCQkyNjE3IFtSRkMyNjE3XSwgdGhlIGF1dGhlbnRpY2F0aW9uIHVzZXIgbmFtZSBpcyBmb3VuZCBpbiB0aGUKKwkJCSJ1c2VybmFtZSIgZGlyZWN0aXZlIG9mIHRoZSBTSVAgQXV0aG9yaXphdGlvbiBoZWFkZXIgZmllbGQgdmFsdWUuCisJCQlUaGlzIERpYW1ldGVyIFNJUCBhcHBsaWNhdGlvbiBvbmx5IHByb3ZpZGVzIHN1cHBvcnQgZm9yIEhUVFAgRGlnZXN0CisJCQlhdXRoZW50aWNhdGlvbiBpbiBTSVA7IG90aGVyIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbXMgYXJlIG5vdAorCQkJY3VycmVudGx5IHN1cHBvcnRlZC4KKworCQkJVGhlIFNJUCBvciBTSVBTIFVSSSB0byBiZSByZWdpc3RlcmVkIGlzIGNvbnZleWVkIGluIHRoZSBTSVAtQU9SIEFWUAorCQkJKFNlY3Rpb24gOS44KS4gIFR5cGljYWxseSB0aGlzIFNJUCBvciBTSVBTIFVSSSBpcyBmb3VuZCBpbiB0aGUgVG8KKwkJCWhlYWRlciBmaWVsZCB2YWx1ZSBvZiB0aGUgU0lQIFJFR0lTVEVSIHJlcXVlc3QgdGhhdCB0cmlnZ2VyZWQgdGhlCisJCQlEaWFtZXRlciBVQVIgbWVzc2FnZS4KKworCQkJVGhlIFNJUC1WaXNpdGVkLU5ldHdvcmstSWQgQVZQIGluZGljYXRlcyB0aGUgbmV0d29yayB0aGF0IGlzCisJCQlwcm92aWRpbmcgU0lQIHNlcnZpY2VzIChlLmcuLCBTSVAgcHJveHkgZnVuY3Rpb25hbGl0eSBvciBhbnkgb3RoZXIKKwkJCWtpbmQgb2Ygc2VydmljZXMpIHRvIHRoZSBTSVAgVXNlciBBZ2VudC4KKworCQkJVGhlIE1lc3NhZ2UgRm9ybWF0IG9mIHRoZSBVQVIgY29tbWFuZCBpcyBhcyBmb2xsb3dzOgorCisJCQk8VUFSPiA6Oj0gPCBEaWFtZXRlciBIZWFkZXI6IDI4MywgUkVRLCBQWFkgPgorCQkJCSA8IFNlc3Npb24tSWQgPgorCQkJCSB7IEF1dGgtQXBwbGljYXRpb24tSWQgfQorCQkJCSB7IEF1dGgtU2Vzc2lvbi1TdGF0ZSB9CisJCQkJIHsgT3JpZ2luLUhvc3QgfQorCQkJCSB7IE9yaWdpbi1SZWFsbSB9CisJCQkJIHsgRGVzdGluYXRpb24tUmVhbG0gfQorCQkJCSB7IFNJUC1BT1IgfQorCQkJCSBbIERlc3RpbmF0aW9uLUhvc3QgXQorCQkJCSBbIFVzZXItTmFtZSBdCisJCQkJIFsgU0lQLVZpc2l0ZWQtTmV0d29yay1JZCBdCisJCQkJIFsgU0lQLVVzZXItQXV0aG9yaXphdGlvbi1UeXBlIF0KKwkJCSAgICAgICAqIFsgUHJveHktSW5mbyBdCisJCQkgICAgICAgKiBbIFJvdXRlLVJlY29yZCBdCisJCQkgICAgICAgKiBbIEFWUCBdCisKKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBjbWQ7CisJCQlzdHJ1Y3QgZGljdF9jbWRfZGF0YSBkYXRhID0geyAKKwkJCQkJMjgzLCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJIlVzZXItQXV0aG9yaXphdGlvbi1SZXF1ZXN0IiwgCQkvKiBOYW1lICovCisJCQkJCUNNRF9GTEFHX1JFUVVFU1QgfCBDTURfRkxBR19QUk9YSUFCTEUgfCBDTURfRkxBR19FUlJPUiwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUNNRF9GTEFHX1JFUVVFU1QgfCBDTURfRkxBR19QUk9YSUFCTEUgCQkJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJfTsKKwkJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPSAKKwkJCQkJCXsgCSB7ICAiU2Vzc2lvbi1JZCIsIAkJCVJVTEVfRklYRURfSEVBRCwgLTEsIDEgfQorCQkJCQkJIAkseyAgIkF1dGgtQXBwbGljYXRpb24tSWQiLCAJCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkJCQkJIAkseyAgIkF1dGgtU2Vzc2lvbi1TdGF0ZSIsIAkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCQkJCQkgCSx7ICAiT3JpZ2luLUhvc3QiLCAJCQlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJCQkJCSAJLHsgICJPcmlnaW4tUmVhbG0iLCAJCQlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJCQkJCSAJLHsgICJEZXN0aW5hdGlvbi1SZWFsbSIsIAkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCQkJCQkgCSx7ICAiU0lQLUFPUiIsIAkJCQlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJCQkJCSAJLHsgICJEZXN0aW5hdGlvbi1Ib3N0IiwgCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCSAJLHsgICJVc2VyLU5hbWUiLCAJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCSAJLHsgICJTSVAtVmlzaXRlZC1OZXR3b3JrLUlkIiwgCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCSAJLHsgICJTSVAtVXNlci1BdXRob3JpemF0aW9uLVR5cGUiLCAJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkgCSx7ICAiUHJveHktSW5mbyIsIAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIC0xIH0KKwkJCQkJCSAJLHsgICJSb3V0ZS1SZWNvcmQiLCAJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAtMSB9CisKKwkJCQkJCX07CisJCQkKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0NPTU1BTkQsICZkYXRhICwgc2lwLCAmY21kKTsKKwkJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGNtZCApOworCQl9CisKKwkJLyogVXNlci1BdXRob3JpemF0aW9uLUFuc3dlciAoVUFBKSBDb21tYW5kICovCisJCXsKKwkJCS8qCisJCQlUaGUgVXNlci1BdXRob3JpemF0aW9uLUFuc3dlciAoVUFBKSBpcyBpbmRpY2F0ZWQgYnkgdGhlIENvbW1hbmQtQ29kZQorCQkJc2V0IHRvIDI4MyBhbmQgdGhlIENvbW1hbmQgRmxhZ3MnICdSJyBiaXQgY2xlYXJlZC4gIFRoZSBEaWFtZXRlcgorCQkJc2VydmVyIHNlbmRzIHRoaXMgY29tbWFuZCBpbiByZXNwb25zZSB0byBhIHByZXZpb3VzbHkgcmVjZWl2ZWQKKwkJCURpYW1ldGVyIFVzZXItQXV0aG9yaXphdGlvbi1SZXF1ZXN0IChVQVIpIGNvbW1hbmQuICBUaGUgRGlhbWV0ZXIKKwkJCXNlcnZlciBpbmRpY2F0ZXMgdGhlIHJlc3VsdCBvZiB0aGUgcmVxdWVzdGVkIHJlZ2lzdHJhdGlvbgorCQkJYXV0aG9yaXphdGlvbi4gIEFkZGl0aW9uYWxseSwgdGhlIERpYW1ldGVyIHNlcnZlciBtYXkgaW5kaWNhdGUgYQorCQkJY29sbGVjdGlvbiBvZiBTSVAgY2FwYWJpbGl0aWVzIHRoYXQgYXNzaXN0cyB0aGUgRGlhbWV0ZXIgY2xpZW50IHRvCisJCQlzZWxlY3QgYSBTSVAgcHJveHkgdG8gdGhlIEFPUiB1bmRlciByZWdpc3RyYXRpb24uCisKKworCQkJSW4gYWRkaXRpb24gdG8gdGhlIHZhbHVlcyBhbHJlYWR5IGRlZmluZWQgaW4gUkZDIDM1ODggW1JGQzM1ODhdLCB0aGUKKwkJCVJlc3VsdC1Db2RlIEFWUCBtYXkgY29udGFpbiBvbmUgb2YgdGhlIHZhbHVlcyBkZWZpbmVkIGluCisJCQlTZWN0aW9uIDEwLjEuCisKKwkJCVdoZW5ldmVyIHRoZSBEaWFtZXRlciBzZXJ2ZXIgZmFpbHMgdG8gcHJvY2VzcyB0aGUgRGlhbWV0ZXIgVUFSCisJCQltZXNzYWdlLCBpdCBNVVNUIHN0b3AgcHJvY2Vzc2luZyBhbmQgcmV0dXJuIHRoZSByZWxldmFudCBlcnJvciBpbiB0aGUKKwkJCURpYW1ldGVyIFVBQSBtZXNzYWdlLiAgV2hlbiB0aGVyZSBpcyBzdWNjZXNzIGluIHRoZSBwcm9jZXNzLCB0aGUKKwkJCURpYW1ldGVyIHNlcnZlciBNVVNUIHNldCB0aGUgY29kZSB0byBESUFNRVRFUl9TVUNDRVNTIGluIHRoZSBEaWFtZXRlcgorCQkJVUFBIG1lc3NhZ2UuCisKKwkJCUlmIHRoZSBEaWFtZXRlciBzZXJ2ZXIgcmVxdWlyZXMgYSBVc2VyLU5hbWUgQVZQIHZhbHVlIHRvIHByb2Nlc3MgdGhlCisJCQlEaWFtZXRlciBVQVIgcmVxdWVzdCwgYnV0IHRoZSBEaWFtZXRlciBVQVIgbWVzc2FnZSBkaWQgbm90IGNvbnRhaW4gYQorCQkJVXNlci1OYW1lIEFWUCB2YWx1ZSwgdGhlIERpYW1ldGVyIHNlcnZlciBNVVNUIHNldCB0aGUgUmVzdWx0LUNvZGUgQVZQCisJCQl2YWx1ZSB0byBESUFNRVRFUl9VU0VSX05BTUVfUkVRVUlSRUQgKHNlZSBTZWN0aW9uIDEwLjEuMikgYW5kIHJldHVybgorCQkJaXQgaW4gYSBEaWFtZXRlciBVQUEgbWVzc2FnZS4gIFVwb24gcmVjZXB0aW9uIG9mIHRoaXMgRGlhbWV0ZXIgVUFBCisJCQltZXNzYWdlIHdpdGggdGhlIFJlc3VsdC1Db2RlIEFWUCB2YWx1ZSBzZXQgdG8KKwkJCURJQU1FVEVSX1VTRVJfTkFNRV9SRVFVSVJFRCwgdGhlIFNJUCBzZXJ2ZXIgdHlwaWNhbGx5IHJlcXVlc3RzCisJCQlhdXRoZW50aWNhdGlvbiBieSBzZW5kaW5nIGEgU0lQIDQwMSAoVW5hdXRob3JpemVkKSBvciBTSVAgNDA3IChQcm94eQorCQkJQXV0aGVudGljYXRpb24gUmVxdWlyZWQpIHJlc3BvbnNlIGJhY2sgdG8gdGhlIG9yaWdpbmF0b3IuCisKKwkJCVdoZW4gdGhlIGF1dGhvcml6YXRpb24gcHJvY2VkdXJlIHN1Y2NlZWRzLCB0aGUgRGlhbWV0ZXIgc2VydmVyCisJCQljb25zdHJ1Y3RzIGEgVXNlci1BdXRob3JpemF0aW9uLUFuc3dlciAoVUFBKSBtZXNzYWdlIHRoYXQgTVVTVAorCQkJaW5jbHVkZSAoMSkgdGhlIGFkZHJlc3Mgb2YgdGhlIFNJUCBzZXJ2ZXIgYWxyZWFkeSBhc3NpZ25lZCB0byB0aGUKKwkJCXVzZXIgbmFtZSwgKDIpIHRoZSBjYXBhYmlsaXRpZXMgbmVlZGVkIGJ5IHRoZSBTSVAgc2VydmVyIChEaWFtZXRlcgorCQkJY2xpZW50KSB0byBzZWxlY3QgYW5vdGhlciBTSVAgc2VydmVyIGZvciB0aGUgdXNlciwgb3IgKDMpIGEKKwkJCWNvbWJpbmF0aW9uIG9mIHRoZSBwcmV2aW91cyB0d28gb3B0aW9ucy4KKworCQkJSWYgdGhlIERpYW1ldGVyIHNlcnZlciBpcyBhbHJlYWR5IGF3YXJlIG9mIGEgU0lQIHNlcnZlciBhbGxvY2F0ZWQgdG8KKwkJCXRoZSB1c2VyLCB0aGUgRGlhbWV0ZXIgVUFBIG1lc3NhZ2UgY29udGFpbnMgdGhlIGFkZHJlc3Mgb2YgdGhhdCBTSVAKKwkJCXNlcnZlci4KKworCQkJVGhlIERpYW1ldGVyIFVBQSBtZXNzYWdlIGNvbnRhaW5zIHRoZSBjYXBhYmlsaXRpZXMgcmVxdWlyZWQgYnkgYSBTSVAKKwkJCXNlcnZlciB0byB0cmlnZ2VyIGFuZCBleGVjdXRlIHNlcnZpY2VzLiAgSXQgaXMgcmVxdWlyZWQgdGhhdCB0aGVzZQorCQkJY2FwYWJpbGl0aWVzIGFyZSBwcmVzZW50IGluIHRoZSBEaWFtZXRlciBVQUEgbWVzc2FnZSBkdWUgdG8gdGhlCisJCQlwb3NzaWJpbGl0eSB0aGF0IHRoZSBEaWFtZXRlciBjbGllbnQgKGluIHRoZSBTSVAgc2VydmVyKSBhbGxvY2F0ZXMgYQorCQkJZGlmZmVyZW50IFNJUCBzZXJ2ZXIgdG8gdHJpZ2dlciBhbmQgZXhlY3V0ZSBzZXJ2aWNlcyBmb3IgdGhhdAorCQkJcGFydGljdWxhciB1c2VyLgorCisJCQlJZiBhIFVzZXItTmFtZSBBVlAgaXMgcHJlc2VudCBpbiB0aGUgRGlhbWV0ZXIgVUFSIG1lc3NhZ2UsIHRoZW4gdGhlCisJCQlEaWFtZXRlciBzZXJ2ZXIgTVVTVCB2ZXJpZnkgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgdXNlciBpbiB0aGUgcmVhbG0sCisJCQlpLmUuLCB0aGUgVXNlci1OYW1lIEFWUCB2YWx1ZSBpcyBhIHZhbGlkIHVzZXIgd2l0aGluIHRoYXQgcmVhbG0uICBJZgorCQkJdGhlIERpYW1ldGVyIHNlcnZlciBkb2VzIG5vdCByZWNvZ25pemUgdGhlIHVzZXIgbmFtZSByZWNlaXZlZCBpbiB0aGUKKwkJCVVzZXItTmFtZSBBVlAsIHRoZSBEaWFtZXRlciBzZXJ2ZXIgTVVTVCBidWlsZCBhIERpYW1ldGVyIFVzZXItCisJCQlBdXRob3JpemF0aW9uLUFuc3dlciAoVUFBKSBtZXNzYWdlIGFuZCBNVVNUIHNldCB0aGUgUmVzdWx0LUNvZGUgQVZQCisJCQl0byBESUFNRVRFUl9FUlJPUl9VU0VSX1VOS05PV04uCisKKworCQkJSWYgYSBVc2VyLU5hbWUgQVZQIGlzIHByZXNlbnQgaW4gdGhlIERpYW1ldGVyIFVBUiBtZXNzYWdlLCB0aGVuIHRoZQorCQkJRGlhbWV0ZXIgc2VydmVyIE1VU1QgYXV0aG9yaXplIHRoYXQgVXNlci1OYW1lIEFWUCB2YWx1ZSBpcyBhYmxlIHRvCisJCQlyZWdpc3RlciB0aGUgU0lQIG9yIFNJUFMgVVJJIGluY2x1ZGVkIGluIHRoZSBTSVAtQU9SIEFWUC4gIElmIHRoaXMKKwkJCWF1dGhvcml6YXRpb24gZmFpbHMsIHRoZSBEaWFtZXRlciBzZXJ2ZXIgbXVzdCBzZXQgdGhlIFJlc3VsdC1Db2RlIEFWUAorCQkJdG8gRElBTUVURVJfRVJST1JfSURFTlRJVElFU19ET05UX01BVENIIGFuZCBzZW5kIGl0IGluIGEgRGlhbWV0ZXIKKwkJCVVzZXItQXV0aG9yaXphdGlvbi1BbnN3ZXIgKFVBQSkgbWVzc2FnZS4KKworCQkJTm90ZTogQ29ycmVsYXRpb24gYmV0d2VlbiBVc2VyLU5hbWUgYW5kIFNJUC1BT1IgQVZQIHZhbHVlcyBpcworCQkJcmVxdWlyZWQgaW4gb3JkZXIgdG8gYXZvaWQgcmVnaXN0cmF0aW9uIG9mIGEgU0lQLUFPUiBhbGxvY2F0ZWQgdG8KKwkJCWFub3RoZXIgdXNlci4KKworCQkJSWYgdGhlcmUgaXMgYSBTSVAtVmlzaXRlZC1OZXR3b3JrLUlkIEFWUCBpbiB0aGUgRGlhbWV0ZXIgVUFSIG1lc3NhZ2UsCisJCQlhbmQgdGhlIFNJUC1Vc2VyLUF1dGhvcml6YXRpb24tVHlwZSBBVlAgdmFsdWUgcmVjZWl2ZWQgaW4gdGhlCisJCQlEaWFtZXRlciBVQVIgbWVzc2FnZSBpcyBzZXQgdG8gUkVHSVNUUkFUSU9OIG9yIFJFR0lTVFJBVElPTiYKKwkJCUNBUEFCSUxJVElFUywgdGhlbiB0aGUgRGlhbWV0ZXIgc2VydmVyIFNIT1VMRCB2ZXJpZnkgd2hldGhlciB0aGUgdXNlcgorCQkJaXMgYWxsb3dlZCB0byByb2FtIGludG8gdGhlIG5ldHdvcmsgc3BlY2lmaWVkIGluIHRoZQorCQkJU0lQLVZpc2l0ZWQtTmV0d29yay1JZCBBVlAgaW4gdGhlIERpYW1ldGVyIFVBUiBtZXNzYWdlLiAgSWYgdGhlIHVzZXIKKwkJCWlzIG5vdCBhbGxvd2VkIHRvIHJvYW0gaW50byB0aGF0IG5ldHdvcmssIHRoZSBEaWFtZXRlciBBQUEgc2VydmVyCisJCQlNVVNUIHNldCB0aGUgUmVzdWx0LUNvZGUgQVZQIHZhbHVlIGluIHRoZSBEaWFtZXRlciBVQUEgbWVzc2FnZSB0bworCQkJRElBTUVURVJfRVJST1JfUk9BTUlOR19OT1RfQUxMT1dFRC4KKworCQkJSWYgdGhlIFNJUC1Vc2VyLUF1dGhvcml6YXRpb24tVHlwZSBBVlAgdmFsdWUgcmVjZWl2ZWQgaW4gdGhlIERpYW1ldGVyCisJCQlVQVIgbWVzc2FnZSBpcyBzZXQgdG8gUkVHSVNUUkFUSU9OIG9yIFJFR0lTVFJBVElPTiZDQVBBQklMSVRJRVMsIHRoZW4KKwkJCXRoZSBEaWFtZXRlciBzZXJ2ZXIgU0hPVUxEIHZlcmlmeSB3aGV0aGVyIHRoZSBTSVAtQU9SIEFWUCB2YWx1ZSBpcworCQkJYXV0aG9yaXplZCB0byByZWdpc3RlciBpbiB0aGUgSG9tZSBSZWFsbS4gIFdoZXJlIHRoZSBTSVAgQU9SIGlzIG5vdAorCQkJYXV0aG9yaXplZCB0byByZWdpc3RlciBpbiB0aGUgSG9tZSBSZWFsbSwgdGhlIERpYW1ldGVyIHNlcnZlciBNVVNUCisJCQlzZXQgdGhlIFJlc3VsdC1Db2RlIEFWUCB0byBESUFNRVRFUl9BVVRIT1JJWkFUSU9OX1JFSkVDVEVEIGFuZCBzZW5kCisJCQlpdCBpbiBhIERpYW1ldGVyIFVBQSBtZXNzYWdlLgorCisJCQlXaGVuIHRoZSBTSVAtVXNlci1BdXRob3JpemF0aW9uLVR5cGUgQVZQIGlzIG5vdCBwcmVzZW50IGluIHRoZQorCQkJRGlhbWV0ZXIgVUFSIG1lc3NhZ2UsIG9yIHdoZW4gaXQgaXMgcHJlc2VudCBhbmQgaXRzIHZhbHVlIGlzIHNldCB0bworCQkJUkVHSVNUUkFUSU9OLCB0aGVuOgorCisJCQlvICBJZiB0aGUgRGlhbWV0ZXIgc2VydmVyIGlzIG5vdCBhd2FyZSBvZiBhbnkgcHJldmlvdXMgcmVnaXN0cmF0aW9uCisJCQlvZiB0aGUgdXNlciBuYW1lIChpbmNsdWRpbmcgcmVnaXN0cmF0aW9ucyBvZiBvdGhlciBTSVAgQU9ScworCQkJYWxsb2NhdGVkIHRvIHRoZSBzYW1lIHVzZXIgbmFtZSksIHRoZW4gdGhlIERpYW1ldGVyIHNlcnZlciBkb2VzCisJCQlub3Qga25vdyBvZiBhbnkgU0lQIHNlcnZlciBhbGxvY2F0ZWQgdG8gdGhlIHVzZXIuICBJbiB0aGlzIGNhc2UsCisJCQl0aGUgRGlhbWV0ZXIgc2VydmVyIE1VU1Qgc2V0IHRoZSBSZXN1bHQtQ29kZSBBVlAgdmFsdWUgdG8KKwkJCURJQU1FVEVSX0ZJUlNUX1JFR0lTVFJBVElPTiBpbiB0aGUgRGlhbWV0ZXIgVUFBIG1lc3NhZ2UsIGFuZCB0aGUKKwkJCURpYW1ldGVyIHNlcnZlciBTSE9VTEQgaW5jbHVkZSB0aGUgcmVxdWlyZWQgU0lQIHNlcnZlcgorCQkJY2FwYWJpbGl0aWVzIGluIHRoZSBTSVAtU2VydmVyLUNhcGFiaWxpdGllcyBBVlAgdmFsdWUgaW4gdGhlCisJCQlEaWFtZXRlciBVQUEgbWVzc2FnZS4gIFRoZSBTSVAtU2VydmVyLUNhcGFiaWxpdGllcyBBVlAgYXNzaXN0cyB0aGUKKwkJCURpYW1ldGVyIGNsaWVudCAoU0lQIHNlcnZlcikgdG8gc2VsZWN0IGFuIGFwcHJvcHJpYXRlIFNJUCBzZXJ2ZXIKKwkJCWZvciB0aGUgdXNlciwgYWNjb3JkaW5nIHRvIHRoZSByZXF1aXJlZCBjYXBhYmlsaXRpZXMuCisKKwkJCW8gIEluIHNvbWUgY2FzZXMsIHRoZSBEaWFtZXRlciBzZXJ2ZXIgaXMgYXdhcmUgb2YgYSBwcmV2aW91c2x5CisJCQlhc3NpZ25lZCBTSVAgc2VydmVyIGZvciB0aGUgc2FtZSBvciBkaWZmZXJlbnQgU0lQIEFPUnMgYWxsb2NhdGVkCisJCQl0byB0aGUgc2FtZSB1c2VyIG5hbWUuICBJbiB0aGVzZSBjYXNlcywgcmUtYXNzaWdubWVudCBvZiBhIG5ldyBTSVAKKwkJCXNlcnZlciBtYXkgb3IgbWF5IG5vdCBiZSBuZWVkZWQsIGRlcGVuZGluZyBvbiB0aGUgY2FwYWJpbGl0aWVzIG9mCisJCQl0aGUgU0lQIHNlcnZlci4gIFRoZSBEaWFtZXRlciBzZXJ2ZXIgTVVTVCBhbHdheXMgaW5jbHVkZSB0aGUKKwkJCWFsbG9jYXRlZCBTSVAgc2VydmVyIFVSSSBpbiB0aGUgU0lQLVNlcnZlci1VUkkgQVZQIG9mIHRoZSBVQUEKKwkJCW1lc3NhZ2UuICBJZiB0aGUgRGlhbWV0ZXIgc2VydmVyIGRvZXMgbm90IHJldHVybiB0aGUgU0lQCisJCQljYXBhYmlsaXRpZXMsIHRoZSBEaWFtZXRlciBzZXJ2ZXIgTVVTVCBzZXQgdGhlIFJlc3VsdC1Db2RlIEFWUCBpbgorCQkJdGhlIERpYW1ldGVyIFVBQSBtZXNzYWdlIHRvIERJQU1FVEVSX1NVQlNFUVVFTlRfUkVHSVNUUkFUSU9OLgorCQkJT3RoZXJ3aXNlIChpLmUuLCBpZiB0aGUgRGlhbWV0ZXIgc2VydmVyIGluY2x1ZGVzIGEKKwkJCVNJUC1TZXJ2ZXItQ2FwYWJpbGl0aWVzIEFWUCksIHRoZW4gdGhlIERpYW1ldGVyIHNlcnZlciBNVVNUIHNldAorCQkJdGhlIFJlc3VsdC1Db2RlIEFWUCBpbiB0aGUgRGlhbWV0ZXIgVUFBIG1lc3NhZ2UgdG8KKwkJCURJQU1FVEVSX1NFUlZFUl9TRUxFQ1RJT04uICBUaGVuIHRoZSBEaWFtZXRlciBjbGllbnQgZGV0ZXJtaW5lcywKKwkJCWJhc2VkIG9uIHRoZSByZWNlaXZlZCBpbmZvcm1hdGlvbiwgd2hldGhlciBpdCBuZWVkcyB0byBzZWxlY3QgYQorCQkJbmV3IFNJUCBzZXJ2ZXIuCisKKwkJCVdoZW4gdGhlIFNJUC1Vc2VyLUF1dGhvcml6YXRpb24tVHlwZSBBVlAgdmFsdWUgcmVjZWl2ZWQgaW4gdGhlCisJCQlEaWFtZXRlciBVQVIgbWVzc2FnZSBpcyBzZXQgdG8gUkVHSVNUUkFUSU9OJkNBUEFCSUxJVElFUywgdGhlbgorCQkJRGlhbWV0ZXIgU2VydmVyIE1VU1QgcmV0dXJuIHRoZSBsaXN0IG9mIGNhcGFiaWxpdGllcyBpbiB0aGUKKwkJCVNJUC1TZXJ2ZXItQ2FwYWJpbGl0aWVzIEFWUCB2YWx1ZSBvZiB0aGUgRGlhbWV0ZXIgVUFBIG1lc3NhZ2UsIGl0CisJCQlNVVNUIHNldCB0aGUgUmVzdWx0LUNvZGUgdG8gRElBTUVURVJfU1VDQ0VTUywgYW5kIGl0IE1VU1QgTk9UIHJldHVybgorCQkJYSBTSVAtU2VydmVyLVVSSSBBVlAuICBUaGUgU0lQLVNlcnZlci1DYXBhYmlsaXRpZXMgQVZQIGVuYWJsZXMgdGhlCisJCQlTSVAgc2VydmVyIChEaWFtZXRlciBjbGllbnQpIHRvIHNlbGVjdCBhbm90aGVyIGFwcHJvcHJpYXRlIFNJUCBzZXJ2ZXIKKwkJCWZvciBpbnZva2luZyBhbmQgZXhlY3V0aW5nIHNlcnZpY2VzIGZvciB0aGUgdXNlciwgZGVwZW5kaW5nIG9uIHRoZQorCQkJcmVxdWlyZWQgY2FwYWJpbGl0aWVzLiAgVGhlIERpYW1ldGVyIHNlcnZlciBNQVkgbGVhdmUgdGhlIGxpc3Qgb2YKKwkJCWNhcGFiaWxpdGllcyBlbXB0eSB0byBpbmRpY2F0ZSB0aGF0IGFueSBTSVAgc2VydmVyIGNhbiBiZSBzZWxlY3RlZC4KKworCQkJV2hlbiB0aGUgU0lQLVVzZXItQXV0aG9yaXphdGlvbi1UeXBlIEFWUCB2YWx1ZSByZWNlaXZlZCBpbiB0aGUKKwkJCURpYW1ldGVyIFVBUiBtZXNzYWdlIGlzIHNldCB0byBERVJFR0lTVFJBVElPTiwgdGhlbjoKKworCQkJbyAgSWYgdGhlIERpYW1ldGVyIHNlcnZlciBpcyBhd2FyZSBvZiBhIFNJUCBzZXJ2ZXIgYXNzaWduZWQgdG8gdGhlCisJCQlTSVAgQU9SIHVuZGVyIGRlcmVnaXN0cmF0aW9uLCB0aGUgRGlhbWV0ZXIgc2VydmVyIE1VU1Qgc2V0IHRoZQorCQkJUmVzdWx0LUNvZGUgQVZQIHRvIERJQU1FVEVSX1NVQ0NFU1MgYW5kIE1VU1Qgc2V0IHRoZQorCQkJU0lQLVNlcnZlci1VUkkgQVZQIHZhbHVlIHRvIHRoZSBrbm93biBTSVAgc2VydmVyLCBhbmQgcmV0dXJuIHRoZW0KKwkJCWluIHRoZSBEaWFtZXRlciBVQUEgbWVzc2FnZS4KKworCQkJbyAgSWYgdGhlIERpYW1ldGVyIHNlcnZlciBpcyBub3QgYXdhcmUgb2YgYSBTSVAgc2VydmVyIGFzc2lnbmVkIHRvCisJCQl0aGUgU0lQIEFPUiB1bmRlciBkZXJlZ2lzdHJhdGlvbiwgdGhlbiB0aGUgRGlhbWV0ZXIgc2VydmVyIE1VU1QKKwkJCXNldCB0aGUgUmVzdWx0LUNvZGUgQVZQIGluIHRoZSBEaWFtZXRlciBVQUEgbWVzc2FnZSB0bworCQkJRElBTUVURVJfRVJST1JfSURFTlRJVFlfTk9UX1JFR0lTVEVSRUQuCisKKwkJCVRoZSBNZXNzYWdlIEZvcm1hdCBvZiB0aGUgVUFBIGNvbW1hbmQgaXMgYXMgZm9sbG93czoKKworCQkJPFVBQT4gOjo9IDwgRGlhbWV0ZXIgSGVhZGVyOiAyODMsIFBYWSA+CisJCQkJIDwgU2Vzc2lvbi1JZCA+CisJCQkJIHsgQXV0aC1BcHBsaWNhdGlvbi1JZCB9CisJCQkJIHsgQXV0aC1TZXNzaW9uLVN0YXRlIH0KKwkJCQkgeyBSZXN1bHQtQ29kZSB9CisJCQkJIHsgT3JpZ2luLUhvc3QgfQorCQkJCSB7IE9yaWdpbi1SZWFsbSB9CisJCQkJIFsgU0lQLVNlcnZlci1VUkkgXQorCQkJCSBbIFNJUC1TZXJ2ZXItQ2FwYWJpbGl0aWVzIF0KKwkJCQkgWyBBdXRob3JpemF0aW9uLUxpZmV0aW1lIF0KKwkJCQkgWyBBdXRoLUdyYWNlLVBlcmlvZCBdCisJCQkJIFsgUmVkaXJlY3QtSG9zdCBdCisJCQkJIFsgUmVkaXJlY3QtSG9zdC1Vc2FnZSBdCisJCQkJIFsgUmVkaXJlY3QtTWF4LUNhY2hlLVRpbWUgXQorCQkJICAgICAgICogWyBQcm94eS1JbmZvIF0KKwkJCSAgICAgICAqIFsgUm91dGUtUmVjb3JkIF0KKwkJCSAgICAgICAqIFsgQVZQIF0KKworCisJCQkqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogY21kOworCQkJc3RydWN0IGRpY3RfY21kX2RhdGEgZGF0YSA9IHsgCisJCQkJCTI4MywgCQkJCQkvKiBDb2RlICovCisJCQkJCSJVc2VyLUF1dGhvcml6YXRpb24tQW5zd2VyIiwgCQkvKiBOYW1lICovCisJCQkJCUNNRF9GTEFHX1JFUVVFU1QgfCBDTURfRkxBR19QUk9YSUFCTEUgfCBDTURfRkxBR19FUlJPUiwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUNNRF9GTEFHX1BST1hJQUJMRSAJCQkJCQkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQl9OworCQkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9IAorCQkJCQkJeyAJIHsgICJTZXNzaW9uLUlkIiwgCQlSVUxFX0ZJWEVEX0hFQUQsIC0xLCAxIH0KKwkJCQkJCSAJLHsgICJBdXRoLUFwcGxpY2F0aW9uLUlkIiwgCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkJCQkJIAkseyAgIkF1dGgtU2Vzc2lvbi1TdGF0ZSIsIAlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJCQkJCSAJLHsgICJSZXN1bHQtQ29kZSIsIAkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCQkJCQkgCSx7ICAiT3JpZ2luLUhvc3QiLCAJCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkJCQkJIAkseyAgIk9yaWdpbi1SZWFsbSIsIAkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCQkJCQkgCSx7ICAiU0lQLVNlcnZlci1VUkkiLCAJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJIAkseyAgIlNJUC1TZXJ2ZXItQ2FwYWJpbGl0aWVzIiwgCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJIAkseyAgIkF1dGhvcml6YXRpb24tTGlmZXRpbWUiLCAJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkgCSx7ICAiQXV0aC1HcmFjZS1QZXJpb2QiLCAJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkgCSx7ICAiUmVkaXJlY3QtSG9zdCIsIAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkgCSx7ICAiUmVkaXJlY3QtSG9zdC1Vc2FnZSIsIAlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCSAJLHsgICJSZWRpcmVjdC1NYXgtQ2FjaGUtVGltZSIsIAlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCSAJLHsgICJQcm94eS1JbmZvIiwgCQlSVUxFX09QVElPTkFMLCAgIC0xLCAtMSB9CisJCQkJCQkgCSx7ICAiUm91dGUtUmVjb3JkIiwgCQlSVUxFX09QVElPTkFMLCAgIC0xLCAtMSB9CisKKwkJCQkJCX07CisJCQkKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0NPTU1BTkQsICZkYXRhICwgc2lwLCAmY21kKTsKKwkJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGNtZCApOworCQl9CisJCQorCQkvKiBNdWx0aW1lZGlhLUF1dGgtUmVxdWVzdCAoTUFSKSBDb21tYW5kICovCisJCXsKKwkJCS8qCisJCQkKKwkJCVRoZSBNdWx0aW1lZGlhLUF1dGgtUmVxdWVzdCAoTUFSKSBjb21tYW5kIGlzIGluZGljYXRlZCBieSB0aGUKKwkJCUNvbW1hbmQtQ29kZSBzZXQgdG8gMjg2IGFuZCB0aGUgQ29tbWFuZCBGbGFncycgJ1InIGJpdCBzZXQuICBUaGUKKwkJCURpYW1ldGVyIGNsaWVudCBpbiBhIFNJUCBzZXJ2ZXIgc2VuZHMgdGhpcyBjb21tYW5kIHRvIHRoZSBEaWFtZXRlcgorCQkJc2VydmVyIHRvIHJlcXVlc3QgdGhhdCB0aGUgRGlhbWV0ZXIgc2VydmVyIGF1dGhlbnRpY2F0ZSBhbmQgYXV0aG9yaXplCisJCQlhIHVzZXIgYXR0ZW1wdCB0byB1c2Ugc29tZSBTSVAgc2VydmljZSAoaW4gdGhpcyBjb250ZXh0LCBTSVAgc2VydmljZQorCQkJY2FuIGJlIHNvbWV0aGluZyBhcyBzaW1wbGUgYXMgYSBTSVAgc3Vic2NyaXB0aW9uIG9yIHVzaW5nIHRoZSBwcm94eQorCQkJc2VydmljZXMgZm9yIGEgU0lQIHJlcXVlc3QpLgorCisJCQlUaGUgTUFSIGNvbW1hbmQgbWF5IGFsc28gcmVnaXN0ZXIgdGhlIFNJUCBzZXJ2ZXIncyBvd24gVVJJIHRvIHRoZQorCQkJRGlhbWV0ZXIgc2VydmVyLCBzbyB0aGF0IGZ1dHVyZSBMSVIvTElBIG1lc3NhZ2VzIGNhbiByZXR1cm4gdGhpcyBVUkkuCisJCQlJZiB0aGUgU0lQIHNlcnZlciBpcyBhY3RpbmcgYXMgYSBTSVAgcmVnaXN0cmFyIChzZWUgZXhhbXBsZXMgaW4KKwkJCVNlY3Rpb25zIDYuMiBhbmQgNi4zKSwgaXRzIERpYW1ldGVyIGNsaWVudCBNVVNUIGluY2x1ZGUgYSBTSVAtCisJCQlTZXJ2ZXItVVJJIEFWUCBpbiB0aGUgTUFSIGNvbW1hbmQuICBJbiBhbnkgb3RoZXIgY2FzZXMgKHNlZSBleGFtcGxlCisJCQlpbiBTZWN0aW9uIDYuNCksIGl0cyBEaWFtZXRlciBjbGllbnQgTVVTVCBOT1QgaW5jbHVkZSBhIFNJUC1TZXJ2ZXItCisJCQlVUkkgQVZQIGluIHRoZSBNQVIgY29tbWFuZC4KKworCQkJVGhlIFNJUC1NZXRob2QgQVZQIE1VU1QgaW5jbHVkZSB0aGUgU0lQIG1ldGhvZCBuYW1lIG9mIHRoZSBTSVAKKwkJCXJlcXVlc3QgdGhhdCB0cmlnZ2VyZWQgdGhpcyBEaWFtZXRlciBNQVIgbWVzc2FnZS4gIFRoZSBEaWFtZXRlcgorCQkJc2VydmVyIGNhbiB1c2UgdGhpcyBBVlAgdG8gYXV0aG9yaXplIHNvbWUgU0lQIHJlcXVlc3RzIGRlcGVuZGluZyBvbgorCQkJdGhlIG1ldGhvZC4KKworCQkJVGhlIERpYW1ldGVyIE1BUiBtZXNzYWdlIE1VU1QgaW5jbHVkZSBhIFNJUC1BT1IgQVZQLiAgVGhlIFNJUC1BT1IgQVZQCisJCQlpbmRpY2F0ZXMgdGhlIHRhcmdldCBvZiB0aGUgU0lQIHJlcXVlc3QuICBUaGUgdmFsdWUgb2YgdGhlIEFWUCBpcworCQkJZXh0cmFjdGVkIGZyb20gZGlmZmVyZW50IHBsYWNlcyBpbiBTSVAgcmVxdWVzdCwgZGVwZW5kaW5nIG9uIHRoZQorCQkJc2VtYW50aWNzIG9mIHRoZSBTSVAgcmVxdWVzdC4gIEZvciBTSVAgUkVHSVNURVIgbWVzc2FnZXMgdGhlIFNJUC1BT1IKKwkJCUFWUCB2YWx1ZSBpbmRpY2F0ZXMgdGhlIGludGVuZGVkIHB1YmxpYyB1c2VyIGlkZW50aXR5IHVuZGVyCisJCQlyZWdpc3RyYXRpb24sIGFuZCBpdCBpcyB0aGUgU0lQIG9yIFNJUFMgVVJJIHBvcHVsYXRlZCBpbiB0aGUgVG8KKwkJCWhlYWRlciBmaWVsZCB2YWx1ZSAoYWRkci1zcGVjIGFzIHBlciBSRkMgMzI2MSBbUkZDMzI2MV0pIG9mIHRoZSBTSVAKKwkJCVJFR0lTVEVSIHJlcXVlc3QuICBGb3Igb3RoZXIgdHlwZXMgb2YgU0lQIHJlcXVlc3RzLCBzdWNoIGFzIElOVklURSwKKwkJCVNVQlNDUklCRSwgTUVTU0FHRSwgZXRjLiwgdGhlIFNJUC1BT1IgQVZQIHZhbHVlIGluZGljYXRlcyB0aGUKKwkJCWludGVuZGVkIGRlc3RpbmF0aW9uIG9mIHRoZSByZXF1ZXN0LiAgVGhpcyBpcyB0eXBpY2FsbHkgcG9wdWxhdGVkIGluCisJCQl0aGUgUmVxdWVzdC1VUkkgb2YgdGhlIFNJUCByZXF1ZXN0LiAgRXh0cmFjdGluZyB0aGUgU0lQLUFPUiBBVlAgdmFsdWUKKwkJCWZyb20gdGhlIHByb3BlciBTSVAgaGVhZGVyIGZpZWxkIGlzIHRoZSBEaWFtZXRlciBjbGllbnQncworCQkJcmVzcG9uc2liaWxpdHkuICBFeHRlbnNpb25zIHRvIFNJUCAobmV3IFNJUCBtZXRob2RzIG9yIG5ldyBzZW1hbnRpY3MpCisJCQltYXkgcmVxdWlyZSB0aGUgU0lQLUFPUiB0byBiZSBleHRyYWN0ZWQgZnJvbSBvdGhlciBwYXJ0cyBvZiB0aGUKKwkJCXJlcXVlc3QuCisKKwkJCUlmIHRoZSBTSVAgcmVxdWVzdCBpbmNsdWRlcyBzb21lIHNvcnQgb2YgYXV0aGVudGljYXRpb24gaW5mb3JtYXRpb24sCisJCQl0aGUgRGlhbWV0ZXIgY2xpZW50IE1VU1QgaW5jbHVkZSB0aGUgdXNlciBuYW1lLCBleHRyYWN0ZWQgZnJvbSB0aGUKKwkJCWF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uIG9mIHRoZSBTSVAgcmVxdWVzdCwgaW4gdGhlIFVzZXItTmFtZSBBVlAKKwkJCXZhbHVlLgorCisJCQlUaGUgTWVzc2FnZSBGb3JtYXQgb2YgdGhlIE1BUiBjb21tYW5kIGlzIGFzIGZvbGxvd3M6CisKKwkJCTxNQVI+IDo6PSA8IERpYW1ldGVyIEhlYWRlcjogMjg2LCBSRVEsIFBYWSA+CisJCQkJIDwgU2Vzc2lvbi1JZCA+CisJCQkJIHsgQXV0aC1BcHBsaWNhdGlvbi1JZCB9CisJCQkJIHsgQXV0aC1TZXNzaW9uLVN0YXRlIH0KKwkJCQkgeyBPcmlnaW4tSG9zdCB9CisJCQkJIHsgT3JpZ2luLVJlYWxtIH0KKwkJCQkgeyBEZXN0aW5hdGlvbi1SZWFsbSB9CisJCQkJIHsgU0lQLUFPUiB9CisJCQkJIHsgU0lQLU1ldGhvZCB9CisJCQkJIFsgRGVzdGluYXRpb24tSG9zdCBdCisJCQkJIFsgVXNlci1OYW1lIF0KKwkJCQkgWyBTSVAtU2VydmVyLVVSSSBdCisJCQkJIFsgU0lQLU51bWJlci1BdXRoLUl0ZW1zIF0KKwkJCQkgWyBTSVAtQXV0aC1EYXRhLUl0ZW0gXQorCQkJICAgICAgICogWyBQcm94eS1JbmZvIF0KKwkJCSAgICAgICAqIFsgUm91dGUtUmVjb3JkIF0KKwkJCSAgICAgICAqIFsgQVZQIF0KKworCisKKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBjbWQ7CisJCQlzdHJ1Y3QgZGljdF9jbWRfZGF0YSBkYXRhID0geyAKKwkJCQkJMjg2LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJIk11bHRpbWVkaWEtQXV0aC1SZXF1ZXN0IiwgCQkvKiBOYW1lICovCisJCQkJCUNNRF9GTEFHX1JFUVVFU1QgfCBDTURfRkxBR19QUk9YSUFCTEUgfCBDTURfRkxBR19FUlJPUiwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUNNRF9GTEFHX1JFUVVFU1QgfCBDTURfRkxBR19QUk9YSUFCTEUgCQkJCQkJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJfTsKKwkJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPSAKKwkJCQkJCXsgCSB7ICAiU2Vzc2lvbi1JZCIsIAkJUlVMRV9GSVhFRF9IRUFELCAtMSwgMSB9CisJCQkJCQkgCSx7ICAiQXV0aC1BcHBsaWNhdGlvbi1JZCIsIAlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJCQkJCSAJLHsgICJBdXRoLVNlc3Npb24tU3RhdGUiLCAJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCQkJCQkgCSx7ICAiT3JpZ2luLUhvc3QiLCAJCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkJCQkJIAkseyAgIk9yaWdpbi1SZWFsbSIsIAkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCQkJCQkgCSx7ICAiRGVzdGluYXRpb24tUmVhbG0iLAlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJCQkJCSAJLHsgICJTSVAtQU9SIiwgCQkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCQkJCQkgCSx7ICAiU0lQLU1ldGhvZCIsIAkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCQkJCQkgCSx7ICAiRGVzdGluYXRpb24tSG9zdCIsIAlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCSAJLHsgICJVc2VyLU5hbWUiLCAJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJIAkseyAgIlNJUC1TZXJ2ZXItVVJJIiwgCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCSAJLHsgICJTSVAtTnVtYmVyLUF1dGgtSXRlbXMiLCAJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkgCSx7ICAiU0lQLUF1dGgtRGF0YS1JdGVtIiwgCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJIAkseyAgIlByb3h5LUluZm8iLCAJCVJVTEVfT1BUSU9OQUwsICAgLTEsIC0xIH0KKwkJCQkJCSAJLHsgICJSb3V0ZS1SZWNvcmQiLCAJCVJVTEVfT1BUSU9OQUwsICAgLTEsIC0xIH0KKworCQkJCQkJfTsKKwkJCQorCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQ09NTUFORCwgJmRhdGEgLCBzaXAsICZjbWQpOworCQkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgY21kICk7CisJCX0KKwkJLyogTXVsdGltZWRpYS1BdXRoLUFuc3dlciAoTUFBKSBDb21tYW5kICovCisJCXsKKwkJCS8qCisJCQkKKwkJCVRoZSBNdWx0aW1lZGlhLUF1dGgtQW5zd2VyIChNQUEpIGlzIGluZGljYXRlZCBieSB0aGUgQ29tbWFuZC1Db2RlIHNldAorCQkJdG8gMjg2IGFuZCB0aGUgQ29tbWFuZCBGbGFncycgJ1InIGJpdCBjbGVhcmVkLiAgVGhlIERpYW1ldGVyIHNlcnZlcgorCQkJc2VuZHMgdGhpcyBjb21tYW5kIGluIHJlc3BvbnNlIHRvIGEgcHJldmlvdXNseSByZWNlaXZlZCBEaWFtZXRlcgorCQkJTXVsdGltZWRpYS1BdXRoLVJlcXVlc3QgKE1BUikgY29tbWFuZC4KKworCQkJSW4gYWRkaXRpb24gdG8gdGhlIHZhbHVlcyBhbHJlYWR5IGRlZmluZWQgaW4gUkZDIDM1ODggW1JGQzM1ODhdLCB0aGUKKwkJCVJlc3VsdC1Db2RlIEFWUCBtYXkgY29udGFpbiBvbmUgb2YgdGhlIHZhbHVlcyBkZWZpbmVkIGluCisJCQlTZWN0aW9uIDEwLjEuCisKKwkJCUlmIHRoZSBEaWFtZXRlciBzZXJ2ZXIgcmVxdWlyZXMgYSBVc2VyLU5hbWUgQVZQIHZhbHVlIHRvIHByb2Nlc3MgdGhlCisJCQlEaWFtZXRlciBNQVIgcmVxdWVzdCwgYnV0IHRoZSBEaWFtZXRlciBNQVIgbWVzc2FnZSBkaWQgbm90IGNvbnRhaW4gYQorCQkJVXNlci1OYW1lIEFWUCB2YWx1ZSwgdGhlIERpYW1ldGVyIHNlcnZlciBNVVNUIHNldCB0aGUgUmVzdWx0LUNvZGUgQVZQCisJCQl2YWx1ZSB0byBESUFNRVRFUl9VU0VSX05BTUVfUkVRVUlSRUQgKHNlZSBTZWN0aW9uIDEwLjEuMikgYW5kIHJldHVybgorCQkJaXQgaW4gYSBEaWFtZXRlciBNQUEgbWVzc2FnZS4gIFRoZSBEaWFtZXRlciBzZXJ2ZXIgTUFZIGluY2x1ZGUgYQorCQkJU0lQLU51bWJlci1BdXRoLUl0ZW1zIEFWUCBhbmQgb25lIG9yIG1vcmUgU0lQLUF1dGgtRGF0YS1JdGVtIEFWUHMKKwkJCXdpdGggYXV0aGVudGljYXRpb24gaW5mb3JtYXRpb24gKGUuZy4sIGEgY2hhbGxlbmdlKS4gIFVwb24gcmVjZXB0aW9uCisJCQlvZiB0aGlzIERpYW1ldGVyIE1BQSBtZXNzYWdlIHdpdGggdGhlIFJlc3VsdC1Db2RlIEFWUCB2YWx1ZSBzZXQgdG8KKwkJCURJQU1FVEVSX1VTRVJfTkFNRV9SRVFVSVJFRCwgdGhlIFNJUCBzZXJ2ZXIgdHlwaWNhbGx5IHJlcXVlc3RzCisJCQlhdXRoZW50aWNhdGlvbiBieSBnZW5lcmF0aW5nIGEgU0lQIDQwMSAoVW5hdXRob3JpemVkKSBvciBTSVAgNDA3CisJCQkoUHJveHkgQXV0aGVudGljYXRpb24gUmVxdWlyZWQpIHJlc3BvbnNlIGJhY2sgdG8gdGhlIG9yaWdpbmF0b3IuCisKKwkJCUlmIHRoZSBVc2VyLU5hbWUgQVZQIGlzIHByZXNlbnQgaW4gdGhlIERpYW1ldGVyIE1BUiBtZXNzYWdlLCB0aGUKKwkJCURpYW1ldGVyIHNlcnZlciBNVVNUIHZlcmlmeSB0aGUgZXhpc3RlbmNlIG9mIHRoZSB1c2VyIGluIHRoZSByZWFsbSwKKwkJCWkuZS4sIHRoZSBVc2VyLU5hbWUgQVZQIHZhbHVlIGlzIGEgdmFsaWQgdXNlciB3aXRoaW4gdGhhdCByZWFsbS4gIElmCisJCQl0aGUgRGlhbWV0ZXIgc2VydmVyIGRvZXMgbm90IHJlY29nbml6ZSB0aGUgdXNlciBuYW1lIHJlY2VpdmVkIGluIHRoZQorCQkJVXNlci1OYW1lIEFWUCwgdGhlIERpYW1ldGVyIHNlcnZlciBNVVNUIGJ1aWxkIGEgRGlhbWV0ZXIKKwkJCU11bHRpbWVkaWEtQXV0aC1BbnN3ZXIgKE1BQSkgbWVzc2FnZSBhbmQgTVVTVCBzZXQgdGhlIFJlc3VsdC1Db2RlIEFWUAorCQkJdG8gRElBTUVURVJfRVJST1JfVVNFUl9VTktOT1dOLgorCisJCQlJZiB0aGUgU0lQLU1ldGhvZHMgQVZQIHZhbHVlIG9mIHRoZSBEaWFtZXRlciBNQVIgbWVzc2FnZSBpcyBzZXQgdG8KKwkJCVJFR0lTVEVSIGFuZCBhIFVzZXItTmFtZSBBVlAgaXMgcHJlc2VudCwgdGhlbiB0aGUgRGlhbWV0ZXIgc2VydmVyCisJCQlNVVNUIGF1dGhvcml6ZSB0aGF0IFVzZXItTmFtZSBBVlAgdmFsdWUgaXMgYWJsZSB0byB1c2UgdGhlIFVSSQorCQkJaW5jbHVkZWQgaW4gdGhlIFNJUC1BT1IgQVZQLiAgSWYgdGhpcyBhdXRob3JpemF0aW9uIGZhaWxzLCB0aGUKKwkJCURpYW1ldGVyIHNlcnZlciBtdXN0IHNldCB0aGUgUmVzdWx0LUNvZGUgQVZQIHRvCisJCQlESUFNRVRFUl9FUlJPUl9JREVOVElUSUVTX0RPTlRfTUFUQ0ggYW5kIHNlbmQgaXQgaW4gYSBEaWFtZXRlcgorCQkJTXVsdGltZWRpYS1BdXRoLUFuc3dlciAoTUFBKSBtZXNzYWdlLgorCisJCQlOb3RlOiBDb3JyZWxhdGlvbiBiZXR3ZWVuIFVzZXItTmFtZSBhbmQgU0lQLUFPUiBBVlAgdmFsdWVzIGlzIG9ubHkKKwkJCXJlcXVpcmVkIGZvciBTSVAgUkVHSVNURVIgcmVxdWVzdCwgdG8gcHJldmVudCBhIHVzZXIgZnJvbQorCQkJcmVnaXN0ZXJpbmcgYSBTSVAtQU9SIGFsbG9jYXRlZCB0byBhbm90aGVyIHVzZXIuICBJbiBvdGhlciB0eXBlcworCQkJb2YgU0lQIHJlcXVlc3RzIChlLmcuLCBJTlZJVEUpLCB0aGUgU0lQLUFPUiBpbmRpY2F0ZXMgdGhlIGludGVuZGVkCisJCQlkZXN0aW5hdGlvbiBvZiB0aGUgcmVxdWVzdCwgcmF0aGVyIHRoYW4gdGhlIG9yaWdpbmF0b3Igb2YgaXQuCisKKwkJCVRoZSBEaWFtZXRlciBzZXJ2ZXIgTVVTVCB2ZXJpZnkgd2hldGhlciB0aGUgYXV0aGVudGljYXRpb24gc2NoZW1lCisJCQkoU0lQLUF1dGhlbnRpY2F0aW9uLVNjaGVtZSBBVlAgdmFsdWUpIGluZGljYXRlZCBpbiB0aGUgZ3JvdXBlZAorCQkJU0lQLUF1dGgtRGF0YS1JdGVtIEFWUCBpcyBzdXBwb3J0ZWQgb3Igbm90LiAgSWYgdGhhdCBhdXRoZW50aWNhdGlvbgorCQkJc2NoZW1lIGlzIG5vdCBzdXBwb3J0ZWQsIHRoZW4gdGhlIERpYW1ldGVyIHNlcnZlciBNVVNUIHNldCB0aGUKKwkJCVJlc3VsdC1Db2RlIEFWUCB0byBESUFNRVRFUl9FUlJPUl9BVVRIX1NDSEVNRV9OT1RfU1VQUE9SVEVEIGFuZCBzZW5kCisJCQlpdCBpbiBhIERpYW1ldGVyIE11bHRpbWVkaWEtQXV0aC1BbnN3ZXIgKE1BQSkgbWVzc2FnZS4KKworCQkJSWYgdGhlIFNJUC1OdW1iZXItQXV0aC1JdGVtcyBBVlAgaXMgcHJlc2VudCBpbiB0aGUgRGlhbWV0ZXIgTUFSCisJCQltZXNzYWdlLCBpdCBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBhdXRoZW50aWNhdGlvbiBkYXRhIGl0ZW1zIHRoYXQKKwkJCXRoZSBEaWFtZXRlciBjbGllbnQgaXMgcmVxdWVzdGluZy4gIEl0IGlzIFJFQ09NTUVOREVEIHRoYXQgdGhlCisJCQlEaWFtZXRlciBzZXJ2ZXIsIHdoZW4gYnVpbGRpbmcgdGhlIERpYW1ldGVyIE1BQSBtZXNzYWdlLCBpbmNsdWRlcyBhCisJCQludW1iZXIgb2YgU0lQLUF1dGgtRGF0YS1JdGVtIEFWUHMgdGhhdCBhcmUgYSBzdWJzZXQgb2YgdGhlCisJCQlhdXRoZW50aWNhdGlvbiBkYXRhIGl0ZW1zIHJlcXVlc3RlZCBieSB0aGUgRGlhbWV0ZXIgY2xpZW50IGluIHRoZQorCQkJU0lQLU51bWJlci1BdXRoLUl0ZW1zIEFWUCB2YWx1ZSBvZiB0aGUgRGlhbWV0ZXIgTUFSIG1lc3NhZ2UuCisKKwkJCUlmIHRoZSBTSVAtU2VydmVyLVVSSSBBVlAgaXMgcHJlc2VudCBpbiB0aGUgRGlhbWV0ZXIgTUFSIG1lc3NhZ2UsCisJCQl0aGVuIHRoZSBEaWFtZXRlciBzZXJ2ZXIgTVVTVCBjb21wYXJlIHRoZSBzdG9yZWQgU0lQIHNlcnZlciAoYXNzaWduZWQKKwkJCXRvIHRoZSB1c2VyKSB3aXRoIHRoZSBTSVAtU2VydmVyLVVSSSBBVlAgdmFsdWUgKHJlY2VpdmVkIGluIHRoZQorCQkJRGlhbWV0ZXIgTUFSIG1lc3NhZ2UpLiAgSWYgdGhleSBkb24ndCBtYXRjaCwgdGhlIERpYW1ldGVyIHNlcnZlciBNVVNUCisJCQl0ZW1wb3JhcmlseSBzYXZlIHRoZSBuZXdseSByZWNlaXZlZCBTSVAgc2VydmVyIGFzc2lnbmVkIHRvIHRoZSB1c2VyLAorCQkJYW5kIE1VU1Qgc2V0IGFuICJhdXRoZW50aWNhdGlvbiBwZW5kaW5nIiBmbGFnIGZvciB0aGUgdXNlci4gIElmIHRoZXkKKwkJCW1hdGNoLCB0aGUgRGlhbWV0ZXIgc2VydmVyIHNoYWxsIGNsZWFyIHRoZSAiYXV0aGVudGljYXRpb24gcGVuZGluZyIKKwkJCWZsYWcgZm9yIHRoZSB1c2VyLgorCisJCQlJbiBhbnkgb3RoZXIgc2l0dWF0aW9uLCBpZiB0aGVyZSBpcyBhIHN1Y2Nlc3MgaW4gcHJvY2Vzc2luZyB0aGUKKwkJCURpYW1ldGVyIE1BUiBjb21tYW5kIGFuZCB0aGUgRGlhbWV0ZXIgc2VydmVyIHN0b3JlZCB0aGUKKwkJCVNJUC1TZXJ2ZXItVVJJLCB0aGUgRGlhbWV0ZXIgc2VydmVyIE1VU1Qgc2V0IHRoZSBSZXN1bHQtQ29kZSBBVlAKKwkJCXZhbHVlIHRvIERJQU1FVEVSX1NVQ0NFU1MgYW5kIHJldHVybiBpdCBpbiBhIERpYW1ldGVyIE1BQSBtZXNzYWdlLgorCisJCQlJZiB0aGVyZSBpcyBhIHN1Y2Nlc3MgaW4gcHJvY2Vzc2luZyB0aGUgRGlhbWV0ZXIgTUFSIGNvbW1hbmQsIGJ1dCB0aGUKKwkJCURpYW1ldGVyIHNlcnZlciBkb2VzIG5vdCBzdG9yZSB0aGUgU0lQLVNlcnZlci1VUkkgYmVjYXVzZSB0aGUgQVZQIHdhcworCQkJbm90IHByZXNlbnQgaW4gdGhlIERpYW1ldGVyIE1BUiBjb21tYW5kLCB0aGVuIHRoZSBEaWFtZXRlciBzZXJ2ZXIKKwkJCU1VU1Qgc2V0IHRoZSBSZXN1bHQtQ29kZSBBVlAgdmFsdWUgdG8gZWl0aGVyOgorCisJCQkxLiAgRElBTUVURVJfU1VDQ0VTU19BVVRIX1NFTlRfU0VSVkVSX05PVF9TVE9SRUQsIGlmIHRoZSBEaWFtZXRlcgorCQkJc2VydmVyIGlzIHNlbmRpbmcgYXV0aGVudGljYXRpb24gY3JlZGVudGlhbHMgdG8gY3JlYXRlIGEKKwkJCWNoYWxsZW5nZS4KKworCQkJMi4gIERJQU1FVEVSX1NVQ0NFU1NfU0VSVkVSX05BTUVfTk9UX1NUT1JFRCwgaWYgdGhlIERpYW1ldGVyIHNlcnZlcgorCQkJc3VjY2Vzc2Z1bGx5IGF1dGhlbnRpY2F0ZWQgdGhlIHVzZXIgYW5kIGF1dGhvcml6ZWQgdGhlIFNJUCBzZXJ2ZXIKKwkJCXRvIHByb2NlZWQgd2l0aCB0aGUgU0lQIHJlcXVlc3QuCisKKwkJCU90aGVyd2lzZSwgdGhlIERpYW1ldGVyIHNlcnZlciBNVVNUIHNldCB0aGUgUmVzdWx0LUNvZGUgQVZQIHZhbHVlIHRvCisJCQlESUFNRVRFUl9VTkFCTEVfVE9fQ09NUExZLCBhbmQgaXQgTVVTVCBOT1QgaW5jbHVkZSBhbnkKKwkJCVNJUC1BdXRoLURhdGEtSXRlbSBBVlAuCisKKwkJCVRoZSBNZXNzYWdlIEZvcm1hdCBvZiB0aGUgTUFBIGNvbW1hbmQgaXMgYXMgZm9sbG93czoKKworCQkJPE1BQT4gOjo9IDwgRGlhbWV0ZXIgSGVhZGVyOiAyODYsIFBYWSA+CisJCQkJIDwgU2Vzc2lvbi1JZCA+CisJCQkJIHsgQXV0aC1BcHBsaWNhdGlvbi1JZCB9CisJCQkJIHsgUmVzdWx0LUNvZGUgfQorCQkJCSB7IEF1dGgtU2Vzc2lvbi1TdGF0ZSB9CisJCQkJIHsgT3JpZ2luLUhvc3QgfQorCQkJCSB7IE9yaWdpbi1SZWFsbSB9CisJCQkJIFsgVXNlci1OYW1lIF0KKwkJCQkgWyBTSVAtQU9SIF0KKwkJCQkgWyBTSVAtTnVtYmVyLUF1dGgtSXRlbXMgXQorCQkJICAgICAgICogWyBTSVAtQXV0aC1EYXRhLUl0ZW0gXQorCQkJCSBbIEF1dGhvcml6YXRpb24tTGlmZXRpbWUgXQorCQkJCSBbIEF1dGgtR3JhY2UtUGVyaW9kIF0KKwkJCQkgWyBSZWRpcmVjdC1Ib3N0IF0KKwkJCQkgWyBSZWRpcmVjdC1Ib3N0LVVzYWdlIF0KKwkJCQkgWyBSZWRpcmVjdC1NYXgtQ2FjaGUtVGltZSBdCisJCQkgICAgICAgKiBbIFByb3h5LUluZm8gXQorCQkJICAgICAgICogWyBSb3V0ZS1SZWNvcmQgXQorCQkJICAgICAgICogWyBBVlAgXQorCisJCQkqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogY21kOworCQkJc3RydWN0IGRpY3RfY21kX2RhdGEgZGF0YSA9IHsgCisJCQkJCTI4NiwgCQkJCQkvKiBDb2RlICovCisJCQkJCSJNdWx0aW1lZGlhLUF1dGgtQW5zd2VyIiwgCQkvKiBOYW1lICovCisJCQkJCUNNRF9GTEFHX1JFUVVFU1QgfCBDTURfRkxBR19QUk9YSUFCTEUgfCBDTURfRkxBR19FUlJPUiwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUNNRF9GTEFHX1BST1hJQUJMRSAJCQkJCQkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQl9OworCQkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9IAorCQkJCQkJeyAJIHsgICJTZXNzaW9uLUlkIiwgCQlSVUxFX0ZJWEVEX0hFQUQsIC0xLCAxIH0KKwkJCQkJCSAJLHsgICJBdXRoLUFwcGxpY2F0aW9uLUlkIiwgCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkJCQkJIAkseyAgIlJlc3VsdC1Db2RlIiwgCQlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJCQkJCSAJLHsgICJBdXRoLVNlc3Npb24tU3RhdGUiLCAJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCQkJCQkgCSx7ICAiT3JpZ2luLUhvc3QiLCAJCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkJCQkJIAkseyAgIk9yaWdpbi1SZWFsbSIsIAkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCQkJCQkgCSx7ICAiVXNlci1OYW1lIiwgCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCSAJLHsgICJTSVAtQU9SIiwgCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkgCSx7ICAiU0lQLU51bWJlci1BdXRoLUl0ZW1zIiwgCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJIAkseyAgIlNJUC1BdXRoLURhdGEtSXRlbSIsIAlSVUxFX09QVElPTkFMLCAgIC0xLCAtMSB9CisJCQkJCQkgCSx7ICAiQXV0aG9yaXphdGlvbi1MaWZldGltZSIsIAlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCSAJLHsgICJBdXRoLUdyYWNlLVBlcmlvZCIsIAlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCSAJLHsgICJSZWRpcmVjdC1Ib3N0IiwgCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCSAJLHsgICJSZWRpcmVjdC1Ib3N0LVVzYWdlIiwgCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJIAkseyAgIlJlZGlyZWN0LU1heC1DYWNoZS1UaW1lIiwgCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJIAkseyAgIlByb3h5LUluZm8iLCAJCVJVTEVfT1BUSU9OQUwsICAgLTEsIC0xIH0KKwkJCQkJCSAJLHsgICJSb3V0ZS1SZWNvcmQiLCAJCVJVTEVfT1BUSU9OQUwsICAgLTEsIC0xIH0KKworCQkJCQkJfTsKKwkJCQorCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQ09NTUFORCwgJmRhdGEgLCBzaXAsICZjbWQpOworCQkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgY21kICk7CisJCX0KKwkJLyogU2VydmVyLUFzc2lnbm1lbnQtUmVxdWVzdCAoU0FSKSBDb21tYW5kICovCisJCXsKKwkJCS8qCisJCQkKKwkJCVRoZSBTZXJ2ZXItQXNzaWdubWVudC1SZXF1ZXN0IChTQVIpIGNvbW1hbmQgaXMgaW5kaWNhdGVkIGJ5IHRoZQorCQkJQ29tbWFuZC1Db2RlIHNldCB0byAyODQgYW5kIHRoZSBDb21tYW5kIEZsYWdzJyAnUicgYml0IHNldC4gIFRoZQorCQkJRGlhbWV0ZXIgY2xpZW50IGluIGEgU0lQIHNlcnZlciBzZW5kcyB0aGlzIGNvbW1hbmQgdG8gdGhlIERpYW1ldGVyCisJCQlzZXJ2ZXIgdG8gaW5kaWNhdGUgdGhlIGNvbXBsZXRpb24gb2YgdGhlIGF1dGhlbnRpY2F0aW9uIHByb2Nlc3MgYW5kCisJCQl0byByZXF1ZXN0IHRoYXQgdGhlIERpYW1ldGVyIHNlcnZlciBzdG9yZSB0aGUgVVJJIG9mIHRoZSBTSVAgc2VydmVyCisJCQl0aGF0IGlzIGN1cnJlbnRseSBzZXJ2aW5nIHRoZSB1c2VyLiAgVGhlIG1haW4gZnVuY3Rpb25zIG9mIHRoZQorCQkJRGlhbWV0ZXIgU0FSIGNvbW1hbmQgYXJlIHRvIGluZm9ybSB0aGUgRGlhbWV0ZXIgc2VydmVyIG9mIHRoZSBVUkkgb2YKKwkJCXRoZSBTSVAgc2VydmVyIGFsbG9jYXRlZCB0byB0aGUgdXNlciwgYW5kIHRvIHN0b3JlIG9yIGNsZWFyIGl0IGZyb20KKwkJCXRoZSBEaWFtZXRlciBzZXJ2ZXIuICBBZGRpdGlvbmFsbHksIHRoZSBEaWFtZXRlciBjbGllbnQgY2FuIHJlcXVlc3QKKwkJCXRvIGRvd25sb2FkIHRoZSB1c2VyIHByb2ZpbGUgb3IgcGFydCBvZiBpdC4KKworCQkJRHVyaW5nIHRoZSByZWdpc3RyYXRpb24gcHJvY2VkdXJlLCBhIFNJUCBzZXJ2ZXIgYmVjb21lcyBhc3NpZ25lZCB0bworCQkJdGhlIHVzZXIuICBUaGUgRGlhbWV0ZXIgY2xpZW50IGluIHRoZSBhc3NpZ25lZCBTSVAgc2VydmVyIE1VU1QKKwkJCWluY2x1ZGUgaXRzIG93biBVUkkgaW4gdGhlIFNJUC1TZXJ2ZXItVVJJIEFWUCBvZiB0aGUKKwkJCVNlcnZlci1Bc3NpZ25tZW50LVJlcXVlc3QgKFNBUikgRGlhbWV0ZXIgbWVzc2FnZSBhbmQgc2VuZCBpdCB0byB0aGUKKwkJCURpYW1ldGVyIHNlcnZlci4gIFRoZSBEaWFtZXRlciBzZXJ2ZXIgdGhlbiBiZWNvbWVzIGF3YXJlIG9mIHRoZQorCQkJYWxsb2NhdGlvbiBvZiB0aGUgU0lQIHNlcnZlciB0byB0aGUgdXNlciBuYW1lIGFuZCB0aGUgc2VydmVyJ3MgVVJJLgorCisJCQlUaGUgRGlhbWV0ZXIgY2xpZW50IGluIHRoZSBTSVAgc2VydmVyIE1BWSBzZW5kIGEgRGlhbWV0ZXIgU0FSIG1lc3NhZ2UKKwkJCWJlY2F1c2Ugb2Ygb3RoZXIgcmVhc29ucy4gIFRoZXNlIHJlYXNvbnMgYXJlIGlkZW50aWZpZWQgaW4gdGhlCisJCQlTSVAtU2VydmVyLUFzc2lnbm1lbnQtVHlwZSBBVlAgKFNlY3Rpb24gOS40KSB2YWx1ZS4gIEZvciBpbnN0YW5jZSwgYQorCQkJRGlhbWV0ZXIgY2xpZW50IGluIGEgU0lQIHNlcnZlciBtYXkgY29udGFjdCB0aGUgRGlhbWV0ZXIgc2VydmVyIHRvCisJCQlyZXF1ZXN0IGRlcmVnaXN0cmF0aW9uIG9mIGEgdXNlciwgdG8gaW5mb3JtIHRoZSBEaWFtZXRlciBzZXJ2ZXIgb2YgYW4KKwkJCWF1dGhlbnRpY2F0aW9uIGZhaWx1cmUsIG9yIGp1c3QgdG8gZG93bmxvYWQgdGhlIHVzZXIgcHJvZmlsZS4gIEZvciBhCisJCQljb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiBhbGwgdGhlIFNJUC1TZXJ2ZXItQXNzaWdubWVudC1UeXBlIEFWUAorCQkJdmFsdWVzLCBzZWUgU2VjdGlvbiA5LjQuCisKKwkJCVR5cGljYWxseSB0aGUgcmVjZXB0aW9uIG9mIGEgU0lQIFJFR0lTVEVSIHJlcXVlc3QgaW4gYSBTSVAgc2VydmVyCisJCQl3aWxsIHRyaWdnZXIgdGhlIERpYW1ldGVyIGNsaWVudCBpbiB0aGUgU0lQIHNlcnZlciB0byBzZW5kIHRoZQorCQkJRGlhbWV0ZXIgU0FSIG1lc3NhZ2UuICBIb3dldmVyLCBpZiBhIFNJUCBzZXJ2ZXIgaXMgcmVjZWl2aW5nIG90aGVyCisJCQlTSVAgcmVxdWVzdCwgc3VjaCBhcyBJTlZJVEUsIGFuZCB0aGUgU0lQIHNlcnZlciBkb2VzIG5vdCBoYXZlIHRoZQorCQkJdXNlciBwcm9maWxlLCB0aGUgRGlhbWV0ZXIgY2xpZW50IGluIHRoZSBTSVAgc2VydmVyIG1heSBzZW5kIHRoZQorCQkJRGlhbWV0ZXIgU0FSIG1lc3NhZ2UgdG8gdGhlIERpYW1ldGVyIHNlcnZlciBpbiBvcmRlciB0byBkb3dubG9hZCB0aGUKKwkJCXVzZXIgcHJvZmlsZSBhbmQgbWFrZSB0aGUgRGlhbWV0ZXIgc2VydmVyIGF3YXJlIG9mIHRoZSBTSVAgc2VydmVyCisJCQlhc3NpZ25lZCB0byB0aGUgdXNlci4KKwkJCVRoZSB1c2VyIHByb2ZpbGUgaXMgYW4gaW1wb3J0YW50IHBpZWNlIG9mIGluZm9ybWF0aW9uIHRoYXQgZGljdGF0ZXMKKwkJCXRoZSBiZWhhdmlvciBvZiB0aGUgU0lQIHNlcnZlciB3aGVuIHRyaWdnZXJpbmcgb3IgcHJvdmlkaW5nIHNlcnZpY2VzCisJCQlmb3IgdGhlIHVzZXIuICBUeXBpY2FsbHkgdGhlIHVzZXIgcHJvZmlsZSBpcyBkaXZpZGVkIGludG86CisKKwkJCW8gIFNlcnZpY2VzIHRvIGJlIHJlbmRlcmVkIHRvIHRoZSB1c2VyIHdoZW4gdGhlIHVzZXIgaXMgcmVnaXN0ZXJlZAorCQkJYW5kIGluaXRpYXRlcyBhIFNJUCByZXF1ZXN0LgorCisJCQlvICBTZXJ2aWNlcyB0byBiZSByZW5kZXJlZCB0byB0aGUgdXNlciB3aGVuIHRoZSB1c2VyIGlzIHJlZ2lzdGVyZWQKKwkJCWFuZCBhIFNJUCByZXF1ZXN0IGRlc3RpbmVkIHRvIHRoYXQgdXNlciBhcnJpdmVzIHRvIHRoZSBTSVAgcHJveHkuCisKKwkJCW8gIFNlcnZpY2VzIHRvIGJlIHJlbmRlcmVkIHRvIHRoZSB1c2VyIHdoZW4gdGhlIHVzZXIgaXMgbm90CisJCQlyZWdpc3RlcmVkIGFuZCBhIFNJUCByZXF1ZXN0IGRlc3RpbmVkIHRvIHRoYXQgdXNlciBhcnJpdmVzIHRvIHRoZQorCQkJU0lQIHByb3h5LgorCisJCQlUaGUgU0lQLVNlcnZlci1Bc3NpZ25tZW50LVR5cGUgQVZQIGluZGljYXRlcyB0aGUgcmVhc29uIHdoeSB0aGUKKwkJCURpYW1ldGVyIGNsaWVudCAoU0lQIHNlcnZlcikgY29udGFjdGVkIHRoZSBEaWFtZXRlciBzZXJ2ZXIuICBJZiB0aGUKKwkJCURpYW1ldGVyIGNsaWVudCBzZXRzIHRoZSBTSVAtU2VydmVyLUFzc2lnbm1lbnQtVHlwZSBBVlAgdmFsdWUgdG8KKwkJCVJFR0lTVFJBVElPTiwgUkVfUkVHSVNUUkFUSU9OLCBVTlJFR0lTVEVSRURfVVNFUiwgTk9fQVNTSUdOTUVOVCwKKwkJCUFVVEhFTlRJQ0FUSU9OX0ZBSUxVUkUgb3IgQVVUSEVOVElDQVRJT05fVElNRU9VVCwgdGhlIERpYW1ldGVyIGNsaWVudAorCQkJTVVTVCBpbmNsdWRlIGV4YWN0bHkgb25lIFNJUC1BT1IgQVZQIGluIHRoZSBEaWFtZXRlciBTQVIgbWVzc2FnZS4KKworCQkJVGhlIFNBUiBtZXNzYWdlIE1BWSBjb250YWluIHplcm8gb3IgbW9yZSBTSVAtU3VwcG9ydGVkLVVzZXItRGF0YS1UeXBlCisJCQlBVlBzLiAgRWFjaCBvZiB0aGVtIGNvbnRhaW5zIGEgdHlwZSBvZiB1c2VyIGRhdGEgdW5kZXJzdG9vZCBieSB0aGUKKwkJCVNJUCBzZXJ2ZXIuICBUaGlzIGFsbG93cyB0aGUgRGlhbWV0ZXIgY2xpZW50IHRvIHByb3ZpZGUgYW4gaW5kaWNhdGlvbgorCQkJdG8gdGhlIERpYW1ldGVyIHNlcnZlciBvZiB0aGUgZGlmZmVyZW50IGZvcm1hdCBvZiB1c2VyIGRhdGEKKwkJCXVuZGVyc3Rvb2QgYnkgdGhlIFNJUCBzZXJ2ZXIuICBUaGUgRGlhbWV0ZXIgc2VydmVyIHVzZXMgdGhpcworCQkJaW5mb3JtYXRpb24gdG8gc2VsZWN0IG9uZSBvciBtb3JlIFNJUC1Vc2VyLURhdGEgQVZQcyB0aGF0IHdpbGwgYmUKKwkJCWluY2x1ZGVkIGluIHRoZSBTQUEgbWVzc2FnZS4KKworCQkJVGhlIE1lc3NhZ2UgRm9ybWF0IG9mIHRoZSBTQVIgY29tbWFuZCBpcyBhcyBmb2xsb3dzOgorCisJCQk8U0FSPiA6Oj0gPCBEaWFtZXRlciBIZWFkZXI6IDI4NCwgUkVRLCBQWFkgPgorCQkJCSA8IFNlc3Npb24tSWQgPgorCQkJCSB7IEF1dGgtQXBwbGljYXRpb24tSWQgfQorCQkJCSB7IEF1dGgtU2Vzc2lvbi1TdGF0ZSB9CisJCQkJIHsgT3JpZ2luLUhvc3QgfQorCQkJCSB7IE9yaWdpbi1SZWFsbSB9CisJCQkJIHsgRGVzdGluYXRpb24tUmVhbG0gfQorCQkJCSB7IFNJUC1TZXJ2ZXItQXNzaWdubWVudC1UeXBlIH0KKwkJCQkgeyBTSVAtVXNlci1EYXRhLUFscmVhZHktQXZhaWxhYmxlIH0KKwkJCQkgWyBEZXN0aW5hdGlvbi1Ib3N0IF0KKwkJCQkgWyBVc2VyLU5hbWUgXQorCQkJCSBbIFNJUC1TZXJ2ZXItVVJJIF0KKwkJCSAgICAgICAqIFsgU0lQLVN1cHBvcnRlZC1Vc2VyLURhdGEtVHlwZSBdCisJCQkgICAgICAgKiBbIFNJUC1BT1IgXQorCQkJICAgICAgICogWyBQcm94eS1JbmZvIF0KKwkJCSAgICAgICAqIFsgUm91dGUtUmVjb3JkIF0KKwkJCSAgICAgICAqIFsgQVZQIF0KKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBjbWQ7CisJCQlzdHJ1Y3QgZGljdF9jbWRfZGF0YSBkYXRhID0geyAKKwkJCQkJMjg0LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJIlNlcnZlci1Bc3NpZ25tZW50LVJlcXVlc3QiLCAJCS8qIE5hbWUgKi8KKwkJCQkJQ01EX0ZMQUdfUkVRVUVTVCB8IENNRF9GTEFHX1BST1hJQUJMRSB8IENNRF9GTEFHX0VSUk9SLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQ01EX0ZMQUdfUkVRVUVTVCB8IENNRF9GTEFHX1BST1hJQUJMRSAJCQkJCQkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQl9OworCQkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9IAorCQkJCQkJeyAJIHsgICJTZXNzaW9uLUlkIiwgCQkJUlVMRV9GSVhFRF9IRUFELCAtMSwgMSB9CisJCQkJCQkgCSx7ICAiQXV0aC1BcHBsaWNhdGlvbi1JZCIsIAkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCQkJCQkgCSx7ICAiQXV0aC1TZXNzaW9uLVN0YXRlIiwgCQlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJCQkJCSAJLHsgICJPcmlnaW4tSG9zdCIsIAkJCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkJCQkJIAkseyAgIk9yaWdpbi1SZWFsbSIsIAkJCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkJCQkJIAkseyAgIkRlc3RpbmF0aW9uLVJlYWxtIiwJCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkJCQkJIAkseyAgIlNJUC1TZXJ2ZXItQXNzaWdubWVudC1UeXBlIiwgCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkJCQkJIAkseyAgIlNJUC1Vc2VyLURhdGEtQWxyZWFkeS1BdmFpbGFibGUiLCAJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCQkJCQkgCSx7ICAiRGVzdGluYXRpb24tSG9zdCIsIAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkgCSx7ICAiVXNlci1OYW1lIiwgCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkgCSx7ICAiU0lQLVNlcnZlci1VUkkiLCAJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCSAJLHsgICJTSVAtU3VwcG9ydGVkLVVzZXItRGF0YS1UeXBlIiwgCVJVTEVfT1BUSU9OQUwsICAgLTEsIC0xIH0KKwkJCQkJCSAJLHsgICJTSVAtQU9SIiwgCQkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIC0xIH0KKwkJCQkJCSAJLHsgICJQcm94eS1JbmZvIiwgCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgLTEgfQorCQkJCQkJIAkseyAgIlJvdXRlLVJlY29yZCIsIAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIC0xIH0KKworCQkJCQkJfTsKKwkJCQorCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQ09NTUFORCwgJmRhdGEgLCBzaXAsICZjbWQpOworCQkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgY21kICk7CisJCX0KKwkJLyogU2VydmVyLUFzc2lnbm1lbnQtQW5zd2VyIChTQUEpIENvbW1hbmQgKi8KKwkJeworCQkJLyoKKwkJCQorCQkJICAgVGhlIFNlcnZlci1Bc3NpZ25tZW50LUFuc3dlciAoU0FBKSBpcyBpbmRpY2F0ZWQgYnkgdGhlIENvbW1hbmQtQ29kZQorCQkJICAgc2V0IHRvIDI4NCBhbmQgdGhlIENvbW1hbmQgRmxhZ3MnICdSJyBiaXQgY2xlYXJlZC4gIFRoZSBEaWFtZXRlcgorCQkJICAgc2VydmVyIHNlbmRzIHRoaXMgY29tbWFuZCBpbiByZXNwb25zZSB0byBhIHByZXZpb3VzbHkgcmVjZWl2ZWQKKwkJCSAgIERpYW1ldGVyIFNlcnZlci1Bc3NpZ25tZW50LVJlcXVlc3QgKFNBUikgY29tbWFuZC4gIFRoZSByZXNwb25zZSBtYXkKKwkJCSAgIGluY2x1ZGUgdGhlIHVzZXIgcHJvZmlsZSBvciBwYXJ0IG9mIGl0LCBpZiByZXF1ZXN0ZWQuCisKKwkJCSAgIEluIGFkZGl0aW9uIHRvIHRoZSB2YWx1ZXMgYWxyZWFkeSBkZWZpbmVkIGluIFJGQyAzNTg4IFtSRkMzNTg4XSwgdGhlCisJCQkgICBSZXN1bHQtQ29kZSBBVlAgbWF5IGNvbnRhaW4gb25lIG9mIHRoZSB2YWx1ZXMgZGVmaW5lZCBpbgorCQkJICAgU2VjdGlvbiAxMC4xLgorCisJCQkgICBUaGUgUmVzdWx0LUNvZGUgQVZQIHZhbHVlIGluIHRoZSBEaWFtZXRlciBTQUEgbWVzc2FnZSBtYXkgaW5kaWNhdGUgYQorCQkJICAgc3VjY2VzcyBvciBhbiBlcnJvciBpbiB0aGUgZXhlY3V0aW9uIG9mIHRoZSBEaWFtZXRlciBTQVIgY29tbWFuZC4gIElmCisJCQkgICBSZXN1bHQtQ29kZSBBVlAgdmFsdWUgaW4gdGhlIERpYW1ldGVyIFNBQSBtZXNzYWdlIGRvZXMgbm90IGNvbnRhaW4gYW4KKwkJCSAgIGVycm9yIGNvZGUsIHRoZSBTQUEgbWVzc2FnZSBNQVkgaW5jbHVkZSBvbmUgb3IgbW9yZSBTSVAtVXNlci1EYXRhCisJCQkgICBBVlBzIHRoYXQgdHlwaWNhbGx5IGNvbnRhaW4gdGhlIHByb2ZpbGUgb2YgdGhlIHVzZXIsIGluZGljYXRpbmcKKwkJCSAgIHNlcnZpY2VzIHRoYXQgdGhlIFNJUCBzZXJ2ZXIgY2FuIHByb3ZpZGUgdG8gdGhhdCB1c2VyLgorCisJCQkgICBUaGUgRGlhbWV0ZXIgc2VydmVyIE1BWSBpbmNsdWRlIG9uZSBvciBtb3JlCisJCQkgICBTSVAtU3VwcG9ydGVkLVVzZXItRGF0YS1UeXBlIEFWUHMsIGVhY2ggb25lIGlkZW50aWZ5aW5nIGEgdHlwZSBvZgorCQkJICAgdXNlciBkYXRhIGZvcm1hdCBzdXBwb3J0ZWQgaW4gdGhlIERpYW1ldGVyIHNlcnZlci4gIElmIHRoZXJlIGlzIG5vdCBhCisJCQkgICBjb21tb24gc3VwcG9ydGVkIHVzZXIgZGF0YSB0eXBlIGJldHdlZW4gdGhlIERpYW1ldGVyIGNsaWVudCBhbmQgdGhlCisJCQkgICBEaWFtZXRlciBzZXJ2ZXIsIHRoZSBEaWFtZXRlciBzZXJ2ZXIgU0hPVUxEIGRlY2xhcmUgaXRzIGxpc3Qgb2YKKwkJCSAgIHN1cHBvcnRlZCB1c2VyIGRhdGEgdHlwZXMgYnkgaW5jbHVkaW5nIG9uZSBvciBtb3JlCisJCQkgICBTSVAtU3VwcG9ydGVkLVVzZXItRGF0YS1UeXBlIEFWUHMgaW4gYSBEaWFtZXRlciBTQUEgbWVzc2FnZS4gIFRoaXMKKwkJCSAgIGluZGljYXRpb24gaXMgbWVyZWx5IGZvciBkZWJ1Z2dpbmcgcmVhc29ucywgc2luY2UgdGhlcmUgaXMgbm90IGEKKwkJCSAgIGZhbGxiYWNrIG1lY2hhbmlzbSB0aGF0IGFsbG93cyB0aGUgRGlhbWV0ZXIgY2xpZW50IHRvIHJldHJpZXZlIHRoZQorCQkJICAgcHJvZmlsZSBpbiBhIHN1cHBvcnRlZCBmb3JtYXQuCisKKwkJCSAgIElmIHRoZSBEaWFtZXRlciBzZXJ2ZXIgcmVxdWlyZXMgYSBVc2VyLU5hbWUgQVZQIHZhbHVlIHRvIHByb2Nlc3MgdGhlCisJCQkgICBEaWFtZXRlciBTQVIgcmVxdWVzdCwgYnV0IHRoZSBEaWFtZXRlciBTQVIgbWVzc2FnZSBkaWQgbm90IGNvbnRhaW4gYQorCQkJICAgVXNlci1OYW1lIEFWUCB2YWx1ZSwgdGhlIERpYW1ldGVyIHNlcnZlciBNVVNUIHNldCB0aGUgUmVzdWx0LUNvZGUgQVZQCisJCQkgICB2YWx1ZSB0byBESUFNRVRFUl9VU0VSX05BTUVfUkVRVUlSRUQgKHNlZSBTZWN0aW9uIDEwLjEuMikgYW5kIHJldHVybgorCQkJICAgaXQgaW4gYSBEaWFtZXRlciBTQUEgbWVzc2FnZS4gIFVwb24gcmVjZXB0aW9uIG9mIHRoaXMgRGlhbWV0ZXIgU0FBCisJCQkgICBtZXNzYWdlIHdpdGggdGhlIFJlc3VsdC1Db2RlIEFWUCB2YWx1ZSBzZXQgdG8KKwkJCSAgIERJQU1FVEVSX1VTRVJfTkFNRV9SRVFVSVJFRCwgdGhlIFNJUCBzZXJ2ZXIgdHlwaWNhbGx5IHJlcXVlc3RzCisJCQkgICBhdXRoZW50aWNhdGlvbiBieSBnZW5lcmF0aW5nIGEgU0lQIDQwMSAoVW5hdXRob3JpemVkKSBvciBTSVAgNDA3CisJCQkgICAoUHJveHkgQXV0aGVudGljYXRpb24gUmVxdWlyZWQpIHJlc3BvbnNlIGJhY2sgdG8gdGhlIG9yaWdpbmF0b3IuCisKKwkJCSAgIElmIHRoZSBVc2VyLU5hbWUgQVZQIGlzIGluY2x1ZGVkIGluIHRoZSBEaWFtZXRlciBTQVIgbWVzc2FnZSwgdXBvbgorCQkJICAgcmVjZXB0aW9uIG9mIHRoZSBEaWFtZXRlciBTQVIgbWVzc2FnZSwgdGhlIERpYW1ldGVyIHNlcnZlciBNVVNUCisJCQkgICB2ZXJpZnkgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgdXNlciBpbiB0aGUgcmVhbG0sIGkuZS4sIHRoZSBVc2VyLU5hbWUKKwkJCSAgIEFWUCB2YWx1ZSBpcyBhIHZhbGlkIHVzZXIgd2l0aGluIHRoYXQgcmVhbG0uICBJZiB0aGUgRGlhbWV0ZXIgc2VydmVyCisJCQkgICBkb2VzIG5vdCByZWNvZ25pemUgdGhlIHVzZXIgbmFtZSByZWNlaXZlZCBpbiB0aGUgVXNlci1OYW1lIEFWUCwgdGhlCisJCQkgICBEaWFtZXRlciBzZXJ2ZXIgTVVTVCBidWlsZCBhIERpYW1ldGVyIFNlcnZlci1Bc3NpZ25tZW50LUFuc3dlciAoU0FBKQorCQkJICAgbWVzc2FnZSBhbmQgTVVTVCBzZXQgdGhlIFJlc3VsdC1Db2RlIEFWUCB0bworCQkJICAgRElBTUVURVJfRVJST1JfVVNFUl9VTktOT1dOLgorCQkJICAgVGhlbiB0aGUgRGlhbWV0ZXIgc2VydmVyIE1VU1QgYXV0aG9yaXplIHRoYXQgVXNlci1OYW1lIEFWUCB2YWx1ZSBpcyBhCisJCQkgICB2YWxpZCBhdXRoZW50aWNhdGlvbiBuYW1lIGZvciB0aGUgU0lQIG9yIFNJUFMgVVJJIGluY2x1ZGVkIGluIHRoZQorCQkJICAgU0lQLUFPUiBBVlAgb2YgdGhlIERpYW1ldGVyIFNBUiBtZXNzYWdlLiAgSWYgdGhpcyBhdXRob3JpemF0aW9uCisJCQkgICBmYWlscywgdGhlIERpYW1ldGVyIHNlcnZlciBtdXN0IHNldCB0aGUgUmVzdWx0LUNvZGUgQVZQIHRvCisJCQkgICBESUFNRVRFUl9FUlJPUl9JREVOVElUSUVTX0RPTlRfTUFUQ0ggYW5kIHNlbmQgaXQgaW4gYSBEaWFtZXRlcgorCQkJICAgU2VydmVyLUFzc2lnbm1lbnQtQW5zd2VyIChTQUEpIG1lc3NhZ2UuCisKKwkJCSAgIEFmdGVyIHN1Y2Nlc3NmdWwgZXhlY3V0aW9uIG9mIHRoZSBEaWFtZXRlciBTQVIgY29tbWFuZCwgdGhlIERpYW1ldGVyCisJCQkgICBzZXJ2ZXIgTVVTVCBjbGVhciB0aGUgImF1dGhlbnRpY2F0aW9uIHBlbmRpbmciIGZsYWcgYW5kIFNIT1VMRCBtb3ZlCisJCQkgICB0aGUgdGVtcG9yYXJpbHkgc3RvcmVkIFNJUCBzZXJ2ZXIgVVJJIHRvIHBlcm1hbmVudCBzdG9yYWdlLgorCisJCQkgICBUaGUgYWN0aW9ucyBvZiB0aGUgRGlhbWV0ZXIgc2VydmVyIHVwb24gcmVjZXB0aW9uIG9mIHRoZSBEaWFtZXRlciBTQVIKKwkJCSAgIG1lc3NhZ2UgZGVwZW5kIG9uIHRoZSB2YWx1ZSBvZiB0aGUgU0lQLVNlcnZlci1Bc3NpZ25tZW50LVR5cGU6CisKKwkJCSAgIG8gIElmIHRoZSBTSVAtU2VydmVyLUFzc2lnbm1lbnQtVHlwZSBBVlAgdmFsdWUgaW4gdGhlIERpYW1ldGVyIFNBUgorCQkJICAgICAgbWVzc2FnZSBpcyBzZXQgdG8gUkVHSVNUUkFUSU9OIG9yIFJFX1JFR0lTVFJBVElPTiwgdGhlIERpYW1ldGVyCisJCQkgICAgICBzZXJ2ZXIgU0hPVUxEIHZlcmlmeSB0aGF0IHRoZXJlIGlzIG9ubHkgb25lIFNJUC1BT1IgQVZQLgorCQkJICAgICAgT3RoZXJ3aXNlLCB0aGUgRGlhbWV0ZXIgc2VydmVyIE1VU1QgYW5zd2VyIHdpdGggYSBEaWFtZXRlciBTQUEKKwkJCSAgICAgIG1lc3NhZ2Ugd2l0aCB0aGUgUmVzdWx0LUNvZGUgQVZQIHZhbHVlIHNldCB0bworCQkJICAgICAgRElBTUVURVJfQVZQX09DQ1VSU19UT09fTUFOWV9USU1FUyBhbmQgTVVTVCBOT1QgaW5jbHVkZSBhbnkKKwkJCSAgICAgIFNJUC1Vc2VyLURhdGEgQVZQLiAgSWYgdGhlcmUgaXMgb25seSBvbmUgU0lQLUFPUiBBVlAgYW5kIGlmIHRoZQorCQkJICAgICAgU0lQLVVzZXItRGF0YS1BbHJlYWR5LUF2YWlsYWJsZSBBVlAgdmFsdWUgaXMgc2V0IHRvCisJCQkgICAgICBVU0VSX0RBVEFfTk9UX0FWQUlMQUJMRSwgdGhlbiB0aGUgRGlhbWV0ZXIgc2VydmVyIFNIT1VMRCBpbmNsdWRlCisJCQkgICAgICBvbmUgb3IgbW9yZSB1c2VyIHByb2ZpbGUgZGF0YSB3aXRoIHRoZSBTSVAgb3IgU0lQUyBVUkkgKFNJUC1BT1IKKwkJCSAgICAgIEFWUCkgYW5kIGFsbCBvdGhlciBTSVAgaWRlbnRpdGllcyBhc3NvY2lhdGVkIHdpdGggdGhhdCBBVlAgaW4gdGhlCisJCQkgICAgICBTSVAtVXNlci1EYXRhIEFWUCB2YWx1ZSBvZiB0aGUgRGlhbWV0ZXIgU0FBIG1lc3NhZ2UuICBPbiBzZWxlY3RpbmcKKwkJCSAgICAgIHRoZSB0eXBlIG9mIHVzZXIgZGF0YSwgdGhlIERpYW1ldGVyIHNlcnZlciBTSE9VTEQgdGFrZSBpbnRvCisJCQkgICAgICBhY2NvdW50IHRoZSBzdXBwb3J0ZWQgZm9ybWF0cyBhdCB0aGUgU0lQIHNlcnZlcgorCQkJICAgICAgKFNJUC1TdXBwb3J0ZWQtVXNlci1EYXRhLVR5cGUgQVZQIGluIHRoZSBTQVIgbWVzc2FnZSkgYW5kIHRoZQorCQkJICAgICAgbG9jYWwgcG9saWN5LiAgQWRkaXRpb25hbGx5LCB0aGUgRGlhbWV0ZXIgc2VydmVyIE1VU1Qgc2V0IHRoZQorCQkJICAgICAgUmVzdWx0LUNvZGUgQVZQIHZhbHVlIHRvIERJQU1FVEVSX1NVQ0NFU1MgaW4gdGhlIERpYW1ldGVyIFNBQQorCQkJICAgICAgbWVzc2FnZS4gIFRoZSBEaWFtZXRlciBzZXJ2ZXIgY29uc2lkZXJzIHRoZSBTSVAgQU9SIGF1dGhlbnRpY2F0ZWQKKwkJCSAgICAgIGFuZCByZWdpc3RlcmVkLgorCisJCQkgICBvICBJZiB0aGUgU0lQLVNlcnZlci1Bc3NpZ25tZW50LVR5cGUgQVZQIHZhbHVlIGluIHRoZSBEaWFtZXRlciBTQVIKKwkJCSAgICAgIG1lc3NhZ2UgaXMgc2V0IHRvIFVOUkVHSVNURVJFRF9VU0VSLCB0aGVuIHRoZSBEaWFtZXRlciBzZXJ2ZXIgTVVTVAorCQkJICAgICAgc3RvcmUgdGhlIFNJUCBzZXJ2ZXIgYWRkcmVzcyBpbmNsdWRlZCBpbiB0aGUgU0lQLVNlcnZlci1VUkkgQVZQCisJCQkgICAgICB2YWx1ZS4gIFRoZSBEaWFtZXRlciBzZXJ2ZXIgd2lsbCByZXR1cm4gdGhlIFNJUCBzZXJ2ZXIgYWRkcmVzcyBpbgorCQkJICAgICAgRGlhbWV0ZXIgTG9jYXRpb24tSW5mby1BbnN3ZXIgKExJQSkgbWVzc2FnZXMuICBJZiB0aGUKKwkJCSAgICAgIFNJUC1Vc2VyLURhdGEtQWxyZWFkeS1BdmFpbGFibGUgQVZQIHZhbHVlIGlzIHNldCB0bworCQkJICAgICAgVVNFUl9EQVRBX05PVF9BVkFJTEFCTEUsIHRoZW4gdGhlIERpYW1ldGVyIHNlcnZlciBTSE9VTEQgaW5jbHVkZQorCQkJICAgICAgb25lIG9yIG1vcmUgdXNlciBwcm9maWxlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBTSVAgb3IgU0lQUyBVUkkKKwkJCSAgICAgIChTSVAtQU9SIEFWUCkgYW5kIGFzc29jaWF0ZWQgaWRlbnRpdGllcyBpbiB0aGUgU0lQLVVzZXItRGF0YSBBVlAKKwkJCSAgICAgIHZhbHVlIG9mIHRoZSBEaWFtZXRlciBTQUEgbWVzc2FnZS4gIE9uIHNlbGVjdGluZyB0aGUgdHlwZSBvZiB1c2VyCisJCQkgICAgICBkYXRhLCB0aGUgRGlhbWV0ZXIgc2VydmVyIFNIT1VMRCB0YWtlIGludG8gYWNjb3VudCB0aGUgc3VwcG9ydGVkCisJCQkgICAgICBmb3JtYXRzIGF0IHRoZSBTSVAgc2VydmVyIChTSVAtU3VwcG9ydGVkLVVzZXItRGF0YS1UeXBlIEFWUCBpbiB0aGUKKwkJCSAgICAgIFNBUiBtZXNzYWdlKSBhbmQgdGhlIGxvY2FsIHBvbGljeS4gIFRoZSBEaWFtZXRlciBzZXJ2ZXIgTVVTVCBzZXQKKwkJCSAgICAgIHRoZSBSZXN1bHQtQ29kZSBBVlAgdmFsdWUgdG8gRElBTUVURVJfU1VDQ0VTUy4gIFRoZSBEaWFtZXRlcgorCQkJICAgICAgc2VydmVyIGNvbnNpZGVycyB0aGUgU0lQIEFPUiBVTlJFR0lTVEVSRUQsIGJ1dCB3aXRoIGEgU0lQIHNlcnZlcgorCQkJICAgICAgYWxsb2NhdGVkIHRvIHRyaWdnZXIgYW5kIHByb3ZpZGUgc2VydmljZXMgZm9yIHVucmVnaXN0ZXJlZCB1c2Vycy4KKwkJCSAgICAgIE5vdGUgdGhhdCBpbiBjYXNlIG9mIFVOUkVHSVNURVJFRF9VU0VSIChTSVAtU2VydmVyLUFzc2lnbm1lbnQtVHlwZQorCQkJICAgICAgQVZQKSwgdGhlIERpYW1ldGVyIHNlcnZlciBNVVNUIHZlcmlmeSB0aGF0IHRoZXJlIGlzIG9ubHkgb25lCisJCQkgICAgICBTSVAtQU9SIEFWUC4gIE90aGVyd2lzZSwgdGhlIERpYW1ldGVyIHNlcnZlciBNVVNUIGFuc3dlciB0aGUKKwkJCSAgICAgIERpYW1ldGVyIFNBUiBtZXNzYWdlIHdpdGggYSBEaWFtZXRlciBTQUEgbWVzc2FnZSwgYW5kIGl0IE1VU1Qgc2V0CisJCQkgICAgICB0aGUgUmVzdWx0LUNvZGUgQVZQIHZhbHVlIHRvIERJQU1FVEVSX0FWUF9PQ0NVUlNfVE9PX01BTllfVElNRVMKKwkJCSAgICAgIGFuZCBNVVNUIE5PVCBpbmNsdWRlIGFueSBTSVAtVXNlci1EYXRhIEFWUC4KKwkJCSAgICAgIElmIHRoZSBVc2VyLU5hbWUgQVZQIHdhcyBub3QgcHJlc2VudCBpbiB0aGUgRGlhbWV0ZXIgU0FSIG1lc3NhZ2UKKwkJCSAgICAgIGFuZCB0aGUgU0lQLUFPUiBpcyBub3Qga25vd24gZm9yIHRoZSBEaWFtZXRlciBzZXJ2ZXIsIHRoZSBEaWFtZXRlcgorCQkJICAgICAgc2VydmVyIE1VU1QgTk9UIGluY2x1ZGUgYSBVc2VyLU5hbWUgQVZQIGluIHRoZSBEaWFtZXRlciBTQUEKKwkJCSAgICAgIG1lc3NhZ2UgYW5kIE1VU1Qgc2V0IHRoZSBSZXN1bHQtQ29kZSBBVlAgdmFsdWUgdG8KKwkJCSAgICAgIERJQU1FVEVSX0VSUk9SX1VTRVJfVU5LTk9XTi4KKworCQkJICAgbyAgSWYgdGhlIFNJUC1TZXJ2ZXItQXNzaWdubWVudC1UeXBlIEFWUCB2YWx1ZSBpbiB0aGUgRGlhbWV0ZXIgU0FSCisJCQkgICAgICBtZXNzYWdlIGlzIHNldCB0byBUSU1FT1VUX0RFUkVHSVNUUkFUSU9OLCBVU0VSX0RFUkVHSVNUUkFUSU9OLAorCQkJICAgICAgREVSRUdJU1RSQVRJT05fVE9PX01VQ0hfREFUQSwgb3IgQURNSU5JU1RSQVRJVkVfREVSRUdJU1RSQVRJT04sCisJCQkgICAgICB0aGUgRGlhbWV0ZXIgc2VydmVyIE1VU1QgY2xlYXIgdGhlIFNJUCBzZXJ2ZXIgYWRkcmVzcyBhc3NvY2lhdGVkCisJCQkgICAgICB3aXRoIGFsbCBTSVAgQU9ScyBpbmRpY2F0ZWQgaW4gZWFjaCBvZiB0aGUgU0lQLUFPUiBBVlAgdmFsdWVzCisJCQkgICAgICBpbmNsdWRlZCBpbiB0aGUgRGlhbWV0ZXIgU0FSIG1lc3NhZ2UuICBUaGUgRGlhbWV0ZXIgc2VydmVyCisJCQkgICAgICBjb25zaWRlcnMgYWxsIG9mIHRoZXNlIFNJUCBBT1JzIGFzIG5vdCByZWdpc3RlcmVkLiAgVGhlIERpYW1ldGVyCisJCQkgICAgICBzZXJ2ZXIgTVVTVCBzZXQgdGhlIFJlc3VsdC1Db2RlIEFWUCB2YWx1ZSB0byBESUFNRVRFUl9TVUNDRVNTIGluCisJCQkgICAgICB0aGUgRGlhbWV0ZXIgU0FBIG1lc3NhZ2UuCisKKwkJCSAgIG8gIElmIHRoZSBTSVAtU2VydmVyLUFzc2lnbm1lbnQtVHlwZSBBVlAgdmFsdWUgaW4gdGhlIERpYW1ldGVyIFNBUgorCQkJICAgICAgbWVzc2FnZSBpcyBzZXQgdG8gVElNRU9VVF9ERVJFR0lTVFJBVElPTl9TVE9SRV9TRVJWRVJfTkFNRSBvcgorCQkJICAgICAgVVNFUl9ERVJFR0lTVFJBVElPTl9TVE9SRV9TRVJWRVJfTkFNRSwgdGhlIERpYW1ldGVyIHNlcnZlciBNQVkKKwkJCSAgICAgIGtlZXAgdGhlIFNJUCBzZXJ2ZXIgYWRkcmVzcyBhc3NvY2lhdGVkIHdpdGggdGhlIFNJUCBBT1JzIGluY2x1ZGVkCisJCQkgICAgICBpbiB0aGUgU0lQLUFPUiBBVlAgdmFsdWVzIG9mIHRoZSBEaWFtZXRlciBTQVIgbWVzc2FnZSwgZXZlbiB0aG91Z2gKKwkJCSAgICAgIHRoZSBTSVAgQU9ScyBiZWNvbWUgdW5yZWdpc3RlcmVkLiAgVGhpcyBmZWF0dXJlIGFsbG93cyBhIFNJUAorCQkJICAgICAgc2VydmVyIHRvIHJlcXVlc3QgdGhhdCB0aGUgRGlhbWV0ZXIgc2VydmVyIHJlbWFpbiBhbiBhc3NpZ25lZCBTSVAKKwkJCSAgICAgIHNlcnZlciBmb3IgdGhvc2UgU0lQIEFPUnMgKFNJUC1BT1IgQVZQIHZhbHVlcykgYWxsb2NhdGVkIHRvIHRoZQorCQkJICAgICAgc2FtZSB1c2VyIG5hbWUsIGFuZCBhdm9pZCBTSVAgc2VydmVyIGFzc2lnbm1lbnQuICBUaGUgRGlhbWV0ZXIKKwkJCSAgICAgIHNlcnZlciBNVVNUIGNvbnNpZGVyIGFsbCB0aGVzZSBTSVAgQU9ScyBhcyBub3QgcmVnaXN0ZXJlZC4gIElmIHRoZQorCQkJICAgICAgRGlhbWV0ZXIgc2VydmVyIGhvbm9ycyB0aGUgcmVxdWVzdCBvZiB0aGUgRGlhbWV0ZXIgY2xpZW50IChTSVAKKwkJCSAgICAgIHNlcnZlcikgdG8gcmVtYWluIGFzIGFuIGFsbG9jYXRlZCBTSVAgc2VydmVyLCB0aGVuIHRoZSBEaWFtZXRlcgorCQkJICAgICAgc2VydmVyIE1VU1Qga2VlcCB0aGUgU0lQIHNlcnZlciBhc3NpZ25lZCB0byB0aG9zZSBTSVAgQU9ScworCQkJICAgICAgYWxsb2NhdGVkIHRvIHRoZSB1c2VybmFtZSBhbmQgTVVTVCBzZXQgdGhlIFJlc3VsdC1Db2RlIEFWUCB2YWx1ZQorCQkJICAgICAgdG8gRElBTUVURVJfU1VDQ0VTUyBpbiB0aGUgRGlhbWV0ZXIgU0FBIG1lc3NhZ2UuICBPdGhlcndpc2UsIHdoZW4KKwkJCSAgICAgIHRoZSBEaWFtZXRlciBzZXJ2ZXIgZG9lcyBub3QgaG9ub3IgdGhlIHJlcXVlc3Qgb2YgdGhlIERpYW1ldGVyCisJCQkgICAgICBjbGllbnQgKFNJUCBzZXJ2ZXIpIHRvIHJlbWFpbiBhcyBhbiBhbGxvY2F0ZWQgU0lQIHNlcnZlciwgdGhlCisJCQkgICAgICBEaWFtZXRlciBzZXJ2ZXIgTVVTVCBjbGVhciB0aGUgU0lQIHNlcnZlciBuYW1lIGFzc2lnbmVkIHRvIHRob3NlCisJCQkgICAgICBTSVAgQU9ScyBhbmQgaXQgTVVTVCBzZXQgdGhlIFJlc3VsdC1Db2RlIEFWUCB2YWx1ZSB0bworCQkJICAgICAgRElBTUVURVJfU1VDQ0VTU19TRVJWRVJfTkFNRV9OT1RfU1RPUkVEIGluIHRoZSBEaWFtZXRlciBTQUEKKwkJCSAgICAgIG1lc3NhZ2UuCisJCQkgICBvICBJZiB0aGUgU0lQLVNlcnZlci1Bc3NpZ25tZW50LVR5cGUgQVZQIHZhbHVlIGluIHRoZSBEaWFtZXRlciBTQVIKKwkJCSAgICAgIG1lc3NhZ2UgaXMgc2V0IHRvIE5PX0FTU0lHTk1FTlQsIHRoZSBEaWFtZXRlciBzZXJ2ZXIgU0hPVUxEIGZpcnN0CisJCQkgICAgICB2ZXJpZnkgdGhhdCB0aGUgU0lQLVNlcnZlci1VUkkgQVZQIHZhbHVlIGluIHRoZSBEaWFtZXRlciBTQVIKKwkJCSAgICAgIG1lc3NhZ2UgaXMgdGhlIHNhbWUgVVJJIGFzIHRoZSBvbmUgYXNzaWduZWQgdG8gdGhlIFNJUC1BT1IgQVZQCisJCQkgICAgICB2YWx1ZS4gIElmIHRoZXkgZGlmZmVyLCB0aGVuIHRoZSBEaWFtZXRlciBzZXJ2ZXIgTVVTVCBzZXQgdGhlCisJCQkgICAgICBSZXN1bHQtQ29kZSBBVlAgdmFsdWUgdG8gRElBTUVURVJfVU5BQkxFX1RPX0NPTVBMWSBpbiB0aGUgRGlhbWV0ZXIKKwkJCSAgICAgIFNBQSBtZXNzYWdlLiAgT3RoZXJ3aXNlLCBpZiB0aGUgU0lQLVVzZXItRGF0YS1BbHJlYWR5LUF2YWlsYWJsZQorCQkJICAgICAgQVZQIHZhbHVlIGlzIHNldCB0byBVU0VSX0RBVEFfTk9UX0FWQUlMQUJMRSwgdGhlbiB0aGUgRGlhbWV0ZXIKKwkJCSAgICAgIHNlcnZlciBTSE9VTEQgaW5jbHVkZSB0aGUgdXNlciBwcm9maWxlIGRhdGEgd2l0aCB0aGUgU0lQIG9yIFNJUFMKKwkJCSAgICAgIFVSSSAoU0lQLUFPUiBBVlApIGFuZCBhbGwgb3RoZXIgU0lQIGlkZW50aXRpZXMgYXNzb2NpYXRlZCB3aXRoCisJCQkgICAgICB0aGF0IEFWUCBpbiB0aGUgU0lQLVVzZXItRGF0YSBBVlAgdmFsdWUgb2YgdGhlIERpYW1ldGVyIFNBQQorCQkJICAgICAgbWVzc2FnZS4gIE9uIHNlbGVjdGluZyB0aGUgdHlwZSBvZiB1c2VyIGRhdGEsIHRoZSBEaWFtZXRlciBzZXJ2ZXIKKwkJCSAgICAgIFNIT1VMRCB0YWtlIGludG8gYWNjb3VudCB0aGUgc3VwcG9ydGVkIGZvcm1hdHMgYXQgdGhlIFNJUCBzZXJ2ZXIKKwkJCSAgICAgIChTSVAtU3VwcG9ydGVkLVVzZXItRGF0YS1UeXBlIEFWUCBpbiB0aGUgU0FSIG1lc3NhZ2UpIGFuZCB0aGUKKwkJCSAgICAgIGxvY2FsIHBvbGljeS4KKworCQkJICAgbyAgSWYgdGhlIFNJUC1TZXJ2ZXItQXNzaWdubWVudC1UeXBlIEFWUCB2YWx1ZSBpbiB0aGUgRGlhbWV0ZXIgU0FSCisJCQkgICAgICBtZXNzYWdlIGlzIHNldCB0byBBVVRIRU5USUNBVElPTl9GQUlMVVJFIG9yCisJCQkgICAgICBBVVRIRU5USUNBVElPTl9USU1FT1VULCB0aGUgRGlhbWV0ZXIgc2VydmVyIE1VU1QgdmVyaWZ5IHRoYXQgdGhlcmUKKwkJCSAgICAgIGlzIGV4YWN0bHkgb25lIFNJUC1BT1IgQVZQIGluIHRoZSBEaWFtZXRlciBTQVIgbWVzc2FnZS4gIElmIHRoZQorCQkJICAgICAgbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9mIHRoZSBTSVAtQU9SIEFWUCBpcyBub3QgZXhhY3RseSBvbmUsIHRoZQorCQkJICAgICAgRGlhbWV0ZXIgc2VydmVyIE1VU1Qgc2V0IHRoZSBSZXN1bHQtQ29kZSBBVlAgdmFsdWUgdG8KKwkJCSAgICAgIERJQU1FVEVSX0FWUF9PQ0NVUlNfVE9PX01BTllfVElNRVMgaW4gdGhlIERpYW1ldGVyIFNBQSBtZXNzYWdlLAorCQkJICAgICAgYW5kIFNIT1VMRCBub3QgdGFrZSBmdXJ0aGVyIGFjdGlvbnMuICBJZiB0aGVyZSBpcyBleGFjdGx5IG9uZQorCQkJICAgICAgU0lQLUFPUiBBVlAgaW4gdGhlIERpYW1ldGVyIFNBUiBtZXNzYWdlLCB0aGUgRGlhbWV0ZXIgc2VydmVyIE1VU1QKKwkJCSAgICAgIGNsZWFyIHRoZSBhZGRyZXNzIG9mIHRoZSBTSVAgc2VydmVyIGFzc2lnbmVkIHRvIHRoZSBTSVAgQU9SCisJCQkgICAgICBhbGxvY2F0ZWQgdG8gdGhlIHVzZXIgbmFtZSwgYW5kIHRoZSBEaWFtZXRlciBzZXJ2ZXIgTVVTVCBzZXQgdGhlCisJCQkgICAgICBSZXN1bHQtQ29kZSBBVlAgdmFsdWUgdG8gRElBTUVURVJfU1VDQ0VTUyBpbiB0aGUgRGlhbWV0ZXIgU0FBCisJCQkgICAgICBtZXNzYWdlLiAgVGhlIERpYW1ldGVyIHNlcnZlciBNVVNUIGNvbnNpZGVyIHRoZSBTSVAgQU9SIGFzIG5vdAorCQkJICAgICAgcmVnaXN0ZXJlZC4KKworCQkJICAgVGhlIE1lc3NhZ2UgRm9ybWF0IG9mIHRoZSBTQUEgY29tbWFuZCBpcyBhcyBmb2xsb3dzOgorCisJCQkgICAgICAgPFNBQT4gOjo9IDwgRGlhbWV0ZXIgSGVhZGVyOiAyODQsIFBYWSA+CisJCQkJCSA8IFNlc3Npb24tSWQgPgorCQkJCQkgeyBBdXRoLUFwcGxpY2F0aW9uLUlkIH0KKwkJCQkJIHsgUmVzdWx0LUNvZGUgfQorCQkJCQkgeyBBdXRoLVNlc3Npb24tU3RhdGUgfQorCQkJCQkgeyBPcmlnaW4tSG9zdCB9CisJCQkJCSB7IE9yaWdpbi1SZWFsbSB9CisJCQkJICAgICAgICogWyBTSVAtVXNlci1EYXRhIF0KKwkJCQkJIFsgU0lQLUFjY291bnRpbmctSW5mb3JtYXRpb24gXQorCQkJCSAgICAgICAqIFsgU0lQLVN1cHBvcnRlZC1Vc2VyLURhdGEtVHlwZSBdCisJCQkJCSBbIFVzZXItTmFtZSBdCisJCQkJCSBbIEF1dGgtR3JhY2UtUGVyaW9kIF0KKwkJCQkJIFsgQXV0aG9yaXphdGlvbi1MaWZldGltZSBdCisJCQkJCSBbIFJlZGlyZWN0LUhvc3QgXQorCQkJCQkgWyBSZWRpcmVjdC1Ib3N0LVVzYWdlIF0KKwkJCQkJIFsgUmVkaXJlY3QtTWF4LUNhY2hlLVRpbWUgXQorCQkJCSAgICAgICAqIFsgUHJveHktSW5mbyBdCisJCQkJICAgICAgICogWyBSb3V0ZS1SZWNvcmQgXQorCQkJCSAgICAgICAqIFsgQVZQIF0KKworCisKKworCQkJKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGNtZDsKKwkJCXN0cnVjdCBkaWN0X2NtZF9kYXRhIGRhdGEgPSB7IAorCQkJCQkyODQsIAkJCQkJLyogQ29kZSAqLworCQkJCQkiU2VydmVyLUFzc2lnbm1lbnQtQW5zd2VyIiwgCQkvKiBOYW1lICovCisJCQkJCUNNRF9GTEFHX1JFUVVFU1QgfCBDTURfRkxBR19QUk9YSUFCTEUgfCBDTURfRkxBR19FUlJPUiwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUNNRF9GTEFHX1BST1hJQUJMRSAJCQkJCQkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQl9OworCQkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9IAorCQkJCQkJeyAJIHsgICJTZXNzaW9uLUlkIiwgCQkJUlVMRV9GSVhFRF9IRUFELCAtMSwgMSB9CisJCQkJCQkgCSx7ICAiQXV0aC1BcHBsaWNhdGlvbi1JZCIsIAkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCQkJCQkgCSx7ICAiUmVzdWx0LUNvZGUiLCAJCQlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJCQkJCSAJLHsgICJBdXRoLVNlc3Npb24tU3RhdGUiLCAJCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkJCQkJIAkseyAgIk9yaWdpbi1Ib3N0IiwgCQkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCQkJCQkgCSx7ICAiT3JpZ2luLVJlYWxtIiwgCQkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCQkJCQkgCSx7ICAiU0lQLVVzZXItRGF0YSIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgLTEgfQorCQkJCQkJIAkseyAgIlNJUC1BY2NvdW50aW5nLUluZm9ybWF0aW9uIiwgCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJIAkseyAgIlNJUC1TdXBwb3J0ZWQtVXNlci1EYXRhLVR5cGUiLCAJUlVMRV9PUFRJT05BTCwgICAtMSwgLTEgfQorCQkJCQkJIAkseyAgIlVzZXItTmFtZSIsIAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJIAkseyAgIkF1dGgtR3JhY2UtUGVyaW9kIiwgCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCSAJLHsgICJBdXRob3JpemF0aW9uLUxpZmV0aW1lIiwgCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCSAJLHsgICJSZWRpcmVjdC1Ib3N0IiwgCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkgCSx7ICAiUmVkaXJlY3QtSG9zdC1Vc2FnZSIsIAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkgCSx7ICAiUmVkaXJlY3QtTWF4LUNhY2hlLVRpbWUiLCAJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJIAkseyAgIlByb3h5LUluZm8iLCAJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAtMSB9CisJCQkJCQkgCSx7ICAiUm91dGUtUmVjb3JkIiwgCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgLTEgfQorCisJCQkJCQl9OworCQkJCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9DT01NQU5ELCAmZGF0YSAsIHNpcCwgJmNtZCk7CisJCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBjbWQgKTsKKwkJfQorCQkvKiBMb2NhdGlvbi1JbmZvLVJlcXVlc3QgKExJUikgQ29tbWFuZCAqLworCQl7CisJCQkvKgorCQkJCisJCQlUaGUgTG9jYXRpb24tSW5mby1SZXF1ZXN0IChMSVIpIGlzIGluZGljYXRlZCBieSB0aGUgQ29tbWFuZC1Db2RlIHNldAorCQkJdG8gMjg1IGFuZCB0aGUgQ29tbWFuZCBGbGFncycgJ1InIGJpdCBzZXQuICBUaGUgRGlhbWV0ZXIgY2xpZW50IGluIGEKKwkJCVNJUCBzZXJ2ZXIgc2VuZHMgdGhpcyBjb21tYW5kIHRvIHRoZSBEaWFtZXRlciBzZXJ2ZXIgdG8gcmVxdWVzdAorCQkJcm91dGluZyBpbmZvcm1hdGlvbiwgZS5nLiwgdGhlIFVSSSBvZiB0aGUgU0lQIHNlcnZlciBhc3NpZ25lZCB0byB0aGUKKwkJCVNJUC1BT1IgQVZQIHZhbHVlIGFsbG9jYXRlZCB0byB0aGUgdXNlcnMuCisKKwkJCVRoZSBNZXNzYWdlIEZvcm1hdCBvZiB0aGUgTElSIGNvbW1hbmQgaXMgYXMgZm9sbG93czoKKworCQkJPExJUj4gOjo9IDwgRGlhbWV0ZXIgSGVhZGVyOiAyODUsIFJFUSwgUFhZID4KKwkJCQkgPCBTZXNzaW9uLUlkID4KKwkJCQkgeyBBdXRoLUFwcGxpY2F0aW9uLUlkIH0KKwkJCQkgeyBBdXRoLVNlc3Npb24tU3RhdGUgfQorCQkJCSB7IE9yaWdpbi1Ib3N0IH0KKwkJCQkgeyBPcmlnaW4tUmVhbG0gfQorCQkJCSB7IERlc3RpbmF0aW9uLVJlYWxtIH0KKwkJCQkgeyBTSVAtQU9SIH0KKwkJCQkgWyBEZXN0aW5hdGlvbi1Ib3N0IF0KKwkJCSAgICAgICAqIFsgUHJveHktSW5mbyBdCisJCQkgICAgICAgKiBbIFJvdXRlLVJlY29yZCBdCisJCQkgICAgICAgKiBbIEFWUCBdCisJCQkqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogY21kOworCQkJc3RydWN0IGRpY3RfY21kX2RhdGEgZGF0YSA9IHsgCisJCQkJCTI4NSwgCQkJCQkvKiBDb2RlICovCisJCQkJCSJMb2NhdGlvbi1JbmZvLVJlcXVlc3QiLCAJCS8qIE5hbWUgKi8KKwkJCQkJQ01EX0ZMQUdfUkVRVUVTVCB8IENNRF9GTEFHX1BST1hJQUJMRSB8IENNRF9GTEFHX0VSUk9SLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQ01EX0ZMQUdfUkVRVUVTVCB8IENNRF9GTEFHX1BST1hJQUJMRSAJCQkJCQkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQl9OworCQkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9IAorCQkJCQkJeyAJIHsgICJTZXNzaW9uLUlkIiwgCQlSVUxFX0ZJWEVEX0hFQUQsIC0xLCAxIH0KKwkJCQkJCSAJLHsgICJBdXRoLUFwcGxpY2F0aW9uLUlkIiwgCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkJCQkJIAkseyAgIkF1dGgtU2Vzc2lvbi1TdGF0ZSIsIAlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJCQkJCSAJLHsgICJPcmlnaW4tSG9zdCIsIAkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCQkJCQkgCSx7ICAiT3JpZ2luLVJlYWxtIiwgCQlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJCQkJCSAJLHsgICJEZXN0aW5hdGlvbi1SZWFsbSIsCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkJCQkJIAkseyAgIlNJUC1BT1IiLCAJCQlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJCQkJCSAJLHsgICJEZXN0aW5hdGlvbi1Ib3N0IiwgCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJIAkseyAgIlByb3h5LUluZm8iLCAJCVJVTEVfT1BUSU9OQUwsICAgLTEsIC0xIH0KKwkJCQkJCSAJLHsgICJSb3V0ZS1SZWNvcmQiLCAJCVJVTEVfT1BUSU9OQUwsICAgLTEsIC0xIH0KKworCQkJCQkJfTsKKwkJCQorCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQ09NTUFORCwgJmRhdGEgLCBzaXAsICZjbWQpOworCQkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgY21kICk7CisJCX0KKwkJLyogTG9jYXRpb24tSW5mby1BbnN3ZXIgKExJQSkgQ29tbWFuZCAqLworCQl7CisJCQkvKgorCQkJICAgVGhlIExvY2F0aW9uLUluZm8tQW5zd2VyIChMSUEpIGlzIGluZGljYXRlZCBieSB0aGUgQ29tbWFuZC1Db2RlIHNldAorCQkJICAgdG8gMjg1IGFuZCB0aGUgQ29tbWFuZCBGbGFncycgJ1InIGJpdCBjbGVhcmVkLiAgVGhlIERpYW1ldGVyIHNlcnZlcgorCQkJICAgc2VuZHMgdGhpcyBjb21tYW5kIGluIHJlc3BvbnNlIHRvIGEgcHJldmlvdXNseSByZWNlaXZlZCBEaWFtZXRlcgorCQkJICAgTG9jYXRpb24tSW5mby1SZXF1ZXN0IChMSVIpIGNvbW1hbmQuCisKKwkJCSAgIEluIGFkZGl0aW9uIHRvIHRoZSB2YWx1ZXMgYWxyZWFkeSBkZWZpbmVkIGluIFJGQyAzNTg4IFtSRkMzNTg4XSwgdGhlCisJCQkgICBSZXN1bHQtQ29kZSBBVlAgbWF5IGNvbnRhaW4gb25lIG9mIHRoZSB2YWx1ZXMgZGVmaW5lZCBpbgorCQkJICAgU2VjdGlvbiAxMC4xLiAgV2hlbiB0aGUgRGlhbWV0ZXIgc2VydmVyIGZpbmRzIGFuIGVycm9yIGluIHByb2Nlc3NpbmcKKwkJCSAgIHRoZSBEaWFtZXRlciBMSVIgbWVzc2FnZSwgdGhlIERpYW1ldGVyIHNlcnZlciBNVVNUIHN0b3AgdGhlIHByb2Nlc3MKKwkJCSAgIG9mIHRoZSBtZXNzYWdlIGFuZCBhbnN3ZXIgd2l0aCBhIERpYW1ldGVyIExJQSBtZXNzYWdlIHRoYXQgaW5jbHVkZXMKKwkJCSAgIHRoZSBhcHByb3ByaWF0ZSBlcnJvciBjb2RlIGluIHRoZSBSZXN1bHQtQ29kZSBBVlAgdmFsdWUuICBXaGVuIHRoZXJlCisJCQkgICBpcyBubyBlcnJvciwgdGhlIERpYW1ldGVyIHNlcnZlciBNVVNUIHNldCB0aGUgUmVzdWx0LUNvZGUgQVZQIHZhbHVlCisJCQkgICB0byBESUFNRVRFUl9TVUNDRVNTIGluIHRoZSBEaWFtZXRlciBMSUEgbWVzc2FnZS4KKworCQkJICAgT25lIG9mIHRoZSBlcnJvcnMgdGhhdCB0aGUgRGlhbWV0ZXIgc2VydmVyIG1heSBmaW5kIGlzIHRoYXQgdGhlCisJCQkgICBTSVAtQU9SIEFWUCB2YWx1ZSBpcyBub3QgYSB2YWxpZCB1c2VyIGluIHRoZSByZWFsbS4gIEluIHN1Y2ggY2FzZXMsCisJCQkgICB0aGUgRGlhbWV0ZXIgc2VydmVyIE1VU1Qgc2V0IHRoZSBSZXN1bHQtQ29kZSBBVlAgdmFsdWUgdG8KKwkJCSAgIERJQU1FVEVSX0VSUk9SX1VTRVJfVU5LTk9XTiBhbmQgcmV0dXJuIGl0IGluIGEgRGlhbWV0ZXIgTElBIG1lc3NhZ2UuCisKKwkJCSAgIElmIHRoZSBEaWFtZXRlciBzZXJ2ZXIgY2Fubm90IHByb2Nlc3MgdGhlIERpYW1ldGVyIExJUiBjb21tYW5kLCBlLmcuLAorCQkJICAgZHVlIHRvIGEgZGF0YWJhc2UgZXJyb3IsIHRoZSBEaWFtZXRlciBzZXJ2ZXIgTVVTVCBzZXQgdGhlIFJlc3VsdC1Db2RlCisJCQkgICBBVlAgdmFsdWUgdG8gRElBTUVURVJfVU5BQkxFX1RPX0NPTVBMWSBhbmQgcmV0dXJuIGl0IGluIGEgRGlhbWV0ZXIKKwkJCSAgIExJQSBtZXNzYWdlLiAgVGhlIERpYW1ldGVyIHNlcnZlciBNVVNUIE5PVCBpbmNsdWRlIGFueSBTSVAtU2VydmVyLVVSSQorCQkJICAgb3IgU0lQLVNlcnZlci1DYXBhYmlsaXRpZXMgQVZQIGluIHRoZSBEaWFtZXRlciBMSUEgbWVzc2FnZS4KKworCQkJICAgVGhlIERpYW1ldGVyIHNlcnZlciBtYXkgb3IgbWF5IG5vdCBiZSBhd2FyZSBvZiBhIFNJUCBzZXJ2ZXIgYXNzaWduZWQKKwkJCSAgIHRvIHRoZSBTSVAtQU9SIEFWUCB2YWx1ZSBpbmNsdWRlZCBpbiB0aGUgRGlhbWV0ZXIgTElSIG1lc3NhZ2UuICBJZgorCQkJICAgdGhlIERpYW1ldGVyIHNlcnZlciBpcyBhd2FyZSBvZiBhIFNJUCBzZXJ2ZXIgYWxsb2NhdGVkIHRvIHRoYXQKKwkJCSAgIHBhcnRpY3VsYXIgdXNlciwgdGhlIERpYW1ldGVyIHNlcnZlciBNVVNUIGluY2x1ZGUgdGhlIFVSSSBvZiBzdWNoIFNJUAorCQkJICAgc2VydmVyIGluIHRoZSBTSVAtU2VydmVyLVVSSSBBVlAgYW5kIHJldHVybiBpdCBpbiBhIERpYW1ldGVyIExJQQorCQkJICAgbWVzc2FnZS4gIFRoaXMgaXMgdHlwaWNhbGx5IHRoZSBzaXR1YXRpb24gd2hlbiB0aGUgdXNlciBpcyBlaXRoZXIKKwkJCSAgIHJlZ2lzdGVyZWQsIG9yIHVucmVnaXN0ZXJlZCBidXQgYSBTSVAgc2VydmVyIGlzIHN0aWxsIGFzc2lnbmVkIHRvIHRoZQorCQkJICAgdXNlci4KKworCQkJICAgV2hlbiB0aGUgRGlhbWV0ZXIgc2VydmVyIGlzIG5vdCBhd2FyZSBvZiBhIFNJUCBzZXJ2ZXIgYWxsb2NhdGVkIHRvCisJCQkgICB0aGUgdXNlciAodHlwaWNhbGx5IHRoZSBjYXNlIHdoZW4gdGhlIHVzZXIgdW5yZWdpc3RlcmVkKSwgdGhlCisJCQkgICBSZXN1bHQtQ29kZSBBVlAgdmFsdWUgaW4gdGhlIERpYW1ldGVyIExJQSBtZXNzYWdlIGRlcGVuZHMgb24gd2hldGhlcgorCQkJICAgdGhlIERpYW1ldGVyIHNlcnZlciBpcyBhd2FyZSB0aGF0IHRoZSB1c2VyIGhhcyBzZXJ2aWNlcyBkZWZpbmVkIGZvcgorCQkJICAgdW5yZWdpc3RlcmVkIHVzZXJzOgorCisJCQkgICBvICBUaG9zZSB1c2VycyB3aG8gaGF2ZSBzZXJ2aWNlcyBkZWZpbmVkIGZvciB1bnJlZ2lzdGVyZWQgdXNlcnMgbWF5CisJCQkgICAgICByZXF1aXJlIHRoZSBhbGxvY2F0aW9uIG9mIGEgU0lQIHNlcnZlciB0byB0cmlnZ2VyIGFuZCBwZXJoYXBzCisJCQkgICAgICBleGVjdXRlIHRob3NlIHNlcnZpY2VzLiAgVGhlcmVmb3JlLCB3aGVuIHRoZSBEaWFtZXRlciBzZXJ2ZXIgaXMKKwkJCSAgICAgIG5vdCBhd2FyZSBvZiBhbiBhc3NpZ25lZCBTSVAgc2VydmVyLCBidXQgdGhlIHVzZXIgaGFzIHNlcnZpY2VzCisJCQkgICAgICBkZWZpbmVkIGZvciB1bnJlZ2lzdGVyZWQgdXNlcnMsIHRoZSBEaWFtZXRlciBzZXJ2ZXIgTVVTVCBzZXQgdGhlCisJCQkgICAgICBSZXN1bHQtQ29kZSBBVlAgdmFsdWUgdG8gRElBTUVURVJfVU5SRUdJU1RFUkVEX1NFUlZJQ0UgYW5kIHJldHVybgorCQkJICAgICAgaXQgaW4gYSBEaWFtZXRlciBMSUEgbWVzc2FnZS4gIFRoZSBEaWFtZXRlciBzZXJ2ZXIgTUFZIGFsc28KKwkJCSAgICAgIGluY2x1ZGUgYSBTSVAtU2VydmVyLUNhcGFiaWxpdGllcyBBVlAgdG8gZmFjaWxpdGF0ZSB0aGUgU0lQIHNlcnZlcgorCQkJICAgICAgKERpYW1ldGVyIGNsaWVudCkgd2l0aCB0aGUgc2VsZWN0aW9uIG9mIGFuIGFwcHJvcHJpYXRlIFNJUCBzZXJ2ZXIKKwkJCSAgICAgIHdpdGggdGhlIHJlcXVpcmVkIGNhcGFiaWxpdGllcy4gIEFic2VuY2Ugb2YgdGhlIFNJUC1TZXJ2ZXItCisJCQkgICAgICBDYXBhYmlsaXRpZXMgQVZQIGluZGljYXRlcyB0byB0aGUgU0lQIHNlcnZlciAoRGlhbWV0ZXIgY2xpZW50KQorCQkJICAgICAgdGhhdCBhbnkgU0lQIHNlcnZlciBpcyBzdWl0YWJsZSB0byBiZSBhbGxvY2F0ZWQgZm9yIHRoZSB1c2VyLgorCisJCQkgICBvICBUaG9zZSB1c2VycyB3aG8gZG8gbm90IGhhdmUgc2VydmljZSBkZWZpbmVkIGZvciB1bnJlZ2lzdGVyZWQgdXNlcnMKKwkJCSAgICAgIGRvIG5vdCByZXF1aXJlIGZ1cnRoZXIgcHJvY2Vzc2luZy4gIFRoZSBEaWFtZXRlciBzZXJ2ZXIgTVVTVCBzZXQKKwkJCSAgICAgIHRoZSBSZXN1bHQtQ29kZSBBVlAgdmFsdWUgdG8KKwkJCSAgICAgIERJQU1FVEVSX0VSUk9SX0lERU5USVRZX05PVF9SRUdJU1RFUkVEIGFuZCByZXR1cm4gaXQgdG8gdGhlCisJCQkgICAgICBEaWFtZXRlciBjbGllbnQgaW4gYSBEaWFtZXRlciBMSUEgbWVzc2FnZS4gIFRoZSBTSVAgc2VydmVyCisJCQkgICAgICAoRGlhbWV0ZXIgY2xpZW50KSBtYXkgcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBTSVAgcmVzcG9uc2UgKGUuZy4sCisJCQkgICAgICA0ODAgKFRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlKSkgdG8gdGhlIG9yaWdpbmFsIFNJUCByZXF1ZXN0LgorCisJCQkgICBUaGUgTWVzc2FnZSBGb3JtYXQgb2YgdGhlIExJQSBjb21tYW5kIGlzIGFzIGZvbGxvd3M6CisKKwkJCSAgICAgICA8TElBPiA6Oj0gPCBEaWFtZXRlciBIZWFkZXI6IDI4NSwgUFhZID4KKwkJCQkJIDwgU2Vzc2lvbi1JZCA+CisJCQkJCSB7IEF1dGgtQXBwbGljYXRpb24tSWQgfQorCQkJCQkgeyBSZXN1bHQtQ29kZSB9CisJCQkJCSB7IEF1dGgtU2Vzc2lvbi1TdGF0ZSB9CisJCQkJCSB7IE9yaWdpbi1Ib3N0IH0KKwkJCQkJIHsgT3JpZ2luLVJlYWxtIH0KKwkJCQkJIFsgU0lQLVNlcnZlci1VUkkgXQorCQkJCQkgWyBTSVAtU2VydmVyLUNhcGFiaWxpdGllcyBdCisJCQkJCSBbIEF1dGgtR3JhY2UtUGVyaW9kIF0KKwkJCQkJIFsgQXV0aG9yaXphdGlvbi1MaWZldGltZSBdCisJCQkJCSBbIFJlZGlyZWN0LUhvc3QgXQorCQkJCQkgWyBSZWRpcmVjdC1Ib3N0LVVzYWdlIF0KKwkJCQkJIFsgUmVkaXJlY3QtTWF4LUNhY2hlLVRpbWUgXQorCQkJCSAgICAgICAqIFsgUHJveHktSW5mbyBdCisJCQkJICAgICAgICogWyBSb3V0ZS1SZWNvcmQgXQorCQkJCSAgICAgICAqIFsgQVZQIF0KKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBjbWQ7CisJCQlzdHJ1Y3QgZGljdF9jbWRfZGF0YSBkYXRhID0geyAKKwkJCQkJMjg1LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJIkxvY2F0aW9uLUluZm8tQW5zd2VyIiwgCQkvKiBOYW1lICovCisJCQkJCUNNRF9GTEFHX1JFUVVFU1QgfCBDTURfRkxBR19QUk9YSUFCTEUgfCBDTURfRkxBR19FUlJPUiwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUNNRF9GTEFHX1BST1hJQUJMRSAJCQkJCQkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQl9OworCQkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9IAorCQkJCQkJeyAJIHsgICJTZXNzaW9uLUlkIiwgCQlSVUxFX0ZJWEVEX0hFQUQsIC0xLCAxIH0KKwkJCQkJCSAJLHsgICJBdXRoLUFwcGxpY2F0aW9uLUlkIiwgCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkJCQkJIAkseyAgIlJlc3VsdC1Db2RlIiwgCQlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJCQkJCSAJLHsgICJBdXRoLVNlc3Npb24tU3RhdGUiLCAJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCQkJCQkgCSx7ICAiT3JpZ2luLUhvc3QiLCAJCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkJCQkJIAkseyAgIk9yaWdpbi1SZWFsbSIsIAkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCQkJCQkgCSx7ICAiU0lQLVNlcnZlci1VUkkiLAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkgCSx7ICAiU0lQLVNlcnZlci1DYXBhYmlsaXRpZXMiLCAJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkgCSx7ICAiQXV0aC1HcmFjZS1QZXJpb2QiLCAJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkgCSx7ICAiQXV0aG9yaXphdGlvbi1MaWZldGltZSIsIAlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCSAJLHsgICJSZWRpcmVjdC1Ib3N0IiwgCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCSAJLHsgICJSZWRpcmVjdC1Ib3N0LVVzYWdlIiwgCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJIAkseyAgIlJlZGlyZWN0LU1heC1DYWNoZS1UaW1lIiwgCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJIAkseyAgIlByb3h5LUluZm8iLCAJCVJVTEVfT1BUSU9OQUwsICAgLTEsIC0xIH0KKwkJCQkJCSAJLHsgICJSb3V0ZS1SZWNvcmQiLCAJCVJVTEVfT1BUSU9OQUwsICAgLTEsIC0xIH0KKworCQkJCQkJfTsKKwkJCQorCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQ09NTUFORCwgJmRhdGEgLCBzaXAsICZjbWQpOworCQkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgY21kICk7CisJCX0KKwkJLyogUmVnaXN0cmF0aW9uLVRlcm1pbmF0aW9uLVJlcXVlc3QgKFJUUikgQ29tbWFuZCAqLworCQl7CisJCQkvKgorCQkJICAgVGhlIFJlZ2lzdHJhdGlvbi1UZXJtaW5hdGlvbi1SZXF1ZXN0IChSVFIpIGNvbW1hbmQgaXMgaW5kaWNhdGVkIGJ5CisJCQkgICB0aGUgQ29tbWFuZC1Db2RlIHNldCB0byAyODcgYW5kIHRoZSBDb21tYW5kIEZsYWdzJyAnUicgYml0IHNldC4gIFRoZQorCQkJICAgRGlhbWV0ZXIgc2VydmVyIHNlbmRzIHRoaXMgY29tbWFuZCB0byB0aGUgRGlhbWV0ZXIgY2xpZW50IGluIGEgU0lQCisJCQkgICBzZXJ2ZXIgdG8gaW5kaWNhdGUgdG8gdGhlIFNJUCBzZXJ2ZXIgdGhhdCBvbmUgb3IgbW9yZSBTSVAgQU9ScyBoYXZlCisJCQkgICB0byBiZSBkZXJlZ2lzdGVyZWQuICBUaGUgY29tbWFuZCBhbGxvd3MgYW4gb3BlcmF0b3IgdG8KKwkJCSAgIGFkbWluaXN0cmF0aXZlbHkgY2FuY2VsIHRoZSByZWdpc3RyYXRpb24gb2YgYSB1c2VyIGZyb20gYSBjZW50cmFsaXplZAorCQkJICAgRGlhbWV0ZXIgc2VydmVyLgorCisJCQkgICBUaGUgRGlhbWV0ZXIgc2VydmVyIGhhcyB0aGUgY2FwYWJpbGl0eSB0byBpbml0aWF0ZSB0aGUgZGVyZWdpc3RyYXRpb24KKwkJCSAgIG9mIGEgdXNlciBhbmQgaW5mb3JtIHRoZSBTSVAgc2VydmVyIGJ5IG1lYW5zIG9mIHRoZSBEaWFtZXRlciBSVFIKKwkJCSAgIGNvbW1hbmQuICBUaGUgRGlhbWV0ZXIgc2VydmVyIGNhbiBkZWNpZGUgd2hldGhlciBvbmx5IG9uZSBTSVAgQU9SIGlzCisJCQkgICBnb2luZyB0byBiZSBkZXJlZ2lzdGVyZWQsIGEgbGlzdCBvZiBTSVAgQU9Scywgb3IgYWxsIHRoZSBTSVAgQU9ScworCQkJICAgYWxsb2NhdGVkIHRvIHRoZSB1c2VyLgorCisJCQkgICBUaGUgYWJzZW5jZSBvZiBhIFNJUC1BT1IgQVZQIGluIHRoZSBEaWFtZXRlciBSVFIgbWVzc2FnZSBpbmRpY2F0ZXMKKwkJCSAgIHRoYXQgYWxsIHRoZSBTSVAgQU9ScyBhbGxvY2F0ZWQgdG8gdGhlIHVzZXIgaWRlbnRpZmllZCBieSB0aGUKKwkJCSAgIFVzZXItTmFtZSBBVlAgYXJlIGJlaW5nIGRlcmVnaXN0ZXJlZC4KKworCQkJICAgVGhlIERpYW1ldGVyIHNlcnZlciBNVVNUIGluY2x1ZGUgYSBTSVAtRGVyZWdpc3RyYXRpb24tUmVhc29uIEFWUAorCQkJICAgdmFsdWUgdG8gaW5kaWNhdGUgdGhlIHJlYXNvbiBmb3IgdGhlIGRlcmVnaXN0cmF0aW9uLgorCisJCQkgICBUaGUgTWVzc2FnZSBGb3JtYXQgb2YgdGhlIFJUUiBjb21tYW5kIGlzIGFzIGZvbGxvd3M6CisKKwkJCSAgICAgICA8UlRSPiA6Oj0gPCBEaWFtZXRlciBIZWFkZXI6IDI4NywgUkVRLCBQWFkgPgorCQkJCQkgPCBTZXNzaW9uLUlkID4KKwkJCQkJIHsgQXV0aC1BcHBsaWNhdGlvbi1JZCB9CisJCQkJCSB7IEF1dGgtU2Vzc2lvbi1TdGF0ZSB9CisJCQkJCSB7IE9yaWdpbi1Ib3N0IH0KKwkJCQkJIHsgT3JpZ2luLVJlYWxtIH0KKwkJCQkJIHsgRGVzdGluYXRpb24tSG9zdCB9CisJCQkJCSB7IFNJUC1EZXJlZ2lzdHJhdGlvbi1SZWFzb24gfQorCQkJCQkgWyBEZXN0aW5hdGlvbi1SZWFsbSBdCisJCQkJCSBbIFVzZXItTmFtZSBdCisJCQkJICAgICAgICogWyBTSVAtQU9SIF0KKwkJCQkgICAgICAgKiBbIFByb3h5LUluZm8gXQorCQkJCSAgICAgICAqIFsgUm91dGUtUmVjb3JkIF0KKwkJCQkgICAgICAgKiBbIEFWUCBdCisKKwkJCQorCisKKworCQkJKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGNtZDsKKwkJCXN0cnVjdCBkaWN0X2NtZF9kYXRhIGRhdGEgPSB7IAorCQkJCQkyODcsIAkJCQkJLyogQ29kZSAqLworCQkJCQkiUmVnaXN0cmF0aW9uLVRlcm1pbmF0aW9uLVJlcXVlc3QiLCAJCS8qIE5hbWUgKi8KKwkJCQkJQ01EX0ZMQUdfUkVRVUVTVCB8IENNRF9GTEFHX1BST1hJQUJMRSB8IENNRF9GTEFHX0VSUk9SLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQ01EX0ZMQUdfUkVRVUVTVCB8IENNRF9GTEFHX1BST1hJQUJMRSAJCQkJCQkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQl9OworCQkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9IAorCQkJCQkJeyAJIHsgICJTZXNzaW9uLUlkIiwgCQlSVUxFX0ZJWEVEX0hFQUQsIC0xLCAxIH0KKwkJCQkJCSAJLHsgICJBdXRoLUFwcGxpY2F0aW9uLUlkIiwgCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkJCQkJIAkseyAgIkF1dGgtU2Vzc2lvbi1TdGF0ZSIsIAlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJCQkJCSAJLHsgICJPcmlnaW4tSG9zdCIsIAkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCQkJCQkgCSx7ICAiT3JpZ2luLVJlYWxtIiwgCQlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJCQkJCSAJLHsgICJEZXN0aW5hdGlvbi1Ib3N0IiwgCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkJCQkJIAkseyAgIlNJUC1EZXJlZ2lzdHJhdGlvbi1SZWFzb24iLFJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQkKKwkJCQkJCSAJLHsgICJEZXN0aW5hdGlvbi1SZWFsbSIsCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJIAkseyAgIlVzZXItTmFtZSIsIAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkgCSx7ICAiU0lQLUFPUiIsIAkJCVJVTEVfUkVRVUlSRUQsICAgLTEsIC0xIH0KKwkJCQkJCSAJLHsgICJQcm94eS1JbmZvIiwgCQlSVUxFX09QVElPTkFMLCAgIC0xLCAtMSB9CisJCQkJCQkgCSx7ICAiUm91dGUtUmVjb3JkIiwgCQlSVUxFX09QVElPTkFMLCAgIC0xLCAtMSB9CisKKwkJCQkJCX07CisJCQkKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0NPTU1BTkQsICZkYXRhICwgc2lwLCAmY21kKTsKKwkJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGNtZCApOworCQl9CisJCS8qIFJlZ2lzdHJhdGlvbi1UZXJtaW5hdGlvbi1BbnN3ZXIgKFJUQSkgQ29tbWFuZCAqLworCQl7CisJCQkvKgorCQkJICAgVGhlIFJlZ2lzdHJhdGlvbi1UZXJtaW5hdGlvbi1BbnN3ZXIgKFJUQSkgaXMgaW5kaWNhdGVkIGJ5IHRoZQorCQkJICAgQ29tbWFuZC1Db2RlIHNldCB0byAyODcgYW5kIHRoZSBDb21tYW5kIEZsYWdzJyAnUicgYml0IGNsZWFyZWQuICBUaGUKKwkJCSAgIERpYW1ldGVyIGNsaWVudCBzZW5kcyB0aGlzIGNvbW1hbmQgaW4gcmVzcG9uc2UgdG8gYSBwcmV2aW91c2x5CisJCQkgICByZWNlaXZlZCBEaWFtZXRlciBSZWdpc3RyYXRpb24tVGVybWluYXRpb24tUmVxdWVzdCAoUlRSKSBjb21tYW5kLgorCisJCQkgICBJbiBhZGRpdGlvbiB0byB0aGUgdmFsdWVzIGFscmVhZHkgZGVmaW5lZCBpbiBSRkMgMzU4OCBbUkZDMzU4OF0sIHRoZQorCQkJICAgUmVzdWx0LUNvZGUgQVZQIG1heSBjb250YWluIG9uZSBvZiB0aGUgdmFsdWVzIGRlZmluZWQgaW4KKwkJCSAgIFNlY3Rpb24gMTAuMS4KKworCQkJICAgSWYgdGhlIFNJUCBzZXJ2ZXIgKERpYW1ldGVyIGNsaWVudCkgcmVxdWlyZXMgYSBVc2VyLU5hbWUgQVZQIHZhbHVlIHRvCisJCQkgICBwcm9jZXNzIHRoZSBEaWFtZXRlciBSVFIgcmVxdWVzdCwgYnV0IHRoZSBEaWFtZXRlciBSVFIgbWVzc2FnZSBkaWQKKwkJCSAgIG5vdCBjb250YWluIGEgVXNlci1OYW1lIEFWUCB2YWx1ZSwgdGhlIERpYW1ldGVyIGNsaWVudCBNVVNUIHNldCB0aGUKKwkJCSAgIFJlc3VsdC1Db2RlIEFWUCB2YWx1ZSB0byBESUFNRVRFUl9VU0VSX05BTUVfUkVRVUlSRUQgKHNlZSBTZWN0aW9uCisJCQkgICAxMC4xLjIpIGFuZCByZXR1cm4gaXQgaW4gYSBEaWFtZXRlciBSVEEgbWVzc2FnZS4KKworCQkJICAgVGhlIFNJUCBzZXJ2ZXIgKERpYW1ldGVyIGNsaWVudCkgYXBwbGllcyB0aGUgYWRtaW5pc3RyYXRpdmUKKwkJCSAgIGRlcmVnaXN0cmF0aW9uIHRvIGVhY2ggb2YgdGhlIFVSSXMgaW5jbHVkZWQgaW4gZWFjaCBvZiB0aGUgU0lQLUFPUgorCQkJICAgQVZQIHZhbHVlcywgb3IsIGlmIHRoZXJlIGlzIG5vIFNJUC1BT1IgQVZQIHByZXNlbnQgaW4gdGhlIERpYW1ldGVyCisJCQkgICBSVFIgcmVxdWVzdCwgdG8gYWxsIHRoZSBVUklzIGFsbG9jYXRlZCB0byB0aGUgVXNlci1OYW1lIEFWUCB2YWx1ZS4KKworCQkJICAgVGhlIHZhbHVlIG9mIHRoZSBTSVAtRGVyZWdpc3RyYXRpb24tUmVhc29uIEFWUCBpbiB0aGUgRGlhbWV0ZXIgUlRSCisJCQkgICBjb21tYW5kIGhhcyBhbiBlZmZlY3Qgb24gdGhlIGFjdGlvbnMgcGVyZm9ybWVkIGF0IHRoZSBTSVAgc2VydmVyCisJCQkgICAoRGlhbWV0ZXIgY2xpZW50KToKKworCQkJICAgbyAgSWYgdGhlIHZhbHVlIGlzIHNldCB0byBQRVJNQU5FTlRfVEVSTUlOQVRJT04sIHRoZW4gdGhlIHVzZXIgaGFzCisJCQkgICAgICB0ZXJtaW5hdGVkIGhpcy9oZXIgcmVnaXN0cmF0aW9uIHRvIHRoZSByZWFsbS4gIElmIGluZm9ybWluZyB0aGUKKwkJCSAgICAgIGludGVyZXN0ZWQgcGFydGllcyAoZS5nLiwgc3Vic2NyaWJlcnMgdG8gdGhlICJyZWciIGV2ZW50CisJCQkgICAgICBbUkZDMzY4MF0pIGFib3V0IHRoZSBhZG1pbmlzdHJhdGl2ZSBkZXJlZ2lzdHJhdGlvbiBpcyBzdXBwb3J0ZWQKKwkJCSAgICAgIHRocm91Z2ggU0lQIHByb2NlZHVyZXMsIHRoZSBTSVAgc2VydmVyIChEaWFtZXRlciBjbGllbnQpIHdpbGwgZG8KKwkJCSAgICAgIHNvLiAgVGhlIERpYW1ldGVyIENsaWVudCBpbiB0aGUgU0lQIFNlcnZlciBTSE9VTEQgTk9UIHJlcXVlc3QgYQorCQkJICAgICAgbmV3IHVzZXIgcmVnaXN0cmF0aW9uLiAgVGhlIFNJUCBzZXJ2ZXIgY2xlYXJzIHRoZSByZWdpc3RyYXRpb24KKwkJCSAgICAgIHN0YXRlIG9mIHRoZSBkZXJlZ2lzdGVyZWQgQU9Scy4KKworCQkJICAgbyAgSWYgdGhlIHZhbHVlIGlzIHNldCB0byBORVdfU0lQX1NFUlZFUl9BU1NJR05FRCwgdGhlIERpYW1ldGVyCisJCQkgICAgICBzZXJ2ZXIgaW5mb3JtcyB0aGUgU0lQIHNlcnZlciAoRGlhbWV0ZXIgY2xpZW50KSB0aGF0IGEgbmV3IFNJUAorCQkJICAgICAgc2VydmVyIGhhcyBiZWVuIGFsbG9jYXRlZCB0byB0aGUgdXNlciwgZHVlIHRvIHNvbWUgcmVhc29uLiAgVGhlCisJCQkgICAgICBTSVAgc2VydmVyLCBpZiBzdXBwb3J0ZWQgdGhyb3VnaCBTSVAgcHJvY2VkdXJlcywgd2lsbCBpbmZvcm0gdGhlCisJCQkgICAgICBpbnRlcmVzdGVkIHBhcnRpZXMgKGUuZy4sIHN1YnNjcmliZXJzIHRvIHRoZSAicmVnIiBldmVudAorCQkJICAgICAgW1JGQzM2ODBdKSBhYm91dCB0aGUgYWRtaW5pc3RyYXRpdmUgZGVyZWdpc3RyYXRpb24gYXQgdGhpcyBTSVAKKwkJCSAgICAgIHNlcnZlci4gIFRoZSBEaWFtZXRlciBjbGllbnQgaW4gdGhlIFNJUCBzZXJ2ZXIgU0hPVUxEIE5PVCByZXF1ZXN0CisJCQkgICAgICBhIG5ldyB1c2VyIHJlZ2lzdHJhdGlvbi4gIFRoZSBTSVAgc2VydmVyIGNsZWFycyB0aGUgcmVnaXN0cmF0aW9uCisJCQkgICAgICBzdGF0ZSBvZiB0aGUgZGVyZWdpc3RlcmVkIFNJUCBBT1JzLgorCisJCQkgICBvICBJZiB0aGUgdmFsdWUgaXMgc2V0IHRvIFNJUF9TRVJWRVJfQ0hBTkdFLCB0aGUgRGlhbWV0ZXIgc2VydmVyCisJCQkgICAgICBpbmZvcm1zIHRoZSBTSVAgc2VydmVyIChEaWFtZXRlciBjbGllbnQpIHRoYXQgYSBuZXcgU0lQIHNlcnZlciBoYXMKKwkJCSAgICAgIHRvIGJlIGFsbG9jYXRlZCB0byB0aGUgdXNlciwgZS5nLiwgZHVlIHRvIHVzZXIncyBjYXBhYmlsaXRpZXMKKwkJCSAgICAgIHJlcXVpcmluZyBhIG5ldyBTSVAgc2VydmVyLCBvciBub3QgZW5vdWdoIHJlc291cmNlcyBpbiB0aGUgY3VycmVudAorCQkJICAgICAgU0lQIHNlcnZlci4gIElmIGluZm9ybWluZyB0aGUgaW50ZXJlc3RlZCBwYXJ0aWVzIGFib3V0IHRoZQorCQkJICAgICAgYWRtaW5pc3RyYXRpdmUgZGVyZWdpc3RyYXRpb24gaXMgc3VwcG9ydGVkIHRocm91Z2ggU0lQIHByb2NlZHVyZXMKKwkJCSAgICAgIChlLmcuLCBzdWJzY3JpcHRpb25zIHRvIHRoZSAicmVnIiBldmVudCBbUkZDMzY4MF0pLCB0aGUgU0lQIHNlcnZlcgorCQkJICAgICAgd2lsbCBkbyBzby4gIFRoZSBEaWFtZXRlciBjbGllbnQgaW4gdGhlIFNJUCBTZXJ2ZXIgU0hPVUxEIE5PVAorCQkJICAgICAgcmVxdWVzdCBhIG5ldyB1c2VyIHJlZ2lzdHJhdGlvbi4gIFRoZSBTSVAgc2VydmVyIGNsZWFycyB0aGUKKwkJCSAgICAgIHJlZ2lzdHJhdGlvbiBzdGF0ZSBvZiB0aGUgZGVyZWdpc3RlcmVkIFNJUCBBT1JzLgorCisJCQkgICBvICBJZiB0aGUgdmFsdWUgaXMgc2V0IHRvIFJFTU9WRV9TSVBfU0VSVkVSLCB0aGUgRGlhbWV0ZXIgc2VydmVyCisJCQkgICAgICBpbmZvcm1zIHRoZSBTSVAgc2VydmVyIChEaWFtZXRlciBjbGllbnQpIHRoYXQgdGhlIFNJUCBzZXJ2ZXIgd2lsbAorCQkJICAgICAgbm8gbG9uZ2VyIGJlIGJvdW5kIGluIHRoZSBEaWFtZXRlciBzZXJ2ZXIgd2l0aCB0aGF0IHVzZXIuICBUaGUgU0lQCisJCQkgICAgICBzZXJ2ZXIgY2FuIGRlbGV0ZSBhbGwgZGF0YSByZWxhdGVkIHRvIHRoZSB1c2VyLgorCisJCQkgICBUaGUgTWVzc2FnZSBGb3JtYXQgb2YgdGhlIFJUQSBjb21tYW5kIGlzIGFzIGZvbGxvd3M6CisKKwkJCSAgICAgICA8UlRBPiA6Oj0gPCBEaWFtZXRlciBIZWFkZXI6IDI4NywgUFhZID4KKwkJCQkJIDwgU2Vzc2lvbi1JZCA+CisJCQkJCSB7IEF1dGgtQXBwbGljYXRpb24tSWQgfQorCQkJCQkgeyBSZXN1bHQtQ29kZSB9CisJCQkJCSB7IEF1dGgtU2Vzc2lvbi1TdGF0ZSB9CisJCQkJCSB7IE9yaWdpbi1Ib3N0IH0KKwkJCQkJIHsgT3JpZ2luLVJlYWxtIH0KKwkJCQkJIFsgQXV0aG9yaXphdGlvbi1MaWZldGltZSBdCisJCQkJCSBbIEF1dGgtR3JhY2UtUGVyaW9kIF0KKwkJCQkJIFsgUmVkaXJlY3QtSG9zdCBdCisJCQkJCSBbIFJlZGlyZWN0LUhvc3QtVXNhZ2UgXQorCQkJCQkgWyBSZWRpcmVjdC1NYXgtQ2FjaGUtVGltZSBdCisJCQkJICAgICAgICogWyBQcm94eS1JbmZvIF0KKwkJCQkgICAgICAgKiBbIFJvdXRlLVJlY29yZCBdCisJCQkJICAgICAgICogWyBBVlAgXQorCisJCQkqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogY21kOworCQkJc3RydWN0IGRpY3RfY21kX2RhdGEgZGF0YSA9IHsgCisJCQkJCTI4NywgCQkJCQkvKiBDb2RlICovCisJCQkJCSJSZWdpc3RyYXRpb24tVGVybWluYXRpb24tQW5zd2VyIiwgCQkvKiBOYW1lICovCisJCQkJCUNNRF9GTEFHX1JFUVVFU1QgfCBDTURfRkxBR19QUk9YSUFCTEUgfCBDTURfRkxBR19FUlJPUiwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUNNRF9GTEFHX1BST1hJQUJMRSAJCQkJCQkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQl9OworCQkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9IAorCQkJCQkJeyAJIHsgICJTZXNzaW9uLUlkIiwgCQlSVUxFX0ZJWEVEX0hFQUQsIC0xLCAxIH0KKwkJCQkJCSAJLHsgICJBdXRoLUFwcGxpY2F0aW9uLUlkIiwgCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkJCQkJIAkseyAgIlJlc3VsdC1Db2RlIiwgCQlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJCQkJCSAJLHsgICJBdXRoLVNlc3Npb24tU3RhdGUiLCAJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCQkJCQkgCSx7ICAiT3JpZ2luLUhvc3QiLCAJCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkJCQkJIAkseyAgIk9yaWdpbi1SZWFsbSIsIAkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCQkJCQkgCSx7ICAiQXV0aG9yaXphdGlvbi1MaWZldGltZSIsCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJIAkseyAgIkF1dGgtR3JhY2UtUGVyaW9kIiwgCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJIAkseyAgIlJlZGlyZWN0LUhvc3QiLCAJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJIAkseyAgIlJlZGlyZWN0LUhvc3QtVXNhZ2UiLCAJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkgCSx7ICAiUmVkaXJlY3QtTWF4LUNhY2hlLVRpbWUiLCAJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkgCSx7ICAiUHJveHktSW5mbyIsIAkJUlVMRV9PUFRJT05BTCwgICAtMSwgLTEgfQorCQkJCQkJIAkseyAgIlJvdXRlLVJlY29yZCIsIAkJUlVMRV9PUFRJT05BTCwgICAtMSwgLTEgfQorCisJCQkJCQl9OworCQkJCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9DT01NQU5ELCAmZGF0YSAsIHNpcCwgJmNtZCk7CisJCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBjbWQgKTsKKwkJfQorCQkKKwkJLyogUHVzaC1Qcm9maWxlLVJlcXVlc3QgKFBQUikgQ29tbWFuZCAqLworCQl7CisJCQkvKgorCQkJICAgVGhlIFB1c2gtUHJvZmlsZS1SZXF1ZXN0IChQUFIpIGNvbW1hbmQgaXMgaW5kaWNhdGVkIGJ5IHRoZQorCQkJICAgQ29tbWFuZC1Db2RlIHNldCB0byAyODggYW5kIHRoZSBDb21tYW5kIEZsYWdzJyAnUicgYml0IHNldC4gIFRoZQorCQkJICAgRGlhbWV0ZXIgc2VydmVyIHNlbmRzIHRoaXMgY29tbWFuZCB0byB0aGUgRGlhbWV0ZXIgY2xpZW50IGluIGEgU0lQCisJCQkgICBzZXJ2ZXIgdG8gdXBkYXRlIGVpdGhlciB0aGUgdXNlciBwcm9maWxlIG9mIGFuIGFscmVhZHkgcmVnaXN0ZXJlZAorCQkJICAgdXNlciBpbiB0aGF0IFNJUCBzZXJ2ZXIgb3IgdGhlIFNJUCBhY2NvdW50aW5nIGluZm9ybWF0aW9uLiAgVGhpcworCQkJICAgYWxsb3dzIGFuIG9wZXJhdG9yIHRvIG1vZGlmeSB0aGUgZGF0YSBvZiBhIHVzZXIgcHJvZmlsZSBvciB0aGUKKwkJCSAgIGFjY291bnRpbmcgaW5mb3JtYXRpb24gYW5kIHB1c2ggaXQgdG8gdGhlIFNJUCBzZXJ2ZXIgd2hlcmUgdGhlIHVzZXIKKwkJCSAgIGlzIHJlZ2lzdGVyZWQuCisKKwkJCSAgIEVhY2ggdXNlciBoYXMgYSB1c2VyIHByb2ZpbGUgYXNzb2NpYXRlZCB3aXRoIGhpbS9oZXIgYW5kIG90aGVyCisJCQkgICBhY2NvdW50aW5nIGluZm9ybWF0aW9uLiAgVGhlIHByb2ZpbGUgb3IgdGhlIGFjY291bnRpbmcgaW5mb3JtYXRpb24KKwkJCSAgIG1heSBjaGFuZ2Ugd2l0aCB0aW1lLCBlLmcuLCBkdWUgdG8gYWRkaXRpb24gb2YgbmV3IHNlcnZpY2VzIHRvIHRoZQorCQkJICAgdXNlci4gIFdoZW4gdGhlIHVzZXIgcHJvZmlsZSBvciB0aGUgYWNjb3VudGluZyBpbmZvcm1hdGlvbiBjaGFuZ2VzLAorCQkJICAgdGhlIERpYW1ldGVyIHNlcnZlciBzZW5kcyBhIERpYW1ldGVyIFB1c2gtUHJvZmlsZS1SZXF1ZXN0IChQUFIpCisJCQkgICBjb21tYW5kIHRvIHRoZSBEaWFtZXRlciBjbGllbnQgaW4gYSBTSVAgc2VydmVyLCBpbiBvcmRlciB0byBzdGFydAorCQkJICAgYXBwbHlpbmcgdGhvc2UgbmV3IHNlcnZpY2VzLgorCisJCQkgICBBIFBQUiBjb21tYW5kIE1BWSBjb250YWluIGEgU0lQLUFjY291bnRpbmctSW5mb3JtYXRpb24gQVZQIHRoYXQKKwkJCSAgIHVwZGF0ZXMgdGhlIGFkZHJlc3NlcyBvZiB0aGUgYWNjb3VudGluZyBzZXJ2ZXJzLiAgQ2hhbmdlcyBpbiB0aGUKKwkJCSAgIGFkZHJlc3NlcyBvZiB0aGUgYWNjb3VudGluZyBzZXJ2ZXJzIHRha2UgZWZmZWN0IGltbWVkaWF0ZWx5LiAgVGhlCisJCQkgICBEaWFtZXRlciBjbGllbnQgU0hPVUxEIGNsb3NlIGFueSBleGlzdGluZyBhY2NvdW50aW5nIHNlc3Npb24gd2l0aCB0aGUKKwkJCSAgIGV4aXN0aW5nIHNlcnZlciBhbmQgc3RhcnQgcHJvdmlkaW5nIGFjY291bnRpbmcgaW5mb3JtYXRpb24gdG8gdGhlCisJCQkgICBuZXdseSBhY3F1aXJlZCBhY2NvdW50aW5nIHNlcnZlci4KKworCQkJICAgQSBQUFIgY29tbWFuZCBNQVkgY29udGFpbiB6ZXJvIG9yIG1vcmUgU0lQLVVzZXItRGF0YSBBVlAgdmFsdWVzCisJCQkgICBjb250YWluaW5nIHRoZSBuZXcgdXNlciBwcm9maWxlLiAgT24gc2VsZWN0aW5nIHRoZSB0eXBlIG9mIHVzZXIgZGF0YSwKKwkJCSAgIHRoZSBEaWFtZXRlciBzZXJ2ZXIgU0hPVUxEIHRha2UgaW50byBhY2NvdW50IHRoZSBzdXBwb3J0ZWQgZm9ybWF0cyBhdAorCQkJICAgdGhlIFNJUCBzZXJ2ZXIgKFNJUC1TdXBwb3J0ZWQtVXNlci1EYXRhLVR5cGUgQVZQIHNlbnQgaW4gYSBwcmV2aW91cworCQkJICAgU0FSIG1lc3NhZ2UpIGFuZCB0aGUgbG9jYWwgcG9saWN5LgorCisJCQkgICBUaGUgVXNlci1OYW1lIEFWUCBpbmRpY2F0ZXMgdGhlIHVzZXIgdG8gd2hvbSB0aGUgcHJvZmlsZSBpcworCQkJICAgYXBwbGljYWJsZS4KKworCQkJICAgVGhlIE1lc3NhZ2UgRm9ybWF0IG9mIHRoZSBQUFIgY29tbWFuZCBpcyBhcyBmb2xsb3dzOgorCisJCQkgICAgICAgPFBQUj4gOjo9IDwgRGlhbWV0ZXIgSGVhZGVyOiAyODgsIFJFUSwgUFhZID4KKwkJCQkJIDwgU2Vzc2lvbi1JZCA+CisJCQkJCSB7IEF1dGgtQXBwbGljYXRpb24tSWQgfQorCQkJCQkgeyBBdXRoLVNlc3Npb24tU3RhdGUgfQorCQkJCQkgeyBPcmlnaW4tSG9zdCB9CisJCQkJCSB7IE9yaWdpbi1SZWFsbSB9CisJCQkJCSB7IERlc3RpbmF0aW9uLVJlYWxtIH0KKwkJCQkJIHsgVXNlci1OYW1lIH0KKwkJCQkgICAgICAgKiBbIFNJUC1Vc2VyLURhdGEgXQorCQkJCQkgWyBTSVAtQWNjb3VudGluZy1JbmZvcm1hdGlvbiBdCisJCQkJCSBbIERlc3RpbmF0aW9uLUhvc3QgXQorCQkJCQkgWyBBdXRob3JpemF0aW9uLUxpZmV0aW1lIF0KKwkJCQkJIFsgQXV0aC1HcmFjZS1QZXJpb2QgXQorCQkJCSAgICAgICAqIFsgUHJveHktSW5mbyBdCisJCQkJICAgICAgICogWyBSb3V0ZS1SZWNvcmQgXQorCQkJCSAgICAgICAqIFsgQVZQIF0KKworCQkJKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGNtZDsKKwkJCXN0cnVjdCBkaWN0X2NtZF9kYXRhIGRhdGEgPSB7IAorCQkJCQkyODgsIAkJCQkJLyogQ29kZSAqLworCQkJCQkiUHVzaC1Qcm9maWxlLVJlcXVlc3QiLCAJCS8qIE5hbWUgKi8KKwkJCQkJQ01EX0ZMQUdfUkVRVUVTVCB8IENNRF9GTEFHX1BST1hJQUJMRSB8IENNRF9GTEFHX0VSUk9SLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQ01EX0ZMQUdfUkVRVUVTVCB8IENNRF9GTEFHX1BST1hJQUJMRSAJCQkJCQkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQl9OworCQkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9IAorCQkJCQkJeyAJIHsgICJTZXNzaW9uLUlkIiwgCQkJUlVMRV9GSVhFRF9IRUFELCAtMSwgMSB9CisJCQkJCQkgCSx7ICAiQXV0aC1BcHBsaWNhdGlvbi1JZCIsIAkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCQkJCQkgCSx7ICAiQXV0aC1TZXNzaW9uLVN0YXRlIiwgCQlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJCQkJCSAJLHsgICJPcmlnaW4tSG9zdCIsIAkJCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkJCQkJIAkseyAgIk9yaWdpbi1SZWFsbSIsIAkJCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkJCQkJIAkseyAgIkRlc3RpbmF0aW9uLVJlYWxtIiwJCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkJCQkJIAkseyAgIlVzZXItTmFtZSIsIAkJCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkJCQkJIAkseyAgIlNJUC1Vc2VyLURhdGEiLCAJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAtMSB9CisJCQkJCQkgCSx7ICAiU0lQLUFjY291bnRpbmctSW5mb3JtYXRpb24iLCAJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkgCSx7ICAiRGVzdGluYXRpb24tSG9zdCIsIAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkgCSx7ICAiQXV0aG9yaXphdGlvbi1MaWZldGltZSIsIAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkgCSx7ICAiQXV0aC1HcmFjZS1QZXJpb2QiLCAJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJIAkseyAgIlByb3h5LUluZm8iLCAJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAtMSB9CisJCQkJCQkgCSx7ICAiUm91dGUtUmVjb3JkIiwgCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgLTEgfQorCisJCQkJCQl9OworCQkJCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9DT01NQU5ELCAmZGF0YSAsIHNpcCwgJmNtZCk7CisJCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBjbWQgKTsKKwkJfQorCQkvKiBQdXNoLVByb2ZpbGUtQW5zd2VyIChQUEEpIENvbW1hbmQgKi8KKwkJeworCQkJLyoKKwkJCQorCQkJCisJCQlUaGUgUHVzaC1Qcm9maWxlLUFuc3dlciAoUFBBKSBpcyBpbmRpY2F0ZWQgYnkgdGhlIENvbW1hbmQtQ29kZSBzZXQgdG8KKwkJCTI4OCBhbmQgdGhlIENvbW1hbmQgRmxhZ3MnICdSJyBiaXQgY2xlYXJlZC4gIFRoZSBEaWFtZXRlciBjbGllbnQKKwkJCXNlbmRzIHRoaXMgY29tbWFuZCBpbiByZXNwb25zZSB0byBhIHByZXZpb3VzbHkgcmVjZWl2ZWQgRGlhbWV0ZXIKKwkJCVB1c2gtUHJvZmlsZS1SZXF1ZXN0IChQUFIpIGNvbW1hbmQuCisKKwkJCUluIGFkZGl0aW9uIHRvIHRoZSB2YWx1ZXMgYWxyZWFkeSBkZWZpbmVkIGluIFJGQyAzNTg4IFtSRkMzNTg4XSwgdGhlCisJCQlSZXN1bHQtQ29kZSBBVlAgbWF5IGNvbnRhaW4gb25lIG9mIHRoZSB2YWx1ZXMgZGVmaW5lZCBpbgorCQkJU2VjdGlvbiAxMC4xLgorCisJCQlJZiB0aGVyZSBpcyBubyBlcnJvciB3aGVuIHByb2Nlc3NpbmcgdGhlIHJlY2VpdmVkIERpYW1ldGVyIFBQUgorCQkJbWVzc2FnZSwgdGhlIFNJUCBzZXJ2ZXIgKERpYW1ldGVyIGNsaWVudCkgTVVTVCBkb3dubG9hZCB0aGUgcmVjZWl2ZWQKKwkJCXVzZXIgcHJvZmlsZSBmcm9tIHRoZSBTSVAtVXNlci1EYXRhIEFWUCB2YWx1ZXMgaW4gdGhlIERpYW1ldGVyIFBQUgorCQkJbWVzc2FnZSBhbmQgc3RvcmUgaXQgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyIHNwZWNpZmllZCBpbiB0aGUKKwkJCVVzZXItTmFtZSBBVlAgdmFsdWUuCisKKwkJCUlmIHRoZSBTSVAgc2VydmVyIGRvZXMgbm90IHJlY29nbml6ZSBvciBkb2VzIG5vdCBzdXBwb3J0IHNvbWUgb2YgdGhlCisJCQlkYXRhIHRyYW5zZmVycmVkIGluIHRoZSBTSVAtVXNlci1EYXRhIEFWUCB2YWx1ZXMsIHRoZSBEaWFtZXRlciBjbGllbnQKKwkJCWluIHRoZSBTSVAgc2VydmVyIE1VU1QgcmV0dXJuIGEgRGlhbWV0ZXIgUFBBIG1lc3NhZ2UgdGhhdCBpbmNsdWRlcyBhCisJCQlSZXN1bHQtQ29kZSBBVlAgc2V0IHRvIHRoZSB2YWx1ZSBESUFNRVRFUl9FUlJPUl9OT1RfU1VQUE9SVEVEX1VTRVJfREFUQS4KKworCQkJSWYgdGhlIFNJUCBzZXJ2ZXIgKERpYW1ldGVyIGNsaWVudCkgcmVjZWl2ZXMgYSBEaWFtZXRlciBQUFIgbWVzc2FnZQorCQkJd2l0aCBhIFVzZXItTmFtZSBBVlAgdGhhdCBpcyB1bmtub3duLCB0aGUgRGlhbWV0ZXIgY2xpZW50IE1VU1Qgc2V0CisJCQl0aGUgUmVzdWx0LUNvZGUgQVZQIHZhbHVlIHRvIERJQU1FVEVSX0VSUk9SX1VTRVJfVU5LTk9XTiBhbmQgTVVTVAorCQkJcmV0dXJuIGl0IHRvIHRoZSBEaWFtZXRlciBzZXJ2ZXIgaW4gYSBEaWFtZXRlciBQUEEgbWVzc2FnZS4KKworCQkJSWYgdGhlIFNJUCBzZXJ2ZXIgKERpYW1ldGVyIGNsaWVudCkgcmVjZWl2ZXMgaW4gdGhlCisJCQlTSVAtVXNlci1EYXRhLUNvbnRlbnQgQVZQIHZhbHVlIChvZiB0aGUgZ3JvdXBlZCBTSVAtVXNlci1EYXRhIEFWUCkKKwkJCW1vcmUgZGF0YSB0aGFuIGl0IGNhbiBhY2NlcHQsIGl0IE1VU1Qgc2V0IHRoZSBSZXN1bHQtQ29kZSBBVlAgdmFsdWUKKwkJCXRvIERJQU1FVEVSX0VSUk9SX1RPT19NVUNIX0RBVEEgYW5kIE1VU1QgcmV0dXJuIGl0IHRvIHRoZSBEaWFtZXRlcgorCQkJc2VydmVyIGluIGEgRGlhbWV0ZXIgUFBBIG1lc3NhZ2UuICBUaGUgU0lQIHNlcnZlciBNVVNUIE5PVCBvdmVycmlkZQorCQkJdGhlIGV4aXN0aW5nIHVzZXIgcHJvZmlsZSB3aXRoIHRoZSBvbmUgcmVjZWl2ZWQgaW4gdGhlIFBQUiBtZXNzYWdlLgorCisJCQlJZiB0aGUgRGlhbWV0ZXIgc2VydmVyIHJlY2VpdmVzIHRoZSBSZXN1bHQtQ29kZSBBVlAgdmFsdWUgc2V0IHRvCisJCQlESUFNRVRFUl9FUlJPUl9UT09fTVVDSF9EQVRBIGluIGEgRGlhbWV0ZXIgUFBBIG1lc3NhZ2UsIGl0IFNIT1VMRAorCQkJZm9yY2UgYSBuZXcgcmUtcmVnaXN0cmF0aW9uIG9mIHRoZSB1c2VyIGJ5IHNlbmRpbmcgdG8gdGhlIERpYW1ldGVyCisJCQljbGllbnQgYSBEaWFtZXRlciBSZWdpc3RyYXRpb24tVGVybWluYXRpb24tUmVxdWVzdCAoUlRSKSB3aXRoIHRoZQorCQkJU0lQLURlcmVnaXN0cmF0aW9uLVJlYXNvbiBBVlAgdmFsdWUgc2V0IHRvIFNJUF9TRVJWRVJfQ0hBTkdFLiAgVGhpcworCQkJd2lsbCBmb3JjZSBhIHJlLXJlZ2lzdHJhdGlvbiBvZiB0aGUgdXNlciBhbmQgd2lsbCB0cmlnZ2VyIGEgc2VsZWN0aW9uCisJCQlvZiBhIG5ldyBTSVAgc2VydmVyLgorCisJCQlJZiB0aGUgRGlhbWV0ZXIgY2xpZW50IGlzIG5vdCBhYmxlIHRvIGhvbm9yIHRoZSBjb21tYW5kLCBmb3IgYW55CisJCQlvdGhlciByZWFzb24sIGl0IE1VU1Qgc2V0IHRoZSBSZXN1bHQtQ29kZSBBVlAgdmFsdWUgdG8KKwkJCURJQU1FVEVSX1VOQUJMRV9UT19DT01QTFkgYW5kIGl0IE1VU1QgcmV0dXJuIGl0IGluIGEgRGlhbWV0ZXIgUFBBCisJCQltZXNzYWdlLgorCisJCQlUaGUgTWVzc2FnZSBGb3JtYXQgb2YgdGhlIFBQQSBjb21tYW5kIGlzIGFzIGZvbGxvd3M6CisKKwkJCTxQUEE+IDo6PSA8IERpYW1ldGVyIEhlYWRlcjogMjg4LCBQWFkgPgorCQkJCSA8IFNlc3Npb24tSWQgPgorCQkJCSB7IEF1dGgtQXBwbGljYXRpb24tSWQgfQorCQkJCSB7IFJlc3VsdC1Db2RlIH0KKwkJCQkgeyBBdXRoLVNlc3Npb24tU3RhdGUgfQorCQkJCSB7IE9yaWdpbi1Ib3N0IH0KKwkJCQkgeyBPcmlnaW4tUmVhbG0gfQorCQkJCSBbIFJlZGlyZWN0LUhvc3QgXQorCQkJCSBbIFJlZGlyZWN0LUhvc3QtVXNhZ2UgXQorCQkJCSBbIFJlZGlyZWN0LU1heC1DYWNoZS1UaW1lIF0KKwkJCSAgICAgICAqIFsgUHJveHktSW5mbyBdCisJCQkgICAgICAgKiBbIFJvdXRlLVJlY29yZCBdCisJCQkgICAgICAgKiBbIEFWUCBdCisKKworCisJCQkqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogY21kOworCQkJc3RydWN0IGRpY3RfY21kX2RhdGEgZGF0YSA9IHsgCisJCQkJCTI4OCwgCQkJCQkvKiBDb2RlICovCisJCQkJCSJQdXNoLVByb2ZpbGUtQW5zd2VyIiwgCQkvKiBOYW1lICovCisJCQkJCUNNRF9GTEFHX1JFUVVFU1QgfCBDTURfRkxBR19QUk9YSUFCTEUgfCBDTURfRkxBR19FUlJPUiwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUNNRF9GTEFHX1BST1hJQUJMRSAJCQkJCQkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQl9OworCQkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9IAorCQkJCQkJeyAJIHsgICJTZXNzaW9uLUlkIiwgCQlSVUxFX0ZJWEVEX0hFQUQsIC0xLCAxIH0KKwkJCQkJCSAJLHsgICJBdXRoLUFwcGxpY2F0aW9uLUlkIiwgCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkJCQkJIAkseyAgIlJlc3VsdC1Db2RlIiwgCQlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJCQkJCSAJLHsgICJBdXRoLVNlc3Npb24tU3RhdGUiLCAJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCQkJCQkgCSx7ICAiT3JpZ2luLUhvc3QiLCAJCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkJCQkJIAkseyAgIk9yaWdpbi1SZWFsbSIsIAkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCQkJCQkgCSx7ICAiUmVkaXJlY3QtSG9zdCIsCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCSAJLHsgICJSZWRpcmVjdC1Ib3N0LVVzYWdlIiwgCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJIAkseyAgIlJlZGlyZWN0LU1heC1DYWNoZS1UaW1lIiwgCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJIAkseyAgIlByb3h5LUluZm8iLCAJCVJVTEVfT1BUSU9OQUwsICAgLTEsIC0xIH0KKwkJCQkJCSAJLHsgICJSb3V0ZS1SZWNvcmQiLCAJCVJVTEVfT1BUSU9OQUwsICAgLTEsIC0xIH0KKworCQkJCQkJfTsKKwkJCQorCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQ09NTUFORCwgJmRhdGEgLCBzaXAsICZjbWQpOworCQkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgY21kICk7CisJCX0KKwl9CisJCisJTE9HX0QoICJFeHRlbnNpb24gJ0RpY3Rpb25hcnkgZGVmaW5pdGlvbnMgZm9yIFNJUCcgaW5pdGlhbGl6ZWQiKTsKKwlyZXR1cm4gMDsKK30KK0VYVEVOU0lPTl9FTlRSWSgiZGljdF9zaXAiLCBkc19kaWN0X2luaXQpOwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X3RzMjkwNjFfYXZwcy9DTWFrZUxpc3RzLnR4dCBiL2V4dGVuc2lvbnMvZGljdF90czI5MDYxX2F2cHMvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM4NThkZgotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF90czI5MDYxX2F2cHMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxNiBAQAorIyBUaGUgZGljdF90czI5MDYxX2F2cHMgZXh0ZW5zaW9uCitQUk9KRUNUKCJkaWN0X3RzMjkwNjFfYXZwcyBsaWJyYXJ5IGdlbmVyYXRlZCBieSBGZEdlbiAiIEMpCisKKyMgQ29tcGlsZSBhcyBhIG1vZHVsZQorRkRfQUREX0VYVEVOU0lPTihkaWN0X3RzMjkwNjFfYXZwcyBkaWN0X3RzMjkwNjFfYXZwcy5jKQorCisKKyMjIyMKKyMjIElOU1RBTEwgc2VjdGlvbiAjIworCitJTlNUQUxMKFRBUkdFVFMgZGljdF90czI5MDYxX2F2cHMKKwlMSUJSQVJZIERFU1RJTkFUSU9OICR7SU5TVEFMTF9FWFRFTlNJT05TX1NVRkZJWH0KK0NPTVBPTkVOVCBmcmVlRGlhbWV0ZXItZGljdGlvbmFyeS1UUzI5MDYxX0FWUFMpCisKKworCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfdHMyOTA2MV9hdnBzL2RpY3RfdHMyOTA2MV9hdnBzLmMgYi9leHRlbnNpb25zL2RpY3RfdHMyOTA2MV9hdnBzL2RpY3RfdHMyOTA2MV9hdnBzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUyYmE4ZQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF90czI5MDYxX2F2cHMvZGljdF90czI5MDYxX2F2cHMuYwpAQCAtMCwwICsxLDEwMjIgQEAKKy8qCisqIENvcHlyaWdodCAoYykgMjAxNyBTcHJpbnQKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLyoqKioqKioqKioqKioqKioKKyBHZW5lcmF0ZWQgQnk6IGZkdG9vbCBlbmhhbmNlbWVudHMgdG8gZGlhZnV6emVyCisgTGljZW5zZTogc2FtZSBhcyBmcmVlRGlhbWV0ZXIKKyoqKioqKioqKioqKioqKiovCisKKworLyogCisgKiBEaWN0aW9uYXJ5IGRlZmluaXRpb25zIG9mIG9iamVjdHMgc3BlY2lmaWVkIGluIHRzMjkwNjFfYXZwcyAoZTMwKS4KKyAqLworI2luY2x1ZGUgPGZyZWVEaWFtZXRlci9leHRlbnNpb24uaD4KKworI2RlZmluZSBQUk9UT19WRVIgImUzMCIKKyNkZWZpbmUgR0VOX0RBVEUgIDE1MDY2OTcxODQuOQorCitjb25zdCBjaGFyICp0czI5MDYxX2F2cHNfcHJvdG9fdmVyID0gUFJPVE9fVkVSOworY29uc3QgZG91YmxlIHRzMjkwNjFfYXZwc19nZW5fZGF0ZSA9IEdFTl9EQVRFOworCisvKiBUaGUgY29udGVudCBvZiB0aGlzIGZpbGUgZm9sbG93cyB0aGUgc2FtZSBzdHJ1Y3R1cmUgYXMgZGljdF9iYXNlX3Byb3RvLmMgKi8KKworI2RlZmluZSBDSEVDS19kaWN0X25ldyggX3R5cGUsIF9kYXRhLCBfcGFyZW50LCBfcmVmICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBfcmV0ID0gZmRfZGljdF9uZXcoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgKF90eXBlKSwgKF9kYXRhKSwgKF9wYXJlbnQpLCAoX3JlZikgKTsgXAorICAgIGlmICggX3JldCAhPSAwICYmIF9yZXQgIT0gRUVYSVNUICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHJldHVybiBfcmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIENIRUNLX2RpY3Rfc2VhcmNoKCBfdHlwZSwgX2NyaXRlcmlhLCBfd2hhdCwgX3Jlc3VsdCApCQlcCisgICAgQ0hFQ0tfRkNUKCAgZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgKF90eXBlKSwgKF9jcml0ZXJpYSksIChfd2hhdCksIChfcmVzdWx0KSwgRU5PRU5UKSApOworCitzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiB7CisgICAgc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWU7CisgICAgZW51bSBydWxlX3Bvc2l0aW9uCXBvc2l0aW9uOworICAgIGludCAJCQltaW47CisgICAgaW50CQkJbWF4OworfTsKKworI2RlZmluZSBSVUxFX09SREVSKCBfcG9zaXRpb24gKSAoKCgoX3Bvc2l0aW9uKSA9PSBSVUxFX0ZJWEVEX0hFQUQpIHx8ICgoX3Bvc2l0aW9uKSA9PSBSVUxFX0ZJWEVEX1RBSUwpKSA/IDEgOiAwICkKKworLyogQXR0ZW50aW9uISBUaGlzIHZlcnNpb24gb2YgdGhlIG1hY3JvIHVzZXMgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgaW4gY29udHJhc3QgdG8gbW9zdCBvdGhlciBjb3BpZXMhICovCisjZGVmaW5lIFBBUlNFX2xvY19ydWxlcyggX3J1bGVhcnJheSwgX3BhcmVudCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IF9fYXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKF9fYXI9MDsgX19hciA8IHNpemVvZihfcnVsZWFycmF5KSAvIHNpemVvZigoX3J1bGVhcnJheSlbMF0pOyBfX2FyKyspIHsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgc3RydWN0IGRpY3RfcnVsZV9kYXRhIF9fZGF0YSA9IHsgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5wb3NpdGlvbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ubWluLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5tYXh9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIF9fZGF0YS5ydWxlX29yZGVyID0gUlVMRV9PUkRFUihfX2RhdGEucnVsZV9wb3NpdGlvbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgQ0hFQ0tfRkNUKCAgZmRfZGljdF9zZWFyY2goICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgRElDVF9BVlAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICYoX3J1bGVhcnJheSlbX19hcl0uYXZwX3ZlbmRvcl9wbHVzX25hbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgJl9fZGF0YS5ydWxlX2F2cCwgMCApICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYgKCAhX19kYXRhLnJ1bGVfYXZwICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFX0RFQlVHKElORk8sICJBVlAgTm90IGZvdW5kOiAnJXMnIiwgKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLmF2cF9uYW1lKTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVOT0VOVDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBfcmV0ID0gZmRfZGljdF9uZXcoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9SVUxFLCAmKF9fZGF0YSksIChfcGFyZW50KSwgTlVMTCApOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBfcmV0ICE9IDAgJiYgX3JldCAhPSBFRVhJU1QgKSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfREVCVUcoSU5GTywgIkVycm9yIG9uIHJ1bGUgd2l0aCBBVlAgJyVzJyIsICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0uYXZwX3ZlbmRvcl9wbHVzX25hbWUuYXZwX25hbWUpOyAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFSU5WQUw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBDSEVDS192ZW5kb3JfbmV3KCBfZGF0YSApIHsgXAorICAgICAgICBzdHJ1Y3QgZGljdF9vYmplY3QgKiB2ZW5kb3JfZm91bmQ7IFwKKyAgICAgICAgaWYgKGZkX2RpY3Rfc2VhcmNoKGZkX2dfY29uZmlnLT5jbmZfZGljdCxESUNUX1ZFTkRPUixWRU5ET1JfQllfSUQsJl9kYXRhLnZlbmRvcl9pZCwmdmVuZG9yX2ZvdW5kLEVOT0VOVCkgPT0gRU5PRU5UKSB7IFwKKyAgICAgICAgICAgICAgICBDSEVDS19GQ1QoZmRfZGljdF9uZXcoZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1ZFTkRPUiwgJl9kYXRhLCBOVUxMLCBOVUxMKSk7IFwKKyAgICAgICAgfSBcCit9CisKKyNkZWZpbmUgZW51bXZhbF9kZWZfdTMyKCBfdmFsXywgX3N0cl8gKQkJXAorICAgIHsgX3N0cl8sIAkJeyAudTMyID0gX3ZhbF8gfX0KKworI2RlZmluZSBlbnVtdmFsX2RlZl9vcyggX2xlbl8sIF92YWxfLCBfc3RyXyApCQkJCVwKKyAgICB7IF9zdHJfLCAJCXsgLm9zID0geyAuZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopX3ZhbF8sIC5sZW4gPSBfbGVuXyB9fX0KKworCitzdGF0aWMgaW50IGRpY3RfdHMyOTA2MV9hdnBzX2xvYWRfZGVmcyhjaGFyICogY29uZmZpbGUpCit7CisgICBUUkFDRV9FTlRSWSgiJXAiLCBjb25mZmlsZSk7CisJLyogQXBwbGljYXRpb24gU2VjdGlvbiAqLworCXsKKwkJLyogQ3JlYXRlIHRoZSB2ZW5kb3JzICovCQl7CisJCQlzdHJ1Y3QgZGljdF92ZW5kb3JfZGF0YSB2ZW5kb3JfZGF0YSA9IHsgMTA0MTUsICIzR1BQIiB9OworCQkJQ0hFQ0tfZGljdF9uZXcoRElDVF9WRU5ET1IsICZ2ZW5kb3JfZGF0YSwgTlVMTCwgTlVMTCkKKwkJfQorCX0KKworCisgICAvKiBBVlAgc2VjdGlvbiAqLworICAgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBBZGRyZXNzX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIFVURjhTdHJpbmdfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogRGlhbWV0ZXJJZGVudGl0eV90eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBEaWFtZXRlclVSSV90eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBUaW1lX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIElQRmlsdGVyUnVsZV90eXBlOworCisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkFkZHJlc3MiLCAmQWRkcmVzc190eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiVVRGOFN0cmluZyIsICZVVEY4U3RyaW5nX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJEaWFtZXRlcklkZW50aXR5IiwgJkRpYW1ldGVySWRlbnRpdHlfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkRpYW1ldGVyVVJJIiwgJkRpYW1ldGVyVVJJX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJUaW1lIiwgJlRpbWVfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIklQRmlsdGVyUnVsZSIsICZJUEZpbHRlclJ1bGVfdHlwZSk7CisJCS8qIDNHUFAtSU1TSSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIjNHUFAtSU1TSSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogM0dQUC1DaGFyZ2luZy1JZCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTIsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIjNHUFAtQ2hhcmdpbmctSWQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiAzR1BQLVBEUC1UeXBlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiM0dQUC1QRFAtVHlwZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoM0dQUC1QRFAtVHlwZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIklwdjQiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiUFBQIiwgeyAuaTMyPTEgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMyA9IHsgIklwdjYiLCB7IC5pMzI9MiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF80ID0geyAiSXB2NHY2IiwgeyAuaTMyPTMgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNSA9IHsgIk5vbi1JUCIsIHsgLmkzMj00IH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF81LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiAzR1BQLUNHLUFkZHJlc3MgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk0LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSIzR1BQLUNHLUFkZHJlc3MiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiAzR1BQLUdQUlMtTmVnb3RpYXRlZC1Rb1MtUHJvZmlsZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTUsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIjNHUFAtR1BSUy1OZWdvdGlhdGVkLVFvUy1Qcm9maWxlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiAzR1BQLVNHU04tQWRkcmVzcyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTYsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIjNHUFAtU0dTTi1BZGRyZXNzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogM0dQUC1HR1NOLUFkZHJlc3MgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk3LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSIzR1BQLUdHU04tQWRkcmVzcyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIDNHUFAtSU1TSS1NQ0MtTU5DICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJOCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiM0dQUC1JTVNJLU1DQy1NTkMiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIDNHUFAtR0dTTi1NQ0MtTU5DICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJOSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiM0dQUC1HR1NOLU1DQy1NTkMiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIDNHUFAtTlNBUEkgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiM0dQUC1OU0FQSSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIDNHUFAtU2VsZWN0aW9uLU1vZGUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiM0dQUC1TZWxlY3Rpb24tTW9kZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogM0dQUC1DaGFyZ2luZy1DaGFyYWN0ZXJpc3RpY3MgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiM0dQUC1DaGFyZ2luZy1DaGFyYWN0ZXJpc3RpY3MiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIDNHUFAtQ0ctSXB2Ni1BZGRyZXNzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTQsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIjNHUFAtQ0ctSXB2Ni1BZGRyZXNzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogM0dQUC1TR1NOLUlwdjYtQWRkcmVzcyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE1LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSIzR1BQLVNHU04tSXB2Ni1BZGRyZXNzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogM0dQUC1HR1NOLUlwdjYtQWRkcmVzcyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE2LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSIzR1BQLUdHU04tSXB2Ni1BZGRyZXNzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogM0dQUC1JcHY2LUROUy1TZXJ2ZXJzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTcsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIjNHUFAtSXB2Ni1ETlMtU2VydmVycyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIDNHUFAtU0dTTi1NQ0MtTU5DICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTgsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIjNHUFAtU0dTTi1NQ0MtTU5DIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiAzR1BQLUlNRUlTViAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTIwLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSIzR1BQLUlNRUlTViIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIDNHUFAtUkFULVR5cGUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyMSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiM0dQUC1SQVQtVHlwZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIDNHUFAtVXNlci1Mb2NhdGlvbi1JbmZvICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjIsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIjNHUFAtVXNlci1Mb2NhdGlvbi1JbmZvIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogM0dQUC1NUy1UaW1lWm9uZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTIzLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSIzR1BQLU1TLVRpbWVab25lIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogM0dQUC1DQU1FTC1DaGFyZ2luZy1JbmZvICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjQsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIjNHUFAtQ0FNRUwtQ2hhcmdpbmctSW5mbyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIDNHUFAtUGFja2V0LUZpbHRlciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTI1LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSIzR1BQLVBhY2tldC1GaWx0ZXIiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiAzR1BQLU5lZ290aWF0ZWQtRFNDUCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTI2LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSIzR1BQLU5lZ290aWF0ZWQtRFNDUCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIDNHUFAtQWxsb2NhdGUtSVAtVHlwZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTI3LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSIzR1BQLUFsbG9jYXRlLUlQLVR5cGUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBUV0FOLUlkZW50aWZpZXIgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyOSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiVFdBTi1JZGVudGlmaWVyIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogM0dQUC1Vc2VyLUxvY2F0aW9uLUluZm8tVGltZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTMwLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSIzR1BQLVVzZXItTG9jYXRpb24tSW5mby1UaW1lIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogVE1HSSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTkwMCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiVE1HSSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFJlcXVpcmVkLU1CTVMtQmVhcmVyLUNhcGFiaWxpdGllcyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTkwMSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUmVxdWlyZWQtTUJNUy1CZWFyZXItQ2FwYWJpbGl0aWVzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBNQk1TLVN0YXJ0U3RvcC1JbmRpY2F0aW9uICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJOTAyLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJNQk1TLVN0YXJ0U3RvcC1JbmRpY2F0aW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChNQk1TLVN0YXJ0U3RvcC1JbmRpY2F0aW9uKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiU1RBUlQiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiU1RPUCIsIHsgLmkzMj0xIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMgPSB7ICJVUERBVEUiLCB7IC5pMzI9MiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF80ID0geyAiSEVBUlRCRUFUIiwgeyAuaTMyPTMgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF80LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBNQk1TLVNlcnZpY2UtQXJlYSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTkwMywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTUJNUy1TZXJ2aWNlLUFyZWEiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBNQk1TLVNlc3Npb24tRHVyYXRpb24gKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk5MDQsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk1CTVMtU2Vzc2lvbi1EdXJhdGlvbiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIEFsdGVybmF0aXZlLUFQTiAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTkwNSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQWx0ZXJuYXRpdmUtQVBOIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBNQk1TLVNlcnZpY2UtVHlwZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTkwNiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTUJNUy1TZXJ2aWNlLVR5cGUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKE1CTVMtU2VydmljZS1UeXBlKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiTVVMVElDQVNUIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIkJST0FEQ0FTVCIsIHsgLmkzMj0xIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBNQk1TLTJHLTNHLUluZGljYXRvciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTkwNywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTUJNUy0yRy0zRy1JbmRpY2F0b3IiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKE1CTVMtMkctM0ctSW5kaWNhdG9yKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiR19BTkRfM0ciLCB7IC5pMzI9MiB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIE1CTVMtU2Vzc2lvbi1JZGVudGl0eSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTkwOCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTUJNUy1TZXNzaW9uLUlkZW50aXR5IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogUkFJICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJOTA5LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJSQUkiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIEFkZGl0aW9uYWwtTUJNUy1UcmFjZS1JbmZvICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJOTEwLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJBZGRpdGlvbmFsLU1CTVMtVHJhY2UtSW5mbyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIE1CTVMtVGltZS1Uby1EYXRhLVRyYW5zZmVyICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJOTExLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJNQk1TLVRpbWUtVG8tRGF0YS1UcmFuc2ZlciIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIE1CTVMtU2Vzc2lvbi1SZXBldGl0aW9uLU51bWJlciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTkxMiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTUJNUy1TZXNzaW9uLVJlcGV0aXRpb24tTnVtYmVyIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogTUJNUy1SZXF1aXJlZC1Rb1MgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk5MTMsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk1CTVMtUmVxdWlyZWQtUW9TIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBNQk1TLUNvdW50aW5nLUluZm9ybWF0aW9uICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJOTE0LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJNQk1TLUNvdW50aW5nLUluZm9ybWF0aW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChNQk1TLUNvdW50aW5nLUluZm9ybWF0aW9uKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiQ09VTlRJTkdfTk9UX0FQUExJQ0FCTEUiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiQ09VTlRJTkdfQVBQTElDQUJMRSIsIHsgLmkzMj0xIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBNQk1TLVVzZXItRGF0YS1Nb2RlLUluZGljYXRpb24gKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk5MTUsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk1CTVMtVXNlci1EYXRhLU1vZGUtSW5kaWNhdGlvbiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoTUJNUy1Vc2VyLURhdGEtTW9kZS1JbmRpY2F0aW9uKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiVW5pY2FzdCIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJNdWx0aWNhc3RfYW5kX1VuaWNhc3QiLCB7IC5pMzI9MSB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogTUJNUy1HR1NOLUFkZHJlc3MgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk5MTYsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk1CTVMtR0dTTi1BZGRyZXNzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogTUJNUy1HR1NOLUlwdjYtQWRkcmVzcyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTkxNywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTUJNUy1HR1NOLUlwdjYtQWRkcmVzcyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIE1CTVMtQk1TQy1TU00tSVAtQWRkcmVzcyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTkxOCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTUJNUy1CTVNDLVNTTS1JUC1BZGRyZXNzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogTUJNUy1CTVNDLVNTTS1JcHY2LUFkZHJlc3MgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk5MTksCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk1CTVMtQk1TQy1TU00tSXB2Ni1BZGRyZXNzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogTUJNUy1GbG93LUlkZW50aWZpZXIgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk5MjAsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk1CTVMtRmxvdy1JZGVudGlmaWVyIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogQ04tSVAtTXVsdGljYXN0LURpc3RyaWJ1dGlvbiAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTkyMSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQ04tSVAtTXVsdGljYXN0LURpc3RyaWJ1dGlvbiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoQ04tSVAtTXVsdGljYXN0LURpc3RyaWJ1dGlvbikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIk5PX0lQX01VTFRJQ0FTVCIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJJUF9NVUxUSUNBU1QiLCB7IC5pMzI9MSB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogTUJNUy1IQy1JbmRpY2F0b3IgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk5MjIsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk1CTVMtSEMtSW5kaWNhdG9yIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChNQk1TLUhDLUluZGljYXRvcikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIkdlbmVyYWwiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiUmVfQXV0aF9SZXF1ZXN0X0NvbW1hbmQiLCB7IC5pMzI9MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAiVXNhZ2Vfb2ZfUkFESVVTX2F0X3RoZV9Qa19SZWZlcmVuY2VfUG9pbnQiLCB7IC5pMzI9MTggfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNCA9IHsgIlVzYWdlX29mX0RpYW1ldGVyX29uX016X2ludGVyZmFjZSIsIHsgLmkzMj0xOSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF81ID0geyAiUkVfQXV0aF9BbnN3ZXJfQ29tbWFuZCIsIHsgLmkzMj0yIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzYgPSB7ICJVc2FnZV9vZl9EaWFtZXRlcl9vbl9TR21iX2ludGVyZmFjZSIsIHsgLmkzMj0yMCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF83ID0geyAiU2Vzc2lvbl9UZXJtaW5hdGlvbl9SZXF1ZXN0X0NvbW1hbmQiLCB7IC5pMzI9MyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF84ID0geyAiU2Vzc2lvbl9UZXJtaW5hdGlvbl9BbnN3ZXJfQ29tbWFuZCIsIHsgLmkzMj00IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzkgPSB7ICJBYm9ydF9TZXNzaW9uX1JlcXVlc3RfQ29tbWFuZCIsIHsgLmkzMj01IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEwID0geyAiQWJvcnRfU2Vzc2lvbl9BbnN3ZXJfQ29tbWFuZCIsIHsgLmkzMj02IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzExID0geyAiR21iX3NwZWNpZmljX0V4cGVyaW1lbnRhbF9SZXN1bHRfQ29kZV9BVlBfdmFsdWVzIiwgeyAuaTMyPTggfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF80LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzUsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF83LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzgsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfOSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogTUJNUy1BY2Nlc3MtSW5kaWNhdG9yICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJOTIzLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJNQk1TLUFjY2Vzcy1JbmRpY2F0b3IiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKE1CTVMtQWNjZXNzLUluZGljYXRvcikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIlVUUkFOIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIkVfVVRSQU4iLCB7IC5pMzI9MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAiVVRSQU5fQU5EX0VfVVRSQU4iLCB7IC5pMzI9MiB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBNQk1TLUdXLVNTTS1JUC1BZGRyZXNzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJOTI0LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJNQk1TLUdXLVNTTS1JUC1BZGRyZXNzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogTUJNUy1HVy1TU00tSXB2Ni1BZGRyZXNzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJOTI1LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJNQk1TLUdXLVNTTS1JcHY2LUFkZHJlc3MiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBNQk1TLUJNU0MtU1NNLVVEUC1Qb3J0ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJOTI2LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJNQk1TLUJNU0MtU1NNLVVEUC1Qb3J0IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogTUJNUy1HVy1VRFAtUG9ydCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTkyNywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTUJNUy1HVy1VRFAtUG9ydCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIE1CTVMtR1ctVURQLVBvcnQtSW5kaWNhdG9yICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJOTI4LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJNQk1TLUdXLVVEUC1Qb3J0LUluZGljYXRvciIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoTUJNUy1HVy1VRFAtUG9ydC1JbmRpY2F0b3IpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJVRFBfUE9SVF9SRVFVSVJFRCIsIHsgLmkzMj0xIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogTUJNUy1EYXRhLVRyYW5zZmVyLVN0YXJ0ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJOTI5LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJNQk1TLURhdGEtVHJhbnNmZXItU3RhcnQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDY0CS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIE1CTVMtRGF0YS1UcmFuc2Zlci1TdG9wICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJOTMwLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJNQk1TLURhdGEtVHJhbnNmZXItU3RvcCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVENjQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogTUJNUy1GbGFnICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJOTMxLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJNQk1TLUZsYWciLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFJlc3RhcnQtQ291bnRlciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTkzMiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUmVzdGFydC1Db3VudGVyIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBEaWFnbm9zdGljLUluZm8gKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk5MzMsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkRpYWdub3N0aWMtSW5mbyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogTUJNUy1DZWxsLUxpc3QgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk5MzQsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk1CTVMtQ2VsbC1MaXN0IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKworCQorICAgfQorCisgICAvKiBDb21tYW5kcyBzZWN0aW9uICovCisgICB7CisKKyAgIH0KKworICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGljdF90czI5MDYxX2F2cHNfbG9hZF9ydWxlcyhjaGFyICogY29uZmZpbGUpCit7CisgICAvKiBHcm91cGVkIEFWUCBzZWN0aW9uICovCisgICB7CisKKyAgIH0JCisKKyAgIC8qIENvbW1hbmRzIHNlY3Rpb24gKi8KKyAgIHsKKworICAgfQorCisgICBMT0dfRCggIkV4dGVuc2lvbiAnRGljdGlvbmFyeSBkZWZpbml0aW9ucyBmb3IgdHMyOTA2MV9hdnBzIChlMzApJyBpbml0aWFsaXplZCIpOworICAgcmV0dXJuIDA7Cit9CisKK2ludCBkaWN0X2VudHJ5KGNoYXIgKiBjb25mZmlsZSkKK3sKKwlkaWN0X3RzMjkwNjFfYXZwc19sb2FkX2RlZnMoY29uZmZpbGUpOworCXJldHVybiBkaWN0X3RzMjkwNjFfYXZwc19sb2FkX3J1bGVzKGNvbmZmaWxlKTsKK30KKworY29uc3QgY2hhciogZGljdF90czI5MDYxX2F2cHNfcHJvdG9fdmVyKGNoYXIgKiBjb25mZmlsZSkgeworCXJldHVybiB0czI5MDYxX2F2cHNfcHJvdG9fdmVyOworfQorCitjb25zdCBkb3VibGUgZGljdF90czI5MDYxX2F2cHNfZ2VuX3RzKGNoYXIgKiBjb25mZmlsZSkgeworCXJldHVybiB0czI5MDYxX2F2cHNfZ2VuX2RhdGU7Cit9CisKK0VYVEVOU0lPTl9FTlRSWTIoImRpY3RfdHMyOTA2MV9hdnBzIiwgZGljdF90czI5MDYxX2F2cHNfbG9hZF9kZWZzLCBkaWN0X3RzMjkwNjFfYXZwc19sb2FkX3J1bGVzLCAiZGljdF90czI5NDY4X2F2cHMiLCAiZGljdF90czI5MjEyX2F2cHMiLCAiZGljdF90czI5MjI5X2F2cHMiLCAiZGljdF90czI5MzM2X2F2cHMiLCAiZGljdF9yZmM3MTU1X2F2cHMiKTsKKworCisKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF90czI5MDYxX2F2cHMvdHMyOTA2MV9hdnBzLmRpZCBiL2V4dGVuc2lvbnMvZGljdF90czI5MDYxX2F2cHMvdHMyOTA2MV9hdnBzLmRpZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjE2Mjc4Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kaWN0X3RzMjkwNjFfYXZwcy90czI5MDYxX2F2cHMuZGlkCkBAIC0wLDAgKzEsMzcgQEAKK2RpY3RfcmZjNjk0Ml9hdnBzCitkaWN0X3RzMjk0NjhfYXZwcworZGljdF90czI5MzQzX2F2cHMKK2RpY3RfdHMyOTEyOF9hdnBzCitkaWN0X3RzMjkzNDRfYXZwcworZGljdF90czI5MzQ1X2F2cHMKK2RpY3RfdHMyOTMzN19hdnBzCitkaWN0XzNncHAyX2F2cHMKK2RpY3RfdHMyOTE1NF9hdnBzCitkaWN0X3RzMjkyMTRfYXZwcworZGljdF90czI5MjE1X2F2cHMKK2RpY3RfdHMyOTIxN19hdnBzCitkaWN0X3RzMjkzMzhfYXZwcworZGljdF90czI5MTczX2F2cHMKK2RpY3RfdHMyOTMzNl9hdnBzCitkaWN0X3JmYzQ1OTBfYXZwcworZGljdF90czI5MjI5X2F2cHMKK2RpY3RfdHMyOTMyOV9hdnBzCitkaWN0X3RzMjkzNjhfYXZwcworZGljdF90czMyMjk5X2F2cHMKK2RpY3RfcmZjNjczNF9hdnBzCitkaWN0X3JmYzU3NzhfYXZwcworZGljdF9kcmFmdGxvYWRfYXZwcworZGljdF9ldHNpMjgzMDM0X2F2cHMKK2RpY3RfcmZjNTU4MF9hdnBzCitkaWN0X3JmYzQwNzJfYXZwcworZGljdF90czI5MjczX2F2cHMKK2RpY3RfcmZjNTQ0N19hdnBzCitkaWN0X3RzMjkyNzJfYXZwcworZGljdF9yZmM3NjgzX2F2cHMKK2RpY3RfcmZjNzk0NF9hdnBzCitkaWN0X3JmYzU3NzdfYXZwcworZGljdF9yZmM0MDA2YmlzX2F2cHMKK2RpY3RfcmZjNDAwNF9hdnBzCitkaWN0X3JmYzcxNTVfYXZwcworZGljdF90czI5MjEyX2F2cHMKK2RpY3RfdHMyOTA2MV9hdnBzCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfdHMyOTEyOF9hdnBzL0NNYWtlTGlzdHMudHh0IGIvZXh0ZW5zaW9ucy9kaWN0X3RzMjkxMjhfYXZwcy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmYzYTMwCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kaWN0X3RzMjkxMjhfYXZwcy9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDE2IEBACisjIFRoZSBkaWN0X3RzMjkxMjhfYXZwcyBleHRlbnNpb24KK1BST0pFQ1QoImRpY3RfdHMyOTEyOF9hdnBzIGxpYnJhcnkgZ2VuZXJhdGVkIGJ5IEZkR2VuICIgQykKKworIyBDb21waWxlIGFzIGEgbW9kdWxlCitGRF9BRERfRVhURU5TSU9OKGRpY3RfdHMyOTEyOF9hdnBzIGRpY3RfdHMyOTEyOF9hdnBzLmMpCisKKworIyMjIworIyMgSU5TVEFMTCBzZWN0aW9uICMjCisKK0lOU1RBTEwoVEFSR0VUUyBkaWN0X3RzMjkxMjhfYXZwcworCUxJQlJBUlkgREVTVElOQVRJT04gJHtJTlNUQUxMX0VYVEVOU0lPTlNfU1VGRklYfQorQ09NUE9ORU5UIGZyZWVEaWFtZXRlci1kaWN0aW9uYXJ5LVRTMjkxMjhfQVZQUykKKworCisKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF90czI5MTI4X2F2cHMvZGljdF90czI5MTI4X2F2cHMuYyBiL2V4dGVuc2lvbnMvZGljdF90czI5MTI4X2F2cHMvZGljdF90czI5MTI4X2F2cHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGFkNzhhCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kaWN0X3RzMjkxMjhfYXZwcy9kaWN0X3RzMjkxMjhfYXZwcy5jCkBAIC0wLDAgKzEsNTAyIEBACisvKgorKiBDb3B5cmlnaHQgKGMpIDIwMTcgU3ByaW50CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKy8qKioqKioqKioqKioqKioqCisgR2VuZXJhdGVkIEJ5OiBmZHRvb2wgZW5oYW5jZW1lbnRzIHRvIGRpYWZ1enplcgorIExpY2Vuc2U6IHNhbWUgYXMgZnJlZURpYW1ldGVyCisqKioqKioqKioqKioqKioqLworCisKKy8qIAorICogRGljdGlvbmFyeSBkZWZpbml0aW9ucyBvZiBvYmplY3RzIHNwZWNpZmllZCBpbiB0czI5MTI4X2F2cHMgKGUyMCkuCisgKi8KKyNpbmNsdWRlIDxmcmVlRGlhbWV0ZXIvZXh0ZW5zaW9uLmg+CisKKyNkZWZpbmUgUFJPVE9fVkVSICJlMjAiCisjZGVmaW5lIEdFTl9EQVRFICAxNTA2Njk3MTM5Ljg2CisKK2NvbnN0IGNoYXIgKnRzMjkxMjhfYXZwc19wcm90b192ZXIgPSBQUk9UT19WRVI7Citjb25zdCBkb3VibGUgdHMyOTEyOF9hdnBzX2dlbl9kYXRlID0gR0VOX0RBVEU7CisKKy8qIFRoZSBjb250ZW50IG9mIHRoaXMgZmlsZSBmb2xsb3dzIHRoZSBzYW1lIHN0cnVjdHVyZSBhcyBkaWN0X2Jhc2VfcHJvdG8uYyAqLworCisjZGVmaW5lIENIRUNLX2RpY3RfbmV3KCBfdHlwZSwgX2RhdGEsIF9wYXJlbnQsIF9yZWYgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IF9yZXQgPSBmZF9kaWN0X25ldyggZmRfZ19jb25maWctPmNuZl9kaWN0LCAoX3R5cGUpLCAoX2RhdGEpLCAoX3BhcmVudCksIChfcmVmKSApOyBcCisgICAgaWYgKCBfcmV0ICE9IDAgJiYgX3JldCAhPSBFRVhJU1QgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgcmV0dXJuIF9yZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgQ0hFQ0tfZGljdF9zZWFyY2goIF90eXBlLCBfY3JpdGVyaWEsIF93aGF0LCBfcmVzdWx0ICkJCVwKKyAgICBDSEVDS19GQ1QoICBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCAoX3R5cGUpLCAoX2NyaXRlcmlhKSwgKF93aGF0KSwgKF9yZXN1bHQpLCBFTk9FTlQpICk7CisKK3N0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHsKKyAgICBzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZTsKKyAgICBlbnVtIHJ1bGVfcG9zaXRpb24JcG9zaXRpb247CisgICAgaW50IAkJCW1pbjsKKyAgICBpbnQJCQltYXg7Cit9OworCisjZGVmaW5lIFJVTEVfT1JERVIoIF9wb3NpdGlvbiApICgoKChfcG9zaXRpb24pID09IFJVTEVfRklYRURfSEVBRCkgfHwgKChfcG9zaXRpb24pID09IFJVTEVfRklYRURfVEFJTCkpID8gMSA6IDAgKQorCisvKiBBdHRlbnRpb24hIFRoaXMgdmVyc2lvbiBvZiB0aGUgbWFjcm8gdXNlcyBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCBpbiBjb250cmFzdCB0byBtb3N0IG90aGVyIGNvcGllcyEgKi8KKyNkZWZpbmUgUEFSU0VfbG9jX3J1bGVzKCBfcnVsZWFycmF5LCBfcGFyZW50KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgX19hcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoX19hcj0wOyBfX2FyIDwgc2l6ZW9mKF9ydWxlYXJyYXkpIC8gc2l6ZW9mKChfcnVsZWFycmF5KVswXSk7IF9fYXIrKykgeyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgZGljdF9ydWxlX2RhdGEgX19kYXRhID0geyBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLnBvc2l0aW9uLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5taW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLm1heH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgX19kYXRhLnJ1bGVfb3JkZXIgPSBSVUxFX09SREVSKF9fZGF0YS5ydWxlX3Bvc2l0aW9uKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBDSEVDS19GQ1QoICBmZF9kaWN0X3NlYXJjaCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgZmRfZ19jb25maWctPmNuZl9kaWN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBESUNUX0FWUCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgJihfcnVsZWFycmF5KVtfX2FyXS5hdnBfdmVuZG9yX3BsdXNfbmFtZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAmX19kYXRhLnJ1bGVfYXZwLCAwICkgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpZiAoICFfX2RhdGEucnVsZV9hdnAgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfREVCVUcoSU5GTywgIkFWUCBOb3QgZm91bmQ6ICclcyciLCAoX3J1bGVhcnJheSlbX19hcl0uYXZwX3ZlbmRvcl9wbHVzX25hbWUuYXZwX25hbWUpOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRU5PRU5UOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IF9yZXQgPSBmZF9kaWN0X25ldyggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1JVTEUsICYoX19kYXRhKSwgKF9wYXJlbnQpLCBOVUxMICk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIF9yZXQgIT0gMCAmJiBfcmV0ICE9IEVFWElTVCApICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9ERUJVRyhJTkZPLCAiRXJyb3Igb24gcnVsZSB3aXRoIEFWUCAnJXMnIiwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5hdnBfdmVuZG9yX3BsdXNfbmFtZS5hdnBfbmFtZSk7ICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVJTlZBTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIENIRUNLX3ZlbmRvcl9uZXcoIF9kYXRhICkgeyBcCisgICAgICAgIHN0cnVjdCBkaWN0X29iamVjdCAqIHZlbmRvcl9mb3VuZDsgXAorICAgICAgICBpZiAoZmRfZGljdF9zZWFyY2goZmRfZ19jb25maWctPmNuZl9kaWN0LERJQ1RfVkVORE9SLFZFTkRPUl9CWV9JRCwmX2RhdGEudmVuZG9yX2lkLCZ2ZW5kb3JfZm91bmQsRU5PRU5UKSA9PSBFTk9FTlQpIHsgXAorICAgICAgICAgICAgICAgIENIRUNLX0ZDVChmZF9kaWN0X25ldyhmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfVkVORE9SLCAmX2RhdGEsIE5VTEwsIE5VTEwpKTsgXAorICAgICAgICB9IFwKK30KKworI2RlZmluZSBlbnVtdmFsX2RlZl91MzIoIF92YWxfLCBfc3RyXyApCQlcCisgICAgeyBfc3RyXywgCQl7IC51MzIgPSBfdmFsXyB9fQorCisjZGVmaW5lIGVudW12YWxfZGVmX29zKCBfbGVuXywgX3ZhbF8sIF9zdHJfICkJCQkJXAorICAgIHsgX3N0cl8sIAkJeyAub3MgPSB7IC5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilfdmFsXywgLmxlbiA9IF9sZW5fIH19fQorCisKK3N0YXRpYyBpbnQgZGljdF90czI5MTI4X2F2cHNfbG9hZF9kZWZzKGNoYXIgKiBjb25mZmlsZSkKK3sKKyAgIFRSQUNFX0VOVFJZKCIlcCIsIGNvbmZmaWxlKTsKKwkvKiBBcHBsaWNhdGlvbiBTZWN0aW9uICovCisJeworCQkvKiBDcmVhdGUgdGhlIHZlbmRvcnMgKi8JCXsKKwkJCXN0cnVjdCBkaWN0X3ZlbmRvcl9kYXRhIHZlbmRvcl9kYXRhID0geyAxMDQxNSwgIjNHUFAiIH07CisJCQlDSEVDS19kaWN0X25ldyhESUNUX1ZFTkRPUiwgJnZlbmRvcl9kYXRhLCBOVUxMLCBOVUxMKQorCQl9CisJfQorCisKKyAgIC8qIEFWUCBzZWN0aW9uICovCisgICB7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIEFkZHJlc3NfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogVVRGOFN0cmluZ190eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBEaWFtZXRlcklkZW50aXR5X3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIERpYW1ldGVyVVJJX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIFRpbWVfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogSVBGaWx0ZXJSdWxlX3R5cGU7CisKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiQWRkcmVzcyIsICZBZGRyZXNzX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJVVEY4U3RyaW5nIiwgJlVURjhTdHJpbmdfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkRpYW1ldGVySWRlbnRpdHkiLCAmRGlhbWV0ZXJJZGVudGl0eV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiRGlhbWV0ZXJVUkkiLCAmRGlhbWV0ZXJVUklfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIlRpbWUiLCAmVGltZV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiSVBGaWx0ZXJSdWxlIiwgJklQRmlsdGVyUnVsZV90eXBlKTsKKwkJLyogQ2F1c2UtVHlwZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTQzMDEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkNhdXNlLVR5cGUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFMxQVAtQ2F1c2UgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk0MzAyLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTMUFQLUNhdXNlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBSQU5BUC1DYXVzZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTQzMDMsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlJBTkFQLUNhdXNlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBCU1NHUC1DYXVzZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTQzMDksCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkJTU0dQLUNhdXNlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBHTU0tQ2F1c2UgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk0MzA0LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJHTU0tQ2F1c2UiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFNNLUNhdXNlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNDMwNSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiU00tQ2F1c2UiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFVFLUNvdW50ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNDMwOCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiVUUtQ291bnQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIENvbm5lY3Rpb24tQWN0aW9uICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNDMxNCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQ29ubmVjdGlvbi1BY3Rpb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIE5vbi1JUC1EYXRhICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNDMxNSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTm9uLUlQLURhdGEiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBVcGxpbmstUmF0ZS1MaW1pdCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTQzMTEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlVwbGluay1SYXRlLUxpbWl0IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBEb3dubGluay1SYXRlLUxpbWl0ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNDMxMiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiRG93bmxpbmstUmF0ZS1MaW1pdCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogRXh0ZW5kZWQtUENPICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNDMxMywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiRXh0ZW5kZWQtUENPIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogU0NFRi1XYWl0LVRpbWUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk0MzE2LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTQ0VGLVdhaXQtVGltZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVGltZV90eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogQ01SLUZsYWdzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNDMxNywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQ01SLUZsYWdzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBDb3VudGVyLVZhbHVlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNDMxOSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQ291bnRlci1WYWx1ZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogUlJDLUNvdW50ZXItVGltZXN0YW1wICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNDMyMCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUlJDLUNvdW50ZXItVGltZXN0YW1wIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBUaW1lX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBDb21tdW5pY2F0aW9uLUZhaWx1cmUtSW5mb3JtYXRpb24gKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk0MzAwLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJDb21tdW5pY2F0aW9uLUZhaWx1cmUtSW5mb3JtYXRpb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIFJSQy1DYXVzZS1Db3VudGVyICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNDMxOCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUlJDLUNhdXNlLUNvdW50ZXIiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIFNlcnZpbmctUExNTi1SYXRlLUNvbnRyb2wgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk0MzEwLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTZXJ2aW5nLVBMTU4tUmF0ZS1Db250cm9sIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBOdW1iZXItT2YtVUUtUGVyLUxvY2F0aW9uLVJlcG9ydCAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTQzMDcsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk51bWJlci1PZi1VRS1QZXItTG9jYXRpb24tUmVwb3J0IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBOdW1iZXItT2YtVUUtUGVyLUxvY2F0aW9uLUNvbmZpZ3VyYXRpb24gKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk0MzA2LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJOdW1iZXItT2YtVUUtUGVyLUxvY2F0aW9uLUNvbmZpZ3VyYXRpb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisKKwkKKyAgIH0KKworICAgLyogQ29tbWFuZHMgc2VjdGlvbiAqLworICAgeworCisgICB9CisKKyAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRpY3RfdHMyOTEyOF9hdnBzX2xvYWRfcnVsZXMoY2hhciAqIGNvbmZmaWxlKQoreworICAgLyogR3JvdXBlZCBBVlAgc2VjdGlvbiAqLworICAgeworCSAgLyogQ29tbXVuaWNhdGlvbi1GYWlsdXJlLUluZm9ybWF0aW9uICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDb21tdW5pY2F0aW9uLUZhaWx1cmUtSW5mb3JtYXRpb24ifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNhdXNlLVR5cGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlMxQVAtQ2F1c2UifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJBTkFQLUNhdXNlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJCU1NHUC1DYXVzZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiR01NLUNhdXNlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTTS1DYXVzZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIFJSQy1DYXVzZS1Db3VudGVyICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJSUkMtQ2F1c2UtQ291bnRlciJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ291bnRlci1WYWx1ZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUlJDLUNvdW50ZXItVGltZXN0YW1wIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogU2VydmluZy1QTE1OLVJhdGUtQ29udHJvbCAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU2VydmluZy1QTE1OLVJhdGUtQ29udHJvbCJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVXBsaW5rLVJhdGUtTGltaXQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkRvd25saW5rLVJhdGUtTGltaXQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBOdW1iZXItT2YtVUUtUGVyLUxvY2F0aW9uLVJlcG9ydCAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTnVtYmVyLU9mLVVFLVBlci1Mb2NhdGlvbi1SZXBvcnQifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkVQUy1Mb2NhdGlvbi1JbmZvcm1hdGlvbiJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVUUtQ291bnQifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBOdW1iZXItT2YtVUUtUGVyLUxvY2F0aW9uLUNvbmZpZ3VyYXRpb24gKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk51bWJlci1PZi1VRS1QZXItTG9jYXRpb24tQ29uZmlndXJhdGlvbiJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRVBTLUxvY2F0aW9uLUluZm9ybWF0aW9uIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCisgICB9CQorCisgICAvKiBDb21tYW5kcyBzZWN0aW9uICovCisgICB7CisKKyAgIH0KKworICAgTE9HX0QoICJFeHRlbnNpb24gJ0RpY3Rpb25hcnkgZGVmaW5pdGlvbnMgZm9yIHRzMjkxMjhfYXZwcyAoZTIwKScgaW5pdGlhbGl6ZWQiKTsKKyAgIHJldHVybiAwOworfQorCitpbnQgZGljdF9lbnRyeShjaGFyICogY29uZmZpbGUpCit7CisJZGljdF90czI5MTI4X2F2cHNfbG9hZF9kZWZzKGNvbmZmaWxlKTsKKwlyZXR1cm4gZGljdF90czI5MTI4X2F2cHNfbG9hZF9ydWxlcyhjb25mZmlsZSk7Cit9CisKK2NvbnN0IGNoYXIqIGRpY3RfdHMyOTEyOF9hdnBzX3Byb3RvX3ZlcihjaGFyICogY29uZmZpbGUpIHsKKwlyZXR1cm4gdHMyOTEyOF9hdnBzX3Byb3RvX3ZlcjsKK30KKworY29uc3QgZG91YmxlIGRpY3RfdHMyOTEyOF9hdnBzX2dlbl90cyhjaGFyICogY29uZmZpbGUpIHsKKwlyZXR1cm4gdHMyOTEyOF9hdnBzX2dlbl9kYXRlOworfQorCitFWFRFTlNJT05fRU5UUlkyKCJkaWN0X3RzMjkxMjhfYXZwcyIsIGRpY3RfdHMyOTEyOF9hdnBzX2xvYWRfZGVmcywgZGljdF90czI5MTI4X2F2cHNfbG9hZF9ydWxlcywgImRpY3RfdHMzMjI5OV9hdnBzIiwgImRpY3RfdHMyOTI3Ml9hdnBzIiwgImRpY3RfdHMyOTMzNl9hdnBzIiwgImRpY3RfdHMyOTIxMl9hdnBzIiwgImRpY3RfdHMyOTMzOF9hdnBzIiwgImRpY3RfdHMyOTIyOV9hdnBzIiwgImRpY3RfdHMyOTA2MV9hdnBzIiwgImRpY3RfZHJhZnRsb2FkX2F2cHMiLCAiZGljdF9yZmM3NjgzX2F2cHMiLCAiZGljdF9yZmM1Nzc4X2F2cHMiLCAiZGljdF9yZmM3OTQ0X2F2cHMiKTsKKworCisKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF90czI5MTI4X2F2cHMvdHMyOTEyOF9hdnBzLmRpZCBiL2V4dGVuc2lvbnMvZGljdF90czI5MTI4X2F2cHMvdHMyOTEyOF9hdnBzLmRpZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjgwZjc5Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kaWN0X3RzMjkxMjhfYXZwcy90czI5MTI4X2F2cHMuZGlkCkBAIC0wLDAgKzEsMzcgQEAKK2RpY3RfcmZjNjk0Ml9hdnBzCitkaWN0X3RzMjk0NjhfYXZwcworZGljdF90czI5MTU0X2F2cHMKK2RpY3RfdHMyOTIxNF9hdnBzCitkaWN0X3RzMjkyMTVfYXZwcworZGljdF90czI5MjE3X2F2cHMKK2RpY3RfM2dwcDJfYXZwcworZGljdF90czI5MzM4X2F2cHMKK2RpY3RfdHMyOTM0M19hdnBzCitkaWN0X3RzMjkzNDRfYXZwcworZGljdF90czI5MzQ1X2F2cHMKK2RpY3RfdHMzMjI5OV9hdnBzCitkaWN0X3JmYzY3MzRfYXZwcworZGljdF9yZmM1Nzc4X2F2cHMKK2RpY3RfcmZjNTU4MF9hdnBzCitkaWN0X3JmYzQwNzJfYXZwcworZGljdF90czI5MjczX2F2cHMKK2RpY3RfcmZjNTc3N19hdnBzCitkaWN0X3JmYzQwMDZiaXNfYXZwcworZGljdF90czI5MjEyX2F2cHMKK2RpY3RfdHMyOTA2MV9hdnBzCitkaWN0X3JmYzU0NDdfYXZwcworZGljdF90czI5MjcyX2F2cHMKK2RpY3RfdHMyOTE3M19hdnBzCitkaWN0X3RzMjkzMzdfYXZwcworZGljdF9ldHNpMjgzMDM0X2F2cHMKK2RpY3RfcmZjNDU5MF9hdnBzCitkaWN0X3JmYzQwMDRfYXZwcworZGljdF9yZmM3MTU1X2F2cHMKK2RpY3RfdHMyOTIyOV9hdnBzCitkaWN0X3JmYzc2ODNfYXZwcworZGljdF9kcmFmdGxvYWRfYXZwcworZGljdF9yZmM3OTQ0X2F2cHMKK2RpY3RfdHMyOTMyOV9hdnBzCitkaWN0X3RzMjkzNjhfYXZwcworZGljdF90czI5MzM2X2F2cHMKK2RpY3RfdHMyOTEyOF9hdnBzCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfdHMyOTE1NF9hdnBzL0NNYWtlTGlzdHMudHh0IGIvZXh0ZW5zaW9ucy9kaWN0X3RzMjkxNTRfYXZwcy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDViOGZjCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kaWN0X3RzMjkxNTRfYXZwcy9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDE2IEBACisjIFRoZSBkaWN0X3RzMjkxNTRfYXZwcyBleHRlbnNpb24KK1BST0pFQ1QoImRpY3RfdHMyOTE1NF9hdnBzIGxpYnJhcnkgZ2VuZXJhdGVkIGJ5IEZkR2VuICIgQykKKworIyBDb21waWxlIGFzIGEgbW9kdWxlCitGRF9BRERfRVhURU5TSU9OKGRpY3RfdHMyOTE1NF9hdnBzIGRpY3RfdHMyOTE1NF9hdnBzLmMpCisKKworIyMjIworIyMgSU5TVEFMTCBzZWN0aW9uICMjCisKK0lOU1RBTEwoVEFSR0VUUyBkaWN0X3RzMjkxNTRfYXZwcworCUxJQlJBUlkgREVTVElOQVRJT04gJHtJTlNUQUxMX0VYVEVOU0lPTlNfU1VGRklYfQorQ09NUE9ORU5UIGZyZWVEaWFtZXRlci1kaWN0aW9uYXJ5LVRTMjkxNTRfQVZQUykKKworCisKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF90czI5MTU0X2F2cHMvZGljdF90czI5MTU0X2F2cHMuYyBiL2V4dGVuc2lvbnMvZGljdF90czI5MTU0X2F2cHMvZGljdF90czI5MTU0X2F2cHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmRhZTNkCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kaWN0X3RzMjkxNTRfYXZwcy9kaWN0X3RzMjkxNTRfYXZwcy5jCkBAIC0wLDAgKzEsMzEzIEBACisvKgorKiBDb3B5cmlnaHQgKGMpIDIwMTcgU3ByaW50CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKy8qKioqKioqKioqKioqKioqCisgR2VuZXJhdGVkIEJ5OiBmZHRvb2wgZW5oYW5jZW1lbnRzIHRvIGRpYWZ1enplcgorIExpY2Vuc2U6IHNhbWUgYXMgZnJlZURpYW1ldGVyCisqKioqKioqKioqKioqKioqLworCisKKy8qIAorICogRGljdGlvbmFyeSBkZWZpbml0aW9ucyBvZiBvYmplY3RzIHNwZWNpZmllZCBpbiB0czI5MTU0X2F2cHMgKGUxMCkuCisgKi8KKyNpbmNsdWRlIDxmcmVlRGlhbWV0ZXIvZXh0ZW5zaW9uLmg+CisKKyNkZWZpbmUgUFJPVE9fVkVSICJlMTAiCisjZGVmaW5lIEdFTl9EQVRFICAxNTA2Njk3MTQ5Ljk5CisKK2NvbnN0IGNoYXIgKnRzMjkxNTRfYXZwc19wcm90b192ZXIgPSBQUk9UT19WRVI7Citjb25zdCBkb3VibGUgdHMyOTE1NF9hdnBzX2dlbl9kYXRlID0gR0VOX0RBVEU7CisKKy8qIFRoZSBjb250ZW50IG9mIHRoaXMgZmlsZSBmb2xsb3dzIHRoZSBzYW1lIHN0cnVjdHVyZSBhcyBkaWN0X2Jhc2VfcHJvdG8uYyAqLworCisjZGVmaW5lIENIRUNLX2RpY3RfbmV3KCBfdHlwZSwgX2RhdGEsIF9wYXJlbnQsIF9yZWYgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IF9yZXQgPSBmZF9kaWN0X25ldyggZmRfZ19jb25maWctPmNuZl9kaWN0LCAoX3R5cGUpLCAoX2RhdGEpLCAoX3BhcmVudCksIChfcmVmKSApOyBcCisgICAgaWYgKCBfcmV0ICE9IDAgJiYgX3JldCAhPSBFRVhJU1QgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgcmV0dXJuIF9yZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgQ0hFQ0tfZGljdF9zZWFyY2goIF90eXBlLCBfY3JpdGVyaWEsIF93aGF0LCBfcmVzdWx0ICkJCVwKKyAgICBDSEVDS19GQ1QoICBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCAoX3R5cGUpLCAoX2NyaXRlcmlhKSwgKF93aGF0KSwgKF9yZXN1bHQpLCBFTk9FTlQpICk7CisKK3N0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHsKKyAgICBzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZTsKKyAgICBlbnVtIHJ1bGVfcG9zaXRpb24JcG9zaXRpb247CisgICAgaW50IAkJCW1pbjsKKyAgICBpbnQJCQltYXg7Cit9OworCisjZGVmaW5lIFJVTEVfT1JERVIoIF9wb3NpdGlvbiApICgoKChfcG9zaXRpb24pID09IFJVTEVfRklYRURfSEVBRCkgfHwgKChfcG9zaXRpb24pID09IFJVTEVfRklYRURfVEFJTCkpID8gMSA6IDAgKQorCisvKiBBdHRlbnRpb24hIFRoaXMgdmVyc2lvbiBvZiB0aGUgbWFjcm8gdXNlcyBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCBpbiBjb250cmFzdCB0byBtb3N0IG90aGVyIGNvcGllcyEgKi8KKyNkZWZpbmUgUEFSU0VfbG9jX3J1bGVzKCBfcnVsZWFycmF5LCBfcGFyZW50KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgX19hcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoX19hcj0wOyBfX2FyIDwgc2l6ZW9mKF9ydWxlYXJyYXkpIC8gc2l6ZW9mKChfcnVsZWFycmF5KVswXSk7IF9fYXIrKykgeyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgZGljdF9ydWxlX2RhdGEgX19kYXRhID0geyBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLnBvc2l0aW9uLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5taW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLm1heH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgX19kYXRhLnJ1bGVfb3JkZXIgPSBSVUxFX09SREVSKF9fZGF0YS5ydWxlX3Bvc2l0aW9uKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBDSEVDS19GQ1QoICBmZF9kaWN0X3NlYXJjaCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgZmRfZ19jb25maWctPmNuZl9kaWN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBESUNUX0FWUCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgJihfcnVsZWFycmF5KVtfX2FyXS5hdnBfdmVuZG9yX3BsdXNfbmFtZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAmX19kYXRhLnJ1bGVfYXZwLCAwICkgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpZiAoICFfX2RhdGEucnVsZV9hdnAgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfREVCVUcoSU5GTywgIkFWUCBOb3QgZm91bmQ6ICclcyciLCAoX3J1bGVhcnJheSlbX19hcl0uYXZwX3ZlbmRvcl9wbHVzX25hbWUuYXZwX25hbWUpOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRU5PRU5UOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IF9yZXQgPSBmZF9kaWN0X25ldyggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1JVTEUsICYoX19kYXRhKSwgKF9wYXJlbnQpLCBOVUxMICk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIF9yZXQgIT0gMCAmJiBfcmV0ICE9IEVFWElTVCApICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9ERUJVRyhJTkZPLCAiRXJyb3Igb24gcnVsZSB3aXRoIEFWUCAnJXMnIiwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5hdnBfdmVuZG9yX3BsdXNfbmFtZS5hdnBfbmFtZSk7ICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVJTlZBTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIENIRUNLX3ZlbmRvcl9uZXcoIF9kYXRhICkgeyBcCisgICAgICAgIHN0cnVjdCBkaWN0X29iamVjdCAqIHZlbmRvcl9mb3VuZDsgXAorICAgICAgICBpZiAoZmRfZGljdF9zZWFyY2goZmRfZ19jb25maWctPmNuZl9kaWN0LERJQ1RfVkVORE9SLFZFTkRPUl9CWV9JRCwmX2RhdGEudmVuZG9yX2lkLCZ2ZW5kb3JfZm91bmQsRU5PRU5UKSA9PSBFTk9FTlQpIHsgXAorICAgICAgICAgICAgICAgIENIRUNLX0ZDVChmZF9kaWN0X25ldyhmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfVkVORE9SLCAmX2RhdGEsIE5VTEwsIE5VTEwpKTsgXAorICAgICAgICB9IFwKK30KKworI2RlZmluZSBlbnVtdmFsX2RlZl91MzIoIF92YWxfLCBfc3RyXyApCQlcCisgICAgeyBfc3RyXywgCQl7IC51MzIgPSBfdmFsXyB9fQorCisjZGVmaW5lIGVudW12YWxfZGVmX29zKCBfbGVuXywgX3ZhbF8sIF9zdHJfICkJCQkJXAorICAgIHsgX3N0cl8sIAkJeyAub3MgPSB7IC5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilfdmFsXywgLmxlbiA9IF9sZW5fIH19fQorCisKK3N0YXRpYyBpbnQgZGljdF90czI5MTU0X2F2cHNfbG9hZF9kZWZzKGNoYXIgKiBjb25mZmlsZSkKK3sKKyAgIFRSQUNFX0VOVFJZKCIlcCIsIGNvbmZmaWxlKTsKKwkvKiBBcHBsaWNhdGlvbiBTZWN0aW9uICovCisJeworCQkvKiBDcmVhdGUgdGhlIHZlbmRvcnMgKi8JCXsKKwkJCXN0cnVjdCBkaWN0X3ZlbmRvcl9kYXRhIHZlbmRvcl9kYXRhID0geyAxMDQxNSwgIjNHUFAiIH07CisJCQlDSEVDS19kaWN0X25ldyhESUNUX1ZFTkRPUiwgJnZlbmRvcl9kYXRhLCBOVUxMLCBOVUxMKQorCQl9CisJfQorCisKKyAgIC8qIEFWUCBzZWN0aW9uICovCisgICB7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIEFkZHJlc3NfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogVVRGOFN0cmluZ190eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBEaWFtZXRlcklkZW50aXR5X3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIERpYW1ldGVyVVJJX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIFRpbWVfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogSVBGaWx0ZXJSdWxlX3R5cGU7CisKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiQWRkcmVzcyIsICZBZGRyZXNzX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJVVEY4U3RyaW5nIiwgJlVURjhTdHJpbmdfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkRpYW1ldGVySWRlbnRpdHkiLCAmRGlhbWV0ZXJJZGVudGl0eV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiRGlhbWV0ZXJVUkkiLCAmRGlhbWV0ZXJVUklfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIlRpbWUiLCAmVGltZV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiSVBGaWx0ZXJSdWxlIiwgJklQRmlsdGVyUnVsZV90eXBlKTsKKwkJLyogTmV0d29yay1BcmVhLUluZm8tTGlzdCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTQyMDEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk5ldHdvcmstQXJlYS1JbmZvLUxpc3QiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBOdW1iZXItT2YtVUVzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNDIwOSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTnVtYmVyLU9mLVVFcyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogUmVmZXJlbmNlLUlkICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNDIwMiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUmVmZXJlbmNlLUlkIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogVHJhbnNmZXItUmVxdWVzdC1UeXBlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNDIwMywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiVHJhbnNmZXItUmVxdWVzdC1UeXBlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBUcmFuc2Zlci1FbmQtVGltZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTQyMDUsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlRyYW5zZmVyLUVuZC1UaW1lIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBUaW1lX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBUcmFuc2Zlci1Qb2xpY3ktSWQgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk0MjA4LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJUcmFuc2Zlci1Qb2xpY3ktSWQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFRyYW5zZmVyLVN0YXJ0LVRpbWUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk0MjA2LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJUcmFuc2Zlci1TdGFydC1UaW1lIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBUaW1lX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBUaW1lLVdpbmRvdyAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTQyMDQsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlRpbWUtV2luZG93IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBUcmFuc2Zlci1Qb2xpY3kgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk0MjA3LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJUcmFuc2Zlci1Qb2xpY3kiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisKKwkKKyAgIH0KKworICAgLyogQ29tbWFuZHMgc2VjdGlvbiAqLworICAgeworCisgICB9CisKKyAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRpY3RfdHMyOTE1NF9hdnBzX2xvYWRfcnVsZXMoY2hhciAqIGNvbmZmaWxlKQoreworICAgLyogR3JvdXBlZCBBVlAgc2VjdGlvbiAqLworICAgeworCSAgLyogVGltZS1XaW5kb3cgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlRpbWUtV2luZG93In07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUcmFuc2Zlci1TdGFydC1UaW1lIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUcmFuc2Zlci1FbmQtVGltZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIFRyYW5zZmVyLVBvbGljeSAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVHJhbnNmZXItUG9saWN5In07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUcmFuc2Zlci1Qb2xpY3ktSWQifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlRpbWUtV2luZG93In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJhdGluZy1Hcm91cCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTWF4LVJlcXVlc3RlZC1CYW5kd2lkdGgtREwifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1heC1SZXF1ZXN0ZWQtQmFuZHdpZHRoLVVMIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCisgICB9CQorCisgICAvKiBDb21tYW5kcyBzZWN0aW9uICovCisgICB7CisKKyAgIH0KKworICAgTE9HX0QoICJFeHRlbnNpb24gJ0RpY3Rpb25hcnkgZGVmaW5pdGlvbnMgZm9yIHRzMjkxNTRfYXZwcyAoZTEwKScgaW5pdGlhbGl6ZWQiKTsKKyAgIHJldHVybiAwOworfQorCitpbnQgZGljdF9lbnRyeShjaGFyICogY29uZmZpbGUpCit7CisJZGljdF90czI5MTU0X2F2cHNfbG9hZF9kZWZzKGNvbmZmaWxlKTsKKwlyZXR1cm4gZGljdF90czI5MTU0X2F2cHNfbG9hZF9ydWxlcyhjb25mZmlsZSk7Cit9CisKK2NvbnN0IGNoYXIqIGRpY3RfdHMyOTE1NF9hdnBzX3Byb3RvX3ZlcihjaGFyICogY29uZmZpbGUpIHsKKwlyZXR1cm4gdHMyOTE1NF9hdnBzX3Byb3RvX3ZlcjsKK30KKworY29uc3QgZG91YmxlIGRpY3RfdHMyOTE1NF9hdnBzX2dlbl90cyhjaGFyICogY29uZmZpbGUpIHsKKwlyZXR1cm4gdHMyOTE1NF9hdnBzX2dlbl9kYXRlOworfQorCitFWFRFTlNJT05fRU5UUlkyKCJkaWN0X3RzMjkxNTRfYXZwcyIsIGRpY3RfdHMyOTE1NF9hdnBzX2xvYWRfZGVmcywgZGljdF90czI5MTU0X2F2cHNfbG9hZF9ydWxlcywgImRpY3RfdHMyOTIxNV9hdnBzIiwgImRpY3RfdHMyOTIxNF9hdnBzIiwgImRpY3RfdHMyOTIyOV9hdnBzIiwgImRpY3RfcmZjNzY4M19hdnBzIiwgImRpY3RfcmZjNDAwNmJpc19hdnBzIiwgImRpY3RfZHJhZnRsb2FkX2F2cHMiLCAiZGljdF9yZmM3OTQ0X2F2cHMiKTsKKworCisKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF90czI5MTU0X2F2cHMvdHMyOTE1NF9hdnBzLmRpZCBiL2V4dGVuc2lvbnMvZGljdF90czI5MTU0X2F2cHMvdHMyOTE1NF9hdnBzLmRpZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYThiMzk0Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kaWN0X3RzMjkxNTRfYXZwcy90czI5MTU0X2F2cHMuZGlkCkBAIC0wLDAgKzEsMzcgQEAKK2RpY3RfcmZjNjk0Ml9hdnBzCitkaWN0X3RzMjkyMTRfYXZwcworZGljdF90czI5NDY4X2F2cHMKK2RpY3RfdHMyOTIxN19hdnBzCitkaWN0XzNncHAyX2F2cHMKK2RpY3RfdHMyOTM0M19hdnBzCitkaWN0X3RzMjkzMzhfYXZwcworZGljdF90czI5MTI4X2F2cHMKK2RpY3RfdHMyOTM0NF9hdnBzCitkaWN0X3RzMjkzNDVfYXZwcworZGljdF90czMyMjk5X2F2cHMKK2RpY3RfcmZjNjczNF9hdnBzCitkaWN0X3JmYzU3NzhfYXZwcworZGljdF9yZmM1NTgwX2F2cHMKK2RpY3RfcmZjNDA3Ml9hdnBzCitkaWN0X3RzMjkyNzNfYXZwcworZGljdF90czI5MTczX2F2cHMKK2RpY3RfdHMyOTMzN19hdnBzCitkaWN0X2V0c2kyODMwMzRfYXZwcworZGljdF9yZmM0NTkwX2F2cHMKK2RpY3RfdHMyOTIyOV9hdnBzCitkaWN0X3RzMjkzMjlfYXZwcworZGljdF90czI5MzY4X2F2cHMKK2RpY3RfdHMyOTMzNl9hdnBzCitkaWN0X3RzMjkwNjFfYXZwcworZGljdF9yZmM1NDQ3X2F2cHMKK2RpY3RfdHMyOTI3Ml9hdnBzCitkaWN0X3JmYzc2ODNfYXZwcworZGljdF90czI5MjEyX2F2cHMKK2RpY3RfdHMyOTIxNV9hdnBzCitkaWN0X2RyYWZ0bG9hZF9hdnBzCitkaWN0X3JmYzc5NDRfYXZwcworZGljdF9yZmM0MDA0X2F2cHMKK2RpY3RfcmZjNzE1NV9hdnBzCitkaWN0X3JmYzU3NzdfYXZwcworZGljdF9yZmM0MDA2YmlzX2F2cHMKK2RpY3RfdHMyOTE1NF9hdnBzCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfdHMyOTE3M19hdnBzL0NNYWtlTGlzdHMudHh0IGIvZXh0ZW5zaW9ucy9kaWN0X3RzMjkxNzNfYXZwcy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWE4YjVjCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kaWN0X3RzMjkxNzNfYXZwcy9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDE2IEBACisjIFRoZSBkaWN0X3RzMjkxNzNfYXZwcyBleHRlbnNpb24KK1BST0pFQ1QoImRpY3RfdHMyOTE3M19hdnBzIGxpYnJhcnkgZ2VuZXJhdGVkIGJ5IEZkR2VuICIgQykKKworIyBDb21waWxlIGFzIGEgbW9kdWxlCitGRF9BRERfRVhURU5TSU9OKGRpY3RfdHMyOTE3M19hdnBzIGRpY3RfdHMyOTE3M19hdnBzLmMpCisKKworIyMjIworIyMgSU5TVEFMTCBzZWN0aW9uICMjCisKK0lOU1RBTEwoVEFSR0VUUyBkaWN0X3RzMjkxNzNfYXZwcworCUxJQlJBUlkgREVTVElOQVRJT04gJHtJTlNUQUxMX0VYVEVOU0lPTlNfU1VGRklYfQorQ09NUE9ORU5UIGZyZWVEaWFtZXRlci1kaWN0aW9uYXJ5LVRTMjkxNzNfQVZQUykKKworCisKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF90czI5MTczX2F2cHMvZGljdF90czI5MTczX2F2cHMuYyBiL2V4dGVuc2lvbnMvZGljdF90czI5MTczX2F2cHMvZGljdF90czI5MTczX2F2cHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODJlNTNkCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kaWN0X3RzMjkxNzNfYXZwcy9kaWN0X3RzMjkxNzNfYXZwcy5jCkBAIC0wLDAgKzEsMzYwIEBACisvKgorKiBDb3B5cmlnaHQgKGMpIDIwMTcgU3ByaW50CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKy8qKioqKioqKioqKioqKioqCisgR2VuZXJhdGVkIEJ5OiBmZHRvb2wgZW5oYW5jZW1lbnRzIHRvIGRpYWZ1enplcgorIExpY2Vuc2U6IHNhbWUgYXMgZnJlZURpYW1ldGVyCisqKioqKioqKioqKioqKioqLworCisKKy8qIAorICogRGljdGlvbmFyeSBkZWZpbml0aW9ucyBvZiBvYmplY3RzIHNwZWNpZmllZCBpbiB0czI5MTczX2F2cHMgKGUwMCkuCisgKi8KKyNpbmNsdWRlIDxmcmVlRGlhbWV0ZXIvZXh0ZW5zaW9uLmg+CisKKyNkZWZpbmUgUFJPVE9fVkVSICJlMDAiCisjZGVmaW5lIEdFTl9EQVRFICAxNTA2Njk3MTcyLjIKKworY29uc3QgY2hhciAqdHMyOTE3M19hdnBzX3Byb3RvX3ZlciA9IFBST1RPX1ZFUjsKK2NvbnN0IGRvdWJsZSB0czI5MTczX2F2cHNfZ2VuX2RhdGUgPSBHRU5fREFURTsKKworLyogVGhlIGNvbnRlbnQgb2YgdGhpcyBmaWxlIGZvbGxvd3MgdGhlIHNhbWUgc3RydWN0dXJlIGFzIGRpY3RfYmFzZV9wcm90by5jICovCisKKyNkZWZpbmUgQ0hFQ0tfZGljdF9uZXcoIF90eXBlLCBfZGF0YSwgX3BhcmVudCwgX3JlZiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgX3JldCA9IGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIChfdHlwZSksIChfZGF0YSksIChfcGFyZW50KSwgKF9yZWYpICk7IFwKKyAgICBpZiAoIF9yZXQgIT0gMCAmJiBfcmV0ICE9IEVFWElTVCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICByZXR1cm4gX3JldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBDSEVDS19kaWN0X3NlYXJjaCggX3R5cGUsIF9jcml0ZXJpYSwgX3doYXQsIF9yZXN1bHQgKQkJXAorICAgIENIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIChfdHlwZSksIChfY3JpdGVyaWEpLCAoX3doYXQpLCAoX3Jlc3VsdCksIEVOT0VOVCkgKTsKKworc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24geworICAgIHN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lOworICAgIGVudW0gcnVsZV9wb3NpdGlvbglwb3NpdGlvbjsKKyAgICBpbnQgCQkJbWluOworICAgIGludAkJCW1heDsKK307CisKKyNkZWZpbmUgUlVMRV9PUkRFUiggX3Bvc2l0aW9uICkgKCgoKF9wb3NpdGlvbikgPT0gUlVMRV9GSVhFRF9IRUFEKSB8fCAoKF9wb3NpdGlvbikgPT0gUlVMRV9GSVhFRF9UQUlMKSkgPyAxIDogMCApCisKKy8qIEF0dGVudGlvbiEgVGhpcyB2ZXJzaW9uIG9mIHRoZSBtYWNybyB1c2VzIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsIGluIGNvbnRyYXN0IHRvIG1vc3Qgb3RoZXIgY29waWVzISAqLworI2RlZmluZSBQQVJTRV9sb2NfcnVsZXMoIF9ydWxlYXJyYXksIF9wYXJlbnQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBfX2FyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yIChfX2FyPTA7IF9fYXIgPCBzaXplb2YoX3J1bGVhcnJheSkgLyBzaXplb2YoKF9ydWxlYXJyYXkpWzBdKTsgX19hcisrKSB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHN0cnVjdCBkaWN0X3J1bGVfZGF0YSBfX2RhdGEgPSB7IE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ucG9zaXRpb24sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLm1pbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ubWF4fTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfX2RhdGEucnVsZV9vcmRlciA9IFJVTEVfT1JERVIoX19kYXRhLnJ1bGVfcG9zaXRpb24pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIENIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIERJQ1RfQVZQLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAmKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICZfX2RhdGEucnVsZV9hdnAsIDAgKSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmICggIV9fZGF0YS5ydWxlX2F2cCApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9ERUJVRyhJTkZPLCAiQVZQIE5vdCBmb3VuZDogJyVzJyIsIChfcnVsZWFycmF5KVtfX2FyXS5hdnBfdmVuZG9yX3BsdXNfbmFtZS5hdnBfbmFtZSk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFTk9FTlQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgX3JldCA9IGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfUlVMRSwgJihfX2RhdGEpLCAoX3BhcmVudCksIE5VTEwgKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggX3JldCAhPSAwICYmIF9yZXQgIT0gRUVYSVNUICkgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFX0RFQlVHKElORk8sICJFcnJvciBvbiBydWxlIHdpdGggQVZQICclcyciLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLmF2cF9uYW1lKTsgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRUlOVkFMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgQ0hFQ0tfdmVuZG9yX25ldyggX2RhdGEgKSB7IFwKKyAgICAgICAgc3RydWN0IGRpY3Rfb2JqZWN0ICogdmVuZG9yX2ZvdW5kOyBcCisgICAgICAgIGlmIChmZF9kaWN0X3NlYXJjaChmZF9nX2NvbmZpZy0+Y25mX2RpY3QsRElDVF9WRU5ET1IsVkVORE9SX0JZX0lELCZfZGF0YS52ZW5kb3JfaWQsJnZlbmRvcl9mb3VuZCxFTk9FTlQpID09IEVOT0VOVCkgeyBcCisgICAgICAgICAgICAgICAgQ0hFQ0tfRkNUKGZkX2RpY3RfbmV3KGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9WRU5ET1IsICZfZGF0YSwgTlVMTCwgTlVMTCkpOyBcCisgICAgICAgIH0gXAorfQorCisjZGVmaW5lIGVudW12YWxfZGVmX3UzMiggX3ZhbF8sIF9zdHJfICkJCVwKKyAgICB7IF9zdHJfLCAJCXsgLnUzMiA9IF92YWxfIH19CisKKyNkZWZpbmUgZW51bXZhbF9kZWZfb3MoIF9sZW5fLCBfdmFsXywgX3N0cl8gKQkJCQlcCisgICAgeyBfc3RyXywgCQl7IC5vcyA9IHsgLmRhdGEgPSAodW5zaWduZWQgY2hhciAqKV92YWxfLCAubGVuID0gX2xlbl8gfX19CisKKworc3RhdGljIGludCBkaWN0X3RzMjkxNzNfYXZwc19sb2FkX2RlZnMoY2hhciAqIGNvbmZmaWxlKQoreworICAgVFJBQ0VfRU5UUlkoIiVwIiwgY29uZmZpbGUpOworCS8qIEFwcGxpY2F0aW9uIFNlY3Rpb24gKi8KKwl7CisJCS8qIENyZWF0ZSB0aGUgdmVuZG9ycyAqLwkJeworCQkJc3RydWN0IGRpY3RfdmVuZG9yX2RhdGEgdmVuZG9yX2RhdGEgPSB7IDEwNDE1LCAiM0dQUCIgfTsKKwkJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVkVORE9SLCAmdmVuZG9yX2RhdGEsIE5VTEwsIE5VTEwpCisJCX0KKwl9CisKKworICAgLyogQVZQIHNlY3Rpb24gKi8KKyAgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogQWRkcmVzc190eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBVVEY4U3RyaW5nX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIERpYW1ldGVySWRlbnRpdHlfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogRGlhbWV0ZXJVUklfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogVGltZV90eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBJUEZpbHRlclJ1bGVfdHlwZTsKKworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJBZGRyZXNzIiwgJkFkZHJlc3NfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIlVURjhTdHJpbmciLCAmVVRGOFN0cmluZ190eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiRGlhbWV0ZXJJZGVudGl0eSIsICZEaWFtZXRlcklkZW50aXR5X3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJEaWFtZXRlclVSSSIsICZEaWFtZXRlclVSSV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiVGltZSIsICZUaW1lX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJJUEZpbHRlclJ1bGUiLCAmSVBGaWx0ZXJSdWxlX3R5cGUpOworCQkvKiBMTVNJICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjQwMCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTE1TSSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIE1NRS1OYW1lICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjQwMiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTU1FLU5hbWUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIERpYW1ldGVySWRlbnRpdHlfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIE1TQy1OdW1iZXIgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyNDAzLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJNU0MtTnVtYmVyIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogTENTLUNhcGFiaWxpdGllcy1TZXRzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjQwNCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTENTLUNhcGFiaWxpdGllcy1TZXRzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBHTUxDLUFkZHJlc3MgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyNDA1LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJHTUxDLUFkZHJlc3MiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIEFkZHJlc3NfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFBQUi1BZGRyZXNzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjQwNywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUFBSLUFkZHJlc3MiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIEFkZHJlc3NfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIE1NRS1SZWFsbSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTI0MDgsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk1NRS1SZWFsbSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgRGlhbWV0ZXJJZGVudGl0eV90eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogU0dTTi1OYW1lICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjQwOSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiU0dTTi1OYW1lIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBEaWFtZXRlcklkZW50aXR5X3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBTR1NOLVJlYWxtICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjQxMCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiU0dTTi1SZWFsbSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgRGlhbWV0ZXJJZGVudGl0eV90eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogUklBLUZsYWdzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjQxMSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUklBLUZsYWdzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBBZGRpdGlvbmFsLVNlcnZpbmctTm9kZSAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTI0MDYsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkFkZGl0aW9uYWwtU2VydmluZy1Ob2RlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBTZXJ2aW5nLU5vZGUgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyNDAxLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTZXJ2aW5nLU5vZGUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisKKwkKKyAgIH0KKworICAgLyogQ29tbWFuZHMgc2VjdGlvbiAqLworICAgeworCisgICB9CisKKyAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRpY3RfdHMyOTE3M19hdnBzX2xvYWRfcnVsZXMoY2hhciAqIGNvbmZmaWxlKQoreworICAgLyogR3JvdXBlZCBBVlAgc2VjdGlvbiAqLworICAgeworCSAgLyogQWRkaXRpb25hbC1TZXJ2aW5nLU5vZGUgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFkZGl0aW9uYWwtU2VydmluZy1Ob2RlIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTR1NOLU51bWJlciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTU1FLU5hbWUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNHU04tTmFtZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU0dTTi1SZWFsbSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTU1FLVJlYWxtIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNU0MtTnVtYmVyIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICIzR1BQLUFBQS1TZXJ2ZXItTmFtZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTENTLUNhcGFiaWxpdGllcy1TZXRzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJHTUxDLUFkZHJlc3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBTZXJ2aW5nLU5vZGUgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNlcnZpbmctTm9kZSJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU0dTTi1OdW1iZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNHU04tTmFtZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU0dTTi1SZWFsbSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTU1FLU5hbWUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1NRS1SZWFsbSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTVNDLU51bWJlciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiM0dQUC1BQUEtU2VydmVyLU5hbWUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkxDUy1DYXBhYmlsaXRpZXMtU2V0cyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiR01MQy1BZGRyZXNzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCisgICB9CQorCisgICAvKiBDb21tYW5kcyBzZWN0aW9uICovCisgICB7CisKKyAgIH0KKworICAgTE9HX0QoICJFeHRlbnNpb24gJ0RpY3Rpb25hcnkgZGVmaW5pdGlvbnMgZm9yIHRzMjkxNzNfYXZwcyAoZTAwKScgaW5pdGlhbGl6ZWQiKTsKKyAgIHJldHVybiAwOworfQorCitpbnQgZGljdF9lbnRyeShjaGFyICogY29uZmZpbGUpCit7CisJZGljdF90czI5MTczX2F2cHNfbG9hZF9kZWZzKGNvbmZmaWxlKTsKKwlyZXR1cm4gZGljdF90czI5MTczX2F2cHNfbG9hZF9ydWxlcyhjb25mZmlsZSk7Cit9CisKK2NvbnN0IGNoYXIqIGRpY3RfdHMyOTE3M19hdnBzX3Byb3RvX3ZlcihjaGFyICogY29uZmZpbGUpIHsKKwlyZXR1cm4gdHMyOTE3M19hdnBzX3Byb3RvX3ZlcjsKK30KKworY29uc3QgZG91YmxlIGRpY3RfdHMyOTE3M19hdnBzX2dlbl90cyhjaGFyICogY29uZmZpbGUpIHsKKwlyZXR1cm4gdHMyOTE3M19hdnBzX2dlbl9kYXRlOworfQorCitFWFRFTlNJT05fRU5UUlkyKCJkaWN0X3RzMjkxNzNfYXZwcyIsIGRpY3RfdHMyOTE3M19hdnBzX2xvYWRfZGVmcywgZGljdF90czI5MTczX2F2cHNfbG9hZF9ydWxlcywgImRpY3RfdHMyOTI3Ml9hdnBzIiwgImRpY3RfdHMyOTI3M19hdnBzIiwgImRpY3RfdHMyOTMyOV9hdnBzIiwgImRpY3RfdHMyOTIyOV9hdnBzIik7CisKKworCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfdHMyOTE3M19hdnBzL3RzMjkxNzNfYXZwcy5kaWQgYi9leHRlbnNpb25zL2RpY3RfdHMyOTE3M19hdnBzL3RzMjkxNzNfYXZwcy5kaWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I2MTU1NgotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF90czI5MTczX2F2cHMvdHMyOTE3M19hdnBzLmRpZApAQCAtMCwwICsxLDM3IEBACitkaWN0X3JmYzY5NDJfYXZwcworZGljdF90czI5NDY4X2F2cHMKK2RpY3RfdHMyOTM0M19hdnBzCitkaWN0X3RzMjkxMjhfYXZwcworZGljdF90czI5MzQ0X2F2cHMKK2RpY3RfdHMyOTM0NV9hdnBzCitkaWN0X3RzMjkzMzdfYXZwcworZGljdF8zZ3BwMl9hdnBzCitkaWN0X3RzMjkxNTRfYXZwcworZGljdF90czI5MjE0X2F2cHMKK2RpY3RfdHMyOTIxNV9hdnBzCitkaWN0X3RzMjkyMTdfYXZwcworZGljdF90czI5MzM4X2F2cHMKK2RpY3RfdHMyOTMzNl9hdnBzCitkaWN0X3RzMjkzNjhfYXZwcworZGljdF90czMyMjk5X2F2cHMKK2RpY3RfcmZjNjczNF9hdnBzCitkaWN0X3JmYzU3NzhfYXZwcworZGljdF9yZmM1NTgwX2F2cHMKK2RpY3RfcmZjNDA3Ml9hdnBzCitkaWN0X3RzMjkyNzNfYXZwcworZGljdF9yZmM1Nzc3X2F2cHMKK2RpY3RfcmZjNDAwNmJpc19hdnBzCitkaWN0X3RzMjkyMTJfYXZwcworZGljdF90czI5MDYxX2F2cHMKK2RpY3RfcmZjNTQ0N19hdnBzCitkaWN0X3RzMjkyNzJfYXZwcworZGljdF9ldHNpMjgzMDM0X2F2cHMKK2RpY3RfcmZjNDU5MF9hdnBzCitkaWN0X3JmYzQwMDRfYXZwcworZGljdF9yZmM3MTU1X2F2cHMKK2RpY3RfdHMyOTIyOV9hdnBzCitkaWN0X3JmYzc2ODNfYXZwcworZGljdF9kcmFmdGxvYWRfYXZwcworZGljdF9yZmM3OTQ0X2F2cHMKK2RpY3RfdHMyOTMyOV9hdnBzCitkaWN0X3RzMjkxNzNfYXZwcwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X3RzMjkyMTJfYXZwcy9DTWFrZUxpc3RzLnR4dCBiL2V4dGVuc2lvbnMvZGljdF90czI5MjEyX2F2cHMvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVkZTlhMAotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF90czI5MjEyX2F2cHMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxNiBAQAorIyBUaGUgZGljdF90czI5MjEyX2F2cHMgZXh0ZW5zaW9uCitQUk9KRUNUKCJkaWN0X3RzMjkyMTJfYXZwcyBsaWJyYXJ5IGdlbmVyYXRlZCBieSBGZEdlbiAiIEMpCisKKyMgQ29tcGlsZSBhcyBhIG1vZHVsZQorRkRfQUREX0VYVEVOU0lPTihkaWN0X3RzMjkyMTJfYXZwcyBkaWN0X3RzMjkyMTJfYXZwcy5jKQorCisKKyMjIyMKKyMjIElOU1RBTEwgc2VjdGlvbiAjIworCitJTlNUQUxMKFRBUkdFVFMgZGljdF90czI5MjEyX2F2cHMKKwlMSUJSQVJZIERFU1RJTkFUSU9OICR7SU5TVEFMTF9FWFRFTlNJT05TX1NVRkZJWH0KK0NPTVBPTkVOVCBmcmVlRGlhbWV0ZXItZGljdGlvbmFyeS1UUzI5MjEyX0FWUFMpCisKKworCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfdHMyOTIxMl9hdnBzL2RpY3RfdHMyOTIxMl9hdnBzLmMgYi9leHRlbnNpb25zL2RpY3RfdHMyOTIxMl9hdnBzL2RpY3RfdHMyOTIxMl9hdnBzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAwMTJiZQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF90czI5MjEyX2F2cHMvZGljdF90czI5MjEyX2F2cHMuYwpAQCAtMCwwICsxLDMxNDggQEAKKy8qCisqIENvcHlyaWdodCAoYykgMjAxNyBTcHJpbnQKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLyoqKioqKioqKioqKioqKioKKyBHZW5lcmF0ZWQgQnk6IGZkdG9vbCBlbmhhbmNlbWVudHMgdG8gZGlhZnV6emVyCisgTGljZW5zZTogc2FtZSBhcyBmcmVlRGlhbWV0ZXIKKyoqKioqKioqKioqKioqKiovCisKKworLyogCisgKiBEaWN0aW9uYXJ5IGRlZmluaXRpb25zIG9mIG9iamVjdHMgc3BlY2lmaWVkIGluIHRzMjkyMTJfYXZwcyAoZTMwKS4KKyAqLworI2luY2x1ZGUgPGZyZWVEaWFtZXRlci9leHRlbnNpb24uaD4KKworI2RlZmluZSBQUk9UT19WRVIgImUzMCIKKyNkZWZpbmUgR0VOX0RBVEUgIDE1MDY2OTcxODEuOTcKKworY29uc3QgY2hhciAqdHMyOTIxMl9hdnBzX3Byb3RvX3ZlciA9IFBST1RPX1ZFUjsKK2NvbnN0IGRvdWJsZSB0czI5MjEyX2F2cHNfZ2VuX2RhdGUgPSBHRU5fREFURTsKKworLyogVGhlIGNvbnRlbnQgb2YgdGhpcyBmaWxlIGZvbGxvd3MgdGhlIHNhbWUgc3RydWN0dXJlIGFzIGRpY3RfYmFzZV9wcm90by5jICovCisKKyNkZWZpbmUgQ0hFQ0tfZGljdF9uZXcoIF90eXBlLCBfZGF0YSwgX3BhcmVudCwgX3JlZiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgX3JldCA9IGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIChfdHlwZSksIChfZGF0YSksIChfcGFyZW50KSwgKF9yZWYpICk7IFwKKyAgICBpZiAoIF9yZXQgIT0gMCAmJiBfcmV0ICE9IEVFWElTVCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICByZXR1cm4gX3JldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBDSEVDS19kaWN0X3NlYXJjaCggX3R5cGUsIF9jcml0ZXJpYSwgX3doYXQsIF9yZXN1bHQgKQkJXAorICAgIENIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIChfdHlwZSksIChfY3JpdGVyaWEpLCAoX3doYXQpLCAoX3Jlc3VsdCksIEVOT0VOVCkgKTsKKworc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24geworICAgIHN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lOworICAgIGVudW0gcnVsZV9wb3NpdGlvbglwb3NpdGlvbjsKKyAgICBpbnQgCQkJbWluOworICAgIGludAkJCW1heDsKK307CisKKyNkZWZpbmUgUlVMRV9PUkRFUiggX3Bvc2l0aW9uICkgKCgoKF9wb3NpdGlvbikgPT0gUlVMRV9GSVhFRF9IRUFEKSB8fCAoKF9wb3NpdGlvbikgPT0gUlVMRV9GSVhFRF9UQUlMKSkgPyAxIDogMCApCisKKy8qIEF0dGVudGlvbiEgVGhpcyB2ZXJzaW9uIG9mIHRoZSBtYWNybyB1c2VzIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsIGluIGNvbnRyYXN0IHRvIG1vc3Qgb3RoZXIgY29waWVzISAqLworI2RlZmluZSBQQVJTRV9sb2NfcnVsZXMoIF9ydWxlYXJyYXksIF9wYXJlbnQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBfX2FyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yIChfX2FyPTA7IF9fYXIgPCBzaXplb2YoX3J1bGVhcnJheSkgLyBzaXplb2YoKF9ydWxlYXJyYXkpWzBdKTsgX19hcisrKSB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHN0cnVjdCBkaWN0X3J1bGVfZGF0YSBfX2RhdGEgPSB7IE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ucG9zaXRpb24sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLm1pbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ubWF4fTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfX2RhdGEucnVsZV9vcmRlciA9IFJVTEVfT1JERVIoX19kYXRhLnJ1bGVfcG9zaXRpb24pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIENIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIERJQ1RfQVZQLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAmKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICZfX2RhdGEucnVsZV9hdnAsIDAgKSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmICggIV9fZGF0YS5ydWxlX2F2cCApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9ERUJVRyhJTkZPLCAiQVZQIE5vdCBmb3VuZDogJyVzJyIsIChfcnVsZWFycmF5KVtfX2FyXS5hdnBfdmVuZG9yX3BsdXNfbmFtZS5hdnBfbmFtZSk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFTk9FTlQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgX3JldCA9IGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfUlVMRSwgJihfX2RhdGEpLCAoX3BhcmVudCksIE5VTEwgKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggX3JldCAhPSAwICYmIF9yZXQgIT0gRUVYSVNUICkgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFX0RFQlVHKElORk8sICJFcnJvciBvbiBydWxlIHdpdGggQVZQICclcyciLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLmF2cF9uYW1lKTsgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRUlOVkFMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgQ0hFQ0tfdmVuZG9yX25ldyggX2RhdGEgKSB7IFwKKyAgICAgICAgc3RydWN0IGRpY3Rfb2JqZWN0ICogdmVuZG9yX2ZvdW5kOyBcCisgICAgICAgIGlmIChmZF9kaWN0X3NlYXJjaChmZF9nX2NvbmZpZy0+Y25mX2RpY3QsRElDVF9WRU5ET1IsVkVORE9SX0JZX0lELCZfZGF0YS52ZW5kb3JfaWQsJnZlbmRvcl9mb3VuZCxFTk9FTlQpID09IEVOT0VOVCkgeyBcCisgICAgICAgICAgICAgICAgQ0hFQ0tfRkNUKGZkX2RpY3RfbmV3KGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9WRU5ET1IsICZfZGF0YSwgTlVMTCwgTlVMTCkpOyBcCisgICAgICAgIH0gXAorfQorCisjZGVmaW5lIGVudW12YWxfZGVmX3UzMiggX3ZhbF8sIF9zdHJfICkJCVwKKyAgICB7IF9zdHJfLCAJCXsgLnUzMiA9IF92YWxfIH19CisKKyNkZWZpbmUgZW51bXZhbF9kZWZfb3MoIF9sZW5fLCBfdmFsXywgX3N0cl8gKQkJCQlcCisgICAgeyBfc3RyXywgCQl7IC5vcyA9IHsgLmRhdGEgPSAodW5zaWduZWQgY2hhciAqKV92YWxfLCAubGVuID0gX2xlbl8gfX19CisKKworc3RhdGljIGludCBkaWN0X3RzMjkyMTJfYXZwc19sb2FkX2RlZnMoY2hhciAqIGNvbmZmaWxlKQoreworICAgVFJBQ0VfRU5UUlkoIiVwIiwgY29uZmZpbGUpOworCS8qIEFwcGxpY2F0aW9uIFNlY3Rpb24gKi8KKwl7CisJCS8qIENyZWF0ZSB0aGUgdmVuZG9ycyAqLwkJeworCQkJc3RydWN0IGRpY3RfdmVuZG9yX2RhdGEgdmVuZG9yX2RhdGEgPSB7IDEwNDE1LCAiM0dQUCIgfTsKKwkJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVkVORE9SLCAmdmVuZG9yX2RhdGEsIE5VTEwsIE5VTEwpCisJCX0KKwl9CisKKworICAgLyogQVZQIHNlY3Rpb24gKi8KKyAgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogQWRkcmVzc190eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBVVEY4U3RyaW5nX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIERpYW1ldGVySWRlbnRpdHlfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogRGlhbWV0ZXJVUklfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogVGltZV90eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBJUEZpbHRlclJ1bGVfdHlwZTsKKworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJBZGRyZXNzIiwgJkFkZHJlc3NfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIlVURjhTdHJpbmciLCAmVVRGOFN0cmluZ190eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiRGlhbWV0ZXJJZGVudGl0eSIsICZEaWFtZXRlcklkZW50aXR5X3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJEaWFtZXRlclVSSSIsICZEaWFtZXRlclVSSV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiVGltZSIsICZUaW1lX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJJUEZpbHRlclJ1bGUiLCAmSVBGaWx0ZXJSdWxlX3R5cGUpOworCQkvKiAzR1BQLVBTLURhdGEtT2ZmLVN0YXR1cyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTI4NDcsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIjNHUFAtUFMtRGF0YS1PZmYtU3RhdHVzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZCgzR1BQLVBTLURhdGEtT2ZmLVN0YXR1cykiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIkFDVElWRSIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJJTkFDVElWRSIsIHsgLmkzMj0xIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBBY2Nlc3MtQXZhaWxhYmlsaXR5LUNoYW5nZS1SZWFzb24gKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyODMzLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJBY2Nlc3MtQXZhaWxhYmlsaXR5LUNoYW5nZS1SZWFzb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIEFOLUdXLUFkZHJlc3MgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMDUwLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJBTi1HVy1BZGRyZXNzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBBZGRyZXNzX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBBTi1HVy1TdGF0dXMgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyODExLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJBTi1HVy1TdGF0dXMiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKEFOLUdXLVN0YXR1cykiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIkFOX0dXX0ZBSUxFRCIsIHsgLmkzMj0wIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogQVBOLUFnZ3JlZ2F0ZS1NYXgtQml0cmF0ZS1ETCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEwNDAsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkFQTi1BZ2dyZWdhdGUtTWF4LUJpdHJhdGUtREwiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIEFQTi1BZ2dyZWdhdGUtTWF4LUJpdHJhdGUtVUwgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMDQxLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJBUE4tQWdncmVnYXRlLU1heC1CaXRyYXRlLVVMIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBCZWFyZXItQ29udHJvbC1Nb2RlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTAyMywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQmVhcmVyLUNvbnRyb2wtTW9kZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoQmVhcmVyLUNvbnRyb2wtTW9kZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIlVFX09OTFkiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiUkVTRVJWRUQiLCB7IC5pMzI9MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAiVUVfTlciLCB7IC5pMzI9MiB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBCZWFyZXItSWRlbnRpZmllciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEwMjAsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkJlYXJlci1JZGVudGlmaWVyIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogQmVhcmVyLU9wZXJhdGlvbiAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEwMjEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkJlYXJlci1PcGVyYXRpb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKEJlYXJlci1PcGVyYXRpb24pIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJURVJNSU5BVElPTiIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJFU1RBQkxJU0hNRU5UIiwgeyAuaTMyPTEgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMyA9IHsgIk1PRElGSUNBVElPTiIsIHsgLmkzMj0yIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIEJlYXJlci1Vc2FnZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEwMDAsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkJlYXJlci1Vc2FnZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoQmVhcmVyLVVzYWdlKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiR0VORVJBTCIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJJTVNfU0lHTkFMTElORyIsIHsgLmkzMj0xIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBDaGFyZ2luZy1Db3JyZWxhdGlvbi1JbmRpY2F0b3IgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMDczLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJDaGFyZ2luZy1Db3JyZWxhdGlvbi1JbmRpY2F0b3IiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKENoYXJnaW5nLUNvcnJlbGF0aW9uLUluZGljYXRvcikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIkNIQVJHSU5HX0lERU5USUZJRVJfUkVRVUlSRUQiLCB7IC5pMzI9MCB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIENoYXJnaW5nLVJ1bGUtQmFzZS1OYW1lICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTAwNCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQ2hhcmdpbmctUnVsZS1CYXNlLU5hbWUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIENoYXJnaW5nLVJ1bGUtTmFtZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEwMDUsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkNoYXJnaW5nLVJ1bGUtTmFtZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIENvQS1JUC1BZGRyZXNzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTAzNSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQ29BLUlQLUFkZHJlc3MiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIEFkZHJlc3NfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIENyZWRpdC1NYW5hZ2VtZW50LVN0YXR1cyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEwODIsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkNyZWRpdC1NYW5hZ2VtZW50LVN0YXR1cyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogQ1NHLUluZm9ybWF0aW9uLVJlcG9ydGluZyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEwNzEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkNTRy1JbmZvcm1hdGlvbi1SZXBvcnRpbmciLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKENTRy1JbmZvcm1hdGlvbi1SZXBvcnRpbmcpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJDSEFOR0VfQ1NHX0NFTEwiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiQ0hBTkdFX0NTR19TVUJTQ1JJQkVEX0hZQlJJRF9DRUxMIiwgeyAuaTMyPTEgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMyA9IHsgIkNIQU5HRV9DU0dfVU5TVUJTQ1JJQkVEX0hZQlJJRF9DRUxMIiwgeyAuaTMyPTIgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogRGVmYXVsdC1BY2Nlc3MgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyODI5LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJEZWZhdWx0LUFjY2VzcyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoRGVmYXVsdC1BY2Nlc3MpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJHUFBfR1BSUyIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJET0NTSVMiLCB7IC5pMzI9MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAieERTTCIsIHsgLmkzMj0yIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzQgPSB7ICJXaU1BWCIsIHsgLmkzMj0zIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzUgPSB7ICJHUFAyIiwgeyAuaTMyPTQgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNiA9IHsgIkdQUF9FUFMiLCB7IC5pMzI9NSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF83ID0geyAiTm9uXzNHUFBfRVBTIiwgeyAuaTMyPTYgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfOCA9IHsgIkZCQSIsIHsgLmkzMj03IH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF81LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzYsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF84LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBEZWZhdWx0LUJlYXJlci1JbmRpY2F0aW9uICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjg0NCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiRGVmYXVsdC1CZWFyZXItSW5kaWNhdGlvbiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoRGVmYXVsdC1CZWFyZXItSW5kaWNhdGlvbikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIkJJTkRfVE9fREVGX0JFQVJFUiIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJCSU5EX1RPX0FQUExJQ0FCTEVfQkVBUkVSIiwgeyAuaTMyPTEgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIERlZmF1bHQtUW9TLU5hbWUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyODE3LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJEZWZhdWx0LVFvUy1OYW1lIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBFdmVudC1UcmlnZ2VyICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTAwNiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiRXZlbnQtVHJpZ2dlciIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoRXZlbnQtVHJpZ2dlcikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIlNHU05fQ0hBTkdFIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIlFPU19DSEFOR0UiLCB7IC5pMzI9MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAiUU9TX0NIQU5HRV9FWENFRURJTkdfQVVUSE9SSVpBVElPTiIsIHsgLmkzMj0xMSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF80ID0geyAiUkFJX0NIQU5HRSIsIHsgLmkzMj0xMiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF81ID0geyAiVVNFUl9MT0NBVElPTl9DSEFOR0UiLCB7IC5pMzI9MTMgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNiA9IHsgIk5PX0VWRU5UX1RSSUdHRVJTIiwgeyAuaTMyPTE0IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzcgPSB7ICJPVVRfT0ZfQ1JFRElUIiwgeyAuaTMyPTE1IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzggPSB7ICJSRUFMTE9DQVRJT05fT0ZfQ1JFRElUIiwgeyAuaTMyPTE2IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzkgPSB7ICJSRVZBTElEQVRJT05fVElNRU9VVCIsIHsgLmkzMj0xNyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xMCA9IHsgIlVFX0lQX0FERFJFU1NfQUxMT0NBVEUiLCB7IC5pMzI9MTggfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTEgPSB7ICJVRV9JUF9BRERSRVNTX1JFTEVBU0UiLCB7IC5pMzI9MTkgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTIgPSB7ICJSQVRfQ0hBTkdFIiwgeyAuaTMyPTIgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTMgPSB7ICJERUZBVUxUX0VQU19CRUFSRVJfUU9TX0NIQU5HRSIsIHsgLmkzMj0yMCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xNCA9IHsgIkFOX0dXX0NIQU5HRSIsIHsgLmkzMj0yMSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xNSA9IHsgIlNVQ0NFU1NGVUxfUkVTT1VSQ0VfQUxMT0NBVElPTiIsIHsgLmkzMj0yMiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xNiA9IHsgIlJFU09VUkNFX01PRElGSUNBVElPTl9SRVFVRVNUIiwgeyAuaTMyPTIzIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzE3ID0geyAiUEdXX1RSQUNFX0NPTlRST0wiLCB7IC5pMzI9MjQgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTggPSB7ICJVRV9USU1FX1pPTkVfQ0hBTkdFIiwgeyAuaTMyPTI1IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzE5ID0geyAiVEFJX0NIQU5HRSIsIHsgLmkzMj0yNiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yMCA9IHsgIkVDR0lfQ0hBTkdFIiwgeyAuaTMyPTI3IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIxID0geyAiQ0hBUkdJTkdfQ09SUkVMQVRJT05fRVhDSEFOR0UiLCB7IC5pMzI9MjggfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMjIgPSB7ICJBUE5fQU1CUl9NT0RJRklDQVRJT05fRkFJTFVSRSIsIHsgLmkzMj0yOSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yMyA9IHsgIlRGVF9DSEFOR0UiLCB7IC5pMzI9MyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yNCA9IHsgIlVTRVJfQ1NHX0lORk9STUFUSU9OX0NIQU5HRSIsIHsgLmkzMj0zMCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yNSA9IHsgIlVTQUdFX1JFUE9SVCIsIHsgLmkzMj0zMyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yNiA9IHsgIkRFRkFVTFRfRVBTX0JFQVJFUl9RT1NfTU9ESUZJQ0FUSU9OX0ZBSUxVUkUiLCB7IC5pMzI9MzQgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMjcgPSB7ICJVU0VSX0NTR19IWUJSSURfU1VCU0NSSUJFRF9JTkZPUk1BVElPTl9DSEFOR0UiLCB7IC5pMzI9MzUgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMjggPSB7ICJIWUJSSURfVU5TVUJTQ1JJQkVEX0lORk9STUFUSU9OX0NIQU5HRSIsIHsgLmkzMj0zNiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yOSA9IHsgIlJPVVRJTkdfUlVMRV9DSEFOR0UiLCB7IC5pMzI9MzcgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMzAgPSB7ICJBUFBMSUNBVElPTl9TVEFSVCIsIHsgLmkzMj0zOSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zMSA9IHsgIlBMTU5fQ0hBTkdFIiwgeyAuaTMyPTQgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMzIgPSB7ICJBUFBMSUNBVElPTl9TVE9QIiwgeyAuaTMyPTQwIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMzID0geyAiQ1NfVE9fUFNfSEFORE9WRVIiLCB7IC5pMzI9NDIgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMzQgPSB7ICJVRV9MT0NBTF9JUF9BRERSRVNTX0NIQU5HRSIsIHsgLmkzMj00MyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zNSA9IHsgIk5CX0xPQ0FMX0lQX0FERFJFU1NfQ0hBTkdFIiwgeyAuaTMyPTQ0IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzM2ID0geyAiQUNDRVNTX05FVFdPUktfSU5GT19SRVBPUlQiLCB7IC5pMzI9NDUgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMzcgPSB7ICJDUkVESVRfTUFOQUdFTUVOVF9TRVNTSU9OX0ZBSUxVUkUiLCB7IC5pMzI9NDYgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMzggPSB7ICJERUZBVUxUX1FPU19DSEFOR0UiLCB7IC5pMzI9NDcgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMzkgPSB7ICJDSEFOR0VfT0ZfVUVfUFJFU0VOQ0VfSU5fUFJFU0VOQ0VfUkVQT1JUSU5HX0FSRUFfUkVQT1JUIiwgeyAuaTMyPTQ4IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzQwID0geyAiQURESVRJT05fT0ZfQUNDRVNTIiwgeyAuaTMyPTQ5IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzQxID0geyAiTE9TU19PRl9CRUFSRVIiLCB7IC5pMzI9NSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF80MiA9IHsgIlJFTU9WQUxfT0ZfQUNDRVNTIiwgeyAuaTMyPTUwIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzQzID0geyAiVU5BVkFJTEFCTElUWV9PRl9BQ0NFU1MiLCB7IC5pMzI9NTEgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNDQgPSB7ICJBVkFJTEFCTElUWV9PRl9BQ0NFU1MiLCB7IC5pMzI9NTIgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNDUgPSB7ICJSRVNPVVJDRV9SRUxFQVNFIiwgeyAuaTMyPTUzIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzQ2ID0geyAiRU5PREVCX0NIQU5HRSIsIHsgLmkzMj01NCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF80NyA9IHsgIkdQUF9QU19EQVRBX09GRl9DSEFOR0UiLCB7IC5pMzI9NTUgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNDggPSB7ICJSRUNPVkVSWV9PRl9CRUFSRVIiLCB7IC5pMzI9NiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF80OSA9IHsgIklQX0NBTl9DSEFOR0UiLCB7IC5pMzI9NyB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzQsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF82LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzcsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfOCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF85LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEwLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzExLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEyLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEzLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzE0LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzE1LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzE2LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzE3LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzE4LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzE5LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIwLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIxLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIyLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIzLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzI0LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzI1LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzI2LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzI3LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzI4LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzI5LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMwLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMxLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMyLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMzLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzM0LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzM1LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzM2LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzM3LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzM4LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzM5LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzQwLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzQxLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzQyLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzQzLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzQ0LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzQ1LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzQ2LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzQ3LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzQ4LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzQ5LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBFeGVjdXRpb24tVGltZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTI4MzksCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkV4ZWN1dGlvbi1UaW1lIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBUaW1lX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBGbG93LURpcmVjdGlvbiAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEwODAsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkZsb3ctRGlyZWN0aW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChGbG93LURpcmVjdGlvbikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIlVOU1BFQ0lGSUVEIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIkRPV05MSU5LIiwgeyAuaTMyPTEgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMyA9IHsgIlVQTElOSyIsIHsgLmkzMj0yIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzQgPSB7ICJCSURJUkVDVElPTkFMIiwgeyAuaTMyPTMgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF80LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBGbG93LUxhYmVsICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTA1NywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiRmxvdy1MYWJlbCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIEd1YXJhbnRlZWQtQml0cmF0ZS1ETCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEwMjUsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkd1YXJhbnRlZWQtQml0cmF0ZS1ETCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogR3VhcmFudGVlZC1CaXRyYXRlLVVMICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTAyNiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiR3VhcmFudGVlZC1CaXRyYXRlLVVMIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBIZU5CLUxvY2FsLUlQLUFkZHJlc3MgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyODA0LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJIZU5CLUxvY2FsLUlQLUFkZHJlc3MiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIEFkZHJlc3NfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIElQLUNBTi1TZXNzaW9uLUNoYXJnaW5nLVNjb3BlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjgyNywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiSVAtQ0FOLVNlc3Npb24tQ2hhcmdpbmctU2NvcGUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKElQLUNBTi1TZXNzaW9uLUNoYXJnaW5nLVNjb3BlKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiSVBfQ0FOX1NFU1NJT05fU0NPUEUiLCB7IC5pMzI9MCB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIElQLUNBTi1UeXBlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTAyNywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiSVAtQ0FOLVR5cGUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKElQLUNBTi1UeXBlKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiR1BQX0dQUlMiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiRE9DU0lTIiwgeyAuaTMyPTEgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMyA9IHsgInhEU0wiLCB7IC5pMzI9MiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF80ID0geyAiV2lNQVgiLCB7IC5pMzI9MyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF81ID0geyAiR1BQMiIsIHsgLmkzMj00IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzYgPSB7ICJHUFBfRVBTIiwgeyAuaTMyPTUgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNyA9IHsgIk5vbl8zR1BQX0VQUyIsIHsgLmkzMj02IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzggPSB7ICJGQkEiLCB7IC5pMzI9NyB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzQsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF82LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzcsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfOCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogTWV0ZXJpbmctTWV0aG9kICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTAwNywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTWV0ZXJpbmctTWV0aG9kIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChNZXRlcmluZy1NZXRob2QpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJEVVJBVElPTiIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJWT0xVTUUiLCB7IC5pMzI9MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAiRFVSQVRJT05fVk9MVU1FIiwgeyAuaTMyPTIgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNCA9IHsgIkVWRU5UIiwgeyAuaTMyPTMgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF80LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBNb25pdG9yaW5nLUZsYWdzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjgyOCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTW9uaXRvcmluZy1GbGFncyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogTW9uaXRvcmluZy1LZXkgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMDY2LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJNb25pdG9yaW5nLUtleSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIE11dGUtTm90aWZpY2F0aW9uICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjgwOSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTXV0ZS1Ob3RpZmljYXRpb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKE11dGUtTm90aWZpY2F0aW9uKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiTVVURV9SRVFVSVJFRCIsIHsgLmkzMj0wIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogTW9uaXRvcmluZy1UaW1lICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjgxMCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTW9uaXRvcmluZy1UaW1lIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBUaW1lX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBOQklGT00tTW9kZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTI4MzAsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk5CSUZPTS1Nb2RlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChOQklGT00tTW9kZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIlVFX0lOSVRJQVRFRCIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJORVRXT1JLX0lOSVRJQVRFRCIsIHsgLmkzMj0xIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBOQklGT00tU3VwcG9ydCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTI4MzEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk5CSUZPTS1TdXBwb3J0IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChOQklGT00tU3VwcG9ydCkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIk5CSUZPTV9OT1RfU1VQUE9SVEVEIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIk5CSUZPTV9TVVBQT1JURUQiLCB7IC5pMzI9MSB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogTmV0TG9jLUFjY2Vzcy1TdXBwb3J0ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjgyNCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTmV0TG9jLUFjY2Vzcy1TdXBwb3J0IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBOZXR3b3JrLVJlcXVlc3QtU3VwcG9ydCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEwMjQsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk5ldHdvcmstUmVxdWVzdC1TdXBwb3J0IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChOZXR3b3JrLVJlcXVlc3QtU3VwcG9ydCkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIk5FVFdPUktfUkVRVUVTVF9OT1RfU1VQUE9SVEVEIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIk5FVFdPUktfUkVRVUVTVF9TVVBQT1JURUQiLCB7IC5pMzI9MSB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogT2ZmbGluZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEwMDgsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk9mZmxpbmUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKE9mZmxpbmUpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJESVNBQkxFX09GRkxJTkUiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiRU5BQkxFX09GRkxJTkUiLCB7IC5pMzI9MSB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogT25saW5lICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTAwOSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiT25saW5lIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChPbmxpbmUpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJESVNBQkxFX09OTElORSIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJFTkFCTEVfT05MSU5FIiwgeyAuaTMyPTEgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFBhY2tldC1GaWx0ZXItQ29udGVudCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEwNTksCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlBhY2tldC1GaWx0ZXItQ29udGVudCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgSVBGaWx0ZXJSdWxlX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBQYWNrZXQtRmlsdGVyLUlkZW50aWZpZXIgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMDYwLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJQYWNrZXQtRmlsdGVyLUlkZW50aWZpZXIiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBQYWNrZXQtRmlsdGVyLU9wZXJhdGlvbiAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEwNjIsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlBhY2tldC1GaWx0ZXItT3BlcmF0aW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChQYWNrZXQtRmlsdGVyLU9wZXJhdGlvbikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIkRFTEVUSU9OIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIkFERElUSU9OIiwgeyAuaTMyPTEgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMyA9IHsgIk1PRElGSUNBVElPTiIsIHsgLmkzMj0yIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFBhY2tldC1GaWx0ZXItVXNhZ2UgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMDcyLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJQYWNrZXQtRmlsdGVyLVVzYWdlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChQYWNrZXQtRmlsdGVyLVVzYWdlKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiU0VORF9UT19VRSIsIHsgLmkzMj0xIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogUENDLVJ1bGUtU3RhdHVzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTAxOSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUENDLVJ1bGUtU3RhdHVzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChQQ0MtUnVsZS1TdGF0dXMpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJBQ1RJVkUiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiSU5BQ1RJVkUiLCB7IC5pMzI9MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAiVEVNUE9SQVJJTFlfSU5BQ1RJVkUiLCB7IC5pMzI9MiB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBQRE4tQ29ubmVjdGlvbi1JRCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEwNjUsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlBETi1Db25uZWN0aW9uLUlEIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogUHJlY2VkZW5jZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEwMTAsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlByZWNlZGVuY2UiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFByZS1lbXB0aW9uLUNhcGFiaWxpdHkgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMDQ3LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJQcmUtZW1wdGlvbi1DYXBhYmlsaXR5IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChQcmUtZW1wdGlvbi1DYXBhYmlsaXR5KSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiUFJFX0VNUFRJT05fQ0FQQUJJTElUWV9FTkFCTEVEIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIlBSRV9FTVBUSU9OX0NBUEFCSUxJVFlfRElTQUJMRUQiLCB7IC5pMzI9MSB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogUHJlLWVtcHRpb24tVnVsbmVyYWJpbGl0eSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEwNDgsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlByZS1lbXB0aW9uLVZ1bG5lcmFiaWxpdHkiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFByZS1lbXB0aW9uLVZ1bG5lcmFiaWxpdHkpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJQUkVfRU1QVElPTl9WVUxORVJBQklMSVRZX0VOQUJMRUQiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiUFJFX0VNUFRJT05fVlVMTkVSQUJJTElUWV9ESVNBQkxFRCIsIHsgLmkzMj0xIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBQcmVzZW5jZS1SZXBvcnRpbmctQXJlYS1FbGVtZW50cy1MaXN0ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjgyMCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUHJlc2VuY2UtUmVwb3J0aW5nLUFyZWEtRWxlbWVudHMtTGlzdCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFByZXNlbmNlLVJlcG9ydGluZy1BcmVhLUlkZW50aWZpZXIgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyODIxLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJQcmVzZW5jZS1SZXBvcnRpbmctQXJlYS1JZGVudGlmaWVyIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogUHJlc2VuY2UtUmVwb3J0aW5nLUFyZWEtU3RhdHVzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjgyMywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUHJlc2VuY2UtUmVwb3J0aW5nLUFyZWEtU3RhdHVzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBQcmlvcml0eS1MZXZlbCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEwNDYsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlByaW9yaXR5LUxldmVsIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBQUy10by1DUy1TZXNzaW9uLUNvbnRpbnVpdHkgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMDk5LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJQUy10by1DUy1TZXNzaW9uLUNvbnRpbnVpdHkiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFBTLXRvLUNTLVNlc3Npb24tQ29udGludWl0eSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIlZJREVPX1BTMkNTX0NPTlRfQ0FORElEQVRFIiwgeyAuaTMyPTAgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBRb1MtQ2xhc3MtSWRlbnRpZmllciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEwMjgsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlFvUy1DbGFzcy1JZGVudGlmaWVyIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChRb1MtQ2xhc3MtSWRlbnRpZmllcikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIlFDSV8xIiwgeyAuaTMyPTEgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIlFDSV8yIiwgeyAuaTMyPTIgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMyA9IHsgIlFDSV8zIiwgeyAuaTMyPTMgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNCA9IHsgIlFDSV80IiwgeyAuaTMyPTQgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNSA9IHsgIlFDSV81IiwgeyAuaTMyPTUgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNiA9IHsgIlFDSV82IiwgeyAuaTMyPTYgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNyA9IHsgIlFDSV82NSIsIHsgLmkzMj02NSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF84ID0geyAiUUNJXzY2IiwgeyAuaTMyPTY2IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzkgPSB7ICJRQ0lfNjkiLCB7IC5pMzI9NjkgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTAgPSB7ICJRQ0lfNyIsIHsgLmkzMj03IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzExID0geyAiUUNJXzcwIiwgeyAuaTMyPTcwIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEyID0geyAiUUNJXzc1IiwgeyAuaTMyPTc1IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEzID0geyAiUUNJXzc5IiwgeyAuaTMyPTc5IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzE0ID0geyAiUUNJXzgiLCB7IC5pMzI9OCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xNSA9IHsgIlFDSV85IiwgeyAuaTMyPTkgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF80LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzUsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF83LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzgsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfOSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xNCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xNSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogUW9TLU5lZ290aWF0aW9uICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTAyOSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUW9TLU5lZ290aWF0aW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChRb1MtTmVnb3RpYXRpb24pIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJOT19Rb1NfTkVHT1RJQVRJT04iLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiUW9TX05FR09USUFUSU9OX1NVUFBPUlRFRCIsIHsgLmkzMj0xIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBRb1MtVXBncmFkZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEwMzAsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlFvUy1VcGdyYWRlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChRb1MtVXBncmFkZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIlFvU19VUEdSQURFX05PVF9TVVBQT1JURUQiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiUW9TX1VQR1JBREVfU1VQUE9SVEVEIiwgeyAuaTMyPTEgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFJBTi1OQVMtUmVsZWFzZS1DYXVzZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTI4MTksCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlJBTi1OQVMtUmVsZWFzZS1DYXVzZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFJBTi1SdWxlLVN1cHBvcnQgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyODMyLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJSQU4tUnVsZS1TdXBwb3J0IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBSQVQtVHlwZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEwMzIsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlJBVC1UeXBlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChSQVQtVHlwZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIldMQU4iLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiVklSVFVBTCIsIHsgLmkzMj0xIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBSZWRpcmVjdC1TdXBwb3J0ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTA4NiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUmVkaXJlY3QtU3VwcG9ydCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoUmVkaXJlY3QtU3VwcG9ydCkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIlJFRElSRUNUSU9OX0RJU0FCTEVEIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIlJFRElSRUNUSU9OX0VOQUJMRUQiLCB7IC5pMzI9MSB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogUmVtb3ZhbC1PZi1BY2Nlc3MgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyODQyLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJSZW1vdmFsLU9mLUFjY2VzcyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoUmVtb3ZhbC1PZi1BY2Nlc3MpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJSRU1PVkFMX09GX0FDQ0VTUyIsIHsgLmkzMj0wIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogUmVwb3J0aW5nLUxldmVsICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTAxMSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUmVwb3J0aW5nLUxldmVsIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChSZXBvcnRpbmctTGV2ZWwpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJTRVJWSUNFX0lERU5USUZJRVJfTEVWRUwiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiUkFUSU5HX0dST1VQX0xFVkVMIiwgeyAuaTMyPTEgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMyA9IHsgIlNQT05TT1JFRF9DT05ORUNUSVZJVFlfTEVWRUwiLCB7IC5pMzI9MiB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBSZXNvdXJjZS1BbGxvY2F0aW9uLU5vdGlmaWNhdGlvbiAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEwNjMsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlJlc291cmNlLUFsbG9jYXRpb24tTm90aWZpY2F0aW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChSZXNvdXJjZS1BbGxvY2F0aW9uLU5vdGlmaWNhdGlvbikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIkVOQUJMRV9OT1RJRklDQVRJT04iLCB7IC5pMzI9MCB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFJlc291cmNlLVJlbGVhc2UtTm90aWZpY2F0aW9uICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjg0MSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUmVzb3VyY2UtUmVsZWFzZS1Ob3RpZmljYXRpb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFJlc291cmNlLVJlbGVhc2UtTm90aWZpY2F0aW9uKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiRU5BQkxFX05PVElGSUNBVElPTiIsIHsgLmkzMj0wIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogUmV2YWxpZGF0aW9uLVRpbWUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMDQyLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJSZXZhbGlkYXRpb24tVGltZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVGltZV90eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogUm91dGluZy1JUC1BZGRyZXNzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTA3OSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUm91dGluZy1JUC1BZGRyZXNzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBBZGRyZXNzX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBSb3V0aW5nLVJ1bGUtSWRlbnRpZmllciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEwNzcsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlJvdXRpbmctUnVsZS1JZGVudGlmaWVyIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogUm91dGluZy1SdWxlLUZhaWx1cmUtQ29kZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTI4MzQsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlJvdXRpbmctUnVsZS1GYWlsdXJlLUNvZGUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFJ1bGUtQWN0aXZhdGlvbi1UaW1lICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTA0MywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUnVsZS1BY3RpdmF0aW9uLVRpbWUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFRpbWVfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFJ1bGUtRGVhY3RpdmF0aW9uLVRpbWUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMDQ0LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJSdWxlLURlYWN0aXZhdGlvbi1UaW1lIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBUaW1lX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBSdWxlLUZhaWx1cmUtQ29kZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEwMzEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlJ1bGUtRmFpbHVyZS1Db2RlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChSdWxlLUZhaWx1cmUtQ29kZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIlVOS05PV05fUlVMRV9OQU1FIiwgeyAuaTMyPTEgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIlJFU09VUkNFX0FMTE9DQVRJT05fRkFJTFVSRSIsIHsgLmkzMj0xMCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAiVU5TVUNDRVNTRlVMX1FPU19WQUxJREFUSU9OIiwgeyAuaTMyPTExIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzQgPSB7ICJJTkNPUlJFQ1RfRkxPV19JTkZPUk1BVElPTiIsIHsgLmkzMj0xMiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF81ID0geyAiUFNfVE9fQ1NfSEFORE9WRVIiLCB7IC5pMzI9MTMgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNiA9IHsgIlRERl9BUFBMSUNBVElPTl9JREVOVElGSUVSX0VSUk9SIiwgeyAuaTMyPTE0IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzcgPSB7ICJOT19CRUFSRVJfQk9VTkQiLCB7IC5pMzI9MTUgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfOCA9IHsgIkZJTFRFUl9SRVNUUklDVElPTlMiLCB7IC5pMzI9MTYgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfOSA9IHsgIkFOX0dXX0ZBSUxFRCIsIHsgLmkzMj0xNyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xMCA9IHsgIk1JU1NJTkdfUkVESVJFQ1RfU0VSVkVSX0FERFJFU1MiLCB7IC5pMzI9MTggfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTEgPSB7ICJDTV9FTkRfVVNFUl9TRVJWSUNFX0RFTklFRCIsIHsgLmkzMj0xOSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xMiA9IHsgIlJBVElOR19HUk9VUF9FUlJPUiIsIHsgLmkzMj0yIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEzID0geyAiQ01fQ1JFRElUX0NPTlRST0xfTk9UX0FQUExJQ0FCTEUiLCB7IC5pMzI9MjAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTQgPSB7ICJDTV9BVVRIT1JJWkFUSU9OX1JFSkVDVEVEIiwgeyAuaTMyPTIxIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzE1ID0geyAiQ01fVVNFUl9VTktOT1dOIiwgeyAuaTMyPTIyIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzE2ID0geyAiQ01fUkFUSU5HX0ZBSUxFRCIsIHsgLmkzMj0yMyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xNyA9IHsgIlJPVVRJTkdfUlVMRV9SRUpFQ1RJT04iLCB7IC5pMzI9MjQgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTggPSB7ICJOT19OQklGT01fU1VQUE9SVCIsIHsgLmkzMj0yNSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xOSA9IHsgIlNFUlZJQ0VfSURFTlRJRklFUl9FUlJPUiIsIHsgLmkzMj0zIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIwID0geyAiR1dfUENFRl9NQUxGVU5DVElPTiIsIHsgLmkzMj00IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIxID0geyAiUkVTT1VSQ0VTX0xJTUlUQVRJT04iLCB7IC5pMzI9NSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yMiA9IHsgIk1BWF9OUl9CRUFSRVJTX1JFQUNIRUQiLCB7IC5pMzI9NiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yMyA9IHsgIlVOS05PV05fQkVBUkVSX0lEIiwgeyAuaTMyPTcgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMjQgPSB7ICJNSVNTSU5HX0JFQVJFUl9JRCIsIHsgLmkzMj04IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzI1ID0geyAiTUlTU0lOR19GTE9XX0lORk9STUFUSU9OIiwgeyAuaTMyPTkgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF80LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzUsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF83LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzgsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfOSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xNCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xNSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xNiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xNywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xOCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xOSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yMCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yNCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yNSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogU2VjdXJpdHktUGFyYW1ldGVyLUluZGV4ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTA1NiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiU2VjdXJpdHktUGFyYW1ldGVyLUluZGV4IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogU2Vzc2lvbi1SZWxlYXNlLUNhdXNlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTA0NSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiU2Vzc2lvbi1SZWxlYXNlLUNhdXNlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChTZXNzaW9uLVJlbGVhc2UtQ2F1c2UpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJVTlNQRUNJRklFRF9SRUFTT04iLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiVUVfU1VCU0NSSVBUSU9OX1JFQVNPTiIsIHsgLmkzMj0xIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMgPSB7ICJJTlNVRkZJQ0lFTlRfU0VSVkVSX1JFU09VUkNFUyIsIHsgLmkzMj0yIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzQgPSB7ICJJUF9DQU5fU0VTU0lPTl9URVJNSU5BVElPTiIsIHsgLmkzMj0zIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzUgPSB7ICJVRV9JUF9BRERSRVNTX1JFTEVBU0UiLCB7IC5pMzI9NCB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzQsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogVENQLVNvdXJjZS1Qb3J0ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjg0MywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiVENQLVNvdXJjZS1Qb3J0IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBUREYtQXBwbGljYXRpb24tSWRlbnRpZmllciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEwODgsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlRERi1BcHBsaWNhdGlvbi1JZGVudGlmaWVyIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogVERGLUFwcGxpY2F0aW9uLUluc3RhbmNlLUlkZW50aWZpZXIgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyODAyLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJUREYtQXBwbGljYXRpb24tSW5zdGFuY2UtSWRlbnRpZmllciIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFRERi1EZXN0aW5hdGlvbi1Ib3N0ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTA4OSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiVERGLURlc3RpbmF0aW9uLUhvc3QiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIERpYW1ldGVySWRlbnRpdHlfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFRERi1EZXN0aW5hdGlvbi1SZWFsbSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEwOTAsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlRERi1EZXN0aW5hdGlvbi1SZWFsbSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgRGlhbWV0ZXJJZGVudGl0eV90eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogVERGLUlQLUFkZHJlc3MgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMDkxLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJUREYtSVAtQWRkcmVzcyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgQWRkcmVzc190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogVEZULUZpbHRlciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEwMTIsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlRGVC1GaWx0ZXIiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIElQRmlsdGVyUnVsZV90eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogVHJhZmZpYy1TdGVlcmluZy1Qb2xpY3ktSWRlbnRpZmllci1ETCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTI4MzYsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlRyYWZmaWMtU3RlZXJpbmctUG9saWN5LUlkZW50aWZpZXItREwiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBUcmFmZmljLVN0ZWVyaW5nLVBvbGljeS1JZGVudGlmaWVyLVVMICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjgzNywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiVHJhZmZpYy1TdGVlcmluZy1Qb2xpY3ktSWRlbnRpZmllci1VTCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFRvUy1UcmFmZmljLUNsYXNzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTAxNCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiVG9TLVRyYWZmaWMtQ2xhc3MiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBUdW5uZWwtSGVhZGVyLUZpbHRlciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEwMzYsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlR1bm5lbC1IZWFkZXItRmlsdGVyIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBJUEZpbHRlclJ1bGVfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFR1bm5lbC1IZWFkZXItTGVuZ3RoICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTAzNywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiVHVubmVsLUhlYWRlci1MZW5ndGgiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFVEUC1Tb3VyY2UtUG9ydCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTI4MDYsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlVEUC1Tb3VyY2UtUG9ydCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogVUUtTG9jYWwtSVAtQWRkcmVzcyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTI4MDUsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlVFLUxvY2FsLUlQLUFkZHJlc3MiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIEFkZHJlc3NfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFVzYWdlLU1vbml0b3JpbmctTGV2ZWwgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMDY4LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJVc2FnZS1Nb25pdG9yaW5nLUxldmVsIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChVc2FnZS1Nb25pdG9yaW5nLUxldmVsKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiU0VTU0lPTl9MRVZFTCIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJQQ0NfUlVMRV9MRVZFTCIsIHsgLmkzMj0xIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMgPSB7ICJBRENfUlVMRV9MRVZFTCIsIHsgLmkzMj0yIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFVzYWdlLU1vbml0b3JpbmctUmVwb3J0ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTA2OSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiVXNhZ2UtTW9uaXRvcmluZy1SZXBvcnQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFVzYWdlLU1vbml0b3JpbmctUmVwb3J0KSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiVVNBR0VfTU9OSVRPUklOR19SRVBPUlRfUkVRVUlSRUQiLCB7IC5pMzI9MCB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFVzYWdlLU1vbml0b3JpbmctU3VwcG9ydCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEwNzAsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlVzYWdlLU1vbml0b3JpbmctU3VwcG9ydCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoVXNhZ2UtTW9uaXRvcmluZy1TdXBwb3J0KSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiVVNBR0VfTU9OSVRPUklOR19ESVNBQkxFRCIsIHsgLmkzMj0wIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogVXNlci1Mb2NhdGlvbi1JbmZvLVRpbWUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyODEyLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJVc2VyLUxvY2F0aW9uLUluZm8tVGltZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVGltZV90eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogUENTQ0YtUmVzdG9yYXRpb24tSW5kaWNhdGlvbiAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTI4MjYsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlBDU0NGLVJlc3RvcmF0aW9uLUluZGljYXRpb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFFvUy1SdWxlLU5hbWUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMDU0LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJRb1MtUnVsZS1OYW1lIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogUW9TLVJ1bGUtQmFzZS1OYW1lICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTA3NCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUW9TLVJ1bGUtQmFzZS1OYW1lIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBTZXNzaW9uLUxpbmtpbmctSW5kaWNhdG9yICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTA2NCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiU2Vzc2lvbi1MaW5raW5nLUluZGljYXRvciIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoU2Vzc2lvbi1MaW5raW5nLUluZGljYXRvcikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIlVFX09OTFkiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiUkVTRVJWRUQiLCB7IC5pMzI9MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAiVUVfTlciLCB7IC5pMzI9MiB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBBREMtUnVsZS1CYXNlLU5hbWUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMDk1LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJBREMtUnVsZS1CYXNlLU5hbWUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIEFEQy1SdWxlLU5hbWUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMDk2LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJBREMtUnVsZS1OYW1lIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogUmVxdWVzdC1UeXBlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjgzOCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUmVxdWVzdC1UeXBlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBDUy1TZXJ2aWNlLVFvUy1SZXF1ZXN0LUlkZW50aWZpZXIgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyODA3LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJDUy1TZXJ2aWNlLVFvUy1SZXF1ZXN0LUlkZW50aWZpZXIiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBDUy1TZXJ2aWNlLVFvUy1SZXF1ZXN0LU9wZXJhdGlvbiAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTI4MDgsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkNTLVNlcnZpY2UtUW9TLVJlcXVlc3QtT3BlcmF0aW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChDUy1TZXJ2aWNlLVFvUy1SZXF1ZXN0LU9wZXJhdGlvbikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIkRFTEVUSU9OIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIk1PRElGSUNBVElPTiIsIHsgLmkzMj0xIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBDUy1TZXJ2aWNlLVJlc291cmNlLUZhaWx1cmUtQ2F1c2UgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyODE0LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJDUy1TZXJ2aWNlLVJlc291cmNlLUZhaWx1cmUtQ2F1c2UiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKENTLVNlcnZpY2UtUmVzb3VyY2UtRmFpbHVyZS1DYXVzZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIlJFU09VUkNFX1JFTEVBU0VEIiwgeyAuaTMyPTAgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBDUy1TZXJ2aWNlLVJlc291cmNlLVJlc3VsdC1PcGVyYXRpb24gKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyODE1LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJDUy1TZXJ2aWNlLVJlc291cmNlLVJlc3VsdC1PcGVyYXRpb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKENTLVNlcnZpY2UtUmVzb3VyY2UtUmVzdWx0LU9wZXJhdGlvbikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIkRFTEVUSU9OIiwgeyAuaTMyPTAgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBDaGFyZ2luZy1SdWxlLVJlbW92ZSAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEwMDIsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkNoYXJnaW5nLVJ1bGUtUmVtb3ZlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBRb1MtUnVsZS1SZXBvcnQgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMDU1LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJRb1MtUnVsZS1SZXBvcnQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIFJlZGlyZWN0LUluZm9ybWF0aW9uICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTA4NSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUmVkaXJlY3QtSW5mb3JtYXRpb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIFBSQS1SZW1vdmUgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyODQ2LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJQUkEtUmVtb3ZlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBGbG93LUluZm9ybWF0aW9uICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTA1OCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiRmxvdy1JbmZvcm1hdGlvbiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogVHVubmVsLUluZm9ybWF0aW9uICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTAzOCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiVHVubmVsLUluZm9ybWF0aW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBUREYtSW5mb3JtYXRpb24gKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMDg3LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJUREYtSW5mb3JtYXRpb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIFJvdXRpbmctUnVsZS1SZW1vdmUgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMDc1LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJSb3V0aW5nLVJ1bGUtUmVtb3ZlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBDUy1TZXJ2aWNlLVJlc291cmNlLVJlcG9ydCAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTI4MTMsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkNTLVNlcnZpY2UtUmVzb3VyY2UtUmVwb3J0IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBQcmVzZW5jZS1SZXBvcnRpbmctQXJlYS1JbmZvcm1hdGlvbiAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTI4MjIsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlByZXNlbmNlLVJlcG9ydGluZy1BcmVhLUluZm9ybWF0aW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBDb25kaXRpb25hbC1BUE4tQWdncmVnYXRlLU1heC1CaXRyYXRlICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjgxOCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQ29uZGl0aW9uYWwtQVBOLUFnZ3JlZ2F0ZS1NYXgtQml0cmF0ZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogQWNjZXNzLU5ldHdvcmstQ2hhcmdpbmctSWRlbnRpZmllci1HeCAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEwMjIsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkFjY2Vzcy1OZXR3b3JrLUNoYXJnaW5nLUlkZW50aWZpZXItR3giLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIEFsbG9jYXRpb24tUmV0ZW50aW9uLVByaW9yaXR5ICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTAzNCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQWxsb2NhdGlvbi1SZXRlbnRpb24tUHJpb3JpdHkiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIFFvUy1SdWxlLVJlbW92ZSAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEwNTIsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlFvUy1SdWxlLVJlbW92ZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogUm91dGluZy1SdWxlLVJlcG9ydCAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTI4MzUsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlJvdXRpbmctUnVsZS1SZXBvcnQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIFRGVC1QYWNrZXQtRmlsdGVyLUluZm9ybWF0aW9uICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTAxMywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiVEZULVBhY2tldC1GaWx0ZXItSW5mb3JtYXRpb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIEZpeGVkLVVzZXItTG9jYXRpb24tSW5mbyAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTI4MjUsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkZpeGVkLVVzZXItTG9jYXRpb24tSW5mbyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogRGVmYXVsdC1Rb1MtSW5mb3JtYXRpb24gKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyODE2LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJEZWZhdWx0LVFvUy1JbmZvcm1hdGlvbiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogUGFja2V0LUZpbHRlci1JbmZvcm1hdGlvbiAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEwNjEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlBhY2tldC1GaWx0ZXItSW5mb3JtYXRpb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIFJvdXRpbmctRmlsdGVyICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTA3OCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUm91dGluZy1GaWx0ZXIiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIEFEQy1SdWxlLVJlbW92ZSAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEwOTMsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkFEQy1SdWxlLVJlbW92ZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogUW9TLUluZm9ybWF0aW9uICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTAxNiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUW9TLUluZm9ybWF0aW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBQUkEtSW5zdGFsbCAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTI4NDUsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlBSQS1JbnN0YWxsIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBSb3V0aW5nLVJ1bGUtRGVmaW5pdGlvbiAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEwNzYsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlJvdXRpbmctUnVsZS1EZWZpbml0aW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBEZWZhdWx0LUVQUy1CZWFyZXItUW9TICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTA0OSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiRGVmYXVsdC1FUFMtQmVhcmVyLVFvUyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogQ29BLUluZm9ybWF0aW9uICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTAzOSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQ29BLUluZm9ybWF0aW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBBcHBsaWNhdGlvbi1EZXRlY3Rpb24tSW5mb3JtYXRpb24gKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMDk4LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJBcHBsaWNhdGlvbi1EZXRlY3Rpb24tSW5mb3JtYXRpb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIENvbmRpdGlvbmFsLVBvbGljeS1JbmZvcm1hdGlvbiAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTI4NDAsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkNvbmRpdGlvbmFsLVBvbGljeS1JbmZvcm1hdGlvbiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogQ2hhcmdpbmctUnVsZS1EZWZpbml0aW9uICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTAwMywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQ2hhcmdpbmctUnVsZS1EZWZpbml0aW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBSb3V0aW5nLVJ1bGUtSW5zdGFsbCAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEwODEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlJvdXRpbmctUnVsZS1JbnN0YWxsIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBBREMtUnVsZS1EZWZpbml0aW9uICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTA5NCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQURDLVJ1bGUtRGVmaW5pdGlvbiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogQURDLVJ1bGUtUmVwb3J0ICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTA5NywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQURDLVJ1bGUtUmVwb3J0IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBRb1MtUnVsZS1EZWZpbml0aW9uICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTA1MywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUW9TLVJ1bGUtRGVmaW5pdGlvbiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogQ2hhcmdpbmctUnVsZS1SZXBvcnQgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMDE4LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJDaGFyZ2luZy1SdWxlLVJlcG9ydCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogRXZlbnQtUmVwb3J0LUluZGljYXRpb24gKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMDMzLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJFdmVudC1SZXBvcnQtSW5kaWNhdGlvbiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogQ2hhcmdpbmctUnVsZS1JbnN0YWxsICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTAwMSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQ2hhcmdpbmctUnVsZS1JbnN0YWxsIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBRb1MtUnVsZS1JbnN0YWxsICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTA1MSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUW9TLVJ1bGUtSW5zdGFsbCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogQURDLVJ1bGUtSW5zdGFsbCAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEwOTIsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkFEQy1SdWxlLUluc3RhbGwiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIFVzYWdlLU1vbml0b3JpbmctSW5mb3JtYXRpb24gKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMDY3LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJVc2FnZS1Nb25pdG9yaW5nLUluZm9ybWF0aW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCisJCisgICB9CisKKyAgIC8qIENvbW1hbmRzIHNlY3Rpb24gKi8KKyAgIHsKKworICAgfQorCisgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkaWN0X3RzMjkyMTJfYXZwc19sb2FkX3J1bGVzKGNoYXIgKiBjb25mZmlsZSkKK3sKKyAgIC8qIEdyb3VwZWQgQVZQIHNlY3Rpb24gKi8KKyAgIHsKKwkgIC8qIENoYXJnaW5nLVJ1bGUtUmVtb3ZlICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDaGFyZ2luZy1SdWxlLVJlbW92ZSJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ2hhcmdpbmctUnVsZS1OYW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDaGFyZ2luZy1SdWxlLUJhc2UtTmFtZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUmVxdWlyZWQtQWNjZXNzLUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJlc291cmNlLVJlbGVhc2UtTm90aWZpY2F0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogUW9TLVJ1bGUtUmVwb3J0ICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJRb1MtUnVsZS1SZXBvcnQifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlFvUy1SdWxlLU5hbWUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlFvUy1SdWxlLUJhc2UtTmFtZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUENDLVJ1bGUtU3RhdHVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJSdWxlLUZhaWx1cmUtQ29kZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ29udGVudC1WZXJzaW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogUmVkaXJlY3QtSW5mb3JtYXRpb24gKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJlZGlyZWN0LUluZm9ybWF0aW9uIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJSZWRpcmVjdC1TdXBwb3J0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJlZGlyZWN0LUFkZHJlc3MtVHlwZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSZWRpcmVjdC1TZXJ2ZXItQWRkcmVzcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIFBSQS1SZW1vdmUgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlBSQS1SZW1vdmUifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlByZXNlbmNlLVJlcG9ydGluZy1BcmVhLUlkZW50aWZpZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBGbG93LUluZm9ybWF0aW9uICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJGbG93LUluZm9ybWF0aW9uIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJGbG93LURlc2NyaXB0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQYWNrZXQtRmlsdGVyLUlkZW50aWZpZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlBhY2tldC1GaWx0ZXItVXNhZ2UifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlRvUy1UcmFmZmljLUNsYXNzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTZWN1cml0eS1QYXJhbWV0ZXItSW5kZXgifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkZsb3ctTGFiZWwifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkZsb3ctRGlyZWN0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJSb3V0aW5nLVJ1bGUtSWRlbnRpZmllciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIFR1bm5lbC1JbmZvcm1hdGlvbiAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVHVubmVsLUluZm9ybWF0aW9uIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUdW5uZWwtSGVhZGVyLUxlbmd0aCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIFRERi1JbmZvcm1hdGlvbiAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVERGLUluZm9ybWF0aW9uIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUREYtRGVzdGluYXRpb24tUmVhbG0ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlRERi1EZXN0aW5hdGlvbi1Ib3N0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUREYtSVAtQWRkcmVzcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIFJvdXRpbmctUnVsZS1SZW1vdmUgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJvdXRpbmctUnVsZS1SZW1vdmUifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJvdXRpbmctUnVsZS1JZGVudGlmaWVyIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogQ1MtU2VydmljZS1SZXNvdXJjZS1SZXBvcnQgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNTLVNlcnZpY2UtUmVzb3VyY2UtUmVwb3J0In07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDUy1TZXJ2aWNlLVFvUy1SZXF1ZXN0LUlkZW50aWZpZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNTLVNlcnZpY2UtUmVzb3VyY2UtUmVzdWx0LU9wZXJhdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ1MtU2VydmljZS1SZXNvdXJjZS1GYWlsdXJlLUNhdXNlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogUHJlc2VuY2UtUmVwb3J0aW5nLUFyZWEtSW5mb3JtYXRpb24gKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlByZXNlbmNlLVJlcG9ydGluZy1BcmVhLUluZm9ybWF0aW9uIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQcmVzZW5jZS1SZXBvcnRpbmctQXJlYS1JZGVudGlmaWVyIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQcmVzZW5jZS1SZXBvcnRpbmctQXJlYS1TdGF0dXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlByZXNlbmNlLVJlcG9ydGluZy1BcmVhLUVsZW1lbnRzLUxpc3QifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBDb25kaXRpb25hbC1BUE4tQWdncmVnYXRlLU1heC1CaXRyYXRlICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDb25kaXRpb25hbC1BUE4tQWdncmVnYXRlLU1heC1CaXRyYXRlIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBUE4tQWdncmVnYXRlLU1heC1CaXRyYXRlLVVMIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBUE4tQWdncmVnYXRlLU1heC1CaXRyYXRlLURMIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJJUC1DQU4tVHlwZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUkFULVR5cGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBBY2Nlc3MtTmV0d29yay1DaGFyZ2luZy1JZGVudGlmaWVyLUd4ICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBY2Nlc3MtTmV0d29yay1DaGFyZ2luZy1JZGVudGlmaWVyLUd4In07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBY2Nlc3MtTmV0d29yay1DaGFyZ2luZy1JZGVudGlmaWVyLVZhbHVlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDaGFyZ2luZy1SdWxlLUJhc2UtTmFtZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ2hhcmdpbmctUnVsZS1OYW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJJUC1DQU4tU2Vzc2lvbi1DaGFyZ2luZy1TY29wZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIEFsbG9jYXRpb24tUmV0ZW50aW9uLVByaW9yaXR5ICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBbGxvY2F0aW9uLVJldGVudGlvbi1Qcmlvcml0eSJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUHJpb3JpdHktTGV2ZWwifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlByZS1lbXB0aW9uLUNhcGFiaWxpdHkifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlByZS1lbXB0aW9uLVZ1bG5lcmFiaWxpdHkifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBRb1MtUnVsZS1SZW1vdmUgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlFvUy1SdWxlLVJlbW92ZSJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUW9TLVJ1bGUtTmFtZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUW9TLVJ1bGUtQmFzZS1OYW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJSZXF1aXJlZC1BY2Nlc3MtSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIFJvdXRpbmctUnVsZS1SZXBvcnQgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJvdXRpbmctUnVsZS1SZXBvcnQifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJvdXRpbmctUnVsZS1JZGVudGlmaWVyIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQQ0MtUnVsZS1TdGF0dXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJvdXRpbmctUnVsZS1GYWlsdXJlLUNvZGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBURlQtUGFja2V0LUZpbHRlci1JbmZvcm1hdGlvbiAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVEZULVBhY2tldC1GaWx0ZXItSW5mb3JtYXRpb24ifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlByZWNlZGVuY2UifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlRGVC1GaWx0ZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlRvUy1UcmFmZmljLUNsYXNzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTZWN1cml0eS1QYXJhbWV0ZXItSW5kZXgifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkZsb3ctTGFiZWwifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkZsb3ctRGlyZWN0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogRml4ZWQtVXNlci1Mb2NhdGlvbi1JbmZvICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJGaXhlZC1Vc2VyLUxvY2F0aW9uLUluZm8ifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNTSUQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkJTU0lEIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTMwMTksIC5hdnBfbmFtZSA9ICJMb2dpY2FsLUFjY2Vzcy1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEzMDE5LCAuYXZwX25hbWUgPSAiUGh5c2ljYWwtQWNjZXNzLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogRGVmYXVsdC1Rb1MtSW5mb3JtYXRpb24gKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkRlZmF1bHQtUW9TLUluZm9ybWF0aW9uIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJRb1MtQ2xhc3MtSWRlbnRpZmllciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTWF4LVJlcXVlc3RlZC1CYW5kd2lkdGgtVUwifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1heC1SZXF1ZXN0ZWQtQmFuZHdpZHRoLURMIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJEZWZhdWx0LVFvUy1OYW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogUGFja2V0LUZpbHRlci1JbmZvcm1hdGlvbiAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUGFja2V0LUZpbHRlci1JbmZvcm1hdGlvbiJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUGFja2V0LUZpbHRlci1JZGVudGlmaWVyIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQcmVjZWRlbmNlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQYWNrZXQtRmlsdGVyLUNvbnRlbnQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlRvUy1UcmFmZmljLUNsYXNzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTZWN1cml0eS1QYXJhbWV0ZXItSW5kZXgifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkZsb3ctTGFiZWwifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkZsb3ctRGlyZWN0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogUm91dGluZy1GaWx0ZXIgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJvdXRpbmctRmlsdGVyIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJGbG93LURlc2NyaXB0aW9uIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJGbG93LURpcmVjdGlvbiJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVG9TLVRyYWZmaWMtQ2xhc3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNlY3VyaXR5LVBhcmFtZXRlci1JbmRleCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRmxvdy1MYWJlbCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIEFEQy1SdWxlLVJlbW92ZSAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQURDLVJ1bGUtUmVtb3ZlIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBREMtUnVsZS1OYW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBREMtUnVsZS1CYXNlLU5hbWUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBRb1MtSW5mb3JtYXRpb24gKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlFvUy1JbmZvcm1hdGlvbiJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUW9TLUNsYXNzLUlkZW50aWZpZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1heC1SZXF1ZXN0ZWQtQmFuZHdpZHRoLVVMIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNYXgtUmVxdWVzdGVkLUJhbmR3aWR0aC1ETCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiR3VhcmFudGVlZC1CaXRyYXRlLVVMIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJHdWFyYW50ZWVkLUJpdHJhdGUtREwifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkJlYXJlci1JZGVudGlmaWVyIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBbGxvY2F0aW9uLVJldGVudGlvbi1Qcmlvcml0eSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQVBOLUFnZ3JlZ2F0ZS1NYXgtQml0cmF0ZS1VTCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQVBOLUFnZ3JlZ2F0ZS1NYXgtQml0cmF0ZS1ETCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ29uZGl0aW9uYWwtQVBOLUFnZ3JlZ2F0ZS1NYXgtQml0cmF0ZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIFBSQS1JbnN0YWxsICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQUkEtSW5zdGFsbCJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUHJlc2VuY2UtUmVwb3J0aW5nLUFyZWEtSW5mb3JtYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBSb3V0aW5nLVJ1bGUtRGVmaW5pdGlvbiAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUm91dGluZy1SdWxlLURlZmluaXRpb24ifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJvdXRpbmctUnVsZS1JZGVudGlmaWVyIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJSb3V0aW5nLUZpbHRlciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUHJlY2VkZW5jZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUm91dGluZy1JUC1BZGRyZXNzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJJUC1DQU4tVHlwZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIERlZmF1bHQtRVBTLUJlYXJlci1Rb1MgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkRlZmF1bHQtRVBTLUJlYXJlci1Rb1MifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlFvUy1DbGFzcy1JZGVudGlmaWVyIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBbGxvY2F0aW9uLVJldGVudGlvbi1Qcmlvcml0eSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIENvQS1JbmZvcm1hdGlvbiAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ29BLUluZm9ybWF0aW9uIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUdW5uZWwtSW5mb3JtYXRpb24ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNvQS1JUC1BZGRyZXNzIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogQXBwbGljYXRpb24tRGV0ZWN0aW9uLUluZm9ybWF0aW9uICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBcHBsaWNhdGlvbi1EZXRlY3Rpb24tSW5mb3JtYXRpb24ifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlRERi1BcHBsaWNhdGlvbi1JZGVudGlmaWVyIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUREYtQXBwbGljYXRpb24tSW5zdGFuY2UtSWRlbnRpZmllciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRmxvdy1JbmZvcm1hdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIENvbmRpdGlvbmFsLVBvbGljeS1JbmZvcm1hdGlvbiAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ29uZGl0aW9uYWwtUG9saWN5LUluZm9ybWF0aW9uIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJFeGVjdXRpb24tVGltZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRGVmYXVsdC1FUFMtQmVhcmVyLVFvUyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQVBOLUFnZ3JlZ2F0ZS1NYXgtQml0cmF0ZS1VTCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQVBOLUFnZ3JlZ2F0ZS1NYXgtQml0cmF0ZS1ETCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ29uZGl0aW9uYWwtQVBOLUFnZ3JlZ2F0ZS1NYXgtQml0cmF0ZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIENoYXJnaW5nLVJ1bGUtRGVmaW5pdGlvbiAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ2hhcmdpbmctUnVsZS1EZWZpbml0aW9uIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDaGFyZ2luZy1SdWxlLU5hbWUifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU2VydmljZS1JZGVudGlmaWVyIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlJhdGluZy1Hcm91cCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRmxvdy1JbmZvcm1hdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRGVmYXVsdC1CZWFyZXItSW5kaWNhdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVERGLUFwcGxpY2F0aW9uLUlkZW50aWZpZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkZsb3ctU3RhdHVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJRb1MtSW5mb3JtYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlBTLXRvLUNTLVNlc3Npb24tQ29udGludWl0eSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUmVwb3J0aW5nLUxldmVsIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJPbmxpbmUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk9mZmxpbmUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1ldGVyaW5nLU1ldGhvZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUHJlY2VkZW5jZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQUYtQ2hhcmdpbmctSWRlbnRpZmllciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRmxvd3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1vbml0b3JpbmctS2V5In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJSZWRpcmVjdC1JbmZvcm1hdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTXV0ZS1Ob3RpZmljYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFGLVNpZ25hbGxpbmctUHJvdG9jb2wifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNwb25zb3ItSWRlbnRpdHkifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFwcGxpY2F0aW9uLVNlcnZpY2UtUHJvdmlkZXItSWRlbnRpdHkifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJlcXVpcmVkLUFjY2Vzcy1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTaGFyaW5nLUtleS1ETCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU2hhcmluZy1LZXktVUwifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlRyYWZmaWMtU3RlZXJpbmctUG9saWN5LUlkZW50aWZpZXItREwifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlRyYWZmaWMtU3RlZXJpbmctUG9saWN5LUlkZW50aWZpZXItVUwifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNvbnRlbnQtVmVyc2lvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIFJvdXRpbmctUnVsZS1JbnN0YWxsICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJSb3V0aW5nLVJ1bGUtSW5zdGFsbCJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUm91dGluZy1SdWxlLURlZmluaXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBBREMtUnVsZS1EZWZpbml0aW9uICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBREMtUnVsZS1EZWZpbml0aW9uIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBREMtUnVsZS1OYW1lIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUREYtQXBwbGljYXRpb24tSWRlbnRpZmllciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRmxvdy1JbmZvcm1hdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTZXJ2aWNlLUlkZW50aWZpZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUmF0aW5nLUdyb3VwIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJSZXBvcnRpbmctTGV2ZWwifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk9ubGluZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiT2ZmbGluZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTWV0ZXJpbmctTWV0aG9kIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQcmVjZWRlbmNlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJGbG93LVN0YXR1cyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUW9TLUluZm9ybWF0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNb25pdG9yaW5nLUtleSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU3BvbnNvci1JZGVudGl0eSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQXBwbGljYXRpb24tU2VydmljZS1Qcm92aWRlci1JZGVudGl0eSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUmVkaXJlY3QtSW5mb3JtYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk11dGUtTm90aWZpY2F0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUcmFmZmljLVN0ZWVyaW5nLVBvbGljeS1JZGVudGlmaWVyLURMIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUcmFmZmljLVN0ZWVyaW5nLVBvbGljeS1JZGVudGlmaWVyLVVMIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUb1MtVHJhZmZpYy1DbGFzcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIEFEQy1SdWxlLVJlcG9ydCAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQURDLVJ1bGUtUmVwb3J0In07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBREMtUnVsZS1OYW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBREMtUnVsZS1CYXNlLU5hbWUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlBDQy1SdWxlLVN0YXR1cyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUnVsZS1GYWlsdXJlLUNvZGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRmluYWwtVW5pdC1JbmRpY2F0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogUW9TLVJ1bGUtRGVmaW5pdGlvbiAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUW9TLVJ1bGUtRGVmaW5pdGlvbiJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUW9TLVJ1bGUtTmFtZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRmxvdy1JbmZvcm1hdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUW9TLUluZm9ybWF0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQcmVjZWRlbmNlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJSZXF1aXJlZC1BY2Nlc3MtSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU2hhcmluZy1LZXktREwifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNoYXJpbmctS2V5LVVMIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDb250ZW50LVZlcnNpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBDaGFyZ2luZy1SdWxlLVJlcG9ydCAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ2hhcmdpbmctUnVsZS1SZXBvcnQifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNoYXJnaW5nLVJ1bGUtTmFtZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ2hhcmdpbmctUnVsZS1CYXNlLU5hbWUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkJlYXJlci1JZGVudGlmaWVyIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQQ0MtUnVsZS1TdGF0dXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJ1bGUtRmFpbHVyZS1Db2RlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkZpbmFsLVVuaXQtSW5kaWNhdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUkFOLU5BUy1SZWxlYXNlLUNhdXNlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDb250ZW50LVZlcnNpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBFdmVudC1SZXBvcnQtSW5kaWNhdGlvbiAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRXZlbnQtUmVwb3J0LUluZGljYXRpb24ifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFOLVRydXN0ZWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkV2ZW50LVRyaWdnZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlVzZXItQ1NHLUluZm9ybWF0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJJUC1DQU4tVHlwZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQU4tR1ctQWRkcmVzcyJ9LCBSVUxFX09QVElPTkFMLCAwLCAyIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIjNHUFAtU0dTTi1BZGRyZXNzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICIzR1BQLVNHU04tSXB2Ni1BZGRyZXNzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICIzR1BQLVNHU04tTUNDLU1OQyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJGcmFtZWQtSVAtQWRkcmVzcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUkFULVR5cGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJBSSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiM0dQUC1Vc2VyLUxvY2F0aW9uLUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlRyYWNlLURhdGEifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlRyYWNlLVJlZmVyZW5jZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDU1MzUsIC5hdnBfbmFtZSA9ICIzR1BQMi1CU0lEIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICIzR1BQLU1TLVRpbWVab25lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJSb3V0aW5nLUlQLUFkZHJlc3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlVFLUxvY2FsLUlQLUFkZHJlc3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkhlTkItTG9jYWwtSVAtQWRkcmVzcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVURQLVNvdXJjZS1Qb3J0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQcmVzZW5jZS1SZXBvcnRpbmctQXJlYS1JbmZvcm1hdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIENoYXJnaW5nLVJ1bGUtSW5zdGFsbCAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ2hhcmdpbmctUnVsZS1JbnN0YWxsIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDaGFyZ2luZy1SdWxlLURlZmluaXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNoYXJnaW5nLVJ1bGUtTmFtZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ2hhcmdpbmctUnVsZS1CYXNlLU5hbWUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkJlYXJlci1JZGVudGlmaWVyIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNb25pdG9yaW5nLUZsYWdzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJSdWxlLUFjdGl2YXRpb24tVGltZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUnVsZS1EZWFjdGl2YXRpb24tVGltZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUmVzb3VyY2UtQWxsb2NhdGlvbi1Ob3RpZmljYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNoYXJnaW5nLUNvcnJlbGF0aW9uLUluZGljYXRvciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiSVAtQ0FOLVR5cGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBRb1MtUnVsZS1JbnN0YWxsICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJRb1MtUnVsZS1JbnN0YWxsIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJRb1MtUnVsZS1EZWZpbml0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJRb1MtUnVsZS1OYW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJRb1MtUnVsZS1CYXNlLU5hbWUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlR1bm5lbC1JbmZvcm1hdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQWNjZXNzLU5ldHdvcmstQ2hhcmdpbmctSWRlbnRpZmllci1WYWx1ZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUmVzb3VyY2UtQWxsb2NhdGlvbi1Ob3RpZmljYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJ1bGUtQWN0aXZhdGlvbi1UaW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJSdWxlLURlYWN0aXZhdGlvbi1UaW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICIzR1BQLUdHU04tQWRkcmVzcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiM0dQUC1HR1NOLUlwdjYtQWRkcmVzcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQU4tR1ctQWRkcmVzcyJ9LCBSVUxFX09QVElPTkFMLCAwLCAyIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlVEUC1Tb3VyY2UtUG9ydCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIEFEQy1SdWxlLUluc3RhbGwgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFEQy1SdWxlLUluc3RhbGwifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFEQy1SdWxlLURlZmluaXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFEQy1SdWxlLU5hbWUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFEQy1SdWxlLUJhc2UtTmFtZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTW9uaXRvcmluZy1GbGFncyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUnVsZS1BY3RpdmF0aW9uLVRpbWUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJ1bGUtRGVhY3RpdmF0aW9uLVRpbWUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBVc2FnZS1Nb25pdG9yaW5nLUluZm9ybWF0aW9uICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJVc2FnZS1Nb25pdG9yaW5nLUluZm9ybWF0aW9uIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNb25pdG9yaW5nLUtleSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJHcmFudGVkLVNlcnZpY2UtVW5pdCJ9LCBSVUxFX09QVElPTkFMLCAwLCAyIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVXNlZC1TZXJ2aWNlLVVuaXQifSwgUlVMRV9PUFRJT05BTCwgMCwgMiB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJRdW90YS1Db25zdW1wdGlvbi1UaW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJVc2FnZS1Nb25pdG9yaW5nLUxldmVsIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJVc2FnZS1Nb25pdG9yaW5nLVJlcG9ydCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVXNhZ2UtTW9uaXRvcmluZy1TdXBwb3J0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCisgICB9CQorCisgICAvKiBDb21tYW5kcyBzZWN0aW9uICovCisgICB7CisKKyAgIH0KKworICAgTE9HX0QoICJFeHRlbnNpb24gJ0RpY3Rpb25hcnkgZGVmaW5pdGlvbnMgZm9yIHRzMjkyMTJfYXZwcyAoZTMwKScgaW5pdGlhbGl6ZWQiKTsKKyAgIHJldHVybiAwOworfQorCitpbnQgZGljdF9lbnRyeShjaGFyICogY29uZmZpbGUpCit7CisJZGljdF90czI5MjEyX2F2cHNfbG9hZF9kZWZzKGNvbmZmaWxlKTsKKwlyZXR1cm4gZGljdF90czI5MjEyX2F2cHNfbG9hZF9ydWxlcyhjb25mZmlsZSk7Cit9CisKK2NvbnN0IGNoYXIqIGRpY3RfdHMyOTIxMl9hdnBzX3Byb3RvX3ZlcihjaGFyICogY29uZmZpbGUpIHsKKwlyZXR1cm4gdHMyOTIxMl9hdnBzX3Byb3RvX3ZlcjsKK30KKworY29uc3QgZG91YmxlIGRpY3RfdHMyOTIxMl9hdnBzX2dlbl90cyhjaGFyICogY29uZmZpbGUpIHsKKwlyZXR1cm4gdHMyOTIxMl9hdnBzX2dlbl9kYXRlOworfQorCitFWFRFTlNJT05fRU5UUlkyKCJkaWN0X3RzMjkyMTJfYXZwcyIsIGRpY3RfdHMyOTIxMl9hdnBzX2xvYWRfZGVmcywgZGljdF90czI5MjEyX2F2cHNfbG9hZF9ydWxlcywgImRpY3RfdHMzMjI5OV9hdnBzIiwgImRpY3RfdHMyOTI3M19hdnBzIiwgImRpY3RfdHMyOTIxNF9hdnBzIiwgImRpY3RfdHMyOTI3Ml9hdnBzIiwgImRpY3RfdHMyOTIyOV9hdnBzIiwgImRpY3RfcmZjNDAwNmJpc19hdnBzIiwgImRpY3RfdHMyOTA2MV9hdnBzIiwgImRpY3RfZHJhZnRsb2FkX2F2cHMiLCAiZGljdF9yZmM3NjgzX2F2cHMiLCAiZGljdF9yZmM3MTU1X2F2cHMiLCAiZGljdF9ldHNpMjgzMDM0X2F2cHMiLCAiZGljdF8zZ3BwMl9hdnBzIiwgImRpY3RfcmZjNzk0NF9hdnBzIik7CisKKworCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfdHMyOTIxMl9hdnBzL3RzMjkyMTJfYXZwcy5kaWQgYi9leHRlbnNpb25zL2RpY3RfdHMyOTIxMl9hdnBzL3RzMjkyMTJfYXZwcy5kaWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI1YzA5YgotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF90czI5MjEyX2F2cHMvdHMyOTIxMl9hdnBzLmRpZApAQCAtMCwwICsxLDM3IEBACitkaWN0X3JmYzY5NDJfYXZwcworZGljdF90czI5NDY4X2F2cHMKK2RpY3RfdHMyOTE1NF9hdnBzCitkaWN0X3RzMjkyMTRfYXZwcworZGljdF90czI5MjE1X2F2cHMKK2RpY3RfdHMyOTIxN19hdnBzCitkaWN0XzNncHAyX2F2cHMKK2RpY3RfdHMyOTM0M19hdnBzCitkaWN0X3RzMjkzMzhfYXZwcworZGljdF90czI5MTI4X2F2cHMKK2RpY3RfdHMyOTM0NF9hdnBzCitkaWN0X3RzMjkzNDVfYXZwcworZGljdF90czMyMjk5X2F2cHMKK2RpY3RfcmZjNjczNF9hdnBzCitkaWN0X3JmYzU3NzhfYXZwcworZGljdF9yZmM1NTgwX2F2cHMKK2RpY3RfcmZjNDA3Ml9hdnBzCitkaWN0X3RzMjkyNzNfYXZwcworZGljdF90czI5MTczX2F2cHMKK2RpY3RfdHMyOTMzN19hdnBzCitkaWN0X2V0c2kyODMwMzRfYXZwcworZGljdF9yZmM0NTkwX2F2cHMKK2RpY3RfdHMyOTIyOV9hdnBzCitkaWN0X2RyYWZ0bG9hZF9hdnBzCitkaWN0X3RzMjkzMjlfYXZwcworZGljdF90czI5MzY4X2F2cHMKK2RpY3RfdHMyOTMzNl9hdnBzCitkaWN0X3RzMjkwNjFfYXZwcworZGljdF9yZmM1NDQ3X2F2cHMKK2RpY3RfdHMyOTI3Ml9hdnBzCitkaWN0X3JmYzc2ODNfYXZwcworZGljdF9yZmM3OTQ0X2F2cHMKK2RpY3RfcmZjNTc3N19hdnBzCitkaWN0X3JmYzQwMDZiaXNfYXZwcworZGljdF9yZmM0MDA0X2F2cHMKK2RpY3RfcmZjNzE1NV9hdnBzCitkaWN0X3RzMjkyMTJfYXZwcwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X3RzMjkyMTRfYXZwcy9DTWFrZUxpc3RzLnR4dCBiL2V4dGVuc2lvbnMvZGljdF90czI5MjE0X2F2cHMvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNiY2VjYwotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF90czI5MjE0X2F2cHMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxNiBAQAorIyBUaGUgZGljdF90czI5MjE0X2F2cHMgZXh0ZW5zaW9uCitQUk9KRUNUKCJkaWN0X3RzMjkyMTRfYXZwcyBsaWJyYXJ5IGdlbmVyYXRlZCBieSBGZEdlbiAiIEMpCisKKyMgQ29tcGlsZSBhcyBhIG1vZHVsZQorRkRfQUREX0VYVEVOU0lPTihkaWN0X3RzMjkyMTRfYXZwcyBkaWN0X3RzMjkyMTRfYXZwcy5jKQorCisKKyMjIyMKKyMjIElOU1RBTEwgc2VjdGlvbiAjIworCitJTlNUQUxMKFRBUkdFVFMgZGljdF90czI5MjE0X2F2cHMKKwlMSUJSQVJZIERFU1RJTkFUSU9OICR7SU5TVEFMTF9FWFRFTlNJT05TX1NVRkZJWH0KK0NPTVBPTkVOVCBmcmVlRGlhbWV0ZXItZGljdGlvbmFyeS1UUzI5MjE0X0FWUFMpCisKKworCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfdHMyOTIxNF9hdnBzL2RpY3RfdHMyOTIxNF9hdnBzLmMgYi9leHRlbnNpb25zL2RpY3RfdHMyOTIxNF9hdnBzL2RpY3RfdHMyOTIxNF9hdnBzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM0YTVjOAotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF90czI5MjE0X2F2cHMvZGljdF90czI5MjE0X2F2cHMuYwpAQCAtMCwwICsxLDEwMzEgQEAKKy8qCisqIENvcHlyaWdodCAoYykgMjAxNyBTcHJpbnQKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLyoqKioqKioqKioqKioqKioKKyBHZW5lcmF0ZWQgQnk6IGZkdG9vbCBlbmhhbmNlbWVudHMgdG8gZGlhZnV6emVyCisgTGljZW5zZTogc2FtZSBhcyBmcmVlRGlhbWV0ZXIKKyoqKioqKioqKioqKioqKiovCisKKworLyogCisgKiBEaWN0aW9uYXJ5IGRlZmluaXRpb25zIG9mIG9iamVjdHMgc3BlY2lmaWVkIGluIHRzMjkyMTRfYXZwcyAoZTMwKS4KKyAqLworI2luY2x1ZGUgPGZyZWVEaWFtZXRlci9leHRlbnNpb24uaD4KKworI2RlZmluZSBQUk9UT19WRVIgImUzMCIKKyNkZWZpbmUgR0VOX0RBVEUgIDE1MDY2OTcxMzYuNzMKKworY29uc3QgY2hhciAqdHMyOTIxNF9hdnBzX3Byb3RvX3ZlciA9IFBST1RPX1ZFUjsKK2NvbnN0IGRvdWJsZSB0czI5MjE0X2F2cHNfZ2VuX2RhdGUgPSBHRU5fREFURTsKKworLyogVGhlIGNvbnRlbnQgb2YgdGhpcyBmaWxlIGZvbGxvd3MgdGhlIHNhbWUgc3RydWN0dXJlIGFzIGRpY3RfYmFzZV9wcm90by5jICovCisKKyNkZWZpbmUgQ0hFQ0tfZGljdF9uZXcoIF90eXBlLCBfZGF0YSwgX3BhcmVudCwgX3JlZiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgX3JldCA9IGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIChfdHlwZSksIChfZGF0YSksIChfcGFyZW50KSwgKF9yZWYpICk7IFwKKyAgICBpZiAoIF9yZXQgIT0gMCAmJiBfcmV0ICE9IEVFWElTVCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICByZXR1cm4gX3JldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBDSEVDS19kaWN0X3NlYXJjaCggX3R5cGUsIF9jcml0ZXJpYSwgX3doYXQsIF9yZXN1bHQgKQkJXAorICAgIENIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIChfdHlwZSksIChfY3JpdGVyaWEpLCAoX3doYXQpLCAoX3Jlc3VsdCksIEVOT0VOVCkgKTsKKworc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24geworICAgIHN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lOworICAgIGVudW0gcnVsZV9wb3NpdGlvbglwb3NpdGlvbjsKKyAgICBpbnQgCQkJbWluOworICAgIGludAkJCW1heDsKK307CisKKyNkZWZpbmUgUlVMRV9PUkRFUiggX3Bvc2l0aW9uICkgKCgoKF9wb3NpdGlvbikgPT0gUlVMRV9GSVhFRF9IRUFEKSB8fCAoKF9wb3NpdGlvbikgPT0gUlVMRV9GSVhFRF9UQUlMKSkgPyAxIDogMCApCisKKy8qIEF0dGVudGlvbiEgVGhpcyB2ZXJzaW9uIG9mIHRoZSBtYWNybyB1c2VzIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsIGluIGNvbnRyYXN0IHRvIG1vc3Qgb3RoZXIgY29waWVzISAqLworI2RlZmluZSBQQVJTRV9sb2NfcnVsZXMoIF9ydWxlYXJyYXksIF9wYXJlbnQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBfX2FyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yIChfX2FyPTA7IF9fYXIgPCBzaXplb2YoX3J1bGVhcnJheSkgLyBzaXplb2YoKF9ydWxlYXJyYXkpWzBdKTsgX19hcisrKSB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHN0cnVjdCBkaWN0X3J1bGVfZGF0YSBfX2RhdGEgPSB7IE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ucG9zaXRpb24sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLm1pbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ubWF4fTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfX2RhdGEucnVsZV9vcmRlciA9IFJVTEVfT1JERVIoX19kYXRhLnJ1bGVfcG9zaXRpb24pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIENIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIERJQ1RfQVZQLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAmKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICZfX2RhdGEucnVsZV9hdnAsIDAgKSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmICggIV9fZGF0YS5ydWxlX2F2cCApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9ERUJVRyhJTkZPLCAiQVZQIE5vdCBmb3VuZDogJyVzJyIsIChfcnVsZWFycmF5KVtfX2FyXS5hdnBfdmVuZG9yX3BsdXNfbmFtZS5hdnBfbmFtZSk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFTk9FTlQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgX3JldCA9IGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfUlVMRSwgJihfX2RhdGEpLCAoX3BhcmVudCksIE5VTEwgKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggX3JldCAhPSAwICYmIF9yZXQgIT0gRUVYSVNUICkgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFX0RFQlVHKElORk8sICJFcnJvciBvbiBydWxlIHdpdGggQVZQICclcyciLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLmF2cF9uYW1lKTsgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRUlOVkFMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgQ0hFQ0tfdmVuZG9yX25ldyggX2RhdGEgKSB7IFwKKyAgICAgICAgc3RydWN0IGRpY3Rfb2JqZWN0ICogdmVuZG9yX2ZvdW5kOyBcCisgICAgICAgIGlmIChmZF9kaWN0X3NlYXJjaChmZF9nX2NvbmZpZy0+Y25mX2RpY3QsRElDVF9WRU5ET1IsVkVORE9SX0JZX0lELCZfZGF0YS52ZW5kb3JfaWQsJnZlbmRvcl9mb3VuZCxFTk9FTlQpID09IEVOT0VOVCkgeyBcCisgICAgICAgICAgICAgICAgQ0hFQ0tfRkNUKGZkX2RpY3RfbmV3KGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9WRU5ET1IsICZfZGF0YSwgTlVMTCwgTlVMTCkpOyBcCisgICAgICAgIH0gXAorfQorCisjZGVmaW5lIGVudW12YWxfZGVmX3UzMiggX3ZhbF8sIF9zdHJfICkJCVwKKyAgICB7IF9zdHJfLCAJCXsgLnUzMiA9IF92YWxfIH19CisKKyNkZWZpbmUgZW51bXZhbF9kZWZfb3MoIF9sZW5fLCBfdmFsXywgX3N0cl8gKQkJCQlcCisgICAgeyBfc3RyXywgCQl7IC5vcyA9IHsgLmRhdGEgPSAodW5zaWduZWQgY2hhciAqKV92YWxfLCAubGVuID0gX2xlbl8gfX19CisKKworc3RhdGljIGludCBkaWN0X3RzMjkyMTRfYXZwc19sb2FkX2RlZnMoY2hhciAqIGNvbmZmaWxlKQoreworICAgVFJBQ0VfRU5UUlkoIiVwIiwgY29uZmZpbGUpOworCS8qIEFwcGxpY2F0aW9uIFNlY3Rpb24gKi8KKwl7CisJCS8qIENyZWF0ZSB0aGUgdmVuZG9ycyAqLwkJeworCQkJc3RydWN0IGRpY3RfdmVuZG9yX2RhdGEgdmVuZG9yX2RhdGEgPSB7IDEwNDE1LCAiM0dQUCIgfTsKKwkJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVkVORE9SLCAmdmVuZG9yX2RhdGEsIE5VTEwsIE5VTEwpCisJCX0KKwl9CisKKworICAgLyogQVZQIHNlY3Rpb24gKi8KKyAgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogQWRkcmVzc190eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBVVEY4U3RyaW5nX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIERpYW1ldGVySWRlbnRpdHlfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogRGlhbWV0ZXJVUklfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogVGltZV90eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBJUEZpbHRlclJ1bGVfdHlwZTsKKworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJBZGRyZXNzIiwgJkFkZHJlc3NfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIlVURjhTdHJpbmciLCAmVVRGOFN0cmluZ190eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiRGlhbWV0ZXJJZGVudGl0eSIsICZEaWFtZXRlcklkZW50aXR5X3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJEaWFtZXRlclVSSSIsICZEaWFtZXRlclVSSV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiVGltZSIsICZUaW1lX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJJUEZpbHRlclJ1bGUiLCAmSVBGaWx0ZXJSdWxlX3R5cGUpOworCQkvKiBBYm9ydC1DYXVzZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTUwMCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQWJvcnQtQ2F1c2UiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKEFib3J0LUNhdXNlKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiQkVBUkVSX1JFTEVBU0VEIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIklOU1VGRklDSUVOVF9TRVJWRVJfUkVTT1VSQ0VTIiwgeyAuaTMyPTEgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMyA9IHsgIklOU1VGRklDSUVOVF9CRUFSRVJfUkVTT1VSQ0VTIiwgeyAuaTMyPTIgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNCA9IHsgIlBTX1RPX0NTX0hBTkRPVkVSIiwgeyAuaTMyPTMgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNSA9IHsgIkRJU0FMTE9XRUQiLCB7IC5pMzI9NCB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzQsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogQWNjZXNzLU5ldHdvcmstQ2hhcmdpbmctQWRkcmVzcyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTUwMSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQWNjZXNzLU5ldHdvcmstQ2hhcmdpbmctQWRkcmVzcyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgQWRkcmVzc190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogQWNjZXNzLU5ldHdvcmstQ2hhcmdpbmctSWRlbnRpZmllci1WYWx1ZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTUwMywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQWNjZXNzLU5ldHdvcmstQ2hhcmdpbmctSWRlbnRpZmllci1WYWx1ZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIEFGLUFwcGxpY2F0aW9uLUlkZW50aWZpZXIgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk1MDQsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkFGLUFwcGxpY2F0aW9uLUlkZW50aWZpZXIiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBBRi1DaGFyZ2luZy1JZGVudGlmaWVyICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNTA1LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJBRi1DaGFyZ2luZy1JZGVudGlmaWVyIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogQUYtUmVxdWVzdGVkLURhdGEgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk1NTEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkFGLVJlcXVlc3RlZC1EYXRhIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBBRi1TaWduYWxsaW5nLVByb3RvY29sICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNTI5LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJBRi1TaWduYWxsaW5nLVByb3RvY29sIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChBRi1TaWduYWxsaW5nLVByb3RvY29sKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiTk9fSU5GT1JNQVRJT04iLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiU0lQIiwgeyAuaTMyPTEgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIEFwcGxpY2F0aW9uLVNlcnZpY2UtUHJvdmlkZXItSWRlbnRpdHkgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk1MzIsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkFwcGxpY2F0aW9uLVNlcnZpY2UtUHJvdmlkZXItSWRlbnRpdHkiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFByZS1lbXB0aW9uLUNvbnRyb2wtSW5mbyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTU1MywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUHJlLWVtcHRpb24tQ29udHJvbC1JbmZvIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBDb2RlYy1EYXRhICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNTI0LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJDb2RlYy1EYXRhIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogQ29udGVudC1WZXJzaW9uICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNTUyLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJDb250ZW50LVZlcnNpb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDY0CS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIEZsb3ctRGVzY3JpcHRpb24gKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk1MDcsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkZsb3ctRGVzY3JpcHRpb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIElQRmlsdGVyUnVsZV90eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogRmxvdy1OdW1iZXIgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk1MDksCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkZsb3ctTnVtYmVyIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBGbG93LVN0YXR1cyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTUxMSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiRmxvdy1TdGF0dXMiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKEZsb3ctU3RhdHVzKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiRU5BQkxFRF9VUExJTksiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiRU5BQkxFRF9ET1dOTElOSyIsIHsgLmkzMj0xIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMgPSB7ICJFTkFCTEVEIiwgeyAuaTMyPTIgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNCA9IHsgIkRJU0FCTEVEIiwgeyAuaTMyPTMgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNSA9IHsgIlJFTU9WRUQiLCB7IC5pMzI9NCB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzQsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogRmxvdy1Vc2FnZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTUxMiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiRmxvdy1Vc2FnZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoRmxvdy1Vc2FnZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIk5PX0lORk9STUFUSU9OIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIlJUQ1AiLCB7IC5pMzI9MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAiQUZfU0lHTkFMTElORyIsIHsgLmkzMj0yIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIEdDUy1JZGVudGlmaWVyICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNTM4LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJHQ1MtSWRlbnRpZmllciIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIElQLURvbWFpbi1JZCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTUzNywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiSVAtRG9tYWluLUlkIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogTWF4LVJlcXVlc3RlZC1CYW5kd2lkdGgtREwgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk1MTUsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk1heC1SZXF1ZXN0ZWQtQmFuZHdpZHRoLURMIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBNYXgtUmVxdWVzdGVkLUJhbmR3aWR0aC1VTCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTUxNiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTWF4LVJlcXVlc3RlZC1CYW5kd2lkdGgtVUwiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIE1heC1TdXBwb3J0ZWQtQmFuZHdpZHRoLURMICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNTQzLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJNYXgtU3VwcG9ydGVkLUJhbmR3aWR0aC1ETCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogTWF4LVN1cHBvcnRlZC1CYW5kd2lkdGgtVUwgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk1NDQsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk1heC1TdXBwb3J0ZWQtQmFuZHdpZHRoLVVMIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBNQ1BUVC1JZGVudGlmaWVyICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNTQ3LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJNQ1BUVC1JZGVudGlmaWVyIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogTWVkaWEtQ29tcG9uZW50LU51bWJlciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTUxOCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTWVkaWEtQ29tcG9uZW50LU51bWJlciIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogTWVkaWEtQ29tcG9uZW50LVN0YXR1cyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTU0OSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTWVkaWEtQ29tcG9uZW50LVN0YXR1cyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogTWVkaWEtVHlwZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTUyMCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTWVkaWEtVHlwZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoTWVkaWEtVHlwZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIkFVRElPIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIlZJREVPIiwgeyAuaTMyPTEgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMyA9IHsgIkRBVEEiLCB7IC5pMzI9MiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF80ID0geyAiQVBQTElDQVRJT04iLCB7IC5pMzI9MyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF81ID0geyAiQ09OVFJPTCIsIHsgLmkzMj00IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzYgPSB7ICJURVhUIiwgeyAuaTMyPTUgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNyA9IHsgIk1FU1NBR0UiLCB7IC5pMzI9NiB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzQsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF82LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzcsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIE1QUy1JZGVudGlmaWVyICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNTI4LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJNUFMtSWRlbnRpZmllciIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIE1pbi1EZXNpcmVkLUJhbmR3aWR0aC1ETCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTU0NSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTWluLURlc2lyZWQtQmFuZHdpZHRoLURMIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBNaW4tRGVzaXJlZC1CYW5kd2lkdGgtVUwgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk1NDYsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk1pbi1EZXNpcmVkLUJhbmR3aWR0aC1VTCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogTWluLVJlcXVlc3RlZC1CYW5kd2lkdGgtREwgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk1MzQsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk1pbi1SZXF1ZXN0ZWQtQmFuZHdpZHRoLURMIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBNaW4tUmVxdWVzdGVkLUJhbmR3aWR0aC1VTCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTUzNSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTWluLVJlcXVlc3RlZC1CYW5kd2lkdGgtVUwiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFByaW9yaXR5LVNoYXJpbmctSW5kaWNhdG9yICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNTUwLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJQcmlvcml0eS1TaGFyaW5nLUluZGljYXRvciIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoUHJpb3JpdHktU2hhcmluZy1JbmRpY2F0b3IpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJQUklPUklUWV9TSEFSSU5HX0VOQUJMRUQiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiUFJJT1JJVFlfU0hBUklOR19ESVNBQkxFRCIsIHsgLmkzMj0xIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBSUi1CYW5kd2lkdGggKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk1MjEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlJSLUJhbmR3aWR0aCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogUlMtQmFuZHdpZHRoICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNTIyLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJSUy1CYW5kd2lkdGgiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFNlcnZpY2UtQXV0aG9yaXphdGlvbi1JbmZvICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNTQ4LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTZXJ2aWNlLUF1dGhvcml6YXRpb24tSW5mbyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogU2VydmljZS1VUk4gKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk1MjUsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlNlcnZpY2UtVVJOIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogU2VydmljZS1JbmZvLVN0YXR1cyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTUyNywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiU2VydmljZS1JbmZvLVN0YXR1cyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoU2VydmljZS1JbmZvLVN0YXR1cykiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIkZJTkFMX1NFUlZJQ0VfSU5GT1JNQVRJT04iLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiUFJFTElNSU5BUllfU0VSVklDRV9JTkZPUk1BVElPTiIsIHsgLmkzMj0xIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBTaGFyaW5nLUtleS1ETCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTUzOSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiU2hhcmluZy1LZXktREwiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFNoYXJpbmctS2V5LVVMICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNTQwLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTaGFyaW5nLUtleS1VTCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogU3BlY2lmaWMtQWN0aW9uICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNTEzLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTcGVjaWZpYy1BY3Rpb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFNwZWNpZmljLUFjdGlvbikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIlZvaWQiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiQ0hBUkdJTkdfQ09SUkVMQVRJT05fRVhDSEFOR0UiLCB7IC5pMzI9MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAiSU5ESUNBVElPTl9PRl9MSU1JVEVEX1BDQ19ERVBMT1lNRU5UIiwgeyAuaTMyPTEwIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzQgPSB7ICJVU0FHRV9SRVBPUlQiLCB7IC5pMzI9MTEgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNSA9IHsgIkFDQ0VTU19ORVRXT1JLX0lORk9fUkVQT1JUIiwgeyAuaTMyPTEyIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzYgPSB7ICJJTkRJQ0FUSU9OX09GX1JFQ09WRVJZX0ZST01fTElNSVRFRF9QQ0NfREVQTE9ZTUVOVCIsIHsgLmkzMj0xMyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF83ID0geyAiSU5ESUNBVElPTl9PRl9BQ0NFU1NfTkVUV09SS19JTkZPX1JFUE9SVElOR19GQUlMVVJFIiwgeyAuaTMyPTE0IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzggPSB7ICJJTkRJQ0FUSU9OX09GX1RSQU5TRkVSX1BPTElDWV9FWFBJUkVEIiwgeyAuaTMyPTE1IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzkgPSB7ICJQTE1OX0NIQU5HRSIsIHsgLmkzMj0xNiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xMCA9IHsgIklORElDQVRJT05fT0ZfTE9TU19PRl9CRUFSRVIiLCB7IC5pMzI9MiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xMSA9IHsgIklORElDQVRJT05fT0ZfUkVDT1ZFUllfT0ZfQkVBUkVSIiwgeyAuaTMyPTMgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTIgPSB7ICJJTkRJQ0FUSU9OX09GX1JFTEVBU0VfT0ZfQkVBUkVSIiwgeyAuaTMyPTQgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTMgPSB7ICJWb2lkMiIsIHsgLmkzMj01IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzE0ID0geyAiSVBfQ0FOX0NIQU5HRSIsIHsgLmkzMj02IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzE1ID0geyAiSU5ESUNBVElPTl9PRl9PVVRfT0ZfQ1JFRElUIiwgeyAuaTMyPTcgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTYgPSB7ICJJTkRJQ0FUSU9OX09GX1NVQ0NFU1NGVUxfUkVTT1VSQ0VTX0FMTE9DQVRJT04iLCB7IC5pMzI9OCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xNyA9IHsgIklORElDQVRJT05fT0ZfRkFJTEVEX1JFU09VUkNFU19BTExPQ0FUSU9OIiwgeyAuaTMyPTkgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF80LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzUsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF83LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzgsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfOSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xNCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xNSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xNiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xNywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogU0lQLUZvcmtpbmctSW5kaWNhdGlvbiAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTUyMywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiU0lQLUZvcmtpbmctSW5kaWNhdGlvbiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoU0lQLUZvcmtpbmctSW5kaWNhdGlvbikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIlNJTkdMRV9ESUFMT0dVRSIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJTRVZFUkFMX0RJQUxPR1VFUyIsIHsgLmkzMj0xIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBTcG9uc29yLUlkZW50aXR5ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNTMxLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTcG9uc29yLUlkZW50aXR5IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBTcG9uc29yaW5nLUFjdGlvbiAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTU0MiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiU3BvbnNvcmluZy1BY3Rpb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFNwb25zb3JpbmctQWN0aW9uKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiRElTQUJMRV9TUE9OU09SSU5HIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIkVOQUJMRV9TUE9OU09SSU5HIiwgeyAuaTMyPTEgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFJlcXVpcmVkLUFjY2Vzcy1JbmZvICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNTM2LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJSZXF1aXJlZC1BY2Nlc3MtSW5mbyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoUmVxdWlyZWQtQWNjZXNzLUluZm8pIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJVU0VSX0xPQ0FUSU9OIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIk1TX1RJTUVfWk9ORSIsIHsgLmkzMj0xIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBSeC1SZXF1ZXN0LVR5cGUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk1MzMsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlJ4LVJlcXVlc3QtVHlwZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoUngtUmVxdWVzdC1UeXBlKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiSU5JVElBTF9SRVFVRVNUIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIlVQREFURV9SRVFVRVNUIiwgeyAuaTMyPTEgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMyA9IHsgIlBDU0NGX1JFU1RPUkFUSU9OIiwgeyAuaTMyPTIgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogUmV0cnktSW50ZXJ2YWwgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk1NDEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlJldHJ5LUludGVydmFsIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBNZWRpYS1TdWItQ29tcG9uZW50ICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNTE5LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJNZWRpYS1TdWItQ29tcG9uZW50IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBGbG93cyAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTUxMCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiRmxvd3MiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIE1lZGlhLUNvbXBvbmVudC1EZXNjcmlwdGlvbiAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTUxNywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTWVkaWEtQ29tcG9uZW50LURlc2NyaXB0aW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBBY2Nlc3MtTmV0d29yay1DaGFyZ2luZy1JZGVudGlmaWVyICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNTAyLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJBY2Nlc3MtTmV0d29yay1DaGFyZ2luZy1JZGVudGlmaWVyIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBBY2NlcHRhYmxlLVNlcnZpY2UtSW5mbyAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTUyNiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQWNjZXB0YWJsZS1TZXJ2aWNlLUluZm8iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIFNwb25zb3JlZC1Db25uZWN0aXZpdHktRGF0YSAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTUzMCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiU3BvbnNvcmVkLUNvbm5lY3Rpdml0eS1EYXRhIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCisJCisgICB9CisKKyAgIC8qIENvbW1hbmRzIHNlY3Rpb24gKi8KKyAgIHsKKworICAgfQorCisgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkaWN0X3RzMjkyMTRfYXZwc19sb2FkX3J1bGVzKGNoYXIgKiBjb25mZmlsZSkKK3sKKyAgIC8qIEdyb3VwZWQgQVZQIHNlY3Rpb24gKi8KKyAgIHsKKwkgIC8qIE1lZGlhLVN1Yi1Db21wb25lbnQgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1lZGlhLVN1Yi1Db21wb25lbnQifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkZsb3ctTnVtYmVyIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogRmxvd3MgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkZsb3dzIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNZWRpYS1Db21wb25lbnQtTnVtYmVyIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJGbG93LU51bWJlciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ29udGVudC1WZXJzaW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkZpbmFsLVVuaXQtQWN0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNZWRpYS1Db21wb25lbnQtU3RhdHVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogTWVkaWEtQ29tcG9uZW50LURlc2NyaXB0aW9uICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNZWRpYS1Db21wb25lbnQtRGVzY3JpcHRpb24ifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1lZGlhLUNvbXBvbmVudC1OdW1iZXIifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBBY2Nlc3MtTmV0d29yay1DaGFyZ2luZy1JZGVudGlmaWVyICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBY2Nlc3MtTmV0d29yay1DaGFyZ2luZy1JZGVudGlmaWVyIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBY2Nlc3MtTmV0d29yay1DaGFyZ2luZy1JZGVudGlmaWVyLVZhbHVlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJGbG93cyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIEFjY2VwdGFibGUtU2VydmljZS1JbmZvICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBY2NlcHRhYmxlLVNlcnZpY2UtSW5mbyJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTWVkaWEtQ29tcG9uZW50LURlc2NyaXB0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNYXgtUmVxdWVzdGVkLUJhbmR3aWR0aC1ETCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTWF4LVJlcXVlc3RlZC1CYW5kd2lkdGgtVUwifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBTcG9uc29yZWQtQ29ubmVjdGl2aXR5LURhdGEgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNwb25zb3JlZC1Db25uZWN0aXZpdHktRGF0YSJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU3BvbnNvci1JZGVudGl0eSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQXBwbGljYXRpb24tU2VydmljZS1Qcm92aWRlci1JZGVudGl0eSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJHcmFudGVkLVNlcnZpY2UtVW5pdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJVc2VkLVNlcnZpY2UtVW5pdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU3BvbnNvcmluZy1BY3Rpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisKKyAgIH0JCisKKyAgIC8qIENvbW1hbmRzIHNlY3Rpb24gKi8KKyAgIHsKKworICAgfQorCisgICBMT0dfRCggIkV4dGVuc2lvbiAnRGljdGlvbmFyeSBkZWZpbml0aW9ucyBmb3IgdHMyOTIxNF9hdnBzIChlMzApJyBpbml0aWFsaXplZCIpOworICAgcmV0dXJuIDA7Cit9CisKK2ludCBkaWN0X2VudHJ5KGNoYXIgKiBjb25mZmlsZSkKK3sKKwlkaWN0X3RzMjkyMTRfYXZwc19sb2FkX2RlZnMoY29uZmZpbGUpOworCXJldHVybiBkaWN0X3RzMjkyMTRfYXZwc19sb2FkX3J1bGVzKGNvbmZmaWxlKTsKK30KKworY29uc3QgY2hhciogZGljdF90czI5MjE0X2F2cHNfcHJvdG9fdmVyKGNoYXIgKiBjb25mZmlsZSkgeworCXJldHVybiB0czI5MjE0X2F2cHNfcHJvdG9fdmVyOworfQorCitjb25zdCBkb3VibGUgZGljdF90czI5MjE0X2F2cHNfZ2VuX3RzKGNoYXIgKiBjb25mZmlsZSkgeworCXJldHVybiB0czI5MjE0X2F2cHNfZ2VuX2RhdGU7Cit9CisKK0VYVEVOU0lPTl9FTlRSWTIoImRpY3RfdHMyOTIxNF9hdnBzIiwgZGljdF90czI5MjE0X2F2cHNfbG9hZF9kZWZzLCBkaWN0X3RzMjkyMTRfYXZwc19sb2FkX3J1bGVzLCAiZGljdF90czI5MjczX2F2cHMiLCAiZGljdF90czI5MjEyX2F2cHMiLCAiZGljdF90czI5MjI5X2F2cHMiLCAiZGljdF90czI5MTU0X2F2cHMiLCAiZGljdF90czI5MDYxX2F2cHMiLCAiZGljdF9yZmM0MDA2YmlzX2F2cHMiLCAiZGljdF9kcmFmdGxvYWRfYXZwcyIsICJkaWN0X3JmYzc2ODNfYXZwcyIsICJkaWN0X3JmYzcxNTVfYXZwcyIsICJkaWN0X2V0c2kyODMwMzRfYXZwcyIsICJkaWN0X3JmYzc5NDRfYXZwcyIpOworCisKKwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X3RzMjkyMTRfYXZwcy90czI5MjE0X2F2cHMuZGlkIGIvZXh0ZW5zaW9ucy9kaWN0X3RzMjkyMTRfYXZwcy90czI5MjE0X2F2cHMuZGlkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MmJjZmMKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfdHMyOTIxNF9hdnBzL3RzMjkyMTRfYXZwcy5kaWQKQEAgLTAsMCArMSwzNyBAQAorZGljdF90czI5MTU0X2F2cHMKK2RpY3RfcmZjNjk0Ml9hdnBzCitkaWN0X3RzMjk0NjhfYXZwcworZGljdF90czI5MjE1X2F2cHMKK2RpY3RfdHMyOTIxN19hdnBzCitkaWN0XzNncHAyX2F2cHMKK2RpY3RfdHMyOTM0M19hdnBzCitkaWN0X3RzMjkzMzhfYXZwcworZGljdF90czI5MTI4X2F2cHMKK2RpY3RfdHMyOTM0NF9hdnBzCitkaWN0X3RzMjkzNDVfYXZwcworZGljdF90czMyMjk5X2F2cHMKK2RpY3RfcmZjNjczNF9hdnBzCitkaWN0X3JmYzU3NzhfYXZwcworZGljdF9yZmM1NTgwX2F2cHMKK2RpY3RfcmZjNDA3Ml9hdnBzCitkaWN0X3RzMjkyNzNfYXZwcworZGljdF90czI5MTczX2F2cHMKK2RpY3RfdHMyOTMzN19hdnBzCitkaWN0X2V0c2kyODMwMzRfYXZwcworZGljdF9yZmM0NTkwX2F2cHMKK2RpY3RfdHMyOTIyOV9hdnBzCitkaWN0X2RyYWZ0bG9hZF9hdnBzCitkaWN0X3RzMjkzMjlfYXZwcworZGljdF90czI5MzY4X2F2cHMKK2RpY3RfdHMyOTMzNl9hdnBzCitkaWN0X3RzMjkwNjFfYXZwcworZGljdF9yZmM1NDQ3X2F2cHMKK2RpY3RfdHMyOTI3Ml9hdnBzCitkaWN0X3JmYzc2ODNfYXZwcworZGljdF90czI5MjEyX2F2cHMKK2RpY3RfcmZjNTc3N19hdnBzCitkaWN0X3JmYzQwMDZiaXNfYXZwcworZGljdF9yZmM0MDA0X2F2cHMKK2RpY3RfcmZjNzE1NV9hdnBzCitkaWN0X3JmYzc5NDRfYXZwcworZGljdF90czI5MjE0X2F2cHMKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF90czI5MjE1X2F2cHMvQ01ha2VMaXN0cy50eHQgYi9leHRlbnNpb25zL2RpY3RfdHMyOTIxNV9hdnBzL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3Y2Q0ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfdHMyOTIxNV9hdnBzL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTYgQEAKKyMgVGhlIGRpY3RfdHMyOTIxNV9hdnBzIGV4dGVuc2lvbgorUFJPSkVDVCgiZGljdF90czI5MjE1X2F2cHMgbGlicmFyeSBnZW5lcmF0ZWQgYnkgRmRHZW4gIiBDKQorCisjIENvbXBpbGUgYXMgYSBtb2R1bGUKK0ZEX0FERF9FWFRFTlNJT04oZGljdF90czI5MjE1X2F2cHMgZGljdF90czI5MjE1X2F2cHMuYykKKworCisjIyMjCisjIyBJTlNUQUxMIHNlY3Rpb24gIyMKKworSU5TVEFMTChUQVJHRVRTIGRpY3RfdHMyOTIxNV9hdnBzCisJTElCUkFSWSBERVNUSU5BVElPTiAke0lOU1RBTExfRVhURU5TSU9OU19TVUZGSVh9CitDT01QT05FTlQgZnJlZURpYW1ldGVyLWRpY3Rpb25hcnktVFMyOTIxNV9BVlBTKQorCisKKwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X3RzMjkyMTVfYXZwcy9kaWN0X3RzMjkyMTVfYXZwcy5jIGIvZXh0ZW5zaW9ucy9kaWN0X3RzMjkyMTVfYXZwcy9kaWN0X3RzMjkyMTVfYXZwcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhM2YxZWMKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfdHMyOTIxNV9hdnBzL2RpY3RfdHMyOTIxNV9hdnBzLmMKQEAgLTAsMCArMSw0MTYgQEAKKy8qCisqIENvcHlyaWdodCAoYykgMjAxNyBTcHJpbnQKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLyoqKioqKioqKioqKioqKioKKyBHZW5lcmF0ZWQgQnk6IGZkdG9vbCBlbmhhbmNlbWVudHMgdG8gZGlhZnV6emVyCisgTGljZW5zZTogc2FtZSBhcyBmcmVlRGlhbWV0ZXIKKyoqKioqKioqKioqKioqKiovCisKKworLyogCisgKiBEaWN0aW9uYXJ5IGRlZmluaXRpb25zIG9mIG9iamVjdHMgc3BlY2lmaWVkIGluIHRzMjkyMTVfYXZwcyAoZTEwKS4KKyAqLworI2luY2x1ZGUgPGZyZWVEaWFtZXRlci9leHRlbnNpb24uaD4KKworI2RlZmluZSBQUk9UT19WRVIgImUxMCIKKyNkZWZpbmUgR0VOX0RBVEUgIDE1MDY2OTcxOTEuMzEKKworY29uc3QgY2hhciAqdHMyOTIxNV9hdnBzX3Byb3RvX3ZlciA9IFBST1RPX1ZFUjsKK2NvbnN0IGRvdWJsZSB0czI5MjE1X2F2cHNfZ2VuX2RhdGUgPSBHRU5fREFURTsKKworLyogVGhlIGNvbnRlbnQgb2YgdGhpcyBmaWxlIGZvbGxvd3MgdGhlIHNhbWUgc3RydWN0dXJlIGFzIGRpY3RfYmFzZV9wcm90by5jICovCisKKyNkZWZpbmUgQ0hFQ0tfZGljdF9uZXcoIF90eXBlLCBfZGF0YSwgX3BhcmVudCwgX3JlZiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgX3JldCA9IGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIChfdHlwZSksIChfZGF0YSksIChfcGFyZW50KSwgKF9yZWYpICk7IFwKKyAgICBpZiAoIF9yZXQgIT0gMCAmJiBfcmV0ICE9IEVFWElTVCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICByZXR1cm4gX3JldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBDSEVDS19kaWN0X3NlYXJjaCggX3R5cGUsIF9jcml0ZXJpYSwgX3doYXQsIF9yZXN1bHQgKQkJXAorICAgIENIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIChfdHlwZSksIChfY3JpdGVyaWEpLCAoX3doYXQpLCAoX3Jlc3VsdCksIEVOT0VOVCkgKTsKKworc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24geworICAgIHN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lOworICAgIGVudW0gcnVsZV9wb3NpdGlvbglwb3NpdGlvbjsKKyAgICBpbnQgCQkJbWluOworICAgIGludAkJCW1heDsKK307CisKKyNkZWZpbmUgUlVMRV9PUkRFUiggX3Bvc2l0aW9uICkgKCgoKF9wb3NpdGlvbikgPT0gUlVMRV9GSVhFRF9IRUFEKSB8fCAoKF9wb3NpdGlvbikgPT0gUlVMRV9GSVhFRF9UQUlMKSkgPyAxIDogMCApCisKKy8qIEF0dGVudGlvbiEgVGhpcyB2ZXJzaW9uIG9mIHRoZSBtYWNybyB1c2VzIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsIGluIGNvbnRyYXN0IHRvIG1vc3Qgb3RoZXIgY29waWVzISAqLworI2RlZmluZSBQQVJTRV9sb2NfcnVsZXMoIF9ydWxlYXJyYXksIF9wYXJlbnQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBfX2FyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yIChfX2FyPTA7IF9fYXIgPCBzaXplb2YoX3J1bGVhcnJheSkgLyBzaXplb2YoKF9ydWxlYXJyYXkpWzBdKTsgX19hcisrKSB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHN0cnVjdCBkaWN0X3J1bGVfZGF0YSBfX2RhdGEgPSB7IE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ucG9zaXRpb24sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLm1pbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ubWF4fTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfX2RhdGEucnVsZV9vcmRlciA9IFJVTEVfT1JERVIoX19kYXRhLnJ1bGVfcG9zaXRpb24pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIENIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIERJQ1RfQVZQLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAmKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICZfX2RhdGEucnVsZV9hdnAsIDAgKSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmICggIV9fZGF0YS5ydWxlX2F2cCApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9ERUJVRyhJTkZPLCAiQVZQIE5vdCBmb3VuZDogJyVzJyIsIChfcnVsZWFycmF5KVtfX2FyXS5hdnBfdmVuZG9yX3BsdXNfbmFtZS5hdnBfbmFtZSk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFTk9FTlQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgX3JldCA9IGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfUlVMRSwgJihfX2RhdGEpLCAoX3BhcmVudCksIE5VTEwgKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggX3JldCAhPSAwICYmIF9yZXQgIT0gRUVYSVNUICkgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFX0RFQlVHKElORk8sICJFcnJvciBvbiBydWxlIHdpdGggQVZQICclcyciLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLmF2cF9uYW1lKTsgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRUlOVkFMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgQ0hFQ0tfdmVuZG9yX25ldyggX2RhdGEgKSB7IFwKKyAgICAgICAgc3RydWN0IGRpY3Rfb2JqZWN0ICogdmVuZG9yX2ZvdW5kOyBcCisgICAgICAgIGlmIChmZF9kaWN0X3NlYXJjaChmZF9nX2NvbmZpZy0+Y25mX2RpY3QsRElDVF9WRU5ET1IsVkVORE9SX0JZX0lELCZfZGF0YS52ZW5kb3JfaWQsJnZlbmRvcl9mb3VuZCxFTk9FTlQpID09IEVOT0VOVCkgeyBcCisgICAgICAgICAgICAgICAgQ0hFQ0tfRkNUKGZkX2RpY3RfbmV3KGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9WRU5ET1IsICZfZGF0YSwgTlVMTCwgTlVMTCkpOyBcCisgICAgICAgIH0gXAorfQorCisjZGVmaW5lIGVudW12YWxfZGVmX3UzMiggX3ZhbF8sIF9zdHJfICkJCVwKKyAgICB7IF9zdHJfLCAJCXsgLnUzMiA9IF92YWxfIH19CisKKyNkZWZpbmUgZW51bXZhbF9kZWZfb3MoIF9sZW5fLCBfdmFsXywgX3N0cl8gKQkJCQlcCisgICAgeyBfc3RyXywgCQl7IC5vcyA9IHsgLmRhdGEgPSAodW5zaWduZWQgY2hhciAqKV92YWxfLCAubGVuID0gX2xlbl8gfX19CisKKworc3RhdGljIGludCBkaWN0X3RzMjkyMTVfYXZwc19sb2FkX2RlZnMoY2hhciAqIGNvbmZmaWxlKQoreworICAgVFJBQ0VfRU5UUlkoIiVwIiwgY29uZmZpbGUpOworCS8qIEFwcGxpY2F0aW9uIFNlY3Rpb24gKi8KKwl7CisJCS8qIENyZWF0ZSB0aGUgdmVuZG9ycyAqLwkJeworCQkJc3RydWN0IGRpY3RfdmVuZG9yX2RhdGEgdmVuZG9yX2RhdGEgPSB7IDEwNDE1LCAiM0dQUCIgfTsKKwkJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVkVORE9SLCAmdmVuZG9yX2RhdGEsIE5VTEwsIE5VTEwpCisJCX0KKwl9CisKKworICAgLyogQVZQIHNlY3Rpb24gKi8KKyAgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogQWRkcmVzc190eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBVVEY4U3RyaW5nX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIERpYW1ldGVySWRlbnRpdHlfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogRGlhbWV0ZXJVUklfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogVGltZV90eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBJUEZpbHRlclJ1bGVfdHlwZTsKKworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJBZGRyZXNzIiwgJkFkZHJlc3NfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIlVURjhTdHJpbmciLCAmVVRGOFN0cmluZ190eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiRGlhbWV0ZXJJZGVudGl0eSIsICZEaWFtZXRlcklkZW50aXR5X3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJEaWFtZXRlclVSSSIsICZEaWFtZXRlclVSSV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiVGltZSIsICZUaW1lX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJJUEZpbHRlclJ1bGUiLCAmSVBGaWx0ZXJSdWxlX3R5cGUpOworCQkvKiBEUkEtRGVwbG95bWVudCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTIyMDYsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkRSQS1EZXBsb3ltZW50IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChEUkEtRGVwbG95bWVudCkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIkRSQV9EZXBsb3llZCIsIHsgLmkzMj0wIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogTXVsdGlwbGUtQkJFUkYtQWN0aW9uICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjIwNCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTXVsdGlwbGUtQkJFUkYtQWN0aW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChNdWx0aXBsZS1CQkVSRi1BY3Rpb24pIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJFU1RBQkxJU0hNRU5UIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIlRFUk1JTkFUSU9OIiwgeyAuaTMyPTEgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFN1YnNlc3Npb24tSWQgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyMjAyLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTdWJzZXNzaW9uLUlkIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBTdWJzZXNzaW9uLU9wZXJhdGlvbiAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTIyMDMsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlN1YnNlc3Npb24tT3BlcmF0aW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChTdWJzZXNzaW9uLU9wZXJhdGlvbikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIlRFUk1JTkFUSU9OIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIkVTVEFCTElTSE1FTlQiLCB7IC5pMzI9MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAiTU9ESUZJQ0FUSU9OIiwgeyAuaTMyPTIgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogRFJBLUJpbmRpbmcgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyMjA4LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJEUkEtQmluZGluZyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoRFJBLUJpbmRpbmcpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJEUkFfQklORElOR19ERUxFVElPTiIsIHsgLmkzMj0wIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogUENSRi1BZGRyZXNzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjIwNywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUENSRi1BZGRyZXNzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBEaWFtZXRlcklkZW50aXR5X3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBVRS1Mb2NhbC1JUHY2LVByZWZpeCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTIyMDUsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlVFLUxvY2FsLUlQdjYtUHJlZml4IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogU3Vic2Vzc2lvbi1FbmZvcmNlbWVudC1JbmZvICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjIwMSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiU3Vic2Vzc2lvbi1FbmZvcmNlbWVudC1JbmZvIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBTdWJzZXNzaW9uLURlY2lzaW9uLUluZm8gKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyMjAwLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTdWJzZXNzaW9uLURlY2lzaW9uLUluZm8iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisKKwkKKyAgIH0KKworICAgLyogQ29tbWFuZHMgc2VjdGlvbiAqLworICAgeworCisgICB9CisKKyAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRpY3RfdHMyOTIxNV9hdnBzX2xvYWRfcnVsZXMoY2hhciAqIGNvbmZmaWxlKQoreworICAgLyogR3JvdXBlZCBBVlAgc2VjdGlvbiAqLworICAgeworCSAgLyogU3Vic2Vzc2lvbi1FbmZvcmNlbWVudC1JbmZvICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTdWJzZXNzaW9uLUVuZm9yY2VtZW50LUluZm8ifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlN1YnNlc3Npb24tSWQifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlN1YnNlc3Npb24tT3BlcmF0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBTi1HVy1BZGRyZXNzIn0sIFJVTEVfT1BUSU9OQUwsIDAsIDIgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQmVhcmVyLUlkZW50aWZpZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkJlYXJlci1PcGVyYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlBhY2tldC1GaWx0ZXItSW5mb3JtYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlBhY2tldC1GaWx0ZXItT3BlcmF0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJRb1MtSW5mb3JtYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRnJhbWVkLUlQLUFkZHJlc3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRnJhbWVkLUlQdjYtUHJlZml4In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDb0EtSW5mb3JtYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQ2FsbGVkLVN0YXRpb24tSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlBETi1Db25uZWN0aW9uLUlEIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJCZWFyZXItVXNhZ2UifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlRGVC1QYWNrZXQtRmlsdGVyLUluZm9ybWF0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJPbmxpbmUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk9mZmxpbmUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiUmVzdWx0LUNvZGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRXhwZXJpbWVudGFsLVJlc3VsdC1Db2RlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDaGFyZ2luZy1SdWxlLVJlcG9ydCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ3JlZGl0LU1hbmFnZW1lbnQtU3RhdHVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJRb1MtUnVsZS1SZXBvcnQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFwcGxpY2F0aW9uLURldGVjdGlvbi1JbmZvcm1hdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiSVAtQ0FOLVR5cGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJBVC1UeXBlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICIzR1BQLVNHU04tTUNDLU1OQyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiM0dQUC1TR1NOLUFkZHJlc3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIjNHUFAtU0dTTi1JcHY2LUFkZHJlc3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJBSSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiM0dQUC1Vc2VyLUxvY2F0aW9uLUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSA1NTM1LCAuYXZwX25hbWUgPSAiM0dQUDItQlNJRCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVXNlci1DU0ctSW5mb3JtYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkRlZmF1bHQtRVBTLUJlYXJlci1Rb1MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkRlZmF1bHQtQWNjZXNzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJOQklGT00tU3VwcG9ydCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTkJJRk9NLU1vZGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFjY2Vzcy1BdmFpbGFiaWxpdHktQ2hhbmdlLVJlYXNvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTmV0d29yay1SZXF1ZXN0LVN1cHBvcnQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJvdXRpbmctUnVsZS1JbnN0YWxsIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJSb3V0aW5nLVJ1bGUtUmVtb3ZlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJVc2VyLUxvY2F0aW9uLUluZm8tVGltZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEzMDE5LCAuYXZwX25hbWUgPSAiTG9naWNhbC1BY2Nlc3MtSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMzAxOSwgLmF2cF9uYW1lID0gIlBoeXNpY2FsLUFjY2Vzcy1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVXNhZ2UtTW9uaXRvcmluZy1JbmZvcm1hdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTXVsdGlwbGUtQkJFUkYtQWN0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJFdmVudC1UcmlnZ2VyIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBY2Nlc3MtTmV0d29yay1DaGFyZ2luZy1BZGRyZXNzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBY2Nlc3MtTmV0d29yay1DaGFyZ2luZy1JZGVudGlmaWVyLUd4In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTZXNzaW9uLUxpbmtpbmctSW5kaWNhdG9yIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJIZU5CLUxvY2FsLUlQLUFkZHJlc3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlVFLUxvY2FsLUlQLUFkZHJlc3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlVFLUxvY2FsLUlQdjYtUHJlZml4In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJVRFAtU291cmNlLVBvcnQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFOLUdXLVN0YXR1cyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIFN1YnNlc3Npb24tRGVjaXNpb24tSW5mbyAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU3Vic2Vzc2lvbi1EZWNpc2lvbi1JbmZvIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTdWJzZXNzaW9uLUlkIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBTi1HVy1BZGRyZXNzIn0sIFJVTEVfT1BUSU9OQUwsIDAsIDIgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSZXN1bHQtQ29kZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJFeHBlcmltZW50YWwtUmVzdWx0LUNvZGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNoYXJnaW5nLVJ1bGUtUmVtb3ZlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDaGFyZ2luZy1SdWxlLUluc3RhbGwifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkV2ZW50LVJlcG9ydC1JbmRpY2F0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJRb1MtUnVsZS1JbnN0YWxsIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJRb1MtUnVsZS1SZW1vdmUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkRlZmF1bHQtRVBTLUJlYXJlci1Rb1MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRnJhbWVkLUlQdjYtUHJlZml4In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJVc2FnZS1Nb25pdG9yaW5nLUluZm9ybWF0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTZXNzaW9uLVJlbGVhc2UtQ2F1c2UifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkJlYXJlci1Db250cm9sLU1vZGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkV2ZW50LVRyaWdnZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJldmFsaWRhdGlvbi1UaW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJEZWZhdWx0LUFjY2VzcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTkJJRk9NLVN1cHBvcnQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk5CSUZPTS1Nb2RlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJSQU4tUnVsZS1TdXBwb3J0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJSb3V0aW5nLVJ1bGUtUmVwb3J0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJSZW1vdmFsLU9mLUFjY2VzcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiSVAtQ0FOLVR5cGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk9ubGluZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiT2ZmbGluZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUW9TLUluZm9ybWF0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCisgICB9CQorCisgICAvKiBDb21tYW5kcyBzZWN0aW9uICovCisgICB7CisKKyAgIH0KKworICAgTE9HX0QoICJFeHRlbnNpb24gJ0RpY3Rpb25hcnkgZGVmaW5pdGlvbnMgZm9yIHRzMjkyMTVfYXZwcyAoZTEwKScgaW5pdGlhbGl6ZWQiKTsKKyAgIHJldHVybiAwOworfQorCitpbnQgZGljdF9lbnRyeShjaGFyICogY29uZmZpbGUpCit7CisJZGljdF90czI5MjE1X2F2cHNfbG9hZF9kZWZzKGNvbmZmaWxlKTsKKwlyZXR1cm4gZGljdF90czI5MjE1X2F2cHNfbG9hZF9ydWxlcyhjb25mZmlsZSk7Cit9CisKK2NvbnN0IGNoYXIqIGRpY3RfdHMyOTIxNV9hdnBzX3Byb3RvX3ZlcihjaGFyICogY29uZmZpbGUpIHsKKwlyZXR1cm4gdHMyOTIxNV9hdnBzX3Byb3RvX3ZlcjsKK30KKworY29uc3QgZG91YmxlIGRpY3RfdHMyOTIxNV9hdnBzX2dlbl90cyhjaGFyICogY29uZmZpbGUpIHsKKwlyZXR1cm4gdHMyOTIxNV9hdnBzX2dlbl9kYXRlOworfQorCitFWFRFTlNJT05fRU5UUlkyKCJkaWN0X3RzMjkyMTVfYXZwcyIsIGRpY3RfdHMyOTIxNV9hdnBzX2xvYWRfZGVmcywgZGljdF90czI5MjE1X2F2cHNfbG9hZF9ydWxlcywgImRpY3RfdHMzMjI5OV9hdnBzIiwgImRpY3RfdHMyOTIxMl9hdnBzIiwgImRpY3RfdHMyOTIxNF9hdnBzIiwgImRpY3RfdHMyOTIyOV9hdnBzIiwgImRpY3RfdHMyOTA2MV9hdnBzIiwgImRpY3RfcmZjNDAwNmJpc19hdnBzIiwgImRpY3RfZHJhZnRsb2FkX2F2cHMiLCAiZGljdF9yZmM3NjgzX2F2cHMiLCAiZGljdF9yZmM3MTU1X2F2cHMiLCAiZGljdF9ldHNpMjgzMDM0X2F2cHMiLCAiZGljdF8zZ3BwMl9hdnBzIiwgImRpY3RfcmZjNzk0NF9hdnBzIik7CisKKworCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfdHMyOTIxNV9hdnBzL3RzMjkyMTVfYXZwcy5kaWQgYi9leHRlbnNpb25zL2RpY3RfdHMyOTIxNV9hdnBzL3RzMjkyMTVfYXZwcy5kaWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI4N2I4MgotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF90czI5MjE1X2F2cHMvdHMyOTIxNV9hdnBzLmRpZApAQCAtMCwwICsxLDM3IEBACitkaWN0X3JmYzY5NDJfYXZwcworZGljdF90czI5MTU0X2F2cHMKK2RpY3RfdHMyOTIxNF9hdnBzCitkaWN0X3RzMjk0NjhfYXZwcworZGljdF90czI5MjE3X2F2cHMKK2RpY3RfM2dwcDJfYXZwcworZGljdF90czI5MzQzX2F2cHMKK2RpY3RfdHMyOTMzOF9hdnBzCitkaWN0X3RzMjkxMjhfYXZwcworZGljdF90czI5MzQ0X2F2cHMKK2RpY3RfdHMyOTM0NV9hdnBzCitkaWN0X3RzMzIyOTlfYXZwcworZGljdF9yZmM2NzM0X2F2cHMKK2RpY3RfcmZjNTc3OF9hdnBzCitkaWN0X3JmYzU1ODBfYXZwcworZGljdF9yZmM0MDcyX2F2cHMKK2RpY3RfdHMyOTI3M19hdnBzCitkaWN0X3RzMjkxNzNfYXZwcworZGljdF90czI5MzM3X2F2cHMKK2RpY3RfZXRzaTI4MzAzNF9hdnBzCitkaWN0X3JmYzQ1OTBfYXZwcworZGljdF90czI5MjI5X2F2cHMKK2RpY3RfZHJhZnRsb2FkX2F2cHMKK2RpY3RfdHMyOTMyOV9hdnBzCitkaWN0X3RzMjkzNjhfYXZwcworZGljdF90czI5MzM2X2F2cHMKK2RpY3RfdHMyOTA2MV9hdnBzCitkaWN0X3JmYzU0NDdfYXZwcworZGljdF90czI5MjcyX2F2cHMKK2RpY3RfcmZjNzY4M19hdnBzCitkaWN0X3JmYzc5NDRfYXZwcworZGljdF90czI5MjEyX2F2cHMKK2RpY3RfcmZjNTc3N19hdnBzCitkaWN0X3JmYzQwMDZiaXNfYXZwcworZGljdF9yZmM0MDA0X2F2cHMKK2RpY3RfcmZjNzE1NV9hdnBzCitkaWN0X3RzMjkyMTVfYXZwcwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X3RzMjkyMTdfYXZwcy9DTWFrZUxpc3RzLnR4dCBiL2V4dGVuc2lvbnMvZGljdF90czI5MjE3X2F2cHMvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhhMDA0YgotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF90czI5MjE3X2F2cHMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxNiBAQAorIyBUaGUgZGljdF90czI5MjE3X2F2cHMgZXh0ZW5zaW9uCitQUk9KRUNUKCJkaWN0X3RzMjkyMTdfYXZwcyBsaWJyYXJ5IGdlbmVyYXRlZCBieSBGZEdlbiAiIEMpCisKKyMgQ29tcGlsZSBhcyBhIG1vZHVsZQorRkRfQUREX0VYVEVOU0lPTihkaWN0X3RzMjkyMTdfYXZwcyBkaWN0X3RzMjkyMTdfYXZwcy5jKQorCisKKyMjIyMKKyMjIElOU1RBTEwgc2VjdGlvbiAjIworCitJTlNUQUxMKFRBUkdFVFMgZGljdF90czI5MjE3X2F2cHMKKwlMSUJSQVJZIERFU1RJTkFUSU9OICR7SU5TVEFMTF9FWFRFTlNJT05TX1NVRkZJWH0KK0NPTVBPTkVOVCBmcmVlRGlhbWV0ZXItZGljdGlvbmFyeS1UUzI5MjE3X0FWUFMpCisKKworCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfdHMyOTIxN19hdnBzL2RpY3RfdHMyOTIxN19hdnBzLmMgYi9leHRlbnNpb25zL2RpY3RfdHMyOTIxN19hdnBzL2RpY3RfdHMyOTIxN19hdnBzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNiOWZhNgotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF90czI5MjE3X2F2cHMvZGljdF90czI5MjE3X2F2cHMuYwpAQCAtMCwwICsxLDQwMyBAQAorLyoKKyogQ29weXJpZ2h0IChjKSAyMDE3IFNwcmludAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvKioqKioqKioqKioqKioqKgorIEdlbmVyYXRlZCBCeTogZmR0b29sIGVuaGFuY2VtZW50cyB0byBkaWFmdXp6ZXIKKyBMaWNlbnNlOiBzYW1lIGFzIGZyZWVEaWFtZXRlcgorKioqKioqKioqKioqKioqKi8KKworCisvKiAKKyAqIERpY3Rpb25hcnkgZGVmaW5pdGlvbnMgb2Ygb2JqZWN0cyBzcGVjaWZpZWQgaW4gdHMyOTIxN19hdnBzIChlMTApLgorICovCisjaW5jbHVkZSA8ZnJlZURpYW1ldGVyL2V4dGVuc2lvbi5oPgorCisjZGVmaW5lIFBST1RPX1ZFUiAiZTEwIgorI2RlZmluZSBHRU5fREFURSAgMTUwNjY5NzE3NS4zMQorCitjb25zdCBjaGFyICp0czI5MjE3X2F2cHNfcHJvdG9fdmVyID0gUFJPVE9fVkVSOworY29uc3QgZG91YmxlIHRzMjkyMTdfYXZwc19nZW5fZGF0ZSA9IEdFTl9EQVRFOworCisvKiBUaGUgY29udGVudCBvZiB0aGlzIGZpbGUgZm9sbG93cyB0aGUgc2FtZSBzdHJ1Y3R1cmUgYXMgZGljdF9iYXNlX3Byb3RvLmMgKi8KKworI2RlZmluZSBDSEVDS19kaWN0X25ldyggX3R5cGUsIF9kYXRhLCBfcGFyZW50LCBfcmVmICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBfcmV0ID0gZmRfZGljdF9uZXcoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgKF90eXBlKSwgKF9kYXRhKSwgKF9wYXJlbnQpLCAoX3JlZikgKTsgXAorICAgIGlmICggX3JldCAhPSAwICYmIF9yZXQgIT0gRUVYSVNUICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHJldHVybiBfcmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIENIRUNLX2RpY3Rfc2VhcmNoKCBfdHlwZSwgX2NyaXRlcmlhLCBfd2hhdCwgX3Jlc3VsdCApCQlcCisgICAgQ0hFQ0tfRkNUKCAgZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgKF90eXBlKSwgKF9jcml0ZXJpYSksIChfd2hhdCksIChfcmVzdWx0KSwgRU5PRU5UKSApOworCitzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiB7CisgICAgc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWU7CisgICAgZW51bSBydWxlX3Bvc2l0aW9uCXBvc2l0aW9uOworICAgIGludCAJCQltaW47CisgICAgaW50CQkJbWF4OworfTsKKworI2RlZmluZSBSVUxFX09SREVSKCBfcG9zaXRpb24gKSAoKCgoX3Bvc2l0aW9uKSA9PSBSVUxFX0ZJWEVEX0hFQUQpIHx8ICgoX3Bvc2l0aW9uKSA9PSBSVUxFX0ZJWEVEX1RBSUwpKSA/IDEgOiAwICkKKworLyogQXR0ZW50aW9uISBUaGlzIHZlcnNpb24gb2YgdGhlIG1hY3JvIHVzZXMgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgaW4gY29udHJhc3QgdG8gbW9zdCBvdGhlciBjb3BpZXMhICovCisjZGVmaW5lIFBBUlNFX2xvY19ydWxlcyggX3J1bGVhcnJheSwgX3BhcmVudCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IF9fYXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKF9fYXI9MDsgX19hciA8IHNpemVvZihfcnVsZWFycmF5KSAvIHNpemVvZigoX3J1bGVhcnJheSlbMF0pOyBfX2FyKyspIHsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgc3RydWN0IGRpY3RfcnVsZV9kYXRhIF9fZGF0YSA9IHsgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5wb3NpdGlvbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ubWluLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5tYXh9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIF9fZGF0YS5ydWxlX29yZGVyID0gUlVMRV9PUkRFUihfX2RhdGEucnVsZV9wb3NpdGlvbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgQ0hFQ0tfRkNUKCAgZmRfZGljdF9zZWFyY2goICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgRElDVF9BVlAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICYoX3J1bGVhcnJheSlbX19hcl0uYXZwX3ZlbmRvcl9wbHVzX25hbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgJl9fZGF0YS5ydWxlX2F2cCwgMCApICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYgKCAhX19kYXRhLnJ1bGVfYXZwICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFX0RFQlVHKElORk8sICJBVlAgTm90IGZvdW5kOiAnJXMnIiwgKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLmF2cF9uYW1lKTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVOT0VOVDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBfcmV0ID0gZmRfZGljdF9uZXcoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9SVUxFLCAmKF9fZGF0YSksIChfcGFyZW50KSwgTlVMTCApOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBfcmV0ICE9IDAgJiYgX3JldCAhPSBFRVhJU1QgKSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfREVCVUcoSU5GTywgIkVycm9yIG9uIHJ1bGUgd2l0aCBBVlAgJyVzJyIsICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0uYXZwX3ZlbmRvcl9wbHVzX25hbWUuYXZwX25hbWUpOyAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFSU5WQUw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBDSEVDS192ZW5kb3JfbmV3KCBfZGF0YSApIHsgXAorICAgICAgICBzdHJ1Y3QgZGljdF9vYmplY3QgKiB2ZW5kb3JfZm91bmQ7IFwKKyAgICAgICAgaWYgKGZkX2RpY3Rfc2VhcmNoKGZkX2dfY29uZmlnLT5jbmZfZGljdCxESUNUX1ZFTkRPUixWRU5ET1JfQllfSUQsJl9kYXRhLnZlbmRvcl9pZCwmdmVuZG9yX2ZvdW5kLEVOT0VOVCkgPT0gRU5PRU5UKSB7IFwKKyAgICAgICAgICAgICAgICBDSEVDS19GQ1QoZmRfZGljdF9uZXcoZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1ZFTkRPUiwgJl9kYXRhLCBOVUxMLCBOVUxMKSk7IFwKKyAgICAgICAgfSBcCit9CisKKyNkZWZpbmUgZW51bXZhbF9kZWZfdTMyKCBfdmFsXywgX3N0cl8gKQkJXAorICAgIHsgX3N0cl8sIAkJeyAudTMyID0gX3ZhbF8gfX0KKworI2RlZmluZSBlbnVtdmFsX2RlZl9vcyggX2xlbl8sIF92YWxfLCBfc3RyXyApCQkJCVwKKyAgICB7IF9zdHJfLCAJCXsgLm9zID0geyAuZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopX3ZhbF8sIC5sZW4gPSBfbGVuXyB9fX0KKworCitzdGF0aWMgaW50IGRpY3RfdHMyOTIxN19hdnBzX2xvYWRfZGVmcyhjaGFyICogY29uZmZpbGUpCit7CisgICBUUkFDRV9FTlRSWSgiJXAiLCBjb25mZmlsZSk7CisJLyogQXBwbGljYXRpb24gU2VjdGlvbiAqLworCXsKKwkJLyogQ3JlYXRlIHRoZSB2ZW5kb3JzICovCQl7CisJCQlzdHJ1Y3QgZGljdF92ZW5kb3JfZGF0YSB2ZW5kb3JfZGF0YSA9IHsgMTA0MTUsICIzR1BQIiB9OworCQkJQ0hFQ0tfZGljdF9uZXcoRElDVF9WRU5ET1IsICZ2ZW5kb3JfZGF0YSwgTlVMTCwgTlVMTCkKKwkJfQorCX0KKworCisgICAvKiBBVlAgc2VjdGlvbiAqLworICAgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBBZGRyZXNzX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIFVURjhTdHJpbmdfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogRGlhbWV0ZXJJZGVudGl0eV90eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBEaWFtZXRlclVSSV90eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBUaW1lX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIElQRmlsdGVyUnVsZV90eXBlOworCisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkFkZHJlc3MiLCAmQWRkcmVzc190eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiVVRGOFN0cmluZyIsICZVVEY4U3RyaW5nX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJEaWFtZXRlcklkZW50aXR5IiwgJkRpYW1ldGVySWRlbnRpdHlfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkRpYW1ldGVyVVJJIiwgJkRpYW1ldGVyVVJJX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJUaW1lIiwgJlRpbWVfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIklQRmlsdGVyUnVsZSIsICZJUEZpbHRlclJ1bGVfdHlwZSk7CisJCS8qIENvbmdlc3Rpb24tTGV2ZWwtUmFuZ2UgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk0MDAzLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJDb25nZXN0aW9uLUxldmVsLVJhbmdlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBDb25nZXN0aW9uLUxldmVsLVNldC1JZCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTQwMDQsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkNvbmdlc3Rpb24tTGV2ZWwtU2V0LUlkIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBDb25nZXN0aW9uLUxldmVsLVZhbHVlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNDAwNSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQ29uZ2VzdGlvbi1MZXZlbC1WYWx1ZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogQ29uZGl0aW9uYWwtUmVzdHJpY3Rpb24gKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk0MDA3LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJDb25kaXRpb25hbC1SZXN0cmljdGlvbiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogZU5vZGVCLUlkICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNDAwOCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiZU5vZGVCLUlkIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogSU1TSS1MaXN0ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNDAwOSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiSU1TSS1MaXN0IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogUkNBRi1JZCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTQwMTAsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlJDQUYtSWQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIERpYW1ldGVySWRlbnRpdHlfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFJlcG9ydGluZy1SZXN0cmljdGlvbiAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTQwMTEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlJlcG9ydGluZy1SZXN0cmljdGlvbiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogUlVDSS1BY3Rpb24gKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk0MDEyLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJSVUNJLUFjdGlvbiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogRXh0ZW5kZWQtZU5vZGVCLUlkICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNDAxMywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiRXh0ZW5kZWQtZU5vZGVCLUlkIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogQ29uZ2VzdGlvbi1MZXZlbC1EZWZpbml0aW9uICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNDAwMiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQ29uZ2VzdGlvbi1MZXZlbC1EZWZpbml0aW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBDb25nZXN0aW9uLUxvY2F0aW9uLUlkICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNDAwNiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQ29uZ2VzdGlvbi1Mb2NhdGlvbi1JZCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogQWdncmVnYXRlZC1Db25nZXN0aW9uLUluZm8gKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk0MDAwLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJBZ2dyZWdhdGVkLUNvbmdlc3Rpb24tSW5mbyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogQWdncmVnYXRlZC1SVUNJLVJlcG9ydCAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTQwMDEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkFnZ3JlZ2F0ZWQtUlVDSS1SZXBvcnQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisKKwkKKyAgIH0KKworICAgLyogQ29tbWFuZHMgc2VjdGlvbiAqLworICAgeworCisgICB9CisKKyAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRpY3RfdHMyOTIxN19hdnBzX2xvYWRfcnVsZXMoY2hhciAqIGNvbmZmaWxlKQoreworICAgLyogR3JvdXBlZCBBVlAgc2VjdGlvbiAqLworICAgeworCSAgLyogQ29uZ2VzdGlvbi1MZXZlbC1EZWZpbml0aW9uICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDb25nZXN0aW9uLUxldmVsLURlZmluaXRpb24ifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNvbmdlc3Rpb24tTGV2ZWwtU2V0LUlkIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDb25nZXN0aW9uLUxldmVsLVJhbmdlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogQ29uZ2VzdGlvbi1Mb2NhdGlvbi1JZCAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ29uZ2VzdGlvbi1Mb2NhdGlvbi1JZCJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiM0dQUC1Vc2VyLUxvY2F0aW9uLUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gImVOb2RlQi1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRXh0ZW5kZWQtZU5vZGVCLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogQWdncmVnYXRlZC1Db25nZXN0aW9uLUluZm8gKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFnZ3JlZ2F0ZWQtQ29uZ2VzdGlvbi1JbmZvIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDb25nZXN0aW9uLUxvY2F0aW9uLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJJTVNJLUxpc3QifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBBZ2dyZWdhdGVkLVJVQ0ktUmVwb3J0ICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBZ2dyZWdhdGVkLVJVQ0ktUmVwb3J0In07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBZ2dyZWdhdGVkLUNvbmdlc3Rpb24tSW5mbyJ9LCBSVUxFX1JFUVVJUkVELCAxLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkNhbGxlZC1TdGF0aW9uLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDb25nZXN0aW9uLUxldmVsLVZhbHVlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDb25nZXN0aW9uLUxldmVsLVNldC1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKworICAgfQkKKworICAgLyogQ29tbWFuZHMgc2VjdGlvbiAqLworICAgeworCisgICB9CisKKyAgIExPR19EKCAiRXh0ZW5zaW9uICdEaWN0aW9uYXJ5IGRlZmluaXRpb25zIGZvciB0czI5MjE3X2F2cHMgKGUxMCknIGluaXRpYWxpemVkIik7CisgICByZXR1cm4gMDsKK30KKworaW50IGRpY3RfZW50cnkoY2hhciAqIGNvbmZmaWxlKQoreworCWRpY3RfdHMyOTIxN19hdnBzX2xvYWRfZGVmcyhjb25mZmlsZSk7CisJcmV0dXJuIGRpY3RfdHMyOTIxN19hdnBzX2xvYWRfcnVsZXMoY29uZmZpbGUpOworfQorCitjb25zdCBjaGFyKiBkaWN0X3RzMjkyMTdfYXZwc19wcm90b192ZXIoY2hhciAqIGNvbmZmaWxlKSB7CisJcmV0dXJuIHRzMjkyMTdfYXZwc19wcm90b192ZXI7Cit9CisKK2NvbnN0IGRvdWJsZSBkaWN0X3RzMjkyMTdfYXZwc19nZW5fdHMoY2hhciAqIGNvbmZmaWxlKSB7CisJcmV0dXJuIHRzMjkyMTdfYXZwc19nZW5fZGF0ZTsKK30KKworRVhURU5TSU9OX0VOVFJZMigiZGljdF90czI5MjE3X2F2cHMiLCBkaWN0X3RzMjkyMTdfYXZwc19sb2FkX2RlZnMsIGRpY3RfdHMyOTIxN19hdnBzX2xvYWRfcnVsZXMsICJkaWN0X3RzMjkyMTVfYXZwcyIsICJkaWN0X3RzMjkyMjlfYXZwcyIsICJkaWN0X3RzMjkwNjFfYXZwcyIsICJkaWN0X3JmYzQwMDZiaXNfYXZwcyIsICJkaWN0X2RyYWZ0bG9hZF9hdnBzIiwgImRpY3RfcmZjNzY4M19hdnBzIiwgImRpY3RfcmZjNzk0NF9hdnBzIiwgImRpY3RfcmZjNzE1NV9hdnBzIik7CisKKworCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfdHMyOTIxN19hdnBzL3RzMjkyMTdfYXZwcy5kaWQgYi9leHRlbnNpb25zL2RpY3RfdHMyOTIxN19hdnBzL3RzMjkyMTdfYXZwcy5kaWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBlOTZhYQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF90czI5MjE3X2F2cHMvdHMyOTIxN19hdnBzLmRpZApAQCAtMCwwICsxLDM3IEBACitkaWN0X3JmYzY5NDJfYXZwcworZGljdF90czI5MTU0X2F2cHMKK2RpY3RfdHMyOTIxNF9hdnBzCitkaWN0X3RzMjk0NjhfYXZwcworZGljdF8zZ3BwMl9hdnBzCitkaWN0X3RzMjkzNDNfYXZwcworZGljdF90czI5MzM4X2F2cHMKK2RpY3RfdHMyOTEyOF9hdnBzCitkaWN0X3RzMjkzNDRfYXZwcworZGljdF90czI5MzQ1X2F2cHMKK2RpY3RfdHMzMjI5OV9hdnBzCitkaWN0X3JmYzY3MzRfYXZwcworZGljdF9yZmM1Nzc4X2F2cHMKK2RpY3RfcmZjNTU4MF9hdnBzCitkaWN0X3JmYzQwNzJfYXZwcworZGljdF90czI5MjczX2F2cHMKK2RpY3RfdHMyOTE3M19hdnBzCitkaWN0X3RzMjkzMzdfYXZwcworZGljdF9ldHNpMjgzMDM0X2F2cHMKK2RpY3RfcmZjNDU5MF9hdnBzCitkaWN0X3RzMjkyMjlfYXZwcworZGljdF9kcmFmdGxvYWRfYXZwcworZGljdF90czI5MzI5X2F2cHMKK2RpY3RfdHMyOTM2OF9hdnBzCitkaWN0X3RzMjkzMzZfYXZwcworZGljdF90czI5MDYxX2F2cHMKK2RpY3RfcmZjNTQ0N19hdnBzCitkaWN0X3RzMjkyNzJfYXZwcworZGljdF90czI5MjEyX2F2cHMKK2RpY3RfdHMyOTIxNV9hdnBzCitkaWN0X3JmYzc2ODNfYXZwcworZGljdF9yZmM3OTQ0X2F2cHMKK2RpY3RfcmZjNTc3N19hdnBzCitkaWN0X3JmYzQwMDZiaXNfYXZwcworZGljdF9yZmM0MDA0X2F2cHMKK2RpY3RfcmZjNzE1NV9hdnBzCitkaWN0X3RzMjkyMTdfYXZwcwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X3RzMjkyMjlfYXZwcy9DTWFrZUxpc3RzLnR4dCBiL2V4dGVuc2lvbnMvZGljdF90czI5MjI5X2F2cHMvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBmYzY5MgotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF90czI5MjI5X2F2cHMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxNiBAQAorIyBUaGUgZGljdF90czI5MjI5X2F2cHMgZXh0ZW5zaW9uCitQUk9KRUNUKCJkaWN0X3RzMjkyMjlfYXZwcyBsaWJyYXJ5IGdlbmVyYXRlZCBieSBGZEdlbiAiIEMpCisKKyMgQ29tcGlsZSBhcyBhIG1vZHVsZQorRkRfQUREX0VYVEVOU0lPTihkaWN0X3RzMjkyMjlfYXZwcyBkaWN0X3RzMjkyMjlfYXZwcy5jKQorCisKKyMjIyMKKyMjIElOU1RBTEwgc2VjdGlvbiAjIworCitJTlNUQUxMKFRBUkdFVFMgZGljdF90czI5MjI5X2F2cHMKKwlMSUJSQVJZIERFU1RJTkFUSU9OICR7SU5TVEFMTF9FWFRFTlNJT05TX1NVRkZJWH0KK0NPTVBPTkVOVCBmcmVlRGlhbWV0ZXItZGljdGlvbmFyeS1UUzI5MjI5X0FWUFMpCisKKworCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfdHMyOTIyOV9hdnBzL2RpY3RfdHMyOTIyOV9hdnBzLmMgYi9leHRlbnNpb25zL2RpY3RfdHMyOTIyOV9hdnBzL2RpY3RfdHMyOTIyOV9hdnBzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhiZWIxOQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF90czI5MjI5X2F2cHMvZGljdF90czI5MjI5X2F2cHMuYwpAQCAtMCwwICsxLDEyMDYgQEAKKy8qCisqIENvcHlyaWdodCAoYykgMjAxNyBTcHJpbnQKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLyoqKioqKioqKioqKioqKioKKyBHZW5lcmF0ZWQgQnk6IGZkdG9vbCBlbmhhbmNlbWVudHMgdG8gZGlhZnV6emVyCisgTGljZW5zZTogc2FtZSBhcyBmcmVlRGlhbWV0ZXIKKyoqKioqKioqKioqKioqKiovCisKKworLyogCisgKiBEaWN0aW9uYXJ5IGRlZmluaXRpb25zIG9mIG9iamVjdHMgc3BlY2lmaWVkIGluIHRzMjkyMjlfYXZwcyAoZTEwKS4KKyAqLworI2luY2x1ZGUgPGZyZWVEaWFtZXRlci9leHRlbnNpb24uaD4KKworI2RlZmluZSBQUk9UT19WRVIgImUxMCIKKyNkZWZpbmUgR0VOX0RBVEUgIDE1MDY2OTcxNjguOAorCitjb25zdCBjaGFyICp0czI5MjI5X2F2cHNfcHJvdG9fdmVyID0gUFJPVE9fVkVSOworY29uc3QgZG91YmxlIHRzMjkyMjlfYXZwc19nZW5fZGF0ZSA9IEdFTl9EQVRFOworCisvKiBUaGUgY29udGVudCBvZiB0aGlzIGZpbGUgZm9sbG93cyB0aGUgc2FtZSBzdHJ1Y3R1cmUgYXMgZGljdF9iYXNlX3Byb3RvLmMgKi8KKworI2RlZmluZSBDSEVDS19kaWN0X25ldyggX3R5cGUsIF9kYXRhLCBfcGFyZW50LCBfcmVmICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBfcmV0ID0gZmRfZGljdF9uZXcoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgKF90eXBlKSwgKF9kYXRhKSwgKF9wYXJlbnQpLCAoX3JlZikgKTsgXAorICAgIGlmICggX3JldCAhPSAwICYmIF9yZXQgIT0gRUVYSVNUICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHJldHVybiBfcmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIENIRUNLX2RpY3Rfc2VhcmNoKCBfdHlwZSwgX2NyaXRlcmlhLCBfd2hhdCwgX3Jlc3VsdCApCQlcCisgICAgQ0hFQ0tfRkNUKCAgZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgKF90eXBlKSwgKF9jcml0ZXJpYSksIChfd2hhdCksIChfcmVzdWx0KSwgRU5PRU5UKSApOworCitzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiB7CisgICAgc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWU7CisgICAgZW51bSBydWxlX3Bvc2l0aW9uCXBvc2l0aW9uOworICAgIGludCAJCQltaW47CisgICAgaW50CQkJbWF4OworfTsKKworI2RlZmluZSBSVUxFX09SREVSKCBfcG9zaXRpb24gKSAoKCgoX3Bvc2l0aW9uKSA9PSBSVUxFX0ZJWEVEX0hFQUQpIHx8ICgoX3Bvc2l0aW9uKSA9PSBSVUxFX0ZJWEVEX1RBSUwpKSA/IDEgOiAwICkKKworLyogQXR0ZW50aW9uISBUaGlzIHZlcnNpb24gb2YgdGhlIG1hY3JvIHVzZXMgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgaW4gY29udHJhc3QgdG8gbW9zdCBvdGhlciBjb3BpZXMhICovCisjZGVmaW5lIFBBUlNFX2xvY19ydWxlcyggX3J1bGVhcnJheSwgX3BhcmVudCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IF9fYXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKF9fYXI9MDsgX19hciA8IHNpemVvZihfcnVsZWFycmF5KSAvIHNpemVvZigoX3J1bGVhcnJheSlbMF0pOyBfX2FyKyspIHsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgc3RydWN0IGRpY3RfcnVsZV9kYXRhIF9fZGF0YSA9IHsgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5wb3NpdGlvbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ubWluLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5tYXh9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIF9fZGF0YS5ydWxlX29yZGVyID0gUlVMRV9PUkRFUihfX2RhdGEucnVsZV9wb3NpdGlvbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgQ0hFQ0tfRkNUKCAgZmRfZGljdF9zZWFyY2goICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgRElDVF9BVlAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICYoX3J1bGVhcnJheSlbX19hcl0uYXZwX3ZlbmRvcl9wbHVzX25hbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgJl9fZGF0YS5ydWxlX2F2cCwgMCApICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYgKCAhX19kYXRhLnJ1bGVfYXZwICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFX0RFQlVHKElORk8sICJBVlAgTm90IGZvdW5kOiAnJXMnIiwgKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLmF2cF9uYW1lKTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVOT0VOVDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBfcmV0ID0gZmRfZGljdF9uZXcoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9SVUxFLCAmKF9fZGF0YSksIChfcGFyZW50KSwgTlVMTCApOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBfcmV0ICE9IDAgJiYgX3JldCAhPSBFRVhJU1QgKSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfREVCVUcoSU5GTywgIkVycm9yIG9uIHJ1bGUgd2l0aCBBVlAgJyVzJyIsICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0uYXZwX3ZlbmRvcl9wbHVzX25hbWUuYXZwX25hbWUpOyAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFSU5WQUw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBDSEVDS192ZW5kb3JfbmV3KCBfZGF0YSApIHsgXAorICAgICAgICBzdHJ1Y3QgZGljdF9vYmplY3QgKiB2ZW5kb3JfZm91bmQ7IFwKKyAgICAgICAgaWYgKGZkX2RpY3Rfc2VhcmNoKGZkX2dfY29uZmlnLT5jbmZfZGljdCxESUNUX1ZFTkRPUixWRU5ET1JfQllfSUQsJl9kYXRhLnZlbmRvcl9pZCwmdmVuZG9yX2ZvdW5kLEVOT0VOVCkgPT0gRU5PRU5UKSB7IFwKKyAgICAgICAgICAgICAgICBDSEVDS19GQ1QoZmRfZGljdF9uZXcoZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1ZFTkRPUiwgJl9kYXRhLCBOVUxMLCBOVUxMKSk7IFwKKyAgICAgICAgfSBcCit9CisKKyNkZWZpbmUgZW51bXZhbF9kZWZfdTMyKCBfdmFsXywgX3N0cl8gKQkJXAorICAgIHsgX3N0cl8sIAkJeyAudTMyID0gX3ZhbF8gfX0KKworI2RlZmluZSBlbnVtdmFsX2RlZl9vcyggX2xlbl8sIF92YWxfLCBfc3RyXyApCQkJCVwKKyAgICB7IF9zdHJfLCAJCXsgLm9zID0geyAuZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopX3ZhbF8sIC5sZW4gPSBfbGVuXyB9fX0KKworCitzdGF0aWMgaW50IGRpY3RfdHMyOTIyOV9hdnBzX2xvYWRfZGVmcyhjaGFyICogY29uZmZpbGUpCit7CisgICBUUkFDRV9FTlRSWSgiJXAiLCBjb25mZmlsZSk7CisJLyogQXBwbGljYXRpb24gU2VjdGlvbiAqLworCXsKKwkJLyogQ3JlYXRlIHRoZSB2ZW5kb3JzICovCQl7CisJCQlzdHJ1Y3QgZGljdF92ZW5kb3JfZGF0YSB2ZW5kb3JfZGF0YSA9IHsgMTA0MTUsICIzR1BQIiB9OworCQkJQ0hFQ0tfZGljdF9uZXcoRElDVF9WRU5ET1IsICZ2ZW5kb3JfZGF0YSwgTlVMTCwgTlVMTCkKKwkJfQorCX0KKworCisgICAvKiBBVlAgc2VjdGlvbiAqLworICAgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBBZGRyZXNzX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIFVURjhTdHJpbmdfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogRGlhbWV0ZXJJZGVudGl0eV90eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBEaWFtZXRlclVSSV90eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBUaW1lX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIElQRmlsdGVyUnVsZV90eXBlOworCisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkFkZHJlc3MiLCAmQWRkcmVzc190eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiVVRGOFN0cmluZyIsICZVVEY4U3RyaW5nX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJEaWFtZXRlcklkZW50aXR5IiwgJkRpYW1ldGVySWRlbnRpdHlfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkRpYW1ldGVyVVJJIiwgJkRpYW1ldGVyVVJJX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJUaW1lIiwgJlRpbWVfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIklQRmlsdGVyUnVsZSIsICZJUEZpbHRlclJ1bGVfdHlwZSk7CisJCS8qIFZpc2l0ZWQtTmV0d29yay1JZGVudGlmaWVyICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNjAwLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJWaXNpdGVkLU5ldHdvcmstSWRlbnRpZmllciIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFB1YmxpYy1JZGVudGl0eSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTYwMSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUHVibGljLUlkZW50aXR5IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBTZXJ2ZXItTmFtZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTYwMiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiU2VydmVyLU5hbWUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIE1hbmRhdG9yeS1DYXBhYmlsaXR5ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNjA0LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJNYW5kYXRvcnktQ2FwYWJpbGl0eSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogT3B0aW9uYWwtQ2FwYWJpbGl0eSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTYwNSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiT3B0aW9uYWwtQ2FwYWJpbGl0eSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogVXNlci1EYXRhICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNjA2LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJVc2VyLURhdGEiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBTSVAtTnVtYmVyLUF1dGgtSXRlbXMgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk2MDcsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlNJUC1OdW1iZXItQXV0aC1JdGVtcyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogU0lQLUF1dGhlbnRpY2F0aW9uLVNjaGVtZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTYwOCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiU0lQLUF1dGhlbnRpY2F0aW9uLVNjaGVtZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogU0lQLUF1dGhlbnRpY2F0ZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTYwOSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiU0lQLUF1dGhlbnRpY2F0ZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFNJUC1BdXRob3JpemF0aW9uICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNjEwLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTSVAtQXV0aG9yaXphdGlvbiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFNJUC1BdXRoZW50aWNhdGlvbi1Db250ZXh0ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNjExLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTSVAtQXV0aGVudGljYXRpb24tQ29udGV4dCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFNJUC1JdGVtLU51bWJlciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTYxMywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiU0lQLUl0ZW0tTnVtYmVyIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBTZXJ2ZXItQXNzaWdubWVudC1UeXBlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNjE0LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTZXJ2ZXItQXNzaWdubWVudC1UeXBlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChTZXJ2ZXItQXNzaWdubWVudC1UeXBlKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiTk9fQVNTSUdOTUVOVCIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJSRUdJU1RSQVRJT04iLCB7IC5pMzI9MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAiQVVUSEVOVElDQVRJT05fVElNRU9VVCIsIHsgLmkzMj0xMCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF80ID0geyAiREVSRUdJU1RSQVRJT05fVE9PX01VQ0hfREFUQSIsIHsgLmkzMj0xMSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF81ID0geyAiQUFBX1VTRVJfREFUQV9SRVFVRVNUIiwgeyAuaTMyPTEyIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzYgPSB7ICJQR1dfVVBEQVRFIiwgeyAuaTMyPTEzIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzcgPSB7ICJSRVNUT1JBVElPTiIsIHsgLmkzMj0xNCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF84ID0geyAiUkVfUkVHSVNUUkFUSU9OIiwgeyAuaTMyPTIgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfOSA9IHsgIlVOUkVHSVNURVJFRF9VU0VSIiwgeyAuaTMyPTMgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTAgPSB7ICJUSU1FT1VUX0RFUkVHSVNUUkFUSU9OIiwgeyAuaTMyPTQgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTEgPSB7ICJVU0VSX0RFUkVHSVNUUkFUSU9OIiwgeyAuaTMyPTUgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTIgPSB7ICJUSU1FT1VUX0RFUkVHSVNUUkFUSU9OX1NUT1JFX1NFUlZFUl9OQU1FIiwgeyAuaTMyPTYgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTMgPSB7ICJVU0VSX0RFUkVHSVNUUkFUSU9OX1NUT1JFX1NFUlZFUl9OQU1FIiwgeyAuaTMyPTcgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTQgPSB7ICJBRE1JTklTVFJBVElWRV9ERVJFR0lTVFJBVElPTiIsIHsgLmkzMj04IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzE1ID0geyAiQVVUSEVOVElDQVRJT05fRkFJTFVSRSIsIHsgLmkzMj05IH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF81LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzYsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF84LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzksIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTAsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTMsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTQsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTUsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFJlYXNvbi1Db2RlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNjE2LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJSZWFzb24tQ29kZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoUmVhc29uLUNvZGUpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJQRVJNQU5FTlRfVEVSTUlOQVRJT04iLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiTkVXX1NFUlZFUl9BU1NJR05FRCIsIHsgLmkzMj0xIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMgPSB7ICJTRVJWRVJfQ0hBTkdFIiwgeyAuaTMyPTIgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNCA9IHsgIlJFTU9WRV9TX0NTQ0YiLCB7IC5pMzI9MyB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzQsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFJlYXNvbi1JbmZvICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNjE3LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJSZWFzb24tSW5mbyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogUHJpbWFyeS1FdmVudC1DaGFyZ2luZy1GdW5jdGlvbi1OYW1lICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNjE5LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJQcmltYXJ5LUV2ZW50LUNoYXJnaW5nLUZ1bmN0aW9uLU5hbWUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIERpYW1ldGVyVVJJX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBTZWNvbmRhcnktRXZlbnQtQ2hhcmdpbmctRnVuY3Rpb24tTmFtZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTYyMCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiU2Vjb25kYXJ5LUV2ZW50LUNoYXJnaW5nLUZ1bmN0aW9uLU5hbWUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIERpYW1ldGVyVVJJX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBQcmltYXJ5LUNoYXJnaW5nLUNvbGxlY3Rpb24tRnVuY3Rpb24tTmFtZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTYyMSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUHJpbWFyeS1DaGFyZ2luZy1Db2xsZWN0aW9uLUZ1bmN0aW9uLU5hbWUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIERpYW1ldGVyVVJJX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBTZWNvbmRhcnktQ2hhcmdpbmctQ29sbGVjdGlvbi1GdW5jdGlvbi1OYW1lICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNjIyLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTZWNvbmRhcnktQ2hhcmdpbmctQ29sbGVjdGlvbi1GdW5jdGlvbi1OYW1lIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBEaWFtZXRlclVSSV90eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogVXNlci1BdXRob3JpemF0aW9uLVR5cGUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk2MjMsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlVzZXItQXV0aG9yaXphdGlvbi1UeXBlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChVc2VyLUF1dGhvcml6YXRpb24tVHlwZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIlJFR0lTVFJBVElPTiIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJERV9SRUdJU1RSQVRJT04iLCB7IC5pMzI9MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAiUkVHSVNUUkFUSU9OX0FORF9DQVBBQklMSVRJRVMiLCB7IC5pMzI9MiB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBVc2VyLURhdGEtQWxyZWFkeS1BdmFpbGFibGUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk2MjQsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlVzZXItRGF0YS1BbHJlYWR5LUF2YWlsYWJsZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoVXNlci1EYXRhLUFscmVhZHktQXZhaWxhYmxlKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiVVNFUl9EQVRBX05PVF9BVkFJTEFCTEUiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiVVNFUl9EQVRBX0FMUkVBRFlfQVZBSUxBQkxFIiwgeyAuaTMyPTEgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIENvbmZpZGVudGlhbGl0eS1LZXkgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk2MjUsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkNvbmZpZGVudGlhbGl0eS1LZXkiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBJbnRlZ3JpdHktS2V5ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNjI2LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJJbnRlZ3JpdHktS2V5IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogRmVhdHVyZS1MaXN0LUlEICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNjI5LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJGZWF0dXJlLUxpc3QtSUQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIEZlYXR1cmUtTGlzdCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTYzMCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiRmVhdHVyZS1MaXN0IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBPcmlnaW5hdGluZy1SZXF1ZXN0ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNjMzLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJPcmlnaW5hdGluZy1SZXF1ZXN0IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChPcmlnaW5hdGluZy1SZXF1ZXN0KSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiT1JJR0lOQVRJTkciLCB7IC5pMzI9MCB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFdpbGRjYXJkZWQtUHVibGljLUlkZW50aXR5ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNjM0LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJXaWxkY2FyZGVkLVB1YmxpYy1JZGVudGl0eSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogVUFSLUZsYWdzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNjM3LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJVQVItRmxhZ3MiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIExvb3NlLVJvdXRlLUluZGljYXRpb24gKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk2MzgsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkxvb3NlLVJvdXRlLUluZGljYXRpb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKExvb3NlLVJvdXRlLUluZGljYXRpb24pIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJMT09TRV9ST1VURV9OT1RfUkVRVUlSRUQiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiTE9PU0VfUk9VVEVfUkVRVUlSRUQiLCB7IC5pMzI9MSB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogUGF0aCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTY0MCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUGF0aCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIENvbnRhY3QgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk2NDEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkNvbnRhY3QiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBDYWxsLUlELVNJUC1IZWFkZXIgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk2NDMsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkNhbGwtSUQtU0lQLUhlYWRlciIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIEZyb20tU0lQLUhlYWRlciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTY0NCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiRnJvbS1TSVAtSGVhZGVyIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogVG8tU0lQLUhlYWRlciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTY0NSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiVG8tU0lQLUhlYWRlciIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFJlY29yZC1Sb3V0ZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTY0NiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUmVjb3JkLVJvdXRlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogTXVsdGlwbGUtUmVnaXN0cmF0aW9uLUluZGljYXRpb24gKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk2NDgsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk11bHRpcGxlLVJlZ2lzdHJhdGlvbi1JbmRpY2F0aW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChNdWx0aXBsZS1SZWdpc3RyYXRpb24tSW5kaWNhdGlvbikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIk5PVF9NVUxUSVBMRV9SRUdJU1RSQVRJT04iLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiTVVMVElQTEVfUkVHSVNUUkFUSU9OIiwgeyAuaTMyPTEgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFNlc3Npb24tUHJpb3JpdHkgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk2NTAsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlNlc3Npb24tUHJpb3JpdHkiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFNlc3Npb24tUHJpb3JpdHkpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJQUklPUklUWV8wIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIlBSSU9SSVRZXzEiLCB7IC5pMzI9MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAiUFJJT1JJVFlfMiIsIHsgLmkzMj0yIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzQgPSB7ICJQUklPUklUWV8zIiwgeyAuaTMyPTMgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNSA9IHsgIlBSSU9SSVRZXzQiLCB7IC5pMzI9NCB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzQsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogUHJpdmlsZWRnZWQtU2VuZGVyLUluZGljYXRpb24gKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk2NTIsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlByaXZpbGVkZ2VkLVNlbmRlci1JbmRpY2F0aW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChQcml2aWxlZGdlZC1TZW5kZXItSW5kaWNhdGlvbikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIlBSSVZJTEVER0VEX1NFTkRFUiIsIHsgLmkzMj0xIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogTElBLUZsYWdzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNjUzLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJMSUEtRmxhZ3MiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIEluaXRpYWwtQ1NlcS1TZXF1ZW5jZS1OdW1iZXIgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk2NTQsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkluaXRpYWwtQ1NlcS1TZXF1ZW5jZS1OdW1iZXIiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFNBUi1GbGFncyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTY1NSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiU0FSLUZsYWdzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBXZWJSVEMtQXV0aGVudGljYXRpb24tRnVuY3Rpb24tTmFtZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTY1NywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiV2ViUlRDLUF1dGhlbnRpY2F0aW9uLUZ1bmN0aW9uLU5hbWUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFdlYlJUQy1XZWItU2VydmVyLUZ1bmN0aW9uLU5hbWUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk2NTgsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIldlYlJUQy1XZWItU2VydmVyLUZ1bmN0aW9uLU5hbWUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFdpbGRjYXJkZWQtSU1QVSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTYzNiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiV2lsZGNhcmRlZC1JTVBVIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBTdWJzY3JpcHRpb24tSW5mbyAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTY0MiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiU3Vic2NyaXB0aW9uLUluZm8iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIFNlcnZlci1DYXBhYmlsaXRpZXMgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk2MDMsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlNlcnZlci1DYXBhYmlsaXRpZXMiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIEFzc29jaWF0ZWQtUmVnaXN0ZXJlZC1JZGVudGl0aWVzICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNjQ3LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJBc3NvY2lhdGVkLVJlZ2lzdGVyZWQtSWRlbnRpdGllcyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogU0lQLURpZ2VzdC1BdXRoZW50aWNhdGUgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk2MzUsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlNJUC1EaWdlc3QtQXV0aGVudGljYXRlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBTdXBwb3J0ZWQtRmVhdHVyZXMgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk2MjgsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlN1cHBvcnRlZC1GZWF0dXJlcyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogQWxsb3dlZC1XQUYtV1dTRi1JZGVudGl0aWVzICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNjU2LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJBbGxvd2VkLVdBRi1XV1NGLUlkZW50aXRpZXMiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIElkZW50aXR5LXdpdGgtRW1lcmdlbmN5LVJlZ2lzdHJhdGlvbiAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTY1MSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiSWRlbnRpdHktd2l0aC1FbWVyZ2VuY3ktUmVnaXN0cmF0aW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBBc3NvY2lhdGVkLUlkZW50aXRpZXMgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk2MzIsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkFzc29jaWF0ZWQtSWRlbnRpdGllcyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogRGVyZWdpc3RyYXRpb24tUmVhc29uICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNjE1LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJEZXJlZ2lzdHJhdGlvbi1SZWFzb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIENoYXJnaW5nLUluZm9ybWF0aW9uICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNjE4LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJDaGFyZ2luZy1JbmZvcm1hdGlvbiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogU0lQLUF1dGgtRGF0YS1JdGVtICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNjEyLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTSVAtQXV0aC1EYXRhLUl0ZW0iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIFJlc3RvcmF0aW9uLUluZm8gKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk2NDksCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlJlc3RvcmF0aW9uLUluZm8iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIFN1cHBvcnRlZC1BcHBsaWNhdGlvbnMgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk2MzEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlN1cHBvcnRlZC1BcHBsaWNhdGlvbnMiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIFNDU0NGLVJlc3RvcmF0aW9uLUluZm8gKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk2MzksCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlNDU0NGLVJlc3RvcmF0aW9uLUluZm8iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisKKwkKKyAgIH0KKworICAgLyogQ29tbWFuZHMgc2VjdGlvbiAqLworICAgeworCisgICB9CisKKyAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRpY3RfdHMyOTIyOV9hdnBzX2xvYWRfcnVsZXMoY2hhciAqIGNvbmZmaWxlKQoreworICAgLyogR3JvdXBlZCBBVlAgc2VjdGlvbiAqLworICAgeworCSAgLyogU3Vic2NyaXB0aW9uLUluZm8gKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlN1YnNjcmlwdGlvbi1JbmZvIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDYWxsLUlELVNJUC1IZWFkZXIifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkZyb20tU0lQLUhlYWRlciJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVG8tU0lQLUhlYWRlciJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUmVjb3JkLVJvdXRlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDb250YWN0In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogU2VydmVyLUNhcGFiaWxpdGllcyAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU2VydmVyLUNhcGFiaWxpdGllcyJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTWFuZGF0b3J5LUNhcGFiaWxpdHkifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk9wdGlvbmFsLUNhcGFiaWxpdHkifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNlcnZlci1OYW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogQXNzb2NpYXRlZC1SZWdpc3RlcmVkLUlkZW50aXRpZXMgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFzc29jaWF0ZWQtUmVnaXN0ZXJlZC1JZGVudGl0aWVzIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlVzZXItTmFtZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIFNJUC1EaWdlc3QtQXV0aGVudGljYXRlICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTSVAtRGlnZXN0LUF1dGhlbnRpY2F0ZSJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEaWdlc3QtUmVhbG0ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRGlnZXN0LUFsZ29yaXRobSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEaWdlc3QtUW9QIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkRpZ2VzdC1IQTEifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBTdXBwb3J0ZWQtRmVhdHVyZXMgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlN1cHBvcnRlZC1GZWF0dXJlcyJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJWZW5kb3ItSWQifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkZlYXR1cmUtTGlzdC1JRCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRmVhdHVyZS1MaXN0In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogQWxsb3dlZC1XQUYtV1dTRi1JZGVudGl0aWVzICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBbGxvd2VkLVdBRi1XV1NGLUlkZW50aXRpZXMifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIldlYlJUQy1BdXRoZW50aWNhdGlvbi1GdW5jdGlvbi1OYW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJXZWJSVEMtV2ViLVNlcnZlci1GdW5jdGlvbi1OYW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogSWRlbnRpdHktd2l0aC1FbWVyZ2VuY3ktUmVnaXN0cmF0aW9uICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJJZGVudGl0eS13aXRoLUVtZXJnZW5jeS1SZWdpc3RyYXRpb24ifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVXNlci1OYW1lIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQdWJsaWMtSWRlbnRpdHkifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBBc3NvY2lhdGVkLUlkZW50aXRpZXMgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFzc29jaWF0ZWQtSWRlbnRpdGllcyJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJVc2VyLU5hbWUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBEZXJlZ2lzdHJhdGlvbi1SZWFzb24gKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkRlcmVnaXN0cmF0aW9uLVJlYXNvbiJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUmVhc29uLUNvZGUifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJlYXNvbi1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogQ2hhcmdpbmctSW5mb3JtYXRpb24gKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNoYXJnaW5nLUluZm9ybWF0aW9uIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQcmltYXJ5LUV2ZW50LUNoYXJnaW5nLUZ1bmN0aW9uLU5hbWUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNlY29uZGFyeS1FdmVudC1DaGFyZ2luZy1GdW5jdGlvbi1OYW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQcmltYXJ5LUNoYXJnaW5nLUNvbGxlY3Rpb24tRnVuY3Rpb24tTmFtZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU2Vjb25kYXJ5LUNoYXJnaW5nLUNvbGxlY3Rpb24tRnVuY3Rpb24tTmFtZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIFNJUC1BdXRoLURhdGEtSXRlbSAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU0lQLUF1dGgtRGF0YS1JdGVtIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTSVAtSXRlbS1OdW1iZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNJUC1BdXRoZW50aWNhdGlvbi1TY2hlbWUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNJUC1BdXRoZW50aWNhdGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNJUC1BdXRob3JpemF0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTSVAtQXV0aGVudGljYXRpb24tQ29udGV4dCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ29uZmlkZW50aWFsaXR5LUtleSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiSW50ZWdyaXR5LUtleSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU0lQLURpZ2VzdC1BdXRoZW50aWNhdGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRnJhbWVkLUlQLUFkZHJlc3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRnJhbWVkLUlQdjYtUHJlZml4In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkZyYW1lZC1JbnRlcmZhY2UtSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMzAxOSwgLmF2cF9uYW1lID0gIkxpbmUtSWRlbnRpZmllciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIFJlc3RvcmF0aW9uLUluZm8gKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJlc3RvcmF0aW9uLUluZm8ifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlBhdGgifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNvbnRhY3QifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkluaXRpYWwtQ1NlcS1TZXF1ZW5jZS1OdW1iZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNhbGwtSUQtU0lQLUhlYWRlciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU3Vic2NyaXB0aW9uLUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBTdXBwb3J0ZWQtQXBwbGljYXRpb25zICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTdXBwb3J0ZWQtQXBwbGljYXRpb25zIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkF1dGgtQXBwbGljYXRpb24tSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQWNjdC1BcHBsaWNhdGlvbi1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJWZW5kb3ItU3BlY2lmaWMtQXBwbGljYXRpb24tSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBTQ1NDRi1SZXN0b3JhdGlvbi1JbmZvICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTQ1NDRi1SZXN0b3JhdGlvbi1JbmZvIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlVzZXItTmFtZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUmVzdG9yYXRpb24tSW5mbyJ9LCBSVUxFX1JFUVVJUkVELCAxLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTSVAtQXV0aGVudGljYXRpb24tU2NoZW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCisgICB9CQorCisgICAvKiBDb21tYW5kcyBzZWN0aW9uICovCisgICB7CisKKyAgIH0KKworICAgTE9HX0QoICJFeHRlbnNpb24gJ0RpY3Rpb25hcnkgZGVmaW5pdGlvbnMgZm9yIHRzMjkyMjlfYXZwcyAoZTEwKScgaW5pdGlhbGl6ZWQiKTsKKyAgIHJldHVybiAwOworfQorCitpbnQgZGljdF9lbnRyeShjaGFyICogY29uZmZpbGUpCit7CisJZGljdF90czI5MjI5X2F2cHNfbG9hZF9kZWZzKGNvbmZmaWxlKTsKKwlyZXR1cm4gZGljdF90czI5MjI5X2F2cHNfbG9hZF9ydWxlcyhjb25mZmlsZSk7Cit9CisKK2NvbnN0IGNoYXIqIGRpY3RfdHMyOTIyOV9hdnBzX3Byb3RvX3ZlcihjaGFyICogY29uZmZpbGUpIHsKKwlyZXR1cm4gdHMyOTIyOV9hdnBzX3Byb3RvX3ZlcjsKK30KKworY29uc3QgZG91YmxlIGRpY3RfdHMyOTIyOV9hdnBzX2dlbl90cyhjaGFyICogY29uZmZpbGUpIHsKKwlyZXR1cm4gdHMyOTIyOV9hdnBzX2dlbl9kYXRlOworfQorCitFWFRFTlNJT05fRU5UUlkyKCJkaWN0X3RzMjkyMjlfYXZwcyIsIGRpY3RfdHMyOTIyOV9hdnBzX2xvYWRfZGVmcywgZGljdF90czI5MjI5X2F2cHNfbG9hZF9ydWxlcywgImRpY3RfcmZjNzY4M19hdnBzIiwgImRpY3RfcmZjNDU5MF9hdnBzIiwgImRpY3RfZHJhZnRsb2FkX2F2cHMiLCAiZGljdF9yZmM3MTU1X2F2cHMiLCAiZGljdF9ldHNpMjgzMDM0X2F2cHMiLCAiZGljdF9yZmM3OTQ0X2F2cHMiKTsKKworCisKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF90czI5MjI5X2F2cHMvdHMyOTIyOV9hdnBzLmRpZCBiL2V4dGVuc2lvbnMvZGljdF90czI5MjI5X2F2cHMvdHMyOTIyOV9hdnBzLmRpZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTJjOGVlCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kaWN0X3RzMjkyMjlfYXZwcy90czI5MjI5X2F2cHMuZGlkCkBAIC0wLDAgKzEsOCBAQAorZGljdF9kcmFmdGxvYWRfYXZwcworZGljdF9ldHNpMjgzMDM0X2F2cHMKK2RpY3RfcmZjNDU5MF9hdnBzCitkaWN0X3JmYzc2ODNfYXZwcworZGljdF9yZmM3OTQ0X2F2cHMKK2RpY3RfcmZjNDAwNF9hdnBzCitkaWN0X3JmYzcxNTVfYXZwcworZGljdF90czI5MjI5X2F2cHMKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF90czI5MjcyX2F2cHMvQ01ha2VMaXN0cy50eHQgYi9leHRlbnNpb25zL2RpY3RfdHMyOTI3Ml9hdnBzL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1Yjk4YTIKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfdHMyOTI3Ml9hdnBzL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTYgQEAKKyMgVGhlIGRpY3RfdHMyOTI3Ml9hdnBzIGV4dGVuc2lvbgorUFJPSkVDVCgiZGljdF90czI5MjcyX2F2cHMgbGlicmFyeSBnZW5lcmF0ZWQgYnkgRmRHZW4gIiBDKQorCisjIENvbXBpbGUgYXMgYSBtb2R1bGUKK0ZEX0FERF9FWFRFTlNJT04oZGljdF90czI5MjcyX2F2cHMgZGljdF90czI5MjcyX2F2cHMuYykKKworCisjIyMjCisjIyBJTlNUQUxMIHNlY3Rpb24gIyMKKworSU5TVEFMTChUQVJHRVRTIGRpY3RfdHMyOTI3Ml9hdnBzCisJTElCUkFSWSBERVNUSU5BVElPTiAke0lOU1RBTExfRVhURU5TSU9OU19TVUZGSVh9CitDT01QT05FTlQgZnJlZURpYW1ldGVyLWRpY3Rpb25hcnktVFMyOTI3Ml9BVlBTKQorCisKKwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X3RzMjkyNzJfYXZwcy9kaWN0X3RzMjkyNzJfYXZwcy5jIGIvZXh0ZW5zaW9ucy9kaWN0X3RzMjkyNzJfYXZwcy9kaWN0X3RzMjkyNzJfYXZwcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNzQ4MDUKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfdHMyOTI3Ml9hdnBzL2RpY3RfdHMyOTI3Ml9hdnBzLmMKQEAgLTAsMCArMSwzNTk5IEBACisvKgorKiBDb3B5cmlnaHQgKGMpIDIwMTcgU3ByaW50CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKy8qKioqKioqKioqKioqKioqCisgR2VuZXJhdGVkIEJ5OiBmZHRvb2wgZW5oYW5jZW1lbnRzIHRvIGRpYWZ1enplcgorIExpY2Vuc2U6IHNhbWUgYXMgZnJlZURpYW1ldGVyCisqKioqKioqKioqKioqKioqLworCisKKy8qIAorICogRGljdGlvbmFyeSBkZWZpbml0aW9ucyBvZiBvYmplY3RzIHNwZWNpZmllZCBpbiB0czI5MjcyX2F2cHMgKGUzMCkuCisgKi8KKyNpbmNsdWRlIDxmcmVlRGlhbWV0ZXIvZXh0ZW5zaW9uLmg+CisKKyNkZWZpbmUgUFJPVE9fVkVSICJlMzAiCisjZGVmaW5lIEdFTl9EQVRFICAxNTA2Njk3MTg3Ljg0CisKK2NvbnN0IGNoYXIgKnRzMjkyNzJfYXZwc19wcm90b192ZXIgPSBQUk9UT19WRVI7Citjb25zdCBkb3VibGUgdHMyOTI3Ml9hdnBzX2dlbl9kYXRlID0gR0VOX0RBVEU7CisKKy8qIFRoZSBjb250ZW50IG9mIHRoaXMgZmlsZSBmb2xsb3dzIHRoZSBzYW1lIHN0cnVjdHVyZSBhcyBkaWN0X2Jhc2VfcHJvdG8uYyAqLworCisjZGVmaW5lIENIRUNLX2RpY3RfbmV3KCBfdHlwZSwgX2RhdGEsIF9wYXJlbnQsIF9yZWYgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IF9yZXQgPSBmZF9kaWN0X25ldyggZmRfZ19jb25maWctPmNuZl9kaWN0LCAoX3R5cGUpLCAoX2RhdGEpLCAoX3BhcmVudCksIChfcmVmKSApOyBcCisgICAgaWYgKCBfcmV0ICE9IDAgJiYgX3JldCAhPSBFRVhJU1QgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgcmV0dXJuIF9yZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgQ0hFQ0tfZGljdF9zZWFyY2goIF90eXBlLCBfY3JpdGVyaWEsIF93aGF0LCBfcmVzdWx0ICkJCVwKKyAgICBDSEVDS19GQ1QoICBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCAoX3R5cGUpLCAoX2NyaXRlcmlhKSwgKF93aGF0KSwgKF9yZXN1bHQpLCBFTk9FTlQpICk7CisKK3N0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHsKKyAgICBzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZTsKKyAgICBlbnVtIHJ1bGVfcG9zaXRpb24JcG9zaXRpb247CisgICAgaW50IAkJCW1pbjsKKyAgICBpbnQJCQltYXg7Cit9OworCisjZGVmaW5lIFJVTEVfT1JERVIoIF9wb3NpdGlvbiApICgoKChfcG9zaXRpb24pID09IFJVTEVfRklYRURfSEVBRCkgfHwgKChfcG9zaXRpb24pID09IFJVTEVfRklYRURfVEFJTCkpID8gMSA6IDAgKQorCisvKiBBdHRlbnRpb24hIFRoaXMgdmVyc2lvbiBvZiB0aGUgbWFjcm8gdXNlcyBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCBpbiBjb250cmFzdCB0byBtb3N0IG90aGVyIGNvcGllcyEgKi8KKyNkZWZpbmUgUEFSU0VfbG9jX3J1bGVzKCBfcnVsZWFycmF5LCBfcGFyZW50KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgX19hcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoX19hcj0wOyBfX2FyIDwgc2l6ZW9mKF9ydWxlYXJyYXkpIC8gc2l6ZW9mKChfcnVsZWFycmF5KVswXSk7IF9fYXIrKykgeyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgZGljdF9ydWxlX2RhdGEgX19kYXRhID0geyBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLnBvc2l0aW9uLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5taW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLm1heH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgX19kYXRhLnJ1bGVfb3JkZXIgPSBSVUxFX09SREVSKF9fZGF0YS5ydWxlX3Bvc2l0aW9uKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBDSEVDS19GQ1QoICBmZF9kaWN0X3NlYXJjaCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgZmRfZ19jb25maWctPmNuZl9kaWN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBESUNUX0FWUCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgJihfcnVsZWFycmF5KVtfX2FyXS5hdnBfdmVuZG9yX3BsdXNfbmFtZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAmX19kYXRhLnJ1bGVfYXZwLCAwICkgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpZiAoICFfX2RhdGEucnVsZV9hdnAgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfREVCVUcoSU5GTywgIkFWUCBOb3QgZm91bmQ6ICclcyciLCAoX3J1bGVhcnJheSlbX19hcl0uYXZwX3ZlbmRvcl9wbHVzX25hbWUuYXZwX25hbWUpOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRU5PRU5UOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IF9yZXQgPSBmZF9kaWN0X25ldyggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1JVTEUsICYoX19kYXRhKSwgKF9wYXJlbnQpLCBOVUxMICk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIF9yZXQgIT0gMCAmJiBfcmV0ICE9IEVFWElTVCApICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9ERUJVRyhJTkZPLCAiRXJyb3Igb24gcnVsZSB3aXRoIEFWUCAnJXMnIiwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5hdnBfdmVuZG9yX3BsdXNfbmFtZS5hdnBfbmFtZSk7ICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVJTlZBTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIENIRUNLX3ZlbmRvcl9uZXcoIF9kYXRhICkgeyBcCisgICAgICAgIHN0cnVjdCBkaWN0X29iamVjdCAqIHZlbmRvcl9mb3VuZDsgXAorICAgICAgICBpZiAoZmRfZGljdF9zZWFyY2goZmRfZ19jb25maWctPmNuZl9kaWN0LERJQ1RfVkVORE9SLFZFTkRPUl9CWV9JRCwmX2RhdGEudmVuZG9yX2lkLCZ2ZW5kb3JfZm91bmQsRU5PRU5UKSA9PSBFTk9FTlQpIHsgXAorICAgICAgICAgICAgICAgIENIRUNLX0ZDVChmZF9kaWN0X25ldyhmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfVkVORE9SLCAmX2RhdGEsIE5VTEwsIE5VTEwpKTsgXAorICAgICAgICB9IFwKK30KKworI2RlZmluZSBlbnVtdmFsX2RlZl91MzIoIF92YWxfLCBfc3RyXyApCQlcCisgICAgeyBfc3RyXywgCQl7IC51MzIgPSBfdmFsXyB9fQorCisjZGVmaW5lIGVudW12YWxfZGVmX29zKCBfbGVuXywgX3ZhbF8sIF9zdHJfICkJCQkJXAorICAgIHsgX3N0cl8sIAkJeyAub3MgPSB7IC5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilfdmFsXywgLmxlbiA9IF9sZW5fIH19fQorCisKK3N0YXRpYyBpbnQgZGljdF90czI5MjcyX2F2cHNfbG9hZF9kZWZzKGNoYXIgKiBjb25mZmlsZSkKK3sKKyAgIFRSQUNFX0VOVFJZKCIlcCIsIGNvbmZmaWxlKTsKKwkvKiBBcHBsaWNhdGlvbiBTZWN0aW9uICovCisJeworCQkvKiBDcmVhdGUgdGhlIHZlbmRvcnMgKi8JCXsKKwkJCXN0cnVjdCBkaWN0X3ZlbmRvcl9kYXRhIHZlbmRvcl9kYXRhID0geyAxMDQxNSwgIjNHUFAiIH07CisJCQlDSEVDS19kaWN0X25ldyhESUNUX1ZFTkRPUiwgJnZlbmRvcl9kYXRhLCBOVUxMLCBOVUxMKQorCQl9CisJfQorCisKKyAgIC8qIEFWUCBzZWN0aW9uICovCisgICB7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIEFkZHJlc3NfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogVVRGOFN0cmluZ190eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBEaWFtZXRlcklkZW50aXR5X3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIERpYW1ldGVyVVJJX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIFRpbWVfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogSVBGaWx0ZXJSdWxlX3R5cGU7CisKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiQWRkcmVzcyIsICZBZGRyZXNzX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJVVEY4U3RyaW5nIiwgJlVURjhTdHJpbmdfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkRpYW1ldGVySWRlbnRpdHkiLCAmRGlhbWV0ZXJJZGVudGl0eV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiRGlhbWV0ZXJVUkkiLCAmRGlhbWV0ZXJVUklfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIlRpbWUiLCAmVGltZV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiSVBGaWx0ZXJSdWxlIiwgJklQRmlsdGVyUnVsZV90eXBlKTsKKwkJLyogSU1FSSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE0MDIsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIklNRUkiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFNvZnR3YXJlLVZlcnNpb24gKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNDAzLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTb2Z0d2FyZS1WZXJzaW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBRb1MtU3Vic2NyaWJlZCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE0MDQsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlFvUy1TdWJzY3JpYmVkIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogVUxSLUZsYWdzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTQwNSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiVUxSLUZsYWdzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBVTEEtRmxhZ3MgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNDA2LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJVTEEtRmxhZ3MiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFZpc2l0ZWQtUExNTi1JZCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE0MDcsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlZpc2l0ZWQtUExNTi1JZCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIE51bWJlci1PZi1SZXF1ZXN0ZWQtVmVjdG9ycyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE0MTAsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk51bWJlci1PZi1SZXF1ZXN0ZWQtVmVjdG9ycyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogUmUtU3luY2hyb25pemF0aW9uLUluZm8gKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNDExLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJSZS1TeW5jaHJvbml6YXRpb24tSW5mbyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIEltbWVkaWF0ZS1SZXNwb25zZS1QcmVmZXJyZWQgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNDEyLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJJbW1lZGlhdGUtUmVzcG9uc2UtUHJlZmVycmVkIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBOZXR3b3JrLUFjY2Vzcy1Nb2RlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTQxNywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTmV0d29yay1BY2Nlc3MtTW9kZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoTmV0d29yay1BY2Nlc3MtTW9kZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIlBBQ0tFVF9BTkRfQ0lSQ1VJVCIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJSZXNlcnZlZCIsIHsgLmkzMj0xIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMgPSB7ICJPTkxZX1BBQ0tFVCIsIHsgLmkzMj0yIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIEhQTE1OLU9EQiAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE0MTgsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkhQTE1OLU9EQiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogSXRlbS1OdW1iZXIgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNDE5LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJJdGVtLU51bWJlciIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogQ2FuY2VsbGF0aW9uLVR5cGUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNDIwLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJDYW5jZWxsYXRpb24tVHlwZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoQ2FuY2VsbGF0aW9uLVR5cGUpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJNTUVfVVBEQVRFX1BST0NFRFVSRSIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJTR1NOX1VQREFURV9QUk9DRURVUkUiLCB7IC5pMzI9MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAiU1VCU0NSSVBUSU9OX1dJVEhEUkFXQUwiLCB7IC5pMzI9MiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF80ID0geyAiVVBEQVRFX1BST0NFRFVSRV9JV0YiLCB7IC5pMzI9MyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF81ID0geyAiSU5JVElBTF9BVFRBQ0hfUFJPQ0VEVVJFIiwgeyAuaTMyPTQgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF80LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzUsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIERTUi1GbGFncyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE0MjEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkRTUi1GbGFncyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogRFNBLUZsYWdzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTQyMiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiRFNBLUZsYWdzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBDb250ZXh0LUlkZW50aWZpZXIgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNDIzLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJDb250ZXh0LUlkZW50aWZpZXIiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFN1YnNjcmliZXItU3RhdHVzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTQyNCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiU3Vic2NyaWJlci1TdGF0dXMiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFN1YnNjcmliZXItU3RhdHVzKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiU0VSVklDRV9HUkFOVEVEIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIk9QRVJBVE9SX0RFVEVSTUlORURfQkFSUklORyIsIHsgLmkzMj0xIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBPcGVyYXRvci1EZXRlcm1pbmVkLUJhcnJpbmcgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNDI1LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJPcGVyYXRvci1EZXRlcm1pbmVkLUJhcnJpbmciLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIEFjY2Vzcy1SZXN0cmljdGlvbi1EYXRhICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTQyNiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQWNjZXNzLVJlc3RyaWN0aW9uLURhdGEiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIEFQTi1PSS1SZXBsYWNlbWVudCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE0MjcsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkFQTi1PSS1SZXBsYWNlbWVudCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogQWxsLUFQTi1Db25maWd1cmF0aW9ucy1JbmNsdWRlZC1JbmRpY2F0b3IgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNDI4LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJBbGwtQVBOLUNvbmZpZ3VyYXRpb25zLUluY2x1ZGVkLUluZGljYXRvciIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoQWxsLUFQTi1Db25maWd1cmF0aW9ucy1JbmNsdWRlZC1JbmRpY2F0b3IpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJBbGxfQVBOX0NPTkZJR1VSQVRJT05TX0lOQ0xVREVEIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIk1PRElGSUVEX0FEREVEX0FQTl9DT05GSUdVUkFUSU9OU19JTkNMVURFRCIsIHsgLmkzMj0xIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBWUExNTi1EeW5hbWljLUFkZHJlc3MtQWxsb3dlZCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE0MzIsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlZQTE1OLUR5bmFtaWMtQWRkcmVzcy1BbGxvd2VkIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChWUExNTi1EeW5hbWljLUFkZHJlc3MtQWxsb3dlZCkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIk5PVEFMTE9XRUQiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiQUxMT1dFRCIsIHsgLmkzMj0xIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBTVE4tU1IgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNDMzLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTVE4tU1IiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBBbGVydC1SZWFzb24gKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNDM0LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJBbGVydC1SZWFzb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKEFsZXJ0LVJlYXNvbikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIlVFX1BSRVNFTlQiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiVUVfTUVNT1JZX0FWQUlMQUJMRSIsIHsgLmkzMj0xIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBDU0ctSWQgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNDM3LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJDU0ctSWQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFBETi1HVy1BbGxvY2F0aW9uLVR5cGUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNDM4LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJQRE4tR1ctQWxsb2NhdGlvbi1UeXBlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChQRE4tR1ctQWxsb2NhdGlvbi1UeXBlKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiU1RBVElDIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIkRZTkFNSUMiLCB7IC5pMzI9MSB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogRXhwaXJhdGlvbi1EYXRlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTQzOSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiRXhwaXJhdGlvbi1EYXRlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBUaW1lX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBSQVQtRnJlcXVlbmN5LVNlbGVjdGlvbi1Qcmlvcml0eS1JRCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE0NDAsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlJBVC1GcmVxdWVuY3ktU2VsZWN0aW9uLVByaW9yaXR5LUlEIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBJREEtRmxhZ3MgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNDQxLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJJREEtRmxhZ3MiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFBVQS1GbGFncyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE0NDIsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlBVQS1GbGFncyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogTk9SLUZsYWdzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTQ0MywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTk9SLUZsYWdzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBVc2VyLUlkICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTQ0NCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiVXNlci1JZCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogRXF1aXBtZW50LVN0YXR1cyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE0NDUsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkVxdWlwbWVudC1TdGF0dXMiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKEVxdWlwbWVudC1TdGF0dXMpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJXSElURUxJU1RFRCIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJCTEFDS0xJU1RFRCIsIHsgLmkzMj0xIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMgPSB7ICJHUkVZTElTVEVEIiwgeyAuaTMyPTIgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogUmVnaW9uYWwtU3Vic2NyaXB0aW9uLVpvbmUtQ29kZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE0NDYsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlJlZ2lvbmFsLVN1YnNjcmlwdGlvbi1ab25lLUNvZGUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBSQU5EICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTQ0NywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUkFORCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFhSRVMgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNDQ4LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJYUkVTIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogQVVUTiAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE0NDksCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkFVVE4iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBLQVNNRSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE0NTAsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIktBU01FIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogVHJhY2UtQ29sbGVjdGlvbi1FbnRpdHkgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNDUyLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJUcmFjZS1Db2xsZWN0aW9uLUVudGl0eSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgQWRkcmVzc190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogS2MgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNDUzLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJLYyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFNSRVMgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNDU0LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTUkVTIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogUEROLVR5cGUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNDU2LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJQRE4tVHlwZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoUEROLVR5cGUpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJJUHY0IiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIklQdjYiLCB7IC5pMzI9MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAiSVB2NHY2IiwgeyAuaTMyPTIgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNCA9IHsgIklQdjRfT1JfSVB2NiIsIHsgLmkzMj0zIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogUm9hbWluZy1SZXN0cmljdGVkLUR1ZS1Uby1VbnN1cHBvcnRlZC1GZWF0dXJlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTQ1NywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUm9hbWluZy1SZXN0cmljdGVkLUR1ZS1Uby1VbnN1cHBvcnRlZC1GZWF0dXJlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChSb2FtaW5nLVJlc3RyaWN0ZWQtRHVlLVRvLVVuc3VwcG9ydGVkLUZlYXR1cmUpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJSb2FtaW5nX1Jlc3RyaWN0ZWRfRHVlX1RvX1Vuc3VwcG9ydGVkX0ZlYXR1cmUiLCB7IC5pMzI9MCB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFRyYWNlLVJlZmVyZW5jZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE0NTksCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlRyYWNlLVJlZmVyZW5jZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFRyYWNlLURlcHRoICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTQ2MiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiVHJhY2UtRGVwdGgiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFRyYWNlLURlcHRoKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiR1BSU19TdWJzY3JpcHRpb25fRGF0YSIsIHsgLmkzMj03MiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiQ29tcGxldGVfRGF0YV9MaXN0X0luY2x1ZGVkX0luZGljYXRvciIsIHsgLmkzMj03MyB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogVHJhY2UtTkUtVHlwZS1MaXN0ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTQ2MywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiVHJhY2UtTkUtVHlwZS1MaXN0IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogVHJhY2UtSW50ZXJmYWNlLUxpc3QgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNDY0LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJUcmFjZS1JbnRlcmZhY2UtTGlzdCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFRyYWNlLUV2ZW50LUxpc3QgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNDY1LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJUcmFjZS1FdmVudC1MaXN0IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogT01DLUlkICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTQ2NiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiT01DLUlkIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogQ29tcGxldGUtRGF0YS1MaXN0LUluY2x1ZGVkLUluZGljYXRvciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE0NjgsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkNvbXBsZXRlLURhdGEtTGlzdC1JbmNsdWRlZC1JbmRpY2F0b3IiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKENvbXBsZXRlLURhdGEtTGlzdC1JbmNsdWRlZC1JbmRpY2F0b3IpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJBbGxfUERQX0NPTlRFWFRTX0lOQ0xVREVEIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIkNPTlRFWFRTX0lOQ0xVREVEIiwgeyAuaTMyPTEgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFBEUC1UeXBlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTQ3MCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUERQLVR5cGUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiAzR1BQMi1NRUlEICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTQ3MSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiM0dQUDItTUVJRCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIEdNTEMtTnVtYmVyICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTQ3NCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiR01MQy1OdW1iZXIiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBTUy1Db2RlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTQ3NiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiU1MtQ29kZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFNTLVN0YXR1cyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE0NzcsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlNTLVN0YXR1cyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIE5vdGlmaWNhdGlvbi1Uby1VRS1Vc2VyICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTQ3OCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTm90aWZpY2F0aW9uLVRvLVVFLVVzZXIiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKE5vdGlmaWNhdGlvbi1Uby1VRS1Vc2VyKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiTk9USUZZX0xPQ0FUSU9OX0FMTE9XRUQiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiTk9USUZZQU5EVkVSSUZZX0xPQ0FUSU9OX0FMTE9XRURfSUZfTk9fUkVTUE9OU0UiLCB7IC5pMzI9MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAiTk9USUZZQU5EVkVSSUZZX0xPQ0FUSU9OX05PVF9BTExPV0VEX0lGX05PX1JFU1BPTlNFIiwgeyAuaTMyPTIgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNCA9IHsgIkxPQ0FUSU9OX05PVF9BTExPV0VEIiwgeyAuaTMyPTMgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF80LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBDbGllbnQtSWRlbnRpdHkgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNDgwLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJDbGllbnQtSWRlbnRpdHkiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBHTUxDLVJlc3RyaWN0aW9uICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTQ4MSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiR01MQy1SZXN0cmljdGlvbiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoR01MQy1SZXN0cmljdGlvbikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIkdNTENfTElTVCIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJIT01FX0NPVU5UUlkiLCB7IC5pMzI9MSB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogUExNTi1DbGllbnQgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNDgyLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJQTE1OLUNsaWVudCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoUExNTi1DbGllbnQpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJCUk9BRENBU1RfU0VSVklDRSIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJPX0FORF9NX0hQTE1OIiwgeyAuaTMyPTEgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMyA9IHsgIk9fQU5EX01fVlBMTU4iLCB7IC5pMzI9MiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF80ID0geyAiQU5PTllNT1VTX0xPQ0FUSU9OIiwgeyAuaTMyPTMgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNSA9IHsgIlRBUkdFVF9VRV9TVUJTQ1JJQkVEX1NFUlZJQ0UiLCB7IC5pMzI9NCB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzQsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogU2VydmljZVR5cGVJZGVudGl0eSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE0ODQsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlNlcnZpY2VUeXBlSWRlbnRpdHkiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFRTLUNvZGUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNDg3LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJUUy1Db2RlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogU0dTTi1OdW1iZXIgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNDg5LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTR1NOLU51bWJlciIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIElEUi1GbGFncyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE0OTAsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIklEUi1GbGFncyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogSUNTLUluZGljYXRvciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE0OTEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIklDUy1JbmRpY2F0b3IiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKElDUy1JbmRpY2F0b3IpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJGQUxTRSIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJUUlVFIiwgeyAuaTMyPTEgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIElNUy1Wb2ljZS1PdmVyLVBTLVNlc3Npb25zLVN1cHBvcnRlZCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE0OTIsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIklNUy1Wb2ljZS1PdmVyLVBTLVNlc3Npb25zLVN1cHBvcnRlZCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoSU1TLVZvaWNlLU92ZXItUFMtU2Vzc2lvbnMtU3VwcG9ydGVkKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiTk9UX1NVUFBPUlRFRCIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJTVVBQT1JURUQiLCB7IC5pMzI9MSB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogSG9tb2dlbmVvdXMtU3VwcG9ydC1vZi1JTVMtVm9pY2UtT3Zlci1QUy1TZXNzaW9ucyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE0OTMsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkhvbW9nZW5lb3VzLVN1cHBvcnQtb2YtSU1TLVZvaWNlLU92ZXItUFMtU2Vzc2lvbnMiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKEhvbW9nZW5lb3VzLVN1cHBvcnQtb2YtSU1TLVZvaWNlLU92ZXItUFMtU2Vzc2lvbnMpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJOT1RfU1VQUE9SVEVEIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIlNVUFBPUlRFRCIsIHsgLmkzMj0xIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBMYXN0LVVFLUFjdGl2aXR5LVRpbWUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNDk0LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJMYXN0LVVFLUFjdGl2aXR5LVRpbWUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFRpbWVfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFVzZXItU3RhdGUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNDk5LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJVc2VyLVN0YXRlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChVc2VyLVN0YXRlKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiREVUQUNIRUQiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiQVRUQUNIRURfTk9UX1JFQUNIQUJMRV9GT1JfUEFHSU5HIiwgeyAuaTMyPTEgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMyA9IHsgIkFUVEFDSEVEX1JFQUNIQUJMRV9GT1JfUEFHSU5HIiwgeyAuaTMyPTIgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNCA9IHsgIkNPTk5FQ1RFRF9OT1RfUkVBQ0hBQkxFX0ZPUl9QQUdJTkciLCB7IC5pMzI9MyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF81ID0geyAiQ09OTkVDVEVEX1JFQUNIQUJMRV9GT1JfUEFHSU5HIiwgeyAuaTMyPTQgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNiA9IHsgIlJFU0VSVkVEIiwgeyAuaTMyPTUgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF80LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzUsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogRS1VVFJBTi1DZWxsLUdsb2JhbC1JZGVudGl0eSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE2MDIsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkUtVVRSQU4tQ2VsbC1HbG9iYWwtSWRlbnRpdHkiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBUcmFja2luZy1BcmVhLUlkZW50aXR5ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTYwMywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiVHJhY2tpbmctQXJlYS1JZGVudGl0eSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIENlbGwtR2xvYmFsLUlkZW50aXR5ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTYwNCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQ2VsbC1HbG9iYWwtSWRlbnRpdHkiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBSb3V0aW5nLUFyZWEtSWRlbnRpdHkgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNjA1LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJSb3V0aW5nLUFyZWEtSWRlbnRpdHkiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBMb2NhdGlvbi1BcmVhLUlkZW50aXR5ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTYwNiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTG9jYXRpb24tQXJlYS1JZGVudGl0eSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFNlcnZpY2UtQXJlYS1JZGVudGl0eSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE2MDcsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlNlcnZpY2UtQXJlYS1JZGVudGl0eSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIEdlb2dyYXBoaWNhbC1JbmZvcm1hdGlvbiAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE2MDgsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkdlb2dyYXBoaWNhbC1JbmZvcm1hdGlvbiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIEdlb2RldGljLUluZm9ybWF0aW9uICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTYwOSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiR2VvZGV0aWMtSW5mb3JtYXRpb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBDdXJyZW50LUxvY2F0aW9uLVJldHJpZXZlZCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE2MTAsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkN1cnJlbnQtTG9jYXRpb24tUmV0cmlldmVkIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChDdXJyZW50LUxvY2F0aW9uLVJldHJpZXZlZCkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIkFDVElWRV9MT0NBVElPTl9SRVRSSUVWQUwiLCB7IC5pMzI9MCB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIEFnZS1PZi1Mb2NhdGlvbi1JbmZvcm1hdGlvbiAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE2MTEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkFnZS1PZi1Mb2NhdGlvbi1JbmZvcm1hdGlvbiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogRXJyb3ItRGlhZ25vc3RpYyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE2MTQsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkVycm9yLURpYWdub3N0aWMiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKEVycm9yLURpYWdub3N0aWMpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJHUFJTX0RBVEFfU1VCU0NSSUJFRCIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJOT19HUFJTX0RBVEFfU1VCU0NSSUJFRCIsIHsgLmkzMj0xIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMgPSB7ICJPREJfQUxMX0FQTiIsIHsgLmkzMj0yIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzQgPSB7ICJPREJfSFBMTU5fQVBOIiwgeyAuaTMyPTMgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNSA9IHsgIk9EQl9WUExNTl9BUE4iLCB7IC5pMzI9NCB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzQsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogRXh0LVBEUC1BZGRyZXNzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTYyMSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiRXh0LVBEUC1BZGRyZXNzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBBZGRyZXNzX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBVRS1TUlZDQy1DYXBhYmlsaXR5ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTYxNSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiVUUtU1JWQ0MtQ2FwYWJpbGl0eSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoVUUtU1JWQ0MtQ2FwYWJpbGl0eSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIlVFX1NSVkNDX05PVF9TVVBQT1JURUQiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiVUVfU1JWQ0NfU1VQUE9SVEVEIiwgeyAuaTMyPTEgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIE1QUy1Qcmlvcml0eSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE2MTYsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk1QUy1Qcmlvcml0eSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogVlBMTU4tTElQQS1BbGxvd2VkICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTYxNywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiVlBMTU4tTElQQS1BbGxvd2VkIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChWUExNTi1MSVBBLUFsbG93ZWQpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJMSVBBX05PVEFMTE9XRUQiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiTElQQV9BTExPV0VEIiwgeyAuaTMyPTEgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIExJUEEtUGVybWlzc2lvbiAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE2MTgsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkxJUEEtUGVybWlzc2lvbiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoTElQQS1QZXJtaXNzaW9uKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiTElQQV9QUk9ISUJJVEVEIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIkxJUEFfT05MWSIsIHsgLmkzMj0xIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMgPSB7ICJMSVBBX0NPTkRJVElPTkFMIiwgeyAuaTMyPTIgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogU3Vic2NyaWJlZC1QZXJpb2RpYy1SQVUtVEFVLVRpbWVyICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTYxOSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiU3Vic2NyaWJlZC1QZXJpb2RpYy1SQVUtVEFVLVRpbWVyIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBFeHQtUERQLVR5cGUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNjIwLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJFeHQtUERQLVR5cGUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBTSVBUTy1QZXJtaXNzaW9uICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTYxMywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiU0lQVE8tUGVybWlzc2lvbiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoU0lQVE8tUGVybWlzc2lvbikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIkFMTE9XRUQiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiTk9UQUxMT1dFRCIsIHsgLmkzMj0xIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBKb2ItVHlwZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE2MjMsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkpvYi1UeXBlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChKb2ItVHlwZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIkFyZWFfU2NvcGUiLCB7IC5pMzI9MTM4IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJMaXN0X09mX01lYXN1cmVtZW50cyIsIHsgLmkzMj0xMzkgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMyA9IHsgIlJlcG9ydGluZ19UcmlnZ2VyIiwgeyAuaTMyPTE0MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF80ID0geyAiUmVwb3J0X0ludGVydmFsIiwgeyAuaTMyPTE0MSB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzQsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIExpc3QtT2YtTWVhc3VyZW1lbnRzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTYyNSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTGlzdC1PZi1NZWFzdXJlbWVudHMiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFJlcG9ydGluZy1UcmlnZ2VyICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTYyNiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUmVwb3J0aW5nLVRyaWdnZXIiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFJlcG9ydC1JbnRlcnZhbCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE2MjcsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlJlcG9ydC1JbnRlcnZhbCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoUmVwb3J0LUludGVydmFsKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiUmVwb3J0X0Ftb3VudCIsIHsgLmkzMj0xNDIgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBSZXBvcnQtQW1vdW50ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTYyOCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUmVwb3J0LUFtb3VudCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoUmVwb3J0LUFtb3VudCkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIkV2ZW50X1RocmVzaG9sZF9SU1JQIiwgeyAuaTMyPTE0MyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiRXZlbnRfVGhyZXNob2xkX1JTUlEiLCB7IC5pMzI9MTQ0IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMgPSB7ICJMb2dnaW5nX0ludGVydmFsIiwgeyAuaTMyPTE0NSB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBFdmVudC1UaHJlc2hvbGQtUlNSUCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE2MjksCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkV2ZW50LVRocmVzaG9sZC1SU1JQIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBFdmVudC1UaHJlc2hvbGQtUlNSUSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE2MzAsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkV2ZW50LVRocmVzaG9sZC1SU1JRIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBMb2dnaW5nLUludGVydmFsICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTYzMSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTG9nZ2luZy1JbnRlcnZhbCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoTG9nZ2luZy1JbnRlcnZhbCkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIkxvZ2dpbmdfRHVyYXRpb24iLCB7IC5pMzI9MTQ2IH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogTG9nZ2luZy1EdXJhdGlvbiAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE2MzIsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkxvZ2dpbmctRHVyYXRpb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKExvZ2dpbmctRHVyYXRpb24pIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJSZWxheV9Ob2RlX0luZGljYXRvciIsIHsgLmkzMj0xNDcgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBSZWxheS1Ob2RlLUluZGljYXRvciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE2MzMsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlJlbGF5LU5vZGUtSW5kaWNhdG9yIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChSZWxheS1Ob2RlLUluZGljYXRvcikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIk5PVF9SRUxBWV9OT0RFIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIlJFTEFZX05PREUiLCB7IC5pMzI9MSB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogTURULVVzZXItQ29uc2VudCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE2MzQsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk1EVC1Vc2VyLUNvbnNlbnQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKE1EVC1Vc2VyLUNvbnNlbnQpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJDT05TRU5UX05PVF9HSVZFTiIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJDT05TRU5UX0dJVkVOIiwgeyAuaTMyPTEgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFBVUi1GbGFncyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE2MzUsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlBVUi1GbGFncyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogU3Vic2NyaWJlZC1WU1JWQ0MgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNjM2LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTdWJzY3JpYmVkLVZTUlZDQyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoU3Vic2NyaWJlZC1WU1JWQ0MpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJWU1JWQ0NfU1VCU0NSSUJFRCIsIHsgLmkzMj0wIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogQ0xSLUZsYWdzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTYzOCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQ0xSLUZsYWdzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBVVlItRmxhZ3MgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNjM5LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJVVlItRmxhZ3MiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFVWQS1GbGFncyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE2NDAsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlVWQS1GbGFncyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogVGltZS1ab25lICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTY0MiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiVGltZS1ab25lIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBBLU1TSVNETiAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE2NDMsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkEtTVNJU0ROIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogTU1FLU51bWJlci1mb3ItTVQtU01TICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTY0NSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTU1FLU51bWJlci1mb3ItTVQtU01TIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogU01TLVJlZ2lzdGVyLVJlcXVlc3QgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNjQ4LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTTVMtUmVnaXN0ZXItUmVxdWVzdCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoU01TLVJlZ2lzdGVyLVJlcXVlc3QpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJTTVNfUkVHSVNUUkFUSU9OX1JFUVVJUkVEIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIlNNU19SRUdJU1RSQVRJT05fTk9UX1BSRUZFUlJFRCIsIHsgLmkzMj0xIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMgPSB7ICJOT19QUkVGRVJFTkNFIiwgeyAuaTMyPTIgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogRGF5bGlnaHQtU2F2aW5nLVRpbWUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNjUwLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJEYXlsaWdodC1TYXZpbmctVGltZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoRGF5bGlnaHQtU2F2aW5nLVRpbWUpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJOT19BREpVU1RNRU5UIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIlBMVVNfT05FX0hPVVJfQURKVVNUTUVOVCIsIHsgLmkzMj0xIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMgPSB7ICJQTFVTX1RXT19IT1VSU19BREpVU1RNRU5UIiwgeyAuaTMyPTIgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogU3Vic2NyaXB0aW9uLURhdGEtRmxhZ3MgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNjU0LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTdWJzY3JpcHRpb24tRGF0YS1GbGFncyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogTWVhc3VyZW1lbnQtUGVyaW9kLUxURSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE2NTUsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk1lYXN1cmVtZW50LVBlcmlvZC1MVEUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKE1lYXN1cmVtZW50LVBlcmlvZC1MVEUpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJNZWFzdXJlbWVudF9QZXJpb2RfVU1UUyIsIHsgLmkzMj0xNjcgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBNZWFzdXJlbWVudC1QZXJpb2QtVU1UUyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE2NTYsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk1lYXN1cmVtZW50LVBlcmlvZC1VTVRTIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChNZWFzdXJlbWVudC1QZXJpb2QtVU1UUykiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIkNvbGxlY3Rpb25fUGVyaW9kX1JSTV9MVEUiLCB7IC5pMzI9MTY4IH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogQ29sbGVjdGlvbi1QZXJpb2QtUlJNLUxURSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE2NTcsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkNvbGxlY3Rpb24tUGVyaW9kLVJSTS1MVEUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKENvbGxlY3Rpb24tUGVyaW9kLVJSTS1MVEUpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJDb2xsZWN0aW9uX1BlcmlvZF9SUk1fVU1UUyIsIHsgLmkzMj0xNjkgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBDb2xsZWN0aW9uLVBlcmlvZC1SUk0tVU1UUyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE2NTgsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkNvbGxlY3Rpb24tUGVyaW9kLVJSTS1VTVRTIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChDb2xsZWN0aW9uLVBlcmlvZC1SUk0tVU1UUykiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIlBvc2l0aW9uaW5nX01ldGhvZCIsIHsgLmkzMj0xNzAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIk1lYXN1cmVtZW50X1F1YW50aXR5IiwgeyAuaTMyPTE3MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAiRXZlbnRfVGhyZXNob2xkX0V2ZW50XzFGIiwgeyAuaTMyPTE3MiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF80ID0geyAiRXZlbnRfVGhyZXNob2xkX0V2ZW50XzFJIiwgeyAuaTMyPTE3MyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF81ID0geyAiUmVzdG9yYXRpb25fUHJpb3JpdHkiLCB7IC5pMzI9MTc0IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzYgPSB7ICJTR3NfTU1FX0lkZW50aXR5IiwgeyAuaTMyPTE3NSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF83ID0geyAiU0lQVE9fTG9jYWxfTmV0d29ya19QZXJtaXNzaW9uIiwgeyAuaTMyPTE3NiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF84ID0geyAiQ291cGxlZF9Ob2RlX0RpYW1ldGVyX0lEIiwgeyAuaTMyPTE3NyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF85ID0geyAiT0NfU3VwcG9ydGVkX0ZlYXR1cmVzIiwgeyAuaTMyPTE3OCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xMCA9IHsgIk9DX09MUiIsIHsgLmkzMj0xNzkgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTEgPSB7ICJQcm9TZV9TdWJzY3JpcHRpb25fRGF0YSIsIHsgLmkzMj0xODAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTIgPSB7ICJXTEFOX29mZmxvYWRhYmlsaXR5IiwgeyAuaTMyPTE4MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xMyA9IHsgIldMQU5fb2ZmbG9hZGFiaWxpdHlfRVVUUkFOIiwgeyAuaTMyPTE4MiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xNCA9IHsgIldMQU5fb2ZmbG9hZGFiaWxpdHlfVVRSQU4iLCB7IC5pMzI9MTgzIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzE1ID0geyAiUmVzZXRfSUQiLCB7IC5pMzI9MTg0IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzE2ID0geyAiTURUX0FsbG93ZWRfUExNTl9JZCIsIHsgLmkzMj0xODUgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTcgPSB7ICJBZGphY2VudF9QTE1OcyIsIHsgLmkzMj0xODYgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTggPSB7ICJBZGphY2VudF9BY2Nlc3NfUmVzdHJpY3Rpb25fRGF0YSIsIHsgLmkzMj0xODcgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTkgPSB7ICJETF9CdWZmZXJpbmdfU3VnZ2VzdGVkX1BhY2tldF9Db3VudCIsIHsgLmkzMj0xODggfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMjAgPSB7ICJJTVNJX0dyb3VwX0lkIiwgeyAuaTMyPTE4OSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yMSA9IHsgIkdyb3VwX1NlcnZpY2VfSWQiLCB7IC5pMzI9MTkwIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIyID0geyAiR3JvdXBfUExNTl9JZCIsIHsgLmkzMj0xOTEgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMjMgPSB7ICJMb2NhbF9Hcm91cF9JZCIsIHsgLmkzMj0xOTIgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMjQgPSB7ICJBRVNFX0NvbW11bmljYXRpb25fUGF0dGVybiIsIHsgLmkzMj0xOTMgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMjUgPSB7ICJDb21tdW5pY2F0aW9uX1BhdHRlcm5fU2V0IiwgeyAuaTMyPTE5NCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yNiA9IHsgIk1vbml0b3JpbmdfRXZlbnRfQ29uZmlndXJhdGlvbiIsIHsgLmkzMj0xOTUgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMjcgPSB7ICJNb25pdG9yaW5nX0V2ZW50X1JlcG9ydCIsIHsgLmkzMj0xOTYgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMjggPSB7ICJVRV9SZWFjaGFiaWxpdHlfQ29uZmlndXJhdGlvbiIsIHsgLmkzMj0xOTcgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMjkgPSB7ICJlTm9kZUJfSWQiLCB7IC5pMzI9MTk4IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMwID0geyAiU3VwcG9ydGVkX1NlcnZpY2VzIiwgeyAuaTMyPTE5OSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zMSA9IHsgIlN1cHBvcnRlZF9Nb25pdG9yaW5nX0V2ZW50cyIsIHsgLmkzMj0yMDAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMzIgPSB7ICJBSVJfRmxhZ3MiLCB7IC5pMzI9MjAxIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMzID0geyAiVUVfVXNhZ2VfVHlwZSIsIHsgLmkzMj0yMDIgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMzQgPSB7ICJEUk1QIiwgeyAuaTMyPTIwMyB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzQsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF82LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzcsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfOCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF85LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEwLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzExLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEyLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEzLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzE0LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzE1LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzE2LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzE3LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzE4LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzE5LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIwLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIxLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIyLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIzLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzI0LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzI1LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzI2LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzI3LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzI4LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzI5LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMwLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMxLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMyLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMzLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzM0LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBQb3NpdGlvbmluZy1NZXRob2QgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNjU5LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJQb3NpdGlvbmluZy1NZXRob2QiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBNZWFzdXJlbWVudC1RdWFudGl0eSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE2NjAsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk1lYXN1cmVtZW50LVF1YW50aXR5IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogRXZlbnQtVGhyZXNob2xkLUV2ZW50LTFGICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTY2MSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiRXZlbnQtVGhyZXNob2xkLUV2ZW50LTFGIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIEV2ZW50LVRocmVzaG9sZC1FdmVudC0xSSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE2NjIsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkV2ZW50LVRocmVzaG9sZC1FdmVudC0xSSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBSZXN0b3JhdGlvbi1Qcmlvcml0eSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE2NjMsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlJlc3RvcmF0aW9uLVByaW9yaXR5IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBTR3MtTU1FLUlkZW50aXR5ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTY2NCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiU0dzLU1NRS1JZGVudGl0eSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogU0lQVE8tTG9jYWwtTmV0d29yay1QZXJtaXNzaW9uICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTY2NSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiU0lQVE8tTG9jYWwtTmV0d29yay1QZXJtaXNzaW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBDb3VwbGVkLU5vZGUtRGlhbWV0ZXItSUQgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNjY2LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJDb3VwbGVkLU5vZGUtRGlhbWV0ZXItSUQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIERpYW1ldGVySWRlbnRpdHlfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFdMQU4tb2ZmbG9hZGFiaWxpdHktRVVUUkFOICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTY2OCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiV0xBTi1vZmZsb2FkYWJpbGl0eS1FVVRSQU4iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFdMQU4tb2ZmbG9hZGFiaWxpdHktVVRSQU4gKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNjY5LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJXTEFOLW9mZmxvYWRhYmlsaXR5LVVUUkFOIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBSZXNldC1JRCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE2NzAsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlJlc2V0LUlEIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogTURULUFsbG93ZWQtUExNTi1JZCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE2NzEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk1EVC1BbGxvd2VkLVBMTU4tSWQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBETC1CdWZmZXJpbmctU3VnZ2VzdGVkLVBhY2tldC1Db3VudCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE2NzQsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkRMLUJ1ZmZlcmluZy1TdWdnZXN0ZWQtUGFja2V0LUNvdW50IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIEdyb3VwLVNlcnZpY2UtSWQgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNjc2LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJHcm91cC1TZXJ2aWNlLUlkIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBHcm91cC1QTE1OLUlkICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTY3NywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiR3JvdXAtUExNTi1JZCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIExvY2FsLUdyb3VwLUlkICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTY3OCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTG9jYWwtR3JvdXAtSWQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBBSVItRmxhZ3MgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNjc5LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJBSVItRmxhZ3MiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFVFLVVzYWdlLVR5cGUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNjgwLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJVRS1Vc2FnZS1UeXBlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBOb24tSVAtUEROLVR5cGUtSW5kaWNhdG9yICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTY4MSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTm9uLUlQLVBETi1UeXBlLUluZGljYXRvciIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoTm9uLUlQLVBETi1UeXBlLUluZGljYXRvcikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIk1BSU5UQUlOX1BETl9DT05ORUNUSU9OIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIkRJU0NPTk5FQ1RfUEROX0NPTk5FQ1RJT05fV0lUSF9SRUFDVElWQVRJT05fUkVRVUVTVCIsIHsgLmkzMj0xIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMgPSB7ICJESVNDT05ORUNUX1BETl9DT05ORUNUSU9OX1dJVEhPVVRfUkVBQ1RJVkFUSU9OX1JFUVVFU1QiLCB7IC5pMzI9MiB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBOb24tSVAtRGF0YS1EZWxpdmVyeS1NZWNoYW5pc20gKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNjgyLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJOb24tSVAtRGF0YS1EZWxpdmVyeS1NZWNoYW5pc20iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIEFkZGl0aW9uYWwtQ29udGV4dC1JZGVudGlmaWVyICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTY4MywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQWRkaXRpb25hbC1Db250ZXh0LUlkZW50aWZpZXIiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFNDRUYtUmVhbG0gKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNjg0LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTQ0VGLVJlYWxtIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBEaWFtZXRlcklkZW50aXR5X3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBQcmVmZXJyZWQtRGF0YS1Nb2RlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTY4NiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUHJlZmVycmVkLURhdGEtTW9kZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogVjJYLVBlcm1pc3Npb24gKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNjg5LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJWMlgtUGVybWlzc2lvbiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogUEROLUNvbm5lY3Rpb24tQ29udGludWl0eSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE2OTAsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlBETi1Db25uZWN0aW9uLUNvbnRpbnVpdHkiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIGVEUlgtQ3ljbGUtTGVuZ3RoLVZhbHVlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTY5MiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiZURSWC1DeWNsZS1MZW5ndGgtVmFsdWUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBVRS1QQzUtQU1CUiAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE2OTMsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlVFLVBDNS1BTUJSIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBWMlgtU3Vic2NyaXB0aW9uLURhdGEgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNjg4LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJWMlgtU3Vic2NyaXB0aW9uLURhdGEiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIEUtVVRSQU4tVmVjdG9yICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTQxNCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiRS1VVFJBTi1WZWN0b3IiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIEFNQlIgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNDM1LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJBTUJSIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBBZGphY2VudC1BY2Nlc3MtUmVzdHJpY3Rpb24tRGF0YSAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE2NzMsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkFkamFjZW50LUFjY2Vzcy1SZXN0cmljdGlvbi1EYXRhIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBHRVJBTi1WZWN0b3IgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNDE2LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJHRVJBTi1WZWN0b3IiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIGVEUlgtQ3ljbGUtTGVuZ3RoICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTY5MSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiZURSWC1DeWNsZS1MZW5ndGgiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIEFyZWEtU2NvcGUgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNjI0LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJBcmVhLVNjb3BlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBDYWxsLUJhcnJpbmctSW5mbyAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE0ODgsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkNhbGwtQmFycmluZy1JbmZvIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBDU0ctU3Vic2NyaXB0aW9uLURhdGEgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNDM2LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJDU0ctU3Vic2NyaXB0aW9uLURhdGEiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIFZQTE1OLUNTRy1TdWJzY3JpcHRpb24tRGF0YSAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE2NDEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlZQTE1OLUNTRy1TdWJzY3JpcHRpb24tRGF0YSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogTU8tTFIgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNDg1LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJNTy1MUiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogV0xBTi1vZmZsb2FkYWJpbGl0eSAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE2NjcsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIldMQU4tb2ZmbG9hZGFiaWxpdHkiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIEVxdWl2YWxlbnQtUExNTi1MaXN0ICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTYzNywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiRXF1aXZhbGVudC1QTE1OLUxpc3QiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIFVUUkFOLVZlY3RvciAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE0MTUsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlVUUkFOLVZlY3RvciIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogTG9jYWwtVGltZS1ab25lICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTY0OSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTG9jYWwtVGltZS1ab25lIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBJTVNJLUdyb3VwLUlkICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTY3NSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiSU1TSS1Hcm91cC1JZCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogVGVybWluYWwtSW5mb3JtYXRpb24gKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNDAxLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJUZXJtaW5hbC1JbmZvcm1hdGlvbiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogVGVsZXNlcnZpY2UtTGlzdCAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE0ODYsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlRlbGVzZXJ2aWNlLUxpc3QiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIFNlcnZpY2UtVHlwZSAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE0ODMsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlNlcnZpY2UtVHlwZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogUmVxdWVzdGVkLVVUUkFOLUdFUkFOLUF1dGhlbnRpY2F0aW9uLUluZm8gKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNDA5LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJSZXF1ZXN0ZWQtVVRSQU4tR0VSQU4tQXV0aGVudGljYXRpb24tSW5mbyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogU3Vic2NyaXB0aW9uLURhdGEtRGVsZXRpb24gKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNjg1LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTdWJzY3JpcHRpb24tRGF0YS1EZWxldGlvbiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogTU1FLVVzZXItU3RhdGUgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNDk3LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJNTUUtVXNlci1TdGF0ZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogUmVxdWVzdGVkLUVVVFJBTi1BdXRoZW50aWNhdGlvbi1JbmZvICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTQwOCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUmVxdWVzdGVkLUVVVFJBTi1BdXRoZW50aWNhdGlvbi1JbmZvIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBBZGphY2VudC1QTE1OcyAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE2NzIsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkFkamFjZW50LVBMTU5zIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBTR1NOLVVzZXItU3RhdGUgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNDk4LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTR1NOLVVzZXItU3RhdGUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIEV4dGVybmFsLUNsaWVudCAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE0NzksCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkV4dGVybmFsLUNsaWVudCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogRVBTLVVzZXItU3RhdGUgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNDk1LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJFUFMtVXNlci1TdGF0ZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogU0dTTi1Mb2NhdGlvbi1JbmZvcm1hdGlvbiAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE2MDEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlNHU04tTG9jYXRpb24tSW5mb3JtYXRpb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIExDUy1Qcml2YWN5RXhjZXB0aW9uICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTQ3NSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTENTLVByaXZhY3lFeGNlcHRpb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIEVQUy1TdWJzY3JpYmVkLVFvUy1Qcm9maWxlICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTQzMSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiRVBTLVN1YnNjcmliZWQtUW9TLVByb2ZpbGUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIEF1dGhlbnRpY2F0aW9uLUluZm8gKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNDEzLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJBdXRoZW50aWNhdGlvbi1JbmZvIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBTcGVjaWZpYy1BUE4tSW5mbyAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE0NzIsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlNwZWNpZmljLUFQTi1JbmZvIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBNRFQtQ29uZmlndXJhdGlvbiAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE2MjIsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk1EVC1Db25maWd1cmF0aW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBNTUUtTG9jYXRpb24tSW5mb3JtYXRpb24gKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNjAwLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJNTUUtTG9jYXRpb24tSW5mb3JtYXRpb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIFBEUC1Db250ZXh0ICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTQ2OSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUERQLUNvbnRleHQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIEVtZXJnZW5jeS1JbmZvICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTY4NywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiRW1lcmdlbmN5LUluZm8iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIEdQUlMtU3Vic2NyaXB0aW9uLURhdGEgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNDY3LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJHUFJTLVN1YnNjcmlwdGlvbi1EYXRhIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBBUE4tQ29uZmlndXJhdGlvbiAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE0MzAsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkFQTi1Db25maWd1cmF0aW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBFUFMtTG9jYXRpb24tSW5mb3JtYXRpb24gKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNDk2LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJFUFMtTG9jYXRpb24tSW5mb3JtYXRpb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIFRyYWNlLURhdGEgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNDU4LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJUcmFjZS1EYXRhIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBBY3RpdmUtQVBOICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTYxMiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQWN0aXZlLUFQTiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogTENTLUluZm8gKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNDczLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJMQ1MtSW5mbyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogQVBOLUNvbmZpZ3VyYXRpb24tUHJvZmlsZSAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE0MjksCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkFQTi1Db25maWd1cmF0aW9uLVByb2ZpbGUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIFN1YnNjcmlwdGlvbi1EYXRhICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTQwMCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiU3Vic2NyaXB0aW9uLURhdGEiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisKKwkKKyAgIH0KKworICAgLyogQ29tbWFuZHMgc2VjdGlvbiAqLworICAgeworCisgICB9CisKKyAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRpY3RfdHMyOTI3Ml9hdnBzX2xvYWRfcnVsZXMoY2hhciAqIGNvbmZmaWxlKQoreworICAgLyogR3JvdXBlZCBBVlAgc2VjdGlvbiAqLworICAgeworCSAgLyogVjJYLVN1YnNjcmlwdGlvbi1EYXRhICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJWMlgtU3Vic2NyaXB0aW9uLURhdGEifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlYyWC1QZXJtaXNzaW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJVRS1QQzUtQU1CUiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIEUtVVRSQU4tVmVjdG9yICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJFLVVUUkFOLVZlY3RvciJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiSXRlbS1OdW1iZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJBTkQifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlhSRVMifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFVVE4ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIktBU01FIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogQU1CUiAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQU1CUiJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTWF4LVJlcXVlc3RlZC1CYW5kd2lkdGgtVUwifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1heC1SZXF1ZXN0ZWQtQmFuZHdpZHRoLURMIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogQWRqYWNlbnQtQWNjZXNzLVJlc3RyaWN0aW9uLURhdGEgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFkamFjZW50LUFjY2Vzcy1SZXN0cmljdGlvbi1EYXRhIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJWaXNpdGVkLVBMTU4tSWQifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFjY2Vzcy1SZXN0cmljdGlvbi1EYXRhIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogR0VSQU4tVmVjdG9yICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJHRVJBTi1WZWN0b3IifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkl0ZW0tTnVtYmVyIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJSQU5EIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTUkVTIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJLYyJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIGVEUlgtQ3ljbGUtTGVuZ3RoICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJlRFJYLUN5Y2xlLUxlbmd0aCJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUkFULVR5cGUifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gImVEUlgtQ3ljbGUtTGVuZ3RoLVZhbHVlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogQXJlYS1TY29wZSAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQXJlYS1TY29wZSJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ2VsbC1HbG9iYWwtSWRlbnRpdHkifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkUtVVRSQU4tQ2VsbC1HbG9iYWwtSWRlbnRpdHkifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJvdXRpbmctQXJlYS1JZGVudGl0eSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTG9jYXRpb24tQXJlYS1JZGVudGl0eSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVHJhY2tpbmctQXJlYS1JZGVudGl0eSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIENhbGwtQmFycmluZy1JbmZvICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDYWxsLUJhcnJpbmctSW5mbyJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU1MtQ29kZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU1MtU3RhdHVzIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogQ1NHLVN1YnNjcmlwdGlvbi1EYXRhICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDU0ctU3Vic2NyaXB0aW9uLURhdGEifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNTRy1JZCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRXhwaXJhdGlvbi1EYXRlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlNlcnZpY2UtU2VsZWN0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJWaXNpdGVkLVBMTU4tSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBWUExNTi1DU0ctU3Vic2NyaXB0aW9uLURhdGEgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlZQTE1OLUNTRy1TdWJzY3JpcHRpb24tRGF0YSJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ1NHLUlkIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJFeHBpcmF0aW9uLURhdGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBNTy1MUiAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTU8tTFIifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNTLUNvZGUifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNTLVN0YXR1cyJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIFdMQU4tb2ZmbG9hZGFiaWxpdHkgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIldMQU4tb2ZmbG9hZGFiaWxpdHkifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIldMQU4tb2ZmbG9hZGFiaWxpdHktRVVUUkFOIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJXTEFOLW9mZmxvYWRhYmlsaXR5LVVUUkFOIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogRXF1aXZhbGVudC1QTE1OLUxpc3QgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkVxdWl2YWxlbnQtUExNTi1MaXN0In07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJWaXNpdGVkLVBMTU4tSWQifSwgUlVMRV9SRVFVSVJFRCwgMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIFVUUkFOLVZlY3RvciAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVVRSQU4tVmVjdG9yIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJJdGVtLU51bWJlciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUkFORCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiWFJFUyJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQVVUTiJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ29uZmlkZW50aWFsaXR5LUtleSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiSW50ZWdyaXR5LUtleSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIExvY2FsLVRpbWUtWm9uZSAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTG9jYWwtVGltZS1ab25lIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUaW1lLVpvbmUifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkRheWxpZ2h0LVNhdmluZy1UaW1lIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogSU1TSS1Hcm91cC1JZCAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiSU1TSS1Hcm91cC1JZCJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiR3JvdXAtU2VydmljZS1JZCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiR3JvdXAtUExNTi1JZCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTG9jYWwtR3JvdXAtSWQifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBUZXJtaW5hbC1JbmZvcm1hdGlvbiAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVGVybWluYWwtSW5mb3JtYXRpb24ifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIklNRUkifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIjNHUFAyLU1FSUQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNvZnR3YXJlLVZlcnNpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBUZWxlc2VydmljZS1MaXN0ICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUZWxlc2VydmljZS1MaXN0In07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUUy1Db2RlIn0sIFJVTEVfUkVRVUlSRUQsIDEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBTZXJ2aWNlLVR5cGUgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNlcnZpY2UtVHlwZSJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU2VydmljZVR5cGVJZGVudGl0eSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiR01MQy1SZXN0cmljdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTm90aWZpY2F0aW9uLVRvLVVFLVVzZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBSZXF1ZXN0ZWQtVVRSQU4tR0VSQU4tQXV0aGVudGljYXRpb24tSW5mbyAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUmVxdWVzdGVkLVVUUkFOLUdFUkFOLUF1dGhlbnRpY2F0aW9uLUluZm8ifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk51bWJlci1PZi1SZXF1ZXN0ZWQtVmVjdG9ycyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiSW1tZWRpYXRlLVJlc3BvbnNlLVByZWZlcnJlZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUmUtU3luY2hyb25pemF0aW9uLUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBTdWJzY3JpcHRpb24tRGF0YS1EZWxldGlvbiAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU3Vic2NyaXB0aW9uLURhdGEtRGVsZXRpb24ifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkRTUi1GbGFncyJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU0NFRi1JRCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ29udGV4dC1JZGVudGlmaWVyIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUcmFjZS1SZWZlcmVuY2UifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlRTLUNvZGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNTLUNvZGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBNTUUtVXNlci1TdGF0ZSAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTU1FLVVzZXItU3RhdGUifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlVzZXItU3RhdGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBSZXF1ZXN0ZWQtRVVUUkFOLUF1dGhlbnRpY2F0aW9uLUluZm8gKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJlcXVlc3RlZC1FVVRSQU4tQXV0aGVudGljYXRpb24tSW5mbyJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTnVtYmVyLU9mLVJlcXVlc3RlZC1WZWN0b3JzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJJbW1lZGlhdGUtUmVzcG9uc2UtUHJlZmVycmVkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJSZS1TeW5jaHJvbml6YXRpb24tSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIEFkamFjZW50LVBMTU5zICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBZGphY2VudC1QTE1OcyJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVmlzaXRlZC1QTE1OLUlkIn0sIFJVTEVfUkVRVUlSRUQsIDEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBTR1NOLVVzZXItU3RhdGUgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNHU04tVXNlci1TdGF0ZSJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVXNlci1TdGF0ZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIEV4dGVybmFsLUNsaWVudCAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRXh0ZXJuYWwtQ2xpZW50In07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDbGllbnQtSWRlbnRpdHkifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkdNTEMtUmVzdHJpY3Rpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk5vdGlmaWNhdGlvbi1Uby1VRS1Vc2VyIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogRVBTLVVzZXItU3RhdGUgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkVQUy1Vc2VyLVN0YXRlIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNTUUtVXNlci1TdGF0ZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU0dTTi1Vc2VyLVN0YXRlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogU0dTTi1Mb2NhdGlvbi1JbmZvcm1hdGlvbiAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU0dTTi1Mb2NhdGlvbi1JbmZvcm1hdGlvbiJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ2VsbC1HbG9iYWwtSWRlbnRpdHkifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkxvY2F0aW9uLUFyZWEtSWRlbnRpdHkifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNlcnZpY2UtQXJlYS1JZGVudGl0eSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUm91dGluZy1BcmVhLUlkZW50aXR5In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJHZW9ncmFwaGljYWwtSW5mb3JtYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkdlb2RldGljLUluZm9ybWF0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDdXJyZW50LUxvY2F0aW9uLVJldHJpZXZlZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQWdlLU9mLUxvY2F0aW9uLUluZm9ybWF0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJVc2VyLUNTRy1JbmZvcm1hdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIExDUy1Qcml2YWN5RXhjZXB0aW9uICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJMQ1MtUHJpdmFjeUV4Y2VwdGlvbiJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU1MtQ29kZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU1MtU3RhdHVzIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJOb3RpZmljYXRpb24tVG8tVUUtVXNlciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRXh0ZXJuYWwtQ2xpZW50In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQTE1OLUNsaWVudCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU2VydmljZS1UeXBlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogRVBTLVN1YnNjcmliZWQtUW9TLVByb2ZpbGUgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkVQUy1TdWJzY3JpYmVkLVFvUy1Qcm9maWxlIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJRb1MtQ2xhc3MtSWRlbnRpZmllciJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQWxsb2NhdGlvbi1SZXRlbnRpb24tUHJpb3JpdHkifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBBdXRoZW50aWNhdGlvbi1JbmZvICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBdXRoZW50aWNhdGlvbi1JbmZvIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJFLVVUUkFOLVZlY3RvciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVVRSQU4tVmVjdG9yIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJHRVJBTi1WZWN0b3IifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBTcGVjaWZpYy1BUE4tSW5mbyAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU3BlY2lmaWMtQVBOLUluZm8ifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU2VydmljZS1TZWxlY3Rpb24ifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1JUDYtQWdlbnQtSW5mbyJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVmlzaXRlZC1OZXR3b3JrLUlkZW50aWZpZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBNRFQtQ29uZmlndXJhdGlvbiAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTURULUNvbmZpZ3VyYXRpb24ifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkpvYi1UeXBlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBcmVhLVNjb3BlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJMaXN0LU9mLU1lYXN1cmVtZW50cyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUmVwb3J0aW5nLVRyaWdnZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJlcG9ydC1JbnRlcnZhbCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUmVwb3J0LUFtb3VudCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRXZlbnQtVGhyZXNob2xkLVJTUlAifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkV2ZW50LVRocmVzaG9sZC1SU1JRIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJMb2dnaW5nLUludGVydmFsIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJMb2dnaW5nLUR1cmF0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNZWFzdXJlbWVudC1QZXJpb2QtTFRFIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNZWFzdXJlbWVudC1QZXJpb2QtVU1UUyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ29sbGVjdGlvbi1QZXJpb2QtUlJNLUxURSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ29sbGVjdGlvbi1QZXJpb2QtUlJNLVVNVFMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlBvc2l0aW9uaW5nLU1ldGhvZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTWVhc3VyZW1lbnQtUXVhbnRpdHkifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkV2ZW50LVRocmVzaG9sZC1FdmVudC0xRiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRXZlbnQtVGhyZXNob2xkLUV2ZW50LTFJIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNRFQtQWxsb3dlZC1QTE1OLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogTU1FLUxvY2F0aW9uLUluZm9ybWF0aW9uICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNTUUtTG9jYXRpb24tSW5mb3JtYXRpb24ifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkUtVVRSQU4tQ2VsbC1HbG9iYWwtSWRlbnRpdHkifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlRyYWNraW5nLUFyZWEtSWRlbnRpdHkifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkdlb2dyYXBoaWNhbC1JbmZvcm1hdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiR2VvZGV0aWMtSW5mb3JtYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkN1cnJlbnQtTG9jYXRpb24tUmV0cmlldmVkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBZ2UtT2YtTG9jYXRpb24tSW5mb3JtYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlVzZXItQ1NHLUluZm9ybWF0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJlTm9kZUItSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkV4dGVuZGVkLWVOb2RlQi1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIFBEUC1Db250ZXh0ICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQRFAtQ29udGV4dCJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ29udGV4dC1JZGVudGlmaWVyIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQRFAtVHlwZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUERQLUFkZHJlc3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlFvUy1TdWJzY3JpYmVkIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJWUExNTi1EeW5hbWljLUFkZHJlc3MtQWxsb3dlZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTZXJ2aWNlLVNlbGVjdGlvbiJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiM0dQUC1DaGFyZ2luZy1DaGFyYWN0ZXJpc3RpY3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkV4dC1QRFAtVHlwZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRXh0LVBEUC1BZGRyZXNzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBTUJSIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBUE4tT0ktUmVwbGFjZW1lbnQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNJUFRPLVBlcm1pc3Npb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkxJUEEtUGVybWlzc2lvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUmVzdG9yYXRpb24tUHJpb3JpdHkifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNJUFRPLUxvY2FsLU5ldHdvcmstUGVybWlzc2lvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTm9uLUlQLURhdGEtRGVsaXZlcnktTWVjaGFuaXNtIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTQ0VGLUlEIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogRW1lcmdlbmN5LUluZm8gKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkVtZXJnZW5jeS1JbmZvIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNSVA2LUFnZW50LUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBHUFJTLVN1YnNjcmlwdGlvbi1EYXRhICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJHUFJTLVN1YnNjcmlwdGlvbi1EYXRhIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDb21wbGV0ZS1EYXRhLUxpc3QtSW5jbHVkZWQtSW5kaWNhdG9yIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQRFAtQ29udGV4dCJ9LCBSVUxFX1JFUVVJUkVELCAxLCA1MCB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogQVBOLUNvbmZpZ3VyYXRpb24gKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFQTi1Db25maWd1cmF0aW9uIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDb250ZXh0LUlkZW50aWZpZXIifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNlcnZlZC1QYXJ0eS1JUC1BZGRyZXNzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAyIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlBETi1UeXBlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlNlcnZpY2UtU2VsZWN0aW9uIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJFUFMtU3Vic2NyaWJlZC1Rb1MtUHJvZmlsZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVlBMTU4tRHluYW1pYy1BZGRyZXNzLUFsbG93ZWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1JUDYtQWdlbnQtSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVmlzaXRlZC1OZXR3b3JrLUlkZW50aWZpZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlBETi1HVy1BbGxvY2F0aW9uLVR5cGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIjNHUFAtQ2hhcmdpbmctQ2hhcmFjdGVyaXN0aWNzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBTUJSIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTcGVjaWZpYy1BUE4tSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQVBOLU9JLVJlcGxhY2VtZW50In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTSVBUTy1QZXJtaXNzaW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJMSVBBLVBlcm1pc3Npb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJlc3RvcmF0aW9uLVByaW9yaXR5In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTSVBUTy1Mb2NhbC1OZXR3b3JrLVBlcm1pc3Npb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIldMQU4tb2ZmbG9hZGFiaWxpdHkifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk5vbi1JUC1QRE4tVHlwZS1JbmRpY2F0b3IifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk5vbi1JUC1EYXRhLURlbGl2ZXJ5LU1lY2hhbmlzbSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU0NFRi1JRCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU0NFRi1SZWFsbSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUHJlZmVycmVkLURhdGEtTW9kZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUEROLUNvbm5lY3Rpb24tQ29udGludWl0eSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIEVQUy1Mb2NhdGlvbi1JbmZvcm1hdGlvbiAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRVBTLUxvY2F0aW9uLUluZm9ybWF0aW9uIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNTUUtTG9jYXRpb24tSW5mb3JtYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNHU04tTG9jYXRpb24tSW5mb3JtYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBUcmFjZS1EYXRhICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUcmFjZS1EYXRhIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUcmFjZS1SZWZlcmVuY2UifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlRyYWNlLURlcHRoIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUcmFjZS1ORS1UeXBlLUxpc3QifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlRyYWNlLUludGVyZmFjZS1MaXN0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUcmFjZS1FdmVudC1MaXN0In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJPTUMtSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlRyYWNlLUNvbGxlY3Rpb24tRW50aXR5In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNRFQtQ29uZmlndXJhdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIEFjdGl2ZS1BUE4gKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFjdGl2ZS1BUE4ifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNvbnRleHQtSWRlbnRpZmllciJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTZXJ2aWNlLVNlbGVjdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTUlQNi1BZ2VudC1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJWaXNpdGVkLU5ldHdvcmstSWRlbnRpZmllciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU3BlY2lmaWMtQVBOLUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBMQ1MtSW5mbyAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTENTLUluZm8ifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkdNTEMtTnVtYmVyIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJMQ1MtUHJpdmFjeUV4Y2VwdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTU8tTFIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBBUE4tQ29uZmlndXJhdGlvbi1Qcm9maWxlICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBUE4tQ29uZmlndXJhdGlvbi1Qcm9maWxlIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDb250ZXh0LUlkZW50aWZpZXIifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFkZGl0aW9uYWwtQ29udGV4dC1JZGVudGlmaWVyIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBbGwtQVBOLUNvbmZpZ3VyYXRpb25zLUluY2x1ZGVkLUluZGljYXRvciJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQVBOLUNvbmZpZ3VyYXRpb24ifSwgUlVMRV9SRVFVSVJFRCwgMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIFN1YnNjcmlwdGlvbi1EYXRhICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTdWJzY3JpcHRpb24tRGF0YSJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU3Vic2NyaWJlci1TdGF0dXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1TSVNETiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQS1NU0lTRE4ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNUTi1TUiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiSUNTLUluZGljYXRvciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTmV0d29yay1BY2Nlc3MtTW9kZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiT3BlcmF0b3ItRGV0ZXJtaW5lZC1CYXJyaW5nIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJIUExNTi1PREIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJlZ2lvbmFsLVN1YnNjcmlwdGlvbi1ab25lLUNvZGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIDEwIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFjY2Vzcy1SZXN0cmljdGlvbi1EYXRhIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBUE4tT0ktUmVwbGFjZW1lbnQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkxDUy1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUZWxlc2VydmljZS1MaXN0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDYWxsLUJhcnJpbmctSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiM0dQUC1DaGFyZ2luZy1DaGFyYWN0ZXJpc3RpY3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFNQlIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFQTi1Db25maWd1cmF0aW9uLVByb2ZpbGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJBVC1GcmVxdWVuY3ktU2VsZWN0aW9uLVByaW9yaXR5LUlEIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUcmFjZS1EYXRhIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJHUFJTLVN1YnNjcmlwdGlvbi1EYXRhIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDU0ctU3Vic2NyaXB0aW9uLURhdGEifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJvYW1pbmctUmVzdHJpY3RlZC1EdWUtVG8tVW5zdXBwb3J0ZWQtRmVhdHVyZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU3Vic2NyaWJlZC1QZXJpb2RpYy1SQVUtVEFVLVRpbWVyIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNUFMtUHJpb3JpdHkifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlZQTE1OLUxJUEEtQWxsb3dlZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUmVsYXktTm9kZS1JbmRpY2F0b3IifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1EVC1Vc2VyLUNvbnNlbnQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlN1YnNjcmliZWQtVlNSVkNDIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQcm9TZS1TdWJzY3JpcHRpb24tRGF0YSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU3Vic2NyaXB0aW9uLURhdGEtRmxhZ3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFkamFjZW50LUFjY2Vzcy1SZXN0cmljdGlvbi1EYXRhIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJETC1CdWZmZXJpbmctU3VnZ2VzdGVkLVBhY2tldC1Db3VudCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiSU1TSS1Hcm91cC1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVUUtVXNhZ2UtVHlwZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQUVTRS1Db21tdW5pY2F0aW9uLVBhdHRlcm4ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1vbml0b3JpbmctRXZlbnQtQ29uZmlndXJhdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRW1lcmdlbmN5LUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlYyWC1TdWJzY3JpcHRpb24tRGF0YSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiZURSWC1DeWNsZS1MZW5ndGgifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisKKyAgIH0JCisKKyAgIC8qIENvbW1hbmRzIHNlY3Rpb24gKi8KKyAgIHsKKworICAgfQorCisgICBMT0dfRCggIkV4dGVuc2lvbiAnRGljdGlvbmFyeSBkZWZpbml0aW9ucyBmb3IgdHMyOTI3Ml9hdnBzIChlMzApJyBpbml0aWFsaXplZCIpOworICAgcmV0dXJuIDA7Cit9CisKK2ludCBkaWN0X2VudHJ5KGNoYXIgKiBjb25mZmlsZSkKK3sKKwlkaWN0X3RzMjkyNzJfYXZwc19sb2FkX2RlZnMoY29uZmZpbGUpOworCXJldHVybiBkaWN0X3RzMjkyNzJfYXZwc19sb2FkX3J1bGVzKGNvbmZmaWxlKTsKK30KKworY29uc3QgY2hhciogZGljdF90czI5MjcyX2F2cHNfcHJvdG9fdmVyKGNoYXIgKiBjb25mZmlsZSkgeworCXJldHVybiB0czI5MjcyX2F2cHNfcHJvdG9fdmVyOworfQorCitjb25zdCBkb3VibGUgZGljdF90czI5MjcyX2F2cHNfZ2VuX3RzKGNoYXIgKiBjb25mZmlsZSkgeworCXJldHVybiB0czI5MjcyX2F2cHNfZ2VuX2RhdGU7Cit9CisKK0VYVEVOU0lPTl9FTlRSWTIoImRpY3RfdHMyOTI3Ml9hdnBzIiwgZGljdF90czI5MjcyX2F2cHNfbG9hZF9kZWZzLCBkaWN0X3RzMjkyNzJfYXZwc19sb2FkX3J1bGVzLCAiZGljdF90czMyMjk5X2F2cHMiLCAiZGljdF90czI5MzM2X2F2cHMiLCAiZGljdF90czI5MjczX2F2cHMiLCAiZGljdF90czI5MjEyX2F2cHMiLCAiZGljdF90czI5MjE0X2F2cHMiLCAiZGljdF90czI5MzQ0X2F2cHMiLCAiZGljdF90czI5MzM4X2F2cHMiLCAiZGljdF90czI5MjE3X2F2cHMiLCAiZGljdF90czI5MzI5X2F2cHMiLCAiZGljdF90czI5MjI5X2F2cHMiLCAiZGljdF90czI5MTczX2F2cHMiLCAiZGljdF9yZmM1Nzc4X2F2cHMiLCAiZGljdF90czI5MDYxX2F2cHMiLCAiZGljdF9yZmM1NDQ3X2F2cHMiLCAiZGljdF9kcmFmdGxvYWRfYXZwcyIsICJkaWN0X3JmYzc2ODNfYXZwcyIsICJkaWN0X3JmYzQwMDRfYXZwcyIsICJkaWN0X3JmYzU3NzdfYXZwcyIsICJkaWN0X3JmYzc5NDRfYXZwcyIpOworCisKKwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X3RzMjkyNzJfYXZwcy90czI5MjcyX2F2cHMuZGlkIGIvZXh0ZW5zaW9ucy9kaWN0X3RzMjkyNzJfYXZwcy90czI5MjcyX2F2cHMuZGlkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MDIyZTIKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfdHMyOTI3Ml9hdnBzL3RzMjkyNzJfYXZwcy5kaWQKQEAgLTAsMCArMSwzNyBAQAorZGljdF9yZmM2OTQyX2F2cHMKK2RpY3RfdHMyOTQ2OF9hdnBzCitkaWN0X3RzMjkzNDNfYXZwcworZGljdF90czI5MTI4X2F2cHMKK2RpY3RfdHMyOTM0NF9hdnBzCitkaWN0X3RzMjkzNDVfYXZwcworZGljdF90czI5MzM3X2F2cHMKK2RpY3RfM2dwcDJfYXZwcworZGljdF90czI5MTU0X2F2cHMKK2RpY3RfdHMyOTIxNF9hdnBzCitkaWN0X3RzMjkyMTVfYXZwcworZGljdF90czI5MjE3X2F2cHMKK2RpY3RfdHMyOTMzOF9hdnBzCitkaWN0X3RzMjkxNzNfYXZwcworZGljdF90czI5MzM2X2F2cHMKK2RpY3RfcmZjNDU5MF9hdnBzCitkaWN0X3RzMjkyMjlfYXZwcworZGljdF90czI5MzI5X2F2cHMKK2RpY3RfdHMyOTM2OF9hdnBzCitkaWN0X3RzMzIyOTlfYXZwcworZGljdF9yZmM2NzM0X2F2cHMKK2RpY3RfcmZjNTc3OF9hdnBzCitkaWN0X2RyYWZ0bG9hZF9hdnBzCitkaWN0X2V0c2kyODMwMzRfYXZwcworZGljdF9yZmM1NTgwX2F2cHMKK2RpY3RfcmZjNDA3Ml9hdnBzCitkaWN0X3RzMjkyNzNfYXZwcworZGljdF9yZmM3NjgzX2F2cHMKK2RpY3RfcmZjNzk0NF9hdnBzCitkaWN0X3JmYzU3NzdfYXZwcworZGljdF9yZmM0MDA2YmlzX2F2cHMKK2RpY3RfcmZjNzE1NV9hdnBzCitkaWN0X3RzMjkyMTJfYXZwcworZGljdF90czI5MDYxX2F2cHMKK2RpY3RfcmZjNDAwNF9hdnBzCitkaWN0X3JmYzU0NDdfYXZwcworZGljdF90czI5MjcyX2F2cHMKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF90czI5MjczX2F2cHMvQ01ha2VMaXN0cy50eHQgYi9leHRlbnNpb25zL2RpY3RfdHMyOTI3M19hdnBzL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlNjBkNDIKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfdHMyOTI3M19hdnBzL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTYgQEAKKyMgVGhlIGRpY3RfdHMyOTI3M19hdnBzIGV4dGVuc2lvbgorUFJPSkVDVCgiZGljdF90czI5MjczX2F2cHMgbGlicmFyeSBnZW5lcmF0ZWQgYnkgRmRHZW4gIiBDKQorCisjIENvbXBpbGUgYXMgYSBtb2R1bGUKK0ZEX0FERF9FWFRFTlNJT04oZGljdF90czI5MjczX2F2cHMgZGljdF90czI5MjczX2F2cHMuYykKKworCisjIyMjCisjIyBJTlNUQUxMIHNlY3Rpb24gIyMKKworSU5TVEFMTChUQVJHRVRTIGRpY3RfdHMyOTI3M19hdnBzCisJTElCUkFSWSBERVNUSU5BVElPTiAke0lOU1RBTExfRVhURU5TSU9OU19TVUZGSVh9CitDT01QT05FTlQgZnJlZURpYW1ldGVyLWRpY3Rpb25hcnktVFMyOTI3M19BVlBTKQorCisKKwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X3RzMjkyNzNfYXZwcy9kaWN0X3RzMjkyNzNfYXZwcy5jIGIvZXh0ZW5zaW9ucy9kaWN0X3RzMjkyNzNfYXZwcy9kaWN0X3RzMjkyNzNfYXZwcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MDZkM2EKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfdHMyOTI3M19hdnBzL2RpY3RfdHMyOTI3M19hdnBzLmMKQEAgLTAsMCArMSw4MzYgQEAKKy8qCisqIENvcHlyaWdodCAoYykgMjAxNyBTcHJpbnQKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLyoqKioqKioqKioqKioqKioKKyBHZW5lcmF0ZWQgQnk6IGZkdG9vbCBlbmhhbmNlbWVudHMgdG8gZGlhZnV6emVyCisgTGljZW5zZTogc2FtZSBhcyBmcmVlRGlhbWV0ZXIKKyoqKioqKioqKioqKioqKiovCisKKworLyogCisgKiBEaWN0aW9uYXJ5IGRlZmluaXRpb25zIG9mIG9iamVjdHMgc3BlY2lmaWVkIGluIHRzMjkyNzNfYXZwcyAoZTIwKS4KKyAqLworI2luY2x1ZGUgPGZyZWVEaWFtZXRlci9leHRlbnNpb24uaD4KKworI2RlZmluZSBQUk9UT19WRVIgImUyMCIKKyNkZWZpbmUgR0VOX0RBVEUgIDE1MDY2OTcxMzMuMzIKKworY29uc3QgY2hhciAqdHMyOTI3M19hdnBzX3Byb3RvX3ZlciA9IFBST1RPX1ZFUjsKK2NvbnN0IGRvdWJsZSB0czI5MjczX2F2cHNfZ2VuX2RhdGUgPSBHRU5fREFURTsKKworLyogVGhlIGNvbnRlbnQgb2YgdGhpcyBmaWxlIGZvbGxvd3MgdGhlIHNhbWUgc3RydWN0dXJlIGFzIGRpY3RfYmFzZV9wcm90by5jICovCisKKyNkZWZpbmUgQ0hFQ0tfZGljdF9uZXcoIF90eXBlLCBfZGF0YSwgX3BhcmVudCwgX3JlZiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgX3JldCA9IGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIChfdHlwZSksIChfZGF0YSksIChfcGFyZW50KSwgKF9yZWYpICk7IFwKKyAgICBpZiAoIF9yZXQgIT0gMCAmJiBfcmV0ICE9IEVFWElTVCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICByZXR1cm4gX3JldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBDSEVDS19kaWN0X3NlYXJjaCggX3R5cGUsIF9jcml0ZXJpYSwgX3doYXQsIF9yZXN1bHQgKQkJXAorICAgIENIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIChfdHlwZSksIChfY3JpdGVyaWEpLCAoX3doYXQpLCAoX3Jlc3VsdCksIEVOT0VOVCkgKTsKKworc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24geworICAgIHN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lOworICAgIGVudW0gcnVsZV9wb3NpdGlvbglwb3NpdGlvbjsKKyAgICBpbnQgCQkJbWluOworICAgIGludAkJCW1heDsKK307CisKKyNkZWZpbmUgUlVMRV9PUkRFUiggX3Bvc2l0aW9uICkgKCgoKF9wb3NpdGlvbikgPT0gUlVMRV9GSVhFRF9IRUFEKSB8fCAoKF9wb3NpdGlvbikgPT0gUlVMRV9GSVhFRF9UQUlMKSkgPyAxIDogMCApCisKKy8qIEF0dGVudGlvbiEgVGhpcyB2ZXJzaW9uIG9mIHRoZSBtYWNybyB1c2VzIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsIGluIGNvbnRyYXN0IHRvIG1vc3Qgb3RoZXIgY29waWVzISAqLworI2RlZmluZSBQQVJTRV9sb2NfcnVsZXMoIF9ydWxlYXJyYXksIF9wYXJlbnQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBfX2FyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yIChfX2FyPTA7IF9fYXIgPCBzaXplb2YoX3J1bGVhcnJheSkgLyBzaXplb2YoKF9ydWxlYXJyYXkpWzBdKTsgX19hcisrKSB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHN0cnVjdCBkaWN0X3J1bGVfZGF0YSBfX2RhdGEgPSB7IE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ucG9zaXRpb24sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLm1pbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ubWF4fTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfX2RhdGEucnVsZV9vcmRlciA9IFJVTEVfT1JERVIoX19kYXRhLnJ1bGVfcG9zaXRpb24pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIENIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIERJQ1RfQVZQLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAmKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICZfX2RhdGEucnVsZV9hdnAsIDAgKSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmICggIV9fZGF0YS5ydWxlX2F2cCApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9ERUJVRyhJTkZPLCAiQVZQIE5vdCBmb3VuZDogJyVzJyIsIChfcnVsZWFycmF5KVtfX2FyXS5hdnBfdmVuZG9yX3BsdXNfbmFtZS5hdnBfbmFtZSk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFTk9FTlQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgX3JldCA9IGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfUlVMRSwgJihfX2RhdGEpLCAoX3BhcmVudCksIE5VTEwgKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggX3JldCAhPSAwICYmIF9yZXQgIT0gRUVYSVNUICkgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFX0RFQlVHKElORk8sICJFcnJvciBvbiBydWxlIHdpdGggQVZQICclcyciLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLmF2cF9uYW1lKTsgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRUlOVkFMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgQ0hFQ0tfdmVuZG9yX25ldyggX2RhdGEgKSB7IFwKKyAgICAgICAgc3RydWN0IGRpY3Rfb2JqZWN0ICogdmVuZG9yX2ZvdW5kOyBcCisgICAgICAgIGlmIChmZF9kaWN0X3NlYXJjaChmZF9nX2NvbmZpZy0+Y25mX2RpY3QsRElDVF9WRU5ET1IsVkVORE9SX0JZX0lELCZfZGF0YS52ZW5kb3JfaWQsJnZlbmRvcl9mb3VuZCxFTk9FTlQpID09IEVOT0VOVCkgeyBcCisgICAgICAgICAgICAgICAgQ0hFQ0tfRkNUKGZkX2RpY3RfbmV3KGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9WRU5ET1IsICZfZGF0YSwgTlVMTCwgTlVMTCkpOyBcCisgICAgICAgIH0gXAorfQorCisjZGVmaW5lIGVudW12YWxfZGVmX3UzMiggX3ZhbF8sIF9zdHJfICkJCVwKKyAgICB7IF9zdHJfLCAJCXsgLnUzMiA9IF92YWxfIH19CisKKyNkZWZpbmUgZW51bXZhbF9kZWZfb3MoIF9sZW5fLCBfdmFsXywgX3N0cl8gKQkJCQlcCisgICAgeyBfc3RyXywgCQl7IC5vcyA9IHsgLmRhdGEgPSAodW5zaWduZWQgY2hhciAqKV92YWxfLCAubGVuID0gX2xlbl8gfX19CisKKworc3RhdGljIGludCBkaWN0X3RzMjkyNzNfYXZwc19sb2FkX2RlZnMoY2hhciAqIGNvbmZmaWxlKQoreworICAgVFJBQ0VfRU5UUlkoIiVwIiwgY29uZmZpbGUpOworCS8qIEFwcGxpY2F0aW9uIFNlY3Rpb24gKi8KKwl7CisJCS8qIENyZWF0ZSB0aGUgdmVuZG9ycyAqLwkJeworCQkJc3RydWN0IGRpY3RfdmVuZG9yX2RhdGEgdmVuZG9yX2RhdGEgPSB7IDEwNDE1LCAiM0dQUCIgfTsKKwkJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVkVORE9SLCAmdmVuZG9yX2RhdGEsIE5VTEwsIE5VTEwpCisJCX0KKwl9CisKKworICAgLyogQVZQIHNlY3Rpb24gKi8KKyAgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogQWRkcmVzc190eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBVVEY4U3RyaW5nX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIERpYW1ldGVySWRlbnRpdHlfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogRGlhbWV0ZXJVUklfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogVGltZV90eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBJUEZpbHRlclJ1bGVfdHlwZTsKKworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJBZGRyZXNzIiwgJkFkZHJlc3NfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIlVURjhTdHJpbmciLCAmVVRGOFN0cmluZ190eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiRGlhbWV0ZXJJZGVudGl0eSIsICZEaWFtZXRlcklkZW50aXR5X3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJEaWFtZXRlclVSSSIsICZEaWFtZXRlclVSSV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiVGltZSIsICZUaW1lX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJJUEZpbHRlclJ1bGUiLCAmSVBGaWx0ZXJSdWxlX3R5cGUpOworCQkvKiBBTklEICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTUwNCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQU5JRCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogQU4tVHJ1c3RlZCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE1MDMsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkFOLVRydXN0ZWQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKEFOLVRydXN0ZWQpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJUUlVTVEVEIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIlVOVFJVU1RFRCIsIHsgLmkzMj0xIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBNSVAtRkEtUksgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNTA2LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJNSVAtRkEtUksiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBNSVAtRkEtUkstU1BJICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTUwNywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTUlQLUZBLVJLLVNQSSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogRnVsbC1OZXR3b3JrLU5hbWUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNTE2LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJGdWxsLU5ldHdvcmstTmFtZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFNob3J0LU5ldHdvcmstTmFtZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE1MTcsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlNob3J0LU5ldHdvcmstTmFtZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIE1vYmlsZS1Ob2RlLUlkZW50aWZpZXIgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk1MDYsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk1vYmlsZS1Ob2RlLUlkZW50aWZpZXIiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIEFBQS1GYWlsdXJlLUluZGljYXRpb24gKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNTE4LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJBQUEtRmFpbHVyZS1JbmRpY2F0aW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBUcmFuc3BvcnQtQWNjZXNzLVR5cGUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNTE5LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJUcmFuc3BvcnQtQWNjZXNzLVR5cGUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFRyYW5zcG9ydC1BY2Nlc3MtVHlwZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIkJCRiIsIHsgLmkzMj0wIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogVmlzaXRlZC1OZXR3b3JrLUlkZW50aWZpZXIgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk2MDAsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlZpc2l0ZWQtTmV0d29yay1JZGVudGlmaWVyIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogREVSLUZsYWdzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTUyMCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiREVSLUZsYWdzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBERUEtRmxhZ3MgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNTIxLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJERUEtRmxhZ3MiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFNTSUQgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNTI0LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTU0lEIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBIRVNTSUQgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNTI1LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJIRVNTSUQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFRXQU4tQ29ubmVjdGlvbi1Nb2RlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTUyNywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiVFdBTi1Db25uZWN0aW9uLU1vZGUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIENvbm5lY3Rpdml0eS1GbGFncyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE1MjksCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkNvbm5lY3Rpdml0eS1GbGFncyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogVFdBTi1QQ08gKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNTMwLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJUV0FOLVBDTyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFRXQUctQ1AtQWRkcmVzcyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE1MzEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlRXQUctQ1AtQWRkcmVzcyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgQWRkcmVzc190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogVFdBRy1VUC1BZGRyZXNzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTUzMiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiVFdBRy1VUC1BZGRyZXNzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBUV0FOLVMyYS1GYWlsdXJlLUNhdXNlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTUzMywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiVFdBTi1TMmEtRmFpbHVyZS1DYXVzZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogU00tQmFjay1PZmYtVGltZXIgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNTM0LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTTS1CYWNrLU9mZi1UaW1lciIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogV0xDUC1LZXkgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNTM1LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJXTENQLUtleSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIEVtZXJnZW5jeS1TZXJ2aWNlcyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE1MzgsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkVtZXJnZW5jeS1TZXJ2aWNlcyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogSU1FSS1DaGVjay1Jbi1WUExNTi1SZXN1bHQgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNTQwLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJJTUVJLUNoZWNrLUluLVZQTE1OLVJlc3VsdCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogTm9uLTNHUFAtSVAtQWNjZXNzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTUwMSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTm9uLTNHUFAtSVAtQWNjZXNzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChOb24tM0dQUC1JUC1BY2Nlc3MpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJOT05fM0dQUF9TVUJTQ1JJUFRJT05fQUxMT1dFRCIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJOT05fM0dQUF9TVUJTQ1JJUFRJT05fQkFSUkVEIiwgeyAuaTMyPTEgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIE5vbi0zR1BQLUlQLUFjY2Vzcy1BUE4gKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNTAyLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJOb24tM0dQUC1JUC1BY2Nlc3MtQVBOIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChOb24tM0dQUC1JUC1BY2Nlc3MtQVBOKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiTm9uXzNHUFBfQVBOU19FTkFCTEUiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiTm9uXzNHUFBfQVBOU19ESVNBQkxFIiwgeyAuaTMyPTEgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFBQUi1GbGFncyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE1MDgsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlBQUi1GbGFncyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogVFdBTi1EZWZhdWx0LUFQTi1Db250ZXh0LUlkICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTUxMiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiVFdBTi1EZWZhdWx0LUFQTi1Db250ZXh0LUlkIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBBY2Nlc3MtQXV0aG9yaXphdGlvbi1GbGFncyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE1MTEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkFjY2Vzcy1BdXRob3JpemF0aW9uLUZsYWdzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBTZXJ2aWNlLVNlbGVjdGlvbiAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTQ5MywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiU2VydmljZS1TZWxlY3Rpb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIDNHUFAtQUFBLVNlcnZlci1OYW1lICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzE4LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSIzR1BQLUFBQS1TZXJ2ZXItTmFtZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgRGlhbWV0ZXJJZGVudGl0eV90eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogRVJQLUF1dGhvcml6YXRpb24gKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNTQxLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJFUlAtQXV0aG9yaXphdGlvbiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogTUlQNi1GZWF0dXJlLVZlY3RvciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEyNCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTUlQNi1GZWF0dXJlLVZlY3RvciIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVENjQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogT3JpZ2luYXRpb24tVGltZS1TdGFtcCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE1MzYsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk9yaWdpbmF0aW9uLVRpbWUtU3RhbXAiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDY0CS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIE1heGltdW0tV2FpdC1UaW1lICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTUzNywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTWF4aW11bS1XYWl0LVRpbWUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIEFjY2Vzcy1OZXR3b3JrLUluZm8gKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNTI2LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJBY2Nlc3MtTmV0d29yay1JbmZvIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBNSVA2LUFnZW50LUluZm8gKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk0ODYsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk1JUDYtQWdlbnQtSW5mbyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogV0xBTi1JZGVudGlmaWVyICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTUwOSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiV0xBTi1JZGVudGlmaWVyIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBUV0FOLUNvbm5lY3Rpdml0eS1QYXJhbWV0ZXJzICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTUyOCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiVFdBTi1Db25uZWN0aXZpdHktUGFyYW1ldGVycyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogVFdBTi1BY2Nlc3MtSW5mbyAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTE1MTAsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlRXQU4tQWNjZXNzLUluZm8iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIFRyYWNlLUluZm8gKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNTA1LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJUcmFjZS1JbmZvIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBOb24tM0dQUC1Vc2VyLURhdGEgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxNTAwLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJOb24tM0dQUC1Vc2VyLURhdGEiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisKKwkKKyAgIH0KKworICAgLyogQ29tbWFuZHMgc2VjdGlvbiAqLworICAgeworCisgICB9CisKKyAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRpY3RfdHMyOTI3M19hdnBzX2xvYWRfcnVsZXMoY2hhciAqIGNvbmZmaWxlKQoreworICAgLyogR3JvdXBlZCBBVlAgc2VjdGlvbiAqLworICAgeworCSAgLyogQWNjZXNzLU5ldHdvcmstSW5mbyAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQWNjZXNzLU5ldHdvcmstSW5mbyJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU1NJRCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQlNTSUQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiTG9jYXRpb24tSW5mb3JtYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiTG9jYXRpb24tRGF0YSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJPcGVyYXRvci1OYW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTMwMTksIC5hdnBfbmFtZSA9ICJMb2dpY2FsLUFjY2Vzcy1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIE1JUDYtQWdlbnQtSW5mbyAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTUlQNi1BZ2VudC1JbmZvIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk1JUC1Ib21lLUFnZW50LUFkZHJlc3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIDIgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJNSVAtSG9tZS1BZ2VudC1Ib3N0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk1JUDYtSG9tZS1MaW5rLVByZWZpeCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIFdMQU4tSWRlbnRpZmllciAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiV0xBTi1JZGVudGlmaWVyIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTU0lEIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJIRVNTSUQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBUV0FOLUNvbm5lY3Rpdml0eS1QYXJhbWV0ZXJzICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUV0FOLUNvbm5lY3Rpdml0eS1QYXJhbWV0ZXJzIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDb25uZWN0aXZpdHktRmxhZ3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNlcnZpY2UtU2VsZWN0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQRE4tVHlwZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU2VydmVkLVBhcnR5LUlQLUFkZHJlc3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIDIgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVFdBTi1QQ08ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlRXQUctVVAtQWRkcmVzcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVFdBTi1TMmEtRmFpbHVyZS1DYXVzZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU00tQmFjay1PZmYtVGltZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBUV0FOLUFjY2Vzcy1JbmZvICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUV0FOLUFjY2Vzcy1JbmZvIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBY2Nlc3MtQXV0aG9yaXphdGlvbi1GbGFncyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiV0xBTi1JZGVudGlmaWVyIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogVHJhY2UtSW5mbyAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVHJhY2UtSW5mbyJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVHJhY2UtRGF0YSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVHJhY2UtUmVmZXJlbmNlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogTm9uLTNHUFAtVXNlci1EYXRhICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJOb24tM0dQUC1Vc2VyLURhdGEifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU3Vic2NyaXB0aW9uLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJOb24tM0dQUC1JUC1BY2Nlc3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk5vbi0zR1BQLUlQLUFjY2Vzcy1BUE4ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJBVC1UeXBlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlNlc3Npb24tVGltZW91dCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTUlQNi1GZWF0dXJlLVZlY3RvciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQU1CUiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiM0dQUC1DaGFyZ2luZy1DaGFyYWN0ZXJpc3RpY3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNvbnRleHQtSWRlbnRpZmllciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQVBOLU9JLVJlcGxhY2VtZW50In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBUE4tQ29uZmlndXJhdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVHJhY2UtSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVFdBTi1EZWZhdWx0LUFQTi1Db250ZXh0LUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUV0FOLUFjY2Vzcy1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJFbWVyZ2VuY3ktSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRVJQLUF1dGhvcml6YXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisKKyAgIH0JCisKKyAgIC8qIENvbW1hbmRzIHNlY3Rpb24gKi8KKyAgIHsKKworICAgfQorCisgICBMT0dfRCggIkV4dGVuc2lvbiAnRGljdGlvbmFyeSBkZWZpbml0aW9ucyBmb3IgdHMyOTI3M19hdnBzIChlMjApJyBpbml0aWFsaXplZCIpOworICAgcmV0dXJuIDA7Cit9CisKK2ludCBkaWN0X2VudHJ5KGNoYXIgKiBjb25mZmlsZSkKK3sKKwlkaWN0X3RzMjkyNzNfYXZwc19sb2FkX2RlZnMoY29uZmZpbGUpOworCXJldHVybiBkaWN0X3RzMjkyNzNfYXZwc19sb2FkX3J1bGVzKGNvbmZmaWxlKTsKK30KKworY29uc3QgY2hhciogZGljdF90czI5MjczX2F2cHNfcHJvdG9fdmVyKGNoYXIgKiBjb25mZmlsZSkgeworCXJldHVybiB0czI5MjczX2F2cHNfcHJvdG9fdmVyOworfQorCitjb25zdCBkb3VibGUgZGljdF90czI5MjczX2F2cHNfZ2VuX3RzKGNoYXIgKiBjb25mZmlsZSkgeworCXJldHVybiB0czI5MjczX2F2cHNfZ2VuX2RhdGU7Cit9CisKK0VYVEVOU0lPTl9FTlRSWTIoImRpY3RfdHMyOTI3M19hdnBzIiwgZGljdF90czI5MjczX2F2cHNfbG9hZF9kZWZzLCBkaWN0X3RzMjkyNzNfYXZwc19sb2FkX3J1bGVzLCAiZGljdF90czMyMjk5X2F2cHMiLCAiZGljdF90czI5MjcyX2F2cHMiLCAiZGljdF90czI5MjEyX2F2cHMiLCAiZGljdF90czI5MjI5X2F2cHMiLCAiZGljdF9yZmM1Nzc4X2F2cHMiLCAiZGljdF90czI5MDYxX2F2cHMiLCAiZGljdF9yZmM0MDA2YmlzX2F2cHMiLCAiZGljdF9yZmM2OTQyX2F2cHMiLCAiZGljdF9yZmM3MTU1X2F2cHMiLCAiZGljdF9yZmM0MDcyX2F2cHMiLCAiZGljdF9yZmM1NDQ3X2F2cHMiLCAiZGljdF9yZmM3NjgzX2F2cHMiLCAiZGljdF9yZmM2NzM0X2F2cHMiLCAiZGljdF9yZmM0MDA0X2F2cHMiLCAiZGljdF9yZmM1NTgwX2F2cHMiLCAiZGljdF9yZmM1Nzc3X2F2cHMiLCAiZGljdF9kcmFmdGxvYWRfYXZwcyIsICJkaWN0X2V0c2kyODMwMzRfYXZwcyIsICJkaWN0X3JmYzc5NDRfYXZwcyIpOworCisKKwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X3RzMjkyNzNfYXZwcy90czI5MjczX2F2cHMuZGlkIGIvZXh0ZW5zaW9ucy9kaWN0X3RzMjkyNzNfYXZwcy90czI5MjczX2F2cHMuZGlkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyM2I3ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfdHMyOTI3M19hdnBzL3RzMjkyNzNfYXZwcy5kaWQKQEAgLTAsMCArMSwzNyBAQAorZGljdF9yZmM2OTQyX2F2cHMKK2RpY3RfcmZjNjczNF9hdnBzCitkaWN0X3JmYzU1ODBfYXZwcworZGljdF90czI5NDY4X2F2cHMKK2RpY3RfdHMyOTE1NF9hdnBzCitkaWN0X3RzMjkyMTRfYXZwcworZGljdF90czI5MjE1X2F2cHMKK2RpY3RfdHMyOTIxN19hdnBzCitkaWN0XzNncHAyX2F2cHMKK2RpY3RfdHMyOTM0M19hdnBzCitkaWN0X3RzMjkxMjhfYXZwcworZGljdF90czI5MzQ0X2F2cHMKK2RpY3RfdHMyOTM0NV9hdnBzCitkaWN0X3RzMzIyOTlfYXZwcworZGljdF9yZmM1Nzc4X2F2cHMKK2RpY3RfdHMyOTMzOF9hdnBzCitkaWN0X3RzMjkxNzNfYXZwcworZGljdF90czI5MzM3X2F2cHMKK2RpY3RfZXRzaTI4MzAzNF9hdnBzCitkaWN0X3JmYzQ1OTBfYXZwcworZGljdF90czI5MjI5X2F2cHMKK2RpY3RfZHJhZnRsb2FkX2F2cHMKK2RpY3RfdHMyOTMyOV9hdnBzCitkaWN0X3RzMjkzNjhfYXZwcworZGljdF90czI5MzM2X2F2cHMKK2RpY3RfdHMyOTA2MV9hdnBzCitkaWN0X3RzMjkyNzJfYXZwcworZGljdF9yZmM3NjgzX2F2cHMKK2RpY3RfcmZjNzk0NF9hdnBzCitkaWN0X3JmYzU3NzdfYXZwcworZGljdF9yZmM0MDA2YmlzX2F2cHMKK2RpY3RfdHMyOTIxMl9hdnBzCitkaWN0X3JmYzcxNTVfYXZwcworZGljdF9yZmM0MDcyX2F2cHMKK2RpY3RfcmZjNDAwNF9hdnBzCitkaWN0X3JmYzU0NDdfYXZwcworZGljdF90czI5MjczX2F2cHMKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF90czI5MzI5X2F2cHMvQ01ha2VMaXN0cy50eHQgYi9leHRlbnNpb25zL2RpY3RfdHMyOTMyOV9hdnBzL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhZjA1ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfdHMyOTMyOV9hdnBzL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTYgQEAKKyMgVGhlIGRpY3RfdHMyOTMyOV9hdnBzIGV4dGVuc2lvbgorUFJPSkVDVCgiZGljdF90czI5MzI5X2F2cHMgbGlicmFyeSBnZW5lcmF0ZWQgYnkgRmRHZW4gIiBDKQorCisjIENvbXBpbGUgYXMgYSBtb2R1bGUKK0ZEX0FERF9FWFRFTlNJT04oZGljdF90czI5MzI5X2F2cHMgZGljdF90czI5MzI5X2F2cHMuYykKKworCisjIyMjCisjIyBJTlNUQUxMIHNlY3Rpb24gIyMKKworSU5TVEFMTChUQVJHRVRTIGRpY3RfdHMyOTMyOV9hdnBzCisJTElCUkFSWSBERVNUSU5BVElPTiAke0lOU1RBTExfRVhURU5TSU9OU19TVUZGSVh9CitDT01QT05FTlQgZnJlZURpYW1ldGVyLWRpY3Rpb25hcnktVFMyOTMyOV9BVlBTKQorCisKKwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X3RzMjkzMjlfYXZwcy9kaWN0X3RzMjkzMjlfYXZwcy5jIGIvZXh0ZW5zaW9ucy9kaWN0X3RzMjkzMjlfYXZwcy9kaWN0X3RzMjkzMjlfYXZwcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNTc3ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfdHMyOTMyOV9hdnBzL2RpY3RfdHMyOTMyOV9hdnBzLmMKQEAgLTAsMCArMSw2NDMgQEAKKy8qCisqIENvcHlyaWdodCAoYykgMjAxNyBTcHJpbnQKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLyoqKioqKioqKioqKioqKioKKyBHZW5lcmF0ZWQgQnk6IGZkdG9vbCBlbmhhbmNlbWVudHMgdG8gZGlhZnV6emVyCisgTGljZW5zZTogc2FtZSBhcyBmcmVlRGlhbWV0ZXIKKyoqKioqKioqKioqKioqKiovCisKKworLyogCisgKiBEaWN0aW9uYXJ5IGRlZmluaXRpb25zIG9mIG9iamVjdHMgc3BlY2lmaWVkIGluIHRzMjkzMjlfYXZwcyAoZTIwKS4KKyAqLworI2luY2x1ZGUgPGZyZWVEaWFtZXRlci9leHRlbnNpb24uaD4KKworI2RlZmluZSBQUk9UT19WRVIgImUyMCIKKyNkZWZpbmUgR0VOX0RBVEUgIDE1MDY2OTcxNDYuODgKKworY29uc3QgY2hhciAqdHMyOTMyOV9hdnBzX3Byb3RvX3ZlciA9IFBST1RPX1ZFUjsKK2NvbnN0IGRvdWJsZSB0czI5MzI5X2F2cHNfZ2VuX2RhdGUgPSBHRU5fREFURTsKKworLyogVGhlIGNvbnRlbnQgb2YgdGhpcyBmaWxlIGZvbGxvd3MgdGhlIHNhbWUgc3RydWN0dXJlIGFzIGRpY3RfYmFzZV9wcm90by5jICovCisKKyNkZWZpbmUgQ0hFQ0tfZGljdF9uZXcoIF90eXBlLCBfZGF0YSwgX3BhcmVudCwgX3JlZiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgX3JldCA9IGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIChfdHlwZSksIChfZGF0YSksIChfcGFyZW50KSwgKF9yZWYpICk7IFwKKyAgICBpZiAoIF9yZXQgIT0gMCAmJiBfcmV0ICE9IEVFWElTVCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICByZXR1cm4gX3JldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBDSEVDS19kaWN0X3NlYXJjaCggX3R5cGUsIF9jcml0ZXJpYSwgX3doYXQsIF9yZXN1bHQgKQkJXAorICAgIENIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIChfdHlwZSksIChfY3JpdGVyaWEpLCAoX3doYXQpLCAoX3Jlc3VsdCksIEVOT0VOVCkgKTsKKworc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24geworICAgIHN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lOworICAgIGVudW0gcnVsZV9wb3NpdGlvbglwb3NpdGlvbjsKKyAgICBpbnQgCQkJbWluOworICAgIGludAkJCW1heDsKK307CisKKyNkZWZpbmUgUlVMRV9PUkRFUiggX3Bvc2l0aW9uICkgKCgoKF9wb3NpdGlvbikgPT0gUlVMRV9GSVhFRF9IRUFEKSB8fCAoKF9wb3NpdGlvbikgPT0gUlVMRV9GSVhFRF9UQUlMKSkgPyAxIDogMCApCisKKy8qIEF0dGVudGlvbiEgVGhpcyB2ZXJzaW9uIG9mIHRoZSBtYWNybyB1c2VzIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsIGluIGNvbnRyYXN0IHRvIG1vc3Qgb3RoZXIgY29waWVzISAqLworI2RlZmluZSBQQVJTRV9sb2NfcnVsZXMoIF9ydWxlYXJyYXksIF9wYXJlbnQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBfX2FyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yIChfX2FyPTA7IF9fYXIgPCBzaXplb2YoX3J1bGVhcnJheSkgLyBzaXplb2YoKF9ydWxlYXJyYXkpWzBdKTsgX19hcisrKSB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHN0cnVjdCBkaWN0X3J1bGVfZGF0YSBfX2RhdGEgPSB7IE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ucG9zaXRpb24sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLm1pbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ubWF4fTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfX2RhdGEucnVsZV9vcmRlciA9IFJVTEVfT1JERVIoX19kYXRhLnJ1bGVfcG9zaXRpb24pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIENIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIERJQ1RfQVZQLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAmKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICZfX2RhdGEucnVsZV9hdnAsIDAgKSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmICggIV9fZGF0YS5ydWxlX2F2cCApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9ERUJVRyhJTkZPLCAiQVZQIE5vdCBmb3VuZDogJyVzJyIsIChfcnVsZWFycmF5KVtfX2FyXS5hdnBfdmVuZG9yX3BsdXNfbmFtZS5hdnBfbmFtZSk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFTk9FTlQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgX3JldCA9IGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfUlVMRSwgJihfX2RhdGEpLCAoX3BhcmVudCksIE5VTEwgKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggX3JldCAhPSAwICYmIF9yZXQgIT0gRUVYSVNUICkgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFX0RFQlVHKElORk8sICJFcnJvciBvbiBydWxlIHdpdGggQVZQICclcyciLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLmF2cF9uYW1lKTsgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRUlOVkFMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgQ0hFQ0tfdmVuZG9yX25ldyggX2RhdGEgKSB7IFwKKyAgICAgICAgc3RydWN0IGRpY3Rfb2JqZWN0ICogdmVuZG9yX2ZvdW5kOyBcCisgICAgICAgIGlmIChmZF9kaWN0X3NlYXJjaChmZF9nX2NvbmZpZy0+Y25mX2RpY3QsRElDVF9WRU5ET1IsVkVORE9SX0JZX0lELCZfZGF0YS52ZW5kb3JfaWQsJnZlbmRvcl9mb3VuZCxFTk9FTlQpID09IEVOT0VOVCkgeyBcCisgICAgICAgICAgICAgICAgQ0hFQ0tfRkNUKGZkX2RpY3RfbmV3KGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9WRU5ET1IsICZfZGF0YSwgTlVMTCwgTlVMTCkpOyBcCisgICAgICAgIH0gXAorfQorCisjZGVmaW5lIGVudW12YWxfZGVmX3UzMiggX3ZhbF8sIF9zdHJfICkJCVwKKyAgICB7IF9zdHJfLCAJCXsgLnUzMiA9IF92YWxfIH19CisKKyNkZWZpbmUgZW51bXZhbF9kZWZfb3MoIF9sZW5fLCBfdmFsXywgX3N0cl8gKQkJCQlcCisgICAgeyBfc3RyXywgCQl7IC5vcyA9IHsgLmRhdGEgPSAodW5zaWduZWQgY2hhciAqKV92YWxfLCAubGVuID0gX2xlbl8gfX19CisKKworc3RhdGljIGludCBkaWN0X3RzMjkzMjlfYXZwc19sb2FkX2RlZnMoY2hhciAqIGNvbmZmaWxlKQoreworICAgVFJBQ0VfRU5UUlkoIiVwIiwgY29uZmZpbGUpOworCS8qIEFwcGxpY2F0aW9uIFNlY3Rpb24gKi8KKwl7CisJCS8qIENyZWF0ZSB0aGUgdmVuZG9ycyAqLwkJeworCQkJc3RydWN0IGRpY3RfdmVuZG9yX2RhdGEgdmVuZG9yX2RhdGEgPSB7IDEwNDE1LCAiM0dQUCIgfTsKKwkJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVkVORE9SLCAmdmVuZG9yX2RhdGEsIE5VTEwsIE5VTEwpCisJCX0KKwl9CisKKworICAgLyogQVZQIHNlY3Rpb24gKi8KKyAgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogQWRkcmVzc190eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBVVEY4U3RyaW5nX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIERpYW1ldGVySWRlbnRpdHlfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogRGlhbWV0ZXJVUklfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogVGltZV90eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBJUEZpbHRlclJ1bGVfdHlwZTsKKworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJBZGRyZXNzIiwgJkFkZHJlc3NfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIlVURjhTdHJpbmciLCAmVVRGOFN0cmluZ190eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiRGlhbWV0ZXJJZGVudGl0eSIsICZEaWFtZXRlcklkZW50aXR5X3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJEaWFtZXRlclVSSSIsICZEaWFtZXRlclVSSV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiVGltZSIsICZUaW1lX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJJUEZpbHRlclJ1bGUiLCAmSVBGaWx0ZXJSdWxlX3R5cGUpOworCQkvKiBNU0lTRE4gKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk3MDEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk1TSVNETiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFVzZXItRGF0YSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTcwMiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiVXNlci1EYXRhIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogRGF0YS1SZWZlcmVuY2UgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk3MDMsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkRhdGEtUmVmZXJlbmNlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChEYXRhLVJlZmVyZW5jZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIlJlcG9zaXRvcnlEYXRhIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIklNU1B1YmxpY0lkZW50aXR5IiwgeyAuaTMyPTEwIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMgPSB7ICJJTVNVc2VyU3RhdGUiLCB7IC5pMzI9MTEgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNCA9IHsgIlNfQ1NDRk5hbWUiLCB7IC5pMzI9MTIgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNSA9IHsgIkluaXRpYWxGaWx0ZXJDcml0ZXJpYSIsIHsgLmkzMj0xMyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF82ID0geyAiTG9jYXRpb25JbmZvcm1hdGlvbiIsIHsgLmkzMj0xNCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF83ID0geyAiVXNlclN0YXRlIiwgeyAuaTMyPTE1IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzggPSB7ICJDaGFyZ2luZ0luZm9ybWF0aW9uIiwgeyAuaTMyPTE2IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzkgPSB7ICJNU0lTRE4iLCB7IC5pMzI9MTcgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTAgPSB7ICJQU0lBY3RpdmF0aW9uIiwgeyAuaTMyPTE4IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzExID0geyAiRFNBSSIsIHsgLmkzMj0xOSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xMiA9IHsgIlNlcnZpY2VMZXZlbFRyYWNlSW5mbyIsIHsgLmkzMj0yMSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xMyA9IHsgIklQQWRkcmVzc1NlY3VyZUJpbmRpbmdJbmZvcm1hdGlvbiIsIHsgLmkzMj0yMiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xNCA9IHsgIlNlcnZpY2VQcmlvcml0eUxldmVsIiwgeyAuaTMyPTIzIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzE1ID0geyAiU01TUmVnaXN0cmF0aW9uSW5mbyIsIHsgLmkzMj0yNCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xNiA9IHsgIlVFUmVhY2hhYmlsaXR5Rm9ySVAiLCB7IC5pMzI9MjUgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTcgPSB7ICJUQURTaW5mb3JtYXRpb24iLCB7IC5pMzI9MjYgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTggPSB7ICJTVE5fU1IiLCB7IC5pMzI9MjcgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTkgPSB7ICJVRV9TUlZDQ19DYXBhYmlsaXR5IiwgeyAuaTMyPTI4IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIwID0geyAiRXh0ZW5kZWRQcmlvcml0eSIsIHsgLmkzMj0yOSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yMSA9IHsgIkNTUk4iLCB7IC5pMzI9MzAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMjIgPSB7ICJSZWZlcmVuY2VMb2NhdGlvbkluZm9ybWF0aW9uIiwgeyAuaTMyPTMxIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIzID0geyAiSU1TSSIsIHsgLmkzMj0zMiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yNCA9IHsgIklNU1ByaXZhdGVVc2VySWRlbnRpdHkiLCB7IC5pMzI9MzMgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF80LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzUsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF83LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzgsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfOSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xNCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xNSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xNiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xNywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xOCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xOSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yMCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yNCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogU2VydmljZS1JbmRpY2F0aW9uICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNzA0LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTZXJ2aWNlLUluZGljYXRpb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBTdWJzLVJlcS1UeXBlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNzA1LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTdWJzLVJlcS1UeXBlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChTdWJzLVJlcS1UeXBlKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiU3Vic2NyaWJlIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIlVuc3Vic2NyaWJlIiwgeyAuaTMyPTEgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFJlcXVlc3RlZC1Eb21haW4gKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk3MDYsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlJlcXVlc3RlZC1Eb21haW4iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFJlcXVlc3RlZC1Eb21haW4pIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJDU19Eb21haW4iLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiUFNfRG9tYWluIiwgeyAuaTMyPTEgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIEN1cnJlbnQtTG9jYXRpb24gKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk3MDcsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkN1cnJlbnQtTG9jYXRpb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKEN1cnJlbnQtTG9jYXRpb24pIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJEb05vdE5lZWRJbml0aWF0ZUFjdGl2ZUxvY2F0aW9uUmV0cmlldmFsIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIkluaXRpYXRlQWN0aXZlTG9jYXRpb25SZXRyaWV2YWwiLCB7IC5pMzI9MSB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogSWRlbnRpdHktU2V0ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNzA4LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJJZGVudGl0eS1TZXQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKElkZW50aXR5LVNldCkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIkFMTF9JREVOVElUSUVTIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIlJFR0lTVEVSRURfSURFTlRJVElFUyIsIHsgLmkzMj0xIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMgPSB7ICJJTVBMSUNJVF9JREVOVElUSUVTIiwgeyAuaTMyPTIgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNCA9IHsgIkFMSUFTX0lERU5USVRJRVMiLCB7IC5pMzI9MyB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzQsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIEV4cGlyeS1UaW1lICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNzA5LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJFeHBpcnktVGltZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVGltZV90eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogU2VuZC1EYXRhLUluZGljYXRpb24gKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk3MTAsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlNlbmQtRGF0YS1JbmRpY2F0aW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChTZW5kLURhdGEtSW5kaWNhdGlvbikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIlVTRVJfREFUQV9OT1RfUkVRVUVTVEVEIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIlVTRVJfREFUQV9SRVFVRVNURUQiLCB7IC5pMzI9MSB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogRFNBSS1UYWcgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk3MTEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkRTQUktVGFnIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogV2lsZGNhcmRlZC1QdWJsaWMtSWRlbnRpdHkgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk2MzQsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIldpbGRjYXJkZWQtUHVibGljLUlkZW50aXR5IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBXaWxkY2FyZGVkLUlNUFUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk2MzYsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIldpbGRjYXJkZWQtSU1QVSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogT25lLVRpbWUtTm90aWZpY2F0aW9uICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNzEyLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJPbmUtVGltZS1Ob3RpZmljYXRpb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKE9uZS1UaW1lLU5vdGlmaWNhdGlvbikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIk9ORV9USU1FX05PVElGSUNBVElPTl9SRVFVRVNURUQiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiSVAiLCB7IC5pMzI9MjUgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFJlcXVlc3RlZC1Ob2RlcyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTcxMywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUmVxdWVzdGVkLU5vZGVzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBTZXJ2aW5nLU5vZGUtSW5kaWNhdGlvbiAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTcxNCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiU2VydmluZy1Ob2RlLUluZGljYXRpb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFNlcnZpbmctTm9kZS1JbmRpY2F0aW9uKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiT05MWV9TRVJWSU5HX05PREVTX1JFUVVJUkVEIiwgeyAuaTMyPTAgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBTZXF1ZW5jZS1OdW1iZXIgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk3MTYsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlNlcXVlbmNlLU51bWJlciIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogUHJlLXBhZ2luZy1TdXBwb3J0ZWQgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk3MTcsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlByZS1wYWdpbmctU3VwcG9ydGVkIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChQcmUtcGFnaW5nLVN1cHBvcnRlZCkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIlBSRVBBR0lOR19OT1RfU1VQUE9SVEVEIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIlBSRVBBR0lOR19TVVBQT1JURUQiLCB7IC5pMzI9MSB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogTG9jYWwtVGltZS1ab25lLUluZGljYXRpb24gKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk3MTgsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkxvY2FsLVRpbWUtWm9uZS1JbmRpY2F0aW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChMb2NhbC1UaW1lLVpvbmUtSW5kaWNhdGlvbikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIk9OTFlfTE9DQUxfVElNRV9aT05FX1JFUVVFU1RFRCIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJMT0NBTF9USU1FX1pPTkVfV0lUSF9MT0NBVElPTl9JTkZPX1JFUVVFU1RFRCIsIHsgLmkzMj0xIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBVRFItRmxhZ3MgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk3MTksCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlVEUi1GbGFncyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogQ2FsbC1SZWZlcmVuY2UtTnVtYmVyICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNzIxLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJDYWxsLVJlZmVyZW5jZS1OdW1iZXIiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBBUy1OdW1iZXIgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk3MjIsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkFTLU51bWJlciIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFVzZXItSWRlbnRpdHkgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk3MDAsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlVzZXItSWRlbnRpdHkiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIENhbGwtUmVmZXJlbmNlLUluZm8gKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk3MjAsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkNhbGwtUmVmZXJlbmNlLUluZm8iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIFJlcG9zaXRvcnktRGF0YS1JRCAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTcxNSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUmVwb3NpdG9yeS1EYXRhLUlEIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCisJCisgICB9CisKKyAgIC8qIENvbW1hbmRzIHNlY3Rpb24gKi8KKyAgIHsKKworICAgfQorCisgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkaWN0X3RzMjkzMjlfYXZwc19sb2FkX3J1bGVzKGNoYXIgKiBjb25mZmlsZSkKK3sKKyAgIC8qIEdyb3VwZWQgQVZQIHNlY3Rpb24gKi8KKyAgIHsKKwkgIC8qIFVzZXItSWRlbnRpdHkgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlVzZXItSWRlbnRpdHkifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlB1YmxpYy1JZGVudGl0eSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTVNJU0ROIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogQ2FsbC1SZWZlcmVuY2UtSW5mbyAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ2FsbC1SZWZlcmVuY2UtSW5mbyJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ2FsbC1SZWZlcmVuY2UtTnVtYmVyIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBUy1OdW1iZXIifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBSZXBvc2l0b3J5LURhdGEtSUQgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJlcG9zaXRvcnktRGF0YS1JRCJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU2VydmljZS1JbmRpY2F0aW9uIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTZXF1ZW5jZS1OdW1iZXIifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisKKyAgIH0JCisKKyAgIC8qIENvbW1hbmRzIHNlY3Rpb24gKi8KKyAgIHsKKworICAgfQorCisgICBMT0dfRCggIkV4dGVuc2lvbiAnRGljdGlvbmFyeSBkZWZpbml0aW9ucyBmb3IgdHMyOTMyOV9hdnBzIChlMjApJyBpbml0aWFsaXplZCIpOworICAgcmV0dXJuIDA7Cit9CisKK2ludCBkaWN0X2VudHJ5KGNoYXIgKiBjb25mZmlsZSkKK3sKKwlkaWN0X3RzMjkzMjlfYXZwc19sb2FkX2RlZnMoY29uZmZpbGUpOworCXJldHVybiBkaWN0X3RzMjkzMjlfYXZwc19sb2FkX3J1bGVzKGNvbmZmaWxlKTsKK30KKworY29uc3QgY2hhciogZGljdF90czI5MzI5X2F2cHNfcHJvdG9fdmVyKGNoYXIgKiBjb25mZmlsZSkgeworCXJldHVybiB0czI5MzI5X2F2cHNfcHJvdG9fdmVyOworfQorCitjb25zdCBkb3VibGUgZGljdF90czI5MzI5X2F2cHNfZ2VuX3RzKGNoYXIgKiBjb25mZmlsZSkgeworCXJldHVybiB0czI5MzI5X2F2cHNfZ2VuX2RhdGU7Cit9CisKK0VYVEVOU0lPTl9FTlRSWTIoImRpY3RfdHMyOTMyOV9hdnBzIiwgZGljdF90czI5MzI5X2F2cHNfbG9hZF9kZWZzLCBkaWN0X3RzMjkzMjlfYXZwc19sb2FkX3J1bGVzLCAiZGljdF90czI5MjI5X2F2cHMiLCAiZGljdF9kcmFmdGxvYWRfYXZwcyIsICJkaWN0X3JmYzc2ODNfYXZwcyIsICJkaWN0X3JmYzc5NDRfYXZwcyIpOworCisKKwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X3RzMjkzMjlfYXZwcy90czI5MzI5X2F2cHMuZGlkIGIvZXh0ZW5zaW9ucy9kaWN0X3RzMjkzMjlfYXZwcy90czI5MzI5X2F2cHMuZGlkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1OTYyNzQKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfdHMyOTMyOV9hdnBzL3RzMjkzMjlfYXZwcy5kaWQKQEAgLTAsMCArMSw5IEBACitkaWN0X2V0c2kyODMwMzRfYXZwcworZGljdF9yZmM0NTkwX2F2cHMKK2RpY3RfcmZjNDAwNF9hdnBzCitkaWN0X3JmYzcxNTVfYXZwcworZGljdF90czI5MjI5X2F2cHMKK2RpY3RfcmZjNzY4M19hdnBzCitkaWN0X2RyYWZ0bG9hZF9hdnBzCitkaWN0X3JmYzc5NDRfYXZwcworZGljdF90czI5MzI5X2F2cHMKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF90czI5MzM2X2F2cHMvQ01ha2VMaXN0cy50eHQgYi9leHRlbnNpb25zL2RpY3RfdHMyOTMzNl9hdnBzL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NjZhYTIKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfdHMyOTMzNl9hdnBzL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTYgQEAKKyMgVGhlIGRpY3RfdHMyOTMzNl9hdnBzIGV4dGVuc2lvbgorUFJPSkVDVCgiZGljdF90czI5MzM2X2F2cHMgbGlicmFyeSBnZW5lcmF0ZWQgYnkgRmRHZW4gIiBDKQorCisjIENvbXBpbGUgYXMgYSBtb2R1bGUKK0ZEX0FERF9FWFRFTlNJT04oZGljdF90czI5MzM2X2F2cHMgZGljdF90czI5MzM2X2F2cHMuYykKKworCisjIyMjCisjIyBJTlNUQUxMIHNlY3Rpb24gIyMKKworSU5TVEFMTChUQVJHRVRTIGRpY3RfdHMyOTMzNl9hdnBzCisJTElCUkFSWSBERVNUSU5BVElPTiAke0lOU1RBTExfRVhURU5TSU9OU19TVUZGSVh9CitDT01QT05FTlQgZnJlZURpYW1ldGVyLWRpY3Rpb25hcnktVFMyOTMzNl9BVlBTKQorCisKKwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X3RzMjkzMzZfYXZwcy9kaWN0X3RzMjkzMzZfYXZwcy5jIGIvZXh0ZW5zaW9ucy9kaWN0X3RzMjkzMzZfYXZwcy9kaWN0X3RzMjkzMzZfYXZwcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyOTU4OTYKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfdHMyOTMzNl9hdnBzL2RpY3RfdHMyOTMzNl9hdnBzLmMKQEAgLTAsMCArMSwxNDU0IEBACisvKgorKiBDb3B5cmlnaHQgKGMpIDIwMTcgU3ByaW50CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKy8qKioqKioqKioqKioqKioqCisgR2VuZXJhdGVkIEJ5OiBmZHRvb2wgZW5oYW5jZW1lbnRzIHRvIGRpYWZ1enplcgorIExpY2Vuc2U6IHNhbWUgYXMgZnJlZURpYW1ldGVyCisqKioqKioqKioqKioqKioqLworCisKKy8qIAorICogRGljdGlvbmFyeSBkZWZpbml0aW9ucyBvZiBvYmplY3RzIHNwZWNpZmllZCBpbiB0czI5MzM2X2F2cHMgKGUxMCkuCisgKi8KKyNpbmNsdWRlIDxmcmVlRGlhbWV0ZXIvZXh0ZW5zaW9uLmg+CisKKyNkZWZpbmUgUFJPVE9fVkVSICJlMTAiCisjZGVmaW5lIEdFTl9EQVRFICAxNTA4MDEwMTk4LjU5CisKK2NvbnN0IGNoYXIgKnRzMjkzMzZfYXZwc19wcm90b192ZXIgPSBQUk9UT19WRVI7Citjb25zdCBkb3VibGUgdHMyOTMzNl9hdnBzX2dlbl9kYXRlID0gR0VOX0RBVEU7CisKKy8qIFRoZSBjb250ZW50IG9mIHRoaXMgZmlsZSBmb2xsb3dzIHRoZSBzYW1lIHN0cnVjdHVyZSBhcyBkaWN0X2Jhc2VfcHJvdG8uYyAqLworCisjZGVmaW5lIENIRUNLX2RpY3RfbmV3KCBfdHlwZSwgX2RhdGEsIF9wYXJlbnQsIF9yZWYgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IF9yZXQgPSBmZF9kaWN0X25ldyggZmRfZ19jb25maWctPmNuZl9kaWN0LCAoX3R5cGUpLCAoX2RhdGEpLCAoX3BhcmVudCksIChfcmVmKSApOyBcCisgICAgaWYgKCBfcmV0ICE9IDAgJiYgX3JldCAhPSBFRVhJU1QgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgcmV0dXJuIF9yZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgQ0hFQ0tfZGljdF9zZWFyY2goIF90eXBlLCBfY3JpdGVyaWEsIF93aGF0LCBfcmVzdWx0ICkJCVwKKyAgICBDSEVDS19GQ1QoICBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCAoX3R5cGUpLCAoX2NyaXRlcmlhKSwgKF93aGF0KSwgKF9yZXN1bHQpLCBFTk9FTlQpICk7CisKK3N0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHsKKyAgICBzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZTsKKyAgICBlbnVtIHJ1bGVfcG9zaXRpb24JcG9zaXRpb247CisgICAgaW50IAkJCW1pbjsKKyAgICBpbnQJCQltYXg7Cit9OworCisjZGVmaW5lIFJVTEVfT1JERVIoIF9wb3NpdGlvbiApICgoKChfcG9zaXRpb24pID09IFJVTEVfRklYRURfSEVBRCkgfHwgKChfcG9zaXRpb24pID09IFJVTEVfRklYRURfVEFJTCkpID8gMSA6IDAgKQorCisvKiBBdHRlbnRpb24hIFRoaXMgdmVyc2lvbiBvZiB0aGUgbWFjcm8gdXNlcyBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCBpbiBjb250cmFzdCB0byBtb3N0IG90aGVyIGNvcGllcyEgKi8KKyNkZWZpbmUgUEFSU0VfbG9jX3J1bGVzKCBfcnVsZWFycmF5LCBfcGFyZW50KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgX19hcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoX19hcj0wOyBfX2FyIDwgc2l6ZW9mKF9ydWxlYXJyYXkpIC8gc2l6ZW9mKChfcnVsZWFycmF5KVswXSk7IF9fYXIrKykgeyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgZGljdF9ydWxlX2RhdGEgX19kYXRhID0geyBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLnBvc2l0aW9uLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5taW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLm1heH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgX19kYXRhLnJ1bGVfb3JkZXIgPSBSVUxFX09SREVSKF9fZGF0YS5ydWxlX3Bvc2l0aW9uKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBDSEVDS19GQ1QoICBmZF9kaWN0X3NlYXJjaCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgZmRfZ19jb25maWctPmNuZl9kaWN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBESUNUX0FWUCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgJihfcnVsZWFycmF5KVtfX2FyXS5hdnBfdmVuZG9yX3BsdXNfbmFtZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAmX19kYXRhLnJ1bGVfYXZwLCAwICkgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpZiAoICFfX2RhdGEucnVsZV9hdnAgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfREVCVUcoSU5GTywgIkFWUCBOb3QgZm91bmQ6ICclcyciLCAoX3J1bGVhcnJheSlbX19hcl0uYXZwX3ZlbmRvcl9wbHVzX25hbWUuYXZwX25hbWUpOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRU5PRU5UOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IF9yZXQgPSBmZF9kaWN0X25ldyggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1JVTEUsICYoX19kYXRhKSwgKF9wYXJlbnQpLCBOVUxMICk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIF9yZXQgIT0gMCAmJiBfcmV0ICE9IEVFWElTVCApICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9ERUJVRyhJTkZPLCAiRXJyb3Igb24gcnVsZSB3aXRoIEFWUCAnJXMnIiwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5hdnBfdmVuZG9yX3BsdXNfbmFtZS5hdnBfbmFtZSk7ICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVJTlZBTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIENIRUNLX3ZlbmRvcl9uZXcoIF9kYXRhICkgeyBcCisgICAgICAgIHN0cnVjdCBkaWN0X29iamVjdCAqIHZlbmRvcl9mb3VuZDsgXAorICAgICAgICBpZiAoZmRfZGljdF9zZWFyY2goZmRfZ19jb25maWctPmNuZl9kaWN0LERJQ1RfVkVORE9SLFZFTkRPUl9CWV9JRCwmX2RhdGEudmVuZG9yX2lkLCZ2ZW5kb3JfZm91bmQsRU5PRU5UKSA9PSBFTk9FTlQpIHsgXAorICAgICAgICAgICAgICAgIENIRUNLX0ZDVChmZF9kaWN0X25ldyhmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfVkVORE9SLCAmX2RhdGEsIE5VTEwsIE5VTEwpKTsgXAorICAgICAgICB9IFwKK30KKworI2RlZmluZSBlbnVtdmFsX2RlZl91MzIoIF92YWxfLCBfc3RyXyApCQlcCisgICAgeyBfc3RyXywgCQl7IC51MzIgPSBfdmFsXyB9fQorCisjZGVmaW5lIGVudW12YWxfZGVmX29zKCBfbGVuXywgX3ZhbF8sIF9zdHJfICkJCQkJXAorICAgIHsgX3N0cl8sIAkJeyAub3MgPSB7IC5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilfdmFsXywgLmxlbiA9IF9sZW5fIH19fQorCisKK3N0YXRpYyBpbnQgZGljdF90czI5MzM2X2F2cHNfbG9hZF9kZWZzKGNoYXIgKiBjb25mZmlsZSkKK3sKKyAgIFRSQUNFX0VOVFJZKCIlcCIsIGNvbmZmaWxlKTsKKwkvKiBBcHBsaWNhdGlvbiBTZWN0aW9uICovCisJeworCQkvKiBDcmVhdGUgdGhlIHZlbmRvcnMgKi8JCXsKKwkJCXN0cnVjdCBkaWN0X3ZlbmRvcl9kYXRhIHZlbmRvcl9kYXRhID0geyAxMDQxNSwgIjNHUFAiIH07CisJCQlDSEVDS19kaWN0X25ldyhESUNUX1ZFTkRPUiwgJnZlbmRvcl9kYXRhLCBOVUxMLCBOVUxMKQorCQl9CisJfQorCisKKyAgIC8qIEFWUCBzZWN0aW9uICovCisgICB7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIEFkZHJlc3NfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogVVRGOFN0cmluZ190eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBEaWFtZXRlcklkZW50aXR5X3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIERpYW1ldGVyVVJJX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIFRpbWVfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogSVBGaWx0ZXJSdWxlX3R5cGU7CisKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiQWRkcmVzcyIsICZBZGRyZXNzX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJVVEY4U3RyaW5nIiwgJlVURjhTdHJpbmdfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkRpYW1ldGVySWRlbnRpdHkiLCAmRGlhbWV0ZXJJZGVudGl0eV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiRGlhbWV0ZXJVUkkiLCAmRGlhbWV0ZXJVUklfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIlRpbWUiLCAmVGltZV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiSVBGaWx0ZXJSdWxlIiwgJklQRmlsdGVyUnVsZV90eXBlKTsKKwkJLyogSVAtU00tR1ctTnVtYmVyICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzEwMCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiSVAtU00tR1ctTnVtYmVyIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogSVAtU00tR1ctTmFtZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTMxMDEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIklQLVNNLUdXLU5hbWUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIERpYW1ldGVySWRlbnRpdHlfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFNlcnZpY2UtSUQgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzMTAzLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTZXJ2aWNlLUlEIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChTZXJ2aWNlLUlEKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiREVWSUNFX1RSSUdHRVIiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiU01TX01PIiwgeyAuaTMyPTEgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFNDUy1JZGVudGl0eSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTMxMDQsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlNDUy1JZGVudGl0eSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIEhTUy1DYXVzZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTMxMDksCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkhTUy1DYXVzZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogU0lSLUZsYWdzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzExMCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiU0lSLUZsYWdzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBFeHRlcm5hbC1JZGVudGlmaWVyICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzExMSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiRXh0ZXJuYWwtSWRlbnRpZmllciIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogSVAtU00tR1ctUmVhbG0gKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzMTEyLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJJUC1TTS1HVy1SZWFsbSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgRGlhbWV0ZXJJZGVudGl0eV90eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogUGVyaW9kaWMtQ29tbXVuaWNhdGlvbi1JbmRpY2F0b3IgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzMTE1LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJQZXJpb2RpYy1Db21tdW5pY2F0aW9uLUluZGljYXRvciIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogQ29tbXVuaWNhdGlvbi1EdXJhdGlvbi1UaW1lICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzExNiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQ29tbXVuaWNhdGlvbi1EdXJhdGlvbi1UaW1lIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBQZXJpb2RpYy1UaW1lICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzExNywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUGVyaW9kaWMtVGltZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogU3RhdGlvbmFyeS1JbmRpY2F0aW9uICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzExOSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiU3RhdGlvbmFyeS1JbmRpY2F0aW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBTQ0VGLVJlZmVyZW5jZS1JRCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTMxMjQsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlNDRUYtUmVmZXJlbmNlLUlEIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBTQ0VGLUlEICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzEyNSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiU0NFRi1JRCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgRGlhbWV0ZXJJZGVudGl0eV90eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogU0NFRi1SZWZlcmVuY2UtSUQtZm9yLURlbGV0aW9uICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzEyNiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiU0NFRi1SZWZlcmVuY2UtSUQtZm9yLURlbGV0aW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBNb25pdG9yaW5nLVR5cGUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzMTI3LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJNb25pdG9yaW5nLVR5cGUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIE1heGltdW0tTnVtYmVyLW9mLVJlcG9ydHMgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzMTI4LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJNYXhpbXVtLU51bWJlci1vZi1SZXBvcnRzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBNb25pdG9yaW5nLUR1cmF0aW9uICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzEzMCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTW9uaXRvcmluZy1EdXJhdGlvbiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVGltZV90eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogTWF4aW11bS1EZXRlY3Rpb24tVGltZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTMxMzEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk1heGltdW0tRGV0ZWN0aW9uLVRpbWUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFJlYWNoYWJpbGl0eS1UeXBlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzEzMiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUmVhY2hhYmlsaXR5LVR5cGUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIE1heGltdW0tTGF0ZW5jeSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTMxMzMsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk1heGltdW0tTGF0ZW5jeSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogTWF4aW11bS1SZXNwb25zZS1UaW1lICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzEzNCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTWF4aW11bS1SZXNwb25zZS1UaW1lIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBNT05URS1Mb2NhdGlvbi1UeXBlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzEzNiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTU9OVEUtTG9jYXRpb24tVHlwZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogQWNjdXJhY3kgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzMTM3LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJBY2N1cmFjeSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogQXNzb2NpYXRpb24tVHlwZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTMxMzgsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkFzc29jaWF0aW9uLVR5cGUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFJvYW1pbmctSW5mb3JtYXRpb24gKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzMTM5LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJSb2FtaW5nLUluZm9ybWF0aW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBSZWFjaGFiaWxpdHktSW5mb3JtYXRpb24gKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzMTQwLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJSZWFjaGFiaWxpdHktSW5mb3JtYXRpb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIElNRUktQ2hhbmdlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzE0MSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiSU1FSS1DaGFuZ2UiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFN1cHBvcnRlZC1Nb25pdG9yaW5nLUV2ZW50cyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTMxNDQsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlN1cHBvcnRlZC1Nb25pdG9yaW5nLUV2ZW50cyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVENjQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogQ0lSLUZsYWdzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzE0NSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQ0lSLUZsYWdzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBTZXJ2aWNlLVJlc3VsdC1Db2RlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzE0NywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiU2VydmljZS1SZXN1bHQtQ29kZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogUmVmZXJlbmNlLUlELVZhbGlkaXR5LVRpbWUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzMTQ4LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJSZWZlcmVuY2UtSUQtVmFsaWRpdHktVGltZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVGltZV90eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogRXZlbnQtSGFuZGxpbmcgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzMTQ5LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJFdmVudC1IYW5kbGluZyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogTm9kZS1UeXBlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzE1MywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTm9kZS1UeXBlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBTNnQtSFNTLUNhdXNlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzE1NCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUzZ0LUhTUy1DYXVzZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogUmVxdWVzdGVkLVZhbGlkaXR5LVRpbWUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzMTU5LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJSZXF1ZXN0ZWQtVmFsaWRpdHktVGltZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVGltZV90eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogR3JhbnRlZC1WYWxpZGl0eS1UaW1lICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzE2MCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiR3JhbnRlZC1WYWxpZGl0eS1UaW1lIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBUaW1lX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBMb3NzLU9mLUNvbm5lY3Rpdml0eS1SZWFzb24gKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzMTYyLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJMb3NzLU9mLUNvbm5lY3Rpdml0eS1SZWFzb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIEdyb3VwLVJlcG9ydGluZy1HdWFyZC1UaW1lciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTMxNjMsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkdyb3VwLVJlcG9ydGluZy1HdWFyZC1UaW1lciIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogQ0lBLUZsYWdzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzE2NCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQ0lBLUZsYWdzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBSSVItRmxhZ3MgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzMTY3LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJSSVItRmxhZ3MiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFR5cGUtT2YtRXh0ZXJuYWwtSWRlbnRpZmllciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTMxNjgsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlR5cGUtT2YtRXh0ZXJuYWwtSWRlbnRpZmllciIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogVDQtUGFyYW1ldGVycyAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTMxMDYsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlQ0LVBhcmFtZXRlcnMiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIFJlc3RyaWN0ZWQtUExNTi1MaXN0ICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzE1NywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUmVzdHJpY3RlZC1QTE1OLUxpc3QiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIE5JREQtQXV0aG9yaXphdGlvbi1SZXNwb25zZSAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTMxNTEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk5JREQtQXV0aG9yaXphdGlvbi1SZXNwb25zZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogVXNlci1JZGVudGlmaWVyICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzEwMiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiVXNlci1JZGVudGlmaWVyIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBTY2hlZHVsZWQtQ29tbXVuaWNhdGlvbi1UaW1lICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzExOCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiU2NoZWR1bGVkLUNvbW11bmljYXRpb24tVGltZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogQWxsb3dlZC1QTE1OLUxpc3QgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzMTU4LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJBbGxvd2VkLVBMTU4tTGlzdCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogTklERC1BdXRob3JpemF0aW9uLVVwZGF0ZSAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTMxNjEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk5JREQtQXV0aG9yaXphdGlvbi1VcGRhdGUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIExvY2F0aW9uLUluZm9ybWF0aW9uLUNvbmZpZ3VyYXRpb24gKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzMTM1LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJMb2NhdGlvbi1JbmZvcm1hdGlvbi1Db25maWd1cmF0aW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBOSURELUF1dGhvcml6YXRpb24tUmVxdWVzdCAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTMxNTAsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk5JREQtQXV0aG9yaXphdGlvbi1SZXF1ZXN0IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBTdXBwb3J0ZWQtU2VydmljZXMgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzMTQzLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTdXBwb3J0ZWQtU2VydmljZXMiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIFVFLVJlYWNoYWJpbGl0eS1Db25maWd1cmF0aW9uICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzEyOSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiVUUtUmVhY2hhYmlsaXR5LUNvbmZpZ3VyYXRpb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIFNlcnZpY2UtUmVzdWx0ICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzE0NiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiU2VydmljZS1SZXN1bHQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIFNlcnZpY2UtUmVwb3J0ICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzE1MiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiU2VydmljZS1SZXBvcnQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIEVuaGFuY2VkLUNvdmVyYWdlLVJlc3RyaWN0aW9uICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzE1NSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiRW5oYW5jZWQtQ292ZXJhZ2UtUmVzdHJpY3Rpb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIENvbW11bmljYXRpb24tUGF0dGVybi1TZXQgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzMTE0LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJDb21tdW5pY2F0aW9uLVBhdHRlcm4tU2V0IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBUNC1EYXRhICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzEwOCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiVDQtRGF0YSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogU2VydmljZS1QYXJhbWV0ZXJzICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzEwNSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiU2VydmljZS1QYXJhbWV0ZXJzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBNb25pdG9yaW5nLUV2ZW50LUNvbmZpZ3VyYXRpb24gKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzMTIyLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJNb25pdG9yaW5nLUV2ZW50LUNvbmZpZ3VyYXRpb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIEFFU0UtRXJyb3ItUmVwb3J0ICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzEyMSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQUVTRS1FcnJvci1SZXBvcnQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIE1vbml0b3JpbmctRXZlbnQtQ29uZmlnLVN0YXR1cyAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTMxNDIsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk1vbml0b3JpbmctRXZlbnQtQ29uZmlnLVN0YXR1cyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogQUVTRS1Db21tdW5pY2F0aW9uLVBhdHRlcm4gKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzMTEzLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJBRVNFLUNvbW11bmljYXRpb24tUGF0dGVybiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogQUVTRS1Db21tdW5pY2F0aW9uLVBhdHRlcm4tQ29uZmlnLVN0YXR1cyAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTMxMjAsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkFFU0UtQ29tbXVuaWNhdGlvbi1QYXR0ZXJuLUNvbmZpZy1TdGF0dXMiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIFNlcnZpY2UtRGF0YSAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTMxMDcsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlNlcnZpY2UtRGF0YSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogRW5oYW5jZWQtQ292ZXJhZ2UtUmVzdHJpY3Rpb24tRGF0YSAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTMxNTYsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkVuaGFuY2VkLUNvdmVyYWdlLVJlc3RyaWN0aW9uLURhdGEiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIE1vbml0b3JpbmctRXZlbnQtUmVwb3J0ICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzEyMywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTW9uaXRvcmluZy1FdmVudC1SZXBvcnQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIEdyb3VwLU1vbml0b3JpbmctRXZlbnQtUmVwb3J0LUl0ZW0gKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzMTY2LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJHcm91cC1Nb25pdG9yaW5nLUV2ZW50LVJlcG9ydC1JdGVtIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBHcm91cC1Nb25pdG9yaW5nLUV2ZW50LVJlcG9ydCAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTMxNjUsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkdyb3VwLU1vbml0b3JpbmctRXZlbnQtUmVwb3J0IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCisJCisgICB9CisKKyAgIC8qIENvbW1hbmRzIHNlY3Rpb24gKi8KKyAgIHsKKworICAgfQorCisgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkaWN0X3RzMjkzMzZfYXZwc19sb2FkX3J1bGVzKGNoYXIgKiBjb25mZmlsZSkKK3sKKyAgIC8qIEdyb3VwZWQgQVZQIHNlY3Rpb24gKi8KKyAgIHsKKwkgIC8qIFQ0LVBhcmFtZXRlcnMgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlQ0LVBhcmFtZXRlcnMifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlByaW9yaXR5LUluZGljYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNNLVJQLVNNRUEifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBSZXN0cmljdGVkLVBMTU4tTGlzdCAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUmVzdHJpY3RlZC1QTE1OLUxpc3QifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlZpc2l0ZWQtUExNTi1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIE5JREQtQXV0aG9yaXphdGlvbi1SZXNwb25zZSAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTklERC1BdXRob3JpemF0aW9uLVJlc3BvbnNlIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNU0lTRE4ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVXNlci1OYW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJFeHRlcm5hbC1JZGVudGlmaWVyIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJHcmFudGVkLVZhbGlkaXR5LVRpbWUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBVc2VyLUlkZW50aWZpZXIgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlVzZXItSWRlbnRpZmllciJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJVc2VyLU5hbWUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1TSVNETiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRXh0ZXJuYWwtSWRlbnRpZmllciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVHlwZS1PZi1FeHRlcm5hbC1JZGVudGlmaWVyIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogU2NoZWR1bGVkLUNvbW11bmljYXRpb24tVGltZSAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU2NoZWR1bGVkLUNvbW11bmljYXRpb24tVGltZSJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJEYXktT2YtV2Vlay1NYXNrIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlRpbWUtT2YtRGF5LVN0YXJ0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlRpbWUtT2YtRGF5LUVuZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIEFsbG93ZWQtUExNTi1MaXN0ICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBbGxvd2VkLVBMTU4tTGlzdCJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVmlzaXRlZC1QTE1OLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogTklERC1BdXRob3JpemF0aW9uLVVwZGF0ZSAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTklERC1BdXRob3JpemF0aW9uLVVwZGF0ZSJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTVNJU0ROIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlVzZXItTmFtZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRXh0ZXJuYWwtSWRlbnRpZmllciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiR3JhbnRlZC1WYWxpZGl0eS1UaW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogTG9jYXRpb24tSW5mb3JtYXRpb24tQ29uZmlndXJhdGlvbiAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTG9jYXRpb24tSW5mb3JtYXRpb24tQ29uZmlndXJhdGlvbiJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTU9OVEUtTG9jYXRpb24tVHlwZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQWNjdXJhY3kifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBOSURELUF1dGhvcml6YXRpb24tUmVxdWVzdCAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTklERC1BdXRob3JpemF0aW9uLVJlcXVlc3QifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiU2VydmljZS1TZWxlY3Rpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJlcXVlc3RlZC1WYWxpZGl0eS1UaW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogU3VwcG9ydGVkLVNlcnZpY2VzICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTdXBwb3J0ZWQtU2VydmljZXMifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlN1cHBvcnRlZC1Nb25pdG9yaW5nLUV2ZW50cyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTm9kZS1UeXBlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogVUUtUmVhY2hhYmlsaXR5LUNvbmZpZ3VyYXRpb24gKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlVFLVJlYWNoYWJpbGl0eS1Db25maWd1cmF0aW9uIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJSZWFjaGFiaWxpdHktVHlwZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTWF4aW11bS1MYXRlbmN5In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNYXhpbXVtLVJlc3BvbnNlLVRpbWUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBTZXJ2aWNlLVJlc3VsdCAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU2VydmljZS1SZXN1bHQifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVmVuZG9yLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTZXJ2aWNlLVJlc3VsdC1Db2RlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogU2VydmljZS1SZXBvcnQgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNlcnZpY2UtUmVwb3J0In07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTZXJ2aWNlLVJlc3VsdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTm9kZS1UeXBlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogRW5oYW5jZWQtQ292ZXJhZ2UtUmVzdHJpY3Rpb24gKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkVuaGFuY2VkLUNvdmVyYWdlLVJlc3RyaWN0aW9uIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJSZXN0cmljdGVkLVBMTU4tTGlzdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQWxsb3dlZC1QTE1OLUxpc3QifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBDb21tdW5pY2F0aW9uLVBhdHRlcm4tU2V0ICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDb21tdW5pY2F0aW9uLVBhdHRlcm4tU2V0In07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQZXJpb2RpYy1Db21tdW5pY2F0aW9uLUluZGljYXRvciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ29tbXVuaWNhdGlvbi1EdXJhdGlvbi1UaW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQZXJpb2RpYy1UaW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTY2hlZHVsZWQtQ29tbXVuaWNhdGlvbi1UaW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTdGF0aW9uYXJ5LUluZGljYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJlZmVyZW5jZS1JRC1WYWxpZGl0eS1UaW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogVDQtRGF0YSAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVDQtRGF0YSJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiSFNTLUNhdXNlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTZXJ2aW5nLU5vZGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFkZGl0aW9uYWwtU2VydmluZy1Ob2RlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogU2VydmljZS1QYXJhbWV0ZXJzICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTZXJ2aWNlLVBhcmFtZXRlcnMifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlQ0LVBhcmFtZXRlcnMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFwcGxpY2F0aW9uLVBvcnQtSWRlbnRpZmllciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIE1vbml0b3JpbmctRXZlbnQtQ29uZmlndXJhdGlvbiAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTW9uaXRvcmluZy1FdmVudC1Db25maWd1cmF0aW9uIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTQ0VGLVJlZmVyZW5jZS1JRCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU0NFRi1JRCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTW9uaXRvcmluZy1UeXBlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTQ0VGLVJlZmVyZW5jZS1JRC1mb3ItRGVsZXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1heGltdW0tTnVtYmVyLW9mLVJlcG9ydHMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1vbml0b3JpbmctRHVyYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNoYXJnZWQtUGFydHkifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1heGltdW0tRGV0ZWN0aW9uLVRpbWUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlVFLVJlYWNoYWJpbGl0eS1Db25maWd1cmF0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJMb2NhdGlvbi1JbmZvcm1hdGlvbi1Db25maWd1cmF0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBc3NvY2lhdGlvbi1UeXBlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJETC1CdWZmZXJpbmctU3VnZ2VzdGVkLVBhY2tldC1Db3VudCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIEFFU0UtRXJyb3ItUmVwb3J0ICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBRVNFLUVycm9yLVJlcG9ydCJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU2VydmljZS1SZXN1bHQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBNb25pdG9yaW5nLUV2ZW50LUNvbmZpZy1TdGF0dXMgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1vbml0b3JpbmctRXZlbnQtQ29uZmlnLVN0YXR1cyJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU2VydmljZS1SZXBvcnQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNDRUYtUmVmZXJlbmNlLUlEIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTQ0VGLUlEIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogQUVTRS1Db21tdW5pY2F0aW9uLVBhdHRlcm4gKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFFU0UtQ29tbXVuaWNhdGlvbi1QYXR0ZXJuIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTQ0VGLVJlZmVyZW5jZS1JRCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU0NFRi1JRCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU0NFRi1SZWZlcmVuY2UtSUQtZm9yLURlbGV0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDb21tdW5pY2F0aW9uLVBhdHRlcm4tU2V0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogQUVTRS1Db21tdW5pY2F0aW9uLVBhdHRlcm4tQ29uZmlnLVN0YXR1cyAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQUVTRS1Db21tdW5pY2F0aW9uLVBhdHRlcm4tQ29uZmlnLVN0YXR1cyJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU0NFRi1SZWZlcmVuY2UtSUQifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNDRUYtSUQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFFU0UtRXJyb3ItUmVwb3J0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogU2VydmljZS1EYXRhICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTZXJ2aWNlLURhdGEifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlQ0LURhdGEifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBFbmhhbmNlZC1Db3ZlcmFnZS1SZXN0cmljdGlvbi1EYXRhICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJFbmhhbmNlZC1Db3ZlcmFnZS1SZXN0cmljdGlvbi1EYXRhIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJFbmhhbmNlZC1Db3ZlcmFnZS1SZXN0cmljdGlvbiJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVmlzaXRlZC1QTE1OLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogTW9uaXRvcmluZy1FdmVudC1SZXBvcnQgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1vbml0b3JpbmctRXZlbnQtUmVwb3J0In07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTQ0VGLVJlZmVyZW5jZS1JRCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU0NFRi1JRCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVmlzaXRlZC1QTE1OLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJSb2FtaW5nLUluZm9ybWF0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJJTUVJLUNoYW5nZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUmVhY2hhYmlsaXR5LUluZm9ybWF0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNYXhpbXVtLVVFLUF2YWlsYWJpbGl0eS1UaW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJFUFMtTG9jYXRpb24tSW5mb3JtYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1vbml0b3JpbmctVHlwZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRXZlbnQtSGFuZGxpbmcifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNlcnZpY2UtUmVwb3J0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJMb3NzLU9mLUNvbm5lY3Rpdml0eS1SZWFzb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBHcm91cC1Nb25pdG9yaW5nLUV2ZW50LVJlcG9ydC1JdGVtICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJHcm91cC1Nb25pdG9yaW5nLUV2ZW50LVJlcG9ydC1JdGVtIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJVc2VyLUlkZW50aWZpZXIifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlZpc2l0ZWQtUExNTi1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUm9hbWluZy1JbmZvcm1hdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUmVhY2hhYmlsaXR5LUluZm9ybWF0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNYXhpbXVtLVVFLUF2YWlsYWJpbGl0eS1UaW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJFUFMtTG9jYXRpb24tSW5mb3JtYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1vbml0b3JpbmctVHlwZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU2VydmljZS1SZXBvcnQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlM2dC1IU1MtQ2F1c2UifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBHcm91cC1Nb25pdG9yaW5nLUV2ZW50LVJlcG9ydCAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiR3JvdXAtTW9uaXRvcmluZy1FdmVudC1SZXBvcnQifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNDRUYtUmVmZXJlbmNlLUlEIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTQ0VGLUlEIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJHcm91cC1Nb25pdG9yaW5nLUV2ZW50LVJlcG9ydC1JdGVtIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCisgICB9CQorCisgICAvKiBDb21tYW5kcyBzZWN0aW9uICovCisgICB7CisKKyAgIH0KKworICAgTE9HX0QoICJFeHRlbnNpb24gJ0RpY3Rpb25hcnkgZGVmaW5pdGlvbnMgZm9yIHRzMjkzMzZfYXZwcyAoZTEwKScgaW5pdGlhbGl6ZWQiKTsKKyAgIHJldHVybiAwOworfQorCitpbnQgZGljdF9lbnRyeShjaGFyICogY29uZmZpbGUpCit7CisJZGljdF90czI5MzM2X2F2cHNfbG9hZF9kZWZzKGNvbmZmaWxlKTsKKwlyZXR1cm4gZGljdF90czI5MzM2X2F2cHNfbG9hZF9ydWxlcyhjb25mZmlsZSk7Cit9CisKK2NvbnN0IGNoYXIqIGRpY3RfcHJvdG9fdmVyKGNoYXIgKiBjb25mZmlsZSkgeworCXJldHVybiB0czI5MzM2X2F2cHNfcHJvdG9fdmVyOworfQorCitjb25zdCBkb3VibGUgZGljdF9nZW5fdHMoY2hhciAqIGNvbmZmaWxlKSB7CisJcmV0dXJuIHRzMjkzMzZfYXZwc19nZW5fZGF0ZTsKK30KKworRVhURU5TSU9OX0VOVFJZMigiZGljdF90czI5MzM2X2F2cHMiLCBkaWN0X3RzMjkzMzZfYXZwc19sb2FkX2RlZnMsIGRpY3RfdHMyOTMzNl9hdnBzX2xvYWRfcnVsZXMsICJkaWN0X3RzMzIyOTlfYXZwcyIsICJkaWN0X3RzMjkyNzJfYXZwcyIsICJkaWN0X3RzMjkzMzhfYXZwcyIsICJkaWN0X3RzMjkzMjlfYXZwcyIsICJkaWN0X3RzMjkzNjhfYXZwcyIsICJkaWN0X3RzMjkyMjlfYXZwcyIsICJkaWN0X3RzMjkyMTdfYXZwcyIsICJkaWN0X3RzMjkxNzNfYXZwcyIsICJkaWN0X3JmYzU3NzhfYXZwcyIsICJkaWN0X2RyYWZ0bG9hZF9hdnBzIiwgImRpY3RfcmZjNTc3N19hdnBzIiwgImRpY3RfcmZjNzY4M19hdnBzIiwgImRpY3RfcmZjNzk0NF9hdnBzIik7CisKKworCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfdHMyOTMzNl9hdnBzL3RzMjkzMzZfYXZwcy5kaWQgYi9leHRlbnNpb25zL2RpY3RfdHMyOTMzNl9hdnBzL3RzMjkzMzZfYXZwcy5kaWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRiYWI0YwotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF90czI5MzM2X2F2cHMvdHMyOTMzNl9hdnBzLmRpZApAQCAtMCwwICsxLDM3IEBACitkaWN0X3JmYzY5NDJfYXZwcworZGljdF90czI5NDY4X2F2cHMKK2RpY3RfdHMyOTE1NF9hdnBzCitkaWN0X3RzMjkyMTRfYXZwcworZGljdF90czI5MjE1X2F2cHMKK2RpY3RfdHMyOTIxN19hdnBzCitkaWN0XzNncHAyX2F2cHMKK2RpY3RfdHMyOTM0M19hdnBzCitkaWN0X3RzMjkzMzhfYXZwcworZGljdF90czI5MTI4X2F2cHMKK2RpY3RfdHMyOTM0NF9hdnBzCitkaWN0X3RzMjkzNDVfYXZwcworZGljdF90czMyMjk5X2F2cHMKK2RpY3RfcmZjNjczNF9hdnBzCitkaWN0X3JmYzU3NzhfYXZwcworZGljdF9yZmM1NTgwX2F2cHMKK2RpY3RfcmZjNDA3Ml9hdnBzCitkaWN0X3RzMjkyNzNfYXZwcworZGljdF9yZmM1Nzc3X2F2cHMKK2RpY3RfcmZjNDAwNmJpc19hdnBzCitkaWN0X3RzMjkyMTJfYXZwcworZGljdF90czI5MDYxX2F2cHMKK2RpY3RfcmZjNTQ0N19hdnBzCitkaWN0X3RzMjkyNzJfYXZwcworZGljdF90czI5MTczX2F2cHMKK2RpY3RfdHMyOTMzN19hdnBzCitkaWN0X2V0c2kyODMwMzRfYXZwcworZGljdF9yZmM0NTkwX2F2cHMKK2RpY3RfcmZjNDAwNF9hdnBzCitkaWN0X3JmYzcxNTVfYXZwcworZGljdF90czI5MjI5X2F2cHMKK2RpY3RfcmZjNzY4M19hdnBzCitkaWN0X2RyYWZ0bG9hZF9hdnBzCitkaWN0X3JmYzc5NDRfYXZwcworZGljdF90czI5MzI5X2F2cHMKK2RpY3RfdHMyOTM2OF9hdnBzCitkaWN0X3RzMjkzMzZfYXZwcwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X3RzMjkzMzdfYXZwcy9DTWFrZUxpc3RzLnR4dCBiL2V4dGVuc2lvbnMvZGljdF90czI5MzM3X2F2cHMvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMyYjY5YgotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF90czI5MzM3X2F2cHMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxNiBAQAorIyBUaGUgZGljdF90czI5MzM3X2F2cHMgZXh0ZW5zaW9uCitQUk9KRUNUKCJkaWN0X3RzMjkzMzdfYXZwcyBsaWJyYXJ5IGdlbmVyYXRlZCBieSBGZEdlbiAiIEMpCisKKyMgQ29tcGlsZSBhcyBhIG1vZHVsZQorRkRfQUREX0VYVEVOU0lPTihkaWN0X3RzMjkzMzdfYXZwcyBkaWN0X3RzMjkzMzdfYXZwcy5jKQorCisKKyMjIyMKKyMjIElOU1RBTEwgc2VjdGlvbiAjIworCitJTlNUQUxMKFRBUkdFVFMgZGljdF90czI5MzM3X2F2cHMKKwlMSUJSQVJZIERFU1RJTkFUSU9OICR7SU5TVEFMTF9FWFRFTlNJT05TX1NVRkZJWH0KK0NPTVBPTkVOVCBmcmVlRGlhbWV0ZXItZGljdGlvbmFyeS1UUzI5MzM3X0FWUFMpCisKKworCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfdHMyOTMzN19hdnBzL2RpY3RfdHMyOTMzN19hdnBzLmMgYi9leHRlbnNpb25zL2RpY3RfdHMyOTMzN19hdnBzL2RpY3RfdHMyOTMzN19hdnBzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU2MGI1NQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF90czI5MzM3X2F2cHMvZGljdF90czI5MzM3X2F2cHMuYwpAQCAtMCwwICsxLDI0OCBAQAorLyoKKyogQ29weXJpZ2h0IChjKSAyMDE3IFNwcmludAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvKioqKioqKioqKioqKioqKgorIEdlbmVyYXRlZCBCeTogZmR0b29sIGVuaGFuY2VtZW50cyB0byBkaWFmdXp6ZXIKKyBMaWNlbnNlOiBzYW1lIGFzIGZyZWVEaWFtZXRlcgorKioqKioqKioqKioqKioqKi8KKworCisvKiAKKyAqIERpY3Rpb25hcnkgZGVmaW5pdGlvbnMgb2Ygb2JqZWN0cyBzcGVjaWZpZWQgaW4gdHMyOTMzN19hdnBzIChlMDApLgorICovCisjaW5jbHVkZSA8ZnJlZURpYW1ldGVyL2V4dGVuc2lvbi5oPgorCisjZGVmaW5lIFBST1RPX1ZFUiAiZTAwIgorI2RlZmluZSBHRU5fREFURSAgMTUwNjY5NzE1My4yNQorCitjb25zdCBjaGFyICp0czI5MzM3X2F2cHNfcHJvdG9fdmVyID0gUFJPVE9fVkVSOworY29uc3QgZG91YmxlIHRzMjkzMzdfYXZwc19nZW5fZGF0ZSA9IEdFTl9EQVRFOworCisvKiBUaGUgY29udGVudCBvZiB0aGlzIGZpbGUgZm9sbG93cyB0aGUgc2FtZSBzdHJ1Y3R1cmUgYXMgZGljdF9iYXNlX3Byb3RvLmMgKi8KKworI2RlZmluZSBDSEVDS19kaWN0X25ldyggX3R5cGUsIF9kYXRhLCBfcGFyZW50LCBfcmVmICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBfcmV0ID0gZmRfZGljdF9uZXcoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgKF90eXBlKSwgKF9kYXRhKSwgKF9wYXJlbnQpLCAoX3JlZikgKTsgXAorICAgIGlmICggX3JldCAhPSAwICYmIF9yZXQgIT0gRUVYSVNUICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHJldHVybiBfcmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIENIRUNLX2RpY3Rfc2VhcmNoKCBfdHlwZSwgX2NyaXRlcmlhLCBfd2hhdCwgX3Jlc3VsdCApCQlcCisgICAgQ0hFQ0tfRkNUKCAgZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgKF90eXBlKSwgKF9jcml0ZXJpYSksIChfd2hhdCksIChfcmVzdWx0KSwgRU5PRU5UKSApOworCitzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiB7CisgICAgc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWU7CisgICAgZW51bSBydWxlX3Bvc2l0aW9uCXBvc2l0aW9uOworICAgIGludCAJCQltaW47CisgICAgaW50CQkJbWF4OworfTsKKworI2RlZmluZSBSVUxFX09SREVSKCBfcG9zaXRpb24gKSAoKCgoX3Bvc2l0aW9uKSA9PSBSVUxFX0ZJWEVEX0hFQUQpIHx8ICgoX3Bvc2l0aW9uKSA9PSBSVUxFX0ZJWEVEX1RBSUwpKSA/IDEgOiAwICkKKworLyogQXR0ZW50aW9uISBUaGlzIHZlcnNpb24gb2YgdGhlIG1hY3JvIHVzZXMgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgaW4gY29udHJhc3QgdG8gbW9zdCBvdGhlciBjb3BpZXMhICovCisjZGVmaW5lIFBBUlNFX2xvY19ydWxlcyggX3J1bGVhcnJheSwgX3BhcmVudCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IF9fYXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKF9fYXI9MDsgX19hciA8IHNpemVvZihfcnVsZWFycmF5KSAvIHNpemVvZigoX3J1bGVhcnJheSlbMF0pOyBfX2FyKyspIHsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgc3RydWN0IGRpY3RfcnVsZV9kYXRhIF9fZGF0YSA9IHsgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5wb3NpdGlvbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ubWluLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5tYXh9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIF9fZGF0YS5ydWxlX29yZGVyID0gUlVMRV9PUkRFUihfX2RhdGEucnVsZV9wb3NpdGlvbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgQ0hFQ0tfRkNUKCAgZmRfZGljdF9zZWFyY2goICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgRElDVF9BVlAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICYoX3J1bGVhcnJheSlbX19hcl0uYXZwX3ZlbmRvcl9wbHVzX25hbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgJl9fZGF0YS5ydWxlX2F2cCwgMCApICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYgKCAhX19kYXRhLnJ1bGVfYXZwICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFX0RFQlVHKElORk8sICJBVlAgTm90IGZvdW5kOiAnJXMnIiwgKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLmF2cF9uYW1lKTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVOT0VOVDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBfcmV0ID0gZmRfZGljdF9uZXcoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9SVUxFLCAmKF9fZGF0YSksIChfcGFyZW50KSwgTlVMTCApOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBfcmV0ICE9IDAgJiYgX3JldCAhPSBFRVhJU1QgKSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfREVCVUcoSU5GTywgIkVycm9yIG9uIHJ1bGUgd2l0aCBBVlAgJyVzJyIsICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0uYXZwX3ZlbmRvcl9wbHVzX25hbWUuYXZwX25hbWUpOyAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFSU5WQUw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBDSEVDS192ZW5kb3JfbmV3KCBfZGF0YSApIHsgXAorICAgICAgICBzdHJ1Y3QgZGljdF9vYmplY3QgKiB2ZW5kb3JfZm91bmQ7IFwKKyAgICAgICAgaWYgKGZkX2RpY3Rfc2VhcmNoKGZkX2dfY29uZmlnLT5jbmZfZGljdCxESUNUX1ZFTkRPUixWRU5ET1JfQllfSUQsJl9kYXRhLnZlbmRvcl9pZCwmdmVuZG9yX2ZvdW5kLEVOT0VOVCkgPT0gRU5PRU5UKSB7IFwKKyAgICAgICAgICAgICAgICBDSEVDS19GQ1QoZmRfZGljdF9uZXcoZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1ZFTkRPUiwgJl9kYXRhLCBOVUxMLCBOVUxMKSk7IFwKKyAgICAgICAgfSBcCit9CisKKyNkZWZpbmUgZW51bXZhbF9kZWZfdTMyKCBfdmFsXywgX3N0cl8gKQkJXAorICAgIHsgX3N0cl8sIAkJeyAudTMyID0gX3ZhbF8gfX0KKworI2RlZmluZSBlbnVtdmFsX2RlZl9vcyggX2xlbl8sIF92YWxfLCBfc3RyXyApCQkJCVwKKyAgICB7IF9zdHJfLCAJCXsgLm9zID0geyAuZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopX3ZhbF8sIC5sZW4gPSBfbGVuXyB9fX0KKworCitzdGF0aWMgaW50IGRpY3RfdHMyOTMzN19hdnBzX2xvYWRfZGVmcyhjaGFyICogY29uZmZpbGUpCit7CisgICBUUkFDRV9FTlRSWSgiJXAiLCBjb25mZmlsZSk7CisJLyogQXBwbGljYXRpb24gU2VjdGlvbiAqLworCXsKKwkJLyogQ3JlYXRlIHRoZSB2ZW5kb3JzICovCQl7CisJCQlzdHJ1Y3QgZGljdF92ZW5kb3JfZGF0YSB2ZW5kb3JfZGF0YSA9IHsgMTA0MTUsICIzR1BQIiB9OworCQkJQ0hFQ0tfZGljdF9uZXcoRElDVF9WRU5ET1IsICZ2ZW5kb3JfZGF0YSwgTlVMTCwgTlVMTCkKKwkJfQorCX0KKworCisgICAvKiBBVlAgc2VjdGlvbiAqLworICAgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBBZGRyZXNzX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIFVURjhTdHJpbmdfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogRGlhbWV0ZXJJZGVudGl0eV90eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBEaWFtZXRlclVSSV90eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBUaW1lX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIElQRmlsdGVyUnVsZV90eXBlOworCisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkFkZHJlc3MiLCAmQWRkcmVzc190eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiVVRGOFN0cmluZyIsICZVVEY4U3RyaW5nX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJEaWFtZXRlcklkZW50aXR5IiwgJkRpYW1ldGVySWRlbnRpdHlfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkRpYW1ldGVyVVJJIiwgJkRpYW1ldGVyVVJJX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJUaW1lIiwgJlRpbWVfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIklQRmlsdGVyUnVsZSIsICZJUEZpbHRlclJ1bGVfdHlwZSk7CisJCS8qIFNNLURlbGl2ZXJ5LU91dGNvbWUtVDQgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzMjAwLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTTS1EZWxpdmVyeS1PdXRjb21lLVQ0IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChTTS1EZWxpdmVyeS1PdXRjb21lLVQ0KSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiQUJTRU5UX1NVQlNDUklCRVIiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiVUVfTUVNT1JZX0NBUEFDSVRZX0VYQ0VFREVEIiwgeyAuaTMyPTEgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMyA9IHsgIlNVQ0NFU1NGVUxfVFJBTlNGRVIiLCB7IC5pMzI9MiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF80ID0geyAiVkFMSURJVFlfVElNRV9FWFBJUkVEIiwgeyAuaTMyPTMgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF80LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBBYnNlbnQtU3Vic2NyaWJlci1EaWFnbm9zdGljLVQ0ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzIwMSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQWJzZW50LVN1YnNjcmliZXItRGlhZ25vc3RpYy1UNCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoQWJzZW50LVN1YnNjcmliZXItRGlhZ25vc3RpYy1UNCkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIk9SSUdJTkFMX01FU1NBR0VfTk9UX0RFTEVURUQiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiTkVXX01FU1NBR0VfTk9UX1NUT1JFRCIsIHsgLmkzMj0xIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMgPSB7ICJSRVBMQUNFIiwgeyAuaTMyPTIgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNCA9IHsgIlVFX1BVUkdFRCIsIHsgLmkzMj0zIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzUgPSB7ICJST0FNSU5HX1JFU1RSSUNUSU9OIiwgeyAuaTMyPTQgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNiA9IHsgIlVOSURFTlRJRklFRF9TVUJTQ1JJQkVSIiwgeyAuaTMyPTUgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF80LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzUsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogVHJpZ2dlci1BY3Rpb24gKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzMjAyLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJUcmlnZ2VyLUFjdGlvbiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogTVRDLUVycm9yLURpYWdub3N0aWMgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzMjAzLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJNVEMtRXJyb3ItRGlhZ25vc3RpYyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKworCQorICAgfQorCisgICAvKiBDb21tYW5kcyBzZWN0aW9uICovCisgICB7CisKKyAgIH0KKworICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGljdF90czI5MzM3X2F2cHNfbG9hZF9ydWxlcyhjaGFyICogY29uZmZpbGUpCit7CisgICAvKiBHcm91cGVkIEFWUCBzZWN0aW9uICovCisgICB7CisKKyAgIH0JCisKKyAgIC8qIENvbW1hbmRzIHNlY3Rpb24gKi8KKyAgIHsKKworICAgfQorCisgICBMT0dfRCggIkV4dGVuc2lvbiAnRGljdGlvbmFyeSBkZWZpbml0aW9ucyBmb3IgdHMyOTMzN19hdnBzIChlMDApJyBpbml0aWFsaXplZCIpOworICAgcmV0dXJuIDA7Cit9CisKK2ludCBkaWN0X2VudHJ5KGNoYXIgKiBjb25mZmlsZSkKK3sKKwlkaWN0X3RzMjkzMzdfYXZwc19sb2FkX2RlZnMoY29uZmZpbGUpOworCXJldHVybiBkaWN0X3RzMjkzMzdfYXZwc19sb2FkX3J1bGVzKGNvbmZmaWxlKTsKK30KKworY29uc3QgY2hhciogZGljdF90czI5MzM3X2F2cHNfcHJvdG9fdmVyKGNoYXIgKiBjb25mZmlsZSkgeworCXJldHVybiB0czI5MzM3X2F2cHNfcHJvdG9fdmVyOworfQorCitjb25zdCBkb3VibGUgZGljdF90czI5MzM3X2F2cHNfZ2VuX3RzKGNoYXIgKiBjb25mZmlsZSkgeworCXJldHVybiB0czI5MzM3X2F2cHNfZ2VuX2RhdGU7Cit9CisKK0VYVEVOU0lPTl9FTlRSWTIoImRpY3RfdHMyOTMzN19hdnBzIiwgZGljdF90czI5MzM3X2F2cHNfbG9hZF9kZWZzLCBkaWN0X3RzMjkzMzdfYXZwc19sb2FkX3J1bGVzLCAiZGljdF90czI5MzM2X2F2cHMiLCAiZGljdF90czI5MzM4X2F2cHMiLCAiZGljdF90czI5MjcyX2F2cHMiLCAiZGljdF90czI5MzY4X2F2cHMiLCAiZGljdF90czI5MjI5X2F2cHMiLCAiZGljdF90czI5MTczX2F2cHMiLCAiZGljdF9yZmM0MDA2YmlzX2F2cHMiLCAiZGljdF9yZmM3MTU1X2F2cHMiLCAiZGljdF9yZmM3OTQ0X2F2cHMiKTsKKworCisKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF90czI5MzM3X2F2cHMvdHMyOTMzN19hdnBzLmRpZCBiL2V4dGVuc2lvbnMvZGljdF90czI5MzM3X2F2cHMvdHMyOTMzN19hdnBzLmRpZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjVmNzUzCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kaWN0X3RzMjkzMzdfYXZwcy90czI5MzM3X2F2cHMuZGlkCkBAIC0wLDAgKzEsMzcgQEAKK2RpY3RfcmZjNjk0Ml9hdnBzCitkaWN0X3RzMjk0NjhfYXZwcworZGljdF90czI5MTU0X2F2cHMKK2RpY3RfdHMyOTIxNF9hdnBzCitkaWN0X3RzMjkyMTVfYXZwcworZGljdF90czI5MjE3X2F2cHMKK2RpY3RfM2dwcDJfYXZwcworZGljdF90czI5MzQzX2F2cHMKK2RpY3RfdHMyOTMzOF9hdnBzCitkaWN0X3RzMjkxMjhfYXZwcworZGljdF90czI5MzQ0X2F2cHMKK2RpY3RfdHMyOTM0NV9hdnBzCitkaWN0X3RzMjkxNzNfYXZwcworZGljdF90czMyMjk5X2F2cHMKK2RpY3RfcmZjNjczNF9hdnBzCitkaWN0X3JmYzU1ODBfYXZwcworZGljdF9yZmM0MDcyX2F2cHMKK2RpY3RfdHMyOTI3M19hdnBzCitkaWN0X3JmYzQwMDZiaXNfYXZwcworZGljdF90czI5MjEyX2F2cHMKK2RpY3RfdHMyOTA2MV9hdnBzCitkaWN0X3RzMjkyNzJfYXZwcworZGljdF9yZmM1NDQ3X2F2cHMKK2RpY3RfcmZjNTc3OF9hdnBzCitkaWN0X3JmYzU3NzdfYXZwcworZGljdF90czI5MzM2X2F2cHMKK2RpY3RfZXRzaTI4MzAzNF9hdnBzCitkaWN0X3JmYzQ1OTBfYXZwcworZGljdF9yZmM0MDA0X2F2cHMKK2RpY3RfcmZjNzE1NV9hdnBzCitkaWN0X3RzMjkyMjlfYXZwcworZGljdF9yZmM3NjgzX2F2cHMKK2RpY3RfZHJhZnRsb2FkX2F2cHMKK2RpY3RfcmZjNzk0NF9hdnBzCitkaWN0X3RzMjkzMjlfYXZwcworZGljdF90czI5MzY4X2F2cHMKK2RpY3RfdHMyOTMzN19hdnBzCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfdHMyOTMzOF9hdnBzL0NNYWtlTGlzdHMudHh0IGIvZXh0ZW5zaW9ucy9kaWN0X3RzMjkzMzhfYXZwcy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNThiMzMyCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kaWN0X3RzMjkzMzhfYXZwcy9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDE2IEBACisjIFRoZSBkaWN0X3RzMjkzMzhfYXZwcyBleHRlbnNpb24KK1BST0pFQ1QoImRpY3RfdHMyOTMzOF9hdnBzIGxpYnJhcnkgZ2VuZXJhdGVkIGJ5IEZkR2VuICIgQykKKworIyBDb21waWxlIGFzIGEgbW9kdWxlCitGRF9BRERfRVhURU5TSU9OKGRpY3RfdHMyOTMzOF9hdnBzIGRpY3RfdHMyOTMzOF9hdnBzLmMpCisKKworIyMjIworIyMgSU5TVEFMTCBzZWN0aW9uICMjCisKK0lOU1RBTEwoVEFSR0VUUyBkaWN0X3RzMjkzMzhfYXZwcworCUxJQlJBUlkgREVTVElOQVRJT04gJHtJTlNUQUxMX0VYVEVOU0lPTlNfU1VGRklYfQorQ09NUE9ORU5UIGZyZWVEaWFtZXRlci1kaWN0aW9uYXJ5LVRTMjkzMzhfQVZQUykKKworCisKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF90czI5MzM4X2F2cHMvZGljdF90czI5MzM4X2F2cHMuYyBiL2V4dGVuc2lvbnMvZGljdF90czI5MzM4X2F2cHMvZGljdF90czI5MzM4X2F2cHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjk4NjNmCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9kaWN0X3RzMjkzMzhfYXZwcy9kaWN0X3RzMjkzMzhfYXZwcy5jCkBAIC0wLDAgKzEsNzMyIEBACisvKgorKiBDb3B5cmlnaHQgKGMpIDIwMTcgU3ByaW50CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKy8qKioqKioqKioqKioqKioqCisgR2VuZXJhdGVkIEJ5OiBmZHRvb2wgZW5oYW5jZW1lbnRzIHRvIGRpYWZ1enplcgorIExpY2Vuc2U6IHNhbWUgYXMgZnJlZURpYW1ldGVyCisqKioqKioqKioqKioqKioqLworCisKKy8qIAorICogRGljdGlvbmFyeSBkZWZpbml0aW9ucyBvZiBvYmplY3RzIHNwZWNpZmllZCBpbiB0czI5MzM4X2F2cHMgKGUxMCkuCisgKi8KKyNpbmNsdWRlIDxmcmVlRGlhbWV0ZXIvZXh0ZW5zaW9uLmg+CisKKyNkZWZpbmUgUFJPVE9fVkVSICJlMTAiCisjZGVmaW5lIEdFTl9EQVRFICAxNTA2Njk3MTU2LjYzCisKK2NvbnN0IGNoYXIgKnRzMjkzMzhfYXZwc19wcm90b192ZXIgPSBQUk9UT19WRVI7Citjb25zdCBkb3VibGUgdHMyOTMzOF9hdnBzX2dlbl9kYXRlID0gR0VOX0RBVEU7CisKKy8qIFRoZSBjb250ZW50IG9mIHRoaXMgZmlsZSBmb2xsb3dzIHRoZSBzYW1lIHN0cnVjdHVyZSBhcyBkaWN0X2Jhc2VfcHJvdG8uYyAqLworCisjZGVmaW5lIENIRUNLX2RpY3RfbmV3KCBfdHlwZSwgX2RhdGEsIF9wYXJlbnQsIF9yZWYgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IF9yZXQgPSBmZF9kaWN0X25ldyggZmRfZ19jb25maWctPmNuZl9kaWN0LCAoX3R5cGUpLCAoX2RhdGEpLCAoX3BhcmVudCksIChfcmVmKSApOyBcCisgICAgaWYgKCBfcmV0ICE9IDAgJiYgX3JldCAhPSBFRVhJU1QgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgcmV0dXJuIF9yZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgQ0hFQ0tfZGljdF9zZWFyY2goIF90eXBlLCBfY3JpdGVyaWEsIF93aGF0LCBfcmVzdWx0ICkJCVwKKyAgICBDSEVDS19GQ1QoICBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCAoX3R5cGUpLCAoX2NyaXRlcmlhKSwgKF93aGF0KSwgKF9yZXN1bHQpLCBFTk9FTlQpICk7CisKK3N0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHsKKyAgICBzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZTsKKyAgICBlbnVtIHJ1bGVfcG9zaXRpb24JcG9zaXRpb247CisgICAgaW50IAkJCW1pbjsKKyAgICBpbnQJCQltYXg7Cit9OworCisjZGVmaW5lIFJVTEVfT1JERVIoIF9wb3NpdGlvbiApICgoKChfcG9zaXRpb24pID09IFJVTEVfRklYRURfSEVBRCkgfHwgKChfcG9zaXRpb24pID09IFJVTEVfRklYRURfVEFJTCkpID8gMSA6IDAgKQorCisvKiBBdHRlbnRpb24hIFRoaXMgdmVyc2lvbiBvZiB0aGUgbWFjcm8gdXNlcyBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCBpbiBjb250cmFzdCB0byBtb3N0IG90aGVyIGNvcGllcyEgKi8KKyNkZWZpbmUgUEFSU0VfbG9jX3J1bGVzKCBfcnVsZWFycmF5LCBfcGFyZW50KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgX19hcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoX19hcj0wOyBfX2FyIDwgc2l6ZW9mKF9ydWxlYXJyYXkpIC8gc2l6ZW9mKChfcnVsZWFycmF5KVswXSk7IF9fYXIrKykgeyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgZGljdF9ydWxlX2RhdGEgX19kYXRhID0geyBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLnBvc2l0aW9uLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5taW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLm1heH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgX19kYXRhLnJ1bGVfb3JkZXIgPSBSVUxFX09SREVSKF9fZGF0YS5ydWxlX3Bvc2l0aW9uKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBDSEVDS19GQ1QoICBmZF9kaWN0X3NlYXJjaCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgZmRfZ19jb25maWctPmNuZl9kaWN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBESUNUX0FWUCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgJihfcnVsZWFycmF5KVtfX2FyXS5hdnBfdmVuZG9yX3BsdXNfbmFtZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAmX19kYXRhLnJ1bGVfYXZwLCAwICkgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpZiAoICFfX2RhdGEucnVsZV9hdnAgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfREVCVUcoSU5GTywgIkFWUCBOb3QgZm91bmQ6ICclcyciLCAoX3J1bGVhcnJheSlbX19hcl0uYXZwX3ZlbmRvcl9wbHVzX25hbWUuYXZwX25hbWUpOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRU5PRU5UOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IF9yZXQgPSBmZF9kaWN0X25ldyggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1JVTEUsICYoX19kYXRhKSwgKF9wYXJlbnQpLCBOVUxMICk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIF9yZXQgIT0gMCAmJiBfcmV0ICE9IEVFWElTVCApICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9ERUJVRyhJTkZPLCAiRXJyb3Igb24gcnVsZSB3aXRoIEFWUCAnJXMnIiwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5hdnBfdmVuZG9yX3BsdXNfbmFtZS5hdnBfbmFtZSk7ICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVJTlZBTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIENIRUNLX3ZlbmRvcl9uZXcoIF9kYXRhICkgeyBcCisgICAgICAgIHN0cnVjdCBkaWN0X29iamVjdCAqIHZlbmRvcl9mb3VuZDsgXAorICAgICAgICBpZiAoZmRfZGljdF9zZWFyY2goZmRfZ19jb25maWctPmNuZl9kaWN0LERJQ1RfVkVORE9SLFZFTkRPUl9CWV9JRCwmX2RhdGEudmVuZG9yX2lkLCZ2ZW5kb3JfZm91bmQsRU5PRU5UKSA9PSBFTk9FTlQpIHsgXAorICAgICAgICAgICAgICAgIENIRUNLX0ZDVChmZF9kaWN0X25ldyhmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfVkVORE9SLCAmX2RhdGEsIE5VTEwsIE5VTEwpKTsgXAorICAgICAgICB9IFwKK30KKworI2RlZmluZSBlbnVtdmFsX2RlZl91MzIoIF92YWxfLCBfc3RyXyApCQlcCisgICAgeyBfc3RyXywgCQl7IC51MzIgPSBfdmFsXyB9fQorCisjZGVmaW5lIGVudW12YWxfZGVmX29zKCBfbGVuXywgX3ZhbF8sIF9zdHJfICkJCQkJXAorICAgIHsgX3N0cl8sIAkJeyAub3MgPSB7IC5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilfdmFsXywgLmxlbiA9IF9sZW5fIH19fQorCisKK3N0YXRpYyBpbnQgZGljdF90czI5MzM4X2F2cHNfbG9hZF9kZWZzKGNoYXIgKiBjb25mZmlsZSkKK3sKKyAgIFRSQUNFX0VOVFJZKCIlcCIsIGNvbmZmaWxlKTsKKwkvKiBBcHBsaWNhdGlvbiBTZWN0aW9uICovCisJeworCQkvKiBDcmVhdGUgdGhlIHZlbmRvcnMgKi8JCXsKKwkJCXN0cnVjdCBkaWN0X3ZlbmRvcl9kYXRhIHZlbmRvcl9kYXRhID0geyAxMDQxNSwgIjNHUFAiIH07CisJCQlDSEVDS19kaWN0X25ldyhESUNUX1ZFTkRPUiwgJnZlbmRvcl9kYXRhLCBOVUxMLCBOVUxMKQorCQl9CisJfQorCisKKyAgIC8qIEFWUCBzZWN0aW9uICovCisgICB7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIEFkZHJlc3NfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogVVRGOFN0cmluZ190eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBEaWFtZXRlcklkZW50aXR5X3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIERpYW1ldGVyVVJJX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIFRpbWVfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogSVBGaWx0ZXJSdWxlX3R5cGU7CisKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiQWRkcmVzcyIsICZBZGRyZXNzX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJVVEY4U3RyaW5nIiwgJlVURjhTdHJpbmdfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkRpYW1ldGVySWRlbnRpdHkiLCAmRGlhbWV0ZXJJZGVudGl0eV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiRGlhbWV0ZXJVUkkiLCAmRGlhbWV0ZXJVUklfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIlRpbWUiLCAmVGltZV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiSVBGaWx0ZXJSdWxlIiwgJklQRmlsdGVyUnVsZV90eXBlKTsKKwkJLyogU00tUlAtTVRJICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzMwOCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiU00tUlAtTVRJIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChTTS1SUC1NVEkpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJTTV9ERUxJVkVSIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIlNNX1NUQVRVU19SRVBPUlQiLCB7IC5pMzI9MSB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogU00tUlAtU01FQSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTMzMDksCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlNNLVJQLVNNRUEiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBTUlItRmxhZ3MgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzMzEwLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTUlItRmxhZ3MiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFNNLURlbGl2ZXJ5LU5vdC1JbnRlbmRlZCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTMzMTEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlNNLURlbGl2ZXJ5LU5vdC1JbnRlbmRlZCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoU00tRGVsaXZlcnktTm90LUludGVuZGVkKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiT05MWV9JTVNJX1JFUVVFU1RFRCIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJPTkxZX01DQ19NTkNfUkVRVUVTVEVEIiwgeyAuaTMyPTEgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIE1XRC1TdGF0dXMgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzMzEyLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJNV0QtU3RhdHVzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBNTUUtQWJzZW50LVVzZXItRGlhZ25vc3RpYy1TTSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTMzMTMsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk1NRS1BYnNlbnQtVXNlci1EaWFnbm9zdGljLVNNIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBNU0MtQWJzZW50LVVzZXItRGlhZ25vc3RpYy1TTSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTMzMTQsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk1TQy1BYnNlbnQtVXNlci1EaWFnbm9zdGljLVNNIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBTR1NOLUFic2VudC1Vc2VyLURpYWdub3N0aWMtU00gKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzMzE1LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTR1NOLUFic2VudC1Vc2VyLURpYWdub3N0aWMtU00iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFNNLURlbGl2ZXJ5LUNhdXNlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzMyMSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiU00tRGVsaXZlcnktQ2F1c2UiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFNNLURlbGl2ZXJ5LUNhdXNlKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiTUVNT1JZX0NBUEFDSVRZX0VYQ0VFREVEIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIkFCU0VOVF9VU0VSIiwgeyAuaTMyPTEgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMyA9IHsgIlNVQ0NFU1NGVUxfVFJBTlNGRVIiLCB7IC5pMzI9MiB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBBYnNlbnQtVXNlci1EaWFnbm9zdGljLVNNICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzMyMiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQWJzZW50LVVzZXItRGlhZ25vc3RpYy1TTSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogUkRSLUZsYWdzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzMyMywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUkRSLUZsYWdzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBNYXhpbXVtLVVFLUF2YWlsYWJpbGl0eS1UaW1lICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzMyOSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTWF4aW11bS1VRS1BdmFpbGFiaWxpdHktVGltZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVGltZV90eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogU01TLUdNU0MtQWxlcnQtRXZlbnQgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzMzMzLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTTVMtR01TQy1BbGVydC1FdmVudCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogU0MtQWRkcmVzcyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTMzMDAsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlNDLUFkZHJlc3MiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBTTS1SUC1VSSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTMzMDEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlNNLVJQLVVJIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogVEZSLUZsYWdzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzMwMiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiVEZSLUZsYWdzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBTTS1FbnVtZXJhdGVkLURlbGl2ZXJ5LUZhaWx1cmUtQ2F1c2UgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzMzA0LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTTS1FbnVtZXJhdGVkLURlbGl2ZXJ5LUZhaWx1cmUtQ2F1c2UiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFNNLUVudW1lcmF0ZWQtRGVsaXZlcnktRmFpbHVyZS1DYXVzZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIk1FTU9SWV9DQVBBQ0lUWV9FWENFRURFRCIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJFUVVJUE1FTlRfUFJPVE9DT0xfRVJST1IiLCB7IC5pMzI9MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAiRVFVSVBNRU5UX05PVF9TTV9FUVVJUFBFRCIsIHsgLmkzMj0yIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzQgPSB7ICJVTktOT1dOX1NFUlZJQ0VfQ0VOVFJFIiwgeyAuaTMyPTMgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNSA9IHsgIlNDX0NPTkdFU1RJT04iLCB7IC5pMzI9NCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF82ID0geyAiSU5WQUxJRF9TTUVfQUREUkVTUyIsIHsgLmkzMj01IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzcgPSB7ICJVU0VSX05PVF9TQ19VU0VSIiwgeyAuaTMyPTYgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF80LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzUsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF83LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBTTS1EaWFnbm9zdGljLUluZm8gKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzMzA1LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTTS1EaWFnbm9zdGljLUluZm8iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBTTS1EZWxpdmVyeS1UaW1lciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTMzMDYsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlNNLURlbGl2ZXJ5LVRpbWVyIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBTTS1EZWxpdmVyeS1TdGFydC1UaW1lICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzMwNywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiU00tRGVsaXZlcnktU3RhcnQtVGltZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVGltZV90eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogSFNTLUlEICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzMyNSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiSFNTLUlEIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogT3JpZ2luYXRpbmctU0lQLVVSSSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTMzMjYsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk9yaWdpbmF0aW5nLVNJUC1VUkkiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIERlc3RpbmF0aW9uLVNJUC1VUkkgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzMzI3LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJEZXN0aW5hdGlvbi1TSVAtVVJJIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBPRlItRmxhZ3MgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzMzI4LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJPRlItRmxhZ3MiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIE1heGltdW0tUmV0cmFuc21pc3Npb24tVGltZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTMzMzAsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk1heGltdW0tUmV0cmFuc21pc3Npb24tVGltZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVGltZV90eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogUmVxdWVzdGVkLVJldHJhbnNtaXNzaW9uLVRpbWUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzMzMxLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJSZXF1ZXN0ZWQtUmV0cmFuc21pc3Npb24tVGltZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVGltZV90eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogU01TLUdNU0MtQWRkcmVzcyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTMzMzIsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlNNUy1HTVNDLUFkZHJlc3MiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBTR1NOLVNNLURlbGl2ZXJ5LU91dGNvbWUgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzMzE5LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTR1NOLVNNLURlbGl2ZXJ5LU91dGNvbWUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIFNNLURlbGl2ZXJ5LUZhaWx1cmUtQ2F1c2UgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzMzAzLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTTS1EZWxpdmVyeS1GYWlsdXJlLUNhdXNlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBTTVNNSS1Db3JyZWxhdGlvbi1JRCAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTMzMjQsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlNNU01JLUNvcnJlbGF0aW9uLUlEIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBJUC1TTS1HVy1TTS1EZWxpdmVyeS1PdXRjb21lICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzMyMCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiSVAtU00tR1ctU00tRGVsaXZlcnktT3V0Y29tZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogTVNDLVNNLURlbGl2ZXJ5LU91dGNvbWUgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzMzE4LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJNU0MtU00tRGVsaXZlcnktT3V0Y29tZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogTU1FLVNNLURlbGl2ZXJ5LU91dGNvbWUgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzMzE3LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJNTUUtU00tRGVsaXZlcnktT3V0Y29tZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogU00tRGVsaXZlcnktT3V0Y29tZSAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTMzMTYsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlNNLURlbGl2ZXJ5LU91dGNvbWUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisKKwkKKyAgIH0KKworICAgLyogQ29tbWFuZHMgc2VjdGlvbiAqLworICAgeworCisgICB9CisKKyAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRpY3RfdHMyOTMzOF9hdnBzX2xvYWRfcnVsZXMoY2hhciAqIGNvbmZmaWxlKQoreworICAgLyogR3JvdXBlZCBBVlAgc2VjdGlvbiAqLworICAgeworCSAgLyogU0dTTi1TTS1EZWxpdmVyeS1PdXRjb21lICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTR1NOLVNNLURlbGl2ZXJ5LU91dGNvbWUifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNNLURlbGl2ZXJ5LUNhdXNlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBYnNlbnQtVXNlci1EaWFnbm9zdGljLVNNIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogU00tRGVsaXZlcnktRmFpbHVyZS1DYXVzZSAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU00tRGVsaXZlcnktRmFpbHVyZS1DYXVzZSJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU00tRW51bWVyYXRlZC1EZWxpdmVyeS1GYWlsdXJlLUNhdXNlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTTS1EaWFnbm9zdGljLUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBTTVNNSS1Db3JyZWxhdGlvbi1JRCAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU01TTUktQ29ycmVsYXRpb24tSUQifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkhTUy1JRCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiT3JpZ2luYXRpbmctU0lQLVVSSSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRGVzdGluYXRpb24tU0lQLVVSSSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIElQLVNNLUdXLVNNLURlbGl2ZXJ5LU91dGNvbWUgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIklQLVNNLUdXLVNNLURlbGl2ZXJ5LU91dGNvbWUifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNNLURlbGl2ZXJ5LUNhdXNlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBYnNlbnQtVXNlci1EaWFnbm9zdGljLVNNIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogTVNDLVNNLURlbGl2ZXJ5LU91dGNvbWUgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1TQy1TTS1EZWxpdmVyeS1PdXRjb21lIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTTS1EZWxpdmVyeS1DYXVzZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQWJzZW50LVVzZXItRGlhZ25vc3RpYy1TTSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIE1NRS1TTS1EZWxpdmVyeS1PdXRjb21lICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNTUUtU00tRGVsaXZlcnktT3V0Y29tZSJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU00tRGVsaXZlcnktQ2F1c2UifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFic2VudC1Vc2VyLURpYWdub3N0aWMtU00ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBTTS1EZWxpdmVyeS1PdXRjb21lICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTTS1EZWxpdmVyeS1PdXRjb21lIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNTUUtU00tRGVsaXZlcnktT3V0Y29tZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTVNDLVNNLURlbGl2ZXJ5LU91dGNvbWUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNHU04tU00tRGVsaXZlcnktT3V0Y29tZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiSVAtU00tR1ctU00tRGVsaXZlcnktT3V0Y29tZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKworICAgfQkKKworICAgLyogQ29tbWFuZHMgc2VjdGlvbiAqLworICAgeworCisgICB9CisKKyAgIExPR19EKCAiRXh0ZW5zaW9uICdEaWN0aW9uYXJ5IGRlZmluaXRpb25zIGZvciB0czI5MzM4X2F2cHMgKGUxMCknIGluaXRpYWxpemVkIik7CisgICByZXR1cm4gMDsKK30KKworaW50IGRpY3RfZW50cnkoY2hhciAqIGNvbmZmaWxlKQoreworCWRpY3RfdHMyOTMzOF9hdnBzX2xvYWRfZGVmcyhjb25mZmlsZSk7CisJcmV0dXJuIGRpY3RfdHMyOTMzOF9hdnBzX2xvYWRfcnVsZXMoY29uZmZpbGUpOworfQorCitjb25zdCBjaGFyKiBkaWN0X3RzMjkzMzhfYXZwc19wcm90b192ZXIoY2hhciAqIGNvbmZmaWxlKSB7CisJcmV0dXJuIHRzMjkzMzhfYXZwc19wcm90b192ZXI7Cit9CisKK2NvbnN0IGRvdWJsZSBkaWN0X3RzMjkzMzhfYXZwc19nZW5fdHMoY2hhciAqIGNvbmZmaWxlKSB7CisJcmV0dXJuIHRzMjkzMzhfYXZwc19nZW5fZGF0ZTsKK30KKworRVhURU5TSU9OX0VOVFJZMigiZGljdF90czI5MzM4X2F2cHMiLCBkaWN0X3RzMjkzMzhfYXZwc19sb2FkX2RlZnMsIGRpY3RfdHMyOTMzOF9hdnBzX2xvYWRfcnVsZXMsICJkaWN0X3RzMjkyNzJfYXZwcyIsICJkaWN0X3RzMjkzMzZfYXZwcyIsICJkaWN0X3RzMjkxNzNfYXZwcyIsICJkaWN0X3RzMjkzMjlfYXZwcyIsICJkaWN0X3RzMjkyMjlfYXZwcyIsICJkaWN0X3JmYzc5NDRfYXZwcyIpOworCisKKwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X3RzMjkzMzhfYXZwcy90czI5MzM4X2F2cHMuZGlkIGIvZXh0ZW5zaW9ucy9kaWN0X3RzMjkzMzhfYXZwcy90czI5MzM4X2F2cHMuZGlkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMTliZWUKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfdHMyOTMzOF9hdnBzL3RzMjkzMzhfYXZwcy5kaWQKQEAgLTAsMCArMSwzNyBAQAorZGljdF9yZmM2OTQyX2F2cHMKK2RpY3RfdHMyOTQ2OF9hdnBzCitkaWN0X3RzMjkxNTRfYXZwcworZGljdF90czI5MjE0X2F2cHMKK2RpY3RfdHMyOTIxNV9hdnBzCitkaWN0X3RzMjkyMTdfYXZwcworZGljdF8zZ3BwMl9hdnBzCitkaWN0X3RzMjkzNDNfYXZwcworZGljdF90czI5MTI4X2F2cHMKK2RpY3RfdHMyOTM0NF9hdnBzCitkaWN0X3RzMjkzNDVfYXZwcworZGljdF90czMyMjk5X2F2cHMKK2RpY3RfcmZjNjczNF9hdnBzCitkaWN0X3JmYzU3NzhfYXZwcworZGljdF9yZmM1NTgwX2F2cHMKK2RpY3RfcmZjNDA3Ml9hdnBzCitkaWN0X3RzMjkyNzNfYXZwcworZGljdF9yZmM1Nzc3X2F2cHMKK2RpY3RfcmZjNDAwNmJpc19hdnBzCitkaWN0X3RzMjkyMTJfYXZwcworZGljdF90czI5MDYxX2F2cHMKK2RpY3RfcmZjNTQ0N19hdnBzCitkaWN0X3RzMjkyNzJfYXZwcworZGljdF90czI5MTczX2F2cHMKK2RpY3RfdHMyOTMzN19hdnBzCitkaWN0X3RzMjkzNjhfYXZwcworZGljdF90czI5MzM2X2F2cHMKK2RpY3RfZXRzaTI4MzAzNF9hdnBzCitkaWN0X3JmYzQ1OTBfYXZwcworZGljdF9yZmM0MDA0X2F2cHMKK2RpY3RfcmZjNzE1NV9hdnBzCitkaWN0X3RzMjkyMjlfYXZwcworZGljdF9yZmM3NjgzX2F2cHMKK2RpY3RfZHJhZnRsb2FkX2F2cHMKK2RpY3RfcmZjNzk0NF9hdnBzCitkaWN0X3RzMjkzMjlfYXZwcworZGljdF90czI5MzM4X2F2cHMKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF90czI5MzQzX2F2cHMvQ01ha2VMaXN0cy50eHQgYi9leHRlbnNpb25zL2RpY3RfdHMyOTM0M19hdnBzL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMGQzY2YKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfdHMyOTM0M19hdnBzL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTYgQEAKKyMgVGhlIGRpY3RfdHMyOTM0M19hdnBzIGV4dGVuc2lvbgorUFJPSkVDVCgiZGljdF90czI5MzQzX2F2cHMgbGlicmFyeSBnZW5lcmF0ZWQgYnkgRmRHZW4gIiBDKQorCisjIENvbXBpbGUgYXMgYSBtb2R1bGUKK0ZEX0FERF9FWFRFTlNJT04oZGljdF90czI5MzQzX2F2cHMgZGljdF90czI5MzQzX2F2cHMuYykKKworCisjIyMjCisjIyBJTlNUQUxMIHNlY3Rpb24gIyMKKworSU5TVEFMTChUQVJHRVRTIGRpY3RfdHMyOTM0M19hdnBzCisJTElCUkFSWSBERVNUSU5BVElPTiAke0lOU1RBTExfRVhURU5TSU9OU19TVUZGSVh9CitDT01QT05FTlQgZnJlZURpYW1ldGVyLWRpY3Rpb25hcnktVFMyOTM0M19BVlBTKQorCisKKwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X3RzMjkzNDNfYXZwcy9kaWN0X3RzMjkzNDNfYXZwcy5jIGIvZXh0ZW5zaW9ucy9kaWN0X3RzMjkzNDNfYXZwcy9kaWN0X3RzMjkzNDNfYXZwcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMjhiYTUKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfdHMyOTM0M19hdnBzL2RpY3RfdHMyOTM0M19hdnBzLmMKQEAgLTAsMCArMSwzNzUgQEAKKy8qCisqIENvcHlyaWdodCAoYykgMjAxNyBTcHJpbnQKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLyoqKioqKioqKioqKioqKioKKyBHZW5lcmF0ZWQgQnk6IGZkdG9vbCBlbmhhbmNlbWVudHMgdG8gZGlhZnV6emVyCisgTGljZW5zZTogc2FtZSBhcyBmcmVlRGlhbWV0ZXIKKyoqKioqKioqKioqKioqKiovCisKKworLyogCisgKiBEaWN0aW9uYXJ5IGRlZmluaXRpb25zIG9mIG9iamVjdHMgc3BlY2lmaWVkIGluIHRzMjkzNDNfYXZwcyAoZTEwKS4KKyAqLworI2luY2x1ZGUgPGZyZWVEaWFtZXRlci9leHRlbnNpb24uaD4KKworI2RlZmluZSBQUk9UT19WRVIgImUxMCIKKyNkZWZpbmUgR0VOX0RBVEUgIDE1MDY2OTcxNTkuODcKKworY29uc3QgY2hhciAqdHMyOTM0M19hdnBzX3Byb3RvX3ZlciA9IFBST1RPX1ZFUjsKK2NvbnN0IGRvdWJsZSB0czI5MzQzX2F2cHNfZ2VuX2RhdGUgPSBHRU5fREFURTsKKworLyogVGhlIGNvbnRlbnQgb2YgdGhpcyBmaWxlIGZvbGxvd3MgdGhlIHNhbWUgc3RydWN0dXJlIGFzIGRpY3RfYmFzZV9wcm90by5jICovCisKKyNkZWZpbmUgQ0hFQ0tfZGljdF9uZXcoIF90eXBlLCBfZGF0YSwgX3BhcmVudCwgX3JlZiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgX3JldCA9IGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIChfdHlwZSksIChfZGF0YSksIChfcGFyZW50KSwgKF9yZWYpICk7IFwKKyAgICBpZiAoIF9yZXQgIT0gMCAmJiBfcmV0ICE9IEVFWElTVCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICByZXR1cm4gX3JldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBDSEVDS19kaWN0X3NlYXJjaCggX3R5cGUsIF9jcml0ZXJpYSwgX3doYXQsIF9yZXN1bHQgKQkJXAorICAgIENIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIChfdHlwZSksIChfY3JpdGVyaWEpLCAoX3doYXQpLCAoX3Jlc3VsdCksIEVOT0VOVCkgKTsKKworc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24geworICAgIHN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lOworICAgIGVudW0gcnVsZV9wb3NpdGlvbglwb3NpdGlvbjsKKyAgICBpbnQgCQkJbWluOworICAgIGludAkJCW1heDsKK307CisKKyNkZWZpbmUgUlVMRV9PUkRFUiggX3Bvc2l0aW9uICkgKCgoKF9wb3NpdGlvbikgPT0gUlVMRV9GSVhFRF9IRUFEKSB8fCAoKF9wb3NpdGlvbikgPT0gUlVMRV9GSVhFRF9UQUlMKSkgPyAxIDogMCApCisKKy8qIEF0dGVudGlvbiEgVGhpcyB2ZXJzaW9uIG9mIHRoZSBtYWNybyB1c2VzIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsIGluIGNvbnRyYXN0IHRvIG1vc3Qgb3RoZXIgY29waWVzISAqLworI2RlZmluZSBQQVJTRV9sb2NfcnVsZXMoIF9ydWxlYXJyYXksIF9wYXJlbnQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBfX2FyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yIChfX2FyPTA7IF9fYXIgPCBzaXplb2YoX3J1bGVhcnJheSkgLyBzaXplb2YoKF9ydWxlYXJyYXkpWzBdKTsgX19hcisrKSB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHN0cnVjdCBkaWN0X3J1bGVfZGF0YSBfX2RhdGEgPSB7IE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ucG9zaXRpb24sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLm1pbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ubWF4fTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfX2RhdGEucnVsZV9vcmRlciA9IFJVTEVfT1JERVIoX19kYXRhLnJ1bGVfcG9zaXRpb24pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIENIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIERJQ1RfQVZQLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAmKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICZfX2RhdGEucnVsZV9hdnAsIDAgKSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmICggIV9fZGF0YS5ydWxlX2F2cCApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9ERUJVRyhJTkZPLCAiQVZQIE5vdCBmb3VuZDogJyVzJyIsIChfcnVsZWFycmF5KVtfX2FyXS5hdnBfdmVuZG9yX3BsdXNfbmFtZS5hdnBfbmFtZSk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFTk9FTlQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgX3JldCA9IGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfUlVMRSwgJihfX2RhdGEpLCAoX3BhcmVudCksIE5VTEwgKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggX3JldCAhPSAwICYmIF9yZXQgIT0gRUVYSVNUICkgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFX0RFQlVHKElORk8sICJFcnJvciBvbiBydWxlIHdpdGggQVZQICclcyciLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLmF2cF9uYW1lKTsgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRUlOVkFMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgQ0hFQ0tfdmVuZG9yX25ldyggX2RhdGEgKSB7IFwKKyAgICAgICAgc3RydWN0IGRpY3Rfb2JqZWN0ICogdmVuZG9yX2ZvdW5kOyBcCisgICAgICAgIGlmIChmZF9kaWN0X3NlYXJjaChmZF9nX2NvbmZpZy0+Y25mX2RpY3QsRElDVF9WRU5ET1IsVkVORE9SX0JZX0lELCZfZGF0YS52ZW5kb3JfaWQsJnZlbmRvcl9mb3VuZCxFTk9FTlQpID09IEVOT0VOVCkgeyBcCisgICAgICAgICAgICAgICAgQ0hFQ0tfRkNUKGZkX2RpY3RfbmV3KGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9WRU5ET1IsICZfZGF0YSwgTlVMTCwgTlVMTCkpOyBcCisgICAgICAgIH0gXAorfQorCisjZGVmaW5lIGVudW12YWxfZGVmX3UzMiggX3ZhbF8sIF9zdHJfICkJCVwKKyAgICB7IF9zdHJfLCAJCXsgLnUzMiA9IF92YWxfIH19CisKKyNkZWZpbmUgZW51bXZhbF9kZWZfb3MoIF9sZW5fLCBfdmFsXywgX3N0cl8gKQkJCQlcCisgICAgeyBfc3RyXywgCQl7IC5vcyA9IHsgLmRhdGEgPSAodW5zaWduZWQgY2hhciAqKV92YWxfLCAubGVuID0gX2xlbl8gfX19CisKKworc3RhdGljIGludCBkaWN0X3RzMjkzNDNfYXZwc19sb2FkX2RlZnMoY2hhciAqIGNvbmZmaWxlKQoreworICAgVFJBQ0VfRU5UUlkoIiVwIiwgY29uZmZpbGUpOworCS8qIEFwcGxpY2F0aW9uIFNlY3Rpb24gKi8KKwl7CisJCS8qIENyZWF0ZSB0aGUgdmVuZG9ycyAqLwkJeworCQkJc3RydWN0IGRpY3RfdmVuZG9yX2RhdGEgdmVuZG9yX2RhdGEgPSB7IDEwNDE1LCAiM0dQUCIgfTsKKwkJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVkVORE9SLCAmdmVuZG9yX2RhdGEsIE5VTEwsIE5VTEwpCisJCX0KKwl9CisKKworICAgLyogQVZQIHNlY3Rpb24gKi8KKyAgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogQWRkcmVzc190eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBVVEY4U3RyaW5nX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIERpYW1ldGVySWRlbnRpdHlfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogRGlhbWV0ZXJVUklfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogVGltZV90eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBJUEZpbHRlclJ1bGVfdHlwZTsKKworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJBZGRyZXNzIiwgJkFkZHJlc3NfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIlVURjhTdHJpbmciLCAmVVRGOFN0cmluZ190eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiRGlhbWV0ZXJJZGVudGl0eSIsICZEaWFtZXRlcklkZW50aXR5X3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJEaWFtZXRlclVSSSIsICZEaWFtZXRlclVSSV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiVGltZSIsICZUaW1lX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJJUEZpbHRlclJ1bGUiLCAmSVBGaWx0ZXJSdWxlX3R5cGUpOworCQkvKiBPcmlnaW4tQXBwLUxheWVyLVVzZXItSWQgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzNjAwLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJPcmlnaW4tQXBwLUxheWVyLVVzZXItSWQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFRhcmdldC1BcHAtTGF5ZXItVXNlci1JZCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM2MDEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlRhcmdldC1BcHAtTGF5ZXItVXNlci1JZCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogUHJvU2UtRnVuY3Rpb24tSUQgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzNjAyLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJQcm9TZS1GdW5jdGlvbi1JRCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFByb1NlLVJlcXVlc3QtVHlwZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM2MDMsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlByb1NlLVJlcXVlc3QtVHlwZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogUERVSUQgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzNjA0LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJQRFVJRCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIEFwcGxpY2F0aW9uLURhdGEgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzNjA1LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJBcHBsaWNhdGlvbi1EYXRhIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBBbGxvd2VkLVN1ZmZpeGVzLU51bWJlciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM2MDYsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkFsbG93ZWQtU3VmZml4ZXMtTnVtYmVyIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBTdWZmaXgtQ29kZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM2MDksCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlN1ZmZpeC1Db2RlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogU3VmZml4LU1hc2sgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzNjEwLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTdWZmaXgtTWFzayIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIE1ldGFkYXRhLUluZGljYXRvciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM2MTIsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk1ldGFkYXRhLUluZGljYXRvciIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogUHJvU2UtQ29kZS1TdWZmaXgtTWFzayAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM2MDgsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlByb1NlLUNvZGUtU3VmZml4LU1hc2siLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIEJhbm5lZC1Vc2VyLVRhcmdldCAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM2MTEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkJhbm5lZC1Vc2VyLVRhcmdldCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogTW9uaXRvci1UYXJnZXQgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzNjA3LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJNb25pdG9yLVRhcmdldCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKworCQorICAgfQorCisgICAvKiBDb21tYW5kcyBzZWN0aW9uICovCisgICB7CisKKyAgIH0KKworICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGljdF90czI5MzQzX2F2cHNfbG9hZF9ydWxlcyhjaGFyICogY29uZmZpbGUpCit7CisgICAvKiBHcm91cGVkIEFWUCBzZWN0aW9uICovCisgICB7CisJICAvKiBQcm9TZS1Db2RlLVN1ZmZpeC1NYXNrICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQcm9TZS1Db2RlLVN1ZmZpeC1NYXNrIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTdWZmaXgtQ29kZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU3VmZml4LU1hc2sifSwgUlVMRV9SRVFVSVJFRCwgMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIEJhbm5lZC1Vc2VyLVRhcmdldCAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQmFubmVkLVVzZXItVGFyZ2V0In07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUYXJnZXQtUlBBVUlEIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUYXJnZXQtUERVSUQifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBNb25pdG9yLVRhcmdldCAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTW9uaXRvci1UYXJnZXQifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlRhcmdldC1SUEFVSUQifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlBEVUlEIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNZXRhZGF0YS1JbmRpY2F0b3IifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlByb1NlLUNvZGUtU3VmZml4LU1hc2sifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisKKyAgIH0JCisKKyAgIC8qIENvbW1hbmRzIHNlY3Rpb24gKi8KKyAgIHsKKworICAgfQorCisgICBMT0dfRCggIkV4dGVuc2lvbiAnRGljdGlvbmFyeSBkZWZpbml0aW9ucyBmb3IgdHMyOTM0M19hdnBzIChlMTApJyBpbml0aWFsaXplZCIpOworICAgcmV0dXJuIDA7Cit9CisKK2ludCBkaWN0X2VudHJ5KGNoYXIgKiBjb25mZmlsZSkKK3sKKwlkaWN0X3RzMjkzNDNfYXZwc19sb2FkX2RlZnMoY29uZmZpbGUpOworCXJldHVybiBkaWN0X3RzMjkzNDNfYXZwc19sb2FkX3J1bGVzKGNvbmZmaWxlKTsKK30KKworY29uc3QgY2hhciogZGljdF90czI5MzQzX2F2cHNfcHJvdG9fdmVyKGNoYXIgKiBjb25mZmlsZSkgeworCXJldHVybiB0czI5MzQzX2F2cHNfcHJvdG9fdmVyOworfQorCitjb25zdCBkb3VibGUgZGljdF90czI5MzQzX2F2cHNfZ2VuX3RzKGNoYXIgKiBjb25mZmlsZSkgeworCXJldHVybiB0czI5MzQzX2F2cHNfZ2VuX2RhdGU7Cit9CisKK0VYVEVOU0lPTl9FTlRSWTIoImRpY3RfdHMyOTM0M19hdnBzIiwgZGljdF90czI5MzQzX2F2cHNfbG9hZF9kZWZzLCBkaWN0X3RzMjkzNDNfYXZwc19sb2FkX3J1bGVzLCAiZGljdF90czI5MzQ1X2F2cHMiLCAiZGljdF9kcmFmdGxvYWRfYXZwcyIpOworCisKKwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X3RzMjkzNDNfYXZwcy90czI5MzQzX2F2cHMuZGlkIGIvZXh0ZW5zaW9ucy9kaWN0X3RzMjkzNDNfYXZwcy90czI5MzQzX2F2cHMuZGlkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhNDM4ODMKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfdHMyOTM0M19hdnBzL3RzMjkzNDNfYXZwcy5kaWQKQEAgLTAsMCArMSwzNyBAQAorZGljdF9yZmM2OTQyX2F2cHMKK2RpY3RfdHMyOTQ2OF9hdnBzCitkaWN0X3RzMjkxMjhfYXZwcworZGljdF90czI5MzM3X2F2cHMKK2RpY3RfM2dwcDJfYXZwcworZGljdF90czI5MTU0X2F2cHMKK2RpY3RfdHMyOTIxNF9hdnBzCitkaWN0X3RzMjkyMTVfYXZwcworZGljdF90czI5MjE3X2F2cHMKK2RpY3RfdHMyOTMzOF9hdnBzCitkaWN0X3RzMjkzMzZfYXZwcworZGljdF90czI5MzY4X2F2cHMKK2RpY3RfdHMzMjI5OV9hdnBzCitkaWN0X3JmYzY3MzRfYXZwcworZGljdF9yZmM1Nzc4X2F2cHMKK2RpY3RfcmZjNTU4MF9hdnBzCitkaWN0X3RzMjkyNzNfYXZwcworZGljdF9yZmM1Nzc3X2F2cHMKK2RpY3RfcmZjNDAwNmJpc19hdnBzCitkaWN0X3RzMjkyMTJfYXZwcworZGljdF90czI5MDYxX2F2cHMKK2RpY3RfcmZjNTQ0N19hdnBzCitkaWN0X3RzMjkyNzJfYXZwcworZGljdF9ldHNpMjgzMDM0X2F2cHMKK2RpY3RfcmZjNDU5MF9hdnBzCitkaWN0X3RzMjkyMjlfYXZwcworZGljdF9kcmFmdGxvYWRfYXZwcworZGljdF90czI5MzI5X2F2cHMKK2RpY3RfdHMyOTE3M19hdnBzCitkaWN0X3JmYzc2ODNfYXZwcworZGljdF9yZmM3OTQ0X2F2cHMKK2RpY3RfdHMyOTM0NF9hdnBzCitkaWN0X3JmYzQwMDRfYXZwcworZGljdF9yZmM3MTU1X2F2cHMKK2RpY3RfcmZjNDA3Ml9hdnBzCitkaWN0X3RzMjkzNDVfYXZwcworZGljdF90czI5MzQzX2F2cHMKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF90czI5MzQ0X2F2cHMvQ01ha2VMaXN0cy50eHQgYi9leHRlbnNpb25zL2RpY3RfdHMyOTM0NF9hdnBzL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1Nzk2MmUKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfdHMyOTM0NF9hdnBzL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTYgQEAKKyMgVGhlIGRpY3RfdHMyOTM0NF9hdnBzIGV4dGVuc2lvbgorUFJPSkVDVCgiZGljdF90czI5MzQ0X2F2cHMgbGlicmFyeSBnZW5lcmF0ZWQgYnkgRmRHZW4gIiBDKQorCisjIENvbXBpbGUgYXMgYSBtb2R1bGUKK0ZEX0FERF9FWFRFTlNJT04oZGljdF90czI5MzQ0X2F2cHMgZGljdF90czI5MzQ0X2F2cHMuYykKKworCisjIyMjCisjIyBJTlNUQUxMIHNlY3Rpb24gIyMKKworSU5TVEFMTChUQVJHRVRTIGRpY3RfdHMyOTM0NF9hdnBzCisJTElCUkFSWSBERVNUSU5BVElPTiAke0lOU1RBTExfRVhURU5TSU9OU19TVUZGSVh9CitDT01QT05FTlQgZnJlZURpYW1ldGVyLWRpY3Rpb25hcnktVFMyOTM0NF9BVlBTKQorCisKKwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X3RzMjkzNDRfYXZwcy9kaWN0X3RzMjkzNDRfYXZwcy5jIGIvZXh0ZW5zaW9ucy9kaWN0X3RzMjkzNDRfYXZwcy9kaWN0X3RzMjkzNDRfYXZwcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYTBhYTYKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfdHMyOTM0NF9hdnBzL2RpY3RfdHMyOTM0NF9hdnBzLmMKQEAgLTAsMCArMSwzMTcgQEAKKy8qCisqIENvcHlyaWdodCAoYykgMjAxNyBTcHJpbnQKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLyoqKioqKioqKioqKioqKioKKyBHZW5lcmF0ZWQgQnk6IGZkdG9vbCBlbmhhbmNlbWVudHMgdG8gZGlhZnV6emVyCisgTGljZW5zZTogc2FtZSBhcyBmcmVlRGlhbWV0ZXIKKyoqKioqKioqKioqKioqKiovCisKKworLyogCisgKiBEaWN0aW9uYXJ5IGRlZmluaXRpb25zIG9mIG9iamVjdHMgc3BlY2lmaWVkIGluIHRzMjkzNDRfYXZwcyAoZTEwKS4KKyAqLworI2luY2x1ZGUgPGZyZWVEaWFtZXRlci9leHRlbnNpb24uaD4KKworI2RlZmluZSBQUk9UT19WRVIgImUxMCIKKyNkZWZpbmUgR0VOX0RBVEUgIDE1MDY2OTcxNjIuNTkKKworY29uc3QgY2hhciAqdHMyOTM0NF9hdnBzX3Byb3RvX3ZlciA9IFBST1RPX1ZFUjsKK2NvbnN0IGRvdWJsZSB0czI5MzQ0X2F2cHNfZ2VuX2RhdGUgPSBHRU5fREFURTsKKworLyogVGhlIGNvbnRlbnQgb2YgdGhpcyBmaWxlIGZvbGxvd3MgdGhlIHNhbWUgc3RydWN0dXJlIGFzIGRpY3RfYmFzZV9wcm90by5jICovCisKKyNkZWZpbmUgQ0hFQ0tfZGljdF9uZXcoIF90eXBlLCBfZGF0YSwgX3BhcmVudCwgX3JlZiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgX3JldCA9IGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIChfdHlwZSksIChfZGF0YSksIChfcGFyZW50KSwgKF9yZWYpICk7IFwKKyAgICBpZiAoIF9yZXQgIT0gMCAmJiBfcmV0ICE9IEVFWElTVCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICByZXR1cm4gX3JldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBDSEVDS19kaWN0X3NlYXJjaCggX3R5cGUsIF9jcml0ZXJpYSwgX3doYXQsIF9yZXN1bHQgKQkJXAorICAgIENIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIChfdHlwZSksIChfY3JpdGVyaWEpLCAoX3doYXQpLCAoX3Jlc3VsdCksIEVOT0VOVCkgKTsKKworc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24geworICAgIHN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lOworICAgIGVudW0gcnVsZV9wb3NpdGlvbglwb3NpdGlvbjsKKyAgICBpbnQgCQkJbWluOworICAgIGludAkJCW1heDsKK307CisKKyNkZWZpbmUgUlVMRV9PUkRFUiggX3Bvc2l0aW9uICkgKCgoKF9wb3NpdGlvbikgPT0gUlVMRV9GSVhFRF9IRUFEKSB8fCAoKF9wb3NpdGlvbikgPT0gUlVMRV9GSVhFRF9UQUlMKSkgPyAxIDogMCApCisKKy8qIEF0dGVudGlvbiEgVGhpcyB2ZXJzaW9uIG9mIHRoZSBtYWNybyB1c2VzIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsIGluIGNvbnRyYXN0IHRvIG1vc3Qgb3RoZXIgY29waWVzISAqLworI2RlZmluZSBQQVJTRV9sb2NfcnVsZXMoIF9ydWxlYXJyYXksIF9wYXJlbnQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBfX2FyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yIChfX2FyPTA7IF9fYXIgPCBzaXplb2YoX3J1bGVhcnJheSkgLyBzaXplb2YoKF9ydWxlYXJyYXkpWzBdKTsgX19hcisrKSB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHN0cnVjdCBkaWN0X3J1bGVfZGF0YSBfX2RhdGEgPSB7IE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ucG9zaXRpb24sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLm1pbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ubWF4fTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfX2RhdGEucnVsZV9vcmRlciA9IFJVTEVfT1JERVIoX19kYXRhLnJ1bGVfcG9zaXRpb24pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIENIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIERJQ1RfQVZQLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAmKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICZfX2RhdGEucnVsZV9hdnAsIDAgKSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmICggIV9fZGF0YS5ydWxlX2F2cCApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9ERUJVRyhJTkZPLCAiQVZQIE5vdCBmb3VuZDogJyVzJyIsIChfcnVsZWFycmF5KVtfX2FyXS5hdnBfdmVuZG9yX3BsdXNfbmFtZS5hdnBfbmFtZSk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFTk9FTlQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgX3JldCA9IGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfUlVMRSwgJihfX2RhdGEpLCAoX3BhcmVudCksIE5VTEwgKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggX3JldCAhPSAwICYmIF9yZXQgIT0gRUVYSVNUICkgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFX0RFQlVHKElORk8sICJFcnJvciBvbiBydWxlIHdpdGggQVZQICclcyciLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLmF2cF9uYW1lKTsgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRUlOVkFMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgQ0hFQ0tfdmVuZG9yX25ldyggX2RhdGEgKSB7IFwKKyAgICAgICAgc3RydWN0IGRpY3Rfb2JqZWN0ICogdmVuZG9yX2ZvdW5kOyBcCisgICAgICAgIGlmIChmZF9kaWN0X3NlYXJjaChmZF9nX2NvbmZpZy0+Y25mX2RpY3QsRElDVF9WRU5ET1IsVkVORE9SX0JZX0lELCZfZGF0YS52ZW5kb3JfaWQsJnZlbmRvcl9mb3VuZCxFTk9FTlQpID09IEVOT0VOVCkgeyBcCisgICAgICAgICAgICAgICAgQ0hFQ0tfRkNUKGZkX2RpY3RfbmV3KGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9WRU5ET1IsICZfZGF0YSwgTlVMTCwgTlVMTCkpOyBcCisgICAgICAgIH0gXAorfQorCisjZGVmaW5lIGVudW12YWxfZGVmX3UzMiggX3ZhbF8sIF9zdHJfICkJCVwKKyAgICB7IF9zdHJfLCAJCXsgLnUzMiA9IF92YWxfIH19CisKKyNkZWZpbmUgZW51bXZhbF9kZWZfb3MoIF9sZW5fLCBfdmFsXywgX3N0cl8gKQkJCQlcCisgICAgeyBfc3RyXywgCQl7IC5vcyA9IHsgLmRhdGEgPSAodW5zaWduZWQgY2hhciAqKV92YWxfLCAubGVuID0gX2xlbl8gfX19CisKKworc3RhdGljIGludCBkaWN0X3RzMjkzNDRfYXZwc19sb2FkX2RlZnMoY2hhciAqIGNvbmZmaWxlKQoreworICAgVFJBQ0VfRU5UUlkoIiVwIiwgY29uZmZpbGUpOworCS8qIEFwcGxpY2F0aW9uIFNlY3Rpb24gKi8KKwl7CisJCS8qIENyZWF0ZSB0aGUgdmVuZG9ycyAqLwkJeworCQkJc3RydWN0IGRpY3RfdmVuZG9yX2RhdGEgdmVuZG9yX2RhdGEgPSB7IDEwNDE1LCAiM0dQUCIgfTsKKwkJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVkVORE9SLCAmdmVuZG9yX2RhdGEsIE5VTEwsIE5VTEwpCisJCX0KKwl9CisKKworICAgLyogQVZQIHNlY3Rpb24gKi8KKyAgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogQWRkcmVzc190eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBVVEY4U3RyaW5nX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIERpYW1ldGVySWRlbnRpdHlfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogRGlhbWV0ZXJVUklfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogVGltZV90eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBJUEZpbHRlclJ1bGVfdHlwZTsKKworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJBZGRyZXNzIiwgJkFkZHJlc3NfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIlVURjhTdHJpbmciLCAmVVRGOFN0cmluZ190eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiRGlhbWV0ZXJJZGVudGl0eSIsICZEaWFtZXRlcklkZW50aXR5X3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJEaWFtZXRlclVSSSIsICZEaWFtZXRlclVSSV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiVGltZSIsICZUaW1lX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJJUEZpbHRlclJ1bGUiLCAmSVBGaWx0ZXJSdWxlX3R5cGUpOworCQkvKiBQcm9TZS1QZXJtaXNzaW9uICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzcwMiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUHJvU2UtUGVybWlzc2lvbiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogUHJvU2UtRGlyZWN0LUFsbG93ZWQgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzNzA0LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJQcm9TZS1EaXJlY3QtQWxsb3dlZCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogVVBSLUZsYWdzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzcwNSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiVVBSLUZsYWdzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBQTlItRmxhZ3MgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzNzA2LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJQTlItRmxhZ3MiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIEF1dGhvcml6ZWQtRGlzY292ZXJ5LVJhbmdlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzcwOCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQXV0aG9yaXplZC1EaXNjb3ZlcnktUmFuZ2UiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFByb1NlLUluaXRpYWwtTG9jYXRpb24tSW5mb3JtYXRpb24gKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzNzA3LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJQcm9TZS1Jbml0aWFsLUxvY2F0aW9uLUluZm9ybWF0aW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBQcm9TZS1BbGxvd2VkLVBMTU4gKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzNzAzLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJQcm9TZS1BbGxvd2VkLVBMTU4iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIFByb1NlLVN1YnNjcmlwdGlvbi1EYXRhICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzcwMSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUHJvU2UtU3Vic2NyaXB0aW9uLURhdGEiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisKKwkKKyAgIH0KKworICAgLyogQ29tbWFuZHMgc2VjdGlvbiAqLworICAgeworCisgICB9CisKKyAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRpY3RfdHMyOTM0NF9hdnBzX2xvYWRfcnVsZXMoY2hhciAqIGNvbmZmaWxlKQoreworICAgLyogR3JvdXBlZCBBVlAgc2VjdGlvbiAqLworICAgeworCSAgLyogUHJvU2UtSW5pdGlhbC1Mb2NhdGlvbi1JbmZvcm1hdGlvbiAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUHJvU2UtSW5pdGlhbC1Mb2NhdGlvbi1JbmZvcm1hdGlvbiJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTU1FLU5hbWUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkUtVVRSQU4tQ2VsbC1HbG9iYWwtSWRlbnRpdHkifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlRyYWNraW5nLUFyZWEtSWRlbnRpdHkifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFnZS1PZi1Mb2NhdGlvbi1JbmZvcm1hdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIFByb1NlLUFsbG93ZWQtUExNTiAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUHJvU2UtQWxsb3dlZC1QTE1OIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJWaXNpdGVkLVBMTU4tSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkF1dGhvcml6ZWQtRGlzY292ZXJ5LVJhbmdlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQcm9TZS1EaXJlY3QtQWxsb3dlZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIFByb1NlLVN1YnNjcmlwdGlvbi1EYXRhICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQcm9TZS1TdWJzY3JpcHRpb24tRGF0YSJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUHJvU2UtUGVybWlzc2lvbiJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUHJvU2UtQWxsb3dlZC1QTE1OIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICIzR1BQLUNoYXJnaW5nLUNoYXJhY3RlcmlzdGljcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKworICAgfQkKKworICAgLyogQ29tbWFuZHMgc2VjdGlvbiAqLworICAgeworCisgICB9CisKKyAgIExPR19EKCAiRXh0ZW5zaW9uICdEaWN0aW9uYXJ5IGRlZmluaXRpb25zIGZvciB0czI5MzQ0X2F2cHMgKGUxMCknIGluaXRpYWxpemVkIik7CisgICByZXR1cm4gMDsKK30KKworaW50IGRpY3RfZW50cnkoY2hhciAqIGNvbmZmaWxlKQoreworCWRpY3RfdHMyOTM0NF9hdnBzX2xvYWRfZGVmcyhjb25mZmlsZSk7CisJcmV0dXJuIGRpY3RfdHMyOTM0NF9hdnBzX2xvYWRfcnVsZXMoY29uZmZpbGUpOworfQorCitjb25zdCBjaGFyKiBkaWN0X3RzMjkzNDRfYXZwc19wcm90b192ZXIoY2hhciAqIGNvbmZmaWxlKSB7CisJcmV0dXJuIHRzMjkzNDRfYXZwc19wcm90b192ZXI7Cit9CisKK2NvbnN0IGRvdWJsZSBkaWN0X3RzMjkzNDRfYXZwc19nZW5fdHMoY2hhciAqIGNvbmZmaWxlKSB7CisJcmV0dXJuIHRzMjkzNDRfYXZwc19nZW5fZGF0ZTsKK30KKworRVhURU5TSU9OX0VOVFJZMigiZGljdF90czI5MzQ0X2F2cHMiLCBkaWN0X3RzMjkzNDRfYXZwc19sb2FkX2RlZnMsIGRpY3RfdHMyOTM0NF9hdnBzX2xvYWRfcnVsZXMsICJkaWN0X3RzMjkyNzJfYXZwcyIsICJkaWN0X3RzMjkzMjlfYXZwcyIsICJkaWN0X3RzMjkyMjlfYXZwcyIsICJkaWN0X3RzMjkxNzNfYXZwcyIsICJkaWN0X3RzMjkwNjFfYXZwcyIsICJkaWN0X2RyYWZ0bG9hZF9hdnBzIiwgImRpY3RfcmZjNzY4M19hdnBzIiwgImRpY3RfcmZjNzk0NF9hdnBzIik7CisKKworCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfdHMyOTM0NF9hdnBzL3RzMjkzNDRfYXZwcy5kaWQgYi9leHRlbnNpb25zL2RpY3RfdHMyOTM0NF9hdnBzL3RzMjkzNDRfYXZwcy5kaWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU0OGI1MwotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF90czI5MzQ0X2F2cHMvdHMyOTM0NF9hdnBzLmRpZApAQCAtMCwwICsxLDM3IEBACitkaWN0X3JmYzY5NDJfYXZwcworZGljdF90czI5NDY4X2F2cHMKK2RpY3RfdHMyOTM0M19hdnBzCitkaWN0X3RzMjkxMjhfYXZwcworZGljdF90czI5MzQ1X2F2cHMKK2RpY3RfdHMyOTMzN19hdnBzCitkaWN0XzNncHAyX2F2cHMKK2RpY3RfdHMyOTE1NF9hdnBzCitkaWN0X3RzMjkyMTRfYXZwcworZGljdF90czI5MjE1X2F2cHMKK2RpY3RfdHMyOTIxN19hdnBzCitkaWN0X3RzMjkzMzhfYXZwcworZGljdF90czI5MzM2X2F2cHMKK2RpY3RfdHMyOTM2OF9hdnBzCitkaWN0X3RzMzIyOTlfYXZwcworZGljdF9yZmM2NzM0X2F2cHMKK2RpY3RfcmZjNTc3OF9hdnBzCitkaWN0X3JmYzU1ODBfYXZwcworZGljdF9yZmM0MDcyX2F2cHMKK2RpY3RfdHMyOTI3M19hdnBzCitkaWN0X3JmYzU3NzdfYXZwcworZGljdF9yZmM0MDA2YmlzX2F2cHMKK2RpY3RfdHMyOTIxMl9hdnBzCitkaWN0X3RzMjkwNjFfYXZwcworZGljdF9yZmM1NDQ3X2F2cHMKK2RpY3RfdHMyOTI3Ml9hdnBzCitkaWN0X2V0c2kyODMwMzRfYXZwcworZGljdF9yZmM0NTkwX2F2cHMKK2RpY3RfcmZjNDAwNF9hdnBzCitkaWN0X3JmYzcxNTVfYXZwcworZGljdF90czI5MjI5X2F2cHMKK2RpY3RfZHJhZnRsb2FkX2F2cHMKK2RpY3RfdHMyOTMyOV9hdnBzCitkaWN0X3RzMjkxNzNfYXZwcworZGljdF9yZmM3NjgzX2F2cHMKK2RpY3RfcmZjNzk0NF9hdnBzCitkaWN0X3RzMjkzNDRfYXZwcwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X3RzMjkzNDVfYXZwcy9DTWFrZUxpc3RzLnR4dCBiL2V4dGVuc2lvbnMvZGljdF90czI5MzQ1X2F2cHMvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI0MTBjOQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF90czI5MzQ1X2F2cHMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxNiBAQAorIyBUaGUgZGljdF90czI5MzQ1X2F2cHMgZXh0ZW5zaW9uCitQUk9KRUNUKCJkaWN0X3RzMjkzNDVfYXZwcyBsaWJyYXJ5IGdlbmVyYXRlZCBieSBGZEdlbiAiIEMpCisKKyMgQ29tcGlsZSBhcyBhIG1vZHVsZQorRkRfQUREX0VYVEVOU0lPTihkaWN0X3RzMjkzNDVfYXZwcyBkaWN0X3RzMjkzNDVfYXZwcy5jKQorCisKKyMjIyMKKyMjIElOU1RBTEwgc2VjdGlvbiAjIworCitJTlNUQUxMKFRBUkdFVFMgZGljdF90czI5MzQ1X2F2cHMKKwlMSUJSQVJZIERFU1RJTkFUSU9OICR7SU5TVEFMTF9FWFRFTlNJT05TX1NVRkZJWH0KK0NPTVBPTkVOVCBmcmVlRGlhbWV0ZXItZGljdGlvbmFyeS1UUzI5MzQ1X0FWUFMpCisKKworCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfdHMyOTM0NV9hdnBzL2RpY3RfdHMyOTM0NV9hdnBzLmMgYi9leHRlbnNpb25zL2RpY3RfdHMyOTM0NV9hdnBzL2RpY3RfdHMyOTM0NV9hdnBzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM5OTFkNAotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF90czI5MzQ1X2F2cHMvZGljdF90czI5MzQ1X2F2cHMuYwpAQCAtMCwwICsxLDEzMDAgQEAKKy8qCisqIENvcHlyaWdodCAoYykgMjAxNyBTcHJpbnQKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLyoqKioqKioqKioqKioqKioKKyBHZW5lcmF0ZWQgQnk6IGZkdG9vbCBlbmhhbmNlbWVudHMgdG8gZGlhZnV6emVyCisgTGljZW5zZTogc2FtZSBhcyBmcmVlRGlhbWV0ZXIKKyoqKioqKioqKioqKioqKiovCisKKworLyogCisgKiBEaWN0aW9uYXJ5IGRlZmluaXRpb25zIG9mIG9iamVjdHMgc3BlY2lmaWVkIGluIHRzMjkzNDVfYXZwcyAoZTEwKS4KKyAqLworI2luY2x1ZGUgPGZyZWVEaWFtZXRlci9leHRlbnNpb24uaD4KKworI2RlZmluZSBQUk9UT19WRVIgImUxMCIKKyNkZWZpbmUgR0VOX0RBVEUgIDE1MDY2OTcxNjUuNjgKKworY29uc3QgY2hhciAqdHMyOTM0NV9hdnBzX3Byb3RvX3ZlciA9IFBST1RPX1ZFUjsKK2NvbnN0IGRvdWJsZSB0czI5MzQ1X2F2cHNfZ2VuX2RhdGUgPSBHRU5fREFURTsKKworLyogVGhlIGNvbnRlbnQgb2YgdGhpcyBmaWxlIGZvbGxvd3MgdGhlIHNhbWUgc3RydWN0dXJlIGFzIGRpY3RfYmFzZV9wcm90by5jICovCisKKyNkZWZpbmUgQ0hFQ0tfZGljdF9uZXcoIF90eXBlLCBfZGF0YSwgX3BhcmVudCwgX3JlZiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgX3JldCA9IGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIChfdHlwZSksIChfZGF0YSksIChfcGFyZW50KSwgKF9yZWYpICk7IFwKKyAgICBpZiAoIF9yZXQgIT0gMCAmJiBfcmV0ICE9IEVFWElTVCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICByZXR1cm4gX3JldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBDSEVDS19kaWN0X3NlYXJjaCggX3R5cGUsIF9jcml0ZXJpYSwgX3doYXQsIF9yZXN1bHQgKQkJXAorICAgIENIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIChfdHlwZSksIChfY3JpdGVyaWEpLCAoX3doYXQpLCAoX3Jlc3VsdCksIEVOT0VOVCkgKTsKKworc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24geworICAgIHN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lOworICAgIGVudW0gcnVsZV9wb3NpdGlvbglwb3NpdGlvbjsKKyAgICBpbnQgCQkJbWluOworICAgIGludAkJCW1heDsKK307CisKKyNkZWZpbmUgUlVMRV9PUkRFUiggX3Bvc2l0aW9uICkgKCgoKF9wb3NpdGlvbikgPT0gUlVMRV9GSVhFRF9IRUFEKSB8fCAoKF9wb3NpdGlvbikgPT0gUlVMRV9GSVhFRF9UQUlMKSkgPyAxIDogMCApCisKKy8qIEF0dGVudGlvbiEgVGhpcyB2ZXJzaW9uIG9mIHRoZSBtYWNybyB1c2VzIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsIGluIGNvbnRyYXN0IHRvIG1vc3Qgb3RoZXIgY29waWVzISAqLworI2RlZmluZSBQQVJTRV9sb2NfcnVsZXMoIF9ydWxlYXJyYXksIF9wYXJlbnQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBfX2FyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yIChfX2FyPTA7IF9fYXIgPCBzaXplb2YoX3J1bGVhcnJheSkgLyBzaXplb2YoKF9ydWxlYXJyYXkpWzBdKTsgX19hcisrKSB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHN0cnVjdCBkaWN0X3J1bGVfZGF0YSBfX2RhdGEgPSB7IE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ucG9zaXRpb24sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLm1pbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ubWF4fTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfX2RhdGEucnVsZV9vcmRlciA9IFJVTEVfT1JERVIoX19kYXRhLnJ1bGVfcG9zaXRpb24pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIENIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIERJQ1RfQVZQLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAmKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICZfX2RhdGEucnVsZV9hdnAsIDAgKSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmICggIV9fZGF0YS5ydWxlX2F2cCApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9ERUJVRyhJTkZPLCAiQVZQIE5vdCBmb3VuZDogJyVzJyIsIChfcnVsZWFycmF5KVtfX2FyXS5hdnBfdmVuZG9yX3BsdXNfbmFtZS5hdnBfbmFtZSk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFTk9FTlQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgX3JldCA9IGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfUlVMRSwgJihfX2RhdGEpLCAoX3BhcmVudCksIE5VTEwgKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggX3JldCAhPSAwICYmIF9yZXQgIT0gRUVYSVNUICkgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFX0RFQlVHKElORk8sICJFcnJvciBvbiBydWxlIHdpdGggQVZQICclcyciLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLmF2cF9uYW1lKTsgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRUlOVkFMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgQ0hFQ0tfdmVuZG9yX25ldyggX2RhdGEgKSB7IFwKKyAgICAgICAgc3RydWN0IGRpY3Rfb2JqZWN0ICogdmVuZG9yX2ZvdW5kOyBcCisgICAgICAgIGlmIChmZF9kaWN0X3NlYXJjaChmZF9nX2NvbmZpZy0+Y25mX2RpY3QsRElDVF9WRU5ET1IsVkVORE9SX0JZX0lELCZfZGF0YS52ZW5kb3JfaWQsJnZlbmRvcl9mb3VuZCxFTk9FTlQpID09IEVOT0VOVCkgeyBcCisgICAgICAgICAgICAgICAgQ0hFQ0tfRkNUKGZkX2RpY3RfbmV3KGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9WRU5ET1IsICZfZGF0YSwgTlVMTCwgTlVMTCkpOyBcCisgICAgICAgIH0gXAorfQorCisjZGVmaW5lIGVudW12YWxfZGVmX3UzMiggX3ZhbF8sIF9zdHJfICkJCVwKKyAgICB7IF9zdHJfLCAJCXsgLnUzMiA9IF92YWxfIH19CisKKyNkZWZpbmUgZW51bXZhbF9kZWZfb3MoIF9sZW5fLCBfdmFsXywgX3N0cl8gKQkJCQlcCisgICAgeyBfc3RyXywgCQl7IC5vcyA9IHsgLmRhdGEgPSAodW5zaWduZWQgY2hhciAqKV92YWxfLCAubGVuID0gX2xlbl8gfX19CisKKworc3RhdGljIGludCBkaWN0X3RzMjkzNDVfYXZwc19sb2FkX2RlZnMoY2hhciAqIGNvbmZmaWxlKQoreworICAgVFJBQ0VfRU5UUlkoIiVwIiwgY29uZmZpbGUpOworCS8qIEFwcGxpY2F0aW9uIFNlY3Rpb24gKi8KKwl7CisJCS8qIENyZWF0ZSB0aGUgdmVuZG9ycyAqLwkJeworCQkJc3RydWN0IGRpY3RfdmVuZG9yX2RhdGEgdmVuZG9yX2RhdGEgPSB7IDEwNDE1LCAiM0dQUCIgfTsKKwkJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVkVORE9SLCAmdmVuZG9yX2RhdGEsIE5VTEwsIE5VTEwpCisJCX0KKwl9CisKKworICAgLyogQVZQIHNlY3Rpb24gKi8KKyAgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogQWRkcmVzc190eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBVVEY4U3RyaW5nX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIERpYW1ldGVySWRlbnRpdHlfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogRGlhbWV0ZXJVUklfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogVGltZV90eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBJUEZpbHRlclJ1bGVfdHlwZTsKKworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJBZGRyZXNzIiwgJkFkZHJlc3NfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIlVURjhTdHJpbmciLCAmVVRGOFN0cmluZ190eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiRGlhbWV0ZXJJZGVudGl0eSIsICZEaWFtZXRlcklkZW50aXR5X3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJEaWFtZXRlclVSSSIsICZEaWFtZXRlclVSSV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiVGltZSIsICZUaW1lX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJJUEZpbHRlclJ1bGUiLCAmSVBGaWx0ZXJSdWxlX3R5cGUpOworCQkvKiBBcHAtTGF5ZXItVXNlci1JZCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM4MDEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkFwcC1MYXllci1Vc2VyLUlkIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBBc3Npc3RhbmNlLUluZm8tVmFsaWRpdHktVGltZXIgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzODAzLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJBc3Npc3RhbmNlLUluZm8tVmFsaWRpdHktVGltZXIiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIERpc2NvdmVyeS1UeXBlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzgwNCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiRGlzY292ZXJ5LVR5cGUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIEZpbHRlci1JZCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM4MDUsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkZpbHRlci1JZCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIE1BQy1BZGRyZXNzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzgwNiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTUFDLUFkZHJlc3MiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIE9wZXJhdGluZy1DaGFubmVsICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzgwOCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiT3BlcmF0aW5nLUNoYW5uZWwiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFAyUC1GZWF0dXJlcyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM4MDksCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlAyUC1GZWF0dXJlcyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogUHJvU2UtQXBwLUNvZGUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzODEwLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJQcm9TZS1BcHAtQ29kZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFByb1NlLUFwcC1JZCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM4MTEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlByb1NlLUFwcC1JZCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogUHJvU2UtQXBwLU1hc2sgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzODEyLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJQcm9TZS1BcHAtTWFzayIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFBSUi1GbGFncyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM4MTQsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlBSUi1GbGFncyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogUHJvU2UtVmFsaWRpdHktVGltZXIgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzODE1LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJQcm9TZS1WYWxpZGl0eS1UaW1lciIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogUmVxdWVzdGluZy1FUFVJRCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM4MTYsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlJlcXVlc3RpbmctRVBVSUQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFRhcmdldGVkLUVQVUlEICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzgxNywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiVGFyZ2V0ZWQtRVBVSUQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFRpbWUtV2luZG93ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzgxOCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiVGltZS1XaW5kb3ciLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFdMQU4tTGluay1MYXllci1JZCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM4MjEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIldMQU4tTGluay1MYXllci1JZCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIExvY2F0aW9uLVVwZGF0ZS1FdmVudC1UeXBlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzgyNCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTG9jYXRpb24tVXBkYXRlLUV2ZW50LVR5cGUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIExvY2F0aW9uLVVwZGF0ZS1FdmVudC1UcmlnZ2VyICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzgyNiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTG9jYXRpb24tVXBkYXRlLUV2ZW50LVRyaWdnZXIiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFJlcG9ydC1DYXJkaW5hbGl0eSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM4MjcsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlJlcG9ydC1DYXJkaW5hbGl0eSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoUmVwb3J0LUNhcmRpbmFsaXR5KSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiU0lOR0xFIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIk1VTFRJUExFIiwgeyAuaTMyPTEgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIE1pbmltdW0tSW50ZXJ2YWwtVGltZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM4MjgsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk1pbmltdW0tSW50ZXJ2YWwtVGltZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogTG9jYXRpb24tUmVwb3J0LUludGVydmFsLVRpbWUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzODMwLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJMb2NhdGlvbi1SZXBvcnQtSW50ZXJ2YWwtVGltZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogVG90YWwtTnVtYmVyLU9mLVJlcG9ydHMgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzODMxLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJUb3RhbC1OdW1iZXItT2YtUmVwb3J0cyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogVmFsaWRpdHktVGltZS1Bbm5vdW5jZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM4MzIsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlZhbGlkaXR5LVRpbWUtQW5ub3VuY2UiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFZhbGlkaXR5LVRpbWUtTW9uaXRvciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM4MzMsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlZhbGlkaXR5LVRpbWUtTW9uaXRvciIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogVmFsaWRpdHktVGltZS1Db21tdW5pY2F0aW9uICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzgzNCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiVmFsaWRpdHktVGltZS1Db21tdW5pY2F0aW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBNSUMgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzODM2LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJNSUMiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBVVEMtYmFzZWQtQ291bnRlciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM4MzcsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlVUQy1iYXNlZC1Db3VudGVyIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBQcm9TZS1NYXRjaC1SZWZyZXNoLVRpbWVyICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzgzOCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUHJvU2UtTWF0Y2gtUmVmcmVzaC1UaW1lciIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogUHJvU2UtTWV0YWRhdGEtSW5kZXgtTWFzayAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM4MzksCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlByb1NlLU1ldGFkYXRhLUluZGV4LU1hc2siLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBPUy1JRCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM4NDEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk9TLUlEIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogT1MtQXBwLUlEICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzg0MiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiT1MtQXBwLUlEIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBSZXF1ZXN0aW5nLVJQQVVJRCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM4NDMsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlJlcXVlc3RpbmctUlBBVUlEIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBUYXJnZXQtUlBBVUlEICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzg0NCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiVGFyZ2V0LVJQQVVJRCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogVGFyZ2V0LVBEVUlEICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzg0NSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiVGFyZ2V0LVBEVUlEIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogUHJvU2UtUmVzdHJpY3RlZC1Db2RlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzg0NiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUHJvU2UtUmVzdHJpY3RlZC1Db2RlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogUHJvU2UtUmVzdHJpY3RlZC1Db2RlLVN1ZmZpeC1SYW5nZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM4NDcsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlByb1NlLVJlc3RyaWN0ZWQtQ29kZS1TdWZmaXgtUmFuZ2UiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBCZWdpbm5pbmctU3VmZml4ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzg0OCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQmVnaW5uaW5nLVN1ZmZpeCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIEVuZGluZy1TdWZmaXggKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzODQ5LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJFbmRpbmctU3VmZml4IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogRGlzY292ZXJ5LUVudHJ5LUlEICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzg1MCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiRGlzY292ZXJ5LUVudHJ5LUlEIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBNYXRjaC1UaW1lc3RhbXAgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzODUxLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJNYXRjaC1UaW1lc3RhbXAiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFRpbWVfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFBNUi1GbGFncyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM4NTIsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlBNUi1GbGFncyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogUHJvU2UtQXBwbGljYXRpb24tTWV0YWRhdGEgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzODUzLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJQcm9TZS1BcHBsaWNhdGlvbi1NZXRhZGF0YSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogQmFubmVkLVJQQVVJRCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM4NTgsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkJhbm5lZC1SUEFVSUQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIEJhbm5lZC1QRFVJRCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM4NTksCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkJhbm5lZC1QRFVJRCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIERVU0sgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzODYyLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJEVVNLIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogRFVJSyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM4NjMsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkRVSUsiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBEVUNLICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzg2NCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiRFVDSyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIE1JQy1DaGVjay1JbmRpY2F0b3IgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzODY1LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJNSUMtQ2hlY2stSW5kaWNhdG9yIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBFbmNyeXB0ZWQtQml0bWFzayAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM4NjYsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkVuY3J5cHRlZC1CaXRtYXNrIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogUHJvU2UtQXBwLUNvZGUtU3VmZml4LVJhbmdlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzg2NywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUHJvU2UtQXBwLUNvZGUtU3VmZml4LVJhbmdlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogUHJvU2UtUXVlcnktQ29kZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTk5MDAsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlByb1NlLVF1ZXJ5LUNvZGUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBQcm9TZS1SZXNwb25zZS1Db2RlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJOTkwMSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUHJvU2UtUmVzcG9uc2UtQ29kZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFBlcmlvZGljLUxvY2F0aW9uLVR5cGUgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzODI5LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJQZXJpb2RpYy1Mb2NhdGlvbi1UeXBlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBDb2RlLVJlY2VpdmluZy1TZWN1cml0eS1NYXRlcmlhbCAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM4NjAsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkNvZGUtUmVjZWl2aW5nLVNlY3VyaXR5LU1hdGVyaWFsIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBDb2RlLVNlbmRpbmctU2VjdXJpdHktTWF0ZXJpYWwgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzODYxLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJDb2RlLVNlbmRpbmctU2VjdXJpdHktTWF0ZXJpYWwiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIENoYW5nZS1PZi1BcmVhLVR5cGUgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzODI1LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJDaGFuZ2UtT2YtQXJlYS1UeXBlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBXTEFOLUxpbmstTGF5ZXItSWQtTGlzdCAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM4MjIsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIldMQU4tTGluay1MYXllci1JZC1MaXN0IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBNYXRjaC1SZXF1ZXN0ICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzg1NiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTWF0Y2gtUmVxdWVzdCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogUHJvU2UtQXBwLUNvZGUtSW5mbyAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM4MzUsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlByb1NlLUFwcC1Db2RlLUluZm8iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIEFwcC1JZGVudGlmaWVyICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzg0MCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQXBwLUlkZW50aWZpZXIiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIE1hdGNoLVJlcG9ydCAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM4MDcsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk1hdGNoLVJlcG9ydCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogUHJvU2UtRGlzY292ZXJ5LUZpbHRlciAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM4MTMsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlByb1NlLURpc2NvdmVyeS1GaWx0ZXIiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIERpc2NvdmVyeS1BdXRoLVJlcXVlc3QgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzODU0LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJEaXNjb3ZlcnktQXV0aC1SZXF1ZXN0IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBNYXRjaC1SZXBvcnQtSW5mbyAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM4NTcsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk1hdGNoLVJlcG9ydC1JbmZvIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBMb2NhdGlvbi1VcGRhdGUtVHJpZ2dlciAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM4MjMsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkxvY2F0aW9uLVVwZGF0ZS1UcmlnZ2VyIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBXaUZpLVAyUC1Bc3Npc3RhbmNlLUluZm8gKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzODE5LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJXaUZpLVAyUC1Bc3Npc3RhbmNlLUluZm8iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIERpc2NvdmVyeS1BdXRoLVJlc3BvbnNlICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzg1NSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiRGlzY292ZXJ5LUF1dGgtUmVzcG9uc2UiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIFdMQU4tQXNzaXN0YW5jZS1JbmZvICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzgyMCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiV0xBTi1Bc3Npc3RhbmNlLUluZm8iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIEFzc2lzdGFuY2UtSW5mbyAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM4MDIsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkFzc2lzdGFuY2UtSW5mbyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKworCQorICAgfQorCisgICAvKiBDb21tYW5kcyBzZWN0aW9uICovCisgICB7CisKKyAgIH0KKworICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGljdF90czI5MzQ1X2F2cHNfbG9hZF9ydWxlcyhjaGFyICogY29uZmZpbGUpCit7CisgICAvKiBHcm91cGVkIEFWUCBzZWN0aW9uICovCisgICB7CisJICAvKiBQZXJpb2RpYy1Mb2NhdGlvbi1UeXBlICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQZXJpb2RpYy1Mb2NhdGlvbi1UeXBlIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJMb2NhdGlvbi1SZXBvcnQtSW50ZXJ2YWwtVGltZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVG90YWwtTnVtYmVyLU9mLVJlcG9ydHMifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBDb2RlLVJlY2VpdmluZy1TZWN1cml0eS1NYXRlcmlhbCAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ29kZS1SZWNlaXZpbmctU2VjdXJpdHktTWF0ZXJpYWwifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkRVU0sifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkRVSUsifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1JQy1DaGVjay1JbmRpY2F0b3IifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkRVQ0sifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkVuY3J5cHRlZC1CaXRtYXNrIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogQ29kZS1TZW5kaW5nLVNlY3VyaXR5LU1hdGVyaWFsICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDb2RlLVNlbmRpbmctU2VjdXJpdHktTWF0ZXJpYWwifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkRVU0sifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkRVSUsifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkRVQ0sifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkVuY3J5cHRlZC1CaXRtYXNrIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogQ2hhbmdlLU9mLUFyZWEtVHlwZSAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ2hhbmdlLU9mLUFyZWEtVHlwZSJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTG9jYXRpb24tVXBkYXRlLUV2ZW50LVRyaWdnZXIifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJlcG9ydC1DYXJkaW5hbGl0eSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTWluaW11bS1JbnRlcnZhbC1UaW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogV0xBTi1MaW5rLUxheWVyLUlkLUxpc3QgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIldMQU4tTGluay1MYXllci1JZC1MaXN0In07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJXTEFOLUxpbmstTGF5ZXItSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBNYXRjaC1SZXF1ZXN0ICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNYXRjaC1SZXF1ZXN0In07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJEaXNjb3ZlcnktVHlwZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIFByb1NlLUFwcC1Db2RlLUluZm8gKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlByb1NlLUFwcC1Db2RlLUluZm8ifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlByb1NlLUFwcC1Db2RlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNSUMifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlVUQy1iYXNlZC1Db3VudGVyIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogQXBwLUlkZW50aWZpZXIgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFwcC1JZGVudGlmaWVyIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJPUy1JRCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiT1MtQXBwLUlEIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogTWF0Y2gtUmVwb3J0ICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNYXRjaC1SZXBvcnQifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkRpc2NvdmVyeS1UeXBlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQcm9TZS1BcHAtQ29kZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUHJvU2UtTWV0YWRhdGEtSW5kZXgtTWFzayJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUHJvU2UtQXBwLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQcm9TZS1WYWxpZGl0eS1UaW1lciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUHJvU2UtTWF0Y2gtUmVmcmVzaC1UaW1lciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUHJvU2UtQXBwbGljYXRpb24tTWV0YWRhdGEifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBQcm9TZS1EaXNjb3ZlcnktRmlsdGVyICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQcm9TZS1EaXNjb3ZlcnktRmlsdGVyIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJGaWx0ZXItSWQifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlByb1NlLUFwcC1JZCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUHJvU2UtVmFsaWRpdHktVGltZXIifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlByb1NlLUFwcC1Db2RlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQcm9TZS1BcHAtTWFzayJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIERpc2NvdmVyeS1BdXRoLVJlcXVlc3QgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkRpc2NvdmVyeS1BdXRoLVJlcXVlc3QifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkRpc2NvdmVyeS1UeXBlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJVc2VyLUlkZW50aXR5In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQcm9TZS1BcHAtSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlByb1NlLUFwcC1Db2RlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQcm9TZS1BcHAtQ29kZS1TdWZmaXgtUmFuZ2UifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlByb1NlLVZhbGlkaXR5LVRpbWVyIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBcHAtSWRlbnRpZmllciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUmVxdWVzdGluZy1SUEFVSUQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlRhcmdldC1SUEFVSUQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlRhcmdldC1QRFVJRCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUHJvU2UtUmVzdHJpY3RlZC1Db2RlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQcm9TZS1RdWVyeS1Db2RlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQcm9TZS1SZXNwb25zZS1Db2RlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQcm9TZS1SZXN0cmljdGVkLUNvZGUtU3VmZml4LVJhbmdlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJCYW5uZWQtUlBBVUlEIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJCYW5uZWQtUERVSUQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNlcnZpY2UtUmVzdWx0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogTWF0Y2gtUmVwb3J0LUluZm8gKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1hdGNoLVJlcG9ydC1JbmZvIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJEaXNjb3ZlcnktVHlwZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVXNlci1JZGVudGl0eSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUHJvU2UtQXBwLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogTG9jYXRpb24tVXBkYXRlLVRyaWdnZXIgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkxvY2F0aW9uLVVwZGF0ZS1UcmlnZ2VyIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJMb2NhdGlvbi1VcGRhdGUtRXZlbnQtVHlwZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ2hhbmdlLU9mLUFyZWEtVHlwZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUGVyaW9kaWMtTG9jYXRpb24tVHlwZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIFdpRmktUDJQLUFzc2lzdGFuY2UtSW5mbyAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiV2lGaS1QMlAtQXNzaXN0YW5jZS1JbmZvIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTU0lEIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkVBUC1NYXN0ZXItU2Vzc2lvbi1LZXkifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlAyUC1GZWF0dXJlcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiV0xBTi1MaW5rLUxheWVyLUlkLUxpc3QifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIldMQU4tTGluay1MYXllci1JZC1MaXN0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJPcGVyYXRpbmctQ2hhbm5lbCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQXNzaXN0YW5jZS1JbmZvLVZhbGlkaXR5LVRpbWVyIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogRGlzY292ZXJ5LUF1dGgtUmVzcG9uc2UgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkRpc2NvdmVyeS1BdXRoLVJlc3BvbnNlIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJEaXNjb3ZlcnktVHlwZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUHJvU2UtRGlzY292ZXJ5LUZpbHRlciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVmlzaXRlZC1QTE1OLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQcm9TZS1SZXN0cmljdGVkLUNvZGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlByb1NlLVF1ZXJ5LUNvZGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlByb1NlLVJlc3BvbnNlLUNvZGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBXTEFOLUFzc2lzdGFuY2UtSW5mbyAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiV0xBTi1Bc3Npc3RhbmNlLUluZm8ifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIldpRmktUDJQLUFzc2lzdGFuY2UtSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIEFzc2lzdGFuY2UtSW5mbyAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQXNzaXN0YW5jZS1JbmZvIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJXTEFOLUFzc2lzdGFuY2UtSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKworICAgfQkKKworICAgLyogQ29tbWFuZHMgc2VjdGlvbiAqLworICAgeworCisgICB9CisKKyAgIExPR19EKCAiRXh0ZW5zaW9uICdEaWN0aW9uYXJ5IGRlZmluaXRpb25zIGZvciB0czI5MzQ1X2F2cHMgKGUxMCknIGluaXRpYWxpemVkIik7CisgICByZXR1cm4gMDsKK30KKworaW50IGRpY3RfZW50cnkoY2hhciAqIGNvbmZmaWxlKQoreworCWRpY3RfdHMyOTM0NV9hdnBzX2xvYWRfZGVmcyhjb25mZmlsZSk7CisJcmV0dXJuIGRpY3RfdHMyOTM0NV9hdnBzX2xvYWRfcnVsZXMoY29uZmZpbGUpOworfQorCitjb25zdCBjaGFyKiBkaWN0X3RzMjkzNDVfYXZwc19wcm90b192ZXIoY2hhciAqIGNvbmZmaWxlKSB7CisJcmV0dXJuIHRzMjkzNDVfYXZwc19wcm90b192ZXI7Cit9CisKK2NvbnN0IGRvdWJsZSBkaWN0X3RzMjkzNDVfYXZwc19nZW5fdHMoY2hhciAqIGNvbmZmaWxlKSB7CisJcmV0dXJuIHRzMjkzNDVfYXZwc19nZW5fZGF0ZTsKK30KKworRVhURU5TSU9OX0VOVFJZMigiZGljdF90czI5MzQ1X2F2cHMiLCBkaWN0X3RzMjkzNDVfYXZwc19sb2FkX2RlZnMsIGRpY3RfdHMyOTM0NV9hdnBzX2xvYWRfcnVsZXMsICJkaWN0X3RzMzIyOTlfYXZwcyIsICJkaWN0X3RzMjkyNzJfYXZwcyIsICJkaWN0X3RzMjkyNzNfYXZwcyIsICJkaWN0X3RzMjkzMzZfYXZwcyIsICJkaWN0X3RzMjkzNDRfYXZwcyIsICJkaWN0X3RzMjkzMjlfYXZwcyIsICJkaWN0X3RzMjkyMjlfYXZwcyIsICJkaWN0X2RyYWZ0bG9hZF9hdnBzIiwgImRpY3RfcmZjNzY4M19hdnBzIiwgImRpY3RfcmZjNDA3Ml9hdnBzIiwgImRpY3RfcmZjNzk0NF9hdnBzIik7CisKKworCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfdHMyOTM0NV9hdnBzL3RzMjkzNDVfYXZwcy5kaWQgYi9leHRlbnNpb25zL2RpY3RfdHMyOTM0NV9hdnBzL3RzMjkzNDVfYXZwcy5kaWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzEwOGIzYQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF90czI5MzQ1X2F2cHMvdHMyOTM0NV9hdnBzLmRpZApAQCAtMCwwICsxLDM3IEBACitkaWN0X3JmYzY5NDJfYXZwcworZGljdF90czI5NDY4X2F2cHMKK2RpY3RfdHMyOTM0M19hdnBzCitkaWN0X3RzMjkxMjhfYXZwcworZGljdF90czI5MzM3X2F2cHMKK2RpY3RfM2dwcDJfYXZwcworZGljdF90czI5MTU0X2F2cHMKK2RpY3RfdHMyOTIxNF9hdnBzCitkaWN0X3RzMjkyMTVfYXZwcworZGljdF90czI5MjE3X2F2cHMKK2RpY3RfdHMyOTMzOF9hdnBzCitkaWN0X3RzMjkzMzZfYXZwcworZGljdF90czI5MzY4X2F2cHMKK2RpY3RfdHMzMjI5OV9hdnBzCitkaWN0X3JmYzY3MzRfYXZwcworZGljdF9yZmM1Nzc4X2F2cHMKK2RpY3RfcmZjNTU4MF9hdnBzCitkaWN0X3RzMjkyNzNfYXZwcworZGljdF9yZmM1Nzc3X2F2cHMKK2RpY3RfcmZjNDAwNmJpc19hdnBzCitkaWN0X3RzMjkyMTJfYXZwcworZGljdF90czI5MDYxX2F2cHMKK2RpY3RfcmZjNTQ0N19hdnBzCitkaWN0X3RzMjkyNzJfYXZwcworZGljdF9ldHNpMjgzMDM0X2F2cHMKK2RpY3RfcmZjNDU5MF9hdnBzCitkaWN0X3RzMjkyMjlfYXZwcworZGljdF9kcmFmdGxvYWRfYXZwcworZGljdF90czI5MzI5X2F2cHMKK2RpY3RfdHMyOTE3M19hdnBzCitkaWN0X3JmYzc2ODNfYXZwcworZGljdF9yZmM3OTQ0X2F2cHMKK2RpY3RfdHMyOTM0NF9hdnBzCitkaWN0X3JmYzQwMDRfYXZwcworZGljdF9yZmM3MTU1X2F2cHMKK2RpY3RfcmZjNDA3Ml9hdnBzCitkaWN0X3RzMjkzNDVfYXZwcwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X3RzMjkzNjhfYXZwcy9DTWFrZUxpc3RzLnR4dCBiL2V4dGVuc2lvbnMvZGljdF90czI5MzY4X2F2cHMvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdmNzE2OQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF90czI5MzY4X2F2cHMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxNiBAQAorIyBUaGUgZGljdF90czI5MzY4X2F2cHMgZXh0ZW5zaW9uCitQUk9KRUNUKCJkaWN0X3RzMjkzNjhfYXZwcyBsaWJyYXJ5IGdlbmVyYXRlZCBieSBGZEdlbiAiIEMpCisKKyMgQ29tcGlsZSBhcyBhIG1vZHVsZQorRkRfQUREX0VYVEVOU0lPTihkaWN0X3RzMjkzNjhfYXZwcyBkaWN0X3RzMjkzNjhfYXZwcy5jKQorCisKKyMjIyMKKyMjIElOU1RBTEwgc2VjdGlvbiAjIworCitJTlNUQUxMKFRBUkdFVFMgZGljdF90czI5MzY4X2F2cHMKKwlMSUJSQVJZIERFU1RJTkFUSU9OICR7SU5TVEFMTF9FWFRFTlNJT05TX1NVRkZJWH0KK0NPTVBPTkVOVCBmcmVlRGlhbWV0ZXItZGljdGlvbmFyeS1UUzI5MzY4X0FWUFMpCisKKworCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfdHMyOTM2OF9hdnBzL2RpY3RfdHMyOTM2OF9hdnBzLmMgYi9leHRlbnNpb25zL2RpY3RfdHMyOTM2OF9hdnBzL2RpY3RfdHMyOTM2OF9hdnBzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNlZDMzMQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF90czI5MzY4X2F2cHMvZGljdF90czI5MzY4X2F2cHMuYwpAQCAtMCwwICsxLDQ0NiBAQAorLyoKKyogQ29weXJpZ2h0IChjKSAyMDE3IFNwcmludAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvKioqKioqKioqKioqKioqKgorIEdlbmVyYXRlZCBCeTogZmR0b29sIGVuaGFuY2VtZW50cyB0byBkaWFmdXp6ZXIKKyBMaWNlbnNlOiBzYW1lIGFzIGZyZWVEaWFtZXRlcgorKioqKioqKioqKioqKioqKi8KKworCisvKiAKKyAqIERpY3Rpb25hcnkgZGVmaW5pdGlvbnMgb2Ygb2JqZWN0cyBzcGVjaWZpZWQgaW4gdHMyOTM2OF9hdnBzIChlMTApLgorICovCisjaW5jbHVkZSA8ZnJlZURpYW1ldGVyL2V4dGVuc2lvbi5oPgorCisjZGVmaW5lIFBST1RPX1ZFUiAiZTEwIgorI2RlZmluZSBHRU5fREFURSAgMTUwNjY5NzE0Ni44MworCitjb25zdCBjaGFyICp0czI5MzY4X2F2cHNfcHJvdG9fdmVyID0gUFJPVE9fVkVSOworY29uc3QgZG91YmxlIHRzMjkzNjhfYXZwc19nZW5fZGF0ZSA9IEdFTl9EQVRFOworCisvKiBUaGUgY29udGVudCBvZiB0aGlzIGZpbGUgZm9sbG93cyB0aGUgc2FtZSBzdHJ1Y3R1cmUgYXMgZGljdF9iYXNlX3Byb3RvLmMgKi8KKworI2RlZmluZSBDSEVDS19kaWN0X25ldyggX3R5cGUsIF9kYXRhLCBfcGFyZW50LCBfcmVmICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBfcmV0ID0gZmRfZGljdF9uZXcoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgKF90eXBlKSwgKF9kYXRhKSwgKF9wYXJlbnQpLCAoX3JlZikgKTsgXAorICAgIGlmICggX3JldCAhPSAwICYmIF9yZXQgIT0gRUVYSVNUICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHJldHVybiBfcmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIENIRUNLX2RpY3Rfc2VhcmNoKCBfdHlwZSwgX2NyaXRlcmlhLCBfd2hhdCwgX3Jlc3VsdCApCQlcCisgICAgQ0hFQ0tfRkNUKCAgZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgKF90eXBlKSwgKF9jcml0ZXJpYSksIChfd2hhdCksIChfcmVzdWx0KSwgRU5PRU5UKSApOworCitzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiB7CisgICAgc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWU7CisgICAgZW51bSBydWxlX3Bvc2l0aW9uCXBvc2l0aW9uOworICAgIGludCAJCQltaW47CisgICAgaW50CQkJbWF4OworfTsKKworI2RlZmluZSBSVUxFX09SREVSKCBfcG9zaXRpb24gKSAoKCgoX3Bvc2l0aW9uKSA9PSBSVUxFX0ZJWEVEX0hFQUQpIHx8ICgoX3Bvc2l0aW9uKSA9PSBSVUxFX0ZJWEVEX1RBSUwpKSA/IDEgOiAwICkKKworLyogQXR0ZW50aW9uISBUaGlzIHZlcnNpb24gb2YgdGhlIG1hY3JvIHVzZXMgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgaW4gY29udHJhc3QgdG8gbW9zdCBvdGhlciBjb3BpZXMhICovCisjZGVmaW5lIFBBUlNFX2xvY19ydWxlcyggX3J1bGVhcnJheSwgX3BhcmVudCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IF9fYXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKF9fYXI9MDsgX19hciA8IHNpemVvZihfcnVsZWFycmF5KSAvIHNpemVvZigoX3J1bGVhcnJheSlbMF0pOyBfX2FyKyspIHsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgc3RydWN0IGRpY3RfcnVsZV9kYXRhIF9fZGF0YSA9IHsgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5wb3NpdGlvbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ubWluLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChfcnVsZWFycmF5KVtfX2FyXS5tYXh9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIF9fZGF0YS5ydWxlX29yZGVyID0gUlVMRV9PUkRFUihfX2RhdGEucnVsZV9wb3NpdGlvbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgQ0hFQ0tfRkNUKCAgZmRfZGljdF9zZWFyY2goICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgRElDVF9BVlAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICYoX3J1bGVhcnJheSlbX19hcl0uYXZwX3ZlbmRvcl9wbHVzX25hbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgJl9fZGF0YS5ydWxlX2F2cCwgMCApICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYgKCAhX19kYXRhLnJ1bGVfYXZwICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFX0RFQlVHKElORk8sICJBVlAgTm90IGZvdW5kOiAnJXMnIiwgKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLmF2cF9uYW1lKTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVOT0VOVDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBfcmV0ID0gZmRfZGljdF9uZXcoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9SVUxFLCAmKF9fZGF0YSksIChfcGFyZW50KSwgTlVMTCApOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBfcmV0ICE9IDAgJiYgX3JldCAhPSBFRVhJU1QgKSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfREVCVUcoSU5GTywgIkVycm9yIG9uIHJ1bGUgd2l0aCBBVlAgJyVzJyIsICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0uYXZwX3ZlbmRvcl9wbHVzX25hbWUuYXZwX25hbWUpOyAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFSU5WQUw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBDSEVDS192ZW5kb3JfbmV3KCBfZGF0YSApIHsgXAorICAgICAgICBzdHJ1Y3QgZGljdF9vYmplY3QgKiB2ZW5kb3JfZm91bmQ7IFwKKyAgICAgICAgaWYgKGZkX2RpY3Rfc2VhcmNoKGZkX2dfY29uZmlnLT5jbmZfZGljdCxESUNUX1ZFTkRPUixWRU5ET1JfQllfSUQsJl9kYXRhLnZlbmRvcl9pZCwmdmVuZG9yX2ZvdW5kLEVOT0VOVCkgPT0gRU5PRU5UKSB7IFwKKyAgICAgICAgICAgICAgICBDSEVDS19GQ1QoZmRfZGljdF9uZXcoZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1ZFTkRPUiwgJl9kYXRhLCBOVUxMLCBOVUxMKSk7IFwKKyAgICAgICAgfSBcCit9CisKKyNkZWZpbmUgZW51bXZhbF9kZWZfdTMyKCBfdmFsXywgX3N0cl8gKQkJXAorICAgIHsgX3N0cl8sIAkJeyAudTMyID0gX3ZhbF8gfX0KKworI2RlZmluZSBlbnVtdmFsX2RlZl9vcyggX2xlbl8sIF92YWxfLCBfc3RyXyApCQkJCVwKKyAgICB7IF9zdHJfLCAJCXsgLm9zID0geyAuZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopX3ZhbF8sIC5sZW4gPSBfbGVuXyB9fX0KKworCitzdGF0aWMgaW50IGRpY3RfdHMyOTM2OF9hdnBzX2xvYWRfZGVmcyhjaGFyICogY29uZmZpbGUpCit7CisgICBUUkFDRV9FTlRSWSgiJXAiLCBjb25mZmlsZSk7CisJLyogQXBwbGljYXRpb24gU2VjdGlvbiAqLworCXsKKwkJLyogQ3JlYXRlIHRoZSB2ZW5kb3JzICovCQl7CisJCQlzdHJ1Y3QgZGljdF92ZW5kb3JfZGF0YSB2ZW5kb3JfZGF0YSA9IHsgMTA0MTUsICIzR1BQIiB9OworCQkJQ0hFQ0tfZGljdF9uZXcoRElDVF9WRU5ET1IsICZ2ZW5kb3JfZGF0YSwgTlVMTCwgTlVMTCkKKwkJfQorCX0KKworCisgICAvKiBBVlAgc2VjdGlvbiAqLworICAgeworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBBZGRyZXNzX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIFVURjhTdHJpbmdfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogRGlhbWV0ZXJJZGVudGl0eV90eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBEaWFtZXRlclVSSV90eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBUaW1lX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIElQRmlsdGVyUnVsZV90eXBlOworCisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkFkZHJlc3MiLCAmQWRkcmVzc190eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiVVRGOFN0cmluZyIsICZVVEY4U3RyaW5nX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJEaWFtZXRlcklkZW50aXR5IiwgJkRpYW1ldGVySWRlbnRpdHlfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkRpYW1ldGVyVVJJIiwgJkRpYW1ldGVyVVJJX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJUaW1lIiwgJlRpbWVfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIklQRmlsdGVyUnVsZSIsICZJUEZpbHRlclJ1bGVfdHlwZSk7CisJCS8qIFBheWxvYWQgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzMDA0LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJQYXlsb2FkIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogQWN0aW9uLVR5cGUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzMDA1LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJBY3Rpb24tVHlwZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoQWN0aW9uLVR5cGUpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJOb25fUHJpb3JpdHkiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiUHJpb3JpdHkiLCB7IC5pMzI9MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAiUmVwb3J0IiwgeyAuaTMyPTIgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNCA9IHsgIlJlY2FsbCIsIHsgLmkzMj0zIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzUgPSB7ICJSZXBsYWNlIiwgeyAuaTMyPTQgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNiA9IHsgIkRlbGl2ZXJ5IiwgeyAuaTMyPTUgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF80LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzUsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogUHJpb3JpdHktSW5kaWNhdGlvbiAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTMwMDYsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlByaW9yaXR5LUluZGljYXRpb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFByaW9yaXR5LUluZGljYXRpb24pIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJOb24tUHJpb3JpdHkiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiUHJpb3JpdHkiLCB7IC5pMzI9MSB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogUmVmZXJlbmNlLU51bWJlciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTMwMDcsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlJlZmVyZW5jZS1OdW1iZXIiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFJlcXVlc3QtU3RhdHVzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzAwOCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUmVxdWVzdC1TdGF0dXMiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFJlcXVlc3QtU3RhdHVzKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiU1VDQ0VTUyIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJJTlZQQVlMT0FEIiwgeyAuaTMyPTEwMSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAiSU5WRVhUSUQiLCB7IC5pMzI9MTAyIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzQgPSB7ICJJTlZTQ1NJRCIsIHsgLmkzMj0xMDMgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNSA9IHsgIklOVlBFUklPRCIsIHsgLmkzMj0xMDQgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNiA9IHsgIk5PVEFVVEhPUklaRUQiLCB7IC5pMzI9MTA1IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzcgPSB7ICJTRVJWSUNFVU5BVkFJTEFCTEUiLCB7IC5pMzI9MTA2IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzggPSB7ICJQRVJNQU5FTlRFUlJPUiIsIHsgLmkzMj0xMDcgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfOSA9IHsgIlFVT1RBRVhDRUVERUQiLCB7IC5pMzI9MTA4IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEwID0geyAiUkFURUVYQ0VFREVEIiwgeyAuaTMyPTEwOSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xMSA9IHsgIlJFUExBQ0VGQUlMIiwgeyAuaTMyPTExMCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xMiA9IHsgIlJFQ0FMTEZBSUwiLCB7IC5pMzI9MTExIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEzID0geyAiT1JJR0lOQUxNRVNTQUdFU0VOVCIsIHsgLmkzMj0xMTIgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTQgPSB7ICJURU1QT1JBUllFUlJPUiIsIHsgLmkzMj0yMDEgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF80LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzUsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF83LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzgsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfOSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xNCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogRGVsaXZlcnktT3V0Y29tZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTMwMDksCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkRlbGl2ZXJ5LU91dGNvbWUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKERlbGl2ZXJ5LU91dGNvbWUpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJTVUNDRVNTIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIkVYUElSRUQiLCB7IC5pMzI9MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAiVEVNUE9SQVJZRVJST1IiLCB7IC5pMzI9MiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF80ID0geyAiVU5ERUxJVkVSQUJMRSIsIHsgLmkzMj0zIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzUgPSB7ICJVTkNPTkZJUk1FRCIsIHsgLmkzMj00IH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF81LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBBcHBsaWNhdGlvbi1Qb3J0LUlkZW50aWZpZXIgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzMDEwLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJBcHBsaWNhdGlvbi1Qb3J0LUlkZW50aWZpZXIiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIE9sZC1SZWZlcmVuY2UtTnVtYmVyICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzAxMSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiT2xkLVJlZmVyZW5jZS1OdW1iZXIiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIEZlYXR1cmUtU3VwcG9ydGVkLUluLUZpbmFsLVRhcmdldCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTMwMTIsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkZlYXR1cmUtU3VwcG9ydGVkLUluLUZpbmFsLVRhcmdldCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogVHJpZ2dlci1EYXRhICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzAwMywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiVHJpZ2dlci1EYXRhIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBEZXZpY2UtTm90aWZpY2F0aW9uICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzAwMiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiRGV2aWNlLU5vdGlmaWNhdGlvbiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogRGV2aWNlLUFjdGlvbiAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTMwMDEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkRldmljZS1BY3Rpb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisKKwkKKyAgIH0KKworICAgLyogQ29tbWFuZHMgc2VjdGlvbiAqLworICAgeworCisgICB9CisKKyAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRpY3RfdHMyOTM2OF9hdnBzX2xvYWRfcnVsZXMoY2hhciAqIGNvbmZmaWxlKQoreworICAgLyogR3JvdXBlZCBBVlAgc2VjdGlvbiAqLworICAgeworCSAgLyogVHJpZ2dlci1EYXRhICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUcmlnZ2VyLURhdGEifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlBheWxvYWQifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlByaW9yaXR5LUluZGljYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFwcGxpY2F0aW9uLVBvcnQtSWRlbnRpZmllciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIERldmljZS1Ob3RpZmljYXRpb24gKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkRldmljZS1Ob3RpZmljYXRpb24ifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkV4dGVybmFsLUlkZW50aWZpZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1TSVNETiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU0NTLUlkZW50aXR5In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJSZWZlcmVuY2UtTnVtYmVyIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBY3Rpb24tVHlwZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUmVxdWVzdC1TdGF0dXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1UQy1FcnJvci1EaWFnbm9zdGljIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJEZWxpdmVyeS1PdXRjb21lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTTS1SUC1VSSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQXBwbGljYXRpb24tUG9ydC1JZGVudGlmaWVyIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogRGV2aWNlLUFjdGlvbiAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRGV2aWNlLUFjdGlvbiJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRXh0ZXJuYWwtSWRlbnRpZmllciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTVNJU0ROIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTQ1MtSWRlbnRpdHkifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJlZmVyZW5jZS1OdW1iZXIifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk9sZC1SZWZlcmVuY2UtTnVtYmVyIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBY3Rpb24tVHlwZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVHJpZ2dlci1EYXRhIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlZhbGlkaXR5LVRpbWUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisKKyAgIH0JCisKKyAgIC8qIENvbW1hbmRzIHNlY3Rpb24gKi8KKyAgIHsKKworICAgfQorCisgICBMT0dfRCggIkV4dGVuc2lvbiAnRGljdGlvbmFyeSBkZWZpbml0aW9ucyBmb3IgdHMyOTM2OF9hdnBzIChlMTApJyBpbml0aWFsaXplZCIpOworICAgcmV0dXJuIDA7Cit9CisKK2ludCBkaWN0X2VudHJ5KGNoYXIgKiBjb25mZmlsZSkKK3sKKwlkaWN0X3RzMjkzNjhfYXZwc19sb2FkX2RlZnMoY29uZmZpbGUpOworCXJldHVybiBkaWN0X3RzMjkzNjhfYXZwc19sb2FkX3J1bGVzKGNvbmZmaWxlKTsKK30KKworY29uc3QgY2hhciogZGljdF90czI5MzY4X2F2cHNfcHJvdG9fdmVyKGNoYXIgKiBjb25mZmlsZSkgeworCXJldHVybiB0czI5MzY4X2F2cHNfcHJvdG9fdmVyOworfQorCitjb25zdCBkb3VibGUgZGljdF90czI5MzY4X2F2cHNfZ2VuX3RzKGNoYXIgKiBjb25mZmlsZSkgeworCXJldHVybiB0czI5MzY4X2F2cHNfZ2VuX2RhdGU7Cit9CisKK0VYVEVOU0lPTl9FTlRSWTIoImRpY3RfdHMyOTM2OF9hdnBzIiwgZGljdF90czI5MzY4X2F2cHNfbG9hZF9kZWZzLCBkaWN0X3RzMjkzNjhfYXZwc19sb2FkX3J1bGVzLCAiZGljdF90czI5MzM3X2F2cHMiLCAiZGljdF90czI5MzM2X2F2cHMiLCAiZGljdF90czI5MzM4X2F2cHMiLCAiZGljdF90czI5MzI5X2F2cHMiLCAiZGljdF90czI5MjI5X2F2cHMiLCAiZGljdF9kcmFmdGxvYWRfYXZwcyIsICJkaWN0X3JmYzQwMDZiaXNfYXZwcyIpOworCisKKwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X3RzMjkzNjhfYXZwcy90czI5MzY4X2F2cHMuZGlkIGIvZXh0ZW5zaW9ucy9kaWN0X3RzMjkzNjhfYXZwcy90czI5MzY4X2F2cHMuZGlkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmODc3ODcKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfdHMyOTM2OF9hdnBzL3RzMjkzNjhfYXZwcy5kaWQKQEAgLTAsMCArMSwzNyBAQAorZGljdF9yZmM2OTQyX2F2cHMKK2RpY3RfdHMyOTQ2OF9hdnBzCitkaWN0X3RzMjkxNTRfYXZwcworZGljdF90czI5MjE0X2F2cHMKK2RpY3RfdHMyOTIxNV9hdnBzCitkaWN0X3RzMjkyMTdfYXZwcworZGljdF8zZ3BwMl9hdnBzCitkaWN0X3RzMjkzMzdfYXZwcworZGljdF90czI5MzQzX2F2cHMKK2RpY3RfdHMyOTMzOF9hdnBzCitkaWN0X3RzMjkxMjhfYXZwcworZGljdF90czI5MzQ0X2F2cHMKK2RpY3RfdHMyOTM0NV9hdnBzCitkaWN0X3RzMjkxNzNfYXZwcworZGljdF90czMyMjk5X2F2cHMKK2RpY3RfcmZjNjczNF9hdnBzCitkaWN0X3JmYzU1ODBfYXZwcworZGljdF9yZmM0MDcyX2F2cHMKK2RpY3RfdHMyOTI3M19hdnBzCitkaWN0X3JmYzQwMDZiaXNfYXZwcworZGljdF90czI5MjEyX2F2cHMKK2RpY3RfdHMyOTA2MV9hdnBzCitkaWN0X3RzMjkyNzJfYXZwcworZGljdF9yZmM1NDQ3X2F2cHMKK2RpY3RfcmZjNTc3OF9hdnBzCitkaWN0X3JmYzU3NzdfYXZwcworZGljdF90czI5MzM2X2F2cHMKK2RpY3RfZXRzaTI4MzAzNF9hdnBzCitkaWN0X3JmYzQ1OTBfYXZwcworZGljdF9yZmM0MDA0X2F2cHMKK2RpY3RfcmZjNzE1NV9hdnBzCitkaWN0X3RzMjkyMjlfYXZwcworZGljdF9yZmM3NjgzX2F2cHMKK2RpY3RfZHJhZnRsb2FkX2F2cHMKK2RpY3RfcmZjNzk0NF9hdnBzCitkaWN0X3RzMjkzMjlfYXZwcworZGljdF90czI5MzY4X2F2cHMKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZGljdF90czI5NDY4X2F2cHMvQ01ha2VMaXN0cy50eHQgYi9leHRlbnNpb25zL2RpY3RfdHMyOTQ2OF9hdnBzL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNTQ5MTYKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfdHMyOTQ2OF9hdnBzL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTYgQEAKKyMgVGhlIGRpY3RfdHMyOTQ2OF9hdnBzIGV4dGVuc2lvbgorUFJPSkVDVCgiZGljdF90czI5NDY4X2F2cHMgbGlicmFyeSBnZW5lcmF0ZWQgYnkgRmRHZW4gIiBDKQorCisjIENvbXBpbGUgYXMgYSBtb2R1bGUKK0ZEX0FERF9FWFRFTlNJT04oZGljdF90czI5NDY4X2F2cHMgZGljdF90czI5NDY4X2F2cHMuYykKKworCisjIyMjCisjIyBJTlNUQUxMIHNlY3Rpb24gIyMKKworSU5TVEFMTChUQVJHRVRTIGRpY3RfdHMyOTQ2OF9hdnBzCisJTElCUkFSWSBERVNUSU5BVElPTiAke0lOU1RBTExfRVhURU5TSU9OU19TVUZGSVh9CitDT01QT05FTlQgZnJlZURpYW1ldGVyLWRpY3Rpb25hcnktVFMyOTQ2OF9BVlBTKQorCisKKwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X3RzMjk0NjhfYXZwcy9kaWN0X3RzMjk0NjhfYXZwcy5jIGIvZXh0ZW5zaW9ucy9kaWN0X3RzMjk0NjhfYXZwcy9kaWN0X3RzMjk0NjhfYXZwcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZmQyYmIKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2RpY3RfdHMyOTQ2OF9hdnBzL2RpY3RfdHMyOTQ2OF9hdnBzLmMKQEAgLTAsMCArMSw2MzkgQEAKKy8qCisqIENvcHlyaWdodCAoYykgMjAxNyBTcHJpbnQKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLyoqKioqKioqKioqKioqKioKKyBHZW5lcmF0ZWQgQnk6IGZkdG9vbCBlbmhhbmNlbWVudHMgdG8gZGlhZnV6emVyCisgTGljZW5zZTogc2FtZSBhcyBmcmVlRGlhbWV0ZXIKKyoqKioqKioqKioqKioqKiovCisKKworLyogCisgKiBEaWN0aW9uYXJ5IGRlZmluaXRpb25zIG9mIG9iamVjdHMgc3BlY2lmaWVkIGluIHRzMjk0NjhfYXZwcyAoZTEwKS4KKyAqLworI2luY2x1ZGUgPGZyZWVEaWFtZXRlci9leHRlbnNpb24uaD4KKworI2RlZmluZSBQUk9UT19WRVIgImUxMCIKKyNkZWZpbmUgR0VOX0RBVEUgIDE1MDY2OTcxNjguNzMKKworY29uc3QgY2hhciAqdHMyOTQ2OF9hdnBzX3Byb3RvX3ZlciA9IFBST1RPX1ZFUjsKK2NvbnN0IGRvdWJsZSB0czI5NDY4X2F2cHNfZ2VuX2RhdGUgPSBHRU5fREFURTsKKworLyogVGhlIGNvbnRlbnQgb2YgdGhpcyBmaWxlIGZvbGxvd3MgdGhlIHNhbWUgc3RydWN0dXJlIGFzIGRpY3RfYmFzZV9wcm90by5jICovCisKKyNkZWZpbmUgQ0hFQ0tfZGljdF9uZXcoIF90eXBlLCBfZGF0YSwgX3BhcmVudCwgX3JlZiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgX3JldCA9IGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIChfdHlwZSksIChfZGF0YSksIChfcGFyZW50KSwgKF9yZWYpICk7IFwKKyAgICBpZiAoIF9yZXQgIT0gMCAmJiBfcmV0ICE9IEVFWElTVCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICByZXR1cm4gX3JldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBDSEVDS19kaWN0X3NlYXJjaCggX3R5cGUsIF9jcml0ZXJpYSwgX3doYXQsIF9yZXN1bHQgKQkJXAorICAgIENIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIChfdHlwZSksIChfY3JpdGVyaWEpLCAoX3doYXQpLCAoX3Jlc3VsdCksIEVOT0VOVCkgKTsKKworc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24geworICAgIHN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lOworICAgIGVudW0gcnVsZV9wb3NpdGlvbglwb3NpdGlvbjsKKyAgICBpbnQgCQkJbWluOworICAgIGludAkJCW1heDsKK307CisKKyNkZWZpbmUgUlVMRV9PUkRFUiggX3Bvc2l0aW9uICkgKCgoKF9wb3NpdGlvbikgPT0gUlVMRV9GSVhFRF9IRUFEKSB8fCAoKF9wb3NpdGlvbikgPT0gUlVMRV9GSVhFRF9UQUlMKSkgPyAxIDogMCApCisKKy8qIEF0dGVudGlvbiEgVGhpcyB2ZXJzaW9uIG9mIHRoZSBtYWNybyB1c2VzIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsIGluIGNvbnRyYXN0IHRvIG1vc3Qgb3RoZXIgY29waWVzISAqLworI2RlZmluZSBQQVJTRV9sb2NfcnVsZXMoIF9ydWxlYXJyYXksIF9wYXJlbnQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBfX2FyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yIChfX2FyPTA7IF9fYXIgPCBzaXplb2YoX3J1bGVhcnJheSkgLyBzaXplb2YoKF9ydWxlYXJyYXkpWzBdKTsgX19hcisrKSB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHN0cnVjdCBkaWN0X3J1bGVfZGF0YSBfX2RhdGEgPSB7IE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ucG9zaXRpb24sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLm1pbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ubWF4fTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfX2RhdGEucnVsZV9vcmRlciA9IFJVTEVfT1JERVIoX19kYXRhLnJ1bGVfcG9zaXRpb24pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIENIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIERJQ1RfQVZQLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAmKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICZfX2RhdGEucnVsZV9hdnAsIDAgKSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmICggIV9fZGF0YS5ydWxlX2F2cCApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9ERUJVRyhJTkZPLCAiQVZQIE5vdCBmb3VuZDogJyVzJyIsIChfcnVsZWFycmF5KVtfX2FyXS5hdnBfdmVuZG9yX3BsdXNfbmFtZS5hdnBfbmFtZSk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFTk9FTlQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgX3JldCA9IGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfUlVMRSwgJihfX2RhdGEpLCAoX3BhcmVudCksIE5VTEwgKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggX3JldCAhPSAwICYmIF9yZXQgIT0gRUVYSVNUICkgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFX0RFQlVHKElORk8sICJFcnJvciBvbiBydWxlIHdpdGggQVZQICclcyciLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLmF2cF9uYW1lKTsgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRUlOVkFMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgQ0hFQ0tfdmVuZG9yX25ldyggX2RhdGEgKSB7IFwKKyAgICAgICAgc3RydWN0IGRpY3Rfb2JqZWN0ICogdmVuZG9yX2ZvdW5kOyBcCisgICAgICAgIGlmIChmZF9kaWN0X3NlYXJjaChmZF9nX2NvbmZpZy0+Y25mX2RpY3QsRElDVF9WRU5ET1IsVkVORE9SX0JZX0lELCZfZGF0YS52ZW5kb3JfaWQsJnZlbmRvcl9mb3VuZCxFTk9FTlQpID09IEVOT0VOVCkgeyBcCisgICAgICAgICAgICAgICAgQ0hFQ0tfRkNUKGZkX2RpY3RfbmV3KGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9WRU5ET1IsICZfZGF0YSwgTlVMTCwgTlVMTCkpOyBcCisgICAgICAgIH0gXAorfQorCisjZGVmaW5lIGVudW12YWxfZGVmX3UzMiggX3ZhbF8sIF9zdHJfICkJCVwKKyAgICB7IF9zdHJfLCAJCXsgLnUzMiA9IF92YWxfIH19CisKKyNkZWZpbmUgZW51bXZhbF9kZWZfb3MoIF9sZW5fLCBfdmFsXywgX3N0cl8gKQkJCQlcCisgICAgeyBfc3RyXywgCQl7IC5vcyA9IHsgLmRhdGEgPSAodW5zaWduZWQgY2hhciAqKV92YWxfLCAubGVuID0gX2xlbl8gfX19CisKKworc3RhdGljIGludCBkaWN0X3RzMjk0NjhfYXZwc19sb2FkX2RlZnMoY2hhciAqIGNvbmZmaWxlKQoreworICAgVFJBQ0VfRU5UUlkoIiVwIiwgY29uZmZpbGUpOworCS8qIEFwcGxpY2F0aW9uIFNlY3Rpb24gKi8KKwl7CisJCS8qIENyZWF0ZSB0aGUgdmVuZG9ycyAqLwkJeworCQkJc3RydWN0IGRpY3RfdmVuZG9yX2RhdGEgdmVuZG9yX2RhdGEgPSB7IDEwNDE1LCAiM0dQUCIgfTsKKwkJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVkVORE9SLCAmdmVuZG9yX2RhdGEsIE5VTEwsIE5VTEwpCisJCX0KKwl9CisKKworICAgLyogQVZQIHNlY3Rpb24gKi8KKyAgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogQWRkcmVzc190eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBVVEY4U3RyaW5nX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIERpYW1ldGVySWRlbnRpdHlfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogRGlhbWV0ZXJVUklfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogVGltZV90eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBJUEZpbHRlclJ1bGVfdHlwZTsKKworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJBZGRyZXNzIiwgJkFkZHJlc3NfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIlVURjhTdHJpbmciLCAmVVRGOFN0cmluZ190eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiRGlhbWV0ZXJJZGVudGl0eSIsICZEaWFtZXRlcklkZW50aXR5X3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJEaWFtZXRlclVSSSIsICZEaWFtZXRlclVSSV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiVGltZSIsICZUaW1lX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJJUEZpbHRlclJ1bGUiLCAmSVBGaWx0ZXJSdWxlX3R5cGUpOworCQkvKiBCTVNDLUFkZHJlc3MgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzNTAwLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJCTVNDLUFkZHJlc3MiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIEFkZHJlc3NfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIEJNU0MtUG9ydCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM1MDEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkJNU0MtUG9ydCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogQ29tbW9uLVR1bm5lbC1FbmRwb2ludC1JZGVudGlmaWVyICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzUyNCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQ29tbW9uLVR1bm5lbC1FbmRwb2ludC1JZGVudGlmaWVyIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogTUIyVS1TZWN1cml0eSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM1MTcsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk1CMlUtU2VjdXJpdHkiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIE1CTVMtQmVhcmVyLUV2ZW50ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzUwMiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTUJNUy1CZWFyZXItRXZlbnQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIE1CTVMtQmVhcmVyLVJlc3VsdCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM1MDYsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk1CTVMtQmVhcmVyLVJlc3VsdCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogTUJNUy1lTkItSVAtTXVsdGljYXN0LUFkZHJlc3MgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzNTIwLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJNQk1TLWVOQi1JUC1NdWx0aWNhc3QtQWRkcmVzcyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgQWRkcmVzc190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogTUJNUy1lTkItSVB2Ni1NdWx0aWNhc3QtQWRkcmVzcyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM1MjEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk1CTVMtZU5CLUlQdjYtTXVsdGljYXN0LUFkZHJlc3MiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIEFkZHJlc3NfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIE1CTVMtR1ctU1NNLUlQLUFkZHJlc3MgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzNTIyLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJNQk1TLUdXLVNTTS1JUC1BZGRyZXNzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBBZGRyZXNzX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBNQk1TLUdXLVNTTS1JUHY2LUFkZHJlc3MgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzNTIzLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJNQk1TLUdXLVNTTS1JUHY2LUFkZHJlc3MiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIEFkZHJlc3NfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIE1CTVMtU3RhcnQtVGltZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM1MDcsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk1CTVMtU3RhcnQtVGltZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVGltZV90eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogUmFkaW8tRnJlcXVlbmN5ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzUwOCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUmFkaW8tRnJlcXVlbmN5IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBUTUdJLUFsbG9jYXRpb24tUmVzdWx0ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzUxMSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiVE1HSS1BbGxvY2F0aW9uLVJlc3VsdCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogVE1HSS1EZWFsbG9jYXRpb24tUmVzdWx0ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzUxNCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiVE1HSS1EZWFsbG9jYXRpb24tUmVzdWx0IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBUTUdJLU51bWJlciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM1MTYsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlRNR0ktTnVtYmVyIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBUTUdJLUV4cGlyeSAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM1MTUsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlRNR0ktRXhwaXJ5IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBMb2NhbC1NQjItVS1JbmZvcm1hdGlvbiAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM1MTksCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkxvY2FsLU1CMi1VLUluZm9ybWF0aW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBNQk1TLUJlYXJlci1FdmVudC1Ob3RpZmljYXRpb24gKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzNTAzLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJNQk1TLUJlYXJlci1FdmVudC1Ob3RpZmljYXRpb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIE1CTVMtQmVhcmVyLVJlc3BvbnNlICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzUwNSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTUJNUy1CZWFyZXItUmVzcG9uc2UiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIFRNR0ktRGVhbGxvY2F0aW9uLVJlc3BvbnNlICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzUxMywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiVE1HSS1EZWFsbG9jYXRpb24tUmVzcG9uc2UiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIFRNR0ktQWxsb2NhdGlvbi1SZXF1ZXN0ICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzUwOSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiVE1HSS1BbGxvY2F0aW9uLVJlcXVlc3QiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIFRNR0ktRGVhbGxvY2F0aW9uLVJlcXVlc3QgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzNTEyLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJUTUdJLURlYWxsb2NhdGlvbi1SZXF1ZXN0IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBMb2NhbC1NMS1JbmZvcm1hdGlvbiAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM1MTgsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkxvY2FsLU0xLUluZm9ybWF0aW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBUTUdJLUFsbG9jYXRpb24tUmVzcG9uc2UgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzNTEwLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJUTUdJLUFsbG9jYXRpb24tUmVzcG9uc2UiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIE1CTVMtQmVhcmVyLVJlcXVlc3QgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzNTA0LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJNQk1TLUJlYXJlci1SZXF1ZXN0IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCisJCisgICB9CisKKyAgIC8qIENvbW1hbmRzIHNlY3Rpb24gKi8KKyAgIHsKKworICAgfQorCisgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkaWN0X3RzMjk0NjhfYXZwc19sb2FkX3J1bGVzKGNoYXIgKiBjb25mZmlsZSkKK3sKKyAgIC8qIEdyb3VwZWQgQVZQIHNlY3Rpb24gKi8KKyAgIHsKKwkgIC8qIFRNR0ktRXhwaXJ5ICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUTUdJLUV4cGlyeSJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVE1HSSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIExvY2FsLU1CMi1VLUluZm9ybWF0aW9uICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJMb2NhbC1NQjItVS1JbmZvcm1hdGlvbiJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQk1TQy1BZGRyZXNzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJCTVNDLVBvcnQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBNQk1TLUJlYXJlci1FdmVudC1Ob3RpZmljYXRpb24gKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1CTVMtQmVhcmVyLUV2ZW50LU5vdGlmaWNhdGlvbiJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVE1HSSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTUJNUy1GbG93LUlkZW50aWZpZXIifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1CTVMtQmVhcmVyLUV2ZW50In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogTUJNUy1CZWFyZXItUmVzcG9uc2UgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1CTVMtQmVhcmVyLVJlc3BvbnNlIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUTUdJIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNQk1TLUZsb3ctSWRlbnRpZmllciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTUJNUy1TZXNzaW9uLUR1cmF0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNQk1TLUJlYXJlci1SZXN1bHQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkJNU0MtQWRkcmVzcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQk1TQy1Qb3J0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNQjJVLVNlY3VyaXR5In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJSYWRpby1GcmVxdWVuY3kifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBUTUdJLURlYWxsb2NhdGlvbi1SZXNwb25zZSAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVE1HSS1EZWFsbG9jYXRpb24tUmVzcG9uc2UifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlRNR0kifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlRNR0ktRGVhbGxvY2F0aW9uLVJlc3VsdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIFRNR0ktQWxsb2NhdGlvbi1SZXF1ZXN0ICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUTUdJLUFsbG9jYXRpb24tUmVxdWVzdCJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVE1HSS1OdW1iZXIifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlRNR0kifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBUTUdJLURlYWxsb2NhdGlvbi1SZXF1ZXN0ICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUTUdJLURlYWxsb2NhdGlvbi1SZXF1ZXN0In07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUTUdJIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogTG9jYWwtTTEtSW5mb3JtYXRpb24gKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkxvY2FsLU0xLUluZm9ybWF0aW9uIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNQk1TLWVOQi1JUC1NdWx0aWNhc3QtQWRkcmVzcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTUJNUy1lTkItSVB2Ni1NdWx0aWNhc3QtQWRkcmVzcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTUJNUy1HVy1TU00tSVAtQWRkcmVzcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTUJNUy1HVy1TU00tSVB2Ni1BZGRyZXNzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDb21tb24tVHVubmVsLUVuZHBvaW50LUlkZW50aWZpZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBUTUdJLUFsbG9jYXRpb24tUmVzcG9uc2UgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlRNR0ktQWxsb2NhdGlvbi1SZXNwb25zZSJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVE1HSSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTUJNUy1TZXNzaW9uLUR1cmF0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUTUdJLUFsbG9jYXRpb24tUmVzdWx0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogTUJNUy1CZWFyZXItUmVxdWVzdCAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTUJNUy1CZWFyZXItUmVxdWVzdCJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTUJNUy1TdGFydFN0b3AtSW5kaWNhdGlvbiJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVE1HSSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTUJNUy1GbG93LUlkZW50aWZpZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlFvUy1JbmZvcm1hdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTUJNUy1TZXJ2aWNlLUFyZWEifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1CTVMtU3RhcnQtVGltZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTUIyVS1TZWN1cml0eSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTUJNUy1DZWxsLUxpc3QifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkxvY2FsLU0xLUluZm9ybWF0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJMb2NhbC1NQjItVS1JbmZvcm1hdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKworICAgfQkKKworICAgLyogQ29tbWFuZHMgc2VjdGlvbiAqLworICAgeworCisgICB9CisKKyAgIExPR19EKCAiRXh0ZW5zaW9uICdEaWN0aW9uYXJ5IGRlZmluaXRpb25zIGZvciB0czI5NDY4X2F2cHMgKGUxMCknIGluaXRpYWxpemVkIik7CisgICByZXR1cm4gMDsKK30KKworaW50IGRpY3RfZW50cnkoY2hhciAqIGNvbmZmaWxlKQoreworCWRpY3RfdHMyOTQ2OF9hdnBzX2xvYWRfZGVmcyhjb25mZmlsZSk7CisJcmV0dXJuIGRpY3RfdHMyOTQ2OF9hdnBzX2xvYWRfcnVsZXMoY29uZmZpbGUpOworfQorCitjb25zdCBjaGFyKiBkaWN0X3RzMjk0NjhfYXZwc19wcm90b192ZXIoY2hhciAqIGNvbmZmaWxlKSB7CisJcmV0dXJuIHRzMjk0NjhfYXZwc19wcm90b192ZXI7Cit9CisKK2NvbnN0IGRvdWJsZSBkaWN0X3RzMjk0NjhfYXZwc19nZW5fdHMoY2hhciAqIGNvbmZmaWxlKSB7CisJcmV0dXJuIHRzMjk0NjhfYXZwc19nZW5fZGF0ZTsKK30KKworRVhURU5TSU9OX0VOVFJZMigiZGljdF90czI5NDY4X2F2cHMiLCBkaWN0X3RzMjk0NjhfYXZwc19sb2FkX2RlZnMsIGRpY3RfdHMyOTQ2OF9hdnBzX2xvYWRfcnVsZXMsICJkaWN0X3RzMjkyMTJfYXZwcyIsICJkaWN0X3RzMjkyMjlfYXZwcyIsICJkaWN0X3RzMjkwNjFfYXZwcyIsICJkaWN0X2RyYWZ0bG9hZF9hdnBzIiwgImRpY3RfcmZjNzk0NF9hdnBzIik7CisKKworCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfdHMyOTQ2OF9hdnBzL3RzMjk0NjhfYXZwcy5kaWQgYi9leHRlbnNpb25zL2RpY3RfdHMyOTQ2OF9hdnBzL3RzMjk0NjhfYXZwcy5kaWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I2YTAxZgotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF90czI5NDY4X2F2cHMvdHMyOTQ2OF9hdnBzLmRpZApAQCAtMCwwICsxLDM3IEBACitkaWN0X3JmYzY5NDJfYXZwcworZGljdF90czI5MTU0X2F2cHMKK2RpY3RfdHMyOTIxNF9hdnBzCitkaWN0X3RzMjkyMTVfYXZwcworZGljdF90czI5MjE3X2F2cHMKK2RpY3RfM2dwcDJfYXZwcworZGljdF90czI5MzQzX2F2cHMKK2RpY3RfdHMyOTMzOF9hdnBzCitkaWN0X3RzMjkxMjhfYXZwcworZGljdF90czI5MzQ0X2F2cHMKK2RpY3RfdHMyOTM0NV9hdnBzCitkaWN0X3RzMzIyOTlfYXZwcworZGljdF9yZmM2NzM0X2F2cHMKK2RpY3RfcmZjNTc3OF9hdnBzCitkaWN0X3JmYzU1ODBfYXZwcworZGljdF9yZmM0MDcyX2F2cHMKK2RpY3RfdHMyOTI3M19hdnBzCitkaWN0X3RzMjkxNzNfYXZwcworZGljdF90czI5MzM3X2F2cHMKK2RpY3RfZXRzaTI4MzAzNF9hdnBzCitkaWN0X3JmYzQ1OTBfYXZwcworZGljdF90czI5MjI5X2F2cHMKK2RpY3RfZHJhZnRsb2FkX2F2cHMKK2RpY3RfdHMyOTMyOV9hdnBzCitkaWN0X3RzMjkzNjhfYXZwcworZGljdF90czI5MzM2X2F2cHMKK2RpY3RfdHMyOTA2MV9hdnBzCitkaWN0X3JmYzU0NDdfYXZwcworZGljdF90czI5MjcyX2F2cHMKK2RpY3RfcmZjNzY4M19hdnBzCitkaWN0X3JmYzc5NDRfYXZwcworZGljdF9yZmM1Nzc3X2F2cHMKK2RpY3RfcmZjNDAwNmJpc19hdnBzCitkaWN0X3JmYzQwMDRfYXZwcworZGljdF9yZmM3MTU1X2F2cHMKK2RpY3RfdHMyOTIxMl9hdnBzCitkaWN0X3RzMjk0NjhfYXZwcwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9kaWN0X3RzMzIyOTlfYXZwcy9DTWFrZUxpc3RzLnR4dCBiL2V4dGVuc2lvbnMvZGljdF90czMyMjk5X2F2cHMvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VlNjk3MwotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF90czMyMjk5X2F2cHMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxNiBAQAorIyBUaGUgZGljdF90czMyMjk5X2F2cHMgZXh0ZW5zaW9uCitQUk9KRUNUKCJkaWN0X3RzMzIyOTlfYXZwcyBsaWJyYXJ5IGdlbmVyYXRlZCBieSBGZEdlbiAiIEMpCisKKyMgQ29tcGlsZSBhcyBhIG1vZHVsZQorRkRfQUREX0VYVEVOU0lPTihkaWN0X3RzMzIyOTlfYXZwcyBkaWN0X3RzMzIyOTlfYXZwcy5jKQorCisKKyMjIyMKKyMjIElOU1RBTEwgc2VjdGlvbiAjIworCitJTlNUQUxMKFRBUkdFVFMgZGljdF90czMyMjk5X2F2cHMKKwlMSUJSQVJZIERFU1RJTkFUSU9OICR7SU5TVEFMTF9FWFRFTlNJT05TX1NVRkZJWH0KK0NPTVBPTkVOVCBmcmVlRGlhbWV0ZXItZGljdGlvbmFyeS1UUzMyMjk5X0FWUFMpCisKKworCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfdHMzMjI5OV9hdnBzL2RpY3RfdHMzMjI5OV9hdnBzLmMgYi9leHRlbnNpb25zL2RpY3RfdHMzMjI5OV9hdnBzL2RpY3RfdHMzMjI5OV9hdnBzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgxMTQwYQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF90czMyMjk5X2F2cHMvZGljdF90czMyMjk5X2F2cHMuYwpAQCAtMCwwICsxLDc2MDQgQEAKKy8qCisqIENvcHlyaWdodCAoYykgMjAxNyBTcHJpbnQKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLyoqKioqKioqKioqKioqKioKKyBHZW5lcmF0ZWQgQnk6IGZkdG9vbCBlbmhhbmNlbWVudHMgdG8gZGlhZnV6emVyCisgTGljZW5zZTogc2FtZSBhcyBmcmVlRGlhbWV0ZXIKKyoqKioqKioqKioqKioqKiovCisKKworLyogCisgKiBEaWN0aW9uYXJ5IGRlZmluaXRpb25zIG9mIG9iamVjdHMgc3BlY2lmaWVkIGluIHRzMzIyOTlfYXZwcyAoZTMwKS4KKyAqLworI2luY2x1ZGUgPGZyZWVEaWFtZXRlci9leHRlbnNpb24uaD4KKworI2RlZmluZSBQUk9UT19WRVIgImUzMCIKKyNkZWZpbmUgR0VOX0RBVEUgIDE1MDY2OTcxNDMuMzkKKworY29uc3QgY2hhciAqdHMzMjI5OV9hdnBzX3Byb3RvX3ZlciA9IFBST1RPX1ZFUjsKK2NvbnN0IGRvdWJsZSB0czMyMjk5X2F2cHNfZ2VuX2RhdGUgPSBHRU5fREFURTsKKworLyogVGhlIGNvbnRlbnQgb2YgdGhpcyBmaWxlIGZvbGxvd3MgdGhlIHNhbWUgc3RydWN0dXJlIGFzIGRpY3RfYmFzZV9wcm90by5jICovCisKKyNkZWZpbmUgQ0hFQ0tfZGljdF9uZXcoIF90eXBlLCBfZGF0YSwgX3BhcmVudCwgX3JlZiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgX3JldCA9IGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIChfdHlwZSksIChfZGF0YSksIChfcGFyZW50KSwgKF9yZWYpICk7IFwKKyAgICBpZiAoIF9yZXQgIT0gMCAmJiBfcmV0ICE9IEVFWElTVCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICByZXR1cm4gX3JldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBDSEVDS19kaWN0X3NlYXJjaCggX3R5cGUsIF9jcml0ZXJpYSwgX3doYXQsIF9yZXN1bHQgKQkJXAorICAgIENIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIChfdHlwZSksIChfY3JpdGVyaWEpLCAoX3doYXQpLCAoX3Jlc3VsdCksIEVOT0VOVCkgKTsKKworc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24geworICAgIHN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lOworICAgIGVudW0gcnVsZV9wb3NpdGlvbglwb3NpdGlvbjsKKyAgICBpbnQgCQkJbWluOworICAgIGludAkJCW1heDsKK307CisKKyNkZWZpbmUgUlVMRV9PUkRFUiggX3Bvc2l0aW9uICkgKCgoKF9wb3NpdGlvbikgPT0gUlVMRV9GSVhFRF9IRUFEKSB8fCAoKF9wb3NpdGlvbikgPT0gUlVMRV9GSVhFRF9UQUlMKSkgPyAxIDogMCApCisKKy8qIEF0dGVudGlvbiEgVGhpcyB2ZXJzaW9uIG9mIHRoZSBtYWNybyB1c2VzIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsIGluIGNvbnRyYXN0IHRvIG1vc3Qgb3RoZXIgY29waWVzISAqLworI2RlZmluZSBQQVJTRV9sb2NfcnVsZXMoIF9ydWxlYXJyYXksIF9wYXJlbnQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBfX2FyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yIChfX2FyPTA7IF9fYXIgPCBzaXplb2YoX3J1bGVhcnJheSkgLyBzaXplb2YoKF9ydWxlYXJyYXkpWzBdKTsgX19hcisrKSB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHN0cnVjdCBkaWN0X3J1bGVfZGF0YSBfX2RhdGEgPSB7IE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ucG9zaXRpb24sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLm1pbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoX3J1bGVhcnJheSlbX19hcl0ubWF4fTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfX2RhdGEucnVsZV9vcmRlciA9IFJVTEVfT1JERVIoX19kYXRhLnJ1bGVfcG9zaXRpb24pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIENIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIERJQ1RfQVZQLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAmKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICZfX2RhdGEucnVsZV9hdnAsIDAgKSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmICggIV9fZGF0YS5ydWxlX2F2cCApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9ERUJVRyhJTkZPLCAiQVZQIE5vdCBmb3VuZDogJyVzJyIsIChfcnVsZWFycmF5KVtfX2FyXS5hdnBfdmVuZG9yX3BsdXNfbmFtZS5hdnBfbmFtZSk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFTk9FTlQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgX3JldCA9IGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfUlVMRSwgJihfX2RhdGEpLCAoX3BhcmVudCksIE5VTEwgKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggX3JldCAhPSAwICYmIF9yZXQgIT0gRUVYSVNUICkgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFX0RFQlVHKElORk8sICJFcnJvciBvbiBydWxlIHdpdGggQVZQICclcyciLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9ydWxlYXJyYXkpW19fYXJdLmF2cF92ZW5kb3JfcGx1c19uYW1lLmF2cF9uYW1lKTsgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRUlOVkFMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgQ0hFQ0tfdmVuZG9yX25ldyggX2RhdGEgKSB7IFwKKyAgICAgICAgc3RydWN0IGRpY3Rfb2JqZWN0ICogdmVuZG9yX2ZvdW5kOyBcCisgICAgICAgIGlmIChmZF9kaWN0X3NlYXJjaChmZF9nX2NvbmZpZy0+Y25mX2RpY3QsRElDVF9WRU5ET1IsVkVORE9SX0JZX0lELCZfZGF0YS52ZW5kb3JfaWQsJnZlbmRvcl9mb3VuZCxFTk9FTlQpID09IEVOT0VOVCkgeyBcCisgICAgICAgICAgICAgICAgQ0hFQ0tfRkNUKGZkX2RpY3RfbmV3KGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9WRU5ET1IsICZfZGF0YSwgTlVMTCwgTlVMTCkpOyBcCisgICAgICAgIH0gXAorfQorCisjZGVmaW5lIGVudW12YWxfZGVmX3UzMiggX3ZhbF8sIF9zdHJfICkJCVwKKyAgICB7IF9zdHJfLCAJCXsgLnUzMiA9IF92YWxfIH19CisKKyNkZWZpbmUgZW51bXZhbF9kZWZfb3MoIF9sZW5fLCBfdmFsXywgX3N0cl8gKQkJCQlcCisgICAgeyBfc3RyXywgCQl7IC5vcyA9IHsgLmRhdGEgPSAodW5zaWduZWQgY2hhciAqKV92YWxfLCAubGVuID0gX2xlbl8gfX19CisKKworc3RhdGljIGludCBkaWN0X3RzMzIyOTlfYXZwc19sb2FkX2RlZnMoY2hhciAqIGNvbmZmaWxlKQoreworICAgVFJBQ0VfRU5UUlkoIiVwIiwgY29uZmZpbGUpOworCS8qIEFwcGxpY2F0aW9uIFNlY3Rpb24gKi8KKwl7CisJCS8qIENyZWF0ZSB0aGUgdmVuZG9ycyAqLwkJeworCQkJc3RydWN0IGRpY3RfdmVuZG9yX2RhdGEgdmVuZG9yX2RhdGEgPSB7IDEwNDE1LCAiM0dQUCIgfTsKKwkJCUNIRUNLX2RpY3RfbmV3KERJQ1RfVkVORE9SLCAmdmVuZG9yX2RhdGEsIE5VTEwsIE5VTEwpCisJCX0KKwl9CisKKworICAgLyogQVZQIHNlY3Rpb24gKi8KKyAgIHsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogQWRkcmVzc190eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBVVEY4U3RyaW5nX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIERpYW1ldGVySWRlbnRpdHlfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogRGlhbWV0ZXJVUklfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogVGltZV90eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBJUEZpbHRlclJ1bGVfdHlwZTsKKworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJBZGRyZXNzIiwgJkFkZHJlc3NfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIlVURjhTdHJpbmciLCAmVVRGOFN0cmluZ190eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiRGlhbWV0ZXJJZGVudGl0eSIsICZEaWFtZXRlcklkZW50aXR5X3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJEaWFtZXRlclVSSSIsICZEaWFtZXRlclVSSV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiVGltZSIsICZUaW1lX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJJUEZpbHRlclJ1bGUiLCAmSVBGaWx0ZXJSdWxlX3R5cGUpOworCQkvKiAzR1BQLVBTLURhdGEtT2ZmLVN0YXR1cyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTQ0MDYsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIjNHUFAtUFMtRGF0YS1PZmYtU3RhdHVzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZCgzR1BQLVBTLURhdGEtT2ZmLVN0YXR1cykiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIkFjdGl2ZSIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJJbmFjdGl2ZSIsIHsgLmkzMj0xIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBBY2Nlc3MtTmV0d29yay1JbmZvcm1hdGlvbiAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEyNjMsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkFjY2Vzcy1OZXR3b3JrLUluZm9ybWF0aW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogQWNjZXNzLVRyYW5zZmVyLVR5cGUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyNzEwLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJBY2Nlc3MtVHJhbnNmZXItVHlwZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoQWNjZXNzLVRyYW5zZmVyLVR5cGUpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJQU190b19DU19UcmFuc2ZlciIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJDU190b19QU19UcmFuc2ZlciIsIHsgLmkzMj0xIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMgPSB7ICJQU190b19QU19UcmFuc2ZlciIsIHsgLmkzMj0yIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzQgPSB7ICJDU190b19DU19UcmFuc2ZlciIsIHsgLmkzMj0zIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogQWNjb3VudC1FeHBpcmF0aW9uICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjMwOSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQWNjb3VudC1FeHBpcmF0aW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBUaW1lX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBBZGFwdGF0aW9ucyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEyMTcsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkFkYXB0YXRpb25zIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChBZGFwdGF0aW9ucykiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIlllcyIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJObyIsIHsgLmkzMj0xIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBBZGRpdGlvbmFsLUV4Y2VwdGlvbi1SZXBvcnRzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzkzNiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQWRkaXRpb25hbC1FeGNlcHRpb24tUmVwb3J0cyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoQWRkaXRpb25hbC1FeGNlcHRpb24tUmVwb3J0cykiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIk5vdF9hbGxvd2VkIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIkFsbG93ZWQiLCB7IC5pMzI9MSB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogQWRkaXRpb25hbC1UeXBlLUluZm9ybWF0aW9uICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTIwNSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQWRkaXRpb25hbC1UeXBlLUluZm9ybWF0aW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBBZGRyZXNzLURhdGEgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk4OTcsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkFkZHJlc3MtRGF0YSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogQWRkcmVzc2VlLVR5cGUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMjA4LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJBZGRyZXNzZWUtVHlwZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoQWRkcmVzc2VlLVR5cGUpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJUTyIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJDQyIsIHsgLmkzMj0xIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMgPSB7ICJCQ0MiLCB7IC5pMzI9MiB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBBZGRyZXNzLVR5cGUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk4OTksCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkFkZHJlc3MtVHlwZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoQWRkcmVzcy1UeXBlKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiZV9tYWlsX2FkZHJlc3MiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiTVNJU0ROIiwgeyAuaTMyPTEgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMyA9IHsgIklQdjRfQWRkcmVzcyIsIHsgLmkzMj0yIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzQgPSB7ICJJUHY2X0FkZHJlc3MiLCB7IC5pMzI9MyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF81ID0geyAiTnVtZXJpY19TaG9ydGNvZGUiLCB7IC5pMzI9NCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF82ID0geyAiQWxwaGFudW1lcmljX1Nob3J0Y29kZSIsIHsgLmkzMj01IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzcgPSB7ICJPdGhlciIsIHsgLmkzMj02IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzggPSB7ICJJTVNJIiwgeyAuaTMyPTcgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF80LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzUsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF83LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzgsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIEFsdGVybmF0ZS1DaGFyZ2VkLVBhcnR5LUFkZHJlc3MgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMjgwLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJBbHRlcm5hdGUtQ2hhcmdlZC1QYXJ0eS1BZGRyZXNzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBBbm5vdW5jZW1lbnQtSWRlbnRpZmllciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM5MDUsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkFubm91bmNlbWVudC1JZGVudGlmaWVyIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBBbm5vdW5jZW1lbnQtT3JkZXIgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzOTA2LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJBbm5vdW5jZW1lbnQtT3JkZXIiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIEFubm91bmNpbmctVUUtSFBMTU4tSWRlbnRpZmllciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM0MjYsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkFubm91bmNpbmctVUUtSFBMTU4tSWRlbnRpZmllciIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogQW5ub3VuY2luZy1VRS1WUExNTi1JZGVudGlmaWVyICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzQyNywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQW5ub3VuY2luZy1VRS1WUExNTi1JZGVudGlmaWVyIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBBb0MtRm9ybWF0ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjMxMCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQW9DLUZvcm1hdCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoQW9DLUZvcm1hdCkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIk1PTkVUQVJZIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIk5PTl9NT05FVEFSWSIsIHsgLmkzMj0xIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMgPSB7ICJDQUkiLCB7IC5pMzI9MiB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBBb0MtUmVxdWVzdC1UeXBlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjA1NSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQW9DLVJlcXVlc3QtVHlwZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoQW9DLVJlcXVlc3QtVHlwZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIkFvQ19OT1RfUkVRVUVTVEVEIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIkFvQ19GVUxMIiwgeyAuaTMyPTEgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMyA9IHsgIkFvQ19DT1NUX09OTFkiLCB7IC5pMzI9MiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF80ID0geyAiQW9DX1RBUklGRl9PTkxZIiwgeyAuaTMyPTMgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF80LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBBb0MtU2VydmljZS1PYmxpZ2F0b3J5LVR5cGUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyMzEyLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJBb0MtU2VydmljZS1PYmxpZ2F0b3J5LVR5cGUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKEFvQy1TZXJ2aWNlLU9ibGlnYXRvcnktVHlwZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIk5PTl9CSU5ESU5HIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIkJJTkRJTkciLCB7IC5pMzI9MSB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogQW9DLVNlcnZpY2UtVHlwZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTIzMTMsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkFvQy1TZXJ2aWNlLVR5cGUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKEFvQy1TZXJ2aWNlLVR5cGUpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJOT05FIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIkFPQy1TIiwgeyAuaTMyPTEgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMyA9IHsgIkFPQy1EIiwgeyAuaTMyPTIgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNCA9IHsgIkFPQy1FIiwgeyAuaTMyPTMgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF80LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBBcHBsaWMtSUQgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMjE4LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJBcHBsaWMtSUQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIEFwcGxpY2F0aW9uLVByb3ZpZGVkLUNhbGxlZC1QYXJ0eS1BZGRyZXNzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJODM3LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJBcHBsaWNhdGlvbi1Qcm92aWRlZC1DYWxsZWQtUGFydHktQWRkcmVzcyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogQXBwbGljYXRpb24tU2VydmVyICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJODM2LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJBcHBsaWNhdGlvbi1TZXJ2ZXIiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIEFwcGxpY2F0aW9uLVNwZWNpZmljLURhdGEgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzNDU4LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJBcHBsaWNhdGlvbi1TcGVjaWZpYy1EYXRhIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogQXNzb2NpYXRlZC1QYXJ0eS1BZGRyZXNzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjAzNSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQXNzb2NpYXRlZC1QYXJ0eS1BZGRyZXNzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBBc3NvY2lhdGVkLVVSSSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTg1NiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQXNzb2NpYXRlZC1VUkkiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIEF1dGhvcmlzZWQtUW9TICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJODQ5LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJBdXRob3Jpc2VkLVFvUyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogQXV4LUFwcGxpYy1JbmZvICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTIxOSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQXV4LUFwcGxpYy1JbmZvIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBCYXNlLVRpbWUtSW50ZXJ2YWwgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMjY1LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJCYXNlLVRpbWUtSW50ZXJ2YWwiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIEJlYXJlci1DYXBhYmlsaXR5ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzQxMiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQmVhcmVyLUNhcGFiaWxpdHkiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBCZWFyZXItU2VydmljZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTg1NCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQmVhcmVyLVNlcnZpY2UiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBCU1NJRCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTI3MTYsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkJTU0lEIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBDYWxsZWQtQXNzZXJ0ZWQtSWRlbnRpdHkgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMjUwLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJDYWxsZWQtQXNzZXJ0ZWQtSWRlbnRpdHkiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIENhbGxlZC1JZGVudGl0eSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM5MTYsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkNhbGxlZC1JZGVudGl0eSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogQ2FsbGVkLVBhcnR5LUFkZHJlc3MgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk4MzIsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkNhbGxlZC1QYXJ0eS1BZGRyZXNzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBDYWxsaW5nLVBhcnR5LUFkZHJlc3MgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk4MzEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkNhbGxpbmctUGFydHktQWRkcmVzcyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogQ2Fycmllci1TZWxlY3QtUm91dGluZy1JbmZvcm1hdGlvbiAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTIwMjMsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkNhcnJpZXItU2VsZWN0LVJvdXRpbmctSW5mb3JtYXRpb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIENhdXNlLUNvZGUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk4NjEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkNhdXNlLUNvZGUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogQ2VsbHVsYXItTmV0d29yay1JbmZvcm1hdGlvbiAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM5MjQsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkNlbGx1bGFyLU5ldHdvcmstSW5mb3JtYXRpb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBDRy1BZGRyZXNzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJODQ2LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJDRy1BZGRyZXNzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBBZGRyZXNzX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBDaGFuZ2UtQ29uZGl0aW9uICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjAzNywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQ2hhbmdlLUNvbmRpdGlvbiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBDaGFuZ2UtVGltZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTIwMzgsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkNoYW5nZS1UaW1lIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBUaW1lX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBDaGFyZ2UtUmVhc29uLUNvZGUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyMTE4LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJDaGFyZ2UtUmVhc29uLUNvZGUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKENoYXJnZS1SZWFzb24tQ29kZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIlVOS05PV04iLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiVVNBR0UiLCB7IC5pMzI9MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAiQ09NTVVOSUNBVElPTl9BVFRFTVBUX0NIQVJHRSIsIHsgLmkzMj0yIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzQgPSB7ICJTRVRVUF9DSEFSR0UiLCB7IC5pMzI9MyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF81ID0geyAiQUREX09OX0NIQVJHRSIsIHsgLmkzMj00IH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF81LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBDaGFyZ2VkLVBhcnR5ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJODU3LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJDaGFyZ2VkLVBhcnR5IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBDaGFyZ2luZy1DaGFyYWN0ZXJpc3RpY3MtU2VsZWN0aW9uLU1vZGUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyMDY2LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJDaGFyZ2luZy1DaGFyYWN0ZXJpc3RpY3MtU2VsZWN0aW9uLU1vZGUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKENoYXJnaW5nLUNoYXJhY3RlcmlzdGljcy1TZWxlY3Rpb24tTW9kZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIlNlcnZpbmdfTm9kZV9TdXBwbGllZCIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJTdWJzY3JpcHRpb25fc3BlY2lmaWMiLCB7IC5pMzI9MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAiQVBOX3NwZWNpZmljIiwgeyAuaTMyPTIgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNCA9IHsgIkhvbWVfRGVmYXVsdCIsIHsgLmkzMj0zIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzUgPSB7ICJSb2FtaW5nX0RlZmF1bHQiLCB7IC5pMzI9NCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF82ID0geyAiVmlzaXRpbmdfRGVmYXVsdCIsIHsgLmkzMj01IH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF81LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzYsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIENoYXJnaW5nLVBlci1JUC1DQU4tU2Vzc2lvbi1JbmRpY2F0b3IgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk0NDAwLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJDaGFyZ2luZy1QZXItSVAtQ0FOLVNlc3Npb24tSW5kaWNhdG9yIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChDaGFyZ2luZy1QZXItSVAtQ0FOLVNlc3Npb24tSW5kaWNhdG9yKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiSW5hY3RpdmUiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiQWN0aXZlIiwgeyAuaTMyPTEgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIENsYXNzLUlkZW50aWZpZXIgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMjE0LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJDbGFzcy1JZGVudGlmaWVyIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChDbGFzcy1JZGVudGlmaWVyKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiUGVyc29uYWwiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiQWR2ZXJ0aXNlbWVudCIsIHsgLmkzMj0xIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMgPSB7ICJJbmZvcm1hdGlvbmFsIiwgeyAuaTMyPTIgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNCA9IHsgIkF1dG8iLCB7IC5pMzI9MyB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzQsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIENsaWVudC1BZGRyZXNzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjAxOCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQ2xpZW50LUFkZHJlc3MiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIEFkZHJlc3NfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIENOLU9wZXJhdG9yLVNlbGVjdGlvbi1FbnRpdHkgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzNDIxLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJDTi1PcGVyYXRvci1TZWxlY3Rpb24tRW50aXR5IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChDTi1PcGVyYXRvci1TZWxlY3Rpb24tRW50aXR5KSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiVGhlX1NlcnZpbmdfTmV0d29ya19oYXNfYmVlbl9zZWxlY3RlZF9ieV90aGVfVUUiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiVGhlX1NlcnZpbmdfTmV0d29ya19oYXNfYmVlbl9zZWxlY3RlZF9ieV90aGVfbmV0d29yayIsIHsgLmkzMj0xIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBDb250ZW50LUNsYXNzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTIyMCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQ29udGVudC1DbGFzcyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoQ29udGVudC1DbGFzcykiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgInRleHQiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiaW1hZ2VfYmFzaWMiLCB7IC5pMzI9MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAiaW1hZ2VfcmljaCIsIHsgLmkzMj0yIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzQgPSB7ICJ2aWRlb19iYXNpYyIsIHsgLmkzMj0zIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzUgPSB7ICJ2aWRlb19yaWNoIiwgeyAuaTMyPTQgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNiA9IHsgIm1lZ2FwaXhlbCIsIHsgLmkzMj01IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzcgPSB7ICJjb250ZW50X2Jhc2ljIiwgeyAuaTMyPTYgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfOCA9IHsgImNvbnRlbnRfcmljaCIsIHsgLmkzMj03IH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF81LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzYsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF84LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBDb250ZW50LURpc3Bvc2l0aW9uICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJODI4LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJDb250ZW50LURpc3Bvc2l0aW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBDb250ZW50LUxlbmd0aCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTgyNywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQ29udGVudC1MZW5ndGgiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIENvbnRlbnQtU2l6ZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEyMDYsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkNvbnRlbnQtU2l6ZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogQ29udGVudC1UeXBlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJODI2LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJDb250ZW50LVR5cGUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIENvdmVyYWdlLVN0YXR1cyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM0MjgsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkNvdmVyYWdlLVN0YXR1cyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoQ292ZXJhZ2UtU3RhdHVzKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiT3V0X29mX2NvdmVyYWdlIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIkluX2NvdmVyYWdlIiwgeyAuaTMyPTEgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIENQLUNJb1QtRVBTLU9wdGltaXNhdGlvbi1JbmRpY2F0b3IgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzOTMwLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJDUC1DSW9ULUVQUy1PcHRpbWlzYXRpb24tSW5kaWNhdG9yIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChDUC1DSW9ULUVQUy1PcHRpbWlzYXRpb24tSW5kaWNhdG9yKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiTm90X0FwcGx5IiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIkFwcGx5IiwgeyAuaTMyPTEgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIENTRy1BY2Nlc3MtTW9kZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTIzMTcsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkNTRy1BY2Nlc3MtTW9kZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoQ1NHLUFjY2Vzcy1Nb2RlKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiQ2xvc2VkX21vZGUiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiSHlicmlkX01vZGUiLCB7IC5pMzI9MSB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogQ1NHLU1lbWJlcnNoaXAtSW5kaWNhdGlvbiAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTIzMTgsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkNTRy1NZW1iZXJzaGlwLUluZGljYXRpb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKENTRy1NZW1iZXJzaGlwLUluZGljYXRpb24pIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJOb3RfQ1NHX21lbWJlciIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJDU0dfTWVtYmVyIiwgeyAuaTMyPTEgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIENVRy1JbmZvcm1hdGlvbiAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTIzMDQsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkNVRy1JbmZvcm1hdGlvbiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIERhdGEtQ29kaW5nLVNjaGVtZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTIwMDEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkRhdGEtQ29kaW5nLVNjaGVtZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBEZWZlcnJlZC1Mb2NhdGlvbi1FdmVudC1UeXBlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTIzMCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiRGVmZXJyZWQtTG9jYXRpb24tRXZlbnQtVHlwZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogRGVsaXZlcnktUmVwb3J0LVJlcXVlc3RlZCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEyMTYsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkRlbGl2ZXJ5LVJlcG9ydC1SZXF1ZXN0ZWQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKERlbGl2ZXJ5LVJlcG9ydC1SZXF1ZXN0ZWQpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJObyIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJZZXMiLCB7IC5pMzI9MSB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogRGlhZ25vc3RpY3MgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyMDM5LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJEaWFnbm9zdGljcyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBEaXNjb3ZlcmVlLVVFLUhQTE1OLUlkZW50aWZpZXIgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk0NDAyLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJEaXNjb3ZlcmVlLVVFLUhQTE1OLUlkZW50aWZpZXIiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIERpc2NvdmVyZWUtVUUtVlBMTU4tSWRlbnRpZmllciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTQ0MDMsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkRpc2NvdmVyZWUtVUUtVlBMTU4tSWRlbnRpZmllciIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogRGlzY292ZXJlci1VRS1IUExNTi1JZGVudGlmaWVyICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJNDQwNCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiRGlzY292ZXJlci1VRS1IUExNTi1JZGVudGlmaWVyIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBEaXNjb3ZlcmVyLVVFLVZQTE1OLUlkZW50aWZpZXIgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk0NDA1LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJEaXNjb3ZlcmVyLVVFLVZQTE1OLUlkZW50aWZpZXIiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIERvbWFpbi1OYW1lICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTIwMCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiRG9tYWluLU5hbWUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIERSTS1Db250ZW50ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTIyMSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiRFJNLUNvbnRlbnQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKERSTS1Db250ZW50KSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiTm8iLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiWWVzIiwgeyAuaTMyPTEgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIER5bmFtaWMtQWRkcmVzcy1GbGFnICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjA1MSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiRHluYW1pYy1BZGRyZXNzLUZsYWciLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKER5bmFtaWMtQWRkcmVzcy1GbGFnKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiU3RhdGljIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIkR5bmFtaWMiLCB7IC5pMzI9MSB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogRHluYW1pYy1BZGRyZXNzLUZsYWctRXh0ZW5zaW9uICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjA2OCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiRHluYW1pYy1BZGRyZXNzLUZsYWctRXh0ZW5zaW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChEeW5hbWljLUFkZHJlc3MtRmxhZy1FeHRlbnNpb24pIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJTdGF0aWMiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiRHluYW1pYyIsIHsgLmkzMj0xIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBFbnZlbG9wZS1FbmQtVGltZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEyNjcsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkVudmVsb3BlLUVuZC1UaW1lIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBUaW1lX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBFbnZlbG9wZS1SZXBvcnRpbmcgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMjY4LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJFbnZlbG9wZS1SZXBvcnRpbmciLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKEVudmVsb3BlLVJlcG9ydGluZykiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIkRPX05PVF9SRVBPUlRfRU5WRUxPUEVTIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIlJFUE9SVF9FTlZFTE9QRVMiLCB7IC5pMzI9MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAiUkVQT1JUX0VOVkVMT1BFU19XSVRIX1ZPTFVNRSIsIHsgLmkzMj0yIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzQgPSB7ICJSRVBPUlRfRU5WRUxPUEVTX1dJVEhfRVZFTlRTIiwgeyAuaTMyPTMgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNSA9IHsgIlJFUE9SVF9FTlZFTE9QRVNfV0lUSF9WT0xVTUVfQU5EX0VWRU5UUyIsIHsgLmkzMj00IH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF81LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBFbnZlbG9wZS1TdGFydC1UaW1lICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTI2OSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiRW52ZWxvcGUtU3RhcnQtVGltZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVGltZV90eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogRVBERy1BZGRyZXNzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzQyNSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiRVBERy1BZGRyZXNzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBBZGRyZXNzX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBFdmVudCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTgyNSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiRXZlbnQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIEV2ZW50LUNoYXJnaW5nLVRpbWVTdGFtcCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEyNTgsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkV2ZW50LUNoYXJnaW5nLVRpbWVTdGFtcCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVGltZV90eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogRXhwaXJlcyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTg4OCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiRXhwaXJlcyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogRmlsZS1SZXBhaXItU3VwcG9ydGVkICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTIyNCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiRmlsZS1SZXBhaXItU3VwcG9ydGVkIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChGaWxlLVJlcGFpci1TdXBwb3J0ZWQpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJTVVBQT1JURUQiLCB7IC5pMzI9MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiTk9UX1NVUFBPUlRFRCIsIHsgLmkzMj0yIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBGb3J3YXJkaW5nLVBlbmRpbmcgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzNDE1LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJGb3J3YXJkaW5nLVBlbmRpbmciLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKEZvcndhcmRpbmctUGVuZGluZykiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIkZvcndhcmRpbmdfbm90X3BlbmRpbmciLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiRm9yd2FyZGluZ19wZW5kaW5nIiwgeyAuaTMyPTEgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIEZyb20tQWRkcmVzcyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTI3MDgsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkZyb20tQWRkcmVzcyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogR0dTTi1BZGRyZXNzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJODQ3LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJHR1NOLUFkZHJlc3MiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIEFkZHJlc3NfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIElNUy1BcHBsaWNhdGlvbi1SZWZlcmVuY2UtSWRlbnRpZmllciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTI2MDEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIklNUy1BcHBsaWNhdGlvbi1SZWZlcmVuY2UtSWRlbnRpZmllciIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogSU1TLUNoYXJnaW5nLUlkZW50aWZpZXIgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk4NDEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIklNUy1DaGFyZ2luZy1JZGVudGlmaWVyIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBJTVMtQ29tbXVuaWNhdGlvbi1TZXJ2aWNlLUlkZW50aWZpZXIgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMjgxLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJJTVMtQ29tbXVuaWNhdGlvbi1TZXJ2aWNlLUlkZW50aWZpZXIiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIElNUy1FbWVyZ2VuY3ktSW5kaWNhdG9yICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjMyMiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiSU1TLUVtZXJnZW5jeS1JbmRpY2F0b3IiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKElNUy1FbWVyZ2VuY3ktSW5kaWNhdG9yKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiTm9uX0VtZXJnZW5jeSIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJFbWVyZ2VuY3kiLCB7IC5pMzI9MSB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogSU1TLVZpc2l0ZWQtTmV0d29yay1JZGVudGlmaWVyICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjcxMywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiSU1TLVZpc2l0ZWQtTmV0d29yay1JZGVudGlmaWVyIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBJTVNJLVVuYXV0aGVudGljYXRlZC1GbGFnICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjMwOCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiSU1TSS1VbmF1dGhlbnRpY2F0ZWQtRmxhZyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoSU1TSS1VbmF1dGhlbnRpY2F0ZWQtRmxhZykiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIkF1dGhlbnRpY2F0ZWQiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiVW5hdXRoZW50aWNhdGVkIiwgeyAuaTMyPTEgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIEluY29taW5nLVRydW5rLUdyb3VwLUlkICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJODUyLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJJbmNvbWluZy1UcnVuay1Hcm91cC1JZCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogSW5pdGlhbC1JTVMtQ2hhcmdpbmctSWRlbnRpZmllciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTIzMjEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkluaXRpYWwtSU1TLUNoYXJnaW5nLUlkZW50aWZpZXIiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIEluc3RhbmNlLUlkICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzQwMiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiSW5zdGFuY2UtSWQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIEludGVyZmFjZS1JZCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTIwMDMsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkludGVyZmFjZS1JZCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogSW50ZXJmYWNlLVBvcnQgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyMDA0LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJJbnRlcmZhY2UtUG9ydCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogSW50ZXJmYWNlLVRleHQgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyMDA1LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJJbnRlcmZhY2UtVGV4dCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogSW50ZXJmYWNlLVR5cGUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyMDA2LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJJbnRlcmZhY2UtVHlwZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoSW50ZXJmYWNlLVR5cGUpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJVbmtub3duIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIk1PQklMRV9PUklHSU5BVElORyIsIHsgLmkzMj0xIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMgPSB7ICJNT0JJTEVfVEVSTUlOQVRJTkciLCB7IC5pMzI9MiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF80ID0geyAiQVBQTElDQVRJT05fT1JJR0lOQVRJTkciLCB7IC5pMzI9MyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF81ID0geyAiQVBQTElDQVRJT05fVEVSTUlOQVRJT04iLCB7IC5pMzI9NCB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzQsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogSW50ZXItVUUtVHJhbnNmZXIgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzOTAyLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJJbnRlci1VRS1UcmFuc2ZlciIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoSW50ZXItVUUtVHJhbnNmZXIpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJJbnRyYV9VRV90cmFuc2ZlciIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJJbnRlcl9VRV90cmFuc2ZlciIsIHsgLmkzMj0xIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBJUC1SZWFsbS1EZWZhdWx0LUluZGljYXRpb24gKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyNjAzLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJJUC1SZWFsbS1EZWZhdWx0LUluZGljYXRpb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKElQLVJlYWxtLURlZmF1bHQtSW5kaWNhdGlvbikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIkRlZmF1bHRfSVBfUmVhbG1fTm90X3VzZWQiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiRGVmYXVsdF9JUF9yZWFsbV91c2VkIiwgeyAuaTMyPTEgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIElTVVAtQ2F1c2UtRGlhZ25vc3RpY3MgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzNDIyLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJJU1VQLUNhdXNlLURpYWdub3N0aWNzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogSVNVUC1DYXVzZS1Mb2NhdGlvbiAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM0MjMsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIklTVVAtQ2F1c2UtTG9jYXRpb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIElTVVAtQ2F1c2UtVmFsdWUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzNDI0LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJJU1VQLUNhdXNlLVZhbHVlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBJU1VQLUxvY2F0aW9uLU51bWJlciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM0MTQsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIklTVVAtTG9jYXRpb24tTnVtYmVyIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogTGFuZ3VhZ2UgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzOTE0LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJMYW5ndWFnZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogTGF5ZXItMi1Hcm91cC1JRCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM0MjksCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkxheWVyLTItR3JvdXAtSUQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBMQ1MtQVBOICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTIzMSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTENTLUFQTiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogTENTLUNsaWVudC1EaWFsZWQtQnktTVMgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMjMzLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJMQ1MtQ2xpZW50LURpYWxlZC1CeS1NUyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogTENTLUNsaWVudC1FeHRlcm5hbC1JRCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEyMzQsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkxDUy1DbGllbnQtRXh0ZXJuYWwtSUQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIExDUy1DbGllbnQtVHlwZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEyNDEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkxDUy1DbGllbnQtVHlwZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoTENTLUNsaWVudC1UeXBlKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiRU1FUkdFTkNZX1NFUlZJQ0VTIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIlZBTFVFX0FEREVEX1NFUlZJQ0VTIiwgeyAuaTMyPTEgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMyA9IHsgIlBMTU5fT1BFUkFUT1JfU0VSVklDRVMiLCB7IC5pMzI9MiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF80ID0geyAiTEFXRlVMX0lOVEVSQ0VQVF9TRVJWSUNFUyIsIHsgLmkzMj0zIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogTENTLURhdGEtQ29kaW5nLVNjaGVtZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEyMzYsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkxDUy1EYXRhLUNvZGluZy1TY2hlbWUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIExDUy1Gb3JtYXQtSW5kaWNhdG9yICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTIzNywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTENTLUZvcm1hdC1JbmRpY2F0b3IiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKExDUy1Gb3JtYXQtSW5kaWNhdG9yKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiTE9HSUNBTF9OQU1FIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIkVNQUlMX0FERFJFU1MiLCB7IC5pMzI9MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAiTVNJU0ROIiwgeyAuaTMyPTIgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNCA9IHsgIlVSTCIsIHsgLmkzMj0zIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzUgPSB7ICJTSVBfVVJMIiwgeyAuaTMyPTQgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF80LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzUsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIExDUy1OYW1lLVN0cmluZyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEyMzgsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkxDUy1OYW1lLVN0cmluZyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogTENTLVJlcXVlc3Rvci1JRC1TdHJpbmcgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMjQwLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJMQ1MtUmVxdWVzdG9yLUlELVN0cmluZyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogTG9jYWwtR1ctSW5zZXJ0ZWQtSW5kaWNhdGlvbiAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTI2MDQsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkxvY2FsLUdXLUluc2VydGVkLUluZGljYXRpb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKExvY2FsLUdXLUluc2VydGVkLUluZGljYXRpb24pIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJMb2NhbF9HV19Ob3RfSW5zZXJ0ZWQiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiTG9jYWxfR1dfSW5zZXJ0ZWQiLCB7IC5pMzI9MSB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogTG9jYWwtU2VxdWVuY2UtTnVtYmVyICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjA2MywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTG9jYWwtU2VxdWVuY2UtTnVtYmVyIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBMb2NhdGlvbi1Fc3RpbWF0ZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEyNDIsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkxvY2F0aW9uLUVzdGltYXRlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogTG9jYXRpb24tRXN0aW1hdGUtVHlwZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEyNDMsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkxvY2F0aW9uLUVzdGltYXRlLVR5cGUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKExvY2F0aW9uLUVzdGltYXRlLVR5cGUpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJDVVJSRU5UX0xPQ0FUSU9OIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIkNVUlJFTlRfTEFTVF9LTk9XTl9MT0NBVElPTiIsIHsgLmkzMj0xIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMgPSB7ICJJTklUSUFMX0xPQ0FUSU9OIiwgeyAuaTMyPTIgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNCA9IHsgIkFDVElWQVRFX0RFRkVSUkVEX0xPQ0FUSU9OIiwgeyAuaTMyPTMgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNSA9IHsgIkNBTkNFTF9ERUZFUlJFRF9MT0NBVElPTiIsIHsgLmkzMj00IH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF81LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBMb3ctQmFsYW5jZS1JbmRpY2F0aW9uICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjAyMCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTG93LUJhbGFuY2UtSW5kaWNhdGlvbiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoTG93LUJhbGFuY2UtSW5kaWNhdGlvbikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIk5PVF9BUFBMSUNBQkxFIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIllFUyIsIHsgLmkzMj0xIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBMb3ctUHJpb3JpdHktSW5kaWNhdG9yICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjYwMiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTG93LVByaW9yaXR5LUluZGljYXRvciIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoTG93LVByaW9yaXR5LUluZGljYXRvcikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIk5PIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIllFUyIsIHsgLmkzMj0xIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBNQk1TLUNoYXJnZWQtUGFydHkgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyMzIzLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJNQk1TLUNoYXJnZWQtUGFydHkiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKE1CTVMtQ2hhcmdlZC1QYXJ0eSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIkNvbnRlbnRfUHJvdmlkZXIiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiU3Vic2NyaWJlciIsIHsgLmkzMj0xIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBNQk1TLUdXLUFkZHJlc3MgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyMzA3LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJNQk1TLUdXLUFkZHJlc3MiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIEFkZHJlc3NfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIE1CTVMtVXNlci1TZXJ2aWNlLVR5cGUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMjI1LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJNQk1TLVVzZXItU2VydmljZS1UeXBlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChNQk1TLVVzZXItU2VydmljZS1UeXBlKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiRE9XTkxPQUQiLCB7IC5pMzI9MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiU1RSRUFNSU5HIiwgeyAuaTMyPTIgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIE1lZGlhLUluaXRpYXRvci1GbGFnICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJODgyLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJNZWRpYS1Jbml0aWF0b3ItRmxhZyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoTWVkaWEtSW5pdGlhdG9yLUZsYWcpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJjYWxsZWRfcGFydHkiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiY2FsbGluZ19wYXJ0eSIsIHsgLmkzMj0xIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMgPSB7ICJ1bmtub3duIiwgeyAuaTMyPTIgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogTWVkaWEtSW5pdGlhdG9yLVBhcnR5ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTI4OCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTWVkaWEtSW5pdGlhdG9yLVBhcnR5IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBNZXNzYWdlLUlEICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTIxMCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTWVzc2FnZS1JRCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogTWVzc2FnZS1TaXplICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTIxMiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTWVzc2FnZS1TaXplIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBNZXNzYWdlLVR5cGUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMjExLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJNZXNzYWdlLVR5cGUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKE1lc3NhZ2UtVHlwZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIm1fc2VuZF9yZXEiLCB7IC5pMzI9MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAibV9mb3J3YXJkX3JlcSIsIHsgLmkzMj0xMCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAibV9mb3J3YXJkX2NvbmYiLCB7IC5pMzI9MTEgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNCA9IHsgIm1fbWJveF9zdG9yZV9jb25mIiwgeyAuaTMyPTEyIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzUgPSB7ICJtX21ib3hfdmlld19jb25mIiwgeyAuaTMyPTEzIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzYgPSB7ICJtX21ib3hfdXBsb2FkX2NvbmYiLCB7IC5pMzI9MTQgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNyA9IHsgIm1fbWJveF9kZWxldGVfY29uZiIsIHsgLmkzMj0xNSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF84ID0geyAibV9zZW5kX2NvbmYiLCB7IC5pMzI9MiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF85ID0geyAibV9ub3RpZmljYXRpb25faW5kIiwgeyAuaTMyPTMgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTAgPSB7ICJtX25vdGlmeXJlc3BfaW5kIiwgeyAuaTMyPTQgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTEgPSB7ICJtX3JldHJpZXZlX2NvbmYiLCB7IC5pMzI9NSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xMiA9IHsgIm1fYWNrbm93bGVkZ2VfaW5kIiwgeyAuaTMyPTYgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTMgPSB7ICJtX2RlbGl2ZXJ5X2luZCIsIHsgLmkzMj03IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzE0ID0geyAibV9yZWFkX3JlY19pbmQiLCB7IC5pMzI9OCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xNSA9IHsgIm1fcmVhZF9vcmlnX2luZCIsIHsgLmkzMj05IH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF81LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzYsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF84LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzksIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTAsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTMsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTQsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTUsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIE1NQm94LVN0b3JhZ2UtUmVxdWVzdGVkICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTI0OCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTU1Cb3gtU3RvcmFnZS1SZXF1ZXN0ZWQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKE1NQm94LVN0b3JhZ2UtUmVxdWVzdGVkKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiTm8iLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiWWVzIiwgeyAuaTMyPTEgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIE1NVGVsLVNTZXJ2aWNlLVR5cGUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyMDMxLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJNTVRlbC1TU2VydmljZS1UeXBlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBNb25pdG9yZWQtUExNTi1JZGVudGlmaWVyICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzQzMCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTW9uaXRvcmVkLVBMTU4tSWRlbnRpZmllciIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogTW9uaXRvcmluZy1FdmVudC1Db25maWd1cmF0aW9uLUFjdGl2aXR5ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzkxOSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTW9uaXRvcmluZy1FdmVudC1Db25maWd1cmF0aW9uLUFjdGl2aXR5IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIE1vbml0b3JpbmctRXZlbnQtRnVuY3Rpb25hbGl0eSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM5MjIsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk1vbml0b3JpbmctRXZlbnQtRnVuY3Rpb25hbGl0eSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBNb25pdG9yaW5nLUV2ZW50LVJlcG9ydC1OdW1iZXIgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzOTIzLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJNb25pdG9yaW5nLUV2ZW50LVJlcG9ydC1OdW1iZXIiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIE1vbml0b3JpbmctVUUtSFBMTU4tSWRlbnRpZmllciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM0MzEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk1vbml0b3JpbmctVUUtSFBMTU4tSWRlbnRpZmllciIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogTW9uaXRvcmluZy1VRS1JZGVudGlmaWVyICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzQzMiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTW9uaXRvcmluZy1VRS1JZGVudGlmaWVyIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBNb25pdG9yaW5nLVVFLVZQTE1OLUlkZW50aWZpZXIgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzNDMzLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJNb25pdG9yaW5nLVVFLVZQTE1OLUlkZW50aWZpZXIiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIE1TQy1BZGRyZXNzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzQxNywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTVNDLUFkZHJlc3MiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBNVEMtSVdGLUFkZHJlc3MgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzNDA2LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJNVEMtSVdGLUFkZHJlc3MiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIEFkZHJlc3NfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIE5laWdoYm91ci1Ob2RlLUFkZHJlc3MgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyNzA1LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJOZWlnaGJvdXItTm9kZS1BZGRyZXNzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBBZGRyZXNzX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBOZXR3b3JrLUNhbGwtUmVmZXJlbmNlLU51bWJlciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM0MTgsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk5ldHdvcmstQ2FsbC1SZWZlcmVuY2UtTnVtYmVyIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogTk5JLVR5cGUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyNzA0LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJOTkktVHlwZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoTk5JLVR5cGUpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJub25fcm9hbWluZyIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJyb2FtaW5nX3dpdGhvdXRfbG9vcGJhY2siLCB7IC5pMzI9MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAicm9hbWluZ193aXRoX2xvb3BiYWNrIiwgeyAuaTMyPTIgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogTm9kZS1GdW5jdGlvbmFsaXR5ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJODYyLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJOb2RlLUZ1bmN0aW9uYWxpdHkiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKE5vZGUtRnVuY3Rpb25hbGl0eSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIlMtQ1NDRiIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJQLUNTQ0YiLCB7IC5pMzI9MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAiSS1DU0NGIiwgeyAuaTMyPTIgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNCA9IHsgIk1SRkMiLCB7IC5pMzI9MyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF81ID0geyAiTUdDRiIsIHsgLmkzMj00IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzYgPSB7ICJCR0NGIiwgeyAuaTMyPTUgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNyA9IHsgIkFTIiwgeyAuaTMyPTYgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfOCA9IHsgIklCQ0YiLCB7IC5pMzI9NyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF85ID0geyAiUy1HVyIsIHsgLmkzMj04IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEwID0geyAiUC1HVyIsIHsgLmkzMj05IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzExID0geyAiSFNHVyIsIHsgLmkzMj0xMCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xMiA9IHsgIkUtQ1NDRiIsIHsgLmkzMj0xMSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xMyA9IHsgIk1NRSIsIHsgLmkzMj0xMiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xNCA9IHsgIlRSRiIsIHsgLmkzMj0xMyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xNSA9IHsgIlRGIiwgeyAuaTMyPTE0IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzE2ID0geyAiQVRDRiIsIHsgLmkzMj0xNSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xNyA9IHsgIlByb3h5LWZ1bmN0aW9uIiwgeyAuaTMyPTE2IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzE4ID0geyAiZVBERyIsIHsgLmkzMj0xNyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xOSA9IHsgIlRERiIsIHsgLmkzMj0xOCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yMCA9IHsgIlRXQUciLCB7IC5pMzI9MTkgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMjEgPSB7ICJTQ0VGIiwgeyAuaTMyPTIwIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIyID0geyAiSVdLLVNDRUYiLCB7IC5pMzI9MjEgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF80LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzUsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF83LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzgsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfOSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xNCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xNSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xNiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xNywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xOCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xOSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yMCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogTm9kZS1JZCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTIwNjQsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk5vZGUtSWQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIE51bWJlci1PZi1EaXZlcnNpb25zICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjAzNCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTnVtYmVyLU9mLURpdmVyc2lvbnMiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIE51bWJlci1PZi1NZXNzYWdlcy1TZW50ICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjAxOSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTnVtYmVyLU9mLU1lc3NhZ2VzLVNlbnQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIE51bWJlci1PZi1QYXJ0aWNpcGFudHMgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk4ODUsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk51bWJlci1PZi1QYXJ0aWNpcGFudHMiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIE51bWJlci1PZi1SZWNlaXZlZC1UYWxrLUJ1cnN0cyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEyODIsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk51bWJlci1PZi1SZWNlaXZlZC1UYWxrLUJ1cnN0cyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogTnVtYmVyLU9mLVRhbGstQnVyc3RzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTI4MywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTnVtYmVyLU9mLVRhbGstQnVyc3RzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBOdW1iZXItUG9ydGFiaWxpdHktUm91dGluZy1JbmZvcm1hdGlvbiAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTIwMjQsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk51bWJlci1Qb3J0YWJpbGl0eS1Sb3V0aW5nLUluZm9ybWF0aW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBPbmxpbmUtQ2hhcmdpbmctRmxhZyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTIzMDMsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk9ubGluZS1DaGFyZ2luZy1GbGFnIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChPbmxpbmUtQ2hhcmdpbmctRmxhZykiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIkVDRl9hZGRyZXNzX25vdF9wcm92aWRlZCIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJFQ0ZfYWRkcmVzc19wcm92aWRlZCIsIHsgLmkzMj0xIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBPcmlnaW5hdGluZy1JT0kgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk4MzksCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk9yaWdpbmF0aW5nLUlPSSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogT3JpZ2luYXRvciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTg2NCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiT3JpZ2luYXRvciIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoT3JpZ2luYXRvcikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIkNhbGxpbmdfUGFydHkiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiQ2FsbGVkX1BhcnR5IiwgeyAuaTMyPTEgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIE9yaWdpbmF0b3ItU0NDUC1BZGRyZXNzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjAwOCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiT3JpZ2luYXRvci1TQ0NQLUFkZHJlc3MiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIEFkZHJlc3NfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIE91dGdvaW5nLVNlc3Npb24tSWQgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyMzIwLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJPdXRnb2luZy1TZXNzaW9uLUlkIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBPdXRnb2luZy1UcnVuay1Hcm91cC1JZCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTg1MywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiT3V0Z29pbmctVHJ1bmstR3JvdXAtSWQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFBhcnRpY2lwYW50LUFjY2Vzcy1Qcmlvcml0eSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEyNTksCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlBhcnRpY2lwYW50LUFjY2Vzcy1Qcmlvcml0eSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoUGFydGljaXBhbnQtQWNjZXNzLVByaW9yaXR5KSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiUHJlX2VtcHRpdmVfcHJpb3JpdHkiLCB7IC5pMzI9MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiSGlnaF9wcmlvcml0eSIsIHsgLmkzMj0yIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMgPSB7ICJOb3JtYWxfcHJpb3JpdHkiLCB7IC5pMzI9MyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF80ID0geyAiTG93X3ByaW9yaXR5IiwgeyAuaTMyPTQgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF80LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBQYXJ0aWNpcGFudC1BY3Rpb24tVHlwZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTIwNDksCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlBhcnRpY2lwYW50LUFjdGlvbi1UeXBlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChQYXJ0aWNpcGFudC1BY3Rpb24tVHlwZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIkNSRUFURV9DT05GIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIkpPSU5fQ09ORiIsIHsgLmkzMj0xIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMgPSB7ICJJTlZJVEVfSU5UT19DT05GIiwgeyAuaTMyPTIgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNCA9IHsgIlFVSVRfQ09ORiIsIHsgLmkzMj0zIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogUGFydGljaXBhbnRzLUludm9sdmVkICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJODg3LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJQYXJ0aWNpcGFudHMtSW52b2x2ZWQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFBDMy1Db250cm9sLVByb3RvY29sLUNhdXNlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzQzNCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUEMzLUNvbnRyb2wtUHJvdG9jb2wtQ2F1c2UiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogUEMzLUVQQy1Db250cm9sLVByb3RvY29sLUNhdXNlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzQzNSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUEMzLUVQQy1Db250cm9sLVByb3RvY29sLUNhdXNlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFBETi1Db25uZWN0aW9uLUNoYXJnaW5nLUlEICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjA1MCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUEROLUNvbm5lY3Rpb24tQ2hhcmdpbmctSUQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFBEUC1BZGRyZXNzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTIyNywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUERQLUFkZHJlc3MiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIEFkZHJlc3NfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFBEUC1BZGRyZXNzLVByZWZpeC1MZW5ndGggKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyNjA2LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJQRFAtQWRkcmVzcy1QcmVmaXgtTGVuZ3RoIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBQRFAtQ29udGV4dC1UeXBlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTI0NywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUERQLUNvbnRleHQtVHlwZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoUERQLUNvbnRleHQtVHlwZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIlByaW1hcnkiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiU2Vjb25kYXJ5IiwgeyAuaTMyPTEgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFBsYXktQWx0ZXJuYXRpdmUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzOTEzLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJQbGF5LUFsdGVybmF0aXZlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChQbGF5LUFsdGVybmF0aXZlKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAic2VydmVkX3BhcnR5IiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgInJlbW90ZV9wYXJ0eSIsIHsgLmkzMj0xIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBQb0MtQ2hhbmdlLUNvbmRpdGlvbiAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEyNjEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlBvQy1DaGFuZ2UtQ29uZGl0aW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChQb0MtQ2hhbmdlLUNvbmRpdGlvbikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIlNlcnZpY2VDaGFuZ2UiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiVm9sdW1lTGltaXQiLCB7IC5pMzI9MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAiVGltZUxpbWl0IiwgeyAuaTMyPTIgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNCA9IHsgIk51bWJlcm9mVGFsa0J1cnN0TGltaXQiLCB7IC5pMzI9MyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF81ID0geyAiTnVtYmVyb2ZBY3RpdmVQYXJ0aWNpcGFudHMiLCB7IC5pMzI9NCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF82ID0geyAiVGFyaWZmVGltZSIsIHsgLmkzMj01IH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF81LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzYsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFBvQy1DaGFuZ2UtVGltZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEyNjIsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlBvQy1DaGFuZ2UtVGltZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVGltZV90eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogUG9DLUNvbnRyb2xsaW5nLUFkZHJlc3MgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk4NTgsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlBvQy1Db250cm9sbGluZy1BZGRyZXNzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBQb0MtRXZlbnQtVHlwZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTIwMjUsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlBvQy1FdmVudC1UeXBlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChQb0MtRXZlbnQtVHlwZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIk5vcm1hbCIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJJbnN0YW50X1BlcnNvbmFsX0FsZXJ0IiwgeyAuaTMyPTEgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMyA9IHsgIlBvQ19Hcm91cF9BZHZlcnRpc2VtZW50IiwgeyAuaTMyPTIgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNCA9IHsgIkVhcmx5X1Nlc3Npb25fU2V0dGluZ19VcCIsIHsgLmkzMj0zIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzUgPSB7ICJQb0NfVGFsa19CdXJzdCIsIHsgLmkzMj00IH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF81LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBQb0MtR3JvdXAtTmFtZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTg1OSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUG9DLUdyb3VwLU5hbWUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFBvQy1TZXJ2ZXItUm9sZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTg4MywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUG9DLVNlcnZlci1Sb2xlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChQb0MtU2VydmVyLVJvbGUpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJQYXJ0aWNpcGF0aW5nX1BvQ19TZXJ2ZXIiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiQ29udHJvbGxpbmdfUG9DX1NlcnZlciIsIHsgLmkzMj0xIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBQb0MtU2Vzc2lvbi1JZCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEyMjksCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlBvQy1TZXNzaW9uLUlkIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBQb0MtU2Vzc2lvbi1Jbml0aWF0aW9uLVR5cGUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMjc3LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJQb0MtU2Vzc2lvbi1Jbml0aWF0aW9uLVR5cGUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFBvQy1TZXNzaW9uLUluaXRpYXRpb24tVHlwZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIlByZV9lc3RhYmxpc2hlZCIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJPbl9kZW1hbmQiLCB7IC5pMzI9MSB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogUG9DLVNlc3Npb24tVHlwZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTg4NCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUG9DLVNlc3Npb24tVHlwZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoUG9DLVNlc3Npb24tVHlwZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIjFfdG9fMV9Qb0MiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiQ2hhdF9Qb0NfR3JvdXAiLCB7IC5pMzI9MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAiUHJlX2FycmFuZ2VkX1BvQ19Hcm91cCIsIHsgLmkzMj0yIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzQgPSB7ICJBZF9ob2NfUG9DX0dyb3B1IiwgeyAuaTMyPTMgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF80LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBQb0MtVXNlci1Sb2xlLUlEcyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEyNTMsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlBvQy1Vc2VyLVJvbGUtSURzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBQb0MtVXNlci1Sb2xlLUluZm8tVW5pdHMgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMjU0LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJQb0MtVXNlci1Sb2xlLUluZm8tVW5pdHMiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFBvQy1Vc2VyLVJvbGUtSW5mby1Vbml0cykiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIk1vZGVyYXRvciIsIHsgLmkzMj0xIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJEaXNwYXRjaGVyIiwgeyAuaTMyPTIgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMyA9IHsgIlNlc3Npb25fT3duZXIiLCB7IC5pMzI9MyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF80ID0geyAiU2Vzc2lvbl9QYXJ0aWNpcGFudCIsIHsgLmkzMj00IH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogUG9zaXRpb25pbmctRGF0YSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEyNDUsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlBvc2l0aW9uaW5nLURhdGEiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFByZWZlcnJlZC1Bb0MtQ3VycmVuY3kgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyMzE1LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJQcmVmZXJyZWQtQW9DLUN1cnJlbmN5IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBQcmlvcml0eSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEyMDksCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlByaW9yaXR5IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChQcmlvcml0eSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIkxvdyIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJOb3JtYWwiLCB7IC5pMzI9MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAiSGlnaCIsIHsgLmkzMj0yIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFByaXZhY3ktSW5kaWNhdG9yICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzkxNSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUHJpdmFjeS1JbmRpY2F0b3IiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFByaXZhY3ktSW5kaWNhdG9yKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiTk9UX1BSSVZBVEUiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiUFJJVkFURSIsIHsgLmkzMj0xIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBQcm9TZS0zcmQtUGFydHktQXBwbGljYXRpb24tSUQgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzNDQwLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJQcm9TZS0zcmQtUGFydHktQXBwbGljYXRpb24tSUQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFByb1NlLURpcmVjdC1EaXNjb3ZlcnktTW9kZWwgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzNDQyLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJQcm9TZS1EaXJlY3QtRGlzY292ZXJ5LU1vZGVsIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChQcm9TZS1EaXJlY3QtRGlzY292ZXJ5LU1vZGVsKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiTW9kZWxfQSIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJNb2RlbF9CIiwgeyAuaTMyPTEgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFByb1NlLUV2ZW50LVR5cGUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzNDQzLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJQcm9TZS1FdmVudC1UeXBlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChQcm9TZS1FdmVudC1UeXBlKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiQW5ub3VjaW5nIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIk1vbml0b3JpbmciLCB7IC5pMzI9MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAiTWF0Y2hfUmVwb3J0IiwgeyAuaTMyPTIgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogUHJvU2UtRnVuY3Rpb24tSVAtQWRkcmVzcyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM0NDQsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlByb1NlLUZ1bmN0aW9uLUlQLUFkZHJlc3MiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIEFkZHJlc3NfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFByb1NlLUZ1bmN0aW9uLVBMTU4tSWRlbnRpZmllciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM0NTcsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlByb1NlLUZ1bmN0aW9uLVBMTU4tSWRlbnRpZmllciIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogUHJvU2UtRnVuY3Rpb25hbGl0eSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM0NDUsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlByb1NlLUZ1bmN0aW9uYWxpdHkiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFByb1NlLUZ1bmN0aW9uYWxpdHkpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJEaXJlY3RfZGlzY292ZXJ5IiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIkVQQ19sZXZlbF9kaXNjb3ZlcnkiLCB7IC5pMzI9MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAiRGlyZWN0X2NvbW11bmljYXRpb24iLCB7IC5pMzI9MiB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBQcm9TZS1Hcm91cC1JUC1NdWx0aWNhc3QtQWRkcmVzcyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM0NDYsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlByb1NlLUdyb3VwLUlQLU11bHRpY2FzdC1BZGRyZXNzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBBZGRyZXNzX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBQcm9TZS1SYW5nZS1DbGFzcyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM0NDgsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlByb1NlLVJhbmdlLUNsYXNzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChQcm9TZS1SYW5nZS1DbGFzcykiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIlJlc2VydmVkIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIjUwX20iLCB7IC5pMzI9MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAiMTAwX20iLCB7IC5pMzI9MiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF80ID0geyAiVW51c2VkIiwgeyAuaTMyPTI1NSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF81ID0geyAiMjAwX20iLCB7IC5pMzI9MyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF82ID0geyAiNTAwX20iLCB7IC5pMzI9NCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF83ID0geyAiMTAwMF9tIiwgeyAuaTMyPTUgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF80LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzUsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF83LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBQcm9TZS1SZWFzb24tRm9yLUNhbmNlbGxhdGlvbiAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM0NDksCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlByb1NlLVJlYXNvbi1Gb3ItQ2FuY2VsbGF0aW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChQcm9TZS1SZWFzb24tRm9yLUNhbmNlbGxhdGlvbikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIlByb3hpbWl0eV9BbGVydF9zZW50IiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIlRpbWVfZXhwaXJlZF93aXRoX25vX3JlbmV3YWwiLCB7IC5pMzI9MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAiUmVxdWVzdG9yX2NhbmNlbGxhdGlvbiIsIHsgLmkzMj0yIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFByb1NlLVJlcXVlc3QtVGltZXN0YW1wICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzQ1MCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUHJvU2UtUmVxdWVzdC1UaW1lc3RhbXAiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFRpbWVfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFByb1NlLVJvbGUtT2YtVUUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzNDUxLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJQcm9TZS1Sb2xlLU9mLVVFIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChQcm9TZS1Sb2xlLU9mLVVFKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiQW5ub3VuY2luZ19VRSIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJNb25pdG9yaW5nX1VFIiwgeyAuaTMyPTEgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMyA9IHsgIlJlcXVlc3Rvcl9VRSIsIHsgLmkzMj0yIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzQgPSB7ICJSZXF1ZXN0ZWRfVUUiLCB7IC5pMzI9MyB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzQsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFByb1NlLVNvdXJjZS1JUC1BZGRyZXNzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzQ1MiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUHJvU2UtU291cmNlLUlQLUFkZHJlc3MiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIEFkZHJlc3NfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFByb1NlLVVFLUlEICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzQ1MywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUHJvU2UtVUUtSUQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBQcm94aW1pdHktQWxlcnQtSW5kaWNhdGlvbiAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM0NTQsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlByb3hpbWl0eS1BbGVydC1JbmRpY2F0aW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChQcm94aW1pdHktQWxlcnQtSW5kaWNhdGlvbikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIkFsZXJ0IiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIk5vX0FsZXJ0IiwgeyAuaTMyPTEgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFByb3hpbWl0eS1BbGVydC1UaW1lc3RhbXAgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzNDU1LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJQcm94aW1pdHktQWxlcnQtVGltZXN0YW1wIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBUaW1lX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBQcm94aW1pdHktQ2FuY2VsbGF0aW9uLVRpbWVzdGFtcCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM0NTYsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlByb3hpbWl0eS1DYW5jZWxsYXRpb24tVGltZXN0YW1wIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBUaW1lX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBQUy1BcHBlbmQtRnJlZS1Gb3JtYXQtRGF0YSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTg2NywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUFMtQXBwZW5kLUZyZWUtRm9ybWF0LURhdGEiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFBTLUFwcGVuZC1GcmVlLUZvcm1hdC1EYXRhKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiQXBwZW5kIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIk92ZXJ3cml0ZSIsIHsgLmkzMj0xIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBQUy1GcmVlLUZvcm1hdC1EYXRhICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJODY2LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJQUy1GcmVlLUZvcm1hdC1EYXRhIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogUXVvdGEtQ29uc3VtcHRpb24tVGltZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTg4MSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUXVvdGEtQ29uc3VtcHRpb24tVGltZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogUXVvdGEtSG9sZGluZy1UaW1lICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJODcxLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJRdW90YS1Ib2xkaW5nLVRpbWUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFF1b3RhLUluZGljYXRvciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM5MTIsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlF1b3RhLUluZGljYXRvciIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoUXVvdGEtSW5kaWNhdG9yKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiUVVPVEFfSVNfTk9UX1VTRURfRFVSSU5HX1BMQVlCQUNLIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIlFVT1RBX0lTX1VTRURfRFVSSU5HX1BMQVlCQUNLIiwgeyAuaTMyPTEgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFJhZGlvLUZyZXF1ZW5jeSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM0NjIsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlJhZGlvLUZyZXF1ZW5jeSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFJhZGlvLVBhcmFtZXRlci1TZXQtVmFsdWVzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzQ2NCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUmFkaW8tUGFyYW1ldGVyLVNldC1WYWx1ZXMiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBSYWRpby1SZXNvdXJjZXMtSW5kaWNhdG9yICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzQ2NSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUmFkaW8tUmVzb3VyY2VzLUluZGljYXRvciIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBSYXRlLUNvbnRyb2wtTWF4LU1lc3NhZ2UtU2l6ZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM5MzcsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlJhdGUtQ29udHJvbC1NYXgtTWVzc2FnZS1TaXplIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBSYXRlLUNvbnRyb2wtTWF4LVJhdGUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzOTM4LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJSYXRlLUNvbnRyb2wtTWF4LVJhdGUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFJhdGUtQ29udHJvbC1UaW1lLVVuaXQgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzOTM5LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJSYXRlLUNvbnRyb2wtVGltZS1Vbml0IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBSZWFkLVJlcGx5LVJlcG9ydC1SZXF1ZXN0ZWQgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMjIyLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJSZWFkLVJlcGx5LVJlcG9ydC1SZXF1ZXN0ZWQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFJlYWQtUmVwbHktUmVwb3J0LVJlcXVlc3RlZCkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIk5vIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIlllcyIsIHsgLmkzMj0xIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBSZWFzb24tSGVhZGVyICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzQwMSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUmVhc29uLUhlYWRlciIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogUmVjZWl2ZWQtVGFsay1CdXJzdC1UaW1lICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTI4NCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUmVjZWl2ZWQtVGFsay1CdXJzdC1UaW1lIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBSZWNlaXZlZC1UYWxrLUJ1cnN0LVZvbHVtZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEyODUsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlJlY2VpdmVkLVRhbGstQnVyc3QtVm9sdW1lIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBSZWNpcGllbnQtU0NDUC1BZGRyZXNzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjAxMCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUmVjaXBpZW50LVNDQ1AtQWRkcmVzcyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgQWRkcmVzc190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogUmVmdW5kLUluZm9ybWF0aW9uICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjAyMiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUmVmdW5kLUluZm9ybWF0aW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogUmVsYXRlZC1JTVMtQ2hhcmdpbmctSWRlbnRpZmllciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTI3MTEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlJlbGF0ZWQtSU1TLUNoYXJnaW5nLUlkZW50aWZpZXIiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFJlbGF0ZWQtSU1TLUNoYXJnaW5nLUlkZW50aWZpZXItTm9kZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTI3MTIsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlJlbGF0ZWQtSU1TLUNoYXJnaW5nLUlkZW50aWZpZXItTm9kZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgQWRkcmVzc190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogUmVsYXRpb25zaGlwLU1vZGUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyNzA2LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJSZWxhdGlvbnNoaXAtTW9kZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoUmVsYXRpb25zaGlwLU1vZGUpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJ0cnVzdGVkIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIm5vbl90cnVzdGVkIiwgeyAuaTMyPTEgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFJlcGx5LUFwcGxpYy1JRCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEyMjMsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlJlcGx5LUFwcGxpYy1JRCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogUmVwbHktUGF0aC1SZXF1ZXN0ZWQgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyMDExLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJSZXBseS1QYXRoLVJlcXVlc3RlZCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoUmVwbHktUGF0aC1SZXF1ZXN0ZWQpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJOb19SZXBseV9QYXRoX1NldCIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJSZXBseV9wYXRoX1NldCIsIHsgLmkzMj0xIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBSZXBvcnRpbmctUmVhc29uICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJODcyLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJSZXBvcnRpbmctUmVhc29uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChSZXBvcnRpbmctUmVhc29uKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiVEhSRVNIT0xEIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIlFIVCIsIHsgLmkzMj0xIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMgPSB7ICJGSU5BTCIsIHsgLmkzMj0yIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzQgPSB7ICJRVU9UQV9FWEhBVVNURUQiLCB7IC5pMzI9MyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF81ID0geyAiVkFMSURJVFlfVElNRSIsIHsgLmkzMj00IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzYgPSB7ICJPVEhFUl9RVU9UQV9UWVBFIiwgeyAuaTMyPTUgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNyA9IHsgIlJBVElOR19DT05ESVRJT05fQ0hBTkdFIiwgeyAuaTMyPTYgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfOCA9IHsgIkZPUkNFRF9SRUFVVEhPUklTQVRJT04iLCB7IC5pMzI9NyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF85ID0geyAiUE9PTF9FWEhBVVNURUQiLCB7IC5pMzI9OCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xMCA9IHsgIlVOVVNFRF9RVU9UQV9USU1FUiIsIHsgLmkzMj05IH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF81LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzYsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF84LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzksIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTAsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFJlcXVlc3RlZC1QYXJ0eS1BZGRyZXNzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTI1MSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUmVxdWVzdGVkLVBhcnR5LUFkZHJlc3MiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFJlcXVlc3RlZC1QTE1OLUlkZW50aWZpZXIgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzNDM2LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJSZXF1ZXN0ZWQtUExNTi1JZGVudGlmaWVyIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBSZXF1ZXN0b3ItUExNTi1JZGVudGlmaWVyICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzQzNywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUmVxdWVzdG9yLVBMTU4tSWRlbnRpZmllciIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogUm9sZS1PZi1Ob2RlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJODI5LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJSb2xlLU9mLU5vZGUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFJvbGUtT2YtTm9kZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIk9SSUdJTkFUSU5HX1JPTEUiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiVEVSTUlOQVRJTkdfUk9MRSIsIHsgLmkzMj0xIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMgPSB7ICJGT1JXQVJESU5HX1JPTEUiLCB7IC5pMzI9MiB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBSb2xlLU9mLVByb1NlLUZ1bmN0aW9uICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzQzOCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUm9sZS1PZi1Qcm9TZS1GdW5jdGlvbiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoUm9sZS1PZi1Qcm9TZS1GdW5jdGlvbikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIkhQTE1OIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIlZQTE1OIiwgeyAuaTMyPTEgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMyA9IHsgIkxvY2FsX1BMTU4iLCB7IC5pMzI9MiB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBSb3V0ZS1IZWFkZXItUmVjZWl2ZWQgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzNDAzLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJSb3V0ZS1IZWFkZXItUmVjZWl2ZWQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFJvdXRlLUhlYWRlci1UcmFuc21pdHRlZCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM0MDQsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlJvdXRlLUhlYWRlci1UcmFuc21pdHRlZCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogU0NTLUFkZHJlc3MgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzOTQxLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTQ1MtQWRkcmVzcyIsCS8qIE5hbWUgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBBZGRyZXNzX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBTQ1MtUmVhbG0gKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzOTQyLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTQ1MtUmVhbG0iLAkvKiBOYW1lICovCisJCQkJMCwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgRGlhbWV0ZXJJZGVudGl0eV90eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogU0RQLUFuc3dlci1UaW1lc3RhbXAgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMjc1LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTRFAtQW5zd2VyLVRpbWVzdGFtcCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVGltZV90eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogU0RQLU1lZGlhLURlc2NyaXB0aW9uICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJODQ1LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTRFAtTWVkaWEtRGVzY3JpcHRpb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFNEUC1NZWRpYS1OYW1lICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJODQ0LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTRFAtTWVkaWEtTmFtZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogU0RQLU9mZmVyLVRpbWVzdGFtcCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEyNzQsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlNEUC1PZmZlci1UaW1lc3RhbXAiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFRpbWVfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFNEUC1TZXNzaW9uLURlc2NyaXB0aW9uICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJODQyLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTRFAtU2Vzc2lvbi1EZXNjcmlwdGlvbiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogU0RQLVR5cGUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyMDM2LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTRFAtVHlwZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoU0RQLVR5cGUpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJTRFBfT2ZmZXIiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiU0RQX0Fuc3dlciIsIHsgLmkzMj0xIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBTZXJ2aW5nLU5vZGUtSWRlbnRpdHkgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzOTI5LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTZXJ2aW5nLU5vZGUtSWRlbnRpdHkiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIERpYW1ldGVySWRlbnRpdHlfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFNlcnZlZC1QYXJ0eS1JUC1BZGRyZXNzICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJODQ4LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTZXJ2ZWQtUGFydHktSVAtQWRkcmVzcyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgQWRkcmVzc190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogU2VydmljZS1JZCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTg1NSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiU2VydmljZS1JZCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogU2VydmljZS1Nb2RlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjAzMiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiU2VydmljZS1Nb2RlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBTZXJ2aWNlLVNwZWNpZmljLURhdGEgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk4NjMsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlNlcnZpY2UtU3BlY2lmaWMtRGF0YSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogU2VydmljZS1TcGVjaWZpYy1UeXBlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTI1NywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiU2VydmljZS1TcGVjaWZpYy1UeXBlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBTZXJ2aW5nLU5vZGUtVHlwZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTIwNDcsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlNlcnZpbmctTm9kZS1UeXBlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChTZXJ2aW5nLU5vZGUtVHlwZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIlNHU04iLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiUE1JUFNHVyIsIHsgLmkzMj0xIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMgPSB7ICJHVFBTR1ciLCB7IC5pMzI9MiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF80ID0geyAiZVBERyIsIHsgLmkzMj0zIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzUgPSB7ICJoU0dXIiwgeyAuaTMyPTQgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNiA9IHsgIk1NRSIsIHsgLmkzMj01IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzcgPSB7ICJUV0FOIiwgeyAuaTMyPTYgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF80LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzUsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF83LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBTZXNzaW9uLURpcmVjdGlvbiAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTI3MDcsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlNlc3Npb24tRGlyZWN0aW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChTZXNzaW9uLURpcmVjdGlvbikiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgImluYm91bmQiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAib3V0Ym91bmQiLCB7IC5pMzI9MSB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogU0dpLVB0UC1UdW5uZWxsaW5nLU1ldGhvZCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM5MzEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlNHaS1QdFAtVHVubmVsbGluZy1NZXRob2QiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFNHaS1QdFAtVHVubmVsbGluZy1NZXRob2QpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJVRFBfSVBfYmFzZWQiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiT3RoZXJzIiwgeyAuaTMyPTEgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFNHU04tQWRkcmVzcyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEyMjgsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlNHU04tQWRkcmVzcyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgQWRkcmVzc190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogU0dXLUFkZHJlc3MgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyMDY3LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTR1ctQWRkcmVzcyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgQWRkcmVzc190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogU0dXLUNoYW5nZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTIwNjUsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlNHVy1DaGFuZ2UiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFNHVy1DaGFuZ2UpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJBQ1JfU3RhcnRfTk9UX2R1ZV90b19TR1dfQ2hhbmdlIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIkFDUl9TdGFydF9kdWVfdG9fU0dXX0NoYW5nZSIsIHsgLmkzMj0xIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBTSVAtTWV0aG9kICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJODI0LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTSVAtTWV0aG9kIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBTSVAtUmVxdWVzdC1UaW1lc3RhbXAgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk4MzQsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlNJUC1SZXF1ZXN0LVRpbWVzdGFtcCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVGltZV90eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogU0lQLVJlcXVlc3QtVGltZXN0YW1wLUZyYWN0aW9uICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjMwMSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiU0lQLVJlcXVlc3QtVGltZXN0YW1wLUZyYWN0aW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBTSVAtUmVzcG9uc2UtVGltZXN0YW1wICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJODM1LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTSVAtUmVzcG9uc2UtVGltZXN0YW1wIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBUaW1lX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBTSVAtUmVzcG9uc2UtVGltZXN0YW1wLUZyYWN0aW9uICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjMwMiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiU0lQLVJlc3BvbnNlLVRpbWVzdGFtcC1GcmFjdGlvbiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogU00tRGV2aWNlLVRyaWdnZXItSW5kaWNhdG9yICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzQwNywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiU00tRGV2aWNlLVRyaWdnZXItSW5kaWNhdG9yIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChTTS1EZXZpY2UtVHJpZ2dlci1JbmRpY2F0b3IpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJOb3RfRGV2aWNlVHJpZ2dlciIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJEZXZpY2VfVHJpZ2dlciIsIHsgLmkzMj0xIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBTTS1EaXNjaGFyZ2UtVGltZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTIwMTIsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlNNLURpc2NoYXJnZS1UaW1lIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBUaW1lX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBTTS1NZXNzYWdlLVR5cGUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyMDA3LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTTS1NZXNzYWdlLVR5cGUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFNNLU1lc3NhZ2UtVHlwZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIlNVQk1JU1NJT04iLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiREVMSVZFUllfUkVQT1JUIiwgeyAuaTMyPTEgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMyA9IHsgIlNNX1NlcnZpY2VfUmVxdWVzdCIsIHsgLmkzMj0yIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFNNLVByb3RvY29sLUlEICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjAxMywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiU00tUHJvdG9jb2wtSUQiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBTTS1TZXF1ZW5jZS1OdW1iZXIgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzNDA4LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTTS1TZXF1ZW5jZS1OdW1iZXIiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFNNLVNlcnZpY2UtVHlwZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTIwMjksCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlNNLVNlcnZpY2UtVHlwZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoU00tU2VydmljZS1UeXBlKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiVkFTNFNNU19TaG9ydF9NZXNzYWdlX2NvbnRlbnRfcHJvY2Vzc2luZyIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJWQVM0U01TX1Nob3J0X01lc3NhZ2VfZm9yd2FyZGluZyIsIHsgLmkzMj0xIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMgPSB7ICJWQVM0U01TX1Nob3J0X01lc3NhZ2VfRGVmZXJyZWRfRGVsaXZlcnkiLCB7IC5pMzI9MTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfNCA9IHsgIlZBUzRTTVNfU2hvcnRfTWVzc2FnZV9Gb3J3YXJkaW5nX211bHRpcGxlX3N1YnNjcmlwdGlvbnMiLCB7IC5pMzI9MiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF81ID0geyAiVkFTNFNNU19TaG9ydF9NZXNzYWdlX2ZpbHRlcmluZyIsIHsgLmkzMj0zIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzYgPSB7ICJWQVM0U01TX1Nob3J0X01lc3NhZ2VfcmVjZWlwdCIsIHsgLmkzMj00IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzcgPSB7ICJWQVM0U01TX1Nob3J0X01lc3NhZ2VfTmV0d29ya19TdG9yYWdlIiwgeyAuaTMyPTUgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfOCA9IHsgIlZBUzRTTVNfU2hvcnRfTWVzc2FnZV90b19tdWx0aXBsZV9kZXN0aW5hdGlvbnMiLCB7IC5pMzI9NiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF85ID0geyAiVkFTNFNNU19TaG9ydF9NZXNzYWdlX0F1dG9fUmVwbHkiLCB7IC5pMzI9OCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xMCA9IHsgIlZBUzRTTVNfU2hvcnRfTWVzc2FnZV9QZXJzb25hbF9TaWduYXR1cmUiLCB7IC5pMzI9OSB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzQsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF82LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzcsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfOCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF85LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEwLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIHR5cGUsIE5VTEwpOworCQl9OworCQkvKiBTTS1TdGF0dXMgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyMDE0LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTTS1TdGF0dXMiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBTTS1Vc2VyLURhdGEtSGVhZGVyICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjAxNSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiU00tVXNlci1EYXRhLUhlYWRlciIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFNNUy1Ob2RlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjAxNiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiU01TLU5vZGUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFNNUy1Ob2RlKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiU01TX1JvdXRlciIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJJUF9TTV9HVyIsIHsgLmkzMj0xIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMgPSB7ICJTTVNfUm91dGVyX2FuZF9JUF9TTV9HVyIsIHsgLmkzMj0yIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzQgPSB7ICJTTVNfU0MiLCB7IC5pMzI9MyB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzQsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFNNUy1SZXN1bHQgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzNDA5LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTTVMtUmVzdWx0IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBTTVNDLUFkZHJlc3MgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyMDE3LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTTVNDLUFkZHJlc3MiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIEFkZHJlc3NfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFN0YXJ0LW9mLUNoYXJnaW5nICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzQxOSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiU3RhcnQtb2YtQ2hhcmdpbmciLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFRpbWVfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFN0YXJ0LVRpbWUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyMDQxLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTdGFydC1UaW1lIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBUaW1lX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBTdGF0dXMtQVMtQ29kZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTI3MDIsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlN0YXR1cy1BUy1Db2RlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChTdGF0dXMtQVMtQ29kZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIjR4eCIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICI1eHgiLCB7IC5pMzI9MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAiVGltZW91dCIsIHsgLmkzMj0yIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFN0b3AtVGltZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTIwNDIsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlN0b3AtVGltZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVGltZV90eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogU3VibWlzc2lvbi1UaW1lICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTIwMiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiU3VibWlzc2lvbi1UaW1lIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBUaW1lX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBTdWJzY3JpYmVyLVJvbGUgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyMDMzLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTdWJzY3JpYmVyLVJvbGUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFN1YnNjcmliZXItUm9sZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIk9yaWdpbmF0aW5nIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIlRlcm1pbmF0aW5nIiwgeyAuaTMyPTEgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFRBRC1JZGVudGlmaWVyICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjcxNywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiVEFELUlkZW50aWZpZXIiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFRBRC1JZGVudGlmaWVyKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiQ1MiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiUFMiLCB7IC5pMzI9MSB9fTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCB0eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogVGFsay1CdXJzdC1UaW1lICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTI4NiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiVGFsay1CdXJzdC1UaW1lIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBUYWxrLUJ1cnN0LVZvbHVtZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEyODcsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlRhbGstQnVyc3QtVm9sdW1lIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBUYXJpZmYtWE1MICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjMwNiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiVGFyaWZmLVhNTCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogVGVsZXNlcnZpY2UgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzNDEzLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJUZWxlc2VydmljZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFRlcm1pbmF0aW5nLUlPSSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTg0MCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiVGVybWluYXRpbmctSU9JIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBUaW1lLUZpcnN0LVJlY2VwdGlvbiAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM0NjYsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlRpbWUtRmlyc3QtUmVjZXB0aW9uIiwJLyogTmFtZSAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJMCwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFRpbWVfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFRpbWUtRmlyc3QtVHJhbnNtaXNzaW9uICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzQ2NywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiVGltZS1GaXJzdC1UcmFuc21pc3Npb24iLAkvKiBOYW1lICovCisJCQkJMCwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVGltZV90eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogVGltZS1GaXJzdC1Vc2FnZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTIwNDMsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlRpbWUtRmlyc3QtVXNhZ2UiLAkvKiBOYW1lICovCisJCQkJMCwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVGltZV90eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogVGltZS1JbmRpY2F0b3IgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzOTExLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJUaW1lLUluZGljYXRvciIsCS8qIE5hbWUgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBUaW1lLUxhc3QtVXNhZ2UgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyMDQ0LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJUaW1lLUxhc3QtVXNhZ2UiLAkvKiBOYW1lICovCisJCQkJMCwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgVGltZV90eXBlLCBOVUxMKTsKKwkJfTsKKwkJLyogVGltZS1RdW90YS1UaHJlc2hvbGQgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk4NjgsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlRpbWUtUXVvdGEtVGhyZXNob2xkIiwJLyogTmFtZSAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJMCwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFRpbWUtUXVvdGEtVHlwZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEyNzEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlRpbWUtUXVvdGEtVHlwZSIsCS8qIE5hbWUgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChUaW1lLVF1b3RhLVR5cGUpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJESVNDUkVURV9USU1FX1BFUklPRCIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJDT05USU5VT1VTX1RJTUVfUEVSSU9EIiwgeyAuaTMyPTEgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFRpbWUtVXNhZ2UgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyMDQ1LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJUaW1lLVVzYWdlIiwJLyogTmFtZSAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJMCwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFRva2VuLVRleHQgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMjE1LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJUb2tlbi1UZXh0IiwJLyogTmFtZSAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJMCwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFRyYW5zY29kZXItSW5zZXJ0ZWQtSW5kaWNhdGlvbiAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTI2MDUsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlRyYW5zY29kZXItSW5zZXJ0ZWQtSW5kaWNhdGlvbiIsCS8qIE5hbWUgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfSU5URUdFUjMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAgICAqdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICAgdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwgIjNHUFAvRW51bWVyYXRlZChUcmFuc2NvZGVyLUluc2VydGVkLUluZGljYXRpb24pIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJUcmFuc2NvZGVyX05vdF9JbnNlcnRlZCIsIHsgLmkzMj0wIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIgPSB7ICJUcmFuc2NvZGVyX0luc2VydGVkIiwgeyAuaTMyPTEgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFRyYW5zaXQtSU9JLUxpc3QgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyNzAxLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJUcmFuc2l0LUlPSS1MaXN0IiwJLyogTmFtZSAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJMCwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFRyaWdnZXItVHlwZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTg3MCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiVHJpZ2dlci1UeXBlIiwJLyogTmFtZSAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJMCwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFRyaWdnZXItVHlwZSkiLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMSA9IHsgIkNIQU5HRV9JTl9TR1NOX0lQX0FERFJFU1MiLCB7IC5pMzI9MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiQ0hBTkdFX0lOX1FPUyIsIHsgLmkzMj0yIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMgPSB7ICJDSEFOR0VfSU5fTE9DQVRJT04iLCB7IC5pMzI9MyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF80ID0geyAiQ0hBTkdFX0lOX1JBVCIsIHsgLmkzMj00IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzUgPSB7ICJDSEFOR0VfSU5fVUVfVElNRVpPTkUiLCB7IC5pMzI9NSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF82ID0geyAiQ0hBTkdFSU5RT1NfVFJBRkZJQ19DTEFTUyIsIHsgLmkzMj0xMCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF83ID0geyAiQ0hBTkdFSU5RT1NfUkVMSUFCSUxJVFlfQ0xBU1MiLCB7IC5pMzI9MTEgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfOCA9IHsgIkNIQU5HRUlOUU9TX0RFTEFZX0NMQVNTIiwgeyAuaTMyPTEyIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzkgPSB7ICJDSEFOR0VJTlFPU19QRUFLX1RIUk9VR0hQVVQiLCB7IC5pMzI9MTMgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTAgPSB7ICJDSEFOR0VJTlFPU19QUkVDRURFTkNFX0NMQVNTIiwgeyAuaTMyPTE0IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzExID0geyAiQ0hBTkdFSU5RT1NfTUVBTl9USFJPVUdIUFVUIiwgeyAuaTMyPTE1IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEyID0geyAiQ0hBTkdFSU5RT1NfTUFYSU1VTV9CSVRfUkFURV9GT1JfVVBMSU5LIiwgeyAuaTMyPTE2IH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEzID0geyAiQ0hBTkdFSU5RT1NfTUFYSU1VTV9CSVRfUkFURV9GT1JfRE9XTkxJTksiLCB7IC5pMzI9MTcgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTQgPSB7ICJDSEFOR0VJTlFPU19SRVNJRFVBTF9CRVIiLCB7IC5pMzI9MTggfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTUgPSB7ICJDSEFOR0VJTlFPU19TRFVfRVJST1JfUkFUSU8iLCB7IC5pMzI9MTkgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTYgPSB7ICJDSEFOR0VJTlFPU19UUkFOU0ZFUl9ERUxBWSIsIHsgLmkzMj0yMCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xNyA9IHsgIkNIQU5HRUlOUU9TX1RSQUZGSUNfSEFORExJTkdfUFJJT1JJVFkiLCB7IC5pMzI9MjEgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTggPSB7ICJDSEFOR0VJTlFPU19HVUFSQU5URUVEX0JJVF9SQVRFX0ZPUl9VUExJTksiLCB7IC5pMzI9MjIgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMTkgPSB7ICJDSEFOR0VJTlFPU19HVUFSQU5URUVEX0JJVF9SQVRFX0ZPUl9ET1dOTElOSyIsIHsgLmkzMj0yMyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yMCA9IHsgIkNIQU5HRUlOUU9TX0FQTl9BR0dSRUdBVEVfTUFYSU1VTV9CSVRfUkFURSIsIHsgLmkzMj0yNCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yMSA9IHsgIkNIQU5HRUlOTE9DQVRJT05fTUNDIiwgeyAuaTMyPTMwIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzIyID0geyAiQ0hBTkdFSU5MT0NBVElPTl9NTkMiLCB7IC5pMzI9MzEgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMjMgPSB7ICJDSEFOR0VJTkxPQ0FUSU9OX1JBQyIsIHsgLmkzMj0zMiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yNCA9IHsgIkNIQU5HRUlOTE9DQVRJT05fTEFDIiwgeyAuaTMyPTMzIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzI1ID0geyAiQ0hBTkdFSU5MT0NBVElPTl9DZWxsSWQiLCB7IC5pMzI9MzQgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMjYgPSB7ICJDSEFOR0VJTkxPQ0FUSU9OX1RBQyIsIHsgLmkzMj0zNSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yNyA9IHsgIkNIQU5HRUlOTE9DQVRJT05fRUNHSSIsIHsgLmkzMj0zNiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yOCA9IHsgIkNIQU5HRV9JTl9NRURJQV9DT01QT1NJVElPTiIsIHsgLmkzMj00MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yOSA9IHsgIkNIQU5HRV9JTl9QQVJUSUNJUEFOVFNfTk1CIiwgeyAuaTMyPTUwIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzMwID0geyAiQ0hBTkdFX0lOX1RIUlNITERfT0ZfUEFSVElDSVBBTlRTX05NQiIsIHsgLmkzMj01MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zMSA9IHsgIkNIQU5HRV9JTl9VU0VSX1BBUlRJQ0lQQVRJTkdfVFlQRSIsIHsgLmkzMj01MiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zMiA9IHsgIkNIQU5HRV9JTl9TRVJWSUNFX0NPTkRJVElPTiIsIHsgLmkzMj02MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zMyA9IHsgIkNIQU5HRV9JTl9TRVJWSU5HX05PREUiLCB7IC5pMzI9NjEgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMzQgPSB7ICJDSEFOR0VfSU5fQUNDRVNTX0ZPUl9BX1NFUlZJQ0VfREFUQV9GTE9XIiwgeyAuaTMyPTYyIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzM1ID0geyAiQ0hBTkdFX0lOX1VTRVJfQ1NHX0lORk9STUFUSU9OIiwgeyAuaTMyPTcwIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzM2ID0geyAiQ0hBTkdFX0lOX0hZQlJJRF9TVUJTQ1JJQkVEX1VTRVJfQ1NHX0lORk9STUFUSU9OIiwgeyAuaTMyPTcxIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzM3ID0geyAiQ0hBTkdFX0lOX0hZQlJJRF9VTlNVQlNDUklCRURfVVNFUl9DU0dfSU5GT1JNQVRJT04iLCB7IC5pMzI9NzIgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMzggPSB7ICJDSEFOR0VfT0ZfVUVfUFJFU0VOQ0VfSU5fUFJFU0VOQ0VfUkVQT1JUSU5HX0FSRUEiLCB7IC5pMzI9NzMgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMzkgPSB7ICJDSEFOR0VfSU5fQVBOX1JBVEVfQ09OVFJPTCIsIHsgLmkzMj03NSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF80MCA9IHsgIkNIQU5HRV9JTl8zR1BQX1BTX0RBVEFfT0ZGIiwgeyAuaTMyPTc2IH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNCwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF81LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzYsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNywgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF84LCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzksIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTAsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTMsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTQsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTUsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTYsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTcsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTgsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMTksIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMjAsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMjEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMjIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMjMsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMjQsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMjUsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMjYsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMjcsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMjgsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMjksIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMzAsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMzEsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMzMsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMzQsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMzUsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMzYsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMzcsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMzgsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMzksIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNDAsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFRXQUctQWRkcmVzcyAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM5MDMsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlRXQUctQWRkcmVzcyIsCS8qIE5hbWUgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBBZGRyZXNzX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBUeXBlLU51bWJlciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEyMDQsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlR5cGUtTnVtYmVyIiwJLyogTmFtZSAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJMCwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFVOSS1QRFUtQ1AtT25seS1GbGFnICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzkzMiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiVU5JLVBEVS1DUC1Pbmx5LUZsYWciLAkvKiBOYW1lICovCisJCQkJMCwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgICAgKnR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgIHRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICIzR1BQL0VudW1lcmF0ZWQoVU5JLVBEVS1DUC1Pbmx5LUZsYWcpIiwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhICAgICAgICB0XzEgPSB7ICJVTklfUERVX2JvdGhfVVBfQ1AiLCB7IC5pMzI9MCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8yID0geyAiVU5JX1BEVV9DUF9Pbmx5IiwgeyAuaTMyPTEgfX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFVuaXQtUXVvdGEtVGhyZXNob2xkICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTIyNiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiVW5pdC1RdW90YS1UaHJlc2hvbGQiLAkvKiBOYW1lICovCisJCQkJMCwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogVXNhZ2UtSW5mb3JtYXRpb24tUmVwb3J0LVNlcXVlbmNlLU51bWJlciAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM0MzksCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlVzYWdlLUluZm9ybWF0aW9uLVJlcG9ydC1TZXF1ZW5jZS1OdW1iZXIiLAkvKiBOYW1lICovCisJCQkJMCwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0lOVEVHRVIzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBVc2VyLVBhcnRpY2lwYXRpbmctVHlwZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEyNzksCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlVzZXItUGFydGljaXBhdGluZy1UeXBlIiwJLyogTmFtZSAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJMCwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9JTlRFR0VSMzIJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICAgICp0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgICB0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiM0dQUC9FbnVtZXJhdGVkKFVzZXItUGFydGljaXBhdGluZy1UeXBlKSIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8xID0geyAiTm9ybWFsIiwgeyAuaTMyPTAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgICAgICAgIHRfMiA9IHsgIk5XX1BvQ19Cb3giLCB7IC5pMzI9MSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAgICAgICAgdF8zID0geyAiVUVfUG9DX0JveCIsIHsgLmkzMj0yIH19OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFVzZXItU2Vzc2lvbi1JZCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTgzMCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiVXNlci1TZXNzaW9uLUlkIiwJLyogTmFtZSAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJMCwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFZhcmlhYmxlLVBhcnQtT3JkZXIgKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzOTA4LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJWYXJpYWJsZS1QYXJ0LU9yZGVyIiwJLyogTmFtZSAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJMCwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9VTlNJR05FRDMyCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgTlVMTCk7CisJCX07CisJCS8qIFZhcmlhYmxlLVBhcnQtVHlwZSAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM5MDksCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlZhcmlhYmxlLVBhcnQtVHlwZSIsCS8qIE5hbWUgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBWYXJpYWJsZS1QYXJ0LVZhbHVlICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzkxMCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiVmFyaWFibGUtUGFydC1WYWx1ZSIsCS8qIE5hbWUgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9OworCQkvKiBWTFItTnVtYmVyICovCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzQyMCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiVkxSLU51bWJlciIsCS8qIE5hbWUgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfTsKKwkJLyogVm9sdW1lLVF1b3RhLVRocmVzaG9sZCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTg2OSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiVm9sdW1lLVF1b3RhLVRocmVzaG9sZCIsCS8qIE5hbWUgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfVU5TSUdORUQzMgkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9OworCQkvKiBTdWJtaXNzaW9uLVRpbWVzdGFtcCAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTk5MTEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlN1Ym1pc3Npb24tVGltZXN0YW1wIiwJLyogTmFtZSAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJMCwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORwkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIFRpbWVfdHlwZSwgTlVMTCk7CisJCX07CisJCS8qIFNjYWxlLUZhY3RvciAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTIwNTksCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlNjYWxlLUZhY3RvciIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogU0RQLU1lZGlhLUNvbXBvbmVudCAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTg0MywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiU0RQLU1lZGlhLUNvbXBvbmVudCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogVVdBTi1Vc2VyLUxvY2F0aW9uLUluZm8gKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzOTE4LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJVV0FOLVVzZXItTG9jYXRpb24tSW5mbyIsCS8qIE5hbWUgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBBZGRyZXNzLURvbWFpbiAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTg5OCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQWRkcmVzcy1Eb21haW4iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIExvY2F0aW9uLUluZm8gKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzNDYwLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJMb2NhdGlvbi1JbmZvIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBNQk1TLUluZm9ybWF0aW9uICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJODgwLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJNQk1TLUluZm9ybWF0aW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBBb0MtU2VydmljZSAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTIzMTEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkFvQy1TZXJ2aWNlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBQcm9TZS1EaXJlY3QtQ29tbXVuaWNhdGlvbi1UcmFuc21pc3Npb24tRGF0YS1Db250YWluZXIgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzNDQxLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJQcm9TZS1EaXJlY3QtQ29tbXVuaWNhdGlvbi1UcmFuc21pc3Npb24tRGF0YS1Db250YWluZXIiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIEFQTi1SYXRlLUNvbnRyb2wtRG93bmxpbmsgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzOTM0LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJBUE4tUmF0ZS1Db250cm9sLURvd25saW5rIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBQb0MtSW5mb3JtYXRpb24gKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk4NzksCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlBvQy1JbmZvcm1hdGlvbiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogU3VwcGxlbWVudGFyeS1TZXJ2aWNlICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjA0OCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiU3VwcGxlbWVudGFyeS1TZXJ2aWNlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBUcmFuc21pdHRlci1JbmZvICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzQ2OCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiVHJhbnNtaXR0ZXItSW5mbyIsCS8qIE5hbWUgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBVbml0LUNvc3QgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyMDYxLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJVbml0LUNvc3QiLAkvKiBOYW1lICovCisJCQkJMCwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogVGltZS1TdGFtcHMgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk4MzMsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlRpbWUtU3RhbXBzIiwJLyogTmFtZSAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJMCwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIE5OSS1JbmZvcm1hdGlvbiAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTI3MDMsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk5OSS1JbmZvcm1hdGlvbiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogVHJpZ2dlciAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEyNjQsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlRyaWdnZXIiLAkvKiBOYW1lICovCisJCQkJMCwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogUmVsYXRlZC1UcmlnZ2VyICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzkyNiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUmVsYXRlZC1UcmlnZ2VyIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBUYWxrLUJ1cnN0LUV4Y2hhbmdlICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTI1NSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiVGFsay1CdXJzdC1FeGNoYW5nZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogVGltZS1RdW90YS1NZWNoYW5pc20gKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMjcwLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJUaW1lLVF1b3RhLU1lY2hhbmlzbSIsCS8qIE5hbWUgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBWYXJpYWJsZS1QYXJ0ICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzkwNywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiVmFyaWFibGUtUGFydCIsCS8qIE5hbWUgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBBZGRpdGlvbmFsLUNvbnRlbnQtSW5mb3JtYXRpb24gKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMjA3LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJBZGRpdGlvbmFsLUNvbnRlbnQtSW5mb3JtYXRpb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIEFQTi1SYXRlLUNvbnRyb2wtVXBsaW5rICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzkzNSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQVBOLVJhdGUtQ29udHJvbC1VcGxpbmsiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIEJhc2ljLVNlcnZpY2UtQ29kZSAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM0MTEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkJhc2ljLVNlcnZpY2UtQ29kZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogRXZlbnQtVHlwZSAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTgyMywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiRXZlbnQtVHlwZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogUHJvU2UtRGlyZWN0LUNvbW11bmljYXRpb24tUmVjZXB0aW9uLURhdGEtQ29udGFpbmVyICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzQ2MSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUHJvU2UtRGlyZWN0LUNvbW11bmljYXRpb24tUmVjZXB0aW9uLURhdGEtQ29udGFpbmVyIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBPcmlnaW5hdG9yLUludGVyZmFjZSAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTIwMDksCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk9yaWdpbmF0b3ItSW50ZXJmYWNlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBEZXN0aW5hdGlvbi1JbnRlcmZhY2UgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyMDAyLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJEZXN0aW5hdGlvbi1JbnRlcmZhY2UiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIElTVVAtQ2F1c2UgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzNDE2LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJJU1VQLUNhdXNlIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBMQ1MtUmVxdWVzdG9yLUlEICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTIzOSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTENTLVJlcXVlc3Rvci1JRCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogUFMtRnVybmlzaC1DaGFyZ2luZy1JbmZvcm1hdGlvbiAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTg2NSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUFMtRnVybmlzaC1DaGFyZ2luZy1JbmZvcm1hdGlvbiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogVXNlci1DU0ctSW5mb3JtYXRpb24gKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyMzE5LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJVc2VyLUNTRy1JbmZvcm1hdGlvbiIsCS8qIE5hbWUgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBDYWxsZWQtSWRlbnRpdHktQ2hhbmdlICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzkxNywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQ2FsbGVkLUlkZW50aXR5LUNoYW5nZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogU2VydmljZS1TcGVjaWZpYy1JbmZvICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTI0OSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiU2VydmljZS1TcGVjaWZpYy1JbmZvIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBBY2N1bXVsYXRlZC1Db3N0ICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjA1MiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQWNjdW11bGF0ZWQtQ29zdCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogU0NTLUFTLUFkZHJlc3MgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzOTQwLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTQ1MtQVMtQWRkcmVzcyIsCS8qIE5hbWUgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBNZXNzYWdlLUNsYXNzICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTIxMywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTWVzc2FnZS1DbGFzcyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogTG9jYXRpb24tVHlwZSAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEyNDQsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkxvY2F0aW9uLVR5cGUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIFJhdGUtRWxlbWVudCAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTIwNTgsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlJhdGUtRWxlbWVudCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogUGFydGljaXBhbnQtR3JvdXAgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMjYwLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJQYXJ0aWNpcGFudC1Hcm91cCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogRW5oYW5jZWQtRGlhZ25vc3RpY3MgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzOTAxLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJFbmhhbmNlZC1EaWFnbm9zdGljcyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogQWNjZXNzLU5ldHdvcmstSW5mby1DaGFuZ2UgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk0NDAxLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJBY2Nlc3MtTmV0d29yay1JbmZvLUNoYW5nZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogUG9DLVVzZXItUm9sZSAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEyNTIsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlBvQy1Vc2VyLVJvbGUiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIExDUy1DbGllbnQtTmFtZSAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEyMzUsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkxDUy1DbGllbnQtTmFtZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogTWVzc2FnZS1Cb2R5ICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJODg5LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJNZXNzYWdlLUJvZHkiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIFJhZGlvLVBhcmFtZXRlci1TZXQtSW5mbyAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM0NjMsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlJhZGlvLVBhcmFtZXRlci1TZXQtSW5mbyIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogU00tRGV2aWNlLVRyaWdnZXItSW5mb3JtYXRpb24gKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzNDA1LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJTTS1EZXZpY2UtVHJpZ2dlci1JbmZvcm1hdGlvbiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogVFdBTi1Vc2VyLUxvY2F0aW9uLUluZm8gKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyNzE0LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJUV0FOLVVzZXItTG9jYXRpb24tSW5mbyIsCS8qIE5hbWUgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBWQ1MtSW5mb3JtYXRpb24gKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzNDEwLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJWQ1MtSW5mb3JtYXRpb24iLAkvKiBOYW1lICovCisJCQkJMCwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkwLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogVHJ1bmstR3JvdXAtSUQgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk4NTEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlRydW5rLUdyb3VwLUlEIiwJLyogTmFtZSAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJMCwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIEluY3JlbWVudGFsLUNvc3QgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyMDYyLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJJbmNyZW1lbnRhbC1Db3N0IiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBTRFAtVGltZVN0YW1wcyAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEyNzMsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlNEUC1UaW1lU3RhbXBzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBJbnRlci1PcGVyYXRvci1JZGVudGlmaWVyICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJODM4LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJJbnRlci1PcGVyYXRvci1JZGVudGlmaWVyIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBOSURELVN1Ym1pc3Npb24gKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzOTI4LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJOSURELVN1Ym1pc3Npb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIEFwcGxpY2F0aW9uLVNlcnZlci1JbmZvcm1hdGlvbiAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTg1MCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQXBwbGljYXRpb24tU2VydmVyLUluZm9ybWF0aW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBDUERULUluZm9ybWF0aW9uICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzkyNywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQ1BEVC1JbmZvcm1hdGlvbiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogRW52ZWxvcGUgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMjY2LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJFbnZlbG9wZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogUmVsYXRlZC1DaGFuZ2UtQ29uZGl0aW9uLUluZm9ybWF0aW9uICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzkyNSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUmVsYXRlZC1DaGFuZ2UtQ29uZGl0aW9uLUluZm9ybWF0aW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBMQ1MtQ2xpZW50LUlkICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTIzMiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTENTLUNsaWVudC1JZCIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogRWFybHktTWVkaWEtRGVzY3JpcHRpb24gKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMjcyLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJFYXJseS1NZWRpYS1EZXNjcmlwdGlvbiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogQW9DLVN1YnNjcmlwdGlvbi1JbmZvcm1hdGlvbiAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTIzMTQsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkFvQy1TdWJzY3JpcHRpb24tSW5mb3JtYXRpb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIEN1cnJlbnQtVGFyaWZmICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjA1NiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQ3VycmVudC1UYXJpZmYiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIEFQTi1SYXRlLUNvbnRyb2wgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzOTMzLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJBUE4tUmF0ZS1Db250cm9sIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBBY2Nlc3MtVHJhbnNmZXItSW5mb3JtYXRpb24gKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyNzA5LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJBY2Nlc3MtVHJhbnNmZXItSW5mb3JtYXRpb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIFJlY2lwaWVudC1SZWNlaXZlZC1BZGRyZXNzICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjAyOCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUmVjaXBpZW50LVJlY2VpdmVkLUFkZHJlc3MiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIEFvQy1Db3N0LUluZm9ybWF0aW9uICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjA1MywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQW9DLUNvc3QtSW5mb3JtYXRpb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIE9yaWdpbmF0b3ItQWRkcmVzcyAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTg4NiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiT3JpZ2luYXRvci1BZGRyZXNzIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBPcmlnaW5hdG9yLVJlY2VpdmVkLUFkZHJlc3MgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyMDI3LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJPcmlnaW5hdG9yLVJlY2VpdmVkLUFkZHJlc3MiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIFJlbWFpbmluZy1CYWxhbmNlICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjAyMSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUmVtYWluaW5nLUJhbGFuY2UiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIEFGLUNvcnJlbGF0aW9uLUluZm9ybWF0aW9uICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTI3NiwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiQUYtQ29ycmVsYXRpb24tSW5mb3JtYXRpb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIFJlY2lwaWVudC1BZGRyZXNzICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMTIwMSwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUmVjaXBpZW50LUFkZHJlc3MiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIE5leHQtVGFyaWZmICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMjA1NywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTmV4dC1UYXJpZmYiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIENvdmVyYWdlLUluZm8gKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzNDU5LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJDb3ZlcmFnZS1JbmZvIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBBbm5vdW5jZW1lbnQtSW5mb3JtYXRpb24gKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkzOTA0LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJBbm5vdW5jZW1lbnQtSW5mb3JtYXRpb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIE1NLUNvbnRlbnQtVHlwZSAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTEyMDMsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk1NLUNvbnRlbnQtVHlwZSIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogTU1UZWwtSW5mb3JtYXRpb24gKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyMDMwLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJNTVRlbC1JbmZvcm1hdGlvbiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogU2VydmljZS1EYXRhLUNvbnRhaW5lciAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTIwNDAsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlNlcnZpY2UtRGF0YS1Db250YWluZXIiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIE1NUy1JbmZvcm1hdGlvbiAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTg3NywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTU1TLUluZm9ybWF0aW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBSZWNpcGllbnQtSW5mbyAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTIwMjYsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlJlY2lwaWVudC1JbmZvIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBUcmFmZmljLURhdGEtVm9sdW1lcyAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTIwNDYsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlRyYWZmaWMtRGF0YS1Wb2x1bWVzIiwJLyogTmFtZSAqLworCQkJCTAsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJMCwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIExDUy1JbmZvcm1hdGlvbiAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTg3OCwJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiTENTLUluZm9ybWF0aW9uIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBUYXJpZmYtSW5mb3JtYXRpb24gKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkyMDYwLAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJUYXJpZmYtSW5mb3JtYXRpb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIFByb1NlLUluZm9ybWF0aW9uICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJMzQ0NywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiUHJvU2UtSW5mb3JtYXRpb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIFNNUy1JbmZvcm1hdGlvbiAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTIwMDAsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlNNUy1JbmZvcm1hdGlvbiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogUmVhbC1UaW1lLVRhcmlmZi1JbmZvcm1hdGlvbiAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTIzMDUsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIlJlYWwtVGltZS1UYXJpZmYtSW5mb3JtYXRpb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIEFvQy1JbmZvcm1hdGlvbiAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTIwNTQsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIkFvQy1JbmZvcm1hdGlvbiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogTW9uaXRvcmluZy1FdmVudC1SZXBvcnQtRGF0YSAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM5MjAsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk1vbml0b3JpbmctRXZlbnQtUmVwb3J0LURhdGEiLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIE9mZmxpbmUtQ2hhcmdpbmcgKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQkxMjc4LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJPZmZsaW5lLUNoYXJnaW5nIiwJLyogTmFtZSAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJQVZQX1RZUEVfR1JPVVBFRAkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJfQorCQkvKiBJTVMtSW5mb3JtYXRpb24gKi8KKwkJeworCQkJLyogR3JvdXBlZCAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsKKwkJCQk4NzYsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIklNUy1JbmZvcm1hdGlvbiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogTW9uaXRvcmluZy1FdmVudC1JbmZvcm1hdGlvbiAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTM5MjEsCS8qIENvZGUgKi8KKwkJCQkxMDQxNSwJLyogVmVuZG9yICovCisJCQkJIk1vbml0b3JpbmctRXZlbnQtSW5mb3JtYXRpb24iLAkvKiBOYW1lICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQlBVlBfVFlQRV9HUk9VUEVECS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQl9CisJCS8qIFBTLUluZm9ybWF0aW9uICovCisJCXsKKwkJCS8qIEdyb3VwZWQgKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7CisJCQkJODc0LAkvKiBDb2RlICovCisJCQkJMTA0MTUsCS8qIFZlbmRvciAqLworCQkJCSJQUy1JbmZvcm1hdGlvbiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKwkJLyogU2VydmljZS1JbmZvcm1hdGlvbiAqLworCQl7CisJCQkvKiBHcm91cGVkICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geworCQkJCTg3MywJLyogQ29kZSAqLworCQkJCTEwNDE1LAkvKiBWZW5kb3IgKi8KKwkJCQkiU2VydmljZS1JbmZvcm1hdGlvbiIsCS8qIE5hbWUgKi8KKwkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksCS8qIEZpeGVkIGZsYWdzICovCisJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLAkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCUFWUF9UWVBFX0dST1VQRUQJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgJmF2cCk7CisJCX0KKworCQorICAgfQorCisgICAvKiBDb21tYW5kcyBzZWN0aW9uICovCisgICB7CisKKyAgIH0KKworICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGljdF90czMyMjk5X2F2cHNfbG9hZF9ydWxlcyhjaGFyICogY29uZmZpbGUpCit7CisgICAvKiBHcm91cGVkIEFWUCBzZWN0aW9uICovCisgICB7CisJICAvKiBTY2FsZS1GYWN0b3IgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNjYWxlLUZhY3RvciJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJWYWx1ZS1EaWdpdHMifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRXhwb25lbnQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBTRFAtTWVkaWEtQ29tcG9uZW50ICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTRFAtTWVkaWEtQ29tcG9uZW50In07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTRFAtTWVkaWEtTmFtZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU0RQLU1lZGlhLURlc2NyaXB0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJMb2NhbC1HVy1JbnNlcnRlZC1JbmRpY2F0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJJUC1SZWFsbS1EZWZhdWx0LUluZGljYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlRyYW5zY29kZXItSW5zZXJ0ZWQtSW5kaWNhdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTWVkaWEtSW5pdGlhdG9yLUZsYWcifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1lZGlhLUluaXRpYXRvci1QYXJ0eSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiM0dQUC1DaGFyZ2luZy1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQWNjZXNzLU5ldHdvcmstQ2hhcmdpbmctSWRlbnRpZmllci1WYWx1ZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU0RQLVR5cGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBVV0FOLVVzZXItTG9jYXRpb24tSW5mbyAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVVdBTi1Vc2VyLUxvY2F0aW9uLUluZm8ifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlVFLUxvY2FsLUlQLUFkZHJlc3MifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlVEUC1Tb3VyY2UtUG9ydCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU1NJRCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQlNTSUQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBBZGRyZXNzLURvbWFpbiAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQWRkcmVzcy1Eb21haW4ifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkRvbWFpbi1OYW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICIzR1BQLUlNU0ktTUNDLU1OQyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIExvY2F0aW9uLUluZm8gKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkxvY2F0aW9uLUluZm8ifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIjNHUFAtVXNlci1Mb2NhdGlvbi1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDaGFuZ2UtVGltZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIE1CTVMtSW5mb3JtYXRpb24gKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1CTVMtSW5mb3JtYXRpb24ifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlRNR0kifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1CTVMtU2VydmljZS1UeXBlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNQk1TLVVzZXItU2VydmljZS1UeXBlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJGaWxlLVJlcGFpci1TdXBwb3J0ZWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJlcXVpcmVkLU1CTVMtQmVhcmVyLUNhcGFiaWxpdGllcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTUJNUy0yRy0zRy1JbmRpY2F0b3IifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJBSSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTUJNUy1TZXJ2aWNlLUFyZWEifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1CTVMtU2Vzc2lvbi1JZGVudGl0eSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ04tSVAtTXVsdGljYXN0LURpc3RyaWJ1dGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTUJNUy1HVy1BZGRyZXNzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNQk1TLUNoYXJnZWQtUGFydHkifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1TSVNETiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTUJNUy1EYXRhLVRyYW5zZmVyLVN0YXJ0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNQk1TLURhdGEtVHJhbnNmZXItU3RvcCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIEFvQy1TZXJ2aWNlICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBb0MtU2VydmljZSJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQW9DLVNlcnZpY2UtT2JsaWdhdG9yeS1UeXBlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBb0MtU2VydmljZS1UeXBlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogUHJvU2UtRGlyZWN0LUNvbW11bmljYXRpb24tVHJhbnNtaXNzaW9uLURhdGEtQ29udGFpbmVyICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQcm9TZS1EaXJlY3QtQ29tbXVuaWNhdGlvbi1UcmFuc21pc3Npb24tRGF0YS1Db250YWluZXIifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkxvY2FsLVNlcXVlbmNlLU51bWJlciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ292ZXJhZ2UtU3RhdHVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICIzR1BQLVVzZXItTG9jYXRpb24tSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBY2NvdW50aW5nLU91dHB1dC1PY3RldHMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNoYW5nZS1UaW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDaGFuZ2UtQ29uZGl0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJWaXNpdGVkLVBMTU4tSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlVzYWdlLUluZm9ybWF0aW9uLVJlcG9ydC1TZXF1ZW5jZS1OdW1iZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJhZGlvLVJlc291cmNlcy1JbmRpY2F0b3IifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJhZGlvLUZyZXF1ZW5jeSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIEFQTi1SYXRlLUNvbnRyb2wtRG93bmxpbmsgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFQTi1SYXRlLUNvbnRyb2wtRG93bmxpbmsifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJhdGUtQ29udHJvbC1UaW1lLVVuaXQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJhdGUtQ29udHJvbC1NYXgtUmF0ZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUmF0ZS1Db250cm9sLU1heC1NZXNzYWdlLVNpemUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBQb0MtSW5mb3JtYXRpb24gKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlBvQy1JbmZvcm1hdGlvbiJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUG9DLVNlcnZlci1Sb2xlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogU3VwcGxlbWVudGFyeS1TZXJ2aWNlICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTdXBwbGVtZW50YXJ5LVNlcnZpY2UifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1NVGVsLVNTZXJ2aWNlLVR5cGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNlcnZpY2UtTW9kZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIFRyYW5zbWl0dGVyLUluZm8gKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlRyYW5zbWl0dGVyLUluZm8ifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlByb1NlLVNvdXJjZS1JUC1BZGRyZXNzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQcm9TZS1VRS1JRCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIFVuaXQtQ29zdCAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVW5pdC1Db3N0In07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlZhbHVlLURpZ2l0cyJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJFeHBvbmVudCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIFRpbWUtU3RhbXBzICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUaW1lLVN0YW1wcyJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU0lQLVJlcXVlc3QtVGltZXN0YW1wIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogTk5JLUluZm9ybWF0aW9uICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJOTkktSW5mb3JtYXRpb24ifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNlc3Npb24tRGlyZWN0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJOTkktVHlwZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUmVsYXRpb25zaGlwLU1vZGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk5laWdoYm91ci1Ob2RlLUFkZHJlc3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBUcmlnZ2VyICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUcmlnZ2VyIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUcmlnZ2VyLVR5cGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBSZWxhdGVkLVRyaWdnZXIgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJlbGF0ZWQtVHJpZ2dlciJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVHJpZ2dlci1UeXBlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogVGFsay1CdXJzdC1FeGNoYW5nZSAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVGFsay1CdXJzdC1FeGNoYW5nZSJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUG9DLUNoYW5nZS1UaW1lIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogVGltZS1RdW90YS1NZWNoYW5pc20gKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlRpbWUtUXVvdGEtTWVjaGFuaXNtIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUaW1lLVF1b3RhLVR5cGUifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkJhc2UtVGltZS1JbnRlcnZhbCJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIFZhcmlhYmxlLVBhcnQgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlZhcmlhYmxlLVBhcnQifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlZhcmlhYmxlLVBhcnQtT3JkZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlZhcmlhYmxlLVBhcnQtVHlwZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVmFyaWFibGUtUGFydC1WYWx1ZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIEFkZGl0aW9uYWwtQ29udGVudC1JbmZvcm1hdGlvbiAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQWRkaXRpb25hbC1Db250ZW50LUluZm9ybWF0aW9uIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUeXBlLU51bWJlciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQWRkaXRpb25hbC1UeXBlLUluZm9ybWF0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDb250ZW50LVNpemUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBBUE4tUmF0ZS1Db250cm9sLVVwbGluayAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQVBOLVJhdGUtQ29udHJvbC1VcGxpbmsifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFkZGl0aW9uYWwtRXhjZXB0aW9uLVJlcG9ydHMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJhdGUtQ29udHJvbC1UaW1lLVVuaXQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJhdGUtQ29udHJvbC1NYXgtUmF0ZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIEJhc2ljLVNlcnZpY2UtQ29kZSAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQmFzaWMtU2VydmljZS1Db2RlIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJCZWFyZXItU2VydmljZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVGVsZXNlcnZpY2UifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBFdmVudC1UeXBlICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJFdmVudC1UeXBlIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTSVAtTWV0aG9kIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJFdmVudCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRXhwaXJlcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIFByb1NlLURpcmVjdC1Db21tdW5pY2F0aW9uLVJlY2VwdGlvbi1EYXRhLUNvbnRhaW5lciAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUHJvU2UtRGlyZWN0LUNvbW11bmljYXRpb24tUmVjZXB0aW9uLURhdGEtQ29udGFpbmVyIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJMb2NhbC1TZXF1ZW5jZS1OdW1iZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNvdmVyYWdlLVN0YXR1cyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiM0dQUC1Vc2VyLUxvY2F0aW9uLUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQWNjb3VudGluZy1JbnB1dC1PY3RldHMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNoYW5nZS1UaW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDaGFuZ2UtQ29uZGl0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJWaXNpdGVkLVBMTU4tSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlVzYWdlLUluZm9ybWF0aW9uLVJlcG9ydC1TZXF1ZW5jZS1OdW1iZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJhZGlvLVJlc291cmNlcy1JbmRpY2F0b3IifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJhZGlvLUZyZXF1ZW5jeSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIE9yaWdpbmF0b3ItSW50ZXJmYWNlICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJPcmlnaW5hdG9yLUludGVyZmFjZSJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiSW50ZXJmYWNlLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJJbnRlcmZhY2UtVGV4dCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiSW50ZXJmYWNlLVBvcnQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkludGVyZmFjZS1UeXBlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogRGVzdGluYXRpb24tSW50ZXJmYWNlICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJEZXN0aW5hdGlvbi1JbnRlcmZhY2UifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkludGVyZmFjZS1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiSW50ZXJmYWNlLVRleHQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkludGVyZmFjZS1Qb3J0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJJbnRlcmZhY2UtVHlwZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIElTVVAtQ2F1c2UgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIklTVVAtQ2F1c2UifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIklTVVAtQ2F1c2UtTG9jYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBMQ1MtUmVxdWVzdG9yLUlEICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJMQ1MtUmVxdWVzdG9yLUlEIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJMQ1MtRGF0YS1Db2RpbmctU2NoZW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJMQ1MtUmVxdWVzdG9yLUlELVN0cmluZyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIFBTLUZ1cm5pc2gtQ2hhcmdpbmctSW5mb3JtYXRpb24gKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlBTLUZ1cm5pc2gtQ2hhcmdpbmctSW5mb3JtYXRpb24ifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIjNHUFAtQ2hhcmdpbmctSWQifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlBTLUZyZWUtRm9ybWF0LURhdGEifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlBTLUFwcGVuZC1GcmVlLUZvcm1hdC1EYXRhIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogVXNlci1DU0ctSW5mb3JtYXRpb24gKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlVzZXItQ1NHLUluZm9ybWF0aW9uIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDU0ctSWQifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNTRy1BY2Nlc3MtTW9kZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ1NHLU1lbWJlcnNoaXAtSW5kaWNhdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIENhbGxlZC1JZGVudGl0eS1DaGFuZ2UgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNhbGxlZC1JZGVudGl0eS1DaGFuZ2UifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNhbGxlZC1JZGVudGl0eSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ2hhbmdlLVRpbWUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBTZXJ2aWNlLVNwZWNpZmljLUluZm8gKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNlcnZpY2UtU3BlY2lmaWMtSW5mbyJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU2VydmljZS1TcGVjaWZpYy1EYXRhIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogQWNjdW11bGF0ZWQtQ29zdCAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQWNjdW11bGF0ZWQtQ29zdCJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJWYWx1ZS1EaWdpdHMifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRXhwb25lbnQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBTQ1MtQVMtQWRkcmVzcyAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU0NTLUFTLUFkZHJlc3MifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNDUy1SZWFsbSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU0NTLUFkZHJlc3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBNZXNzYWdlLUNsYXNzICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNZXNzYWdlLUNsYXNzIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDbGFzcy1JZGVudGlmaWVyIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUb2tlbi1UZXh0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogTG9jYXRpb24tVHlwZSAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTG9jYXRpb24tVHlwZSJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTG9jYXRpb24tRXN0aW1hdGUtVHlwZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRGVmZXJyZWQtTG9jYXRpb24tRXZlbnQtVHlwZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIFJhdGUtRWxlbWVudCAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUmF0ZS1FbGVtZW50In07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkNDLVVuaXQtVHlwZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIFBhcnRpY2lwYW50LUdyb3VwICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQYXJ0aWNpcGFudC1Hcm91cCJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ2FsbGVkLVBhcnR5LUFkZHJlc3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlBhcnRpY2lwYW50LUFjY2Vzcy1Qcmlvcml0eSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVXNlci1QYXJ0aWNpcGF0aW5nLVR5cGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBFbmhhbmNlZC1EaWFnbm9zdGljcyAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRW5oYW5jZWQtRGlhZ25vc3RpY3MifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJBTi1OQVMtUmVsZWFzZS1DYXVzZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIEFjY2Vzcy1OZXR3b3JrLUluZm8tQ2hhbmdlICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBY2Nlc3MtTmV0d29yay1JbmZvLUNoYW5nZSJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQWNjZXNzLU5ldHdvcmstSW5mb3JtYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNlbGx1bGFyLU5ldHdvcmstSW5mb3JtYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNoYW5nZS1UaW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogUG9DLVVzZXItUm9sZSAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUG9DLVVzZXItUm9sZSJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUG9DLVVzZXItUm9sZS1JRHMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBMQ1MtQ2xpZW50LU5hbWUgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkxDUy1DbGllbnQtTmFtZSJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTENTLURhdGEtQ29kaW5nLVNjaGVtZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTENTLU5hbWUtU3RyaW5nIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJMQ1MtRm9ybWF0LUluZGljYXRvciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIE1lc3NhZ2UtQm9keSAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTWVzc2FnZS1Cb2R5In07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDb250ZW50LVR5cGUifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBSYWRpby1QYXJhbWV0ZXItU2V0LUluZm8gKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJhZGlvLVBhcmFtZXRlci1TZXQtSW5mbyJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUmFkaW8tUGFyYW1ldGVyLVNldC1WYWx1ZXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNoYW5nZS1UaW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogU00tRGV2aWNlLVRyaWdnZXItSW5mb3JtYXRpb24gKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNNLURldmljZS1UcmlnZ2VyLUluZm9ybWF0aW9uIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNVEMtSVdGLUFkZHJlc3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJlZmVyZW5jZS1OdW1iZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBUV0FOLVVzZXItTG9jYXRpb24tSW5mbyAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVFdBTi1Vc2VyLUxvY2F0aW9uLUluZm8ifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNTSUQifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkJTU0lEIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogVkNTLUluZm9ybWF0aW9uICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJWQ1MtSW5mb3JtYXRpb24ifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkJlYXJlci1DYXBhYmlsaXR5In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJOZXR3b3JrLUNhbGwtUmVmZXJlbmNlLU51bWJlciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTVNDLUFkZHJlc3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBUcnVuay1Hcm91cC1JRCAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVHJ1bmstR3JvdXAtSUQifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkluY29taW5nLVRydW5rLUdyb3VwLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogSW5jcmVtZW50YWwtQ29zdCAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiSW5jcmVtZW50YWwtQ29zdCJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJWYWx1ZS1EaWdpdHMifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRXhwb25lbnQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBTRFAtVGltZVN0YW1wcyAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU0RQLVRpbWVTdGFtcHMifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNEUC1PZmZlci1UaW1lc3RhbXAifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNEUC1BbnN3ZXItVGltZXN0YW1wIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogSW50ZXItT3BlcmF0b3ItSWRlbnRpZmllciAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiSW50ZXItT3BlcmF0b3ItSWRlbnRpZmllciJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiT3JpZ2luYXRpbmctSU9JIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUZXJtaW5hdGluZy1JT0kifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBOSURELVN1Ym1pc3Npb24gKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk5JREQtU3VibWlzc2lvbiJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU3VibWlzc2lvbi1UaW1lc3RhbXAifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiRXZlbnQtVGltZXN0YW1wIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkFjY291bnRpbmctSW5wdXQtT2N0ZXRzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkFjY291bnRpbmctT3V0cHV0LU9jdGV0cyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ2hhbmdlLUNvbmRpdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIEFwcGxpY2F0aW9uLVNlcnZlci1JbmZvcm1hdGlvbiAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQXBwbGljYXRpb24tU2VydmVyLUluZm9ybWF0aW9uIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBcHBsaWNhdGlvbi1TZXJ2ZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBDUERULUluZm9ybWF0aW9uICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDUERULUluZm9ybWF0aW9uIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJFeHRlcm5hbC1JZGVudGlmaWVyIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTQ0VGLUlEIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogRW52ZWxvcGUgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkVudmVsb3BlIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJFbnZlbG9wZS1TdGFydC1UaW1lIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJFbnZlbG9wZS1FbmQtVGltZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJDQy1Ub3RhbC1PY3RldHMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQ0MtSW5wdXQtT2N0ZXRzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkNDLU91dHB1dC1PY3RldHMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQ0MtU2VydmljZS1TcGVjaWZpYy1Vbml0cyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIFJlbGF0ZWQtQ2hhbmdlLUNvbmRpdGlvbi1JbmZvcm1hdGlvbiAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUmVsYXRlZC1DaGFuZ2UtQ29uZGl0aW9uLUluZm9ybWF0aW9uIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTR1NOLUFkZHJlc3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNoYW5nZS1Db25kaXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIjNHUFAtVXNlci1Mb2NhdGlvbi1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gNTUzNSwgLmF2cF9uYW1lID0gIjNHUFAyLUJTSUQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlVXQU4tVXNlci1Mb2NhdGlvbi1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQcmVzZW5jZS1SZXBvcnRpbmctQXJlYS1TdGF0dXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlVzZXItQ1NHLUluZm9ybWF0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICIzR1BQLVJBVC1UeXBlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogTENTLUNsaWVudC1JZCAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTENTLUNsaWVudC1JZCJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTENTLUNsaWVudC1UeXBlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJMQ1MtQ2xpZW50LUV4dGVybmFsLUlEIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJMQ1MtQ2xpZW50LURpYWxlZC1CeS1NUyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTENTLUNsaWVudC1OYW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJMQ1MtQVBOIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJMQ1MtUmVxdWVzdG9yLUlEIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogRWFybHktTWVkaWEtRGVzY3JpcHRpb24gKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkVhcmx5LU1lZGlhLURlc2NyaXB0aW9uIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTRFAtVGltZVN0YW1wcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU0RQLU1lZGlhLUNvbXBvbmVudCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU0RQLVNlc3Npb24tRGVzY3JpcHRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBBb0MtU3Vic2NyaXB0aW9uLUluZm9ybWF0aW9uICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBb0MtU3Vic2NyaXB0aW9uLUluZm9ybWF0aW9uIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBb0MtU2VydmljZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQW9DLUZvcm1hdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUHJlZmVycmVkLUFvQy1DdXJyZW5jeSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIEN1cnJlbnQtVGFyaWZmICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDdXJyZW50LVRhcmlmZiJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJDdXJyZW5jeS1Db2RlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTY2FsZS1GYWN0b3IifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJhdGUtRWxlbWVudCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIEFQTi1SYXRlLUNvbnRyb2wgKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFQTi1SYXRlLUNvbnRyb2wifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFQTi1SYXRlLUNvbnRyb2wtVXBsaW5rIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBUE4tUmF0ZS1Db250cm9sLURvd25saW5rIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogQWNjZXNzLVRyYW5zZmVyLUluZm9ybWF0aW9uICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBY2Nlc3MtVHJhbnNmZXItSW5mb3JtYXRpb24ifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFjY2Vzcy1UcmFuc2Zlci1UeXBlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBY2Nlc3MtTmV0d29yay1JbmZvcm1hdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ2VsbHVsYXItTmV0d29yay1JbmZvcm1hdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiSW50ZXItVUUtVHJhbnNmZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVXNlci1FcXVpcG1lbnQtSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiSW5zdGFuY2UtSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJlbGF0ZWQtSU1TLUNoYXJnaW5nLUlkZW50aWZpZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJlbGF0ZWQtSU1TLUNoYXJnaW5nLUlkZW50aWZpZXItTm9kZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ2hhbmdlLVRpbWUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBSZWNpcGllbnQtUmVjZWl2ZWQtQWRkcmVzcyAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUmVjaXBpZW50LVJlY2VpdmVkLUFkZHJlc3MifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFkZHJlc3MtVHlwZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQWRkcmVzcy1EYXRhIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBZGRyZXNzLURvbWFpbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIEFvQy1Db3N0LUluZm9ybWF0aW9uICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBb0MtQ29zdC1JbmZvcm1hdGlvbiJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQWNjdW11bGF0ZWQtQ29zdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiSW5jcmVtZW50YWwtQ29zdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJDdXJyZW5jeS1Db2RlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogT3JpZ2luYXRvci1BZGRyZXNzICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJPcmlnaW5hdG9yLUFkZHJlc3MifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFkZHJlc3MtVHlwZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQWRkcmVzcy1EYXRhIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBZGRyZXNzLURvbWFpbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIE9yaWdpbmF0b3ItUmVjZWl2ZWQtQWRkcmVzcyAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiT3JpZ2luYXRvci1SZWNlaXZlZC1BZGRyZXNzIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBZGRyZXNzLVR5cGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFkZHJlc3MtRGF0YSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQWRkcmVzcy1Eb21haW4ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBSZW1haW5pbmctQmFsYW5jZSAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUmVtYWluaW5nLUJhbGFuY2UifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiVW5pdC1WYWx1ZSJ9LCBSVUxFX1JFUVVJUkVELCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJDdXJyZW5jeS1Db2RlIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogQUYtQ29ycmVsYXRpb24tSW5mb3JtYXRpb24gKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFGLUNvcnJlbGF0aW9uLUluZm9ybWF0aW9uIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBRi1DaGFyZ2luZy1JZGVudGlmaWVyIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJGbG93cyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIFJlY2lwaWVudC1BZGRyZXNzICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJSZWNpcGllbnQtQWRkcmVzcyJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQWRkcmVzcy1UeXBlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBZGRyZXNzLURhdGEifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFkZHJlc3MtRG9tYWluIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBZGRyZXNzZWUtVHlwZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIE5leHQtVGFyaWZmICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJOZXh0LVRhcmlmZiJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJDdXJyZW5jeS1Db2RlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTY2FsZS1GYWN0b3IifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJhdGUtRWxlbWVudCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIENvdmVyYWdlLUluZm8gKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNvdmVyYWdlLUluZm8ifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNvdmVyYWdlLVN0YXR1cyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ2hhbmdlLVRpbWUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkxvY2F0aW9uLUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBBbm5vdW5jZW1lbnQtSW5mb3JtYXRpb24gKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFubm91bmNlbWVudC1JbmZvcm1hdGlvbiJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQW5ub3VuY2VtZW50LUlkZW50aWZpZXIifSwgUlVMRV9SRVFVSVJFRCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlZhcmlhYmxlLVBhcnQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlRpbWUtSW5kaWNhdG9yIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJRdW90YS1JbmRpY2F0b3IifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFubm91bmNlbWVudC1PcmRlciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUGxheS1BbHRlcm5hdGl2ZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUHJpdmFjeS1JbmRpY2F0b3IifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkxhbmd1YWdlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogTU0tQ29udGVudC1UeXBlICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNTS1Db250ZW50LVR5cGUifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlR5cGUtTnVtYmVyIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBZGRpdGlvbmFsLVR5cGUtSW5mb3JtYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNvbnRlbnQtU2l6ZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQWRkaXRpb25hbC1Db250ZW50LUluZm9ybWF0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogTU1UZWwtSW5mb3JtYXRpb24gKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1NVGVsLUluZm9ybWF0aW9uIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTdXBwbGVtZW50YXJ5LVNlcnZpY2UifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBTZXJ2aWNlLURhdGEtQ29udGFpbmVyICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTZXJ2aWNlLURhdGEtQ29udGFpbmVyIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBRi1Db3JyZWxhdGlvbi1JbmZvcm1hdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ2hhcmdpbmctUnVsZS1CYXNlLU5hbWUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQWNjb3VudGluZy1JbnB1dC1PY3RldHMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQWNjb3VudGluZy1PdXRwdXQtT2N0ZXRzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJMb2NhbC1TZXF1ZW5jZS1OdW1iZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlFvUy1JbmZvcm1hdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJSYXRpbmctR3JvdXAifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNoYW5nZS1UaW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlNlcnZpY2UtSWRlbnRpZmllciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU2VydmljZS1TcGVjaWZpYy1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBREMtUnVsZS1CYXNlLU5hbWUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNHU04tQWRkcmVzcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVGltZS1GaXJzdC1Vc2FnZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVGltZS1MYXN0LVVzYWdlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUaW1lLVVzYWdlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDaGFuZ2UtQ29uZGl0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICIzR1BQLVVzZXItTG9jYXRpb24tSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDU1MzUsIC5hdnBfbmFtZSA9ICIzR1BQMi1CU0lEIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJVV0FOLVVzZXItTG9jYXRpb24tSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU3BvbnNvci1JZGVudGl0eSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQXBwbGljYXRpb24tU2VydmljZS1Qcm92aWRlci1JZGVudGl0eSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUHJlc2VuY2UtUmVwb3J0aW5nLUFyZWEtSW5mb3JtYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlByZXNlbmNlLVJlcG9ydGluZy1BcmVhLVN0YXR1cyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVXNlci1DU0ctSW5mb3JtYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIjNHUFAtUkFULVR5cGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJlbGF0ZWQtQ2hhbmdlLUNvbmRpdGlvbi1JbmZvcm1hdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU2VydmluZy1QTE1OLVJhdGUtQ29udHJvbCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQVBOLVJhdGUtQ29udHJvbCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiM0dQUC1QUy1EYXRhLU9mZi1TdGF0dXMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBNTVMtSW5mb3JtYXRpb24gKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1NUy1JbmZvcm1hdGlvbiJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiT3JpZ2luYXRvci1BZGRyZXNzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJSZWNpcGllbnQtQWRkcmVzcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU3VibWlzc2lvbi1UaW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNTS1Db250ZW50LVR5cGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlByaW9yaXR5In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNZXNzYWdlLUlEIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNZXNzYWdlLVR5cGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1lc3NhZ2UtU2l6ZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTWVzc2FnZS1DbGFzcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRGVsaXZlcnktUmVwb3J0LVJlcXVlc3RlZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUmVhZC1SZXBseS1SZXBvcnQtUmVxdWVzdGVkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNTUJveC1TdG9yYWdlLVJlcXVlc3RlZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQXBwbGljLUlEIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJSZXBseS1BcHBsaWMtSUQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkF1eC1BcHBsaWMtSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ29udGVudC1DbGFzcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRFJNLUNvbnRlbnQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFkYXB0YXRpb25zIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogUmVjaXBpZW50LUluZm8gKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJlY2lwaWVudC1JbmZvIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJEZXN0aW5hdGlvbi1JbnRlcmZhY2UifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJlY2lwaWVudC1BZGRyZXNzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJSZWNpcGllbnQtUmVjZWl2ZWQtQWRkcmVzcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUmVjaXBpZW50LVNDQ1AtQWRkcmVzcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU00tUHJvdG9jb2wtSUQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBUcmFmZmljLURhdGEtVm9sdW1lcyAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVHJhZmZpYy1EYXRhLVZvbHVtZXMifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlFvUy1JbmZvcm1hdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBY2NvdW50aW5nLUlucHV0LU9jdGV0cyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJBY2NvdW50aW5nLU91dHB1dC1PY3RldHMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNoYW5nZS1Db25kaXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNoYW5nZS1UaW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICIzR1BQLVVzZXItTG9jYXRpb24tSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVVdBTi1Vc2VyLUxvY2F0aW9uLUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIjNHUFAtQ2hhcmdpbmctSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlByZXNlbmNlLVJlcG9ydGluZy1BcmVhLVN0YXR1cyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVXNlci1DU0ctSW5mb3JtYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIjNHUFAtUkFULVR5cGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBMQ1MtSW5mb3JtYXRpb24gKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkxDUy1JbmZvcm1hdGlvbiJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTENTLUNsaWVudC1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTG9jYXRpb24tVHlwZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTG9jYXRpb24tRXN0aW1hdGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlBvc2l0aW9uaW5nLURhdGEifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIjNHUFAtSU1TSSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTVNJU0ROIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogVGFyaWZmLUluZm9ybWF0aW9uICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUYXJpZmYtSW5mb3JtYXRpb24ifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkN1cnJlbnQtVGFyaWZmIn0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlRhcmlmZi1UaW1lLUNoYW5nZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTmV4dC1UYXJpZmYifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBQcm9TZS1JbmZvcm1hdGlvbiAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUHJvU2UtSW5mb3JtYXRpb24ifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFubm91bmNpbmctVUUtSFBMTU4tSWRlbnRpZmllciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQW5ub3VuY2luZy1VRS1WUExNTi1JZGVudGlmaWVyIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNb25pdG9yaW5nLVVFLUhQTE1OLUlkZW50aWZpZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1vbml0b3JpbmctVUUtVlBMTU4tSWRlbnRpZmllciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUm9sZS1PZi1Qcm9TZS1GdW5jdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUHJvU2UtQXBwLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQcm9TZS0zcmQtUGFydHktQXBwbGljYXRpb24tSUQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFwcGxpY2F0aW9uLVNwZWNpZmljLURhdGEifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlByb1NlLUV2ZW50LVR5cGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlByb1NlLURpcmVjdC1EaXNjb3ZlcnktTW9kZWwifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlByb1NlLUZ1bmN0aW9uLUlQLUFkZHJlc3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlByb1NlLUZ1bmN0aW9uLUlEIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQcm9TZS1WYWxpZGl0eS1UaW1lciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUHJvU2UtUm9sZS1PZi1VRSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUHJvU2UtUmVxdWVzdC1UaW1lc3RhbXAifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlBDMy1Db250cm9sLVByb3RvY29sLUNhdXNlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNb25pdG9yaW5nLVVFLUlkZW50aWZpZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJlcXVlc3Rvci1QTE1OLUlkZW50aWZpZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk9yaWdpbi1BcHAtTGF5ZXItVXNlci1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiV0xBTi1MaW5rLUxheWVyLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJSZXF1ZXN0aW5nLUVQVUlEIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUYXJnZXQtQXBwLUxheWVyLVVzZXItSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJlcXVlc3RlZC1QTE1OLUlkZW50aWZpZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlRpbWUtV2luZG93In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQcm9TZS1SYW5nZS1DbGFzcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUHJveGltaXR5LUFsZXJ0LUluZGljYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlByb3hpbWl0eS1BbGVydC1UaW1lc3RhbXAifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlByb3hpbWl0eS1DYW5jZWxsYXRpb24tVGltZXN0YW1wIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQcm9TZS1SZWFzb24tRm9yLUNhbmNlbGxhdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUEMzLUVQQy1Db250cm9sLVByb3RvY29sLUNhdXNlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQcm9TZS1VRS1JRCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUHJvU2UtU291cmNlLUlQLUFkZHJlc3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkxheWVyLTItR3JvdXAtSUQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlByb1NlLUdyb3VwLUlQLU11bHRpY2FzdC1BZGRyZXNzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDb3ZlcmFnZS1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJSYWRpby1QYXJhbWV0ZXItU2V0LUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlRyYW5zbWl0dGVyLUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlRpbWUtRmlyc3QtVHJhbnNtaXNzaW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUaW1lLUZpcnN0LVJlY2VwdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUHJvU2UtRGlyZWN0LUNvbW11bmljYXRpb24tVHJhbnNtaXNzaW9uLURhdGEtQ29udGFpbmVyIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQcm9TZS1EaXJlY3QtQ29tbXVuaWNhdGlvbi1SZWNlcHRpb24tRGF0YS1Db250YWluZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBTTVMtSW5mb3JtYXRpb24gKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNNUy1JbmZvcm1hdGlvbiJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU01TLU5vZGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNsaWVudC1BZGRyZXNzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJPcmlnaW5hdG9yLVNDQ1AtQWRkcmVzcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU01TQy1BZGRyZXNzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJEYXRhLUNvZGluZy1TY2hlbWUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNNLURpc2NoYXJnZS1UaW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTTS1NZXNzYWdlLVR5cGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk9yaWdpbmF0b3ItSW50ZXJmYWNlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTTS1Qcm90b2NvbC1JRCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUmVwbHktUGF0aC1SZXF1ZXN0ZWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNNLVN0YXR1cyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU00tVXNlci1EYXRhLUhlYWRlciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTnVtYmVyLU9mLU1lc3NhZ2VzLVNlbnQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNNLVNlcXVlbmNlLU51bWJlciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUmVjaXBpZW50LUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk9yaWdpbmF0b3ItUmVjZWl2ZWQtQWRkcmVzcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU00tU2VydmljZS1UeXBlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTTVMtUmVzdWx0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTTS1EZXZpY2UtVHJpZ2dlci1JbmRpY2F0b3IifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNNLURldmljZS1UcmlnZ2VyLUluZm9ybWF0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogUmVhbC1UaW1lLVRhcmlmZi1JbmZvcm1hdGlvbiAqLworCSAgeworCQkvKiBHcm91cGVkICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGF2cDsKKwkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwX3ZlbmRvcl9wbHVzX25hbWUgPSAgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUmVhbC1UaW1lLVRhcmlmZi1JbmZvcm1hdGlvbiJ9OworCQlDSEVDS19kaWN0X3NlYXJjaChESUNUX0FWUCwgIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZhdnBfdmVuZG9yX3BsdXNfbmFtZSwgJmF2cCkKKwkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9CisJCXsKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVGFyaWZmLUluZm9ybWF0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUYXJpZmYtWE1MIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogQW9DLUluZm9ybWF0aW9uICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBb0MtSW5mb3JtYXRpb24ifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFvQy1Db3N0LUluZm9ybWF0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUYXJpZmYtSW5mb3JtYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFvQy1TdWJzY3JpcHRpb24tSW5mb3JtYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBNb25pdG9yaW5nLUV2ZW50LVJlcG9ydC1EYXRhICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNb25pdG9yaW5nLUV2ZW50LVJlcG9ydC1EYXRhIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIkV2ZW50LVRpbWVzdGFtcCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU0NFRi1SZWZlcmVuY2UtSUQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNDRUYtSUQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1vbml0b3JpbmctRXZlbnQtUmVwb3J0LU51bWJlciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ2hhcmdlZC1QYXJ0eSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJTdWJzY3JpcHRpb24tSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1vbml0b3JpbmctVHlwZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUmVhY2hhYmlsaXR5LUluZm9ybWF0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJFUFMtTG9jYXRpb24tSW5mb3JtYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNvbW11bmljYXRpb24tRmFpbHVyZS1JbmZvcm1hdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTnVtYmVyLU9mLVVFLVBlci1Mb2NhdGlvbi1SZXBvcnQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBPZmZsaW5lLUNoYXJnaW5nICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJPZmZsaW5lLUNoYXJnaW5nIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJRdW90YS1Db25zdW1wdGlvbi1UaW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUaW1lLVF1b3RhLU1lY2hhbmlzbSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRW52ZWxvcGUtUmVwb3J0aW5nIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIk11bHRpcGxlLVNlcnZpY2VzLUNyZWRpdC1Db250cm9sIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogSU1TLUluZm9ybWF0aW9uICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJJTVMtSW5mb3JtYXRpb24ifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkV2ZW50LVR5cGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJvbGUtT2YtTm9kZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTm9kZS1GdW5jdGlvbmFsaXR5In0sIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJVc2VyLVNlc3Npb24tSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk91dGdvaW5nLVNlc3Npb24tSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNlc3Npb24tUHJpb3JpdHkifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNhbGxpbmctUGFydHktQWRkcmVzcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ2FsbGVkLVBhcnR5LUFkZHJlc3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNhbGxlZC1Bc3NlcnRlZC1JZGVudGl0eSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ2FsbGVkLUlkZW50aXR5LUNoYW5nZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTnVtYmVyLVBvcnRhYmlsaXR5LVJvdXRpbmctSW5mb3JtYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNhcnJpZXItU2VsZWN0LVJvdXRpbmctSW5mb3JtYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFsdGVybmF0ZS1DaGFyZ2VkLVBhcnR5LUFkZHJlc3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJlcXVlc3RlZC1QYXJ0eS1BZGRyZXNzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBc3NvY2lhdGVkLVVSSSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVGltZS1TdGFtcHMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFwcGxpY2F0aW9uLVNlcnZlci1JbmZvcm1hdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiSW50ZXItT3BlcmF0b3ItSWRlbnRpZmllciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVHJhbnNpdC1JT0ktTGlzdCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiSU1TLUNoYXJnaW5nLUlkZW50aWZpZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNEUC1TZXNzaW9uLURlc2NyaXB0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTRFAtTWVkaWEtQ29tcG9uZW50In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTZXJ2ZWQtUGFydHktSVAtQWRkcmVzcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU2VydmVyLUNhcGFiaWxpdGllcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVHJ1bmstR3JvdXAtSUQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkJlYXJlci1TZXJ2aWNlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTZXJ2aWNlLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTZXJ2aWNlLVNwZWNpZmljLUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1lc3NhZ2UtQm9keSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ2F1c2UtQ29kZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUmVhc29uLUhlYWRlciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQWNjZXNzLU5ldHdvcmstSW5mb3JtYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNlbGx1bGFyLU5ldHdvcmstSW5mb3JtYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkVhcmx5LU1lZGlhLURlc2NyaXB0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJJTVMtQ29tbXVuaWNhdGlvbi1TZXJ2aWNlLUlkZW50aWZpZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIklNUy1BcHBsaWNhdGlvbi1SZWZlcmVuY2UtSWRlbnRpZmllciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiT25saW5lLUNoYXJnaW5nLUZsYWcifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJlYWwtVGltZS1UYXJpZmYtSW5mb3JtYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFjY291bnQtRXhwaXJhdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiSW5pdGlhbC1JTVMtQ2hhcmdpbmctSWRlbnRpZmllciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTk5JLUluZm9ybWF0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJGcm9tLUFkZHJlc3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIklNUy1FbWVyZ2VuY3ktSW5kaWNhdG9yIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJJTVMtVmlzaXRlZC1OZXR3b3JrLUlkZW50aWZpZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFjY2Vzcy1OZXR3b3JrLUluZm8tQ2hhbmdlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJBY2Nlc3MtVHJhbnNmZXItSW5mb3JtYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJlbGF0ZWQtSU1TLUNoYXJnaW5nLUlkZW50aWZpZXIifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJlbGF0ZWQtSU1TLUNoYXJnaW5nLUlkZW50aWZpZXItTm9kZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUm91dGUtSGVhZGVyLVJlY2VpdmVkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJSb3V0ZS1IZWFkZXItVHJhbnNtaXR0ZWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkluc3RhbmNlLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUQUQtSWRlbnRpZmllciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfQorCQl9OworCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBhdnAgKTsKKwkgIH0KKwkgIC8qIE1vbml0b3JpbmctRXZlbnQtSW5mb3JtYXRpb24gKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1vbml0b3JpbmctRXZlbnQtSW5mb3JtYXRpb24ifTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goRElDVF9BVlAsICBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmYXZwX3ZlbmRvcl9wbHVzX25hbWUsICZhdnApCisJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPQorCQl7CisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1vbml0b3JpbmctRXZlbnQtRnVuY3Rpb25hbGl0eSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDAsIC5hdnBfbmFtZSA9ICJFdmVudC1UaW1lc3RhbXAifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1vbml0b3JpbmctRXZlbnQtQ29uZmlndXJhdGlvbi1BY3Rpdml0eSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU0NFRi1SZWZlcmVuY2UtSUQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNDRUYtSUQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1vbml0b3JpbmctVHlwZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTWF4aW11bS1OdW1iZXItb2YtUmVwb3J0cyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTW9uaXRvcmluZy1EdXJhdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ2hhcmdlZC1QYXJ0eSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTWF4aW11bS1EZXRlY3Rpb24tVGltZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVUUtUmVhY2hhYmlsaXR5LUNvbmZpZ3VyYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1PTlRFLUxvY2F0aW9uLVR5cGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFjY3VyYWN5In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJOdW1iZXItT2YtVUUtUGVyLUxvY2F0aW9uLUNvbmZpZ3VyYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1vbml0b3JpbmctRXZlbnQtUmVwb3J0In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCSAgLyogUFMtSW5mb3JtYXRpb24gKi8KKwkgIHsKKwkJLyogR3JvdXBlZCAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IGF2cF92ZW5kb3JfcGx1c19uYW1lID0gIHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlBTLUluZm9ybWF0aW9uIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICIzR1BQLUNoYXJnaW5nLUlkIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQRE4tQ29ubmVjdGlvbi1DaGFyZ2luZy1JRCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTm9kZS1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiM0dQUC1QRFAtVHlwZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUERQLUFkZHJlc3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlBEUC1BZGRyZXNzLVByZWZpeC1MZW5ndGgifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkR5bmFtaWMtQWRkcmVzcy1GbGFnIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJEeW5hbWljLUFkZHJlc3MtRmxhZy1FeHRlbnNpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlFvUy1JbmZvcm1hdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU0dTTi1BZGRyZXNzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJHR1NOLUFkZHJlc3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlRERi1JUC1BZGRyZXNzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTR1ctQWRkcmVzcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRVBERy1BZGRyZXNzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUV0FHLUFkZHJlc3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNHLUFkZHJlc3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNlcnZpbmctTm9kZS1UeXBlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTR1ctQ2hhbmdlIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICIzR1BQLUlNU0ktTUNDLU1OQyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiSU1TSS1VbmF1dGhlbnRpY2F0ZWQtRmxhZyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiM0dQUC1HR1NOLU1DQy1NTkMifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIjNHUFAtTlNBUEkifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAwLCAuYXZwX25hbWUgPSAiQ2FsbGVkLVN0YXRpb24tSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIjNHUFAtU2VsZWN0aW9uLU1vZGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIjNHUFAtQ2hhcmdpbmctQ2hhcmFjdGVyaXN0aWNzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDaGFyZ2luZy1DaGFyYWN0ZXJpc3RpY3MtU2VsZWN0aW9uLU1vZGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIjNHUFAtU0dTTi1NQ0MtTU5DIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICIzR1BQLU1TLVRpbWVab25lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDaGFyZ2luZy1SdWxlLUJhc2UtTmFtZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQURDLVJ1bGUtQmFzZS1OYW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICIzR1BQLVVzZXItTG9jYXRpb24tSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVXNlci1Mb2NhdGlvbi1JbmZvLVRpbWUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlVzZXItQ1NHLUluZm9ybWF0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQcmVzZW5jZS1SZXBvcnRpbmctQXJlYS1JbmZvcm1hdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDU1MzUsIC5hdnBfbmFtZSA9ICIzR1BQMi1CU0lEIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJUV0FOLVVzZXItTG9jYXRpb24tSW5mbyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVVdBTi1Vc2VyLUxvY2F0aW9uLUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIjNHUFAtUkFULVR5cGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlBTLUZ1cm5pc2gtQ2hhcmdpbmctSW5mb3JtYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlBEUC1Db250ZXh0LVR5cGUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk9mZmxpbmUtQ2hhcmdpbmcifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlRyYWZmaWMtRGF0YS1Wb2x1bWVzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTZXJ2aWNlLURhdGEtQ29udGFpbmVyIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlVzZXItRXF1aXBtZW50LUluZm8ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlRlcm1pbmFsLUluZm9ybWF0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTdGFydC1UaW1lIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTdG9wLVRpbWUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNoYW5nZS1Db25kaXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkRpYWdub3N0aWNzIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJMb3ctUHJpb3JpdHktSW5kaWNhdG9yIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJOQklGT00tTW9kZSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTkJJRk9NLVN1cHBvcnQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1NRS1OdW1iZXItZm9yLU1ULVNNUyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTU1FLU5hbWUifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIk1NRS1SZWFsbSJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEzMDE5LCAuYXZwX25hbWUgPSAiTG9naWNhbC1BY2Nlc3MtSWQifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMzAxOSwgLmF2cF9uYW1lID0gIlBoeXNpY2FsLUFjY2Vzcy1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiRml4ZWQtVXNlci1Mb2NhdGlvbi1JbmZvIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDTi1PcGVyYXRvci1TZWxlY3Rpb24tRW50aXR5In0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJFbmhhbmNlZC1EaWFnbm9zdGljcyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU0dpLVB0UC1UdW5uZWxsaW5nLU1ldGhvZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQ1AtQ0lvVC1FUFMtT3B0aW1pc2F0aW9uLUluZGljYXRvciJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiVU5JLVBEVS1DUC1Pbmx5LUZsYWcifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlNlcnZpbmctUExNTi1SYXRlLUNvbnRyb2wifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkFQTi1SYXRlLUNvbnRyb2wifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkNoYXJnaW5nLVBlci1JUC1DQU4tU2Vzc2lvbi1JbmRpY2F0b3IifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlJSQy1DYXVzZS1Db3VudGVyIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICIzR1BQLVBTLURhdGEtT2ZmLVN0YXR1cyJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiU0NTLUFTLUFkZHJlc3MifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0KKwkJfTsKKwkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJICB9CisJICAvKiBTZXJ2aWNlLUluZm9ybWF0aW9uICovCisJICB7CisJCS8qIEdyb3VwZWQgKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOworCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBhdnBfdmVuZG9yX3BsdXNfbmFtZSA9ICB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTZXJ2aWNlLUluZm9ybWF0aW9uIn07CisJCUNIRUNLX2RpY3Rfc2VhcmNoKERJQ1RfQVZQLCAgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cF92ZW5kb3JfcGx1c19uYW1lLCAmYXZwKQorCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0KKwkJeworCQkJeyB7IC5hdnBfdmVuZG9yID0gMCwgLmF2cF9uYW1lID0gIlN1YnNjcmlwdGlvbi1JZCJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiQW9DLUluZm9ybWF0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJQUy1JbmZvcm1hdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiSU1TLUluZm9ybWF0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNTVMtSW5mb3JtYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIkxDUy1JbmZvcm1hdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiUG9DLUluZm9ybWF0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJNQk1TLUluZm9ybWF0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJTTVMtSW5mb3JtYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlZDUy1JbmZvcm1hdGlvbiJ9LCBSVUxFX09QVElPTkFMLCAtMSwgLTEgfSwKKwkJCXsgeyAuYXZwX3ZlbmRvciA9IDEwNDE1LCAuYXZwX25hbWUgPSAiTU1UZWwtSW5mb3JtYXRpb24ifSwgUlVMRV9PUFRJT05BTCwgLTEsIC0xIH0sCisJCQl7IHsgLmF2cF92ZW5kb3IgPSAxMDQxNSwgLmF2cF9uYW1lID0gIlByb1NlLUluZm9ybWF0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9LAorCQkJeyB7IC5hdnBfdmVuZG9yID0gMTA0MTUsIC5hdnBfbmFtZSA9ICJDUERULUluZm9ybWF0aW9uIn0sIFJVTEVfT1BUSU9OQUwsIC0xLCAtMSB9CisJCX07CisJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCSAgfQorCisgICB9CQorCisgICAvKiBDb21tYW5kcyBzZWN0aW9uICovCisgICB7CisKKyAgIH0KKworICAgTE9HX0QoICJFeHRlbnNpb24gJ0RpY3Rpb25hcnkgZGVmaW5pdGlvbnMgZm9yIHRzMzIyOTlfYXZwcyAoZTMwKScgaW5pdGlhbGl6ZWQiKTsKKyAgIHJldHVybiAwOworfQorCitpbnQgZGljdF9lbnRyeShjaGFyICogY29uZmZpbGUpCit7CisJZGljdF90czMyMjk5X2F2cHNfbG9hZF9kZWZzKGNvbmZmaWxlKTsKKwlyZXR1cm4gZGljdF90czMyMjk5X2F2cHNfbG9hZF9ydWxlcyhjb25mZmlsZSk7Cit9CisKK2NvbnN0IGNoYXIqIGRpY3RfdHMzMjI5OV9hdnBzX3Byb3RvX3ZlcihjaGFyICogY29uZmZpbGUpIHsKKwlyZXR1cm4gdHMzMjI5OV9hdnBzX3Byb3RvX3ZlcjsKK30KKworY29uc3QgZG91YmxlIGRpY3RfdHMzMjI5OV9hdnBzX2dlbl90cyhjaGFyICogY29uZmZpbGUpIHsKKwlyZXR1cm4gdHMzMjI5OV9hdnBzX2dlbl9kYXRlOworfQorCitFWFRFTlNJT05fRU5UUlkyKCJkaWN0X3RzMzIyOTlfYXZwcyIsIGRpY3RfdHMzMjI5OV9hdnBzX2xvYWRfZGVmcywgZGljdF90czMyMjk5X2F2cHNfbG9hZF9ydWxlcywgImRpY3RfdHMyOTI3Ml9hdnBzIiwgImRpY3RfdHMyOTI3M19hdnBzIiwgImRpY3RfdHMyOTIxMl9hdnBzIiwgImRpY3RfdHMyOTMzNl9hdnBzIiwgImRpY3RfdHMyOTEyOF9hdnBzIiwgImRpY3RfdHMyOTIxNF9hdnBzIiwgImRpY3RfdHMyOTM0NV9hdnBzIiwgImRpY3RfdHMyOTMzN19hdnBzIiwgImRpY3RfdHMyOTM0NF9hdnBzIiwgImRpY3RfdHMyOTM2OF9hdnBzIiwgImRpY3RfdHMyOTIxN19hdnBzIiwgImRpY3RfdHMyOTIyOV9hdnBzIiwgImRpY3RfdHMyOTMzOF9hdnBzIiwgImRpY3RfdHMyOTQ2OF9hdnBzIiwgImRpY3RfdHMyOTMyOV9hdnBzIiwgImRpY3RfdHMyOTA2MV9hdnBzIiwgImRpY3RfcmZjNTc3OF9hdnBzIiwgImRpY3RfdHMyOTE3M19hdnBzIiwgImRpY3RfcmZjNDAwNmJpc19hdnBzIiwgImRpY3RfdHMyOTM0M19hdnBzIiwgImRpY3RfcmZjNzE1NV9hdnBzIiwgImRpY3RfcmZjNTQ0N19hdnBzIiwgImRpY3RfcmZjNzY4M19hdnBzIiwgImRpY3RfcmZjNDU5MF9hdnBzIiwgImRpY3RfZHJhZnRsb2FkX2F2cHMiLCAiZGljdF9yZmM0MDA0X2F2cHMiLCAiZGljdF9yZmM1Nzc3X2F2cHMiLCAiZGljdF9ldHNpMjgzMDM0X2F2cHMiLCAiZGljdF8zZ3BwMl9hdnBzIiwgImRpY3RfcmZjNzk0NF9hdnBzIik7CisKKworCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2RpY3RfdHMzMjI5OV9hdnBzL3RzMzIyOTlfYXZwcy5kaWQgYi9leHRlbnNpb25zL2RpY3RfdHMzMjI5OV9hdnBzL3RzMzIyOTlfYXZwcy5kaWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJiMjllZQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZGljdF90czMyMjk5X2F2cHMvdHMzMjI5OV9hdnBzLmRpZApAQCAtMCwwICsxLDM3IEBACitkaWN0X3RzMjkzNDNfYXZwcworZGljdF90czI5MTI4X2F2cHMKK2RpY3RfdHMyOTM0NV9hdnBzCitkaWN0X3RzMjkzMzdfYXZwcworZGljdF90czI5MjE3X2F2cHMKK2RpY3RfdHMyOTM0NF9hdnBzCitkaWN0X3RzMjkxNzNfYXZwcworZGljdF90czI5MzM4X2F2cHMKK2RpY3RfdHMyOTQ2OF9hdnBzCitkaWN0XzNncHAyX2F2cHMKK2RpY3RfdHMyOTIxNV9hdnBzCitkaWN0X3RzMjkxNTRfYXZwcworZGljdF90czI5MjE0X2F2cHMKK2RpY3RfcmZjNjk0Ml9hdnBzCitkaWN0X3JmYzY3MzRfYXZwcworZGljdF9yZmM1NTgwX2F2cHMKK2RpY3RfcmZjNDA3Ml9hdnBzCitkaWN0X3RzMjkyNzNfYXZwcworZGljdF9yZmM0MDA2YmlzX2F2cHMKK2RpY3RfdHMyOTIxMl9hdnBzCitkaWN0X3RzMjkwNjFfYXZwcworZGljdF90czI5MjcyX2F2cHMKK2RpY3RfcmZjNTQ0N19hdnBzCitkaWN0X3JmYzU3NzhfYXZwcworZGljdF9yZmM1Nzc3X2F2cHMKK2RpY3RfdHMyOTMzNl9hdnBzCitkaWN0X2V0c2kyODMwMzRfYXZwcworZGljdF9yZmM0NTkwX2F2cHMKK2RpY3RfcmZjNDAwNF9hdnBzCitkaWN0X3JmYzcxNTVfYXZwcworZGljdF90czI5MjI5X2F2cHMKK2RpY3RfcmZjNzY4M19hdnBzCitkaWN0X2RyYWZ0bG9hZF9hdnBzCitkaWN0X3JmYzc5NDRfYXZwcworZGljdF90czI5MzI5X2F2cHMKK2RpY3RfdHMyOTM2OF9hdnBzCitkaWN0X3RzMzIyOTlfYXZwcwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9mZGJ1aWxkX2NvbmYuc2ggYi9leHRlbnNpb25zL2ZkYnVpbGRfY29uZi5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDA5NzI3Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9mZGJ1aWxkX2NvbmYuc2gKQEAgLTAsMCArMSw0MiBAQAorI0NvcHlyaWdodCAoYykgMjAxNyBTcHJpbnQKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIS9iaW4vc2gKKwordXNhZ2UgKCkgCit7CisgIGVjaG8gIlNjYW5zIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBhbmQgYWRkcywgYXMgcmVxdWlyZWQsIHRoZSAiCisgIGVjaG8gImV4dGVuc2lvbnMgdG8gdGhlIHNwZWNpZmllZCBjb25maWcgZmlsZSBpbnRpYWxseSBkaXNhYmxlZC4iCisgIGVjaG8gIlVzYWdlOiAkMCA8Y29uZmlnIGZpbGU+IgorfQorCitpZiBbICIkIyIgLW5lIDEgXTsgdGhlbgorICB1c2FnZQorICBleGl0IDAKK2ZpCisKK2lmIFsgLWUgJDEgXTsgdGhlbgorICBlY2hvICJVcGRhdGluZyAkMSIKKyAgZm9yIEQgaW4gKjsgZG8KKyAgICBpZiBbIC1kICIke0R9IiBdOyB0aGVuCisgICAgICBJTkRJUj1gZ3JlcCAtYyAiJHtEfS5mZHgiICQxYAorICAgICAgaWYgWyAiJElORElSIiAtZXEgMCBdOyB0aGVuCisJZWNobyAiQWRkaW5nICR7RH0gdG8gZmlsZSIKKwlzZWQgLWkgJyQgaSNMb2FkRXh0ZW5zaW9uID0gXCIvdXNyL2xvY2FsL2xpYi9mcmVlRGlhbWV0ZXIvJyIke0R9IicuZmR4XCI7JyAkMQorICAgICAgZmkKKyAgICBmaQorICBkb25lCitlbHNlCisgIGVjaG8gIkZpbGUgJDEgZG9lcyBub3QgZXhpc3QuIFBsZWFzZSBwcm92aWRlIHZhbGlkIGNvbmZpZyBmaWxlXG4iCitmaQpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9mZGJ1aWxkX21ha2Uuc2ggYi9leHRlbnNpb25zL2ZkYnVpbGRfbWFrZS5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTEzZGZkCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9mZGJ1aWxkX21ha2Uuc2gKQEAgLTAsMCArMSw0MyBAQAorI0NvcHlyaWdodCAoYykgMjAxNyBTcHJpbnQKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIS9iaW4vc2gKKwordXNhZ2UgKCkKK3sKKyAgZWNobyAiU2NhbnMgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGFuZCBhZGRzLCBhcyByZXF1aXJlZCwgdGhlICIKKyAgZWNobyAic3ViZGlyZWN0b3JpZXMgdG8gdGhlIHNwZWNpZmllZCBjbWFrZSBmaWxlIHdpdGggdGhlaXIgYnVpbGQgT04gKGVuYWJsZWQpLiIKKyAgZWNobyAiVXNhZ2U6ICQwIDxtYWtlIGZpbGU+IgorfQorCisKK2lmIFsgIiQjIiAtbmUgMSBdOyB0aGVuCisgIHVzYWdlCisgIGV4aXQgMAorZmkKKworaWYgWyAtZSAkMSBdOyB0aGVuCisgIGVjaG8gIlVwZGF0aW5nICQxIgorICBmb3IgRCBpbiAqOyBkbworICAgIGlmIFsgLWQgIiR7RH0iIF07IHRoZW4KKyAgICAgIElORElSPWBncmVwIC1jIEZEX0VYVEVOU0lPTl9TVUJESVJcKCR7RH0gJDFgCisgICAgICBpZiBbICIkSU5ESVIiIC1lcSAwIF07IHRoZW4KKwllY2hvICJBZGRpbmcgJHtEfSB0byBmaWxlIgorCWVjaG8gIkZEX0VYVEVOU0lPTl9TVUJESVIoJHtEfSBcIiR7RH0gZXh0ZW5zaW9uIGxpYnJhcnlcIiBPTikiID4+ICQxCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKK2Vsc2UKKyAgZWNobyAiRmlsZSAkMSBkb2Vzbid0IGV4aXN0LlBsZWFzZSBwcm92aWRlIHZhbGlkIG1ha2UgZmlsZVxuIgorZmkKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZmRkaWN0X2NvbmYuc2ggYi9leHRlbnNpb25zL2ZkZGljdF9jb25mLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MDk2ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2ZkZGljdF9jb25mLnNoCkBAIC0wLDAgKzEsNTUgQEAKKyNDb3B5cmlnaHQgKGMpIDIwMTcgU3ByaW50CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyEvYmluL3NoCisKK3VzYWdlICgpIAoreworICBlY2hvICJVc2FnZTogJDAgPGRpY3Rpb25hcnkgbmFtZT4gPE9OfE9GRj4gPGNvbmZpZyBmaWxlPiIKK30KKworaWYgWyAiJCMiIC1uZSAzIF07IHRoZW4KKyAgdXNhZ2UKKyAgZXhpdCAwCitmaQorCitpZiBbICIkMiIgIT0gIk9OIiBdICYmIFsgIiQyIiAhPSAiT0ZGIiBdOyB0aGVuCisgIHVzYWdlCisgIGV4aXQKK2ZpIAorCitEQ1RESVI9JDEKK1NUQVRFPSQyCitDRkdGSUxFPSQzCisKK2lmIFsgLWUgJDMgXTsgdGhlbgorICBpZiBbIC1kICIke0RDVERJUn0iIF07IHRoZW4KKyAgICBJTkRJUj1gZ3JlcCAtYyAiJHtEQ1RESVJ9LmZkeCIgJDNgCisgICAgaWYgWyAiJElORElSIiAtZXEgMCBdOyB0aGVuCisgICAgICBlY2hvICJBZGRpbmcgJHtEQ1RESVJ9IHRvIGZpbGUiCisgICAgICBzZWQgLWkgJyRpI0xvYWRFeHRlbnNpb24gPSAiL3Vzci9sb2NhbC9saWIvZnJlZURpYW1ldGVyLyciJHtEQ1RESVJ9IicuZmR4IjsnICR7Q0ZHRklMRX0KKyAgICBlbGlmIFsgIiR7U1RBVEV9IiA9ICJPTiIgXTsgdGhlbgorICAgICAgZWNobyAiVHVybmluZyBPbiIKKyAgICAgIHNlZCAtaSAncy9cI0xvYWRFeHRlbnNpb24gPSAiXC91c3JcL2xvY2FsXC9saWJcL2ZyZWVEaWFtZXRlclwvJyIke0RDVERJUn0iJy5mZHgiOy9Mb2FkRXh0ZW5zaW9uID0gIlwvdXNyXC9sb2NhbFwvbGliXC9mcmVlRGlhbWV0ZXJcLyciJHtEQ1RESVJ9IicuZmR4IjsvZycgJHtDRkdGSUxFfQorICAgIGVsc2UKKyAgICAgIGVjaG8gIlR1cm5pbmcgT2ZmIgorICAgICAgc2VkIC1pLmJhayAtZSAncy9Mb2FkRXh0ZW5zaW9uID0gIlwvdXNyXC9sb2NhbFwvbGliXC9mcmVlRGlhbWV0ZXJcLyciJHtEQ1RESVJ9IicuZmR4IjsvI0xvYWRFeHRlbnNpb24gPSAiXC91c3JcL2xvY2FsXC9saWJcL2ZyZWVEaWFtZXRlclwvJyIke0RDVERJUn0iJy5mZHgiOy9nJyAke0NGR0ZJTEV9CisgICAgZmkKKyAgZWxzZQorICAgIGVjaG8gIkRpcmVjdG9yeSAkMSBkb2Vzbid0IGV4aXN0XG4iCisgIGZpCitlbHNlCisgIGVjaG8gIkZpbGUgJDMgZG9lc24ndCBleGlzdC4gUGxlYXNlIHByb3ZpZGUgdmFsaWQgY29uZiBmaWxlXG4iCitmaQorICAKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZmRkaWN0X2NvbmZhbGwuc2ggYi9leHRlbnNpb25zL2ZkZGljdF9jb25mYWxsLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2YmM0OGMKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2ZkZGljdF9jb25mYWxsLnNoCkBAIC0wLDAgKzEsNTEgQEAKKyNDb3B5cmlnaHQgKGMpIDIwMTcgU3ByaW50CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyEvYmluL3NoCisKK3VzYWdlICgpIAoreworICBlY2hvICJVc2FnZTogJDAgPGRpY3Rpb25hcnkgbmFtZT4gPE9OfE9GRj4gPGNvbmZpZyBmaWxlPiIKK30KKworaWYgWyAiJCMiIC1uZSAzIF07IHRoZW4KKyAgdXNhZ2UKKyAgZXhpdCAwCitmaQorCitpZiBbICIkMiIgIT0gIk9OIiBdICYmIFsgIiQyIiAhPSAiT0ZGIiBdOyB0aGVuCisgIHVzYWdlCisgIGV4aXQKK2ZpIAorCitEQ1RESVI9JDEKK1NUQVRFPSQyCitDRkdGSUxFPSQzCisKK2lmIFsgLWUgJDMgXTsgdGhlbgorICBpZiBbIC1kICJkaWN0XyR7RENURElSfSIgXTsgdGhlbgorICAgIGlmIFsgLWUgImRpY3RfJHtEQ1RESVJ9LyR7RENURElSfS5kaWQiIF07IHRoZW4KKyAgICAgIHdoaWxlIHJlYWQgcDsgZG8KKyAgICAgICAgZWNobyAiVHVybmluZyAkcCAkMiIKKyAgICAgICAgLi9mZGRpY3RfY29uZi5zaCAkcCAkMiAkMyAKKyAgICAgIGRvbmUgPGRpY3RfJHtEQ1RESVJ9LyR7RENURElSfS5kaWQgIAorICAgIGVsc2UKKyAgICAgIGVjaG8gImRpY3RfJHtEQ1RESVJ9LmRpZCB3YXMgbm90IHByZXNlbnQgLSBza2lwcGluZyIKKyAgICBmaQorICBlbHNlCisgICAgZWNobyAiRGlyZWN0b3J5IGRpY3RfJHtEQ1RESVJ9IGRvZXNuJ3QgZXhpc3RcbiIKKyAgZmkKK2Vsc2UKKyAgZWNobyAiRmlsZSAkMyBkb2Vzbid0IGV4aXN0LiBQbGVhc2UgcHJvdmlkZSB2YWxpZCBjb25maWcgZmlsZVxuIgorZmkKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZmRkaWN0X21ha2Uuc2ggYi9leHRlbnNpb25zL2ZkZGljdF9tYWtlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwN2VlZjgKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2ZkZGljdF9tYWtlLnNoCkBAIC0wLDAgKzEsNTUgQEAKKyNDb3B5cmlnaHQgKGMpIDIwMTcgU3ByaW50CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyEvYmluL3NoCisKK3VzYWdlICgpIAoreworICBlY2hvICJVc2VkIHRvIGNvbmZpZ3VyZSBjbWFrZSBmaWxlcyB0byB0dXJuIG9uL29mZiBidWlsZGluZyBhIHNwZWNpZmljIGRpY3Rpb25hcnkgIgorICBlY2hvICJVc2FnZTogJDAgPGRpY3Rpb25hcnkgbmFtZT4gPE9OfE9GRj4gPG1ha2UgZmlsZT4iCit9CisKK2lmIFsgIiQjIiAtbmUgMyBdOyB0aGVuCisgIHVzYWdlCisgIGV4aXQgMAorZmkKKworaWYgWyAiJDIiICE9ICJPTiIgXSAmJiBbICIkMiIgIT0gIk9GRiIgXTsgdGhlbgorICB1c2FnZQorICBleGl0CitmaSAKKworRENURElSPSQxCitTVEFURT0kMgorQ0ZHRklMRT0kMworCitpZiBbIC1lICQzIF07IHRoZW4gCisgIGlmIFsgLWQgIiR7RENURElSfSIgXTsgdGhlbgorICAgIElORElSPWBncmVwIC1jIEZEX0VYVEVOU0lPTl9TVUJESVJcKCR7RENURElSfSAkM2AKKyAgICBpZiBbICIkSU5ESVIiIC1lcSAwIF07IHRoZW4KKyAgICAgIGVjaG8gIkFkZGluZyAke0RDVERJUn0gdG8gZmlsZSIKKyAgICAgIGVjaG8gIkZEX0VYVEVOU0lPTl9TVUJESVIoJHtEQ1RESVJ9IFwiJHtEQ1RESVJ9IGV4dGVuc2lvbiBsaWJyYXJ5XCIgJDIpIiA+PiAke0NGR0ZJTEV9CisgICAgZWxpZiBbICIke1NUQVRFfSIgPSAiT04iIF07IHRoZW4KKyAgICAgIGVjaG8gIlR1cm5pbmcgT24iCisgICAgICBzZWQgLWkuYmFrIC1lICJzL0ZEX0VYVEVOU0lPTl9TVUJESVIoJHtEQ1RESVJ9XFwoLipcXClcIlxcKC4qXFwpXCJcXCguKlxcKSpPRkYpL0ZEX0VYVEVOU0lPTl9TVUJESVIoJHtEQ1RESVJ9XFwxXCJcXDJcIlxcM09OKS8iICR7Q0ZHRklMRX0KKyAgICBlbHNlCisgICAgICBlY2hvICJUdXJuaW5nIE9mZiIKKyAgICAgIHNlZCAtaS5iYWsgLWUgInMvRkRfRVhURU5TSU9OX1NVQkRJUigke0RDVERJUn1cXCguKlxcKVwiXFwoLipcXClcIlxcKC4qXFwpKk9OKS9GRF9FWFRFTlNJT05fU1VCRElSKCR7RENURElSfVxcMVwiXFwyXCJcXDNPRkYpLyIgJHtDRkdGSUxFfQorICAgIGZpCisgIGVsc2UKKyAgICBlY2hvICJEaXJlY3RvcnkgJHtEQ1RESVJ9IGRvZXNuJ3QgZXhpc3RcbiIKKyAgZmkKK2Vsc2UKKyAgZWNobyAiRmlsZSAkMyBkb2Vzbid0IGV4aXN0LiBQbGVhc2UgcHJvdmlkZSB2YWxpZCBtYWtlIGZpbGVcbiIKK2ZpCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2ZkZGljdF9tYWtlYWxsLnNoIGIvZXh0ZW5zaW9ucy9mZGRpY3RfbWFrZWFsbC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDI3NGNhCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9mZGRpY3RfbWFrZWFsbC5zaApAQCAtMCwwICsxLDU0IEBACisjQ29weXJpZ2h0IChjKSAyMDE3IFNwcmludAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMhL2Jpbi9zaAorCit1c2FnZSAoKSAKK3sKKyAgZWNobyAiVHVybnMgb24vb2ZmIGRpY3Rpb25hcnkgYnVpbGQgaW4gY21ha2UgZm9yIHRoZSBzcGVjaWZpZWQiCisgIGVjaG8gInNwZWNpZmljIChubyAnZGljdF8nIGluIGZyb250KSBhbmQgYWxsIGl0ZW1zIGl0IGRlcGVuZHMgdXBvbiIKKyAgZWNobyAiYXMgZGVmaW5lZCBpbiBpdHMgYXNzb2NpYXRlZCAuZGlkIGZpbGUuIgorICBlY2hvICJVc2FnZTogJDAgPGRpY3Rpb25hcnkgbmFtZT4gPE9OfE9GRj4gPG1ha2UgZmlsZT4iCit9CisKK2lmIFsgIiQjIiAtbmUgMyBdOyB0aGVuCisgIHVzYWdlCisgIGV4aXQgMAorZmkKKworaWYgWyAiJDIiICE9ICJPTiIgXSAmJiBbICIkMiIgIT0gIk9GRiIgXTsgdGhlbgorICB1c2FnZQorICBleGl0CitmaSAKKworRENURElSPSQxCitTVEFURT0kMgorQ0ZHRklMRT0kMworCitpZiBbIC1lICQzIF07IHRoZW4KKyAgaWYgWyAtZCAiZGljdF8ke0RDVERJUn0iIF07IHRoZW4KKyAgICBpZiBbIC1lICJkaWN0XyR7RENURElSfS8ke0RDVERJUn0uZGlkIiBdOyB0aGVuCisgICAgICB3aGlsZSByZWFkIHA7IGRvCisgICAgICAgIGVjaG8gIlR1cm5pbmcgJHAgJDIiCisgICAgICAgIC4vZmRkaWN0X21ha2Uuc2ggJHAgJDIgJDMgCisgICAgICBkb25lIDxkaWN0XyR7RENURElSfS8ke0RDVERJUn0uZGlkICAKKyAgICBlbHNlCisgICAgICBlY2hvICJkaWN0XyR7RENURElSfS5kaWQgd2FzIG5vdCBwcmVzZW50IC0gc2tpcHBpbmciCisgICAgZmkKKyAgZWxzZQorICAgIGVjaG8gIkRpcmVjdG9yeSBkaWN0XyR7RENURElSfSBkb2Vzbid0IGV4aXN0XG4iCisgIGZpCitlbHNlCisgIGVjaG8gIkZpbGUgJDMgZG9lc24ndCBleGlzdC4gUGxlYXNlIHByb3ZpZGUgdmFsaWQgbWFrZSBmaWxlXG4iCitmaQpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9ydF9idXN5cGVlcnMvQ01ha2VMaXN0cy50eHQgYi9leHRlbnNpb25zL3J0X2J1c3lwZWVycy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjI0ZDgxCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9ydF9idXN5cGVlcnMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwzMCBAQAorIyBUaGUgcnRfYnVzeXBlZXIgZXh0ZW5zaW9uCitQUk9KRUNUKCJIYW5kbGluZyBvZiBUT09fQlVTWSBtZXNzYWdlcyBhbmQgcmVsYXkgdGltZW91dCBjYXBhYmlsaXR5IHJvdXRpbmcgZXh0ZW5zaW9uIiBDKQorCisjIFBhcnNlciBmaWxlcworQklTT05fRklMRShydGJ1c3lfY29uZi55KQorRkxFWF9GSUxFKHJ0YnVzeV9jb25mLmwpCitTRVRfU09VUkNFX0ZJTEVTX1BST1BFUlRJRVMobGV4LnJ0YnVzeV9jb25mLmMgcnRidXN5X2NvbmYudGFiLmMgUFJPUEVSVElFUyBDT01QSUxFX0ZMQUdTICItSSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0iKQorCisjIExpc3Qgb2Ygc291cmNlIGZpbGVzCitTRVQoIFJUQlVTWV9TUkMKKwlydGJ1c3kuYworCXJ0YnVzeS5oCisJbGV4LnJ0YnVzeV9jb25mLmMKKwlydGJ1c3lfY29uZi50YWIuYworCXJ0YnVzeV9jb25mLnRhYi5oCispCisKK0lOQ0xVREVfRElSRUNUT1JJRVMoJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9KQorCisjIENvbXBpbGUgdGhlc2UgZmlsZXMgYXMgYSBmcmVlRGlhbWV0ZXIgZXh0ZW5zaW9uCitGRF9BRERfRVhURU5TSU9OKHJ0X2J1c3lwZWVycyAke1JUQlVTWV9TUkN9KQorCisKKyMjIyMKKyMjIElOU1RBTEwgc2VjdGlvbiAjIworCisjIFdlIGluc3RhbGwgd2l0aCB0aGUgZGFlbW9uIGNvbXBvbmVudCBiZWNhdXNlIGl0IGlzIGEgYmFzZSBmZWF0dXJlLgorSU5TVEFMTChUQVJHRVRTIHJ0X2J1c3lwZWVycworCUxJQlJBUlkgREVTVElOQVRJT04gJHtJTlNUQUxMX0VYVEVOU0lPTlNfU1VGRklYfQorCUNPTVBPTkVOVCBmcmVlRGlhbWV0ZXItZGFlbW9uKQpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9ydF9idXN5cGVlcnMvcnRidXN5LmMgYi9leHRlbnNpb25zL3J0X2J1c3lwZWVycy9ydGJ1c3kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTU0YTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9ydF9idXN5cGVlcnMvcnRidXN5LmMKQEAgLTAsMCArMSwyODEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDE1LCBXSURFIFByb2plY3QgYW5kIE5JQ1QJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFdJREUgUHJvamVjdCBvciBOSUNUIG5vciB0aGUgCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgV0lERSBQcm9qZWN0IGFuZCAJCQkJCQkgKgorKiAgIE5JQ1QuCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogU2VlIGRvYy9ydF9idXN5cGVlcnMuY29uZi5zYW1wbGUgZm9yIG1vcmUgZGV0YWlscyBhYm91dCB0aGUgZmVhdHVyZXMgb2YgdGhpcyBleHRlbnNpb24gKi8KKyNpbmNsdWRlICJydGJ1c3kuaCIKKworLyogVGhlIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlICovCitzdHJ1Y3QgcnRidXN5X2NvbmYgcnRidXN5X2NvbmY7CisKK3N0YXRpYyBzdHJ1Y3QgZmRfcnRfZndkX2hkbCAqIHJ0X2J1c3lfaGRsID0gTlVMTDsKKworc3RhdGljIHZvaWQgcnRidXN5X2V4cGlyZWNiKHZvaWQgKiBkYXRhLCBEaWFtSWRfdCBzZW50dG8sIHNpemVfdCBzZW50dG9sZW4sIHN0cnVjdCBtc2cgKiogcmVxKTsKKworLyogVGhlIGZ1bmN0aW9uIHRoYXQgZG9lcyB0aGUgYWN0dWFsIHdvcmsgKi8KK2ludCBydF9idXN5X3Byb2Nlc3NfYnVzeShzdHJ1Y3QgbXNnICoqIHBtc2csIGludCBpc19yZXEsIERpYW1JZF90IHNlbnR0bywgc2l6ZV90IHNlbnR0b2xlbiwgdW5pb24gYXZwX3ZhbHVlICpvaCkKK3sKKwlzdHJ1Y3QgbXNnICogcXJ5ID0gTlVMTDsKKwlzdHJ1Y3QgcnRfZGF0YSAqIHJ0ZCA9IE5VTEw7CisJc3RydWN0IGZkX2xpc3QgKiBjYW5kaWRhdGVzID0gTlVMTDsKKwlpbnQgc2VuZGluZ2F0dGVtcHRzOworCWludCByZXNlbmQgPSAxOworCQorCQorCVRSQUNFX0VOVFJZKCIlcCglcCkgJWQgJXAgJXAiLCBwbXNnLCBwbXNnPypwbXNnOk5VTEwsIGlzX3JlcSwgc2VudHRvLCBvaCk7CisJCisJaWYgKGlzX3JlcSkgeworCQlxcnkgPSAqcG1zZzsKKwl9IGVsc2UgeworCQlDSEVDS19GQ1QoIGZkX21zZ19hbnN3X2dldHEoICpwbXNnLCAmcXJ5ICkgKTsKKwl9CisJCisJQ0hFQ0tfRkNUKCBmZF9tc2dfcnRfZ2V0ICggcXJ5LCAmcnRkICkgKTsKKwlBU1NFUlQocnRkKTsKKwkKKwkvKiBydGQgaXMgdGhlIHJvdXRpbmcgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIHF1ZXJ5IHRoYXQgd2FzIHNlbnQgKi8KKwkKKwkvKiBTdG9yZSB0aGUgZXJyb3IgaW4gdGhpcyByb3V0aW5nIGRhdGEsIHRoaXMgYXZvaWRzIHNlbmRpbmcgdGhlIG1lc3NhZ2UgdG8gdGhlIHNhbWUgcGVlciBhZ2FpbiAqLworCUNIRUNLX0ZDVCggZmRfcnRkX2Vycm9yX2FkZChydGQsIAorCQkJCSAgICBzZW50dG8sIHNlbnR0b2xlbiwgCisJCQkJICAgICh1aW50OF90ICopKG9oID8gKERpYW1JZF90KW9oLT5vcy5kYXRhIDogZmRfZ19jb25maWctPmNuZl9kaWFtaWQpLCBvaCA/IG9oLT5vcy5sZW4gOiBmZF9nX2NvbmZpZy0+Y25mX2RpYW1pZF9sZW4gLCAKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJfRElBTUVURVJfVE9PX0JVU1ksIAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2FuZGlkYXRlcywgCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZW5kaW5nYXR0ZW1wdHMpICk7CisJCisJLyogTm93IHdlIG5lZWQgdG8gZGVjaWRlIGlmIHdlIHJlLXNlbmQgdGhpcyBxdWVyeSB0byBhIGRpZmZlcmVudCBwZWVyIG9yIHJldHVybiBhbiBlcnJvciB0byB1cHN0cmVhbSAqLworCQorCS8qIEZpcnN0LCBhcmUgd2UgZXhjZWVkaW5nIHRoZSBhbGxvd2VkIGF0dGVtcHRzPyAqLworCWlmIChydGJ1c3lfY29uZi5SZXRyeU1heFBlZXJzICE9IDApIHsKKwkJaWYgKHNlbmRpbmdhdHRlbXB0cyA+PSBydGJ1c3lfY29uZi5SZXRyeU1heFBlZXJzKSB7CisJCQlUUkFDRV9ERUJVRyhGVUxMLCAiTWF4aW11bSBudW1iZXIgb2Ygc2VuZGluZyBhdHRlbXB0cyByZWFjaGVkIGZvciBtZXNzYWdlICVwLCByZXR1cm5pbmcgYW4gZXJyb3IgdXBzdHJlYW0iLCBxcnkpOworCQkJcmVzZW5kID0gMDsKKwkJfQorCX0KKwkKKwlpZiAocmVzZW5kKSB7CisJCS8qIENoZWNrIGlmIHdlIGhhdmUgYW55IHZhbGlkIGNhbmRpZGF0ZSBsZWZ0IGZvciBzZW5kaW5nIHRoZSBtZXNzYWdlLiBUaGlzIG1heSBub3QgYmUgMTAwJSBhY2N1cmF0ZSBidXQgdGhlcmUgc2hvdWxkIG5vdCBiZQorCQlhbnkgc2l0dWF0aW9uIHdoZXJlIHRoaXMgaXMgYWN0dWFsbHkgYW4gaXNzdWUuICovCisJCWlmIChGRF9JU19MSVNUX0VNUFRZKGNhbmRpZGF0ZXMpKSB7CisJCQlyZXNlbmQgPSAwOworCQl9IGVsc2UgeworCQkJc3RydWN0IHJ0ZF9jYW5kaWRhdGUgKiBmaXJzdCA9IGNhbmRpZGF0ZXMtPm5leHQtPm87CisJCQlpZiAoZmlyc3QtPnNjb3JlIDwgMCkgLyogTm8gbW9yZSBjYW5kaWRhdGUgYXZhaWxhYmxlICovCisJCQkJcmVzZW5kID0gMDsKKwkJfQorCX0KKwkKKwkvKiBPaywgbm93IGFjdCBvbiB0aGUgbWVzc2FnZSwgd2Uga25vdyB3aGF0IHRvIGRvICovCisJaWYgKHJlc2VuZCkgeworCQlpZiAoIWlzX3JlcSkgeworCQkJLyogV2UgbXVzdCBmcmVlIHRoZSBhbnN3ZXIgd2UgcmVjZWl2ZWQsIGFuZCBzZW5kIHRoZSBxdWVyeSBhZ2FpbiAqLworCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYW5zd19kZXRhY2goKnBtc2cpICk7CisJCQlDSEVDS19GQ1QoIGZkX21zZ19mcmVlKCpwbXNnKSApOworCQkJKnBtc2cgPSBxcnk7CisJCX0KKwkJLyogU2VuZCB0aGUgcXVlcnkgYWdhaW4uIFdlICBuZWVkIHRvIHJlLWFzc29jaWF0ZSB0aGUgZXhwaXJlY2Igd2hpY2ggd2FzIGNsZWFuZWQsIGlmIGl0IGlzIHVzZWQgKi8KKwkJaWYgKHJ0YnVzeV9jb25mLlJlbGF5VGltZW91dCkgeworCQkJY2hhciAqYnVmID0gTlVMTDsKKwkJCXNpemVfdCBsZW47CisJCQlzdHJ1Y3QgdGltZXNwZWMgZXhwaXJlOworCQkJQ0hFQ0tfU1lTKCAgY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJmV4cGlyZSkgICk7CisJCQlleHBpcmUudHZfc2VjICs9IHJ0YnVzeV9jb25mLlJlbGF5VGltZW91dC8xMDAwICsgKChleHBpcmUudHZfbnNlYyArICgxMDAwMDAwTEwgKiAocnRidXN5X2NvbmYuUmVsYXlUaW1lb3V0ICUgMTAwMCkpKSAvIDEwMDAwMDAwMDBMTCk7CisJCQlleHBpcmUudHZfbnNlYyA9IChleHBpcmUudHZfbnNlYyArICgxMDAwMDAwTEwgKiAocnRidXN5X2NvbmYuUmVsYXlUaW1lb3V0ICUgMTAwMCkpKSAlIDEwMDAwMDAwMDBMTDsKKwkJCUNIRUNLX01BTExPQ19ETyggZmRfbXNnX2R1bXBfZnVsbCgmYnVmLCAmbGVuLCBOVUxMLCAqcG1zZywgZmRfZ19jb25maWctPmNuZl9kaWN0LCAwLCAxKSwgLyogbm90aGluZyAqLyk7CisJCQlUUkFDRV9FUlJPUiggIk5vIGFuc3dlciByZWNlaXZlZCBmb3IgbWVzc2FnZSBmcm9tIHBlZXIgJyUuKnMnIGJlZm9yZSB0aW1lb3V0ICglZG1zKSwgcmUtc2VuZGluZzogJXMiLCAoaW50KXNlbnR0b2xlbiwgc2VudHRvLAorCQkJCSAgICAgcnRidXN5X2NvbmYuUmVsYXlUaW1lb3V0LCBidWYpOworCQkJZnJlZShidWYpOworCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfc2VuZF90aW1lb3V0KCBwbXNnLCBOVUxMLCBOVUxMLCBydGJ1c3lfZXhwaXJlY2IsICZleHBpcmUgKSApOworCQl9IGVsc2UgeworCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfc2VuZChwbXNnLCBOVUxMLCBOVUxMKSApOworCQl9CisJCisJfSBlbHNlIHsKKwkJaWYgKGlzX3JlcSkgeworCQkJY2hhciAqYnVmID0gTlVMTDsKKwkJCXNpemVfdCBsZW47CisKKwkJCUNIRUNLX01BTExPQ19ETyggZmRfbXNnX2R1bXBfZnVsbCgmYnVmLCAmbGVuLCBOVUxMLCAqcG1zZywgZmRfZ19jb25maWctPmNuZl9kaWN0LCAwLCAxKSwgLyogbm90aGluZyAqLyk7CisJCQlUUkFDRV9FUlJPUiggIk5vIGFuc3dlciByZWNlaXZlZCBmb3IgbWVzc2FnZSBmcm9tIHBlZXIgJyUuKnMnIGJlZm9yZSB0aW1lb3V0ICglZG1zKSwgZ2l2aW5nIHVwIGFuZCBzZW5kaW5nIGVycm9yIHJlcGx5OiAlcyIsIChpbnQpc2VudHRvbGVuLCBzZW50dG8sCisJCQkJICAgICBydGJ1c3lfY29uZi5SZWxheVRpbWVvdXQsIGJ1Zik7CisJCQlmcmVlKGJ1Zik7CisJCQkvKiBXZSBtdXN0IGNyZWF0ZSBhbiBhbnN3ZXIgKi8KKwkJCUNIRUNLX0ZDVCggZmRfbXNnX25ld19hbnN3ZXJfZnJvbV9yZXEgKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIHBtc2csIE1TR0ZMX0FOU1dfRVJST1IgKSApOworCQkJCisJCQlDSEVDS19GQ1QoIGZkX21zZ19yZXNjb2RlX3NldCgqcG1zZywgIkRJQU1FVEVSX1RPT19CVVNZIiwgIltydF9idXN5cGVlcnNdIFRpbWVvdXQgcmVhY2hlZCB3aGlsZSB3YWl0aW5nIGZvciBhbiBhbnN3ZXIiLCBOVUxMLCAxICkgKTsKKwkJCisJCQlDSEVDS19GQ1QoIGZkX21zZ19zZW5kKHBtc2csIE5VTEwsIE5VTEwpICk7CisJCX0KKwkJLyogT3RoZXJ3aXNlLCB3ZSBoYXZlIG5vdGhpbmcgdG8gZG8gYXQgYWxsLCB0aGUgYW5zd2VyIHdpbGwgYmUgZm9yd2FyZGVkIHVwc3RyZWFtIGFzIHBhcnQgb2YgdGhlIG5vcm1hbCBwcm9jZXNzaW5nICovCisJCisJfQorCQorCXJldHVybiAwOworfQorCisvKiBDYWxsYmFjayBjYWxsZWQgb24gZXhwaXJ5IG9mIHRoZSB0aW1lb3V0IHRpbWVyICovCitzdGF0aWMgdm9pZCBydGJ1c3lfZXhwaXJlY2Iodm9pZCAqIGRhdGEsIERpYW1JZF90IHNlbnR0bywgc2l6ZV90IHNlbnR0b2xlbiwgc3RydWN0IG1zZyAqKiBwcmVxKQoreworCUNIRUNLX0ZDVF9ETyggcnRfYnVzeV9wcm9jZXNzX2J1c3kocHJlcSwgMSwgc2VudHRvLCBzZW50dG9sZW4sIE5VTEwpLCAvKiBjb250aW51ZSAqLyApOworfQorCisvKiB0aGUgcm91dGluZyBjYWxsYmFjayB0aGF0IGhhbmRsZXMgYWxsIHRoZSB0YXNrcyBvZiB0aGlzIGV4dGVuc2lvbiAqLworc3RhdGljIGludCBydGJ1c3lfZndkX2NiKHZvaWQgKiBjYmRhdGEsIHN0cnVjdCBtc2cgKiogcG1zZykKK3sKKwlzdHJ1Y3QgbXNnX2hkciAqIGhkcjsKKwlzdHJ1Y3QgYXZwICogYXZwOworCXVuaW9uIGF2cF92YWx1ZSAqYV9yYyA9IE5VTEwsICphX29oID0gTlVMTDsKKwlEaWFtSWRfdCBzZW50dG8gPSBOVUxMOworCXNpemVfdCBzZW50dG9sZW47CisJCisJLyogR2V0IHRoZSBoZWFkZXIgb2YgdGhlIG1lc3NhZ2UgKi8KKwlDSEVDS19GQ1QoIGZkX21zZ19oZHIoKnBtc2csICZoZHIpICk7CisJCisJLyogSWYgdGhlIG1lc3NhZ2UgaXMgYSByZXF1ZXN0LCB3ZSBvbmx5IGFzc29jaWF0ZSB0aGUgdGltZW91dCAqLworCWlmIChoZHItPm1zZ19mbGFncyAmIENNRF9GTEFHX1JFUVVFU1QpIHsKKwkJc3RydWN0IHRpbWVzcGVjIGV4cGlyZTsKKwkJQ0hFQ0tfU1lTKCAgY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJmV4cGlyZSkgICk7CisJCWV4cGlyZS50dl9zZWMgKz0gcnRidXN5X2NvbmYuUmVsYXlUaW1lb3V0LzEwMDAgKyAoKGV4cGlyZS50dl9uc2VjICsgKDEwMDAwMDBMTCAqIChydGJ1c3lfY29uZi5SZWxheVRpbWVvdXQgJSAxMDAwKSkpIC8gMTAwMDAwMDAwMExMKTsKKwkJZXhwaXJlLnR2X25zZWMgPSAoZXhwaXJlLnR2X25zZWMgKyAoMTAwMDAwMExMICogKHJ0YnVzeV9jb25mLlJlbGF5VGltZW91dCAlIDEwMDApKSkgJSAxMDAwMDAwMDAwTEw7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2Fuc2NiX2Fzc29jaWF0ZSggKnBtc2csIE5VTEwsIE5VTEwsIHJ0YnVzeV9leHBpcmVjYiwgJmV4cGlyZSApICk7CisJCXJldHVybiAwOworCX0KKwkKKwkvKiBGcm9tIHRoaXMgcG9pbnQsIHRoZSBtZXNzYWdlIGlzIGFuIGFuc3dlcjsgd2UgbmVlZCB0byBjaGVjayBpZiB0aGUgRSBmbGFnIGlzIHNldCBhbmQgaWYgdGhlIFJlc3VsdC1Db2RlIGlzIERJQU1FVEVSX1RPT19CVVNZICovCisJCisJaWYgKCEoaGRyLT5tc2dfZmxhZ3MgJiBDTURfRkxBR19FUlJPUikpIHsKKwkJLyogVGhpcyBhbnN3ZXIgZG9lcyBub3QgaGF2ZSB0aGUgRSBmbGFnLCBubyBuZWVkIHRvIHByb2Nlc3MgZnVydGhlciAqLworCQlyZXR1cm4gMDsKKwl9CisJCisJQ0hFQ0tfRkNUKCBmZF9tc2dfc291cmNlX2dldCggKnBtc2csICZzZW50dG8sICZzZW50dG9sZW4gKSApOworCQorCS8qIE5vdyBnZXQgdGhlIEFWUHMgd2UgYXJlIGludGVyZXN0ZWQgaW4gKi8KKwlDSEVDS19GQ1QoICBmZF9tc2dfYnJvd3NlKCpwbXNnLCBNU0dfQlJXX0ZJUlNUX0NISUxELCAmYXZwLCBOVUxMKSAgKTsKKwl3aGlsZSAoYXZwKSB7CisJCXN0cnVjdCBhdnBfaGRyICogYWhkcjsKKwkJCQorCQlDSEVDS19GQ1QoICBmZF9tc2dfYXZwX2hkciggYXZwLCAmYWhkciApICApOworCQlpZiAoISAoYWhkci0+YXZwX2ZsYWdzICYgQVZQX0ZMQUdfVkVORE9SKSkgeworCQkJc3dpdGNoIChhaGRyLT5hdnBfY29kZSkgeworCQkJCWNhc2UgQUNfT1JJR0lOX0hPU1Q6CisJCQkJCS8qIFBhcnNlIHRoaXMgQVZQICovCisJCQkJCUNIRUNLX0ZDVCggZmRfbXNnX3BhcnNlX2RpY3QgKCBhdnAsIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgTlVMTCApICk7CisJCQkJCUFTU0VSVCggYWhkci0+YXZwX3ZhbHVlICk7CisJCQkJCWFfb2ggPSBhaGRyLT5hdnBfdmFsdWU7CisJCQkJCWJyZWFrOworCQkJCQkKKwkJCQljYXNlIEFDX1JFU1VMVF9DT0RFOgorCQkJCQkvKiBQYXJzZSB0aGlzIEFWUCAqLworCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19wYXJzZV9kaWN0ICggYXZwLCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIE5VTEwgKSApOworCQkJCQlBU1NFUlQoIGFoZHItPmF2cF92YWx1ZSApOworCQkJCQlhX3JjID0gYWhkci0+YXZwX3ZhbHVlOworCQkJCQkKKwkJCQkJaWYgKGFfcmMtPnUzMiAhPSBFUl9ESUFNRVRFUl9UT09fQlVTWSkgeworCQkJCQkJLyogSXQgaXMgbm90IGEgVE9PX0JVU1kgZXJyb3IsIHdlIGRvbid0IGRvIGFueXRoaW5nICovCisJCQkJCQlnb3RvIG91dDsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCX0KKwkJCQorCQkJaWYgKGFfcmMgJiYgYV9vaCkKKwkJCQlicmVhazsKKwkJfQorCisJCS8qIEdvIHRvIG5leHQgQVZQICovCisJCUNIRUNLX0ZDVCggIGZkX21zZ19icm93c2UoYXZwLCBNU0dfQlJXX05FWFQsICZhdnAsIE5VTEwpICApOworCX0KKwkKKwkvKiBDaGVjayB3ZSBoYXZlIHJlY2VpdmVkIHRoZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24gKi8KKwlpZiAoIWFfcmMpIHsKKwkJVFJBQ0VfRVJST1IoICJJbnZhbGlkIERpYW1ldGVyIGFuc3dlciB3aXRob3V0IGEgUmVzdWx0LUNvZGUgQVZQLCBydF9idXN5cGVlciBtb2R1bGUgZ2F2ZSB1cCBwcm9jZXNzaW5nIik7CisJCWdvdG8gb3V0OworCX0KKwkKKwlpZiAoIWFfb2gpIHsKKwkJVFJBQ0VfRVJST1IoICJJbnZhbGlkIERpYW1ldGVyIGFuc3dlciB3aXRob3V0IGFuIE9yaWdpbi1Ib3N0IEFWUCwgcnRfYnVzeXBlZXIgbW9kdWxlIGdhdmUgdXAgcHJvY2Vzc2luZyIpOworCQlnb3RvIG91dDsKKwl9CisJCisJLyogUGFzcyB0aGlzIGVycm9yIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHByb2Nlc3NlcyBCVVNZIHN0YXR1cyAqLworCUNIRUNLX0ZDVCggcnRfYnVzeV9wcm9jZXNzX2J1c3kocG1zZywgMCwgc2VudHRvLCBzZW50dG9sZW4sIGFfb2gpICk7CisJCitvdXQ6CisJcmV0dXJuIDA7Cit9CisKKworLyogZW50cnkgcG9pbnQgKi8KK3N0YXRpYyBpbnQgcnRidXN5X2VudHJ5KGNoYXIgKiBjb25mZmlsZSkKK3sKKwllbnVtIGZkX3J0X2Z3ZF9kaXIgZGlyID0gUlRfRldEX0FOUzsKKwlUUkFDRV9FTlRSWSgiJXAiLCBjb25mZmlsZSk7CisJCisJLyogSW5pdGlhbGl6ZSB0aGUgY29uZmlndXJhdGlvbiAqLworCW1lbXNldCgmcnRidXN5X2NvbmYsIDAsIHNpemVvZihydGJ1c3lfY29uZikpOworCQorCS8qIFBhcnNlIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgKi8KKwlDSEVDS19GQ1QoIHJ0YnVzeV9jb25mX2hhbmRsZShjb25mZmlsZSkgKTsKKwkKKwlpZiAocnRidXN5X2NvbmYuU2tpcFRvb0J1c3lFcnJvcnMgJiYgIXJ0YnVzeV9jb25mLlJlbGF5VGltZW91dCkgeworCQlUUkFDRV9OT1RJQ0UoIltydF9idXN5cGVlcnNdIENvbmZpZ3VyYXRpb24gZmlsZSBkb2VzIG5vdCBzcGVjaWZ5IGFueSBiZWhhdmlvciAobm8gZWZmZWN0KSEiKTsKKwkJcmV0dXJuIDA7CisJfQorCQorCWlmIChydGJ1c3lfY29uZi5Ta2lwVG9vQnVzeUVycm9ycykKKwkJZGlyID0gUlRfRldEX1JFUTsgLyogaW4gdGhpcyBjYXNlLCBSZWxheVRpbWVvdXQgaXMgbm90IDAgKi8KKwllbHNlIGlmIChydGJ1c3lfY29uZi5SZWxheVRpbWVvdXQpCisJCWRpciA9IFJUX0ZXRF9BTEw7CisJCisJLyogUmVnaXN0ZXIgdGhlIGNhbGxiYWNrICovCisJQ0hFQ0tfRkNUKCBmZF9ydF9md2RfcmVnaXN0ZXIgKCBydGJ1c3lfZndkX2NiLCBOVUxMLCBkaXIsICZydF9idXN5X2hkbCApICk7CisJCisJLyogV2UncmUgZG9uZSAqLworCXJldHVybiAwOworfQorCisvKiBVbmxvYWQgKi8KK3ZvaWQgZmRfZXh0X2Zpbmkodm9pZCkKK3sKKwlUUkFDRV9FTlRSWSgpOworCQorCS8qIFVucmVnaXN0ZXIgdGhlIGNiICovCisJaWYgKHJ0X2J1c3lfaGRsKSAKKwkJQ0hFQ0tfRkNUX0RPKCBmZF9ydF9md2RfdW5yZWdpc3RlciAoIHJ0X2J1c3lfaGRsLCBOVUxMKSwgLyogY29udGludWUgKi8pOworCQorCS8qIERvbmUgKi8KKwlyZXR1cm4gOworfQorCitFWFRFTlNJT05fRU5UUlkoInJ0X2J1c3lwZWVycyIsIHJ0YnVzeV9lbnRyeSk7CmRpZmYgLS1naXQgYS9leHRlbnNpb25zL3J0X2J1c3lwZWVycy9ydGJ1c3kuaCBiL2V4dGVuc2lvbnMvcnRfYnVzeXBlZXJzL3J0YnVzeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2Y2U5MWMKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL3J0X2J1c3lwZWVycy9ydGJ1c3kuaApAQCAtMCwwICsxLDU0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxMywgV0lERSBQcm9qZWN0IGFuZCBOSUNUCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBXSURFIFByb2plY3Qgb3IgTklDVCBub3IgdGhlIAkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFdJREUgUHJvamVjdCBhbmQgCQkJCQkJICoKKyogICBOSUNULgkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiAgU2VlIHRoZSBydF9idXN5cGVlcnMuY29uZi5zYW1wbGUgZmlsZSBmb3IgdGhlIGZvcm1hdCBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgorICovCisgCisvKiBGcmVlRGlhbWV0ZXIncyBjb21tb24gaW5jbHVkZSBmaWxlICovCisjaW5jbHVkZSA8ZnJlZURpYW1ldGVyL2V4dGVuc2lvbi5oPgorCisKKy8qIFBhcnNlIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgKi8KK2ludCBydGJ1c3lfY29uZl9oYW5kbGUoY2hhciAqIGNvbmZmaWxlKTsKKworLyogVGhlIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlICovCitleHRlcm4gc3RydWN0IHJ0YnVzeV9jb25mIHsKKwlpbnQJU2tpcFRvb0J1c3lFcnJvcnM7CisJaW50CVJldHJ5RGlzdGFudFBlZXJzOworCWludAlSZXRyeU1heFBlZXJzOwkKKwlpbnQJUmVsYXlUaW1lb3V0OworfSBydGJ1c3lfY29uZjsKKwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9ydF9idXN5cGVlcnMvcnRidXN5X2NvbmYubCBiL2V4dGVuc2lvbnMvcnRfYnVzeXBlZXJzL3J0YnVzeV9jb25mLmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU4MTliZgotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvcnRfYnVzeXBlZXJzL3J0YnVzeV9jb25mLmwKQEAgLTAsMCArMSwxMDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDEzLCBXSURFIFByb2plY3QgYW5kIE5JQ1QJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFdJREUgUHJvamVjdCBvciBOSUNUIG5vciB0aGUgCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgV0lERSBQcm9qZWN0IGFuZCAJCQkJCQkgKgorKiAgIE5JQ1QuCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVG9rZW5pemVyCisgKgorICovCisKKyV7CisjaW5jbHVkZSAicnRidXN5LmgiCisjaW5jbHVkZSAicnRidXN5X2NvbmYudGFiLmgiCisKKy8qIFVwZGF0ZSB0aGUgY29sdW1uIGluZm9ybWF0aW9uICovCisjZGVmaW5lIFlZX1VTRVJfQUNUSU9OIHsgCQkJCQkJXAorCXl5bGxvYy0+Zmlyc3RfY29sdW1uID0geXlsbG9jLT5sYXN0X2NvbHVtbiArIDE7IAkJXAorCXl5bGxvYy0+bGFzdF9jb2x1bW4gPSB5eWxsb2MtPmZpcnN0X2NvbHVtbiArIHl5bGVuZyAtIDE7CVwKK30KKworLyogQXZvaWQgd2FybmluZyB3aXRoIG5ld2VyIGZsZXggKi8KKyNkZWZpbmUgWVlfTk9fSU5QVVQKKworJX0KKworcXN0cmluZwkJXCJbXlwiXG5dKlwiCisKKworJW9wdGlvbiBiaXNvbi1icmlkZ2UgYmlzb24tbG9jYXRpb25zCislb3B0aW9uIG5veXl3cmFwCislb3B0aW9uIG5vdW5wdXQKKworJSUKKworCS8qIFVwZGF0ZSB0aGUgbGluZSBjb3VudCAqLworXG4JCQl7CisJCQkJeXlsbG9jLT5maXJzdF9saW5lKys7IAorCQkJCXl5bGxvYy0+bGFzdF9saW5lKys7IAorCQkJCXl5bGxvYy0+bGFzdF9jb2x1bW49MDsgCisJCQl9CisJIAorCS8qIEVhdCBhbGwgc3BhY2VzIGJ1dCBub3QgbmV3IGxpbmVzICovCisoW1s6c3BhY2U6XV17LX1bXG5dKSsJOworCS8qIEVhdCBhbGwgY29tbWVudHMgKi8KKyMuKiQJCQk7CisKKwkvKiBSZWNvZ25pemUgYW55IGludGVnZXIgKi8KK1stXT9bWzpkaWdpdDpdXSsJeworCQkJCS8qIENvbnZlcnQgdGhpcyB0byBhbiBpbnRlZ2VyIHZhbHVlICovCisJCQkJaW50IHJldD0wOworCQkJCXJldCA9IHNzY2FuZih5eXRleHQsICIlaSIsICZ5eWx2YWwtPmludGVnZXIpOworCQkJCWlmIChyZXQgIT0gMSkgeworCQkJCQkvKiBObyBtYXRjaGluZzogYW4gZXJyb3Igb2NjdXJyZWQgKi8KKwkJCQkJVFJBQ0VfRVJST1IoIlVuYWJsZSB0byBjb252ZXJ0IHRoZSB2YWx1ZSAnJXMnIHRvIGEgdmFsaWQgbnVtYmVyOiAlcyIsIHl5dGV4dCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCQkJcmV0dXJuIExFWF9FUlJPUjsgLyogdHJpZyBhbiBlcnJvciBpbiB5YWNjIHBhcnNlciAqLworCQkJCQkvKiBNYXliZSB3ZSBjb3VsZCBSRUpFQ1QgaW5zdGVhZCBvZiBmYWlsaW5nIGhlcmU/ICovCisJCQkJfQorCQkJCXJldHVybiBJTlRFR0VSOworCQkJfQorCQkJCisJCisJCisJLyogVGhlIGtleSB3b3JkcyAqLwkKKyg/aToiU2tpcFRvb0J1c3lFcnJvcnMiKQkgCXsJcmV0dXJuIFNLSVBUT09CVVNZRVJST1JTOwl9CisoP2k6IlJldHJ5RGlzdGFudFBlZXJzIikJIAl7CXJldHVybiBSRVRSWURJU1RBTlRQRUVSUzsJfQorKD9pOiJSZXRyeU1heFBlZXJzIikJIAkJewlyZXR1cm4gUkVUUllNQVhQRUVSUzsJCX0KKyg/aToiUmVsYXlUaW1lb3V0IikJIAkJewlyZXR1cm4gUkVMQVlUSU1FT1VUOwkJfQorCQkJCisJLyogVmFsaWQgc2luZ2xlIGNoYXJhY3RlcnMgZm9yIHl5cGFyc2UgKi8KK1s9O10JCQl7IHJldHVybiB5eXRleHRbMF07IH0KKworCS8qIFVucmVjb2duaXplZCBzZXF1ZW5jZSwgaWYgaXQgZGlkIG5vdCBtYXRjaCBhbnkgcHJldmlvdXMgcGF0dGVybiAqLworW15bOnNwYWNlOl09O1xuXSsJeyAKKwkJCQlUUkFDRV9FUlJPUigiVW5yZWNvZ25pemVkIHRleHQgb24gbGluZSAlZCBjb2wgJWQ6ICclcycuIiwgeXlsbG9jLT5maXJzdF9saW5lLCB5eWxsb2MtPmZpcnN0X2NvbHVtbiwgeXl0ZXh0KTsKKwkJCSAJcmV0dXJuIExFWF9FUlJPUjsgCisJCQl9CisKKyUlCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL3J0X2J1c3lwZWVycy9ydGJ1c3lfY29uZi55IGIvZXh0ZW5zaW9ucy9ydF9idXN5cGVlcnMvcnRidXN5X2NvbmYueQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmE1MzAzCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9ydF9idXN5cGVlcnMvcnRidXN5X2NvbmYueQpAQCAtMCwwICsxLDE2OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTMsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBZYWNjIGV4dGVuc2lvbidzIGNvbmZpZ3VyYXRpb24gcGFyc2VyLgorICovCisKKy8qIEZvciBkZXZlbG9wbWVudCBvbmx5IDogKi8KKyVkZWJ1ZyAKKyVlcnJvci12ZXJib3NlCisKKy8qIFRoZSBwYXJzZXIgcmVjZWl2ZXMgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBmaWxlbmFtZSBhcyBwYXJhbWV0ZXIgKi8KKyVwYXJzZS1wYXJhbSB7Y2hhciAqIGNvbmZmaWxlfQorCisvKiBLZWVwIHRyYWNrIG9mIGxvY2F0aW9uICovCislbG9jYXRpb25zIAorJXB1cmUtcGFyc2VyCisKKyV7CisjaW5jbHVkZSAicnRidXN5LmgiCisjaW5jbHVkZSAicnRidXN5X2NvbmYudGFiLmgiCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb24gKi8KK2ludCB5eXBhcnNlKGNoYXIgKiBjb25mZmlsZSk7CisKKy8qIFBhcnNlIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgKi8KK2ludCBydGJ1c3lfY29uZl9oYW5kbGUoY2hhciAqIGNvbmZmaWxlKQoreworCWV4dGVybiBGSUxFICogcnRidXN5X2NvbmZpbjsKKwlpbnQgcmV0OworCQorCVRSQUNFX0VOVFJZKCIlcCIsIGNvbmZmaWxlKTsKKwkKKwlUUkFDRV9ERUJVRyAoRlVMTCwgIlBhcnNpbmcgY29uZmlndXJhdGlvbiBmaWxlOiAlcy4uLiIsIGNvbmZmaWxlKTsKKwkKKwlydGJ1c3lfY29uZmluID0gZm9wZW4oY29uZmZpbGUsICJyIik7CisJaWYgKHJ0YnVzeV9jb25maW4gPT0gTlVMTCkgeworCQlyZXQgPSBlcnJubzsKKwkJVFJBQ0VfRVJST1IoIlVuYWJsZSB0byBvcGVuIGV4dGVuc2lvbiBjb25maWd1cmF0aW9uIGZpbGUgJXMgZm9yIHJlYWRpbmc6ICVzIiwgY29uZmZpbGUsIHN0cmVycm9yKHJldCkpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHl5cGFyc2UoY29uZmZpbGUpOworCisJZmNsb3NlKHJ0YnVzeV9jb25maW4pOworCisJaWYgKHJldCAhPSAwKSB7CisJCVRSQUNFX0VSUk9SKCAiVW5hYmxlIHRvIHBhcnNlIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuIik7CisJCXJldHVybiBFSU5WQUw7CisJfSBlbHNlIHsKKwkJVFJBQ0VfREVCVUcoRlVMTCwgIltydF9idXN5cGVlcnNdIENvbmZpZ3VyYXRpb246ICVkLSVkLSVkLSVkLiIsIHJ0YnVzeV9jb25mLlNraXBUb29CdXN5RXJyb3JzLCBydGJ1c3lfY29uZi5SZXRyeURpc3RhbnRQZWVycywgcnRidXN5X2NvbmYuUmV0cnlNYXhQZWVycywgcnRidXN5X2NvbmYuUmVsYXlUaW1lb3V0KTsKKwl9CisJCisJcmV0dXJuIDA7Cit9CisKKy8qIFRoZSBMZXggcGFyc2VyIHByb3RvdHlwZSAqLworaW50IHJ0YnVzeV9jb25mbGV4KFlZU1RZUEUgKmx2YWxwLCBZWUxUWVBFICpsbG9jcCk7CisKKy8qIEZ1bmN0aW9uIHRvIHJlcG9ydCB0aGUgZXJyb3JzICovCit2b2lkIHl5ZXJyb3IgKFlZTFRZUEUgKnBsb2MsIGNoYXIgKiBjb25mZmlsZSwgY2hhciBjb25zdCAqcykKK3sKKwlUUkFDRV9ERUJVRyhJTkZPLCAiRXJyb3IgaW4gY29uZmlndXJhdGlvbiBwYXJzaW5nIik7CisJCisJaWYgKHBsb2MtPmZpcnN0X2xpbmUgIT0gcGxvYy0+bGFzdF9saW5lKQorCQlmZF9sb2dfZXJyb3IoIiVzOiVkLiVkLSVkLiVkIDogJXMiLCBjb25mZmlsZSwgcGxvYy0+Zmlyc3RfbGluZSwgcGxvYy0+Zmlyc3RfY29sdW1uLCBwbG9jLT5sYXN0X2xpbmUsIHBsb2MtPmxhc3RfY29sdW1uLCBzKTsKKwllbHNlIGlmIChwbG9jLT5maXJzdF9jb2x1bW4gIT0gcGxvYy0+bGFzdF9jb2x1bW4pCisJCWZkX2xvZ19lcnJvcigiJXM6JWQuJWQtJWQgOiAlcyIsIGNvbmZmaWxlLCBwbG9jLT5maXJzdF9saW5lLCBwbG9jLT5maXJzdF9jb2x1bW4sIHBsb2MtPmxhc3RfY29sdW1uLCBzKTsKKwllbHNlCisJCWZkX2xvZ19lcnJvcigiJXM6JWQuJWQgOiAlcyIsIGNvbmZmaWxlLCBwbG9jLT5maXJzdF9saW5lLCBwbG9jLT5maXJzdF9jb2x1bW4sIHMpOworfQorCislfQorCisvKiBWYWx1ZXMgcmV0dXJuZWQgYnkgbGV4IGZvciB0b2tlbiAqLworJXVuaW9uIHsKKwlpbnQJCWludGVnZXI7Cit9CisKKy8qIEluIGNhc2Ugb2YgZXJyb3IgaW4gdGhlIGxleGljYWwgYW5hbHlzaXMgKi8KKyV0b2tlbiAJCUxFWF9FUlJPUgorCisvKiBBIChkZSlxdW90ZWQgc3RyaW5nIChtYWxsb2MnZCBpbiBsZXggcGFyc2VyOyBpdCBtdXN0IGJlIGZyZWVkIGFmdGVyIHVzZSkgKi8KKyV0b2tlbiA8aW50ZWdlcj4gSU5URUdFUgorCisvKiBUb2tlbnMgKi8KKyV0b2tlbiAJCVNLSVBUT09CVVNZRVJST1JTCisldG9rZW4gCQlSRVRSWURJU1RBTlRQRUVSUworJXRva2VuIAkJUkVUUllNQVhQRUVSUworJXRva2VuIAkJUkVMQVlUSU1FT1VUCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyUlCisKKwkvKiBUaGUgZ3JhbW1hciBkZWZpbml0aW9uICovCitjb25mZmlsZToJCS8qIGVtcHR5IGlzIE9LICovCisJCQl8IGNvbmZmaWxlIHRvb2J1c3kKKwkJCXwgY29uZmZpbGUgZGlzdGFudAorCQkJfCBjb25mZmlsZSBtYXhyZXRyeQorCQkJfCBjb25mZmlsZSB0aW1lb3V0CisJCQl8IGNvbmZmaWxlIGVycm9ycworCQkJeworCQkJCXl5ZXJyb3IoJnl5bGxvYywgY29uZmZpbGUsICJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBwYXJzaW5nIHRoZSBjb25maWd1cmF0aW9uIGZpbGUiKTsKKwkJCQlyZXR1cm4gRUlOVkFMOworCQkJfQorCQkJOworCQkJCisJCQkvKiBMZXhpY2FsIG9yIHN5bnRheCBlcnJvciAqLworZXJyb3JzOgkJCUxFWF9FUlJPUgorCQkJfCBlcnJvcgorCQkJOworCit0b29idXN5OgkJU0tJUFRPT0JVU1lFUlJPUlMgJzsnCisJCQl7CisJCQkJcnRidXN5X2NvbmYuU2tpcFRvb0J1c3lFcnJvcnM9MTsKKwkJCX0KKwkJCTsKKwkJCQorZGlzdGFudDoJCVJFVFJZRElTVEFOVFBFRVJTICc7JworCQkJeworCQkJCXJ0YnVzeV9jb25mLlJldHJ5RGlzdGFudFBlZXJzPTE7CisJCQl9CisJCQk7CisJCQkKK21heHJldHJ5OgkJUkVUUllNQVhQRUVSUyAnPScgSU5URUdFUiAnOycKKwkJCXsKKwkJCQlydGJ1c3lfY29uZi5SZXRyeU1heFBlZXJzPSQzOworCQkJfQorCQkJOworCQkJCit0aW1lb3V0OgkJUkVMQVlUSU1FT1VUICc9JyBJTlRFR0VSICc7JworCQkJeworCQkJCXJ0YnVzeV9jb25mLlJlbGF5VGltZW91dD0kMzsKKwkJCX0KKwkJCTsKKwkJCQpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9ydF9kZWZhdWx0L0NNYWtlTGlzdHMudHh0IGIvZXh0ZW5zaW9ucy9ydF9kZWZhdWx0L0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkYWE0MmMKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL3J0X2RlZmF1bHQvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw0MyBAQAorIyBUaGUgcnRfZGVmYXVsdCBleHRlbnNpb24KK1BST0pFQ1QoIkNvbmZpZ3VyYWJsZSByb3V0aW5nIGV4dGVuc2lvbiIgQykKKworIyBDaGVjayBpZiBSRUdfU1RBUlRFTkQgaXMgcHJvdmlkZWQgb24gdGhlIGhvc3QKK1NFVChDSEVDS19SRUdfU1RBUlRFTkRfU09VUkNFX0NPREUgIgorCSNpbmNsdWRlIDx1bmlzdGQuaD4KKwkjaW5jbHVkZSA8cmVnZXguaD4KKwlpbnQgbWFpbigpIHsKKwkgICByZXR1cm4gcmVnZXhlYyhOVUxMLCBOVUxMLCAwLCBOVUxMLCBSRUdfU1RBUlRFTkQpOworCX0KKwkiKQorQ0hFQ0tfQ19TT1VSQ0VfQ09NUElMRVMoIiR7Q0hFQ0tfUkVHX1NUQVJURU5EX1NPVVJDRV9DT0RFfSIgSEFWRV9SRUdfU1RBUlRFTkQpCisjIEdlbmVyYXRlIHRoZSBob3N0LmggZmlsZQorQ09ORklHVVJFX0ZJTEUoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3J0X2RlZmF1bHQtaG9zdC5oLmluICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9ydF9kZWZhdWx0LWhvc3QuaCkKKworIyBQYXJzZXIgZmlsZXMKK0JJU09OX0ZJTEUocnRkX2NvbmYueSkKK0ZMRVhfRklMRShydGRfY29uZi5sKQorU0VUX1NPVVJDRV9GSUxFU19QUk9QRVJUSUVTKGxleC5ydGRfY29uZi5jIHJ0ZF9jb25mLnRhYi5jIFBST1BFUlRJRVMgQ09NUElMRV9GTEFHUyAiLUkgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9IikKKworIyBMaXN0IG9mIHNvdXJjZSBmaWxlcworU0VUKCBSVF9ERUZBVUxUX1NSQworCXJ0X2RlZmF1bHQuYworCXJ0X2RlZmF1bHQuaAorCWxleC5ydGRfY29uZi5jCisJcnRkX2NvbmYudGFiLmMKKwlydGRfY29uZi50YWIuaAorCXJ0ZF9ydWxlcy5jCispCisKK0lOQ0xVREVfRElSRUNUT1JJRVMoJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9KQorCisjIENvbXBpbGUgdGhlc2UgZmlsZXMgYXMgYSBmcmVlRGlhbWV0ZXIgZXh0ZW5zaW9uCitGRF9BRERfRVhURU5TSU9OKHJ0X2RlZmF1bHQgJHtSVF9ERUZBVUxUX1NSQ30pCisKKworIyMjIworIyMgSU5TVEFMTCBzZWN0aW9uICMjCisKKyMgV2UgaW5zdGFsbCB3aXRoIHRoZSBkYWVtb24gY29tcG9uZW50IGJlY2F1c2UgaXQgaXMgYSBiYXNlIGZlYXR1cmUuCitJTlNUQUxMKFRBUkdFVFMgcnRfZGVmYXVsdAorCUxJQlJBUlkgREVTVElOQVRJT04gJHtJTlNUQUxMX0VYVEVOU0lPTlNfU1VGRklYfQorCUNPTVBPTkVOVCBmcmVlRGlhbWV0ZXItZGFlbW9uKQpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9ydF9kZWZhdWx0L3J0X2RlZmF1bHQtaG9zdC5oLmluIGIvZXh0ZW5zaW9ucy9ydF9kZWZhdWx0L3J0X2RlZmF1bHQtaG9zdC5oLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZTA1YTUKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL3J0X2RlZmF1bHQvcnRfZGVmYXVsdC1ob3N0LmguaW4KQEAgLTAsMCArMSw0MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTEsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBDb25maWd1cmF0aW9uIGZyb20gY29tcGlsZS10aW1lICovCisjaWZuZGVmIFJURF9JU19DT05GSUcKKyNkZWZpbmUgUlREX0lTX0NPTkZJRworCisjY21ha2VkZWZpbmUgSEFWRV9SRUdfU1RBUlRFTkQKKworI2VuZGlmIC8qIFJURF9JU19DT05GSUcgKi8KZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvcnRfZGVmYXVsdC9ydF9kZWZhdWx0LmMgYi9leHRlbnNpb25zL3J0X2RlZmF1bHQvcnRfZGVmYXVsdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNDA1N2EKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL3J0X2RlZmF1bHQvcnRfZGVmYXVsdC5jCkBAIC0wLDAgKzEsOTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDEzLCBXSURFIFByb2plY3QgYW5kIE5JQ1QJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFdJREUgUHJvamVjdCBvciBOSUNUIG5vciB0aGUgCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgV0lERSBQcm9qZWN0IGFuZCAJCQkJCQkgKgorKiAgIE5JQ1QuCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogCisgKiBDb25maWd1cmFibGUgcm91dGluZyBvZiBtZXNzYWdlcyBmb3IgZnJlZURpYW1ldGVyLgorICovCisKKyNpbmNsdWRlICJydF9kZWZhdWx0LmgiCisKKy8qIFRoZSBjYWxsYmFjayBjYWxsZWQgb24gbmV3IG1lc3NhZ2VzICovCitzdGF0aWMgaW50IHJ0ZF9vdXQodm9pZCAqIGNiZGF0YSwgc3RydWN0IG1zZyAqKiBwbXNnLCBzdHJ1Y3QgZmRfbGlzdCAqIGNhbmRpZGF0ZXMpCit7CisJc3RydWN0IG1zZyAqIG1zZyA9ICpwbXNnOworCVRSQUNFX0VOVFJZKCIlcCAlcCAlcCIsIGNiZGF0YSwgbXNnLCBjYW5kaWRhdGVzKTsKKwkKKwlDSEVDS19QQVJBTVMobXNnICYmIGNhbmRpZGF0ZXMpOworCQorCS8qIFNpbXBseSBwYXNzIGl0IHRvIHRoZSBhcHByb3ByaWF0ZSBmdW5jdGlvbiAqLworCWlmIChGRF9JU19MSVNUX0VNUFRZKGNhbmRpZGF0ZXMpKSB7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCXJldHVybiBydGRfcHJvY2VzcyggbXNnLCBjYW5kaWRhdGVzICk7CisJfQorfQorCisvKiBoYW5kbGVyICovCitzdGF0aWMgc3RydWN0IGZkX3J0X291dF9oZGwgKiBydGRfaGRsID0gTlVMTDsKKworLyogZW50cnkgcG9pbnQgKi8KK3N0YXRpYyBpbnQgcnRkX2VudHJ5KGNoYXIgKiBjb25mZmlsZSkKK3sKKwlUUkFDRV9FTlRSWSgiJXAiLCBjb25mZmlsZSk7CisJCisJLyogSW5pdGlhbGl6ZSB0aGUgcmVwbyAqLworCUNIRUNLX0ZDVCggcnRkX2luaXQoKSApOworCQorCS8qIFBhcnNlIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgKi8KKwlDSEVDS19GQ1QoIHJ0ZF9jb25mX2hhbmRsZShjb25mZmlsZSkgKTsKKwkKKyNpZiAwCisJLyogRHVtcCB0aGUgcnVsZXMgKi8KKwlydGRfZHVtcCgpOworI2VuZGlmIC8qIDAgKi8KKwkKKwkvKiBSZWdpc3RlciB0aGUgY2FsbGJhY2sgKi8KKwlDSEVDS19GQ1QoIGZkX3J0X291dF9yZWdpc3RlciggcnRkX291dCwgTlVMTCwgNSwgJnJ0ZF9oZGwgKSApOworCQorCS8qIFdlJ3JlIGRvbmUgKi8KKwlyZXR1cm4gMDsKK30KKworLyogVW5sb2FkICovCit2b2lkIGZkX2V4dF9maW5pKHZvaWQpCit7CisJVFJBQ0VfRU5UUlkoKTsKKwkKKwkvKiBVbnJlZ2lzdGVyIHRoZSBjYiAqLworCUNIRUNLX0ZDVF9ETyggZmRfcnRfb3V0X3VucmVnaXN0ZXIgKCBydGRfaGRsLCBOVUxMICksIC8qIGNvbnRpbnVlICovICk7CisJCisJLyogRGVzdHJveSB0aGUgZGF0YSAqLworCXJ0ZF9maW5pKCk7CisJCisJLyogRG9uZSAqLworCXJldHVybiA7Cit9CisKK0VYVEVOU0lPTl9FTlRSWSgicnRfZGVmYXVsdCIsIHJ0ZF9lbnRyeSk7CmRpZmYgLS1naXQgYS9leHRlbnNpb25zL3J0X2RlZmF1bHQvcnRfZGVmYXVsdC5oIGIvZXh0ZW5zaW9ucy9ydF9kZWZhdWx0L3J0X2RlZmF1bHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWNhYTVlCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9ydF9kZWZhdWx0L3J0X2RlZmF1bHQuaApAQCAtMCwwICsxLDg2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxMSwgV0lERSBQcm9qZWN0IGFuZCBOSUNUCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBXSURFIFByb2plY3Qgb3IgTklDVCBub3IgdGhlIAkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFdJREUgUHJvamVjdCBhbmQgCQkJCQkJICoKKyogICBOSUNULgkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEhlYWRlciBmaWxlIGZvciB0aGUgcnRfZGVmYXVsdCBleHRlbnNpb24uIAorICoKKyAqICBTZWUgdGhlIHJ0X2RlZmF1bHQuY29uZi5zYW1wbGUgZmlsZSBmb3IgdGhlIGZvcm1hdCBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgorICovCisgCisvKiBGcmVlRGlhbWV0ZXIncyBjb21tb24gaW5jbHVkZSBmaWxlICovCisjaW5jbHVkZSA8ZnJlZURpYW1ldGVyL2V4dGVuc2lvbi5oPgorCisvKiBIb3N0IGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgc3BlY2lmaWMgZXh0ZW5zaW9uICovCisjaW5jbHVkZSA8cnRfZGVmYXVsdC1ob3N0Lmg+CisKKy8qIFBhcnNlIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgKi8KK2ludCBydGRfY29uZl9oYW5kbGUoY2hhciAqIGNvbmZmaWxlKTsKKworLyogSW5pdGlhbGl6ZSB0aGUgcnVsZXMgcmVwb3NpdG9yeSAqLworaW50IHJ0ZF9pbml0KHZvaWQpOworCisvKiBEZXN0cm95IHRoZSBydWxlcyByZXBvc2l0b3J5ICovCit2b2lkIHJ0ZF9maW5pKHZvaWQpOworCisvKiBTb21lIGNvbnN0YW50cyBkZWZpbml0aW9ucyAqLworZW51bSBydGRfY3JpdF90eXBlIHsKKwlSVERfQ1JJX0FMTAk9IDAsCisJUlREX0NSSV9PSCwKKwlSVERfQ1JJX09SLAorCVJURF9DUklfREgsCisJUlREX0NSSV9EUiwKKwlSVERfQ1JJX1VOLAorCVJURF9DUklfU0ksCisJCisJUlREX0NSSV9NQVgKK307CisKK2VudW0gcnRkX3RhcmdfdHlwZSB7CisJUlREX1RBUl9JRCAgICAgPSAwLAorCVJURF9UQVJfUkVBTE0sCisJCisJUlREX1RBUl9NQVgKK307CisKKyNkZWZpbmUgUlREX0NSSVRfUkVHCTB4MQorI2RlZmluZSBSVERfVEFSR19SRUcJMHgyCisKKy8qIEFkZCBhIHJ1bGUgKi8KK2ludCBydGRfYWRkKGVudW0gcnRkX2NyaXRfdHlwZSBjdCwgY2hhciAqIGNyaXRlcmlhLCBlbnVtIHJ0ZF90YXJnX3R5cGUgdHQsIGNoYXIgKiB0YXJnZXQsIGludCBzY29yZSwgaW50IGZsYWdzKTsKKworLyogUHJvY2VzcyBhIG1lc3NhZ2UgJiBwZWVyIGxpc3QgdGhyb3VnaCB0aGUgcnVsZXMgcmVwb3NpdG9yeSwgdXBkYXRpbmcgdGhlIHNjb3JlcyAqLworaW50IHJ0ZF9wcm9jZXNzKCBzdHJ1Y3QgbXNnICogbXNnLCBzdHJ1Y3QgZmRfbGlzdCAqIGNhbmRpZGF0ZXMgKTsKKworLyogRm9yIGRlYnVnOiBkdW1wIHRoZSBydWxlIHJlcG9zaXRvcnkgKi8KK3ZvaWQgcnRkX2R1bXAodm9pZCk7CmRpZmYgLS1naXQgYS9leHRlbnNpb25zL3J0X2RlZmF1bHQvcnRkX2NvbmYubCBiL2V4dGVuc2lvbnMvcnRfZGVmYXVsdC9ydGRfY29uZi5sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNTZhYTgKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL3J0X2RlZmF1bHQvcnRkX2NvbmYubApAQCAtMCwwICsxLDE0NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTMsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUb2tlbml6ZXIKKyAqCisgKi8KKworJXsKKyNpbmNsdWRlICJydF9kZWZhdWx0LmgiCisvKiBJbmNsdWRlIHlhY2MgdG9rZW5zIGRlZmluaXRpb25zICovCisjaW5jbHVkZSAicnRkX2NvbmYudGFiLmgiCisKKy8qIFVwZGF0ZSB0aGUgY29sdW1uIGluZm9ybWF0aW9uICovCisjZGVmaW5lIFlZX1VTRVJfQUNUSU9OIHsgCQkJCQkJXAorCXl5bGxvYy0+Zmlyc3RfY29sdW1uID0geXlsbG9jLT5sYXN0X2NvbHVtbiArIDE7IAkJXAorCXl5bGxvYy0+bGFzdF9jb2x1bW4gPSB5eWxsb2MtPmZpcnN0X2NvbHVtbiArIHl5bGVuZyAtIDE7CVwKK30KKworLyogQXZvaWQgd2FybmluZyB3aXRoIG5ld2VyIGZsZXggKi8KKyNkZWZpbmUgWVlfTk9fSU5QVVQKKworJX0KKworcXN0cmluZwkJXCJbXlwiXG5dKlwiCisKKworJW9wdGlvbiBiaXNvbi1icmlkZ2UgYmlzb24tbG9jYXRpb25zCislb3B0aW9uIG5veXl3cmFwCislb3B0aW9uIG5vdW5wdXQKKworJSUKKworCS8qIFVwZGF0ZSB0aGUgbGluZSBjb3VudCAqLworXG4JCQl7CisJCQkJeXlsbG9jLT5maXJzdF9saW5lKys7IAorCQkJCXl5bGxvYy0+bGFzdF9saW5lKys7IAorCQkJCXl5bGxvYy0+bGFzdF9jb2x1bW49MDsgCisJCQl9CisJIAorCS8qIEVhdCBhbGwgc3BhY2VzIGJ1dCBub3QgbmV3IGxpbmVzICovCisoW1s6c3BhY2U6XV17LX1bXG5dKSsJOworCS8qIEVhdCBhbGwgY29tbWVudHMgKi8KKyMuKiQJCQk7CisKKwkvKiBSZWNvZ25pemUgYW55IGludGVnZXIgKi8KK1stXT9bWzpkaWdpdDpdXSsJeworCQkJCS8qIENvbnZlcnQgdGhpcyB0byBhbiBpbnRlZ2VyIHZhbHVlICovCisJCQkJaW50IHJldD0wOworCQkJCXJldCA9IHNzY2FuZih5eXRleHQsICIlaSIsICZ5eWx2YWwtPmludGVnZXIpOworCQkJCWlmIChyZXQgIT0gMSkgeworCQkJCQkvKiBObyBtYXRjaGluZzogYW4gZXJyb3Igb2NjdXJyZWQgKi8KKwkJCQkJZmRfbG9nX2RlYnVnKCJVbmFibGUgdG8gY29udmVydCB0aGUgdmFsdWUgJyVzJyB0byBhIHZhbGlkIG51bWJlcjogJXMiLCB5eXRleHQsIHN0cmVycm9yKGVycm5vKSk7CisJCQkJCXJldHVybiBMRVhfRVJST1I7IC8qIHRyaWcgYW4gZXJyb3IgaW4geWFjYyBwYXJzZXIgKi8KKwkJCQkJLyogTWF5YmUgd2UgY291bGQgUkVKRUNUIGluc3RlYWQgb2YgZmFpbGluZyBoZXJlPyAqLworCQkJCX0KKwkJCQlyZXR1cm4gSU5URUdFUjsKKwkJCX0KKwkJCQorCS8qIEluIGFkZGl0aW9uLCByZWNvZ25pemUgc29tZSBjb25zdGFudCBuYW1lcyBhcyBpbnRlZ2VycyBhbHNvICovCisoP2k6Ik5PX0RFTElWRVJZIikJewl5eWx2YWwtPmludGVnZXIgPSBGRF9TQ09SRV9OT19ERUxJVkVSWTsJCXJldHVybiBJTlRFR0VSOwkJfQorKD9pOiJERUZBVUxUIikJCXsJeXlsdmFsLT5pbnRlZ2VyID0gRkRfU0NPUkVfREVGQVVMVDsgCQlyZXR1cm4gSU5URUdFUjsJCX0KKyg/aToiREVGQVVMVF9SRUFMTSIpCXsJeXlsdmFsLT5pbnRlZ2VyID0gRkRfU0NPUkVfREVGQVVMVF9SRUFMTTsgCXJldHVybiBJTlRFR0VSOwkJfQorKD9pOiJSRUFMTSIpCQl7CXl5bHZhbC0+aW50ZWdlciA9IEZEX1NDT1JFX1JFQUxNOyAJCXJldHVybiBJTlRFR0VSOwkJfQorKD9pOiJSRURJUl9IT1NUIikJewl5eWx2YWwtPmludGVnZXIgPSBGRF9TQ09SRV9SRURJUl9IT1NUOyAJCXJldHVybiBJTlRFR0VSOwkJfQorKD9pOiJSRURJUl9BUFAiKQl7CXl5bHZhbC0+aW50ZWdlciA9IEZEX1NDT1JFX1JFRElSX0FQUDsgCQlyZXR1cm4gSU5URUdFUjsJCX0KKyg/aToiUkVESVJfUkVBTE0iKQl7CXl5bHZhbC0+aW50ZWdlciA9IEZEX1NDT1JFX1JFRElSX1JFQUxNOyAJcmV0dXJuIElOVEVHRVI7CQl9CisoP2k6IlJFRElSX1JFQUxNX0FQUCIpCXsJeXlsdmFsLT5pbnRlZ2VyID0gRkRfU0NPUkVfUkVESVJfUkVBTE1fQVBQOyAJcmV0dXJuIElOVEVHRVI7CQl9CisoP2k6IlJFRElSX1VTRVIiKQl7CXl5bHZhbC0+aW50ZWdlciA9IEZEX1NDT1JFX1JFRElSX1VTRVI7IAkJcmV0dXJuIElOVEVHRVI7CQl9CisoP2k6IlJFRElSX1NFU1NJT04iKQl7CXl5bHZhbC0+aW50ZWdlciA9IEZEX1NDT1JFX1JFRElSX1NFU1NJT047IAlyZXR1cm4gSU5URUdFUjsJCX0KKyg/aToiRklOQUxERVNUIikJewl5eWx2YWwtPmludGVnZXIgPSBGRF9TQ09SRV9GSU5BTERFU1Q7IAkJcmV0dXJuIElOVEVHRVI7CQl9CisKKwkvKiBSZWNvZ25pemUgYnJhY2tldGVkIHF1b3RlZCBzdHJpbmdzICovCitbW117cXN0cmluZ31bXV0gCXsKKwkJCQkvKiBNYXRjaCBhIHF1b3RlZCBzdHJpbmcgY29udGFpbmluZyBhIHJlZ2V4ICovCisJCQkJQ0hFQ0tfTUFMTE9DX0RPKCB5eWx2YWwtPnN0cmluZyA9IHN0cmR1cCh5eXRleHQrMiksIAorCQkJCXsKKwkJCQkJVFJBQ0VfREVCVUcoSU5GTywgIlVuYWJsZSB0byBjb3B5IHRoZSBzdHJpbmcgJyVzJzogJXMiLCB5eXRleHQsIHN0cmVycm9yKGVycm5vKSk7CisJCQkJCXJldHVybiBMRVhfRVJST1I7IC8qIHRyaWcgYW4gZXJyb3IgaW4geWFjYyBwYXJzZXIgKi8KKwkJCQl9ICk7CisJCQkJeXlsdmFsLT5zdHJpbmdbc3RybGVuKHl5dGV4dCkgLSA0XSA9ICdcMCc7CisJCQkJcmV0dXJuIEJRU1RSSU5HOworCQkJfQorCQkJCisJLyogUmVjb2duaXplIHF1b3RlZCBzdHJpbmdzICovCit7cXN0cmluZ30JCXsKKwkJCQkvKiBNYXRjaCBhIHF1b3RlZCBzdHJpbmcuICovCisJCQkJQ0hFQ0tfTUFMTE9DX0RPKCB5eWx2YWwtPnN0cmluZyA9IHN0cmR1cCh5eXRleHQrMSksIAorCQkJCXsKKwkJCQkJVFJBQ0VfREVCVUcoSU5GTywgIlVuYWJsZSB0byBjb3B5IHRoZSBzdHJpbmcgJyVzJzogJXMiLCB5eXRleHQsIHN0cmVycm9yKGVycm5vKSk7CisJCQkJCXJldHVybiBMRVhfRVJST1I7IC8qIHRyaWcgYW4gZXJyb3IgaW4geWFjYyBwYXJzZXIgKi8KKwkJCQl9ICk7CisJCQkJeXlsdmFsLT5zdHJpbmdbc3RybGVuKHl5dGV4dCkgLSAyXSA9ICdcMCc7CisJCQkJcmV0dXJuIFFTVFJJTkc7CisJCQl9CisJCisJLyogVGhlIGtleSB3b3JkcyAqLwkKKyg/aToib2giKQkgCXsJcmV0dXJuIE9IOwl9CisoP2k6Im9yIikJIAl7CXJldHVybiBPUjsJfQorKD9pOiJkaCIpCSAJewlyZXR1cm4gREg7CX0KKyg/aToiZHIiKQkgCXsJcmV0dXJuIERSOwl9CisoP2k6InVuIikJIAl7CXJldHVybiBVTjsJfQorKD9pOiJzaSIpCSAJewlyZXR1cm4gU0k7CX0KKyg/aToicmxtIikJIAl7CXJldHVybiBSRUFMTTsJfQorCQkJCisJLyogVmFsaWQgc2luZ2xlIGNoYXJhY3RlcnMgZm9yIHl5cGFyc2UgKi8KK1sqOj0rLTtdCQl7IHJldHVybiB5eXRleHRbMF07IH0KKworCS8qIFVucmVjb2duaXplZCBzZXF1ZW5jZSwgaWYgaXQgZGlkIG5vdCBtYXRjaCBhbnkgcHJldmlvdXMgcGF0dGVybiAqLworW15bOnNwYWNlOl1cIio6PSs7XG5dKwl7IAorCQkJCWZkX2xvZ19kZWJ1ZygiVW5yZWNvZ25pemVkIHRleHQgb24gbGluZSAlZCBjb2wgJWQ6ICclcycuIiwgeXlsbG9jLT5maXJzdF9saW5lLCB5eWxsb2MtPmZpcnN0X2NvbHVtbiwgeXl0ZXh0KTsKKwkJCSAJcmV0dXJuIExFWF9FUlJPUjsgCisJCQl9CisKKyUlCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL3J0X2RlZmF1bHQvcnRkX2NvbmYueSBiL2V4dGVuc2lvbnMvcnRfZGVmYXVsdC9ydGRfY29uZi55Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2ZWQzMjkKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL3J0X2RlZmF1bHQvcnRkX2NvbmYueQpAQCAtMCwwICsxLDI3MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTMsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBZYWNjIGV4dGVuc2lvbidzIGNvbmZpZ3VyYXRpb24gcGFyc2VyLgorICogU2VlIGRvYy9ydF9kZWZhdWx0LmNvbmYuc2FtcGxlIGZvciBjb25maWd1cmF0aW9uIGZpbGUgZm9ybWF0CisgKi8KKworLyogRm9yIGRldmVsb3BtZW50IG9ubHkgOiAqLworJWRlYnVnIAorJWVycm9yLXZlcmJvc2UKKworLyogVGhlIHBhcnNlciByZWNlaXZlcyB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGZpbGVuYW1lIGFzIHBhcmFtZXRlciAqLworJXBhcnNlLXBhcmFtIHtjaGFyICogY29uZmZpbGV9CisKKy8qIEtlZXAgdHJhY2sgb2YgbG9jYXRpb24gKi8KKyVsb2NhdGlvbnMgCislcHVyZS1wYXJzZXIKKworJXsKKyNpbmNsdWRlICJydF9kZWZhdWx0LmgiCisjaW5jbHVkZSAicnRkX2NvbmYudGFiLmgiCS8qIGJpc29uIGlzIG5vdCBzbWFydCBlbm91Z2ggdG8gZGVmaW5lIHRoZSBZWUxUWVBFIGJlZm9yZSBpbmNsdWRpbmcgdGhpcyBjb2RlLCBzby4uLiAqLworCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9uICovCitpbnQgeXlwYXJzZShjaGFyICogY29uZmZpbGUpOworCitzdGF0aWMgaW50IHJ1bGVzX2FkZGVkID0gMDsKKworLyogUGFyc2UgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSAqLworaW50IHJ0ZF9jb25mX2hhbmRsZShjaGFyICogY29uZmZpbGUpCit7CisJZXh0ZXJuIEZJTEUgKiBydGRfY29uZmluOworCWludCByZXQ7CisJCisJVFJBQ0VfRU5UUlkoIiVwIiwgY29uZmZpbGUpOworCQorCVRSQUNFX0RFQlVHIChGVUxMLCAiUGFyc2luZyBjb25maWd1cmF0aW9uIGZpbGU6ICVzLi4uIiwgY29uZmZpbGUpOworCQorCXJ0ZF9jb25maW4gPSBmb3Blbihjb25mZmlsZSwgInIiKTsKKwlpZiAocnRkX2NvbmZpbiA9PSBOVUxMKSB7CisJCXJldCA9IGVycm5vOworCQlmZF9sb2dfZGVidWcoIlVuYWJsZSB0byBvcGVuIGV4dGVuc2lvbiBjb25maWd1cmF0aW9uIGZpbGUgJXMgZm9yIHJlYWRpbmc6ICVzIiwgY29uZmZpbGUsIHN0cmVycm9yKHJldCkpOworCQlUUkFDRV9ERUJVRyAoSU5GTywgIkVycm9yIG9jY3VycmVkLCBtZXNzYWdlIGxvZ2dlZCAtLSBjb25maWd1cmF0aW9uIGZpbGUuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0geXlwYXJzZShjb25mZmlsZSk7CisKKwlmY2xvc2UocnRkX2NvbmZpbik7CisKKwlpZiAocmV0ICE9IDApIHsKKwkJVFJBQ0VfREVCVUcgKElORk8sICJVbmFibGUgdG8gcGFyc2UgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4iKTsKKwkJcmV0dXJuIEVJTlZBTDsKKwl9IGVsc2UgeworCQlUUkFDRV9ERUJVRyhGVUxMLCAiQWRkZWQgJWQgUlVMRVMgcm91dGluZyBlbnRyaWVzIHN1Y2Nlc3NmdWxseS4iLCBydWxlc19hZGRlZCk7CisJfQorCQorCXJldHVybiAwOworfQorCisvKiBUaGUgTGV4IHBhcnNlciBwcm90b3R5cGUgKi8KK2ludCBydGRfY29uZmxleChZWVNUWVBFICpsdmFscCwgWVlMVFlQRSAqbGxvY3ApOworCisvKiBGdW5jdGlvbiB0byByZXBvcnQgdGhlIGVycm9ycyAqLwordm9pZCB5eWVycm9yIChZWUxUWVBFICpwbG9jLCBjaGFyICogY29uZmZpbGUsIGNoYXIgY29uc3QgKnMpCit7CisJVFJBQ0VfREVCVUcoSU5GTywgIkVycm9yIGluIGNvbmZpZ3VyYXRpb24gcGFyc2luZyIpOworCQorCWlmIChwbG9jLT5maXJzdF9saW5lICE9IHBsb2MtPmxhc3RfbGluZSkKKwkJZmRfbG9nX2RlYnVnKCIlczolZC4lZC0lZC4lZCA6ICVzIiwgY29uZmZpbGUsIHBsb2MtPmZpcnN0X2xpbmUsIHBsb2MtPmZpcnN0X2NvbHVtbiwgcGxvYy0+bGFzdF9saW5lLCBwbG9jLT5sYXN0X2NvbHVtbiwgcyk7CisJZWxzZSBpZiAocGxvYy0+Zmlyc3RfY29sdW1uICE9IHBsb2MtPmxhc3RfY29sdW1uKQorCQlmZF9sb2dfZGVidWcoIiVzOiVkLiVkLSVkIDogJXMiLCBjb25mZmlsZSwgcGxvYy0+Zmlyc3RfbGluZSwgcGxvYy0+Zmlyc3RfY29sdW1uLCBwbG9jLT5sYXN0X2NvbHVtbiwgcyk7CisJZWxzZQorCQlmZF9sb2dfZGVidWcoIiVzOiVkLiVkIDogJXMiLCBjb25mZmlsZSwgcGxvYy0+Zmlyc3RfbGluZSwgcGxvYy0+Zmlyc3RfY29sdW1uLCBzKTsKK30KKworJX0KKworLyogVmFsdWVzIHJldHVybmVkIGJ5IGxleCBmb3IgdG9rZW4gKi8KKyV1bmlvbiB7CisJaW50CQkgaW50ZWdlcjsJLyogU3RvcmUgaW50ZWdlciB2YWx1ZXMgKi8KKwljaGFyIAkJKnN0cmluZzsJLyogVGhlIHN0cmluZyBpcyBhbGxvY2F0ZWQgYnkgc3RyZHVwIGluIGxleC4qLworCXN0cnVjdCB7CisJCWNoYXIgKiBzdHI7CisJCWludCByZWdleDsKKwl9CQkgdHN0cmluZzsJLyogdHlwZWQgc3RyaW5nICovCisJc3RydWN0IHsKKwkJY2hhciAqIHN0cjsKKwkJaW50ICAgIHJlZ2V4OworCQllbnVtIHJ0ZF9jcml0X3R5cGUgdHlwZTsKKwl9CQkgY3JpdGVyaWE7CisJc3RydWN0IHsKKwkJY2hhciAqIHN0cjsKKwkJaW50ICAgIHJlZ2V4OworCQllbnVtIHJ0ZF90YXJnX3R5cGUgdHlwZTsKKwl9CQkgdGFyZ2V0OworfQorCisvKiBJbiBjYXNlIG9mIGVycm9yIGluIHRoZSBsZXhpY2FsIGFuYWx5c2lzICovCisldG9rZW4gCQlMRVhfRVJST1IKKworLyogQSAoZGUpcXVvdGVkIHN0cmluZyAobWFsbG9jJ2QgaW4gbGV4IHBhcnNlcjsgaXQgbXVzdCBiZSBmcmVlZCBhZnRlciB1c2UpICovCisldG9rZW4gPHN0cmluZz4JUVNUUklORworLyogQSAoZGUpYnJhY2tldC1xdW90ZWQgc3RyaW5nIChtYWxsb2MnZCBpbiBsZXggcGFyc2VyOyBpdCBtdXN0IGJlIGZyZWVkIGFmdGVyIHVzZSk6IFsiYmxhaGJsYWgiXSAqLworJXRva2VuIDxzdHJpbmc+CUJRU1RSSU5HCisKKy8qIEFuIGludGVnZXIgdmFsdWUgKi8KKyV0b2tlbiA8aW50ZWdlcj4gSU5URUdFUgorCisvKiBUaGUgdHlwZXMgZm9yIHRoaXMgZ3JhbWFyICovCisldHlwZSA8dHN0cmluZz4gIFRTVFJJTkcKKyV0eXBlIDxjcml0ZXJpYT4gQ1JJVEVSSUEKKyV0eXBlIDx0YXJnZXQ+IAkgVEFSR0VUCisldHlwZSA8aW50ZWdlcj4gIEVYUFJfSU5UCisKKy8qIFRva2VucyAqLworJXRva2VuIAkJT0gKKyV0b2tlbiAJCU9SCisldG9rZW4gCQlESAorJXRva2VuIAkJRFIKKyV0b2tlbiAJCVVOCisldG9rZW4gCQlTSQorCisldG9rZW4gCQlSRUFMTQorCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyUlCisKKwkvKiBUaGUgZ3JhbW1hciBkZWZpbml0aW9uICovCitjb25mZmlsZToJCS8qIGVtcHR5IGdyYW1tYXIgaXMgT0sgKi8KKwkJCXwgY29uZmZpbGUgcnVsZQorCQkJOworCQkJCisJLyogYSBSVUxFIGVudHJ5ICovCitydWxlOgkJCUNSSVRFUklBICc6JyBUQVJHRVQgJysnICc9JyBFWFBSX0lOVCAnOycKKwkJCXsKKwkJCQlpbnQgZmxhZyA9IDA7CisJCQkJaWYgKCQxLnJlZ2V4KQorCQkJCQlmbGFnIHw9IFJURF9DUklUX1JFRzsKKwkJCQlpZiAoJDMucmVnZXgpCisJCQkJCWZsYWcgfD0gUlREX1RBUkdfUkVHOworCQkJCQkKKwkJCQkvKiBBZGQgdGhpcyBydWxlIHRvIHRoZSByZXBvc2l0b3J5ICovCisJCQkJQ0hFQ0tfRkNUX0RPKCBydGRfYWRkKCQxLnR5cGUsICQxLnN0ciwgJDMudHlwZSwgJDMuc3RyLCAkNiwgZmxhZyksCisJCQkJCXsKKwkJCQkJCXl5ZXJyb3IgKCZ5eWxsb2MsIGNvbmZmaWxlLCAiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgYWRkaW5nIGEgcnVsZSwgYWJvcnRpbmcuLi4iKTsKKwkJCQkJCVlZRVJST1I7CisJCQkJCX0gKTsKKwkJCQkKKwkJCQlydWxlc19hZGRlZCsrOworCQkJfQorCQkJOworCQorCS8qIFFTVFJJTkcgYW5kIEJRU1RSSU5HIGFyZSBlcXVpdmFsZW50IGluIHRoZSBncmFtbWFyICovCitUU1RSSU5HOgkJUVNUUklORworCQkJeworCQkJCSQkLnN0ciA9ICQxOworCQkJCSQkLnJlZ2V4ID0gMDsKKwkJCX0KKwkJCXwgQlFTVFJJTkcKKwkJCXsKKwkJCQkkJC5zdHIgPSAkMTsKKwkJCQkkJC5yZWdleCA9IDE7CisJCQl9CisJCQk7CisKKwkvKiBEZXRhaWxzIG9mIHRoZSBDUklURVJJQSB0eXBlICovCitDUklURVJJQToJCScqJworCQkJeworCQkJCSQkLnN0ciA9IE5VTEw7CisJCQkJJCQucmVnZXggPSAwOworCQkJCSQkLnR5cGUgPSBSVERfQ1JJX0FMTDsKKwkJCX0KKwkJCXwgT0ggJz0nIFRTVFJJTkcKKwkJCXsKKwkJCQkkJC5zdHIgPSAkMy5zdHI7CisJCQkJJCQucmVnZXggPSQzLnJlZ2V4OworCQkJCSQkLnR5cGUgPSBSVERfQ1JJX09IOworCQkJfQorCQkJfCBPUiAnPScgVFNUUklORworCQkJeworCQkJCSQkLnN0ciA9ICQzLnN0cjsKKwkJCQkkJC5yZWdleCA9JDMucmVnZXg7CisJCQkJJCQudHlwZSA9IFJURF9DUklfT1I7CisJCQl9CisJCQl8IERIICc9JyBUU1RSSU5HCisJCQl7CisJCQkJJCQuc3RyID0gJDMuc3RyOworCQkJCSQkLnJlZ2V4ID0kMy5yZWdleDsKKwkJCQkkJC50eXBlID0gUlREX0NSSV9ESDsKKwkJCX0KKwkJCXwgRFIgJz0nIFRTVFJJTkcKKwkJCXsKKwkJCQkkJC5zdHIgPSAkMy5zdHI7CisJCQkJJCQucmVnZXggPSQzLnJlZ2V4OworCQkJCSQkLnR5cGUgPSBSVERfQ1JJX0RSOworCQkJfQorCQkJfCBVTiAnPScgVFNUUklORworCQkJeworCQkJCSQkLnN0ciA9ICQzLnN0cjsKKwkJCQkkJC5yZWdleCA9JDMucmVnZXg7CisJCQkJJCQudHlwZSA9IFJURF9DUklfVU47CisJCQl9CisJCQl8IFNJICc9JyBUU1RSSU5HCisJCQl7CisJCQkJJCQuc3RyID0gJDMuc3RyOworCQkJCSQkLnJlZ2V4ID0kMy5yZWdleDsKKwkJCQkkJC50eXBlID0gUlREX0NSSV9TSTsKKwkJCX0KKwkJCTsKKworCS8qIERldGFpbHMgb2YgdGhlIFRBUkdFVCB0eXBlICovCitUQVJHRVQ6CQkJVFNUUklORworCQkJeworCQkJCSQkLnN0ciA9ICQxLnN0cjsKKwkJCQkkJC5yZWdleCA9JDEucmVnZXg7CisJCQkJJCQudHlwZSA9IFJURF9UQVJfSUQ7CisJCQl9CisJCQl8IFJFQUxNICc9JyBUU1RSSU5HCisJCQl7CisJCQkJJCQuc3RyID0gJDMuc3RyOworCQkJCSQkLnJlZ2V4ID0kMy5yZWdleDsKKwkJCQkkJC50eXBlID0gUlREX1RBUl9SRUFMTTsKKwkJCX0KKwkJCTsKKwkKKwkvKiBBbiBleHByZXNzaW9uIHRoYXQgaGFzIGFuIGludGVnZXIgdmFsdWU7IHdlIGFsbG93ICsgYW5kIC0gb3BlcmF0b3JzIGNhdXNlIGl0IGlzIGNvbnZlbmllbnQgKi8KK0VYUFJfSU5UOgkJSU5URUdFUgorCQkJeworCQkJCSQkID0gJDE7CisJCQl9CisJCQl8IEVYUFJfSU5UICcrJyBJTlRFR0VSCisJCQl7CisJCQkJJCQgPSAkMSArICQzOworCQkJfQorCQkJfCBFWFBSX0lOVCAnLScgSU5URUdFUgorCQkJeworCQkJCSQkID0gJDEgLSAkMzsKKwkJCX0KKwkJCTsKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvcnRfZGVmYXVsdC9ydGRfcnVsZXMuYyBiL2V4dGVuc2lvbnMvcnRfZGVmYXVsdC9ydGRfcnVsZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDNhNTNjCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9ydF9kZWZhdWx0L3J0ZF9ydWxlcy5jCkBAIC0wLDAgKzEsNjA4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxMywgV0lERSBQcm9qZWN0IGFuZCBOSUNUCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBXSURFIFByb2plY3Qgb3IgTklDVCBub3IgdGhlIAkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFdJREUgUHJvamVjdCBhbmQgCQkJCQkJICoKKyogICBOSUNULgkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJydF9kZWZhdWx0LmgiCisKKy8qIFRoZSByZWd1bGFyIGV4cHJlc3Npb25zIGhlYWRlciAqLworI2luY2x1ZGUgPHJlZ2V4Lmg+CisKKy8qIFdlIHdpbGwgc2VhcmNoIGZvciBlYWNoIGNhbmRpZGF0ZSBwZWVyIGFsbCB0aGUgcnVsZXMgdGhhdCBhcmUgZGVmaW5lZCwgYW5kIGNoZWNrIHdoaWNoIG9uZSBhcHBsaWVzIHRvIHRoZSBtZXNzYWdlCisgKiBUaGVyZWZvcmUgb3VyIHJlcG9zaXRvcnkgaXMgb3JnYW5pemVkIGhpZXJhcmNoaWNhbHkuCisgKiAgQXQgdGhlIHRvcCBsZXZlbCwgd2UgaGF2ZSB0d28gbGlzdHMgb2YgVEFSR0VUUyAob25lIGZvciBJREVOVElUWSwgb25lIGZvciBSRUFMTSksIG9yZGVyZWQgYXMgZm9sbG93OgorICogICAtIGZpcnN0LCB0aGUgVEFSR0VUUyBkZWZpbmVkIHdpdGggYSByZWd1bGFyIGV4cHJlc3Npb24uIFdlIHdpbGwgdHJ5IG1hdGNoaW5nIGFsbCByZWdleHAgdG8gYWxsIGNhbmRpZGF0ZXMgaW4gdGhlIGxpc3QuCisgKiAgIC0gdGhlbiwgdGhlIFRBUkdFVFMgZGVmaW5lZCBieSBhIHBsYWluIHRleHQuIFdlIGRvbid0IGhhdmUgdG8gY29tcGFyZSB0aGUgd2hvbGUgbGlzdCB0byBlYWNoIGNhbmRpZGF0ZSBzaW5jZSB0aGUgbGlzdCBpcyBvcmRlcmVkLgorICoKKyAqICBVbmRlciBlYWNoIFRBUkdFVCBlbGVtZW50LCB3ZSBoYXZlIHRoZSBsaXN0IG9mIFJVTEVTIHRoYXQgYXJlIGRlZmluZWQgZm9yIHRoaXMgdGFyZ2V0LCBvcmRlcmVkIGJ5IENSSVRFUklBIHR5cGUsIHRoZW4gaXNfcmVnZXgsIHRoZW4gc3RyaW5nIHZhbHVlLgorICoKKyAqIE5vdGU6IEV4Y2VwdCBkdXJpbmcgY29uZmlndXJhdGlvbiBwYXJzaW5nIGFuZCBtb2R1bGUgdGVybWluYXRpb24sIHRoZSBsaXN0cyBhcmUgb25seSBldmVyIGFjY2Vzc2VkIHJlYWQtb25seSwgc28gd2UgZG8gbm90IG5lZWQgYSBsb2NrLgorICovCisKKy8qIFN0cnVjdHVyZSB0byBob2xkIHRoZSBkYXRhIHRoYXQgaXMgdXNlZCBmb3IgbWF0Y2hpbmcuICovCitzdHJ1Y3QgbWF0Y2hfZGF0YSB7CisJaW50CSBpc19yZWdleDsJLyogZGV0ZXJtaW5lcyBob3cgdGhlIHN0cmluZyBpcyBtYXRjaGVkICovCisJY2hhciAJKnBsYWluOwkJLyogbWF0Y2ggdGhpcyB2YWx1ZSB3aXRoIHN0cmNhc2VjbXAgaWYgaXNfcmVnZXggaXMgZmFsc2UuIFRoZSBzdHJpbmcgaXMgYWxsb2NhdGVkIGJ5IHRoZSBsZXggdG9rZW5pemVyLCBtdXN0IGJlIGZyZWVkIGF0IHRoZSBlbmQuICovCisJcmVnZXhfdCAgcHJlZzsJCS8qIG1hdGNoIHdpdGggcmVnZXhlYyBpZiBpc19yZWdleCBpcyB0cnVlLiByZWdmcmVlIG11c3QgYmUgY2FsbGVkIGF0IHRoZSBlbmQuIEEgY29weSBvZiB0aGUgb3JpZ2luYWwgc3RyaW5nIGlzIGFueXdheSBzYXZlZCBpbiBwbGFpbi4gKi8KK307CisKKy8qIFRoZSBzZW50aW5lbHMgZm9yIHRoZSBUQVJHRVQgbGlzdHMgKi8KK3N0YXRpYyBzdHJ1Y3QgZmRfbGlzdAlUQVJHRVRTW1JURF9UQVJfTUFYXTsKKworLyogU3RydWN0dXJlIG9mIGEgVEFSR0VUIGVsZW1lbnQgKi8KK3N0cnVjdCB0YXJnZXQgeworCXN0cnVjdCBmZF9saXN0CQljaGFpbjsJCQkvKiBsaW5rIGluIHRoZSB0b3AtbGV2ZWwgbGlzdCAqLworCXN0cnVjdCBtYXRjaF9kYXRhCW1kOwkJCS8qIHRoZSBkYXRhIHRvIGRldGVybWluZSBpZiB0aGUgY3VycmVudCBjYW5kaWRhdGUgbWF0Y2hlcyB0aGlzIGVsZW1lbnQgKi8KKwlzdHJ1Y3QgZmRfbGlzdAkJcnVsZXNbUlREX0NSSV9NQVhdOwkvKiBTZW50aW5lbHMgZm9yIHRoZSBsaXN0cyBvZiBydWxlcyBhcHBseWluZyB0byB0aGlzIHRhcmdldC4gT25lIGxpc3QgcGVyIHJ0ZF9jcml0X3R5cGUgKi8KKwkvKiBub3RlIDogd2UgZG8gbm90IG5lZWQgdGhlIHJ0ZF90YXJnX3R5cGUgaGVyZSwgaXQgaXMgaW1wbGllZCBieSB0aGUgcm9vdCBvZiB0aGUgbGlzdCB0aGlzIHRhcmdldCBlbGVtZW50IGlzIGF0dGFjaGVkIHRvICovCit9OworCisvKiBTdHJ1Y3R1cmUgb2YgYSBSVUxFIGVsZW1lbnQgKi8KK3N0cnVjdCBydWxlIHsKKwlzdHJ1Y3QgZmRfbGlzdAkJY2hhaW47CS8qIGxpbmsgaW4gdGhlIHBhcmVudCB0YXJnZXQgbGlzdCAqLworCXN0cnVjdCBtYXRjaF9kYXRhCW1kOwkvKiB0aGUgZGF0YSB0aGF0IHRoZSBjcml0ZXJpYSBtdXN0IG1hdGNoLCAtLSBpZ25vcmVkIGZvciBSVERfQ1JJX0FMTCAqLworCWludAkJCXNjb3JlOwkvKiBUaGUgc2NvcmUgYWRkZWQgdG8gdGhlIGNhbmRpZGF0ZSwgaWYgdGhlIG1lc3NhZ2UgbWF0Y2hlcyB0aGlzIGNyaXRlcmlhICovCisJLyogVGhlIHR5cGUgb2YgcnVsZSBkZXBlbmRzIG9uIHRoZSBzZW50aW5lbCAqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQ29tcGlsZSBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuICovCitzdGF0aWMgaW50IGNvbXBpbGVfcmVnZXgoIHJlZ2V4X3QgICogcHJlZywgY2hhciAqIHN0ciApCit7CisJaW50IGVycjsKKwkKKwkvKiBDb21waWxlIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gKi8KKwllcnIgPSByZWdjb21wKHByZWcsIHN0ciwgUkVHX0VYVEVOREVEIHwgUkVHX05PU1VCKTsKKwlpZiAoZXJyICE9IDApIHsKKwkJY2hhciAqIGJ1ZjsKKwkJc2l6ZV90IGJsOworCQkKKwkJLyogRXJyb3Igd2hpbGUgY29tcGlsaW5nIHRoZSByZWdleCAqLworCQlUUkFDRV9ERUJVRyhJTkZPLCAiRXJyb3Igd2hpbGUgY29tcGlsaW5nIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gJyVzJzoiLCBzdHIpOworCQkKKwkJLyogR2V0IHRoZSBlcnJvciBtZXNzYWdlIHNpemUgKi8KKwkJYmwgPSByZWdlcnJvcihlcnIsIHByZWcsIE5VTEwsIDApOworCQkKKwkJLyogQWxsb2MgdGhlIGJ1ZmZlciBmb3IgZXJyb3IgbWVzc2FnZSAqLworCQlDSEVDS19NQUxMT0MoIGJ1ZiA9IG1hbGxvYyhibCkgKTsKKwkJCisJCS8qIEdldCB0aGUgZXJyb3IgbWVzc2FnZSBjb250ZW50ICovCisJCXJlZ2Vycm9yKGVyciwgcHJlZywgYnVmLCBibCk7CisJCVRSQUNFX0RFQlVHKElORk8sICJcdCVzIiwgYnVmKTsKKwkJCisJCS8qIEZyZWUgdGhlIGJ1ZmZlciwgcmV0dXJuIHRoZSBlcnJvciAqLworCQlmcmVlKGJ1Zik7CisJCXJldHVybiBFSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIENyZWF0ZSBhIHRhcmdldCBpdGVtIGFuZCBpbml0aWFsaXplIGl0cyBjb250ZW50ICovCitzdGF0aWMgc3RydWN0IHRhcmdldCAqIG5ld190YXJnZXQoY2hhciAqIHN0ciwgaW50IHJlZ2V4KQoreworCWludCBpOworCXN0cnVjdCB0YXJnZXQgKm5ldyA9IE5VTEw7CisJQ0hFQ0tfTUFMTE9DX0RPKCBuZXcgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCB0YXJnZXQpKSwgcmV0dXJuIE5VTEwgKTsKKwltZW1zZXQobmV3LCAwLCBzaXplb2Yoc3RydWN0IHRhcmdldCkpOworCQorCWZkX2xpc3RfaW5pdCgmbmV3LT5jaGFpbiwgbmV3KTsKKwluZXctPm1kLnBsYWluID0gc3RyOworCW5ldy0+bWQuaXNfcmVnZXggPSByZWdleDsKKwlpZiAocmVnZXgpIHsKKwkJQ0hFQ0tfRkNUX0RPKCBjb21waWxlX3JlZ2V4KCZuZXctPm1kLnByZWcsIHN0ciksCisJCQl7CisJCQkJZnJlZShuZXcpOworCQkJCXJldHVybiBOVUxMOworCQkJfSApOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgUlREX0NSSV9NQVg7IGkrKykgeworCQlmZF9saXN0X2luaXQoJm5ldy0+cnVsZXNbaV0sIG5ldyk7CisJfQorCXJldHVybiBuZXc7Cit9CisKKy8qIENyZWF0ZSBhIHJ1bGUgaXRlbSBhbmQgaW5pdGlhbGl6ZSBpdHMgY29udGVudDsgcmV0dXJuIE5VTEwgaW4gY2FzZSBvZiBlcnJvciAqLworc3RhdGljIHN0cnVjdCBydWxlICogbmV3X3J1bGUoY2hhciAqIHN0ciwgaW50IHJlZ2V4LCBpbnQgc2NvcmUpCit7CisJc3RydWN0IHJ1bGUgKm5ldyA9IE5VTEw7CisJQ0hFQ0tfTUFMTE9DX0RPKCBuZXcgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBydWxlKSksIHJldHVybiBOVUxMICk7CisJbWVtc2V0KG5ldywgMCwgc2l6ZW9mKHN0cnVjdCBydWxlKSk7CisJCisJZmRfbGlzdF9pbml0KCZuZXctPmNoYWluLCBuZXcpOworCW5ldy0+bWQucGxhaW4gPSBzdHI7CisJbmV3LT5tZC5pc19yZWdleCA9IHJlZ2V4OworCWlmIChyZWdleCkgeworCQlDSEVDS19GQ1RfRE8oIGNvbXBpbGVfcmVnZXgoJm5ldy0+bWQucHJlZywgc3RyKSwKKwkJCXsKKwkJCQlmcmVlKG5ldyk7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9ICk7CisJfQorCW5ldy0+c2NvcmUgPSBzY29yZTsKKwlyZXR1cm4gbmV3OworfQorCisvKiBEZWJ1ZyBmdW5jdGlvbnMgKi8KK3N0YXRpYyB2b2lkIGR1bXBfcnVsZShpbnQgaW5kZW50LCBzdHJ1Y3QgcnVsZSAqIHJ1bGUpCit7CisJZmRfbG9nX2RlYnVnKCIlKnMlcyVzJXMgKz0gJWQiLAorCQlpbmRlbnQsICIiLAorCQlydWxlLT5tZC5pc19yZWdleCA/ICJbIiA6ICInIiwKKwkJcnVsZS0+bWQucGxhaW4sCisJCXJ1bGUtPm1kLmlzX3JlZ2V4ID8gIl0iIDogIiciLAorCQlydWxlLT5zY29yZSk7Cit9CitzdGF0aWMgdm9pZCBkdW1wX3RhcmdldChpbnQgaW5kZW50LCBzdHJ1Y3QgdGFyZ2V0ICogdGFyZ2V0KQoreworCWludCBpOworCWZkX2xvZ19kZWJ1ZygiJSpzJXMlcyVzIDoiLAorCQlpbmRlbnQsICIiLAorCQl0YXJnZXQtPm1kLmlzX3JlZ2V4ID8gIlsiIDogIiciLAorCQl0YXJnZXQtPm1kLnBsYWluID86ICIoZW1wdHkpIiwKKwkJdGFyZ2V0LT5tZC5pc19yZWdleCA/ICJdIiA6ICInIik7CisJZm9yIChpID0gMDsgaSA8IFJURF9DUklfTUFYOyBpKyspIHsKKwkJaWYgKCEgRkRfSVNfTElTVF9FTVBUWSgmdGFyZ2V0LT5ydWxlc1tpXSkpIHsKKwkJCXN0cnVjdCBmZF9saXN0ICogbGk7CisJCQlmZF9sb2dfZGVidWcoIiUqcyAgcnVsZXNbJWRdOiIsCisJCQkJaW5kZW50LCAiIiwgaSk7CisJCQlmb3IgKGxpID0gdGFyZ2V0LT5ydWxlc1tpXS5uZXh0OyBsaSAhPSAmdGFyZ2V0LT5ydWxlc1tpXTsgbGkgPSBsaS0+bmV4dCkgeworCQkJCWR1bXBfcnVsZShpbmRlbnQgKyAzLCAoc3RydWN0IHJ1bGUgKilsaSk7CisJCQl9CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFyX21kKHN0cnVjdCBtYXRjaF9kYXRhICogbWQpCit7CisJLyogZGVsZXRlIHRoZSBzdHJpbmcgKi8KKwlpZiAobWQtPnBsYWluKSB7CisJCWZyZWUobWQtPnBsYWluKTsKKwkJbWQtPnBsYWluID0gTlVMTDsKKwl9CisJCisJLyogZGVsZXRlIHRoZSBwcmVnIGlmIG5lZWRlZCAqLworCWlmIChtZC0+aXNfcmVnZXgpIHsKKwkJcmVnZnJlZSgmbWQtPnByZWcpOworCQltZC0+aXNfcmVnZXggPSAwOworCX0KK30KKworLyogRGVzdHJveSBhIHJ1bGUgaXRlbSAqLworc3RhdGljIHZvaWQgZGVsX3J1bGUoc3RydWN0IHJ1bGUgKiBkZWwpCit7CisJLyogVW5saW5rIHRoaXMgcnVsZSAqLworCWZkX2xpc3RfdW5saW5rKCZkZWwtPmNoYWluKTsKKwkKKwkvKiBEZWxldGUgdGhlIG1hdGNoIGRhdGEgKi8KKwljbGVhcl9tZCgmZGVsLT5tZCk7CisJCisJZnJlZShkZWwpOworfQorCisvKiBEZXN0cm95IGEgdGFyZ2V0IGl0ZW0sIGFuZCBhbGwgaXRzIHJ1bGVzICovCitzdGF0aWMgdm9pZCBkZWxfdGFyZ2V0KHN0cnVjdCB0YXJnZXQgKiBkZWwpCit7CisJaW50IGk7CisJCisJLyogVW5saW5rIHRoaXMgdGFyZ2V0ICovCisJZmRfbGlzdF91bmxpbmsoJmRlbC0+Y2hhaW4pOworCQorCS8qIERlbGV0ZSB0aGUgbWF0Y2ggZGF0YSAqLworCWNsZWFyX21kKCZkZWwtPm1kKTsKKwkKKwkvKiBEZWxldGUgdGhlIGNoaWxkcmVuIHJ1bGVzICovCisJZm9yIChpID0gMDsgaSA8IFJURF9DUklfTUFYOyBpKyspIHsKKwkJd2hpbGUgKCEgRkRfSVNfTElTVF9FTVBUWSgmZGVsLT5ydWxlc1tpXSkgKSB7CisJCQlkZWxfcnVsZSgoc3RydWN0IHJ1bGUgKikoZGVsLT5ydWxlc1tpXS5uZXh0KSk7CisJCX0KKwl9CisJCisJZnJlZShkZWwpOworfQorCisKKy8qIENvbXBhcmUgYSBzdHJpbmcgd2l0aCBhIG1hdGNoX2RhdGEgdmFsdWUuICpyZXMgY29udGFpbnMgdGhlIHJlc3VsdCBvZiB0aGUgY29tcGFyaXNvbiAoYWx3YXlzID4wIGZvciByZWdleCBub24tbWF0Y2ggc2l0dWF0aW9ucykgKi8KK3N0YXRpYyBpbnQgY29tcGFyZV9tYXRjaChjaGFyICogc3RyLCBzaXplX3QgbGVuLCBzdHJ1Y3QgbWF0Y2hfZGF0YSAqIG1kLCBpbnQgKiByZXMpCit7CisJaW50IGVycjsKKwkKKwlDSEVDS19QQVJBTVMoIHN0ciAmJiBtZCAmJiByZXMgKTsKKwkKKwkvKiBQbGFpbiBzdHJpbmdzOiB3ZSBjb21wYXJlIHdpdGggc3RybmNhc2VjbXAgKi8KKwlpZiAobWQtPmlzX3JlZ2V4ID09IDApIHsKKwkJKnJlcyA9IHN0cm5jYXNlY21wKHN0ciwgbWQtPnBsYWluLCBsZW4pOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBSZWdleHAgKi8KKwkqcmVzID0gMTsKKwkKKyNpZmRlZiBIQVZFX1JFR19TVEFSVEVORAorCXsKKwkJcmVnbWF0Y2hfdCBwbWF0Y2hbMV07CisJCW1lbXNldChwbWF0Y2gsIDAsIHNpemVvZihwbWF0Y2gpKTsKKwkJcG1hdGNoWzBdLnJtX3NvID0gMDsKKwkJcG1hdGNoWzBdLnJtX2VvID0gbGVuOworCQllcnIgPSByZWdleGVjKCZtZC0+cHJlZywgc3RyLCAwLCBwbWF0Y2gsIFJFR19TVEFSVEVORCk7CisJfQorI2Vsc2UgLyogSEFWRV9SRUdfU1RBUlRFTkQgKi8KKwl7CisJCS8qIFdlIGhhdmUgdG8gY3JlYXRlIGEgY29weSBvZiB0aGUgc3RyaW5nIGluIHRoaXMgY2FzZSAqLworCQljaGFyICpteXN0cmNweTsKKwkJQ0hFQ0tfTUFMTE9DKCBteXN0cmNweSA9IG9zMGR1cChzdHIsIGxlbikgKTsKKwkJZXJyID0gcmVnZXhlYygmbWQtPnByZWcsIG15c3RyY3B5LCAwLCBOVUxMLCAwKTsKKwkJZnJlZShteXN0cmNweSk7CisJfQorI2VuZGlmIC8qIEhBVkVfUkVHX1NUQVJURU5EICovCisJCisJLyogTm93IGNoZWNrIHRoZSByZXN1bHQgKi8KKwlpZiAoZXJyID09IDApIHsKKwkJLyogV2UgaGF2ZSBhIG1hdGNoICovCisJCSpyZXMgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJCisJaWYgKGVyciA9PSBSRUdfTk9NQVRDSCkgeworCQkqcmVzID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCQorCS8qIEluIG90aGVyIGNhc2VzLCB3ZSBoYXZlIGFuIGVycm9yICovCisJeworCQljaGFyICogYnVmOworCQlzaXplX3QgYmw7CisJCQorCQkvKiBFcnJvciB3aGlsZSBjb21waWxpbmcgdGhlIHJlZ2V4ICovCisJCVRSQUNFX0RFQlVHKElORk8sICJFcnJvciB3aGlsZSBleGVjdXRpbmcgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiAnJXMnOiIsIG1kLT5wbGFpbik7CisJCQorCQkvKiBHZXQgdGhlIGVycm9yIG1lc3NhZ2Ugc2l6ZSAqLworCQlibCA9IHJlZ2Vycm9yKGVyciwgJm1kLT5wcmVnLCBOVUxMLCAwKTsKKwkJCisJCS8qIEFsbG9jIHRoZSBidWZmZXIgZm9yIGVycm9yIG1lc3NhZ2UgKi8KKwkJQ0hFQ0tfTUFMTE9DKCBidWYgPSBtYWxsb2MoYmwpICk7CisJCQorCQkvKiBHZXQgdGhlIGVycm9yIG1lc3NhZ2UgY29udGVudCAqLworCQlyZWdlcnJvcihlcnIsICZtZC0+cHJlZywgYnVmLCBibCk7CisJCVRSQUNFX0RFQlVHKElORk8sICJcdCVzIiwgYnVmKTsKKwkJCisJCS8qIEZyZWUgdGhlIGJ1ZmZlciwgcmV0dXJuIHRoZSBlcnJvciAqLworCQlmcmVlKGJ1Zik7CisJfQorCisJcmV0dXJuIChlcnIgPT0gUkVHX0VTUEFDRSkgPyBFTk9NRU0gOiBFSU5WQUw7Cit9CisKKy8qIFNlYXJjaCBpbiBsaXN0ICh0YXJnZXRzIG9yIHJ1bGVzKSB0aGUgbmV4dCBtYXRjaGluZyBpdGVtIGZvciBvY3RldCBzdHJpbmcgc3RyKGxlbikuIFJldHVybmVkIGluIG5leHRfbWF0Y2gsIG9yICpuZXh0X21hdGNoID09IE5VTEwgaWYgbm8gbW9yZSBtYXRjaC4gUmUtZW50ZXIgd2l0aCBzYW1lIG5leHRfbWF0Y2ggZm9yIHRoZSBuZXh0IG9uZS4gKi8KK3N0YXRpYyBpbnQgZ2V0X25leHRfbWF0Y2goc3RydWN0IGZkX2xpc3QgKiBsaXN0LCBjaGFyICogc3RyLCBzaXplX3QgbGVuLCBzdHJ1Y3QgZmRfbGlzdCAqKiBuZXh0X21hdGNoKQoreworCXN0cnVjdCBmZF9saXN0ICogbGk7CisJCisJVFJBQ0VfRU5UUlkoIiVwICVwICV6ZCAlcCIsIGxpc3QsIHN0ciwgbGVuLCBuZXh0X21hdGNoKTsKKwlDSEVDS19QQVJBTVMobGlzdCAmJiBzdHIgJiYgbGVuICYmIG5leHRfbWF0Y2gpOworCQorCWlmICgqbmV4dF9tYXRjaCkKKwkJbGkgPSAoKm5leHRfbWF0Y2gpLT5uZXh0OworCWVsc2UKKwkJbGkgPSBsaXN0LT5uZXh0OworCQorCS8qIEluaXRpYWxpemUgdGhlIHJldHVybiB2YWx1ZSAqLworCSpuZXh0X21hdGNoID0gTlVMTDsKKwkKKwlmb3IgKCA7IGxpICE9IGxpc3Q7IGxpID0gbGktPm5leHQpIHsKKwkJaW50IGNtcDsKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCBmZF9saXN0IAkJY2hhaW47CisJCQlzdHJ1Y3QgbWF0Y2hfZGF0YSAJbWQ7CisJCX0gKiBuZXh0X2l0ZW0gPSAodm9pZCAqKWxpOworCQkKKwkJLyogQ2hlY2sgaWYgdGhlIHN0cmluZyBtYXRjaGVzIHRoaXMgbmV4dCBpdGVtICovCisJCUNIRUNLX0ZDVCggY29tcGFyZV9tYXRjaChzdHIsIGxlbiwgJm5leHRfaXRlbS0+bWQsICZjbXApICk7CisJCQorCQlpZiAoY21wID09IDApIHsKKwkJCS8qIG1hdGNoZWQhICovCisJCQkqbmV4dF9tYXRjaCA9IGxpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJCisJCWlmIChjbXAgPCAwKSAvKiB3ZSBjYW4gc3RvcCBzZWFyY2hpbmcgKi8KKwkJCWJyZWFrOworCX0KKwkKKwkvKiBXZSdyZSBkb25lIHdpdGggdGhlIGxpc3QgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBkaWN0X29iamVjdCAqIEFWUF9NT0RFTFNbUlREX0NSSV9NQVhdOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBQcmVwYXJlIHRoZSBtb2R1bGUgKi8KK2ludCBydGRfaW5pdCh2b2lkKQoreworCWludCBpOworCQorCVRSQUNFX0VOVFJZKCk7CisJCisJZm9yIChpID0gMDsgaSA8IFJURF9UQVJfTUFYOyBpKyspIHsKKwkJZmRfbGlzdF9pbml0KCZUQVJHRVRTW2ldLCBOVUxMKTsKKwl9CisJCisJZm9yIChpID0gMTsgaSA8IFJURF9DUklfTUFYOyBpKyspIHsKKwkJc3dpdGNoIChpKSB7CisJCQljYXNlIFJURF9DUklfT0g6CisJCQkJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiT3JpZ2luLUhvc3QiLCAmQVZQX01PREVMU1tpXSwgRU5PRU5UICkpOworCQkJCWJyZWFrOworCQkJY2FzZSBSVERfQ1JJX09SOgorCQkJCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2ggKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIk9yaWdpbi1SZWFsbSIsICZBVlBfTU9ERUxTW2ldLCBFTk9FTlQgKSk7CisJCQkJYnJlYWs7CisJCQljYXNlIFJURF9DUklfREg6CisJCQkJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiRGVzdGluYXRpb24tSG9zdCIsICZBVlBfTU9ERUxTW2ldLCBFTk9FTlQgKSk7CisJCQkJYnJlYWs7CisJCQljYXNlIFJURF9DUklfRFI6CisJCQkJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiRGVzdGluYXRpb24tUmVhbG0iLCAmQVZQX01PREVMU1tpXSwgRU5PRU5UICkpOworCQkJCWJyZWFrOworCQkJY2FzZSBSVERfQ1JJX1VOOgorCQkJCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2ggKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIlVzZXItTmFtZSIsICZBVlBfTU9ERUxTW2ldLCBFTk9FTlQgKSk7CisJCQkJYnJlYWs7CisJCQljYXNlIFJURF9DUklfU0k6CisJCQkJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiU2Vzc2lvbi1JZCIsICZBVlBfTU9ERUxTW2ldLCBFTk9FTlQgKSk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCVRSQUNFX0RFQlVHKElORk8sICJNaXNzaW5nIGRlZmluaXRpb24gaW4gZXh0ZW5zaW9uIGluaXRpYWxpemVyIik7CisJCQkJQVNTRVJUKCAwICk7CisJCQkJcmV0dXJuIEVJTlZBTDsKKwkJfQorCX0KKwkKKwlyZXR1cm4gMDsKK30KKworLyogRGVzdHJveSB0aGUgbW9kdWxlJ3MgZGF0YSAqLwordm9pZCBydGRfZmluaSh2b2lkKQoreworCWludCBpOworCQorCVRSQUNFX0VOVFJZKCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUlREX1RBUl9NQVg7IGkrKykgeworCQl3aGlsZSAoIUZEX0lTX0xJU1RfRU1QVFkoJlRBUkdFVFNbaV0pKSB7CisJCQlkZWxfdGFyZ2V0KChzdHJ1Y3QgdGFyZ2V0ICopIFRBUkdFVFNbaV0ubmV4dCk7CisJCX0KKwl9CisJCit9CisKKy8qIEFkZCBhIG5ldyBydWxlIGluIHRoZSByZXBvc2l0b3J5LiB0aGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgaXMgYmVpbmcgcGFyc2VkICovCitpbnQgcnRkX2FkZChlbnVtIHJ0ZF9jcml0X3R5cGUgY3QsIGNoYXIgKiBjcml0ZXJpYSwgZW51bSBydGRfdGFyZ190eXBlIHR0LCBjaGFyICogdGFyZ2V0LCBpbnQgc2NvcmUsIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgZmRfbGlzdCAqIHRhcmdldF9zdWl2ID0gTlVMTDsKKwlzdHJ1Y3QgZmRfbGlzdCAqIHJ1bGVfc3VpdiA9IE5VTEw7CisJc3RydWN0IHRhcmdldCAqIHRyZyA9IE5VTEw7CisJc3RydWN0IHJ1bGUgKiBydWwgPSBOVUxMOworCQorCVRSQUNFX0VOVFJZKCIlZCAlcCAlZCAlcCAlZCAleCIsIGN0LCBjcml0ZXJpYSwgdHQsIHRhcmdldCwgc2NvcmUsIGZsYWdzKTsKKwlDSEVDS19QQVJBTVMoKGN0IDwgUlREX0NSSV9NQVgpICYmICgoY3QgPT0gUlREX0NSSV9BTEwpIHx8IGNyaXRlcmlhKSAmJiAodHQgPCBSVERfVEFSX01BWCkgJiYgdGFyZ2V0KTsKKwkKKwkvKiBGaXJzdCwgc2VhcmNoIGluIHRoZSBUQVJHRVQgbGlzdCBpZiB3ZSBhbHJlYWR5IGhhdmUgdGhpcyB0YXJnZXQgKi8KKwlmb3IgKHRhcmdldF9zdWl2ID0gVEFSR0VUU1t0dF0ubmV4dDsgdGFyZ2V0X3N1aXYgIT0gJlRBUkdFVFNbdHRdOyB0YXJnZXRfc3VpdiA9IHRhcmdldF9zdWl2LT5uZXh0KSB7CisJCWludCBjbXA7CisJCXN0cnVjdCB0YXJnZXQgKiBjdXIgPSAoc3RydWN0IHRhcmdldCAqKXRhcmdldF9zdWl2OworCQkKKwkJaWYgKGZsYWdzICYgUlREX1RBUkdfUkVHKSB7CisJCQkvKiBXZSBhcmUgYWRkaW5nIGEgcmVnZXhwLCBpdCBpcyBzYXZlZCBpbiB0aGUgbGlzdCBiZWZvcmUgdGhlIHBsYWluIGV4cHJlc3Npb25zICovCisJCQlpZiAoY3VyLT5tZC5pc19yZWdleCA9PSAwKQorCQkJCWJyZWFrOwkKKwkJfSBlbHNlIHsKKwkJCS8qIFdlIGFyZSBhZGRpbmcgYSBwbGFpbiBleHByZXNzaW9uLCBzYXZlIGl0IGFmdGVyIGFsbCByZWdleHBzICovCisJCQlpZiAoY3VyLT5tZC5pc19yZWdleCAhPSAwKQorCQkJCWNvbnRpbnVlOworCQl9CisJCQorCQkvKiBBdCB0aGlzIHBvaW50LCB0aGUgdHlwZSBpcyB0aGUgc2FtZSwgc28gY29tcGFyZSB0aGUgcGxhaW4gc3RyaW5nIHZhbHVlICovCisJCWNtcCA9IHN0cmNtcChjdXItPm1kLnBsYWluLCB0YXJnZXQpOworCQlpZiAoY21wIDwgMCkKKwkJCWNvbnRpbnVlOworCQkKKwkJaWYgKGNtcCA9PSAwKSAvKiBXZSBhbHJlYWR5IGhhdmUgYSB0YXJnZXQgd2l0aCB0aGUgc2FtZSBzdHJpbmcgKi8KKwkJCXRyZyA9IGN1cjsKKwkJCisJCWJyZWFrOworCX0KKwkKKwlpZiAodHJnKSB7CisJCS8qIE9rLCB3ZSBjYW4gZnJlZSB0aGUgdGFyZ2V0IHN0cmluZywgd2Ugd2lsbCB1c2UgdGhlIHByZXZpb3VzbHkgYWxsb2NhdGVkIG9uZSAqLworCQlmcmVlKHRhcmdldCk7CisJfSBlbHNlIHsKKwkJQ0hFQ0tfTUFMTE9DKCB0cmcgPSBuZXdfdGFyZ2V0KHRhcmdldCwgZmxhZ3MgJiBSVERfVEFSR19SRUcpICk7CisJCWZkX2xpc3RfaW5zZXJ0X2JlZm9yZSggdGFyZ2V0X3N1aXYsICZ0cmctPmNoYWluICk7CisJfQorCQorCS8qIE5vdywgc2VhcmNoIGZvciB0aGUgcnVsZSBwb3NpdGlvbiBpbiB0aGlzIHRhcmdldCdzIGxpc3QgKi8KKwlpZiAoY3QgPT0gUlREX0NSSV9BTEwpIHsKKwkJLyogU3BlY2lhbCBjYXNlOiB3ZSBkb24ndCBoYXZlIGEgY3JpdGVyaWEgLS0gYWx3YXlzIGNyZWF0ZSBhIHJ1bGUgZWxlbWVudCAqLworCQlDSEVDS19NQUxMT0MoIHJ1bCA9IG5ld19ydWxlKE5VTEwsIDAsIHNjb3JlKSApOworCQlmZF9saXN0X2luc2VydF9iZWZvcmUoICZ0cmctPnJ1bGVzW1JURF9DUklfQUxMXSwgJnJ1bC0+Y2hhaW4gKTsKKwl9IGVsc2UgeworCQlmb3IgKHJ1bGVfc3VpdiA9IHRyZy0+cnVsZXNbY3RdLm5leHQ7IHJ1bGVfc3VpdiAhPSAmdHJnLT5ydWxlc1tjdF07IHJ1bGVfc3VpdiA9IHJ1bGVfc3Vpdi0+bmV4dCkgeworCQkJaW50IGNtcDsKKwkJCXN0cnVjdCBydWxlICogY3VyID0gKHN0cnVjdCBydWxlICopcnVsZV9zdWl2OworCisJCQlpZiAoZmxhZ3MgJiBSVERfQ1JJVF9SRUcpIHsKKwkJCQkvKiBXZSBhcmUgYWRkaW5nIGEgcmVnZXhwLCBpdCBpcyBzYXZlZCBpbiB0aGUgbGlzdCBiZWZvcmUgdGhlIHBsYWluIGV4cHJlc3Npb25zICovCisJCQkJaWYgKGN1ci0+bWQuaXNfcmVnZXggPT0gMCkKKwkJCQkJYnJlYWs7CQorCQkJfSBlbHNlIHsKKwkJCQkvKiBXZSBhcmUgYWRkaW5nIGEgcGxhaW4gZXhwcmVzc2lvbiwgc2F2ZSBpdCBhZnRlciBhbGwgcmVnZXhwcyAqLworCQkJCWlmIChjdXItPm1kLmlzX3JlZ2V4ICE9IDApCisJCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKiBBdCB0aGlzIHBvaW50LCB0aGUgdHlwZSBpcyB0aGUgc2FtZSwgc28gY29tcGFyZSB0aGUgcGxhaW4gc3RyaW5nIHZhbHVlICovCisJCQljbXAgPSBzdHJjbXAoY3VyLT5tZC5wbGFpbiwgY3JpdGVyaWEpOworCQkJaWYgKGNtcCA8IDApCisJCQkJY29udGludWU7CisKKwkJCWlmIChjbXAgPT0gMCkgLyogV2UgYWxyZWFkeSBoYXZlIGEgdGFyZ2V0IHdpdGggdGhlIHNhbWUgc3RyaW5nICovCisJCQkJcnVsID0gY3VyOworCisJCQlicmVhazsKKwkJfQorCQorCQlpZiAocnVsKSB7CisJCQkvKiBPaywgd2UgY2FuIGZyZWUgdGhlIHRhcmdldCBzdHJpbmcsIHdlIHdpbGwgdXNlIHRoZSBwcmV2aW91c2x5IGFsbG9jYXRlZCBvbmUgKi8KKwkJCWZyZWUoY3JpdGVyaWEpOworCQkJVFJBQ0VfREVCVUcoSU5GTywgIldhcm5pbmc6IGR1cGxpY2F0ZSBydWxlICglcyA6ICVzKSBmb3VuZCwgbWVyZ2luZyBzY29yZS4uLiIsIHJ1bC0+bWQucGxhaW4sIHRyZy0+bWQucGxhaW4pOworCQkJcnVsLT5zY29yZSArPSBzY29yZTsKKwkJfSBlbHNlIHsKKwkJCUNIRUNLX01BTExPQyggcnVsID0gbmV3X3J1bGUoY3JpdGVyaWEsIGZsYWdzICYgUlREX0NSSVRfUkVHLCBzY29yZSkgKTsKKwkJCWZkX2xpc3RfaW5zZXJ0X2JlZm9yZSggcnVsZV9zdWl2LCAmcnVsLT5jaGFpbiApOworCQl9CisJfQorCQorCXJldHVybiAwOworfQorCisvKiBDaGVjayBpZiBhIG1lc3NhZ2UgYW5kIGxpc3Qgb2YgZWxpZ2libGUgY2FuZGlkYXRlIG1hdGNoIGFueSBvZiBvdXIgcnVsZXMsIGFuZCB1cGRhdGUgaXRzIHNjb3JlIGFjY29yZGluZyB0byBpdC4gKi8KK2ludCBydGRfcHJvY2Vzcyggc3RydWN0IG1zZyAqIG1zZywgc3RydWN0IGZkX2xpc3QgKiBjYW5kaWRhdGVzICkKK3sKKwlzdHJ1Y3QgZmRfbGlzdCAqIGxpOworCXN0cnVjdCB7CisJCWVudW0geyBOT1RfUkVTT0xWRURfWUVUID0gMCwgTk9UX0ZPVU5ELCBGT1VORCB9IHN0YXR1czsKKwkJdW5pb24gYXZwX3ZhbHVlICogYXZwOworCX0gcGFyc2VkX21zZ19hdnBbUlREX0NSSV9NQVhdOworCQorCVRSQUNFX0VOVFJZKCIlcCAlcCIsIG1zZywgY2FuZGlkYXRlcyk7CisJQ0hFQ0tfUEFSQU1TKG1zZyAmJiBjYW5kaWRhdGVzKTsKKwkKKwkvKiBXZSBkZWxheSBsb29raW5nIGZvciB0aGUgQVZQcyBpbiB0aGUgbWVzc2FnZSB1bnRpbCB3ZSByZWFsbHkgbmVlZCB0aGVtLiBBbm90aGVyIGFwcHJvYWNoIHdvdWxkIGJlIHRvIHBhcnNlIHRoZSBtZXNzYWdlIG9uY2UgYW5kIHNhdmUgYWxsIG5lZWRlZCBBVlBzLiAqLworCW1lbXNldChwYXJzZWRfbXNnX2F2cCwgMCwgc2l6ZW9mKHBhcnNlZF9tc2dfYXZwKSk7CisJCisJLyogRm9yIGVhY2ggY2FuZGlkYXRlIGluIHRoZSBsaXN0ICovCisJZm9yIChsaSA9IGNhbmRpZGF0ZXMtPm5leHQ7IGxpICE9IGNhbmRpZGF0ZXM7IGxpID0gbGktPm5leHQpIHsKKwkJc3RydWN0IHJ0ZF9jYW5kaWRhdGUgKiBjYW5kID0gKHN0cnVjdCBydGRfY2FuZGlkYXRlICopbGk7CisJCWludCBpOworCQlzdHJ1Y3QgeworCQkJY2hhciAqIHN0cjsKKwkJCXNpemVfdCBsZW47CisJCX0gY2FuZF9kYXRhW1JURF9UQVJfTUFYXSA9IHsKKwkJCXsgY2FuZC0+ZGlhbWlkLCAgc3RybGVuKGNhbmQtPmRpYW1pZCkgfSwKKwkJCXsgY2FuZC0+cmVhbG0sICAgc3RybGVuKGNhbmQtPnJlYWxtKSAgfQorCQl9OworCQkKKwkJZm9yIChpID0gMDsgaSA8IFJURF9UQVJfTUFYOyBpKyspIHsKKwkJCS8qIFNlYXJjaCB0aGUgbmV4dCBydWxlIG1hdGNoaW5nIHRoaXMgY2FuZGlkYXRlIGluIHRoZSBpLXRoIHRhcmdldCBsaXN0ICovCisJCQlzdHJ1Y3QgdGFyZ2V0ICogdGFyZ2V0ID0gTlVMTDsKKwkJCQorCQkJZG8geworCQkJCWludCBqOworCQkJCXN0cnVjdCBmZF9saXN0ICogbDsKKwkJCQlzdHJ1Y3QgcnVsZSAqIHI7CisJCQkJCisJCQkJQ0hFQ0tfRkNUICggZ2V0X25leHRfbWF0Y2goICZUQVJHRVRTW2ldLCBjYW5kX2RhdGFbaV0uc3RyLCBjYW5kX2RhdGFbaV0ubGVuLCAodm9pZCAqKSZ0YXJnZXQpICk7CisJCQkJaWYgKCF0YXJnZXQpCisJCQkJCWJyZWFrOworCQkJCQorCQkJCS8qIEZpcnN0LCBhcHBseSBhbGwgcnVsZXMgb2YgY3JpdGVyaWEgUlREX0NSSV9BTEwgKi8KKwkJCQlmb3IgKCBsID0gdGFyZ2V0LT5ydWxlc1tSVERfQ1JJX0FMTF0ubmV4dDsgbCAhPSAmdGFyZ2V0LT5ydWxlc1tSVERfQ1JJX0FMTF07IGwgPSBsLT5uZXh0ICkgeworCQkJCQlyID0gKHN0cnVjdCBydWxlICopbDsKKwkJCQkJY2FuZC0+c2NvcmUgKz0gci0+c2NvcmU7CisJCQkJCVRSQUNFX0RFQlVHKEFOTk9ZSU5HLCAiQXBwbGllZCBydWxlIHsnKicgOiAnJXMnICs9ICVkfSB0byBjYW5kaWRhdGUgJyVzJyIsIHRhcmdldC0+bWQucGxhaW4sIHItPnNjb3JlLCBjYW5kLT5kaWFtaWQpOworCQkJCX0KKwkJCQkKKwkJCQkvKiBUaGUgdGFyZ2V0IGlzIG1hdGNoaW5nIHRoaXMgY2FuZGlkYXRlLCBjaGVjayBpZiB0aGVyZSBhcmUgYWRkaXRpb25hbCBydWxlcyBjcml0ZXJpYSBtYXRjaGluZyB0aGlzIG1lc3NhZ2UuICovCisJCQkJZm9yICggaiA9IDE7IGogPCBSVERfQ1JJX01BWDsgaisrICkgeworCQkJCQlpZiAoICEgRkRfSVNfTElTVF9FTVBUWSgmdGFyZ2V0LT5ydWxlc1tqXSkgKSB7CisJCQkJCQkvKiBpZiBuZWVkZWQsIGZpbmQgdGhlIHJlcXVpcmVkIGRhdGEgaW4gdGhlIG1lc3NhZ2UgKi8KKwkJCQkJCWlmIChwYXJzZWRfbXNnX2F2cFtqXS5zdGF0dXMgPT0gTk9UX1JFU09MVkVEX1lFVCkgeworCQkJCQkJCXN0cnVjdCBhdnAgKiBhdnAgPSBOVUxMOworCQkJCQkJCS8qIFNlYXJjaCBmb3IgdGhlIEFWUCBpbiB0aGUgbWVzc2FnZSAqLworCQkJCQkJCUNIRUNLX0ZDVCggZmRfbXNnX3NlYXJjaF9hdnAgKCBtc2csIEFWUF9NT0RFTFNbal0sICZhdnAgKSApOworCQkJCQkJCWlmIChhdnAgPT0gTlVMTCkgeworCQkJCQkJCQlwYXJzZWRfbXNnX2F2cFtqXS5zdGF0dXMgPSBOT1RfRk9VTkQ7CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJc3RydWN0IGF2cF9oZHIgKiBhaGRyID0gTlVMTDsKKwkJCQkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2hkciAoIGF2cCwgJmFoZHIgKSApOworCQkJCQkJCQlpZiAoYWhkci0+YXZwX3ZhbHVlID09IE5VTEwpIHsKKwkJCQkJCQkJCS8qIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4sIGJ1dCBhbnl3YXkgbGV0J3MganVzdCBpZ25vcmUgaXQgKi8KKwkJCQkJCQkJCXBhcnNlZF9tc2dfYXZwW2pdLnN0YXR1cyA9IE5PVF9GT1VORDsKKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCS8qIE9LLCB3ZSBnb3QgdGhlIEFWUCAqLworCQkJCQkJCQkJcGFyc2VkX21zZ19hdnBbal0uc3RhdHVzID0gRk9VTkQ7CisJCQkJCQkJCQlwYXJzZWRfbXNnX2F2cFtqXS5hdnAgPSBhaGRyLT5hdnBfdmFsdWU7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQkKKwkJCQkJCS8qIElmIHdlIGRpZCBub3QgZmluZCB0aGUgZGF0YSBmb3IgdGhlc2UgcnVsZXMgaW4gdGhlIG1lc3NhZ2UsIGp1c3Qgc2tpcCB0aGUgc2VyaWVzICovCisJCQkJCQlpZiAocGFyc2VkX21zZ19hdnBbal0uc3RhdHVzID09IE5PVF9GT1VORCkgeworCQkJCQkJCVRSQUNFX0RFQlVHKEFOTk9ZSU5HLCAiU2tpcHBpbmcgc2VyaWVzIG9mIHJ1bGVzICVkIG9mIHRhcmdldCAnJXMnLCBjcml0ZXJpYSBhYnNlbnQgZnJvbSB0aGUgbWVzc2FnZSIsIGosIHRhcmdldC0+bWQucGxhaW4pOworCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJfQorCQkJCQkJCisJCQkJCQkvKiBPSywgd2UgY2FuIG5vdyBjaGVjayBpZiBvbmUgb2Ygb3VyIHJ1bGUncyBjcml0ZXJpYSBtYXRjaCB0aGUgbWVzc2FnZSBjb250ZW50ICovCisJCQkJCQlyID0gTlVMTDsKKwkJCQkJCWRvIHsKKwkJCQkJCQlDSEVDS19GQ1QgKCBnZXRfbmV4dF9tYXRjaCggJnRhcmdldC0+cnVsZXNbal0sIChjaGFyICopIC8qIGlzIHRoaXMgY2FzdCBzYWZlPyAqLyBwYXJzZWRfbXNnX2F2cFtqXS5hdnAtPm9zLmRhdGEsIHBhcnNlZF9tc2dfYXZwW2pdLmF2cC0+b3MubGVuLCAodm9pZCAqKSZyKSApOworCQkJCQkJCWlmICghcikKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCisJCQkJCQkJY2FuZC0+c2NvcmUgKz0gci0+c2NvcmU7CisJCQkJCQkJVFJBQ0VfREVCVUcoQU5OT1lJTkcsICJBcHBsaWVkIHJ1bGUgeyclcycgOiAnJXMnICs9ICVkfSB0byBjYW5kaWRhdGUgJyVzJyIsIHItPm1kLnBsYWluLCB0YXJnZXQtPm1kLnBsYWluLCByLT5zY29yZSwgY2FuZC0+ZGlhbWlkKTsKKwkJCQkJCX0gd2hpbGUgKDEpOworCQkJCQl9CisJCQkJfQorCQkJfSB3aGlsZSAoMSk7CisJCX0KKwl9CisJCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgcnRkX2R1bXAodm9pZCkKK3sKKwlpbnQgaTsKKwlmZF9sb2dfZGVidWcoIltydF9kZWZhdWx0XSBEdW1waW5nIHJ1bGVzIHJlcG9zaXRvcnkuLi4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgUlREX1RBUl9NQVg7IGkrKykgeworCQlpZiAoIUZEX0lTX0xJU1RfRU1QVFkoICZUQVJHRVRTW2ldICkpIHsKKwkJCXN0cnVjdCBmZF9saXN0ICogbGk7CisJCQlmZF9sb2dfZGVidWcoIiAgVGFyZ2V0cyBsaXN0ICVkOiIsIGkpOworCQkJZm9yIChsaSA9IFRBUkdFVFNbaV0ubmV4dDsgbGkgIT0gJlRBUkdFVFNbaV07IGxpID0gbGktPm5leHQpIHsKKwkJCQlkdW1wX3RhcmdldCg0LCAoc3RydWN0IHRhcmdldCAqKWxpKTsKKwkJCX0KKwkJfQorCX0KKwkKKwlmZF9sb2dfZGVidWcoIltydF9kZWZhdWx0XSBFbmQgb2YgZHVtcCIpOworfQpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9ydF9lcmVnL0NNYWtlTGlzdHMudHh0IGIvZXh0ZW5zaW9ucy9ydF9lcmVnL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNmVjMmUKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL3J0X2VyZWcvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw0NCBAQAorIyBUaGUgcnRfZXJlZyBleHRlbnNpb24KK1BST0pFQ1QoIlJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGluZyBiYXNlZCByb3V0aW5nIGV4dGVuc2lvbiIgQykKKworIyBDaGVjayBpZiBSRUdfU1RBUlRFTkQgaXMgcHJvdmlkZWQgb24gdGhlIGhvc3QKK1NFVChDSEVDS19SRUdfU1RBUlRFTkRfU09VUkNFX0NPREUgIgorCSNpbmNsdWRlIDx1bmlzdGQuaD4KKwkjaW5jbHVkZSA8cmVnZXguaD4KKwlpbnQgbWFpbigpIHsKKwkgICByZXR1cm4gcmVnZXhlYyhOVUxMLCBOVUxMLCAwLCBOVUxMLCBSRUdfU1RBUlRFTkQpOworCX0KKwkiKQorQ0hFQ0tfQ19TT1VSQ0VfQ09NUElMRVMoIiR7Q0hFQ0tfUkVHX1NUQVJURU5EX1NPVVJDRV9DT0RFfSIgSEFWRV9SRUdfU1RBUlRFTkQpCitJRiAoSEFWRV9SRUdfU1RBUlRFTkQpCisgICAgIEFERF9ERUZJTklUSU9OUygtREhBVkVfUkVHX1NUQVJURU5EKQorRU5ESUYgKEhBVkVfUkVHX1NUQVJURU5EKQorCisKKyMgUGFyc2VyIGZpbGVzCitCSVNPTl9GSUxFKHJ0ZXJlZ19jb25mLnkpCitGTEVYX0ZJTEUocnRlcmVnX2NvbmYubCkKK1NFVF9TT1VSQ0VfRklMRVNfUFJPUEVSVElFUyhsZXgucnRlcmVnX2NvbmYuYyBydGVyZWdfY29uZi50YWIuYyBQUk9QRVJUSUVTIENPTVBJTEVfRkxBR1MgIi1JICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfSIpCisKKyMgTGlzdCBvZiBzb3VyY2UgZmlsZXMKK1NFVCggUlRFUkVHX1NSQworCXJ0ZXJlZy5jCisJcnRlcmVnLmgKKwlsZXgucnRlcmVnX2NvbmYuYworCXJ0ZXJlZ19jb25mLnRhYi5jCisJcnRlcmVnX2NvbmYudGFiLmgKKykKKworSU5DTFVERV9ESVJFQ1RPUklFUygke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0pCisKKyMgQ29tcGlsZSB0aGVzZSBmaWxlcyBhcyBhIGZyZWVEaWFtZXRlciBleHRlbnNpb24KK0ZEX0FERF9FWFRFTlNJT04ocnRfZXJlZyAke1JURVJFR19TUkN9KQorCisKKyMjIyMKKyMjIElOU1RBTEwgc2VjdGlvbiAjIworCisjIFdlIGluc3RhbGwgd2l0aCB0aGUgZGFlbW9uIGNvbXBvbmVudCBiZWNhdXNlIGl0IGlzIGEgYmFzZSBmZWF0dXJlLgorSU5TVEFMTChUQVJHRVRTIHJ0X2VyZWcKKwlMSUJSQVJZIERFU1RJTkFUSU9OICR7SU5TVEFMTF9FWFRFTlNJT05TX1NVRkZJWH0KKwlDT01QT05FTlQgZnJlZURpYW1ldGVyLWRhZW1vbikKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvcnRfZXJlZy9ydGVyZWcuYyBiL2V4dGVuc2lvbnMvcnRfZXJlZy9ydGVyZWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTRkYjE2Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9ydF9lcmVnL3J0ZXJlZy5jCkBAIC0wLDAgKzEsMjI1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxMywgV0lERSBQcm9qZWN0IGFuZCBOSUNUCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBXSURFIFByb2plY3Qgb3IgTklDVCBub3IgdGhlIAkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFdJREUgUHJvamVjdCBhbmQgCQkJCQkJICoKKyogICBOSUNULgkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIAorICogVGhpcyBleHRlbnNpb24gYWxsb3dzIHRvIHBlcmZvcm0gc29tZSBwYXR0ZXJuLW1hdGNoaW5nIG9uIGFuIEFWUAorICogYW5kIHNlbmQgdGhlIG1lc3NhZ2UgdG8gYSBzZXJ2ZXIgYWNjb3JkaW5nbHkuCisgKiBTZWUgcnRfZXJlZy5jb25mLnNhbXBsZSBmaWxlIGZvciB0aGUgZm9ybWF0IG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCisgKi8KKworI2luY2x1ZGUgInJ0ZXJlZy5oIgorCisvKiBUaGUgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBydGVyZWdfY29uZiBydGVyZWdfY29uZjsKKworI2lmbmRlZiBIQVZFX1JFR19TVEFSVEVORAorc3RhdGljIGNoYXIgKiBidWYgPSBOVUxMOworc3RhdGljIHNpemVfdCBidWZzejsKK3N0YXRpYyBwdGhyZWFkX211dGV4X3QgbXR4ID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKKyNlbmRpZiAvKiBIQVZFX1JFR19TVEFSVEVORCAqLworCitzdGF0aWMgaW50IHByb2NlZWQoY2hhciAqIHZhbHVlLCBzaXplX3QgbGVuLCBzdHJ1Y3QgZmRfbGlzdCAqIGNhbmRpZGF0ZXMpCit7CisJaW50IGk7CisJCisJZm9yIChpID0gMDsgaSA8IHJ0ZXJlZ19jb25mLnJ1bGVzX25iOyBpKyspIHsKKwkJLyogRG9lcyB0aGlzIHBhdHRlcm4gbWF0Y2ggdGhlIHZhbHVlPyAqLworCQlzdHJ1Y3QgcnRlcmVnX3J1bGUgKiByID0gJnJ0ZXJlZ19jb25mLnJ1bGVzW2ldOworCQlpbnQgZXJyID0gMDsKKwkJc3RydWN0IGZkX2xpc3QgKiBjOworCQkKKwkJVFJBQ0VfREVCVUcoQU5OT1lJTkcsICJBdHRlbXB0IHBhdHRlcm4gbWF0Y2hpbmcgb2YgJyUuKnMnIHdpdGggcnVsZSAnJXMnIiwgKGludClsZW4sIHZhbHVlLCByLT5wYXR0ZXJuKTsKKwkJCisJCSNpZmRlZiBIQVZFX1JFR19TVEFSVEVORAorCQl7CisJCQlyZWdtYXRjaF90IHBtYXRjaFsxXTsKKwkJCW1lbXNldChwbWF0Y2gsIDAsIHNpemVvZihwbWF0Y2gpKTsKKwkJCXBtYXRjaFswXS5ybV9zbyA9IDA7CisJCQlwbWF0Y2hbMF0ucm1fZW8gPSBsZW47CisJCQllcnIgPSByZWdleGVjKCZyLT5wcmVnLCB2YWx1ZSwgMCwgcG1hdGNoLCBSRUdfU1RBUlRFTkQpOworCQl9CisJCSNlbHNlIC8qIEhBVkVfUkVHX1NUQVJURU5EICovCisJCXsKKwkJCS8qIFdlIGhhdmUgYSAwLXRlcm1pbmF0ZWQgc3RyaW5nICovCisJCQllcnIgPSByZWdleGVjKCZyLT5wcmVnLCB2YWx1ZSwgMCwgTlVMTCwgMCk7CisJCX0KKwkJI2VuZGlmIC8qIEhBVkVfUkVHX1NUQVJURU5EICovCisJCQorCQlpZiAoZXJyID09IFJFR19OT01BVENIKQorCQkJY29udGludWU7CisJCQkKKwkJaWYgKGVyciAhPSAwKSB7CisJCQljaGFyICogZXJyc3RyOworCQkJc2l6ZV90IGJsOworCisJCQkvKiBFcnJvciB3aGlsZSBjb21waWxpbmcgdGhlIHJlZ2V4ICovCisJCQlUUkFDRV9ERUJVRyhJTkZPLCAiRXJyb3Igd2hpbGUgZXhlY3V0aW5nIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gJyVzJzoiLCByLT5wYXR0ZXJuKTsKKworCQkJLyogR2V0IHRoZSBlcnJvciBtZXNzYWdlIHNpemUgKi8KKwkJCWJsID0gcmVnZXJyb3IoZXJyLCAmci0+cHJlZywgTlVMTCwgMCk7CisKKwkJCS8qIEFsbG9jIHRoZSBidWZmZXIgZm9yIGVycm9yIG1lc3NhZ2UgKi8KKwkJCUNIRUNLX01BTExPQyggZXJyc3RyID0gbWFsbG9jKGJsKSApOworCisJCQkvKiBHZXQgdGhlIGVycm9yIG1lc3NhZ2UgY29udGVudCAqLworCQkJcmVnZXJyb3IoZXJyLCAmci0+cHJlZywgZXJyc3RyLCBibCk7CisJCQlUUkFDRV9ERUJVRyhJTkZPLCAiXHQlcyIsIGVycnN0cik7CisKKwkJCS8qIEZyZWUgdGhlIGJ1ZmZlciwgcmV0dXJuIHRoZSBlcnJvciAqLworCQkJZnJlZShlcnJzdHIpOworCQkJCisJCQlyZXR1cm4gKGVyciA9PSBSRUdfRVNQQUNFKSA/IEVOT01FTSA6IEVJTlZBTDsKKwkJfQorCQkKKwkJLyogRnJvbSB0aGlzIHBvaW50LCB0aGUgZXhwcmVzc2lvbiBtYXRjaGVkIHRoZSBBVlAgdmFsdWUgKi8KKwkJVFJBQ0VfREVCVUcoRlVMTCwgIltydF9lcmVnXSBNYXRjaDogJyVzJyB0byB2YWx1ZSAnJS4qcycgPT4gJyVzJyArPSAlZCIsCisJCQkJCXItPnBhdHRlcm4sCisJCQkJCShpbnQpbGVuLAorCQkJCQl2YWx1ZSwKKwkJCQkJci0+c2VydmVyLAorCQkJCQlyLT5zY29yZSk7CisJCQorCQlmb3IgKGMgPSBjYW5kaWRhdGVzLT5uZXh0OyBjICE9IGNhbmRpZGF0ZXM7IGMgPSBjLT5uZXh0KSB7CisJCQlzdHJ1Y3QgcnRkX2NhbmRpZGF0ZSAqIGNhbmQgPSAoc3RydWN0IHJ0ZF9jYW5kaWRhdGUgKiljOworCisJCQlpZiAoc3RyY21wKHItPnNlcnZlciwgY2FuZC0+ZGlhbWlkKSA9PSAwKSB7CisJCQkJY2FuZC0+c2NvcmUgKz0gci0+c2NvcmU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9OworCQorCXJldHVybiAwOworfQorCisvKiBUaGUgY2FsbGJhY2sgY2FsbGVkIG9uIG5ldyBtZXNzYWdlcyAqLworc3RhdGljIGludCBydGVyZWdfb3V0KHZvaWQgKiBjYmRhdGEsIHN0cnVjdCBtc2cgKiogcG1zZywgc3RydWN0IGZkX2xpc3QgKiBjYW5kaWRhdGVzKQoreworCXN0cnVjdCBtc2cgKiBtc2cgPSAqcG1zZzsKKwlzdHJ1Y3QgYXZwICogYXZwID0gTlVMTDsKKwkKKwlUUkFDRV9FTlRSWSgiJXAgJXAgJXAiLCBjYmRhdGEsIG1zZywgY2FuZGlkYXRlcyk7CisJCisJQ0hFQ0tfUEFSQU1TKG1zZyAmJiBjYW5kaWRhdGVzKTsKKwkKKwkvKiBDaGVjayBpZiBpdCBpcyB3b3J0aCBwcm9jZXNzaW5nIHRoZSBtZXNzYWdlICovCisJaWYgKEZEX0lTX0xJU1RfRU1QVFkoY2FuZGlkYXRlcykpIHsKKwkJcmV0dXJuIDA7CisJfQorCQorCS8qIE5vdyBzZWFyY2ggdGhlIEFWUCBpbiB0aGUgbWVzc2FnZSAqLworCUNIRUNLX0ZDVCggZmRfbXNnX3NlYXJjaF9hdnAgKCBtc2csIHJ0ZXJlZ19jb25mLmF2cCwgJmF2cCApICk7CisJaWYgKGF2cCAhPSBOVUxMKSB7CisJCXN0cnVjdCBhdnBfaGRyICogYWhkciA9IE5VTEw7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9oZHIgKCBhdnAsICZhaGRyICkgKTsKKwkJaWYgKGFoZHItPmF2cF92YWx1ZSAhPSBOVUxMKSB7CisjaWZuZGVmIEhBVkVfUkVHX1NUQVJURU5ECisJCQlpbnQgcmV0OworCQkKKwkJCS8qIExvY2sgdGhlIGJ1ZmZlciAqLworCQkJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXR4KSApOworCQkJCisJCQkvKiBBdWdtZW50IHRoZSBidWZmZXIgaWYgbmVlZGVkICovCisJCQlpZiAoYWhkci0+YXZwX3ZhbHVlLT5vcy5sZW4gPj0gYnVmc3opIHsKKwkJCQlDSEVDS19NQUxMT0NfRE8oIGJ1ZiA9IHJlYWxsb2MoYnVmLCBhaGRyLT5hdnBfdmFsdWUtPm9zLmxlbiArIDEpLCAKKwkJCQkJeyBwdGhyZWFkX211dGV4X3VubG9jaygmbXR4KTsgcmV0dXJuIEVOT01FTTsgfSApOworCQkJfQorCQkJCisJCQkvKiBDb3B5IHRoZSBBVlAgdmFsdWUgKi8KKwkJCW1lbWNweShidWYsIGFoZHItPmF2cF92YWx1ZS0+b3MuZGF0YSwgYWhkci0+YXZwX3ZhbHVlLT5vcy5sZW4pOworCQkJYnVmW2FoZHItPmF2cF92YWx1ZS0+b3MubGVuXSA9ICdcMCc7CisJCQkKKwkJCS8qIE5vdyBhcHBseSB0aGUgcnVsZXMgKi8KKwkJCXJldCA9IHByb2NlZWQoYnVmLCBhaGRyLT5hdnBfdmFsdWUtPm9zLmxlbiwgY2FuZGlkYXRlcyk7CisJCQkKKwkJCUNIRUNLX1BPU0lYKHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdHgpKTsKKwkJCQorCQkJQ0hFQ0tfRkNUKHJldCk7CisjZWxzZSAvKiBIQVZFX1JFR19TVEFSVEVORCAqLworCQkJQ0hFQ0tfRkNUKCBwcm9jZWVkKChjaGFyICopIGFoZHItPmF2cF92YWx1ZS0+b3MuZGF0YSwgYWhkci0+YXZwX3ZhbHVlLT5vcy5sZW4sIGNhbmRpZGF0ZXMpICk7CisjZW5kaWYgLyogSEFWRV9SRUdfU1RBUlRFTkQgKi8KKwkJfQorCX0KKwkKKwlyZXR1cm4gMDsKK30KKworLyogaGFuZGxlciAqLworc3RhdGljIHN0cnVjdCBmZF9ydF9vdXRfaGRsICogcnRlcmVnX2hkbCA9IE5VTEw7CisKKy8qIGVudHJ5IHBvaW50ICovCitzdGF0aWMgaW50IHJ0ZXJlZ19lbnRyeShjaGFyICogY29uZmZpbGUpCit7CisJVFJBQ0VfRU5UUlkoIiVwIiwgY29uZmZpbGUpOworCQorCS8qIEluaXRpYWxpemUgdGhlIGNvbmZpZ3VyYXRpb24gKi8KKwltZW1zZXQoJnJ0ZXJlZ19jb25mLCAwLCBzaXplb2YocnRlcmVnX2NvbmYpKTsKKwkKKwkvKiBQYXJzZSB0aGUgY29uZmlndXJhdGlvbiBmaWxlICovCisJQ0hFQ0tfRkNUKCBydGVyZWdfY29uZl9oYW5kbGUoY29uZmZpbGUpICk7CisJCisJLyogUmVnaXN0ZXIgdGhlIGNhbGxiYWNrICovCisJQ0hFQ0tfRkNUKCBmZF9ydF9vdXRfcmVnaXN0ZXIoIHJ0ZXJlZ19vdXQsIE5VTEwsIDEsICZydGVyZWdfaGRsICkgKTsKKwkKKwkvKiBXZSdyZSBkb25lICovCisJcmV0dXJuIDA7Cit9CisKKy8qIFVubG9hZCAqLwordm9pZCBmZF9leHRfZmluaSh2b2lkKQoreworCWludCBpOworCVRSQUNFX0VOVFJZKCk7CisJCisJLyogVW5yZWdpc3RlciB0aGUgY2IgKi8KKwlDSEVDS19GQ1RfRE8oIGZkX3J0X291dF91bnJlZ2lzdGVyICggcnRlcmVnX2hkbCwgTlVMTCApLCAvKiBjb250aW51ZSAqLyApOworCQorCS8qIERlc3Ryb3kgdGhlIGRhdGEgKi8KKwlpZiAocnRlcmVnX2NvbmYucnVsZXMpIAorCQlmb3IgKGkgPSAwOyBpIDwgcnRlcmVnX2NvbmYucnVsZXNfbmI7IGkrKykgeworCQkJZnJlZShydGVyZWdfY29uZi5ydWxlc1tpXS5wYXR0ZXJuKTsKKwkJCWZyZWUocnRlcmVnX2NvbmYucnVsZXNbaV0uc2VydmVyKTsKKwkJCXJlZ2ZyZWUoJnJ0ZXJlZ19jb25mLnJ1bGVzW2ldLnByZWcpOworCQl9CisJZnJlZShydGVyZWdfY29uZi5ydWxlcyk7CisjaWZuZGVmIEhBVkVfUkVHX1NUQVJURU5ECisJZnJlZShidWYpOworI2VuZGlmIC8qIEhBVkVfUkVHX1NUQVJURU5EICovCisJCisJLyogRG9uZSAqLworCXJldHVybiA7Cit9CisKK0VYVEVOU0lPTl9FTlRSWSgicnRfZXJlZyIsIHJ0ZXJlZ19lbnRyeSk7CmRpZmYgLS1naXQgYS9leHRlbnNpb25zL3J0X2VyZWcvcnRlcmVnLmggYi9leHRlbnNpb25zL3J0X2VyZWcvcnRlcmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk1YzgyZgotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvcnRfZXJlZy9ydGVyZWcuaApAQCAtMCwwICsxLDY0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxMSwgV0lERSBQcm9qZWN0IGFuZCBOSUNUCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBXSURFIFByb2plY3Qgb3IgTklDVCBub3IgdGhlIAkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFdJREUgUHJvamVjdCBhbmQgCQkJCQkJICoKKyogICBOSUNULgkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiAgU2VlIHRoZSBydF9lcmVnLmNvbmYuc2FtcGxlIGZpbGUgZm9yIHRoZSBmb3JtYXQgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4KKyAqLworIAorLyogRnJlZURpYW1ldGVyJ3MgY29tbW9uIGluY2x1ZGUgZmlsZSAqLworI2luY2x1ZGUgPGZyZWVEaWFtZXRlci9leHRlbnNpb24uaD4KKyNpbmNsdWRlIDxyZWdleC5oPgorCisKKy8qIFBhcnNlIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgKi8KK2ludCBydGVyZWdfY29uZl9oYW5kbGUoY2hhciAqIGNvbmZmaWxlKTsKKworc3RydWN0IHJ0ZXJlZ19ydWxlIHsKKwljaGFyICogIHBhdHRlcm47IC8qIFRoZSBwYXR0ZXJuIHdlIHRyeSB0byBtYXRjaCB0aGUgQVZQIHZhbHVlIHRvICovCisJcmVnZXhfdCBwcmVnOyAgICAvKiBjb21waWxlZCByZWdleCAqLworCWNoYXIgKiAgc2VydmVyOyAgLyogVGhlIHBlZXIgdGhhdCBnZXRzIGl0cyBzY29yZSByYWlzZWQgaW4gY2FzZSBvZiBtYXRjaCAqLworCWludCAgICAgc2NvcmU7ICAgLyogVGhlIHJlbGF0aXZlIHZhbHVlIHRoYXQgaXMgYWRkZWQgdG8gdGhlIHBlZXIncyBzY29yZSAqLworfTsKKwkKKworLyogVGhlIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlICovCitleHRlcm4gc3RydWN0IHJ0ZXJlZ19jb25mIHsKKwlpbnQJCQlydWxlc19uYjsgLyogTnVtYmVyIG9mIHJ1bGVzIGluIHRoZSBjb25maWd1cmF0aW9uICovCisJc3RydWN0IHJ0ZXJlZ19ydWxlIAkqcnVsZXM7ICAgLyogVGhlIGFycmF5IG9mIHJ1bGVzICovCisJCisJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwOyAvKiBjYWNoZSB0aGUgZGljdGlvbmFyeSBvYmplY3QgdGhhdCB3ZSBhcmUgc2VhcmNoaW5nICovCisJCit9IHJ0ZXJlZ19jb25mOworCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL3J0X2VyZWcvcnRlcmVnX2NvbmYubCBiL2V4dGVuc2lvbnMvcnRfZXJlZy9ydGVyZWdfY29uZi5sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMjgxYTUKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL3J0X2VyZWcvcnRlcmVnX2NvbmYubApAQCAtMCwwICsxLDExOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTMsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUb2tlbml6ZXIKKyAqCisgKi8KKworJXsKKyNpbmNsdWRlICJydGVyZWcuaCIKKy8qIEluY2x1ZGUgeWFjYyB0b2tlbnMgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlICJydGVyZWdfY29uZi50YWIuaCIKKworLyogVXBkYXRlIHRoZSBjb2x1bW4gaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgWVlfVVNFUl9BQ1RJT04geyAJCQkJCQlcCisJeXlsbG9jLT5maXJzdF9jb2x1bW4gPSB5eWxsb2MtPmxhc3RfY29sdW1uICsgMTsgCQlcCisJeXlsbG9jLT5sYXN0X2NvbHVtbiA9IHl5bGxvYy0+Zmlyc3RfY29sdW1uICsgeXlsZW5nIC0gMTsJXAorfQorCisvKiBBdm9pZCB3YXJuaW5nIHdpdGggbmV3ZXIgZmxleCAqLworI2RlZmluZSBZWV9OT19JTlBVVAorCislfQorCitxc3RyaW5nCQlcIlteXCJcbl0qXCIKKworCislb3B0aW9uIGJpc29uLWJyaWRnZSBiaXNvbi1sb2NhdGlvbnMKKyVvcHRpb24gbm95eXdyYXAKKyVvcHRpb24gbm91bnB1dAorCislJQorCisJLyogVXBkYXRlIHRoZSBsaW5lIGNvdW50ICovCitcbgkJCXsKKwkJCQl5eWxsb2MtPmZpcnN0X2xpbmUrKzsgCisJCQkJeXlsbG9jLT5sYXN0X2xpbmUrKzsgCisJCQkJeXlsbG9jLT5sYXN0X2NvbHVtbj0wOyAKKwkJCX0KKwkgCisJLyogRWF0IGFsbCBzcGFjZXMgYnV0IG5vdCBuZXcgbGluZXMgKi8KKyhbWzpzcGFjZTpdXXstfVtcbl0pKwk7CisJLyogRWF0IGFsbCBjb21tZW50cyAqLworIy4qJAkJCTsKKworCisJLyogUmVjb2duaXplIHF1b3RlZCBzdHJpbmdzICovCit7cXN0cmluZ30JCXsKKwkJCQkvKiBNYXRjaCBhIHF1b3RlZCBzdHJpbmcuICovCisJCQkJQ0hFQ0tfTUFMTE9DX0RPKCB5eWx2YWwtPnN0cmluZyA9IHN0cmR1cCh5eXRleHQrMSksIAorCQkJCXsKKwkJCQkJVFJBQ0VfREVCVUcoSU5GTywgIlVuYWJsZSB0byBjb3B5IHRoZSBzdHJpbmcgJyVzJzogJXMiLCB5eXRleHQsIHN0cmVycm9yKGVycm5vKSk7CisJCQkJCXJldHVybiBMRVhfRVJST1I7IC8qIHRyaWcgYW4gZXJyb3IgaW4geWFjYyBwYXJzZXIgKi8KKwkJCQl9ICk7CisJCQkJeXlsdmFsLT5zdHJpbmdbc3RybGVuKHl5dGV4dCkgLSAyXSA9ICdcMCc7CisJCQkJcmV0dXJuIFFTVFJJTkc7CisJCQl9CisJCisKKwkvKiBSZWNvZ25pemUgYW55IGludGVnZXIgKi8KK1stXT9bWzpkaWdpdDpdXSsJeworCQkJCS8qIENvbnZlcnQgdGhpcyB0byBhbiBpbnRlZ2VyIHZhbHVlICovCisJCQkJaW50IHJldD0wOworCQkJCXJldCA9IHNzY2FuZih5eXRleHQsICIlaSIsICZ5eWx2YWwtPmludGVnZXIpOworCQkJCWlmIChyZXQgIT0gMSkgeworCQkJCQkvKiBObyBtYXRjaGluZzogYW4gZXJyb3Igb2NjdXJyZWQgKi8KKwkJCQkJZmRfbG9nX2RlYnVnKCJVbmFibGUgdG8gY29udmVydCB0aGUgdmFsdWUgJyVzJyB0byBhIHZhbGlkIG51bWJlcjogJXMiLCB5eXRleHQsIHN0cmVycm9yKGVycm5vKSk7CisJCQkJCXJldHVybiBMRVhfRVJST1I7IC8qIHRyaWcgYW4gZXJyb3IgaW4geWFjYyBwYXJzZXIgKi8KKwkJCQkJLyogTWF5YmUgd2UgY291bGQgUkVKRUNUIGluc3RlYWQgb2YgZmFpbGluZyBoZXJlPyAqLworCQkJCX0KKwkJCQlyZXR1cm4gSU5URUdFUjsKKwkJCX0KKwkJCQorCQorCQorCS8qIFRoZSBrZXkgd29yZHMgKi8JCisoP2k6IkFWUCIpCSAJewlyZXR1cm4gQVZQOwl9CisJCQkKKwkvKiBWYWxpZCBzaW5nbGUgY2hhcmFjdGVycyBmb3IgeXlwYXJzZSAqLworWz06OystXQkJCXsgcmV0dXJuIHl5dGV4dFswXTsgfQorCisJLyogVW5yZWNvZ25pemVkIHNlcXVlbmNlLCBpZiBpdCBkaWQgbm90IG1hdGNoIGFueSBwcmV2aW91cyBwYXR0ZXJuICovCitbXls6c3BhY2U6XVwiOj0rO1xuXSsJeyAKKwkJCQlmZF9sb2dfZGVidWcoIlVucmVjb2duaXplZCB0ZXh0IG9uIGxpbmUgJWQgY29sICVkOiAnJXMnLiIsIHl5bGxvYy0+Zmlyc3RfbGluZSwgeXlsbG9jLT5maXJzdF9jb2x1bW4sIHl5dGV4dCk7CisJCQkgCXJldHVybiBMRVhfRVJST1I7IAorCQkJfQorCislJQpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9ydF9lcmVnL3J0ZXJlZ19jb25mLnkgYi9leHRlbnNpb25zL3J0X2VyZWcvcnRlcmVnX2NvbmYueQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjEzMzIzCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9ydF9lcmVnL3J0ZXJlZ19jb25mLnkKQEAgLTAsMCArMSwyMDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDEzLCBXSURFIFByb2plY3QgYW5kIE5JQ1QJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFdJREUgUHJvamVjdCBvciBOSUNUIG5vciB0aGUgCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgV0lERSBQcm9qZWN0IGFuZCAJCQkJCQkgKgorKiAgIE5JQ1QuCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogWWFjYyBleHRlbnNpb24ncyBjb25maWd1cmF0aW9uIHBhcnNlci4KKyAqLworCisvKiBGb3IgZGV2ZWxvcG1lbnQgb25seSA6ICovCislZGVidWcgCislZXJyb3ItdmVyYm9zZQorCisvKiBUaGUgcGFyc2VyIHJlY2VpdmVzIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgZmlsZW5hbWUgYXMgcGFyYW1ldGVyICovCislcGFyc2UtcGFyYW0ge2NoYXIgKiBjb25mZmlsZX0KKworLyogS2VlcCB0cmFjayBvZiBsb2NhdGlvbiAqLworJWxvY2F0aW9ucyAKKyVwdXJlLXBhcnNlcgorCisleworI2luY2x1ZGUgInJ0ZXJlZy5oIgorI2luY2x1ZGUgInJ0ZXJlZ19jb25mLnRhYi5oIgkvKiBiaXNvbiBpcyBub3Qgc21hcnQgZW5vdWdoIHRvIGRlZmluZSB0aGUgWVlMVFlQRSBiZWZvcmUgaW5jbHVkaW5nIHRoaXMgY29kZSwgc28uLi4gKi8KKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbiAqLworaW50IHl5cGFyc2UoY2hhciAqIGNvbmZmaWxlKTsKKworLyogUGFyc2UgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSAqLworaW50IHJ0ZXJlZ19jb25mX2hhbmRsZShjaGFyICogY29uZmZpbGUpCit7CisJZXh0ZXJuIEZJTEUgKiBydGVyZWdfY29uZmluOworCWludCByZXQ7CisJCisJVFJBQ0VfRU5UUlkoIiVwIiwgY29uZmZpbGUpOworCQorCVRSQUNFX0RFQlVHIChGVUxMLCAiUGFyc2luZyBjb25maWd1cmF0aW9uIGZpbGU6ICVzLi4uIiwgY29uZmZpbGUpOworCQorCXJ0ZXJlZ19jb25maW4gPSBmb3Blbihjb25mZmlsZSwgInIiKTsKKwlpZiAocnRlcmVnX2NvbmZpbiA9PSBOVUxMKSB7CisJCXJldCA9IGVycm5vOworCQlmZF9sb2dfZGVidWcoIlVuYWJsZSB0byBvcGVuIGV4dGVuc2lvbiBjb25maWd1cmF0aW9uIGZpbGUgJXMgZm9yIHJlYWRpbmc6ICVzIiwgY29uZmZpbGUsIHN0cmVycm9yKHJldCkpOworCQlUUkFDRV9ERUJVRyAoSU5GTywgIkVycm9yIG9jY3VycmVkLCBtZXNzYWdlIGxvZ2dlZCAtLSBjb25maWd1cmF0aW9uIGZpbGUuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0geXlwYXJzZShjb25mZmlsZSk7CisKKwlmY2xvc2UocnRlcmVnX2NvbmZpbik7CisKKwlpZiAocmV0ICE9IDApIHsKKwkJVFJBQ0VfREVCVUcgKElORk8sICJVbmFibGUgdG8gcGFyc2UgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4iKTsKKwkJcmV0dXJuIEVJTlZBTDsKKwl9IGVsc2UgeworCQlUUkFDRV9ERUJVRyhGVUxMLCAiW3J0LWVyZWddIEFkZGVkICVkIHJ1bGVzIHN1Y2Nlc3NmdWxseS4iLCBydGVyZWdfY29uZi5ydWxlc19uYik7CisJfQorCQorCXJldHVybiAwOworfQorCisvKiBUaGUgTGV4IHBhcnNlciBwcm90b3R5cGUgKi8KK2ludCBydGVyZWdfY29uZmxleChZWVNUWVBFICpsdmFscCwgWVlMVFlQRSAqbGxvY3ApOworCisvKiBGdW5jdGlvbiB0byByZXBvcnQgdGhlIGVycm9ycyAqLwordm9pZCB5eWVycm9yIChZWUxUWVBFICpwbG9jLCBjaGFyICogY29uZmZpbGUsIGNoYXIgY29uc3QgKnMpCit7CisJVFJBQ0VfREVCVUcoSU5GTywgIkVycm9yIGluIGNvbmZpZ3VyYXRpb24gcGFyc2luZyIpOworCQorCWlmIChwbG9jLT5maXJzdF9saW5lICE9IHBsb2MtPmxhc3RfbGluZSkKKwkJZmRfbG9nX2RlYnVnKCIlczolZC4lZC0lZC4lZCA6ICVzIiwgY29uZmZpbGUsIHBsb2MtPmZpcnN0X2xpbmUsIHBsb2MtPmZpcnN0X2NvbHVtbiwgcGxvYy0+bGFzdF9saW5lLCBwbG9jLT5sYXN0X2NvbHVtbiwgcyk7CisJZWxzZSBpZiAocGxvYy0+Zmlyc3RfY29sdW1uICE9IHBsb2MtPmxhc3RfY29sdW1uKQorCQlmZF9sb2dfZGVidWcoIiVzOiVkLiVkLSVkIDogJXMiLCBjb25mZmlsZSwgcGxvYy0+Zmlyc3RfbGluZSwgcGxvYy0+Zmlyc3RfY29sdW1uLCBwbG9jLT5sYXN0X2NvbHVtbiwgcyk7CisJZWxzZQorCQlmZF9sb2dfZGVidWcoIiVzOiVkLiVkIDogJXMiLCBjb25mZmlsZSwgcGxvYy0+Zmlyc3RfbGluZSwgcGxvYy0+Zmlyc3RfY29sdW1uLCBzKTsKK30KKworJX0KKworLyogVmFsdWVzIHJldHVybmVkIGJ5IGxleCBmb3IgdG9rZW4gKi8KKyV1bmlvbiB7CisJY2hhciAJCSpzdHJpbmc7CS8qIFRoZSBzdHJpbmcgaXMgYWxsb2NhdGVkIGJ5IHN0cmR1cCBpbiBsZXguKi8KKwlpbnQJCWludGVnZXI7Cit9CisKKy8qIEluIGNhc2Ugb2YgZXJyb3IgaW4gdGhlIGxleGljYWwgYW5hbHlzaXMgKi8KKyV0b2tlbiAJCUxFWF9FUlJPUgorCisvKiBBIChkZSlxdW90ZWQgc3RyaW5nIChtYWxsb2MnZCBpbiBsZXggcGFyc2VyOyBpdCBtdXN0IGJlIGZyZWVkIGFmdGVyIHVzZSkgKi8KKyV0b2tlbiA8c3RyaW5nPgkgUVNUUklORworJXRva2VuIDxpbnRlZ2VyPiBJTlRFR0VSCisKKy8qIFRva2VucyAqLworJXRva2VuIAkJQVZQCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyUlCisKKwkvKiBUaGUgZ3JhbW1hciBkZWZpbml0aW9uICovCitjb25mZmlsZToJCXJ1bGVzIGF2cCBydWxlcworCQkJOworCQkJCisJLyogYSBzZXJ2ZXIgZW50cnkgKi8KK2F2cDoJCQlBVlAgJz0nIFFTVFJJTkcgJzsnCisJCQl7CisJCQkJaWYgKHJ0ZXJlZ19jb25mLmF2cCAhPSBOVUxMKSB7CisJCQkJCXl5ZXJyb3IoJnl5bGxvYywgY29uZmZpbGUsICJPbmx5IG9uZSBBVlAgY2FuIGJlIHNwZWNpZmllZCIpOworCQkJCQlZWUVSUk9SOworCQkJCX0KKwkJCQkKKwkJCQlDSEVDS19GQ1RfRE8oIGZkX2RpY3Rfc2VhcmNoICggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICQzLCAmcnRlcmVnX2NvbmYuYXZwLCBFTk9FTlQgKSwKKwkJCQkJeworCQkJCQkJVFJBQ0VfREVCVUcoSU5GTywgIlVuYWJsZSB0byBmaW5kICclcycgQVZQIGluIHRoZSBsb2FkZWQgZGljdGlvbmFyaWVzLiIsICQzKTsKKwkJCQkJCXl5ZXJyb3IgKCZ5eWxsb2MsIGNvbmZmaWxlLCAiSW52YWxpZCBBVlAgdmFsdWUuIik7CisJCQkJCQlZWUVSUk9SOworCQkJCQl9ICk7CisJCQkJCisJCQkJLyogTm93IGNoZWNrIHRoZSB0eXBlICovCisJCQkJeworCQkJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhOworCQkJCQlDSEVDS19GQ1QoIGZkX2RpY3RfZ2V0dmFsKCBydGVyZWdfY29uZi5hdnAsICZkYXRhKSApOworCQkJCQlDSEVDS19QQVJBTVNfRE8gKGRhdGEuYXZwX2Jhc2V0eXBlID09IEFWUF9UWVBFX09DVEVUU1RSSU5HLCAKKwkJCQkJCXsKKwkJCQkJCQlUUkFDRV9ERUJVRyhJTkZPLCAiJyVzJyBBVlAgaW4gbm90IGFuIE9DVEVUU1RSSU5HIEFWUCAoJWQpLiIsICQzLCBkYXRhLmF2cF9iYXNldHlwZSk7CisJCQkJCQkJeXllcnJvciAoJnl5bGxvYywgY29uZmZpbGUsICJBVlAgaW4gbm90IGFuIE9DVEVUU1RSSU5HIHR5cGUuIik7CisJCQkJCQkJWVlFUlJPUjsKKwkJCQkJCX0gKTsKKwkJCQl9CisJCQl9CisJCQk7CisJCQkKK3J1bGVzOgkJCS8qIGVtcHR5IE9LICovCisJCQl8IHJ1bGVzIHJ1bGUKKwkJCTsKKwkJCQorcnVsZToJCQlRU1RSSU5HICc6JyBRU1RSSU5HICcrJyAnPScgSU5URUdFUiAnOycKKwkJCXsKKwkJCQlzdHJ1Y3QgcnRlcmVnX3J1bGUgKiBuZXc7CisJCQkJaW50IGVycjsKKwkJCQkKKwkJCQkvKiBBZGQgbmV3IHJ1bGUgaW4gdGhlIGFycmF5ICovCisJCQkJcnRlcmVnX2NvbmYucnVsZXNfbmIgKz0gMTsKKwkJCQlDSEVDS19NQUxMT0NfRE8ocnRlcmVnX2NvbmYucnVsZXMgPSByZWFsbG9jKHJ0ZXJlZ19jb25mLnJ1bGVzLCBydGVyZWdfY29uZi5ydWxlc19uYiAqIHNpemVvZihzdHJ1Y3QgcnRlcmVnX3J1bGUpKSwKKwkJCQkJeworCQkJCQkJeXllcnJvciAoJnl5bGxvYywgY29uZmZpbGUsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBzdG9yZSB0aGUgY29uZmlndXJhdGlvbi4uLiIpOworCQkJCQkJWVlFUlJPUjsKKwkJCQkJfSApOworCQkJCQorCQkJCW5ldyA9ICZydGVyZWdfY29uZi5ydWxlc1tydGVyZWdfY29uZi5ydWxlc19uYiAtIDFdOworCQkJCQorCQkJCW5ldy0+cGF0dGVybiA9ICQxOworCQkJCW5ldy0+c2VydmVyICA9ICQzOworCQkJCW5ldy0+c2NvcmUgICA9ICQ2OworCQkJCQorCQkJCS8qIEF0dGVtcHQgdG8gY29tcGlsZSB0aGUgcmVnZXggKi8KKwkJCQlDSEVDS19GQ1RfRE8oIGVycj1yZWdjb21wKCZuZXctPnByZWcsIG5ldy0+cGF0dGVybiwgUkVHX0VYVEVOREVEIHwgUkVHX05PU1VCKSwKKwkJCQkJeworCQkJCQkJY2hhciAqIGJ1ZjsKKwkJCQkJCXNpemVfdCBibDsKKworCQkJCQkJLyogRXJyb3Igd2hpbGUgY29tcGlsaW5nIHRoZSByZWdleCAqLworCQkJCQkJVFJBQ0VfREVCVUcoSU5GTywgIkVycm9yIHdoaWxlIGNvbXBpbGluZyB0aGUgcmVndWxhciBleHByZXNzaW9uICclcyc6IiwgbmV3LT5wYXR0ZXJuKTsKKworCQkJCQkJLyogR2V0IHRoZSBlcnJvciBtZXNzYWdlIHNpemUgKi8KKwkJCQkJCWJsID0gcmVnZXJyb3IoZXJyLCAmbmV3LT5wcmVnLCBOVUxMLCAwKTsKKworCQkJCQkJLyogQWxsb2MgdGhlIGJ1ZmZlciBmb3IgZXJyb3IgbWVzc2FnZSAqLworCQkJCQkJQ0hFQ0tfTUFMTE9DKCBidWYgPSBtYWxsb2MoYmwpICk7CisKKwkJCQkJCS8qIEdldCB0aGUgZXJyb3IgbWVzc2FnZSBjb250ZW50ICovCisJCQkJCQlyZWdlcnJvcihlcnIsICZuZXctPnByZWcsIGJ1ZiwgYmwpOworCQkJCQkJVFJBQ0VfREVCVUcoSU5GTywgIlx0JXMiLCBidWYpOworCQkJCQkJCisJCQkJCQkvKiBGcmVlIHRoZSBidWZmZXIsIHJldHVybiB0aGUgZXJyb3IgKi8KKwkJCQkJCWZyZWUoYnVmKTsKKwkJCQkJCQorCQkJCQkJeXllcnJvciAoJnl5bGxvYywgY29uZmZpbGUsICJJbnZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbi4iKTsKKwkJCQkJCVlZRVJST1I7CisJCQkJCX0gKTsKKwkJCX0KKwkJCTsKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvcnRfaWdub3JlX2RoL0NNYWtlTGlzdHMudHh0IGIvZXh0ZW5zaW9ucy9ydF9pZ25vcmVfZGgvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA3MTdiOQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvcnRfaWdub3JlX2RoL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMjAgQEAKKyMgVGhlIHJ0X2lnbm9yZV9kaCBleHRlbnNpb24KK1BST0pFQ1QoIlJvdXRpbmcgZXh0ZW5zaW9uIHRoYXQgcmVtb3ZlcyBEZXN0aW5hdGlvbi1Ib3N0IGZyb20gbWVzc2FnZXMgYW5kIHJlc3RvcmVzIGZyb20gUHJveHktSW5mbyBmb3IgYW5zd2VycyIgQykKKworIyBMaXN0IG9mIHNvdXJjZSBmaWxlcworU0VUKFJUX0lHTk9SRV9ESF9TUkMKKwlydF9pZ25vcmVfZGguYworKQorCitJTkNMVURFX0RJUkVDVE9SSUVTKCR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfSkKKworIyBDb21waWxlIHRoZXNlIGZpbGVzIGFzIGEgZnJlZURpYW1ldGVyIGV4dGVuc2lvbgorRkRfQUREX0VYVEVOU0lPTihydF9pZ25vcmVfZGggJHtSVF9JR05PUkVfREhfU1JDfSkKKworIyMjIworIyMgSU5TVEFMTCBzZWN0aW9uICMjCisKKyMgV2UgaW5zdGFsbCB3aXRoIHRoZSBkYWVtb24gY29tcG9uZW50IGJlY2F1c2UgaXQgaXMgYSBiYXNlIGZlYXR1cmUuCitJTlNUQUxMKFRBUkdFVFMgcnRfaWdub3JlX2RoCisJTElCUkFSWSBERVNUSU5BVElPTiAke0lOU1RBTExfRVhURU5TSU9OU19TVUZGSVh9CisJQ09NUE9ORU5UIGZyZWVEaWFtZXRlci1kYWVtb24pCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL3J0X2lnbm9yZV9kaC9ydF9pZ25vcmVfZGguYyBiL2V4dGVuc2lvbnMvcnRfaWdub3JlX2RoL3J0X2lnbm9yZV9kaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczODVmZWYKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL3J0X2lnbm9yZV9kaC9ydF9pZ25vcmVfZGguYwpAQCAtMCwwICsxLDIxNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFRob21hcyBLbGF1c25lciA8dGtAZ2lnYS5vci5hdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTMsIFRob21hcyBLbGF1c25lciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBXcml0dGVuIHVuZGVyIGNvbnRyYWN0IGJ5IG5mb3RleCBJVCBHbWJILCBodHRwOi8vbmZvdGV4LmNvbS8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAgICAgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgICAgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8ZnJlZURpYW1ldGVyL2V4dGVuc2lvbi5oPgorCisvKiAKKyAqIFJlbW92ZSBEZXN0aW5hdGlvbi1Ib3N0cywgcHV0dGluZyBpdCBpbnRvIFByb3h5LUluZm8sIGFuZCByZXN0b3JlIGl0IHRvCisgKiBPcmlnaW4tSG9zdCBmb3IgYW5zd2Vycy4KKyAqLworCitzdHJ1Y3QgZGljdF9vYmplY3QgKiBkaF9hdnBfZG87IC8qIGNhY2hlIHRoZSBEZXN0aW5hdGlvbi1Ib3N0IGRpY3Rpb25hcnkgb2JqZWN0ICovCitzdHJ1Y3QgZGljdF9vYmplY3QgKiBvaF9hdnBfZG87IC8qIGNhY2hlIHRoZSBPcmlnaW4tSG9zdCBkaWN0aW9uYXJ5IG9iamVjdCAqLworc3RydWN0IGRpY3Rfb2JqZWN0ICogcGhfYXZwX2RvOyAvKiBjYWNoZSB0aGUgUHJveHktSG9zdCBkaWN0aW9uYXJ5IG9iamVjdCAqLworc3RydWN0IGRpY3Rfb2JqZWN0ICogcGlfYXZwX2RvOyAvKiBjYWNoZSB0aGUgUHJveHktSW5mbyBkaWN0aW9uYXJ5IG9iamVjdCAqLworc3RydWN0IGRpY3Rfb2JqZWN0ICogcHNfYXZwX2RvOyAvKiBjYWNoZSB0aGUgUHJveHktU3RhdGUgZGljdGlvbmFyeSBvYmplY3QgKi8KKworc3RhdGljIGludCByZXN0b3JlX29yaWdpbl9ob3N0KHN0cnVjdCBtc2cgKiptc2cpIHsKKwlzdHJ1Y3QgYXZwICphdnAsICpjaGlsZDsKKwlzdHJ1Y3QgYXZwICpvaF9hdnAgPSBOVUxMOworCXN0cnVjdCBhdnAgKnBpX2F2cCA9IE5VTEw7CisJdm9pZCAqcHMsICpuZXdfb2g7CisJc2l6ZV90IHBzX2xlbiwgbmV3X29oX2xlbiA9IDA7CisJdW5pb24gYXZwX3ZhbHVlIHZhbDsKKworCXBzID0gbmV3X29oID0gTlVMTDsKKworCUNIRUNLX0ZDVChmZF9tc2dfYnJvd3NlKCptc2csIE1TR19CUldfRklSU1RfQ0hJTEQsICZhdnAsIE5VTEwpKTsKKwkvKiBsb29rIGZvciBPcmlnaW4tSG9zdCBhbmQgUHJveHktSW5mbyBtYXRjaGluZyB0aGlzIGhvc3QgKi8KKwl3aGlsZSAoYXZwICYmICghb2hfYXZwIHx8ICFwaV9hdnApKSB7CisJCXN0cnVjdCBhdnBfaGRyICogYWhkcjsKKwkJaW50IG1hdGNoID0gMDsKKwkJCisJCUNIRUNLX0ZDVChmZF9tc2dfYXZwX2hkcihhdnAsICZhaGRyKSk7CisJCWlmICghKGFoZHItPmF2cF9mbGFncyAmIEFWUF9GTEFHX1ZFTkRPUikpIHsKKwkJCXN3aXRjaCAoYWhkci0+YXZwX2NvZGUpIHsKKwkJCWNhc2UgQUNfT1JJR0lOX0hPU1Q6CisJCQkJb2hfYXZwID0gYXZwOworCQkJCUNIRUNLX0ZDVChmZF9tc2dfcGFyc2VfZGljdChvaF9hdnAsIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgTlVMTCkpOworCQkJCWJyZWFrOworCQkJY2FzZSBBQ19QUk9YWV9JTkZPOgorCQkJCXBzID0gTlVMTDsKKwkJCQlwc19sZW4gPSAwOworCQkJCUNIRUNLX0ZDVChmZF9tc2dfcGFyc2VfZGljdChhdnAsIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgTlVMTCkpOworCQkJCUNIRUNLX0ZDVChmZF9tc2dfYnJvd3NlKGF2cCwgTVNHX0JSV19GSVJTVF9DSElMRCwgJmNoaWxkLCBOVUxMKSk7CisJCQkJd2hpbGUgKGNoaWxkICYmICghbWF0Y2ggfHwgIXBzKSkgeworCQkJCQlzdHJ1Y3QgYXZwX2hkciAqY2hkcjsKKwkJCQkJQ0hFQ0tfRkNUKGZkX21zZ19hdnBfaGRyKGNoaWxkLCAmY2hkcikpOworCQkJCQlpZiAoIShjaGRyLT5hdnBfZmxhZ3MgJiBBVlBfRkxBR19WRU5ET1IpKSB7CisJCQkJCQlzd2l0Y2ggKGNoZHItPmF2cF9jb2RlKSB7CisJCQkJCQljYXNlIEFDX1BST1hZX0hPU1Q6CisJCQkJCQkJaWYgKGZkX29zX2NtcChjaGRyLT5hdnBfdmFsdWUtPm9zLmRhdGEsIGNoZHItPmF2cF92YWx1ZS0+b3MubGVuLCAKKwkJCQkJCQkJICAgICAgZmRfZ19jb25maWctPmNuZl9kaWFtaWQsIGZkX2dfY29uZmlnLT5jbmZfZGlhbWlkX2xlbikgPT0gMCkgeworCQkJCQkJCQltYXRjaCA9IDE7CisJCQkJCQkJfQorCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBBQ19QUk9YWV9TVEFURToKKwkJCQkJCQlwcyA9IGNoZHItPmF2cF92YWx1ZS0+b3MuZGF0YTsKKwkJCQkJCQlwc19sZW4gPSBjaGRyLT5hdnBfdmFsdWUtPm9zLmxlbjsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJQ0hFQ0tfRkNUKGZkX21zZ19icm93c2UoY2hpbGQsIE1TR19CUldfTkVYVCwgJmNoaWxkLCBOVUxMKSk7CisJCQkJfQorCQkJCWlmIChtYXRjaCAmJiBwcykgeworCQkJCQluZXdfb2ggPSBwczsKKwkJCQkJbmV3X29oX2xlbiA9IHBzX2xlbjsKKwkJCQkJcGlfYXZwID0gYXZwOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJQ0hFQ0tfRkNUKGZkX21zZ19icm93c2UoYXZwLCBNU0dfQlJXX05FWFQsICZhdnAsIE5VTEwpKTsKKwl9CisJaWYgKCFwaV9hdnApCisJCXJldHVybiAwOworCisJbWVtc2V0KCZ2YWwsIDAsIHNpemVvZih2YWwpKTsKKwl2YWwub3MuZGF0YSA9IG5ld19vaDsKKwl2YWwub3MubGVuID0gbmV3X29oX2xlbjsKKwlpZiAoIW9oX2F2cCkgeworCQlUUkFDRV9FUlJPUigiTWVzc2FnZSBjb250YWluZWQgbm8gT3JpZ2luLUhvc3QiKTsKKwl9IGVsc2UgeworCQlDSEVDS19GQ1QoZmRfbXNnX2F2cF9zZXR2YWx1ZShvaF9hdnAsICZ2YWwpKTsKKwl9CisJZmRfbXNnX2ZyZWUoKG1zZ19vcl9hdnAqKXBpX2F2cCk7CisKKwlmZF9sb2dfZGVidWcoIlJlc3RvcmVkIE9yaWdpbi1Ib3N0ICclLipzJyBmcm9tIFByb3h5LUluZm8iLCAoaW50KW5ld19vaF9sZW4sIChjaGFyICopbmV3X29oKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdG93X2Rlc3RpbmF0aW9uX2hvc3Qoc3RydWN0IG1zZyAqKm1zZykgeworCXN0cnVjdCBhdnAgKiBhdnAgPSBOVUxMOworCXN0cnVjdCBhdnAgKiBwaF9hdnAgPSBOVUxMOworCXN0cnVjdCBhdnAgKiBwaV9hdnAgPSBOVUxMOworCXN0cnVjdCBhdnAgKiBwc19hdnAgPSBOVUxMOworCisJLyogTG9vayBmb3IgdGhlIERlc3RpbmF0aW9uLUhvc3QgQVZQIGluIHRoZSBtZXNzYWdlICovCisJQ0hFQ0tfRkNUKGZkX21zZ19zZWFyY2hfYXZwKCptc2csIGRoX2F2cF9kbywgJmF2cCkpOworCWlmIChhdnAgIT0gTlVMTCkgeworCQlzdHJ1Y3QgYXZwX2hkciAqIGFoZHIgPSBOVUxMOworCQl1bmlvbiBhdnBfdmFsdWUgdmFsOworCisJCUNIRUNLX0ZDVChmZF9tc2dfYXZwX2hkcihhdnAsICZhaGRyKSk7CisJCWlmIChhaGRyLT5hdnBfdmFsdWUgIT0gTlVMTCkgeworCQkJLyogYWRkIFByb3h5LUluZm8tPntQcm94eS1Ib3N0LCBQcm94eS1TdGF0ZX0gdXNpbmcgRGVzdGluYXRpb24tSG9zdCBpbmZvcm1hdGlvbiAqLworCQkJQ0hFQ0tfRkNUKGZkX21zZ19hdnBfbmV3KHBoX2F2cF9kbywgMCwgJnBoX2F2cCkpOworCQkJbWVtc2V0KCZ2YWwsIDAsIHNpemVvZih2YWwpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC5vcy5kYXRhID0gKHVpbnQ4X3QgKikoZmRfZ19jb25maWctPmNuZl9kaWFtaWQpOworCQkJdmFsLm9zLmxlbiA9IGZkX2dfY29uZmlnLT5jbmZfZGlhbWlkX2xlbjsKKwkJCUNIRUNLX0ZDVChmZF9tc2dfYXZwX3NldHZhbHVlKHBoX2F2cCwgJnZhbCkpOworCisJCQlDSEVDS19GQ1QoZmRfbXNnX2F2cF9uZXcocHNfYXZwX2RvLCAwLCAmcHNfYXZwKSk7CisJCQltZW1zZXQoJnZhbCwgMCwgc2l6ZW9mKHZhbCkpOworCQkJdmFsLm9zLmRhdGEgPSBhaGRyLT5hdnBfdmFsdWUtPm9zLmRhdGE7CisJCQl2YWwub3MubGVuID0gYWhkci0+YXZwX3ZhbHVlLT5vcy5sZW47CisJCQlDSEVDS19GQ1QoZmRfbXNnX2F2cF9zZXR2YWx1ZShwc19hdnAsICZ2YWwpKTsKKworCQkJQ0hFQ0tfRkNUKGZkX21zZ19hdnBfbmV3KHBpX2F2cF9kbywgMCwgJnBpX2F2cCkpOworCQkJQ0hFQ0tfRkNUKGZkX21zZ19hdnBfYWRkKHBpX2F2cCwgTVNHX0JSV19MQVNUX0NISUxELCBwaF9hdnApKTsKKwkJCUNIRUNLX0ZDVChmZF9tc2dfYXZwX2FkZChwaV9hdnAsIE1TR19CUldfTEFTVF9DSElMRCwgcHNfYXZwKSk7CisKKwkJCS8qIHJlbW92ZSBEZXN0aW5hdGlvbi1Ib3N0IGZyb20gbWVzc2FnZSAqLworCQkJZmRfbXNnX2ZyZWUoKG1zZ19vcl9hdnAqKWF2cCk7CisJCQkvKiBhZGQgUHJveHktSW5mbyAqLworCQkJQ0hFQ0tfRkNUKGZkX21zZ19hdnBfYWRkKCptc2csIE1TR19CUldfTEFTVF9DSElMRCwgcGlfYXZwKSk7CisJCQlmZF9sb2dfZGVidWcoIlN0b3dlZCBEZXN0aW5hdGlvbi1Ib3N0ICclLipzJyBpbnRvIFByb3h5LUluZm8iLCAoaW50KXZhbC5vcy5sZW4sIChjb25zdCBjaGFyICopdmFsLm9zLmRhdGEpOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIFRoZSBjYWxsYmFjayBmb3IgcHV0dGluZyBEZXN0aW5hdGlvbi1Ib3N0IGludG8gUHJveHktSW5mbyBhbmQgcmVzdG9yaW5nIGl0IG9uIHRoZSB3YXkgYmFjayAqLworc3RhdGljIGludCBydF9pZ25vcmVfZGVzdGluYXRpb25faG9zdCh2b2lkICogY2JkYXRhLCBzdHJ1Y3QgbXNnICoqbXNnKSB7CisJc3RydWN0IG1zZ19oZHIgKiBoZHI7CisJaW50IHJldDsKKworCVRSQUNFX0VOVFJZKCIlcCAlcCIsIGNiZGF0YSwgbXNnKTsKKworCUNIRUNLX1BBUkFNUyhtc2cgJiYgKm1zZyk7CisKKwkvKiBSZWFkIHRoZSBtZXNzYWdlIGhlYWRlciAqLworCUNIRUNLX0ZDVChmZF9tc2dfaGRyKCptc2csICZoZHIpKTsKKwlpZiAoaGRyLT5tc2dfZmxhZ3MgJiBDTURfRkxBR19SRVFVRVNUKSB7CisJCXJldCA9IHN0b3dfZGVzdGluYXRpb25faG9zdChtc2cpOworCX0gZWxzZSB7CisJCXJldCA9IHJlc3RvcmVfb3JpZ2luX2hvc3QobXNnKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBoYW5kbGVyICovCitzdGF0aWMgc3RydWN0IGZkX3J0X2Z3ZF9oZGwgKiBydF9pZ25vcmVfZGVzdGluYXRpb25faG9zdF9oZGwgPSBOVUxMOworCisvKiBlbnRyeSBwb2ludCAqLworc3RhdGljIGludCBydF9pZ25vcmVfZGVzdGluYXRpb25faG9zdF9lbnRyeShjaGFyICogY29uZmZpbGUpCit7CisJQ0hFQ0tfRkNUX0RPKGZkX2RpY3Rfc2VhcmNoKGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiRGVzdGluYXRpb24tSG9zdCIsICZkaF9hdnBfZG8sIEVOT0VOVCksCisJCSAgICAgeyBUUkFDRV9FUlJPUigiVW5hYmxlIHRvIGZpbmQgJ0Rlc3RpbmF0aW9uLUhvc3QnIEFWUCBpbiB0aGUgbG9hZGVkIGRpY3Rpb25hcmllcy4iKTsgfSk7CisJQ0hFQ0tfRkNUX0RPKGZkX2RpY3Rfc2VhcmNoKGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiT3JpZ2luLUhvc3QiLCAmb2hfYXZwX2RvLCBFTk9FTlQpLAorCQkgICAgIHsgVFJBQ0VfRVJST1IoIlVuYWJsZSB0byBmaW5kICdPcmlnaW4tSG9zdCcgQVZQIGluIHRoZSBsb2FkZWQgZGljdGlvbmFyaWVzLiIpOyB9KTsKKwlDSEVDS19GQ1RfRE8oZmRfZGljdF9zZWFyY2goZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJQcm94eS1Ib3N0IiwgJnBoX2F2cF9kbywgRU5PRU5UKSwKKwkJICAgICB7IFRSQUNFX0VSUk9SKCJVbmFibGUgdG8gZmluZCAnUHJveHktSG9zdCcgQVZQIGluIHRoZSBsb2FkZWQgZGljdGlvbmFyaWVzLiIpOyB9KTsKKwlDSEVDS19GQ1RfRE8oZmRfZGljdF9zZWFyY2goZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJQcm94eS1JbmZvIiwgJnBpX2F2cF9kbywgRU5PRU5UKSwKKwkJICAgICB7IFRSQUNFX0VSUk9SKCJVbmFibGUgdG8gZmluZCAnUHJveHktSW5mbycgQVZQIGluIHRoZSBsb2FkZWQgZGljdGlvbmFyaWVzLiIpOyB9KTsKKwlDSEVDS19GQ1RfRE8oZmRfZGljdF9zZWFyY2goZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJQcm94eS1TdGF0ZSIsICZwc19hdnBfZG8sIEVOT0VOVCksCisJCSAgICAgeyBUUkFDRV9FUlJPUigiVW5hYmxlIHRvIGZpbmQgJ1Byb3h5LVN0YXRlJyBBVlAgaW4gdGhlIGxvYWRlZCBkaWN0aW9uYXJpZXMuIik7IH0pOworCisJLyogUmVnaXN0ZXIgdGhlIGNhbGxiYWNrICovCisJQ0hFQ0tfRkNUKGZkX3J0X2Z3ZF9yZWdpc3RlcihydF9pZ25vcmVfZGVzdGluYXRpb25faG9zdCwgTlVMTCwgUlRfRldEX0FMTCwgJnJ0X2lnbm9yZV9kZXN0aW5hdGlvbl9ob3N0X2hkbCkpOworCisJVFJBQ0VfREVCVUcoSU5GTywgIkV4dGVuc2lvbiAnSWdub3JlIERlc3RpbmF0aW9uIEhvc3QnIGluaXRpYWxpemVkIik7CisJcmV0dXJuIDA7Cit9CisKKy8qIFVubG9hZCAqLwordm9pZCBmZF9leHRfZmluaSh2b2lkKQoreworCS8qIFVucmVnaXN0ZXIgdGhlIGNhbGxiYWNrcyAqLworCUNIRUNLX0ZDVF9ETyhmZF9ydF9md2RfdW5yZWdpc3RlcihydF9pZ25vcmVfZGVzdGluYXRpb25faG9zdF9oZGwsIE5VTEwpLCAvKiBjb250aW51ZSAqLyk7CisJcmV0dXJuIDsKK30KKworRVhURU5TSU9OX0VOVFJZKCJydF9pZ25vcmVfZGVzdGluYXRpb25faG9zdCIsIHJ0X2lnbm9yZV9kZXN0aW5hdGlvbl9ob3N0X2VudHJ5KTsKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvcnRfbG9hZF9iYWxhbmNlL0NNYWtlTGlzdHMudHh0IGIvZXh0ZW5zaW9ucy9ydF9sb2FkX2JhbGFuY2UvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVjNDkxZQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvcnRfbG9hZF9iYWxhbmNlL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMjAgQEAKKyMgVGhlIHJ0X2xvYWRfYmFsYW5jZSBleHRlbnNpb24KK1BST0pFQ1QoIlJvdXRpbmcgZXh0ZW5zaW9uIHNwbGl0cyByZXF1ZXN0cyBldmVubHkgb3ZlciBtdWx0aXBsZSBob3N0cywgdXNpbmcgY3VycmVudCBsb2FkIGFzIHJvdXRpbmcgaW5kaWNhdG9yIiBDKQorCisjIExpc3Qgb2Ygc291cmNlIGZpbGVzCitTRVQoUlRfTE9BRF9CQUxBTkNFX1NSQworCXJ0X2xvYWRfYmFsYW5jZS5jCispCisKK0lOQ0xVREVfRElSRUNUT1JJRVMoJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9KQorCisjIENvbXBpbGUgdGhlc2UgZmlsZXMgYXMgYSBmcmVlRGlhbWV0ZXIgZXh0ZW5zaW9uCitGRF9BRERfRVhURU5TSU9OKHJ0X2xvYWRfYmFsYW5jZSAke1JUX0xPQURfQkFMQU5DRV9TUkN9KQorCisjIyMjCisjIyBJTlNUQUxMIHNlY3Rpb24gIyMKKworIyBXZSBpbnN0YWxsIHdpdGggdGhlIGRhZW1vbiBjb21wb25lbnQgYmVjYXVzZSBpdCBpcyBhIGJhc2UgZmVhdHVyZS4KK0lOU1RBTEwoVEFSR0VUUyBydF9sb2FkX2JhbGFuY2UKKwlMSUJSQVJZIERFU1RJTkFUSU9OICR7SU5TVEFMTF9FWFRFTlNJT05TX1NVRkZJWH0KKwlDT01QT05FTlQgZnJlZURpYW1ldGVyLWRhZW1vbikKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvcnRfbG9hZF9iYWxhbmNlL3J0X2xvYWRfYmFsYW5jZS5jIGIvZXh0ZW5zaW9ucy9ydF9sb2FkX2JhbGFuY2UvcnRfbG9hZF9iYWxhbmNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg4M2E2NwotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvcnRfbG9hZF9iYWxhbmNlL3J0X2xvYWRfYmFsYW5jZS5jCkBAIC0wLDAgKzEsMTAwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogVGhvbWFzIEtsYXVzbmVyIDx0a0BnaWdhLm9yLmF0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIENvcHlyaWdodCAoYykgMjAxMywgMjAxNCBUaG9tYXMgS2xhdXNuZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIFdyaXR0ZW4gdW5kZXIgY29udHJhY3QgYnkgbmZvdGV4IElUIEdtYkgsIGh0dHA6Ly9uZm90ZXguY29tLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UICAgICAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAgICAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxmcmVlRGlhbWV0ZXIvZXh0ZW5zaW9uLmg+CisKKy8qCisgKiBMb2FkIGJhbGFuY2luZyBleHRlbnNpb24uIFNlbmQgcmVxdWVzdCB0byBsZWFzdC1sb2FkZWQgbm9kZS4KKyAqLworCisvKiBUaGUgY2FsbGJhY2sgZm9yIGxvYWQgYmFsYW5jaW5nIHRoZSByZXF1ZXN0cyBhY3Jvc3MgdGhlIHBlZXJzICovCitzdGF0aWMgaW50IHJ0X2xvYWRfYmFsYW5jaW5nKHZvaWQgKiBjYmRhdGEsIHN0cnVjdCBtc2cgKiogcG1zZywgc3RydWN0IGZkX2xpc3QgKiBjYW5kaWRhdGVzKQoreworCXN0cnVjdCBmZF9saXN0ICpsaWM7CisJc3RydWN0IG1zZyAqIG1zZyA9ICpwbXNnOworCQorCVRSQUNFX0VOVFJZKCIlcCAlcCAlcCIsIGNiZGF0YSwgbXNnLCBjYW5kaWRhdGVzKTsKKwkKKwlDSEVDS19QQVJBTVMobXNnICYmIGNhbmRpZGF0ZXMpOworCQorCS8qIENoZWNrIGlmIGl0IGlzIHdvcnRoIHByb2Nlc3NpbmcgdGhlIG1lc3NhZ2UgKi8KKwlpZiAoRkRfSVNfTElTVF9FTVBUWShjYW5kaWRhdGVzKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBsb2FkIGJhbGFuY2luZyAqLworCWZvciAobGljID0gY2FuZGlkYXRlcy0+bmV4dDsgbGljICE9IGNhbmRpZGF0ZXM7IGxpYyA9IGxpYy0+bmV4dCkgeworCQlzdHJ1Y3QgcnRkX2NhbmRpZGF0ZSAqIGNhbmQgPSAoc3RydWN0IHJ0ZF9jYW5kaWRhdGUgKikgbGljOworCQlzdHJ1Y3QgcGVlcl9oZHIgKnBlZXI7CisJCWxvbmcgdG9fcmVjZWl2ZSwgdG9fc2VuZCwgbG9hZDsKKwkJaW50IHNjb3JlOworCQlDSEVDS19GQ1QoZmRfcGVlcl9nZXRieWlkKGNhbmQtPmRpYW1pZCwgY2FuZC0+ZGlhbWlkbGVuLCAwLCAmcGVlcikpOworCQlDSEVDS19GQ1QoZmRfcGVlcl9nZXRfbG9hZF9wZW5kaW5nKHBlZXIsICZ0b19yZWNlaXZlLCAmdG9fc2VuZCkpOworICAgICAgICAgICAgICAgIGxvYWQgPSB0b19yZWNlaXZlICsgdG9fc2VuZDsKKwkJLyogb3RoZXIgcm91dGluZyBtZWNoYW5pc21zIG5lZWQgdG8gYWRkIHRvIHRoZQorCQkgKiBhcHByb3ByaWF0ZSBlbnRyaWVzIHNvIHRoZWlyIGJhc2UgdmFsdWUgaXMgaGlnaAorCQkgKiBlbm91Z2ggdGhhdCB0aGV5IGFyZSBjb25zaWRlcmVkICovCisKKwkJLyogbG9nYXJpdGhtaWMgc2NhbGluZyAqLworICAgICAgICAgICAgICAgIGludCBsb2FkX2xvZyA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKGxvYWQgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGxvYWRfbG9nKys7CisgICAgICAgICAgICAgICAgICAgIGxvYWQgLz0gMjsKKyAgICAgICAgICAgICAgICB9CisJCXNjb3JlID0gY2FuZC0+c2NvcmU7CisJCWNhbmQtPnNjb3JlIC09IGxvYWRfbG9nOworCQlUUkFDRV9ERUJVRyhGVUxMLCAiZXZhbHVhdGVkIHBlZXIgYCUuKnMnLCBzY29yZSB3YXMgJWQsIG5vdyAlZCIsIChpbnQpY2FuZC0+ZGlhbWlkbGVuLCBjYW5kLT5kaWFtaWQsIHNjb3JlLCBjYW5kLT5zY29yZSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIGhhbmRsZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgZmRfcnRfb3V0X2hkbCAqIHJ0X2xvYWRfYmFsYW5jaW5nX2hkbCA9IE5VTEw7CisKKy8qIGVudHJ5IHBvaW50ICovCitzdGF0aWMgaW50IHJ0X2xvYWRfYmFsYW5jZV9lbnRyeShjaGFyICogY29uZmZpbGUpCit7CisJLyogUmVnaXN0ZXIgdGhlIGNhbGxiYWNrICovCisJQ0hFQ0tfRkNUKGZkX3J0X291dF9yZWdpc3RlcihydF9sb2FkX2JhbGFuY2luZywgTlVMTCwgMTAsICZydF9sb2FkX2JhbGFuY2luZ19oZGwpKTsKKworCVRSQUNFX0RFQlVHKElORk8sICJFeHRlbnNpb24gJ0xvYWQgQmFsYW5jaW5nJyBpbml0aWFsaXplZCIpOworCXJldHVybiAwOworfQorCisvKiBVbmxvYWQgKi8KK3ZvaWQgZmRfZXh0X2Zpbmkodm9pZCkKK3sKKwkvKiBVbnJlZ2lzdGVyIHRoZSBjYWxsYmFja3MgKi8KKwlDSEVDS19GQ1RfRE8oZmRfcnRfb3V0X3VucmVnaXN0ZXIocnRfbG9hZF9iYWxhbmNpbmdfaGRsLCBOVUxMKSwgLyogY29udGludWUgKi8pOworCXJldHVybiA7Cit9CisKK0VYVEVOU0lPTl9FTlRSWSgicnRfbG9hZF9iYWxhbmNlIiwgcnRfbG9hZF9iYWxhbmNlX2VudHJ5KTsKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvcnRfcmFuZG9taXplL0NNYWtlTGlzdHMudHh0IGIvZXh0ZW5zaW9ucy9ydF9yYW5kb21pemUvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNjN2I4NAotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvcnRfcmFuZG9taXplL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMjAgQEAKKyMgVGhlIHJ0X3JhbmRvbWl6ZSBleHRlbnNpb24KK1BST0pFQ1QoIlJvdXRpbmcgZXh0ZW5zaW9uIHJhbmRvbWx5IGluY3JlYXNlcyB0aGUgcm91dGluZyBjb3VudCBmb3Igb25lIG9mIHRoZSBoaWdoZXN0LXJhdGVkIGhvc3RzLCBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgb25lcyIgQykKKworIyBMaXN0IG9mIHNvdXJjZSBmaWxlcworU0VUKFJUX1JBTkRPTUlaRV9TUkMKKwlydF9yYW5kb21pemUuYworKQorCitJTkNMVURFX0RJUkVDVE9SSUVTKCR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfSkKKworIyBDb21waWxlIHRoZXNlIGZpbGVzIGFzIGEgZnJlZURpYW1ldGVyIGV4dGVuc2lvbgorRkRfQUREX0VYVEVOU0lPTihydF9yYW5kb21pemUgJHtSVF9SQU5ET01JWkVfU1JDfSkKKworIyMjIworIyMgSU5TVEFMTCBzZWN0aW9uICMjCisKKyMgV2UgaW5zdGFsbCB3aXRoIHRoZSBkYWVtb24gY29tcG9uZW50IGJlY2F1c2UgaXQgaXMgYSBiYXNlIGZlYXR1cmUuCitJTlNUQUxMKFRBUkdFVFMgcnRfcmFuZG9taXplCisJTElCUkFSWSBERVNUSU5BVElPTiAke0lOU1RBTExfRVhURU5TSU9OU19TVUZGSVh9CisJQ09NUE9ORU5UIGZyZWVEaWFtZXRlci1kYWVtb24pCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL3J0X3JhbmRvbWl6ZS9ydF9yYW5kb21pemUuYyBiL2V4dGVuc2lvbnMvcnRfcmFuZG9taXplL3J0X3JhbmRvbWl6ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MDY0NTEKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL3J0X3JhbmRvbWl6ZS9ydF9yYW5kb21pemUuYwpAQCAtMCwwICsxLDExMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFRob21hcyBLbGF1c25lciA8dGtAZ2lnYS5vci5hdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTQgVGhvbWFzIEtsYXVzbmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBXcml0dGVuIHVuZGVyIGNvbnRyYWN0IGJ5IG5mb3RleCBJVCBHbWJILCBodHRwOi8vbmZvdGV4LmNvbS8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAgICAgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgICAgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8ZnJlZURpYW1ldGVyL2V4dGVuc2lvbi5oPgorCisvKgorICogTG9hZCBiYWxhbmNpbmcgZXh0ZW5zaW9uLiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgaGlnaGVzdC1yYXRlZCBob3N0cyB3aXRoIHRoZSBzYW1lIHNjb3JlLAorICogcmFuZG9tbHkgaW5jcmVhc2UgdGhlIHNjb3JlIG9mIG9uZSBvZiB0aGVtLgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworc3RhdGljIHVuc2lnbmVkIGludCBzZWVkOworCitzdGF0aWMgaW50IHJ0X3JhbmRvbWl6aW5nKHZvaWQgKiBjYmRhdGEsIHN0cnVjdCBtc2cgKiogcG1zZywgc3RydWN0IGZkX2xpc3QgKiBjYW5kaWRhdGVzKQoreworCXN0cnVjdCBmZF9saXN0ICpsaWM7CisJc3RydWN0IG1zZyAqIG1zZyA9ICpwbXNnOworCWludCBtYXhfc2NvcmUgPSAtMTsKKwlpbnQgbWF4X3Njb3JlX2NvdW50ID0gMDsKKwkKKwlUUkFDRV9FTlRSWSgiJXAgJXAgJXAiLCBjYmRhdGEsIG1zZywgY2FuZGlkYXRlcyk7CisJCisJQ0hFQ0tfUEFSQU1TKG1zZyAmJiBjYW5kaWRhdGVzKTsKKwkKKwkvKiBDaGVjayBpZiBpdCBpcyB3b3J0aCBwcm9jZXNzaW5nIHRoZSBtZXNzYWdlICovCisJaWYgKEZEX0lTX0xJU1RfRU1QVFkoY2FuZGlkYXRlcykpCisJCXJldHVybiAwOworCisJLyogZmluZCBvdXQgbWF4aW1hbCBzY29yZSBhbmQgaG93IG1hbnkgY2FuZGlkYXRlcyBoYXZlIGl0ICovCisJZm9yIChsaWMgPSBjYW5kaWRhdGVzLT5uZXh0OyBsaWMgIT0gY2FuZGlkYXRlczsgbGljID0gbGljLT5uZXh0KSB7CisJCXN0cnVjdCBydGRfY2FuZGlkYXRlICogY2FuZCA9IChzdHJ1Y3QgcnRkX2NhbmRpZGF0ZSAqKSBsaWM7CisJCWlmIChtYXhfc2NvcmUgPCBjYW5kLT5zY29yZSkgeworCQkJbWF4X3Njb3JlID0gY2FuZC0+c2NvcmU7CisJCQltYXhfc2NvcmVfY291bnQgPSAxOworCQl9CisJCWVsc2UgaWYgKGNhbmQtPnNjb3JlID09IG1heF9zY29yZSkgeworCQkJbWF4X3Njb3JlX2NvdW50Kys7CisJCX0KKwl9CisKKwkvKiBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHdpdGggcG9zaXRpdmUgc2NvcmUsIHJhbmRvbWx5IGluY3JlYXNlIG9uZSBvZiB0aGVpciBzY29yZXMgYnkgb25lICovCisJaWYgKG1heF9zY29yZSA+PSAwICYmIG1heF9zY29yZV9jb3VudCA+IDEpIHsKKwkJaW50IGx1Y2t5X2NhbmRpZGF0ZSA9IHJhbmRfcigmc2VlZCkgJSBtYXhfc2NvcmVfY291bnQ7CisJCWludCBpID0gMDsKKworCQlmb3IgKGxpYyA9IGNhbmRpZGF0ZXMtPm5leHQ7IGxpYyAhPSBjYW5kaWRhdGVzOyBsaWMgPSBsaWMtPm5leHQpIHsKKwkJCXN0cnVjdCBydGRfY2FuZGlkYXRlICogY2FuZCA9IChzdHJ1Y3QgcnRkX2NhbmRpZGF0ZSAqKSBsaWM7CisJCQlpZiAoY2FuZC0+c2NvcmUgPT0gbWF4X3Njb3JlKSB7CisJCQkJaWYgKGkgPT0gbHVja3lfY2FuZGlkYXRlKSB7CisJCQkJCWNhbmQtPnNjb3JlKys7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlpKys7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogaGFuZGxlciAqLworc3RhdGljIHN0cnVjdCBmZF9ydF9vdXRfaGRsICogcnRfcmFuZG9taXppbmdfaGRsID0gTlVMTDsKKworLyogZW50cnkgcG9pbnQgKi8KK3N0YXRpYyBpbnQgcnRfcmFuZG9taXplX2VudHJ5KGNoYXIgKiBjb25mZmlsZSkKK3sKKwkvKiBSZWdpc3RlciB0aGUgY2FsbGJhY2sgKi8KKwlDSEVDS19GQ1QoZmRfcnRfb3V0X3JlZ2lzdGVyKHJ0X3JhbmRvbWl6aW5nLCBOVUxMLCA0LCAmcnRfcmFuZG9taXppbmdfaGRsKSk7CisJc2VlZCA9ICh1bnNpZ25lZCBpbnQpdGltZShOVUxMKTsKKwlUUkFDRV9ERUJVRyhJTkZPLCAiRXh0ZW5zaW9uICdSYW5kb21pemluZycgaW5pdGlhbGl6ZWQiKTsKKwlyZXR1cm4gMDsKK30KKworLyogVW5sb2FkICovCit2b2lkIGZkX2V4dF9maW5pKHZvaWQpCit7CisJLyogVW5yZWdpc3RlciB0aGUgY2FsbGJhY2tzICovCisJQ0hFQ0tfRkNUX0RPKGZkX3J0X291dF91bnJlZ2lzdGVyKHJ0X3JhbmRvbWl6aW5nX2hkbCwgTlVMTCksIC8qIGNvbnRpbnVlICovKTsKKwlyZXR1cm4gOworfQorCitFWFRFTlNJT05fRU5UUlkoInJ0X3JhbmRvbWl6ZSIsIHJ0X3JhbmRvbWl6ZV9lbnRyeSk7CmRpZmYgLS1naXQgYS9leHRlbnNpb25zL3J0X3JlZGlyZWN0L0NNYWtlTGlzdHMudHh0IGIvZXh0ZW5zaW9ucy9ydF9yZWRpcmVjdC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2U5ZjFiCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9ydF9yZWRpcmVjdC9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDIzIEBACisjIFRoZSBydF9yZWRpcmVjdCBleHRlbnNpb24KK1BST0pFQ1QoIkRpYW1ldGVyIFJlZGlyZWN0IG1lc3NhZ2VzIHN1cHBvcnQiIEMpCisKK1NFVChSVF9SRURJUl9TUkMKKwlydF9yZWRpci5oCisJcnRfcmVkaXIuYworCXJlZGlyX2VudHJpZXMuYworCXJlZGlyX2V4cGlyeS5jCisJcmVkaXJfZndkLmMKKwlyZWRpcl9vdXQuYworCXV0aGFzaC5oCisJKQorCisjIENvbXBpbGUgYXMgYSBtb2R1bGUKK0ZEX0FERF9FWFRFTlNJT04ocnRfcmVkaXJlY3QgJHtSVF9SRURJUl9TUkN9KQorCisKKyMjIyMKKyMjIElOU1RBTEwgc2VjdGlvbiAjIworCitJTlNUQUxMKFRBUkdFVFMgcnRfcmVkaXJlY3QKKwlMSUJSQVJZIERFU1RJTkFUSU9OICR7SU5TVEFMTF9FWFRFTlNJT05TX1NVRkZJWH0KKwlDT01QT05FTlQgZnJlZURpYW1ldGVyLWRhZW1vbikKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvcnRfcmVkaXJlY3QvcmVkaXJfZW50cmllcy5jIGIvZXh0ZW5zaW9ucy9ydF9yZWRpcmVjdC9yZWRpcl9lbnRyaWVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAxMjZkMQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvcnRfcmVkaXJlY3QvcmVkaXJfZW50cmllcy5jCkBAIC0wLDAgKzEsNDEwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcnM6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCSAqCisqIGFuZCBUaG9tYXMgS2xhdXNuZXIgPHRrQGdpZ2Eub3IuYXQ+CQkJCQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE0LCBXSURFIFByb2plY3QgYW5kIE5JQ1QJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAicnRfcmVkaXIuaCIKKyNpbmNsdWRlICJ1dGhhc2guaCIKKworLyogVGhlIGFycmF5IHdpdGggYWxsIGVudHJpZXMgb3JkZXJlZCBieSB0aGVpciBkYXRhICovCitzdHJ1Y3QgcmVkaXJfbGluZSByZWRpcmVjdHNfdXNhZ2VzW0hfVV9NQVggKyAxXTsKKworLyogZm9yIHN5bW1ldHJ5IHJlYXNvbnMsIGhhc2ggdGFibGVzIGZvciBhbGwgdHlwZXMgZXhpc3QsIGJ1dCBvbmx5IEFMTF9TRVNTSU9OIGFuZCBBTExfVVNFUiB3aWxsIGJlIHVzZWQgKi8KK3N0cnVjdCByZWRpcl9lbnRyeSAqcmVkaXJlY3RfaGFzaF90YWJsZVtIX1VfTUFYKzFdOworCisvKiBJbml0aWFsaXplIHRoZSBhcnJheSAqLworaW50IHJlZGlyX2VudHJ5X2luaXQoKQoreworCWludCBpOworCisJVFJBQ0VfRU5UUlkoIiIpOworCisJLyogcmVkaXJlY3RzX3VzYWdlcyAqLworCW1lbXNldCgmcmVkaXJlY3RzX3VzYWdlcywgMCwgc2l6ZW9mKHJlZGlyZWN0c191c2FnZXMpKTsKKworCWZvciAoaSA9IDA7IGkgPD0gSF9VX01BWDsgaSsrKSB7CisJCS8qIG9ubHkgb25lIG9mIHRoZSB0d28gd2lsbCBiZSB1c2VkIGZvciBlYWNoIHR5cGUsIGJ1dCBpbml0aWFsaXplIGJvdGggdG8gYmUgb24gdGhlIHNhZmUgc2lkZSAqLworCisJCS8qIGluaXRpYWxpemUgbGlzdCAqLworCQlDSEVDS19QT1NJWCggcHRocmVhZF9yd2xvY2tfaW5pdCggJnJlZGlyZWN0c191c2FnZXNbaV0ubG9jaywgTlVMTCkgKTsKKwkJZmRfbGlzdF9pbml0KCAmcmVkaXJlY3RzX3VzYWdlc1tpXS5zZW50aW5lbCwgJnJlZGlyZWN0c191c2FnZXNbaV0gKTsKKworCQkvKiBpbml0aWFsaXplIGhhc2ggdGFibGUgKi8KKwkJcmVkaXJlY3RfaGFzaF90YWJsZVtpXSA9IE5VTEw7CisJfQorCisJLyogaW5pdGlhbGl6ZSB0aGUgc2NvcmVzICovCisJcmVkaXJlY3RzX3VzYWdlc1sgRE9OVF9DQUNIRQkJXS5zY29yZSA9IEZEX1NDT1JFX1JFRElSX09OQ0U7CisJcmVkaXJlY3RzX3VzYWdlc1sgQUxMX1NFU1NJT04JCV0uc2NvcmUgPSBGRF9TQ09SRV9SRURJUl9TRVNTSU9OOworCXJlZGlyZWN0c191c2FnZXNbIEFMTF9SRUFMTQkJXS5zY29yZSA9IEZEX1NDT1JFX1JFRElSX1JFQUxNOworCXJlZGlyZWN0c191c2FnZXNbIFJFQUxNX0FORF9BUFBMSUNBVElPTgldLnNjb3JlID0gRkRfU0NPUkVfUkVESVJfUkVBTE1fQVBQOworCXJlZGlyZWN0c191c2FnZXNbIEFMTF9BUFBMSUNBVElPTgldLnNjb3JlID0gRkRfU0NPUkVfUkVESVJfQVBQOworCXJlZGlyZWN0c191c2FnZXNbIEFMTF9IT1NUCQldLnNjb3JlID0gRkRfU0NPUkVfUkVESVJfSE9TVDsKKwlyZWRpcmVjdHNfdXNhZ2VzWyBBTExfVVNFUgkJXS5zY29yZSA9IEZEX1NDT1JFX1JFRElSX1VTRVI7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHJlZGlyX2VudHJ5X2ZpbmkoKQoreworCWludCBpOworCXN0cnVjdCByZWRpcl9lbnRyeSAqY3VycmVudF9lbnRyeSwgKnRtcDsKKworCS8qIEVtcHR5IGFsbCBlbnRyaWVzICovCisJQ0hFQ0tfUE9TSVhfRE8oIHB0aHJlYWRfbXV0ZXhfbG9jaygmcmVkaXJfZXhwX3BlZXJfbG9jayksICAgKTsKKwlmb3IgKGkgPSAwOyBpIDw9IEhfVV9NQVg7IGkrKykgeworCQlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9yd2xvY2tfd3Jsb2NrKCAmcmVkaXJlY3RzX3VzYWdlc1tpXS5sb2NrKSwgKTsKKwkJc3dpdGNoKGkpIHsKKwkJY2FzZSBBTExfU0VTU0lPTjoKKwkJY2FzZSBBTExfVVNFUjoKKwkJCUhBU0hfSVRFUihoaCwgcmVkaXJlY3RfaGFzaF90YWJsZVtpXSwgY3VycmVudF9lbnRyeSwgdG1wKSB7CisJCQkJSEFTSF9ERUwocmVkaXJlY3RfaGFzaF90YWJsZVtpXSwgY3VycmVudF9lbnRyeSk7CisJCQkJQ0hFQ0tfRkNUX0RPKCByZWRpcl9lbnRyeV9kZXN0cm95KGN1cnJlbnRfZW50cnkpLCApOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl3aGlsZSAoIUZEX0lTX0xJU1RfRU1QVFkoJnJlZGlyZWN0c191c2FnZXNbaV0uc2VudGluZWwpKSB7CisJCQkJc3RydWN0IHJlZGlyX2VudHJ5ICogZSA9IHJlZGlyZWN0c191c2FnZXNbaV0uc2VudGluZWwubmV4dC0+bzsKKwkJCQlmZF9saXN0X3VubGluaygmZS0+cmVkaXJfbGlzdCk7CisJCQkJQ0hFQ0tfRkNUX0RPKCByZWRpcl9lbnRyeV9kZXN0cm95KGUpLCApOworCQkJfQorCQl9CisJCUNIRUNLX1BPU0lYX0RPKCBwdGhyZWFkX3J3bG9ja191bmxvY2soICZyZWRpcmVjdHNfdXNhZ2VzW2ldLmxvY2spLCApOworCQlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9yd2xvY2tfZGVzdHJveSggJnJlZGlyZWN0c191c2FnZXNbaV0ubG9jayksICk7CisJfQorCUNIRUNLX1BPU0lYX0RPKCBwdGhyZWFkX211dGV4X3VubG9jaygmcmVkaXJfZXhwX3BlZXJfbG9jayksICAgKTsKKworCXJldHVybiAwOworfQorCisvKiBDcmVhdGUgYSBuZXcgcmVkaXJfZW50cnkgYW5kIGFkZCB0aGUgY29ycmVjdCBkYXRhICovCitpbnQgcmVkaXJfZW50cnlfbmV3KHN0cnVjdCByZWRpcl9lbnRyeSAqKiBlLCBzdHJ1Y3QgZmRfbGlzdCAqIHRhcmdldHMsIHVpbnQzMl90IHJodSwgc3RydWN0IG1zZyAqIHFyeSwgRGlhbUlkX3QgbmgsIHNpemVfdCBuaGxlbiwgb3MwX3Qgb2gsIHNpemVfdCBvaGxlbikKK3sKKwlzdHJ1Y3QgcmVkaXJfZW50cnkgKiBlbnRyeSA9IE5VTEw7CisJb3MwX3QgczsKKwlzaXplX3QgbDsKKworCVRSQUNFX0VOVFJZKCIlcCAlcCAlZCAlcCAlcCAlemQgJXAgJXpkIiwgZSwgdGFyZ2V0cywgcmh1LCBxcnksIG5oLCBuaGxlbiwgb2gsIG9obGVuKQorCUFTU0VSVChlICYmIHRhcmdldHMgJiYgKHJodSA8PSBIX1VfTUFYKSAmJiBxcnkgJiYgbmggJiYgbmhsZW4gJiYgb2ggJiYgb2hsZW4pOworCisJQ0hFQ0tfTUFMTE9DKCBlbnRyeSA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHJlZGlyX2VudHJ5KSkgKTsKKwltZW1zZXQoZW50cnksIDAsIHNpemVvZihzdHJ1Y3QgcmVkaXJfZW50cnkpKTsKKworCWVudHJ5LT5leWVjID0gUkVESVJfRU5UUllfRVlFQzsKKworCUNIRUNLX01BTExPQyggZW50cnktPmZyb20ucyA9IG9zMGR1cChuaCwgbmhsZW4pICk7CisJZW50cnktPmZyb20ubCA9IG5obGVuOworCisJZmRfbGlzdF9pbml0KCZlbnRyeS0+dGFyZ2V0X3BlZXJzX2xpc3QsIGVudHJ5KTsKKwlmZF9saXN0X21vdmVfZW5kKCZlbnRyeS0+dGFyZ2V0X3BlZXJzX2xpc3QsIHRhcmdldHMpOworCisJZmRfbGlzdF9pbml0KCZlbnRyeS0+ZXhwX2xpc3QsIGVudHJ5KTsKKworCWVudHJ5LT50eXBlID0gcmh1OworCS8qIGxpc3QgZW50cnkgZm9yIHB1dHRpbmcgaW50byByZWRpcmVjdHNfdXNhZ2U7IGFsc28gZG91YmxlcyBhcyBwb2ludGVyIGludG8gdGhhdCBsaXN0IHNvIGl0IGNhbiBiZSByZW1vdmVkIGVhc2lseSAqLworCWZkX2xpc3RfaW5pdCgmZW50cnktPnJlZGlyX2xpc3QsIGVudHJ5KTsKKwkvKiBmaW5hbGx5IGluaXRpYWxpemUgdGhlIGRhdGEgKi8KKwlzd2l0Y2ggKHJodSkgeworCQljYXNlIERPTlRfQ0FDSEU6CisJCQllbnRyeS0+ZGF0YS5tZXNzYWdlLm1zZyA9IHFyeTsKKwkJCWJyZWFrOworCisJCWNhc2UgQUxMX1NFU1NJT046CisJCQl7CisJCQkJLyogVGhlcmUgaXMgYSBnb29kIGNoYW5jZSB0aGF0IHRoZSBzZXNzaW9uIGlzIGFscmVhZHkgY2FjaGVkIGluIHRoZSBtZXNzYWdlLCBzbyByZXRyaWV2ZSBpdCAqLworCQkJCXN0cnVjdCBzZXNzaW9uICogc2VzczsKKwkJCQlDSEVDS19GQ1QoIGZkX21zZ19zZXNzX2dldChmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIHFyeSwgJnNlc3MsIE5VTEwpICk7CisJCQkJaWYgKCFzZXNzKSB7CisJCQkJCVRSQUNFX0RFQlVHKElORk8sICJSZWNlaXZlZCBhIFJlZGlyZWN0IGluZGljYXRpb24gd2l0aCB1c2FnZSBBTExfU0VTU0lPTiBidXQgbm8gU2Vzc2lvbi1JZCBBVlAgaW4gdGhlIG1lc3NhZ2UsIGRlZmF1bHRpbmcgdG8gRE9OVF9DQUNIRSIpOworCQkJCQllbnRyeS0+dHlwZSA9IERPTlRfQ0FDSEU7CisJCQkJCWVudHJ5LT5kYXRhLm1lc3NhZ2UubXNnID0gcXJ5OworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJQ0hFQ0tfRkNUKCBmZF9zZXNzX2dldHNpZChzZXNzLCAmcywgJmwpICk7CisJCQkJQ0hFQ0tfTUFMTE9DKCBlbnRyeS0+ZGF0YS5zZXNzaW9uLnMgPSBvczBkdXAocywgbCkgKTsKKwkJCQllbnRyeS0+ZGF0YS5zZXNzaW9uLmwgPSBsOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBBTExfUkVBTE06CisJCQl7CisJCQkJLyogU2VhcmNoIHRoZSBEZXN0aW5hdGlvbi1SZWFsbSBvZiB0aGUgbWVzc2FnZSAqLworCQkJCXN0cnVjdCBhdnAgKiBkcjsKKwkJCQlzdHJ1Y3QgYXZwX2hkciAqIGFoZHI7CisJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfc2VhcmNoX2F2cChxcnksIHJlZGlyX2RpY3RfZHIsICZkcikgKTsKKwkJCQlpZiAoIWRyKSB7CisJCQkJCVRSQUNFX0RFQlVHKElORk8sICJSZWNlaXZlZCBhIFJlZGlyZWN0IGluZGljYXRpb24gd2l0aCB1c2FnZSBBTExfUkVBTE0gYnV0IG5vIERlc3RpbmF0aW9uLVJlYWxtIEFWUCBpbiB0aGUgbWVzc2FnZSwgZGVmYXVsdGluZyB0byBET05UX0NBQ0hFIik7CisJCQkJCWVudHJ5LT50eXBlID0gRE9OVF9DQUNIRTsKKwkJCQkJZW50cnktPmRhdGEubWVzc2FnZS5tc2cgPSBxcnk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlDSEVDS19GQ1QoICBmZF9tc2dfYXZwX2hkciggZHIsICZhaGRyICkgICk7CisJCQkJQ0hFQ0tfTUFMTE9DKCBlbnRyeS0+ZGF0YS5yZWFsbS5zID0gb3MwZHVwKGFoZHItPmF2cF92YWx1ZS0+b3MuZGF0YSwgYWhkci0+YXZwX3ZhbHVlLT5vcy5sZW4pICk7CisJCQkJZW50cnktPmRhdGEucmVhbG0ubCA9IGFoZHItPmF2cF92YWx1ZS0+b3MubGVuOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSRUFMTV9BTkRfQVBQTElDQVRJT046CisJCQl7CisJCQkJLyogU2VhcmNoIHRoZSBEZXN0aW5hdGlvbi1SZWFsbSBvZiB0aGUgbWVzc2FnZSAqLworCQkJCXN0cnVjdCBhdnAgKiBkcjsKKwkJCQlzdHJ1Y3QgYXZwX2hkciAqIGFoZHI7CisJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfc2VhcmNoX2F2cChxcnksIHJlZGlyX2RpY3RfZHIsICZkcikgKTsKKwkJCQlpZiAoIWRyKSB7CisJCQkJCVRSQUNFX0RFQlVHKElORk8sICJSZWNlaXZlZCBhIFJlZGlyZWN0IGluZGljYXRpb24gd2l0aCB1c2FnZSBSRUFMTV9BTkRfQVBQTElDQVRJT04gYnV0IG5vIERlc3RpbmF0aW9uLVJlYWxtIEFWUCBpbiB0aGUgbWVzc2FnZSwgZGVmYXVsdGluZyB0byBET05UX0NBQ0hFIik7CisJCQkJCWVudHJ5LT50eXBlID0gRE9OVF9DQUNIRTsKKwkJCQkJZW50cnktPmRhdGEubWVzc2FnZS5tc2cgPSBxcnk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlDSEVDS19GQ1QoICBmZF9tc2dfYXZwX2hkciggZHIsICZhaGRyICkgICk7CisJCQkJQ0hFQ0tfTUFMTE9DKCBlbnRyeS0+ZGF0YS5yZWFsbV9hcHAucyA9IG9zMGR1cChhaGRyLT5hdnBfdmFsdWUtPm9zLmRhdGEsIGFoZHItPmF2cF92YWx1ZS0+b3MubGVuKSApOworCQkJCWVudHJ5LT5kYXRhLnJlYWxtX2FwcC5sID0gYWhkci0+YXZwX3ZhbHVlLT5vcy5sZW47CisJCQl9CisJCQkvKiBhbmQgdGhlbiB0aGUgYXBwbGljYXRpb24gKi8KKwkJCXsKKwkJCQlzdHJ1Y3QgbXNnX2hkciAqIGhkcjsKKwkJCQlDSEVDS19GQ1QoIGZkX21zZ19oZHIocXJ5LCAmaGRyKSApOworCQkJCWVudHJ5LT5kYXRhLnJlYWxtX2FwcC5hID0gaGRyLT5tc2dfYXBwbDsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgQUxMX0FQUExJQ0FUSU9OOgorCQkJeworCQkJCXN0cnVjdCBtc2dfaGRyICogaGRyOworCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2hkcihxcnksICZoZHIpICk7CisJCQkJZW50cnktPmRhdGEuYXBwLmEgPSBoZHItPm1zZ19hcHBsOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBBTExfSE9TVDoKKwkJCUNIRUNLX01BTExPQyggZW50cnktPmRhdGEuaG9zdC5zID0gb3MwZHVwKG9oLCBvaGxlbikgKTsKKwkJCWVudHJ5LT5kYXRhLmhvc3QubCA9IG9obGVuOworCQkJYnJlYWs7CisKKwkJY2FzZSBBTExfVVNFUjoKKwkJCXsKKwkJCQkvKiBTZWFyY2ggdGhlIFVzZXItTmFtZSBvZiB0aGUgbWVzc2FnZSAqLworCQkJCXN0cnVjdCBhdnAgKiB1bjsKKwkJCQlzdHJ1Y3QgYXZwX2hkciAqIGFoZHI7CisJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfc2VhcmNoX2F2cChxcnksIHJlZGlyX2RpY3RfdW4sICZ1bikgKTsKKwkJCQlpZiAoIXVuKSB7CisJCQkJCVRSQUNFX0RFQlVHKElORk8sICJSZWNlaXZlZCBhIFJlZGlyZWN0IGluZGljYXRpb24gd2l0aCB1c2FnZSBBTExfVVNFUiBidXQgbm8gVXNlci1OYW1lIEFWUCBpbiB0aGUgbWVzc2FnZSwgZGVmYXVsdGluZyB0byBET05UX0NBQ0hFIik7CisJCQkJCWVudHJ5LT50eXBlID0gRE9OVF9DQUNIRTsKKwkJCQkJZW50cnktPmRhdGEubWVzc2FnZS5tc2cgPSBxcnk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlDSEVDS19GQ1QoICBmZF9tc2dfYXZwX2hkciggdW4sICZhaGRyICkgICk7CisJCQkJQ0hFQ0tfTUFMTE9DKCBlbnRyeS0+ZGF0YS51c2VyLnMgPSBvczBkdXAoYWhkci0+YXZwX3ZhbHVlLT5vcy5kYXRhLCBhaGRyLT5hdnBfdmFsdWUtPm9zLmxlbikgKTsKKwkJCQllbnRyeS0+ZGF0YS51c2VyLmwgPSBhaGRyLT5hdnBfdmFsdWUtPm9zLmxlbjsKKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlBU1NFUlQoMCk7CisJCQlyZXR1cm4gRUlOVkFMOworCX0KKworCS8qIFdlJ3JlIGRvbmUgKi8KKwkqZSA9IGVudHJ5OworCXJldHVybiAwOworfQorCisKKy8qIENvbXBhcmVzIHR3byBwb2ludGVycyAoRE9OVF9DQUNIRSkgKi8KK3N0YXRpYyBpbnQgY29tcGFyZV9lbnRyaWVzX3B0cih1bmlvbiBtYXRjaGRhdGEgKiBkMSwgdW5pb24gbWF0Y2hkYXRhICogZDIpIHsKKwl1bnNpZ25lZCBsb25nIHYxID0gKHVuc2lnbmVkIGxvbmcpIGQxLT5tZXNzYWdlLm1zZzsKKwl1bnNpZ25lZCBsb25nIHYyID0gKHVuc2lnbmVkIGxvbmcpIGQyLT5tZXNzYWdlLm1zZzsKKwlpZiAodjEgPiB2MikKKwkJcmV0dXJuIDE7CisJaWYgKHYxIDwgdjIpCisJCXJldHVybiAtMTsKKwlyZXR1cm4gMDsKK30KKy8qIENvbXBhcmUgdHdvIGFwcGxpY2F0aW9ucyAoUkVBTE1fQU5EX0FQUExJQ0FUSU9OIGFuZCBBTExfQVBQTElDQVRJT04pICovCitzdGF0aWMgaW50IGNvbXBhcmVfZW50cmllc19hcHBsKHVuaW9uIG1hdGNoZGF0YSAqIGQxLCB1bmlvbiBtYXRjaGRhdGEgKiBkMikgeworCWlmIChkMS0+YXBwLmEgPiBkMi0+YXBwLmEpCisJCXJldHVybiAxOworCWlmIChkMS0+YXBwLmEgPCBkMi0+YXBwLmEpCisJCXJldHVybiAtMTsKKwlyZXR1cm4gMDsKK30KKworLyogQ29tcGFyZSB0d28gc3RyaW5ncyAoQUxMX1NFU1NJT04sIEFMTF9SRUFMTSwgQUxMX0hPU1QsIEFMTF9VU0VSKSAqLworc3RhdGljIGludCBjb21wYXJlX2VudHJpZXNfb3N0cih1bmlvbiBtYXRjaGRhdGEgKiBkMSwgdW5pb24gbWF0Y2hkYXRhICogZDIpIHsKKwlyZXR1cm4gZmRfb3NfY21wKGQxLT5zZXNzaW9uLnMsIGQxLT5zZXNzaW9uLmwsIGQyLT5zZXNzaW9uLnMsIGQyLT5zZXNzaW9uLmwpOworfQorCisvKiBUaGUgYXJyYXkgb2YgY2FsbGJhY2tzICovCitpbnQgKCpyZWRpcl9lbnRyeV9jbXBfa2V5W0hfVV9NQVggKzFdKSh1bmlvbiBtYXRjaGRhdGEgKiAsIHVuaW9uIG1hdGNoZGF0YSAqICkgPSB7CisJY29tcGFyZV9lbnRyaWVzX3B0ciwgIC8qIERPTlRfQ0FDSEUgKi8KKwljb21wYXJlX2VudHJpZXNfb3N0ciwgLyogQUxMX1NFU1NJT04gKi8KKwljb21wYXJlX2VudHJpZXNfb3N0ciwgLyogQUxMX1JFQUxNICovCisJY29tcGFyZV9lbnRyaWVzX2FwcGwsIC8qIFJFQUxNX0FORF9BUFBMSUNBVElPTiAqLworCWNvbXBhcmVfZW50cmllc19hcHBsLCAvKiBBTExfQVBQTElDQVRJT04gKi8KKwljb21wYXJlX2VudHJpZXNfb3N0ciwgLyogQUxMX0hPU1QgKi8KKwljb21wYXJlX2VudHJpZXNfb3N0ciAgLyogQUxMX1VTRVIgKi8KK307CisKKy8qIExpbmsgdGhlIG5ld2x5IGNyZWF0ZWQgZW50cnkgaW50byB0aGUgY29ycmVjdCByZWRpcmVjdHNfdXNhZ2VzIGxpc3QuIFRoZSBtdXRleCBtdXN0IGJlIGhlbGQgKi8KK2ludCByZWRpcl9lbnRyeV9pbnNlcnQoc3RydWN0IHJlZGlyX2VudHJ5ICogZSkKK3sKKwlzdHJ1Y3QgZmRfbGlzdCAqIGxpOworCXN0cnVjdCByZWRpcl9lbnRyeSAqIHIgPSBOVUxMOworCisJVFJBQ0VfRU5UUlkoIiVwIiwgZSk7CisJQ0hFQ0tfUEFSQU1TKGUgJiYgKGUtPmV5ZWMgPT0gUkVESVJfRU5UUllfRVlFQykpOworCisJLyogV3JpdGUtTG9jayB0aGUgbGluZSAqLworCUNIRUNLX1BPU0lYKCBwdGhyZWFkX3J3bG9ja193cmxvY2soIFJXTE9DS19SRURJUihlKSApICk7CisKKwlzd2l0Y2ggKGUtPnR5cGUpIHsKKwljYXNlIEFMTF9TRVNTSU9OOgorCQlIQVNIX0ZJTkQoaGgsIHJlZGlyZWN0X2hhc2hfdGFibGVbZS0+dHlwZV0sIGUtPmRhdGEuc2Vzc2lvbi5zLCBlLT5kYXRhLnNlc3Npb24ubCwgcik7CisJCWlmIChyKSB7CisJCQkvKiBwcmV2aW91c2x5IGV4aXN0aW5nIGVudHJ5LCBkZWxldGUgaXQgZnJvbSBoYXNoIGFuZCBmcmVlIGl0ICovCisJCQlIQVNIX0RFTEVURShoaCwgcmVkaXJlY3RfaGFzaF90YWJsZVtlLT50eXBlXSwgcik7CisJCQlDSEVDS19GQ1RfRE8oIHJlZGlyX2VudHJ5X2Rlc3Ryb3kociksICk7CisJCX0KKwkJSEFTSF9BRERfS0VZUFRSKGhoLCByZWRpcmVjdF9oYXNoX3RhYmxlW2UtPnR5cGVdLCBlLT5kYXRhLnNlc3Npb24ucywgZS0+ZGF0YS5zZXNzaW9uLmwsIGUpOworCQlicmVhazsKKwljYXNlIEFMTF9VU0VSOgorCQlIQVNIX0ZJTkQoaGgsIHJlZGlyZWN0X2hhc2hfdGFibGVbZS0+dHlwZV0sIGUtPmRhdGEudXNlci5zLCBlLT5kYXRhLnVzZXIubCwgcik7CisJCWlmIChyKSB7CisJCQkvKiBwcmV2aW91c2x5IGV4aXN0aW5nIGVudHJ5LCBkZWxldGUgaXQgZnJvbSBoYXNoIGFuZCBmcmVlIGl0ICovCisJCQlIQVNIX0RFTEVURShoaCwgcmVkaXJlY3RfaGFzaF90YWJsZVtlLT50eXBlXSwgcik7CisJCQlDSEVDS19GQ1RfRE8oIHJlZGlyX2VudHJ5X2Rlc3Ryb3kociksICk7CisJCX0KKwkJSEFTSF9BRERfS0VZUFRSKGhoLCByZWRpcmVjdF9oYXNoX3RhYmxlW2UtPnR5cGVdLCBlLT5kYXRhLnVzZXIucywgZS0+ZGF0YS51c2VyLmwsIGUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlmb3IgKGxpID0gcmVkaXJlY3RzX3VzYWdlc1tlLT50eXBlXS5zZW50aW5lbC5uZXh0OyBsaSAhPSAmcmVkaXJlY3RzX3VzYWdlc1tlLT50eXBlXS5zZW50aW5lbDsgbGkgPSBsaS0+bmV4dCkgeworCQkJc3RydWN0IHJlZGlyX2VudHJ5ICogbiA9IGxpLT5vOworCQkJaW50IGNtcCA9IHJlZGlyX2VudHJ5X2NtcF9rZXlbZS0+dHlwZV0oJmUtPmRhdGEsICZuLT5kYXRhKTsKKwkJCWlmIChjbXAgPD0gMCkKKwkJCQlicmVhazsKKwkJfQorCisJCWZkX2xpc3RfaW5zZXJ0X2JlZm9yZShsaSwgJmUtPnJlZGlyX2xpc3QpOworCQlicmVhazsKKwl9CisKKwkvKiB1bkxvY2sgdGhlIGxpbmUgKi8KKwlDSEVDS19QT1NJWCggcHRocmVhZF9yd2xvY2tfdW5sb2NrKCBSV0xPQ0tfUkVESVIoZSkgKSApOworCisJcmV0dXJuIDA7Cit9CisKKy8qIERlc3Ryb3kgLS0gdGhlIGV4cF9wZWVyX2xvY2sgbXVzdCBiZSBoZWxkIHdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgKi8KK2ludCByZWRpcl9lbnRyeV9kZXN0cm95KHN0cnVjdCByZWRpcl9lbnRyeSAqIGUpCit7CisJc3RydWN0IHJlZGlyX2VudHJ5ICptYXRjaDsKKwlUUkFDRV9FTlRSWSgiJXAiLCBlKTsKKwlDSEVDS19QQVJBTVMoZSAmJiAoZS0+ZXllYyA9PSBSRURJUl9FTlRSWV9FWUVDKSk7CisKKwlzd2l0Y2ggKGUtPnR5cGUpIHsKKwljYXNlIEFMTF9TRVNTSU9OOgorCQkvKiBJZiB0aGUgZW50cnkgaXMgaW4gdGhlIGhhc2ggdGFibGUsIGxvY2sgdGhlIHJ3bG9jayBhbHNvICovCisJCUhBU0hfRklORChoaCwgcmVkaXJlY3RfaGFzaF90YWJsZVtlLT50eXBlXSwgZS0+ZGF0YS5zZXNzaW9uLnMsIGUtPmRhdGEuc2Vzc2lvbi5sLCBtYXRjaCk7CisJCWlmIChtYXRjaCkgeworCQkJLyogVE9ETzogY2hlY2sgaWYgZSA9PSBtYXRjaD8gKi8KKwkJCUNIRUNLX1BPU0lYKCBwdGhyZWFkX3J3bG9ja193cmxvY2soIFJXTE9DS19SRURJUihlKSApICk7CisJCQlIQVNIX0RFTEVURShoaCwgcmVkaXJlY3RfaGFzaF90YWJsZVtlLT50eXBlXSwgbWF0Y2gpOworCQkJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfcndsb2NrX3VubG9jayggUldMT0NLX1JFRElSKGUpICkgKTsKKwkJfQorCQlicmVhazsKKwljYXNlIEFMTF9VU0VSOgorCQkvKiBJZiB0aGUgZW50cnkgaXMgaW4gdGhlIGhhc2ggdGFibGUsIGxvY2sgdGhlIHJ3bG9jayBhbHNvICovCisJCUhBU0hfRklORChoaCwgcmVkaXJlY3RfaGFzaF90YWJsZVtlLT50eXBlXSwgZS0+ZGF0YS51c2VyLnMsIGUtPmRhdGEudXNlci5sLCBtYXRjaCk7CisJCWlmIChtYXRjaCkgeworCQkJLyogVE9ETzogY2hlY2sgaWYgZSA9PSBtYXRjaD8gKi8KKwkJCUNIRUNLX1BPU0lYKCBwdGhyZWFkX3J3bG9ja193cmxvY2soIFJXTE9DS19SRURJUihlKSApICk7CisJCQlIQVNIX0RFTEVURShoaCwgcmVkaXJlY3RfaGFzaF90YWJsZVtlLT50eXBlXSwgbWF0Y2gpOworCQkJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfcndsb2NrX3VubG9jayggUldMT0NLX1JFRElSKGUpICkgKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBJZiB0aGUgZW50cnkgaXMgbGlua2VkLCBsb2NrIHRoZSByd2xvY2sgYWxzbyAqLworCQlpZiAoIUZEX0lTX0xJU1RfRU1QVFkoJmUtPnJlZGlyX2xpc3QpKSB7CisJCQlDSEVDS19QT1NJWCggcHRocmVhZF9yd2xvY2tfd3Jsb2NrKCBSV0xPQ0tfUkVESVIoZSkgKSApOworCQkJZmRfbGlzdF91bmxpbmsoJmUtPnJlZGlyX2xpc3QpOworCQkJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfcndsb2NrX3VubG9jayggUldMT0NLX1JFRElSKGUpICkgKTsKKwkJfQorCQlicmVhazsKKwl9CisKKwkvKiBOb3cgdW5saW5rIGZyb20gb3RoZXIgbGlzdCAqLworCWZkX2xpc3RfdW5saW5rKCZlLT5leHBfbGlzdCk7CisKKwkvKiBFbXB0eSB0aGUgdGFyZ2V0cyBsaXN0ICovCisJd2hpbGUgKCFGRF9JU19MSVNUX0VNUFRZKCZlLT50YXJnZXRfcGVlcnNfbGlzdCkpIHsKKwkJc3RydWN0IHJlZGlyX2hvc3QgKiBoID0gKHN0cnVjdCByZWRpcl9ob3N0ICopZS0+dGFyZ2V0X3BlZXJzX2xpc3QubmV4dC0+bzsKKworCQlmZF9saXN0X3VubGluaygmaC0+Y2hhaW4pOworCQlmcmVlKGgtPmlkKTsKKwkJZnJlZShoKTsKKwl9CisKKwkvKiBOb3cgd2UgY2FuIGRlc3Ryb3kgdGhlIGRhdGEgc2FmZWx5ICovCisJc3dpdGNoIChlLT50eXBlKSB7CisJCWNhc2UgRE9OVF9DQUNIRToKKwkJCS8qIG5vdGhpbmcgc3BlY2lhbCAqLworCQkJYnJlYWs7CisJCWNhc2UgQUxMX1NFU1NJT046CisJCQlmcmVlKGUtPmRhdGEuc2Vzc2lvbi5zKTsKKwkJCWJyZWFrOworCQljYXNlIEFMTF9SRUFMTToKKwkJCWZyZWUoZS0+ZGF0YS5yZWFsbS5zKTsKKwkJCWJyZWFrOworCQljYXNlIFJFQUxNX0FORF9BUFBMSUNBVElPTjoKKwkJCWZyZWUoZS0+ZGF0YS5yZWFsbV9hcHAucyk7CisJCQlicmVhazsKKwkJY2FzZSBBTExfQVBQTElDQVRJT046CisJCQlicmVhazsKKwkJY2FzZSBBTExfSE9TVDoKKwkJCWZyZWUoZS0+ZGF0YS5ob3N0LnMpOworCQkJYnJlYWs7CisJCWNhc2UgQUxMX1VTRVI6CisJCQlmcmVlKGUtPmRhdGEudXNlci5zKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJVFJBQ0VfREVCVUcoSU5GTywgIkludmFsaWQgcmVkaXJlY3QgdHlwZSB3YXMgc2F2ZWQiKTsKKwkJCUFTU0VSVCgwKTsKKwkJCXJldHVybiBFSU5WQUw7CisJfQorCisJZnJlZShlLT5mcm9tLnMpOworCisJZnJlZShlKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvcnRfcmVkaXJlY3QvcmVkaXJfZXhwaXJ5LmMgYi9leHRlbnNpb25zL3J0X3JlZGlyZWN0L3JlZGlyX2V4cGlyeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNzQ2ODQKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL3J0X3JlZGlyZWN0L3JlZGlyX2V4cGlyeS5jCkBAIC0wLDAgKzEsMTM2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxNSwgV0lERSBQcm9qZWN0IGFuZCBOSUNUCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBXSURFIFByb2plY3Qgb3IgTklDVCBub3IgdGhlIAkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFdJREUgUHJvamVjdCBhbmQgCQkJCQkJICoKKyogICBOSUNULgkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJydF9yZWRpci5oIgorCisvKiBFeHBpcmF0aW9uIG1hbmFnZW1lbnQgKi8KKworCisvKiBFbnRyaWVzIGJ5IHRoZWlyIGFzY2VuZGluZyBleHBpcmF0aW9uIGRhdGUsIHRvIGFjY2VsZXJhdGUgdGhlIHdvcmsgb2YgdGhlIGV4cGlyZSB0aHJlYWQgKi8KK3N0YXRpYyBzdHJ1Y3QgZmRfbGlzdCAgZXhwaXJlX2xpc3QgPSBGRF9MSVNUX0lOSVRJQUxJWkVSKGV4cGlyZV9saXN0KTsKK3N0YXRpYyBwdGhyZWFkX2NvbmRfdCAgZXhwX2NuZCAgPSBQVEhSRUFEX0NPTkRfSU5JVElBTElaRVI7CisKK3B0aHJlYWRfbXV0ZXhfdCByZWRpcl9leHBfcGVlcl9sb2NrID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKKworLyogVGhlIHRocmVhZCB0aGF0IGhhbmRsZXMgZXhwaXJlZCBlbnRyaWVzIGNsZWFudXAuICovCit2b2lkICogcmVkaXJfZXhwX3Rocl9mY3Qodm9pZCAqIGFyZykKK3sKKwlmZF9sb2dfdGhyZWFkbmFtZSAoICJSZWRpcmVjdHMvZXhwaXJlIiApOworCVRSQUNFX0VOVFJZKCAiIiApOworCisJQ0hFQ0tfUE9TSVhfRE8oIHB0aHJlYWRfbXV0ZXhfbG9jaygmcmVkaXJfZXhwX3BlZXJfbG9jayksICBnb3RvIGZhdGFsX2Vycm9yICk7CisJcHRocmVhZF9jbGVhbnVwX3B1c2goIGZkX2NsZWFudXBfbXV0ZXgsICZyZWRpcl9leHBfcGVlcl9sb2NrICk7CisKKwlkbyB7CisJCXN0cnVjdCB0aW1lc3BlYwlub3c7CisJCXN0cnVjdCByZWRpcl9lbnRyeSAqIGZpcnN0OworYWdhaW46CisJCS8qIENoZWNrIGlmIHRoZXJlIGFyZSBleHBpcmluZyBlbnRyaWVzIGF2YWlsYWJsZSAqLworCQlpZiAoRkRfSVNfTElTVF9FTVBUWSgmZXhwaXJlX2xpc3QpKSB7CisJCQkvKiBKdXN0IHdhaXQgZm9yIGEgY2hhbmdlIG9yIGNhbmNlbGF0aW9uICovCisJCQlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9jb25kX3dhaXQoICZleHBfY25kLCAmcmVkaXJfZXhwX3BlZXJfbG9jayApLCBicmVhayAvKiB0aGlzIG1pZ2h0IG5vdCBwb3AgdGhlIGNsZWFudXAgaGFuZGxlciwgYnV0IHNpbmNlIHdlIEFTU0VSVCgwKSwgaXQgaXMgbm90IHRoZSBiaWcgaXNzdWUuLi4gKi8gKTsKKwkJCS8qIFJlc3RhcnQgdGhlIGxvb3Agb24gd2FrZXVwICovCisJCQlnb3RvIGFnYWluOworCQl9CisKKwkJLyogR2V0IHRoZSBwb2ludGVyIHRvIHRoZSBlbnRyeSB0aGF0IGV4cGlyZXMgZmlyc3QgKi8KKwkJZmlyc3QgPSAoc3RydWN0IHJlZGlyX2VudHJ5ICopKGV4cGlyZV9saXN0Lm5leHQtPm8pOworCisJCS8qIEdldCB0aGUgY3VycmVudCB0aW1lICovCisJCUNIRUNLX1NZU19ETyggIGNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZub3cpLCAgYnJlYWsgICk7CisKKwkJLyogSWYgZmlyc3Qgc2Vzc2lvbiBpcyBub3QgZXhwaXJlZCwgd2UganVzdCB3YWl0IHVudGlsIGl0IGhhcHBlbnMgKi8KKwkJaWYgKCBUU19JU19JTkZFUklPUiggJm5vdywgJmZpcnN0LT50aW1lb3V0ICkgKSB7CisKKwkJCUNIRUNLX1BPU0lYX0RPMiggIHB0aHJlYWRfY29uZF90aW1lZHdhaXQoICZleHBfY25kLCAmcmVkaXJfZXhwX3BlZXJfbG9jaywgJmZpcnN0LT50aW1lb3V0ICksCisJCQkJCUVUSU1FRE9VVCwgLyogRVRJTUVET1VUIGlzIGEgbm9ybWFsIGVycm9yLCBjb250aW51ZSAqLywKKwkJCQkJLyogb24gb3RoZXIgZXJyb3IsICovIGJyZWFrICk7CisKKwkJCS8qIG9uIHdha2V1cCwgbG9vcCAqLworCQkJZ290byBhZ2FpbjsKKwkJfQorCisJCS8qIE5vdywgdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBsaXN0IGlzIGV4cGlyZWQ7IGRlc3Ryb3kgaXQgKi8KKworCQlDSEVDS19GQ1RfRE8oIHJlZGlyX2VudHJ5X2Rlc3Ryb3koIGZpcnN0ICksIGJyZWFrICk7CisKKwl9IHdoaWxlICgxKTsKKworCXB0aHJlYWRfY2xlYW51cF9wb3AoIDAgKTsKKwlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9tdXRleF91bmxvY2soJnJlZGlyX2V4cF9wZWVyX2xvY2spLCAgKTsKKworZmF0YWxfZXJyb3I6CisJVFJBQ0VfREVCVUcoSU5GTywgIkEgc3lzdGVtIGVycm9yIG9jY3VycmVkIGluIHJlZGlyZWN0IG1vZHVsZSEgRXhwaXJ5IHRocmVhZCBpcyB0ZXJtaW5hdGluZy4uLiIpOworCUFTU0VSVCgwKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyogU2V0cyB0aGUgdGltZW91dCB2YWx1ZSAmIGxpbmsgaW4gZXhwaXJ5IGxpc3QuIFRoZSBtdXRleCBtdXN0IGJlIGhlbGQgb24gY2FsbGluZyAqLworaW50IHJlZGlyX2V4cF9zZXQoc3RydWN0IHJlZGlyX2VudHJ5ICogZSwgdWludDMyX3QgZHVyYXRpb24pCit7CisJc3RydWN0IGZkX2xpc3QgKiBsaTsKKwlUUkFDRV9FTlRSWSgiJXAgJWQiLCBlLCBkdXJhdGlvbik7CisJQ0hFQ0tfUEFSQU1TKGUgJiYgKGUtPmV5ZWMgPT0gUkVESVJfRU5UUllfRVlFQykgJiYgZHVyYXRpb24gKTsKKworCS8qIFVubGluayBpbiBjYXNlIGl0IHdhcyBhbHJlYWR5IHNldCBiZWZvcmUgKi8KKwlmZF9saXN0X3VubGluaygmZS0+ZXhwX2xpc3QpOworCisJLyogR2V0IGN1cnJlbnQgdGltZSAqLworCUNIRUNLX1NZUyggIGNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZlLT50aW1lb3V0KSAgKTsKKworCS8qIEFkZCB0aGUgZHVyYXRpb24gKi8KKwllLT50aW1lb3V0LnR2X3NlYyArPSBkdXJhdGlvbjsKKworCS8qIG5vdyBzZWFyY2ggdGhlIG5leHQgZWxlbWVudCBpbiB0aGUgbGlzdCAqLworCWZvciAobGkgPSBleHBpcmVfbGlzdC5uZXh0OyBsaSAhPSAmZXhwaXJlX2xpc3Q7IGxpID0gbGktPm5leHQpIHsKKwkJc3RydWN0IHJlZGlyX2VudHJ5ICogbiA9IGxpLT5vOworCisJCWlmICggVFNfSVNfSU5GRVJJT1IoICZlLT50aW1lb3V0LCAmbi0+dGltZW91dCApICkKKwkJCWJyZWFrOworCisJfQorCisJLyogSW5zZXJ0IGJlZm9yZSB0aGlzIGVsZW1lbnQgKi8KKwlmZF9saXN0X2luc2VydF9iZWZvcmUobGksICZlLT5leHBfbGlzdCk7CisKKwkvKiBTaWduYWwgdGhlIGV4cGlyeSB0aHJlYWQgaWYgbmVlZGVkICovCisJaWYgKGUtPmV4cF9saXN0LnByZXYgPT0gJmV4cGlyZV9saXN0KSB7IC8qIGl0IGlzIHRoZSBmaXJzdCBlbGVtZW50ICovCisJCUNIRUNLX1BPU0lYKCBwdGhyZWFkX2NvbmRfc2lnbmFsKCZleHBfY25kKSApOworCX0KKworCS8qIERvbmUgKi8KKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9ydF9yZWRpcmVjdC9yZWRpcl9md2QuYyBiL2V4dGVuc2lvbnMvcnRfcmVkaXJlY3QvcmVkaXJfZndkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWEzNDE3ZQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvcnRfcmVkaXJlY3QvcmVkaXJfZndkLmMKQEAgLTAsMCArMSwyNzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDE1LCBXSURFIFByb2plY3QgYW5kIE5JQ1QJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFdJREUgUHJvamVjdCBvciBOSUNUIG5vciB0aGUgCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgV0lERSBQcm9qZWN0IGFuZCAJCQkJCQkgKgorKiAgIE5JQ1QuCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInJ0X3JlZGlyLmgiCisKKy8qIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIHRoZSBkYXRhIHRvIGtlZXAgd2hlbiBhIG5ldyBwZWVyJ3MgY29ubmVjdGlvbiBpcyBhdHRlbXB0ZWQgKGZvciBsYXRlcikgKi8KK3N0cnVjdCByZWRpcl90YXNrIHsKKwlzdHJ1Y3QgbXNnICogYW5zd2VyOyAvKiB0aGUgbWVzc2FnZSB0aGF0IHdhcyBiZWluZyBwcm9jZXNzZWQgKi8KKwl1aW50MzJfdCAgICAgcmh1OyAgICAvKiBSZWRpcmVjdC1Ib3N0LVVzYWdlIHZhbHVlICovCisJdWludDMyX3QgICAgIHJtY3Q7ICAgLyogUmVkaXJlY3QtTWF4LUNhY2hlLVRpbWUgdmFsdWUgKi8KKwlzdHJ1Y3QgZmRfbGlzdCByaDsgICAvKiB0aGUgbGlzdCBvZiBSZWRpcmVjdC1Ib3N0cyAqLworfTsKKworLyogUmVjZWl2ZWQgYW5zd2VycyBGV0QgY2FsbGJhY2sgKi8KK2ludCByZWRpcl9md2RfY2Iodm9pZCAqIGNiZGF0YSwgc3RydWN0IG1zZyAqKiBtc2cpCit7CisJc3RydWN0IG1zZyAqIG0sICogcTsKKwlzdHJ1Y3QgcnRfZGF0YSAqcnRkOworCXN0cnVjdCBtc2dfaGRyICogaGRyOworCXVuaW9uIGF2cF92YWx1ZSAqYV9yYyA9IE5VTEwsICphX3JodSA9IE5VTEwsICphX3JtY3QgPSBOVUxMLCAqYV9vaCA9IE5VTEw7CisJaW50IGtub3duID0gMCwgYWN0aXZlcyA9IDA7CisJc3RydWN0IGZkX2xpc3QgKiBsaTsKKwlzdHJ1Y3QgYXZwICogYXZwOworCXN0cnVjdCByZWRpcl90YXNrIHRhc2sgPSB7IC5hbnN3ZXIgPSBOVUxMLCAucmh1ID0gMCwgLnJtY3QgPSAwLCAucmggPSBGRF9MSVNUX0lOSVRJQUxJWkVSKHRhc2sucmgpIH07CisJRGlhbUlkX3Qgbmg7CisJc2l6ZV90ICAgbmhsZW47CisJaW50IG5icmggPSAwOworCXN0cnVjdCByZWRpcl9lbnRyeSAqIGVudHJ5OworCisJVFJBQ0VfRU5UUlkoIiVwICVwIiwgY2JkYXRhLCBtc2cpOworCisJQ0hFQ0tfUEFSQU1TKG1zZyAmJiAqbXNnKTsKKworCW0gPSAqbXNnOworCisJLyogRmlyc3QgZ2V0IHRoZSBoZWFkZXIgKi8KKwlDSEVDS19GQ1QoIGZkX21zZ19oZHIobSwgJmhkcikgKTsKKworCS8qIENoZWNrIGlmIHdlIGhhdmUgYW4gZXJyb3IgKi8KKwlBU1NFUlQoIShoZHItPm1zZ19mbGFncyAmIENNRF9GTEFHX1JFUVVFU1QpKTsKKwlpZiAoIShoZHItPm1zZ19mbGFncyAmIENNRF9GTEFHX0VSUk9SKSkgeworCQkvKiBUaGlzIGFuc3dlciBkb2VzIG5vdCBoYXZlIHRoZSBFIGZsYWcsIG5vIG5lZWQgdG8gcHJvY2VzcyBmdXJ0aGVyICovCisJCXJldHVybiAwOworCX0KKworCS8qIE5vdyBnZXQgdGhlIEFWUHMgd2UgYXJlIGludGVyZXN0ZWQgaW4gKi8KKwlDSEVDS19GQ1QoICBmZF9tc2dfYnJvd3NlKG0sIE1TR19CUldfRklSU1RfQ0hJTEQsICZhdnAsIE5VTEwpICApOworCXdoaWxlIChhdnApIHsKKwkJc3RydWN0IGF2cF9oZHIgKiBhaGRyOworCisJCUNIRUNLX0ZDVCggIGZkX21zZ19hdnBfaGRyKCBhdnAsICZhaGRyICkgICk7CisJCWlmICghIChhaGRyLT5hdnBfZmxhZ3MgJiBBVlBfRkxBR19WRU5ET1IpKSB7CisJCQlzd2l0Y2ggKGFoZHItPmF2cF9jb2RlKSB7CisJCQkJY2FzZSBBQ19PUklHSU5fSE9TVDoKKwkJCQkJLyogUGFyc2UgdGhpcyBBVlAgKi8KKwkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfcGFyc2VfZGljdCAoIGF2cCwgZmRfZ19jb25maWctPmNuZl9kaWN0LCBOVUxMICkgKTsKKwkJCQkJQVNTRVJUKCBhaGRyLT5hdnBfdmFsdWUgKTsKKwkJCQkJYV9vaCA9IGFoZHItPmF2cF92YWx1ZTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIEFDX1JFU1VMVF9DT0RFOgorCQkJCQkvKiBQYXJzZSB0aGlzIEFWUCAqLworCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19wYXJzZV9kaWN0ICggYXZwLCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIE5VTEwgKSApOworCQkJCQlBU1NFUlQoIGFoZHItPmF2cF92YWx1ZSApOworCQkJCQlhX3JjID0gYWhkci0+YXZwX3ZhbHVlOworCisJCQkJCWlmIChhX3JjLT51MzIgIT0gRVJfRElBTUVURVJfUkVESVJFQ1RfSU5ESUNBVElPTikgeworCQkJCQkJLyogSXQgaXMgbm90IGEgUkVESVJFQ1QgZXJyb3IsIHdlIGRvbid0IGRvIGFueXRoaW5nICovCisJCQkJCQlnb3RvIG91dDsKKwkJCQkJfQorCQkJCQlicmVhazsKKworCQkJCWNhc2UgQUNfUkVESVJFQ1RfSE9TVDoKKwkJCQkJeworCQkJCQkJc3RydWN0IHJlZGlyX2hvc3QgKiBoID0gTlVMTDsKKwkJCQkJCURpYW1JZF90IGlkID0gTlVMTDsKKwkJCQkJCXNpemVfdAkgbGVuID0gMDsKKwkJCQkJCWludCAJIHNlY3VyZSA9IDA7CisJCQkJCQl1aW50MTZfdCBwb3J0ID0gMDsKKwkJCQkJCWludAkgbDQgPSAwOworCQkJCQkJY2hhcgkgcHJvdG8gPSAwOworCisJCQkJCQkvKiBQYXJzZSB0aGlzIEFWUCAqLworCQkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfcGFyc2VfZGljdCAoIGF2cCwgZmRfZ19jb25maWctPmNuZl9kaWN0LCBOVUxMICkgKTsKKwkJCQkJCUFTU0VSVCggYWhkci0+YXZwX3ZhbHVlICk7CisKKwkJCQkJCW5icmgrKzsKKworCQkJCQkJQ0hFQ0tfRkNUX0RPKCBmZF9vc19wYXJzZV9EaWFtZXRlclVSSShhaGRyLT5hdnBfdmFsdWUtPm9zLmRhdGEsIGFoZHItPmF2cF92YWx1ZS0+b3MubGVuLAorCQkJCQkJCQkJJmlkLCAmbGVuLCAmc2VjdXJlLCAmcG9ydCwgJmw0LCAmcHJvdG8pLAorCQkJCQkJCXsKKwkJCQkJCQkJVFJBQ0VfREVCVUcoSU5GTywgIlJlY2VpdmVkIGFuIGludmFsaWQgUmVkaXJlY3QtSG9zdCBBVlAgdmFsdWUgKCclLipzJyksIGlnbm9yZWQiLCAoaW50KWFoZHItPmF2cF92YWx1ZS0+b3MubGVuLCBhaGRyLT5hdnBfdmFsdWUtPm9zLmRhdGEpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9ICk7CisKKwkJCQkJCS8qIE5vdyBjaGVjayBpZiB0aGUgdHJhbnNwb3J0ICYgcHJvdG9jb2wgYXJlIHN1cHBvcnRlZCAqLworCQkJCQkJaWYgKHByb3RvICYmIChwcm90byAhPSAnZCcpKSB7CisJCQkJCQkJVFJBQ0VfREVCVUcoRlVMTCwgIklnbm9yZWQgdW5zdXBwb3J0ZWQgbm9uLURpYW1ldGVyIFJlZGlyZWN0LUhvc3QgQVZQICglLipzKSIsIChpbnQpYWhkci0+YXZwX3ZhbHVlLT5vcy5sZW4sIGFoZHItPmF2cF92YWx1ZS0+b3MuZGF0YSk7CisJCQkJCQkJZnJlZShpZCk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQlpZiAobDQgJiYgKGw0ID09IElQUFJPVE9fVURQKSkgeworCQkJCQkJCVRSQUNFX0RFQlVHKEZVTEwsICJJZ25vcmVkIHVuc3VwcG9ydGVkIFVEUCBSZWRpcmVjdC1Ib3N0IEFWUCAoJS4qcykiLCAoaW50KWFoZHItPmF2cF92YWx1ZS0+b3MubGVuLCBhaGRyLT5hdnBfdmFsdWUtPm9zLmRhdGEpOworCQkJCQkJCWZyZWUoaWQpOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCisJCQkJCQkvKiBJdCBsb29rcyBPSywgc2F2ZSB0aGlzIGVudHJ5LiAqLworCisJCQkJCQlDSEVDS19NQUxMT0MoIGggPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCByZWRpcl9ob3N0KSkgKTsKKwkJCQkJCW1lbXNldChoLCAwLCBzaXplb2Yoc3RydWN0IHJlZGlyX2hvc3QpKTsKKwkJCQkJCWZkX2xpc3RfaW5pdCgmaC0+Y2hhaW4sIGgpOworCQkJCQkJaC0+aWQgPSBpZDsKKwkJCQkJCWgtPmxlbiA9IGxlbjsKKwkJCQkJCS8qIGxhdGVyOiBzZWN1cmUsIHBvcnQgKi8KKworCQkJCQkJLyogVGhlIGxpc3QgaXMga2VwdCBvcmRlcmVkIGJ5IGlkIHNvIHRoYXQgaXQgaXMgZmFzdGVyIHRvIGNvbXBhcmUgdG8gY2FuZGlkYXRlcyBsYXRlciAqLworCQkJCQkJZm9yIChsaSA9IHRhc2sucmgubmV4dDsgbGkgIT0gJnRhc2sucmg7IGxpID0gbGktPm5leHQpIHsKKwkJCQkJCQlzdHJ1Y3QgcmVkaXJfaG9zdCAqIG5ob3N0ID0gbGktPm87CisJCQkJCQkJaWYgKCBmZF9vc19jbXAoaWQsIGxlbiwgbmhvc3QtPmlkLCBuaG9zdC0+bGVuKSA8PSAwICkKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQlmZF9saXN0X2luc2VydF9iZWZvcmUobGksICZoLT5jaGFpbik7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIEFDX1JFRElSRUNUX0hPU1RfVVNBR0U6CisJCQkJCS8qIFBhcnNlIHRoaXMgQVZQICovCisJCQkJCUNIRUNLX0ZDVCggZmRfbXNnX3BhcnNlX2RpY3QgKCBhdnAsIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgTlVMTCApICk7CisJCQkJCUFTU0VSVCggYWhkci0+YXZwX3ZhbHVlICk7CisJCQkJCWFfcmh1ID0gYWhkci0+YXZwX3ZhbHVlOworCQkJCQlpZiAoYV9yaHUtPnUzMiA+IEhfVV9NQVgpIHsKKwkJCQkJCVRSQUNFX0RFQlVHKElORk8sICJSZWNlaXZlZCB1bnN1cHBvcnRlZCBSZWRpcmVjdC1Ib3N0LVVzYWdlIHZhbHVlICglZCksIGRlZmF1bHRpbmcgdG8gRE9OVF9DQUNIRSIsIGFfcmh1LT51MzIpOworCQkJCQl9IGVsc2UgeworCQkJCQkJdGFzay5yaHUgPSBhX3JodS0+dTMyOworCQkJCQl9CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBBQ19SRURJUkVDVF9NQVhfQ0FDSEVfVElNRToKKwkJCQkJLyogUGFyc2UgdGhpcyBBVlAgKi8KKwkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfcGFyc2VfZGljdCAoIGF2cCwgZmRfZ19jb25maWctPmNuZl9kaWN0LCBOVUxMICkgKTsKKwkJCQkJQVNTRVJUKCBhaGRyLT5hdnBfdmFsdWUgKTsKKwkJCQkJYV9ybWN0ID0gYWhkci0+YXZwX3ZhbHVlOworCQkJCQl0YXNrLnJtY3QgPSBhX3JtY3QtPnUzMjsKKwkJCQkJYnJlYWs7CisKKwkJCX0KKwkJfQorCisJCS8qIEdvIHRvIG5leHQgQVZQICovCisJCUNIRUNLX0ZDVCggIGZkX21zZ19icm93c2UoYXZwLCBNU0dfQlJXX05FWFQsICZhdnAsIE5VTEwpICApOworCX0KKworCS8qIENoZWNrIHdlIGhhdmUgcmVjZWl2ZWQgdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiAqLworCWlmICghYV9yYykgeworCQlUUkFDRV9ERUJVRyhGVUxMLCAiSW52YWxpZCBEaWFtZXRlciBhbnN3ZXIgd2l0aG91dCBhIFJlc3VsdC1Db2RlIEFWUCwgUmVkaXJlY3QgbW9kdWxlIGdhdmUgdXAiKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKCFhX29oKSB7CisJCVRSQUNFX0RFQlVHKEZVTEwsICJJbnZhbGlkIERpYW1ldGVyIGFuc3dlciB3aXRob3V0IGFuIE9yaWdpbi1Ib3N0IEFWUCwgUmVkaXJlY3QgbW9kdWxlIGdhdmUgdXAiKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKEZEX0lTX0xJU1RfRU1QVFkoJnRhc2sucmgpKSB7CisJCVRSQUNFX0RFQlVHKEZVTEwsICJEaWFtZXRlciBhbnN3ZXIgd2l0aCBhIERJQU1FVEVSX1JFRElSRUNUX0lORElDQVRJT04gUmVzdWx0LUNvZGUgQVZQIGJ1dCBubyB2YWxpZC9zdXBwb3J0ZWQgUmVkaXJlY3QtSG9zdCBBVlAsIFJlZGlyZWN0IG1vZHVsZSBnYXZlIHVwIik7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChhX3JodSAmJiAodGFzay5yaHUgIT0gRE9OVF9DQUNIRSkgJiYgIWFfcm1jdCkgeworCQlUUkFDRV9ERUJVRyhGVUxMLCAiSW52YWxpZCBEaWFtZXRlciBSZWRpcmVjdCBhbnN3ZXIgd2l0aCBhIFJlZGlyZWN0LUhvc3QtVXNhZ2UgQVZQIGJ1dCBubyBSZWRpcmVjdC1NYXgtQ2FjaGUtVGltZSwgUmVkaXJlY3QgbW9kdWxlIGdhdmUgdXAiKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogSXQgbG9va3MgbGlrZSB3ZSBjYW4gcHJvY2VzcyB0aGUgUmVkaXJlY3QgaW5kaWNhdGlvbiAqLworCisJLyogU2VhcmNoIGZvciB0aGUgcGVlcnMgd2UgYWxyZWFkeSBrbm93ICovCisJZm9yIChsaSA9IHRhc2sucmgubmV4dDsgbGkgIT0gJnRhc2sucmg7IGxpID0gbGktPm5leHQpIHsKKwkJc3RydWN0IHJlZGlyX2hvc3QgKiBoID0gbGktPm87CisJCXN0cnVjdCBwZWVyX2hkciAqIHBlZXI7CisKKwkJQ0hFQ0tfRkNUKCBmZF9wZWVyX2dldGJ5aWQoIGgtPmlkLCBoLT5sZW4sIDEsICZwZWVyICkgKTsKKwkJaWYgKHBlZXIpIHsKKwkJCWtub3duICsrOworCQkJbWVtY3B5KGgtPmlkLCBwZWVyLT5pbmZvLnBpX2RpYW1pZCwgaC0+bGVuKTsgLyogT3ZlcndyaXRlIHRoZSBjYXNlIHNvIHdlIGNhbiBzZWFyY2ggY2FzZS1zZW5zaXRpdmUgZnJvbSBoZXJlIG9uICovCisJCQlpZiAoZmRfcGVlcl9nZXRfc3RhdGUocGVlcikgPT0gU1RBVEVfT1BFTikgeworCQkJCWFjdGl2ZXMgKys7CisJCQl9CisJCX0KKwl9CisKKwlUUkFDRV9ERUJVRyhGVUxMLCAiUmVkaXJlY3QgbW9kdWxlOiByZWNlaXZlZCAlZCBSZWRpcmVjdC1Ib3N0cywgJWQgYXJlIGtub3duIHBlZXJzLCAlZCBoYXZlIGFuIE9QRU4gY29ubmVjdGlvbiIsIG5icmgsIGtub3duLCBhY3RpdmVzKTsKKworCS8qIGluIHRoaXMgdmVyc2lvbiwgd2Ugb25seSByZWRpcmVjdCB3aGVuIHRoZXJlIGFyZSBrbm93biBhY3RpdmUgcGVlcnMuIFRPRE86IGFkZCBuZXcgcGVlcnMgdmlhIGZkX3BlZXJfYWRkIHdoZW4gbm8gYWN0aXZlIHBlZXIgaXMgYXZhaWxhYmxlICovCisKKwlpZiAoIWFjdGl2ZXMpIHsKKwkJVFJBQ0VfREVCVUcoSU5GTywgIlVuYWJsZSB0byBjb21wbHkgdG8gUmVkaXJlY3QgaW5kaWNhdGlvbjogbm9uZSBvZiB0aGUgcGVlcnMgaW5jbHVkZWQgaXMgaW4gT1BFTiBzdGF0ZSIpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBGcm9tIHRoaXMgcG9pbnQsIHdlIHdpbGwgcmUtc2VuZCB0aGUgcXVlcnkgdG8gYSBkaWZmZXJlbnQgcGVlciwgc28gc3RvcCBmb3J3YXJkaW5nIHRoZSBhbnN3ZXIgaGVyZSAqLworCSptc2cgPSBOVUxMOworCisJLyogR2V0IHRoZSBxdWVyeSdzIHJvdXRpbmcgZGF0YSAmIGFkZCB0aGUgbmV3IGVycm9yICovCisJQ0hFQ0tfRkNUKCBmZF9tc2dfYW5zd19nZXRxKG0sICZxKSApOworCUNIRUNLX0ZDVCggZmRfbXNnX3J0X2dldChxLCAmcnRkKSApOworCUNIRUNLX0ZDVCggZmRfbXNnX3NvdXJjZV9nZXQoIG0sICZuaCwgJm5obGVuICkgKTsKKwlDSEVDS19GQ1QoIGZkX3J0ZF9lcnJvcl9hZGQocnRkLCBuaCwgbmhsZW4sIGFfb2gtPm9zLmRhdGEsIGFfb2gtPm9zLmxlbiwgYV9yYy0+dTMyLCBOVUxMLCBOVUxMKSApOworCisJLyogQ3JlYXRlIGEgcmVkaXJfcnVsZSAgKi8KKwlDSEVDS19GQ1QoIHJlZGlyX2VudHJ5X25ldygmZW50cnksICZ0YXNrLnJoLCB0YXNrLnJodSwgcSwgbmgsIG5obGVuLCBhX29oLT5vcy5kYXRhLCBhX29oLT5vcy5sZW4pICk7CisKKwlDSEVDS19QT1NJWCggIHB0aHJlYWRfbXV0ZXhfbG9jaygmcmVkaXJfZXhwX3BlZXJfbG9jaykgICk7CisJLyogSW5zZXJ0IGluIHRoZSBzcGxpdCBsaXN0ICovCisJQ0hFQ0tfRkNUKCByZWRpcl9lbnRyeV9pbnNlcnQoZW50cnkpICk7CisJLyogU2V0IHRoZSBleHBpcnkgKi8KKwlDSEVDS19GQ1QoIHJlZGlyX2V4cF9zZXQoZW50cnksIHRhc2sucm1jdCA/OiBERUZBVUxUX0VYUElSRV9USU1FKSApOworCUNIRUNLX1BPU0lYKCAgcHRocmVhZF9tdXRleF91bmxvY2soJnJlZGlyX2V4cF9wZWVyX2xvY2spICApOworCisJLyogTm93IHdlIGNhbiBnZXQgcmlkIG9mIHRoZSByZWNlaXZlZCBhbnN3ZXIgYW5kIHNlbmQgYWdhaW4gdGhlIHF1ZXJ5LiAqLworCUNIRUNLX0ZDVCggZmRfbXNnX2Fuc3dfZGV0YWNoKG0pICk7CisJQ0hFQ0tfRkNUKCBmZF9tc2dfZnJlZShtKSApOworCisJLyogU2VuZCBpdCAqLworCUNIRUNLX0ZDVCggZmRfbXNnX3NlbmQoJnEsIE5VTEwsIE5VTEwpICk7CisKKwkvKiBEb25lISAqLworCitvdXQ6CisJd2hpbGUgKCFGRF9JU19MSVNUX0VNUFRZKCZ0YXNrLnJoKSkgeworCQlzdHJ1Y3QgcmVkaXJfaG9zdCAqIGggPSB0YXNrLnJoLm5leHQtPm87CisJCWZkX2xpc3RfdW5saW5rKCZoLT5jaGFpbik7CisJCWZyZWUoaC0+aWQpOworCQlmcmVlKGgpOworCX0KKworCXJldHVybiAwOworCit9CisKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvcnRfcmVkaXJlY3QvcmVkaXJfb3V0LmMgYi9leHRlbnNpb25zL3J0X3JlZGlyZWN0L3JlZGlyX291dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmODBmNTIKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL3J0X3JlZGlyZWN0L3JlZGlyX291dC5jCkBAIC0wLDAgKzEsMzIzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcnM6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCSAqCisqIGFuZCBUaG9tYXMgS2xhdXNuZXIgPHRrQGdpZ2Eub3IuYXQ+CQkJCQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE0LCBXSURFIFByb2plY3QgYW5kIE5JQ1QJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAicnRfcmVkaXIuaCIKKworCisvKiBGaW5kIHRoZSBkYXRhIHBlcnRpbmVudCB0byBhIHR5cGUgaW4gdGhlIGlucHV0IGRhdGEgKi8KK3N0YXRpYyBpbnQgZ2V0X2RhdGFfdG9fbWF0Y2goZW51bSByZWRpcl9oX3UgdHlwZSwgc3RydWN0IG1zZyAqbXNnLCB1bmlvbiBtYXRjaGRhdGEgKiBkYXRhLCBpbnQgKiBub2RhdGEpCit7CisJVFJBQ0VfRU5UUlkoIiVkICVwICVwICVwIiwgdHlwZSwgbXNnLCBkYXRhLCBub2RhdGEpOworCisJLyogSW5pdGlhbGl6ZSB0aGUgZGF0YSBhcmVhICovCisJbWVtc2V0KGRhdGEsIDAsIHNpemVvZih1bmlvbiBtYXRjaGRhdGEpKTsKKwkqbm9kYXRhID0gMDsKKworCS8qIE5vdywgZmluZCB0aGUgYXBwcm9wcmlhdGUgaW5mb3JtYXRpb24sIGRlcGVuZGluZyBvbiB0eXBlICovCisJc3dpdGNoICh0eXBlKSB7CisJCWNhc2UgRE9OVF9DQUNIRToKKwkJCWRhdGEtPm1lc3NhZ2UubXNnID0gbXNnOworCQkJYnJlYWs7CisKKwkJY2FzZSBBTExfU0VTU0lPTjoKKwkJCXsKKwkJCQkvKiBHZXQgdGhlIHNpZCBmcm9tIHRoZSBtZXNzYWdlICovCisJCQkJc3RydWN0IHNlc3Npb24gKiBzZXNzOworCQkJCUNIRUNLX0ZDVCggZmRfbXNnX3Nlc3NfZ2V0KGZkX2dfY29uZmlnLT5jbmZfZGljdCwgbXNnLCAmc2VzcywgTlVMTCkgKTsKKwkJCQlpZiAoIXNlc3MpIHsKKwkJCQkJVFJBQ0VfREVCVUcoQU5OT1lJTkcsICJNZXNzYWdlICVwIGNhbm5vdCBtYXRjaCBhbnkgQUxMX1NFU1NJT04gcnVsZSBzaW5jZSBpdCBkb2VzIG5vdCBoYXZlIGEgU2Vzc2lvbi1JZCIsIG1zZyk7CisJCQkJCSpub2RhdGEgPSAxOworCQkJCX0gZWxzZSB7CisJCQkJCUNIRUNLX0ZDVCggZmRfc2Vzc19nZXRzaWQoc2VzcywgJmRhdGEtPnNlc3Npb24ucywgJmRhdGEtPnNlc3Npb24ubCkgKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIEFMTF9SRUFMTToKKwkJCXsKKwkJCQkvKiBTZWFyY2ggdGhlIERlc3RpbmF0aW9uLVJlYWxtIGluIHRoZSBtZXNzYWdlICovCisJCQkJc3RydWN0IGF2cCAqIGRyOworCQkJCUNIRUNLX0ZDVCggZmRfbXNnX3NlYXJjaF9hdnAobXNnLCByZWRpcl9kaWN0X2RyLCAmZHIpICk7CisJCQkJaWYgKCFkcikgeworCQkJCQlUUkFDRV9ERUJVRyhBTk5PWUlORywgIk1lc3NhZ2UgJXAgY2Fubm90IG1hdGNoIGFueSBBTExfUkVBTE0gcnVsZSBzaW5jZSBpdCBkb2VzIG5vdCBoYXZlIGEgRGVzdGluYXRpb24tUmVhbG0iLCBtc2cpOworCQkJCQkqbm9kYXRhID0gMTsKKwkJCQl9IGVsc2UgeworCQkJCQlzdHJ1Y3QgYXZwX2hkciAqIGFoZHI7CisJCQkJCUNIRUNLX0ZDVCggIGZkX21zZ19hdnBfaGRyKCBkciwgJmFoZHIgKSAgKTsKKwkJCQkJZGF0YS0+cmVhbG0ucyA9IGFoZHItPmF2cF92YWx1ZS0+b3MuZGF0YTsKKwkJCQkJZGF0YS0+cmVhbG0ubCA9IGFoZHItPmF2cF92YWx1ZS0+b3MubGVuOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkVBTE1fQU5EX0FQUExJQ0FUSU9OOgorCQkJeworCQkJCS8qIFNlYXJjaCB0aGUgRGVzdGluYXRpb24tUmVhbG0gb2YgdGhlIG1lc3NhZ2UgKi8KKwkJCQlzdHJ1Y3QgYXZwICogZHI7CisJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfc2VhcmNoX2F2cChtc2csIHJlZGlyX2RpY3RfZHIsICZkcikgKTsKKwkJCQlpZiAoIWRyKSB7CisJCQkJCVRSQUNFX0RFQlVHKEFOTk9ZSU5HLCAiTWVzc2FnZSAlcCBjYW5ub3QgbWF0Y2ggYW55IFJFQUxNX0FORF9BUFBMSUNBVElPTiBydWxlIHNpbmNlIGl0IGRvZXMgbm90IGhhdmUgYSBEZXN0aW5hdGlvbi1SZWFsbSIsIG1zZyk7CisJCQkJCSpub2RhdGEgPSAxOworCQkJCX0gZWxzZSB7CisJCQkJCXN0cnVjdCBhdnBfaGRyICogYWhkcjsKKwkJCQkJQ0hFQ0tfRkNUKCAgZmRfbXNnX2F2cF9oZHIoIGRyLCAmYWhkciApICApOworCQkJCQlkYXRhLT5yZWFsbV9hcHAucyA9IGFoZHItPmF2cF92YWx1ZS0+b3MuZGF0YTsKKwkJCQkJZGF0YS0+cmVhbG1fYXBwLmwgPSBhaGRyLT5hdnBfdmFsdWUtPm9zLmxlbjsKKworCQkJCQkvKiBhbmQgdGhlbiB0aGUgYXBwbGljYXRpb24gKi8KKwkJCQkJeworCQkJCQkJc3RydWN0IG1zZ19oZHIgKiBoZHI7CisJCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19oZHIobXNnLCAmaGRyKSApOworCQkJCQkJZGF0YS0+cmVhbG1fYXBwLmEgPSBoZHItPm1zZ19hcHBsOworCQkJCQkJLyogU2hvdWxkIHdlIGZvcmJpZCBhcHBsaWNhdGlvbiAwPyAqLworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBBTExfQVBQTElDQVRJT046CisJCQl7CisJCQkJLyogUmV0cmlldmUgdGhlIGFwcGxpY2F0aW9uIGZyb20gdGhlIG1lc3NhZ2UgKi8KKwkJCQlzdHJ1Y3QgbXNnX2hkciAqIGhkcjsKKwkJCQlDSEVDS19GQ1QoIGZkX21zZ19oZHIobXNnLCAmaGRyKSApOworCQkJCWRhdGEtPmFwcC5hID0gaGRyLT5tc2dfYXBwbDsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgQUxMX0hPU1Q6CisJCQkJLyogVGhpcyBpcyBtb3JlIGNvbXBsZXgsIHdlIG5lZWQgdG8gbWF0Y2ggd2l0aCBhbGwgY2FuZGlkYXRlcyBpbiBlYWNoIHJ1bGUsIGl0J2xsIGJlIGRvbmUgbGF0ZXIgKi8KKwkJCWJyZWFrOworCisJCWNhc2UgQUxMX1VTRVI6CisJCQl7CisJCQkJLyogU2VhcmNoIHRoZSBVc2VyLU5hbWUgb2YgdGhlIG1lc3NhZ2UgKi8KKwkJCQlzdHJ1Y3QgYXZwICogdW47CisJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfc2VhcmNoX2F2cChtc2csIHJlZGlyX2RpY3RfdW4sICZ1bikgKTsKKwkJCQlpZiAoIXVuKSB7CisJCQkJCVRSQUNFX0RFQlVHKEFOTk9ZSU5HLCAiTWVzc2FnZSAlcCBjYW5ub3QgbWF0Y2ggYW55IEFMTF9VU0VSIHJ1bGUgc2luY2UgaXQgZG9lcyBub3QgaGF2ZSBhIFVzZXItTmFtZSIsIG1zZyk7CisJCQkJCSpub2RhdGEgPSAxOworCQkJCX0gZWxzZSB7CisJCQkJCXN0cnVjdCBhdnBfaGRyICogYWhkcjsKKwkJCQkJQ0hFQ0tfRkNUKCAgZmRfbXNnX2F2cF9oZHIoIHVuLCAmYWhkciApICApOworCQkJCQlkYXRhLT51c2VyLnMgPSBhaGRyLT5hdnBfdmFsdWUtPm9zLmRhdGE7CisJCQkJCWRhdGEtPnVzZXIubCA9IGFoZHItPmF2cF92YWx1ZS0+b3MubGVuOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlBU1NFUlQoMCk7CisJCQlyZXR1cm4gRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCisKKy8qIEFwcGx5IHRoZSBzY29yZSBmcm9tIGEgcnVsZSBpZiB0aGUgY2FuZGlkYXRlIGxpc3QgaXMgYXBwcm9wcmlhdGUgKi8KK3N0YXRpYyBpbnQgYXBwbHlfcnVsZShzdHJ1Y3QgcmVkaXJfZW50cnkgKiBlLCBzdHJ1Y3QgbXNnICogbXNnLCBzdHJ1Y3QgZmRfbGlzdCAqIGNhbmRpZGF0ZXMpCit7CisJc3RydWN0IGZkX2xpc3QgKiBsaWMsICpsaXJoOworCXN0cnVjdCBydGRfY2FuZGlkYXRlICogY19vaCA9IE5VTEw7CisJaW50IGNtcDsKKworCVRSQUNFX0VOVFJZKCIlcCAlcCAlcCIsIGUsIG1zZywgY2FuZGlkYXRlcyk7CisJQVNTRVJUKCBlICYmIG1zZyAmJiBjYW5kaWRhdGVzICk7CisKKwlpZiAoRkRfSVNfTElTVF9FTVBUWShjYW5kaWRhdGVzKSkgeworCQlUUkFDRV9ERUJVRyhBTk5PWUlORywgIlNraXAgUmVkaXJlY3QgcnVsZSBzaW5jZSBjYW5kaWRhdGVzIGxpc3QgaXMgZW1wdHkiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogTm93IHNlYXJjaCBjb21tb24gcGVlcnMgYmV0d2VlbiBlLT50YXJnZXRfcGVlcnNfbGlzdCBhbmQgY2FuZGlkYXRlcyAqLworCVRSQUNFX0RFQlVHKEFOTk9ZSU5HLCAiTWVzc2FnZSAlcCBtYXRjaGVzIGEgUmVkaXJlY3QgcnVsZSAodDolZCwgQCVwKSwgcHJvY2Vzc2luZyBjYW5kaWRhdGVzIGxpc3QiLCBtc2csIGUtPnR5cGUsIGUpOworCisJLyogRmlyc3QsIGRlY3JlYXNlIHRoZSBzY29yZSBvZiB0aGUgaG9zdCB0aGF0IHdlIHJlY2VpdmVkIHRoZSBwcmV2aW91cyBSZWRpcmVjdCBmcm9tLCBpbiBjYXNlIGl0IGlzIGluIHRoZSBsaXN0ICovCisJZm9yIChsaWMgPSBjYW5kaWRhdGVzLT5uZXh0OyBsaWMgIT0gY2FuZGlkYXRlczsgbGljID0gbGljLT5uZXh0KSB7CisJCXN0cnVjdCBydGRfY2FuZGlkYXRlICogY2FuZCA9IChzdHJ1Y3QgcnRkX2NhbmRpZGF0ZSAqKSBsaWM7CisKKwkJLyogU3BlY2lhbCBjYXNlOiBBTExfSE9TVCBydWxlczogd2UgZGVjcmVhc2UgdGhlIHNjb3JlIG9mIHRoZSBPcmlnaW4tSG9zdCBpZiBwcmVzZW50ICovCisJCWlmIChlLT50eXBlID09IEFMTF9IT1NUKSB7CisJCQljbXAgPSBmZF9vc19hbG1vc3RjYXNlc3JjaChjYW5kLT5kaWFtaWQsIGNhbmQtPmRpYW1pZGxlbiwgZS0+ZGF0YS5ob3N0LnMsIGUtPmRhdGEuaG9zdC5sLCBOVUxMKTsKKwkJCWlmICghY21wKSB7CisJCQkJVFJBQ0VfREVCVUcoRlVMTCwgIlJlZGlyZWN0IG1zZyAlcDogcGVlciAnJS4qcycgKz0gJWQgKHByZXZpb3VzIEFMTF9IT1NUIFJlZGlyZWN0IG9yaWdpbmF0ZWQgZnJvbSB0aGlzIHBlZXIpIiwgbXNnLCAoaW50KWNhbmQtPmRpYW1pZGxlbiwgY2FuZC0+ZGlhbWlkLCBGRF9TQ09SRV9TRU5UX1JFRElSRUNUKTsKKwkJCQljYW5kLT5zY29yZSArPSBGRF9TQ09SRV9TRU5UX1JFRElSRUNUOworCQkJCWNfb2ggPSBjYW5kOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisKKwkJY21wID0gZmRfb3NfY21wKGNhbmQtPmRpYW1pZCwgY2FuZC0+ZGlhbWlkbGVuLCBlLT5mcm9tLnMsIGUtPmZyb20ubCk7CisJCWlmICghY21wKSB7CisJCQlUUkFDRV9ERUJVRyhGVUxMLCAiUmVkaXJlY3QgbXNnICVwOiBwZWVyICclLipzJyArPSAlZCAocHJldmlvdXMgUmVkaXJlY3QgcmVjZWl2ZWQgZnJvbSB0aGlzIHBlZXIpIiwgbXNnLCAoaW50KWNhbmQtPmRpYW1pZGxlbiwgY2FuZC0+ZGlhbWlkLCBGRF9TQ09SRV9TRU5UX1JFRElSRUNUKTsKKwkJCWNhbmQtPnNjb3JlICs9IEZEX1NDT1JFX1NFTlRfUkVESVJFQ1Q7CisJCX0KKworCX0KKworCWlmICgoZS0+dHlwZSA9PSBBTExfSE9TVCkgJiYgKGNfb2ggPT0gTlVMTCkpIHsKKwkJLyogVGhlIHJ1bGUgZG9lcyBub3QgYXBwbHksIHdlJ3JlIGRvbmUgKi8KKwkJcmV0dXJuIDA7CisJfQorCisJLyogZm9yIGVhY2ggY2FuZGlkYXRlLCBpZiBpdCBpcyBmb3VuZCBpbiB0aGUgdGFyZ2V0X3BlZXJzIGxpc3QsIHdlIGFkZCB0aGUgcnVsZSdzIHNjb3JlIHRvIHRoaXMgY2FuZGlkYXRlICovCisJZm9yIChsaWMgPSBjYW5kaWRhdGVzLT5uZXh0OyBsaWMgIT0gY2FuZGlkYXRlczsgbGljID0gbGljLT5uZXh0KSB7CisJCS8qIHRoZSBjYW5kaWRhdGVzIGxpc3QgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgb3JkZXJlZCBhdCB0aGlzIHRpbWUsIHNvIHdlIGNhbm5vdCBhdm9pZCB0aGUgdHdvIGltYnJpY2F0ZWQgbG9vcHMgKi8KKwkJc3RydWN0IHJ0ZF9jYW5kaWRhdGUgKiBjYW5kID0gKHN0cnVjdCBydGRfY2FuZGlkYXRlICopIGxpYzsKKworCQkvKiBJcyB0aGlzIGNhbmRpZGF0ZSBpbiB0aGUgIlJlZGlyZWN0LUhvc3QiIGxpc3QgPyBXZSBtdXN0IHNlYXJjaCBjYXNlaW5zZW50aXZlIGhlcmUuICovCisJCWZvciAobGlyaCA9IGUtPnRhcmdldF9wZWVyc19saXN0Lm5leHQ7IGxpcmggIT0gJmUtPnRhcmdldF9wZWVyc19saXN0OyBsaXJoID0gbGlyaC0+bmV4dCkgeworCQkJc3RydWN0IHJlZGlyX2hvc3QgKiBob3N0ID0gbGlyaC0+bzsKKwkJCWludCBjb250OworCisJCQljbXAgPSBmZF9vc19hbG1vc3RjYXNlc3JjaCggY2FuZC0+ZGlhbWlkLCBjYW5kLT5kaWFtaWRsZW4sIGhvc3QtPmlkLCBob3N0LT5sZW4sICZjb250ICk7CisKKwkJCWlmIChjbXAgPT0gMCkgeworCQkJCVRSQUNFX0RFQlVHKEZVTEwsICJSZWRpcmVjdCBtc2cgJXA6IHBlZXIgJyUuKnMnICs9ICVkIChydWxlIHQ6JWQgQCVwKSIsIG1zZywgKGludCljYW5kLT5kaWFtaWRsZW4sIGNhbmQtPmRpYW1pZCwgcmVkaXJlY3RzX3VzYWdlc1tlLT50eXBlXS5zY29yZSwgZS0+dHlwZSwgZSk7CisJCQkJY2FuZC0+c2NvcmUgKz0gcmVkaXJlY3RzX3VzYWdlc1tlLT50eXBlXS5zY29yZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICghY29udCkKKwkJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlZGlyX2V4aXN0X2Zvcl90eXBlKGludCBydWxlX3R5cGUpCit7CisJaW50IHJldDsKKworCXN3aXRjaChydWxlX3R5cGUpIHsKKwljYXNlIEFMTF9TRVNTSU9OOgorCWNhc2UgQUxMX1VTRVI6CisJCXJldCA9IHJlZGlyZWN0X2hhc2hfdGFibGVbcnVsZV90eXBlXSAhPSBOVUxMOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAhRkRfSVNfTElTVF9FTVBUWSgmcmVkaXJlY3RzX3VzYWdlc1tydWxlX3R5cGVdLnNlbnRpbmVsKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbWF0Y2hfbWVzc2FnZShpbnQgcnVsZV90eXBlLCBzdHJ1Y3QgbXNnICptc2csIHVuaW9uIG1hdGNoZGF0YSAqZGF0YSwgc3RydWN0IGZkX2xpc3QgKiBjYW5kaWRhdGVzKQoreworCXN0cnVjdCBmZF9saXN0ICogbGk7CisJc3RydWN0IHJlZGlyX2VudHJ5ICogZSA9IE5VTEw7CisJaW50IHJldCA9IDA7CisKKwlzd2l0Y2gocnVsZV90eXBlKSB7CisJY2FzZSBBTExfU0VTU0lPTjoKKwkJSEFTSF9GSU5EKGhoLCByZWRpcmVjdF9oYXNoX3RhYmxlW3J1bGVfdHlwZV0sIGRhdGEtPnNlc3Npb24ucywgZGF0YS0+c2Vzc2lvbi5sLCBlKTsKKwkJaWYgKGUpIHsKKwkJCS8qIFRoaXMgbWVzc2FnZSBtYXRjaGVzIGEgcnVsZSwgYXBwbHkgKi8KKwkJCUNIRUNLX0ZDVF9ETyggcmV0ID0gYXBwbHlfcnVsZShlLCBtc2csIGNhbmRpZGF0ZXMpLCBicmVhayApOworCQl9CisJCWJyZWFrOworCWNhc2UgQUxMX1VTRVI6CisJCUhBU0hfRklORChoaCwgcmVkaXJlY3RfaGFzaF90YWJsZVtydWxlX3R5cGVdLCBkYXRhLT51c2VyLnMsIGRhdGEtPnVzZXIubCwgZSk7CisJCWlmIChlKSB7CisJCQkvKiBUaGlzIG1lc3NhZ2UgbWF0Y2hlcyBhIHJ1bGUsIGFwcGx5ICovCisJCQlDSEVDS19GQ1RfRE8oIHJldCA9IGFwcGx5X3J1bGUoZSwgbXNnLCBjYW5kaWRhdGVzKSwgYnJlYWsgKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBBdHRlbXB0IGVhY2ggcnVsZSB3ZSBoYXZlIHN0b3JlZCAqLworCQlmb3IgKGxpID0gcmVkaXJlY3RzX3VzYWdlc1tydWxlX3R5cGVdLnNlbnRpbmVsLm5leHQ7IGxpICE9ICZyZWRpcmVjdHNfdXNhZ2VzW3J1bGVfdHlwZV0uc2VudGluZWw7IGxpID0gbGktPm5leHQpIHsKKwkJCWUgPSBsaS0+bzsKKworCQkJLyogRG9lcyBpdCBtYXRjaCA/ICovCisJCQlpZiAocnVsZV90eXBlICE9IEFMTF9IT1NUKSB7IC8qIHRoaXMgb25lIGlzIGFuIGV4Y2VwdGlvbiwgd2UgaGFuZGxlIGl0IHNlcGFyYXRlbHkgKi8KKwkJCQlpbnQgY21wID0gcmVkaXJfZW50cnlfY21wX2tleVtydWxlX3R5cGVdKGRhdGEsICZlLT5kYXRhKTsKKwkJCQlpZiAoY21wID4gMCkKKwkJCQkJY29udGludWU7CisJCQkJaWYgKGNtcCA8IDApCisJCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiBUaGlzIHJ1bGUgbWF0Y2hlcyAob3Igd2UgYXJlIGluIEFMTF9IT1NUKSwgYXBwbHkgKi8KKwkJCUNIRUNLX0ZDVF9ETyggcmV0ID0gYXBwbHlfcnVsZShlLCBtc2csIGNhbmRpZGF0ZXMpLCBicmVhayApOworCisJCQkvKiBJZiB0aGlzIHdhcyBhIERPTlRfQ0FDSEUgcnVsZSwgd2UgdW5saW5rIGl0LCBzbyB0aGF0IGl0IHdpbGwgbm90IGJlIHVzZWQgYWdhaW4gKi8KKwkJCWlmIChydWxlX3R5cGUgPT0gRE9OVF9DQUNIRSkgeworCQkJCWxpID0gbGktPnByZXY7CisJCQkJZmRfbGlzdF91bmxpbmsoIGxpLT5uZXh0ICk7CisJCQkJLyogV2UgY2Fubm90IGRlbGV0ZSBoZXJlIHdpdGhvdXQgdGFraW5nIHRoZSBtdXRleCwgd2hpY2ggd291bGQgbWVhbiB3ZSBoYXZlIGZpcnN0IHRvIHJlbGVhc2UgdGhlIGxvY2suLi4KKwkJCQkgICBqdXN0IGxldCBleHBpcnkgZ2FyYmFnZSBjb2xsZWN0IHRoZSBydWxlICovCisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBPVVQgY2FsbGJhY2sgKi8KK2ludCByZWRpcl9vdXRfY2Iodm9pZCAqIGNiZGF0YSwgc3RydWN0IG1zZyAqKiBwbXNnLCBzdHJ1Y3QgZmRfbGlzdCAqIGNhbmRpZGF0ZXMpCit7CisJaW50IGksIHJldCA9IDA7CisJc3RydWN0IG1zZyAqIG1zZyA9ICpwbXNnOworCisJVFJBQ0VfRU5UUlkoIiVwICVwICVwIiwgY2JkYXRhLCBtc2csIGNhbmRpZGF0ZXMpOworCisJZm9yIChpID0gMDsgaSA8PSBIX1VfTUFYOyBpKyspIHsKKwkJLyogTG9jayB0aGUgbGluZS4gV2Ugd3JpdGUgbG9jayBpbiBjYXNlIG9mIERPTlRfQ0FDSEUgc28gd2UgY2FuIGRpcmVjdGx5IHVubGluayB0aGUgZW50cnkuIHJlYWQgaW4gb3RoZXIgY2FzZXMgaXMgc3VmZmljaWVudCAqLworCQlpZiAoaSA9PSBET05UX0NBQ0hFKSB7CisJCQlDSEVDS19QT1NJWCggcHRocmVhZF9yd2xvY2tfd3Jsb2NrKCAmcmVkaXJlY3RzX3VzYWdlc1tpXS5sb2NrICkgKTsKKwkJfSBlbHNlIHsKKwkJCUNIRUNLX1BPU0lYKCBwdGhyZWFkX3J3bG9ja19yZGxvY2soICZyZWRpcmVjdHNfdXNhZ2VzW2ldLmxvY2sgKSApOworCQl9CisKKwkJaWYgKHJlZGlyX2V4aXN0X2Zvcl90eXBlKGkpKSB7CisJCQl1bmlvbiBtYXRjaGRhdGEgZGF0YTsKKwkJCWludCBub2RhdGE7IC8qIFRoZSBtZXNzYWdlIGRvZXMgbm90IGFsbG93IHRvIGFwcGx5IHRoaXMgcnVsZSwgc2tpcCAqLworCisJCQkvKiBSZXRyaWV2ZSB0aGUgZGF0YSB0aGF0IG1heSBtYXRjaCBpbiB0aGUgbWVzc2FnZSAqLworCQkJQ0hFQ0tfRkNUX0RPKCByZXQgPSBnZXRfZGF0YV90b19tYXRjaChpLCBtc2csICZkYXRhLCAmbm9kYXRhKSwgZ290byBvdXQgKTsKKworCQkJLyogSWYgZGF0YSBmb3VuZCBmb3IgdGhpcyB0eXBlIG9mIHJ1bGUsIHRoZW4gdHJ5IG1hdGNoaW5nIGl0ICovCisJCQlpZiAoIW5vZGF0YSkKKwkJCQlyZXQgPSBtYXRjaF9tZXNzYWdlKGksIG1zZywgJmRhdGEsIGNhbmRpZGF0ZXMpOworCQl9CitvdXQ6CisJCUNIRUNLX1BPU0lYKCBwdGhyZWFkX3J3bG9ja191bmxvY2soICZyZWRpcmVjdHNfdXNhZ2VzW2ldLmxvY2sgKSApOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9ydF9yZWRpcmVjdC9ydF9yZWRpci5jIGIvZXh0ZW5zaW9ucy9ydF9yZWRpcmVjdC9ydF9yZWRpci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxYjVhOTMKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL3J0X3JlZGlyZWN0L3J0X3JlZGlyLmMKQEAgLTAsMCArMSw5MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3JzOiBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkgKgorKiBhbmQgVGhvbWFzIEtsYXVzbmVyIDx0a0BnaWdhLm9yLmF0PgkJCQkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNCwgV0lERSBQcm9qZWN0IGFuZCBOSUNUCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFdJREUgUHJvamVjdCBvciBOSUNUIG5vciB0aGUgCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgV0lERSBQcm9qZWN0IGFuZCAJCQkJCQkgKgorKiAgIE5JQ1QuCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInJ0X3JlZGlyLmgiCisKK3N0cnVjdCBkaWN0X29iamVjdCAqIHJlZGlyX2RpY3RfZHIgPSBOVUxMOworc3RydWN0IGRpY3Rfb2JqZWN0ICogcmVkaXJfZGljdF91biA9IE5VTEw7CisKK3N0YXRpYyBzdHJ1Y3QgZmRfcnRfZndkX2hkbCAqIGZ3ZF9oZGwgPSBOVUxMOworc3RhdGljIHN0cnVjdCBmZF9ydF9vdXRfaGRsICogb3V0X2hkbCA9IE5VTEw7CitzdGF0aWMgcHRocmVhZF90IGV4cF90aHIgID0gKHB0aHJlYWRfdClOVUxMOworCisvKiBJbml0aWFsaXplIHRoZSBtb2R1bGUgKi8KK3N0YXRpYyBpbnQgcmVkaXJfZW50cnkoY2hhciAqIGNvbmZmaWxlKQoreworCVRSQUNFX0VOVFJZKCIiKTsKKworCS8qIERpY3Rpb25hcnkgb2JqZWN0cyAqLworCUNIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIkRlc3RpbmF0aW9uLVJlYWxtIiwgJnJlZGlyX2RpY3RfZHIsIEVOT0VOVCkgICk7CisJQ0hFQ0tfRkNUKCAgZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiVXNlci1OYW1lIiwgJnJlZGlyX2RpY3RfdW4sIEVOT0VOVCkgICk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBlbnRyaWVzIGFycmF5ICovCisJQ0hFQ0tfRkNUKCByZWRpcl9lbnRyeV9pbml0KCkgKTsKKworCS8qIFN0YXJ0IHRoZSBleHBpcmUgdGhyZWFkICovCisJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfY3JlYXRlKCAmZXhwX3RociwgTlVMTCwgcmVkaXJfZXhwX3Rocl9mY3QsIE5VTEwgKSApOworCisJLyogUmVnaXN0ZXIgdGhlIGNhbGxiYWNrIHRoYXQgcmVjZWl2ZXMgdGhlIGFuc3dlcnMgYW5kIHByb2Nlc3NlcyB3aGVuIGl0IGNvbnRhaW5zIGEgUmVkaXJlY3QgaW5kaWNhdGlvbi4gKi8KKwlDSEVDS19GQ1QoIGZkX3J0X2Z3ZF9yZWdpc3RlciAoIHJlZGlyX2Z3ZF9jYiwgTlVMTCwgUlRfRldEX0FOUywgJmZ3ZF9oZGwgKSApOworCisJLyogUmVnaXN0ZXIgdGhlIGNhbGxiYWNrIHRoYXQgYXBwbGllcyB0aGUgc2F2ZWQgUmVkaXJlY3QgcnVsZXMgdG8gb3V0Z29pbmcgbWVzc2FnZXMuICovCisJQ0hFQ0tfRkNUKCBmZF9ydF9vdXRfcmVnaXN0ZXIgKCByZWRpcl9vdXRfY2IsIE5VTEwsIDEwLCAmb3V0X2hkbCApICk7CisKKwlyZXR1cm4gMDsKK30KKworRVhURU5TSU9OX0VOVFJZKCJydF9yZWRpcmVjdCIsIHJlZGlyX2VudHJ5KTsKKworLyogQW5kIHRlcm1pbmF0ZSBpdCAqLwordm9pZCBmZF9leHRfZmluaSh2b2lkKQoreworCS8qIFVucmVnaXN0ZXIgdGhlIGNhbGxiYWNrcyAqLworCWlmIChmd2RfaGRsKSB7CisJCUNIRUNLX0ZDVF9ETyggZmRfcnRfZndkX3VucmVnaXN0ZXIoZndkX2hkbCwgTlVMTCksICk7CisJfQorCWlmIChvdXRfaGRsKSB7CisJCUNIRUNLX0ZDVF9ETyggZmRfcnRfb3V0X3VucmVnaXN0ZXIob3V0X2hkbCwgTlVMTCksICk7CisJfQorCisJLyogU3RvcCB0aGUgZXhwaXJ5IHRocmVhZCAqLworCUNIRUNLX0ZDVF9ETyggZmRfdGhyX3Rlcm0oJmV4cF90aHIpLCApOworCisJLyogRW1wdHkgYWxsIGVudHJpZXMgKi8KKwlyZWRpcl9lbnRyeV9maW5pKCk7CisKKwlyZXR1cm47Cit9CmRpZmYgLS1naXQgYS9leHRlbnNpb25zL3J0X3JlZGlyZWN0L3J0X3JlZGlyLmggYi9leHRlbnNpb25zL3J0X3JlZGlyZWN0L3J0X3JlZGlyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgwZDI2ZgotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvcnRfcmVkaXJlY3QvcnRfcmVkaXIuaApAQCAtMCwwICsxLDE4MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PiBhbmQJCQkJCQkgKgorKiBUaG9tYXMgS2xhdXNuZXIgPHRrQGdpZ2Eub3IuYXQ+CQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxMywgMjAxNCwgV0lERSBQcm9qZWN0IGFuZCBOSUNUCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFdJREUgUHJvamVjdCBvciBOSUNUIG5vciB0aGUgCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgV0lERSBQcm9qZWN0IGFuZCAJCQkJCQkgKgorKiAgIE5JQ1QuCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRGlhbWV0ZXIgUmVkaXJlY3QgbWFuYWdlbWVudCAqLworI2luY2x1ZGUgPGZyZWVEaWFtZXRlci9leHRlbnNpb24uaD4KKworI2luY2x1ZGUgInV0aGFzaC5oIgorCisvKiBUaGVyZSBhcmUgMiBsb2NrcyBpbiB0aGlzIG1vZHVsZS4gVGhlIHByaW9yaXR5IGlzIGVzdGFibGlzaGVkIGFzIGZvbGxvdyB0byBhdm9pZCBkZWFkbG9ja3M6CitleHBfcGVlciBtdXRleCA+IHVzYWdlcyByd2xvY2suCisoZS5nLiwgdGhlIHJ3bG9jayBjYW4gYmUgdGFrZW4gd2hpbGUgaG9sZGluZyB0aGUgbXV0ZXgsIGJ1dCBub3QgdGhlIG90aGVyIHdheSkKKyovCisKKy8qIFRoZSB0eXBlcyBvZiByZWRpcmVjdHMgKGZyb20gUmVkaXJlY3QtSG9zdC1Vc2FnZSBBVlAgdmFsdWUpICovCitlbnVtIHJlZGlyX2hfdSB7CisJRE9OVF9DQUNIRSA9IDAsCisJQUxMX1NFU1NJT04sCisJQUxMX1JFQUxNLAorCVJFQUxNX0FORF9BUFBMSUNBVElPTiwKKwlBTExfQVBQTElDQVRJT04sCisJQUxMX0hPU1QsCisJQUxMX1VTRVIKK307CisjZGVmaW5lIEhfVV9NQVgJQUxMX1VTRVIKKworLyogRXllIGNhdGNoZXIgKi8KKyNkZWZpbmUgUkVESVJfRU5UUllfRVlFQyAgMHg0M0QxNEU3NAorCisvKiBFeHBpcmF0aW9uIHRpbWUgc2V0IGZvciBET05UX0NBQ0hFIHRhc2tzLCBzbyB0aGF0IHRoZSBlbnRyeSBpcyBmb3VuZCB3aGVuIHRoZSBjb2RlIGlzIGNhbGxlZCBiYWNrICovCisjZGVmaW5lIERFRkFVTFRfRVhQSVJFX1RJTUUgMTAgLyogc2Vjb25kcyAqLworCisvKiBTdHJ1Y3R1cmUgdG8gc3RvcmUgYSBwYXJzZWQgUmVkaXJlY3QtSG9zdCAqLworc3RydWN0IHJlZGlyX2hvc3QgeworCXN0cnVjdCBmZF9saXN0IGNoYWluOworCisJRGlhbUlkX3QgaWQ7CS8qIG1hbGxvYydkICovCisJc2l6ZV90CSBsZW47CisJLyogV2UgZG9uJ3QgdXNlIHRoZSBmb2xsb3dpbmcgeWV0IGJlY2F1c2Ugd2UgZG9uJ3Qgc3VwcG9ydCBkeW5hbWljIG5ldyBjb25uZWN0aW9ucworCWludCAJIHNlY3VyZTsKKwl1aW50MTZfdCBwb3J0OworCWludAkgbDQ7CisJY2hhcgkgcHJvdG87CisJKi8KK307CisKKy8qIFJ1bGUgZGF0YSB0aGF0IGlzIHN0b3JlZCBkZXBlbmRpbmcgb24gUmVkaXJlY3QtSG9zdC1Vc2FnZSB2YWx1ZSAqLwordW5pb24gbWF0Y2hkYXRhIHsKKwkvKiBET05UX0NBQ0hFICovCisJc3RydWN0IHsKKwkJc3RydWN0IG1zZyAqIG1zZzsgLyogVGhlIHF1ZXJ5IG1lc3NhZ2UgZm9yIHdoaWNoIHRoaXMgcnVsZSB3YXMgY3JlYXRlZCAqLworCX0gbWVzc2FnZTsKKworCS8qIEFMTF9TRVNTSU9OICovCisJc3RydWN0IHsKKwkJb3MwX3QgczsgIC8qIHNpZCAqLworCQlzaXplX3QgbDsKKwl9IHNlc3Npb247CisKKwkvKiBBTExfUkVBTE0gKi8KKwlzdHJ1Y3QgeworCQlvczBfdCBzOyAgLyogRGVzdGluYXRpb24tUmVhbG0gQVZQIGRhdGEgKi8KKwkJc2l6ZV90IGw7CisJfSByZWFsbTsKKworCS8qIFJFQUxNX0FORF9BUFBMSUNBVElPTiAqLworCXN0cnVjdCB7CisJCWFwcGxpY2F0aW9uX2lkX3QgYTsgLyogbWVzc2FnZSdzIGFwcGxpY2F0aW9uICovCisJCW9zMF90IHM7ICAvKiBEZXN0aW5hdGlvbi1SZWFsbSBBVlAgZGF0YSAqLworCQlzaXplX3QgbDsKKwl9IHJlYWxtX2FwcDsKKworCS8qIEFMTF9BUFBMSUNBVElPTiAqLworCXN0cnVjdCB7CisJCWFwcGxpY2F0aW9uX2lkX3QgYTsgLyogbWVzc2FnZSdzIGFwcGxpY2F0aW9uICovCisJfSBhcHA7CisKKwkvKiBBTExfSE9TVCAqLworCXN0cnVjdCB7CisJCW9zMF90IHM7ICAvKiB0aGUgT3JpZ2luLUhvc3Qgb2YgdGhlIFJlZGlyZWN0IG1lc3NhZ2UgKHdoaWNoIG1heSBiZSB0aGUgbmV4dCBob3Agb3Igbm90KSAqLworCQlzaXplX3QgbDsKKwl9IGhvc3Q7CisKKwkvKiBBTExfVVNFUiAqLworCXN0cnVjdCB7CisJCW9zMF90IHM7ICAvKiBVc2VyLU5hbWUgQVZQIGRhdGEgKi8KKwkJc2l6ZV90IGw7CisJfSB1c2VyOworfTsKKworCisvKiBTdHJ1Y3R1cmUgdG8gc3RvcmUgYSBSZWRpcmVjdCBpbmRpY2F0aW9uICovCitzdHJ1Y3QgcmVkaXJfZW50cnkgeworCXVpbnQzMl90IGV5ZWM7IC8qIG11c3QgYmUgUkVESVJfRU5UUllfRVlFQywgdXNlZCBmb3IgZGVidWcgb25seSAqLworCisJc3RydWN0IHsKKwkJb3MwX3QgczsgLyogYWxsb2MnZCwgbXVzdCBiZSBmcmVlZCAqLworCQlzaXplX3QgbDsKKwl9IGZyb207IC8qIHdob20gdGhpcyBydWxlIHdhcyByZWNlaXZlZCBmcm9tIChuZXh0IGhvcCkgPyAqLworCisJc3RydWN0IGZkX2xpc3QJIHRhcmdldF9wZWVyc19saXN0OyAvKiBUaGUgbGlzdCBvZiBSZWRpcmVjdC1Ib3N0cyBmb3IgdGhpcyBlbnRyeSAqLworCisJc3RydWN0IHRpbWVzcGVjICB0aW1lb3V0OyAgLyogV2hlbiBkb2VzIHRoaXMgZW50cnkgZXhwaXJlPyAqLworCXN0cnVjdCBmZF9saXN0ICAgZXhwX2xpc3Q7IC8qIGNoYWluIGluIHRoZSBleHBpcmVfbGlzdCBsaXN0LCBvcmRlcmVkIGJ5IGV4cGlyYXRpb24gZGF0ZSwgcHJvdGVjdGVkIGJ5IGV4cF9wZWVyX2xvY2sgKi8KKworCWVudW0gcmVkaXJfaF91IHR5cGU7ICAgICAgIC8qIFR5cGUgb2YgdGhpcyBlbnRyeSAqLworCXN0cnVjdCBmZF9saXN0IHJlZGlyX2xpc3Q7IC8qIGxpbmsgaW4gcmVkaXJlY3RzX3VzYWdlcyBsaXN0cy4gTGlzdHMgYXJlIG9yZGVyZWQgYnkgdGhlIGRhdGEgdmFsdWUuIFByb3RlY3RlZCBieSBydyBsb2NrcyAqLworCXVuaW9uIG1hdGNoZGF0YQlkYXRhOwkgICAvKiBUaGUgc3RyaW5ncyBhcmUgZHVwbGljYXRlZCAmIG11c3QgYmUgZnJlZWQgaW4gdGhpcyBzdHJ1Y3R1cmUgKi8KKwlVVF9oYXNoX2hhbmRsZSBoaDsgICAgICAgICAvKiBtYWdpYyBlbnRyeSBmb3IgaGFzaCB0YWJsZSAqLworfTsKKworLyogVGhlIGFycmF5IHdoZXJlIHRoZSByZWRpcl9lbnRyaWVzIGFyZSBzdG9yZWQgKi8KK3N0cnVjdCByZWRpcl9saW5lIHsKKwllbnVtIGZkX3J0X291dF9zY29yZSAJc2NvcmU7CisJcHRocmVhZF9yd2xvY2tfdAlsb2NrOyAvKiBwcm90ZWN0IHRoZSBsaXN0ICovCisJc3RydWN0IGZkX2xpc3QJCXNlbnRpbmVsOyAvKiBsaXN0IG9mIHJlZGlyX2VudHJ5LCB0aGUgIm8iIGZpZWxkIG9mIHRoZSBzZW50aW5lbCBwb2ludHMgdG8gdGhlIHJlZGlyX2xpbmUgZW50cnkgKi8KK307CitleHRlcm4gc3RydWN0IHJlZGlyX2xpbmUgcmVkaXJlY3RzX3VzYWdlc1tdOworLyogdGhlIGhhc2ggdGFibGUgd2hlcmUgZW50cmllcyBhcmUgc3RvcmVkIGZvciBBTExfU0VTU0lPTiBhbmQgQUxMX1VTRVIgKi8KK2V4dGVybiBzdHJ1Y3QgcmVkaXJfZW50cnkgKnJlZGlyZWN0X2hhc2hfdGFibGVbXTsKKworLyogQWNjZWxlcmF0b3IgdG8gdGhlIGxpbmUgbG9jayAqLworI2RlZmluZSBSV0xPQ0tfUkVESVIoIF9lbnRyeSApICggJihyZWRpcmVjdHNfdXNhZ2VzWyhfZW50cnkpLT50eXBlXS5sb2NrKSApCisKKy8qIExvY2sgdGhhdCBtdXN0IGJlIG93bmVkIGJlZm9yZSBjYWxsaW5nIHNvbWUgZnVuY3Rpb25zICovCitleHRlcm4gcHRocmVhZF9tdXRleF90IHJlZGlyX2V4cF9wZWVyX2xvY2s7CisKKy8qIERpY3Rpb25hcnkgY2FjaGVkIG9iamVjdHMgKi8KK2V4dGVybiBzdHJ1Y3QgZGljdF9vYmplY3QgKiByZWRpcl9kaWN0X2RyOworZXh0ZXJuIHN0cnVjdCBkaWN0X29iamVjdCAqIHJlZGlyX2RpY3RfdW47CisKKy8qIEZ1bmN0aW9ucyBvbiByZWRpcl9lbnRyeSAqLworaW50IHJlZGlyX2VudHJ5X2luaXQoKTsKK2ludCByZWRpcl9lbnRyeV9maW5pKCk7CitpbnQgcmVkaXJfZW50cnlfbmV3KHN0cnVjdCByZWRpcl9lbnRyeSAqKiBlLCBzdHJ1Y3QgZmRfbGlzdCAqIHRhcmdldHMsIHVpbnQzMl90IHJodSwgc3RydWN0IG1zZyAqIHFyeSwgRGlhbUlkX3QgbmgsIHNpemVfdCBuaGxlbiwgb3MwX3Qgb2gsIHNpemVfdCBvaGxlbik7CitleHRlcm4gaW50ICgqcmVkaXJfZW50cnlfY21wX2tleVtdKSh1bmlvbiBtYXRjaGRhdGEgKiAsIHVuaW9uIG1hdGNoZGF0YSAqKTsgLyogY29tcGFyZSBmdW5jdGlvbnMgKi8KK2ludCByZWRpcl9lbnRyeV9pbnNlcnQoc3RydWN0IHJlZGlyX2VudHJ5ICogZSk7CitpbnQgcmVkaXJfZW50cnlfZGVzdHJveShzdHJ1Y3QgcmVkaXJfZW50cnkgKiBlKTsKKworLyogRnVuY3Rpb25zIGZvciBleHBpcnkgKi8KK3ZvaWQgKiByZWRpcl9leHBfdGhyX2ZjdCh2b2lkICogYXJnKTsKK2ludCByZWRpcl9leHBfc2V0KHN0cnVjdCByZWRpcl9lbnRyeSAqIGUsIHVpbnQzMl90IGR1cmF0aW9uKTsKKworLyogRm9yd2FyZCBjYiAqLworaW50IHJlZGlyX2Z3ZF9jYih2b2lkICogY2JkYXRhLCBzdHJ1Y3QgbXNnICoqIG1zZyk7CisKKy8qIE91dCBjYWxsYmFjayAqLworaW50IHJlZGlyX291dF9jYih2b2lkICogY2JkYXRhLCBzdHJ1Y3QgbXNnICoqIHBtc2csIHN0cnVjdCBmZF9saXN0ICogY2FuZGlkYXRlcyk7CmRpZmYgLS1naXQgYS9leHRlbnNpb25zL3J0X3JlZGlyZWN0L3V0aGFzaC5oIGIvZXh0ZW5zaW9ucy9ydF9yZWRpcmVjdC91dGhhc2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWMzMDMyCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9ydF9yZWRpcmVjdC91dGhhc2guaApAQCAtMCwwICsxLDk0MCBAQAorLyoKK0NvcHlyaWdodCAoYykgMjAwMy0yMDEzLCBUcm95IEQuIEhhbnNvbiAgICAgaHR0cDovL3Ryb3lkaGFuc29uLmdpdGh1Yi5jb20vdXRoYXNoLworQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMKK0lTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRAorVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBCitQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIKK09SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCitQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCitMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCitTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisKKyNpZm5kZWYgVVRIQVNIX0gKKyNkZWZpbmUgVVRIQVNIX0gKKworI2luY2x1ZGUgPHN0cmluZy5oPiAgIC8qIG1lbWNtcCxzdHJsZW4gKi8KKyNpbmNsdWRlIDxzdGRkZWYuaD4gICAvKiBwdHJkaWZmX3QgKi8KKyNpbmNsdWRlIDxzdGRsaWIuaD4gICAvKiBleGl0KCkgKi8KKworLyogVGhlc2UgbWFjcm9zIHVzZSBkZWNsdHlwZSBvciB0aGUgZWFybGllciBfX3R5cGVvZiBHTlUgZXh0ZW5zaW9uLgorICAgQXMgZGVjbHR5cGUgaXMgb25seSBhdmFpbGFibGUgaW4gbmV3ZXIgY29tcGlsZXJzIChWUzIwMTAgb3IgZ2NjIDQuMysKKyAgIHdoZW4gY29tcGlsaW5nIGMrKyBzb3VyY2UpIHRoaXMgY29kZSB1c2VzIHdoYXRldmVyIG1ldGhvZCBpcyBuZWVkZWQKKyAgIG9yLCBmb3IgVlMyMDA4IHdoZXJlIG5laXRoZXIgaXMgYXZhaWxhYmxlLCB1c2VzIGNhc3Rpbmcgd29ya2Fyb3VuZHMuICovCisjaWZkZWYgX01TQ19WRVIgICAgICAgICAvKiBNUyBjb21waWxlciAqLworI2lmIF9NU0NfVkVSID49IDE2MDAgJiYgZGVmaW5lZChfX2NwbHVzcGx1cykgIC8qIFZTMjAxMCBvciBuZXdlciBpbiBDKysgbW9kZSAqLworI2RlZmluZSBERUNMVFlQRSh4KSAoZGVjbHR5cGUoeCkpCisjZWxzZSAgICAgICAgICAgICAgICAgICAvKiBWUzIwMDggb3Igb2xkZXIgKG9yIFZTMjAxMCBpbiBDIG1vZGUpICovCisjZGVmaW5lIE5PX0RFQ0xUWVBFCisjZGVmaW5lIERFQ0xUWVBFKHgpCisjZW5kaWYKKyNlbHNlICAgICAgICAgICAgICAgICAgIC8qIEdOVSwgU3VuIGFuZCBvdGhlciBjb21waWxlcnMgKi8KKyNkZWZpbmUgREVDTFRZUEUoeCkgKF9fdHlwZW9mKHgpKQorI2VuZGlmCisKKyNpZmRlZiBOT19ERUNMVFlQRQorI2RlZmluZSBERUNMVFlQRV9BU1NJR04oZHN0LHNyYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjaGFyICoqX2RhX2RzdCA9IChjaGFyKiopKCYoZHN0KSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAqX2RhX2RzdCA9IChjaGFyKikoc3JjKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSgwKQorI2Vsc2UKKyNkZWZpbmUgREVDTFRZUEVfQVNTSUdOKGRzdCxzcmMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKGRzdCkgPSBERUNMVFlQRShkc3QpKHNyYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUoMCkKKyNlbmRpZgorCisvKiBhIG51bWJlciBvZiB0aGUgaGFzaCBmdW5jdGlvbiB1c2UgdWludDMyX3Qgd2hpY2ggaXNuJ3QgZGVmaW5lZCBvbiB3aW4zMiAqLworI2lmZGVmIF9NU0NfVkVSCit0eXBlZGVmIHVuc2lnbmVkIGludCB1aW50MzJfdDsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciB1aW50OF90OworI2Vsc2UKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPiAgIC8qIHVpbnQzMl90ICovCisjZW5kaWYKKworI2RlZmluZSBVVEhBU0hfVkVSU0lPTiAxLjkuOAorCisjaWZuZGVmIHV0aGFzaF9mYXRhbAorI2RlZmluZSB1dGhhc2hfZmF0YWwobXNnKSBleGl0KC0xKSAgICAgICAgLyogZmF0YWwgZXJyb3IgKG91dCBvZiBtZW1vcnksZXRjKSAqLworI2VuZGlmCisjaWZuZGVmIHV0aGFzaF9tYWxsb2MKKyNkZWZpbmUgdXRoYXNoX21hbGxvYyhzeikgbWFsbG9jKHN6KSAgICAgIC8qIG1hbGxvYyBmY24gICAgICAgICAgICAgICAgICAgICAgKi8KKyNlbmRpZgorI2lmbmRlZiB1dGhhc2hfZnJlZQorI2RlZmluZSB1dGhhc2hfZnJlZShwdHIsc3opIGZyZWUocHRyKSAgICAgLyogZnJlZSBmY24gICAgICAgICAgICAgICAgICAgICAgICAqLworI2VuZGlmCisKKyNpZm5kZWYgdXRoYXNoX25vZXhwYW5kX2Z5aQorI2RlZmluZSB1dGhhc2hfbm9leHBhbmRfZnlpKHRibCkgICAgICAgICAgLyogY2FuIGJlIGRlZmluZWQgdG8gbG9nIG5vZXhwYW5kICAqLworI2VuZGlmCisjaWZuZGVmIHV0aGFzaF9leHBhbmRfZnlpCisjZGVmaW5lIHV0aGFzaF9leHBhbmRfZnlpKHRibCkgICAgICAgICAgICAvKiBjYW4gYmUgZGVmaW5lZCB0byBsb2cgZXhwYW5kcyAgICovCisjZW5kaWYKKworLyogaW5pdGlhbCBudW1iZXIgb2YgYnVja2V0cyAqLworI2RlZmluZSBIQVNIX0lOSVRJQUxfTlVNX0JVQ0tFVFMgMzIgICAgICAvKiBpbml0aWFsIG51bWJlciBvZiBidWNrZXRzICAgICAgICAqLworI2RlZmluZSBIQVNIX0lOSVRJQUxfTlVNX0JVQ0tFVFNfTE9HMiA1ICAvKiBsZzIgb2YgaW5pdGlhbCBudW1iZXIgb2YgYnVja2V0cyAqLworI2RlZmluZSBIQVNIX0JLVF9DQVBBQ0lUWV9USFJFU0ggMTAgICAgICAvKiBleHBhbmQgd2hlbiBidWNrZXQgY291bnQgcmVhY2hlcyAqLworCisvKiBjYWxjdWxhdGUgdGhlIGVsZW1lbnQgd2hvc2UgaGFzaCBoYW5kbGUgYWRkcmVzcyBpcyBoaGUgKi8KKyNkZWZpbmUgRUxNVF9GUk9NX0hIKHRibCxoaHApICgodm9pZCopKCgoY2hhciopKGhocCkpIC0gKCh0YmwpLT5oaG8pKSkKKworI2RlZmluZSBIQVNIX0ZJTkQoaGgsaGVhZCxrZXlwdHIsa2V5bGVuLG91dCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1bnNpZ25lZCBfaGZfYmt0LF9oZl9oYXNodjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBvdXQ9TlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoaGVhZCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBIQVNIX0ZDTihrZXlwdHIsa2V5bGVuLCAoaGVhZCktPmhoLnRibC0+bnVtX2J1Y2tldHMsIF9oZl9oYXNodiwgX2hmX2JrdCk7ICAgXAorICAgICBpZiAoSEFTSF9CTE9PTV9URVNUKChoZWFkKS0+aGgudGJsLCBfaGZfaGFzaHYpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIEhBU0hfRklORF9JTl9CS1QoKGhlYWQpLT5oaC50YmwsIGhoLCAoaGVhZCktPmhoLnRibC0+YnVja2V0c1sgX2hmX2JrdCBdLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAga2V5cHRyLGtleWxlbixvdXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2lmZGVmIEhBU0hfQkxPT00KKyNkZWZpbmUgSEFTSF9CTE9PTV9CSVRMRU4gKDFVTEwgPDwgSEFTSF9CTE9PTSkKKyNkZWZpbmUgSEFTSF9CTE9PTV9CWVRFTEVOIChIQVNIX0JMT09NX0JJVExFTi84KSArICgoSEFTSF9CTE9PTV9CSVRMRU4lOCkgPyAxOjApCisjZGVmaW5lIEhBU0hfQkxPT01fTUFLRSh0YmwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICh0YmwpLT5ibG9vbV9uYml0cyA9IEhBU0hfQkxPT007ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICh0YmwpLT5ibG9vbV9idiA9ICh1aW50OF90Kil1dGhhc2hfbWFsbG9jKEhBU0hfQkxPT01fQllURUxFTik7ICAgICAgICAgICAgICAgICBcCisgIGlmICghKCh0YmwpLT5ibG9vbV9idikpICB7IHV0aGFzaF9mYXRhbCggIm91dCBvZiBtZW1vcnkiKTsgfSAgICAgICAgICAgICAgICAgICBcCisgIG1lbXNldCgodGJsKS0+Ymxvb21fYnYsIDAsIEhBU0hfQkxPT01fQllURUxFTik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICh0YmwpLT5ibG9vbV9zaWcgPSBIQVNIX0JMT09NX1NJR05BVFVSRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEhBU0hfQkxPT01fRlJFRSh0YmwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHV0aGFzaF9mcmVlKCh0YmwpLT5ibG9vbV9idiwgSEFTSF9CTE9PTV9CWVRFTEVOKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEhBU0hfQkxPT01fQklUU0VUKGJ2LGlkeCkgKGJ2WyhpZHgpLzhdIHw9ICgxVSA8PCAoKGlkeCklOCkpKQorI2RlZmluZSBIQVNIX0JMT09NX0JJVFRFU1QoYnYsaWR4KSAoYnZbKGlkeCkvOF0gJiAoMVUgPDwgKChpZHgpJTgpKSkKKworI2RlZmluZSBIQVNIX0JMT09NX0FERCh0YmwsaGFzaHYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBIQVNIX0JMT09NX0JJVFNFVCgodGJsKS0+Ymxvb21fYnYsIChoYXNodiAmICh1aW50MzJfdCkoKDFVTEwgPDwgKHRibCktPmJsb29tX25iaXRzKSAtIDEpKSkKKworI2RlZmluZSBIQVNIX0JMT09NX1RFU1QodGJsLGhhc2h2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBIQVNIX0JMT09NX0JJVFRFU1QoKHRibCktPmJsb29tX2J2LCAoaGFzaHYgJiAodWludDMyX3QpKCgxVUxMIDw8ICh0YmwpLT5ibG9vbV9uYml0cykgLSAxKSkpCisKKyNlbHNlCisjZGVmaW5lIEhBU0hfQkxPT01fTUFLRSh0YmwpCisjZGVmaW5lIEhBU0hfQkxPT01fRlJFRSh0YmwpCisjZGVmaW5lIEhBU0hfQkxPT01fQUREKHRibCxoYXNodikKKyNkZWZpbmUgSEFTSF9CTE9PTV9URVNUKHRibCxoYXNodikgKDEpCisjZGVmaW5lIEhBU0hfQkxPT01fQllURUxFTiAwCisjZW5kaWYKKworI2RlZmluZSBIQVNIX01BS0VfVEFCTEUoaGgsaGVhZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoaGVhZCktPmhoLnRibCA9IChVVF9oYXNoX3RhYmxlKil1dGhhc2hfbWFsbG9jKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKFVUX2hhc2hfdGFibGUpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoISgoaGVhZCktPmhoLnRibCkpICB7IHV0aGFzaF9mYXRhbCggIm91dCBvZiBtZW1vcnkiKTsgfSAgICAgICAgICAgICAgICAgICAgXAorICBtZW1zZXQoKGhlYWQpLT5oaC50YmwsIDAsIHNpemVvZihVVF9oYXNoX3RhYmxlKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoaGVhZCktPmhoLnRibC0+dGFpbCA9ICYoKGhlYWQpLT5oaCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoaGVhZCktPmhoLnRibC0+bnVtX2J1Y2tldHMgPSBIQVNIX0lOSVRJQUxfTlVNX0JVQ0tFVFM7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoaGVhZCktPmhoLnRibC0+bG9nMl9udW1fYnVja2V0cyA9IEhBU0hfSU5JVElBTF9OVU1fQlVDS0VUU19MT0cyOyAgICAgICAgICAgICAgXAorICAoaGVhZCktPmhoLnRibC0+aGhvID0gKGNoYXIqKSgmKGhlYWQpLT5oaCkgLSAoY2hhciopKGhlYWQpOyAgICAgICAgICAgICAgICAgICAgXAorICAoaGVhZCktPmhoLnRibC0+YnVja2V0cyA9IChVVF9oYXNoX2J1Y2tldCopdXRoYXNoX21hbGxvYyggICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIEhBU0hfSU5JVElBTF9OVU1fQlVDS0VUUypzaXplb2Yoc3RydWN0IFVUX2hhc2hfYnVja2V0KSk7ICAgICAgICAgICAgICAgXAorICBpZiAoISAoaGVhZCktPmhoLnRibC0+YnVja2V0cykgeyB1dGhhc2hfZmF0YWwoICJvdXQgb2YgbWVtb3J5Iik7IH0gICAgICAgICAgICAgXAorICBtZW1zZXQoKGhlYWQpLT5oaC50YmwtPmJ1Y2tldHMsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIEhBU0hfSU5JVElBTF9OVU1fQlVDS0VUUypzaXplb2Yoc3RydWN0IFVUX2hhc2hfYnVja2V0KSk7ICAgICAgICAgICAgICAgXAorICBIQVNIX0JMT09NX01BS0UoKGhlYWQpLT5oaC50YmwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoaGVhZCktPmhoLnRibC0+c2lnbmF0dXJlID0gSEFTSF9TSUdOQVRVUkU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSgwKQorCisjZGVmaW5lIEhBU0hfQUREKGhoLGhlYWQsZmllbGRuYW1lLGtleWxlbl9pbixhZGQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEhBU0hfQUREX0tFWVBUUihoaCxoZWFkLCYoKGFkZCktPmZpZWxkbmFtZSksa2V5bGVuX2luLGFkZCkKKworI2RlZmluZSBIQVNIX1JFUExBQ0UoaGgsaGVhZCxmaWVsZG5hbWUsa2V5bGVuX2luLGFkZCxyZXBsYWNlZCkgICAgICAgICAgICAgICAgICAgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICByZXBsYWNlZD1OVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBIQVNIX0ZJTkQoaGgsaGVhZCwmKChhZGQpLT5maWVsZG5hbWUpLGtleWxlbl9pbixyZXBsYWNlZCk7ICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAocmVwbGFjZWQhPU5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBIQVNIX0RFTEVURShoaCxoZWFkLHJlcGxhY2VkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBIQVNIX0FERChoaCxoZWFkLGZpZWxkbmFtZSxrZXlsZW5faW4sYWRkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSgwKQorCisjZGVmaW5lIEhBU0hfQUREX0tFWVBUUihoaCxoZWFkLGtleXB0cixrZXlsZW5faW4sYWRkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgdW5zaWduZWQgX2hhX2JrdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgKGFkZCktPmhoLm5leHQgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgKGFkZCktPmhoLmtleSA9IChjaGFyKilrZXlwdHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgKGFkZCktPmhoLmtleWxlbiA9ICh1bnNpZ25lZClrZXlsZW5faW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorIGlmICghKGhlYWQpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGhlYWQgPSAoYWRkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChoZWFkKS0+aGgucHJldiA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEhBU0hfTUFLRV9UQUJMRShoaCxoZWFkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChoZWFkKS0+aGgudGJsLT50YWlsLT5uZXh0ID0gKGFkZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChhZGQpLT5oaC5wcmV2ID0gRUxNVF9GUk9NX0hIKChoZWFkKS0+aGgudGJsLCAoaGVhZCktPmhoLnRibC0+dGFpbCk7ICAgICAgICAgXAorICAgIChoZWFkKS0+aGgudGJsLT50YWlsID0gJigoYWRkKS0+aGgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorIChoZWFkKS0+aGgudGJsLT5udW1faXRlbXMrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorIChhZGQpLT5oaC50YmwgPSAoaGVhZCktPmhoLnRibDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorIEhBU0hfRkNOKGtleXB0cixrZXlsZW5faW4sIChoZWFkKS0+aGgudGJsLT5udW1fYnVja2V0cywgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgKGFkZCktPmhoLmhhc2h2LCBfaGFfYmt0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorIEhBU0hfQUREX1RPX0JLVCgoaGVhZCktPmhoLnRibC0+YnVja2V0c1tfaGFfYmt0XSwmKGFkZCktPmhoKTsgICAgICAgICAgICAgICAgICAgXAorIEhBU0hfQkxPT01fQUREKChoZWFkKS0+aGgudGJsLChhZGQpLT5oaC5oYXNodik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorIEhBU0hfRU1JVF9LRVkoaGgsaGVhZCxrZXlwdHIsa2V5bGVuX2luKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorIEhBU0hfRlNDSyhoaCxoZWFkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSgwKQorCisjZGVmaW5lIEhBU0hfVE9fQktUKCBoYXNodiwgbnVtX2JrdHMsIGJrdCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGJrdCA9ICgoaGFzaHYpICYgKChudW1fYmt0cykgLSAxKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlKDApCisKKy8qIGRlbGV0ZSAiZGVscHRyIiBmcm9tIHRoZSBoYXNoIHRhYmxlLgorICogInRoZSB1c3VhbCIgcGF0Y2gtdXAgcHJvY2VzcyBmb3IgdGhlIGFwcC1vcmRlciBkb3VibHktbGlua2VkLWxpc3QuCisgKiBUaGUgdXNlIG9mIF9oZF9oaF9kZWwgYmVsb3cgZGVzZXJ2ZXMgc3BlY2lhbCBleHBsYW5hdGlvbi4KKyAqIFRoZXNlIHVzZWQgdG8gYmUgZXhwcmVzc2VkIHVzaW5nIChkZWxwdHIpIGJ1dCB0aGF0IGxlZCB0byBhIGJ1ZworICogaWYgc29tZW9uZSB1c2VkIHRoZSBzYW1lIHN5bWJvbCBmb3IgdGhlIGhlYWQgYW5kIGRlbGV0ZWUsIGxpa2UKKyAqICBIQVNIX0RFTEVURShoaCx1c2Vycyx1c2Vycyk7CisgKiBXZSB3YW50IHRoYXQgdG8gd29yaywgYnV0IGJ5IGNoYW5naW5nIHRoZSBoZWFkICh1c2VycykgYmVsb3cKKyAqIHdlIHdlcmUgZm9yZmVpdGluZyBvdXIgYWJpbGl0eSB0byBmdXJ0aGVyIHJlZmVyIHRvIHRoZSBkZWxldGVlICh1c2VycykKKyAqIGluIHRoZSBwYXRjaC11cCBwcm9jZXNzLiBTb2x1dGlvbjogdXNlIHNjcmF0Y2ggc3BhY2UgdG8KKyAqIGNvcHkgdGhlIGRlbGV0ZWUgcG9pbnRlciwgdGhlbiB0aGUgbGF0dGVyIHJlZmVyZW5jZXMgYXJlIHZpYSB0aGF0CisgKiBzY3JhdGNoIHBvaW50ZXIgcmF0aGVyIHRoYW4gdGhyb3VnaCB0aGUgcmVwb2ludGVkICh1c2Vycykgc3ltYm9sLgorICovCisjZGVmaW5lIEhBU0hfREVMRVRFKGhoLGhlYWQsZGVscHRyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdW5zaWduZWQgX2hkX2JrdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RydWN0IFVUX2hhc2hfaGFuZGxlICpfaGRfaGhfZGVsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAoKGRlbHB0ciktPmhoLnByZXYgPT0gTlVMTCkgJiYgKChkZWxwdHIpLT5oaC5uZXh0ID09IE5VTEwpICkgIHsgICAgICAgICBcCisgICAgICAgIHV0aGFzaF9mcmVlKChoZWFkKS0+aGgudGJsLT5idWNrZXRzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIChoZWFkKS0+aGgudGJsLT5udW1fYnVja2V0cypzaXplb2Yoc3RydWN0IFVUX2hhc2hfYnVja2V0KSApOyBcCisgICAgICAgIEhBU0hfQkxPT01fRlJFRSgoaGVhZCktPmhoLnRibCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHV0aGFzaF9mcmVlKChoZWFkKS0+aGgudGJsLCBzaXplb2YoVVRfaGFzaF90YWJsZSkpOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGhlYWQgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIF9oZF9oaF9kZWwgPSAmKChkZWxwdHIpLT5oaCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICgoZGVscHRyKSA9PSBFTE1UX0ZST01fSEgoKGhlYWQpLT5oaC50YmwsKGhlYWQpLT5oaC50YmwtPnRhaWwpKSB7ICAgICBcCisgICAgICAgICAgICAoaGVhZCktPmhoLnRibC0+dGFpbCA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKFVUX2hhc2hfaGFuZGxlKikoKHB0cmRpZmZfdCkoKGRlbHB0ciktPmhoLnByZXYpICsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKGhlYWQpLT5oaC50YmwtPmhobyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICgoZGVscHRyKS0+aGgucHJldikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAoKFVUX2hhc2hfaGFuZGxlKikoKHB0cmRpZmZfdCkoKGRlbHB0ciktPmhoLnByZXYpICsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIChoZWFkKS0+aGgudGJsLT5oaG8pKS0+bmV4dCA9IChkZWxwdHIpLT5oaC5uZXh0OyAgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBERUNMVFlQRV9BU1NJR04oaGVhZCwoZGVscHRyKS0+aGgubmV4dCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChfaGRfaGhfZGVsLT5uZXh0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAoKFVUX2hhc2hfaGFuZGxlKikoKHB0cmRpZmZfdClfaGRfaGhfZGVsLT5uZXh0ICsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIChoZWFkKS0+aGgudGJsLT5oaG8pKS0+cHJldiA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIF9oZF9oaF9kZWwtPnByZXY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEhBU0hfVE9fQktUKCBfaGRfaGhfZGVsLT5oYXNodiwgKGhlYWQpLT5oaC50YmwtPm51bV9idWNrZXRzLCBfaGRfYmt0KTsgICBcCisgICAgICAgIEhBU0hfREVMX0lOX0JLVChoaCwoaGVhZCktPmhoLnRibC0+YnVja2V0c1tfaGRfYmt0XSwgX2hkX2hoX2RlbCk7ICAgICAgICBcCisgICAgICAgIChoZWFkKS0+aGgudGJsLT5udW1faXRlbXMtLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgSEFTSF9GU0NLKGhoLGhlYWQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisKKy8qIGNvbnZlbmllbmNlIGZvcm1zIG9mIEhBU0hfRklORC9IQVNIX0FERC9IQVNIX0RFTCAqLworI2RlZmluZSBIQVNIX0ZJTkRfU1RSKGhlYWQsZmluZHN0cixvdXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEhBU0hfRklORChoaCxoZWFkLGZpbmRzdHIsc3RybGVuKGZpbmRzdHIpLG91dCkKKyNkZWZpbmUgSEFTSF9BRERfU1RSKGhlYWQsc3RyZmllbGQsYWRkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBIQVNIX0FERChoaCxoZWFkLHN0cmZpZWxkLHN0cmxlbihhZGQtPnN0cmZpZWxkKSxhZGQpCisjZGVmaW5lIEhBU0hfUkVQTEFDRV9TVFIoaGVhZCxzdHJmaWVsZCxhZGQscmVwbGFjZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEhBU0hfUkVQTEFDRShoaCxoZWFkLHN0cmZpZWxkLHN0cmxlbihhZGQtPnN0cmZpZWxkKSxhZGQscmVwbGFjZWQpCisjZGVmaW5lIEhBU0hfRklORF9JTlQoaGVhZCxmaW5kaW50LG91dCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgSEFTSF9GSU5EKGhoLGhlYWQsZmluZGludCxzaXplb2YoaW50KSxvdXQpCisjZGVmaW5lIEhBU0hfQUREX0lOVChoZWFkLGludGZpZWxkLGFkZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgSEFTSF9BREQoaGgsaGVhZCxpbnRmaWVsZCxzaXplb2YoaW50KSxhZGQpCisjZGVmaW5lIEhBU0hfUkVQTEFDRV9JTlQoaGVhZCxpbnRmaWVsZCxhZGQscmVwbGFjZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgSEFTSF9SRVBMQUNFKGhoLGhlYWQsaW50ZmllbGQsc2l6ZW9mKGludCksYWRkLHJlcGxhY2VkKQorI2RlZmluZSBIQVNIX0ZJTkRfUFRSKGhlYWQsZmluZHB0cixvdXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEhBU0hfRklORChoaCxoZWFkLGZpbmRwdHIsc2l6ZW9mKHZvaWQgKiksb3V0KQorI2RlZmluZSBIQVNIX0FERF9QVFIoaGVhZCxwdHJmaWVsZCxhZGQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEhBU0hfQUREKGhoLGhlYWQscHRyZmllbGQsc2l6ZW9mKHZvaWQgKiksYWRkKQorI2RlZmluZSBIQVNIX1JFUExBQ0VfUFRSKGhlYWQscHRyZmllbGQsYWRkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEhBU0hfUkVQTEFDRShoaCxoZWFkLHB0cmZpZWxkLHNpemVvZih2b2lkICopLGFkZCxyZXBsYWNlZCkKKyNkZWZpbmUgSEFTSF9ERUwoaGVhZCxkZWxwdHIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBIQVNIX0RFTEVURShoaCxoZWFkLGRlbHB0cikKKworLyogSEFTSF9GU0NLIGNoZWNrcyBoYXNoIGludGVncml0eSBvbiBldmVyeSBhZGQvZGVsZXRlIHdoZW4gSEFTSF9ERUJVRyBpcyBkZWZpbmVkLgorICogVGhpcyBpcyBmb3IgdXRoYXNoIGRldmVsb3BlciBvbmx5OyBpdCBjb21waWxlcyBhd2F5IGlmIEhBU0hfREVCVUcgaXNuJ3QgZGVmaW5lZC4KKyAqLworI2lmZGVmIEhBU0hfREVCVUcKKyNkZWZpbmUgSEFTSF9PT1BTKC4uLikgZG8geyBmcHJpbnRmKHN0ZGVycixfX1ZBX0FSR1NfXyk7IGV4aXQoLTEpOyB9IHdoaWxlICgwKQorI2RlZmluZSBIQVNIX0ZTQ0soaGgsaGVhZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVuc2lnbmVkIF9ia3RfaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVuc2lnbmVkIF9jb3VudCwgX2JrdF9jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNoYXIgKl9wcmV2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0cnVjdCBVVF9oYXNoX2hhbmRsZSAqX3RoaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChoZWFkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfY291bnQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIF9ia3RfaSA9IDA7IF9ia3RfaSA8IChoZWFkKS0+aGgudGJsLT5udW1fYnVja2V0czsgX2JrdF9pKyspIHsgICAgICAgXAorICAgICAgICAgICAgX2JrdF9jb3VudCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX3RoaCA9IChoZWFkKS0+aGgudGJsLT5idWNrZXRzW19ia3RfaV0uaGhfaGVhZDsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX3ByZXYgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgd2hpbGUgKF90aGgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgaWYgKF9wcmV2ICE9IChjaGFyKikoX3RoaC0+aGhfcHJldikpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgIEhBU0hfT09QUygiaW52YWxpZCBoaF9wcmV2ICVwLCBhY3R1YWwgJXBcbiIsICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBfdGhoLT5oaF9wcmV2LCBfcHJldiApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgX2JrdF9jb3VudCsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgX3ByZXYgPSAoY2hhciopKF90aGgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgX3RoaCA9IF90aGgtPmhoX25leHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX2NvdW50ICs9IF9ia3RfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKChoZWFkKS0+aGgudGJsLT5idWNrZXRzW19ia3RfaV0uY291bnQgIT0gIF9ia3RfY291bnQpIHsgICAgICAgICAgXAorICAgICAgICAgICAgICAgSEFTSF9PT1BTKCJpbnZhbGlkIGJ1Y2tldCBjb3VudCAlZCwgYWN0dWFsICVkXG4iLCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIChoZWFkKS0+aGgudGJsLT5idWNrZXRzW19ia3RfaV0uY291bnQsIF9ia3RfY291bnQpOyAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoX2NvdW50ICE9IChoZWFkKS0+aGgudGJsLT5udW1faXRlbXMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgSEFTSF9PT1BTKCJpbnZhbGlkIGhoIGl0ZW0gY291bnQgJWQsIGFjdHVhbCAlZFxuIiwgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIChoZWFkKS0+aGgudGJsLT5udW1faXRlbXMsIF9jb3VudCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAvKiB0cmF2ZXJzZSBoaCBpbiBhcHAgb3JkZXI7IGNoZWNrIG5leHQvcHJldiBpbnRlZ3JpdHksIGNvdW50ICovICAgICAgICAgXAorICAgICAgICBfY291bnQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfcHJldiA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfdGhoID0gICYoaGVhZCktPmhoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB3aGlsZSAoX3RoaCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICBfY291bnQrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICBpZiAoX3ByZXYgIT0oY2hhciopKF90aGgtPnByZXYpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICBIQVNIX09PUFMoImludmFsaWQgcHJldiAlcCwgYWN0dWFsICVwXG4iLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBfdGhoLT5wcmV2LCBfcHJldiApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICBfcHJldiA9IChjaGFyKilFTE1UX0ZST01fSEgoKGhlYWQpLT5oaC50YmwsIF90aGgpOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICBfdGhoID0gKCBfdGhoLT5uZXh0ID8gIChVVF9oYXNoX2hhbmRsZSopKChjaGFyKikoX3RoaC0+bmV4dCkgKyAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoZWFkKS0+aGgudGJsLT5oaG8pIDogTlVMTCApOyAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoX2NvdW50ICE9IChoZWFkKS0+aGgudGJsLT5udW1faXRlbXMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgSEFTSF9PT1BTKCJpbnZhbGlkIGFwcCBpdGVtIGNvdW50ICVkLCBhY3R1YWwgJWRcbiIsICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIChoZWFkKS0+aGgudGJsLT5udW1faXRlbXMsIF9jb3VudCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIEhBU0hfRlNDSyhoaCxoZWFkKQorI2VuZGlmCisKKy8qIFdoZW4gY29tcGlsZWQgd2l0aCAtREhBU0hfRU1JVF9LRVlTLCBsZW5ndGgtcHJlZml4ZWQga2V5cyBhcmUgZW1pdHRlZCB0bworICogdGhlIGRlc2NyaXB0b3IgdG8gd2hpY2ggdGhpcyBtYWNybyBpcyBkZWZpbmVkIGZvciB0dW5pbmcgdGhlIGhhc2ggZnVuY3Rpb24uCisgKiBUaGUgYXBwIGNhbiAjaW5jbHVkZSA8dW5pc3RkLmg+IHRvIGdldCB0aGUgcHJvdG90eXBlIGZvciB3cml0ZSgyKS4gKi8KKyNpZmRlZiBIQVNIX0VNSVRfS0VZUworI2RlZmluZSBIQVNIX0VNSVRfS0VZKGhoLGhlYWQsa2V5cHRyLGZpZWxkbGVuKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVuc2lnbmVkIF9rbGVuID0gZmllbGRsZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHdyaXRlKEhBU0hfRU1JVF9LRVlTLCAmX2tsZW4sIHNpemVvZihfa2xlbikpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHdyaXRlKEhBU0hfRU1JVF9LRVlTLCBrZXlwdHIsIGZpZWxkbGVuKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIEhBU0hfRU1JVF9LRVkoaGgsaGVhZCxrZXlwdHIsZmllbGRsZW4pCisjZW5kaWYKKworLyogZGVmYXVsdCB0byBKZW5raW4ncyBoYXNoIHVubGVzcyBvdmVycmlkZGVuIGUuZy4gREhBU0hfRlVOQ1RJT049SEFTSF9TQVggKi8KKyNpZmRlZiBIQVNIX0ZVTkNUSU9OCisjZGVmaW5lIEhBU0hfRkNOIEhBU0hfRlVOQ1RJT04KKyNlbHNlCisjZGVmaW5lIEhBU0hfRkNOIEhBU0hfSkVOCisjZW5kaWYKKworLyogVGhlIEJlcm5zdGVpbiBoYXNoIGZ1bmN0aW9uLCB1c2VkIGluIFBlcmwgcHJpb3IgdG8gdjUuNiAqLworI2RlZmluZSBIQVNIX0JFUihrZXksa2V5bGVuLG51bV9ia3RzLGhhc2h2LGJrdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1bnNpZ25lZCBfaGJfa2V5bGVuPWtleWxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjaGFyICpfaGJfa2V5PShjaGFyKikoa2V5KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoaGFzaHYpID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB3aGlsZSAoX2hiX2tleWxlbi0tKSAgeyAoaGFzaHYpID0gKChoYXNodikgKiAzMykgKyAqX2hiX2tleSsrOyB9ICAgICAgICAgICAgICAgXAorICBia3QgPSAoaGFzaHYpICYgKG51bV9ia3RzLTEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworCisvKiBTQVgvRk5WL09BVC9KRU4gaGFzaCBmdW5jdGlvbnMgYXJlIG1hY3JvIHZhcmlhbnRzIG9mIHRob3NlIGxpc3RlZCBhdAorICogaHR0cDovL2V0ZXJuYWxseWNvbmZ1enpsZWQuY29tL3R1dHMvYWxnb3JpdGhtcy9qc3dfdHV0X2hhc2hpbmcuYXNweCAqLworI2RlZmluZSBIQVNIX1NBWChrZXksa2V5bGVuLG51bV9ia3RzLGhhc2h2LGJrdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1bnNpZ25lZCBfc3hfaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjaGFyICpfaHNfa2V5PShjaGFyKikoa2V5KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBoYXNodiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmb3IoX3N4X2k9MDsgX3N4X2kgPCBrZXlsZW47IF9zeF9pKyspICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaGFzaHYgXj0gKGhhc2h2IDw8IDUpICsgKGhhc2h2ID4+IDIpICsgX2hzX2tleVtfc3hfaV07ICAgICAgICAgICAgICAgICAgICAgXAorICBia3QgPSBoYXNodiAmIChudW1fYmt0cy0xKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBIQVNIX0ZOVihrZXksa2V5bGVuLG51bV9ia3RzLGhhc2h2LGJrdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1bnNpZ25lZCBfZm5faTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjaGFyICpfaGZfa2V5PShjaGFyKikoa2V5KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBoYXNodiA9IDIxNjYxMzYyNjFVTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmb3IoX2ZuX2k9MDsgX2ZuX2kgPCBrZXlsZW47IF9mbl9pKyspICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaGFzaHYgPSAoaGFzaHYgKiAxNjc3NzYxOSkgXiBfaGZfa2V5W19mbl9pXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBia3QgPSBoYXNodiAmIChudW1fYmt0cy0xKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSgwKQorCisjZGVmaW5lIEhBU0hfT0FUKGtleSxrZXlsZW4sbnVtX2JrdHMsaGFzaHYsYmt0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHVuc2lnbmVkIF9ob19pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNoYXIgKl9ob19rZXk9KGNoYXIqKShrZXkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGhhc2h2ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZvcihfaG9faT0wOyBfaG9faSA8IGtleWxlbjsgX2hvX2krKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBoYXNodiArPSBfaG9fa2V5W19ob19pXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBoYXNodiArPSAoaGFzaHYgPDwgMTApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBoYXNodiBePSAoaGFzaHYgPj4gNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGhhc2h2ICs9IChoYXNodiA8PCAzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGhhc2h2IF49IChoYXNodiA+PiAxMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGhhc2h2ICs9IChoYXNodiA8PCAxNSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGJrdCA9IGhhc2h2ICYgKG51bV9ia3RzLTEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlKDApCisKKyNkZWZpbmUgSEFTSF9KRU5fTUlYKGEsYixjKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYSAtPSBiOyBhIC09IGM7IGEgXj0gKCBjID4+IDEzICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYiAtPSBjOyBiIC09IGE7IGIgXj0gKCBhIDw8IDggKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYyAtPSBhOyBjIC09IGI7IGMgXj0gKCBiID4+IDEzICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYSAtPSBiOyBhIC09IGM7IGEgXj0gKCBjID4+IDEyICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYiAtPSBjOyBiIC09IGE7IGIgXj0gKCBhIDw8IDE2ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYyAtPSBhOyBjIC09IGI7IGMgXj0gKCBiID4+IDUgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYSAtPSBiOyBhIC09IGM7IGEgXj0gKCBjID4+IDMgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYiAtPSBjOyBiIC09IGE7IGIgXj0gKCBhIDw8IDEwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYyAtPSBhOyBjIC09IGI7IGMgXj0gKCBiID4+IDE1ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgSEFTSF9KRU4oa2V5LGtleWxlbixudW1fYmt0cyxoYXNodixia3QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdW5zaWduZWQgX2hqX2ksX2hqX2osX2hqX2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdW5zaWduZWQgY2hhciAqX2hqX2tleT0odW5zaWduZWQgY2hhciopKGtleSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaGFzaHYgPSAweGZlZWRiZWVmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX2hqX2kgPSBfaGpfaiA9IDB4OWUzNzc5Yjk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX2hqX2sgPSAodW5zaWduZWQpa2V5bGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgd2hpbGUgKF9oal9rID49IDEyKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfaGpfaSArPSAgICAoX2hqX2tleVswXSArICggKHVuc2lnbmVkKV9oal9rZXlbMV0gPDwgOCApICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKyAoICh1bnNpZ25lZClfaGpfa2V5WzJdIDw8IDE2ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKyAoICh1bnNpZ25lZClfaGpfa2V5WzNdIDw8IDI0ICkgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfaGpfaiArPSAgICAoX2hqX2tleVs0XSArICggKHVuc2lnbmVkKV9oal9rZXlbNV0gPDwgOCApICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKyAoICh1bnNpZ25lZClfaGpfa2V5WzZdIDw8IDE2ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKyAoICh1bnNpZ25lZClfaGpfa2V5WzddIDw8IDI0ICkgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBoYXNodiArPSAoX2hqX2tleVs4XSArICggKHVuc2lnbmVkKV9oal9rZXlbOV0gPDwgOCApICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKyAoICh1bnNpZ25lZClfaGpfa2V5WzEwXSA8PCAxNiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKyAoICh1bnNpZ25lZClfaGpfa2V5WzExXSA8PCAyNCApICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgSEFTSF9KRU5fTUlYKF9oal9pLCBfaGpfaiwgaGFzaHYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgX2hqX2tleSArPSAxMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgX2hqX2sgLT0gMTI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaGFzaHYgKz0ga2V5bGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3dpdGNoICggX2hqX2sgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgY2FzZSAxMTogaGFzaHYgKz0gKCAodW5zaWduZWQpX2hqX2tleVsxMF0gPDwgMjQgKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgY2FzZSAxMDogaGFzaHYgKz0gKCAodW5zaWduZWQpX2hqX2tleVs5XSA8PCAxNiApOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgY2FzZSA5OiAgaGFzaHYgKz0gKCAodW5zaWduZWQpX2hqX2tleVs4XSA8PCA4ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgY2FzZSA4OiAgX2hqX2ogKz0gKCAodW5zaWduZWQpX2hqX2tleVs3XSA8PCAyNCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgY2FzZSA3OiAgX2hqX2ogKz0gKCAodW5zaWduZWQpX2hqX2tleVs2XSA8PCAxNiApOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgY2FzZSA2OiAgX2hqX2ogKz0gKCAodW5zaWduZWQpX2hqX2tleVs1XSA8PCA4ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgY2FzZSA1OiAgX2hqX2ogKz0gX2hqX2tleVs0XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgY2FzZSA0OiAgX2hqX2kgKz0gKCAodW5zaWduZWQpX2hqX2tleVszXSA8PCAyNCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgY2FzZSAzOiAgX2hqX2kgKz0gKCAodW5zaWduZWQpX2hqX2tleVsyXSA8PCAxNiApOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgY2FzZSAyOiAgX2hqX2kgKz0gKCAodW5zaWduZWQpX2hqX2tleVsxXSA8PCA4ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgY2FzZSAxOiAgX2hqX2kgKz0gX2hqX2tleVswXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSEFTSF9KRU5fTUlYKF9oal9pLCBfaGpfaiwgaGFzaHYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYmt0ID0gaGFzaHYgJiAobnVtX2JrdHMtMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUoMCkKKworLyogVGhlIFBhdWwgSHNpZWggaGFzaCBmdW5jdGlvbiAqLworI3VuZGVmIGdldDE2Yml0cworI2lmIChkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9faTM4Nl9fKSkgfHwgZGVmaW5lZChfX1dBVENPTUNfXykgICAgICAgICAgICAgXAorICB8fCBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkIChfX0JPUkxBTkRDX18pIHx8IGRlZmluZWQgKF9fVFVSQk9DX18pCisjZGVmaW5lIGdldDE2Yml0cyhkKSAoKigoY29uc3QgdWludDE2X3QgKikgKGQpKSkKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKGdldDE2Yml0cykKKyNkZWZpbmUgZ2V0MTZiaXRzKGQpICgoKCh1aW50MzJfdCkoKChjb25zdCB1aW50OF90ICopKGQpKVsxXSkpIDw8IDgpICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgKyh1aW50MzJfdCkoKChjb25zdCB1aW50OF90ICopKGQpKVswXSkgKQorI2VuZGlmCisjZGVmaW5lIEhBU0hfU0ZIKGtleSxrZXlsZW4sbnVtX2JrdHMsaGFzaHYsYmt0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHVuc2lnbmVkIGNoYXIgKl9zZmhfa2V5PSh1bnNpZ25lZCBjaGFyKikoa2V5KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHVpbnQzMl90IF9zZmhfdG1wLCBfc2ZoX2xlbiA9IGtleWxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGludCBfc2ZoX3JlbSA9IF9zZmhfbGVuICYgMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9zZmhfbGVuID4+PSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGhhc2h2ID0gMHhjYWZlYmFiZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIC8qIE1haW4gbG9vcCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZvciAoO19zZmhfbGVuID4gMDsgX3NmaF9sZW4tLSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaGFzaHYgICAgKz0gZ2V0MTZiaXRzIChfc2ZoX2tleSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX3NmaF90bXAgICAgICAgPSAodWludDMyX3QpKGdldDE2Yml0cyAoX3NmaF9rZXkrMikpIDw8IDExICBeIGhhc2h2OyAgICAgICAgICBcCisgICAgaGFzaHYgICAgID0gKGhhc2h2IDw8IDE2KSBeIF9zZmhfdG1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX3NmaF9rZXkgKz0gMipzaXplb2YgKHVpbnQxNl90KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaGFzaHYgICAgKz0gaGFzaHYgPj4gMTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIC8qIEhhbmRsZSBlbmQgY2FzZXMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN3aXRjaCAoX3NmaF9yZW0pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSAzOiBoYXNodiArPSBnZXQxNmJpdHMgKF9zZmhfa2V5KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBoYXNodiBePSBoYXNodiA8PCAxNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBoYXNodiBePSAodWludDMyX3QpKF9zZmhfa2V5W3NpemVvZiAodWludDE2X3QpXSA8PCAxOCk7ICAgICAgICAgICAgICBcCisgICAgICAgICAgICBoYXNodiArPSBoYXNodiA+PiAxMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSAyOiBoYXNodiArPSBnZXQxNmJpdHMgKF9zZmhfa2V5KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBoYXNodiBePSBoYXNodiA8PCAxMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBoYXNodiArPSBoYXNodiA+PiAxNzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSAxOiBoYXNodiArPSAqX3NmaF9rZXk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBoYXNodiBePSBoYXNodiA8PCAxMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBoYXNodiArPSBoYXNodiA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogRm9yY2UgImF2YWxhbmNoaW5nIiBvZiBmaW5hbCAxMjcgYml0cyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaGFzaHYgXj0gaGFzaHYgPDwgMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaGFzaHYgKz0gaGFzaHYgPj4gNTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaGFzaHYgXj0gaGFzaHYgPDwgNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaGFzaHYgKz0gaGFzaHYgPj4gMTc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaGFzaHYgXj0gaGFzaHYgPDwgMjU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaGFzaHYgKz0gaGFzaHYgPj4gNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYmt0ID0gaGFzaHYgJiAobnVtX2JrdHMtMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlKDApCisKKyNpZmRlZiBIQVNIX1VTSU5HX05PX1NUUklDVF9BTElBU0lORworLyogVGhlIE11cm11ckhhc2ggZXhwbG9pdHMgc29tZSBDUFUncyAoeDg2LHg4Nl82NCkgdG9sZXJhbmNlIGZvciB1bmFsaWduZWQgcmVhZHMuCisgKiBGb3Igb3RoZXIgdHlwZXMgb2YgQ1BVJ3MgKGUuZy4gU3BhcmMpIGFuIHVuYWxpZ25lZCByZWFkIGNhdXNlcyBhIGJ1cyBlcnJvci4KKyAqIE11cm11ckhhc2ggdXNlcyB0aGUgZmFzdGVyIGFwcHJvYWNoIG9ubHkgb24gQ1BVJ3Mgd2hlcmUgd2Uga25vdyBpdCdzIHNhZmUuCisgKgorICogTm90ZSB0aGUgcHJlcHJvY2Vzc29yIGJ1aWx0LWluIGRlZmluZXMgY2FuIGJlIGVtaXR0ZWQgdXNpbmc6CisgKgorICogICBnY2MgLW02NCAtZE0gLUUgLSA8IC9kZXYvbnVsbCAgICAgICAgICAgICAgICAgIChvbiBnY2MpCisgKiAgIGNjIC0jIyBhLmMgKHdoZXJlIGEuYyBpcyBhIHNpbXBsZSB0ZXN0IGZpbGUpICAgKFN1biBTdHVkaW8pCisgKi8KKyNpZiAoZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSAgfHwgZGVmaW5lZChfTV9JWDg2KSkKKyNkZWZpbmUgTVVSX0dFVEJMT0NLKHAsaSkgcFtpXQorI2Vsc2UgLyogbm9uIGludGVsICovCisjZGVmaW5lIE1VUl9QTFVTMF9BTElHTkVEKHApICgoKHVuc2lnbmVkIGxvbmcpcCAmIDB4MykgPT0gMCkKKyNkZWZpbmUgTVVSX1BMVVMxX0FMSUdORUQocCkgKCgodW5zaWduZWQgbG9uZylwICYgMHgzKSA9PSAxKQorI2RlZmluZSBNVVJfUExVUzJfQUxJR05FRChwKSAoKCh1bnNpZ25lZCBsb25nKXAgJiAweDMpID09IDIpCisjZGVmaW5lIE1VUl9QTFVTM19BTElHTkVEKHApICgoKHVuc2lnbmVkIGxvbmcpcCAmIDB4MykgPT0gMykKKyNkZWZpbmUgV1AocCkgKCh1aW50MzJfdCopKCh1bnNpZ25lZCBsb25nKShwKSAmIH4zVUwpKQorI2lmIChkZWZpbmVkKF9fQklHX0VORElBTl9fKSB8fCBkZWZpbmVkKFNQQVJDKSB8fCBkZWZpbmVkKF9fcHBjX18pIHx8IGRlZmluZWQoX19wcGM2NF9fKSkKKyNkZWZpbmUgTVVSX1RIUkVFX09ORShwKSAoKCgoKldQKHApKSYweDAwZmZmZmZmKSA8PCA4KSB8ICgoKCooV1AocCkrMSkpJjB4ZmYwMDAwMDApID4+IDI0KSkKKyNkZWZpbmUgTVVSX1RXT19UV08ocCkgICAoKCgoKldQKHApKSYweDAwMDBmZmZmKSA8PDE2KSB8ICgoKCooV1AocCkrMSkpJjB4ZmZmZjAwMDApID4+IDE2KSkKKyNkZWZpbmUgTVVSX09ORV9USFJFRShwKSAoKCgoKldQKHApKSYweDAwMDAwMGZmKSA8PDI0KSB8ICgoKCooV1AocCkrMSkpJjB4ZmZmZmZmMDApID4+ICA4KSkKKyNlbHNlIC8qIGFzc3VtZSBsaXR0bGUgZW5kaWFuIG5vbi1pbnRlbCAqLworI2RlZmluZSBNVVJfVEhSRUVfT05FKHApICgoKCgqV1AocCkpJjB4ZmZmZmZmMDApID4+IDgpIHwgKCgoKihXUChwKSsxKSkmMHgwMDAwMDBmZikgPDwgMjQpKQorI2RlZmluZSBNVVJfVFdPX1RXTyhwKSAgICgoKCgqV1AocCkpJjB4ZmZmZjAwMDApID4+MTYpIHwgKCgoKihXUChwKSsxKSkmMHgwMDAwZmZmZikgPDwgMTYpKQorI2RlZmluZSBNVVJfT05FX1RIUkVFKHApICgoKCgqV1AocCkpJjB4ZmYwMDAwMDApID4+MjQpIHwgKCgoKihXUChwKSsxKSkmMHgwMGZmZmZmZikgPDwgIDgpKQorI2VuZGlmCisjZGVmaW5lIE1VUl9HRVRCTE9DSyhwLGkpIChNVVJfUExVUzBfQUxJR05FRChwKSA/ICgocClbaV0pIDogICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTVVSX1BMVVMxX0FMSUdORUQocCkgPyBNVVJfVEhSRUVfT05FKHApIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTVVSX1BMVVMyX0FMSUdORUQocCkgPyBNVVJfVFdPX1RXTyhwKSA6ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVVJfT05FX1RIUkVFKHApKSkpCisjZW5kaWYKKyNkZWZpbmUgTVVSX1JPVEwzMih4LHIpICgoKHgpIDw8IChyKSkgfCAoKHgpID4+ICgzMiAtIChyKSkpKQorI2RlZmluZSBNVVJfRk1JWChfaCkgXAorZG8geyAgICAgICAgICAgICAgICAgXAorICBfaCBePSBfaCA+PiAxNjsgICAgXAorICBfaCAqPSAweDg1ZWJjYTZiOyAgXAorICBfaCBePSBfaCA+PiAxMzsgICAgXAorICBfaCAqPSAweGMyYjJhZTM1bDsgXAorICBfaCBePSBfaCA+PiAxNjsgICAgXAorfSB3aGlsZSgwKQorCisjZGVmaW5lIEhBU0hfTVVSKGtleSxrZXlsZW4sbnVtX2JrdHMsaGFzaHYsYmt0KSAgICAgICAgICAgICAgICAgICAgICAgIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50OF90ICpfbXVyX2RhdGEgPSAoY29uc3QgdWludDhfdCopKGtleSk7ICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IGludCBfbXVyX25ibG9ja3MgPSAoa2V5bGVuKSAvIDQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdWludDMyX3QgX211cl9oMSA9IDB4Zjg4RDUzNTM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1aW50MzJfdCBfbXVyX2MxID0gMHhjYzllMmQ1MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHVpbnQzMl90IF9tdXJfYzIgPSAweDFiODczNTkzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdWludDMyX3QgX211cl9rMSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50OF90ICpfbXVyX3RhaWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQzMl90ICpfbXVyX2Jsb2NrcyA9IChjb25zdCB1aW50MzJfdCopKF9tdXJfZGF0YStfbXVyX25ibG9ja3MqNCk7IFwKKyAgaW50IF9tdXJfaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmb3IoX211cl9pID0gLV9tdXJfbmJsb2NrczsgX211cl9pOyBfbXVyX2krKykgeyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX211cl9rMSA9IE1VUl9HRVRCTE9DSyhfbXVyX2Jsb2NrcyxfbXVyX2kpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfbXVyX2sxICo9IF9tdXJfYzE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9tdXJfazEgPSBNVVJfUk9UTDMyKF9tdXJfazEsMTUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX211cl9rMSAqPSBfbXVyX2MyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9tdXJfaDEgXj0gX211cl9rMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX211cl9oMSA9IE1VUl9ST1RMMzIoX211cl9oMSwxMyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfbXVyX2gxID0gX211cl9oMSo1KzB4ZTY1NDZiNjQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9tdXJfdGFpbCA9IChjb25zdCB1aW50OF90KikoX211cl9kYXRhICsgX211cl9uYmxvY2tzKjQpOyAgICAgICAgICAgIFwKKyAgX211cl9rMT0wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzd2l0Y2goKGtleWxlbikgJiAzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSAzOiBfbXVyX2sxIF49IF9tdXJfdGFpbFsyXSA8PCAxNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXNlIDI6IF9tdXJfazEgXj0gX211cl90YWlsWzFdIDw8IDg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgMTogX211cl9rMSBePSBfbXVyX3RhaWxbMF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX211cl9rMSAqPSBfbXVyX2MxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfbXVyX2sxID0gTVVSX1JPVEwzMihfbXVyX2sxLDE1KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9tdXJfazEgKj0gX211cl9jMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX211cl9oMSBePSBfbXVyX2sxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfbXVyX2gxIF49IChrZXlsZW4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIE1VUl9GTUlYKF9tdXJfaDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaGFzaHYgPSBfbXVyX2gxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBia3QgPSBoYXNodiAmIChudW1fYmt0cy0xKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlKDApCisjZW5kaWYgIC8qIEhBU0hfVVNJTkdfTk9fU1RSSUNUX0FMSUFTSU5HICovCisKKy8qIGtleSBjb21wYXJpc29uIGZ1bmN0aW9uOyByZXR1cm4gMCBpZiBrZXlzIGVxdWFsICovCisjZGVmaW5lIEhBU0hfS0VZQ01QKGEsYixsZW4pIG1lbWNtcChhLGIsbGVuKQorCisvKiBpdGVyYXRlIG92ZXIgaXRlbXMgaW4gYSBrbm93biBidWNrZXQgdG8gZmluZCBkZXNpcmVkIGl0ZW0gKi8KKyNkZWZpbmUgSEFTSF9GSU5EX0lOX0JLVCh0YmwsaGgsaGVhZCxrZXlwdHIsa2V5bGVuX2luLG91dCkgICAgICAgICAgICAgICAgICAgICAgIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyBpZiAoaGVhZC5oaF9oZWFkKSBERUNMVFlQRV9BU1NJR04ob3V0LEVMTVRfRlJPTV9ISCh0YmwsaGVhZC5oaF9oZWFkKSk7ICAgICAgICAgIFwKKyBlbHNlIG91dD1OVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyB3aGlsZSAob3V0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKG91dCktPmhoLmtleWxlbiA9PSBrZXlsZW5faW4pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoKEhBU0hfS0VZQ01QKChvdXQpLT5oaC5rZXksa2V5cHRyLGtleWxlbl9pbikpID09IDApIGJyZWFrOyAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKChvdXQpLT5oaC5oaF9uZXh0KSBERUNMVFlQRV9BU1NJR04ob3V0LEVMTVRfRlJPTV9ISCh0YmwsKG91dCktPmhoLmhoX25leHQpKTsgXAorICAgIGVsc2Ugb3V0ID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSgwKQorCisvKiBhZGQgYW4gaXRlbSB0byBhIGJ1Y2tldCAgKi8KKyNkZWZpbmUgSEFTSF9BRERfVE9fQktUKGhlYWQsYWRkaGgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyBoZWFkLmNvdW50Kys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAoYWRkaGgpLT5oaF9uZXh0ID0gaGVhZC5oaF9oZWFkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAoYWRkaGgpLT5oaF9wcmV2ID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyBpZiAoaGVhZC5oaF9oZWFkKSB7IChoZWFkKS5oaF9oZWFkLT5oaF9wcmV2ID0gKGFkZGhoKTsgfSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAoaGVhZCkuaGhfaGVhZD1hZGRoaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyBpZiAoaGVhZC5jb3VudCA+PSAoKGhlYWQuZXhwYW5kX211bHQrMSkgKiBIQVNIX0JLVF9DQVBBQ0lUWV9USFJFU0gpICAgICAgICAgICAgIFwKKyAgICAgJiYgKGFkZGhoKS0+dGJsLT5ub2V4cGFuZCAhPSAxKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBIQVNIX0VYUEFORF9CVUNLRVRTKChhZGRoaCktPnRibCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUoMCkKKworLyogcmVtb3ZlIGFuIGl0ZW0gZnJvbSBhIGdpdmVuIGJ1Y2tldCAqLworI2RlZmluZSBIQVNIX0RFTF9JTl9CS1QoaGgsaGVhZCxoaF9kZWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChoZWFkKS5jb3VudC0tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoaGVhZCkuaGhfaGVhZCA9PSBoaF9kZWwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKGhlYWQpLmhoX2hlYWQgPSBoaF9kZWwtPmhoX25leHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChoaF9kZWwtPmhoX3ByZXYpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBoaF9kZWwtPmhoX3ByZXYtPmhoX25leHQgPSBoaF9kZWwtPmhoX25leHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChoaF9kZWwtPmhoX25leHQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBoaF9kZWwtPmhoX25leHQtPmhoX3ByZXYgPSBoaF9kZWwtPmhoX3ByZXY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworLyogQnVja2V0IGV4cGFuc2lvbiBoYXMgdGhlIGVmZmVjdCBvZiBkb3VibGluZyB0aGUgbnVtYmVyIG9mIGJ1Y2tldHMKKyAqIGFuZCByZWRpc3RyaWJ1dGluZyB0aGUgaXRlbXMgaW50byB0aGUgbmV3IGJ1Y2tldHMuIElkZWFsbHkgdGhlCisgKiBpdGVtcyB3aWxsIGRpc3RyaWJ1dGUgbW9yZSBvciBsZXNzIGV2ZW5seSBpbnRvIHRoZSBuZXcgYnVja2V0cworICogKHRoZSBleHRlbnQgdG8gd2hpY2ggdGhpcyBpcyB0cnVlIGlzIGEgbWVhc3VyZSBvZiB0aGUgcXVhbGl0eSBvZgorICogdGhlIGhhc2ggZnVuY3Rpb24gYXMgaXQgYXBwbGllcyB0byB0aGUga2V5IGRvbWFpbikuCisgKgorICogV2l0aCB0aGUgaXRlbXMgZGlzdHJpYnV0ZWQgaW50byBtb3JlIGJ1Y2tldHMsIHRoZSBjaGFpbiBsZW5ndGgKKyAqIChpdGVtIGNvdW50KSBpbiBlYWNoIGJ1Y2tldCBpcyByZWR1Y2VkLiBUaHVzIGJ5IGV4cGFuZGluZyBidWNrZXRzCisgKiB0aGUgaGFzaCBrZWVwcyBhIGJvdW5kIG9uIHRoZSBjaGFpbiBsZW5ndGguIFRoaXMgYm91bmRlZCBjaGFpbgorICogbGVuZ3RoIGlzIHRoZSBlc3NlbmNlIG9mIGhvdyBhIGhhc2ggcHJvdmlkZXMgY29uc3RhbnQgdGltZSBsb29rdXAuCisgKgorICogVGhlIGNhbGN1bGF0aW9uIG9mIHRibC0+aWRlYWxfY2hhaW5fbWF4bGVuIGJlbG93IGRlc2VydmVzIHNvbWUKKyAqIGV4cGxhbmF0aW9uLiBGaXJzdCwga2VlcCBpbiBtaW5kIHRoYXQgd2UncmUgY2FsY3VsYXRpbmcgdGhlIGlkZWFsCisgKiBtYXhpbXVtIGNoYWluIGxlbmd0aCBiYXNlZCBvbiB0aGUgKm5ldyogKGRvdWJsZWQpIGJ1Y2tldCBjb3VudC4KKyAqIEluIGZyYWN0aW9ucyB0aGlzIGlzIGp1c3Qgbi9iIChuPW51bWJlciBvZiBpdGVtcyxiPW5ldyBudW0gYnVja2V0cykuCisgKiBTaW5jZSB0aGUgaWRlYWwgY2hhaW4gbGVuZ3RoIGlzIGFuIGludGVnZXIsIHdlIHdhbnQgdG8gY2FsY3VsYXRlCisgKiBjZWlsKG4vYikuIFdlIGRvbid0IGRlcGVuZCBvbiBmbG9hdGluZyBwb2ludCBhcml0aG1ldGljIGluIHRoaXMKKyAqIGhhc2gsIHNvIHRvIGNhbGN1bGF0ZSBjZWlsKG4vYikgd2l0aCBpbnRlZ2VycyB3ZSBjb3VsZCB3cml0ZQorICoKKyAqICAgICAgY2VpbChuL2IpID0gKG4vYikgKyAoKG4lYik/MTowKQorICoKKyAqIGFuZCBpbiBmYWN0IGEgcHJldmlvdXMgdmVyc2lvbiBvZiB0aGlzIGhhc2ggZGlkIGp1c3QgdGhhdC4KKyAqIEJ1dCBub3cgd2UgaGF2ZSBpbXByb3ZlZCB0aGluZ3MgYSBiaXQgYnkgcmVjb2duaXppbmcgdGhhdCBiIGlzCisgKiBhbHdheXMgYSBwb3dlciBvZiB0d28uIFdlIGtlZXAgaXRzIGJhc2UgMiBsb2cgaGFuZHkgKGNhbGwgaXQgbGIpLAorICogc28gbm93IHdlIGNhbiB3cml0ZSB0aGlzIHdpdGggYSBiaXQgc2hpZnQgYW5kIGxvZ2ljYWwgQU5EOgorICoKKyAqICAgICAgY2VpbChuL2IpID0gKG4+PmxiKSArICggKG4gJiAoYi0xKSkgPyAxOjApCisgKgorICovCisjZGVmaW5lIEhBU0hfRVhQQU5EX0JVQ0tFVFModGJsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdW5zaWduZWQgX2hlX2JrdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdW5zaWduZWQgX2hlX2JrdF9pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RydWN0IFVUX2hhc2hfaGFuZGxlICpfaGVfdGhoLCAqX2hlX2hoX254dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVVRfaGFzaF9idWNrZXQgKl9oZV9uZXdfYnVja2V0cywgKl9oZV9uZXdia3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX2hlX25ld19idWNrZXRzID0gKFVUX2hhc2hfYnVja2V0Kil1dGhhc2hfbWFsbG9jKCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgMiAqIHRibC0+bnVtX2J1Y2tldHMgKiBzaXplb2Yoc3RydWN0IFVUX2hhc2hfYnVja2V0KSk7ICAgICAgICAgICAgICBcCisgICAgaWYgKCFfaGVfbmV3X2J1Y2tldHMpIHsgdXRoYXNoX2ZhdGFsKCAib3V0IG9mIG1lbW9yeSIpOyB9ICAgICAgICAgICAgICAgICAgICBcCisgICAgbWVtc2V0KF9oZV9uZXdfYnVja2V0cywgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAyICogdGJsLT5udW1fYnVja2V0cyAqIHNpemVvZihzdHJ1Y3QgVVRfaGFzaF9idWNrZXQpKTsgICAgICAgICAgICAgICBcCisgICAgdGJsLT5pZGVhbF9jaGFpbl9tYXhsZW4gPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgKHRibC0+bnVtX2l0ZW1zID4+ICh0YmwtPmxvZzJfbnVtX2J1Y2tldHMrMSkpICsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgKCh0YmwtPm51bV9pdGVtcyAmICgodGJsLT5udW1fYnVja2V0cyoyKS0xKSkgPyAxIDogMCk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgdGJsLT5ub25pZGVhbF9pdGVtcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKF9oZV9ia3RfaSA9IDA7IF9oZV9ia3RfaSA8IHRibC0+bnVtX2J1Y2tldHM7IF9oZV9ia3RfaSsrKSAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIF9oZV90aGggPSB0YmwtPmJ1Y2tldHNbIF9oZV9ia3RfaSBdLmhoX2hlYWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHdoaWxlIChfaGVfdGhoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIF9oZV9oaF9ueHQgPSBfaGVfdGhoLT5oaF9uZXh0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIEhBU0hfVE9fQktUKCBfaGVfdGhoLT5oYXNodiwgdGJsLT5udW1fYnVja2V0cyoyLCBfaGVfYmt0KTsgICAgICAgICAgICBcCisgICAgICAgICAgIF9oZV9uZXdia3QgPSAmKF9oZV9uZXdfYnVja2V0c1sgX2hlX2JrdCBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIGlmICgrKyhfaGVfbmV3Ymt0LT5jb3VudCkgPiB0YmwtPmlkZWFsX2NoYWluX21heGxlbikgeyAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgdGJsLT5ub25pZGVhbF9pdGVtcysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgX2hlX25ld2JrdC0+ZXhwYW5kX211bHQgPSBfaGVfbmV3Ymt0LT5jb3VudCAvICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGJsLT5pZGVhbF9jaGFpbl9tYXhsZW47ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIF9oZV90aGgtPmhoX3ByZXYgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIF9oZV90aGgtPmhoX25leHQgPSBfaGVfbmV3Ymt0LT5oaF9oZWFkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIGlmIChfaGVfbmV3Ymt0LT5oaF9oZWFkKSBfaGVfbmV3Ymt0LT5oaF9oZWFkLT5oaF9wcmV2ID0gICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgX2hlX3RoaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIF9oZV9uZXdia3QtPmhoX2hlYWQgPSBfaGVfdGhoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIF9oZV90aGggPSBfaGVfaGhfbnh0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdXRoYXNoX2ZyZWUoIHRibC0+YnVja2V0cywgdGJsLT5udW1fYnVja2V0cypzaXplb2Yoc3RydWN0IFVUX2hhc2hfYnVja2V0KSApOyBcCisgICAgdGJsLT5udW1fYnVja2V0cyAqPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGJsLT5sb2cyX251bV9idWNrZXRzKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGJsLT5idWNrZXRzID0gX2hlX25ld19idWNrZXRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGJsLT5pbmVmZl9leHBhbmRzID0gKHRibC0+bm9uaWRlYWxfaXRlbXMgPiAodGJsLT5udW1faXRlbXMgPj4gMSkpID8gICAgICAgICBcCisgICAgICAgICh0YmwtPmluZWZmX2V4cGFuZHMrMSkgOiAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHRibC0+aW5lZmZfZXhwYW5kcyA+IDEpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRibC0+bm9leHBhbmQ9MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHV0aGFzaF9ub2V4cGFuZF9meWkodGJsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdXRoYXNoX2V4cGFuZF9meWkodGJsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlKDApCisKKworLyogVGhpcyBpcyBhbiBhZGFwdGF0aW9uIG9mIFNpbW9uIFRhdGhhbSdzIE8obiBsb2cobikpIG1lcmdlc29ydCAqLworLyogTm90ZSB0aGF0IEhBU0hfU09SVCBhc3N1bWVzIHRoZSBoYXNoIGhhbmRsZSBuYW1lIHRvIGJlIGhoLgorICogSEFTSF9TUlQgd2FzIGFkZGVkIHRvIGFsbG93IHRoZSBoYXNoIGhhbmRsZSBuYW1lIHRvIGJlIHBhc3NlZCBpbi4gKi8KKyNkZWZpbmUgSEFTSF9TT1JUKGhlYWQsY21wZmNuKSBIQVNIX1NSVChoaCxoZWFkLGNtcGZjbikKKyNkZWZpbmUgSEFTSF9TUlQoaGgsaGVhZCxjbXBmY24pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdW5zaWduZWQgX2hzX2k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdW5zaWduZWQgX2hzX2xvb3BpbmcsX2hzX25tZXJnZXMsX2hzX2luc2l6ZSxfaHNfcHNpemUsX2hzX3FzaXplOyAgICAgICAgICAgICAgIFwKKyAgc3RydWN0IFVUX2hhc2hfaGFuZGxlICpfaHNfcCwgKl9oc19xLCAqX2hzX2UsICpfaHNfbGlzdCwgKl9oc190YWlsOyAgICAgICAgICAgIFwKKyAgaWYgKGhlYWQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIF9oc19pbnNpemUgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIF9oc19sb29waW5nID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIF9oc19saXN0ID0gJigoaGVhZCktPmhoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHdoaWxlIChfaHNfbG9vcGluZykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBfaHNfcCA9IF9oc19saXN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBfaHNfbGlzdCA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBfaHNfdGFpbCA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBfaHNfbm1lcmdlcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICB3aGlsZSAoX2hzX3ApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgX2hzX25tZXJnZXMrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgX2hzX3EgPSBfaHNfcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgX2hzX3BzaXplID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgZm9yICggX2hzX2kgPSAwOyBfaHNfaSAgPCBfaHNfaW5zaXplOyBfaHNfaSsrICkgeyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIF9oc19wc2l6ZSsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIF9oc19xID0gKFVUX2hhc2hfaGFuZGxlKikoKF9oc19xLT5uZXh0KSA/ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCh2b2lkKikoKGNoYXIqKShfaHNfcS0+bmV4dCkgKyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGhlYWQpLT5oaC50YmwtPmhobykpIDogTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGlmICghIChfaHNfcSkgKSBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgX2hzX3FzaXplID0gX2hzX2luc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgd2hpbGUgKChfaHNfcHNpemUgPiAwKSB8fCAoKF9oc19xc2l6ZSA+IDApICYmIF9oc19xICkpIHsgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGlmIChfaHNfcHNpemUgPT0gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBfaHNfZSA9IF9oc19xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBfaHNfcSA9IChVVF9oYXNoX2hhbmRsZSopKChfaHNfcS0+bmV4dCkgPyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodm9pZCopKChjaGFyKikoX2hzX3EtPm5leHQpICsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoZWFkKS0+aGgudGJsLT5oaG8pKSA6IE5VTEwpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBfaHNfcXNpemUtLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIChfaHNfcXNpemUgPT0gMCkgfHwgIShfaHNfcSkgKSB7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBfaHNfZSA9IF9oc19wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBfaHNfcCA9IChVVF9oYXNoX2hhbmRsZSopKChfaHNfcC0+bmV4dCkgPyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodm9pZCopKChjaGFyKikoX2hzX3AtPm5leHQpICsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoZWFkKS0+aGgudGJsLT5oaG8pKSA6IE5VTEwpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBfaHNfcHNpemUtLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBjbXBmY24oREVDTFRZUEUoaGVhZCkoRUxNVF9GUk9NX0hIKChoZWFkKS0+aGgudGJsLF9oc19wKSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDTFRZUEUoaGVhZCkoRUxNVF9GUk9NX0hIKChoZWFkKS0+aGgudGJsLF9oc19xKSkpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSA8PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBfaHNfZSA9IF9oc19wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBfaHNfcCA9IChVVF9oYXNoX2hhbmRsZSopKChfaHNfcC0+bmV4dCkgPyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodm9pZCopKChjaGFyKikoX2hzX3AtPm5leHQpICsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoZWFkKS0+aGgudGJsLT5oaG8pKSA6IE5VTEwpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBfaHNfcHNpemUtLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBfaHNfZSA9IF9oc19xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBfaHNfcSA9IChVVF9oYXNoX2hhbmRsZSopKChfaHNfcS0+bmV4dCkgPyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodm9pZCopKChjaGFyKikoX2hzX3EtPm5leHQpICsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoZWFkKS0+aGgudGJsLT5oaG8pKSA6IE5VTEwpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBfaHNfcXNpemUtLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGlmICggX2hzX3RhaWwgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBfaHNfdGFpbC0+bmV4dCA9ICgoX2hzX2UpID8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTE1UX0ZST01fSEgoKGhlYWQpLT5oaC50YmwsX2hzX2UpIDogTlVMTCk7ICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBfaHNfbGlzdCA9IF9oc19lOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIF9oc19lLT5wcmV2ID0gKChfaHNfdGFpbCkgPyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIEVMTVRfRlJPTV9ISCgoaGVhZCktPmhoLnRibCxfaHNfdGFpbCkgOiBOVUxMKTsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIF9oc190YWlsID0gX2hzX2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgX2hzX3AgPSBfaHNfcTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBfaHNfdGFpbC0+bmV4dCA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBpZiAoIF9oc19ubWVyZ2VzIDw9IDEgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgX2hzX2xvb3Bpbmc9MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKGhlYWQpLT5oaC50YmwtPnRhaWwgPSBfaHNfdGFpbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgREVDTFRZUEVfQVNTSUdOKGhlYWQsRUxNVF9GUk9NX0hIKChoZWFkKS0+aGgudGJsLCBfaHNfbGlzdCkpOyAgICAgIFwKKyAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBfaHNfaW5zaXplICo9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEhBU0hfRlNDSyhoaCxoZWFkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKy8qIFRoaXMgZnVuY3Rpb24gc2VsZWN0cyBpdGVtcyBmcm9tIG9uZSBoYXNoIGludG8gYW5vdGhlciBoYXNoLgorICogVGhlIGVuZCByZXN1bHQgaXMgdGhhdCB0aGUgc2VsZWN0ZWQgaXRlbXMgaGF2ZSBkdWFsIHByZXNlbmNlCisgKiBpbiBib3RoIGhhc2hlcy4gVGhlcmUgaXMgbm8gY29weSBvZiB0aGUgaXRlbXMgbWFkZTsgcmF0aGVyCisgKiB0aGV5IGFyZSBhZGRlZCBpbnRvIHRoZSBuZXcgaGFzaCB0aHJvdWdoIGEgc2Vjb25kYXJ5IGhhc2gKKyAqIGhhc2ggaGFuZGxlIHRoYXQgbXVzdCBiZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuICovCisjZGVmaW5lIEhBU0hfU0VMRUNUKGhoX2RzdCwgZHN0LCBoaF9zcmMsIHNyYywgY29uZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHVuc2lnbmVkIF9zcmNfYmt0LCBfZHN0X2JrdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZvaWQgKl9sYXN0X2VsdD1OVUxMLCAqX2VsdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFVUX2hhc2hfaGFuZGxlICpfc3JjX2hoLCAqX2RzdF9oaCwgKl9sYXN0X2VsdF9oaD1OVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHB0cmRpZmZfdCBfZHN0X2hobyA9ICgoY2hhciopKCYoZHN0KS0+aGhfZHN0KSAtIChjaGFyKikoZHN0KSk7ICAgICAgICAgICAgICAgICBcCisgIGlmIChzcmMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKF9zcmNfYmt0PTA7IF9zcmNfYmt0IDwgKHNyYyktPmhoX3NyYy50YmwtPm51bV9idWNrZXRzOyBfc3JjX2JrdCsrKSB7ICAgICBcCisgICAgICBmb3IoX3NyY19oaCA9IChzcmMpLT5oaF9zcmMudGJsLT5idWNrZXRzW19zcmNfYmt0XS5oaF9oZWFkOyAgICAgICAgICAgICAgICBcCisgICAgICAgICAgX3NyY19oaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgX3NyY19oaCA9IF9zcmNfaGgtPmhoX25leHQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgX2VsdCA9IEVMTVRfRlJPTV9ISCgoc3JjKS0+aGhfc3JjLnRibCwgX3NyY19oaCk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgaWYgKGNvbmQoX2VsdCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfZHN0X2hoID0gKFVUX2hhc2hfaGFuZGxlKikoKChjaGFyKilfZWx0KSArIF9kc3RfaGhvKTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfZHN0X2hoLT5rZXkgPSBfc3JjX2hoLT5rZXk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfZHN0X2hoLT5rZXlsZW4gPSBfc3JjX2hoLT5rZXlsZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfZHN0X2hoLT5oYXNodiA9IF9zcmNfaGgtPmhhc2h2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfZHN0X2hoLT5wcmV2ID0gX2xhc3RfZWx0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfZHN0X2hoLT5uZXh0ID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoX2xhc3RfZWx0X2hoKSB7IF9sYXN0X2VsdF9oaC0+bmV4dCA9IF9lbHQ7IH0gICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoIWRzdCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIERFQ0xUWVBFX0FTU0lHTihkc3QsX2VsdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIEhBU0hfTUFLRV9UQUJMRShoaF9kc3QsZHN0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIF9kc3RfaGgtPnRibCA9IChkc3QpLT5oaF9kc3QudGJsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBIQVNIX1RPX0JLVChfZHN0X2hoLT5oYXNodiwgX2RzdF9oaC0+dGJsLT5udW1fYnVja2V0cywgX2RzdF9ia3QpOyAgICBcCisgICAgICAgICAgICBIQVNIX0FERF9UT19CS1QoX2RzdF9oaC0+dGJsLT5idWNrZXRzW19kc3RfYmt0XSxfZHN0X2hoKTsgICAgICAgICAgICBcCisgICAgICAgICAgICAoZHN0KS0+aGhfZHN0LnRibC0+bnVtX2l0ZW1zKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfbGFzdF9lbHQgPSBfZWx0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfbGFzdF9lbHRfaGggPSBfZHN0X2hoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEhBU0hfRlNDSyhoaF9kc3QsZHN0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEhBU0hfQ0xFQVIoaGgsaGVhZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChoZWFkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdXRoYXNoX2ZyZWUoKGhlYWQpLT5oaC50YmwtPmJ1Y2tldHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKGhlYWQpLT5oaC50YmwtPm51bV9idWNrZXRzKnNpemVvZihzdHJ1Y3QgVVRfaGFzaF9idWNrZXQpKTsgICAgICBcCisgICAgSEFTSF9CTE9PTV9GUkVFKChoZWFkKS0+aGgudGJsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdXRoYXNoX2ZyZWUoKGhlYWQpLT5oaC50YmwsIHNpemVvZihVVF9oYXNoX3RhYmxlKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKGhlYWQpPU5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlKDApCisKKyNkZWZpbmUgSEFTSF9PVkVSSEVBRChoaCxoZWFkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAoc2l6ZV90KSgoKChoZWFkKS0+aGgudGJsLT5udW1faXRlbXMgICAqIHNpemVvZihVVF9oYXNoX2hhbmRsZSkpICAgKyAgICAgICAgICAgIFwKKyAgICAgICAgICAgKChoZWFkKS0+aGgudGJsLT5udW1fYnVja2V0cyAqIHNpemVvZihVVF9oYXNoX2J1Y2tldCkpICAgKyAgICAgICAgICAgIFwKKyAgICAgICAgICAgIChzaXplb2YoVVRfaGFzaF90YWJsZSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAgICAgICAgICAgIFwKKyAgICAgICAgICAgIChIQVNIX0JMT09NX0JZVEVMRU4pKSkKKworI2lmZGVmIE5PX0RFQ0xUWVBFCisjZGVmaW5lIEhBU0hfSVRFUihoaCxoZWFkLGVsLHRtcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitmb3IoKGVsKT0oaGVhZCksICgqKGNoYXIqKikoJih0bXApKSk9KGNoYXIqKSgoaGVhZCk/KGhlYWQpLT5oaC5uZXh0Ok5VTEwpOyAgICAgICBcCisgIGVsOyAoZWwpPSh0bXApLCgqKGNoYXIqKikoJih0bXApKSk9KGNoYXIqKSgodG1wKT8odG1wKS0+aGgubmV4dDpOVUxMKSkKKyNlbHNlCisjZGVmaW5lIEhBU0hfSVRFUihoaCxoZWFkLGVsLHRtcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitmb3IoKGVsKT0oaGVhZCksKHRtcCk9REVDTFRZUEUoZWwpKChoZWFkKT8oaGVhZCktPmhoLm5leHQ6TlVMTCk7ICAgICAgICAgICAgICAgICBcCisgIGVsOyAoZWwpPSh0bXApLCh0bXApPURFQ0xUWVBFKGVsKSgodG1wKT8odG1wKS0+aGgubmV4dDpOVUxMKSkKKyNlbmRpZgorCisvKiBvYnRhaW4gYSBjb3VudCBvZiBpdGVtcyBpbiB0aGUgaGFzaCAqLworI2RlZmluZSBIQVNIX0NPVU5UKGhlYWQpIEhBU0hfQ05UKGhoLGhlYWQpCisjZGVmaW5lIEhBU0hfQ05UKGhoLGhlYWQpICgoaGVhZCk/KChoZWFkKS0+aGgudGJsLT5udW1faXRlbXMpOjApCisKK3R5cGVkZWYgc3RydWN0IFVUX2hhc2hfYnVja2V0IHsKKyAgIHN0cnVjdCBVVF9oYXNoX2hhbmRsZSAqaGhfaGVhZDsKKyAgIHVuc2lnbmVkIGNvdW50OworCisgICAvKiBleHBhbmRfbXVsdCBpcyBub3JtYWxseSBzZXQgdG8gMC4gSW4gdGhpcyBzaXR1YXRpb24sIHRoZSBtYXggY2hhaW4gbGVuZ3RoCisgICAgKiB0aHJlc2hvbGQgaXMgZW5mb3JjZWQgYXQgaXRzIGRlZmF1bHQgdmFsdWUsIEhBU0hfQktUX0NBUEFDSVRZX1RIUkVTSC4gKElmCisgICAgKiB0aGUgYnVja2V0J3MgY2hhaW4gZXhjZWVkcyB0aGlzIGxlbmd0aCwgYnVja2V0IGV4cGFuc2lvbiBpcyB0cmlnZ2VyZWQpLgorICAgICogSG93ZXZlciwgc2V0dGluZyBleHBhbmRfbXVsdCB0byBhIG5vbi16ZXJvIHZhbHVlIGRlbGF5cyBidWNrZXQgZXhwYW5zaW9uCisgICAgKiAodGhhdCB3b3VsZCBiZSB0cmlnZ2VyZWQgYnkgYWRkaXRpb25zIHRvIHRoaXMgcGFydGljdWxhciBidWNrZXQpCisgICAgKiB1bnRpbCBpdHMgY2hhaW4gbGVuZ3RoIHJlYWNoZXMgYSAqbXVsdGlwbGUqIG9mIEhBU0hfQktUX0NBUEFDSVRZX1RIUkVTSC4KKyAgICAqIChUaGUgbXVsdGlwbGllciBpcyBzaW1wbHkgZXhwYW5kX211bHQrMSkuIFRoZSB3aG9sZSBpZGVhIG9mIHRoaXMKKyAgICAqIG11bHRpcGxpZXIgaXMgdG8gcmVkdWNlIGJ1Y2tldCBleHBhbnNpb25zLCBzaW5jZSB0aGV5IGFyZSBleHBlbnNpdmUsIGluCisgICAgKiBzaXR1YXRpb25zIHdoZXJlIHdlIGtub3cgdGhhdCBhIHBhcnRpY3VsYXIgYnVja2V0IHRlbmRzIHRvIGJlIG92ZXJ1c2VkLgorICAgICogSXQgaXMgYmV0dGVyIHRvIGxldCBpdHMgY2hhaW4gbGVuZ3RoIGdyb3cgdG8gYSBsb25nZXIgeWV0LXN0aWxsLWJvdW5kZWQKKyAgICAqIHZhbHVlLCB0aGFuIHRvIGRvIGFuIE8obikgYnVja2V0IGV4cGFuc2lvbiB0b28gb2Z0ZW4uCisgICAgKi8KKyAgIHVuc2lnbmVkIGV4cGFuZF9tdWx0OworCit9IFVUX2hhc2hfYnVja2V0OworCisvKiByYW5kb20gc2lnbmF0dXJlIHVzZWQgb25seSB0byBmaW5kIGhhc2ggdGFibGVzIGluIGV4dGVybmFsIGFuYWx5c2lzICovCisjZGVmaW5lIEhBU0hfU0lHTkFUVVJFIDB4YTAxMTFmZTEKKyNkZWZpbmUgSEFTSF9CTE9PTV9TSUdOQVRVUkUgMHhiMTIyMjBmMgorCit0eXBlZGVmIHN0cnVjdCBVVF9oYXNoX3RhYmxlIHsKKyAgIFVUX2hhc2hfYnVja2V0ICpidWNrZXRzOworICAgdW5zaWduZWQgbnVtX2J1Y2tldHMsIGxvZzJfbnVtX2J1Y2tldHM7CisgICB1bnNpZ25lZCBudW1faXRlbXM7CisgICBzdHJ1Y3QgVVRfaGFzaF9oYW5kbGUgKnRhaWw7IC8qIHRhaWwgaGggaW4gYXBwIG9yZGVyLCBmb3IgZmFzdCBhcHBlbmQgICAgKi8KKyAgIHB0cmRpZmZfdCBoaG87IC8qIGhhc2ggaGFuZGxlIG9mZnNldCAoYnl0ZSBwb3Mgb2YgaGFzaCBoYW5kbGUgaW4gZWxlbWVudCAqLworCisgICAvKiBpbiBhbiBpZGVhbCBzaXR1YXRpb24gKGFsbCBidWNrZXRzIHVzZWQgZXF1YWxseSksIG5vIGJ1Y2tldCB3b3VsZCBoYXZlCisgICAgKiBtb3JlIHRoYW4gY2VpbCgjaXRlbXMvI2J1Y2tldHMpIGl0ZW1zLiB0aGF0J3MgdGhlIGlkZWFsIGNoYWluIGxlbmd0aC4gKi8KKyAgIHVuc2lnbmVkIGlkZWFsX2NoYWluX21heGxlbjsKKworICAgLyogbm9uaWRlYWxfaXRlbXMgaXMgdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgaGFzaCB3aG9zZSBjaGFpbiBwb3NpdGlvbgorICAgICogZXhjZWVkcyB0aGUgaWRlYWwgY2hhaW4gbWF4bGVuLiB0aGVzZSBpdGVtcyBwYXkgdGhlIHBlbmFsdHkgZm9yIGFuIHVuZXZlbgorICAgICogaGFzaCBkaXN0cmlidXRpb247IHJlYWNoaW5nIHRoZW0gaW4gYSBjaGFpbiB0cmF2ZXJzYWwgdGFrZXMgPmlkZWFsIHN0ZXBzICovCisgICB1bnNpZ25lZCBub25pZGVhbF9pdGVtczsKKworICAgLyogaW5lZmZlY3RpdmUgZXhwYW5kcyBvY2N1ciB3aGVuIGEgYnVja2V0IGRvdWJsaW5nIHdhcyBwZXJmb3JtZWQsIGJ1dAorICAgICogYWZ0ZXJ3YXJkLCBtb3JlIHRoYW4gaGFsZiB0aGUgaXRlbXMgaW4gdGhlIGhhc2ggaGFkIG5vbmlkZWFsIGNoYWluCisgICAgKiBwb3NpdGlvbnMuIElmIHRoaXMgaGFwcGVucyBvbiB0d28gY29uc2VjdXRpdmUgZXhwYW5zaW9ucyB3ZSBpbmhpYml0IGFueQorICAgICogZnVydGhlciBleHBhbnNpb24sIGFzIGl0J3Mgbm90IGhlbHBpbmc7IHRoaXMgaGFwcGVucyB3aGVuIHRoZSBoYXNoCisgICAgKiBmdW5jdGlvbiBpc24ndCBhIGdvb2QgZml0IGZvciB0aGUga2V5IGRvbWFpbi4gV2hlbiBleHBhbnNpb24gaXMgaW5oaWJpdGVkCisgICAgKiB0aGUgaGFzaCB3aWxsIHN0aWxsIHdvcmssIGFsYmVpdCBubyBsb25nZXIgaW4gY29uc3RhbnQgdGltZS4gKi8KKyAgIHVuc2lnbmVkIGluZWZmX2V4cGFuZHMsIG5vZXhwYW5kOworCisgICB1aW50MzJfdCBzaWduYXR1cmU7IC8qIHVzZWQgb25seSB0byBmaW5kIGhhc2ggdGFibGVzIGluIGV4dGVybmFsIGFuYWx5c2lzICovCisjaWZkZWYgSEFTSF9CTE9PTQorICAgdWludDMyX3QgYmxvb21fc2lnOyAvKiB1c2VkIG9ubHkgdG8gdGVzdCBibG9vbSBleGlzdHMgaW4gZXh0ZXJuYWwgYW5hbHlzaXMgKi8KKyAgIHVpbnQ4X3QgKmJsb29tX2J2OworICAgY2hhciBibG9vbV9uYml0czsKKyNlbmRpZgorCit9IFVUX2hhc2hfdGFibGU7CisKK3R5cGVkZWYgc3RydWN0IFVUX2hhc2hfaGFuZGxlIHsKKyAgIHN0cnVjdCBVVF9oYXNoX3RhYmxlICp0Ymw7CisgICB2b2lkICpwcmV2OyAgICAgICAgICAgICAgICAgICAgICAgLyogcHJldiBlbGVtZW50IGluIGFwcCBvcmRlciAgICAgICovCisgICB2b2lkICpuZXh0OyAgICAgICAgICAgICAgICAgICAgICAgLyogbmV4dCBlbGVtZW50IGluIGFwcCBvcmRlciAgICAgICovCisgICBzdHJ1Y3QgVVRfaGFzaF9oYW5kbGUgKmhoX3ByZXY7ICAgLyogcHJldmlvdXMgaGggaW4gYnVja2V0IG9yZGVyICAgICovCisgICBzdHJ1Y3QgVVRfaGFzaF9oYW5kbGUgKmhoX25leHQ7ICAgLyogbmV4dCBoaCBpbiBidWNrZXQgb3JkZXIgICAgICAgICovCisgICB2b2lkICprZXk7ICAgICAgICAgICAgICAgICAgICAgICAgLyogcHRyIHRvIGVuY2xvc2luZyBzdHJ1Y3QncyBrZXkgICovCisgICB1bnNpZ25lZCBrZXlsZW47ICAgICAgICAgICAgICAgICAgLyogZW5jbG9zaW5nIHN0cnVjdCdzIGtleSBsZW4gICAgICovCisgICB1bnNpZ25lZCBoYXNodjsgICAgICAgICAgICAgICAgICAgLyogcmVzdWx0IG9mIGhhc2gtZmNuKGtleSkgICAgICAgICovCit9IFVUX2hhc2hfaGFuZGxlOworCisjZW5kaWYgLyogVVRIQVNIX0ggKi8KZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvdGVzdF9hY2N0L0NNYWtlTGlzdHMudHh0IGIvZXh0ZW5zaW9ucy90ZXN0X2FjY3QvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ4MjU1ZQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvdGVzdF9hY2N0L0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTMgQEAKKyMgVGhlIHRlc3RfYWNjdCBleHRlbnNpb24KK1BST0pFQ1QoIkFjY291bnRpbmcgZHVtbXkgc2VydmVyIiBDKQorCitGRF9BRERfRVhURU5TSU9OKHRlc3RfYWNjdCB0ZXN0X2FjY3QuYykKKworCisjIyMjCisjIyBJTlNUQUxMIHNlY3Rpb24gIyMKKworSU5TVEFMTChUQVJHRVRTIHRlc3RfYWNjdAorCUxJQlJBUlkgREVTVElOQVRJT04gJHtJTlNUQUxMX0VYVEVOU0lPTlNfU1VGRklYfQorCUNPTVBPTkVOVCBmcmVlRGlhbWV0ZXItZGVidWctdG9vbHMpCisKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvdGVzdF9hY2N0L3Rlc3RfYWNjdC5jIGIvZXh0ZW5zaW9ucy90ZXN0X2FjY3QvdGVzdF9hY2N0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I2NDhlNQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvdGVzdF9hY2N0L3Rlc3RfYWNjdC5jCkBAIC0wLDAgKzEsMTQ1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxMywgV0lERSBQcm9qZWN0IGFuZCBOSUNUCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBXSURFIFByb2plY3Qgb3IgTklDVCBub3IgdGhlIAkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFdJREUgUHJvamVjdCBhbmQgCQkJCQkJICoKKyogICBOSUNULgkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoaXMgZXh0ZW5zaW9uIHNpbXBseSByZWNlaXZlcyBBQ1IgYW5kIHNlbmRzIHBvc2l0aXZlIEFDQSBhZnRlciBkaXNwbGF5aW5nIHRoZSBjb250ZW50LCAKK2J1dCBkb2VzIG5vdCBjb21taXQgdGhlIGRhdGEgdG8gYW55IHN0b3JhZ2UgKi8KKworI2luY2x1ZGUgPGZyZWVEaWFtZXRlci9leHRlbnNpb24uaD4KKworc3RhdGljIHN0cnVjdCB7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogQWNjb3VudGluZ19SZWNvcmRfTnVtYmVyOworCXN0cnVjdCBkaWN0X29iamVjdCAqIEFjY291bnRpbmdfUmVjb3JkX1R5cGU7Cit9IHRhY19kaWN0OworCQorLyogQ2FsbGJhY2sgZm9yIGluY29taW5nIEJhc2UgQWNjb3VudGluZyBhcHBsaWNhdGlvbiBtZXNzYWdlcyAqLworc3RhdGljIGludCB0YWNfY2IoIHN0cnVjdCBtc2cgKiogbXNnLCBzdHJ1Y3QgYXZwICogYXZwLCBzdHJ1Y3Qgc2Vzc2lvbiAqIHNlc3MsIHZvaWQgKiBkYXRhLCBlbnVtIGRpc3BfYWN0aW9uICogYWN0KQoreworCXN0cnVjdCBtc2dfaGRyICpoZHIgPSBOVUxMOworCQorCVRSQUNFX0VOVFJZKCIlcCAlcCAlcCAlcCIsIG1zZywgYXZwLCBzZXNzLCBhY3QpOworCQorCWlmIChtc2cgPT0gTlVMTCkKKwkJcmV0dXJuIEVJTlZBTDsKKwkKKwkvKiBDaGVjayB3aGF0IHdlIHJlY2VpdmVkICovCisJQ0hFQ0tfRkNUKCBmZF9tc2dfaGRyKCptc2csICZoZHIpICk7CisJCisJaWYgKGhkci0+bXNnX2ZsYWdzICYgQ01EX0ZMQUdfUkVRVUVTVCkgeworCQkvKiBJdCB3YXMgYSByZXF1ZXN0LCBjcmVhdGUgYW4gYW5zd2VyICovCisJCXN0cnVjdCBtc2cgKmFucywgKnFyeTsKKwkJc3RydWN0IGF2cCAqIGEgPSBOVUxMOworCQlzdHJ1Y3QgYXZwX2hkciAqIGggPSBOVUxMOworCQlvczBfdCBzOworCQlzaXplX3Qgc2w7CisJCisJCXFyeSA9ICptc2c7CisJCS8qIENyZWF0ZSB0aGUgYW5zd2VyIG1lc3NhZ2UsIGluY2x1ZGluZyB0aGUgU2Vzc2lvbi1JZCBBVlAgKi8KKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfbmV3X2Fuc3dlcl9mcm9tX3JlcSAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgbXNnLCAwICkgKTsKKwkJYW5zID0gKm1zZzsKKworCQkvKiBTZXQgdGhlIE9yaWdpbi1Ib3N0LCBPcmlnaW4tUmVhbG0sIFJlc3VsdC1Db2RlIEFWUHMgKi8KKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfcmVzY29kZV9zZXQoIGFucywgIkRJQU1FVEVSX1NVQ0NFU1MiLCBOVUxMLCBOVUxMLCAxICkgKTsKKwkJCisJCWZkX2xvZ19kZWJ1ZygiLS0tLS0tLS0tLS0tLS1SZWNlaXZlZCB0aGUgZm9sbG93aW5nIEFjY291bnRpbmcgbWVzc2FnZTotLS0tLS0tLS0tLS0tLSIpOworCQkKKwkJQ0hFQ0tfRkNUKCBmZF9zZXNzX2dldHNpZCAoIHNlc3MsICZzLCAmc2wgKSApOworCQlmZF9sb2dfZGVidWcoIlNlc3Npb246ICUuKnMiLCAoaW50KXNsLCBzKTsKKwkJCisJCS8qIFRoZSBBVlBzIHRoYXQgd2UgY29weSBpbiB0aGUgYW5zd2VyICovCisJCUNIRUNLX0ZDVCggZmRfbXNnX3NlYXJjaF9hdnAgKCBxcnksIHRhY19kaWN0LkFjY291bnRpbmdfUmVjb3JkX1R5cGUsICZhKSApOworCQlpZiAoYSkgeworCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2hkciggYSwgJmggKSAgKTsKKwkJCWZkX2xvZ19kZWJ1ZygiQWNjb3VudGluZy1SZWNvcmQtVHlwZTogJWQgKCVzKSIsIGgtPmF2cF92YWx1ZS0+dTMyLCAKKwkJCQkJCS8qIGl0IHdvdWxkIGJlIGJldHRlciB0byBzZWFyY2ggdGhpcyBpbiB0aGUgZGljdGlvbmFyeSwgYnV0IGl0IGlzIG9ubHkgZm9yIGRlYnVnLCBzbyBvayAqLworCQkJCQkJKGgtPmF2cF92YWx1ZS0+dTMyID09IDEpID8gIkVWRU5UX1JFQ09SRCIgOiAKKwkJCQkJCShoLT5hdnBfdmFsdWUtPnUzMiA9PSAyKSA/ICJTVEFSVF9SRUNPUkQiIDogCisJCQkJCQkoaC0+YXZwX3ZhbHVlLT51MzIgPT0gMykgPyAiSU5URVJJTV9SRUNPUkQiIDogCisJCQkJCQkoaC0+YXZwX3ZhbHVlLT51MzIgPT0gNCkgPyAiU1RPUF9SRUNPUkQiIDogCisJCQkJCQkiPHVua25vd24gdmFsdWU+IgorCQkJCQkpOworCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIHRhY19kaWN0LkFjY291bnRpbmdfUmVjb3JkX1R5cGUsIDAsICZhICkgKTsKKwkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9zZXR2YWx1ZSggYSwgaC0+YXZwX3ZhbHVlICkgKTsKKwkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQoIGFucywgTVNHX0JSV19MQVNUX0NISUxELCBhICkgKTsKKwkJfQorCQlDSEVDS19GQ1QoIGZkX21zZ19zZWFyY2hfYXZwICggcXJ5LCB0YWNfZGljdC5BY2NvdW50aW5nX1JlY29yZF9OdW1iZXIsICZhKSApOworCQlpZiAoYSkgeworCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2hkciggYSwgJmggKSAgKTsKKwkJCWZkX2xvZ19kZWJ1ZygiQWNjb3VudGluZy1SZWNvcmQtTnVtYmVyOiAlZCIsIGgtPmF2cF92YWx1ZS0+dTMyKTsKKwkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCB0YWNfZGljdC5BY2NvdW50aW5nX1JlY29yZF9OdW1iZXIsIDAsICZhICkgKTsKKwkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9zZXR2YWx1ZSggYSwgaC0+YXZwX3ZhbHVlICkgKTsKKwkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQoIGFucywgTVNHX0JSV19MQVNUX0NISUxELCBhICkgKTsKKwkJfQorCQkKKwkJLyogV2UgbWF5IGFsc28gZHVtcCBvdGhlciBkYXRhIGZyb20gdGhlIG1lc3NhZ2UsIHN1Y2ggYXMgQWNjb3VudGluZyBzZXNzaW9uIElkLCBudW1iZXIgb2YgcGFja2V0cywgLi4uICAqLworCisJCWZkX2xvZ19kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworCQkKKwkJLyogU2VuZCB0aGUgYW5zd2VyICovCisJCUNIRUNLX0ZDVCggZmRfbXNnX3NlbmQoIG1zZywgTlVMTCwgTlVMTCApICk7CisJCQorCX0gZWxzZSB7CisJCS8qIFdlIHJlY2VpdmVkIGFuIGFuc3dlciBtZXNzYWdlLCBqdXN0IGRpc2NhcmQgaXQgKi8KKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfZnJlZSggKm1zZyApICk7CisJCSptc2cgPSBOVUxMOworCX0KKwkKKwlyZXR1cm4gMDsKK30KKworLyogZW50cnkgcG9pbnQ6IHJlZ2lzdGVyIGhhbmRsZXIgZm9yIEJhc2UgQWNjb3VudGluZyBtZXNzYWdlcyBpbiB0aGUgZGFlbW9uICovCitzdGF0aWMgaW50IHRhY19lbnRyeShjaGFyICogY29uZmZpbGUpCit7CisJc3RydWN0IGRpc3Bfd2hlbiBkYXRhOworCQorCVRSQUNFX0VOVFJZKCIlcCIsIGNvbmZmaWxlKTsKKwkKKwltZW1zZXQoJnRhY19kaWN0LCAwLCBzaXplb2YodGFjX2RpY3QpKTsKKwltZW1zZXQoJmRhdGEsIDAsIHNpemVvZihkYXRhKSk7CisJCisJLyogSW5pdGlhbGl6ZSB0aGUgZGljdGlvbmFyeSBvYmplY3RzIHdlIHVzZSAqLworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BUFBMSUNBVElPTiwgQVBQTElDQVRJT05fQllfTkFNRSwgIkRpYW1ldGVyIEJhc2UgQWNjb3VudGluZyIsICZkYXRhLmFwcCwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiQWNjb3VudGluZy1SZWNvcmQtTnVtYmVyIiwgJnRhY19kaWN0LkFjY291bnRpbmdfUmVjb3JkX051bWJlciwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiQWNjb3VudGluZy1SZWNvcmQtVHlwZSIsICZ0YWNfZGljdC5BY2NvdW50aW5nX1JlY29yZF9UeXBlLCBFTk9FTlQpICk7CisJCisJLyogUmVnaXN0ZXIgdGhlIGRpc3BhdGNoIGNhbGxiYWNrICovCisJQ0hFQ0tfRkNUKCBmZF9kaXNwX3JlZ2lzdGVyKCB0YWNfY2IsIERJU1BfSE9XX0FQUElELCAmZGF0YSwgTlVMTCwgTlVMTCApICk7CisJCisJLyogQWR2ZXJ0aXNlIHRoZSBzdXBwb3J0IGZvciB0aGUgRGlhbWV0ZXIgQmFzZSBBY2NvdW50aW5nIGFwcGxpY2F0aW9uIGluIHRoZSBwZWVyICovCisJQ0hFQ0tfRkNUKCBmZF9kaXNwX2FwcF9zdXBwb3J0ICggZGF0YS5hcHAsIE5VTEwsIDAsIDEgKSApOworCQorCXJldHVybiAwOworfQorCitFWFRFTlNJT05fRU5UUlkoInRlc3RfYWNjdCIsIHRhY19lbnRyeSk7CmRpZmYgLS1naXQgYS9leHRlbnNpb25zL3Rlc3RfYXBwL0NNYWtlTGlzdHMudHh0IGIvZXh0ZW5zaW9ucy90ZXN0X2FwcC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTU3NDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy90ZXN0X2FwcC9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDMxIEBACisjIFRoZSB0ZXN0X2FwcCBleHRlbnNpb24KK1BST0pFQ1QoIlRlc3QgRGlhbWV0ZXIgQXBwbGljYXRpb24iIEMpCisKKyMgUGFyc2VyIGZpbGVzCitCSVNPTl9GSUxFKHRhX2NvbmYueSkKK0ZMRVhfRklMRSh0YV9jb25mLmwpCitTRVRfU09VUkNFX0ZJTEVTX1BST1BFUlRJRVMobGV4LnRhX2NvbmYuYyB0YV9jb25mLnRhYi5jIFBST1BFUlRJRVMgQ09NUElMRV9GTEFHUyAiLUkgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9IikKKworIyBMaXN0IG9mIHNvdXJjZSBmaWxlcworU0VUKCBBUFBfVEVTVF9TUkMKKwl0ZXN0X2FwcC5oCisJdGVzdF9hcHAuYworCWxleC50YV9jb25mLmMKKwl0YV9jb25mLnRhYi5jCisJdGFfY29uZi50YWIuaAorCXRhX2RpY3QuYworCXRhX2NsaS5jCisJdGFfYmVuY2guYworCXRhX3NlcnYuYworKQorCisjIENvbXBpbGUgYXMgYSBtb2R1bGUKK0ZEX0FERF9FWFRFTlNJT04odGVzdF9hcHAgJHtBUFBfVEVTVF9TUkN9KQorCisKKyMjIyMKKyMjIElOU1RBTEwgc2VjdGlvbiAjIworCitJTlNUQUxMKFRBUkdFVFMgdGVzdF9hcHAKKwlMSUJSQVJZIERFU1RJTkFUSU9OICR7SU5TVEFMTF9FWFRFTlNJT05TX1NVRkZJWH0KKwlDT01QT05FTlQgZnJlZURpYW1ldGVyLWRlYnVnLXRvb2xzKQpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy90ZXN0X2FwcC90YV9iZW5jaC5jIGIvZXh0ZW5zaW9ucy90ZXN0X2FwcC90YV9iZW5jaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1YWEyNDYKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL3Rlc3RfYXBwL3RhX2JlbmNoLmMKQEAgLTAsMCArMSwzMzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDE1LCBXSURFIFByb2plY3QgYW5kIE5JQ1QJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFdJREUgUHJvamVjdCBvciBOSUNUIG5vciB0aGUgCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgV0lERSBQcm9qZWN0IGFuZCAJCQkJCQkgKgorKiAgIE5JQ1QuCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQ3JlYXRlIGFuZCBzZW5kIGEgbWVzc2FnZSwgYW5kIHJlY2VpdmUgaXQgKi8KKworI2luY2x1ZGUgInRlc3RfYXBwLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2lmbmRlZiBfX0FQUExFX18gLyogdGhleSBkZXByZWNhdGVkIHRoZSBzZW1hcGhvcmUgdGhlcmUuLi4gKi8KKyNpbmNsdWRlIDxzZW1hcGhvcmUuaD4KKworI2RlZmluZSBteV9zZW1fdCBzZW1fdAorI2RlZmluZSBteV9zZW1faW5pdCBzZW1faW5pdAorI2RlZmluZSBteV9zZW1fZGVzdHJveSBzZW1fZGVzdHJveQorI2RlZmluZSBteV9zZW1fdGltZWR3YWl0IHNlbV90aW1lZHdhaXQKKyNkZWZpbmUgbXlfc2VtX3Bvc3Qgc2VtX3Bvc3QKKworI2Vsc2UgLy8gb24gQVBQTEUKKyNpbmNsdWRlIDxzY2hlZC5oPgorI2luY2x1ZGUgPGRpc3BhdGNoL2Rpc3BhdGNoLmg+CisKKyNkZWZpbmUgbXlfc2VtX3QgZGlzcGF0Y2hfc2VtYXBob3JlX3QKKworc3RhdGljIGludCBteV9zZW1faW5pdChteV9zZW1fdCAqIHMsIGludCBwc2hhcmVkLCB1bnNpZ25lZCBpbnQgdmFsdWUgKSB7CisJKnMgPSBkaXNwYXRjaF9zZW1hcGhvcmVfY3JlYXRlKHZhbHVlKTsKKwlpZiAoKnMgPT0gTlVMTCkKKwkJcmV0dXJuIEVOT01FTTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBteV9zZW1fZGVzdHJveShteV9zZW1fdCAqcykgeworCWRpc3BhdGNoX3JlbGVhc2UoKnMpOworCSpzID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBteV9zZW1fdGltZWR3YWl0KG15X3NlbV90ICogcywgc3RydWN0IHRpbWVzcGVjICp0cykgeworCXN0cnVjdCB0aW1lc3BlYyB0c247CisJaW50NjRfdCBuc2VjOworCWRpc3BhdGNoX3RpbWVfdCB3aGVuOworCQorCUNIRUNLX1NZUyggY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJnRzbikgKTsKKwkKKwluc2VjID0gKHRzLT50dl9zZWMgKiAxMDAwMDAwMDAwKSArIHRzLT50dl9uc2VjCisJCS0gKHRzbi50dl9zZWMgKiAxMDAwMDAwMDAwKSAtIHRzbi50dl9uc2VjOworCQorCXdoZW4gPSBkaXNwYXRjaF90aW1lICggIERJU1BBVENIX1RJTUVfTk9XLCBuc2VjICk7CisJCisJcmV0dXJuIGRpc3BhdGNoX3NlbWFwaG9yZV93YWl0ICggKnMsIHdoZW4gKSA/IEVUSU1FRE9VVCA6IDA7Cit9CisKK3N0YXRpYyBpbnQgbXlfc2VtX3Bvc3QobXlfc2VtX3QgKnMpIHsKKwlkaXNwYXRjaF9zZW1hcGhvcmVfc2lnbmFsKCpzKTsKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8vIEFQUExFCisKKworCitzdHJ1Y3QgdGFfbWVzc19pbmZvIHsKKwlpbnQzMl90CQlyYW5kdmFsOwkvKiBhIHJhbmRvbSB2YWx1ZSB0byBzdG9yZSBpbiBUZXN0LUFWUCAqLworCXN0cnVjdCB0aW1lc3BlYyB0czsJCS8qIFRpbWUgb2Ygc2VuZGluZyB0aGUgbWVzc2FnZSAqLworfTsKKworc3RhdGljIG15X3NlbV90IHRhX3NlbTsgLyogVG8gaGFuZGxlIHRoZSBjb25jdXJyZW5jeSAqLworCisvKiBDYiBjYWxsZWQgd2hlbiBhbiBhbnN3ZXIgaXMgcmVjZWl2ZWQgKi8KK3N0YXRpYyB2b2lkIHRhX2NiX2Fucyh2b2lkICogZGF0YSwgc3RydWN0IG1zZyAqKiBtc2cpCit7CisJc3RydWN0IHRhX21lc3NfaW5mbyAqIG1pID0gKHN0cnVjdCB0YV9tZXNzX2luZm8gKilkYXRhOworCXN0cnVjdCB0aW1lc3BlYyB0czsKKwlzdHJ1Y3QgYXZwICogYXZwOworCXN0cnVjdCBhdnBfaGRyICogaGRyOworCXVuc2lnbmVkIGxvbmcgZHVyOworCQorCUNIRUNLX1NZU19ETyggY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJnRzKSwgcmV0dXJuICk7CisKKwkvKiBWYWx1ZSBvZiBSZXN1bHQgQ29kZSAqLworCUNIRUNLX0ZDVF9ETyggZmRfbXNnX3NlYXJjaF9hdnAgKCAqbXNnLCB0YV9yZXNfY29kZSwgJmF2cCksIHJldHVybiApOworCWlmIChhdnApIHsKKwkJQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfYXZwX2hkciggYXZwLCAmaGRyICksIHJldHVybiApOworCX0KKwlpZiAoIWF2cCB8fCAhaGRyIHx8IGhkci0+YXZwX3ZhbHVlLT5pMzIgIT0gMjAwMSkgeworCQkvKiBlcnJvciAqLworCQlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9tdXRleF9sb2NrKCZ0YV9jb25mLT5zdGF0c19sb2NrKSwgKTsKKwkJdGFfY29uZi0+c3RhdHMubmJfZXJycysrOworCQlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9tdXRleF91bmxvY2soJnRhX2NvbmYtPnN0YXRzX2xvY2spLCApOworCQlnb3RvIGVuZDsKKwl9CisJCisJLyogQ2hlY2sgdmFsdWUgb2YgVGVzdC1BVlAgKi8KKwlDSEVDS19GQ1RfRE8oIGZkX21zZ19zZWFyY2hfYXZwICggKm1zZywgdGFfYXZwLCAmYXZwKSwgcmV0dXJuICk7CisJaWYgKGF2cCkgeworCQlDSEVDS19GQ1RfRE8oIGZkX21zZ19hdnBfaGRyKCBhdnAsICZoZHIgKSwgcmV0dXJuICk7CisJCUFTU0VSVChoZHItPmF2cF92YWx1ZS0+aTMyID09IG1pLT5yYW5kdmFsKTsKKwl9CisJCisJLyogQ29tcHV0ZSBob3cgbG9uZyBpdCB0b29rICovCisJZHVyID0gKCh0cy50dl9zZWMgLSBtaS0+dHMudHZfc2VjKSAqIDEwMDAwMDApICsgKCh0cy50dl9uc2VjIC0gbWktPnRzLnR2X25zZWMpIC8gMTAwMCk7CisJCisJLyogQWRkIHRoaXMgdmFsdWUgdG8gdGhlIHN0YXRzICovCisJQ0hFQ0tfUE9TSVhfRE8oIHB0aHJlYWRfbXV0ZXhfbG9jaygmdGFfY29uZi0+c3RhdHNfbG9jayksICk7CisJCisJaWYgKHRhX2NvbmYtPnN0YXRzLm5iX3JlY3YpIHsKKwkJLyogUG9uZGVyYXRlIGluIHRoZSBhdmcgKi8KKwkJdGFfY29uZi0+c3RhdHMuYXZnID0gKHRhX2NvbmYtPnN0YXRzLmF2ZyAqIHRhX2NvbmYtPnN0YXRzLm5iX3JlY3YgKyBkdXIpIC8gKHRhX2NvbmYtPnN0YXRzLm5iX3JlY3YgKyAxKTsKKwkJLyogTWluLCBtYXggKi8KKwkJaWYgKGR1ciA8IHRhX2NvbmYtPnN0YXRzLnNob3J0ZXN0KQorCQkJdGFfY29uZi0+c3RhdHMuc2hvcnRlc3QgPSBkdXI7CisJCWlmIChkdXIgPiB0YV9jb25mLT5zdGF0cy5sb25nZXN0KQorCQkJdGFfY29uZi0+c3RhdHMubG9uZ2VzdCA9IGR1cjsKKwl9IGVsc2UgeworCQl0YV9jb25mLT5zdGF0cy5zaG9ydGVzdCA9IGR1cjsKKwkJdGFfY29uZi0+c3RhdHMubG9uZ2VzdCA9IGR1cjsKKwkJdGFfY29uZi0+c3RhdHMuYXZnID0gZHVyOworCX0KKwl0YV9jb25mLT5zdGF0cy5uYl9yZWN2Kys7CisJCisJQ0hFQ0tfUE9TSVhfRE8oIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ0YV9jb25mLT5zdGF0c19sb2NrKSwgKTsKKwkKK2VuZDoJCisJLyogRnJlZSB0aGUgbWVzc2FnZSAqLworCUNIRUNLX0ZDVF9ETyhmZF9tc2dfZnJlZSgqbXNnKSwgKTsKKwkqbXNnID0gTlVMTDsKKwkKKwlmcmVlKG1pKTsKKwkKKwkvKiBQb3N0IHRoZSBzZW1hcGhvcmUgKi8KKwlDSEVDS19TWVNfRE8oIG15X3NlbV9wb3N0KCZ0YV9zZW0pLCApOworCQorCXJldHVybjsKK30KKworLyogQ3JlYXRlIGEgdGVzdCBtZXNzYWdlICovCitzdGF0aWMgdm9pZCB0YV9iZW5jaF90ZXN0X21lc3NhZ2UoKQoreworCXN0cnVjdCBtc2cgKiByZXEgPSBOVUxMOworCXN0cnVjdCBhdnAgKiBhdnA7CisJdW5pb24gYXZwX3ZhbHVlIHZhbDsKKwlzdHJ1Y3QgdGFfbWVzc19pbmZvICogbWkgPSBOVUxMOworCQorCVRSQUNFX0RFQlVHKEZVTEwsICJDcmVhdGluZyBhIG5ldyBtZXNzYWdlIGZvciBzZW5kaW5nLiIpOworCQorCS8qIENyZWF0ZSB0aGUgcmVxdWVzdCAqLworCUNIRUNLX0ZDVF9ETyggZmRfbXNnX25ldyggdGFfY21kX3IsIE1TR0ZMX0FMTE9DX0VURUlELCAmcmVxICksIGdvdG8gb3V0ICk7CisJCisJLyogQ3JlYXRlIGEgbmV3IHNlc3Npb24gKi8KKwkjZGVmaW5lIFRFU1RfQVBQX1NJRF9PUFQgICJhcHBfdGVzdGIiCisJQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfbmV3X3Nlc3Npb24oIHJlcSwgKG9zMF90KVRFU1RfQVBQX1NJRF9PUFQsIENPTlNUU1RSTEVOKFRFU1RfQVBQX1NJRF9PUFQpICksIGdvdG8gb3V0ICk7CisJCisJLyogQ3JlYXRlIHRoZSByYW5kb20gdmFsdWUgdG8gc3RvcmUgd2l0aCB0aGUgc2Vzc2lvbiAqLworCW1pID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgdGFfbWVzc19pbmZvKSk7CisJaWYgKG1pID09IE5VTEwpIHsKKwkJZmRfbG9nX2RlYnVnKCJtYWxsb2MgZmFpbGVkOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCWdvdG8gb3V0OworCX0KKwkKKwltaS0+cmFuZHZhbCA9IChpbnQzMl90KXJhbmRvbSgpOworCQorCS8qIE5vdyBzZXQgYWxsIEFWUHMgdmFsdWVzICovCisJCisJLyogU2V0IHRoZSBEZXN0aW5hdGlvbi1SZWFsbSBBVlAgKi8KKwl7CisJCUNIRUNLX0ZDVF9ETyggZmRfbXNnX2F2cF9uZXcgKCB0YV9kZXN0X3JlYWxtLCAwLCAmYXZwICksIGdvdG8gb3V0ICApOworCQl2YWwub3MuZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopKHRhX2NvbmYtPmRlc3RfcmVhbG0pOworCQl2YWwub3MubGVuICA9IHN0cmxlbih0YV9jb25mLT5kZXN0X3JlYWxtKTsKKwkJQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfYXZwX3NldHZhbHVlKCBhdnAsICZ2YWwgKSwgZ290byBvdXQgICk7CisJCUNIRUNLX0ZDVF9ETyggZmRfbXNnX2F2cF9hZGQoIHJlcSwgTVNHX0JSV19MQVNUX0NISUxELCBhdnAgKSwgZ290byBvdXQgICk7CisJfQorCQorCS8qIFNldCB0aGUgRGVzdGluYXRpb24tSG9zdCBBVlAgaWYgbmVlZGVkKi8KKwlpZiAodGFfY29uZi0+ZGVzdF9ob3N0KSB7CisJCUNIRUNLX0ZDVF9ETyggZmRfbXNnX2F2cF9uZXcgKCB0YV9kZXN0X2hvc3QsIDAsICZhdnAgKSwgZ290byBvdXQgICk7CisJCXZhbC5vcy5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikodGFfY29uZi0+ZGVzdF9ob3N0KTsKKwkJdmFsLm9zLmxlbiAgPSBzdHJsZW4odGFfY29uZi0+ZGVzdF9ob3N0KTsKKwkJQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfYXZwX3NldHZhbHVlKCBhdnAsICZ2YWwgKSwgZ290byBvdXQgICk7CisJCUNIRUNLX0ZDVF9ETyggZmRfbXNnX2F2cF9hZGQoIHJlcSwgTVNHX0JSV19MQVNUX0NISUxELCBhdnAgKSwgZ290byBvdXQgICk7CisJfQorCQorCS8qIFNldCBPcmlnaW4tSG9zdCAmIE9yaWdpbi1SZWFsbSAqLworCUNIRUNLX0ZDVF9ETyggZmRfbXNnX2FkZF9vcmlnaW4gKCByZXEsIDAgKSwgZ290byBvdXQgICk7CisJCisJLyogU2V0IHRoZSBVc2VyLU5hbWUgQVZQIGlmIG5lZWRlZCovCisJaWYgKHRhX2NvbmYtPnVzZXJfbmFtZSkgeworCQlDSEVDS19GQ1RfRE8oIGZkX21zZ19hdnBfbmV3ICggdGFfdXNlcl9uYW1lLCAwLCAmYXZwICksIGdvdG8gb3V0ICApOworCQl2YWwub3MuZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopKHRhX2NvbmYtPnVzZXJfbmFtZSk7CisJCXZhbC5vcy5sZW4gID0gc3RybGVuKHRhX2NvbmYtPnVzZXJfbmFtZSk7CisJCUNIRUNLX0ZDVF9ETyggZmRfbXNnX2F2cF9zZXR2YWx1ZSggYXZwLCAmdmFsICksIGdvdG8gb3V0ICApOworCQlDSEVDS19GQ1RfRE8oIGZkX21zZ19hdnBfYWRkKCByZXEsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwICksIGdvdG8gb3V0ICApOworCX0KKwkKKwkvKiBTZXQgdGhlIFRlc3QtQVZQIEFWUCAqLworCXsKKwkJQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfYXZwX25ldyAoIHRhX2F2cCwgMCwgJmF2cCApLCBnb3RvIG91dCAgKTsKKwkJdmFsLmkzMiA9IG1pLT5yYW5kdmFsOworCQlDSEVDS19GQ1RfRE8oIGZkX21zZ19hdnBfc2V0dmFsdWUoIGF2cCwgJnZhbCApLCBnb3RvIG91dCAgKTsKKwkJQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfYXZwX2FkZCggcmVxLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCApLCBnb3RvIG91dCAgKTsKKwl9CisJCisJQ0hFQ0tfU1lTX0RPKCBjbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmbWktPnRzKSwgZ290byBvdXQgKTsKKwkKKwkvKiBTZW5kIHRoZSByZXF1ZXN0ICovCisJQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfc2VuZCggJnJlcSwgdGFfY2JfYW5zLCBtaSApLCBnb3RvIG91dCApOworCQorCS8qIEluY3JlbWVudCB0aGUgY291bnRlciAqLworCUNIRUNLX1BPU0lYX0RPKCBwdGhyZWFkX211dGV4X2xvY2soJnRhX2NvbmYtPnN0YXRzX2xvY2spLCApOworCXRhX2NvbmYtPnN0YXRzLm5iX3NlbnQrKzsKKwlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9tdXRleF91bmxvY2soJnRhX2NvbmYtPnN0YXRzX2xvY2spLCApOworCitvdXQ6CisJcmV0dXJuOworfQorCisvKiBUaGUgZnVuY3Rpb24gY2FsbGVkIHdoZW4gdGhlIHNpZ25hbCBpcyByZWNlaXZlZCAqLworc3RhdGljIHZvaWQgdGFfYmVuY2hfc3RhcnQoKSB7CisJc3RydWN0IHRpbWVzcGVjIGVuZF90aW1lLCBub3c7CisJc3RydWN0IHRhX3N0YXRzIHN0YXJ0LCBlbmQ7CisJaW50IG5zZWMgPSAwOworCQorCS8qIFNhdmUgdGhlIGluaXRpYWwgc3RhdHMgKi8KKwlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9tdXRleF9sb2NrKCZ0YV9jb25mLT5zdGF0c19sb2NrKSwgKTsKKwltZW1jcHkoJnN0YXJ0LCAmdGFfY29uZi0+c3RhdHMsIHNpemVvZihzdHJ1Y3QgdGFfc3RhdHMpKTsKKwlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9tdXRleF91bmxvY2soJnRhX2NvbmYtPnN0YXRzX2xvY2spLCApOworCQorCS8qIFdlIHdpbGwgcnVuIGZvciB0YV9jb25mLT5iZW5jaF9kdXJhdGlvbiBzZWNvbmRzICovCisJTE9HX04oIlN0YXJ0aW5nIGJlbmNobWFyayBjbGllbnQsICVkcyIsIHRhX2NvbmYtPmJlbmNoX2R1cmF0aW9uKTsKKwlDSEVDS19TWVNfRE8oIGNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZlbmRfdGltZSksICk7CisJZW5kX3RpbWUudHZfc2VjICs9IHRhX2NvbmYtPmJlbmNoX2R1cmF0aW9uOworCQorCS8qIE5vdyBsb29wIHVudGlsIHRpbWVvdXQgaXMgcmVhY2hlZCAqLworCWRvIHsKKwkJLyogRG8gbm90IGNyZWF0ZSBtb3JlIHRoYXQgTkJfQ09OQ1VSUkVOVF9NRVNTQUdFUyBpbiBwYXJhbGVsICovCisJCWludCByZXQgPSBteV9zZW1fdGltZWR3YWl0KCZ0YV9zZW0sICZlbmRfdGltZSk7CisJCWlmIChyZXQgPT0gLTEpIHsKKwkJCXJldCA9IGVycm5vOworCQkJaWYgKHJldCAhPSBFVElNRURPVVQpIHsKKwkJCQlDSEVDS19QT1NJWF9ETyhyZXQsICk7IC8qIEp1c3QgdG8gbG9nIGl0ICovCisJCQl9CisJCQlicmVhazsKKwkJfQorCQkKKwkJLyogVXBkYXRlIHRoZSBjdXJyZW50IHRpbWUgKi8KKwkJQ0hFQ0tfU1lTX0RPKCBjbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmbm93KSwgKTsKKwkJCisJCWlmICghVFNfSVNfSU5GRVJJT1IoJm5vdywgJmVuZF90aW1lKSkKKwkJCWJyZWFrOworCQkKKwkJLyogQ3JlYXRlIGFuZCBzZW5kIGEgbmV3IHRlc3QgbWVzc2FnZSAqLworCQl0YV9iZW5jaF90ZXN0X21lc3NhZ2UoKTsKKwl9IHdoaWxlICgxKTsKKwkKKwlkbyB7CisJCUNIRUNLX1BPU0lYX0RPKCBwdGhyZWFkX211dGV4X2xvY2soJnRhX2NvbmYtPnN0YXRzX2xvY2spLCApOworCQlDSEVDS19TWVNfRE8oIGNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZub3cpLCApOyAvKiBSZS1yZWFkIHRoZSB0aW1lIGJlY2F1c2Ugd2UgbWlnaHQgaGF2ZSBzcGVudCBzb21lIHRpbWUgd2lhdGluZyBmb3IgdGhlIG11dGV4ICovCisJCW1lbWNweSgmZW5kLCAmdGFfY29uZi0+c3RhdHMsIHNpemVvZihzdHJ1Y3QgdGFfc3RhdHMpKTsKKwkJQ0hFQ0tfUE9TSVhfRE8oIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ0YV9jb25mLT5zdGF0c19sb2NrKSwgKTsKKwkJCisJCS8qIE5vdywgZGlzcGxheSB0aGUgc3RhdGlzdGljcyAqLworCQlMT0dfTiggIi0tLS0tLS0gYXBwX3Rlc3QgQmVuY2htYXJrIHJlc3VsdHMsIGVuZCBzZW5kaW5nICslZHMgLS0tLS0tLS0tIiwgbnNlYyk7CisJCWlmIChub3cudHZfbnNlYyA+PSBlbmRfdGltZS50dl9uc2VjKSB7CisJCQlMT0dfTiggIiBFeGVjdXRpbmcgZm9yOiAlZC4lMDZsZCBzZWMiLAorCQkJCQkoaW50KShub3cudHZfc2VjICsgdGFfY29uZi0+YmVuY2hfZHVyYXRpb24gLSBlbmRfdGltZS50dl9zZWMpLAorCQkJCQkobG9uZykobm93LnR2X25zZWMgLSBlbmRfdGltZS50dl9uc2VjKSAvIDEwMDApOworCQl9IGVsc2UgeworCQkJTE9HX04oICIgRXhlY3V0aW5nIGZvcjogJWQuJTA2bGQgc2VjIiwKKwkJCQkJKGludCkobm93LnR2X3NlYyArIHRhX2NvbmYtPmJlbmNoX2R1cmF0aW9uIC0gMSAtIGVuZF90aW1lLnR2X3NlYyksCisJCQkJCShsb25nKShub3cudHZfbnNlYyArIDEwMDAwMDAwMDAgLSBlbmRfdGltZS50dl9uc2VjKSAvIDEwMDApOworCQl9CisJCUxPR19OKCAiICAgJWxsdSBtZXNzYWdlcyBzZW50IiwgZW5kLm5iX3NlbnQgLSBzdGFydC5uYl9zZW50KTsKKwkJTE9HX04oICIgICAlbGx1IGVycm9yKHMpIHJlY2VpdmVkIiwgZW5kLm5iX2VycnMgLSBzdGFydC5uYl9lcnJzKTsKKwkJTE9HX04oICIgICAlbGx1IGFuc3dlcihzKSByZWNlaXZlZCIsIGVuZC5uYl9yZWN2IC0gc3RhcnQubmJfcmVjdik7CisJCUxPR19OKCAiICAgT3ZlcmFsbDoiKTsKKwkJTE9HX04oICIgICAgIGZhc3Rlc3Q6ICVsZC4lMDZsZCBzZWMuIiwgZW5kLnNob3J0ZXN0IC8gMTAwMDAwMCwgZW5kLnNob3J0ZXN0ICUgMTAwMDAwMCk7CisJCUxPR19OKCAiICAgICBzbG93ZXN0OiAlbGQuJTA2bGQgc2VjLiIsIGVuZC5sb25nZXN0IC8gMTAwMDAwMCwgZW5kLmxvbmdlc3QgJSAxMDAwMDAwKTsKKwkJTE9HX04oICIgICAgIEF2ZXJhZ2U6ICVsZC4lMDZsZCBzZWMuIiwgZW5kLmF2ZyAvIDEwMDAwMDAsIGVuZC5hdmcgJSAxMDAwMDAwKTsKKwkJTE9HX04oICIgICBUaHJvdWdocHV0OiAlbGx1IG1lc3NhZ2VzIC8gc2VjIiwgKGVuZC5uYl9yZWN2IC0gc3RhcnQubmJfcmVjdikgLyAoKCBub3cudHZfc2VjICsgdGFfY29uZi0+YmVuY2hfZHVyYXRpb24gLSBlbmRfdGltZS50dl9zZWMgKSArICgobm93LnR2X25zZWMgLSBlbmRfdGltZS50dl9uc2VjKSAvIDEwMDAwMDAwMDApKSk7CisJCUxPR19OKCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworCQkKKwkJbnNlYyArKzsKKwkJc2xlZXAoMSk7CisJfSB3aGlsZSAoIChlbmQubmJfc2VudCAtIHN0YXJ0Lm5iX3NlbnQpID4gKGVuZC5uYl9lcnJzIC0gc3RhcnQubmJfZXJycykgKyAoZW5kLm5iX3JlY3YgLSBzdGFydC5uYl9yZWN2KSApOworCUxPR19OKCAiLS0tLS0tLS0tLS0tLS0tIFRlc3QgQ29tcGxldGUgLS0tLS0tLS0tLS0tLS0iKTsKKworfQorCisKK2ludCB0YV9iZW5jaF9pbml0KHZvaWQpCit7CisJQ0hFQ0tfU1lTKCBteV9zZW1faW5pdCggJnRhX3NlbSwgMCwgdGFfY29uZi0+YmVuY2hfY29uY3VyKSApOworCisJQ0hFQ0tfRkNUKCBmZF9ldmVudF90cmlnX3JlZ2NiKHRhX2NvbmYtPnNpZ25hbCwgInRlc3RfYXBwLmJlbmNoIiwgdGFfYmVuY2hfc3RhcnQgKSApOworCQorCXJldHVybiAwOworfQorCit2b2lkIHRhX2JlbmNoX2Zpbmkodm9pZCkKK3sKKwkvLyBDSEVDS19GQ1RfRE8oIGZkX3NpZ191bnJlZ2lzdGVyKHRhX2NvbmYtPnNpZ25hbCksIC8qIGNvbnRpbnVlICovICk7CisJCisJQ0hFQ0tfU1lTX0RPKCBteV9zZW1fZGVzdHJveSgmdGFfc2VtKSwgKTsKKwkKKwlyZXR1cm47Cit9OwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy90ZXN0X2FwcC90YV9jbGkuYyBiL2V4dGVuc2lvbnMvdGVzdF9hcHAvdGFfY2xpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg2MzM4YQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvdGVzdF9hcHAvdGFfY2xpLmMKQEAgLTAsMCArMSwyOTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDE1LCBXSURFIFByb2plY3QgYW5kIE5JQ1QJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFdJREUgUHJvamVjdCBvciBOSUNUIG5vciB0aGUgCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgV0lERSBQcm9qZWN0IGFuZCAJCQkJCQkgKgorKiAgIE5JQ1QuCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQ3JlYXRlIGFuZCBzZW5kIGEgbWVzc2FnZSwgYW5kIHJlY2VpdmUgaXQgKi8KKworLyogTm90ZSB0aGF0IHdlIHVzZSBib3RoIHNlc3Npb25zIGFuZCB0aGUgYXJndW1lbnQgdG8gYW5zd2VyIGNhbGxiYWNrIHRvIHBhc3MgdGhlIHNhbWUgdmFsdWUuCisgKiBUaGlzIGlzIGp1c3QgZm9yIHRoZSBwdXJwb3NlIG9mIGNoZWNraW5nIGV2ZXJ5dGhpbmcgd2VudCBPSy4KKyAqLworCisjaW5jbHVkZSAidGVzdF9hcHAuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKK3N0YXRpYyBzdHJ1Y3Qgc2Vzc2lvbl9oYW5kbGVyICogdGFfY2xpX3JlZyA9IE5VTEw7CisKK3N0cnVjdCBzZXNzX3N0YXRlIHsKKwlpbnQzMl90CQlyYW5kdmFsOwkvKiBhIHJhbmRvbSB2YWx1ZSB0byBzdG9yZSBpbiBUZXN0LUFWUCAqLworCXN0cnVjdCB0aW1lc3BlYyB0czsJCS8qIFRpbWUgb2Ygc2VuZGluZyB0aGUgbWVzc2FnZSAqLworfSA7CisKKy8qIENiIGNhbGxlZCB3aGVuIGFuIGFuc3dlciBpcyByZWNlaXZlZCAqLworc3RhdGljIHZvaWQgdGFfY2JfYW5zKHZvaWQgKiBkYXRhLCBzdHJ1Y3QgbXNnICoqIG1zZykKK3sKKwlzdHJ1Y3Qgc2Vzc19zdGF0ZSAqIG1pID0gTlVMTDsKKwlzdHJ1Y3QgdGltZXNwZWMgdHM7CisJc3RydWN0IHNlc3Npb24gKiBzZXNzOworCXN0cnVjdCBhdnAgKiBhdnA7CisJc3RydWN0IGF2cF9oZHIgKiBoZHI7CisJdW5zaWduZWQgbG9uZyBkdXI7CisJaW50IGVycm9yID0gMDsKKwkKKwlDSEVDS19TWVNfRE8oIGNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZ0cyksIHJldHVybiApOworCisJLyogU2VhcmNoIHRoZSBzZXNzaW9uLCByZXRyaWV2ZSBpdHMgZGF0YSAqLworCXsKKwkJaW50IG5ldzsKKwkJQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfc2Vzc19nZXQoZmRfZ19jb25maWctPmNuZl9kaWN0LCAqbXNnLCAmc2VzcywgJm5ldyksIHJldHVybiApOworCQlBU1NFUlQoIG5ldyA9PSAwICk7CisJCQorCQlDSEVDS19GQ1RfRE8oIGZkX3Nlc3Nfc3RhdGVfcmV0cmlldmUoIHRhX2NsaV9yZWcsIHNlc3MsICZtaSApLCByZXR1cm4gKTsKKwkJQVNTRVJUKCAodm9pZCAqKW1pID09IGRhdGEgKTsKKwl9CisJCisJLyogTm93IGxvZyBjb250ZW50IG9mIHRoZSBhbnN3ZXIgKi8KKwlmcHJpbnRmKHN0ZGVyciwgIlJFQ1YgIik7CisJCisJLyogVmFsdWUgb2YgVGVzdC1BVlAgKi8KKwlDSEVDS19GQ1RfRE8oIGZkX21zZ19zZWFyY2hfYXZwICggKm1zZywgdGFfYXZwLCAmYXZwKSwgcmV0dXJuICk7CisJaWYgKGF2cCkgeworCQlDSEVDS19GQ1RfRE8oIGZkX21zZ19hdnBfaGRyKCBhdnAsICZoZHIgKSwgcmV0dXJuICk7CisJCWlmIChoZHItPmF2cF92YWx1ZS0+aTMyID09IG1pLT5yYW5kdmFsKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiV4ICglcykgIiwgaGRyLT5hdnBfdmFsdWUtPmkzMiwgIk9rIik7CisJCX0gZWxzZSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiV4ICglcykgIiwgaGRyLT5hdnBfdmFsdWUtPmkzMiwgIlBST0JMRU0iKTsKKwkJCWVycm9yKys7CisJCX0KKwl9IGVsc2UgeworCQlmcHJpbnRmKHN0ZGVyciwgIm5vX1Rlc3QtQVZQICIpOworCQllcnJvcisrOworCX0KKwkKKwkvKiBWYWx1ZSBvZiBSZXN1bHQgQ29kZSAqLworCUNIRUNLX0ZDVF9ETyggZmRfbXNnX3NlYXJjaF9hdnAgKCAqbXNnLCB0YV9yZXNfY29kZSwgJmF2cCksIHJldHVybiApOworCWlmIChhdnApIHsKKwkJQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfYXZwX2hkciggYXZwLCAmaGRyICksIHJldHVybiApOworCQlmcHJpbnRmKHN0ZGVyciwgIlN0YXR1czogJWQgIiwgaGRyLT5hdnBfdmFsdWUtPmkzMik7CisJCWlmIChoZHItPmF2cF92YWx1ZS0+aTMyICE9IDIwMDEpCisJCQllcnJvcisrOworCX0gZWxzZSB7CisJCWZwcmludGYoc3RkZXJyLCAibm9fUmVzdWx0LUNvZGUgIik7CisJCWVycm9yKys7CisJfQorCQorCS8qIFZhbHVlIG9mIE9yaWdpbi1Ib3N0ICovCisJQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfc2VhcmNoX2F2cCAoICptc2csIHRhX29yaWdpbl9ob3N0LCAmYXZwKSwgcmV0dXJuICk7CisJaWYgKGF2cCkgeworCQlDSEVDS19GQ1RfRE8oIGZkX21zZ19hdnBfaGRyKCBhdnAsICZoZHIgKSwgcmV0dXJuICk7CisJCWZwcmludGYoc3RkZXJyLCAiRnJvbSAnJS4qcycgIiwgKGludCloZHItPmF2cF92YWx1ZS0+b3MubGVuLCBoZHItPmF2cF92YWx1ZS0+b3MuZGF0YSk7CisJfSBlbHNlIHsKKwkJZnByaW50ZihzdGRlcnIsICJub19PcmlnaW4tSG9zdCAiKTsKKwkJZXJyb3IrKzsKKwl9CisJCisJLyogVmFsdWUgb2YgT3JpZ2luLVJlYWxtICovCisJQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfc2VhcmNoX2F2cCAoICptc2csIHRhX29yaWdpbl9yZWFsbSwgJmF2cCksIHJldHVybiApOworCWlmIChhdnApIHsKKwkJQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfYXZwX2hkciggYXZwLCAmaGRyICksIHJldHVybiApOworCQlmcHJpbnRmKHN0ZGVyciwgIignJS4qcycpICIsIChpbnQpaGRyLT5hdnBfdmFsdWUtPm9zLmxlbiwgaGRyLT5hdnBfdmFsdWUtPm9zLmRhdGEpOworCX0gZWxzZSB7CisJCWZwcmludGYoc3RkZXJyLCAibm9fT3JpZ2luLVJlYWxtICIpOworCQllcnJvcisrOworCX0KKwkKKwlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9tdXRleF9sb2NrKCZ0YV9jb25mLT5zdGF0c19sb2NrKSwgKTsKKwlkdXIgPSAoKHRzLnR2X3NlYyAtIG1pLT50cy50dl9zZWMpICogMTAwMDAwMCkgKyAoKHRzLnR2X25zZWMgLSBtaS0+dHMudHZfbnNlYykgLyAxMDAwKTsKKwlpZiAodGFfY29uZi0+c3RhdHMubmJfcmVjdikgeworCQkvKiBQb25kZXJhdGUgaW4gdGhlIGF2ZyAqLworCQl0YV9jb25mLT5zdGF0cy5hdmcgPSAodGFfY29uZi0+c3RhdHMuYXZnICogdGFfY29uZi0+c3RhdHMubmJfcmVjdiArIGR1cikgLyAodGFfY29uZi0+c3RhdHMubmJfcmVjdiArIDEpOworCQkvKiBNaW4sIG1heCAqLworCQlpZiAoZHVyIDwgdGFfY29uZi0+c3RhdHMuc2hvcnRlc3QpCisJCQl0YV9jb25mLT5zdGF0cy5zaG9ydGVzdCA9IGR1cjsKKwkJaWYgKGR1ciA+IHRhX2NvbmYtPnN0YXRzLmxvbmdlc3QpCisJCQl0YV9jb25mLT5zdGF0cy5sb25nZXN0ID0gZHVyOworCX0gZWxzZSB7CisJCXRhX2NvbmYtPnN0YXRzLnNob3J0ZXN0ID0gZHVyOworCQl0YV9jb25mLT5zdGF0cy5sb25nZXN0ID0gZHVyOworCQl0YV9jb25mLT5zdGF0cy5hdmcgPSBkdXI7CisJfQorCQorCWlmIChlcnJvcikKKwkJdGFfY29uZi0+c3RhdHMubmJfZXJycysrOworCWVsc2UgCisJCXRhX2NvbmYtPnN0YXRzLm5iX3JlY3YrKzsKKwkKKwkKKwlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9tdXRleF91bmxvY2soJnRhX2NvbmYtPnN0YXRzX2xvY2spLCApOworCQorCS8qIERpc3BsYXkgaG93IGxvbmcgaXQgdG9vayAqLworCWlmICh0cy50dl9uc2VjID4gbWktPnRzLnR2X25zZWMpIHsKKwkJZnByaW50ZihzdGRlcnIsICJpbiAlZC4lMDZsZCBzZWMiLCAKKwkJCQkoaW50KSh0cy50dl9zZWMgLSBtaS0+dHMudHZfc2VjKSwKKwkJCQkobG9uZykodHMudHZfbnNlYyAtIG1pLT50cy50dl9uc2VjKSAvIDEwMDApOworCX0gZWxzZSB7CisJCWZwcmludGYoc3RkZXJyLCAiaW4gJWQuJTA2bGQgc2VjIiwgCisJCQkJKGludCkodHMudHZfc2VjICsgMSAtIG1pLT50cy50dl9zZWMpLAorCQkJCShsb25nKSgxMDAwMDAwMDAwICsgdHMudHZfbnNlYyAtIG1pLT50cy50dl9uc2VjKSAvIDEwMDApOworCX0KKwlmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisJZmZsdXNoKHN0ZGVycik7CisJCisJLyogRnJlZSB0aGUgbWVzc2FnZSAqLworCUNIRUNLX0ZDVF9ETyhmZF9tc2dfZnJlZSgqbXNnKSwgcmV0dXJuKTsKKwkqbXNnID0gTlVMTDsKKwkKKwlmcmVlKG1pKTsKKwkKKwlyZXR1cm47Cit9CisKKy8qIENyZWF0ZSBhIHRlc3QgbWVzc2FnZSAqLworc3RhdGljIHZvaWQgdGFfY2xpX3Rlc3RfbWVzc2FnZSgpCit7CisJc3RydWN0IG1zZyAqIHJlcSA9IE5VTEw7CisJc3RydWN0IGF2cCAqIGF2cDsKKwl1bmlvbiBhdnBfdmFsdWUgdmFsOworCXN0cnVjdCBzZXNzX3N0YXRlICogbWkgPSBOVUxMLCAqc3ZnOworCXN0cnVjdCBzZXNzaW9uICpzZXNzID0gTlVMTDsKKwkKKwlUUkFDRV9ERUJVRyhGVUxMLCAiQ3JlYXRpbmcgYSBuZXcgbWVzc2FnZSBmb3Igc2VuZGluZy4iKTsKKwkKKwkvKiBDcmVhdGUgdGhlIHJlcXVlc3QgKi8KKwlDSEVDS19GQ1RfRE8oIGZkX21zZ19uZXcoIHRhX2NtZF9yLCBNU0dGTF9BTExPQ19FVEVJRCwgJnJlcSApLCBnb3RvIG91dCApOworCQorCS8qIENyZWF0ZSBhIG5ldyBzZXNzaW9uICovCisJI2RlZmluZSBURVNUX0FQUF9TSURfT1BUICAiYXBwX3Rlc3QiCisJQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfbmV3X3Nlc3Npb24oIHJlcSwgKG9zMF90KVRFU1RfQVBQX1NJRF9PUFQsIENPTlNUU1RSTEVOKFRFU1RfQVBQX1NJRF9PUFQpICksIGdvdG8gb3V0ICk7CisJQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfc2Vzc19nZXQoZmRfZ19jb25maWctPmNuZl9kaWN0LCByZXEsICZzZXNzLCBOVUxMKSwgZ290byBvdXQgKTsKKwkKKwkvKiBDcmVhdGUgdGhlIHJhbmRvbSB2YWx1ZSB0byBzdG9yZSB3aXRoIHRoZSBzZXNzaW9uICovCisJbWkgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzZXNzX3N0YXRlKSk7CisJaWYgKG1pID09IE5VTEwpIHsKKwkJZmRfbG9nX2RlYnVnKCJtYWxsb2MgZmFpbGVkOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCWdvdG8gb3V0OworCX0KKwkKKwltaS0+cmFuZHZhbCA9IChpbnQzMl90KXJhbmRvbSgpOworCQorCS8qIE5vdyBzZXQgYWxsIEFWUHMgdmFsdWVzICovCisJCisJLyogU2V0IHRoZSBEZXN0aW5hdGlvbi1SZWFsbSBBVlAgKi8KKwl7CisJCUNIRUNLX0ZDVF9ETyggZmRfbXNnX2F2cF9uZXcgKCB0YV9kZXN0X3JlYWxtLCAwLCAmYXZwICksIGdvdG8gb3V0ICApOworCQl2YWwub3MuZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopKHRhX2NvbmYtPmRlc3RfcmVhbG0pOworCQl2YWwub3MubGVuICA9IHN0cmxlbih0YV9jb25mLT5kZXN0X3JlYWxtKTsKKwkJQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfYXZwX3NldHZhbHVlKCBhdnAsICZ2YWwgKSwgZ290byBvdXQgICk7CisJCUNIRUNLX0ZDVF9ETyggZmRfbXNnX2F2cF9hZGQoIHJlcSwgTVNHX0JSV19MQVNUX0NISUxELCBhdnAgKSwgZ290byBvdXQgICk7CisJfQorCQorCS8qIFNldCB0aGUgRGVzdGluYXRpb24tSG9zdCBBVlAgaWYgbmVlZGVkKi8KKwlpZiAodGFfY29uZi0+ZGVzdF9ob3N0KSB7CisJCUNIRUNLX0ZDVF9ETyggZmRfbXNnX2F2cF9uZXcgKCB0YV9kZXN0X2hvc3QsIDAsICZhdnAgKSwgZ290byBvdXQgICk7CisJCXZhbC5vcy5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikodGFfY29uZi0+ZGVzdF9ob3N0KTsKKwkJdmFsLm9zLmxlbiAgPSBzdHJsZW4odGFfY29uZi0+ZGVzdF9ob3N0KTsKKwkJQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfYXZwX3NldHZhbHVlKCBhdnAsICZ2YWwgKSwgZ290byBvdXQgICk7CisJCUNIRUNLX0ZDVF9ETyggZmRfbXNnX2F2cF9hZGQoIHJlcSwgTVNHX0JSV19MQVNUX0NISUxELCBhdnAgKSwgZ290byBvdXQgICk7CisJfQorCQorCS8qIFNldCBPcmlnaW4tSG9zdCAmIE9yaWdpbi1SZWFsbSAqLworCUNIRUNLX0ZDVF9ETyggZmRfbXNnX2FkZF9vcmlnaW4gKCByZXEsIDAgKSwgZ290byBvdXQgICk7CisJCisJLyogU2V0IHRoZSBVc2VyLU5hbWUgQVZQIGlmIG5lZWRlZCovCisJaWYgKHRhX2NvbmYtPnVzZXJfbmFtZSkgeworCQlDSEVDS19GQ1RfRE8oIGZkX21zZ19hdnBfbmV3ICggdGFfdXNlcl9uYW1lLCAwLCAmYXZwICksIGdvdG8gb3V0ICApOworCQl2YWwub3MuZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopKHRhX2NvbmYtPnVzZXJfbmFtZSk7CisJCXZhbC5vcy5sZW4gID0gc3RybGVuKHRhX2NvbmYtPnVzZXJfbmFtZSk7CisJCUNIRUNLX0ZDVF9ETyggZmRfbXNnX2F2cF9zZXR2YWx1ZSggYXZwLCAmdmFsICksIGdvdG8gb3V0ICApOworCQlDSEVDS19GQ1RfRE8oIGZkX21zZ19hdnBfYWRkKCByZXEsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwICksIGdvdG8gb3V0ICApOworCX0KKwkKKwkvKiBTZXQgdGhlIFRlc3QtQVZQIEFWUCAqLworCXsKKwkJQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfYXZwX25ldyAoIHRhX2F2cCwgMCwgJmF2cCApLCBnb3RvIG91dCAgKTsKKwkJdmFsLmkzMiA9IG1pLT5yYW5kdmFsOworCQlDSEVDS19GQ1RfRE8oIGZkX21zZ19hdnBfc2V0dmFsdWUoIGF2cCwgJnZhbCApLCBnb3RvIG91dCAgKTsKKwkJQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfYXZwX2FkZCggcmVxLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCApLCBnb3RvIG91dCAgKTsKKwl9CisJCisJLyogU2V0IHRoZSBUZXN0LVBheWxvYWQtQVZQIEFWUCAqLworCWlmICh0YV9jb25mLT5sb25nX2F2cF9pZCkgeworCQlpbnQgbDsKKwkJQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfYXZwX25ldyAoIHRhX2F2cF9sb25nLCAwLCAmYXZwICksIGdvdG8gb3V0ICApOworCQlDSEVDS19NQUxMT0NfRE8oIHZhbC5vcy5kYXRhID0gbWFsbG9jKHRhX2NvbmYtPmxvbmdfYXZwX2xlbiksIGdvdG8gb3V0KTsKKwkJdmFsLm9zLmxlbiA9IHRhX2NvbmYtPmxvbmdfYXZwX2xlbjsKKwkJZm9yIChsPTA7IGwgPCB0YV9jb25mLT5sb25nX2F2cF9sZW47IGwrKykKKwkJCXZhbC5vcy5kYXRhW2xdPWw7CisJCUNIRUNLX0ZDVF9ETyggZmRfbXNnX2F2cF9zZXR2YWx1ZSggYXZwLCAmdmFsICksIGdvdG8gb3V0ICApOworCQlmcmVlKHZhbC5vcy5kYXRhKTsKKwkJQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfYXZwX2FkZCggcmVxLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCApLCBnb3RvIG91dCAgKTsKKwl9CisJCisJQ0hFQ0tfU1lTX0RPKCBjbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmbWktPnRzKSwgZ290byBvdXQgKTsKKwkKKwkvKiBLZWVwIGEgcG9pbnRlciB0byB0aGUgc2Vzc2lvbiBkYXRhIGZvciBkZWJ1ZyBwdXJwb3NlLCBpbiByZWFsIGxpZmUgd2Ugd291bGQgbm90IG5lZWQgaXQgKi8KKwlzdmcgPSBtaTsKKwkKKwkvKiBTdG9yZSB0aGlzIHZhbHVlIGluIHRoZSBzZXNzaW9uICovCisJQ0hFQ0tfRkNUX0RPKCBmZF9zZXNzX3N0YXRlX3N0b3JlICggdGFfY2xpX3JlZywgc2VzcywgJm1pICksIGdvdG8gb3V0ICk7IAorCQorCS8qIExvZyBzZW5kaW5nIHRoZSBtZXNzYWdlICovCisJZnByaW50ZihzdGRlcnIsICJTRU5EICV4IHRvICclcycgKCVzKVxuIiwgc3ZnLT5yYW5kdmFsLCB0YV9jb25mLT5kZXN0X3JlYWxtLCB0YV9jb25mLT5kZXN0X2hvc3Q/OiItIiApOworCWZmbHVzaChzdGRlcnIpOworCQorCS8qIFNlbmQgdGhlIHJlcXVlc3QgKi8KKwlDSEVDS19GQ1RfRE8oIGZkX21zZ19zZW5kKCAmcmVxLCB0YV9jYl9hbnMsIHN2ZyApLCBnb3RvIG91dCApOworCisJLyogSW5jcmVtZW50IHRoZSBjb3VudGVyICovCisJQ0hFQ0tfUE9TSVhfRE8oIHB0aHJlYWRfbXV0ZXhfbG9jaygmdGFfY29uZi0+c3RhdHNfbG9jayksICk7CisJdGFfY29uZi0+c3RhdHMubmJfc2VudCsrOworCUNIRUNLX1BPU0lYX0RPKCBwdGhyZWFkX211dGV4X3VubG9jaygmdGFfY29uZi0+c3RhdHNfbG9jayksICk7CisKK291dDoKKwlyZXR1cm47Cit9CisKK2ludCB0YV9jbGlfaW5pdCh2b2lkKQoreworCUNIRUNLX0ZDVCggZmRfc2Vzc19oYW5kbGVyX2NyZWF0ZSgmdGFfY2xpX3JlZywgKHZvaWQgKilmcmVlLCBOVUxMLCBOVUxMKSApOworCQorCUNIRUNLX0ZDVCggZmRfZXZlbnRfdHJpZ19yZWdjYih0YV9jb25mLT5zaWduYWwsICJ0ZXN0X2FwcC5jbGkiLCB0YV9jbGlfdGVzdF9tZXNzYWdlICkgKTsKKwkKKwlyZXR1cm4gMDsKK30KKwordm9pZCB0YV9jbGlfZmluaSh2b2lkKQoreworCS8vIENIRUNLX0ZDVF9ETyggZmRfc2lnX3VucmVnaXN0ZXIodGFfY29uZi0+c2lnbmFsKSwgLyogY29udGludWUgKi8gKTsKKwkKKwlDSEVDS19GQ1RfRE8oIGZkX3Nlc3NfaGFuZGxlcl9kZXN0cm95KCZ0YV9jbGlfcmVnLCBOVUxMKSwgLyogY29udGludWUgKi8gKTsKKwkKKwlyZXR1cm47Cit9OwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy90ZXN0X2FwcC90YV9jb25mLmwgYi9leHRlbnNpb25zL3Rlc3RfYXBwL3RhX2NvbmYubApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmFlOTUwCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy90ZXN0X2FwcC90YV9jb25mLmwKQEAgLTAsMCArMSwxNzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDEzLCBXSURFIFByb2plY3QgYW5kIE5JQ1QJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFdJREUgUHJvamVjdCBvciBOSUNUIG5vciB0aGUgCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgV0lERSBQcm9qZWN0IGFuZCAJCQkJCQkgKgorKiAgIE5JQ1QuCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogTGV4IGV4dGVuc2lvbidzIGNvbmZpZ3VyYXRpb24gcGFyc2VyLgorICoKKyAqIFRoZSBjb25maWd1cmF0aW9uIGZpbGUgY29udGFpbnMgYSBkZWZhdWx0IHByaW9yaXR5LCBhbmQgYSBsaXN0IG9mIHBlZXJzIHdpdGggb3B0aW9uYWwgb3ZlcndpdGUgcHJpb3JpdHkuCisgKiAtLSBzZWUgdGhlIGFwcF90ZXN0LmNvbmYuc2FtcGxlIGZpbGUgZm9yIG1vcmUgZGV0YWlsLgorICovCisKKyV7CisjaW5jbHVkZSAidGVzdF9hcHAuaCIKKy8qIEluY2x1ZGUgeWFjYyB0b2tlbnMgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlICJ0YV9jb25mLnRhYi5oIgorCisvKiBVcGRhdGUgdGhlIGNvbHVtbiBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBZWV9VU0VSX0FDVElPTiB7IAkJCQkJCVwKKwl5eWxsb2MtPmZpcnN0X2NvbHVtbiA9IHl5bGxvYy0+bGFzdF9jb2x1bW4gKyAxOyAJCVwKKwl5eWxsb2MtPmxhc3RfY29sdW1uID0geXlsbG9jLT5maXJzdF9jb2x1bW4gKyB5eWxlbmcgLSAxOwlcCit9CisKKy8qIEF2b2lkIHdhcm5pbmcgd2l0aCBuZXdlciBmbGV4ICovCisjZGVmaW5lIFlZX05PX0lOUFVUCisKKyV9CisKKyVvcHRpb24gYmlzb24tYnJpZGdlIGJpc29uLWxvY2F0aW9ucworJW9wdGlvbiBub3l5d3JhcAorJW9wdGlvbiBub3VucHV0CisKKyUlCisKKwkvKiBVcGRhdGUgdGhlIGxpbmUgY291bnQgKi8KK1xuCQkJeworCQkJCXl5bGxvYy0+Zmlyc3RfbGluZSsrOyAKKwkJCQl5eWxsb2MtPmxhc3RfbGluZSsrOyAKKwkJCQl5eWxsb2MtPmxhc3RfY29sdW1uPTA7IAorCQkJfQorCSAKKwkvKiBFYXQgYWxsIHNwYWNlcyBidXQgbm90IG5ldyBsaW5lcyAqLworKFtbOnNwYWNlOl1dey19W1xuXSkrCTsKKwkvKiBFYXQgYWxsIGNvbW1lbnRzICovCisjLiokCQkJOworCisJLyogUmVjb2duaXplIGFueSBpbnRlZ2VyICovCitbLV0/W1s6ZGlnaXQ6XV0rCQl7CisJCQkJLyogQ29udmVydCB0aGlzIHRvIGFuIGludGVnZXIgdmFsdWUgKi8KKwkJCQlpbnQgcmV0PTA7CisJCQkJcmV0ID0gc3NjYW5mKHl5dGV4dCwgIiVpIiwgJnl5bHZhbC0+aW50ZWdlcik7CisJCQkJaWYgKHJldCAhPSAxKSB7CisJCQkJCS8qIE5vIG1hdGNoaW5nOiBhbiBlcnJvciBvY2N1cnJlZCAqLworCQkJCQlmZF9sb2dfZGVidWcoIlVuYWJsZSB0byBjb252ZXJ0IHRoZSB2YWx1ZSAnJXMnIHRvIGEgdmFsaWQgbnVtYmVyOiAlcyIsIHl5dGV4dCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCQkJcmV0dXJuIExFWF9FUlJPUjsgLyogdHJpZyBhbiBlcnJvciBpbiB5YWNjIHBhcnNlciAqLworCQkJCQkvKiBNYXliZSB3ZSBjb3VsZCBSRUpFQ1QgaW5zdGVhZCBvZiBmYWlsaW5nIGhlcmU/ICovCisJCQkJfQorCQkJCXJldHVybiBJTlRFR0VSOworCQkJfQorCisJLyogUmVjb2duaXplIHF1b3RlZCBzdHJpbmdzIC0tIHdlIGRvIG5vdCBzdXBwb3J0IGVzY2FwZWQgXCIgaW4gdGhlIHN0cmluZyBjdXJyZW50bHkuICovCitcIlteXCJdK1wiCQl7CisJCQkJLyogTWF0Y2ggYSBxdW90ZWQgc3RyaW5nLiBMZXQncyBiZSB2ZXJ5IHBlcm1pc3NpdmUuICovCisJCQkJeXlsdmFsLT5zdHJpbmcgPSBzdHJkdXAoeXl0ZXh0KzEpOworCQkJCWlmICgheXlsdmFsLT5zdHJpbmcpIHsKKwkJCQkJZmRfbG9nX2RlYnVnKCJVbmFibGUgdG8gY29weSB0aGUgc3RyaW5nICclcyc6ICVzIiwgeXl0ZXh0LCBzdHJlcnJvcihlcnJubykpOworCQkJCQlUUkFDRV9ERUJVRyhJTkZPLCAic3RyZHVwIGZhaWxlZCIpOworCQkJCQlyZXR1cm4gTEVYX0VSUk9SOyAvKiB0cmlnIGFuIGVycm9yIGluIHlhY2MgcGFyc2VyICovCisJCQkJfQorCQkJCXl5bHZhbC0+c3RyaW5nW3N0cmxlbih5eXRleHQpIC0gMl0gPSAnXDAnOworCQkJCXJldHVybiBRU1RSSU5HOworCQkJfQorCQkJCisJLyogUmVjb2duaXplIHRoZSB0b2tlbnMgKi8JCisoP2k6InZlbmRvci1pZCIpCXsKKwkJCQlyZXR1cm4gVkVORE9SX0lEOworCQkJfQorCisoP2k6ImFwcGxpLWlkIikJCXsKKwkJCQlyZXR1cm4gQVBQTElfSUQ7CisJCQl9CisKKyg/aToiY21kLWlkIikJCXsKKwkJCQlyZXR1cm4gQ01EX0lEOworCQkJfQorCisoP2k6ImF2cC1pZCIpCQl7CisJCQkJcmV0dXJuIEFWUF9JRDsKKwkJCX0KKworKD9pOiJsb25nLWF2cC1pZCIpCXsKKwkJCQlyZXR1cm4gTE9OR19BVlBfSUQ7CisJCQl9CisKKyg/aToibG9uZy1hdnAtbGVuIikJeworCQkJCXJldHVybiBMT05HX0FWUF9MRU47CisJCQl9CisKKyg/aToibW9kZSIpCQl7CisJCQkJcmV0dXJuIE1PREU7CisJCQl9CisKKyg/aToic2VydmVyIikJCXsKKwkJCQl5eWx2YWwtPmludGVnZXIgPSBNT0RFX1NFUlY7CisJCQkJcmV0dXJuIElOVEVHRVI7CisJCQl9CisKKyg/aToiY2xpZW50IikJCXsKKwkJCQl5eWx2YWwtPmludGVnZXIgPSBNT0RFX0NMSTsKKwkJCQlyZXR1cm4gSU5URUdFUjsKKwkJCX0KKworKD9pOiJib3RoIikJCXsKKwkJCQl5eWx2YWwtPmludGVnZXIgPSBNT0RFX1NFUlYgfCBNT0RFX0NMSTsKKwkJCQlyZXR1cm4gSU5URUdFUjsKKwkJCX0KKworKD9pOiJkZXN0LXJlYWxtIikJeworCQkJCXJldHVybiBERVNUX1JFQUxNOworCQkJfQorCisoP2k6ImRlc3QtaG9zdCIpCXsKKwkJCQlyZXR1cm4gREVTVF9IT1NUOworCQkJfQorCisoP2k6InVzZXItbmFtZSIpCXsKKwkJCQlyZXR1cm4gVVNFUl9OQU1FOworCQkJfQorCisoP2k6IlNpZ25hbCIpCQl7CisJCQkJcmV0dXJuIFNJR05BTDsKKwkJCX0KKworKD9pOiJCZW5jaG1hcmsiKQl7CisJCQkJcmV0dXJuIEJFTkNIOworCQkJfQorCisJCQkKKwkvKiBWYWxpZCBzaW5nbGUgY2hhcmFjdGVycyBmb3IgeXlwYXJzZSAqLworWz07XQkJCXsgcmV0dXJuIHl5dGV4dFswXTsgfQorCisJLyogVW5yZWNvZ25pemVkIHNlcXVlbmNlLCBpZiBpdCBkaWQgbm90IG1hdGNoIGFueSBwcmV2aW91cyBwYXR0ZXJuICovCitbXls6c3BhY2U6XSIqPT47XG5dKwl7IAorCQkJCWZkX2xvZ19kZWJ1ZygiVW5yZWNvZ25pemVkIHRleHQgb24gbGluZSAlZCBjb2wgJWQ6ICclcycuIiwgeXlsbG9jLT5maXJzdF9saW5lLCB5eWxsb2MtPmZpcnN0X2NvbHVtbiwgeXl0ZXh0KTsKKwkJCSAJcmV0dXJuIExFWF9FUlJPUjsgCisJCQl9CisKKyUlCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL3Rlc3RfYXBwL3RhX2NvbmYueSBiL2V4dGVuc2lvbnMvdGVzdF9hcHAvdGFfY29uZi55Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyZTM2NDgKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL3Rlc3RfYXBwL3RhX2NvbmYueQpAQCAtMCwwICsxLDIzOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTMsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBZYWNjIGV4dGVuc2lvbidzIGNvbmZpZ3VyYXRpb24gcGFyc2VyLgorICogU2VlIGRvYy9hcHBfdGVzdC5jb25mLnNhbXBsZSBmb3IgY29uZmlndXJhdGlvbiBmaWxlIGZvcm1hdAorICovCisKKy8qIEZvciBkZXZlbG9wbWVudCBvbmx5IDogKi8KKyVkZWJ1ZyAKKyVlcnJvci12ZXJib3NlCisKKy8qIFRoZSBwYXJzZXIgcmVjZWl2ZXMgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBmaWxlbmFtZSBhcyBwYXJhbWV0ZXIgKi8KKyVwYXJzZS1wYXJhbSB7Y2hhciAqIGNvbmZmaWxlfQorCisvKiBLZWVwIHRyYWNrIG9mIGxvY2F0aW9uICovCislbG9jYXRpb25zIAorJXB1cmUtcGFyc2VyCisKKyV7CisjaW5jbHVkZSAidGVzdF9hcHAuaCIKKyNpbmNsdWRlICJ0YV9jb25mLnRhYi5oIgkvKiBiaXNvbiBpcyBub3Qgc21hcnQgZW5vdWdoIHRvIGRlZmluZSB0aGUgWVlMVFlQRSBiZWZvcmUgaW5jbHVkaW5nIHRoaXMgY29kZSwgc28uLi4gKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb24gKi8KK2ludCB5eXBhcnNlKGNoYXIgKiBjb25mZmlsZSk7CisKKy8qIFBhcnNlIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgKi8KK2ludCB0YV9jb25mX2hhbmRsZShjaGFyICogY29uZmZpbGUpCit7CisJZXh0ZXJuIEZJTEUgKiB0YV9jb25maW47CisJaW50IHJldDsKKwkKKwlUUkFDRV9FTlRSWSgiJXAiLCBjb25mZmlsZSk7CisJCisJVFJBQ0VfREVCVUcgKEZVTEwsICJQYXJzaW5nIGNvbmZpZ3VyYXRpb24gZmlsZTogJXMuLi4iLCBjb25mZmlsZSk7CisJCisJdGFfY29uZmluID0gZm9wZW4oY29uZmZpbGUsICJyIik7CisJaWYgKHRhX2NvbmZpbiA9PSBOVUxMKSB7CisJCXJldCA9IGVycm5vOworCQlmZF9sb2dfZGVidWcoIlVuYWJsZSB0byBvcGVuIGV4dGVuc2lvbiBjb25maWd1cmF0aW9uIGZpbGUgJXMgZm9yIHJlYWRpbmc6ICVzIiwgY29uZmZpbGUsIHN0cmVycm9yKHJldCkpOworCQlUUkFDRV9ERUJVRyAoSU5GTywgIkVycm9yIG9jY3VycmVkLCBtZXNzYWdlIGxvZ2dlZCAtLSBjb25maWd1cmF0aW9uIGZpbGUuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0geXlwYXJzZShjb25mZmlsZSk7CisKKwlmY2xvc2UodGFfY29uZmluKTsKKworCWlmIChyZXQgIT0gMCkgeworCQlUUkFDRV9ERUJVRyAoSU5GTywgIlVuYWJsZSB0byBwYXJzZSB0aGUgY29uZmlndXJhdGlvbiBmaWxlLiIpOworCQlyZXR1cm4gRUlOVkFMOworCX0KKwkKKwlyZXR1cm4gMDsKK30KKworLyogVGhlIExleCBwYXJzZXIgcHJvdG90eXBlICovCitpbnQgdGFfY29uZmxleChZWVNUWVBFICpsdmFscCwgWVlMVFlQRSAqbGxvY3ApOworCisvKiBGdW5jdGlvbiB0byByZXBvcnQgdGhlIGVycm9ycyAqLwordm9pZCB5eWVycm9yIChZWUxUWVBFICpwbG9jLCBjaGFyICogY29uZmZpbGUsIGNoYXIgY29uc3QgKnMpCit7CisJVFJBQ0VfREVCVUcoSU5GTywgIkVycm9yIGluIGNvbmZpZ3VyYXRpb24gcGFyc2luZyIpOworCQorCWlmIChwbG9jLT5maXJzdF9saW5lICE9IHBsb2MtPmxhc3RfbGluZSkKKwkJZmRfbG9nX2RlYnVnKCIlczolZC4lZC0lZC4lZCA6ICVzIiwgY29uZmZpbGUsIHBsb2MtPmZpcnN0X2xpbmUsIHBsb2MtPmZpcnN0X2NvbHVtbiwgcGxvYy0+bGFzdF9saW5lLCBwbG9jLT5sYXN0X2NvbHVtbiwgcyk7CisJZWxzZSBpZiAocGxvYy0+Zmlyc3RfY29sdW1uICE9IHBsb2MtPmxhc3RfY29sdW1uKQorCQlmZF9sb2dfZGVidWcoIiVzOiVkLiVkLSVkIDogJXMiLCBjb25mZmlsZSwgcGxvYy0+Zmlyc3RfbGluZSwgcGxvYy0+Zmlyc3RfY29sdW1uLCBwbG9jLT5sYXN0X2NvbHVtbiwgcyk7CisJZWxzZQorCQlmZF9sb2dfZGVidWcoIiVzOiVkLiVkIDogJXMiLCBjb25mZmlsZSwgcGxvYy0+Zmlyc3RfbGluZSwgcGxvYy0+Zmlyc3RfY29sdW1uLCBzKTsKK30KKworJX0KKworLyogVmFsdWVzIHJldHVybmVkIGJ5IGxleCBmb3IgdG9rZW4gKi8KKyV1bmlvbiB7CisJY2hhciAJCSpzdHJpbmc7CS8qIFRoZSBzdHJpbmcgaXMgYWxsb2NhdGVkIGJ5IHN0cmR1cCBpbiBsZXguKi8KKwlpbnQJCSBpbnRlZ2VyOwkvKiBTdG9yZSBpbnRlZ2VyIHZhbHVlcyAqLworfQorCisvKiBJbiBjYXNlIG9mIGVycm9yIGluIHRoZSBsZXhpY2FsIGFuYWx5c2lzICovCisldG9rZW4gCQlMRVhfRVJST1IKKworLyogS2V5IHdvcmRzICovCisldG9rZW4gCQlWRU5ET1JfSUQKKyV0b2tlbiAJCUFQUExJX0lECisldG9rZW4gCQlDTURfSUQKKyV0b2tlbiAJCUFWUF9JRAorJXRva2VuIAkJTE9OR19BVlBfSUQKKyV0b2tlbiAJCUxPTkdfQVZQX0xFTgorJXRva2VuIAkJTU9ERQorJXRva2VuIAkJREVTVF9SRUFMTQorJXRva2VuIAkJREVTVF9IT1NUCisldG9rZW4gCQlVU0VSX05BTUUKKyV0b2tlbiAJCVNJR05BTAorJXRva2VuCQlCRU5DSAorCisvKiBUb2tlbnMgYW5kIHR5cGVzIGZvciByb3V0aW5nIHRhYmxlIGRlZmluaXRpb24gKi8KKy8qIEEgKGRlKXF1b3RlZCBzdHJpbmcgKG1hbGxvYydkIGluIGxleCBwYXJzZXI7IGl0IG11c3QgYmUgZnJlZWQgYWZ0ZXIgdXNlKSAqLworJXRva2VuIDxzdHJpbmc+CVFTVFJJTkcKKworLyogQW4gaW50ZWdlciB2YWx1ZSAqLworJXRva2VuIDxpbnRlZ2VyPiBJTlRFR0VSCisKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworJSUKKworCS8qIFRoZSBncmFtbWFyIGRlZmluaXRpb24gKi8KK2NvbmZmaWxlOgkJLyogZW1wdHkgZ3JhbW1hciBpcyBPSyAqLworCQkJfCBjb25mZmlsZSB2ZW5kb3IKKwkJCXwgY29uZmZpbGUgYXBwbGkKKwkJCXwgY29uZmZpbGUgY21kCisJCQl8IGNvbmZmaWxlIGF2cAorCQkJfCBjb25mZmlsZSBsb25nX2F2cF9pZAorCQkJfCBjb25mZmlsZSBsb25nX2F2cF9sZW4KKwkJCXwgY29uZmZpbGUgbW9kZQorCQkJfCBjb25mZmlsZSBkc3RyZWFsbQorCQkJfCBjb25mZmlsZSBkc3Rob3N0CisJCQl8IGNvbmZmaWxlIHVzcm5hbWUKKwkJCXwgY29uZmZpbGUgc2lnbmFsCisJCQl8IGNvbmZmaWxlIGJlbmNoCisJCQk7CisKK3ZlbmRvcjoJCQlWRU5ET1JfSUQgJz0nIElOVEVHRVIgJzsnCisJCQl7CisJCQkJdGFfY29uZi0+dmVuZG9yX2lkID0gJDM7CisJCQl9CisJCQk7CisKK2FwcGxpOgkJCUFQUExJX0lEICc9JyBJTlRFR0VSICc7JworCQkJeworCQkJCXRhX2NvbmYtPmFwcGxpX2lkID0gJDM7CisJCQl9CisJCQk7CisKK2NtZDoJCQlDTURfSUQgJz0nIElOVEVHRVIgJzsnCisJCQl7CisJCQkJdGFfY29uZi0+Y21kX2lkID0gJDM7CisJCQl9CisJCQk7CisKK2F2cDoJCQlBVlBfSUQgJz0nIElOVEVHRVIgJzsnCisJCQl7CisJCQkJdGFfY29uZi0+YXZwX2lkID0gJDM7CisJCQl9CisJCQk7CisKK2xvbmdfYXZwX2lkOgkJTE9OR19BVlBfSUQgJz0nIElOVEVHRVIgJzsnCisJCQl7CisJCQkJdGFfY29uZi0+bG9uZ19hdnBfaWQgPSAkMzsKKwkJCX0KKwkJCTsKKworbG9uZ19hdnBfbGVuOgkJTE9OR19BVlBfTEVOICc9JyBJTlRFR0VSICc7JworCQkJeworCQkJCXRhX2NvbmYtPmxvbmdfYXZwX2xlbiA9ICQzOworCQkJfQorCQkJOworCittb2RlOgkJCU1PREUgJz0nIElOVEVHRVIgJzsnCisJCQl7CisJCQkJdGFfY29uZi0+bW9kZSA9ICQzIHwgKHRhX2NvbmYtPm1vZGUgJiB+Myk7IC8qIG92ZXJ3cml0ZSB0aGUgMiBsc2IgKi8KKwkJCX0KKwkJCTsKKworYmVuY2g6CQkJQkVOQ0ggJzsnCisJCQl7CisJCQkJdGFfY29uZi0+bW9kZSB8PSBNT0RFX0JFTkNIOworCQkJfQorCQkJfCBCRU5DSCBJTlRFR0VSIElOVEVHRVIgJzsnCisJCQl7CisJCQkJdGFfY29uZi0+bW9kZSB8PSBNT0RFX0JFTkNIOworCQkJCXRhX2NvbmYtPmJlbmNoX2R1cmF0aW9uID0gJDI7CisJCQkJdGFfY29uZi0+YmVuY2hfY29uY3VyICAgPSAkMzsKKwkJCX0KKwkJCTsKKworZHN0cmVhbG06CQlERVNUX1JFQUxNICc9JyBRU1RSSU5HICc7JworCQkJeworCQkJCWZyZWUodGFfY29uZi0+ZGVzdF9yZWFsbSk7CisJCQkJdGFfY29uZi0+ZGVzdF9yZWFsbSA9ICQzOworCQkJfQorCQkJOworCitkc3Rob3N0OgkJREVTVF9IT1NUICc9JyBRU1RSSU5HICc7JworCQkJeworCQkJCWZyZWUodGFfY29uZi0+ZGVzdF9ob3N0KTsKKwkJCQl0YV9jb25mLT5kZXN0X2hvc3QgPSAkMzsKKwkJCX0KKwkJCTsKKwordXNybmFtZToJCVVTRVJfTkFNRSAnPScgUVNUUklORyAnOycKKwkJCXsKKwkJCQlmcmVlKHRhX2NvbmYtPnVzZXJfbmFtZSk7CisJCQkJdGFfY29uZi0+dXNlcl9uYW1lID0gJDM7CisJCQl9CisJCQk7CisKK3NpZ25hbDoJCQlTSUdOQUwgJz0nIElOVEVHRVIgJzsnCisJCQl7CisJCQkJdGFfY29uZi0+c2lnbmFsID0gJDM7CisJCQl9CisJCQk7CmRpZmYgLS1naXQgYS9leHRlbnNpb25zL3Rlc3RfYXBwL3RhX2RpY3QuYyBiL2V4dGVuc2lvbnMvdGVzdF9hcHAvdGFfZGljdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiOWM2YjMKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL3Rlc3RfYXBwL3RhX2RpY3QuYwpAQCAtMCwwICsxLDE2NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTMsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBJbnN0YWxsIHRoZSBkaWN0aW9uYXJ5IG9iamVjdHMgKi8KKworI2luY2x1ZGUgInRlc3RfYXBwLmgiCisKK3N0cnVjdCBkaWN0X29iamVjdCAqIHRhX3ZlbmRvciA9IE5VTEw7CitzdHJ1Y3QgZGljdF9vYmplY3QgKiB0YV9hcHBsaSA9IE5VTEw7CitzdHJ1Y3QgZGljdF9vYmplY3QgKiB0YV9jbWRfciA9IE5VTEw7CitzdHJ1Y3QgZGljdF9vYmplY3QgKiB0YV9jbWRfYSA9IE5VTEw7CitzdHJ1Y3QgZGljdF9vYmplY3QgKiB0YV9hdnAgPSBOVUxMOworc3RydWN0IGRpY3Rfb2JqZWN0ICogdGFfYXZwX2xvbmcgPSBOVUxMOworCitzdHJ1Y3QgZGljdF9vYmplY3QgKiB0YV9zZXNzX2lkID0gTlVMTDsKK3N0cnVjdCBkaWN0X29iamVjdCAqIHRhX29yaWdpbl9ob3N0ID0gTlVMTDsKK3N0cnVjdCBkaWN0X29iamVjdCAqIHRhX29yaWdpbl9yZWFsbSA9IE5VTEw7CitzdHJ1Y3QgZGljdF9vYmplY3QgKiB0YV9kZXN0X2hvc3QgPSBOVUxMOworc3RydWN0IGRpY3Rfb2JqZWN0ICogdGFfZGVzdF9yZWFsbSA9IE5VTEw7CitzdHJ1Y3QgZGljdF9vYmplY3QgKiB0YV91c2VyX25hbWUgPSBOVUxMOworc3RydWN0IGRpY3Rfb2JqZWN0ICogdGFfcmVzX2NvZGUgPSBOVUxMOworCitpbnQgdGFfZGljdF9pbml0KHZvaWQpCit7CisJVFJBQ0VfREVCVUcoRlVMTCwgIkluaXRpYWxpemluZyB0aGUgZGljdGlvbmFyeSBmb3IgdGVzdCIpOworCQorCS8qIENyZWF0ZSB0aGUgVGVzdCBWZW5kb3IgKi8KKwl7CisJCXN0cnVjdCBkaWN0X3ZlbmRvcl9kYXRhIGRhdGE7CisJCWRhdGEudmVuZG9yX2lkID0gdGFfY29uZi0+dmVuZG9yX2lkOworCQlkYXRhLnZlbmRvcl9uYW1lID0gImFwcF90ZXN0IHZlbmRvciI7CisJCUNIRUNLX0ZDVChmZF9kaWN0X25ldyggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1ZFTkRPUiwgJmRhdGEsIE5VTEwsICZ0YV92ZW5kb3IpKTsKKwl9CisJCisJLyogQ3JlYXRlIHRoZSBUZXN0IEFwcGxpY2F0aW9uICovCisJeworCQlzdHJ1Y3QgZGljdF9hcHBsaWNhdGlvbl9kYXRhIGRhdGE7CisJCWRhdGEuYXBwbGljYXRpb25faWQgPSB0YV9jb25mLT5hcHBsaV9pZDsKKwkJZGF0YS5hcHBsaWNhdGlvbl9uYW1lID0gImFwcF90ZXN0IGFwcGxpY2F0aW9uIjsKKwkJQ0hFQ0tfRkNUKGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVBQTElDQVRJT04sICZkYXRhLCB0YV92ZW5kb3IsICZ0YV9hcHBsaSkpOworCX0KKwkKKwkvKiBDcmVhdGUgdGhlIFRlc3QtUmVxdWVzdCAmIFRlc3QtQW5zd2VyIGNvbW1hbmRzICovCisJeworCQlzdHJ1Y3QgZGljdF9jbWRfZGF0YSBkYXRhOworCQlkYXRhLmNtZF9jb2RlID0gdGFfY29uZi0+Y21kX2lkOworCQlkYXRhLmNtZF9uYW1lID0gIlRlc3QtUmVxdWVzdCI7CisJCWRhdGEuY21kX2ZsYWdfbWFzayA9IENNRF9GTEFHX1BST1hJQUJMRSB8IENNRF9GTEFHX1JFUVVFU1Q7CisJCWRhdGEuY21kX2ZsYWdfdmFsICA9IENNRF9GTEFHX1BST1hJQUJMRSB8IENNRF9GTEFHX1JFUVVFU1Q7CisJCUNIRUNLX0ZDVChmZF9kaWN0X25ldyggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0NPTU1BTkQsICZkYXRhLCB0YV9hcHBsaSwgJnRhX2NtZF9yKSk7CisJCWRhdGEuY21kX25hbWUgPSAiVGVzdC1BbnN3ZXIiOworCQlkYXRhLmNtZF9mbGFnX3ZhbCAgPSBDTURfRkxBR19QUk9YSUFCTEU7CisJCUNIRUNLX0ZDVChmZF9kaWN0X25ldyggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0NPTU1BTkQsICZkYXRhLCB0YV9hcHBsaSwgJnRhX2NtZF9hKSk7CisJfQorCQorCS8qIENyZWF0ZSB0aGUgVGVzdCBBVlAgKi8KKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGE7CisJCWRhdGEuYXZwX2NvZGUgPSB0YV9jb25mLT5hdnBfaWQ7CisJCWRhdGEuYXZwX3ZlbmRvciA9IHRhX2NvbmYtPnZlbmRvcl9pZDsKKwkJZGF0YS5hdnBfbmFtZSA9ICJUZXN0LUFWUCI7CisJCWRhdGEuYXZwX2ZsYWdfbWFzayA9IEFWUF9GTEFHX1ZFTkRPUjsKKwkJZGF0YS5hdnBfZmxhZ192YWwgPSBBVlBfRkxBR19WRU5ET1I7CisJCWRhdGEuYXZwX2Jhc2V0eXBlID0gQVZQX1RZUEVfSU5URUdFUjMyOworCQlDSEVDS19GQ1QoZmRfZGljdF9uZXcoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsICZkYXRhLCBOVUxMLCAmdGFfYXZwKSk7CisJfQorCQorCS8qIENyZWF0ZSB0aGUgVGVzdCBQYXlsb2FkIEFWUCAqLworCWlmICh0YV9jb25mLT5sb25nX2F2cF9pZCkgeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhOworCQlkYXRhLmF2cF9jb2RlID0gdGFfY29uZi0+bG9uZ19hdnBfaWQ7CisJCWRhdGEuYXZwX3ZlbmRvciA9IHRhX2NvbmYtPnZlbmRvcl9pZDsKKwkJZGF0YS5hdnBfbmFtZSA9ICJUZXN0LVBheWxvYWQtQVZQIjsKKwkJZGF0YS5hdnBfZmxhZ19tYXNrID0gQVZQX0ZMQUdfVkVORE9SOworCQlkYXRhLmF2cF9mbGFnX3ZhbCA9IEFWUF9GTEFHX1ZFTkRPUjsKKwkJZGF0YS5hdnBfYmFzZXR5cGUgPSBBVlBfVFlQRV9PQ1RFVFNUUklORzsKKwkJQ0hFQ0tfRkNUKGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCAmZGF0YSwgTlVMTCwgJnRhX2F2cF9sb25nKSk7CisJfQorCQorCS8qIE5vdyByZXNvbHZlIHNvbWUgb3RoZXIgdXNlZnVsIEFWUHMgKi8KKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIlNlc3Npb24tSWQiLCAmdGFfc2Vzc19pZCwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiT3JpZ2luLUhvc3QiLCAmdGFfb3JpZ2luX2hvc3QsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIk9yaWdpbi1SZWFsbSIsICZ0YV9vcmlnaW5fcmVhbG0sIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIkRlc3RpbmF0aW9uLUhvc3QiLCAmdGFfZGVzdF9ob3N0LCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJEZXN0aW5hdGlvbi1SZWFsbSIsICZ0YV9kZXN0X3JlYWxtLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJVc2VyLU5hbWUiLCAmdGFfdXNlcl9uYW1lLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJSZXN1bHQtQ29kZSIsICZ0YV9yZXNfY29kZSwgRU5PRU5UKSApOworCQorCS8qIENyZWF0ZSB0aGUgcnVsZXMgZm9yIFRlc3QtUmVxdWVzdCBhbmQgVGVzdC1BbnN3ZXIgKi8KKwl7CisJCXN0cnVjdCBkaWN0X3J1bGVfZGF0YSBkYXRhOworCQlkYXRhLnJ1bGVfbWluID0gMTsKKwkJZGF0YS5ydWxlX21heCA9IDE7CisJCQorCQkvKiBTZXNzaW9uLUlkIGlzIGluIGZpcnN0IHBvc2l0aW9uICovCisJCWRhdGEucnVsZV9hdnAgPSB0YV9zZXNzX2lkOworCQlkYXRhLnJ1bGVfcG9zaXRpb24gPSBSVUxFX0ZJWEVEX0hFQUQ7CisJCWRhdGEucnVsZV9vcmRlciA9IDE7CisJCUNIRUNLX0ZDVChmZF9kaWN0X25ldyggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1JVTEUsICZkYXRhLCB0YV9jbWRfciwgTlVMTCkpOworCQlDSEVDS19GQ1QoZmRfZGljdF9uZXcoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9SVUxFLCAmZGF0YSwgdGFfY21kX2EsIE5VTEwpKTsKKwkJCisJCWRhdGEucnVsZV9wb3NpdGlvbiA9IFJVTEVfUkVRVUlSRUQ7CisJCS8qIFRlc3QtQVZQIGlzIG1hbmRhdG9yeSAqLworCQlkYXRhLnJ1bGVfYXZwID0gdGFfYXZwOworCQlDSEVDS19GQ1QoZmRfZGljdF9uZXcoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9SVUxFLCAmZGF0YSwgdGFfY21kX3IsIE5VTEwpKTsKKwkJQ0hFQ0tfRkNUKGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfUlVMRSwgJmRhdGEsIHRhX2NtZF9hLCBOVUxMKSk7CisJCQorCQkvKiBpZGVtIGZvciBPcmlnaW4gSG9zdCBhbmQgUmVhbG0gKi8KKwkJZGF0YS5ydWxlX2F2cCA9IHRhX29yaWdpbl9ob3N0OworCQlDSEVDS19GQ1QoZmRfZGljdF9uZXcoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9SVUxFLCAmZGF0YSwgdGFfY21kX3IsIE5VTEwpKTsKKwkJQ0hFQ0tfRkNUKGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfUlVMRSwgJmRhdGEsIHRhX2NtZF9hLCBOVUxMKSk7CisJCQorCQlkYXRhLnJ1bGVfYXZwID0gdGFfb3JpZ2luX3JlYWxtOworCQlDSEVDS19GQ1QoZmRfZGljdF9uZXcoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9SVUxFLCAmZGF0YSwgdGFfY21kX3IsIE5VTEwpKTsKKwkJQ0hFQ0tfRkNUKGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfUlVMRSwgJmRhdGEsIHRhX2NtZF9hLCBOVUxMKSk7CisJCQorCQkvKiBBbmQgUmVzdWx0LUNvZGUgaXMgbWFuZGF0b3J5IGZvciBhbnN3ZXJzIG9ubHkgKi8KKwkJZGF0YS5ydWxlX2F2cCA9IHRhX3Jlc19jb2RlOworCQlDSEVDS19GQ1QoZmRfZGljdF9uZXcoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9SVUxFLCAmZGF0YSwgdGFfY21kX2EsIE5VTEwpKTsKKwkJCisJCS8qIEFuZCBEZXN0aW5hdGlvbi1SZWFsbSBmb3IgcmVxdWVzdHMgb25seSAqLworCQlkYXRhLnJ1bGVfYXZwID0gdGFfZGVzdF9yZWFsbTsKKwkJQ0hFQ0tfRkNUKGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfUlVMRSwgJmRhdGEsIHRhX2NtZF9yLCBOVUxMKSk7CisJCQorCQkvKiBBbmQgRGVzdGluYXRpb24tSG9zdCBvcHRpb25hbCBmb3IgcmVxdWVzdHMgb25seSAqLworCQlkYXRhLnJ1bGVfcG9zaXRpb24gPSBSVUxFX09QVElPTkFMOworCQlkYXRhLnJ1bGVfbWluID0gMDsKKwkJZGF0YS5ydWxlX2F2cCA9IHRhX2Rlc3RfaG9zdDsKKwkJQ0hFQ0tfRkNUKGZkX2RpY3RfbmV3KCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfUlVMRSwgJmRhdGEsIHRhX2NtZF9yLCBOVUxMKSk7CisJCQorCX0KKwkKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvdGVzdF9hcHAvdGFfc2Vydi5jIGIvZXh0ZW5zaW9ucy90ZXN0X2FwcC90YV9zZXJ2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ4YzlkZQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvdGVzdF9hcHAvdGFfc2Vydi5jCkBAIC0wLDAgKzEsMTU0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxMywgV0lERSBQcm9qZWN0IGFuZCBOSUNUCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBXSURFIFByb2plY3Qgb3IgTklDVCBub3IgdGhlIAkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFdJREUgUHJvamVjdCBhbmQgCQkJCQkJICoKKyogICBOSUNULgkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEluc3RhbGwgdGhlIGRpc3BhdGNoIGNhbGxiYWNrcyAqLworCisjaW5jbHVkZSAidGVzdF9hcHAuaCIKKworc3RhdGljIHN0cnVjdCBkaXNwX2hkbCAqIHRhX2hkbF9mYiA9IE5VTEw7IC8qIGhhbmRsZXIgZm9yIGZhbGxiYWNrIGNiICovCitzdGF0aWMgc3RydWN0IGRpc3BfaGRsICogdGFfaGRsX3RyID0gTlVMTDsgLyogaGFuZGxlciBmb3IgVGVzdC1SZXF1ZXN0IHJlcSBjYiAqLworCisvKiBEZWZhdWx0IGNhbGxiYWNrIGZvciB0aGUgYXBwbGljYXRpb24uICovCitzdGF0aWMgaW50IHRhX2ZiX2NiKCBzdHJ1Y3QgbXNnICoqIG1zZywgc3RydWN0IGF2cCAqIGF2cCwgc3RydWN0IHNlc3Npb24gKiBzZXNzLCB2b2lkICogb3BhcXVlLCBlbnVtIGRpc3BfYWN0aW9uICogYWN0KQoreworCS8qIFRoaXMgQ0Igc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCAqLworCVRSQUNFX0VOVFJZKCIlcCAlcCAlcCAlcCIsIG1zZywgYXZwLCBzZXNzLCBhY3QpOworCQorCWZkX2xvZ19kZWJ1ZygiVW5leHBlY3RlZCBtZXNzYWdlIHJlY2VpdmVkISIpOworCQorCXJldHVybiBFTk9UU1VQOworfQorCisvKiBDYWxsYmFjayBmb3IgaW5jb21pbmcgVGVzdC1SZXF1ZXN0IG1lc3NhZ2VzICovCitzdGF0aWMgaW50IHRhX3RyX2NiKCBzdHJ1Y3QgbXNnICoqIG1zZywgc3RydWN0IGF2cCAqIGF2cCwgc3RydWN0IHNlc3Npb24gKiBzZXNzLCB2b2lkICogb3BhcXVlLCBlbnVtIGRpc3BfYWN0aW9uICogYWN0KQoreworCXN0cnVjdCBtc2cgKmFucywgKnFyeTsKKwlzdHJ1Y3QgYXZwICogYTsKKwkKKwlUUkFDRV9FTlRSWSgiJXAgJXAgJXAgJXAiLCBtc2csIGF2cCwgc2VzcywgYWN0KTsKKwkKKwlpZiAobXNnID09IE5VTEwpCisJCXJldHVybiBFSU5WQUw7CisJCisJLyogVmFsdWUgb2YgT3JpZ2luLUhvc3QgKi8KKwlpZiAoISAodGFfY29uZi0+bW9kZSAmIE1PREVfQkVOQ0gpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiRUNITyBUZXN0LVJlcXVlc3QgcmVjZWl2ZWQgZnJvbSAiKTsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfc2VhcmNoX2F2cCAoICptc2csIHRhX29yaWdpbl9ob3N0LCAmYSkgKTsKKwkJaWYgKGEpIHsKKwkJCXN0cnVjdCBhdnBfaGRyICogaGRyOworCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2hkciggYSwgJmhkciApICk7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiclLipzJyIsIChpbnQpaGRyLT5hdnBfdmFsdWUtPm9zLmxlbiwgaGRyLT5hdnBfdmFsdWUtPm9zLmRhdGEpOworCQl9IGVsc2UgeworCQkJZnByaW50ZihzdGRlcnIsICJub19PcmlnaW4tSG9zdCIpOworCQl9CisJCWZwcmludGYoc3RkZXJyLCAiLCByZXBseWluZy4uLlxuIik7CisJfQorCQorCS8qIENyZWF0ZSBhbnN3ZXIgaGVhZGVyICovCisJcXJ5ID0gKm1zZzsKKwlDSEVDS19GQ1QoIGZkX21zZ19uZXdfYW5zd2VyX2Zyb21fcmVxICggZmRfZ19jb25maWctPmNuZl9kaWN0LCBtc2csIDAgKSApOworCWFucyA9ICptc2c7CisJCisJLyogU2V0IHRoZSBUZXN0LUFWUCBBVlAgKi8KKwl7CisJCXN0cnVjdCBhdnAgKiBzcmMgPSBOVUxMOworCQlzdHJ1Y3QgYXZwX2hkciAqIGhkciA9IE5VTEw7CisJCQorCQlDSEVDS19GQ1QoIGZkX21zZ19zZWFyY2hfYXZwICggcXJ5LCB0YV9hdnAsICZzcmMpICk7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9oZHIoIHNyYywgJmhkciApICApOworCQkKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIHRhX2F2cCwgMCwgJmF2cCApICk7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9zZXR2YWx1ZSggYXZwLCBoZHItPmF2cF92YWx1ZSApICk7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQoIGFucywgTVNHX0JSV19MQVNUX0NISUxELCBhdnAgKSApOworCX0KKwkKKwkvKiBTZXQgdGhlIFRlc3QtUGF5bG9hZC1BVlAgQVZQICovCisJaWYgKHRhX2NvbmYtPmxvbmdfYXZwX2lkKSB7CisJCXN0cnVjdCBhdnAgKiBzcmMgPSBOVUxMOworCQlzdHJ1Y3QgYXZwX2hkciAqIGhkciA9IE5VTEw7CisJCQorCQlDSEVDS19GQ1QoIGZkX21zZ19zZWFyY2hfYXZwICggcXJ5LCB0YV9hdnBfbG9uZywgJnNyYykgKTsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2hkciggc3JjLCAmaGRyICkgICk7CisJCQorCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3ICggdGFfYXZwX2xvbmcsIDAsICZhdnAgKSApOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUoIGF2cCwgaGRyLT5hdnBfdmFsdWUgKSApOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkKCBhbnMsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwICkgKTsKKwl9CisJCisJCisJLyogU2V0IHRoZSBPcmlnaW4tSG9zdCwgT3JpZ2luLVJlYWxtLCBSZXN1bHQtQ29kZSBBVlBzICovCisJQ0hFQ0tfRkNUKCBmZF9tc2dfcmVzY29kZV9zZXQoIGFucywgIkRJQU1FVEVSX1NVQ0NFU1MiLCBOVUxMLCBOVUxMLCAxICkgKTsKKwkKKwkvKiBTZW5kIHRoZSBhbnN3ZXIgKi8KKwlDSEVDS19GQ1QoIGZkX21zZ19zZW5kKCBtc2csIE5VTEwsIE5VTEwgKSApOworCQorCS8qIEFkZCB0aGlzIHZhbHVlIHRvIHRoZSBzdGF0cyAqLworCUNIRUNLX1BPU0lYX0RPKCBwdGhyZWFkX211dGV4X2xvY2soJnRhX2NvbmYtPnN0YXRzX2xvY2spLCApOworCXRhX2NvbmYtPnN0YXRzLm5iX2VjaG9lZCsrOworCUNIRUNLX1BPU0lYX0RPKCBwdGhyZWFkX211dGV4X3VubG9jaygmdGFfY29uZi0+c3RhdHNfbG9jayksICk7CisJCisJcmV0dXJuIDA7Cit9CisKK2ludCB0YV9zZXJ2X2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgZGlzcF93aGVuIGRhdGE7CisJCisJVFJBQ0VfREVCVUcoRlVMTCwgIkluaXRpYWxpemluZyBkaXNwYXRjaCBjYWxsYmFja3MgZm9yIHRlc3QiKTsKKwkKKwltZW1zZXQoJmRhdGEsIDAsIHNpemVvZihkYXRhKSk7CisJZGF0YS5hcHAgPSB0YV9hcHBsaTsKKwlkYXRhLmNvbW1hbmQgPSB0YV9jbWRfcjsKKwkKKwkvKiBmYWxsYmFjayBDQiBpZiBjb21tYW5kICE9IFRlc3QtUmVxdWVzdCByZWNlaXZlZCAqLworCUNIRUNLX0ZDVCggZmRfZGlzcF9yZWdpc3RlciggdGFfZmJfY2IsIERJU1BfSE9XX0FQUElELCAmZGF0YSwgTlVMTCwgJnRhX2hkbF9mYiApICk7CisJCisJLyogTm93IHNwZWNpZmljIGhhbmRsZXIgZm9yIFRlc3QtUmVxdWVzdCAqLworCUNIRUNLX0ZDVCggZmRfZGlzcF9yZWdpc3RlciggdGFfdHJfY2IsIERJU1BfSE9XX0NDLCAmZGF0YSwgTlVMTCwgJnRhX2hkbF90ciApICk7CisJCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgdGFfc2Vydl9maW5pKHZvaWQpCit7CisJaWYgKHRhX2hkbF9mYikgeworCQkodm9pZCkgZmRfZGlzcF91bnJlZ2lzdGVyKCZ0YV9oZGxfZmIsIE5VTEwpOworCX0KKwlpZiAodGFfaGRsX3RyKSB7CisJCSh2b2lkKSBmZF9kaXNwX3VucmVnaXN0ZXIoJnRhX2hkbF90ciwgTlVMTCk7CisJfQorCQorCXJldHVybjsKK30KZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvdGVzdF9hcHAvdGVzdF9hcHAuYyBiL2V4dGVuc2lvbnMvdGVzdF9hcHAvdGVzdF9hcHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODlmMjgxCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy90ZXN0X2FwcC90ZXN0X2FwcC5jCkBAIC0wLDAgKzEsMjIzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxMywgV0lERSBQcm9qZWN0IGFuZCBOSUNUCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBXSURFIFByb2plY3Qgb3IgTklDVCBub3IgdGhlIAkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFdJREUgUHJvamVjdCBhbmQgCQkJCQkJICoKKyogICBOSUNULgkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIAorICogVGVzdCBhcHBsaWNhdGlvbiBmb3IgZnJlZURpYW1ldGVyLgorICovCisKKyNpbmNsdWRlICJ0ZXN0X2FwcC5oIgorCisvKiBJbml0aWFsaXplIHRoZSBjb25maWd1cmF0aW9uICovCitzdHJ1Y3QgdGFfY29uZiAqIHRhX2NvbmYgPSBOVUxMOworc3RhdGljIHN0cnVjdCB0YV9jb25mIF9jb25mOworc3RhdGljIHB0aHJlYWRfdCB0YV9zdGF0c190aCA9IChwdGhyZWFkX3QpTlVMTDsKKworc3RhdGljIGludCB0YV9jb25mX2luaXQodm9pZCkKK3sKKwl0YV9jb25mID0gJl9jb25mOworCW1lbXNldCh0YV9jb25mLCAwLCBzaXplb2Yoc3RydWN0IHRhX2NvbmYpKTsKKwkKKwkvKiBTZXQgdGhlIGRlZmF1bHQgdmFsdWVzICovCisJdGFfY29uZi0+dmVuZG9yX2lkICA9IDk5OTk5OTsJCS8qIER1bW15IHZhbHVlICovCisJdGFfY29uZi0+YXBwbGlfaWQgICA9IDB4ZmZmZmZmOwkvKiBkdW1teSB2YWx1ZSAqLworCXRhX2NvbmYtPmNtZF9pZCAgICAgPSAweGZmZmZmZTsJLyogRXhwZXJpbWVudGFsICovCisJdGFfY29uZi0+YXZwX2lkICAgICA9IDB4ZmZmZmZmOwkvKiBkdW1teSB2YWx1ZSAqLworCXRhX2NvbmYtPmxvbmdfYXZwX2xlbiA9IDUwMDA7CisJdGFfY29uZi0+bW9kZSAgICAgICA9IE1PREVfU0VSViB8IE1PREVfQ0xJOworCXRhX2NvbmYtPmRlc3RfcmVhbG0gPSBzdHJkdXAoZmRfZ19jb25maWctPmNuZl9kaWFtcmxtKTsKKwl0YV9jb25mLT5kZXN0X2hvc3QgID0gTlVMTDsKKwl0YV9jb25mLT5zaWduYWwgICAgID0gVEVTVF9BUFBfREVGQVVMVF9TSUdOQUw7CisJdGFfY29uZi0+YmVuY2hfY29uY3VyICAgPSAxMDA7CisJdGFfY29uZi0+YmVuY2hfZHVyYXRpb24gPSAxMDsKKwkKKwkvKiBJbml0aWFsaXplIHRoZSBtdXRleCAqLworCUNIRUNLX1BPU0lYKCBwdGhyZWFkX211dGV4X2luaXQoJnRhX2NvbmYtPnN0YXRzX2xvY2ssIE5VTEwpICk7CisJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHRhX2NvbmZfZHVtcCh2b2lkKQoreworCWlmICghVFJBQ0VfQk9PTChJTkZPKSkKKwkJcmV0dXJuOworCWZkX2xvZ19kZWJ1ZyggIi0tLS0tLS0gYXBwX3Rlc3QgY29uZmlndXJhdGlvbiBkdW1wOiAtLS0tLS0tLS0iKTsKKwlmZF9sb2dfZGVidWcoICIgVmVuZG9yIElkIC4uLi4uLi4uLi4gOiAldSIsIHRhX2NvbmYtPnZlbmRvcl9pZCk7CisJZmRfbG9nX2RlYnVnKCAiIEFwcGxpY2F0aW9uIElkIC4uLi4uIDogJXUiLCB0YV9jb25mLT5hcHBsaV9pZCk7CisJZmRfbG9nX2RlYnVnKCAiIENvbW1hbmQgSWQgLi4uLi4uLi4uIDogJXUiLCB0YV9jb25mLT5jbWRfaWQpOworCWZkX2xvZ19kZWJ1ZyggIiBBVlAgSWQgLi4uLi4uLi4uLi4uLiA6ICV1IiwgdGFfY29uZi0+YXZwX2lkKTsKKwlmZF9sb2dfZGVidWcoICIgTG9uZyBBVlAgSWQgLi4uLi4uLi4gOiAldSIsIHRhX2NvbmYtPmxvbmdfYXZwX2lkKTsKKwlmZF9sb2dfZGVidWcoICIgTG9uZyBBVlAgbGVuIC4uLi4uLi4gOiAlenUiLCB0YV9jb25mLT5sb25nX2F2cF9sZW4pOworCWZkX2xvZ19kZWJ1ZyggIiBNb2RlIC4uLi4uLi4uLi4uLi4uLiA6ICVzJXMlcyIsIHRhX2NvbmYtPm1vZGUgJiBNT0RFX1NFUlYgPyAiU2VydiIgOiAiIiwgdGFfY29uZi0+bW9kZSAmIE1PREVfQ0xJID8gIkNsaSIgOiAiIiwgIHRhX2NvbmYtPm1vZGUgJiBNT0RFX0JFTkNIID8gIiAoQmVuY2htYXJrKSIgOiAiIik7CisJZmRfbG9nX2RlYnVnKCAiIERlc3RpbmF0aW9uIFJlYWxtIC4uIDogJXMiLCB0YV9jb25mLT5kZXN0X3JlYWxtID86ICItIG5vbmUgLSIpOworCWZkX2xvZ19kZWJ1ZyggIiBEZXN0aW5hdGlvbiBIb3N0IC4uLiA6ICVzIiwgdGFfY29uZi0+ZGVzdF9ob3N0ID86ICItIG5vbmUgLSIpOworCWZkX2xvZ19kZWJ1ZyggIiBTaWduYWwgLi4uLi4uLi4uLi4uLiA6ICVpIiwgdGFfY29uZi0+c2lnbmFsKTsKKwlmZF9sb2dfZGVidWcoICItLS0tLS0tIC9hcHBfdGVzdCBjb25maWd1cmF0aW9uIGR1bXAgLS0tLS0tLS0tIik7Cit9CisKKy8qIEZ1bmN0aW9uIHRvIGRpc3BsYXkgc3RhdGlzdGljcyBwZXJpb2RpY2FsbHkgKi8KK3N0YXRpYyB2b2lkICogdGFfc3RhdHModm9pZCAqIGFyZykgeworCisJc3RydWN0IHRpbWVzcGVjIHN0YXJ0LCBub3c7CisJc3RydWN0IHRhX3N0YXRzIGNvcHk7CisJCisJLyogR2V0IHRoZSBzdGFydCB0aW1lICovCisJQ0hFQ0tfU1lTX0RPKCBjbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmc3RhcnQpLCApOworCQorCS8qIE5vdywgbG9vcCB1bnRpbCBjYW5jZWxlZCAqLworCXdoaWxlICgxKSB7CisJCS8qIERpc3BsYXkgc3RhdGlzdGljcyBldmVyeSBYWCBzZWNvbmRzICovCisJCXNsZWVwKHRhX2NvbmYtPmJlbmNoX2R1cmF0aW9uICsgMyk7CisJCQorCQkvKiBOb3csIGdldCB0aGUgY3VycmVudCBzdGF0cyAqLworCQlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9tdXRleF9sb2NrKCZ0YV9jb25mLT5zdGF0c19sb2NrKSwgKTsKKwkJbWVtY3B5KCZjb3B5LCAmdGFfY29uZi0+c3RhdHMsIHNpemVvZihzdHJ1Y3QgdGFfc3RhdHMpKTsKKwkJQ0hFQ0tfUE9TSVhfRE8oIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ0YV9jb25mLT5zdGF0c19sb2NrKSwgKTsKKwkJCisJCS8qIEdldCB0aGUgY3VycmVudCBleGVjdXRpb24gdGltZSAqLworCQlDSEVDS19TWVNfRE8oIGNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZub3cpLCApOworCQkKKwkJLyogTm93LCBkaXNwbGF5IGV2ZXJ5dGhpbmcgKi8KKwkJZmRfbG9nX2RlYnVnKCAiLS0tLS0tLSBhcHBfdGVzdCBzdGF0aXN0aWNzIC0tLS0tLS0tLSIpOworCQlpZiAobm93LnR2X25zZWMgPj0gc3RhcnQudHZfbnNlYykgeworCQkJZmRfbG9nX2RlYnVnKCAiIEV4ZWN1dGluZyBmb3I6ICVkLiUwNmxkIHNlYyIsCisJCQkJCShpbnQpKG5vdy50dl9zZWMgLSBzdGFydC50dl9zZWMpLAorCQkJCQkobG9uZykobm93LnR2X25zZWMgLSBzdGFydC50dl9uc2VjKSAvIDEwMDApOworCQl9IGVsc2UgeworCQkJZmRfbG9nX2RlYnVnKCAiIEV4ZWN1dGluZyBmb3I6ICVkLiUwNmxkIHNlYyIsCisJCQkJCShpbnQpKG5vdy50dl9zZWMgLSAxIC0gc3RhcnQudHZfc2VjKSwKKwkJCQkJKGxvbmcpKG5vdy50dl9uc2VjICsgMTAwMDAwMDAwMCAtIHN0YXJ0LnR2X25zZWMpIC8gMTAwMCk7CisJCX0KKwkJCisJCWlmICh0YV9jb25mLT5tb2RlICYgTU9ERV9TRVJWKSB7CisJCQlmZF9sb2dfZGVidWcoICIgU2VydmVyOiAlbGx1IG1lc3NhZ2UocykgZWNob2VkIiwgY29weS5uYl9lY2hvZWQpOworCQl9CisJCWlmICh0YV9jb25mLT5tb2RlICYgTU9ERV9DTEkpIHsKKwkJCWZkX2xvZ19kZWJ1ZyggIiBDbGllbnQ6Iik7CisJCQlmZF9sb2dfZGVidWcoICIgICAlbGx1IG1lc3NhZ2Uocykgc2VudCIsIGNvcHkubmJfc2VudCk7CisJCQlmZF9sb2dfZGVidWcoICIgICAlbGx1IGVycm9yKHMpIHJlY2VpdmVkIiwgY29weS5uYl9lcnJzKTsKKwkJCWZkX2xvZ19kZWJ1ZyggIiAgICVsbHUgYW5zd2VyKHMpIHJlY2VpdmVkIiwgY29weS5uYl9yZWN2KTsKKwkJCWZkX2xvZ19kZWJ1ZyggIiAgICAgZmFzdGVzdDogJWxkLiUwNmxkIHNlYy4iLCBjb3B5LnNob3J0ZXN0IC8gMTAwMDAwMCwgY29weS5zaG9ydGVzdCAlIDEwMDAwMDApOworCQkJZmRfbG9nX2RlYnVnKCAiICAgICBzbG93ZXN0OiAlbGQuJTA2bGQgc2VjLiIsIGNvcHkubG9uZ2VzdCAvIDEwMDAwMDAsIGNvcHkubG9uZ2VzdCAlIDEwMDAwMDApOworCQkJZmRfbG9nX2RlYnVnKCAiICAgICBBdmVyYWdlOiAlbGQuJTA2bGQgc2VjLiIsIGNvcHkuYXZnIC8gMTAwMDAwMCwgY29weS5hdmcgJSAxMDAwMDAwKTsKKwkJfQorCQlmZF9sb2dfZGVidWcoICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CisJfQorCQorCXJldHVybiBOVUxMOyAvKiBuZXZlciBjYWxsZWQgKi8KK30KKworc3RhdGljIHN0cnVjdCBmZF9ob29rX2hkbCAqIGhvb2toZGxbMl0gPSB7IE5VTEwsIE5VTEwgfTsKK3N0YXRpYyB2b2lkIHRhX2hvb2tfY2Jfc2lsZW50KGVudW0gZmRfaG9va190eXBlIHR5cGUsIHN0cnVjdCBtc2cgKiBtc2csIHN0cnVjdCBwZWVyX2hkciAqIHBlZXIsIHZvaWQgKiBvdGhlciwgc3RydWN0IGZkX2hvb2tfcGVybXNnZGF0YSAqcG1kLCB2b2lkICogcmVnZGF0YSkgeworfQorc3RhdGljIHZvaWQgdGFfaG9va19jYl9vbmVsaW5lKGVudW0gZmRfaG9va190eXBlIHR5cGUsIHN0cnVjdCBtc2cgKiBtc2csIHN0cnVjdCBwZWVyX2hkciAqIHBlZXIsIHZvaWQgKiBvdGhlciwgc3RydWN0IGZkX2hvb2tfcGVybXNnZGF0YSAqcG1kLCB2b2lkICogcmVnZGF0YSkgeworCWNoYXIgKiBidWYgPSBOVUxMOworCXNpemVfdCBsZW47CisJCisJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9tc2dfZHVtcF9zdW1tYXJ5KCZidWYsICZsZW4sIE5VTEwsIG1zZywgTlVMTCwgMCwgMCksIAorCQl7IExPR19FKCJFcnJvciB3aGlsZSBkdW1waW5nIGEgbWVzc2FnZSIpOyByZXR1cm47IH0gKTsKKwkKKwlMT0dfTigieyVkfSAlczogJXMiLCB0eXBlLCAoY2hhciAqKW90aGVyID86IjxuaWw+IiwgYnVmID86IjxuaWw+Iik7CisKKwlmcmVlKGJ1Zik7Cit9CisKKworLyogZW50cnkgcG9pbnQgKi8KK3N0YXRpYyBpbnQgdGFfZW50cnkoY2hhciAqIGNvbmZmaWxlKQoreworCVRSQUNFX0VOVFJZKCIlcCIsIGNvbmZmaWxlKTsKKwkKKwkvKiBJbml0aWFsaXplIGNvbmZpZ3VyYXRpb24gKi8KKwlDSEVDS19GQ1QoIHRhX2NvbmZfaW5pdCgpICk7CisJCisJLyogUGFyc2UgY29uZmlndXJhdGlvbiBmaWxlICovCisJaWYgKGNvbmZmaWxlICE9IE5VTEwpIHsKKwkJQ0hFQ0tfRkNUKCB0YV9jb25mX2hhbmRsZShjb25mZmlsZSkgKTsKKwl9CisJCisJVFJBQ0VfREVCVUcoSU5GTywgIkV4dGVuc2lvbiBUZXN0X0FwcCBpbml0aWFsaXplZCB3aXRoIGNvbmZpZ3VyYXRpb246ICclcyciLCBjb25mZmlsZSk7CisJdGFfY29uZl9kdW1wKCk7CisJCisJLyogSW5zdGFsbCBvYmplY3RzIGRlZmluaXRpb25zIGZvciB0aGlzIHRlc3QgYXBwbGljYXRpb24gKi8KKwlDSEVDS19GQ1QoIHRhX2RpY3RfaW5pdCgpICk7CisJCisJLyogSW5zdGFsbCB0aGUgaGFuZGxlcnMgZm9yIGluY29taW5nIG1lc3NhZ2VzICovCisJaWYgKHRhX2NvbmYtPm1vZGUgJiBNT0RFX1NFUlYpIHsKKwkJQ0hFQ0tfRkNUKCB0YV9zZXJ2X2luaXQoKSApOworCX0KKwkKKwkvKiBTdGFydCB0aGUgc2lnbmFsIGhhbmRsZXIgdGhyZWFkICovCisJaWYgKHRhX2NvbmYtPm1vZGUgJiBNT0RFX0NMSSkgeworCQlpZiAodGFfY29uZi0+bW9kZSAmIE1PREVfQkVOQ0gpIHsKKwkJCUNIRUNLX0ZDVCggdGFfYmVuY2hfaW5pdCgpICk7CisJCX0gZWxzZSB7CisJCQlDSEVDS19GQ1QoIHRhX2NsaV9pbml0KCkgKTsKKwkJfQorCX0KKwkKKwkvKiBBZHZlcnRpc2UgdGhlIHN1cHBvcnQgZm9yIHRoZSB0ZXN0IGFwcGxpY2F0aW9uIGluIHRoZSBwZWVyICovCisJQ0hFQ0tfRkNUKCBmZF9kaXNwX2FwcF9zdXBwb3J0ICggdGFfYXBwbGksIHRhX3ZlbmRvciwgMSwgMCApICk7CisJCisJaWYgKHRhX2NvbmYtPm1vZGUgJiBNT0RFX0JFTkNIKSB7CisJCS8qIFJlZ2lzdGVyIGFuIGVtcHR5IGhvb2sgdG8gZGlzYWJsZSB0aGUgZGVmYXVsdCBoYW5kbGluZyAqLworCQlDSEVDS19GQ1QoIGZkX2hvb2tfcmVnaXN0ZXIoIEhPT0tfTUFTSyggSE9PS19EQVRBX1JFQ0VJVkVELCBIT09LX01FU1NBR0VfUkVDRUlWRUQsIEhPT0tfTUVTU0FHRV9MT0NBTCwgSE9PS19NRVNTQUdFX1NFTlQsIEhPT0tfTUVTU0FHRV9ST1VUSU5HX0ZPUldBUkQsIEhPT0tfTUVTU0FHRV9ST1VUSU5HX0xPQ0FMICksIAorCQkJCQl0YV9ob29rX2NiX3NpbGVudCwgTlVMTCwgTlVMTCwgJmhvb2toZGxbMF0pICk7CisJCUNIRUNLX0ZDVCggZmRfaG9va19yZWdpc3RlciggSE9PS19NQVNLKCBIT09LX01FU1NBR0VfUk9VVElOR19FUlJPUiwgSE9PS19NRVNTQUdFX0RST1BQRUQgKSwgCisJCQkJCXRhX2hvb2tfY2Jfb25lbGluZSwgTlVMTCwgTlVMTCwgJmhvb2toZGxbMV0pICk7CisJCQorCX0KKwkKKwkvKiBTdGFydCB0aGUgc3RhdGlzdGljcyB0aHJlYWQgKi8KKwlDSEVDS19QT1NJWCggcHRocmVhZF9jcmVhdGUoJnRhX3N0YXRzX3RoLCBOVUxMLCB0YV9zdGF0cywgTlVMTCkgKTsKKwkKKwlyZXR1cm4gMDsKK30KKworLyogVW5sb2FkICovCit2b2lkIGZkX2V4dF9maW5pKHZvaWQpCit7CisJaWYgKHRhX2NvbmYtPm1vZGUgJiBNT0RFX0NMSSkKKwkJdGFfY2xpX2ZpbmkoKTsKKwlpZiAodGFfY29uZi0+bW9kZSAmIE1PREVfU0VSVikKKwkJdGFfc2Vydl9maW5pKCk7CisJaWYgKGhvb2toZGxbMF0pCisJCWZkX2hvb2tfdW5yZWdpc3RlciggaG9va2hkbFswXSApOworCWlmIChob29raGRsWzFdKQorCQlmZF9ob29rX3VucmVnaXN0ZXIoIGhvb2toZGxbMV0gKTsKKwlDSEVDS19GQ1RfRE8oIGZkX3Rocl90ZXJtKCZ0YV9zdGF0c190aCksICk7CisJQ0hFQ0tfUE9TSVhfRE8oIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmdGFfY29uZi0+c3RhdHNfbG9jayksICk7Cit9CisKK0VYVEVOU0lPTl9FTlRSWSgidGVzdF9hcHAiLCB0YV9lbnRyeSk7CmRpZmYgLS1naXQgYS9leHRlbnNpb25zL3Rlc3RfYXBwL3Rlc3RfYXBwLmggYi9leHRlbnNpb25zL3Rlc3RfYXBwL3Rlc3RfYXBwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQwMWE0NQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvdGVzdF9hcHAvdGVzdF9hcHAuaApAQCAtMCwwICsxLDExNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTMsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBIZWFkZXIgZmlsZSBmb3IgdGhlIGFwcF90ZXN0IGV4dGVuc2lvbi4gCisgKgorICogIFRoaXMgZXh0ZW5zaW9uIHByb3ZpZGVzIGEgd2F5IHRvIHNlbmQgY29uZmlndXJhYmxlIG1lc3NhZ2VzIG9uIHRoZSBuZXR3b3JrCisgKgorICogIFNlZSB0aGUgYXBwX3Rlc3QuY29uZi5zYW1wbGUgZmlsZSBmb3IgdGhlIGZvcm1hdCBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgorICovCisgCisjaW5jbHVkZSA8ZnJlZURpYW1ldGVyL2V4dGVuc2lvbi5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorCisjaWZuZGVmIFRFU1RfQVBQX0RFRkFVTFRfU0lHTkFMCisjZGVmaW5lIFRFU1RfQVBQX0RFRkFVTFRfU0lHTkFMCVNJR1VTUjEKKyNlbmRpZiAvKiBURVNUX0FQUF9ERUZBVUxUX1NJR05BTCAqLworCisKKy8qIE1vZGUgZm9yIHRoZSBleHRlbnNpb24gKi8KKyNkZWZpbmUgTU9ERV9TRVJWCTB4MQorI2RlZmluZQlNT0RFX0NMSQkweDIKKyNkZWZpbmUJTU9ERV9CRU5DSAkweDQKKworLyogVGhlIG1vZHVsZSBjb25maWd1cmF0aW9uICovCitzdHJ1Y3QgdGFfY29uZiB7CisJdWludDMyX3QJdmVuZG9yX2lkOwkvKiBkZWZhdWx0IDk5OTk5OSAqLworCXVpbnQzMl90CWFwcGxpX2lkOwkvKiBkZWZhdWx0IDEyMzQ1NiAqLworCXVpbnQzMl90CWNtZF9pZDsJCS8qIGRlZmF1bHQgMjM0NTY3ICovCisJdWludDMyX3QJYXZwX2lkOwkJLyogZGVmYXVsdCAzNDU2NzggKi8KKwl1aW50MzJfdAlsb25nX2F2cF9pZDsJLyogZGVmYXVsdCAwICovCisJc2l6ZV90CQlsb25nX2F2cF9sZW47CS8qIGRlZmF1bHQgNTAwMCAqLworCWludAkJbW9kZTsJCS8qIGRlZmF1bHQgTU9ERV9TRVJWIHwgTU9ERV9DTEkgKi8KKwljaGFyIAkqCWRlc3RfcmVhbG07CS8qIGRlZmF1bHQgbG9jYWwgcmVhbG0gKi8KKwljaGFyIAkqCWRlc3RfaG9zdDsJLyogZGVmYXVsdCBOVUxMICovCisJY2hhciAJKgl1c2VyX25hbWU7CS8qIGRlZmF1bHQgTlVMTCAqLworCWludCAJCXNpZ25hbDsJCS8qIGRlZmF1bHQgVEVTVF9BUFBfREVGQVVMVF9TSUdOQUwgKi8KKwlpbnQJCWJlbmNoX2NvbmN1cjsJLyogZGVmYXVsdCAxMDAgKi8KKwlpbnQJCWJlbmNoX2R1cmF0aW9uOyAvKiBkZWZhdWx0IDEwICovCisJc3RydWN0IHRhX3N0YXRzIHsKKwkJdW5zaWduZWQgbG9uZyBsb25nCW5iX2VjaG9lZDsgLyogc2VydmVyICovCisJCXVuc2lnbmVkIGxvbmcgbG9uZwluYl9zZW50OyAgIC8qIGNsaWVudCAqLworCQl1bnNpZ25lZCBsb25nIGxvbmcJbmJfcmVjdjsgICAvKiBjbGllbnQgKi8KKwkJdW5zaWduZWQgbG9uZyBsb25nCW5iX2VycnM7ICAgLyogY2xpZW50ICovCisJCXVuc2lnbmVkIGxvbmcJCXNob3J0ZXN0OyAgLyogZmFzdGVzdCBhbnN3ZXIsIGluIG1pY3Jvc2Vjb25kcyAqLworCQl1bnNpZ25lZCBsb25nCQlsb25nZXN0OyAgIC8qIHNsb3dlc3QgYW5zd2VyLCBpbiBtaWNyb3NlY29uZHMgKi8KKwkJdW5zaWduZWQgbG9uZwkJYXZnOyAgICAgICAvKiBhdmVyYWdlIGFuc3dlciB0aW1lLCBpbiBtaWNyb3NlY29uZHMgKi8KKwl9IHN0YXRzOworCXB0aHJlYWRfbXV0ZXhfdAkJc3RhdHNfbG9jazsKK307CitleHRlcm4gc3RydWN0IHRhX2NvbmYgKiB0YV9jb25mOworCisvKiBQYXJzZSB0aGUgY29uZmlndXJhdGlvbiBmaWxlICovCitpbnQgdGFfY29uZl9oYW5kbGUoY2hhciAqIGNvbmZmaWxlKTsKKworLyogSGFuZGxlIGluY29taW5nIG1lc3NhZ2VzIChzZXJ2ZXIpICovCitpbnQgdGFfc2Vydl9pbml0KHZvaWQpOwordm9pZCB0YV9zZXJ2X2Zpbmkodm9pZCk7CisKKy8qIENyZWF0ZSBvdXRnb2luZyBtZXNzYWdlIChjbGllbnQpICovCitpbnQgdGFfY2xpX2luaXQodm9pZCk7Cit2b2lkIHRhX2NsaV9maW5pKHZvaWQpOworCisvKiBCZW5jaG1hcmsgZmxhdm91ciAqLworaW50IHRhX2JlbmNoX2luaXQodm9pZCk7Cit2b2lkIHRhX2JlbmNoX2Zpbmkodm9pZCk7CisKKy8qIEluaXRpYWxpemUgZGljdGlvbmFyeSBkZWZpbml0aW9ucyAqLworaW50IHRhX2RpY3RfaW5pdCh2b2lkKTsKKworCisvKiBTb21lIGdsb2JhbCB2YXJpYWJsZXMgZm9yIGRpY3Rpb25hcnkgKi8KK2V4dGVybiBzdHJ1Y3QgZGljdF9vYmplY3QgKiB0YV92ZW5kb3I7CitleHRlcm4gc3RydWN0IGRpY3Rfb2JqZWN0ICogdGFfYXBwbGk7CitleHRlcm4gc3RydWN0IGRpY3Rfb2JqZWN0ICogdGFfY21kX3I7CitleHRlcm4gc3RydWN0IGRpY3Rfb2JqZWN0ICogdGFfY21kX2E7CitleHRlcm4gc3RydWN0IGRpY3Rfb2JqZWN0ICogdGFfYXZwOworZXh0ZXJuIHN0cnVjdCBkaWN0X29iamVjdCAqIHRhX2F2cF9sb25nOworCitleHRlcm4gc3RydWN0IGRpY3Rfb2JqZWN0ICogdGFfc2Vzc19pZDsKK2V4dGVybiBzdHJ1Y3QgZGljdF9vYmplY3QgKiB0YV9vcmlnaW5faG9zdDsKK2V4dGVybiBzdHJ1Y3QgZGljdF9vYmplY3QgKiB0YV9vcmlnaW5fcmVhbG07CitleHRlcm4gc3RydWN0IGRpY3Rfb2JqZWN0ICogdGFfZGVzdF9ob3N0OworZXh0ZXJuIHN0cnVjdCBkaWN0X29iamVjdCAqIHRhX2Rlc3RfcmVhbG07CitleHRlcm4gc3RydWN0IGRpY3Rfb2JqZWN0ICogdGFfdXNlcl9uYW1lOworZXh0ZXJuIHN0cnVjdCBkaWN0X29iamVjdCAqIHRhX3Jlc19jb2RlOwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy90ZXN0X25ldGVtdWwvQ01ha2VMaXN0cy50eHQgYi9leHRlbnNpb25zL3Rlc3RfbmV0ZW11bC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDdlOTZhCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy90ZXN0X25ldGVtdWwvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw0MyBAQAorIyBUaGUgdGVzdF9uZXRlbXVsIGV4dGVuc2lvbgorUFJPSkVDVCgiU2ltcGxlIERpYW1ldGVyIG5ldHdvcmsgZW11bGF0b3IgcHJveHkgZXh0ZW5zaW9uIChsYXRlbmN5LCBQRFYsIGR1cGxpY2F0ZXMpIiBDKQorCisjIFBhcnNlciBmaWxlcworQklTT05fRklMRSh0ZXN0X25ldGVtdWwueSkKK0ZMRVhfRklMRSh0ZXN0X25ldGVtdWwubCkKK1NFVF9TT1VSQ0VfRklMRVNfUFJPUEVSVElFUyhsZXgudGVzdF9uZXRlbXVsLmMgdGVzdF9uZXRlbXVsLnRhYi5jIFBST1BFUlRJRVMgQ09NUElMRV9GTEFHUyAiLUkgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9IikKKworIyBMaXN0IG9mIHNvdXJjZSBmaWxlcworU0VUKCBUTkVNVUxfU1JDCisJdGVzdF9uZXRlbXVsLmMKKwl0ZXN0X25ldGVtdWwuaAorCWxleC50ZXN0X25ldGVtdWwuYworCXRlc3RfbmV0ZW11bC50YWIuYworCXRlc3RfbmV0ZW11bC50YWIuaAorCXRuZV9wcm9jZXNzLmMKKykKKworSU5DTFVERV9ESVJFQ1RPUklFUygke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0pCisKKyMgQ29tcGlsZSB0aGVzZSBmaWxlcyBhcyBhIGZyZWVEaWFtZXRlciBleHRlbnNpb24KK0ZEX0FERF9FWFRFTlNJT04odGVzdF9uZXRlbXVsICR7VE5FTVVMX1NSQ30pCisKKworIyBtYXRoIGZ1bmN0aW9ucworQ0hFQ0tfRlVOQ1RJT05fRVhJU1RTIChzcXJ0IEhBVkVfU1FSVCkKK0lGIChIQVZFX1NRUlQpCisgICBTRVQoTUFUSF9MSUJTICIiKQorRUxTRSAoSEFWRV9TUVJUKQorICAgQ0hFQ0tfTElCUkFSWV9FWElTVFMgKG0gc3FydCAiIiBIQVZFX0xJQk0pCisgICBJRiAoSEFWRV9MSUJNKQorICAgICBTRVQoTUFUSF9MSUJTICItbG0iKQorICAgRU5ESUYgKEhBVkVfTElCTSkKK0VORElGIChIQVZFX1NRUlQpCisKK1RBUkdFVF9MSU5LX0xJQlJBUklFUyh0ZXN0X25ldGVtdWwgJHtNQVRIX0xJQlN9KQorCisjIyMjCisjIyBJTlNUQUxMIHNlY3Rpb24gIyMKKworSU5TVEFMTChUQVJHRVRTIHRlc3RfbmV0ZW11bAorCUxJQlJBUlkgREVTVElOQVRJT04gJHtJTlNUQUxMX0VYVEVOU0lPTlNfU1VGRklYfQorCUNPTVBPTkVOVCBmcmVlRGlhbWV0ZXItZGVidWctdG9vbHMpCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL3Rlc3RfbmV0ZW11bC90ZXN0X25ldGVtdWwuYyBiL2V4dGVuc2lvbnMvdGVzdF9uZXRlbXVsL3Rlc3RfbmV0ZW11bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZmU2MTAKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL3Rlc3RfbmV0ZW11bC90ZXN0X25ldGVtdWwuYwpAQCAtMCwwICsxLDEwNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTEsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAKKyAqIFRoaXMgZXh0ZW5zaW9uIHByb3ZpZGVzIGEgc2ltcGxlIERpYW1ldGVyIG5ldHdvcmsgZW11bGF0b3IgbWVjaGFuaXNtLgorICogSXQgYWxsb3dzIHRoZSBpbnRyb2R1Y3Rpb24gb2YgZGVsYXlzIGFuZCBkdXBsaWNhdGVzIG9mIERpYW1ldGVyIG1lc3NhZ2VzLgorICogU2VlIHRlc3RfbmV0ZW11bC5jb25mLnNhbXBsZSBmaWxlIGZvciB0aGUgZm9ybWF0IG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCisgKi8KKworI2luY2x1ZGUgInRlc3RfbmV0ZW11bC5oIgorCisvKiBUaGUgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCB0bmVfY29uZiB0bmVfY29uZjsKKworCisKKy8qIFByb3h5aW5nIGNhbGxiYWNrICovCitzdGF0aWMgaW50IHRuZV9md2RfY2Iodm9pZCAqIGNiZGF0YSwgc3RydWN0IG1zZyAqKiBtc2cpCit7CisJc3RydWN0IG1zZyAqIG07CisJCisJVFJBQ0VfRU5UUlkoIiVwICVwIiwgY2JkYXRhLCBtc2cpOworCQorCW0gPSAqbXNnOworCSptc2cgPSBOVUxMOworCQorCVRSQUNFX0RFQlVHKEZVTEwsICJbdG5lXSBQcm9jZXNzaW5nIG1lc3NhZ2UgJXAiLCBtKTsKKwlDSEVDS19GQ1QoIHRuZV9wcm9jZXNzX21lc3NhZ2UobSkgKTsKKwkKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3RydWN0IGZkX3J0X2Z3ZF9oZGwgKiBmd2RfaGRsID0gTlVMTDsKKworLyogUmVnaXN0ZXIgdGhlIGNhbGxiYWNrcyB0byB0aGUgZGFlbW9uICovCitzdGF0aWMgaW50IHRuZV9tYWluKGNoYXIgKiBjb25mZmlsZSkKK3sKKwlUUkFDRV9FTlRSWSgiJXAiLCBjb25mZmlsZSk7CisJCisJLyogSW5pdGlhbGl6ZSB0aGUgY29uZmlndXJhdGlvbiAqLworCW1lbXNldCgmdG5lX2NvbmYsIDAsIHNpemVvZih0bmVfY29uZikpOworCXRuZV9jb25mLmxhdF9hdmcgPSA1MDA7CisJdG5lX2NvbmYubGF0X2RldiA9IDIwOworCXRuZV9jb25mLmR1cGxfcHJvYmEgPSAxRS0yOworCQorCS8qIFBhcnNlIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgKi8KKwlDSEVDS19GQ1QoIHRuZV9jb25mX2hhbmRsZShjb25mZmlsZSkgKTsKKwkKKwkvKiBJbml0aWFsaXplIHRoZSBwcm9jZXNzIG1vZHVsZSAqLworCUNIRUNLX0ZDVCggdG5lX3Byb2Nlc3NfaW5pdCgpICk7CisJCisJLyogTm93LCByZWdpc3RlciB0aGUgcHJveHlpbmcgY2FsbGJhY2sgKi8KKwlDSEVDS19GQ1QoIGZkX3J0X2Z3ZF9yZWdpc3RlciAoIHRuZV9md2RfY2IsIE5VTEwsIFJUX0ZXRF9SRVEsICZmd2RfaGRsICkgKTsKKworCXJldHVybiAwOworfQorCisvKiBDbGVhbnVwIHRoZSBjYWxsYmFja3MgKi8KK3ZvaWQgZmRfZXh0X2Zpbmkodm9pZCkKK3sKKwlUUkFDRV9FTlRSWSgpOworCQorCS8qIFVucmVnaXN0ZXIgdGhlIG1vZHVsZSAqLworCUNIRUNLX0ZDVF9ETyggZmRfcnRfZndkX3VucmVnaXN0ZXIgKCBmd2RfaGRsLCBOVUxMICksIC8qIGNvbnRpbnVlICovICk7CisJCisJLyogRGVzdHJveSB0aGUgcHJvY2VzcyB0aHJlYWQgKi8KKwlDSEVDS19GQ1RfRE8oIHRuZV9wcm9jZXNzX2ZpbmkgKCAgKSwgLyogY29udGludWUgKi8gKTsKKwkKKwlyZXR1cm4gOworfQorCisvKiBEZWZpbmUgdGhlIGVudHJ5IHBvaW50IGZ1bmN0aW9uICovCitFWFRFTlNJT05fRU5UUlkoInRlc3RfbmV0ZW11bCIsIHRuZV9tYWluKTsKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvdGVzdF9uZXRlbXVsL3Rlc3RfbmV0ZW11bC5oIGIvZXh0ZW5zaW9ucy90ZXN0X25ldGVtdWwvdGVzdF9uZXRlbXVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ5ZDQwYgotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvdGVzdF9uZXRlbXVsL3Rlc3RfbmV0ZW11bC5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDExLCBXSURFIFByb2plY3QgYW5kIE5JQ1QJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFdJREUgUHJvamVjdCBvciBOSUNUIG5vciB0aGUgCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgV0lERSBQcm9qZWN0IGFuZCAJCQkJCQkgKgorKiAgIE5JQ1QuCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqICBTZWUgdGhlIHRlc3RfbmV0ZW11bC5jb25mLnNhbXBsZSBmaWxlIGZvciB0aGUgZm9ybWF0IG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCisgKi8KKyAKKy8qIEZyZWVEaWFtZXRlcidzIGNvbW1vbiBpbmNsdWRlIGZpbGUgKi8KKyNpbmNsdWRlIDxmcmVlRGlhbWV0ZXIvZXh0ZW5zaW9uLmg+CisKKy8qIFBhcnNlIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgKi8KK2ludCB0bmVfY29uZl9oYW5kbGUoY2hhciAqIGNvbmZmaWxlKTsKKworLyogVGhlIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlICovCitleHRlcm4gc3RydWN0IHRuZV9jb25mIHsKKwl1bnNpZ25lZCBsb25nICBsYXRfYXZnOyAvKiBpbiBtaWxsaXNlY29uZHMgKi8KKwl1bnNpZ25lZCBpbnQgICBsYXRfZGV2OyAvKiBiZXR3ZWVuIDAgYW5kIDEwMCAqLworCWZsb2F0ICAgICAgICAgIGR1cGxfcHJvYmE7IAorfSB0bmVfY29uZjsKKworLyogQXBwbHkgdGhlIGNvbmZpZ3VyZWQgcHJvY2VzcyB0byB0aGUgbWVzc2FnZSwgdGhlbiBzZW5kIGl0LiAqLworaW50IHRuZV9wcm9jZXNzX21lc3NhZ2Uoc3RydWN0IG1zZyAqIG1zZyk7CitpbnQgdG5lX3Byb2Nlc3NfaW5pdCgpOworaW50IHRuZV9wcm9jZXNzX2ZpbmkoKTsKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvdGVzdF9uZXRlbXVsL3Rlc3RfbmV0ZW11bC5sIGIvZXh0ZW5zaW9ucy90ZXN0X25ldGVtdWwvdGVzdF9uZXRlbXVsLmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMwZTc4NQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvdGVzdF9uZXRlbXVsL3Rlc3RfbmV0ZW11bC5sCkBAIC0wLDAgKzEsMTE5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxMywgV0lERSBQcm9qZWN0IGFuZCBOSUNUCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBXSURFIFByb2plY3Qgb3IgTklDVCBub3IgdGhlIAkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFdJREUgUHJvamVjdCBhbmQgCQkJCQkJICoKKyogICBOSUNULgkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRva2VuaXplciAqLworCisleworI2luY2x1ZGUgInRlc3RfbmV0ZW11bC5oIgorLyogSW5jbHVkZSB5YWNjIHRva2VucyBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgInRlc3RfbmV0ZW11bC50YWIuaCIKKworLyogVXBkYXRlIHRoZSBjb2x1bW4gaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgWVlfVVNFUl9BQ1RJT04geyAJCQkJCQlcCisJeXlsbG9jLT5maXJzdF9jb2x1bW4gPSB5eWxsb2MtPmxhc3RfY29sdW1uICsgMTsgCQlcCisJeXlsbG9jLT5sYXN0X2NvbHVtbiA9IHl5bGxvYy0+Zmlyc3RfY29sdW1uICsgeXlsZW5nIC0gMTsJXAorfQorCisvKiBBdm9pZCB3YXJuaW5nIHdpdGggbmV3ZXIgZmxleCAqLworI2RlZmluZSBZWV9OT19JTlBVVAorCislfQorCislb3B0aW9uIGJpc29uLWJyaWRnZSBiaXNvbi1sb2NhdGlvbnMKKyVvcHRpb24gbm95eXdyYXAKKyVvcHRpb24gbm91bnB1dAorCislJQorCisJLyogVXBkYXRlIHRoZSBsaW5lIGNvdW50ICovCitcbgkJCXsKKwkJCQl5eWxsb2MtPmZpcnN0X2xpbmUrKzsgCisJCQkJeXlsbG9jLT5sYXN0X2xpbmUrKzsgCisJCQkJeXlsbG9jLT5sYXN0X2NvbHVtbj0wOyAKKwkJCX0KKwkgCisJLyogRWF0IGFsbCBzcGFjZXMgYnV0IG5vdCBuZXcgbGluZXMgKi8KKyhbWzpzcGFjZTpdXXstfVtcbl0pKwk7CisJLyogRWF0IGFsbCBjb21tZW50cyAqLworIy4qJAkJCTsKKworCisJLyogUmVjb2duaXplIGZsb2F0cyAqLworW1s6ZGlnaXQ6XV0rIi4iW1s6ZGlnaXQ6XV0qCXsKKwkJCQkvKiBDb252ZXJ0IHRoaXMgdG8gYW4gaW50ZWdlciB2YWx1ZSAqLworCQkJCWludCByZXQ9MDsKKwkJCQlyZXQgPSBzc2NhbmYoeXl0ZXh0LCAiJWYiLCAmeXlsdmFsLT5kZWNpbWFsKTsKKwkJCQlpZiAocmV0ICE9IDEpIHsKKwkJCQkJLyogTm8gbWF0Y2hpbmc6IGFuIGVycm9yIG9jY3VycmVkICovCisJCQkJCWZkX2xvZ19kZWJ1ZygiVW5hYmxlIHRvIGNvbnZlcnQgdGhlIHZhbHVlICclcycgdG8gYSB2YWxpZCBmbG9hdDogJXMiLCB5eXRleHQsIHN0cmVycm9yKGVycm5vKSk7CisJCQkJCXJldHVybiBMRVhfRVJST1I7IC8qIHRyaWcgYW4gZXJyb3IgaW4geWFjYyBwYXJzZXIgKi8KKwkJCQkJLyogTWF5YmUgd2UgY291bGQgUkVKRUNUIGluc3RlYWQgb2YgZmFpbGluZyBoZXJlPyAqLworCQkJCX0KKwkJCQlyZXR1cm4gRkxPQVQ7CisJCQl9CisJCQkKKwkvKiBSZWNvZ25pemUgc2ltcGxlIGludGVnZXJzICovCitbWzpkaWdpdDpdXSsJCXsKKwkJCQkvKiBDb252ZXJ0IHRoaXMgdG8gYW4gaW50ZWdlciB2YWx1ZSAqLworCQkJCWludCByZXQ9MDsKKwkJCQlyZXQgPSBzc2NhbmYoeXl0ZXh0LCAiJWx1IiwgJnl5bHZhbC0+dWxvbmcpOworCQkJCWlmIChyZXQgIT0gMSkgeworCQkJCQkvKiBObyBtYXRjaGluZzogYW4gZXJyb3Igb2NjdXJyZWQgKi8KKwkJCQkJZmRfbG9nX2RlYnVnKCJVbmFibGUgdG8gY29udmVydCB0aGUgdmFsdWUgJyVzJyB0byBhIHZhbGlkIGxvbmc6ICVzIiwgeXl0ZXh0LCBzdHJlcnJvcihlcnJubykpOworCQkJCQlyZXR1cm4gTEVYX0VSUk9SOyAvKiB0cmlnIGFuIGVycm9yIGluIHlhY2MgcGFyc2VyICovCisJCQkJCS8qIE1heWJlIHdlIGNvdWxkIFJFSkVDVCBpbnN0ZWFkIG9mIGZhaWxpbmcgaGVyZT8gKi8KKwkJCQl9CisJCQkJcmV0dXJuIFVMT05HOworCQkJfQorCQkJCisJCisJCisJLyogVGhlIGtleSB3b3JkcyAqLwkKKyg/aToibGF0ZW5jeV9hdmVyYWdlIikJIAl7CXJldHVybiBMQVRFTkNZX0FWRVJBR0U7CQl9CisoP2k6ImxhdGVuY3lfZGV2aWF0aW9uIikJewlyZXR1cm4gTEFURU5DWV9ERVZJQVRJT047CX0KKyg/aToiZHVwbF9wcm9iYSIpCSAJewlyZXR1cm4gRFVQTF9QUk9CQTsJCX0KKyg/aToibXMiKQkgCQl7CXJldHVybiBVTklUX01TRUM7CQl9CisoP2k6InMiKQkgCQl7CXJldHVybiBVTklUX1NFQzsJCX0KKwkJCQorCS8qIFZhbGlkIHNpbmdsZSBjaGFyYWN0ZXJzIGZvciB5eXBhcnNlICovCitbPTslL10JCQl7IHJldHVybiB5eXRleHRbMF07IH0KKworCS8qIFVucmVjb2duaXplZCBzZXF1ZW5jZSwgaWYgaXQgZGlkIG5vdCBtYXRjaCBhbnkgcHJldmlvdXMgcGF0dGVybiAqLworW15bOnNwYWNlOl1bOmRpZ2l0Ol09OyUvXG5dKwl7IAorCQkJCWZkX2xvZ19kZWJ1ZygiVW5yZWNvZ25pemVkIHRleHQgb24gbGluZSAlZCBjb2wgJWQ6ICclcycuIiwgeXlsbG9jLT5maXJzdF9saW5lLCB5eWxsb2MtPmZpcnN0X2NvbHVtbiwgeXl0ZXh0KTsKKwkJCSAJcmV0dXJuIExFWF9FUlJPUjsgCisJCQl9CisKKyUlCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL3Rlc3RfbmV0ZW11bC90ZXN0X25ldGVtdWwueSBiL2V4dGVuc2lvbnMvdGVzdF9uZXRlbXVsL3Rlc3RfbmV0ZW11bC55Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMmNmMmUKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL3Rlc3RfbmV0ZW11bC90ZXN0X25ldGVtdWwueQpAQCAtMCwwICsxLDE3MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTMsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBZYWNjIGV4dGVuc2lvbidzIGNvbmZpZ3VyYXRpb24gcGFyc2VyLgorICovCisKKy8qIEZvciBkZXZlbG9wbWVudCBvbmx5IDogKi8KKyVkZWJ1ZyAKKyVlcnJvci12ZXJib3NlCisKKy8qIFRoZSBwYXJzZXIgcmVjZWl2ZXMgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBmaWxlbmFtZSBhcyBwYXJhbWV0ZXIgKi8KKyVwYXJzZS1wYXJhbSB7Y2hhciAqIGNvbmZmaWxlfQorCisvKiBLZWVwIHRyYWNrIG9mIGxvY2F0aW9uICovCislbG9jYXRpb25zIAorJXB1cmUtcGFyc2VyCisKKyV7CisjaW5jbHVkZSAidGVzdF9uZXRlbXVsLmgiCisjaW5jbHVkZSAidGVzdF9uZXRlbXVsLnRhYi5oIgkvKiBZWUxUWVBFICovCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb24gKi8KK2ludCB5eXBhcnNlKGNoYXIgKiBjb25mZmlsZSk7CisKKy8qIFBhcnNlIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgKi8KK2ludCB0bmVfY29uZl9oYW5kbGUoY2hhciAqIGNvbmZmaWxlKQoreworCWV4dGVybiBGSUxFICogdGVzdF9uZXRlbXVsaW47CisJaW50IHJldDsKKwkKKwlUUkFDRV9FTlRSWSgiJXAiLCBjb25mZmlsZSk7CisJCisJVFJBQ0VfREVCVUcgKEZVTEwsICJQYXJzaW5nIGNvbmZpZ3VyYXRpb24gZmlsZTogJXMuLi4iLCBjb25mZmlsZSk7CisJCisJdGVzdF9uZXRlbXVsaW4gPSBmb3Blbihjb25mZmlsZSwgInIiKTsKKwlpZiAodGVzdF9uZXRlbXVsaW4gPT0gTlVMTCkgeworCQlyZXQgPSBlcnJubzsKKwkJZmRfbG9nX2RlYnVnKCJVbmFibGUgdG8gb3BlbiBleHRlbnNpb24gY29uZmlndXJhdGlvbiBmaWxlICVzIGZvciByZWFkaW5nOiAlcyIsIGNvbmZmaWxlLCBzdHJlcnJvcihyZXQpKTsKKwkJVFJBQ0VfREVCVUcgKElORk8sICJFcnJvciBvY2N1cnJlZCwgbWVzc2FnZSBsb2dnZWQgLS0gY29uZmlndXJhdGlvbiBmaWxlLiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHl5cGFyc2UoY29uZmZpbGUpOworCisJZmNsb3NlKHRlc3RfbmV0ZW11bGluKTsKKworCWlmIChyZXQgIT0gMCkgeworCQlUUkFDRV9ERUJVRyAoSU5GTywgIlVuYWJsZSB0byBwYXJzZSB0aGUgY29uZmlndXJhdGlvbiBmaWxlLiIpOworCQlyZXR1cm4gRUlOVkFMOworCX0gZWxzZSB7CisJCVRSQUNFX0RFQlVHKEZVTEwsICJbdGVzdF9uZXRlbXVsXSAgbGF0ZW5jeTogJWx1IG1zICh2YXI6JXUlJSkgIGR1cGxpY2F0ZXM6ICVHIHByb2JhYmlsaXR5LiIsIHRuZV9jb25mLmxhdF9hdmcsIHRuZV9jb25mLmxhdF9kZXYsIHRuZV9jb25mLmR1cGxfcHJvYmEpOworCX0KKwkKKwlyZXR1cm4gMDsKK30KKworLyogVGhlIExleCBwYXJzZXIgcHJvdG90eXBlICovCitpbnQgdGVzdF9uZXRlbXVsbGV4KFlZU1RZUEUgKmx2YWxwLCBZWUxUWVBFICpsbG9jcCk7CisKKy8qIEZ1bmN0aW9uIHRvIHJlcG9ydCB0aGUgZXJyb3JzICovCit2b2lkIHl5ZXJyb3IgKFlZTFRZUEUgKnBsb2MsIGNoYXIgKiBjb25mZmlsZSwgY2hhciBjb25zdCAqcykKK3sKKwlUUkFDRV9ERUJVRyhJTkZPLCAiRXJyb3IgaW4gY29uZmlndXJhdGlvbiBwYXJzaW5nIik7CisJCisJaWYgKHBsb2MtPmZpcnN0X2xpbmUgIT0gcGxvYy0+bGFzdF9saW5lKQorCQlmZF9sb2dfZGVidWcoIiVzOiVkLiVkLSVkLiVkIDogJXMiLCBjb25mZmlsZSwgcGxvYy0+Zmlyc3RfbGluZSwgcGxvYy0+Zmlyc3RfY29sdW1uLCBwbG9jLT5sYXN0X2xpbmUsIHBsb2MtPmxhc3RfY29sdW1uLCBzKTsKKwllbHNlIGlmIChwbG9jLT5maXJzdF9jb2x1bW4gIT0gcGxvYy0+bGFzdF9jb2x1bW4pCisJCWZkX2xvZ19kZWJ1ZygiJXM6JWQuJWQtJWQgOiAlcyIsIGNvbmZmaWxlLCBwbG9jLT5maXJzdF9saW5lLCBwbG9jLT5maXJzdF9jb2x1bW4sIHBsb2MtPmxhc3RfY29sdW1uLCBzKTsKKwllbHNlCisJCWZkX2xvZ19kZWJ1ZygiJXM6JWQuJWQgOiAlcyIsIGNvbmZmaWxlLCBwbG9jLT5maXJzdF9saW5lLCBwbG9jLT5maXJzdF9jb2x1bW4sIHMpOworfQorCislfQorCisvKiBWYWx1ZXMgcmV0dXJuZWQgYnkgbGV4IGZvciB0b2tlbiAqLworJXVuaW9uIHsKKwl1bnNpZ25lZCBsb25nCXVsb25nOworCWZsb2F0CWRlY2ltYWw7Cit9CisKKy8qIEluIGNhc2Ugb2YgZXJyb3IgaW4gdGhlIGxleGljYWwgYW5hbHlzaXMgKi8KKyV0b2tlbiAJCUxFWF9FUlJPUgorCisldG9rZW4gPHVsb25nPiAgIFVMT05HCisldG9rZW4gPGRlY2ltYWw+IEZMT0FUCisKKy8qIFRva2VucyAqLworJXRva2VuIAkJTEFURU5DWV9BVkVSQUdFCisldG9rZW4gCQlMQVRFTkNZX0RFVklBVElPTgorJXRva2VuIAkJRFVQTF9QUk9CQQorJXRva2VuIAkJVU5JVF9TRUMKKyV0b2tlbiAJCVVOSVRfTVNFQworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCislJQorCisJLyogVGhlIGdyYW1tYXIgZGVmaW5pdGlvbiAqLworY29uZmZpbGU6CQkvKiBlbXB0eSAqLworCQkJfCBjb25mZmlsZSBsYXRlbmN5X2F2ZXJhZ2UKKwkJCXwgY29uZmZpbGUgbGF0ZW5jeV9kZXZpYXRpb24KKwkJCXwgY29uZmZpbGUgZHVwbF9wcm9iYQorCQkJOworCQkJCisJLyogYSBzZXJ2ZXIgZW50cnkgKi8KK2xhdGVuY3lfYXZlcmFnZToJTEFURU5DWV9BVkVSQUdFICc9JyBVTE9ORyBVTklUX1NFQyAnOycKKwkJCXsKKwkJCQl0bmVfY29uZi5sYXRfYXZnID0gJDMgKiAxMDAwOworCQkJfQorCQkJfAorCQkJTEFURU5DWV9BVkVSQUdFICc9JyBVTE9ORyBVTklUX01TRUMgJzsnCisJCQl7CisJCQkJdG5lX2NvbmYubGF0X2F2ZyA9ICQzOworCQkJfQorCQkJOworCitsYXRlbmN5X2RldmlhdGlvbjoJTEFURU5DWV9ERVZJQVRJT04gJz0nIFVMT05HICclJyAnOycKKwkJCXsKKwkJCQl0bmVfY29uZi5sYXRfZGV2ID0gKGludCkkMzsKKwkJCQlpZiAoKHRuZV9jb25mLmxhdF9kZXYgPCAwKSB8fCAodG5lX2NvbmYubGF0X2RldiA+IDEwMCkpIHsKKwkJCQkJeXllcnJvciAoJnl5bGxvYywgY29uZmZpbGUsICJMYXRlbmN5X0RldmlhdGlvbiBtdXN0IGJlIGNvbXByaXNlZCBiZXR3ZWVuIDAgYW5kIDEwMC4iKTsKKwkJCQkJWVlFUlJPUjsKKwkJCQl9CisJCQl9CisJCQk7CisKK2R1cGxfcHJvYmE6CQlEVVBMX1BST0JBICc9JyBVTE9ORyAnOycKKwkJCXsKKwkJCQl0bmVfY29uZi5kdXBsX3Byb2JhID0gKGZsb2F0KSAkMzsKKwkJCX0KKwkJCXwgRFVQTF9QUk9CQSAnPScgRkxPQVQgJzsnCisJCQl7CisJCQkJdG5lX2NvbmYuZHVwbF9wcm9iYSA9ICQzOworCQkJfQorCQkJfCBEVVBMX1BST0JBICc9JyBVTE9ORyAnLycgVUxPTkcgJzsnCisJCQl7CisJCQkJdG5lX2NvbmYuZHVwbF9wcm9iYSA9ICgoZmxvYXQpJDMpIC8gKChmbG9hdCkkNSkgOworCQkJfQorCQkJOwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy90ZXN0X25ldGVtdWwvdG5lX3Byb2Nlc3MuYyBiL2V4dGVuc2lvbnMvdGVzdF9uZXRlbXVsL3RuZV9wcm9jZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJmZjY0YwotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvdGVzdF9uZXRlbXVsL3RuZV9wcm9jZXNzLmMKQEAgLTAsMCArMSwzMzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDEzLCBXSURFIFByb2plY3QgYW5kIE5JQ1QJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFdJREUgUHJvamVjdCBvciBOSUNUIG5vciB0aGUgCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgV0lERSBQcm9qZWN0IGFuZCAJCQkJCQkgKgorKiAgIE5JQ1QuCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInRlc3RfbmV0ZW11bC5oIgorI2luY2x1ZGUgPG1hdGguaD4KKworLyogVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIHJlYWwgcHJvY2Vzc2luZyBvZiB0aGUgbWVzc2FnZS4KKyBUaGUgZW50cnkgcG9pbnQgaXMgdG5lX3Byb2Nlc3NfbWVzc2FnZSgpLgorIAorIEZpcnN0LCB0aGUgZHVwbGljYXRlIGZpbHRlciBpcyBhcHBsaWVkOiB3aXRoIHRoZSBjb25maWd1cmVkCisgcHJvYmFiaWxpdHksIGEgY29weSBvZiB0aGUgbWVzc2FnZSBpcyBjcmVhdGVkLiBUaGVuLCB3aXRoIAorIHRoZSB0ZW50aCBwcm9iYWJpbGl0eSwgYSBzZWNvbmQgY29weSBpcyBjcmVhdGVkLCBhbmQgc28gb24sCisgdW50aWwgdGhlIHJhbmRvbSB2YWx1ZSB0ZWxscyBub3QgdG8gY3JlYXRlIGEgY29weS4KKyAKKyBUaGUgb3JpZ2luYWwgbWVzc2FnZSArIGFsbCBjb3BpZXMgYXJlIHN0b3JlZCBpbiBhIGxpc3QsIGZvciBuZXh0IHN0ZXAuCisgCisgU2Vjb25kIHN0ZXAgaXMgdGhlIGxhdGVuY3kgZmlsdGVyLiBGb3IgZWFjaCBtZXNzYWdlIGluIHRoZSBsaXN0LCBhCisgbGF0ZW5jeSB2YWx1ZSBpcyByYW5kb21seSBnZW5lcmF0ZWQgKHdpdGggYSBsb2dub3JtYWwgc2hhcGUgb2YgdGhlIAorIHJhbmRvbSBkaXN0cmlidXRpb24pIGFuZCBzdG9yZWQgaW4gdGhlIGxpc3QuCisgCisgRmluYWxseSwgd2hlbiB0aGUgbGF0ZW5jeSB0aW1lIGlzIG92ZXIsIHRoZSBtZXNzYWdlIGlzIHNlbnQuCisgKi8KKworc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBtdHggPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOworc3RhdGljIHB0aHJlYWRfY29uZF90ICBjbmQgPSBQVEhSRUFEX0NPTkRfSU5JVElBTElaRVI7CitzdGF0aWMgcHRocmVhZF90ICAgICAgIHRociA9IChwdGhyZWFkX3QpTlVMTDsKKworLyogVGhlIGxpc3RzIGJlbG93IGFyZSBhbGwgcHJvdGVjdGVkIGJ5IHRoZSBzYW1lIG11dGV4IG10eCAqLworc3RhdGljIHN0cnVjdCBmZF9saXN0IGlucHV0ID0gRkRfTElTVF9JTklUSUFMSVpFUihpbnB1dCk7IC8qIG1lc3NhZ2VzIHJlY2VpdmVkIGZyb20gbmV0d29yayAqLworc3RhdGljIHN0cnVjdCBmZF9saXN0IGZvcmxhdCA9IEZEX0xJU1RfSU5JVElBTElaRVIoZm9ybGF0KTsgLyogbWVzc2FnZXMgYWZ0ZXIgZHVwbGljYXRlIGZpbHRlciAqLworc3RhdGljIHN0cnVjdCBmZF9saXN0IHdhaXRsaXN0ID0gRkRfTElTVF9JTklUSUFMSVpFUih3YWl0bGlzdCk7IC8qIG1lc3NhZ2VzIHdhaXRpbmcgZm9yIHNlbmRpbmcgKi8KKworc3RydWN0IHByb2Nlc3NfaXRlbSB7CisJc3RydWN0IGZkX2xpc3QgY2hhaW47IC8qIGxpbmsgaW50byBvbmUgb2YgdGhlIGxpc3RzLiAibyIgcG9pbnRzIHRvIHRoZSBtZXNzYWdlLiAqLworCXN0cnVjdCB0aW1lc3BlYyB0czsgLyogd2hlbiB0aGUgbWVzc2FnZSBtdXN0IGJlIHNlbnQgKi8KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBoZWxwZXIgZnVuY3Rpb25zICovCisKKy8qIFByb2Nlc3MgYWxsIHBpIGluIGlucHV0IGxpc3QgYW5kIHF1ZXVlIGluIGZvcmxhdCwgZHVwbGljYXRpbmcgd2hlbiBuZWVkZWQgKi8KK3N0YXRpYyBpbnQgZG9fZHVwbGljYXRlcygpCit7CisJVFJBQ0VfRU5UUlkoIiIpOworCQorCXdoaWxlICghRkRfSVNfTElTVF9FTVBUWSgmaW5wdXQpKSB7CisJCXN0cnVjdCBtc2cgKiBtOworCQlzdHJ1Y3QgcHJvY2Vzc19pdGVtICogcGkgPSAoc3RydWN0IHByb2Nlc3NfaXRlbSAqKShpbnB1dC5uZXh0KTsKKwkJCisJCS8qIFRha2Ugb3V0IHRoaXMgcGkgZnJvbSBpbnB1dCAqLworCQlmZF9saXN0X3VubGluaygmcGktPmNoYWluKTsKKwkJCisJCS8qIHN0b3JlIGl0IGluIGZvcmxhdCAqLworCQlmZF9saXN0X2luc2VydF9iZWZvcmUoJmZvcmxhdCwgJnBpLT5jaGFpbik7CisJCQorCQkvKiBEdXBsaWNhdGUgZXZlbnR1YWxseSwgdW5sZXNzIGRlYWN0aXZhdGVkICovCisJCWlmICh0bmVfY29uZi5kdXBsX3Byb2JhICE9IDAuMCkgeworCQkJRGlhbUlkX3Qgc3JjOworCQkJc2l6ZV90IHNyY2xlbjsKKwkJCS8qIFBpY2sgYSByYW5kb20gdmFsdWUgaW4gWzAsIDFdICovCisJCQlkb3VibGUgbXlfcmFuZCA9IGRyYW5kNDgoKTsKKwkJCW0gPSBwaS0+Y2hhaW4ubzsKKwkJCUNIRUNLX0ZDVCggZmRfbXNnX3NvdXJjZV9nZXQobSwgJnNyYywgJnNyY2xlbikgKTsKKwkJCQorCQkJd2hpbGUgKG15X3JhbmQgPCAoZG91YmxlKSB0bmVfY29uZi5kdXBsX3Byb2JhKSB7CisJCQkJLyogY3JlYXRlIHRoZSBkdXBsaWNhdGUgKi8KKwkJCQlzdHJ1Y3QgcHJvY2Vzc19pdGVtICogbnBpOworCQkJCXN0cnVjdCBtc2cgKiBubTsKKwkJCQlzdHJ1Y3QgbXNnX2hkciAqIG5oOworCQkJCXVuc2lnbmVkIGNoYXIgKiBidWY7CisJCQkJc2l6ZV90IGxlbjsKKwkJCQkKKwkJCQkvKiBEdXBsaWNhdGUgdGhlIG1lc3NhZ2UgKi8KKwkJCQlDSEVDS19GQ1QoIGZkX21zZ19idWZmZXJpemUobSwgJmJ1ZiwgJmxlbikgKTsKKwkJCQlDSEVDS19GQ1QoIGZkX21zZ19wYXJzZV9idWZmZXIoJmJ1ZiwgbGVuLCAmbm0pICk7CisJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfc291cmNlX3NldChubSwgc3JjLCBzcmNsZW4pICk7CisJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfaGRyKG5tLCAmbmgpICk7CisJCQkJbmgtPm1zZ19mbGFncyB8PSBDTURfRkxBR19SRVRSQU5TTUlUOyAvKiBBZGQgdGhlICdUJyBmbGFnICovCisJCQkJVFJBQ0VfREVCVUcoRlVMTCwgIlt0bmVdIER1cGxpY2F0ZWQgbWVzc2FnZSAlcCBhcyAlcCIsIG0sIG5tKTsKKwkJCQkKKwkJCQkvKiBEdXBsaWNhdGUgdGhlIHBpICovCisJCQkJQ0hFQ0tfTUFMTE9DKCBucGkgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBwcm9jZXNzX2l0ZW0pKSApOworCQkJCW1lbXNldChucGksIDAsIHNpemVvZihzdHJ1Y3QgcHJvY2Vzc19pdGVtKSk7CisJCQkJZmRfbGlzdF9pbml0KCZucGktPmNoYWluLCBubSk7CisJCQkJbWVtY3B5KCZucGktPnRzLCAmcGktPnRzLCBzaXplb2Yoc3RydWN0IHRpbWVzcGVjKSk7CisJCQkJCisJCQkJLyogRW5xdWV1ZSB0aGUgY2FuZGlkYXRlIGluIGZvcmxhdCAqLworCQkJCWZkX2xpc3RfaW5zZXJ0X2JlZm9yZSgmZm9ybGF0LCAmbnBpLT5jaGFpbik7CisJCQkJCisJCQkJLyogbG9vcCBmb3IgYW5vdGhlciBkdXBsaWNhdGUgKi8KKwkJCQlpZiAoIW15X3JhbmQpCisJCQkJCWJyZWFrOyAvKiBvdGhlcndpc2UsIGluZmluaXRlIGxvb3AgKi8KKwkJCQlteV9yYW5kICo9IDEwLjA7CisJCQl9CisJCX0KKwl9CisJCisJLyogRG9uZSAqLworCXJldHVybiAwOworfQorCisvKiBHZW5lcmF0ZSBhIHJhbmRvbSB2YWx1ZSB3aXRoIGEgbm9ybWFsIGRpc3RyaWJ1dGlvbiwgbWVhbiAwLCB2YXJpYW5jZSAxICovCisvKiBVc2luZyBCb3gtTXVsbGVyIGFsZ28gZnJvbSBOdW1lcmljYWwgUmVjaXBlcyBpbiBDKyssIDJuZCBFZC4gKi8KK3N0YXRpYyBkb3VibGUgZ2V0X3JhbmRfbm9ybSgpCit7CisJZG91YmxlIHJ1MSwgcnUyOyAvKiB0d28gcmFuZG9tIHVuaWZvcm0gdmFsdWVzIGluIC0xLi4xICovCisJZG91YmxlIHJzcTsgICAgICAvKiBydTFeMiArIHJ1Ml4yLCB0byBlbnN1cmUgd2UgYXJlIGluIHRoZSBjaXJjbGUgKi8KKwkKKwkvKiBHZXQgb3VyIGFwcHJvcHJpYXRlIDIgcmFuZG9tIHVuaWZvcm0gdmFsdWVzICovCisJZG8geworCQlydTEgPSAyLjAgKiBkcmFuZDQ4KCkgLSAxLjA7CisJCXJ1MiA9IDIuMCAqIGRyYW5kNDgoKSAtIDEuMDsKKwkJcnNxID0gcnUxICogcnUxICsgcnUyICogcnUyOworCX0gd2hpbGUgKChyc3EgPj0gMS4wKSB8fCAocnNxID09IDAuMCkpOworCQorCS8qIERvIHRoZSBCb3gtTXVsbGVyIHRyYW5zZm9ybSAtLSB3ZSBkb24ndCB1c2UgdGhlIDJuZCB2YWx1ZSBnZW5lcmF0ZWQgKi8KKwlyZXR1cm4gcnUxICogc3FydCggLTIuMCAqIGxvZyhyc3EpIC8gcnNxICk7Cit9CisKKy8qIFJldHVybiB0aGUgbGF0ZW5jeSB0byBhZGQsIGluIG1zLiAqLworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgbG9uZyBnZXRfbGF0ZW5jeSgpCit7CisJdW5zaWduZWQgbG9uZyBsYXQgPSB0bmVfY29uZi5sYXRfYXZnOworCisJaWYgKHRuZV9jb25mLmxhdF9kZXYpIHsKKwkJLyogV2UgcmFuZG9taXplIHRoZSB2YWx1ZSB0byBhZGQgKi8KKwkJZG91YmxlIHJuOworCisJCXJuID0gZ2V0X3JhbmRfbm9ybSgpOyAvKiB0aGlzIGlzIG5vcm1hbCByYW5kb20gdmFsdWUgd2l0aCBtZWFuID0gMCBhbmQgdmFyaWFuY2UgPSAxICovCisJCXJuID0gcm4gKiAoKGRvdWJsZSl0bmVfY29uZi5sYXRfZGV2KSAvIDEwMC4wOyAvKiBub3cgdGhlIHZhcmlhbmNlIGlzIGxhdF9kZXYgKi8KKwkJcm4gPSBleHAocm4pOyAvKiBhbmQgbm93LCB3ZSBoYXZlIGEgbG9nbm9ybWFsIHJhbmRvbSB2YWx1ZSwgd2l0aCBnZW9tZXRyaWMgbWVhbiA9IDEgKi8KKworCQlsYXQgPSAodW5zaWduZWQgbG9uZykocm4gKiAoZG91YmxlKWxhdCk7IC8qIEFwcGx5IHRvIG91ciBtZWFuIGxhdGVuY3kgKi8KKwl9CisJCisJcmV0dXJuIGxhdDsKK30KKwkJCQorLyogUHJvY2VzcyBhbGwgcGkgaW4gZm9ybGF0IGFuZCBhZGQgYSByYW5kb20gbGF0ZW5jeSwgdGhlbiByZXF1ZXVlIGluIG9yZGVyIGludG8gd2FpdGxpc3QgKi8KK3N0YXRpYyBpbnQgZG9fbGF0ZW5jeSgpCit7CisJVFJBQ0VfRU5UUlkoIiIpOworCQorCXdoaWxlICghRkRfSVNfTElTVF9FTVBUWSgmZm9ybGF0KSkgeworCQlzdHJ1Y3QgcHJvY2Vzc19pdGVtICogcGkgPSAoc3RydWN0IHByb2Nlc3NfaXRlbSAqKShmb3JsYXQubmV4dCk7CisJCXN0cnVjdCBmZF9saXN0ICogbGk7CisJCQorCQkvKiBUYWtlIG91dCB0aGlzIHBpIGZyb20gZm9ybGF0ICovCisJCWZkX2xpc3RfdW5saW5rKCZwaS0+Y2hhaW4pOworCQkKKwkJLyogSWYgdGhlcmUgaXMgYSBsYXRlbmN5IHRvIGFkZCAqLworCQlpZiAodG5lX2NvbmYubGF0X2F2ZykgeworCQkJdW5zaWduZWQgbG9uZyBsID0gZ2V0X2xhdGVuY3koKTsKKwkJCVRSQUNFX0RFQlVHKEZVTEwsICJbdG5lXSBTZXQgJWx1IG1zIGxhdGVuY3kgZm9yICVwIiwgbCwgcGktPmNoYWluLm8pOworCQkJcGktPnRzLnR2X3NlYyArPSBsIC8gMTAwMDsKKwkJCWwgJT0gMTAwMDsKKwkJCXBpLT50cy50dl9uc2VjICs9IGwgKiAxMDAwMDAwOworCQkJaWYgKHBpLT50cy50dl9uc2VjID49IDEwMDAwMDAwMDApIHsKKwkJCQlwaS0+dHMudHZfc2VjICs9IDE7CisJCQkJcGktPnRzLnR2X25zZWMgLT0gMTAwMDAwMDAwMDsKKwkJCX0KKwkJfQorCisJCWZvciAobGkgPSB3YWl0bGlzdC5wcmV2OyBsaSAhPSAmd2FpdGxpc3Q7IGxpPWxpLT5wcmV2KSB7CisJCQlzdHJ1Y3QgcHJvY2Vzc19pdGVtICogcCA9IChzdHJ1Y3QgcHJvY2Vzc19pdGVtICopbGk7CisJCQlpZiAoVFNfSVNfSU5GRVJJT1IoICZwLT50cywgJnBpLT50cyApKQorCQkJCWJyZWFrOyAvKiB3ZSBtdXN0IGluc2VydCBhZnRlciB0aGlzIG9uZSAqLworCQl9CisJCQorCQkvKiBzdG9yZSBpdCAqLworCQlmZF9saXN0X2luc2VydF9hZnRlcihsaSwgJnBpLT5jaGFpbik7CisJfQorCQorCS8qIERvbmUgKi8KKwlyZXR1cm4gMDsKK30KKworLyogU2VuZCBhbGwgbWVzc2FnZXMgaW4gd2FpdGxpc3QgdGhhdCBoYXZlIHBhc3NlZCB0aGVpciBsYXRlbmN5IHBlcmlvZCAqLworc3RhdGljIGludCBzZW5kX2FsbF9yZWFkeSgpCit7CisJc3RydWN0IHRpbWVzcGVjIG5vdzsKKwkKKwlUUkFDRV9FTlRSWSgiIik7CisJCisJQ0hFQ0tfU1lTKCBjbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmbm93KSApOworCQorCXdoaWxlICghRkRfSVNfTElTVF9FTVBUWSgmd2FpdGxpc3QpKSB7CisJCXN0cnVjdCBtc2cgKiBtOworCQlzdHJ1Y3QgcHJvY2Vzc19pdGVtICogcGkgPSAoc3RydWN0IHByb2Nlc3NfaXRlbSAqKSh3YWl0bGlzdC5uZXh0KTsKKwkJCisJCWlmICghVFNfSVNfSU5GRVJJT1IoICZwaS0+dHMsICZub3cpKQorCQkJYnJlYWs7IC8qIFdlIHNlbnQgYWxyZWFkeSBhbGwgd2UgY291bGQgKi8KKwkJCisJCS8qIFRha2Ugb3V0IHRoaXMgcGkgYW5kIHNlbmQgdGhlIG1lc3NhZ2UgKi8KKwkJZmRfbGlzdF91bmxpbmsoJnBpLT5jaGFpbik7CisJCW0gPSBwaS0+Y2hhaW4ubzsKKwkJZnJlZShwaSk7CisJCQorCQlUUkFDRV9ERUJVRyhGVUxMLCAiW3RuZV0gU2VuZGluZyBub3cgJXAiLCBtKTsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfc2VuZCgmbSwgTlVMTCwgTlVMTCkgKTsKKwl9CisJCisJcmV0dXJuIDA7CisKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogdGhlIHByb2Nlc3NpbmcgdGhyZWFkICovCitzdGF0aWMgdm9pZCAqIHRuZV9wcm9jZXNzX3RoKHZvaWQgKiBhcmcpIAoreworCVRSQUNFX0VOVFJZKCIlcCIsIGFyZyk7CisJCisJLyogTmFtZSB0aGUgdGhyZWFkICovCisJZmRfbG9nX3RocmVhZG5hbWUgKCAidGVzdF9uZXRlbXVsL3Byb2Nlc3MiICk7CisJCisJQ0hFQ0tfUE9TSVhfRE8oIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXR4KSwgZ290byBlcnJvciApOworCXB0aHJlYWRfY2xlYW51cF9wdXNoKCBmZF9jbGVhbnVwX211dGV4LCAmbXR4ICk7CisJCisJLyogVGhlIGxvb3AgKi8KKwl3aGlsZSAoMSkgeworCQkvKiBGaXJzdCwgdGVzdCBpZiB3ZSBhcmUgY2FuY2VsZWQgKi8KKwkJcHRocmVhZF90ZXN0Y2FuY2VsKCk7CisJCQorCQkvKiBTZW5kIGFsbCBtZXNzYWdlcyB0aGF0IGFyZSByZWFkeSAoZnJlZSByZXNvdXJjZXMgYmVmb3JlIHVzaW5nIG5ldyBvbmVzKSAqLworCQlDSEVDS19GQ1RfRE8oIHNlbmRfYWxsX3JlYWR5KCksIGJyZWFrICk7CisJCQorCQkvKiBOb3cgcHJvY2VzcyB0aGUgbmV3IG1lc3NhZ2VzIGluIGlucHV0IGxpc3QgZm9yIGR1cGxpY2F0ZSBmaWx0ZXIgKi8KKwkJQ0hFQ0tfRkNUX0RPKCBkb19kdXBsaWNhdGVzKCksIGJyZWFrICk7CisJCQorCQkvKiBOb3cgY29tcHV0ZSB0aGUgbGF0ZW5jeSBmb3IgZWFjaCBuZXcgaXRlbSAqLworCQlDSEVDS19GQ1RfRE8oIGRvX2xhdGVuY3koKSwgYnJlYWsgKTsKKwkJCisJCS8qIE5vdywgd2FpdCB0aGVuIGxvb3AgKi8KKwkJaWYgKEZEX0lTX0xJU1RfRU1QVFkoJndhaXRsaXN0KSkgeworCQkJQ0hFQ0tfUE9TSVhfRE8oIHB0aHJlYWRfY29uZF93YWl0KCZjbmQsICZtdHgpLCBicmVhayApOworCQl9IGVsc2UgeworCQkJQ0hFQ0tfUE9TSVhfRE8yKCBwdGhyZWFkX2NvbmRfdGltZWR3YWl0KCZjbmQsICZtdHgsICYoKHN0cnVjdCBwcm9jZXNzX2l0ZW0gKikod2FpdGxpc3QubmV4dCkpLT50cyksIAorCQkJCUVUSU1FRE9VVCwgLyogRVRJTUVET1VUIGlzIGEgbm9ybWFsIHJldHVybiB2YWx1ZSwgY29udGludWUgKi8sCisJCQkJCS8qIG9uIG90aGVyIGVycm9yLCAqLyBicmVhayApOworCQl9CisJCQorCQkvKiBsb29wICovCisJfQorCisJcHRocmVhZF9jbGVhbnVwX3BvcCggMCApOworCUNIRUNLX1BPU0lYX0RPKCBwdGhyZWFkX211dGV4X3VubG9jaygmbXR4KSwgICk7CitlcnJvcjoKKwlUUkFDRV9ERUJVRyhJTkZPLCAiQSBmYXRhbCBlcnJvciBvY2N1cnJlZCBpbiB0ZXN0X25ldGVtdWwvcHJvY2VzcyB0aHJlYWQhIik7CisJQVNTRVJUKDApOworCUNIRUNLX0ZDVF9ETyhmZF9jb3JlX3NodXRkb3duKCksICk7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBmdW5jdGlvbnMgdmlzaWJsZSBmcm9tIG91dHNpZGUgdGhpcyBmaWxlICovCitpbnQgdG5lX3Byb2Nlc3NfaW5pdCgpIAoreworCUNIRUNLX1BPU0lYKCBwdGhyZWFkX2NyZWF0ZSgmdGhyLCBOVUxMLCB0bmVfcHJvY2Vzc190aCwgTlVMTCkgKTsKKwkKKwkjaWYgMCAvKiBkZWJ1ZyAqLworCWludCBpOworCWZvciAoaT0wOyBpPCAyMDsgaSsrKSB7CisJCXByaW50ZigiTEFUOiAlbHVcbiIsIGdldF9sYXRlbmN5KCkpOyAKKwl9CisJI2VuZGlmIC8qIDAgKi8KKwkKKwlyZXR1cm4gMDsKK30KKworCitpbnQgdG5lX3Byb2Nlc3NfZmluaSgpIAoreworCUNIRUNLX0ZDVCggZmRfdGhyX3Rlcm0oJnRocikgKTsKKwlyZXR1cm4gMDsKK30KKworCitpbnQgdG5lX3Byb2Nlc3NfbWVzc2FnZShzdHJ1Y3QgbXNnICogbXNnKSAKK3sKKwlzdHJ1Y3QgcHJvY2Vzc19pdGVtICogcGk7CisJCisJVFJBQ0VfRU5UUlkoIiVwIiwgbXNnKTsKKwkKKwkvKiBDcmVhdGUgYSBuZXcgcGkgZm9yIHRoaXMgbWVzc2FnZSAqLworCUNIRUNLX01BTExPQyggcGkgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBwcm9jZXNzX2l0ZW0pKSApOworCW1lbXNldChwaSwgMCwgc2l6ZW9mKHN0cnVjdCBwcm9jZXNzX2l0ZW0pKTsKKwlmZF9saXN0X2luaXQoJnBpLT5jaGFpbiwgbXNnKTsKKwlDSEVDS19TWVMoY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJnBpLT50cykpOworCQorCS8qIFN0b3JlIGl0IGluIHRoZSBpbnB1dCBsaXN0ICovCisJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXR4KSApOworCWZkX2xpc3RfaW5zZXJ0X2JlZm9yZSgmaW5wdXQsICZwaS0+Y2hhaW4pOworCUNIRUNLX1BPU0lYKCBwdGhyZWFkX211dGV4X3VubG9jaygmbXR4KSApOworCQorCS8qIFdha2UgdXAgdGhlIHByb2Nlc3MgdGhyZWFkIHNvIHRoYXQgaXQgcHJvY2Vzc2VzIHRoZSBtZXNzYWdlICovCisJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfY29uZF9zaWduYWwoJmNuZCkgKTsKKwkKKwkvKiBkb25lICovCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9leHRlbnNpb25zL3Rlc3RfcnRfYW55L0NNYWtlTGlzdHMudHh0IGIvZXh0ZW5zaW9ucy90ZXN0X3J0X2FueS9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmI0OTRjCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy90ZXN0X3J0X2FueS9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDEzIEBACisjIFRoZSB0ZXN0X3J0X2FueSBleHRlbnNpb24KK1BST0pFQ1QoIlJhbmRvbSByb3V0aW5nIGV4dGVuc2lvbiAoZm9yIHRlc3RzKSIgQykKKworIyBDb21waWxlIGFzIGEgbW9kdWxlCitGRF9BRERfRVhURU5TSU9OKHRlc3RfcnRfYW55IHRlc3RfcnRfYW55LmMpCisKKworIyMjIworIyMgSU5TVEFMTCBzZWN0aW9uICMjCisKK0lOU1RBTEwoVEFSR0VUUyB0ZXN0X3J0X2FueQorCUxJQlJBUlkgREVTVElOQVRJT04gJHtJTlNUQUxMX0VYVEVOU0lPTlNfU1VGRklYfQorCUNPTVBPTkVOVCBmcmVlRGlhbWV0ZXItZGVidWctdG9vbHMpCmRpZmYgLS1naXQgYS9leHRlbnNpb25zL3Rlc3RfcnRfYW55L3Rlc3RfcnRfYW55LmMgYi9leHRlbnNpb25zL3Rlc3RfcnRfYW55L3Rlc3RfcnRfYW55LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQyYzNjOAotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvdGVzdF9ydF9hbnkvdGVzdF9ydF9hbnkuYwpAQCAtMCwwICsxLDc3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxMywgV0lERSBQcm9qZWN0IGFuZCBOSUNUCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBXSURFIFByb2plY3Qgb3IgTklDVCBub3IgdGhlIAkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFdJREUgUHJvamVjdCBhbmQgCQkJCQkJICoKKyogICBOSUNULgkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIAorICogVGVzdC1vbmx5IGV4dGVuc2lvbiBmb3Igcm91dGluZzogZ2l2ZXMgYSByYW5kb20gcG9zaXRpdmUgc2NvcmUgdG8gYW55IGNhbmRpZGF0ZSBwZWVyLgorICovCisjaW5jbHVkZSA8ZnJlZURpYW1ldGVyL2V4dGVuc2lvbi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisvKiBUaGUgY2FsbGJhY2sgKi8KK3N0YXRpYyBpbnQgdHJhX291dF9jYih2b2lkICogY2JkYXRhLCBzdHJ1Y3QgbXNnICoqIHBtc2csIHN0cnVjdCBmZF9saXN0ICogY2FuZGlkYXRlcykKK3sKKwlzdHJ1Y3QgbXNnICogbXNnID0gKnBtc2c7CisJc3RydWN0IGZkX2xpc3QgKiBsaTsKKwkKKwlUUkFDRV9FTlRSWSgiJXAgJXAgJXAiLCBjYmRhdGEsIG1zZywgY2FuZGlkYXRlcyk7CisJCisJZm9yIChsaSA9IGNhbmRpZGF0ZXMtPm5leHQ7IGxpICE9IGNhbmRpZGF0ZXM7IGxpID0gbGktPm5leHQpIHsKKwkJc3RydWN0IHJ0ZF9jYW5kaWRhdGUgKmMgPSAoc3RydWN0IHJ0ZF9jYW5kaWRhdGUgKikgbGk7CisJCWMtPnNjb3JlID0gKGludClscmFuZDQ4KCk7CisJfQorCQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGZkX3J0X291dF9oZGwgKiBvdXRfaGRsID0gTlVMTDsKKworLyogUmVnaXN0ZXIgdGhlIGNhbGxiYWNrcyB0byB0aGUgZGFlbW9uICovCitzdGF0aWMgaW50IHRyYV9tYWluKGNoYXIgKiBjb25mZmlsZSkKK3sKKwlUUkFDRV9FTlRSWSgiJXAiLCBjb25mZmlsZSk7CisJQ0hFQ0tfRkNUKCBmZF9ydF9vdXRfcmVnaXN0ZXIgKCB0cmFfb3V0X2NiLCBOVUxMLCAwIC8qIHdlIGNhbGwgaXQgbGF0ZSBzbyB0aGF0IGl0IHJlcGxhY2VzIHByZXZpb3VzIHNjb3JlcyAqLywgJm91dF9oZGwgKSApOworCXJldHVybiAwOworfQorCisvKiBDbGVhbnVwIHRoZSBjYWxsYmFja3MgKi8KK3ZvaWQgZmRfZXh0X2Zpbmkodm9pZCkKK3sKKwlUUkFDRV9FTlRSWSgpOworCUNIRUNLX0ZDVF9ETyggZmRfcnRfb3V0X3VucmVnaXN0ZXIgKCBvdXRfaGRsLCBOVUxMICksIC8qIGNvbnRpbnVlICovICk7CisJcmV0dXJuIDsKK30KKworLyogRGVmaW5lIHRoZSBlbnRyeSBwb2ludCBmdW5jdGlvbiAqLworRVhURU5TSU9OX0VOVFJZKCJ0ZXN0X3J0X2FueSIsIHRyYV9tYWluKTsKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvdGVzdF9zaXAvQ01ha2VMaXN0cy50eHQgYi9leHRlbnNpb25zL3Rlc3Rfc2lwL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMmM5ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL3Rlc3Rfc2lwL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMzAgQEAKKyMgVGhlIHRlc3Rfc2lwIGV4dGVuc2lvbgorUFJPSkVDVCgiRGlhbWV0ZXItU0lQIGNsaWVudCBUZXN0IEFwcGxpY2F0aW9uIChSRkM0NzQwKSIgQykKKworRklORF9QQUNLQUdFKE15U1FMIFJFUVVJUkVEKQorSU5DTFVERV9ESVJFQ1RPUklFUygke015U1FMX0lOQ0xVREVfRElSfSkgCisKKyMgTGlzdCBvZiBzb3VyY2UgZmlsZXMKK1NFVCggVEVTVF9TSVBfU1JDCisJdGVzdF9zaXAuYworCXRlc3Rfc2lwLmgKKwltdWx0aW1lZGlhYXV0aC5jCisJbG9jYXRpb25pbmZvLmMKKwlsb2NhdGlvbmluZm9zbC5jCisJcmVnaXN0cmF0aW9udGVybWluYXRpb24uYworCXVzZXJhdXRob3JpemF0aW9uLmMKKwlzZXJ2ZXJhc3NpZ25tZW50LmMKKykKKworIyBDb21waWxlIGFzIGEgbW9kdWxlCitGRF9BRERfRVhURU5TSU9OKHRlc3Rfc2lwICR7VEVTVF9TSVBfU1JDfSkKKworVEFSR0VUX0xJTktfTElCUkFSSUVTKHRlc3Rfc2lwICR7TXlTUUxfTElCUkFSSUVTfSkKKworCisjIyMjCisjIyBJTlNUQUxMIHNlY3Rpb24gIyMKKworSU5TVEFMTChUQVJHRVRTIHRlc3Rfc2lwCisJTElCUkFSWSBERVNUSU5BVElPTiAke0lOU1RBTExfRVhURU5TSU9OU19TVUZGSVh9CisJQ09NUE9ORU5UIGZyZWVEaWFtZXRlci1kZWJ1Zy10b29scykKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvdGVzdF9zaXAvbG9jYXRpb25pbmZvLmMgYi9leHRlbnNpb25zL3Rlc3Rfc2lwL2xvY2F0aW9uaW5mby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4ZTg5ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL3Rlc3Rfc2lwL2xvY2F0aW9uaW5mby5jCkBAIC0wLDAgKzEsMTIyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogQWxleGFuZHJlIFdlc3RmYWhsIDxhd2VzdGZhaGxAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTAsIEFsZXhhbmRyZSBXZXN0ZmFobCwgVGVyYW9rYSBMYWJvcmF0b3J5IChLZWlvIFVuaXZlcnNpdHkpLCBhbmQgdGhlIFdJREUgUHJvamVjdC4gCSAqCQkKKyoJCQkJCQkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVGVyYW9rYSBMYWJvcmF0b3J5IG5vciB0aGUgCQkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFRlcmFva2EgTGFib3JhdG9yeSAJCQkJCQkgKgorKiAgIAkJCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgInRlc3Rfc2lwLmgiCisKKy8vQ2FsbGVkIHRvIHNlbmQgYSBMSVIKK2ludCB0ZXN0X3NpcF9MSVJfY2IoKQoreworCXN0cnVjdCBkaWN0X29iamVjdCAqIGxpcl9tb2RlbD1OVUxMOworCXN0cnVjdCBtc2cgKiBtZXNzYWdlPU5VTEw7CisJc3RydWN0IGF2cCAqYXZwPU5VTEw7CisJdW5pb24gYXZwX3ZhbHVlIHZhbHVlOworCQorCS8vRmFrZSB2YWx1ZXMgU1RBUlQKKwljaGFyICpzaXBfYW9yPSJzaXA6YXctbGFwcHlAdGVyYS5pY3Mua2Vpby5hYy5qcCI7CisJc2l6ZV90IGFvcl9sZW49c3RybGVuKHNpcF9hb3IpOyAKKwljaGFyICpkZXN0aW5hdGlvbl9yZWFsbT0idGVyYS5pY3Mua2Vpby5hYy5qcCI7CisJc2l6ZV90IGRlc3RpbmF0aW9uX3JlYWxtbGVuPXN0cmxlbihkZXN0aW5hdGlvbl9yZWFsbSk7CisJY2hhciAqZGVzdGluYXRpb25faG9zdD0ic3Vpa2EudGVyYS5pY3Mua2Vpby5hYy5qcCI7CisJc2l6ZV90IGRlc3RpbmF0aW9uX2hvc3RsZW49c3RybGVuKGRlc3RpbmF0aW9uX2hvc3QpOworCS8vRmFrZSB2YWx1ZXMgU1RPUAorCQorCS8vQ3JlYXRlIHRoZSBiYXNlIG1lc3NhZ2UgZm9yIGFuIFJUUgorCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIkxvY2F0aW9uLUluZm8tUmVxdWVzdCIsICZsaXJfbW9kZWwsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX21zZ19uZXcgKGxpcl9tb2RlbCwgMCwgJm1lc3NhZ2UpKTsKKwkKKwkKKwkJCisJLy8gQ3JlYXRlIGEgbmV3IHNlc3Npb24gCisJeworCQlDSEVDS19GQ1QoIGZkX21zZ19uZXdfc2Vzc2lvbiggbWVzc2FnZSwgKG9zMF90KSJhcHBzaXAiLCBDT05TVFNUUkxFTigiYXBwc2lwIikgKSApOworCX0KKwkKKwkvL0FkZCB0aGUgQXV0aC1BcHBsaWNhdGlvbi1JZCAKKwl7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBzaXBfZGljdC5BdXRoX0FwcGxpY2F0aW9uX0lkLCAwLCAmYXZwICkgKTsKKwkJdmFsdWUuaTMyID0gNjsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX3NldHZhbHVlICggYXZwLCAmdmFsdWUgKSApOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkICggbWVzc2FnZSwgTVNHX0JSV19MQVNUX0NISUxELCBhdnApICk7CisJfQorCQorCS8vQXV0aF9TZXNzaW9uX1N0YXRlCisJeworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3ICggc2lwX2RpY3QuQXV0aF9TZXNzaW9uX1N0YXRlLCAwLCAmYXZwICkgKTsKKwkJdmFsdWUuaTMyPTE7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9zZXR2YWx1ZSggYXZwLCAmdmFsdWUgKSApOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkKCBtZXNzYWdlLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCApICk7CisJfQorCQorCS8vT3JpZ2luX0hvc3QgJiBPcmlnaW5fUmVhbG0KKwlDSEVDS19GQ1QoIGZkX21zZ19hZGRfb3JpZ2luICggbWVzc2FnZSwgMCApKTsKKwkKKwkvL0Rlc3RpbmF0aW9uX0hvc3QKKwl7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBzaXBfZGljdC5EZXN0aW5hdGlvbl9Ib3N0LCAwLCAmYXZwICkgKTsKKwkJdmFsdWUub3MuZGF0YT0odW5zaWduZWQgY2hhciAqKWRlc3RpbmF0aW9uX2hvc3Q7CisJCXZhbHVlLm9zLmxlbj1kZXN0aW5hdGlvbl9ob3N0bGVuOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUoIGF2cCwgJnZhbHVlICkgKTsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCggbWVzc2FnZSwgTVNHX0JSV19MQVNUX0NISUxELCBhdnAgKSApOworCX0KKwkvL0Rlc3RpbmF0aW9uX1JlYWxtCisJeworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3ICggc2lwX2RpY3QuRGVzdGluYXRpb25fUmVhbG0sIDAsICZhdnAgKSApOworCQl2YWx1ZS5vcy5kYXRhPSh1bnNpZ25lZCBjaGFyICopZGVzdGluYXRpb25fcmVhbG07CisJCXZhbHVlLm9zLmxlbj1kZXN0aW5hdGlvbl9yZWFsbWxlbjsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX3NldHZhbHVlKCBhdnAsICZ2YWx1ZSApICk7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQoIG1lc3NhZ2UsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwICkgKTsKKwl9CisJCisJLy9TSVBfQU9SCisJeworCQkKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIHNpcF9kaWN0LlNJUF9BT1IsIDAsICZhdnAgKSApOworCQl2YWx1ZS5vcy5kYXRhPSh1bnNpZ25lZCBjaGFyICopc2lwX2FvcjsKKwkJdmFsdWUub3MubGVuPWFvcl9sZW47CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9zZXR2YWx1ZSggYXZwLCAmdmFsdWUgKSApOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkKCBtZXNzYWdlLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCApICk7CisJCQkKKwl9CisJCisJQ0hFQ0tfRkNUKCBmZF9tc2dfc2VuZCggJm1lc3NhZ2UsIE5VTEwsIE5VTEwgKSk7CisJCisJcmV0dXJuIDA7Cit9CisKK2ludCB0ZXN0X3NpcF9MSUFfY2IoIHN0cnVjdCBtc2cgKiogbXNnLCBzdHJ1Y3QgYXZwICogcGFyYW1hdnAsIHN0cnVjdCBzZXNzaW9uICogc2Vzcywgdm9pZCAqIG9wYXF1ZSwgZW51bSBkaXNwX2FjdGlvbiAqIGFjdCkKK3sKKwkKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvdGVzdF9zaXAvbG9jYXRpb25pbmZvc2wuYyBiL2V4dGVuc2lvbnMvdGVzdF9zaXAvbG9jYXRpb25pbmZvc2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2M4NDk0Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy90ZXN0X3NpcC9sb2NhdGlvbmluZm9zbC5jCkBAIC0wLDAgKzEsMTI0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogQWxleGFuZHJlIFdlc3RmYWhsIDxhd2VzdGZhaGxAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTAsIEFsZXhhbmRyZSBXZXN0ZmFobCwgVGVyYW9rYSBMYWJvcmF0b3J5IChLZWlvIFVuaXZlcnNpdHkpLCBhbmQgdGhlIFdJREUgUHJvamVjdC4gCSAqCQkKKyoJCQkJCQkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVGVyYW9rYSBMYWJvcmF0b3J5IG5vciB0aGUgCQkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFRlcmFva2EgTGFib3JhdG9yeSAJCQkJCQkgKgorKiAgIAkJCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgInRlc3Rfc2lwLmgiCisKKy8vQ2FsbGVkIHRvIHNlbmQgYSBMSVIKK2ludCB0ZXN0X3NpcFNMX0xJUl9jYigpCit7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogbGlyX21vZGVsPU5VTEw7CisJc3RydWN0IG1zZyAqIG1lc3NhZ2U9TlVMTDsKKwlzdHJ1Y3QgYXZwICphdnA9TlVMTDsKKwl1bmlvbiBhdnBfdmFsdWUgdmFsdWU7CisJCisJLy9GYWtlIHZhbHVlcyBTVEFSVAorCWNoYXIgKnNpcF9hb3I9InNpcDphdy1sYXBweUB0ZXJhLmljcy5rZWlvLmFjLmpwIjsKKwlzaXplX3QgYW9yX2xlbj1zdHJsZW4oc2lwX2Fvcik7IAorCWNoYXIgKmRlc3RpbmF0aW9uX3JlYWxtPSJ0ZXJhLmljcy5rZWlvLmFjLmpwIjsKKwlzaXplX3QgZGVzdGluYXRpb25fcmVhbG1sZW49c3RybGVuKGRlc3RpbmF0aW9uX3JlYWxtKTsKKwljaGFyICpkZXN0aW5hdGlvbl9ob3N0PSJiaXdhLnRlcmEuaWNzLmtlaW8uYWMuanAiOworCXNpemVfdCBkZXN0aW5hdGlvbl9ob3N0bGVuPXN0cmxlbihkZXN0aW5hdGlvbl9ob3N0KTsKKwkvL0Zha2UgdmFsdWVzIFNUT1AKKwkKKwkvL0NyZWF0ZSB0aGUgYmFzZSBtZXNzYWdlIGZvciBhbiBSVFIKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJMb2NhdGlvbi1JbmZvLVJlcXVlc3QiLCAmbGlyX21vZGVsLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9tc2dfbmV3IChsaXJfbW9kZWwsIDAsICZtZXNzYWdlKSk7CisJCisJCisJCQorCS8vIENyZWF0ZSBhIG5ldyBzZXNzaW9uIAorCXsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfbmV3X3Nlc3Npb24oIG1lc3NhZ2UsIChvczBfdCkiYXBwc2lwIiwgQ09OU1RTVFJMRU4oImFwcHNpcCIpICkgKTsKKwl9CisJCisJLy9BZGQgdGhlIEF1dGgtQXBwbGljYXRpb24tSWQgCisJeworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3ICggc2lwX2RpY3QuQXV0aF9BcHBsaWNhdGlvbl9JZCwgMCwgJmF2cCApICk7CisJCXZhbHVlLmkzMiA9IDY7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9zZXR2YWx1ZSAoIGF2cCwgJnZhbHVlICkgKTsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCAoIG1lc3NhZ2UsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwKSApOworCX0KKwkKKwkvL0F1dGhfU2Vzc2lvbl9TdGF0ZQorCXsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIHNpcF9kaWN0LkF1dGhfU2Vzc2lvbl9TdGF0ZSwgMCwgJmF2cCApICk7CisJCXZhbHVlLmkzMj0xOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUoIGF2cCwgJnZhbHVlICkgKTsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCggbWVzc2FnZSwgTVNHX0JSV19MQVNUX0NISUxELCBhdnAgKSApOworCX0KKwkKKwkvL09yaWdpbl9Ib3N0ICYgT3JpZ2luX1JlYWxtCisJQ0hFQ0tfRkNUKCBmZF9tc2dfYWRkX29yaWdpbiAoIG1lc3NhZ2UsIDAgKSk7CisJCisJLy9EZXN0aW5hdGlvbl9Ib3N0CisJeworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3ICggc2lwX2RpY3QuRGVzdGluYXRpb25fSG9zdCwgMCwgJmF2cCApICk7CisJCXZhbHVlLm9zLmRhdGE9KHVuc2lnbmVkIGNoYXIgKilkZXN0aW5hdGlvbl9ob3N0OworCQl2YWx1ZS5vcy5sZW49ZGVzdGluYXRpb25faG9zdGxlbjsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX3NldHZhbHVlKCBhdnAsICZ2YWx1ZSApICk7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQoIG1lc3NhZ2UsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwICkgKTsKKwl9CisJLy9EZXN0aW5hdGlvbl9SZWFsbQorCXsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIHNpcF9kaWN0LkRlc3RpbmF0aW9uX1JlYWxtLCAwLCAmYXZwICkgKTsKKwkJdmFsdWUub3MuZGF0YT0odW5zaWduZWQgY2hhciAqKWRlc3RpbmF0aW9uX3JlYWxtOworCQl2YWx1ZS5vcy5sZW49ZGVzdGluYXRpb25fcmVhbG1sZW47CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9zZXR2YWx1ZSggYXZwLCAmdmFsdWUgKSApOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkKCBtZXNzYWdlLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCApICk7CisJfQorCQorCQorCQorCS8vU0lQX0FPUgorCXsKKwkJCisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBzaXBfZGljdC5TSVBfQU9SLCAwLCAmYXZwICkgKTsKKwkJdmFsdWUub3MuZGF0YT0odW5zaWduZWQgY2hhciAqKXNpcF9hb3I7CisJCXZhbHVlLm9zLmxlbj1hb3JfbGVuOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUoIGF2cCwgJnZhbHVlICkgKTsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCggbWVzc2FnZSwgTVNHX0JSV19MQVNUX0NISUxELCBhdnAgKSApOworCQkJCisJfQorCQorCUNIRUNLX0ZDVCggZmRfbXNnX3NlbmQoICZtZXNzYWdlLCBOVUxMLCBOVUxMICkpOworCQorCXJldHVybiAwOworfQorCitpbnQgdGVzdF9zaXBTTF9MSUFfY2IoIHN0cnVjdCBtc2cgKiogbXNnLCBzdHJ1Y3QgYXZwICogcGFyYW1hdnAsIHN0cnVjdCBzZXNzaW9uICogc2Vzcywgdm9pZCAqIG9wYXF1ZSwgZW51bSBkaXNwX2FjdGlvbiAqIGFjdCkKK3sKKwkKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvdGVzdF9zaXAvbXVsdGltZWRpYWF1dGguYyBiL2V4dGVuc2lvbnMvdGVzdF9zaXAvbXVsdGltZWRpYWF1dGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWVkYjhkCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy90ZXN0X3NpcC9tdWx0aW1lZGlhYXV0aC5jCkBAIC0wLDAgKzEsNzg2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBBbGV4YW5kcmUgV2VzdGZhaGwgPGF3ZXN0ZmFobEBmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxMCwgQWxleGFuZHJlIFdlc3RmYWhsLCBUZXJhb2thIExhYm9yYXRvcnkgKEtlaW8gVW5pdmVyc2l0eSksIGFuZCB0aGUgV0lERSBQcm9qZWN0LiAJICoJCQorKgkJCQkJCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBUZXJhb2thIExhYm9yYXRvcnkgbm9yIHRoZSAJCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgVGVyYW9rYSBMYWJvcmF0b3J5IAkJCQkJCSAqCisqICAgCQkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJ0ZXN0X3NpcC5oIgorCisKK2ludCB0ZXN0X3NpcF9NQUFfY2IoIHN0cnVjdCBtc2cgKiogbXNnLCBzdHJ1Y3QgYXZwICogcGFyYW1hdnAsIHN0cnVjdCBzZXNzaW9uICogc2Vzcywgdm9pZCAqIG9wYXF1ZSwgZW51bSBkaXNwX2FjdGlvbiAqIGFjdCkKK3sKKy8qCisJc3RydWN0IG1zZyAqYW5zLCAqcXJ5OworCXN0cnVjdCBhdnAgKmF2cCwgKmEyLCAqYXV0aGRhdGFpdGVtOworCXN0cnVjdCBtc2dfaGRyICogaGVhZGVyID0gTlVMTDsKKwlzdHJ1Y3QgYXZwX2hkciAqIGF2cGhkcj1OVUxMLCAqYXZwaGVhZGVyPU5VTEwsICphdnBoZWFkZXJfYXV0aD1OVUxMLCpkaWdlc3RoZWFkZXI9TlVMTDsKKwl1bmlvbiBhdnBfdmFsdWUgdmFsOworCWludCBmb3VuZF9jbm9uY2U9MDsKKwlzdHJ1Y3QgYXZwICogdGVtcGF2cD1OVUxMLCpzaXBBdXRoZW50aWNhdGlvbj1OVUxMLCpzaXBBdXRoZW50aWNhdGU9TlVMTDsKKwljaGFyICogcmVzdWx0OworCWNoYXIgcGFzc3dvcmRbNTFdOworCWludCBpZHg9MCwgaWR4Mj0wLCBudW1iZXJfb2ZfYXV0aF9pdGVtcz0wLGk9MDsKKwkvL0ZsYWdzIGFuZCB2YXJpYWJsZXMgZm9yIERhdGFiYXNlCisJaW50IHNpcHVyaW5vdHN0b3JlZD0wLCBhdXRoZW50aWNhdGlvbnBlbmRpbmc9MCwgcXVlcnlsZW49MCwgdXNlcm5hbWVsZW49MDsKKwljaGFyICpxdWVyeT1OVUxMLCp1c2VybmFtZT1OVUxMOworCQorCS8vVGhlIG5vbmNlIHdlIHdpbGwgc3RvcmUgYW5kIHJldHJpZXZlIGluIHNlc3Npb24KKwlzdHJ1Y3QgZHNfbm9uY2UgKnN0b3JlZG5vbmNlPU5VTEw7CisJCisJCisJVFJBQ0VfRU5UUlkoIiVwICVwICVwICVwIiwgbXNnLCBhdnAsIHNlc3MsIGFjdCk7CisJCisJaWYgKG1zZyA9PSBOVUxMKQorCQlyZXR1cm4gRUlOVkFMOworCisJCisJLy8gQ3JlYXRlIGFuc3dlciBoZWFkZXIgCisJcXJ5ID0gKm1zZzsKKwlDSEVDS19GQ1QoIGZkX21zZ19uZXdfYW5zd2VyX2Zyb21fcmVxICggZmRfZ19jb25maWctPmNuZl9kaWN0LCBtc2csIDAgKSApOworCWFucyA9ICptc2c7CisJCisKKworCS8vIEFkZCB0aGUgYXBwcm9wcmlhdGUgY29tbWFuZCBjb2RlICYgQXV0aC1BcHBsaWNhdGlvbi1JZCAKKwl7CisJCQorCQlDSEVDS19GQ1QoIGZkX21zZ19oZHIgKCAqbXNnLCAmaGVhZGVyICkgKTsKKwkJaGVhZGVyLT5tc2dfZmxhZ3MgPSBDTURfRkxBR19QUk9YSUFCTEU7CisJCWhlYWRlci0+bXNnX2NvZGUgPSAyODY7CisJCWhlYWRlci0+bXNnX2FwcGwgPSA2OworCQkKKwkJCisJCS8vIEFkZCB0aGUgQXV0aC1BcHBsaWNhdGlvbi1JZCAKKwkJeworCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIHNpcF9kaWN0LkF1dGhfQXBwbGljYXRpb25fSWQsIDAsICZhdnAgKSApOworCQkJQVNTRVJUKGF2cCk7CisJCQl2YWwuaTMyID0gaGVhZGVyLT5tc2dfYXBwbDsKKwkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9zZXR2YWx1ZSAoIGF2cCwgJnZhbCApICk7CisJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkICggYW5zLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCkgKTsKKwkJfQorCX0KKwkKKwkKKwkvLyBBZGQgdGhlIEF1dGgtU2Vzc2lvbi1TdGF0ZSBBVlAgCisJeworCQkKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfc2VhcmNoX2F2cCAoIHFyeSwgc2lwX2RpY3QuQXV0aF9TZXNzaW9uX1N0YXRlLCAmYXZwKSApOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfaGRyKCBhdnAsICZhdnBoZHIgKSAgKTsKKwkJCisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBzaXBfZGljdC5BdXRoX1Nlc3Npb25fU3RhdGUsIDAsICZhdnAgKSApOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUoIGF2cCwgYXZwaGRyLT5hdnBfdmFsdWUgKSApOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkKCBhbnMsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwICkgKTsKKwl9CisKKwkKKwkKKwkvLyBDaGVjayBpZiBtZXRob2QgaXMgUkVHSVNURVIgdGhlbiBVc2VyLU5hbWUgbXVzdCBiZSBwcmVzZW50IAorCXsKKwkJCisJCUNIRUNLX0ZDVCggZmRfbXNnX3NlYXJjaF9hdnAgKCBxcnksIHNpcF9kaWN0LlNJUF9NZXRob2QsICZhdnApICk7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9oZHIoIGF2cCwgJmF2cGhlYWRlciApKTsKKwkJCisKKwkJY2hhciAqbWV0aG9kPU5VTEw7CisJCQorCQlDSEVDS19GQ1QoIGZkX21zZ19zZWFyY2hfYXZwICggcXJ5LCBzaXBfZGljdC5Vc2VyX05hbWUsICZhdnApICk7CisJCWlmKGF2cCE9TlVMTCkKKwkJeworCQkJCisJCQlpbnQgbm90X2ZvdW5kPTE7CisJCQlNWVNRTF9SRVMgKnJlcz1OVUxMOworCQkJTVlTUUxfUk9XIHJvdzsKKwkJCQorCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2hkciggYXZwLCAmYXZwaGRyICkgICk7CisJCQkKKwkJCS8vV2UgYWxsb2NhdGUgdGhlIGRvdWJsZSBzaXplIG9mIHVzZXJuYW1lIGJlY2F1c2UgYXQgd29yc3QgaXQgY2FuIGJlIGFsbCBxdW90ZXMKKwkJCXVzZXJuYW1lPW1hbGxvYyhhdnBoZHItPmF2cF92YWx1ZS0+b3MubGVuKjIrMSk7CisJCQkvL1dlIHB1cmlmeSB1c2VybmFtZSBub3QgdG8gaGF2ZSBmb3JiaWRkZW4gY2hhcmFjdGVycworCQkJdXNlcm5hbWVsZW49bXlzcWxfcmVhbF9lc2NhcGVfc3RyaW5nKGNvbm4sIHVzZXJuYW1lLCBhdnBoZHItPmF2cF92YWx1ZS0+b3MuZGF0YSwgYXZwaGRyLT5hdnBfdmFsdWUtPm9zLmxlbik7CisJCQkKKwkJCQorCQkJaWYoKHN0cm5jbXAoYXZwaGVhZGVyLT5hdnBfdmFsdWUtPm9zLmRhdGEsIlJFR0lTVEVSIixhdnBoZWFkZXItPmF2cF92YWx1ZS0+b3MubGVuKT09MCkpCisJCQl7CisJCQkJbm90X2ZvdW5kPTE7CisJCQkJCisJCQkJLy9XZSBjb3B5IHVzZXJuYW1lIGluIHF1ZXJ5CisJCQkJcXVlcnlsZW49U1FMX0dFVFBBU1NXT1JEX0xFTiArIHVzZXJuYW1lbGVuOworCQkJCXF1ZXJ5ID0gbWFsbG9jKHF1ZXJ5bGVuKzIpOworCQkJCXNucHJpbnRmKHF1ZXJ5LCBxdWVyeWxlbisxLCBTUUxfR0VUUEFTU1dPUkQsIHVzZXJuYW1lKTsKKwkJCQkKKwkJCQkKKwkJCQkKKwkJCQkvL1dlIG1ha2UgdGhlIHF1ZXJ5CQorCQkJCXJlcXVlc3RfbXlzcWwocXVlcnkpOworCQkJCXJlcz1teXNxbF91c2VfcmVzdWx0KGNvbm4pOworCQkJCWlmKHJlcz09TlVMTCkKKwkJCQl7CisJCQkJCS8vV2UgY291bGRuJ3QgbWFrZSB0aGUgcmVxdWVzdAorCQkJCQlyZXN1bHQ9IkRJQU1FVEVSX1VOQUJMRV9UT19DT01QTFkiOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQkKKwkJCQorCQkJCisJCQkJd2hpbGUgKChyb3cgPSBteXNxbF9mZXRjaF9yb3cocmVzKSkgIT0gTlVMTCkKKyAgICAgIAkJCQl7CisgICAgICAJCQkJCWlmKHJvd1swXSE9IiIpCisgICAgICAJCQkJCXsKKyAgICAgIAkJCQkJCXN0cmNweShwYXNzd29yZCxyb3dbMF0pOworICAgICAgCQkJCQkJbm90X2ZvdW5kPTA7CisgICAgICAJCQkJCQlicmVhazsKKyAgICAgIAkJCQkJfQorICAgICAgCQkJCX0KKyAgICAgIAkJCQlteXNxbF9mcmVlX3Jlc3VsdChyZXMpOworICAgICAgCQkJCWZyZWUocXVlcnkpOworICAgICAgCQkJCQorICAgICAgCQkJCWlmKG5vdF9mb3VuZCkKKwkJCQl7CisJCQkJCVRSQUNFX0RFQlVHKEZVTEwsIlRoZSB1c2VyICVzIGRvZXNuJ3QgZXhpc3QhIix1c2VybmFtZSk7CisJCQkJCXJlc3VsdD0iRElBTUVURVJfRVJST1JfVVNFUl9VTktOT1dOIjsKKwkJCQkJZnJlZSh1c2VybmFtZSk7CQorCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQkKKwkJCQorCQkJCisJCQkJLy9Ob3cgdGhhdCB3ZSBrbm93IHRoZSB1c2VyIGV4aXN0LCB3ZSBnZXQgdGhlIGxpc3Qgb2YgQU9SIG93bmVkIGJ5IHRoaXMgdXNlcgorCQkJCXF1ZXJ5bGVuPVNRTF9HRVRTSVBBT1JfTEVOICsgdXNlcm5hbWVsZW47CisJCQkJcXVlcnkgPSBtYWxsb2MocXVlcnlsZW4rMik7CisJCQkJc25wcmludGYocXVlcnksIHF1ZXJ5bGVuKzEsIFNRTF9HRVRTSVBBT1IsIHVzZXJuYW1lKTsKKwkJCQorCQkJCS8vV2UgbWFrZSB0aGUgcXVlcnkKKwkJCQlyZXF1ZXN0X215c3FsKHF1ZXJ5KTsKKwkJCQlyZXM9bXlzcWxfdXNlX3Jlc3VsdChjb25uKTsKKwkJCQlpZihyZXM9PU5VTEwpCisJCQkJeworCQkJCQkvL1dlIGNvdWxkbid0IG1ha2UgdGhlIHJlcXVlc3QKKwkJCQkJcmVzdWx0PSJESUFNRVRFUl9VTkFCTEVfVE9fQ09NUExZIjsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJCisJCQkJLy9XZSByZXRyaWV2ZSB0aGUgU0lQLUFPUiBmcm9tIEFWUCB0byBjaGVjayBpZiB0aGUgdXNlciBjYW4gdXMgaXQKKwkJCQlDSEVDS19GQ1QoIGZkX21zZ19zZWFyY2hfYXZwICggcXJ5LCBzaXBfZGljdC5TSVBfQU9SLCAmYXZwKSApOworCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9oZHIoIGF2cCwgJmF2cGhkciApICApOworCQkJCisJCQkJbm90X2ZvdW5kPTE7CisJCQkJd2hpbGUgKChyb3cgPSBteXNxbF9mZXRjaF9yb3cocmVzKSkgIT0gTlVMTCkKKyAgICAgIAkJCQl7CisgICAgICAJCQkJCWlmKHN0cm5jbXAoYXZwaGRyLT5hdnBfdmFsdWUtPm9zLmRhdGEscm93WzBdLGF2cGhkci0+YXZwX3ZhbHVlLT5vcy5sZW4pPT0wKQorICAgICAgCQkJCQl7CisgICAgICAJCQkJCQlub3RfZm91bmQ9MDsKKyAgICAgIAkJCQkJCWJyZWFrOworICAgICAgCQkJCQl9CisgICAgICAJCQkJfQorICAgICAgCQkJCW15c3FsX2ZyZWVfcmVzdWx0KHJlcyk7CisgICAgICAJCQkJZnJlZShxdWVyeSk7CisgICAgICAJCQkJCisgICAgICAJCQkJaWYobm90X2ZvdW5kKQorCQkJCXsKKwkJCQkJVFJBQ0VfREVCVUcoRlVMTCwiVGhlIHVzZXIgJXMgY2FuJ3QgdXNlIHRoaXMgU0lQLUFPUiEiLHVzZXJuYW1lKTsKKwkJCQkJcmVzdWx0PSJESUFNRVRFUl9FUlJPUl9JREVOVElUSUVTX0RPTlRfTUFUQ0giOworCQkJCQlmcmVlKHVzZXJuYW1lKTsJCisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQkKKwkJCX0KKworCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfc2VhcmNoX2F2cCAoIHFyeSwgc2lwX2RpY3QuU0lQX1NlcnZlcl9VUkksICZhdnApICk7CisJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfaGRyKCBhdnAsICZhdnBoZHIgKSk7CisJCQkKKwkJCWlmKGF2cGhkciE9TlVMTCkKKwkJCXsKKwkJCQljaGFyICpzaXB1cmk9TlVMTDsKKwkJCQlpbnQgc2lwdXJpbGVuPTA7CisKKwkJCQkvL1dlIGFsbG9jYXRlIHRoZSBkb3VibGUgc2l6ZSBvZiBTSVAtVVJJIGJlY2F1c2UgYXQgd29yc3QgaXQgY2FuIGJlIGFsbCBxdW90ZXMKKwkJCQlzaXB1cmk9bWFsbG9jKGF2cGhkci0+YXZwX3ZhbHVlLT5vcy5sZW4qMisxKTsKKwkJCQkvL1dlIHB1cmlmeSBTSVAtVVJJIG5vdCB0byBoYXZlIGZvcmJpZGRlbiBjaGFyYWN0ZXJzCisJCQkJc2lwdXJpbGVuPW15c3FsX3JlYWxfZXNjYXBlX3N0cmluZyhjb25uLCBzaXB1cmksIGF2cGhkci0+YXZwX3ZhbHVlLT5vcy5kYXRhLCBhdnBoZHItPmF2cF92YWx1ZS0+b3MubGVuKTsKKwkJCQkKKwkJCQkKKwkJCQkvL1dlIGdldCB0aGUgU0lQLVVSSSBhc3NpZ25hdGVkIHRvIHRoZSB1c2VyCisJCQkJcXVlcnlsZW49U1FMX0dFVFNJUFVSSV9MRU4gKyB1c2VybmFtZWxlbjsKKwkJCQlxdWVyeSA9IG1hbGxvYyhxdWVyeWxlbisyKTsKKwkJCQlzbnByaW50ZihxdWVyeSwgcXVlcnlsZW4rMSwgU1FMX0dFVFNJUFVSSSwgdXNlcm5hbWUpOworCisJCQkJLy9XZSBtYWtlIHRoZSBxdWVyeQorCQkJCXJlcXVlc3RfbXlzcWwocXVlcnkpOworCQkJCXJlcz1teXNxbF91c2VfcmVzdWx0KGNvbm4pOworCQkJCWlmKHJlcz09TlVMTCkKKwkJCQl7CisJCQkJCS8vV2UgY291bGRuJ3QgbWFrZSB0aGUgcmVxdWVzdAorCQkJCQlyZXN1bHQ9IkRJQU1FVEVSX1VOQUJMRV9UT19DT01QTFkiOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQkJbm90X2ZvdW5kPTE7CisJCQkJd2hpbGUgKChyb3cgPSBteXNxbF9mZXRjaF9yb3cocmVzKSkgIT0gTlVMTCkKKyAgICAgIAkJCQl7CisgICAgICAJCQkJCWlmKHN0cm5jbXAoYXZwaGRyLT5hdnBfdmFsdWUtPm9zLmRhdGEscm93WzBdLGF2cGhkci0+YXZwX3ZhbHVlLT5vcy5sZW4pPT0wKQorICAgICAgCQkJCQl7CisgICAgICAJCQkJCQlub3RfZm91bmQ9MDsKKyAgICAgIAkJCQkJCWJyZWFrOworICAgICAgCQkJCQl9CisgICAgICAJCQkJfQorICAgICAgCQkJCW15c3FsX2ZyZWVfcmVzdWx0KHJlcyk7CisgICAgICAJCQkJZnJlZShxdWVyeSk7CisKKyAgICAgIAkJCQlpZihub3RfZm91bmQpCisJCQkJeworCQkJCQkvL1dlIHVwZGF0ZSB0aGUgU0lQX1VSSSBmb3IgdGhlIHVzZXIgYW5kIHdlIGZsYWcgImF1dGhlbnRpY2F0aW9uIGluIHByb2dyZXNzIgorCQkJCQlxdWVyeWxlbj1TUUxfU0VUU0lQVVJJX0xFTiArIHVzZXJuYW1lbGVuICsgc2lwdXJpbGVuOworCQkJCQlxdWVyeSA9IG1hbGxvYyhxdWVyeWxlbisyKTsKKwkJCQkJc25wcmludGYocXVlcnksIHF1ZXJ5bGVuKzEsIFNRTF9TRVRTSVBVUkksIHNpcHVyaSwgdXNlcm5hbWUpOworCQkJCisJCQkJCS8vV2UgbWFrZSB0aGUgcXVlcnkKKwkJCQkJcmVxdWVzdF9teXNxbChxdWVyeSk7CisJCQkJCQorCSAgICAgIAkJCQlmcmVlKHF1ZXJ5KTsKKwkgICAgICAJCQkJYXV0aGVudGljYXRpb25wZW5kaW5nPTE7CisJCQkJfQorICAgICAgCQkJCWZyZWUoc2lwdXJpKTsKKwkJCQkKKwkJCX0KKwkJCWVsc2UKKwkJCQlzaXB1cmlub3RzdG9yZWQ9MTsKKworCQl9CisJCWVsc2UKKwkJeworCQkJcmVzdWx0PSJESUFNRVRFUl9VU0VSX05BTUVfUkVRVUlSRUQiOworCQkJZ290byBvdXQ7CisJCX0KKworCQkJCisJCWZyZWUobWV0aG9kKTsKKworCX0KKworCQorCS8vVE9ETzogcmVtb3ZlIGxvb3AgZm9yIGF1dGhkYXRhaXRlbSBiZWNhdXNlIFJGQyBzYXkgb25seSBvbmUgKHdhaXQgZm9yIGFuc3dlciBmcm9tIEdhcmNpYSkKKwkvLyBIb3cgbWFueSBBdXRoIERhdGEgSXRlbXM/CisJQ0hFQ0tfRkNUKCBmZF9tc2dfc2VhcmNoX2F2cCAoIHFyeSwgc2lwX2RpY3QuU0lQX051bWJlcl9BdXRoX0l0ZW1zLCAmYXZwKSApOworCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9oZHIoIGF2cCwgJmF2cGhlYWRlciApICApOworCQorCQorCWlmKGF2cCE9TlVMTCkKKwl7CisJCUNIRUNLX0ZDVChmZF9tc2dfc2VhcmNoX2F2cCAoIHFyeSwgc2lwX2RpY3QuU0lQX0F1dGhfRGF0YV9JdGVtLCAmYXZwKSk7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9oZHIoIGF2cCwgJmF2cGhkciApICApOworCQkKKwkJaWYoYXZwIT1OVUxMKQorCQl7CisJCQkvL0ZpcnN0IGlzIEF1dGhlbnRpY2F0aW9uIFNjaGVtZQorCQkJQ0hFQ0tfRkNUKGZkX21zZ19icm93c2UgKCBhdnAsIE1TR19CUldfRklSU1RfQ0hJTEQsICZhdnAsIE5VTEwpICk7CisJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfaGRyKCBhdnAsICZhdnBoZHIgKSAgKTsKKwkJCQorCQkJLy9EaWdlc3QtQXV0aGVudGljYXRpb24/CisJCQlpZihhdnBoZHItPmF2cF92YWx1ZS0+aTMyPT0wKQorCQkJeworCQkJCQorCQkJCWZvcihpZHg9MDtpZHg8YXZwaGVhZGVyLT5hdnBfdmFsdWUtPmkzMjtpZHgrKykKKwkJCQl7CisJCQkJCS8vV2UgbG9vayBmb3IgU0lQIEF1dGggaXRlbXMKKwkJCQkJQ0hFQ0tfRkNUKGZkX21zZ19icm93c2UgKCBhdnAsIE1TR19CUldfV0FMSywgJmF2cCwgTlVMTCkgKTsKKwkJCQkJCisJCQkJCWlmKGF2cCE9TlVMTCkKKwkJCQkJeworCQkJCQkJCisJCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfaGRyKCBhdnAsJmF2cGhkciApKTsKKwkJCisJCQkJCQlpZihhdnBoZHItPmF2cF9jb2RlPT0zODApIC8vV2Ugb25seSBjcmVhdGUgQXV0aC1EYXRhLUl0ZW0gdG8gYW5zd2VyIEF1dGgtRGF0YS1JdGVtCisJCQkJCQl7CisJCQkJCQkJLy8gQWRkIHRoZSBBdXRoLURhdGEtSXRlbSBBVlAgCisJCQkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIHNpcF9kaWN0LlNJUF9BdXRoX0RhdGFfSXRlbSwgMCwgJmF1dGhkYXRhaXRlbSApICk7CisJCQkJCQorCQkJCQkJCS8vIEFkZCB0aGUgQXV0aGVudGljYXRpb24gU2NoZW1lIEFWUCAKKwkJCQkJCQl7CisJCQkJCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBzaXBfZGljdC5TSVBfQXV0aGVudGljYXRpb25fU2NoZW1lLCAwLCAmYTIgKSApOworCQkJCQkJCQl2YWwuaTMyPTA7IC8vV2Ugb25seSBrbm93IERpZ2VzdCBBdXRoZW50aWNhdGlvbgorCQkJCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUoIGEyLCAmdmFsICkgKTsKKwkJCQkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCggYXV0aGRhdGFpdGVtLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGEyICkgKTsKKwkJCQkJCQl9CisJCQkJCQkJCisJCQkJCQkJLy9XZSBuZWVkIHRvIGtub3cgaWYgdGhlcmUgaXMgYSBDbm9uY2UgYXR0cmlidXRlIChvbmx5IGluIHRoZSBzZWNvbmQgTUFSIHJlcXVlc3QpCisJCQkJCQkJCisJCQkJCQkJLy9DSEVDS19GQ1QoZmRfbXNnX2Jyb3dzZSAoIGF2cCwgTVNHX0JSV19XQUxLLCAmYXZwLCBOVUxMKSApOworCQkJCQkJCQorCQkJCQkJCQorCQkJCQkJCUNIRUNLX0ZDVChmZF9hdnBfc2VhcmNoX2F2cCAoYXZwLCBzaXBfZGljdC5EaWdlc3RfQ05vbmNlLCAmYTIgKSk7CisJCQkJCQkJCisJCQkJCQkJaWYoYTIhPU5VTEwpCisJCQkJCQkJCWZvdW5kX2Nub25jZT0xOworCQkJCQkJCWVsc2UKKwkJCQkJCQkJZm91bmRfY25vbmNlPTA7CisJCQkJCQkJCQorCQkJCQkJCWlmKCFmb3VuZF9jbm9uY2UpCisJCQkJCQkJeworCQkJCQkJCQkvLworCQkJCQkJCQlXZSBhcmUgaW4gdGhlIGNhc2Ugb2YgZmlyc3QgYWNjZXNzIHJlcXVlc3Qgc28gd2UgbmVlZCB0byBjaGFsbGVuZ2UgdGhlIHVzZXIuCisJCQkJCQkJCQorCQkJCQkJCQlUUkFDRV9ERUJVRyhGVUxMLCJGaXJzdCBBdXRob3JpemF0aW9uIGluIHByb2dyZXNzLi4uIik7CisKKwkJCQkJCQkJLy8gQ3JlYXRlIGEgbmV3IHNlc3Npb24gIC8vdGhpcyBjcmVhdGUgYSBuZXcgc2Vzc2lvbiBJZCAhISEKKwkJCQkJCQkJLy9DSEVDS19GQ1RfRE8oIGZkX3Nlc3NfbmV3KCAmc2VzcywgZmRfZ19jb25maWctPmNuZl9kaWFtaWQsICJ0ZXN0X3NpcCIsIDcpLCBnb3RvIG91dCApOworCQkJCQkJCQkKKworCQkJCQkJCQkvLyBDcmVhdGUgdGhlIFNJUC1BdXRoZW50aWNhdGUgQVZQIAorCQkJCQkJCQl7CisJCQkJCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3ICggc2lwX2RpY3QuU0lQX0F1dGhlbnRpY2F0ZSwgMCwgJnNpcEF1dGhlbnRpY2F0ZSApICk7CisJCQkJCQkJCX0JCQkJCQkKKworCQkJCQkJCQkvLyBBZGQgdGhlIERpZ2VzdCBRT1AgQVZQIAorCQkJCQkJCQl7CisJCQkJCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3ICggc2lwX2RpY3QuRGlnZXN0X1FPUCwgMCwgJmEyICkgKTsKKwkJCQkJCQkJCXZhbC5vcy5kYXRhPSJhdXRoIjsKKwkJCQkJCQkJCXZhbC5vcy5sZW49c3RybGVuKHZhbC5vcy5kYXRhKTsKKwkJCQkJCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9zZXR2YWx1ZSggYTIsICZ2YWwgKSApOworCQkJCQkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCggc2lwQXV0aGVudGljYXRlLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGEyICkgKTsKKwkJCQkJCQkJfQorCQkJCQkJCQkvLyBBZGQgdGhlIERpZ2VzdCBOb25jZSBBVlAgCisJCQkJCQkJCXsKKwkJCQkJCQkJCXVpbnQ4X3QgYnVmZmVyW05PTkNFX1NJWkVdOworCQkJCQkJCQkJY2hhciBub25jZVtOT05DRV9TSVpFICogMiArIDFdOworCQkJCQkJCQorCQkJCQkJCQkKKwkJCQkJCQkJCWdjcnlfY3JlYXRlX25vbmNlICgodWludDhfdCAqKWJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworCQkJCQkJCQorCQkJCQkJCQkJZm9yKGk9MDtpPE5PTkNFX1NJWkU7aSsrKQorCQkJCQkJCQkJCXNwcmludGYoJm5vbmNlWzIgKiBpXSwgIiUyLjJoaHgiLCBidWZmZXJbaV0pOworCQkJCQkJCQkKKwkJCQkJCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBzaXBfZGljdC5EaWdlc3RfTm9uY2UsIDAsICZhMiApICk7CisJCQkJCQkJCQkKKwkJCQkJCQkJCQorCQkJCQkJCQkJLy9XZSBzdG9yZSB0aGUgbm9uY2UgKHN0b3JlZG5vbmNlIHN0cnVjdHVyZSkgaW5zaWRlIHRoZSBzZXNzaW9uCisJCQkJCQkJCQlzdG9yZWRub25jZT1tYWxsb2Moc2l6ZW9mKHN0cnVjdCBkc19ub25jZSkpOworCQkJCQkJCQkJbWVtc2V0KHN0b3JlZG5vbmNlLDAsc2l6ZW9mKHN0cnVjdCBkc19ub25jZSkpOworCQkJCQkJCQkJQ0hFQ0tfTUFMTE9DKHN0b3JlZG5vbmNlLT5ub25jZT1tYWxsb2MoTk9OQ0VfU0laRSoyKzEpKTsKKwkJCQkJCQkJCW1lbWNweShzdG9yZWRub25jZS0+bm9uY2UsKGNoYXIgKilub25jZSxOT05DRV9TSVpFKjIrMSk7CisJCQkJCQkJCQlDSEVDS19GQ1QoIGZkX3Nlc3Nfc3RhdGVfc3RvcmUgKCBkc19zZXNzX2hkbCwgc2VzcywgJnN0b3JlZG5vbmNlICkpOyAgCisJCQkJCQkJCQkKKwkJCQkJCQkJCXZhbC5vcy5kYXRhPW5vbmNlOworCQkJCQkJCQkJdmFsLm9zLmxlbj1OT05DRV9TSVpFICogMjsKKwkJCQkJCQkJCQorCQkJCQkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX3NldHZhbHVlKCBhMiwgJnZhbCApICk7CisJCQkJCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkKCBzaXBBdXRoZW50aWNhdGUsIE1TR19CUldfTEFTVF9DSElMRCwgYTIgKSApOworCQkJCQkJCQl9CisJCQkJCQkJCS8vIEFkZCB0aGUgRGlnZXN0IEFsZ29yaXRobSBBVlAgCisJCQkJCQkJCXsKKwkJCQkJCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBzaXBfZGljdC5EaWdlc3RfQWxnb3JpdGhtLCAwLCAmYTIgKSApOworCQkJCQkJCQkJdmFsLm9zLmRhdGE9Ik1ENSI7CisJCQkJCQkJCQl2YWwub3MubGVuPXN0cmxlbih2YWwub3MuZGF0YSk7CisJCQkJCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUoIGEyLCAmdmFsICkgKTsKKwkJCQkJCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQoIHNpcEF1dGhlbnRpY2F0ZSwgTVNHX0JSV19MQVNUX0NISUxELCBhMiApICk7CisJCQkJCQkJCisJCQkJCQkJCX0KKwkJCQkJCQkJLy8gQWRkIHRoZSBEaWdlc3QgUmVhbG0gQVZQIAorCQkJCQkJCQl7CisJCQkJCQkJCQl0ZW1wYXZwPWF2cDsKKwkJCQkJCQkJCisJCQkJCQkJCQlhdnBoZWFkZXJfYXV0aD13YWxrX2RpZ2VzdCh0ZW1wYXZwLCAxMDQpOworCQkJCQkJCQkJaWYoYXZwaGVhZGVyX2F1dGghPU5VTEwpCisJCQkJCQkJCQl7CisJCQkJCQkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIHNpcF9kaWN0LkRpZ2VzdF9SZWFsbSwgMCwgJmEyICkgKTsKKwkJCQkJCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUoIGEyLCBhdnBoZWFkZXJfYXV0aC0+YXZwX3ZhbHVlICkgKTsKKwkJCQkJCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkKCBzaXBBdXRoZW50aWNhdGUsIE1TR19CUldfTEFTVF9DSElMRCwgYTIgKSApOworCQkJCQkJCQkKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCisJCQkJCQkKKwkJCQkJCQkJLy9XZSBhZGQgU0lQIEF1dGhlbnRpY2F0ZSB0byBBdXRoIERhdGEgSXRlbQorCQkJCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkKCBhdXRoZGF0YWl0ZW0sIE1TR19CUldfTEFTVF9DSElMRCwgc2lwQXV0aGVudGljYXRlICkgKTsKKwkJCQkJCQkJLy9XZSBhZGQgQXV0aCBEYXRhIEl0ZW0gdG8gQW5zd2VyCisJCQkJCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQoIGFucywgTVNHX0JSV19MQVNUX0NISUxELCBhdXRoZGF0YWl0ZW0gKSApOworCQkJCQkJCisJCQkJCQkJCW51bWJlcl9vZl9hdXRoX2l0ZW1zKys7CisJCQkJCQkJCWlmKHNpcHVyaW5vdHN0b3JlZCkKKwkJCQkJCQkJCXJlc3VsdD0iRElBTUVURVJfU1VDQ0VTU19BVVRIX1NFTlRfU0VSVkVSX05PVF9TVE9SRUQiOworCQkJCQkJCQllbHNlCisJCQkJCQkJCQlyZXN1bHQ9IkRJQU1FVEVSX01VTFRJX1JPVU5EX0FVVEgiOworCQkJCQkJCQlmb3VuZF9jbm9uY2U9MDsKKwkJCQkJCQl9CisJCQkJCQkJZWxzZQorCQkJCQkJCXsKKwkJCQkJCQkJLy8KKwkJCQkJCQkJV2UgYXJlIGluIHRoZSBjYXNlIG9mIGFjY2VzcyByZXF1ZXN0IGFmdGVyIGNoYWxsZW5nZSBzbyB3ZSBuZWVkIHRvIGNoZWNrIGNyZWRlbnRpYWxzLgorCQkJCQkJCQkKKwkJCQkJCQkJVFJBQ0VfREVCVUcoRlVMTCwiQXV0aGVudGljYXRpb24gYWZ0ZXIgY2hhbGxlbmdlIik7CisJCQkJCQkJCQorCQkJCQkJCQkvLyBTZWFyY2ggdGhlIHNlc3Npb24sIHJldHJpZXZlIGl0cyBkYXRhIAorCQkJCQkJCQl7CisJCQkJCQkJCQkvL2ludCBuZXc9MDsKKwkJCQkJCQkJCQorCQkJCQkJCQkJLy9UUkFDRV9ERUJVRyhGVUxMLCJuZXc6IColZCoiLG5ldyk7CisJCQkJCQkJCQkvL0FTU0VSVCggbmV3ID09IDAgKTsKKwkJCQkJCQkJCUNIRUNLX0ZDVCggZmRfc2Vzc19zdGF0ZV9yZXRyaWV2ZSggZHNfc2Vzc19oZGwsIHNlc3MsICZzdG9yZWRub25jZSApKTsKKwkJCQkJCQkJCWlmKHN0b3JlZG5vbmNlID09TlVMTCkKKwkJCQkJCQkJCXsKKwkJCQkJCQkJCQlyZXN1bHQ9IkRJQU1FVEVSX1VOQUJMRV9UT19DT01QTFkiOworCQkJCQkJCQkJCQkJCisJCQkJCQkJCQkJaWYodXNlcm5hbWUhPU5VTEwpCisJCQkJCQkJCQkJCWZyZWUodXNlcm5hbWUpOworCQkJCQkJCQkJCWdvdG8gb3V0OworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJCQorCQkJCQkJCQkvLyBDcmVhdGUgdGhlIFNJUC1BdXRoZW50aWNhdGlvbi1JbmZvIEFWUCAKKwkJCQkJCQkJeworCQkJCQkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIHNpcF9kaWN0LlNJUF9BdXRoZW50aWNhdGlvbl9JbmZvLCAwLCAmc2lwQXV0aGVudGljYXRpb24gKSApOworCQkJCQkJCQl9CisJCQkJCQkJCQorCQkJCQkJCQkKKwkJCQkJCQkKKwkJCQkJCQkJLy8gQWRkIHRoZSBEaWdlc3QgcmVzcG9uc2UgQXV0aCBBVlAgCisJCQkJCQkJCXsKKwkJCQkJCQkJCS8vdWludDhfdCBidWZmZXJyZXNwW0RJR0VTVF9MRU5dOworCQkJCQkJCQkJLy9jaGFyIHJlc3BvbnNlW0RJR0VTVF9MRU4qMisxXTsKKwkJCQkJCQkJCWludCBpPTA7CisJCQkJCQkJCQkKKwkJCQkJCQkJCS8vV2UgZXh0cmFjdCBhbGwgdGhlIGRhdGEgd2UgbmVlZAorCQkJCQkJCQkJdGVtcGF2cD1hdnA7CisJCQkJCQkJCQkKKwkJCQkJCQkJCWNoYXIgKiBkaWdlc3RfdXNlcm5hbWU9TlVMTCwgKmRpZ2VzdF91cmk9TlVMTCwgKmRpZ2VzdF9yZXNwb25zZT1OVUxMLCAqZGlnZXN0X3JlYWxtPU5VTEwsICpkaWdlc3Rfbm9uY2U9TlVMTCwgKmRpZ2VzdF9tZXRob2Q9TlVMTCwgKmRpZ2VzdF9xb3A9TlVMTCwgKmRpZ2VzdF9hbGdvcml0aG09TlVMTCwgKmRpZ2VzdF9jbm9uY2U9TlVMTCwgKmRpZ2VzdF9ub25jZWNvdW50PU5VTEw7CisJCQkJCQkJCQkKKwkJCQkJCQkJCQorCQkJCQkJCQkJQ0hFQ0tfRkNUKGZkX2F2cF9zZWFyY2hfYXZwIChhdnAsIHNpcF9kaWN0LkRpZ2VzdF9Ob25jZSwgJmEyICkpOworCQkJCQkJCQkJaWYoYTIhPU5VTEwpCisJCQkJCQkJCQl7CisJCQkJCQkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2hkciggYTIsICZkaWdlc3RoZWFkZXIgKSAgKTsKKwkJCQkJCQkJCQlpZihkaWdlc3RoZWFkZXIhPU5VTEwpCisJCQkJCQkJCQkJeworCQkJCQkJCQkJCQkKKwkJCQkJCQkJCQkJZGlnZXN0X25vbmNlID0gbWFsbG9jKGRpZ2VzdGhlYWRlci0+YXZwX3ZhbHVlLT5vcy5sZW4gKyAxKTsKKwkJCQkJCQkJCQkJbWVtY3B5KGRpZ2VzdF9ub25jZSwgZGlnZXN0aGVhZGVyLT5hdnBfdmFsdWUtPm9zLmRhdGEsCisJCQkJCQkJCQkJCWRpZ2VzdGhlYWRlci0+YXZwX3ZhbHVlLT5vcy5sZW4pOworCQkJCQkJCQkJCQlkaWdlc3Rfbm9uY2VbZGlnZXN0aGVhZGVyLT5hdnBfdmFsdWUtPm9zLmxlbl09J1wwJzsKKwkJCQkJCQkJCQkJVFJBQ0VfREVCVUcoRlVMTCwiRWxlbWVudDoqJXMqIixkaWdlc3Rfbm9uY2UpOwkKKwkJCQkJCQkJCQkJVFJBQ0VfREVCVUcoRlVMTCwiU3RvcmVkIE5vbmNlOiolcyoiLHN0b3JlZG5vbmNlLT5ub25jZSk7CisJCQkJCQkJCQkJCQorCQkJCQkJCQkJCQlpZihzdHJjbXAoZGlnZXN0X25vbmNlLHN0b3JlZG5vbmNlLT5ub25jZSkhPTApCisJCQkJCQkJCQkJCXsKKwkJCQkJCQkJCQkJCWZyZWUoZGlnZXN0X25vbmNlKTsKKwkJCQkJCQkJCQkJCWZyZWUoc3RvcmVkbm9uY2UtPm5vbmNlKTsKKwkJCQkJCQkJCQkJCWZyZWUoc3RvcmVkbm9uY2UpOworCQkJCQkJCQkJCQkJcmVzdWx0PSJESUFNRVRFUl9VTkFCTEVfVE9fQ09NUExZIjsKKwkJCQkJCQkJCQkJCQorCQkJCQkJCQkJCQkJaWYodXNlcm5hbWUhPU5VTEwpCisJCQkJCQkJCQkJCQkJZnJlZSh1c2VybmFtZSk7CisJCQkJCQkJCQkJCQlnb3RvIG91dDsKKwkJCQkJCQkJCQkJfQorCQkJCQkJCQkJCQkKKwkJCQkJCQkJCQl9CisJCQkJCQkJCQkJCQorCQkJCQkJCQkJfQorCQkJCQkJCQkJQ0hFQ0tfRkNUKGZkX2F2cF9zZWFyY2hfYXZwIChhdnAsIHNpcF9kaWN0LkRpZ2VzdF9SZXNwb25zZSwgJmEyICkpOworCQkJCQkJCQkJaWYoYTIhPU5VTEwpCisJCQkJCQkJCQl7CisJCQkJCQkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2hkciggYTIsICZkaWdlc3RoZWFkZXIgKSAgKTsKKwkJCQkJCQkJCQlpZihkaWdlc3RoZWFkZXIhPU5VTEwpCisJCQkJCQkJCQkJeworCQkJCQkJCQkJCQlkaWdlc3RfcmVzcG9uc2UgPSBtYWxsb2MoZGlnZXN0aGVhZGVyLT5hdnBfdmFsdWUtPm9zLmxlbiArIDEpOworCQkJCQkJCQkJCQltZW1jcHkoZGlnZXN0X3Jlc3BvbnNlLCBkaWdlc3RoZWFkZXItPmF2cF92YWx1ZS0+b3MuZGF0YSwKKwkJCQkJCQkJCQkJZGlnZXN0aGVhZGVyLT5hdnBfdmFsdWUtPm9zLmxlbik7CisJCQkJCQkJCQkJCWRpZ2VzdF9yZXNwb25zZVtkaWdlc3RoZWFkZXItPmF2cF92YWx1ZS0+b3MubGVuXT0nXDAnOworCQkJCQkJCQkJCQlUUkFDRV9ERUJVRyhGVUxMLCJFbGVtZW50OiolcyoiLGRpZ2VzdF9yZXNwb25zZSk7CQorCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQkKKwkJCQkJCQkJCX0KKwkJCQkJCQkJCUNIRUNLX0ZDVChmZF9hdnBfc2VhcmNoX2F2cCAoYXZwLCBzaXBfZGljdC5EaWdlc3RfUmVhbG0sICZhMiApKTsKKwkJCQkJCQkJCWlmKGEyIT1OVUxMKQorCQkJCQkJCQkJeworCQkJCQkJCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9oZHIoIGEyLCAmZGlnZXN0aGVhZGVyICkgICk7CisJCQkJCQkJCQkJaWYoZGlnZXN0aGVhZGVyIT1OVUxMKQorCQkJCQkJCQkJCXsKKwkJCQkJCQkJCQkJZGlnZXN0X3JlYWxtID0gbWFsbG9jKGRpZ2VzdGhlYWRlci0+YXZwX3ZhbHVlLT5vcy5sZW4gKyAxKTsKKwkJCQkJCQkJCQkJbWVtY3B5KGRpZ2VzdF9yZWFsbSwgZGlnZXN0aGVhZGVyLT5hdnBfdmFsdWUtPm9zLmRhdGEsCisJCQkJCQkJCQkJCWRpZ2VzdGhlYWRlci0+YXZwX3ZhbHVlLT5vcy5sZW4pOworCQkJCQkJCQkJCQlkaWdlc3RfcmVhbG1bZGlnZXN0aGVhZGVyLT5hdnBfdmFsdWUtPm9zLmxlbl09J1wwJzsKKwkJCQkJCQkJCQkJVFJBQ0VfREVCVUcoRlVMTCwiRWxlbWVudDoqJXMqIixkaWdlc3RfcmVhbG0pOwkKKwkJCQkJCQkJCQl9CisJCQkJCQkJCQl9CisJCQkJCQkJCQkKKwkJCQkJCQkJCUNIRUNLX0ZDVChmZF9hdnBfc2VhcmNoX2F2cCAoYXZwLCBzaXBfZGljdC5EaWdlc3RfTWV0aG9kLCAmYTIgKSk7CisJCQkJCQkJCQlpZihhMiE9TlVMTCkKKwkJCQkJCQkJCXsKKwkJCQkJCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfaGRyKCBhMiwgJmRpZ2VzdGhlYWRlciApICApOworCQkJCQkJCQkJCWlmKGRpZ2VzdGhlYWRlciE9TlVMTCkKKwkJCQkJCQkJCQl7CisJCQkJCQkJCQkJCWRpZ2VzdF9tZXRob2QgPSBtYWxsb2MoZGlnZXN0aGVhZGVyLT5hdnBfdmFsdWUtPm9zLmxlbiArIDEpOworCQkJCQkJCQkJCQltZW1jcHkoZGlnZXN0X21ldGhvZCwgZGlnZXN0aGVhZGVyLT5hdnBfdmFsdWUtPm9zLmRhdGEsCisJCQkJCQkJCQkJCWRpZ2VzdGhlYWRlci0+YXZwX3ZhbHVlLT5vcy5sZW4pOworCQkJCQkJCQkJCQlkaWdlc3RfbWV0aG9kW2RpZ2VzdGhlYWRlci0+YXZwX3ZhbHVlLT5vcy5sZW5dPSdcMCc7CisJCQkJCQkJCQkJCVRSQUNFX0RFQlVHKEZVTEwsIkVsZW1lbnQ6KiVzKiIsZGlnZXN0X21ldGhvZCk7CQorCQkJCQkJCQkJCX0KKwkJCQkJCQkJCX0KKwkJCQkJCQkJCWVsc2UKKwkJCQkJCQkJCQlkaWdlc3RfbWV0aG9kPSIiOworCQkJCQkJCQkJCisJCQkJCQkJCQlDSEVDS19GQ1QoZmRfYXZwX3NlYXJjaF9hdnAgKGF2cCwgc2lwX2RpY3QuRGlnZXN0X1VSSSwgJmEyICkpOworCQkJCQkJCQkJaWYoYTIhPU5VTEwpCisJCQkJCQkJCQl7CisJCQkJCQkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2hkciggYTIsICZkaWdlc3RoZWFkZXIgKSAgKTsKKwkJCQkJCQkJCQlpZihkaWdlc3RoZWFkZXIhPU5VTEwpCisJCQkJCQkJCQkJeworCQkJCQkJCQkJCQlkaWdlc3RfdXJpID0gbWFsbG9jKGRpZ2VzdGhlYWRlci0+YXZwX3ZhbHVlLT5vcy5sZW4gKyAxKTsKKwkJCQkJCQkJCQkJbWVtY3B5KGRpZ2VzdF91cmksIGRpZ2VzdGhlYWRlci0+YXZwX3ZhbHVlLT5vcy5kYXRhLAorCQkJCQkJCQkJCQlkaWdlc3RoZWFkZXItPmF2cF92YWx1ZS0+b3MubGVuKTsKKwkJCQkJCQkJCQkJZGlnZXN0X3VyaVtkaWdlc3RoZWFkZXItPmF2cF92YWx1ZS0+b3MubGVuXT0nXDAnOworCQkJCQkJCQkJCQlUUkFDRV9ERUJVRyhGVUxMLCJFbGVtZW50OiolcyoiLGRpZ2VzdF91cmkpOwkKKwkJCQkJCQkJCQl9CisJCQkJCQkJCQl9CisJCQkJCQkJCQkKKwkJCQkJCQkJCUNIRUNLX0ZDVChmZF9hdnBfc2VhcmNoX2F2cCAoYXZwLCBzaXBfZGljdC5EaWdlc3RfUU9QLCAmYTIgKSk7CisJCQkJCQkJCQlpZihhMiE9TlVMTCkKKwkJCQkJCQkJCXsKKwkJCQkJCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfaGRyKCBhMiwgJmRpZ2VzdGhlYWRlciApICApOworCQkJCQkJCQkJCWlmKGRpZ2VzdGhlYWRlciE9TlVMTCkKKwkJCQkJCQkJCQl7CisJCQkJCQkJCQkJCWRpZ2VzdF9xb3AgPSBtYWxsb2MoZGlnZXN0aGVhZGVyLT5hdnBfdmFsdWUtPm9zLmxlbiArIDEpOworCQkJCQkJCQkJCQltZW1jcHkoZGlnZXN0X3FvcCwgZGlnZXN0aGVhZGVyLT5hdnBfdmFsdWUtPm9zLmRhdGEsCisJCQkJCQkJCQkJCWRpZ2VzdGhlYWRlci0+YXZwX3ZhbHVlLT5vcy5sZW4pOworCQkJCQkJCQkJCQlkaWdlc3RfcW9wW2RpZ2VzdGhlYWRlci0+YXZwX3ZhbHVlLT5vcy5sZW5dPSdcMCc7CisJCQkJCQkJCQkJCVRSQUNFX0RFQlVHKEZVTEwsIkVsZW1lbnQ6KiVzKiIsZGlnZXN0X3FvcCk7CQorCQkJCQkJCQkJCX0KKwkJCQkJCQkJCX0KKwkJCQkJCQkJCWVsc2UKKwkJCQkJCQkJCQlkaWdlc3RfcW9wPU5VTEw7CisJCQkJCQkJCQlDSEVDS19GQ1QoZmRfYXZwX3NlYXJjaF9hdnAgKGF2cCwgc2lwX2RpY3QuRGlnZXN0X0FsZ29yaXRobSwgJmEyICkpOworCQkJCQkJCQkJaWYoYTIhPU5VTEwpCisJCQkJCQkJCQl7CisJCQkJCQkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2hkciggYTIsICZkaWdlc3RoZWFkZXIgKSAgKTsKKwkJCQkJCQkJCQlpZihkaWdlc3RoZWFkZXIhPU5VTEwpCisJCQkJCQkJCQkJeworCQkJCQkJCQkJCQlkaWdlc3RfYWxnb3JpdGhtID0gbWFsbG9jKGRpZ2VzdGhlYWRlci0+YXZwX3ZhbHVlLT5vcy5sZW4gKyAxKTsKKwkJCQkJCQkJCQkJbWVtY3B5KGRpZ2VzdF9hbGdvcml0aG0sIGRpZ2VzdGhlYWRlci0+YXZwX3ZhbHVlLT5vcy5kYXRhLAorCQkJCQkJCQkJCQlkaWdlc3RoZWFkZXItPmF2cF92YWx1ZS0+b3MubGVuKTsKKwkJCQkJCQkJCQkJZGlnZXN0X2FsZ29yaXRobVtkaWdlc3RoZWFkZXItPmF2cF92YWx1ZS0+b3MubGVuXT0nXDAnOworCQkJCQkJCQkJCQlUUkFDRV9ERUJVRyhGVUxMLCJFbGVtZW50OiolcyoiLGRpZ2VzdF9hbGdvcml0aG0pOwkKKwkJCQkJCQkJCQl9CisJCQkJCQkJCQl9CisJCQkJCQkJCQllbHNlCisJCQkJCQkJCQkJZGlnZXN0X2FsZ29yaXRobT1OVUxMOworCQkJCQkJCQkJQ0hFQ0tfRkNUKGZkX2F2cF9zZWFyY2hfYXZwIChhdnAsIHNpcF9kaWN0LkRpZ2VzdF9DTm9uY2UsICZhMiApKTsKKwkJCQkJCQkJCWlmKGEyIT1OVUxMKQorCQkJCQkJCQkJeworCQkJCQkJCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9oZHIoIGEyLCAmZGlnZXN0aGVhZGVyICkgICk7CisJCQkJCQkJCQkJaWYoZGlnZXN0aGVhZGVyIT1OVUxMKQorCQkJCQkJCQkJCXsKKwkJCQkJCQkJCQkJZGlnZXN0X2Nub25jZSA9IG1hbGxvYyhkaWdlc3RoZWFkZXItPmF2cF92YWx1ZS0+b3MubGVuICsgMSk7CisJCQkJCQkJCQkJCW1lbWNweShkaWdlc3RfY25vbmNlLCBkaWdlc3RoZWFkZXItPmF2cF92YWx1ZS0+b3MuZGF0YSwKKwkJCQkJCQkJCQkJZGlnZXN0aGVhZGVyLT5hdnBfdmFsdWUtPm9zLmxlbik7CisJCQkJCQkJCQkJCWRpZ2VzdF9jbm9uY2VbZGlnZXN0aGVhZGVyLT5hdnBfdmFsdWUtPm9zLmxlbl09J1wwJzsKKwkJCQkJCQkJCQkJVFJBQ0VfREVCVUcoRlVMTCwiRWxlbWVudDoqJXMqIixkaWdlc3RfY25vbmNlKTsJCisJCQkJCQkJCQkJfQorCQkJCQkJCQkJfQorCQkJCQkJCQkJZWxzZQorCQkJCQkJCQkJCWRpZ2VzdF9jbm9uY2U9IiI7CisJCQkJCQkJCQlDSEVDS19GQ1QoZmRfYXZwX3NlYXJjaF9hdnAgKGF2cCwgc2lwX2RpY3QuRGlnZXN0X05vbmNlX0NvdW50LCAmYTIgKSk7CisJCQkJCQkJCQlpZihhMiE9TlVMTCkKKwkJCQkJCQkJCXsKKwkJCQkJCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfaGRyKCBhMiwgJmRpZ2VzdGhlYWRlciApICApOworCQkJCQkJCQkJCWlmKGRpZ2VzdGhlYWRlciE9TlVMTCkKKwkJCQkJCQkJCQl7CisJCQkJCQkJCQkJCWRpZ2VzdF9ub25jZWNvdW50ID0gbWFsbG9jKGRpZ2VzdGhlYWRlci0+YXZwX3ZhbHVlLT5vcy5sZW4gKyAxKTsKKwkJCQkJCQkJCQkJbWVtY3B5KGRpZ2VzdF9ub25jZWNvdW50LCBkaWdlc3RoZWFkZXItPmF2cF92YWx1ZS0+b3MuZGF0YSwKKwkJCQkJCQkJCQkJZGlnZXN0aGVhZGVyLT5hdnBfdmFsdWUtPm9zLmxlbik7CisJCQkJCQkJCQkJCWRpZ2VzdF9ub25jZWNvdW50W2RpZ2VzdGhlYWRlci0+YXZwX3ZhbHVlLT5vcy5sZW5dPSdcMCc7CisJCQkJCQkJCQkJCVRSQUNFX0RFQlVHKEZVTEwsIkVsZW1lbnQ6KiVzKiIsZGlnZXN0X25vbmNlY291bnQpOwkKKwkJCQkJCQkJCQl9CisJCQkJCQkJCQl9CisJCQkJCQkJCQllbHNlCisJCQkJCQkJCQkJZGlnZXN0X25vbmNlY291bnQ9IiI7CisJCQkJCQkJCQlDSEVDS19GQ1QoZmRfYXZwX3NlYXJjaF9hdnAgKGF2cCwgc2lwX2RpY3QuRGlnZXN0X1VzZXJuYW1lLCAmYTIgKSk7CisJCQkJCQkJCQlpZihhMiE9TlVMTCkKKwkJCQkJCQkJCXsKKwkJCQkJCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfaGRyKCBhMiwgJmRpZ2VzdGhlYWRlciApICApOworCQkJCQkJCQkJCWlmKGRpZ2VzdGhlYWRlciE9TlVMTCkKKwkJCQkJCQkJCQl7CisJCQkJCQkJCQkJCWRpZ2VzdF91c2VybmFtZSA9IG1hbGxvYyhkaWdlc3RoZWFkZXItPmF2cF92YWx1ZS0+b3MubGVuICsgMSk7CisJCQkJCQkJCQkJCW1lbWNweShkaWdlc3RfdXNlcm5hbWUsIGRpZ2VzdGhlYWRlci0+YXZwX3ZhbHVlLT5vcy5kYXRhLAorCQkJCQkJCQkJCQlkaWdlc3RoZWFkZXItPmF2cF92YWx1ZS0+b3MubGVuKTsKKwkJCQkJCQkJCQkJZGlnZXN0X3VzZXJuYW1lW2RpZ2VzdGhlYWRlci0+YXZwX3ZhbHVlLT5vcy5sZW5dPSdcMCc7CisJCQkJCQkJCQkJCVRSQUNFX0RFQlVHKEZVTEwsIkVsZW1lbnQ6KiVzKiIsZGlnZXN0X3VzZXJuYW1lKTsJCisJCQkJCQkJCQkJfQorCQkJCQkJCQkJfQorCQkJCQkJCQkJLy9UT0RPOiByZXBsYWNlIGJ5IGF1dGhlbnRpY2F0aW9uIGZ1bmN0aW9uCisJCQkJCQkJCQkKKwkJCQkJCQkJCUhBU0hIRVggSEExOworCQkJCQkJCQkJSEFTSEhFWCBIQTIgPSAiIjsKKwkJCQkJCQkJCUhBU0hIRVggcmVzcG9uc2UsIHJlc3BvbnNlYXV0aDsKKworCQkJCQkJCQkJCisJCQkJCQkJCQlEaWdlc3RDYWxjSEExKGRpZ2VzdF9hbGdvcml0aG0sIGRpZ2VzdF91c2VybmFtZSwgZGlnZXN0X3JlYWxtLCBwYXNzd29yZCwgZGlnZXN0X25vbmNlLGRpZ2VzdF9jbm9uY2UsIEhBMSk7CisJCQkJCQkJCQkKKyAgICAgIAkJCQkJCQlEaWdlc3RDYWxjUmVzcG9uc2UoSEExLCBkaWdlc3Rfbm9uY2UsIGRpZ2VzdF9ub25jZWNvdW50LCBkaWdlc3RfY25vbmNlLCBkaWdlc3RfcW9wLGRpZ2VzdF9tZXRob2QsIGRpZ2VzdF91cmksIEhBMiwgcmVzcG9uc2UpOworICAgICAgCQkJCQkJCQkJCisJCQorCQkJCQkJCQkJLy8gV2UgY2hlY2sgdGhhdCB0aGUgRGlnZXN0LVJlc3BvbnNlIGlzIHRoZSBzYW1lIChVQSwgRGlhbWV0ZXIpCisJCQkJCQkJCQlpZihzdHJjbXAocmVzcG9uc2UsZGlnZXN0X3Jlc3BvbnNlKSE9MCkKKwkJCQkJCQkJCXsKKwkJCQkJCQkJCQlUUkFDRV9ERUJVRyhGVUxMLCJSZXNwb25zZSBjYWxjdWxhdGVkIGJ5IERpYW1ldGVyIHNlcnZlcjolcyIscmVzcG9uc2UpOworCQkJCQkJCQkJCVRSQUNFX0RFQlVHKEZVTEwsIlJlc3BvbnNlIGNhbGN1bGF0ZWQgYnkgVUE6JXMiLGRpZ2VzdF9yZXNwb25zZSk7CisJCQkJCQkJCQkJVFJBQ0VfREVCVUcoSU5GTywiRGlnZXN0LVJlc3BvbnNlIGRvZXMgbm90IG1hdGNoISIpOworCQkJCQkJCQkJCXJlc3VsdD0iRElBTUVURVJfVU5BQkxFX1RPX0NPTVBMWSI7CisJCQkJCQkJCQkJZnJlZShkaWdlc3RfYWxnb3JpdGhtKTsKKwkJCQkJCQkJCQlmcmVlKGRpZ2VzdF9jbm9uY2UpOworCQkJCQkJCQkJCWZyZWUoZGlnZXN0X25vbmNlKTsKKwkJCQkJCQkJCQlmcmVlKGRpZ2VzdF9ub25jZWNvdW50KTsKKwkJCQkJCQkJCQlmcmVlKGRpZ2VzdF9tZXRob2QpOworCQkJCQkJCQkJCWZyZWUoZGlnZXN0X3VzZXJuYW1lKTsKKwkJCQkJCQkJCQlmcmVlKGRpZ2VzdF91cmkpOworCQkJCQkJCQkJCWZyZWUoZGlnZXN0X3FvcCk7CisJCQkJCQkJCQkJZnJlZShkaWdlc3RfcmVzcG9uc2UpOworCQkJCQkJCQkJCWZyZWUoZGlnZXN0X3JlYWxtKTsKKwkJCQkJCQkJCQlmcmVlKHN0b3JlZG5vbmNlLT5ub25jZSk7CisJCQkJCQkJCQkJZnJlZShzdG9yZWRub25jZSk7CisJCQkJCQkJCQkJaWYodXNlcm5hbWUhPU5VTEwpCisJCQkJCQkJCQkJCWZyZWUodXNlcm5hbWUpOworCQkJCQkJCQkJCWdvdG8gb3V0OworCQkJCQkJCQkJCQorCQkJCQkJCQkJfQorCQkJCQkJCQkJLy9XZSBjYWxjdWxhdGUgRGlnZXN0X1Jlc3BvbnNlX0F1dGgKKwkJCQkJCQkJCURpZ2VzdENhbGNSZXNwb25zZUF1dGgoSEExLCBkaWdlc3Rfbm9uY2UsIGRpZ2VzdF9ub25jZWNvdW50LCBkaWdlc3RfY25vbmNlLCBkaWdlc3RfcW9wLGRpZ2VzdF9tZXRob2QsIGRpZ2VzdF91cmksIEhBMiwgcmVzcG9uc2VhdXRoKTsKKwkJCQkJCQkJCQorCQkJCQkJCQkJVFJBQ0VfREVCVUcoRlVMTCwiUmVzcG9uc2UgY2FsY3VsYXRlZCBieSBEaWFtZXRlciBzZXJ2ZXI6JXMiLHJlc3BvbnNlKTsKKwkJCQkJCQkJCQlUUkFDRV9ERUJVRyhGVUxMLCJSZXNwb25zZSBjYWxjdWxhdGVkIGJ5IFVBOiVzIixkaWdlc3RfcmVzcG9uc2UpOworCQkJCQkJCQkJaWYoc3RyY21wKGRpZ2VzdF9xb3AsImF1dGgtaW50Iik9PTApCisJCQkJCQkJCQl7CisJCQkJCQkJCQkJLy9EaWdlc3QtSEExIE1VU1QgYmUgdXNlZCBpbnN0ZWFkIG9mIERpZ2VzdC1SZXNwb25zZS1BdXRoIGlmIERpZ2VzdC1Rb3AgaXMgJ2F1dGgtaW50Jy4KKwkJCQkJCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3ICggc2lwX2RpY3QuRGlnZXN0X0hBMSwgMCwgJmEyICkgKTsKKwkJCQkJCQkJCQl2YWwub3MuZGF0YT1IQTE7CisJCQkJCQkJCQkJdmFsLm9zLmxlbj1IQVNISEVYTEVOKzE7CisJCQkJCQkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX3NldHZhbHVlKCBhMiwgJnZhbCApICk7CisJCQkJCQkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCggc2lwQXV0aGVudGljYXRpb24sIE1TR19CUldfTEFTVF9DSElMRCwgYTIgKSApOworCQkJCQkJCQkJfQorCQkJCQkJCQkJZWxzZQorCQkJCQkJCQkJeworCQkJCQkJCQkJCS8vRGlnZXN0LVJlc3BvbnNlLUF1dGggTVVTVCBiZSB1c2VkIGluc3RlYWQgb2YgRGlnZXN0LUhBMSBpZiBEaWdlc3QtUW9wIGlzICdhdXRoJy4KKwkJCQkJCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3ICggc2lwX2RpY3QuRGlnZXN0X1Jlc3BvbnNlX0F1dGgsIDAsICZhMiApICk7CisJCQkJCQkJCQkJdmFsLm9zLmRhdGE9cmVzcG9uc2VhdXRoOworCQkJCQkJCQkJCXZhbC5vcy5sZW49RElHRVNUX0xFTioyOworCQkJCQkJCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9zZXR2YWx1ZSggYTIsICZ2YWwgKSApOworCQkJCQkJCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQoIHNpcEF1dGhlbnRpY2F0aW9uLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGEyICkgKTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJCWZyZWUoZGlnZXN0X2FsZ29yaXRobSk7CisJCQkJCQkJCQlmcmVlKGRpZ2VzdF9jbm9uY2UpOworCQkJCQkJCQkJZnJlZShkaWdlc3Rfbm9uY2UpOworCQkJCQkJCQkJZnJlZShkaWdlc3Rfbm9uY2Vjb3VudCk7CisJCQkJCQkJCQlmcmVlKGRpZ2VzdF9tZXRob2QpOworCQkJCQkJCQkJZnJlZShkaWdlc3RfdXNlcm5hbWUpOworCQkJCQkJCQkJZnJlZShkaWdlc3RfdXJpKTsKKwkJCQkJCQkJCWZyZWUoZGlnZXN0X3FvcCk7CisJCQkJCQkJCQlmcmVlKGRpZ2VzdF9yZXNwb25zZSk7CisJCQkJCQkJCQlmcmVlKGRpZ2VzdF9yZWFsbSk7CisJCQkJCQkJCQlmcmVlKHN0b3JlZG5vbmNlLT5ub25jZSk7CisJCQkJCQkJCQlmcmVlKHN0b3JlZG5vbmNlKTsKKwkJCQkJCQkJCisJCQkJCQkJCQludW1iZXJfb2ZfYXV0aF9pdGVtcysrOworCQkJCQkJCQl9CQorCQkJCQkJCQkKKwkJCQkJCQkJCisJCQkJCQkJCS8vV2UgYWRkIFNJUCBBdXRoZW50aWNhdGlvbi1JbmZvIHRvIEF1dGggRGF0YSBJdGVtCisJCQkJCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQoIGF1dGhkYXRhaXRlbSwgTVNHX0JSV19MQVNUX0NISUxELCBzaXBBdXRoZW50aWNhdGlvbiApICk7CisJCQkJCQkJCS8vV2UgYWRkIEF1dGggRGF0YSBJdGVtIHRvIEFuc3dlcgorCQkJCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkKCBhbnMsIE1TR19CUldfTEFTVF9DSElMRCwgYXV0aGRhdGFpdGVtICkgKTsKKwkJCQkJCQkJCisJCQkJCQkJCQorCQkJCQkJCQlpZih1c2VybmFtZSE9TlVMTCAmJiBhdXRoZW50aWNhdGlvbnBlbmRpbmcpCisJCQkJCQkJCXsKKwkJCQkJCQkJCS8vV2UgY2xlYXIgdGhlIGZsYWcgImF1dGhlbnRpY2F0aW9uIHBlbmRpbmciCisJCQkJCQkJCQlxdWVyeWxlbj1TUUxfQ0xFQVJGTEFHX0xFTiArIHVzZXJuYW1lbGVuOworCQkJCQkJCQkJcXVlcnkgPSBtYWxsb2MocXVlcnlsZW4rMik7CisJCQkJCQkJCQlzbnByaW50ZihxdWVyeSwgcXVlcnlsZW4rMSwgU1FMX0NMRUFSRkxBRywgdXNlcm5hbWUpOworCQkKKwkJCQkJCQkJCS8vV2UgbWFrZSB0aGUgcXVlcnkKKwkJCQkJCQkJCXJlcXVlc3RfbXlzcWwocXVlcnkpOworCQkJCQorCQkJCQkgICAgICAJCQkJZnJlZShxdWVyeSk7CisJCQkJCQkJCX0KKwkJCQkJCQkJCisJCQkJCQkJCWlmKHNpcHVyaW5vdHN0b3JlZCkKKwkJCQkJCQkJCXJlc3VsdD0iRElBTUVURVJfU1VDQ0VTU19TRVJWRVJfTkFNRV9OT1RfU1RPUkVEIjsKKwkJCQkJCQkJZWxzZQorCQkJCQkJCQkJcmVzdWx0PSJESUFNRVRFUl9TVUNDRVNTIjsKKwkJCQkJCQkJZm91bmRfY25vbmNlPTA7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJCVRSQUNFX0RFQlVHKElORk8sIk5vIGF1dGggZGF0YSBpdGVtcyEiKTsKKwkJCQl9CisJCQkJLy9BZGQgU0lQX051bWJlcl9BdXRoX0l0ZW1zICBBVlAgCisJCQkJeworCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3ICggc2lwX2RpY3QuU0lQX051bWJlcl9BdXRoX0l0ZW1zLCAwLCAmYXZwICkgKTsKKwkJCQkJdmFsLmkzMiA9IG51bWJlcl9vZl9hdXRoX2l0ZW1zOworCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUgKCBhdnAsICZ2YWwgKSApOworCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkICggYW5zLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCkgKTsKKwkJCQl9CisJCQkJCisJCQkJCisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJVFJBQ0VfREVCVUcoSU5GTywiV2Ugb25seSBzdXBwb3J0IERJR0VTVCBmb3Igbm93LCB1bmFibGUgdG8gY29tcGx5Iik7CisJCQkJcmVzdWx0PSJESUFNRVRFUl9FUlJPUl9BVVRIX1NDSEVNRV9OT1RfU1VQUE9SVEVEIjsKKwkJCQlpZih1c2VybmFtZSE9TlVMTCkKKwkJCQkJZnJlZSh1c2VybmFtZSk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKwl9CisJZWxzZQorCXsKKwkJLy9UT0RPOiByZW1vdmUgdGhpcyBiZWNhdXNlIE51bWJlcl9BdXRoX0l0ZW1zIGlzIG5vdCBjb21wdWxzb3J5CisJCVRSQUNFX0RFQlVHKEZVTEwsIk51bWJlci1BdXRoLUl0ZW1zIGlzIG5vdCBpbmNsdWRlZC4iKTsKKwkJcmVzdWx0PSJESUFNRVRFUl9VTkFCTEVfVE9fQ09NUExZIjsKKwkJaWYodXNlcm5hbWUhPU5VTEwpCisJCQlmcmVlKHVzZXJuYW1lKTsKKwkJZ290byBvdXQ7CisJfQorCQorCWlmKHVzZXJuYW1lIT1OVUxMKQorCQlmcmVlKHVzZXJuYW1lKTsKKwkKKworb3V0OgorCS8vIFNldCB0aGUgT3JpZ2luLUhvc3QsIE9yaWdpbi1SZWFsbSwgUmVzdWx0LUNvZGUgQVZQcyAKKwlDSEVDS19GQ1QoIGZkX21zZ19yZXNjb2RlX3NldCggYW5zLCByZXN1bHQsIE5VTEwsIE5VTEwsIDEgKSApOworCQorCQorCS8vIFNlbmQgdGhlIGFuc3dlciAKKwlDSEVDS19GQ1QoIGZkX21zZ19zZW5kKCBtc2csIE5VTEwsIE5VTEwgKSApOworCQorKi8JCisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvdGVzdF9zaXAvcmVnaXN0cmF0aW9udGVybWluYXRpb24uYyBiL2V4dGVuc2lvbnMvdGVzdF9zaXAvcmVnaXN0cmF0aW9udGVybWluYXRpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Mjg2ZTczCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy90ZXN0X3NpcC9yZWdpc3RyYXRpb250ZXJtaW5hdGlvbi5jCkBAIC0wLDAgKzEsNDMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBBbGV4YW5kcmUgV2VzdGZhaGwgPGF3ZXN0ZmFobEBmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxMCwgQWxleGFuZHJlIFdlc3RmYWhsLCBUZXJhb2thIExhYm9yYXRvcnkgKEtlaW8gVW5pdmVyc2l0eSksIGFuZCB0aGUgV0lERSBQcm9qZWN0LiAJICoJCQorKgkJCQkJCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBUZXJhb2thIExhYm9yYXRvcnkgbm9yIHRoZSAJCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgVGVyYW9rYSBMYWJvcmF0b3J5IAkJCQkJCSAqCisqICAgCQkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAidGVzdF9zaXAuaCIKKworCitpbnQgdGVzdF9zaXBfUlRSX2NiKCBzdHJ1Y3QgbXNnICoqIG1zZywgc3RydWN0IGF2cCAqIHBhcmFtYXZwLCBzdHJ1Y3Qgc2Vzc2lvbiAqIHNlc3MsIHZvaWQgKiBvcGFxdWUsIGVudW0gZGlzcF9hY3Rpb24gKiBhY3QpCit7CisJCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9leHRlbnNpb25zL3Rlc3Rfc2lwL3NlcnZlcmFzc2lnbm1lbnQuYyBiL2V4dGVuc2lvbnMvdGVzdF9zaXAvc2VydmVyYXNzaWdubWVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4N2VkMjgKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL3Rlc3Rfc2lwL3NlcnZlcmFzc2lnbm1lbnQuYwpAQCAtMCwwICsxLDE2NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IEFsZXhhbmRyZSBXZXN0ZmFobCA8YXdlc3RmYWhsQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDEwLCBBbGV4YW5kcmUgV2VzdGZhaGwsIFRlcmFva2EgTGFib3JhdG9yeSAoS2VpbyBVbml2ZXJzaXR5KSwgYW5kIHRoZSBXSURFIFByb2plY3QuIAkgKgkJCisqCQkJCQkJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFRlcmFva2EgTGFib3JhdG9yeSBub3IgdGhlIAkJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBUZXJhb2thIExhYm9yYXRvcnkgCQkJCQkJICoKKyogICAJCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJ0ZXN0X3NpcC5oIgorCisvL0NhbGxlZCB0byBzZW5kIGEgVUFSCitpbnQgdGVzdF9zaXBfU0FSX2NiKCkKK3sKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBzYXJfbW9kZWw9TlVMTDsKKwlzdHJ1Y3QgbXNnICogbWVzc2FnZT1OVUxMOworCXN0cnVjdCBhdnAgKmF2cD1OVUxMOworCXVuaW9uIGF2cF92YWx1ZSB2YWx1ZTsKKwkKKwkvL0Zha2UgdmFsdWVzIFNUQVJUCisJY2hhciAqc2lwX2Fvcj0ic2lwOmF3LWxhcHB5QHRlcmEuaWNzLmtlaW8uYWMuanAiOworCXNpemVfdCBhb3JfbGVuPXN0cmxlbihzaXBfYW9yKTsgCisJY2hhciAqZGVzdGluYXRpb25fcmVhbG09InRlcmEuaWNzLmtlaW8uYWMuanAiOworCXNpemVfdCBkZXN0aW5hdGlvbl9yZWFsbWxlbj1zdHJsZW4oZGVzdGluYXRpb25fcmVhbG0pOworCWNoYXIgKmRlc3RpbmF0aW9uX2hvc3Q9InN1aWthLnRlcmEuaWNzLmtlaW8uYWMuanAiOworCXNpemVfdCBkZXN0aW5hdGlvbl9ob3N0bGVuPXN0cmxlbihkZXN0aW5hdGlvbl9ob3N0KTsKKwljaGFyICp1c2VybmFtZT0iYXctbGFwcHkiOworCXNpemVfdCB1c2VybmFtZWxlbj1zdHJsZW4odXNlcm5hbWUpOworCWNoYXIgKnNpcHNlcnZlcnVyaT0ic2lwOmljaGlnb0B0ZXJhLmljcy5rZWlvLmFjLmpwIjsKKwlzaXplX3Qgc2lwc2VydmVydXJpbGVuPXN0cmxlbihzaXBzZXJ2ZXJ1cmkpOworCS8vIGNoYXIgKnZpc2l0ZWRuZXR3b3JrPSJQaW5rIjsKKwkvL3NpemVfdCB2aXNpdGVkbmV0d29ya2xlbj1zdHJsZW4odmlzaXRlZG5ldHdvcmspOworCS8vaW50IHJlZ2lzdHJhdGlvbnR5cGUgPSAyOworCWludCBkYXRhX2FscmVhZHlfYXZhaWxhYmxlPTA7CisJaW50IGFzc2lnbm1lbnRfdHlwZT0wOworCS8vRmFrZSB2YWx1ZXMgU1RPUAorCQorCS8vQ3JlYXRlIHRoZSBiYXNlIG1lc3NhZ2UgZm9yIGFuIFJUUgorCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIlNlcnZlci1Bc3NpZ25tZW50LVJlcXVlc3QiLCAmc2FyX21vZGVsLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9tc2dfbmV3IChzYXJfbW9kZWwsIDAsICZtZXNzYWdlKSk7CisJCisJCisJCisJLy8gQ3JlYXRlIGEgbmV3IHNlc3Npb24gCisJeworCQlDSEVDS19GQ1QoIGZkX21zZ19uZXdfc2Vzc2lvbiggbWVzc2FnZSwgKG9zMF90KSJhcHBzaXAiLCBDT05TVFNUUkxFTigiYXBwc2lwIikgKSApOworCX0KKwkKKwkvL0FkZCB0aGUgQXV0aC1BcHBsaWNhdGlvbi1JZCAKKwl7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBzaXBfZGljdC5BdXRoX0FwcGxpY2F0aW9uX0lkLCAwLCAmYXZwICkgKTsKKwkJdmFsdWUuaTMyID0gNjsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX3NldHZhbHVlICggYXZwLCAmdmFsdWUgKSApOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkICggbWVzc2FnZSwgTVNHX0JSV19MQVNUX0NISUxELCBhdnApICk7CisJfQkKKwkvL0F1dGhfU2Vzc2lvbl9TdGF0ZQorCXsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIHNpcF9kaWN0LkF1dGhfU2Vzc2lvbl9TdGF0ZSwgMCwgJmF2cCApICk7CisJCXZhbHVlLmkzMj0xOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUoIGF2cCwgJnZhbHVlICkgKTsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCggbWVzc2FnZSwgTVNHX0JSV19MQVNUX0NISUxELCBhdnAgKSApOworCX0KKwkKKwkvL09yaWdpbl9Ib3N0ICYgT3JpZ2luX1JlYWxtCisJQ0hFQ0tfRkNUKCBmZF9tc2dfYWRkX29yaWdpbiAoIG1lc3NhZ2UsIDAgKSk7CisJCisJLy9EZXN0aW5hdGlvbl9Ib3N0CisJeworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3ICggc2lwX2RpY3QuRGVzdGluYXRpb25fSG9zdCwgMCwgJmF2cCApICk7CisJCXZhbHVlLm9zLmRhdGE9KHVuc2lnbmVkIGNoYXIgKilkZXN0aW5hdGlvbl9ob3N0OworCQl2YWx1ZS5vcy5sZW49ZGVzdGluYXRpb25faG9zdGxlbjsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX3NldHZhbHVlKCBhdnAsICZ2YWx1ZSApICk7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQoIG1lc3NhZ2UsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwICkgKTsKKwl9CisJLy9EZXN0aW5hdGlvbl9SZWFsbQorCXsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIHNpcF9kaWN0LkRlc3RpbmF0aW9uX1JlYWxtLCAwLCAmYXZwICkgKTsKKwkJdmFsdWUub3MuZGF0YT0odW5zaWduZWQgY2hhciAqKWRlc3RpbmF0aW9uX3JlYWxtOworCQl2YWx1ZS5vcy5sZW49ZGVzdGluYXRpb25fcmVhbG1sZW47CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9zZXR2YWx1ZSggYXZwLCAmdmFsdWUgKSApOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkKCBtZXNzYWdlLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCApICk7CisJfQorCQorCS8vU0lQX0FPUgorCXsKKwkJCisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBzaXBfZGljdC5TSVBfQU9SLCAwLCAmYXZwICkgKTsKKwkJdmFsdWUub3MuZGF0YT0odW5zaWduZWQgY2hhciAqKXNpcF9hb3I7CisJCXZhbHVlLm9zLmxlbj1hb3JfbGVuOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUoIGF2cCwgJnZhbHVlICkgKTsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCggbWVzc2FnZSwgTVNHX0JSV19MQVNUX0NISUxELCBhdnAgKSApOworCQkKKwl9CisJLy9Vc2VybmFtZQorCXsKKwkJCisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBzaXBfZGljdC5Vc2VyX05hbWUsIDAsICZhdnAgKSApOworCQl2YWx1ZS5vcy5kYXRhPSh1bnNpZ25lZCBjaGFyICopdXNlcm5hbWU7CisJCXZhbHVlLm9zLmxlbj11c2VybmFtZWxlbjsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX3NldHZhbHVlKCBhdnAsICZ2YWx1ZSApICk7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQoIG1lc3NhZ2UsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwICkgKTsKKwkJCisJfQorCS8vU0lQX1VzZXJfRGF0YV9BbHJlYWR5X0F2YWlsYWJsZQorCXsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIHNpcF9kaWN0LlNJUF9Vc2VyX0RhdGFfQWxyZWFkeV9BdmFpbGFibGUsIDAsICZhdnAgKSApOworCQl2YWx1ZS5pMzI9ZGF0YV9hbHJlYWR5X2F2YWlsYWJsZTsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX3NldHZhbHVlKCBhdnAsICZ2YWx1ZSApICk7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQoIG1lc3NhZ2UsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwICkgKTsKKwl9CisJCisJLy9TSVBfU2VydmVyX0Fzc2lnbm1lbnRfVHlwZTsKKwl7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBzaXBfZGljdC5TSVBfU2VydmVyX0Fzc2lnbm1lbnRfVHlwZSwgMCwgJmF2cCApICk7CisJCXZhbHVlLmkzMj1hc3NpZ25tZW50X3R5cGU7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9zZXR2YWx1ZSggYXZwLCAmdmFsdWUgKSApOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkKCBtZXNzYWdlLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCApICk7CisJfQorCS8vU0lQX3NlcnZlcl91cmkKKwl7CisJCQorCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3ICggc2lwX2RpY3QuU0lQX1NlcnZlcl9VUkksIDAsICZhdnAgKSApOworCQl2YWx1ZS5vcy5kYXRhPSh1bnNpZ25lZCBjaGFyICopc2lwc2VydmVydXJpOworCQl2YWx1ZS5vcy5sZW49c2lwc2VydmVydXJpbGVuOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUoIGF2cCwgJnZhbHVlICkgKTsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCggbWVzc2FnZSwgTVNHX0JSV19MQVNUX0NISUxELCBhdnAgKSApOworCQkKKwl9CisJCisJQ0hFQ0tfRkNUKCBmZF9tc2dfc2VuZCggJm1lc3NhZ2UsIE5VTEwsIE5VTEwgKSk7CisJCisJcmV0dXJuIDA7Cit9CisKK2ludCB0ZXN0X3NpcF9TQUFfY2IoIHN0cnVjdCBtc2cgKiogbXNnLCBzdHJ1Y3QgYXZwICogcGFyYW1hdnAsIHN0cnVjdCBzZXNzaW9uICogc2Vzcywgdm9pZCAqIG9wYXF1ZSwgZW51bSBkaXNwX2FjdGlvbiAqIGFjdCkKK3sKKwkKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvdGVzdF9zaXAvdGVzdF9zaXAuYyBiL2V4dGVuc2lvbnMvdGVzdF9zaXAvdGVzdF9zaXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjNmY2Q5Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy90ZXN0X3NpcC90ZXN0X3NpcC5jCkBAIC0wLDAgKzEsMjQxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogQWxleGFuZHJlIFdlc3RmYWhsIDxhd2VzdGZhaGxAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTAsIEFsZXhhbmRyZSBXZXN0ZmFobCwgVGVyYW9rYSBMYWJvcmF0b3J5IChLZWlvIFVuaXZlcnNpdHkpLCBhbmQgdGhlIFdJREUgUHJvamVjdC4gCSAqCQkKKyoJCQkJCQkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVGVyYW9rYSBMYWJvcmF0b3J5IG5vciB0aGUgCQkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFRlcmFva2EgTGFib3JhdG9yeSAJCQkJCQkgKgorKiAgIAkJCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpbmNsdWRlInRlc3Rfc2lwLmgiCisKK3N0cnVjdCBkaXNwX2hkbCAqIHRlc3Rfc2lwX01BUl9oZGw9TlVMTDsKK3N0cnVjdCBkaXNwX2hkbCAqIHRlc3Rfc2lwX0xJUl9oZGw9TlVMTDsKK3N0cnVjdCBkaXNwX2hkbCAqIHRlc3Rfc2lwX1VBUl9oZGw9TlVMTDsKK3N0cnVjdCBkaXNwX2hkbCAqIHRlc3Rfc2lwX1NBUl9oZGw9TlVMTDsKK3N0cnVjdCBkaXNwX2hkbCAqIHRlc3Rfc2lwX1BQQV9oZGw9TlVMTDsKK3N0cnVjdCBkaXNwX2hkbCAqIHRlc3Rfc2lwX1JUQV9oZGw9TlVMTDsKKworc3RydWN0IGRpc3BfaGRsICogdGVzdF9zaXBfTUFBX2hkbD1OVUxMOworc3RydWN0IGRpc3BfaGRsICogdGVzdF9zaXBfTElBX2hkbD1OVUxMOworc3RydWN0IGRpc3BfaGRsICogdGVzdF9zaXBfVUFBX2hkbD1OVUxMOworc3RydWN0IGRpc3BfaGRsICogdGVzdF9zaXBfU0FBX2hkbD1OVUxMOworc3RydWN0IGRpc3BfaGRsICogdGVzdF9zaXBfUFBSX2hkbD1OVUxMOworc3RydWN0IGRpc3BfaGRsICogdGVzdF9zaXBfUlRSX2hkbD1OVUxMOworCisKK3N0cnVjdCBkaXNwX2hkbCAqIHRlc3Rfc2lwX2RlZmF1bHRfaGRsPU5VTEw7CisKKy8vY29uZmlndXJhdGlvbiBzdHVjdHVyZQorc3RydWN0IHRzX2NvbmYgKiB0c19jb25mPU5VTEw7CitzdGF0aWMgc3RydWN0IHRzX2NvbmYgdGVzdF9zaXBfY29uZjsKKworCisvL2RpY3Rpb25hcnkgb2YgU0lQCitzdHJ1Y3Qgc2lwX2RpY3Qgc2lwX2RpY3Q7CisKK2ludCB0ZXN0X3NpcF9kZWZhdWx0X2NiKCBzdHJ1Y3QgbXNnICoqIG1zZywgc3RydWN0IGF2cCAqIGF2cCwgc3RydWN0IHNlc3Npb24gKiBzZXNzLCB2b2lkICogb3BhcXVlLCBlbnVtIGRpc3BfYWN0aW9uICogYWN0KQoreworCVRSQUNFX0VOVFJZKCIlcCAlcCAlcCAlcCIsIG1zZywgYXZwLCBzZXNzLCBhY3QpOworCQorCXJldHVybiAwOworfQorCisKKy8qCit2b2lkIGR1bXBfY29uZmlnKCkKK3sKKwlUUkFDRV9ERUJVRyhGVUxMLCIqKipDb25maWd1cmF0aW9uIG9mIFRFU1QgRGlhbWV0ZXItU0lQIGV4dGVuc2lvbioqKiIpOworCVRSQUNFX0RFQlVHKEZVTEwsIiMgdXNlcm5hbWU6IColcyoiLHRzX2NvbmYtPnVzZXJuYW1lKTsKKwlUUkFDRV9ERUJVRyhGVUxMLCIjIHBhc3N3b3JkOiAqJXMqIix0c19jb25mLT5wYXNzd29yZCk7CisJVFJBQ0VfREVCVUcoRlVMTCwiIyBzaXBfYW9yOiAqJXMqIix0c19jb25mLT5zaXBfYW9yKTsKKwlUUkFDRV9ERUJVRyhGVUxMLCIjIGRlc3RpbmF0aW9uX3JlYWxtOiAqJXMqIix0c19jb25mLT5kZXN0aW5hdGlvbl9yZWFsbSk7CisJVFJBQ0VfREVCVUcoRlVMTCwiIyBkZXN0aW5hdGlvbl9zaXA6IColcyoiLHRzX2NvbmYtPmRlc3RpbmF0aW9uX3NpcCk7CisJVFJBQ0VfREVCVUcoRlVMTCwiKioqRW5kIG9mIFRFU1QgRGlhbWV0ZXItU0lQIGNvbmZpZ3VyYXRpb24gZXh0ZW5zaW9uKioqIik7Cit9CisqLworc3RhdGljIGludCB0c19jb25mX2luaXQodm9pZCkKK3sKKwl0c19jb25mPSZ0ZXN0X3NpcF9jb25mOworCS8vbWVtc2V0KGFwcF9zaXBfY29uZiwgMCwgc2l6ZW9mKHN0cnVjdCB0c19jb25mKSk7CisJCisKKwlyZXR1cm4gMDsKK30KKworLyogZW50cnkgcG9pbnQgKi8KK2ludCB0c19lbnRyeShjaGFyICogY29uZmZpbGUpCit7CisJVFJBQ0VfRU5UUlkoIiVwIiwgY29uZmZpbGUpOworCQorCXN0cnVjdCBkaWN0X29iamVjdCAqIGFwcD1OVUxMOworCXN0cnVjdCBkaXNwX3doZW4gZGF0YTsKKwkKKwkKKwkvL1RPRE86IGFjdGl2YXRlIGFnYWluIGNvbmZpZ3VyYXRpb24gZmlsZQorCUNIRUNLX0ZDVCggdHNfY29uZl9pbml0KCkgKTsKKwkvKiBJbml0aWFsaXplIGNvbmZpZ3VyYXRpb24gCisJLy9DSEVDS19GQ1QoIHRzX2NvbmZfaW5pdCgpICk7CisJCisJCisJLy9XZSBwYXJzZSB0aGUgY29uZmlndXJhdGlvbiBmaWxlCisJaWYgKGNvbmZmaWxlICE9IE5VTEwpIHsKKwkJQ0hFQ0tfRkNUKCB0c19jb25mX2hhbmRsZShjb25mZmlsZSkgKTsKKwl9CisJZWxzZQorCXsKKwkJVFJBQ0VfREVCVUcoSU5GTywgIldlIG5lZWQgYSBjb25maWd1cmF0aW9uIGZpbGUgZm9yIERpYW1ldGVyLVNJUCBleHRlbnNpb24uIFNlZSBkb2MvIGZvciBhbiBleGFtcGxlLiIpOworCX0KKwkKKwkvL1dlIGNhbiBkdW1wIHRoZSBjb25maWd1cmF0aW9uIGV4dHJhY3RlZCBmcm9tIGFwcF9zaXAuY29uZgorCWR1bXBfY29uZmlnKCk7CisJKi8KKwkKKwkKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVBQTElDQVRJT04sIEFQUExJQ0FUSU9OX0JZX05BTUUsICJEaWFtZXRlciBTZXNzaW9uIEluaXRpYXRpb24gUHJvdG9jb2wgKFNJUCkgQXBwbGljYXRpb24iLCAmYXBwLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaXNwX2FwcF9zdXBwb3J0ICggYXBwLCBOVUxMLCAxLCAwICkgKTsKKwkKKwkKKwkKKwkvL1dlIHNldCB1c2VmdWwgQVZQcyAKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIkF1dGgtU2Vzc2lvbi1TdGF0ZSIsICZzaXBfZGljdC5BdXRoX1Nlc3Npb25fU3RhdGUsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIkF1dGgtQXBwbGljYXRpb24tSWQiLCAmc2lwX2RpY3QuQXV0aF9BcHBsaWNhdGlvbl9JZCwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiRGVzdGluYXRpb24tSG9zdCIsICZzaXBfZGljdC5EZXN0aW5hdGlvbl9Ib3N0LCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJEZXN0aW5hdGlvbi1SZWFsbSIsICZzaXBfZGljdC5EZXN0aW5hdGlvbl9SZWFsbSwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiU2Vzc2lvbi1JZCIsICZzaXBfZGljdC5TZXNzaW9uX0lkLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJSZWRpcmVjdC1Ib3N0IiwgJnNpcF9kaWN0LlJlZGlyZWN0X0hvc3QsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIlJlZGlyZWN0LUhvc3QtVXNhZ2UiLCAmc2lwX2RpY3QuUmVkaXJlY3RfSG9zdF9Vc2FnZSwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiU0lQLUF1dGgtRGF0YS1JdGVtIiwgJnNpcF9kaWN0LlNJUF9BdXRoX0RhdGFfSXRlbSwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiU0lQLUF1dGhvcml6YXRpb24iLCAmc2lwX2RpY3QuU0lQX0F1dGhvcml6YXRpb24sIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIlNJUC1BdXRoZW50aWNhdGUiLCAmc2lwX2RpY3QuU0lQX0F1dGhlbnRpY2F0ZSwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiU0lQLU51bWJlci1BdXRoLUl0ZW1zIiwgJnNpcF9kaWN0LlNJUF9OdW1iZXJfQXV0aF9JdGVtcywgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiU0lQLUF1dGhlbnRpY2F0aW9uLVNjaGVtZSIsICZzaXBfZGljdC5TSVBfQXV0aGVudGljYXRpb25fU2NoZW1lLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJTSVAtQXV0aGVudGljYXRpb24tSW5mbyIsICZzaXBfZGljdC5TSVBfQXV0aGVudGljYXRpb25fSW5mbywgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiU0lQLVNlcnZlci1VUkkiLCAmc2lwX2RpY3QuU0lQX1NlcnZlcl9VUkksIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIlNJUC1TZXJ2ZXItQ2FwYWJpbGl0aWVzIiwgJnNpcF9kaWN0LlNJUF9TZXJ2ZXJfQ2FwYWJpbGl0aWVzLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJTSVAtTWFuZGF0b3J5LUNhcGFiaWxpdHkiLCAmc2lwX2RpY3QuU0lQX01hbmRhdG9yeV9DYXBhYmlsaXR5LCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJTSVAtT3B0aW9uYWwtQ2FwYWJpbGl0eSIsICZzaXBfZGljdC5TSVBfT3B0aW9uYWxfQ2FwYWJpbGl0eSwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiU0lQLU1ldGhvZCIsICZzaXBfZGljdC5TSVBfTWV0aG9kLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJTSVAtQU9SIiwgJnNpcF9kaWN0LlNJUF9BT1IsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIlNJUC1EZXJlZ2lzdHJhdGlvbi1SZWFzb24iLCAmc2lwX2RpY3QuU0lQX0RlcmVnaXN0cmF0aW9uX1JlYXNvbiwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiU0lQLVJlYXNvbi1Db2RlIiwgJnNpcF9kaWN0LlNJUF9SZWFzb25fQ29kZSwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiU0lQLVJlYXNvbi1JbmZvIiwgJnNpcF9kaWN0LlNJUF9SZWFzb25fSW5mbywgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiU0lQLUFjY291bnRpbmctSW5mb3JtYXRpb24iLCAmc2lwX2RpY3QuU0lQX0FjY291bnRpbmdfSW5mb3JtYXRpb24sIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIlNJUC1BY2NvdW50aW5nLVNlcnZlci1VUkkiLCAmc2lwX2RpY3QuU0lQX0FjY291bnRpbmdfU2VydmVyX1VSSSwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiU0lQLUNyZWRpdC1Db250cm9sLVNlcnZlci1VUkkiLCAmc2lwX2RpY3QuU0lQX0NyZWRpdF9Db250cm9sX1NlcnZlcl9VUkksIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIlNJUC1TZXJ2ZXItQXNzaWdubWVudC1UeXBlIiwgJnNpcF9kaWN0LlNJUF9TZXJ2ZXJfQXNzaWdubWVudF9UeXBlLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJTSVAtSXRlbS1OdW1iZXIiLCAmc2lwX2RpY3QuU0lQX0l0ZW1fTnVtYmVyLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJTSVAtVXNlci1BdXRob3JpemF0aW9uLVR5cGUiLCAmc2lwX2RpY3QuU0lQX1VzZXJfQXV0aG9yaXphdGlvbl9UeXBlLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJTSVAtU3VwcG9ydGVkLVVzZXItRGF0YS1UeXBlIiwgJnNpcF9kaWN0LlNJUF9TdXBwb3J0ZWRfVXNlcl9EYXRhX1R5cGUsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIlNJUC1Vc2VyLURhdGEiLCAmc2lwX2RpY3QuU0lQX1VzZXJfRGF0YSwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiU0lQLVVzZXItRGF0YS1UeXBlIiwgJnNpcF9kaWN0LlNJUF9Vc2VyX0RhdGFfVHlwZSwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiU0lQLVVzZXItRGF0YS1Db250ZW50cyIsICZzaXBfZGljdC5TSVBfVXNlcl9EYXRhX0NvbnRlbnRzLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJTSVAtVXNlci1EYXRhLUFscmVhZHktQXZhaWxhYmxlIiwgJnNpcF9kaWN0LlNJUF9Vc2VyX0RhdGFfQWxyZWFkeV9BdmFpbGFibGUsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIlNJUC1WaXNpdGVkLU5ldHdvcmstSWQiLCAmc2lwX2RpY3QuU0lQX1Zpc2l0ZWRfTmV0d29ya19JZCwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiRGlnZXN0LVJlYWxtIiwgJnNpcF9kaWN0LkRpZ2VzdF9SZWFsbSwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiRGlnZXN0LVVSSSIsICZzaXBfZGljdC5EaWdlc3RfVVJJLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJEaWdlc3QtTm9uY2UiLCAmc2lwX2RpY3QuRGlnZXN0X05vbmNlLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJEaWdlc3QtQ05vbmNlIiwgJnNpcF9kaWN0LkRpZ2VzdF9DTm9uY2UsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIkRpZ2VzdC1NZXRob2QiLCAmc2lwX2RpY3QuRGlnZXN0X01ldGhvZCwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiRGlnZXN0LU5vbmNlLUNvdW50IiwgJnNpcF9kaWN0LkRpZ2VzdF9Ob25jZV9Db3VudCwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiRGlnZXN0LVJlYWxtIiwgJnNpcF9kaWN0LkRpZ2VzdF9SZWFsbSwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiRGlnZXN0LVJlc3BvbnNlIiwgJnNpcF9kaWN0LkRpZ2VzdF9SZXNwb25zZSwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiRGlnZXN0LVJlc3BvbnNlLUF1dGgiLCAmc2lwX2RpY3QuRGlnZXN0X1Jlc3BvbnNlX0F1dGgsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIkRpZ2VzdC1Vc2VybmFtZSIsICZzaXBfZGljdC5EaWdlc3RfVXNlcm5hbWUsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIkRpZ2VzdC1BbGdvcml0aG0iLCAmc2lwX2RpY3QuRGlnZXN0X0FsZ29yaXRobSwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiRGlnZXN0LVFvUCIsICZzaXBfZGljdC5EaWdlc3RfUU9QLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJVc2VyLU5hbWUiLCAmc2lwX2RpY3QuVXNlcl9OYW1lLCBFTk9FTlQpICk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJEaWdlc3QtSEExIiwgJnNpcF9kaWN0LkRpZ2VzdF9IQTEsIEVOT0VOVCkgKTsKKwkKKwkKKwkvL1JlZ2lzdGVyIEFwcGxpY2F0aW9uCisJbWVtc2V0KCZkYXRhLCAwLCBzaXplb2YoZGF0YSkpOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BUFBMSUNBVElPTiwgQVBQTElDQVRJT05fQllfTkFNRSwgIkRpYW1ldGVyIFNlc3Npb24gSW5pdGlhdGlvbiBQcm90b2NvbCAoU0lQKSBBcHBsaWNhdGlvbiIsICZkYXRhLmFwcCwgRU5PRU5UKSApOworCQorCQorCS8vKipDb21tYW5kIENvZGVzCisJLyoqLworCS8vTUFBCisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0NPTU1BTkQsIENNRF9CWV9OQU1FLCAiTXVsdGltZWRpYS1BdXRoLUFuc3dlciIsICZkYXRhLmNvbW1hbmQsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2Rpc3BfcmVnaXN0ZXIoIHRlc3Rfc2lwX01BQV9jYiwgRElTUF9IT1dfQ0MsICZkYXRhLCBOVUxMLCAmdGVzdF9zaXBfTUFBX2hkbCApICk7CisJCisJLy9VQUEKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJVc2VyLUF1dGhvcml6YXRpb24tQW5zd2VyIiwgJmRhdGEuY29tbWFuZCwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGlzcF9yZWdpc3RlciggdGVzdF9zaXBfVUFBX2NiLCBESVNQX0hPV19DQywgJmRhdGEsIE5VTEwsICZ0ZXN0X3NpcF9VQUFfaGRsICkgKTsKKwkKKwkvL1JUUgorCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIlJlZ2lzdHJhdGlvbi1UZXJtaW5hdGlvbi1SZXF1ZXN0IiwgJmRhdGEuY29tbWFuZCwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGlzcF9yZWdpc3RlciggdGVzdF9zaXBfUlRSX2NiLCBESVNQX0hPV19DQywgJmRhdGEsIE5VTEwsICZ0ZXN0X3NpcF9SVFJfaGRsICkgKTsKKwkKKwkvL0xJQQorCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIkxvY2F0aW9uLUluZm8tQW5zd2VyIiwgJmRhdGEuY29tbWFuZCwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfZGlzcF9yZWdpc3RlciggdGVzdF9zaXBfTElBX2NiLCBESVNQX0hPV19DQywgJmRhdGEsIE5VTEwsICZ0ZXN0X3NpcF9MSUFfaGRsICkgKTsKKwkKKwkvL0xJQQorCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIlNlcnZlci1Bc3NpZ25tZW50LUFuc3dlciIsICZkYXRhLmNvbW1hbmQsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2Rpc3BfcmVnaXN0ZXIoIHRlc3Rfc2lwX1NBQV9jYiwgRElTUF9IT1dfQ0MsICZkYXRhLCBOVUxMLCAmdGVzdF9zaXBfU0FBX2hkbCApICk7CisJCisJLy9DYWxsYmFjayBmb3IgdW5leHBlY3RlZCBtZXNzYWdlcworCUNIRUNLX0ZDVCggZmRfZGlzcF9yZWdpc3RlciggdGVzdF9zaXBfZGVmYXVsdF9jYiwgRElTUF9IT1dfQVBQSUQsICZkYXRhLCBOVUxMLCAmdGVzdF9zaXBfZGVmYXVsdF9oZGwgKSApOworCQorCS8qCisJLy9XZSBzdGFydCBkYXRhYmFzZSBjb25uZWN0aW9uCisJaWYoc3RhcnRfbXlzcWxfY29ubmVjdGlvbigpKQorCQlyZXR1cm4gMTsKKwkqLworCQorCS8vQ0hFQ0tfRkNUKCBmZF9ldmVudF90cmlnX3JlZ2NiKDMwLCAidGVzdF9zaXAiLCAodm9pZCAqKXRlc3Rfc2lwU0xfTElSX2NiICkgKTsKKwlDSEVDS19GQ1QoIGZkX2V2ZW50X3RyaWdfcmVnY2IoMzAsICJ0ZXN0X3NpcCIsICh2b2lkICopdGVzdF9zaXBfU0FSX2NiICkgKTsKKwlDSEVDS19GQ1QoIGZkX2V2ZW50X3RyaWdfcmVnY2IoMzEsICJ0ZXN0X3NpcCIsICh2b2lkICopdGVzdF9zaXBfTElSX2NiICkgKTsKKwkKKwlyZXR1cm4gMDsKK30KKworLy9DbGVhbnVwIGNhbGxiYWNrCit2b2lkIGZkX2V4dF9maW5pKHZvaWQpCit7CisJLyoKKwlpZiAodGVzdF9zaXBfTUFSX2NiKSB7CisJCSh2b2lkKSBmZF9kaXNwX3VucmVnaXN0ZXIoJnRlc3Rfc2lwX01BUl9oZGwpOworCQlDSEVDS19GQ1RfRE8oIGZkX3Nlc3NfaGFuZGxlcl9kZXN0cm95KCZ0c19zZXNzX2hkbCkscmV0dXJuKTsKKwl9CisJKi8KKwkvL1dlIGNsb3NlIGRhdGFiYXNlIGNvbm5lY3Rpb24KKwkvL2Nsb3NlX215c3FsX2Nvbm5lY3Rpb24oKTsKKwkKKworCQorCVRSQUNFX0VOVFJZKCk7CisJcmV0dXJuIDsKK30KKworRVhURU5TSU9OX0VOVFJZKCJ0ZXN0X3NpcCIsIHRzX2VudHJ5LCAiZGljdF9zaXAiKTsKKwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy90ZXN0X3NpcC90ZXN0X3NpcC5oIGIvZXh0ZW5zaW9ucy90ZXN0X3NpcC90ZXN0X3NpcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyZWJmMjEKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL3Rlc3Rfc2lwL3Rlc3Rfc2lwLmgKQEAgLTAsMCArMSwxMjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBBbGV4YW5kcmUgV2VzdGZhaGwgPGF3ZXN0ZmFobEBmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxMCwgQWxleGFuZHJlIFdlc3RmYWhsLCBUZXJhb2thIExhYm9yYXRvcnkgKEtlaW8gVW5pdmVyc2l0eSksIGFuZCB0aGUgV0lERSBQcm9qZWN0LiAJICoJCQorKgkJCQkJCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBUZXJhb2thIExhYm9yYXRvcnkgbm9yIHRoZSAJCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgVGVyYW9rYSBMYWJvcmF0b3J5IAkJCQkJCSAqCisqICAgCQkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8ZnJlZURpYW1ldGVyL2V4dGVuc2lvbi5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KK0dDQ19ESUFHX09GRigiLVdkZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIpCisjaW5jbHVkZSA8Z2NyeXB0Lmg+CitHQ0NfRElBR19PTigiLVdkZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIpCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bXlzcWwuaD4KKworLyogVGhlIG1vZHVsZSBjb25maWd1cmF0aW9uICovCitzdHJ1Y3QgdHNfY29uZiB7CisJY2hhciAqIGRlc3RpbmF0aW9uX3NpcDsgCisJY2hhciAqIGRlc3RpbmF0aW9uX3JlYWxtOworCWNoYXIgKiB1c2VybmFtZTsKKwljaGFyICogcGFzc3dvcmQ7CisJY2hhciAqIHNpcF9hb3I7Cit9OworZXh0ZXJuIHN0cnVjdCB0c19jb25mICogdHNfY29uZjsKKworLy9TdG9yYWdlIGZvciBzb21lIHVzZWZ1bCBBVlBzCitzdHJ1Y3Qgc2lwX2RpY3R7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogQXV0aF9TZXNzaW9uX1N0YXRlOworCXN0cnVjdCBkaWN0X29iamVjdCAqIEF1dGhfQXBwbGljYXRpb25fSWQ7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogRGVzdGluYXRpb25fSG9zdDsKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBVc2VyX05hbWU7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogU2Vzc2lvbl9JZDsKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBSZWRpcmVjdF9Ib3N0OworCXN0cnVjdCBkaWN0X29iamVjdCAqIFJlZGlyZWN0X0hvc3RfVXNhZ2U7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogU0lQX0F1dGhfRGF0YV9JdGVtOworCXN0cnVjdCBkaWN0X29iamVjdCAqIFNJUF9BY2NvdW50aW5nX0luZm9ybWF0aW9uOworCXN0cnVjdCBkaWN0X29iamVjdCAqIFNJUF9BY2NvdW50aW5nX1NlcnZlcl9VUkk7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogU0lQX0NyZWRpdF9Db250cm9sX1NlcnZlcl9VUkk7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogU0lQX1NlcnZlcl9Bc3NpZ25tZW50X1R5cGU7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogU0lQX0l0ZW1fTnVtYmVyOworCXN0cnVjdCBkaWN0X29iamVjdCAqIFNJUF9Vc2VyX0F1dGhvcml6YXRpb25fVHlwZTsKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBTSVBfU3VwcG9ydGVkX1VzZXJfRGF0YV9UeXBlOworCXN0cnVjdCBkaWN0X29iamVjdCAqIFNJUF9Vc2VyX0RhdGE7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogU0lQX1VzZXJfRGF0YV9UeXBlOworCXN0cnVjdCBkaWN0X29iamVjdCAqIFNJUF9Vc2VyX0RhdGFfQ29udGVudHM7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogU0lQX1VzZXJfRGF0YV9BbHJlYWR5X0F2YWlsYWJsZTsKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBTSVBfVmlzaXRlZF9OZXR3b3JrX0lkOworCXN0cnVjdCBkaWN0X29iamVjdCAqIFNJUF9BdXRob3JpemF0aW9uOworCXN0cnVjdCBkaWN0X29iamVjdCAqIFNJUF9BdXRoZW50aWNhdGU7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogU0lQX051bWJlcl9BdXRoX0l0ZW1zOwkKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBTSVBfQXV0aGVudGljYXRpb25fU2NoZW1lOworCXN0cnVjdCBkaWN0X29iamVjdCAqIFNJUF9BdXRoZW50aWNhdGlvbl9JbmZvOwkKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBTSVBfU2VydmVyX1VSSTsKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBTSVBfU2VydmVyX0NhcGFiaWxpdGllczsKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBTSVBfTWFuZGF0b3J5X0NhcGFiaWxpdHk7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogU0lQX09wdGlvbmFsX0NhcGFiaWxpdHk7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogU0lQX01ldGhvZDsKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBTSVBfQU9SOworCXN0cnVjdCBkaWN0X29iamVjdCAqIFNJUF9EZXJlZ2lzdHJhdGlvbl9SZWFzb247CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogU0lQX1JlYXNvbl9Db2RlOworCXN0cnVjdCBkaWN0X29iamVjdCAqIFNJUF9SZWFzb25fSW5mbzsKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBEaWdlc3RfVVJJOwkJCisJc3RydWN0IGRpY3Rfb2JqZWN0ICogRGlnZXN0X05vbmNlOworCXN0cnVjdCBkaWN0X29iamVjdCAqIERpZ2VzdF9Ob25jZV9Db3VudDsKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBEaWdlc3RfQ05vbmNlOwkJCisJc3RydWN0IGRpY3Rfb2JqZWN0ICogRGlnZXN0X1JlYWxtOwkJCisJc3RydWN0IGRpY3Rfb2JqZWN0ICogRGlnZXN0X1Jlc3BvbnNlOwkKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBEaWdlc3RfUmVzcG9uc2VfQXV0aDsJCisJc3RydWN0IGRpY3Rfb2JqZWN0ICogRGlnZXN0X1VzZXJuYW1lOwkKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBEaWdlc3RfTWV0aG9kOworCXN0cnVjdCBkaWN0X29iamVjdCAqIERpZ2VzdF9RT1A7CQorCXN0cnVjdCBkaWN0X29iamVjdCAqIERpZ2VzdF9BbGdvcml0aG07CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogRGlnZXN0X0hBMTsKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBEZXN0aW5hdGlvbl9SZWFsbTsKK307CisKK2V4dGVybiAgc3RydWN0IHNpcF9kaWN0ICBzaXBfZGljdDsKK2V4dGVybiBzdHJ1Y3Qgc2Vzc2lvbl9oYW5kbGVyICogdHNfc2Vzc19oZGw7CisKK2ludCB0c19lbnRyeSgpOwordm9pZCBmZF9leHRfZmluaSh2b2lkKTsKKworaW50IHRlc3Rfc2lwX0xJUl9jYigpOworaW50IHRlc3Rfc2lwX1VBUl9jYigpOworaW50IHRlc3Rfc2lwX1NBUl9jYigpOworaW50IHRlc3Rfc2lwU0xfTElSX2NiKCk7CisKK2ludCB0ZXN0X3NpcF9kZWZhdWx0X2NiKCBzdHJ1Y3QgbXNnICoqIG1zZywgc3RydWN0IGF2cCAqIGF2cCwgc3RydWN0IHNlc3Npb24gKiBzZXNzLCB2b2lkICogb3BhcXVlLCBlbnVtIGRpc3BfYWN0aW9uICogYWN0KTsKK2ludCB0ZXN0X3NpcF9NQUFfY2IoIHN0cnVjdCBtc2cgKiogbXNnLCBzdHJ1Y3QgYXZwICogYXZwLCBzdHJ1Y3Qgc2Vzc2lvbiAqIHNlc3MsIHZvaWQgKiBvcGFxdWUsIGVudW0gZGlzcF9hY3Rpb24gKiBhY3QpOworaW50IHRlc3Rfc2lwX1JUUl9jYiggc3RydWN0IG1zZyAqKiBtc2csIHN0cnVjdCBhdnAgKiBhdnAsIHN0cnVjdCBzZXNzaW9uICogc2Vzcywgdm9pZCAqIG9wYXF1ZSwgZW51bSBkaXNwX2FjdGlvbiAqIGFjdCk7CitpbnQgdGVzdF9zaXBfVUFBX2NiKCBzdHJ1Y3QgbXNnICoqIG1zZywgc3RydWN0IGF2cCAqIGF2cCwgc3RydWN0IHNlc3Npb24gKiBzZXNzLCB2b2lkICogb3BhcXVlLCBlbnVtIGRpc3BfYWN0aW9uICogYWN0KTsKK2ludCB0ZXN0X3NpcF9MSUFfY2IoIHN0cnVjdCBtc2cgKiogbXNnLCBzdHJ1Y3QgYXZwICogYXZwLCBzdHJ1Y3Qgc2Vzc2lvbiAqIHNlc3MsIHZvaWQgKiBvcGFxdWUsIGVudW0gZGlzcF9hY3Rpb24gKiBhY3QpOworaW50IHRlc3Rfc2lwX1NBQV9jYiggc3RydWN0IG1zZyAqKiBtc2csIHN0cnVjdCBhdnAgKiBhdnAsIHN0cnVjdCBzZXNzaW9uICogc2Vzcywgdm9pZCAqIG9wYXF1ZSwgZW51bSBkaXNwX2FjdGlvbiAqIGFjdCk7CitpbnQgdGVzdF9zaXBTTF9MSUFfY2IoIHN0cnVjdCBtc2cgKiogbXNnLCBzdHJ1Y3QgYXZwICogYXZwLCBzdHJ1Y3Qgc2Vzc2lvbiAqIHNlc3MsIHZvaWQgKiBvcGFxdWUsIGVudW0gZGlzcF9hY3Rpb24gKiBhY3QpOwpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy90ZXN0X3NpcC90ZXN0X3NpcC5sIGIvZXh0ZW5zaW9ucy90ZXN0X3NpcC90ZXN0X3NpcC5sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ODU5MWQKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL3Rlc3Rfc2lwL3Rlc3Rfc2lwLmwKQEAgLTAsMCArMSwxMzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBBbGV4YW5kcmUgV2VzdGZhaGwgPGF3ZXN0ZmFobEBmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxMCwgQWxleGFuZHJlIFdlc3RmYWhsLCBUZXJhb2thIExhYm9yYXRvcnkgKEtlaW8gVW5pdmVyc2l0eSksIGFuZCB0aGUgV0lERSBQcm9qZWN0LiAJICoJCQorKgkJCQkJCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogQmFzZWQgb24gdGFfY29uZi5sIChTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4pCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFRlcmFva2EgTGFib3JhdG9yeSBub3IgdGhlIAkJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBUZXJhb2thIExhYm9yYXRvcnkgCQkJCQkJICoKKyogICAJCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisKKyV7CisjaW5jbHVkZSAidGVzdF9zaXAuaCIKKy8qIEluY2x1ZGUgeWFjYyB0b2tlbnMgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlICJ0ZXN0X3NpcC50YWIuaCIKKworLyogVXBkYXRlIHRoZSBjb2x1bW4gaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgWVlfVVNFUl9BQ1RJT04geyAJCQkJCQlcCisJeXlsbG9jLT5maXJzdF9jb2x1bW4gPSB5eWxsb2MtPmxhc3RfY29sdW1uICsgMTsgCQlcCisJeXlsbG9jLT5sYXN0X2NvbHVtbiA9IHl5bGxvYy0+Zmlyc3RfY29sdW1uICsgeXlsZW5nIC0gMTsJXAorfQorCisvKiBBdm9pZCB3YXJuaW5nIHdpdGggbmV3ZXIgZmxleCAqLworI2RlZmluZSBZWV9OT19JTlBVVAorCislfQorCislb3B0aW9uIGJpc29uLWJyaWRnZSBiaXNvbi1sb2NhdGlvbnMKKyVvcHRpb24gbm95eXdyYXAKKyVvcHRpb24gbm91bnB1dAorCislJQorCisJLyogVXBkYXRlIHRoZSBsaW5lIGNvdW50ICovCitcbgkJCXsKKwkJCQl5eWxsb2MtPmZpcnN0X2xpbmUrKzsgCisJCQkJeXlsbG9jLT5sYXN0X2xpbmUrKzsgCisJCQkJeXlsbG9jLT5sYXN0X2NvbHVtbj0wOyAKKwkJCX0KKwkgCisJLyogRWF0IGFsbCBzcGFjZXMgYnV0IG5vdCBuZXcgbGluZXMgKi8KKyhbWzpzcGFjZTpdXXstfVtcbl0pKwk7CisJLyogRWF0IGFsbCBjb21tZW50cyAqLworIy4qJAkJCTsKKworCS8qIFJlY29nbml6ZSBhbnkgaW50ZWdlciAqLworWy1dP1tbOmRpZ2l0Ol1dKwkJeworCQkJCS8qIENvbnZlcnQgdGhpcyB0byBhbiBpbnRlZ2VyIHZhbHVlICovCisJCQkJaW50IHJldD0wOworCQkJCXJldCA9IHNzY2FuZih5eXRleHQsICIlaSIsICZ5eWx2YWwtPmludGVnZXIpOworCQkJCWlmIChyZXQgIT0gMSkgeworCQkJCQkvKiBObyBtYXRjaGluZzogYW4gZXJyb3Igb2NjdXJyZWQgKi8KKwkJCQkJZmRfbG9nX2RlYnVnKCJVbmFibGUgdG8gY29udmVydCB0aGUgdmFsdWUgJyVzJyB0byBhIHZhbGlkIG51bWJlcjogJXMiLCB5eXRleHQsIHN0cmVycm9yKGVycm5vKSk7CisJCQkJCXJldHVybiBMRVhfRVJST1I7IC8qIHRyaWcgYW4gZXJyb3IgaW4geWFjYyBwYXJzZXIgKi8KKwkJCQkJLyogTWF5YmUgd2UgY291bGQgUkVKRUNUIGluc3RlYWQgb2YgZmFpbGluZyBoZXJlPyAqLworCQkJCX0KKwkJCQlyZXR1cm4gSU5URUdFUjsKKwkJCX0KKworCS8qIFJlY29nbml6ZSBxdW90ZWQgc3RyaW5ncyAtLSB3ZSBkbyBub3Qgc3VwcG9ydCBlc2NhcGVkIFwiIGluIHRoZSBzdHJpbmcgY3VycmVudGx5LiAqLworXCJbXlwiXStcIgkJeworCQkJCS8qIE1hdGNoIGEgcXVvdGVkIHN0cmluZy4gTGV0J3MgYmUgdmVyeSBwZXJtaXNzaXZlLiAqLworCQkJCXl5bHZhbC0+c3RyaW5nID0gc3RyZHVwKHl5dGV4dCsxKTsKKwkJCQlpZiAoIXl5bHZhbC0+c3RyaW5nKSB7CisJCQkJCWZkX2xvZ19kZWJ1ZygiVW5hYmxlIHRvIGNvcHkgdGhlIHN0cmluZyAnJXMnOiAlcyIsIHl5dGV4dCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCQkJVFJBQ0VfREVCVUcoSU5GTywgInN0cmR1cCBmYWlsZWQiKTsKKwkJCQkJcmV0dXJuIExFWF9FUlJPUjsgLyogdHJpZyBhbiBlcnJvciBpbiB5YWNjIHBhcnNlciAqLworCQkJCX0KKwkJCQl5eWx2YWwtPnN0cmluZ1tzdHJsZW4oeXl0ZXh0KSAtIDJdID0gJ1wwJzsKKwkJCQlyZXR1cm4gUVNUUklORzsKKwkJCX0KKworCisKKworCS8qIFJlY29nbml6ZSB0aGUgdG9rZW5zICovCQorKD9pOiJ1c2VybmFtZSIpCXsKKwkJCQlyZXR1cm4gVEVTVFNJUF9VU0VSTkFNRTsKKwkJCX0KKworKD9pOiJwYXNzd29yZCIpCQl7CisJCQkJcmV0dXJuIFRFU1RTSVBfUEFTU1dPUkQ7CisJCQl9CisKKyg/aToic2lwX2FvciIpCQl7CisJCQkJcmV0dXJuIFRFU1RTSVBfU0lQQU9SOworCQkJfQorCisoP2k6ImRlc3RpbmF0aW9uX3JlYWxtIikJCXsKKwkJCQlyZXR1cm4gVEVTVFNJUF9ERVNUUkVBTE07CisJCQl9CisKKyg/aToiZGVzdGluYXRpb25fc2lwIikJCXsKKwkJCQlyZXR1cm4gVEVTVFNJUF9ERVNUU0lQOworCQkJfQorCQkJCisKKworCQkJCisJLyogVmFsaWQgc2luZ2xlIGNoYXJhY3RlcnMgZm9yIHl5cGFyc2UgKi8KK1s9O10JCQl7IHJldHVybiB5eXRleHRbMF07IH0KKworCS8qIFVucmVjb2duaXplZCBzZXF1ZW5jZSwgaWYgaXQgZGlkIG5vdCBtYXRjaCBhbnkgcHJldmlvdXMgcGF0dGVybiAqLworW15bOnNwYWNlOl0iKj0+O1xuXSsJeyAKKwkJCQlmZF9sb2dfZGVidWcoIlVucmVjb2duaXplZCB0ZXh0IG9uIGxpbmUgJWQgY29sICVkOiAnJXMnLiIsIHl5bGxvYy0+Zmlyc3RfbGluZSwgeXlsbG9jLT5maXJzdF9jb2x1bW4sIHl5dGV4dCk7CisJCQkgCXJldHVybiBMRVhfRVJST1I7IAorCQkJfQorCislJQpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy90ZXN0X3NpcC90ZXN0X3NpcC55IGIvZXh0ZW5zaW9ucy90ZXN0X3NpcC90ZXN0X3NpcC55Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OTljMjgKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL3Rlc3Rfc2lwL3Rlc3Rfc2lwLnkKQEAgLTAsMCArMSwxNzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBBbGV4YW5kcmUgV2VzdGZhaGwgPGF3ZXN0ZmFobEBmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxMCwgQWxleGFuZHJlIFdlc3RmYWhsLCBUZXJhb2thIExhYm9yYXRvcnkgKEtlaW8gVW5pdmVyc2l0eSksIGFuZCB0aGUgV0lERSBQcm9qZWN0LiAJICoJCQorKgkJCQkJCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogQmFzZWQgb24gdGFfY29uZi55IChTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4pCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFRlcmFva2EgTGFib3JhdG9yeSBub3IgdGhlIAkJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBUZXJhb2thIExhYm9yYXRvcnkgCQkJCQkJICoKKyogICAJCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRm9yIGRldmVsb3BtZW50IG9ubHkgOiAqLworJWRlYnVnIAorJWVycm9yLXZlcmJvc2UKKworLyogVGhlIHBhcnNlciByZWNlaXZlcyB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGZpbGVuYW1lIGFzIHBhcmFtZXRlciAqLworJXBhcnNlLXBhcmFtIHtjaGFyICogY29uZmZpbGV9CisKKy8qIEtlZXAgdHJhY2sgb2YgbG9jYXRpb24gKi8KKyVsb2NhdGlvbnMgCislcHVyZS1wYXJzZXIKKworJXsKKyNpbmNsdWRlICJ0ZXN0X3NpcC5oIgorI2luY2x1ZGUgInRlc3Rfc2lwLnRhYi5oIgkvKiBiaXNvbiBpcyBub3Qgc21hcnQgZW5vdWdoIHRvIGRlZmluZSB0aGUgWVlMVFlQRSBiZWZvcmUgaW5jbHVkaW5nIHRoaXMgY29kZSwgc28uLi4gKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb24gKi8KK2ludCB5eXBhcnNlKGNoYXIgKiBjb25mZmlsZSk7CisKKy8qIFBhcnNlIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgKi8KK2ludCB0c19jb25mX2hhbmRsZShjaGFyICogY29uZmZpbGUpCit7CisJZXh0ZXJuIEZJTEUgKiB0ZXN0X3NpcGluOworCWludCByZXQ7CisJCisJVFJBQ0VfRU5UUlkoIiVwIiwgY29uZmZpbGUpOworCQorCVRSQUNFX0RFQlVHIChGVUxMLCAiUGFyc2luZyBjb25maWd1cmF0aW9uIGZpbGU6ICVzLi4uIiwgY29uZmZpbGUpOworCQorCXRlc3Rfc2lwaW4gPSBmb3Blbihjb25mZmlsZSwgInIiKTsKKwlpZiAodGVzdF9zaXBpbiA9PSBOVUxMKSB7CisJCXJldCA9IGVycm5vOworCQlmZF9sb2dfZGVidWcoIlVuYWJsZSB0byBvcGVuIGV4dGVuc2lvbiBjb25maWd1cmF0aW9uIGZpbGUgJXMgZm9yIHJlYWRpbmc6ICVzIiwgY29uZmZpbGUsIHN0cmVycm9yKHJldCkpOworCQlUUkFDRV9ERUJVRyAoSU5GTywgIkVycm9yIG9jY3VycmVkLCBtZXNzYWdlIGxvZ2dlZCAtLSBjb25maWd1cmF0aW9uIGZpbGUuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0geXlwYXJzZShjb25mZmlsZSk7CisKKwlmY2xvc2UodGVzdF9zaXBpbik7CisKKwlpZiAocmV0ICE9IDApIHsKKwkJVFJBQ0VfREVCVUcgKElORk8sICJVbmFibGUgdG8gcGFyc2UgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4iKTsKKwkJcmV0dXJuIEVJTlZBTDsKKwl9CisJCisJcmV0dXJuIDA7Cit9CisKKy8qIFRoZSBMZXggcGFyc2VyIHByb3RvdHlwZSAqLworaW50IHRlc3Rfc2lwZmxleChZWVNUWVBFICpsdmFscCwgWVlMVFlQRSAqbGxvY3ApOworCisvKiBGdW5jdGlvbiB0byByZXBvcnQgdGhlIGVycm9ycyAqLwordm9pZCB5eWVycm9yIChZWUxUWVBFICpwbG9jLCBjaGFyICogY29uZmZpbGUsIGNoYXIgY29uc3QgKnMpCit7CisJVFJBQ0VfREVCVUcoSU5GTywgIkVycm9yIGluIGNvbmZpZ3VyYXRpb24gcGFyc2luZyIpOworCQorCWlmIChwbG9jLT5maXJzdF9saW5lICE9IHBsb2MtPmxhc3RfbGluZSkKKwkJZmRfbG9nX2RlYnVnKCIlczolZC4lZC0lZC4lZCA6ICVzIiwgY29uZmZpbGUsIHBsb2MtPmZpcnN0X2xpbmUsIHBsb2MtPmZpcnN0X2NvbHVtbiwgcGxvYy0+bGFzdF9saW5lLCBwbG9jLT5sYXN0X2NvbHVtbiwgcyk7CisJZWxzZSBpZiAocGxvYy0+Zmlyc3RfY29sdW1uICE9IHBsb2MtPmxhc3RfY29sdW1uKQorCQlmZF9sb2dfZGVidWcoIiVzOiVkLiVkLSVkIDogJXMiLCBjb25mZmlsZSwgcGxvYy0+Zmlyc3RfbGluZSwgcGxvYy0+Zmlyc3RfY29sdW1uLCBwbG9jLT5sYXN0X2NvbHVtbiwgcyk7CisJZWxzZQorCQlmZF9sb2dfZGVidWcoIiVzOiVkLiVkIDogJXMiLCBjb25mZmlsZSwgcGxvYy0+Zmlyc3RfbGluZSwgcGxvYy0+Zmlyc3RfY29sdW1uLCBzKTsKK30KKworJX0KKworLyogVmFsdWVzIHJldHVybmVkIGJ5IGxleCBmb3IgdG9rZW4gKi8KKyV1bmlvbiB7CisJY2hhciAJCSpzdHJpbmc7CS8qIFRoZSBzdHJpbmcgaXMgYWxsb2NhdGVkIGJ5IHN0cmR1cCBpbiBsZXguKi8KKwlpbnQJCSBpbnRlZ2VyOwkJLyogU3RvcmUgaW50ZWdlciB2YWx1ZXMgKi8KK30KKworLyogSW4gY2FzZSBvZiBlcnJvciBpbiB0aGUgbGV4aWNhbCBhbmFseXNpcyAqLworJXRva2VuIAkJTEVYX0VSUk9SCisKKy8qIEtleSB3b3JkcyAqLworJXRva2VuIAkJVEVTVFNJUF9ERVNUUkVBTE0KKyV0b2tlbiAJCVRFU1RTSVBfREVTVFNJUAorJXRva2VuIAkJVEVTVFNJUF9QQVNTV09SRAorJXRva2VuIAkJVEVTVFNJUF9TSVBBT1IKKyV0b2tlbiAJCVRFU1RTSVBfVVNFUk5BTUUKKworLyogVG9rZW5zIGFuZCB0eXBlcyBmb3Igcm91dGluZyB0YWJsZSBkZWZpbml0aW9uICovCisvKiBBIChkZSlxdW90ZWQgc3RyaW5nIChtYWxsb2MnZCBpbiBsZXggcGFyc2VyOyBpdCBtdXN0IGJlIGZyZWVkIGFmdGVyIHVzZSkgKi8KKyV0b2tlbiA8c3RyaW5nPglRU1RSSU5HCisKKy8qIEFuIGludGVnZXIgdmFsdWUgKi8KKyV0b2tlbiA8aW50ZWdlcj4gSU5URUdFUgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworJSUKKworCS8qIFRoZSBncmFtbWFyIGRlZmluaXRpb24gKi8KK2NvbmZmaWxlOgkJLyogZW1wdHkgZ3JhbW1hciBpcyBPSyAqLworCQkJfCBjb25mZmlsZSBkZXN0aW5hdGlvbl9yZWFsbQorCQkJfCBjb25mZmlsZSBkZXN0aW5hdGlvbl9zaXAKKwkJCXwgY29uZmZpbGUgdXNlcm5hbWUKKwkJCXwgY29uZmZpbGUgcGFzc3dvcmQKKwkJCXwgY29uZmZpbGUgc2lwX2FvcgorCQkJOworCitkZXN0aW5hdGlvbl9yZWFsbToJCQlURVNUU0lQX0RFU1RSRUFMTSAnPScgUVNUUklORyAnOycKKwkJCXsKKwkJCQlmcmVlKHRzX2NvbmYtPmRlc3RpbmF0aW9uX3JlYWxtKTsKKwkJCQl0c19jb25mLT5kZXN0aW5hdGlvbl9yZWFsbSA9ICQzOworCQkJfQorCQkJOworCitkZXN0aW5hdGlvbl9zaXA6CQkJVEVTVFNJUF9ERVNUU0lQICc9JyBRU1RSSU5HICc7JworCQkJeworCQkJCWZyZWUodHNfY29uZi0+ZGVzdGluYXRpb25fc2lwKTsKKwkJCQl0c19jb25mLT5kZXN0aW5hdGlvbl9zaXAgPSAkMzsKKwkJCX0KKwkJCTsKKwordXNlcm5hbWU6CQkJVEVTVFNJUF9VU0VSTkFNRSAnPScgUVNUUklORyAnOycKKwkJCXsKKwkJCQlmcmVlKHRzX2NvbmYtPnVzZXJuYW1lKTsKKwkJCQl0c19jb25mLT51c2VybmFtZSA9ICQzOworCQkJfQorCQkJOworCitwYXNzd29yZDoJCQlURVNUU0lQX1BBU1NXT1JEICc9JyBRU1RSSU5HICc7JworCQkJeworCQkJCWZyZWUodHNfY29uZi0+cGFzc3dvcmQpOworCQkJCXRzX2NvbmYtPnBhc3N3b3JkID0gJDM7CisJCQl9CisJCQk7CisKK3NpcF9hb3I6CQkJVEVTVFNJUF9TSVBBT1IgJz0nIFFTVFJJTkcgJzsnCisJCQl7CisJCQkJZnJlZSh0c19jb25mLT5zaXBfYW9yKTsKKwkJCQl0c19jb25mLT5zaXBfYW9yID0gJDM7CisJCQl9CisJCQk7CmRpZmYgLS1naXQgYS9leHRlbnNpb25zL3Rlc3Rfc2lwL3VzZXJhdXRob3JpemF0aW9uLmMgYi9leHRlbnNpb25zL3Rlc3Rfc2lwL3VzZXJhdXRob3JpemF0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA3YTVhZAotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvdGVzdF9zaXAvdXNlcmF1dGhvcml6YXRpb24uYwpAQCAtMCwwICsxLDE1NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IEFsZXhhbmRyZSBXZXN0ZmFobCA8YXdlc3RmYWhsQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDEwLCBBbGV4YW5kcmUgV2VzdGZhaGwsIFRlcmFva2EgTGFib3JhdG9yeSAoS2VpbyBVbml2ZXJzaXR5KSwgYW5kIHRoZSBXSURFIFByb2plY3QuIAkgKgkJCisqCQkJCQkJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFRlcmFva2EgTGFib3JhdG9yeSBub3IgdGhlIAkJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBUZXJhb2thIExhYm9yYXRvcnkgCQkJCQkJICoKKyogICAJCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJ0ZXN0X3NpcC5oIgorCisvL0NhbGxlZCB0byBzZW5kIGEgVUFSCitpbnQgdGVzdF9zaXBfVUFSX2NiKCkKK3sKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiB1YXJfbW9kZWw9TlVMTDsKKwlzdHJ1Y3QgbXNnICogbWVzc2FnZT1OVUxMOworCXN0cnVjdCBhdnAgKmF2cD1OVUxMOworCXVuaW9uIGF2cF92YWx1ZSB2YWx1ZTsKKwkKKwkvL0Zha2UgdmFsdWVzIFNUQVJUCisJY2hhciAqc2lwX2Fvcj0ic2lwOmF3LWxhcHB5QHRlcmEuaWNzLmtlaW8uYWMuanAiOworCXNpemVfdCBhb3JfbGVuPXN0cmxlbihzaXBfYW9yKTsgCisJIGNoYXIgKmRlc3RpbmF0aW9uX3JlYWxtPSJ0ZXJhLmljcy5rZWlvLmFjLmpwIjsKKwlzaXplX3QgZGVzdGluYXRpb25fcmVhbG1sZW49c3RybGVuKGRlc3RpbmF0aW9uX3JlYWxtKTsKKwkgY2hhciAqZGVzdGluYXRpb25faG9zdD0ic3Vpa2EudGVyYS5pY3Mua2Vpby5hYy5qcCI7CisJc2l6ZV90IGRlc3RpbmF0aW9uX2hvc3RsZW49c3RybGVuKGRlc3RpbmF0aW9uX2hvc3QpOworCSBjaGFyICp1c2VybmFtZT0iYXctbGFwcHkiOworCXNpemVfdCB1c2VybmFtZWxlbj1zdHJsZW4odXNlcm5hbWUpOworCSBjaGFyICp2aXNpdGVkbmV0d29yaz0iUGluayI7CisJc2l6ZV90IHZpc2l0ZWRuZXR3b3JrbGVuPXN0cmxlbih2aXNpdGVkbmV0d29yayk7CisJaW50IHJlZ2lzdHJhdGlvbnR5cGUgPSAyOworCS8vRmFrZSB2YWx1ZXMgU1RPUAorCQorCS8vQ3JlYXRlIHRoZSBiYXNlIG1lc3NhZ2UgZm9yIGFuIFJUUgorCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIlVzZXItQXV0aG9yaXphdGlvbi1SZXF1ZXN0IiwgJnVhcl9tb2RlbCwgRU5PRU5UKSApOworCUNIRUNLX0ZDVCggZmRfbXNnX25ldyAodWFyX21vZGVsLCAwLCAmbWVzc2FnZSkpOworCQorCQorCQorCS8vIENyZWF0ZSBhIG5ldyBzZXNzaW9uIAorCXsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfbmV3X3Nlc3Npb24oIG1lc3NhZ2UsIChvczBfdCkiYXBwc2lwIiwgQ09OU1RTVFJMRU4oImFwcHNpcCIpICkgKTsKKwl9CisJCisJLy9BZGQgdGhlIEF1dGgtQXBwbGljYXRpb24tSWQgCisJeworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3ICggc2lwX2RpY3QuQXV0aF9BcHBsaWNhdGlvbl9JZCwgMCwgJmF2cCApICk7CisJCXZhbHVlLmkzMiA9IDY7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9zZXR2YWx1ZSAoIGF2cCwgJnZhbHVlICkgKTsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCAoIG1lc3NhZ2UsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwKSApOworCX0KKwkKKwkvL0F1dGhfU2Vzc2lvbl9TdGF0ZQorCXsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIHNpcF9kaWN0LkF1dGhfU2Vzc2lvbl9TdGF0ZSwgMCwgJmF2cCApICk7CisJCXZhbHVlLmkzMj0xOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUoIGF2cCwgJnZhbHVlICkgKTsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCggbWVzc2FnZSwgTVNHX0JSV19MQVNUX0NISUxELCBhdnAgKSApOworCX0KKwkKKwkvL09yaWdpbl9Ib3N0ICYgT3JpZ2luX1JlYWxtCisJQ0hFQ0tfRkNUKCBmZF9tc2dfYWRkX29yaWdpbiAoIG1lc3NhZ2UsIDAgKSk7CisJCisJLy9EZXN0aW5hdGlvbl9Ib3N0CisJeworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3ICggc2lwX2RpY3QuRGVzdGluYXRpb25fSG9zdCwgMCwgJmF2cCApICk7CisJCXZhbHVlLm9zLmRhdGE9KHVuc2lnbmVkIGNoYXIgKilkZXN0aW5hdGlvbl9ob3N0OworCQl2YWx1ZS5vcy5sZW49ZGVzdGluYXRpb25faG9zdGxlbjsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX3NldHZhbHVlKCBhdnAsICZ2YWx1ZSApICk7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQoIG1lc3NhZ2UsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwICkgKTsKKwl9CisJLy9EZXN0aW5hdGlvbl9SZWFsbQorCXsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIHNpcF9kaWN0LkRlc3RpbmF0aW9uX1JlYWxtLCAwLCAmYXZwICkgKTsKKwkJdmFsdWUub3MuZGF0YT0odW5zaWduZWQgY2hhciAqKWRlc3RpbmF0aW9uX3JlYWxtOworCQl2YWx1ZS5vcy5sZW49ZGVzdGluYXRpb25fcmVhbG1sZW47CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9zZXR2YWx1ZSggYXZwLCAmdmFsdWUgKSApOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkKCBtZXNzYWdlLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCApICk7CisJfQorCQorCS8vU0lQX0FPUgorCXsKKwkJCisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBzaXBfZGljdC5TSVBfQU9SLCAwLCAmYXZwICkgKTsKKwkJdmFsdWUub3MuZGF0YT0odW5zaWduZWQgY2hhciAqKXNpcF9hb3I7CisJCXZhbHVlLm9zLmxlbj1hb3JfbGVuOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUoIGF2cCwgJnZhbHVlICkgKTsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCggbWVzc2FnZSwgTVNHX0JSV19MQVNUX0NISUxELCBhdnAgKSApOworCQkKKwl9CisJLy9Vc2VybmFtZQorCXsKKwkJCisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBzaXBfZGljdC5Vc2VyX05hbWUsIDAsICZhdnAgKSApOworCQl2YWx1ZS5vcy5kYXRhPSh1bnNpZ25lZCBjaGFyICopdXNlcm5hbWU7CisJCXZhbHVlLm9zLmxlbj11c2VybmFtZWxlbjsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX3NldHZhbHVlKCBhdnAsICZ2YWx1ZSApICk7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQoIG1lc3NhZ2UsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwICkgKTsKKwkJCisJfQorCS8vVmlzaXRlZCBOZXR3b3JrCisJeworCQkKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIHNpcF9kaWN0LlNJUF9WaXNpdGVkX05ldHdvcmtfSWQsIDAsICZhdnAgKSApOworCQl2YWx1ZS5vcy5kYXRhPSh1bnNpZ25lZCBjaGFyICopdmlzaXRlZG5ldHdvcms7CisJCXZhbHVlLm9zLmxlbj12aXNpdGVkbmV0d29ya2xlbjsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX3NldHZhbHVlKCBhdnAsICZ2YWx1ZSApICk7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQoIG1lc3NhZ2UsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwICkgKTsKKwkJCisJfQorCS8vQXV0aG9yaXphdGlvbiBUeXBlCisJeworCQkKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIHNpcF9kaWN0LlNJUF9Vc2VyX0F1dGhvcml6YXRpb25fVHlwZSwgMCwgJmF2cCApICk7CisJCXZhbHVlLmkzMj1yZWdpc3RyYXRpb250eXBlOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUoIGF2cCwgJnZhbHVlICkgKTsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCggbWVzc2FnZSwgTVNHX0JSV19MQVNUX0NISUxELCBhdnAgKSApOworCQkKKwl9CisJCisJQ0hFQ0tfRkNUKCBmZF9tc2dfc2VuZCggJm1lc3NhZ2UsIE5VTEwsIE5VTEwgKSk7CisJCisJcmV0dXJuIDA7Cit9CisKK2ludCB0ZXN0X3NpcF9VQUFfY2IoIHN0cnVjdCBtc2cgKiogbXNnLCBzdHJ1Y3QgYXZwICogcGFyYW1hdnAsIHN0cnVjdCBzZXNzaW9uICogc2Vzcywgdm9pZCAqIG9wYXF1ZSwgZW51bSBkaXNwX2FjdGlvbiAqIGFjdCkKK3sKKwkKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZyZWVEaWFtZXRlcmQvQ01ha2VMaXN0cy50eHQgYi9mcmVlRGlhbWV0ZXJkL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MmFmZGUKLS0tIC9kZXYvbnVsbAorKysgYi9mcmVlRGlhbWV0ZXJkL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMjIgQEAKKyMgVGhlIHN1YnByb2plY3QgbmFtZQorUHJvamVjdCgiZnJlZURpYW1ldGVyIHNpbXBsZSBkYWVtb24iIEMpCisKKyMgU2luY2UgaXQgdXNlcyB0aGUgbGliZmRjb3JlLmgsIGl0IG5lZWRzIHRoZSBpbmNsdWRlIGRlcGVuZGVuY2llcworSU5DTFVERV9ESVJFQ1RPUklFUygke0xGRENPUkVfSU5DTFVERVN9KQorCisjIEJ1aWxkIHRoZSBleGVjdXRhYmxlCitBRERfRVhFQ1VUQUJMRShmcmVlRGlhbWV0ZXJkIG1haW4uYykKKworIyBUaGUgdmVyc2lvbgorU0VUX1RBUkdFVF9QUk9QRVJUSUVTKGZyZWVEaWFtZXRlcmQgUFJPUEVSVElFUyAKKwlWRVJTSU9OICR7RkRfUFJPSkVDVF9WRVJTSU9OX01BSk9SfS4ke0ZEX1BST0pFQ1RfVkVSU0lPTl9NSU5PUn0uJHtGRF9QUk9KRUNUX1ZFUlNJT05fUkVWfSkKKworIyBUaGUgbGluayBjb21tYW5kCitUQVJHRVRfTElOS19MSUJSQVJJRVMoZnJlZURpYW1ldGVyZCBsaWJmZHByb3RvIGxpYmZkY29yZSAke0dOVVRMU19MSUJSQVJJRVN9KQorCisjIyMjCisjIyBJTlNUQUxMIHNlY3Rpb24gIyMKKworSU5TVEFMTChUQVJHRVRTIGZyZWVEaWFtZXRlcmQKKwlSVU5USU1FIERFU1RJTkFUSU9OICR7SU5TVEFMTF9EQUVNT05fU1VGRklYfQorCUNPTVBPTkVOVCBmcmVlRGlhbWV0ZXItZGFlbW9uKQpkaWZmIC0tZ2l0IGEvZnJlZURpYW1ldGVyZC9tYWluLmMgYi9mcmVlRGlhbWV0ZXJkL21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGVjYmI0Ci0tLSAvZGV2L251bGwKKysrIGIvZnJlZURpYW1ldGVyZC9tYWluLmMKQEAgLTAsMCArMSwyOTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDE1LCBXSURFIFByb2plY3QgYW5kIE5JQ1QJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFdJREUgUHJvamVjdCBvciBOSUNUIG5vciB0aGUgCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgV0lERSBQcm9qZWN0IGFuZCAJCQkJCQkgKgorKiAgIE5JQ1QuCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGZyZWVEaWFtZXRlci9mcmVlRGlhbWV0ZXItaG9zdC5oPgorI2luY2x1ZGUgPGZyZWVEaWFtZXRlci9saWJmZGNvcmUuaD4KKworI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPGxvY2FsZS5oPgorCisKKy8qIGZvcndhcmQgZGVjbGFyYXRpb25zICovCitzdGF0aWMgaW50IG1haW5fY21kbGluZShpbnQgYXJnYywgY2hhciAqYXJndltdKTsKK3N0YXRpYyB2b2lkICogY2F0Y2hfc2lnbmFscyh2b2lkICogYXJnKTsKK3N0YXRpYyBwdGhyZWFkX3Qgc2lnbmFsc190aHI7CisKK3N0YXRpYyBjaGFyICpjb25mZmlsZSA9IE5VTEw7CitzdGF0aWMgaW50IGdudXRsc19kZWJ1ZyA9IDA7CisKKy8qIGdudXRscyBkZWJ1ZyAqLworc3RhdGljIHZvaWQgZmRfZ251dGxzX2RlYnVnKGludCBsZXZlbCwgY29uc3QgY2hhciAqIHN0cikgeworCWZkX2xvZ19kZWJ1ZygiIFtnbnV0bHM6JWRdICVzIiwgbGV2ZWwsIHN0cik7Cit9CisKKworLyogZnJlZURpYW1ldGVyIHN0YXJ0aW5nIHBvaW50ICovCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqIGFyZ3ZbXSkKK3sKKwlpbnQgcmV0OworCXNpZ3NldF90IHNpZ19hbGw7CisJCisJLyogQmxvY2sgYWxsIHNpZ25hbHMgZnJvbSB0aGUgY3VycmVudCB0aHJlYWQgYW5kIGFsbCBpdHMgZnV0dXJlIGNoaWxkcmVuIC0tIHdlIHdpbGwgY2F0Y2ggZXZlcnl0aGluZyBpbiBjYXRjaF9zaWduYWxzICovCisJc2lnZmlsbHNldCgmc2lnX2FsbCk7CisJcmV0ID0gcHRocmVhZF9zaWdtYXNrKFNJR19CTE9DSywgJnNpZ19hbGwsIE5VTEwpOworCUFTU0VSVChyZXQgPT0gMCk7CisJCisJLyogUGFyc2UgdGhlIGNvbW1hbmQtbGluZSAqLworCXJldCA9IG1haW5fY21kbGluZShhcmdjLCBhcmd2KTsKKwlpZiAocmV0ICE9IDApIHsKKwkJcmV0dXJuIHJldDsKKwl9CisJCisJLyogSW5pdGlhbGl6ZSB0aGUgY29yZSBsaWJyYXJ5ICovCisJcmV0ID0gZmRfY29yZV9pbml0aWFsaXplKCk7CisJaWYgKHJldCAhPSAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIGZyZWVEaWFtZXRlciBjb3JlIGxpYnJhcnkgaW5pdGlhbGl6YXRpb24uXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJCisJLyogU2V0IGdudXRscyBkZWJ1ZyBsZXZlbCA/ICovCisJaWYgKGdudXRsc19kZWJ1ZykgeworCQlnbnV0bHNfZ2xvYmFsX3NldF9sb2dfZnVuY3Rpb24oKGdudXRsc19sb2dfZnVuYylmZF9nbnV0bHNfZGVidWcpOworCQlnbnV0bHNfZ2xvYmFsX3NldF9sb2dfbGV2ZWwgKGdudXRsc19kZWJ1Zyk7CisJCVRSQUNFX0RFQlVHKElORk8sICJFbmFibGVkIEdOVVRMUyBkZWJ1ZyBhdCBsZXZlbCAlZCIsIGdudXRsc19kZWJ1Zyk7CisJfQorCQorCS8qIFBhcnNlIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgKi8KKwlDSEVDS19GQ1RfRE8oIGZkX2NvcmVfcGFyc2Vjb25mKGNvbmZmaWxlKSwgZ290byBlcnJvciApOworCQorCS8qIFN0YXJ0IHRoZSBzZXJ2ZXJzICovCisJQ0hFQ0tfRkNUX0RPKCBmZF9jb3JlX3N0YXJ0KCksIGdvdG8gZXJyb3IgKTsKKwkKKwkvKiBBbGxvdyBTSUdJTlQgYW5kIFNJR1RFUk0gZnJvbSB0aGlzIHBvaW50IHRvIHRlcm1pbmF0ZSB0aGUgYXBwbGljYXRpb24gKi8KKwlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9jcmVhdGUoJnNpZ25hbHNfdGhyLCBOVUxMLCBjYXRjaF9zaWduYWxzLCBOVUxMKSwgZ290byBlcnJvciApOworCQorCVRSQUNFX0RFQlVHKElORk8sIEZEX1BST0pFQ1RfQklOQVJZICIgZGFlbW9uIGluaXRpYWxpemVkLiIpOworCisJLyogTm93LCBqdXN0IHdhaXQgZm9yIHRlcm1pbmF0aW9uICovCisJQ0hFQ0tfRkNUKCBmZF9jb3JlX3dhaXRfc2h1dGRvd25fY29tcGxldGUoKSApOworCQorCS8qIEp1c3QgaW4gY2FzZSBpdCB3YXMgbm90IHRoZSByZXN1bHQgb2YgYSBzaWduYWwsIHdlIGNhbmNlbCBzaWduYWxzX3RociAqLworCWZkX3Rocl90ZXJtKCZzaWduYWxzX3Rocik7CisJCisJcmV0dXJuIDA7CitlcnJvcjoJCisJQ0hFQ0tfRkNUX0RPKCBmZF9jb3JlX3NodXRkb3duKCksICApOworCUNIRUNLX0ZDVCggZmRfY29yZV93YWl0X3NodXRkb3duX2NvbXBsZXRlKCkgKTsKKwlmZF90aHJfdGVybSgmc2lnbmFsc190aHIpOworCXJldHVybiAtMTsKK30KKworCisvKiBEaXNwbGF5IHBhY2thZ2UgdmVyc2lvbiAqLworc3RhdGljIHZvaWQgbWFpbl92ZXJzaW9uX2NvcmUodm9pZCkKK3sKKwlwcmludGYoIiVzLCB2ZXJzaW9uICVzXG4iLCBGRF9QUk9KRUNUX05BTUUsIGZkX2NvcmVfdmVyc2lvbik7Cit9CisKKy8qIERpc3BsYXkgcGFja2FnZSB2ZXJzaW9uIGFuZCBnZW5lcmFsIGluZm8gKi8KK3N0YXRpYyB2b2lkIG1haW5fdmVyc2lvbih2b2lkKQoreworCW1haW5fdmVyc2lvbl9jb3JlKCk7CisJcHJpbnRmKCAiJXNcbiIsIEZEX1BST0pFQ1RfQ09QWVJJR0hUKTsKKwlwcmludGYoICJcblNlZSAiIEZEX1BST0pFQ1RfTkFNRSAiIGhvbWVwYWdlIGF0IGh0dHA6Ly93d3cuZnJlZWRpYW1ldGVyLm5ldC9cbiIKKwkJIiBmb3IgaW5mb3JtYXRpb24sIHVwZGF0ZXMgYW5kIGJ1ZyByZXBvcnRzIG9uIHRoaXMgc29mdHdhcmUuXG4iKTsKK30KKworLyogUHJpbnQgY29tbWFuZC1saW5lIG9wdGlvbnMgKi8KK3N0YXRpYyB2b2lkIG1haW5faGVscCggdm9pZCApCit7CisJbWFpbl92ZXJzaW9uX2NvcmUoKTsKKwlwcmludGYoCSIgIFRoaXMgZGFlbW9uIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBEaWFtZXRlciBwcm90b2NvbFxuIgorCQkiICB1c2VkIGZvciBBdXRoZW50aWNhdGlvbiwgQXV0aG9yaXphdGlvbiwgYW5kIEFjY291bnRpbmcgKEFBQSkuXG4iKTsKKwlwcmludGYoIlxuVXNhZ2U6ICAiIEZEX1BST0pFQ1RfQklOQVJZICIgW09QVElPTlNdLi4uXG4iKTsKKwlwcmludGYoICIgIC1oLCAtLWhlbHAgICAgICAgICAgICAgUHJpbnQgaGVscCBhbmQgZXhpdFxuIgorICAJCSIgIC1WLCAtLXZlcnNpb24gICAgICAgICAgUHJpbnQgdmVyc2lvbiBhbmQgZXhpdFxuIgorICAJCSIgIC1jLCAtLWNvbmZpZz1maWxlbmFtZSAgUmVhZCBjb25maWd1cmF0aW9uIGZyb20gdGhpcyBmaWxlIGluc3RlYWQgb2YgdGhlIFxuIgorCQkiICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCBsb2NhdGlvbiAoIiBERUZBVUxUX0NPTkZfUEFUSCAiLyIgRkRfREVGQVVMVF9DT05GX0ZJTEVOQU1FICIpLlxuIik7CisgCXByaW50ZiggIlxuRGVidWc6XG4iCisgIAkJIiAgVGhlc2Ugb3B0aW9ucyBhcmUgbW9zdGx5IHVzZWZ1bCBmb3IgZGV2ZWxvcGVyc1xuIgorICAJCSIgIC1sLCAtLWRiZ2xvY2FsZSAgICAgICAgIFNldCB0aGUgbG9jYWxlIGZvciBlcnJvciBtZXNzYWdlc1xuIgorICAJCSIgIC1kLCAtLWRlYnVnICAgICAgICAgICAgIEluY3JlYXNlIHZlcmJvc2l0eSBvZiBkZWJ1ZyBtZXNzYWdlcyBpZiBkZWZhdWx0IGxvZ2dlciBpcyB1c2VkXG4iCisgIAkJIiAgLXEsIC0tcXVpZXQgICAgICAgICAgICAgRGVjcmVhc2UgdmVyYm9zaXR5IGlmIGRlZmF1bHQgbG9nZ2VyIGlzIHVzZWRcbiIKKyAgCQkiICAtZiwgLS1kYmdfZnVuYyA8ZnVuYz4gICBFbmFibGUgYWxsIHRyYWNlcyB3aXRoaW4gdGhlIGZ1bmN0aW9uIDxmdW5jPlxuIgorICAJCSIgIC1GLCAtLWRiZ19maWxlIDxmaWxlLmM+IEVuYWJsZSBhbGwgdHJhY2VzIHdpdGhpbiB0aGUgZmlsZSA8ZmlsZS5jPiAoYmFzZW5hbWUgbWF0Y2gpXG4iCisgIAkJIiAgLS1kYmdfZ251dGxzIDxpbnQ+ICAgICAgRW5hYmxlIEdOVSBUTFMgZGVidWcgYXQgbGV2ZWwgPGludD5cbiIKKwkpOworfQorCisvKiBQYXJzZSB0aGUgY29tbWFuZC1saW5lICovCitzdGF0aWMgaW50IG1haW5fY21kbGluZShpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWludCBjOworCWludCBvcHRpb25faW5kZXggPSAwOworCWNoYXIgKiBsb2NhbGU7CisJCisgICAgICAJc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9IHsKKwkJeyAiaGVscCIsCW5vX2FyZ3VtZW50LCAJCU5VTEwsICdoJyB9LAorCQl7ICJ2ZXJzaW9uIiwJbm9fYXJndW1lbnQsIAkJTlVMTCwgJ1YnIH0sCisJCXsgImNvbmZpZyIsCXJlcXVpcmVkX2FyZ3VtZW50LCAJTlVMTCwgJ2MnIH0sCisJCXsgImRlYnVnIiwJbm9fYXJndW1lbnQsIAkJTlVMTCwgJ2QnIH0sCisJCXsgInF1aWV0IiwJbm9fYXJndW1lbnQsIAkJTlVMTCwgJ3EnIH0sCisJCXsgImRiZ2xvY2FsZSIsCW9wdGlvbmFsX2FyZ3VtZW50LCAJTlVMTCwgJ2wnIH0sCisJCXsgImRiZ19mdW5jIiwJcmVxdWlyZWRfYXJndW1lbnQsIAlOVUxMLCAnZicgfSwKKwkJeyAiZGJnX2ZpbGUiLAlyZXF1aXJlZF9hcmd1bWVudCwgCU5VTEwsICdGJyB9LAorCQl7ICJkYmdfZ251dGxzIiwJcmVxdWlyZWRfYXJndW1lbnQsIAlOVUxMLCAnZycgfSwKKwkJeyBOVUxMLAkJMCwgCQkJTlVMTCwgMCB9CisJfTsKKwkKKwkvKiBMb29wIG9uIGFyZ3VtZW50cyAqLworCXdoaWxlICgxKSB7CisJCWMgPSBnZXRvcHRfbG9uZyAoYXJnYywgYXJndiwgImhWYzpkcWw6ZjpGOmc6IiwgbG9uZ19vcHRpb25zLCAmb3B0aW9uX2luZGV4KTsKKwkJaWYgKGMgPT0gLTEpIAorCQkJYnJlYWs7CS8qIEV4aXQgZnJvbSB0aGUgbG9vcC4gICovCisJCQorCQlzd2l0Y2ggKGMpIHsKKwkJCWNhc2UgJ2gnOgkvKiBQcmludCBoZWxwIGFuZCBleGl0LiAgKi8KKwkJCQltYWluX2hlbHAoKTsKKwkJCQlleGl0KDApOworCisJCQljYXNlICdWJzoJLyogUHJpbnQgdmVyc2lvbiBhbmQgZXhpdC4gICovCisJCQkJbWFpbl92ZXJzaW9uKCk7CisJCQkJZXhpdCgwKTsKKworCQkJY2FzZSAnYyc6CS8qIFJlYWQgY29uZmlndXJhdGlvbiBmcm9tIHRoaXMgZmlsZSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IGxvY2F0aW9uLi4gICovCisJCQkJaWYgKG9wdGFyZyA9PSBOVUxMICkgeworCQkJCQlmcHJpbnRmKHN0ZGVyciwgIk1pc3NpbmcgYXJndW1lbnQgd2l0aCAtLWNvbmZpZyBkaXJlY3RpdmVcbiIpOworCQkJCQlyZXR1cm4gRUlOVkFMOworCQkJCX0KKwkJCQljb25mZmlsZSA9IG9wdGFyZzsKKwkJCQlicmVhazsKKworCQkJY2FzZSAnbCc6CS8qIENoYW5nZSB0aGUgbG9jYWxlLiAgKi8KKwkJCQlsb2NhbGUgPSBzZXRsb2NhbGUoTENfQUxMLCBvcHRhcmc/OiIiKTsKKwkJCQlpZiAoIWxvY2FsZSkgeworCQkJCQlmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBzZXQgbG9jYWxlICglcylcbiIsIG9wdGFyZyk7CisJCQkJCXJldHVybiBFSU5WQUw7CisJCQkJfQorCQkJCWJyZWFrOworCQkJCQorCQkJY2FzZSAnZCc6CS8qIEluY3JlYXNlIHZlcmJvc2l0eSBvZiBkZWJ1ZyBtZXNzYWdlcy4gICovCisJCQkJZmRfZ19kZWJ1Z19sdmwtLTsKKwkJCQlicmVhazsKKwkJCQkKKwkJCWNhc2UgJ2YnOgkvKiBGdWxsIGRlYnVnIGZvciB0aGUgZnVuY3Rpb24gd2l0aCB0aGlzIG5hbWUuICAqLworCQkJCSNpZmRlZiBERUJVRworCQkJCWZkX2RlYnVnX29uZV9mdW5jdGlvbiA9IG9wdGFyZzsKKwkJCQlmZF9nX2RlYnVnX2x2bCA9IEZEX0xPR19ERUJVRzsKKwkJCQkjZWxzZSAvKiBERUJVRyAqLworCQkJCWZwcmludGYoc3RkZXJyLCAiRXJyb3I6IG11c3QgY29tcGlsZSB3aXRoIERFQlVHIHN1cHBvcnQgdG8gdXNlIC0tZGJnX2Z1bmMgZmVhdHVyZSFcbiIpOworCQkJCXJldHVybiBFSU5WQUw7CisJCQkJI2VuZGlmIC8qIERFQlVHICovCisJCQkJYnJlYWs7CisJCQkJCisJCQljYXNlICdGJzoJLyogRnVsbCBkZWJ1ZyBmb3IgdGhlIGZpbGUgd2l0aCB0aGlzIG5hbWUuICAqLworCQkJCSNpZmRlZiBERUJVRworCQkJCWZkX2RlYnVnX29uZV9maWxlID0gYmFzZW5hbWUob3B0YXJnKTsKKwkJCQlmZF9nX2RlYnVnX2x2bCA9IEZEX0xPR19ERUJVRzsKKwkJCQkjZWxzZSAvKiBERUJVRyAqLworCQkJCWZwcmludGYoc3RkZXJyLCAiRXJyb3I6IG11c3QgY29tcGlsZSB3aXRoIERFQlVHIHN1cHBvcnQgdG8gdXNlIC0tZGJnX2ZpbGUgZmVhdHVyZSFcbiIpOworCQkJCXJldHVybiBFSU5WQUw7CisJCQkJI2VuZGlmIC8qIERFQlVHICovCisJCQkJYnJlYWs7CisJCQkJCisJCQljYXNlICdnJzoJLyogU2V0IGEgZGVidWcgbGV2ZWwgYW5kIGZ1bmN0aW9uIGZvciBHTlUgVExTIGNhbGxzLiAgKi8KKwkJCQlnbnV0bHNfZGVidWcgPSAoaW50KWF0b2kob3B0YXJnKTsKKwkJCQlicmVhazsKKwkJCQkKKwkJCWNhc2UgJ3EnOgkvKiBEZWNyZWFzZSB2ZXJib3NpdHkgdGhlbiByZW1vdmUgZGVidWcgbWVzc2FnZXMuICAqLworCQkJCWZkX2dfZGVidWdfbHZsKys7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgJz8nOgkvKiBJbnZhbGlkIG9wdGlvbi4gICovCisJCQkJLyogYGdldG9wdF9sb25nJyBhbHJlYWR5IHByaW50ZWQgYW4gZXJyb3IgbWVzc2FnZS4gICovCisJCQkJZnByaW50ZihzdGRlcnIsICJnZXRvcHRfbG9uZyBmb3VuZCBhbiBpbnZhbGlkIGNoYXJhY3RlclxuIik7CisJCQkJcmV0dXJuIEVJTlZBTDsKKworCQkJZGVmYXVsdDoJLyogYnVnOiBvcHRpb24gbm90IGNvbnNpZGVyZWQuICAqLworCQkJCWZwcmludGYoc3RkZXJyLCAiQSBjb21tYW5kLWxpbmUgb3B0aW9uIGlzIG1pc3NpbmcgaW4gcGFyc2VyOiAlY1xuIiwgYyk7CisJCQkJQVNTRVJUKDApOworCQkJCXJldHVybiBFSU5WQUw7CisJCX0KKwl9CisJCQorCXJldHVybiAwOworfQorCisvKiBIYW5kbGUgc29tZSBzaWduYWxzICovCitzdGF0aWMgdm9pZCAqIGNhdGNoX3NpZ25hbHModm9pZCAqIGFyZykKK3sKKwlzaWdzZXRfdCBzczsKKwlmZF9sb2dfdGhyZWFkbmFtZSAoICJzaWduYWxzIGNhdGNoZXIiICk7CisJCisJc2lnZW1wdHlzZXQoJnNzKTsKKwkKKwkvKiBTaWduYWxzIHRoYXQgdGVybWluYXRlIHRoZSBkYWVtb24gKi8KKwlzaWdhZGRzZXQoJnNzLCBTSUdURVJNKTsKKwlzaWdhZGRzZXQoJnNzLCBTSUdJTlQpOworCQorCS8qIFNpZ25hbHMgdGhhdCBzZW5kIGFuIGV2ZW50ICovCisJc2lnYWRkc2V0KCZzcywgU0lHVVNSMSk7CisJc2lnYWRkc2V0KCZzcywgU0lHVVNSMik7CisJCisJLyogV2UgdW5ibG9jayBhbGwgb3RoZXIgc2lnbmFscywgc28gdGhhdCB0aGVpciBkZWZhdWx0IGhhbmRsZXIgaXMgdXNlZCAoc3VjaCBhcyBTSUdUU1RQKSAqLworCUNIRUNLX1NZU19ETyggcHRocmVhZF9zaWdtYXNrKCBTSUdfU0VUTUFTSywgJnNzLCBOVUxMICksIGdvdG8gb3V0ICk7CisJCisJLyogTm93IGxvb3Agb24gdGhlIHJlY2VwdGlvbiBvZiB0aGUgc2lnbmFsICovCisJd2hpbGUgKDEpIHsKKwkJaW50IHNpZywgKnBzOworCQkKKwkJLyogV2FpdCB0byByZWNlaXZlIHRoZSBuZXh0IHNpZ25hbCAqLworCQlDSEVDS19QT1NJWF9ETyggc2lnd2FpdCgmc3MsICZzaWcpLCBicmVhayApOworCQkKKwkJVFJBQ0VfREVCVUcoRlVMTCwgIlNpZ25hbCAlZCBjYXVnaHQiLCBzaWcpOworCQkKKwkJc3dpdGNoIChzaWcpIHsKKwkJCWNhc2UgU0lHVVNSMToKKwkJCWNhc2UgU0lHVVNSMjoKKwkJCQlDSEVDS19NQUxMT0NfRE8oIHBzID0gbWFsbG9jKHNpemVvZihpbnQpKSwgZ290byBvdXQpOworCQkJCSpwcyA9IHNpZzsKKwkJCQlDSEVDS19GQ1RfRE8oIGZkX2V2ZW50X3NlbmQoZmRfZ19jb25maWctPmNuZl9tYWluX2V2LCBGREVWX1RSSUdHRVIsIHNpemVvZihpbnQpLCBwcyksIGdvdG8gb3V0ICk7CisJCQkJYnJlYWs7CisJCQkJCisJCQljYXNlIFNJR0lOVDoKKwkJCWNhc2UgU0lHVEVSTToKKwkJCQlDSEVDS19GQ1RfRE8oIGZkX2NvcmVfc2h1dGRvd24oKSwgZ290byBvdXQgKTsKKworCQl9CisJfQorb3V0OgkKKwkvKiBCZXR0ZXIgd2F5IHRvIGhhbmRsZSB0aGlzID8gKi8KKwlBU1NFUlQoMCk7CisJcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWVEaWFtZXRlci9DTWFrZUxpc3RzLnR4dCBiL2luY2x1ZGUvZnJlZURpYW1ldGVyL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkYjMyOTMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2ZyZWVEaWFtZXRlci9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDI0OSBAQAorI0NNYWtlIGNvbmZpZ3VyYXRpb24gZm9yIGZyZWVEaWFtZXRlciBpbmNsdWRlIGRpcmVjdG9yeQorCitQcm9qZWN0KCJmcmVlRGlhbWV0ZXIgaW5jbHVkZXMgZGlyZWN0b3J5IiBDKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29uZmlndXJhYmxlIHBhcmFtZXRlcnMKKworIyBEaXNhYmxlIFNDVFAgc3VwcG9ydCBjb21wbGV0ZWx5ID8KK09QVElPTihESVNBQkxFX1NDVFAgIkRpc2FibGUgU0NUUCBzdXBwb3J0PyIgT0ZGKQorSUYgKE5PVCBESVNBQkxFX1NDVFApCisJT1BUSU9OKERFQlVHX1NDVFAgIlZlcmJvc2UgU0NUUCAoZm9yIGRlYnVnKT8iIE9GRikKKwlPUFRJT04oU0NUUF9VU0VfTUFQUEVEX0FERFJFU1NFUyAiVXNlIHY2LW1hcHBlZCB2NCBhZGRyZXNzZXMgaW4gU0NUUCAod29ya2Fyb3VuZCBzb21lIFNDVFAgbGltaXRhdGlvbnMpPyIgT0ZGKQorRU5ESUYgKE5PVCBESVNBQkxFX1NDVFApCisKKyMgRmluZCBUT0RPIGl0ZW1zIGluIHRoZSBjb2RlIGVhc2lseSA/CitPUFRJT04oRVJST1JTX09OX1RPRE8gIihkZXZlbG9wbWVudCkgR2VuZXJhdGUgY29tcGlsYXRpb24gZXJyb3JzIG9uIFRPRE8gaXRlbXMgPyIgT0ZGKQorCisjIEluIERFQlVHIG1vZGUsIGVhY2ggbG9nIGNhbiBjb250YWluIHBpZCwgY2FsbGluZyBmdW5jdGlvbiBhbmQgZmlsZSBmb3IgZWFzeSBkZWJ1Zy4gU2V0IHRvIE9OIHRvIGRpc3BsYXkgdGhpcyBpbmZvcm1hdGlvbi4KK09QVElPTihERUJVR19XSVRIX01FVEEgIlNob3cgY2FsbGluZyBsb2NhdGlvbiBpbiBsb2dzPyIgT0ZGKQorCQorIyBDcmVhdGUgdGhlIGFic29sdXRlIHBhdGggZm9yIHNlYXJjaGluZyBleHRlbnNpb25zCitTRVQoREVGQVVMVF9FWFRFTlNJT05TX1BBVEggJHtDTUFLRV9JTlNUQUxMX1BSRUZJWH0vJHtJTlNUQUxMX0VYVEVOU0lPTlNfU1VGRklYfSkKKworIyBJRE5BIGNvbnNpZGVyYXRpb25zCitPUFRJT04oRElBTUlEX0lETkFfSUdOT1JFICJJZ25vcmUgY29tcGxldGVseSBpbnZhbGlkIGNoYXJhY3RlcnMgaW4gRGlhbWV0ZXIgSWRlbnRpdGllcyAocHJvY2VzcyBibGluZGx5KT8iIE9GRikKK0lGIChOT1QgRElBTUlEX0lETkFfSUdOT1JFKQorCU9QVElPTiAoRElBTUlEX0lETkFfUkVKRUNUICJSZWplY3QgaW50ZXJuYXRpb25hbGl6ZWQgRGlhbWV0ZXIgSWRlbnRpdGllcywgZG8gbm90IGF0dGVtcHQgdG8gY29udmVydCBpdCAoc3RyaW5ncHJlcCkgPyIgT0ZGKQorRU5ESUYgKE5PVCBESUFNSURfSUROQV9JR05PUkUpCisKKyMgRGlzYWJsZSBleHBpcmF0aW9uIG9mIGNvbm5lY3Rpb25zIHdpdGggZHluYW1pY2FsbHkgY29ubmVjdGVkIHBlZXJzIGFzIHBlciBSRkMgMzUzOSA/IChkZWZhdWx0IGlzIGVuYWJsZWQpCisjIE5vdGU6IGlmIHNvbWVvbmUgbmVlZHMsIHdlIGNvdWxkIGFsc28gbWFrZSB0aGUgZGVsYXkgY29uZmlndXJhYmxlIGhlcmUuLi4KK09QVElPTihESVNBQkxFX1BFRVJfRVhQSVJZICJEaXNhYmxlIFJGQzM1MzkgUGVlcnMgQ29ubmVjdGlvbnMgRXhwaXJhdGlvbiBhZnRlciBpbmFjdGl2aXR5PyIgT0ZGKQorCisjIFRoZSBmb2xsb3dpbmcgd29ya2Fyb3VuZCBpbmNyZWFzZXMgY29tcGF0aWJpbGl0eSB3aXRoIHNvbWUgaW1wbGVtZW50YXRpb25zIHdpdGhvdXQgYnJlYWtpbmcgYW55dGhpbmcgaW4gZnJlZURpYW1ldGVyLCAKKyMgc28gaXQgY2FuIGJlIGVuYWJsZWQgd2l0aG91dCByaXNrLiBXZSBrZWVwIGl0IGRpc2FibGVkIGJ5IGRlZmF1bHQgYW55d2F5IGZvciB0aG9zZSBwZW9wbGUgd2hvIHVzZSBmcmVlRGlhbWV0ZXIgdG8gY2hlY2sgdGhlIAorIyBjb21wbGlhbmN5IG9mIHRoZWlyIGltcGxlbWVudGF0aW9uIHdpdGggdGhlIERpYW1ldGVyIFJGQy4uLgorT1BUSU9OKFdPUktBUk9VTkRfQUNDRVBUX0lOVkFMSURfVlNBSSAiRG8gbm90IHJlamVjdCBhIENFUi9DRUEgd2l0aCBhIFZlbmRvci1TcGVjaWZpYy1BcHBsaWNhdGlvbi1JZCBBVlAgY29udGFpbmluZyBib3RoIEF1dGgtIGFuZCBBY2N0LSBhcHBsaWNhdGlvbiBBVlBzPyIgT0ZGKQorCitNQVJLX0FTX0FEVkFOQ0VEKERJU0FCTEVfU0NUUCBERUJVR19TQ1RQIFNDVFBfVVNFX01BUFBFRF9BRERSRVNTRVMgRVJST1JTX09OX1RPRE8gREVCVUdfV0lUSF9NRVRBIERJQU1JRF9JRE5BX0lHTk9SRSBESUFNSURfSUROQV9SRUpFQ1QgRElTQUJMRV9QRUVSX0VYUElSWSBXT1JLQVJPVU5EX0FDQ0VQVF9JTlZBTElEX1ZTQUkpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIFN5c3RlbSBjaGVja3MgcGFydAorCitJTkNMVURFIChDaGVja0xpYnJhcnlFeGlzdHMpCitJTkNMVURFIChDaGVja0Z1bmN0aW9uRXhpc3RzKQorSU5DTFVERSAoQ2hlY2tJbmNsdWRlRmlsZXMpCitJTkNMVURFIChDaGVja1N5bWJvbEV4aXN0cykgCitJTkNMVURFIChDaGVja0NTb3VyY2VDb21waWxlcykKK0lOQ0xVREUgKFRlc3RCaWdFbmRpYW4pCisKKworIyMjIFN5c3RlbSBjaGVja3MgLS0gbWFuZGF0b3J5IHN1cHBvcnQKKworIyBXZSBuZWVkIHRoZSBnZXRvcHRfbG9uZyBmdW5jdGlvbgorQ0hFQ0tfRlVOQ1RJT05fRVhJU1RTIChnZXRvcHRfbG9uZyBIQVZFX0xPTkdfT1BUSU9OUykKK0lGIChOT1QgSEFWRV9MT05HX09QVElPTlMpCisgICBNRVNTQUdFKFNFTkRfRVJST1IgIlRoZSBnZXRvcHRfbG9uZyBmdW5jdGlvbiBpcyBub3QgZm91bmQsIHBsZWFzZSBhZGQgbmVlZGVkIGxpYnJhcnkgaW4gYnVpbGQgc3lzdGVtIikKK0VORElGIChOT1QgSEFWRV9MT05HX09QVElPTlMpCisKKyMgZ2V0aWZhZGRycyA/CitDSEVDS19GVU5DVElPTl9FWElTVFMgKGdldGlmYWRkcnMgSEFWRV9HRVRJRkFERFJTKQorSUYgKE5PVCBIQVZFX0dFVElGQUREUlMpCisgICBNRVNTQUdFKFNFTkRfRVJST1IgIlRoZSBnZXRpZmFkZHJzIGZ1bmN0aW9uIGlzIGN1cnJlbnRseSByZXF1aXJlZCBieSBmcmVlRGlhbWV0ZXIuIikKK0VORElGIChOT1QgSEFWRV9HRVRJRkFERFJTKQorCisKKyMjIyBTeXN0ZW0gY2hlY2tzIC0tIGZvciBmcmVlRGlhbWV0ZXItaG9zdC5oCisKKyMgQ2hlY2sgYnl0ZSBvcmRlcmluZworVEVTVF9CSUdfRU5ESUFOKEhPU1RfQklHX0VORElBTikKKworIyBDaGVjayBpZiBudG9obGwgaXMgcHJvdmlkZWQgb24gdGhlIHN5c3RlbQorQ0hFQ0tfU1lNQk9MX0VYSVNUUyhudG9obGwgbmV0aW5ldC9pbi5oIEhBVkVfTlRPSExMKQorCisjIG1hbGxvYy5oID8KK0NIRUNLX0lOQ0xVREVfRklMRVMgKG1hbGxvYy5oIEhBVkVfTUFMTE9DX0gpCisKKyMgc3RybmR1cCA/IE1pc3Npbmcgb24gT1MgWAorQ0hFQ0tfRlVOQ1RJT05fRVhJU1RTIChzdHJuZHVwIEhBVkVfU1RSTkRVUCkKKworCisjIyMgU3lzdGVtIGNoZWNrcyAtLSBmb3IgaW5jbHVkZXMgLyBsaW5rCisKKyMgcHRocmVhZHMKK0lOQ0xVREUoRmluZFRocmVhZHMpCitTRVQoQ01BS0VfVEhSRUFEX0xJQlNfSU5JVCAke0NNQUtFX1RIUkVBRF9MSUJTX0lOSVR9IFBBUkVOVF9TQ09QRSkKKworIyBjbG9ja19nZXR0aW1lCitTRVQoSEFWRV9DTE9DS19HRVRUSU1FICIiKQorQ0hFQ0tfRlVOQ1RJT05fRVhJU1RTIChjbG9ja19nZXR0aW1lIEhBVkVfTkFUSVZFX0NMT0NLX0dFVFRJTUUpCitJRiAoSEFWRV9OQVRJVkVfQ0xPQ0tfR0VUVElNRSkKKyAgIFNFVChDTE9DS19HRVRUSU1FX0xJQlMgIiIpCisgICBTRVQoSEFWRV9DTE9DS19HRVRUSU1FIDEpCitFTFNFIChIQVZFX05BVElWRV9DTE9DS19HRVRUSU1FKQorICAgQ0hFQ0tfTElCUkFSWV9FWElTVFMgKHJ0IGNsb2NrX2dldHRpbWUgIiIgSEFWRV9MSUJSVCkKKyAgIElGIChIQVZFX0xJQlJUKQorICAgICBTRVQoQ0xPQ0tfR0VUVElNRV9MSUJTICItbHJ0IikKKyAgICAgU0VUKEhBVkVfQ0xPQ0tfR0VUVElNRSAxKQorICAgRUxTRSAoSEFWRV9MSUJSVCkKKyAgICAgQ0hFQ0tfTElCUkFSWV9FWElTVFMgKHBvc2l4NCBjbG9ja19nZXR0aW1lICIiIEhBVkVfTElCUE9TSVg0KQorICAgICBJRiAoSEFWRV9MSUJQT1NJWDQpCisgICAgICAgU0VUKENMT0NLX0dFVFRJTUVfTElCUyAiLWxwb3NpeDQiKQorICAgICAgIFNFVChIQVZFX0NMT0NLX0dFVFRJTUUgMSkKKyAgICAgRU5ESUYgKEhBVkVfTElCUE9TSVg0KQorICAgRU5ESUYgKEhBVkVfTElCUlQpCitFTkRJRiAoSEFWRV9OQVRJVkVfQ0xPQ0tfR0VUVElNRSkKK1NFVChDTE9DS19HRVRUSU1FX0xJQlMgJHtDTE9DS19HRVRUSU1FX0xJQlN9IFBBUkVOVF9TQ09QRSkKKworIyBkbG9wZW4gYW5kIGRsY2xvc2U6IENNQUtFX0RMX0xJQlMKKworIyBXZSBuZWVkIHRoZSBzY3RwX2Nvbm5lY3R4IGZ1bmN0aW9uIGFtb25nIG90aGVycworIyBXZSBuZWVkIHRoZSBJUFBST1RPX1NDVFAgc3ltYm9sIGZyb20gc3lzL3NvY2tldC5oLCBuZXRpbmV0L2luLmggb3IgbmV0aW5ldC9zY3RwLmgKK0lGKE5PVCBESVNBQkxFX1NDVFApCisJQ0hFQ0tfRlVOQ1RJT05fRVhJU1RTKHNjdHBfY29ubmVjdHggSEFWRV9OQVRJVkVfU0NUUCkKKwlJRihOT1QgSEFWRV9OQVRJVkVfU0NUUCkKKwkJRklORF9QQUNLQUdFKFNDVFAgUkVRVUlSRUQpCisJRU5ESUYoTk9UIEhBVkVfTkFUSVZFX1NDVFApCisJIyBOb3cgY2hlY2sgdGhlIG51bWJlciBvZiBhcmdzIG9mIHRoaXMgZnVuY3Rpb24sIHNpbmNlIGl0IGNoYW5nZWQgYmV0d2VlbiBVYnVudHUgOS4wNCBhbmQgOS4xMAorICAgCVNFVChDSEVDS19TQ1RQX0NPTk5FQ1RYXzRfQVJHU19TT1VSQ0VfQ09ERSAiCisJCSNpbmNsdWRlIDx1bmlzdGQuaD4KKwkJI2luY2x1ZGUgPG5ldGluZXQvc2N0cC5oPgorCQlpbnQgbWFpbigpIHsKKwkJICAgcmV0dXJuIHNjdHBfY29ubmVjdHgoMCwgTlVMTCwgMCwgTlVMTCk7CisJCX0KKwkJIikKKwlTRVQoQ01BS0VfUkVRVUlSRURfSU5DTFVERVMgJHtTQ1RQX0lOQ0xVREVfRElSfSkKKwlTRVQoQ01BS0VfUkVRVUlSRURfTElCUkFSSUVTICR7U0NUUF9MSUJSQVJJRVN9KQorCUNIRUNLX0NfU09VUkNFX0NPTVBJTEVTKCIke0NIRUNLX1NDVFBfQ09OTkVDVFhfNF9BUkdTX1NPVVJDRV9DT0RFfSIgU0NUUF9DT05ORUNUWF80X0FSR1MpCitFTFNFIChOT1QgRElTQUJMRV9TQ1RQKQorCU1FU1NBR0UoU1RBVFVTICJEaXNhYmxlZCBTQ1RQIHN1cHBvcnQuIikKK0VORElGKE5PVCBESVNBQkxFX1NDVFApCitTRVQoU0NUUF9JTkNMVURFX0RJUiAke1NDVFBfSU5DTFVERV9ESVJ9IFBBUkVOVF9TQ09QRSkKK1NFVChTQ1RQX0xJQlJBUklFUyAke1NDVFBfTElCUkFSSUVTfSBQQVJFTlRfU0NPUEUpCisKKyMgSUROQSBwcm9jZXNzOiB3ZSB1c2UgbGliaWRuIGZyb20gR05VICh1bmxlc3MgdGhlIGZ1bmN0aW9uICYgaGVhZGVyIGZpbGVzIGFyZSBpbmNsdWRlZCBpbiBsaWJjKQorSUYoTk9UIERJQU1JRF9JRE5BX0lHTk9SRSAgQU5EIE5PVCBESUFNSURfSUROQV9SRUpFQ1QpCisJRklORF9QQUNLQUdFKElETkEpCisgICAJU0VUKENIRUNLX0lETkFfU09VUkNFX0NPREUgIgorCQkjaW5jbHVkZSA8aWRuYS5oPgorCQlpbnQgbWFpbigpIHsKKwkJICAgcmV0dXJuIGlkbmFfdG9fYXNjaWlfOHooTlVMTCwgTlVMTCwgMCk7CisJCX0KKwkJIikKKwlTRVQoQ01BS0VfUkVRVUlSRURfSU5DTFVERVMgJHtJRE5BX0lOQ0xVREVfRElSfSkKKwlTRVQoQ01BS0VfUkVRVUlSRURfTElCUkFSSUVTICR7SUROQV9MSUJSQVJJRVN9KQorCUNIRUNLX0NfU09VUkNFX0NPTVBJTEVTKCIke0NIRUNLX0lETkFfU09VUkNFX0NPREV9IiBIQVNfSUROQV9TVVBQT1JUKQorCUlGKE5PVCBIQVNfSUROQV9TVVBQT1JUKQorCQlNRVNTQUdFKFNFTkRfRVJST1IgIlVuYWJsZSB0byBmaW5kIGlkbmEuaCBoZWFkZXIgb3IgaWRuYV90b19hc2NpaV84eiBmdW5jdGlvbiwgcGxlYXNlIGluc3RhbGwgbGliaWRuLWRldiBvciBlcXVpdmFsZW50LCBvciBzZXQgRElBTUlEX0lETkFfSUdOT1JFIG9yIERJQU1JRF9JRE5BX1JFSkVDVCIpCisJRU5ESUYoTk9UIEhBU19JRE5BX1NVUFBPUlQpCitFTFNFIChOT1QgRElBTUlEX0lETkFfSUdOT1JFICBBTkQgTk9UIERJQU1JRF9JRE5BX1JFSkVDVCkKKwlNRVNTQUdFKFNUQVRVUyAiTm9uLWRlZmF1bHQgSW50ZXJuYXRpb25hbGl6ZWQgRG9tYWluIE5hbWVzIChJRE4pIGJlaGF2aW9yIHNlbGVjdGVkIChubyBzdHJpbmdwcmVwKS4iKQorRU5ESUYoTk9UIERJQU1JRF9JRE5BX0lHTk9SRSAgQU5EIE5PVCBESUFNSURfSUROQV9SRUpFQ1QpCitTRVQoSUROQV9JTkNMVURFX0RJUiAke0lETkFfSU5DTFVERV9ESVJ9IFBBUkVOVF9TQ09QRSkKK1NFVChJRE5BX0xJQlJBUklFUyAke0lETkFfTElCUkFSSUVTfSBQQVJFTlRfU0NPUEUpCisKKworIyBSZXF1aXJlIEdOVSBUTFMgZm9yIGJ1aWxkaW5nIHRoZSBsaWJyYXJ5CitGSU5EX1BBQ0tBR0UoR251VExTIFJFUVVJUkVEKQorU0VUKEdOVVRMU19JTkNMVURFX0RJUiAke0dOVVRMU19JTkNMVURFX0RJUn0gUEFSRU5UX1NDT1BFKQorU0VUKEdOVVRMU19MSUJSQVJJRVMgJHtHTlVUTFNfTElCUkFSSUVTfSBQQVJFTlRfU0NPUEUpCisKK2ZpbmRfcGF0aChHQ1JZUFRfSU5DTFVERV9ESVIgTkFNRVMgZ2NyeXB0LmgpCitJZiAoIE5PVCBHQ1JZUFRfSU5DTFVERV9ESVIgKQorCU1FU1NBR0UoU0VORF9FUlJPUiAiVW5hYmxlIHRvIGZpbmQgZ2NyeXB0LmgsIHBsZWFzZSBpbnN0YWxsIGxpYmdjcnlwdC1kZXYgb3IgZXF1aXZhbGVudCIpCitFbmRpZiAoIE5PVCBHQ1JZUFRfSU5DTFVERV9ESVIgKQorTUFSS19BU19BRFZBTkNFRChHQ1JZUFRfSU5DTFVERV9ESVIpCitTRVQoR0NSWVBUX0lOQ0xVREVfRElSICR7R0NSWVBUX0lOQ0xVREVfRElSfSBQQVJFTlRfU0NPUEUpCisKKyMgQWxzbyB3ZSBuZWVkIGxpYmdjcnlwdCB0by4uLiBkaXNwbGF5IGl0cyB2ZXJzaW9uIDooCitmaW5kX2xpYnJhcnkoR0NSWVBUX0xJQlJBUlkgCisgIE5BTUVTIGdjcnlwdAorKQorSWYgKCBOT1QgR0NSWVBUX0xJQlJBUlkgKQorCU1FU1NBR0UoU0VORF9FUlJPUiAiVW5hYmxlIHRvIGZpbmQgbGliZ2NyeXB0LCBwbGVhc2UgaW5zdGFsbCBsaWJnY3J5cHQgb3IgZXF1aXZhbGVudCIpCitFbmRpZiAoIE5PVCBHQ1JZUFRfTElCUkFSWSApCitTRVQoR0NSWVBUX0xJQlJBUlkgJHtHQ1JZUFRfTElCUkFSWX0gUEFSRU5UX1NDT1BFKQorCisKKyMgQ2hlY2sgaWYgQUlfQUREUkNPTkZJRyBpcyBhdmFpbGFibGUgb24gdGhlIHN5c3RlbQorQ0hFQ0tfU1lNQk9MX0VYSVNUUyhBSV9BRERSQ09ORklHICJuZXRkYi5oIiBIQVZFX0FJX0FERFJDT05GSUcpCisKKworIyBDaGVjayBpZiBiYXJyaWVycyBhcmUgYXZhaWxhYmxlIChmb3IgdGVzdF9maWZvKQorU0VUKENNQUtFX1JFUVVJUkVEX0lOQ0xVREVTICJwdGhyZWFkLmgiKQorU0VUKENNQUtFX1JFUVVJUkVEX0xJQlJBUklFUyAke0NNQUtFX1RIUkVBRF9MSUJTX0lOSVR9KQorQ0hFQ0tfRlVOQ1RJT05fRVhJU1RTIChwdGhyZWFkX2JhcnJpZXJfd2FpdCBIQVZFX1BUSFJFQURfQkFSKQorU0VUKEhBVkVfUFRIUkVBRF9CQVIgJHtIQVZFX1BUSFJFQURfQkFSfSBQQVJFTlRfU0NPUEUpCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBBZGRpdGlvbmFsIGhnIHZlcnNpb24gd2hlbiByZWxldmFudCwgc3RvcmVkIGluIHZlcnNpb24uaAoraWYgKEVYSVNUUyAiJHtDTUFLRV9TT1VSQ0VfRElSfS8uaGciKQorCSMgU2VhcmNoIGZvciBoZyBiaW5hcnkgdG8gdXNlCisJRklORF9QUk9HUkFNKEhHQ09NTUFORCBoZykKKwlpZiAoSEdDT01NQU5EKQorCQkjIE9rLCBhZGQgdGhlIGN1c3RvbSB0YXJnZXQgc28gdGhhdCBoZyBpcyBleGVjdXRlZCBhdCBldmVyeSBidWlsZAorCQlBRERfQ1VTVE9NX1RBUkdFVCh2ZXJzaW9uX2luZm9ybWF0aW9uCisJCQkJICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1EIEhHQ09NTUFORD0iJHtIR0NPTU1BTkR9IiAtRCBTUkM9IiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS92ZXJzaW9uLmguaW4iIC1EIERTVD0iJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3ZlcnNpb24uaCIgLVAgIiR7Q01BS0VfU09VUkNFX0RJUn0vY21ha2UvTW9kdWxlcy9HZXRWZXJzaW9uV2l0aEhnLmNtYWtlIgorCQkJCSAgIERFUEVORFMgIiR7Q01BS0VfU09VUkNFX0RJUn0vLmhnL2RpcnN0YXRlIgorCQkJCSAgIFdPUktJTkdfRElSRUNUT1JZICR7Q01BS0VfU09VUkNFX0RJUn0KKwkJCQkgICBDT01NRU5UICJSZXRyaWV2aW5nIHZlcnNpb24gb2YgdGhlIGhnIHJlcG9zaXRvcnkiCisJCQkJICAgKQorCWVsc2UgKEhHQ09NTUFORCkKKwkJIyBEaXNwbGF5IGF0IGxlYXN0ICJ1bmtub3duIiByZXYgaW4gdGhpcyBjYXNlCisJCVNFVChGRF9QUk9KRUNUX1ZFUlNJT05fSEcgInVua25vd24iKQorCQlDT05GSUdVUkVfRklMRSgke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vdmVyc2lvbi5oLmluICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS92ZXJzaW9uLmgpCisJCUFERF9DVVNUT01fVEFSR0VUKHZlcnNpb25faW5mb3JtYXRpb24gREVQRU5EUyAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdmVyc2lvbi5oKQorCWVuZGlmKEhHQ09NTUFORCkKK2Vsc2UgKEVYSVNUUyAiJHtDTUFLRV9TT1VSQ0VfRElSfS8uaGciKQorCSMgV2UgdXNlIHRoZSBwdXJlIHZlcnNpb24gbnVtYmVyIHdpdGhvdXQgZXh0ZW5zaW9uCisJQ09ORklHVVJFX0ZJTEUoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3ZlcnNpb24uaC5pbiAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdmVyc2lvbi5oKQorCUFERF9DVVNUT01fVEFSR0VUKHZlcnNpb25faW5mb3JtYXRpb24gREVQRU5EUyAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdmVyc2lvbi5oKQorZW5kaWYgKEVYSVNUUyAiJHtDTUFLRV9TT1VSQ0VfRElSfS8uaGciKQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgTEZEUFJPVE9fTElCUyA9IGxpYnJhcmllcyByZXF1aXJlZCBieSB0aGUgbGliZmRwcm90by4KK1NFVChMRkRQUk9UT19MSUJTICR7Q0xPQ0tfR0VUVElNRV9MSUJTfSAke0NNQUtFX1RIUkVBRF9MSUJTX0lOSVR9ICR7SUROQV9MSUJSQVJJRVN9IFBBUkVOVF9TQ09QRSkKKyMgQW5kIGluY2x1ZGVzIHBhdGhzCitTRVQoTEZEUFJPVE9fSU5DTFVERVMgJHtJRE5BX0lOQ0xVREVfRElSfSBQQVJFTlRfU0NPUEUpCisjIERlcGVuZGVuY2llczogdGhlIGxpYnJhcmllcyByZXF1aXJlZCBieSBhbnkgY29kZSBsaW5raW5nIHRvIGxpYmZkcHJvdG8uCitTRVQoTEZEUFJPVE9fTElOS19JTlRFUkZBQ0VTICR7Q01BS0VfVEhSRUFEX0xJQlNfSU5JVH0gUEFSRU5UX1NDT1BFKQorCisjIExGRENPUkVfTElCUyA9IGxpYnJhcmllcyByZXF1aXJlZCBieSB0aGUgbGliZmRjb3JlIChpbiBhZGRpdGlvbiB0byBsaWJmZHByb3RvIGFuZCBpdHMgZGVwZW5kZW5jaWVzKQorU0VUKExGRENPUkVfTElCUyAke0NMT0NLX0dFVFRJTUVfTElCU30gJHtDTUFLRV9ETF9MSUJTfSAke1NDVFBfTElCUkFSSUVTfSAke0dDUllQVF9MSUJSQVJZfSAke0dOVVRMU19MSUJSQVJJRVN9IFBBUkVOVF9TQ09QRSkKKyMgQW5kIGluY2x1ZGVzIHBhdGhzCitTRVQoTEZEQ09SRV9JTkNMVURFUyAke1NDVFBfSU5DTFVERV9ESVJ9ICR7R05VVExTX0lOQ0xVREVfRElSfSAke0dDUllQVF9JTkNMVURFX0RJUn0gUEFSRU5UX1NDT1BFKQorIyBBbmQgZGVwZW5kZW5jaWVzCitTRVQoTEZEQ09SRV9MSU5LX0lOVEVSRkFDRVMgIiIgUEFSRU5UX1NDT1BFKSAKKwkJIyBXZSBkb24ndCBmb3JjZSBvdGhlciBsaWJyYXJpZXMsIHRoZSBwcm9ncmFtcyB3aWxsIGxpbmsgd2l0aCB3aGF0IGl0IG5lZWRzCisgICAgICAgICAgICAgICAgIyAoc3VjaCBhcyBsaWJnbnV0bHMgaWYgaXQgdXNlcyBHTlVUTFNfREVCVUcoKSBtYWNybworCQkjIG9yIGxpYmZkcHJvdG8gaWYgaXQgdXNlcyBzb21lIG9mIGl0cyBpbnRlcmZhY2VzIGRpcmVjdGx5KQorCQkjIFNlZSBmcmVlRGlhbWV0ZXJkL0NNYWtlTGlzdHMudHh0IGZvciBhbiBleGFtcGxlLgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIEdlbmVyYXRlIHRoZSBob3N0LmggZmlsZQorQ09ORklHVVJFX0ZJTEUoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2ZyZWVEaWFtZXRlci1ob3N0LmguaW4gJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2ZyZWVEaWFtZXRlci1ob3N0LmgpCisKKyMjIyMKKyMjIElOU1RBTEwgc2VjdGlvbiAjIworCisjIFRoZSBoZWFkZXJzIGZyb20gdGhpcyBkaXJlY3RvcnkgYXJlIHJlcXVpcmVkIHRvIGRldmVsb3AgbmV3IGV4dGVuc2lvbnMgZm9yIGZyZWVEaWFtZXRlci4KK0lOU1RBTEwoRklMRVMgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2ZyZWVEaWFtZXRlci1ob3N0LmggbGliZmRwcm90by5oIGxpYmZkY29yZS5oIGV4dGVuc2lvbi5oCisJREVTVElOQVRJT04gJHtJTlNUQUxMX0hFQURFUlNfU1VGRklYfQorCUNPTVBPTkVOVCBmcmVlRGlhbWV0ZXItZGV2KQorCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWVEaWFtZXRlci9leHRlbnNpb24uaCBiL2luY2x1ZGUvZnJlZURpYW1ldGVyL2V4dGVuc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNmVhN2YKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2ZyZWVEaWFtZXRlci9leHRlbnNpb24uaApAQCAtMCwwICsxLDEwMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTMsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9FWFRFTlNJT05fSAorI2RlZmluZSBfRVhURU5TSU9OX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlIGRlZmluaXRpb24gb2YgZnJlZURpYW1ldGVyIEFQSSAqLworI2luY2x1ZGUgPGZyZWVEaWFtZXRlci9mcmVlRGlhbWV0ZXItaG9zdC5oPgorI2luY2x1ZGUgPGZyZWVEaWFtZXRlci9saWJmZGNvcmUuaD4KKworLyogTWFjcm8gdGhhdCBkZWZpbmUgdGhlIGVudHJ5IHBvaW50IG9mIHRoZSBleHRlbnNpb24gKi8KKyNkZWZpbmUgRVhURU5TSU9OX0VOVFJZKF9uYW1lLCBfZnVuY3Rpb24sIF9kZXBlbmRzLi4uKQkJCQkJXAorY29uc3QgY2hhciAqZmRfZXh0X2RlcGVuZHNbXSA9IHsgX25hbWUgLCAjIyBfZGVwZW5kcyAsIE5VTEwgfTsJCQkJXAorc3RhdGljIGludCBleHRlbnNpb25fbG9hZGVkID0gMDsJCQkJCQkJXAoraW50IGZkX2V4dF9pbml0KGludCBtYWpvciwgaW50IG1pbm9yLCBjaGFyICogY29uZmZpbGUpIHsJCQkJXAorCWlmICgobWFqb3IgIT0gRkRfUFJPSkVDVF9WRVJTSU9OX01BSk9SKQkJCQkJCVwKKwkJfHwgKG1pbm9yICE9IEZEX1BST0pFQ1RfVkVSU0lPTl9NSU5PUikpIHsJCQkJXAorCQlUUkFDRV9FUlJPUigiVGhpcyBleHRlbnNpb24gKCIgX25hbWUgIikgd2FzIGNvbXBpbGVkIGZvciBhIGRpZmZlcmVudCB2ZXJzaW9uIG9mIGZyZWVEaWFtZXRlci4iKTsJXAorCQlUUkFDRV9ERUJVRyhJTkZPLCAiZGFlbW9uICVkLiVkICE9IGV4dCAlZC4lZCIsCQkJCVwKKwkJCW1ham9yLCBtaW5vciwJCQkJCQkJXAorCQkJRkRfUFJPSkVDVF9WRVJTSU9OX01BSk9SLCBGRF9QUk9KRUNUX1ZFUlNJT05fTUlOT1IpOwkJXAorCQlyZXR1cm4gRUlOVkFMOwkJCQkJCQkJXAorCX0JCQkJCQkJCQkJXAorCWlmIChleHRlbnNpb25fbG9hZGVkKSB7CQkJCQkJCQlcCisJCVRSQUNFX0VSUk9SKCJFeHRlbnNpb24gKCIgX25hbWUgIikgY2Fubm90IGJlIGxvYWRlZCB0d2ljZSEiKTsJCVwKKwkJcmV0dXJuIEVOT1RTVVA7CQkJCQkJCQlcCisJfQkJCQkJCQkJCQlcCisJTE9HX04oIkxvYWRpbmcgKCIgX25hbWUgIikgZXh0ZW5zaW9uLiIpOwkJCQkJXAorCXJldHVybiAoX2Z1bmN0aW9uKShjb25mZmlsZSk7CQkJCQkJCVwKK30JCQkJCQkKKyAgICAKKyNkZWZpbmUgRVhURU5TSU9OX0VOVFJZMihfbmFtZSwgX2RpY3RmdW5jLCBfcnVsZXNmdW5jdGlvbiwgX2RlcGVuZHMuLi4pCQkJCQlcCitFWFRFTlNJT05fRU5UUlkoX25hbWUsIF9kaWN0ZnVuYywgIyMgX2RlcGVuZHMgKQkJCQkJXAoraW50IGZkX2V4dF9pbml0MihpbnQgbWFqb3IsIGludCBtaW5vciwgY2hhciAqIGNvbmZmaWxlKSB7CQkJCVwKKyAgICBpZiAoKG1ham9yICE9IEZEX1BST0pFQ1RfVkVSU0lPTl9NQUpPUikJCQkJCQlcCisgICAgICAgIHx8IChtaW5vciAhPSBGRF9QUk9KRUNUX1ZFUlNJT05fTUlOT1IpKSB7CQkJCVwKKyAgICAgICAgVFJBQ0VfRVJST1IoIlRoaXMgZXh0ZW5zaW9uICgiIF9uYW1lICIpIHdhcyBjb21waWxlZCBmb3IgYSBkaWZmZXJlbnQgdmVyc2lvbiBvZiBmcmVlRGlhbWV0ZXIuIik7CVwKKyAgICAgICAgVFJBQ0VfREVCVUcoSU5GTywgImRhZW1vbiAlZC4lZCAhPSBleHQgJWQuJWQiLAkJCQlcCisgICAgICAgICAgICBtYWpvciwgbWlub3IsCQkJCQkJCVwKKyAgICAgICAgICAgIEZEX1BST0pFQ1RfVkVSU0lPTl9NQUpPUiwgRkRfUFJPSkVDVF9WRVJTSU9OX01JTk9SKTsJCVwKKyAgICAgICAgcmV0dXJuIEVJTlZBTDsJCQkJCQkJCVwKKyAgICB9CQkJCQkJCQkJCVwKKyAgICBpZiAoZXh0ZW5zaW9uX2xvYWRlZCkgewkJCQkJCQkJXAorICAgICAgICBUUkFDRV9FUlJPUigiRXh0ZW5zaW9uICgiIF9uYW1lICIpIGNhbm5vdCBiZSBsb2FkZWQgdHdpY2UhIik7CQlcCisgICAgICAgIHJldHVybiBFTk9UU1VQOwkJCQkJCQkJXAorICAgIH0JCQkJCQkJCQkJXAorICAgIGV4dGVuc2lvbl9sb2FkZWQrKzsJCQkJCQkJCVwKKyAgICByZXR1cm4gKF9ydWxlc2Z1bmN0aW9uKShjb25mZmlsZSk7CQkJCQkJCVwKK30JCQkJCQkJXAoraW50IGZkX2V4dF9wYXJzZWxvY2FscnVsZXMoY2hhciAqY29uZmZpbGUpIHsJCQkJCVwKKyAgICByZXR1cm4gKF9ydWxlc2Z1bmN0aW9uKShjb25mZmlsZSk7CQkJCQlcCit9CQkJCQkJCQkJCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfRVhURU5TSU9OX0ggKi8KKworI2lmIDAKK3N0YXRpYyBpbnQgZGljdF9lbnRyeShjaGFyICogY29uZmZpbGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBpbnQgeCA9IChfZGljdGZ1bmMpKGNvbmZmaWxlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoeCAhPSAwKSByZXR1cm4geDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIChfcnVsZXNmdW5jdGlvbikoY29uZmZpbGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVlRGlhbWV0ZXIvZnJlZURpYW1ldGVyLWhvc3QuaC5pbiBiL2luY2x1ZGUvZnJlZURpYW1ldGVyL2ZyZWVEaWFtZXRlci1ob3N0LmguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUzOWI0YQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZnJlZURpYW1ldGVyL2ZyZWVEaWFtZXRlci1ob3N0LmguaW4KQEAgLTAsMCArMSwxMDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDE1LCBXSURFIFByb2plY3QgYW5kIE5JQ1QJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFdJREUgUHJvamVjdCBvciBOSUNUIG5vciB0aGUgCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgV0lERSBQcm9qZWN0IGFuZCAJCQkJCQkgKgorKiAgIE5JQ1QuCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQ29uZmlndXJhdGlvbiBmcm9tIGNvbXBpbGUtdGltZSAqLworI2lmbmRlZiBGRF9JU19DT05GSUcKKyNkZWZpbmUgRkRfSVNfQ09ORklHCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2NtYWtlZGVmaW5lIEhBVkVfTlRPSExMCisjY21ha2VkZWZpbmUgSEFWRV9NQUxMT0NfSAorI2NtYWtlZGVmaW5lIEhBVkVfU0lHTkFMRU5UX0gKKyNjbWFrZWRlZmluZSBIQVZFX0FJX0FERFJDT05GSUcKKyNjbWFrZWRlZmluZSBIQVZFX0NMT0NLX0dFVFRJTUUKKyNjbWFrZWRlZmluZSBIQVZFX1NUUk5EVVAKKyNjbWFrZWRlZmluZSBIQVZFX1BUSFJFQURfQkFSCisKKyNjbWFrZWRlZmluZSBIT1NUX0JJR19FTkRJQU4gQEhPU1RfQklHX0VORElBTkAKKworI2NtYWtlZGVmaW5lIERJU0FCTEVfU0NUUAorI2NtYWtlZGVmaW5lIERFQlVHX1NDVFAKKyNjbWFrZWRlZmluZSBERUJVR19XSVRIX01FVEEKKyNjbWFrZWRlZmluZSBTQ1RQX1VTRV9NQVBQRURfQUREUkVTU0VTCisjY21ha2VkZWZpbmUgU0NUUF9DT05ORUNUWF80X0FSR1MKKyNjbWFrZWRlZmluZSBTS0lQX0RMQ0xPU0UKKyNjbWFrZWRlZmluZSBESUFNSURfSUROQV9JR05PUkUKKyNjbWFrZWRlZmluZSBESUFNSURfSUROQV9SRUpFQ1QKKyNjbWFrZWRlZmluZSBESVNBQkxFX1BFRVJfRVhQSVJZCisjY21ha2VkZWZpbmUgV09SS0FST1VORF9BQ0NFUFRfSU5WQUxJRF9WU0FJCisjY21ha2VkZWZpbmUgR05VVExTX1ZFUlNJT05fMjEwCisjY21ha2VkZWZpbmUgR05VVExTX1ZFUlNJT05fMjEyCisjY21ha2VkZWZpbmUgR05VVExTX1ZFUlNJT05fMzAwCisjY21ha2VkZWZpbmUgR05VVExTX1ZFUlNJT05fMzEwCisKKyNjbWFrZWRlZmluZSBFUlJPUlNfT05fVE9ETworI2NtYWtlZGVmaW5lIERFQlVHCisKKyNjbWFrZWRlZmluZSBGRF9QUk9KRUNUX0JJTkFSWSAiQEZEX1BST0pFQ1RfQklOQVJZQCIKKyNjbWFrZWRlZmluZSBGRF9QUk9KRUNUX05BTUUgIkBGRF9QUk9KRUNUX05BTUVAIgorI2NtYWtlZGVmaW5lIEZEX1BST0pFQ1RfVkVSU0lPTl9NQUpPUiBARkRfUFJPSkVDVF9WRVJTSU9OX01BSk9SQAorI2lmbmRlZiBGRF9QUk9KRUNUX1ZFUlNJT05fTUFKT1IKKyMgZGVmaW5lIEZEX1BST0pFQ1RfVkVSU0lPTl9NQUpPUiAwCisjZW5kaWYgLypGRF9QUk9KRUNUX1ZFUlNJT05fTUFKT1IqLworI2NtYWtlZGVmaW5lIEZEX1BST0pFQ1RfVkVSU0lPTl9NSU5PUiBARkRfUFJPSkVDVF9WRVJTSU9OX01JTk9SQAorI2lmbmRlZiBGRF9QUk9KRUNUX1ZFUlNJT05fTUlOT1IKKyMgZGVmaW5lIEZEX1BST0pFQ1RfVkVSU0lPTl9NSU5PUiAwCisjZW5kaWYgLypGRF9QUk9KRUNUX1ZFUlNJT05fTUlOT1IqLworI2NtYWtlZGVmaW5lIEZEX1BST0pFQ1RfVkVSU0lPTl9SRVYgICBARkRfUFJPSkVDVF9WRVJTSU9OX1JFVkAKKyNpZm5kZWYgRkRfUFJPSkVDVF9WRVJTSU9OX1JFVgorIyBkZWZpbmUgRkRfUFJPSkVDVF9WRVJTSU9OX1JFViAwCisjZW5kaWYgLypGRF9QUk9KRUNUX1ZFUlNJT05fUkVWKi8KKyNjbWFrZWRlZmluZSBGRF9QUk9KRUNUX1ZFUlNJT05fQVBJICAgQEZEX1BST0pFQ1RfVkVSU0lPTl9BUElACisjaWZuZGVmIEZEX1BST0pFQ1RfVkVSU0lPTl9BUEkKKyMgZGVmaW5lIEZEX1BST0pFQ1RfVkVSU0lPTl9BUEkgMAorI2VuZGlmIC8qRkRfUFJPSkVDVF9WRVJTSU9OX0FQSSovCisjY21ha2VkZWZpbmUgRkRfUFJPSkVDVF9DT1BZUklHSFQgIkBGRF9QUk9KRUNUX0NPUFlSSUdIVEAiCisKKyNjbWFrZWRlZmluZSBERUZBVUxUX0NPTkZfUEFUSCAiQERFRkFVTFRfQ09ORl9QQVRIQCIKKyNjbWFrZWRlZmluZSBERUZBVUxUX0VYVEVOU0lPTlNfUEFUSCAiQERFRkFVTFRfRVhURU5TSU9OU19QQVRIQCIKKworI2lmbmRlZiBGRF9ERUZBVUxUX0NPTkZfRklMRU5BTUUKKyNkZWZpbmUgRkRfREVGQVVMVF9DT05GX0ZJTEVOQU1FICJmcmVlRGlhbWV0ZXIuY29uZiIKKyNlbmRpZiAvKiBGRF9ERUZBVUxUX0NPTkZfRklMRU5BTUUgKi8KKworLyogTWF4aW11bSBudW1iZXIgb2YgaG9va3MgaGFuZGxlcnMgdGhhdCBjYW4gYmUgcmVnaXN0ZXJlZC4gTWFrZSB0aGlzIGNvbXBpbGF0aW9uIG9wdGlvbiBpZiBuZWVkZWQgKi8KKyNkZWZpbmUgRkRfSE9PS19IQU5ETEVfTElNSVQJNQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogRkRfSVNfQ09ORklHICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWVEaWFtZXRlci9saWJmZGNvcmUuaCBiL2luY2x1ZGUvZnJlZURpYW1ldGVyL2xpYmZkY29yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyOGE1NDIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2ZyZWVEaWFtZXRlci9saWJmZGNvcmUuaApAQCAtMCwwICsxLDEyMTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDE2LCBXSURFIFByb2plY3QgYW5kIE5JQ1QJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFdJREUgUHJvamVjdCBvciBOSUNUIG5vciB0aGUgCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgV0lERSBQcm9qZWN0IGFuZCAJCQkJCQkgKgorKiAgIE5JQ1QuCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfTElCRkRDT1JFX0gKKyNkZWZpbmUgX0xJQkZEQ09SRV9ICisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaW5jbHVkZSA8ZnJlZURpYW1ldGVyL2xpYmZkcHJvdG8uaD4KKyNpbmNsdWRlIDxnbnV0bHMvZ251dGxzLmg+CisjaW5jbHVkZSA8Z251dGxzL3g1MDkuaD4KKworLyogR05VVExTIHZlcnNpb24gKi8KKyNpZm5kZWYgR05VVExTX1ZFUlNJT04KKyNkZWZpbmUgR05VVExTX1ZFUlNJT04gTElCR05VVExTX1ZFUlNJT04KKyNlbmRpZiAvKiBHTlVUTFNfVkVSU0lPTiAqLworCisvKiBHTlVUTFMgY2FsbHMgZGVidWcgbGV2ZWwgKi8KKyNpZm5kZWYgR05VVExTX0RCR19MRVZFTAorI2RlZmluZSBHTlVUTFNfREJHX0xFVkVMIEFOTk9ZSU5HCisjZW5kaWYgLyogR05VVExTX0RCR19MRVZFTCAqLworCisKKy8qIENoZWNrIHRoZSByZXR1cm4gdmFsdWUgb2YgYSBHTlVUTFMgZnVuY3Rpb24sIGxvZyBhbmQgcHJvcGFnYXRlICovCisjZGVmaW5lIENIRUNLX0dOVVRMU19HRU4oIGZhaWxsZXZlbCwgX19jYWxsX18sIF9fZmFsbGJhY2tfXyAgKSB7IAkJCQkJXAorCQlDSEVDS19QUkVMVURFKF9fY2FsbF9fKTsJCQkJCQkJCVwKKwkJaWYgKF9fcmV0X18gPCAwKSB7CQkJCQkJCQkJXAorCQkJTE9HKGZhaWxsZXZlbCwgIlRMUyBFUlJPUjogaW4gJyVzJyA6XHQlcyIsICAjX19jYWxsX18gLCAgZ251dGxzX3N0cmVycm9yKF9fcmV0X18pKTsgXAorCQkJX19mYWxsYmFja19fOwkJCQkJCQkJCVwKKwkJfQkJCQkJCQkJCQkJXAorfQorCisvKiB3ZSB1c2UgdGhpcyBtYWNybyB0byBoZWxwIGRlYnVnZ2luZyBnbnV0bHMgdXNhZ2UgaXNzdWVzIC0tIGp1c3QgY2hhbmdlIHRoZSBjb250ZW50IHRvIGRpc3BsYXkgd2hhdCB5b3UgbmVlZCAqLworI2RlZmluZSBHTlVUTFNfVFJBQ0UoIF9fY2FsbF9fKSB7CQkJCQlcCisJVFJBQ0VfQ0FMTCgiQ2hlY2s6ICVzIiwgI19fY2FsbF9fICk7CQkJCVwKKwkoX19jYWxsX18pOwkJCQkJCQlcCit9CisKKworI2lmbmRlZiBFWENMVURFX0RFUFJFQ0FURUQKKy8qIE1hY3JvIGZvciB0cmFuc2l0aW9uLCByZXBsYWNlIHdpdGggQ0hFQ0tfR05VVExTX0dFTiAqLworI2RlZmluZSBDSEVDS19HTlVUTFNfRE8oIF9fY2FsbF9fLCBfX2ZhbGxiYWNrX18gKQlcCisJQ0hFQ0tfR05VVExTX0dFTiggRkRfTE9HX0VSUk9SLCBfX2NhbGxfXywgX19mYWxsYmFja19fICApCisKKyNlbmRpZiAvKiBFWENMVURFX0RFUFJFQ0FURUQgKi8KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiAgICAgICAgICAgICAgICAgICAgICBJTklUSUFMSVpBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworLyogSW5pdGlhbGl6ZSB0aGUgbGliZmRjb3JlIGludGVybmFscy4gVGhpcyBhbHNvIGluaXRpYWxpemVzIGxpYmZkcHJvdG8gKi8KK2ludCBmZF9jb3JlX2luaXRpYWxpemUodm9pZCk7CisKKy8qIEEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgKi8KK2V4dGVybiBjb25zdCBjaGFyIGZkX2NvcmVfdmVyc2lvbltdOworCisvKiBQYXJzZSB0aGUgZnJlZURpYW1ldGVyLmNvbmYgY29uZmlndXJhdGlvbiBmaWxlLCBsb2FkIHRoZSBleHRlbnNpb25zICovCitpbnQgZmRfY29yZV9wYXJzZWNvbmYoY29uc3QgY2hhciAqIGNvbmZmaWxlKTsKKworLyogU3RhcnQgdGhlIHNlcnZlciAmIGNsaWVudCB0aHJlYWRzICovCitpbnQgZmRfY29yZV9zdGFydCh2b2lkKTsKKworLyogQmxvY2sgdW50aWwgdGhlIGZyYW1ld29yayBoYXMgY29tcGxldGVkIGl0cyBpbml0aWFsaXphdGlvbiAtLSB1c2VmdWwgZm9yIGV4dGVuc2lvbnMgKi8KK2ludCBmZF9jb3JlX3dhaXRzdGFydGNvbXBsZXRlKHZvaWQpOworCisvKiBJbml0aWFsaXplIHNodXRkb3duIG9mIHRoZSBmcmFtZXdvcmsgKi8KK2ludCBmZF9jb3JlX3NodXRkb3duKHZvaWQpOworCisvKiBXYWl0IGZvciB0aGUgc2h1dGRvd24gdG8gYmUgY29tcGxldGUgLS0gdGhpcyBzaG91bGQgYWx3YXlzIGJlIGNhbGxlZCBhZnRlciBmZF9jb3JlX3NodXRkb3duICovCitpbnQgZmRfY29yZV93YWl0X3NodXRkb3duX2NvbXBsZXRlKHZvaWQpOworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICBDT05GSUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogU3RydWN0dXJlIHRvIGhvbGQgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGZyZWVEaWFtZXRlciBkYWVtb24gKi8KKyNkZWZpbmUJRVlFQ19DT05GSUcJMHhDMDExRjE2CitzdHJ1Y3QgZmRfY29uZmlnIHsKKwlpbnQJCSBjbmZfZXllYzsJLyogRXllIGNhdGNoZXI6IEVZRUNfQ09ORklHICovCisJCisJY29uc3QgY2hhcgkqY25mX2ZpbGU7CS8qIENvbmZpZ3VyYXRpb24gZmlsZSB0byBwYXJzZSwgZGVmYXVsdCBpcyBERUZBVUxUX0NPTkZfRklMRSAqLworCQorCURpYW1JZF90ICAJIGNuZl9kaWFtaWQ7CS8qIERpYW1ldGVyIElkZW50aXR5IG9mIHRoZSBsb2NhbCBwZWVyIChGUUROIC0tIEFTQ0lJKSAqLworCXNpemVfdAkJIGNuZl9kaWFtaWRfbGVuOy8qIGNhY2hlZCBsZW5ndGggb2YgdGhlIHByZXZpb3VzIHN0cmluZyAqLworCURpYW1JZF90CSBjbmZfZGlhbXJsbTsJLyogRGlhbWV0ZXIgcmVhbG0gb2YgdGhlIGxvY2FsIHBlZXIsIGRlZmF1bHQgdG8gcmVhbG0gcGFydCBvZiBjbmZfZGlhbWlkICovCisJc2l6ZV90CQkgY25mX2RpYW1ybG1fbGVuOy8qIGxlbmd0aCBvZiB0aGUgcHJldmlvdXMgc3RyaW5nICovCisJCisJdW5zaWduZWQgaW50CSBjbmZfdGltZXJfdGM7CS8qIFRoZSB2YWx1ZSBpbiBzZWNvbmRzIG9mIHRoZSBkZWZhdWx0IFRjIHRpbWVyICovCisJdW5zaWduZWQgaW50IAkgY25mX3RpbWVyX3R3OwkvKiBUaGUgdmFsdWUgaW4gc2Vjb25kcyBvZiB0aGUgZGVmYXVsdCBUdyB0aW1lciAqLworCQorCXVpbnQxNl90CSBjbmZfcG9ydDsJLyogdGhlIGxvY2FsIHBvcnQgZm9yIGxlZ2FjeSBEaWFtZXRlciAoZGVmYXVsdDogMzg2OCkgaW4gaG9zdCBieXRlIG9yZGVyICovCisJdWludDE2X3QJIGNuZl9wb3J0X3RsczsJLyogdGhlIGxvY2FsIHBvcnQgZm9yIERpYW1ldGVyL1RMUyAoZGVmYXVsdDogNTg2OCkgaW4gaG9zdCBieXRlIG9yZGVyICovCisJdWludDE2X3QJIGNuZl9wb3J0XzM0MzY7IC8qIE9wZW4gYW4gYWRkaXRpb25hbCBzZXJ2ZXIgcG9ydCB0byBsaXN0ZW4gdG8gb2xkIFRMUy9TQ1RQIGNsaWVudHMgKFJGQzM0MzYsIGZyZWVEaWFtZXRlciB2ZXJzaW9ucyA8IDEuMi4wKSAqLworCXVpbnQxNl90CSBjbmZfc2N0cF9zdHI7CS8qIGRlZmF1bHQgbWF4IG51bWJlciBvZiBzdHJlYW1zIGZvciBTQ1RQIGFzc29jaWF0aW9ucyAoZGVmOiAzMCkgKi8KKwlzdHJ1Y3QgZmRfbGlzdAkgY25mX2VuZHBvaW50czsJLyogdGhlIGxvY2FsIGVuZHBvaW50cyB0byBiaW5kIHRoZSBzZXJ2ZXIgdG8uIGxpc3Qgb2Ygc3RydWN0IGZkX2VuZHBvaW50LiBkZWZhdWx0IGlzIGVtcHR5IChiaW5kIGFsbCkuIEFmdGVyIHNlcnZlcnMgYXJlIHN0YXJ0ZWQsIHRoaXMgaXMgdGhlIGFjdHVhbCBsaXN0IG9mIGVuZHBvaW50cyBpbmNsdWRpbmcgcG9ydCBpbmZvcm1hdGlvbi4gKi8KKwlpbnQJCSBjbmZfdGhyX3NydjsJLyogTnVtYmVyIG9mIHRocmVhZHMgcGVyIHNlcnZlcnMgaGFuZGxpbmcgdGhlIGNvbm5lY3Rpb24gc3RhdGUgbWFjaGluZXMgKi8KKwlzdHJ1Y3QgZmRfbGlzdAkgY25mX2FwcHM7CS8qIEFwcGxpY2F0aW9ucyBsb2NhbGx5IHN1cHBvcnRlZCAoZXhjZXB0IHJlbGF5LCBzZWUgZmxhZ3MpLiBVc2UgZmRfZGlzcF9hcHBfc3VwcG9ydCB0byBhZGQgb25lLiBsaXN0IG9mIHN0cnVjdCBmZF9hcHAuICovCisJdWludDE2X3QJIGNuZl9kaXNwdGhyOwkvKiBOdW1iZXIgb2YgZGlzcGF0Y2ggdGhyZWFkcyB0byBjcmVhdGUgKi8KKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBub19md2QgOiAxOwkvKiB0aGUgcGVlciBkb2VzIG5vdCByZWxheSBtZXNzYWdlcyAoMHhmZmZmZmYgYXBwIGlkKSAqLworCQl1bnNpZ25lZCBub19pcDQgOiAxOwkvKiBkaXNhYmxlIElQICovCisJCXVuc2lnbmVkIG5vX2lwNiA6IDE7CS8qIGRpc2FibGUgSVB2NiAqLworCQl1bnNpZ25lZCBub190Y3AgOiAxOwkvKiBkaXNhYmxlIHVzZSBvZiBUQ1AgKi8KKwkJdW5zaWduZWQgbm9fc2N0cDogMTsJLyogZGlzYWJsZSB0aGUgdXNlIG9mIFNDVFAgKi8KKwkJdW5zaWduZWQgcHJfdGNwCTogMTsJLyogcHJlZmVyIFRDUCBvdmVyIFNDVFAgKi8KKwkJdW5zaWduZWQgdGxzX2FsZzogMTsJLyogVExTIGFsZ29yaXRobSBmb3IgaW5pdGlhdGVkIGNueC4gMDogc2VwYXJhdGUgcG9ydC4gMTogaW5iYW5kLXNlY3VyaXR5IChvbGQpICovCisJfSAJCSBjbmZfZmxhZ3M7CisJCisJc3RydWN0IHsKKwkJaW50CQkJCSB0bHNfZGlzYWJsZWQ7CisJCQorCQkvKiBDcmVkZW50aWFscyBwYXJhbWV0ZXJzIChiYWNrdXApICovCisJCWNoYXIgKiAgCQkJIGNlcnRfZmlsZTsKKwkJY2hhciAqCQkJCSBrZXlfZmlsZTsKKwkJCisJCWNoYXIgKiAgCQkJIGNhX2ZpbGU7CisJCWludAkJCQkgY2FfZmlsZV9ucjsKKwkJY2hhciAqICAJCQkgY3JsX2ZpbGU7CisJCQorCQljaGFyICoJCQkJIHByaW9fc3RyaW5nOworCQl1bnNpZ25lZCBpbnQgCQkJIGRoX2JpdHM7CisJCWNoYXIgKgkJCQkgZGhfZmlsZTsKKwkJCisJCS8qIEdOVVRMUyBwYXJhbWV0ZXJzICovCisJCWdudXRsc19wcmlvcml0eV90IAkJIHByaW9fY2FjaGU7CisJCWdudXRsc19kaF9wYXJhbXNfdCAJCSBkaF9jYWNoZTsKKwkJCisJCS8qIEdOVVRMUyBzZXJ2ZXIgY3JlZGVudGlhbChzKSAqLworCQlnbnV0bHNfY2VydGlmaWNhdGVfY3JlZGVudGlhbHNfdCBjcmVkZW50aWFsczsgLyogY29udGFpbnMgbG9jYWwgY2VydCArIHRydXN0IGFuY2hvcnMgKi8KKwkJI2lmZGVmIEdOVVRMU19WRVJTSU9OXzMwMAorCQlnbnV0bHNfeDUwOV90cnVzdF9saXN0X3QgICAgICAgICB0cnVzdGxpc3Q7IC8qIHRoZSBsb2dpYyB0byBjaGVjayBsb2NhbCBjZXJ0aWZpY2F0ZSBoYXMgY2hhbmdlZCAqLworCQkjZW5kaWYgLyogR05VVExTX1ZFUlNJT05fMzAwICovCisJCQorCX0gCQkgY25mX3NlY19kYXRhOworCQorCXVpbnQzMl90CSBjbmZfb3JzdGF0ZWlkOwkvKiBUaGUgdmFsdWUgdG8gdXNlIGluIE9yaWdpbi1TdGF0ZS1JZCwgZGVmYXVsdCB0byByYW5kb20gdmFsdWUgKi8KKwlzdHJ1Y3QgZGljdGlvbmFyeSAqY25mX2RpY3Q7CS8qIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCBkaWN0aW9uYXJ5ICovCisJc3RydWN0IGZpZm8JICAqY25mX21haW5fZXY7CS8qIGV2ZW50cyBmb3IgdGhlIGRhZW1vbidzIG1haW4gKHN0cnVjdCBmZF9ldmVudCBpdGVtcykgKi8KK307CitleHRlcm4gc3RydWN0IGZkX2NvbmZpZyAqZmRfZ19jb25maWc7IC8qIFRoZSBwb2ludGVyIHRvIGFjY2VzcyB0aGUgZ2xvYmFsIGNvbmZpZ3VyYXRpb24sIGluaXRhbGl6ZWQgaW4gbWFpbiAqLworCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogICAgICAgICAgICAgICAgICAgICAgICAgUEVFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiBTdGF0ZXMgb2YgYSBwZWVyICovCitlbnVtIHBlZXJfc3RhdGUgeworCS8qIFN0YWJsZSBzdGF0ZXMgKi8KKwlTVEFURV9ORVcgPSAwLAkJLyogVGhlIHBlZXIgaGFzIGJlZW4ganVzdCBiZWVuIGNyZWF0ZWQsIFBTTSB0aHJlYWQgbm90IHN0YXJ0ZWQgeWV0ICovCisJU1RBVEVfT1BFTiwJCS8qIENvbm5leGlvbiBlc3RhYmxpc2hlZCAqLworCQorCS8qIFBlZXIgc3RhdGUgbWFjaGluZSAqLworCVNUQVRFX0NMT1NFRCwJCS8qIE5vIGNvbm5lY3Rpb24gZXN0YWJsaXNoZWQsIHdpbGwgcmUtYXR0ZW1wdCBhZnRlciBUY1RpbWVyLiAqLworCVNUQVRFX0NMT1NJTkcsCQkvKiB0aGUgY29ubmVjdGlvbiBpcyBiZWluZyBzaHV0ZG93biAoRFBSL0RQQSBpbiBwcm9ncmVzcykgKi8KKwlTVEFURV9XQUlUQ05YQUNLLAkvKiBBdHRlbXB0aW5nIHRvIGVzdGFibGlzaCB0cmFuc3BvcnQtbGV2ZWwgY29ubmVjdGlvbiAqLworCVNUQVRFX1dBSVRDTlhBQ0tfRUxFQywJLyogUmVjZWl2ZWQgYSBDRVIgZnJvbSB0aGlzIHNhbWUgcGVlciBvbiBhbiBpbmNvbWluZyBjb25uZWN0aW9uIChvdGhlciBwZWVyIG9iamVjdCksIHdoaWxlIHdlIHdlcmUgd2FpdGluZyBmb3IgY254IGFjayAqLworCVNUQVRFX1dBSVRDRUEsCQkvKiBDb25uZWN0aW9uIGVzdGFibGlzaGVkLCBDRVIgc2VudCwgd2FpdGluZyBmb3IgQ0VBICovCisJLyogU1RBVEVfV0FJVFJFVFVSTlNfRUxFQywgKi8JLyogVGhpcyBzdGF0ZSBpcyBub3Qgc3RhYmxlIGFuZCB0aGVyZWZvcmUgZGVwcmVjYXRlZDoKKwkJCQkgICBXZSBoYXZlIHNlbnQgYSBDRVIgb24gb3VyIGluaXRpYXRlZCBjb25uZWN0aW9uLCBhbmQgcmVjZWl2ZWQgYSBDRVIgZnJvbSB0aGUgcmVtb3RlIHBlZXIgb24gYW5vdGhlciBjb25uZWN0aW9uLiBFbGVjdGlvbi4KKwkJCQkgICBJZiB3ZSB3aW4gdGhlIGVsZWN0aW9uLCB3ZSBtdXN0IGRpc2Nvbm5lY3QgdGhlIGluaXRpYXRlZCBjb25uZWN0aW9uIGFuZCBzZW5kIGEgQ0VBIG9uIHRoZSBvdGhlciA9PiB3ZSBnbyB0byBPUEVOIHN0YXRlLgorCQkJCSAgIElmIHdlIGxvc2UsIHdlIGRpc2Nvbm5lY3QgdGhlIG90aGVyIGNvbm5lY3Rpb24gKHJlY2VpdmVyKSBhbmQgZmFsbGJhY2sgdG8gV0FJVENFQSBzdGF0ZS4gKi8KKwlTVEFURV9PUEVOX0hBTkRTSEFLRSwJLyogVExTIEhhbmRzaGFrZSBhbmQgdmFsaWRhdGlvbiBhcmUgaW4gcHJvZ3Jlc3MgaW4gb3BlbiBzdGF0ZSAtLSB3ZSB1c2UgaXQgb25seSBmb3IgZGVidWcgcHVycG9zZSwgaXQgaXMgbmV2ZXIgZGlzcGxheWVkICovCisJCisJLyogRmFpbG92ZXIgc3RhdGUgbWFjaGluZSAqLworCVNUQVRFX1NVU1BFQ1QsCQkvKiBBIERXUiB3YXMgc2VudCBhbmQgbm90IGFuc3dlcmVkIHdpdGhpbiBUd1RpbWUuIEZhaWxvdmVyIGluIHByb2dyZXNzLiAqLworCVNUQVRFX1JFT1BFTiwJCS8qIENvbm5lY3Rpb24gaGFzIGJlZW4gcmUtZXN0YWJsaXNoZWQsIHdhaXRpbmcgZm9yIDMgRFdSL0RXQSBleGNoYW5nZXMgYmVmb3JlIHB1dHRpbmcgYmFjayB0byBzZXJ2aWNlICovCisJCisJLyogT3JkZXJpbmcgaXNzdWVzIHdpdGggbXVsdGlzdHJlYW0gJiBzdGF0ZSBtYWNoaW5lLiAtLSBzZWUgdG9wIG9mIHBfcHNtLmMgZm9yIGV4cGxhbmF0aW9uICovCisJU1RBVEVfT1BFTl9ORVcsIAkvKiBhZnRlciBDRUEgaXMgc2VudCwgdW50aWwgYSBuZXcgbWVzc2FnZSBpcyByZWNlaXZlZC4gRm9yY2Ugb3JkZXJpbmcgaW4gdGhpcyBzdGF0ZSAqLworCVNUQVRFX0NMT1NJTkdfR1JBQ0UsCS8qIGFmdGVyIERQQSBpcyBzZW50IG9yIHJlY2VpdmVkLCBnaXZlIGEgc2hvcnQgZGVsYXkgZm9yIG1lc3NhZ2VzIGluIHRoZSBwaXBlIHRvIGJlIHJlY2VpdmVkLiAqLworCQorCS8qIEVycm9yIHN0YXRlICovCisJU1RBVEVfWk9NQklFCQkvKiBUaGUgUFNNIHRocmVhZCBpcyBub3QgcnVubmluZyBhbnltb3JlOyBpdCBtdXN0IGJlIHJlLXN0YXJ0ZWQgb3IgcGVlciBzaG91bGQgYmUgZGVsZXRlZC4gKi8KKyNkZWZpbmUgU1RBVEVfTUFYIFNUQVRFX1pPTUJJRQorfTsKKy8qIFRoZSBmb2xsb3dpbmcgbWFjcm8gaXMgY2FsbGVkIGluIGZyZWVEaWFtZXRlci9wX3BzbS5jICovCisjZGVmaW5lIERFQ0xBUkVfU1RBVEVfU1RSKCkJCVwKK2NvbnN0IGNoYXIgKnBlZXJfc3RhdGVfc3RyW10gPSB7IAlcCisJICAiU1RBVEVfTkVXIgkJCVwKKwksICJTVEFURV9PUEVOIgkJCVwKKwksICJTVEFURV9DTE9TRUQiCQlcCisJLCAiU1RBVEVfQ0xPU0lORyIJCVwKKwksICJTVEFURV9XQUlUQ05YQUNLIgkJXAorCSwgIlNUQVRFX1dBSVRDTlhBQ0tfRUxFQyIJXAorCSwgIlNUQVRFX1dBSVRDRUEiCQlcCisJLCAiU1RBVEVfT1BFTl9IQU5EU0hBS0UiCVwKKwksICJTVEFURV9TVVNQRUNUIgkJXAorCSwgIlNUQVRFX1JFT1BFTiIJCVwKKwksICJTVEFURV9PUEVOX05FVyIJCVwKKwksICJTVEFURV9DTE9TSU5HX0dSQUNFIgkJXAorCSwgIlNUQVRFX1pPTUJJRSIJCVwKKwl9OworZXh0ZXJuIGNvbnN0IGNoYXIgKnBlZXJfc3RhdGVfc3RyW107CisjZGVmaW5lIFNUQVRFX1NUUihzdGF0ZSkgXAorCSgoKHVuc2lnbmVkKShzdGF0ZSkpIDw9IFNUQVRFX01BWCA/IHBlZXJfc3RhdGVfc3RyWygodW5zaWduZWQpKHN0YXRlKSkgXSA6ICI8SW52YWxpZD4iKQorCisvKiBDb25zdGFudHMgZm9yIHRoZSBwZWVyX2luZm8gc3RydWN0dXJlIGJlbG93ICovCisjZGVmaW5lIFBJX1AzX0RFRkFVTFQJMAkvKiBVc2UgYW55IGF2YWlsYWJsZSBwcm90b2NvbCAqLworI2RlZmluZSBQSV9QM19JUAkxCS8qIFVzZSBvbmx5IElQIHRvIGNvbm5lY3QgdG8gdGhpcyBwZWVyICovCisjZGVmaW5lIFBJX1AzX0lQdjYJMgkvKiByZXNwLCBJUHY2ICovCisKKyNkZWZpbmUgUElfUDRfREVGQVVMVAkwCS8qIEF0dGVtcHQgYW55IGF2YWlsYWJsZSBwcm90b2NvbCAqLworI2RlZmluZSBQSV9QNF9UQ1AJMQkvKiBPbmx5IHVzZSBUQ1AgKi8KKyNkZWZpbmUgUElfUDRfU0NUUAkyCS8qIE9ubHkgdXNlIFNDVFAgKi8KKworI2RlZmluZSBQSV9BTEdQUkVGX1NDVFAJMAkvKiBTQ1RQIGlzICBhdHRlbXB0ZWQgZmlyc3QgKGRlZmF1bHQpICovCisjZGVmaW5lIFBJX0FMR1BSRUZfVENQCTEJLyogVENQIGlzIGF0dGVtcHRlZCBmaXJzdCAqLworCisjZGVmaW5lIFBJX1NFQ19ERUZBVUxUCTAJLyogTmV3IFRMUyBzZWN1cml0eSAoaGFuZHNoYWtlIGFmdGVyIGNvbm5lY3Rpb24sIHByb3RlY3RpbmcgYWxzbyBDRVIvQ0VBKSAqLworI2RlZmluZSBQSV9TRUNfTk9ORQkxCS8qIFRyYW5zcGFyZW50IHNlY3VyaXR5IHdpdGggdGhpcyBwZWVyIChJUHNlYykgKi8KKyNkZWZpbmUgUElfU0VDX1RMU19PTEQJMgkvKiBPbGQgVExTIHNlY3VyaXR5ICh1c2UgSW5iYW5kLVNlY3VyaXR5LUlkIEFWUCBkdXJpbmcgQ0VSL0NFQSkgKi8KKwkJCQkvKiBTZXQgc2VjID0gMyB0byBhdXRob3JpemUgdXNlIG9mIChJbmJhbmQtU2VjdXJpdHktSWQgPT0gTk9ORSkgd2l0aCB0aGlzIHBlZXIsIHNlYyA9IDIgb25seSBhdXRob3JpemluZyBUTFMgKi8KKwkJCQkKKyNkZWZpbmUgUElfU0NUUFNFQ19ERUYJMAkvKiBVc2UgRFRMUyBvdmVyIFNDVFAgdG8gY29ubmVjdCB0byB0aGlzIHBlZXIgKGRlZmF1bHQpICovCisjZGVmaW5lIFBJX1NDVFBTRUNfMzQzNgkxCS8qIFVzZSBUTFMgb3ZlciBTQ1RQIHRvIGNvbm5lY3QgdG8gdGhpcyBwZWVyIChSRkMzNDM2KSAqLworCisjZGVmaW5lIFBJX0VYUF9OT05FCTAJLyogdGhlIHBlZXIgZW50cnkgZG9lcyBub3QgZXhwaXJlICovCisjZGVmaW5lIFBJX0VYUF9JTkFDVElWRQkxCS8qIHRoZSBwZWVyIGVudHJ5IGV4cGlyZXMgKGkuZS4gaXMgZGVsZXRlZCkgYWZ0ZXIgcGlfbGZ0IHNlY29uZHMgd2l0aG91dCBhY3Rpdml0eSAqLworCisjZGVmaW5lIFBJX1BSU1RfTk9ORQkwCS8qIHRoZSBwZWVyIGVudHJ5IGlzIGRlbGV0ZWQgYWZ0ZXIgZGlzY29ubmVjdGlvbiAvIGVycm9yICovCisjZGVmaW5lIFBJX1BSU1RfQUxXQVlTCTEJLyogdGhlIHBlZXIgZW50cnkgaXMgcGVyc2lzdGFudCAod2lsbCBiZSBrZXB0IGFzIFpPTUJJRSBpbiBjYXNlIG9mIGVycm9yKSAqLworCQkJCisvKiBJbmZvcm1hdGlvbiBhYm91dCBhIHJlbW90ZSBwZWVyICovCitzdHJ1Y3QgcGVlcl9pbmZvIHsKKwkKKwlEaWFtSWRfdAlwaV9kaWFtaWQ7CS8qIChzdXBwb3NlZGx5KSBVVEYtOCwgXDAgdGVybWluYXRlZC4gVGhlIERpYW1ldGVyIElkZW50aXR5IG9mIHRoZSByZW1vdGUgcGVlci4gKi8KKwlzaXplX3QJCXBpX2RpYW1pZGxlbjsJLyogY2FjaGVkIGxlbmd0aCBvZiBwaV9kaWFtaWQgKi8KKwkKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgeworCQkJdW5zaWduZWQJcHJvMyA6MjsJLyogUElfUDNfKiAqLworCQkJdW5zaWduZWQJcHJvNCA6MjsJLyogUElfUDRfKiAqLworCQkJdW5zaWduZWQJYWxnIDoxOwkJLyogUElfQUxHUFJFRl8qICovCisJCQl1bnNpZ25lZAlzZWMgOjI7CQkvKiBQSV9TRUNfKiAqLworCQkJdW5zaWduZWQJc2N0cHNlYyA6MTsJLyogUElfU0NUUFNFQ18qICovCisJCQl1bnNpZ25lZAlleHAgOjE7CQkvKiBQSV9FWFBfKiAqLworCQkJdW5zaWduZWQJcGVyc2lzdCA6MTsJLyogUElfUFJTVF8qICovCisJCQkKKwkJfQkJcGljX2ZsYWdzOwkvKiBGbGFncyBpbmZsdWVuY2luZyB0aGUgY29ubmVjdGlvbiB0byB0aGUgcmVtb3RlIHBlZXIgKi8KKwkJCisJCURpYW1JZF90CXBpY19yZWFsbTsJLyogSWYgY29uZmlndXJlZCwgdGhlIGRhZW1vbiB3aWxsIGNoZWNrIHRoZSByZWNlaXZlZCByZWFsbSBpbiBDRVIvQ0VBIG1hdGNoZXMgdGhpcy4gKi8KKwkJdWludDE2X3QJcGljX3BvcnQ7IAkvKiBwb3J0IHRvIGNvbm5lY3QgdG8uIDA6IGRlZmF1bHQuICovCisJCQorCQl1aW50MzJfdCAJcGljX2xmdDsJLyogbGlmZXRpbWUgb2YgdGhpcyBwZWVyIHdoZW4gaW5hY3RpdmUgKHNlZSBwaWNfZmxhZ3MuZXhwIGRlZmluaXRpb24pICovCisJCWludAkJcGljX3RjdGltZXI7IAkvKiB1c2UgdGhpcyB2YWx1ZSBmb3IgVGNUaW1lciBpbnN0ZWFkIG9mIGdsb2JhbCwgaWYgIT0gMCAqLworCQlpbnQJCXBpY190d3RpbWVyOyAJLyogdXNlIHRoaXMgdmFsdWUgZm9yIFR3VGltZXIgaW5zdGVhZCBvZiBnbG9iYWwsIGlmICE9IDAgKi8KKwkJCisJCWNoYXIgKgkJcGljX3ByaW9yaXR5OwkvKiBQcmlvcml0eSBzdHJpbmcgZm9yIEdudVRMUyBpZiB3ZSBkb24ndCB1c2UgdGhlIGRlZmF1bHQgKi8KKwkJCisJfSBjb25maWc7CS8qIENvbmZpZ3VyZWQgZGF0YSAoc3RhdGljIGZvciB0aGlzIHBlZXIgZW50cnkpICovCisJCisJc3RydWN0IHsKKwkJCisJCS8qIGVudW0gcGVlcl9zdGF0ZQlwaXJfc3RhdGU7ICovIAorCQkvKiBTaW5jZSAxLjEuMCwgcmVhZCB0aGUgc3RhdGUgd2l0aCBmZF9wZWVyX2dldHN0YXRlKHBlZXIpLiAqLworCQkKKwkJRGlhbUlkX3QJcGlyX3JlYWxtOwkvKiBUaGUgcmVjZWl2ZWQgcmVhbG0gaW4gQ0VSL0NFQS4gKi8KKwkJc2l6ZV90CQlwaXJfcmVhbG1sZW47CS8qIGxlbmd0aCBvZiB0aGUgcmVhbG0gKi8KKwkJCisJCXVpbnQzMl90CXBpcl92ZW5kb3JpZDsJLyogQ29udGVudCBvZiB0aGUgVmVuZG9yLUlkIEFWUCwgb3IgMCBieSBkZWZhdWx0ICovCisJCXVpbnQzMl90CXBpcl9vcnN0YXRlOwkvKiBPcmlnaW4tU3RhdGUtSWQgdmFsdWUgKi8KKwkJb3MwX3QJCXBpcl9wcm9kbmFtZTsJLyogY29weSBvZiBQcm9kdWN0LU5hbWUgQVZQIChcMCB0ZXJtaW5hdGVkKSAqLworCQl1aW50MzJfdAlwaXJfZmlybXJldjsJLyogQ29udGVudCBvZiB0aGUgRmlybXdhcmUtUmV2aXNpb24gQVZQICovCisJCWludAkJcGlyX3JlbGF5OwkvKiBUaGUgcmVtb3RlIHBlZXIgYWR2ZXJ0aXplZCB0aGUgcmVsYXkgYXBwbGljYXRpb24gKi8KKwkJc3RydWN0IGZkX2xpc3QJcGlyX2FwcHM7CS8qIGFwcGxpY2F0aW9ucyBhZHZlcnRpc2VkIGJ5IHRoZSByZW1vdGUgcGVlciwgZXhjZXB0IHJlbGF5IChwaV9mbGFncy5yZWxheSkgKi8KKwkJaW50CQlwaXJfaXNpOwkvKiBJbmJhbmQtU2VjdXJpdHktSWQgYWR2ZXJ0aXNlZCAoUElfU0VDXyogYml0cykgKi8KKwkJCisJCXVpbnQzMl90CXBpcl9sYXN0REM7CS8qIFRoZSBsYXN0IERpc2Nvbm5lY3QtQ2F1c2UgdmFsdWUgcmVjZWl2ZWQgKi8KKwkJCisJCWludAkJcGlyX3Byb3RvOwkvKiBUaGUgTDQgcHJvdG9jb2wgY3VycmVudGx5IHVzZWQgd2l0aCB0aGUgcGVlciAoSVBQUk9UT19UQ1Agb3IgSVBQUk9UT19TQ1RQKSAqLworCQljb25zdCBnbnV0bHNfZGF0dW1fdCAJKnBpcl9jZXJ0X2xpc3Q7IAkvKiBUaGUgKHZhbGlkKSBjcmVkZW50aWFscyB0aGF0IHRoZSBwZWVyIGhhcyBwcmVzZW50ZWQsIG9yIE5VTEwgaWYgVExTIGlzIG5vdCB1c2VkICovCisJCQkJCQkJCS8qIFRoaXMgaXMgaW5zcGlyZWQgZnJvbSBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvZ251dGxzL21hbnVhbC9nbnV0bHMuaHRtbCNleF8wMDNheDUwOV8wMDJkaW5mbyAKKwkJCQkJCQkJICAgc2VlIHRoZXJlIGZvciBleGFtcGxlIG9mIHVzaW5nIHRoaXMgZGF0YSAqLworCQl1bnNpZ25lZCBpbnQgCXBpcl9jZXJ0X2xpc3Rfc2l6ZTsJCS8qIE51bWJlciBvZiBjZXJ0aWZpY2F0ZXMgaW4gdGhlIGxpc3QgKi8KKwkJCisJfSBydW50aW1lOwkvKiBEYXRhIHBvcHVsYXRlZCBhZnRlciBjb25uZWN0aW9uLCBtYXkgY2hhbmdlIGJldHdlZW4gMiBjb25uZWN0aW9ucyAtLSBub3QgdXNlZCBieSBmZF9wZWVyX2FkZCAqLworCQorCXN0cnVjdCBmZF9saXN0CXBpX2VuZHBvaW50czsJLyogRW5kcG9pbnQocykgb2YgdGhlIHJlbW90ZSBwZWVyIChjb25maWd1cmVkLCBkaXNjb3ZlcmVkLCBvciBhZHZlcnRpemVkKS4gbGlzdCBvZiBzdHJ1Y3QgZmRfZW5kcG9pbnQuIEROUyByZXNvbHZlZCBpZiBlbXB0eS4gKi8KK307CisKKworc3RydWN0IHBlZXJfaGRyIHsKKwlzdHJ1Y3QgZmRfbGlzdAkgY2hhaW47CS8qIExpbmsgaW50byB0aGUgbGlzdCBvZiBhbGwgdGhlIHBlZXJzLCBvcmRlcmVkIGJ5IHRoZWlyIERpYW1ldGVyIElkIChmZF9vc19jbXApICovCisJc3RydWN0IHBlZXJfaW5mbyBpbmZvOwkvKiBUaGUgcHVibGljIGRhdGEgKi8KKwkKKwkvKiBUaGlzIGhlYWRlciBpcyBmb2xsb3dlZCBieSBtb3JlIGRhdGEgaW4gdGhlIHByaXZhdGUgcGVlciBzdHJ1Y3R1cmUgZGVmaW5pdGlvbiAqLworfTsKKworLyogdGhlIGdsb2JhbCBsaXN0IG9mIHBlZXJzLiAKKyAgU2luY2Ugd2UgYXJlIG5vdCBleHBlY3Rpbmcgc28gbWFueSBjb25uZWN0aW9ucywgd2UgZG9uJ3QgdXNlIGEgaGFzaCwgYnV0IGl0IG1pZ2h0IGJlIGNoYW5nZWQuCisgIFRoZSBsaXN0IGl0ZW1zIGFyZSBwZWVyX2hkciBzdHJ1Y3R1cmVzIChhY3R1YWxseSwgZmRfcGVlciwgYnV0IHRoZSBjYXN0IGlzIE9LKSAqLworZXh0ZXJuIHN0cnVjdCBmZF9saXN0IGZkX2dfcGVlcnM7CitleHRlcm4gcHRocmVhZF9yd2xvY2tfdCBmZF9nX3BlZXJzX3J3OyAvKiBwcm90ZWN0IHRoZSBsaXN0ICovCisKKy8qCisgKiBGVU5DVElPTjoJZmRfcGVlcl9hZGQKKyAqCisgKiBQQVJBTUVURVJTOgorICogIGluZm8gCTogSW5mb3JtYXRpb24gdG8gY3JlYXRlIHRoZSBwZWVyLgorICogIG9yaWdfZGJnCTogQSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgb3JpZ2luIG9mIHRoZSBwZWVyIGluZm9ybWF0aW9uLCBmb3IgZGVidWcgKGV4OiBjb25mLCByZWRpcmVjdCwgLi4uKQorICogIGNiCQk6IG9wdGlvbmFsLCBhIGNhbGxiYWNrIHRvIGNhbGwgKG9uY2UpIHdoZW4gdGhlIHBlZXIgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZCBvciBmYWlsZWQKKyAqICBjYl9kYXRhCTogb3BhcXVlIGRhdGEgdG8gcGFzcyB0byB0aGUgY2FsbGJhY2suCisgKgorICogREVTQ1JJUFRJT046IAorICogIEFkZCBhIHBlZXIgdG8gdGhlIGxpc3Qgb2YgcGVlcnMgdG8gd2hpY2ggdGhlIGRhZW1vbiBtdXN0IG1haW50YWluIGEgY29ubmV4aW9uLgorICoKKyAqICBUaGUgY29udGVudCBvZiBpbmZvIHBhcmFtZXRlciBpcyBjb3BpZWQsIGV4Y2VwdCBmb3IgdGhlIGxpc3Qgb2YgZW5kcG9pbnRzIGlmIAorICogbm90IGVtcHR5LCB3aGljaCBpcyBzaW1wbHkgbW92ZWQgaW50byB0aGUgY3JlYXRlZCBvYmplY3QuIEl0IG1lYW5zIHRoYXQgdGhlIGxpc3QKKyAqIGl0ZW1zIG11c3QgaGF2ZSBiZWVuIG1hbGxvYydkLCBzbyB0aGF0IHRoZXkgY2FuIGJlIGZyZWVkLgorICoKKyAqICBJZiBjYiBpcyBub3QgbnVsbCwgdGhlIGNhbGxiYWNrIGlzIGNhbGxlZCB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGluIE9QRU4gc3RhdGUgb3IKKyAqIHdoZW4gYW4gZXJyb3IgaGFzIG9jY3VycmVkLiBUaGUgY2FsbGJhY2sgc2hvdWxkIHVzZSB0aGUgcGlfc3RhdGUgaW5mb3JtYXRpb24gdG8gCisgKiBkZXRlcm1pbmUgd2hpY2ggb25lIGl0IGlzLiBJZiB0aGUgZmlyc3QgcGFyYW1ldGVyIG9mIHRoZSBjYWxsZWQgY2FsbGJhY2sgaXMgTlVMTCwgaXQgCisgKiBtZWFucyB0aGF0IHRoZSBwZWVyIGlzIGJlaW5nIGRlc3Ryb3llZCBiZWZvcmUgYXR0ZW1wdCBzdWNjZXNzIC8gZmFpbHVyZS4gCisgKiBjYiBpcyBjYWxsZWQgdG8gYWxsb3cgZnJlZWluZyBjYl9kYXRhIGluICAqIHRoaXMgY2FzZS4KKyAqCisgKiAgVGhlIG9yaWdfZGJnIHN0cmluZyBpcyBvbmx5IHVzZWZ1bCBmb3IgZWFzaW5nIGRlYnVnLCBhbmQgY2FuIGJlIGxlZnQgdG8gTlVMTC4KKyAqCisgKiBSRVRVUk4gVkFMVUU6CisgKiAgMCAgICAgIAk6IFRoZSBwZWVyIGlzIGFkZGVkLgorICogIEVJTlZBTCAJOiBBIHBhcmFtZXRlciBpcyBpbnZhbGlkLgorICogIEVFWElTVCAJOiBBIHBlZXIgd2l0aCB0aGUgc2FtZSBEaWFtZXRlci1JZCBpcyBhbHJlYWR5IGluIHRoZSBsaXN0LgorICogIChvdGhlciBzdGFuZGFyZCBlcnJvcnMgbWF5IGJlIHJldHVybmVkLCB0b28sIHdpdGggdGhlaXIgc3RhbmRhcmQgbWVhbmluZy4gRXhhbXBsZToKKyAqICAgIEVOT01FTSAJOiBNZW1vcnkgYWxsb2NhdGlvbiBmb3IgdGhlIG5ldyBvYmplY3QgZWxlbWVudCBmYWlsZWQuKQorICovCitpbnQgZmRfcGVlcl9hZGQgKCBzdHJ1Y3QgcGVlcl9pbmZvICogaW5mbywgY29uc3QgY2hhciAqIG9yaWdfZGJnLCB2b2lkICgqY2IpKHN0cnVjdCBwZWVyX2luZm8gKiwgdm9pZCAqKSwgdm9pZCAqIGNiX2RhdGEgKTsKKworLyoKKyAqIEZVTkNUSU9OOglmZF9wZWVyX2dldGJ5aWQKKyAqCisgKiBQQVJBTUVURVJTOgorICogIGRpYW1pZCAJOiBhbiBVVEY4IHN0cmluZyBkZXNjcmliaW5nIHRoZSBkaWFtZXRlciBJZCBvZiB0aGUgcGVlciB0byBzZWVrCisgKiAgZGlhbWlkbGVuCTogbGVuZ3RoIG9mIHRoZSBkaWFtaWQKKyAqICBpZ25jYXNlCTogcGVyZm9ybSBhbiBhbG1vc3QtY2FzZS1pbnNlbnNpdGl2ZSBzZWFyY2g/IChzbG93ZXIpCisgKiAgcGVlcgk6IFRoZSBwZWVyIGlzIHN0b3JlZCBoZXJlIGlmIGl0IGV4aXN0cy4KKyAqCisgKiBERVNDUklQVElPTjogCisgKiAgIFNlYXJjaCBhIHBlZXIgYnkgaXRzIERpYW1ldGVyLUlkLgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqICAwICAgOiAqcGVlciBoYXMgYmVlbiB1cGRhdGVkICh0byBOVUxMIGlmIHRoZSBwZWVyIGlzIG5vdCBmb3VuZCkuCisgKiAhMAk6IEFuIGVycm9yIG9jY3VycmVkLgorICovCitpbnQgZmRfcGVlcl9nZXRieWlkKCBEaWFtSWRfdCBkaWFtaWQsIHNpemVfdCBkaWFtaWRsZW4sIGludCBpZ25jYXNlLCBzdHJ1Y3QgcGVlcl9oZHIgKiogcGVlciApOworCisvKiAKKyAqIEZVTkNUSU9OOglmZF9wZWVyX2dldF9zdGF0ZQorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgcGVlcgk6IFRoZSBwZWVyIHdoaWNoIHN0YXRlIHRvIHJlYWQKKyAqCisgKiBERVNDUklQVElPTjogCisgKiAgIFJldHVybnMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHBlZXIuCisgKgorICogUkVUVVJOIFZBTFVFOgorICogIC0xICA6IHBlZXIgaXMgaW52YWxpZAorICogPj0wCTogdGhlIHN0YXRlIG9mIHRoZSBwZWVyIGF0IHRoZSB0aW1lIG9mIHJlYWRpbmcuCisgKi8KK2ludCBmZF9wZWVyX2dldF9zdGF0ZShzdHJ1Y3QgcGVlcl9oZHIgKnBlZXIpOworCisvKiAKKyAqIEZVTkNUSU9OOglmZF9wZWVyX2NueF9wcm90b19pbmZvCisgKgorICogUEFSQU1FVEVSUzoKKyAqICBwZWVyCTogVGhlIHBlZXIgd2hpY2ggaW5mb3JtYXRpb24gdG8gYmUgcmVhZAorICogIGJ1ZgkJOiBXaGVyZSB0byBzdG9yZSB0aGUgcHJvdG9jb2wgaW5mb3JtYXRpb24KKyAqICBsZW4JCTogYXZhaWxhYmxlIHNwYWNlIGluIGJ1ZworICoKKyAqIERFU0NSSVBUSU9OOiAKKyAqICAgQ3JlYXRlcyBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24gdG8gdGhpcyBwZWVyLCBlLmcuOiAiVENQLFRMUyxzb2MjMyIuCisgKgorICogUkVUVVJOIFZBTFVFOgorICogIDAgICA6IGJ1ZmZlciB3YXMgd3JpdHRlbgorICogPj0wCTogZXJyb3IgY29kZS4KKyAqLworaW50IGZkX3BlZXJfY254X3Byb3RvX2luZm8oc3RydWN0IHBlZXJfaGRyICpwZWVyLCBjaGFyICogYnVmLCBzaXplX3QgbGVuKTsKKworLyogCisgKiBGVU5DVElPTjoJZmRfcGVlcl9nZXRfbG9hZF9wZW5kaW5nCisgKgorICogUEFSQU1FVEVSUzoKKyAqICBwZWVyCTogVGhlIHBlZXIgd2hpY2ggbG9hZCB0byByZWFkCisgKiAgdG9fcmVjZWl2ZSAgOiAob3V0KSBudW1iZXIgb2YgcmVxdWVzdHMgc2VudCB0byB0aGlzIHBlZXIgd2l0aG91dCBtYXRjaGluZyBhbnN3ZXIgeWV0LgorICogIHRvX3NlbmQgICAgIDogKG91dCkgbnVtYmVyIG9mIHJlcXVlc3RzIHJlY2VpdmVkIGZyb20gdGhpcyBwZWVyIGFuZCBub3QgeWV0IGFuc3dlcmVkLgorICoKKyAqIERFU0NSSVBUSU9OOiAKKyAqICAgUmV0dXJucyB0aGUgY3VycmVudCBudW1iZXIgb2YgcmVxdWVzdHMgc2VudCB0byB0aGlzIHBlZXIKKyAqICB0aGF0IGhhdmUgbm90IGJlZW4gYW5zd2VyZWQgeWV0LiBUaGlzIGlzIGFuIGVtcGlyaWNhbCBpbmRpY2F0aW9uCisgKiAgb2YgdGhlIHdvcmtsb2FkIG9mIHRoaXMgcGVlci4KKyAqCisgKiBSRVRVUk4gVkFMVUU6CisgKiAgMCAgOiBUaGUgbG9hZCBwYXJhbWV0ZXIgaGFzIGJlZW4gdXBkYXRlZC4gKGl0IHNob3VsZCBoYXZlIGEgcG9zaXRpdmUgdmFsdWUgYWx3YXlzKQorICogITAgIDogQW4gZXJyb3Igb2NjdXJyZWQKKyAqLworaW50IGZkX3BlZXJfZ2V0X2xvYWRfcGVuZGluZyhzdHJ1Y3QgcGVlcl9oZHIgKnBlZXIsIGxvbmcgKiB0b19yZWNlaXZlLCBsb25nICogdG9fc2VuZCk7CisKKy8qCisgKiBGVU5DVElPTjoJZmRfcGVlcl92YWxpZGF0ZV9yZWdpc3RlcgorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgcGVlcl92YWxpZGF0ZSAJOiBDYWxsYmFjayBhcyBkZWZpbmVkIGJlbG93LgorICoKKyAqIERFU0NSSVBUSU9OOiAKKyAqICBBZGQgYSBjYWxsYmFjayB0byBhdXRob3JpemUgLyByZWplY3QgaW5jb21pbmcgcGVlciBjb25uZWN0aW9ucy4KKyAqIEFsbCByZWdpc3RlcmVkIGNhbGxiYWNrcyBhcmUgY2FsbGVkIHVudGlsIGEgY2FsbGJhY2sgc2V0cyBhdXRoID0gLTEgb3IgYXV0aCA9IDEuCisgKiBJZiBubyBjYWxsYmFjayByZXR1cm5zIGEgY2xlYXIgZGVjaXNpb24sIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIGFwcGxpZWQgKHJlamVjdCB1bmtub3duIGNvbm5lY3Rpb25zKQorICogVGhlIGNhbGxiYWNrcyBhcmUgY2FsbGVkIGluIEZJTE8gb3JkZXIgb2YgdGhlaXIgcmVnaXN0cmF0aW9uLgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqICAwICAgOiBUaGUgY2FsbGJhY2sgaXMgYWRkZWQuCisgKiAhMAk6IEFuIGVycm9yIG9jY3VycmVkLgorICovCitpbnQgZmRfcGVlcl92YWxpZGF0ZV9yZWdpc3RlciAoIGludCAoKnBlZXJfdmFsaWRhdGUpKHN0cnVjdCBwZWVyX2luZm8gKiAvKiBpbmZvICovLCBpbnQgKiAvKiBhdXRoICovLCBpbnQgKCoqY2IyKShzdHJ1Y3QgcGVlcl9pbmZvICopKSApOworLyoKKyAqIENBTExCQUNLOglwZWVyX3ZhbGlkYXRlCisgKgorICogUEFSQU1FVEVSUzoKKyAqICAgaW5mbyAgICAgOiBTdHJ1Y3R1cmUgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGVlciBhdHRlbXB0aW5nIHRoZSBjb25uZWN0aW9uLgorICogICBhdXRoICAgICA6IFN0b3JlIHRoZXJlIHRoZSByZXN1bHQgaWYgdGhlIHBlZXIgaXMgYWNjZXB0ZWQgKDEpLCByZWplY3RlZCAoLTEpLCBvciB1bmtub3duICgwKS4KKyAqICAgY2IyICAgICAgOiBJZiAhPSBOVUxMIGFuZCBpbiBjYXNlIG9mIFBJX1NFQ19UTFNfT0xELCBhbm90aGVyIGNhbGxiYWNrIHRvIGNhbGwgYWZ0ZXIgaGFuZHNoYWtlIChpZiBhdXRoID0gMSkuCisgKgorICogREVTQ1JJUFRJT046IAorICogICBUaGlzIGNhbGxiYWNrIGlzIGNhbGxlZCB3aGVuIGEgbmV3IGNvbm5lY3Rpb24gaXMgYmVpbmcgZXN0YWJsaXNoZWQgZnJvbSBhbiB1bmtub3duIHBlZXIsCisgKiBhZnRlciB0aGUgQ0VSIGlzIHJlY2VpdmVkLiBBbiBleHRlbnNpb24gbXVzdCByZWdpc3RlciBzdWNoIGNhbGxiYWNrIHdpdGggcGVlcl92YWxpZGF0ZV9yZWdpc3Rlci4KKyAqCisgKiAgIFRoZSBjYWxsYmFjayBjYW4gbGVhcm4gaWYgdGhlIHBlZXIgaGFzIHNlbnQgSW5iYW5kLVNlY3VyaXR5LUlkIEFWUHMgaW4gcnVudGltZS5waXJfaXNpIGZpZWxkcy4KKyAqIEl0IGNhbiBhbHNvIGxlYXJuIGlmIGEgaGFuZHNoYWtlIGhhcyBhbHJlYWR5IGJlZW4gcGVyZm9ybWVkIGluIHJ1bnRpbWUucGlyX2NlcnRfbGlzdCBmaWVsZC4KKyAqIFRoZSBjYWxsYmFjayBtdXN0IHNldCB0aGUgdmFsdWUgb2YgY29uZmlnLnBpY19mbGFncy5zZWMgYXBwcm9wcmlhdGVseSB0byBhbGxvdyBhIGNvbm5lY3Rpb24gd2l0aG91dCBUTFMuCisgKgorICogICBJZiB0aGUgb2xkIFRMUyBtZWNoYW5pc20gaXMgdXNlZCwKKyAqIHRoZSBleHRlbnNpb24gbWF5IGFsc28gbmVlZCB0byBjaGVjayB0aGUgY3JlZGVudGlhbHMgcHJvdmlkZWQgZHVyaW5nIHRoZSBUTFMKKyAqIGV4Y2hhbmdlIChyZW1vdGUgY2VydGlmaWNhdGUpLiBGb3IgdGhpcyBwdXJwb3NlLCBpdCBtYXkgc2V0IHRoZSBhZGRyZXNzIG9mIGEgbmV3IGNhbGxiYWNrCisgKiB0byBiZSBjYWxsZWQgb25jZSB0aGUgaGFuZHNoYWtlIGlzIGNvbXBsZXRlZC4gVGhpcyBuZXcgY2FsbGJhY2sgcmVjZWl2ZXMgdGhlIGluZm9ybWF0aW9uCisgKiBzdHJ1Y3R1cmUgYXMgcGFyYW1ldGVyICh3aXRoIHBpcl9jZXJ0X2xpc3Qgc2V0KSBhbmQgcmV0dXJucyAwIGlmIHRoZSBjcmVkZW50aWFscyBhcmUgY29ycmVjdCwKKyAqIG9yIGFuIGVycm9yIGNvZGUgb3RoZXJ3aXNlLiBJZiB0aGUgZXJyb3IgY29kZSBpcyByZWNlaXZlZCwgdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkIGFuZCB0aGUgCisgKiBwZWVyIGlzIGRlc3Ryb3llZC4KKyAqIE5vdGUgdGhhdCBmcmVlRGlhbWV0ZXIgYWxyZWFkeSBhY2hpZXZlcyBzb21lIHVzdWFsIGNoZWNrcy4gVGhlIGNhbGxiYWNrIG1heSBiZSB1c2VkIHRvIGVuZm9yY2UKKyAqIGFkZGl0aW9uYWwgcmVzdHJpY3Rpb25zLgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqICAwICAgICAgCTogVGhlIGF1dGhvcml6YXRpb24gZGVjaXNpb24gaGFzIGJlZW4gd3JpdHRlbiBpbiB0aGUgbG9jYXRpb24gcG9pbnRlZCBieSBhdXRoLgorICogICEwIAkJOiBBbiBlcnJvciBvY2N1cnJlZC4KKyAqLworCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogICAgICAgICAgICAgICAgICAgICAgICAgTUVTU0FHRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKgorICogRlVOQ1RJT046CWZkX21zZ19zZW5kLCBmZF9tc2dfc2VuZF90aW1lb3V0ICAKKyAqCisgKiBQQVJBTUVURVJTOgorICogIHBtc2cgCTogTG9jYXRpb24gb2YgdGhlIG1lc3NhZ2UgdG8gYmUgc2VudCBvbiB0aGUgbmV0d29yayAoc2V0IHRvIE5VTEwgb24gZnVuY3Rpb24gcmV0dXJuIHRvIGF2b2lkIGRvdWJsZSBkZWxldGlvbikuCisgKiAgYW5zY2IJOiBBIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIGNvcnJlc3BvbmRpbmcgYW5zd2VyIGlzIHJlY2VpdmVkLCB3aGVuIHNlbmRpbmcgYSByZXF1ZXN0IChub3QgdXNlZCB3aXRoIGFuc3dlcnMpCisgKiAgYW5zY2JfZGF0YQk6IG9wYXF1ZSBkYXRhIHRvIGJlIHBhc3NlZCBiYWNrIHRvIHRoZSBhbnNjYiAob3IgZXhwaXJlY2IpIHdoZW4gaXQgaXMgY2FsbGVkLgorICogIGV4cGlyZWNiICAgIDogKG9ubHkgZm9yIGZkX21zZ19zZW5kX3RpbWVvdXQpIElmIHRoZSByZXF1ZXN0IGRpZCBub3QgZ2V0IGFuIGFuc3dlciBiZWZvcmUgdGltZW91dCwgdGhpcyBjYWxsYmFjayBpcyBjYWxsZWQuCisgKiAgdGltZW91dCAgICAgOiAob25seSBmb3IgZmRfbXNnX3NlbmRfdGltZW91dCkgc2V0cyB0aGUgYWJzb2x1dGUgdGltZSB1bnRpbCB3aGVuIHRvIHdhaXQgZm9yIGFuIGFuc3dlci4gUGFzdCB0aGlzIHRpbWUsCisgKiAgICAgICAgICAgICAgICB0aGUgZXhwaXJlY2IgaXMgY2FsbGVkIHdpdGggdGhlIHJlcXVlc3QgYW5kIHRoZSBhbnN3ZXIgd2lsbCBiZSBkaXNjYXJkZWQgaWYgcmVjZWl2ZWQgbGF0ZXIuCisgKgorICogREVTQ1JJUFRJT046IAorICogICBTZW5kcyBhIG1lc3NhZ2Ugb24gdGhlIG5ldHdvcmsuIChhY3R1YWxseSBzaW1wbHkgcXVldWVzIGl0IGluIGEgZ2xvYmFsIHF1ZXVlLCB0byBiZSBwaWNrZWQgYnkgYSBkYWVtb24ncyB0aHJlYWQpCisgKiBGb3IgcmVxdWVzdHMsIHRoZSBlbmQtdG8tZW5kIGlkIG11c3QgYmUgc2V0IChzZWUgZmRfbXNnX2dldF9ldGVpZCAvIE1TR0ZMX0FMTE9DX0VURUlEKS4KKyAqIEZvciBhbnN3ZXJzLCB0aGUgbWVzc2FnZSBtdXN0IGJlIGNyZWF0ZWQgd2l0aCBmdW5jdGlvbiBmZF9tc2dfbmV3X2Fuc3dlcl9mcm9tX3JlcS4KKyAqCisgKiBUaGUgcm91dGluZyBtb2R1bGUgd2lsbCBoYW5kbGUgc2VuZGluZyB0byB0aGUgY29ycmVjdCBwZWVyLCB1c3VhbGx5IGJhc2VkIG9uIHRoZSBEZXN0aW5hdGlvbi1SZWFsbSAvIERlc3RpbmF0aW9uLUhvc3QgQVZQLgorICoKKyAqIElmIHRoZSBtc2cgaXMgYSByZXF1ZXN0LCB0aGVyZSBhcmUgdHdvIHdheXMgb2YgcmVjZWl2aW5nIHRoZSBhbnN3ZXI6CisgKiAgLSBlaXRoZXIgaGF2aW5nIHJlZ2lzdGVyZWQgYSBjYWxsYmFjayBpbiB0aGUgZGlzcGF0Y2ggbW9kdWxlIChzZWUgZmRfZGlzcF9yZWdpc3RlcikKKyAqICAtIG9yIHByb3ZpZGUgYSBhbnNjYiBjYWxsYmFjayBoZXJlLiBJZiBzdWNoIGNhbGxiYWNrIGlzIHByb3ZpZGVkLCBpdCBpcyBjYWxsZWQgYmVmb3JlIHRoZSBkaXNwYXRjaCBjYWxsYmFja3MuCisgKiAgICBUaGUgcHJvdG90eXBlIGZvciB0aGlzIGFuc2NiIGNhbGxiYWNrIGZ1bmN0aW9uIGlzOgorICogICAgIHZvaWQgYW5zY2Iodm9pZCAqIGRhdGEsIHN0cnVjdCBtc2cgKiogYW5zd2VyKQorICoJd2hlcmU6CisgKgkJZGF0YSAgIDogb3BhcXVlIGRhdGEgdGhhdCB3YXMgcmVnaXN0ZXJlZCBhbG9uZyB3aXRoIHRoZSBjYWxsYmFjay4KKyAqCQlhbnN3ZXIgOiBsb2NhdGlvbiBvZiB0aGUgcG9pbnRlciB0byB0aGUgYW5zd2VyLgorICogICAgICBub3RlMTogb24gZnVuY3Rpb24gcmV0dXJuLCBpZiAqYW5zd2VyIGlzIG5vdCBOVUxMLCB0aGUgbWVzc2FnZSBpcyBwYXNzZWQgdG8gdGhlIGRpc3BhdGNoIG1vZHVsZSBmb3IgcmVndWxhciBjYWxsYmFja3MuCisgKgkgICAgICAgb3RoZXJ3aXNlLCB0aGUgY2FsbGJhY2sgbXVzdCB0YWtlIGNhcmUgb2YgZnJlZWluZyB0aGUgbWVzc2FnZSAoZmRfbXNnX2ZyZWUpLgorICoJbm90ZTI6IHRoZSBvcGFxdWUgZGF0YSBpcyBub3QgZnJlZWQgYnkgdGhlIGRhZW1vbiBpbiBhbnkgY2FzZSwgZXh0ZW5zaW9ucyBzaG91bGQgZW5zdXJlIGNsZWFuIGhhbmRsaW5nIGluIGZkX2V4dF9maW5pLgorICogCisgKiBJZiBubyBjYWxsYmFjayBpcyByZWdpc3RlcmVkIHRvIGhhbmRsZSBhbiBhbnN3ZXIsIHRoZSBtZXNzYWdlIGlzIGRpc2NhcmRlZCBhbmQgYW4gZXJyb3IgaXMgbG9nZ2VkLgorICoKKyAqICBmZF9tc2dfc2VuZF90aW1lb3V0IGlzIHNpbWlsYXIgdG8gZmRfbXNnX3NlbmQsIGV4Y2VwdCB0aGF0IGl0IHRha2VzIHR3byBhZGRpdGlvbmFsIGFyZ3VtZW50cyAiZXhwaXJlY2IiIGFuZCAidGltZW91dCIuIAorICogSWYgdGhlIG1lc3NhZ2UgcGFyYW1ldGVyIGlzIGFuIGFuc3dlciwgdGhlcmUgaXMgbm8gZGlmZmVyZW5jZSB3aXRoIGZkX21zZ19zZW5kLgorICogT3RoZXJ3aXNlLCBpZiB0aGUgY29ycmVzcG9uZGluZyBhbnN3ZXIgKG9yIGVycm9yKSBpcyByZWNlaXZlZCBiZWZvcmUgdGhlIHRpbWVvdXQgZGF0ZSBlbGFwc2VzLCBldmVyeXRoaW5nIG9jY3VycyBhcyB3aXRoIGZkX21zZ19zZW5kLiAKKyAqIE90aGVyd2lzZSwgdGhlIHJlcXVlc3QgaXMgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZSAobWVhbmluZyB0aGUgbWF0Y2hpbmcgYW5zd2VyIHdpbGwgYmUgZGlzY2FyZGVkIHVwb24gcmVjZXB0aW9uKSBhbmQgcGFzc2VkIHRvIHRoZSBleHBpcmVjYiAKKyAqIGZ1bmN0aW9uLiBVcG9uIHJldHVybiwgaWYgdGhlICptc2cgcGFyYW1ldGVyIGlzIG5vdCBOVUxMLCBpdCBpcyBmcmVlZCAobm90IHBhc3NlZCB0byBvdGhlciBjYWxsYmFja3MpLiAKKyAqIGV4cGlyZWNiIGlzIGNhbGxlZCBpbiBhIGRlZGljYXRlZCB0aHJlYWQuCisgKiAKKyAqICAgIFRoZSBwcm90b3R5cGUgZm9yIHRoZSBleHBpcmVjYiBjYWxsYmFjayBmdW5jdGlvbiBpczoKKyAqICAgICB2b2lkIGV4cGlyZWNiKHZvaWQgKiBkYXRhLCBzdHJ1Y3QgcGVlcl9oZHIgKiBzZW50dG8sIHN0cnVjdCBtc2cgKiogcmVxdWVzdCkKKyAqCXdoZXJlOgorICoJCWRhdGEgICA6IG9wYXF1ZSBkYXRhIHRoYXQgd2FzIHJlZ2lzdGVyZWQgYWxvbmcgd2l0aCB0aGUgY2FsbGJhY2suCisgKiAgICAgICAgICAgICAgc2VudHRvIDogcG9pbnRlciB0byB0aGUgcGVlciB0byB3aGljaCB0aGUgbWVzc2FnZSB3YXMgc2VudCBhbmQgbm8gYW5zd2VyIHJlY2VpdmVkIHdpdGhpbiB0aW1lb3V0LgorICoJCXJlcXVlc3Q6IGxvY2F0aW9uIG9mIHRoZSBwb2ludGVyIHRvIHRoZSByZXF1ZXN0IHRoYXQgd2FzIG5vdCBhbnN3ZXJlZC4KKyAqCisgKiBSRVRVUk4gVkFMVUU6CisgKiAgMCAgICAgIAk6IFRoZSBtZXNzYWdlIGhhcyBiZWVuIHF1ZXVlZCBmb3Igc2VuZGluZyAoc2VuZGluZyBtYXkgZmFpbCBhc3luY2hyb25vdXNseSkuCisgKiAgRUlOVkFMIAk6IEEgcGFyYW1ldGVyIGlzIGludmFsaWQgKGV4OiBhbnNjYiBwcm92aWRlZCBidXQgbWVzc2FnZSBpcyBub3QgYSByZXF1ZXN0KS4KKyAqICAuLi4KKyAqLworaW50IGZkX21zZ19zZW5kICggc3RydWN0IG1zZyAqKiBwbXNnLCB2b2lkICgqYW5zY2IpKHZvaWQgKiwgc3RydWN0IG1zZyAqKiksIHZvaWQgKiBkYXRhICk7CitpbnQgZmRfbXNnX3NlbmRfdGltZW91dCAoIHN0cnVjdCBtc2cgKiogcG1zZywgdm9pZCAoKmFuc2NiKSh2b2lkICosIHN0cnVjdCBtc2cgKiopLCB2b2lkICogZGF0YSwgdm9pZCAoKmV4cGlyZWNiKSh2b2lkICosIERpYW1JZF90LCBzaXplX3QsIHN0cnVjdCBtc2cgKiopLCBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVvdXQgKTsKKworLyoKKyAqIEZVTkNUSU9OOglmZF9tc2dfcmVzY29kZV9zZXQKKyAqCisgKiBQQVJBTUVURVJTOgorICogIG1zZwkJOiBBIG1zZyBvYmplY3QgLS0gaXQgbXVzdCBiZSBhbiBhbnN3ZXIuCisgKiAgcmVzY29kZQk6IFRoZSBuYW1lIG9mIHRoZSByZXR1cm5lZCBlcnJvciBjb2RlIChleDogIkRJQU1FVEVSX0lOVkFMSURfQVZQIikKKyAqICBlcnJvcm1zZyAgICA6IChvcHRpb25hbCkgaHVtYW4tcmVhZGFibGUgZXJyb3IgbWVzc2FnZSB0byBwdXQgaW4gRXJyb3ItTWVzc2FnZSBBVlAKKyAqICBvcHRhdnAJOiAob3B0aW9uYWwpIElmIHByb3ZpZGVkLCB0aGUgY29udGVudCB3aWxsIGJlIHB1dCBpbnNpZGUgYSBGYWlsZWQtQVZQCisgKiAgdHlwZV9pZAk6IDAgPT4gbm90aGluZzsgMSA9PiBhZGRzIE9yaWdpbi1Ib3N0IGFuZCBPcmlnaW4tUmVhbG0gd2l0aCBsb2NhbCBpbmZvLiAyPT4gYWRkcyBFcnJvci1SZXBvcnRpbmctSG9zdC4KKyAqCisgKiBERVNDUklQVElPTjogCisgKiAgIFRoaXMgZnVuY3Rpb24gYWRkcyBhIFJlc3VsdC1Db2RlIEFWUCB0byBhIG1lc3NhZ2UsIGFuZCBvcHRpb25hbGx5CisgKiAgLSBzZXRzIHRoZSAnRScgZXJyb3IgZmxhZyBpbiB0aGUgaGVhZGVyLAorICogIC0gYWRkcyBFcnJvci1NZXNzYWdlLCBFcnJvci1SZXBvcnRpbmctSG9zdCBhbmQgRmFpbGVkLUFWUCBBVlBzLgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqICAwICAgICAgCTogT3BlcmF0aW9uIGNvbXBsZXRlLgorICogICEwICAgICAgCTogYW4gZXJyb3Igb2NjdXJyZWQuCisgKi8KK2ludCBmZF9tc2dfcmVzY29kZV9zZXQoIHN0cnVjdCBtc2cgKiBtc2csIGNoYXIgKiByZXNjb2RlLCBjaGFyICogZXJyb3Jtc2csIHN0cnVjdCBhdnAgKiBvcHRhdnAsIGludCB0eXBlX2lkICk7CisKKy8qIEFkZCBPcmlnaW4tSG9zdCwgT3JpZ2luLVJlYWxtLCAoaWYgb3NpKSBPcmlnaW4tU3RhdGUtSWQgQVZQUyBhdCB0aGUgZW5kIG9mIHRoZSBtZXNzYWdlICovCitpbnQgZmRfbXNnX2FkZF9vcmlnaW4gKCBzdHJ1Y3QgbXNnICogbXNnLCBpbnQgb3NpICk7IAorCisvKiBHZW5lcmF0ZSBhIG5ldyBTZXNzaW9uLUlkIGFuZCBhZGQgaXQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbWVzc2FnZSAob3B0IGlzIGFkZGVkIGF0IHRoZSBlbmQgb2YgdGhlIHNpZCBpZiBwcm92aWRlZCkgKi8KK2ludCBmZF9tc2dfbmV3X3Nlc3Npb24oIHN0cnVjdCBtc2cgKiBtc2csIG9zMF90IG9wdCwgc2l6ZV90IG9wdGxlbiApOworCisKKy8qIFBhcnNlIGEgbWVzc2FnZSBhZ2FpbnN0IG91ciBkaWN0aW9uYXJ5LCAKKwlyZXR1cm4gMCBpbiBjYXNlIG9mIHN1Y2Nlc3MuCisJbG9nIHBhcnNpbmcgZXJyb3IgJiByZXR1cm4gZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUgaW4gcGFyc2luZy4gCisJSW4gYWRkaXRpb24sIGlmIHRoZSBlcnJvciBjb2RlIGlzIEVCQURNU0cgKHRoZSBtZXNzYWdlIGRvZXMgbm90IGZvbGxvdyBvdXIgZGljdGlvbmFyeSkgCisJCWlmICptc2cgd2FzIGEgcmVxdWVzdCwgKm1zZyBpcyBOVUxMIGFuZCAqZXJyb3IgY29udGFpbnMgdGhlIGVycm9yIG1lc3NhZ2UgcmVhZHkgdG8gc2VuZCBiYWNrIG9uIHJldHVybgorCQlpZiAqbXNnIHdhcyBhbiBhbnN3ZXIsICptc2cgaXMgdW50b3VjaGVkIGFuZCAqZXJyb3I9PSptc2cgaWYgKm1zZyB3YXMgYW4gZXJyb3IgbWVzc2FnZSwgKmVycm9yIGlzIG51bGwgb3RoZXJ3aXNlICovCitpbnQgZmRfbXNnX3BhcnNlX29yX2Vycm9yKCBzdHJ1Y3QgbXNnICoqIG1zZywgc3RydWN0IG1zZyAqKmVycm9yICk7CisKKworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgIERJU1BBVENIICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoKKyAqIEZVTkNUSU9OOglmZF9kaXNwX2FwcF9zdXBwb3J0CisgKgorICogUEFSQU1FVEVSUzoKKyAqICBhcHAJCTogVGhlIGRpY3Rpb25hcnkgb2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIEFwcGxpY2F0aW9uLgorICogIHZlbmRvcgk6IChPcHRpb25hbCkgdGhlIGRpY3Rpb25hcnkgb2JqZWN0IG9mIGEgVmVuZG9yIHRvIGNsYWltIHN1cHBvcnQgaW4gVmVuZG9yLVNwZWNpZmljLUFwcGxpY2F0aW9uLUlkCisgKiAgYXV0aAk6IFN1cHBvcnQgYXV0aCBhcHAgcGFydC4KKyAqICBhY2N0CTogU3VwcG9ydCBhY2N0IGFwcCBwYXJ0LgorICoKKyAqIERFU0NSSVBUSU9OOiAKKyAqICAgUmVnaXN0ZXJzIGFuIGFwcGxpY2F0aW9uIHRvIGJlIGFkdmVydGl6ZWQgaW4gQ0VSL0NFQSBleGNoYW5nZXMuCisgKiAgTWVzc2FnZXMgd2l0aCBhbiBhcHBsaWNhdGlvbi1pZCBtYXRjaGluZyBhIHJlZ2lzdGVyZWQgdmFsdWUgYXJlIHBhc3NlZCB0byB0aGUgZGlzcGF0Y2ggbW9kdWxlLAorICogd2hpbGUgb3RoZXIgbWVzc2FnZXMgYXJlIHNpbXBseSByZWxheWVkIG9yIGFuIGVycm9yIGlzIHJldHVybmVkIChpZiBsb2NhbCBub2RlIGRvZXMgbm90IHJlbGF5KQorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqICAwICAgICAgCTogVGhlIGFwcGxpY2F0aW9uIHN1cHBvcnQgaXMgcmVnaXN0ZXJlZC4KKyAqICBFSU5WQUwgCTogQSBwYXJhbWV0ZXIgaXMgaW52YWxpZC4KKyAqLworaW50IGZkX2Rpc3BfYXBwX3N1cHBvcnQgKCBzdHJ1Y3QgZGljdF9vYmplY3QgKiBhcHAsIHN0cnVjdCBkaWN0X29iamVjdCAqIHZlbmRvciwgaW50IGF1dGgsIGludCBhY2N0ICk7CisKKy8qIE5vdGU6IGlmIHdlIHdhbnQgdG8gc3VwcG9ydCBjYXBhYmlsaXRpZXMgdXBkYXRlcywgd2UnbGwgaGF2ZSB0byBhZGQgcG9zc2liaWxpdHkgdG8gcmVtb3ZlIGFuIGFwcCBhcyB3ZWxsLi4uICovCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogICAgICAgICAgICAgICAgICAgICAgICAgUk9VVElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb25zIG9mIHR5cGVzIGFuZCBmdW5jdGlvbnMgaW52b2x2ZWQgaW4gdGhlIHJvdXRpbmcgZGVjaXNpb25zIGluIGZyZWVEaWFtZXRlciwKKyAqIGFuZCB0aGF0IGNhbiBiZSBjYWxsZWQgYnkgZXh0ZW5zaW9ucy4gCisgKgorICogVGhyZWUgZGlmZmVyZW50IHR5cGUgb2YgbWVzc2FnZXMgbXVzdCBiZSBkaXN0aW5ndWlzaGVkOgorICogIC0gTWVzc2FnZXMgcmVjZWl2ZWQsIGFuZCB0aGUgcGVlciBpcyBmaW5hbCByZWNpcGllbnQgKElOIG1lc3NhZ2VzKQorICogIC0gTWVzc2FnZXMgcmVjZWl2ZWQsIGFuZCB0aGUgcGVlciBpcyBub3QgZmluYWwgcmVjaXBpZW50IChGV0QgbWVzc2FnZXMpCisgKiAgLSBNZXNzYWdlIGlzIGxvY2FsbHkgZ2VuZXJhdGVkIChPVVQgbWVzc2FnZXMpCisgKgorICogVGhlcmUgYXJlIHRocmVlIGdsb2JhbCBtZXNzYWdlIHF1ZXVlcyAoaW4gcXVldWVzLmMpIGFuZCBhbHNvIHBlZXJzLXNwZWNpZmljIHF1ZXVlcyAoaW4gc3RydWN0IGZkX3BlZXIpLgorICoKKyAqICgqKSBJTiBtZXNzYWdlcyBwcm9jZXNzaW5nIGRldGFpbHM6CisgKiAgIC0gdGhlIG1lc3NhZ2UgaXMgcmVjZWl2ZWQgZnJvbSB0aGUgcmVtb3RlIHBlZXIsIGEgRkRFVlBfQ05YX01TR19SRUNWIGV2ZW50IGlzIGdlbmVyYXRlZCBmb3IgdGhlIHBlZXIuCisgKiAgIC0gdGhlIFBTTSB0aHJlYWQgcGFyc2VzIHRoZSBidWZmZXIsIGRvZXMgc29tZSB2ZXJpZmljYXRpb25zLCBoYW5kbGVzIG5vbiByb3V0YWJsZSBtZXNzYWdlcyAoZmRfbXNnX2lzX3JvdXRhYmxlKQorICogICAtIHJvdXRhYmxlIG1lc3NhZ2VzIGFyZSBxdWV1ZWQgaW4gdGhlIGZkX2dfaW5jb21pbmcgZ2xvYmFsIHF1ZXVlLgorICogICAtIGEgdGhyZWFkIChyb3V0aW5nLWluKSBwaWNrcyB0aGUgbWVzc2FnZSBhbmQgdGFrZXMgdGhlIGRlY2lzaW9uIGlmIGl0IGlzIGhhbmRsZWQgbG9jYWxseSBvciBmb3J3YXJkZWQsIAorICogICAgICAgYmFzZWQgb24gbG9jYWwgY2FwYWJpbGl0aWVzIChyZWdpc3RlcmVkIGJ5IGV4dGVuc2lvbnMgd2l0aCBmZF9kaXNwX2FwcF9zdXBwb3J0KS4KKyAqICAgLSBJZiB0aGUgbWVzc2FnZSBpcyBoYW5kbGVkIGxvY2FsbHksIGl0IGlzIHF1ZXVlZCBpbiBmZF9nX2xvY2FsLgorICogICAtIEFub3RoZXIgdGhyZWFkIChkaXNwYXRjaC5jKSB3aWxsIGhhbmRsZSB0aGlzIG1lc3NhZ2UgYW5kIHBhc3MgaXQgdG8gcmVnaXN0ZXJlZCBjYWxsYmFja3MgKHNlZSBmZF9kaXNwX3JlZ2lzdGVyIGluIGxpYmZyZWVEaWFtZXRlci5oKS4KKyAqCisgKiAoKikgRldEIG1lc3NhZ2VzIGRldGFpbHM6CisgKiAgIC0gVGhlIHByb2Nlc3MgaXMgdGhlIHNhbWUgYXMgZm9yIElOIG1lc3NhZ2VzLCB1bnRpbCB0aGUgcm91dGluZy1pbiB0aHJlYWRzIG1ha2VzIGl0cyBkZWNpc2lvbiB0aGF0IHRoZSBtZXNzYWdlIGlzIG5vdCBoYW5kbGVkIGxvY2FsbHkuCisgKiAgIC0gSWYgdGhlIGxvY2FsIHBlZXIgZG9lcyBub3QgcmVsYXkgbWVzc2FnZSwgYW4gZXJyb3IgRElBTUVURVJfQVBQTElDQVRJT05fVU5TVVBQT1JURUQgaXMgcmV0dXJuZWQuCisgKiAgIC0gQWxsIGNhbGxiYWNrcyByZWdpc3RlcmVkIHdpdGggZmRfcnRfZndkX3JlZ2lzdGVyIGFyZSBjYWxsZWQgZm9yIHRoZSBtZXNzYWdlIChzZWUgYmVsb3cpLgorICogICAgIC0gdGhlc2UgY2FsbGJhY2tzIHdpbGwgdHlwaWNhbGx5IGRvIHByb3h5aW5nIHdvcmsuIE5vdGUgdGhhdCBhZGRpbmcgdGhlIHJvdXRlLXJlY29yZCBpcyBoYW5kbGVkIGJ5IHRoZSBkYWVtb24uCisgKiAgIC0gT25jZSBhbGwgY2FsbGJhY2tzIGhhdmUgYmVlbiBjYWxsZWQsIHRoZSBtZXNzYWdlIGlzIHF1ZXVlZCBpbiB0aGUgZ2xvYmFsIGZkX2dfb3V0Z29pbmcgcXVldWUuCisgKiAgIC0gVGhlIHJlbWFpbmluZyBwcm9jZXNzaW5nIGlzIHRoZSBzYW1lIGFzIGZvciBPVVQgbWVzc2FnZXMsIGFzIGRlc2NyaWJlZCBiZWxvdy4KKyAqCisgKiAoKikgT1VUIG1lc3NhZ2VzIGRldGFpbHM6CisgKiAgIC0gVGhlIG1lc3NhZ2UgYXJlIHBpY2tlZCBmcm9tIGZkX2dfb3V0Z29pbmcgKHRoZXkgYXJlIHF1ZXVlZCB0aGVyZSBhcyByZXN1bHQgb2YgZm9yd2FyZGluZyBwcm9jZXNzIG9yIGNhbGwgdG8gZmRfbXNnX3NlbmQuKQorICogICAtIFRoZSAocm91dGluZy1vdXQpIHRocmVhZCBidWlsZHMgYSBsaXN0IG9mIHBvc3NpYmxlIGRlc3RpbmF0aW9ucyBmb3IgdGhlIG1lc3NhZ2UsIGFzIGZvbGxvdzoKKyAqICAgICAgLSBjcmVhdGUgYSBsaXN0IG9mIGFsbCBrbm93biBwZWVycyBpbiB0aGUgIk9QRU4iIHN0YXRlLgorICogICAgICAtIHJlbW92ZSBmcm9tIHRoYXQgbGlzdCBhbGwgcGVlcnMgdGhhdCBhcmUgaW4gYSBSb3V0ZS1SZWNvcmQgQVZQIG9mIHRoZSBtZXNzYWdlLCB0byBhdm9pZCByb3V0aW5nIGxvb3BzLgorICogICAgICAtIHJlbW92ZSBhbHNvIGFsbCBwZWVycyB0aGF0IGhhdmUgcHJldmlvdXNseSByZXBsaWVkIGFuIGVycm9yIG1lc3NhZ2UgZm9yIHRoaXMgbWVzc2FnZS4KKyAqICAgLSBJZiB0aGUgbGlzdCBpcyBlbXB0eSwgY3JlYXRlIGFuIGVycm9yIFVOQUJMRV9UT19ERUxJVkVSIChub3RlOiBzaG91bGQgd2UgdHJpZyBkeW5hbWljIGRpc2NvdmVyeSBoZXJlPz8/KSBhbmQgcmVwbHkuCisgKiAgIC0gT3RoZXJ3aXNlLCBjYWxsIGFsbCBjYWxsYmFja3MgcmVnaXN0ZXJlZCBieSBmdW5jdGlvbiBmZF9ydF9vdXRfcmVnaXN0ZXIsIHdpdGggdGhlIGxpc3Qgb2YgcGVlcnMgYW5kIHRoZSBtZXNzYWdlLgorICogICAtIE9yZGVyIHRoZSByZXN1bHRpbmcgbGlzdCBvZiBwZWVycyBieSBzY29yZSAoc2VlIGJlbG93KSwgYW5kIHNlbnQgdGhlIG1lc3NhZ2UgdG8gdGhlIHBlZXIgd2l0aCBoaWdoZXN0IChwb3NpdGl2ZSkgc2NvcmUuCisgKiAgICAtIGluIGNhc2UgdGhlIHBlZXIgaXMgbm8gbG9uZ2VyIGluIHRoZSAiT1BFTiIgc3RhdGUsIHNlbmQgdGhlIG1lc3NhZ2UgdG8gdGhlIHNlY29uZCBwZWVyIGluIHRoZSBsaXN0LgorICogICAgICAtIGlmIG5vIHBlZXIgaXMgaW4gT1BFTiBzdGF0ZSBhbnltb3JlLCByZXN0YXJ0IHRoZSBwcm9jZXNzIG9mIGNyZWF0aW5nIHRoZSBsaXN0LgorICogICAtIE9uY2UgYSBwZWVyIGhhcyBiZWVuIHNlbGVjdGVkLCB0aGUgbWVzc2FnZSBpcyBxdWV1ZWQgaW50byB0aGF0IHBlZXIncyBvdXRnb2luZyBxdWV1ZS4KKyAqCisgKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhbGxvdyBhbiBleHRlbnNpb24gdG8gcmVnaXN0ZXIgb3IgcmVtb3ZlIGEgY2FsbGJhY2sgYXMgZGVzY3JpYmVkIGFib3ZlLgorICovCisKKy8qKioqKioqKioqIEZvcndhcmRpbmcgY2FsbGJhY2tzOiBmb3IgUHJveHkgb3BlcmF0aW9ucyAqKioqKioqKioqKi8KKworLyogSGFuZGxlIHRvIHJlZ2lzdGVyZWQgY2FsbGJhY2sgKi8KK3N0cnVjdCBmZF9ydF9md2RfaGRsOworCisvKiBNZXNzYWdlIGRpcmVjdGlvbiBmb3IgdGhlIGNhbGxiYWNrICovCitlbnVtIGZkX3J0X2Z3ZF9kaXIgeworCVJUX0ZXRF9SRVEgPSAxLAkvKiBUaGUgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgb24gZm9yd2FyZGVkIHJlcXVlc3RzIG9ubHkgKi8KKwlSVF9GV0RfQUxMID0gMiwJLyogVGhlIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIG9uIGFsbCBmb3J3YXJkZWQgbWVzc2FnZXMgKHJlcXVlc3RzIGFuZCBhbnN3ZXJzICkqLworCVJUX0ZXRF9BTlMgPSAzCS8qIFRoZSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBvbiBhbnN3ZXJzIGFuZCBlcnJvcnMgb25seSAqLworfTsJCisKKy8qCisgKiBGVU5DVElPTjoJZmRfcnRfZndkX3JlZ2lzdGVyCisgKgorICogUEFSQU1FVEVSUzoKKyAqICBydF9md2RfY2IJICA6IFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byByZWdpc3RlciAoc2VlIHByb3RvdHlwZSBiZWxvdykuCisgKiAgY2JkYXRhCSAgOiBQb2ludGVyIHRvIHBhc3MgdG8gdGhlIGNhbGxiYWNrIHdoZW4gaXQgaXMgY2FsbGVkLiBUaGUgZGF0YSBpcyBvcGFxdWUgdG8gdGhlIGRhZW1vbi4KKyAqICBkaXIgICAgICAgICAgIDogT25lIG9mIHRoZSBSVF9GV0RfKiBkaXJlY3Rpb25zIGRlZmluZWQgYWJvdmUuCisgKiAgaGFuZGxlciAgICAgICA6IE9uIHN1Y2Nlc3MsIGEgaGFuZGxlciB0byB0aGUgcmVnaXN0ZXJlZCBjYWxsYmFjayBpcyBzdG9yZWQgaGVyZS4gCisgKgkJICAgVGhpcyBoYW5kbGVyIHdpbGwgYmUgdXNlZCB0byB1bnJlZ2lzdGVyIHRoZSBjYi4KKyAqCisgKiBERVNDUklQVElPTjogCisgKiAgIFJlZ2lzdGVyIGEgbmV3IGNhbGxiYWNrIGZvciBmb3J3YXJkZWQgbWVzc2FnZXMuIFNlZSBleHBsYW5hdGlvbnMgYWJvdmUuIAorICogTm90ZSB0aGF0IHRoZXJlIGlzIG5vIGd1YXJhbnRlZWQgb3JkZXIgZm9yIHRoZSBjYWxsYmFja3MgY2FsbHMuCisgKgorICogUkVUVVJOIFZBTFVFOgorICogIDAgICAgICAJOiBUaGUgY2FsbGJhY2sgaXMgcmVnaXN0ZXJlZC4KKyAqICBFSU5WQUwgCTogQSBwYXJhbWV0ZXIgaXMgaW52YWxpZC4KKyAqICBFTk9NRU0JOiBOb3QgZW5vdWdoIG1lbW9yeSB0byBjb21wbGV0ZSB0aGUgb3BlcmF0aW9uCisgKi8KK2ludCBmZF9ydF9md2RfcmVnaXN0ZXIgKCBpbnQgKCpydF9md2RfY2IpKHZvaWQgKiBjYmRhdGEsIHN0cnVjdCBtc2cgKiogbXNnKSwgdm9pZCAqIGNiZGF0YSwgZW51bSBmZF9ydF9md2RfZGlyIGRpciwgc3RydWN0IGZkX3J0X2Z3ZF9oZGwgKiogaGFuZGxlciApOworLyoKKyAqIENBTExCQUNLOglydF9md2RfY2IKKyAqCisgKiBQQVJBTUVURVJTOgorICogIGRhdGEJOiBwb2ludGVyIHRvIHNvbWUgZGF0YSB0aGF0IHdhcyBwYXNzZWQgd2hlbiB0aGUgY2FsbGJhY2sgd2FzIHJlZ2lzdGVyZWQgKG9wdGlvbmFsKS4KKyAqICBtc2cgCTogVGhlIG1lc3NhZ2UgdGhhdCBpcyBiZWluZyBmb3J3YXJkZWQuCisgKgorICogREVTQ1JJUFRJT046IAorICogICBUaGlzIGNhbGxiYWNrIGlzIGNhbGxlZCB3aGVuIGEgbWVzc2FnZSBpcyBmb3J3YXJkZWQgdG8gYW5vdGhlciBwZWVyLiBJdCBtYXkgZm9yIGV4YW1wbGUgYWRkIGEgUHJveHktSW5mbyBBVlAuCisgKiAgVGhlIGNhbGxiYWNrIG1heSBhbHNvIGNob29zZSB0byBoYW5kbGUgdGhlIG1lc3NhZ2UgaW4gYSBtb3JlIGNvbXBsZXggZm9ybS4gSW4gdGhhdCBjYXNlLCBpdCBtdXN0IHNldCAqbXNnID0gTlVMTAorICogIGFuZCBoYW5kbGUgaXQgZGlmZmVyZW50bHkuIEluIHN1Y2ggY2FzZSwgdGhlIGZvcndhcmRpbmcgdGhyZWFkIHdpbGwgc3RvcCBwcm9jZXNzaW5nIHRoaXMgbWVzc2FnZS4KKyAqCisgKiBSRVRVUk4gVkFMVUU6CisgKiAgMCAgICAgIAk6IE9wZXJhdGlvbiBjb21wbGV0ZS4KKyAqICAhMCAJCTogQW4gZXJyb3Igb2NjdXJyZWQgLS0gd2lsbCByZXN1bHQgaW4gZGFlbW9uJ3MgdGVybWluYXRpb24uCisgKi8KKworLyoKKyAqIEZVTkNUSU9OOglmZF9ydF9md2RfdW5yZWdpc3RlcgorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgaGFuZGxlciAgICAgOiBUaGUgaGFuZGxlciBvZiB0aGUgY2FsbGJhY2sgdGhhdCBtdXN0IGJlIHVucmVnaXN0ZXJlZC4KKyAqICBjYmRhdGEJOiBXaWxsIHJlY2VpdmUgdGhlIGRhdGEgcmVnaXN0ZXJlZCB3aXRoIHRoZSBjYWxsYmFjaywgdGhhdCBjYW4gYmUgZnJlZWQgaWYgbmVlZGVkLgorICoKKyAqIERFU0NSSVBUSU9OOiAKKyAqICAgUmVtb3ZlcyBhIGNhbGxiYWNrIGZyb20gdGhlIGxpc3Qgb2YgcmVnaXN0ZXJlZCBjYWxsYmFja3MuCisgKgorICogUkVUVVJOIFZBTFVFOgorICogIDAgICAgICAJOiBUaGUgY2FsbGJhY2sgaXMgdW5yZWdpc3RlcmVkLgorICogIEVJTlZBTCAJOiBBIHBhcmFtZXRlciBpcyBpbnZhbGlkLgorICovCitpbnQgZmRfcnRfZndkX3VucmVnaXN0ZXIgKCBzdHJ1Y3QgZmRfcnRfZndkX2hkbCAqIGhhbmRsZXIsIHZvaWQgKiogY2JkYXRhICk7CisKKworLyoqKioqKioqKiogT3V0IGNhbGxiYWNrczogZm9yIG5leHQgaG9wIHJvdXRpbmcgZGVjaXNpb24gb3BlcmF0aW9ucyAqKioqKioqKioqKi8KKworLyogSGFuZGxlIHRvIHJlZ2lzdGVyZWQgY2FsbGJhY2sgKi8KK3N0cnVjdCBmZF9ydF9vdXRfaGRsOworCitlbnVtIGZkX3J0X291dF9zY29yZSB7CisJRkRfU0NPUkVfTk9fREVMSVZFUlkJID0gLTcwLAkvKiBXZSBzaG91bGQgbm90IHNlbmQgdGhpcyBtZXNzYWdlIHRvIHRoaXMgY2FuZGlkYXRlICovCisJRkRfU0NPUkVfU0VOVF9SRURJUkVDVAkgPSAtNjAsIC8qIElmIHRoaXMgcGVlciBwcmV2aW91c2x5IHNlbnQgYSBSZWRpcmVjdCBpbmRpY2F0aW9uIHRoYXQgYXBwbGllcyB0byB0aGlzIG1lc3NhZ2UgKi8KKwlGRF9TQ09SRV9JTkkJCSA9ICAtMiwgLyogQWxsIGNhbmRpZGF0ZXMgYXJlIGluaXRpYWxpemVkIHdpdGggdGhpcyB2YWx1ZSAqLworCUZEX1NDT1JFX0xPQURfQkFMQU5DRQkgPSAgIDEsCS8qIFVzZSB0aGlzIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBzZXZlcmFsIHBlZXJzIHdpdGggdGhlIHNhbWUgc2NvcmUgKi8KKwlGRF9TQ09SRV9ERUZBVUxUCSA9ICAgNSwJLyogVGhlIHBlZXIgaXMgYSBkZWZhdWx0IHJvdXRlIGZvciBhbGwgbWVzc2FnZXMgKi8KKwlGRF9TQ09SRV9ERUZBVUxUX1JFQUxNCSA9ICAxMCwJLyogVGhlIHBlZXIgaXMgYSBkZWZhdWx0IHJvdXRlIGZvciB0aGlzIHJlYWxtICovCisJRkRfU0NPUkVfUkVBTE0JCSA9ICAxNSwJLyogVGhlIHBlZXIgYmVsb25ncyB0byBEZXN0aW5hdGlvbi1SZWFsbSBvZiB0aGUgbWVzc2FnZSAqLworCUZEX1NDT1JFX1JFRElSX0hPU1QJID0gIDI1LAkvKiBJZiB0aGVyZSBpcyBhIHJlZGlyZWN0IHJ1bGUgd2l0aCBBTExfSE9TVCBmb3IgdGhlc2UgbWVzc2FnZSBhbmQgcGVlciAqLworCUZEX1NDT1JFX1JFRElSX0FQUAkgPSAgMzAsCS8qIElmIHRoZXJlIGlzIGEgcmVkaXJlY3QgcnVsZSB3aXRoIEFMTF9BUFBMSUNBVElPTiBmb3IgdGhlc2UgbWVzc2FnZSBhbmQgcGVlciAqLworCUZEX1NDT1JFX1JFRElSX1JFQUxNCSA9ICAzNSwJLyogSWYgdGhlcmUgaXMgYSByZWRpcmVjdCBydWxlIHdpdGggQUxMX1JFQUxNIGZvciB0aGVzZSBtZXNzYWdlIGFuZCBwZWVyICovCisJRkRfU0NPUkVfUkVESVJfUkVBTE1fQVBQID0gIDQwLAkvKiBJZiB0aGVyZSBpcyBhIHJlZGlyZWN0IHJ1bGUgd2l0aCBSRUFMTV9BTkRfQVBQTElDQVRJT04gZm9yIHRoZXNlIG1lc3NhZ2UgYW5kIHBlZXIgKi8KKwlGRF9TQ09SRV9SRURJUl9VU0VSCSA9ICA0NSwJLyogSWYgdGhlcmUgaXMgYSByZWRpcmVjdCBydWxlIHdpdGggQUxMX1VTRVIgZm9yIHRoZXNlIG1lc3NhZ2UgYW5kIHBlZXIgKi8KKwlGRF9TQ09SRV9SRURJUl9TRVNTSU9OCSA9ICA1MCwJLyogSWYgdGhlcmUgaXMgYSByZWRpcmVjdCBydWxlIHdpdGggQUxMX1NFU1NJT04gZm9yIHRoZXNlIG1lc3NhZ2UgYW5kIHBlZXIgKi8KKwlGRF9TQ09SRV9SRURJUl9PTkNFCSA9ICA1NSwJLyogSWYgdGhlcmUgaXMgYSByZWRpcmVjdCBydWxlIHdpdGggRE9OVF9DQUNIRSBmb3IgdGhlc2UgbWVzc2FnZSBhbmQgcGVlciAqLworCUZEX1NDT1JFX0ZJTkFMREVTVAkgPSAxMDAJLyogSWYgdGhlIHBlZXIgaXMgdGhlIGZpbmFsIHJlY2lwaWVudCBvZiB0aGUgbWVzc2FnZSAoaS5lLiBtYXRjaGluZyBEZXN0aW5hdGlvbi1Ib3N0KSwgaXQgcmVjZWl2ZXMgYSBiaWcgc2NvcmUuICovCit9OworCisvKgorICogRlVOQ1RJT046CWZkX3J0X291dF9yZWdpc3RlcgorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgcnRfb3V0X2NiCSAgOiBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gdG8gcmVnaXN0ZXIgKHNlZSBwcm90b3R5cGUgYmVsb3cpLgorICogIGNiZGF0YQkgIDogUG9pbnRlciB0byBwYXNzIHRvIHRoZSBjYWxsYmFjayB3aGVuIGl0IGlzIGNhbGxlZC4gVGhlIGRhdGEgaXMgb3BhcXVlIHRvIHRoZSBkYWVtb24uCisgKiAgcHJpb3JpdHkgICAgICA6IE9yZGVyIGZvciBjYWxsaW5nIHRoaXMgY2FsbGJhY2suIFRoZSBjYWxsYmFja3MgYXJlIGNhbGxlZCBpbiByZXZlcnNlIHByaW9yaXR5IG9yZGVyIChoaWdoZXIgcHJpb3JpdHkgPSBjYWxsZWQgc29vbmVyKS4KKyAqICBoYW5kbGVyICAgICAgIDogT24gc3VjY2VzcywgYSBoYW5kbGVyIHRvIHRoZSByZWdpc3RlcmVkIGNhbGxiYWNrIGlzIHN0b3JlZCBoZXJlLiAKKyAqCQkgICBUaGlzIGhhbmRsZXIgd2lsbCBiZSB1c2VkIHRvIHVucmVnaXN0ZXIgdGhlIGNiLgorICoKKyAqIERFU0NSSVBUSU9OOiAKKyAqICAgUmVnaXN0ZXIgYSBuZXcgY2FsbGJhY2sgdG8gaGFuZGxlIE9VVCByb3V0aW5nIGRlY2lzaW9ucy4gU2VlIGV4cGxhbmF0aW9ucyBhYm92ZS4gCisgKgorICogUkVUVVJOIFZBTFVFOgorICogIDAgICAgICAJOiBUaGUgY2FsbGJhY2sgaXMgcmVnaXN0ZXJlZC4KKyAqICBFSU5WQUwgCTogQSBwYXJhbWV0ZXIgaXMgaW52YWxpZC4KKyAqICBFTk9NRU0JOiBOb3QgZW5vdWdoIG1lbW9yeSB0byBjb21wbGV0ZSB0aGUgb3BlcmF0aW9uCisgKi8KK2ludCBmZF9ydF9vdXRfcmVnaXN0ZXIgKCBpbnQgKCpydF9vdXRfY2IpKHZvaWQgKiBjYmRhdGEsIHN0cnVjdCBtc2cgKiogcG1zZywgc3RydWN0IGZkX2xpc3QgKiBjYW5kaWRhdGVzKSwgdm9pZCAqIGNiZGF0YSwgaW50IHByaW9yaXR5LCBzdHJ1Y3QgZmRfcnRfb3V0X2hkbCAqKiBoYW5kbGVyICk7CisvKgorICogQ0FMTEJBQ0s6CXJ0X291dF9jYgorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgY2JkYXRhCTogcG9pbnRlciB0byBzb21lIGRhdGEgdGhhdCB3YXMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBjYWxsYmFjay4KKyAqICBwbXNnIAk6IHBvaW50ZXIgdG8gdGhlIG1lc3NhZ2UgdGhhdCBtdXN0IGJlIHNlbnQuIHVwb24gcmV0dXJuIGlmICptc2cgaXMgTlVMTCwgdGhlIHByb2Nlc3Npbmcgc3RvcHMgYW5kIHRoZSBtZXNzYWdlIGlzIG5vdCBzZW50LgorICogIGxpc3QgICAgICAgIDogVGhlIGxpc3Qgb2YgcGVlcnMgdG8gd2hpY2ggdGhlIG1lc3NhZ2UgbWF5IGJlIHNlbnQgdG8sIGFzIHJldHVybmVkIGJ5IGZkX3J0ZF9jYW5kaWRhdGVfZXh0cmFjdAorICoKKyAqIERFU0NSSVBUSU9OOiAKKyAqICAgVGhpcyBjYWxsYmFjayBtdXN0IGF0dHJpYnV0ZSBhIHNjb3JlIChwcmVmZXJhYmx5IGZyb20gRkRfU0NPUkVfKikgdG8gZWFjaCBjYW5kaWRhdGUgcGVlciBpbiB0aGUgbGlzdC4KKyAqICBPbmNlIGFsbCByZWdpc3RlcmVkIGNhbGxiYWNrcyBoYXZlIGJlZW4gY2FsbGVkLCB0aGUgbWVzc2FnZSBpcyBzZW50IHRvIHRoZSBjYW5kaWRhdGUgd2l0aCB0aGUgaGlnaGVzdCBzY29yZS4KKyAqICBOb3RlIHRoYXQgZWFjaCBjYWxsYmFjayBtdXN0ICphZGQqIGl0cyBsb2NhbGx5LWF0dHJpYnV0ZWQgc2NvcmUgdG8gdGhlIGNhbmRpZGF0ZSBjdXJyZW50ICJzY29yZSIgcGFyYW1ldGVyLCBub3QgcmVwbGFjZSBpdCEKKyAqICBOb3RlIGFsc28gdGhhdCB0aGlzIGNhbGxiYWNrIG11c3QgYmUgcmUtZW50cmFudCBzaW5jZSBpdCBtYXkgYmUgY2FsbGVkIGJ5IHNldmVyYWwgdGhyZWFkcyBhdCB0aGUgc2FtZSB0aW1lIAorICogIChmb3IgZGlmZmVyZW50IG1lc3NhZ2VzKQorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqICAwICAgICAgCTogT3BlcmF0aW9uIGNvbXBsZXRlLgorICogICEwIAkJOiBBbiBlcnJvciBvY2N1cnJlZC4KKyAqLworCisvKgorICogRlVOQ1RJT046CWZkX3J0X291dF91bnJlZ2lzdGVyCisgKgorICogUEFSQU1FVEVSUzoKKyAqICBoYW5kbGVyICAgICA6IFRoZSBoYW5kbGVyIG9mIHRoZSBjYWxsYmFjayB0aGF0IG11c3QgYmUgdW5yZWdpc3RlcmVkLgorICogIGNiZGF0YQk6IFdpbGwgcmVjZWl2ZSB0aGUgZGF0YSByZWdpc3RlcmVkIHdpdGggdGhlIGNhbGxiYWNrLCB0aGF0IGNhbiBiZSBmcmVlZCBpZiBuZWVkZWQuCisgKgorICogREVTQ1JJUFRJT046IAorICogICBSZW1vdmVzIGEgY2FsbGJhY2sgZnJvbSB0aGUgbGlzdCBvZiByZWdpc3RlcmVkIGNhbGxiYWNrcy4KKyAqCisgKiBSRVRVUk4gVkFMVUU6CisgKiAgMCAgICAgIAk6IFRoZSBjYWxsYmFjayBpcyB1bnJlZ2lzdGVyZWQuCisgKiAgRUlOVkFMIAk6IEEgcGFyYW1ldGVyIGlzIGludmFsaWQuCisgKi8KK2ludCBmZF9ydF9vdXRfdW5yZWdpc3RlciAoIHN0cnVjdCBmZF9ydF9vdXRfaGRsICogaGFuZGxlciwgdm9pZCAqKiBjYmRhdGEgKTsKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICBFVkVOVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0cnVjdCBmZF9ldmVudCB7CisJaW50CSBjb2RlOyAvKiBjb2Rlc3BhY2UgZGVwZW5kcyBvbiB0aGUgcXVldWUgKi8KKwlzaXplX3QgCSBzaXplOworCXZvaWQgICAgKmRhdGE7Cit9OworCisvKiBEYWVtb24ncyBjb2Rlc3BhY2U6IDEwMDAtPjE5OTkgKDE1MDAtPjE5OTkgZGVmaW5lZCBpbiBmZGNvcmUtaW50ZXJuYWwuaCkgKi8KK2VudW0geworCSBGREVWX1RFUk1JTkFURV9JTlQ9IDEwMDAJLyogcmVxdWVzdCB0byB0ZXJtaW5hdGUuIERPIE5PVCBVU0UuIFVzZSBmZF9jb3JlX3NodXRkb3duKCkgaW5zdGVhZC4gICovCisJLEZERVZfVFJJR0dFUgkJCS8qIFRyaWdnZXIgYXZhaWxhYmxlIGZvciBleHRlbnNpb25zLiBzaXplIGlzIHNpemVvZihpbnQpLCBkYXRhIGlzIGludCAqICovCit9OworCitpbnQgZmRfZXZlbnRfc2VuZChzdHJ1Y3QgZmlmbyAqcXVldWUsIGludCBjb2RlLCBzaXplX3QgZGF0YXN6LCB2b2lkICogZGF0YSk7CitpbnQgZmRfZXZlbnRfZ2V0KHN0cnVjdCBmaWZvICpxdWV1ZSwgaW50ICogY29kZSwgc2l6ZV90ICogZGF0YXN6LCB2b2lkICoqIGRhdGEpOworaW50IGZkX2V2ZW50X3RpbWVkZ2V0KHN0cnVjdCBmaWZvICpxdWV1ZSwgc3RydWN0IHRpbWVzcGVjICogdGltZW91dCwgaW50IHRpbWVvdXRjb2RlLCBpbnQgKiBjb2RlLCBzaXplX3QgKiBkYXRhc3osIHZvaWQgKiogZGF0YSk7Cit2b2lkIGZkX2V2ZW50X2Rlc3Ryb3koc3RydWN0IGZpZm8gKipxdWV1ZSwgdm9pZCAoKmZyZWVfY2IpKHZvaWQgKiBkYXRhKSk7Citjb25zdCBjaGFyICogZmRfZXZfc3RyKGludCBldmVudCk7CisKKy8qIGZvciBleHRlbnNpb25zICovCitpbnQgZmRfZXZlbnRfdHJpZ19yZWdjYihpbnQgdHJpZ2dlcl92YWwsIGNvbnN0IGNoYXIgKiBtb2R1bGUsIHZvaWQgKCpjYikodm9pZCkpOworCisjaWZuZGVmIFNXSUcKK0RFQ0xBUkVfRkRfRFVNUF9QUk9UT1RZUEUoZmRfZXZlbnRfdHJpZ19kdW1wKTsKKworLyogVGhlICJvbGQiIEZEX0VWX0RVTVBfKiBldmVudHMgYXJlIHJlcGxhY2VkIHdpdGggZGlyZWN0IGNhbGxzIHRvIHRoZSBmb2xsb3dpbmcgZHVtcCBmdW5jdGlvbnMgKi8KK0RFQ0xBUkVfRkRfRFVNUF9QUk9UT1RZUEUoZmRfY29uZl9kdW1wKTsKKworREVDTEFSRV9GRF9EVU1QX1BST1RPVFlQRShmZF9leHRfZHVtcCk7CisjZWxzZSAvKiBTV0lHICovCitERUNMQVJFX0ZEX0RVTVBfUFJPVE9UWVBFX3NpbXBsZShmZF9ldmVudF90cmlnX2R1bXApOworREVDTEFSRV9GRF9EVU1QX1BST1RPVFlQRV9zaW1wbGUoZmRfY29uZl9kdW1wKTsKK0RFQ0xBUkVfRkRfRFVNUF9QUk9UT1RZUEVfc2ltcGxlKGZkX2V4dF9kdW1wKTsKKyNlbmRpZiAvKiBTV0lHICovCitERUNMQVJFX0ZEX0RVTVBfUFJPVE9UWVBFKGZkX3NlcnZlcnNfZHVtcCwgaW50IGRldGFpbHMpOworREVDTEFSRV9GRF9EVU1QX1BST1RPVFlQRShmZF9wZWVyX2R1bXBfbGlzdCwgaW50IGRldGFpbHMpOworREVDTEFSRV9GRF9EVU1QX1BST1RPVFlQRShmZF9wZWVyX2R1bXAsIHN0cnVjdCBwZWVyX2hkciAqIHAsIGludCBkZXRhaWxzKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogICAgICAgICAgICAgICAgICAgICAgICAgRU5EUE9JTlRTICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdHJ1Y3QgZmRfZW5kcG9pbnQgeworCXN0cnVjdCBmZF9saXN0ICBjaGFpbjsJLyogbGluayBpbiBjbmZfZW5kcG9pbnRzIGxpc3QgKi8KKwkKKwl1bmlvbiB7CisJCXNTUwkJc3M7CS8qIHRoZSBzb2NrZXQgaW5mb3JtYXRpb24uIExpc3QgaXMgYWx3YXlzIG9yZGVyZWQgYnkgc3MgdmFsdWUgKG1lbWNtcCkgLS0gc2VlIGZkX2VwX2FkZF9tZXJnZSAqLworCQlzU0E0CQlzaW47CisJCXNTQTYJCXNpbjY7CisJCXNTQQkJc2E7CisJfQorI2lmZGVmIFNXSUcgLyogbmVzdGVkIGFub255bW91cyB1bmlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0ICovCisJCQlzCisjZW5kaWYgLyogU1dJRyAqLworCTsKKwkKKyNkZWZpbmUJRVBfRkxfQ09ORgkoMSA8PCAwKQkvKiBUaGlzIGVuZHBvaW50IGlzIHN0YXRpY2FsbHkgY29uZmlndXJlZCBpbiBhIGNvbmZpZ3VyYXRpb24gZmlsZSAqLworI2RlZmluZQlFUF9GTF9ESVNDCSgxIDw8IDEpCS8qIFRoaXMgZW5kcG9pbnQgd2FzIHJlc29sdmVkIGZyb20gdGhlIERpYW1ldGVyIElkZW50aXR5IG9yIG90aGVyIEROUyBxdWVyeSAqLworI2RlZmluZQlFUF9GTF9BRFYJKDEgPDwgMikJLyogVGhpcyBlbmRwb2ludCB3YXMgYWR2ZXJ0aXplZCBpbiBEaWFtZXRlciBDRVIvQ0VBIGV4Y2hhbmdlICovCisjZGVmaW5lCUVQX0ZMX0xMCSgxIDw8IDMpCS8qIExvd2VyIGxheWVyIG1lY2hhbmlzbSBwcm92aWRlZCB0aGlzIGVuZHBvaW50ICovCisjZGVmaW5lCUVQX0ZMX1BSSU1BUlkJKDEgPDwgNCkJLyogVGhpcyBlbmRwb2ludCBpcyBwcmltYXJ5IGluIGEgbXVsdGlob21lZCBTQ1RQIGFzc29jaWF0aW9uICovCisjZGVmaW5lCUVQX0FDQ0VQVEFMTAkoMSA8PCAxNSkJLyogVGhpcyBmbGFnIGFsbG93cyBieXBhc3NpbmcgdGhlIGFkZHJlc3MgZmlsdGVyIGluIGZkX2VwX2FkZF9tZXJnZS4gKi8KKwl1aW50MzJfdAlmbGFnczsJCS8qIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVuZHBvaW50ICovCisJCQorCS8qIFRvIGFkZDogYSB2YWxpZGl0eSB0aW1lc3RhbXAgZm9yIEROUyByZWNvcmRzID8gSG93IGRvIHdlIHJldHJpZXZlIHRoaXMgbGlmZXRpbWUgZnJvbSBETlMgPyAqLworfTsKKworaW50IGZkX2VwX2FkZF9tZXJnZSggc3RydWN0IGZkX2xpc3QgKiBsaXN0LCBzU0EgKiBzYSwgc29ja2xlbl90IHNsLCB1aW50MzJfdCBmbGFncyApOworaW50IGZkX2VwX2ZpbHRlciggc3RydWN0IGZkX2xpc3QgKiBsaXN0LCB1aW50MzJfdCBmbGFncyApOworaW50IGZkX2VwX2ZpbHRlcl9mYW1pbHkoIHN0cnVjdCBmZF9saXN0ICogbGlzdCwgaW50IGFmICk7CitpbnQgZmRfZXBfY2xlYXJmbGFncyggc3RydWN0IGZkX2xpc3QgKiBsaXN0LCB1aW50MzJfdCBmbGFncyApOworREVDTEFSRV9GRF9EVU1QX1BST1RPVFlQRShmZF9lcF9kdW1wX29uZSwgaW50IHByZWFtYmxlLCBzdHJ1Y3QgZmRfZW5kcG9pbnQgKiBlcCApOworREVDTEFSRV9GRF9EVU1QX1BST1RPVFlQRShmZF9lcF9kdW1wLCBpbnQgcHJlYW1ibGUsIGludCBpbmRlbnQsIHN0cnVjdCBmZF9saXN0ICogZXBzICApOworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgIEFQUExJQ0FUSU9OUyBJRHMgICAgICAgICAgICAgICAgICAgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RydWN0IGZkX2FwcCB7CisJc3RydWN0IGZkX2xpc3QJIGNoYWluOwkvKiBsaW5rIGluIGNuZl9hcHBzIGxpc3QuIExpc3Qgb3JkZXJlZCBieSBhcHBpZC4gKi8KKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBhdXRoICAgOiAxOworCQl1bnNpZ25lZCBhY2N0ICAgOiAxOworCX0JCSBmbGFnczsKKwl2ZW5kb3JfaWRfdAkgdm5kaWQ7IC8qIGlmIG5vdCAwLCBWZW5kb3ItU3BlY2lmaWMtQXBwLUlkIEFWUCB3aWxsIGJlIHVzZWQgKi8KKwlhcHBsaWNhdGlvbl9pZF90IGFwcGlkOwkvKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgYXBwbGljYXRpb24gKi8KK307CisJCitpbnQgZmRfYXBwX21lcmdlKHN0cnVjdCBmZF9saXN0ICogbGlzdCwgYXBwbGljYXRpb25faWRfdCBhaWQsIHZlbmRvcl9pZF90IHZpZCwgaW50IGF1dGgsIGludCBhY2N0KTsKK2ludCBmZF9hcHBfY2hlY2soc3RydWN0IGZkX2xpc3QgKiBsaXN0LCBhcHBsaWNhdGlvbl9pZF90IGFpZCwgc3RydWN0IGZkX2FwcCAqKmRldGFpbCk7CitpbnQgZmRfYXBwX2NoZWNrX2NvbW1vbihzdHJ1Y3QgZmRfbGlzdCAqIGxpc3QxLCBzdHJ1Y3QgZmRfbGlzdCAqIGxpc3QyLCBpbnQgKiBjb21tb25fZm91bmQpOworaW50IGZkX2FwcF9lbXB0eShzdHJ1Y3QgZmRfbGlzdCAqIGxpc3QpOworCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogICAgICAgICAgICAgICAgICAgICAgICAgTU9OSVRPUklORyAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiBUaGVzZSBmdW5jdGlvbnMgYWxsb3cgYW4gZXh0ZW5zaW9uIHRvIGNvbGxlY3Qgc3RhdGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlCisgKiBmcmFtZXdvcmssIGFzIHdlbGwgYXMgYmVpbmcgaG9va2VkIGF0IHNvbWUga2V5IGNoZWNrcG9pbnRzIGluIHRoZSBwcm9jZXNzaW5nCisgKiBmb3IgbG9nZ2luZyBvciBzdGF0aXN0aWNzIHB1cnBvc2UuCisgKi8KKyAKKworLyogQ0FMTEJBQ0s6IAlmZF9ob29rX2NiCisgKgorICogUEFSQU1FVEVSUzoKKyAqICB0eXBlCTogVGhlIHR5cGUgb2YgaG9vayB0aGF0IHRyaWdnZXJlZCB0aGlzIGNhbGwsIGluIGNhc2Ugc2FtZSBjYiBpcyByZWdpc3RlcmVkIGZvciBzZXZlcmFsIGhvb2tzLgorICogIG1zZyAJOiBJZiByZWxldmFudCwgdGhlIHBvaW50ZXIgdG8gdGhlIG1lc3NhZ2UgdHJpZ2dlcmluZyB0aGUgY2FsbC4gTlVMTCBvdGhlcndpc2UuCisgKiAgcGVlciAgICAgICAgOiBJZiByZWxldmFudCwgdGhlIHBvaW50ZXIgdG8gdGhlIHBlZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBjYWxsLiBOVUxMIG90aGVyd2lzZS4KKyAqICBvdGhlcgk6IEZvciBzb21lIGNhbGxiYWNrcywgdGhlIHJlbWFpbmluZyBpbmZvcm1hdGlvbiBpcyBwYXNzZWQgaW4gdGhpcyBwYXJhbWV0ZXIuIFNlZSBlYWNoIGhvb2sgZGV0YWlsLgorICogIHBlcm1zZ2RhdGEgIDogU3RydWN0dXJlIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIG1lc3NhZ2UsIGFjcm9zcyBzZXZlcmFsIGhvb2tzLiAKKyAqICAgICAgICAgICAgICAgICBBIGRpZmZlcmVudCBzdHJ1Y3R1cmUgaXMgYXNzb2NpYXRlZCB3aXRoIHJlcXVlc3RzIGFuZCBjb3JyZXNwb25kaW5nIGFuc3dlcnMuIAorICogICAgICAgICAgICAgICAgIFNlZSBmZF9ob29rX2RhdGFfaGRsIGJlbG93IGZvciBkZXRhaWxzLgorICogICAgICAgICAgICAgICAgIElmIG5vIGZkX2hvb2tfZGF0YV9oZGwgaXMgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgY2FsbGJhY2ssIHRoaXMgcGFyYW1ldGVyIGlzIGFsd2F5cyBOVUxMCisgKiAgcmVnZGF0YSAgICAgOiBEYXRhIHBvaW50ZXIgc3RvcmVkIGF0IHJlZ2lzdHJhdGlvbiwgb3BhcXVlIGZvciB0aGUgZnJhbWV3b3JrLgorICoKKyAqIERFU0NSSVBUSU9OOiAKKyAqICAgV2hlbiBzdWNoIGNhbGxiYWNrIGlzIHJlZ2lzdGVyZWQgd2l0aCBmZF9ob29rX3JlZ2lzdGVyIGZ1bmN0aW9uLCBpdCB3aWxsIGJlIGNhbGxlZCBvbiBtYXRjaGluZyBldmVudHMgd2l0aCAKKyAqIHRoZSBwYXJhbWV0ZXJzIGFzIGRlc2NyaWJlZCBpbiB0aGUgbGlzdCBvZiBmZF9ob29rX3R5cGUgYmVsb3cuIE9uZSBjYW4gdXNlIHRoaXMgbWVjaGFuaXNtIGZvciBlLmcuOgorICogIC0gbG9nIGNvbXBsZXRlbHkgdGhlIG1lc3NhZ2VzIGZvciBzYWZldHkgLyBiYWNrdXAKKyAqICAtIGNyZWF0ZSBzdGF0aXN0aWNzIGluZm9ybWF0aW9uIG9uIHRoZSB0aHJvdWdocHV0CisgKiAgLSAuLi4KKyAqCisgKiAgSU1QT1JUQU5UOiB0aGUgY2FsbGJhY2sgTVVTVCBOT1QgY2hhbmdlIHRoZSBtZW1vcnkgcG9pbnRlZCBieSB0aGUgZGlmZmVyZW50IHBhcmFtZXRlcnMgKHBlZXIsIG1lc3NhZ2UsIC4uLikKKyAqCisgKiBSRVRVUk4gVkFMVUU6CisgKiAgbm9uZS4KKyAqLworIAorLyogVGhlIGF2YWlsYWJsZSBob29rcyBpbiB0aGUgZnJhbWV3b3JrICovCitlbnVtIGZkX2hvb2tfdHlwZSB7CisKKwlIT09LX0RBVEFfUkVDRUlWRUQgPSAwLAorCQkvKiBIb29rIGNhbGxlZCBhcyBzb29uIGFzIGEgbWVzc2FnZSBoYXMgYmVlbiByZWNlaXZlZCBmcm9tIHRoZSBuZXR3b3JrLCBhZnRlciBUTFMgJiBib3VuZGFyeSBwcm9jZXNzaW5nLgorCQkgLSB7bXNnfSBpcyBOVUxMLgorCQkgLSB7cGVlcn0gaXMgTlVMTC4KKwkJIC0ge290aGVyfSBpcyBhIHBvaW50ZXIgdG8gYSBzdHJ1Y3QgZmRfY254X3JjdmRhdGEgY29udGFpbmluZyB0aGUgcmVjZWl2ZWQgYnVmZmVyLgorCQkgLSB7cGVybXNnZGF0YX0gcG9pbnRzIHRvIGVpdGhlciBhIG5ldyBlbXB0eSBzdHJ1Y3R1cmUgYWxsb2NhdGVkIGZvciB0aGlzIG1lc3NhZ2UgKGNmLiBmZF9ob29rX2RhdGFfaGRsKSwgb3IgTlVMTCBpZiBubyBoZGwgaXMgcmVnaXN0ZXJlZC4KKwkJICovCisJCSAKKwlIT09LX01FU1NBR0VfUkVDRUlWRUQsCisJCS8qIEhvb2sgY2FsbGVkIHdoZW4gYSBtZXNzYWdlIGhhcyBiZWVuIHJlY2VpdmVkIGFuZCB0aGUgc3RydWN0dXJlIGhhcyBiZWVuIHBhcnNlZCBzdWNjZXNzZnVsbHkgKGxpc3Qgb2YgQVZQcykuCisJCSAtIHttc2d9IHBvaW50cyB0byB0aGUgcGFyc2VkIG1lc3NhZ2UuIEF0IHRoaXMgdGltZSwgdGhlIG9iamVjdHMgaGF2ZSBub3QgYmVlbiBkaWN0aW9uYXJ5IHJlc29sdmVkLiBJZiB5b3UKKwkJICAgdHJ5IHRvIGNhbGwgZmRfbXNnX3BhcnNlX2RpY3QsIGl0IHdpbGwgc2xvdyBkb3duIHRoZSBvcGVyYXRpb24gb2YgYSByZWxheSBhZ2VudC4KKwkJIC0ge3BlZXJ9IGlzIHNldCBpZiB0aGUgbWVzc2FnZSBpcyByZWNlaXZlZCBmcm9tIGEgcGVlcidzIGNvbm5lY3Rpb24sIGFuZCBOVUxMIGlmIHRoZSBtZXNzYWdlIGlzIGZyb20gYSBuZXcgY2xpZW50CisJCSAgIGNvbm5lY3RlZCBhbmQgbm90IHlldCBpZGVudGlmaWVkCisJCSAtIHtvdGhlcn0gaXMgTlVMTCwgb3IgYSBjaGFyICogaWRlbnRpZnlpbmcgdGhlIGNvbm5lY3Rpb24gd2hlbiB7cGVlcn0gaXMgbnVsbC4KKwkJIC0ge3Blcm1zZ2RhdGF9IHBvaW50cyB0byBlaXRoZXIgYSBuZXcgZW1wdHkgc3RydWN0dXJlIGFsbG9jYXRlZCBmb3IgdGhpcyBtZXNzYWdlIG9yIHRoZSBvbmUgcGFzc2VkIHRvIEhPT0tfREFUQV9SRUNFSVZFRCBpZiB1c2VkLgorCQkgKi8KKwkKKwlIT09LX01FU1NBR0VfTE9DQUwsCisJCS8qIEhvb2sgY2FsbGVkIHdoZW4gYSByZXF1ZXN0IG1lc3NhZ2UgaGFzIGJlZW4gY3JlYXRlZCBsb2NhbGx5IGJ5IGFuIGV4dGVuc2lvbiBhbmQgaXMgYmVpbmcgc2VudC4KKwkJIC0ge21zZ30gcG9pbnRzIHRvIHRoZSBtZXNzYWdlLgorCQkgLSB7cGVlcn0gaXMgTlVMTAorCQkgLSB7b3RoZXJ9IGlzIE5VTEwKKwkJIC0ge3Blcm1zZ2RhdGF9IHBvaW50cyB0byBhIG5ldyBlbXB0eSBzdHJ1Y3R1cmUgYWxsb2NhdGVkIGZvciB0aGlzIHJlcXVlc3QgKGNmLiBmZF9ob29rX2RhdGFfaGRsKQorCQkgKi8KKwkKKwlIT09LX01FU1NBR0VfU0VORElORywKKwkJLyogSG9vayBjYWxsZWQgd2hlbiBhIG1lc3NhZ2UgaXMgYWJvdXQgdG8gYmUgc2VudCB0byBhIHBlZXIuIFRoZSBtZXNzYWdlIHBvaW50ZXIgY2Fubm90IGJlIG1vZGlmaWVkIGhlcmUsIGJ1dCB0aGUgY29udGVudCBvZiB0aGUgbWVzc2FnZQorCQkgIGNvdWxkIHN0aWxsIGJlIGNoYW5nZWQgKGZvciBleGFtcGxlIGFkZCBvciByZW1vdmUgc29tZSBBVlAuIFRoaXMgaXMgdGhlIGxhc3QgY2hhbmNlLgorCQkgLSB7bXNnfSBwb2ludHMgdG8gdGhlIG1lc3NhZ2UuIFNvbWUgb2JqZWN0cyBtYXkgbm90IGhhdmUgYmVlbiBkaWN0aW9uYXJ5IHJlc29sdmVkLiBJZiB5b3UKKwkJICAgdHJ5IHRvIGNhbGwgZmRfbXNnX3BhcnNlX2RpY3QsIGl0IHdpbGwgc2xvdyBkb3duIHRoZSBvcGVyYXRpb24gb2YgdGhlIGluc3RhbmNlLgorCQkgLSB7cGVlcn0gaXMgdGhlIG9uZSB0aGUgbWVzc2FnZSBpcyBiZWluZyBzZW50IHRvLgorCQkgLSB7b3RoZXJ9IGlzIE5VTEwuCisJCSAtIHtwZXJtc2dkYXRhfSBwb2ludHMgdG8gZXhpc3Rpbmcgc3RydWN0dXJlIGlmIGFueSwgb3IgYSBuZXcgc3RydWN0dXJlIG90aGVyd2lzZS4gCisJCSAqLworCQorCUhPT0tfTUVTU0FHRV9TRU5ULAorCQkvKiBIb29rIGNhbGxlZCB3aGVuIGEgbWVzc2FnZSBoYXMgYmVlbiBzZW50IHRvIGEgcGVlci4gVGhlIG1lc3NhZ2UgbWlnaHQgYmUgZnJlZWQgYXMgc29vbiBhcyB0aGUgaG9vayBmdW5jdGlvbiByZXR1cm5zLAorCQkgICBzbyBpdCBpcyBub3Qgc2FmZSB0byBzdG9yZSB0aGUgcG9pbnRlciBmb3IgYXN5bmNocm9ub3VzIHByb2Nlc3NpbmcuCisJCSAtIHttc2d9IHBvaW50cyB0byB0aGUgc2VudCBtZXNzYWdlLiBBZ2FpbiwgdGhlIG9iamVjdHMgbWF5IG5vdCBoYXZlIGJlZW4gZGljdGlvbmFyeSByZXNvbHZlZC4gSWYgeW91CisJCSAgIHRyeSB0byBjYWxsIGZkX21zZ19wYXJzZV9kaWN0LCBpdCB3aWxsIHNsb3cgZG93biB0aGUgb3BlcmF0aW9uIG9mIGEgcmVsYXkgYWdlbnQuCisJCSAtIHtwZWVyfSBpcyBzZXQgaWYgdGhlIG1lc3NhZ2UgaXMgc2VudCB0byBhIHBlZXIncyBjb25uZWN0aW9uLCBhbmQgTlVMTCBpZiB0aGUgbWVzc2FnZSBpcyBzZW50IHRvIGEgbmV3IGNsaWVudAorCQkgICBjb25uZWN0ZWQgYW5kIG5vdCB5ZXQgaWRlbnRpZmllZCwgb3IgYmVpbmcgcmVqZWN0ZWQKKwkJIC0ge290aGVyfSBpcyBOVUxMLgorCQkgLSB7cGVybXNnZGF0YX0gcG9pbnRzIHRvIGV4aXN0aW5nIHN0cnVjdHVyZSBpZiBhbnksIG9yIGEgbmV3IHN0cnVjdHVyZSBvdGhlcndpc2UuIAorCQkgKi8KKwkKKwlIT09LX01FU1NBR0VfRkFJTE9WRVIsCisJCS8qIEhvb2sgY2FsbGVkIHdoZW4gYSBtZXNzYWdlIHRoYXQgd2FzIHNlbnQgdG8gYSBwZWVyIGlzIGJlaW5nIHJlcXVldWVkLCBiZWNhdXNlIGUuZy4gdGhlIGNvbm5lY3Rpb24gd2FzIHRvcm4gZG93bi4KKwkJICAgSW4gdGhhdCBjYXNlIHRoZSBtZXNzYWdlIHdpbGwgZ28gYWdhaW4gdGhyb3VnaCB0aGUgcm91dGluZyBwcm9jZXNzLgorCQkgLSB7bXNnfSBwb2ludHMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgcmVxdWVzdCBtZXNzYWdlICh0aGUgYW5zd2VyIGlzIGRpc2NhcmRlZCkuIEFnYWluLCB0aGUgb2JqZWN0cyBtYXkgbm90IGhhdmUgYmVlbiBkaWN0aW9uYXJ5IHJlc29sdmVkLiBJZiB5b3UKKwkJICAgdHJ5IHRvIGNhbGwgZmRfbXNnX3BhcnNlX2RpY3QsIGl0IG1pZ2h0IHNsb3cgZG93biB0aGUgb3BlcmF0aW9uIG9mIGEgcmVsYXkgYWdlbnQsIGFsdGhvdWdoIHRoaXMgaG9vayBpcyBub3Qgb24gdGhlIG5vcm1hbCBleGVjdXRpb24gcGF0aC4KKwkJIC0ge3BlZXJ9IGlzIHRoZSBwZWVyIHRoaXMgbWVzc2FnZSB3YXMgcHJldmlvdXNseSBzZW50IHRvLgorCQkgLSB7b3RoZXJ9IGlzIE5VTEwuCisJCSAtIHtwZXJtc2dkYXRhfSBwb2ludHMgdG8gZXhpc3Rpbmcgc3RydWN0dXJlIGlmIGFueSwgb3IgYSBuZXcgc3RydWN0dXJlIG90aGVyd2lzZS4gCisJCSAqLworCQorCUhPT0tfTUVTU0FHRV9QQVJTSU5HX0VSUk9SLAorCQkvKiBIb29rIGNhbGxlZCB3aGVuIGEgbWVzc2FnZSBiZWluZyBwcm9jZXNzZWQgY2Fubm90IGJlIHBhcnNlZCBzdWNjZXNzZnVsbHkuCisJCSAtIHttc2d9IHBvaW50cyB0byB0aGUgbWVzc2FnZSBpZiBidWZmZXIgd2FzIHBhcnNlZCBzdWNjZXNzZnVsbHksIG9yIE5VTEwgb3RoZXJ3aXNlLiBZb3Ugc2hvdWxkIG5vdCBjYWxsIGZkX21zZ19wYXJzZV9kaWN0IG9uIHRoaXMgaW4gYW55IGNhc2UuCisJCSAtIHtwZWVyfSBpcyBOVUxMIG9yIHRoZSBwZWVyIHRoYXQgcmVjZWl2ZWQgdGhlIG1lc3NhZ2UuIElmIE5VTEwgYW5kIHRoZSBtZXNzYWdlIGlzIG5vdCBOVUxMLCB5b3UgY2FuIHN0aWxsIHJldHJpZXZlIHRoZSBzb3VyY2UgZnJvbSB0aGUgbWVzc2FnZSBpdHNlbGYuCisJCSAtIHtvdGhlcn0gaXMgYSBjaGFyICogcG9pbnRlciB0byB0aGUgZXJyb3IgbWVzc2FnZSAoaHVtYW4tcmVhZGFibGUpIGlmIHttc2d9IGlzIG5vdCBOVUxMLCBhIHBvaW50ZXIgdG8gc3RydWN0IGZkX2NueF9yY3ZkYXRhIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGJ1ZmZlciBvdGhlcndpc2UuCisJCSAtIHtwZXJtc2dkYXRhfSBwb2ludHMgdG8gZXhpc3Rpbmcgc3RydWN0dXJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG1lc3NhZ2UgKG9yIG5ldyBzdHJ1Y3R1cmUgaWYgbm8gcHJldmlvdXMgaG9vayB3YXMgcmVnaXN0ZXJlZCkuIAorCQkgKi8KKwkJIAorCUhPT0tfTUVTU0FHRV9ST1VUSU5HX0VSUk9SLAorCQkvKiBIb29rIGNhbGxlZCB3aGVuIGEgbWVzc2FnZSBiZWluZyBwcm9jZXNzZWQgYnkgdGhlIHJvdXRpbmcgdGhyZWFkIG1lZXRzIGFuIGVycm9yIHN1Y2ggYXMgbm8gcmVtYWluaW5nIGF2YWlsYWJsZSBwZWVyIGZvciBzZW5kaW5nLCBiYXNlZCBvbiByb3V0aW5nIGNhbGxiYWNrcyBkZWNpc2lvbnMgKG1heWJlIGFmdGVyIHJldHJpZXMpLgorCQkgLSB7bXNnfSBwb2ludHMgdG8gdGhlIG1lc3NhZ2UuIEFnYWluLCB0aGUgb2JqZWN0cyBtYXkgbm90IGhhdmUgYmVlbiBkaWN0aW9uYXJ5IHJlc29sdmVkLiBJZiB5b3UKKwkJICAgdHJ5IHRvIGNhbGwgZmRfbXNnX3BhcnNlX2RpY3QsIGl0IG1pZ2h0IHNsb3cgZG93biB0aGUgb3BlcmF0aW9uIG9mIGEgcmVsYXkgYWdlbnQsIGFsdGhvdWdoIHRoaXMgaG9vayBpcyBub3Qgb24gdGhlIG5vcm1hbCBleGVjdXRpb24gcGF0aC4KKwkJIC0ge3BlZXJ9IGlzIE5VTEwuCisJCSAtIHtvdGhlcn0gaXMgYSBjaGFyICogcG9pbnRlciB0byB0aGUgZXJyb3IgbWVzc2FnZSAoaHVtYW4tcmVhZGFibGUpLgorCQkgLSB7cGVybXNnZGF0YX0gcG9pbnRzIHRvIGV4aXN0aW5nIHN0cnVjdHVyZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBtZXNzYWdlIChvciBuZXcgc3RydWN0dXJlIGlmIG5vIHByZXZpb3VzIGhvb2sgd2FzIHJlZ2lzdGVyZWQpLiAKKwkJICovCisJCisJSE9PS19NRVNTQUdFX1JPVVRJTkdfRk9SV0FSRCwKKwkJLyogSG9vayBjYWxsZWQgd2hlbiBhIHJlY2VpdmVkIG1lc3NhZ2UgaXMgZGVlbWVkIHRvIGJlIG5vdCBoYW5kbGVkIGxvY2FsbHkgYnkgdGhlIHJvdXRpbmdfZGlzcGF0Y2ggcHJvY2Vzcy4KKwkJICAgVGhlIGRlY2lzaW9uIG9mIGtub3dpbmcgd2hpY2ggcGVlciBpdCB3aWxsIGJlIHNlbnQgdG8gaXMgbm90IG1hZGUgeWV0IChvciBpZiBhbiBlcnJvciB3aWxsIGJlIHJldHVybmVkKS4KKwkJICAgVGhlIGhvb2sgaXMgdHJpZ2dlZCBiZWZvcmUgdGhlIGNhbGxiYWNrcyByZWdpc3RlcmVkIHdpdGggZmRfcnRfZndkX3JlZ2lzdGVyIGFyZSBjYWxsZWQuCisJCSAtIHttc2d9IHBvaW50cyB0byB0aGUgbWVzc2FnZS4gQWdhaW4sIHRoZSBvYmplY3RzIG1heSBub3QgaGF2ZSBiZWVuIGRpY3Rpb25hcnkgcmVzb2x2ZWQuIAorCQkgICAgSWYgeW91IHRyeSB0byBjYWxsIGZkX21zZ19wYXJzZV9kaWN0LCBpdCB3aWxsIHNsb3cgZG93biB0aGUgb3BlcmF0aW9uIG9mIGEgcmVsYXkgYWdlbnQuCisJCSAtIHtwZWVyfSBpcyBOVUxMLgorCQkgLSB7b3RoZXJ9IGlzIE5VTEwuCisJCSAtIHtwZXJtc2dkYXRhfSBwb2ludHMgdG8gZXhpc3Rpbmcgc3RydWN0dXJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG1lc3NhZ2UgKG9yIG5ldyBzdHJ1Y3R1cmUgaWYgbm8gcHJldmlvdXMgaG9vayB3YXMgcmVnaXN0ZXJlZCkuIAorCQkgKi8KKwkKKwlIT09LX01FU1NBR0VfUk9VVElOR19MT0NBTCwKKwkJLyogSG9vayBjYWxsZWQgd2hlbiBhIHJlY2VpdmVkIG1lc3NhZ2UgaXMgaGFuZGxlZCBsb2NhbGx5IGJ5IHRoZSByb3V0aW5nX2Rpc3BhdGNoIHByb2Nlc3MgKGkuZS4sIG5vdCBmb3J3YXJkZWQpLgorCQkgICBUaGUgaG9vayBpcyB0cmlnZ2VkIGJlZm9yZSB0aGUgY2FsbGJhY2tzIHJlZ2lzdGVyZWQgd2l0aCBmZF9kaXNwX3JlZ2lzdGVyIGFyZSBjYWxsZWQuCisJCSAtIHttc2d9IHBvaW50cyB0byB0aGUgbWVzc2FnZS4gSGVyZSwgdGhlIG1lc3NhZ2UgaGFzIGJlZW4gYWxyZWFkeSBwYXJzZWQgY29tcGxldGVseSAmIHN1Y2Nlc3NmdWxseS4KKwkJIC0ge3BlZXJ9IGlzIE5VTEwuCisJCSAtIHtvdGhlcn0gaXMgTlVMTC4KKwkJIC0ge3Blcm1zZ2RhdGF9IHBvaW50cyB0byBleGlzdGluZyBzdHJ1Y3R1cmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbWVzc2FnZSAob3IgbmV3IHN0cnVjdHVyZSBpZiBubyBwcmV2aW91cyBob29rIHdhcyByZWdpc3RlcmVkKS4gCisJCSAqLworCQorCUhPT0tfTUVTU0FHRV9EUk9QUEVELAorCQkvKiBIb29rIGNhbGxlZCB3aGVuIGEgbWVzc2FnZSBpcyBiZWluZyBkaXNjYXJkZWQgYnkgdGhlIGZyYW1ld29yayBiZWNhdXNlIG9mIHNvbWUgZXJyb3IgY29uZGl0aW9uIChub3JtYWwgb3IgYWJub3JtYWwpLgorCQkgICBJdCBpcyBwcm9iYWJseSBhIGdvb2QgaWRlYSB0byBsb2cgdGhpcyBmb3IgYW5hbHlzaXMgLyBiYWNrdXAuCisJCSAtIHttc2d9IHBvaW50cyB0byB0aGUgbWVzc2FnZSwgd2hpY2ggd2lsbCBiZSBmcmVlZCBhcyBzb29uIGFzIHRoZSBob29rIHJldHVybnMuCisJCSAtIHtwZWVyfSBtYXkgYmUgTlVMTCBvciBhIHBlZXIgcmVsYXRlZCB0byB0aGUgZXZlbnQuCisJCSAtIHtvdGhlcn0gaXMgYSBjaGFyICogcG9pbnRlciB0byB0aGUgZXJyb3IgbWVzc2FnZSAoaHVtYW4tcmVhZGFibGUpLgorCQkgLSB7cGVybXNnZGF0YX0gcG9pbnRzIHRvIGV4aXN0aW5nIHN0cnVjdHVyZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBtZXNzYWdlIChvciBuZXcgc3RydWN0dXJlIGlmIG5vIHByZXZpb3VzIGhvb2sgd2FzIHJlZ2lzdGVyZWQpLgorCQkgKi8KKwkKKwlIT09LX1BFRVJfQ09OTkVDVF9GQUlMRUQsCisJCS8qIEhvb2sgY2FsbGVkIHdoZW4gYSBjb25uZWN0aW9uIGF0dGVtcHQgdG8vZnJvbSBhIHJlbW90ZSBwZWVyIGhhcyBmYWlsZWQuIFRoaXMgaG9vayBpcyBhbHNvIGNhbGxlZCB3aGVuIHRoZSBwZWVyIHdhcyBpbiBPUEVOIHN0YXRlIGFuZCB0aGUgY29ubmVjdGlvbiBpcyBicm9rZW4uCisJCSAtIHttc2d9IG1heSBiZSBOVUxMIChsb3dlciBsYXllciBlcnJvciwgZS5nLiBjb25uZWN0aW9uIHRpbWVvdXQpIG9yIHBvaW50cyB0byBhIG1lc3NhZ2Ugc2hvd2luZyB0aGUgZXJyb3IgKGVpdGhlciBpbnZhbGlkIGluY29taW5nIG1lc3NhZ2UsIG9yIHRoZSBDRUEgbWVzc2FnZSBzZW50IG9yIHJlY2VpdmVkIHdpdGggYW4gZXJyb3IgY29kZSkuCisJCSAtIHtwZWVyfSBtYXkgYmUgTlVMTCBmb3IgaW5jb21pbmcgcmVxdWVzdHMgZnJvbSB1bmtub3duIHBlZXJzIGJlaW5nIHJlamVjdGVkLCBvdGhlcndpc2UgaXQgcG9pbnRzIHRvIHRoZSBwZWVyIHN0cnVjdHVyZSBhc3NvY2lhdGVkIHdpdGggdGhlIGF0dGVtcHQuCisJCSAtIHtvdGhlcn0gaXMgYSBjaGFyICogcG9pbnRlciB0byB0aGUgZXJyb3IgbWVzc2FnZSAoaHVtYW4tcmVhZGFibGUpLgorCQkgLSB7cGVybXNnZGF0YX0gaXMgYWx3YXlzIE5VTEwgZm9yIHRoaXMgaG9vay4KKwkJICovCisJCisJSE9PS19QRUVSX0NPTk5FQ1RfU1VDQ0VTUywKKwkJLyogSG9vayBjYWxsZWQgd2hlbiBhIGNvbm5lY3Rpb24gYXR0ZW1wdCB0by9mcm9tIGEgcmVtb3RlIHBlZXIgaGFzIHN1Y2NlZWRlZCAodGhlIHBlZXIgbW92ZXMgdG8gT1BFTl9IQU5EU0hBS0Ugb3IgT1BFTiBzdGF0ZSkuCisJCSAgICBJbiBjYXNlIG9mIGRlcHJlY2F0ZWQgVExTIGhhbmRzaGFrZSBhZnRlciB0aGUgQ0VSL0NFQSBleGNoYW5nZSwgdGhpcyBob29rIGNhbiBzdGlsbCBiZSBmb2xsb3dlZCBieSBIT09LX1BFRVJfQ09OTkVDVF9GQUlMRUQgaWYgVExTIGhhbmRzaGFrZSBmYWlscy4KKwkJIC0ge21zZ30gcG9pbnRzIHRvIHRoZSBDRUEgbWVzc2FnZSBzZW50IG9yIHJlY2VpdmVkICh3aXRoIGEgc3VjY2VzcyBjb2RlKSAtLSBpbiBjYXNlIGl0IGlzIHNlbnQsIHlvdSBjYW4gYWx3YXlzIGdldCBhY2Nlc3MgdG8gdGhlIG1hdGNoaW5nIENFUi4KKwkJIC0ge3BlZXJ9IHBvaW50cyB0byB0aGUgcGVlciBzdHJ1Y3R1cmUuCisJCSAtIHtvdGhlcn0gaXMgTlVMTC4KKwkJIC0ge3Blcm1zZ2RhdGF9IGlzIGFsd2F5cyBOVUxMIGZvciB0aGlzIGhvb2suCisJCSAqLworCQorCUhPT0tfTUVTU0FHRV9QQVJTSU5HX0VSUk9SMiwKKwkJLyogSG9vayBjYWxsZWQgYWZ0ZXIgYW4gZXJyb3IgbWVzc2FnZSBoYXMgYmVlbiBnZW5lcmF0ZWQgZHVlIHRvIGEgZGljdGlvbmFyeSBwYXJzaW5nIGVycm9yLgorCQkgLSB7bXNnfSBwb2ludHMgdG8gdGhlIGVycm9yIG1lc3NhZ2UgdGhhdCBoYXMgYmVlbiBnZW5lcmF0ZWQuCisJCSAtIHtwZWVyfSBpcyBOVUxMLiBZb3UgY2FuIHN0aWxsIHJldHJpZXZlIHRoZSBzb3VyY2UgZnJvbSB0aGUgbWVzc2FnZSBpdHNlbGYuCisJCSAtIHtvdGhlcn0gaXMgTlVMTAorCQkgLSB7cGVybXNnZGF0YX0gcG9pbnRzIHRvIGV4aXN0aW5nIHN0cnVjdHVyZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBtZXNzYWdlIChvciBuZXcgc3RydWN0dXJlIGlmIG5vIHByZXZpb3VzIGhvb2sgd2FzIHJlZ2lzdGVyZWQpLiAKKwkJIFVzZSB0aGlzIGhvb2sgaWYgeW91IG5lZWQgdG8gcG9wdWxhdGUgbW9yZSBkYXRhIGluIHRoZSBlcnJvciBiZWluZyByZXR1cm5lZCwgZnJvbSB0aGUgZXJyb3IgbWVzc2FnZS4gCisJCSAoZS5nLiBzb21lIEFWUCBuZWVkIHRvIGJlIGFkZGVkIHRvIHJlcGxpZXMgZXZlbiBpZiBlcnJvciBjYXNlLgorCQkgKi8KKyNkZWZpbmUgSE9PS19MQVNUCUhPT0tfTUVTU0FHRV9QQVJTSU5HX0VSUk9SMgorfTsKKworCisvKiBUeXBlIG9mIHRoZSB7cGVybXNnZGF0YX0gcG9pbnRlci4gSXQgaXMgdXAgdG8gZWFjaCBleHRlbnNpb24gdG8gZGVmaW5lIGl0cyBvd24gc3RydWN0dXJlLiBUaGlzIGlzIG9wYXF1ZSBmb3IgdGhlIGZyYW1ld29yay4gKi8KK3N0cnVjdCBmZF9ob29rX3Blcm1zZ2RhdGE7CisKKy8qIEEgaGFuZGxlIHRoYXQgd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIGV4dGVuc2lvbiwgYW5kIHdpdGggdGhlIHBlcm1zZ2RhdGEgc3RydWN0dXJlcy4gKi8KK3N0cnVjdCBmZF9ob29rX2RhdGFfaGRsOworCisvKiBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZSBpcyB3aGF0IGlzIHBhc3NlZCB0byB0aGUgSE9PS19EQVRBX1JFQ0VJVkVEIGhvb2sgKi8KK3N0cnVjdCBmZF9jbnhfcmN2ZGF0YSB7CisJc2l6ZV90ICBsZW5ndGg7CisJdWludDhfdCAqIGJ1ZmZlcjsgLyogaW50ZXJuYWwgbm90ZTogdGhlIGJ1ZmZlciBpcyBwYWRkZWQgd2l0aCBhIHN0cnVjdCBmZF9tc2dfcG1kbCwgbm90IGFjY291bnRlZCBmb3IgaW4gbGVuZ3RoICovCit9OworCisvKiBGdW5jdGlvbiB0byByZWdpc3RlciBhIG5ldyBmZF9ob29rX2RhdGFfaGRsLiBTaG91bGQgYmUgY2FsbGVkIGJ5IHlvdXIgZXh0ZW5zaW9uIGluaXQgZnVuY3Rpb24uCisgKiBUaGUgYXJndW1lbnRzIGFyZSB0aGUgZnVuY3Rpb25zIGNhbGxlZCB0byBpbml0aWFsaXplIGEgbmV3IGZkX2hvb2tfcGVybXNnZGF0YSBhbmQgdG8gZnJlZSB0aGlzIHN0cnVjdHVyZSB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIG1lc3NhZ2UgaXMgYmVpbmcgZnJlZWQuCisgKi8KKy8qCisgKiBGVU5DVElPTjoJZmRfaG9va19kYXRhX3JlZ2lzdGVyCisgKgorICogUEFSQU1FVEVSUzoKKyAqICBwZXJtc2dkYXRhX3NpemUgICAgIDogdGhlIHNpemUgb2YgdGhlIGZkX2hvb2tfcGVybXNnZGF0YSBzdHJ1Y3R1cmUuIAorICogIHBlcm1zZ2RhdGFfaW5pdF9jYiAgOiBmdW5jdGlvbiBjYWxsZWQgdG8gaW5pdGlhbGl6ZSBhIG5ldyBmZF9ob29rX3Blcm1zZ2RhdGEgc3RydWN0dXJlLCB3aGVuIGEgaG9vayB3aWxsIGJlIGNhbGxlZCBmb3IgYSBtZXNzYWdlIHRoYXQgZG9lcyBub3QgaGF2ZSBzdWNoIHN0cnVjdHVyZSB5ZXQuIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgbWVtb3J5IGlzIGFscmVhZHkgYWxsb2NhdGVkIGFuZCBibGFua2VkLCBzbyB5b3UgY2FuIHBhc3MgTlVMTCBpZiBubyBmdXJ0aGVyIGhhbmRsaW5nIGlzIHJlcXVpcmVkLgorICogIHBlcm1zZ2RhdGFfZmluaV9jYiAgOiBmdW5jdGlvbiBjYWxsZWQgd2hlbiBhIG1lc3NhZ2UgaXMgYmVpbmcgZGlzcG9zZWQuIEl0IHNob3VsZCBmcmVlIHRoZSByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBmZF9ob29rX3Blcm1zZ2RhdGEuIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBZb3UgY2FuIHBhc3MgTlVMTCBpZiBubyBzcGVjaWFsIGhhbmRsaW5nIGlzIHJlcXVpcmVkLiBUaGUgbWVtb3J5IG9mIHRoZSBwZXJtc2dkYXRhIHN0cnVjdHVyZSBpdHNlbGYgd2lsbCBiZSBmcmVlZCBieSB0aGUgZnJhbWV3b3JrLgorICogIG5ld19oYW5kbGUgICAgICAgICAgOiBPbiBzdWNjZXNzLCBhIGhhbmRsZXIgdG8gdGhlIHJlZ2lzdGVyZWQgY2FsbGJhY2sgaXMgc3RvcmVkIGhlcmUuIAorICoJCSAgICAgICAgICAgICBUaGlzIGhhbmRsZXIgd2lsbCBiZSB1c2VkIHRvIHVucmVnaXN0ZXIgdGhlIGNiLgorICoKKyAqIERFU0NSSVBUSU9OOiAKKyAqICAgUmVnaXN0ZXIgYSBuZXcgZmRfaG9va19kYXRhX2hkbC4gVGhpcyBoYW5kbGUgaXMgdXNlZCBkdXJpbmcgaG9va3MgcmVnaXN0cmF0aW9uIChzZWUgYmVsb3cpIGluIG9yZGVyIHRvIGFzc29jaWF0ZSBkYXRhIHdpdGggdGhlIG1lc3NhZ2VzLCB0byBhbGxvdyBrZWVwaW5nIHRyYWNraW5nIG9mIHRoZSBtZXNzYWdlIGVhc2lseS4KKyAqICBOb3RlIHRoYXQgdGhlc2UgaGFuZGxlcnMgYXJlIHN0YXRpY2FsbHkgYWxsb2NhdGVkIGFuZCBjYW5ub3QgYmUgdW5yZWdpc3RlcmVkLiBGRF9IT09LX0hBTkRMRV9MSU1JVCBoYW5kbGVycyBjYW4gYmUgcmVnaXN0ZXJlZCBhdCBtYXhpbXVtIChyZWNvbXBpbGUgbGliZmRwcm90byBpZiB5b3UgY2hhbmdlIHRoaXMgdmFsdWUpCisgKgorICogUkVUVVJOIFZBTFVFOgorICogIDAgICAgICAJOiBUaGUgY2FsbGJhY2sgaXMgcmVnaXN0ZXJlZC4KKyAqICBFSU5WQUwgCTogQSBwYXJhbWV0ZXIgaXMgaW52YWxpZC4KKyAqICBFTk9TUEMJOiBUb28gbWFueSBoYW5kbGVzIGFscmVhZHkgcmVnaXN0ZXJlZC4gWW91IG1heSBuZWVkIHRvIGluY3JlYXNlIHRoZSBsaW1pdCBpbiB0aGUgY29kZS4KKyAqLworaW50IGZkX2hvb2tfZGF0YV9yZWdpc3RlcigKKwlzaXplX3QgcGVybXNnZGF0YV9zaXplLAorCXZvaWQgKCpwZXJtc2dkYXRhX2luaXRfY2IpIChzdHJ1Y3QgZmRfaG9va19wZXJtc2dkYXRhICopLAorICAgICAgICB2b2lkICgqcGVybXNnZGF0YV9maW5pX2NiKSAoc3RydWN0IGZkX2hvb2tfcGVybXNnZGF0YSAqKSwKKyAgICAgICAgc3RydWN0IGZkX2hvb2tfZGF0YV9oZGwgKipuZXdfaGFuZGxlCispOworCisvKiBBIGhhbmRsZXIgYXNzb2NpYXRlZCB3aXRoIGEgcmVnaXN0ZXJlZCBob29rIGNhbGxiYWNrIChmb3IgY2xlYW51cCkgKi8KK3N0cnVjdCBmZF9ob29rX2hkbDsgCisKKy8qIEhlbHBlciBmb3IgYnVpbGRpbmcgYSBtYXNrIG9mIGhvb2tzIGZvciByZWdpc3RyYXRpb24gKi8KKyNkZWZpbmUgSE9PS19NQVNLKGhvb2tsaXN0Li4uKQlmZF9ob29rX21hc2tfaGVscGVyKDAsICMjIGhvb2tsaXN0LCAtMSkKKworLyoKKyAqIEZVTkNUSU9OOglmZF9ob29rX3JlZ2lzdGVyCisgKgorICogUEFSQU1FVEVSUzoKKyAqICB0eXBlX21hc2sJICA6IEEgYml0bWFzayBvZiBmZF9ob29rX3R5cGUgYml0cyBmb3Igd2hpY2ggdGhpcyBjYiBpcyByZWdpc3RlcmVkLCBlLmcuIEhPT0tfTUFTSyggSE9PS19NRVNTQUdFX1JFQ0VJVkVELCBIT09LX01FU1NBR0VfU0VOVCApCisgKiAgZmRfaG9va19jYgkgIDogVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIHJlZ2lzdGVyIChzZWUgcHJvdG90eXBlIGFib3ZlKS4KKyAqICByZWdkYXRhCSAgOiBQb2ludGVyIHRvIHBhc3MgdG8gdGhlIGNhbGxiYWNrIHdoZW4gaXQgaXMgY2FsbGVkLiBUaGUgZGF0YSBpcyBvcGFxdWUgdG8gdGhlIGRhZW1vbi4KKyAqICBkYXRhX2hkbCAgICAgIDogSWYgcGVybXNnZGF0YSBpcyByZXF1ZXN0ZWQgZm9yIHRoZSBob29rcywgYSBoYW5kbGVyIHJlZ2lzdGVyZWQgd2l0aCBmZF9ob29rX2RhdGFfcmVnaXN0ZXIuIE5VTEwgb3RoZXJ3aXNlLgorICogIGhhbmRsZXIgICAgICAgOiBPbiBzdWNjZXNzLCBhIGhhbmRsZXIgdG8gdGhlIHJlZ2lzdGVyZWQgY2FsbGJhY2sgaXMgc3RvcmVkIGhlcmUuIAorICoJCSAgIFRoaXMgaGFuZGxlciBjYW4gYmUgdXNlZCB0byB1bnJlZ2lzdGVyIHRoZSBjYi4KKyAqCisgKiBERVNDUklQVElPTjogCisgKiAgIFJlZ2lzdGVyIGEgbmV3IGhvb2sgaW4gdGhlIGZyYW1ld29yay4gU2VlIGV4cGxhbmF0aW9ucyBhYm92ZS4KKyAqCisgKiBSRVRVUk4gVkFMVUU6CisgKiAgMCAgICAgIAk6IFRoZSBjYWxsYmFjayBpcyByZWdpc3RlcmVkLgorICogIEVFWElTVCAgICAgIDogQW5vdGhlciBjYWxsYmFjayBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQgZm9yIHRoaXMgdHlwZSBvZiBob29rIChIT09LX0RBVEFfUkVDRUlWRUQpLgorICogIEVJTlZBTCAJOiBBIHBhcmFtZXRlciBpcyBpbnZhbGlkLgorICogIEVOT01FTQk6IE5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvbXBsZXRlIHRoZSBvcGVyYXRpb24KKyAqLworaW50IGZkX2hvb2tfcmVnaXN0ZXIgKCAgdWludDMyX3QgdHlwZV9tYXNrLCAKKwkJCXZvaWQgKCpmZF9ob29rX2NiKShlbnVtIGZkX2hvb2tfdHlwZSB0eXBlLCBzdHJ1Y3QgbXNnICogbXNnLCBzdHJ1Y3QgcGVlcl9oZHIgKiBwZWVyLCB2b2lkICogb3RoZXIsIHN0cnVjdCBmZF9ob29rX3Blcm1zZ2RhdGEgKnBtZCwgdm9pZCAqIHJlZ2RhdGEpLCAKKwkJCXZvaWQgICpyZWdkYXRhLCAKKwkJCXN0cnVjdCBmZF9ob29rX2RhdGFfaGRsICpkYXRhX2hkbCwKKwkJCXN0cnVjdCBmZF9ob29rX2hkbCAqKiBoYW5kbGVyICk7CisKKy8qIFJlbW92ZSBhIGhvb2sgcmVnaXN0cmF0aW9uICovCitpbnQgZmRfaG9va191bnJlZ2lzdGVyKCBzdHJ1Y3QgZmRfaG9va19oZGwgKiBoYW5kbGVyICk7CisKKworLyogVXNlIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gdG8gcmV0cmlldmUgYW55IHBtZCBzdHJ1Y3R1cmUgYXNzb2NpYXRlZCB3aXRoIGEgcmVxdWVzdCBtYXRjaGluZyB0aGUgY3VycmVudCBhbnN3ZXIuIFJldHVybnMgTlVMTCBpbiBjYXNlIG9mIGVycm9yIC8gbm8gc3VjaCBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBmZF9ob29rX3Blcm1zZ2RhdGEgKiBmZF9ob29rX2dldF9yZXF1ZXN0X3BtZChzdHJ1Y3QgZmRfaG9va19kYXRhX2hkbCAqZGF0YV9oZGwsIHN0cnVjdCBtc2cgKiBhbnN3ZXIpOworCisvKiBUaGUgZm9sbG93aW5nIGlzIHVzZWQgYnkgSE9PS19NQVNLIG1hY3JvICovCit1aW50MzJfdCBmZF9ob29rX21hc2tfaGVscGVyKGludCBkdW1teSwgLi4uKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKgorICogVGhlIGZvbGxvd2luZyBhbGxvd3MgYW4gZXh0ZW5zaW9uIHRvIHJldHJpZXZlIHN0YXQgaW5mb3JtYXRpb24gb24gdGhlIGRpZmZlcmVudCBmaWZvIHF1ZXVlcyBpbnZvbHZlZCBpbiB0aGUgZnJlZURpYW1ldGVyIGZyYW1ld29yay4KKyAqIFRoZXJlIGFyZSB0aHJlZSBnbG9iYWwgcXVldWVzLCBwbHVzIHBlci1wZWVyIHF1ZXVlcy4KKyAqIFRoaXMgaW5mb3JtYXRpb24gY2FuIGJlIHVzZWQgdG8gYnVpbGQgU05NUC1saWtlIGRhdGEgZm9yIGV4YW1wbGUsIG9yIHF1aWNrbHkgZ2V0IGEgc3RhdHVzIG9mIHRoZSBmcmFtZXdvcmsgdG8gZmluZCB0aGUgbG9hZGVkIHBhdGggb2YgZXhlY3V0aW9uIC8gYm90dGxlbmVja3MuCisgKi8KK2VudW0gZmRfc3RhdF90eXBlIHsKKwkvKiBGb3IgdGhlIGZvbGxvd2luZywgbm8gcGVlciBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIHN0YXQgKi8KKwlTVEFUX0dfTE9DQUw9IDEsCS8qIEdldCBzdGF0aXN0aWNzIGZvciB0aGUgZ2xvYmFsIHF1ZXVlIG9mIG1lc3NhZ2VzIHByb2Nlc3NlZCBieSBsb2NhbCBleHRlbnNpb25zICovCisJU1RBVF9HX0lOQ09NSU5HLAkvKiBHZXQgc3RhdGlzdGljcyBmb3IgdGhlIGdsb2JhbCBxdWV1ZSBvZiByZWNlaXZlZCBtZXNzYWdlcyB0byBiZSBwcm9jZXNzZWQgYnkgcm91dGluZ19pbiB0aHJlYWQgKi8KKwlTVEFUX0dfT1VUR09JTkcsCS8qIEdldCBzdGF0aXN0aWNzIGZvciB0aGUgZ2xvYmFsIHF1ZXVlIG9mIG1lc3NhZ2VzIHRvIGJlIHByb2Nlc3NlZCBieSByb3V0aW5nX291dCB0aHJlYWQgKi8KKwkKKwkvKiBGb3IgdGhlIGZvbGxvd2luZywgdGhlIHBlZXIgbXVzdCBiZSBwcm92aWRlZCAqLworCVNUQVRfUF9QU00sCQkvKiBQZWVyIHN0YXRlIG1hY2hpbmUgcXVldWUgKGV2ZW50cyB0byBiZSBwcm9jZXNzZWQgZm9yIHRoaXMgcGVlciwgaW5jbHVkaW5nIHJlY2VpdmVkIG1lc3NhZ2VzKSAqLworCVNUQVRfUF9UT1NFTkQsCQkvKiBRdWV1ZSBvZiBtZXNzYWdlcyBmb3Igc2VuZGluZyB0byB0aGlzIHBlZXIgKi8KK307CisKKy8qCisgKiBGVU5DVElPTjoJZmRfc3RhdF9nZXRzdGF0cworICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgc3RhdAkgIDogV2hpY2ggcXVldWUgaXMgYmVpbmcgcXVlcmllZAorICogIHBlZXIJICA6IChkZXBlbmRpbmcgb24gdGhlIHN0YXQgcGFyYW1ldGVyKSB3aGljaCBwZWVyIGlzIGJlaW5nIHF1ZXJpZWQKKyAqICBjdXJyZW50X2NvdW50IDogKG91dCkgVGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgcXVldWUgY3VycmVudGx5CisgKiAgbGltaXRfY291bnQgICA6IChvdXQpIFRoZSBtYXggbnVtYmVyIG9mIGl0ZW1zIHRoZSBxdWV1ZSBhY2NlcHRzIGJlZm9yZSBiZWNvbWluZyBibG9ja2luZyAtLSAwIG1lYW5zIG5vIG1heC4KKyAqICBoaWdoZXN0X2NvdW50IDogKG91dCkgVGhlIGhpZ2hlc3QgY291bnQgdGhlIHF1ZXVlIGhhcyByZWFjaGVkIHNpbmNlIHN0YXJ0dXAKKyAqICB0b3RhbF9jb3VudAkgIDogKG91dCkgVG90YWwgbnVtYmVyIG9mIGl0ZW1zIHRoYXQgdGhpcyBxdWV1ZSBoYXMgcHJvY2Vzc2VkIChhbHdheXMgZ3Jvd2luZywgdXNlIGRlbHRhcyBmb3IgbW9uaXRvcmluZykKKyAqICB0b3RhbAkgIDogKG91dCkgQ3VtdWxhdGVkIHRpbWUgYWxsIGl0ZW1zIHNwZW50IGluIHRoaXMgcXVldWUsIGluY2x1ZGluZyBibG9ja2luZyB0aW1lIChhbHdheXMgZ3Jvd2luZywgdXNlIGRlbHRhcyBmb3IgbW9uaXRvcmluZykKKyAqICBibG9ja2luZyAgICAgIDogKG91dCkgQ3VtdWxhdGVkIHRpbWUgdGhyZWFkcyB0cnlpbmcgdG8gcG9zdCBuZXcgaXRlbXMgd2VyZSBibG9ja2VkIChxdWV1ZSBmdWxsKS4KKyAqICBsYXN0ICAgICAgICAgIDogKG91dCkgRm9yIHRoZSBsYXN0IGVsZW1lbnQgcmV0cmlldmVkIGZyb20gdGhlIHF1ZXVlLCBob3cgbG9uZyBpdCB0b29rIGJldHdlZW4gcG9zdGluZyAoaW5jbHVkaW5nIGJsb2NraW5nKSBhbmQgcG9waW5nCisgKiAgCisgKiBERVNDUklQVElPTjogCisgKiAgIEdldCBzdGF0aXN0aWNzIGluZm9ybWF0aW9uIGFib3V0IGEgZ2l2ZW4gcXVldWUuIAorICogIEFueSBvZiB0aGUgKG91dCkgcGFyYW1ldGVycyBjYW4gYmUgTlVMTCBpZiBub3QgcmVxdWVzdGVkLgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqICAwICAgICAgCTogVGhlIGNhbGxiYWNrIGlzIHJlZ2lzdGVyZWQuCisgKiAgRUlOVkFMIAk6IEEgcGFyYW1ldGVyIGlzIGludmFsaWQuCisgKi8KK2ludCBmZF9zdGF0X2dldHN0YXRzKGVudW0gZmRfc3RhdF90eXBlIHN0YXQsIHN0cnVjdCBwZWVyX2hkciAqIHBlZXIsIAorCQkJaW50ICogY3VycmVudF9jb3VudCwgaW50ICogbGltaXRfY291bnQsIGludCAqIGhpZ2hlc3RfY291bnQsIGxvbmcgbG9uZyAqIHRvdGFsX2NvdW50LAorCQkJc3RydWN0IHRpbWVzcGVjICogdG90YWwsIHN0cnVjdCB0aW1lc3BlYyAqIGJsb2NraW5nLCBzdHJ1Y3QgdGltZXNwZWMgKiBsYXN0KTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogICAgICAgICAgICAgICAgICAgICAgICAgRU9GICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX0xJQkZEQ09SRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWVEaWFtZXRlci9saWJmZHByb3RvLmggYi9pbmNsdWRlL2ZyZWVEaWFtZXRlci9saWJmZHByb3RvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBkMDc0NAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZnJlZURpYW1ldGVyL2xpYmZkcHJvdG8uaApAQCAtMCwwICsxLDMyNTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDE1LCBXSURFIFByb2plY3QgYW5kIE5JQ1QJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFdJREUgUHJvamVjdCBvciBOSUNUIG5vciB0aGUgCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgV0lERSBQcm9qZWN0IGFuZCAJCQkJCQkgKgorKiAgIE5JQ1QuCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIFNfT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb25zIG9mIGZ1bmN0aW9ucyBhbmQgdHlwZXMgdXNlZCBieSB0aGUgbGliZnJlZURpYW1ldGVyIGxpYnJhcnkuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIG1lYW50IHRvIGJlIHVzZWQgYnkgYm90aCB0aGUgZnJlZURpYW1ldGVyIGRhZW1vbiBhbmQgaXRzIGV4dGVuc2lvbnMuCisgKiBJdCBwcm92aWRlcyB0aGUgdG9vbHMgdG8gbWFuaXB1bGF0ZSBEaWFtZXRlciBtZXNzYWdlcyBhbmQgcmVsYXRlZCBkYXRhLgorICogVGhpcyBmaWxlIHNob3VsZCBhbHdheXMgYmUgaW5jbHVkZWQgYXMgI2luY2x1ZGUgPGZyZWVEaWFtZXRlci9saWJmcmVlRGlhbWV0ZXIuaD4KKyAqCisgKiBJZiBhbnkgY2hhbmdlIGlzIG1hZGUgdG8gdGhpcyBmaWxlLCB5b3UgbXVzdCBpbmNyZW1lbnQgdGhlIEZEX1BST0pFQ1RfVkVSU0lPTl9BUEkgdmVyc2lvbi4KKyAqCisgKiBUaGUgZmlsZSBjb250YWlucyB0aGUgZm9sbG93aW5nIHBhcnRzOgorICoJREVCVUcKKyAqCU1BQ1JPUworICogICAgICBPQ1RFVCBTVFJJTkdTCisgKglUSFJFQURTCisgKglMSVNUUworICoJRElDVElPTkFSWQorICoJU0VTU0lPTlMKKyAqCU1FU1NBR0VTCisgKglESVNQQVRDSAorICoJUVVFVUVTCisgKi8KKworI2lmbmRlZiBfTElCRkRQUk9UT19ICisjZGVmaW5lIF9MSUJGRFBST1RPX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaWZuZGVmIEZEX0lTX0NPTkZJRworI2Vycm9yICJZb3UgbXVzdCBpbmNsdWRlICdmcmVlRGlhbWV0ZXItaG9zdC5oJyBiZWZvcmUgdGhpcyBmaWxlLiIKKyNlbmRpZiAvKiBGRF9JU19DT05GSUcgKi8KKworI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDxzY2hlZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpbmNsdWRlIDxsaWJnZW4uaD4JLyogZm9yIGJhc2VuYW1lICovCisKKyNpZmRlZiBTV0lHCisjZGVmaW5lIF9BVFRSSUJVVEVfUFJJTlRGTElLRV8oX2YsX3YpCisjZWxzZQorI2RlZmluZSBfQVRUUklCVVRFX1BSSU5URkxJS0VfKF9mLF92KSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIF9mLCBfdikpKQorI2VuZGlmIC8qIFNXSUcgKi8KKworLyogUmVtb3ZlIHNvbWUgZGVwcmVjYXRlZCB3YXJuaW5ncyBmcm9tIHNvbWUgZ251dGxzIHZlcnNpb25zLCB3aGVuIHBvc3NpYmxlICovCisjaWYgZGVmaW5lZChfX0dOVUNfXykKKyMgZGVmaW5lIEdDQ19ESUFHX0RPX1BSQUdNQSh4KSBfUHJhZ21hICgjeCkKKyMgZGVmaW5lIEdDQ19ESUFHX1BSQUdNQSh4KSBHQ0NfRElBR19ET19QUkFHTUEoR0NDIGRpYWdub3N0aWMgeCkKKyMgaWYgKChfX0dOVUNfXyAqIDEwMCkgKyBfX0dOVUNfTUlOT1JfXykgPj0gNDA2CQkvKiA0LjYueCAqLworIyAgZGVmaW5lIEdDQ19ESUFHX09GRih4KSBHQ0NfRElBR19QUkFHTUEocHVzaCkgXAorICAgICBHQ0NfRElBR19QUkFHTUEoaWdub3JlZCB4KQorIyAgZGVmaW5lIEdDQ19ESUFHX09OKHgpIEdDQ19ESUFHX1BSQUdNQShwb3ApCisjIGVsc2UJCQkJCQkJLyogb2xkZXIgKi8KKyMgIGRlZmluZSBHQ0NfRElBR19PRkYoeCkgR0NDX0RJQUdfUFJBR01BKGlnbm9yZWQgeCkKKyMgIGRlZmluZSBHQ0NfRElBR19PTih4KSAgR0NDX0RJQUdfUFJBR01BKHdhcm5pbmcgeCkKKyMgZW5kaWYKKyNlbHNlCisjIGRlZmluZSBHQ0NfRElBR19PRkYoeCkKKyMgZGVmaW5lIEdDQ19ESUFHX09OKHgpCisjZW5kaWYKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogICAgICAgICAgICAgICAgICAgICAgIENPTlNUQU5UUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIERJQU1FVEVSX1BPUlQJCTM4NjgKKyNkZWZpbmUgRElBTUVURVJfU0VDVVJFX1BPUlQJNTg2OAorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICBJTklUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBmaXJzdCwgYmVmb3JlIGFueSBjYWxsIHRvIGFub3RoZXIgbGlicmFyeSBmdW5jdGlvbiAqLworaW50IGZkX2xpYnByb3RvX2luaXQodm9pZCk7IC8qIG5vdGUgaWYgeW91IGFyZSB1c2luZyBsaWJmZGNvcmUsIGl0IGhhbmRsZXMgdGhpcyBhbHJlYWR5ICovCisKKy8qIENhbGwgdGhpcyBvbmUgd2hlbiB0aGUgYXBwbGljYXRpb24gdGVybWluYXRlcywgdG8gZGVzdHJveSBpbnRlcm5hbCB0aHJlYWRzICovCit2b2lkIGZkX2xpYnByb3RvX2Zpbmkodm9pZCk7CisKKy8qIFJldHJpZXZlIHRoZSB2ZXJzaW9uIG9mIHRoZSBiaW5hcnkgKi8KK2V4dGVybiBjb25zdCBjaGFyIGZkX2xpYnByb3RvX3ZlcnNpb25bXTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKy8qCisgKiBGVU5DVElPTjoJZmRfbG9nCisgKgorICogUEFSQU1FVEVSUzoKKyAqICBsb2dsZXZlbAk6IEludGVnZXIsIGhvdyBpbXBvcnRhbnQgdGhlIG1lc3NhZ2UgaXMuIFZhbGlkIHZhbHVlcyBhcmUgbWFjcm9zIEZEX0xPR18qCisgKiAgZm9ybWF0IAk6IFNhbWUgZm9ybWF0IHN0cmluZyBhcyBpbiB0aGUgcHJpbnRmIGZ1bmN0aW9uCisgKiAgLi4uCQk6IFNhbWUgbGlzdCBhcyBwcmludGYKKyAqCisgKiBERVNDUklQVElPTjogCisgKiBXcml0ZSBpbmZvcm1hdGlvbiB0byBsb2cuCisgKiBUaGUgZm9ybWF0IGFuZCBhcmd1bWVudHMgbWF5IGNvbnRhaW4gVVRGLTggZW5jb2RlZCBkYXRhLiBUaGUKKyAqIG91dHB1dCBtZWRpdW0gaXMgZXhwZWN0ZWQgdG8gc3VwcG9ydCB0aGlzIGVuY29kaW5nLgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqICBOb25lLgorICovCit2b2lkIGZkX2xvZyAoIGludCwgY29uc3QgY2hhciAqLCAuLi4gKSBfQVRUUklCVVRFX1BSSU5URkxJS0VfKDIsMyk7CisjaWZuZGVmIFNXSUcKK3ZvaWQgZmRfbG9nX3ZhKCBpbnQsIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCk7CisjZW5kaWYgLyogU1dJRyAqLworCisvKiB0aGVzZSBhcmUgaW50ZXJuYWwgb2JqZWN0cyBvZiB0aGUgZGVidWcgZmFjaWxpdHksIAorbWlnaHQgYmUgdXNlZnVsIHRvIGNvbnRyb2wgdGhlIGJlaGF2aW9yIGZyb20gb3V0c2lkZSAqLworZXh0ZXJuIHB0aHJlYWRfbXV0ZXhfdAlmZF9sb2dfbG9jazsKK2V4dGVybiBjaGFyICogZmRfZGVidWdfb25lX2Z1bmN0aW9uOworZXh0ZXJuIGNoYXIgKiBmZF9kZWJ1Z19vbmVfZmlsZTsKKworLyoKKyAqIEZVTkNUSU9OOglmZF9sb2dfdGhyZWFkbmFtZQorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgbmFtZSAJOiBcMC10ZXJtaW5hdGVkIHN0cmluZyBjb250YWluaW5nIGEgbmFtZSB0byBpZGVudGlmeSB0aGUgY3VycmVudCB0aHJlYWQuCisgKgorICogREVTQ1JJUFRJT046IAorICogIE5hbWUgdGhlIGN1cnJlbnQgdGhyZWFkLCB1c2VmdWwgZm9yIGRlYnVnZ2luZyBtdWx0aS10aHJlYWRlZCBwcm9ibGVtcy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBhIGdsb2JhbCB0aHJlYWQtc3BlY2lmaWMga2V5IGNhbGxlZCAiZmRfbG9nX3RobmFtZSIgZXhpc3RzCisgKiBpbiB0aGUgYWRkcmVzcyBzcGFjZSBvZiB0aGUgY3VycmVudCBwcm9jZXNzLgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqICBOb25lLgorICovCit2b2lkIGZkX2xvZ190aHJlYWRuYW1lICggY29uc3QgY2hhciAqIG5hbWUgKTsKK2V4dGVybiBwdGhyZWFkX2tleV90CWZkX2xvZ190aG5hbWU7CisKKy8qCisgKiBGVU5DVElPTjoJZmRfbG9nX3RpbWUKKyAqCisgKiBQQVJBTUVURVJTOgorICogIHRzCSAJOiBUaGUgdGltZXN0YW1wIHRvIGxvZywgb3IgTlVMTCBmb3IgIm5vdyIKKyAqICBidWYgCTogQW4gYXJyYXkgd2hlcmUgdGhlIHRpbWUgbXVzdCBiZSBzdG9yZWQKKyAqICBsZW4JCTogc2l6ZSBvZiB0aGUgYnVmZmVyCisgKiAgaW5jbF9kYXRlICAgOiBUaGUgZGF5IG9mIHllYXIgaXMgaW5jbHVkZWQgaW4gdGhlIG91dHB1dAorICogIGluY2xfbXMgICAgIDogbWlsbGlzZWNvbmQgdmFsdWUgaXMgaW5jbHVkZWQgaW4gdGhlIG91dHB1dAorICoKKyAqIERFU0NSSVBUSU9OOiAKKyAqICBXcml0ZXMgdGhlIHRpbWVzdGFtcCAoaW4gaHVtYW4gcmVhZGFibGUgZm9ybWF0KSBpbiBhIGJ1ZmZlci4gCisgKgorICogUkVUVVJOIFZBTFVFOgorICogIHBvaW50ZXIgdG8gYnVmLgorICovCitjaGFyICogZmRfbG9nX3RpbWUgKCBzdHJ1Y3QgdGltZXNwZWMgKiB0cywgY2hhciAqIGJ1Ziwgc2l6ZV90IGxlbiwgaW50IGluY2xfZGF0ZSwgaW50IGluY2xfbXMgKTsKKworLyoKKyAqIEZVTkNUSU9OOiAgICBmZF9sb2dfaGFuZGxlcl9yZWdpc3RlcgorICogTUFDUk86CisgKgorICogUEFSQU1FVEVSUzoKKyAqICBsb2dsZXZlbCAgICA6IHByaW9yaXR5IG9mIHRoZSBtZXNzYWdlCisgKiAgZm9ybWF0ICAgICAgOiBTYW1lIGZvcm1hdCBzdHJpbmcgYXMgaW4gdGhlIHByaW50ZiBmdW5jdGlvbgorICogIHZhX2xpc3QgICAgIDogQXJndW1lbnQgbGlzdAorICoKKyAqIERFU0NSSVBUSU9OOgorICogUmVnaXN0ZXIgYW4gZXh0ZXJuYWwgbWV0aG9kIGZvciBsb2dnaW5nIHB1cnBvc2VzLgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqIGludCAgICAgICAgICA6IFN1Y2Nlc3Mgb3IgZmFpbHVyZQorICovCitpbnQgZmRfbG9nX2hhbmRsZXJfcmVnaXN0ZXIgKCB2b2lkICgqbG9nZ2VyKShpbnQgbG9nbGV2ZWwsIGNvbnN0IGNoYXIgKiBmb3JtYXQsIHZhX2xpc3QgYXJncykgKTsKKworLyoKKyAqIEZVTkNUSU9OOiAgICBmZF9sb2dfaGFuZGxlcl91bnJlZ2lzdGVyCisgKiBNQUNSTzoKKyAqCisgKiBQQVJBTUVURVJTOgorICoKKyAqIERFU0NSSVBUSU9OOgorICogVW5yZWdpc3RlciB0aGUgZXh0ZXJuYWwgbG9nZ2luZyBmdW5jdGlvbi4KKyAqCisgKiBSRVRVUk4gVkFMVUU6CisgKiBpbnQgICAgICAgICAgOiBTdWNjZXNzIG9yIGZhaWx1cmUKKyAqLworaW50IGZkX2xvZ19oYW5kbGVyX3VucmVnaXN0ZXIgKCB2b2lkICk7CisKKworLyogQWxsIGR1bXAgZnVuY3Rpb25zIGZvbGxvdyB0aGlzIHNhbWUgcHJvdG90eXBlOgorICogUEFSQU1FVEVSUzoKKyAqICAgYnVmICAgOiAqYnVmIGNhbiBiZSBOVUxMIG9uIGVudHJ5LCBpdCB3aWxsIGJlIG1hbGxvYydkLiBPdGhlcndpc2UgaXQgaXMgcmVhbGxvYydkIGlmIG5lZWRlZC4KKyAqICAgbGVuICAgOiB0aGUgY3VycmVudCBzaXplIG9mIHRoZSBidWZmZXIgKGluL291dCkKKyAqICAgb2Zmc2V0OiAob3B0aW9uYWwpIGlmIHByb3ZpZGVkLCBzdGFydHMgd3JpdGluZyBkdW1wIGF0IG9mZnNldCBpbiB0aGUgYnVmZmVyLCBhbmQgdXBkYXRlZCB1cG9uIGV4aXQuIGlmIE5VTEwsIHN0YXJ0cyBhdCBvZmZzZXQgTy4KKyAqCisgKiBSRVRVUk4gVkFMVUU6CisgKiAgICpidWYgdXBvbiBzdWNjZXNzLCBOVUxMIHVwb24gZmFpbHVyZS4KKyAqCisgKiBSRU1BUktTOgorICogIC0gQWZ0ZXIgdGhlIGJ1ZmZlciBoYXMgYmVlbiB1c2VkLCBpdCBzaG91bGQgYmUgZnJlZWQuCisgKiAgLSBEZXBlbmRpbmcgb24gdGhlIGZ1bmN0aW9uLCB0aGUgY3JlYXRlZCBzdHJpbmcgbWF5IGJlIG11bHRpLWxpbmUuIEhvd2V2ZXIsIGl0IHNob3VsZCBuZXZlciBiZSB0ZXJtaW5hdGVkIHdpdGggYSAnXG4nLgorICovCisjZGVmaW5lIERFQ0xBUkVfRkRfRFVNUF9QUk9UT1RZUEUoIGZ1bmN0aW9uX25hbWUsIGFyZ3MuLi4gKQlcCisJY2hhciAqIGZ1bmN0aW9uX25hbWUoY2hhciAqKiBidWYsIHNpemVfdCAqbGVuLCBzaXplX3QgKm9mZnNldCwgIyNhcmdzKQorCisjaWZkZWYgU1dJRworI2RlZmluZSBERUNMQVJFX0ZEX0RVTVBfUFJPVE9UWVBFX3NpbXBsZSggZnVuY3Rpb25fbmFtZSApCVwKKwljaGFyICogZnVuY3Rpb25fbmFtZShjaGFyICoqIGJ1Ziwgc2l6ZV90ICpsZW4sIHNpemVfdCAqb2Zmc2V0KQorI2VuZGlmIC8qIFNXSUcgKi8KKwkKKworLyogSGVscGVyIGZ1bmN0aW9ucyBmb3IgdGhlICpkdW1wIGZ1bmN0aW9ucyB0aGF0IGFkZCBpbnRvIGEgYnVmZmVyICovCitERUNMQVJFX0ZEX0RVTVBfUFJPVE9UWVBFKCBmZF9kdW1wX2V4dGVuZCwgY29uc3QgY2hhciAqIGZvcm1hdCwgLi4uICkgX0FUVFJJQlVURV9QUklOVEZMSUtFXyg0LDUpOworREVDTEFSRV9GRF9EVU1QX1BST1RPVFlQRSggZmRfZHVtcF9leHRlbmRfaGV4ZHVtcCwgdWludDhfdCAqZGF0YSwgc2l6ZV90IGRhdGFsZW4sIHNpemVfdCB0cnVuYywgc2l6ZV90IHdyYXAgKTsKKworCisvKiBTb21lIGhlbHBlcnMgbWFjcm8gZm9yIHdyaXRpbmcgc3VjaCAqX2R1bXAgcm91dGluZSAqLworI2RlZmluZSBGRF9EVU1QX1NURF9QQVJBTVMgIGJ1ZiwgbGVuLCBvZmZzZXQKKyNkZWZpbmUgRkRfRFVNUF9IQU5ETEVfT0ZGU0VUKCkgIHNpemVfdCBvID0gMDsgaWYgKCFvZmZzZXQpIG9mZnNldCA9ICZvOyBpZiAoYnVmICYmICgqYnVmKSAmJiAhKCpvZmZzZXQpKSAqKmJ1Zj0nXDAnCisjZGVmaW5lIEZEX0RVTVBfSEFORExFX1RSQUlMKCkJd2hpbGUgKCgqYnVmKSAmJiAoKm9mZnNldCA+IDApICYmICgoKmJ1ZilbKm9mZnNldCAtIDFdID09ICdcbicpKSB7ICpvZmZzZXQgLT0gMTsgKCpidWYpWypvZmZzZXRdID0gJ1wwJzsgfQorCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogICAgICAgICAgICAgICAgICAgIERFQlVHIE1BQ1JPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjaWZuZGVmIEFTU0VSVAorI2RlZmluZSBBU1NFUlQoeCkgYXNzZXJ0KHgpCisjZW5kaWYgLyogQVNTRVJUICovCisKKy8qIGxvZyBsZXZlbHMgZGVmaW5pdGlvbnMsIHRoYXQgYXJlIHBhc3NlZCB0byB0aGUgbG9nZ2VyICovCisjZGVmaW5lIEZEX0xPR19BTk5PWUlORyAgMCAgLyogdmVyeSB2ZXJib3NlIGxvb3BzIGFuZCBzdWNoICJvdmVya2lsbCIgdHJhY2VzLiBPbmx5IGFjdGl2ZSB3aGVuIHRoZSBmcmFtZXdvcmsgaXMgY29tcGlsZWQgaW4gREVCVUcgbW9kZS4gKi8KKyNkZWZpbmUgRkRfTE9HX0RFQlVHICAgICAxICAvKiBHZXQgYSBkZXRhaWxlZCBzZW5zZSBvZiB3aGF0IGlzIGdvaW5nIG9uIGluIHRoZSBmcmFtZXdvcmsuIFVzZSB0aGlzIGxldmVsIGZvciBub3JtYWwgZGVidWcgKi8KKyNkZWZpbmUgRkRfTE9HX05PVElDRSAgICAzICAvKiBOb3JtYWwgZXhlY3V0aW9uIHN0YXRlcyB3b3J0aCBub3RpbmcgKi8KKyNkZWZpbmUgRkRfTE9HX0VSUk9SICAgICA1ICAvKiBSZWNvdmVyYWJsZSBvciBleHBlY3RlZCBlcnJvciBjb25kaXRpb25zICovCisjZGVmaW5lIEZEX0xPR19GQVRBTCAgICAgNiAgLyogVW5yZWNvdmVyYWJsZSBlcnJvciwgZS5nLiBtYWxsb2MgZmFpbCwgZXRjLiB0aGF0IHJlcXVpcmVzIHRoZSBmcmFtZXdvcmsgdG8gc2h1dGRvd24gKi8KKworLyogVGhlIGxldmVsIHVzZWQgYnkgdGhlIGRlZmF1bHQgbG9nZ2VyLCBjYW4gYmUgY2hhbmdlZCBieSBjb21tYW5kLWxpbmUgYXJndW1lbnRzLiBJZ25vcmVkIGZvciBvdGhlciBsb2dnZXJzLiAqLworZXh0ZXJuIGludCBmZF9nX2RlYnVnX2x2bDsKKworLyogU29tZSBwb3J0YWJpbGl0eSBjb2RlIHRvIGdldCBuaWNlIGZ1bmN0aW9uIG5hbWUgaW4gX19QUkVUVFlfRlVOQ1RJT05fXyAqLworI2lmICghZGVmaW5lZCggX19mdW5jX18pKSAmJiAoX19TVERDX1ZFUlNJT05fXyA8IDE5OTkwMUwpCisjIGlmIF9fR05VQ19fID49IDIKKyMgIGRlZmluZSBfX2Z1bmNfXyBfX0ZVTkNUSU9OX18KKyMgZWxzZSAvKiBfX0dOVUNfXyA+PSAyICovCisjICBkZWZpbmUgX19mdW5jX18gIjx1bmtub3duPiIKKyMgZW5kaWYgLyogX19HTlVDX18gPj0gMiAqLworI2VuZGlmIC8qKCFkZWZpbmVkKCBfX2Z1bmNfXykpICYmIChfX1NURENfVkVSU0lPTl9fIDwgMTk5OTAxTCkgKi8KKyNpZm5kZWYgX19QUkVUVFlfRlVOQ1RJT05fXworI2RlZmluZSBfX1BSRVRUWV9GVU5DVElPTl9fIF9fZnVuY19fCisjZW5kaWYgLyogX19QUkVUVFlfRlVOQ1RJT05fXyAqLworCisvKiBBIHZlcnNpb24gb2YgX19GSUxFX18gd2l0aG91dCB0aGUgZnVsbCBwYXRoLiBUaGlzIGlzIHNwZWNpZmljIHRvIGVhY2ggQyBmaWxlIGJlaW5nIGNvbXBpbGVkICovCitzdGF0aWMgY2hhciAqIGZpbGVfYm5hbWUgPSBOVUxMOworc3RhdGljIGNoYXIgKiBmaWxlX2JuYW1lX2luaXQoY2hhciAqIGZ1bGwpIHsgZmlsZV9ibmFtZSA9IGJhc2VuYW1lKGZ1bGwpOyByZXR1cm4gZmlsZV9ibmFtZTsgfQorI2RlZmluZSBfX1NUUklQUEVEX0ZJTEVfXwkoZmlsZV9ibmFtZSA/OiBmaWxlX2JuYW1lX2luaXQoKGNoYXIgKilfX0ZJTEVfXykpCisKKworCisvKiBJbiBERUJVRyBtb2RlLCB3ZSBhZGQgbWV0YS1pbmZvcm1hdGlvbiBhbG9uZyBlYWNoIHRyYWNlLiBUaGlzIG1ha2VzIG11bHRpLXRocmVhZGluZyBwcm9ibGVtcyBlYXNpZXIgdG8gZGVidWcuICovCisjaWYgKGRlZmluZWQoREVCVUcpICYmIGRlZmluZWQoREVCVUdfV0lUSF9NRVRBKSkKKyMgZGVmaW5lIFNURF9UUkFDRV9GTVRfU1RSSU5HICJwaWQ6JXMgaW4gJXNAJXM6JWQ6ICIKKyMgZGVmaW5lIFNURF9UUkFDRV9GTVRfQVJHUyAgICwgKChjaGFyICopcHRocmVhZF9nZXRzcGVjaWZpYyhmZF9sb2dfdGhuYW1lKSA/OiAidW5uYW1lZCIpLCBfX1BSRVRUWV9GVU5DVElPTl9fLCBfX1NUUklQUEVEX0ZJTEVfXywgX19MSU5FX18KKyNlbHNlIC8qIERFQlVHICYmIERFQlVHX1dJVEhfTUVUQSAqLworIyBkZWZpbmUgU1REX1RSQUNFX0ZNVF9TVFJJTkcgIiIKKyMgZGVmaW5lIFNURF9UUkFDRV9GTVRfQVJHUworI2VuZGlmIC8qIERFQlVHICYmIERFQlVHX1dJVEhfTUVUQSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKgorICBUaGUgZ2VuZXJhbCBkZWJ1ZyBtYWNybworICoqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIExPRyhwcmludGxldmVsLGZvcm1hdCxhcmdzLi4uICkgXAorCWZkX2xvZygocHJpbnRsZXZlbCksIFNURF9UUkFDRV9GTVRfU1RSSU5HIGZvcm1hdCBTVERfVFJBQ0VfRk1UX0FSR1MsICMjIGFyZ3MpCisKKy8qCisgKiBVc2UgdGhlIGZvbGxvd2luZyBtYWNyb3MgaW4gdGhlIGNvZGUgdG8gZ2V0IHRyYWNlcyB3aXRoIGxvY2F0aW9uICYgcGlkIGluIGRlYnVnIG1vZGU6IAorICovCisjaWZkZWYgREVCVUcKKyMgZGVmaW5lIExPR19BKGZvcm1hdCxhcmdzLi4uICkgXAorCQlkbyB7IGlmICgoZmRfZGVidWdfb25lX2Z1bmN0aW9uICYmICFzdHJjbXAoZmRfZGVidWdfb25lX2Z1bmN0aW9uLCBfX1BSRVRUWV9GVU5DVElPTl9fKSkgXAorCQkgfHwgKGZkX2RlYnVnX29uZV9maWxlICYmICFzdHJjbXAoZmRfZGVidWdfb25lX2ZpbGUsIF9fU1RSSVBQRURfRklMRV9fKSApICkgewkJXAorCQkgCUxPRyhGRF9MT0dfREVCVUcsIltEQkdfTUFUQ0hdICIgZm9ybWF0LCMjYXJncyk7CQkJCQlcCisJCX0gZWxzZSB7CQkJCQkJCQkJCVwKKwkJCUxPRyhGRF9MT0dfQU5OT1lJTkcsZm9ybWF0LCMjYXJncyk7CQkJCQkJXAorCQl9IH0gd2hpbGUgKDApCisjZWxzZSAvKiBERUJVRyAqLworIyBkZWZpbmUgTE9HX0EoZm9ybWF0LGFyZ3MuLi4gKSAvKiBub3QgZGVmaW5lZCBpbiByZWxlYXNlICovCisjZW5kaWYgLyogREVCVUcgKi8KKworLyogRGVidWcgaW5mb3JtYXRpb24gdXNlZnVsIHRvIGZvbGxvdyBpbiBkZXRhaWwgd2hhdCBpcyBnb2luZyBvbiAqLworI2RlZmluZSBMT0dfRChmb3JtYXQsYXJncy4uLiApIFwKKwkJTE9HKEZEX0xPR19ERUJVRywgZm9ybWF0LCAjI2FyZ3MpCisKKy8qIFJlcG9ydCBhIG5vcm1hbCBtZXNzYWdlIHRoYXQgaXMgdXNlZnVsIGZvciBub3JtYWwgYWRtaW4gbW9uaXRvcmluZyAqLworI2RlZmluZSBMT0dfTihmb3JtYXQsYXJncy4uLiApIFwKKwkJTE9HKEZEX0xPR19OT1RJQ0UsIGZvcm1hdCwjI2FyZ3MpCisKKy8qIFJlcG9ydCBhbiBlcnJvciAqLworI2RlZmluZSBMT0dfRShmb3JtYXQsYXJncy4uLiApIFwKKwkJTE9HKEZEX0xPR19FUlJPUiwgZm9ybWF0LCAjI2FyZ3MpCisKKy8qIFJlcG9ydCBhIGZhdGFsIGVycm9yICovCisjZGVmaW5lIExPR19GKGZvcm1hdCxhcmdzLi4uICkgXAorCQlMT0coRkRfTE9HX0ZBVEFMLCBmb3JtYXQsICMjYXJncykKKworCisvKioqKioqKioqKioqKgorIERlcml2YXRpdmVzCisgKioqKioqKioqKioqLworLyogVHJhY2UgYSBiaW5hcnkgYnVmZmVyIGNvbnRlbnQgKi8KKyNkZWZpbmUgTE9HX0JVRkZFUihwcmludGxldmVsLCBwcmVmaXgsIGJ1ZiwgYnVmc3osIHN1ZmZpeCApIHsJCQkJCQkJCVwKKwlpbnQgX19pOwkJCQkJCQkJCQkJCQlcCisJc2l6ZV90IF9fc3ogPSAoc2l6ZV90KShidWZzeik7CQkJCQkJCQkJCQlcCisJdWludDhfdCAqIF9fYnVmID0gKHVpbnQ4X3QgKikoYnVmKTsJCQkJCQkJCQkJXAorCWNoYXIgX19zdHJidWZbMTAyNCsxXTsJCQkJCQkJCQkJCQlcCisJZm9yIChfX2kgPSAwOyAoX19pIDwgX19zeikgJiYgKF9faTwoc2l6ZW9mKF9fc3RyYnVmKS8yKSk7IF9faSsrKSB7CQkJCQkJXAorCQlzcHJpbnRmKF9fc3RyYnVmICsgKDIgKiBfX2kpLCAiJTAyaGh4IiwgX19idWZbX19pXSk7ICAgICAJCQkJCQlcCisJfQkJCQkJCQkJCQkJCQkJXAorICAgICAgICBmZF9sb2cocHJpbnRsZXZlbCwgU1REX1RSQUNFX0ZNVF9TVFJJTkcgIiVzJXMlcyIgU1REX1RSQUNFX0ZNVF9BUkdTLCAgCQkJCQkJXAorICAgICAgICAgICAgICAgKHByZWZpeCksIF9fc3RyYnVmLCAoc3VmZml4KSk7CQkJCQkJCQkJCVwKK30KKworLyogU3BsaXQgYSBtdWx0aS1saW5lIGJ1ZmZlciBpbnRvIHNlcGFyYXRlIGNhbGxzIHRvIHRoZSBMT0cgZnVuY3Rpb24uICovCisjZGVmaW5lIExPR19TUExJVChwcmludGxldmVsLCBwZXJfbGluZV9wcmVmaXgsIG1sYnVmLCBwZXJfbGluZV9zdWZmaXggKSB7CQkJCQkJXAorCWNoYXIgKiBfX2xpbmUgPSAobWxidWYpLCAqX19uZXh0OwkJCQkJCQkJCQlcCisJY2hhciAqIF9fcCA9IChwZXJfbGluZV9wcmVmaXgpLCAqX19zID0gKHBlcl9saW5lX3N1ZmZpeCk7CQkJCQkJCVwKKwl3aGlsZSAoKF9fbmV4dCA9IHN0cmNocihfX2xpbmUsICdcbicpKSAhPSBOVUxMKSB7CQkJCQkJCQlcCisJCUxPRyhwcmludGxldmVsLCAiJXMlLipzJXMiLCBfX3AgPzoiIiwgKGludCkoX19uZXh0IC0gX19saW5lKSwgX19saW5lLCBfX3MgPzoiIik7CQkJXAorCQlfX2xpbmUgPSBfX25leHQgKyAxOwkJCQkJCQkJCQkJXAorCX0JCQkJCQkJCQkJCQkJCVwKKwlMT0cocHJpbnRsZXZlbCwgIiVzJXMlcyIsIF9fcCA/OiIiLCBfX2xpbmUsIF9fcyA/OiIiKTsJCQkJCQkJCVwKK30KKworLyogSGVscGVyIGZvciBmdW5jdGlvbiBlbnRyeSAtLSBmb3IgdmVyeSBkZXRhaWxlZCB0cmFjZSBvZiB0aGUgZXhlY3V0aW9uICovCisjZGVmaW5lIFRSQUNFX0VOVFJZKF9mb3JtYXQsX2FyZ3MuLi4gKSBcCisJCUxPR19BKCJbZW50ZXJdICVzKCIgX2Zvcm1hdCAiKSB7IiAjX2FyZ3MgIn0iLCBfX1BSRVRUWV9GVU5DVElPTl9fLCAjI19hcmdzICk7CisKKy8qIEhlbHBlciBmb3IgZGVidWdnaW5nIGJ5IGFkZGluZyB0cmFjZXMgLS0gZm9yIGRlYnVnaW5nIGEgc3BlY2lmaWMgbG9jYXRpb24gb2YgdGhlIGNvZGUgKi8KKyNkZWZpbmUgVFJBQ0VfSEVSRSgpCVwKKwkJTE9HX0YoIiAtLSBkZWJ1ZyBjaGVja3BvaW50ICVkIC0tICIsIGZkX2JyZWFraGVyZSgpKTsKK2ludCBmZF9icmVha2hlcmUodm9pZCk7CisKKy8qIEhlbHBlciBmb3IgdHJhY2luZyB0aGUgQ0hFQ0tfKiBtYWNyb3MgYmVsb3cgLS0gdmVyeSB2ZXJ5IHZlcmJvc2UgY29kZSBleGVjdXRpb24hICovCisjZGVmaW5lIFRSQUNFX0NBTEwoIHN0ci4uLiApIAlcCisJIAlMT0dfQSggc3RyICkKKworLyogRm9yIGRldmVsb3BtZW50IG9ubHksIHRvIGtlZXAgdHJhY2sgb2YgVE9ETyBsb2NhdGlvbnMgaW4gdGhlIGNvZGUgKi8KKyNpZm5kZWYgRVJST1JTX09OX1RPRE8KKyMgZGVmaW5lIFRPRE8oIF9tc2csIF9hcmdzLi4uICkgXAorCQlMT0dfRiggIlRPRE86ICIgX21zZyAsICMjX2FyZ3MpOworI2Vsc2UgLyogRVJST1JTX09OX1RPRE8gKi8KKyMgZGVmaW5lIFRPRE8oIF9tc2csIF9hcmdzLi4uICkgXAorCQkiVE9ETyIgPSBfbXNnICMjIF9hcmdzOyAvKiBqdXN0IGEgc3R1cGlkIGNvbXBpbGF0aW9uIGVycm9yIHRvIHNwb3QgdGhlIHRvZG8gKi8KKyNlbmRpZiAvKiBFUlJPUlNfT05fVE9ETyAqLworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qICAgICAgICAgICAgICAgICAgRVJST1IgQ0hFQ0tJTkcgTUFDUk8gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogTWFjcm9zIHRvIGNoZWNrIGEgcmV0dXJuIHZhbHVlIGFuZCBicmFuY2ggb3V0IGluIGNhc2Ugb2YgZXJyb3IuCisgKiBUaGVzZSBtYWNybyBhZGRpdGlvbmFsbHkgcHJvdmlkZSB0aGUgbG9nZ2luZyBpbmZvcm1hdGlvbi4KKyAqCisgKiBUaGUgbmFtZSAiX19yZXRfXyIgaXMgYWx3YXlzIGF2YWlsYWJsZSBpbiB0aGUgX19mYWxsYmFja19fIHBhcmFtZXRlciBhbmQgY29udGFpbnMgdGhlIGVycm9yIGNvZGUuCisgKi8KKyAKKyNkZWZpbmUgQ0hFQ0tfUFJFTFVERShfX2NhbGxfXykgCQkJXAorCQlpbnQgX19yZXRfXzsgCQkJCVwKKwkJVFJBQ0VfQ0FMTCgiQ2hlY2s6ICVzIiwgI19fY2FsbF9fICk7CVwKKwkJX19yZXRfXyA9IChfX2NhbGxfXykKKwkKKyNkZWZpbmUgREVGQVVMVF9GQglyZXR1cm4gX19yZXRfXzsKKworLyogU3lzdGVtIGNoZWNrOiBlcnJvciBjYXNlIGlmIDwgMCwgZXJyb3IgdmFsdWUgaW4gZXJybm8gKi8KKyNkZWZpbmUgQ0hFQ0tfU1lTX0dFTiggZmFpbGxldmVsLCBfX2NhbGxfXywgX19mYWxsYmFja19fICApIHsgCQkJCQkJXAorCQlDSEVDS19QUkVMVURFKF9fY2FsbF9fKTsJCQkJCQkJCVwKKwkJaWYgKF9fcmV0X18gPCAwKSB7CQkJCQkJCQkJXAorCQkJX19yZXRfXyA9IGVycm5vOwkJCQkJCQkJXAorCQkJTE9HKGZhaWxsZXZlbCwgIkVSUk9SOiBpbiAnJXMnIDpcdCVzIiwgICNfX2NhbGxfXyAsIHN0cmVycm9yKF9fcmV0X18pKTsgICAgCVwKKwkJCV9fZmFsbGJhY2tfXzsJCQkJCQkJCQlcCisJCX0JCQkJCQkJCQkJCVwKK30KKworCisvKiBDaGVjayB0aGUgcmV0dXJuIHZhbHVlIG9mIGEgZnVuY3Rpb24gYW5kIGV4ZWN1dGUgZmFsbGJhY2sgaW4gY2FzZSBvZiBlcnJvciBvciBzcGVjaWFsIHZhbHVlICovCisjZGVmaW5lIENIRUNLX0ZDVF9HRU4yKCBmYWlsbGV2ZWwsIF9fY2FsbF9fLCBfX3NwZXZhbF9fLCBfX2ZhbGxiYWNrMV9fLCBfX2ZhbGxiYWNrMl9fICkgewkJXAorCQlDSEVDS19QUkVMVURFKF9fY2FsbF9fKTsJCQkJCQkJCVwKKwkJaWYgKF9fcmV0X18gIT0gMCkgewkJCQkJCQkJCVwKKwkJCWlmIChfX3JldF9fID09IChfX3NwZXZhbF9fKSkgewkJCQkJCQlcCisJCQkJX19mYWxsYmFjazFfXzsJCQkJCQkJCVwKKwkJCX0gZWxzZSB7CQkJCQkJCQkJXAorCQkJCUxPRyhmYWlsbGV2ZWwsICJFUlJPUjogaW4gJyVzJyA6XHQlcyIsICNfX2NhbGxfXyAsIHN0cmVycm9yKF9fcmV0X18pKTsJXAorCQkJCV9fZmFsbGJhY2syX187CQkJCQkJCQlcCisJCQl9CQkJCQkJCQkJCVwKKwkJfQkJCQkJCQkJCQkJXAorfQorCisvKiBDaGVjayB0aGUgcmV0dXJuIHZhbHVlIG9mIGEgZnVuY3Rpb24gYW5kIGV4ZWN1dGUgZmFsbGJhY2sgaW4gY2FzZSBvZiBlcnJvciAocmV0dXJuIHZhbHVlIGRpZmZlcmVudCBmcm9tIDApICovCisjZGVmaW5lIENIRUNLX0ZDVF9HRU4oIGZhaWxsZXZlbCwgX19jYWxsX18sIF9fZmFsbGJhY2tfXykgXAorCSAgICAgICBDSEVDS19GQ1RfR0VOMiggZmFpbGxldmVsLCAoX19jYWxsX18pLCAwLCAsIChfX2ZhbGxiYWNrX18pICkKKworLyogQ2hlY2sgdGhhdCBhIG1lbW9yeSBhbGxvY2F0b3IgZGlkIG5vdCByZXR1cm4gTlVMTCwgb3RoZXJ3aXNlIGxvZyBhbiBlcnJvciBhbmQgZXhlY3V0ZSBmYWxsYmFjayAqLworI2RlZmluZSBDSEVDS19NQUxMT0NfR0VOKCBmYWlsbGV2ZWwsIF9fY2FsbF9fLCBfX2ZhbGxiYWNrX18gKSB7IAkJCQkgICAgICAgXAorCSAgICAgICB2b2lkICogIF9fcHRyX187IAkJCQkJCQkJICAgICAgIFwKKwkgICAgICAgVFJBQ0VfQ0FMTCgiQ2hlY2s6ICVzIiwgI19fY2FsbF9fICk7CQkJCQkJICAgICAgIFwKKwkgICAgICAgX19wdHJfXyA9ICh2b2lkICopKF9fY2FsbF9fKTsJCQkJCQkJICAgICAgIFwKKwkgICAgICAgaWYgKF9fcHRyX18gPT0gTlVMTCkgewkJCQkJCQkJICAgICAgIFwKKwkJICAgICAgIGludCBfX3JldF9fID0gZXJybm87CQkJCQkJCSAgICAgICBcCisJCSAgICAgICBMT0coZmFpbGxldmVsLCAiRVJST1I6IGluICclcycgOlx0JXMiLCAgI19fY2FsbF9fICwgc3RyZXJyb3IoX19yZXRfXykpOyAgICAgICAgIFwKKwkJICAgICAgIF9fZmFsbGJhY2tfXzsJCQkJCQkJCSAgICAgICBcCisJICAgICAgIH0JCQkJCQkJCQkJICAgICAgIFwKK30KKworLyogQ2hlY2sgcGFyYW1ldGVycyBhdCBmdW5jdGlvbiBlbnRyeSwgZXhlY3V0ZSBmYWxsYmFjayBvbiBlcnJvciAqLworI2RlZmluZSBDSEVDS19QQVJBTVNfR0VOKCBmYWlsbGV2ZWwsIF9fYm9vbF9fLCBfX2ZhbGxiYWNrX18gKSB7CQkJCQkgICAgICAgXAorCSAgICAgICBUUkFDRV9DQUxMKCJDaGVjazogJXMiLCAjX19ib29sX18gKTsJCQkJCQkgICAgICAgXAorCSAgICAgICBpZiAoICEgKF9fYm9vbF9fKSApIHsJCQkJCQkJCSAgICAgICBcCisJCSAgICAgICBpbnQgX19yZXRfXyA9IEVJTlZBTDsJCQkJCQkJICAgICAgIFwKKwkJICAgICAgIExPRyhmYWlsbGV2ZWwsICJFUlJPUjogaW52YWxpZCBwYXJhbWV0ZXIgJyVzJyIsICAjX19ib29sX18gKTsgIAkgICAgICAgCSAgICAgICBcCisJCSAgICAgICBfX2ZhbGxiYWNrX187CQkJCQkJCQkgICAgICAgXAorCSAgICAgICB9CQkJCQkJCQkJCSAgICAgICBcCit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogICAgICAgICAgQ09NUEFUSUJJTElUWSBNQUNST1MsIFRPIEJFIFJFTU9WRUQJCSAgICAgICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiBSZWRlZmluZSB0aGUgb2xkIG1hY3JvcyBmb3IgdHJhbnNpdGlvbiBvZiB0aGUgY29kZSAqLworI2lmbmRlZiBFWENMVURFX0RFUFJFQ0FURUQKKworI2RlZmluZSBNQVJLX0RFUFJFQ0FURUQJLyogX19hdHRyaWJ1dGVfXyAoKGRlcHJlY2F0ZWQpKSAqLworCitlbnVtIG9sZF9sZXZlbHMgeworCU5PTkUgPSAwLAorCUlORk8gPSAxLAorCUZVTEwgPSAyLAorCUFOTk9ZSU5HID0gNCwKKwlGQ1RTID0gNiwKKwlDQUxMID0gOQorfSBNQVJLX0RFUFJFQ0FURUQ7CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBvbGRfVFJBQ0VfQk9PTCggZW51bSBvbGRfbGV2ZWxzIGxldmVsLCBjb25zdCBjaGFyICogZmlsZSwgY29uc3QgY2hhciAqIGZ1bmMgKSBNQVJLX0RFUFJFQ0FURUQKK3sKKwlpZiAoKGZkX2RlYnVnX29uZV9mdW5jdGlvbiAmJiAhc3RyY21wKGZkX2RlYnVnX29uZV9mdW5jdGlvbiwgZnVuYykpCisJCXx8IChmZF9kZWJ1Z19vbmVfZmlsZSAmJiAhc3RyY21wKGZkX2RlYnVnX29uZV9maWxlLCBmaWxlKSApKQorCQlyZXR1cm4gMjsgLyogTGV2ZWwgb3ZlcnJpZGUgKi8KKwlpZiAoKGludClsZXZlbCA8PSBmZF9nX2RlYnVnX2x2bCkKKwkJcmV0dXJuIDE7IC8qIE5vcm1hbCBsZXZlbCAqLworCXJldHVybiAwOyAgLyogTm8gdHJhY2UgKi8KK30KKyNkZWZpbmUgVFJBQ0VfQk9PTChsZXZlbCkgIG9sZF9UUkFDRV9CT09MKChsZXZlbCksIF9fU1RSSVBQRURfRklMRV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fKQorCisjaWZuZGVmIFNXSUcKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgZmRfbG9nX2RlcHJlY2F0ZWQoIGludCBsZXZlbCwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4gKSBNQVJLX0RFUFJFQ0FURUQKK3sgCisJdmFfbGlzdCBhcDsKKwl2YV9zdGFydChhcCwgZm9ybWF0KTsKKwlmZF9sb2dfdmEobGV2ZWwsIGZvcm1hdCwgYXApOworCXZhX2VuZChhcCk7Cit9CisjZWxzZSAvKiBTV0lHICovCit2b2lkIGZkX2xvZ19kZXByZWNhdGVkKCBpbnQgbGV2ZWwsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uICk7CisjZW5kaWYgLyogU1dJRyAqLworc3RhdGljIF9faW5saW5lX18gdm9pZCByZXBsYWNlX21lKCkgTUFSS19ERVBSRUNBVEVEIHsgfQorCisjZGVmaW5lIFRSQUNFX0JVRkZFUiguLi4pIHJlcGxhY2VfbWUoKTsKKyNkZWZpbmUgVFJBQ0VfTk9USUNFKC4uLikgcmVwbGFjZV9tZSgpOworCisKKy8qIFVzZSB0aGUgTE9HXyogaW5zdGVhZCwgb3IgdXNlIHRoZSBuZXcgKl9kdW1wIGZ1bmN0aW9ucyB3aGVuIGR1bXBpbmcgYW4gb2JqZWN0ICovCisjZGVmaW5lIGZkX2xvZ19kZWJ1Zyhmb3JtYXQsYXJncy4uLikgIGZkX2xvZ19kZXByZWNhdGVkKEZEX0xPR19ERUJVRywgZm9ybWF0LCAjIyBhcmdzKQorI2RlZmluZSBmZF9sb2dfbm90aWNlKGZvcm1hdCxhcmdzLi4uKSBmZF9sb2dfZGVwcmVjYXRlZChGRF9MT0dfTk9USUNFLCBmb3JtYXQsICMjIGFyZ3MpCisjZGVmaW5lIGZkX2xvZ19lcnJvcihmb3JtYXQsYXJncy4uLikgIGZkX2xvZ19kZXByZWNhdGVkKEZEX0xPR19FUlJPUiwgZm9ybWF0LCAjIyBhcmdzKQorCisvKiBvbGQgbWFjcm8gZm9yIHRyYWNlcy4gVG8gYmUgcmVwbGFjZWQgYnkgYXBwcm9wcmlhdGUgTE9HXyogbWFjcm9zLiAqLworIyBkZWZpbmUgVFJBQ0VfREVCVUcob2xkbGV2ZWwsIGZvcm1hdCxhcmdzLi4uICkgewkJCQkJXAorCQlpbnQgX19sX187CQkJCQkJCQlcCisJCWlmICgoX19sX18gPSBUUkFDRV9CT09MKG9sZGxldmVsKSkpIHsJCQkJCVwKKwkJCWlmICAgICAgKG9sZGxldmVsIDw9IE5PTkUpIHsgTE9HX0UoZm9ybWF0LCMjYXJncyk7IH0JCVwKKwkJCWVsc2UgaWYgKG9sZGxldmVsIDw9IElORk8pIHsgTE9HX04oZm9ybWF0LCMjYXJncyk7IH0JCVwKKwkJCWVsc2UgaWYgKF9fbF9fID09IDIpICAgICAgIHsgTE9HX04oZm9ybWF0LCMjYXJncyk7IH0JCVwKKwkJCWVsc2UgaWYgKG9sZGxldmVsIDw9IEZVTEwpIHsgTE9HX0QoZm9ybWF0LCMjYXJncyk7IH0JCVwKKwkJCWVsc2UgICAgICAgICAgICAgICAgICAgICAgIHsgTE9HX0EoZm9ybWF0LCMjYXJncyk7IH0JCVwKK30JCX0KKworLyogdGhlIGZvbGxvd2luZyBtYWNybyBtdXN0IGJlIHJlcGxhY2VkIHdpdGggTE9HX0Ugb3IgTE9HX0YgKi8KKyMgZGVmaW5lIFRSQUNFX0VSUk9SCUxPR19FCisKKworLyogVGhlIGZvbGxvd2luZyBtYWNyb3MgYXJlIG1pc3NpbmcgdGhlIGZhaWxsZXZlbCBpbmZvcm1hdGlvbiwgd2hpY2ggaW5kaWNhdGVzIGF0IHdoYXQgbG9nIGxldmVsIHRoZSBlcnJvciBjYXNlIHNob3VsZCBiZSBkaXNwbGF5ZWQuICovCisjIGRlZmluZSBDSEVDS19TWVNfRE8oIF9fY2FsbF9fLCBfX2ZhbGxiYWNrX18gICkgeyAJCQkJCQkJXAorCQlDSEVDS19QUkVMVURFKF9fY2FsbF9fKTsJCQkJCQkJCVwKKwkJaWYgKF9fcmV0X18gPCAwKSB7CQkJCQkJCQkJXAorCQkJX19yZXRfXyA9IGVycm5vOwkJCQkJCQkJXAorCQkJVFJBQ0VfRVJST1IoIkVSUk9SOiBpbiAnJXMnIDpcdCVzIiwgICNfX2NhbGxfXyAsIHN0cmVycm9yKF9fcmV0X18pKTsgICAgCVwKKwkJCV9fZmFsbGJhY2tfXzsJCQkJCQkJCQlcCisJCX0JCQkJCQkJCQkJCVwKK30KKworIyBkZWZpbmUgQ0hFQ0tfU1lTKCBfX2NhbGxfXyAgKSBcCisJCUNIRUNLX1NZU19ETyggKF9fY2FsbF9fKSwgcmV0dXJuIF9fcmV0X18gICkKKworCisjIGRlZmluZSBDSEVDS19QT1NJWF9ETzIoIF9fY2FsbF9fLCBfX3NwZXZhbF9fLCBfX2ZhbGxiYWNrMV9fLCBfX2ZhbGxiYWNrMl9fICkgewkJCVwKKwkJQ0hFQ0tfUFJFTFVERShfX2NhbGxfXyk7CQkJCQkJCQlcCisJCWlmIChfX3JldF9fICE9IDApIHsJCQkJCQkJCQlcCisJCQlpZiAoX19yZXRfXyA9PSAoX19zcGV2YWxfXykpIHsJCQkJCQkJXAorCQkJCV9fZmFsbGJhY2sxX187CQkJCQkJCQlcCisJCQl9IGVsc2UgewkJCQkJCQkJCVwKKwkJCQlUUkFDRV9FUlJPUigiRVJST1I6IGluICclcycgOlx0JXMiLCAjX19jYWxsX18gLCBzdHJlcnJvcihfX3JldF9fKSk7CVwKKwkJCQlfX2ZhbGxiYWNrMl9fOwkJCQkJCQkJXAorCQkJfQkJCQkJCQkJCQlcCisJCX0JCQkJCQkJCQkJCVwKK30KKworIyBkZWZpbmUgQ0hFQ0tfUE9TSVhfRE8oIF9fY2FsbF9fLCBfX2ZhbGxiYWNrX18gKQlcCisJCUNIRUNLX1BPU0lYX0RPMiggKF9fY2FsbF9fKSwgMCwgLCBfX2ZhbGxiYWNrX18gKQorCisjIGRlZmluZSBDSEVDS19QT1NJWCggX19jYWxsX18gKQlcCisJCUNIRUNLX1BPU0lYX0RPKCAoX19jYWxsX18pLCByZXR1cm4gX19yZXRfXyApCisJCQorIyBkZWZpbmUgQ0hFQ0tfTUFMTE9DX0RPKCBfX2NhbGxfXywgX19mYWxsYmFja19fICkgeyAJCQkJICAgCQkgICAgICAgXAorCSAgICAgICB2b2lkICogIF9fcHRyX187IAkJCQkJCQkJICAgICAgIFwKKwkgICAgICAgVFJBQ0VfQ0FMTCgiQ2hlY2s6ICVzIiwgI19fY2FsbF9fICk7CQkJCQkJICAgICAgIFwKKwkgICAgICAgX19wdHJfXyA9ICh2b2lkICopKF9fY2FsbF9fKTsJCQkJCQkJICAgICAgIFwKKwkgICAgICAgaWYgKF9fcHRyX18gPT0gTlVMTCkgewkJCQkJCQkJICAgICAgIFwKKwkJICAgICAgIGludCBfX3JldF9fID0gZXJybm87CQkJCQkJCSAgICAgICBcCisJCSAgICAgIFRSQUNFX0VSUk9SKCJFUlJPUjogaW4gJyVzJyA6XHQlcyIsICAjX19jYWxsX18gLCBzdHJlcnJvcihfX3JldF9fKSk7ICAgICAgICAgICAgIFwKKwkJICAgICAgIF9fZmFsbGJhY2tfXzsJCQkJCQkJCSAgICAgICBcCisJICAgICAgIH0JCQkJCQkJCQkJICAgICAgIFwKK30KKworIyBkZWZpbmUgQ0hFQ0tfTUFMTE9DKCBfX2NhbGxfXyApCVwKKwkJQ0hFQ0tfTUFMTE9DX0RPKCAoX19jYWxsX18pLCByZXR1cm4gX19yZXRfXyApCisJCisjIGRlZmluZSBDSEVDS19QQVJBTVNfRE8oIF9fYm9vbF9fLCBfX2ZhbGxiYWNrX18gKSB7CQkJCQkgICAgICAgCSAgICAgICBcCisJICAgICAgIFRSQUNFX0NBTEwoIkNoZWNrOiAlcyIsICNfX2Jvb2xfXyApOwkJCQkJCSAgICAgICBcCisJICAgICAgIGlmICggISAoX19ib29sX18pICkgewkJCQkJCQkJICAgICAgIFwKKwkJICAgICAgIGludCBfX3JldF9fID0gRUlOVkFMOwkJCQkJCQkgICAgICAgXAorCQkgICAgICAgVFJBQ0VfRVJST1IoIkVSUk9SOiBJbnZhbGlkIHBhcmFtZXRlciAnJXMnLCAlZCIsICAjX19ib29sX18sIF9fcmV0X18gKTsgICAgICAgICBcCisJCSAgICAgICBfX2ZhbGxiYWNrX187CQkJCQkJCQkgICAgICAgXAorCSAgICAgICB9CQkJCQkJCQkJCSAgICAgICBcCit9CisKKyMgZGVmaW5lIENIRUNLX1BBUkFNUyggX19ib29sX18gKQlcCisJCUNIRUNLX1BBUkFNU19ETyggKF9fYm9vbF9fKSwgcmV0dXJuIF9fcmV0X18gKQorCisjIGRlZmluZSBDSEVDS19GQ1RfRE8JQ0hFQ0tfUE9TSVhfRE8KKyMgZGVmaW5lIENIRUNLX0ZDVAlDSEVDS19QT1NJWAorCisjZW5kaWYgLyogRVhDTFVERV9ERVBSRUNBVEVEICovCisJICAgICAgIAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKglPcHRpbWl6ZWQgY29kZTogcmVtb3ZlIGFsbCBkZWJ1Z2dpbmcgY29kZQkgICAgICAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2lmZGVmIFNUUklQX0RFQlVHX0NPREUKKyN1bmRlZiBMT0dfRAorI3VuZGVmIExPR19OCisjdW5kZWYgTE9HX0UKKyN1bmRlZiBMT0dfRgorI3VuZGVmIExPR19CVUZGRVIKKworI2RlZmluZSBMT0dfRChmb3JtYXQsYXJncy4uLiApIC8qIG5vb3AgKi8KKyNkZWZpbmUgTE9HX04oZm9ybWF0LGFyZ3MuLi4pIGZkX2xvZyhGRF9MT0dfTk9USUNFLCBmb3JtYXQsICMjIGFyZ3MpCisjZGVmaW5lIExPR19FKGZvcm1hdCxhcmdzLi4uKSBmZF9sb2coRkRfTE9HX0VSUk9SLCBmb3JtYXQsICMjIGFyZ3MpCisjZGVmaW5lIExPR19GKGZvcm1hdCxhcmdzLi4uKSBmZF9sb2coRkRfTE9HX0ZBVEFMLCBmb3JtYXQsICMjIGFyZ3MpCisjZGVmaW5lIExPR19CVUZGRVIocHJpbnRsZXZlbCwgbGV2ZWwsIHByZWZpeCwgYnVmLCBidWZzeiwgc3VmZml4ICkgewkJCQkJCQkJXAorCWlmIChwcmludGxldmVsID4gRkRfTE9HX0RFQlVHKSB7CQkJCQkJCQkJCQlcCisJCWludCBfX2k7CQkJCQkJCQkJCQkJCVwKKwkJc2l6ZV90IF9fc3ogPSAoc2l6ZV90KShidWZzeik7CQkJCQkJCQkJCQlcCisJCXVpbnQ4X3QgKiBfX2J1ZiA9ICh1aW50OF90ICopKGJ1Zik7CQkJCQkJCQkJCVwKKwkJY2hhciAqIF9fc3RyYnVmWzEwMjQrMV07CQkJCQkJCQkJCQlcCisJCWZvciAoX19pID0gMDsgKF9faSA8IF9fc3opICYmIChfX2k8KHNpemVvZihfX3N0cmJ1ZikvMik7IF9faSsrKSB7CQkJCQkJXAorCQkJc3ByaW50ZihfX3N0cmJ1ZiArICgyICogX19pKSwgIiUwMi4yaGh4IiwgX19idWZbX19pXSk7ICAgICAJCQkJCQlcCisJCX0JCQkJCQkJCQkJCQkJCVwKKyAgICAgICAgICAgICAgICBmZF9sb2cocHJpbnRsZXZlbCwgcHJlZml4IiVzInN1ZmZpeCwgX19zdHJidWYpOwkJCQkJCQkJCVwKKwl9CisjZW5kaWYgLyogU1RSSVBfREVCVUdfQ09ERSAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKgkJICAgIE9USEVSIE1BQ1JPUwkJCSAgICAgICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiBoZWxwZXIgbWFjcm9zIChwcmUtcHJvY2Vzc29yIGhhY2tzIHRvIGFsbG93IG1hY3JvIGFyZ3VtZW50cykgKi8KKyNkZWZpbmUgX190b3N0ciggYXJnICkgICNhcmcKKyNkZWZpbmUgX3N0cmluZ2l6ZSggYXJnICkgX190b3N0ciggYXJnICkKKyNkZWZpbmUgX19hZ3IoIGFyZzEsIGFyZzIgKSBhcmcxICMjIGFyZzIKKyNkZWZpbmUgX2FnZ3JlZ2F0ZSggYXJnMSwgYXJnMiApIF9fYWdyKCBhcmcxLCBhcmcyICkKKworLyogU29tZSBhbGlhc2VzIHRvIHNvY2tldCBhZGRyZXNzZXMgc3RydWN0dXJlcyAqLworI2RlZmluZSBzU1MJc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UKKyNkZWZpbmUgc1NBCXN0cnVjdCBzb2NrYWRkcgorI2RlZmluZSBzU0E0CXN0cnVjdCBzb2NrYWRkcl9pbgorI2RlZmluZSBzU0E2CXN0cnVjdCBzb2NrYWRkcl9pbjYKKworLyogVGhlIHNvY2thZGRyIGxlbmd0aCBvZiBhIHNTUyBzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUgc1NBbGVuKCBfc2FfICkJXAorCSggKHNvY2tsZW5fdCkgKCAoKChzU0EgKilfc2FfKS0+c2FfZmFtaWx5ID09IEFGX0lORVQpID8gKHNpemVvZihzU0E0KSkgOgkJXAorCQkJCSgoKChzU0EgKilfc2FfKS0+c2FfZmFtaWx5ID09IEFGX0lORVQ2KSA/IChzaXplb2Yoc1NBNikpIDoJXAorCQkJCQkwICkgKSApCisjZGVmaW5lIHNTQXBvcnQoIF9zYV8gKQlcCisJKCAoc29ja2xlbl90KSAoICgoKHNTQSAqKV9zYV8pLT5zYV9mYW1pbHkgPT0gQUZfSU5FVCkgPyAoKChzU0E0ICopKF9zYV8pKS0+c2luX3BvcnQpIDoJCVwKKwkJCQkoKCgoc1NBICopX3NhXyktPnNhX2ZhbWlseSA9PSBBRl9JTkVUNikgPyAoKChzU0E2ICopKF9zYV8pKS0+c2luNl9wb3J0KSA6CVwKKwkJCQkJMCApICkgKQorCitERUNMQVJFX0ZEX0RVTVBfUFJPVE9UWVBFKGZkX3NhX2R1bXAsIHNTQSAqIHNhLCBpbnQgZmxhZ3MpOworI2RlZmluZSBzU0FfRFVNUF9TVFJMRU4JKElORVQ2X0FERFJTVFJMRU4gKyAxICsgMzIgKyAyKQordm9pZCBmZF9zYV9zZHVtcF9udW1lcmljKGNoYXIgKiBidWYgLyogbXVzdCBiZSBhdCBsZWFzdCBzU0FfRFVNUF9TVFJMRU4gKi8sIHNTQSAqIHNhKTsKKworCisvKiBBIGw0IHByb3RvY29sIG5hbWUgKFRDUCAvIFNDVFApICovCisjaWZkZWYgRElTQUJMRV9TQ1RQCisjZGVmaW5lIElQUFJPVE9fTkFNRSggX3Byb3RvICkJCQkJCVwKKwkoKChfcHJvdG8pID09IElQUFJPVE9fVENQKSA/ICJUQ1AiIDoJCQlcCisJCQkiVW5rbm93biIpCisjZWxzZSAvKiBESVNBQkxFX1NDVFAgKi8KKyNkZWZpbmUgSVBQUk9UT19OQU1FKCBfcHJvdG8gKQkJCQkJXAorCSggKChfcHJvdG8pID09IElQUFJPVE9fVENQKSA/ICJUQ1AiIDoJCQlcCisJCSgoKF9wcm90bykgPT0gSVBQUk9UT19TQ1RQKSA/ICJTQ1RQIiA6CQlcCisJCQkiVW5rbm93biIpKQorI2VuZGlmIC8qIERJU0FCTEVfU0NUUCAqLworCisvKiBEZWZpbmUgdGhlIHZhbHVlIG9mIElQIGxvb3BiYWNrIGFkZHJlc3MgKi8KKyNpZm5kZWYgSU5BRERSX0xPT1BCQUNLIAorI2RlZmluZSBJTkFERFJfTE9PUEJBQ0sJaW5ldF9hZGRyKCIxMjcuMC4wLjEiKQorI2VuZGlmIC8qIElOQUREUl9MT09QQkFDSyAqLworCisjaWZuZGVmIElOQUREUl9CUk9BRENBU1QKKyNkZWZpbmUJSU5BRERSX0JST0FEQ0FTVAkoKGluX2FkZHJfdCkgMHhmZmZmZmZmZikKKyNlbmRpZiAvKiBJTkFERFJfQlJPQURDQVNUICovCisKKy8qIEFuIElQIGVxdWl2YWxlbnQgdG8gSU42X0lTX0FERFJfTE9PUEJBQ0sgKi8KKyNpZm5kZWYgSU5fSVNfQUREUl9MT09QQkFDSworI2RlZmluZSBJTl9JU19BRERSX0xPT1BCQUNLKGEpIFwKKyAgKCgoKGxvbmcgaW50KSAoYSktPnNfYWRkcikgJiBudG9obCgweGZmMDAwMDAwKSkgPT0gbnRvaGwoMHg3ZjAwMDAwMCkpCisjZW5kaWYgLyogSU5fSVNfQUREUl9MT09QQkFDSyAqLworCisvKiBBbiBJUCBlcXVpdmFsZW50IHRvIElONl9JU19BRERSX1VOU1BFQ0lGSUVEICovCisjaWZuZGVmIElOX0lTX0FERFJfVU5TUEVDSUZJRUQKKyNkZWZpbmUgSU5fSVNfQUREUl9VTlNQRUNJRklFRChhKSBcCisgICgoKGxvbmcgaW50KSAoYSktPnNfYWRkcikgPT0gMHgwMDAwMDAwMCkKKyNlbmRpZiAvKiBJTl9JU19BRERSX1VOU1BFQ0lGSUVEICovCisKKy8qIGNyZWF0ZSBhIFY0TUFQUEVEIGFkZHJlc3MgKi8KKyNkZWZpbmUgSU42X0FERFJfVjRNQVAoIGE2LCBhNCApIHsJCQlcCisJKCh1aW50MzJfdCAqKShhNikpWzBdID0gMDsJCQlcCisJKCh1aW50MzJfdCAqKShhNikpWzFdID0gMDsJCQlcCisJKCh1aW50MzJfdCAqKShhNikpWzJdID0gaHRvbmwoMHhmZmZmKTsJCVwKKwkoKHVpbnQzMl90ICopKGE2KSlbM10gPSAodWludDMyX3QpKGE0KTsJCVwKK30KKworLyogUmV0cmlldmUgYSB2NCB2YWx1ZSBmcm9tIFY0TUFQUEVEIGFkZHJlc3MgKCB0YWtlcyBhIHM2X2FkZHIgYXMgcGFyYW0pICovCisjZGVmaW5lIElONl9BRERSX1Y0VU5NQVAoIGE2ICkgCQkJCVwKKwkoKChpbl9hZGRyX3QgKikoYTYpKVszXSkKKworCisvKiBXZSBwcm92aWRlIG1hY3JvcyB0byBjb252ZXJ0IDY0IGJpdCB2YWx1ZXMgdG8gYW5kIGZyb20gbmV0d29yayBieXRlLW9yZGVyLCBvbiBzeXN0ZW1zIHdoZXJlIGl0IGlzIG5vdCBhbHJlYWR5IHByb3ZpZGVkLiAqLworI2lmbmRlZiBIQVZFX05UT0hMTAkvKiBEZWZpbmVkIGJ5IHRoZSBjbWFrZSBzdGVwLCBpZiB0aGUgbnRvaGxsIHN5bWJvbCBpcyBkZWZpbmVkIG9uIHRoZSBzeXN0ZW0gKi8KKyMgaWYgSE9TVF9CSUdfRU5ESUFOCisgICAgLyogSW4gYmlnLWVuZGlhbiBzeXN0ZW1zLCB3ZSBkb24ndCBoYXZlIHRvIGNoYW5nZSB0aGUgdmFsdWVzLCBzaW5jZSB0aGUgb3JkZXIgaXMgdGhlIHNhbWUgYXMgbmV0d29yayAqLworIyAgIGRlZmluZSBudG9obGwoeCkgKHgpCisjICAgZGVmaW5lIGh0b25sbCh4KSAoeCkKKyMgZWxzZSAvKiBIT1NUX0JJR19FTkRJQU4gKi8KKyAgICAvKiBGb3IgdGhlc2Ugc3lzdGVtcywgd2UgbXVzdCByZXZlcnNlIHRoZSBieXRlcy4gVXNlIG50b2hsIGFuZCBodG9ubCBvbiBzdWItMzIgYmxvY3MsIGFuZCBpbnZlcnNlIHRoZXNlIGJsb2NzLiAqLworIyAgIGRlZmluZSBudG9obGwoeCkgKHR5cGVvZiAoeCkpKCAoKCh1aW50NjRfdCludG9obCggKHVpbnQzMl90KSh4KSkpIDw8IDMyICkgfCAoKHVpbnQ2NF90KSBudG9obCggKCh1aW50NjRfdCkoeCkpID4+IDMyICkpKSAKKyMgICBkZWZpbmUgaHRvbmxsKHgpICh0eXBlb2YgKHgpKSggKCgodWludDY0X3QpaHRvbmwoICh1aW50MzJfdCkoeCkpKSA8PCAzMiApIHwgKCh1aW50NjRfdCkgaHRvbmwoICgodWludDY0X3QpKHgpKSA+PiAzMiApKSkgCisjIGVuZGlmIC8qIEhPU1RfQklHX0VORElBTiAqLworI2VuZGlmIC8qIEhBVkVfTlRPSExMICovCisKKy8qIFRoaXMgbWFjcm8gd2lsbCBnaXZlIHRoZSBuZXh0IG11bHRpcGxlIG9mIDQgZm9yIGFuIGludGVnZXIgKHVzZWQgZm9yIHBhZGRpbmcgc2l6ZXMgb2YgQVZQKS4gKi8KKyNkZWZpbmUgUEFENChfeCkgKChfeCkgKyAoICg0IC0gKF94KSkgJiAzICkgKQorCisvKiBVc2VmdWwgdG8gZGlzcGxheSBhbnkgdmFsdWUgYXMgKHNhZmUpIEFTQ0lJICh3aWxsIGdhcmJhZ2UgVVRGLTggb3V0cHV0Li4uKSAqLworI2RlZmluZSBBU0NJSShfYykgKCAoKF9jIDwgMzIpIHx8IChfYyA+IDEyNykpID8gKCBfYyA/ICc/JyA6ICcgJyApIDogX2MgKQorCisvKiBDb21wYXJlIHRpbWVzcGVjIHN0cnVjdHVyZXMgKi8KKyNkZWZpbmUgVFNfSVNfSU5GRVJJT1IoIHRzMSwgdHMyICkgCQlcCisJKCAgICAoKHRzMSktPnR2X3NlYyAgPCAodHMyKS0+dHZfc2VjICkgCVwKKwkgIHx8ICgoKHRzMSktPnR2X3NlYyAgPT0gKHRzMiktPnR2X3NlYyApICYmICgodHMxKS0+dHZfbnNlYyA8ICh0czIpLT50dl9uc2VjKSApKQorCisvKiBDb21wdXRlIGRpZmYgYmV0d2VlbiB0d28gdGltZXNwZWNzIChwb2ludGVycykgKi8KKyNkZWZpbmUgVFNfRElGRkVSRU5DRSggdHNkaWZmLCB0c3N0YXJ0LCB0c2VuZCApCXsJCQkJCVwKKwlpZiAoKHRzZW5kKS0+dHZfbnNlYyA8ICh0c3N0YXJ0KS0+dHZfbnNlYyApIHsJCQkJCVwKKwkJKHRzZGlmZiktPnR2X3NlYyA9ICh0c2VuZCktPnR2X3NlYyAtICh0c3N0YXJ0KS0+dHZfc2VjIC0gMTsJCVwKKwkJKHRzZGlmZiktPnR2X25zZWMgPSAodHNlbmQpLT50dl9uc2VjICsgMTAwMDAwMDAwMCAtICh0c3N0YXJ0KS0+dHZfbnNlYzsJXAorCX0gZWxzZSB7CQkJCQkJCQkJXAorCQkodHNkaWZmKS0+dHZfc2VjICA9ICh0c2VuZCktPnR2X3NlYyAgLSAodHNzdGFydCktPnR2X3NlYzsJCVwKKwkJKHRzZGlmZiktPnR2X25zZWMgPSAodHNlbmQpLT50dl9uc2VjIC0gKHRzc3RhcnQpLT50dl9uc2VjOwkJXAorCX19CisJCQorCisvKiBUaGlzIGdpdmVzIGEgZ29vZCBzaXplIGZvciBidWZmZXJlZCByZWFkcyAqLworI2lmbmRlZiBCVUZTSVoKKyNkZWZpbmUgQlVGU0laIDk2CisjZW5kaWYgLyogQlVGU0laICovCisKKy8qIFRoaXMgZ2l2ZXMgdGhlIGxlbmd0aCBvZiBhIGNvbnN0IHN0cmluZyAqLworI2RlZmluZSBDT05TVFNUUkxFTiggc3RyICkgKHNpemVvZihzdHIpIC0gMSkKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICBQT1JUQUJJTElUWSAgICAgICAgICAgICAgICAgICAgICAgICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisjaWZuZGVmIEhBVkVfQ0xPQ0tfR0VUVElNRQorICAjZGVmaW5lIENMT0NLX1JFQUxUSU1FICAwCisgICNpbmNsdWRlIDxzeXMvdGltZS5oPgorICBpbnQgY2xvY2tfZ2V0dGltZShpbnQgY2xrX2lkLCBzdHJ1Y3QgdGltZXNwZWMqIHRzKTsKKyNlbmRpZiAvKiBIQVZFX0NMT0NLX0dFVFRJTUUgKi8KKworI2lmbmRlZiBIQVZFX1NUUk5EVVAKK2NoYXIgKiBzdHJuZHVwIChjaGFyICpzdHIsIHNpemVfdCBsZW4pOworI2VuZGlmIC8qIEhBVkVfU1RSTkRVUCAqLworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgIEJJTkFSWSBTVFJJTkdTICAgICAgICAgICAgICAgICAgICAgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogQ29tcHV0ZSBhIGhhc2ggdmFsdWUgb2YgYSBiaW5hcnkgc3RyaW5nLiAKK1RoZSBoYXNoIG11c3QgcmVtYWluIGxvY2FsIHRvIHRoaXMgbWFjaGluZSwgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgc2FtZSBpbnB1dAord2lsbCBnaXZlIHNhbWUgb3V0cHV0IG9uIGEgZGlmZmVyZW50IHN5c3RlbSAoZW5kaWFubmVzcykgKi8KK3VpbnQzMl90IGZkX29zX2hhc2ggKCB1aW50OF90ICogc3RyaW5nLCBzaXplX3QgbGVuICk7CisKKy8qIFRoaXMgdHlwZSB1c2VkIGZvciBiaW5hcnkgc3RyaW5ncyB0aGF0IGNvbnRhaW4gbm8gXDAgZXhjZXB0IGFzIHRoZWlyIGxhc3QgY2hhcmFjdGVyLiAKK0l0IG1lYW5zIHNvbWUgc3RyaW5nIG9wZXJhdGlvbnMgY2FuIGJlIHVzZWQgb24gaXQuICovCit0eXBlZGVmIHVpbnQ4X3QgKiBvczBfdDsKKworLyogU2FtZSBhcyBzdHJkdXAgYnV0IGZvciBvczBfdCBzdHJpbmdzICovCitvczBfdCBvczBkdXBfaW50KG9zMF90IHMsIHNpemVfdCBsKTsKKyNkZWZpbmUgb3MwZHVwKCBfcywgX2wpICAodm9pZCAqKW9zMGR1cF9pbnQoKG9zMF90KShfcyksIF9sKQorCisvKiBDaGVjayB0aGF0IGFuIG9jdGV0IHN0cmluZyB2YWx1ZSBjYW4gYmUgdXNlZCBhcyBvczBfdCAqLworc3RhdGljIF9faW5saW5lX18gaW50IGZkX29zX2lzX3ZhbGlkX29zMCh1aW50OF90ICogb3MsIHNpemVfdCBvc2xlbikgeworCS8qIFRoZSBvbmx5IHNpdHVhdGlvbiB3aGVyZSBpdCBpcyBub3QgdmFsaWQgaXMgd2hlbiBpdCBjb250YWlucyBhIFwwIGluc2lkZSB0aGUgb2N0ZXQgc3RyaW5nICovCisJcmV0dXJuIChtZW1jaHIob3MsICdcMCcsIG9zbGVuKSA9PSBOVUxMKTsKK30KKworLyogVGhlIGZvbGxvd2luZyB0eXBlIGRlbm90ZXMgYSB2ZXJpZmllZCBEaWFtZXRlcklkZW50aXR5IHZhbHVlICh0aGF0IGNvbnRhaW5zIG9ubHkgcHVyZSBsZXR0ZXJzLCBkaWdpdHMsIGh5cGhlbiwgZG90KSAqLwordHlwZWRlZiBjaGFyICogRGlhbUlkX3Q7CisKKy8qIE1heGltdW0gbGVuZ3RoIG9mIGEgaG9zdG5hbWUgd2UgYWNjZXB0ICovCisjaWZuZGVmIEhPU1RfTkFNRV9NQVgKKyNkZWZpbmUgSE9TVF9OQU1FX01BWCA1MTIKKyNlbmRpZiAvKiBIT1NUX05BTUVfTUFYICovCisKKy8qIENoZWNrIGlmIGEgYmluYXJ5IHN0cmluZyBjb250YWlucyBhIHZhbGlkIERpYW1ldGVyIElkZW50aXR5IHZhbHVlLgorICByZmMzNTg4IHN0YXRlcyBleHBsaWNpdGVseSB0aGF0IHN1Y2ggYSBEaWFtZXRlciBJZGVudGl0eSBjb25zaXN0cyBvbmx5IG9mIEFTQ0lJIGNoYXJhY3RlcnMuICovCitpbnQgZmRfb3NfaXNfdmFsaWRfRGlhbWV0ZXJJZGVudGl0eSh1aW50OF90ICogb3MsIHNpemVfdCBvc3N6KTsKKworLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbiB2YWxpZGF0ZXMgYSBzdHJpbmcgYXMgYSBEaWFtZXRlciBJZGVudGl0eSBvciBhcHBsaWVzIHRoZSBJRE5BIHRyYW5zZm9ybWF0aW9uIG9uIGl0IAorIGlmICppbm91dHN6IGlzICE9IDAgb24gZW50cnksICppZCBtYXkgbm90IGJlIFwwLXRlcm1pbmF0ZWQuCisgbWVtb3J5IGhhcyB0aGUgZm9sbG93aW5nIG1lYW5pbmc6IDA6ICppZCBjYW4gYmUgcmVhbGxvYydkLiAxOiAqaWQgbXVzdCBiZSBtYWxsb2MnZCBvbiBvdXRwdXQgKHdhcyBzdGF0aWMpCisqLworaW50IGZkX29zX3ZhbGlkYXRlX0RpYW1ldGVySWRlbnRpdHkoY2hhciAqKiBpZCwgc2l6ZV90ICogaW5vdXRzeiwgaW50IG1lbW9yeSk7CisKKy8qIENyZWF0ZSBhbiBvcmRlciByZWxhdGlvbnNoaXAgZm9yIGJpbmFyeSBzdHJpbmdzIChub3QgbmVlZGVkIHRvIGJlIFwwIHRlcm1pbmF0ZWQpLiAKKyAgIEl0IGRvZXMgTk9UIG1pbWljIHN0cmluZ3MgcmVsYXRpb25zaGlwcyBzbyB0aGF0IGl0IGlzIG1vcmUgZWZmaWNpZW50LiBJdCBpcyBjYXNlIHNlbnNpdGl2ZS4KKyAgICh0aGUgc3RyaW5ncyBhcmUgYWN0dWFsbHkgZmlyc3Qgb3JkZXJlZCBieSB0aGVpciBsZW5naCwgdGhlbiBieSB0aGVpciBieXRlcyBjb250ZW50cykKKyAgIHJldHVybnM6IC0xIGlmIG9zMSA8IG9zMjsgICsxIGlmIG9zMSA+IG9zMjsgIDAgaWYgdGhleSBhcmUgZXF1YWwgKi8KK2ludCBmZF9vc19jbXBfaW50KG9zMF90IG9zMSwgc2l6ZV90IG9zMXN6LCBvczBfdCBvczIsIHNpemVfdCBvczJzeik7CisjZGVmaW5lIGZkX29zX2NtcChfbzEsIF9sMSwgX28yLCBfbDIpICBmZF9vc19jbXBfaW50KChvczBfdCkoX28xKSwgX2wxLCAob3MwX3QpKF9vMiksIF9sMikKKworLyogQSByb3VnaGx5IGNhc2UtaW5zZW5zaXRpdmUgdmFyaWFudCwgd2hpY2ggYWN0dWFsbHkgb25seSBjb21wYXJlcyBBU0NJSSBjaGFycyAoMC0xMjcpIGluIGEgY2FzZS1pbnNlbnRpdGl2ZSBtYW5lZXIgCisgIC0tIGl0IGRvZXMgbm90IHN1cHBvcnQgbG9jYWxlcyB3aGVyZSBhIGxvd2VyY2FzZSBsZXR0ZXIgdXNlcyBtb3JlIHNwYWNlIHRoYW4gdXBwZXIgY2FzZSwgc3VjaCBhcyDfIC0+IHNzCisgSXQgaXMgc2xvd2VyIHRoYW4gZmRfb3NfY21wLgorIE5vdGUgdGhhdCB0aGUgcmVzdWx0IGlzIE5PVCB0aGUgc2FtZSBhcyBzdHJjYXNlY21wICEhIQorIAorIFRoaXMgZnVuY3Rpb24gZ2l2ZXMgdGhlIHNhbWUgb3JkZXIgYXMgZmRfb3NfY21wLCBleGNlcHQgd2hlbiBpdCBmaW5kcyAyIHN0cmluZ3MgdG8gYmUgZXF1YWwuCisgSG93ZXZlciB0aGlzIGlzIG5vdCBhbHdheXMgc3VmZmljaWVudDoKKyAJZm9yIGV4YW1wbGUgZmRfb3NfY21wIGdpdmVzOiAiQWMiIDwgImFCIiA8ICJhYSIKKwlpZiB5b3UgYXR0ZW1wdCB0byBmZF9vc19hbG1vc3RjYXNlc3JjaCAiQWEiIHlvdSB3aWxsIGFjdHVhbGx5IGhhdmUgdG8gZ28gcGFzdCAiYUIiIHdoaWNoIGlzID4gIkFhIi4KKwlUaGVyZWZvcmUgeW91IGNhbiB1c2UgdGhlIG1heWJlZnVydGhlciBwYXJhbWV0ZXIuCisJVGhpcyBwYXJhbWV0ZXIgaXMgMSBvbiByZXR1cm4gaWYgb3MxIG1heSBoYXZlIGJlZW4gc3RvcmVkIGZ1cnRoZXIgdGhhdCBvczIgKGFzc3VtaW5nIG9zMiB2YWx1ZXMgYXJlIG9yZGVyZWQgYnkgZmRfb3NfY21wKQorCWFuZCAwIGlmIHdlIGFyZSBzdXJlIHRoYXQgaXQgaXMgbm90IHRoZSBjYXNlLgorCVdoZW4gbG9vcGluZyB0aHJvdWdoIGEgbGlzdCBvZiBmZF9vc19jbXAgY2xhc3NpZmllZCB2YWx1ZXMsIHRoaXMgcGFyYW1ldGVyIG11c3QgYmUgdXNlZCB0byBzdG9wIGxvb3BpbmcsIGluIGFkZGl0aW9uIHRvIHRoZSBjb21wIHJlc3VsdC4KKyAqLworaW50IGZkX29zX2FsbW9zdGNhc2VzcmNoX2ludCh1aW50OF90ICogb3MxLCBzaXplX3Qgb3Mxc3osIHVpbnQ4X3QgKiBvczIsIHNpemVfdCBvczJzeiwgaW50ICogbWF5YmVmdXJ0aGVyKTsKKyNkZWZpbmUgZmRfb3NfYWxtb3N0Y2FzZXNyY2goX28xLCBfbDEsIF9vMiwgX2wyLCBfbWIpICBmZF9vc19hbG1vc3RjYXNlc3JjaF9pbnQoKG9zMF90KShfbzEpLCBfbDEsIChvczBfdCkoX28yKSwgX2wyLCBfbWIpCisKKy8qIEFuYWx5emUgYSBEaWFtZXRlclVSSSBhbmQgcmV0dXJuIGl0cyBjb21wb25lbnRzLiAKKyAgUmV0dXJuIEVJTlZBTCBpZiB0aGUgVVJJIGlzIG5vdCB2YWxpZC4gCisgICpkaWFtaWQgaXMgbWFsbG9jJ2Qgb24gZnVuY3Rpb24gcmV0dXJuIGFuZCBtdXN0IGJlIGZyZWVkIChpdCBpcyBwcm9jZXNzZWQgYnkgZmRfb3NfdmFsaWRhdGVfRGlhbWV0ZXJJZGVudGl0eSkuCisgICpzZWN1cmUgaXMgMCAobm8gc2VjdXJpdHkpIG9yIDEgKHNlY3VyaXR5IGVuYWJsZWQpIG9uIHJldHVybi4KKyAgKnBvcnQgaXMgMCAoZGVmYXVsdCkgb3IgYSB2YWx1ZSBpbiBob3N0IGJ5dGUgb3JkZXIgb24gcmV0dXJuLgorICAqdHJhbnNwb3J0IGlzIDAgKGRlZmF1bHQpIG9yIElQUFJPVE9fKiBvbiByZXR1cm4uCisgICpwcm90byBpcyAwIChkZWZhdWx0KSBvciAnZCcgKGRpYW1ldGVyKSwgJ3InIChyYWRpdXMpLCBvciAndCcgKHRhY2FjcyspIG9uIHJldHVybi4KKyAgKi8KK2ludCBmZF9vc19wYXJzZV9EaWFtZXRlclVSSSh1aW50OF90ICogdXJpLCBzaXplX3QgdXJpc3osIERpYW1JZF90ICogZGlhbWlkLCBzaXplX3QgKiBkaWFtaWRsZW4sIGludCAqIHNlY3VyZSwgdWludDE2X3QgKiBwb3J0LCBpbnQgKiB0cmFuc3BvcnQsIGNoYXIgKnByb3RvKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogICAgICAgICAgICAgICAgICAgICAgICAgIFRIUkVBRFMgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiBUZXJtaW5hdGUgYSB0aHJlYWQgKi8KK3N0YXRpYyBfX2lubGluZV9fIGludCBmZF90aHJfdGVybShwdGhyZWFkX3QgKiB0aCkKK3sKKwl2b2lkICogdGhfcmV0ID0gTlVMTDsKKwkKKwlDSEVDS19QQVJBTVModGgpOworCQorCS8qIFRlc3QgaWYgaXQgd2FzIGFscmVhZHkgdGVybWluYXRlZCAqLworCWlmICgqdGggPT0gKHB0aHJlYWRfdClOVUxMKQorCQlyZXR1cm4gMDsKKwkKKwkvKiBDYW5jZWwgdGhlIHRocmVhZCBpZiBpdCBpcyBzdGlsbCBydW5uaW5nIC0gaWdub3JlIGVycm9yIGlmIGl0IHdhcyBhbHJlYWR5IHRlcm1pbmF0ZWQgKi8KKwkodm9pZCkgcHRocmVhZF9jYW5jZWwoKnRoKTsKKwkKKwkvKiBUaGVuIGpvaW4gdGhlIHRocmVhZCAqLworCUNIRUNLX1BPU0lYKCBwdGhyZWFkX2pvaW4oKnRoLCAmdGhfcmV0KSApOworCQorCWlmICh0aF9yZXQgPT0gUFRIUkVBRF9DQU5DRUxFRCkgeworCQlUUkFDRV9ERUJVRyhBTk5PWUlORywgIlRoZSB0aHJlYWQgJXAgd2FzIGNhbmNlbGVkIiwgKHZvaWQgKikqdGgpOworCX0gZWxzZSB7CisJCVRSQUNFX0RFQlVHKENBTEwsICJUaGUgdGhyZWFkICVwIHJldHVybmVkICVwIiwgKHZvaWQgKikqdGgsIHRoX3JldCk7CisJfQorCQorCS8qIENsZWFuIHRoZSBsb2NhdGlvbiAqLworCSp0aCA9IChwdGhyZWFkX3QpTlVMTDsKKwkKKwlyZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKgorIENhbmNlbGF0aW9uIGNsZWFudXAgaGFuZGxlcnMgZm9yIGNvbW1vbiBvYmplY3RzIAorICoqKioqKioqKioqKiovCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGZkX2NsZWFudXBfbXV0ZXgoIHZvaWQgKiBtdXRleCApCit7CisJQ0hFQ0tfUE9TSVhfRE8oIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKChwdGhyZWFkX211dGV4X3QgKiltdXRleCksIC8qICovKTsKK30KKwkJCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGZkX2NsZWFudXBfcndsb2NrKCB2b2lkICogcndsb2NrICkKK3sKKwlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9yd2xvY2tfdW5sb2NrKChwdGhyZWFkX3J3bG9ja190ICopcndsb2NrKSwgLyogKi8pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGZkX2NsZWFudXBfYnVmZmVyKCB2b2lkICogYnVmZmVyICkKK3sKKwlmcmVlKGJ1ZmZlcik7Cit9CitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGZkX2NsZWFudXBfc29ja2V0KHZvaWQgKiBzb2NrcHRyKQoreworCWlmIChzb2NrcHRyICYmICgqKGludCAqKXNvY2twdHIgPiAwKSkgeworCQlDSEVDS19TWVNfRE8oIGNsb3NlKCooaW50ICopc29ja3B0ciksIC8qIGlnbm9yZSAqLyApOworCQkqKGludCAqKXNvY2twdHIgPSAtMTsKKwl9Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogICAgICAgICAgICAgICAgICAgICAgICAgIExJU1RTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZSByZXByZXNlbnRzIGEgY2hhaW5lZCBsaXN0IGVsZW1lbnQgICovCitzdHJ1Y3QgZmRfbGlzdCB7CisJc3RydWN0IGZkX2xpc3QgCSpuZXh0OyAvKiBuZXh0IGVsZW1lbnQgaW4gdGhlIGxpc3QgKi8KKwlzdHJ1Y3QgZmRfbGlzdCAJKnByZXY7IC8qIHByZXZpb3VzIGVsZW1lbnQgaW4gdGhlIGxpc3QgKi8KKwlzdHJ1Y3QgZmRfbGlzdCAJKmhlYWQ7IC8qIGhlYWQgb2YgdGhlIGxpc3QgKi8KKwl2b2lkCQkqbzsgICAgLyogYWRkaXRpb25hbCBwb2ludGVyLCB1c2VkIGZvciBhbnkgcHVycG9zZSAoZXg6IHN0YXJ0IG9mIHRoZSBwYXJlbnQgb2JqZWN0KSAqLworfTsKKworLyogSW5pdGlhbGl6ZSBhIGxpc3QgZWxlbWVudCAqLworI2RlZmluZSBGRF9MSVNUX0lOSVRJQUxJWkVSKCBfbGlzdF9uYW1lICkgXAorCXsgLm5leHQgPSAmIF9saXN0X25hbWUsIC5wcmV2ID0gJiBfbGlzdF9uYW1lLCAuaGVhZCA9ICYgX2xpc3RfbmFtZSwgLm8gPSBOVUxMIH0KKyNkZWZpbmUgRkRfTElTVF9JTklUSUFMSVpFUl9PKCBfbGlzdF9uYW1lLCBfb2JqICkgXAorCXsgLm5leHQgPSAmIF9saXN0X25hbWUsIC5wcmV2ID0gJiBfbGlzdF9uYW1lLCAuaGVhZCA9ICYgX2xpc3RfbmFtZSwgLm8gPSBfb2JqIH0KK3ZvaWQgZmRfbGlzdF9pbml0ICggc3RydWN0IGZkX2xpc3QgKiBsaXN0LCB2b2lkICogb2JqICk7CisKKy8qIFJldHVybiBib29sZWFuLCB0cnVlIGlmIHRoZSBsaXN0IGlzIGVtcHR5ICovCisjZGVmaW5lIEZEX0lTX0xJU1RfRU1QVFkoIF9saXN0ICkgKCgoKHN0cnVjdCBmZF9saXN0ICopKF9saXN0KSktPmhlYWQgPT0gKF9saXN0KSkgJiYgKCgoc3RydWN0IGZkX2xpc3QgKikoX2xpc3QpKS0+bmV4dCA9PSAoX2xpc3QpKSkKKworLyogSW5zZXJ0IGFuIGl0ZW0gaW4gYSBsaXN0IGF0IGtub3duIHBvc2l0aW9uICovCit2b2lkIGZkX2xpc3RfaW5zZXJ0X2FmdGVyICAoIHN0cnVjdCBmZF9saXN0ICogcmVmLCBzdHJ1Y3QgZmRfbGlzdCAqIGl0ZW0gKTsKK3ZvaWQgZmRfbGlzdF9pbnNlcnRfYmVmb3JlICggc3RydWN0IGZkX2xpc3QgKiByZWYsIHN0cnVjdCBmZF9saXN0ICogaXRlbSApOworCisvKiBNb3ZlIGFsbCBlbGVtZW50cyBmcm9tIGEgbGlzdCBhdCB0aGUgZW5kIG9mIGFub3RoZXIgKi8KK3ZvaWQgZmRfbGlzdF9tb3ZlX2VuZChzdHJ1Y3QgZmRfbGlzdCAqIHJlZiwgc3RydWN0IGZkX2xpc3QgKiBzZW50aSk7CisKKy8qIEluc2VydCBhbiBpdGVtIGluIGFuIG9yZGVyZWQgbGlzdCAtLSBvcmRlcmluZyBmdW5jdGlvbiBtdXN0IGJlIHByb3ZpZGVkLiBJZiBkdXBsaWNhdGUgb2JqZWN0IGZvdW5kLCBFRVhJU1QgYW5kIGl0IGlzIHJldHVybmVkIGluIHJlZl9kdXBsaWNhdGUgKi8KK2ludCBmZF9saXN0X2luc2VydF9vcmRlcmVkKCBzdHJ1Y3QgZmRfbGlzdCAqIGhlYWQsIHN0cnVjdCBmZF9saXN0ICogaXRlbSwgaW50ICgqY21wX2ZjdCkodm9pZCAqLCB2b2lkICopLCB2b2lkICoqIHJlZl9kdXBsaWNhdGUpOworCisvKiBVbmxpbmsgYW4gaXRlbSBmcm9tIGEgbGlzdCAqLwordm9pZCBmZF9saXN0X3VubGluayAoIHN0cnVjdCBmZF9saXN0ICogaXRlbSApOworCisKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiAgICAgICAgICAgICAgICAgICAgICAgIERJQ1RJT05BUlkgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qIFN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoZSBjb21wbGV0ZSBkaWN0aW9uYXJ5IGRlZmluaXRpb25zICovCitzdHJ1Y3QgZGljdGlvbmFyeTsKKworLyogU3RydWN0dXJlIHRoYXQgY29udGFpbnMgYSBkaWN0aW9uYXJ5IG9iamVjdCAqLworc3RydWN0IGRpY3Rfb2JqZWN0OworCisvKiBUeXBlcyBvZiBvYmplY3QgaW4gdGhlIGRpY3Rpb25hcnkuICovCitlbnVtIGRpY3Rfb2JqZWN0X3R5cGUgeworCURJQ1RfVkVORE9SCT0gMSwJLyogVmVuZG9yICovCisJRElDVF9BUFBMSUNBVElPTiwJLyogRGlhbWV0ZXIgQXBwbGljYXRpb24gKi8KKwlESUNUX1RZUEUsCQkvKiBBVlAgZGF0YSB0eXBlICovCisJRElDVF9FTlVNVkFMLAkJLyogTmFtZWQgY29uc3RhbnQgKHZhbHVlIG9mIGFuIGVudW1lcmF0ZWQgQVZQIHR5cGUpICovCisJRElDVF9BVlAsCQkvKiBBVlAgKi8KKwlESUNUX0NPTU1BTkQsCQkvKiBEaWFtZXRlciBDb21tYW5kICovCisJRElDVF9SVUxFCQkvKiBhIFJ1bGUgZm9yIEFWUCBpbiBjb21tYW5kIG9yIGdyb3VwZWQgQVZQICovCisjZGVmaW5lIERJQ1RfVFlQRV9NQVgJRElDVF9SVUxFCit9OworCQorLyogSW5pdGlhbGl6ZSBhIGRpY3Rpb25hcnkgKi8KK2ludCBmZF9kaWN0X2luaXQoc3RydWN0IGRpY3Rpb25hcnkgKiogZGljdCk7CisvKiBEZXN0cm95IGEgZGljdGlvbmFyeSAqLworaW50IGZkX2RpY3RfZmluaShzdHJ1Y3QgZGljdGlvbmFyeSAqKiBkaWN0KTsKKworLyoKKyAqIEZVTkNUSU9OOglmZF9kaWN0X25ldworICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgZGljdAk6IFBvaW50ZXIgdG8gdGhlIGRpY3Rpb25uYXJ5IHdoZXJlIHRoZSBvYmplY3QgaXMgY3JlYXRlZAorICogIHR5cGUgCTogV2hhdCBraW5kIG9mIG9iamVjdCBtdXN0IGJlIGNyZWF0ZWQKKyAqICBkYXRhIAk6IHBvaW50ZXIgdG8gdGhlIGRhdGEgZm9yIHRoZSBvYmplY3QuIAorICogICAgICAgICAgCSB0eXBlIHBhcmFtZXRlciBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgdHlwZSBvZiBkYXRhIChzZWUgYmVsb3cgZm9yIGRldGFpbCkuCisgKiAgcGFyZW50IAk6IGEgcmVmZXJlbmNlIHRvIGEgcGFyZW50IG9iamVjdCwgaWYgbmVlZGVkLgorICogIHJlZiAJOiB1cG9uIHN1Y2Nlc3NmdWwgY3JlYXRpb24sIHJlZmVyZW5jZSB0byBuZXcgb2JqZWN0IGlzIHN0b3JlZCBoZXJlIGlmICFudWxsLgorICoKKyAqIERFU0NSSVBUSU9OOiAKKyAqICBDcmVhdGUgYSBuZXcgb2JqZWN0IGluIHRoZSBkaWN0aW9uYXJ5LiAKKyAqICBTZWUgZm9sbG93aW5nIG9iamVjdCBzZWN0aW9ucyBpbiB0aGlzIGhlYWRlciBmaWxlIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGRhdGEgYW5kIHBhcmVudCBwYXJhbWV0ZXJzIGZvcm1hdC4KKyAqCisgKiBSRVRVUk4gVkFMVUU6CisgKiAgMCAgICAgIAk6IFRoZSBvYmplY3QgaXMgY3JlYXRlZCBpbiB0aGUgZGljdGlvbmFyeS4KKyAqICBFSU5WQUwgCTogQSBwYXJhbWV0ZXIgaXMgaW52YWxpZC4KKyAqICBFRVhJU1QgCTogVGhpcyBvYmplY3QgaXMgYWxyZWFkeSBkZWZpbmVkIGluIHRoZSBkaWN0aW9uYXJ5ICh3aXRoIGNvbmZsaWN0aW5nIGRhdGEpLiAKKyAqICAgICAgICAgICAgICAgIElmICJyZWYiIGlzIG5vdCBOVUxMLCBpdCBwb2ludHMgdG8gdGhlIGV4aXN0aW5nIGVsZW1lbnQgb24gcmV0dXJuLgorICogIChvdGhlciBzdGFuZGFyZCBlcnJvcnMgbWF5IGJlIHJldHVybmVkLCB0b28sIHdpdGggdGhlaXIgc3RhbmRhcmQgbWVhbmluZy4gRXhhbXBsZToKKyAqICAgIEVOT01FTSAJOiBNZW1vcnkgYWxsb2NhdGlvbiBmb3IgdGhlIG5ldyBvYmplY3QgZWxlbWVudCBmYWlsZWQuKQorICovCitpbnQgZmRfZGljdF9uZXcgKCBzdHJ1Y3QgZGljdGlvbmFyeSAqIGRpY3QsIGVudW0gZGljdF9vYmplY3RfdHlwZSB0eXBlLCB2b2lkICogZGF0YSwgc3RydWN0IGRpY3Rfb2JqZWN0ICogcGFyZW50LCBzdHJ1Y3QgZGljdF9vYmplY3QgKiogcmVmICk7CisKKy8qCisgKiBGVU5DVElPTjogCWZkX2RpY3Rfc2VhcmNoCisgKgorICogUEFSQU1FVEVSUzoKKyAqICBkaWN0CTogUG9pbnRlciB0byB0aGUgZGljdGlvbm5hcnkgd2hlcmUgdGhlIG9iamVjdCBpcyBzZWFyY2hlZAorICogIHR5cGUgCTogdHlwZSBvZiBvYmplY3QgdGhhdCBpcyBiZWluZyBzZWFyY2hlZAorICogIGNyaXRlcmlhIAk6IGhvdyB0aGUgb2JqZWN0IG11c3QgYmUgc2VhcmNoZWQuIFNlZSBvYmplY3QtcmVsYXRlZCBzZWN0aW9ucyBiZWxvdyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAqICB3aGF0IAk6IGRlcGVuZGluZyBvbiBjcml0ZXJpYSwgdGhlIGRhdGEgdGhhdCBtdXN0IGJlIHNlYXJjaGVkLgorICogIHJlc3VsdCAJOiBPbiBzdWNjZXNzZnVsIHJldHVybiwgcG9pbnRlciB0byB0aGUgb2JqZWN0IGlzIHN0b3JlZCBoZXJlLgorICogIHJldHZhbAk6IHRoaXMgdmFsdWUgaXMgcmV0dXJuZWQgaWYgdGhlIG9iamVjdCBpcyBub3QgZm91bmQgYW5kIHJlc3VsdCBpcyBub3QgTlVMTC4KKyAqCisgKiBERVNDUklQVElPTjogCisgKiAgIFBlcmZvcm0gYSBzZWFyY2ggaW4gdGhlIGRpY3Rpb25hcnkuIAorICogICBTZWUgdGhlIG9iamVjdC1zcGVjaWZpYyBzZWN0aW9ucyBiZWxvdyB0byBmaW5kIGhvdyB0byBsb29rIGZvciBlYWNoIG9iamVjdHMuCisgKiAgIElmIHRoZSAicmVzdWx0IiBwYXJhbWV0ZXIgaXMgTlVMTCwgdGhlIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY2hlY2sgaWYgYW4gb2JqZWN0IGlzIGluIHRoZSBkaWN0aW9uYXJ5LgorICogICBPdGhlcndpc2UsIGEgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgaXMgc3RvcmVkIGluIHJlc3VsdCBpZiBmb3VuZC4KKyAqICAgSWYgcmVzdWx0IGlzIG5vdCBOVUxMIGFuZCB0aGUgb2JqZWN0IGlzIG5vdCBmb3VuZCwgcmV0dmFsIGlzIHJldHVybmVkIChzaG91bGQgYmUgMCBvciBFTk9FTlQgdXN1YWxseSkKKyAqCisgKiBSRVRVUk4gVkFMVUU6CisgKiAgMCAgICAgIAk6IFRoZSBvYmplY3QgaGFzIGJlZW4gZm91bmQgaW4gdGhlIGRpY3Rpb25hcnksIG9yICpyZXN1bHQgaXMgTlVMTC4KKyAqICBFSU5WQUwgCTogQSBwYXJhbWV0ZXIgaXMgaW52YWxpZC4KKyAqICBFTk9FTlQJOiBObyBtYXRjaGluZyBvYmplY3QgaGFzIGJlZW4gZm91bmQsIGFuZCByZXN1bHQgd2FzIE5VTEwuCisgKi8KK2ludCBmZF9kaWN0X3NlYXJjaCAoIHN0cnVjdCBkaWN0aW9uYXJ5ICogZGljdCwgZW51bSBkaWN0X29iamVjdF90eXBlIHR5cGUsIGludCBjcml0ZXJpYSwgY29uc3Qgdm9pZCAqIHdoYXQsIHN0cnVjdCBkaWN0X29iamVjdCAqKiByZXN1bHQsIGludCByZXR2YWwgKTsKKworLyogU3BlY2lhbCBjYXNlOiBnZXQgdGhlIGdlbmVyaWMgZXJyb3IgY29tbWFuZCBvYmplY3QgKi8KK2ludCBmZF9kaWN0X2dldF9lcnJvcl9jbWQoc3RydWN0IGRpY3Rpb25hcnkgKiBkaWN0LCBzdHJ1Y3QgZGljdF9vYmplY3QgKiogb2JqKTsKKworLyoKKyAqIEZVTkNUSU9OOglmZF9kaWN0X2dldHZhbAorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgb2JqZWN0IAk6IFBvaW50ZXIgdG8gYSBkaWN0aW9uYXJ5IG9iamVjdC4KKyAqICBkYXRhIAk6IHBvaW50ZXIgdG8gYSBzdHJ1Y3R1cmUgdG8gaG9sZCB0aGUgZGF0YSBmb3IgdGhlIG9iamVjdC4KKyAqICAgICAgICAgIAkgIFRoZSB0eXBlIGlzIHRoZSBzYW1lIGFzICJkYXRhIiBwYXJhbWV0ZXIgaW4gZmRfZGljdF9uZXcgZnVuY3Rpb24uCisgKgorICogREVTQ1JJUFRJT046IAorICogIFJldHJpZXZlIGNvbnRlbnQgb2YgYSBkaWN0aW9uYXJ5IG9iamVjdC4KKyAqICBTZWUgZm9sbG93aW5nIG9iamVjdCBzZWN0aW9ucyBpbiB0aGlzIGhlYWRlciBmaWxlIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGRhdGEgYW5kIHBhcmVudCBwYXJhbWV0ZXJzIGZvcm1hdC4KKyAqCisgKiBSRVRVUk4gVkFMVUU6CisgKiAgMCAgICAgIAk6IFRoZSBjb250ZW50IG9mIHRoZSBvYmplY3QgaGFzIGJlZW4gcmV0cmlldmVkLgorICogIEVJTlZBTCAJOiBBIHBhcmFtZXRlciBpcyBpbnZhbGlkLgorICovCitpbnQgZmRfZGljdF9nZXR2YWwgKCBzdHJ1Y3QgZGljdF9vYmplY3QgKiBvYmplY3QsIHZvaWQgKiB2YWwpOworaW50IGZkX2RpY3RfZ2V0dHlwZSAoIHN0cnVjdCBkaWN0X29iamVjdCAqIG9iamVjdCwgZW51bSBkaWN0X29iamVjdF90eXBlICogdHlwZSk7CitpbnQgZmRfZGljdF9nZXRkaWN0ICggc3RydWN0IGRpY3Rfb2JqZWN0ICogb2JqZWN0LCBzdHJ1Y3QgZGljdGlvbmFyeSAqKiBkaWN0KTsKKworLyogRGVidWcgZnVuY3Rpb25zICovCitERUNMQVJFX0ZEX0RVTVBfUFJPVE9UWVBFKGZkX2RpY3RfZHVtcF9vYmplY3QsIHN0cnVjdCBkaWN0X29iamVjdCAqIG9iaik7CitERUNMQVJFX0ZEX0RVTVBfUFJPVE9UWVBFKGZkX2RpY3RfZHVtcCwgc3RydWN0IGRpY3Rpb25hcnkgKiBkaWN0KTsKKworLyogRnVuY3Rpb24gdG8gYWNjZXNzIGZ1bGwgY29udGVudHMgb2YgdGhlIGRpY3Rpb25hcnksIHNlZSBkb2MgaW4gZGljdGlvbmFyeS5jICovCitpbnQgZmRfZGljdF9nZXRsaXN0b2YoaW50IGNyaXRlcmlhLCB2b2lkICogcGFyZW50LCBzdHJ1Y3QgZmRfbGlzdCAqKiBzZW50aW5lbCk7CisKKy8qIEZ1bmN0aW9uIHRvIHJlbW92ZSBhbiBlbnRyeSBmcm9tIHRoZSBkaWN0aW9uYXJ5LgorICBUaGlzIGNhbm5vdCBiZSB1c2VkIGlmIHRoZSBvYmplY3QgaGFzIGNoaWxkcmVuIChmb3IgZXhhbXBsZSBhIHZlbmRvciB3aXRoIHZlbmRvci1zcGVjaWZpYyBBVlBzKS4KKyAgSW4gc3VjaCBjYXNlLCB0aGUgY2hpbGRyZW4gbXVzdCBiZSByZW1vdmVkIGZpcnN0LiAqLworaW50IGZkX2RpY3RfZGVsZXRlKHN0cnVjdCBkaWN0X29iamVjdCAqIG9iaik7CisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVmVuZG9yIG9iamVjdCAKKyAqCisgKiBUaGVzZSB0eXBlcyBhcmUgdXNlZCB0byBtYW5hZ2UgdmVuZG9ycyBpbiB0aGUgZGljdGlvbmFyeQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKiBUeXBlIHRvIGhvbGQgYSBWZW5kb3IgSUQ6ICJTTUkgTmV0d29yayBNYW5hZ2VtZW50IFByaXZhdGUgRW50ZXJwcmlzZSBDb2RlcyIgKFJGQzMyMzIpICovCit0eXBlZGVmIHVpbnQzMl90CXZlbmRvcl9pZF90OworCisvKiBUeXBlIHRvIGhvbGQgZGF0YSBhc3NvY2lhdGVkIHRvIGEgdmVuZG9yICovCitzdHJ1Y3QgZGljdF92ZW5kb3JfZGF0YSB7CisJdmVuZG9yX2lkX3QJIHZlbmRvcl9pZDsJLyogSUQgb2YgYSB2ZW5kb3IgKi8KKwljaGFyICoJIAkgdmVuZG9yX25hbWU7CS8qIFRoZSBuYW1lIG9mIHRoaXMgdmVuZG9yICovCit9OworCisvKiBUaGUgY3JpdGVyaWEgZm9yIHNlYXJjaGluZyBhIHZlbmRvciBvYmplY3QgaW4gdGhlIGRpY3Rpb25hcnkgKi8KK2VudW0geworCVZFTkRPUl9CWV9JRCA9IDEwLAkvKiAid2hhdCIgcG9pbnRzIHRvIGEgdmVuZG9yX2lkX3QgKi8KKwlWRU5ET1JfQllfTkFNRSwJCS8qICJ3aGF0IiBwb2ludHMgdG8gYSBjaGFyICogKi8KKwlWRU5ET1JfT0ZfQVBQTElDQVRJT04sCS8qICJ3aGF0IiBwb2ludHMgdG8gYSBzdHJ1Y3QgZGljdF9vYmplY3QgY29udGFpbmluZyBhbiBhcHBsaWNhdGlvbiAoc2VlIGJlbG93KSAqLworCVZFTkRPUl9PRl9BVlAsCQkvKiAid2hhdCIgcG9pbnRzIHRvIGEgc3RydWN0IGRpY3Rfb2JqZWN0IGNvbnRhaW5pbmcgYW4gYXZwIChzZWUgYmVsb3cpICovCit9OworCisvKioqCisgKiAgQVBJIHVzYWdlIDoKKworTm90ZTogdGhlIHZhbHVlIG9mICJ2ZW5kb3JfbmFtZSIgaXMgY29waWVkIHdoZW4gdGhlIG9iamVjdCBpcyBjcmVhdGVkLCBhbmQgdGhlIHN0cmluZyBtYXkgYmUgZGlzcG9zZWQgYWZ0ZXJ3YXJkcy4KK09uIHRoZSBvdGhlciBzaWRlLCB3aGVuIHZhbHVlIGlzIHJldHJpZXZlZCB3aXRoIGRpY3RfZ2V0dmFsLCB0aGUgc3RyaW5nIGlzIG5vdCBjb3BpZWQgYW5kIE1VU1QgTk9UIGJlIGZyZWVkLiBJdCB3aWxsCitiZSBmcmVlZCBhdXRvbWF0aWNhbGx5IGFsb25nIHdpdGggdGhlIG9iamVjdCBpdHNlbGYgd2l0aCBjYWxsIHRvIGRpY3RfZmluaSBsYXRlci4KKyAKKy0gZmRfZGljdF9uZXc6CisgVGhlICJwYXJlbnQiIHBhcmFtZXRlciBpcyBub3QgdXNlZCBmb3IgdmVuZG9ycy4gCisgU2FtcGxlIGNvZGUgdG8gY3JlYXRlIGEgdmVuZG9yOgorIHsKKwkgaW50IHJldDsKKwkgc3RydWN0IGRpY3Rfb2JqZWN0ICogbXl2ZW5kb3I7CisJIHN0cnVjdCBkaWN0X3ZlbmRvcl9kYXRhIG15dmVuZG9yZGF0YSA9IHsgMjM0NTUsICJteSB2ZW5kb3IgbmFtZSIgfTsgIC0tIGp1c3QgYW4gZXhhbXBsZS4uLgorCSByZXQgPSBmZF9kaWN0X25ldyAoIGRpY3QsIERJQ1RfVkVORE9SLCAmbXl2ZW5kb3JkYXRhLCBOVUxMLCAmbXl2ZW5kb3IgKTsKKyB9CisKKy0gZmRfZGljdF9zZWFyY2g6CisgU2FtcGxlIGNvZGVzIHRvIGxvb2sgZm9yIGEgdmVuZG9yIG9iamVjdCwgYnkgaXRzIGlkIG9yIG5hbWU6CisgeworCSBpbnQgcmV0OworCSBzdHJ1Y3QgZGljdF9vYmplY3QgKiB2ZW5kb3JfZm91bmQ7CisJIHZlbmRvcl9pZF90IHZlbmRvcmlkID0gMjM0NTU7CisJIHJldCA9IGZkX2RpY3Rfc2VhcmNoICggZGljdCwgRElDVF9WRU5ET1IsIFZFTkRPUl9CWV9JRCwgJnZlbmRvcmlkLCAmdmVuZG9yX2ZvdW5kLCBFTk9FTlQpOworCSAtIG9yIC0KKwkgcmV0ID0gZmRfZGljdF9zZWFyY2ggKCBkaWN0LCBESUNUX1ZFTkRPUiwgVkVORE9SX0JZX05BTUUsICJteSB2ZW5kb3IgbmFtZSIsICZ2ZW5kb3JfZm91bmQsIEVOT0VOVCk7CisgfQorIAorIC0gZmRfZGljdF9nZXR2YWw6CisgU2FtcGxlIGNvZGUgdG8gcmV0cmlldmUgdGhlIGRhdGEgZnJvbSBhIHZlbmRvciBvYmplY3Q6CisgeworCSBpbnQgcmV0OworCSBzdHJ1Y3QgZGljdF9vYmplY3QgKiBteXZlbmRvcjsKKwkgc3RydWN0IGRpY3RfdmVuZG9yX2RhdGEgbXl2ZW5kb3JkYXRhOworCSByZXQgPSBmZF9kaWN0X3NlYXJjaCAoIGRpY3QsIERJQ1RfVkVORE9SLCBWRU5ET1JfQllfTkFNRSwgIm15IHZlbmRvciBuYW1lIiwgJm15dmVuZG9yLCBFTk9FTlQpOworCSByZXQgPSBmZF9kaWN0X2dldHZhbCAoIG15dmVuZG9yLCAmbXl2ZW5kb3JkYXRhICk7CisJIHByaW50ZigibXkgdmVuZG9yIGlkOiAlZFxuIiwgbXl2ZW5kb3JkYXRhLnZlbmRvcl9pZCApOworIH0KKwkJIAorKi8KKwkJCisvKiBTcGVjaWFsIGZ1bmN0aW9uOiAqLwordWludDMyX3QgKiBmZF9kaWN0X2dldF92ZW5kb3JpZF9saXN0KHN0cnVjdCBkaWN0aW9uYXJ5ICogZGljdCk7CisJIAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBBcHBsaWNhdGlvbiBvYmplY3QgCisgKgorICogVGhlc2UgdHlwZXMgYXJlIHVzZWQgdG8gbWFuYWdlIERpYW1ldGVyIGFwcGxpY2F0aW9ucyBpbiB0aGUgZGljdGlvbmFyeQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKiBUeXBlIHRvIGhvbGQgYSBEaWFtZXRlciBhcHBsaWNhdGlvbiBJRDogSUFOQSBhc3NpZ25lZCB2YWx1ZSBmb3IgdGhpcyBhcHBsaWNhdGlvbi4gKi8KK3R5cGVkZWYgdWludDMyX3QJYXBwbGljYXRpb25faWRfdDsKKworLyogVHlwZSB0byBob2xkIGRhdGEgYXNzb2NpYXRlZCB0byBhbiBhcHBsaWNhdGlvbiAqLworc3RydWN0IGRpY3RfYXBwbGljYXRpb25fZGF0YSB7CisJYXBwbGljYXRpb25faWRfdAkgYXBwbGljYXRpb25faWQ7CS8qIElEIG9mIHRoZSBhcHBsaWNhdGlvbiAqLworCWNoYXIgKgkgCQkgYXBwbGljYXRpb25fbmFtZTsJLyogVGhlIG5hbWUgb2YgdGhpcyBhcHBsaWNhdGlvbiAqLworfTsKKworLyogVGhlIGNyaXRlcmlhIGZvciBzZWFyY2hpbmcgYW4gYXBwbGljYXRpb24gb2JqZWN0IGluIHRoZSBkaWN0aW9uYXJ5ICovCitlbnVtIHsKKwlBUFBMSUNBVElPTl9CWV9JRCA9IDIwLAkJLyogIndoYXQiIHBvaW50cyB0byBhIGFwcGxpY2F0aW9uX2lkX3QgKi8KKwlBUFBMSUNBVElPTl9CWV9OQU1FLAkJLyogIndoYXQiIHBvaW50cyB0byBhIGNoYXIgKiAqLworCUFQUExJQ0FUSU9OX09GX1RZUEUsCQkvKiAid2hhdCIgcG9pbnRzIHRvIGEgc3RydWN0IGRpY3Rfb2JqZWN0IGNvbnRhaW5pbmcgYSB0eXBlIG9iamVjdCAoc2VlIGJlbG93KSAqLworCUFQUExJQ0FUSU9OX09GX0NPTU1BTkQJCS8qICJ3aGF0IiBwb2ludHMgdG8gYSBzdHJ1Y3QgZGljdF9vYmplY3QgY29udGFpbmluZyBhIGNvbW1hbmQgKHNlZSBiZWxvdykgKi8KK307CisKKy8qKioKKyAqICBBUEkgdXNhZ2UgOgorCitUaGUgInBhcmVudCIgcGFyYW1ldGVyIG9mIGRpY3RfbmV3IG1heSBwb2ludCB0byBhIHZlbmRvciBvYmplY3QgdG8gaW5mb3JtIG9mIHdoYXQgdmVuZG9yIGRlZmluZXMgdGhlIGFwcGxpY2F0aW9uLgorZm9yIHN0YW5kYXJkLXRyYWNrIGFwcGxpY2F0aW9ucywgdGhlICJwYXJlbnQiIHBhcmFtZXRlciBzaG91bGQgYmUgTlVMTC4KK1RoZSB2ZW5kb3IgYXNzb2NpYXRlZCB0byBhbiBhcHBsaWNhdGlvbiBpcyByZXRyaWV2ZWQgd2l0aCBWRU5ET1JfT0ZfQVBQTElDQVRJT04gc2VhcmNoIGNyaXRlcmlhIG9uIHZlbmRvcnMuCisKKy0gZmRfZGljdF9uZXc6CisgU2FtcGxlIGNvZGUgZm9yIGFwcGxpY2F0aW9uIGNyZWF0aW9uOgorIHsKKwkgaW50IHJldDsKKwkgc3RydWN0IGRpY3Rfb2JqZWN0ICogdmVuZG9yOworCSBzdHJ1Y3QgZGljdF9vYmplY3QgKiBhcHBsOworCSBzdHJ1Y3QgZGljdF92ZW5kb3JfZGF0YSB2ZW5kb3JfZGF0YSA9IHsKKwkJIDIzNDU1LAorCQkgIm15IHZlbmRvciBuYW1lIgorCSB9OworCSBzdHJ1Y3QgZGljdF9hcHBsaWNhdGlvbl9kYXRhIGFwcF9kYXRhID0geworCQkgOTc4OSwKKwkJICJteSB2ZW5kb3IncyBhcHBsaWNhdGlvbiIKKwkgfTsKKwkKKwkgcmV0ID0gZmRfZGljdF9uZXcgKCBkaWN0LCBESUNUX1ZFTkRPUiwgJnZlbmRvcl9kYXRhLCBOVUxMLCAmdmVuZG9yICk7CisJIHJldCA9IGZkX2RpY3RfbmV3ICggZGljdCwgRElDVF9BUFBMSUNBVElPTiwgJmFwcF9kYXRhLCB2ZW5kb3IsICZhcHBsICk7CisgfQorCistIGZkX2RpY3Rfc2VhcmNoOgorIFNhbXBsZSBjb2RlIHRvIHJldHJpZXZlIHRoZSB2ZW5kb3Igb2YgYW4gYXBwbGljYXRpb24KKyB7CisJIGludCByZXQ7CisJIHN0cnVjdCBkaWN0X29iamVjdCAqIHZlbmRvciwgKiBhcHBsaTsKKwkgCisJIHJldCA9IGZkX2RpY3Rfc2VhcmNoICggZGljdCwgRElDVF9BUFBMSUNBVElPTiwgQVBQTElDQVRJT05fQllfTkFNRSwgIm15IHZlbmRvcidzIGFwcGxpY2F0aW9uIiwgJmFwcGxpLCBFTk9FTlQpOworCSByZXQgPSBmZF9kaWN0X3NlYXJjaCAoIGRpY3QsIERJQ1RfVkVORE9SLCBWRU5ET1JfT0ZfQVBQTElDQVRJT04sIGFwcGxpLCAmdmVuZG9yLCBFTk9FTlQpOworIH0KKyAKKyAtIGZkX2RpY3RfZ2V0dmFsOgorIFNhbXBsZSBjb2RlIHRvIHJldHJpZXZlIHRoZSBkYXRhIGZyb20gYW4gYXBwbGljYXRpb24gb2JqZWN0OgorIHsKKwkgaW50IHJldDsKKwkgc3RydWN0IGRpY3Rfb2JqZWN0ICogYXBwbGk7CisJIHN0cnVjdCBkaWN0X2FwcGxpY2F0aW9uX2RhdGEgYXBwbF9kYXRhOworCSByZXQgPSBmZF9kaWN0X3NlYXJjaCAoIGRpY3QsIERJQ1RfQVBQTElDQVRJT04sIEFQUExJQ0FUSU9OX0JZX05BTUUsICJteSB2ZW5kb3IncyBhcHBsaWNhdGlvbiIsICZhcHBsaSwgRU5PRU5UKTsKKwkgcmV0ID0gZmRfZGljdF9nZXR2YWwgKCBhcHBsaSwgJmFwcGxfZGF0YSApOworCSBwcmludGYoIm15IGFwcGxpY2F0aW9uIGlkOiAlc1xuIiwgYXBwbF9kYXRhLmFwcGxpY2F0aW9uX2lkICk7CisgfQorCisqLworCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFR5cGUgb2JqZWN0IAorICoKKyAqIFRoZXNlIHR5cGVzIGFyZSB1c2VkIHRvIG1hbmFnZSBBVlAgZGF0YSB0eXBlcyBpbiB0aGUgZGljdGlvbmFyeQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKiBUeXBlIHRvIHN0b3JlIGFueSBBVlAgdmFsdWUgKi8gCit1bmlvbiBhdnBfdmFsdWUgeworCXN0cnVjdCB7CisJCXVpbnQ4X3QgKmRhdGE7CS8qIGJ5dGVzIGJ1ZmZlciAqLworCQlzaXplX3QgICBsZW47CS8qIGxlbmd0aCBvZiB0aGUgZGF0YSBidWZmZXIgKi8KKwl9ICAgICAgICAgICBvczsJCS8qIFN0b3JhZ2UgZm9yIGFuIG9jdGV0IHN0cmluZyAqLworCWludDMyX3QgICAgIGkzMjsJLyogaW50ZWdlciAzMiAqLworCWludDY0X3QgICAgIGk2NDsJLyogaW50ZWdlciA2NCAqLworCXVpbnQzMl90ICAgIHUzMjsJLyogdW5zaWduZWQgMzIgKi8KKwl1aW50NjRfdCAgICB1NjQ7CS8qIHVuc2lnbmVkIDY0ICovCisJZmxvYXQgICAgICAgZjMyOwkvKiBmbG9hdCAzMiAqLworCWRvdWJsZSAJICAgIGY2NDsJLyogZmxvYXQgNjQgKi8KK307CisKKy8qIFRoZXNlIGFyZSB0aGUgYmFzaWMgQVZQIHR5cGVzIGRlZmluZWQgaW4gUkZDMzU4OGJpcyAqLworZW51bSBkaWN0X2F2cF9iYXNldHlwZSB7CisJQVZQX1RZUEVfR1JPVVBFRCwKKwlBVlBfVFlQRV9PQ1RFVFNUUklORywKKwlBVlBfVFlQRV9JTlRFR0VSMzIsCisJQVZQX1RZUEVfSU5URUdFUjY0LAorCUFWUF9UWVBFX1VOU0lHTkVEMzIsCisJQVZQX1RZUEVfVU5TSUdORUQ2NCwKKwlBVlBfVFlQRV9GTE9BVDMyLAorCUFWUF9UWVBFX0ZMT0FUNjQKKyNkZWZpbmUgQVZQX1RZUEVfTUFYIEFWUF9UWVBFX0ZMT0FUNjQKK307CisKKy8qIENhbGxiYWNrcyB0aGF0IGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggYSBkZXJpdmVkIHR5cGUgdG8gZWFzaWx5IGludGVycHJldCB0aGUgQVZQIHZhbHVlLiAqLworLyoKKyAqIENBTExCQUNLOglkaWN0X2F2cGRhdGFfaW50ZXJwcmV0CisgKgorICogUEFSQU1FVEVSUzoKKyAqICAgdmFsICAgICAgICAgOiBQb2ludGVyIHRvIHRoZSBBVlAgdmFsdWUgdGhhdCBtdXN0IGJlIGludGVycHJldGVkLgorICogICBpbnRlcnByZXRlZCA6IFRoZSByZXN1bHQgb2YgaW50ZXJwcmV0YXRpb24gaXMgc3RvcmVkIGhlcmUuIFRoZSBmb3JtYXQgYW5kIG1lYW5pbmcgZGVwZW5kcyBvbiBlYWNoIHR5cGUuCisgKgorICogREVTQ1JJUFRJT046IAorICogICBUaGlzIGNhbGxiYWNrIGNhbiBiZSBwcm92aWRlZCB3aXRoIGEgZGVyaXZlZCB0eXBlIGluIG9yZGVyIHRvIGZhY2lsaXRhdGUgdGhlIGludGVycHJldGF0aW9uIG9mIGZvcm1hdGVkIGRhdGEuCisgKiAgRm9yIGV4YW1wbGUsIHdoZW4gYW4gQVZQIG9mIHR5cGUgIkFkZHJlc3MiIGlzIHJlY2VpdmVkLCBpdCBjYW4gYmUgdXNlZCB0byBjb252ZXJ0IHRoZSBvY3RldHN0cmluZyBpbnRvIGEgc3RydWN0IHNvY2thZGRyLgorICogIFRoaXMgY2FsbGJhY2sgaXMgbm90IGNhbGxlZCBkaXJlY3RseSwgYnV0IHRocm91Z2ggdGhlIG1lc3NhZ2UncyBBUEkgbXNnX2F2cF92YWx1ZV9pbnRlcnByZXQgZnVuY3Rpb24uCisgKgorICogUkVUVVJOIFZBTFVFOgorICogIDAgICAgICAJOiBPcGVyYXRpb24gY29tcGxldGUuCisgKiAgITAgCQk6IEFuIGVycm9yIG9jY3VycmVkLCB0aGUgZXJyb3IgY29kZSBpcyByZXR1cm5lZC4KKyAqLwordHlwZWRlZiBpbnQgKCpkaWN0X2F2cGRhdGFfaW50ZXJwcmV0KSAodW5pb24gYXZwX3ZhbHVlICogdmFsdWUsIHZvaWQgKiBpbnRlcnByZXRlZCk7CisvKgorICogQ0FMTEJBQ0s6CWRpY3RfYXZwZGF0YV9lbmNvZGUKKyAqCisgKiBQQVJBTUVURVJTOgorICogICBkYXRhCTogVGhlIGZvcm1hdGVkIGRhdGEgdGhhdCBtdXN0IGJlIHN0b3JlZCBpbiB0aGUgQVZQIHZhbHVlLgorICogICB2YWwJOiBQb2ludGVyIHRvIHRoZSBBVlAgdmFsdWUgc3RvcmFnZSBhcmVhIHdoZXJlIHRoZSBkYXRhIG11c3QgYmUgc3RvcmVkLgorICoKKyAqIERFU0NSSVBUSU9OOiAKKyAqICAgVGhpcyBjYWxsYmFjayBjYW4gYmUgcHJvdmlkZWQgd2l0aCBhIGRlcml2ZWQgdHlwZSBpbiBvcmRlciB0byBmYWNpbGl0YXRlIHRoZSBlbmNvZGluZyBvZiBmb3JtYXRlZCBkYXRhLgorICogIEZvciBleGFtcGxlLCBpdCBjYW4gYmUgdXNlZCB0byBjb252ZXJ0IGEgc3RydWN0IHNvY2thZGRyIGluIGFuIEFWUCB2YWx1ZSBvZiB0eXBlIEFkZHJlc3MuCisgKiAgVGhpcyBjYWxsYmFjayBpcyBub3QgY2FsbGVkIGRpcmVjdGx5LCBidXQgdGhyb3VnaCB0aGUgbWVzc2FnZSdzIEFQSSBtc2dfYXZwX3ZhbHVlX2VuY29kZSBmdW5jdGlvbi4KKyAqICBJZiB0aGUgY2FsbGJhY2sgaXMgZGVmaW5lZCBmb3IgYW4gT2N0ZXRTdHJpbmcgYmFzZWQgdHlwZSwgdGhlIGNyZWF0ZWQgc3RyaW5nIG11c3QgYmUgbWFsbG9jJ2QuIGZyZWUgd2lsbCBiZSBjYWxsZWQgCisgKiAgYXV0b21hdGljYWxseSBsYXRlci4KKyAqCisgKiBSRVRVUk4gVkFMVUU6CisgKiAgMCAgICAgIAk6IE9wZXJhdGlvbiBjb21wbGV0ZS4KKyAqICAhMCAJCTogQW4gZXJyb3Igb2NjdXJyZWQsIHRoZSBlcnJvciBjb2RlIGlzIHJldHVybmVkLgorICovCit0eXBlZGVmIGludCAoKmRpY3RfYXZwZGF0YV9lbmNvZGUpICh2b2lkICogZGF0YSwgdW5pb24gYXZwX3ZhbHVlICogdmFsKTsKKworLyoKKyAqIENBTExCQUNLOglkaWN0X2F2cGRhdGFfY2hlY2sKKyAqCisgKiBQQVJBTUVURVJTOgorICogICB2YWwJOiBQb2ludGVyIHRvIHRoZSBBVlAgdmFsdWUgdGhhdCB3YXMgcmVjZWl2ZWQgYW5kIG5lZWRzIHRvIGJlIHNhbml0eSBjaGVja2VkLgorICogICBkYXRhICAgICAgOiBhIHBhcmFtZXRlciBzdG9yZWQgaW4gdGhlIHR5cGUgc3RydWN0dXJlICh0byBlbmFibGUgbW9yZSBnZW5lcmljIGNoZWNrIGZ1bmN0aW9ucykKKyAqICAgZXJyb3JfbXNnOiB1cG9uIGVycm9uZW91cyB2YWx1ZSwgYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZXJyb3IgY2FuIGJlIHJldHVybmVkIGhlcmUgKGl0IHdpbGwgYmUgc3RyY3B5IGJ5IGNhbGxlcikuIFRoaXMgZGVzY3JpcHRpb24gd2lsbCBiZSByZXR1cm5lZCBpbiB0aGUgZXJyb3IgbWVzc2FnZSwgaWYgYW55LiAKKyAqCisgKiBERVNDUklQVElPTjogCisgKiAgIFRoaXMgY2FsbGJhY2sgY2FuIGJlIHByb3ZpZGVkIHdpdGggYSBkZXJpdmVkIHR5cGUgaW4gb3JkZXIgdG8gaW1wcm92ZSB0aGUgb3BlcmF0aW9uIG9mIHRoZQorICogIGZkX21zZ19wYXJzZV9kaWN0IGZ1bmN0aW9uLiBXaGVuIHRoaXMgY2FsbGJhY2sgaXMgcHJlc2VudCwgdGhlIHZhbHVlIG9mIHRoZSBBVlAgdGhhdCBoYXMKKyAqIGJlZW4gcGFyc2VkIGlzIHBhc3NlZCB0byB0aGlzIGZ1bmN0aW9uIGZvciBmaW5lciBncmFudWxhcml0eSBjaGVjay4gRm9yIGV4YW1wbGUgZm9yIHNvbWUgCisgKiBzcGVjY2lmaWMgQVZQLCB0aGUgZm9ybWF0IG9mIGFuIE9DVEVUU1RSSU5HIHZhbHVlIGNhbiBiZSBmdXJ0aGVyIGNoZWNrZWQsIG9yIHRoZQorICogaW50ZXJnZXIgdmFsdWUgY2FuIGJlIHZlcmlmaWVkLgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqICAwICAgICAgCTogVGhlIHZhbHVlIGlzIHZhbGlkLgorICogICEwICAgICAgICAgIDogQW4gZXJyb3Igb2NjdXJyZWQsIHRoZSBlcnJvciBjb2RlIGlzIHJldHVybmVkLiBJdCBpcyBhZHZpc2VkIHRvIHJldHVybiBFSU5WQUwgb24gaW5jb3JyZWN0IHZhbAorICovCit0eXBlZGVmIGludCAoKmRpY3RfYXZwZGF0YV9jaGVjaykgKHZvaWQgKiBkYXRhLCB1bmlvbiBhdnBfdmFsdWUgKiB2YWwsIGNoYXIgKiogZXJyb3JfbXNnKTsKKworCisKKy8qIFR5cGUgdG8gaG9sZCBkYXRhIGFzc29jaWF0ZWQgdG8gYSBkZXJpdmVkIEFWUCBkYXRhIHR5cGUgKi8KK3N0cnVjdCBkaWN0X3R5cGVfZGF0YSB7CisJZW51bSBkaWN0X2F2cF9iYXNldHlwZQkgdHlwZV9iYXNlOwkvKiBIb3cgdGhlIGRhdGEgb2Ygc3VjaCBBVlAgbXVzdCBiZSBpbnRlcnByZXRlZCAqLworCWNoYXIgKgkgCQkgdHlwZV9uYW1lOwkvKiBUaGUgbmFtZSBvZiB0aGlzIHR5cGUgKi8KKwlkaWN0X2F2cGRhdGFfaW50ZXJwcmV0CSB0eXBlX2ludGVycHJldDsvKiBjYiB0byBjb252ZXJ0IHRoZSBBVlAgdmFsdWUgaW4gbW9yZSBjb21wcmVoZW5zaXZlIGZvcm1hdCAob3IgTlVMTCkgKi8KKwlkaWN0X2F2cGRhdGFfZW5jb2RlCSB0eXBlX2VuY29kZTsJLyogY2IgdG8gY29udmVydCBmb3JtYXR0ZWQgZGF0YSBpbnRvIGFuIEFWUCB2YWx1ZSAob3IgTlVMTCkgKi8KKwlERUNMQVJFX0ZEX0RVTVBfUFJPVE9UWVBFKCgqdHlwZV9kdW1wKSwgdW5pb24gYXZwX3ZhbHVlICogdmFsKTsgLyogY2IgY2FsbGVkIGJ5IGZkX21zZ19kdW1wXyogZm9yIHRoaXMgdHlwZSBvZiBkYXRhIChpZiAhPSBOVUxMKS4gUmV0dXJuZWQgc3RyaW5nIG11c3QgYmUgZnJlZWQuICAqLworCWRpY3RfYXZwZGF0YV9jaGVjayAgICAgICB0eXBlX2NoZWNrOworCXZvaWQgICogICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVfY2hlY2tfcGFyYW07Cit9OworCisvKiBUaGUgY3JpdGVyaWEgZm9yIHNlYXJjaGluZyBhIHR5cGUgb2JqZWN0IGluIHRoZSBkaWN0aW9uYXJ5ICovCitlbnVtIHsKKwlUWVBFX0JZX05BTUUgPSAzMCwJCS8qICJ3aGF0IiBwb2ludHMgdG8gYSBjaGFyICogKi8KKwlUWVBFX09GX0VOVU1WQUwsCQkvKiAid2hhdCIgcG9pbnRzIHRvIGEgc3RydWN0IGRpY3Rfb2JqZWN0IGNvbnRhaW5pbmcgYW4gZW51bWVyYXRlZCBjb25zdGFudCAoRElDVF9FTlVNVkFMLCBzZWUgYmVsb3cpLiAqLworCVRZUEVfT0ZfQVZQCQkJLyogIndoYXQiIHBvaW50cyB0byBhIHN0cnVjdCBkaWN0X29iamVjdCBjb250YWluaW5nIGFuIEFWUCBvYmplY3QuICovCit9OworCisvKioqKgorIENhbGxiYWNrcyBkZWZpbmVkIGluIGxpYmZkcHJvdG8vZGljdGlvbmFyeV9mdW5jdGlvbnMuYyBmaWxlIC0tIHNlZSB0aGF0IGZpbGUgZm9yIHVzYWdlLiAKKyAqLworCisvKiBDb252ZXJ0IGFuIEFkZHJlc3MgdHlwZSBBVlAgaW50byBhIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICovCitpbnQgZmRfZGljdGZjdF9BZGRyZXNzX2VuY29kZSh2b2lkICogZGF0YSwgdW5pb24gYXZwX3ZhbHVlICogYXZwX3ZhbHVlKTsKK2ludCBmZF9kaWN0ZmN0X0FkZHJlc3NfaW50ZXJwcmV0KHVuaW9uIGF2cF92YWx1ZSAqIGF2cF92YWx1ZSwgdm9pZCAqIGludGVycHJldGVkKTsKK0RFQ0xBUkVfRkRfRFVNUF9QUk9UT1RZUEUoZmRfZGljdGZjdF9BZGRyZXNzX2R1bXAsIHVuaW9uIGF2cF92YWx1ZSAqIGF2cF92YWx1ZSk7CisKKy8qIERpc3BsYXkgdGhlIGNvbnRlbnQgb2YgYW4gQVZQIG9mIHR5cGUgVVRGOFN0cmluZyBpbiB0aGUgbG9nIGZpbGUgKi8KK0RFQ0xBUkVfRkRfRFVNUF9QUk9UT1RZUEUoZmRfZGljdGZjdF9VVEY4U3RyaW5nX2R1bXAsIHVuaW9uIGF2cF92YWx1ZSAqIGF2cF92YWx1ZSk7CisKKy8qIEZvciBUaW1lIEFWUHMsIG1hcCB3aXRoIHRpbWVfdCB2YWx1ZSBkaXJlY3RseSAqLworaW50IGZkX2RpY3RmY3RfVGltZV9lbmNvZGUodm9pZCAqIGRhdGEsIHVuaW9uIGF2cF92YWx1ZSAqIGF2cF92YWx1ZSk7CitpbnQgZmRfZGljdGZjdF9UaW1lX2ludGVycHJldCh1bmlvbiBhdnBfdmFsdWUgKiBhdnBfdmFsdWUsIHZvaWQgKiBpbnRlcnByZXRlZCk7CitERUNMQVJFX0ZEX0RVTVBfUFJPVE9UWVBFKGZkX2RpY3RmY3RfVGltZV9kdW1wLCB1bmlvbiBhdnBfdmFsdWUgKiBhdnBfdmFsdWUpOworCisKKy8qIEZvciBzdHJpbmcgQVZQLCB0aGUgZm9sbG93aW5nIHR5cGVfY2hlY2sgZnVuY3Rpb24gcHJvdmlkZXMgc2ltcGxlIGJhc2ljIGNoZWNrIGZvciBzcGVjaWZpYyBjaGFyYWN0ZXJzIHByZXNlbmNlLCBlLmcuIHVzZSAiQC4iIGZvciB0cml2aWFsIGVtYWlsIGFkZHJlc3MgY2hlY2sgKi8KK2ludCBmZF9kaWN0ZmN0X0NoYXJJbk9TX2NoZWNrKHZvaWQgKiBkYXRhLCB1bmlvbiBhdnBfdmFsdWUgKiB2YWwsIGNoYXIgKiogZXJyb3JfbXNnKTsKKworCisvKioqKi8KKworLyoqKgorICogIEFQSSB1c2FnZSA6CisKKy0gZmRfZGljdF9uZXc6CisgVGhlICJwYXJlbnQiIHBhcmFtZXRlciBtYXkgcG9pbnQgdG8gYW4gYXBwbGljYXRpb24gb2JqZWN0LCB3aGVuIGEgdHlwZSBpcyBkZWZpbmVkIGJ5IGEgRGlhbWV0ZXIgYXBwbGljYXRpb24uIAorIAorIFNhbXBsZSBjb2RlOgorIHsKKwkgaW50IHJldDsKKwkgc3RydWN0IGRpY3Rfb2JqZWN0ICogbXl0eXBlOworCSBzdHJ1Y3QgZGljdF90eXBlX2RhdGEgbXl0eXBlZGF0YSA9IAorCQl7IAorCQkgQVZQX1RZUEVfT0NURVRTVFJJTkcsCisJCSAiQWRkcmVzcyIsCisJCSBOVUxMLAorCQkgTlVMTAorCQl9OworCSByZXQgPSBmZF9kaWN0X25ldyAoIGRpY3QsIERJQ1RfVFlQRSwgJm15dHlwZWRhdGEsIE5VTEwsICZteXR5cGUgKTsKKyB9CisKKy0gZmRfZGljdF9zZWFyY2g6CisgU2FtcGxlIGNvZGU6CisgeworCSBpbnQgcmV0OworCSBzdHJ1Y3QgZGljdF9vYmplY3QgKiBhZGRyZXNzX3R5cGU7CisJIHJldCA9IGZkX2RpY3Rfc2VhcmNoICggZGljdCwgRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJBZGRyZXNzIiwgJmFkZHJlc3NfdHlwZSwgRU5PRU5UKTsKKyB9CisgCisqLworCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEVudW1lcmF0ZWQgdmFsdWVzIG9iamVjdCAKKyAqCisgKiBUaGVzZSB0eXBlcyBhcmUgdXNlZCB0byBtYW5hZ2UgbmFtZWQgY29uc3RhbnRzIG9mIHNvbWUgQVZQLAorICogZm9yIGVudW1lcmF0ZWQgdHlwZXMuIGZyZWVEaWFtZXRlciBhbGxvd3MgY29uc3RhbnRzIGZvciB0eXBlcyBvdGhlcnMgdGhhbiBVbnNpZ25lZDMyCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qIFR5cGUgdG8gaG9sZCBkYXRhIG9mIG5hbWVkIGNvbnN0YW50cyBmb3IgQVZQICovCitzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgeworCWNoYXIgKgkgCSBlbnVtX25hbWU7CS8qIFRoZSBuYW1lIG9mIHRoaXMgY29uc3RhbnQgKi8KKwl1bmlvbiBhdnBfdmFsdWUgIGVudW1fdmFsdWU7CS8qIFZhbHVlIG9mIHRoZSBjb25zdGFudC4gVW5pb24gdGVybSBkZXBlbmRzIG9uIHBhcmVudCB0eXBlJ3MgYmFzZSB0eXBlLiAqLworfTsKKworLyogVGhlIGNyaXRlcmlhIGZvciBzZWFyY2hpbmcgYSBjb25zdGFudCBpbiB0aGUgZGljdGlvbmFyeSAqLworZW51bSB7CisJRU5VTVZBTF9CWV9TVFJVQ1QgPSA0MCwJLyogIndoYXQiIHBvaW50cyB0byBhIHN0cnVjdCBkaWN0X2VudW12YWxfcmVxdWVzdCBhcyBkZWZpbmVkIGJlbG93ICovCisJRU5VTVZBTF9CWV9OQU1FLAkvKiBUaGlzIGNhbm5vdCBiZSB1c2VkIGZvciByZXNlYXJjaGVzICovCisJRU5VTVZBTF9CWV9WQUxVRQkvKiBUaGlzIGNhbm5vdCBiZSB1c2VkIGZvciByZXNlYXJjaGVzICovCit9OworCitzdHJ1Y3QgZGljdF9lbnVtdmFsX3JlcXVlc3QgeworCS8qIElkZW50aWZpZXIgb2YgdGhlIHBhcmVudCB0eXBlLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBtdXN0IG5vdCBiZSBOVUxMICovCisJc3RydWN0IGRpY3Rfb2JqZWN0CSp0eXBlX29iajsKKwljaGFyICoJCQkgdHlwZV9uYW1lOworCQorCS8qIFNlYXJjaCBjcml0ZXJpYSBmb3IgdGhlIGNvbnN0YW50ICovCisJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIHNlYXJjaDsgLyogc2VhcmNoLmVudW1fdmFsdWUgaXMgdXNlZCBvbmx5IGlmIHNlYXJjaC5lbnVtX25hbWUgPT0gTlVMTCAqLworfTsKKworLyoqKgorICogIEFQSSB1c2FnZSA6CisKKy0gZmRfZGljdF9uZXc6CisgVGhlICJwYXJlbnQiIHBhcmFtZXRlciBtdXN0IHBvaW50IHRvIGEgZGVyaXZlZCB0eXBlIG9iamVjdC4gCisgU2FtcGxlIGNvZGUgdG8gY3JlYXRlIGEgdHlwZSAiQm9vbGVhbiIgd2l0aCB0d28gY29uc3RhbnRzICJUcnVlIiBhbmQgIkZhbHNlIjoKKyB7CisJIGludCByZXQ7CisJIHN0cnVjdCBkaWN0X29iamVjdCAqIHR5cGVfYm9vbGVhbjsKKwkgc3RydWN0IGRpY3RfdHlwZV9kYXRhIHR5cGVfYm9vbGVhbl9kYXRhID0gCisJCXsgCisJCSBBVlBfVFlQRV9JTlRFR0VSMzIsCisJCSAiQm9vbGVhbiIsCisJCSBOVUxMLAorCQkgTlVMTAorCQl9OworCSBzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgYm9vbGVhbl9mYWxzZSA9CisJIAl7CisJCSAuZW51bV9uYW1lPSJGYWxzZSIsCisJCSAuZW51bV92YWx1ZS5pMzIgPSAwCisJIAl9OworCSBzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgYm9vbGVhbl90cnVlID0KKwkgCXsKKwkJIC5lbnVtX25hbWU9IlRydWUiLAorCQkgLmVudW1fdmFsdWUuaTMyID0gLTEKKwkgCX07CisJIHJldCA9IGZkX2RpY3RfbmV3ICggZGljdCwgRElDVF9UWVBFLCAmdHlwZV9ib29sZWFuX2RhdGEsIE5VTEwsICZ0eXBlX2Jvb2xlYW4gKTsKKwkgcmV0ID0gZmRfZGljdF9uZXcgKCBkaWN0LCBESUNUX0VOVU1WQUwsICZib29sZWFuX2ZhbHNlLCB0eXBlX2Jvb2xlYW4sIE5VTEwgKTsKKwkgcmV0ID0gZmRfZGljdF9uZXcgKCBkaWN0LCBESUNUX0VOVU1WQUwsICZib29sZWFuX3RydWUgLCB0eXBlX2Jvb2xlYW4sIE5VTEwgKTsKKwkgCisgfQorCistIGZkX2RpY3Rfc2VhcmNoOgorIFNhbXBsZSBjb2RlIHRvIGxvb2sgZm9yIGEgY29uc3RhbnQgbmFtZSwgYnkgaXRzIHZhbHVlOgorIHsKKwkgaW50IHJldDsKKwkgc3RydWN0IGRpY3Rfb2JqZWN0ICogdmFsdWVfZm91bmQ7CisJIHN0cnVjdCBkaWN0X2VudW12YWxfcmVxdWVzdCBib29sZWFuX2J5X3ZhbHVlID0KKwkgCXsKKwkJIC50eXBlX25hbWUgPSAiQm9vbGVhbiIsCisJCSAuc2VhcmNoLmVudW1fbmFtZT1OVUxMLAorCQkgLnNlYXJjaC5lbnVtX3ZhbHVlLmkzMiA9IC0xCisJIAl9OworCSAKKwkgcmV0ID0gZmRfZGljdF9zZWFyY2ggKCBkaWN0LCBESUNUX0VOVU1WQUwsIEVOVU1WQUxfQllfU1RSVUNULCAmYm9vbGVhbl9ieV92YWx1ZSwgJnZhbHVlX2ZvdW5kLCBFTk9FTlQpOworIH0KKyAKKyAtIGZkX2RpY3RfZ2V0dmFsOgorIFNhbXBsZSBjb2RlIHRvIHJldHJpZXZlIHRoZSBkYXRhIGZyb20gYSBjb25zdGFudCBvYmplY3Q6CisgeworCSBpbnQgcmV0OworCSBzdHJ1Y3QgZGljdF9vYmplY3QgKiB2YWx1ZV9mb3VuZDsKKwkgc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIGJvb2xlYW5fZGF0YSA9IE5VTEw7CisJIHN0cnVjdCBkaWN0X2VudW12YWxfcmVxdWVzdCBib29sZWFuX2J5X3ZhbHVlID0KKwkgCXsKKwkJIC50eXBlX25hbWUgPSAiQm9vbGVhbiIsCisJCSAuc2VhcmNoLmVudW1fbmFtZT1OVUxMLAorCQkgLnNlYXJjaC5lbnVtX3ZhbHVlLmkzMiA9IDAKKwkgCX07CisJIAorCSByZXQgPSBmZF9kaWN0X3NlYXJjaCAoIGRpY3QsIERJQ1RfRU5VTVZBTCwgRU5VTVZBTF9CWV9TVFJVQ1QsICZib29sZWFuX2J5X3ZhbHVlLCAmdmFsdWVfZm91bmQsIEVOT0VOVCk7CisJIHJldCA9IGZkX2RpY3RfZ2V0dmFsICggdmFsdWVfZm91bmQsICZib29sZWFuX2RhdGEgKTsKKwkgcHJpbnRmKCIgQm9vbGVhbiB3aXRoIHZhbHVlIDA6ICVzIiwgYm9vbGVhbl9kYXRhLmVudW1fbmFtZSApOworIH0KKyovCisJIAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBBVlAgb2JqZWN0IAorICoKKyAqIFRoZXNlIG9iamVjdHMgYXJlIHVzZWQgdG8gbWFuYWdlIEFWUCBkZWZpbml0aW9ucyBpbiB0aGUgZGljdGlvbmFyeQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKiBUeXBlIHRvIGhvbGQgYW4gQVZQIGNvZGUuIEZvciB2ZW5kb3IgMCwgdGhlc2UgY29kZXMgYXJlIGFzc2lnbmVkIGJ5IElBTkEuIE90aGVyd2lzZSwgaXQgaXMgbWFuYWdlZCBieSB0aGUgdmVuZG9yICovCit0eXBlZGVmIHVpbnQzMl90CWF2cF9jb2RlX3Q7CisKKy8qIFZhbHVlcyBvZiBBVlAgZmxhZ3MgKi8KKyNkZWZpbmUJQVZQX0ZMQUdfVkVORE9SCSAgCTB4ODAKKyNkZWZpbmUJQVZQX0ZMQUdfTUFOREFUT1JZCTB4NDAKKyNkZWZpbmUJQVZQX0ZMQUdfUkVTRVJWRUQzCTB4MjAKKyNkZWZpbmUJQVZQX0ZMQUdfUkVTRVJWRUQ0CTB4MTAKKyNkZWZpbmUJQVZQX0ZMQUdfUkVTRVJWRUQ1CTB4MDgKKyNkZWZpbmUJQVZQX0ZMQUdfUkVTRVJWRUQ2CTB4MDQKKyNkZWZpbmUJQVZQX0ZMQUdfUkVTRVJWRUQ3CTB4MDIKKyNkZWZpbmUJQVZQX0ZMQUdfUkVTRVJWRUQ4CTB4MDEKKworLyogRm9yIGR1bXBpbmcgZmxhZ3MgYW5kIHZhbHVlcyAqLworI2RlZmluZSBEVU1QX0FWUEZMX3N0cgkiJWMlYyVzJXMlcyVzJXMlcyIKKyNkZWZpbmUgRFVNUF9BVlBGTF92YWwoX3ZhbCkgKF92YWwgJiBBVlBfRkxBR19WRU5ET1IpPydWJzonLScgLCAoX3ZhbCAmIEFWUF9GTEFHX01BTkRBVE9SWSk/J00nOictJywJXAorCQkJCShfdmFsICYgQVZQX0ZMQUdfUkVTRVJWRUQzKT8iMyI6IiIsIChfdmFsICYgQVZQX0ZMQUdfUkVTRVJWRUQ0KT8iNCI6IiIsIFwKKwkJCQkoX3ZhbCAmIEFWUF9GTEFHX1JFU0VSVkVENSk/IjUiOiIiLCAoX3ZhbCAmIEFWUF9GTEFHX1JFU0VSVkVENik/IjYiOiIiLCAoX3ZhbCAmIEFWUF9GTEFHX1JFU0VSVkVENyk/IjciOiIiLCAoX3ZhbCAmIEFWUF9GTEFHX1JFU0VSVkVEOCk/IjgiOiIiCisKKy8qIFR5cGUgdG8gaG9sZCBkYXRhIGFzc29jaWF0ZWQgdG8gYW4gYXZwICovCitzdHJ1Y3QgZGljdF9hdnBfZGF0YSB7CisJYXZwX2NvZGVfdAkgCSBhdnBfY29kZTsJLyogQ29kZSBvZiB0aGUgYXZwICovCisJdmVuZG9yX2lkX3QJIAkgYXZwX3ZlbmRvcjsJLyogVmVuZG9yIG9mIHRoZSBBVlAsIG9yIDAgKi8KKwljaGFyICoJCQkgYXZwX25hbWU7CS8qIE5hbWUgb2YgdGhpcyBBVlAgKi8KKwl1aW50OF90CQkgCSBhdnBfZmxhZ19tYXNrOwkvKiBNYXNrIG9mIGZpeGVkIEFWUCBmbGFncyAqLworCXVpbnQ4X3QJCSAJIGF2cF9mbGFnX3ZhbDsJLyogVmFsdWVzIG9mIHRoZSBmaXhlZCBmbGFncyAqLworCWVudW0gZGljdF9hdnBfYmFzZXR5cGUgCSBhdnBfYmFzZXR5cGU7CS8qIEJhc2ljIHR5cGUgb2YgZGF0YSBmb3VuZCBpbiB0aGUgQVZQICovCit9OworCisvKiBUaGUgY3JpdGVyaWEgZm9yIHNlYXJjaGluZyBhbiBhdnAgb2JqZWN0IGluIHRoZSBkaWN0aW9uYXJ5ICovCitlbnVtIHsKKwlBVlBfQllfQ09ERSA9IDUwLAkvKiAid2hhdCIgcG9pbnRzIHRvIGFuIGF2cF9jb2RlX3QsIHZlbmRvciBpcyBhbHdheXMgMCAqLworCUFWUF9CWV9OQU1FLAkJLyogIndoYXQiIHBvaW50cyB0byBhIGNoYXIgKiwgdmVuZG9yIGlzIGFsd2F5cyAwICovCisJQVZQX0JZX05BTUVfQUxMX1ZFTkRPUlMsLyogIndoYXQiIHBvaW50cyB0byBhIHN0cmluZy4gTWlnaHQgYmUgcXVpdGUgc2xvdy4uLiAqLworCUFWUF9CWV9TVFJVQ1QsCQkvKiAid2hhdCIgcG9pbnRzIHRvIGEgc3RydWN0IGRpY3RfYXZwX3JlcXVlc3RfZXggKHNlZSBiZWxvdykgKi8KKwkJCQorCS8qIGtlcHQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIGJldHRlciB1c2UgQVZQX0JZX1NUUlVDVCBhYm92ZSBpbnN0ZWFkICovCisJQVZQX0JZX0NPREVfQU5EX1ZFTkRPUiwJLyogIndoYXQiIHBvaW50cyB0byBhIHN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IChzZWUgYmVsb3cpLCB3aGVyZSBhdnBfdmVuZG9yIGFuZCBhdnBfY29kZSBhcmUgc2V0ICovCisJQVZQX0JZX05BTUVfQU5EX1ZFTkRPUgkvKiAid2hhdCIgcG9pbnRzIHRvIGEgc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgKHNlZSBiZWxvdyksIHdoZXJlIGF2cF92ZW5kb3IgYW5kIGF2cF9uYW1lIGFyZSBzZXQgKi8KK307CisKKy8qIFN0cnVjdCB1c2VkIGZvciBzb21lIHJlc2VhcmNocyAqLworc3RydWN0IGRpY3RfYXZwX3JlcXVlc3RfZXggeworCXN0cnVjdCB7CisJCS8qIE9ubHkgb25lIG9mIHRoZSBmb2xsb3dpbmcgZmllbGRzIG11c3QgYmUgc2V0LiAqLworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiAJdmVuZG9yOwkJLyogbW9zdCBlZmZpY2llbnQgaWYgYWxyZWFkeSBrbm93biwgc2V0IHRvIE5VTEwgdG8gaWdub3JlICovCisJCXZlbmRvcl9pZF90CSAJdmVuZG9yX2lkOyAJLyogc2V0IHRvIDAgdG8gaWdub3JlIC0tIHByZWZlciBBVlBfQllfQ09ERSBvciBBVlBfQllfTkFNRSBmb3IgdmVuZG9yIDAgKi8KKwkJY29uc3QgY2hhciAqCQkJdmVuZG9yX25hbWU7CS8qIHNldCB0byBOVUxMIHRvIGlnbm9yZSAqLworCX0gYXZwX3ZlbmRvcjsKKwkKKwlzdHJ1Y3QgeworCQkvKiBPbmx5IG9uZSBvZiB0aGUgZm9sbG93aW5nIGZpZWxkcyBtdXN0IGJlIHNldCAqLworCQlhdnBfY29kZV90CSBhdnBfY29kZTsgLyogc2V0IHRvIDAgdG8gaWdub3JlICovCisJCWNvbnN0IGNoYXIgKgkJIGF2cF9uYW1lOyAvKiBzZXQgdG8gTlVMTCB0byBpZ25vcmUgKi8KKwl9IGF2cF9kYXRhOworfTsKKworc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgeworCXZlbmRvcl9pZF90CSBhdnBfdmVuZG9yOworCWF2cF9jb2RlX3QJIGF2cF9jb2RlOworCWNoYXIgKgkJIGF2cF9uYW1lOworfTsKKworCisKKy8qKioKKyAqICBBUEkgdXNhZ2UgOgorCitJZiAicGFyZW50IiBwYXJhbWV0ZXIgaXMgbm90IE5VTEwgZHVyaW5nIEFWUCBjcmVhdGlvbiwgaXQgbXVzdCBwb2ludCB0byBhIERJQ1RfVFlQRSBvYmplY3QuIAorVGhlIGV4dGVuZGVkIHR5cGUgaXMgdGhlbiBhdHRhY2hlZCB0byB0aGUgQVZQLiBJbiBjYXNlIHdoZXJlIGl0IGlzIGFuIGVudW1lcmF0ZWQgdHlwZSwgdGhlIHZhbHVlIG9mIAorQVZQIGlzIGF1dG9tYXRpY2FsbHkgaW50ZXJwcmV0ZWQgaW4gZGVidWcgbWVzc2FnZXMsIGFuZCBpbiBtZXNzYWdlIGNoZWNrcy4KK1RoZSBkZXJpdmVkIHR5cGUgb2YgYW4gQVZQIGNhbiBiZSByZXRyaWV2ZWQgd2l0aDogZGljdF9zZWFyY2ggKCBESUNUX1RZUEUsIFRZUEVfT0ZfQVZQLCBhdnAsIC4uLiApCisKK1RvIGNyZWF0ZSB0aGUgcnVsZXMgKEFCTkYpIGZvciBjaGlsZHJlbiBvZiBHcm91cGVkIEFWUCwgc2VlIHRoZSBESUNUX1JVTEUgcmVsYXRlZCBwYXJ0LgorCistIGZkX2RpY3RfbmV3OgorIFNhbXBsZSBjb2RlIGZvciBBVlAgY3JlYXRpb246CisgeworCSBpbnQgcmV0OworCSBzdHJ1Y3QgZGljdF9vYmplY3QgKiB1c2VyX25hbWVfYXZwOworCSBzdHJ1Y3QgZGljdF9vYmplY3QgKiBib29sZWFuX3R5cGU7CisJIHN0cnVjdCBkaWN0X29iamVjdCAqIHNhbXBsZV9ib29sZWFuX2F2cDsKKwkgc3RydWN0IGRpY3RfYXZwX2RhdGEgdXNlcl9uYW1lX2RhdGEgPSB7CisJCSAxLAkJCQkJLy8gY29kZQorCQkgMCwJCQkJCS8vIHZlbmRvcgorCQkgIlVzZXItTmFtZSIsCQkJCS8vIG5hbWUKKwkJIEFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwJLy8gZml4ZWQgbWFzazogViBhbmQgTSB2YWx1ZXMgbXVzdCBhbHdheXMgYmUgZGVmaW5lZCBhcyBmb2xsb3cuIG90aGVyIGZsYWdzIGNhbiBiZSBzZXQgb3IgY2xlYXJlZAorCQkgQVZQX0ZMQUdfTUFOREFUT1JZLAkJCS8vIHRoZSBWIGZsYWcgbXVzdCBiZSBjbGVhcmVkLCB0aGUgTSBmbGFnIG11c3QgYmUgc2V0LgorCQkgQVZQX1RZUEVfT0NURVRTVFJJTkcJCQkvLyBVc2VyLU5hbWUgQVZQIGNvbnRhaW5zIE9jdGV0U3RyaW5nIGRhdGEgKGZ1cnRoZXIgcHJlY2lzaW9uIHN1Y2ggYXMgVVRGOFN0cmluZyBjYW4gYmUgZ2l2ZW4gd2l0aCBhIHBhcmVudCBkZXJpdmVkIHR5cGUpCisJIH07CisJIHN0cnVjdCBkaWN0X2F2cF9kYXRhIHNhbXBsZV9ib29sZWFuX2RhdGEgPSB7CisJCSAzMTMzNywKKwkJIDIzNDU1LAorCQkgIlNhbXBsZS1Cb29sZWFuIiwKKwkJIEFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwKKwkJIEFWUF9GTEFHX1ZFTkRPUiwKKwkJIEFWUF9UWVBFX0lOVEVHRVIzMgkJCS8vIFRoaXMgTVVTVCBiZSB0aGUgc2FtZSBhcyBwYXJlbnQgdHlwZSdzCisJIH07CisJCisgCSAtLSBDcmVhdGUgYW4gQVZQIHdpdGggYSBiYXNlIHR5cGUgLS0KKwkgcmV0ID0gZmRfZGljdF9uZXcgKCBkaWN0LCBESUNUX0FWUCwgJnVzZXJfbmFtZV9kYXRhLCBOVUxMLCAmdXNlcl9uYW1lX2F2cCApOworCSAKKwkgLS0gQ3JlYXRlIGFuIEFWUCB3aXRoIGEgZGVyaXZlZCB0eXBlIC0tCisJIHJldCA9IGZkX2RpY3Rfc2VhcmNoICggZGljdCwgRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJCb29sZWFuIiwgJmJvb2xlYW5fdHlwZSwgRU5PRU5UKTsKKwkgcmV0ID0gZmRfZGljdF9uZXcgKCBkaWN0LCBESUNUX0FWUCwgJnNhbXBsZV9ib29sZWFuX2RhdGEgLCBib29sZWFuX3R5cGUsICZzYW1wbGVfYm9vbGVhbl9hdnAgKTsKKwkgCisgfQorCistIGZkX2RpY3Rfc2VhcmNoOgorIFNhbXBsZSBjb2RlIHRvIGxvb2sgZm9yIGFuIEFWUAorIHsKKwkgaW50IHJldDsKKwkgc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwX3VzZXJuYW1lOworCSBzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnBfc2FtcGxlYm9vbGVhbjsKKwkgc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgYXZwdmVuZG9yYm9vbGVhbiA9CisJIAl7CisJCSAuYXZwX3ZlbmRvciA9IDIzNDU1LAorCQkgLmF2cF9uYW1lICAgPSAiU2FtcGxlLUJvb2xlYW4iCisJIAl9OworCSAKKwkgcmV0ID0gZmRfZGljdF9zZWFyY2ggKCBkaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJVc2VyLU5hbWUiLCAmYXZwX3VzZXJuYW1lLCBFTk9FTlQpOworCSAKKwkgcmV0ID0gZmRfZGljdF9zZWFyY2ggKCBkaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJmF2cHZlbmRvcmJvb2xlYW4sICZhdnBfc2FtcGxlYm9vbGVhbiwgRU5PRU5UKTsKKworCSAtLSB0aGlzIHdvdWxkIGFsc28gd29yaywgYnV0IGJlIHNsb3dlciwgYmVjYXVzZSBpdCBoYXMgdG8gc2VhcmNoIGFsbCB2ZW5kb3IgZGljdGlvbmFyaWVzIC0tCisJIHJldCA9IGZkX2RpY3Rfc2VhcmNoICggZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FX0FMTF9WRU5ET1JTLCAiU2FtcGxlLUJvb2xlYW4iLCAmYXZwX3NhbXBsZWJvb2xlYW4sIEVOT0VOVCk7CisJIAorIH0KKyAKKyAtIGZkX2RpY3RfZ2V0dmFsOgorIFNhbXBsZSBjb2RlIHRvIHJldHJpZXZlIHRoZSBkYXRhIGZyb20gYW4gQVZQIG9iamVjdDoKKyB7CisJIGludCByZXQ7CisJIHN0cnVjdCBkaWN0X29iamVjdCAqIGF2cF91c2VybmFtZTsKKwkgc3RydWN0IGRpY3RfYXZwX2RhdGEgdXNlcl9uYW1lX2RhdGE7CisJIHJldCA9IGZkX2RpY3Rfc2VhcmNoICggZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiVXNlci1OYW1lIiwgJmF2cF91c2VybmFtZSwgRU5PRU5UKTsKKwkgcmV0ID0gZmRfZGljdF9nZXR2YWwgKCBhdnBfdXNlcm5hbWUsICZ1c2VyX25hbWVfZGF0YSApOworCSBwcmludGYoIlVzZXItTmFtZSBjb2RlOiAlZFxuIiwgdXNlcl9uYW1lX2RhdGEuYXZwX2NvZGUgKTsKKyB9CisKKyovCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29tbWFuZCBvYmplY3QgCisgKgorICogVGhlc2UgdHlwZXMgYXJlIHVzZWQgdG8gbWFuYWdlIGNvbW1hbmRzIG9iamVjdHMgaW4gdGhlIGRpY3Rpb25hcnkKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyogVHlwZSB0byBob2xkIGEgRGlhbWV0ZXIgY29tbWFuZCBjb2RlOiBJQU5BIGFzc2lnbmVkIHZhbHVlcy4gMHgwLTB4N2ZmZmZmPXN0YW5kYXJkLCAweDgwMDAwMC0weGZmZmZmZD12ZW5kb3JzLCAweGZmZmZmZS0weGZmZmZmZj1leHBlcmltZW50YWwgKi8KK3R5cGVkZWYgdWludDMyX3QJY29tbWFuZF9jb2RlX3Q7CisKKy8qIFZhbHVlcyBvZiBjb21tYW5kIGZsYWdzICovCisjZGVmaW5lIENNRF9GTEFHX1JFUVVFU1QJMHg4MAorI2RlZmluZSBDTURfRkxBR19QUk9YSUFCTEUJMHg0MAorI2RlZmluZSBDTURfRkxBR19FUlJPUgkJMHgyMAorI2RlZmluZSBDTURfRkxBR19SRVRSQU5TTUlUCTB4MTAKKyNkZWZpbmUgQ01EX0ZMQUdfUkVTRVJWRUQ1CTB4MDgKKyNkZWZpbmUgQ01EX0ZMQUdfUkVTRVJWRUQ2CTB4MDQKKyNkZWZpbmUgQ01EX0ZMQUdfUkVTRVJWRUQ3CTB4MDIKKyNkZWZpbmUgQ01EX0ZMQUdfUkVTRVJWRUQ4CTB4MDEKKworLyogRm9yIGR1bXBpbmcgZmxhZ3MgYW5kIHZhbHVlcyAqLworI2RlZmluZSBEVU1QX0NNREZMX3N0cgkiJWMlYyVjJWMlcyVzJXMlcyIKKyNkZWZpbmUgRFVNUF9DTURGTF92YWwoX3ZhbCkgKF92YWwgJiBDTURfRkxBR19SRVFVRVNUKT8nUic6Jy0nICwgKF92YWwgJiBDTURfRkxBR19QUk9YSUFCTEUpPydQJzonLScgLCAoX3ZhbCAmIENNRF9GTEFHX0VSUk9SKT8nRSc6Jy0nICwgKF92YWwgJiBDTURfRkxBR19SRVRSQU5TTUlUKT8nVCc6Jy0nLCBcCisJCQkJKF92YWwgJiBDTURfRkxBR19SRVNFUlZFRDUpPyI1IjoiIiwgKF92YWwgJiBDTURfRkxBR19SRVNFUlZFRDYpPyI2IjoiIiwgKF92YWwgJiBDTURfRkxBR19SRVNFUlZFRDcpPyI3IjoiIiwgKF92YWwgJiBDTURfRkxBR19SRVNFUlZFRDgpPyI4IjoiIgorCisvKiBUeXBlIHRvIGhvbGQgZGF0YSBhc3NvY2lhdGVkIHRvIGEgY29tbWFuZCAqLworc3RydWN0IGRpY3RfY21kX2RhdGEgeworCWNvbW1hbmRfY29kZV90CSBjbWRfY29kZTsJLyogY29kZSBvZiB0aGUgY29tbWFuZCAqLworCWNoYXIgKgkJIGNtZF9uYW1lOwkvKiBOYW1lIG9mIHRoZSBjb21tYW5kICovCisJdWludDhfdAkJIGNtZF9mbGFnX21hc2s7CS8qIE1hc2sgb2YgZml4ZWQtdmFsdWUgZmxhZ3MgKi8KKwl1aW50OF90CQkgY21kX2ZsYWdfdmFsOwkvKiB2YWx1ZXMgb2YgdGhlIGZpeGVkIGZsYWdzICovCit9OworCisvKiBUaGUgY3JpdGVyaWEgZm9yIHNlYXJjaGluZyBhbiBhdnAgb2JqZWN0IGluIHRoZSBkaWN0aW9uYXJ5ICovCitlbnVtIHsKKwlDTURfQllfTkFNRSA9IDYwLAkvKiAid2hhdCIgcG9pbnRzIHRvIGEgY2hhciAqICovCisJQ01EX0JZX0NPREVfUiwJCS8qICJ3aGF0IiBwb2ludHMgdG8gYSBjb21tYW5kX2NvZGVfdC4gVGhlICJSZXF1ZXN0IiBjb21tYW5kIGlzIHJldHVybmVkLiAqLworCUNNRF9CWV9DT0RFX0EsCQkvKiAid2hhdCIgcG9pbnRzIHRvIGEgY29tbWFuZF9jb2RlX3QuIFRoZSAiQW5zd2VyIiBjb21tYW5kIGlzIHJldHVybmVkLiAqLworCUNNRF9BTlNXRVIJCS8qICJ3aGF0IiBwb2ludHMgdG8gYSBzdHJ1Y3QgZGljdF9vYmplY3Qgb2YgYSByZXF1ZXN0IGNvbW1hbmQuIFRoZSBjb3JyZXNwb25kaW5nICJBbnN3ZXIiIGNvbW1hbmQgaXMgcmV0dXJuZWQuICovCit9OworCisKKy8qKioKKyAqICBBUEkgdXNhZ2UgOgorCitUaGUgInBhcmVudCIgcGFyYW1ldGVyIG9mIGRpY3RfbmV3IG1heSBwb2ludCB0byBhbiBhcHBsaWNhdGlvbiBvYmplY3QgdG8gaW5mb3JtIG9mIHdoYXQgYXBwbGljYXRpb24gZGVmaW5lcyB0aGUgY29tbWFuZC4KK1RoZSBhcHBsaWNhdGlvbiBhc3NvY2lhdGVkIHRvIGEgY29tbWFuZCBpcyByZXRyaWV2ZWQgd2l0aCBBUFBMSUNBVElPTl9PRl9DT01NQU5EIHNlYXJjaCBjcml0ZXJpYSBvbiBhcHBsaWNhdGlvbnMuCisKK1RvIGNyZWF0ZSB0aGUgcnVsZXMgZm9yIGNoaWxkcmVuIG9mIGNvbW1hbmRzLCBzZWUgdGhlIERJQ1RfUlVMRSByZWxhdGVkIHBhcnQuCisKK05vdGUgdGhhdCB0aGUgIlJlcXVlc3QiIGFuZCAiQW5zd2VyIiBjb21tYW5kcyBhcmUgdHdvIGluZGVwZW5kYW50IG9iamVjdHMuIFRoaXMgYWxsb3dzIHRvIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBlYWNoLgorCistIGZkX2RpY3RfbmV3OgorIFNhbXBsZSBjb2RlIGZvciBjb21tYW5kIGNyZWF0aW9uOgorIHsKKwkgaW50IHJldDsKKwkgc3RydWN0IGRpY3Rfb2JqZWN0ICogY2VyOworCSBzdHJ1Y3QgZGljdF9vYmplY3QgKiBjZWE7CisJIHN0cnVjdCBkaWN0X2NtZF9kYXRhIGNlX2RhdGEgPSB7CisJCSAyNTcsCQkJCQkvLyBjb2RlCisJCSAiQ2FwYWJpbGl0aWVzLUV4Y2hhbmdlLVJlcXVlc3QiLAkvLyBuYW1lCisJCSBDTURfRkxBR19SRVFVRVNULAkJCS8vIG1hc2sKKwkJIENNRF9GTEFHX1JFUVVFU1QJCQkvLyB2YWx1ZS4gT25seSB0aGUgIlIiIGZsYWcgaXMgY29uc3RyYWluZWQgaGVyZSwgc2V0LgorCSB9OworCQorCSByZXQgPSBmZF9kaWN0X25ldyAoZGljdCwgIERJQ1RfQ09NTUFORCwgJmNlX2RhdGEsIE5VTEwsICZjZXIgKTsKKwkgCisJIGNlX2RhdGEuY21kX25hbWUgPSAiQ2FwYWJpbGl0aWVzLUV4Y2hhbmdlLUFuc3dlciI7CisJIGNlX2RhdGEuY21kX2ZsYWdfdmFsID0gMDsJCQkvLyBTYW1lIGNvbnN0cmFpbnQgb24gIlIiIGZsYWcsIGJ1dCB0aGlzIHRpbWUgaXQgbXVzdCBiZSBjbGVhcmVkLgorCisJIHJldCA9IGZkX2RpY3RfbmV3ICggZGljdCwgRElDVF9DT01NQU5ELCAmY2VfZGF0YSwgTlVMTCwgJmNlYSApOworIH0KKworLSBmZF9kaWN0X3NlYXJjaDoKKyBTYW1wbGUgY29kZSB0byBsb29rIGZvciBhIGNvbW1hbmQKKyB7CisJIGludCByZXQ7CisJIHN0cnVjdCBkaWN0X29iamVjdCAqIGNlciwgKiBjZWE7CisJIGNvbW1hbmRfY29kZV90CWNvZGUgPSAyNTc7CisJIHJldCA9IGZkX2RpY3Rfc2VhcmNoICggZGljdCwgRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIkNhcGFiaWxpdGllcy1FeGNoYW5nZS1SZXF1ZXN0IiwgJmNlciwgRU5PRU5UKTsKKwkgcmV0ID0gZmRfZGljdF9zZWFyY2ggKCBkaWN0LCBESUNUX0NPTU1BTkQsIENNRF9CWV9DT0RFX1IsICZjb2RlLCAmY2VyLCBFTk9FTlQpOworIH0KKyAKKyAtIGZkX2RpY3RfZ2V0dmFsOgorIFNhbXBsZSBjb2RlIHRvIHJldHJpZXZlIHRoZSBkYXRhIGZyb20gYSBjb21tYW5kIG9iamVjdDoKKyB7CisJIGludCByZXQ7CisJIHN0cnVjdCBkaWN0X29iamVjdCAqIGNlcjsKKwkgc3RydWN0IGRpY3Rfb2JqZWN0ICogY2VhOworCSBzdHJ1Y3QgZGljdF9jbWRfZGF0YSBjZWFfZGF0YTsKKwkgcmV0ID0gZmRfZGljdF9zZWFyY2ggKCBkaWN0LCBESUNUX0NPTU1BTkQsIENNRF9CWV9OQU1FLCAiQ2FwYWJpbGl0aWVzLUV4Y2hhbmdlLVJlcXVlc3QiLCAmY2VyLCBFTk9FTlQpOworCSByZXQgPSBmZF9kaWN0X3NlYXJjaCAoIGRpY3QsIERJQ1RfQ09NTUFORCwgQ01EX0FOU1dFUiwgY2VyLCAmY2VhLCBFTk9FTlQpOworCSByZXQgPSBmZF9kaWN0X2dldHZhbCAoIGNlYSwgJmNlYV9kYXRhICk7CisJIHByaW50ZigiQW5zd2VyIHRvIENFUjogJXNcbiIsIGNlYV9kYXRhLmNtZF9uYW1lICk7CisgfQorCisqLworCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFJ1bGUgb2JqZWN0CisgKgorICogVGhlc2Ugb2JqZWN0cyBhcmUgdXNlZCB0byBtYW5hZ2UgcnVsZXMgaW4gdGhlIGRpY3Rpb25hcnkgKEFCTkYgaW1wbGVtZW50YXRpb24pCisgKiBUaGlzIGlzIHVzZWQgZm9yIGNoZWNraW5nIG1lc3NhZ2VzIHZhbGlkaXR5IChtb3JlIHBvd2VyZnVsIHRoYW4gYSBEVEQpCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qIFRoaXMgZGVmaW5lcyB0aGUga2luZCBvZiBydWxlIHRoYXQgaXMgZGVmaW5lZCAqLworZW51bSBydWxlX3Bvc2l0aW9uIHsKKwlSVUxFX0ZJWEVEX0hFQUQgPSAxLAkvKiBUaGUgQVZQIG11c3QgYmUgYXQgdGhlIGhlYWQgb2YgdGhlIGdyb3VwLiBUaGUgcnVsZV9vcmRlciBmaWVsZCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHBvc2l0aW9uLiAqLworCVJVTEVfUkVRVUlSRUQsCQkvKiBUaGUgQVZQIG11c3QgYmUgcHJlc2VudCBpbiB0aGUgcGFyZW50LCBidXQgaXRzIHBvc2l0aW9uIGlzIG5vdCBkZWZpbmVkLiAqLworCVJVTEVfT1BUSU9OQUwsCQkvKiBUaGUgQVZQIG1heSBiZSBwcmVzZW50IGluIHRoZSBtZXNzYWdlLiBVc2VkIHRvIHNwZWNpZnkgYSBtYXggbnVtYmVyIG9mIG9jY3VyZW5jZXMgZm9yIGV4YW1wbGUgKi8KKwlSVUxFX0ZJWEVEX1RBSUwJCS8qIFRoZSBBVlAgbXVzdCBiZSBhdCB0aGUgZW5kIG9mIHRoZSBncm91cC4gVGhlIHJ1bGVfb3JkZXIgZmllbGQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBwb3NpdGlvbi4gKi8KK307CisKKy8qIENvbnRlbnQgb2YgYSBSVUxFIG9iamVjdCBkYXRhICovCitzdHJ1Y3QgZGljdF9ydWxlX2RhdGEgeworCXN0cnVjdCBkaWN0X29iamVjdAkqcnVsZV9hdnA7CS8qIFBvaW50ZXIgdG8gdGhlIEFWUCBvYmplY3QgdGhhdCBpcyBjb25jZXJuZWQgYnkgdGhpcyBydWxlICovCisJZW51bSBydWxlX3Bvc2l0aW9uCSBydWxlX3Bvc2l0aW9uOwkvKiBUaGUgcG9zaXRpb24gaW4gd2hpY2ggdGhlIHJ1bGVfYXZwIG11c3QgYXBwZWFyIGluIHRoZSBwYXJlbnQgKi8KKwl1bnNpZ25lZAkJIHJ1bGVfb3JkZXI7CS8qIGZvciBSVUxFX0ZJWEVEXyogcnVsZXMsIHRoZSBwbGFjZS4gMSwyLDMuLiBmb3IgSEVBRCBydWxlczsgLi4uLDMsMiwxIGZvciBUQUlMIHJ1bGVzLiAqLworCWludAkgCQkgcnVsZV9taW47CS8qIE1pbmltdW0gbnVtYmVyIG9mIG9jY3VyZW5jZXMuIC0xIG1lYW5zICJkZWZhdWx0IjogMCBmb3Igb3B0aW9uYWwgcnVsZXMsIDEgZm9yIG90aGVyIHJ1bGVzICovCisJaW50CQkJIHJ1bGVfbWF4OwkvKiBNYXhpbXVtIG51bWJlciBvZiBvY2N1cmVuY2VzLiAtMSBtZWFucyBubyBtYXhpbXVtLiAwIG1lYW5zIHRoZSBBVlAgaXMgZm9yYmlkZGVuLiAqLworfTsKKworLyogVGhlIGNyaXRlcmlhIGZvciBzZWFyY2hpbmcgYSBydWxlIGluIHRoZSBkaWN0aW9uYXJ5ICovCitlbnVtIHsKKwlSVUxFX0JZX0FWUF9BTkRfUEFSRU5UID0gNzAJLyogIndoYXQiIHBvaW50cyB0byBhIHN0cnVjdCBkaWN0X3J1bGVfcmVxdWVzdCAtLSBzZWUgYmVsb3cuIFRoaXMgaXMgdXNlZCB0byBxdWVyeSAid2hhdCBpcyB0aGUgcnVsZSBmb3IgdGhpcyBBVlAgaW4gdGhpcyBncm91cD8iICovCit9OworCisvKiBTdHJ1Y3R1cmUgZm9yIHF1ZXJ5aW5nIHRoZSBkaWN0aW9uYXJ5IGFib3V0IGEgcnVsZSAqLworc3RydWN0IGRpY3RfcnVsZV9yZXF1ZXN0IHsKKwlzdHJ1Y3QgZGljdF9vYmplY3QJKnJ1bGVfcGFyZW50OwkvKiBUaGUgZ3JvdXBlZCBhdnAgb3IgY29tbWFuZCB0byB3aGljaCB0aGUgcnVsZSBhcHBseSAqLworCXN0cnVjdCBkaWN0X29iamVjdAkqcnVsZV9hdnA7CS8qIFRoZSBBVlAgY29uY2VybmVkIGJ5IHRoaXMgcnVsZSAqLworfTsKKworCisvKioqCisgKiAgQVBJIHVzYWdlIDoKKworVGhlICJwYXJlbnQiIHBhcmFtZXRlciBjYW4gbm90IGJlIE5VTEwuIEl0IHBvaW50cyB0byB0aGUgb2JqZWN0IChncm91cGVkIGF2cCBvciBjb21tYW5kKSB0byB3aGljaCB0aGlzIHJ1bGUgYXBwbHkgKGkuZS4gZm9yIHdoaWNoIHRoZSBBQk5GIGlzIGRlZmluZWQpLgorCistIGZkX2RpY3RfbmV3OgorIFNhbXBsZSBjb2RlIGZvciBydWxlIGNyZWF0aW9uLiBMZXQncyBjcmVhdGUgdGhlIFByb3h5LUluZm8gZ3JvdXBlZCBBVlAgZm9yIGV4YW1wbGUuCisgeworCWludCByZXQ7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogcHJveHlfaW5mb19hdnA7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogcHJveHlfaG9zdF9hdnA7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogcHJveHlfc3RhdGVfYXZwOworCXN0cnVjdCBkaWN0X29iamVjdCAqIGRpYW1ldGVyaWRlbnRpdHlfdHlwZTsKKwlzdHJ1Y3QgZGljdF9ydWxlX2RhdGEgcnVsZV9kYXRhOworCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSBkaV90eXBlX2RhdGEgPSB7IEFWUF9UWVBFX09DVEVUU1RSSU5HLCAiRGlhbWV0ZXJJZGVudGl0eSIsIE5VTEwsIE5VTEwgfTsKKwlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBwcm94eV9pbmZvX2RhdGEgPSB7IDI4NCwgMCwgIlByb3h5LUluZm8iLCBBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIEFWUF9GTEFHX01BTkRBVE9SWSwgQVZQX1RZUEVfR1JPVVBFRCB9OworCXN0cnVjdCBkaWN0X2F2cF9kYXRhIHByb3h5X2hvc3RfZGF0YSA9IHsgMjgwLCAwLCAiUHJveHktSG9zdCIsIEFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgQVZQX0ZMQUdfTUFOREFUT1JZLCBBVlBfVFlQRV9PQ1RFVFNUUklORyB9OworCXN0cnVjdCBkaWN0X2F2cF9kYXRhIHByb3h5X3N0YXRlX2RhdGEgPSB7IDMzLCAwLCAiUHJveHktU3RhdGUiLEFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgQVZQX0ZMQUdfTUFOREFUT1JZLCBBVlBfVFlQRV9PQ1RFVFNUUklORyB9OworCQorCS0tIENyZWF0ZSB0aGUgcGFyZW50IEFWUAorCXJldCA9IGZkX2RpY3RfbmV3ICggZGljdCwgRElDVF9BVlAsICZwcm94eV9pbmZvX2RhdGEsIE5VTEwsICZwcm94eV9pbmZvX2F2cCApOworCQorCS0tIENyZWF0ZSB0aGUgZmlyc3QgY2hpbGQgQVZQLgorCXJldCA9IGZkX2RpY3RfbmV3ICggZGljdCwgRElDVF9UWVBFLCAmZGlfdHlwZV9kYXRhLCBOVUxMLCAmZGlhbWV0ZXJpZGVudGl0eV90eXBlICk7CisJcmV0ID0gZmRfZGljdF9uZXcgKCBkaWN0LCBESUNUX0FWUCwgJnByb3h5X2hvc3RfZGF0YSwgZGlhbWV0ZXJpZGVudGl0eV90eXBlLCAmcHJveHlfaG9zdF9hdnAgKTsKKwkKKwktLSBDcmVhdGUgdGhlIG90aGVyIGNoaWxkIEFWUAorCXJldCA9IGZkX2RpY3RfbmV3ICggZGljdCwgRElDVF9BVlAsICZwcm94eV9zdGF0ZV9kYXRhLCBOVUxMLCAmcHJveHlfc3RhdGVfYXZwICk7CisJCisJLS0gTm93IHdlIGNhbiBjcmVhdGUgdGhlIHJ1bGVzLiBCb3RoIGNoaWxkcmVuIEFWUCBhcmUgbWFuZGF0b3J5LgorCXJ1bGVfZGF0YS5ydWxlX3Bvc2l0aW9uID0gUlVMRV9SRVFVSVJFRDsKKwlydWxlX2RhdGEucnVsZV9taW4gPSAtMTsKKwlydWxlX2RhdGEucnVsZV9tYXggPSAtMTsKKwkKKwlydWxlX2RhdGEucnVsZV9hdnAgPSBwcm94eV9ob3N0X2F2cDsKKwlyZXQgPSBmZF9kaWN0X25ldyAoIGRpY3QsIERJQ1RfUlVMRSwgJnJ1bGVfZGF0YSwgcHJveHlfaW5mb19hdnAsIE5VTEwgKTsKKwkKKwlydWxlX2RhdGEucnVsZV9hdnAgPSBwcm94eV9zdGF0ZV9hdnA7CisJcmV0ID0gZmRfZGljdF9uZXcgKCBkaWN0LCBESUNUX1JVTEUsICZydWxlX2RhdGEsIHByb3h5X2luZm9fYXZwLCBOVUxMICk7Cit9CisKKy0gZmRfZGljdF9zZWFyY2ggYW5kIGZkX2RpY3RfZ2V0dmFsIGFyZSBzaW1pbGFyIHRvIHByZXZpb3VzIGV4YW1wbGVzLgorCisqLworCQkKKy8qIERlZmluZSBzb21lIGhhcmQtY29kZWQgdmFsdWVzICovCisvKiBBcHBsaWNhdGlvbiAqLworI2RlZmluZSBBSV9SRUxBWQkJCTB4ZmZmZmZmZmYKKworLyogQ29tbWFuZHMgQ29kZXMgKi8KKyNkZWZpbmUgQ0NfQ0FQQUJJTElUSUVTX0VYQ0hBTkdFCTI1NworI2RlZmluZSBDQ19SRV9BVVRICQkJMjU4CisjZGVmaW5lIENDX0FDQ09VTlRJTkcJCQkyNzEKKyNkZWZpbmUgQ0NfQUJPUlRfU0VTU0lPTgkJMjc0CisjZGVmaW5lIENDX1NFU1NJT05fVEVSTUlOQVRJT04JCTI3NQorI2RlZmluZSBDQ19ERVZJQ0VfV0FUQ0hET0cJCTI4MAorI2RlZmluZSBDQ19ESVNDT05ORUNUX1BFRVIJCTI4MgorCisvKiBBVlBzIChWZW5kb3IgMCkgKi8KKyNkZWZpbmUgQUNfVVNFUl9OQU1FCQkJMQorI2RlZmluZSBBQ19QUk9YWV9TVEFURQkJCTMzCisjZGVmaW5lIEFDX0hPU1RfSVBfQUREUkVTUwkJMjU3CisjZGVmaW5lIEFDX0FVVEhfQVBQTElDQVRJT05fSUQJCTI1OAorI2RlZmluZSBBQ19BQ0NUX0FQUExJQ0FUSU9OX0lECQkyNTkKKyNkZWZpbmUgQUNfVkVORE9SX1NQRUNJRklDX0FQUExJQ0FUSU9OX0lEIDI2MAorI2RlZmluZSBBQ19SRURJUkVDVF9IT1NUX1VTQUdFCQkyNjEKKyNkZWZpbmUgQUNfUkVESVJFQ1RfTUFYX0NBQ0hFX1RJTUUJMjYyCisjZGVmaW5lIEFDX1NFU1NJT05fSUQgCQkJMjYzCisjZGVmaW5lIEFDX09SSUdJTl9IT1NUCQkJMjY0CisjZGVmaW5lIEFDX1NVUFBPUlRFRF9WRU5ET1JfSUQJCTI2NQorI2RlZmluZSBBQ19WRU5ET1JfSUQJCQkyNjYKKyNkZWZpbmUgQUNfRklSTVdBUkVfUkVWSVNJT04JCTI2NworI2RlZmluZSBBQ19SRVNVTFRfQ09ERQkJCTI2OAorI2RlZmluZSBBQ19QUk9EVUNUX05BTUUJCQkyNjkKKyNkZWZpbmUgQUNfRElTQ09OTkVDVF9DQVVTRQkJMjczCisjZGVmaW5lIEFDVl9EQ19SRUJPT1RJTkcJCQkwCisjZGVmaW5lIEFDVl9EQ19CVVNZCQkJCTEKKyNkZWZpbmUgQUNWX0RDX05PVF9GUklFTkQJCQkyCisjZGVmaW5lIEFDX09SSUdJTl9TVEFURV9JRAkJMjc4CisjZGVmaW5lIEFDX0ZBSUxFRF9BVlAJCQkyNzkKKyNkZWZpbmUgQUNfUFJPWFlfSE9TVAkJCTI4MAorI2RlZmluZSBBQ19FUlJPUl9NRVNTQUdFCQkyODEKKyNkZWZpbmUgQUNfUk9VVEVfUkVDT1JECQkJMjgyCisjZGVmaW5lIEFDX0RFU1RJTkFUSU9OX1JFQUxNCQkyODMKKyNkZWZpbmUgQUNfUFJPWFlfSU5GTwkJCTI4NAorI2RlZmluZSBBQ19SRURJUkVDVF9IT1NUCQkyOTIKKyNkZWZpbmUgQUNfREVTVElOQVRJT05fSE9TVAkJMjkzCisjZGVmaW5lIEFDX0VSUk9SX1JFUE9SVElOR19IT1NUCQkyOTQKKyNkZWZpbmUgQUNfT1JJR0lOX1JFQUxNCQkJMjk2CisjZGVmaW5lIEFDX0lOQkFORF9TRUNVUklUWV9JRAkJMjk5CisjZGVmaW5lIEFDVl9JU0lfTk9fSU5CQU5EX1NFQ1VSSVRZCQkwCisjZGVmaW5lIEFDVl9JU0lfVExTCQkJCTEKKworLyogRXJyb3IgY29kZXMgZnJvbSBCYXNlIHByb3RvY29sCisocmVmZXJlbmNlOiBodHRwOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL2FhYS1wYXJhbWV0ZXJzL2FhYS1wYXJhbWV0ZXJzLnhtbCNhYWEtcGFyYW1ldGVycy00KQorTm90ZSB0aGF0IGN1cnJlbnRseSwgcmZjMzU4OGJpcy0yNiBoYXMgc29tZSBkaWZmZXJlbnQgdmFsdWVzIGZvciBzb21lIG9mIHRoZXNlIAorKi8KKyNkZWZpbmUgRVJfRElBTUVURVJfTVVMVElfUk9VTkRfQVVUSAkJCTEwMDEKKworI2RlZmluZSBFUl9ESUFNRVRFUl9TVUNDRVNTCQkJCTIwMDEKKyNkZWZpbmUgRVJfRElBTUVURVJfTElNSVRFRF9TVUNDRVNTCQkJMjAwMgorCisjZGVmaW5lIEVSX0RJQU1FVEVSX0NPTU1BTkRfVU5TVVBQT1JURUQJCQkzMDAxIC8qIDUwMTkgPyAqLworI2RlZmluZSBFUl9ESUFNRVRFUl9VTkFCTEVfVE9fREVMSVZFUgkJCTMwMDIKKyNkZWZpbmUgRVJfRElBTUVURVJfUkVBTE1fTk9UX1NFUlZFRAkJCTMwMDMKKyNkZWZpbmUgRVJfRElBTUVURVJfVE9PX0JVU1kJCQkJMzAwNAorI2RlZmluZSBFUl9ESUFNRVRFUl9MT09QX0RFVEVDVEVECQkJMzAwNQorI2RlZmluZSBFUl9ESUFNRVRFUl9SRURJUkVDVF9JTkRJQ0FUSU9OCQkJMzAwNgorI2RlZmluZSBFUl9ESUFNRVRFUl9BUFBMSUNBVElPTl9VTlNVUFBPUlRFRAkJMzAwNworI2RlZmluZSBFUl9ESUFNRVRFUl9JTlZBTElEX0hEUl9CSVRTCQkJMzAwOCAvKiA1MDIwID8gKi8KKyNkZWZpbmUgRVJfRElBTUVURVJfSU5WQUxJRF9BVlBfQklUUwkJCTMwMDkgLyogNTAyMSA/ICovCisjZGVmaW5lIEVSX0RJQU1FVEVSX1VOS05PV05fUEVFUgkJCTMwMTAgLyogNTAxOCA/ICovCisKKyNkZWZpbmUgRVJfRElBTUVURVJfQVVUSEVOVElDQVRJT05fUkVKRUNURUQJCTQwMDEKKyNkZWZpbmUgRVJfRElBTUVURVJfT1VUX09GX1NQQUNFCQkJNDAwMgorI2RlZmluZSBFUl9FTEVDVElPTl9MT1NUCQkJCTQwMDMKKworI2RlZmluZSBFUl9ESUFNRVRFUl9BVlBfVU5TVVBQT1JURUQJCQk1MDAxCisjZGVmaW5lIEVSX0RJQU1FVEVSX1VOS05PV05fU0VTU0lPTl9JRAkJCTUwMDIKKyNkZWZpbmUgRVJfRElBTUVURVJfQVVUSE9SSVpBVElPTl9SRUpFQ1RFRAkJNTAwMworI2RlZmluZSBFUl9ESUFNRVRFUl9JTlZBTElEX0FWUF9WQUxVRQkJCTUwMDQKKyNkZWZpbmUgRVJfRElBTUVURVJfTUlTU0lOR19BVlAJCQkJNTAwNQorI2RlZmluZSBFUl9ESUFNRVRFUl9SRVNPVVJDRVNfRVhDRUVERUQJCQk1MDA2CisjZGVmaW5lIEVSX0RJQU1FVEVSX0NPTlRSQURJQ1RJTkdfQVZQUwkJCTUwMDcKKyNkZWZpbmUgRVJfRElBTUVURVJfQVZQX05PVF9BTExPV0VECQkJNTAwOAorI2RlZmluZSBFUl9ESUFNRVRFUl9BVlBfT0NDVVJTX1RPT19NQU5ZX1RJTUVTCQk1MDA5CisjZGVmaW5lIEVSX0RJQU1FVEVSX05PX0NPTU1PTl9BUFBMSUNBVElPTgkJNTAxMAorI2RlZmluZSBFUl9ESUFNRVRFUl9VTlNVUFBPUlRFRF9WRVJTSU9OCQkJNTAxMQorI2RlZmluZSBFUl9ESUFNRVRFUl9VTkFCTEVfVE9fQ09NUExZCQkJNTAxMgorI2RlZmluZSBFUl9ESUFNRVRFUl9JTlZBTElEX0JJVF9JTl9IRUFERVIJCTUwMTMgLyogMzAxMSA/ICovCisjZGVmaW5lIEVSX0RJQU1FVEVSX0lOVkFMSURfQVZQX0xFTkdUSAkJCTUwMTQKKyNkZWZpbmUgRVJfRElBTUVURVJfSU5WQUxJRF9NRVNTQUdFX0xFTkdUSAkJNTAxNSAvKiAzMDEyID8gKi8KKyNkZWZpbmUgRVJfRElBTUVURVJfSU5WQUxJRF9BVlBfQklUX0NPTUJPCQk1MDE2IC8qIGRlcHJlY2F0ZWQ/ICovCisjZGVmaW5lIEVSX0RJQU1FVEVSX05PX0NPTU1PTl9TRUNVUklUWQkJCTUwMTcKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICBTRVNTSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qIE1vZHVsZXMgdGhhdCB3YW50IHRvIGFzc29jaWF0ZSBhIHN0YXRlIHdpdGggYSBTZXNzaW9uLUlkIG11c3QgZmlyc3QgcmVnaXN0ZXIgYSBoYW5kbGVyIG9mIHRoaXMgdHlwZSAqLworc3RydWN0IHNlc3Npb25faGFuZGxlcjsKKworLyogVGhpcyBvcGFxdWUgc3RydWN0dXJlIHJlcHJlc2VudHMgYSBzZXNzaW9uIGFzc29jaWF0ZWQgd2l0aCBhIFNlc3Npb24tSWQgKi8KK3N0cnVjdCBzZXNzaW9uOworCisvKiBUaGUgc3RhdGUgaW5mb3JtYXRpb24gdGhhdCBhIG1vZHVsZSBhc3NvY2lhdGUgd2l0aCBhIHNlc3Npb24gLS0gZWFjaCBtb2R1bGUgZGVmaW5lcyBpdHMgb3duIGRhdGEgZm9ybWF0ICovCitzdHJ1Y3Qgc2Vzc19zdGF0ZTsgLyogZGVjbGFyZSB0aGlzIGluIHlvdXIgb3duIGV4dGVuc2lvbiAqLworCit0eXBlZGVmIERFQ0xBUkVfRkRfRFVNUF9QUk9UT1RZUEUoKCpzZXNzaW9uX3N0YXRlX2R1bXApLCBzdHJ1Y3Qgc2Vzc19zdGF0ZSAqIHN0KTsKKworLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB0byBhY3RpdmF0ZSB0aGUgc2Vzc2lvbiBleHBpcnkgbWVjaGFuaXNtICovCitpbnQgZmRfc2Vzc19zdGFydCh2b2lkKTsKKworLyoKKyAqIEZVTkNUSU9OOglmZF9zZXNzX2hhbmRsZXJfY3JlYXRlCisgKgorICogUEFSQU1FVEVSUzoKKyAqICBoYW5kbGVyCTogbG9jYXRpb24gd2hlcmUgdGhlIG5ldyBoYW5kbGVyIG11c3QgYmUgc3RvcmVkLgorICogIGNsZWFudXAJOiBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgbXVzdCBiZSBjYWxsZWQgd2hlbiB0aGUgc2Vzc2lvbiB3aXRoIGFzc29jaWF0ZWQgZGF0YSBpcyBkZXN0cm95ZWQuCisgKiAgZHVtcGVyICAgICAgOiBpZiBub3QgTlVMTCwgd2lsbCBiZSBjYWxsZWQgZHVyaW5nIGZkX3Nlc3NfZHVtcCB0byBkaXNwbGF5IHRoZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCBhIHNlc3Npb24uIE5VTEwgb3RoZXJ3aXNlLgorICogIG9wYXF1ZSAgICAgIDogQSBwb2ludGVyIHRoYXQgaXMgcGFzc2VkIHRvIHRoZSBjbGVhbnVwIGNhbGxiYWNrIC0tIHRoZSBjb250ZW50IGlzIG5ldmVyIGV4YW1pbmVkIGJ5IHRoZSBmcmFtZXdvcmsuCisgKgorICogREVTQ1JJUFRJT046IAorICogIENyZWF0ZSBhIG5ldyBzZXNzaW9uIGhhbmRsZXIuIFRoaXMgaXMgbmVlZGVkIGJ5IGEgbW9kdWxlIHRvIGFzc29jaWF0ZSBhIHN0YXRlIHdpdGggYSBzZXNzaW9uIG9iamVjdC4KKyAqIFRoZSBjbGVhbnVwIGhhbmRsZXIgaXMgY2FsbGVkIHdoZW4gdGhlIHNlc3Npb24gdGltZW91dCBleHBpcmVzLCBvciBmZF9zZXNzX2Rlc3Ryb3kgaXMgY2FsbGVkLiBJdCBtdXN0IGZyZWUKKyAqIHRoZSBzdGF0ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNlc3Npb24sIGFuZCBldmVudHVhbGx5IHRyaWcgb3RoZXIgYWN0aW9ucyAoc2VuZCBhIFNUUiwgLi4uKS4KKyAqCisgKiBSRVRVUk4gVkFMVUU6CisgKiAgMCAgICAgIAk6IFRoZSBuZXcgaGFuZGxlciBoYXMgYmVlbiBjcmVhdGVkLgorICogIEVJTlZBTCAJOiBBIHBhcmFtZXRlciBpcyBpbnZhbGlkLgorICogIEVOT01FTQk6IE5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvbXBsZXRlIHRoZSBvcGVyYXRpb24KKyAqLworaW50IGZkX3Nlc3NfaGFuZGxlcl9jcmVhdGUgKCBzdHJ1Y3Qgc2Vzc2lvbl9oYW5kbGVyICoqIGhhbmRsZXIsIHZvaWQgKCpjbGVhbnVwKShzdHJ1Y3Qgc2Vzc19zdGF0ZSAqIHN0YXRlLCBvczBfdCBzaWQsIHZvaWQgKiBvcGFxdWUpLCBzZXNzaW9uX3N0YXRlX2R1bXAgZHVtcGVyLCB2b2lkICogb3BhcXVlICk7CisKKwkKKy8qCisgKiBGVU5DVElPTjoJZmRfc2Vzc19oYW5kbGVyX2Rlc3Ryb3kKKyAqCisgKiBQQVJBTUVURVJTOgorICogIGhhbmRsZXIJOiBsb2NhdGlvbiBvZiBhbiBoYW5kbGVyIGNyZWF0ZWQgYnkgZmRfc2Vzc19oYW5kbGVyX2NyZWF0ZS4KKyAqICBvcGFxdWUgICAgICA6IHRoZSBvcGFxdWUgcG9pbnRlciByZWdpc3RlcmVkIHdpdGggdGhlIGNhbGxiYWNrIGlzIHJlc3RvcmVkIGhlcmUgKGlmICEgTlVMTCkuCisgKgorICogREVTQ1JJUFRJT046IAorICogIFRoaXMgZGVzdHJveXMgYSBzZXNzaW9uIGhhbmRsZXIgKHR5cGljYWxseSBjYWxsZWQgd2hlbiBhbiBhcHBsaWNhdGlvbiBpcyBzaHV0dGluZyBkb3duKS4KKyAqIElmIHNlc3Npb25zIHN0YXRlcyBhcmUgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgaGFuZGxlciwgdGhlIGNsZWFudXAgY2FsbGJhY2sgaXMgY2FsbGVkIG9uIHRoZW0uCisgKgorICogUkVUVVJOIFZBTFVFOgorICogIDAgICAgICAJOiBUaGUgaGFuZGxlciB3YXMgZGVzdHJveWVkLgorICogIEVJTlZBTCAJOiBBIHBhcmFtZXRlciBpcyBpbnZhbGlkLgorICogIEVOT01FTQk6IE5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvbXBsZXRlIHRoZSBvcGVyYXRpb24KKyAqLworaW50IGZkX3Nlc3NfaGFuZGxlcl9kZXN0cm95ICggc3RydWN0IHNlc3Npb25faGFuZGxlciAqKiBoYW5kbGVyLCB2b2lkICoqb3BhcXVlICk7CisKKworCisvKgorICogRlVOQ1RJT046CWZkX3Nlc3NfbmV3CisgKgorICogUEFSQU1FVEVSUzoKKyAqICBzZXNzaW9uCSAgOiBUaGUgbG9jYXRpb24gd2hlcmUgdGhlIHNlc3Npb24gb2JqZWN0IHdpbGwgYmUgY3JlYXRlZCB1cG9uIHN1Y2Nlc3MuCisgKiAgZGlhbWlkCSAgOiBhIERpYW1ldGVyIElkZW50aXR5LCBvciBOVUxMLgorICogIGRpYW1pZGxlbgkgIDogaWYgZGlhbWlkIGlzIFwwLXRlcm1pbmF0ZWQsIHRoaXMgY2FuIGJlIDAuIE90aGVyd2lzZSwgdGhlIGxlbmd0aCBvZiBkaWFtaWQuCisgKiAgb3B0ICAgICAgICAgICA6IEFkZGl0aW9uYWwgc3RyaW5nLCBvciBOVUxMLiBVc2FnZSBpcyBkZXNjcmliZWQgYmVsb3cuCisgKiAgb3B0bGVuCSAgOiBpZiBvcHQgaXMgXDAtdGVybWluYXRlZCwgdGhpcyBjYW4gYmUgMC4gT3RoZXJ3aXNlLCB0aGUgbGVuZ3RoIG9mIG9wdC4KKyAqCisgKiBERVNDUklQVElPTjogCisgKiAgIENyZWF0ZSBhIG5ldyBzZXNzaW9uIG9iamVjdC4gVGhlIFNlc3Npb24tSWQgc3RyaW5nIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlc3Npb24gaXMgZ2VuZXJhdGVkIGFzIGZvbGxvdzoKKyAqICBJZiBkaWFtSWQgcGFyYW1ldGVyIGlzIHByb3ZpZGVkLCB0aGUgc3RyaW5nIGlzIGNyZWF0ZWQgYWNjb3JkaW5nIHRvIHRoZSBSRkM6IDxkaWFtSWQ+OzxoaWdoMzI+Ozxsb3czMj5bO29wdF0gd2hlcmUKKyAqICAgIGRpYW1JZCBpcyBhIERpYW1ldGVyIElkZW50aXR5LgorICogICAgaGlnaDMyIGFuZCBsb3czMiBhcmUgdGhlIHBhcnRzIG9mIGEgbW9ub3RvbmljIDY0IGJpdHMgY291bnRlciBpbml0aWFsaXplZCB0byAodGltZSwgMCkgYXQgc3RhcnR1cC4KKyAqICAgIG9wdCBpcyBhbiBvcHRpb25hbCBzdHJpbmcgdGhhdCBjYW4gYmUgY29uY2F0ZW5hdGVkIHRvIHRoZSBpZGVudGlmaWVyLgorICogIElmIGRpYW1JZCBpcyBOVUxMLCB0aGUgc3RyaW5nIGlzIGV4YWN0bHkgdGhlIGNvbnRlbnQgb2Ygb3B0LgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqICAwICAgICAgCTogVGhlIHNlc3Npb24gaXMgY3JlYXRlZCwgdGhlIGluaXRpYWwgbXNnIHJlZmNvdW50IGlzIDEuCisgKiAgRUlOVkFMIAk6IEEgcGFyYW1ldGVyIGlzIGludmFsaWQuCisgKiAgRUFMUkVBRFkJOiBBIHNlc3Npb24gd2l0aCB0aGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzIChyZXR1cm5lZCBpbiAqc2Vzc2lvbiksIHRoZSBtc2cgcmVmY291bnQgaXMgaW5jcmVhc2VkLgorICogIEVOT01FTQk6IE5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvbXBsZXRlIHRoZSBvcGVyYXRpb24KKyAqLworaW50IGZkX3Nlc3NfbmV3ICggc3RydWN0IHNlc3Npb24gKiogc2Vzc2lvbiwgRGlhbUlkX3QgZGlhbWlkLCBzaXplX3QgZGlhbWlkbGVuLCB1aW50OF90ICogb3B0LCBzaXplX3Qgb3B0bGVuICk7CisKKy8qCisgKiBGVU5DVElPTjoJZmRfc2Vzc19mcm9tc2lkCisgKgorICogUEFSQU1FVEVSUzoKKyAqICBzaWQJICAJOiBwb2ludGVyIHRvIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBTZXNzaW9uLUlkIChzaG91bGQgYmUgVVRGLTgpLgorICogIGxlbgkJOiBsZW5ndGggb2YgdGhlIHNpZCBzdHJpbmcgKHdoaWNoIGRvZXMgbm90IG5lZWQgdG8gYmUgJ1wwJy10ZXJtaW5hdGVkKQorICogIHNlc3Npb24JOiBPbiBzdWNjZXNzLCBwb2ludGVyIHRvIHRoZSBzZXNzaW9uIG9iamVjdCBjcmVhdGVkIC8gcmV0cmlldmVkLgorICogIGlzbmV3CTogaWYgbm90IE5VTEwsIHNldCB0byAxIG9uIHJldHVybiBpZiB0aGUgc2Vzc2lvbiBvYmplY3QgaGFzIGJlZW4gY3JlYXRlZCwgMCBpZiBpdCB3YXMgc2ltcGx5IHJldHJpZXZlZC4KKyAqCisgKiBERVNDUklQVElPTjogCisgKiAgIFJldHJpZXZlIGEgc2Vzc2lvbiBvYmplY3QgZnJvbSBhIFNlc3Npb24tSWQgc3RyaW5nLiBJbiBjYXNlIG5vIHNlc3Npb24gb2JqZWN0IHdhcyBwcmV2aW91c2x5IGV4aXN0aW5nIHdpdGggdGhpcyAKKyAqICBpZCwgYSBuZXcgb2JqZWN0IGlzIHNpbGVudGx5IGNyZWF0ZWQgKGVxdWl2YWxlbnQgdG8gZmRfc2Vzc19uZXcgd2l0aCBmbGFnIFNFU1NJT05fTkVXX0ZVTEwpLgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqICAwICAgICAgCTogVGhlIHNlc3Npb24gcGFyYW1ldGVyIGhhcyBiZWVuIHVwZGF0ZWQuCisgKiAgRUlOVkFMIAk6IEEgcGFyYW1ldGVyIGlzIGludmFsaWQuCisgKiAgRU5PTUVNCTogTm90IGVub3VnaCBtZW1vcnkgdG8gY29tcGxldGUgdGhlIG9wZXJhdGlvbgorICovCitpbnQgZmRfc2Vzc19mcm9tc2lkICggdWludDhfdCAqIHNpZCwgc2l6ZV90IGxlbiwgc3RydWN0IHNlc3Npb24gKiogc2Vzc2lvbiwgaW50ICogaXNuZXcpOworCisvKiBvbmx5IHVzZSB0aGUgZm9sbG93aW5nIGluIHNwZWNpZmljIHNpdHVhdGlvbnMsIGUuZy4gYXBwX3JhZGd3IGV4dGVuc2lvbi4gVGhleSBhcmUgbm9ybWFsbHkgaGFuZGxlZCBieSB0aGUgZnJhbWV3b3JrIG9ubHkgKi8KK2ludCBmZF9zZXNzX2Zyb21zaWRfbXNnICggdWludDhfdCAqIHNpZCwgc2l6ZV90IGxlbiwgc3RydWN0IHNlc3Npb24gKiogc2Vzc2lvbiwgaW50ICogaXNuZXcpOyAKK2ludCBmZF9zZXNzX3JlZl9tc2cgKCBzdHJ1Y3Qgc2Vzc2lvbiAqIHNlc3Npb24gKTsKKworLyoKKyAqIEZVTkNUSU9OOglmZF9zZXNzX2dldHNpZAorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgc2Vzc2lvbgk6IFBvaW50ZXIgdG8gYSBzZXNzaW9uIG9iamVjdC4KKyAqICBzaWQJICAJOiBPbiBzdWNjZXNzLCB0aGUgbG9jYXRpb24gb2YgdGhlIHNpZCBpcyBzdG9yZWQgaGVyZS4KKyAqCisgKiBERVNDUklQVElPTjogCisgKiAgIFJldHJpZXZlIHRoZSBzZXNzaW9uIGlkZW50aWZpZXIgKFNlc3Npb24tSWQpIGNvcnJlc3BvbmRpbmcgdG8gYSBzZXNzaW9uIG9iamVjdC4KKyAqICBUaGUgcmV0dXJuZWQgc2lkIGlzIGEgXDAtdGVybWluYXRlZCBiaW5hcnkgc3RyaW5nIHdoaWNoIG1pZ2h0IGJlIFVURi04IChidXQgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIGluIHRoZSBmcmFtZXdvcmspLgorICogIEl0IG1heSBiZSB1c2VkIGZvciBleGFtcGxlIHRvIHNldCB0aGUgdmFsdWUgb2YgYW4gQVZQLgorICogIE5vdGUgdGhhdCB0aGUgc2lkIHN0cmluZyBpcyBub3QgY29waWVkLCBqdXN0IGl0cyByZWZlcmVuY2UuLi4gZG8gbm90IGZyZWUgaXQhCisgKgorICogUkVUVVJOIFZBTFVFOgorICogIDAgICAgICAJOiBUaGUgc2lkICYgbGVuIHBhcmFtZXRlcnMgaGF2ZSBiZWVuIHVwZGF0ZWQuCisgKiAgRUlOVkFMIAk6IEEgcGFyYW1ldGVyIGlzIGludmFsaWQuCisgKi8KK2ludCBmZF9zZXNzX2dldHNpZCAoIHN0cnVjdCBzZXNzaW9uICogc2Vzc2lvbiwgb3MwX3QgKiBzaWQsIHNpemVfdCAqIHNpZGxlbiApOworCisvKgorICogRlVOQ1RJT046CWZkX3Nlc3Nfc2V0dGltZW91dAorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgc2Vzc2lvbgk6IFRoZSBzZXNzaW9uIGZvciB3aGljaCB0byBzZXQgdGhlIHRpbWVvdXQuCisgKiAgdGltZW91dAk6IFRoZSBkYXRlIHdoZW4gdGhlIHNlc3Npb24gdGltZXMgb3V0LgorICoKKyAqIERFU0NSSVBUSU9OOiAKKyAqICAgU2V0IHRoZSBsaWZldGltZSBmb3IgYSBnaXZlbiBzZXNzaW9uIG9iamVjdC4gVGhpcyBmdW5jdGlvbiBtYXkgYmUgCisgKiBjYWxsZWQgc2V2ZXJhbCB0aW1lcyBvbiB0aGUgc2FtZSBvYmplY3QgdG8gdXBkYXRlIHRoZSB0aW1lb3V0IHZhbHVlLgorICogICBXaGVuIHRoZSB0aW1lb3V0IGRhdGUgaXMgcmVhY2hlZCwgdGhlIGNsZWFudXAgaGFuZGxlciBvZiBlYWNoIAorICogbW9kdWxlIHRoYXQgcmVnaXN0ZXJlZCBkYXRhIHdpdGggdGhpcyBzZXNzaW9uIGlzIGNhbGxlZCwgdGhlbiB0aGUgCisgKiBzZXNzaW9uIGlzIGNsZWFyZWQuCisgKgorICogICBUaGVyZSBpcyBhIHBvc3NpYmxlIHJhY2UgY29uZGl0aW9uIGJldHdlZW4gY2xlYW51cCBvZiB0aGUgc2Vzc2lvbgorICogYW5kIHVzZSBvZiBpdHMgZGF0YTsgYXBwbGljYXRpb25zIHNob3VsZCBlbnN1cmUgdGhhdCB0aGV5IGFyZSBub3QgCisgKiB1c2luZyBkYXRhIGZyb20gYSBzZXNzaW9uIHRoYXQgaXMgYWJvdXQgdG8gZXhwaXJlIC8gZXhwaXJlZC4KKyAqCisgKiBSRVRVUk4gVkFMVUU6CisgKiAgMCAgICAgIAk6IFRoZSBzZXNzaW9uIHRpbWVvdXQgaGFzIGJlZW4gdXBkYXRlZC4KKyAqICBFSU5WQUwgCTogQSBwYXJhbWV0ZXIgaXMgaW52YWxpZC4KKyAqLworaW50IGZkX3Nlc3Nfc2V0dGltZW91dCggc3RydWN0IHNlc3Npb24gKiBzZXNzaW9uLCBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKiB0aW1lb3V0ICk7CisKKy8qCisgKiBGVU5DVElPTjoJZmRfc2Vzc19kZXN0cm95CisgKgorICogUEFSQU1FVEVSUzoKKyAqICBzZXNzaW9uCTogUG9pbnRlciB0byBhIHNlc3Npb24gb2JqZWN0LgorICoKKyAqIERFU0NSSVBUSU9OOiAKKyAqICAgRGVzdHJveXMgYWxsIGFzc29jaWF0ZWQgc3RhdGVzIG9mIGEgc2Vzc2lvbiwgaWYgYW55LgorICogRXF1aXZhbGVudCB0byBhIHNlc3Npb24gdGltZW91dCBleHBpcmVkLCBidXQgdGhlIGVmZmVjdCBpcyBpbW1lZGlhdGUuCisgKiBUaGUgc2Vzc2lvbiBpdHNlbGYgaXMgbWFya2VkIGFzIGRlbGV0ZWQsIGFuZCB3aWxsIGJlIGZyZWVkIHdoZW4gaXQgaXMgbm90IHJlZmVyZW5jZWQgCisgKiBieSBhbnkgbWVzc2FnZSBhbnltb3JlLgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqICAwICAgICAgCTogVGhlIHNlc3Npb24gbm8gbG9uZ2VyIGV4aXN0cy4KKyAqICBFSU5WQUwgCTogQSBwYXJhbWV0ZXIgaXMgaW52YWxpZC4KKyAqLworaW50IGZkX3Nlc3NfZGVzdHJveSAoIHN0cnVjdCBzZXNzaW9uICoqIHNlc3Npb24gKTsKKworLyoKKyAqIEZVTkNUSU9OOglmZF9zZXNzX3JlY2xhaW0KKyAqCisgKiBQQVJBTUVURVJTOgorICogIHNlc3Npb24JOiBQb2ludGVyIHRvIGEgc2Vzc2lvbiBvYmplY3QuCisgKgorICogREVTQ1JJUFRJT046IAorICogICBFcXVpdmFsZW50IHRvIGZkX3Nlc3NfZGVzdHJveSwgb25seSBpZiBubyBzZXNzaW9uX3N0YXRlIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2Vzc2lvbi4KKyAqICBPdGhlcndpc2UsIHRoaXMgZnVuY3Rpb24gaGFzIG5vIGVmZmVjdCAoZXhjZXB0IHRoYXQgaXQgc2V0cyAqc2Vzc2lvbiB0byBOVUxMKS4KKyAqCisgKiBSRVRVUk4gVkFMVUU6CisgKiAgMCAgICAgIAk6IFRoZSBzZXNzaW9uIHdhcyByZWNsYWltZWQuCisgKiAgRUlOVkFMIAk6IEEgcGFyYW1ldGVyIGlzIGludmFsaWQuCisgKi8KK2ludCBmZF9zZXNzX3JlY2xhaW0gKCBzdHJ1Y3Qgc2Vzc2lvbiAqKiBzZXNzaW9uICk7CisKKworCisKKy8qCisgKiBGVU5DVElPTjoJZmRfc2Vzc19zdGF0ZV9zdG9yZQorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgaGFuZGxlcgk6IFRoZSBoYW5kbGVyIHdpdGggd2hpY2ggdGhlIHN0YXRlIGlzIHJlZ2lzdGVyZWQuCisgKiAgc2Vzc2lvbgk6IFRoZSBzZXNzaW9uIG9iamVjdCB3aXRoIHdoaWNoIHRoZSBzdGF0ZSBpcyByZWdpc3RlcmVkLgorICogIHN0YXRlCTogQW4gYXBwbGljYXRpb24gc3RhdGUgKG9wYXF1ZSBkYXRhKSB0byBzdG9yZSB3aXRoIHRoZSBzZXNzaW9uLgorICoKKyAqIERFU0NSSVBUSU9OOiAKKyAqICBTdG9yZXMgYW4gYXBwbGljYXRpb24gc3RhdGUgd2l0aCBhIHNlc3Npb24uIFRoaXMgc3RhdGUgY2FuIGxhdGVyIGJlIHJldHJpZXZlZAorICogd2l0aCBmZF9zZXNzX3N0YXRlX3JldHJpZXZlLCBvciBpbXBsaWNpdGx5IGluIHRoZSBjbGVhbnVwIGhhbmRsZXIgd2hlbiB0aGUgc2Vzc2lvbgorICogaXMgZGVzdHJveWVkLgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqICAwICAgICAgCTogVGhlIHN0YXRlIGhhcyBiZWVuIHN0b3JlZC4KKyAqICBFSU5WQUwgCTogQSBwYXJhbWV0ZXIgaXMgaW52YWxpZC4KKyAqICBFQUxSRUFEWQk6IERhdGEgd2FzIGFscmVhZHkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2Vzc2lvbiBhbmQgY2xpZW50LgorICogIEVOT01FTQk6IE5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvbXBsZXRlIHRoZSBvcGVyYXRpb24KKyAqLworaW50IGZkX3Nlc3Nfc3RhdGVfc3RvcmUgKCBzdHJ1Y3Qgc2Vzc2lvbl9oYW5kbGVyICogaGFuZGxlciwgc3RydWN0IHNlc3Npb24gKiBzZXNzaW9uLCBzdHJ1Y3Qgc2Vzc19zdGF0ZSAqKiBzdGF0ZSApOworCisvKgorICogRlVOQ1RJT046CWZkX3Nlc3Nfc3RhdGVfcmV0cmlldmUKKyAqCisgKiBQQVJBTUVURVJTOgorICogIGhhbmRsZXIJOiBUaGUgaGFuZGxlciB3aXRoIHdoaWNoIHRoZSBzdGF0ZSB3YXMgcmVnaXN0ZXJlZC4KKyAqICBzZXNzaW9uCTogVGhlIHNlc3Npb24gb2JqZWN0IHdpdGggd2hpY2ggdGhlIHN0YXRlIHdhcyByZWdpc3RlcmVkLgorICogIHN0YXRlCTogTG9jYXRpb24gd2hlcmUgdGhlIHN0YXRlIG11c3QgYmUgc2F2ZWQgaWYgaXQgaXMgZm91bmQuCisgKgorICogREVTQ1JJUFRJT046IAorICogIFJldHJpZXZlcyBhIHN0YXRlIHNhdmVkIGJ5IGZkX3Nlc3Nfc3RhdGVfc3RvcmUuCisgKiBBZnRlciB0aGlzIGZ1bmN0aW9uIGhhcyBiZWVuIGNhbGxlZCwgdGhlIHN0YXRlIGlzIG5vIGxvbmdlciBhc3NvY2lhdGVkIHdpdGggCisgKiB0aGUgc2Vzc2lvbi4gQSBuZXcgY2FsbCB0byBmZF9zZXNzX3N0YXRlX3N0b3JlIG11c3QgYmUgcGVyZm9ybWVkIGluIG9yZGVyIHRvCisgKiBzdG9yZSBhZ2FpbiB0aGUgZGF0YSB3aXRoIHRoZSBzZXNzaW9uLgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqICAwICAgICAgCTogKnN0YXRlIGlzIHVwZGF0ZWQgKE5VTEwgb3IgcG9pbnRzIHRvIHRoZSBzdGF0ZSBpZiBpdCB3YXMgZm91bmQpLgorICogIEVJTlZBTCAJOiBBIHBhcmFtZXRlciBpcyBpbnZhbGlkLgorICovCitpbnQgZmRfc2Vzc19zdGF0ZV9yZXRyaWV2ZSAoIHN0cnVjdCBzZXNzaW9uX2hhbmRsZXIgKiBoYW5kbGVyLCBzdHJ1Y3Qgc2Vzc2lvbiAqIHNlc3Npb24sIHN0cnVjdCBzZXNzX3N0YXRlICoqIHN0YXRlICk7IAorCisKKy8qIEZvciBkZWJ1ZyAqLworREVDTEFSRV9GRF9EVU1QX1BST1RPVFlQRShmZF9zZXNzX2R1bXAsIHN0cnVjdCBzZXNzaW9uICogc2Vzc2lvbiwgaW50IHdpdGhfc3RhdGVzKTsKK0RFQ0xBUkVfRkRfRFVNUF9QUk9UT1RZUEUoZmRfc2Vzc19kdW1wX2hkbCwgc3RydWN0IHNlc3Npb25faGFuZGxlciAqIGhhbmRsZXIpOworCisvKiBGb3Igc3RhdGlzdGljcyAvIG1vbml0b3Jpbmc6IGdldCB0aGUgbnVtYmVyIG9mIHN0cnVjdCBzZXNzaW9uIGluIG1lbW9yeSAqLworaW50IGZkX3Nlc3NfZ2V0Y291bnQodWludDMyX3QgKmNudCk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgIFJPVVRJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIGhlbHBlcnMgZm9yIHRoZSByb3V0aW5nIG1vZHVsZS4gCisgIFRoZSByb3V0aW5nIGRhdGEgaXMgc3RvcmVkIGluIHRoZSBtZXNzYWdlIGl0c2VsZi4gKi8KKworLyogU3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhlIHJvdXRpbmcgZGF0YSBmb3IgYSBtZXNzYWdlICovCitzdHJ1Y3QgcnRfZGF0YTsKKworLyogRm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgaGVscGVycyB0byBjcmVhdGUgdGhlIHJvdXRpbmcgZGF0YSBvZiBhIG1lc3NhZ2UgKi8KK2ludCAgZmRfcnRkX2luaXQoc3RydWN0IHJ0X2RhdGEgKiogcnRkKTsKK3ZvaWQgZmRfcnRkX2ZyZWUoc3RydWN0IHJ0X2RhdGEgKiogcnRkKTsKKworLyogQWRkIGEgcGVlciB0byB0aGUgY2FuZGlkYXRlcyBsaXN0LiAqLworaW50ICBmZF9ydGRfY2FuZGlkYXRlX2FkZChzdHJ1Y3QgcnRfZGF0YSAqIHJ0ZCwgRGlhbUlkX3QgcGVlcmlkLCBzaXplX3QgcGVlcmlkbGVuLCBEaWFtSWRfdCByZWFsbSwgc2l6ZV90IHJlYWxtbGVuKTsKKworLyogUmVtb3ZlIGEgcGVlciBmcm9tIHRoZSBjYW5kaWRhdGVzIChpZiBpdCBpcyBmb3VuZCkuIFRoZSBzZWFyY2ggaXMgY2FzZS1pbnNlbnNpdGl2ZS4gKi8KK3ZvaWQgZmRfcnRkX2NhbmRpZGF0ZV9kZWwoc3RydWN0IHJ0X2RhdGEgKiBydGQsIHVpbnQ4X3QgKiBpZCwgc2l6ZV90IGlkc3opOworCisvKiBFeHRyYWN0IHRoZSBsaXN0IG9mIHZhbGlkIGNhbmRpZGF0ZXMsIGFuZCBpbml0aWFsaXplIHRoZWlyIHNjb3JlcyB0byAwICovCit2b2lkIGZkX3J0ZF9jYW5kaWRhdGVfZXh0cmFjdChzdHJ1Y3QgcnRfZGF0YSAqIHJ0ZCwgc3RydWN0IGZkX2xpc3QgKiogY2FuZGlkYXRlcywgaW50IGluaV9zY29yZSk7CisKKy8qIElmIGEgcGVlciByZXR1cm5lZCBhIHByb3RvY29sIGVycm9yIGZvciB0aGlzIG1lc3NhZ2UsIHNhdmUgaXQgc28gdGhhdCB3ZSBkb24ndCB0cnkgdG8gc2VuZCBpdCB0aGVyZSBhZ2Fpbi4gT3B0aW9uYWxseSByZXRyaWV2ZSB0aGUgY3VycmVudCBsaXN0IG9mIGNhbmRpZGF0ZXMuICovCitpbnQgIGZkX3J0ZF9lcnJvcl9hZGQoc3RydWN0IHJ0X2RhdGEgKiBydGQsIERpYW1JZF90IHNlbnR0bywgc2l6ZV90IHNlbnR0b2xlbiwgdWludDhfdCAqIG9yaWdpbiwgc2l6ZV90IG9yaWdpbnN6LCB1aW50MzJfdCByY29kZSwgc3RydWN0IGZkX2xpc3QgKiogY2FuZGlkYXRlcywgaW50ICogc2VuZGluZ2F0dGVtdHBzKTsKKworLyogT25seSByZXRyaWV2ZSB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoaXMgbWVzc2FnZSBoYXMgYmVlbiBwcm9jZXNzZWQgYnkgdGhlIHJvdXRpbmctb3V0IG1lY2hhbmlzbSAoaS5lLiBudW1iZXIgb2YgdGltZXMgaXQgd2FzIGZhaWxlZCBvdmVyKSAqLworaW50ICBmZF9ydGRfZ2V0X25iX2F0dGVtcHRzKHN0cnVjdCBydF9kYXRhICogcnRkLCBpbnQgKiBzZW5kaW5nYXR0ZW10cHMpOworCisvKiBUaGUgZXh0cmFjdGVkIGxpc3QgaXRlbXMgaGF2ZSB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZTogKi8KK3N0cnVjdCBydGRfY2FuZGlkYXRlIHsKKwlzdHJ1Y3QgZmRfbGlzdAljaGFpbjsJLyogbGluayBpbiB0aGUgbGlzdCByZXR1cm5lZCBieSB0aGUgcHJldmlvdXMgZmN0cyAqLworCURpYW1JZF90CWRpYW1pZDsJLyogdGhlIGRpYW1ldGVyIElkIG9mIHRoZSBwZWVyICovCisJc2l6ZV90CQlkaWFtaWRsZW47IC8qIGNhY2hlZCBzaXplIG9mIHRoZSBkaWFtaWQgc3RyaW5nICovCisJRGlhbUlkX3QJcmVhbG07CS8qIHRoZSBkaWFtZXRlciByZWFsbSBvZiB0aGUgcGVlciAqLworCXNpemVfdAkJcmVhbG1sZW47IC8qIGNhY2hlZCBzaXplIG9mIHJlYWxtICovCisJaW50CQlzY29yZTsJLyogdGhlIGN1cnJlbnQgcm91dGluZyBzY29yZSBmb3IgdGhpcyBwZWVyLCBzZWUgZmRfcnRfb3V0X3JlZ2lzdGVyIGRlZmluaXRpb24gZm9yIGRldGFpbHMgKi8KK307CisKKy8qIFJlb3JkZXIgdGhlIGxpc3Qgb2YgcGVlcnMgYnkgc2NvcmUgKi8KK2ludCAgZmRfcnRkX2NhbmRpZGF0ZV9yZW9yZGVyKHN0cnVjdCBmZF9saXN0ICogY2FuZGlkYXRlcyk7CisKKy8qIE5vdGUgOiBpdCBpcyBmaW5lIGZvciBhIGNhbGxiYWNrIHRvIGFkZCBhIG5ldyBlbnRyeSBpbiB0aGUgY2FuZGlkYXRlcyBsaXN0IGFmdGVyIHRoZSBsaXN0IGhhcyBiZWVuIGV4dHJhY3RlZC4gVGhlIGRpYW1pZCBtdXN0IHRoZW4gYmUgbWFsbG9jJ2QuICovCisvKiBCZXdhcmUgdGhhdCB0aGlzIGNvdWxkIGxlYWQgdG8gcm91dGluZyBsb29wcyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICBNRVNTQUdFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qIFRoZSBmb2xsb3dpbmcgdHlwZXMgYXJlIG9wYXF1ZSAqLworc3RydWN0CW1zZzsJLyogQSBtZXNzYWdlOiBjb21tYW5kIHdpdGggY2hpbGRyZW4gQVZQcyAocG9zc2libHkgZ3JhbmQgY2hpbGRyZW4pICovCitzdHJ1Y3QJYXZwOwkvKiBBVlAgb2JqZWN0ICovCisKKy8qIFNvbWUgZGV0YWlscyBhYm91dCBjaGFpbmluZzoKKyAqCisgKiAgQSBtZXNzYWdlIGlzIG1hZGUgb2YgYSBoZWFkZXIgKCBtc2cgKSBhbmQgMCBvciBtb3JlIEFWUHMgKCBhdnAgKS4KKyAqIFRoZSBzdHJ1Y3R1cmUgaXMgYSBraW5kIG9mIHRyZWUsIHdoZXJlIHNvbWUgQVZQcyAoZ3JvdXBlZCBBVlBzKSBjYW4gY29udGFpbiBvdGhlciBBVlBzLgorICogRXhhbXBsZToKKyAqIG1zZworICogIHwtYXZwCisgKiAgfC1nYXZwCisgKiAgfCAgIHwtYXZwCisgKiAgfCAgIHwtYXZwCisgKiAgfCAgIFwtYXZwCisgKiAgfC1hdnAKKyAqICBcLWF2cAorICoKKyAqLworCisvKiBUaGUgZm9sbG93aW5nIHR5cGUgaXMgdXNlZCB0byBwb2ludCB0byBlaXRoZXIgYSBtc2cgb3IgYW4gQVZQICovCit0eXBlZGVmIHZvaWQgbXNnX29yX2F2cDsKKworLyogVGhlIERpYW1ldGVyIHByb3RvY29sIHZlcnNpb24gKi8KKyNkZWZpbmUgRElBTUVURVJfVkVSU0lPTgkxCisKKy8qIEluIHRoZSB0d28gZm9sbG93aW5nIHR5cGVzLCBzb21lIGZpZWxkcyBhcmUgbWFya2VkIChSRUFET05MWSkuIAorICogVGhpcyBtZWFucyB0aGF0IHRoZSBjb250ZW50IG9mIHRoZXNlIGZpZWxkcyB3aWxsIGJlIG92ZXJ3cml0dGVuIGJ5IHRoZSBkYWVtb24gc28gbW9kaWZ5aW5nIGl0IGlzIHVzZWxlc3MuCisgKi8KKworLyogVGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgcmVwcmVzZW50cyB0aGUgaGVhZGVyIG9mIGEgbWVzc2FnZS4gQWxsIGRhdGEgaXMgaW4gaG9zdCBieXRlIG9yZGVyLiAqLworc3RydWN0IG1zZ19oZHIgeworCXVpbnQ4X3QJCSBtc2dfdmVyc2lvbjsJCS8qIChSRUFET05MWSkgVmVyc2lvbiBvZiBEaWFtZXRlcjogbXVzdCBiZSBESUFNRVRFUl9WRVJTSU9OLiAqLworCXVpbnQzMl90CSBtc2dfbGVuZ3RoOwkJLyogKFJFQURPTkxZKSgzIGJ5dGVzKSBpbmRpY2F0ZXMgdGhlIGxlbmd0aCBvZiB0aGUgbWVzc2FnZSAqLworCXVpbnQ4X3QJCSBtc2dfZmxhZ3M7CQkvKiBNZXNzYWdlIGZsYWdzOiBDTURfRkxBR18qICovCisJY29tbWFuZF9jb2RlX3QJIG1zZ19jb2RlOwkJLyogKDMgYnl0ZXMpIHRoZSBjb21tYW5kLWNvZGUuIFNlZSBkaWN0aW9uYXJ5LWFwaS5oIGZvciBtb3JlIGRldGFpbCAqLworCWFwcGxpY2F0aW9uX2lkX3QgbXNnX2FwcGw7CQkvKiBUaGUgYXBwbGljYXRpb24gaXNzdWluZyB0aGlzIG1lc3NhZ2UgKi8KKwl1aW50MzJfdAkgbXNnX2hiaGlkOwkJLyogVGhlIEhvcC1ieS1Ib3AgaWRlbnRpZmllciBvZiB0aGUgbWVzc2FnZSAqLworCXVpbnQzMl90CSBtc2dfZXRlaWQ7CQkvKiBUaGUgRW5kLXRvLUVuZCBpZGVudGlmaWVyIG9mIHRoZSBtZXNzYWdlICovCit9OworCisvKiBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZSByZXByZXNlbnRzIHRoZSB2aXNpYmxlIGNvbnRlbnQgb2YgYW4gQVZQLiBBbGwgZGF0YSBpcyBpbiBob3N0IGJ5dGUgb3JkZXIuICovCitzdHJ1Y3QgYXZwX2hkciB7CisJYXZwX2NvZGVfdAkgYXZwX2NvZGU7CQkvKiB0aGUgQVZQIENvZGUgKi8KKwl1aW50OF90CQkgYXZwX2ZsYWdzOwkJLyogQVZQX0ZMQUdfKiBmbGFncyAqLworCXVpbnQzMl90CSBhdnBfbGVuOwkJLyogKFJFQURPTkxZKShPbmx5IDMgYnl0ZXMgYXJlIHVzZWQpIHRoZSBsZW5ndGggb2YgdGhlIEFWUCBhcyBkZXNjcmliZWQgaW4gdGhlIFJGQyAqLworCXZlbmRvcl9pZF90CSBhdnBfdmVuZG9yOwkJLyogT25seSB1c2VkIGlmIEFWUF9GTEFHX1ZFTkRPUiBpcyBwcmVzZW50ICovCisJdW5pb24gYXZwX3ZhbHVlICphdnBfdmFsdWU7CQkvKiBwb2ludGVyIHRvIHRoZSB2YWx1ZSBvZiB0aGUgQVZQLiBOVUxMIG1lYW5zIHRoYXQgdGhlIHZhbHVlIGlzIG5vdCBzZXQgLyBub3QgdW5kZXJzdG9vZC4KKwkJCQkJCSAgIE9uZSBzaG91bGQgbm90IGRpcmVjdGx5IGNoYW5nZSB0aGlzIHZhbHVlLiBVc2UgdGhlIG1zZ19hdnBfc2V0dmFsdWUgZnVuY3Rpb24gaW5zdGVhZC4KKwkJCQkJCSAgIFRoZSBjb250ZW50IG9mIHRoZSBwb2ludGVkIHN0cnVjdHVyZSBjYW4gYmUgY2hhbmdlZCBkaXJlY3RseSwgd2l0aCB0aGlzIHJlc3RyaWN0aW9uOgorCQkJCQkJICAgICBpZiB0aGUgQVZQIGlzIGFuIE9jdGV0U3RyaW5nLCBhbmQgeW91IGNoYW5nZSB0aGUgdmFsdWUgb2YgdGhlIHBvaW50ZXIgYXZwX3ZhbHVlLT5vcy5kYXRhLCB0aGVuCisJCQkJCQkgICAgIHlvdSBtdXN0IGNhbGwgZnJlZSgpIG9uIHRoZSBwcmV2aW91cyB2YWx1ZSwgYW5kIHRoZSBuZXcgb25lIG11c3QgYmUgZnJlZSgpLWFibGUuCisJCQkJCQkgKi8KK307CisKKy8qIFRoZSBmb2xsb3dpbmcgZW51bSBpcyB1c2VkIHRvIGJyb3dzZSBpbnNpZGUgbWVzc2FnZSBoaWVyYXJjaHkgKG1zZywgZ2F2cCwgYXZwKSAqLworZW51bSBtc2dfYnJ3X2RpciB7CisJTVNHX0JSV19ORVhUID0gMSwJLyogR2V0IHRoZSBuZXh0IGVsZW1lbnQgYXQgdGhlIHNhbWUgbGV2ZWwsIG9yIE5VTEwgaWYgdGhpcyBpcyB0aGUgbGFzdCBlbGVtZW50LiAqLworCU1TR19CUldfUFJFViwJCS8qIEdldCB0aGUgcHJldmlvdXMgZWxlbWVudCBhdCB0aGUgc2FtZSBsZXZlbCwgb3IgTlVMTCBpZiB0aGlzIGlzIHRoZSBmaXJzdCBlbGVtZW50LiAqLworCU1TR19CUldfRklSU1RfQ0hJTEQsCS8qIEdldCB0aGUgZmlyc3QgY2hpbGQgQVZQIG9mIHRoaXMgZWxlbWVudCwgaWYgYW55LiAqLworCU1TR19CUldfTEFTVF9DSElMRCwJLyogR2V0IHRoZSBsYXN0IGNoaWxkIEFWUCBvZiB0aGlzIGVsZW1lbnQsIGlmIGFueS4gKi8KKwlNU0dfQlJXX1BBUkVOVCwJCS8qIEdldCB0aGUgcGFyZW50IGVsZW1lbnQgb2YgdGhpcyBlbGVtZW50LCBpZiBhbnkuIE9ubHkgdGhlIG1zZ190IG9iamVjdCBoYXMgbm8gcGFyZW50LiAqLworCU1TR19CUldfV0FMSwkJLyogVGhpcyBpcyBlcXVpdmFsZW50IHRvIEZJUlNUX0NISUxEIG9yIE5FWFQgb3IgUEFSRU5ULT5uZXh0LCBmaXJzdCB0aGF0IGlzIG5vdCBOVUxMLiBVc2UgdGhpcyB0byB3YWxrIGluc2lkZSBhbGwgQVZQcy4gKi8KK307CisKKy8qIFNvbWUgZmxhZ3MgdXNlZCBpbiB0aGUgZnVuY3Rpb25zIGJlbG93ICovCisjZGVmaW5lIEFWUEZMX1NFVF9CTEFOS19WQUxVRQkgICAweDAxCS8qIFdoZW4gY3JlYXRpbmcgYW4gQVZQLCBpbml0aWFsaXplIGl0cyB2YWx1ZSB0byBhIGJsYW5rIGFyZWEgKi8KKyNkZWZpbmUgQVZQRkxfU0VUX1JBV0RBVEFfRlJPTV9BVlAgMHgwMiAvKiBXaGVuIGNyZWF0aW5nIGFuIEFWUCwgaW5pdGlhbGl6ZSBpdHMgcmF3ZGF0YSBhcmVhIGZyb20gYW4gZXhpc3RpbmcgQVZQIC0tIGl0IGlzIG9ubHkgYmxhbmsgcGFkZGluZyAoZm9yIGVycm9yIHJlcG9ydGluZykgKi8KKyNkZWZpbmUgQVZQRkxfTUFYCQkgICBBVlBGTF9TRVRfUkFXREFUQV9GUk9NX0FWUAkvKiBUaGUgYmlnZ2VzdCB2YWxpZCBmbGFnIHZhbHVlICovCisJCisjZGVmaW5lIE1TR0ZMX0FMTE9DX0VURUlECTB4MDEJLyogV2hlbiBjcmVhdGluZyBhIG1lc3NhZ2UsIGEgbmV3IGVuZC10by1lbmQgSUQgaXMgYWxsb2NhdGVkIGFuZCBzZXQgaW4gdGhlIG1lc3NhZ2UgKi8KKyNkZWZpbmUgTVNHRkxfQU5TV19FUlJPUgkweDAyCS8qIFdoZW4gY3JlYXRpbmcgYW4gYW5zd2VyIG1lc3NhZ2UsIHNldCB0aGUgJ0UnIGJpdCBhbmQgdXNlIHRoZSBnZW5lcmljIGVycm9yIEFCTkYgaW5zdGVhZCBvZiBjb21tYW5kLXNwZWNpZmljIEFCTkYgKi8KKyNkZWZpbmUgTVNHRkxfQU5TV19OT1NJRAkweDA0CS8qIFdoZW4gY3JlYXRpbmcgYW4gYW5zd2VyIG1lc3NhZ2UsIGRvIG5vdCBhZGQgdGhlIFNlc3Npb24tSWQgZXZlbiBpZiBwcmVzZW50IGluIHJlcXVlc3QgKi8KKyNkZWZpbmUgTVNHRkxfQU5TV19OT1BST1hZSU5GTwkweDA4CS8qIFdoZW4gY3JlYXRpbmcgYW4gYW5zd2VyIG1lc3NhZ2UsIGRvIG5vdCBhZGQgdGhlIFByb3h5LUluZm8gQVZQcyBwcmVzZW50cyBpbiByZXF1ZXN0ICovCisjZGVmaW5lIE1TR0ZMX01BWAkJTVNHRkxfQU5TV19OT1BST1hZSU5GTwkvKiBUaGUgYmlnZ2VzdCB2YWxpZCBmbGFnIHZhbHVlICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgTWVzc2FnZSBjcmVhdGlvbiwgbWFuaXB1bGF0aW9uLCBkaXNwb3NhbCAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBGVU5DVElPTjoJZmRfbXNnX2F2cF9uZXcKKyAqCisgKiBQQVJBTUVURVJTOgorICogIG1vZGVsIAk6IFBvaW50ZXIgdG8gYSBESUNUX0FWUCBkaWN0aW9uYXJ5IG9iamVjdCBkZXNjcmliaW5nIHRoZSBhdnAgdG8gY3JlYXRlLCBvciBOVUxMIGlmIGZsYWdzIGFyZSB1c2VkLgorICogIGZsYWdzCTogRmxhZ3MgdG8gdXNlIGluIGNyZWF0aW9uIChBVlBGTF8qLCBzZWUgYWJvdmUpLgorICogIGF2cCAJOiBVcG9uIHN1Y2Nlc3MsIHBvaW50ZXIgdG8gdGhlIG5ldyBhdnAgaXMgc3RvcmVkIGhlcmUuIEl0IHBvaW50cyB0byByZWZlcmVuY2UgQVZQIHVwb24gZnVuY3Rpb24gY2FsbCB3aGVuIGZsYWdzIGFyZSB1c2VkLgorICoKKyAqIERFU0NSSVBUSU9OOiAKKyAqICAgQ3JlYXRlIGEgbmV3IEFWUCBpbnN0YW5jZS4KKyAqCisgKiBSRVRVUk4gVkFMVUU6CisgKiAgMCAgICAgIAk6IFRoZSBBVlAgaXMgY3JlYXRlZC4KKyAqICBFSU5WQUwgCTogQSBwYXJhbWV0ZXIgaXMgaW52YWxpZC4KKyAqICAob3RoZXIgc3RhbmRhcmQgZXJyb3JzIG1heSBiZSByZXR1cm5lZCwgdG9vLCB3aXRoIHRoZWlyIHN0YW5kYXJkIG1lYW5pbmcuIEV4YW1wbGU6CisgKiAgICBFTk9NRU0gCTogTWVtb3J5IGFsbG9jYXRpb24gZm9yIHRoZSBuZXcgYXZwIGZhaWxlZC4pCisgKi8KK2ludCBmZF9tc2dfYXZwX25ldyAoIHN0cnVjdCBkaWN0X29iamVjdCAqIG1vZGVsLCBpbnQgZmxhZ3MsIHN0cnVjdCBhdnAgKiogYXZwICk7CisKKy8qCisgKiBGVU5DVElPTjoJZmRfbXNnX25ldworICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgbW9kZWwgCTogUG9pbnRlciB0byBhIERJQ1RfQ09NTUFORCBkaWN0aW9uYXJ5IG9iamVjdCBkZXNjcmliaW5nIHRoZSBtZXNzYWdlIHRvIGNyZWF0ZSwgb3IgTlVMTC4KKyAqICBmbGFncwk6IGNvbWJpbmF0aW9uIG9mIE1TR0ZMXyogZmxhZ3MuCisgKiAgbXNnIAk6IFVwb24gc3VjY2VzcywgcG9pbnRlciB0byB0aGUgbmV3IG1lc3NhZ2UgaXMgc3RvcmVkIGhlcmUuCisgKgorICogREVTQ1JJUFRJT046IAorICogICBDcmVhdGUgYSBuZXcgZW1wdHkgRGlhbWV0ZXIgbWVzc2FnZS4gCisgKgorICogUkVUVVJOIFZBTFVFOgorICogIDAgICAgICAJOiBUaGUgbWVzc2FnZSBpcyBjcmVhdGVkLgorICogIEVJTlZBTCAJOiBBIHBhcmFtZXRlciBpcyBpbnZhbGlkLgorICogIChvdGhlciBzdGFuZGFyZCBlcnJvcnMgbWF5IGJlIHJldHVybmVkLCB0b28sIHdpdGggdGhlaXIgc3RhbmRhcmQgbWVhbmluZy4gRXhhbXBsZToKKyAqICAgIEVOT01FTSAJOiBNZW1vcnkgYWxsb2NhdGlvbiBmb3IgdGhlIG5ldyBtZXNzYWdlIGZhaWxlZC4pCisgKi8KK2ludCBmZF9tc2dfbmV3ICggc3RydWN0IGRpY3Rfb2JqZWN0ICogbW9kZWwsIGludCBmbGFncywgc3RydWN0IG1zZyAqKiBtc2cgKTsKK2ludCBmZF9tc2dfbmV3X2FwcGwgKCBzdHJ1Y3QgZGljdF9vYmplY3QgKiBtb2RlbCwgc3RydWN0IGRpY3Rfb2JqZWN0ICogYXBwbCwgaW50IGZsYWdzLCBzdHJ1Y3QgbXNnICoqIG1zZyApOworCisvKgorICogRlVOQ1RJT046CW1zZ19uZXdfYW5zd2VyX2Zyb21fcmVxCisgKgorICogUEFSQU1FVEVSUzoKKyAqICBkaWN0CTogUG9pbnRlciB0byB0aGUgZGljdGlvbmFyeSBjb250YWluaW5nIHRoZSBtb2RlbCBvZiB0aGUgcXVlcnkuCisgKiAgbXNnCQk6IFRoZSBsb2NhdGlvbiBvZiB0aGUgcXVlcnkgb24gZnVuY3Rpb24gY2FsbC4gVXBkYXRlZCBieSB0aGUgbG9jYXRpb24gb2YgYW5zd2VyIG1lc3NhZ2Ugb24gcmV0dXJuLgorICogIGZsYWcgICAgICAgIDogUGFzcyBNU0dGTF9BTlNXX0VSUk9SIHRvIGluZGljYXRlIGlmIHRoZSBhbnN3ZXIgaXMgYW4gZXJyb3IgbWVzc2FnZSAod2lsbCBzZXQgdGhlICdFJyBiaXQpCisgKiAgICAgICAgICAgICAgOiBTZWUgb3RoZXIgTVNHRkxfQU5TV18qIGRlZmluaXRpb24gYWJvdmUgZm9yIG90aGVyIGZsYWdzLgorICoKKyAqIERFU0NSSVBUSU9OOiAKKyAqICAgVGhpcyBmdW5jdGlvbiBjcmVhdGVzIHRoZSBlbXB0eSBhbnN3ZXIgbWVzc2FnZSBjb3JyZXNwb25kaW5nIHRvIGEgcmVxdWVzdC4KKyAqICBUaGUgaGVhZGVyIGlzIHNldCBwcm9wZXJseSAoUiBmbGFnLCBjY29kZSwgYXBwaWQsIGhiaGlkLCBldGVpZCkKKyAqICBUaGUgU2Vzc2lvbi1JZCBBVlAgaXMgY29waWVkIGlmIHByZXNlbnQuCisgKiAgVGhlIGNhbGxpbmcgY29kZSBzaG91bGQgdXN1YWxseSBjYWxsIGZkX21zZ19yZXNjb2RlX3NldCBmdW5jdGlvbiBvbiB0aGUgYW5zd2VyLgorICogIFVwb24gcmV0dXJuLCB0aGUgb3JpZ2luYWwgcXVlcnkgbWF5IGJlIHJldHJpZXZlZCBieSBjYWxsaW5nIGZkX21zZ19hbnN3X2dldHEgb24gdGhlIG1lc3NhZ2UuCisgKgorICogUkVUVVJOIFZBTFVFOgorICogIDAgICAgICAJOiBPcGVyYXRpb24gY29tcGxldGUuCisgKiAgITAgICAgICAJOiBhbiBlcnJvciBvY2N1cnJlZC4KKyAqLworaW50IGZkX21zZ19uZXdfYW5zd2VyX2Zyb21fcmVxICggc3RydWN0IGRpY3Rpb25hcnkgKiBkaWN0LCBzdHJ1Y3QgbXNnICoqIG1zZywgaW50IGZsYWcgKTsKKworLyoKKyAqIEZVTkNUSU9OOglmZF9tc2dfYnJvd3NlCisgKgorICogUEFSQU1FVEVSUzoKKyAqICByZWZlcmVuY2UgCTogUG9pbnRlciB0byBhIHN0cnVjdCBtc2cgb3Igc3RydWN0IGF2cC4KKyAqICBkaXIgICAgICAgICA6IERpcmVjdGlvbiBmb3IgYnJvd3NpbmcKKyAqICBmb3VuZCAgICAgICA6IElmIG5vdCBOVUxMLCB1cGRhdGVkIHdpdGggdGhlIGVsZW1lbnQgdGhhdCBoYXMgYmVlbiBmb3VuZCwgaWYgYW55LCBvciBOVUxMIGlmIG5vIGVsZW1lbnQgd2FzIGZvdW5kIC8gYW4gZXJyb3Igb2NjdXJyZWQuCisgKiAgZGVwdGgJOiBJZiBub3QgTlVMTCwgcG9pbnRzIHRvIGFuIGludGVnZXIgcmVwcmVzZW50aW5nIHRoZSAiZGVwdGgiIG9mIHRoaXMgb2JqZWN0IGluIHRoZSB0cmVlLiBUaGlzIGlzIGEgcmVsYXRpdmUgdmFsdWUsIHVwZGF0ZWQgb24gcmV0dXJuLgorICoKKyAqIERFU0NSSVBUSU9OOiAKKyAqICAgRXhwbG9yZSB0aGUgY29udGVudCBvZiBhIG1lc3NhZ2Ugb2JqZWN0IChoaWVyYXJjaHkpLiBJZiAiZm91bmQiIGlzIG51bGwsIG9ubHkgZXJyb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgorICogIElmICJkZXB0aCIgaXMgcHJvdmlkZWQsIGl0IGlzIHVwZGF0ZWQgYXMgZm9sbG93IG9uIHN1Y2Nlc3NmdWwgZnVuY3Rpb24gcmV0dXJuOgorICogICAtIG5vdCBtb2RpZmllZCBmb3IgTVNHX0JSV19ORVhUIGFuZCBNU0dfQlJXX1BSRVYuCisgKiAgIC0gKmRlcHRoID0gKmRlcHRoICsgMSBmb3IgTVNHX0JSV19GSVJTVF9DSElMRCBhbmQgTVNHX0JSV19MQVNUX0NISUxELgorICogICAtICpkZXB0aCA9ICpkZXB0aCAtIDEgZm9yIE1TR19CUldfUEFSRU5ULgorICogICAtICpkZXB0aCA9ICpkZXB0aCArIFggZm9yIE1TR19CUldfV0FMSywgd2l0aCBYIGJldHdlZW4gMSAocmV0dXJuZWQgdGhlIDFzdCBjaGlsZCkgYW5kIC1OIChyZXR1cm5lZCB0aGUgTnRoIHBhcmVudCdzIG5leHQpLgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqICAwICAgICAgCTogZm91bmQgaGFzIGJlZW4gdXBkYXRlZCAoaWYgbm9uIE5VTEwpLgorICogIEVJTlZBTCAJOiBBIHBhcmFtZXRlciBpcyBpbnZhbGlkLgorICogIEVOT0VOVAk6IE5vIGVsZW1lbnQgaGFzIGJlZW4gZm91bmQgd2hlcmUgcmVxdWVzdGVkLCBhbmQgImZvdW5kIiB3YXMgTlVMTCAob3RoZXJ3aXNlLCAqZm91bmQgaXMgc2V0IHRvIE5VTEwgYW5kIDAgaXMgcmV0dXJuZWQpLiAKKyAqLworaW50IGZkX21zZ19icm93c2VfaW50ZXJuYWwgKCBtc2dfb3JfYXZwICogcmVmZXJlbmNlLCBlbnVtIG1zZ19icndfZGlyIGRpciwgbXNnX29yX2F2cCAqKiBmb3VuZCwgaW50ICogZGVwdGggKTsKKy8qIE1hY3JvIHRvIGF2b2lkIGhhdmluZyB0byBjYXN0IHRoZSB0aGlyZCBwYXJhbWV0ZXIgZXZlcnl3aGVyZSAqLworI2RlZmluZSBmZF9tc2dfYnJvd3NlKCByZWYsIGRpciwgZm91bmQsIGRlcHRoICkJXAorCWZkX21zZ19icm93c2VfaW50ZXJuYWwoIChyZWYpLCAoZGlyKSwgKHZvaWQgKikoZm91bmQpLCAoZGVwdGgpICkKKworCisvKgorICogRlVOQ1RJT046CWZkX21zZ19hdnBfYWRkCisgKgorICogUEFSQU1FVEVSUzoKKyAqICByZWZlcmVuY2UgCTogUG9pbnRlciB0byBhIHZhbGlkIG1zZyBvciBhdnAuCisgKiAgZGlyICAgICAgICAgOiBsb2NhdGlvbiB3aGVyZSB0aGUgbmV3IEFWUCBzaG91bGQgYmUgaW5zZXJ0ZWQsIHJlbGF0aXZlIHRvIHRoZSByZWZlcmVuY2UuIE1TR19CUldfUEFSRU5UIGFuZCBNU0dfQlJXX1dBTEsgYXJlIG5vdCB2YWxpZC4KKyAqICBhdnAgICAgICAgICA6IHBvaW50ZXIgdG8gdGhlIEFWUCBvYmplY3QgdGhhdCBtdXN0IGJlIGluc2VydGVkLgorICoKKyAqIERFU0NSSVBUSU9OOiAKKyAqICAgQWRkcyBhbiBBVlAgaW50byBhbiBvYmplY3QgdGhhdCBjYW4gY29udGFpbiBpdDogZ3JvdXBlZCBBVlAgb3IgbWVzc2FnZS4KKyAqIE5vdGUgdGhhdCB0aGUgYWRkZWQgQVZQIHdpbGwgYmUgZnJlZWQgYXQgdGhlIHNhbWUgdGltZSBhcyB0aGUgb2JqZWN0IGl0IGlzIGFkZGVkIHRvLCAKKyAqIHNvIGl0IHNob3VsZCBub3QgYmUgZnJlZWQgYWZ0ZXIgdGhlIGNhbGwgdG8gdGhpcyBmdW5jdGlvbi4KKyAqCisgKiBSRVRVUk4gVkFMVUU6CisgKiAgMCAgICAgIAk6IFRoZSBBVlAgaGFzIGJlZW4gYWRkZWQuCisgKiAgRUlOVkFMIAk6IEEgcGFyYW1ldGVyIGlzIGludmFsaWQuCisgKi8KK2ludCBmZF9tc2dfYXZwX2FkZCAoIG1zZ19vcl9hdnAgKiByZWZlcmVuY2UsIGVudW0gbXNnX2Jyd19kaXIgZGlyLCBzdHJ1Y3QgYXZwICphdnApOworCisvKgorICogRlVOQ1RJT046CWZkX21zZ19zZWFyY2hfYXZwCisgKgorICogUEFSQU1FVEVSUzoKKyAqICBtc2cgCTogVGhlIG1lc3NhZ2Ugc3RydWN0dXJlIGluIHdoaWNoIHRvIHNlYXJjaCB0aGUgQVZQLgorICogIHdoYXQgCTogVGhlIGRpY3Rpb25hcnkgbW9kZWwgb2YgdGhlIEFWUCB0byBzZWFyY2guCisgKiAgYXZwCQk6IGxvY2F0aW9uIHdoZXJlIHRoZSBBVlAgcmVmZXJlbmNlIGlzIHN0b3JlZCBpZiBmb3VuZC4KKyAqCisgKiBERVNDUklQVElPTjogCisgKiAgIFNlYXJjaCB0aGUgZmlyc3QgdG9wLWxldmVsIEFWUCBvZiBhIGdpdmVuIG1vZGVsIGluc2lkZSBhIG1lc3NhZ2UuCisgKiBOb3RlOiBvbmx5IHRoZSBmaXJzdCBpbnN0YW5jZSBvZiB0aGUgQVZQIGlzIHJldHVybmVkIGJ5IHRoaXMgZnVuY3Rpb24uCisgKiBOb3RlOiBvbmx5IHRvcC1sZXZlbCBBVlBzIGFyZSBzZWFyY2hlZCwgbm90IGluc2lkZSBncm91cGVkIEFWUHMuCisgKiBVc2UgbXNnX2Jyb3dzZSBpZiB5b3UgbmVlZCBtb3JlIGFkdmFuY2VkIHJlc2VhcmNoIGZlYXR1cmVzLgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqICAwICAgICAgCTogVGhlIEFWUCBoYXMgYmVlbiBmb3VuZC4KKyAqICBFSU5WQUwgCTogQSBwYXJhbWV0ZXIgaXMgaW52YWxpZC4KKyAqICBFTk9FTlQJOiBObyBBVlAgaGFzIGJlZW4gZm91bmQsIGFuZCAiYXZwIiB3YXMgTlVMTCAob3RoZXJ3aXNlLCAqYXZwIGlzIHNldCB0byBOVUxMIGFuZCAwIHJldHVybmVkKS4KKyAqLworaW50IGZkX21zZ19zZWFyY2hfYXZwICggc3RydWN0IG1zZyAqIG1zZywgc3RydWN0IGRpY3Rfb2JqZWN0ICogd2hhdCwgc3RydWN0IGF2cCAqKiBhdnAgKTsKKworLyoKKyAqIEZVTkNUSU9OOglmZF9tc2dfZnJlZQorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgb2JqZWN0ICAgICAgOiBwb2ludGVyIHRvIHRoZSBtZXNzYWdlIG9yIEFWUCBvYmplY3QgdGhhdCBtdXN0IGJlIHVubGlua2VkIGFuZCBmcmVlZC4KKyAqCisgKiBERVNDUklQVElPTjogCisgKiAgIFVubGluayBhbmQgZnJlZSBhIG1lc3NhZ2Ugb3IgQVZQIG9iamVjdCBhbmQgaXRzIGNoaWxkcmVuLgorICogIElmIHRoZSBvYmplY3QgaXMgYW4gQVZQIGxpbmtlZCBpbnRvIGEgbWVzc2FnZSwgdGhlIEFWUCBpcyByZW1vdmVkIGJlZm9yZSBiZWluZyBmcmVlZC4KKyAqCisgKiBSRVRVUk4gVkFMVUU6CisgKiAgMCAgICAgIAk6IFRoZSBtZXNzYWdlIGhhcyBiZWVuIGZyZWVkLgorICogIEVJTlZBTCAJOiBBIHBhcmFtZXRlciBpcyBpbnZhbGlkLgorICovCitpbnQgZmRfbXNnX2ZyZWUgKCBtc2dfb3JfYXZwICogb2JqZWN0ICk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgIER1bXAgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBGVU5DVElPTjoJZmRfbXNnX2R1bXBfKgorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgc2VlIGRlZmluaXRpb24gb2YgREVDTEFSRV9GRF9EVU1QX1BST1RPVFlQRSwKKyAqICBvYmoJCSA6IEEgbXNnIG9yIGF2cCBvYmplY3QgdG8gZHVtcC4KKyAqICBkaWN0ICAgICAgICAgOiB0aGUgZGljdGlvbmFyeSB0byB1c2UgaWYgcGFyc2luZyBpcyByZXF1ZXN0ZWQgKG9wdGlvbmFsKQorICogIGZvcmNlX3BhcnNpbmc6IGJ5IGRlZmF1bHQgdGhlc2UgZnVuY3Rpb25zIGRvIG5vdCBwYXJzZSB0aGUgb2JqZWN0IGJ1dCBkdW1wIGhleGEgdmFsdWVzIGluIHRoYXQgY2FzZS4KKyAqICAgICAgICAgICAgICAgICB1c2UgITAgdG8gZm9yY2UgcGFyc2luZy4gSWYgcGFyc2luZyBmYWlscywgdGhlIGhleGEgZHVtcCBpcyBzdGlsbCBwcm92aWRlZC4KKyAqICByZWN1cnNlICAgICAgOiBhbGxvdyB0aGUgZnVuY3Rpb24gdG8gZ28gdGhyb3VnaCB0aGUgY2hpbGRyZW4gb2JqZWN0cyBpZiBhbnkgdG8gZHVtcCBtb3JlIGluZm9ybWF0aW9uLiBtaWdodCByZXF1aXJlIHBhcnNpbmcuCisgKgorICogREVTQ1JJUFRJT046IAorICogICBUaGVzZSBmdW5jdGlvbnMgZHVtcCB0aGUgY29udGVudCBvZiBhIG1lc3NhZ2Ugb3IgYXZwIGludG8gYSBidWZmZXIKKyAqIGVpdGhlciByZWN1cnNpdmVseSBvciBvbmx5IHRoZSBvYmplY3QgaXRzZWxmLgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqICAgLSBzZWUgREVDTEFSRV9GRF9EVU1QX1BST1RPVFlQRSwKKyAqLworLyogb25lLWxpbmUgZHVtcCB3aXRoIG9ubHkgc2hvcnQgaW5mb3JtYXRpb24gKi8KK0RFQ0xBUkVfRkRfRFVNUF9QUk9UT1RZUEUoIGZkX21zZ19kdW1wX3N1bW1hcnksIG1zZ19vcl9hdnAgKm9iaiwgc3RydWN0IGRpY3Rpb25hcnkgKmRpY3QsIGludCBmb3JjZV9wYXJzaW5nLCBpbnQgcmVjdXJzZSApOworLyogb25lLWxpbmUgZHVtcCB3aXRoIGFsbCB0aGUgY29udGVudHMgb2YgdGhlIG1lc3NhZ2UgKi8KK0RFQ0xBUkVfRkRfRFVNUF9QUk9UT1RZUEUoIGZkX21zZ19kdW1wX2Z1bGwsIG1zZ19vcl9hdnAgKm9iaiwgc3RydWN0IGRpY3Rpb25hcnkgKmRpY3QsIGludCBmb3JjZV9wYXJzaW5nLCBpbnQgcmVjdXJzZSApOworLyogbXVsdGktbGluZSBodW1hbi1yZWFkYWJsZSBkdW1wIHNpbWlsYXIgdG8gd2lyZXNoYXJrIG91dHB1dCAqLworREVDTEFSRV9GRF9EVU1QX1BST1RPVFlQRSggZmRfbXNnX2R1bXBfdHJlZXZpZXcsIG1zZ19vcl9hdnAgKm9iaiwgc3RydWN0IGRpY3Rpb25hcnkgKmRpY3QsIGludCBmb3JjZV9wYXJzaW5nLCBpbnQgcmVjdXJzZSApOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgIE1lc3NhZ2UgbWV0YWRhdGEgbWFuYWdlbWVudCBmdW5jdGlvbnMgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBGVU5DVElPTjoJZmRfbXNnX21vZGVsCisgKgorICogUEFSQU1FVEVSUzoKKyAqICByZWZlcmVuY2UgCTogUG9pbnRlciB0byBhIHZhbGlkIG1zZyBvciBhdnAuCisgKiAgbW9kZWwgICAgICAgOiBvbiBzdWNjZXNzLCBwb2ludGVyIHRvIHRoZSBkaWN0aW9uYXJ5IG1vZGVsIG9mIHRoaXMgY29tbWFuZCBvciBBVlAuIE5VTEwgaWYgdGhlIG1vZGVsIGlzIHVua25vd24uCisgKgorICogREVTQ1JJUFRJT046IAorICogICBSZXRyaWV2ZSB0aGUgZGljdGlvbmFyeSBvYmplY3QgZGVzY3JpYmluZyB0aGlzIG1lc3NhZ2Ugb3IgYXZwLiBJZiB0aGUgb2JqZWN0IGlzIHVua25vd24gb3IgdGhlIGZkX21zZ19wYXJzZV9kaWN0IGhhcyBub3QgYmVlbiBjYWxsZWQsCisgKiAgKm1vZGVsIGlzIHNldCB0byBOVUxMLgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqICAwICAgICAgCTogVGhlIG1vZGVsIGhhcyBiZWVuIHNldC4KKyAqICBFSU5WQUwgCTogQSBwYXJhbWV0ZXIgaXMgaW52YWxpZC4KKyAqLworaW50IGZkX21zZ19tb2RlbCAoIG1zZ19vcl9hdnAgKiByZWZlcmVuY2UsIHN0cnVjdCBkaWN0X29iamVjdCAqKiBtb2RlbCApOworCisvKgorICogRlVOQ1RJT046CWZkX21zZ19oZHIKKyAqCisgKiBQQVJBTUVURVJTOgorICogIG1zZyAJOiBQb2ludGVyIHRvIGEgdmFsaWQgbWVzc2FnZSBvYmplY3QuCisgKiAgcGRhdGEgCTogVXBvbiBzdWNjZXNzLCBwb2ludGVyIHRvIHRoZSBtc2dfaGRyIHN0cnVjdHVyZSBvZiB0aGlzIG1lc3NhZ2UuIFRoZSBmaWVsZHMgbWF5IGJlIG1vZGlmaWVkLgorICoKKyAqIERFU0NSSVBUSU9OOiAKKyAqICAgUmV0cmlldmUgbG9jYXRpb24gb2YgbW9kaWZpYWJsZSBzZWN0aW9uIG9mIGEgbWVzc2FnZS4gCisgKgorICogUkVUVVJOIFZBTFVFOgorICogIDAgICAgICAJOiBUaGUgbG9jYXRpb24gaGFzIGJlZW4gd3JpdHRlbi4KKyAqICBFSU5WQUwgCTogQSBwYXJhbWV0ZXIgaXMgaW52YWxpZC4KKyAqLworaW50IGZkX21zZ19oZHIgKCBzdHJ1Y3QgbXNnICptc2csIHN0cnVjdCBtc2dfaGRyICoqIHBkYXRhICk7CisKKy8qCisgKiBGVU5DVElPTjoJZmRfbXNnX2F2cF9oZHIKKyAqCisgKiBQQVJBTUVURVJTOgorICogIGF2cCAJOiBQb2ludGVyIHRvIGEgdmFsaWQgYXZwIG9iamVjdC4KKyAqICBwZGF0YSAJOiBVcG9uIHN1Y2Nlc3MsIHBvaW50ZXIgdG8gdGhlIGF2cF9oZHIgc3RydWN0dXJlIG9mIHRoaXMgYXZwLiBUaGUgZmllbGRzIG1heSBiZSBtb2RpZmllZC4KKyAqCisgKiBERVNDUklQVElPTjogCisgKiAgIFJldHJpZXZlIGxvY2F0aW9uIG9mIG1vZGlmaWFibGUgZGF0YSBvZiBhbiBhdnAuIAorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqICAwICAgICAgCTogVGhlIGxvY2F0aW9uIGhhcyBiZWVuIHdyaXR0ZW4uCisgKiAgRUlOVkFMIAk6IEEgcGFyYW1ldGVyIGlzIGludmFsaWQuCisgKi8KK2ludCBmZF9tc2dfYXZwX2hkciAoIHN0cnVjdCBhdnAgKmF2cCwgc3RydWN0IGF2cF9oZHIgKiogcGRhdGEgKTsKKworLyoKKyAqIEZVTkNUSU9OOglmZF9tc2dfYW5zd19hc3NvY2lhdGUsIGZkX21zZ19hbnN3X2dldHEsIGZkX21zZ19hbnN3X2RldGFjaAorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgYW5zd2VyCTogdGhlIHJlY2VpdmVkIGFuc3dlciBtZXNzYWdlCisgKiAgcXVlcnkJOiB0aGUgY29ycmVzcG9uZGluZyBxdWVyeSB0aGF0IGhhZCBiZWVuIHNlbnQKKyAqCisgKiBERVNDUklQVElPTjoKKyAqICBmZF9tc2dfYW5zd19hc3NvY2lhdGUgYXNzb2NpYXRlcyBhIHF1ZXJ5IG1zZyB3aXRoIHRoZSByZWNlaXZlZCBhbnN3ZXIuIAorICogUXVlcnkgaXMgcmV0cmlldmVkIHdpdGggZmRfbXNnX2Fuc3dfZ2V0cS4KKyAqIElmIGFuc3dlciBtZXNzYWdlIGlzIGZyZWVkLCB0aGUgcXVlcnkgaXMgYWxzbyBmcmVlZC4KKyAqIElmIHRoZSBtc2dfYW5zd19kZXRhY2ggZnVuY3Rpb24gaXMgY2FsbGVkLCB0aGUgYXNzb2NpYXRpb24gaXMgcmVtb3ZlZC4KKyAqIFRoaXMgaXMgbWVhbnQgdG8gYmUgY2FsbGVkIGZyb20gdGhlIGRhZW1vbiBvbmx5LgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqICAwIAkgIDogb2sKKyAqICBFSU5WQUw6IGEgcGFyYW1ldGVyIGlzIGludmFsaWQKKyAqLworaW50IGZkX21zZ19hbnN3X2Fzc29jaWF0ZSggc3RydWN0IG1zZyAqIGFuc3dlciwgc3RydWN0IG1zZyAqIHF1ZXJ5ICk7CitpbnQgZmRfbXNnX2Fuc3dfZ2V0cSAgICAgKCBzdHJ1Y3QgbXNnICogYW5zd2VyLCBzdHJ1Y3QgbXNnICoqIHF1ZXJ5ICk7CitpbnQgZmRfbXNnX2Fuc3dfZGV0YWNoICAgKCBzdHJ1Y3QgbXNnICogYW5zd2VyICk7CisKKy8qCisgKiBGVU5DVElPTjoJZmRfbXNnX2Fuc2NiX2Fzc29jaWF0ZSwgZmRfbXNnX2Fuc2NiX2dldAorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgbXNnCQk6IHRoZSByZXF1ZXN0IG1lc3NhZ2UKKyAqICBhbnNjYgk6IHRoZSBjYWxsYmFjayB0byBhc3NvY2lhdGUgd2l0aCB0aGUgbWVzc2FnZQorICogIGRhdGEJOiB0aGUgZGF0YSB0byBwYXNzIHRvIHRoZSBjYWxsYmFjaworICogIGV4cGlyZWNiICAgIDogdGhlIGV4cGlyYXRpb24gY2FsbGJhY2sgdG8gYXNzb2NpYXRlIHdpdGggdGhlIG1lc3NhZ2UKKyAqICB0aW1lb3V0ICAgICA6IChvcHRpb25hbCwgdXNlIE5VTEwgaWYgbm8gdGltZW91dCkgYSB0aW1lb3V0IGFzc29jaWF0ZWQgd2l0aCBjYWxsaW5nIHRoZSBjYi4KKyAqCisgKiBERVNDUklQVElPTjoKKyAqICBBc3NvY2lhdGUgb3IgcmV0cmlldmUgY2FsbGJhY2tzIHdpdGggYW4gbWVzc2FnZS4KKyAqIFRoaXMgaXMgbWVhbnQgdG8gYmUgY2FsbGVkIGZyb20gdGhlIGRhZW1vbiBvbmx5LgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqICAwIAkgIDogb2sKKyAqICBFSU5WQUw6IGEgcGFyYW1ldGVyIGlzIGludmFsaWQKKyAqLworaW50IGZkX21zZ19hbnNjYl9hc3NvY2lhdGUoIHN0cnVjdCBtc2cgKiBtc2csIHZvaWQgKCAqYW5zY2IpKHZvaWQgKiwgc3RydWN0IG1zZyAqKiksIHZvaWQgICogZGF0YSwgdm9pZCAoKmV4cGlyZWNiKSh2b2lkICosIERpYW1JZF90LCBzaXplX3QsIHN0cnVjdCBtc2cgKiopLCBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVvdXQgKTsKK2ludCBmZF9tc2dfYW5zY2JfZ2V0KCBzdHJ1Y3QgbXNnICogbXNnLCB2b2lkICgqKmFuc2NiKSh2b2lkICosIHN0cnVjdCBtc2cgKiopLCB2b2lkICgqKmV4cGlyZWNiKSh2b2lkICosIERpYW1JZF90LCBzaXplX3QsIHN0cnVjdCBtc2cgKiopLCB2b2lkICoqIGRhdGEgKTsKK2ludCBmZF9tc2dfYW5zY2JfcmVzZXQoc3RydWN0IG1zZyAqIG1zZywgaW50IGNsZWFyX2Fuc2NiLCBpbnQgY2xlYXJfZXhwaXJlY2IpOworc3RydWN0IHRpbWVzcGVjICpmZF9tc2dfYW5zY2JfZ2V0dGltZW91dCggc3RydWN0IG1zZyAqIG1zZyApOyAvKiByZXR1cm5zIE5VTEwgb3IgYSB2YWxpZCBub24tMCB0aW1lc3BlYyAqLworCisvKgorICogRlVOQ1RJT046CWZkX21zZ19ydF9hc3NvY2lhdGUsIGZkX21zZ19ydF9nZXQKKyAqCisgKiBQQVJBTUVURVJTOgorICogIG1zZwkJOiB0aGUgcXVlcnkgbWVzc2FnZSB0byBiZSBzZW50CisgKiAgbGlzdAk6IHRoZSBvcmRlcmVkIGxpc3Qgb2YgcG9zc2libGUgbmV4dC1wZWVycworICoKKyAqIERFU0NSSVBUSU9OOgorICogIEFzc29jaWF0ZSBhIHJvdXRpbmcgbGlzdCB3aXRoIGEgcXVlcnksIGFuZCByZXRyaWV2ZSBpdC4KKyAqIElmIHRoZSBtZXNzYWdlIGlzIGZyZWVkLCB0aGUgbGlzdCBpcyBhbHNvIGZyZWVkLgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqICAwIAkgIDogb2sKKyAqICBFSU5WQUw6IGEgcGFyYW1ldGVyIGlzIGludmFsaWQKKyAqLworaW50IGZkX21zZ19ydF9hc3NvY2lhdGUoIHN0cnVjdCBtc2cgKiBtc2csIHN0cnVjdCBydF9kYXRhICogcnRkICk7CitpbnQgZmRfbXNnX3J0X2dldCAgICAgICggc3RydWN0IG1zZyAqIG1zZywgc3RydWN0IHJ0X2RhdGEgKiogcnRkICk7CisKKy8qCisgKiBGVU5DVElPTjoJZmRfbXNnX2lzX3JvdXRhYmxlCisgKgorICogUEFSQU1FVEVSUzoKKyAqICBtc2cJCTogQSBtc2cgb2JqZWN0LgorICoKKyAqIERFU0NSSVBUSU9OOiAKKyAqICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgYm9vbGVhbiB0ZWxsaW5nIGlmIGEgZ2l2ZW4gbWVzc2FnZSBpcyByb3V0YWJsZSBpbiB0aGUgRGlhbWV0ZXIgbmV0d29yaywgCisgKiAgb3IgaWYgaXQgaXMgYSBsb2NhbCBsaW5rIG1lc3NhZ2Ugb25seSAoZXg6IENFUi9DRUEsIERXUi9EV0EsIC4uLikuCisgKgorICogUkVUVVJOIFZBTFVFOgorICogIDAgICAgICAJOiBUaGUgbWVzc2FnZSBpcyBub3Qgcm91dGFibGUgLyBhbiBlcnJvciBvY2N1cnJlZC4KKyAqICAxICAgICAgCTogVGhlIG1lc3NhZ2UgaXMgcm91dGFibGUuCisgKi8KK2ludCBmZF9tc2dfaXNfcm91dGFibGUgKCBzdHJ1Y3QgbXNnICogbXNnICk7CisKKy8qCisgKiBGVU5DVElPTjoJZmRfbXNnX3NvdXJjZV8oZy9zKWV0CisgKgorICogUEFSQU1FVEVSUzoKKyAqICBtc2cJCTogQSBtc2cgb2JqZWN0LgorICogIGRpYW1pZCxsZW4JOiBUaGUgZGlhbWV0ZXIgaWQgb2YgdGhlIHBlZXIgZnJvbSB3aGljaCB0aGlzIG1lc3NhZ2Ugd2FzIHJlY2VpdmVkLgorICogIGRpY3QJOiBhIGRpY3Rpb25hcnkgd2l0aCBkZWZpbml0aW9uIG9mIFJvdXRlLVJlY29yZCBBVlAgKGZvciBmZF9tc2dfc291cmNlX3NldHJyKQorICoKKyAqIERFU0NSSVBUSU9OOiAKKyAqICAgU3RvcmUgb3IgcmV0cmlldmUgdGhlIGRpYW1ldGVkIGlkIG9mIHRoZSBwZWVyIGZyb20gd2hpY2ggdGhpcyBtZXNzYWdlIHdhcyByZWNlaXZlZC4KKyAqIFdpbGwgYmUgdXNlZCBmb3IgZXhhbXBsZSBieSB0aGUgcm91dGluZyBtb2R1bGUgdG8gYWRkIHRoZSBSb3V0ZS1SZWNvcmQgQVZQIGluIGZvcndhcmRlZCByZXF1ZXN0cywKKyAqIG9yIHRvIGRpcmVjdCBhbnN3ZXJzIHRvIHRoZSBhcHByb3ByaWF0ZSBwZWVyLgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqICAwICAgICAgCTogT3BlcmF0aW9uIGNvbXBsZXRlLgorICogICEwICAgICAgCTogYW4gZXJyb3Igb2NjdXJyZWQuCisgKi8KK2ludCBmZF9tc2dfc291cmNlX3NldCggc3RydWN0IG1zZyAqIG1zZywgRGlhbUlkX3QgZGlhbWlkLCBzaXplX3QgZGlhbWlkbGVuICk7CitpbnQgZmRfbXNnX3NvdXJjZV9zZXRyciggc3RydWN0IG1zZyAqIG1zZywgRGlhbUlkX3QgZGlhbWlkLCBzaXplX3QgZGlhbWlkbGVuLCBzdHJ1Y3QgZGljdGlvbmFyeSAqIGRpY3QgKTsKK2ludCBmZF9tc2dfc291cmNlX2dldCggc3RydWN0IG1zZyAqIG1zZywgRGlhbUlkX3QgKmRpYW1pZCwgc2l6ZV90ICogZGlhbWlkbGVuICk7CisKKy8qCisgKiBGVU5DVElPTjoJZmRfbXNnX2V0ZWlkX2dldAorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgLQorICoKKyAqIERFU0NSSVBUSU9OOiAKKyAqICAgR2V0IGEgbmV3IHVuaXF1ZSBlbmQtdG8tZW5kIGlkIHZhbHVlIGZvciB0aGUgbG9jYWwgcGVlci4KKyAqCisgKiBSRVRVUk4gVkFMVUU6CisgKiAgVGhlIG5ldyBhc3NpZ25lZCB2YWx1ZS4gTm8gZXJyb3IgY29kZSBpcyBkZWZpbmVkLgorICovCit1aW50MzJfdCBmZF9tc2dfZXRlaWRfZ2V0ICggdm9pZCApOworCisKKy8qCisgKiBGVU5DVElPTjoJZmRfbXNnX3Nlc3NfZ2V0CisgKgorICogUEFSQU1FVEVSUzoKKyAqICBkaWN0CTogdGhlIGRpY3Rpb25hcnkgdGhhdCBjb250YWlucyB0aGUgU2Vzc2lvbi1JZCBBVlAgZGVmaW5pdGlvbgorICogIG1zZwkJOiBBIHZhbGlkIG1lc3NhZ2UuCisgKiAgc2Vzc2lvbgk6IExvY2F0aW9uIHRvIHN0b3JlIHRoZSBzZXNzaW9uIHBvaW50ZXIgd2hlbiByZXRyaWV2ZWQuCisgKiAgaXNuZXcJOiBJbmRpY2F0ZXMgaWYgdGhlIHNlc3Npb24gaGFzIGJlZW4gY3JlYXRlZC4KKyAqCisgKiBERVNDUklQVElPTjoKKyAqICBUaGlzIGZ1bmN0aW9uIHJldHJpZXZlcyBvciBjcmVhdGVzIHRoZSBzZXNzaW9uIG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIGEgbWVzc2FnZS4KKyAqIElmIHRoZSBtZXNzYWdlIGRvZXMgbm90IGNvbnRhaW4gYSBTZXNzaW9uLUlkIEFWUCwgKnNlc3Npb24gPT0gTlVMTCBvbiByZXR1cm4uCisgKiBOb3RlIHRoYXQgdGhlIFNlc3Npb24tSWQgQVZQIG11c3QgbmV2ZXIgYmUgbW9kaWZpZWQgYWZ0ZXIgY3JlYXRlZCBpbiBhIG1lc3NhZ2UuCisgKgorICogUkVUVVJOIFZBTFVFOgorICogIDAgOiBzdWNjZXNzCisgKiAhMCA6IHN0YW5kYXJkIGVycm9yIGNvZGUuCisgKi8KK2ludCBmZF9tc2dfc2Vzc19nZXQoc3RydWN0IGRpY3Rpb25hcnkgKiBkaWN0LCBzdHJ1Y3QgbXNnICogbXNnLCBzdHJ1Y3Qgc2Vzc2lvbiAqKiBzZXNzaW9uLCBpbnQgKiBpc25ldyk7CisKKy8qIFRoaXMgb25lIGlzIHVzZWQgYnkgdGhlIGxpYmZkY29yZSwgeW91IHNob3VsZCB1c2UgZmRfbXNnX25ld19zZXNzaW9uIHJhdGhlciB0aGFuIGZkX3Nlc3NfbmV3LCB3aGVuIHBvc3NpYmxlICovCitpbnQgZmRfbXNnX3Nlc3Nfc2V0KHN0cnVjdCBtc2cgKiBtc2csIHN0cnVjdCBzZXNzaW9uICogc2Vzc2lvbik7CisKKworLyogSGVscGVyIGZvciB0aGUgaG9va3MgbWVjaGFuaXNtLCBmb3IgdXNlIGZyb20gbGliZmRjb3JlICovCitzdHJ1Y3QgZmRfbXNnX3BtZGwgeworCXN0cnVjdCBmZF9saXN0IHNlbnRpbmVsOyAvKiBpZiB0aGUgc2VudGluZWwubyBmaWVsZCBpcyBOVUxMLCB0aGUgc3RydWN0dXJlIGlzIG5vdCBpbml0aWFsaXplZC4gT3RoZXJ3aXNlIGl0IHBvaW50cyB0byB0aGUgY2xlYW51cCBmdW5jdGlvbiBpbiBsaWJmZGNvcmUuICovCisJcHRocmVhZF9tdXRleF90IGxvY2s7Cit9Oworc3RydWN0IGZkX21zZ19wbWRsICogZmRfbXNnX3BtZGxfZ2V0KHN0cnVjdCBtc2cgKiBtc2cpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgIE1hbmFnZSBBVlAgdmFsdWVzICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIEZVTkNUSU9OOglmZF9tc2dfYXZwX3NldHZhbHVlCisgKgorICogUEFSQU1FVEVSUzoKKyAqICBhdnAgCTogUG9pbnRlciB0byBhIHZhbGlkIGF2cCBvYmplY3Qgd2l0aCBhIE5VTEwgYXZwX3ZhbHVlIHBvaW50ZXIuIFRoZSBtb2RlbCBtdXN0IGJlIGtub3duLgorICogIHZhbHVlIAk6IHBvaW50ZXIgdG8gYW4gYXZwX3ZhbHVlLiBUaGUgY29udGVudCB3aWxsIGJlIENPUElFRCBpbnRvIHRoZSBpbnRlcm5hbCBzdG9yYWdlIGFyZWEuIAorICoJCSBJZiBkYXRhIHR5cGUgaXMgYW4gb2N0ZXRzdHJpbmcsIHRoZSBkYXRhIGlzIGFsc28gY29waWVkLgorICogCQkgSWYgdmFsdWUgaXMgYSBOVUxMIHBvaW50ZXIsIHRoZSBwcmV2aW91cyBkYXRhIGlzIGVyYXNlZCBhbmQgdmFsdWUgaXMgdW5zZXQgaW4gdGhlIEFWUC4KKyAqCisgKiBERVNDUklQVElPTjogCisgKiAgIEluaXRpYWxpemUgdGhlIGF2cF92YWx1ZSBmaWVsZCBvZiBhbiBBVlAgaGVhZGVyLgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqICAwICAgICAgCTogVGhlIGF2cF92YWx1ZSBwb2ludGVyIGhhcyBiZWVuIHNldC4KKyAqICBFSU5WQUwgCTogQSBwYXJhbWV0ZXIgaXMgaW52YWxpZC4KKyAqLworaW50IGZkX21zZ19hdnBfc2V0dmFsdWUgKCBzdHJ1Y3QgYXZwICphdnAsIHVuaW9uIGF2cF92YWx1ZSAqdmFsdWUgKTsKKworLyoKKyAqIEZVTkNUSU9OOglmZF9tc2dfYXZwX3ZhbHVlX2VuY29kZQorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgYXZwIAk6IFBvaW50ZXIgdG8gYSB2YWxpZCBhdnAgb2JqZWN0IHdpdGggYSBOVUxMIGF2cF92YWx1ZS4gVGhlIG1vZGVsIG11c3QgYmUga25vd24uCisgKiAgZGF0YSAJOiBQb2ludGVyIHRvIHRoZSBkYXRhIHRoYXQgbXVzdCBiZSBlbmNvZGVkIGFzIEFWUCB2YWx1ZSBhbmQgc3RvcmVkIGluIHRoZSBBVlAuCisgKgkJIFRoaXMgaXMgb25seSB2YWxpZCBmb3IgQVZQcyBvZiBkZXJpdmVkIHR5cGUgZm9yIHdoaWNoIHR5cGVfZGF0YV9lbmNvZGUgY2FsbGJhY2sgaXMgc2V0LiAoZXg6IEFkZHJlc3MgdHlwZSkKKyAqCisgKiBERVNDUklQVElPTjogCisgKiAgIEluaXRpYWxpemUgdGhlIGF2cF92YWx1ZSBmaWVsZCBvZiBhbiBBVlAgb2JqZWN0IGZyb20gZm9ybWF0dGVkIGRhdGEsIHVzaW5nIHRoZSBBVlAncyB0eXBlICJ0eXBlX2RhdGFfZW5jb2RlIiBjYWxsYmFjay4KKyAqCisgKiBSRVRVUk4gVkFMVUU6CisgKiAgMCAgICAgIAk6IFRoZSBhdnBfdmFsdWUgaGFzIGJlZW4gc2V0LgorICogIEVJTlZBTCAJOiBBIHBhcmFtZXRlciBpcyBpbnZhbGlkLgorICogIEVOT1RTVVAgCTogVGhlcmUgaXMgbm8gYXBwcm9wcmlhdGUgY2FsbGJhY2sgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgQVZQJ3MgdHlwZS4KKyAqLworaW50IGZkX21zZ19hdnBfdmFsdWVfZW5jb2RlICggdm9pZCAqZGF0YSwgc3RydWN0IGF2cCAqYXZwICk7CisvKgorICogRlVOQ1RJT046CWZkX21zZ19hdnBfdmFsdWVfaW50ZXJwcmV0CisgKgorICogUEFSQU1FVEVSUzoKKyAqICBhdnAgCTogUG9pbnRlciB0byBhIHZhbGlkIGF2cCBvYmplY3Qgd2l0aCBhIG5vbi1OVUxMIGF2cF92YWx1ZSB2YWx1ZS4KKyAqICBkYXRhIAk6IFVwb24gc3VjY2VzcywgZm9ybWF0dGVkIGludGVycHJldGF0aW9uIG9mIHRoZSBBVlAgdmFsdWUgaXMgc3RvcmVkIGhlcmUuCisgKgorICogREVTQ1JJUFRJT046IAorICogICBJbnRlcnByZXQgdGhlIGNvbnRlbnQgb2YgYW4gQVZQIG9mIERlcml2ZWQgdHlwZSBhbmQgc3RvcmUgdGhlIHJlc3VsdCBpbiBkYXRhIHBvaW50ZXIuIFRoZSBzdHJ1Y3R1cmUKKyAqIG9mIHRoZSBkYXRhIHBvaW50ZXIgaXMgZGVwZW5kZW50IG9uIHRoZSBBVlAgdHlwZS4gVGhpcyBmdW5jdGlvbiBjYWxscyB0aGUgInR5cGVfZGF0YV9pbnRlcnByZXQiIGNhbGxiYWNrIAorICogb2YgdGhlIHR5cGUuCisgKgorICogUkVUVVJOIFZBTFVFOgorICogIDAgICAgICAJOiBUaGUgYXZwX3ZhbHVlIGhhcyBiZWVuIHNldC4KKyAqICBFSU5WQUwgCTogQSBwYXJhbWV0ZXIgaXMgaW52YWxpZC4KKyAqICBFTk9UU1VQIAk6IFRoZXJlIGlzIG5vIGFwcHJvcHJpYXRlIGNhbGxiYWNrIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIEFWUCdzIHR5cGUuCisgKi8KK2ludCBmZF9tc2dfYXZwX3ZhbHVlX2ludGVycHJldCAoIHN0cnVjdCBhdnAgKmF2cCwgdm9pZCAqZGF0YSApOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgIE1lc3NhZ2UgcGFyc2luZyBmdW5jdGlvbnMgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIEZVTkNUSU9OOglmZF9tc2dfYnVmZmVyaXplCisgKgorICogUEFSQU1FVEVSUzoKKyAqICBtc2cJCTogQSB2YWxpZCBtc2cgb2JqZWN0LiBBbGwgQVZQcyBtdXN0IGhhdmUgYSB2YWx1ZSBzZXQuIAorICogIGJ1ZmZlciAJOiBVcG9uIHN1Y2Nlc3MsIHRoaXMgcG9pbnRzIHRvIGEgYnVmZmVyIChtYWxsb2MnZCkgY29udGFpbmluZyB0aGUgbWVzc2FnZSByZWFkeSBmb3IgbmV0d29yayB0cmFuc21pc3Npb24gKG9yIHNlY3VyaXR5IHRyYW5zZm9ybWF0aW9ucykuIAorICoJCSBUaGUgYnVmZmVyIG1heSBiZSBmcmVlZCBhZnRlciB1c2UuCisgKiAgbGVuCQk6IGlmIG5vdCBOVUxMLCB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIGlzIHdyaXR0ZW4gaGVyZS4gSW4gYW55IGNhc2UsIHRoaXMgc2l6ZSBpcyB1cGRhdGVkIGluIHRoZSBtc2cgaGVhZGVyLgorICoKKyAqIERFU0NSSVBUSU9OOiAKKyAqICAgUmVuZGVycyBhIG1lc3NhZ2UgaW4gbWVtb3J5IGFzIGEgYnVmZmVyIHRoYXQgY2FuIGJlIHNlbnQgb3ZlciB0aGUgbmV0d29yayB0byB0aGUgbmV4dCBwZWVyLgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqICAwICAgICAgCTogVGhlIGxvY2F0aW9uIGhhcyBiZWVuIHdyaXR0ZW4uCisgKiAgRUlOVkFMIAk6IFRoZSBidWZmZXIgZG9lcyBub3QgY29udGFpbiBhIHZhbGlkIERpYW1ldGVyIG1lc3NhZ2UuCisgKiAgRU5PTUVNCTogVW5hYmxlIHRvIGFsbG9jYXRlIGVub3VnaCBtZW1vcnkgdG8gY3JlYXRlIHRoZSBidWZmZXIgb2JqZWN0LgorICovCitpbnQgZmRfbXNnX2J1ZmZlcml6ZSAoIHN0cnVjdCBtc2cgKiBtc2csIHVpbnQ4X3QgKiogYnVmZmVyLCBzaXplX3QgKiBsZW4gKTsKKworLyoKKyAqIEZVTkNUSU9OOglmZF9tc2dfcGFyc2VfYnVmZmVyCisgKgorICogUEFSQU1FVEVSUzoKKyAqICBidWZmZXIgCTogUG9pbnRlciB0byBhIGJ1ZmZlciBjb250YWluaW5nIGEgbWVzc2FnZSByZWNlaXZlZCBmcm9tIHRoZSBuZXR3b3JrLiAKKyAqICBidWZsZW4JOiB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgYnVmZmVyLgorICogIG1zZwkJOiBVcG9uIHN1Y2Nlc3MsIHRoaXMgcG9pbnRzIHRvIGEgdmFsaWQgbXNnIG9iamVjdC4gTm8gQVZQIHZhbHVlIGlzIHJlc29sdmVkIGluIHRoaXMgb2JqZWN0LCBub3IgZ3JvdXBlZCBBVlAuCisgKgorICogREVTQ1JJUFRJT046IAorICogICBUaGlzIGZ1bmN0aW9uIHBhcnNlcyBhIGJ1ZmZlciBhbiBjcmVhdGVzIGEgbXNnIG9iamVjdCB0byByZXByZXNlbnQgdGhlIHN0cnVjdHVyZSBvZiB0aGUgbWVzc2FnZS4KKyAqICBTaW5jZSBubyBkaWN0aW9uYXJ5IGxvb2t1cCBpcyBwZXJmb3JtZWQsIHRoZSB2YWx1ZXMgb2YgdGhlIEFWUHMgYXJlIG5vdCBpbnRlcnByZXRlZC4gVG8gaW50ZXJwcmV0IHRoZSB2YWx1ZXMsCisgKiAgdGhlIHJldHVybmVkIG1lc3NhZ2Ugb2JqZWN0IG11c3QgYmUgcGFzc2VkIHRvIGZkX21zZ19wYXJzZV9kaWN0IGZ1bmN0aW9uLgorICogIFRoZSBidWZmZXIgcG9pbnRlciBpcyBzYXZlZCBpbnNpZGUgdGhlIG1lc3NhZ2UgYW5kIHdpbGwgYmUgZnJlZWQgd2hlbiBub3QgbmVlZGVkIGFueW1vcmUuCisgKgorICogUkVUVVJOIFZBTFVFOgorICogIDAgICAgICAJOiBUaGUgbG9jYXRpb24gaGFzIGJlZW4gd3JpdHRlbi4KKyAqICBFTk9NRU0JOiBVbmFibGUgdG8gYWxsb2NhdGUgZW5vdWdoIG1lbW9yeSB0byBjcmVhdGUgdGhlIG1zZyBvYmplY3QuCisgKiAgRUJBRE1TRwk6IFRoZSBidWZmZXIgZG9lcyBub3QgY29udGFpbiBhIHZhbGlkIERpYW1ldGVyIG1lc3NhZ2UgKG9yIGlzIHRydW5jYXRlZCkuCisgKiAgRUlOVkFMIAk6IEEgcGFyYW1ldGVyIGlzIGludmFsaWQuCisgKi8KK2ludCBmZF9tc2dfcGFyc2VfYnVmZmVyICggdWludDhfdCAqKiBidWZmZXIsIHNpemVfdCBidWZsZW4sIHN0cnVjdCBtc2cgKiogbXNnICk7CisKKy8qIFBhcnNpbmcgRXJyb3IgSW5mb3JtYXRpb24gc3RydWN0dXJlICovCitzdHJ1Y3QgZmRfcGVpIHsKKwljaGFyICoJCXBlaV9lcnJjb2RlOwkvKiBuYW1lIG9mIHRoZSBlcnJvciBjb2RlIHRvIHVzZSAqLworCXN0cnVjdCBhdnAgKglwZWlfYXZwOwkvKiBwb2ludGVyIHRvIGludmFsaWQgKGluIG9yaWdpbmFsIG1lc3NhZ2UpIG9yIG1pc3NpbmcgQVZQICh0byBiZSBmcmVlZCkgKi8KKwlpbnQJCXBlaV9hdnBfZnJlZTsJLyogU2V0IHRvIDEgaWYgdGhlIHBlaV9hdnAgbXVzdCBiZSBmcmVlZCAqLworCWNoYXIgKgkJcGVpX21lc3NhZ2U7CS8qIE92ZXJ3cml0ZSBkZWZhdWx0IG1lc3NhZ2UgaWYgbmVlZGVkICovCisJaW50CQlwZWlfcHJvdG9lcnI7IAkvKiBkbyB3ZSBzZXQgdGhlICdFJyBiaXQgaW4gdGhlIGVycm9yIG1lc3NhZ2UgPyAqLworfTsKKworLyoKKyAqIEZVTkNUSU9OOglmZF9tc2dfcGFyc2VfZGljdAorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgb2JqZWN0CTogQSBtc2cgb3IgQVZQIG9iamVjdCBhcyByZXR1cm5lZCBieSBmZF9tc2dfcGFyc2VfYnVmZmVyLgorICogIGRpY3QJOiB0aGUgZGljdGlvbmFyeSBjb250YWluaW5nIHRoZSBvYmplY3RzIGRlZmluaXRpb25zIHRvIHVzZSBmb3IgcmVzb2x2aW5nIGFsbCBBVlBzLgorICogIGVycm9yX2luZm8JOiBJZiBub3QgTlVMTCwgd2lsbCBjb250YWluIHRoZSBkZXRhaWwgYWJvdXQgZXJyb3IgdXBvbiByZXR1cm4uIE1heSBiZSB1c2VkIHRvIGdlbmVyYXRlIGFuIGVycm9yIHJlcGx5LgorICoKKyAqIERFU0NSSVBUSU9OOiAKKyAqICAgVGhpcyBmdW5jdGlvbiBsb29rcyB1cCBmb3IgdGhlIGNvbW1hbmQgYW5kIGVhY2ggY2hpbGRyZW4gQVZQIGRlZmluaXRpb25zIGluIHRoZSBkaWN0aW9uYXJ5LgorICogIElmIHRoZSBkaWN0aW9uYXJ5IGRlZmluaXRpb24gaXMgZm91bmQsIGF2cF9tb2RlbCBpcyBzZXQgYW5kIHRoZSB2YWx1ZSBvZiB0aGUgQVZQIGlzIGludGVycHJldGVkIGFjY29yZGluZ2x5IGFuZDoKKyAqICAgLSBmb3IgZ3JvdXBlZCBBVlBzLCB0aGUgY2hpbGRyZW4gQVZQIGFyZSBjcmVhdGVkIGFuZCBpbnRlcnByZXRlZCBhbHNvLgorICogICAtIGZvciBudW1lcmljYWwgQVZQcywgdGhlIHZhbHVlIGlzIGNvbnZlcnRlZCB0byBob3N0IGJ5dGUgb3JkZXIgYW5kIHNhdmVkIGluIHRoZSBhdnBfdmFsdWUgZmllbGQuCisgKiAgIC0gZm9yIG9jdGV0c3RyaW5nIEFWUHMsIHRoZSBzdHJpbmcgaXMgY29waWVkIGludG8gYSBuZXcgYnVmZmVyIGFuZCBpdHMgYWRkcmVzcyBpcyBzYXZlZCBpbiBhdnBfdmFsdWUuIAorICogIElmIHRoZSBkaWN0aW9uYXJ5IGRlZmluaXRpb24gaXMgbm90IGZvdW5kLCBhdnBfbW9kZWwgaXMgc2V0IHRvIE5VTEwgYW5kCisgKiAgdGhlIGNvbnRlbnQgb2YgdGhlIEFWUCBpcyBzYXZlZCBhcyBhbiBvY3RldHN0cmluZyBpbiBhbiBpbnRlcm5hbCBzdHJ1Y3R1cmUuIGF2cF92YWx1ZSBpcyBOVUxMLgorICogIEFzIGEgcmVzdWx0LCBhZnRlciB0aGlzIGZ1bmN0aW9uIGhhcyBiZWVuIGNhbGxlZCwgdGhlcmUgaXMgbm8gbW9yZSBkZXBlbmRlbmN5IG9mIHRoZSBtc2cgb2JqZWN0IHRvIHRoZSBtZXNzYWdlIGJ1ZmZlciwgdGhhdCBpcyBmcmVlZC4KKyAqCisgKiBSRVRVUk4gVkFMVUU6CisgKiAgMCAgICAgIAk6IFRoZSBtZXNzYWdlIGhhcyBiZWVuIGZ1bGx5IHBhcnNlZCBhcyBkZXNjcmliZWQuCisgKiAgRUlOVkFMIAk6IFRoZSBtc2cgcGFyYW1ldGVyIGlzIGludmFsaWQgZm9yIHRoaXMgb3BlcmF0aW9uLgorICogIEVOT01FTQk6IFVuYWJsZSB0byBhbGxvY2F0ZSBlbm91Z2ggbWVtb3J5IHRvIGNvbXBsZXRlIHRoZSBvcGVyYXRpb24uCisgKiAgRU5PVFNVUAk6IE5vIGRpY3Rpb25hcnkgZGVmaW5pdGlvbiBmb3IgdGhlIGNvbW1hbmQgb3Igb25lIG9mIHRoZSBtYW5kYXRvcnkgQVZQIHdhcyBmb3VuZC4KKyAqLworaW50IGZkX21zZ19wYXJzZV9kaWN0ICggbXNnX29yX2F2cCAqIG9iamVjdCwgc3RydWN0IGRpY3Rpb25hcnkgKiBkaWN0LCBzdHJ1Y3QgZmRfcGVpICogZXJyb3JfaW5mbyApOworCisvKgorICogRlVOQ1RJT046CWZkX21zZ19wYXJzZV9ydWxlcworICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgb2JqZWN0CTogQSBtc2cgb3IgZ3JvdXBlZCBhdnAgb2JqZWN0IHRoYXQgbXVzdCBiZSB2ZXJpZmllZC4KKyAqICBkaWN0CTogVGhlIGRpY3Rpb25hcnkgY29udGFpbmluZyB0aGUgcnVsZXMgZGVmaW5pdGlvbnMuCisgKiAgZXJyb3JfaW5mbwk6IElmIG5vdCBOVUxMLCB0aGUgZmlyc3QgcHJvYmxlbSBpbmZvcm1hdGlvbiB3aWxsIGJlIHNhdmVkIGhlcmUuCisgKgorICogREVTQ1JJUFRJT046IAorICogICBDaGVjayB0aGF0IHRoZSBjaGlsZHJlbiBvZiB0aGUgb2JqZWN0IGRvIG5vdCBjb25mbGljdCB3aXRoIHRoZSBkaWN0aW9uYXJ5IHJ1bGVzIChBQk5GIGNvbXBsaWFuY2UpLgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqICAwICAgICAgCTogVGhlIG1lc3NhZ2UgaGFzIGJlZW4gZnVsbHkgcGFyc2VkIGFuZCBjb21wbGllcyB0byB0aGUgZGVmaW5lZCBydWxlcy4KKyAqICBFQkFETVNHCTogQSBjb25mbGljdCB3YXMgZGV0ZWN0ZWQsIG9yIGEgbWFuZGF0b3J5IEFWUCBpcyB1bmtub3duIGluIHRoZSBkaWN0aW9uYXJ5LgorICogIEVJTlZBTCAJOiBUaGUgbXNnIG9yIGF2cCBvYmplY3QgaXMgaW52YWxpZCBmb3IgdGhpcyBvcGVyYXRpb24uCisgKiAgRU5PTUVNCTogVW5hYmxlIHRvIGFsbG9jYXRlIGVub3VnaCBtZW1vcnkgdG8gY29tcGxldGUgdGhlIG9wZXJhdGlvbi4KKyAqLworaW50IGZkX21zZ19wYXJzZV9ydWxlcyAoIG1zZ19vcl9hdnAgKiBvYmplY3QsIHN0cnVjdCBkaWN0aW9uYXJ5ICogZGljdCwgc3RydWN0IGZkX3BlaSAqIGVycm9yX2luZm8pOworCisKKworLyoKKyAqIEZVTkNUSU9OOglmZF9tc2dfdXBkYXRlX2xlbmd0aAorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgb2JqZWN0IAk6IFBvaW50ZXIgdG8gYSB2YWxpZCBtc2cgb3IgYXZwLiAKKyAqCisgKiBERVNDUklQVElPTjogCisgKiAgIFVwZGF0ZSB0aGUgbGVuZ3RoIGZpZWxkIG9mIHRoZSBvYmplY3QgcGFzc2VkIGFzIHBhcmFtZXRlci4KKyAqIEFzIGEgc2lkZSBlZmZlY3QsIGFsbCBjaGlsZHJlbiBvYmplY3RzIGFyZSBhbHNvIHVwZGF0ZWQuIFRoZXJlZm9yZSwgYWxsIGF2cF92YWx1ZSBmaWVsZHMgb2YKKyAqIHRoZSBjaGlsZHJlbiBBVlBzIG11c3QgYmUgc2V0LCBvciBhbiBlcnJvciB3aWxsIG9jY3VyLgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqICAwICAgICAgCTogVGhlIHNpemUgaGFzIGJlZW4gcmVjb21wdXRlZC4KKyAqICBFSU5WQUwgCTogQSBwYXJhbWV0ZXIgaXMgaW52YWxpZC4KKyAqLworaW50IGZkX21zZ191cGRhdGVfbGVuZ3RoICggbXNnX29yX2F2cCAqIG9iamVjdCApOworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgIERJU1BBVENIICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogRGlzcGF0Y2ggbW9kdWxlIChwYXNzaW5nIGluY29taW5nIG1lc3NhZ2VzIHRvIGV4dGVuc2lvbnMgcmVnaXN0ZXJlZCBjYWxsYmFja3MpCisgKiBpcyBzcGxpdCBiZXR3ZWVuIHRoZSBsaWJyYXJ5IGFuZCB0aGUgZGFlbW9uLgorICoKKyAqIFRoZSBsaWJyYXJ5IHByb3ZpZGVzIHRoZSBzdXBwb3J0IGZvciBhc3NvY2lhdGluZyBkaXNwYXRjaCBjYWxsYmFja3Mgd2l0aAorICogZGljdGlvbmFyeSBvYmplY3RzLgorICoKKyAqIFRoZSBkYWVtb24gaXMgcmVzcG9uc2libGUgZm9yIGNhbGxpbmcgdGhlIGNhbGxiYWNrcyBmb3IgYSBtZXNzYWdlIHdoZW4gYXBwcm9wcmlhdGUuCisgKgorICoKKyAqIFRoZSBkaXNwYXRjaCBtb2R1bGUgaGFzIHR3byBtYWluIHJvbGVzOgorICogIC0gaGVscCBkZXRlcm1pbmUgaWYgYSBtZXNzYWdlIGNhbiBiZSBoYW5kbGVkIGxvY2FsbHkgKGR1cmluZyB0aGUgcm91dGluZyBzdGVwKQorICogICAgICAgIFRoaXMgZGVjaXNpb24gaW52b2x2ZXMgb25seSB0aGUgYXBwbGljYXRpb24taWQgb2YgdGhlIG1lc3NhZ2UuCisgKiAgLSBwYXNzIHRoZSBtZXNzYWdlIHRvIHRoZSBjYWxsYmFjayhzKSB0aGF0IHdpbGwgaGFuZGxlIGl0IChkdXJpbmcgdGhlIGRpc3BhdGNoIHN0ZXApCisgKgorICogVGhlIGZpcnN0IHJvbGUgaXMgaGFuZGxlZCBieSB0aGUgZGFlbW9uLgorICoKKyAqIEFib3V0IHRoZSBzZWNvbmQsIHRoZXNlIGFyZSB0aGUgcG9zc2liaWxpdGllcyBmb3IgcmVnaXN0ZXJpbmcgYSBkaXNwYXRjaCBjYWxsYmFjazoKKyAqCisgKiAtPiBGb3IgQWxsIG1lc3NhZ2VzLgorICogIFRoaXMgY2FsbGJhY2sgaXMgY2FsbGVkIGZvciBhbGwgbWVzc2FnZXMgdGhhdCBhcmUgaGFuZGxlZCBsb2NhbGx5LiBUaGlzIHNob3VsZCBiZSB1c2VkIG9ubHkKKyAqICBmb3IgZGVidWcgcHVycG9zZS4KKyAqCisgKiAtPiBieSBBVlAgdmFsdWUgKGNvbnN0YW50cyBvbmx5KS4KKyAqICBUaGlzIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIHdoZW4gYSBtZXNzYWdlIGlzIHJlY2VpdmVkIGFuZCBjb250YWlucyBhbiBBVlAgd2l0aCBhIHNwZWNpZmllZCBlbnVtZXJhdGVkIHZhbHVlLgorICoKKyAqIC0+IGJ5IEFWUC4KKyAqICBUaGlzIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHJlY2VpdmVkIG1lc3NhZ2UgY29udGFpbnMgYSBjZXJ0YWluIEFWUC4KKyAqCisgKiAtPiBieSBjb21tYW5kLWNvZGUuCisgKiAgVGhpcyBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBtZXNzYWdlIGlzIGEgc3BlY2lmaWMgY29tbWFuZCAoYW5kICdSJyBmbGFnKS4KKyAqCisgKiAtPiBieSBhcHBsaWNhdGlvbi4KKyAqICBUaGlzIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIG1lc3NhZ2UgaGFzIGEgc3BlY2lmaWMgYXBwbGljYXRpb24taWQuCisgKgorICogKCBieSB2ZW5kb3I6IHdvdWxkIHRoaXMgYmUgdXNlZnVsPyBpdCBtYXkgYmUgYWRkZWQgbGF0ZXIpCisgKi8KK2VudW0gZGlzcF9ob3cgeworCURJU1BfSE9XX0FOWSA9IDEsCQkvKiBBbnkgbWVzc2FnZS4gVGhpcyBzaG91bGQgYmUgb25seSB1c2VkIGZvciBkZWJ1Zy4gKi8KKwlESVNQX0hPV19BUFBJRCwJCQkvKiBBbnkgbWVzc2FnZSB3aXRoIHRoZSBzcGVjaWZpZWQgYXBwbGljYXRpb24taWQgKi8KKwlESVNQX0hPV19DQywJCQkvKiBNZXNzYWdlcyBvZiB0aGUgc3BlY2lmaWVkIGNvbW1hbmQtY29kZSAocmVxdWVzdCBvciBhbnN3ZXIpLiBBcHAgaWQgbWF5IGJlIHNwZWNpZmllZC4gKi8KKwlESVNQX0hPV19BVlAsCQkJLyogTWVzc2FnZXMgY29udGFpbmluZyBhIHNwZWNpZmljIEFWUC4gQ29tbWFuZC1jb2RlIGFuZCBBcHAgaWQgbWF5IGJlIHNwZWNpZmllZC4gKi8KKwlESVNQX0hPV19BVlBfRU5VTVZBTAkJLyogTWVzc2FnZXMgY29udGFpbmluZyBhIHNwZWNpZmljIEFWUCB3aXRoIGEgc3BlY2lmaWMgZW51bWVyYXRlZCB2YWx1ZS4gQ29tbWFuZC1jb2RlIGFuZCBBcHAgaWQgbWF5IGJlIHNwZWNpZmllZC4gKi8KK307CisvKgorICogU2V2ZXJhbCBjcml0ZXJpYSBtYXkgYmUgc2VsZWN0ZWQgYXQgdGhlIHNhbWUgdGltZSwgZm9yIGV4YW1wbGUgY29tbWFuZC1jb2RlIEFORCBhcHBsaWNhdGlvbiBpZC4KKyAqCisgKiBJZiBzZXZlcmFsIGNhbGxiYWNrcyBhcmUgcmVnaXN0ZXJlZCBmb3IgdGhlIHNhbWUgb2JqZWN0LCB0aGV5IGFyZSBjYWxsZWQgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSByZWdpc3RlcmVkLgorICogVGhlIG9yZGVyIGluIHdoaWNoIHRoZSBjYWxsYmFja3MgYXJlIGNhbGxlZCBpczoKKyAqICBESVNQX0hPV19BTlkKKyAqICBESVNQX0hPV19BVlBfRU5VTVZBTCAmIERJU1BfSE9XX0FWUAorICogIERJU1BfSE9XX0NDCisgKiAgRElTUF9IT1dfQVBQSUQKKyAqLworCisvKiBXaGVuIGEgY2FsbGJhY2sgaXMgcmVnaXN0ZXJlZCwgYSAid2hlbiIgYXJndW1lbnQgaXMgcGFzc2VkIGluIGFkZGl0aW9uIHRvIHRoZSBkaXNwX2hvdyB2YWx1ZSwKKyAqIHRvIHNwZWNpZnkgd2hpY2ggdmFsdWVzIHRoZSBjcml0ZXJpYSBtdXN0IG1hdGNoLiAqLworc3RydWN0IGRpc3Bfd2hlbiB7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICoJYXBwOworCXN0cnVjdCBkaWN0X29iamVjdCAqCWNvbW1hbmQ7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICoJYXZwOworCXN0cnVjdCBkaWN0X29iamVjdCAqCXZhbHVlOworfTsKKworLyogTm90ZSB0aGF0IGFsbCB0aGUgZGljdGlvbmFyeSBvYmplY3RzIHNob3VsZCByZWFsbHkgYmVsb25nIHRvIHRoZSBzYW1lIGRpY3Rpb25hcnkhCisgKgorICogSGVyZSBpcyB0aGUgZGV0YWlscyBvbiB0aGlzICJ3aGVuIiBhcmd1bWVudCwgZGVwZW5kaW5nIG9uIHRoZSBkaXNwX2hvdyB2YWx1ZS4KKyAqCisgKiBESVNQX0hPV19BTlkuCisgKiAgSW4gdGhpcyBjYXNlLCAid2hlbiIgbXVzdCBiZSBOVUxMLgorICoKKyAqIERJU1BfSE9XX0FQUElELgorICogIE9ubHkgdGhlICJhcHBfaWQiIGZpZWxkIG11c3QgYmUgc2V0LCBvdGhlciBmaWVsZHMgYXJlIGlnbm9yZWQuIEl0IHBvaW50cyB0byBhIGRpY3Rpb25hcnkgb2JqZWN0IG9mIHR5cGUgRElDVF9BUFBMSUNBVElPTi4KKyAqCisgKiBESVNQX0hPV19DQy4KKyAqICBUaGUgImNvbW1hbmQiIGZpZWxkIG11c3QgYmUgZGVmaW5lZCBhbmQgcG9pbnQgdG8gYSBkaWN0aW9uYXJ5IG9iamVjdCBvZiB0eXBlIERJQ1RfQ09NTUFORC4KKyAqICBUaGUgImFwcF9pZCIgbWF5IGJlIGFsc28gc2V0LiBJbiB0aGUgY2FzZSBpdCBpcyBzZXQsIGl0IHJlc3RyaWN0cyB0aGUgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIG9ubHkgd2l0aCB0aGlzIGNvbW1hbmQtY29kZSBhbmQgYXBwIGlkLgorICogIFRoZSBvdGhlciBmaWVsZHMgYXJlIGlnbm9yZWQuCisgKgorICogRElTUF9IT1dfQVZQLgorICogIFRoZSAiYXZwIiBmaWVsZCBvZiB0aGUgc3RydWN0dXJlIG11c3QgYmUgc2V0IGFuZCBwb2ludCB0byBhIGRpY3Rpb25hcnkgb2JqZWN0IG9mIHR5cGUgRElDVF9BVlAuCisgKiAgVGhlICJhcHBfaWQiIGZpZWxkIG1heSBiZSBzZXQgdG8gcmVzdHJpY3QgdGhlIG1lc3NhZ2VzIG1hdGNoaW5nIHRvIGEgc3BlY2lmaWMgYXBwIGlkLgorICogIFRoZSAiY29tbWFuZCIgZmllbGQgbWF5IGFsc28gYmUgc2V0IHRvIGEgdmFsaWQgRElDVF9DT01NQU5EIG9iamVjdC4KKyAqICBUaGUgY29udGVudCBvZiB0aGUgInZhbHVlIiBmaWVsZCBpcyBpZ25vcmVkLgorICoKKyAqIERJU1BfSE9XX0FWUF9FTlVNVkFMLgorICogIEFsbCBmaWVsZHMgaGF2ZSB0aGUgc2FtZSBjb25zdHJhaW50cyBhbmQgbWVhbmluZyBhcyBpbiBESVNQX1JFR19BVlAuIEluIGFkZGl0aW9uLCB0aGUgInZhbHVlIiBmaWVsZCBtdXN0IGJlIHNldAorICogIGFuZCBwb2ludHMgdG8gYSB2YWxpZCBESUNUX0VOVU1WQUwgb2JqZWN0LiAKKyAqCisgKiBIZXJlIGlzIGEgc3VtYXJ5IG9mIHRoZSBmaWVsZHM6ICggTSA6IG11c3QgYmUgc2V0OyBtIDogbWF5IGJlIHNldDsgMCA6IGlnbm9yZWQgKQorICogIGZpZWxkOiAgICAgYXBwX2lkICAgIGNvbW1hbmQgICAgIGF2cCAgICB2YWx1ZQorICogQVBQSUQgOiAgICAgICBNICAgICAgICAgIDAgICAgICAgICAwICAgICAgIDAKKyAqIENDICAgIDogICAgICAgbSAgICAgICAgICBNICAgICAgICAgMCAgICAgICAwCisgKiBBVlAgICA6ICAgICAgIG0gICAgICAgICAgbSAgICAgICAgIE0gICAgICAgMAorICogRU5VTVZBOiAgICAgICBtICAgICAgICAgIG0gICAgICAgICBNICAgICAgIE0KKyAqLworCitlbnVtIGRpc3BfYWN0aW9uIHsKKwlESVNQX0FDVF9DT05ULAkvKiBUaGUgbmV4dCBoYW5kbGVyIHNob3VsZCBiZSBjYWxsZWQsIHVubGVzcyAqbXNnID09IE5VTEwuICovCisJRElTUF9BQ1RfU0VORCwJLyogVGhlIHVwZGF0ZWQgbWVzc2FnZSBtdXN0IGJlIHNlbnQuIE5vIGZ1cnRoZXIgY2FsbGJhY2sgaXMgY2FsbGVkLiAqLworCURJU1BfQUNUX0VSUk9SCS8qIEFuIGVycm9yIG11c3QgYmUgY3JlYXRlZCBhbmQgc2VudCBhcyBhIHJlcGx5IC0tIG5vdCB2YWxpZCBmb3IgY2FsbGJhY2tzLCBvbmx5IGZvciBmZF9tc2dfZGlzcGF0Y2guICovCit9OworLyogVGhlIGNhbGxiYWNrcyB0aGF0IGFyZSByZWdpc3RlcmVkIGhhdmUgdGhlIGZvbGxvd2luZyBwcm90b3R5cGU6CisgKiAgCWludCBkaXNwYXRjaF9jYWxsYmFjayggc3RydWN0IG1zZyAqKiBtc2csIHN0cnVjdCBhdnAgKiBhdnAsIHN0cnVjdCBzZXNzaW9uICogc2Vzc2lvbiwgZW51bSBkaXNwX2FjdGlvbiAqIGFjdGlvbiApOworICoKKyAqIENBTExCQUNLOglkaXNwYXRjaF9jYWxsYmFjaworICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgbXNnIAk6IHRoZSByZWNlaXZlZCBtZXNzYWdlIG9uIGZ1bmN0aW9uIGVudHJ5LiBtYXkgYmUgdXBkYXRlZCB0byBhbnN3ZXIgb24gcmV0dXJuIChzZWUgZGVzY3JpcHRpb24pCisgKiAgYXZwIAk6IGZvciBjYWxsYmFja3MgcmVnaXN0ZXJlZCB3aXRoIERJU1BfSE9XX0FWUCBvciBESVNQX0hPV19BVlBfRU5VTVZBTCwgZGlyZWN0IGxpbmsgdG8gdGhlIHRyaWdnZXJpbmcgQVZQLgorICogIHNlc3Npb24JOiBpZiB0aGUgbWVzc2FnZSBjb250YWlucyBhIFNlc3Npb24tSWQgQVZQLCB0aGUgY29ycmVzcG9uZGluZyBzZXNzaW9uIG9iamVjdCwgTlVMTCBvdGhlcndpc2UuCisgKiAgb3BhcXVlICAgICAgOiBBbiBvcGFxdWUgcG9pbnRlciB0aGF0IGlzIHJlZ2lzdGVyZWQgYWxvbmcgdGhlIHNlc3Npb24gaGFuZGxlci4KKyAqICBhY3Rpb24JOiB1cG9uIHJldHVybiwgdGhpcyB0ZWxscyB0aGUgZGFlbW9uIHdoYXQgdG8gZG8gbmV4dC4KKyAqCisgKiBERVNDUklQVElPTjogCisgKiAgIENhbGxlZCB3aGVuIGEgcmVjZWl2ZWQgbWVzc2FnZSBtYXRjaHMgdGhlIGNvbmRpdGlvbiBmb3Igd2hpY2ggdGhlIGNhbGxiYWNrIHdhcyByZWdpc3RlcmVkLgorICogVGhpcyBjYWxsYmFjayBtYXkgZG8gYW55IGtpbmQgb2YgcHJvY2Vzc2luZyBvbiB0aGUgbWVzc2FnZSwgaW5jbHVkaW5nOgorICogIC0gY3JlYXRlIGFuIGFuc3dlciBmb3IgYSByZXF1ZXN0LgorICogIC0gcHJveHkgYSByZXF1ZXN0IG9yIG1lc3NhZ2UsIGFkZCAvIHJlbW92ZSB0aGUgUHJveHktSW5mbyBBVlAsIHRoZW4gZm9yd2FyZCB0aGUgbWVzc2FnZS4KKyAqICAtIHVwZGF0ZSBhIHJvdXRpbmcgdGFibGUgb3Igc3RhcnQgYSBjb25uZWN0aW9uIHdpdGggYSBuZXcgcGVlciwgdGhlbiBmb3J3YXJkIHRoZSBtZXNzYWdlLgorICogIC0gLi4uCisgKiAKKyAqIFdoZW4gKmFjdGlvbiA9PSBESVNQX0FDVF9TRU5EIG9uIGNhbGxiYWNrIHJldHVybiwgdGhlIG1zZyBwb2ludGVkIGJ5ICptc2cgaXMgcGFzc2VkIHRvIHRoZSByb3V0aW5nIG1vZHVsZSBmb3Igc2VuZGluZy4KKyAqIFdoZW4gKmFjdGlvbiA9PSBESVNQX0FDVF9DT05ULCB0aGUgbmV4dCByZWdpc3RlcmVkIGNhbGxiYWNrIGlzIGNhbGxlZC4KKyAqICBXaGVuIHRoZSBsYXN0IGNhbGxiYWNrIGdpdmVzIGFsc28gRElTUF9BQ1RfQ09OVCBhY3Rpb24gdmFsdWUsIGEgZGVmYXVsdCBoYW5kbGVyIGlzIGNhbGxlZC4gSXQncyBiZWhhdmlvciBpcyBhcyBmb2xsb3c6CisgKiAgIC0gaWYgdGhlIG1lc3NhZ2UgaXMgYW4gYW5zd2VyLCBpdCBpcyBkaXNjYXJkZWQuCisgKiAgIC0gaWYgdGhlIG1lc3NhZ2UgaXMgYSByZXF1ZXN0LCBpdCBpcyBwYXNzZWQgYWdhaW4gdG8gdGhlIHJvdXRpbmcgc3RhY2ssIGFuZCBtYXJrZWQgYXMgbm9uLWxvY2FsIGhhbmRsaW5nLgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqICAwICAgICAgCTogVGhlIGNhbGxiYWNrIGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseSBhbmQgdXBkYXRlZCAqYWN0aW9uIGFwcHJvcHJpYXRlbHkuCisgKiAgITAJCTogc3RhbmRhcmQgZXJyb3JzLiBJbiBjYXNlIG9mIGVycm9yLCB0aGUgbWVzc2FnZSBpcyBkaXNjYXJkZWQuCisgKi8KKworLyogVGhpcyBzdHJ1Y3R1cmUgcmVwcmVzZW50cyBhIGhhbmRsZXIgZm9yIGEgcmVnaXN0ZXJlZCBjYWxsYmFjaywgYWxsb3dpbmcgaXRzIGRlLXJlZ2lzdHJhdGlvbiAqLworc3RydWN0IGRpc3BfaGRsOworCisvKgorICogRlVOQ1RJT046CWZkX2Rpc3BfcmVnaXN0ZXIKKyAqCisgKiBQQVJBTUVURVJTOgorICogIGNiIAkJICA6IFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byByZWdpc3RlciAoc2VlIGRpc3BhdGNoX2NhbGxiYWNrIGRlc2NyaXB0aW9uIGFib3ZlKS4KKyAqICBob3cJICAJICA6IEhvdyB0aGUgY2FsbGJhY2sgbXVzdCBiZSByZWdpc3RlcmVkLgorICogIHdoZW4gICAgICAgICAgOiBWYWx1ZXMgdGhhdCBtdXN0IG1hdGNoLCBkZXBlbmRpbmcgb24gdGhlIGhvdyBhcmd1bWVudC4KKyAqICBvcGFxdWUgICAgICAgIDogQSBwb2ludGVyIHRoYXQgaXMgcGFzc2VkIGJhY2sgdG8gdGhlIGhhbmRsZXIuIFRoZSBjb250ZW50IGlzIG5vdCBpbnRlcnByZXRlZCBieSB0aGUgZnJhbWV3b3JrLgorICogIGhhbmRsZSAgICAgICAgOiBPbiBzdWNjZXNzLCBhIGhhbmRsZXIgdG8gdGhlIHJlZ2lzdGVyZWQgY2FsbGJhY2sgaXMgc3RvcmVkIGhlcmUgaWYgbm90IE5VTEwuIAorICoJCSAgIFRoaXMgaGFuZGxlciBjYW4gYmUgdXNlZCB0byB1bnJlZ2lzdGVyIHRoZSBjYi4KKyAqCisgKiBERVNDUklQVElPTjogCisgKiAgIFJlZ2lzdGVyIGEgbmV3IGNhbGxiYWNrIHRvIGhhbmRsZSBtZXNzYWdlcyBkZWxpdmVyZWQgbG9jYWxseS4KKyAqCisgKiBSRVRVUk4gVkFMVUU6CisgKiAgMCAgICAgIAk6IFRoZSBjYWxsYmFjayBpcyByZWdpc3RlcmVkLgorICogIEVJTlZBTCAJOiBBIHBhcmFtZXRlciBpcyBpbnZhbGlkLgorICogIEVOT01FTQk6IE5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvbXBsZXRlIHRoZSBvcGVyYXRpb24KKyAqLworaW50IGZkX2Rpc3BfcmVnaXN0ZXIgKCBpbnQgKCpjYikoIHN0cnVjdCBtc2cgKiosIHN0cnVjdCBhdnAgKiwgc3RydWN0IHNlc3Npb24gKiwgdm9pZCAqLCBlbnVtIGRpc3BfYWN0aW9uICopLCAKKwkJCWVudW0gZGlzcF9ob3cgaG93LCBzdHJ1Y3QgZGlzcF93aGVuICogd2hlbiwgdm9pZCAqIG9wYXF1ZSwgc3RydWN0IGRpc3BfaGRsICoqIGhhbmRsZSApOworCisvKgorICogRlVOQ1RJT046CWZkX2Rpc3BfdW5yZWdpc3RlcgorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgaGFuZGxlICAgICAgIDogTG9jYXRpb24gb2YgdGhlIGhhbmRsZSBvZiB0aGUgY2FsbGJhY2sgdGhhdCBtdXN0IGJlIHVucmVnaXN0ZXJlZC4KKyAqICBvcGFxdWUgICAgICAgOiBJZiBub3QgTlVMTCwgdGhlIG9wYXF1ZSBkYXRhIHRoYXQgd2FzIHJlZ2lzdGVyZWQgaXMgcmVzdG9yZWQgaGVyZS4KKyAqCisgKiBERVNDUklQVElPTjogCisgKiAgIFJlbW92ZXMgYSBjYWxsYmFjayBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgYnkgZmRfZGlzcF9yZWdpc3Rlci4KKyAqCisgKiBSRVRVUk4gVkFMVUU6CisgKiAgMCAgICAgIAk6IFRoZSBjYWxsYmFjayBpcyB1bnJlZ2lzdGVyZWQuCisgKiAgRUlOVkFMIAk6IEEgcGFyYW1ldGVyIGlzIGludmFsaWQuCisgKi8KK2ludCBmZF9kaXNwX3VucmVnaXN0ZXIgKCBzdHJ1Y3QgZGlzcF9oZGwgKiogaGFuZGxlLCB2b2lkICoqIG9wYXF1ZSApOworCisvKiBEZXN0cm95IGFsbCBoYW5kbGVycyAqLwordm9pZCBmZF9kaXNwX3VucmVnaXN0ZXJfYWxsICggdm9pZCApOworCisvKgorICogRlVOQ1RJT046CWZkX21zZ19kaXNwYXRjaAorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgbXNnIAk6IEEgbXNnIG9iamVjdCB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIGZkX21zZ19wYXJzZV9kaWN0LgorICogIHNlc3Npb24JOiBUaGUgc2Vzc2lvbiBjb3JyZXNwb25kaW5nIHRvIHRoaXMgb2JqZWN0LCBpZiBhbnkuCisgKiAgYWN0aW9uCTogVXBvbiByZXR1cm4sIHRoZSBhY3Rpb24gdGhhdCBtdXN0IGJlIHRha2VuIG9uIHRoZSBtZXNzYWdlCisgKiAgZXJyb3JfY29kZQk6IFVwb24gcmV0dXJuIHdpdGggYWN0aW9uID09IERJU1BfQUNUX0VSUk9SLCBjb250YWlucyB0aGUgZXJyb3IgKHN1Y2ggYXMgIkRJQU1FVEVSX1VOQUJMRV9UT19DT01QTFkiKQorICogIGRyb3BfcmVhc29uIDogaWYgc2V0IG9uIHJldHVybiwgdGhlIG1lc3NhZ2UgbXVzdCBiZSBmcmVlZCBmb3IgdGhpcyByZWFzb24uCisgKiAgZHJvcF9tc2cgICAgOiBpZiBkcm9wX3JlYXNvbiBpcyBzZXQsIHRoaXMgcG9pbnRzIHRvIHRoZSBtZXNzYWdlIHRvIGJlIGZyZWVkIHdoaWxlICptc2cgaXMgTlVMTC4KKyAqCisgKiBERVNDUklQVElPTjogCisgKiAgIENhbGwgYWxsIGhhbmRsZXJzIHJlZ2lzdGVyZWQgZm9yIGEgZ2l2ZW4gbWVzc2FnZS4KKyAqICBUaGUgc2Vzc2lvbiBtdXN0IGhhdmUgYWxyZWFkeSBiZWVuIHJlc29sdmVkIG9uIGVudHJ5LgorICogIFRoZSBtc2cgcG9pbnRlZCBtYXkgYmUgdXBkYXRlZCBkdXJpbmcgdGhpcyBwcm9jZXNzLgorICogIFVwb24gcmV0dXJuLCB0aGUgYWN0aW9uIHBhcmFtZXRlciBwb2ludHMgdG8gd2hhdCBtdXN0IGJlIGRvbmUgbmV4dC4KKyAqCisgKiBSRVRVUk4gVkFMVUU6CisgKiAgMCAgICAgIAk6IFN1Y2Nlc3MuCisgKiAgRUlOVkFMIAk6IEEgcGFyYW1ldGVyIGlzIGludmFsaWQuCisgKiAgKG90aGVyIGVycm9ycykKKyAqLworaW50IGZkX21zZ19kaXNwYXRjaCAoIHN0cnVjdCBtc2cgKiogbXNnLCBzdHJ1Y3Qgc2Vzc2lvbiAqIHNlc3Npb24sIGVudW0gZGlzcF9hY3Rpb24gKmFjdGlvbiwgY2hhciAqKiBlcnJvcl9jb2RlLCBjaGFyICoqIGRyb3BfcmVhc29uLCBzdHJ1Y3QgbXNnICoqIGRyb3BfbXNnICk7CisKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiAgICAgICAgICAgICAgICAgICAgIFFVRVVFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qIE1hbmFnZW1lbnQgb2YgRklGTyBxdWV1ZXMgb2YgZWxlbWVudHMgKi8KKworLyogQSBxdWV1ZSBpcyBhbiBvcGFxdWUgb2JqZWN0ICovCitzdHJ1Y3QgZmlmbzsKKworLyoKKyAqIEZVTkNUSU9OOglmZF9maWZvX25ldworICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgcXVldWUJOiBVcG9uIHN1Y2Nlc3MsIGEgcG9pbnRlciB0byB0aGUgbmV3IHF1ZXVlIGlzIHNhdmVkIGhlcmUuCisgKiAgbWF4CQk6IG1heCBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIHF1ZXVlLiBBYm92ZSB0aGlzIG51bWJlciwgYWRkaW5nIGEgbmV3IGl0ZW0gYmVjb21lcyBhCisgKgkJICBibG9ja2luZyBvcGVyYXRpb24uIFVzZSAwIHRvIGRpc2FibGUgdGhpcyBtYXhpbXVtLgorICoKKyAqIERFU0NSSVBUSU9OOiAKKyAqICBDcmVhdGUgYSBuZXcgZW1wdHkgcXVldWUuCisgKgorICogUkVUVVJOIFZBTFVFIDoKKyAqICAwCQk6IFRoZSBxdWV1ZSBoYXMgYmVlbiBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHkuCisgKiAgRUlOVkFMIAk6IFRoZSBwYXJhbWV0ZXIgaXMgaW52YWxpZC4KKyAqICBFTk9NRU0JOiBOb3QgZW5vdWdoIG1lbW9yeSB0byBjb21wbGV0ZSB0aGUgY3JlYXRpb24uICAKKyAqLworaW50IGZkX2ZpZm9fbmV3ICggc3RydWN0IGZpZm8gKiogcXVldWUsIGludCBtYXggKTsKKworLyoKKyAqIEZVTkNUSU9OOglmZF9maWZvX2RlbAorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgcXVldWUJOiBQb2ludGVyIHRvIGFuIGVtcHR5IHF1ZXVlIHRvIGRlbGV0ZS4KKyAqCisgKiBERVNDUklQVElPTjogCisgKiAgRGVzdHJveXMgYSBxdWV1ZS4gVGhpcyBpcyBvbmx5IHBvc3NpYmxlIGlmIG5vIHRocmVhZCBpcyB3YWl0aW5nIGZvciBhbiBlbGVtZW50LAorICogYW5kIHRoZSBxdWV1ZSBpcyBlbXB0eS4KKyAqCisgKiBSRVRVUk4gVkFMVUU6CisgKiAgMAkJOiBUaGUgcXVldWUgaGFzIGJlZW4gZGVzdHJveWVkIHN1Y2Nlc3NmdWxseS4KKyAqICBFSU5WQUwgCTogVGhlIHBhcmFtZXRlciBpcyBpbnZhbGlkLgorICovCitpbnQgZmRfZmlmb19kZWwgKCBzdHJ1Y3QgZmlmbyAgKiogcXVldWUgKTsKKworLyoKKyAqIEZVTkNUSU9OOglmZF9maWZvX21vdmUKKyAqCisgKiBQQVJBTUVURVJTOgorICogIG9sZHEJOiBMb2NhdGlvbiBvZiBhIEZJRk8gdGhhdCBpcyB0byBiZSBlbXB0aWVkLgorICogIG5ld3EJOiBBIEZJRk8gdGhhdCB3aWxsIHJlY2VpdmUgdGhlIG9sZCBkYXRhLgorICogIGxvY191cGRhdGUJOiBpZiBub24gTlVMTCwgYSBwbGFjZSB0byBzdG9yZSB0aGUgcG9pbnRlciB0byBuZXcgRklGTyBhdG9taWNhbGx5IHdpdGggdGhlIG1vdmUuCisgKgorICogREVTQ1JJUFRJT046IAorICogIEVtcHRpZXMgYSBxdWV1ZSBhbmQgbW92ZSBpdHMgY29udGVudCB0byBhbm90aGVyIG9uZSBhdG9taWNhbGx5LgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqICAwCQk6IFRoZSBxdWV1ZSBoYXMgYmVlbiBkZXN0cm95ZWQgc3VjY2Vzc2Z1bGx5LgorICogIEVJTlZBTCAJOiBBIHBhcmFtZXRlciBpcyBpbnZhbGlkLgorICovCitpbnQgZmRfZmlmb19tb3ZlICggc3RydWN0IGZpZm8gKiBvbGRxLCBzdHJ1Y3QgZmlmbyAqIG5ld3EsIHN0cnVjdCBmaWZvICoqIGxvY191cGRhdGUgKTsKKworLyoKKyAqIEZVTkNUSU9OOglmZF9maWZvX2dldHN0YXRzCisgKgorICogUEFSQU1FVEVSUzoKKyAqICBxdWV1ZQkgIDogVGhlIHF1ZXVlIGZyb20gd2hpY2ggdG8gcmV0cmlldmUgdGhlIGluZm9ybWF0aW9uLgorICogIGN1cnJlbnRfY291bnQgOiBIb3cgbWFueSBpdGVtcyBpbiB0aGUgcXVldWUgYXQgdGhlIHRpbWUgb2YgZXhlY3V0aW9uLiBUaGlzIGNoYW5nZXMgZWFjaCB0aW1lIGFuIGl0ZW0gaXMgcHVzaGVkIG9yIHBvcGVkLgorICogIGxpbWl0X2NvdW50ICAgOiBUaGUgbWF4aW11bSBudW1iZXIgb2YgaXRlbXMgYWxsb3dlZCBpbiB0aGlzIHF1ZXVlLiBUaGlzIGlzIHNwZWNpZmllZCBkdXJpbmcgcXVldWUgY3JlYXRpb24uCisgKiAgaGlnaGVzdF9jb3VudCA6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBpdGVtcyB0aGlzIHF1ZXVlIGhhcyBjb250YWluZWQuIFRoaXMgZW5hYmxlcyB0byBzZWUgaWYgbGltaXRfY291bnQgY291bnQgd2FzIHJlYWNoZWQuCisgKiAgdG90YWxfY291bnQgICA6IHRoZSB0b3RhbCBudW1iZXIgb2YgaXRlbXMgdGhhdCB3ZW50IHRocm91Z2ggdGhlIHF1ZXVlIChhbHJlYWR5IHBvcCdkKS4gQWx3YXlzIGluY3JlYXNpbmcuCisgKiAgdG90YWwJICA6IEN1bXVsYXRlZCB0aW1lIGFsbCBpdGVtcyBzcGVudCBpbiB0aGlzIHF1ZXVlLCBpbmNsdWRpbmcgYmxvY2tpbmcgdGltZSAoYWx3YXlzIGdyb3dpbmcsIHVzZSBkZWx0YXMgZm9yIG1vbml0b3JpbmcpCisgKiAgYmxvY2tpbmcgICAgICA6IEN1bXVsYXRlZCB0aW1lIHRocmVhZHMgdHJ5aW5nIHRvIHBvc3QgbmV3IGl0ZW1zIHdlcmUgYmxvY2tlZCAocXVldWUgZnVsbCkuCisgKiAgbGFzdCAgICAgICAgICA6IEZvciB0aGUgbGFzdCBlbGVtZW50IHJldHJpZXZlZCBmcm9tIHRoZSBxdWV1ZSwgaG93IGxvbmcgaXQgdGFrZSBiZXR3ZWVuIHBvc3RpbmcgKGluY2x1ZGluZyBibG9ja2luZykgYW5kIHBvcGluZworICogIAorICogREVTQ1JJUFRJT046IAorICogIFJldHJpZXZlIHRoZSB0aW1pbmcgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGEgcXVldWUsIGZvciBtb25pdG9yaW5nIHB1cnBvc2UuCisgKgorICogUkVUVVJOIFZBTFVFOgorICogIDAJCTogVGhlIHN0YXRpc3RpY3MgaGF2ZSBiZWVuIHVwZGF0ZWQuCisgKiAgRUlOVkFMIAk6IEEgcGFyYW1ldGVyIGlzIGludmFsaWQuCisgKi8KK2ludCBmZF9maWZvX2dldHN0YXRzKCBzdHJ1Y3QgZmlmbyAqIHF1ZXVlLCBpbnQgKiBjdXJyZW50X2NvdW50LCBpbnQgKiBsaW1pdF9jb3VudCwgaW50ICogaGlnaGVzdF9jb3VudCwgbG9uZyBsb25nICogdG90YWxfY291bnQsIAorCQkJCSAgICAgICAgICAgc3RydWN0IHRpbWVzcGVjICogdG90YWwsIHN0cnVjdCB0aW1lc3BlYyAqIGJsb2NraW5nLCBzdHJ1Y3QgdGltZXNwZWMgKiBsYXN0KTsKKworLyoKKyAqIEZVTkNUSU9OOglmZF9maWZvX2xlbmd0aAorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgcXVldWUJOiBUaGUgcXVldWUgZnJvbSB3aGljaCB0byByZXRyaWV2ZSB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzLgorICoKKyAqIERFU0NSSVBUSU9OOiAKKyAqICBSZXRyaWV2ZSB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGEgcXVldWUsIHdpdGhvdXQgZXJyb3IgY2hlY2tpbmcuCisgKgorICogUkVUVVJOIFZBTFVFOgorICogIFRoZSBudW1iZXIgb2YgaXRlbXMgY3VycmVudGx5IHF1ZXVlZC4KKyAqLworaW50IGZkX2ZpZm9fbGVuZ3RoICggc3RydWN0IGZpZm8gKiBxdWV1ZSApOworCisvKgorICogRlVOQ1RJT046CWZkX2ZpZm9fc2V0dGhyaGQKKyAqCisgKiBQQVJBTUVURVJTOgorICogIHF1ZXVlCTogVGhlIHF1ZXVlIGZvciB3aGljaCB0aGUgdGhyZXNob2xkcyBhcmUgYmVpbmcgc2V0LgorICogIGRhdGEJOiBBbiBvcGFxdWUgcG9pbnRlciB0aGF0IGlzIHBhc3NlZCB0byBoX2NiIGFuZCBsX2NiIGNhbGxiYWNrcy4KKyAqICBoaWdoICAgICAgICA6IFRoZSBoaWdoLWxldmVsIHRocmVzaG9sZC4gSWYgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgcXVldWUgaW5jcmVhc2UgdG8gdGhpcyB2YWx1ZSwgaF9jYiBpcyBjYWxsZWQuCisgKiAgaF9jYiAgICAgICAgOiBpZiBub3QgTlVMTCwgYSBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIHF1ZXVlIGxlbmdoIGlzIGJpZ2dlciB0aGFuICJoaWdoIi4KKyAqICBsb3cgICAgICAgICA6IFRoZSBsb3ctbGV2ZWwgdGhyZXNob2xkLiBNdXN0IGJlIDwgaGlnaC4KKyAqICBsX2NiICAgICAgICA6IElmIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgZGVjcmVhc2UgdG8gbG93LCB0aGlzIGNhbGxiYWNrIGlzIGNhbGxlZC4KKyAqCisgKiBERVNDUklQVElPTjogCisgKiAgVGhpcyBmdW5jdGlvbiBhbGxvd3MgdG8gYWRqdXN0IHRoZSBudW1iZXIgb2YgcHJvZHVjZXIgLyBjb25zdW1lciB0aHJlYWRzIG9mIGEgcXVldWUuCisgKiBJZiB0aGUgY29uc3VtZXIgYXJlIHNsb3dlciB0aGFuIHRoZSBwcm9kdWNlcnMsIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHF1ZXVlIGluY3JlYXNlLgorICogQnkgc2V0dGluZyBhICJoaWdoIiB2YWx1ZSwgd2UgYWxsb3cgYSBjYWxsYmFjayB0byBiZSBjYWxsZWQgd2hlbiB0aGlzIG51bWJlciBpcyB0b28gaGlnaC4KKyAqIFRoZSB0eXBpY2FsIHVzZSB3b3VsZCBiZSB0byBjcmVhdGUgYW4gYWRkaXRpb25hbCBjb25zdW1lciB0aHJlYWQgaW4gdGhpcyBjYWxsYmFjay4KKyAqIElmIHRoZSBxdWV1ZSBjb250aW51ZXMgdG8gZ3JvdywgdGhlIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIGFnYWluIHdoZW4gdGhlIGxlbmd0aCBpcyAyICogaGlnaCwgdGhlbiAzKmhpZ2gsIC4uLiBOICogaGlnaAorICogKHRoZSBjYWxsYmFjayBpdHNlbGYgc2hvdWxkIGltcGxlbWVudCBhIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgY29uc3VtZXJzIHRoYXQgY2FuIGJlIGNyZWF0ZWQpCisgKiBXaGVuIHRoZSBxdWV1ZSBzdGFydHMgdG8gZGVjcmVhc2UsIGFuZCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGdvIHVuZGVyICgoTiAtIDEpICogaGlnaCArIGxvdywgdGhlIGxfY2IgY2FsbGJhY2sgaXMgY2FsbGVkCisgKiBhbmQgd291bGQgdHlwaWFsbHkgc3RvcCBvbmUgb2YgdGhlIGNvbnN1bWVyIHRocmVhZHMuIElmIHRoZSBxdWV1ZSBjb250aW51ZXMgdG8gcmVkdWNlLCBsX2NiIGlzIGFnYWluIGNhbGxlZCBhdCAoTi0yKSpoaWdoICsgbG93LAorICogYW5kIHNvIG9uLgorICoKKyAqIFNpbmNlIHRoZXJlIGlzIG5vIGRlc3RydWN0b3IgZm9yIHRoZSBkYXRhIHBvaW50ZXIsIGlmIGNsZWFudXAgb3BlcmF0aW9ucyBhcmUgcmVxdWlyZWQsIHRoZXkgc2hvdWxkIGJlIHBlcmZvcm1lZCBpbgorICogbF9jYiB3aGVuIHRoZSBsZW5ndGggb2YgdGhlIHF1ZXVlIGlzIGJlY29taW5nIDwgbG93LgorICoKKyAqIE5vdGUgdGhhdCB0aGUgY2FsbGJhY2tzIGFyZSBjYWxsZWQgc3luY2hyb25vdXNseSwgZHVyaW5nIGZkX2ZpZm9fcG9zdCBvciBmZF9maWZvX2dldC4gVGhlaXIgb3BlcmF0aW9uIHNob3VsZCBiZSBxdWljay4KKyAqCisgKiBSRVRVUk4gVkFMVUU6CisgKiAgMAkJOiBUaGUgdGhyZXNob2xkcyBoYXZlIGJlZW4gc2V0CisgKiAgRUlOVkFMIAk6IEEgcGFyYW1ldGVyIGlzIGludmFsaWQuCisgKi8KK2ludCBmZF9maWZvX3NldHRocmhkICggc3RydWN0IGZpZm8gKiBxdWV1ZSwgdm9pZCAqIGRhdGEsIHVpbnQxNl90IGhpZ2gsIHZvaWQgKCpoX2NiKShzdHJ1Y3QgZmlmbyAqLCB2b2lkICoqKSwgdWludDE2X3QgbG93LCB2b2lkICgqbF9jYikoc3RydWN0IGZpZm8gKiwgdm9pZCAqKikgKTsKKworLyoKKyAqIEZVTkNUSU9OOglmZF9maWZvX3Bvc3QKKyAqCisgKiBQQVJBTUVURVJTOgorICogIHF1ZXVlCTogVGhlIHF1ZXVlIGluIHdoaWNoIHRoZSBlbGVtZW50IG11c3QgYmUgcG9zdGVkLgorICogIGl0ZW0JOiBUaGUgZWxlbWVudCB0aGF0IGlzIHB1dCBpbiB0aGUgcXVldWUuCisgKgorICogREVTQ1JJUFRJT046IAorICogIEFuIGVsZW1lbnQgaXMgYWRkZWQgaW4gYSBxdWV1ZS4gRWxlbWVudHMgYXJlIHJldHJpZXZlZCBmcm9tIHRoZSBxdWV1ZSBpbiBGSUZPIG9yZGVyCisgKiAgd2l0aCB0aGUgZmRfZmlmb19nZXQsIGZkX2ZpZm9fdHJ5Z2V0LCBvciBmZF9maWZvX3RpbWVkZ2V0IGZ1bmN0aW9ucy4KKyAqCisgKiBSRVRVUk4gVkFMVUU6CisgKiAgMAkJOiBUaGUgZWxlbWVudCBpcyBxdWV1ZWQuCisgKiAgRUlOVkFMIAk6IEEgcGFyYW1ldGVyIGlzIGludmFsaWQuCisgKiAgRU5PTUVNIAk6IE5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvbXBsZXRlIHRoZSBvcGVyYXRpb24uCisgKi8KK2ludCBmZF9maWZvX3Bvc3RfaW50ICggc3RydWN0IGZpZm8gKiBxdWV1ZSwgdm9pZCAqKiBpdGVtICk7CisjZGVmaW5lIGZkX2ZpZm9fcG9zdChxdWV1ZSwgaXRlbSkgXAorCWZkX2ZpZm9fcG9zdF9pbnQoKHF1ZXVlKSwgKHZvaWQgKikoaXRlbSkpCisKKy8qIFNpbWlsYXIgZnVuY3Rpb24gYnV0IGRvZXMgbm90IGJsb2NrLiBJdCBjYW4gY2F1c2UgdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgcXVldWUgdG8gZXhjZWVkIHRoZSBtYXhpbXVtIHNldC4gRG8gbm90IHVzZSBmb3Igbm9ybWFsIG9wZXJhdGlvbiwKK29ubHkgZm9yIGZhaWx1cmUgcmVjb3ZlcnkgZm9yIGV4YW1wbGUuICovCitpbnQgZmRfZmlmb19wb3N0X25vYmxvY2soIHN0cnVjdCBmaWZvICogcXVldWUsIHZvaWQgKiogaXRlbSApOworCisvKgorICogRlVOQ1RJT046CWZkX2ZpZm9fZ2V0CisgKgorICogUEFSQU1FVEVSUzoKKyAqICBxdWV1ZQk6IFRoZSBxdWV1ZSBmcm9tIHdoaWNoIHRoZSBmaXJzdCBlbGVtZW50IG11c3QgYmUgcmV0cmlldmVkLgorICogIGl0ZW0JOiBPbiByZXR1cm4sIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBxdWV1ZSBpcyBzdG9yZWQgaGVyZS4KKyAqCisgKiBERVNDUklQVElPTjogCisgKiAgVGhpcyBmdW5jdGlvbiByZXRyaWV2ZXMgdGhlIGZpcnN0IGVsZW1lbnQgZnJvbSBhIHF1ZXVlLiBJZiB0aGUgcXVldWUgaXMgZW1wdHksIHRoZSBmdW5jdGlvbiB3aWxsIGJsb2NrIHRoZSAKKyAqIHRocmVhZCB1bnRpbCBhIG5ldyBlbGVtZW50IGlzIHBvc3RlZCB0byB0aGUgcXVldWUsIG9yIHVudGlsIHRoZSB0aHJlYWQgaXMgY2FuY2VsZWQgKGluIHdoaWNoIGNhc2UgdGhlIAorICogZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuKS4KKyAqCisgKiBSRVRVUk4gVkFMVUU6CisgKiAgMAkJOiBBIG5ldyBlbGVtZW50IGhhcyBiZWVuIHJldHJpZXZlZC4KKyAqICBFSU5WQUwgCTogQSBwYXJhbWV0ZXIgaXMgaW52YWxpZC4KKyAqLworaW50IGZkX2ZpZm9fZ2V0X2ludCAoIHN0cnVjdCBmaWZvICogcXVldWUsIHZvaWQgKiogaXRlbSApOworI2RlZmluZSBmZF9maWZvX2dldChxdWV1ZSwgaXRlbSkgXAorCWZkX2ZpZm9fZ2V0X2ludCgocXVldWUpLCAodm9pZCAqKShpdGVtKSkKKworLyoKKyAqIEZVTkNUSU9OOglmZF9maWZvX3RyeWdldAorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgcXVldWUJOiBUaGUgcXVldWUgZnJvbSB3aGljaCB0aGUgZWxlbWVudCBtdXN0IGJlIHJldHJpZXZlZC4KKyAqICBpdGVtCTogT24gcmV0dXJuLCB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgcXVldWUgaXMgc3RvcmVkIGhlcmUuCisgKgorICogREVTQ1JJUFRJT046IAorICogIFRoaXMgZnVuY3Rpb24gaXMgc2ltaWxhciB0byBmZF9maWZvX2dldCwgZXhjZXB0IHRoYXQgaXQgd2lsbCBub3QgYmxvY2sgaWYgCisgKiB0aGUgcXVldWUgaXMgZW1wdHksIGJ1dCByZXR1cm4gRVdPVUxEQkxPQ0sgaW5zdGVhZC4KKyAqCisgKiBSRVRVUk4gVkFMVUU6CisgKiAgMAkJOiBBIG5ldyBlbGVtZW50IGhhcyBiZWVuIHJldHJpZXZlZC4KKyAqICBFSU5WQUwgCTogQSBwYXJhbWV0ZXIgaXMgaW52YWxpZC4KKyAqICBFV09VTERCTE9DSyA6IFRoZSBxdWV1ZSB3YXMgZW1wdHkuCisgKi8KK2ludCBmZF9maWZvX3RyeWdldF9pbnQgKCBzdHJ1Y3QgZmlmbyAqIHF1ZXVlLCB2b2lkICoqIGl0ZW0gKTsKKyNkZWZpbmUgZmRfZmlmb190cnlnZXQocXVldWUsIGl0ZW0pIFwKKwlmZF9maWZvX3RyeWdldF9pbnQoKHF1ZXVlKSwgKHZvaWQgKikoaXRlbSkpCisKKy8qCisgKiBGVU5DVElPTjoJZmRfZmlmb190aW1lZGdldAorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgcXVldWUJOiBUaGUgcXVldWUgZnJvbSB3aGljaCB0aGUgZWxlbWVudCBtdXN0IGJlIHJldHJpZXZlZC4KKyAqICBpdGVtCTogT24gcmV0dXJuLCB0aGUgZWxlbWVudCBpcyBzdG9yZWQgaGVyZS4KKyAqICBhYnN0aW1lCTogdGhlIGFic29sdXRlIHRpbWUgdW50aWwgd2hpY2ggd2UgYWxsb3cgd2FpdGluZyBmb3IgYW4gaXRlbS4KKyAqCisgKiBERVNDUklQVElPTjogCisgKiAgVGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIGZkX2ZpZm9fZ2V0LCBleGNlcHQgdGhhdCBpdCB3aWxsIGJsb2NrIGlmIHRoZSBxdWV1ZSBpcyBlbXB0eSAKKyAqIG9ubHkgdW50aWwgdGhlIGFic29sdXRlIHRpbWUgYWJzdGltZSAoc2VlIHB0aHJlYWRfY29uZF90aW1lZHdhaXQgZm9yICsgaW5mbykuCisgKiBJZiB0aGUgcXVldWUgaXMgc3RpbGwgZW1wdHkgd2hlbiB0aGUgdGltZSBleHBpcmVzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBFVElNRURPVVQKKyAqCisgKiBSRVRVUk4gVkFMVUU6CisgKiAgMAkJOiBBIG5ldyBpdGVtIGhhcyBiZWVuIHJldHJpZXZlZC4KKyAqICBFSU5WQUwgCTogQSBwYXJhbWV0ZXIgaXMgaW52YWxpZC4KKyAqICBFVElNRURPVVQgICA6IFRoZSB0aW1lIG91dCBoYXMgcGFzc2VkIGFuZCBubyBpdGVtIGhhcyBiZWVuIHJlY2VpdmVkLgorICovCitpbnQgZmRfZmlmb190aW1lZGdldF9pbnQgKCBzdHJ1Y3QgZmlmbyAqIHF1ZXVlLCB2b2lkICoqIGl0ZW0sIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqYWJzdGltZSApOworI2RlZmluZSBmZF9maWZvX3RpbWVkZ2V0KHF1ZXVlLCBpdGVtLCBhYnN0aW1lKSBcCisJZmRfZmlmb190aW1lZGdldF9pbnQoKHF1ZXVlKSwgKHZvaWQgKikoaXRlbSksIChhYnN0aW1lKSkKKworCisvKgorICogRlVOQ1RJT046CWZkX2ZpZm9fc2VsZWN0CisgKgorICogUEFSQU1FVEVSUzoKKyAqICBxdWV1ZQk6IFRoZSBxdWV1ZSB0byB0ZXN0LgorICogIGFic3RpbWUJOiB0aGUgYWJzb2x1dGUgdGltZSB1bnRpbCB3aGljaCB3ZSBjYW4gYmxvY2sgd2FpdGluZyBmb3IgYW4gaXRlbS4gSWYgTlVMTCwgdGhlIGZ1bmN0aW9uIHJldHVybnMgaW1tZWRpYXRseS4KKyAqCisgKiBERVNDUklQVElPTjogCisgKiAgVGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIHNlbGVjdCgpLCBpdCB3YWl0cyBmb3IgZGF0YSB0byBiZSBhdmFpbGFibGUgaW4gdGhlIHF1ZXVlCisgKiB1bnRpbCB0aGUgYWJzdGltZSBpcyBleHBpcmVkLgorICogVXBvbiBmdW5jdGlvbiBlbnRyeSwgZXZlbiBpZiBhYnN0aW1lIGlzIGFscmVhZHkgZXhwaXJlZCB0aGUgZGF0YSBhdmFpbGFiaWxpdHkgaXMgdGVzdGVkLgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqICAwCQk6IHRpbWVvdXQgZXhwaXJlZCB3aXRob3V0IGF2YWlsYWJsZSBkYXRhLgorICogIDwwCQk6IEFuIGVycm9yIG9jY3VycmVkIChlLmcuLCAtRUlOVkFMLi4uKQorICogID4wCQk6IGRhdGEgaXMgYXZhaWxhYmxlLiBUaGUgbmV4dCBjYWxsIHRvIGZkX2ZpZm9fZ2V0IHdpbGwgbm90IGJsb2NrLgorICovCitpbnQgZmRfZmlmb19zZWxlY3QgKCBzdHJ1Y3QgZmlmbyAqIHF1ZXVlLCBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKmFic3RpbWUgKTsKKworCisKKy8qIER1bXAgYSBmaWZvIGxpc3QgYW5kIG9wdGlvbmFsbHkgaXRzIGlubmVyIGVsZW1lbnRzIC0tIGJld2FyZSBvZiBkZWFkbG9ja3MhICovCit0eXBlZGVmIERFQ0xBUkVfRkRfRFVNUF9QUk9UT1RZUEUoKCpmZF9maWZvX2R1bXBfaXRlbV9jYiksIHZvaWQgKiBpdGVtKTsgLyogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgMSBsaW5lIGlmIHBvc3NpYmxlLCBvciB1c2UgaW5kZW50IGxldmVsLiBFbmRzIHdpdGggJ1xuJyAqLworREVDTEFSRV9GRF9EVU1QX1BST1RPVFlQRShmZF9maWZvX2R1bXAsIGNoYXIgKiBuYW1lLCBzdHJ1Y3QgZmlmbyAqIHF1ZXVlLCBmZF9maWZvX2R1bXBfaXRlbV9jYiBkdW1wX2l0ZW0pOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX0xJQkZEUFJPVE9fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVlRGlhbWV0ZXIvdmVyc2lvbi5oLmluIGIvaW5jbHVkZS9mcmVlRGlhbWV0ZXIvdmVyc2lvbi5oLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMGZhNjEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2ZyZWVEaWFtZXRlci92ZXJzaW9uLmguaW4KQEAgLTAsMCArMSwzIEBACisvKiBGb2xsb3dpbmcgdmFyaWFibGUgaXMgZXhwZW5kZWQgYXQgYnVpbGQgdGltZSBiYXNlZCBvbiB0aGUgcmVzdWx0IG9mICJoZyBpZCIgY29tbWFuZCAqLworI2NtYWtlZGVmaW5lIEZEX1BST0pFQ1RfVkVSU0lPTl9IRworI2RlZmluZSBGRF9QUk9KRUNUX1ZFUlNJT05fSEdfVkFMICJARkRfUFJPSkVDVF9WRVJTSU9OX0hHQCIKZGlmZiAtLWdpdCBhL2xpYmZkY29yZS9DTWFrZUxpc3RzLnR4dCBiL2xpYmZkY29yZS9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDM0MzdkCi0tLSAvZGV2L251bGwKKysrIGIvbGliZmRjb3JlL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsODUgQEAKKyMgVGhlIHN1YnByb2plY3QgbmFtZQorUHJvamVjdCgiZnJlZURpYW1ldGVyIGNvcmUgbGlicmFyeSIgQykKKworIyBDb25maWd1cmF0aW9uIGZvciBuZXdlciBjbWFrZQorY21ha2VfcG9saWN5KFZFUlNJT04gMi42KQoraWYgKFBPTElDWSBDTVAwMDIyKQorCWNtYWtlX3BvbGljeShTRVQgQ01QMDAyMiBPTEQpCitlbmRpZiAoUE9MSUNZIENNUDAwMjIpCisKKyMgQ29uZmlndXJhdGlvbiBwYXJzZXIKK0JJU09OX0ZJTEUoZmRkLnkpCitGTEVYX0ZJTEUoZmRkLmwpCitTRVRfU09VUkNFX0ZJTEVTX1BST1BFUlRJRVMobGV4LmZkZC5jIGZkZC50YWIuYyBQUk9QRVJUSUVTIENPTVBJTEVfRkxBR1MgIi1JICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfSIpCisKKyMgTGlzdCBvZiBzb3VyY2UgZmlsZXMKK1NFVChGRENPUkVfU1JDCisJZmRjb3JlLWludGVybmFsLmgKKwlhcHBzLmMKKwljbnhjdHguaAorCWNvbmZpZy5jCisJY29yZS5jCisJY254Y3R4LmMKKwllbmRwb2ludHMuYworCWV2ZW50cy5jCisJZXh0ZW5zaW9ucy5jCisJZmlmb19zdGF0cy5jCisJaG9va3MuYworCWRpY3RfYmFzZV9wcm90by5jCisJbWVzc2FnZXMuYworCXF1ZXVlcy5jCisJcGVlcnMuYworCXBfY2UuYworCXBfY254LmMKKwlwX2R3LmMKKwlwX2RwLmMKKwlwX2V4cGlyeS5jCisJcF9vdXQuYworCXBfcHNtLmMKKwlwX3NyLmMKKwlyb3V0aW5nX2Rpc3BhdGNoLmMKKwlzZXJ2ZXIuYworCXRjcC5jCisJdmVyc2lvbi5jCisJKQorCitJRihOT1QgRElTQUJMRV9TQ1RQKQorCVNFVChGRENPUkVfU1JDICR7RkRDT1JFX1NSQ30gc2N0cC5jIHNjdHAzNDM2LmMpCitFTkRJRihOT1QgRElTQUJMRV9TQ1RQKQorCitTRVQoRkRDT1JFX0dFTl9TUkMKKwkJbGV4LmZkZC5jCisJCWZkZC50YWIuYworCQlmZGQudGFiLmgKKwkpCisJCisjIFNhdmUgdGhlIGxpc3Qgb2YgZmlsZXMgZm9yIHRoZSB0ZXN0cyAKK1NFVChGRENPUkVfU1JDICR7RkRDT1JFX1NSQ30gUEFSRU5UX1NDT1BFKQorU0VUKEZEQ09SRV9HRU5fU1JDICR7RkRDT1JFX0dFTl9TUkN9IFBBUkVOVF9TQ09QRSkKKworIyBJbmNsdWRlIHBhdGgKK0lOQ0xVREVfRElSRUNUT1JJRVMoJHtMRkRDT1JFX0lOQ0xVREVTfSkKK0lOQ0xVREVfRElSRUNUT1JJRVMoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9KQorCisjIEJ1aWxkIHRoZSBleGVjdXRhYmxlCitBRERfTElCUkFSWShsaWJmZGNvcmUgU0hBUkVEICR7RkRDT1JFX1NSQ30gJHtGRENPUkVfR0VOX1NSQ30pCitBRERfREVQRU5ERU5DSUVTKGxpYmZkY29yZSB2ZXJzaW9uX2luZm9ybWF0aW9uKQorCisjIEF2b2lkIHRoZSBsaWJsaWIgbmFtZSwgYW5kIHNldCB0aGUgdmVyc2lvbgorU0VUX1RBUkdFVF9QUk9QRVJUSUVTKGxpYmZkY29yZSBQUk9QRVJUSUVTIAorCU9VVFBVVF9OQU1FICJmZGNvcmUiCisJU09WRVJTSU9OICR7RkRfUFJPSkVDVF9WRVJTSU9OX0FQSX0KKwlWRVJTSU9OICR7RkRfUFJPSkVDVF9WRVJTSU9OX01BSk9SfS4ke0ZEX1BST0pFQ1RfVkVSU0lPTl9NSU5PUn0uJHtGRF9QUk9KRUNUX1ZFUlNJT05fUkVWfQorCUxJTktfSU5URVJGQUNFX0xJQlJBUklFUyAiJHtMRkRDT1JFX0xJTktfSU5URVJGQUNFU30iKQorCisjIFRoZSBsaWJyYXJ5IGl0c2VsZiBuZWVkcyBvdGhlciBsaWJyYXJpZXMgCitMSU5LX0RJUkVDVE9SSUVTKCR7Q1VSUkVOVF9CSU5BUllfRElSfS8uLi9saWJmZHByb3RvKQorVEFSR0VUX0xJTktfTElCUkFSSUVTKGxpYmZkY29yZSBsaWJmZHByb3RvICR7TEZEQ09SRV9MSUJTfSkKKworCisjIyMjCisjIyBJTlNUQUxMIHNlY3Rpb24gIyMKKworSU5TVEFMTChUQVJHRVRTIGxpYmZkY29yZQorCUxJQlJBUlkgREVTVElOQVRJT04gJHtJTlNUQUxMX0xJQlJBUllfU1VGRklYfQorCUNPTVBPTkVOVCBmcmVlRGlhbWV0ZXItY29tbW9uKQpkaWZmIC0tZ2l0IGEvbGliZmRjb3JlL2FwcHMuYyBiL2xpYmZkY29yZS9hcHBzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA4MTFkOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmZkY29yZS9hcHBzLmMKQEAgLTAsMCArMSwxNTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDExLCBXSURFIFByb2plY3QgYW5kIE5JQ1QJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFdJREUgUHJvamVjdCBvciBOSUNUIG5vciB0aGUgCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgV0lERSBQcm9qZWN0IGFuZCAJCQkJCQkgKgorKiAgIE5JQ1QuCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImZkY29yZS1pbnRlcm5hbC5oIgorCisvKiBNZXJnZSBpbmZvcm1hdGlvbiBpbnRvIGEgbGlzdCBvZiBhcHBzICovCitpbnQgZmRfYXBwX21lcmdlKHN0cnVjdCBmZF9saXN0ICogbGlzdCwgYXBwbGljYXRpb25faWRfdCBhaWQsIHZlbmRvcl9pZF90IHZpZCwgaW50IGF1dGgsIGludCBhY2N0KQoreworCXN0cnVjdCBmZF9saXN0ICogbGk7CisJaW50IHNraXAgPSAwOworCQorCS8qIExpc3QgaXMgb3JkZXJlZCBieSBhcHBpZC4gQXZvaWQgZHVwbGljYXRlcyAqLworCWZvciAobGkgPSBsaXN0OyBsaS0+bmV4dCAhPSBsaXN0OyBsaSA9IGxpLT5uZXh0KSB7CisJCXN0cnVjdCBmZF9hcHAgKiBuYSA9IChzdHJ1Y3QgZmRfYXBwICopKGxpLT5uZXh0KTsKKwkJaWYgKG5hLT5hcHBpZCA8IGFpZCkKKwkJCWNvbnRpbnVlOworCQkKKwkJaWYgKG5hLT5hcHBpZCA+IGFpZCkKKwkJCWJyZWFrOworCQkKKwkJLyogT3RoZXJ3aXNlLCB3ZSBtZXJnZSB3aXRoIGV4aXN0aW5nIGVudHJ5IC0tIGlnbm9yZSB2ZW5kb3IgaWQgaW4gdGhpcyBjYXNlICovCisJCXNraXAgPSAxOworCQkKKwkJaWYgKGF1dGgpCisJCQluYS0+ZmxhZ3MuYXV0aCA9IDE7CisJCWlmIChhY2N0KQorCQkJbmEtPmZsYWdzLmFjY3QgPSAxOworCQlicmVhazsKKwl9CisJCisJaWYgKCFza2lwKSB7CQkJCisJCXN0cnVjdCBmZF9hcHAgICogbmV3ID0gTlVMTDsKKworCQlDSEVDS19NQUxMT0MoIG5ldyA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGZkX2FwcCkpICk7CisJCW1lbXNldChuZXcsIDAsIHNpemVvZihzdHJ1Y3QgZmRfYXBwKSk7CisJCWZkX2xpc3RfaW5pdCgmbmV3LT5jaGFpbiwgTlVMTCk7CisJCW5ldy0+ZmxhZ3MuYXV0aCA9IChhdXRoID8gMSA6IDApOworCQluZXctPmZsYWdzLmFjY3QgPSAoYWNjdCA/IDEgOiAwKTsKKwkJbmV3LT52bmRpZCA9IHZpZDsKKwkJbmV3LT5hcHBpZCA9IGFpZDsKKwkJZmRfbGlzdF9pbnNlcnRfYWZ0ZXIobGksICZuZXctPmNoYWluKTsKKwl9CisJCisJcmV0dXJuIDA7Cit9CisKKy8qIENoZWNrIGlmIGEgZ2l2ZW4gYXBwbGljYXRpb24gaWQgaXMgaW4gYSBsaXN0ICovCitpbnQgZmRfYXBwX2NoZWNrKHN0cnVjdCBmZF9saXN0ICogbGlzdCwgYXBwbGljYXRpb25faWRfdCBhaWQsIHN0cnVjdCBmZF9hcHAgKipkZXRhaWwpCit7CisJc3RydWN0IGZkX2xpc3QgKiBsaTsKKwkKKwlUUkFDRV9FTlRSWSgiJXAgJWQgJXAiLCBsaXN0LCBhaWQsIGRldGFpbCk7CisJQ0hFQ0tfUEFSQU1TKGxpc3QgJiYgZGV0YWlsKTsKKwkKKwkqZGV0YWlsID0gTlVMTDsKKwkKKwkvKiBTZWFyY2ggaW4gdGhlIGxpc3QgKi8KKwlmb3IgKGxpID0gbGlzdC0+bmV4dDsgbGkgIT0gbGlzdDsgbGkgPSBsaS0+bmV4dCkgeworCQlzdHJ1Y3QgZmRfYXBwICogYSA9IChzdHJ1Y3QgZmRfYXBwICopbGk7CisJCWlmIChhLT5hcHBpZCA8IGFpZCkKKwkJCWNvbnRpbnVlOworCQkKKwkJaWYgKGEtPmFwcGlkID09IGFpZCkKKwkJCSpkZXRhaWwgPSBhOworCQlicmVhazsKKwl9CisJCisJcmV0dXJuIDA7Cit9CisKKy8qIENoZWNrIGlmIHR3byBsaXN0cyBoYXZlIGF0IGxlYXN0IG9uZSBjb21tb24gYXBwbGljYXRpb24gKi8KK2ludCBmZF9hcHBfY2hlY2tfY29tbW9uKHN0cnVjdCBmZF9saXN0ICogbGlzdDEsIHN0cnVjdCBmZF9saXN0ICogbGlzdDIsIGludCAqIGNvbW1vbl9mb3VuZCkKK3sKKwlzdHJ1Y3QgZmRfbGlzdCAqIGxpMSwgKmxpMjsKKwkKKwlUUkFDRV9FTlRSWSgiJXAgJXAgJXAiLCBsaXN0MSwgbGlzdDIsIGNvbW1vbl9mb3VuZCk7CisJQ0hFQ0tfUEFSQU1TKCBsaXN0MSAmJiBsaXN0MiAmJiBjb21tb25fZm91bmQgKTsKKwkKKwkvKiBCb3RoIGxpc3RzIGFyZSBvcmRlcmVkLCBzbyBhZHZhbmNlIGJvdGggcG9pbnRlcnMgYXQgdGhlIHNhbWUgdGltZSAqLworCWZvciAobGkxID0gbGlzdDEtPm5leHQsIGxpMiA9IGxpc3QyLT5uZXh0OyAgKGxpMSAhPSBsaXN0MSkgJiYgKGxpMiAhPSBsaXN0Mik7ICkgeworCQlzdHJ1Y3QgZmRfYXBwICogYTEgPSAoc3RydWN0IGZkX2FwcCAqKWxpMSwgKmEyID0gKHN0cnVjdCBmZF9hcHAgKilsaTI7CisJCWlmIChhMS0+YXBwaWQgPCBhMi0+YXBwaWQpIHsKKwkJCWxpMSA9IGxpMS0+bmV4dDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChhMS0+YXBwaWQgPiBhMi0+YXBwaWQpIHsKKwkJCWxpMiA9IGxpMi0+bmV4dDsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qIFRoZXkgYXJlIGVxdWFsLCBjb21wYXJlIHRoZSBhcHBsaWNhdGlvbnMgKi8KKwkJaWYgKChhMS0+ZmxhZ3MuYXV0aCAmJiBhMi0+ZmxhZ3MuYXV0aCkgfHwgKGExLT5mbGFncy5hY2N0ICYmIGEyLT5mbGFncy5hY2N0KSkgeworCQkJLyogZm91bmQhICovCisJCQkqY29tbW9uX2ZvdW5kID0gMTsKKwkJCXJldHVybiAwOworCQl9CisJCQorCQkvKiBUaGlzIGFwcGxpY2F0aW9uIGlzIG5vdCBjb21tb24sIGFkdmFuY2UgYm90aCBsaXN0cyAqLworCQlsaTEgPSBsaTEtPm5leHQ7CisJCWxpMiA9IGxpMi0+bmV4dDsKKwl9CisJCisJLyogV2UgZGlkIG5vdCBmaW5kIGEgY29tbW9uIGFwcCAqLworCSpjb21tb25fZm91bmQgPSAwOworCXJldHVybiAwOworfQorCisvKiBSZW1vdmUgdGhlIGFwcHMgZnJvbSBhIGxpc3QgKi8KK2ludCBmZF9hcHBfZW1wdHkoc3RydWN0IGZkX2xpc3QgKiBsaXN0KQoreworCVRSQUNFX0VOVFJZKCIlcCIsIGxpc3QpOworCUNIRUNLX1BBUkFNUyggbGlzdCApOworCQorCXdoaWxlICghRkRfSVNfTElTVF9FTVBUWShsaXN0KSkgeworCQlzdHJ1Y3QgZmRfbGlzdCAqIGxpID0gbGlzdC0+bmV4dDsKKwkJZmRfbGlzdF91bmxpbmsobGkpOworCQlmcmVlKGxpKTsKKwl9CisJCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJmZGNvcmUvY254Y3R4LmMgYi9saWJmZGNvcmUvY254Y3R4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZjMzM2ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmZkY29yZS9jbnhjdHguYwpAQCAtMCwwICsxLDIwNDUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDE1LCBXSURFIFByb2plY3QgYW5kIE5JQ1QJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFdJREUgUHJvamVjdCBvciBOSUNUIG5vciB0aGUgCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgV0lERSBQcm9qZWN0IGFuZCAJCQkJCQkgKgorKiAgIE5JQ1QuCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImZkY29yZS1pbnRlcm5hbC5oIgorI2luY2x1ZGUgImNueGN0eC5oIgorCisjaW5jbHVkZSA8bmV0L2lmLmg+CisjaW5jbHVkZSA8aWZhZGRycy5oPiAvKiBmb3IgZ2V0aWZhZGRycyAqLworI2luY2x1ZGUgPHN5cy91aW8uaD4gLyogd3JpdGV2ICovCisKKy8qIFRoZSBtYXhpbXVtIHNpemUgb2YgRGlhbWV0ZXIgbWVzc2FnZSB3ZSBhY2NlcHQgdG8gcmVjZWl2ZSAoPD0gMl4yNCkgdG8gYXZvaWQgdG9vIGJpZyBtYWxsb2NzIGluIGNhc2Ugb2YgdHJhc2hlZCBoZWFkZXJzICovCisjaWZuZGVmIERJQU1FVEVSX01TR19TSVpFX01BWAorI2RlZmluZSBESUFNRVRFUl9NU0dfU0laRV9NQVgJNjU1MzUJLyogaW4gYnl0ZXMgKi8KKyNlbmRpZiAvKiBESUFNRVRFUl9NU0dfU0laRV9NQVggKi8KKworCisvKiBDb25uZWN0aW9ucyBjb250ZXh0cyAoY254Y3R4KSBpbiBmcmVlRGlhbWV0ZXIgYXJlIHdyYXBwZXJzIGFyb3VuZCB0aGUgc29ja2V0cyBhbmQgVExTIG9wZXJhdGlvbnMgLgorICogVGhleSBhcmUgdXNlZCB0byBoaWRlIHRoZSBkZXRhaWxzIG9mIHRoZSBwcm9jZXNzaW5nIHRvIHRoZSBoaWdoZXIgbGF5ZXJzIG9mIHRoZSBkYWVtb24uCisgKiBUaGV5IGFyZSBhbHdheXMgb3JpZW50ZWQgb24gY29ubmVjdGlvbnMgKFRDUCBvciBTQ1RQKSwgY29ubmVjdGlvbmxlc3MgbW9kZXMgKFVEUCBvciBTQ1RQKSBhcmUgbm90IHN1cHBvcnRlZC4KKyAqLworCisvKiBMaWZldGltZSBvZiBhIGNueGN0eCBvYmplY3Q6CisgKiAxKSBDcmVhdGlvbgorICogICAgYSkgYSBzZXJ2ZXIgc29ja2V0OgorICogICAgICAgLSBjcmVhdGUgdGhlIG9iamVjdCB3aXRoIGZkX2NueF9zZXJ2X3RjcCBvciBmZF9jbnhfc2Vydl9zY3RwCisgKiAgICAgICAtIHN0YXJ0IGxpc3RlbmluZyBpbmNvbWluZyBjb25uZWN0aW9uczogZmRfY254X3NlcnZfbGlzdGVuCisgKiAgICAgICAtIGFjY2VwdCBuZXcgY2xpZW50cyB3aXRoIGZkX2NueF9zZXJ2X2FjY2VwdC4KKyAqICAgIGIpIGEgY2xpZW50IHNvY2tldDoKKyAqICAgICAgIC0gY29ubmVjdCB0byBhIHJlbW90ZSBzZXJ2ZXIgd2l0aCBmZF9jbnhfY2xpX2Nvbm5lY3QKKyAqCisgKiAyKSBJbml0aWFsaXphdGlvbgorICogICAgLSBpZiBUTFMgaXMgc3RhcnRlZCBmaXJzdCwgY2FsbCBmZF9jbnhfaGFuZHNoYWtlCisgKiAgICAtIG90aGVyd2lzZSB0byByZWNlaXZlIGNsZWFyIG1lc3NhZ2VzLCBjYWxsIGZkX2NueF9zdGFydF9jbGVhci4gZmRfY254X2hhbmRzaGFrZSBjYW4gYmUgY2FsbGVkIGxhdGVyLgorICoKKyAqIDMpIFVzYWdlCisgKiAgICAtIGZkX2NueF9yZWNlaXZlLCBmZF9jbnhfc2VuZCA6IGV4Y2hhbmdlIG1lc3NhZ2VzIG9uIHRoaXMgY29ubmVjdGlvbiAoc2VuZCBpcyBzeW5jaHJvbm91cywgcmVjZWl2ZSBpcyBub3QsIGJ1dCBibG9ja2luZykuCisgKiAgICAtIGZkX2NueF9yZWN2X3NldGFsdGZpZm8gOiB3aGVuIGEgbWVzc2FnZSBpcyByZWNlaXZlZCwgdGhlIGV2ZW50IGlzIHNlbnQgdG8gYW4gZXh0ZXJuYWwgZmlmbyBsaXN0LiBmZF9jbnhfcmVjZWl2ZSBkb2VzIG5vdCB3b3JrIHdoZW4gdGhlIGFsdF9maWZvIGlzIHNldC4KKyAqICAgIC0gZmRfY254X2dldGlkIDogcmV0cmlldmUgYSBkZXNjcmlwdGl2ZSBzdHJpbmcgZm9yIHRoZSBjb25uZWN0aW9uIChmb3IgZGVidWcpCisgKiAgICAtIGZkX2NueF9nZXRyZW1vdGVpZCA6IGlkZW50aWZpY2F0aW9uIG9mIHRoZSByZW1vdGUgcGVlciAoSVAgYWRkcmVzcyBvciBmcWRuKQorICogICAgLSBmZF9jbnhfZ2V0Y3JlZCA6IGdldCB0aGUgcmVtb3RlIHBlZXIgVExTIGNyZWRlbnRpYWxzLCBhZnRlciBoYW5kc2hha2UKKyAqCisgKiA0KSBFbmQKKyAqICAgIC0gZmRfY254X2Rlc3Ryb3kKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICBDcmVhdGlvbiBvZiBhIGNvbm5lY3Rpb24gb2JqZWN0ICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEluaXRpYWxpemUgYSBjb250ZXh0IHN0cnVjdHVyZSAqLworc3RhdGljIHN0cnVjdCBjbnhjdHggKiBmZF9jbnhfaW5pdChpbnQgZnVsbCkKK3sKKwlzdHJ1Y3QgY254Y3R4ICogY29ubiA9IE5VTEw7CisKKwlUUkFDRV9FTlRSWSgiJWQiLCBmdWxsKTsKKworCUNIRUNLX01BTExPQ19ETyggY29ubiA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGNueGN0eCkpLCByZXR1cm4gTlVMTCApOworCW1lbXNldChjb25uLCAwLCBzaXplb2Yoc3RydWN0IGNueGN0eCkpOworCisJaWYgKGZ1bGwpIHsKKwkJQ0hFQ0tfRkNUX0RPKCBmZF9maWZvX25ldyAoICZjb25uLT5jY19pbmNvbWluZywgNSApLCByZXR1cm4gTlVMTCApOworCX0KKworCXJldHVybiBjb25uOworfQorCisjZGVmaW5lIENDX0lEX0hEUiAiey0tLS19ICIKKworLyogQ3JlYXRlIGFuZCBiaW5kIGEgc2VydmVyIHNvY2tldCB0byB0aGUgZ2l2ZW4gZW5kcG9pbnQgYW5kIHBvcnQgKi8KK3N0cnVjdCBjbnhjdHggKiBmZF9jbnhfc2Vydl90Y3AodWludDE2X3QgcG9ydCwgaW50IGZhbWlseSwgc3RydWN0IGZkX2VuZHBvaW50ICogZXApCit7CisJc3RydWN0IGNueGN0eCAqIGNueCA9IE5VTEw7CisJc1NTIGR1bW15OworCXNTQSAqIHNhID0gKHNTQSAqKSAmZHVtbXk7CisKKwlUUkFDRV9FTlRSWSgiJWh1ICVkICVwIiwgcG9ydCwgZmFtaWx5LCBlcCk7CisKKwlDSEVDS19QQVJBTVNfRE8oIHBvcnQsIHJldHVybiBOVUxMICk7CisJQ0hFQ0tfUEFSQU1TX0RPKCBlcCB8fCBmYW1pbHksIHJldHVybiBOVUxMICk7CisJQ0hFQ0tfUEFSQU1TX0RPKCAoISBmYW1pbHkpIHx8IChmYW1pbHkgPT0gQUZfSU5FVCkgfHwgKGZhbWlseSA9PSBBRl9JTkVUNiksIHJldHVybiBOVUxMICk7CisJQ0hFQ0tfUEFSQU1TX0RPKCAoISBlcCkgfHwgKGVwLT5zcy5zc19mYW1pbHkgPT0gQUZfSU5FVCkgfHwgKGVwLT5zcy5zc19mYW1pbHkgPT0gQUZfSU5FVDYpLCByZXR1cm4gTlVMTCApOworCUNIRUNLX1BBUkFNU19ETyggKCEgZXApIHx8ICghZmFtaWx5KSB8fCAoZXAtPnNzLnNzX2ZhbWlseSA9PSBmYW1pbHkpLCByZXR1cm4gTlVMTCApOworCisJLyogVGhlIGNvbm5lY3Rpb24gb2JqZWN0ICovCisJQ0hFQ0tfTUFMTE9DX0RPKCBjbnggPSBmZF9jbnhfaW5pdCgwKSwgcmV0dXJuIE5VTEwgKTsKKworCS8qIFByZXBhcmUgdGhlIHNvY2tldCBhZGRyZXNzIGluZm9ybWF0aW9uICovCisJaWYgKGVwKSB7CisJCW1lbWNweShzYSwgJmVwLT5zcywgc2l6ZW9mKHNTUykpOworCX0gZWxzZSB7CisJCW1lbXNldCgmZHVtbXksIDAsIHNpemVvZihkdW1teSkpOworCQlzYS0+c2FfZmFtaWx5ID0gZmFtaWx5OworCX0KKwlpZiAoc2EtPnNhX2ZhbWlseSA9PSBBRl9JTkVUKSB7CisJCSgoc1NBNCAqKXNhKS0+c2luX3BvcnQgPSBodG9ucyhwb3J0KTsKKwkJY254LT5jY19mYW1pbHkgPSBBRl9JTkVUOworCX0gZWxzZSB7CisJCSgoc1NBNiAqKXNhKS0+c2luNl9wb3J0ID0gaHRvbnMocG9ydCk7CisJCWNueC0+Y2NfZmFtaWx5ID0gQUZfSU5FVDY7CisJfQorCisJLyogQ3JlYXRlIHRoZSBzb2NrZXQgKi8KKwlDSEVDS19GQ1RfRE8oIGZkX3RjcF9jcmVhdGVfYmluZF9zZXJ2ZXIoICZjbngtPmNjX3NvY2tldCwgc2EsIHNTQWxlbihzYSkgKSwgZ290byBlcnJvciApOworCisJLyogR2VuZXJhdGUgdGhlIG5hbWUgZm9yIHRoZSBjb25uZWN0aW9uIG9iamVjdCAqLworCXsKKwkJY2hhciBhZGRyYnVmW0lORVQ2X0FERFJTVFJMRU5dOworCQlpbnQgIHJjOworCQlyYyA9IGdldG5hbWVpbmZvKHNhLCBzU0FsZW4oc2EpLCBhZGRyYnVmLCBzaXplb2YoYWRkcmJ1ZiksIE5VTEwsIDAsIE5JX05VTUVSSUNIT1NUKTsKKwkJaWYgKHJjKQorCQkJc25wcmludGYoYWRkcmJ1Ziwgc2l6ZW9mKGFkZHJidWYpLCAiW2Vycjolc10iLCBnYWlfc3RyZXJyb3IocmMpKTsKKwkJc25wcmludGYoY254LT5jY19pZCwgc2l6ZW9mKGNueC0+Y2NfaWQpLCBDQ19JRF9IRFIgIlRDUCBzcnYgWyVzXTolaHUgKCVkKSIsIGFkZHJidWYsIHBvcnQsIGNueC0+Y2Nfc29ja2V0KTsKKwl9CisKKwljbngtPmNjX3Byb3RvID0gSVBQUk9UT19UQ1A7CisKKwlyZXR1cm4gY254OworCitlcnJvcjoKKwlmZF9jbnhfZGVzdHJveShjbngpOworCXJldHVybiBOVUxMOworfQorCisvKiBTYW1lIGZ1bmN0aW9uIGZvciBTQ1RQLCB3aXRoIGEgbGlzdCBvZiBsb2NhbCBlbmRwb2ludHMgdG8gYmluZCB0byAqLworc3RydWN0IGNueGN0eCAqIGZkX2NueF9zZXJ2X3NjdHAodWludDE2X3QgcG9ydCwgc3RydWN0IGZkX2xpc3QgKiBlcF9saXN0KQoreworI2lmZGVmIERJU0FCTEVfU0NUUAorCVRSQUNFX0RFQlVHKElORk8sICJUaGlzIGZ1bmN0aW9uIHNob3VsZCBuZXZlciBiZWVuIGNhbGxlZCB3aGVuIFNDVFAgaXMgZGlzYWJsZWQuLi4iKTsKKwlBU1NFUlQoMCk7CisJQ0hFQ0tfRkNUX0RPKCBFTk9UU1VQLCApOworCXJldHVybiBOVUxMOworI2Vsc2UgLyogRElTQUJMRV9TQ1RQICovCisJc3RydWN0IGNueGN0eCAqIGNueCA9IE5VTEw7CisKKwlUUkFDRV9FTlRSWSgiJWh1ICVwIiwgcG9ydCwgZXBfbGlzdCk7CisKKwlDSEVDS19QQVJBTVNfRE8oIHBvcnQsIHJldHVybiBOVUxMICk7CisKKwkvKiBUaGUgY29ubmVjdGlvbiBvYmplY3QgKi8KKwlDSEVDS19NQUxMT0NfRE8oIGNueCA9IGZkX2NueF9pbml0KDApLCByZXR1cm4gTlVMTCApOworCisJaWYgKGZkX2dfY29uZmlnLT5jbmZfZmxhZ3Mubm9faXA2KSB7CisJCWNueC0+Y2NfZmFtaWx5ID0gQUZfSU5FVDsKKwl9IGVsc2UgeworCQljbngtPmNjX2ZhbWlseSA9IEFGX0lORVQ2OyAvKiBjYW4gY3JlYXRlIHNvY2tldCBmb3IgYm90aCBJUCBhbmQgSVB2NiAqLworCX0KKwkKKwkvKiBDcmVhdGUgdGhlIHNvY2tldCAqLworCUNIRUNLX0ZDVF9ETyggZmRfc2N0cF9jcmVhdGVfYmluZF9zZXJ2ZXIoICZjbngtPmNjX3NvY2tldCwgY254LT5jY19mYW1pbHksIGVwX2xpc3QsIHBvcnQgKSwgZ290byBlcnJvciApOworCisJLyogR2VuZXJhdGUgdGhlIG5hbWUgZm9yIHRoZSBjb25uZWN0aW9uIG9iamVjdCAqLworCXNucHJpbnRmKGNueC0+Y2NfaWQsIHNpemVvZihjbngtPmNjX2lkKSwgQ0NfSURfSERSICJTQ1RQIHNydiA6JWh1ICglZCkiLCBwb3J0LCBjbngtPmNjX3NvY2tldCk7CisKKwljbngtPmNjX3Byb3RvID0gSVBQUk9UT19TQ1RQOworCisJcmV0dXJuIGNueDsKKworZXJyb3I6CisJZmRfY254X2Rlc3Ryb3koY254KTsKKwlyZXR1cm4gTlVMTDsKKyNlbmRpZiAvKiBESVNBQkxFX1NDVFAgKi8KK30KKworLyogQWxsb3cgY2xpZW50cyB0byBjb25uZWN0IG9uIHRoZSBzZXJ2ZXIgc29ja2V0ICovCitpbnQgZmRfY254X3NlcnZfbGlzdGVuKHN0cnVjdCBjbnhjdHggKiBjb25uKQoreworCUNIRUNLX1BBUkFNUyggY29ubiApOworCisJc3dpdGNoIChjb25uLT5jY19wcm90bykgeworCQljYXNlIElQUFJPVE9fVENQOgorCQkJQ0hFQ0tfRkNUKGZkX3RjcF9saXN0ZW4oY29ubi0+Y2Nfc29ja2V0KSk7CisJCQlicmVhazsKKworI2lmbmRlZiBESVNBQkxFX1NDVFAKKwkJY2FzZSBJUFBST1RPX1NDVFA6CisJCQlDSEVDS19GQ1QoZmRfc2N0cF9saXN0ZW4oY29ubi0+Y2Nfc29ja2V0KSk7CisJCQlicmVhazsKKyNlbmRpZiAvKiBESVNBQkxFX1NDVFAgKi8KKworCQlkZWZhdWx0OgorCQkJQ0hFQ0tfUEFSQU1TKDApOworCX0KKworCXJldHVybiAwOworfQorCisvKiBBY2NlcHQgYSBjbGllbnQgKGJsb2NraW5nIHVudGlsIGEgbmV3IGNsaWVudCBjb25uZWN0cykgLS0gY2FuY2VsYWJsZSAqLworc3RydWN0IGNueGN0eCAqIGZkX2NueF9zZXJ2X2FjY2VwdChzdHJ1Y3QgY254Y3R4ICogc2VydikKK3sKKwlzdHJ1Y3QgY254Y3R4ICogY2xpID0gTlVMTDsKKwlzU1Mgc3M7CisJc29ja2xlbl90IHNzX2xlbiA9IHNpemVvZihzcyk7CisJaW50IGNsaV9zb2NrID0gMDsKKworCVRSQUNFX0VOVFJZKCIlcCIsIHNlcnYpOworCUNIRUNLX1BBUkFNU19ETyhzZXJ2LCByZXR1cm4gTlVMTCk7CisJCisJLyogQWNjZXB0IHRoZSBuZXcgY29ubmVjdGlvbiAtLSB0aGlzIGlzIGJsb2NraW5nIHVudGlsIG5ldyBjbGllbnQgZW50ZXJzIG9yIHVudGlsIGNhbmNlbGxhdGlvbiAqLworCUNIRUNLX1NZU19ETyggY2xpX3NvY2sgPSBhY2NlcHQoc2Vydi0+Y2Nfc29ja2V0LCAoc1NBICopJnNzLCAmc3NfbGVuKSwgcmV0dXJuIE5VTEwgKTsKKwkKKwlDSEVDS19NQUxMT0NfRE8oIGNsaSA9IGZkX2NueF9pbml0KDEpLCB7IHNodXRkb3duKGNsaV9zb2NrLCBTSFVUX1JEV1IpOyBjbG9zZShjbGlfc29jayk7IHJldHVybiBOVUxMOyB9ICk7CisJY2xpLT5jY19zb2NrZXQgPSBjbGlfc29jazsKKwljbGktPmNjX2ZhbWlseSA9IHNlcnYtPmNjX2ZhbWlseTsKKwljbGktPmNjX3Byb3RvID0gc2Vydi0+Y2NfcHJvdG87CisJCisJLyogU2V0IHRoZSB0aW1lb3V0ICovCisJZmRfY254X3Nfc2V0dG8oY2xpLT5jY19zb2NrZXQpOworCQorCS8qIEdlbmVyYXRlIHRoZSBuYW1lIGZvciB0aGUgY29ubmVjdGlvbiBvYmplY3QgKi8KKwl7CisJCWNoYXIgYWRkcmJ1ZltJTkVUNl9BRERSU1RSTEVOXTsKKwkJY2hhciBwb3J0YnVmWzEwXTsKKwkJaW50ICByYzsKKwkJCisJCXJjID0gZ2V0bmFtZWluZm8oKHNTQSAqKSZzcywgc3NfbGVuLCBhZGRyYnVmLCBzaXplb2YoYWRkcmJ1ZiksIHBvcnRidWYsIHNpemVvZihwb3J0YnVmKSwgTklfTlVNRVJJQ0hPU1QgfCBOSV9OVU1FUklDU0VSVik7CisJCWlmIChyYykgeworCQkJc25wcmludGYoYWRkcmJ1Ziwgc2l6ZW9mKGFkZHJidWYpLCAiW2Vycjolc10iLCBnYWlfc3RyZXJyb3IocmMpKTsKKwkJCXBvcnRidWZbMF0gPSAnXDAnOworCQl9CisJCQorCQkvKiBOdW1lcmljIHZhbHVlcyBmb3IgZGVidWcuLi4gKi8KKwkJc25wcmludGYoY2xpLT5jY19pZCwgc2l6ZW9mKGNsaS0+Y2NfaWQpLCBDQ19JRF9IRFIgIiVzIGZyb20gWyVzXTolcyAoJWQ8LSVkKSIsIAorCQkJCUlQUFJPVE9fTkFNRShjbGktPmNjX3Byb3RvKSwgYWRkcmJ1ZiwgcG9ydGJ1Ziwgc2Vydi0+Y2Nfc29ja2V0LCBjbGktPmNjX3NvY2tldCk7CisJCQorCQkKKwkJLyogLi4uTmFtZSBmb3IgbG9nIG1lc3NhZ2VzICovCisJCXJjID0gZ2V0bmFtZWluZm8oKHNTQSAqKSZzcywgc3NfbGVuLCBjbGktPmNjX3JlbWlkLCBzaXplb2YoY2xpLT5jY19yZW1pZCksIE5VTEwsIDAsIDApOworCQlpZiAocmMpCisJCQlzbnByaW50ZihjbGktPmNjX3JlbWlkLCBzaXplb2YoY2xpLT5jY19yZW1pZCksICJbZXJyOiVzXSIsIGdhaV9zdHJlcnJvcihyYykpOworCX0KKwkKKwlMT0dfRCgiSW5jb21pbmcgY29ubmVjdGlvbjogJyVzJyA8LSAnJXMnICAgeyVzfSIsIGZkX2NueF9nZXRpZChzZXJ2KSwgY2xpLT5jY19yZW1pZCwgY2xpLT5jY19pZCk7CisKKyNpZm5kZWYgRElTQUJMRV9TQ1RQCisJLyogU0NUUC1zcGVjaWZpYyBoYW5kbGluZ3MgKi8KKwlpZiAoY2xpLT5jY19wcm90byA9PSBJUFBST1RPX1NDVFApIHsKKwkJLyogUmV0cmlldmUgdGhlIG51bWJlciBvZiBzdHJlYW1zICovCisJCUNIRUNLX0ZDVF9ETyggZmRfc2N0cF9nZXRfc3RyX2luZm8oIGNsaS0+Y2Nfc29ja2V0LCAmY2xpLT5jY19zY3RwX3BhcmEuc3RyX2luLCAmY2xpLT5jY19zY3RwX3BhcmEuc3RyX291dCwgTlVMTCApLCB7ZmRfY254X2Rlc3Ryb3koY2xpKTsgcmV0dXJuIE5VTEw7fSApOworCQlpZiAoY2xpLT5jY19zY3RwX3BhcmEuc3RyX291dCA8IGNsaS0+Y2Nfc2N0cF9wYXJhLnN0cl9pbikKKwkJCWNsaS0+Y2Nfc2N0cF9wYXJhLnBhaXJzID0gY2xpLT5jY19zY3RwX3BhcmEuc3RyX291dDsKKwkJZWxzZQorCQkJY2xpLT5jY19zY3RwX3BhcmEucGFpcnMgPSBjbGktPmNjX3NjdHBfcGFyYS5zdHJfaW47CisJCQorCQlMT0dfQSggIiVzIDogY2xpZW50ICclcycgKFNDVFA6JWQsICVkLyVkIHN0cmVhbXMpIiwgZmRfY254X2dldGlkKHNlcnYpLCBmZF9jbnhfZ2V0aWQoY2xpKSwgY2xpLT5jY19zb2NrZXQsIGNsaS0+Y2Nfc2N0cF9wYXJhLnN0cl9pbiwgY2xpLT5jY19zY3RwX3BhcmEuc3RyX291dCk7CisJfQorI2VuZGlmIC8qIERJU0FCTEVfU0NUUCAqLworCisJcmV0dXJuIGNsaTsKK30KKworLyogQ2xpZW50IHNpZGU6IGNvbm5lY3QgdG8gYSByZW1vdGUgc2VydmVyIC0tIGNhbmNlbGFibGUgKi8KK3N0cnVjdCBjbnhjdHggKiBmZF9jbnhfY2xpX2Nvbm5lY3RfdGNwKHNTQSAqIHNhIC8qIGNvbnRhaW5zIHRoZSBwb3J0IGFscmVhZHkgKi8sIHNvY2tsZW5fdCBhZGRybGVuKQoreworCWludCBzb2NrID0gMDsKKwlzdHJ1Y3QgY254Y3R4ICogY254ID0gTlVMTDsKKwljaGFyIHNhX2J1ZltzU0FfRFVNUF9TVFJMRU5dOworCQorCVRSQUNFX0VOVFJZKCIlcCAlZCIsIHNhLCBhZGRybGVuKTsKKwlDSEVDS19QQVJBTVNfRE8oIHNhICYmIGFkZHJsZW4sIHJldHVybiBOVUxMICk7CisJCisJZmRfc2Ffc2R1bXBfbnVtZXJpYyhzYV9idWYsIHNhKTsKKwkKKwlMT0dfRCgiQ29ubmVjdGluZyB0byBUQ1AgJXMuLi4iLCBzYV9idWYpOworCQorCS8qIENyZWF0ZSB0aGUgc29ja2V0IGFuZCBjb25uZWN0LCB3aGljaCBjYW4gdGFrZSBzb21lIHRpbWUgYW5kL29yIGZhaWwgKi8KKwl7CisJCWludCByZXQgPSBmZF90Y3BfY2xpZW50KCAmc29jaywgc2EsIGFkZHJsZW4gKTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlMT0dfRCgiVENQIGNvbm5lY3Rpb24gdG8gJXMgZmFpbGVkOiAlcyIsIHNhX2J1Ziwgc3RyZXJyb3IocmV0KSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKwkKKwkvKiBPbmNlIHRoZSBzb2NrZXQgaXMgY3JlYXRlZCBzdWNjZXNzZnVseSwgcHJlcGFyZSB0aGUgcmVtYWluaW5nIG9mIHRoZSBjbnggKi8KKwlDSEVDS19NQUxMT0NfRE8oIGNueCA9IGZkX2NueF9pbml0KDEpLCB7IHNodXRkb3duKHNvY2ssIFNIVVRfUkRXUik7IGNsb3NlKHNvY2spOyByZXR1cm4gTlVMTDsgfSApOworCQorCWNueC0+Y2Nfc29ja2V0ID0gc29jazsKKwljbngtPmNjX2ZhbWlseSA9IHNhLT5zYV9mYW1pbHk7CisJY254LT5jY19wcm90byAgPSBJUFBST1RPX1RDUDsKKwkKKwkvKiBTZXQgdGhlIHRpbWVvdXQgKi8KKwlmZF9jbnhfc19zZXR0byhjbngtPmNjX3NvY2tldCk7CisJCisJLyogR2VuZXJhdGUgdGhlIG5hbWVzIGZvciB0aGUgb2JqZWN0ICovCisJeworCQlpbnQgIHJjOworCQkKKwkJc25wcmludGYoY254LT5jY19pZCwgc2l6ZW9mKGNueC0+Y2NfaWQpLCBDQ19JRF9IRFIgIlRDUCwjJWQtPiVzIiwgY254LT5jY19zb2NrZXQsIHNhX2J1Zik7CisJCQorCQkvKiAuLi5OYW1lIGZvciBsb2cgbWVzc2FnZXMgKi8KKwkJcmMgPSBnZXRuYW1laW5mbyhzYSwgYWRkcmxlbiwgY254LT5jY19yZW1pZCwgc2l6ZW9mKGNueC0+Y2NfcmVtaWQpLCBOVUxMLCAwLCAwKTsKKwkJaWYgKHJjKQorCQkJc25wcmludGYoY254LT5jY19yZW1pZCwgc2l6ZW9mKGNueC0+Y2NfcmVtaWQpLCAiW2Vycjolc10iLCBnYWlfc3RyZXJyb3IocmMpKTsKKwl9CisJCisJTE9HX0EoIlRDUCBjb25uZWN0aW9uIHRvICVzIHN1Y2NlZWQgKHNvY2tldDolZCkuIiwgc2FfYnVmLCBzb2NrKTsKKwkKKwlyZXR1cm4gY254OworfQorCisvKiBTYW1lIGZvciBTQ1RQLCBhY2NlcHRzIGEgbGlzdCBvZiByZW1vdGUgYWRkcmVzc2VzIHRvIGNvbm5lY3QgdG8gKHNlZSBzY3RwX2Nvbm5lY3R4IGZvciBob3cgdGhleSBhcmUgdXNlZCkgKi8KK3N0cnVjdCBjbnhjdHggKiBmZF9jbnhfY2xpX2Nvbm5lY3Rfc2N0cChpbnQgbm9faXA2LCB1aW50MTZfdCBwb3J0LCBzdHJ1Y3QgZmRfbGlzdCAqIGxpc3QpCit7CisjaWZkZWYgRElTQUJMRV9TQ1RQCisJVFJBQ0VfREVCVUcoSU5GTywgIlRoaXMgZnVuY3Rpb24gc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCB3aGVuIFNDVFAgaXMgZGlzYWJsZWQuLi4iKTsKKwlBU1NFUlQoMCk7CisJQ0hFQ0tfRkNUX0RPKCBFTk9UU1VQLCApOworCXJldHVybiBOVUxMOworI2Vsc2UgLyogRElTQUJMRV9TQ1RQICovCisJaW50IHNvY2sgPSAwOworCXN0cnVjdCBjbnhjdHggKiBjbnggPSBOVUxMOworCWNoYXIgc2FfYnVmW3NTQV9EVU1QX1NUUkxFTl07CisJc1NTIHByaW1hcnk7CisJCisJVFJBQ0VfRU5UUlkoIiVwIiwgbGlzdCk7CisJQ0hFQ0tfUEFSQU1TX0RPKCBsaXN0ICYmICFGRF9JU19MSVNUX0VNUFRZKGxpc3QpLCByZXR1cm4gTlVMTCApOworCQorCWZkX3NhX3NkdW1wX251bWVyaWMoc2FfYnVmLCAmKChzdHJ1Y3QgZmRfZW5kcG9pbnQgKikobGlzdC0+bmV4dCkpLT5zYSk7CisJCisJTE9HX0QoIkNvbm5lY3RpbmcgdG8gU0NUUCAlczolaHUuLi4iLCBzYV9idWYsIHBvcnQpOworCQorCXsKKwkJaW50IHJldCA9IGZkX3NjdHBfY2xpZW50KCAmc29jaywgbm9faXA2LCBwb3J0LCBsaXN0ICk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJTE9HX0QoIlNDVFAgY29ubmVjdGlvbiB0byBbJXMsLi4uXSBmYWlsZWQ6ICVzIiwgc2FfYnVmLCBzdHJlcnJvcihyZXQpKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorCQorCS8qIE9uY2UgdGhlIHNvY2tldCBpcyBjcmVhdGVkIHN1Y2Nlc3NmdWx5LCBwcmVwYXJlIHRoZSByZW1haW5pbmcgb2YgdGhlIGNueCAqLworCUNIRUNLX01BTExPQ19ETyggY254ID0gZmRfY254X2luaXQoMSksIHsgc2h1dGRvd24oc29jaywgU0hVVF9SRFdSKTsgY2xvc2Uoc29jayk7IHJldHVybiBOVUxMOyB9ICk7CisJCisJY254LT5jY19zb2NrZXQgPSBzb2NrOworCWNueC0+Y2NfZmFtaWx5ID0gbm9faXA2ID8gQUZfSU5FVCA6IEFGX0lORVQ2OworCWNueC0+Y2NfcHJvdG8gID0gSVBQUk9UT19TQ1RQOworCQorCS8qIFNldCB0aGUgdGltZW91dCAqLworCWZkX2NueF9zX3NldHRvKGNueC0+Y2Nfc29ja2V0KTsKKwkKKwkvKiBSZXRyaWV2ZSB0aGUgbnVtYmVyIG9mIHN0cmVhbXMgYW5kIHByaW1hcnkgYWRkcmVzcyAqLworCUNIRUNLX0ZDVF9ETyggZmRfc2N0cF9nZXRfc3RyX2luZm8oIHNvY2ssICZjbngtPmNjX3NjdHBfcGFyYS5zdHJfaW4sICZjbngtPmNjX3NjdHBfcGFyYS5zdHJfb3V0LCAmcHJpbWFyeSApLCBnb3RvIGVycm9yICk7CisJaWYgKGNueC0+Y2Nfc2N0cF9wYXJhLnN0cl9vdXQgPCBjbngtPmNjX3NjdHBfcGFyYS5zdHJfaW4pCisJCWNueC0+Y2Nfc2N0cF9wYXJhLnBhaXJzID0gY254LT5jY19zY3RwX3BhcmEuc3RyX291dDsKKwllbHNlCisJCWNueC0+Y2Nfc2N0cF9wYXJhLnBhaXJzID0gY254LT5jY19zY3RwX3BhcmEuc3RyX2luOworCQorCWZkX3NhX3NkdW1wX251bWVyaWMoc2FfYnVmLCAoc1NBICopJnByaW1hcnkpOworCQorCS8qIEdlbmVyYXRlIHRoZSBuYW1lcyBmb3IgdGhlIG9iamVjdCAqLworCXsKKwkJaW50ICByYzsKKwkJCisJCXNucHJpbnRmKGNueC0+Y2NfaWQsIHNpemVvZihjbngtPmNjX2lkKSwgQ0NfSURfSERSICJTQ1RQLCMlZC0+JXMiLCBjbngtPmNjX3NvY2tldCwgc2FfYnVmKTsKKwkJCisJCS8qIC4uLk5hbWUgZm9yIGxvZyBtZXNzYWdlcyAqLworCQlyYyA9IGdldG5hbWVpbmZvKChzU0EgKikmcHJpbWFyeSwgc1NBbGVuKCZwcmltYXJ5KSwgY254LT5jY19yZW1pZCwgc2l6ZW9mKGNueC0+Y2NfcmVtaWQpLCBOVUxMLCAwLCAwKTsKKwkJaWYgKHJjKQorCQkJc25wcmludGYoY254LT5jY19yZW1pZCwgc2l6ZW9mKGNueC0+Y2NfcmVtaWQpLCAiW2Vycjolc10iLCBnYWlfc3RyZXJyb3IocmMpKTsKKwl9CisJCisJTE9HX0EoIlNDVFAgY29ubmVjdGlvbiB0byAlcyBzdWNjZWVkIChzb2NrZXQ6JWQsICVkLyVkIHN0cmVhbXMpLiIsIHNhX2J1Ziwgc29jaywgY254LT5jY19zY3RwX3BhcmEuc3RyX2luLCBjbngtPmNjX3NjdHBfcGFyYS5zdHJfb3V0KTsKKwkKKwlyZXR1cm4gY254OworCitlcnJvcjoKKwlmZF9jbnhfZGVzdHJveShjbngpOworCXJldHVybiBOVUxMOworI2VuZGlmIC8qIERJU0FCTEVfU0NUUCAqLworfQorCisvKiBSZXR1cm4gYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgY29ubmVjdGlvbiwgZm9yIGRlYnVnICovCitjaGFyICogZmRfY254X2dldGlkKHN0cnVjdCBjbnhjdHggKiBjb25uKQoreworCUNIRUNLX1BBUkFNU19ETyggY29ubiwgcmV0dXJuICIiICk7CisJcmV0dXJuIGNvbm4tPmNjX2lkOworfQorCisvKiBSZXR1cm4gdGhlIHByb3RvY29sIG9mIGEgY29ubmVjdGlvbiAqLworaW50IGZkX2NueF9nZXRwcm90byhzdHJ1Y3QgY254Y3R4ICogY29ubikKK3sKKwlDSEVDS19QQVJBTVNfRE8oIGNvbm4sIHJldHVybiAwICk7CisJcmV0dXJuIGNvbm4tPmNjX3Byb3RvOworfQorCisvKiBTZXQgdGhlIGhvc3RuYW1lIHRvIGNoZWNrIGR1cmluZyBoYW5kc2hha2UgKi8KK3ZvaWQgZmRfY254X3NldGhvc3RuYW1lKHN0cnVjdCBjbnhjdHggKiBjb25uLCBEaWFtSWRfdCBobikKK3sKKwlDSEVDS19QQVJBTVNfRE8oIGNvbm4sIHJldHVybiApOworCWNvbm4tPmNjX3Rsc19wYXJhLmNuID0gaG47Cit9CisKKy8qIFdlIHNoYXJlIGEgbG9jayB3aXRoIG1hbnkgdGhyZWFkcyBidXQgd2UgaG9sZCBpdCBvbmx5IHZlcnkgc2hvcnQgdGltZSBzbyBpdCBpcyBPSyAqLworc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBzdGF0ZV9sb2NrID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKK3VpbnQzMl90IGZkX2NueF9nZXRzdGF0ZShzdHJ1Y3QgY254Y3R4ICogY29ubikKK3sKKwl1aW50MzJfdCBzdDsKKwlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9tdXRleF9sb2NrKCZzdGF0ZV9sb2NrKSwgeyBBU1NFUlQoMCk7IH0gKTsKKwlzdCA9IGNvbm4tPmNjX3N0YXRlOworCUNIRUNLX1BPU0lYX0RPKCBwdGhyZWFkX211dGV4X3VubG9jaygmc3RhdGVfbG9jayksIHsgQVNTRVJUKDApOyB9ICk7CisJcmV0dXJuIHN0OworfQoraW50ICBmZF9jbnhfdGVzdHN0YXRlKHN0cnVjdCBjbnhjdHggKiBjb25uLCB1aW50MzJfdCBmbGFnKQoreworCXVpbnQzMl90IHN0OworCUNIRUNLX1BPU0lYX0RPKCBwdGhyZWFkX211dGV4X2xvY2soJnN0YXRlX2xvY2spLCB7IEFTU0VSVCgwKTsgfSApOworCXN0ID0gY29ubi0+Y2Nfc3RhdGU7CisJQ0hFQ0tfUE9TSVhfRE8oIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZzdGF0ZV9sb2NrKSwgeyBBU1NFUlQoMCk7IH0gKTsKKwlyZXR1cm4gc3QgJiBmbGFnOworfQordm9pZCBmZF9jbnhfdXBkYXRlX2lkKHN0cnVjdCBjbnhjdHggKiBjb25uKSB7CisJaWYgKGNvbm4tPmNjX3N0YXRlICYgQ0NfU1RBVFVTX0NMT1NJTkcpCisJCWNvbm4tPmNjX2lkWzFdID0gJ0MnOworCWVsc2UKKwkJY29ubi0+Y2NfaWRbMV0gPSAnLSc7CisJCisJaWYgKGNvbm4tPmNjX3N0YXRlICYgQ0NfU1RBVFVTX0VSUk9SKQorCQljb25uLT5jY19pZFsyXSA9ICdFJzsKKwllbHNlCisJCWNvbm4tPmNjX2lkWzJdID0gJy0nOworCQorCWlmIChjb25uLT5jY19zdGF0ZSAmIENDX1NUQVRVU19TSUdOQUxFRCkKKwkJY29ubi0+Y2NfaWRbM10gPSAnUyc7CisJZWxzZQorCQljb25uLT5jY19pZFszXSA9ICctJzsKKwkKKwlpZiAoY29ubi0+Y2Nfc3RhdGUgJiBDQ19TVEFUVVNfVExTKQorCQljb25uLT5jY19pZFs0XSA9ICdUJzsKKwllbHNlCisJCWNvbm4tPmNjX2lkWzRdID0gJy0nOworfQordm9pZCBmZF9jbnhfYWRkc3RhdGUoc3RydWN0IGNueGN0eCAqIGNvbm4sIHVpbnQzMl90IG9yc3RhdGUpCit7CisJQ0hFQ0tfUE9TSVhfRE8oIHB0aHJlYWRfbXV0ZXhfbG9jaygmc3RhdGVfbG9jayksIHsgQVNTRVJUKDApOyB9ICk7CisJY29ubi0+Y2Nfc3RhdGUgfD0gb3JzdGF0ZTsKKwlmZF9jbnhfdXBkYXRlX2lkKGNvbm4pOworCUNIRUNLX1BPU0lYX0RPKCBwdGhyZWFkX211dGV4X3VubG9jaygmc3RhdGVfbG9jayksIHsgQVNTRVJUKDApOyB9ICk7Cit9Cit2b2lkIGZkX2NueF9zZXRzdGF0ZShzdHJ1Y3QgY254Y3R4ICogY29ubiwgdWludDMyX3QgYWJzdGF0ZSkKK3sKKwlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9tdXRleF9sb2NrKCZzdGF0ZV9sb2NrKSwgeyBBU1NFUlQoMCk7IH0gKTsKKwljb25uLT5jY19zdGF0ZSA9IGFic3RhdGU7CisJZmRfY254X3VwZGF0ZV9pZChjb25uKTsKKwlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9tdXRleF91bmxvY2soJnN0YXRlX2xvY2spLCB7IEFTU0VSVCgwKTsgfSApOworfQorCisKKy8qIFJldHVybiB0aGUgVExTIHN0YXRlIG9mIGEgY29ubmVjdGlvbiAqLworaW50IGZkX2NueF9nZXRUTFMoc3RydWN0IGNueGN0eCAqIGNvbm4pCit7CisJQ0hFQ0tfUEFSQU1TX0RPKCBjb25uLCByZXR1cm4gMCApOworCXJldHVybiBmZF9jbnhfdGVzdHN0YXRlKGNvbm4sIENDX1NUQVRVU19UTFMpOworfQorCisvKiBNYXJrIHRoZSBjb25uZWN0aW9uIHRvIHRlbGwgaWYgT09PIGRlbGl2ZXJ5IGlzIHBlcm1pdHRlZCAob25seSBmb3IgU0NUUCkgKi8KK2ludCBmZF9jbnhfdW5vcmRlcmVkX2RlbGl2ZXJ5KHN0cnVjdCBjbnhjdHggKiBjb25uLCBpbnQgaXNfYWxsb3dlZCkKK3sKKwlDSEVDS19QQVJBTVMoIGNvbm4gKTsKKwljb25uLT5jY19zY3RwX3BhcmEudW5vcmRlcmVkID0gaXNfYWxsb3dlZDsKKwlyZXR1cm4gMDsKK30KKworLyogUmV0dXJuIHRydWUgaWYgdGhlIGNvbm5lY3Rpb24gc3VwcG9ydHMgdW5vcmRlcmVkIGRlbGl2ZXJ5IG9mIG1lc3NhZ2VzICovCitpbnQgZmRfY254X2lzX3Vub3JkZXJlZF9kZWxpdmVyeV9zdXBwb3J0ZWQoc3RydWN0IGNueGN0eCAqIGNvbm4pCit7CisJQ0hFQ0tfUEFSQU1TX0RPKCBjb25uLCByZXR1cm4gMCApOworCSNpZm5kZWYgRElTQUJMRV9TQ1RQCisJaWYgKGNvbm4tPmNjX3Byb3RvID09IElQUFJPVE9fU0NUUCkKKwkJcmV0dXJuIChjb25uLT5jY19zY3RwX3BhcmEuc3RyX291dCA+IDEpOworCSNlbmRpZiAvKiBESVNBQkxFX1NDVFAgKi8KKwlyZXR1cm4gMDsKK30KKworCisvKiBHZXQgdGhlIGxpc3Qgb2YgZW5kcG9pbnRzIChJUCBhZGRyZXNzZXMpIG9mIHRoZSBsb2NhbCBhbmQgcmVtb3RlIHBlZXJzIG9uIHRoaXMgY29ubmVjdGlvbiAqLworaW50IGZkX2NueF9nZXRyZW1vdGVlcHMoc3RydWN0IGNueGN0eCAqIGNvbm4sIHN0cnVjdCBmZF9saXN0ICogZXBzKQoreworCVRSQUNFX0VOVFJZKCIlcCAlcCIsIGNvbm4sIGVwcyk7CisJQ0hFQ0tfUEFSQU1TKGNvbm4gJiYgZXBzKTsKKwkKKwkvKiBDaGVjayB3ZSBoYXZlIGEgZnVsbCBjb25uZWN0aW9uIG9iamVjdCwgbm90IGEgbGlzdGVuaW5nIHNvY2tldCAod2l0aCBubyByZW1vdGUpICovCisJQ0hFQ0tfUEFSQU1TKCBjb25uLT5jY19pbmNvbWluZyApOworCisJLyogUmV0cmlldmUgdGhlIHBlZXIgZW5kcG9pbnQocykgb2YgdGhlIGNvbm5lY3Rpb24gKi8KKwlzd2l0Y2ggKGNvbm4tPmNjX3Byb3RvKSB7CisJCWNhc2UgSVBQUk9UT19UQ1A6IHsKKwkJCXNTUyBzczsKKwkJCXNvY2tsZW5fdCBzbDsKKwkJCUNIRUNLX0ZDVChmZF90Y3BfZ2V0X3JlbW90ZV9lcChjb25uLT5jY19zb2NrZXQsICZzcywgJnNsKSk7CisJCQlDSEVDS19GQ1QoZmRfZXBfYWRkX21lcmdlKCBlcHMsIChzU0EgKikmc3MsIHNsLCBFUF9GTF9MTCB8IEVQX0ZMX1BSSU1BUlkgKSk7CisJCX0KKwkJYnJlYWs7CisKKwkJI2lmbmRlZiBESVNBQkxFX1NDVFAKKwkJY2FzZSBJUFBST1RPX1NDVFA6IHsKKwkJCUNIRUNLX0ZDVChmZF9zY3RwX2dldF9yZW1vdGVfZXAoY29ubi0+Y2Nfc29ja2V0LCBlcHMpKTsKKwkJfQorCQlicmVhazsKKwkJI2VuZGlmIC8qIERJU0FCTEVfU0NUUCAqLworCisJCWRlZmF1bHQ6CisJCQlDSEVDS19QQVJBTVMoMCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIEdldCBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSByZW1vdGUgcGVlciBhZGRyZXNzIChpcCBhZGRyZXNzIG9yIGZxZG4pICovCitjaGFyICogZmRfY254X2dldHJlbW90ZWlkKHN0cnVjdCBjbnhjdHggKiBjb25uKQoreworCUNIRUNLX1BBUkFNU19ETyggY29ubiwgcmV0dXJuICIiICk7CisJcmV0dXJuIGNvbm4tPmNjX3JlbWlkOworfQorCitzdGF0aWMgaW50IGZkX2NueF9tYXlfZHRscyhzdHJ1Y3QgY254Y3R4ICogY29ubik7CisKKy8qIEdldCBhIHNob3J0IHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGNvbm5lY3Rpb24gKi8KK2ludCBmZF9jbnhfcHJvdG9faW5mbyhzdHJ1Y3QgY254Y3R4ICogY29ubiwgY2hhciAqIGJ1Ziwgc2l6ZV90IGxlbikgCit7CisJQ0hFQ0tfUEFSQU1TKCBjb25uICk7CisJCisJaWYgKGZkX2NueF90ZXN0c3RhdGUoY29ubiwgQ0NfU1RBVFVTX1RMUykpIHsKKwkJc25wcmludGYoYnVmLCBsZW4sICIlcywlcyxzb2MjJWQiLCBJUFBST1RPX05BTUUoY29ubi0+Y2NfcHJvdG8pLCBmZF9jbnhfbWF5X2R0bHMoY29ubikgPyAiRFRMUyIgOiAiVExTIiwgY29ubi0+Y2Nfc29ja2V0KTsKKwl9IGVsc2UgeworCQlzbnByaW50ZihidWYsIGxlbiwgIiVzLHNvYyMlZCIsIElQUFJPVE9fTkFNRShjb25uLT5jY19wcm90byksIGNvbm4tPmNjX3NvY2tldCk7CisJfQorCQorCXJldHVybiAwOworfQorCisvKiBSZXRyaWV2ZSBhIGxpc3Qgb2YgYWxsIElQIGFkZHJlc3NlcyBvZiB0aGUgbG9jYWwgc3lzdGVtIGZyb20gdGhlIGtlcm5lbCwgdXNpbmcgZ2V0aWZhZGRycyAqLworaW50IGZkX2NueF9nZXRfbG9jYWxfZXBzKHN0cnVjdCBmZF9saXN0ICogbGlzdCkKK3sKKwlzdHJ1Y3QgaWZhZGRycyAqaWZsaXN0LCAqY3VyOworCQorCUNIRUNLX1NZUyhnZXRpZmFkZHJzKCZpZmxpc3QpKTsKKwkKKwlmb3IgKGN1ciA9IGlmbGlzdDsgY3VyICE9IE5VTEw7IGN1ciA9IGN1ci0+aWZhX25leHQpIHsKKwkJaWYgKGN1ci0+aWZhX2ZsYWdzICYgSUZGX0xPT1BCQUNLKQorCQkJY29udGludWU7CisJCQorCQlpZiAoY3VyLT5pZmFfYWRkciA9PSBOVUxMKSAvKiBtYXkgaGFwcGVuIHdpdGggcHBwIGludGVyZmFjZXMgKi8KKwkJCWNvbnRpbnVlOworCQkKKwkJaWYgKGZkX2dfY29uZmlnLT5jbmZfZmxhZ3Mubm9faXA0ICYmIChjdXItPmlmYV9hZGRyLT5zYV9mYW1pbHkgPT0gQUZfSU5FVCkpCisJCQljb250aW51ZTsKKwkJCisJCWlmIChmZF9nX2NvbmZpZy0+Y25mX2ZsYWdzLm5vX2lwNiAmJiAoY3VyLT5pZmFfYWRkci0+c2FfZmFtaWx5ID09IEFGX0lORVQ2KSkKKwkJCWNvbnRpbnVlOworCQkKKwkJQ0hFQ0tfRkNUKGZkX2VwX2FkZF9tZXJnZSggbGlzdCwgY3VyLT5pZmFfYWRkciwgc1NBbGVuKGN1ci0+aWZhX2FkZHIpLCBFUF9GTF9MTCApKTsKKwl9CisJCisJZnJlZWlmYWRkcnMoaWZsaXN0KTsKKwkKKwlyZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgVXNlIG9mIGEgY29ubmVjdGlvbiBvYmplY3QgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEFuIGVycm9yIG9jY3VycmVkIG9uIHRoZSBzb2NrZXQgKi8KK3ZvaWQgZmRfY254X21hcmtlcnJvcihzdHJ1Y3QgY254Y3R4ICogY29ubikKK3sKKwlUUkFDRV9FTlRSWSgiJXAiLCBjb25uKTsKKwlDSEVDS19QQVJBTVNfRE8oIGNvbm4sIGdvdG8gZmF0YWwgKTsKKwkKKwlUUkFDRV9ERUJVRyhGVUxMLCAiRXJyb3IgZmxhZyBzZXQgZm9yIHNvY2tldCAlZCAoJXMsICVzKSIsIGNvbm4tPmNjX3NvY2tldCwgY29ubi0+Y2NfaWQsIGNvbm4tPmNjX3JlbWlkKTsKKworCS8qIE1hcmsgdGhlIGVycm9yICovCisJZmRfY254X2FkZHN0YXRlKGNvbm4sIENDX1NUQVRVU19FUlJPUik7CisJCisJLyogUmVwb3J0IHRoZSBlcnJvciBpZiBub3QgcmVwb3J0ZWQgeWV0LCBhbmQgbm90IGNsb3NpbmcgKi8KKwlpZiAoIWZkX2NueF90ZXN0c3RhdGUoY29ubiwgQ0NfU1RBVFVTX0NMT1NJTkcgfCBDQ19TVEFUVVNfU0lHTkFMRUQgKSkgIHsKKwkJVFJBQ0VfREVCVUcoRlVMTCwgIlNlbmRpbmcgRkRFVlBfQ05YX0VSUk9SIGV2ZW50Iik7CisJCUNIRUNLX0ZDVF9ETyggZmRfZXZlbnRfc2VuZCggZmRfY254X3RhcmdldF9xdWV1ZShjb25uKSwgRkRFVlBfQ05YX0VSUk9SLCAwLCBOVUxMKSwgZ290byBmYXRhbCk7CisJCWZkX2NueF9hZGRzdGF0ZShjb25uLCBDQ19TVEFUVVNfU0lHTkFMRUQpOworCX0KKwkKKwlyZXR1cm47CitmYXRhbDoKKwkvKiBBbiB1bnJlY292ZXJhYmxlIGVycm9yIG9jY3VycmVkLCBzdG9wIHRoZSBkYWVtb24gKi8KKwlBU1NFUlQoMCk7CisJQ0hFQ0tfRkNUX0RPKGZkX2NvcmVfc2h1dGRvd24oKSwgKTsJCit9CisKKy8qIFNldCB0aGUgdGltZW91dCBvcHRpb24gb24gdGhlIHNvY2tldCAqLwordm9pZCBmZF9jbnhfc19zZXR0byhpbnQgc29jaykgCit7CisJc3RydWN0IHRpbWV2YWwgdHY7CisJCisJLyogU2V0IGEgdGltZW91dCBvbiB0aGUgc29ja2V0IHNvIHRoYXQgaW4gYW55IGNhc2Ugd2UgYXJlIG5vdCBzdHVjayB3YWl0aW5nIGZvciBzb21ldGhpbmcgKi8KKwltZW1zZXQoJnR2LCAwLCBzaXplb2YodHYpKTsKKwl0di50dl91c2VjID0gMTAwMDAwTDsJLyogMTAwbXMsIHRvIHJlYWN0IHF1aWNrbHkgdG8gaGVhZC1vZi10aGUtbGluZSBibG9ja2luZy4gKi8KKwlDSEVDS19TWVNfRE8oIHNldHNvY2tvcHQoc29jaywgU09MX1NPQ0tFVCwgU09fUkNWVElNRU8sICZ0diwgc2l6ZW9mKHR2KSksICApOworCUNIRUNLX1NZU19ETyggc2V0c29ja29wdChzb2NrLCBTT0xfU09DS0VULCBTT19TTkRUSU1FTywgJnR2LCBzaXplb2YodHYpKSwgICk7Cit9CisKKworI2lmZGVmIEdOVVRMU19WRVJTSU9OXzMwMAorLyogVGhlIHB1bGxfdGltZW91dCBmdW5jdGlvbiBmb3IgZ251dGxzICovCitzdGF0aWMgaW50IGZkX2NueF9zX3NlbGVjdCAoc3RydWN0IGNueGN0eCAqIGNvbm4sIHVuc2lnbmVkIGludCBtcykKK3sKKwlmZF9zZXQgcmZkczsKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwkKKwlGRF9aRVJPICgmcmZkcyk7CisJRkRfU0VUIChjb25uLT5jY19zb2NrZXQsICZyZmRzKTsKKwkKKwl0di50dl9zZWMgPSBtcyAvIDEwMDA7CisJdHYudHZfdXNlYyA9IChtcyAqIDEwMDApICUgMTAwMDAwMDsKKwkKKwlyZXR1cm4gc2VsZWN0IChjb25uLT5jY19zb2NrZXQgKyAxLCAmcmZkcywgTlVMTCwgTlVMTCwgJnR2KTsKK30JCQorI2VuZGlmIC8qIEdOVVRMU19WRVJTSU9OXzMwMCAqLworCisvKiBBIHJlY3YtbGlrZSBmdW5jdGlvbiwgdGFraW5nIGEgY254Y3R4IG9iamVjdCBpbnN0ZWFkIG9mIHNvY2tldCBhcyBlbnRyeS4gV2UgdXNlIGl0IHRvIHF1aWNrbHkgcmVhY3QgdG8gdGltZW91dHMgd2l0aG91dCB0cmF2ZXJzaW5nIEdOVVRMUyB3cmFwcGVyIGVhY2ggdGltZSAqLworc3NpemVfdCBmZF9jbnhfc19yZWN2KHN0cnVjdCBjbnhjdHggKiBjb25uLCB2b2lkICpidWZmZXIsIHNpemVfdCBsZW5ndGgpCit7CisJc3NpemVfdCByZXQgPSAwOworCWludCB0aW1lZG91dCA9IDA7CithZ2FpbjoKKwlyZXQgPSByZWN2KGNvbm4tPmNjX3NvY2tldCwgYnVmZmVyLCBsZW5ndGgsIDApOworCS8qIEhhbmRsZSBzcGVjaWFsIGNhc2Ugb2YgdGltZW91dCAvIGludGVycnVwdHMgKi8KKwlpZiAoKHJldCA8IDApICYmICgoZXJybm8gPT0gRUFHQUlOKSB8fCAoZXJybm8gPT0gRUlOVFIpKSkgeworCQlwdGhyZWFkX3Rlc3RjYW5jZWwoKTsKKwkJaWYgKCEgZmRfY254X3Rlc3RzdGF0ZShjb25uLCBDQ19TVEFUVVNfQ0xPU0lORyApKQorCQkJZ290byBhZ2FpbjsgLyogZG9uJ3QgY2FyZSwganVzdCBpZ25vcmUgKi8KKwkJaWYgKCF0aW1lZG91dCkgeworCQkJdGltZWRvdXQgKys7IC8qIGFsbG93IGZvciBvbmUgdGltZW91dCB3aGlsZSBjbG9zaW5nICovCisJCQlnb3RvIGFnYWluOworCQl9CisJfQorCQorCS8qIE1hcmsgdGhlIGVycm9yICovCisJaWYgKHJldCA8PSAwKSB7CisJCUNIRUNLX1NZU19ETyhyZXQsIC8qIGNvbnRpbnVlLCB0aGlzIGlzIG9ubHkgdXNlZCB0byBsb2cgdGhlIGVycm9yIGhlcmUgKi8pOworCQlmZF9jbnhfbWFya2Vycm9yKGNvbm4pOworCX0KKwkKKwlyZXR1cm4gcmV0OworfQorCisvKiBTZW5kICovCitzdGF0aWMgc3NpemVfdCBmZF9jbnhfc19zZW5kdihzdHJ1Y3QgY254Y3R4ICogY29ubiwgY29uc3Qgc3RydWN0IGlvdmVjICogaW92LCBpbnQgaW92Y250KQoreworCXNzaXplX3QgcmV0ID0gMDsKKwlzdHJ1Y3QgdGltZXNwZWMgdHMsIG5vdzsKKwlDSEVDS19TWVNfRE8oICBjbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmdHMpLCByZXR1cm4gLTEgKTsKK2FnYWluOgorCXJldCA9IHdyaXRldihjb25uLT5jY19zb2NrZXQsIGlvdiwgaW92Y250KTsKKwkvKiBIYW5kbGUgc3BlY2lhbCBjYXNlIG9mIHRpbWVvdXQgKi8KKwlpZiAoKHJldCA8IDApICYmICgoZXJybm8gPT0gRUFHQUlOKSB8fCAoZXJybm8gPT0gRUlOVFIpKSkgeworCQlyZXQgPSAtZXJybm87CisJCXB0aHJlYWRfdGVzdGNhbmNlbCgpOworCQkKKwkJLyogQ2hlY2sgaG93IG11Y2ggdGltZSB3ZSB3ZXJlIGJsb2NrZWQgZm9yIHRoaXMgc2VuZGluZy4gKi8KKwkJQ0hFQ0tfU1lTX0RPKCAgY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJm5vdyksIHJldHVybiAtMSApOworCQlpZiAoICgobm93LnR2X3NlYyAtIHRzLnR2X3NlYykgKiAxMDAwICsgKChub3cudHZfbnNlYyAtIHRzLnR2X25zZWMpIC8gMTAwMDAwMEwpKSA+IE1BWF9IT1RMX0JMT0NLSU5HX1RJTUUpIHsKKwkJCUxPR19EKCJVbmFibGUgdG8gc2VuZCBhbnkgZGF0YSBmb3IgJWRtcywgY2xvc2luZyB0aGUgY29ubmVjdGlvbiIsIE1BWF9IT1RMX0JMT0NLSU5HX1RJTUUpOworCQl9IGVsc2UgaWYgKCEgZmRfY254X3Rlc3RzdGF0ZShjb25uLCBDQ19TVEFUVVNfQ0xPU0lORyApKSB7CisJCQlnb3RvIGFnYWluOyAvKiBkb24ndCBjYXJlLCBqdXN0IGlnbm9yZSAqLworCQl9CisJCQorCQkvKiBwcm9wYWdhdGUgdGhlIGVycm9yICovCisJCWVycm5vID0gLXJldDsKKwkJcmV0ID0gLTE7CisJCUNIRUNLX1NZU19ETyhyZXQsIC8qIGNvbnRpbnVlICovKTsKKwl9CisJCisJLyogTWFyayB0aGUgZXJyb3IgKi8KKwlpZiAocmV0IDw9IDApCisJCWZkX2NueF9tYXJrZXJyb3IoY29ubik7CisJCisJcmV0dXJuIHJldDsKK30KKworLyogU2VuZCwgZm9yIG9sZGVyIEdOVVRMUyAqLworI2lmbmRlZiBHTlVUTFNfVkVSU0lPTl8yMTIKK3N0YXRpYyBzc2l6ZV90IGZkX2NueF9zX3NlbmQoc3RydWN0IGNueGN0eCAqIGNvbm4sIGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCkKK3sKKwlzdHJ1Y3QgaW92ZWMgaW92OworCWlvdi5pb3ZfYmFzZSA9ICh2b2lkICopYnVmZmVyOworCWlvdi5pb3ZfbGVuICA9IGxlbmd0aDsKKwlyZXR1cm4gZmRfY254X3Nfc2VuZHYoY29ubiwgJmlvdiwgMSk7Cit9CisjZW5kaWYgLyogR05VVExTX1ZFUlNJT05fMjEyICovCisKKyNkZWZpbmUgQUxJR05PRih0KSAoKGNoYXIgKikoJigoc3RydWN0IHsgY2hhciBjOyB0IF9oOyB9ICopMCktPl9oKSAtIChjaGFyICopMCkgIC8qIENvdWxkIHVzZSBfX2FsaWdub2ZfXyh0KSBvbiBzb21lIHN5c3RlbXMgYnV0IHRoaXMgaXMgbW9yZSBwb3J0YWJsZSBwcm9iYWJseSAqLworI2RlZmluZSBQTURMX1BBRERFRChsZW4pICggKChsZW4pICsgQUxJR05PRihzdHJ1Y3QgZmRfbXNnX3BtZGwpIC0gMSkgJiB+KEFMSUdOT0Yoc3RydWN0IGZkX21zZ19wbWRsKSAtIDEpICkKKworc2l6ZV90IGZkX21zZ19wbWRsX3NpemV3aXRob3ZlcmhlYWQoc2l6ZV90IGRhdGFsZW4pCit7CisJcmV0dXJuIFBNRExfUEFEREVEKGRhdGFsZW4pICsgc2l6ZW9mKHN0cnVjdCBmZF9tc2dfcG1kbCk7Cit9CisKK3N0cnVjdCBmZF9tc2dfcG1kbCAqIGZkX21zZ19wbWRsX2dldF9pbmJ1Zih1aW50OF90ICogYnVmLCBzaXplX3QgZGF0YWxlbikKK3sKKwlyZXR1cm4gKHN0cnVjdCBmZF9tc2dfcG1kbCAqKShidWYgKyBQTURMX1BBRERFRChkYXRhbGVuKSk7Cit9IAorCitzdGF0aWMgaW50IGZkX2NueF9pbml0X21zZ19idWZmZXIodWludDhfdCAqIGJ1ZmZlciwgc2l6ZV90IGV4cGVjdGVkX2xlbiwgc3RydWN0IGZkX21zZ19wbWRsICoqIHBtZGwpCit7CisJKnBtZGwgPSBmZF9tc2dfcG1kbF9nZXRfaW5idWYoYnVmZmVyLCBleHBlY3RlZF9sZW4pOworCWZkX2xpc3RfaW5pdCgmKCpwbWRsKS0+c2VudGluZWwsIE5VTEwpOworCUNIRUNLX1BPU0lYKHB0aHJlYWRfbXV0ZXhfaW5pdCgmKCpwbWRsKS0+bG9jaywgTlVMTCkgKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVpbnQ4X3QgKiBmZF9jbnhfYWxsb2NfbXNnX2J1ZmZlcihzaXplX3QgZXhwZWN0ZWRfbGVuLCBzdHJ1Y3QgZmRfbXNnX3BtZGwgKiogcG1kbCkKK3sKKwl1aW50OF90ICogcmV0ID0gTlVMTDsKKwkKKwlDSEVDS19NQUxMT0NfRE8oICByZXQgPSBtYWxsb2MoIGZkX21zZ19wbWRsX3NpemV3aXRob3ZlcmhlYWQoZXhwZWN0ZWRfbGVuKSApLCByZXR1cm4gTlVMTCApOworCUNIRUNLX0ZDVF9ETyggZmRfY254X2luaXRfbXNnX2J1ZmZlcihyZXQsIGV4cGVjdGVkX2xlbiwgcG1kbCksIHtmcmVlKHJldCk7IHJldHVybiBOVUxMO30gKTsKKwlyZXR1cm4gcmV0OworfQorCisjaWZuZGVmIERJU0FCTEVfU0NUUCAvKiBXRSB1c2UgdGhpcyBmdW5jdGlvbiBvbmx5IGluIFNDVFAgY29kZSAqLworc3RhdGljIHVpbnQ4X3QgKiBmZF9jbnhfcmVhbGxvY19tc2dfYnVmZmVyKHVpbnQ4X3QgKiBidWZmZXIsIHNpemVfdCBleHBlY3RlZF9sZW4sIHN0cnVjdCBmZF9tc2dfcG1kbCAqKiBwbWRsKQoreworCXVpbnQ4X3QgKiByZXQgPSBOVUxMOworCQorCUNIRUNLX01BTExPQ19ETyggIHJldCA9IHJlYWxsb2MoIGJ1ZmZlciwgZmRfbXNnX3BtZGxfc2l6ZXdpdGhvdmVyaGVhZChleHBlY3RlZF9sZW4pICksIHJldHVybiBOVUxMICk7CisJQ0hFQ0tfRkNUX0RPKCBmZF9jbnhfaW5pdF9tc2dfYnVmZmVyKHJldCwgZXhwZWN0ZWRfbGVuLCBwbWRsKSwge2ZyZWUocmV0KTsgcmV0dXJuIE5VTEw7fSApOworCXJldHVybiByZXQ7Cit9CisjZW5kaWYgLyogRElTQUJMRV9TQ1RQICovCisKK3N0YXRpYyB2b2lkIGZyZWVfcmN2ZGF0YSh2b2lkICogYXJnKSAKK3sKKwlzdHJ1Y3QgZmRfY254X3JjdmRhdGEgKiBkYXRhID0gYXJnOworCXN0cnVjdCBmZF9tc2dfcG1kbCAqIHBtZGwgPSBmZF9tc2dfcG1kbF9nZXRfaW5idWYoZGF0YS0+YnVmZmVyLCBkYXRhLT5sZW5ndGgpOworCSh2b2lkKSBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJnBtZGwtPmxvY2spOworCWZyZWUoZGF0YS0+YnVmZmVyKTsKK30KKworLyogUmVjZWl2ZXIgdGhyZWFkIChUQ1AgJiBub1RMUykgOiBpbmNvbWluZyBtZXNzYWdlIGlzIGRpcmVjdGx5IHNhdmVkIGludG8gdGhlIHRhcmdldCBxdWV1ZSAqLworc3RhdGljIHZvaWQgKiByY3Z0aHJfbm90bHNfdGNwKHZvaWQgKiBhcmcpCit7CisJc3RydWN0IGNueGN0eCAqIGNvbm4gPSBhcmc7CisJCisJVFJBQ0VfRU5UUlkoIiVwIiwgYXJnKTsKKwlDSEVDS19QQVJBTVNfRE8oY29ubiAmJiAoY29ubi0+Y2Nfc29ja2V0ID4gMCksIGdvdG8gb3V0KTsKKwkKKwkvKiBTZXQgdGhlIHRocmVhZCBuYW1lICovCisJeworCQljaGFyIGJ1Zls0OF07CisJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJSZWNlaXZlciAoJWQpIFRDUC9ub1RMUykiLCBjb25uLT5jY19zb2NrZXQpOworCQlmZF9sb2dfdGhyZWFkbmFtZSAoIGJ1ZiApOworCX0KKwkKKwlBU1NFUlQoIGNvbm4tPmNjX3Byb3RvID09IElQUFJPVE9fVENQICk7CisJQVNTRVJUKCAhIGZkX2NueF90ZXN0c3RhdGUoY29ubiwgQ0NfU1RBVFVTX1RMUyApICk7CisJQVNTRVJUKCBmZF9jbnhfdGFyZ2V0X3F1ZXVlKGNvbm4pICk7CisJCisJLyogUmVjZWl2ZSBmcm9tIGEgVENQIGNvbm5lY3Rpb246IHdlIGhhdmUgdG8gcmVidWlsZCB0aGUgbWVzc2FnZSBib3VuZGFyaWVzICovCisJZG8geworCQl1aW50OF90IGhlYWRlcls0XTsKKwkJc3RydWN0IGZkX2NueF9yY3ZkYXRhIHJjdl9kYXRhOworCQlzdHJ1Y3QgZmRfbXNnX3BtZGwgKnBtZGw9TlVMTDsKKwkJc3NpemVfdCByZXQgPSAwOworCQlzaXplX3QJcmVjZWl2ZWQgPSAwOworCisJCWRvIHsKKwkJCXJldCA9IGZkX2NueF9zX3JlY3YoY29ubiwgJmhlYWRlcltyZWNlaXZlZF0sIHNpemVvZihoZWFkZXIpIC0gcmVjZWl2ZWQpOworCQkJaWYgKHJldCA8PSAwKSB7CisJCQkJZ290byBvdXQ7IC8qIFN0b3AgdGhlIHRocmVhZCwgdGhlIGV2ZW50IHdhcyBhbHJlYWR5IHNlbnQgKi8KKwkJCX0KKworCQkJcmVjZWl2ZWQgKz0gcmV0OworCQkJCisJCQlpZiAoaGVhZGVyWzBdICE9IERJQU1FVEVSX1ZFUlNJT04pCisJCQkJYnJlYWs7IC8qIE5vIG5lZWQgdG8gd2FpdCBmb3IgNCBieXRlcyBpbiB0aGlzIGNhc2UgKi8KKwkJfSB3aGlsZSAocmVjZWl2ZWQgPCBzaXplb2YoaGVhZGVyKSk7CisKKwkJcmN2X2RhdGEubGVuZ3RoID0gKChzaXplX3QpaGVhZGVyWzFdIDw8IDE2KSArICgoc2l6ZV90KWhlYWRlclsyXSA8PCA4KSArIChzaXplX3QpaGVhZGVyWzNdOworCisJCS8qIENoZWNrIHRoZSByZWNlaXZlZCB3b3JkIGlzIGEgdmFsaWQgYmVnaW5pbmcgb2YgYSBEaWFtZXRlciBtZXNzYWdlICovCisJCWlmICgoaGVhZGVyWzBdICE9IERJQU1FVEVSX1ZFUlNJT04pCS8qIGRlZmluZWQgaW4gPGxpYmZkcHJvdG8uaD4gKi8KKwkJICAgfHwgKHJjdl9kYXRhLmxlbmd0aCA+IERJQU1FVEVSX01TR19TSVpFX01BWCkpIHsgLyogdG8gYXZvaWQgdG9vIGJpZyBtYWxsb2NzICovCisJCQkvKiBUaGUgbWVzc2FnZSBpcyBzdXNwZWN0ICovCisJCQlMT0dfRSggIlJlY2VpdmVkIHN1c3BlY3QgaGVhZGVyIFt2ZXI6ICVkLCBzaXplOiAlemRdIGZyb20gJyVzJywgYXNzdW1pbmcgZGlzY29ubmVjdGlvbiIsIChpbnQpaGVhZGVyWzBdLCByY3ZfZGF0YS5sZW5ndGgsIGNvbm4tPmNjX3JlbWlkKTsKKwkJCWZkX2NueF9tYXJrZXJyb3IoY29ubik7CisJCQlnb3RvIG91dDsgLyogU3RvcCB0aGUgdGhyZWFkLCB0aGUgcmVjaXBpZW50IG9mIHRoZSBldmVudCB3aWxsIGNsZWFudXAgKi8KKwkJfQorCisJCS8qIE9rLCBub3cgd2UgY2FuIHJlYWxseSByZWNlaXZlIHRoZSBkYXRhICovCisJCUNIRUNLX01BTExPQ19ETyggIHJjdl9kYXRhLmJ1ZmZlciA9IGZkX2NueF9hbGxvY19tc2dfYnVmZmVyKCByY3ZfZGF0YS5sZW5ndGgsICZwbWRsICksIGdvdG8gZmF0YWwgKTsKKwkJbWVtY3B5KHJjdl9kYXRhLmJ1ZmZlciwgaGVhZGVyLCBzaXplb2YoaGVhZGVyKSk7CisKKwkJd2hpbGUgKHJlY2VpdmVkIDwgcmN2X2RhdGEubGVuZ3RoKSB7CisJCQlwdGhyZWFkX2NsZWFudXBfcHVzaChmcmVlX3JjdmRhdGEsICZyY3ZfZGF0YSk7IC8qIEluIGNhc2Ugd2UgYXJlIGNhbmNlbGVkLCBjbGVhbiB0aGUgcGFydGlhbHkgYnVpbHQgYnVmZmVyICovCisJCQlyZXQgPSBmZF9jbnhfc19yZWN2KGNvbm4sIHJjdl9kYXRhLmJ1ZmZlciArIHJlY2VpdmVkLCByY3ZfZGF0YS5sZW5ndGggLSByZWNlaXZlZCk7CisJCQlwdGhyZWFkX2NsZWFudXBfcG9wKDApOworCisJCQlpZiAocmV0IDw9IDApIHsKKwkJCQlmcmVlX3JjdmRhdGEoJnJjdl9kYXRhKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCXJlY2VpdmVkICs9IHJldDsKKwkJfQorCQkKKwkJZmRfaG9va19jYWxsKEhPT0tfREFUQV9SRUNFSVZFRCwgTlVMTCwgTlVMTCwgJnJjdl9kYXRhLCBwbWRsKTsKKwkJCisJCS8qIFdlIGhhdmUgcmVjZWl2ZWQgYSBjb21wbGV0ZSBtZXNzYWdlLCBwYXNzIGl0IHRvIHRoZSBkYWVtb24gKi8KKwkJQ0hFQ0tfRkNUX0RPKCBmZF9ldmVudF9zZW5kKCBmZF9jbnhfdGFyZ2V0X3F1ZXVlKGNvbm4pLCBGREVWUF9DTlhfTVNHX1JFQ1YsIHJjdl9kYXRhLmxlbmd0aCwgcmN2X2RhdGEuYnVmZmVyKSwgCisJCQl7IAorCQkJCWZyZWVfcmN2ZGF0YSgmcmN2X2RhdGEpOworCQkJCWdvdG8gZmF0YWw7IAorCQkJfSApOworCQkKKwl9IHdoaWxlIChjb25uLT5jY19sb29wKTsKKwkKK291dDoKKwlUUkFDRV9ERUJVRyhGVUxMLCAiVGhyZWFkIHRlcm1pbmF0ZWQiKTsJCisJcmV0dXJuIE5VTEw7CisJCitmYXRhbDoKKwkvKiBBbiB1bnJlY292ZXJhYmxlIGVycm9yIG9jY3VycmVkLCBzdG9wIHRoZSBkYWVtb24gKi8KKwlDSEVDS19GQ1RfRE8oZmRfY29yZV9zaHV0ZG93bigpLCApOworCWdvdG8gb3V0OworfQorCisjaWZuZGVmIERJU0FCTEVfU0NUUAorLyogUmVjZWl2ZXIgdGhyZWFkIChTQ1RQICYgbm9UTFMpIDogaW5jb21pbmcgbWVzc2FnZSBpcyBkaXJlY3RseSBzYXZlZCBpbnRvIGNjX2luY29taW5nLCBubyBuZWVkIHRvIGNhcmUgZm9yIHRoZSBzdHJlYW0gSUQgKi8KK3N0YXRpYyB2b2lkICogcmN2dGhyX25vdGxzX3NjdHAodm9pZCAqIGFyZykKK3sKKwlzdHJ1Y3QgY254Y3R4ICogY29ubiA9IGFyZzsKKwlzdHJ1Y3QgZmRfY254X3JjdmRhdGEgcmN2X2RhdGE7CisJaW50CSAgZXZlbnQ7CisJCisJVFJBQ0VfRU5UUlkoIiVwIiwgYXJnKTsKKwlDSEVDS19QQVJBTVNfRE8oY29ubiAmJiAoY29ubi0+Y2Nfc29ja2V0ID4gMCksIGdvdG8gZmF0YWwpOworCQorCS8qIFNldCB0aGUgdGhyZWFkIG5hbWUgKi8KKwl7CisJCWNoYXIgYnVmWzQ4XTsKKwkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIlJlY2VpdmVyICglZCkgU0NUUC9ub1RMUykiLCBjb25uLT5jY19zb2NrZXQpOworCQlmZF9sb2dfdGhyZWFkbmFtZSAoIGJ1ZiApOworCX0KKwkKKwlBU1NFUlQoIGNvbm4tPmNjX3Byb3RvID09IElQUFJPVE9fU0NUUCApOworCUFTU0VSVCggISBmZF9jbnhfdGVzdHN0YXRlKGNvbm4sIENDX1NUQVRVU19UTFMgKSApOworCUFTU0VSVCggZmRfY254X3RhcmdldF9xdWV1ZShjb25uKSApOworCQorCWRvIHsKKwkJc3RydWN0IGZkX21zZ19wbWRsICpwbWRsPU5VTEw7CisJCUNIRUNLX0ZDVF9ETyggZmRfc2N0cF9yZWN2bWV0YShjb25uLCBOVUxMLCAmcmN2X2RhdGEuYnVmZmVyLCAmcmN2X2RhdGEubGVuZ3RoLCAmZXZlbnQpLCBnb3RvIGZhdGFsICk7CisJCWlmIChldmVudCA9PSBGREVWUF9DTlhfRVJST1IpIHsKKwkJCWZkX2NueF9tYXJrZXJyb3IoY29ubik7CisJCQlnb3RvIG91dDsKKwkJfQorCQkKKwkJaWYgKGV2ZW50ID09IEZERVZQX0NOWF9TSFVURE9XTikgeworCQkJLyogSnVzdCBpZ25vcmUgdGhlIG5vdGlmaWNhdGlvbiBmb3Igbm93LCB3ZSB3aWxsIGdldCBhbm90aGVyIGVycm9yIGxhdGVyIGFueXdheSAqLworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoZXZlbnQgPT0gRkRFVlBfQ05YX01TR19SRUNWKSB7CisJCQlDSEVDS19NQUxMT0NfRE8oIHJjdl9kYXRhLmJ1ZmZlciA9IGZkX2NueF9yZWFsbG9jX21zZ19idWZmZXIocmN2X2RhdGEuYnVmZmVyLCByY3ZfZGF0YS5sZW5ndGgsICZwbWRsKSwgZ290byBmYXRhbCApOworCQkJZmRfaG9va19jYWxsKEhPT0tfREFUQV9SRUNFSVZFRCwgTlVMTCwgTlVMTCwgJnJjdl9kYXRhLCBwbWRsKTsKKwkJfQorCQlDSEVDS19GQ1RfRE8oIGZkX2V2ZW50X3NlbmQoIGZkX2NueF90YXJnZXRfcXVldWUoY29ubiksIGV2ZW50LCByY3ZfZGF0YS5sZW5ndGgsIHJjdl9kYXRhLmJ1ZmZlciksIGdvdG8gZmF0YWwgKTsKKwkJCisJfSB3aGlsZSAoY29ubi0+Y2NfbG9vcCB8fCAoZXZlbnQgIT0gRkRFVlBfQ05YX01TR19SRUNWKSk7CisJCitvdXQ6CisJVFJBQ0VfREVCVUcoRlVMTCwgIlRocmVhZCB0ZXJtaW5hdGVkIik7CQorCXJldHVybiBOVUxMOworCitmYXRhbDoKKwkvKiBBbiB1bnJlY292ZXJhYmxlIGVycm9yIG9jY3VycmVkLCBzdG9wIHRoZSBkYWVtb24gKi8KKwlDSEVDS19GQ1RfRE8oZmRfY29yZV9zaHV0ZG93bigpLCApOworCWdvdG8gb3V0OworfQorI2VuZGlmIC8qIERJU0FCTEVfU0NUUCAqLworCisvKiBTdGFydCByZWNldmluZyBtZXNzYWdlcyBpbiBjbGVhciAobm8gVExTKSBvbiB0aGUgY29ubmVjdGlvbiAqLworaW50IGZkX2NueF9zdGFydF9jbGVhcihzdHJ1Y3QgY254Y3R4ICogY29ubiwgaW50IGxvb3ApCit7CisJVFJBQ0VfRU5UUlkoIiVwICVpIiwgY29ubiwgbG9vcCk7CisJCisJQ0hFQ0tfUEFSQU1TKCBjb25uICYmIGZkX2NueF90YXJnZXRfcXVldWUoY29ubikgJiYgKCFmZF9jbnhfdGVzdHN0YXRlKGNvbm4sIENDX1NUQVRVU19UTFMpKSAmJiAoIWNvbm4tPmNjX2xvb3ApKTsKKwkKKwkvKiBSZWxlYXNlIHJlc291cmNlcyBpbiBjYXNlIG9mIGEgcHJldmlvdXMgY2FsbCB3YXMgYWxyZWFkeSBtYWRlICovCisJQ0hFQ0tfRkNUX0RPKCBmZF90aHJfdGVybSgmY29ubi0+Y2NfcmN2dGhyKSwgLyogY29udGludWUgKi8pOworCQorCS8qIFNhdmUgdGhlIGxvb3AgcmVxdWVzdCAqLworCWNvbm4tPmNjX2xvb3AgPSBsb29wOworCQorCXN3aXRjaCAoY29ubi0+Y2NfcHJvdG8pIHsKKwkJY2FzZSBJUFBST1RPX1RDUDoKKwkJCS8qIFN0YXJ0IHRoZSB0Y3Bfbm90bHMgdGhyZWFkICovCisJCQlDSEVDS19QT1NJWCggcHRocmVhZF9jcmVhdGUoICZjb25uLT5jY19yY3Z0aHIsIE5VTEwsIHJjdnRocl9ub3Rsc190Y3AsIGNvbm4gKSApOworCQkJYnJlYWs7CisjaWZuZGVmIERJU0FCTEVfU0NUUAorCQljYXNlIElQUFJPVE9fU0NUUDoKKwkJCS8qIFN0YXJ0IHRoZSB0Y3Bfbm90bHMgdGhyZWFkICovCisJCQlDSEVDS19QT1NJWCggcHRocmVhZF9jcmVhdGUoICZjb25uLT5jY19yY3Z0aHIsIE5VTEwsIHJjdnRocl9ub3Rsc19zY3RwLCBjb25uICkgKTsKKwkJCWJyZWFrOworI2VuZGlmIC8qIERJU0FCTEVfU0NUUCAqLworCQlkZWZhdWx0OgorCQkJVFJBQ0VfREVCVUcoSU5GTywgIlVua25vd24gcHJvdG9jb2w6ICVkIiwgY29ubi0+Y2NfcHJvdG8pOworCQkJQVNTRVJUKDApOworCQkJcmV0dXJuIEVOT1RTVVA7CisJfQorCQkJCisJcmV0dXJuIDA7Cit9CisKKworCisKKy8qIFJldHVybnMgMCBvbiBlcnJvciwgcmVjZWl2ZWQgZGF0YSBzaXplIG90aGVyd2lzZSAoYWx3YXlzID49IDApLiBUaGlzIGlzIG5vdCB1c2VkIGZvciBEVExTLXByb3RlY3RlZCBhc3NvY2lhdGlvbnMuICovCitzdGF0aWMgc3NpemVfdCBmZF90bHNfcmVjdl9oYW5kbGVfZXJyb3Ioc3RydWN0IGNueGN0eCAqIGNvbm4sIGdudXRsc19zZXNzaW9uX3Qgc2Vzc2lvbiwgdm9pZCAqIGRhdGEsIHNpemVfdCBzeikKK3sKKwlzc2l6ZV90IHJldDsKK2FnYWluOgkKKwlDSEVDS19HTlVUTFNfRE8oIHJldCA9IGdudXRsc19yZWNvcmRfcmVjdihzZXNzaW9uLCBkYXRhLCBzeiksIAorCQl7CisJCQlzd2l0Y2ggKHJldCkgeworCQkJCWNhc2UgR05VVExTX0VfUkVIQU5EU0hBS0U6IAorCQkJCQlpZiAoIWZkX2NueF90ZXN0c3RhdGUoY29ubiwgQ0NfU1RBVFVTX0NMT1NJTkcpKSB7CisJCQkJCQlDSEVDS19HTlVUTFNfRE8oIHJldCA9IGdudXRsc19oYW5kc2hha2Uoc2Vzc2lvbiksCisJCQkJCQkJeworCQkJCQkJCQlpZiAoVFJBQ0VfQk9PTChJTkZPKSkgeworCQkJCQkJCQkJZmRfbG9nX2RlYnVnKCJUTFMgcmUtaGFuZHNoYWtlIGZhaWxlZCBvbiBzb2NrZXQgJWQgKCVzKSA6ICVzIiwgY29ubi0+Y2Nfc29ja2V0LCBjb25uLT5jY19pZCwgZ251dGxzX3N0cmVycm9yKHJldCkpOworCQkJCQkJCQl9CisJCQkJCQkJCWdvdG8gZW5kOworCQkJCQkJCX0gKTsKKwkJCQkJfQorCisJCQkJY2FzZSBHTlVUTFNfRV9BR0FJTjoKKwkJCQljYXNlIEdOVVRMU19FX0lOVEVSUlVQVEVEOgorCQkJCQlpZiAoIWZkX2NueF90ZXN0c3RhdGUoY29ubiwgQ0NfU1RBVFVTX0NMT1NJTkcpKQorCQkJCQkJZ290byBhZ2FpbjsKKwkJCQkJVFJBQ0VfREVCVUcoRlVMTCwgIkNvbm5lY3Rpb24gaXMgY2xvc2luZywgc28gYWJvcmQgZ251dGxzX3JlY29yZF9yZWN2IG5vdy4iKTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIEdOVVRMU19FX1VORVhQRUNURURfUEFDS0VUX0xFTkdUSDoKKwkJCQkJLyogVGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkICovCisJCQkJCVRSQUNFX0RFQlVHKEZVTEwsICJHb3QgMCBzaXplIHdoaWxlIHJlYWRpbmcgdGhlIHNvY2tldCwgcHJvYmFibHkgY29ubmVjdGlvbiBjbG9zZWQuLi4iKTsKKwkJCQkJYnJlYWs7CisJCQkJCisJCQkJZGVmYXVsdDoKKwkJCQkJaWYgKGdudXRsc19lcnJvcl9pc19mYXRhbCAocmV0KSA9PSAwKSB7CisJCQkJCQlMT0dfTigiSWdub3Jpbmcgbm9uLWZhdGFsIEdOVSBUTFMgZXJyb3I6ICVzIiwgZ251dGxzX3N0cmVycm9yIChyZXQpKTsKKwkJCQkJCWdvdG8gYWdhaW47CisJCQkJCX0KKwkJCQkJTE9HX0UoIkZhdGFsIEdOVVRMUyBlcnJvcjogJXMiLCBnbnV0bHNfc3RyZXJyb3IgKHJldCkpOworCQkJfQorCQl9ICk7CisJCQorCWlmIChyZXQgPT0gMCkKKwkJQ0hFQ0tfR05VVExTX0RPKCBnbnV0bHNfYnllKHNlc3Npb24sIEdOVVRMU19TSFVUX1JEV1IpLCAgKTsKKwkKK2VuZDoJCisJaWYgKHJldCA8PSAwKQorCQlmZF9jbnhfbWFya2Vycm9yKGNvbm4pOworCXJldHVybiByZXQ7Cit9CisKKy8qIFdyYXBwZXIgYXJvdW5kIGdudXRsc19yZWNvcmRfc2VuZCB0byBoYW5kbGUgc29tZSBlcnJvciBjb2Rlcy4gVGhpcyBpcyBhbHNvIHVzZWQgZm9yIERUTFMtcHJvdGVjdGVkIGFzc29jaWF0aW9ucyAqLworc3RhdGljIHNzaXplX3QgZmRfdGxzX3NlbmRfaGFuZGxlX2Vycm9yKHN0cnVjdCBjbnhjdHggKiBjb25uLCBnbnV0bHNfc2Vzc2lvbl90IHNlc3Npb24sIHZvaWQgKiBkYXRhLCBzaXplX3Qgc3opCit7CisJc3NpemVfdCByZXQ7CisJc3RydWN0IHRpbWVzcGVjIHRzLCBub3c7CisJQ0hFQ0tfU1lTX0RPKCAgY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJnRzKSwgcmV0dXJuIC0xICk7CithZ2FpbjoJCisJQ0hFQ0tfR05VVExTX0RPKCByZXQgPSBnbnV0bHNfcmVjb3JkX3NlbmQoc2Vzc2lvbiwgZGF0YSwgc3opLAorCQl7CisJCQlwdGhyZWFkX3Rlc3RjYW5jZWwoKTsKKwkJCXN3aXRjaCAocmV0KSB7CisJCQkJY2FzZSBHTlVUTFNfRV9SRUhBTkRTSEFLRTogCisJCQkJCWlmICghZmRfY254X3Rlc3RzdGF0ZShjb25uLCBDQ19TVEFUVVNfQ0xPU0lORykpIHsKKwkJCQkJCUNIRUNLX0dOVVRMU19ETyggcmV0ID0gZ251dGxzX2hhbmRzaGFrZShzZXNzaW9uKSwKKwkJCQkJCQl7CisJCQkJCQkJCWlmIChUUkFDRV9CT09MKElORk8pKSB7CisJCQkJCQkJCQlmZF9sb2dfZGVidWcoIlRMUyByZS1oYW5kc2hha2UgZmFpbGVkIG9uIHNvY2tldCAlZCAoJXMpIDogJXMiLCBjb25uLT5jY19zb2NrZXQsIGNvbm4tPmNjX2lkLCBnbnV0bHNfc3RyZXJyb3IocmV0KSk7CisJCQkJCQkJCX0KKwkJCQkJCQkJZ290byBlbmQ7CisJCQkJCQkJfSApOworCQkJCQl9CisKKwkJCQljYXNlIEdOVVRMU19FX0FHQUlOOgorCQkJCWNhc2UgR05VVExTX0VfSU5URVJSVVBURUQ6CisJCQkJCUNIRUNLX1NZU19ETyggIGNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZub3cpLCByZXR1cm4gLTEgKTsKKwkJCQkJaWYgKCAoKG5vdy50dl9zZWMgLSB0cy50dl9zZWMpICogMTAwMCArICgobm93LnR2X25zZWMgLSB0cy50dl9uc2VjKSAvIDEwMDAwMDBMKSkgPiBNQVhfSE9UTF9CTE9DS0lOR19USU1FKSB7CisJCQkJCQlMT0dfRCgiVW5hYmxlIHRvIHNlbmQgYW55IGRhdGEgZm9yICVkbXMsIGNsb3NpbmcgdGhlIGNvbm5lY3Rpb24iLCBNQVhfSE9UTF9CTE9DS0lOR19USU1FKTsKKwkJCQkJfSBlbHNlIGlmICghIGZkX2NueF90ZXN0c3RhdGUoY29ubiwgQ0NfU1RBVFVTX0NMT1NJTkcgKSkgeworCQkJCQkJZ290byBhZ2FpbjsKKwkJCQkJfQorCQkJCQlicmVhazsKKworCQkJCWRlZmF1bHQ6CisJCQkJCWlmIChnbnV0bHNfZXJyb3JfaXNfZmF0YWwgKHJldCkgPT0gMCkgeworCQkJCQkJTE9HX04oIklnbm9yaW5nIG5vbi1mYXRhbCBHTlUgVExTIGVycm9yOiAlcyIsIGdudXRsc19zdHJlcnJvciAocmV0KSk7CisJCQkJCQlnb3RvIGFnYWluOworCQkJCQl9CisJCQkJCUxPR19FKCJGYXRhbCBHTlVUTFMgZXJyb3I6ICVzIiwgZ251dGxzX3N0cmVycm9yIChyZXQpKTsKKwkJCX0KKwkJfSApOworZW5kOgkKKwlpZiAocmV0IDw9IDApCisJCWZkX2NueF9tYXJrZXJyb3IoY29ubik7CisJCQorCXJldHVybiByZXQ7Cit9CisKKworLyogVGhlIGZ1bmN0aW9uIHRoYXQgcmVjZWl2ZXMgVExTIGRhdGEgYW5kIHJlLWJ1aWxkcyBhIERpYW1ldGVyIG1lc3NhZ2UgLS0gaXQgZXhpdHMgb25seSBvbiBlcnJvciBvciBjYW5jZWxhdGlvbiAqLworLyogCSAgIEZvciB0aGUgY2FzZSBvZiBEVExTLCBzaW5jZSB3ZSBhcmUgbm90IHVzaW5nIFNDVFBfVU5PUkRFUkVELCB0aGUgbWVzc2FnZXMgb3ZlciBhIHNpbmdsZSBzdHJlYW0gYXJlIG9yZGVyZWQuCisJICAgRnVydGhlcm1vcmUsIGFzIGxvbmcgYXMgbWVzc2FnZXMgYXJlIHNob3J0ZXIgdGhhbiB0aGUgTVRVIFsyXjE0ID0gMTYzODQgYnl0ZXNdLCB0aGV5IGFyZSBkZWxpdmVyZWQgaW4gYSBzaW5nbGUKKwkgICByZWNvcmQsIGFzIGZhciBhcyBJIHVuZGVyc3RhbmQuIAorCSAgIEZvciBsYXJnZXIgbWVzc2FnZXMsIGhvd2V2ZXIsIGl0IGlzIHBvc3NpYmxlIHRoYXQgcGllY2VzIG9mIG1lc3NhZ2VzIGNvbWluZyBmcm9tIGRpZmZlcmVudCBzdHJlYW1zIGNhbiBnZXQgaW50ZXJsZWF2ZWQuIAorCSAgIEFzIGEgcmVzdWx0LCB3ZSBkbyBub3QgdXNlIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gZm9yIERUTFMgcmVjZXB0aW9uLCBiZWNhdXNlIHdlIHVzZSB0aGUgc2VxdWVuY2UgbnVtYmVyIHRvIHJlYnVpbGQgdGhlCisJICAgbWVzc2FnZXMuICovCitpbnQgZmRfdGxzX3JjdnRocl9jb3JlKHN0cnVjdCBjbnhjdHggKiBjb25uLCBnbnV0bHNfc2Vzc2lvbl90IHNlc3Npb24pCit7CisJLyogTm8gZ3VhcmFudGVlIHRoYXQgR251VExTIHByZXNlcnZlcyB0aGUgbWVzc2FnZSBib3VuZGFyaWVzLCBzbyB3ZSByZS1idWlsZCBpdCBhcyBpbiBUQ1AuICovCisJZG8geworCQl1aW50OF90IGhlYWRlcls0XTsKKwkJc3RydWN0IGZkX2NueF9yY3ZkYXRhIHJjdl9kYXRhOworCQlzdHJ1Y3QgZmRfbXNnX3BtZGwgKnBtZGw9TlVMTDsKKwkJc3NpemVfdCByZXQgPSAwOworCQlzaXplX3QJcmVjZWl2ZWQgPSAwOworCisJCWRvIHsKKwkJCXJldCA9IGZkX3Rsc19yZWN2X2hhbmRsZV9lcnJvcihjb25uLCBzZXNzaW9uLCAmaGVhZGVyW3JlY2VpdmVkXSwgc2l6ZW9mKGhlYWRlcikgLSByZWNlaXZlZCk7CisJCQlpZiAocmV0IDw9IDApIHsKKwkJCQkvKiBUaGUgY29ubmVjdGlvbiBpcyBjbG9zZWQgKi8KKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCXJlY2VpdmVkICs9IHJldDsKKwkJfSB3aGlsZSAocmVjZWl2ZWQgPCBzaXplb2YoaGVhZGVyKSk7CisKKwkJcmN2X2RhdGEubGVuZ3RoID0gKChzaXplX3QpaGVhZGVyWzFdIDw8IDE2KSArICgoc2l6ZV90KWhlYWRlclsyXSA8PCA4KSArIChzaXplX3QpaGVhZGVyWzNdOworCisJCS8qIENoZWNrIHRoZSByZWNlaXZlZCB3b3JkIGlzIGEgdmFsaWQgYmVnaW5uaW5nIG9mIGEgRGlhbWV0ZXIgbWVzc2FnZSAqLworCQlpZiAoKGhlYWRlclswXSAhPSBESUFNRVRFUl9WRVJTSU9OKQkvKiBkZWZpbmVkIGluIDxsaWJmcmVlRGlhbWV0ZXIuaD4gKi8KKwkJICAgfHwgKHJjdl9kYXRhLmxlbmd0aCA+IERJQU1FVEVSX01TR19TSVpFX01BWCkpIHsgLyogdG8gYXZvaWQgdG9vIGJpZyBtYWxsb2NzICovCisJCQkvKiBUaGUgbWVzc2FnZSBpcyBzdXNwZWN0ICovCisJCQlMT0dfRSggIlJlY2VpdmVkIHN1c3BlY3QgaGVhZGVyIFt2ZXI6ICVkLCBzaXplOiAlemRdIGZyb20gJyVzJywgYXNzdW1lIGRpc2Nvbm5lY3Rpb24iLCAoaW50KWhlYWRlclswXSwgcmN2X2RhdGEubGVuZ3RoLCBjb25uLT5jY19yZW1pZCk7CisJCQlmZF9jbnhfbWFya2Vycm9yKGNvbm4pOworCQkJZ290byBvdXQ7CisJCX0KKworCQkvKiBPaywgbm93IHdlIGNhbiByZWFsbHkgcmVjZWl2ZSB0aGUgZGF0YSAqLworCQlDSEVDS19NQUxMT0MoICByY3ZfZGF0YS5idWZmZXIgPSBmZF9jbnhfYWxsb2NfbXNnX2J1ZmZlciggcmN2X2RhdGEubGVuZ3RoLCAmcG1kbCApICk7CisJCW1lbWNweShyY3ZfZGF0YS5idWZmZXIsIGhlYWRlciwgc2l6ZW9mKGhlYWRlcikpOworCisJCXdoaWxlIChyZWNlaXZlZCA8IHJjdl9kYXRhLmxlbmd0aCkgeworCQkJcHRocmVhZF9jbGVhbnVwX3B1c2goZnJlZV9yY3ZkYXRhLCAmcmN2X2RhdGEpOyAvKiBJbiBjYXNlIHdlIGFyZSBjYW5jZWxlZCwgY2xlYW4gdGhlIHBhcnRpYWx5IGJ1aWx0IGJ1ZmZlciAqLworCQkJcmV0ID0gZmRfdGxzX3JlY3ZfaGFuZGxlX2Vycm9yKGNvbm4sIHNlc3Npb24sIHJjdl9kYXRhLmJ1ZmZlciArIHJlY2VpdmVkLCByY3ZfZGF0YS5sZW5ndGggLSByZWNlaXZlZCk7CisJCQlwdGhyZWFkX2NsZWFudXBfcG9wKDApOworCisJCQlpZiAocmV0IDw9IDApIHsKKwkJCQlmcmVlX3JjdmRhdGEoJnJjdl9kYXRhKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCXJlY2VpdmVkICs9IHJldDsKKwkJfQorCQkKKwkJZmRfaG9va19jYWxsKEhPT0tfREFUQV9SRUNFSVZFRCwgTlVMTCwgTlVMTCwgJnJjdl9kYXRhLCBwbWRsKTsKKwkJCisJCS8qIFdlIGhhdmUgcmVjZWl2ZWQgYSBjb21wbGV0ZSBtZXNzYWdlLCBwYXNzIGl0IHRvIHRoZSBkYWVtb24gKi8KKwkJQ0hFQ0tfRkNUX0RPKCByZXQgPSBmZF9ldmVudF9zZW5kKCBmZF9jbnhfdGFyZ2V0X3F1ZXVlKGNvbm4pLCBGREVWUF9DTlhfTVNHX1JFQ1YsIHJjdl9kYXRhLmxlbmd0aCwgcmN2X2RhdGEuYnVmZmVyKSwgCisJCQl7IAorCQkJCWZyZWVfcmN2ZGF0YSgmcmN2X2RhdGEpOworCQkJCUNIRUNLX0ZDVF9ETyhmZF9jb3JlX3NodXRkb3duKCksICk7CisJCQkJcmV0dXJuIHJldDsgCisJCQl9ICk7CisJCQorCX0gd2hpbGUgKDEpOworCQorb3V0OgorCXJldHVybiBFTk9UQ09OTjsKK30KKworLyogUmVjZWl2ZXIgdGhyZWFkIChUTFMgJiAxIHN0cmVhbSBTQ1RQIG9yIFRDUCkgICovCitzdGF0aWMgdm9pZCAqIHJjdnRocl90bHNfc2luZ2xlKHZvaWQgKiBhcmcpCit7CisJc3RydWN0IGNueGN0eCAqIGNvbm4gPSBhcmc7CisJCisJVFJBQ0VfRU5UUlkoIiVwIiwgYXJnKTsKKwlDSEVDS19QQVJBTVNfRE8oY29ubiAmJiAoY29ubi0+Y2Nfc29ja2V0ID4gMCksIHJldHVybiBOVUxMICk7CisJCisJLyogU2V0IHRoZSB0aHJlYWQgbmFtZSAqLworCXsKKwkJY2hhciBidWZbNDhdOworCQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiUmVjZWl2ZXIgKCVkKSBUTFMvc2luZ2xlIHN0cmVhbSIsIGNvbm4tPmNjX3NvY2tldCk7CisJCWZkX2xvZ190aHJlYWRuYW1lICggYnVmICk7CisJfQorCQorCUFTU0VSVCggZmRfY254X3Rlc3RzdGF0ZShjb25uLCBDQ19TVEFUVVNfVExTKSApOworCUFTU0VSVCggZmRfY254X3RhcmdldF9xdWV1ZShjb25uKSApOworCisJLyogVGhlIG5leHQgZnVuY3Rpb24gb25seSByZXR1cm5zIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3Igb24gdGhlIHNvY2tldCAqLwkKKwlDSEVDS19GQ1RfRE8oZmRfdGxzX3JjdnRocl9jb3JlKGNvbm4sIGNvbm4tPmNjX3Rsc19wYXJhLnNlc3Npb24pLCAvKiBjb250aW51ZSAqLyk7CisKKwlUUkFDRV9ERUJVRyhGVUxMLCAiVGhyZWFkIHRlcm1pbmF0ZWQiKTsJCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIFByZXBhcmUgYSBnbnV0bHMgc2Vzc2lvbiBvYmplY3QgZm9yIGhhbmRzaGFrZSAqLworaW50IGZkX3Rsc19wcmVwYXJlKGdudXRsc19zZXNzaW9uX3QgKiBzZXNzaW9uLCBpbnQgbW9kZSwgaW50IGR0bHMsIGNoYXIgKiBwcmlvcml0eSwgdm9pZCAqIGFsdF9jcmVkcykKK3sKKwlpZiAoZHRscykgeworCQlMT0dfRSgiRFRMUyBzZXNzaW9ucyBub3QgeWV0IHN1cHBvcnRlZCIpOworCQlyZXR1cm4gRU5PVFNVUDsKKwl9CisKKwkvKiBDcmVhdGUgdGhlIHNlc3Npb24gY29udGV4dCAqLworCUNIRUNLX0dOVVRMU19ETyggZ251dGxzX2luaXQgKHNlc3Npb24sIG1vZGUpLCByZXR1cm4gRU5PTUVNICk7CisKKwkvKiBTZXQgdGhlIGFsZ29yaXRobSBzdWl0ZSAqLworCWlmIChwcmlvcml0eSkgeworCQljb25zdCBjaGFyICogZXJyb3Jwb3M7CisJCUNIRUNLX0dOVVRMU19ETyggZ251dGxzX3ByaW9yaXR5X3NldF9kaXJlY3QoICpzZXNzaW9uLCBwcmlvcml0eSwgJmVycm9ycG9zICksIAorCQkJeyBUUkFDRV9ERUJVRyhJTkZPLCAiRXJyb3IgaW4gcHJpb3JpdHkgc3RyaW5nICclcycgYXQgcG9zaXRpb246ICclcyciLCBwcmlvcml0eSwgZXJyb3Jwb3MpOyByZXR1cm4gRUlOVkFMOyB9ICk7CisJfSBlbHNlIHsKKwkJQ0hFQ0tfR05VVExTX0RPKCBnbnV0bHNfcHJpb3JpdHlfc2V0KCAqc2Vzc2lvbiwgZmRfZ19jb25maWctPmNuZl9zZWNfZGF0YS5wcmlvX2NhY2hlICksIHJldHVybiBFSU5WQUwgKTsKKwl9CisKKwkvKiBTZXQgdGhlIGNyZWRlbnRpYWxzIG9mIHRoaXMgc2lkZSBvZiB0aGUgY29ubmVjdGlvbiAqLworCUNIRUNLX0dOVVRMU19ETyggZ251dGxzX2NyZWRlbnRpYWxzX3NldCAoKnNlc3Npb24sIEdOVVRMU19DUkRfQ0VSVElGSUNBVEUsIGFsdF9jcmVkcyA/OiBmZF9nX2NvbmZpZy0+Y25mX3NlY19kYXRhLmNyZWRlbnRpYWxzKSwgcmV0dXJuIEVJTlZBTCApOworCisJLyogUmVxdWVzdCB0aGUgcmVtb3RlIGNyZWRlbnRpYWxzIGFzIHdlbGwgKi8KKwlpZiAobW9kZSA9PSBHTlVUTFNfU0VSVkVSKSB7CisJCWdudXRsc19jZXJ0aWZpY2F0ZV9zZXJ2ZXJfc2V0X3JlcXVlc3QgKCpzZXNzaW9uLCBHTlVUTFNfQ0VSVF9SRVFVSVJFKTsKKwl9CisJCQorCXJldHVybiAwOworfQorCisjaWZuZGVmIEdOVVRMU19WRVJTSU9OXzMwMAorCisvKiBWZXJpZnkgcmVtb3RlIGNyZWRlbnRpYWxzIGFmdGVyIHN1Y2Nlc3NmdWwgaGFuZHNoYWtlIChyZXR1cm4gMCBpZiBPSywgRUlOVkFMIG90aGVyd2lzZSkgKi8KK2ludCBmZF90bHNfdmVyaWZ5X2NyZWRlbnRpYWxzKGdudXRsc19zZXNzaW9uX3Qgc2Vzc2lvbiwgc3RydWN0IGNueGN0eCAqIGNvbm4sIGludCB2ZXJib3NlKQoreworCWludCBpLCByZXQgPSAwOworCXVuc2lnbmVkIGludCBndHJldDsKKwljb25zdCBnbnV0bHNfZGF0dW1fdCAqY2VydF9saXN0OworCXVuc2lnbmVkIGludCBjZXJ0X2xpc3Rfc2l6ZTsKKwlnbnV0bHNfeDUwOV9jcnRfdCBjZXJ0OworCXRpbWVfdCBub3c7CisJCisJVFJBQ0VfRU5UUlkoIiVwICVkIiwgY29ubiwgdmVyYm9zZSk7CisJQ0hFQ0tfUEFSQU1TKGNvbm4pOworCQorCS8qIFRyYWNlIHRoZSBzZXNzaW9uIGluZm9ybWF0aW9uIC0tIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9nbnV0bHMvbWFudWFsL2dudXRscy5odG1sI09idGFpbmluZy1zZXNzaW9uLWluZm9ybWF0aW9uICovCisJI2lmZGVmIERFQlVHCisJaWYgKHZlcmJvc2UpIHsKKwkJY29uc3QgY2hhciAqdG1wOworCQlnbnV0bHNfa3hfYWxnb3JpdGhtX3Qga3g7CisgIAkJZ251dGxzX2NyZWRlbnRpYWxzX3R5cGVfdCBjcmVkOworCQkKKwkJTE9HX0QoIlRMUyBTZXNzaW9uIGluZm9ybWF0aW9uIGZvciBjb25uZWN0aW9uICclcyc6IiwgY29ubi0+Y2NfaWQpOworCisJCS8qIHByaW50IHRoZSBrZXkgZXhjaGFuZ2UncyBhbGdvcml0aG0gbmFtZSAqLworCQlHTlVUTFNfVFJBQ0UoIGt4ID0gZ251dGxzX2t4X2dldCAoc2Vzc2lvbikgKTsKKwkJR05VVExTX1RSQUNFKCB0bXAgPSBnbnV0bHNfa3hfZ2V0X25hbWUgKGt4KSApOworCQlMT0dfRCgiXHQgLSBLZXkgRXhjaGFuZ2U6ICVzIiwgdG1wKTsKKworCQkvKiBDaGVjayB0aGUgYXV0aGVudGljYXRpb24gdHlwZSB1c2VkIGFuZCBzd2l0Y2gKKwkJKiB0byB0aGUgYXBwcm9wcmlhdGUuICovCisJCUdOVVRMU19UUkFDRSggY3JlZCA9IGdudXRsc19hdXRoX2dldF90eXBlIChzZXNzaW9uKSApOworCQlzd2l0Y2ggKGNyZWQpCisJCXsKKwkJCWNhc2UgR05VVExTX0NSRF9JQToKKwkJCQlMT0dfRCgiXHQgLSBUTFMvSUEgc2Vzc2lvbiIpOworCQkJCWJyZWFrOworCisJCQljYXNlIEdOVVRMU19DUkRfUFNLOgorCQkJCS8qIFRoaXMgcmV0dXJucyBOVUxMIGluIHNlcnZlciBzaWRlLiAqLworCQkJCWlmIChnbnV0bHNfcHNrX2NsaWVudF9nZXRfaGludCAoc2Vzc2lvbikgIT0gTlVMTCkKKwkJCQkJTE9HX0QoIlx0IC0gUFNLIGF1dGhlbnRpY2F0aW9uLiBQU0sgaGludCAnJXMnIiwKKwkJCQkJCWdudXRsc19wc2tfY2xpZW50X2dldF9oaW50IChzZXNzaW9uKSk7CisJCQkJLyogVGhpcyByZXR1cm5zIE5VTEwgaW4gY2xpZW50IHNpZGUuICovCisJCQkJaWYgKGdudXRsc19wc2tfc2VydmVyX2dldF91c2VybmFtZSAoc2Vzc2lvbikgIT0gTlVMTCkKKwkJCQkJTE9HX0QoIlx0IC0gUFNLIGF1dGhlbnRpY2F0aW9uLiBDb25uZWN0ZWQgYXMgJyVzJyIsCisJCQkJCQlnbnV0bHNfcHNrX3NlcnZlcl9nZXRfdXNlcm5hbWUgKHNlc3Npb24pKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBHTlVUTFNfQ1JEX0FOT046CS8qIGFub255bW91cyBhdXRoZW50aWNhdGlvbiAqLworCQkJCUxPR19EKCJcdCAtIEFub255bW91cyBESCB1c2luZyBwcmltZSBvZiAlZCBiaXRzIiwKKwkJCQkJZ251dGxzX2RoX2dldF9wcmltZV9iaXRzIChzZXNzaW9uKSk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgR05VVExTX0NSRF9DRVJUSUZJQ0FURToJLyogY2VydGlmaWNhdGUgYXV0aGVudGljYXRpb24gKi8KKwkJCQkvKiBDaGVjayBpZiB3ZSBoYXZlIGJlZW4gdXNpbmcgZXBoZW1lcmFsIERpZmZpZS1IZWxsbWFuLiAqLworCQkJCWlmIChreCA9PSBHTlVUTFNfS1hfREhFX1JTQSB8fCBreCA9PSBHTlVUTFNfS1hfREhFX0RTUykgeworCQkJCQlMT0dfRCgiXHQgLSBFcGhlbWVyYWwgREggdXNpbmcgcHJpbWUgb2YgJWQgYml0cyIsCisJCQkJCQlnbnV0bHNfZGhfZ2V0X3ByaW1lX2JpdHMgKHNlc3Npb24pKTsKKwkJCQl9CisJCQkJYnJlYWs7CisjaWZkZWYgRU5BQkxFX1NSUAkJCQkKKwkJCWNhc2UgR05VVExTX0NSRF9TUlA6CisJCQkJTE9HX0QoIlx0IC0gU1JQIHNlc3Npb24gd2l0aCB1c2VybmFtZSAlcyIsCisJCQkJCWdudXRsc19zcnBfc2VydmVyX2dldF91c2VybmFtZSAoc2Vzc2lvbikpOworCQkJCWJyZWFrOworI2VuZGlmIC8qIEVOQUJMRV9TUlAgKi8KKworCQkJZGVmYXVsdDoKKwkJCQlmZF9sb2dfZGVidWcoIlx0IC0gRGlmZmVyZW50IHR5cGUgb2YgY3JlZGVudGlhbHMgZm9yIHRoZSBzZXNzaW9uICglZCkuIiwgY3JlZCk7CisJCQkJYnJlYWs7CisKKwkJfQorCisJCS8qIHByaW50IHRoZSBwcm90b2NvbCdzIG5hbWUgKGllIFRMUyAxLjApICovCisJCXRtcCA9IGdudXRsc19wcm90b2NvbF9nZXRfbmFtZSAoZ251dGxzX3Byb3RvY29sX2dldF92ZXJzaW9uIChzZXNzaW9uKSk7CisJCUxPR19EKCJcdCAtIFByb3RvY29sOiAlcyIsIHRtcCk7CisKKwkJLyogcHJpbnQgdGhlIGNlcnRpZmljYXRlIHR5cGUgb2YgdGhlIHBlZXIuIGllIFguNTA5ICovCisJCXRtcCA9IGdudXRsc19jZXJ0aWZpY2F0ZV90eXBlX2dldF9uYW1lIChnbnV0bHNfY2VydGlmaWNhdGVfdHlwZV9nZXQgKHNlc3Npb24pKTsKKwkJTE9HX0QoIlx0IC0gQ2VydGlmaWNhdGUgVHlwZTogJXMiLCB0bXApOworCisJCS8qIHByaW50IHRoZSBjb21wcmVzc2lvbiBhbGdvcml0aG0gKGlmIGFueSkgKi8KKwkJdG1wID0gZ251dGxzX2NvbXByZXNzaW9uX2dldF9uYW1lIChnbnV0bHNfY29tcHJlc3Npb25fZ2V0IChzZXNzaW9uKSk7CisJCUxPR19EKCJcdCAtIENvbXByZXNzaW9uOiAlcyIsIHRtcCk7CisKKwkJLyogcHJpbnQgdGhlIG5hbWUgb2YgdGhlIGNpcGhlciB1c2VkLiBpZSAzREVTLiAqLworCQl0bXAgPSBnbnV0bHNfY2lwaGVyX2dldF9uYW1lIChnbnV0bHNfY2lwaGVyX2dldCAoc2Vzc2lvbikpOworCQlMT0dfRCgiXHQgLSBDaXBoZXI6ICVzIiwgdG1wKTsKKworCQkvKiBQcmludCB0aGUgTUFDIGFsZ29yaXRobXMgbmFtZS4gaWUgU0hBMSAqLworCQl0bXAgPSBnbnV0bHNfbWFjX2dldF9uYW1lIChnbnV0bHNfbWFjX2dldCAoc2Vzc2lvbikpOworCQlMT0dfRCgiXHQgLSBNQUM6ICVzIiwgdG1wKTsKKwl9CisJI2VuZGlmIC8qIERFQlVHICovCisJCisJLyogRmlyc3QsIHVzZSBidWlsdC1pbiB2ZXJpZmljYXRpb24gKi8KKwlDSEVDS19HTlVUTFNfRE8oIGdudXRsc19jZXJ0aWZpY2F0ZV92ZXJpZnlfcGVlcnMyIChzZXNzaW9uLCAmZ3RyZXQpLCByZXR1cm4gRUlOVkFMICk7CisJaWYgKGd0cmV0KSB7CisJCUxPR19FKCJUTFM6IFJlbW90ZSBjZXJ0aWZpY2F0ZSBpbnZhbGlkIG9uIHNvY2tldCAlZCAoUmVtb3RlOiAnJXMnKShDb25uZWN0aW9uOiAnJXMnKSA6IiwgY29ubi0+Y2Nfc29ja2V0LCBjb25uLT5jY19yZW1pZCwgY29ubi0+Y2NfaWQpOworCQlpZiAoZ3RyZXQgJiBHTlVUTFNfQ0VSVF9JTlZBTElEKQorCQkJTE9HX0UoIiAtIFRoZSBjZXJ0aWZpY2F0ZSBpcyBub3QgdHJ1c3RlZCAodW5rbm93biBDQT8gZXhwaXJlZD8pIik7CisJCWlmIChndHJldCAmIEdOVVRMU19DRVJUX1JFVk9LRUQpCisJCQlMT0dfRSgiIC0gVGhlIGNlcnRpZmljYXRlIGhhcyBiZWVuIHJldm9rZWQuIik7CisJCWlmIChndHJldCAmIEdOVVRMU19DRVJUX1NJR05FUl9OT1RfRk9VTkQpCisJCQlMT0dfRSgiIC0gVGhlIGNlcnRpZmljYXRlIGhhc24ndCBnb3QgYSBrbm93biBpc3N1ZXIuIik7CisJCWlmIChndHJldCAmIEdOVVRMU19DRVJUX1NJR05FUl9OT1RfQ0EpCisJCQlMT0dfRSgiIC0gVGhlIGNlcnRpZmljYXRlIHNpZ25lciBpcyBub3QgYSBDQSwgb3IgdXNlcyB2ZXJzaW9uIDEsIG9yIDMgd2l0aG91dCBiYXNpYyBjb25zdHJhaW50cy4iKTsKKwkJaWYgKGd0cmV0ICYgR05VVExTX0NFUlRfSU5TRUNVUkVfQUxHT1JJVEhNKQorCQkJTE9HX0UoIiAtIFRoZSBjZXJ0aWZpY2F0ZSBzaWduYXR1cmUgdXNlcyBhIHdlYWsgYWxnb3JpdGhtLiIpOworCQlyZXR1cm4gRUlOVkFMOworCX0KKwkKKwkvKiBDb2RlIGZyb20gaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2dudXRscy9tYW51YWwvZ251dGxzLmh0bWwjVmVyaWZ5aW5nLXBlZXJfMDAyN3MtY2VydGlmaWNhdGUgKi8KKwlpZiAoZ251dGxzX2NlcnRpZmljYXRlX3R5cGVfZ2V0IChzZXNzaW9uKSAhPSBHTlVUTFNfQ1JUX1g1MDkpIHsKKwkJTE9HX0UoIlRMUzogUmVtb3RlIHBlZXIgZGlkIG5vdCBwcmVzZW50IGEgY2VydGlmaWNhdGUsIG90aGVyIG1lY2hhbmlzbXMgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0LiBzb2NrZXQgJWQgKFJlbW90ZTogJyVzJykoQ29ubmVjdGlvbjogJyVzJykgOiIsIGNvbm4tPmNjX3NvY2tldCwgY29ubi0+Y2NfcmVtaWQsIGNvbm4tPmNjX2lkKTsKKwkJcmV0dXJuIEVJTlZBTDsKKwl9CisJCisJR05VVExTX1RSQUNFKCBjZXJ0X2xpc3QgPSBnbnV0bHNfY2VydGlmaWNhdGVfZ2V0X3BlZXJzIChzZXNzaW9uLCAmY2VydF9saXN0X3NpemUpICk7CisJaWYgKGNlcnRfbGlzdCA9PSBOVUxMKQorCQlyZXR1cm4gRUlOVkFMOworCQorCW5vdyA9IHRpbWUoTlVMTCk7CisJCisJI2lmZGVmIERFQlVHCisJCWNoYXIgc2VyaWFsWzQwXTsKKwkJY2hhciBkblsxMjhdOworCQlzaXplX3Qgc2l6ZTsKKwkJdW5zaWduZWQgaW50IGFsZ28sIGJpdHM7CisJCXRpbWVfdCBleHBpcmF0aW9uX3RpbWUsIGFjdGl2YXRpb25fdGltZTsKKwkJCisJCUxPR19EKCJUTFMgQ2VydGlmaWNhdGUgaW5mb3JtYXRpb24gZm9yIGNvbm5lY3Rpb24gJyVzJyAoJWQgY2VydHMgcHJvdmlkZWQpOiIsIGNvbm4tPmNjX2lkLCBjZXJ0X2xpc3Rfc2l6ZSk7CisJCWZvciAoaSA9IDA7IGkgPCBjZXJ0X2xpc3Rfc2l6ZTsgaSsrKQorCQl7CisKKwkJCUNIRUNLX0dOVVRMU19ETyggZ251dGxzX3g1MDlfY3J0X2luaXQgKCZjZXJ0KSwgcmV0dXJuIEVJTlZBTCk7CisJCQlDSEVDS19HTlVUTFNfRE8oIGdudXRsc194NTA5X2NydF9pbXBvcnQgKGNlcnQsICZjZXJ0X2xpc3RbaV0sIEdOVVRMU19YNTA5X0ZNVF9ERVIpLCByZXR1cm4gRUlOVkFMKTsKKwkJCisJCQlMT0dfQSgiIENlcnRpZmljYXRlICVkIGluZm86IiwgaSk7CisKKwkJCUdOVVRMU19UUkFDRSggZXhwaXJhdGlvbl90aW1lID0gZ251dGxzX3g1MDlfY3J0X2dldF9leHBpcmF0aW9uX3RpbWUgKGNlcnQpICk7CisJCQlHTlVUTFNfVFJBQ0UoIGFjdGl2YXRpb25fdGltZSA9IGdudXRsc194NTA5X2NydF9nZXRfYWN0aXZhdGlvbl90aW1lIChjZXJ0KSApOworCisJCQlMT0coIGkgPyBGRF9MT0dfQU5OT1lJTkcgOiBGRF9MT0dfREVCVUcsICJcdCAtIENlcnRpZmljYXRlIGlzIHZhbGlkIHNpbmNlOiAlLjI0cyIsIGN0aW1lICgmYWN0aXZhdGlvbl90aW1lKSk7CisJCQlMT0coIGkgPyBGRF9MT0dfQU5OT1lJTkcgOiBGRF9MT0dfREVCVUcsICJcdCAtIENlcnRpZmljYXRlIGV4cGlyZXM6ICUuMjRzIiwgY3RpbWUgKCZleHBpcmF0aW9uX3RpbWUpKTsKKworCQkJLyogUHJpbnQgdGhlIHNlcmlhbCBudW1iZXIgb2YgdGhlIGNlcnRpZmljYXRlLiAqLworCQkJc2l6ZSA9IHNpemVvZiAoc2VyaWFsKTsKKwkJCWdudXRsc194NTA5X2NydF9nZXRfc2VyaWFsIChjZXJ0LCBzZXJpYWwsICZzaXplKTsKKwkJCQorCQkJeworCQkJCWludCBqOworCQkJCWNoYXIgYnVmWzEwMjRdOworCQkJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJcdCAtIENlcnRpZmljYXRlIHNlcmlhbCBudW1iZXI6ICIpOworCQkJCWZvciAoaiA9IDA7IGogPCBzaXplOyBqKyspIHsKKwkJCQkJc25wcmludGYoYnVmK3N0cmxlbihidWYpLCBzaXplb2YoYnVmKS1zdHJsZW4oYnVmKSwgIiUwMmhoeCIsIHNlcmlhbFtqXSk7CisJCQkJfQorCQkJCUxPRyggaSA/IEZEX0xPR19BTk5PWUlORyA6IEZEX0xPR19ERUJVRywgIiVzIiwgYnVmKTsKKwkJCX0KKworCQkJLyogRXh0cmFjdCBzb21lIG9mIHRoZSBwdWJsaWMga2V5IGFsZ29yaXRobSdzIHBhcmFtZXRlcnMgKi8KKwkJCUdOVVRMU19UUkFDRSggYWxnbyA9IGdudXRsc194NTA5X2NydF9nZXRfcGtfYWxnb3JpdGhtIChjZXJ0LCAmYml0cykgKTsKKwkJCUxPRyggaSA/IEZEX0xPR19BTk5PWUlORyA6IEZEX0xPR19ERUJVRywgIlx0IC0gQ2VydGlmaWNhdGUgcHVibGljIGtleTogJXMiLAorCQkJICAgICAgZ251dGxzX3BrX2FsZ29yaXRobV9nZXRfbmFtZSAoYWxnbykpOworCisJCQkvKiBQcmludCB0aGUgdmVyc2lvbiBvZiB0aGUgWC41MDkgY2VydGlmaWNhdGUuICovCisJCQlMT0coIGkgPyBGRF9MT0dfQU5OT1lJTkcgOiBGRF9MT0dfREVCVUcsICJcdCAtIENlcnRpZmljYXRlIHZlcnNpb246ICMlZCIsCisJCQkgICAgICBnbnV0bHNfeDUwOV9jcnRfZ2V0X3ZlcnNpb24gKGNlcnQpKTsKKworCQkJc2l6ZSA9IHNpemVvZiAoZG4pOworCQkJR05VVExTX1RSQUNFKCBnbnV0bHNfeDUwOV9jcnRfZ2V0X2RuIChjZXJ0LCBkbiwgJnNpemUpICk7CisJCQlMT0coIGkgPyBGRF9MT0dfQU5OT1lJTkcgOiBGRF9MT0dfREVCVUcsICJcdCAtIEROOiAlcyIsIGRuKTsKKworCQkJc2l6ZSA9IHNpemVvZiAoZG4pOworCQkJR05VVExTX1RSQUNFKCBnbnV0bHNfeDUwOV9jcnRfZ2V0X2lzc3Vlcl9kbiAoY2VydCwgZG4sICZzaXplKSApOworCQkJTE9HKCBpID8gRkRfTE9HX0FOTk9ZSU5HIDogRkRfTE9HX0RFQlVHLCAiXHQgLSBJc3N1ZXIncyBETjogJXMiLCBkbik7CisKKwkJCUdOVVRMU19UUkFDRSggZ251dGxzX3g1MDlfY3J0X2RlaW5pdCAoY2VydCkgKTsKKwkJfQorCSNlbmRpZiAvKiBERUJVRyAqLworCisJLyogQ2hlY2sgdmFsaWRpdHkgb2YgYWxsIHRoZSBjZXJ0aWZpY2F0ZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY2VydF9saXN0X3NpemU7IGkrKykKKwl7CisJCXRpbWVfdCBkZWFkbGluZTsKKwkJCisJCUNIRUNLX0dOVVRMU19ETyggZ251dGxzX3g1MDlfY3J0X2luaXQgKCZjZXJ0KSwgcmV0dXJuIEVJTlZBTCk7CisJCUNIRUNLX0dOVVRMU19ETyggZ251dGxzX3g1MDlfY3J0X2ltcG9ydCAoY2VydCwgJmNlcnRfbGlzdFtpXSwgR05VVExTX1g1MDlfRk1UX0RFUiksIHJldHVybiBFSU5WQUwpOworCQkKKwkJR05VVExTX1RSQUNFKCBkZWFkbGluZSA9IGdudXRsc194NTA5X2NydF9nZXRfZXhwaXJhdGlvbl90aW1lKGNlcnQpICk7CisJCWlmICgoZGVhZGxpbmUgIT0gKHRpbWVfdCktMSkgJiYgKGRlYWRsaW5lIDwgbm93KSkgeworCQkJTE9HX0UoIlRMUzogUmVtb3RlIGNlcnRpZmljYXRlIGludmFsaWQgb24gc29ja2V0ICVkIChSZW1vdGU6ICclcycpKENvbm5lY3Rpb246ICclcycpIDoiLCBjb25uLT5jY19zb2NrZXQsIGNvbm4tPmNjX3JlbWlkLCBjb25uLT5jY19pZCk7CisJCQlMT0dfRSgiIC0gVGhlIGNlcnRpZmljYXRlICVkIGluIHRoZSBjaGFpbiBpcyBleHBpcmVkIiwgaSk7CisJCQlyZXQgPSBFSU5WQUw7CisJCX0KKwkJCisJCUdOVVRMU19UUkFDRSggZGVhZGxpbmUgPSBnbnV0bHNfeDUwOV9jcnRfZ2V0X2FjdGl2YXRpb25fdGltZShjZXJ0KSApOworCQlpZiAoKGRlYWRsaW5lICE9ICh0aW1lX3QpLTEpICYmIChkZWFkbGluZSA+IG5vdykpIHsKKwkJCUxPR19FKCJUTFM6IFJlbW90ZSBjZXJ0aWZpY2F0ZSBpbnZhbGlkIG9uIHNvY2tldCAlZCAoUmVtb3RlOiAnJXMnKShDb25uZWN0aW9uOiAnJXMnKSA6IiwgY29ubi0+Y2Nfc29ja2V0LCBjb25uLT5jY19yZW1pZCwgY29ubi0+Y2NfaWQpOworCQkJTE9HX0UoIiAtIFRoZSBjZXJ0aWZpY2F0ZSAlZCBpbiB0aGUgY2hhaW4gaXMgbm90IHlldCBhY3RpdmF0ZWQiLCBpKTsKKwkJCXJldCA9IEVJTlZBTDsKKwkJfQorCQkKKwkJaWYgKChpID09IDApICYmIChjb25uLT5jY190bHNfcGFyYS5jbikpIHsKKwkJCWlmICghZ251dGxzX3g1MDlfY3J0X2NoZWNrX2hvc3RuYW1lIChjZXJ0LCBjb25uLT5jY190bHNfcGFyYS5jbikpIHsKKwkJCQlMT0dfRSgiVExTOiBSZW1vdGUgY2VydGlmaWNhdGUgaW52YWxpZCBvbiBzb2NrZXQgJWQgKFJlbW90ZTogJyVzJykoQ29ubmVjdGlvbjogJyVzJykgOiIsIGNvbm4tPmNjX3NvY2tldCwgY29ubi0+Y2NfcmVtaWQsIGNvbm4tPmNjX2lkKTsKKwkJCQlMT0dfRSgiIC0gVGhlIGNlcnRpZmljYXRlIGhvc3RuYW1lIGRvZXMgbm90IG1hdGNoICclcyciLCBjb25uLT5jY190bHNfcGFyYS5jbik7CisJCQkJcmV0ID0gRUlOVkFMOworCQkJfQorCQl9CisJCQorCQlHTlVUTFNfVFJBQ0UoIGdudXRsc194NTA5X2NydF9kZWluaXQgKGNlcnQpICk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworI2Vsc2UgLyogR05VVExTX1ZFUlNJT05fMzAwICovCisKKy8qIFZlcmlmeSByZW1vdGUgY3JlZGVudGlhbHMgRFVSSU5HIGhhbmRzaGFrZSAocmV0dXJuIGdudXRscyBzdGF0dXMpICovCitpbnQgZmRfdGxzX3ZlcmlmeV9jcmVkZW50aWFsc18yKGdudXRsc19zZXNzaW9uX3Qgc2Vzc2lvbikKK3sKKwkvKiBpbnNwaXJlZCBmcm9tIGdudXRscyAzLnggZ3VpZGVsaW5lcyAqLworCXVuc2lnbmVkIGludCBzdGF0dXM7CisJY29uc3QgZ251dGxzX2RhdHVtX3QgKmNlcnRfbGlzdCA9IE5VTEw7CisJdW5zaWduZWQgaW50IGNlcnRfbGlzdF9zaXplOworCWdudXRsc194NTA5X2NydF90IGNlcnQ7CisJc3RydWN0IGNueGN0eCAqIGNvbm47CisJaW50IGhvc3RuYW1lX3ZlcmlmaWVkID0gMDsKKworCVRSQUNFX0VOVFJZKCIlcCIsIHNlc3Npb24pOworCQorCS8qIGdldCB0aGUgYXNzb2NpYXRlZCBjb25uZWN0aW9uICovCisJY29ubiA9IGdudXRsc19zZXNzaW9uX2dldF9wdHIgKHNlc3Npb24pOworCQorCS8qIFRyYWNlIHRoZSBzZXNzaW9uIGluZm9ybWF0aW9uIC0tIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9nbnV0bHMvbWFudWFsL2dudXRscy5odG1sI09idGFpbmluZy1zZXNzaW9uLWluZm9ybWF0aW9uICovCisjaWZkZWYgREVCVUcKKwkJY29uc3QgY2hhciAqdG1wOworCQlnbnV0bHNfY3JlZGVudGlhbHNfdHlwZV90IGNyZWQ7CisJCWdudXRsc19reF9hbGdvcml0aG1fdCBreDsKKwkJaW50IGRoZSwgZWNkaDsKKworCQlkaGUgPSBlY2RoID0gMDsKKworCQlMT0dfQSgiVExTIFNlc3Npb24gaW5mb3JtYXRpb24gZm9yIGNvbm5lY3Rpb24gJyVzJzoiLCBjb25uLT5jY19pZCk7CisJCQorCQkvKiBwcmludCB0aGUga2V5IGV4Y2hhbmdlJ3MgYWxnb3JpdGhtIG5hbWUKKwkJKi8KKwkJR05VVExTX1RSQUNFKCBreCA9IGdudXRsc19reF9nZXQgKHNlc3Npb24pICk7CisJCUdOVVRMU19UUkFDRSggdG1wID0gZ251dGxzX2t4X2dldF9uYW1lIChreCkgKTsKKwkJTE9HX0QoIlx0LSBLZXkgRXhjaGFuZ2U6ICVzIiwgdG1wKTsKKworCQkvKiBDaGVjayB0aGUgYXV0aGVudGljYXRpb24gdHlwZSB1c2VkIGFuZCBzd2l0Y2gKKwkJKiB0byB0aGUgYXBwcm9wcmlhdGUuCisJCSovCisJCUdOVVRMU19UUkFDRSggY3JlZCA9IGdudXRsc19hdXRoX2dldF90eXBlIChzZXNzaW9uKSApOworCQlzd2l0Y2ggKGNyZWQpCisJCXsKKwkJCWNhc2UgR05VVExTX0NSRF9JQToKKwkJCQlMT0dfRCgiXHQgLSBUTFMvSUEgc2Vzc2lvbiIpOworCQkJCWJyZWFrOworCisKKwkJCSNpZmRlZiBFTkFCTEVfU1JQCisJCQljYXNlIEdOVVRMU19DUkRfU1JQOgorCQkJCUxPR19EKCJcdCAtIFNSUCBzZXNzaW9uIHdpdGggdXNlcm5hbWUgJXMiLAorCQkJCQlnbnV0bHNfc3JwX3NlcnZlcl9nZXRfdXNlcm5hbWUgKHNlc3Npb24pKTsKKwkJCQlicmVhazsKKwkJCSNlbmRpZgorCisJCQljYXNlIEdOVVRMU19DUkRfUFNLOgorCQkJCS8qIFRoaXMgcmV0dXJucyBOVUxMIGluIHNlcnZlciBzaWRlLgorCQkJCSovCisJCQkJaWYgKGdudXRsc19wc2tfY2xpZW50X2dldF9oaW50IChzZXNzaW9uKSAhPSBOVUxMKQorCQkJCQlMT0dfRCgiXHQgLSBQU0sgYXV0aGVudGljYXRpb24uIFBTSyBoaW50ICclcyciLAorCQkJCQkJZ251dGxzX3Bza19jbGllbnRfZ2V0X2hpbnQgKHNlc3Npb24pKTsKKwkJCQkvKiBUaGlzIHJldHVybnMgTlVMTCBpbiBjbGllbnQgc2lkZS4KKwkJCQkqLworCQkJCWlmIChnbnV0bHNfcHNrX3NlcnZlcl9nZXRfdXNlcm5hbWUgKHNlc3Npb24pICE9IE5VTEwpCisJCQkJCUxPR19EKCJcdCAtIFBTSyBhdXRoZW50aWNhdGlvbi4gQ29ubmVjdGVkIGFzICclcyciLAorCQkJCQkJZ251dGxzX3Bza19zZXJ2ZXJfZ2V0X3VzZXJuYW1lIChzZXNzaW9uKSk7CisKKwkJCQlpZiAoa3ggPT0gR05VVExTX0tYX0VDREhFX1BTSykKKwkJCQkJZWNkaCA9IDE7CisJCQkJZWxzZSBpZiAoa3ggPT0gR05VVExTX0tYX0RIRV9QU0spCisJCQkJCWRoZSA9IDE7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgR05VVExTX0NSRF9BTk9OOiAgICAgIC8qIGFub255bW91cyBhdXRoZW50aWNhdGlvbiAqLworCQkJCUxPR19EKCJcdCAtIEFub255bW91cyBESCB1c2luZyBwcmltZSBvZiAlZCBiaXRzIiwKKwkJCQkJZ251dGxzX2RoX2dldF9wcmltZV9iaXRzIChzZXNzaW9uKSk7CisJCQkJaWYgKGt4ID09IEdOVVRMU19LWF9BTk9OX0VDREgpCisJCQkJCWVjZGggPSAxOworCQkJCWVsc2UgaWYgKGt4ID09IEdOVVRMU19LWF9BTk9OX0RIKQorCQkJCQlkaGUgPSAxOworCQkJCWJyZWFrOworCisJCQljYXNlIEdOVVRMU19DUkRfQ0VSVElGSUNBVEU6ICAgICAgIC8qIGNlcnRpZmljYXRlIGF1dGhlbnRpY2F0aW9uICovCisKKwkJCQkvKiBDaGVjayBpZiB3ZSBoYXZlIGJlZW4gdXNpbmcgZXBoZW1lcmFsIERpZmZpZS1IZWxsbWFuLgorCQkJCSovCisJCQkJaWYgKGt4ID09IEdOVVRMU19LWF9ESEVfUlNBIHx8IGt4ID09IEdOVVRMU19LWF9ESEVfRFNTKQorCQkJCQlkaGUgPSAxOworCQkJCWVsc2UgaWYgKGt4ID09IEdOVVRMU19LWF9FQ0RIRV9SU0EgfHwga3ggPT0gR05VVExTX0tYX0VDREhFX0VDRFNBKQorCQkJCQllY2RoID0gMTsKKwkJCQkKKwkJCQkvKiBOb3cgcHJpbnQgc29tZSBpbmZvIG9uIHRoZSByZW1vdGUgY2VydGlmaWNhdGUgKi8KKwkJCQlpZiAoZ251dGxzX2NlcnRpZmljYXRlX3R5cGVfZ2V0IChzZXNzaW9uKSA9PSBHTlVUTFNfQ1JUX1g1MDkpIHsKKwkJCQkJZ251dGxzX2RhdHVtX3QgY2luZm87CisKKwkJCQkJY2VydF9saXN0ID0gZ251dGxzX2NlcnRpZmljYXRlX2dldF9wZWVycyAoc2Vzc2lvbiwgJmNlcnRfbGlzdF9zaXplKTsKKworCQkJCQlMT0dfRCgiXHQgUGVlciBwcm92aWRlZCAlZCBjZXJ0aWZpY2F0ZXMuIiwgY2VydF9saXN0X3NpemUpOworCisJCQkJCWlmIChjZXJ0X2xpc3Rfc2l6ZSA+IDApCisJCQkJCXsKKwkJCQkJCWludCByZXQ7CisKKwkJCQkJCS8qIHdlIG9ubHkgcHJpbnQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZpcnN0IGNlcnRpZmljYXRlLgorCQkJCQkJKi8KKwkJCQkJCWdudXRsc194NTA5X2NydF9pbml0ICgmY2VydCk7CisKKwkJCQkJCWdudXRsc194NTA5X2NydF9pbXBvcnQgKGNlcnQsICZjZXJ0X2xpc3RbMF0sIEdOVVRMU19YNTA5X0ZNVF9ERVIpOworCisJCQkJCQkJCQkJCQlMT0dfQSgiXHQgQ2VydGlmaWNhdGUgaW5mbzoiKTsKKworCQkJCQkJLyogVGhpcyBpcyB0aGUgcHJlZmVycmVkIHdheSBvZiBwcmludGluZyBzaG9ydCBpbmZvcm1hdGlvbiBhYm91dAorCQkJCQkJIGEgY2VydGlmaWNhdGUuICovCisKKwkJCQkJCXJldCA9IGdudXRsc194NTA5X2NydF9wcmludCAoY2VydCwgR05VVExTX0NSVF9QUklOVF9PTkVMSU5FLCAmY2luZm8pOworCQkJCQkJaWYgKHJldCA9PSAwKQorCQkJCQkJeworCQkJCQkJICBMT0dfRCgiXHRcdCVzIiwgY2luZm8uZGF0YSk7CisJCQkJCQkgIGdudXRsc19mcmVlIChjaW5mby5kYXRhKTsKKwkJCQkJCX0KKwkJCQkJCQorCQkJCQkJaWYgKGNvbm4tPmNjX3Rsc19wYXJhLmNuKSB7CisJCQkJCQkJaWYgKCFnbnV0bHNfeDUwOV9jcnRfY2hlY2tfaG9zdG5hbWUgKGNlcnQsIGNvbm4tPmNjX3Rsc19wYXJhLmNuKSkgeworCQkJCQkJCQlMT0dfRSgiXHRUTFM6IFJlbW90ZSBjZXJ0aWZpY2F0ZSBpbnZhbGlkIG9uIHNvY2tldCAlZCAoUmVtb3RlOiAnJXMnKShDb25uZWN0aW9uOiAnJXMnKSA6IiwgY29ubi0+Y2Nfc29ja2V0LCBjb25uLT5jY19yZW1pZCwgY29ubi0+Y2NfaWQpOworCQkJCQkJCQlMT0dfRSgiXHQgLSBUaGUgY2VydGlmaWNhdGUgaG9zdG5hbWUgZG9lcyBub3QgbWF0Y2ggJyVzJyIsIGNvbm4tPmNjX3Rsc19wYXJhLmNuKTsKKwkJCQkJCQkJZ251dGxzX3g1MDlfY3J0X2RlaW5pdCAoY2VydCk7CisJCQkJCQkJCXJldHVybiBHTlVUTFNfRV9DRVJUSUZJQ0FURV9FUlJPUjsKKwkJCQkJCQl9CisJCQkJCQkJCisJCQkJCQl9CisKKwkJCQkJCWhvc3RuYW1lX3ZlcmlmaWVkID0gMTsKKworCQkJCQkJZ251dGxzX3g1MDlfY3J0X2RlaW5pdCAoY2VydCk7CisKKwkJCQkJfQorICAgIAkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJTE9HX0UoIlx0IC0gdW5rbm93biBzZXNzaW9uIHR5cGUgKCVkKSIsIGNyZWQpOworCisJCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzd2l0Y2ggKi8KKworCQlpZiAoZWNkaCAhPSAwKQorCQkJTE9HX0QoIlx0IC0gRXBoZW1lcmFsIEVDREggdXNpbmcgY3VydmUgJXMiLAorCQkJCWdudXRsc19lY2NfY3VydmVfZ2V0X25hbWUgKGdudXRsc19lY2NfY3VydmVfZ2V0IChzZXNzaW9uKSkpOworCQllbHNlIGlmIChkaGUgIT0gMCkKKwkJCUxPR19EKCJcdCAtIEVwaGVtZXJhbCBESCB1c2luZyBwcmltZSBvZiAlZCBiaXRzIiwKKwkJCQlnbnV0bHNfZGhfZ2V0X3ByaW1lX2JpdHMgKHNlc3Npb24pKTsKKworCQkvKiBwcmludCB0aGUgcHJvdG9jb2wncyBuYW1lIChpZSBUTFMgMS4wKSAKKwkJKi8KKwkJdG1wID0gZ251dGxzX3Byb3RvY29sX2dldF9uYW1lIChnbnV0bHNfcHJvdG9jb2xfZ2V0X3ZlcnNpb24gKHNlc3Npb24pKTsKKwkJTE9HX0QoIlx0IC0gUHJvdG9jb2w6ICVzIiwgdG1wKTsKKworCQkvKiBwcmludCB0aGUgY2VydGlmaWNhdGUgdHlwZSBvZiB0aGUgcGVlci4KKwkJKiBpZSBYLjUwOQorCQkqLworCQl0bXAgPSBnbnV0bHNfY2VydGlmaWNhdGVfdHlwZV9nZXRfbmFtZSAoZ251dGxzX2NlcnRpZmljYXRlX3R5cGVfZ2V0IChzZXNzaW9uKSk7CisJCUxPR19EKCJcdCAtIENlcnRpZmljYXRlIFR5cGU6ICVzIiwgdG1wKTsKKworCQkvKiBwcmludCB0aGUgY29tcHJlc3Npb24gYWxnb3JpdGhtIChpZiBhbnkpCisJCSovCisJCXRtcCA9IGdudXRsc19jb21wcmVzc2lvbl9nZXRfbmFtZSAoZ251dGxzX2NvbXByZXNzaW9uX2dldCAoc2Vzc2lvbikpOworCQlMT0dfRCgiXHQgLSBDb21wcmVzc2lvbjogJXMiLCB0bXApOworCisJCS8qIHByaW50IHRoZSBuYW1lIG9mIHRoZSBjaXBoZXIgdXNlZC4KKwkJKiBpZSAzREVTLgorCQkqLworCQl0bXAgPSBnbnV0bHNfY2lwaGVyX2dldF9uYW1lIChnbnV0bHNfY2lwaGVyX2dldCAoc2Vzc2lvbikpOworCQlMT0dfRCgiXHQgLSBDaXBoZXI6ICVzIiwgdG1wKTsKKworCQkvKiBQcmludCB0aGUgTUFDIGFsZ29yaXRobXMgbmFtZS4KKwkJKiBpZSBTSEExCisJCSovCisJCXRtcCA9IGdudXRsc19tYWNfZ2V0X25hbWUgKGdudXRsc19tYWNfZ2V0IChzZXNzaW9uKSk7CisJCUxPR19EKCJcdCAtIE1BQzogJXMiLCB0bXApOworCQorI2VuZGlmIC8qIERFQlVHICovCQkKKworCS8qIFRoaXMgdmVyaWZpY2F0aW9uIGZ1bmN0aW9uIHVzZXMgdGhlIHRydXN0ZWQgQ0FzIGluIHRoZSBjcmVkZW50aWFscworCSogc3RydWN0dXJlLiBTbyB5b3UgbXVzdCBoYXZlIGluc3RhbGxlZCBvbmUgb3IgbW9yZSBDQSBjZXJ0aWZpY2F0ZXMuCisJKi8KKwlDSEVDS19HTlVUTFNfRE8oIGdudXRsc19jZXJ0aWZpY2F0ZV92ZXJpZnlfcGVlcnMyIChzZXNzaW9uLCAmc3RhdHVzKSwgcmV0dXJuIEdOVVRMU19FX0NFUlRJRklDQVRFX0VSUk9SICk7CisJaWYgKHN0YXR1cyAmIEdOVVRMU19DRVJUX0lOVkFMSUQpIHsKKwkJTE9HX0UoIlRMUzogUmVtb3RlIGNlcnRpZmljYXRlIGludmFsaWQgb24gc29ja2V0ICVkIChSZW1vdGU6ICclcycpKENvbm5lY3Rpb246ICclcycpIDoiLCBjb25uLT5jY19zb2NrZXQsIGNvbm4tPmNjX3JlbWlkLCBjb25uLT5jY19pZCk7CisJCWlmIChzdGF0dXMgJiBHTlVUTFNfQ0VSVF9TSUdORVJfTk9UX0ZPVU5EKQorCQkJTE9HX0UoIiAtIFRoZSBjZXJ0aWZpY2F0ZSBoYXNuJ3QgZ290IGEga25vd24gaXNzdWVyLiIpOworCisJCWlmIChzdGF0dXMgJiBHTlVUTFNfQ0VSVF9SRVZPS0VEKQorCQkJTE9HX0UoIiAtIFRoZSBjZXJ0aWZpY2F0ZSBoYXMgYmVlbiByZXZva2VkLiIpOworCisJCWlmIChzdGF0dXMgJiBHTlVUTFNfQ0VSVF9FWFBJUkVEKQorCQkJTE9HX0UoIiAtIFRoZSBjZXJ0aWZpY2F0ZSBoYXMgZXhwaXJlZC4iKTsKKworCQlpZiAoc3RhdHVzICYgR05VVExTX0NFUlRfTk9UX0FDVElWQVRFRCkKKwkJCUxPR19FKCIgLSBUaGUgY2VydGlmaWNhdGUgaXMgbm90IHlldCBhY3RpdmF0ZWQuIik7CisJfQkKKwlpZiAoc3RhdHVzICYgR05VVExTX0NFUlRfSU5WQUxJRCkKKwl7CisJCXJldHVybiBHTlVUTFNfRV9DRVJUSUZJQ0FURV9FUlJPUjsKKwl9CisJCisJLyogVXAgdG8gaGVyZSB0aGUgcHJvY2VzcyBpcyB0aGUgc2FtZSBmb3IgWC41MDkgY2VydGlmaWNhdGVzIGFuZAorCSogT3BlblBHUCBrZXlzLiBGcm9tIG5vdyBvbiBYLjUwOSBjZXJ0aWZpY2F0ZXMgYXJlIGFzc3VtZWQuIFRoaXMgY2FuCisJKiBiZSBlYXNpbHkgZXh0ZW5kZWQgdG8gd29yayB3aXRoIG9wZW5wZ3Aga2V5cyBhcyB3ZWxsLgorCSovCisJaWYgKCghaG9zdG5hbWVfdmVyaWZpZWQpICYmIChjb25uLT5jY190bHNfcGFyYS5jbikpIHsKKwkJaWYgKGdudXRsc19jZXJ0aWZpY2F0ZV90eXBlX2dldCAoc2Vzc2lvbikgIT0gR05VVExTX0NSVF9YNTA5KSB7CisJCQlMT0dfRSgiVExTOiBSZW1vdGUgY3JlZGVudGlhbHMgYXJlIG5vdCB4NTA5LCByZWplY3RlZCBvbiBzb2NrZXQgJWQgKFJlbW90ZTogJyVzJykoQ29ubmVjdGlvbjogJyVzJykgOiIsIGNvbm4tPmNjX3NvY2tldCwgY29ubi0+Y2NfcmVtaWQsIGNvbm4tPmNjX2lkKTsKKwkJCXJldHVybiBHTlVUTFNfRV9DRVJUSUZJQ0FURV9FUlJPUjsKKwkJfQorCisJCUNIRUNLX0dOVVRMU19ETyggZ251dGxzX3g1MDlfY3J0X2luaXQgKCZjZXJ0KSwgcmV0dXJuIEdOVVRMU19FX0NFUlRJRklDQVRFX0VSUk9SICk7CisKKwkJY2VydF9saXN0ID0gZ251dGxzX2NlcnRpZmljYXRlX2dldF9wZWVycyAoc2Vzc2lvbiwgJmNlcnRfbGlzdF9zaXplKTsKKwkJQ0hFQ0tfUEFSQU1TX0RPKCBjZXJ0X2xpc3QsIHJldHVybiBHTlVUTFNfRV9DRVJUSUZJQ0FURV9FUlJPUiApOworCisJCUNIRUNLX0dOVVRMU19ETyggZ251dGxzX3g1MDlfY3J0X2ltcG9ydCAoY2VydCwgJmNlcnRfbGlzdFswXSwgR05VVExTX1g1MDlfRk1UX0RFUiksIHJldHVybiBHTlVUTFNfRV9DRVJUSUZJQ0FURV9FUlJPUiApOworCisJCWlmICghZ251dGxzX3g1MDlfY3J0X2NoZWNrX2hvc3RuYW1lIChjZXJ0LCBjb25uLT5jY190bHNfcGFyYS5jbikpIHsKKwkJCUxPR19FKCJUTFM6IFJlbW90ZSBjZXJ0aWZpY2F0ZSBpbnZhbGlkIG9uIHNvY2tldCAlZCAoUmVtb3RlOiAnJXMnKShDb25uZWN0aW9uOiAnJXMnKSA6IiwgY29ubi0+Y2Nfc29ja2V0LCBjb25uLT5jY19yZW1pZCwgY29ubi0+Y2NfaWQpOworCQkJTE9HX0UoIiAtIFRoZSBjZXJ0aWZpY2F0ZSBob3N0bmFtZSBkb2VzIG5vdCBtYXRjaCAnJXMnIiwgY29ubi0+Y2NfdGxzX3BhcmEuY24pOworCQkJZ251dGxzX3g1MDlfY3J0X2RlaW5pdCAoY2VydCk7CisJCQlyZXR1cm4gR05VVExTX0VfQ0VSVElGSUNBVEVfRVJST1I7CisJCX0KKworCQlnbnV0bHNfeDUwOV9jcnRfZGVpbml0IChjZXJ0KTsKKwl9CisKKwkvKiBub3RpZnkgZ251dGxzIHRvIGNvbnRpbnVlIGhhbmRzaGFrZSBub3JtYWxseSAqLworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogR05VVExTX1ZFUlNJT05fMzAwICovCisKK3N0YXRpYyBpbnQgZmRfY254X21heV9kdGxzKHN0cnVjdCBjbnhjdHggKiBjb25uKSB7CisjaWZuZGVmIERJU0FCTEVfU0NUUAorCWlmICgoY29ubi0+Y2NfcHJvdG8gPT0gSVBQUk9UT19TQ1RQKSAmJiAoY29ubi0+Y2NfdGxzX3BhcmEuYWxnbyA9PSBBTEdPX0hBTkRTSEFLRV9ERUZBVUxUKSkKKwkJcmV0dXJuIDE7CisjZW5kaWYgLyogRElTQUJMRV9TQ1RQICovCisJcmV0dXJuIDA7Cit9CisKKyNpZm5kZWYgRElTQUJMRV9TQ1RQCitzdGF0aWMgaW50IGZkX2NueF91c2VzX2R0bHMoc3RydWN0IGNueGN0eCAqIGNvbm4pIHsKKwlyZXR1cm4gZmRfY254X21heV9kdGxzKGNvbm4pICYmIChmZF9jbnhfdGVzdHN0YXRlKGNvbm4sIENDX1NUQVRVU19UTFMpKTsKK30KKyNlbmRpZiAvKiBESVNBQkxFX1NDVFAgKi8KKworLyogVExTIGhhbmRzaGFrZSBhIGNvbm5lY3Rpb247IG5vIG5lZWQgdG8gaGF2ZSBjYWxsZWQgc3RhcnRfY2xlYXIgYmVmb3JlLiBSZWNlcHRpb24gaXMgYWN0aXZlIGlmIGhhbmRoc2FrZSBpcyBzdWNjZXNzZnVsICovCitpbnQgZmRfY254X2hhbmRzaGFrZShzdHJ1Y3QgY254Y3R4ICogY29ubiwgaW50IG1vZGUsIGludCBhbGdvLCBjaGFyICogcHJpb3JpdHksIHZvaWQgKiBhbHRfY3JlZHMpCit7CisJaW50IGR0bHMgPSAwOworCQorCVRSQUNFX0VOVFJZKCAiJXAgJWQgJWQgJXAgJXAiLCBjb25uLCBtb2RlLCBhbGdvLCBwcmlvcml0eSwgYWx0X2NyZWRzKTsKKwlDSEVDS19QQVJBTVMoIGNvbm4gJiYgKCFmZF9jbnhfdGVzdHN0YXRlKGNvbm4sIENDX1NUQVRVU19UTFMpKSAmJiAoIChtb2RlID09IEdOVVRMU19DTElFTlQpIHx8IChtb2RlID09IEdOVVRMU19TRVJWRVIpICkgJiYgKCFjb25uLT5jY19sb29wKSApOworCisJLyogU2F2ZSB0aGUgbW9kZSAqLworCWNvbm4tPmNjX3Rsc19wYXJhLm1vZGUgPSBtb2RlOworCWNvbm4tPmNjX3Rsc19wYXJhLmFsZ28gPSBhbGdvOworCQorCS8qIENhbmNlbCByZWNlaXZpbmcgdGhyZWFkIGlmIGFueSAtLSBpdCBzaG91bGQgYWxyZWFkeSBiZSB0ZXJtaW5hdGVkIGFueXdheSwgd2UganVzdCByZWxlYXNlIHRoZSByZXNvdXJjZXMgKi8KKwlDSEVDS19GQ1RfRE8oIGZkX3Rocl90ZXJtKCZjb25uLT5jY19yY3Z0aHIpLCAvKiBjb250aW51ZSAqLyk7CisJCisJLyogT25jZSBUTFMgaGFuZHNoYWtlIGlzIGRvbmUsIHdlIGRvbid0IHN0b3AgYWZ0ZXIgdGhlIGZpcnN0IG1lc3NhZ2UgKi8KKwljb25uLT5jY19sb29wID0gMTsKKwkKKwlkdGxzID0gZmRfY254X21heV9kdGxzKGNvbm4pOworCQorCS8qIFByZXBhcmUgdGhlIG1hc3RlciBzZXNzaW9uIGNyZWRlbnRpYWxzIGFuZCBwcmlvcml0eSAqLworCUNIRUNLX0ZDVCggZmRfdGxzX3ByZXBhcmUoJmNvbm4tPmNjX3Rsc19wYXJhLnNlc3Npb24sIG1vZGUsIGR0bHMsIHByaW9yaXR5LCBhbHRfY3JlZHMpICk7CisKKwkvKiBTcGVjaWFsIGNhc2U6IG11bHRpLXN0cmVhbSBUTFMgaXMgbm90IG5hdGl2ZWx5IG1hbmFnZWQgaW4gR05VIFRMUywgd2UgdXNlIGEgd3JhcHBlciBsaWJyYXJ5ICovCisJaWYgKCghZHRscykgJiYgKGNvbm4tPmNjX3NjdHBfcGFyYS5wYWlycyA+IDEpKSB7CisjaWZkZWYgRElTQUJMRV9TQ1RQCisJCUFTU0VSVCgwKTsKKwkJQ0hFQ0tfRkNUKCBFTk9UU1VQICk7CisjZWxzZSAvKiBESVNBQkxFX1NDVFAgKi8KKwkJLyogSW5pdGlhbGl6ZSB0aGUgd3JhcHBlciwgc3RhcnQgdGhlIGRlbXV4IHRocmVhZCAqLworCQlDSEVDS19GQ1QoIGZkX3NjdHAzNDM2X2luaXQoY29ubikgKTsKKyNlbmRpZiAvKiBESVNBQkxFX1NDVFAgKi8KKwl9IGVsc2UgeworCQkvKiBTZXQgdGhlIHRyYW5zcG9ydCBwb2ludGVyIHBhc3NlZCB0byBwdXNoICYgcHVsbCBjYWxsYmFja3MgKi8KKwkJR05VVExTX1RSQUNFKCBnbnV0bHNfdHJhbnNwb3J0X3NldF9wdHIoIGNvbm4tPmNjX3Rsc19wYXJhLnNlc3Npb24sIChnbnV0bHNfdHJhbnNwb3J0X3B0cl90KSBjb25uICkgKTsKKworCQkvKiBTZXQgdGhlIHB1c2ggYW5kIHB1bGwgY2FsbGJhY2tzICovCisJCWlmICghZHRscykgeworCQkJI2lmZGVmIEdOVVRMU19WRVJTSU9OXzMwMAorCQkJR05VVExTX1RSQUNFKCBnbnV0bHNfdHJhbnNwb3J0X3NldF9wdWxsX3RpbWVvdXRfZnVuY3Rpb24oIGNvbm4tPmNjX3Rsc19wYXJhLnNlc3Npb24sICh2b2lkICopZmRfY254X3Nfc2VsZWN0ICkgKTsKKwkJCSNlbmRpZiAvKiBHTlVUTFNfVkVSU0lPTl8zMDAgKi8KKwkJCUdOVVRMU19UUkFDRSggZ251dGxzX3RyYW5zcG9ydF9zZXRfcHVsbF9mdW5jdGlvbihjb25uLT5jY190bHNfcGFyYS5zZXNzaW9uLCAodm9pZCAqKWZkX2NueF9zX3JlY3YpICk7CisJCQkjaWZuZGVmIEdOVVRMU19WRVJTSU9OXzIxMgorCQkJR05VVExTX1RSQUNFKCBnbnV0bHNfdHJhbnNwb3J0X3NldF9wdXNoX2Z1bmN0aW9uKGNvbm4tPmNjX3Rsc19wYXJhLnNlc3Npb24sICh2b2lkICopZmRfY254X3Nfc2VuZCkgKTsKKwkJCSNlbHNlIC8qIEdOVVRMU19WRVJTSU9OXzIxMiAqLworCQkJR05VVExTX1RSQUNFKCBnbnV0bHNfdHJhbnNwb3J0X3NldF92ZWNfcHVzaF9mdW5jdGlvbihjb25uLT5jY190bHNfcGFyYS5zZXNzaW9uLCAodm9pZCAqKWZkX2NueF9zX3NlbmR2KSApOworCQkJI2VuZGlmIC8qIEdOVVRMU19WRVJTSU9OXzIxMiAqLworCQl9IGVsc2UgeworCQkJVE9ETygiRFRMUyBwdXNoL3B1bGwgZnVuY3Rpb25zIik7CisJCQlyZXR1cm4gRU5PVFNVUDsKKwkJfQorCX0KKwkKKwkvKiBhZGRpdGlvbmFsIGluaXRpYWxpemF0aW9uIGZvciBnbnV0bHMgMy54ICovCisJI2lmZGVmIEdOVVRMU19WRVJTSU9OXzMwMAorCQkvKiB0aGUgdmVyaWZ5IGZ1bmN0aW9uIGhhcyBhbHJlYWR5IGJlZW4gc2V0IGluIHRoZSBnbG9iYWwgaW5pdGlhbGl6YXRpb24gaW4gY29uZmlnLmMgKi8KKwkKKwkvKiBmZF90bHNfdmVyaWZ5X2NyZWRlbnRpYWxzXzIgdXNlcyB0aGUgY29ubmVjdGlvbiAqLworCWdudXRsc19zZXNzaW9uX3NldF9wdHIgKGNvbm4tPmNjX3Rsc19wYXJhLnNlc3Npb24sICh2b2lkICopIGNvbm4pOworCQorCWlmICgoY29ubi0+Y2NfdGxzX3BhcmEuY24gIT0gTlVMTCkgJiYgKG1vZGUgPT0gR05VVExTX0NMSUVOVCkpIHsKKwkJLyogdGhpcyBtaWdodCBhbGxvdyB2aXJ0dWFsIGhvc3Rpbmcgb24gdGhlIHJlbW90ZSBwZWVyICovCisJCUNIRUNLX0dOVVRMU19ETyggZ251dGxzX3NlcnZlcl9uYW1lX3NldCAoY29ubi0+Y2NfdGxzX3BhcmEuc2Vzc2lvbiwgR05VVExTX05BTUVfRE5TLCBjb25uLT5jY190bHNfcGFyYS5jbiwgc3RybGVuKGNvbm4tPmNjX3Rsc19wYXJhLmNuKSksIC8qIGlnbm9yZSBmYWlsdXJlICovKTsKKwl9CisJCisJI2VuZGlmIC8qIEdOVVRMU19WRVJTSU9OXzMwMCAqLworCisJI2lmZGVmIEdOVVRMU19WRVJTSU9OXzMxMAorCUdOVVRMU19UUkFDRSggZ251dGxzX2hhbmRzaGFrZV9zZXRfdGltZW91dCggY29ubi0+Y2NfdGxzX3BhcmEuc2Vzc2lvbiwgR05VVExTX0RFRkFVTFRfSEFORFNIQUtFX1RJTUVPVVQpKTsKKwkjZW5kaWYgLyogR05VVExTX1ZFUlNJT05fMzEwICovCisJCisJLyogTWFyayB0aGUgY29ubmVjdGlvbiBhcyBwcm90ZWN0ZWQgZnJvbSBoZXJlLCBzbyB0aGF0IHRoZSBnbnV0bHMgY3JlZGVudGlhbHMgd2lsbCBiZSBmcmVlZCAqLworCWZkX2NueF9hZGRzdGF0ZShjb25uLCBDQ19TVEFUVVNfVExTKTsKKwkKKwkvKiBIYW5kc2hha2UgbWFzdGVyIHNlc3Npb24gKi8KKwl7CisJCWludCByZXQ7CisJCisJCUNIRUNLX0dOVVRMU19ETyggcmV0ID0gZ251dGxzX2hhbmRzaGFrZShjb25uLT5jY190bHNfcGFyYS5zZXNzaW9uKSwKKwkJCXsKKwkJCQlpZiAoVFJBQ0VfQk9PTChJTkZPKSkgeworCQkJCQlmZF9sb2dfZGVidWcoIlRMUyBIYW5kc2hha2UgZmFpbGVkIG9uIHNvY2tldCAlZCAoJXMpIDogJXMiLCBjb25uLT5jY19zb2NrZXQsIGNvbm4tPmNjX2lkLCBnbnV0bHNfc3RyZXJyb3IocmV0KSk7CisJCQkJfQorCQkJCWZkX2NueF9tYXJrZXJyb3IoY29ubik7CisJCQkJcmV0dXJuIEVJTlZBTDsKKwkJCX0gKTsKKworCQkjaWZuZGVmIEdOVVRMU19WRVJTSU9OXzMwMAorCQkvKiBOb3cgdmVyaWZ5IHRoZSByZW1vdGUgY3JlZGVudGlhbHMgYXJlIHZhbGlkIC0tIG9ubHkgc2ltcGxlIHRlc3RzIGhlcmUgKi8KKwkJQ0hFQ0tfRkNUX0RPKCBmZF90bHNfdmVyaWZ5X2NyZWRlbnRpYWxzKGNvbm4tPmNjX3Rsc19wYXJhLnNlc3Npb24sIGNvbm4sIDEpLCAKKwkJCXsgIAorCQkJCUNIRUNLX0dOVVRMU19ETyggZ251dGxzX2J5ZShjb25uLT5jY190bHNfcGFyYS5zZXNzaW9uLCBHTlVUTFNfU0hVVF9SRFdSKSwgICk7CisJCQkJZmRfY254X21hcmtlcnJvcihjb25uKTsKKwkJCQlyZXR1cm4gRUlOVkFMOworCQkJfSk7CisJCSNlbmRpZiAvKiBHTlVUTFNfVkVSU0lPTl8zMDAgKi8KKwl9CisJCisJLyogTXVsdGktc3RyZWFtIFRMUzogaGFuZHNoYWtlIG90aGVyIHN0cmVhbXMgYXMgd2VsbCAqLworCWlmICgoIWR0bHMpICYmIChjb25uLT5jY19zY3RwX3BhcmEucGFpcnMgPiAxKSkgeworI2lmbmRlZiBESVNBQkxFX1NDVFAKKwkJLyogU3RhcnQgcmVhZGluZyB0aGUgbWVzc2FnZXMgZnJvbSB0aGUgbWFzdGVyIHNlc3Npb24uIFRoYXQgd2F5LCBpZiB0aGUgcmVtb3RlIHBlZXIgY2xvc2VkLCB3ZSBhcmUgbm90IHN0dWNrIGluc2lkZSBoYW5kc2hha2UgKi8KKwkJQ0hFQ0tfRkNUKGZkX3NjdHAzNDM2X3N0YXJ0dGhyZWFkcyhjb25uLCAwKSk7CisKKwkJLyogUmVzdW1lIGFsbCBhZGRpdGlvbmFsIHNlc3Npb25zIGZyb20gdGhlIG1hc3RlciBvbmUuICovCisJCUNIRUNLX0ZDVChmZF9zY3RwMzQzNl9oYW5kc2hha2Vfb3RoZXJzKGNvbm4sIHByaW9yaXR5LCBhbHRfY3JlZHMpKTsKKworCQkvKiBTdGFydCBkZWNyeXB0aW5nIHRoZSBtZXNzYWdlcyBmcm9tIGFsbCB0aHJlYWRzIGFuZCBxdWV1aW5nIHRoZW0gaW4gdGFyZ2V0IHF1ZXVlICovCisJCUNIRUNLX0ZDVChmZF9zY3RwMzQzNl9zdGFydHRocmVhZHMoY29ubiwgMSkpOworI2VuZGlmIC8qIERJU0FCTEVfU0NUUCAqLworCX0gZWxzZSB7CisJCS8qIFN0YXJ0IGRlY3J5cHRpbmcgdGhlIGRhdGEgKi8KKwkJaWYgKCFkdGxzKSB7CisJCQlDSEVDS19QT1NJWCggcHRocmVhZF9jcmVhdGUoICZjb25uLT5jY19yY3Z0aHIsIE5VTEwsIHJjdnRocl90bHNfc2luZ2xlLCBjb25uICkgKTsKKwkJfSBlbHNlIHsKKwkJCVRPRE8oIlNpZ25hbCB0aGUgZHRsc19wdXNoIGZ1bmN0aW9uIHRoYXQgbXVsdGlwbGUgc3RyZWFtcyBjYW4gYmUgdXNlZCBmcm9tIHRoaXMgcG9pbnQuIik7CisJCQlUT0RPKCJDcmVhdGUgRFRMUyByY3Z0aHIgKG11c3QgcmVhc3NlbWJseSBiYXNlZCBvbiBzZXEgbnVtYmVycyAmIHN0cmVhbSBpZCA/KSIpOworCQkJcmV0dXJuIEVOT1RTVVA7CisJCX0KKwl9CisJCisJcmV0dXJuIDA7Cit9CisKKy8qIFJldHJpZXZlIFRMUyBjcmVkZW50aWFscyBvZiB0aGUgcmVtb3RlIHBlZXIsIGFmdGVyIGhhbmRzaGFrZSAqLworaW50IGZkX2NueF9nZXRjcmVkKHN0cnVjdCBjbnhjdHggKiBjb25uLCBjb25zdCBnbnV0bHNfZGF0dW1fdCAqKmNlcnRfbGlzdCwgdW5zaWduZWQgaW50ICpjZXJ0X2xpc3Rfc2l6ZSkKK3sKKwlUUkFDRV9FTlRSWSgiJXAgJXAgJXAiLCBjb25uLCBjZXJ0X2xpc3QsIGNlcnRfbGlzdF9zaXplKTsKKwlDSEVDS19QQVJBTVMoIGNvbm4gJiYgZmRfY254X3Rlc3RzdGF0ZShjb25uLCBDQ19TVEFUVVNfVExTKSAmJiBjZXJ0X2xpc3QgJiYgY2VydF9saXN0X3NpemUgKTsKKwkKKwkvKiBUaGlzIGZ1bmN0aW9uIG9ubHkgd29ya3MgZm9yIFguNTA5IGNlcnRpZmljYXRlcy4gKi8KKwlDSEVDS19QQVJBTVMoIGdudXRsc19jZXJ0aWZpY2F0ZV90eXBlX2dldCAoY29ubi0+Y2NfdGxzX3BhcmEuc2Vzc2lvbikgPT0gR05VVExTX0NSVF9YNTA5ICk7CisJCisJR05VVExTX1RSQUNFKCAqY2VydF9saXN0ID0gZ251dGxzX2NlcnRpZmljYXRlX2dldF9wZWVycyAoY29ubi0+Y2NfdGxzX3BhcmEuc2Vzc2lvbiwgY2VydF9saXN0X3NpemUpICk7CisJaWYgKCpjZXJ0X2xpc3QgPT0gTlVMTCkgeworCQlUUkFDRV9ERUJVRyhJTkZPLCAiTm8gY2VydGlmaWNhdGUgd2FzIHByb3ZpZGVkIGJ5IHJlbW90ZSBwZWVyIC8gYW4gZXJyb3Igb2NjdXJyZWQuIik7CisJCXJldHVybiBFSU5WQUw7CisJfQorCisJVFJBQ0VfREVCVUcoIEZVTEwsICJTYXZlZCBjZXJ0aWZpY2F0ZSBjaGFpbiAoJWQgY2VydGlmaWNhdGVzKSBpbiBwZWVyIHN0cnVjdHVyZS4iLCAqY2VydF9saXN0X3NpemUpOworCQorCXJldHVybiAwOworfQorCisvKiBSZWNlaXZlIG5leHQgbWVzc2FnZS4gaWYgdGltZW91dCBpcyBub3QgTlVMTCwgd2FpdCBvbmx5IHVudGlsIHRpbWVvdXQuIFRoaXMgZnVuY3Rpb24gb25seSBwdWxscyBmcm9tIGEgcXVldWUsIG1nciB0aHJlYWQgaXMgZmlsbGluZyB0aGF0IHF1ZXVlIGF5bmNocm91bm91c2x5LiAqLworLyogaWYgdGhlIGFsdGZpZm8gaGFzIGJlZW4gc2V0IG9uIHRoaXMgY29ubiBvYmplY3QsIHRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgY2FsbGVkICovCitpbnQgZmRfY254X3JlY2VpdmUoc3RydWN0IGNueGN0eCAqIGNvbm4sIHN0cnVjdCB0aW1lc3BlYyAqIHRpbWVvdXQsIHVuc2lnbmVkIGNoYXIgKipidWYsIHNpemVfdCAqIGxlbikKK3sKKwlpbnQgICAgZXY7CisJc2l6ZV90IGV2X3N6OworCXZvaWQgKiBldl9kYXRhOworCQorCVRSQUNFX0VOVFJZKCIlcCAlcCAlcCAlcCIsIGNvbm4sIHRpbWVvdXQsIGJ1ZiwgbGVuKTsKKwlDSEVDS19QQVJBTVMoY29ubiAmJiAoY29ubi0+Y2Nfc29ja2V0ID4gMCkgJiYgYnVmICYmIGxlbik7CisJQ0hFQ0tfUEFSQU1TKGNvbm4tPmNjX3JjdnRociAhPSAocHRocmVhZF90KU5VTEwpOworCUNIRUNLX1BBUkFNUyhjb25uLT5jY19hbHQgPT0gTlVMTCk7CisKKwkvKiBOb3csIHB1bGwgdGhlIGZpcnN0IGV2ZW50ICovCitnZXRfbmV4dDoKKwlpZiAodGltZW91dCkgeworCQlDSEVDS19GQ1QoIGZkX2V2ZW50X3RpbWVkZ2V0KGNvbm4tPmNjX2luY29taW5nLCB0aW1lb3V0LCBGREVWUF9QU01fVElNRU9VVCwgJmV2LCAmZXZfc3osICZldl9kYXRhKSApOworCX0gZWxzZSB7CisJCUNIRUNLX0ZDVCggZmRfZXZlbnRfZ2V0KGNvbm4tPmNjX2luY29taW5nLCAmZXYsICZldl9zeiwgJmV2X2RhdGEpICk7CisJfQorCQorCXN3aXRjaCAoZXYpIHsKKwkJY2FzZSBGREVWUF9DTlhfTVNHX1JFQ1Y6CisJCQkvKiBXZSBnb3Qgb25lICovCisJCQkqbGVuID0gZXZfc3o7CisJCQkqYnVmID0gZXZfZGF0YTsKKwkJCXJldHVybiAwOworCQkJCisJCWNhc2UgRkRFVlBfUFNNX1RJTUVPVVQ6CisJCQlUUkFDRV9ERUJVRyhGVUxMLCAiVGltZW91dCBldmVudCByZWNlaXZlZCIpOworCQkJcmV0dXJuIEVUSU1FRE9VVDsKKwkJCQorCQljYXNlIEZERVZQX0NOWF9FUF9DSEFOR0U6CisJCQkvKiBXZSBpZ25vcmUgdGhpcyBldmVudCAqLworCQkJZ290byBnZXRfbmV4dDsKKwkJCQorCQljYXNlIEZERVZQX0NOWF9FUlJPUjoKKwkJCVRSQUNFX0RFQlVHKEZVTEwsICJSZWNlaXZlZCBFUlJPUiBldmVudCBvbiB0aGUgY29ubmVjdGlvbiIpOworCQkJcmV0dXJuIEVOT1RDT05OOworCX0KKwkKKwlUUkFDRV9ERUJVRyhJTkZPLCAiUmVjZWl2ZWQgdW5leHBlY3RlZCBldmVudCAlZCAoJXMpIiwgZXYsIGZkX3Bldl9zdHIoZXYpKTsKKwlyZXR1cm4gRUlOVkFMOworfQorCisvKiBXaGVyZSB0aGUgZXZlbnRzIGFyZSBzZW50ICovCitzdHJ1Y3QgZmlmbyAqIGZkX2NueF90YXJnZXRfcXVldWUoc3RydWN0IGNueGN0eCAqIGNvbm4pCit7CisJc3RydWN0IGZpZm8gKnE7CisJQ0hFQ0tfUE9TSVhfRE8oIHB0aHJlYWRfbXV0ZXhfbG9jaygmc3RhdGVfbG9jayksIHsgQVNTRVJUKDApOyB9ICk7CisJcSA9IGNvbm4tPmNjX2FsdCA/OiBjb25uLT5jY19pbmNvbWluZzsKKwlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9tdXRleF91bmxvY2soJnN0YXRlX2xvY2spLCB7IEFTU0VSVCgwKTsgfSApOworCXJldHVybiBxOworfQorCisvKiBTZXQgYW4gYWx0ZXJuYXRlIEZJRk8gbGlzdCB0byBzZW5kIEZERVZQX0NOWF8qIGV2ZW50cyB0byAqLworaW50IGZkX2NueF9yZWN2X3NldGFsdGZpZm8oc3RydWN0IGNueGN0eCAqIGNvbm4sIHN0cnVjdCBmaWZvICogYWx0X2ZpZm8pCit7CisJaW50IHJldDsKKwlUUkFDRV9FTlRSWSggIiVwICVwIiwgY29ubiwgYWx0X2ZpZm8gKTsKKwlDSEVDS19QQVJBTVMoIGNvbm4gJiYgYWx0X2ZpZm8gJiYgY29ubi0+Y2NfaW5jb21pbmcgKTsKKwkKKwkvKiBUaGUgbWFnaWMgZnVuY3Rpb24gZG9lcyBpdCBhbGwgKi8KKwlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9tdXRleF9sb2NrKCZzdGF0ZV9sb2NrKSwgeyBBU1NFUlQoMCk7IH0gKTsKKwlDSEVDS19GQ1RfRE8oIHJldCA9IGZkX2ZpZm9fbW92ZSggY29ubi0+Y2NfaW5jb21pbmcsIGFsdF9maWZvLCAmY29ubi0+Y2NfYWx0ICksICk7CisJQ0hFQ0tfUE9TSVhfRE8oIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZzdGF0ZV9sb2NrKSwgeyBBU1NFUlQoMCk7IH0gKTsKKwkKKwlyZXR1cm4gcmV0OworfQorCisvKiBTZW5kIGZ1bmN0aW9uIHdoZW4gbm8gbXVsdGktc3RyZWFtIGlzIGludm9sdmVkLCBvciBzZW5kaW5nIG9uIHN0cmVhbSAjMCAoc2VuZCgpIGFsd2F5cyB1c2Ugc3RyZWFtIDApKi8KK3N0YXRpYyBpbnQgc2VuZF9zaW1wbGUoc3RydWN0IGNueGN0eCAqIGNvbm4sIHVuc2lnbmVkIGNoYXIgKiBidWYsIHNpemVfdCBsZW4pCit7CisJc3NpemVfdCByZXQ7CisJc2l6ZV90IHNlbnQgPSAwOworCVRSQUNFX0VOVFJZKCIlcCAlcCAlemQiLCBjb25uLCBidWYsIGxlbik7CisJZG8geworCQlpZiAoZmRfY254X3Rlc3RzdGF0ZShjb25uLCBDQ19TVEFUVVNfVExTKSkgeworCQkJQ0hFQ0tfR05VVExTX0RPKCByZXQgPSBmZF90bHNfc2VuZF9oYW5kbGVfZXJyb3IoY29ubiwgY29ubi0+Y2NfdGxzX3BhcmEuc2Vzc2lvbiwgYnVmICsgc2VudCwgbGVuIC0gc2VudCksICApOworCQl9IGVsc2UgeworCQkJc3RydWN0IGlvdmVjIGlvdjsKKwkJCWlvdi5pb3ZfYmFzZSA9IGJ1ZiArIHNlbnQ7CisJCQlpb3YuaW92X2xlbiAgPSBsZW4gLSBzZW50OworCQkJQ0hFQ0tfU1lTX0RPKCByZXQgPSBmZF9jbnhfc19zZW5kdihjb25uLCAmaW92LCAxKSwgKTsKKwkJfQorCQlpZiAocmV0IDw9IDApCisJCQlyZXR1cm4gRU5PVENPTk47CisJCQorCQlzZW50ICs9IHJldDsKKwl9IHdoaWxlICggc2VudCA8IGxlbiApOworCXJldHVybiAwOworfQorCisvKiBTZW5kIGEgbWVzc2FnZSAtLSB0aGlzIGlzIHN5bmNocm9ub3VzIC0tIGFuZCB3ZSBhc3N1bWUgaXQncyBuZXZlciBjYWxsZWQgYnkgc2V2ZXJhbCB0aHJlYWRzIGF0IHRoZSBzYW1lIHRpbWUgKG9uIHRoZSBzYW1lIGNvbm4pLCBzbyB3ZSBkb24ndCBwcm90ZWN0LiAqLworaW50IGZkX2NueF9zZW5kKHN0cnVjdCBjbnhjdHggKiBjb25uLCB1bnNpZ25lZCBjaGFyICogYnVmLCBzaXplX3QgbGVuKQoreworCVRSQUNFX0VOVFJZKCIlcCAlcCAlemQiLCBjb25uLCBidWYsIGxlbik7CisJCisJQ0hFQ0tfUEFSQU1TKGNvbm4gJiYgKGNvbm4tPmNjX3NvY2tldCA+IDApICYmICghIGZkX2NueF90ZXN0c3RhdGUoY29ubiwgQ0NfU1RBVFVTX0VSUk9SKSkgJiYgYnVmICYmIGxlbik7CisKKwlUUkFDRV9ERUJVRyhGVUxMLCAiU2VuZGluZyAlemRiICVzZGF0YSBvbiBjb25uZWN0aW9uICVzIiwgbGVuLCBmZF9jbnhfdGVzdHN0YXRlKGNvbm4sIENDX1NUQVRVU19UTFMpID8gIlRMUy1wcm90ZWN0ZWQgIjoiIiwgY29ubi0+Y2NfaWQpOworCQorCXN3aXRjaCAoY29ubi0+Y2NfcHJvdG8pIHsKKwkJY2FzZSBJUFBST1RPX1RDUDoKKwkJCUNIRUNLX0ZDVCggc2VuZF9zaW1wbGUoY29ubiwgYnVmLCBsZW4pICk7CisJCQlicmVhazsKKwkJCisjaWZuZGVmIERJU0FCTEVfU0NUUAorCQljYXNlIElQUFJPVE9fU0NUUDogeworCQkJaW50IGR0bHMgPSBmZF9jbnhfdXNlc19kdGxzKGNvbm4pOworCQkJaWYgKCFkdGxzKSB7CisJCQkJaW50IHN0cmVhbSA9IDA7CisJCQkJaWYgKGNvbm4tPmNjX3NjdHBfcGFyYS51bm9yZGVyZWQpIHsKKwkJCQkJaW50IGxpbWl0OworCQkJCQlpZiAoZmRfY254X3Rlc3RzdGF0ZShjb25uLCBDQ19TVEFUVVNfVExTKSkKKwkJCQkJCWxpbWl0ID0gY29ubi0+Y2Nfc2N0cF9wYXJhLnBhaXJzOworCQkJCQllbHNlCisJCQkJCQlsaW1pdCA9IGNvbm4tPmNjX3NjdHBfcGFyYS5zdHJfb3V0OworCQkJCQkKKwkJCQkJaWYgKGxpbWl0ID4gMSkgeworCQkJCQkJY29ubi0+Y2Nfc2N0cF9wYXJhLm5leHQgKz0gMTsKKwkJCQkJCWNvbm4tPmNjX3NjdHBfcGFyYS5uZXh0ICU9IGxpbWl0OworCQkJCQkJc3RyZWFtID0gY29ubi0+Y2Nfc2N0cF9wYXJhLm5leHQ7CisJCQkJCX0KKwkJCQl9CisJCQkJCisJCQkJaWYgKHN0cmVhbSA9PSAwKSB7CisJCQkJCS8qIFdlIGNhbiB1c2UgZGVmYXVsdCBmdW5jdGlvbiwgaXQgc2VuZHMgb3ZlciBzdHJlYW0gIzAgKi8KKwkJCQkJQ0hFQ0tfRkNUKCBzZW5kX3NpbXBsZShjb25uLCBidWYsIGxlbikgKTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoIWZkX2NueF90ZXN0c3RhdGUoY29ubiwgQ0NfU1RBVFVTX1RMUykpIHsKKwkJCQkJCXN0cnVjdCBpb3ZlYyBpb3Y7CisJCQkJCQlpb3YuaW92X2Jhc2UgPSBidWY7CisJCQkJCQlpb3YuaW92X2xlbiAgPSBsZW47CisJCQkJCQkKKwkJCQkJCUNIRUNLX1NZU19ETyggZmRfc2N0cF9zZW5kc3Rydihjb25uLCBzdHJlYW0sICZpb3YsIDEpLCB7IGZkX2NueF9tYXJrZXJyb3IoY29ubik7IHJldHVybiBFTk9UQ09OTjsgfSApOworCQkJCQl9IGVsc2UgeworCQkJCQkJLyogcHVzaCB0aGUgZGF0YSB0byB0aGUgYXBwcm9wcmlhdGUgc2Vzc2lvbiAqLworCQkJCQkJc3NpemVfdCByZXQ7CisJCQkJCQlzaXplX3Qgc2VudCA9IDA7CisJCQkJCQlBU1NFUlQoY29ubi0+Y2Nfc2N0cDM0MzZfZGF0YS5hcnJheSAhPSBOVUxMKTsKKwkJCQkJCWRvIHsKKwkJCQkJCQlDSEVDS19HTlVUTFNfRE8oIHJldCA9IGZkX3Rsc19zZW5kX2hhbmRsZV9lcnJvcihjb25uLCBjb25uLT5jY19zY3RwMzQzNl9kYXRhLmFycmF5W3N0cmVhbV0uc2Vzc2lvbiwgYnVmICsgc2VudCwgbGVuIC0gc2VudCksICk7CisJCQkJCQkJaWYgKHJldCA8PSAwKQorCQkJCQkJCQlyZXR1cm4gRU5PVENPTk47CisKKwkJCQkJCQlzZW50ICs9IHJldDsKKwkJCQkJCX0gd2hpbGUgKCBzZW50IDwgbGVuICk7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8qIERUTFMgKi8KKwkJCQkvKiBNdWx0aXN0cmVhbSBpcyBoYW5kbGVkIGF0IGxvd2VyIGxheWVyIGluIHRoZSBwdXNoL3B1bGwgZnVuY3Rpb24gKi8KKwkJCQlDSEVDS19GQ1QoIHNlbmRfc2ltcGxlKGNvbm4sIGJ1ZiwgbGVuKSApOworCQkJfQorCQl9CisJCWJyZWFrOworI2VuZGlmIC8qIERJU0FCTEVfU0NUUCAqLworCQorCQlkZWZhdWx0OgorCQkJVFJBQ0VfREVCVUcoSU5GTywgIlVua25vd24gcHJvdG9jb2w6ICVkIiwgY29ubi0+Y2NfcHJvdG8pOworCQkJQVNTRVJUKDApOworCQkJcmV0dXJuIEVOT1RTVVA7CS8qIG9yIEVJTlZBTC4uLiAqLworCX0KKwkKKwlyZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgRGVzdHJ1Y3Rpb24gb2YgY29ubmVjdGlvbiAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIERlc3Ryb3kgYSBjb25uIHN0cnVjdHVyZSwgYW5kIHNodXRkb3duIHRoZSBzb2NrZXQgKi8KK3ZvaWQgZmRfY254X2Rlc3Ryb3koc3RydWN0IGNueGN0eCAqIGNvbm4pCit7CisJVFJBQ0VfRU5UUlkoIiVwIiwgY29ubik7CisJCisJQ0hFQ0tfUEFSQU1TX0RPKGNvbm4sIHJldHVybik7CisJCisJZmRfY254X2FkZHN0YXRlKGNvbm4sIENDX1NUQVRVU19DTE9TSU5HKTsKKwkKKwkvKiBJbml0aWF0ZSBzaHV0ZG93biBvZiB0aGUgVExTIHNlc3Npb24ocyk6IGNhbGwgZ251dGxzX2J5ZShXUiksIHRoZW4gcmVhZCB1bnRpbCBlcnJvciAqLworCWlmIChmZF9jbnhfdGVzdHN0YXRlKGNvbm4sIENDX1NUQVRVU19UTFMpKSB7CisjaWZuZGVmIERJU0FCTEVfU0NUUAorCQlpbnQgZHRscyA9IGZkX2NueF91c2VzX2R0bHMoY29ubik7CisJCWlmICgoIWR0bHMpICYmIChjb25uLT5jY19zY3RwX3BhcmEucGFpcnMgPiAxKSkgeworCQkJaWYgKCEgZmRfY254X3Rlc3RzdGF0ZShjb25uLCBDQ19TVEFUVVNfRVJST1IgKSkgeworCQkJCS8qIEJ5ZSBvbiBtYXN0ZXIgc2Vzc2lvbiAqLworCQkJCUNIRUNLX0dOVVRMU19ETyggZ251dGxzX2J5ZShjb25uLT5jY190bHNfcGFyYS5zZXNzaW9uLCBHTlVUTFNfU0hVVF9XUiksIGZkX2NueF9tYXJrZXJyb3IoY29ubikgKTsKKwkJCX0KKworCQkJaWYgKCEgZmRfY254X3Rlc3RzdGF0ZShjb25uLCBDQ19TVEFUVVNfRVJST1IgKSApIHsKKwkJCQkvKiBhbmQgb3RoZXIgc3RyZWFtIHBhaXJzICovCisJCQkJZmRfc2N0cDM0MzZfYnllKGNvbm4pOworCQkJfQorCisJCQlpZiAoISBmZF9jbnhfdGVzdHN0YXRlKGNvbm4sIENDX1NUQVRVU19FUlJPUiApICkgeworCQkJCS8qIE5vdyB3YWl0IGZvciBhbGwgZGVjaXBoZXIgdGhyZWFkcyB0byB0ZXJtaW5hdGUgKi8KKwkJCQlmZF9zY3RwMzQzNl93YWl0dGhyZWFkc3Rlcm0oY29ubik7CisJCQl9IGVsc2UgeworCQkJCS8qIEFib3JkIHRoZSB0aHJlYWRzLCB0aGUgY29ubmVjdGlvbiBpcyBkZWFkIGFscmVhZHkgKi8KKwkJCQlmZF9zY3RwMzQzNl9zdG9wdGhyZWFkcyhjb25uKTsKKwkJCX0KKworCQkJLyogRGVpbml0IGdudXRscyByZXNvdXJjZXMgKi8KKwkJCWZkX3NjdHAzNDM2X2dudXRsc19kZWluaXRfb3RoZXJzKGNvbm4pOworCQkJaWYgKGNvbm4tPmNjX3Rsc19wYXJhLnNlc3Npb24pIHsKKwkJCQlHTlVUTFNfVFJBQ0UoIGdudXRsc19kZWluaXQoY29ubi0+Y2NfdGxzX3BhcmEuc2Vzc2lvbikgKTsKKwkJCQljb25uLT5jY190bHNfcGFyYS5zZXNzaW9uID0gTlVMTDsKKwkJCX0KKwkJCQorCQkJLyogRGVzdHJveSB0aGUgd3JhcHBlciAoYWxzbyBzdG9wcyB0aGUgZGVtdXggdGhyZWFkKSAqLworCQkJZmRfc2N0cDM0MzZfZGVzdHJveShjb25uKTsKKworCQl9IGVsc2UgeworI2VuZGlmIC8qIERJU0FCTEVfU0NUUCAqLworCQkvKiBXZSBhcmUgVExTLCBidXQgbm90IHVzaW5nIHRoZSBzY3RwMzQzNiB3cmFwcGVyIGxheWVyICovCisJCQlpZiAoISBmZF9jbnhfdGVzdHN0YXRlKGNvbm4sIENDX1NUQVRVU19FUlJPUiApICkgeworCQkJCS8qIE1hc3RlciBzZXNzaW9uICovCisJCQkJQ0hFQ0tfR05VVExTX0RPKCBnbnV0bHNfYnllKGNvbm4tPmNjX3Rsc19wYXJhLnNlc3Npb24sIEdOVVRMU19TSFVUX1dSKSwgZmRfY254X21hcmtlcnJvcihjb25uKSApOworCQkJfQorCisJCQlpZiAoISBmZF9jbnhfdGVzdHN0YXRlKGNvbm4sIENDX1NUQVRVU19FUlJPUiApICkgeworCQkJCS8qIEluIHRoaXMgY2FzZSwganVzdCB3YWl0IGZvciB0aHJlYWQgcmN2dGhyX3Rsc19zaW5nbGUgdG8gdGVybWluYXRlICovCisJCQkJaWYgKGNvbm4tPmNjX3JjdnRociAhPSAocHRocmVhZF90KU5VTEwpIHsKKwkJCQkJQ0hFQ0tfUE9TSVhfRE8oICBwdGhyZWFkX2pvaW4oY29ubi0+Y2NfcmN2dGhyLCBOVUxMKSwgLyogY29udGludWUgKi8gICk7CisJCQkJCWNvbm4tPmNjX3JjdnRociA9IChwdGhyZWFkX3QpTlVMTDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8qIENhbmNlbCB0aGUgcmVjZWl2ZXIgdGhyZWFkIGluIGNhc2UgaXQgZGlkIG5vdCBhbHJlYWR5IHRlcm1pbmF0ZSAqLworCQkJCUNIRUNLX0ZDVF9ETyggZmRfdGhyX3Rlcm0oJmNvbm4tPmNjX3JjdnRociksIC8qIGNvbnRpbnVlICovICk7CisJCQl9CisJCQkKKwkJCS8qIEZyZWUgdGhlIHJlc291cmNlcyBvZiB0aGUgVExTIHNlc3Npb24gKi8KKwkJCWlmIChjb25uLT5jY190bHNfcGFyYS5zZXNzaW9uKSB7CisJCQkJR05VVExTX1RSQUNFKCBnbnV0bHNfZGVpbml0KGNvbm4tPmNjX3Rsc19wYXJhLnNlc3Npb24pICk7CisJCQkJY29ubi0+Y2NfdGxzX3BhcmEuc2Vzc2lvbiA9IE5VTEw7CisJCQl9CisjaWZuZGVmIERJU0FCTEVfU0NUUAorCQl9CisjZW5kaWYgLyogRElTQUJMRV9TQ1RQICovCisJfQorCQorCS8qIFRlcm1pbmF0ZSB0aGUgdGhyZWFkIGluIGNhc2UgaXQgaXMgbm90IGRvbmUgeWV0IC0tIGlzIHRoZXJlIGFueSBzdWNoIGNhc2UgbGVmdCA/Ki8KKwlDSEVDS19GQ1RfRE8oIGZkX3Rocl90ZXJtKCZjb25uLT5jY19yY3Z0aHIpLCAvKiBjb250aW51ZSAqLyApOworCQkKKwkvKiBTaHV0IHRoZSBjb25uZWN0aW9uIGRvd24gKi8KKwlpZiAoY29ubi0+Y2Nfc29ja2V0ID4gMCkgeworCQlzaHV0ZG93bihjb25uLT5jY19zb2NrZXQsIFNIVVRfUkRXUik7CisJCWNsb3NlKGNvbm4tPmNjX3NvY2tldCk7CisJCWNvbm4tPmNjX3NvY2tldCA9IC0xOworCX0KKwkKKwkvKiBFbXB0eSBhbmQgZGVzdHJveSBGSUZPIGxpc3QgKi8KKwlpZiAoY29ubi0+Y2NfaW5jb21pbmcpIHsKKwkJZmRfZXZlbnRfZGVzdHJveSggJmNvbm4tPmNjX2luY29taW5nLCBmcmVlICk7CisJfQorCQorCS8qIEZyZWUgdGhlIG9iamVjdCAqLworCWZyZWUoY29ubik7CisJCisJLyogRG9uZSEgKi8KKwlyZXR1cm47Cit9CmRpZmYgLS1naXQgYS9saWJmZGNvcmUvY254Y3R4LmggYi9saWJmZGNvcmUvY254Y3R4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNjNGJlYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmZkY29yZS9jbnhjdHguaApAQCAtMCwwICsxLDE1MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTMsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb25zIGZvciBpbnRlcm5hbCB1c2UgaW4gdGhlIGNvbm5lY3Rpb24gY29udGV4dCBmaWxlcyAqLworCisjaWZuZGVmIF9DTlhDVFhfSAorI2RlZmluZSBfQ05YQ1RYX0gKKworLyogTWF4aW11bSB0aW1lIHdlIGFsbG93IGEgY29ubmVjdGlvbiB0byBiZSBibG9ja2VkIGJlY2F1c2Ugb2YgaGVhZC1vZi10aGUtbGluZSBidWZmZXJzLiBBZnRlciB0aGlzIGRlbGF5LCBjb25uZWN0aW9uIGlzIGNvbnNpZGVyZWQgaW4gZXJyb3IuICovCisjZGVmaW5lIE1BWF9IT1RMX0JMT0NLSU5HX1RJTUUJMTAwMAkvKiBtcyAqLworCisvKiBUaGUgY29ubmVjdGlvbiBjb250ZXh0IHN0cnVjdHVyZSAqLworc3RydWN0IGNueGN0eCB7CisJY2hhcgkJY2NfaWRbNjBdOwkvKiBUaGUgbmFtZSBvZiB0aGlzIGNvbm5lY3Rpb24uIHRoZSBmaXJzdCA1IGNoYXJzIGFyZSByZXNlcnZlZCBmb3IgZmxhZ3MgZGlzcGxheSAoY2Nfc3RhdGUpLiAqLworCWNoYXIJCWNjX3JlbWlkWzYwXTsJLyogSWQgb2YgcmVtb3RlIHBlZXIgKi8KKwkKKwlpbnQgCQljY19zb2NrZXQ7CS8qIFRoZSBzb2NrZXQgb2JqZWN0IG9mIHRoZSBjb25uZWN0aW9uIC0tIDw9MCBpZiBubyBzb2NrZXQgaXMgY3JlYXRlZCAqLworCisJaW50IAkJY2NfZmFtaWx5OwkvKiBBRl9JTkVUIG9yIEFGX0lORVQ2IChtaXhlZCkgKi8KKwlpbnQgCQljY19wcm90bzsJLyogSVBQUk9UT19UQ1Agb3IgSVBQUk9UT19TQ1RQICovCisJCisJdWludDMyX3QJY2Nfc3RhdGU7CS8qIFRydWUgaWYgdGhlIG9iamVjdCBpcyBiZWluZyBkZXN0cm95ZWQ6IHdlIGRvbid0IHNlbmQgZXZlbnRzIGFueW1vcmUuIGFjY2VzcyB3aXRoIGZkX2NueF9nZXRzdGF0ZSgpICovCisJI2RlZmluZSAJQ0NfU1RBVFVTX0NMT1NJTkcJMQorCSNkZWZpbmUgCUNDX1NUQVRVU19FUlJPUgkJMgorCSNkZWZpbmUgCUNDX1NUQVRVU19TSUdOQUxFRAk0CisJI2RlZmluZSAJQ0NfU1RBVFVTX1RMUwkJOAorCisJcHRocmVhZF90CWNjX3JjdnRocjsJLyogdGhyZWFkIGZvciByZWNlaXZpbmcgbWVzc2FnZXMgb24gdGhlIGNvbm5lY3Rpb24gKi8KKwlpbnQJCWNjX2xvb3A7CS8qIHRlbGwgdGhlIHRocmVhZCBpZiBpdCBsb29wcyBvciBzdG9wcyBhZnRlciB0aGUgZmlyc3QgbWVzc2FnZSBpcyByZWNlaXZlZCAqLworCQorCXN0cnVjdCBmaWZvICoJY2NfaW5jb21pbmc7CS8qIEZJRk8gcXVldWUgb2YgZXZlbnRzIHJlY2VpdmVkIG9uIHRoZSBjb25uZWN0aW9uLCBGREVWUF9DTlhfKiAqLworCXN0cnVjdCBmaWZvICoJY2NfYWx0OwkJLyogYWx0ZXJuYXRlIGZpZm8gdG8gc2VuZCBGREVWUF9DTlhfKiBldmVudHMgdG8uICovCisKKwkvKiBJZiBjY190bHMgPT0gdHJ1ZSAqLworCXN0cnVjdCB7CisJCURpYW1JZF90IAkJCSBjbjsJCS8qIElmIG5vdCBOVUxMLCByZW1vdGUgY2VydGlmIHdpbGwgYmUgY2hlY2tlZCB0byBtYXRjaCB0aGlzIENvbW1vbiBOYW1lICovCisJCWludAkJCQkgbW9kZTsgCQkvKiBHTlVUTFNfQ0xJRU5UIC8gR05VVExTX1NFUlZFUiAqLworCQlpbnQJCQkJIGFsZ287CQkvKiBBTEdPX0hBTkRTSEFLRV9ERUZBVUxUIC8gQUxHT19IQU5EU0hBS0VfMzQzNiAqLworCQlnbnV0bHNfc2Vzc2lvbl90IAkJIHNlc3Npb247CS8qIFNlc3Npb24gb2JqZWN0IChzdHJlYW0gIzAgaW4gY2FzZSBvZiBTQ1RQKSAqLworCX0JCWNjX3Rsc19wYXJhOworCisJLyogSWYgY2NfcHJvdG8gPT0gU0NUUCAqLworCXN0cnVjdAl7CisJCXVpbnQxNl90IHN0cl9vdXQ7CS8qIE91dCBzdHJlYW1zICovCisJCXVpbnQxNl90IHN0cl9pbjsJLyogSW4gc3RyZWFtcyAqLworCQl1aW50MTZfdCBwYWlyczsJCS8qIG1heCBudW1iZXIgb2YgcGFpcnMgKCA9IG1pbihpbiwgb3V0KSkgKi8KKwkJdWludDE2X3QgbmV4dDsJCS8qICMgb2Ygc3RyZWFtIHRoZSBuZXh0IG1lc3NhZ2Ugd2lsbCBiZSBzZW50IHRvICovCisJCWludAkgdW5vcmRlcmVkOwkvKiBib29sZWFuIHRlbGxpbmcgaWYgdXNlIG9mIHN0cmVhbXMgPiAwIGlzIHBlcm1pdHRlZCAqLworCX0gCQljY19zY3RwX3BhcmE7CisKKwkvKiBJZiBib3RoIGNvbmRpdGlvbnMgKi8KKwlzdHJ1Y3QgeworCQlzdHJ1Y3Qgc2N0cDM0MzZfY3R4ICphcnJheTsgLyogYW4gYXJyYXkgb2YgY2Nfc2N0cF9wYXJhLnBhaXJzIGVsZW1lbnRzIC0tIHRoZSAjMCBpcyBzcGVjaWFsIChzZXNzaW9uIGlzIG91dHNpZGUpKi8KKwkJc3RydWN0IHNyX3N0b3JlCSAqc2Vzc19zdG9yZTsgLyogU2Vzc2lvbiBkYXRhIG9mIHRoZSBtYXN0ZXIgc2Vzc2lvbiwgdG8gcmVzdW1lIHRoZSBjaGlsZHJlbiBzZXNzaW9ucyAqLworCX0gCQljY19zY3RwMzQzNl9kYXRhOworfTsKKwordm9pZCBmZF9jbnhfbWFya2Vycm9yKHN0cnVjdCBjbnhjdHggKiBjb25uKTsKK3VpbnQzMl90IGZkX2NueF9nZXRzdGF0ZShzdHJ1Y3QgY254Y3R4ICogY29ubik7CitpbnQgIGZkX2NueF90ZXN0c3RhdGUoc3RydWN0IGNueGN0eCAqIGNvbm4sIHVpbnQzMl90IGZsYWcpOwordm9pZCBmZF9jbnhfYWRkc3RhdGUoc3RydWN0IGNueGN0eCAqIGNvbm4sIHVpbnQzMl90IG9yc3RhdGUpOwordm9pZCBmZF9jbnhfc2V0c3RhdGUoc3RydWN0IGNueGN0eCAqIGNvbm4sIHVpbnQzMl90IGFic3RhdGUpOworc3RydWN0IGZpZm8gKiBmZF9jbnhfdGFyZ2V0X3F1ZXVlKHN0cnVjdCBjbnhjdHggKiBjb25uKTsKKworCisvKiBTb2NrZXQgKi8KK3NzaXplX3QgZmRfY254X3NfcmVjdihzdHJ1Y3QgY254Y3R4ICogY29ubiwgdm9pZCAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoKTsKK3ZvaWQgZmRfY254X3Nfc2V0dG8oaW50IHNvY2spOworCisvKiBUTFMgKi8KK2ludCBmZF90bHNfcmN2dGhyX2NvcmUoc3RydWN0IGNueGN0eCAqIGNvbm4sIGdudXRsc19zZXNzaW9uX3Qgc2Vzc2lvbik7CitpbnQgZmRfdGxzX3ByZXBhcmUoZ251dGxzX3Nlc3Npb25fdCAqIHNlc3Npb24sIGludCBtb2RlLCBpbnQgZHRscywgY2hhciAqIHByaW9yaXR5LCB2b2lkICogYWx0X2NyZWRzKTsKKyNpZm5kZWYgR05VVExTX1ZFUlNJT05fMzAwCitpbnQgZmRfdGxzX3ZlcmlmeV9jcmVkZW50aWFscyhnbnV0bHNfc2Vzc2lvbl90IHNlc3Npb24sIHN0cnVjdCBjbnhjdHggKiBjb25uLCBpbnQgdmVyYm9zZSk7CisjZW5kaWYgLyogR05VVExTX1ZFUlNJT05fMzAwICovCisKKy8qIFRDUCAqLworaW50IGZkX3RjcF9jcmVhdGVfYmluZF9zZXJ2ZXIoIGludCAqIHNvY2ssIHNTQSAqIHNhLCBzb2NrbGVuX3Qgc2FsZW4gKTsKK2ludCBmZF90Y3BfbGlzdGVuKCBpbnQgc29jayApOworaW50IGZkX3RjcF9jbGllbnQoIGludCAqc29jaywgc1NBICogc2EsIHNvY2tsZW5fdCBzYWxlbiApOworaW50IGZkX3RjcF9nZXRfbG9jYWxfZXAoaW50IHNvY2ssIHNTUyAqIHNzLCBzb2NrbGVuX3QgKnNsKTsKK2ludCBmZF90Y3BfZ2V0X3JlbW90ZV9lcChpbnQgc29jaywgc1NTICogc3MsIHNvY2tsZW5fdCAqc2wpOworCisjaWZuZGVmIERJU0FCTEVfU0NUUAorLyogU0NUUCAqLworaW50IGZkX3NjdHBfY3JlYXRlX2JpbmRfc2VydmVyKCBpbnQgKiBzb2NrLCBpbnQgZmFtaWx5LCBzdHJ1Y3QgZmRfbGlzdCAqIGxpc3QsIHVpbnQxNl90IHBvcnQgKTsKK2ludCBmZF9zY3RwX2xpc3RlbiggaW50IHNvY2sgKTsKK2ludCBmZF9zY3RwX2NsaWVudCggaW50ICpzb2NrLCBpbnQgbm9faXA2LCB1aW50MTZfdCBwb3J0LCBzdHJ1Y3QgZmRfbGlzdCAqIGxpc3QgKTsKK2ludCBmZF9zY3RwX2dldF9sb2NhbF9lcChpbnQgc29jaywgIHN0cnVjdCBmZF9saXN0ICogbGlzdCk7CitpbnQgZmRfc2N0cF9nZXRfcmVtb3RlX2VwKGludCBzb2NrLCBzdHJ1Y3QgZmRfbGlzdCAqIGxpc3QpOworaW50IGZkX3NjdHBfZ2V0X3N0cl9pbmZvKCBpbnQgc29jaywgdWludDE2X3QgKmluLCB1aW50MTZfdCAqb3V0LCBzU1MgKnByaW1hcnkgKTsKK3NzaXplX3QgZmRfc2N0cF9zZW5kc3RydihzdHJ1Y3QgY254Y3R4ICogY29ubiwgdWludDE2X3Qgc3RyaWQsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LCBpbnQgaW92Y250KTsKK2ludCBmZF9zY3RwX3JlY3ZtZXRhKHN0cnVjdCBjbnhjdHggKiBjb25uLCB1aW50MTZfdCAqIHN0cmlkLCB1aW50OF90ICoqIGJ1Ziwgc2l6ZV90ICogbGVuLCBpbnQgKmV2ZW50KTsKKworLyogVExTIG92ZXIgU0NUUCAobXVsdGktc3RyZWFtKSAqLworc3RydWN0IHNjdHAzNDM2X2N0eCB7CisJc3RydWN0IGNueGN0eCAJKnBhcmVudDsgCS8qIGZvciBpbmZvIHN1Y2ggYXMgc29ja2V0LCBjb25uIG5hbWUsIGV2ZW50IGxpc3QgKi8KKwl1aW50MTZfdAkgc3RyaWQ7CQkvKiBTdHJlYW0gIyBvZiB0aGlzIHNlc3Npb24gKi8KKwlzdHJ1Y3QgZmlmbwkqcmF3X3JlY3Y7CS8qIFJhdyBkYXRhIHJlY2VpdmVkIG9uIHRoaXMgc3RyZWFtLCBmb3IgZGVtdXggKi8KKwlzdHJ1Y3QgeworCQl1aW50OF90ICpidWY7CisJCXNpemVfdCAgIGJ1ZnN6OworCQlzaXplX3QgICBvZmZzZXQ7CisJfSAJCSBwYXJ0aWFsOwkvKiBJZiB0aGUgcHVsbCBmdW5jdGlvbiBkaWQgbm90IHJlYWQgdGhlIGZ1bGwgY29udGVudCBvZiBmaXJzdCBtZXNzYWdlIGluIHJhdywgaXQgc3RvcmVzIGl0IGhlcmUgZm9yIG5leHQgcmVhZCBjYWxsLiAqLworCXB0aHJlYWRfdAkgdGhyOwkJLyogVGhyZWFkIHRvIGRlY3J5cHQgcmF3IGRhdGEgaW4gdGhpcyBwYWlyIG9mIHN0cmVhbXMgKi8KKwlnbnV0bHNfc2Vzc2lvbl90IHNlc3Npb247CS8qIFRMUyBjb250ZXh0IHVzaW5nIHRoaXMgcGFpciBvZiBzdHJlYW1zIC0tIGV4Y2VwdCBpZiBzdHJpZCA9PSAwLCBpbiB0aGF0IGNhc2Ugc2Vzc2lvbiBpcyBvdXRzaWRlIHRoZSBhcnJheSAqLworfTsKKworaW50IGZkX3NjdHAzNDM2X2luaXQoc3RydWN0IGNueGN0eCAqIGNvbm4pOworaW50IGZkX3NjdHAzNDM2X2hhbmRzaGFrZV9vdGhlcnMoc3RydWN0IGNueGN0eCAqIGNvbm4sIGNoYXIgKiBwcmlvcml0eSwgdm9pZCAqIGFsdF9jcmVkcyk7CitpbnQgZmRfc2N0cDM0MzZfc3RhcnR0aHJlYWRzKHN0cnVjdCBjbnhjdHggKiBjb25uLCBpbnQgb3RoZXJzKTsKK3ZvaWQgZmRfc2N0cDM0MzZfYnllKHN0cnVjdCBjbnhjdHggKiBjb25uKTsKK3ZvaWQgZmRfc2N0cDM0MzZfd2FpdHRocmVhZHN0ZXJtKHN0cnVjdCBjbnhjdHggKiBjb25uKTsKK3ZvaWQgZmRfc2N0cDM0MzZfZ251dGxzX2RlaW5pdF9vdGhlcnMoc3RydWN0IGNueGN0eCAqIGNvbm4pOwordm9pZCBmZF9zY3RwMzQzNl9zdG9wdGhyZWFkcyhzdHJ1Y3QgY254Y3R4ICogY29ubik7Cit2b2lkIGZkX3NjdHAzNDM2X2Rlc3Ryb3koc3RydWN0IGNueGN0eCAqIGNvbm4pOworCisjZW5kaWYgLyogRElTQUJMRV9TQ1RQICovCisKKyNlbmRpZiAvKiBfQ05YQ1RYX0ggKi8KKwpkaWZmIC0tZ2l0IGEvbGliZmRjb3JlL2NvbmZpZy5jIGIvbGliZmRjb3JlL2NvbmZpZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhMWEwNjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJmZGNvcmUvY29uZmlnLmMKQEAgLTAsMCArMSw2NDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDE1LCBXSURFIFByb2plY3QgYW5kIE5JQ1QJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFdJREUgUHJvamVjdCBvciBOSUNUIG5vciB0aGUgCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgV0lERSBQcm9qZWN0IGFuZCAJCQkJCQkgKgorKiAgIE5JQ1QuCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImZkY29yZS1pbnRlcm5hbC5oIgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKy8qIENvbmZpZ3VyYXRpb24gbWFuYWdlbWVudCAqLworCisjaWZuZGVmIEdOVVRMU19ERUZBVUxUX1BSSU9SSVRZCisjIGRlZmluZSBHTlVUTFNfREVGQVVMVF9QUklPUklUWSAiTk9STUFMIgorI2VuZGlmIC8qIEdOVVRMU19ERUZBVUxUX1BSSU9SSVRZICovCisjaWZuZGVmIEdOVVRMU19ERUZBVUxUX0RIQklUUworIyBkZWZpbmUgR05VVExTX0RFRkFVTFRfREhCSVRTIDEwMjQKKyNlbmRpZiAvKiBHTlVUTFNfREVGQVVMVF9ESEJJVFMgKi8KKworLyogSW5pdGlhbGl6ZSB0aGUgZmRfZ19jb25maWcgc3RydWN0dXJlIHRvIGRlZmF1bHQgdmFsdWVzIC0tIGl0IHNob3VsZCBhbHJlYWR5IGhhdmUgYmVlbiBpbml0aWFsaXplZCB0byBhbGwtMCAqLworaW50IGZkX2NvbmZfaW5pdCgpCit7CisJVFJBQ0VfRU5UUlkoKTsKKwkKKwlmZF9nX2NvbmZpZy0+Y25mX2V5ZWMgPSBFWUVDX0NPTkZJRzsKKwkKKwlmZF9nX2NvbmZpZy0+Y25mX3RpbWVyX3RjID0gMzA7CisJZmRfZ19jb25maWctPmNuZl90aW1lcl90dyA9IDMwOworCQorCWZkX2dfY29uZmlnLT5jbmZfcG9ydCAgICAgPSBESUFNRVRFUl9QT1JUOworCWZkX2dfY29uZmlnLT5jbmZfcG9ydF90bHMgPSBESUFNRVRFUl9TRUNVUkVfUE9SVDsKKwlmZF9nX2NvbmZpZy0+Y25mX3NjdHBfc3RyID0gMzA7CisJZmRfZ19jb25maWctPmNuZl90aHJfc3J2ICA9IDU7CisJZmRfZ19jb25maWctPmNuZl9kaXNwdGhyICA9IDQ7CisJZmRfbGlzdF9pbml0KCZmZF9nX2NvbmZpZy0+Y25mX2VuZHBvaW50cywgTlVMTCk7CisJZmRfbGlzdF9pbml0KCZmZF9nX2NvbmZpZy0+Y25mX2FwcHMsIE5VTEwpOworCSNpZmRlZiBESVNBQkxFX1NDVFAKKwlmZF9nX2NvbmZpZy0+Y25mX2ZsYWdzLm5vX3NjdHAgPSAxOworCSNlbmRpZiAvKiBESVNBQkxFX1NDVFAgKi8KKwkKKwlmZF9nX2NvbmZpZy0+Y25mX29yc3RhdGVpZCA9ICh1aW50MzJfdCkgdGltZShOVUxMKTsKKwkKKwlDSEVDS19GQ1QoIGZkX2RpY3RfaW5pdCgmZmRfZ19jb25maWctPmNuZl9kaWN0KSApOworCUNIRUNLX0ZDVCggZmRfZmlmb19uZXcoJmZkX2dfY29uZmlnLT5jbmZfbWFpbl9ldiwgMCkgKTsKKwkKKwkvKiBUTFMgcGFyYW1ldGVycyAqLworCUNIRUNLX0dOVVRMU19ETyggZ251dGxzX2NlcnRpZmljYXRlX2FsbG9jYXRlX2NyZWRlbnRpYWxzICgmZmRfZ19jb25maWctPmNuZl9zZWNfZGF0YS5jcmVkZW50aWFscyksIHJldHVybiBFTk9NRU0gKTsKKwlDSEVDS19HTlVUTFNfRE8oIGdudXRsc19kaF9wYXJhbXNfaW5pdCAoJmZkX2dfY29uZmlnLT5jbmZfc2VjX2RhdGEuZGhfY2FjaGUpLCByZXR1cm4gRU5PTUVNICk7CisjaWZkZWYgR05VVExTX1ZFUlNJT05fMzAwCisJQ0hFQ0tfR05VVExTX0RPKCBnbnV0bHNfeDUwOV90cnVzdF9saXN0X2luaXQoJmZkX2dfY29uZmlnLT5jbmZfc2VjX2RhdGEudHJ1c3RsaXN0LCAwKSwgcmV0dXJuIEVOT01FTSApOworI2VuZGlmIC8qIEdOVVRMU19WRVJTSU9OXzMwMCAqLworCisJcmV0dXJuIDA7Cit9CisKK0RFQ0xBUkVfRkRfRFVNUF9QUk9UT1RZUEUoZmRfY29uZl9kdW1wKQoreworCUZEX0RVTVBfSEFORExFX09GRlNFVCgpOworCQorCUNIRUNLX01BTExPQ19ETyggZmRfZHVtcF9leHRlbmQoIEZEX0RVTVBfU1REX1BBUkFNUywgImZyZWVEaWFtZXRlciBjb25maWd1cmF0aW9uOlxuIiksIHJldHVybiBOVUxMKTsJCisJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9kdW1wX2V4dGVuZCggRkRfRFVNUF9TVERfUEFSQU1TLCAiICBEZWZhdWx0IHRyYWNlIGxldmVsIC4uLi4gOiAlK2RcbiIsIGZkX2dfZGVidWdfbHZsKSwgcmV0dXJuIE5VTEwpOworCUNIRUNLX01BTExPQ19ETyggZmRfZHVtcF9leHRlbmQoIEZEX0RVTVBfU1REX1BBUkFNUywgIiAgQ29uZmlndXJhdGlvbiBmaWxlIC4uLi4uIDogJXNcbiIsIGZkX2dfY29uZmlnLT5jbmZfZmlsZSksIHJldHVybiBOVUxMKTsKKwlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICIgIERpYW1ldGVyIElkZW50aXR5IC4uLi4uLiA6ICVzIChsOiV6aSlcbiIsIGZkX2dfY29uZmlnLT5jbmZfZGlhbWlkLCBmZF9nX2NvbmZpZy0+Y25mX2RpYW1pZF9sZW4pLCByZXR1cm4gTlVMTCk7CisJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9kdW1wX2V4dGVuZCggRkRfRFVNUF9TVERfUEFSQU1TLCAiICBEaWFtZXRlciBSZWFsbSAuLi4uLi4uLi4gOiAlcyAobDolemkpXG4iLCBmZF9nX2NvbmZpZy0+Y25mX2RpYW1ybG0sIGZkX2dfY29uZmlnLT5jbmZfZGlhbXJsbV9sZW4pLCByZXR1cm4gTlVMTCk7CisJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9kdW1wX2V4dGVuZCggRkRfRFVNUF9TVERfUEFSQU1TLCAiICBUYyBUaW1lciAuLi4uLi4uLi4uLi4uLi4gOiAldVxuIiwgZmRfZ19jb25maWctPmNuZl90aW1lcl90YyksIHJldHVybiBOVUxMKTsKKwlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICIgIFR3IFRpbWVyIC4uLi4uLi4uLi4uLi4uLiA6ICV1XG4iLCBmZF9nX2NvbmZpZy0+Y25mX3RpbWVyX3R3KSwgcmV0dXJuIE5VTEwpOworCUNIRUNLX01BTExPQ19ETyggZmRfZHVtcF9leHRlbmQoIEZEX0RVTVBfU1REX1BBUkFNUywgIiAgTG9jYWwgcG9ydCAuLi4uLi4uLi4uLi4uIDogJWh1XG4iLCBmZF9nX2NvbmZpZy0+Y25mX3BvcnQpLCByZXR1cm4gTlVMTCk7CisJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9kdW1wX2V4dGVuZCggRkRfRFVNUF9TVERfUEFSQU1TLCAiICBMb2NhbCBzZWN1cmUgcG9ydCAuLi4uLi4gOiAlaHVcbiIsIGZkX2dfY29uZmlnLT5jbmZfcG9ydF90bHMpLCByZXR1cm4gTlVMTCk7CisJaWYgKGZkX2dfY29uZmlnLT5jbmZfcG9ydF8zNDM2KSB7CisJCUNIRUNLX01BTExPQ19ETyggZmRfZHVtcF9leHRlbmQoIEZEX0RVTVBfU1REX1BBUkFNUywgIiAgTG9jYWwgU0NUUCBUTFMgcG9ydCAuLi4uIDogJWh1XG4iLCBmZF9nX2NvbmZpZy0+Y25mX3BvcnRfMzQzNiksIHJldHVybiBOVUxMKTsKKwl9CisJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9kdW1wX2V4dGVuZCggRkRfRFVNUF9TVERfUEFSQU1TLCAiICBOdW1iZXIgb2YgU0NUUCBzdHJlYW1zIC4gOiAlaHVcbiIsIGZkX2dfY29uZmlnLT5jbmZfc2N0cF9zdHIpLCByZXR1cm4gTlVMTCk7CisJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9kdW1wX2V4dGVuZCggRkRfRFVNUF9TVERfUEFSQU1TLCAiICBOdW1iZXIgb2YgY2xpZW50cyB0aHIgLi4gOiAlZFxuIiwgZmRfZ19jb25maWctPmNuZl90aHJfc3J2KSwgcmV0dXJuIE5VTEwpOworCUNIRUNLX01BTExPQ19ETyggZmRfZHVtcF9leHRlbmQoIEZEX0RVTVBfU1REX1BBUkFNUywgIiAgTnVtYmVyIG9mIGFwcCB0aHJlYWRzIC4uIDogJWh1XG4iLCBmZF9nX2NvbmZpZy0+Y25mX2Rpc3B0aHIpLCByZXR1cm4gTlVMTCk7CisJaWYgKEZEX0lTX0xJU1RfRU1QVFkoJmZkX2dfY29uZmlnLT5jbmZfZW5kcG9pbnRzKSkgeworCQlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICIgIExvY2FsIGVuZHBvaW50cyAuLi4uLi4uLiA6IERlZmF1bHQgKHVzZSBhbGwgYXZhaWxhYmxlKVxuIiksIHJldHVybiBOVUxMKTsKKwl9IGVsc2UgeworCQlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICIgIExvY2FsIGVuZHBvaW50cyAuLi4uLi4uLiA6ICIpLCByZXR1cm4gTlVMTCk7CisJCUNIRUNLX01BTExPQ19ETyggZmRfZXBfZHVtcCggRkRfRFVNUF9TVERfUEFSQU1TLCAwLCAwLCAmZmRfZ19jb25maWctPmNuZl9lbmRwb2ludHMgKSwgcmV0dXJuIE5VTEwpOworCX0KKwlpZiAoRkRfSVNfTElTVF9FTVBUWSgmZmRfZ19jb25maWctPmNuZl9hcHBzKSkgeworCQlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICIgIExvY2FsIGFwcGxpY2F0aW9ucyAuLi4uLiA6IChub25lKSIpLCByZXR1cm4gTlVMTCk7CisJfSBlbHNlIHsKKwkJc3RydWN0IGZkX2xpc3QgKiBsaSA9IGZkX2dfY29uZmlnLT5jbmZfYXBwcy5uZXh0OworCQlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICIgIExvY2FsIGFwcGxpY2F0aW9ucyAuLi4uLiA6ICIpLCByZXR1cm4gTlVMTCk7CisJCXdoaWxlIChsaSAhPSAmZmRfZ19jb25maWctPmNuZl9hcHBzKSB7CisJCQlzdHJ1Y3QgZmRfYXBwICogYXBwID0gKHN0cnVjdCBmZF9hcHAgKilsaTsKKwkJCUNIRUNLX01BTExPQ19ETyggZmRfZHVtcF9leHRlbmQoIEZEX0RVTVBfU1REX1BBUkFNUywgIkFwcDogJXUsJXMlcyxWbmQ6JXVcdCIsIAorCQkJCQlhcHAtPmFwcGlkLAorCQkJCQlhcHAtPmZsYWdzLmF1dGggPyAiQXUiIDogIi0tIiwKKwkJCQkJYXBwLT5mbGFncy5hY2N0ID8gIkFjIiA6ICItLSIsCisJCQkJCWFwcC0+dm5kaWQpLCByZXR1cm4gTlVMTCk7CisJCQlsaSA9IGxpLT5uZXh0OworCQl9CisJfQorCQorCUNIRUNLX01BTExPQ19ETyggZmRfZHVtcF9leHRlbmQoIEZEX0RVTVBfU1REX1BBUkFNUywgIlxuICBGbGFncyA6IC0gSVAgLi4uLi4uLi4uLi4gOiAlc1xuIiwgZmRfZ19jb25maWctPmNuZl9mbGFncy5ub19pcDQgPyAiRElTQUJMRUQiIDogIkVuYWJsZWQiKSwgcmV0dXJuIE5VTEwpOworCUNIRUNLX01BTExPQ19ETyggZmRfZHVtcF9leHRlbmQoIEZEX0RVTVBfU1REX1BBUkFNUywgIiAgICAgICAgICAtIElQdjYgLi4uLi4uLi4uIDogJXNcbiIsIGZkX2dfY29uZmlnLT5jbmZfZmxhZ3Mubm9faXA2ID8gIkRJU0FCTEVEIiA6ICJFbmFibGVkIiksIHJldHVybiBOVUxMKTsKKwlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICIgICAgICAgICAgLSBSZWxheSBhcHAgLi4uLiA6ICVzXG4iLCBmZF9nX2NvbmZpZy0+Y25mX2ZsYWdzLm5vX2Z3ZCA/ICJESVNBQkxFRCIgOiAiRW5hYmxlZCIpLCByZXR1cm4gTlVMTCk7CisJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9kdW1wX2V4dGVuZCggRkRfRFVNUF9TVERfUEFSQU1TLCAiICAgICAgICAgIC0gVENQIC4uLi4uLi4uLi4gOiAlc1xuIiwgZmRfZ19jb25maWctPmNuZl9mbGFncy5ub190Y3AgPyAiRElTQUJMRUQiIDogIkVuYWJsZWQiKSwgcmV0dXJuIE5VTEwpOworCSNpZmRlZiBESVNBQkxFX1NDVFAKKwlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICIgICAgICAgICAgLSBTQ1RQIC4uLi4uLi4uLiA6IERJU0FCTEVEIChhdCBjb21waWxhdGlvbilcbiIpLCByZXR1cm4gTlVMTCk7CisJI2Vsc2UgLyogRElTQUJMRV9TQ1RQICovCisJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9kdW1wX2V4dGVuZCggRkRfRFVNUF9TVERfUEFSQU1TLCAiICAgICAgICAgIC0gU0NUUCAuLi4uLi4uLi4gOiAlc1xuIiwgZmRfZ19jb25maWctPmNuZl9mbGFncy5ub19zY3RwID8gIkRJU0FCTEVEIiA6ICJFbmFibGVkIiksIHJldHVybiBOVUxMKTsKKwkjZW5kaWYgLyogRElTQUJMRV9TQ1RQICovCisJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9kdW1wX2V4dGVuZCggRkRfRFVNUF9TVERfUEFSQU1TLCAiICAgICAgICAgIC0gUHJlZi4gcHJvdG8gLi4gOiAlc1xuIiwgZmRfZ19jb25maWctPmNuZl9mbGFncy5wcl90Y3AgPyAiVENQIiA6ICJTQ1RQIiksIHJldHVybiBOVUxMKTsKKwlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICIgICAgICAgICAgLSBUTFMgbWV0aG9kIC4uLiA6ICVzXG4iLCBmZF9nX2NvbmZpZy0+Y25mX2ZsYWdzLnRsc19hbGcgPyAiSU5CQU5EIiA6ICJTZXBhcmF0ZSBwb3J0IiksIHJldHVybiBOVUxMKTsKKwkKKwlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICIgIFRMUyA6ICAgLSBDZXJ0aWZpY2F0ZSAuLiA6ICVzXG4iLCBmZF9nX2NvbmZpZy0+Y25mX3NlY19kYXRhLmNlcnRfZmlsZSA/OiAiKE5PTkUpIiksIHJldHVybiBOVUxMKTsKKwlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICIgICAgICAgICAgLSBQcml2YXRlIGtleSAuLiA6ICVzXG4iLCBmZF9nX2NvbmZpZy0+Y25mX3NlY19kYXRhLmtleV9maWxlID86ICIoTk9ORSkiKSwgcmV0dXJuIE5VTEwpOworCUNIRUNLX01BTExPQ19ETyggZmRfZHVtcF9leHRlbmQoIEZEX0RVTVBfU1REX1BBUkFNUywgIiAgICAgICAgICAtIENBICh0cnVzdCkgLi4uIDogJXMgKCVkIGNlcnRzKVxuIiwgZmRfZ19jb25maWctPmNuZl9zZWNfZGF0YS5jYV9maWxlID86ICIobm9uZSkiLCBmZF9nX2NvbmZpZy0+Y25mX3NlY19kYXRhLmNhX2ZpbGVfbnIpLCByZXR1cm4gTlVMTCk7CisJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9kdW1wX2V4dGVuZCggRkRfRFVNUF9TVERfUEFSQU1TLCAiICAgICAgICAgIC0gQ1JMIC4uLi4uLi4uLi4gOiAlc1xuIiwgZmRfZ19jb25maWctPmNuZl9zZWNfZGF0YS5jcmxfZmlsZSA/OiAiKG5vbmUpIiksIHJldHVybiBOVUxMKTsKKwlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICIgICAgICAgICAgLSBQcmlvcml0eSAuLi4uLiA6ICVzXG4iLCBmZF9nX2NvbmZpZy0+Y25mX3NlY19kYXRhLnByaW9fc3RyaW5nID86ICIoZGVmYXVsdDogJyIgR05VVExTX0RFRkFVTFRfUFJJT1JJVFkgIicpIiksIHJldHVybiBOVUxMKTsKKwlpZiAoZmRfZ19jb25maWctPmNuZl9zZWNfZGF0YS5kaF9maWxlKSB7CisJCUNIRUNLX01BTExPQ19ETyggZmRfZHVtcF9leHRlbmQoIEZEX0RVTVBfU1REX1BBUkFNUywgIiAgICAgICAgICAtIERIIGZpbGUgLi4uLi4uIDogJXNcbiIsIGZkX2dfY29uZmlnLT5jbmZfc2VjX2RhdGEuZGhfZmlsZSksIHJldHVybiBOVUxMKTsKKwl9IGVsc2UgeworCQlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICIgICAgICAgICAgLSBESCBiaXRzIC4uLi4uLiA6ICVkXG4iLCBmZF9nX2NvbmZpZy0+Y25mX3NlY19kYXRhLmRoX2JpdHMgPzogR05VVExTX0RFRkFVTFRfREhCSVRTKSwgcmV0dXJuIE5VTEwpOworCX0KKwkKKwlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICIgIE9yaWdpbi1TdGF0ZS1JZCAuLi4uLi4uLiA6ICV1IiwgZmRfZ19jb25maWctPmNuZl9vcnN0YXRlaWQpLCByZXR1cm4gTlVMTCk7CisJCisJcmV0dXJuICpidWY7Cit9CisKKy8qIHJlYWQgY29udGVudHMgb2YgYSBmaWxlIG9wZW5lZCBpbiAicmIiIG1vZGUgYW5kIGFsbG9jIHRoaXMgZGF0YSBpbnRvIGEgZ251dGxzX2RhdHVtX3QgKG11c3QgYmUgZnJlZWQgYWZ0ZXJ3YXJkcykgKi8KK2ludCBmZF9jb25mX3N0cmVhbV90b19nbnV0bHNfZGF0dW0oRklMRSAqIHBlbWZpbGUsIGdudXRsc19kYXR1bV90ICpvdXQpCit7CisJc2l6ZV90IGFsbG9jID0gMDsKKwkKKwlDSEVDS19QQVJBTVMoIHBlbWZpbGUgJiYgb3V0ICk7CisJbWVtc2V0KG91dCwgMCwgc2l6ZW9mKGdudXRsc19kYXR1bV90KSk7CisKKwlkbyB7CisJCXVpbnQ4X3QgKiByZWFsbG9jZWQgPSBOVUxMOworCQlzaXplX3QgcmVhZCA9IDA7CisKKwkJaWYgKGFsbG9jIDwgb3V0LT5zaXplICsgQlVGU0laICsgMSkgeworCQkJYWxsb2MgKz0gYWxsb2MgLyAyICsgQlVGU0laICsgMTsKKwkJCUNIRUNLX01BTExPQ19ETyggcmVhbGxvY2VkID0gcmVhbGxvYyhvdXQtPmRhdGEsIGFsbG9jKSwKKwkJCQl7CisJCQkJCWZyZWUob3V0LT5kYXRhKTsKKwkJCQkJcmV0dXJuIEVOT01FTTsKKwkJCQl9ICkKKwkJCW91dC0+ZGF0YSA9IHJlYWxsb2NlZDsKKwkJfQorCisJCXJlYWQgPSBmcmVhZCggb3V0LT5kYXRhICsgb3V0LT5zaXplLCAxLCBhbGxvYyAtIG91dC0+c2l6ZSAtIDEsIHBlbWZpbGUgKTsKKwkJb3V0LT5zaXplICs9IHJlYWQ7CisKKwkJaWYgKGZlcnJvcihwZW1maWxlKSkgeworCQkJaW50IGVyciA9IGVycm5vOworCQkJVFJBQ0VfREVCVUcoSU5GTywgIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHJlYWRpbmcgZmlsZTogJXMiLCBzdHJlcnJvcihlcnIpKTsKKwkJCXJldHVybiBlcnI7IAorCQl9CisJfSB3aGlsZSAoIWZlb2YocGVtZmlsZSkpOworCQorCW91dC0+ZGF0YVtvdXQtPnNpemVdID0gJ1wwJzsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIEdOVVRMU19WRVJTSU9OXzMwMAorLyogaW5zcGlyZWQgZnJvbSBHbnVUTFMgbWFudWFsICovCitzdGF0aWMgaW50IGZkX2NvbmZfcHJpbnRfZGV0YWlsc19mdW5jIChnbnV0bHNfeDUwOV9jcnRfdCBjZXJ0LAorICAgICAgICAgICAgICAgICAgICBnbnV0bHNfeDUwOV9jcnRfdCBpc3N1ZXIsIGdudXRsc194NTA5X2NybF90IGNybCwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHZlcmlmaWNhdGlvbl9vdXRwdXQpCit7CisgIGNoYXIgbmFtZVs1MTJdOworICBjaGFyIGlzc3Vlcl9uYW1lWzUxMl07CisgIHNpemVfdCBuYW1lX3NpemU7CisgIHNpemVfdCBpc3N1ZXJfbmFtZV9zaXplOworICAKKyAgaWYgKCFUUkFDRV9CT09MKEdOVVRMU19EQkdfTEVWRUwpKQorCSAgcmV0dXJuIDA7CisKKyAgaXNzdWVyX25hbWVfc2l6ZSA9IHNpemVvZiAoaXNzdWVyX25hbWUpOworICBnbnV0bHNfeDUwOV9jcnRfZ2V0X2lzc3Vlcl9kbiAoY2VydCwgaXNzdWVyX25hbWUsICZpc3N1ZXJfbmFtZV9zaXplKTsKKworICBuYW1lX3NpemUgPSBzaXplb2YgKG5hbWUpOworICBnbnV0bHNfeDUwOV9jcnRfZ2V0X2RuIChjZXJ0LCBuYW1lLCAmbmFtZV9zaXplKTsKKworICBmZF9sb2dfZGVidWcoIlx0U3ViamVjdDogJXMiLCBuYW1lKTsKKyAgZmRfbG9nX2RlYnVnKCJcdElzc3VlcjogJXMiLCBpc3N1ZXJfbmFtZSk7CisKKyAgaWYgKGlzc3VlciAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlzc3Vlcl9uYW1lX3NpemUgPSBzaXplb2YgKGlzc3Vlcl9uYW1lKTsKKyAgICAgIGdudXRsc194NTA5X2NydF9nZXRfZG4gKGlzc3VlciwgaXNzdWVyX25hbWUsICZpc3N1ZXJfbmFtZV9zaXplKTsKKworICAgICAgZmRfbG9nX2RlYnVnKCJcdFZlcmlmaWVkIGFnYWluc3Q6ICVzIiwgaXNzdWVyX25hbWUpOworICAgIH0KKworICBpZiAoY3JsICE9IE5VTEwpCisgICAgeworICAgICAgaXNzdWVyX25hbWVfc2l6ZSA9IHNpemVvZiAoaXNzdWVyX25hbWUpOworICAgICAgZ251dGxzX3g1MDlfY3JsX2dldF9pc3N1ZXJfZG4gKGNybCwgaXNzdWVyX25hbWUsICZpc3N1ZXJfbmFtZV9zaXplKTsKKworICAgICAgZmRfbG9nX2RlYnVnKCJcdFZlcmlmaWVkIGFnYWluc3QgQ1JMIG9mOiAlcyIsIGlzc3Vlcl9uYW1lKTsKKyAgICB9CisKKyAgZmRfbG9nX2RlYnVnKCJcdFZlcmlmaWNhdGlvbiBvdXRwdXQ6ICV4IiwgdmVyaWZpY2F0aW9uX291dHB1dCk7CisKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogR05VVExTX1ZFUlNJT05fMzAwICovCisKKyNpZm5kZWYgR05VVExTX1ZFUlNJT05fMzAwCitHQ0NfRElBR19PRkYoIi1XZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMiKQorI2VuZGlmIC8qICFHTlVUTFNfVkVSU0lPTl8zMDAgKi8KKy8qIFBhcnNlIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgKHVzaW5nIHRoZSB5YWNjIHBhcnNlcikgKi8KK2ludCBmZF9jb25mX3BhcnNlKCkKK3sKKwlleHRlcm4gRklMRSAqIGZkZGluOworCWNvbnN0IGNoYXIgKiBvcmlnID0gTlVMTDsKKwkKKwkvKiBBdHRlbXB0IHRvIGZpbmQgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSAqLworCWlmICghZmRfZ19jb25maWctPmNuZl9maWxlKQorCQlmZF9nX2NvbmZpZy0+Y25mX2ZpbGUgPSBGRF9ERUZBVUxUX0NPTkZfRklMRU5BTUU7CisJCisJZmRkaW4gPSBmb3BlbihmZF9nX2NvbmZpZy0+Y25mX2ZpbGUsICJyIik7CisJaWYgKChmZGRpbiA9PSBOVUxMKSAmJiAoKmZkX2dfY29uZmlnLT5jbmZfZmlsZSAhPSAnLycpKSB7CisJCWNoYXIgKiBuZXdfY25mID0gTlVMTDsKKwkJLyogV2UgZ290IGEgcmVsYXRpdmUgcGF0aCwgYXR0ZW1wdCB0byBhZGQgdGhlIGRlZmF1bHQgZGlyZWN0b3J5IHByZWZpeCAqLworCQlvcmlnID0gZmRfZ19jb25maWctPmNuZl9maWxlOworCQlDSEVDS19NQUxMT0MoIG5ld19jbmYgPSBtYWxsb2Moc3RybGVuKG9yaWcpICsgc3RybGVuKERFRkFVTFRfQ09ORl9QQVRIKSArIDIpICk7IC8qIHdlIHdpbGwgbm90IGZyZWUgaXQsIGJ1dCBub3QgaW1wb3J0YW50ICovCisJCXNwcmludGYoIG5ld19jbmYsIERFRkFVTFRfQ09ORl9QQVRIICIvJXMiLCBvcmlnICk7CisJCWZkX2dfY29uZmlnLT5jbmZfZmlsZSA9IG5ld19jbmY7CisJCWZkZGluID0gZm9wZW4oZmRfZ19jb25maWctPmNuZl9maWxlLCAiciIpOworCX0KKwlpZiAoZmRkaW4gPT0gTlVMTCkgeworCQlpbnQgcmV0ID0gZXJybm87CisJCUxPR19GKCJVbmFibGUgdG8gb3BlbiBjb25maWd1cmF0aW9uIGZpbGUgZm9yIHJlYWRpbmc7IHRyaWVkIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOiAlcyVzJXM7IEVycm9yOiAlcyIsCisJCQkJICBvcmlnID86ICIiLCBvcmlnPyAiIGFuZCAiIDogIiIsIGZkX2dfY29uZmlnLT5jbmZfZmlsZSwgc3RyZXJyb3IocmV0KSk7CisJCXJldHVybiByZXQ7CisJfQorCQorCS8qIGNhbGwgeWFjYyBwYXJzZXIgKi8KKwlUUkFDRV9ERUJVRyAoRlVMTCwgIlBhcnNpbmcgY29uZmlndXJhdGlvbiBmaWxlOiAlcyIsIGZkX2dfY29uZmlnLT5jbmZfZmlsZSk7CisJQ0hFQ0tfRkNUKCAgZmRkcGFyc2UoZmRfZ19jb25maWcpICApOworCQorCS8qIGNsb3NlIHRoZSBmaWxlICovCisJZmNsb3NlKGZkZGluKTsKKwkKKwkvKiBDaGVjayB0aGF0IFRMUyBwcml2YXRlIGtleSB3YXMgZ2l2ZW4gKi8KKwlpZiAoISBmZF9nX2NvbmZpZy0+Y25mX3NlY19kYXRhLmtleV9maWxlKSB7CisJCS8qIElmIFRMUyBpcyBub3QgZW5hYmxlZCwgd2UgYWxsb3cgZW1wdHkgVExTIGNvbmZpZ3VyYXRpb24gKi8KKwkJaWYgKChmZF9nX2NvbmZpZy0+Y25mX3BvcnRfdGxzID09IDApICYmIChmZF9nX2NvbmZpZy0+Y25mX2ZsYWdzLnRsc19hbGcgPT0gMCkpIHsKKwkJCUxPR19OKCJUTFMgaXMgZGlzYWJsZWQsIHRoaXMgaXMgKk5PVCogYSByZWNvbW1lbmRlZCBwcmFjdGljZSEgRGlhbWV0ZXIgcHJvdG9jb2wgY29udmV5cyBoaWdobHkgc2Vuc2l0aXZlIGluZm9ybWF0aW9uIG9uIHlvdXIgdXNlcnMuIik7CisJCQlmZF9nX2NvbmZpZy0+Y25mX3NlY19kYXRhLnRsc19kaXNhYmxlZCA9IDE7CisJCX0gZWxzZSB7CisJCQlMT0dfRiggIk1pc3NpbmcgcHJpdmF0ZSBrZXkgY29uZmlndXJhdGlvbiBmb3IgVExTLiBQbGVhc2UgcHJvdmlkZSB0aGUgVExTX2NyZWQgY29uZmlndXJhdGlvbiBkaXJlY3RpdmUuIik7CisJCQlyZXR1cm4gRUlOVkFMOworCQl9CisJfQorCQorCS8qIFJlc29sdmUgaG9zdG5hbWUgaWYgbm90IHByb3ZpZGVkICovCisJaWYgKGZkX2dfY29uZmlnLT5jbmZfZGlhbWlkID09IE5VTEwpIHsKKwkJY2hhciBidWZbSE9TVF9OQU1FX01BWCArIDFdOworCQlzdHJ1Y3QgYWRkcmluZm8gaGludHMsICppbmZvOworCQlpbnQgcmV0OworCQkKKwkJLyogbG9jYWwgaG9zdCBuYW1lICovCisJCUNIRUNLX1NZUyhnZXRob3N0bmFtZShidWYsIHNpemVvZihidWYpKSk7CisJCQorCQkvKiBnZXQgRlFETiAqLworCQltZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YgaGludHMpOworCQloaW50cy5haV9mbGFncyA9IEFJX0NBTk9OTkFNRTsKKworCQlyZXQgPSBnZXRhZGRyaW5mbyhidWYsIE5VTEwsICZoaW50cywgJmluZm8pOworCQlpZiAocmV0ICE9IDApIHsKKwkJCVRSQUNFX0VSUk9SKCAiRXJyb3IgcmVzb2x2aW5nIGxvY2FsIEZRRE4gOiAnJXMnIDogJXMiCisJCQkJCSIuIFBsZWFzZSBwcm92aWRlIElkZW50aXR5IGluIGNvbmZpZ3VyYXRpb24gZmlsZS4iLAorCQkJCQlidWYsIGdhaV9zdHJlcnJvcihyZXQpKTsKKwkJCXJldHVybiBFSU5WQUw7CisJCX0KKwkJZmRfZ19jb25maWctPmNuZl9kaWFtaWQgPSBpbmZvLT5haV9jYW5vbm5hbWU7CisJCUNIRUNLX0ZDVCggZmRfb3NfdmFsaWRhdGVfRGlhbWV0ZXJJZGVudGl0eSgmZmRfZ19jb25maWctPmNuZl9kaWFtaWQsICZmZF9nX2NvbmZpZy0+Y25mX2RpYW1pZF9sZW4sIDEpICk7CisJCWZyZWVhZGRyaW5mbyhpbmZvKTsKKwl9IGVsc2UgeworCQlDSEVDS19GQ1QoIGZkX29zX3ZhbGlkYXRlX0RpYW1ldGVySWRlbnRpdHkoJmZkX2dfY29uZmlnLT5jbmZfZGlhbWlkLCAmZmRfZ19jb25maWctPmNuZl9kaWFtaWRfbGVuLCAwKSApOworCX0KKwkKKwkvKiBIYW5kbGUgdGhlIHJlYWxtIHBhcnQgKi8KKwlpZiAoZmRfZ19jb25maWctPmNuZl9kaWFtcmxtID09IE5VTEwpIHsKKwkJY2hhciAqIHN0YXJ0ID0gTlVMTDsKKwkJCisJCS8qIENoZWNrIHRoZSBkaWFtZXRlciBpZGVudGl0eSBpcyBhIGZxZG4gKi8KKwkJc3RhcnQgPSBzdHJjaHIoZmRfZ19jb25maWctPmNuZl9kaWFtaWQsICcuJyk7CisJCWlmICgoc3RhcnQgPT0gTlVMTCkgfHwgKHN0YXJ0WzFdID09ICdcMCcpKSB7CisJCQlUUkFDRV9FUlJPUiggIlVuYWJsZSB0byBleHRyYWN0IHJlYWxtIGZyb20gdGhlIElkZW50aXR5ICclcycuIgorCQkJCQkiIFBsZWFzZSBmaXggeW91ciBJZGVudGl0eSBzZXR0aW5nIG9yIHByb3ZpZGUgUmVhbG0uIiwKKwkJCQkJZmRfZ19jb25maWctPmNuZl9kaWFtaWQpOworCQkJcmV0dXJuIEVJTlZBTDsKKwkJfQorCQkKKwkJZmRfZ19jb25maWctPmNuZl9kaWFtcmxtID0gc3RhcnQgKyAxOworCQlDSEVDS19GQ1QoIGZkX29zX3ZhbGlkYXRlX0RpYW1ldGVySWRlbnRpdHkoJmZkX2dfY29uZmlnLT5jbmZfZGlhbXJsbSwgJmZkX2dfY29uZmlnLT5jbmZfZGlhbXJsbV9sZW4sIDEpICk7CisJfSBlbHNlIHsKKwkJQ0hFQ0tfRkNUKCBmZF9vc192YWxpZGF0ZV9EaWFtZXRlcklkZW50aXR5KCZmZF9nX2NvbmZpZy0+Y25mX2RpYW1ybG0sICZmZF9nX2NvbmZpZy0+Y25mX2RpYW1ybG1fbGVuLCAwKSApOworCX0KKwkKKwkvKiBWYWxpZGF0ZSBzb21lIGZsYWdzICovCisJaWYgKGZkX2dfY29uZmlnLT5jbmZfZmxhZ3Mubm9faXA0ICYmIGZkX2dfY29uZmlnLT5jbmZfZmxhZ3Mubm9faXA2KSB7CisJCVRSQUNFX0VSUk9SKCAiSVAgYW5kIElQdjYgY2Fubm90IGJlIGRpc2FibGVkIGF0IHRoZSBzYW1lIHRpbWUuIik7CisJCXJldHVybiBFSU5WQUw7CisJfQorCWlmIChmZF9nX2NvbmZpZy0+Y25mX2ZsYWdzLm5vX3RjcCAmJiBmZF9nX2NvbmZpZy0+Y25mX2ZsYWdzLm5vX3NjdHApIHsKKwkJVFJBQ0VfRVJST1IoICJUQ1AgYW5kIFNDVFAgY2Fubm90IGJlIGRpc2FibGVkIGF0IHRoZSBzYW1lIHRpbWUuIik7CisJCXJldHVybiBFSU5WQUw7CisJfQorCQorCS8qIFZhbGlkYXRlIGxvY2FsIGVuZHBvaW50cyAqLworCWlmICgoIUZEX0lTX0xJU1RfRU1QVFkoJmZkX2dfY29uZmlnLT5jbmZfZW5kcG9pbnRzKSkgJiYgKGZkX2dfY29uZmlnLT5jbmZfZmxhZ3Mubm9faXA0IHx8IGZkX2dfY29uZmlnLT5jbmZfZmxhZ3Mubm9faXA2KSkgeworCQlzdHJ1Y3QgZmRfbGlzdCAqIGxpOworCQlmb3IgKCBsaSA9IGZkX2dfY29uZmlnLT5jbmZfZW5kcG9pbnRzLm5leHQ7IGxpICE9ICZmZF9nX2NvbmZpZy0+Y25mX2VuZHBvaW50czsgbGkgPSBsaS0+bmV4dCkgeworCQkJc3RydWN0IGZkX2VuZHBvaW50ICogZXAgPSAoc3RydWN0IGZkX2VuZHBvaW50ICopbGk7CisJCQlpZiAoIChmZF9nX2NvbmZpZy0+Y25mX2ZsYWdzLm5vX2lwNCAmJiAoZXAtPnNhLnNhX2ZhbWlseSA9PSBBRl9JTkVUKSkKKwkJCSAgIHx8KGZkX2dfY29uZmlnLT5jbmZfZmxhZ3Mubm9faXA2ICYmIChlcC0+c2Euc2FfZmFtaWx5ID09IEFGX0lORVQ2KSkgKSB7CisJCQkJY2hhciBzYV9idWZbc1NBX0RVTVBfU1RSTEVOXTs7CisJCQkJbGkgPSBsaS0+cHJldjsKKwkJCQlmZF9saXN0X3VubGluaygmZXAtPmNoYWluKTsKKwkJCQlmZF9zYV9zZHVtcF9udW1lcmljKHNhX2J1ZiwgJmVwLT5zYSk7CisJCQkJTE9HX04oIkluZm86IFJlbW92aW5nIGxvY2FsIGFkZHJlc3MgY29uZmxpY3Rpbmcgd2l0aCB0aGUgZmxhZ3Mgbm9fSVAgLyBub19JUDYgOiAlcyIsIHNhX2J1Zik7CisJCQkJZnJlZShlcCk7CisJCQl9CisJCX0KKwl9CisJCisJLyogQ29uZmlndXJlIFRMUyBkZWZhdWx0IHBhcmFtZXRlcnMgKi8KKwlpZiAoKCFmZF9nX2NvbmZpZy0+Y25mX3NlY19kYXRhLnRsc19kaXNhYmxlZCkgJiYgKCFmZF9nX2NvbmZpZy0+Y25mX3NlY19kYXRhLnByaW9fc3RyaW5nKSkgeworCQljb25zdCBjaGFyICogZXJyX3BvcyA9IE5VTEw7CisJCUNIRUNLX0dOVVRMU19ETyggZ251dGxzX3ByaW9yaXR5X2luaXQoIAorCQkJCQkmZmRfZ19jb25maWctPmNuZl9zZWNfZGF0YS5wcmlvX2NhY2hlLAorCQkJCQlHTlVUTFNfREVGQVVMVF9QUklPUklUWSwKKwkJCQkJJmVycl9wb3MpLAorCQkJCSB7IFRSQUNFX0VSUk9SKCJFcnJvciBpbiBwcmlvcml0eSBzdHJpbmcgYXQgcG9zaXRpb24gOiAlcyIsIGVycl9wb3MpOyByZXR1cm4gRUlOVkFMOyB9ICk7CisJfQorCQorCS8qIFZlcmlmeSB0aGF0IG91ciBjZXJ0aWZpY2F0ZSBpcyB2YWxpZCAtLSBvdGhlcndpc2UgcmVtb3RlIHBlZXJzIHdpbGwgcmVqZWN0IGl0ICovCisJaWYgKCFmZF9nX2NvbmZpZy0+Y25mX3NlY19kYXRhLnRsc19kaXNhYmxlZCkgeworCQlpbnQgcmV0ID0gMCwgaTsKKwkJCisJCWdudXRsc19kYXR1bV90IGNlcnRmaWxlOworCQkKKwkJZ251dGxzX3g1MDlfY3J0X3QgKiBjZXJ0cyA9IE5VTEw7CisJCXVuc2lnbmVkIGludCBjZXJ0X21heCA9IDA7CisJCQorCQkKKwkJLyogUmVhZCB0aGUgY2VydGlmaWNhdGUgZmlsZSAqLworCQlGSUxFICpzdHJlYW0gPSBmb3BlbiAoZmRfZ19jb25maWctPmNuZl9zZWNfZGF0YS5jZXJ0X2ZpbGUsICJyYiIpOworCQlpZiAoIXN0cmVhbSkgeworCQkJaW50IGVyciA9IGVycm5vOworCQkJVFJBQ0VfREVCVUcoSU5GTywgIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIG9wZW5pbmcgJyVzJzogJXMiLCBmZF9nX2NvbmZpZy0+Y25mX3NlY19kYXRhLmNlcnRfZmlsZSwgc3RyZXJyb3IoZXJyKSk7CisJCQlyZXR1cm4gZXJyOyAKKwkJfQorCQlDSEVDS19GQ1QoIGZkX2NvbmZfc3RyZWFtX3RvX2dudXRsc19kYXR1bShzdHJlYW0sICZjZXJ0ZmlsZSkgKTsKKwkJZmNsb3NlKHN0cmVhbSk7CisJCQorCQkvKiBJbXBvcnQgdGhlIGNlcnRpZmljYXRlKHMpICovCisJCUdOVVRMU19UUkFDRSggcmV0ID0gZ251dGxzX3g1MDlfY3J0X2xpc3RfaW1wb3J0KE5VTEwsICZjZXJ0X21heCwgJmNlcnRmaWxlLCBHTlVUTFNfWDUwOV9GTVRfUEVNLCBHTlVUTFNfWDUwOV9DUlRfTElTVF9JTVBPUlRfRkFJTF9JRl9FWENFRUQpICk7CisJCWlmIChyZXQgIT0gR05VVExTX0VfU0hPUlRfTUVNT1JZX0JVRkZFUikgeworCQkJQ0hFQ0tfR05VVExTX0RPKHJldCwgcmV0dXJuIEVJTlZBTCk7CisJCX0KKwkJCisJCUNIRUNLX01BTExPQyggY2VydHMgPSBjYWxsb2MoY2VydF9tYXgsIHNpemVvZihnbnV0bHNfeDUwOV9jcnRfdCkpICk7CisJCUNIRUNLX0dOVVRMU19ETyggZ251dGxzX3g1MDlfY3J0X2xpc3RfaW1wb3J0KGNlcnRzLCAmY2VydF9tYXgsICZjZXJ0ZmlsZSwgR05VVExTX1g1MDlfRk1UX1BFTSwgCisJCQkJI2lmZGVmIEdOVVRMU19WRVJTSU9OXzMwMAorCQkJCUdOVVRMU19YNTA5X0NSVF9MSVNUX0ZBSUxfSUZfVU5TT1JURUQKKwkJCQkjZWxzZSAvKiBHTlVUTFNfVkVSU0lPTl8zMDAgKi8KKwkJCQkwCisJCQkJI2VuZGlmIC8qIEdOVVRMU19WRVJTSU9OXzMwMCAqLworCQkJCSksCisJCQl7CisJCQkJVFJBQ0VfRVJST1IoIkZhaWxlZCB0byBpbXBvcnQgdGhlIGRhdGEgZnJvbSBmaWxlICclcyciLCBmZF9nX2NvbmZpZy0+Y25mX3NlY19kYXRhLmNlcnRfZmlsZSk7CisJCQkJZnJlZShjZXJ0ZmlsZS5kYXRhKTsKKwkJCQlyZXR1cm4gRUlOVkFMOworCQkJfSApOworCQlmcmVlKGNlcnRmaWxlLmRhdGEpOworCQkKKwkJQVNTRVJUKGNlcnRfbWF4ID49IDEpOworCQkKKwkJLyogTm93LCB2ZXJpZnkgdGhlIGxpc3QgYWdhaW5zdCB0aGUgbG9jYWwgQ0EgYW5kIENSTCAqLworCQkKKwkJI2lmZGVmIEdOVVRMU19WRVJTSU9OXzMwMAorCQkKKwkJCS8qIFdlIHVzZSB0aGUgdHJ1c3QgbGlzdCBmb3IgdGhpcyBwdXJwb3NlICovCisJCXsKKwkJCXVuc2lnbmVkIGludCBvdXRwdXQ7CisJCQkKKwkJCWdudXRsc194NTA5X3RydXN0X2xpc3RfdmVyaWZ5X25hbWVkX2NydCAoCisJCQkJCQlmZF9nX2NvbmZpZy0+Y25mX3NlY19kYXRhLnRydXN0bGlzdCwgCisJCQkJCQljZXJ0c1swXSwgCisJCQkJCQlmZF9nX2NvbmZpZy0+Y25mX2RpYW1pZCwgCisJCQkJCQlmZF9nX2NvbmZpZy0+Y25mX2RpYW1pZF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkmb3V0cHV0LCAKKwkJCQkJCWZkX2NvbmZfcHJpbnRfZGV0YWlsc19mdW5jKTsKKworCQkJLyogaWYgdGhpcyBjZXJ0aWZpY2F0ZSBpcyBub3QgZXhwbGljaXRseSB0cnVzdGVkIHZlcmlmeSBhZ2FpbnN0IENBcyAKKwkJCSovCisJCQlpZiAob3V0cHV0ICE9IDApCisJCQl7CisJCQkJZ251dGxzX3g1MDlfdHJ1c3RfbGlzdF92ZXJpZnlfY3J0ICgKKwkJCQkJCQlmZF9nX2NvbmZpZy0+Y25mX3NlY19kYXRhLnRydXN0bGlzdCwgCisJCQkJCQkJY2VydHMsIAorCQkJCQkJCWNlcnRfbWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkmb3V0cHV0LCAKKwkJCQkJCQlmZF9jb25mX3ByaW50X2RldGFpbHNfZnVuYyk7CisJCQl9CisJCQkKKwkJCWlmIChvdXRwdXQgJiBHTlVUTFNfQ0VSVF9JTlZBTElEKQorCQkJeworCQkJCWZkX2xvZ19kZWJ1ZygiVExTOiBMb2NhbCBjZXJ0aWZpY2F0ZSBjaGFpbiAnJXMnIGlzIGludmFsaWQgOiIsIGZkX2dfY29uZmlnLT5jbmZfc2VjX2RhdGEuY2VydF9maWxlKTsKKwkJCQlpZiAob3V0cHV0ICYgR05VVExTX0NFUlRfU0lHTkVSX05PVF9GT1VORCkKKwkJCQkJVFJBQ0VfRVJST1IoIiAtIFRoZSBjZXJ0aWZpY2F0ZSBoYXNuJ3QgZ290IGEga25vd24gaXNzdWVyLiBEaWQgeW91IGZvcmdldCB0byBzcGVjaWZ5IFRMU19DQSA/Iik7CisJCQkJaWYgKG91dHB1dCAmIEdOVVRMU19DRVJUX1NJR05FUl9OT1RfQ0EpCisJCQkJCVRSQUNFX0VSUk9SKCIgLSBUaGUgY2VydGlmaWNhdGUgc2lnbmVyIGlzIG5vdCBhIENBLCBvciB1c2VzIHZlcnNpb24gMSwgb3IgMyB3aXRob3V0IGJhc2ljIGNvbnN0cmFpbnRzLiIpOworCQkJCWlmIChvdXRwdXQgJiBHTlVUTFNfQ0VSVF9OT1RfQUNUSVZBVEVEKQorCQkJCQlUUkFDRV9FUlJPUigiIC0gVGhlIGNlcnRpZmljYXRlIGlzIG5vdCB5ZXQgYWN0aXZhdGVkLiIpOworCQkJCWlmIChvdXRwdXQgJiBHTlVUTFNfQ0VSVF9FWFBJUkVEKQorCQkJCQlUUkFDRV9FUlJPUigiIC0gVGhlIGNlcnRpZmljYXRlIGlzIGV4cGlyZWQuIik7CisJCQkJcmV0dXJuIEVJTlZBTDsKKwkJCX0KKwkJCQorCQkJLyogTm93IGNoZWNrIHRoZSBzdWJqZWN0IG1hdGNoZXMgb3VyIGhvc3RuYW1lICovCisJCQlpZiAoIWdudXRsc194NTA5X2NydF9jaGVja19ob3N0bmFtZSAoY2VydHNbMF0sIGZkX2dfY29uZmlnLT5jbmZfZGlhbWlkKSkKKwkJCXsKKwkJCQlUUkFDRV9FUlJPUigiVExTOiBUaGUgY2VydGlmaWNhdGUgb3duZXIgZG9lcyBub3QgbWF0Y2ggdGhlIGhvc3RuYW1lICclcyciLCBmZF9nX2NvbmZpZy0+Y25mX2RpYW1pZCk7CisJCQkJcmV0dXJuIEVJTlZBTDsKKwkJCX0KKwkJCQorCQl9CisJCQorCisJCSNlbHNlIC8qIEdOVVRMU19WRVJTSU9OXzMwMCAqLyAKKwkJCisJCQkvKiBHbnVUTFMgMi54IHdheSBvZiBjaGVja2luZyBjZXJ0aWZpY2F0ZXMgKi8KKwkJeworCQkJZ251dGxzX3g1MDlfY3J0X3QgKiBDQV9saXN0OworCQkJaW50IENBX2xpc3RfbGVuZ3RoOworCisJCQlnbnV0bHNfeDUwOV9jcmxfdCAqIENSTF9saXN0OworCQkJaW50IENSTF9saXN0X2xlbmd0aDsKKwkJCQorCQkJdW5zaWduZWQgaW50IHZlcmlmeTsKKwkJCXRpbWVfdCBub3c7CisJCQlHTlVUTFNfVFJBQ0UoIGdudXRsc19jZXJ0aWZpY2F0ZV9nZXRfeDUwOV9jYXMgKGZkX2dfY29uZmlnLT5jbmZfc2VjX2RhdGEuY3JlZGVudGlhbHMsICZDQV9saXN0LCAodW5zaWduZWQgaW50ICopICZDQV9saXN0X2xlbmd0aCkgKTsKKwkJCUdOVVRMU19UUkFDRSggZ251dGxzX2NlcnRpZmljYXRlX2dldF94NTA5X2NybHMgKGZkX2dfY29uZmlnLT5jbmZfc2VjX2RhdGEuY3JlZGVudGlhbHMsICZDUkxfbGlzdCwgKHVuc2lnbmVkIGludCAqKSAmQ1JMX2xpc3RfbGVuZ3RoKSApOworCQkJQ0hFQ0tfR05VVExTX0RPKCBnbnV0bHNfeDUwOV9jcnRfbGlzdF92ZXJpZnkoY2VydHMsIGNlcnRfbWF4LCBDQV9saXN0LCBDQV9saXN0X2xlbmd0aCwgQ1JMX2xpc3QsIENSTF9saXN0X2xlbmd0aCwgMCwgJnZlcmlmeSksCisJCQkJeworCQkJCQlUUkFDRV9FUlJPUigiRmFpbGVkIHRvIHZlcmlmeSB0aGUgbG9jYWwgY2VydGlmaWNhdGUgJyVzJyBhZ2FpbnN0IGxvY2FsIGNyZWRlbnRpYWxzLiBQbGVhc2UgY2hlY2sgeW91ciBjZXJ0aWZpY2F0ZSBpcyB2YWxpZC4iLCBmZF9nX2NvbmZpZy0+Y25mX3NlY19kYXRhLmNlcnRfZmlsZSk7CisJCQkJCXJldHVybiBFSU5WQUw7CisJCQkJfSApOworCQkJCQorCQkJaWYgKHZlcmlmeSkgeworCQkJCWZkX2xvZ19kZWJ1ZygiVExTOiBMb2NhbCBjZXJ0aWZpY2F0ZSBjaGFpbiAnJXMnIGlzIGludmFsaWQgOiIsIGZkX2dfY29uZmlnLT5jbmZfc2VjX2RhdGEuY2VydF9maWxlKTsKKwkJCQlpZiAodmVyaWZ5ICYgR05VVExTX0NFUlRfSU5WQUxJRCkKKwkJCQkJVFJBQ0VfRVJST1IoIiAtIFRoZSBjZXJ0aWZpY2F0ZSBpcyBub3QgdHJ1c3RlZCAodW5rbm93biBDQT8gZXhwaXJlZD8pIik7CisJCQkJaWYgKHZlcmlmeSAmIEdOVVRMU19DRVJUX1JFVk9LRUQpCisJCQkJCVRSQUNFX0VSUk9SKCIgLSBUaGUgY2VydGlmaWNhdGUgaGFzIGJlZW4gcmV2b2tlZC4iKTsKKwkJCQlpZiAodmVyaWZ5ICYgR05VVExTX0NFUlRfU0lHTkVSX05PVF9GT1VORCkKKwkJCQkJVFJBQ0VfRVJST1IoIiAtIFRoZSBjZXJ0aWZpY2F0ZSBoYXNuJ3QgZ290IGEga25vd24gaXNzdWVyLiIpOworCQkJCWlmICh2ZXJpZnkgJiBHTlVUTFNfQ0VSVF9TSUdORVJfTk9UX0NBKQorCQkJCQlUUkFDRV9FUlJPUigiIC0gVGhlIGNlcnRpZmljYXRlIHNpZ25lciBpcyBub3QgYSBDQSwgb3IgdXNlcyB2ZXJzaW9uIDEsIG9yIDMgd2l0aG91dCBiYXNpYyBjb25zdHJhaW50cy4iKTsKKwkJCQlpZiAodmVyaWZ5ICYgR05VVExTX0NFUlRfSU5TRUNVUkVfQUxHT1JJVEhNKQorCQkJCQlUUkFDRV9FUlJPUigiIC0gVGhlIGNlcnRpZmljYXRlIHNpZ25hdHVyZSB1c2VzIGEgd2VhayBhbGdvcml0aG0uIik7CisJCQkJcmV0dXJuIEVJTlZBTDsKKwkJCX0KKworCQkJLyogQ2hlY2sgdGhlIGxvY2FsIElkZW50aXR5IGlzIHZhbGlkIHdpdGggdGhlIGNlcnRpZmljYXRlICovCisJCQlpZiAoIWdudXRsc194NTA5X2NydF9jaGVja19ob3N0bmFtZSAoY2VydHNbMF0sIGZkX2dfY29uZmlnLT5jbmZfZGlhbWlkKSkgeworCQkJCVRSQUNFX0VSUk9SKCJUTFM6IExvY2FsIGNlcnRpZmljYXRlICclcycgaXMgaW52YWxpZCA6IiwgZmRfZ19jb25maWctPmNuZl9zZWNfZGF0YS5jZXJ0X2ZpbGUpOworCQkJCVRSQUNFX0VSUk9SKCIgLSBUaGUgY2VydGlmaWNhdGUgaG9zdG5hbWUgZG9lcyBub3QgbWF0Y2ggJyVzJyIsIGZkX2dfY29uZmlnLT5jbmZfZGlhbWlkKTsKKwkJCQlyZXR1cm4gRUlOVkFMOworCQkJfQorCisJCQkvKiBDaGVjayB2YWxpZGl0eSBvZiBhbGwgdGhlIGNlcnRpZmljYXRlcyBpbiB0aGUgY2hhaW4gKi8KKwkJCW5vdyA9IHRpbWUoTlVMTCk7CisJCQlmb3IgKGkgPSAwOyBpIDwgY2VydF9tYXg7IGkrKykKKwkJCXsKKwkJCQl0aW1lX3QgZGVhZGxpbmU7CisKKwkJCQlHTlVUTFNfVFJBQ0UoIGRlYWRsaW5lID0gZ251dGxzX3g1MDlfY3J0X2dldF9leHBpcmF0aW9uX3RpbWUoY2VydHNbaV0pICk7CisJCQkJaWYgKChkZWFkbGluZSAhPSAodGltZV90KS0xKSAmJiAoZGVhZGxpbmUgPCBub3cpKSB7CisJCQkJCVRSQUNFX0VSUk9SKCJUTFM6IExvY2FsIGNlcnRpZmljYXRlIGNoYWluICclcycgaXMgaW52YWxpZCA6IiwgZmRfZ19jb25maWctPmNuZl9zZWNfZGF0YS5jZXJ0X2ZpbGUpOworCQkJCQlUUkFDRV9FUlJPUigiIC0gVGhlIGNlcnRpZmljYXRlICVkIGluIHRoZSBjaGFpbiBpcyBleHBpcmVkIiwgaSk7CisJCQkJCXJldHVybiBFSU5WQUw7CisJCQkJfQorCisJCQkJR05VVExTX1RSQUNFKCBkZWFkbGluZSA9IGdudXRsc194NTA5X2NydF9nZXRfYWN0aXZhdGlvbl90aW1lKGNlcnRzW2ldKSApOworCQkJCWlmICgoZGVhZGxpbmUgIT0gKHRpbWVfdCktMSkgJiYgKGRlYWRsaW5lID4gbm93KSkgeworCQkJCQlUUkFDRV9FUlJPUigiVExTOiBMb2NhbCBjZXJ0aWZpY2F0ZSBjaGFpbiAnJXMnIGlzIGludmFsaWQgOiIsIGZkX2dfY29uZmlnLT5jbmZfc2VjX2RhdGEuY2VydF9maWxlKTsKKwkJCQkJVFJBQ0VfRVJST1IoIiAtIFRoZSBjZXJ0aWZpY2F0ZSAlZCBpbiB0aGUgY2hhaW4gaXMgbm90IHlldCBhY3RpdmF0ZWQiLCBpKTsKKwkJCQkJcmV0dXJuIEVJTlZBTDsKKwkJCQl9CisJCQl9CisJCX0KKwkJI2VuZGlmIC8qIEdOVVRMU19WRVJTSU9OXzMwMCAqLyAKKwkJCisJCS8qIEV2ZXJ5dGhpbmcgY2hlY2tlZCBPSywgZnJlZSB0aGUgY2VydGlmaWNhdGUgbGlzdCAqLworCQlmb3IgKGkgPSAwOyBpIDwgY2VydF9tYXg7IGkrKykKKwkJeworCQkJR05VVExTX1RSQUNFKCBnbnV0bHNfeDUwOV9jcnRfZGVpbml0IChjZXJ0c1tpXSkgKTsKKwkJfQorCQlmcmVlKGNlcnRzKTsKKwkKKwkJI2lmZGVmIEdOVVRMU19WRVJTSU9OXzMwMAorCQkvKiBVc2UgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uIGR1cmluZyB0aGUgaGFuZHNoYWtlICovCisJCWdudXRsc19jZXJ0aWZpY2F0ZV9zZXRfdmVyaWZ5X2Z1bmN0aW9uIChmZF9nX2NvbmZpZy0+Y25mX3NlY19kYXRhLmNyZWRlbnRpYWxzLCBmZF90bHNfdmVyaWZ5X2NyZWRlbnRpYWxzXzIpOworCQkjZW5kaWYgLyogR05VVExTX1ZFUlNJT05fMzAwICovCisKKwl9CisJCisJLyogZ251dGxzX2NlcnRpZmljYXRlX3NldF92ZXJpZnlfbGltaXRzIC0tIHNvIGZhciB0aGUgZGVmYXVsdCB2YWx1ZXMgYXJlIGZpbmUuLi4gKi8KKwkKKwkvKiBESCAqLworCWlmICghZmRfZ19jb25maWctPmNuZl9zZWNfZGF0YS50bHNfZGlzYWJsZWQpIHsKKwkJaWYgKGZkX2dfY29uZmlnLT5jbmZfc2VjX2RhdGEuZGhfZmlsZSkgeworCQkJZ251dGxzX2RhdHVtX3QgZGhwYXJhbXMgPSB7IE5VTEwsIDAgfTsKKwkJCXNpemVfdCBhbGxvYyA9IDA7CisJCQlGSUxFICpzdHJlYW0gPSBmb3BlbiAoZmRfZ19jb25maWctPmNuZl9zZWNfZGF0YS5kaF9maWxlLCAicmIiKTsKKwkJCWlmICghc3RyZWFtKSB7CisJCQkJaW50IGVyciA9IGVycm5vOworCQkJCVRSQUNFX0RFQlVHKElORk8sICJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBvcGVuaW5nICclcyc6ICVzIiwgZmRfZ19jb25maWctPmNuZl9zZWNfZGF0YS5kaF9maWxlLCBzdHJlcnJvcihlcnIpKTsKKwkJCQlyZXR1cm4gZXJyOyAKKwkJCX0KKwkJCWRvIHsKKwkJCQl1aW50OF90ICogcmVhbGxvY2VkID0gTlVMTDsKKwkJCQlzaXplX3QgcmVhZCA9IDA7CisKKwkJCQlpZiAoYWxsb2MgPCBkaHBhcmFtcy5zaXplICsgQlVGU0laICsgMSkgeworCQkJCQlhbGxvYyArPSBhbGxvYyAvIDIgKyBCVUZTSVogKyAxOworCQkJCQlDSEVDS19NQUxMT0NfRE8oIHJlYWxsb2NlZCA9IHJlYWxsb2MoZGhwYXJhbXMuZGF0YSwgYWxsb2MpLAorCQkJCQkJeworCQkJCQkJCWZyZWUoZGhwYXJhbXMuZGF0YSk7CisJCQkJCQkJcmV0dXJuIEVOT01FTTsKKwkJCQkJCX0gKQorCQkJCQlkaHBhcmFtcy5kYXRhID0gcmVhbGxvY2VkOworCQkJCX0KKworCQkJCXJlYWQgPSBmcmVhZCggZGhwYXJhbXMuZGF0YSArIGRocGFyYW1zLnNpemUsIDEsIGFsbG9jIC0gZGhwYXJhbXMuc2l6ZSAtIDEsIHN0cmVhbSApOworCQkJCWRocGFyYW1zLnNpemUgKz0gcmVhZDsKKworCQkJCWlmIChmZXJyb3Ioc3RyZWFtKSkgeworCQkJCQlpbnQgZXJyID0gZXJybm87CisJCQkJCVRSQUNFX0RFQlVHKElORk8sICJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSByZWFkaW5nICclcyc6ICVzIiwgZmRfZ19jb25maWctPmNuZl9zZWNfZGF0YS5kaF9maWxlLCBzdHJlcnJvcihlcnIpKTsKKwkJCQkJcmV0dXJuIGVycjsgCisJCQkJfQorCQkJfSB3aGlsZSAoIWZlb2Yoc3RyZWFtKSk7CisJCQlkaHBhcmFtcy5kYXRhW2RocGFyYW1zLnNpemVdID0gJ1wwJzsKKwkJCWZjbG9zZShzdHJlYW0pOworCQkJQ0hFQ0tfR05VVExTX0RPKCBnbnV0bHNfZGhfcGFyYW1zX2ltcG9ydF9wa2NzMyggCisJCQkJCQlmZF9nX2NvbmZpZy0+Y25mX3NlY19kYXRhLmRoX2NhY2hlLAorCQkJCQkJJmRocGFyYW1zLAorCQkJCQkJR05VVExTX1g1MDlfRk1UX1BFTSksCisJCQkJCQkgeyBUUkFDRV9FUlJPUigiRXJyb3IgaW4gREggYml0cyB2YWx1ZSA6ICVkIiwgZmRfZ19jb25maWctPmNuZl9zZWNfZGF0YS5kaF9iaXRzID86IEdOVVRMU19ERUZBVUxUX0RIQklUUyk7IHJldHVybiBFSU5WQUw7IH0gKTsKKwkJCWZyZWUoZGhwYXJhbXMuZGF0YSk7CisKKwkJfSBlbHNlIHsKKwkJCUxPR19EKCAiR2VuZXJhdGluZyBmcmVzaCBEaWZmaWUtSGVsbG1hbiBwYXJhbWV0ZXJzIG9mIHNpemUgJWQgKHRoaXMgdGFrZXMgc29tZSB0aW1lKS4uLiAiLCBmZF9nX2NvbmZpZy0+Y25mX3NlY19kYXRhLmRoX2JpdHMgPzogR05VVExTX0RFRkFVTFRfREhCSVRTKTsKKwkJCUNIRUNLX0dOVVRMU19ETyggZ251dGxzX2RoX3BhcmFtc19nZW5lcmF0ZTIoIAorCQkJCQkJZmRfZ19jb25maWctPmNuZl9zZWNfZGF0YS5kaF9jYWNoZSwKKwkJCQkJCWZkX2dfY29uZmlnLT5jbmZfc2VjX2RhdGEuZGhfYml0cyA/OiBHTlVUTFNfREVGQVVMVF9ESEJJVFMpLAorCQkJCQkJIHsgVFJBQ0VfRVJST1IoIkVycm9yIGluIERIIGJpdHMgdmFsdWUgOiAlZCIsIGZkX2dfY29uZmlnLT5jbmZfc2VjX2RhdGEuZGhfYml0cyA/OiBHTlVUTFNfREVGQVVMVF9ESEJJVFMpOyByZXR1cm4gRUlOVkFMOyB9ICk7CisJCX0JCQkKKwkKKwl9CisJCisJcmV0dXJuIDA7Cit9CisjaWZuZGVmIEdOVVRMU19WRVJTSU9OXzMwMAorR0NDX0RJQUdfT04oIi1XZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMiKQorI2VuZGlmIC8qICFHTlVUTFNfVkVSU0lPTl8zMDAgKi8KKworCisvKiBEZXN0cm95IGNvbnRlbnRzIG9mIGZkX2dfY29uZmlnIHN0cnVjdHVyZSAqLworaW50IGZkX2NvbmZfZGVpbml0KCkKK3sKKwlUUkFDRV9FTlRSWSgpOworCQorCWlmICghZmRfZ19jb25maWcpCisJCXJldHVybiAwOworCQorCS8qIEZyZWUgdGhlIFRMUyBwYXJhbWV0ZXJzICovCisjaWZkZWYgR05VVExTX1ZFUlNJT05fMzAwCisJZ251dGxzX3g1MDlfdHJ1c3RfbGlzdF9kZWluaXQoZmRfZ19jb25maWctPmNuZl9zZWNfZGF0YS50cnVzdGxpc3QsIDEpOworI2VuZGlmIC8qIEdOVVRMU19WRVJTSU9OXzMwMCAqLworCWdudXRsc19wcmlvcml0eV9kZWluaXQoZmRfZ19jb25maWctPmNuZl9zZWNfZGF0YS5wcmlvX2NhY2hlKTsKKwlnbnV0bHNfZGhfcGFyYW1zX2RlaW5pdChmZF9nX2NvbmZpZy0+Y25mX3NlY19kYXRhLmRoX2NhY2hlKTsKKwlnbnV0bHNfY2VydGlmaWNhdGVfZnJlZV9jcmVkZW50aWFscyhmZF9nX2NvbmZpZy0+Y25mX3NlY19kYXRhLmNyZWRlbnRpYWxzKTsKKwkKKwlmcmVlKGZkX2dfY29uZmlnLT5jbmZfc2VjX2RhdGEuY2VydF9maWxlKTsgZmRfZ19jb25maWctPmNuZl9zZWNfZGF0YS5jZXJ0X2ZpbGUgPSBOVUxMOworCWZyZWUoZmRfZ19jb25maWctPmNuZl9zZWNfZGF0YS5rZXlfZmlsZSk7IGZkX2dfY29uZmlnLT5jbmZfc2VjX2RhdGEua2V5X2ZpbGUgPSBOVUxMOworCWZyZWUoZmRfZ19jb25maWctPmNuZl9zZWNfZGF0YS5jYV9maWxlKTsgZmRfZ19jb25maWctPmNuZl9zZWNfZGF0YS5jYV9maWxlID0gTlVMTDsKKwlmcmVlKGZkX2dfY29uZmlnLT5jbmZfc2VjX2RhdGEuY3JsX2ZpbGUpOyBmZF9nX2NvbmZpZy0+Y25mX3NlY19kYXRhLmNybF9maWxlID0gTlVMTDsKKwlmcmVlKGZkX2dfY29uZmlnLT5jbmZfc2VjX2RhdGEucHJpb19zdHJpbmcpOyBmZF9nX2NvbmZpZy0+Y25mX3NlY19kYXRhLnByaW9fc3RyaW5nID0gTlVMTDsKKwlmcmVlKGZkX2dfY29uZmlnLT5jbmZfc2VjX2RhdGEuZGhfZmlsZSk7IGZkX2dfY29uZmlnLT5jbmZfc2VjX2RhdGEuZGhfZmlsZSA9IE5VTEw7CisJCisJLyogRGVzdHJveSBkaWN0aW9uYXJ5ICovCisJQ0hFQ0tfRkNUX0RPKCBmZF9kaWN0X2ZpbmkoJmZkX2dfY29uZmlnLT5jbmZfZGljdCksICk7CisJCisJLyogRGVzdHJveSB0aGUgbWFpbiBldmVudCBxdWV1ZSAqLworCUNIRUNLX0ZDVF9ETyggZmRfZmlmb19kZWwoJmZkX2dfY29uZmlnLT5jbmZfbWFpbl9ldiksICk7CisJCisJLyogRGVzdHJveSB0aGUgbG9jYWwgZW5kcG9pbnRzIGFuZCBhcHBsaWNhdGlvbnMgKi8KKwlDSEVDS19GQ1RfRE8oZmRfZXBfZmlsdGVyKCZmZF9nX2NvbmZpZy0+Y25mX2VuZHBvaW50cywgMCApLCApOworCUNIRUNLX0ZDVF9ETyhmZF9hcHBfZW1wdHkoJmZkX2dfY29uZmlnLT5jbmZfYXBwcyApLCApOworCQorCS8qIERlc3Ryb3kgdGhlIGxvY2FsIGlkZW50aXR5ICovCQorCWZyZWUoZmRfZ19jb25maWctPmNuZl9kaWFtaWQpOyBmZF9nX2NvbmZpZy0+Y25mX2RpYW1pZCA9IE5VTEw7CisJZnJlZShmZF9nX2NvbmZpZy0+Y25mX2RpYW1ybG0pOyBmZF9nX2NvbmZpZy0+Y25mX2RpYW1ybG0gPSBOVUxMOworCQorCXJldHVybiAwOworfQorCisKZGlmZiAtLWdpdCBhL2xpYmZkY29yZS9jb3JlLmMgYi9saWJmZGNvcmUvY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzOTA5YjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJmZGNvcmUvY29yZS5jCkBAIC0wLDAgKzEsMzczIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxMywgV0lERSBQcm9qZWN0IGFuZCBOSUNUCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBXSURFIFByb2plY3Qgb3IgTklDVCBub3IgdGhlIAkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFdJREUgUHJvamVjdCBhbmQgCQkJCQkJICoKKyogICBOSUNULgkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJmZGNvcmUtaW50ZXJuYWwuaCIKKworR0NDX0RJQUdfT0ZGKCItV2RlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIikKKyNpbmNsdWRlIDxnY3J5cHQuaD4KK0dDQ19ESUFHX09OKCItV2RlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIikKKworLyogVGhlIHN0YXRpYyBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSAqLworc3RhdGljIHN0cnVjdCBmZF9jb25maWcgZ19jb25mOworc3RydWN0IGZkX2NvbmZpZyAqIGZkX2dfY29uZmlnID0gTlVMTDsKKworLyogZ2NyeXB0IGZ1bmN0aW9ucyB0byBzdXBwb3J0IHBvc2l4IHRocmVhZHMgKi8KKyNpZm5kZWYgR05VVExTX1ZFUlNJT05fMjEwCitHQ1JZX1RIUkVBRF9PUFRJT05fUFRIUkVBRF9JTVBMOworI2VuZGlmIC8qIEdOVVRMU19WRVJTSU9OXzIxMCAqLworCisvKiBUaHJlYWQgdGhhdCBwcm9jZXNzIGluY29taW5nIGV2ZW50cyBvbiB0aGUgbWFpbiBxdWV1ZSAtLSBhbmQgdGVybWluYXRlcyB0aGUgZnJhbWV3b3JrIHdoZW4gcmVxdWVzdGVkICovCitzdGF0aWMgcHRocmVhZF90IGNvcmVfcnVubmVyID0gKHB0aHJlYWRfdClOVUxMOworCisvKiBTaWduYWwgZXh0ZW5zaW9ucyB3aGVuIHRoZSBmcmFtZXdvcmsgaXMgY29tcGxldGVseSBpbml0aWFsaXplZCAodGhleSBhcmUgd2FpdGluZyBpbiBmZF9jb3JlX3dhaXRzdGFydGNvbXBsZXRlKCkpICovCitzdGF0aWMgZW51bSBjb3JlX3N0YXRlIHsKKwlDT1JFX05PVF9JTklULAkvKiBpbml0aWFsIHN0YXRlICovCisJQ09SRV9MSUJTX0lOSVQsCS8qIGZkX2NvcmVfaW5pdGlhbGl6ZSB3YXMgY2FsbGVkICovCisJQ09SRV9DT05GX1JFQURZLC8qIENvbmZpZ3VyYXRpb24gd2FzIHBhcnNlZCwgZXh0ZW5zaW9ucyBhcmUgbG9hZGVkICovCisJQ09SRV9SVU5OSU5HLAkvKiBTZXJ2ZXJzIGFuZCBjbGllbnRzIGFyZSBzdGFydGVkLCBjb3JlX3J1bm5lciB0aHJlYWQgaXMgcnVubmluZyAqLworCUNPUkVfU0hVVERPV04sCS8qIFRoZSBmcmFtZXdvcmsgaXMgdGVybWluYXRpbmcgYWxsIG9iamVjdHMgKi8KKwlDT1JFX1RFUk0JLyogU2h1dGRvd24gY29tcGxldGUuICovCQorfSBjb3JlX3N0YXRlID0gQ09SRV9OT1RfSU5JVDsKK3N0YXRpYyBwdGhyZWFkX211dGV4X3QgY29yZV9tdHggPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOworc3RhdGljIHB0aHJlYWRfY29uZF90ICBjb3JlX2NuZCA9IFBUSFJFQURfQ09ORF9JTklUSUFMSVpFUjsKKworc3RhdGljIGVudW0gY29yZV9zdGF0ZSBjb3JlX3N0YXRlX2dldCh2b2lkKQoreworCWVudW0gY29yZV9zdGF0ZSBjdXJfc3RhdGU7CisJQ0hFQ0tfUE9TSVhfRE8oIHB0aHJlYWRfbXV0ZXhfbG9jayggJmNvcmVfbXR4ICksICk7CisJY3VyX3N0YXRlID0gY29yZV9zdGF0ZTsKKwlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9tdXRleF91bmxvY2soICZjb3JlX210eCApLCApOworCXJldHVybiBjdXJfc3RhdGU7Cit9CisKK3N0YXRpYyB2b2lkIGNvcmVfc3RhdGVfc2V0KGVudW0gY29yZV9zdGF0ZSBuZXdzdGF0ZSkKK3sKKwlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9tdXRleF9sb2NrKCAmY29yZV9tdHggKSwgKTsKKwlMT0dfRCgiQ29yZSBzdGF0ZTogJWQgLT4gJWQiLCBjb3JlX3N0YXRlLCBuZXdzdGF0ZSk7CisJY29yZV9zdGF0ZSA9IG5ld3N0YXRlOworCUNIRUNLX1BPU0lYX0RPKCBwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KCAmY29yZV9jbmQgKSwgKTsKKwlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9tdXRleF91bmxvY2soICZjb3JlX210eCApLCApOworfQorCitzdGF0aWMgaW50IGNvcmVfc3RhdGVfd2FpdChlbnVtIGNvcmVfc3RhdGUgd2FpdHN0YXRlKQoreworCWludCByZXQgPSAwOworCUNIRUNLX1BPU0lYKCBwdGhyZWFkX211dGV4X2xvY2soICZjb3JlX210eCApKTsKKwlwdGhyZWFkX2NsZWFudXBfcHVzaCggZmRfY2xlYW51cF9tdXRleCwgJmNvcmVfbXR4ICk7CisJd2hpbGUgKHdhaXRzdGF0ZSA+IGNvcmVfc3RhdGUpIHsKKwkJQ0hFQ0tfUE9TSVhfRE8ocmV0ID0gcHRocmVhZF9jb25kX3dhaXQoJmNvcmVfY25kLCAmY29yZV9tdHgpLCBicmVhayk7CisJfQorCXB0aHJlYWRfY2xlYW51cF9wb3AoIDAgKTsKKwlDSEVDS19QT1NJWCggcHRocmVhZF9tdXRleF91bmxvY2soICZjb3JlX210eCApKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBjb3JlX3NodXRkb3duKHZvaWQpCit7CisJTE9HX04oIEZEX1BST0pFQ1RfQklOQVJZICIgZnJhbWV3b3JrIGlzIHN0b3BwaW5nLi4uIik7CisJZmRfbG9nX3RocmVhZG5hbWUoImZEIENvcmUgU2h1dGRvd24iKTsKKwkKKwkvKiBjbGVhbnVwcyAqLworCUNIRUNLX0ZDVF9ETyggZmRfc2VydmVyc19zdG9wKCksIC8qIFN0b3AgYWNjZXB0aW5nIG5ldyBjb25uZWN0aW9ucyAqLyApOworCUNIRUNLX0ZDVF9ETyggZmRfcnRkaXNwX2NsZWFuc3RvcCgpLCAvKiBTdG9wIGRpc3BhdGNoIHRocmVhZChzKSBhZnRlciBhIGNsZWFuIGxvb3AgaWYgcG9zc2libGUgKi8gKTsKKwlDSEVDS19GQ1RfRE8oIGZkX3BlZXJfZmluaSgpLCAvKiBTdG9wIGFsbCBjb25uZWN0aW9ucyAqLyApOworCUNIRUNLX0ZDVF9ETyggZmRfcnRkaXNwX2ZpbmkoKSwgLyogU3RvcCByb3V0aW5nIHRocmVhZHMgYW5kIGRlc3Ryb3kgcm91dGluZyBxdWV1ZXMgKi8gKTsKKwkKKwlDSEVDS19GQ1RfRE8oIGZkX2V4dF90ZXJtKCksIC8qIENsZWFudXAgYWxsIGV4dGVuc2lvbnMgKi8gKTsKKwlDSEVDS19GQ1RfRE8oIGZkX3J0ZGlzcF9jbGVhbnVwKCksIC8qIGRlc3Ryb3kgcmVtYWluaW5nIGhhbmRsZXJzICovICk7CisJCisJR05VVExTX1RSQUNFKCBnbnV0bHNfZ2xvYmFsX2RlaW5pdCgpICk7CisJCisJQ0hFQ0tfRkNUX0RPKCBmZF9jb25mX2RlaW5pdCgpLCApOworCQorCUNIRUNLX0ZDVF9ETyggZmRfZXZlbnRfdHJpZ19maW5pKCksICk7CisJCisJZmRfbG9nX2RlYnVnKEZEX1BST0pFQ1RfQklOQVJZICIgZnJhbWV3b3JrIGlzIHRlcm1pbmF0ZWQuIik7CisJCisJZmRfbGlicHJvdG9fZmluaSgpOworCQorfQkKKworCitzdGF0aWMgdm9pZCAqIGNvcmVfcnVubmVyX3RocmVhZCh2b2lkICogYXJnKSAKK3sKKwlmZF9sb2dfdGhyZWFkbmFtZSgiZkQgQ29yZSBSdW5uZXIiKTsKKwkKKwljb3JlX3N0YXRlX3dhaXQoQ09SRV9SVU5OSU5HKTsKKwkKKwkvKiBIYW5kbGUgZXZlbnRzIGluY29taW5nIG9uIHRoZSBtYWluIGV2ZW50IHF1ZXVlICovCisJd2hpbGUgKDEpIHsKKwkJaW50IGNvZGU7IHNpemVfdCBzejsgdm9pZCAqIGRhdGE7CisJCUNIRUNLX0ZDVF9ETyggIGZkX2V2ZW50X2dldChmZF9nX2NvbmZpZy0+Y25mX21haW5fZXYsICZjb2RlLCAmc3osICZkYXRhKSwgIGJyZWFrICApOworCQlzd2l0Y2ggKGNvZGUpIHsKKwkJCWNhc2UgRkRFVl9UUklHR0VSOgorCQkJCXsKKwkJCQkJaW50IHR2LCAqcDsKKwkJCQkJQ0hFQ0tfUEFSQU1TX0RPKCBzeiA9PSBzaXplb2YoaW50KSwgCisJCQkJCQl7CisJCQkJCQkJVFJBQ0VfREVCVUcoTk9ORSwgIkludGVybmFsIGVycm9yOiBnb3QgRkRFVl9UUklHR0VSIHdpdGhvdXQgdHJpZ2dlciB2YWx1ZSEiKTsKKwkJCQkJCQlBU1NFUlQoMCk7CisJCQkJCQkJZ290byBlbmQ7CisJCQkJCQl9ICk7CisJCQkJCXAgPSBkYXRhOworCQkJCQl0diA9ICpwOworCQkJCQlmcmVlKHApOworCQkJCQlDSEVDS19GQ1RfRE8oIGZkX2V2ZW50X3RyaWdfY2FsbF9jYih0diksIGdvdG8gZW5kICk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJCisJCQljYXNlIEZERVZfVEVSTUlOQVRFX0lOVDoKKwkJCQlnb3RvIGVuZDsKKwkJCQorCQkJZGVmYXVsdDoKKwkJCQlUUkFDRV9ERUJVRyhJTkZPLCAiVW5leHBlY3RlZCBldmVudCBpbiB0aGUgbWFpbiBldmVudCBxdWV1ZSAoJWQpLCBpZ25vcmVkLiIsIGNvZGUpOworCQl9CisJfQorCQorZW5kOgorCWNvcmVfc2h1dGRvd24oKTsKKwkKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFB1YmxpYyBpbnRlcmZhY2VzICovCisKKy8qIEluaXRpYWxpemUgdGhlIGxpYmZkY29yZSBpbnRlcm5hbHMuIFRoaXMgYWxzbyBpbml0aWFsaXplcyBsaWJmZHByb3RvICovCitpbnQgZmRfY29yZV9pbml0aWFsaXplKHZvaWQpCit7CisJaW50IHJldDsKKwkKKwlpZiAoY29yZV9zdGF0ZV9nZXQoKSAhPSBDT1JFX05PVF9JTklUKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZmRfY29yZV9pbml0aWFsaXplKCkgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIVxuIik7CisJCXJldHVybiBFSU5WQUw7CisJfQorCQorCS8qIEluaXRpYWxpemUgdGhlIGxpYnJhcnkgLS0gbXVzdCBjb21lIGZpcnN0IHNpbmNlIGl0IGluaXRpYWxpemVzIHRoZSBkZWJ1ZyBmYWNpbGl0eSAqLworCXJldCA9IGZkX2xpYnByb3RvX2luaXQoKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gaW5pdGlhbGl6ZSBsaWJmZHByb3RvOiAlc1xuIiwgc3RyZXJyb3IocmV0KSk7CisJCXJldHVybiByZXQ7CisJfQorCQorCS8qIE5hbWUgdGhpcyB0aHJlYWQgKi8KKwlmZF9sb2dfdGhyZWFkbmFtZSgiTWFpbiIpOworCQorCUxPR19OKCJsaWJmZHByb3RvICclcycgaW5pdGlhbGl6ZWQuIiwgZmRfbGlicHJvdG9fdmVyc2lvbik7CisJCisJLyogSW5pdGlhbGl6ZSBnY3J5cHQgYW5kIGdudXRscyAqLworCSNpZm5kZWYgR05VVExTX1ZFUlNJT05fMjEwCisJR05VVExTX1RSQUNFKCAodm9pZCkgZ2NyeV9jb250cm9sIChHQ1JZQ1RMX1NFVF9USFJFQURfQ0JTLCAmZ2NyeV90aHJlYWRzX3B0aHJlYWQpICk7CisJR05VVExTX1RSQUNFKCAodm9pZCkgZ2NyeV9jb250cm9sIChHQ1JZQ1RMX0VOQUJMRV9RVUlDS19SQU5ET00sIDApICk7CisJI2VuZGlmIC8qIEdOVVRMU19WRVJTSU9OXzIxMCAqLworCUNIRUNLX0dOVVRMU19ETyggZ251dGxzX2dsb2JhbF9pbml0KCksIHJldHVybiBFSU5WQUwgKTsKKwlpZiAoICEgZ251dGxzX2NoZWNrX3ZlcnNpb24oR05VVExTX1ZFUlNJT04pICkgeworCQlUUkFDRV9FUlJPUiggIlRoZSBHTlVUTFMgbGlicmFyeSBpcyB0b28gb2xkOyBmb3VuZCAnJXMnLCBuZWVkICciIEdOVVRMU19WRVJTSU9OICInIiwgZ251dGxzX2NoZWNrX3ZlcnNpb24oTlVMTCkpOworCQlyZXR1cm4gRUlOVkFMOworCX0gZWxzZSB7CisJI2lmZGVmIEdOVVRMU19WRVJTSU9OXzIxMAorCQlUUkFDRV9ERUJVRyhJTkZPLCAibGliZ251dGxzICclcycgaW5pdGlhbGl6ZWQuIiwgZ251dGxzX2NoZWNrX3ZlcnNpb24oTlVMTCkgKTsKKwkjZWxzZSAvKiBHTlVUTFNfVkVSU0lPTl8yMTAgKi8KKwkJVFJBQ0VfREVCVUcoSU5GTywgImxpYmdudXRscyAnJXMnLCBsaWJnY3J5cHQgJyVzJywgaW5pdGlhbGl6ZWQuIiwgZ251dGxzX2NoZWNrX3ZlcnNpb24oTlVMTCksIGdjcnlfY2hlY2tfdmVyc2lvbihOVUxMKSApOworCSNlbmRpZiAvKiBHTlVUTFNfVkVSU0lPTl8yMTAgKi8KKwl9CisJCisJLyogSW5pdGlhbGl6ZSB0aGUgY29uZmlnIHdpdGggZGVmYXVsdCB2YWx1ZXMgKi8KKwltZW1zZXQoJmdfY29uZiwgMCwgc2l6ZW9mKHN0cnVjdCBmZF9jb25maWcpKTsKKwlmZF9nX2NvbmZpZyA9ICZnX2NvbmY7CisJQ0hFQ0tfRkNUKCBmZF9jb25mX2luaXQoKSApOworCQorCS8qIEFkZCBkZWZpbml0aW9ucyBvZiB0aGUgYmFzZSBwcm90b2NvbCAqLworCUNIRUNLX0ZDVCggZmRfZGljdF9iYXNlX3Byb3RvY29sKGZkX2dfY29uZmlnLT5jbmZfZGljdCkgKTsKKwkKKwkvKiBJbml0aWFsaXplIHNvbWUgbW9kdWxlcyAqLworCUNIRUNLX0ZDVCggZmRfaG9va3NfaW5pdCgpICApOworCUNIRUNLX0ZDVCggZmRfcXVldWVzX2luaXQoKSApOworCUNIRUNLX0ZDVCggZmRfc2Vzc19zdGFydCgpICApOworCUNIRUNLX0ZDVCggZmRfcF9leHBpX2luaXQoKSApOworCQorCWNvcmVfc3RhdGVfc2V0KENPUkVfTElCU19JTklUKTsKKwkKKwlMT0dfTigibGliZmRjb3JlICclcycgaW5pdGlhbGl6ZWQuIiwgZmRfY29yZV92ZXJzaW9uKTsKKwkKKwkKKwkvKiBOZXh0IHRoaW5nIGlzIHRvIHBhcnNlIHRoZSBjb25maWcsIGxlYXZlIHRoaXMgZm9yIGEgZGlmZmVyZW50IGZ1bmN0aW9uICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBwdGhyZWFkX211dGV4X3QgY29yZV9sb2NrID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKKworLyogUGFyc2UgdGhlIGZyZWVEaWFtZXRlci5jb25mIGNvbmZpZ3VyYXRpb24gZmlsZSwgbG9hZCB0aGUgZXh0ZW5zaW9ucyAqLworc3RhdGljIGludCBmZF9jb3JlX3BhcnNlY29uZl9pbnQoY29uc3QgY2hhciAqIGNvbmZmaWxlKQoreworCWNoYXIgKiBidWYgPSBOVUxMLCAqYjsKKwlzaXplX3QgbGVuID0gMCwgb2Zmc2V0PTA7CisJCisJCisJVFJBQ0VfRU5UUlkoIiVwIiwgY29uZmZpbGUpOworCQorCS8qIENvbmYgZmlsZSAqLworCWlmIChjb25mZmlsZSkKKwkJZmRfZ19jb25maWctPmNuZl9maWxlID0gY29uZmZpbGU7IC8qIG90aGVyd2lzZSwgd2UgdXNlIHRoZSBkZWZhdWx0IG5hbWUgKi8KKwkKKwlDSEVDS19GQ1QoIGZkX2NvbmZfcGFyc2UoKSApOworCQorCS8qIFRoZSBmb2xsb3dpbmcgbW9kdWxlIHVzZSBkYXRhIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24gKi8KKwlDSEVDS19GQ1QoIGZkX3J0ZGlzcF9pbml0KCkgKTsKKwkKKwkvKiBOb3csIGxvYWQgYWxsIGR5bmFtaWMgZXh0ZW5zaW9ucyAqLworCUNIRUNLX0ZDVCggIGZkX2V4dF9sb2FkKCkgICk7CisJCisJLyogRGlzcGxheSBjb25maWd1cmF0aW9uICovCisJYiA9IGZkX2NvbmZfZHVtcCgmYnVmLCAmbGVuLCBOVUxMKTsKKwlMT0dfU1BMSVQoRkRfTE9HX05PVElDRSwgTlVMTCwgYiA/OiAiPEVycm9yIGR1cmluZyBjb25maWd1cmF0aW9uIGR1bXAuLi4+IiwgTlVMTCk7CisJCisJLyogRGlzcGxheSBleHRlbnNpb25zIHN0YXR1cyAqLworCWIgPSBmZF9leHRfZHVtcCgmYnVmLCAmbGVuLCBOVUxMKTsKKwlMT0dfU1BMSVQoRkRfTE9HX05PVElDRSwgIkxvYWRlZCBleHRlbnNpb25zOiAiLCBiPzoiPEVycm9yIGR1cmluZyBleHRlbnNpb25zIGR1bXAuLi4+IiwgTlVMTCk7CisJCisJLyogRGlzcGxheSByZWdpc3RlcmVkIHRyaWdnZXJzIGZvciBGREVWX1RSSUdHRVIgKi8KKwliID0gZmRfZXZlbnRfdHJpZ19kdW1wKCZidWYsICZsZW4sICZvZmZzZXQpOworCWlmICghYiB8fCBvZmZzZXQpIHsKKwkJTE9HX04oIiVzIiwgYiA/OiAiRXJyb3IgZHVyaW5nIHRyaWdnZXJzIGR1bXAuLi4iKTsKKwl9CisJCisJZnJlZShidWYpOwkKKwkJCisJLyogU2luY2Ugc29tZSBleHRlbnNpb25zIG1pZ2h0IGhhdmUgbW9kaWZpZWQgdGhlIGRlZmluaXRpb25zIGZyb20gdGhlIGRpY3RfYmFzZV9wcm90b2NvbCwgd2Ugb25seSBsb2FkIHRoZSBvYmplY3RzIG5vdyAqLworCUNIRUNLX0ZDVCggZmRfbXNnX2luaXQoKSAgICApOworCQorCS8qIE9rLCByZWFkeSBmb3IgbmV4dCBzdGVwICovCisJY29yZV9zdGF0ZV9zZXQoQ09SRV9DT05GX1JFQURZKTsKKwkKKwlyZXR1cm4gMDsKK30KKworaW50IGZkX2NvcmVfcGFyc2Vjb25mKGNvbnN0IGNoYXIgKiBjb25mZmlsZSkKK3sKKwlpbnQgcmV0OworCUNIRUNLX1BPU0lYKCBwdGhyZWFkX211dGV4X2xvY2soJmNvcmVfbG9jaykgKTsKKwlyZXQgPSBmZF9jb3JlX3BhcnNlY29uZl9pbnQoY29uZmZpbGUpOworCUNIRUNLX1BPU0lYKCBwdGhyZWFkX211dGV4X3VubG9jaygmY29yZV9sb2NrKSApOworCXJldHVybiByZXQ7Cit9CisKKworLyogRm9yIHRocmVhZHMgdGhhdCB3b3VsZCBuZWVkIHRvIHdhaXQgY29tcGxldGUgc3RhcnQgb2YgdGhlIGZyYW1ld29yayAoZXg6IGluIGV4dGVuc2lvbnMpICovCitpbnQgZmRfY29yZV93YWl0c3RhcnRjb21wbGV0ZSh2b2lkKQoreworCVRSQUNFX0VOVFJZKCIiKTsKKwkKKwlyZXR1cm4gY29yZV9zdGF0ZV93YWl0KENPUkVfUlVOTklORyk7Cit9CisKKy8qIFN0YXJ0IHRoZSBzZXJ2ZXIgJiBjbGllbnQgdGhyZWFkcyAqLworc3RhdGljIGludCBmZF9jb3JlX3N0YXJ0X2ludCh2b2lkKQoreworCS8qIFN0YXJ0IHNlcnZlciB0aHJlYWRzICovIAorCUNIRUNLX0ZDVCggZmRfc2VydmVyc19zdGFydCgpICk7CisJCisJLyogU3RhcnQgdGhlIHBlZXIgc3RhdGUgbWFjaGluZXMgKi8KKwlDSEVDS19GQ1QoIGZkX3BzbV9zdGFydCgpICk7CisJCisJLyogU3RhcnQgdGhlIGNvcmUgcnVubmVyIHRocmVhZCB0aGF0IGhhbmRsZXMgbWFpbiBldmVudHMgKHVudGlsIHNodXRkb3duKSAqLworCUNIRUNLX1BPU0lYKCBwdGhyZWFkX2NyZWF0ZSgmY29yZV9ydW5uZXIsIE5VTEwsIGNvcmVfcnVubmVyX3RocmVhZCwgTlVMTCkgKTsKKwkKKwkvKiBVbmxvY2sgdGhyZWFkcyB3YWl0aW5nIGludG8gZmRfY29yZV93YWl0c3RhcnRjb21wbGV0ZSAqLworCWNvcmVfc3RhdGVfc2V0KENPUkVfUlVOTklORyk7CisJCisJLyogT2ssIGV2ZXJ5dGhpbmcgaXMgcnVubmluZyBub3cuLi4gKi8KKwlyZXR1cm4gMDsKK30KKworaW50IGZkX2NvcmVfc3RhcnQodm9pZCkKK3sKKwlpbnQgcmV0OworCUNIRUNLX1BPU0lYKCBwdGhyZWFkX211dGV4X2xvY2soJmNvcmVfbG9jaykgKTsKKwlyZXQgPSBmZF9jb3JlX3N0YXJ0X2ludCgpOworCUNIRUNLX1BPU0lYKCBwdGhyZWFkX211dGV4X3VubG9jaygmY29yZV9sb2NrKSApOworCXJldHVybiByZXQ7Cit9CisKKy8qIEluaXRpYWxpemUgc2h1dGRvd24gb2YgdGhlIGZyYW1ld29yay4gVGhpcyBpcyBub3QgYmxvY2tpbmcuICovCitpbnQgZmRfY29yZV9zaHV0ZG93bih2b2lkKQoreworCWVudW0gY29yZV9zdGF0ZSBjdXJfc3RhdGUgPSBjb3JlX3N0YXRlX2dldCgpOworCQorCUxPR19GKCJJbml0aWF0aW5nIGZyZWVEaWFtZXRlciBzaHV0ZG93biBzZXF1ZW5jZSAoJWQpIiwgY3VyX3N0YXRlKTsKKwkJCisJaWYgKGN1cl9zdGF0ZSA8IENPUkVfUlVOTklORykgeworCQkvKiBDYWxsaW5nIGFwcGxpY2F0aW9uIG11c3QgbWFrZSBzdXJlIHRoZSBpbml0aWFsaXphdGlvbiBpcyBub3Qgb25nb2luZyBpbiBhIHNlcGFyYXRlIHRocmVhZC4uLiAqLworCQlpZiAocHRocmVhZF9tdXRleF9sb2NrKCZjb3JlX2xvY2spICE9IDApIHsKKwkJCS8qIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgY2FsbGVkIGFzeW5jaHJvbm91c2x5IGZyb20gZmRfY29yZV9wYXJzZWNvbmYgLyBmZF9jb3JlX3N0YXJ0ICEgUGxlYXNlIHJldmlldyB5b3VyIG1haW4gYXBwIGRlc2lnbiAqLworCQkJQVNTRVJUKDApOworCQkJcmV0dXJuIEVJTlZBTDsKKwkJfQorCQljb3JlX3NodXRkb3duKCk7CisJCWNvcmVfc3RhdGVfc2V0KENPUkVfVEVSTSk7CisJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZjb3JlX2xvY2spOworCX0gZWxzZSBpZiAoY3VyX3N0YXRlID09IENPUkVfUlVOTklORykgeworCQljb3JlX3N0YXRlX3NldChDT1JFX1NIVVRET1dOKTsKKwkJQ0hFQ0tfRkNUKCBmZF9ldmVudF9zZW5kKGZkX2dfY29uZmlnLT5jbmZfbWFpbl9ldiwgRkRFVl9URVJNSU5BVEVfSU5ULCAwLCBOVUxMKSApOworCX0KKwkKKwkvKiBPdGhlciBjYXNlLCB0aGUgZnJhbWV3b3JrIGlzIGFscmVhZHkgc2h1dHRpbmcgZG93biAqLworCQorCXJldHVybiAwOworfQorCisKKy8qIFdhaXQgZm9yIHRoZSBzaHV0ZG93biB0byBiZSBjb21wbGV0ZSAtLSB0aGlzIG11c3QgYmUgY2FsbGVkIGFmdGVyIGZkX2NvcmVfc2h1dGRvd24gdG8gcmVjbGFpbSBzb21lIHJlc291cmNlcy4gKi8KK2ludCBmZF9jb3JlX3dhaXRfc2h1dGRvd25fY29tcGxldGUodm9pZCkKK3sKKwllbnVtIGNvcmVfc3RhdGUgY3VyX3N0YXRlID0gY29yZV9zdGF0ZV9nZXQoKTsKKwl2b2lkICogdGhfcmV0ID0gTlVMTDsKKwkKKwlDSEVDS19GQ1QoY29yZV9zdGF0ZV93YWl0KENPUkVfU0hVVERPV04pKTsKKwkKKwlpZiAoY3VyX3N0YXRlID09IENPUkVfVEVSTSkKKwkJcmV0dXJuIDA7CisJCisJLyogSnVzdCB3YWl0IGZvciBjb3JlX3J1bm5lcl90aHJlYWQgdG8gY29tcGxldGUgYW5kIHJldHVybiBncmFjZWZ1bGx5ICovCisJQ0hFQ0tfUE9TSVgocHRocmVhZF9qb2luKGNvcmVfcnVubmVyLCAmdGhfcmV0KSk7CisKKwljb3JlX3N0YXRlX3NldChDT1JFX1RFUk0pOworCQkKKwlyZXR1cm4gMDsKK30KKworCisKKwpkaWZmIC0tZ2l0IGEvbGliZmRjb3JlL2RpY3RfYmFzZV9wcm90by5jIGIvbGliZmRjb3JlL2RpY3RfYmFzZV9wcm90by5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMDIzZjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJmZGNvcmUvZGljdF9iYXNlX3Byb3RvLmMKQEAgLTAsMCArMSwzMzQ3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxMywgV0lERSBQcm9qZWN0IGFuZCBOSUNUCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBXSURFIFByb2plY3Qgb3IgTklDVCBub3IgdGhlIAkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFdJREUgUHJvamVjdCBhbmQgCQkJCQkJICoKKyogICBOSUNULgkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIERpYW1ldGVyIEJhc2UgcHJvdG9jb2wgZGVmaW5pdGlvbnMuCisgKi8KKworI2luY2x1ZGUgImZkY29yZS1pbnRlcm5hbC5oIgorCisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKworLyogVGhlIHBvaW50ZXIgZm9yIHRoZSBnbG9iYWwgZGljdGlvbmFyeSAoaW5pdGlhbGl6ZWQgZnJvbSBtYWluKSAqLworc3RydWN0IGRpY3Rpb25hcnkgKiBmZF9nX2RpY3QgPSBOVUxMOworCisKKworI2RlZmluZSBDSEVDS19kaWN0X25ldyggX3R5cGUsIF9kYXRhLCBfcGFyZW50LCBfcmVmICkJCQkJXAorCUNIRUNLX0ZDVCggIGZkX2RpY3RfbmV3KCBkaWN0LCAoX3R5cGUpLCAoX2RhdGEpLCAoX3BhcmVudCksIChfcmVmKSkgICk7CisKKyNkZWZpbmUgQ0hFQ0tfZGljdF9zZWFyY2goIF90eXBlLCBfY3JpdGVyaWEsIF93aGF0LCBfcmVzdWx0ICkJCQkJCVwKKwlDSEVDS19GQ1QoICBmZF9kaWN0X3NlYXJjaCggZGljdCwgKF90eXBlKSwgKF9jcml0ZXJpYSksIChfd2hhdCksIChfcmVzdWx0KSwgRU5PRU5UKSAgKTsKKworc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24geworCWNoYXIgCQkJKmF2cF9uYW1lOworCWVudW0gcnVsZV9wb3NpdGlvbglwb3NpdGlvbjsKKwlpbnQgCQkJbWluOworCWludAkJCW1heDsKK307CisKKyNkZWZpbmUgUlVMRV9PUkRFUiggX3Bvc2l0aW9uICkgKCgoKF9wb3NpdGlvbikgPT0gUlVMRV9GSVhFRF9IRUFEKSB8fCAoKF9wb3NpdGlvbikgPT0gUlVMRV9GSVhFRF9UQUlMKSkgPyAxIDogMCApCisKKyNkZWZpbmUgUEFSU0VfbG9jX3J1bGVzKCBfcnVsZWFycmF5LCBfcGFyZW50KSB7CQkJCQkJXAorCWludCBfX2FyOwkJCQkJCQkJCVwKKwlmb3IgKF9fYXI9MDsgX19hciA8IHNpemVvZihfcnVsZWFycmF5KSAvIHNpemVvZigoX3J1bGVhcnJheSlbMF0pOyBfX2FyKyspIHsJXAorCQlzdHJ1Y3QgZGljdF9ydWxlX2RhdGEgX19kYXRhID0geyBOVUxMLCAJCQkJCVwKKwkJCShfcnVsZWFycmF5KVtfX2FyXS5wb3NpdGlvbiwJCQkJCVwKKwkJCTAsIAkJCQkJCQkJXAorCQkJKF9ydWxlYXJyYXkpW19fYXJdLm1pbiwJCQkJCQlcCisJCQkoX3J1bGVhcnJheSlbX19hcl0ubWF4fTsJCQkJCVwKKwkJX19kYXRhLnJ1bGVfb3JkZXIgPSBSVUxFX09SREVSKF9fZGF0YS5ydWxlX3Bvc2l0aW9uKTsJCQlcCisJCUNIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoKCAJCQkJCQlcCisJCQlkaWN0LAkJCQkJCQkJXAorCQkJRElDVF9BVlAsIAkJCQkJCQlcCisJCQlBVlBfQllfTkFNRSwgCQkJCQkJCVwKKwkJCShfcnVsZWFycmF5KVtfX2FyXS5hdnBfbmFtZSwgCQkJCQlcCisJCQkmX19kYXRhLnJ1bGVfYXZwLCAwICkgKTsJCQkJCVwKKwkJaWYgKCAhX19kYXRhLnJ1bGVfYXZwICkgewkJCQkJCVwKKwkJCVRSQUNFX0RFQlVHKElORk8sICJBVlAgTm90IGZvdW5kOiAnJXMnIiwgKF9ydWxlYXJyYXkpW19fYXJdLmF2cF9uYW1lICk7CVwKKwkJCXJldHVybiBFTk9FTlQ7CQkJCQkJCVwKKwkJfQkJCQkJCQkJCVwKKwkJQ0hFQ0tfRkNUX0RPKCBmZF9kaWN0X25ldyggZGljdCwgRElDVF9SVUxFLCAmX19kYXRhLCBfcGFyZW50LCBOVUxMKSwJXAorCQkJewkJCQkJCQkJXAorCQkJCVRSQUNFX0RFQlVHKElORk8sICJFcnJvciBvbiBydWxlIHdpdGggQVZQICclcyciLAlcCisJCQkJCSAoX3J1bGVhcnJheSlbX19hcl0uYXZwX25hbWUgKTsJCQlcCisJCQkJcmV0dXJuIEVJTlZBTDsJCQkJCQlcCisJCQl9ICk7CQkJCQkJCQlcCisJfQkJCQkJCQkJCQlcCit9CisKK2ludCBmZF9kaWN0X2Jhc2VfcHJvdG9jb2woc3RydWN0IGRpY3Rpb25hcnkgKiBkaWN0KQoreworCVRSQUNFX0VOVFJZKCIlcCIsIGRpY3QpOworCUNIRUNLX1BBUkFNUyhkaWN0KTsKKwkKKwkvKiBWZW5kb3JzIHNlY3Rpb24gKi8KKwl7CisJCS8qIFRoZSBiYXNlIFJGQyBoYXMgbm8gdmVuZG9yIGluZm9ybWF0aW9uICovCisJCTsKKwl9CisJCisJLyogQXBwbGljYXRpb25zIHNlY3Rpb24gKi8KKwl7CisJCS8qIGJhc2UgYWNjb3VudGluZyBhcHBsaWNhdGlvbiAqLworCQl7CisJCQlzdHJ1Y3QgZGljdF9hcHBsaWNhdGlvbl9kYXRhIGRhdGEgPSB7ICAgICAgICAgIDMsICJEaWFtZXRlciBCYXNlIEFjY291bnRpbmciIAl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVBQTElDQVRJT04sICZkYXRhLCBOVUxMLCBOVUxMKTsKKwkJfQorCQkKKwkJLyogcmVsYXkgYXBwbGljYXRpb24gKi8KKwkJeworCQkJc3RydWN0IGRpY3RfYXBwbGljYXRpb25fZGF0YSBkYXRhICA9IHsgMHhmZmZmZmZmZiwgIlJlbGF5IiAJCQkJfTsKKwkJCSNpZiBBSV9SRUxBWSAhPSAweGZmZmZmZmZmCisJCQkjZXJyb3IgIkFJX1JFTEFZIGRlZmluaXRpb24gbWlzbWF0Y2giCisJCQkjZW5kaWYKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FQUExJQ0FUSU9OLCAmZGF0YSAsIE5VTEwsIE5VTEwpOworCQl9CisJfQorCQorCS8qIERlcml2ZWQgQVZQIHR5cGVzIHNlY3Rpb24gKi8KKwl7CisJCS8qIEFkZHJlc3MgKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgQWRkcmVzcyBmb3JtYXQgaXMgZGVyaXZlZCBmcm9tIHRoZSBPY3RldFN0cmluZyBBVlAgQmFzZQorCQkJCUZvcm1hdC4gIEl0IGlzIGEgZGlzY3JpbWluYXRlZCB1bmlvbiwgcmVwcmVzZW50aW5nLCBmb3IgZXhhbXBsZSBhCisJCQkJMzItYml0IChJUHY0KSBbUkZDNzkxXSBvciAxMjgtYml0IChJUHY2KSBbUkZDNDI5MV0gYWRkcmVzcywgbW9zdAorCQkJCXNpZ25pZmljYW50IG9jdGV0IGZpcnN0LiAgVGhlIGZpcnN0IHR3byBvY3RldHMgb2YgdGhlIEFkZHJlc3MgQVZQCisJCQkJcmVwcmVzZW50cyB0aGUgQWRkcmVzc1R5cGUsIHdoaWNoIGNvbnRhaW5zIGFuIEFkZHJlc3MgRmFtaWx5CisJCQkJZGVmaW5lZCBpbiBbSUFOQUFERkFNXS4gIFRoZSBBZGRyZXNzVHlwZSBpcyB1c2VkIHRvIGRpc2NyaW1pbmF0ZQorCQkJCXRoZSBjb250ZW50IGFuZCBmb3JtYXQgb2YgdGhlIHJlbWFpbmluZyBvY3RldHMuCisJCQkqLworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhIGRhdGEgPSB7IEFWUF9UWVBFX09DVEVUU1RSSU5HLAkiQWRkcmVzcyIJCSwgZmRfZGljdGZjdF9BZGRyZXNzX2ludGVycHJldAksIGZkX2RpY3RmY3RfQWRkcmVzc19lbmNvZGUsCWZkX2RpY3RmY3RfQWRkcmVzc19kdW1wCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmZGF0YSAsIE5VTEwsIE5VTEwpOworCQl9CisJCQorCQkvKiBUaW1lICovCisJCXsKKwkJCS8qCisJCQkJVGhlIFRpbWUgZm9ybWF0IGlzIGRlcml2ZWQgZnJvbSB0aGUgT2N0ZXRTdHJpbmcgQVZQIEJhc2UgRm9ybWF0LgorCQkJCVRoZSBzdHJpbmcgTVVTVCBjb250YWluIGZvdXIgb2N0ZXRzLCBpbiB0aGUgc2FtZSBmb3JtYXQgYXMgdGhlCisJCQkJZmlyc3QgZm91ciBieXRlcyBhcmUgaW4gdGhlIE5UUCB0aW1lc3RhbXAgZm9ybWF0LiAgVGhlIE5UUAorCQkJCVRpbWVzdGFtcCBmb3JtYXQgaXMgZGVmaW5lZCBpbiBjaGFwdGVyIDMgb2YgW1JGQzQzMzBdLgorCisJCQkJVGhpcyByZXByZXNlbnRzIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBzaW5jZSAwaCBvbiAxIEphbnVhcnkgMTkwMAorCQkJCXdpdGggcmVzcGVjdCB0byB0aGUgQ29vcmRpbmF0ZWQgVW5pdmVyc2FsIFRpbWUgKFVUQykuCisKKwkJCQlPbiA2aCAyOG0gMTZzIFVUQywgNyBGZWJydWFyeSAyMDM2IHRoZSB0aW1lIHZhbHVlIHdpbGwgb3ZlcmZsb3cuCisJCQkJU05UUCBbUkZDNDMzMF0gZGVzY3JpYmVzIGEgcHJvY2VkdXJlIHRvIGV4dGVuZCB0aGUgdGltZSB0byAyMTA0LgorCQkJCVRoaXMgcHJvY2VkdXJlIE1VU1QgYmUgc3VwcG9ydGVkIGJ5IGFsbCBESUFNRVRFUiBub2Rlcy4KKwkJCSovCisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgZGF0YSA9IHsgQVZQX1RZUEVfT0NURVRTVFJJTkcsCSJUaW1lIgkJCSwgZmRfZGljdGZjdF9UaW1lX2ludGVycHJldAksIGZkX2RpY3RmY3RfVGltZV9lbmNvZGUsIAlmZF9kaWN0ZmN0X1RpbWVfZHVtcAkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZkYXRhICwgTlVMTCwgTlVMTCk7CisJCX0KKwkJCisJCS8qIFVURjhTdHJpbmcgKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgVVRGOFN0cmluZyBmb3JtYXQgaXMgZGVyaXZlZCBmcm9tIHRoZSBPY3RldFN0cmluZyBBVlAgQmFzZQorCQkJCUZvcm1hdC4gIFRoaXMgaXMgYSBodW1hbiByZWFkYWJsZSBzdHJpbmcgcmVwcmVzZW50ZWQgdXNpbmcgdGhlCisJCQkJSVNPL0lFQyBJUyAxMDY0Ni0xIGNoYXJhY3RlciBzZXQsIGVuY29kZWQgYXMgYW4gT2N0ZXRTdHJpbmcgdXNpbmcKKwkJCQl0aGUgVVRGLTggW1JGQzM2MjldIHRyYW5zZm9ybWF0aW9uIGZvcm1hdCBkZXNjcmliZWQgaW4gUkZDIDM2MjkuCisKKwkJCQlTaW5jZSBhZGRpdGlvbmFsIGNvZGUgcG9pbnRzIGFyZSBhZGRlZCBieSBhbWVuZG1lbnRzIHRvIHRoZSAxMDY0NgorCQkJCXN0YW5kYXJkIGZyb20gdGltZSB0byB0aW1lLCBpbXBsZW1lbnRhdGlvbnMgTVVTVCBiZSBwcmVwYXJlZCB0bworCQkJCWVuY291bnRlciBhbnkgY29kZSBwb2ludCBmcm9tIDB4MDAwMDAwMDEgdG8gMHg3ZmZmZmZmZi4gIEJ5dGUKKwkJCQlzZXF1ZW5jZXMgdGhhdCBkbyBub3QgY29ycmVzcG9uZCB0byB0aGUgdmFsaWQgZW5jb2Rpbmcgb2YgYSBjb2RlCisJCQkJcG9pbnQgaW50byBVVEYtOCBjaGFyc2V0IG9yIGFyZSBvdXRzaWRlIHRoaXMgcmFuZ2UgYXJlIHByb2hpYml0ZWQuCisKKwkJCQlUaGUgdXNlIG9mIGNvbnRyb2wgY29kZXMgU0hPVUxEIGJlIGF2b2lkZWQuICBXaGVuIGl0IGlzIG5lY2Vzc2FyeQorCQkJCXRvIHJlcHJlc2VudCBhIG5ldyBsaW5lLCB0aGUgY29udHJvbCBjb2RlIHNlcXVlbmNlIENSIExGIFNIT1VMRCBiZQorCQkJCXVzZWQuCisKKwkJCQlUaGUgdXNlIG9mIGxlYWRpbmcgb3IgdHJhaWxpbmcgd2hpdGUgc3BhY2UgU0hPVUxEIGJlIGF2b2lkZWQuCisKKwkJCQlGb3IgY29kZSBwb2ludHMgbm90IGRpcmVjdGx5IHN1cHBvcnRlZCBieSB1c2VyIGludGVyZmFjZSBoYXJkd2FyZQorCQkJCW9yIHNvZnR3YXJlLCBhbiBhbHRlcm5hdGl2ZSBtZWFucyBvZiBlbnRyeSBhbmQgZGlzcGxheSwgc3VjaCBhcworCQkJCWhleGFkZWNpbWFsLCBNQVkgYmUgcHJvdmlkZWQuCisKKwkJCQlGb3IgaW5mb3JtYXRpb24gZW5jb2RlZCBpbiA3LWJpdCBVUy1BU0NJSSwgdGhlIFVURi04IGNoYXJzZXQgaXMKKwkJCQlpZGVudGljYWwgdG8gdGhlIFVTLUFTQ0lJIGNoYXJzZXQuCisKKwkJCQlVVEYtOCBtYXkgcmVxdWlyZSBtdWx0aXBsZSBieXRlcyB0byByZXByZXNlbnQgYSBzaW5nbGUgY2hhcmFjdGVyIC8KKwkJCQljb2RlIHBvaW50OyB0aHVzIHRoZSBsZW5ndGggb2YgYW4gVVRGOFN0cmluZyBpbiBvY3RldHMgbWF5IGJlCisJCQkJZGlmZmVyZW50IGZyb20gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGVuY29kZWQuCisKKwkJCQlOb3RlIHRoYXQgdGhlIEFWUCBMZW5ndGggZmllbGQgb2YgYW4gVVRGOFN0cmluZyBpcyBtZWFzdXJlZCBpbgorCQkJCW9jdGV0cywgbm90IGNoYXJhY3RlcnMuCisJCQkqLworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhIGRhdGEgPSB7IEFWUF9UWVBFX09DVEVUU1RSSU5HLAkiVVRGOFN0cmluZyIJCSwgTlVMTAkJCSwgTlVMTAksIGZkX2RpY3RmY3RfVVRGOFN0cmluZ19kdW1wCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmZGF0YSAsIE5VTEwsIE5VTEwpOworCQl9CisJCQorCQkvKiBEaWFtZXRlcklkZW50aXR5ICovCisJCXsKKwkJCS8qCisJCQkJVGhlIERpYW1ldGVySWRlbnRpdHkgZm9ybWF0IGlzIGRlcml2ZWQgZnJvbSB0aGUgT2N0ZXRTdHJpbmcgQVZQCisJCQkJQmFzZSBGb3JtYXQuCisKKyAgICAgICAgICAgICAgICAJCQkJRGlhbWV0ZXJJZGVudGl0eSAgPSBGUUROCisKKworCQkJCURpYW1ldGVySWRlbnRpdHkgdmFsdWUgaXMgdXNlZCB0byB1bmlxdWVseSBpZGVudGlmeSBhIERpYW1ldGVyCisJCQkJbm9kZSBmb3IgcHVycG9zZXMgb2YgZHVwbGljYXRlIGNvbm5lY3Rpb24gYW5kIHJvdXRpbmcgbG9vcAorCQkJCWRldGVjdGlvbi4KKworCQkJCVRoZSBjb250ZW50cyBvZiB0aGUgc3RyaW5nIE1VU1QgYmUgdGhlIEZRRE4gb2YgdGhlIERpYW1ldGVyIG5vZGUuCisJCQkJSWYgbXVsdGlwbGUgRGlhbWV0ZXIgbm9kZXMgcnVuIG9uIHRoZSBzYW1lIGhvc3QsIGVhY2ggRGlhbWV0ZXIKKwkJCQlub2RlIE1VU1QgYmUgYXNzaWduZWQgYSB1bmlxdWUgRGlhbWV0ZXJJZGVudGl0eS4gIElmIGEgRGlhbWV0ZXIKKworCQkJCW5vZGUgY2FuIGJlIGlkZW50aWZpZWQgYnkgc2V2ZXJhbCBGUUROcywgYSBzaW5nbGUgRlFETiBzaG91bGQgYmUKKwkJCQlwaWNrZWQgYXQgc3RhcnR1cCwgYW5kIHVzZWQgYXMgdGhlIG9ubHkgRGlhbWV0ZXJJZGVudGl0eSBmb3IgdGhhdAorCQkJCW5vZGUsIHdoYXRldmVyIHRoZSBjb25uZWN0aW9uIGl0IGlzIHNlbnQgb24uICBOb3RlIHRoYXQgaW4gdGhpcworCQkJCWRvY3VtZW50LCBEaWFtZXRlcklkZW50aXR5IGlzIGluIEFTQ0lJIGZvcm0gaW4gb3JkZXIgdG8gYmUKKwkJCQljb21wYXRpYmxlIHdpdGggZXhpc3RpbmcgRE5TIGluZnJhc3RydWN0dXJlLiAgU2VlIEFwcGVuZGl4IEQgZm9yCisJCQkJaW50ZXJhY3Rpb25zIGJldHdlZW4gdGhlIERpYW1ldGVyIHByb3RvY29sIGFuZCBJbnRlcm5hdGlvbmFsaXplZAorCQkJCURvbWFpbiBOYW1lIChJRE5zKS4KKwkJCSovCisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgZGF0YSA9IHsgQVZQX1RZUEVfT0NURVRTVFJJTkcsCSJEaWFtZXRlcklkZW50aXR5IgksIE5VTEwJCQksIE5VTEwJCSwgZmRfZGljdGZjdF9VVEY4U3RyaW5nX2R1bXAJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZkYXRhICwgTlVMTCwgTlVMTCk7CisJCX0KKwkJCisJCS8qIERpYW1ldGVyVVJJICovCisJCXsKKwkJCS8qCisJCQkJVGhlIERpYW1ldGVyVVJJIE1VU1QgZm9sbG93IHRoZSBVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXJzIChVUkkpCisJCQkJc3ludGF4IFtSRkMzOTg2XSBydWxlcyBzcGVjaWZpZWQgYmVsb3c6CisKKwkJCQkgImFhYTovLyIgRlFETiBbIHBvcnQgXSBbIHRyYW5zcG9ydCBdIFsgcHJvdG9jb2wgXQorCisgICAgICAgICAgICAgICAgCQkJCSA7IE5vIHRyYW5zcG9ydCBzZWN1cml0eQorCisJCQkJICJhYWFzOi8vIiBGUUROIFsgcG9ydCBdIFsgdHJhbnNwb3J0IF0gWyBwcm90b2NvbCBdCisKKyAgICAgICAgICAgICAgICAJCQkJIDsgVHJhbnNwb3J0IHNlY3VyaXR5IHVzZWQKKworCQkJCSBGUUROICAgICAgICAgICAgICAgPSBGdWxseSBRdWFsaWZpZWQgSG9zdCBOYW1lCisKKwkJCQkgcG9ydCAgICAgICAgICAgICAgID0gIjoiIDEqRElHSVQKKworICAgICAgICAgICAgICAgIAkJCQkgOyBPbmUgb2YgdGhlIHBvcnRzIHVzZWQgdG8gbGlzdGVuIGZvcgorICAgICAgICAgICAgICAgIAkJCQkgOyBpbmNvbWluZyBjb25uZWN0aW9ucy4KKyAgICAgICAgICAgICAgICAJCQkJIDsgSWYgYWJzZW50LAorICAgICAgICAgICAgICAgIAkJCQkgOyB0aGUgZGVmYXVsdCBEaWFtZXRlciBwb3J0ICgzODY4KSBpcworICAgICAgICAgICAgICAgIAkJCQkgOyBhc3N1bWVkLgorCisJCQkJIHRyYW5zcG9ydCAgICAgICAgICA9ICI7dHJhbnNwb3J0PSIgdHJhbnNwb3J0LXByb3RvY29sCisKKyAgICAgICAgICAgICAgICAJCQkJIDsgT25lIG9mIHRoZSB0cmFuc3BvcnRzIHVzZWQgdG8gbGlzdGVuCisgICAgICAgICAgICAgICAgCQkJCSA7IGZvciBpbmNvbWluZyBjb25uZWN0aW9ucy4gIElmIGFic2VudCwKKyAgICAgICAgICAgICAgICAJCQkJIDsgdGhlIGRlZmF1bHQgU0NUUCBbUkZDMjk2MF0gcHJvdG9jb2wgaXMKKyAgICAgICAgICAgICAgICAJCQkJIDsgYXNzdW1lZC4gVURQIE1VU1QgTk9UIGJlIHVzZWQgd2hlbgorICAgICAgICAgICAgICAgIAkJCQkgOyB0aGUgYWFhLXByb3RvY29sIGZpZWxkIGlzIHNldCB0bworICAgICAgICAgICAgICAgIAkJCQkgOyBkaWFtZXRlci4KKworCQkJCXRyYW5zcG9ydC1wcm90b2NvbCA9ICggInRjcCIgLyAic2N0cCIgLyAidWRwIiApCisKKwkJCQlwcm90b2NvbCAgICAgICAgICAgPSAiO3Byb3RvY29sPSIgYWFhLXByb3RvY29sCisKKyAgICAgICAgICAgICAgICAJCQkJIDsgSWYgYWJzZW50LCB0aGUgZGVmYXVsdCBBQUEgcHJvdG9jb2wKKyAgICAgICAgICAgICAgICAJCQkJIDsgaXMgZGlhbWV0ZXIuCisKKwkJCQlhYWEtcHJvdG9jb2wgICAgICAgPSAoICJkaWFtZXRlciIgLyAicmFkaXVzIiAvICJ0YWNhY3MrIiApCisKKwkJCQlUaGUgZm9sbG93aW5nIGFyZSBleGFtcGxlcyBvZiB2YWxpZCBEaWFtZXRlciBob3N0IGlkZW50aXRpZXM6CisKKwkJCQlhYWE6Ly9ob3N0LmV4YW1wbGUuY29tO3RyYW5zcG9ydD10Y3AKKwkJCQlhYWE6Ly9ob3N0LmV4YW1wbGUuY29tOjY2NjY7dHJhbnNwb3J0PXRjcAorCQkJCWFhYTovL2hvc3QuZXhhbXBsZS5jb207cHJvdG9jb2w9ZGlhbWV0ZXIKKwkJCQlhYWE6Ly9ob3N0LmV4YW1wbGUuY29tOjY2NjY7cHJvdG9jb2w9ZGlhbWV0ZXIKKwkJCQlhYWE6Ly9ob3N0LmV4YW1wbGUuY29tOjY2NjY7dHJhbnNwb3J0PXRjcDtwcm90b2NvbD1kaWFtZXRlcgorCQkJCWFhYTovL2hvc3QuZXhhbXBsZS5jb206MTgxMzt0cmFuc3BvcnQ9dWRwO3Byb3RvY29sPXJhZGl1cworCQkJKi8KKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSBkYXRhID0geyBBVlBfVFlQRV9PQ1RFVFNUUklORywJIkRpYW1ldGVyVVJJIgkJLCBOVUxMCQkJLCBOVUxMCQksIGZkX2RpY3RmY3RfVVRGOFN0cmluZ19kdW1wCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmZGF0YSAsIE5VTEwsIE5VTEwpOworCQl9CisJCQorCQkvKiBFbnVtZXJhdGVkICovCisJCXsKKwkJCS8qCisJCQkJRW51bWVyYXRlZCBpcyBkZXJpdmVkIGZyb20gdGhlIEludGVnZXIzMiBBVlAgQmFzZSBGb3JtYXQuICBUaGUKKwkJCQlkZWZpbml0aW9uIGNvbnRhaW5zIGEgbGlzdCBvZiB2YWxpZCB2YWx1ZXMgYW5kIHRoZWlyCisJCQkJaW50ZXJwcmV0YXRpb24gYW5kIGlzIGRlc2NyaWJlZCBpbiB0aGUgRGlhbWV0ZXIgYXBwbGljYXRpb24KKwkJCQlpbnRyb2R1Y2luZyB0aGUgQVZQLgorCQkJKi8KKwkJCQorCQkJLyogV2UgZG9uJ3QgdXNlIGEgZ2VuZXJpYyAiRW51bWVyYXRlZCIgdHlwZSBpbiBmcmVlRGlhbWV0ZXIuIEluc3RlYWQsIHdlIGRlZmluZQorCQkJICogdHlwZXMgb2YgdGhlIGZvcm0gIkVudW1lcmF0ZWQoPGF2cG5hbWU+KSIgd2hlcmUgPGF2cG5hbWU+IGlzIHJlcGxhY2VkIAorCQkJICogYnkgdGhlIG5hbWUgb2YgdGhlIEFWUCB0byB3aGljaCB0aGUgdHlwZSBhcHBsaWVzLgorCQkJICogIEV4YW1wbGU6IEVudW1lcmF0ZWQoRGlzY29ubmVjdC1DYXVzZSkKKwkJCSAqLworCQkJOworCQl9CisJCQorCQkvKiBJUEZpbHRlclJ1bGUgKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgSVBGaWx0ZXJSdWxlIGZvcm1hdCBpcyBkZXJpdmVkIGZyb20gdGhlIE9jdGV0U3RyaW5nIEFWUCBCYXNlCisJCQkJRm9ybWF0IGFuZCB1c2VzIHRoZSBBU0NJSSBjaGFyc2V0LiAgVGhlIHJ1bGUgc3ludGF4IGlzIGEgbW9kaWZpZWQKKwkJCQlzdWJzZXQgb2YgaXBmdyg4KSBmcm9tIEZyZWVCU0QuICBQYWNrZXRzIG1heSBiZSBmaWx0ZXJlZCBiYXNlZCBvbgorCQkJCXRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggaXQ6CisKKwkJCQkgICAgRGlyZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAoaW4gb3Igb3V0KQorCQkJCSAgICBTb3VyY2UgYW5kIGRlc3RpbmF0aW9uIElQIGFkZHJlc3MgIChwb3NzaWJseSBtYXNrZWQpCisJCQkJICAgIFByb3RvY29sCisJCQkJICAgIFNvdXJjZSBhbmQgZGVzdGluYXRpb24gcG9ydCAgICAgICAgKGxpc3RzIG9yIHJhbmdlcykKKwkJCQkgICAgVENQIGZsYWdzCisJCQkJICAgIElQIGZyYWdtZW50IGZsYWcKKwkJCQkgICAgSVAgb3B0aW9ucworCQkJCSAgICBJQ01QIHR5cGVzCisKKwkJCQlSdWxlcyBmb3IgdGhlIGFwcHJvcHJpYXRlIGRpcmVjdGlvbiBhcmUgZXZhbHVhdGVkIGluIG9yZGVyLCB3aXRoCisJCQkJdGhlIGZpcnN0IG1hdGNoZWQgcnVsZSB0ZXJtaW5hdGluZyB0aGUgZXZhbHVhdGlvbi4gIEVhY2ggcGFja2V0IGlzCisJCQkJZXZhbHVhdGVkIG9uY2UuICBJZiBubyBydWxlIG1hdGNoZXMsIHRoZSBwYWNrZXQgaXMgZHJvcHBlZCBpZiB0aGUKKwkJCQlsYXN0IHJ1bGUgZXZhbHVhdGVkIHdhcyBhIHBlcm1pdCwgYW5kIHBhc3NlZCBpZiB0aGUgbGFzdCBydWxlIHdhcworCQkJCWEgZGVueS4KKworCQkJCUlQRmlsdGVyUnVsZSBmaWx0ZXJzIE1VU1QgZm9sbG93IHRoZSBmb3JtYXQ6CisJCQkJCisJCQkJICAgIGFjdGlvbiBkaXIgcHJvdG8gZnJvbSBzcmMgdG8gZHN0IFtvcHRpb25zXQorCQkJCQorCQkJKC4uLnNraXBwZWQgbG9vb29uZyBleHBsYW5hdGlvbi4uLikKKwkJCQkKKwkJCQlUaGVyZSBpcyBvbmUga2luZCBvZiBwYWNrZXQgdGhhdCB0aGUgYWNjZXNzIGRldmljZSBNVVNUIGFsd2F5cworCQkJCWRpc2NhcmQsIHRoYXQgaXMgYW4gSVAgZnJhZ21lbnQgd2l0aCBhIGZyYWdtZW50IG9mZnNldCBvZiBvbmUuCisJCQkJVGhpcyBpcyBhIHZhbGlkIHBhY2tldCwgYnV0IGl0IG9ubHkgaGFzIG9uZSB1c2UsIHRvIHRyeSB0bworCQkJCWNpcmN1bXZlbnQgZmlyZXdhbGxzLgorCisJCQkJQW4gYWNjZXNzIGRldmljZSB0aGF0IGlzIHVuYWJsZSB0byBpbnRlcnByZXQgb3IgYXBwbHkgYSBkZW55IHJ1bGUKKwkJCQlNVVNUIHRlcm1pbmF0ZSB0aGUgc2Vzc2lvbi4gIEFuIGFjY2VzcyBkZXZpY2UgdGhhdCBpcyB1bmFibGUgdG8KKwkJCQlpbnRlcnByZXQgb3IgYXBwbHkgYSBwZXJtaXQgcnVsZSBNQVkgYXBwbHkgYSBtb3JlIHJlc3RyaWN0aXZlCisJCQkJcnVsZS4gIEFuIGFjY2VzcyBkZXZpY2UgTUFZIGFwcGx5IGRlbnkgcnVsZXMgb2YgaXRzIG93biBiZWZvcmUgdGhlCisJCQkJc3VwcGxpZWQgcnVsZXMsIGZvciBleGFtcGxlIHRvIHByb3RlY3QgdGhlIGFjY2VzcyBkZXZpY2Ugb3duZXIncworCQkJCWluZnJhc3RydWN0dXJlLgorCQkJKi8KKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSBkYXRhID0geyBBVlBfVFlQRV9PQ1RFVFNUUklORywJIklQRmlsdGVyUnVsZSIJCSwgTlVMTAkJCSwgTlVMTAkJLCBmZF9kaWN0ZmN0X1VURjhTdHJpbmdfZHVtcAl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJmRhdGEgLCBOVUxMLCBOVUxMKTsKKwkJfQorCX0KKwkKKwkvKiBBVlAgc2VjdGlvbiAqLworCXsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogQWRkcmVzc190eXBlOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBVVEY4U3RyaW5nX3R5cGU7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIERpYW1ldGVySWRlbnRpdHlfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogRGlhbWV0ZXJVUklfdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogVGltZV90eXBlOworCQkKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiQWRkcmVzcyIsICZBZGRyZXNzX3R5cGUpOworCQlDSEVDS19kaWN0X3NlYXJjaCggRElDVF9UWVBFLCBUWVBFX0JZX05BTUUsICJVVEY4U3RyaW5nIiwgJlVURjhTdHJpbmdfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIkRpYW1ldGVySWRlbnRpdHkiLCAmRGlhbWV0ZXJJZGVudGl0eV90eXBlKTsKKwkJQ0hFQ0tfZGljdF9zZWFyY2goIERJQ1RfVFlQRSwgVFlQRV9CWV9OQU1FLCAiRGlhbWV0ZXJVUkkiLCAmRGlhbWV0ZXJVUklfdHlwZSk7CisJCUNIRUNLX2RpY3Rfc2VhcmNoKCBESUNUX1RZUEUsIFRZUEVfQllfTkFNRSwgIlRpbWUiLCAmVGltZV90eXBlKTsKKwkJCisJCS8qIFZlbmRvci1JZCAqLworCQl7CisJCQkvKgorCQkJCVRoZSBWZW5kb3ItSWQgQVZQIChBVlAgQ29kZSAyNjYpIGlzIG9mIHR5cGUgVW5zaWduZWQzMiBhbmQgY29udGFpbnMKKwkJCQl0aGUgSUFOQSAiU01JIE5ldHdvcmsgTWFuYWdlbWVudCBQcml2YXRlIEVudGVycHJpc2UgQ29kZXMiIFtSRkMzMjMyXQorCQkJCXZhbHVlIGFzc2lnbmVkIHRvIHRoZSB2ZW5kb3Igb2YgdGhlIERpYW1ldGVyIGRldmljZS4gIEl0IGlzCisJCQkJZW52aXNpb25lZCB0aGF0IHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgVmVuZG9yLUlkLCBQcm9kdWN0LU5hbWUKKwkJCQkoU2VjdGlvbiA1LjMuNykgYW5kIHRoZSBGaXJtd2FyZS1SZXZpc2lvbiAoU2VjdGlvbiA1LjMuNCkgQVZQcyBtYXkKKwkJCQlwcm92aWRlIHVzZWZ1bCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCisKKwkJCQlBIFZlbmRvci1JZCB2YWx1ZSBvZiB6ZXJvIGluIHRoZSBDRVIgb3IgQ0VBIG1lc3NhZ2VzIGlzIHJlc2VydmVkIGFuZAorCQkJCWluZGljYXRlcyB0aGF0IHRoaXMgZmllbGQgaXMgaWdub3JlZC4KKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJCQkJMjY2LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJI2lmIEFDX1ZFTkRPUl9JRCAhPSAyNjYKKwkJCQkJI2Vycm9yICJBQ19WRU5ET1JfSUQgZGVmaW5pdGlvbiBtaXNtYXRjaCIKKwkJCQkJI2VuZGlmCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJWZW5kb3ItSWQiLCAJCQkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksIAkJCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEsIE5VTEwsIE5VTEwpOworCQl9CisJCQorCQkvKiBGaXJtd2FyZS1SZXZpc2lvbiAqLworCQl7CisJCQkvKgorCQkJCVRoZSBGaXJtd2FyZS1SZXZpc2lvbiBBVlAgKEFWUCBDb2RlIDI2NykgaXMgb2YgdHlwZSBVbnNpZ25lZDMyIGFuZCBpcworCQkJCXVzZWQgdG8gaW5mb3JtIGEgRGlhbWV0ZXIgcGVlciBvZiB0aGUgZmlybXdhcmUgcmV2aXNpb24gb2YgdGhlCisJCQkJaXNzdWluZyBkZXZpY2UuCisKKwkJCQlGb3IgZGV2aWNlcyB0aGF0IGRvIG5vdCBoYXZlIGEgZmlybXdhcmUgcmV2aXNpb24gKGdlbmVyYWwgcHVycG9zZQorCQkJCWNvbXB1dGVycyBydW5uaW5nIERpYW1ldGVyIHNvZnR3YXJlIG1vZHVsZXMsIGZvciBpbnN0YW5jZSksIHRoZQorCQkJCXJldmlzaW9uIG9mIHRoZSBEaWFtZXRlciBzb2Z0d2FyZSBtb2R1bGUgbWF5IGJlIHJlcG9ydGVkIGluc3RlYWQuCisJCQkqLworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTI2NywgCQkJCQkvKiBDb2RlICovCisJCQkJCSNpZiBBQ19GSVJNV0FSRV9SRVZJU0lPTiAhPSAyNjcKKwkJCQkJI2Vycm9yICJBQ19GSVJNV0FSRV9SRVZJU0lPTiBkZWZpbml0aW9uIG1pc21hdGNoIgorCQkJCQkjZW5kaWYKKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIkZpcm13YXJlLVJldmlzaW9uIiwgCQkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQkwLAkJIAkJCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCBOVUxMKTsKKwkJfQorCQkKKwkJLyogSG9zdC1JUC1BZGRyZXNzICovCisJCXsKKwkJCS8qCisJCQkJVGhlIEhvc3QtSVAtQWRkcmVzcyBBVlAgKEFWUCBDb2RlIDI1NykgaXMgb2YgdHlwZSBBZGRyZXNzIGFuZCBpcyB1c2VkCisJCQkJdG8gaW5mb3JtIGEgRGlhbWV0ZXIgcGVlciBvZiB0aGUgc2VuZGVyJ3MgSVAgYWRkcmVzcy4gIEFsbCBzb3VyY2UKKwkJCQlhZGRyZXNzZXMgdGhhdCBhIERpYW1ldGVyIG5vZGUgZXhwZWN0cyB0byB1c2Ugd2l0aCBTQ1RQIFtSRkMyOTYwXQorCQkJCU1VU1QgYmUgYWR2ZXJ0aXNlZCBpbiB0aGUgQ0VSIGFuZCBDRUEgbWVzc2FnZXMgYnkgaW5jbHVkaW5nIGEKKwkJCQlIb3N0LUlQLSBBZGRyZXNzIEFWUCBmb3IgZWFjaCBhZGRyZXNzLiAgVGhpcyBBVlAgTVVTVCBPTkxZIGJlIHVzZWQgaW4KKwkJCQl0aGUgQ0VSIGFuZCBDRUEgbWVzc2FnZXMuCisJCQkqLworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTI1NywgCQkJCQkvKiBDb2RlICovCisJCQkJCSNpZiBBQ19IT1NUX0lQX0FERFJFU1MgIT0gMjU3CisJCQkJCSNlcnJvciAiQUNfSE9TVF9JUF9BRERSRVNTIGRlZmluaXRpb24gbWlzbWF0Y2giCisJCQkJCSNlbmRpZgorCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiSG9zdC1JUC1BZGRyZXNzIiwgCQkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBBZGRyZXNzX3R5cGUsIE5VTEwpOworCQl9CisJCQorCQkvKiBTdXBwb3J0ZWQtVmVuZG9yLUlkICovCisJCXsKKwkJCS8qCisJCQkJVGhlIFN1cHBvcnRlZC1WZW5kb3ItSWQgQVZQIChBVlAgQ29kZSAyNjUpIGlzIG9mIHR5cGUgVW5zaWduZWQzMiBhbmQKKwkJCQljb250YWlucyB0aGUgSUFOQSAiU01JIE5ldHdvcmsgTWFuYWdlbWVudCBQcml2YXRlIEVudGVycHJpc2UgQ29kZXMiCisJCQkJW1JGQzMyMzJdIHZhbHVlIGFzc2lnbmVkIHRvIGEgdmVuZG9yIG90aGVyIHRoYW4gdGhlIGRldmljZSB2ZW5kb3IgYnV0CisJCQkJaW5jbHVkaW5nIHRoZSBhcHBsaWNhdGlvbiB2ZW5kb3IuICBUaGlzIGlzIHVzZWQgaW4gdGhlIENFUiBhbmQgQ0VBCisJCQkJbWVzc2FnZXMgaW4gb3JkZXIgdG8gaW5mb3JtIHRoZSBwZWVyIHRoYXQgdGhlIHNlbmRlciBzdXBwb3J0cyAoYQorCQkJCXN1YnNldCBvZikgdGhlIHZlbmRvci1zcGVjaWZpYyBBVlBzIGRlZmluZWQgYnkgdGhlIHZlbmRvciBpZGVudGlmaWVkCisJCQkJaW4gdGhpcyBBVlAuICBUaGUgdmFsdWUgb2YgdGhpcyBBVlAgU0hPVUxEIE5PVCBiZSBzZXQgdG8gemVyby4KKwkJCQlNdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhpcyBBVlAgY29udGFpbmluZyB0aGUgc2FtZSB2YWx1ZSBTSE9VTEQgTk9UCisJCQkJYmUgc2VudC4KKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJCQkJMjY1LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJI2lmIEFDX1NVUFBPUlRFRF9WRU5ET1JfSUQgIT0gMjY1CisJCQkJCSNlcnJvciAiQUNfU1VQUE9SVEVEX1ZFTkRPUl9JRCBkZWZpbml0aW9uIG1pc21hdGNoIgorCQkJCQkjZW5kaWYKKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIlN1cHBvcnRlZC1WZW5kb3ItSWQiLCAJCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCQkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9VTlNJR05FRDMyIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgTlVMTCk7CisJCX0KKwkJCisJCS8qIFByb2R1Y3QtTmFtZSAqLworCQl7CisJCQkvKgorCQkJCVRoZSBQcm9kdWN0LU5hbWUgQVZQIChBVlAgQ29kZSAyNjkpIGlzIG9mIHR5cGUgVVRGOFN0cmluZywgYW5kCisJCQkJY29udGFpbnMgdGhlIHZlbmRvciBhc3NpZ25lZCBuYW1lIGZvciB0aGUgcHJvZHVjdC4gIFRoZSBQcm9kdWN0LU5hbWUKKwkJCQlBVlAgU0hPVUxEIHJlbWFpbiBjb25zdGFudCBhY3Jvc3MgZmlybXdhcmUgcmV2aXNpb25zIGZvciB0aGUgc2FtZQorCQkJCXByb2R1Y3QuCisJCQkqLworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTI2OSwgCQkJCQkvKiBDb2RlICovCisJCQkJCSNpZiBBQ19QUk9EVUNUX05BTUUgIT0gMjY5CisJCQkJCSNlcnJvciAiQUNfUFJPRFVDVF9OQU1FIGRlZmluaXRpb24gbWlzbWF0Y2giCisJCQkJCSNlbmRpZgorCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiUHJvZHVjdC1OYW1lIiwgCQkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQkwLAkJCQkJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9CisJCQorCQkvKiBEaXNjb25uZWN0LUNhdXNlICovCisJCXsKKwkJCS8qCisJCQkJVGhlIERpc2Nvbm5lY3QtQ2F1c2UgQVZQIChBVlAgQ29kZSAyNzMpIGlzIG9mIHR5cGUgRW51bWVyYXRlZC4gIEEKKwkJCQlEaWFtZXRlciBub2RlIE1VU1QgaW5jbHVkZSB0aGlzIEFWUCBpbiB0aGUgRGlzY29ubmVjdC1QZWVyLVJlcXVlc3QKKwkJCQltZXNzYWdlIHRvIGluZm9ybSB0aGUgcGVlciBvZiB0aGUgcmVhc29uIGZvciBpdHMgaW50ZW50aW9uIHRvCisJCQkJc2h1dGRvd24gdGhlIHRyYW5zcG9ydCBjb25uZWN0aW9uLiAgVGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlCisJCQkJc3VwcG9ydGVkOgorCisJCQkJUkVCT09USU5HICAgICAgICAgICAgICAgICAgICAgICAgIDAKKwkJCQlBIHNjaGVkdWxlZCByZWJvb3QgaXMgaW1taW5lbnQuIFJlY2VpdmVyIG9mIERQUiB3aXRoIGFib3ZlIHJlc3VsdAorCQkJCWNvZGUgTUFZIGF0dGVtcHQgcmVjb25uZWN0aW9uLgorCisJCQkJQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKwkJCQlUaGUgcGVlcidzIGludGVybmFsIHJlc291cmNlcyBhcmUgY29uc3RyYWluZWQsIGFuZCBpdCBoYXMKKwkJCQlkZXRlcm1pbmVkIHRoYXQgdGhlIHRyYW5zcG9ydCBjb25uZWN0aW9uIG5lZWRzIHRvIGJlIGNsb3NlZC4KKwkJCQlSZWNlaXZlciBvZiBEUFIgd2l0aCBhYm92ZSByZXN1bHQgY29kZSBTSE9VTEQgTk9UIGF0dGVtcHQKKwkJCQlyZWNvbm5lY3Rpb24uCisKKwkJCQlET19OT1RfV0FOVF9UT19UQUxLX1RPX1lPVSAgICAgICAgMgorCQkJCVRoZSBwZWVyIGhhcyBkZXRlcm1pbmVkIHRoYXQgaXQgZG9lcyBub3Qgc2VlIGEgbmVlZCBmb3IgdGhlCisJCQkJdHJhbnNwb3J0IGNvbm5lY3Rpb24gdG8gZXhpc3QsIHNpbmNlIGl0IGRvZXMgbm90IGV4cGVjdCBhbnkKKwkJCQltZXNzYWdlcyB0byBiZSBleGNoYW5nZWQgaW4gdGhlIG5lYXIgZnV0dXJlLiBSZWNlaXZlciBvZiBEUFIKKwkJCQl3aXRoIGFib3ZlIHJlc3VsdCBjb2RlIFNIT1VMRCBOT1QgYXR0ZW1wdCByZWNvbm5lY3Rpb24uCisJCQkqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0IAkqIAl0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhIAkJdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwJIkVudW1lcmF0ZWQoRGlzY29ubmVjdC1DYXVzZSkiCSwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIAl0XzAgPSB7ICJSRUJPT1RJTkciLCAJCQl7IC5pMzIgPSAwIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIAl0XzEgPSB7ICJCVVNZIiwgCQkJeyAuaTMyID0gMSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAJdF8yID0geyAiRE9fTk9UX1dBTlRfVE9fVEFMS19UT19ZT1UiLCAJeyAuaTMyID0gMiB9fTsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIAkJZGF0YSA9IHsgCisJCQkJCTI3MywgCQkJCQkvKiBDb2RlICovCisJCQkJCSNpZiBBQ19ESVNDT05ORUNUX0NBVVNFICE9IDI3MworCQkJCQkjZXJyb3IgIkFDX0RJU0NPTk5FQ1RfQ0FVU0UgZGVmaW5pdGlvbiBtaXNtYXRjaCIKKwkJCQkJI2VuZGlmCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJEaXNjb25uZWN0LUNhdXNlIiwgCQkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfSU5URUdFUjMyIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhICwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMCAsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSAsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiAsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIHR5cGUsIE5VTEwpOworCQl9CisJCQorCQkvKiBPcmlnaW4tSG9zdCAqLworCQl7CisJCQkvKgorCQkJCVRoZSBPcmlnaW4tSG9zdCBBVlAgKEFWUCBDb2RlIDI2NCkgaXMgb2YgdHlwZSBEaWFtZXRlcklkZW50aXR5LCBhbmQKKwkJCQlNVVNUIGJlIHByZXNlbnQgaW4gYWxsIERpYW1ldGVyIG1lc3NhZ2VzLiAgVGhpcyBBVlAgaWRlbnRpZmllcyB0aGUKKwkJCQllbmRwb2ludCB0aGF0IG9yaWdpbmF0ZWQgdGhlIERpYW1ldGVyIG1lc3NhZ2UuICBSZWxheSBhZ2VudHMgTVVTVCBOT1QKKwkJCQltb2RpZnkgdGhpcyBBVlAuCisKKwkJCQlUaGUgdmFsdWUgb2YgdGhlIE9yaWdpbi1Ib3N0IEFWUCBpcyBndWFyYW50ZWVkIHRvIGJlIHVuaXF1ZSB3aXRoaW4gYQorCQkJCXNpbmdsZSBob3N0LgorCisJCQkJTm90ZSB0aGF0IHRoZSBPcmlnaW4tSG9zdCBBVlAgbWF5IHJlc29sdmUgdG8gbW9yZSB0aGFuIG9uZSBhZGRyZXNzIGFzCisJCQkJdGhlIERpYW1ldGVyIHBlZXIgbWF5IHN1cHBvcnQgbW9yZSB0aGFuIG9uZSBhZGRyZXNzLgorCisJCQkJVGhpcyBBVlAgU0hPVUxEIGJlIHBsYWNlZCBhcyBjbG9zZSB0byB0aGUgRGlhbWV0ZXIgaGVhZGVyIGFzCisJCQkJcG9zc2libGUuCisJCQkqLworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTI2NCwgCQkJCQkvKiBDb2RlICovCisJCQkJCSNpZiBBQ19PUklHSU5fSE9TVCAhPSAyNjQKKwkJCQkJI2Vycm9yICJBQ19PUklHSU5fSE9TVCBkZWZpbml0aW9uIG1pc21hdGNoIgorCQkJCQkjZW5kaWYKKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIk9yaWdpbi1Ib3N0IiwgCQkJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgRGlhbWV0ZXJJZGVudGl0eV90eXBlLCBOVUxMKTsKKwkJfQorCQkKKwkJLyogT3JpZ2luLVJlYWxtICovCisJCXsKKwkJCS8qCisJCQkJVGhlIE9yaWdpbi1SZWFsbSBBVlAgKEFWUCBDb2RlIDI5NikgaXMgb2YgdHlwZSBEaWFtZXRlcklkZW50aXR5LgorCQkJCVRoaXMgQVZQIGNvbnRhaW5zIHRoZSBSZWFsbSBvZiB0aGUgb3JpZ2luYXRvciBvZiBhbnkgRGlhbWV0ZXIgbWVzc2FnZQorCQkJCWFuZCBNVVNUIGJlIHByZXNlbnQgaW4gYWxsIG1lc3NhZ2VzLgorCisJCQkJVGhpcyBBVlAgU0hPVUxEIGJlIHBsYWNlZCBhcyBjbG9zZSB0byB0aGUgRGlhbWV0ZXIgaGVhZGVyIGFzCisJCQkJcG9zc2libGUuCisJCQkqLworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTI5NiwgCQkJCQkvKiBDb2RlICovCisJCQkJCSNpZiBBQ19PUklHSU5fUkVBTE0gIT0gMjk2CisJCQkJCSNlcnJvciAiQUNfT1JJR0lOX1JFQUxNIGRlZmluaXRpb24gbWlzbWF0Y2giCisJCQkJCSNlbmRpZgorCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiT3JpZ2luLVJlYWxtIiwgCQkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBEaWFtZXRlcklkZW50aXR5X3R5cGUsIE5VTEwpOworCQl9CisJCQorCQkvKiBEZXN0aW5hdGlvbi1Ib3N0ICovCisJCXsKKwkJCS8qCisJCQkJVGhlIERlc3RpbmF0aW9uLUhvc3QgQVZQIChBVlAgQ29kZSAyOTMpIGlzIG9mIHR5cGUgRGlhbWV0ZXJJZGVudGl0eS4KKwkJCQlUaGlzIEFWUCBNVVNUIGJlIHByZXNlbnQgaW4gYWxsIHVuc29saWNpdGVkIGFnZW50IGluaXRpYXRlZCBtZXNzYWdlcywKKwkJCQlNQVkgYmUgcHJlc2VudCBpbiByZXF1ZXN0IG1lc3NhZ2VzLCBhbmQgTVVTVCBOT1QgYmUgcHJlc2VudCBpbiBBbnN3ZXIKKwkJCQltZXNzYWdlcy4KKworCQkJCVRoZSBhYnNlbmNlIG9mIHRoZSBEZXN0aW5hdGlvbi1Ib3N0IEFWUCB3aWxsIGNhdXNlIGEgbWVzc2FnZSB0byBiZQorCQkJCXNlbnQgdG8gYW55IERpYW1ldGVyIHNlcnZlciBzdXBwb3J0aW5nIHRoZSBhcHBsaWNhdGlvbiB3aXRoaW4gdGhlCisJCQkJcmVhbG0gc3BlY2lmaWVkIGluIERlc3RpbmF0aW9uLVJlYWxtIEFWUC4KKworCQkJCVRoaXMgQVZQIFNIT1VMRCBiZSBwbGFjZWQgYXMgY2xvc2UgdG8gdGhlIERpYW1ldGVyIGhlYWRlciBhcworCQkJCXBvc3NpYmxlLgorCQkJKi8KKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQkJCQkyOTMsIAkJCQkJLyogQ29kZSAqLworCQkJCQkjaWYgQUNfREVTVElOQVRJT05fSE9TVCAhPSAyOTMKKwkJCQkJI2Vycm9yICJBQ19ERVNUSU5BVElPTl9IT1NUIGRlZmluaXRpb24gbWlzbWF0Y2giCisJCQkJCSNlbmRpZgorCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiRGVzdGluYXRpb24tSG9zdCIsIAkJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgRGlhbWV0ZXJJZGVudGl0eV90eXBlLCBOVUxMKTsKKwkJfQorCQkKKwkJLyogRGVzdGluYXRpb24tUmVhbG0gKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgRGVzdGluYXRpb24tUmVhbG0gQVZQIChBVlAgQ29kZSAyODMpIGlzIG9mIHR5cGUgRGlhbWV0ZXJJZGVudGl0eSwKKwkJCQlhbmQgY29udGFpbnMgdGhlIHJlYWxtIHRoZSBtZXNzYWdlIGlzIHRvIGJlIHJvdXRlZCB0by4gIFRoZQorCQkJCURlc3RpbmF0aW9uLVJlYWxtIEFWUCBNVVNUIE5PVCBiZSBwcmVzZW50IGluIEFuc3dlciBtZXNzYWdlcy4KKwkJCQlEaWFtZXRlciBDbGllbnRzIGluc2VydCB0aGUgcmVhbG0gcG9ydGlvbiBvZiB0aGUgVXNlci1OYW1lIEFWUC4KKwkJCQlEaWFtZXRlciBzZXJ2ZXJzIGluaXRpYXRpbmcgYSByZXF1ZXN0IG1lc3NhZ2UgdXNlIHRoZSB2YWx1ZSBvZiB0aGUKKwkJCQlPcmlnaW4tUmVhbG0gQVZQIGZyb20gYSBwcmV2aW91cyBtZXNzYWdlIHJlY2VpdmVkIGZyb20gdGhlIGludGVuZGVkCisJCQkJdGFyZ2V0IGhvc3QgKHVubGVzcyBpdCBpcyBrbm93biBhIHByaW9yaSkuICBXaGVuIHByZXNlbnQsIHRoZQorCQkJCURlc3RpbmF0aW9uLVJlYWxtIEFWUCBpcyB1c2VkIHRvIHBlcmZvcm0gbWVzc2FnZSByb3V0aW5nIGRlY2lzaW9ucy4KKworCQkJCVJlcXVlc3QgbWVzc2FnZXMgd2hvc2UgQUJORiBkb2VzIG5vdCBsaXN0IHRoZSBEZXN0aW5hdGlvbi1SZWFsbSBBVlAKKwkJCQlhcyBhIG1hbmRhdG9yeSBBVlAgYXJlIGluaGVyZW50bHkgbm9uLXJvdXRhYmxlIG1lc3NhZ2VzLgorCisJCQkJVGhpcyBBVlAgU0hPVUxEIGJlIHBsYWNlZCBhcyBjbG9zZSB0byB0aGUgRGlhbWV0ZXIgaGVhZGVyIGFzCisJCQkJcG9zc2libGUuCisJCQkqLworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTI4MywgCQkJCQkvKiBDb2RlICovCisJCQkJCSNpZiBBQ19ERVNUSU5BVElPTl9SRUFMTSAhPSAyODMKKwkJCQkJI2Vycm9yICJBQ19ERVNUSU5BVElPTl9SRUFMTSBkZWZpbml0aW9uIG1pc21hdGNoIgorCQkJCQkjZW5kaWYKKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIkRlc3RpbmF0aW9uLVJlYWxtIiwgCQkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBEaWFtZXRlcklkZW50aXR5X3R5cGUsIE5VTEwpOworCQl9CisJCQorCQkvKiBSb3V0ZS1SZWNvcmQgKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgUm91dGUtUmVjb3JkIEFWUCAoQVZQIENvZGUgMjgyKSBpcyBvZiB0eXBlIERpYW1ldGVySWRlbnRpdHkuICBUaGUKKwkJCQlpZGVudGl0eSBhZGRlZCBpbiB0aGlzIEFWUCBNVVNUIGJlIHRoZSBzYW1lIGFzIHRoZSBvbmUgcmVjZWl2ZWQgaW4KKwkJCQl0aGUgT3JpZ2luLUhvc3Qgb2YgdGhlIENhcGFiaWxpdGllcyBFeGNoYW5nZSBtZXNzYWdlLgorCQkJKi8KKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQkJCQkyODIsIAkJCQkJLyogQ29kZSAqLworCQkJCQkjaWYgQUNfUk9VVEVfUkVDT1JEICE9IDI4MgorCQkJCQkjZXJyb3IgIkFDX1JPVVRFX1JFQ09SRCBkZWZpbml0aW9uIG1pc21hdGNoIgorCQkJCQkjZW5kaWYKKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIlJvdXRlLVJlY29yZCIsIAkJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgRGlhbWV0ZXJJZGVudGl0eV90eXBlLCBOVUxMKTsKKwkJfQorCQkKKwkJLyogUHJveHktSG9zdCAqLworCQl7CisJCQkvKgorCQkJCVRoZSBQcm94eS1Ib3N0IEFWUCAoQVZQIENvZGUgMjgwKSBpcyBvZiB0eXBlIERpYW1ldGVySWRlbnRpdHkuICBUaGlzCisJCQkJQVZQIGNvbnRhaW5zIHRoZSBpZGVudGl0eSBvZiB0aGUgaG9zdCB0aGF0IGFkZGVkIHRoZSBQcm94eS1JbmZvIEFWUC4KKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBhZGF0YSA9IHsgCisJCQkJCTI4MCwgCQkJCQkvKiBDb2RlICovCisJCQkJCSNpZiBBQ19QUk9YWV9IT1NUICE9IDI4MAorCQkJCQkjZXJyb3IgIkFDX1BST1hZX0hPU1QgZGVmaW5pdGlvbiBtaXNtYXRjaCIKKwkJCQkJI2VuZGlmCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJQcm94eS1Ib3N0IiwgCQkJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZhZGF0YSAsIERpYW1ldGVySWRlbnRpdHlfdHlwZSwgTlVMTCk7CisJCX0KKwkJCisJCS8qIFByb3h5LVN0YXRlICovCisJCXsKKwkJCS8qCisJCQkJVGhlIFByb3h5LVN0YXRlIEFWUCAoQVZQIENvZGUgMzMpIGlzIG9mIHR5cGUgT2N0ZXRTdHJpbmcsIGFuZAorCQkJCWNvbnRhaW5zIHN0YXRlIGxvY2FsIGluZm9ybWF0aW9uLCBhbmQgTVVTVCBiZSB0cmVhdGVkIGFzIG9wYXF1ZSBkYXRhLgorCQkJKi8KKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGFkYXRhID0geyAKKwkJCQkJMzMsIAkJCQkJLyogQ29kZSAqLworCQkJCQkjaWYgQUNfUFJPWFlfU1RBVEUgIT0gMzMKKwkJCQkJI2Vycm9yICJBQ19QUk9YWV9TVEFURSBkZWZpbml0aW9uIG1pc21hdGNoIgorCQkJCQkjZW5kaWYKKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIlByb3h5LVN0YXRlIiwgCQkJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZhZGF0YSAsIE5VTEwsIE5VTEwpOworCQl9CisJCQkKKwkJLyogUHJveHktSW5mbyAqLworCQl7CisJCQkvKgorCQkJCVRoZSBQcm94eS1JbmZvIEFWUCAoQVZQIENvZGUgMjg0KSBpcyBvZiB0eXBlIEdyb3VwZWQuICBUaGUgR3JvdXBlZAorCQkJCURhdGEgZmllbGQgaGFzIHRoZSBmb2xsb3dpbmcgQUJORiBncmFtbWFyOgorCisJCQkJIFByb3h5LUluZm8gOjo9IDwgQVZQIEhlYWRlcjogMjg0ID4KKyAgICAgICAgICAgICAgICAJCQkJeyBQcm94eS1Ib3N0IH0KKyAgICAgICAgICAgICAgICAJCQkJeyBQcm94eS1TdGF0ZSB9CisgICAgICAgIAkJCQkgICAgICAqIFsgQVZQIF0KKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnA7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJCQkJMjg0LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJI2lmIEFDX1BST1hZX0lORk8gIT0gMjg0CisJCQkJCSNlcnJvciAiQUNfUFJPWFlfSU5GTyBkZWZpbml0aW9uIG1pc21hdGNoIgorCQkJCQkjZW5kaWYKKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIlByb3h5LUluZm8iLCAJCQkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfR1JPVVBFRCAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCQkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9IAorCQkJCQkJeyAJIHsgICJQcm94eS1Ib3N0IiwgCQkJUlVMRV9SRVFVSVJFRCwgLTEsIDEgfQorCQkJCQkJCSx7ICAiUHJveHktU3RhdGUiLAkJCVJVTEVfUkVRVUlSRUQsIC0xLCAxIH0KKwkJCQkJCX07CisJCQkKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCAmYXZwKTsKKwkJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGF2cCApOworCQl9CisJCQorCQkvKiBBdXRoLUFwcGxpY2F0aW9uLUlkICovCisJCXsKKwkJCS8qCisJCQkJVGhlIEF1dGgtQXBwbGljYXRpb24tSWQgQVZQIChBVlAgQ29kZSAyNTgpIGlzIG9mIHR5cGUgVW5zaWduZWQzMiBhbmQKKwkJCQlpcyB1c2VkIGluIG9yZGVyIHRvIGFkdmVydGlzZSBzdXBwb3J0IG9mIHRoZSBBdXRoZW50aWNhdGlvbiBhbmQKKwkJCQlBdXRob3JpemF0aW9uIHBvcnRpb24gb2YgYW4gYXBwbGljYXRpb24gKHNlZSBTZWN0aW9uIDIuNCkuICBJZgorCQkJCXByZXNlbnQgaW4gYSBtZXNzYWdlIG90aGVyIHRoYW4gQ0VSIGFuZCBDRUEsIHRoZSB2YWx1ZSBvZiB0aGUgQXV0aC0KKwkJCQlBcHBsaWNhdGlvbi1JZCBBVlAgTVVTVCBtYXRjaCB0aGUgQXBwbGljYXRpb24gSWQgcHJlc2VudCBpbiB0aGUKKwkJCQlEaWFtZXRlciBtZXNzYWdlIGhlYWRlci4KKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJCQkJMjU4LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJI2lmIEFDX0FVVEhfQVBQTElDQVRJT05fSUQgIT0gMjU4CisJCQkJCSNlcnJvciAiQUNfQVVUSF9BUFBMSUNBVElPTl9JRCBkZWZpbml0aW9uIG1pc21hdGNoIgorCQkJCQkjZW5kaWYKKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIkF1dGgtQXBwbGljYXRpb24tSWQiLCAJCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCQkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9VTlNJR05FRDMyIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgTlVMTCk7CisJCX0KKwkJCisJCS8qIEFjY3QtQXBwbGljYXRpb24tSWQgKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgQWNjdC1BcHBsaWNhdGlvbi1JZCBBVlAgKEFWUCBDb2RlIDI1OSkgaXMgb2YgdHlwZSBVbnNpZ25lZDMyIGFuZAorCQkJCWlzIHVzZWQgaW4gb3JkZXIgdG8gYWR2ZXJ0aXNlIHN1cHBvcnQgb2YgdGhlIEFjY291bnRpbmcgcG9ydGlvbiBvZiBhbgorCQkJCWFwcGxpY2F0aW9uIChzZWUgU2VjdGlvbiAyLjQpLiAgSWYgcHJlc2VudCBpbiBhIG1lc3NhZ2Ugb3RoZXIgdGhhbgorCQkJCUNFUiBhbmQgQ0VBLCB0aGUgdmFsdWUgb2YgdGhlIEFjY3QtQXBwbGljYXRpb24tSWQgQVZQIE1VU1QgbWF0Y2ggdGhlCisJCQkJQXBwbGljYXRpb24gSWQgcHJlc2VudCBpbiB0aGUgRGlhbWV0ZXIgbWVzc2FnZSBoZWFkZXIuCisJCQkqLworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTI1OSwgCQkJCQkvKiBDb2RlICovCisJCQkJCSNpZiBBQ19BQ0NUX0FQUExJQ0FUSU9OX0lEICE9IDI1OQorCQkJCQkjZXJyb3IgIkFDX0FDQ1RfQVBQTElDQVRJT05fSUQgZGVmaW5pdGlvbiBtaXNtYXRjaCIKKwkJCQkJI2VuZGlmCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJBY2N0LUFwcGxpY2F0aW9uLUlkIiwgCQkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfVU5TSUdORUQzMiAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsIE5VTEwpOworCQl9CisJCQorCQkvKiBJbmJhbmQtU2VjdXJpdHktSWQgKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgSW5iYW5kLVNlY3VyaXR5LUlkIEFWUCAoQVZQIENvZGUgMjk5KSBpcyBvZiB0eXBlIFVuc2lnbmVkMzIgYW5kCisJCQkJaXMgdXNlZCBpbiBvcmRlciB0byBhZHZlcnRpc2Ugc3VwcG9ydCBvZiB0aGUgU2VjdXJpdHkgcG9ydGlvbiBvZiB0aGUKKwkJCQlhcHBsaWNhdGlvbi4KKworCQkJCUN1cnJlbnRseSwgdGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIHN1cHBvcnRlZCwgYnV0IHRoZXJlIGlzIGFtcGxlCisJCQkJcm9vbSB0byBhZGQgbmV3IHNlY3VyaXR5IElkcy4KKworCisJCQkJTk9fSU5CQU5EX1NFQ1VSSVRZIDAKKworCQkJCVRoaXMgcGVlciBkb2VzIG5vdCBzdXBwb3J0IFRMUy4gIFRoaXMgaXMgdGhlIGRlZmF1bHQgdmFsdWUsIGlmIHRoZQorCQkJCUFWUCBpcyBvbWl0dGVkLgorCisJCQkJVExTIDEKKworCQkJCVRoaXMgbm9kZSBzdXBwb3J0cyBUTFMgc2VjdXJpdHksIGFzIGRlZmluZWQgYnkgW1JGQzQzNDZdLgorCQkJKi8KKwkJCQorCQkJLyogQWx0aG91Z2ggdGhlIFJGQyBkb2VzIG5vdCBzcGVjaWZ5IGFuICJFbnVtZXJhdGVkIiB0eXBlIGhlcmUsIHdlIGdvIGZvcndhcmQgYW5kIGNyZWF0ZSBvbmUuCisJCQkgKiBUaGlzIGlzIHRoZSByZWFzb24gZm9yIHRoZSAiKiIgaW4gdGhlIHR5cGUgbmFtZQorCQkJICovCisJCQkKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAJKiAJdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YQkgCXRkYXRhID0geyBBVlBfVFlQRV9VTlNJR05FRDMyLAkiRW51bWVyYXRlZChJbmJhbmQtU2VjdXJpdHktSWQpIgksIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAJdF8wID0geyAiTk9fSU5CQU5EX1NFQ1VSSVRZIiwgCQl7IC51MzIgPSBBQ1ZfSVNJX05PX0lOQkFORF9TRUNVUklUWSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAJdF8xID0geyAiVExTIiwgCQkJeyAudTMyID0gQUNWX0lTSV9UTFMgfX07CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSAJCWRhdGEgPSB7IAorCQkJCQkyOTksIAkJCQkJLyogQ29kZSAqLworCQkJCQkjaWYgQUNfSU5CQU5EX1NFQ1VSSVRZX0lEICE9IDI5OQorCQkJCQkjZXJyb3IgIkFDX0lOQkFORF9TRUNVUklUWV9JRCBkZWZpbml0aW9uIG1pc21hdGNoIgorCQkJCQkjZW5kaWYKKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIkluYmFuZC1TZWN1cml0eS1JZCIsIAkJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEgLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8wICwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xICwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgdHlwZSwgTlVMTCk7CisJCX0KKwkJCisJCS8qIFZlbmRvci1TcGVjaWZpYy1BcHBsaWNhdGlvbi1JZCAqLworCQl7CisJCQkvKgorCQkJCVRoZSBWZW5kb3ItU3BlY2lmaWMtQXBwbGljYXRpb24tSWQgQVZQIChBVlAgQ29kZSAyNjApIGlzIG9mIHR5cGUKKwkJCQlHcm91cGVkIGFuZCBpcyB1c2VkIHRvIGFkdmVydGlzZSBzdXBwb3J0IG9mIGEgdmVuZG9yLXNwZWNpZmljCisJCQkJRGlhbWV0ZXIgQXBwbGljYXRpb24uICBFeGFjdGx5IG9uZSBpbnN0YW5jZSBvZiBlaXRoZXIgQXV0aC0KKwkJCQlBcHBsaWNhdGlvbi1JZCBvciBBY2N0LUFwcGxpY2F0aW9uLUlkIEFWUCBNVVNUIGJlIHByZXNlbnQuICBUaGUKKwkJCQlBcHBsaWNhdGlvbiBJZCBjYXJyaWVkIGJ5IGVpdGhlciBBdXRoLUFwcGxpY2F0aW9uLUlkIG9yIEFjY3QtCisJCQkJQXBwbGljYXRpb24tSWQgQVZQIE1VU1QgY29tcGx5IHdpdGggdmVuZG9yIHNwZWNpZmljIEFwcGxpY2F0aW9uIElkCisJCQkJYXNzaWdubWVudCBkZXNjcmliZWQgaW4gU2VjIDExLjMuICBJdCBNVVNUIGFsc28gbWF0Y2ggdGhlIEFwcGxpY2F0aW9uCisJCQkJSWQgcHJlc2VudCBpbiB0aGUgZGlhbWV0ZXIgaGVhZGVyIGV4Y2VwdCB3aGVuIHVzZWQgaW4gYSBDRVIgb3IgQ0VBCisJCQkJbWVzc2FnZXMuCisKKwkJCQlUaGUgVmVuZG9yLUlkIEFWUCBpcyBhbiBpbmZvcm1hdGlvbmFsIEFWUCBwZXJ0YWluaW5nIHRvIHRoZSB2ZW5kb3IKKwkJCQl3aG8gbWF5IGhhdmUgYXV0aG9yc2hpcCBvZiB0aGUgdmVuZG9yLXNwZWNpZmljIERpYW1ldGVyIGFwcGxpY2F0aW9uLgorCQkJCUl0IE1VU1QgTk9UIGJlIHVzZWQgYXMgYSBtZWFucyBvZiBkZWZpbmluZyBhIGNvbXBsZXRlbHkgc2VwYXJhdGUKKwkJCQl2ZW5kb3Itc3BlY2lmaWMgQXBwbGljYXRpb24gSWQgc3BhY2UuCisKKwkJCQlUaGlzIEFWUCBNVVNUIGFsc28gYmUgcHJlc2VudCBhcyB0aGUgZmlyc3QgQVZQIGluIGFsbCBleHBlcmltZW50YWwKKwkJCQljb21tYW5kcyBkZWZpbmVkIGluIHRoZSB2ZW5kb3Itc3BlY2lmaWMgYXBwbGljYXRpb24uCisKKwkJCQlUaGlzIEFWUCBTSE9VTEQgYmUgcGxhY2VkIGFzIGNsb3NlIHRvIHRoZSBEaWFtZXRlciBoZWFkZXIgYXMKKwkJCQlwb3NzaWJsZS4KKworCQkJCUFWUCBGb3JtYXQKKworCQkJCTxWZW5kb3ItU3BlY2lmaWMtQXBwbGljYXRpb24tSWQ+IDo6PSA8IEFWUCBIZWFkZXI6IDI2MCA+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkgICB7IFZlbmRvci1JZCB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkgICBbIEF1dGgtQXBwbGljYXRpb24tSWQgXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJICAgWyBBY2N0LUFwcGxpY2F0aW9uLUlkIF0KKworCQkJCUEgVmVuZG9yLVNwZWNpZmljLUFwcGxpY2F0aW9uLUlkIEFWUCBNVVNUIGNvbnRhaW4gZXhhY3RseSBvbmUgb2YKKwkJCQllaXRoZXIgQXV0aC1BcHBsaWNhdGlvbi1JZCBvciBBY2N0LUFwcGxpY2F0aW9uLUlkLiAgSWYgYSBWZW5kb3ItCisJCQkJU3BlY2lmaWMtQXBwbGljYXRpb24tSWQgaXMgcmVjZWl2ZWQgd2l0aG91dCBhbnkgb2YgdGhlc2UgdHdvIEFWUHMsCisJCQkJdGhlbiB0aGUgcmVjaXBpZW50IFNIT1VMRCBpc3N1ZSBhbiBhbnN3ZXIgd2l0aCBhIFJlc3VsdC1Db2RlIHNldCB0bworCQkJCURJQU1FVEVSX01JU1NJTkdfQVZQLiAgVGhlIGFuc3dlciBTSE9VTEQgYWxzbyBpbmNsdWRlIGEgRmFpbGVkLUFWUAorCQkJCXdoaWNoIE1VU1QgY29udGFpbiBhbiBleGFtcGxlIG9mIGFuIEF1dGgtQXBwbGljYXRpb24tSWQgQVZQIGFuZCBhbgorCQkJCUFjY3QtQXBwbGljYXRpb24tSWQgQVZQLgorCisJCQkJSWYgYSBWZW5kb3ItU3BlY2lmaWMtQXBwbGljYXRpb24tSWQgaXMgcmVjZWl2ZWQgdGhhdCBjb250YWlucyBib3RoCisJCQkJQXV0aC1BcHBsaWNhdGlvbi1JZCBhbmQgQWNjdC1BcHBsaWNhdGlvbi1JZCwgdGhlbiB0aGUgcmVjaXBpZW50CisJCQkJU0hPVUxEIGlzc3VlIGFuIGFuc3dlciB3aXRoIFJlc3VsdC1Db2RlIHNldCB0bworCQkJCURJQU1FVEVSX0FWUF9PQ0NVUlNfVE9PX01BTllfVElNRVMuICBUaGUgYW5zd2VyIFNIT1VMRCBhbHNvIGluY2x1ZGUgYQorCQkJCUZhaWxlZC1BVlAgd2hpY2ggTVVTVCBjb250YWluIHRoZSByZWNlaXZlZCBBdXRoLUFwcGxpY2F0aW9uLUlkIEFWUAorCQkJCWFuZCBBY2N0LUFwcGxpY2F0aW9uLUlkIEFWUC4KKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgCSogYXZwOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEJICBkYXRhID0geyAKKwkJCQkJMjYwLCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJI2lmIEFDX1ZFTkRPUl9TUEVDSUZJQ19BUFBMSUNBVElPTl9JRCAhPSAyNjAKKwkJCQkJI2Vycm9yICJBQ19WRU5ET1JfU1BFQ0lGSUNfQVBQTElDQVRJT05fSUQgZGVmaW5pdGlvbiBtaXNtYXRjaCIKKwkJCQkJI2VuZGlmCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJWZW5kb3ItU3BlY2lmaWMtQXBwbGljYXRpb24tSWQiLCAJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfR1JPVVBFRCAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCQkJCQkKKwkJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPSAKKwkJCQkJCXsKKyNpZm5kZWYgV09SS0FST1VORF9BQ0NFUFRfSU5WQUxJRF9WU0FJCisJCQkJCQkJLyogQUJORiBmcm9tIFJGQzY3MzMgKi8KKwkJCQkJCSAJIHsgICJWZW5kb3ItSWQiLCAJCQlSVUxFX1JFUVVJUkVELCAtMSwgMSB9CisjZWxzZSAvKiBXT1JLQVJPVU5EX0FDQ0VQVF9JTlZBTElEX1ZTQUkgKi8KKwkJCQkJCQkvKiBBQk5GIGZyb20gUkZDMzU4OCAoaW5jbHVkaW5nIGVycmF0dW0sIGJlY2F1c2Ugb3JpZ2luYWwgdGV4dCBpcyBub25zZW5zZSkgKi8KKwkJCQkJCSAJIHsgICJWZW5kb3ItSWQiLCAJCQlSVUxFX1JFUVVJUkVELCAtMSwgLTF9CisjZW5kaWYgLyogV09SS0FST1VORF9BQ0NFUFRfSU5WQUxJRF9WU0FJICovCisJCQkJCQkJLHsgICJBdXRoLUFwcGxpY2F0aW9uLUlkIiwJCVJVTEVfT1BUSU9OQUwsIC0xLCAxIH0KKwkJCQkJCQkseyAgIkFjY3QtQXBwbGljYXRpb24tSWQiLAkJUlVMRV9PUFRJT05BTCwgLTEsIDEgfQorCQkJCQkJfTsKKwkJCQorCQkJLyogQ3JlYXRlIHRoZSBncm91cGVkIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsICZhdnApOworCQkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgYXZwICk7CisJCQkKKwkJfQorCQkKKwkJLyogUmVkaXJlY3QtSG9zdCAqLworCQl7CisJCQkvKgorCQkJCU9uZSBvciBtb3JlIG9mIGluc3RhbmNlcyBvZiB0aGlzIEFWUCBNVVNUIGJlIHByZXNlbnQgaWYgdGhlIGFuc3dlcgorCQkJCW1lc3NhZ2UncyAnRScgYml0IGlzIHNldCBhbmQgdGhlIFJlc3VsdC1Db2RlIEFWUCBpcyBzZXQgdG8KKwkJCQlESUFNRVRFUl9SRURJUkVDVF9JTkRJQ0FUSU9OLgorCisJCQkJVXBvbiByZWNlaXZpbmcgdGhlIGFib3ZlLCB0aGUgcmVjZWl2aW5nIERpYW1ldGVyIG5vZGUgU0hPVUxEIGZvcndhcmQKKwkJCQl0aGUgcmVxdWVzdCBkaXJlY3RseSB0byBvbmUgb2YgdGhlIGhvc3RzIGlkZW50aWZpZWQgaW4gdGhlc2UgQVZQcy4KKwkJCQlUaGUgc2VydmVyIGNvbnRhaW5lZCBpbiB0aGUgc2VsZWN0ZWQgUmVkaXJlY3QtSG9zdCBBVlAgU0hPVUxEIGJlIHVzZWQKKwkJCQlmb3IgYWxsIG1lc3NhZ2VzIHBlcnRhaW5pbmcgdG8gdGhpcyBzZXNzaW9uLgorCQkJKi8KKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQkJCQkyOTIsIAkJCQkJLyogQ29kZSAqLworCQkJCQkjaWYgQUNfUkVESVJFQ1RfSE9TVCAhPSAyOTIKKwkJCQkJI2Vycm9yICJBQ19SRURJUkVDVF9IT1NUIGRlZmluaXRpb24gbWlzbWF0Y2giCisJCQkJCSNlbmRpZgorCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiUmVkaXJlY3QtSG9zdCIsIAkJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgRGlhbWV0ZXJVUklfdHlwZSwgTlVMTCk7CisJCX0KKwkJCisJCS8qIFJlZGlyZWN0LUhvc3QtVXNhZ2UgKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgUmVkaXJlY3QtSG9zdC1Vc2FnZSBBVlAgKEFWUCBDb2RlIDI2MSkgaXMgb2YgdHlwZSBFbnVtZXJhdGVkLgorCQkJCVRoaXMgQVZQIE1BWSBiZSBwcmVzZW50IGluIGFuc3dlciBtZXNzYWdlcyB3aG9zZSAnRScgYml0IGlzIHNldCBhbmQKKwkJCQl0aGUgUmVzdWx0LUNvZGUgQVZQIGlzIHNldCB0byBESUFNRVRFUl9SRURJUkVDVF9JTkRJQ0FUSU9OLgorCisJCQkJV2hlbiBwcmVzZW50LCB0aGlzIEFWUCBkaWN0YXRlcyBob3cgdGhlIHJvdXRpbmcgZW50cnkgcmVzdWx0aW5nIGZyb20KKwkJCQl0aGUgUmVkaXJlY3QtSG9zdCBpcyB0byBiZSB1c2VkLiAgVGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIHN1cHBvcnRlZDoKKworCisJCQkJRE9OVF9DQUNIRSAwCisKKwkJCQlUaGUgaG9zdCBzcGVjaWZpZWQgaW4gdGhlIFJlZGlyZWN0LUhvc3QgQVZQIHNob3VsZCBub3QgYmUgY2FjaGVkLgorCQkJCVRoaXMgaXMgdGhlIGRlZmF1bHQgdmFsdWUuCisKKworCQkJCUFMTF9TRVNTSU9OIDEKKworCQkJCUFsbCBtZXNzYWdlcyB3aXRoaW4gdGhlIHNhbWUgc2Vzc2lvbiwgYXMgZGVmaW5lZCBieSB0aGUgc2FtZSB2YWx1ZQorCQkJCW9mIHRoZSBTZXNzaW9uLUlEIEFWUCBNQVkgYmUgc2VudCB0byB0aGUgaG9zdCBzcGVjaWZpZWQgaW4gdGhlCisJCQkJUmVkaXJlY3QtSG9zdCBBVlAuCisKKworCQkJCUFMTF9SRUFMTSAyCisKKwkJCQlBbGwgbWVzc2FnZXMgZGVzdGluZWQgZm9yIHRoZSByZWFsbSByZXF1ZXN0ZWQgTUFZIGJlIHNlbnQgdG8gdGhlCisJCQkJaG9zdCBzcGVjaWZpZWQgaW4gdGhlIFJlZGlyZWN0LUhvc3QgQVZQLgorCisKKwkJCQlSRUFMTV9BTkRfQVBQTElDQVRJT04gMworCisJCQkJQWxsIG1lc3NhZ2VzIGZvciB0aGUgYXBwbGljYXRpb24gcmVxdWVzdGVkIHRvIHRoZSByZWFsbSBzcGVjaWZpZWQKKwkJCQlNQVkgYmUgc2VudCB0byB0aGUgaG9zdCBzcGVjaWZpZWQgaW4gdGhlIFJlZGlyZWN0LUhvc3QgQVZQLgorCisJCQkJQUxMX0FQUExJQ0FUSU9OIDQKKworCQkJCUFsbCBtZXNzYWdlcyBmb3IgdGhlIGFwcGxpY2F0aW9uIHJlcXVlc3RlZCBNQVkgYmUgc2VudCB0byB0aGUgaG9zdAorCQkJCXNwZWNpZmllZCBpbiB0aGUgUmVkaXJlY3QtSG9zdCBBVlAuCisKKworCQkJCUFMTF9IT1NUIDUKKworCQkJCUFsbCBtZXNzYWdlcyB0aGF0IHdvdWxkIGJlIHNlbnQgdG8gdGhlIGhvc3QgdGhhdCBnZW5lcmF0ZWQgdGhlCisJCQkJUmVkaXJlY3QtSG9zdCBNQVkgYmUgc2VudCB0byB0aGUgaG9zdCBzcGVjaWZpZWQgaW4gdGhlIFJlZGlyZWN0LQorCQkJCUhvc3QgQVZQLgorCisKKwkJCQlBTExfVVNFUiA2CisKKwkJCQlBbGwgbWVzc2FnZXMgZm9yIHRoZSB1c2VyIHJlcXVlc3RlZCBNQVkgYmUgc2VudCB0byB0aGUgaG9zdAorCQkJCXNwZWNpZmllZCBpbiB0aGUgUmVkaXJlY3QtSG9zdCBBVlAuCisKKworCQkJCVdoZW4gbXVsdGlwbGUgY2FjaGVkIHJvdXRlcyBhcmUgY3JlYXRlZCBieSByZWRpcmVjdCBpbmRpY2F0aW9ucyBhbmQKKwkJCQl0aGV5IGRpZmZlciBvbmx5IGluIHJlZGlyZWN0IHVzYWdlIGFuZCBwZWVycyB0byBmb3J3YXJkIHJlcXVlc3RzIHRvCisJCQkJKHNlZSBTZWN0aW9uIDYuMS44KSwgYSBwcmVjZWRlbmNlIHJ1bGUgTVVTVCBiZSBhcHBsaWVkIHRvIHRoZQorCQkJCXJlZGlyZWN0IHVzYWdlIHZhbHVlcyBvZiB0aGUgY2FjaGVkIHJvdXRlcyBkdXJpbmcgbm9ybWFsIHJvdXRpbmcgdG8KKwkJCQlyZXNvbHZlIGNvbnRlbnRpb25zIHRoYXQgbWF5IG9jY3VyLiAgVGhlIHByZWNlZGVuY2UgcnVsZSBpcyB0aGUgb3JkZXIKKwkJCQl0aGF0IGRpY3RhdGUgd2hpY2ggcmVkaXJlY3QgdXNhZ2Ugc2hvdWxkIGJlIGNvbnNpZGVyZWQgYmVmb3JlIGFueQorCQkJCW90aGVyIGFzIHRoZXkgYXBwZWFyLiAgVGhlIG9yZGVyIGlzIGFzIGZvbGxvd3M6CisKKworCQkJCTEuICBBTExfU0VTU0lPTgorCisJCQkJMi4gIEFMTF9VU0VSCisKKwkJCQkzLiAgUkVBTE1fQU5EX0FQUExJQ0FUSU9OCisKKwkJCQk0LiAgQUxMX1JFQUxNCisKKwkJCQk1LiAgQUxMX0FQUExJQ0FUSU9OCisKKwkJCQk2LiAgQUxMX0hPU1QKKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgCSogCXR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIAl0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLAkiRW51bWVyYXRlZChSZWRpcmVjdC1Ib3N0LVVzYWdlKSIJLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgCXRfMCA9IHsgIkRPTlRfQ0FDSEUiLCAJCQl7IC5pMzIgPSAwIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIAl0XzEgPSB7ICJBTExfU0VTU0lPTiIsIAkJCXsgLmkzMiA9IDEgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgCXRfMiA9IHsgIkFMTF9SRUFMTSIsIAkJCXsgLmkzMiA9IDIgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgCXRfMyA9IHsgIlJFQUxNX0FORF9BUFBMSUNBVElPTiIsIAl7IC5pMzIgPSAzIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIAl0XzQgPSB7ICJBTExfQVBQTElDQVRJT04iLCAJCXsgLmkzMiA9IDQgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgCXRfNSA9IHsgIkFMTF9IT1NUIiwgCQkJeyAuaTMyID0gNSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAJdF82ID0geyAiQUxMX1VTRVIiLCAJCQl7IC5pMzIgPSA2IH19OworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgCQlkYXRhID0geyAKKwkJCQkJMjYxLCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJI2lmIEFDX1JFRElSRUNUX0hPU1RfVVNBR0UgIT0gMjYxCisJCQkJCSNlcnJvciAiQUNfUkVESVJFQ1RfSE9TVF9VU0FHRSBkZWZpbml0aW9uIG1pc21hdGNoIgorCQkJCQkjZW5kaWYKKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIlJlZGlyZWN0LUhvc3QtVXNhZ2UiLCAJCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCQkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9JTlRFR0VSMzIgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEgLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8wICwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xICwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yICwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zICwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF80ICwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF81ICwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF82ICwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgdHlwZSwgTlVMTCk7CisJCX0KKwkJCisJCS8qIFJlZGlyZWN0LU1heC1DYWNoZS1UaW1lICovCisJCXsKKwkJCS8qCisJCQkJVGhlIFJlZGlyZWN0LU1heC1DYWNoZS1UaW1lIEFWUCAoQVZQIENvZGUgMjYyKSBpcyBvZiB0eXBlIFVuc2lnbmVkMzIuCisJCQkJVGhpcyBBVlAgTVVTVCBiZSBwcmVzZW50IGluIGFuc3dlciBtZXNzYWdlcyB3aG9zZSAnRScgYml0IGlzIHNldCwgdGhlCisJCQkJUmVzdWx0LUNvZGUgQVZQIGlzIHNldCB0byBESUFNRVRFUl9SRURJUkVDVF9JTkRJQ0FUSU9OIGFuZCB0aGUKKwkJCQlSZWRpcmVjdC1Ib3N0LVVzYWdlIEFWUCBzZXQgdG8gYSBub24temVybyB2YWx1ZS4KKworCQkJCVRoaXMgQVZQIGNvbnRhaW5zIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzZWNvbmRzIHRoZSBwZWVyIGFuZCByb3V0ZQorCQkJCXRhYmxlIGVudHJpZXMsIGNyZWF0ZWQgYXMgYSByZXN1bHQgb2YgdGhlIFJlZGlyZWN0LUhvc3QsIHdpbGwgYmUKKwkJCQljYWNoZWQuICBOb3RlIHRoYXQgb25jZSBhIGhvc3QgY3JlYXRlZCBkdWUgdG8gYSByZWRpcmVjdCBpbmRpY2F0aW9uCisJCQkJaXMgbm8gbG9uZ2VyIHJlYWNoYWJsZSwgYW55IGFzc29jaWF0ZWQgcGVlciBhbmQgcm91dGluZyB0YWJsZSBlbnRyaWVzCisJCQkJTVVTVCBiZSBkZWxldGVkLgorCQkJKi8KKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQkJCQkyNjIsIAkJCQkJLyogQ29kZSAqLworCQkJCQkjaWYgQUNfUkVESVJFQ1RfTUFYX0NBQ0hFX1RJTUUgIT0gMjYyCisJCQkJCSNlcnJvciAiQUNfUkVESVJFQ1RfTUFYX0NBQ0hFX1RJTUUgZGVmaW5pdGlvbiBtaXNtYXRjaCIKKwkJCQkJI2VuZGlmCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJSZWRpcmVjdC1NYXgtQ2FjaGUtVGltZSIsIAkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfVU5TSUdORUQzMiAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsIE5VTEwpOworCQl9CisJCQorCQkvKiBSZXN1bHQtQ29kZSAqLworCQl7CisJCQkvKgorCQkJCVRoZSBSZXN1bHQtQ29kZSBBVlAgKEFWUCBDb2RlIDI2OCkgaXMgb2YgdHlwZSBVbnNpZ25lZDMyIGFuZAorCQkJCWluZGljYXRlcyB3aGV0aGVyIGEgcGFydGljdWxhciByZXF1ZXN0IHdhcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IG9yCisJCQkJd2hldGhlciBhbiBlcnJvciBvY2N1cnJlZC4gIEFsbCBEaWFtZXRlciBhbnN3ZXIgbWVzc2FnZXMgZGVmaW5lZCBpbgorCQkJCUlFVEYgYXBwbGljYXRpb25zIE1VU1QgaW5jbHVkZSBvbmUgUmVzdWx0LUNvZGUgQVZQLiAgQSBub24tc3VjY2Vzc2Z1bAorCQkJCVJlc3VsdC1Db2RlIEFWUCAob25lIGNvbnRhaW5pbmcgYSBub24gMnh4eCB2YWx1ZSBvdGhlciB0aGFuCisJCQkJRElBTUVURVJfUkVESVJFQ1RfSU5ESUNBVElPTikgTVVTVCBpbmNsdWRlIHRoZSBFcnJvci1SZXBvcnRpbmctSG9zdAorCQkJCUFWUCBpZiB0aGUgaG9zdCBzZXR0aW5nIHRoZSBSZXN1bHQtQ29kZSBBVlAgaXMgZGlmZmVyZW50IGZyb20gdGhlCisJCQkJaWRlbnRpdHkgZW5jb2RlZCBpbiB0aGUgT3JpZ2luLUhvc3QgQVZQLgorCisJCQkJVGhlIFJlc3VsdC1Db2RlIGRhdGEgZmllbGQgY29udGFpbnMgYW4gSUFOQS1tYW5hZ2VkIDMyLWJpdCBhZGRyZXNzCisJCQkJc3BhY2UgcmVwcmVzZW50aW5nIGVycm9ycyAoc2VlIFNlY3Rpb24gMTEuNCkuICBEaWFtZXRlciBwcm92aWRlcyB0aGUKKwkJCQlmb2xsb3dpbmcgY2xhc3NlcyBvZiBlcnJvcnMsIGFsbCBpZGVudGlmaWVkIGJ5IHRoZSB0aG91c2FuZHMgZGlnaXQgaW4KKwkJCQl0aGUgZGVjaW1hbCBub3RhdGlvbjoKKworCQkJCW8gIDF4eHggKEluZm9ybWF0aW9uYWwpCisKKwkJCQlvICAyeHh4IChTdWNjZXNzKQorCisJCQkJbyAgM3h4eCAoUHJvdG9jb2wgRXJyb3JzKQorCisJCQkJbyAgNHh4eCAoVHJhbnNpZW50IEZhaWx1cmVzKQorCisJCQkJbyAgNXh4eCAoUGVybWFuZW50IEZhaWx1cmUpCisKKwkJCQlBIG5vbi1yZWNvZ25pemVkIGNsYXNzIChvbmUgd2hvc2UgZmlyc3QgZGlnaXQgaXMgbm90IGRlZmluZWQgaW4gdGhpcworCQkJCXNlY3Rpb24pIE1VU1QgYmUgaGFuZGxlZCBhcyBhIHBlcm1hbmVudCBmYWlsdXJlLgorCQkJKi8KKwkJCQorCQkJLyogQWx0aG91Z2ggdGhlIFJGQyBkb2VzIG5vdCBzcGVjaWZ5IGFuICJFbnVtZXJhdGVkIiB0eXBlIGhlcmUsIHdlIGdvIGZvcndhcmQgYW5kIGNyZWF0ZSBvbmUuCisJCQkgKiBUaGlzIGlzIHRoZSByZWFzb24gZm9yIHRoZSAiKiIgaW4gdGhlIHR5cGUgbmFtZQorCQkJICovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiAJdHlwZTsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAJdGRhdGEgPSB7IEFWUF9UWVBFX1VOU0lHTkVEMzIsCSJFbnVtZXJhdGVkKFJlc3VsdC1Db2RlKSIJLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSAJZGF0YSA9IHsgCisJCQkJCTI2OCwgCQkJCQkvKiBDb2RlICovCisJCQkJCSNpZiBBQ19SRVNVTFRfQ09ERSAhPSAyNjgKKwkJCQkJI2Vycm9yICJBQ19SRVNVTFRfQ09ERSBkZWZpbml0aW9uIG1pc21hdGNoIgorCQkJCQkjZW5kaWYKKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIlJlc3VsdC1Db2RlIiwgCQkJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEgLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgdHlwZSwgTlVMTCk7CisJCQkKKwkJCS8qIEluZm9ybWF0aW9uYWwgKi8KKwkJCXsKKwkJCQkvKiAxMDAxICovCisJCQkJeworCQkJCQkvKgorCQkJCQkJVGhpcyBpbmZvcm1hdGlvbmFsIGVycm9yIGlzIHJldHVybmVkIGJ5IGEgRGlhbWV0ZXIgc2VydmVyIHRvCisJCQkJCQlpbmZvcm0gdGhlIGFjY2VzcyBkZXZpY2UgdGhhdCB0aGUgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtIGJlaW5nCisJCQkJCQl1c2VkIHJlcXVpcmVzIG11bHRpcGxlIHJvdW5kIHRyaXBzLCBhbmQgYSBzdWJzZXF1ZW50IHJlcXVlc3QgbmVlZHMKKwkJCQkJCXRvIGJlIGlzc3VlZCBpbiBvcmRlciBmb3IgYWNjZXNzIHRvIGJlIGdyYW50ZWQuCisJCQkJCSovCisJCQkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAJZXJyb3JfY29kZSA9IHsgIkRJQU1FVEVSX01VTFRJX1JPVU5EX0FVVEgiLCAJeyAudTMyID0gRVJfRElBTUVURVJfTVVMVElfUk9VTkRfQVVUSCB9fTsKKwkJCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJmVycm9yX2NvZGUgLCB0eXBlLCBOVUxMKTsKKwkJCQl9CisJCQl9CisJCQkvKiBTdWNjZXNzICovCisJCQl7CisJCQkJLyogMjAwMSAqLworCQkJCXsKKwkJCQkJLyoKKwkJCQkJCVRoZSBSZXF1ZXN0IHdhcyBzdWNjZXNzZnVsbHkgY29tcGxldGVkLgorCQkJCQkqLworCQkJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgCWVycm9yX2NvZGUgPSB7ICJESUFNRVRFUl9TVUNDRVNTIiwgCQl7IC51MzIgPSBFUl9ESUFNRVRFUl9TVUNDRVNTIH19OworCQkJCQkjaWYgRVJfRElBTUVURVJfU1VDQ0VTUyAhPSAyMDAxCisJCQkJCSNlcnJvciAiRVJfRElBTUVURVJfU1VDQ0VTUyBkZWZpbml0aW9uIG1pc21hdGNoIgorCQkJCQkjZW5kaWYKKwkJCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJmVycm9yX2NvZGUgLCB0eXBlLCBOVUxMKTsKKwkJCQl9CisJCQkJLyogMjAwMiAqLworCQkJCXsKKwkJCQkJLyoKKwkJCQkJCVdoZW4gcmV0dXJuZWQsIHRoZSByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsbHkgY29tcGxldGVkLCBidXQKKwkJCQkJCWFkZGl0aW9uYWwgcHJvY2Vzc2luZyBpcyByZXF1aXJlZCBieSB0aGUgYXBwbGljYXRpb24gaW4gb3JkZXIgdG8KKwkJCQkJCXByb3ZpZGUgc2VydmljZSB0byB0aGUgdXNlci4KKwkJCQkJKi8KKwkJCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIAllcnJvcl9jb2RlID0geyAiRElBTUVURVJfTElNSVRFRF9TVUNDRVNTIiwgCXsgLnUzMiA9IEVSX0RJQU1FVEVSX0xJTUlURURfU1VDQ0VTUyB9fTsKKwkJCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJmVycm9yX2NvZGUgLCB0eXBlLCBOVUxMKTsKKwkJCQl9CisJCQl9CisJCQkvKiBQcm90b2NvbCBFcnJvcnMgKi8KKwkJCXsKKwkJCQkvKiAzMDAxIC0tIG1pZ2h0IGJlIGNoYW5nZWQgdG8gNXh4eCBzb29uICovCisJCQkJeworCQkJCQkvKgorCQkJCQkJVGhlIFJlcXVlc3QgY29udGFpbmVkIGEgQ29tbWFuZC1Db2RlIHRoYXQgdGhlIHJlY2VpdmVyIGRpZCBub3QKKwkJCQkJCXJlY29nbml6ZSBvciBzdXBwb3J0LiAgVGhpcyBNVVNUIGJlIHVzZWQgd2hlbiBhIERpYW1ldGVyIG5vZGUKKwkJCQkJCXJlY2VpdmVzIGFuIGV4cGVyaW1lbnRhbCBjb21tYW5kIHRoYXQgaXQgZG9lcyBub3QgdW5kZXJzdGFuZC4KKwkJCQkJKi8KKwkJCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIAllcnJvcl9jb2RlID0geyAiRElBTUVURVJfQ09NTUFORF9VTlNVUFBPUlRFRCIsIAl7IC51MzIgPSBFUl9ESUFNRVRFUl9DT01NQU5EX1VOU1VQUE9SVEVEIH19OworCQkJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmZXJyb3JfY29kZSAsIHR5cGUsIE5VTEwpOworCQkJCX0KKwkJCQkvKiAzMDAyICovCisJCQkJeworCQkJCQkvKgorCQkJCQkJVGhpcyBlcnJvciBpcyBnaXZlbiB3aGVuIERpYW1ldGVyIGNhbiBub3QgZGVsaXZlciB0aGUgbWVzc2FnZSB0bworCQkJCQkJdGhlIGRlc3RpbmF0aW9uLCBlaXRoZXIgYmVjYXVzZSBubyBob3N0IHdpdGhpbiB0aGUgcmVhbG0KKwkJCQkJCXN1cHBvcnRpbmcgdGhlIHJlcXVpcmVkIGFwcGxpY2F0aW9uIHdhcyBhdmFpbGFibGUgdG8gcHJvY2VzcyB0aGUKKwkJCQkJCXJlcXVlc3QsIG9yIGJlY2F1c2UgRGVzdGluYXRpb24tSG9zdCBBVlAgd2FzIGdpdmVuIHdpdGhvdXQgdGhlCisJCQkJCQlhc3NvY2lhdGVkIERlc3RpbmF0aW9uLVJlYWxtIEFWUC4KKwkJCQkJKi8KKwkJCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIAllcnJvcl9jb2RlID0geyAiRElBTUVURVJfVU5BQkxFX1RPX0RFTElWRVIiLCAJeyAudTMyID0gRVJfRElBTUVURVJfVU5BQkxFX1RPX0RFTElWRVIgfX07CisJCQkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZlcnJvcl9jb2RlICwgdHlwZSwgTlVMTCk7CisJCQkJfQorCQkJCS8qIDMwMDMgKi8KKwkJCQl7CisJCQkJCS8qCisJCQkJCQlUaGUgaW50ZW5kZWQgcmVhbG0gb2YgdGhlIHJlcXVlc3QgaXMgbm90IHJlY29nbml6ZWQuCisJCQkJCSovCisJCQkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAJZXJyb3JfY29kZSA9IHsgIkRJQU1FVEVSX1JFQUxNX05PVF9TRVJWRUQiLCAJeyAudTMyID0gRVJfRElBTUVURVJfUkVBTE1fTk9UX1NFUlZFRCB9fTsKKwkJCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJmVycm9yX2NvZGUgLCB0eXBlLCBOVUxMKTsKKwkJCQl9CisJCQkJLyogMzAwNCAqLworCQkJCXsKKwkJCQkJLyoKKwkJCQkJCVdoZW4gcmV0dXJuZWQsIGEgRGlhbWV0ZXIgbm9kZSBTSE9VTEQgYXR0ZW1wdCB0byBzZW5kIHRoZSBtZXNzYWdlCisJCQkJCQl0byBhbiBhbHRlcm5hdGUgcGVlci4gIFRoaXMgZXJyb3IgTVVTVCBvbmx5IGJlIHVzZWQgd2hlbiBhCisJCQkJCQlzcGVjaWZpYyBzZXJ2ZXIgaXMgcmVxdWVzdGVkLCBhbmQgaXQgY2Fubm90IHByb3ZpZGUgdGhlIHJlcXVlc3RlZAorCQkJCQkJc2VydmljZS4KKwkJCQkJKi8KKwkJCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIAllcnJvcl9jb2RlID0geyAiRElBTUVURVJfVE9PX0JVU1kiLCAJCXsgLnUzMiA9IEVSX0RJQU1FVEVSX1RPT19CVVNZIH19OworCQkJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmZXJyb3JfY29kZSAsIHR5cGUsIE5VTEwpOworCQkJCX0KKwkJCQkvKiAzMDA1ICovCisJCQkJeworCQkJCQkvKgorCQkJCQkJQW4gYWdlbnQgZGV0ZWN0ZWQgYSBsb29wIHdoaWxlIHRyeWluZyB0byBnZXQgdGhlIG1lc3NhZ2UgdG8gdGhlCisJCQkJCQlpbnRlbmRlZCByZWNpcGllbnQuICBUaGUgbWVzc2FnZSBNQVkgYmUgc2VudCB0byBhbiBhbHRlcm5hdGUgcGVlciwKKwkJCQkJCWlmIG9uZSBpcyBhdmFpbGFibGUsIGJ1dCB0aGUgcGVlciByZXBvcnRpbmcgdGhlIGVycm9yIGhhcworCQkJCQkJaWRlbnRpZmllZCBhIGNvbmZpZ3VyYXRpb24gcHJvYmxlbS4KKwkJCQkJKi8KKwkJCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIAllcnJvcl9jb2RlID0geyAiRElBTUVURVJfTE9PUF9ERVRFQ1RFRCIsIAl7IC51MzIgPSBFUl9ESUFNRVRFUl9MT09QX0RFVEVDVEVEIH19OworCQkJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmZXJyb3JfY29kZSAsIHR5cGUsIE5VTEwpOworCQkJCX0KKwkJCQkvKiAzMDA2ICovCisJCQkJeworCQkJCQkvKgorCQkJCQkJQSByZWRpcmVjdCBhZ2VudCBoYXMgZGV0ZXJtaW5lZCB0aGF0IHRoZSByZXF1ZXN0IGNvdWxkIG5vdCBiZQorCQkJCQkJc2F0aXNmaWVkIGxvY2FsbHkgYW5kIHRoZSBpbml0aWF0b3Igb2YgdGhlIHJlcXVlc3Qgc2hvdWxkIGRpcmVjdAorCQkJCQkJdGhlIHJlcXVlc3QgZGlyZWN0bHkgdG8gdGhlIHNlcnZlciwgd2hvc2UgY29udGFjdCBpbmZvcm1hdGlvbiBoYXMKKwkJCQkJCWJlZW4gYWRkZWQgdG8gdGhlIHJlc3BvbnNlLiAgV2hlbiBzZXQsIHRoZSBSZWRpcmVjdC1Ib3N0IEFWUCBNVVNUCisJCQkJCQliZSBwcmVzZW50LgorCQkJCQkqLworCQkJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgCWVycm9yX2NvZGUgPSB7ICJESUFNRVRFUl9SRURJUkVDVF9JTkRJQ0FUSU9OIiwgCXsgLnUzMiA9IEVSX0RJQU1FVEVSX1JFRElSRUNUX0lORElDQVRJT04gfX07CisJCQkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZlcnJvcl9jb2RlICwgdHlwZSwgTlVMTCk7CisJCQkJfQorCQkJCS8qIDMwMDcgKi8KKwkJCQl7CisJCQkJCS8qCisJCQkJCQlBIHJlcXVlc3Qgd2FzIHNlbnQgZm9yIGFuIGFwcGxpY2F0aW9uIHRoYXQgaXMgbm90IHN1cHBvcnRlZC4KKwkJCQkJKi8KKwkJCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIAllcnJvcl9jb2RlID0geyAiRElBTUVURVJfQVBQTElDQVRJT05fVU5TVVBQT1JURUQiLAl7IC51MzIgPSBFUl9ESUFNRVRFUl9BUFBMSUNBVElPTl9VTlNVUFBPUlRFRCB9fTsKKwkJCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJmVycm9yX2NvZGUgLCB0eXBlLCBOVUxMKTsKKwkJCQl9CisJCQkJLyogMzAwOCAtLSB3aWxsIGNoYW5nZSB0byA1eHh4IHNvb24gKi8KKwkJCQl7CisJCQkJCS8qCisJCQkJCQlBIHJlcXVlc3Qgd2FzIHJlY2VpdmVkIHdob3NlIGJpdHMgaW4gdGhlIERpYW1ldGVyIGhlYWRlciB3ZXJlCisJCQkJCQllaXRoZXIgc2V0IHRvIGFuIGludmFsaWQgY29tYmluYXRpb24sIG9yIHRvIGEgdmFsdWUgdGhhdCBpcworCQkJCQkJaW5jb25zaXN0ZW50IHdpdGggdGhlIGNvbW1hbmQgY29kZSdzIGRlZmluaXRpb24uCisJCQkJCSovCisJCQkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAJZXJyb3JfY29kZSA9IHsgIkRJQU1FVEVSX0lOVkFMSURfSERSX0JJVFMiLCAJeyAudTMyID0gRVJfRElBTUVURVJfSU5WQUxJRF9IRFJfQklUUyB9fTsKKwkJCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJmVycm9yX2NvZGUgLCB0eXBlLCBOVUxMKTsKKwkJCQl9CisJCQkJLyogMzAwOSAtLSB3aWxsIGNoYW5nZSB0byA1eHh4IHNvb24gKi8KKwkJCQl7CisJCQkJCS8qCisJCQkJCQlBIHJlcXVlc3Qgd2FzIHJlY2VpdmVkIHRoYXQgaW5jbHVkZWQgYW4gQVZQIHdob3NlIGZsYWcgYml0cyBhcmUKKwkJCQkJCXNldCB0byBhbiB1bnJlY29nbml6ZWQgdmFsdWUsIG9yIHRoYXQgaXMgaW5jb25zaXN0ZW50IHdpdGggdGhlCisJCQkJCQlBVlAncyBkZWZpbml0aW9uLgorCQkJCQkqLworCQkJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgCWVycm9yX2NvZGUgPSB7ICJESUFNRVRFUl9JTlZBTElEX0FWUF9CSVRTIiwgCXsgLnUzMiA9IEVSX0RJQU1FVEVSX0lOVkFMSURfQVZQX0JJVFMgfX07CisJCQkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZlcnJvcl9jb2RlICwgdHlwZSwgTlVMTCk7CisJCQkJfQorCQkJCS8qIDMwMTAgIC0tIHdpbGwgY2hhbmdlIHRvIDV4eHggc29vbiAqLworCQkJCXsKKwkJCQkJLyoKKwkJCQkJCSBBIENFUiB3YXMgcmVjZWl2ZWQgZnJvbSBhbiB1bmtub3duIHBlZXIuCisJCQkJCSovCisJCQkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAJZXJyb3JfY29kZSA9IHsgIkRJQU1FVEVSX1VOS05PV05fUEVFUiIsIAl7IC51MzIgPSBFUl9ESUFNRVRFUl9VTktOT1dOX1BFRVIgfX07CisJCQkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZlcnJvcl9jb2RlICwgdHlwZSwgTlVMTCk7CisJCQkJfQorCQkJfQorCQkJLyogVHJhbnNpZW50IEZhaWx1cmVzICovCisJCQl7CisJCQkJLyogNDAwMSAqLworCQkJCXsKKwkJCQkJLyoKKwkJCQkJCVRoZSBhdXRoZW50aWNhdGlvbiBwcm9jZXNzIGZvciB0aGUgdXNlciBmYWlsZWQsIG1vc3QgbGlrZWx5IGR1ZSB0bworCQkJCQkJYW4gaW52YWxpZCBwYXNzd29yZCB1c2VkIGJ5IHRoZSB1c2VyLiAgRnVydGhlciBhdHRlbXB0cyBNVVNUIG9ubHkKKwkJCQkJCWJlIHRyaWVkIGFmdGVyIHByb21wdGluZyB0aGUgdXNlciBmb3IgYSBuZXcgcGFzc3dvcmQuCisJCQkJCSovCisJCQkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAJZXJyb3JfY29kZSA9IHsgIkRJQU1FVEVSX0FVVEhFTlRJQ0FUSU9OX1JFSkVDVEVEIiwgCXsgLnUzMiA9IEVSX0RJQU1FVEVSX0FVVEhFTlRJQ0FUSU9OX1JFSkVDVEVEIH19OworCQkJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmZXJyb3JfY29kZSAsIHR5cGUsIE5VTEwpOworCQkJCX0KKwkJCQkvKiA0MDAyICovCisJCQkJeworCQkJCQkvKgorCQkJCQkJQSBEaWFtZXRlciBub2RlIHJlY2VpdmVkIHRoZSBhY2NvdW50aW5nIHJlcXVlc3QgYnV0IHdhcyB1bmFibGUgdG8KKwkJCQkJCWNvbW1pdCBpdCB0byBzdGFibGUgc3RvcmFnZSBkdWUgdG8gYSB0ZW1wb3JhcnkgbGFjayBvZiBzcGFjZS4KKwkJCQkJKi8KKwkJCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIAllcnJvcl9jb2RlID0geyAiRElBTUVURVJfT1VUX09GX1NQQUNFIiwgCQl7IC51MzIgPSBFUl9ESUFNRVRFUl9PVVRfT0ZfU1BBQ0UgfX07CisJCQkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZlcnJvcl9jb2RlICwgdHlwZSwgTlVMTCk7CisJCQkJfQorCQkJCS8qIDQwMDMgKi8KKwkJCQl7CisJCQkJCS8qCisJCQkJCQlUaGUgcGVlciBoYXMgZGV0ZXJtaW5lZCB0aGF0IGl0IGhhcyBsb3N0IHRoZSBlbGVjdGlvbiBwcm9jZXNzIGFuZAorCQkJCQkJaGFzIHRoZXJlZm9yZSBkaXNjb25uZWN0ZWQgdGhlIHRyYW5zcG9ydCBjb25uZWN0aW9uLgorCQkJCQkqLworCQkJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgCWVycm9yX2NvZGUgPSB7ICJFTEVDVElPTl9MT1NUIiwgCQkJeyAudTMyID0gRVJfRUxFQ1RJT05fTE9TVCB9fTsKKwkJCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJmVycm9yX2NvZGUgLCB0eXBlLCBOVUxMKTsKKwkJCQl9CisJCQl9CisJCQkvKiBQZXJtYW5lbnQgRmFpbHVyZXMgKi8KKwkJCXsKKwkJCQkvKiA1MDAxICovCisJCQkJeworCQkJCQkvKgorCQkJCQkJVGhlIHBlZXIgcmVjZWl2ZWQgYSBtZXNzYWdlIHRoYXQgY29udGFpbmVkIGFuIEFWUCB0aGF0IGlzIG5vdAorCQkJCQkJcmVjb2duaXplZCBvciBzdXBwb3J0ZWQgYW5kIHdhcyBtYXJrZWQgd2l0aCB0aGUgTWFuZGF0b3J5IGJpdC4gIEEKKwkJCQkJCURpYW1ldGVyIG1lc3NhZ2Ugd2l0aCB0aGlzIGVycm9yIE1VU1QgY29udGFpbiBvbmUgb3IgbW9yZSBGYWlsZWQtCisJCQkJCQlBVlAgQVZQIGNvbnRhaW5pbmcgdGhlIEFWUHMgdGhhdCBjYXVzZWQgdGhlIGZhaWx1cmUuCisJCQkJCSovCisJCQkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAJZXJyb3JfY29kZSA9IHsgIkRJQU1FVEVSX0FWUF9VTlNVUFBPUlRFRCIsIAl7IC51MzIgPSBFUl9ESUFNRVRFUl9BVlBfVU5TVVBQT1JURUQgfX07CisJCQkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZlcnJvcl9jb2RlICwgdHlwZSwgTlVMTCk7CisJCQkJfQorCQkJCS8qIDUwMDIgKi8KKwkJCQl7CisJCQkJCS8qCisJCQkJCQlUaGUgcmVxdWVzdCBjb250YWluZWQgYW4gdW5rbm93biBTZXNzaW9uLUlkLgorCQkJCQkqLworCQkJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgCWVycm9yX2NvZGUgPSB7ICJESUFNRVRFUl9VTktOT1dOX1NFU1NJT05fSUQiLCAJeyAudTMyID0gRVJfRElBTUVURVJfVU5LTk9XTl9TRVNTSU9OX0lEIH19OworCQkJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmZXJyb3JfY29kZSAsIHR5cGUsIE5VTEwpOworCQkJCX0KKwkJCQkvKiA1MDAzICovCisJCQkJeworCQkJCQkvKgorCQkJCQkJQSByZXF1ZXN0IHdhcyByZWNlaXZlZCBmb3Igd2hpY2ggdGhlIHVzZXIgY291bGQgbm90IGJlIGF1dGhvcml6ZWQuCisJCQkJCQlUaGlzIGVycm9yIGNvdWxkIG9jY3VyIGlmIHRoZSBzZXJ2aWNlIHJlcXVlc3RlZCBpcyBub3QgcGVybWl0dGVkCisJCQkJCQl0byB0aGUgdXNlci4KKwkJCQkJKi8KKwkJCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIAllcnJvcl9jb2RlID0geyAiRElBTUVURVJfQVVUSE9SSVpBVElPTl9SRUpFQ1RFRCIseyAudTMyID0gRVJfRElBTUVURVJfQVVUSE9SSVpBVElPTl9SRUpFQ1RFRCB9fTsKKwkJCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJmVycm9yX2NvZGUgLCB0eXBlLCBOVUxMKTsKKwkJCQl9CisJCQkJLyogNTAwNCAqLworCQkJCXsKKwkJCQkJLyoKKwkJCQkJCVRoZSByZXF1ZXN0IGNvbnRhaW5lZCBhbiBBVlAgd2l0aCBhbiBpbnZhbGlkIHZhbHVlIGluIGl0cyBkYXRhCisJCQkJCQlwb3J0aW9uLiAgQSBEaWFtZXRlciBtZXNzYWdlIGluZGljYXRpbmcgdGhpcyBlcnJvciBNVVNUIGluY2x1ZGUKKwkJCQkJCXRoZSBvZmZlbmRpbmcgQVZQcyB3aXRoaW4gYSBGYWlsZWQtQVZQIEFWUC4KKwkJCQkJKi8KKwkJCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIAllcnJvcl9jb2RlID0geyAiRElBTUVURVJfSU5WQUxJRF9BVlBfVkFMVUUiLAl7IC51MzIgPSBFUl9ESUFNRVRFUl9JTlZBTElEX0FWUF9WQUxVRSB9fTsKKwkJCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJmVycm9yX2NvZGUgLCB0eXBlLCBOVUxMKTsKKwkJCQl9CisJCQkJLyogNTAwNSAqLworCQkJCXsKKwkJCQkJLyoKKwkJCQkJCVRoZSByZXF1ZXN0IGRpZCBub3QgY29udGFpbiBhbiBBVlAgdGhhdCBpcyByZXF1aXJlZCBieSB0aGUgQ29tbWFuZAorCQkJCQkJQ29kZSBkZWZpbml0aW9uLiAgSWYgdGhpcyB2YWx1ZSBpcyBzZW50IGluIHRoZSBSZXN1bHQtQ29kZSBBVlAsIGEKKwkJCQkJCUZhaWxlZC1BVlAgQVZQIFNIT1VMRCBiZSBpbmNsdWRlZCBpbiB0aGUgbWVzc2FnZS4gIFRoZSBGYWlsZWQtQVZQCisJCQkJCQlBVlAgTVVTVCBjb250YWluIGFuIGV4YW1wbGUgb2YgdGhlIG1pc3NpbmcgQVZQIGNvbXBsZXRlIHdpdGggdGhlCisJCQkJCQlWZW5kb3ItSWQgaWYgYXBwbGljYWJsZS4gIFRoZSB2YWx1ZSBmaWVsZCBvZiB0aGUgbWlzc2luZyBBVlAKKwkJCQkJCXNob3VsZCBiZSBvZiBjb3JyZWN0IG1pbmltdW0gbGVuZ3RoIGFuZCBjb250YWluIHplcm9lcy4KKwkJCQkJKi8KKwkJCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIAllcnJvcl9jb2RlID0geyAiRElBTUVURVJfTUlTU0lOR19BVlAiLAkJeyAudTMyID0gRVJfRElBTUVURVJfTUlTU0lOR19BVlAgfX07CisJCQkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZlcnJvcl9jb2RlICwgdHlwZSwgTlVMTCk7CisJCQkJfQorCQkJCS8qIDUwMDYgKi8KKwkJCQl7CisJCQkJCS8qCisJCQkJCQlBIHJlcXVlc3Qgd2FzIHJlY2VpdmVkIHRoYXQgY2Fubm90IGJlIGF1dGhvcml6ZWQgYmVjYXVzZSB0aGUgdXNlcgorCQkJCQkJaGFzIGFscmVhZHkgZXhwZW5kZWQgYWxsb3dlZCByZXNvdXJjZXMuICBBbiBleGFtcGxlIG9mIHRoaXMgZXJyb3IKKwkJCQkJCWNvbmRpdGlvbiBpcyBhIHVzZXIgdGhhdCBpcyByZXN0cmljdGVkIHRvIG9uZSBkaWFsLXVwIFBQUCBwb3J0LAorCQkJCQkJYXR0ZW1wdHMgdG8gZXN0YWJsaXNoIGEgc2Vjb25kIFBQUCBjb25uZWN0aW9uLgorCQkJCQkqLworCQkJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgCWVycm9yX2NvZGUgPSB7ICJESUFNRVRFUl9SRVNPVVJDRVNfRVhDRUVERUQiLAl7IC51MzIgPSBFUl9ESUFNRVRFUl9SRVNPVVJDRVNfRVhDRUVERUQgfX07CisJCQkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZlcnJvcl9jb2RlICwgdHlwZSwgTlVMTCk7CisJCQkJfQorCQkJCS8qIDUwMDcgKi8KKwkJCQl7CisJCQkJCS8qCisJCQkJCQlUaGUgSG9tZSBEaWFtZXRlciBzZXJ2ZXIgaGFzIGRldGVjdGVkIEFWUHMgaW4gdGhlIHJlcXVlc3QgdGhhdAorCQkJCQkJY29udHJhZGljdGVkIGVhY2ggb3RoZXIsIGFuZCBpcyBub3Qgd2lsbGluZyB0byBwcm92aWRlIHNlcnZpY2UgdG8KKwkJCQkJCXRoZSB1c2VyLiAgVGhlIEZhaWxlZC1BVlAgQVZQcyBNVVNUIGJlIHByZXNlbnQgd2hpY2ggY29udGFpbnMgdGhlCisJCQkJCQlBVlBzIHRoYXQgY29udHJhZGljdGVkIGVhY2ggb3RoZXIuCisJCQkJCSovCisJCQkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAJZXJyb3JfY29kZSA9IHsgIkRJQU1FVEVSX0NPTlRSQURJQ1RJTkdfQVZQUyIsCXsgLnUzMiA9IEVSX0RJQU1FVEVSX0NPTlRSQURJQ1RJTkdfQVZQUyB9fTsKKwkJCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJmVycm9yX2NvZGUgLCB0eXBlLCBOVUxMKTsKKwkJCQl9CisJCQkJLyogNTAwOCAqLworCQkJCXsKKwkJCQkJLyoKKwkJCQkJCUEgbWVzc2FnZSB3YXMgcmVjZWl2ZWQgd2l0aCBhbiBBVlAgdGhhdCBNVVNUIE5PVCBiZSBwcmVzZW50LiAgVGhlCisJCQkJCQlGYWlsZWQtQVZQIEFWUCBNVVNUIGJlIGluY2x1ZGVkIGFuZCBjb250YWluIGEgY29weSBvZiB0aGUKKwkJCQkJCW9mZmVuZGluZyBBVlAuCisJCQkJCSovCisJCQkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAJZXJyb3JfY29kZSA9IHsgIkRJQU1FVEVSX0FWUF9OT1RfQUxMT1dFRCIsCXsgLnUzMiA9IEVSX0RJQU1FVEVSX0FWUF9OT1RfQUxMT1dFRCB9fTsKKwkJCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJmVycm9yX2NvZGUgLCB0eXBlLCBOVUxMKTsKKwkJCQl9CisJCQkJLyogNTAwOSAqLworCQkJCXsKKwkJCQkJLyoKKwkJCQkJCUEgbWVzc2FnZSB3YXMgcmVjZWl2ZWQgdGhhdCBpbmNsdWRlZCBhbiBBVlAgdGhhdCBhcHBlYXJlZCBtb3JlCisJCQkJCQlvZnRlbiB0aGFuIHBlcm1pdHRlZCBpbiB0aGUgbWVzc2FnZSBkZWZpbml0aW9uLiAgVGhlIEZhaWxlZC1BVlAKKwkJCQkJCUFWUCBNVVNUIGJlIGluY2x1ZGVkIGFuZCBjb250YWluIGEgY29weSBvZiB0aGUgZmlyc3QgaW5zdGFuY2Ugb2YKKwkJCQkJCXRoZSBvZmZlbmRpbmcgQVZQIHRoYXQgZXhjZWVkZWQgdGhlIG1heGltdW0gbnVtYmVyIG9mIG9jY3VycmVuY2VzCisJCQkJCSovCisJCQkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAJZXJyb3JfY29kZSA9IHsgIkRJQU1FVEVSX0FWUF9PQ0NVUlNfVE9PX01BTllfVElNRVMiLHsgLnUzMiA9IEVSX0RJQU1FVEVSX0FWUF9PQ0NVUlNfVE9PX01BTllfVElNRVMgfX07CisJCQkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZlcnJvcl9jb2RlICwgdHlwZSwgTlVMTCk7CisJCQkJfQorCQkJCS8qIDUwMTAgKi8KKwkJCQl7CisJCQkJCS8qCisJCQkJCQlUaGlzIGVycm9yIGlzIHJldHVybmVkIGJ5IGEgRGlhbWV0ZXIgbm9kZSB0aGF0IGlzIG5vdCBhY3RpbmcgYXMgYQorCQkJCQkJcmVsYXkgd2hlbiBpdCByZWNlaXZlcyBhIENFUiB3aGljaCBhZHZlcnRpc2VzIGEgc2V0IG9mCisJCQkJCQlhcHBsaWNhdGlvbnMgdGhhdCBpdCBkb2VzIG5vdCBzdXBwb3J0LgorCQkJCQkqLworCQkJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgCWVycm9yX2NvZGUgPSB7ICJESUFNRVRFUl9OT19DT01NT05fQVBQTElDQVRJT04iLHsgLnUzMiA9IEVSX0RJQU1FVEVSX05PX0NPTU1PTl9BUFBMSUNBVElPTiB9fTsKKwkJCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJmVycm9yX2NvZGUgLCB0eXBlLCBOVUxMKTsKKwkJCQl9CisJCQkJLyogNTAxMSAqLworCQkJCXsKKwkJCQkJLyoKKwkJCQkJCVRoaXMgZXJyb3IgaXMgcmV0dXJuZWQgd2hlbiBhIHJlcXVlc3Qgd2FzIHJlY2VpdmVkLCB3aG9zZSB2ZXJzaW9uCisJCQkJCQludW1iZXIgaXMgdW5zdXBwb3J0ZWQuCisJCQkJCSovCisJCQkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAJZXJyb3JfY29kZSA9IHsgIkRJQU1FVEVSX1VOU1VQUE9SVEVEX1ZFUlNJT04iLAl7IC51MzIgPSBFUl9ESUFNRVRFUl9VTlNVUFBPUlRFRF9WRVJTSU9OIH19OworCQkJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmZXJyb3JfY29kZSAsIHR5cGUsIE5VTEwpOworCQkJCX0KKwkJCQkvKiA1MDEyICovCisJCQkJeworCQkJCQkvKgorCQkJCQkJVGhpcyBlcnJvciBpcyByZXR1cm5lZCB3aGVuIGEgcmVxdWVzdCBpcyByZWplY3RlZCBmb3IgdW5zcGVjaWZpZWQKKwkJCQkJCXJlYXNvbnMuCisJCQkJCSovCisJCQkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAJZXJyb3JfY29kZSA9IHsgIkRJQU1FVEVSX1VOQUJMRV9UT19DT01QTFkiLAl7IC51MzIgPSBFUl9ESUFNRVRFUl9VTkFCTEVfVE9fQ09NUExZIH19OworCQkJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmZXJyb3JfY29kZSAsIHR5cGUsIE5VTEwpOworCQkJCX0KKwkJCQkvKiA1MDEzIC0tIHdpbGwgY2hhbmdlIHRvIDN4eHggKi8KKwkJCQl7CisJCQkJCS8qCisJCQkJCQlUaGlzIGVycm9yIGlzIHJldHVybmVkIHdoZW4gYW4gdW5yZWNvZ25pemVkIGJpdCBpbiB0aGUgRGlhbWV0ZXIKKwkJCQkJCWhlYWRlciBpcyBzZXQgdG8gb25lICgxKS4KKwkJCQkJKi8KKwkJCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIAllcnJvcl9jb2RlID0geyAiRElBTUVURVJfSU5WQUxJRF9CSVRfSU5fSEVBREVSIiwgCXsgLnUzMiA9IEVSX0RJQU1FVEVSX0lOVkFMSURfQklUX0lOX0hFQURFUiB9fTsKKwkJCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJmVycm9yX2NvZGUgLCB0eXBlLCBOVUxMKTsKKwkJCQl9CisJCQkJLyogNTAxNCAqLworCQkJCXsKKwkJCQkJLyoKKwkJCQkJCVRoZSByZXF1ZXN0IGNvbnRhaW5lZCBhbiBBVlAgd2l0aCBhbiBpbnZhbGlkIGxlbmd0aC4gIEEgRGlhbWV0ZXIKKwkJCQkJCW1lc3NhZ2UgaW5kaWNhdGluZyB0aGlzIGVycm9yIE1VU1QgaW5jbHVkZSB0aGUgb2ZmZW5kaW5nIEFWUHMKKwkJCQkJCXdpdGhpbiBhIEZhaWxlZC1BVlAgQVZQLiAgSW4gY2FzZXMgd2hlcmUgdGhlIGVycm9uZW91cyBhdnAgbGVuZ3RoCisJCQkJCQl2YWx1ZSBleGNlZWRzIHRoZSBtZXNzYWdlIGxlbmd0aCBvciBpcyBsZXNzIHRoYW4gdGhlIG1pbmltdW0gQVZQCisJCQkJCQloZWFkZXIgbGVuZ3RoLCBpdCBpcyBzdWZmaWNpZW50IHRvIGluY2x1ZGUgdGhlIG9mZmVuZGluZyBBVlAKKwkJCQkJCWhlYWRlciBhbmQgYSB6ZXJvIGZpbGxlZCBwYXlsb2FkIG9mIHRoZSBtaW5pbXVtIHJlcXVpcmVkIGxlbmd0aAorCQkJCQkJZm9yIHRoZSBwYXlsb2FkcyBkYXRhIHR5cGUuICBJZiB0aGUgQVZQIGlzIGEgZ3JvdXBlZCBBVlAsIHRoZQorCQkJCQkJZ3JvdXBlZCBBVlAgaGVhZGVyIHdpdGggYW4gZW1wdHkgcGF5bG9hZCB3b3VsZCBiZSBzdWZmaWNpZW50IHRvCisJCQkJCQlpbmRpY2F0ZSB0aGUgb2ZmZW5kaW5nIEFWUC4gIEluIHRoZSBjYXNlIHdoZXJlIHRoZSBvZmZlbmRpbmcgQVZQCisJCQkJCQloZWFkZXIgY2Fubm90IGJlIGZ1bGx5IGRlY29kZWQgd2hlbiBhdnAgbGVuZ3RoIGlzIGxlc3MgdGhhbiB0aGUKKwkJCQkJCW1pbmltdW0gQVZQIGhlYWRlciBsZW5ndGgsIGl0IGlzIHN1ZmZpY2llbnQgdG8gaW5jbHVkZSBhbgorCQkJCQkJb2ZmZW5kaW5nIEFWUCBoZWFkZXIgdGhhdCBpcyBmb3JtdWxhdGVkIGJ5IHBhZGRpbmcgdGhlIGluY29tcGxldGUKKwkJCQkJCUFWUCBoZWFkZXIgd2l0aCB6ZXJvIHVwIHRvIHRoZSBtaW5pbXVtIEFWUCBoZWFkZXIgbGVuZ3RoLgorCQkJCQkqLworCQkJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgCWVycm9yX2NvZGUgPSB7ICJESUFNRVRFUl9JTlZBTElEX0FWUF9MRU5HVEgiLAl7IC51MzIgPSBFUl9ESUFNRVRFUl9JTlZBTElEX0FWUF9MRU5HVEggfX07CisJCQkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZlcnJvcl9jb2RlICwgdHlwZSwgTlVMTCk7CisJCQkJfQorCQkJCS8qIDUwMTUgLS0gd2lsbCBjaGFuZ2UgdG8gM3h4eCAqLworCQkJCXsKKwkJCQkJLyoKKwkJCQkJCVRoaXMgZXJyb3IgaXMgcmV0dXJuZWQgd2hlbiBhIHJlcXVlc3QgaXMgcmVjZWl2ZWQgd2l0aCBhbiBpbnZhbGlkCisJCQkJCQltZXNzYWdlIGxlbmd0aC4KKwkJCQkJKi8KKwkJCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIAllcnJvcl9jb2RlID0geyAiRElBTUVURVJfSU5WQUxJRF9NRVNTQUdFX0xFTkdUSCIsIAl7IC51MzIgPSBFUl9ESUFNRVRFUl9JTlZBTElEX01FU1NBR0VfTEVOR1RIIH19OworCQkJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmZXJyb3JfY29kZSAsIHR5cGUsIE5VTEwpOworCQkJCX0KKwkJCQkvKiA1MDE2ICovCisJCQkJeworCQkJCQkvKgorCQkJCQkJVGhlIHJlcXVlc3QgY29udGFpbmVkIGFuIEFWUCB3aXRoIHdoaWNoIGlzIG5vdCBhbGxvd2VkIHRvIGhhdmUgdGhlCisJCQkJCQlnaXZlbiB2YWx1ZSBpbiB0aGUgQVZQIEZsYWdzIGZpZWxkLiAgQSBEaWFtZXRlciBtZXNzYWdlIGluZGljYXRpbmcKKwkJCQkJCXRoaXMgZXJyb3IgTVVTVCBpbmNsdWRlIHRoZSBvZmZlbmRpbmcgQVZQcyB3aXRoaW4gYSBGYWlsZWQtQVZQCisJCQkJCQlBVlAuCisJCQkJCSovCisJCQkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAJZXJyb3JfY29kZSA9IHsgIkRJQU1FVEVSX0lOVkFMSURfQVZQX0JJVF9DT01CTyIsIAl7IC51MzIgPSBFUl9ESUFNRVRFUl9JTlZBTElEX0FWUF9CSVRfQ09NQk8gfX07CisJCQkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZlcnJvcl9jb2RlICwgdHlwZSwgTlVMTCk7CisJCQkJfQorCQkJCS8qIDUwMTcgKi8KKwkJCQl7CisJCQkJCS8qCisJCQkJCQlUaGlzIGVycm9yIGlzIHJldHVybmVkIHdoZW4gYSBDRVIgbWVzc2FnZSBpcyByZWNlaXZlZCwgYW5kIHRoZXJlCisJCQkJCQlhcmUgbm8gY29tbW9uIHNlY3VyaXR5IG1lY2hhbmlzbXMgc3VwcG9ydGVkIGJldHdlZW4gdGhlIHBlZXJzLiAgQQorCQkJCQkJQ2FwYWJpbGl0aWVzLUV4Y2hhbmdlLUFuc3dlciAoQ0VBKSBNVVNUIGJlIHJldHVybmVkIHdpdGggdGhlCisJCQkJCQlSZXN1bHQtQ29kZSBBVlAgc2V0IHRvIERJQU1FVEVSX05PX0NPTU1PTl9TRUNVUklUWS4KKwkJCQkJKi8KKwkJCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIAllcnJvcl9jb2RlID0geyAiRElBTUVURVJfTk9fQ09NTU9OX1NFQ1VSSVRZIiwJeyAudTMyID0gRVJfRElBTUVURVJfTk9fQ09NTU9OX1NFQ1VSSVRZIH19OworCQkJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmZXJyb3JfY29kZSAsIHR5cGUsIE5VTEwpOworCQkJCX0KKwkJCX0KKwkJfQorCQkKKwkJLyogRXJyb3ItTWVzc2FnZSAqLworCQl7CisJCQkvKgorCQkJCVRoZSBFcnJvci1NZXNzYWdlIEFWUCAoQVZQIENvZGUgMjgxKSBpcyBvZiB0eXBlIFVURjhTdHJpbmcuICBJdCBNQVkKKwkJCQlhY2NvbXBhbnkgYSBSZXN1bHQtQ29kZSBBVlAgYXMgYSBodW1hbiByZWFkYWJsZSBlcnJvciBtZXNzYWdlLiAgVGhlCisJCQkJRXJyb3ItTWVzc2FnZSBBVlAgaXMgbm90IGludGVuZGVkIHRvIGJlIHVzZWZ1bCBpbiByZWFsLXRpbWUsIGFuZAorCQkJCVNIT1VMRCBOT1QgYmUgZXhwZWN0ZWQgdG8gYmUgcGFyc2VkIGJ5IG5ldHdvcmsgZW50aXRpZXMuCisJCQkqLworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTI4MSwgCQkJCQkvKiBDb2RlICovCisJCQkJCSNpZiBBQ19FUlJPUl9NRVNTQUdFICE9IDI4MQorCQkJCQkjZXJyb3IgIkFDX0VSUk9SX01FU1NBR0UgZGVmaW5pdGlvbiBtaXNtYXRjaCIKKwkJCQkJI2VuZGlmCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJFcnJvci1NZXNzYWdlIiwgCQkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQkwLAkJCQkJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9CisJCQorCQkvKiBFcnJvci1SZXBvcnRpbmctSG9zdCAqLworCQl7CisJCQkvKgorCQkJCVRoZSBFcnJvci1SZXBvcnRpbmctSG9zdCBBVlAgKEFWUCBDb2RlIDI5NCkgaXMgb2YgdHlwZQorCQkJCURpYW1ldGVySWRlbnRpdHkuICBUaGlzIEFWUCBjb250YWlucyB0aGUgaWRlbnRpdHkgb2YgdGhlIERpYW1ldGVyCisJCQkJaG9zdCB0aGF0IHNlbnQgdGhlIFJlc3VsdC1Db2RlIEFWUCB0byBhIHZhbHVlIG90aGVyIHRoYW4gMjAwMQorCQkJCShTdWNjZXNzKSwgb25seSBpZiB0aGUgaG9zdCBzZXR0aW5nIHRoZSBSZXN1bHQtQ29kZSBpcyBkaWZmZXJlbnQgZnJvbQorCQkJCXRoZSBvbmUgZW5jb2RlZCBpbiB0aGUgT3JpZ2luLUhvc3QgQVZQLiAgVGhpcyBBVlAgaXMgaW50ZW5kZWQgdG8gYmUKKwkJCQl1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcgcHVycG9zZXMsIGFuZCBNVVNUIGJlIHNldCB3aGVuIHRoZSBSZXN1bHQtCisJCQkJQ29kZSBBVlAgaW5kaWNhdGVzIGEgZmFpbHVyZS4KKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJCQkJMjk0LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJI2lmIEFDX0VSUk9SX1JFUE9SVElOR19IT1NUICE9IDI5NAorCQkJCQkjZXJyb3IgIkFDX0VSUk9SX1JFUE9SVElOR19IT1NUIGRlZmluaXRpb24gbWlzbWF0Y2giCisJCQkJCSNlbmRpZgorCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiRXJyb3ItUmVwb3J0aW5nLUhvc3QiLCAJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJMCwJCQkJCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgRGlhbWV0ZXJJZGVudGl0eV90eXBlLCBOVUxMKTsKKwkJfQorCQkKKwkJLyogRmFpbGVkLUFWUCAqLworCQl7CisJCQkvKgorCQkJCVRoZSBGYWlsZWQtQVZQIEFWUCAoQVZQIENvZGUgMjc5KSBpcyBvZiB0eXBlIEdyb3VwZWQgYW5kIHByb3ZpZGVzCisJCQkJZGVidWdnaW5nIGluZm9ybWF0aW9uIGluIGNhc2VzIHdoZXJlIGEgcmVxdWVzdCBpcyByZWplY3RlZCBvciBub3QKKwkJCQlmdWxseSBwcm9jZXNzZWQgZHVlIHRvIGVycm9uZW91cyBpbmZvcm1hdGlvbiBpbiBhIHNwZWNpZmljIEFWUC4gIFRoZQorCQkJCXZhbHVlIG9mIHRoZSBSZXN1bHQtQ29kZSBBVlAgd2lsbCBwcm92aWRlIGluZm9ybWF0aW9uIG9uIHRoZSByZWFzb24KKwkJCQlmb3IgdGhlIEZhaWxlZC1BVlAgQVZQLiAgQSBEaWFtZXRlciBtZXNzYWdlIFNIT1VMRCBjb250YWluIG9ubHkgb25lCisJCQkJRmFpbGVkLUFWUCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBlcnJvciBpbmRpY2F0ZWQgYnkgdGhlIFJlc3VsdC1Db2RlCisJCQkJQVZQLiAgRm9yIHByYWN0aWNhbCBwdXJwb3NlcywgdGhpcyBGYWlsZWQtQVZQIHdvdWxkIHR5cGljYWxseSByZWZlcgorCQkJCXRvIHRoZSBmaXJzdCBBVlAgcHJvY2Vzc2luZyBlcnJvciB0aGF0IGEgRGlhbWV0ZXIgbm9kZSBlbmNvdW50ZXJzLgorCisJCQkJVGhlIHBvc3NpYmxlIHJlYXNvbnMgZm9yIHRoaXMgQVZQIGFyZSB0aGUgcHJlc2VuY2Ugb2YgYW4gaW1wcm9wZXJseQorCQkJCWNvbnN0cnVjdGVkIEFWUCwgYW4gdW5zdXBwb3J0ZWQgb3IgdW5yZWNvZ25pemVkIEFWUCwgYW4gaW52YWxpZCBBVlAKKwkJCQl2YWx1ZSwgdGhlIG9taXNzaW9uIG9mIGEgcmVxdWlyZWQgQVZQLCB0aGUgcHJlc2VuY2Ugb2YgYW4gZXhwbGljaXRseQorCQkJCWV4Y2x1ZGVkIEFWUCAoc2VlIHRhYmxlcyBpbiBTZWN0aW9uIDEwKSwgb3IgdGhlIHByZXNlbmNlIG9mIHR3byBvcgorCQkJCW1vcmUgb2NjdXJyZW5jZXMgb2YgYW4gQVZQIHdoaWNoIGlzIHJlc3RyaWN0ZWQgdG8gMCwgMSwgb3IgMC0xCisJCQkJb2NjdXJyZW5jZXMuCisKKwkJCQlBIERpYW1ldGVyIG1lc3NhZ2UgU0hPVUxEIGNvbnRhaW4gb25lIEZhaWxlZC1BVlAgQVZQLCBjb250YWluaW5nIHRoZQorCQkJCWVudGlyZSBBVlAgdGhhdCBjb3VsZCBub3QgYmUgcHJvY2Vzc2VkIHN1Y2Nlc3NmdWxseS4gIElmIHRoZSBmYWlsdXJlCisJCQkJcmVhc29uIGlzIG9taXNzaW9uIG9mIGEgcmVxdWlyZWQgQVZQLCBhbiBBVlAgd2l0aCB0aGUgbWlzc2luZyBBVlAKKwkJCQljb2RlLCB0aGUgbWlzc2luZyB2ZW5kb3IgaWQsIGFuZCBhIHplcm8gZmlsbGVkIHBheWxvYWQgb2YgdGhlIG1pbmltdW0KKwkJCQlyZXF1aXJlZCBsZW5ndGggZm9yIHRoZSBvbWl0dGVkIEFWUCB3aWxsIGJlIGFkZGVkLiAgSWYgdGhlIGZhaWx1cmUKKwkJCQlyZWFzb24gaXMgYW4gaW52YWxpZCBBVlAgbGVuZ3RoIHdoZXJlIHRoZSByZXBvcnRlZCBsZW5ndGggaXMgbGVzcworCQkJCXRoYW4gdGhlIG1pbmltdW0gQVZQIGhlYWRlciBsZW5ndGggb3IgZ3JlYXRlciB0aGFuIHRoZSByZXBvcnRlZAorCQkJCW1lc3NhZ2UgbGVuZ3RoLCBhIGNvcHkgb2YgdGhlIG9mZmVuZGluZyBBVlAgaGVhZGVyIGFuZCBhIHplcm8gZmlsbGVkCisJCQkJcGF5bG9hZCBvZiB0aGUgbWluaW11bSByZXF1aXJlZCBsZW5ndGggU0hPVUxEIGJlIGFkZGVkLgorCisJCQkJSW4gdGhlIGNhc2Ugd2hlcmUgdGhlIG9mZmVuZGluZyBBVlAgaXMgZW1iZWRkZWQgd2l0aGluIGEgZ3JvdXBlZCBBVlAsCisJCQkJdGhlIEZhaWxlZC1BVlAgTUFZIGNvbnRhaW4gdGhlIGdyb3VwZWQgQVZQIHdoaWNoIGluIHR1cm4gY29udGFpbnMgdGhlCisJCQkJc2luZ2xlIG9mZmVuZGluZyBBVlAuICBUaGUgc2FtZSBtZXRob2QgTUFZIGJlIGVtcGxveWVkIGlmIHRoZSBncm91cGVkCisJCQkJQVZQIGl0c2VsZiBpcyBlbWJlZGRlZCBpbiB5ZXQgYW5vdGhlciBncm91cGVkIEFWUCBhbmQgc28gb24uICBJbiB0aGlzCisJCQkJY2FzZSwgdGhlIEZhaWxlZC1BVlAgTUFZIGNvbnRhaW4gdGhlIGdyb3VwZWQgQVZQIGhlaXJhcmNoeSB1cCB0byB0aGUKKwkJCQlzaW5nbGUgb2ZmZW5kaW5nIEFWUC4gIFRoaXMgZW5hYmxlcyB0aGUgcmVjaXBpZW50IHRvIGRldGVjdCB0aGUKKwkJCQlsb2NhdGlvbiBvZiB0aGUgb2ZmZW5kaW5nIEFWUCB3aGVuIGVtYmVkZGVkIGluIGEgZ3JvdXAuCisKKwkJCQlBVlAgRm9ybWF0CisKKwkJCQkgPEZhaWxlZC1BVlA+IDo6PSA8IEFWUCBIZWFkZXI6IDI3OSA+CisgICAgICAgIAkJCQkgICAgICAgMSoge0FWUH0KKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJCQkJMjc5LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJI2lmIEFDX0ZBSUxFRF9BVlAgIT0gMjc5CisJCQkJCSNlcnJvciAiQUNfRkFJTEVEX0FWUCBkZWZpbml0aW9uIG1pc21hdGNoIgorCQkJCQkjZW5kaWYKKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIkZhaWxlZC1BVlAiLCAJCQkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfR1JPVVBFRCAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsIE5VTEwpOworCQl9CisJCQorCQkvKiBFeHBlcmltZW50YWwtUmVzdWx0ICovCisJCXsKKwkJCS8qCisJCQkJVGhlIEV4cGVyaW1lbnRhbC1SZXN1bHQgQVZQIChBVlAgQ29kZSAyOTcpIGlzIG9mIHR5cGUgR3JvdXBlZCwgYW5kCisJCQkJaW5kaWNhdGVzIHdoZXRoZXIgYSBwYXJ0aWN1bGFyIHZlbmRvci1zcGVjaWZpYyByZXF1ZXN0IHdhcyBjb21wbGV0ZWQKKwkJCQlzdWNjZXNzZnVsbHkgb3Igd2hldGhlciBhbiBlcnJvciBvY2N1cnJlZC4gIEl0cyBEYXRhIGZpZWxkIGhhcyB0aGUKKwkJCQlmb2xsb3dpbmcgQUJORiBncmFtbWFyOgorCisJCQkJQVZQIEZvcm1hdAorCisJCQkJIEV4cGVyaW1lbnRhbC1SZXN1bHQgOjo9IDwgQVZQIEhlYWRlcjogMjk3ID4KKyAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkgeyBWZW5kb3ItSWQgfQorICAgICAgICAgICAgICAgICAgICAgICAgCQkJCSB7IEV4cGVyaW1lbnRhbC1SZXN1bHQtQ29kZSB9CisKKwkJCQlUaGUgVmVuZG9yLUlkIEFWUCAoc2VlIFNlY3Rpb24gNS4zLjMpIGluIHRoaXMgZ3JvdXBlZCBBVlAgaWRlbnRpZmllcworCQkJCXRoZSB2ZW5kb3IgcmVzcG9uc2libGUgZm9yIHRoZSBhc3NpZ25tZW50IG9mIHRoZSByZXN1bHQgY29kZSB3aGljaAorCQkJCWZvbGxvd3MuICBBbGwgRGlhbWV0ZXIgYW5zd2VyIG1lc3NhZ2VzIGRlZmluZWQgaW4gdmVuZG9yLXNwZWNpZmljCisJCQkJYXBwbGljYXRpb25zIE1VU1QgaW5jbHVkZSBlaXRoZXIgb25lIFJlc3VsdC1Db2RlIEFWUCBvciBvbmUKKwkJCQlFeHBlcmltZW50YWwtUmVzdWx0IEFWUC4KKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJCQkJMjk3LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIkV4cGVyaW1lbnRhbC1SZXN1bHQiLCAJCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCQkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9HUk9VUEVEIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgTlVMTCk7CisJCX0KKwkJCisJCS8qIEV4cGVyaW1lbnRhbC1SZXN1bHQtQ29kZSAqLworCQl7CisJCQkvKgorCQkJCVRoZSBFeHBlcmltZW50YWwtUmVzdWx0LUNvZGUgQVZQIChBVlAgQ29kZSAyOTgpIGlzIG9mIHR5cGUgVW5zaWduZWQzMgorCQkJCWFuZCBjb250YWlucyBhIHZlbmRvci1hc3NpZ25lZCB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIHJlc3VsdCBvZgorCQkJCXByb2Nlc3NpbmcgdGhlIHJlcXVlc3QuCisKKwkJCQlJdCBpcyByZWNvbW1lbmRlZCB0aGF0IHZlbmRvci1zcGVjaWZpYyByZXN1bHQgY29kZXMgZm9sbG93IHRoZSBzYW1lCisJCQkJY29udmVudGlvbnMgZ2l2ZW4gZm9yIHRoZSBSZXN1bHQtQ29kZSBBVlAgcmVnYXJkaW5nIHRoZSBkaWZmZXJlbnQKKwkJCQl0eXBlcyBvZiByZXN1bHQgY29kZXMgYW5kIHRoZSBoYW5kbGluZyBvZiBlcnJvcnMgKGZvciBub24gMnh4eAorCQkJCXZhbHVlcykuCisJCQkqLworCQkJLyogQWx0aG91Z2ggdGhlIFJGQyBkb2VzIG5vdCBzcGVjaWZ5IGFuICJFbnVtZXJhdGVkIiB0eXBlIGhlcmUsIHdlIGdvIGZvcndhcmQgYW5kIGNyZWF0ZSBvbmUuCisJCQkgKiBUaGlzIGlzIHRoZSByZWFzb24gZm9yIHRoZSAiKiIgaW4gdGhlIHR5cGUgbmFtZS4gVmVuZG9ycyB3aWxsIGhhdmUgdG8gZGVmaW5lIHRoZWlyIHZhbHVlcy4KKwkJCSAqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogCXR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgCXRkYXRhID0geyBBVlBfVFlQRV9VTlNJR05FRDMyLAkiRW51bWVyYXRlZChFeHBlcmltZW50YWwtUmVzdWx0LUNvZGUpIgksIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIAlkYXRhID0geyAKKwkJCQkJMjk4LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIkV4cGVyaW1lbnRhbC1SZXN1bHQtQ29kZSIsIAkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfVU5TSUdORUQzMiAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCQkJCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEgLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgdHlwZSwgTlVMTCk7CisJCX0KKwkJCisJCS8qIEF1dGgtUmVxdWVzdC1UeXBlICovCisJCXsKKwkJCS8qCisJCQkJVGhlIEF1dGgtUmVxdWVzdC1UeXBlIEFWUCAoQVZQIENvZGUgMjc0KSBpcyBvZiB0eXBlIEVudW1lcmF0ZWQgYW5kIGlzCisJCQkJaW5jbHVkZWQgaW4gYXBwbGljYXRpb24tc3BlY2lmaWMgYXV0aCByZXF1ZXN0cyB0byBpbmZvcm0gdGhlIHBlZXJzCisJCQkJd2hldGhlciBhIHVzZXIgaXMgdG8gYmUgYXV0aGVudGljYXRlZCBvbmx5LCBhdXRob3JpemVkIG9ubHkgb3IgYm90aC4KKwkJCQlOb3RlIGFueSB2YWx1ZSBvdGhlciB0aGFuIGJvdGggTUFZIGNhdXNlIFJBRElVUyBpbnRlcm9wZXJhYmlsaXR5CisJCQkJaXNzdWVzLiAgVGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIGRlZmluZWQ6CisKKworCQkJCUFVVEhFTlRJQ0FURV9PTkxZIDEKKworCQkJCVRoZSByZXF1ZXN0IGJlaW5nIHNlbnQgaXMgZm9yIGF1dGhlbnRpY2F0aW9uIG9ubHksIGFuZCBNVVNUCisJCQkJY29udGFpbiB0aGUgcmVsZXZhbnQgYXBwbGljYXRpb24gc3BlY2lmaWMgYXV0aGVudGljYXRpb24gQVZQcyB0aGF0CisJCQkJYXJlIG5lZWRlZCBieSB0aGUgRGlhbWV0ZXIgc2VydmVyIHRvIGF1dGhlbnRpY2F0ZSB0aGUgdXNlci4KKworCisJCQkJQVVUSE9SSVpFX09OTFkgMgorCisJCQkJVGhlIHJlcXVlc3QgYmVpbmcgc2VudCBpcyBmb3IgYXV0aG9yaXphdGlvbiBvbmx5LCBhbmQgTVVTVCBjb250YWluCisJCQkJdGhlIGFwcGxpY2F0aW9uIHNwZWNpZmljIGF1dGhvcml6YXRpb24gQVZQcyB0aGF0IGFyZSBuZWNlc3NhcnkgdG8KKwkJCQlpZGVudGlmeSB0aGUgc2VydmljZSBiZWluZyByZXF1ZXN0ZWQvb2ZmZXJlZC4KKworCisJCQkJQVVUSE9SSVpFX0FVVEhFTlRJQ0FURSAzCisKKwkJCQlUaGUgcmVxdWVzdCBjb250YWlucyBhIHJlcXVlc3QgZm9yIGJvdGggYXV0aGVudGljYXRpb24gYW5kCisJCQkJYXV0aG9yaXphdGlvbi4gIFRoZSByZXF1ZXN0IE1VU1QgaW5jbHVkZSBib3RoIHRoZSByZWxldmFudAorCQkJCWFwcGxpY2F0aW9uIHNwZWNpZmljIGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uLCBhbmQgYXV0aG9yaXphdGlvbgorCQkJCWluZm9ybWF0aW9uIG5lY2Vzc2FyeSB0byBpZGVudGlmeSB0aGUgc2VydmljZSBiZWluZyByZXF1ZXN0ZWQvCisJCQkJb2ZmZXJlZC4KKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgCSogCXR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgCQl0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLAkiRW51bWVyYXRlZChBdXRoLVJlcXVlc3QtVHlwZSkiCSwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIAl0XzEgPSB7ICJBVVRIRU5USUNBVEVfT05MWSIsIAkJeyAuaTMyID0gMSB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAJdF8yID0geyAiQVVUSE9SSVpFX09OTFkiLCAJCXsgLmkzMiA9IDIgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgCXRfMyA9IHsgIkFVVEhPUklaRV9BVVRIRU5USUNBVEUiLCAJeyAuaTMyID0gMyB9fTsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIAlkYXRhID0geyAKKwkJCQkJMjc0LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIkF1dGgtUmVxdWVzdC1UeXBlIiwgCQkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfSU5URUdFUjMyIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhICwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSAsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiAsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMyAsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIHR5cGUsIE5VTEwpOworCQl9CisJCQorCQkvKiBTZXNzaW9uLUlkICovCisJCXsKKwkJCS8qCisJCQkJVGhlIFNlc3Npb24tSWQgQVZQIChBVlAgQ29kZSAyNjMpIGlzIG9mIHR5cGUgVVRGOFN0cmluZyBhbmQgaXMgdXNlZAorCQkJCXRvIGlkZW50aWZ5IGEgc3BlY2lmaWMgc2Vzc2lvbiAoc2VlIFNlY3Rpb24gOCkuICBBbGwgbWVzc2FnZXMKKwkJCQlwZXJ0YWluaW5nIHRvIGEgc3BlY2lmaWMgc2Vzc2lvbiBNVVNUIGluY2x1ZGUgb25seSBvbmUgU2Vzc2lvbi1JZCBBVlAKKwkJCQlhbmQgdGhlIHNhbWUgdmFsdWUgTVVTVCBiZSB1c2VkIHRocm91Z2hvdXQgdGhlIGxpZmUgb2YgYSBzZXNzaW9uLgorCQkJCVdoZW4gcHJlc2VudCwgdGhlIFNlc3Npb24tSWQgU0hPVUxEIGFwcGVhciBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhlCisJCQkJRGlhbWV0ZXIgSGVhZGVyIChzZWUgU2VjdGlvbiAzKS4KKworCQkJCVRoZSBTZXNzaW9uLUlkIE1VU1QgYmUgZ2xvYmFsbHkgYW5kIGV0ZXJuYWxseSB1bmlxdWUsIGFzIGl0IGlzIG1lYW50CisJCQkJdG8gdW5pcXVlbHkgaWRlbnRpZnkgYSB1c2VyIHNlc3Npb24gd2l0aG91dCByZWZlcmVuY2UgdG8gYW55IG90aGVyCisJCQkJaW5mb3JtYXRpb24sIGFuZCBtYXkgYmUgbmVlZGVkIHRvIGNvcnJlbGF0ZSBoaXN0b3JpY2FsIGF1dGhlbnRpY2F0aW9uCisJCQkJaW5mb3JtYXRpb24gd2l0aCBhY2NvdW50aW5nIGluZm9ybWF0aW9uLiAgVGhlIFNlc3Npb24tSWQgaW5jbHVkZXMgYQorCQkJCW1hbmRhdG9yeSBwb3J0aW9uIGFuZCBhbiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHBvcnRpb247IGEKKwkJCQlyZWNvbW1lbmRlZCBmb3JtYXQgZm9yIHRoZSBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHBvcnRpb24gaXMgb3V0bGluZWQKKwkJCQliZWxvdy4KKwkJCQkKKwkJCQkoc2tpcHBlZCwgc2VlIFJGQyBmb3IgZGV0YWlsKQorCQkJKi8KKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQkJCQkyNjMsIAkJCQkJLyogQ29kZSAqLworCQkJCQkjaWYgQUNfU0VTU0lPTl9JRCAhPSAyNjMKKwkJCQkJI2Vycm9yICJBQ19TRVNTSU9OX0lEIGRlZmluaXRpb24gbWlzbWF0Y2giCisJCQkJCSNlbmRpZgorCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiU2Vzc2lvbi1JZCIsIAkJCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCQkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9PQ1RFVFNUUklORyAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIFVURjhTdHJpbmdfdHlwZSwgTlVMTCk7CisJCX0KKwkJCisJCS8qIEF1dGhvcml6YXRpb24tTGlmZXRpbWUgKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgQXV0aG9yaXphdGlvbi1MaWZldGltZSBBVlAgKEFWUCBDb2RlIDI5MSkgaXMgb2YgdHlwZSBVbnNpZ25lZDMyCisJCQkJYW5kIGNvbnRhaW5zIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzZWNvbmRzIG9mIHNlcnZpY2UgdG8gYmUgcHJvdmlkZWQKKwkJCQl0byB0aGUgdXNlciBiZWZvcmUgdGhlIHVzZXIgaXMgdG8gYmUgcmUtYXV0aGVudGljYXRlZCBhbmQvb3IgcmUtCisJCQkJYXV0aG9yaXplZC4gIEdyZWF0IGNhcmUgc2hvdWxkIGJlIHRha2VuIHdoZW4gdGhlIEF1dGhvcml6YXRpb24tCisJCQkJTGlmZXRpbWUgdmFsdWUgaXMgZGV0ZXJtaW5lZCwgc2luY2UgYSBsb3csIG5vbi16ZXJvLCB2YWx1ZSBjb3VsZAorCQkJCWNyZWF0ZSBzaWduaWZpY2FudCBEaWFtZXRlciB0cmFmZmljLCB3aGljaCBjb3VsZCBjb25nZXN0IGJvdGggdGhlCisJCQkJbmV0d29yayBhbmQgdGhlIGFnZW50cy4KKworCQkJCUEgdmFsdWUgb2YgemVybyAoMCkgbWVhbnMgdGhhdCBpbW1lZGlhdGUgcmUtYXV0aCBpcyBuZWNlc3NhcnkgYnkgdGhlCisJCQkJYWNjZXNzIGRldmljZS4gIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgaW4gY2FzZXMgd2hlcmUgbXVsdGlwbGUKKwkJCQlhdXRoZW50aWNhdGlvbiBtZXRob2RzIGFyZSB1c2VkLCBhbmQgYSBzdWNjZXNzZnVsIGF1dGggcmVzcG9uc2Ugd2l0aAorCQkJCXRoaXMgQVZQIHNldCB0byB6ZXJvIGlzIHVzZWQgdG8gc2lnbmFsIHRoYXQgdGhlIG5leHQgYXV0aGVudGljYXRpb24KKwkJCQltZXRob2QgaXMgdG8gYmUgaW1tZWRpYXRlbHkgaW5pdGlhdGVkLiAgVGhlIGFic2VuY2Ugb2YgdGhpcyBBVlAsIG9yIGEKKwkJCQl2YWx1ZSBvZiBhbGwgb25lcyAobWVhbmluZyBhbGwgYml0cyBpbiB0aGUgMzIgYml0IGZpZWxkIGFyZSBzZXQgdG8KKwkJCQlvbmUpIG1lYW5zIG5vIHJlLWF1dGggaXMgZXhwZWN0ZWQuCisKKwkJCQlJZiBib3RoIHRoaXMgQVZQIGFuZCB0aGUgU2Vzc2lvbi1UaW1lb3V0IEFWUCBhcmUgcHJlc2VudCBpbiBhCisJCQkJbWVzc2FnZSwgdGhlIHZhbHVlIG9mIHRoZSBsYXR0ZXIgTVVTVCBOT1QgYmUgc21hbGxlciB0aGFuIHRoZQorCQkJCUF1dGhvcml6YXRpb24tTGlmZXRpbWUgQVZQLgorCisJCQkJQW4gQXV0aG9yaXphdGlvbi1MaWZldGltZSBBVlAgTUFZIGJlIHByZXNlbnQgaW4gcmUtYXV0aG9yaXphdGlvbgorCQkJCW1lc3NhZ2VzLCBhbmQgY29udGFpbnMgdGhlIG51bWJlciBvZiBzZWNvbmRzIHRoZSB1c2VyIGlzIGF1dGhvcml6ZWQKKwkJCQl0byByZWNlaXZlIHNlcnZpY2UgZnJvbSB0aGUgdGltZSB0aGUgcmUtYXV0aCBhbnN3ZXIgbWVzc2FnZSBpcworCQkJCXJlY2VpdmVkIGJ5IHRoZSBhY2Nlc3MgZGV2aWNlLgorCisJCQkJVGhpcyBBVlAgTUFZIGJlIHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQgYXMgYSBoaW50IG9mIHRoZSBtYXhpbXVtCisJCQkJbGlmZXRpbWUgdGhhdCBpdCBpcyB3aWxsaW5nIHRvIGFjY2VwdC4gIEhvd2V2ZXIsIHRoZSBzZXJ2ZXIgTUFZCisJCQkJcmV0dXJuIGEgdmFsdWUgdGhhdCBpcyBlcXVhbCB0bywgb3Igc21hbGxlciwgdGhhbiB0aGUgb25lIHByb3ZpZGVkIGJ5CisJCQkJdGhlIGNsaWVudC4KKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJCQkJMjkxLCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIkF1dGhvcml6YXRpb24tTGlmZXRpbWUiLCAJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCBOVUxMKTsKKwkJfQorCQkKKwkJLyogQXV0aC1HcmFjZS1QZXJpb2QgKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgQXV0aC1HcmFjZS1QZXJpb2QgQVZQIChBVlAgQ29kZSAyNzYpIGlzIG9mIHR5cGUgVW5zaWduZWQzMiBhbmQKKwkJCQljb250YWlucyB0aGUgbnVtYmVyIG9mIHNlY29uZHMgdGhlIERpYW1ldGVyIHNlcnZlciB3aWxsIHdhaXQKKwkJCQlmb2xsb3dpbmcgdGhlIGV4cGlyYXRpb24gb2YgdGhlIEF1dGhvcml6YXRpb24tTGlmZXRpbWUgQVZQIGJlZm9yZQorCQkJCWNsZWFuaW5nIHVwIHJlc291cmNlcyBmb3IgdGhlIHNlc3Npb24uCisJCQkqLworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTI3NiwgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJBdXRoLUdyYWNlLVBlcmlvZCIsIAkJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCBOVUxMKTsKKwkJfQorCQkKKwkJLyogQXV0aC1TZXNzaW9uLVN0YXRlICovCisJCXsKKwkJCS8qCisJCQkJVGhlIEF1dGgtU2Vzc2lvbi1TdGF0ZSBBVlAgKEFWUCBDb2RlIDI3NykgaXMgb2YgdHlwZSBFbnVtZXJhdGVkIGFuZAorCQkJCXNwZWNpZmllcyB3aGV0aGVyIHN0YXRlIGlzIG1haW50YWluZWQgZm9yIGEgcGFydGljdWxhciBzZXNzaW9uLiAgVGhlCisJCQkJY2xpZW50IE1BWSBpbmNsdWRlIHRoaXMgQVZQIGluIHJlcXVlc3RzIGFzIGEgaGludCB0byB0aGUgc2VydmVyLCBidXQKKwkJCQl0aGUgdmFsdWUgaW4gdGhlIHNlcnZlcidzIGFuc3dlciBtZXNzYWdlIGlzIGJpbmRpbmcuICBUaGUgZm9sbG93aW5nCisJCQkJdmFsdWVzIGFyZSBzdXBwb3J0ZWQ6CisKKworCQkJCVNUQVRFX01BSU5UQUlORUQgMAorCisJCQkJVGhpcyB2YWx1ZSBpcyB1c2VkIHRvIHNwZWNpZnkgdGhhdCBzZXNzaW9uIHN0YXRlIGlzIGJlaW5nCisJCQkJbWFpbnRhaW5lZCwgYW5kIHRoZSBhY2Nlc3MgZGV2aWNlIE1VU1QgaXNzdWUgYSBzZXNzaW9uIHRlcm1pbmF0aW9uCisJCQkJbWVzc2FnZSB3aGVuIHNlcnZpY2UgdG8gdGhlIHVzZXIgaXMgdGVybWluYXRlZC4gIFRoaXMgaXMgdGhlCisJCQkJZGVmYXVsdCB2YWx1ZS4KKworCisJCQkJTk9fU1RBVEVfTUFJTlRBSU5FRCAxCisKKwkJCQlUaGlzIHZhbHVlIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGF0IG5vIHNlc3Npb24gdGVybWluYXRpb24gbWVzc2FnZXMKKwkJCQl3aWxsIGJlIHNlbnQgYnkgdGhlIGFjY2VzcyBkZXZpY2UgdXBvbiBleHBpcmF0aW9uIG9mIHRoZQorCQkJCUF1dGhvcml6YXRpb24tTGlmZXRpbWUuCisJCQkqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0IAkqIAl0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSAJdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwJIkVudW1lcmF0ZWQoQXV0aC1TZXNzaW9uLVN0YXRlKSIJLCBOVUxMLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgCXRfMCA9IHsgIlNUQVRFX01BSU5UQUlORUQiLCAJCXsgLmkzMiA9IDAgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgCXRfMSA9IHsgIk5PX1NUQVRFX01BSU5UQUlORUQiLCAJCXsgLmkzMiA9IDEgfX07CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YQkgCWRhdGEgPSB7IAorCQkJCQkyNzcsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiQXV0aC1TZXNzaW9uLVN0YXRlIiwgCQkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfSU5URUdFUjMyIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhICwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMCAsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSAsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIHR5cGUsIE5VTEwpOworCQl9CisJCQorCQkvKiBSZS1BdXRoLVJlcXVlc3QtVHlwZSAqLworCQl7CisJCQkvKgorCQkJCVRoZSBSZS1BdXRoLVJlcXVlc3QtVHlwZSBBVlAgKEFWUCBDb2RlIDI4NSkgaXMgb2YgdHlwZSBFbnVtZXJhdGVkIGFuZAorCQkJCWlzIGluY2x1ZGVkIGluIGFwcGxpY2F0aW9uLXNwZWNpZmljIGF1dGggYW5zd2VycyB0byBpbmZvcm0gdGhlIGNsaWVudAorCQkJCW9mIHRoZSBhY3Rpb24gZXhwZWN0ZWQgdXBvbiBleHBpcmF0aW9uIG9mIHRoZSBBdXRob3JpemF0aW9uLUxpZmV0aW1lLgorCQkJCUlmIHRoZSBhbnN3ZXIgbWVzc2FnZSBjb250YWlucyBhbiBBdXRob3JpemF0aW9uLUxpZmV0aW1lIEFWUCB3aXRoIGEKKwkJCQlwb3NpdGl2ZSB2YWx1ZSwgdGhlIFJlLUF1dGgtUmVxdWVzdC1UeXBlIEFWUCBNVVNUIGJlIHByZXNlbnQgaW4gYW4KKwkJCQlhbnN3ZXIgbWVzc2FnZS4gIFRoZSBmb2xsb3dpbmcgdmFsdWVzIGFyZSBkZWZpbmVkOgorCisKKwkJCQlBVVRIT1JJWkVfT05MWSAwCisKKwkJCQlBbiBhdXRob3JpemF0aW9uIG9ubHkgcmUtYXV0aCBpcyBleHBlY3RlZCB1cG9uIGV4cGlyYXRpb24gb2YgdGhlCisJCQkJQXV0aG9yaXphdGlvbi1MaWZldGltZS4gIFRoaXMgaXMgdGhlIGRlZmF1bHQgdmFsdWUgaWYgdGhlIEFWUCBpcworCQkJCW5vdCBwcmVzZW50IGluIGFuc3dlciBtZXNzYWdlcyB0aGF0IGluY2x1ZGUgdGhlIEF1dGhvcml6YXRpb24tCisJCQkJTGlmZXRpbWUuCisKKworCQkJCUFVVEhPUklaRV9BVVRIRU5USUNBVEUgMQorCisJCQkJQW4gYXV0aGVudGljYXRpb24gYW5kIGF1dGhvcml6YXRpb24gcmUtYXV0aCBpcyBleHBlY3RlZCB1cG9uCisJCQkJZXhwaXJhdGlvbiBvZiB0aGUgQXV0aG9yaXphdGlvbi1MaWZldGltZS4KKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgCSogCXR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIAl0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLAkiRW51bWVyYXRlZChSZS1BdXRoLVJlcXVlc3QtVHlwZSkiCSwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIAl0XzAgPSB7ICJBVVRIT1JJWkVfT05MWSIsIAkJeyAuaTMyID0gMCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAJdF8xID0geyAiQVVUSE9SSVpFX0FVVEhFTlRJQ0FURSIsCXsgLmkzMiA9IDEgfX07CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YQkgCWRhdGEgPSB7IAorCQkJCQkyODUsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiUmUtQXV0aC1SZXF1ZXN0LVR5cGUiLAkJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX0lOVEVHRVIzMiAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSAsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzAgLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEgLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCB0eXBlLCBOVUxMKTsKKwkJfQorCQkKKwkJLyogU2Vzc2lvbi1UaW1lb3V0ICovCisJCXsKKwkJCS8qCisJCQkJVGhlIFNlc3Npb24tVGltZW91dCBBVlAgKEFWUCBDb2RlIDI3KSBbUkZDMjg2NV0gaXMgb2YgdHlwZSBVbnNpZ25lZDMyCisJCQkJYW5kIGNvbnRhaW5zIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzZWNvbmRzIG9mIHNlcnZpY2UgdG8gYmUgcHJvdmlkZWQKKwkJCQl0byB0aGUgdXNlciBiZWZvcmUgdGVybWluYXRpb24gb2YgdGhlIHNlc3Npb24uICBXaGVuIGJvdGggdGhlCisJCQkJU2Vzc2lvbi1UaW1lb3V0IGFuZCB0aGUgQXV0aG9yaXphdGlvbi1MaWZldGltZSBBVlBzIGFyZSBwcmVzZW50IGluIGFuCisJCQkJYW5zd2VyIG1lc3NhZ2UsIHRoZSBmb3JtZXIgTVVTVCBiZSBlcXVhbCB0byBvciBncmVhdGVyIHRoYW4gdGhlIHZhbHVlCisJCQkJb2YgdGhlIGxhdHRlci4KKworCQkJCUEgc2Vzc2lvbiB0aGF0IHRlcm1pbmF0ZXMgb24gYW4gYWNjZXNzIGRldmljZSBkdWUgdG8gdGhlIGV4cGlyYXRpb24KKwkJCQlvZiB0aGUgU2Vzc2lvbi1UaW1lb3V0IE1VU1QgY2F1c2UgYW4gU1RSIHRvIGJlIGlzc3VlZCwgdW5sZXNzIGJvdGgKKwkJCQl0aGUgYWNjZXNzIGRldmljZSBhbmQgdGhlIGhvbWUgc2VydmVyIGhhZCBwcmV2aW91c2x5IGFncmVlZCB0aGF0IG5vCisJCQkJc2Vzc2lvbiB0ZXJtaW5hdGlvbiBtZXNzYWdlcyB3b3VsZCBiZSBzZW50IChzZWUgU2VjdGlvbiA4LjExKS4KKworCQkJCUEgU2Vzc2lvbi1UaW1lb3V0IEFWUCBNQVkgYmUgcHJlc2VudCBpbiBhIHJlLWF1dGhvcml6YXRpb24gYW5zd2VyCisJCQkJbWVzc2FnZSwgYW5kIGNvbnRhaW5zIHRoZSByZW1haW5pbmcgbnVtYmVyIG9mIHNlY29uZHMgZnJvbSB0aGUKKwkJCQliZWdpbm5pbmcgb2YgdGhlIHJlLWF1dGguCisKKwkJCQlBIHZhbHVlIG9mIHplcm8sIG9yIHRoZSBhYnNlbmNlIG9mIHRoaXMgQVZQLCBtZWFucyB0aGF0IHRoaXMgc2Vzc2lvbgorCQkJCWhhcyBhbiB1bmxpbWl0ZWQgbnVtYmVyIG9mIHNlY29uZHMgYmVmb3JlIHRlcm1pbmF0aW9uLgorCisJCQkJVGhpcyBBVlAgTUFZIGJlIHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQgYXMgYSBoaW50IG9mIHRoZSBtYXhpbXVtCisJCQkJdGltZW91dCB0aGF0IGl0IGlzIHdpbGxpbmcgdG8gYWNjZXB0LiAgSG93ZXZlciwgdGhlIHNlcnZlciBNQVkgcmV0dXJuCisJCQkJYSB2YWx1ZSB0aGF0IGlzIGVxdWFsIHRvLCBvciBzbWFsbGVyLCB0aGFuIHRoZSBvbmUgcHJvdmlkZWQgYnkgdGhlCisJCQkJY2xpZW50LgorCQkJKi8KKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQkJCQkyNywgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJTZXNzaW9uLVRpbWVvdXQiLCAJCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCQkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9VTlNJR05FRDMyIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgTlVMTCk7CisJCX0KKwkJCisJCS8qIFVzZXItTmFtZSAqLworCQl7CisJCQkvKgorCQkJCVRoZSBVc2VyLU5hbWUgQVZQIChBVlAgQ29kZSAxKSBbUkZDMjg2NV0gaXMgb2YgdHlwZSBVVEY4U3RyaW5nLCB3aGljaAorCQkJCWNvbnRhaW5zIHRoZSBVc2VyLU5hbWUsIGluIGEgZm9ybWF0IGNvbnNpc3RlbnQgd2l0aCB0aGUgTkFJCisJCQkJc3BlY2lmaWNhdGlvbiBbUkZDNDI4Ml0uCisJCQkqLworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTEsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiVXNlci1OYW1lIiwgCQkJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgVVRGOFN0cmluZ190eXBlLCBOVUxMKTsKKwkJfQorCQkKKwkJLyogVGVybWluYXRpb24tQ2F1c2UgKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgVGVybWluYXRpb24tQ2F1c2UgQVZQIChBVlAgQ29kZSAyOTUpIGlzIG9mIHR5cGUgRW51bWVyYXRlZCwgYW5kCisJCQkJaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGUgcmVhc29uIHdoeSBhIHNlc3Npb24gd2FzIHRlcm1pbmF0ZWQgb24gdGhlCisJCQkJYWNjZXNzIGRldmljZS4gIFRoZSBmb2xsb3dpbmcgdmFsdWVzIGFyZSBkZWZpbmVkOgorCisKKwkJCQlESUFNRVRFUl9MT0dPVVQgMQorCisJCQkJVGhlIHVzZXIgaW5pdGlhdGVkIGEgZGlzY29ubmVjdAorCisKKwkJCQlESUFNRVRFUl9TRVJWSUNFX05PVF9QUk9WSURFRCAyCisKKwkJCQlUaGlzIHZhbHVlIGlzIHVzZWQgd2hlbiB0aGUgdXNlciBkaXNjb25uZWN0ZWQgcHJpb3IgdG8gdGhlIHJlY2VpcHQKKwkJCQlvZiB0aGUgYXV0aG9yaXphdGlvbiBhbnN3ZXIgbWVzc2FnZS4KKworCisJCQkJRElBTUVURVJfQkFEX0FOU1dFUiAzCisKKwkJCQlUaGlzIHZhbHVlIGluZGljYXRlcyB0aGF0IHRoZSBhdXRob3JpemF0aW9uIGFuc3dlciByZWNlaXZlZCBieSB0aGUKKwkJCQlhY2Nlc3MgZGV2aWNlIHdhcyBub3QgcHJvY2Vzc2VkIHN1Y2Nlc3NmdWxseS4KKworCisJCQkJRElBTUVURVJfQURNSU5JU1RSQVRJVkUgNAorCisJCQkJVGhlIHVzZXIgd2FzIG5vdCBncmFudGVkIGFjY2Vzcywgb3Igd2FzIGRpc2Nvbm5lY3RlZCwgZHVlIHRvCisJCQkJYWRtaW5pc3RyYXRpdmUgcmVhc29ucywgc3VjaCBhcyB0aGUgcmVjZWlwdCBvZiBhIEFib3J0LVNlc3Npb24tCisJCQkJUmVxdWVzdCBtZXNzYWdlLgorCisKKwkJCQlESUFNRVRFUl9MSU5LX0JST0tFTiA1CisKKwkJCQlUaGUgY29tbXVuaWNhdGlvbiB0byB0aGUgdXNlciB3YXMgYWJydXB0bHkgZGlzY29ubmVjdGVkLgorCisKKwkJCQlESUFNRVRFUl9BVVRIX0VYUElSRUQgNgorCisJCQkJVGhlIHVzZXIncyBhY2Nlc3Mgd2FzIHRlcm1pbmF0ZWQgc2luY2UgaXRzIGF1dGhvcml6ZWQgc2Vzc2lvbiB0aW1lCisJCQkJaGFzIGV4cGlyZWQuCisKKworCQkJCURJQU1FVEVSX1VTRVJfTU9WRUQgNworCisJCQkJVGhlIHVzZXIgaXMgcmVjZWl2aW5nIHNlcnZpY2VzIGZyb20gYW5vdGhlciBhY2Nlc3MgZGV2aWNlLgorCisKKwkJCQlESUFNRVRFUl9TRVNTSU9OX1RJTUVPVVQgOAorCisJCQkJVGhlIHVzZXIncyBzZXNzaW9uIGhhcyB0aW1lZCBvdXQsIGFuZCBzZXJ2aWNlIGhhcyBiZWVuIHRlcm1pbmF0ZWQuCisJCQkqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0IAkqIAl0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSAJdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwJIkVudW1lcmF0ZWQoVGVybWluYXRpb24tQ2F1c2UpIgksIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAJdF8xID0geyAiRElBTUVURVJfTE9HT1VUIiwJCQl7IC5pMzIgPSAxIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIAl0XzIgPSB7ICJESUFNRVRFUl9TRVJWSUNFX05PVF9QUk9WSURFRCIsIAl7IC5pMzIgPSAyIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIAl0XzMgPSB7ICJESUFNRVRFUl9CQURfQU5TV0VSIiwJCQl7IC5pMzIgPSAzIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIAl0XzQgPSB7ICJESUFNRVRFUl9BRE1JTklTVFJBVElWRSIsIAkJeyAuaTMyID0gNCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAJdF81ID0geyAiRElBTUVURVJfTElOS19CUk9LRU4iLAkJCXsgLmkzMiA9IDUgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgCXRfNiA9IHsgIkRJQU1FVEVSX0FVVEhfRVhQSVJFRCIsIAkJeyAuaTMyID0gNiB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAJdF83ID0geyAiRElBTUVURVJfVVNFUl9NT1ZFRCIsCQkJeyAuaTMyID0gNyB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAJdF84ID0geyAiRElBTUVURVJfU0VTU0lPTl9USU1FT1VUIiwgCQl7IC5pMzIgPSA4IH19OworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgCWRhdGEgPSB7IAorCQkJCQkyOTUsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiVGVybWluYXRpb24tQ2F1c2UiLAkJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX0lOVEVHRVIzMiAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSAsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEgLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIgLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzMgLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzQgLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzUgLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzYgLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzcgLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzggLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCB0eXBlLCBOVUxMKTsKKwkJfQorCQkKKwkJLyogT3JpZ2luLVN0YXRlLUlkICovCisJCXsKKwkJCS8qCisJCQkJVGhlIE9yaWdpbi1TdGF0ZS1JZCBBVlAgKEFWUCBDb2RlIDI3OCksIG9mIHR5cGUgVW5zaWduZWQzMiwgaXMgYQorCQkJCW1vbm90b25pY2FsbHkgaW5jcmVhc2luZyB2YWx1ZSB0aGF0IGlzIGFkdmFuY2VkIHdoZW5ldmVyIGEgRGlhbWV0ZXIKKwkJCQllbnRpdHkgcmVzdGFydHMgd2l0aCBsb3NzIG9mIHByZXZpb3VzIHN0YXRlLCBmb3IgZXhhbXBsZSB1cG9uIHJlYm9vdC4KKwkJCQlPcmlnaW4tU3RhdGUtSWQgTUFZIGJlIGluY2x1ZGVkIGluIGFueSBEaWFtZXRlciBtZXNzYWdlLCBpbmNsdWRpbmcKKwkJCQlDRVIuCisKKwkJCQlBIERpYW1ldGVyIGVudGl0eSBpc3N1aW5nIHRoaXMgQVZQIE1VU1QgY3JlYXRlIGEgaGlnaGVyIHZhbHVlIGZvcgorCQkJCXRoaXMgQVZQIGVhY2ggdGltZSBpdHMgc3RhdGUgaXMgcmVzZXQuICBBIERpYW1ldGVyIGVudGl0eSBNQVkgc2V0CisJCQkJT3JpZ2luLVN0YXRlLUlkIHRvIHRoZSB0aW1lIG9mIHN0YXJ0dXAsIG9yIGl0IE1BWSB1c2UgYW4gaW5jcmVtZW50aW5nCisJCQkJY291bnRlciByZXRhaW5lZCBpbiBub24tdm9sYXRpbGUgbWVtb3J5IGFjcm9zcyByZXN0YXJ0cy4KKworCQkJCVRoZSBPcmlnaW4tU3RhdGUtSWQsIGlmIHByZXNlbnQsIE1VU1QgcmVmbGVjdCB0aGUgc3RhdGUgb2YgdGhlIGVudGl0eQorCQkJCWluZGljYXRlZCBieSBPcmlnaW4tSG9zdC4gIElmIGEgcHJveHkgbW9kaWZpZXMgT3JpZ2luLUhvc3QsIGl0IE1VU1QKKwkJCQllaXRoZXIgcmVtb3ZlIE9yaWdpbi1TdGF0ZS1JZCBvciBtb2RpZnkgaXQgYXBwcm9wcmlhdGVseSBhcyB3ZWxsLgorCQkJCVR5cGljYWxseSwgT3JpZ2luLVN0YXRlLUlkIGlzIHVzZWQgYnkgYW4gYWNjZXNzIGRldmljZSB0aGF0IGFsd2F5cworCQkJCXN0YXJ0cyB1cCB3aXRoIG5vIGFjdGl2ZSBzZXNzaW9uczsgdGhhdCBpcywgYW55IHNlc3Npb24gYWN0aXZlIHByaW9yCisJCQkJdG8gcmVzdGFydCB3aWxsIGhhdmUgYmVlbiBsb3N0LiAgQnkgaW5jbHVkaW5nIE9yaWdpbi1TdGF0ZS1JZCBpbiBhCisJCQkJbWVzc2FnZSwgaXQgYWxsb3dzIG90aGVyIERpYW1ldGVyIGVudGl0aWVzIHRvIGluZmVyIHRoYXQgc2Vzc2lvbnMKKwkJCQlhc3NvY2lhdGVkIHdpdGggYSBsb3dlciBPcmlnaW4tU3RhdGUtSWQgYXJlIG5vIGxvbmdlciBhY3RpdmUuICBJZiBhbgorCQkJCWFjY2VzcyBkZXZpY2UgZG9lcyBub3QgaW50ZW5kIGZvciBzdWNoIGluZmVyZW5jZXMgdG8gYmUgbWFkZSwgaXQgTVVTVAorCQkJCWVpdGhlciBub3QgaW5jbHVkZSBPcmlnaW4tU3RhdGUtSWQgaW4gYW55IG1lc3NhZ2UsIG9yIHNldCBpdHMgdmFsdWUKKwkJCQl0byAwLgorCQkJKi8KKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQkJCQkyNzgsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiT3JpZ2luLVN0YXRlLUlkIiwgCQkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfVU5TSUdORUQzMiAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIE5VTEwsIE5VTEwpOworCQl9CisJCQorCQkvKiBTZXNzaW9uLUJpbmRpbmcgKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgU2Vzc2lvbi1CaW5kaW5nIEFWUCAoQVZQIENvZGUgMjcwKSBpcyBvZiB0eXBlIFVuc2lnbmVkMzIsIGFuZCBNQVkKKwkJCQliZSBwcmVzZW50IGluIGFwcGxpY2F0aW9uLXNwZWNpZmljIGF1dGhvcml6YXRpb24gYW5zd2VyIG1lc3NhZ2VzLiAgSWYKKwkJCQlwcmVzZW50LCB0aGlzIEFWUCBNQVkgaW5mb3JtIHRoZSBEaWFtZXRlciBjbGllbnQgdGhhdCBhbGwgZnV0dXJlCisJCQkJYXBwbGljYXRpb24tc3BlY2lmaWMgcmUtYXV0aCBtZXNzYWdlcyBmb3IgdGhpcyBzZXNzaW9uIE1VU1QgYmUgc2VudAorCQkJCXRvIHRoZSBzYW1lIGF1dGhvcml6YXRpb24gc2VydmVyLiAgVGhpcyBBVlAgTUFZIGFsc28gc3BlY2lmeSB0aGF0IGEKKwkJCQlTZXNzaW9uLVRlcm1pbmF0aW9uLVJlcXVlc3QgbWVzc2FnZSBmb3IgdGhpcyBzZXNzaW9uIE1VU1QgYmUgc2VudCB0bworCQkJCXRoZSBzYW1lIGF1dGhvcml6aW5nIHNlcnZlci4KKworCQkJCVRoaXMgZmllbGQgaXMgYSBiaXQgbWFzaywgYW5kIHRoZSBmb2xsb3dpbmcgYml0cyBoYXZlIGJlZW4gZGVmaW5lZDoKKworCisJCQkJUkVfQVVUSCAxCisKKwkJCQlXaGVuIHNldCwgZnV0dXJlIHJlLWF1dGggbWVzc2FnZXMgZm9yIHRoaXMgc2Vzc2lvbiBNVVNUIE5PVAorCQkJCWluY2x1ZGUgdGhlIERlc3RpbmF0aW9uLUhvc3QgQVZQLiAgV2hlbiBjbGVhcmVkLCB0aGUgZGVmYXVsdAorCQkJCXZhbHVlLCB0aGUgRGVzdGluYXRpb24tSG9zdCBBVlAgTVVTVCBiZSBwcmVzZW50IGluIGFsbCByZS1hdXRoCisJCQkJbWVzc2FnZXMgZm9yIHRoaXMgc2Vzc2lvbi4KKworCisJCQkJU1RSIDIKKworCQkJCVdoZW4gc2V0LCB0aGUgU1RSIG1lc3NhZ2UgZm9yIHRoaXMgc2Vzc2lvbiBNVVNUIE5PVCBpbmNsdWRlIHRoZQorCQkJCURlc3RpbmF0aW9uLUhvc3QgQVZQLiAgV2hlbiBjbGVhcmVkLCB0aGUgZGVmYXVsdCB2YWx1ZSwgdGhlCisJCQkJRGVzdGluYXRpb24tSG9zdCBBVlAgTVVTVCBiZSBwcmVzZW50IGluIHRoZSBTVFIgbWVzc2FnZSBmb3IgdGhpcworCQkJCXNlc3Npb24uCisKKworCQkJCUFDQ09VTlRJTkcgNAorCisJCQkJV2hlbiBzZXQsIGFsbCBhY2NvdW50aW5nIG1lc3NhZ2VzIGZvciB0aGlzIHNlc3Npb24gTVVTVCBOT1QKKwkJCQlpbmNsdWRlIHRoZSBEZXN0aW5hdGlvbi1Ib3N0IEFWUC4gIFdoZW4gY2xlYXJlZCwgdGhlIGRlZmF1bHQKKwkJCQl2YWx1ZSwgdGhlIERlc3RpbmF0aW9uLUhvc3QgQVZQLCBpZiBrbm93biwgTVVTVCBiZSBwcmVzZW50IGluIGFsbAorCQkJCWFjY291bnRpbmcgbWVzc2FnZXMgZm9yIHRoaXMgc2Vzc2lvbi4KKwkJCSovCisJCQkKKwkJCS8qIEFsdGhvdWdoIHRoZSBSRkMgZG9lcyBub3Qgc3BlY2lmeSBhbiAiRW51bWVyYXRlZCIgdHlwZSBoZXJlLCB3ZSBnbyBmb3J3YXJkIGFuZCBjcmVhdGUgb25lLgorCQkJICogVGhpcyBpcyB0aGUgcmVhc29uIGZvciB0aGUgIioiIGluIHRoZSB0eXBlIG5hbWUKKwkJCSAqIFRoZSBhY3R1YWwgdmFsdWVzIG9mIHRoZSBBVlAgd2lsbCBub3QgYWx3YXlzIGJlIGRlZmluZWQgaGVyZSwgYnV0IGF0IGxlYXN0IGl0IGNhbiBiZSB1c2VkIGluIHNvbWUgY2FzZXMuCisJCQkgKiAgLi4uIG1heWJlIHRoZSBjb2RlIHdpbGwgYmUgY2hhbmdlZCBsYXRlciB0byBzdXBwb3J0IGJpdGZpZWxkcyBBVlAgLi4uCisJCQkgKi8KKwkJCQorCQkJc3RydWN0IGRpY3Rfb2JqZWN0IAkqIAl0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSAJdGRhdGEgPSB7IEFWUF9UWVBFX1VOU0lHTkVEMzIsCSJFbnVtZXJhdGVkKFNlc3Npb24tQmluZGluZykiCSwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIAl0XzEgPSB7ICJSRV9BVVRIIiwgCQl7IC51MzIgPSAxIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIAl0XzIgPSB7ICJTVFIiLCAJCQl7IC51MzIgPSAyIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIAl0XzQgPSB7ICJBQ0NPVU5USU5HIiwgCQl7IC51MzIgPSA0IH19OworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgCWRhdGEgPSB7IAorCQkJCQkyNzAsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiU2Vzc2lvbi1CaW5kaW5nIiwgCQkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfVU5TSUdORUQzMiAJCQkvKiBiYXNlIHR5cGUgb2YgZGF0YSAqLworCQkJCQl9OworCQkJLyogQ3JlYXRlIHRoZSBFbnVtZXJhdGVkIHR5cGUsIGFuZCB0aGVuIHRoZSBBVlAgKi8KKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX1RZUEUsICZ0ZGF0YSAsIE5VTEwsICZ0eXBlKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzEgLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzIgLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0VOVU1WQUwsICZ0XzQgLCB0eXBlLCBOVUxMKTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCB0eXBlLCBOVUxMKTsKKwkJfQorCQkKKwkJLyogU2Vzc2lvbi1TZXJ2ZXItRmFpbG92ZXIgKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgU2Vzc2lvbi1TZXJ2ZXItRmFpbG92ZXIgQVZQIChBVlAgQ29kZSAyNzEpIGlzIG9mIHR5cGUgRW51bWVyYXRlZCwKKwkJCQlhbmQgTUFZIGJlIHByZXNlbnQgaW4gYXBwbGljYXRpb24tc3BlY2lmaWMgYXV0aG9yaXphdGlvbiBhbnN3ZXIKKwkJCQltZXNzYWdlcyB0aGF0IGVpdGhlciBkbyBub3QgaW5jbHVkZSB0aGUgU2Vzc2lvbi1CaW5kaW5nIEFWUCBvcgorCQkJCWluY2x1ZGUgdGhlIFNlc3Npb24tQmluZGluZyBBVlAgd2l0aCBhbnkgb2YgdGhlIGJpdHMgc2V0IHRvIGEgemVybworCQkJCXZhbHVlLiAgSWYgcHJlc2VudCwgdGhpcyBBVlAgTUFZIGluZm9ybSB0aGUgRGlhbWV0ZXIgY2xpZW50IHRoYXQgaWYgYQorCQkJCXJlLWF1dGggb3IgU1RSIG1lc3NhZ2UgZmFpbHMgZHVlIHRvIGEgZGVsaXZlcnkgcHJvYmxlbSwgdGhlIERpYW1ldGVyCisJCQkJY2xpZW50IFNIT1VMRCBpc3N1ZSBhIHN1YnNlcXVlbnQgbWVzc2FnZSB3aXRob3V0IHRoZSBEZXN0aW5hdGlvbi1Ib3N0CisJCQkJQVZQLiAgV2hlbiBhYnNlbnQsIHRoZSBkZWZhdWx0IHZhbHVlIGlzIFJFRlVTRV9TRVJWSUNFLgorCisJCQkJVGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIHN1cHBvcnRlZDoKKworCisJCQkJUkVGVVNFX1NFUlZJQ0UgMAorCisJCQkJSWYgZWl0aGVyIHRoZSByZS1hdXRoIG9yIHRoZSBTVFIgbWVzc2FnZSBkZWxpdmVyeSBmYWlscywgdGVybWluYXRlCisJCQkJc2VydmljZSB3aXRoIHRoZSB1c2VyLCBhbmQgZG8gbm90IGF0dGVtcHQgYW55IHN1YnNlcXVlbnQgYXR0ZW1wdHMuCisKKworCQkJCVRSWV9BR0FJTiAxCisKKwkJCQlJZiBlaXRoZXIgdGhlIHJlLWF1dGggb3IgdGhlIFNUUiBtZXNzYWdlIGRlbGl2ZXJ5IGZhaWxzLCByZXNlbmQKKwkJCQl0aGUgZmFpbGVkIG1lc3NhZ2Ugd2l0aG91dCB0aGUgRGVzdGluYXRpb24tSG9zdCBBVlAgcHJlc2VudC4KKworCisJCQkJQUxMT1dfU0VSVklDRSAyCisKKwkJCQlJZiByZS1hdXRoIG1lc3NhZ2UgZGVsaXZlcnkgZmFpbHMsIGFzc3VtZSB0aGF0IHJlLWF1dGhvcml6YXRpb24KKwkJCQlzdWNjZWVkZWQuICBJZiBTVFIgbWVzc2FnZSBkZWxpdmVyeSBmYWlscywgdGVybWluYXRlIHRoZSBzZXNzaW9uLgorCisKKwkJCQlUUllfQUdBSU5fQUxMT1dfU0VSVklDRSAzCisKKwkJCQlJZiBlaXRoZXIgdGhlIHJlLWF1dGggb3IgdGhlIFNUUiBtZXNzYWdlIGRlbGl2ZXJ5IGZhaWxzLCByZXNlbmQKKwkJCQl0aGUgZmFpbGVkIG1lc3NhZ2Ugd2l0aG91dCB0aGUgRGVzdGluYXRpb24tSG9zdCBBVlAgcHJlc2VudC4gIElmCisJCQkJdGhlIHNlY29uZCBkZWxpdmVyeSBmYWlscyBmb3IgcmUtYXV0aCwgYXNzdW1lIHJlLWF1dGhvcml6YXRpb24KKwkJCQlzdWNjZWVkZWQuICBJZiB0aGUgc2Vjb25kIGRlbGl2ZXJ5IGZhaWxzIGZvciBTVFIsIHRlcm1pbmF0ZSB0aGUKKwkJCQlzZXNzaW9uLgorCQkJKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgCSogCXR5cGU7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJIAl0ZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLAkiRW51bWVyYXRlZChTZXNzaW9uLVNlcnZlci1GYWlsb3ZlcikiCSwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIAl0XzAgPSB7ICJSRUZVU0VfU0VSVklDRSIsIAkJeyAuaTMyID0gMCB9fTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAJdF8xID0geyAiVFJZX0FHQUlOIiwJCQl7IC5pMzIgPSAxIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIAl0XzIgPSB7ICJBTExPV19TRVJWSUNFIiwgCQl7IC5pMzIgPSAyIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIAl0XzMgPSB7ICJUUllfQUdBSU5fQUxMT1dfU0VSVklDRSIsCXsgLmkzMiA9IDMgfX07CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YQkgCWRhdGEgPSB7IAorCQkJCQkyNzEsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiU2Vzc2lvbi1TZXJ2ZXItRmFpbG92ZXIiLAkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfSU5URUdFUjMyIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhICwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMCAsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSAsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiAsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMyAsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIHR5cGUsIE5VTEwpOworCQl9CisJCQorCQkvKiBNdWx0aS1Sb3VuZC1UaW1lLU91dCAqLworCQl7CisJCQkvKgorCQkJCVRoZSBNdWx0aS1Sb3VuZC1UaW1lLU91dCBBVlAgKEFWUCBDb2RlIDI3MikgaXMgb2YgdHlwZSBVbnNpZ25lZDMyLAorCQkJCWFuZCBTSE9VTEQgYmUgcHJlc2VudCBpbiBhcHBsaWNhdGlvbi1zcGVjaWZpYyBhdXRob3JpemF0aW9uIGFuc3dlcgorCQkJCW1lc3NhZ2VzIHdob3NlIFJlc3VsdC1Db2RlIEFWUCBpcyBzZXQgdG8gRElBTUVURVJfTVVMVElfUk9VTkRfQVVUSC4KKwkJCQlUaGlzIEFWUCBjb250YWlucyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2Vjb25kcyB0aGF0IHRoZSBhY2Nlc3MKKwkJCQlkZXZpY2UgTVVTVCBwcm92aWRlIHRoZSB1c2VyIGluIHJlc3BvbmRpbmcgdG8gYW4gYXV0aGVudGljYXRpb24KKwkJCQlyZXF1ZXN0LgorCQkJKi8KKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQkJCQkyNzIsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiTXVsdGktUm91bmQtVGltZS1PdXQiLCAJCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCQkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9VTlNJR05FRDMyIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgTlVMTCk7CisJCX0KKwkJCisJCS8qIENsYXNzICovCisJCXsKKwkJCS8qCisJCQkJVGhlIENsYXNzIEFWUCAoQVZQIENvZGUgMjUpIGlzIG9mIHR5cGUgT2N0ZXRTdHJpbmcgYW5kIGlzIHVzZWQgdG8gYnkKKwkJCQlEaWFtZXRlciBzZXJ2ZXJzIHRvIHJldHVybiBzdGF0ZSBpbmZvcm1hdGlvbiB0byB0aGUgYWNjZXNzIGRldmljZS4KKwkJCQlXaGVuIG9uZSBvciBtb3JlIENsYXNzIEFWUHMgYXJlIHByZXNlbnQgaW4gYXBwbGljYXRpb24tc3BlY2lmaWMKKwkJCQlhdXRob3JpemF0aW9uIGFuc3dlciBtZXNzYWdlcywgdGhleSBNVVNUIGJlIHByZXNlbnQgaW4gc3Vic2VxdWVudCByZS0KKwkJCQlhdXRob3JpemF0aW9uLCBzZXNzaW9uIHRlcm1pbmF0aW9uIGFuZCBhY2NvdW50aW5nIG1lc3NhZ2VzLiAgQ2xhc3MKKwkJCQlBVlBzIGZvdW5kIGluIGEgcmUtYXV0aG9yaXphdGlvbiBhbnN3ZXIgbWVzc2FnZSBvdmVycmlkZSB0aGUgb25lcworCQkJCWZvdW5kIGluIGFueSBwcmV2aW91cyBhdXRob3JpemF0aW9uIGFuc3dlciBtZXNzYWdlLiAgRGlhbWV0ZXIgc2VydmVyCisJCQkJaW1wbGVtZW50YXRpb25zIFNIT1VMRCBOT1QgcmV0dXJuIENsYXNzIEFWUHMgdGhhdCByZXF1aXJlIG1vcmUgdGhhbgorCQkJCTQwOTYgYnl0ZXMgb2Ygc3RvcmFnZSBvbiB0aGUgRGlhbWV0ZXIgY2xpZW50LiAgQSBEaWFtZXRlciBjbGllbnQgdGhhdAorCQkJCXJlY2VpdmVzIENsYXNzIEFWUHMgd2hvc2Ugc2l6ZSBleGNlZWRzIGxvY2FsIGF2YWlsYWJsZSBzdG9yYWdlIE1VU1QKKwkJCQl0ZXJtaW5hdGUgdGhlIHNlc3Npb24uCisJCQkqLworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTI1LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIkNsYXNzIiwgCQkJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgTlVMTCk7CisJCX0KKwkJCisJCS8qIEV2ZW50LVRpbWVzdGFtcCAqLworCQl7CisJCQkvKgorCQkJCVRoZSBFdmVudC1UaW1lc3RhbXAgKEFWUCBDb2RlIDU1KSBpcyBvZiB0eXBlIFRpbWUsIGFuZCBNQVkgYmUKKwkJCQlpbmNsdWRlZCBpbiBhbiBBY2NvdW50aW5nLVJlcXVlc3QgYW5kIEFjY291bnRpbmctQW5zd2VyIG1lc3NhZ2VzIHRvCisJCQkJcmVjb3JkIHRoZSB0aW1lIHRoYXQgdGhlIHJlcG9ydGVkIGV2ZW50IG9jY3VycmVkLCBpbiBzZWNvbmRzIHNpbmNlCisJCQkJSmFudWFyeSAxLCAxOTAwIDAwOjAwIFVUQy4KKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJCQkJNTUsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiRXZlbnQtVGltZXN0YW1wIiwgCQkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBUaW1lX3R5cGUsIE5VTEwpOworCQl9CisKKwkJCQkKKwkJLyogQWNjb3VudGluZy1SZWNvcmQtVHlwZSAqLworCQl7CisJCQkvKgorCQkJCVRoZSBBY2NvdW50aW5nLVJlY29yZC1UeXBlIEFWUCAoQVZQIENvZGUgNDgwKSBpcyBvZiB0eXBlIEVudW1lcmF0ZWQKKwkJCQlhbmQgY29udGFpbnMgdGhlIHR5cGUgb2YgYWNjb3VudGluZyByZWNvcmQgYmVpbmcgc2VudC4gIFRoZSBmb2xsb3dpbmcKKwkJCQl2YWx1ZXMgYXJlIGN1cnJlbnRseSBkZWZpbmVkIGZvciB0aGUgQWNjb3VudGluZy1SZWNvcmQtVHlwZSBBVlA6CisKKworCQkJCUVWRU5UX1JFQ09SRCAxCisKKwkJCQlBbiBBY2NvdW50aW5nIEV2ZW50IFJlY29yZCBpcyB1c2VkIHRvIGluZGljYXRlIHRoYXQgYSBvbmUtdGltZQorCQkJCWV2ZW50IGhhcyBvY2N1cnJlZCAobWVhbmluZyB0aGF0IHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBldmVudAorCQkJCWFyZSBzaW11bHRhbmVvdXMpLiAgVGhpcyByZWNvcmQgY29udGFpbnMgYWxsIGluZm9ybWF0aW9uIHJlbGV2YW50CisJCQkJdG8gdGhlIHNlcnZpY2UsIGFuZCBpcyB0aGUgb25seSByZWNvcmQgb2YgdGhlIHNlcnZpY2UuCisKKworCQkJCVNUQVJUX1JFQ09SRCAyCisKKwkJCQlBbiBBY2NvdW50aW5nIFN0YXJ0LCBJbnRlcmltLCBhbmQgU3RvcCBSZWNvcmRzIGFyZSB1c2VkIHRvCisJCQkJaW5kaWNhdGUgdGhhdCBhIHNlcnZpY2Ugb2YgYSBtZWFzdXJhYmxlIGxlbmd0aCBoYXMgYmVlbiBnaXZlbi4gIEFuCisJCQkJQWNjb3VudGluZyBTdGFydCBSZWNvcmQgaXMgdXNlZCB0byBpbml0aWF0ZSBhbiBhY2NvdW50aW5nIHNlc3Npb24sCisJCQkJYW5kIGNvbnRhaW5zIGFjY291bnRpbmcgaW5mb3JtYXRpb24gdGhhdCBpcyByZWxldmFudCB0byB0aGUKKwkJCQlpbml0aWF0aW9uIG9mIHRoZSBzZXNzaW9uLgorCisKKwkJCQlJTlRFUklNX1JFQ09SRCAzCisKKwkJCQlBbiBJbnRlcmltIEFjY291bnRpbmcgUmVjb3JkIGNvbnRhaW5zIGN1bXVsYXRpdmUgYWNjb3VudGluZworCQkJCWluZm9ybWF0aW9uIGZvciBhbiBleGlzdGluZyBhY2NvdW50aW5nIHNlc3Npb24uICBJbnRlcmltCisJCQkJQWNjb3VudGluZyBSZWNvcmRzIFNIT1VMRCBiZSBzZW50IGV2ZXJ5IHRpbWUgYSByZS1hdXRoZW50aWNhdGlvbgorCQkJCW9yIHJlLWF1dGhvcml6YXRpb24gb2NjdXJzLiAgRnVydGhlciwgYWRkaXRpb25hbCBpbnRlcmltIHJlY29yZAorCQkJCXRyaWdnZXJzIE1BWSBiZSBkZWZpbmVkIGJ5IGFwcGxpY2F0aW9uLXNwZWNpZmljIERpYW1ldGVyCisJCQkJYXBwbGljYXRpb25zLiAgVGhlIHNlbGVjdGlvbiBvZiB3aGV0aGVyIHRvIHVzZSBJTlRFUklNX1JFQ09SRAorCQkJCXJlY29yZHMgaXMgZG9uZSBieSB0aGUgQWNjdC1JbnRlcmltLUludGVydmFsIEFWUC4KKworCisJCQkJU1RPUF9SRUNPUkQgNAorCisJCQkJQW4gQWNjb3VudGluZyBTdG9wIFJlY29yZCBpcyBzZW50IHRvIHRlcm1pbmF0ZSBhbiBhY2NvdW50aW5nCisJCQkJc2Vzc2lvbiBhbmQgY29udGFpbnMgY3VtdWxhdGl2ZSBhY2NvdW50aW5nIGluZm9ybWF0aW9uIHJlbGV2YW50IHRvCisJCQkJdGhlIGV4aXN0aW5nIHNlc3Npb24uCisJCQkqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0IAkqIAl0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSAgCXRkYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsCSJFbnVtZXJhdGVkKEFjY291bnRpbmctUmVjb3JkLVR5cGUpIgksIE5VTEwsIE5VTEwsIE5VTEwgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAJdF8xID0geyAiRVZFTlRfUkVDT1JEIiwJCQl7IC5pMzIgPSAxIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIAl0XzIgPSB7ICJTVEFSVF9SRUNPUkQiLCAJCXsgLmkzMiA9IDIgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgCXRfMyA9IHsgIklOVEVSSU1fUkVDT1JEIiwJCXsgLmkzMiA9IDMgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgCXRfNCA9IHsgIlNUT1BfUkVDT1JEIiwgCQkJeyAuaTMyID0gNCB9fTsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIAlkYXRhID0geyAKKwkJCQkJNDgwLCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIkFjY291bnRpbmctUmVjb3JkLVR5cGUiLAkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfSU5URUdFUjMyIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQkvKiBDcmVhdGUgdGhlIEVudW1lcmF0ZWQgdHlwZSwgYW5kIHRoZW4gdGhlIEFWUCAqLworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfVFlQRSwgJnRkYXRhICwgTlVMTCwgJnR5cGUpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMSAsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMiAsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfMyAsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfRU5VTVZBTCwgJnRfNCAsIHR5cGUsIE5VTEwpOworCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQVZQLCAmZGF0YSAsIHR5cGUsIE5VTEwpOworCQl9CisJCQorCQkvKiBBY2N0LUludGVyaW0tSW50ZXJ2YWwgKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgQWNjdC1JbnRlcmltLUludGVydmFsIEFWUCAoQVZQIENvZGUgODUpIGlzIG9mIHR5cGUgVW5zaWduZWQzMiBhbmQKKwkJCQlpcyBzZW50IGZyb20gdGhlIERpYW1ldGVyIGhvbWUgYXV0aG9yaXphdGlvbiBzZXJ2ZXIgdG8gdGhlIERpYW1ldGVyCisJCQkJY2xpZW50LiAgVGhlIGNsaWVudCB1c2VzIGluZm9ybWF0aW9uIGluIHRoaXMgQVZQIHRvIGRlY2lkZSBob3cgYW5kCisJCQkJd2hlbiB0byBwcm9kdWNlIGFjY291bnRpbmcgcmVjb3Jkcy4gIFdpdGggZGlmZmVyZW50IHZhbHVlcyBpbiB0aGlzCisJCQkJQVZQLCBzZXJ2aWNlIHNlc3Npb25zIGNhbiByZXN1bHQgaW4gb25lLCB0d28sIG9yIHR3bytOIGFjY291bnRpbmcKKwkJCQlyZWNvcmRzLCBiYXNlZCBvbiB0aGUgbmVlZHMgb2YgdGhlIGhvbWUtb3JnYW5pemF0aW9uLiAgVGhlIGZvbGxvd2luZworCQkJCWFjY291bnRpbmcgcmVjb3JkIHByb2R1Y3Rpb24gYmVoYXZpb3IgaXMgZGlyZWN0ZWQgYnkgdGhlIGluY2x1c2lvbiBvZgorCQkJCXRoaXMgQVZQOgorCisKKwkJCQkxLiAgVGhlIG9taXNzaW9uIG9mIHRoZSBBY2N0LUludGVyaW0tSW50ZXJ2YWwgQVZQIG9yIGl0cyBpbmNsdXNpb24KKwkJCQl3aXRoIFZhbHVlIGZpZWxkIHNldCB0byAwIG1lYW5zIHRoYXQgRVZFTlRfUkVDT1JELCBTVEFSVF9SRUNPUkQsCisJCQkJYW5kIFNUT1BfUkVDT1JEIGFyZSBwcm9kdWNlZCwgYXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBzZXJ2aWNlLgorCisKKwkJCQkyLiAgVGhlIGluY2x1c2lvbiBvZiB0aGUgQVZQIHdpdGggVmFsdWUgZmllbGQgc2V0IHRvIGEgbm9uLXplcm8gdmFsdWUKKwkJCQltZWFucyB0aGF0IElOVEVSSU1fUkVDT1JEIHJlY29yZHMgTVVTVCBiZSBwcm9kdWNlZCBiZXR3ZWVuIHRoZQorCQkJCVNUQVJUX1JFQ09SRCBhbmQgU1RPUF9SRUNPUkQgcmVjb3Jkcy4gIFRoZSBWYWx1ZSBmaWVsZCBvZiB0aGlzCisJCQkJQVZQIGlzIHRoZSBub21pbmFsIGludGVydmFsIGJldHdlZW4gdGhlc2UgcmVjb3JkcyBpbiBzZWNvbmRzLgorCisJCQkJVGhlIERpYW1ldGVyIG5vZGUgdGhhdCBvcmlnaW5hdGVzIHRoZSBhY2NvdW50aW5nIGluZm9ybWF0aW9uLAorCQkJCWtub3duIGFzIHRoZSBjbGllbnQsIE1VU1QgcHJvZHVjZSB0aGUgZmlyc3QgSU5URVJJTV9SRUNPUkQgcmVjb3JkCisJCQkJcm91Z2hseSBhdCB0aGUgdGltZSB3aGVuIHRoaXMgbm9taW5hbCBpbnRlcnZhbCBoYXMgZWxhcHNlZCBmcm9tCisJCQkJdGhlIFNUQVJUX1JFQ09SRCwgdGhlIG5leHQgb25lIGFnYWluIGFzIHRoZSBpbnRlcnZhbCBoYXMgZWxhcHNlZAorCQkJCW9uY2UgbW9yZSwgYW5kIHNvIG9uIHVudGlsIHRoZSBzZXNzaW9uIGVuZHMgYW5kIGEgU1RPUF9SRUNPUkQKKwkJCQlyZWNvcmQgaXMgcHJvZHVjZWQuCisKKwkJCQlUaGUgY2xpZW50IE1VU1QgZW5zdXJlIHRoYXQgdGhlIGludGVyaW0gcmVjb3JkIHByb2R1Y3Rpb24gdGltZXMKKwkJCQlhcmUgcmFuZG9taXplZCBzbyB0aGF0IGxhcmdlIGFjY291bnRpbmcgbWVzc2FnZSBzdG9ybXMgYXJlIG5vdAorCQkJCWNyZWF0ZWQgZWl0aGVyIGFtb25nIHJlY29yZHMgb3IgYXJvdW5kIGEgY29tbW9uIHNlcnZpY2Ugc3RhcnQKKwkJCQl0aW1lLgorCQkJKi8KKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQkJCQk4NSwgCQkJCQkvKiBDb2RlICovCisJCQkJCTAsIAkJCQkJLyogVmVuZG9yICovCisJCQkJCSJBY2N0LUludGVyaW0tSW50ZXJ2YWwiLCAJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX1VOU0lHTkVEMzIgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCBOVUxMKTsKKwkJfQorCQkKKwkJLyogQWNjb3VudGluZy1SZWNvcmQtTnVtYmVyICovCisJCXsKKwkJCS8qCisJCQkJVGhlIEFjY291bnRpbmctUmVjb3JkLU51bWJlciBBVlAgKEFWUCBDb2RlIDQ4NSkgaXMgb2YgdHlwZSBVbnNpZ25lZDMyCisJCQkJYW5kIGlkZW50aWZpZXMgdGhpcyByZWNvcmQgd2l0aGluIG9uZSBzZXNzaW9uLiAgQXMgU2Vzc2lvbi1JZCBBVlBzCisJCQkJYXJlIGdsb2JhbGx5IHVuaXF1ZSwgdGhlIGNvbWJpbmF0aW9uIG9mIFNlc3Npb24tSWQgYW5kIEFjY291bnRpbmctCisJCQkJUmVjb3JkLU51bWJlciBBVlBzIGlzIGFsc28gZ2xvYmFsbHkgdW5pcXVlLCBhbmQgY2FuIGJlIHVzZWQgaW4KKwkJCQltYXRjaGluZyBhY2NvdW50aW5nIHJlY29yZHMgd2l0aCBjb25maXJtYXRpb25zLiAgQW4gZWFzeSB3YXkgdG8KKwkJCQlwcm9kdWNlIHVuaXF1ZSBudW1iZXJzIGlzIHRvIHNldCB0aGUgdmFsdWUgdG8gMCBmb3IgcmVjb3JkcyBvZiB0eXBlCisJCQkJRVZFTlRfUkVDT1JEIGFuZCBTVEFSVF9SRUNPUkQsIGFuZCBzZXQgdGhlIHZhbHVlIHRvIDEgZm9yIHRoZSBmaXJzdAorCQkJCUlOVEVSSU1fUkVDT1JELCAyIGZvciB0aGUgc2Vjb25kLCBhbmQgc28gb24gdW50aWwgdGhlIHZhbHVlIGZvcgorCQkJCVNUT1BfUkVDT1JEIGlzIG9uZSBtb3JlIHRoYW4gZm9yIHRoZSBsYXN0IElOVEVSSU1fUkVDT1JELgorCQkJKi8KKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRhdGEgPSB7IAorCQkJCQk0ODUsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiQWNjb3VudGluZy1SZWNvcmQtTnVtYmVyIiwgCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCQkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9VTlNJR05FRDMyIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgTlVMTCk7CisJCX0KKwkJCisJCS8qIEFjY3QtU2Vzc2lvbi1JZCAqLworCQl7CisJCQkvKgorCQkJCVRoZSBBY2N0LVNlc3Npb24tSWQgQVZQIChBVlAgQ29kZSA0NCkgaXMgb2YgdHlwZSBPY3RldFN0cmluZyBpcyBvbmx5CisJCQkJdXNlZCB3aGVuIFJBRElVUy9EaWFtZXRlciB0cmFuc2xhdGlvbiBvY2N1cnMuICBUaGlzIEFWUCBjb250YWlucyB0aGUKKwkJCQljb250ZW50cyBvZiB0aGUgUkFESVVTIEFjY3QtU2Vzc2lvbi1JZCBhdHRyaWJ1dGUuCisJCQkqLworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTQ0LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIkFjY3QtU2Vzc2lvbi1JZCIsIAkJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX09DVEVUU1RSSU5HIAkJCS8qIGJhc2UgdHlwZSBvZiBkYXRhICovCisJCQkJCX07CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgTlVMTCwgTlVMTCk7CisJCX0KKwkJCisJCS8qIEFjY3QtTXVsdGktU2Vzc2lvbi1JZCAqLworCQl7CisJCQkvKgorCQkJCVRoZSBBY2N0LU11bHRpLVNlc3Npb24tSWQgQVZQIChBVlAgQ29kZSA1MCkgaXMgb2YgdHlwZSBVVEY4U3RyaW5nLAorCQkJCWZvbGxvd2luZyB0aGUgZm9ybWF0IHNwZWNpZmllZCBpbiBTZWN0aW9uIDguOC4gIFRoZSBBY2N0LU11bHRpLQorCQkJCVNlc3Npb24tSWQgQVZQIGlzIHVzZWQgdG8gbGluayB0b2dldGhlciBtdWx0aXBsZSByZWxhdGVkIGFjY291bnRpbmcKKwkJCQlzZXNzaW9ucywgd2hlcmUgZWFjaCBzZXNzaW9uIHdvdWxkIGhhdmUgYSB1bmlxdWUgU2Vzc2lvbi1JZCwgYnV0IHRoZQorCQkJCXNhbWUgQWNjdC1NdWx0aS1TZXNzaW9uLUlkIEFWUC4gIFRoaXMgQVZQIE1BWSBiZSByZXR1cm5lZCBieSB0aGUKKwkJCQlEaWFtZXRlciBzZXJ2ZXIgaW4gYW4gYXV0aG9yaXphdGlvbiBhbnN3ZXIsIGFuZCBNVVNUIGJlIHVzZWQgaW4gYWxsCisJCQkJYWNjb3VudGluZyBtZXNzYWdlcyBmb3IgdGhlIGdpdmVuIHNlc3Npb24uCisJCQkqLworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YSA9IHsgCisJCQkJCTUwLCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIkFjY3QtTXVsdGktU2Vzc2lvbi1JZCIsIAkJLyogTmFtZSAqLworCQkJCQlBVlBfRkxBR19WRU5ET1IgfCBBVlBfRkxBR19NQU5EQVRPUlksIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlBVlBfRkxBR19NQU5EQVRPUlksCQkJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJQVZQX1RZUEVfT0NURVRTVFJJTkcgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBVVEY4U3RyaW5nX3R5cGUsIE5VTEwpOworCQl9CisJCQorCQkvKiBBY2NvdW50aW5nLVN1Yi1TZXNzaW9uLUlkICovCisJCXsKKwkJCS8qCisJCQkJVGhlIEFjY291bnRpbmctU3ViLVNlc3Npb24tSWQgQVZQIChBVlAgQ29kZSAyODcpIGlzIG9mIHR5cGUKKwkJCQlVbnNpZ25lZDY0IGFuZCBjb250YWlucyB0aGUgYWNjb3VudGluZyBzdWItc2Vzc2lvbiBpZGVudGlmaWVyLiAgVGhlCisJCQkJY29tYmluYXRpb24gb2YgdGhlIFNlc3Npb24tSWQgYW5kIHRoaXMgQVZQIE1VU1QgYmUgdW5pcXVlIHBlciBzdWItCisJCQkJc2Vzc2lvbiwgYW5kIHRoZSB2YWx1ZSBvZiB0aGlzIEFWUCBNVVNUIGJlIG1vbm90b25pY2FsbHkgaW5jcmVhc2VkIGJ5CisJCQkJb25lIGZvciBhbGwgbmV3IHN1Yi1zZXNzaW9ucy4gIFRoZSBhYnNlbmNlIG9mIHRoaXMgQVZQIGltcGxpZXMgbm8KKwkJCQlzdWItc2Vzc2lvbnMgYXJlIGluIHVzZSwgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIGFuIEFjY291bnRpbmctUmVxdWVzdAorCQkJCXdob3NlIEFjY291bnRpbmctUmVjb3JkLVR5cGUgaXMgc2V0IHRvIFNUT1BfUkVDT1JELiAgQSBTVE9QX1JFQ09SRAorCQkJCW1lc3NhZ2Ugd2l0aCBubyBBY2NvdW50aW5nLVN1Yi1TZXNzaW9uLUlkIEFWUCBwcmVzZW50IHdpbGwgc2lnbmFsIHRoZQorCQkJCXRlcm1pbmF0aW9uIG9mIGFsbCBzdWItc2Vzc2lvbnMgZm9yIGEgZ2l2ZW4gU2Vzc2lvbi1JZC4KKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhID0geyAKKwkJCQkJMjg3LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJMCwgCQkJCQkvKiBWZW5kb3IgKi8KKwkJCQkJIkFjY291bnRpbmctU3ViLVNlc3Npb24tSWQiLCAJCS8qIE5hbWUgKi8KKwkJCQkJQVZQX0ZMQUdfVkVORE9SIHwgQVZQX0ZMQUdfTUFOREFUT1JZLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQVZQX0ZMQUdfTUFOREFUT1JZLAkJCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCUFWUF9UWVBFX1VOU0lHTkVENjQgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0FWUCwgJmRhdGEgLCBOVUxMLCBOVUxMKTsKKwkJfQorCQkKKwkJLyogQWNjb3VudGluZy1SZWFsdGltZS1SZXF1aXJlZCAqLworCQl7CisJCQkvKgorCQkJCVRoZSBBY2NvdW50aW5nLVJlYWx0aW1lLVJlcXVpcmVkIEFWUCAoQVZQIENvZGUgNDgzKSBpcyBvZiB0eXBlCisJCQkJRW51bWVyYXRlZCBhbmQgaXMgc2VudCBmcm9tIHRoZSBEaWFtZXRlciBob21lIGF1dGhvcml6YXRpb24gc2VydmVyIHRvCisJCQkJdGhlIERpYW1ldGVyIGNsaWVudCBvciBpbiB0aGUgQWNjb3VudGluZy1BbnN3ZXIgZnJvbSB0aGUgYWNjb3VudGluZworCQkJCXNlcnZlci4gIFRoZSBjbGllbnQgdXNlcyBpbmZvcm1hdGlvbiBpbiB0aGlzIEFWUCB0byBkZWNpZGUgd2hhdCB0byBkbworCQkJCWlmIHRoZSBzZW5kaW5nIG9mIGFjY291bnRpbmcgcmVjb3JkcyB0byB0aGUgYWNjb3VudGluZyBzZXJ2ZXIgaGFzCisJCQkJYmVlbiB0ZW1wb3JhcmlseSBwcmV2ZW50ZWQgZHVlIHRvLCBmb3IgaW5zdGFuY2UsIGEgbmV0d29yayBwcm9ibGVtLgorCisKKwkJCQlERUxJVkVSX0FORF9HUkFOVCAxCisKKwkJCQlUaGUgQVZQIHdpdGggVmFsdWUgZmllbGQgc2V0IHRvIERFTElWRVJfQU5EX0dSQU5UIG1lYW5zIHRoYXQgdGhlCisJCQkJc2VydmljZSBNVVNUIG9ubHkgYmUgZ3JhbnRlZCBhcyBsb25nIGFzIHRoZXJlIGlzIGEgY29ubmVjdGlvbiB0bworCQkJCWFuIGFjY291bnRpbmcgc2VydmVyLiAgTm90ZSB0aGF0IHRoZSBzZXQgb2YgYWx0ZXJuYXRpdmUgYWNjb3VudGluZworCQkJCXNlcnZlcnMgYXJlIHRyZWF0ZWQgYXMgb25lIHNlcnZlciBpbiB0aGlzIHNlbnNlLiAgSGF2aW5nIHRvIG1vdmUKKwkJCQl0aGUgYWNjb3VudGluZyByZWNvcmQgc3RyZWFtIHRvIGEgYmFja3VwIHNlcnZlciBpcyBub3QgYSByZWFzb24gdG8KKwkJCQlkaXNjb250aW51ZSB0aGUgc2VydmljZSB0byB0aGUgdXNlci4KKworCisJCQkJR1JBTlRfQU5EX1NUT1JFIDIKKworCQkJCVRoZSBBVlAgd2l0aCBWYWx1ZSBmaWVsZCBzZXQgdG8gR1JBTlRfQU5EX1NUT1JFIG1lYW5zIHRoYXQgc2VydmljZQorCQkJCVNIT1VMRCBiZSBncmFudGVkIGlmIHRoZXJlIGlzIGEgY29ubmVjdGlvbiwgb3IgYXMgbG9uZyBhcyByZWNvcmRzCisJCQkJY2FuIHN0aWxsIGJlIHN0b3JlZCBhcyBkZXNjcmliZWQgaW4gU2VjdGlvbiA5LjQuCisKKwkJCQlUaGlzIGlzIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlmIHRoZSBBVlAgaXNuJ3QgaW5jbHVkZWQgaW4gdGhlCisJCQkJcmVwbHkgZnJvbSB0aGUgYXV0aG9yaXphdGlvbiBzZXJ2ZXIuCisKKworCQkJCUdSQU5UX0FORF9MT1NFIDMKKworCQkJCVRoZSBBVlAgd2l0aCBWYWx1ZSBmaWVsZCBzZXQgdG8gR1JBTlRfQU5EX0xPU0UgbWVhbnMgdGhhdCBzZXJ2aWNlCisJCQkJU0hPVUxEIGJlIGdyYW50ZWQgZXZlbiBpZiB0aGUgcmVjb3JkcyBjYW4gbm90IGJlIGRlbGl2ZXJlZCBvcgorCQkJCXN0b3JlZC4KKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgIAkqIAl0eXBlOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhCSAJdGRhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVIzMiwJIkVudW1lcmF0ZWQoQWNjb3VudGluZy1SZWFsdGltZS1SZXF1aXJlZCkiCSwgTlVMTCwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIAl0XzEgPSB7ICJERUxJVkVSX0FORF9HUkFOVCIsCQl7IC5pMzIgPSAxIH19OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIAl0XzIgPSB7ICJHUkFOVF9BTkRfU1RPUkUiLCAJCXsgLmkzMiA9IDIgfX07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgCXRfMyA9IHsgIkdSQU5UX0FORF9MT1NFIiwJCXsgLmkzMiA9IDMgfX07CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSAJCWRhdGEgPSB7IAorCQkJCQk0ODMsIAkJCQkJLyogQ29kZSAqLworCQkJCQkwLCAJCQkJCS8qIFZlbmRvciAqLworCQkJCQkiQWNjb3VudGluZy1SZWFsdGltZS1SZXF1aXJlZCIsCQkvKiBOYW1lICovCisJCQkJCUFWUF9GTEFHX1ZFTkRPUiB8IEFWUF9GTEFHX01BTkRBVE9SWSwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUFWUF9GTEFHX01BTkRBVE9SWSwJCQkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQlBVlBfVFlQRV9JTlRFR0VSMzIgCQkJLyogYmFzZSB0eXBlIG9mIGRhdGEgKi8KKwkJCQkJfTsKKwkJCS8qIENyZWF0ZSB0aGUgRW51bWVyYXRlZCB0eXBlLCBhbmQgdGhlbiB0aGUgQVZQICovCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9UWVBFLCAmdGRhdGEgLCBOVUxMLCAmdHlwZSk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8xICwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8yICwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9FTlVNVkFMLCAmdF8zICwgdHlwZSwgTlVMTCk7CisJCQlDSEVDS19kaWN0X25ldyggRElDVF9BVlAsICZkYXRhICwgdHlwZSwgTlVMTCk7CisJCX0KKwkJCisJfQorCQorCS8qIENvbW1hbmRzIHNlY3Rpb24gKi8KKwl7CisJCS8qIFRvIGF2b2lkIGRlZmluaW5nIGdsb2JhbCB2YXJpYWJsZXMgZm9yIGFsbCB0aGUgQVZQIHRoYXQgd2UgdXNlIGhlcmUsIHdlIGRvIHNlYXJjaCB0aGUgZGljdGlvbmFyeSBpbiBlYWNoIHN1Yi1ibG9jay4KKwkJICogVGhpcyBpcyBmYXIgZnJvbSBvcHRpbWFsLCBidXQgdGhlIGNvZGUgaXMgY2xlYXJlciBsaWtlIHRoaXMsIGFuZCB0aGUgdGltZSBpdCByZXF1aXJlcyBhdCBleGVjdXRpb24gaXMgbm90IG5vdGljZWFibGUuCisJCSAqLworCQkKKwkJLyogR2VuZXJpYyBtZXNzYWdlIHN5bnRheCB3aGVuIHRoZSAnRScgYml0IGlzIHNldCAqLworCQl7CisJCQkvKgorCQkJCVRoZSAnRScgKEVycm9yIEJpdCkgaW4gdGhlIERpYW1ldGVyIGhlYWRlciBpcyBzZXQgd2hlbiB0aGUgcmVxdWVzdAorCQkJCWNhdXNlZCBhIHByb3RvY29sLXJlbGF0ZWQgZXJyb3IgKHNlZSBTZWN0aW9uIDcuMS4zKS4gIEEgbWVzc2FnZSB3aXRoCisJCQkJdGhlICdFJyBiaXQgTVVTVCBOT1QgYmUgc2VudCBhcyBhIHJlc3BvbnNlIHRvIGFuIGFuc3dlciBtZXNzYWdlLgorCQkJCU5vdGUgdGhhdCBhIG1lc3NhZ2Ugd2l0aCB0aGUgJ0UnIGJpdCBzZXQgaXMgc3RpbGwgc3ViamVjdGVkIHRvIHRoZQorCQkJCXByb2Nlc3NpbmcgcnVsZXMgZGVmaW5lZCBpbiBTZWN0aW9uIDYuMi4gIFdoZW4gc2V0LCB0aGUgYW5zd2VyCisJCQkJbWVzc2FnZSB3aWxsIG5vdCBjb25mb3JtIHRvIHRoZSBBQk5GIHNwZWNpZmljYXRpb24gZm9yIHRoZSBjb21tYW5kLAorCQkJCWFuZCB3aWxsIGluc3RlYWQgY29uZm9ybSB0byB0aGUgZm9sbG93aW5nIEFCTkY6CisKKwkJCQlNZXNzYWdlIEZvcm1hdAorCisJCQkJPGFuc3dlci1tZXNzYWdlPiA6Oj0gPCBEaWFtZXRlciBIZWFkZXI6IGNvZGUsIEVSUiBbUFhZXSA+CisgICAgICAgICAgICAgICAgCQkJCTAqMTwgU2Vzc2lvbi1JZCA+CisgICAgICAgICAgICAgICAgCQkJCSAgIHsgT3JpZ2luLUhvc3QgfQorICAgICAgICAgICAgICAgIAkJCQkgICB7IE9yaWdpbi1SZWFsbSB9CisgICAgICAgICAgICAgICAgCQkJCSAgIHsgUmVzdWx0LUNvZGUgfQorICAgICAgICAgICAgICAgIAkJCQkgICBbIE9yaWdpbi1TdGF0ZS1JZCBdCisgICAgICAgICAgICAgICAgCQkJCSAgIFsgRXJyb3ItTWVzc2FnZSBdCisgICAgICAgICAgICAgICAgCQkJCSAgIFsgRXJyb3ItUmVwb3J0aW5nLUhvc3QgXQorICAgICAgICAgICAgICAgIAkJCQkgICBbIEZhaWxlZC1BVlAgXQorICAgICAgICAgICAgICAgIAkJCQkgKiBbIFByb3h5LUluZm8gXQorICAgICAgICAgICAgICAgIAkJCQkgKiBbIEFWUCBdCisKKwkJCQlOb3RlIHRoYXQgdGhlIGNvZGUgdXNlZCBpbiB0aGUgaGVhZGVyIGlzIHRoZSBzYW1lIHRoYW4gdGhlIG9uZSBmb3VuZAorCQkJCWluIHRoZSByZXF1ZXN0IG1lc3NhZ2UsIGJ1dCB3aXRoIHRoZSAnUicgYml0IGNsZWFyZWQgYW5kIHRoZSAnRScgYml0CisJCQkJc2V0LiAgVGhlICdQJyBiaXQgaW4gdGhlIGhlYWRlciBpcyBzZXQgdG8gdGhlIHNhbWUgdmFsdWUgYXMgdGhlIG9uZQorCQkJCWZvdW5kIGluIHRoZSByZXF1ZXN0IG1lc3NhZ2UuCisJCQkqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogY21kX2Vycm9yOworCQkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9IAorCQkJCQkJeyAJIHsgICJTZXNzaW9uLUlkIiwgCQkJUlVMRV9GSVhFRF9IRUFELDAsIDEgfQorCQkJCQkJCSx7ICAiT3JpZ2luLUhvc3QiLAkJCVJVTEVfUkVRVUlSRUQsIC0xLCAxIH0KKwkJCQkJCQkseyAgIk9yaWdpbi1SZWFsbSIsCQkJUlVMRV9SRVFVSVJFRCwgLTEsIDEgfQorCQkJCQkJCSx7ICAiUmVzdWx0LUNvZGUiLAkJCVJVTEVfUkVRVUlSRUQsIC0xLCAxIH0KKwkJCQkJCQkseyAgIk9yaWdpbi1TdGF0ZS1JZCIsCQkJUlVMRV9PUFRJT05BTCwgLTEsIDEgfQorCQkJCQkJCSx7ICAiRXJyb3ItTWVzc2FnZSIsCQkJUlVMRV9PUFRJT05BTCwgLTEsIDEgfQorCQkJCQkJCSx7ICAiRXJyb3ItUmVwb3J0aW5nLUhvc3QiLAkJUlVMRV9PUFRJT05BTCwgLTEsIDEgfQorCQkJCQkJCSx7ICAiRmFpbGVkLUFWUCIsCQkJUlVMRV9PUFRJT05BTCwgLTEsIDEgfQorCQkJCQkJCSx7ICAiUHJveHktSW5mbyIsCQkJUlVMRV9PUFRJT05BTCwgLTEsLTEgfQorCQkJCQkJfTsKKwkJCUNIRUNLX0ZDVCggZmRfZGljdF9nZXRfZXJyb3JfY21kKGRpY3QsICZjbWRfZXJyb3IpICk7CisJCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBjbWRfZXJyb3IgKTsKKwkJfQkJCisJCQorCQkvKiBDYXBhYmlsaXRpZXMtRXhjaGFuZ2UtUmVxdWVzdCAqLworCQl7CisJCQkvKgorCQkJCVRoZSBDYXBhYmlsaXRpZXMtRXhjaGFuZ2UtUmVxdWVzdCAoQ0VSKSwgaW5kaWNhdGVkIGJ5IHRoZSBDb21tYW5kLQorCQkJCUNvZGUgc2V0IHRvIDI1NyBhbmQgdGhlIENvbW1hbmQgRmxhZ3MnICdSJyBiaXQgc2V0LCBpcyBzZW50IHRvCisJCQkJZXhjaGFuZ2UgbG9jYWwgY2FwYWJpbGl0aWVzLiAgVXBvbiBkZXRlY3Rpb24gb2YgYSB0cmFuc3BvcnQgZmFpbHVyZSwKKwkJCQl0aGlzIG1lc3NhZ2UgTVVTVCBOT1QgYmUgc2VudCB0byBhbiBhbHRlcm5hdGUgcGVlci4KKworCQkJCVdoZW4gRGlhbWV0ZXIgaXMgcnVuIG92ZXIgU0NUUCBbUkZDMjk2MF0sIHdoaWNoIGFsbG93cyBmb3IKKwkJCQljb25uZWN0aW9ucyB0byBzcGFuIG11bHRpcGxlIGludGVyZmFjZXMgYW5kIG11bHRpcGxlIElQIGFkZHJlc3NlcywKKwkJCQl0aGUgQ2FwYWJpbGl0aWVzLUV4Y2hhbmdlLVJlcXVlc3QgbWVzc2FnZSBNVVNUIGNvbnRhaW4gb25lIEhvc3QtSVAtCisJCQkJQWRkcmVzcyBBVlAgZm9yIGVhY2ggcG90ZW50aWFsIElQIGFkZHJlc3MgdGhhdCBNQVkgYmUgbG9jYWxseSB1c2VkCisJCQkJd2hlbiB0cmFuc21pdHRpbmcgRGlhbWV0ZXIgbWVzc2FnZXMuCisKKwkJCQlNZXNzYWdlIEZvcm1hdAorCisJCQkJIDxDRVI+IDo6PSA8IERpYW1ldGVyIEhlYWRlcjogMjU3LCBSRVEgPgorICAgICAgICAJCQkJICAgeyBPcmlnaW4tSG9zdCB9CisgICAgICAgIAkJCQkgICB7IE9yaWdpbi1SZWFsbSB9CisgICAgICAgIAkJCQkxKiB7IEhvc3QtSVAtQWRkcmVzcyB9CisgICAgICAgIAkJCQkgICB7IFZlbmRvci1JZCB9CisgICAgICAgIAkJCQkgICB7IFByb2R1Y3QtTmFtZSB9CisgICAgICAgIAkJCQkgICBbIE9yaWdpbi1TdGF0ZS1JZCBdCisgICAgICAgIAkJCQkgKiBbIFN1cHBvcnRlZC1WZW5kb3ItSWQgXQorICAgICAgICAJCQkJICogWyBBdXRoLUFwcGxpY2F0aW9uLUlkIF0KKyAgICAgICAgCQkJCSAqIFsgSW5iYW5kLVNlY3VyaXR5LUlkIF0KKyAgICAgICAgCQkJCSAqIFsgQWNjdC1BcHBsaWNhdGlvbi1JZCBdCisgICAgICAgIAkJCQkgKiBbIFZlbmRvci1TcGVjaWZpYy1BcHBsaWNhdGlvbi1JZCBdCisgICAgICAgIAkJCQkgICBbIEZpcm13YXJlLVJldmlzaW9uIF0KKyAgICAgICAgCQkJCSAqIFsgQVZQIF0KKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBjbWQ7CisJCQlzdHJ1Y3QgZGljdF9jbWRfZGF0YSBkYXRhID0geyAKKwkJCQkJMjU3LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJI2lmIENDX0NBUEFCSUxJVElFU19FWENIQU5HRSAhPSAyNTcKKwkJCQkJI2Vycm9yICJDQ19DQVBBQklMSVRJRVNfRVhDSEFOR0UgZGVmaW5pdGlvbiBtaXNtYXRjaCIKKwkJCQkJI2VuZGlmCisJCQkJCSJDYXBhYmlsaXRpZXMtRXhjaGFuZ2UtUmVxdWVzdCIsIAkvKiBOYW1lICovCisJCQkJCUNNRF9GTEFHX1JFUVVFU1QgfCBDTURfRkxBR19QUk9YSUFCTEUgfCBDTURfRkxBR19SRVRSQU5TTUlUIHwgQ01EX0ZMQUdfRVJST1IsIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlDTURfRkxBR19SRVFVRVNUIAkJCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCX07CisJCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0gCisJCQkJCQl7IAkgeyAgIk9yaWdpbi1Ib3N0IiwgCQkJUlVMRV9SRVFVSVJFRCwgLTEsIDEgfQorCQkJCQkJCSx7ICAiT3JpZ2luLVJlYWxtIiwJCQlSVUxFX1JFUVVJUkVELCAtMSwgMSB9CisJCQkJCQkJLHsgICJIb3N0LUlQLUFkZHJlc3MiLAkJCVJVTEVfUkVRVUlSRUQsIC0xLC0xIH0KKwkJCQkJCQkseyAgIlZlbmRvci1JZCIsCQkJUlVMRV9SRVFVSVJFRCwgLTEsIDEgfQorCQkJCQkJCSx7ICAiUHJvZHVjdC1OYW1lIiwJCQlSVUxFX1JFUVVJUkVELCAtMSwgMSB9CisJCQkJCQkJLHsgICJPcmlnaW4tU3RhdGUtSWQiLAkJCVJVTEVfT1BUSU9OQUwsIC0xLCAxIH0KKwkJCQkJCQkseyAgIlN1cHBvcnRlZC1WZW5kb3ItSWQiLAkJUlVMRV9PUFRJT05BTCwgLTEsLTEgfQorCQkJCQkJCSx7ICAiQXV0aC1BcHBsaWNhdGlvbi1JZCIsCQlSVUxFX09QVElPTkFMLCAtMSwtMSB9CisJCQkJCQkJLHsgICJJbmJhbmQtU2VjdXJpdHktSWQiLAkJUlVMRV9PUFRJT05BTCwgLTEsLTEgfQorCQkJCQkJCSx7ICAiQWNjdC1BcHBsaWNhdGlvbi1JZCIsCQlSVUxFX09QVElPTkFMLCAtMSwtMSB9CisJCQkJCQkJLHsgICJWZW5kb3ItU3BlY2lmaWMtQXBwbGljYXRpb24tSWQiLAlSVUxFX09QVElPTkFMLCAtMSwtMSB9CisJCQkJCQkJLHsgICJGaXJtd2FyZS1SZXZpc2lvbiIsCQlSVUxFX09QVElPTkFMLCAtMSwgMSB9CisJCQkJCQl9OworCQkJCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9DT01NQU5ELCAmZGF0YSAsIE5VTEwsICZjbWQpOworCQkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgY21kICk7CisJCX0KKwkJCisJCS8qIENhcGFiaWxpdGllcy1FeGNoYW5nZS1BbnN3ZXIgKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgQ2FwYWJpbGl0aWVzLUV4Y2hhbmdlLUFuc3dlciAoQ0VBKSwgaW5kaWNhdGVkIGJ5IHRoZSBDb21tYW5kLUNvZGUKKwkJCQlzZXQgdG8gMjU3IGFuZCB0aGUgQ29tbWFuZCBGbGFncycgJ1InIGJpdCBjbGVhcmVkLCBpcyBzZW50IGluCisJCQkJcmVzcG9uc2UgdG8gYSBDRVIgbWVzc2FnZS4KKworCQkJCVdoZW4gRGlhbWV0ZXIgaXMgcnVuIG92ZXIgU0NUUCBbUkZDMjk2MF0sIHdoaWNoIGFsbG93cyBjb25uZWN0aW9ucyB0bworCQkJCXNwYW4gbXVsdGlwbGUgaW50ZXJmYWNlcywgaGVuY2UsIG11bHRpcGxlIElQIGFkZHJlc3NlcywgdGhlCisJCQkJQ2FwYWJpbGl0aWVzLUV4Y2hhbmdlLUFuc3dlciBtZXNzYWdlIE1VU1QgY29udGFpbiBvbmUgSG9zdC1JUC1BZGRyZXNzCisJCQkJQVZQIGZvciBlYWNoIHBvdGVudGlhbCBJUCBhZGRyZXNzIHRoYXQgTUFZIGJlIGxvY2FsbHkgdXNlZCB3aGVuCisJCQkJdHJhbnNtaXR0aW5nIERpYW1ldGVyIG1lc3NhZ2VzLgorCisJCQkJTWVzc2FnZSBGb3JtYXQKKworCQkJCSA8Q0VBPiA6Oj0gPCBEaWFtZXRlciBIZWFkZXI6IDI1NyA+CisgICAgICAgIAkJCQkgICB7IFJlc3VsdC1Db2RlIH0KKyAgICAgICAgCQkJCSAgIHsgT3JpZ2luLUhvc3QgfQorICAgICAgICAJCQkJICAgeyBPcmlnaW4tUmVhbG0gfQorICAgICAgICAJCQkJMSogeyBIb3N0LUlQLUFkZHJlc3MgfQorICAgICAgICAJCQkJICAgeyBWZW5kb3ItSWQgfQorICAgICAgICAJCQkJICAgeyBQcm9kdWN0LU5hbWUgfQorICAgICAgICAJCQkJICAgWyBPcmlnaW4tU3RhdGUtSWQgXQorICAgICAgICAJCQkJICAgWyBFcnJvci1NZXNzYWdlIF0KKyAgICAgICAgCQkJCSAgIFsgRmFpbGVkLUFWUCBdCisgICAgICAgIAkJCQkgKiBbIFN1cHBvcnRlZC1WZW5kb3ItSWQgXQorICAgICAgICAJCQkJICogWyBBdXRoLUFwcGxpY2F0aW9uLUlkIF0KKyAgICAgICAgCQkJCSAqIFsgSW5iYW5kLVNlY3VyaXR5LUlkIF0KKyAgICAgICAgCQkJCSAqIFsgQWNjdC1BcHBsaWNhdGlvbi1JZCBdCisgICAgICAgIAkJCQkgKiBbIFZlbmRvci1TcGVjaWZpYy1BcHBsaWNhdGlvbi1JZCBdCisgICAgICAgIAkJCQkgICBbIEZpcm13YXJlLVJldmlzaW9uIF0KKyAgICAgICAgCQkJCSAqIFsgQVZQIF0KKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBjbWQ7CisJCQlzdHJ1Y3QgZGljdF9jbWRfZGF0YSBkYXRhID0geyAKKwkJCQkJMjU3LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJI2lmIENDX0NBUEFCSUxJVElFU19FWENIQU5HRSAhPSAyNTcKKwkJCQkJI2Vycm9yICJDQ19DQVBBQklMSVRJRVNfRVhDSEFOR0UgZGVmaW5pdGlvbiBtaXNtYXRjaCIKKwkJCQkJI2VuZGlmCisJCQkJCSJDYXBhYmlsaXRpZXMtRXhjaGFuZ2UtQW5zd2VyIiwgCS8qIE5hbWUgKi8KKwkJCQkJQ01EX0ZMQUdfUkVRVUVTVCB8IENNRF9GTEFHX1BST1hJQUJMRSB8IENNRF9GTEFHX1JFVFJBTlNNSVQsIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQkwIAkJCQkJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJfTsKKwkJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPSAKKwkJCQkJCXsgCSB7ICAiUmVzdWx0LUNvZGUiLCAJCQlSVUxFX1JFUVVJUkVELCAtMSwgMSB9CisJCQkJCQkgCSx7ICAiT3JpZ2luLUhvc3QiLCAJCQlSVUxFX1JFUVVJUkVELCAtMSwgMSB9CisJCQkJCQkJLHsgICJPcmlnaW4tUmVhbG0iLAkJCVJVTEVfUkVRVUlSRUQsIC0xLCAxIH0KKwkJCQkJCQkseyAgIkhvc3QtSVAtQWRkcmVzcyIsCQkJUlVMRV9SRVFVSVJFRCwgLTEsLTEgfQorCQkJCQkJCSx7ICAiVmVuZG9yLUlkIiwJCQlSVUxFX1JFUVVJUkVELCAtMSwgMSB9CisJCQkJCQkJLHsgICJQcm9kdWN0LU5hbWUiLAkJCVJVTEVfUkVRVUlSRUQsIC0xLCAxIH0KKwkJCQkJCQkseyAgIk9yaWdpbi1TdGF0ZS1JZCIsCQkJUlVMRV9PUFRJT05BTCwgLTEsIDEgfQorCQkJCQkJCSx7ICAiRXJyb3ItTWVzc2FnZSIsCQkJUlVMRV9PUFRJT05BTCwgLTEsIDEgfQorCQkJCQkJCSx7ICAiRmFpbGVkLUFWUCIsCQkJUlVMRV9PUFRJT05BTCwgLTEsIDEgfQorCQkJCQkJCSx7ICAiU3VwcG9ydGVkLVZlbmRvci1JZCIsCQlSVUxFX09QVElPTkFMLCAtMSwtMSB9CisJCQkJCQkJLHsgICJBdXRoLUFwcGxpY2F0aW9uLUlkIiwJCVJVTEVfT1BUSU9OQUwsIC0xLC0xIH0KKwkJCQkJCQkseyAgIkluYmFuZC1TZWN1cml0eS1JZCIsCQlSVUxFX09QVElPTkFMLCAtMSwtMSB9CisJCQkJCQkJLHsgICJBY2N0LUFwcGxpY2F0aW9uLUlkIiwJCVJVTEVfT1BUSU9OQUwsIC0xLC0xIH0KKwkJCQkJCQkseyAgIlZlbmRvci1TcGVjaWZpYy1BcHBsaWNhdGlvbi1JZCIsCVJVTEVfT1BUSU9OQUwsIC0xLC0xIH0KKwkJCQkJCQkseyAgIkZpcm13YXJlLVJldmlzaW9uIiwJCVJVTEVfT1BUSU9OQUwsIC0xLCAxIH0KKwkJCQkJCX07CisJCQkKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0NPTU1BTkQsICZkYXRhICwgTlVMTCwgJmNtZCk7CisJCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBjbWQgKTsKKwkJfQorCQkKKwkJLyogRGlzY29ubmVjdC1QZWVyLVJlcXVlc3QgKi8KKwkJeworCQkJLyoKKwkJCQlUaGUgRGlzY29ubmVjdC1QZWVyLVJlcXVlc3QgKERQUiksIGluZGljYXRlZCBieSB0aGUgQ29tbWFuZC1Db2RlIHNldAorCQkJCXRvIDI4MiBhbmQgdGhlIENvbW1hbmQgRmxhZ3MnICdSJyBiaXQgc2V0LCBpcyBzZW50IHRvIGEgcGVlciB0bworCQkJCWluZm9ybSBpdHMgaW50ZW50aW9ucyB0byBzaHV0ZG93biB0aGUgdHJhbnNwb3J0IGNvbm5lY3Rpb24uICBVcG9uCisJCQkJZGV0ZWN0aW9uIG9mIGEgdHJhbnNwb3J0IGZhaWx1cmUsIHRoaXMgbWVzc2FnZSBNVVNUIE5PVCBiZSBzZW50IHRvIGFuCisJCQkJYWx0ZXJuYXRlIHBlZXIuCisKKwkJCQlNZXNzYWdlIEZvcm1hdAorCisJCQkJIDxEUFI+ICA6Oj0gPCBEaWFtZXRlciBIZWFkZXI6IDI4MiwgUkVRID4KKyAgICAgICAgCQkJCSAgICB7IE9yaWdpbi1Ib3N0IH0KKyAgICAgICAgCQkJCSAgICB7IE9yaWdpbi1SZWFsbSB9CisgICAgICAgIAkJCQkgICAgeyBEaXNjb25uZWN0LUNhdXNlIH0KKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBjbWQ7CisJCQlzdHJ1Y3QgZGljdF9jbWRfZGF0YSBkYXRhID0geyAKKwkJCQkJMjgyLCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJI2lmIENDX0RJU0NPTk5FQ1RfUEVFUiAhPSAyODIKKwkJCQkJI2Vycm9yICJDQ19ESVNDT05ORUNUX1BFRVIgZGVmaW5pdGlvbiBtaXNtYXRjaCIKKwkJCQkJI2VuZGlmCisJCQkJCSJEaXNjb25uZWN0LVBlZXItUmVxdWVzdCIsIAkJLyogTmFtZSAqLworCQkJCQlDTURfRkxBR19SRVFVRVNUIHwgQ01EX0ZMQUdfUFJPWElBQkxFIHwgQ01EX0ZMQUdfUkVUUkFOU01JVCB8IENNRF9GTEFHX0VSUk9SLCAJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQ01EX0ZMQUdfUkVRVUVTVCAJCQkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQl9OworCQkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9IAorCQkJCQkJeyAJIHsgICJPcmlnaW4tSG9zdCIsIAkJCVJVTEVfUkVRVUlSRUQsIC0xLCAxIH0KKwkJCQkJCQkseyAgIk9yaWdpbi1SZWFsbSIsCQkJUlVMRV9SRVFVSVJFRCwgLTEsIDEgfQorCQkJCQkJCSx7ICAiRGlzY29ubmVjdC1DYXVzZSIsCQkJUlVMRV9SRVFVSVJFRCwgLTEsIDEgfQorCQkJCQkJfTsKKwkJCQorCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQ09NTUFORCwgJmRhdGEgLCBOVUxMLCAmY21kKTsKKwkJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGNtZCApOworCQl9CisJCQorCQkvKiBEaXNjb25uZWN0LVBlZXItQW5zd2VyICovCisJCXsKKwkJCS8qCisJCQkJVGhlIERpc2Nvbm5lY3QtUGVlci1BbnN3ZXIgKERQQSksIGluZGljYXRlZCBieSB0aGUgQ29tbWFuZC1Db2RlIHNldAorCQkJCXRvIDI4MiBhbmQgdGhlIENvbW1hbmQgRmxhZ3MnICdSJyBiaXQgY2xlYXJlZCwgaXMgc2VudCBhcyBhIHJlc3BvbnNlCisJCQkJdG8gdGhlIERpc2Nvbm5lY3QtUGVlci1SZXF1ZXN0IG1lc3NhZ2UuICBVcG9uIHJlY2VpcHQgb2YgdGhpcworCQkJCW1lc3NhZ2UsIHRoZSB0cmFuc3BvcnQgY29ubmVjdGlvbiBpcyBzaHV0ZG93bi4KKworCQkJCU1lc3NhZ2UgRm9ybWF0CisKKwkJCQkgPERQQT4gIDo6PSA8IERpYW1ldGVyIEhlYWRlcjogMjgyID4KKyAgICAgICAgCQkJCSAgICB7IFJlc3VsdC1Db2RlIH0KKyAgICAgICAgCQkJCSAgICB7IE9yaWdpbi1Ib3N0IH0KKyAgICAgICAgCQkJCSAgICB7IE9yaWdpbi1SZWFsbSB9CisgICAgICAgIAkJCQkgICAgWyBFcnJvci1NZXNzYWdlIF0KKyAgICAgICAgCQkJCSAgICBbIEZhaWxlZC1BVlAgXQorCQkJKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGNtZDsKKwkJCXN0cnVjdCBkaWN0X2NtZF9kYXRhIGRhdGEgPSB7IAorCQkJCQkyODIsIAkJCQkJLyogQ29kZSAqLworCQkJCQkjaWYgQ0NfRElTQ09OTkVDVF9QRUVSICE9IDI4MgorCQkJCQkjZXJyb3IgIkNDX0RJU0NPTk5FQ1RfUEVFUiBkZWZpbml0aW9uIG1pc21hdGNoIgorCQkJCQkjZW5kaWYKKwkJCQkJIkRpc2Nvbm5lY3QtUGVlci1BbnN3ZXIiLCAJCS8qIE5hbWUgKi8KKwkJCQkJQ01EX0ZMQUdfUkVRVUVTVCB8IENNRF9GTEFHX1BST1hJQUJMRSB8IENNRF9GTEFHX1JFVFJBTlNNSVQsIAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQkwIAkJCQkJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJfTsKKwkJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPSAKKwkJCQkJCXsgCSB7ICAiUmVzdWx0LUNvZGUiLCAJCQlSVUxFX1JFUVVJUkVELCAtMSwgMSB9CisJCQkJCQkgCSx7ICAiT3JpZ2luLUhvc3QiLCAJCQlSVUxFX1JFUVVJUkVELCAtMSwgMSB9CisJCQkJCQkJLHsgICJPcmlnaW4tUmVhbG0iLAkJCVJVTEVfUkVRVUlSRUQsIC0xLCAxIH0KKwkJCQkJCQkseyAgIkVycm9yLU1lc3NhZ2UiLAkJCVJVTEVfT1BUSU9OQUwsIC0xLCAxIH0KKwkJCQkJCQkseyAgIkZhaWxlZC1BVlAiLAkJCVJVTEVfT1BUSU9OQUwsIC0xLCAxIH0KKwkJCQkJCX07CisJCQkKKwkJCUNIRUNLX2RpY3RfbmV3KCBESUNUX0NPTU1BTkQsICZkYXRhICwgTlVMTCwgJmNtZCk7CisJCQlQQVJTRV9sb2NfcnVsZXMoIHJ1bGVzLCBjbWQgKTsKKwkJfQorCisJCS8qIERldmljZS1XYXRjaGRvZy1SZXF1ZXN0ICovCisJCXsKKwkJCS8qCisJCQkJVGhlIERldmljZS1XYXRjaGRvZy1SZXF1ZXN0IChEV1IpLCBpbmRpY2F0ZWQgYnkgdGhlIENvbW1hbmQtQ29kZSBzZXQKKwkJCQl0byAyODAgYW5kIHRoZSBDb21tYW5kIEZsYWdzJyAnUicgYml0IHNldCwgaXMgc2VudCB0byBhIHBlZXIgd2hlbiBubworCQkJCXRyYWZmaWMgaGFzIGJlZW4gZXhjaGFuZ2VkIGJldHdlZW4gdHdvIHBlZXJzIChzZWUgU2VjdGlvbiA1LjUuMykuCisJCQkJVXBvbiBkZXRlY3Rpb24gb2YgYSB0cmFuc3BvcnQgZmFpbHVyZSwgdGhpcyBtZXNzYWdlIE1VU1QgTk9UIGJlIHNlbnQKKwkJCQl0byBhbiBhbHRlcm5hdGUgcGVlci4KKworCQkJCU1lc3NhZ2UgRm9ybWF0CisKKwkJCQkgPERXUj4gIDo6PSA8IERpYW1ldGVyIEhlYWRlcjogMjgwLCBSRVEgPgorICAgICAgICAJCQkJICAgIHsgT3JpZ2luLUhvc3QgfQorICAgICAgICAJCQkJICAgIHsgT3JpZ2luLVJlYWxtIH0KKyAgICAgICAgCQkJCSAgICBbIE9yaWdpbi1TdGF0ZS1JZCBdCisJCQkqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogY21kOworCQkJc3RydWN0IGRpY3RfY21kX2RhdGEgZGF0YSA9IHsgCisJCQkJCTI4MCwgCQkJCQkvKiBDb2RlICovCisJCQkJCSNpZiBDQ19ERVZJQ0VfV0FUQ0hET0cgIT0gMjgwCisJCQkJCSNlcnJvciAiQ0NfREVWSUNFX1dBVENIRE9HIGRlZmluaXRpb24gbWlzbWF0Y2giCisJCQkJCSNlbmRpZgorCQkJCQkiRGV2aWNlLVdhdGNoZG9nLVJlcXVlc3QiLCAJCS8qIE5hbWUgKi8KKwkJCQkJQ01EX0ZMQUdfUkVRVUVTVCB8IENNRF9GTEFHX1BST1hJQUJMRSB8IENNRF9GTEFHX1JFVFJBTlNNSVQgfCBDTURfRkxBR19FUlJPUiwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUNNRF9GTEFHX1JFUVVFU1QgCQkJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJfTsKKwkJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPSAKKwkJCQkJCXsgCSB7ICAiT3JpZ2luLUhvc3QiLCAJCQlSVUxFX1JFUVVJUkVELCAtMSwgMSB9CisJCQkJCQkJLHsgICJPcmlnaW4tUmVhbG0iLAkJCVJVTEVfUkVRVUlSRUQsIC0xLCAxIH0KKwkJCQkJCQkseyAgIk9yaWdpbi1TdGF0ZS1JZCIsCQkJUlVMRV9PUFRJT05BTCwgLTEsIDEgfQorCQkJCQkJfTsKKwkJCQorCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQ09NTUFORCwgJmRhdGEgLCBOVUxMLCAmY21kKTsKKwkJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGNtZCApOworCQl9CisJCQorCQkvKiBEZXZpY2UtV2F0Y2hkb2ctQW5zd2VyICovCisJCXsKKwkJCS8qCisJCQkJVGhlIERldmljZS1XYXRjaGRvZy1BbnN3ZXIgKERXQSksIGluZGljYXRlZCBieSB0aGUgQ29tbWFuZC1Db2RlIHNldAorCQkJCXRvIDI4MCBhbmQgdGhlIENvbW1hbmQgRmxhZ3MnICdSJyBiaXQgY2xlYXJlZCwgaXMgc2VudCBhcyBhIHJlc3BvbnNlCisJCQkJdG8gdGhlIERldmljZS1XYXRjaGRvZy1SZXF1ZXN0IG1lc3NhZ2UuCisKKwkJCQlNZXNzYWdlIEZvcm1hdAorCisJCQkJIDxEV0E+ICA6Oj0gPCBEaWFtZXRlciBIZWFkZXI6IDI4MCA+CisgICAgICAgIAkJCQkgICAgeyBSZXN1bHQtQ29kZSB9CisgICAgICAgIAkJCQkgICAgeyBPcmlnaW4tSG9zdCB9CisgICAgICAgIAkJCQkgICAgeyBPcmlnaW4tUmVhbG0gfQorICAgICAgICAJCQkJICAgIFsgRXJyb3ItTWVzc2FnZSBdCisgICAgICAgIAkJCQkgICAgWyBGYWlsZWQtQVZQIF0KKyAgICAgICAgCQkJCSAgICBbIE9yaWdpbi1TdGF0ZS1JZCBdCisJCQkqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogY21kOworCQkJc3RydWN0IGRpY3RfY21kX2RhdGEgZGF0YSA9IHsgCisJCQkJCTI4MCwgCQkJCQkvKiBDb2RlICovCisJCQkJCSNpZiBDQ19ERVZJQ0VfV0FUQ0hET0cgIT0gMjgwCisJCQkJCSNlcnJvciAiQ0NfREVWSUNFX1dBVENIRE9HIGRlZmluaXRpb24gbWlzbWF0Y2giCisJCQkJCSNlbmRpZgorCQkJCQkiRGV2aWNlLVdhdGNoZG9nLUFuc3dlciIsIAkJLyogTmFtZSAqLworCQkJCQlDTURfRkxBR19SRVFVRVNUIHwgQ01EX0ZMQUdfUFJPWElBQkxFIHwgQ01EX0ZMQUdfUkVUUkFOU01JVCwgCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCTAgCQkJCQkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQl9OworCQkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9IAorCQkJCQkJeyAJIHsgICJSZXN1bHQtQ29kZSIsIAkJCVJVTEVfUkVRVUlSRUQsIC0xLCAxIH0KKwkJCQkJCSAJLHsgICJPcmlnaW4tSG9zdCIsIAkJCVJVTEVfUkVRVUlSRUQsIC0xLCAxIH0KKwkJCQkJCQkseyAgIk9yaWdpbi1SZWFsbSIsCQkJUlVMRV9SRVFVSVJFRCwgLTEsIDEgfQorCQkJCQkJCSx7ICAiRXJyb3ItTWVzc2FnZSIsCQkJUlVMRV9PUFRJT05BTCwgLTEsIDEgfQorCQkJCQkJCSx7ICAiRmFpbGVkLUFWUCIsCQkJUlVMRV9PUFRJT05BTCwgLTEsIDEgfQorCQkJCQkJCSx7ICAiT3JpZ2luLVN0YXRlLUlkIiwJCQlSVUxFX09QVElPTkFMLCAtMSwgMSB9CisJCQkJCQl9OworCQkJCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9DT01NQU5ELCAmZGF0YSAsIE5VTEwsICZjbWQpOworCQkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgY21kICk7CisJCX0KKwkJCisJCS8qIFJlLUF1dGgtUmVxdWVzdCAqLworCQl7CisJCQkvKgorCQkJCVRoZSBSZS1BdXRoLVJlcXVlc3QgKFJBUiksIGluZGljYXRlZCBieSB0aGUgQ29tbWFuZC1Db2RlIHNldCB0byAyNTgKKwkJCQlhbmQgdGhlIG1lc3NhZ2UgZmxhZ3MnICdSJyBiaXQgc2V0LCBtYXkgYmUgc2VudCBieSBhbnkgc2VydmVyIHRvIHRoZQorCQkJCWFjY2VzcyBkZXZpY2UgdGhhdCBpcyBwcm92aWRpbmcgc2Vzc2lvbiBzZXJ2aWNlLCB0byByZXF1ZXN0IHRoYXQgdGhlCisJCQkJdXNlciBiZSByZS1hdXRoZW50aWNhdGVkIGFuZC9vciByZS1hdXRob3JpemVkLgorCisKKwkJCQlNZXNzYWdlIEZvcm1hdAorCisJCQkJIDxSQVI+ICA6Oj0gPCBEaWFtZXRlciBIZWFkZXI6IDI1OCwgUkVRLCBQWFkgPgorICAgICAgICAJCQkJICAgIDwgU2Vzc2lvbi1JZCA+CisgICAgICAgIAkJCQkgICAgeyBPcmlnaW4tSG9zdCB9CisgICAgICAgIAkJCQkgICAgeyBPcmlnaW4tUmVhbG0gfQorICAgICAgICAJCQkJICAgIHsgRGVzdGluYXRpb24tUmVhbG0gfQorICAgICAgICAJCQkJICAgIHsgRGVzdGluYXRpb24tSG9zdCB9CisgICAgICAgIAkJCQkgICAgeyBBdXRoLUFwcGxpY2F0aW9uLUlkIH0KKyAgICAgICAgCQkJCSAgICB7IFJlLUF1dGgtUmVxdWVzdC1UeXBlIH0KKyAgICAgICAgCQkJCSAgICBbIFVzZXItTmFtZSBdCisgICAgICAgIAkJCQkgICAgWyBPcmlnaW4tU3RhdGUtSWQgXQorICAgICAgICAJCQkJICAqIFsgUHJveHktSW5mbyBdCisgICAgICAgIAkJCQkgICogWyBSb3V0ZS1SZWNvcmQgXQorICAgICAgICAJCQkJICAqIFsgQVZQIF0KKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBjbWQ7CisJCQlzdHJ1Y3QgZGljdF9jbWRfZGF0YSBkYXRhID0geyAKKwkJCQkJMjU4LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJI2lmIENDX1JFX0FVVEggIT0gMjU4CisJCQkJCSNlcnJvciAiQ0NfUkVfQVVUSCBkZWZpbml0aW9uIG1pc21hdGNoIgorCQkJCQkjZW5kaWYKKwkJCQkJIlJlLUF1dGgtUmVxdWVzdCIsIAkJCS8qIE5hbWUgKi8KKwkJCQkJQ01EX0ZMQUdfUkVRVUVTVCB8IENNRF9GTEFHX1BST1hJQUJMRSB8IENNRF9GTEFHX0VSUk9SLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQlDTURfRkxBR19SRVFVRVNUIHwgQ01EX0ZMQUdfUFJPWElBQkxFCS8qIEZpeGVkIGZsYWcgdmFsdWVzICovCisJCQkJCX07CisJCQlzdHJ1Y3QgbG9jYWxfcnVsZXNfZGVmaW5pdGlvbiBydWxlc1tdID0gCisJCQkJCQl7IAkgeyAgIlNlc3Npb24tSWQiLCAJCQlSVUxFX0ZJWEVEX0hFQUQsIC0xLCAxIH0KKwkJCQkJCSAJLHsgICJPcmlnaW4tSG9zdCIsIAkJCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiT3JpZ2luLVJlYWxtIiwJCQlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkRlc3RpbmF0aW9uLVJlYWxtIiwJCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkJCQkJIAkseyAgIkRlc3RpbmF0aW9uLUhvc3QiLCAJCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkJCQkJIAkseyAgIkF1dGgtQXBwbGljYXRpb24tSWQiLCAJCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkJCQkJIAkseyAgIlJlLUF1dGgtUmVxdWVzdC1UeXBlIiwgCQlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIlVzZXItTmFtZSIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJPcmlnaW4tU3RhdGUtSWQiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiUHJveHktSW5mbyIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwtMSB9CisJCQkJCQkJLHsgICJSb3V0ZS1SZWNvcmQiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsLTEgfQorCQkJCQkJfTsKKwkJCQorCQkJQ0hFQ0tfZGljdF9uZXcoIERJQ1RfQ09NTUFORCwgJmRhdGEgLCBOVUxMLCAmY21kKTsKKwkJCVBBUlNFX2xvY19ydWxlcyggcnVsZXMsIGNtZCApOworCQl9CisJCQorCQkvKiBSZS1BdXRoLUFuc3dlciAqLworCQl7CisJCQkvKgorCQkJCVRoZSBSZS1BdXRoLUFuc3dlciAoUkFBKSwgaW5kaWNhdGVkIGJ5IHRoZSBDb21tYW5kLUNvZGUgc2V0IHRvIDI1OAorCQkJCWFuZCB0aGUgbWVzc2FnZSBmbGFncycgJ1InIGJpdCBjbGVhciwgaXMgc2VudCBpbiByZXNwb25zZSB0byB0aGUgUkFSLgorCQkJCVRoZSBSZXN1bHQtQ29kZSBBVlAgTVVTVCBiZSBwcmVzZW50LCBhbmQgaW5kaWNhdGVzIHRoZSBkaXNwb3NpdGlvbiBvZgorCQkJCXRoZSByZXF1ZXN0LgorCisJCQkJQSBzdWNjZXNzZnVsIFJBQSBtZXNzYWdlIE1VU1QgYmUgZm9sbG93ZWQgYnkgYW4gYXBwbGljYXRpb24tc3BlY2lmaWMKKwkJCQlhdXRoZW50aWNhdGlvbiBhbmQvb3IgYXV0aG9yaXphdGlvbiBtZXNzYWdlLgorCisKKwkJCQlNZXNzYWdlIEZvcm1hdAorCisJCQkJIDxSQUE+ICA6Oj0gPCBEaWFtZXRlciBIZWFkZXI6IDI1OCwgUFhZID4KKyAgICAgICAgCQkJCSAgICA8IFNlc3Npb24tSWQgPgorICAgICAgICAJCQkJICAgIHsgUmVzdWx0LUNvZGUgfQorICAgICAgICAJCQkJICAgIHsgT3JpZ2luLUhvc3QgfQorICAgICAgICAJCQkJICAgIHsgT3JpZ2luLVJlYWxtIH0KKyAgICAgICAgCQkJCSAgICBbIFVzZXItTmFtZSBdCisgICAgICAgIAkJCQkgICAgWyBPcmlnaW4tU3RhdGUtSWQgXQorICAgICAgICAJCQkJICAgIFsgRXJyb3ItTWVzc2FnZSBdCisgICAgICAgIAkJCQkgICAgWyBFcnJvci1SZXBvcnRpbmctSG9zdCBdCisgICAgICAgIAkJCQkgICAgWyBGYWlsZWQtQVZQIF0KKyAgICAgICAgCQkJCSAgKiBbIFJlZGlyZWN0LUhvc3QgXQorICAgICAgICAJCQkJICAgIFsgUmVkaXJlY3QtSG9zdC1Vc2FnZSBdCisgICAgICAgIAkJCQkgICAgWyBSZWRpcmVjdC1NYXgtQ2FjaGUtVGltZSBdCisgICAgICAgIAkJCQkgICogWyBQcm94eS1JbmZvIF0KKyAgICAgICAgCQkJCSAgKiBbIEFWUCBdCisJCQkqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogY21kOworCQkJc3RydWN0IGRpY3RfY21kX2RhdGEgZGF0YSA9IHsgCisJCQkJCTI1OCwgCQkJCQkvKiBDb2RlICovCisJCQkJCSNpZiBDQ19SRV9BVVRIICE9IDI1OAorCQkJCQkjZXJyb3IgIkNDX1JFX0FVVEggZGVmaW5pdGlvbiBtaXNtYXRjaCIKKwkJCQkJI2VuZGlmCisJCQkJCSJSZS1BdXRoLUFuc3dlciIsIAkJCS8qIE5hbWUgKi8KKwkJCQkJQ01EX0ZMQUdfUkVRVUVTVCB8IENNRF9GTEFHX1BST1hJQUJMRSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJCQkgICBDTURfRkxBR19QUk9YSUFCTEUJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJfTsKKwkJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPSAKKwkJCQkJCXsgCSB7ICAiU2Vzc2lvbi1JZCIsIAkJCVJVTEVfRklYRURfSEVBRCwgLTEsIDEgfQorIAkJCQkJCQkseyAgIlJlc3VsdC1Db2RlIiwgCQkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCQkJCQkgCSx7ICAiT3JpZ2luLUhvc3QiLCAJCQlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIk9yaWdpbi1SZWFsbSIsCQkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJVc2VyLU5hbWUiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiT3JpZ2luLVN0YXRlLUlkIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkVycm9yLU1lc3NhZ2UiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiRXJyb3ItUmVwb3J0aW5nLUhvc3QiLAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJGYWlsZWQtQVZQIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIlJlZGlyZWN0LUhvc3QiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsLTEgfQorCQkJCQkJCSx7ICAiUmVkaXJlY3QtSG9zdC1Vc2FnZSIsCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIlJlZGlyZWN0LU1heC1DYWNoZS1UaW1lIiwJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiUHJveHktSW5mbyIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwtMSB9CisJCQkJCQl9OworCQkJCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9DT01NQU5ELCAmZGF0YSAsIE5VTEwsICZjbWQpOworCQkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgY21kICk7CisJCX0KKwkJCisJCS8qIFNlc3Npb24tVGVybWluYXRpb24tUmVxdWVzdCAqLworCQl7CisJCQkvKgorCQkJCVRoZSBTZXNzaW9uLVRlcm1pbmF0aW9uLVJlcXVlc3QgKFNUUiksIGluZGljYXRlZCBieSB0aGUgQ29tbWFuZC1Db2RlCisJCQkJc2V0IHRvIDI3NSBhbmQgdGhlIENvbW1hbmQgRmxhZ3MnICdSJyBiaXQgc2V0LCBpcyBzZW50IGJ5IHRoZSBhY2Nlc3MKKwkJCQlkZXZpY2UgdG8gaW5mb3JtIHRoZSBEaWFtZXRlciBTZXJ2ZXIgdGhhdCBhbiBhdXRoZW50aWNhdGVkIGFuZC9vcgorCQkJCWF1dGhvcml6ZWQgc2Vzc2lvbiBpcyBiZWluZyB0ZXJtaW5hdGVkLgorCisKKyAgICAgICAgCQkJCSAgIE1lc3NhZ2UgRm9ybWF0CisKKwkJCQkgPFNUUj4gOjo9IDwgRGlhbWV0ZXIgSGVhZGVyOiAyNzUsIFJFUSwgUFhZID4KKyAgICAgICAgCQkJCSAgIDwgU2Vzc2lvbi1JZCA+CisgICAgICAgIAkJCQkgICB7IE9yaWdpbi1Ib3N0IH0KKyAgICAgICAgCQkJCSAgIHsgT3JpZ2luLVJlYWxtIH0KKyAgICAgICAgCQkJCSAgIHsgRGVzdGluYXRpb24tUmVhbG0gfQorICAgICAgICAJCQkJICAgeyBBdXRoLUFwcGxpY2F0aW9uLUlkIH0KKyAgICAgICAgCQkJCSAgIHsgVGVybWluYXRpb24tQ2F1c2UgfQorICAgICAgICAJCQkJICAgWyBVc2VyLU5hbWUgXQorICAgICAgICAJCQkJICAgWyBEZXN0aW5hdGlvbi1Ib3N0IF0KKyAgICAgICAgCQkJCSAqIFsgQ2xhc3MgXQorICAgICAgICAJCQkJICAgWyBPcmlnaW4tU3RhdGUtSWQgXQorICAgICAgICAJCQkJICogWyBQcm94eS1JbmZvIF0KKyAgICAgICAgCQkJCSAqIFsgUm91dGUtUmVjb3JkIF0KKyAgICAgICAgCQkJCSAqIFsgQVZQIF0KKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBjbWQ7CisJCQlzdHJ1Y3QgZGljdF9jbWRfZGF0YSBkYXRhID0geyAKKwkJCQkJMjc1LCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJI2lmIENDX1NFU1NJT05fVEVSTUlOQVRJT04gIT0gMjc1CisJCQkJCSNlcnJvciAiQ0NfU0VTU0lPTl9URVJNSU5BVElPTiBkZWZpbml0aW9uIG1pc21hdGNoIgorCQkJCQkjZW5kaWYKKwkJCQkJIlNlc3Npb24tVGVybWluYXRpb24tUmVxdWVzdCIsIAkJLyogTmFtZSAqLworCQkJCQlDTURfRkxBR19SRVFVRVNUIHwgQ01EX0ZMQUdfUFJPWElBQkxFIHwgQ01EX0ZMQUdfRVJST1IsCS8qIEZpeGVkIGZsYWdzICovCisJCQkJCUNNRF9GTEFHX1JFUVVFU1QgfCBDTURfRkxBR19QUk9YSUFCTEUJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJfTsKKwkJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPSAKKwkJCQkJCXsgCSB7ICAiU2Vzc2lvbi1JZCIsIAkJCVJVTEVfRklYRURfSEVBRCwgLTEsIDEgfQorCQkJCQkJIAkseyAgIk9yaWdpbi1Ib3N0IiwgCQkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJPcmlnaW4tUmVhbG0iLAkJCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiRGVzdGluYXRpb24tUmVhbG0iLAkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCQkJCQkgCSx7ICAiQXV0aC1BcHBsaWNhdGlvbi1JZCIsIAkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCQkJCQkgCSx7ICAiVGVybWluYXRpb24tQ2F1c2UiLCAJCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiVXNlci1OYW1lIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkRlc3RpbmF0aW9uLUhvc3QiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiQ2xhc3MiLAkJCQlSVUxFX09QVElPTkFMLCAgIC0xLC0xIH0KKwkJCQkJCQkseyAgIk9yaWdpbi1TdGF0ZS1JZCIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJQcm94eS1JbmZvIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLC0xIH0KKwkJCQkJCQkseyAgIlJvdXRlLVJlY29yZCIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwtMSB9CisJCQkJCQl9OworCQkJCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9DT01NQU5ELCAmZGF0YSAsIE5VTEwsICZjbWQpOworCQkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgY21kICk7CisJCX0KKwkJCisJCS8qIFNlc3Npb24tVGVybWluYXRpb24tQW5zd2VyICovCisJCXsKKwkJCS8qCisJCQkJVGhlIFNlc3Npb24tVGVybWluYXRpb24tQW5zd2VyIChTVEEpLCBpbmRpY2F0ZWQgYnkgdGhlIENvbW1hbmQtQ29kZQorCQkJCXNldCB0byAyNzUgYW5kIHRoZSBtZXNzYWdlIGZsYWdzJyAnUicgYml0IGNsZWFyLCBpcyBzZW50IGJ5IHRoZQorCQkJCURpYW1ldGVyIFNlcnZlciB0byBhY2tub3dsZWRnZSB0aGUgbm90aWZpY2F0aW9uIHRoYXQgdGhlIHNlc3Npb24gaGFzCisJCQkJYmVlbiB0ZXJtaW5hdGVkLiAgVGhlIFJlc3VsdC1Db2RlIEFWUCBNVVNUIGJlIHByZXNlbnQsIGFuZCBNQVkKKwkJCQljb250YWluIGFuIGluZGljYXRpb24gdGhhdCBhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBzZXJ2aWNpbmcgdGhlIFNUUi4KKworCQkJCVVwb24gc2VuZGluZyBvciByZWNlaXB0IG9mIHRoZSBTVEEsIHRoZSBEaWFtZXRlciBTZXJ2ZXIgTVVTVCByZWxlYXNlCisJCQkJYWxsIHJlc291cmNlcyBmb3IgdGhlIHNlc3Npb24gaW5kaWNhdGVkIGJ5IHRoZSBTZXNzaW9uLUlkIEFWUC4gIEFueQorCQkJCWludGVybWVkaWF0ZSBzZXJ2ZXIgaW4gdGhlIFByb3h5LUNoYWluIE1BWSBhbHNvIHJlbGVhc2UgYW55CisJCQkJcmVzb3VyY2VzLCBpZiBuZWNlc3NhcnkuCisKKyAgICAgICAgCQkJCSAgICBNZXNzYWdlIEZvcm1hdAorCisJCQkJIDxTVEE+ICA6Oj0gPCBEaWFtZXRlciBIZWFkZXI6IDI3NSwgUFhZID4KKyAgICAgICAgCQkJCSAgICA8IFNlc3Npb24tSWQgPgorICAgICAgICAJCQkJICAgIHsgUmVzdWx0LUNvZGUgfQorICAgICAgICAJCQkJICAgIHsgT3JpZ2luLUhvc3QgfQorICAgICAgICAJCQkJICAgIHsgT3JpZ2luLVJlYWxtIH0KKyAgICAgICAgCQkJCSAgICBbIFVzZXItTmFtZSBdCisgICAgICAgIAkJCQkgICogWyBDbGFzcyBdCisgICAgICAgIAkJCQkgICAgWyBFcnJvci1NZXNzYWdlIF0KKyAgICAgICAgCQkJCSAgICBbIEVycm9yLVJlcG9ydGluZy1Ib3N0IF0KKyAgICAgICAgCQkJCSAgICBbIEZhaWxlZC1BVlAgXQorICAgICAgICAJCQkJICAgIFsgT3JpZ2luLVN0YXRlLUlkIF0KKyAgICAgICAgCQkJCSAgKiBbIFJlZGlyZWN0LUhvc3QgXQorICAgICAgICAJCQkJICAgIFsgUmVkaXJlY3QtSG9zdC1Vc2FnZSBdCisgICAgICAgIAkJCQkgICAgWyBSZWRpcmVjdC1NYXgtQ2FjaGUtVGltZSBdCisgICAgICAgIAkJCQkgICogWyBQcm94eS1JbmZvIF0KKyAgICAgICAgCQkJCSAgKiBbIEFWUCBdCisJCQkqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogY21kOworCQkJc3RydWN0IGRpY3RfY21kX2RhdGEgZGF0YSA9IHsgCisJCQkJCTI3NSwgCQkJCQkvKiBDb2RlICovCisJCQkJCSNpZiBDQ19TRVNTSU9OX1RFUk1JTkFUSU9OICE9IDI3NQorCQkJCQkjZXJyb3IgIkNDX1NFU1NJT05fVEVSTUlOQVRJT04gZGVmaW5pdGlvbiBtaXNtYXRjaCIKKwkJCQkJI2VuZGlmCisJCQkJCSJTZXNzaW9uLVRlcm1pbmF0aW9uLUFuc3dlciIsIAkJLyogTmFtZSAqLworCQkJCQlDTURfRkxBR19SRVFVRVNUIHwgQ01EX0ZMQUdfUFJPWElBQkxFLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQkJCSAgIENNRF9GTEFHX1BST1hJQUJMRQkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQl9OworCQkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9IAorCQkJCQkJeyAJIHsgICJTZXNzaW9uLUlkIiwgCQkJUlVMRV9GSVhFRF9IRUFELCAtMSwgMSB9CisgCQkJCQkJCSx7ICAiUmVzdWx0LUNvZGUiLCAJCQlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJCQkJCSAJLHsgICJPcmlnaW4tSG9zdCIsIAkJCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiT3JpZ2luLVJlYWxtIiwJCQlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIlVzZXItTmFtZSIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJDbGFzcyIsCQkJCVJVTEVfT1BUSU9OQUwsICAgLTEsLTEgfQorCQkJCQkJCSx7ICAiRXJyb3ItTWVzc2FnZSIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJFcnJvci1SZXBvcnRpbmctSG9zdCIsCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkZhaWxlZC1BVlAiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiT3JpZ2luLVN0YXRlLUlkIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIlJlZGlyZWN0LUhvc3QiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsLTEgfQorCQkJCQkJCSx7ICAiUmVkaXJlY3QtSG9zdC1Vc2FnZSIsCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIlJlZGlyZWN0LU1heC1DYWNoZS1UaW1lIiwJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiUHJveHktSW5mbyIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwtMSB9CisJCQkJCQl9OworCQkJCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9DT01NQU5ELCAmZGF0YSAsIE5VTEwsICZjbWQpOworCQkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgY21kICk7CisJCX0KKwkJCisJCS8qIEFib3J0LVNlc3Npb24tUmVxdWVzdCAqLworCQl7CisJCQkvKgorCQkJCVRoZSBBYm9ydC1TZXNzaW9uLVJlcXVlc3QgKEFTUiksIGluZGljYXRlZCBieSB0aGUgQ29tbWFuZC1Db2RlIHNldCB0bworCQkJCTI3NCBhbmQgdGhlIG1lc3NhZ2UgZmxhZ3MnICdSJyBiaXQgc2V0LCBtYXkgYmUgc2VudCBieSBhbnkgc2VydmVyIHRvCisJCQkJdGhlIGFjY2VzcyBkZXZpY2UgdGhhdCBpcyBwcm92aWRpbmcgc2Vzc2lvbiBzZXJ2aWNlLCB0byByZXF1ZXN0IHRoYXQKKwkJCQl0aGUgc2Vzc2lvbiBpZGVudGlmaWVkIGJ5IHRoZSBTZXNzaW9uLUlkIGJlIHN0b3BwZWQuCisKKworICAgICAgICAJCQkJICAgIE1lc3NhZ2UgRm9ybWF0CisKKwkJCQkgPEFTUj4gIDo6PSA8IERpYW1ldGVyIEhlYWRlcjogMjc0LCBSRVEsIFBYWSA+CisgICAgICAgIAkJCQkgICAgPCBTZXNzaW9uLUlkID4KKyAgICAgICAgCQkJCSAgICB7IE9yaWdpbi1Ib3N0IH0KKyAgICAgICAgCQkJCSAgICB7IE9yaWdpbi1SZWFsbSB9CisgICAgICAgIAkJCQkgICAgeyBEZXN0aW5hdGlvbi1SZWFsbSB9CisgICAgICAgIAkJCQkgICAgeyBEZXN0aW5hdGlvbi1Ib3N0IH0KKyAgICAgICAgCQkJCSAgICB7IEF1dGgtQXBwbGljYXRpb24tSWQgfQorICAgICAgICAJCQkJICAgIFsgVXNlci1OYW1lIF0KKyAgICAgICAgCQkJCSAgICBbIE9yaWdpbi1TdGF0ZS1JZCBdCisgICAgICAgIAkJCQkgICogWyBQcm94eS1JbmZvIF0KKyAgICAgICAgCQkJCSAgKiBbIFJvdXRlLVJlY29yZCBdCisgICAgICAgIAkJCQkgICogWyBBVlAgXQorCQkJKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGNtZDsKKwkJCXN0cnVjdCBkaWN0X2NtZF9kYXRhIGRhdGEgPSB7IAorCQkJCQkyNzQsIAkJCQkJLyogQ29kZSAqLworCQkJCQkjaWYgQ0NfQUJPUlRfU0VTU0lPTiAhPSAyNzQKKwkJCQkJI2Vycm9yICJDQ19BQk9SVF9TRVNTSU9OIGRlZmluaXRpb24gbWlzbWF0Y2giCisJCQkJCSNlbmRpZgorCQkJCQkiQWJvcnQtU2Vzc2lvbi1SZXF1ZXN0IiwgCQkvKiBOYW1lICovCisJCQkJCUNNRF9GTEFHX1JFUVVFU1QgfCBDTURfRkxBR19QUk9YSUFCTEUgfCBDTURfRkxBR19FUlJPUiwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQ01EX0ZMQUdfUkVRVUVTVCB8IENNRF9GTEFHX1BST1hJQUJMRQkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQl9OworCQkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9IAorCQkJCQkJeyAJIHsgICJTZXNzaW9uLUlkIiwgCQkJUlVMRV9GSVhFRF9IRUFELCAtMSwgMSB9CisJCQkJCQkgCSx7ICAiT3JpZ2luLUhvc3QiLCAJCQlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIk9yaWdpbi1SZWFsbSIsCQkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJEZXN0aW5hdGlvbi1SZWFsbSIsCQlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkRlc3RpbmF0aW9uLUhvc3QiLAkJCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkJCQkJIAkseyAgIkF1dGgtQXBwbGljYXRpb24tSWQiLCAJCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiVXNlci1OYW1lIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIk9yaWdpbi1TdGF0ZS1JZCIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJQcm94eS1JbmZvIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLC0xIH0KKwkJCQkJCQkseyAgIlJvdXRlLVJlY29yZCIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwtMSB9CisJCQkJCQl9OworCQkJCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9DT01NQU5ELCAmZGF0YSAsIE5VTEwsICZjbWQpOworCQkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgY21kICk7CisJCX0KKwkJCisJCS8qIEFib3J0LVNlc3Npb24tQW5zd2VyICovCisJCXsKKwkJCS8qCisJCQkJVGhlIEFib3J0LVNlc3Npb24tQW5zd2VyIChBU0EpLCBpbmRpY2F0ZWQgYnkgdGhlIENvbW1hbmQtQ29kZSBzZXQgdG8KKwkJCQkyNzQgYW5kIHRoZSBtZXNzYWdlIGZsYWdzJyAnUicgYml0IGNsZWFyLCBpcyBzZW50IGluIHJlc3BvbnNlIHRvIHRoZQorCQkJCUFTUi4gIFRoZSBSZXN1bHQtQ29kZSBBVlAgTVVTVCBiZSBwcmVzZW50LCBhbmQgaW5kaWNhdGVzIHRoZQorCQkJCWRpc3Bvc2l0aW9uIG9mIHRoZSByZXF1ZXN0LgorCisJCQkJSWYgdGhlIHNlc3Npb24gaWRlbnRpZmllZCBieSBTZXNzaW9uLUlkIGluIHRoZSBBU1Igd2FzIHN1Y2Nlc3NmdWxseQorCQkJCXRlcm1pbmF0ZWQsIFJlc3VsdC1Db2RlIGlzIHNldCB0byBESUFNRVRFUl9TVUNDRVNTLiAgSWYgdGhlIHNlc3Npb24KKwkJCQlpcyBub3QgY3VycmVudGx5IGFjdGl2ZSwgUmVzdWx0LUNvZGUgaXMgc2V0IHRvCisJCQkJRElBTUVURVJfVU5LTk9XTl9TRVNTSU9OX0lELiAgSWYgdGhlIGFjY2VzcyBkZXZpY2UgZG9lcyBub3Qgc3RvcCB0aGUKKwkJCQlzZXNzaW9uIGZvciBhbnkgb3RoZXIgcmVhc29uLCBSZXN1bHQtQ29kZSBpcyBzZXQgdG8KKwkJCQlESUFNRVRFUl9VTkFCTEVfVE9fQ09NUExZLgorCisgICAgICAgIAkJCQkgICAgTWVzc2FnZSBGb3JtYXQKKworCQkJCSA8QVNBPiAgOjo9IDwgRGlhbWV0ZXIgSGVhZGVyOiAyNzQsIFBYWSA+CisgICAgICAgIAkJCQkgICAgPCBTZXNzaW9uLUlkID4KKyAgICAgICAgCQkJCSAgICB7IFJlc3VsdC1Db2RlIH0KKyAgICAgICAgCQkJCSAgICB7IE9yaWdpbi1Ib3N0IH0KKyAgICAgICAgCQkJCSAgICB7IE9yaWdpbi1SZWFsbSB9CisgICAgICAgIAkJCQkgICAgWyBVc2VyLU5hbWUgXQorICAgICAgICAJCQkJICAgIFsgT3JpZ2luLVN0YXRlLUlkIF0KKyAgICAgICAgCQkJCSAgICBbIEVycm9yLU1lc3NhZ2UgXQorICAgICAgICAJCQkJICAgIFsgRXJyb3ItUmVwb3J0aW5nLUhvc3QgXQorICAgICAgICAJCQkJICAgIFsgRmFpbGVkLUFWUCBdCisgICAgICAgIAkJCQkgICogWyBSZWRpcmVjdC1Ib3N0IF0KKyAgICAgICAgCQkJCSAgICBbIFJlZGlyZWN0LUhvc3QtVXNhZ2UgXQorICAgICAgICAJCQkJICAgIFsgUmVkaXJlY3QtTWF4LUNhY2hlLVRpbWUgXQorICAgICAgICAJCQkJICAqIFsgUHJveHktSW5mbyBdCisgICAgICAgIAkJCQkgICogWyBBVlAgXQorCQkJKi8KKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGNtZDsKKwkJCXN0cnVjdCBkaWN0X2NtZF9kYXRhIGRhdGEgPSB7IAorCQkJCQkyNzQsIAkJCQkJLyogQ29kZSAqLworCQkJCQkjaWYgQ0NfQUJPUlRfU0VTU0lPTiAhPSAyNzQKKwkJCQkJI2Vycm9yICJDQ19BQk9SVF9TRVNTSU9OIGRlZmluaXRpb24gbWlzbWF0Y2giCisJCQkJCSNlbmRpZgorCQkJCQkiQWJvcnQtU2Vzc2lvbi1BbnN3ZXIiLCAJCS8qIE5hbWUgKi8KKwkJCQkJQ01EX0ZMQUdfUkVRVUVTVCB8IENNRF9GTEFHX1BST1hJQUJMRSwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJCQkgICBDTURfRkxBR19QUk9YSUFCTEUJLyogRml4ZWQgZmxhZyB2YWx1ZXMgKi8KKwkJCQkJfTsKKwkJCXN0cnVjdCBsb2NhbF9ydWxlc19kZWZpbml0aW9uIHJ1bGVzW10gPSAKKwkJCQkJCXsgCSB7ICAiU2Vzc2lvbi1JZCIsIAkJCVJVTEVfRklYRURfSEVBRCwgLTEsIDEgfQorIAkJCQkJCQkseyAgIlJlc3VsdC1Db2RlIiwgCQkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCQkJCQkgCSx7ICAiT3JpZ2luLUhvc3QiLCAJCQlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIk9yaWdpbi1SZWFsbSIsCQkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJVc2VyLU5hbWUiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiT3JpZ2luLVN0YXRlLUlkIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkVycm9yLU1lc3NhZ2UiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiRXJyb3ItUmVwb3J0aW5nLUhvc3QiLAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJGYWlsZWQtQVZQIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIlJlZGlyZWN0LUhvc3QiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsLTEgfQorCQkJCQkJCSx7ICAiUmVkaXJlY3QtSG9zdC1Vc2FnZSIsCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIlJlZGlyZWN0LU1heC1DYWNoZS1UaW1lIiwJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiUHJveHktSW5mbyIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwtMSB9CisJCQkJCQl9OworCQkJCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9DT01NQU5ELCAmZGF0YSAsIE5VTEwsICZjbWQpOworCQkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgY21kICk7CisJCX0KKwkJCisJCS8qIEFjY291bnRpbmctUmVxdWVzdCAqLworCQl7CisJCQkvKgorCQkJCVRoZSBBY2NvdW50aW5nLVJlcXVlc3QgKEFDUikgY29tbWFuZCwgaW5kaWNhdGVkIGJ5IHRoZSBDb21tYW5kLUNvZGUKKwkJCQlmaWVsZCBzZXQgdG8gMjcxIGFuZCB0aGUgQ29tbWFuZCBGbGFncycgJ1InIGJpdCBzZXQsIGlzIHNlbnQgYnkgYQorCQkJCURpYW1ldGVyIG5vZGUsIGFjdGluZyBhcyBhIGNsaWVudCwgaW4gb3JkZXIgdG8gZXhjaGFuZ2UgYWNjb3VudGluZworCQkJCWluZm9ybWF0aW9uIHdpdGggYSBwZWVyLgorCisJCQkJT25lIG9mIEFjY3QtQXBwbGljYXRpb24tSWQgYW5kIFZlbmRvci1TcGVjaWZpYy1BcHBsaWNhdGlvbi1JZCBBVlBzCisJCQkJTVVTVCBiZSBwcmVzZW50LiAgSWYgdGhlIFZlbmRvci1TcGVjaWZpYy1BcHBsaWNhdGlvbi1JZCBncm91cGVkIEFWUAorCQkJCWlzIHByZXNlbnQsIGl0IE1VU1QgaW5jbHVkZSBhbiBBY2N0LUFwcGxpY2F0aW9uLUlkIEFWUC4KKworCQkJCVRoZSBBVlAgbGlzdGVkIGJlbG93IFNIT1VMRCBpbmNsdWRlIHNlcnZpY2Ugc3BlY2lmaWMgYWNjb3VudGluZyBBVlBzLAorCQkJCWFzIGRlc2NyaWJlZCBpbiBTZWN0aW9uIDkuMy4KKworCisJCQkJTWVzc2FnZSBGb3JtYXQKKworCQkJCSA8QUNSPiA6Oj0gPCBEaWFtZXRlciBIZWFkZXI6IDI3MSwgUkVRLCBQWFkgPgorICAgICAgICAJCQkJICAgPCBTZXNzaW9uLUlkID4KKyAgICAgICAgCQkJCSAgIHsgT3JpZ2luLUhvc3QgfQorICAgICAgICAJCQkJICAgeyBPcmlnaW4tUmVhbG0gfQorICAgICAgICAJCQkJICAgeyBEZXN0aW5hdGlvbi1SZWFsbSB9CisgICAgICAgIAkJCQkgICB7IEFjY291bnRpbmctUmVjb3JkLVR5cGUgfQorICAgICAgICAJCQkJICAgeyBBY2NvdW50aW5nLVJlY29yZC1OdW1iZXIgfQorICAgICAgICAJCQkJICAgWyBBY2N0LUFwcGxpY2F0aW9uLUlkIF0KKyAgICAgICAgCQkJCSAgIFsgVmVuZG9yLVNwZWNpZmljLUFwcGxpY2F0aW9uLUlkIF0KKyAgICAgICAgCQkJCSAgIFsgVXNlci1OYW1lIF0KKyAgICAgICAgCQkJCSAgIFsgRGVzdGluYXRpb24tSG9zdCBdCisgICAgICAgIAkJCQkgICBbIEFjY291bnRpbmctU3ViLVNlc3Npb24tSWQgXQorICAgICAgICAJCQkJICAgWyBBY2N0LVNlc3Npb24tSWQgXQorICAgICAgICAJCQkJICAgWyBBY2N0LU11bHRpLVNlc3Npb24tSWQgXQorICAgICAgICAJCQkJICAgWyBBY2N0LUludGVyaW0tSW50ZXJ2YWwgXQorICAgICAgICAJCQkJICAgWyBBY2NvdW50aW5nLVJlYWx0aW1lLVJlcXVpcmVkIF0KKyAgICAgICAgCQkJCSAgIFsgT3JpZ2luLVN0YXRlLUlkIF0KKyAgICAgICAgCQkJCSAgIFsgRXZlbnQtVGltZXN0YW1wIF0KKyAgICAgICAgCQkJCSAqIFsgUHJveHktSW5mbyBdCisgICAgICAgIAkJCQkgKiBbIFJvdXRlLVJlY29yZCBdCisgICAgICAgIAkJCQkgKiBbIEFWUCBdCisJCQkqLworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogY21kOworCQkJc3RydWN0IGRpY3RfY21kX2RhdGEgZGF0YSA9IHsgCisJCQkJCTI3MSwgCQkJCQkvKiBDb2RlICovCisJCQkJCSNpZiBDQ19BQ0NPVU5USU5HICE9IDI3MQorCQkJCQkjZXJyb3IgIkNDX0FDQ09VTlRJTkcgZGVmaW5pdGlvbiBtaXNtYXRjaCIKKwkJCQkJI2VuZGlmCisJCQkJCSJBY2NvdW50aW5nLVJlcXVlc3QiLCAJCQkvKiBOYW1lICovCisJCQkJCUNNRF9GTEFHX1JFUVVFU1QgfCBDTURfRkxBR19QUk9YSUFCTEUgfCBDTURfRkxBR19FUlJPUiwJLyogRml4ZWQgZmxhZ3MgKi8KKwkJCQkJQ01EX0ZMQUdfUkVRVUVTVCB8IENNRF9GTEFHX1BST1hJQUJMRQkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQl9OworCQkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9IAorCQkJCQkJeyAJIHsgICJTZXNzaW9uLUlkIiwgCQkJUlVMRV9GSVhFRF9IRUFELCAtMSwgMSB9CisJCQkJCQkgCSx7ICAiT3JpZ2luLUhvc3QiLCAJCQlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIk9yaWdpbi1SZWFsbSIsCQkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJEZXN0aW5hdGlvbi1SZWFsbSIsCQlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkFjY291bnRpbmctUmVjb3JkLVR5cGUiLAkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJBY2NvdW50aW5nLVJlY29yZC1OdW1iZXIiLAkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJBY2N0LUFwcGxpY2F0aW9uLUlkIiwJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiVmVuZG9yLVNwZWNpZmljLUFwcGxpY2F0aW9uLUlkIiwJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJVc2VyLU5hbWUiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiRGVzdGluYXRpb24tSG9zdCIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJBY2NvdW50aW5nLVN1Yi1TZXNzaW9uLUlkIiwJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJBY2N0LVNlc3Npb24tSWQiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiQWNjdC1NdWx0aS1TZXNzaW9uLUlkIiwJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiQWNjdC1JbnRlcmltLUludGVydmFsIiwJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiQWNjb3VudGluZy1SZWFsdGltZS1SZXF1aXJlZCIsCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiT3JpZ2luLVN0YXRlLUlkIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkV2ZW50LVRpbWVzdGFtcCIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJQcm94eS1JbmZvIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLC0xIH0KKwkJCQkJCQkseyAgIlJvdXRlLVJlY29yZCIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwtMSB9CisJCQkJCQl9OworCQkJCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9DT01NQU5ELCAmZGF0YSAsIE5VTEwsICZjbWQpOworCQkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgY21kICk7CisJCX0KKwkJCisJCS8qIEFjY291bnRpbmctQW5zd2VyICovCisJCXsKKwkJCS8qCisJCQkJVGhlIEFjY291bnRpbmctQW5zd2VyIChBQ0EpIGNvbW1hbmQsIGluZGljYXRlZCBieSB0aGUgQ29tbWFuZC1Db2RlCisJCQkJZmllbGQgc2V0IHRvIDI3MSBhbmQgdGhlIENvbW1hbmQgRmxhZ3MnICdSJyBiaXQgY2xlYXJlZCwgaXMgdXNlZCB0bworCQkJCWFja25vd2xlZGdlIGFuIEFjY291bnRpbmctUmVxdWVzdCBjb21tYW5kLiAgVGhlIEFjY291bnRpbmctQW5zd2VyCisJCQkJY29tbWFuZCBjb250YWlucyB0aGUgc2FtZSBTZXNzaW9uLUlkIGFzIHRoZSBjb3JyZXNwb25kaW5nIHJlcXVlc3QuCisKKwkJCQlPbmx5IHRoZSB0YXJnZXQgRGlhbWV0ZXIgU2VydmVyLCBrbm93biBhcyB0aGUgaG9tZSBEaWFtZXRlciBTZXJ2ZXIsCisJCQkJU0hPVUxEIHJlc3BvbmQgd2l0aCB0aGUgQWNjb3VudGluZy1BbnN3ZXIgY29tbWFuZC4KKworCQkJCU9uZSBvZiBBY2N0LUFwcGxpY2F0aW9uLUlkIGFuZCBWZW5kb3ItU3BlY2lmaWMtQXBwbGljYXRpb24tSWQgQVZQcworCQkJCU1VU1QgYmUgcHJlc2VudC4gIElmIHRoZSBWZW5kb3ItU3BlY2lmaWMtQXBwbGljYXRpb24tSWQgZ3JvdXBlZCBBVlAKKwkJCQlpcyBwcmVzZW50LCBpdCBNVVNUIGNvbnRhaW4gYW4gQWNjdC1BcHBsaWNhdGlvbi1JZCBBVlAuCisKKwkJCQlUaGUgQVZQIGxpc3RlZCBiZWxvdyBTSE9VTEQgaW5jbHVkZSBzZXJ2aWNlIHNwZWNpZmljIGFjY291bnRpbmcgQVZQcywKKwkJCQlhcyBkZXNjcmliZWQgaW4gU2VjdGlvbiA5LjMuCisKKworCQkJCU1lc3NhZ2UgRm9ybWF0CisKKwkJCQkgPEFDQT4gOjo9IDwgRGlhbWV0ZXIgSGVhZGVyOiAyNzEsIFBYWSA+CisgICAgICAgIAkJCQkgICA8IFNlc3Npb24tSWQgPgorICAgICAgICAJCQkJICAgeyBSZXN1bHQtQ29kZSB9CisgICAgICAgIAkJCQkgICB7IE9yaWdpbi1Ib3N0IH0KKyAgICAgICAgCQkJCSAgIHsgT3JpZ2luLVJlYWxtIH0KKyAgICAgICAgCQkJCSAgIHsgQWNjb3VudGluZy1SZWNvcmQtVHlwZSB9CisgICAgICAgIAkJCQkgICB7IEFjY291bnRpbmctUmVjb3JkLU51bWJlciB9CisgICAgICAgIAkJCQkgICBbIEFjY3QtQXBwbGljYXRpb24tSWQgXQorICAgICAgICAJCQkJICAgWyBWZW5kb3ItU3BlY2lmaWMtQXBwbGljYXRpb24tSWQgXQorICAgICAgICAJCQkJICAgWyBVc2VyLU5hbWUgXQorICAgICAgICAJCQkJICAgWyBBY2NvdW50aW5nLVN1Yi1TZXNzaW9uLUlkIF0KKyAgICAgICAgCQkJCSAgIFsgQWNjdC1TZXNzaW9uLUlkIF0KKyAgICAgICAgCQkJCSAgIFsgQWNjdC1NdWx0aS1TZXNzaW9uLUlkIF0KKyAgICAgICAgCQkJCSAgIFsgRXJyb3ItTWVzc2FnZSBdCisgICAgICAgIAkJCQkgICBbIEVycm9yLVJlcG9ydGluZy1Ib3N0IF0KKyAgICAgICAgCQkJCSAgIFsgRmFpbGVkLUFWUCBdCisgICAgICAgIAkJCQkgICBbIEFjY3QtSW50ZXJpbS1JbnRlcnZhbCBdCisgICAgICAgIAkJCQkgICBbIEFjY291bnRpbmctUmVhbHRpbWUtUmVxdWlyZWQgXQorICAgICAgICAJCQkJICAgWyBPcmlnaW4tU3RhdGUtSWQgXQorICAgICAgICAJCQkJICAgWyBFdmVudC1UaW1lc3RhbXAgXQorICAgICAgICAJCQkJICogWyBQcm94eS1JbmZvIF0KKyAgICAgICAgCQkJCSAqIFsgQVZQIF0KKwkJCSovCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBjbWQ7CisJCQlzdHJ1Y3QgZGljdF9jbWRfZGF0YSBkYXRhID0geyAKKwkJCQkJMjcxLCAJCQkJCS8qIENvZGUgKi8KKwkJCQkJI2lmIENDX0FDQ09VTlRJTkcgIT0gMjcxCisJCQkJCSNlcnJvciAiQ0NfQUNDT1VOVElORyBkZWZpbml0aW9uIG1pc21hdGNoIgorCQkJCQkjZW5kaWYKKwkJCQkJIkFjY291bnRpbmctQW5zd2VyIiwgCQkJLyogTmFtZSAqLworCQkJCQlDTURfRkxBR19SRVFVRVNUIHwgQ01EX0ZMQUdfUFJPWElBQkxFLAkvKiBGaXhlZCBmbGFncyAqLworCQkJCQkJCSAgIENNRF9GTEFHX1BST1hJQUJMRQkvKiBGaXhlZCBmbGFnIHZhbHVlcyAqLworCQkJCQl9OworCQkJc3RydWN0IGxvY2FsX3J1bGVzX2RlZmluaXRpb24gcnVsZXNbXSA9IAorCQkJCQkJeyAJIHsgICJTZXNzaW9uLUlkIiwgCQkJUlVMRV9GSVhFRF9IRUFELCAtMSwgMSB9CisgCQkJCQkJCSx7ICAiUmVzdWx0LUNvZGUiLCAJCQlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJCQkJCSAJLHsgICJPcmlnaW4tSG9zdCIsIAkJCVJVTEVfUkVRVUlSRUQsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiT3JpZ2luLVJlYWxtIiwJCQlSVUxFX1JFUVVJUkVELCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkFjY291bnRpbmctUmVjb3JkLVR5cGUiLAkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJBY2NvdW50aW5nLVJlY29yZC1OdW1iZXIiLAkJUlVMRV9SRVFVSVJFRCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJBY2N0LUFwcGxpY2F0aW9uLUlkIiwJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiVmVuZG9yLVNwZWNpZmljLUFwcGxpY2F0aW9uLUlkIiwJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJVc2VyLU5hbWUiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiQWNjb3VudGluZy1TdWItU2Vzc2lvbi1JZCIsCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiQWNjdC1TZXNzaW9uLUlkIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkFjY3QtTXVsdGktU2Vzc2lvbi1JZCIsCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkVycm9yLU1lc3NhZ2UiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiRXJyb3ItUmVwb3J0aW5nLUhvc3QiLAkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJGYWlsZWQtQVZQIiwJCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkFjY3QtSW50ZXJpbS1JbnRlcnZhbCIsCQlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIkFjY291bnRpbmctUmVhbHRpbWUtUmVxdWlyZWQiLAlSVUxFX09QVElPTkFMLCAgIC0xLCAxIH0KKwkJCQkJCQkseyAgIk9yaWdpbi1TdGF0ZS1JZCIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwgMSB9CisJCQkJCQkJLHsgICJFdmVudC1UaW1lc3RhbXAiLAkJCVJVTEVfT1BUSU9OQUwsICAgLTEsIDEgfQorCQkJCQkJCSx7ICAiUHJveHktSW5mbyIsCQkJUlVMRV9PUFRJT05BTCwgICAtMSwtMSB9CisJCQkJCQl9OworCQkJCisJCQlDSEVDS19kaWN0X25ldyggRElDVF9DT01NQU5ELCAmZGF0YSAsIE5VTEwsICZjbWQpOworCQkJUEFSU0VfbG9jX3J1bGVzKCBydWxlcywgY21kICk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYmZkY29yZS9lbmRwb2ludHMuYyBiL2xpYmZkY29yZS9lbmRwb2ludHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODBjMmEzCi0tLSAvZGV2L251bGwKKysrIGIvbGliZmRjb3JlL2VuZHBvaW50cy5jCkBAIC0wLDAgKzEsMjcxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxMywgV0lERSBQcm9qZWN0IGFuZCBOSUNUCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBXSURFIFByb2plY3Qgb3IgTklDVCBub3IgdGhlIAkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFdJREUgUHJvamVjdCBhbmQgCQkJCQkJICoKKyogICBOSUNULgkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJmZGNvcmUtaW50ZXJuYWwuaCIKKworCisvKiBBZGQgYW4gZW5kcG9pbnQgaW5mb3JtYXRpb24gaW4gYSBsaXN0ICovCitpbnQgZmRfZXBfYWRkX21lcmdlKCBzdHJ1Y3QgZmRfbGlzdCAqIGxpc3QsIHNTQSAqIHNhLCBzb2NrbGVuX3Qgc2wsIHVpbnQzMl90IGZsYWdzICkKK3sKKwlzdHJ1Y3QgZmRfZW5kcG9pbnQgKiBlcDsKKwlzdHJ1Y3QgZmRfbGlzdCAqIGxpOworCXVuaW9uIHsKKwkJc1NBICogc2E7CisJCXNTQTQgKnNpbjsKKwkJc1NBNiAqc2luNjsKKwl9IHB0cjsKKwlpbl9wb3J0X3QgKiBwb3J0OworCWludCBjbXAgPSAtMTsKKwkKKwlUUkFDRV9FTlRSWSgiJXAgJXAgJXUgJXgiLCBsaXN0LCBzYSwgc2wsIGZsYWdzKTsKKwlDSEVDS19QQVJBTVMoIGxpc3QgJiYgc2EgJiYgKHNsIDw9IHNpemVvZihzU1MpKSApOworCQorCWlmIChsaXN0LT5uZXh0ID09IE5VTEwpIHsKKwkJLyogdGhlIGxpc3QgaXMgbm90IGluaXRpYWxpemVkIHlldCwgZG8gaXQgKi8KKwkJZmRfbGlzdF9pbml0KGxpc3QsIE5VTEwpOworCX0KKwkKKwlwdHIuc2EgPSBzYTsKKwkKKwkvKiBGaWx0ZXIgb3V0IGEgYnVuY2ggb2YgaW52YWxpZCBhZGRyZXNzZXMgKi8KKwlzd2l0Y2ggKHNhLT5zYV9mYW1pbHkpIHsKKwkJY2FzZSBBRl9JTkVUOgorCQkJaWYgKCEgKGZsYWdzICYgRVBfQUNDRVBUQUxMKSkgeworCQkJCWlmIChJTl9JU19BRERSX1VOU1BFQ0lGSUVEKCZwdHIuc2luLT5zaW5fYWRkcikgCisJCQkJIHx8IElOX0lTX0FERFJfTE9PUEJBQ0soJnB0ci5zaW4tPnNpbl9hZGRyKQorCQkJCSAgICAvKiB0aGUgbmV4dCBvbmUgZmlsdGVycyBib3RoIEVYUEVSSU1FTlRBTCwgQkFEQ0xBU1MgYW5kIE1VTFRJQ0FTVC4gKi8KKwkJCQkgfHwgKChudG9obChwdHIuc2luLT5zaW5fYWRkci5zX2FkZHIpICYgMHhlMDAwMDAwMCkgPT0gMHhlMDAwMDAwMCkKKwkJCQkgfHwgKHB0ci5zaW4tPnNpbl9hZGRyLnNfYWRkciA9PSBJTkFERFJfQlJPQURDQVNUKSkgeworCQkJCQlMT0dfQSgiICBERUJVRzpmZF9lcF9hZGRfbWVyZ2UgIEFkZHJlc3Mgd2FzIGlnbm9yZWQsIG5vdCBhZGRlZC4iKTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJfQorCQkJcG9ydCA9ICZwdHIuc2luLT5zaW5fcG9ydDsKKwkJCWJyZWFrOworCisJCWNhc2UgQUZfSU5FVDY6CisJCQlpZiAoISAoZmxhZ3MgJiBFUF9BQ0NFUFRBTEwpKSB7CisJCQkJaWYgKElONl9JU19BRERSX1VOU1BFQ0lGSUVEKCZwdHIuc2luNi0+c2luNl9hZGRyKSAKKwkJCQkgfHwgSU42X0lTX0FERFJfTE9PUEJBQ0soJnB0ci5zaW42LT5zaW42X2FkZHIpCisJCQkJIHx8IElONl9JU19BRERSX01VTFRJQ0FTVCgmcHRyLnNpbjYtPnNpbjZfYWRkcikKKwkJCQkgfHwgSU42X0lTX0FERFJfTElOS0xPQ0FMKCZwdHIuc2luNi0+c2luNl9hZGRyKQorCQkJCSB8fCBJTjZfSVNfQUREUl9TSVRFTE9DQUwoJnB0ci5zaW42LT5zaW42X2FkZHIpKSB7CisJCQkJCUxPR19BKCIgIERFQlVHOmZkX2VwX2FkZF9tZXJnZSAgQWRkcmVzcyB3YXMgaWdub3JlZCwgbm90IGFkZGVkLiIpOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQl9CisJCQlwb3J0ID0gJnB0ci5zaW42LT5zaW42X3BvcnQ7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJTE9HX0EoIiAgREVCVUc6ZmRfZXBfYWRkX21lcmdlICBBZGRyZXNzIGZhbWlseSB3YXMgdW5rbm93biwgbm90IGFkZGVkLiIpOworCQkJcmV0dXJuIDA7CisJfQorCQorCS8qIHJlbW92ZSB0aGUgQUNDRVBUQUxMIGZsYWcgKi8KKwlmbGFncyAmPSB+RVBfQUNDRVBUQUxMOworCQorCS8qIFNlYXJjaCBwbGFjZSBpbiB0aGUgbGlzdCAqLworCWZvciAobGkgPSBsaXN0LT5uZXh0OyBsaSAhPSBsaXN0OyBsaSA9IGxpLT5uZXh0KSB7CisJCWVwID0gKHN0cnVjdCBmZF9lbmRwb2ludCAqKWxpOworCQlpbl9wb3J0X3QgKiBlcF9wb3J0OworCQkKKwkJLyogRmlyc3QsIGNvbXBhcmUgdGhlIGFkZHJlc3MgZmFtaWx5ICovCisJCWlmIChlcC0+c2Euc2FfZmFtaWx5IDwgc2EtPnNhX2ZhbWlseSkKKwkJCWNvbnRpbnVlOworCQlpZiAoZXAtPnNhLnNhX2ZhbWlseSA+IHNhLT5zYV9mYW1pbHkpCisJCQlicmVhazsKKwkJCisJCS8qIFRoZW4gY29tcGFyZSB0aGUgYWRkcmVzcyBmaWVsZCAqLworCQlzd2l0Y2ggKHNhLT5zYV9mYW1pbHkpIHsKKwkJCWNhc2UgQUZfSU5FVDoKKwkJCQljbXAgPSBtZW1jbXAoJmVwLT5zaW4uc2luX2FkZHIsICZwdHIuc2luLT5zaW5fYWRkciwgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSk7CisJCQkJZXBfcG9ydCA9ICZlcC0+c2luLnNpbl9wb3J0OworCQkJCWJyZWFrOworCQkJY2FzZSBBRl9JTkVUNjoKKwkJCQljbXAgPSBtZW1jbXAoJmVwLT5zaW42LnNpbjZfYWRkciwgJnB0ci5zaW42LT5zaW42X2FkZHIsIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKKwkJCQllcF9wb3J0ID0gJmVwLT5zaW42LnNpbjZfcG9ydDsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJQVNTRVJUKCAwICk7IC8qIHdlIGdvdCBhIGRpZmZlcmVudCB2YWx1ZSBwcmV2aW91c2x5IGluIHRoaXMgc2FtZSBmdW5jdGlvbiAqLworCQl9CisJCWlmIChjbXAgPCAwKQorCQkJY29udGludWU7CisJCWlmIChjbXAgPiAwKQorCQkJYnJlYWs7CisJCQorCQkvKiBGaW5hbGx5IGNvbXBhcmUgdGhlIHBvcnQsIG9ubHkgaWYgbm90IDAgKi8KKwkJaWYgKCpwb3J0ID09IDApCisJCQlicmVhazsKKwkJaWYgKCplcF9wb3J0ID09IDApIHsKKwkJCS8qIHNhdmUgdGhlIHBvcnQgaW5mb3JtYXRpb24gaW4gdGhlIGxpc3QsIGFuZCBicmVhayAqLworCQkJKmVwX3BvcnQgPSAqcG9ydDsKKwkJCWJyZWFrOworCQl9CisJCWlmICgqZXBfcG9ydCA8ICpwb3J0KSB7CisJCQljbXAgPSAtMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICgqZXBfcG9ydCA+ICpwb3J0KQorCQkJY21wID0gMTsKKwkJYnJlYWs7CisJfQorCQorCWlmIChjbXApIHsKKwkJLyogbmV3IGl0ZW0gdG8gYmUgYWRkZWQgKi8KKwkJQ0hFQ0tfTUFMTE9DKCBlcCA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGZkX2VuZHBvaW50KSkgKTsKKwkJbWVtc2V0KGVwLCAwLCBzaXplb2Yoc3RydWN0IGZkX2VuZHBvaW50KSk7CisJCWZkX2xpc3RfaW5pdCgmZXAtPmNoYWluLCBOVUxMKTsKKwkJbWVtY3B5KCZlcC0+c3MsIHNhLCBzbCk7CisJCQorCQkvKiBJbnNlcnQgaW4gdGhlIGxpc3QgKi8KKwkJZmRfbGlzdF9pbnNlcnRfYmVmb3JlKGxpLCAmZXAtPmNoYWluKTsKKwl9CisJCisJLyogTWVyZ2UgdGhlIGZsYWdzICovCisJZXAtPmZsYWdzIHw9IGZsYWdzOworCQorCXJldHVybiAwOworfQorCisvKiBEZWxldGUgZW5kcG9pbnRzIHRoYXQgZG8gbm90IGhhdmUgYSBtYXRjaGluZyBmbGFnIGZyb20gYSBsaXN0ICgwOiBkZWxldGUgYWxsIGVuZHBvaW50cykgKi8KK2ludCBmZF9lcF9maWx0ZXIoIHN0cnVjdCBmZF9saXN0ICogbGlzdCwgdWludDMyX3QgZmxhZ3MgKQoreworCXN0cnVjdCBmZF9saXN0ICogbGk7CisJCisJVFJBQ0VfRU5UUlkoIiVwICV4IiwgbGlzdCwgZmxhZ3MpOworCUNIRUNLX1BBUkFNUyhsaXN0KTsKKwkKKwlmb3IgKGxpID0gbGlzdC0+bmV4dDsgbGkgIT0gbGlzdDsgbGkgPSBsaS0+bmV4dCkgeworCQlzdHJ1Y3QgZmRfZW5kcG9pbnQgKiBlcCA9IChzdHJ1Y3QgZmRfZW5kcG9pbnQgKilsaTsKKwkJCisJCWlmICghIChlcC0+ZmxhZ3MgJiBmbGFncykpIHsKKwkJCWxpID0gbGktPnByZXY7CisJCQlmZF9saXN0X3VubGluaygmZXAtPmNoYWluKTsKKwkJCWZyZWUoZXApOworCQl9CisJfQorCQorCXJldHVybiAwOworfQorCisvKiBLZWVwIG9ubHkgZW5kcG9pbnRzIG9mIHRoZSBzYW1lIGZhbWlseSBhcyBhZiAqLworaW50IGZkX2VwX2ZpbHRlcl9mYW1pbHkoIHN0cnVjdCBmZF9saXN0ICogbGlzdCwgaW50IGFmICkKK3sKKwlzdHJ1Y3QgZmRfbGlzdCAqIGxpOworCQorCVRSQUNFX0VOVFJZKCIlcCAlZCIsIGxpc3QsIGFmKTsKKwlDSEVDS19QQVJBTVMobGlzdCk7CisJCisJZm9yIChsaSA9IGxpc3QtPm5leHQ7IGxpICE9IGxpc3Q7IGxpID0gbGktPm5leHQpIHsKKwkJc3RydWN0IGZkX2VuZHBvaW50ICogZXAgPSAoc3RydWN0IGZkX2VuZHBvaW50ICopbGk7CisJCQorCQlpZiAoZXAtPnNhLnNhX2ZhbWlseSAhPSBhZikgeworCQkJbGkgPSBsaS0+cHJldjsKKwkJCWZkX2xpc3RfdW5saW5rKCZlcC0+Y2hhaW4pOworCQkJZnJlZShlcCk7CisJCX0KKwl9CisJCisJcmV0dXJuIDA7Cit9CisKKy8qIFJlc2V0IHRoZSBnaXZlbiBmbGFnKHMpIGZyb20gYWxsIGl0ZW1zIGluIHRoZSBsaXN0ICovCitpbnQgZmRfZXBfY2xlYXJmbGFncyggc3RydWN0IGZkX2xpc3QgKiBsaXN0LCB1aW50MzJfdCBmbGFncyApCit7CisJc3RydWN0IGZkX2xpc3QgKiBsaTsKKwkKKwlUUkFDRV9FTlRSWSgiJXAgJXgiLCBsaXN0LCBmbGFncyk7CisJQ0hFQ0tfUEFSQU1TKGxpc3QpOworCQorCWZvciAobGkgPSBsaXN0LT5uZXh0OyBsaSAhPSBsaXN0OyBsaSA9IGxpLT5uZXh0KSB7CisJCXN0cnVjdCBmZF9lbmRwb2ludCAqIGVwID0gKHN0cnVjdCBmZF9lbmRwb2ludCAqKWxpOworCQllcC0+ZmxhZ3MgJj0gfmZsYWdzOworCQlpZiAoZXAtPmZsYWdzID09IDApIHsKKwkJCWxpID0gbGktPnByZXY7CisJCQlmZF9saXN0X3VubGluaygmZXAtPmNoYWluKTsKKwkJCWZyZWUoZXApOworCQl9CisJfQorCQorCXJldHVybiAwOworfQorCitERUNMQVJFX0ZEX0RVTVBfUFJPVE9UWVBFKGZkX2VwX2R1bXBfb25lLCBpbnQgcHJlYW1ibGUsIHN0cnVjdCBmZF9lbmRwb2ludCAqIGVwICkKK3sKKwlGRF9EVU1QX0hBTkRMRV9PRkZTRVQoKTsKKwkKKwlpZiAocHJlYW1ibGUpIHsKKwkJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9kdW1wX2V4dGVuZCggRkRfRFVNUF9TVERfUEFSQU1TLCAie2VwfShAJXApOiAiLCBlcCksIHJldHVybiBOVUxMKTsKKwl9CisJCisJaWYgKCFlcCkgeworCQlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICJJTlZBTElEL05VTEwiKSwgcmV0dXJuIE5VTEwpOworCQlyZXR1cm4gKmJ1ZjsKKwl9CisJCisJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9zYV9kdW1wKCBGRF9EVU1QX1NURF9QQVJBTVMsICZlcC0+c2EsIE5JX05VTUVSSUNIT1NUIHwgTklfTlVNRVJJQ1NFUlYgKSwgcmV0dXJuIE5VTEwpOworCUNIRUNLX01BTExPQ19ETyggZmRfZHVtcF9leHRlbmQoIEZEX0RVTVBfU1REX1BBUkFNUywgInslcyVzJXMlcyVzfSIsCisJCQkJKGVwLT5mbGFncyAmIEVQX0ZMX0NPTkYpIAk/ICJDIiA6ICItIiwKKwkJCQkoZXAtPmZsYWdzICYgRVBfRkxfRElTQykgCT8gIkQiIDogIi0iLAorCQkJCShlcC0+ZmxhZ3MgJiBFUF9GTF9BRFYpIAk/ICJBIiA6ICItIiwKKwkJCQkoZXAtPmZsYWdzICYgRVBfRkxfTEwpIAkJPyAiTCIgOiAiLSIsCisJCQkJKGVwLT5mbGFncyAmIEVQX0ZMX1BSSU1BUlkpIAk/ICJQIiA6ICItIiksIHJldHVybiBOVUxMKTsKKwlyZXR1cm4gKmJ1ZjsKK30KKworREVDTEFSRV9GRF9EVU1QX1BST1RPVFlQRShmZF9lcF9kdW1wLCBpbnQgcHJlYW1ibGUsIGludCBpbmRlbnQsIHN0cnVjdCBmZF9saXN0ICogZXBzICApCit7CisJc3RydWN0IGZkX2xpc3QgKiBsaTsKKwkKKwlGRF9EVU1QX0hBTkRMRV9PRkZTRVQoKTsKKwkKKwlpZiAocHJlYW1ibGUpIHsKKwkJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9kdW1wX2V4dGVuZCggRkRfRFVNUF9TVERfUEFSQU1TLCAiJSpze2Vwc30oQCVwKToiLCBpbmRlbnQsICIiLCBlcHMpLCByZXR1cm4gTlVMTCk7CisJfQorCWlmIChlcHMpIHsKKwkJZm9yIChsaSA9IGVwcy0+bmV4dDsgbGkgIT0gZXBzOyBsaSA9IGxpLT5uZXh0KSB7CisJCQlzdHJ1Y3QgZmRfZW5kcG9pbnQgKiBlcCA9IChzdHJ1Y3QgZmRfZW5kcG9pbnQgKilsaTsKKwkJCWlmIChwcmVhbWJsZSkgeworCQkJCUNIRUNLX01BTExPQ19ETyggZmRfZHVtcF9leHRlbmQoIEZEX0RVTVBfU1REX1BBUkFNUywgIlxuJSpzIiwgaW5kZW50KzEsICIiKSwgcmV0dXJuIE5VTEwpOworCQkJfSBlbHNlIGlmIChsaS0+cHJldiAhPSBlcHMpIHsKKwkJCQlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICJcdCIpLCByZXR1cm4gTlVMTCk7CisJCQl9CisJCQlDSEVDS19NQUxMT0NfRE8oIGZkX2VwX2R1bXBfb25lKCBGRF9EVU1QX1NURF9QQVJBTVMsIHByZWFtYmxlLCBlcCApLCByZXR1cm4gTlVMTCk7CisJCX0KKwl9CisJcmV0dXJuICpidWY7Cit9CisJCmRpZmYgLS1naXQgYS9saWJmZGNvcmUvZXZlbnRzLmMgYi9saWJmZGNvcmUvZXZlbnRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVhNTg4NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmZkY29yZS9ldmVudHMuYwpAQCAtMCwwICsxLDIzMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTMsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiZmRjb3JlLWludGVybmFsLmgiCisKKy8qIEV2ZW50cyBhcmUgYSBzdWJzZXQgb2YgZmlmbyBxdWV1ZXMsIHdpdGggYSBrbm93biB0eXBlICovCisKK2ludCBmZF9ldmVudF9zZW5kKHN0cnVjdCBmaWZvICpxdWV1ZSwgaW50IGNvZGUsIHNpemVfdCBkYXRhc3osIHZvaWQgKiBkYXRhKQoreworCXN0cnVjdCBmZF9ldmVudCAqIGV2OworCUNIRUNLX01BTExPQyggZXYgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBmZF9ldmVudCkpICk7CisJZXYtPmNvZGUgPSBjb2RlOworCWV2LT5zaXplID0gZGF0YXN6OworCWV2LT5kYXRhID0gZGF0YTsKKwlDSEVDS19GQ1QoIGZkX2ZpZm9fcG9zdChxdWV1ZSwgJmV2KSApOworCXJldHVybiAwOworfQorCitpbnQgZmRfZXZlbnRfZ2V0KHN0cnVjdCBmaWZvICpxdWV1ZSwgaW50ICpjb2RlLCBzaXplX3QgKmRhdGFzeiwgdm9pZCAqKiBkYXRhKQoreworCXN0cnVjdCBmZF9ldmVudCAqIGV2OworCUNIRUNLX0ZDVCggZmRfZmlmb19nZXQocXVldWUsICZldikgKTsKKwlpZiAoY29kZSkKKwkJKmNvZGUgPSBldi0+Y29kZTsKKwlpZiAoZGF0YXN6KQorCQkqZGF0YXN6ID0gZXYtPnNpemU7CisJaWYgKGRhdGEpCisJCSpkYXRhID0gZXYtPmRhdGE7CisJZnJlZShldik7CisJcmV0dXJuIDA7Cit9CisKK2ludCBmZF9ldmVudF90aW1lZGdldChzdHJ1Y3QgZmlmbyAqcXVldWUsIHN0cnVjdCB0aW1lc3BlYyAqIHRpbWVvdXQsIGludCB0aW1lb3V0Y29kZSwgaW50ICpjb2RlLCBzaXplX3QgKmRhdGFzeiwgdm9pZCAqKiBkYXRhKQoreworCXN0cnVjdCBmZF9ldmVudCAqIGV2OworCWludCByZXQgPSAwOworCXJldCA9IGZkX2ZpZm9fdGltZWRnZXQocXVldWUsICZldiwgdGltZW91dCk7CisJaWYgKHJldCA9PSBFVElNRURPVVQpIHsKKwkJaWYgKGNvZGUpCisJCQkqY29kZSA9IHRpbWVvdXRjb2RlOworCQlpZiAoZGF0YXN6KQorCQkJKmRhdGFzeiA9IDA7CisJCWlmIChkYXRhKQorCQkJKmRhdGEgPSBOVUxMOworCX0gZWxzZSB7CisJCUNIRUNLX0ZDVCggcmV0ICk7CisJCWlmIChjb2RlKQorCQkJKmNvZGUgPSBldi0+Y29kZTsKKwkJaWYgKGRhdGFzeikKKwkJCSpkYXRhc3ogPSBldi0+c2l6ZTsKKwkJaWYgKGRhdGEpCisJCQkqZGF0YSA9IGV2LT5kYXRhOworCQlmcmVlKGV2KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZmRfZXZlbnRfZGVzdHJveShzdHJ1Y3QgZmlmbyAqKnF1ZXVlLCB2b2lkICgqZnJlZV9jYikodm9pZCAqIGRhdGEpKQoreworCXN0cnVjdCBmZF9ldmVudCAqIGV2OworCS8qIFB1cmdlIGFsbCBldmVudHMsIGFuZCBmcmVlIHRoZSBhc3NvY2lhdGVkIGRhdGEgaWYgYW55ICovCisJd2hpbGUgKGZkX2ZpZm9fdHJ5Z2V0KCAqcXVldWUsICZldiApID09IDApIHsKKwkJKCpmcmVlX2NiKShldi0+ZGF0YSk7CisJCWZyZWUoZXYpOworCX0KKwlDSEVDS19GQ1RfRE8oIGZkX2ZpZm9fZGVsKHF1ZXVlKSwgLyogY29udGludWUgKi8gKTsKKwlyZXR1cm4gOworfSAKKworY29uc3QgY2hhciAqIGZkX2V2X3N0cihpbnQgZXZlbnQpCit7CisJc3dpdGNoIChldmVudCkgeworCSNkZWZpbmUgY2FzZV9zdHIoIF92YWwgKVwKKwkJY2FzZSBfdmFsIDogcmV0dXJuICNfdmFsCisJCWNhc2Vfc3RyKEZERVZfVEVSTUlOQVRFX0lOVCk7CisJCWNhc2Vfc3RyKEZERVZfVFJJR0dFUik7CisJCQorCQlkZWZhdWx0OgorCQkJVFJBQ0VfREVCVUcoRlVMTCwgIlVua25vd24gZXZlbnQgOiAlZCIsIGV2ZW50KTsKKwkJCXJldHVybiAiVW5rbm93biBldmVudCI7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFRyaWdnZWQgZXZlbnRzICovCisvKiBUaGlzIGFsbG93cyBleHRlbnNpb25zIHRvIHJlZ2lzdGVyIGZvciAvIHNlbmQgdHJpZ2dlcnMgdG8gb3RoZXIgZXh0ZW5zaW9ucyAqLworLyogSXQgaXMgdXNlZCBmb3IgZXhhbXBsZSBmb3IgdXNlcnMgaW50ZXJhY3Rpb25zICh0aHJvdWdoIHNpZ25hbHMgb3IgLi4uKSAqLworCisvKiBCZWNhdXNlIHRoZSBudW1iZXIgb2YgdHJpZ2dlcnMgaXMgbm90IGV4cGVjdGVkIHRvIGdyb3csIHdlIHVzZSBhIHNpbXBsZSBvcmRlcmVkIGNoYWluZWQgbGlzdCAqLworc3RhdGljIHB0aHJlYWRfcndsb2NrX3QgdHJpZ19yd2wgPSBQVEhSRUFEX1JXTE9DS19JTklUSUFMSVpFUjsKK3N0YXRpYyBzdHJ1Y3QgZmRfbGlzdCAgIHRyaWdfbGlzdCA9IEZEX0xJU1RfSU5JVElBTElaRVIodHJpZ19saXN0KTsgLyogVGhlIGxpc3Qgb2YgdHJpZ2dlcnMgb3JkZXJlZCBieSB0cmlnZ2VyIHZhbHVlICovCitzdHJ1Y3QgdHJpZ19pdGVtIHsKKwlzdHJ1Y3QgZmRfbGlzdCAJY2hhaW47CisJaW50ICAJCXRyaWdfdmFsdWU7CisJY29uc3QgY2hhciAqIAl0cmlnX21vZHVsZTsKKwl2b2lkIAkJKCpjYikodm9pZCk7Cit9OwkKKworLyogQWRkIGEgbmV3IGVudHJ5IGluIHRoZSB0cmlnZ2VyIGxpc3QgKi8KK2ludCBmZF9ldmVudF90cmlnX3JlZ2NiKGludCB0cmlnZ2VyX3ZhbCwgY29uc3QgY2hhciAqIG1vZHVsZSwgdm9pZCAoKmNiKSh2b2lkKSkKK3sKKwlzdHJ1Y3QgdHJpZ19pdGVtICogdGk7CisJc3RydWN0IGZkX2xpc3QgKiBsaTsKKwkKKwlUUkFDRV9FTlRSWSgiJWQgJXAgJXAiLCB0cmlnZ2VyX3ZhbCwgbW9kdWxlLCBjYik7CisJQ0hFQ0tfUEFSQU1TKCB0cmlnZ2VyX3ZhbCAmJiBjYiApOworCQorCS8qIENyZWF0ZSBhIG5ldyB0cmlnX2l0ZW0gKi8KKwlDSEVDS19NQUxMT0MoIHRpID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgdHJpZ19pdGVtKSkgKTsKKwltZW1zZXQodGksIDAsIHNpemVvZihzdHJ1Y3QgdHJpZ19pdGVtKSk7CisJZmRfbGlzdF9pbml0KCZ0aS0+Y2hhaW4sIHRpKTsKKwl0aS0+dHJpZ192YWx1ZSA9IHRyaWdnZXJfdmFsOworCXRpLT50cmlnX21vZHVsZSA9IG1vZHVsZTsKKwl0aS0+Y2IgPSBjYjsKKwkKKwkvKiBOb3cgaW5zZXJ0IGluIHRoZSBsaXN0ICovCisJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfcndsb2NrX3dybG9jaygmdHJpZ19yd2wpICk7CisJCisJZm9yIChsaSA9IHRyaWdfbGlzdC5uZXh0OyBsaSAhPSAmdHJpZ19saXN0OyBsaSA9IGxpLT5uZXh0KSB7CisJCXN0cnVjdCB0cmlnX2l0ZW0gKnQgPSBsaS0+bzsKKwkJaWYgKHQtPnRyaWdfdmFsdWUgPj0gdHJpZ2dlcl92YWwpCisJCQlicmVhazsKKwl9CisJCisJZmRfbGlzdF9pbnNlcnRfYmVmb3JlKGxpLCAmdGktPmNoYWluKTsKKwkKKwlDSEVDS19QT1NJWCggcHRocmVhZF9yd2xvY2tfdW5sb2NrKCZ0cmlnX3J3bCkgKTsKKworCXJldHVybiAwOworfQorCitERUNMQVJFX0ZEX0RVTVBfUFJPVE9UWVBFKGZkX2V2ZW50X3RyaWdfZHVtcCkKK3sKKwlzdHJ1Y3QgZmRfbGlzdCAqIGxpOworCUZEX0RVTVBfSEFORExFX09GRlNFVCgpOworCQorCUNIRUNLX1BPU0lYX0RPKCBwdGhyZWFkX3J3bG9ja19yZGxvY2soJnRyaWdfcndsKSwgICk7CisJCisJZm9yIChsaSA9IHRyaWdfbGlzdC5uZXh0OyBsaSAhPSAmdHJpZ19saXN0OyBsaSA9IGxpLT5uZXh0KSB7CisJCXN0cnVjdCB0cmlnX2l0ZW0gKnQgPSBsaS0+bzsKKwkJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9kdW1wX2V4dGVuZCggRkRfRFVNUF9TVERfUEFSQU1TLCAie3NpZ25hbDolZH0nJXMnLT4lcCAiLCB0LT50cmlnX3ZhbHVlLCB0LT50cmlnX21vZHVsZSwgdC0+Y2IpLCBicmVhayk7CisJfQorCQorCUNIRUNLX1BPU0lYX0RPKCBwdGhyZWFkX3J3bG9ja191bmxvY2soJnRyaWdfcndsKSwgICk7CisJcmV0dXJuICpidWY7Cit9CisKK3N0YXRpYyB2b2lkICpjYWxsX2NiX2RldGFjaGVkKHZvaWQgKiBhcmcpCit7CisJdm9pZCAoKmNiKSh2b2lkKSA9IGFyZzsKKwlmZF9sb2dfdGhyZWFkbmFtZSgiVHJpZydkIGNhbGxiYWNrIHRocmVhZCIpOworCVRSQUNFX0VOVFJZKCIlcCIsIGFyZyk7CisJKCpjYikoKTsKKwlUUkFDRV9ERUJVRyhBTk5PWUlORywgIkNhbGxiYWNrICVwIGNvbXBsZXRlZCIsIGNiKTsKKwlyZXR1cm4gTlVMTDsKK30KKworaW50IGZkX2V2ZW50X3RyaWdfY2FsbF9jYihpbnQgdHJpZ2dlcl92YWwpCit7CisJc3RydWN0IGZkX2xpc3QgKiBsaTsKKwlwdGhyZWFkX2F0dHJfdCBkZXRhY2hlZDsKKwlwdGhyZWFkX3QgdGg7CisJCisJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfYXR0cl9pbml0KCZkZXRhY2hlZCkgKTsKKwlDSEVDS19QT1NJWCggcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCZkZXRhY2hlZCwgUFRIUkVBRF9DUkVBVEVfREVUQUNIRUQpICk7CisJCisJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfcndsb2NrX3JkbG9jaygmdHJpZ19yd2wpICApOworCQorCWZvciAobGkgPSB0cmlnX2xpc3QubmV4dDsgbGkgIT0gJnRyaWdfbGlzdDsgbGkgPSBsaS0+bmV4dCkgeworCQlzdHJ1Y3QgdHJpZ19pdGVtICp0ID0gbGktPm87CisJCWlmICh0LT50cmlnX3ZhbHVlID09IHRyaWdnZXJfdmFsKSB7CisJCQlUUkFDRV9ERUJVRyhGVUxMLCAiVHJpZ2dlciAlZDogQ2FsbGluZyAlcCBpbiAlcyIsIHQtPnRyaWdfdmFsdWUsIHQtPmNiLCB0LT50cmlnX21vZHVsZSk7CisJCQlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9jcmVhdGUoICZ0aCwgJmRldGFjaGVkLCBjYWxsX2NiX2RldGFjaGVkLCB0LT5jYiApLCBicmVhayApOworCQl9CisJCWlmICh0LT50cmlnX3ZhbHVlID4gdHJpZ2dlcl92YWwpCisJCQlicmVhazsKKwl9CisJCisJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfcndsb2NrX3VubG9jaygmdHJpZ19yd2wpICApOworCQorCXJldHVybiAwOworfQorCitpbnQgZmRfZXZlbnRfdHJpZ19maW5pKHZvaWQpIHsKKwkKKwlUUkFDRV9FTlRSWSgiIik7CisJCisJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfcndsb2NrX3dybG9jaygmdHJpZ19yd2wpICk7CisJCisJd2hpbGUgKCFGRF9JU19MSVNUX0VNUFRZKCZ0cmlnX2xpc3QpKSB7CisJCXN0cnVjdCBmZF9saXN0ICogbGkgPSB0cmlnX2xpc3QubmV4dDsKKwkJZmRfbGlzdF91bmxpbmsobGkpOworCQlmcmVlKGxpKTsKKwl9CisJCisJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfcndsb2NrX3VubG9jaygmdHJpZ19yd2wpICk7CisJCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJmZGNvcmUvZXh0ZW5zaW9ucy5jIGIvbGliZmRjb3JlL2V4dGVuc2lvbnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDRmY2NhCi0tLSAvZGV2L251bGwKKysrIGIvbGliZmRjb3JlL2V4dGVuc2lvbnMuYwpAQCAtMCwwICsxLDI5OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTMsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiZmRjb3JlLWludGVybmFsLmgiCisKKyNpbmNsdWRlIDxkbGZjbi5oPgkvKiBXZSBtYXkgdXNlIGxpYnRvb2wncyA8bHRkbC5oPiBsYXRlciBmb3IgYmV0dGVyIHBvcnRhYmlsaXR5Li4uLiAqLworI2luY2x1ZGUgPGxpYmdlbi5oPgkvKiBmb3IgImJhc2VuYW1lIiAqLworCisvKiBwbHVnaW5zIG1hbmFnZW1lbnQgKi8KKworLyogTGlzdCBvZiBleHRlbnNpb25zIHRvIGxvYWQsIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24gcGFyc2luZyAqLworc3RydWN0IGZkX2V4dF9pbmZvIHsKKwlzdHJ1Y3QgZmRfbGlzdAljaGFpbjsJCS8qIGxpbmsgaW4gdGhlIGxpc3QgKi8KKwljaGFyIAkJKmZpbGVuYW1lOwkvKiBleHRlbnNpb24gZmlsZW5hbWUuIG11c3QgYmUgYSBkeW5hbWljIGxpYnJhcnkgd2l0aCBmZF9leHRfaW5pdCBzeW1ib2wuICovCisJY2hhciAJCSpjb25mZmlsZTsJLyogb3B0aW9uYWwgY29uZmlndXJhdGlvbiBmaWxlIG5hbWUgZm9yIHRoZSBleHRlbnNpb24gKi8KKwl2b2lkIAkJKmhhbmRsZXI7CS8qIG9iamVjdCByZXR1cm5lZCBieSBkbG9wZW4oKSAqLworCWNvbnN0IGNoYXIgCSoqZGVwZW5kczsJLyogbmFtZXMgb2YgdGhlIG90aGVyIGV4dGVuc2lvbnMgdGhpcyBvbmUgZGVwZW5kcyBvbiAoaWYgcHJvdmlkZWQpICovCisJY2hhcgkJKmV4dF9uYW1lOwkvKiBwb2ludHMgdG8gdGhlIGV4dGVuc2lvbiBuYW1lLCBlaXRoZXIgaW5zaWRlIGRlcGVuZHMsIG9yIGJhc2VuYW1lKGZpbGVuYW1lKSAqLworCWludAkJZnJlZV9leHRfbmFtZTsJLyogbXVzdCBiZSBmcmVlZCBpZiBpdCB3YXMgbWFsbG9jJ2QgKi8KKwl2b2lkCQkoKmZpbmkpKHZvaWQpOwkvKiBvcHRpb25hbCBhZGRyZXNzIG9mIHRoZSBmZF9leHRfZmluaSBjYWxsYmFjayAqLworCWNoYXIJCSpwcm90b192ZXI7CisJZG91YmxlCQlnZW5fZGF0ZTsKK307CisKKy8qIGxpc3Qgb2YgZXh0ZW5zaW9ucyAqLworc3RhdGljIHN0cnVjdCBmZF9saXN0IGV4dF9saXN0ID0gRkRfTElTVF9JTklUSUFMSVpFUihleHRfbGlzdCk7CisKKy8qIEFkZCBuZXcgZXh0ZW5zaW9uICovCitpbnQgZmRfZXh0X2FkZCggY2hhciAqIGZpbGVuYW1lLCBjaGFyICogY29uZmZpbGUgKQoreworCXN0cnVjdCBmZF9leHRfaW5mbyAqIG5ldzsKKwkKKwlUUkFDRV9FTlRSWSgiJXAgJXAiLCBmaWxlbmFtZSwgY29uZmZpbGUpOworCQorCS8qIENoZWNrIHRoZSBmaWxlbmFtZSBpcyB2YWxpZCAqLworCUNIRUNLX1BBUkFNUyggZmlsZW5hbWUgKTsKKwkKKwkvKiBDcmVhdGUgYSBuZXcgb2JqZWN0IGluIHRoZSBsaXN0ICovCisJQ0hFQ0tfTUFMTE9DKCAgbmV3ID0gbWFsbG9jKCBzaXplb2Yoc3RydWN0IGZkX2V4dF9pbmZvKSApICApOworCW1lbXNldChuZXcsIDAsIHNpemVvZihzdHJ1Y3QgZmRfZXh0X2luZm8pKTsKKwlmZF9saXN0X2luaXQoJm5ldy0+Y2hhaW4sIE5VTEwpOworCW5ldy0+ZmlsZW5hbWUgPSBmaWxlbmFtZTsKKwluZXctPmNvbmZmaWxlID0gY29uZmZpbGU7CisJZmRfbGlzdF9pbnNlcnRfYmVmb3JlKCAmZXh0X2xpc3QsICZuZXctPmNoYWluICk7CisJVFJBQ0VfREVCVUcgKEZVTEwsICJFeHRlbnNpb24gJXMgYWRkZWQgdG8gdGhlIGxpc3QuIiwgZmlsZW5hbWUpOworCXJldHVybiAwOworfQorCisvKiBEdW1wIHRoZSBsaXN0ICovCitERUNMQVJFX0ZEX0RVTVBfUFJPVE9UWVBFKGZkX2V4dF9kdW1wKQoreworCXN0cnVjdCBmZF9saXN0ICogbGk7CisJRkRfRFVNUF9IQU5ETEVfT0ZGU0VUKCk7CisJCisJaWYgKEZEX0lTX0xJU1RfRU1QVFkoJmV4dF9saXN0KSkgeworCQlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICItbm9uZS0iKSwgcmV0dXJuIE5VTEwpOworCX0gZWxzZSB7CisJCWZvciAobGkgPSBleHRfbGlzdC5uZXh0OyBsaSAhPSAmZXh0X2xpc3Q7IGxpID0gbGktPm5leHQpCisJCXsKKwkJCXN0cnVjdCBmZF9leHRfaW5mbyAqIGV4dCA9IChzdHJ1Y3QgZmRfZXh0X2luZm8gKilsaTsKKwkJCUNIRUNLX01BTExPQ19ETyggZmRfZHVtcF9leHRlbmQoIEZEX0RVTVBfU1REX1BBUkFNUywgIiclcydbJXNdLCAlc2xvYWRlZCVzIiwKKwkJCQkJCWV4dC0+ZmlsZW5hbWUsIAorCQkJCQkJZXh0LT5jb25mZmlsZT86IihubyBjb25maWcgZmlsZSkiLCAKKwkJCQkJCWV4dC0+aGFuZGxlciA/ICIiIDogIm5vdCAiLCAobGktPm5leHQgPT0gJmV4dF9saXN0KSA/ICIiOiJcbiIpLCByZXR1cm4gTlVMTCk7CisJCX0KKwl9CisJcmV0dXJuICpidWY7Cit9CisKKy8qIExvYWQgdGhlIGRlcGVuZGVuY2llcyAqLworc3RhdGljIGludCBsb2FkX2RlcGVuZGVuY2llcyhzdHJ1Y3QgZmRfZXh0X2luZm8gKmV4dCkKK3sKKwlUUkFDRV9FTlRSWSggIiVwIiwgZXh0KTsKKwkvKiBBdHRlbXB0IHRvIHJlc29sdmUgdGhlIGRlcGVuZGVuY3kgYXJyYXkgKi8KKwlleHQtPmRlcGVuZHMgPSBkbHN5bSggZXh0LT5oYW5kbGVyLCAiZmRfZXh0X2RlcGVuZHMiKTsKKwlpZiAoIWV4dC0+ZGVwZW5kcykgeworCQkvKiBEdXBsaWNhdGUgdGhlIGZpbGVuYW1lICovCisJCWNoYXIgKiB0bXAgPSBzdHJkdXAoZXh0LT5maWxlbmFtZSk7CisJCWV4dC0+ZXh0X25hbWUgPSBzdHJkdXAoYmFzZW5hbWUodG1wKSk7CisJCWZyZWUodG1wKTsKKwkJZXh0LT5mcmVlX2V4dF9uYW1lID0gMTsKKwkJVFJBQ0VfREVCVUcoRlVMTCwgIk9sZCBleHRlbnNpb24ncyBbJXNdIEFQSTogbWlzc2luZyBkZXBlbmRlbmNpZXMgKGlnbm9yZWQpIiwgZXh0LT5leHRfbmFtZSk7CisJCXJldHVybiAwOworCX0KKwkKKwlleHQtPmV4dF9uYW1lID0gKGNoYXIgKilleHQtPmRlcGVuZHNbMF07CisJcmV0dXJuIDA7CisKK30KKworLyogQ2hlY2sgdGhlIGRlcGVuZGVuY2llcy4gVGhlIG9iamVjdCBtdXN0IGhhdmUgYmVlbiBkbG9wZW5lZCBhbHJlYWR5LiAqLworc3RhdGljIGludCBjaGVja19kZXBlbmRlbmNpZXMoc3RydWN0IGZkX2V4dF9pbmZvICogZXh0KQoreworCWludCBpID0gMTsKKwlUUkFDRV9ERUJVRyhGVUxMLCAiQ2hlY2tpbmcgZGVwZW5kZW5jaWVzIGZvciAnJXMnLi4uIiwgZXh0LT5leHRfbmFtZSk7CisJCisJd2hpbGUgKGV4dC0+ZGVwZW5kc1tpXSkgeworCQlzdHJ1Y3QgZmRfbGlzdCAqIGxpOworCQlmb3IgKGxpID0gZXh0X2xpc3QubmV4dDsgbGkgIT0gJmV4dF9saXN0OyBsaSA9IGxpLT5uZXh0KQorCQl7CisJCQlzdHJ1Y3QgZmRfZXh0X2luZm8gKiBlID0gKHN0cnVjdCBmZF9leHRfaW5mbyAqKWxpOworCQkJaWYgKCFzdHJjYXNlY21wKGUtPmV4dF9uYW1lLCBleHQtPmRlcGVuZHNbaV0pKSB7CisJCQkJLyogdGhlIGRlcGVuZGVuY3kgd2FzIGFscmVhZHkgbG9hZGVkICovCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAobGkgPT0gJmV4dF9saXN0KSB7CisJCQkvKiB0aGUgZGVwZW5kZW5jeSB3YXMgbm90IGZvdW5kICovCisJCQlMT0dfRigiRXJyb3I6IGV4dGVuc2lvbiBbJXNdIGRlcGVuZHMgb24gWyVzXSB3aGljaCB3YXMgbm90IGxvYWRlZCBmaXJzdC4gUGxlYXNlIGZpeCB5b3VyIGNvbmZpZ3VyYXRpb24gZmlsZS4iLAorCQkJCWV4dC0+ZXh0X25hbWUsIGV4dC0+ZGVwZW5kc1tpXSk7CisJCQlyZXR1cm4gRVNSQ0g7CisJCX0KKwkJCisJCWkrKzsKKwl9CisKKwkvKiBBbGwgZGVwZW5kZW5jaWVzIHJlc29sdmVkIHN1Y2Nlc3NmdWxseSAqLworCXJldHVybiAwOworfQorCisvKiBMb2FkIGFsbCBleHRlbnNpb25zIGluIHRoZSBsaXN0ICovCitpbnQgZmRfZXh0X2xvYWQoKQoreworCWludCByZXQ7CisJaW50ICgqZmRfZXh0X2luaXQpKGludCwgaW50LCBjaGFyICopID0gTlVMTDsKKwlpbnQgKCpmZF9leHRfaW5pdDIpKGludCwgaW50LCBjaGFyICopID0gTlVMTDsKKwlzdHJ1Y3QgZmRfbGlzdCAqIGxpOworCQorCVRSQUNFX0VOVFJZKCk7CisJCisJLyogTG9vcCBvbiBhbGwgZXh0ZW5zaW9ucyAqLworCWZvciAobGkgPSBleHRfbGlzdC5uZXh0OyBsaSAhPSAmZXh0X2xpc3Q7IGxpID0gbGktPm5leHQpCisJeworCQlzdHJ1Y3QgZmRfZXh0X2luZm8gKiBleHQgPSAoc3RydWN0IGZkX2V4dF9pbmZvICopbGk7CisJCUxPR19EKCAiTG9hZGluZyA6ICVzIiwgZXh0LT5maWxlbmFtZSk7CisJCQorCQkvKiBMb2FkIHRoZSBleHRlbnNpb24gKi8KKyNpZm5kZWYgREVCVUcKKwkJZXh0LT5oYW5kbGVyID0gZGxvcGVuKGV4dC0+ZmlsZW5hbWUsIFJUTERfTEFaWSB8IFJUTERfR0xPQkFMKTsKKyNlbHNlIC8qIERFQlVHICovCisJCS8qIFdlIHJlc29sdmUgc3ltYm9scyBpbW1lZGlhdGx5IHNvIGl0J3MgZWFzaWVyIHRvIGZpbmQgcHJvYmxlbXMgaW4gQUJJICovCisJCWV4dC0+aGFuZGxlciA9IGRsb3BlbihleHQtPmZpbGVuYW1lLCBSVExEX05PVyB8IFJUTERfR0xPQkFMKTsKKyNlbmRpZiAvKiBERUJVRyAqLworCQlpZiAoZXh0LT5oYW5kbGVyID09IE5VTEwpIHsKKwkJCS8qIEFuIGVycm9yIG9jY3VyZWQgKi8KKwkJCUxPR19GKCJMb2FkaW5nIG9mIGV4dGVuc2lvbiAlcyBmYWlsZWQ6ICVzIiwgZXh0LT5maWxlbmFtZSwgZGxlcnJvcigpKTsKKwkJCWV4dC0+aGFuZGxlciA9IGRsb3BlbihleHQtPmZpbGVuYW1lLCBSVExEX0xBWlkgfCBSVExEX0dMT0JBTCk7CisJCQlpZiAoZXh0LT5oYW5kbGVyKSB7CisJCQkJaWYgKCFjaGVja19kZXBlbmRlbmNpZXMoZXh0KSkgeworCQkJCQlMT0dfRigiSW4gYWRkaXRpb24sIG5vdCBhbGwgZGVjbGFyZWQgZGVwZW5kZW5jaWVzIGFyZSBzYXRpc2ZpZWQgKEludGVybmFsIEVycm9yISkiKTsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gRUlOVkFMOworCQl9CisKKwkJLyogUmVzb2x2ZSB0aGUgZW50cnkgcG9pbnQgb2YgdGhlIGV4dGVuc2lvbiAqLworCQlmZF9leHRfaW5pdCA9ICggaW50ICgqKSAoaW50LCBpbnQsIGNoYXIgKikgKWRsc3ltKCBleHQtPmhhbmRsZXIsICJmZF9leHRfaW5pdCIgKTsKKwkJCisJCWlmIChmZF9leHRfaW5pdCA9PSBOVUxMKSB7CisJCQkvKiBBbiBlcnJvciBvY2N1cmVkICovCisJCQlUUkFDRV9FUlJPUigiVW5hYmxlIHRvIHJlc29sdmUgc3ltYm9sICdmZF9leHRfaW5pdCcgZm9yIGV4dGVuc2lvbiAlczogJXMiLCBleHQtPmZpbGVuYW1lLCBkbGVycm9yKCkpOworCQkJcmV0dXJuIEVJTlZBTDsKKwkJfQorCisJCQorCQkvKiBSZXNvbHZlIHRoZSBleGl0IHBvaW50IG9mIHRoZSBleHRlbnNpb24sIHdoaWNoIGlzIG9wdGlvbmFsIGZvciBleHRlbnNpb25zICovCisJCWV4dC0+ZmluaSA9ICggdm9pZCAoKikgKHZvaWQpIClkbHN5bSggZXh0LT5oYW5kbGVyLCAiZmRfZXh0X2ZpbmkiICk7CisJCQorCQlpZiAoZXh0LT5maW5pID09IE5VTEwpIHsKKwkJCS8qIE5vdCBwcm92aWRlZCAqLworCQkJVFJBQ0VfREVCVUcgKEZVTEwsICJFeHRlbnNpb24gWyVzXSBoYXMgbm8gZmRfZXh0X2ZpbmkgZnVuY3Rpb24uIiwgZXh0LT5maWxlbmFtZSk7CisJCX0gZWxzZSB7CisJCQkvKiBQcm92aWRlZCAqLworCQkJVFJBQ0VfREVCVUcgKEZVTEwsICJFeHRlbnNpb24gWyVzXSBmZF9leHRfZmluaSBoYXMgYmVlbiByZXNvbHZlZCBzdWNjZXNzZnVsbHkuIiwgZXh0LT5maWxlbmFtZSk7CisJCX0KKworCQkvKiBOb3cgY2FsbCB0aGUgZW50cnkgcG9pbnQgdG8gaW5pdGlhbGl6ZSB0aGUgZXh0ZW5zaW9uICovCisJCXJldCA9ICgqZmRfZXh0X2luaXQpKCBGRF9QUk9KRUNUX1ZFUlNJT05fTUFKT1IsIEZEX1BST0pFQ1RfVkVSU0lPTl9NSU5PUiwgZXh0LT5jb25mZmlsZSApOworCQlpZiAocmV0ICE9IDApIHsKKwkJCS8qIFRoZSBleHRlbnNpb24gd2FzIHVuYWJsZSB0byBsb2FkIGNsZWFubHkgKi8KKwkJCVRSQUNFX0VSUk9SKCJFeHRlbnNpb24gJXMgcmV0dXJuZWQgYW4gZXJyb3IgZHVyaW5nIGluaXRpYWxpemF0aW9uOiAlcyIsIGV4dC0+ZmlsZW5hbWUsIHN0cmVycm9yKHJldCkpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQkKKwkJLyogUHJvY2VlZCB0byB0aGUgbmV4dCBleHRlbnNpb24gKi8KKwl9CisKKwlmb3IoIGxpID0gZXh0X2xpc3QubmV4dDsgbGkgIT0gJmV4dF9saXN0OyBsaSA9IGxpLT5uZXh0ICkKKyAgICAgICAgeworCQlzdHJ1Y3QgZmRfZXh0X2luZm8gKiBleHQgPSAoc3RydWN0IGZkX2V4dF9pbmZvICopbGk7CisJCUNIRUNLX0ZDVCggbG9hZF9kZXBlbmRlbmNpZXMoZXh0KSk7CisJfQorCisKKwlmb3IoIGxpID0gZXh0X2xpc3QubmV4dDsgbGkgIT0gJmV4dF9saXN0OyBsaSA9IGxpLT5uZXh0ICkKKwl7CisJCXN0cnVjdCBmZF9leHRfaW5mbyAqIGV4dCA9IChzdHJ1Y3QgZmRfZXh0X2luZm8gKilsaTsKKworCQkvKiBDaGVjayBpZiBkZWNsYXJlZCBkZXBlbmRlbmNpZXMgYXJlIHNhdGlzZmllZC4gKi8KKwkJQ0hFQ0tfRkNUKCBjaGVja19kZXBlbmRlbmNpZXMoZXh0KSApOworCisJCS8qIExvYWRpbmcgbWV0aG9kcyBpbml0MiAmIHBhcnNlcnVsZXMgKi8KKwkJZmRfZXh0X2luaXQyID0gKCBpbnQgKCopIChpbnQsIGludCwgY2hhciAqKSApZGxzeW0oIGV4dC0+aGFuZGxlciwgImZkX2V4dF9pbml0MiIgKTsKKworCQlpZiAoZmRfZXh0X2luaXQyID09IE5VTEwpIHsKKwkJCS8qIE9sZCBleHRlbnNpb25zIGRvIG5vdCBkZWZpbmUgZmRfZXh0X2luaXQyICovCisJCQlMT0dfTigiVW5hYmxlIHRvICByZXNvbHZlIHN5bWJvbCAnZmRfZXh0X2luaXQyJyBmb3IgZXh0ZW5zaW9uICVzOiAiLCBleHQtPmZpbGVuYW1lKTsKKwkJfQorCQllbHNlIHsKKwkJCXJldCA9ICgqZmRfZXh0X2luaXQyKSggRkRfUFJPSkVDVF9WRVJTSU9OX01BSk9SLCBGRF9QUk9KRUNUX1ZFUlNJT05fTUlOT1IsIGV4dC0+Y29uZmZpbGUgKTsKKwkJCWlmIChyZXQgIT0gMCkgeworCQkJCS8qIFRoZSBleHRlbnNpb24gd2FzIHVuYWJsZSB0byBsb2FkIGNsZWFubHkgKi8KKwkJCQlUUkFDRV9FUlJPUigiRXh0ZW5zaW9uICVzIHJldHVybmVkIGFuIGVycm9yIGR1cmluZyBwYXJzZSBsb2NhbCBydWxlczogJXMiLCBleHQtPmZpbGVuYW1lLCBzdHJlcnJvcihyZXQpKTsKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorCQl9CisJfQorCQorCUxPR19OKCJBbGwgZXh0ZW5zaW9ucyBsb2FkZWQuIik7CisJCisJLyogV2UgaGF2ZSBmaW5pc2hlZC4gKi8KKwlyZXR1cm4gMDsKK30KKworLyogTm93IHVubG9hZCB0aGUgZXh0ZW5zaW9ucyBhbmQgZnJlZSB0aGUgbWVtb3J5ICovCitpbnQgZmRfZXh0X3Rlcm0oIHZvaWQgKSAKK3sKKwlUUkFDRV9FTlRSWSgpOworCQorCS8qIExvb3Agb24gYWxsIGV4dGVuc2lvbnMsIGluIEZJRk8gb3JkZXIgKi8KKwl3aGlsZSAoIUZEX0lTX0xJU1RfRU1QVFkoJmV4dF9saXN0KSkKKwl7CisJCXN0cnVjdCBmZF9saXN0ICogbGkgPSBleHRfbGlzdC5uZXh0OworCQlzdHJ1Y3QgZmRfZXh0X2luZm8gKiBleHQgPSAoc3RydWN0IGZkX2V4dF9pbmZvICopbGk7CisJCisJCS8qIFVubGluayB0aGlzIGVsZW1lbnQgZnJvbSB0aGUgbGlzdCAqLworCQlmZF9saXN0X3VubGluayhsaSk7CisJCQorCQkvKiBDYWxsIHRoZSBleGl0IHBvaW50IG9mIHRoZSBleHRlbnNpb24sIGlmIGl0IHdhcyByZXNvbHZlZCAqLworCQlpZiAoZXh0LT5maW5pICE9IE5VTEwpIHsKKwkJCVRSQUNFX0RFQlVHIChGVUxMLCAiQ2FsbGluZyBbJXNdLT5mZF9leHRfZmluaSBmdW5jdGlvbi4iLCBleHQtPmV4dF9uYW1lID86IGV4dC0+ZmlsZW5hbWUpOworCQkJKCpleHQtPmZpbmkpKCk7CisJCX0KKwkJCisjaWZuZGVmIFNLSVBfRExDTE9TRQorCQkvKiBOb3cgdW5sb2FkIHRoZSBleHRlbnNpb24gKi8KKwkJaWYgKGV4dC0+aGFuZGxlcikgeworCQkJVFJBQ0VfREVCVUcgKEZVTEwsICJVbmxvYWRpbmcgJXMiLCBleHQtPmV4dF9uYW1lID86IGV4dC0+ZmlsZW5hbWUpOworCQkJaWYgKCBkbGNsb3NlKGV4dC0+aGFuZGxlcikgIT0gMCApIHsKKwkJCQlUUkFDRV9ERUJVRyAoSU5GTywgIlVubG9hZGluZyBbJXNdIGZhaWxlZCA6ICVzIiwgZXh0LT5leHRfbmFtZSA/OiBleHQtPmZpbGVuYW1lLCBkbGVycm9yKCkpOworCQkJfQorCQl9CisjZW5kaWYgLyogU0tJUF9ETENMT1NFICovCisJCQorCQkvKiBGcmVlIHRoZSBvYmplY3QgYW5kIGNvbnRpbnVlICovCisJCWlmIChleHQtPmZyZWVfZXh0X25hbWUpCisJCQlmcmVlKGV4dC0+ZXh0X25hbWUpOworCQlmcmVlKGV4dC0+ZmlsZW5hbWUpOworCQlmcmVlKGV4dC0+Y29uZmZpbGUpOworCQlmcmVlKGV4dCk7CisJfQorCQorCS8qIFdlIGFsd2F5cyByZXR1cm4gMCBzaW5jZSB3ZSB3b3VsZCBub3QgaGFuZGxlIGFuIGVycm9yIGFueXdheS4uLiAqLworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9saWJmZGNvcmUvZmRjb3JlLWludGVybmFsLmggYi9saWJmZGNvcmUvZmRjb3JlLWludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZhYzg1MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmZkY29yZS9mZGNvcmUtaW50ZXJuYWwuaApAQCAtMCwwICsxLDM3NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTMsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb25zIGZvciBpbnRlcm5hbCB1c2UgaW4gdGhlIGZyZWVEaWFtZXRlciBjb3JlIGxpYnJhcnkgKi8KKworI2lmbmRlZiBfRkRDT1JFX0lOVEVSTkFMX0gKKyNkZWZpbmUgX0ZEQ09SRV9JTlRFUk5BTF9ICisKKyNpbmNsdWRlIDxmcmVlRGlhbWV0ZXIvZnJlZURpYW1ldGVyLWhvc3QuaD4KKyNpbmNsdWRlIDxmcmVlRGlhbWV0ZXIvbGliZmRjb3JlLmg+CisKKyNpZmRlZiBESVNBQkxFX1NDVFAKKyN1bmRlZiBJUFBST1RPX1NDVFAKKyNkZWZpbmUgSVBQUk9UT19TQ1RQCSgyID0gNCkgLyogc29tZSBjb21waWxhdGlvbiBlcnJvciB0byBzcG90IHRoZSByZWZlcmVuY2VzICovCisjZW5kaWYgLyogRElTQUJMRV9TQ1RQICovCisKKyNpZm5kZWYgSEFWRV9BSV9BRERSQ09ORklHCisjZGVmaW5lIEFJX0FERFJDT05GSUcgMCAvKiBpZ25vcmUgdGhpcyBmbGFnIGF0IHRoZSBtb21lbnQgKi8KKyNlbmRpZiAvKiBIQVZFX0FJX0FERFJDT05GSUcgKi8KKworLyogVGltZW91dCBmb3IgZXN0YWJsaXNoaW5nIGEgY29ubmVjdGlvbiAqLworI2lmbmRlZiBDTlhfVElNRU9VVAorI2RlZmluZSAgQ05YX1RJTUVPVVQJMTAJLyogaW4gc2Vjb25kcyAqLworI2VuZGlmIC8qIENOWF9USU1FT1VUICovCisKKy8qIFRpbWVvdXQgZm9yIHJlY2VpdmluZyBhIENFUiBhZnRlciBpbmNvbWluZyBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkICovCisjaWZuZGVmIElOQ05YX1RJTUVPVVQKKyNkZWZpbmUgIElOQ05YX1RJTUVPVVQJIDIwCS8qIGluIHNlY29uZHMgKi8KKyNlbmRpZiAvKiBJTkNOWF9USU1FT1VUICovCisKKy8qIFRpbWVvdXQgZm9yIHJlY2VpdmluZyBhIENFQSBhZnRlciBDRVIgaXMgc2VudCAqLworI2lmbmRlZiBDRUFfVElNRU9VVAorI2RlZmluZSAgQ0VBX1RJTUVPVVQJMTAJLyogaW4gc2Vjb25kcyAqLworI2VuZGlmIC8qIENFQV9USU1FT1VUICovCisKKy8qIFRoZSB0aW1lb3V0IHZhbHVlIHRvIHdhaXQgZm9yIGFuc3dlciB0byBhIERQUiAqLworI2lmbmRlZiBEUFJfVElNRU9VVAorI2RlZmluZSBEUFJfVElNRU9VVCAJMTUJLyogaW4gc2Vjb25kcyAqLworI2VuZGlmIC8qIERQUl9USU1FT1VUICovCisKKy8qIERlbGF5IHdoZXJlIHRoZSBjb25uZWN0aW9uIGlzIG1haW50YWluZWQgb3BlbmVkIHRvIGFsbG93IGV4Y2hhbmdpbmcgcmVtYWluaW5nIHBlbmRpbmcgYW5zd2VycyBhZnRlciBEUFIvRFBBICovCisjaWZuZGVmIEdSQUNFX1RJTUVPVVQKKyNkZWZpbmUgR1JBQ0VfVElNRU9VVCAgIDEJLyogaW4gc2Vjb25kcyAqLworI2VuZGlmIC8qIEdSQUNFX1RJTUVPVVQgKi8KKworLyogVGhlIFZlbmRvci1JZCB0byBhZHZlcnRpc2UgaW4gQ0VSL0NFQSAqLworI2lmbmRlZiBNWV9WRU5ET1JfSUQKKyNkZWZpbmUgTVlfVkVORE9SX0lECTAgCS8qIFJlc2VydmVkIHZhbHVlIHRvIHRlbGwgaXQgbXVzdCBiZSBpZ25vcmVkICovCisjZW5kaWYgLyogTVlfVkVORE9SX0lEICovCisKKworCisvKiBDb25maWd1cmF0aW9uICovCitpbnQgZmRfY29uZl9pbml0KCk7CitpbnQgZmRfY29uZl9kZWluaXQoKTsKK2ludCBmZF9jb25mX3BhcnNlKCk7CitpbnQgZmRkcGFyc2Uoc3RydWN0IGZkX2NvbmZpZyAqIGNvbmYpOyAvKiB5YWNjIGdlbmVyYXRlZCAqLworaW50IGZkX2NvbmZfc3RyZWFtX3RvX2dudXRsc19kYXR1bShGSUxFICogcGVtZmlsZSwgZ251dGxzX2RhdHVtX3QgKm91dCk7CisKKworLyogRXh0ZW5zaW9ucyAqLworaW50IGZkX2V4dF9hZGQoIGNoYXIgKiBmaWxlbmFtZSwgY2hhciAqIGNvbmZmaWxlICk7CitpbnQgZmRfZXh0X2xvYWQoKTsKK2ludCBmZF9leHRfdGVybSh2b2lkKTsKKworLyogTWVzc2FnZXMgKi8KK2ludCBmZF9tc2dfaW5pdCh2b2lkKTsKK2V4dGVybiBzdHJ1Y3QgZGljdF9vYmplY3QgKiBmZF9kaWN0X2F2cF9PU0k7IC8qIE9yaWdpbi1TdGF0ZS1JZCAqLworZXh0ZXJuIHN0cnVjdCBkaWN0X29iamVjdCAqIGZkX2RpY3RfY21kX0NFUjsgLyogQ2FwYWJpbGl0aWVzLUV4Y2hhbmdlLVJlcXVlc3QgKi8KK2V4dGVybiBzdHJ1Y3QgZGljdF9vYmplY3QgKiBmZF9kaWN0X2NtZF9EV1I7IC8qIERldmljZS1XYXRjaGRvZy1SZXF1ZXN0ICovCitleHRlcm4gc3RydWN0IGRpY3Rfb2JqZWN0ICogZmRfZGljdF9hdnBfREM7ICAvKiBEaXNjb25uZWN0LUNhdXNlICovCitleHRlcm4gc3RydWN0IGRpY3Rfb2JqZWN0ICogZmRfZGljdF9jbWRfRFBSOyAvKiBEaXNjb25uZWN0LVBlZXItUmVxdWVzdCAqLworCisvKiBHbG9iYWwgbWVzc2FnZSBxdWV1ZXMgKi8KK2V4dGVybiBzdHJ1Y3QgZmlmbyAqIGZkX2dfaW5jb21pbmc7IC8qIGFsbCBtZXNzYWdlcyByZWNlaXZlZCBmcm9tIG90aGVyIHBlZXJzLCBleGNlcHQgbG9jYWwgbWVzc2FnZXMgKENFUiwgLi4uKSAqLworZXh0ZXJuIHN0cnVjdCBmaWZvICogZmRfZ19vdXRnb2luZzsgLyogbWVzc2FnZXMgdG8gYmUgc2VudCB0byBvdGhlciBwZWVycyBvbiB0aGUgbmV0d29yayBmb2xsb3dpbmcgcm91dGluZyBwcm9jZWR1cmUgKi8KK2V4dGVybiBzdHJ1Y3QgZmlmbyAqIGZkX2dfbG9jYWw7IC8qIG1lc3NhZ2VzIHRvIGJlIGhhbmRsZWQgdG8gbG9jYWwgZXh0ZW5zaW9ucyAqLworLyogTWVzc2FnZSBxdWV1ZXMgKi8KK2ludCBmZF9xdWV1ZXNfaW5pdCh2b2lkKTsKK2ludCBmZF9xdWV1ZXNfZmluaShzdHJ1Y3QgZmlmbyAqKiBxdWV1ZSk7CisKKy8qIFRyaWdnZWQgZXZlbnRzICovCitpbnQgZmRfZXZlbnRfdHJpZ19jYWxsX2NiKGludCB0cmlnZ2VyX3ZhbCk7CitpbnQgZmRfZXZlbnRfdHJpZ19maW5pKHZvaWQpOworCisvKiBDcmVhdGUgYWxsIHRoZSBkaWN0aW9uYXJ5IG9iamVjdHMgZGVmaW5lZCBpbiB0aGUgRGlhbWV0ZXIgYmFzZSBSRkMuICovCitpbnQgZmRfZGljdF9iYXNlX3Byb3RvY29sKHN0cnVjdCBkaWN0aW9uYXJ5ICogZGljdCk7CisKKy8qIFJvdXRpbmcgKi8KK2ludCBmZF9ydGRpc3BfaW5pdCh2b2lkKTsKK2ludCBmZF9ydGRpc3BfY2xlYW5zdG9wKHZvaWQpOworaW50IGZkX3J0ZGlzcF9maW5pKHZvaWQpOworaW50IGZkX3J0ZGlzcF9jbGVhbnVwKHZvaWQpOworCisvKiBTZW50aW5lbCBmb3IgdGhlIHNlbnQgcmVxdWVzdHMgbGlzdCAqLworc3RydWN0IHNyX2xpc3QgeworCXN0cnVjdCBmZF9saXN0IAlzcnM7IC8qIHJlcXVlc3RzIG9yZGVyZWQgYnkgaG9wLWJ5LWhvcCBpZCAqLworCXN0cnVjdCBmZF9saXN0ICBleHA7IC8qIHJlcXVlc3RzIHRoYXQgaGF2ZSBhIHRpbWVvdXQgc2V0LCBvcmRlcmVkIGJ5IHRpbWVvdXQgKi8KKwlsb25nICAgICAgICAgICAgY250OyAvKiBudW1iZXIgb2YgcmVxdWVzdHMgaW4gdGhlIHNycyBsaXN0ICovCisJbG9uZwkJY250X2xvc3Q7IC8qIG51bWJlciBvZiByZXF1ZXN0cyB0aGF0IGhhdmUgbm90IGJlZW4gYW5zd2VyZWQgaW4gdGltZS4gCisJCQkJICAgICBJdCBpcyBkZWNyZW1lbnRlZCB3aGVuIGFuIHVuZXhwZWN0ZWQgYW5zd2VyIGlzIHJlY2VpdmVkLCBzbyB0aGlzIG1heSBub3QgYmUgYWNjdXJhdGUuICovCisJcHRocmVhZF9tdXRleF90CW10eDsgLyogbXV0ZXggdG8gcHJvdGVjdCB0aGVzZSBsaXN0cyAqLworCXB0aHJlYWRfY29uZF90ICBjbmQ7IC8qIGNvbmQgdmFyIHVzZWQgYnkgdGhlIHRocmVhZCB0aGF0IGhhbmRsZXMgdGltZW91dHMgKi8KKwlwdGhyZWFkX3QgICAgICAgdGhyOyAvKiB0aGUgdGhyZWFkIHRoYXQgaGFuZGxlcyB0aW1lb3V0cyAoZXhwaXJlY2IgY2FsbGVkIGluIHNlcGFyYXRlIGZvcmtlZCB0aHJlYWRzKSAqLworfTsKKworLyogUGVlcnMgKi8KK3N0cnVjdCBmZF9wZWVyIHsgLyogVGhlICJyZWFsIiBkZWZpbml0aW9uIG9mIHRoZSBwZWVyIHN0cnVjdHVyZSAqLworCQorCS8qIFRoZSBwdWJsaWMgZGF0YSAqLworCXN0cnVjdCBwZWVyX2hkcgkgcF9oZHI7CisJCisJLyogRXllIGNhdGNoZXIsIEVZRUNfUEVFUiAqLworCWludAkJIHBfZXllYzsKKwkjZGVmaW5lIEVZRUNfUEVFUgkweDM3M0M5MzM2CisJCisJLyogT3JpZ2luIG9mIHRoaXMgcGVlciBvYmplY3QsIGZvciBkZWJ1ZyAqLworCWNoYXIJCSpwX2RiZ29yaWc7CisJCisJLyogU3RhdGUgb2YgdGhlIHBlZXIsIGFuZCBpdHMgbG9jayAqLworCWVudW0gcGVlcl9zdGF0ZQkgcF9zdGF0ZTsKKwlwdGhyZWFkX211dGV4X3QgIHBfc3RhdGVfbXR4OworCQorCS8qIENoYWluaW5nIGluIHBlZXJzIHN1Ymxpc3RzICovCisJc3RydWN0IGZkX2xpc3QJIHBfYWN0aXZlczsJLyogbGlzdCBvZiBwZWVycyBpbiB0aGUgU1RBVEVfT1BFTiBzdGF0ZSAtLSB1c2VkIGJ5IHJvdXRpbmcgKi8KKwlzdHJ1Y3QgZmRfbGlzdAkgcF9leHBpcnk7IAkvKiBsaXN0IG9mIGV4cGlyaW5nIHBlZXJzLCBvcmRlcmVkIGJ5IHRoZWlyIHRpbWVvdXQgdmFsdWUgKi8KKwlzdHJ1Y3QgdGltZXNwZWMJIHBfZXhwX3RpbWVyOwkvKiBUaW1lc3RhbXAgd2hlcmUgdGhlIHBlZXIgd2lsbCBleHBpcmU7IHVwZGF0ZWQgZWFjaCB0aW1lIGFjdGl2aXR5IGlzIHNlZW4gb24gdGhlIHBlZXIgKGV4Y2VwdCBEVykgKi8KKwkKKwkvKiBTb21lIGZsYWdzIGluZmx1ZW5jaW5nIHRoZSBwZWVyIHN0YXRlIG1hY2hpbmUgKi8KKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBwZl9yZXNwb25kZXIJOiAxOwkvKiBUaGUgcGVlciBoYXMgYmVlbiBjcmVhdGVkIHRvIGhhbmRsZSBpbmNvbWluZyBjb25uZWN0aW9uICovCisJCXVuc2lnbmVkIHBmX2RlbGV0ZQk6IDE7CS8qIERlc3Ryb3kgdGhlIHBlZXIgd2hlbiB0aGUgY29ubmVjdGlvbiBpcyB0ZXJtaW5hdGVkICovCisJCXVuc2lnbmVkIHBmX2xvY2FsdGVybQk6IDE7CS8qIElmIHRoZSBsYXRlc3QgRFBSL0RQQSB3YXMgaW5pdGlhdGVkIGZyb20gdGhpcyBzaWRlICovCisJCQorCQl1bnNpZ25lZCBwZl9kd19wZW5kaW5nIAk6IDE7CS8qIEEgRFdSIG1lc3NhZ2Ugd2FzIHNlbnQgYW5kIG5vdCBhbnN3ZXJlZCB5ZXQgKi8KKwkJCisJCXVuc2lnbmVkIHBmX2NueF9wYgk6IDE7CS8qIFRoZSBwZWVyIHdhcyBkaXNjb25uZWN0ZWQgYmVjYXVzZSBvZiB3YXRjaGRvZ3M7IG11c3QgZXhjaGFuZ2UgMyB3YXRjaGRvZ3MgYmVmb3JlIHB1dHRpbmcgYmFjayB0byBub3JtYWwgKi8KKwkJdW5zaWduZWQgcGZfcmVvcGVuX2NudAk6IDI7CS8qIHJlbWFpbmluZyBEVyB0byBiZSBleGNoYW5nZWQgYWZ0ZXIgcmUtZXN0YWJsaXNoZWQgY29ubmVjdGlvbiAqLworCQkKKwl9CQkgcF9mbGFnczsKKwkKKwkvKiBUaGUgZXZlbnRzIHF1ZXVlLCBwZWVyIHN0YXRlIG1hY2hpbmUgdGhyZWFkLCB0aW1lciBmb3Igc3RhdGVzIHRpbWVvdXRzICovCisJc3RydWN0IGZpZm8JKnBfZXZlbnRzOwkvKiBUaGUgbXV0ZXggb2YgdGhpcyBGSUZPIGxpc3QgcHJvdGVjdHMgYWxzbyB0aGUgc3RhdGUgYW5kIHRpbWVyIGluZm9ybWF0aW9uICovCisJcHRocmVhZF90CSBwX3BzbTsKKwlzdHJ1Y3QgdGltZXNwZWMJIHBfcHNtX3RpbWVyOworCQorCS8qIE91dGdvaW5nIG1lc3NhZ2UgcXVldWUsIGFuZCB0aHJlYWQgbWFuYWdpbmcgc2VuZGluZyB0aGUgbWVzc2FnZXMgKi8KKwlzdHJ1Y3QgZmlmbwkqcF90b3NlbmQ7CisJcHRocmVhZF90CSBwX291dHRocjsKKwkKKwkvKiBUaGUgbmV4dCBob3AtYnktaG9wIGlkIHZhbHVlIGZvciB0aGUgbGluaywgb25seSByZWFkICYgbW9kaWZpZWQgYnkgcF9vdXR0aHIgKi8KKwl1aW50MzJfdAkgcF9oYmg7CisJCisJLyogU2VudCByZXF1ZXN0cyAoZm9yIGZhbGxiYWNrKSwgbGlzdCBvZiBzdHJ1Y3Qgc2VudHJlcSBvcmRlcmVkIGJ5IGhiaCAqLworCXN0cnVjdCBzcl9saXN0CSBwX3NyOworCXN0cnVjdCBmaWZvCSpwX3RvZmFpbG92ZXI7CisJCisJLyogUGVuZGluZyByZWNlaXZlZCByZXF1ZXN0cyBub3QgeWV0IGFuc3dlcmVkIChjb3VudCBvbmx5KSAqLworCWxvbmcJCSBwX3JlcWluX2NvdW50OyAvKiBXZSB1c2UgcF9zdGF0ZV9tdHggdG8gcHJvdGVjdCB0aGlzIHZhbHVlICovCisJCisJLyogRGF0YSBmb3IgdHJhbnNpdGlvbmFsIHN0YXRlcyBiZWZvcmUgdGhlIHBlZXIgaXMgaW4gT1BFTiBzdGF0ZSAqLworCXN0cnVjdCB7CisJCXN0cnVjdCBjbnhjdHggKiBwX3JlY2VpdmVyOwkvKiBPbmx5IHVzZWQgaW4gY2FzZSBvZiBlbGVjdGlvbiAqLworCQlzdHJ1Y3QgbXNnICAgICogcF9jZXI7CQkvKiBPbmx5IHVzZWQgaW4gY2FzZSBvZiBlbGVjdGlvbiAqLworCQkKKwkJcHRocmVhZF90CXBfaW5pX3RocjsJLyogSW5pdGlhdG9yIHRocmVhZCBmb3IgZXN0YWJsaXNoaW5nIGEgY29ubmVjdGlvbiAqLworCQlzdHJ1Y3QgZmRfbGlzdCAgcF9jb25ucGFyYW1zOwkvKiBUaGUgbGlzdCBvZiBjb25uZWN0aW9uIGF0dGVtcHRzLCBzZWUgcF9jbnguYyAqLworCX07CisJCisJLyogY29ubmVjdGlvbiBjb250ZXh0OiBzb2NrZXQgYW5kIHJlbGF0ZWQgaW5mb3JtYXRpb24gKi8KKwlzdHJ1Y3QgY254Y3R4CSpwX2NueGN0eDsKKwkKKwkvKiBDYWxsYmFjayBmb3IgcGVlciB2YWxpZGF0aW9uIGFmdGVyIHRoZSBoYW5kc2hha2UgKi8KKwlpbnQJCSgqcF9jYjIpKHN0cnVjdCBwZWVyX2luZm8gKik7CisJCisJLyogQ2FsbGJhY2sgb24gaW5pdGlhbCBjb25uZWN0aW9uIHN1Y2Nlc3MgLyBmYWlsdXJlIGFmdGVyIHRoZSBwZWVyIHdhcyBhZGRlZCAqLworCXZvaWQgCQkoKnBfY2IpKHN0cnVjdCBwZWVyX2luZm8gKiwgdm9pZCAqKTsKKwl2b2lkIAkJKnBfY2JfZGF0YTsKKwkKK307CisjZGVmaW5lIENIRUNLX1BFRVIoIF9wICkgXAorCSgoKF9wKSAhPSBOVUxMKSAmJiAoKChzdHJ1Y3QgZmRfcGVlciAqKShfcCkpLT5wX2V5ZWMgPT0gRVlFQ19QRUVSKSkKKworI2RlZmluZSBmZF9wZWVyX2dldHN0YXRlKHBlZXIpICBmZF9wZWVyX2dldF9zdGF0ZSgoc3RydWN0IHBlZXJfaGRyICopKHBlZXIpKQorCisKKy8qIEV2ZW50cyBjb2Rlc3BhY2UgZm9yIHN0cnVjdCBmZF9wZWVyLT5wX2V2ZW50cyAqLworZW51bSB7CisJLyogcmVxdWVzdCB0byB0ZXJtaW5hdGUgdGhpcyBwZWVyIDogZGlzY29ubmVjdCwgcmVxdWV1ZSBhbGwgbWVzc2FnZXMgKi8KKwlGREVWUF9URVJNSU5BVEUgPSAxNTAwCisJCisJLyogQSBjb25uZWN0aW9uIG9iamVjdCBoYXMgcmVjZWl2ZWQgYSBtZXNzYWdlLiAoZGF0YSBjb250YWlucyB0aGUgYnVmZmVyICsgcGFkZGluZyArIHN0cnVjdCBmZF9tc2dfcG1kbCkgKi8KKwksRkRFVlBfQ05YX01TR19SRUNWCisJCQkgCisJLyogQSBjb25uZWN0aW9uIG9iamVjdCBoYXMgZW5jb3VudGVyZWQgYW4gZXJyb3IgKGRpc2Nvbm5lY3RlZCkuICovCisJLEZERVZQX0NOWF9FUlJPUgorCQorCS8qIEVuZHBvaW50cyBvZiBhIGNvbm5lY3Rpb24gaGF2ZSBiZWVuIGNoYW5nZWQgKG11bHRpaG9tZWQgU0NUUCkuICovCisJLEZERVZQX0NOWF9FUF9DSEFOR0UKKwkKKwkvKiBUaGUgY29ubmVjdGlvbiBpcyBiZWluZyBzaHV0ZG93biAoU0NUUCBub3RpZmljYXRpb24pLiAqLworCSxGREVWUF9DTlhfU0hVVERPV04KKwkKKwkvKiBBIG5ldyBjb25uZWN0aW9uICh3aXRoIGEgQ0VSKSBoYXMgYmVlbiByZWNlaXZlZCAqLworCSxGREVWUF9DTlhfSU5DT01JTkcKKwkKKwkvKiBBIG5ldyBjb25uZWN0aW9uIGhhcyBiZWVuIGVzdGFibGlzaGVkIHRvIHRoZSByZW1vdGUgcGVlciAoZXZlbnQgZGF0YSBpcyB0aGUgY254Y3R4IG9iamVjdCkgKi8KKwksRkRFVlBfQ05YX0VTVEFCTElTSEVECisJCisJLyogQSBjb25uZWN0aW9uIGF0dGVtcHQgKGluaXRpYXRvciBzaWRlKSBoYXMgZmFpbGVkICovCisJLEZERVZQX0NOWF9GQUlMRUQKKwkKKwkvKiBUaGUgUFNNIHN0YXRlIGlzIGV4cGlyZWQgKi8KKwksRkRFVlBfUFNNX1RJTUVPVVQKKwkKK307CisjZGVmaW5lIENIRUNLX1BFVkVOVCggX2UgKSBcCisJKCgoaW50KShfZSkgPj0gRkRFVlBfVEVSTUlOQVRFKSAmJiAoKGludCkoX2UpIDw9IEZERVZQX1BTTV9USU1FT1VUKSkKKy8qIFRoZSBmb2xsb3dpbmcgbWFjcm8gaXMgYWN0dWFsbHkgY2FsbGVkIGluIHBfcHNtLmMgLS0gYW5vdGhlciBzb2x1dGlvbiB3b3VsZCBiZSB0byBkZWNsYXJlIGl0IHN0YXRpYyBpbmxpbmUgKi8KKyNkZWZpbmUgREVDTEFSRV9QRVZfU1RSKCkJCQkJXAorY29uc3QgY2hhciAqIGZkX3Bldl9zdHIoaW50IGV2ZW50KQkJCVwKK3sJCQkJCQkJXAorCXN3aXRjaCAoZXZlbnQpIHsJCQkJXAorCQljYXNlX3N0cihGREVWUF9URVJNSU5BVEUpOwkJXAorCQljYXNlX3N0cihGREVWUF9DTlhfTVNHX1JFQ1YpOwkJXAorCQljYXNlX3N0cihGREVWUF9DTlhfRVJST1IpOwkJXAorCQljYXNlX3N0cihGREVWUF9DTlhfRVBfQ0hBTkdFKTsJCVwKKwkJY2FzZV9zdHIoRkRFVlBfQ05YX0lOQ09NSU5HKTsJCVwKKwkJY2FzZV9zdHIoRkRFVlBfQ05YX0VTVEFCTElTSEVEKTsJXAorCQljYXNlX3N0cihGREVWUF9DTlhfRkFJTEVEKTsJCVwKKwkJY2FzZV9zdHIoRkRFVlBfUFNNX1RJTUVPVVQpOwkJXAorCX0JCQkJCQlcCisJVFJBQ0VfREVCVUcoRlVMTCwgIlVua25vd24gZXZlbnQgOiAlZCIsIGV2ZW50KTsJXAorCXJldHVybiAiVW5rbm93biBldmVudCI7CQkJCVwKK30KK2NvbnN0IGNoYXIgKiBmZF9wZXZfc3RyKGludCBldmVudCk7CisKKy8qIFRoZSBkYXRhIHN0cnVjdHVyZSBmb3IgRkRFVlBfQ05YX0lOQ09NSU5HIGV2ZW50ICovCitzdHJ1Y3QgY254X2luY29taW5nIHsKKwlzdHJ1Y3QgbXNnCSogY2VyOwkJLyogdGhlIENFUiBtZXNzYWdlIHJlY2VpdmVkIG9uIHRoaXMgY29ubmVjdGlvbiAqLworCXN0cnVjdCBjbnhjdHgJKiBjbng7CQkvKiBUaGUgY29ubmVjdGlvbiBjb250ZXh0ICovCisJaW50ICAJCSAgdmFsaWRhdGU7CS8qIFRoZSBwZWVyIGlzIG5ldywgaXQgbXVzdCBiZSB2YWxpZGF0ZWQgKGJ5IGFuIGV4dGVuc2lvbikgb3IgZXJyb3IgQ0VBIHRvIGJlIHNlbnQgKi8KK307CisKKy8qIEZ1bmN0aW9ucyAqLworaW50ICBmZF9wZWVyX2ZpbmkoKTsKK2ludCAgZmRfcGVlcl9hbGxvYyhzdHJ1Y3QgZmRfcGVlciAqKiBwdHIpOworaW50ICBmZF9wZWVyX2ZyZWUoc3RydWN0IGZkX3BlZXIgKiogcHRyKTsKK2ludCBmZF9wZWVyX2hhbmRsZV9uZXdDRVIoIHN0cnVjdCBtc2cgKiogY2VyLCBzdHJ1Y3QgY254Y3R4ICoqIGNueCApOworLyogZmRfcGVlcl9hZGQgZGVjbGFyZWQgaW4gZnJlZURpYW1ldGVyLmggKi8KK2ludCBmZF9wZWVyX3ZhbGlkYXRlKCBzdHJ1Y3QgZmRfcGVlciAqIHBlZXIgKTsKK3ZvaWQgZmRfcGVlcl9mYWlsb3Zlcl9tc2coc3RydWN0IGZkX3BlZXIgKiBwZWVyKTsKKworLyogUGVlciBleHBpcnkgKi8KK2ludCBmZF9wX2V4cGlfaW5pdCh2b2lkKTsKK2ludCBmZF9wX2V4cGlfZmluaSh2b2lkKTsKK2ludCBmZF9wX2V4cGlfdXBkYXRlKHN0cnVjdCBmZF9wZWVyICogcGVlciApOworCisvKiBQZWVyIHN0YXRlIG1hY2hpbmUgKi8KK2ludCAgZmRfcHNtX3N0YXJ0KCk7CitpbnQgIGZkX3BzbV9iZWdpbihzdHJ1Y3QgZmRfcGVlciAqIHBlZXIgKTsKK2ludCAgZmRfcHNtX3Rlcm1pbmF0ZShzdHJ1Y3QgZmRfcGVlciAqIHBlZXIsIGNoYXIgKiByZWFzb24gKTsKK3ZvaWQgZmRfcHNtX2Fib3JkKHN0cnVjdCBmZF9wZWVyICogcGVlciApOwordm9pZCBmZF9wc21fbmV4dF90aW1lb3V0KHN0cnVjdCBmZF9wZWVyICogcGVlciwgaW50IGFkZF9yYW5kb20sIGludCBkZWxheSk7CitpbnQgZmRfcHNtX2NoYW5nZV9zdGF0ZShzdHJ1Y3QgZmRfcGVlciAqIHBlZXIsIGludCBuZXdfc3RhdGUpOwordm9pZCBmZF9wc21fY2xlYW51cChzdHJ1Y3QgZmRfcGVlciAqIHBlZXIsIGludCB0ZXJtaW5hdGUpOworCisvKiBQZWVyIG91dCAqLworaW50IGZkX291dF9zZW5kKHN0cnVjdCBtc2cgKiogbXNnLCBzdHJ1Y3QgY254Y3R4ICogY254LCBzdHJ1Y3QgZmRfcGVlciAqIHBlZXIsIGludCB1cGRhdGVfcmVxaW5fY250KTsKK2ludCBmZF9vdXRfc3RhcnQoc3RydWN0IGZkX3BlZXIgKiBwZWVyKTsKK2ludCBmZF9vdXRfc3RvcChzdHJ1Y3QgZmRfcGVlciAqIHBlZXIpOworCisvKiBJbml0aWF0aW5nIGNvbm5lY3Rpb25zICovCitpbnQgZmRfcF9jbnhfaW5pdChzdHJ1Y3QgZmRfcGVlciAqIHBlZXIpOwordm9pZCBmZF9wX2NueF9hYm9ydChzdHJ1Y3QgZmRfcGVlciAqIHBlZXIsIGludCBjbGVhbnVwX2FsbCk7CisKKy8qIFBlZXIgc2VudCByZXF1ZXN0cyBjYWNoZSAqLworaW50IGZkX3Bfc3Jfc3RvcmUoc3RydWN0IHNyX2xpc3QgKiBzcmxpc3QsIHN0cnVjdCBtc2cgKipyZXEsIHVpbnQzMl90ICpoYmhsb2MsIHVpbnQzMl90IGhiaF9yZXN0b3JlKTsKK2ludCBmZF9wX3NyX2ZldGNoKHN0cnVjdCBzcl9saXN0ICogc3JsaXN0LCB1aW50MzJfdCBoYmgsIHN0cnVjdCBtc2cgKipyZXEpOworaW50IGZkX3Bfc3Jfc3RhcnQoc3RydWN0IHNyX2xpc3QgKiBzcmxpc3QpOworaW50IGZkX3Bfc3Jfc3RvcChzdHJ1Y3Qgc3JfbGlzdCAqIHNybGlzdCk7Cit2b2lkIGZkX3Bfc3JfZmFpbG92ZXIoc3RydWN0IHNyX2xpc3QgKiBzcmxpc3QpOworCisvKiBMb2NhbCBMaW5rIG1lc3NhZ2VzIChDRVIvQ0VBLCBEV1IvRFdBLCBEUFIvRFBBKSAqLworaW50IGZkX3BfY2VfbXNncmN2KHN0cnVjdCBtc2cgKiogbXNnLCBpbnQgcmVxLCBzdHJ1Y3QgZmRfcGVlciAqIHBlZXIpOworaW50IGZkX3BfY2VfaGFuZGxlX25ld0NFUihzdHJ1Y3QgbXNnICoqIG1zZywgc3RydWN0IGZkX3BlZXIgKiBwZWVyLCBzdHJ1Y3QgY254Y3R4ICoqIGNueCwgaW50IHZhbGlkKTsKK2ludCBmZF9wX2NlX2hhbmRsZV9uZXdjbngoc3RydWN0IGZkX3BlZXIgKiBwZWVyLCBzdHJ1Y3QgY254Y3R4ICogaW5pdGlhdG9yKTsKK2ludCBmZF9wX2NlX3Byb2Nlc3NfcmVjZWl2ZXIoc3RydWN0IGZkX3BlZXIgKiBwZWVyKTsKK3ZvaWQgZmRfcF9jZV9jbGVhcl9jbngoc3RydWN0IGZkX3BlZXIgKiBwZWVyLCBzdHJ1Y3QgY254Y3R4ICoqIGNueF9rZXB0KTsKK2ludCBmZF9wX2R3X2hhbmRsZShzdHJ1Y3QgbXNnICoqIG1zZywgaW50IHJlcSwgc3RydWN0IGZkX3BlZXIgKiBwZWVyKTsKK2ludCBmZF9wX2R3X3RpbWVvdXQoc3RydWN0IGZkX3BlZXIgKiBwZWVyKTsKK2ludCBmZF9wX2R3X3Jlb3BlbihzdHJ1Y3QgZmRfcGVlciAqIHBlZXIpOworaW50IGZkX3BfZHBfaGFuZGxlKHN0cnVjdCBtc2cgKiogbXNnLCBpbnQgcmVxLCBzdHJ1Y3QgZmRfcGVlciAqIHBlZXIpOworaW50IGZkX3BfZHBfaW5pdGlhdGUoc3RydWN0IGZkX3BlZXIgKiBwZWVyLCBjaGFyICogcmVhc29uKTsKK2ludCBmZF9wX2RwX25ld2RlbGF5KHN0cnVjdCBmZF9wZWVyICogcGVlcik7CisKKy8qIEFjdGl2ZSBwZWVycyAtLSByb3V0aW5nIHByb2Nlc3Mgc2hvdWxkIG9ubHkgZXZlciB0YWtlIHRoZSByZWFkIGxvY2ssIHRoZSB3cml0ZSBsb2NrIGlzIG1hbmFnZWQgYnkgUFNNcyAqLworZXh0ZXJuIHN0cnVjdCBmZF9saXN0IGZkX2dfYWN0aXZfcGVlcnM7CitleHRlcm4gcHRocmVhZF9yd2xvY2tfdCBmZF9nX2FjdGl2X3BlZXJzX3J3OyAvKiBwcm90ZWN0IHRoZSBsaXN0ICovCisKKworLyogU2VydmVyIHNvY2tldHMgKi8KK2ludCAgZmRfc2VydmVyc19zdGFydCgpOworaW50ICBmZF9zZXJ2ZXJzX3N0b3AoKTsKKworLyogQ29ubmVjdGlvbiBjb250ZXh0cyAtLSB0aGVyZSBhcmUgYWxzbyBkZWZpbml0aW9ucyBpbiBjbnhjdHguaCBmb3IgdGhlIHJlbGV2YW50IGZpbGVzICovCitzdHJ1Y3QgY254Y3R4ICogZmRfY254X3NlcnZfdGNwKHVpbnQxNl90IHBvcnQsIGludCBmYW1pbHksIHN0cnVjdCBmZF9lbmRwb2ludCAqIGVwKTsKK3N0cnVjdCBjbnhjdHggKiBmZF9jbnhfc2Vydl9zY3RwKHVpbnQxNl90IHBvcnQsIHN0cnVjdCBmZF9saXN0ICogZXBfbGlzdCk7CitpbnQgICAgICAgICAgICAgZmRfY254X3NlcnZfbGlzdGVuKHN0cnVjdCBjbnhjdHggKiBjb25uKTsKK3N0cnVjdCBjbnhjdHggKiBmZF9jbnhfc2Vydl9hY2NlcHQoc3RydWN0IGNueGN0eCAqIHNlcnYpOworc3RydWN0IGNueGN0eCAqIGZkX2NueF9jbGlfY29ubmVjdF90Y3Aoc1NBICogc2EsIHNvY2tsZW5fdCBhZGRybGVuKTsKK3N0cnVjdCBjbnhjdHggKiBmZF9jbnhfY2xpX2Nvbm5lY3Rfc2N0cChpbnQgbm9faXA2LCB1aW50MTZfdCBwb3J0LCBzdHJ1Y3QgZmRfbGlzdCAqIGxpc3QpOworaW50ICAgICAgICAgICAgIGZkX2NueF9zdGFydF9jbGVhcihzdHJ1Y3QgY254Y3R4ICogY29ubiwgaW50IGxvb3ApOwordm9pZAkJZmRfY254X3NldGhvc3RuYW1lKHN0cnVjdCBjbnhjdHggKiBjb25uLCBEaWFtSWRfdCBobik7CitpbnQJCWZkX2NueF9wcm90b19pbmZvKHN0cnVjdCBjbnhjdHggKiBjb25uLCBjaGFyICogYnVmLCBzaXplX3QgbGVuKTsKKyNkZWZpbmUgQUxHT19IQU5EU0hBS0VfREVGQVVMVAkwIC8qIFRMUyBmb3IgVENQLCBEVExTIGZvciBTQ1RQICovCisjZGVmaW5lIEFMR09fSEFORFNIQUtFXzM0MzYJMSAvKiBGb3IgVExTIGZvciBTQ1RQIGFsc28gKi8KK2ludCAgICAgICAgICAgICBmZF9jbnhfaGFuZHNoYWtlKHN0cnVjdCBjbnhjdHggKiBjb25uLCBpbnQgbW9kZSwgaW50IGFsZ28sIGNoYXIgKiBwcmlvcml0eSwgdm9pZCAqIGFsdF9jcmVkcyk7CitjaGFyICogICAgICAgICAgZmRfY254X2dldGlkKHN0cnVjdCBjbnhjdHggKiBjb25uKTsKK2ludAkJZmRfY254X2dldHByb3RvKHN0cnVjdCBjbnhjdHggKiBjb25uKTsKK2ludAkJZmRfY254X2dldFRMUyhzdHJ1Y3QgY254Y3R4ICogY29ubik7CitpbnQJCWZkX2NueF9pc191bm9yZGVyZWRfZGVsaXZlcnlfc3VwcG9ydGVkKHN0cnVjdCBjbnhjdHggKiBjb25uKTsKK2ludAkJZmRfY254X3Vub3JkZXJlZF9kZWxpdmVyeShzdHJ1Y3QgY254Y3R4ICogY29ubiwgaW50IGlzX2FsbG93ZWQpOworaW50ICAgICAgICAgICAgIGZkX2NueF9nZXRjcmVkKHN0cnVjdCBjbnhjdHggKiBjb25uLCBjb25zdCBnbnV0bHNfZGF0dW1fdCAqKmNlcnRfbGlzdCwgdW5zaWduZWQgaW50ICpjZXJ0X2xpc3Rfc2l6ZSk7CitpbnQgCQlmZF9jbnhfZ2V0X2xvY2FsX2VwcyhzdHJ1Y3QgZmRfbGlzdCAqIGxpc3QpOworaW50ICAgICAgICAgICAgIGZkX2NueF9nZXRyZW1vdGVlcHMoc3RydWN0IGNueGN0eCAqIGNvbm4sIHN0cnVjdCBmZF9saXN0ICogZXBzKTsKK2NoYXIgKiAgICAgICAgICBmZF9jbnhfZ2V0cmVtb3RlaWQoc3RydWN0IGNueGN0eCAqIGNvbm4pOworaW50ICAgICAgICAgICAgIGZkX2NueF9yZWNlaXZlKHN0cnVjdCBjbnhjdHggKiBjb25uLCBzdHJ1Y3QgdGltZXNwZWMgKiB0aW1lb3V0LCB1bnNpZ25lZCBjaGFyICoqYnVmLCBzaXplX3QgKiBsZW4pOworaW50ICAgICAgICAgICAgIGZkX2NueF9yZWN2X3NldGFsdGZpZm8oc3RydWN0IGNueGN0eCAqIGNvbm4sIHN0cnVjdCBmaWZvICogYWx0X2ZpZm8pOyAvKiBzZW5kIEZERVZQX0NOWF9NU0dfUkVDViBldmVudCB0byB0aGUgZmlmbyBsaXN0ICovCitpbnQgICAgICAgICAgICAgZmRfY254X3NlbmQoc3RydWN0IGNueGN0eCAqIGNvbm4sIHVuc2lnbmVkIGNoYXIgKiBidWYsIHNpemVfdCBsZW4pOwordm9pZCAgICAgICAgICAgIGZkX2NueF9kZXN0cm95KHN0cnVjdCBjbnhjdHggKiBjb25uKTsKKyNpZmRlZiBHTlVUTFNfVkVSU0lPTl8zMDAKK2ludCAgICAgICAgICAgICBmZF90bHNfdmVyaWZ5X2NyZWRlbnRpYWxzXzIoZ251dGxzX3Nlc3Npb25fdCBzZXNzaW9uKTsKKyNlbmRpZiAvKiBHTlVUTFNfVkVSU0lPTl8zMDAgKi8KKworLyogSW50ZXJuYWwgY2FsbHMgb2YgdGhlIGhvb2sgbWVjaGFuaXNtICovCit2b2lkICAgZmRfaG9va19jYWxsKGVudW0gZmRfaG9va190eXBlIHR5cGUsIHN0cnVjdCBtc2cgKiBtc2csIHN0cnVjdCBmZF9wZWVyICogcGVlciwgdm9pZCAqIG90aGVyLCBzdHJ1Y3QgZmRfbXNnX3BtZGwgKiBwbWRsKTsKK3ZvaWQgICBmZF9ob29rX2Fzc29jaWF0ZShzdHJ1Y3QgbXNnICogbXNnLCBzdHJ1Y3QgZmRfbXNnX3BtZGwgKiBwbWRsKTsKK2ludCAgICBmZF9ob29rc19pbml0KHZvaWQpOworc2l6ZV90IGZkX21zZ19wbWRsX3NpemV3aXRob3ZlcmhlYWQoc2l6ZV90IGRhdGFsZW4pOworc3RydWN0IGZkX21zZ19wbWRsICogZmRfbXNnX3BtZGxfZ2V0X2luYnVmKHVpbnQ4X3QgKiBidWYsIHNpemVfdCBkYXRhbGVuKTsgCisKKyNlbmRpZiAvKiBfRkRDT1JFX0lOVEVSTkFMX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmZkY29yZS9mZGQubCBiL2xpYmZkY29yZS9mZGQubApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODM1ZGVmCi0tLSAvZGV2L251bGwKKysrIGIvbGliZmRjb3JlL2ZkZC5sCkBAIC0wLDAgKzEsMjg1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxMywgV0lERSBQcm9qZWN0IGFuZCBOSUNUCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBXSURFIFByb2plY3Qgb3IgTklDVCBub3IgdGhlIAkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFdJREUgUHJvamVjdCBhbmQgCQkJCQkJICoKKyogICBOSUNULgkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIExleCBjb25maWd1cmF0aW9uIHBhcnNlci4KKyAqCisgKiBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgdG9rZW4gZm9yIHBhcnNpbmcgdGhlIGRhZW1vbidzIGNvbmZpZ3VyYXRpb24gZmlsZQorICogTm90ZSB0aGF0IGVhY2ggZXh0ZW5zaW9uIGhhcyBhIHNlcGFyYXRlIGluZGVwZW5kYW50IGNvbmZpZ3VyYXRpb24gZmlsZS4KKyAqCisgKiBOb3RlIDogVGhpcyBtb2R1bGUgaXMgTk9UIHRocmVhZC1zYWZlLiBBbGwgcHJvY2Vzc2luZyBtdXN0IGJlIGRvbmUgZnJvbSBvbmUgdGhyZWFkIG9ubHkuCisgKi8KKyV7CisvKiBJbmNsdWRlIHRoZSBkYWVtb24ncyBoZWFkZXIgZmlsZXMgKi8KKyNpbmNsdWRlICJmZGNvcmUtaW50ZXJuYWwuaCIKKy8qIEluY2x1ZGUgeWFjYyB0b2tlbnMgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlICJmZGQudGFiLmgiCisKKy8qIFVwZGF0ZSB0aGUgY29sdW1uIGluZm9ybWF0aW9uICovCisjaWZkZWYgREVCVUdfTEVYCisjZGVmaW5lIFlZX1VTRVJfQUNUSU9OIHsgCQkJCQkJXAorCXl5bGxvYy0+Zmlyc3RfY29sdW1uID0geXlsbG9jLT5sYXN0X2NvbHVtbiArIDE7IAkJXAorCXl5bGxvYy0+bGFzdF9jb2x1bW4gPSB5eWxsb2MtPmZpcnN0X2NvbHVtbiArIHl5bGVuZyAtIDE7CVwKKwlmZF9sb2dfZGVidWcoCSAJCQkJCQlcCisJCSIoJWQ6JWQtJWQ6JWQpIG1hdGNoZWQgcnVsZSAlZCwgbGVuZ3RoPSVkLCB0eHQ9JyVzJyIsCVwKKwkJeXlsbG9jLT5maXJzdF9saW5lLCB5eWxsb2MtPmZpcnN0X2NvbHVtbiwgCQlcCisJCXl5bGxvYy0+bGFzdF9saW5lLCB5eWxsb2MtPmxhc3RfY29sdW1uLCAJCVwKKwkJeXlfYWN0LCB5eWxlbmcsIHl5dGV4dCk7IAkJCQlcCit9CisjZWxzZSAvKiBERUJVR19MRVggKi8KKyNkZWZpbmUgWVlfVVNFUl9BQ1RJT04geyAJCQkJCQlcCisJeXlsbG9jLT5maXJzdF9jb2x1bW4gPSB5eWxsb2MtPmxhc3RfY29sdW1uICsgMTsgCQlcCisJeXlsbG9jLT5sYXN0X2NvbHVtbiA9IHl5bGxvYy0+Zmlyc3RfY29sdW1uICsgeXlsZW5nIC0gMTsJXAorfQorI2VuZGlmCisKKy8qICVvcHRpb24gbm9pbnB1dCA/ICovCisjZGVmaW5lIFlZX05PX0lOUFVUCisKKy8qIEFkZGl0aW9uYWwgZm9yIGZpbGVzIGluY2x1c2lvbiAqLworI2luY2x1ZGUgPGdsb2IuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBNQVhfTkVTVEVEX0NPTkZfRklMRVMJNQorCitzdHJ1Y3QgbmVzdGVkX2NvbmZmaWxlc190IHsKKwlZWV9CVUZGRVJfU1RBVEUgcGFyZW50X2xldmVsX3N0YXRlOworCWdsb2JfdCBmaWxlbGlzdDsKKwlpbnQgY3VycmVudF9maWxlOworfSBuZXN0ZWRfY29uZmZpbGVzW01BWF9ORVNURURfQ09ORl9GSUxFU107CisKK2ludCBjdXJyZW50X25lc3RlZF9sZXZlbCA9IDA7CisKK2ludCBnbG9iZXJyZmN0KGNvbnN0IGNoYXIgKmVwYXRoLCBpbnQgZWVycm5vKQoreworCVRSQUNFX0VSUk9SKCJGYWlsZWQgdG8gc2NhbiAlczogJXMiLCBlcGF0aCwgc3RyZXJyb3IoZWVycm5vKSk7CisJcmV0dXJuIDE7Cit9CisKKyV9CisKKyVvcHRpb24gYmlzb24tYnJpZGdlIGJpc29uLWxvY2F0aW9ucworJW9wdGlvbiBub3l5d3JhcAorJW9wdGlvbiBub3VucHV0CisKKyV4IGluX2luY2x1ZGUKKworLyogUXVvdGVkIHN0cmluZy4gTXVsdGlsaW5lcyBkbyBub3QgbWF0Y2guICovCitxc3RyaW5nCQlcIlteXCJcbl0qXCIKKworJSUKKzwqPlxuCQkJeyAKKwkJCQkvKiBVcGRhdGUgdGhlIGxpbmUgY291bnQgKi8KKwkJCQl5eWxsb2MtPmZpcnN0X2xpbmUrKzsgCisJCQkJeXlsbG9jLT5sYXN0X2xpbmUrKzsgCisJCQkJeXlsbG9jLT5sYXN0X2NvbHVtbj0wOyAKKwkJCX0gCisKKzwqPihbWzpzcGFjZTpdXXstfVtcbl0pKwk7IC8qIEVhdCBhbGwgc3BhY2VzLCBub3QgbmV3IGxpbmVzICovCis8Kj4jLiokCQkJOyAvKiBFYXQgYWxsIGNvbW1lbnRzICovCisKKworaW5jbHVkZQkJQkVHSU4oaW5faW5jbHVkZSk7CisJLyogRm9sbG93aW5nIGFuICJpbmNsdWRlIiBrZXl3b3JkICovCis8aW5faW5jbHVkZT57Cit7cXN0cmluZ30JeyAvKiBOYW1lIG9mIHRoZSBmaWxlIHRvIGluY2x1ZGUuIFRoaXMgaXMgZGlyZWN0bHkgc2VudCB0byBnbG9iLiAqLworCQkJaW50IGdsb2JlcnJvcj0wOworCQkJY2hhciAqIGJ1ZiA9IHN0cmR1cCh5eXRleHQrMSk7CisJCQlpZiAoYnVmW3l5bGVuZy0yXSAhPSAnIicpCisJCQl7CisJCQkJVFJBQ0VfRVJST1IoIlVudGVybWluYXRlZCBzdHJpbmc6ICVzIiwgeXl0ZXh0KTsKKwkJCQlyZXR1cm4gTEVYX0VSUk9SOworCQkJfQorCQkJYnVmW3l5bGVuZy0yXSA9ICdcMCc7CisKKwkJCWlmIChjdXJyZW50X25lc3RlZF9sZXZlbCA+PSBNQVhfTkVTVEVEX0NPTkZfRklMRVMpCisJCQl7CisJCQkJVFJBQ0VfRVJST1IoIlRvbyBtYW55IHJlY3Vyc2lvbiBsZXZlbHMgaW4gY29uZmlndXJhdGlvbiBmaWxlcyBpbmNsdWRlcyIpOworCQkJCXJldHVybiBMRVhfRVJST1I7CisJCQl9CisKKwkJCS8qIGdsb2IgdGhlIGluY2x1ZGUgKi8KKwkJCWdsb2JlcnJvciA9IGdsb2IoYnVmLCBHTE9CX0VSUiwgZ2xvYmVycmZjdCwgJm5lc3RlZF9jb25mZmlsZXNbY3VycmVudF9uZXN0ZWRfbGV2ZWxdLmZpbGVsaXN0KTsKKworCQkJaWYgKGdsb2JlcnJvciA9PSBHTE9CX05PU1BBQ0UpCisJCQl7CisJCQkJVFJBQ0VfRVJST1IoIk5vdCBlbm91Z2ggbWVtb3J5IHRvIHBhcnNlIGluY2x1ZGUgZGlyZWN0aXZlLiIpOworCQkJCXJldHVybiBMRVhfRVJST1I7CisJCQl9CisJCQlpZiAoZ2xvYmVycm9yID09IEdMT0JfQUJPUlRFRCkKKwkJCXsKKwkJCQlUUkFDRV9FUlJPUigiQW4gZXJyb3Igd2FzIGVuY291bnRlcmVkIGluIGluY2x1ZGUgZGlyZWN0aXZlLiIpOworCQkJCXJldHVybiBMRVhfRVJST1I7CisJCQl9CisJCQlpZiAoZ2xvYmVycm9yID09IEdMT0JfTk9NQVRDSCkKKwkJCXsKKwkJCQlnbG9iZnJlZSgmbmVzdGVkX2NvbmZmaWxlc1tjdXJyZW50X25lc3RlZF9sZXZlbF0uZmlsZWxpc3QpOworCQkJCWdvdG8gbm9tYXRjaDsKKwkJCX0KKwkJCWlmIChnbG9iZXJyb3IpCisJCQl7CisJCQkJVFJBQ0VfRVJST1IoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gZ2xvYiAoJWQpLiIsIGdsb2JlcnJvcik7CisJCQkJcmV0dXJuIExFWF9FUlJPUjsKKwkJCX0KKworCQkJLyogV2UgaGF2ZSBhIGxpc3Qgb2YgZmlsZXMgdG8gaW5jbHVkZS4gKi8KKworCQkJLyogc2F2ZSB0aGUgY3VycmVudCBidWZmZXIgZm9yIHJldHVybmluZyB3aGVuIHRoaXMgaW5jbHVkZSBoYXMgYmVlbiBwYXJzZWQgKi8KKwkJCW5lc3RlZF9jb25mZmlsZXNbY3VycmVudF9uZXN0ZWRfbGV2ZWxdLnBhcmVudF9sZXZlbF9zdGF0ZSA9IFlZX0NVUlJFTlRfQlVGRkVSOworCisJCQkvKiBTdGFydCB3aXRoIHRoZSBmaXJzdCBtYXRjaCAqLworCQkJbmVzdGVkX2NvbmZmaWxlc1tjdXJyZW50X25lc3RlZF9sZXZlbF0uY3VycmVudF9maWxlID0gMDsKKworCQkJeXlpbiA9IGZvcGVuKCBuZXN0ZWRfY29uZmZpbGVzW2N1cnJlbnRfbmVzdGVkX2xldmVsXS5maWxlbGlzdC5nbF9wYXRodlswXSwgInIiICk7CisKKwkJCWlmICggISB5eWluICkKKwkJCXsKKwkJCQlUUkFDRV9FUlJPUigiRXJyb3IgaW4gJXM6ICVzIiwgbmVzdGVkX2NvbmZmaWxlc1tjdXJyZW50X25lc3RlZF9sZXZlbF0uZmlsZWxpc3QuZ2xfcGF0aHZbMF0sIHN0cmVycm9yKGVycm5vKSk7CisJCQkJcmV0dXJuIExFWF9FUlJPUjsKKwkJCX0KKworCQkJeXlfc3dpdGNoX3RvX2J1ZmZlcih5eV9jcmVhdGVfYnVmZmVyKCB5eWluLCBZWV9CVUZfU0laRSApKTsKKworCQkJLyogSW4gY2FzZSBvZiByZWN1cnNpdmUgaW5jbHVkZXMgKi8KKwkJCWN1cnJlbnRfbmVzdGVkX2xldmVsKys7CisKK25vbWF0Y2g6CisJCQlCRUdJTihJTklUSUFMKTsKKwkJfQorfQorCis8PEVPRj4+CXsKKwkJCWlmIChjdXJyZW50X25lc3RlZF9sZXZlbCA9PSAwKQorCQkJeworCQkJICAgICAgLyogV2UgYXJlIGF0IHRoZSBlbmQgb2YgcGFyc2luZyAqLworCQkJICAgICAgeXl0ZXJtaW5hdGUoKTsKKwkJCX0KKworCQkJLyogT3RoZXJ3aXNlIHdlIGFyZSBkb2luZyBhbiBpbmNsdWRlIHN0YXRlbWVudCAqLworCQkJLS1jdXJyZW50X25lc3RlZF9sZXZlbDsKKwkJCXl5X2RlbGV0ZV9idWZmZXIoWVlfQ1VSUkVOVF9CVUZGRVIpOworCisJCQkvKiBHbyB0byBuZXh0IGZpbGUsIGlmIGFueSAqLworCQkJbmVzdGVkX2NvbmZmaWxlc1tjdXJyZW50X25lc3RlZF9sZXZlbF0uY3VycmVudF9maWxlKys7CisJCQlpZiAoIG5lc3RlZF9jb25mZmlsZXNbY3VycmVudF9uZXN0ZWRfbGV2ZWxdLmZpbGVsaXN0LmdsX3BhdGh2W25lc3RlZF9jb25mZmlsZXNbY3VycmVudF9uZXN0ZWRfbGV2ZWxdLmN1cnJlbnRfZmlsZV0gPT0gTlVMTCApCisJCQl7CisJCQkJLyogV2UgaGF2ZSBmaW5pc2hlZCB3aXRoIHRoaXMgbGlzdCBvZiBpbmNsdWRlcyAqLworCQkJCWdsb2JmcmVlKCZuZXN0ZWRfY29uZmZpbGVzW2N1cnJlbnRfbmVzdGVkX2xldmVsXS5maWxlbGlzdCk7CisJCQkJeXlfc3dpdGNoX3RvX2J1ZmZlcihuZXN0ZWRfY29uZmZpbGVzW2N1cnJlbnRfbmVzdGVkX2xldmVsXS5wYXJlbnRfbGV2ZWxfc3RhdGUpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8qIFByb2NlZWQgdG8gbmV4dCBpbmNsdWRlZCBmaWxlICovCisJCQkJeXlpbiA9IGZvcGVuKCBuZXN0ZWRfY29uZmZpbGVzW2N1cnJlbnRfbmVzdGVkX2xldmVsXS5maWxlbGlzdC5nbF9wYXRodltuZXN0ZWRfY29uZmZpbGVzW2N1cnJlbnRfbmVzdGVkX2xldmVsXS5jdXJyZW50X2ZpbGVdLCAiciIgKTsKKworCQkJCWlmICggISB5eWluICkKKwkJCQl7CisJCQkJCVRSQUNFX0VSUk9SKCJFcnJvciBpbiAlczogJXMiLCBuZXN0ZWRfY29uZmZpbGVzW2N1cnJlbnRfbmVzdGVkX2xldmVsXS5maWxlbGlzdC5nbF9wYXRodltuZXN0ZWRfY29uZmZpbGVzW2N1cnJlbnRfbmVzdGVkX2xldmVsXS5jdXJyZW50X2ZpbGVdLCBzdHJlcnJvcihlcnJubykpOworCQkJCQlyZXR1cm4gTEVYX0VSUk9SOworCQkJCX0KKworCQkJCXl5X3N3aXRjaF90b19idWZmZXIoeXlfY3JlYXRlX2J1ZmZlciggeXlpbiwgWVlfQlVGX1NJWkUgKSk7CisKKwkJCQkvKiBJbiBjYXNlIG9mIHJlY3Vyc2l2ZSBpbmNsdWRlcyAqLworCQkJCWN1cnJlbnRfbmVzdGVkX2xldmVsKys7CisJCQl9CisKK30KKwore3FzdHJpbmd9CQl7CisJCQkJLyogRmlyc3QgY29weSB0aGUgc3RyaW5nIHdpdGhvdXQgdGhlIHF1b3RlcyBmb3IgdXNlIGluIHRoZSB5YWNjIHBhcnNlciAqLworCQkJCUNIRUNLX01BTExPQ19ETygJeXlsdmFsLT5zdHJpbmcgPSBzdHJkdXAoeXl0ZXh0KzEpLCAvKiBUaGlzIGFsbG9jYXRlcyBvbmUgdXNlbGVzcyB0YWlsIGNoYXIgYnV0Li4uIGl0J3MgZWFzaWVyIDpEICovIAorCQkJCQkJCXJldHVybiBMRVhfRVJST1IgICk7Lyogb24gZXJyb3IsIHRyaWcgYW4gZXJyb3IgaW4geWFjYyBwYXJzZXIgKi8KKworCQkJCXl5bHZhbC0+c3RyaW5nW3l5bGVuZy0yXSA9ICdcMCc7CisJCQkJCisJCQkJLyogdGhlIHlhY2MgcGFyc2VyIHdpbGwgY2hlY2sgdGhlIHN0cmluZyBpcyB2YWxpZCAqLworCQkJCXJldHVybiBRU1RSSU5HOworCQkJfQorCQkJCitbWzpkaWdpdDpdXSsJCXsKKwkJCQkvKiBDb252ZXJ0IHRoaXMgdG8gYW4gaW50ZWdlciB2YWx1ZSAqLworCQkJCWludCByZXQgPSBzc2NhbmYoeXl0ZXh0LCAiJWkiLCAmeXlsdmFsLT5pbnRlZ2VyKTsKKwkJCQlpZiAocmV0ICE9IDEpIHsKKwkJCQkJLyogTm8gbWF0Y2hpbmc6IGFuIGVycm9yIG9jY3VycmVkICovCisJCQkJCVRSQUNFX0VSUk9SKCJVbmFibGUgdG8gY29udmVydCB0aGUgdmFsdWUgJyVzJyB0byBhIHZhbGlkIG51bWJlcjogJXMiLCB5eXRleHQsIHN0cmVycm9yKGVycm5vKSk7CisJCQkJCXJldHVybiBMRVhfRVJST1I7IC8qIHRyaWcgYW4gZXJyb3IgaW4geWFjYyBwYXJzZXIgKi8KKwkJCQkJLyogTWF5YmUgd2UgY291bGQgUkVKRUNUIGluc3RlYWQgb2YgZmFpbGluZyBoZXJlPyAqLworCQkJCX0KKwkJCQlyZXR1cm4gSU5URUdFUjsKKwkJCX0KKwkJCQkKKwkvKiBGdWxsIHdvcmRzIHRva2VucyAoa2V5d29yZHMpICovCisoP2k6IklkZW50aXR5IikJCXsgcmV0dXJuIElERU5USVRZOwl9CisoP2k6IlJlYWxtIikJCXsgcmV0dXJuIFJFQUxNOyAgIAl9CisoP2k6IlBvcnQiKQkJeyByZXR1cm4gUE9SVDsgICAgCX0KKyg/aToiU2VjUG9ydCIpCQl7IHJldHVybiBTRUNQT1JUOyAgCX0KKwkvKiAoP2k6IlNjdHBTZWMzNDM2IikJeyByZXR1cm4gU0VDMzQzNjsgIAl9ICovCisoP2k6Ik5vX0lQdjYiKQkJeyByZXR1cm4gTk9JUDY7CQl9CisoP2k6Ik5vX0lQIikJCXsgcmV0dXJuIE5PSVA7CQl9CisoP2k6Ik5vX1RDUCIpCQl7IHJldHVybiBOT1RDUDsJCX0KKyg/aToiTm9fU0NUUCIpCQl7IHJldHVybiBOT1NDVFA7CX0KKyg/aToiUHJlZmVyX1RDUCIpCXsgcmV0dXJuIFBSRUZFUlRDUDsJfQorKD9pOiJUTFNfb2xkX21ldGhvZCIpCXsgcmV0dXJuIE9MRFRMUzsJfQorKD9pOiJTQ1RQX3N0cmVhbXMiKQl7IHJldHVybiBTQ1RQU1RSRUFNUzsJfQorKD9pOiJBcHBTZXJ2VGhyZWFkcyIpCXsgcmV0dXJuIEFQUFNFUlZUSFJFQURTO30KKyg/aToiTGlzdGVuT24iKQkJeyByZXR1cm4gTElTVEVOT047CX0KKyg/aToiVGhyZWFkc1BlclNlcnZlciIpCXsgcmV0dXJuIFRIUlBFUlNSVjsJfQorKD9pOiJUY1RpbWVyIikJCXsgcmV0dXJuIFRDVElNRVI7CX0KKyg/aToiVHdUaW1lciIpCQl7IHJldHVybiBUV1RJTUVSOwl9CisoP2k6Ik5vUmVsYXkiKQkJeyByZXR1cm4gTk9SRUxBWTsJfQorKD9pOiJMb2FkRXh0ZW5zaW9uIikJeyByZXR1cm4gTE9BREVYVDsJfQorKD9pOiJDb25uZWN0UGVlciIpCXsgcmV0dXJuIENPTk5QRUVSOwl9CisoP2k6IkNvbm5lY3RUbyIpCXsgcmV0dXJuIENPTk5UTzsJfQorKD9pOiJOb19UTFMiKQkJeyByZXR1cm4gTk9UTFM7CQl9CisoP2k6IlRMU19DcmVkIikJCXsgcmV0dXJuIFRMU19DUkVEOwl9CisoP2k6IlRMU19DQSIpCQl7IHJldHVybiBUTFNfQ0E7CX0KKyg/aToiVExTX0NSTCIpCQl7IHJldHVybiBUTFNfQ1JMOwl9CisoP2k6IlRMU19QcmlvIikJCXsgcmV0dXJuIFRMU19QUklPOwl9CisoP2k6IlRMU19ESF9iaXRzIikJeyByZXR1cm4gVExTX0RIX0JJVFM7CX0KKyg/aToiVExTX0RIX2ZpbGUiKQl7IHJldHVybiBUTFNfREhfRklMRTsJfQorCisKKwkvKiBWYWxpZCBzaW5nbGUgY2hhcmFjdGVycyBmb3IgeXlwYXJzZSAqLworPCo+Wz0sOjt7fV0JCXsgcmV0dXJuIHl5dGV4dFswXTsgfQorCisJLyogVW5yZWNvZ25pemVkIHRva2VuICovCis8Kj5bWzphbG51bTpdXSsJCXwJLyogVGhpcyBydWxlIGlzIG9ubHkgdXNlZnVsIHRvIHByaW50IGEgY29tcGxldGUgdG9rZW4gaW4gZXJyb3IgbWVzc2FnZXMgKi8KKwkvKiBVbnJlY29nbml6ZWQgY2hhcmFjdGVyICovCis8Kj4uCQkJeworCQkJCVRSQUNFX0VSUk9SKCJVbnJlY29nbml6ZWQgdGV4dCBvbiBsaW5lICVkIGNvbCAlZDogJyVzJy4iLCB5eWxsb2MtPmZpcnN0X2xpbmUsIHl5bGxvYy0+Zmlyc3RfY29sdW1uLCB5eXRleHQpOworCQkJIAlyZXR1cm4gTEVYX0VSUk9SOyAKKwkJCX0KKworJSUKZGlmZiAtLWdpdCBhL2xpYmZkY29yZS9mZGQueSBiL2xpYmZkY29yZS9mZGQueQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzcwN2M5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZmRjb3JlL2ZkZC55CkBAIC0wLDAgKzEsNjY3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxNSwgV0lERSBQcm9qZWN0IGFuZCBOSUNUCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBXSURFIFByb2plY3Qgb3IgTklDVCBub3IgdGhlIAkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFdJREUgUHJvamVjdCBhbmQgCQkJCQkJICoKKyogICBOSUNULgkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFlhY2MgY29uZmlndXJhdGlvbiBwYXJzZXIuCisgKgorICogVGhpcyBmaWxlIGRlZmluZXMgdGhlIGdyYW1tYXIgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4KKyAqIE5vdGUgdGhhdCBlYWNoIGV4dGVuc2lvbiBoYXMgYSBzZXBhcmF0ZSBpbmRlcGVuZGFudCBjb25maWd1cmF0aW9uIGZpbGUuCisgKgorICogTm90ZSA6IFRoaXMgbW9kdWxlIGlzIE5PVCB0aHJlYWQtc2FmZS4gQWxsIHByb2Nlc3NpbmcgbXVzdCBiZSBkb25lIGZyb20gb25lIHRocmVhZCBvbmx5LgorICovCisKKy8qIEZvciBkZXZlbG9wbWVudCBvbmx5IDogKi8KKyVkZWJ1ZyAKKyVlcnJvci12ZXJib3NlCisKKyVwYXJzZS1wYXJhbSB7c3RydWN0IGZkX2NvbmZpZyAqIGNvbmZ9CisKKy8qIEtlZXAgdHJhY2sgb2YgbG9jYXRpb24gKi8KKyVsb2NhdGlvbnMgCislcHVyZS1wYXJzZXIKKworJXsKKyNpbmNsdWRlICJmZGNvcmUtaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJmZGQudGFiLmgiCS8qIGJ1ZyA6IGJpc29uIGRvZXMgbm90IGRlZmluZSB0aGUgWVlMVFlQRSBiZWZvcmUgaW5jbHVkaW5nIHRoaXMgYmxvYywgc28uLi4gKi8KKworLyogVGhlIExleCBwYXJzZXIgcHJvdG90eXBlICovCitpbnQgZmRkbGV4KFlZU1RZUEUgKmx2YWxwLCBZWUxUWVBFICpsbG9jcCk7CisKKy8qIEZ1bmN0aW9uIHRvIHJlcG9ydCBlcnJvciAqLwordm9pZCB5eWVycm9yIChZWUxUWVBFICpwbG9jLCBzdHJ1Y3QgZmRfY29uZmlnICogY29uZiwgY2hhciBjb25zdCAqcykKK3sKKwlpZiAocGxvYy0+Zmlyc3RfbGluZSAhPSBwbG9jLT5sYXN0X2xpbmUpIHsKKwkJVFJBQ0VfRVJST1IoIiVzOiVkLiVkLSVkLiVkIDogJXMiLCBjb25mLT5jbmZfZmlsZSwgcGxvYy0+Zmlyc3RfbGluZSwgcGxvYy0+Zmlyc3RfY29sdW1uLCBwbG9jLT5sYXN0X2xpbmUsIHBsb2MtPmxhc3RfY29sdW1uLCBzKTsKKwl9IGVsc2UgaWYgKHBsb2MtPmZpcnN0X2NvbHVtbiAhPSBwbG9jLT5sYXN0X2NvbHVtbikgeworCQlUUkFDRV9FUlJPUigiJXM6JWQuJWQtJWQgOiAlcyIsIGNvbmYtPmNuZl9maWxlLCBwbG9jLT5maXJzdF9saW5lLCBwbG9jLT5maXJzdF9jb2x1bW4sIHBsb2MtPmxhc3RfY29sdW1uLCBzKTsKKwl9IGVsc2UgeworCQlUUkFDRV9FUlJPUigiJXM6JWQuJWQgOiAlcyIsIGNvbmYtPmNuZl9maWxlLCBwbG9jLT5maXJzdF9saW5lLCBwbG9jLT5maXJzdF9jb2x1bW4sIHMpOworCX0KK30KKworaW50IGdvdF9wZWVyX25vaXAgPSAwOworaW50IGdvdF9wZWVyX25vaXB2NiA9IDA7CitpbnQgZ290X3BlZXJfbm90Y3AgPSAwOworaW50IGdvdF9wZWVyX25vc2N0cCA9IDA7CisKK3N0cnVjdCBwZWVyX2luZm8gZmRkcGk7CisKKyV9CisKKy8qIFZhbHVlcyByZXR1cm5lZCBieSBsZXggZm9yIHRva2VuICovCisldW5pb24geworCWNoYXIgCQkgKnN0cmluZzsJLyogVGhlIHN0cmluZyBpcyBhbGxvY2F0ZWQgYnkgc3RyZHVwIGluIGxleC4qLworCWludAkJICBpbnRlZ2VyOwkvKiBTdG9yZSBpbnRlZ2VyIHZhbHVlcyAqLworfQorCisvKiBJbiBjYXNlIG9mIGVycm9yIGluIHRoZSBsZXhpY2FsIGFuYWx5c2lzICovCisldG9rZW4gCQlMRVhfRVJST1IKKworJXRva2VuIDxzdHJpbmc+CVFTVFJJTkcKKyV0b2tlbiA8aW50ZWdlcj4gSU5URUdFUgorCisldHlwZSA8c3RyaW5nPiAJZXh0Y29uZgorCisldG9rZW4JCUlERU5USVRZCisldG9rZW4JCVJFQUxNCisldG9rZW4JCVBPUlQKKyV0b2tlbgkJU0VDUE9SVAorJXRva2VuCQlTRUMzNDM2CisldG9rZW4JCU5PSVAKKyV0b2tlbgkJTk9JUDYKKyV0b2tlbgkJTk9UQ1AKKyV0b2tlbgkJTk9TQ1RQCisldG9rZW4JCVBSRUZFUlRDUAorJXRva2VuCQlPTERUTFMKKyV0b2tlbgkJTk9UTFMKKyV0b2tlbgkJU0NUUFNUUkVBTVMKKyV0b2tlbgkJQVBQU0VSVlRIUkVBRFMKKyV0b2tlbgkJTElTVEVOT04KKyV0b2tlbgkJVEhSUEVSU1JWCisldG9rZW4JCVRDVElNRVIKKyV0b2tlbgkJVFdUSU1FUgorJXRva2VuCQlOT1JFTEFZCisldG9rZW4JCUxPQURFWFQKKyV0b2tlbgkJQ09OTlBFRVIKKyV0b2tlbgkJQ09OTlRPCisldG9rZW4JCVRMU19DUkVECisldG9rZW4JCVRMU19DQQorJXRva2VuCQlUTFNfQ1JMCisldG9rZW4JCVRMU19QUklPCisldG9rZW4JCVRMU19ESF9CSVRTCisldG9rZW4JCVRMU19ESF9GSUxFCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyUlCisKKwkvKiBUaGUgZ3JhbW1hciBkZWZpbml0aW9uIC0gU2VjdGlvbnMgYmxvY3MuICovCitjb25mZmlsZToJCS8qIEVtcHR5IGlzIE9LIC0tIGZvciBzaW1wbGljaXR5IGhlcmUsIHdlIHJlamVjdCBpbiBkYWVtb24gbGF0ZXIgKi8KKwkJCXwgY29uZmZpbGUgaWRlbnRpdHkKKwkJCXwgY29uZmZpbGUgcmVhbG0KKwkJCXwgY29uZmZpbGUgdGN0aW1lcgorCQkJfCBjb25mZmlsZSB0d3RpbWVyCisJCQl8IGNvbmZmaWxlIHBvcnQKKwkJCXwgY29uZmZpbGUgc2VjcG9ydAorCQkJfCBjb25mZmlsZSBzZWMzNDM2CisJCQl8IGNvbmZmaWxlIHNjdHBzdHJlYW1zCisJCQl8IGNvbmZmaWxlIGxpc3Rlbm9uCisJCQl8IGNvbmZmaWxlIHRocnBlcnNydgorCQkJfCBjb25mZmlsZSBub3JlbGF5CisJCQl8IGNvbmZmaWxlIGFwcHNlcnZ0aHJlYWRzCisJCQl8IGNvbmZmaWxlIG5vaXAKKwkJCXwgY29uZmZpbGUgbm9pcDYKKwkJCXwgY29uZmZpbGUgbm90Y3AKKwkJCXwgY29uZmZpbGUgbm9zY3RwCisJCQl8IGNvbmZmaWxlIHByZWZlcnRjcAorCQkJfCBjb25mZmlsZSBvbGR0bHMKKwkJCXwgY29uZmZpbGUgbG9hZGV4dAorCQkJfCBjb25mZmlsZSBjb25ucGVlcgorCQkJfCBjb25mZmlsZSB0bHNfY3JlZAorCQkJfCBjb25mZmlsZSB0bHNfY2EKKwkJCXwgY29uZmZpbGUgdGxzX2NybAorCQkJfCBjb25mZmlsZSB0bHNfcHJpbworCQkJfCBjb25mZmlsZSB0bHNfZGgKKwkJCXwgY29uZmZpbGUgZXJyb3JzCisJCQl7CisJCQkJeXllcnJvcigmeXlsbG9jLCBjb25mLCAiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcGFyc2luZyB0aGUgY29uZmlndXJhdGlvbiBmaWxlIik7CisJCQkJcmV0dXJuIEVJTlZBTDsKKwkJCX0KKwkJCTsKKworCQkJLyogTGV4aWNhbCBvciBzeW50YXggZXJyb3IgKi8KK2Vycm9yczoJCQlMRVhfRVJST1IKKwkJCXwgZXJyb3IKKwkJCTsKKworaWRlbnRpdHk6CQlJREVOVElUWSAnPScgUVNUUklORyAnOycKKwkJCXsKKwkJCQljb25mLT5jbmZfZGlhbWlkID0gJDM7CisJCQl9CisJCQk7CisKK3JlYWxtOgkJCVJFQUxNICc9JyBRU1RSSU5HICc7JworCQkJeworCQkJCWNvbmYtPmNuZl9kaWFtcmxtID0gJDM7CisJCQl9CisJCQk7CisKK3RjdGltZXI6CQlUQ1RJTUVSICc9JyBJTlRFR0VSICc7JworCQkJeworCQkJCUNIRUNLX1BBUkFNU19ETyggKCQzID4gMCksCisJCQkJCXsgeXllcnJvciAoJnl5bGxvYywgY29uZiwgIkludmFsaWQgdmFsdWUiKTsgWVlFUlJPUjsgfSApOworCQkJCWNvbmYtPmNuZl90aW1lcl90YyA9ICh1bnNpZ25lZCBpbnQpJDM7CisJCQl9CisJCQk7CisKK3R3dGltZXI6CQlUV1RJTUVSICc9JyBJTlRFR0VSICc7JworCQkJeworCQkJCUNIRUNLX1BBUkFNU19ETyggKCQzID4gNSksCisJCQkJCXsgeXllcnJvciAoJnl5bGxvYywgY29uZiwgIkludmFsaWQgdmFsdWUiKTsgWVlFUlJPUjsgfSApOworCQkJCWNvbmYtPmNuZl90aW1lcl90dyA9ICh1bnNpZ25lZCBpbnQpJDM7CisJCQl9CisJCQk7CisKK3BvcnQ6CQkJUE9SVCAnPScgSU5URUdFUiAnOycKKwkJCXsKKwkJCQlDSEVDS19QQVJBTVNfRE8oICgkMyA+PSAwKSAmJiAoJDMgPCAxPDwxNiksCisJCQkJCXsgeXllcnJvciAoJnl5bGxvYywgY29uZiwgIkludmFsaWQgdmFsdWUiKTsgWVlFUlJPUjsgfSApOworCQkJCWNvbmYtPmNuZl9wb3J0ID0gKHVpbnQxNl90KSQzOworCQkJfQorCQkJOworCitzZWNwb3J0OgkJU0VDUE9SVCAnPScgSU5URUdFUiAnOycKKwkJCXsKKwkJCQlDSEVDS19QQVJBTVNfRE8oICgkMyA+PSAwKSAmJiAoJDMgPCAxPDwxNiksCisJCQkJCXsgeXllcnJvciAoJnl5bGxvYywgY29uZiwgIkludmFsaWQgdmFsdWUiKTsgWVlFUlJPUjsgfSApOworCQkJCWNvbmYtPmNuZl9wb3J0X3RscyA9ICh1aW50MTZfdCkkMzsKKwkJCX0KKwkJCTsKKworc2VjMzQzNjoJCVNFQzM0MzYgJz0nIElOVEVHRVIgJzsnCisJCQl7CisJCQkJQ0hFQ0tfUEFSQU1TX0RPKCAoJDMgPj0gMCkgJiYgKCQzIDwgMTw8MTYpLAorCQkJCQl7IHl5ZXJyb3IgKCZ5eWxsb2MsIGNvbmYsICJJbnZhbGlkIHZhbHVlIik7IFlZRVJST1I7IH0gKTsKKwkJCQljb25mLT5jbmZfcG9ydF8zNDM2ID0gKHVpbnQxNl90KSQzOworCQkJfQorCQkJOworCitzY3Rwc3RyZWFtczoJCVNDVFBTVFJFQU1TICc9JyBJTlRFR0VSICc7JworCQkJeworCQkJCUNIRUNLX1BBUkFNU19ETyggKCQzID4gMCkgJiYgKCQzIDwgMTw8MTYpLAorCQkJCQl7IHl5ZXJyb3IgKCZ5eWxsb2MsIGNvbmYsICJJbnZhbGlkIHZhbHVlIik7IFlZRVJST1I7IH0gKTsKKwkJCQljb25mLT5jbmZfc2N0cF9zdHIgPSAodWludDE2X3QpJDM7CisJCQl9CisJCQk7CisKK2xpc3Rlbm9uOgkJTElTVEVOT04gJz0nIFFTVFJJTkcgJzsnCisJCQl7CisJCQkJc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqYWk7CisJCQkJaW50IHJldDsKKwkJCQkKKwkJCQltZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKKwkJCQloaW50cy5haV9mbGFncyA9IEFJX1BBU1NJVkUgfCBBSV9OVU1FUklDSE9TVDsKKwkJCQlyZXQgPSBnZXRhZGRyaW5mbygkMywgTlVMTCwgJmhpbnRzLCAmYWkpOworCQkJCWlmIChyZXQpIHsgeXllcnJvciAoJnl5bGxvYywgY29uZiwgZ2FpX3N0cmVycm9yKHJldCkpOyBZWUVSUk9SOyB9CisJCQkJQ0hFQ0tfRkNUX0RPKCBmZF9lcF9hZGRfbWVyZ2UoICZjb25mLT5jbmZfZW5kcG9pbnRzLCBhaS0+YWlfYWRkciwgYWktPmFpX2FkZHJsZW4sIEVQX0ZMX0NPTkYgKSwgWVlFUlJPUiApOworCQkJCWZyZWVhZGRyaW5mbyhhaSk7CisJCQkJZnJlZSgkMyk7CisJCQl9CisJCQk7CisKK3RocnBlcnNydjoJCVRIUlBFUlNSViAnPScgSU5URUdFUiAnOycKKwkJCXsKKwkJCQlDSEVDS19QQVJBTVNfRE8oICgkMyA+IDApLAorCQkJCQl7IHl5ZXJyb3IgKCZ5eWxsb2MsIGNvbmYsICJJbnZhbGlkIHZhbHVlIik7IFlZRVJST1I7IH0gKTsKKwkJCQljb25mLT5jbmZfdGhyX3NydiA9ICQzOworCQkJfQorCQkJOworCitub3JlbGF5OgkJTk9SRUxBWSAnOycKKwkJCXsKKwkJCQljb25mLT5jbmZfZmxhZ3Mubm9fZndkID0gMTsKKwkJCX0KKwkJCTsKKworYXBwc2VydnRocmVhZHM6CQlBUFBTRVJWVEhSRUFEUyAnPScgSU5URUdFUiAnOycKKwkJCXsKKwkJCQlDSEVDS19QQVJBTVNfRE8oICgkMyA+IDApICYmICgkMyA8IDI1NiksCisJCQkJCXsgeXllcnJvciAoJnl5bGxvYywgY29uZiwgIkludmFsaWQgdmFsdWUiKTsgWVlFUlJPUjsgfSApOworCQkJCWNvbmYtPmNuZl9kaXNwdGhyID0gKHVpbnQxNl90KSQzOworCQkJfQorCQkJOworCitub2lwOgkJCU5PSVAgJzsnCisJCQl7CisJCQkJaWYgKGdvdF9wZWVyX25vaXB2NikgeyAKKwkJCQkJeXllcnJvciAoJnl5bGxvYywgY29uZiwgIk5vX0lQIGNvbmZsaWN0cyB3aXRoIGEgQ29ubmVjdFBlZXIgZGlyZWN0aXZlIE5vX0lQdjYuIik7IAorCQkJCQlZWUVSUk9SOyAKKwkJCQl9CisJCQkJY29uZi0+Y25mX2ZsYWdzLm5vX2lwNCA9IDE7CisJCQl9CisJCQk7CisKK25vaXA2OgkJCU5PSVA2ICc7JworCQkJeworCQkJCWlmIChnb3RfcGVlcl9ub2lwKSB7IAorCQkJCQl5eWVycm9yICgmeXlsbG9jLCBjb25mLCAiTm9fSVAgY29uZmxpY3RzIHdpdGggYSBDb25uZWN0UGVlciBkaXJlY3RpdmUgTm9fSVAuIik7IAorCQkJCQlZWUVSUk9SOyAKKwkJCQl9CisJCQkJY29uZi0+Y25mX2ZsYWdzLm5vX2lwNiA9IDE7CisJCQl9CisJCQk7CisKK25vdGNwOgkJCU5PVENQICc7JworCQkJeworCQkJCSNpZmRlZiBESVNBQkxFX1NDVFAKKwkJCQl5eWVycm9yICgmeXlsbG9jLCBjb25mLCAiTm9fVENQIGNhbm5vdCBiZSBzcGVjaWZpZWQgZm9yIGRhZW1vbiBjb21waWxlZCB3aXRoIERJU0FCTEVfU0NUUCBvcHRpb24uIik7IAorCQkJCVlZRVJST1I7IAorCQkJCSNlbmRpZgorCQkJCWlmIChjb25mLT5jbmZfZmxhZ3Mubm9fc2N0cCkKKwkJCQl7CisJCQkJCXl5ZXJyb3IgKCZ5eWxsb2MsIGNvbmYsICJOb19UQ1AgY29uZmxpY3RzIHdpdGggTm9fU0NUUCBkaXJlY3RpdmUuIiApOyAKKwkJCQkJWVlFUlJPUjsgCisJCQkJfQorCQkJCWlmIChnb3RfcGVlcl9ub3NjdHApIHsgCisJCQkJCXl5ZXJyb3IgKCZ5eWxsb2MsIGNvbmYsICJOb19UQ1AgY29uZmxpY3RzIHdpdGggYSBDb25uZWN0UGVlciBkaXJlY3RpdmUgTm9fU0NUUC4iKTsgCisJCQkJCVlZRVJST1I7IAorCQkJCX0KKwkJCQljb25mLT5jbmZfZmxhZ3Mubm9fdGNwID0gMTsKKwkJCX0KKwkJCTsKKworbm9zY3RwOgkJCU5PU0NUUCAnOycKKwkJCXsKKwkJCQlpZiAoY29uZi0+Y25mX2ZsYWdzLm5vX3RjcCkKKwkJCQl7CisJCQkJCXl5ZXJyb3IgKCZ5eWxsb2MsIGNvbmYsICJOb19TQ1RQIGNvbmZsaWN0cyB3aXRoIE5vX1RDUCBkaXJlY3RpdmUuIiApOyAKKwkJCQkJWVlFUlJPUjsgCisJCQkJfQorCQkJCWlmIChnb3RfcGVlcl9ub3RjcCkgeyAKKwkJCQkJeXllcnJvciAoJnl5bGxvYywgY29uZiwgIk5vX1NDVFAgY29uZmxpY3RzIHdpdGggYSBDb25uZWN0UGVlciBkaXJlY3RpdmUgTm9fVENQLiIpOworCQkJCQlZWUVSUk9SOworCQkJCX0KKwkJCQljb25mLT5jbmZfZmxhZ3Mubm9fc2N0cCA9IDE7CisJCQl9CisJCQk7CisKK3ByZWZlcnRjcDoJCVBSRUZFUlRDUCAnOycKKwkJCXsKKwkJCQljb25mLT5jbmZfZmxhZ3MucHJfdGNwID0gMTsKKwkJCX0KKwkJCTsKKworb2xkdGxzOgkJCU9MRFRMUyAnOycKKwkJCXsKKwkJCQljb25mLT5jbmZfZmxhZ3MudGxzX2FsZyA9IDE7CisJCQl9CisJCQk7CisKK2xvYWRleHQ6CQlMT0FERVhUICc9JyBRU1RSSU5HIGV4dGNvbmYgJzsnCisJCQl7CisJCQkJY2hhciAqIGZuYW1lOworCQkJCWNoYXIgKiBjZm5hbWU7CisJCQkJRklMRSAqIGZkOworCQkJCQorCQkJCS8qIFRyeSBhbmQgb3BlbiB0aGUgZXh0ZW5zaW9uIGZpbGUgKi8KKwkJCQlmbmFtZSA9ICQzOworCQkJCWZkID0gZm9wZW4oZm5hbWUsICJyIik7CisJCQkJaWYgKChmZCA9PSBOVUxMKSAmJiAoKmZuYW1lICE9ICcvJykpIHsKKwkJCQkJY2hhciAqIGJrcCA9IGZuYW1lOworCQkJCQlDSEVDS19NQUxMT0NfRE8oIGZuYW1lID0gbWFsbG9jKCBzdHJsZW4oYmtwKSArIHN0cmxlbihERUZBVUxUX0VYVEVOU0lPTlNfUEFUSCkgKyAyICksCisJCQkJCQl7IHl5ZXJyb3IgKCZ5eWxsb2MsIGNvbmYsICJOb3QgZW5vdWdoIG1lbW9yeSIpOyBZWUVSUk9SOyB9ICk7CisJCQkJCXNwcmludGYoZm5hbWUsIERFRkFVTFRfRVhURU5TSU9OU19QQVRIICIvJXMiLCBia3ApOworCQkJCQlmZCA9IGZvcGVuKGZuYW1lLCAiciIpOworCQkJCQlpZiAoZmQgPT0gTlVMTCkgeworCQkJCQkJZnJlZShmbmFtZSk7CisJCQkJCQlmbmFtZSA9IGJrcDsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWZyZWUoYmtwKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAoZmQgIT0gTlVMTCkgeworCQkJCQlmY2xvc2UoZmQpOworCQkJCX0gLyogb3RoZXJ3aXNlLCBMRF9MSUJSQVJZX1BBVEggd2lsbCBiZSB0ZXN0ZWQgYnkgZGxfb3Blbi4gCisJCQkJVGhpcyBzaG91bGQgbm90IGdpdmUgYW55IHNlY3VyaXR5IGlzc3VlLCBvdGhlcndpc2Ugd2UgY2FuIGFkZCBhbiAiZWxzZSBmYWlsIiBoZXJlLiAqLworCQkJCQorCQkJCS8qIFRyeSBhbmQgb3BlbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlIChvcHRpb25hbCkgKi8KKwkJCQljZm5hbWUgPSAkNDsKKwkJCQlpZiAoY2ZuYW1lKSB7CisJCQkJCWZkID0gZm9wZW4oY2ZuYW1lLCAiciIpOworCQkJCQlpZiAoKGZkID09IE5VTEwpICYmICgqY2ZuYW1lICE9ICcvJykpIHsKKwkJCQkJCWNoYXIgKiB0ZXN0OworCQkJCQkJQ0hFQ0tfTUFMTE9DX0RPKCB0ZXN0ID0gbWFsbG9jKCBzdHJsZW4oY2ZuYW1lKSArIHN0cmxlbihERUZBVUxUX0NPTkZfUEFUSCkgKyAyICksCisJCQkJCQkJeyB5eWVycm9yICgmeXlsbG9jLCBjb25mLCAiTm90IGVub3VnaCBtZW1vcnkiKTsgWVlFUlJPUjsgfSApOworCQkJCQkJc3ByaW50Zih0ZXN0LCBERUZBVUxUX0NPTkZfUEFUSCAiLyVzIiwgY2ZuYW1lKTsKKwkJCQkJCWZkID0gZm9wZW4odGVzdCwgInIiKTsKKwkJCQkJCWlmIChmZCkgeworCQkJCQkJCWZyZWUoY2ZuYW1lKTsKKwkJCQkJCQljZm5hbWU9dGVzdDsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJLyogVGhpcyBpcyBub3QgYW4gZXJyb3IsIHdlIGFsbG93IGFuIGV4dGVuc2lvbiB0byB3YWl0IGZvciBzb21ldGhpbmcgZWxzZSB0aGFuIGEgcmVhbCBjb25mIGZpbGUuICovCisJCQkJCQkJZnJlZSh0ZXN0KTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlpZiAoZmQpCisJCQkJCQlmY2xvc2UoZmQpOworCQkJCX0KKwkJCQkKKwkJCQlDSEVDS19GQ1RfRE8oIGZkX2V4dF9hZGQoIGZuYW1lLCBjZm5hbWUgKSwKKwkJCQkJeyB5eWVycm9yICgmeXlsbG9jLCBjb25mLCAiRXJyb3IgYWRkaW5nIGV4dGVuc2lvbiIpOyBZWUVSUk9SOyB9ICk7CisJCQl9CisJCQk7CisJCQkKK2V4dGNvbmY6CQkvKiBlbXB0eSAqLworCQkJeworCQkJCSQkID0gTlVMTDsKKwkJCX0KKwkJCXwgJzonIFFTVFJJTkcKKwkJCXsKKwkJCQkkJCA9ICQyOworCQkJfQorCQkJOworCQkJCitjb25ucGVlcjoJCXsKKwkJCQltZW1zZXQoJmZkZHBpLCAwLCBzaXplb2YoZmRkcGkpKTsKKwkJCQlmZGRwaS5jb25maWcucGljX2ZsYWdzLnBlcnNpc3QgPSBQSV9QUlNUX0FMV0FZUzsKKwkJCQlmZF9saXN0X2luaXQoICZmZGRwaS5waV9lbmRwb2ludHMsIE5VTEwgKTsKKwkJCX0KKwkJCUNPTk5QRUVSICc9JyBRU1RSSU5HIHBlZXJpbmZvICc7JworCQkJeworCQkJCWZkZHBpLnBpX2RpYW1pZCA9ICQ0OworCQkJCUNIRUNLX0ZDVF9ETyggZmRfcGVlcl9hZGQgKCAmZmRkcGksIGNvbmYtPmNuZl9maWxlLCBOVUxMLCBOVUxMICksCisJCQkJCXsgeXllcnJvciAoJnl5bGxvYywgY29uZiwgIkVycm9yIGFkZGluZyBDb25uZWN0UGVlciBpbmZvcm1hdGlvbiIpOyBZWUVSUk9SOyB9ICk7CisJCQkJCQorCQkJCS8qIE5vdyBkZXN0cm95IGFueSBjb250ZW50IGluIHRoZSBzdHJ1Y3R1cmUgKi8KKwkJCQlmcmVlKGZkZHBpLnBpX2RpYW1pZCk7CisJCQkJZnJlZShmZGRwaS5jb25maWcucGljX3JlYWxtKTsKKwkJCQlmcmVlKGZkZHBpLmNvbmZpZy5waWNfcHJpb3JpdHkpOworCQkJCXdoaWxlICghRkRfSVNfTElTVF9FTVBUWSgmZmRkcGkucGlfZW5kcG9pbnRzKSkgeworCQkJCQlzdHJ1Y3QgZmRfbGlzdCAqIGxpID0gZmRkcGkucGlfZW5kcG9pbnRzLm5leHQ7CisJCQkJCWZkX2xpc3RfdW5saW5rKGxpKTsKKwkJCQkJZnJlZShsaSk7CisJCQkJfQorCQkJfQorCQkJOworCQkJCitwZWVyaW5mbzoJCS8qIGVtcHR5ICovCisJCQl8ICd7JyBwZWVycGFyYW1zICd9JworCQkJOworCQkJCitwZWVycGFyYW1zOgkJLyogZW1wdHkgKi8KKwkJCXwgcGVlcnBhcmFtcyBOT0lQICc7JworCQkJeworCQkJCWlmICgoY29uZi0+Y25mX2ZsYWdzLm5vX2lwNikgfHwgKGZkZHBpLmNvbmZpZy5waWNfZmxhZ3MucHJvMyA9PSBQSV9QM19JUCkpIHsgCisJCQkJCXl5ZXJyb3IgKCZ5eWxsb2MsIGNvbmYsICJOb19JUCBjb25mbGljdHMgd2l0aCBhIE5vX0lQdjYgZGlyZWN0aXZlLiIpOworCQkJCQlZWUVSUk9SOworCQkJCX0KKwkJCQlnb3RfcGVlcl9ub2lwKys7CisJCQkJZmRkcGkuY29uZmlnLnBpY19mbGFncy5wcm8zID0gUElfUDNfSVB2NjsKKwkJCX0KKwkJCXwgcGVlcnBhcmFtcyBOT0lQNiAnOycKKwkJCXsKKwkJCQlpZiAoKGNvbmYtPmNuZl9mbGFncy5ub19pcDQpIHx8IChmZGRwaS5jb25maWcucGljX2ZsYWdzLnBybzMgPT0gUElfUDNfSVB2NikpIHsgCisJCQkJCXl5ZXJyb3IgKCZ5eWxsb2MsIGNvbmYsICJOb19JUHY2IGNvbmZsaWN0cyB3aXRoIGEgTm9fSVAgZGlyZWN0aXZlLiIpOworCQkJCQlZWUVSUk9SOworCQkJCX0KKwkJCQlnb3RfcGVlcl9ub2lwdjYrKzsKKwkJCQlmZGRwaS5jb25maWcucGljX2ZsYWdzLnBybzMgPSBQSV9QM19JUDsKKwkJCX0KKwkJCXwgcGVlcnBhcmFtcyBOT1RDUCAnOycKKwkJCXsKKwkJCQkjaWZkZWYgRElTQUJMRV9TQ1RQCisJCQkJCXl5ZXJyb3IgKCZ5eWxsb2MsIGNvbmYsICJOb19UQ1AgY2Fubm90IGJlIHNwZWNpZmllZCBpbiBkYWVtb24gY29tcGlsZWQgd2l0aCBESVNBQkxFX1NDVFAgb3B0aW9uLiIpOworCQkJCQlZWUVSUk9SOworCQkJCSNlbmRpZgorCQkJCWlmICgoY29uZi0+Y25mX2ZsYWdzLm5vX3NjdHApIHx8IChmZGRwaS5jb25maWcucGljX2ZsYWdzLnBybzQgPT0gUElfUDRfVENQKSkgeyAKKwkJCQkJeXllcnJvciAoJnl5bGxvYywgY29uZiwgIk5vX1RDUCBjb25mbGljdHMgd2l0aCBhIE5vX1NDVFAgZGlyZWN0aXZlLiIpOworCQkJCQlZWUVSUk9SOworCQkJCX0KKwkJCQlnb3RfcGVlcl9ub3RjcCsrOworCQkJCWZkZHBpLmNvbmZpZy5waWNfZmxhZ3MucHJvNCA9IFBJX1A0X1NDVFA7CisJCQl9CisJCQl8IHBlZXJwYXJhbXMgTk9TQ1RQICc7JworCQkJeworCQkJCWlmICgoY29uZi0+Y25mX2ZsYWdzLm5vX3RjcCkgfHwgKGZkZHBpLmNvbmZpZy5waWNfZmxhZ3MucHJvNCA9PSBQSV9QNF9TQ1RQKSkgeyAKKwkJCQkJeXllcnJvciAoJnl5bGxvYywgY29uZiwgIk5vX1NDVFAgY29uZmxpY3RzIHdpdGggYSBOb19UQ1AgZGlyZWN0aXZlLiIpOworCQkJCQlZWUVSUk9SOworCQkJCX0KKwkJCQlnb3RfcGVlcl9ub3NjdHArKzsKKwkJCQlmZGRwaS5jb25maWcucGljX2ZsYWdzLnBybzQgPSBQSV9QNF9UQ1A7CisJCQl9CisJCQl8IHBlZXJwYXJhbXMgUFJFRkVSVENQICc7JworCQkJeworCQkJCWZkZHBpLmNvbmZpZy5waWNfZmxhZ3MuYWxnID0gUElfQUxHUFJFRl9UQ1A7CisJCQl9CisJCQl8IHBlZXJwYXJhbXMgT0xEVExTICc7JworCQkJeworCQkJCWZkZHBpLmNvbmZpZy5waWNfZmxhZ3Muc2VjIHw9IFBJX1NFQ19UTFNfT0xEOworCQkJfQorCQkJfCBwZWVycGFyYW1zIE5PVExTICc7JworCQkJeworCQkJCWZkZHBpLmNvbmZpZy5waWNfZmxhZ3Muc2VjIHw9IFBJX1NFQ19OT05FOworCQkJfQorCQkJfCBwZWVycGFyYW1zIFNFQzM0MzYgJzsnCisJCQl7CisJCQkJZmRkcGkuY29uZmlnLnBpY19mbGFncy5zY3Rwc2VjIHw9IFBJX1NDVFBTRUNfMzQzNjsKKwkJCX0KKwkJCXwgcGVlcnBhcmFtcyBSRUFMTSAnPScgUVNUUklORyAnOycKKwkJCXsKKwkJCQlmZGRwaS5jb25maWcucGljX3JlYWxtID0gJDQ7CisJCQl9CisJCQl8IHBlZXJwYXJhbXMgUE9SVCAnPScgSU5URUdFUiAnOycKKwkJCXsKKwkJCQlDSEVDS19QQVJBTVNfRE8oICgkNCA+IDApICYmICgkNCA8IDE8PDE2KSwKKwkJCQkJeyB5eWVycm9yICgmeXlsbG9jLCBjb25mLCAiSW52YWxpZCBwb3J0IHZhbHVlIik7IFlZRVJST1I7IH0gKTsKKwkJCQlmZGRwaS5jb25maWcucGljX3BvcnQgPSAodWludDE2X3QpJDQ7CisJCQl9CisJCQl8IHBlZXJwYXJhbXMgVENUSU1FUiAnPScgSU5URUdFUiAnOycKKwkJCXsKKwkJCQlmZGRwaS5jb25maWcucGljX3RjdGltZXIgPSAkNDsKKwkJCX0KKwkJCXwgcGVlcnBhcmFtcyBUV1RJTUVSICc9JyBJTlRFR0VSICc7JworCQkJeworCQkJCWZkZHBpLmNvbmZpZy5waWNfdHd0aW1lciA9ICQ0OworCQkJfQorCQkJfCBwZWVycGFyYW1zIFRMU19QUklPICc9JyBRU1RSSU5HICc7JworCQkJeworCQkJCWZkZHBpLmNvbmZpZy5waWNfcHJpb3JpdHkgPSAkNDsKKwkJCX0KKwkJCXwgcGVlcnBhcmFtcyBDT05OVE8gJz0nIFFTVFJJTkcgJzsnCisJCQl7CisJCQkJc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqYWk7CisJCQkJaW50IHJldDsKKwkJCQlpbnQgZGlzYyA9IDA7CisJCQkJCisJCQkJbWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7CisJCQkJaGludHMuYWlfZmxhZ3MgPSBBSV9BRERSQ09ORklHIHwgQUlfTlVNRVJJQ0hPU1Q7CisJCQkJcmV0ID0gZ2V0YWRkcmluZm8oJDQsIE5VTEwsICZoaW50cywgJmFpKTsKKwkJCQlpZiAocmV0ID09IEVBSV9OT05BTUUpIHsKKwkJCQkJLyogVGhlIG5hbWUgd2FzIG1heWJlIG5vdCBudW1lcmljLCB0cnkgYWdhaW4gKi8KKwkJCQkJZGlzYyA9IEVQX0ZMX0RJU0M7CisJCQkJCWhpbnRzLmFpX2ZsYWdzICY9IH4gQUlfTlVNRVJJQ0hPU1Q7CisJCQkJCXJldCA9IGdldGFkZHJpbmZvKCQ0LCBOVUxMLCAmaGludHMsICZhaSk7CisJCQkJfQorCQkJCWlmIChyZXQpIHsgeXllcnJvciAoJnl5bGxvYywgY29uZiwgZ2FpX3N0cmVycm9yKHJldCkpOyBZWUVSUk9SOyB9CisJCQkJCisJCQkJQ0hFQ0tfRkNUX0RPKCBmZF9lcF9hZGRfbWVyZ2UoICZmZGRwaS5waV9lbmRwb2ludHMsIGFpLT5haV9hZGRyLCBhaS0+YWlfYWRkcmxlbiwgRVBfRkxfQ09ORiB8IChkaXNjID86IEVQX0FDQ0VQVEFMTCkgKSwgWVlFUlJPUiApOworCQkJCWZyZWUoJDQpOworCQkJCWZyZWVhZGRyaW5mbyhhaSk7CisJCQl9CisJCQk7CisKK3Rsc19jcmVkOgkJVExTX0NSRUQgJz0nIFFTVFJJTkcgJywnIFFTVFJJTkcgJzsnCisJCQl7CisJCQkJRklMRSAqIGZkOworCQkJCWZkID0gZm9wZW4oJDMsICJyIik7CisJCQkJaWYgKGZkID09IE5VTEwpIHsKKwkJCQkJaW50IHJldCA9IGVycm5vOworCQkJCQlUUkFDRV9FUlJPUigiVW5hYmxlIHRvIG9wZW4gY2VydGlmaWNhdGUgZmlsZSAlcyBmb3IgcmVhZGluZzogJXMiLCAkMywgc3RyZXJyb3IocmV0KSk7CisJCQkJCXl5ZXJyb3IgKCZ5eWxsb2MsIGNvbmYsICJFcnJvciBvbiBmaWxlIG5hbWUiKTsgCisJCQkJCVlZRVJST1I7CisJCQkJfQorCQkJCWZjbG9zZShmZCk7CisJCQkJZmQgPSBmb3BlbigkNSwgInIiKTsKKwkJCQlpZiAoZmQgPT0gTlVMTCkgeworCQkJCQlpbnQgcmV0ID0gZXJybm87CisJCQkJCVRSQUNFX0VSUk9SKCJVbmFibGUgdG8gb3BlbiBwcml2YXRlIGtleSBmaWxlICVzIGZvciByZWFkaW5nOiAlcyIsICQ1LCBzdHJlcnJvcihyZXQpKTsKKwkJCQkJeXllcnJvciAoJnl5bGxvYywgY29uZiwgIkVycm9yIG9uIGZpbGUgbmFtZSIpOyAKKwkJCQkJWVlFUlJPUjsKKwkJCQl9CisJCQkJZmNsb3NlKGZkKTsKKwkJCQljb25mLT5jbmZfc2VjX2RhdGEuY2VydF9maWxlID0gJDM7CisJCQkJY29uZi0+Y25mX3NlY19kYXRhLmtleV9maWxlID0gJDU7CisJCQkJCisJCQkJQ0hFQ0tfR05VVExTX0RPKCBnbnV0bHNfY2VydGlmaWNhdGVfc2V0X3g1MDlfa2V5X2ZpbGUoIAorCQkJCQkJCWNvbmYtPmNuZl9zZWNfZGF0YS5jcmVkZW50aWFscywKKwkJCQkJCQljb25mLT5jbmZfc2VjX2RhdGEuY2VydF9maWxlLAorCQkJCQkJCWNvbmYtPmNuZl9zZWNfZGF0YS5rZXlfZmlsZSwKKwkJCQkJCQlHTlVUTFNfWDUwOV9GTVRfUEVNKSwKKwkJCQkJCXsgeXllcnJvciAoJnl5bGxvYywgY29uZiwgIkVycm9yIG9wZW5pbmcgY2VydGlmaWNhdGUgb3IgcHJpdmF0ZSBrZXkgZmlsZS4iKTsgWVlFUlJPUjsgfSApOworCQkJfQorCQkJOworCit0bHNfY2E6CQkJVExTX0NBICc9JyBRU1RSSU5HICc7JworCQkJeworCQkJCUZJTEUgKiBmZDsKKwkJCQlmZCA9IGZvcGVuKCQzLCAicmIiKTsKKwkJCQlpZiAoZmQgPT0gTlVMTCkgeworCQkJCQlpbnQgcmV0ID0gZXJybm87CisJCQkJCVRSQUNFX0VSUk9SKCJVbmFibGUgdG8gb3BlbiBDQSBmaWxlICVzIGZvciByZWFkaW5nOiAlcyIsICQzLCBzdHJlcnJvcihyZXQpKTsKKwkJCQkJeXllcnJvciAoJnl5bGxvYywgY29uZiwgIkVycm9yIG9uIGZpbGUgbmFtZSIpOyAKKwkJCQkJWVlFUlJPUjsKKwkJCQl9CisJCQkJI2lmZGVmIEdOVVRMU19WRVJTSU9OXzMwMAorCQkJCXsKKwkJCQkJLyogV2UgaW1wb3J0IHRoZXNlIENBIGluIHRoZSB0cnVzdCBsaXN0ICovCisJCQkJCWdudXRsc194NTA5X2NydF90ICogY2FsaXN0OworCQkJCQl1bnNpZ25lZCBpbnQgY2Fjb3VudDsKKwkJCQkJZ251dGxzX2RhdHVtX3QgY2FmaWxlOworCQkJCQkKKwkJCQkJQ0hFQ0tfRkNUX0RPKCBmZF9jb25mX3N0cmVhbV90b19nbnV0bHNfZGF0dW0oZmQsICZjYWZpbGUpLCAKKwkJCQkJCQl7IHl5ZXJyb3IgKCZ5eWxsb2MsIGNvbmYsICJFcnJvciByZWFkaW5nIENBIGZpbGUuIik7IFlZRVJST1I7IH0gKTsKKwkJCQkJCQkKKwkJCQkJQ0hFQ0tfR05VVExTX0RPKCBnbnV0bHNfeDUwOV9jcnRfbGlzdF9pbXBvcnQyKCZjYWxpc3QsICZjYWNvdW50LCAmY2FmaWxlLCBHTlVUTFNfWDUwOV9GTVRfUEVNLCAKKwkJCQkJCQkJCQlHTlVUTFNfWDUwOV9DUlRfTElTVF9GQUlMX0lGX1VOU09SVEVEKSwKKwkJCQkJCQl7IHl5ZXJyb3IgKCZ5eWxsb2MsIGNvbmYsICJFcnJvciBpbXBvcnRpbmcgQ0EgZmlsZS4iKTsgWVlFUlJPUjsgfSApOworCQkJCQlmcmVlKGNhZmlsZS5kYXRhKTsKKwkJCQkJCisJCQkJCUNIRUNLX0dOVVRMU19ETyggZ251dGxzX3g1MDlfdHJ1c3RfbGlzdF9hZGRfY2FzIChmZF9nX2NvbmZpZy0+Y25mX3NlY19kYXRhLnRydXN0bGlzdCwgY2FsaXN0LCBjYWNvdW50LCAwKSwKKwkJCQkJCQl7IHl5ZXJyb3IgKCZ5eWxsb2MsIGNvbmYsICJFcnJvciBzYXZpbmcgQ0EgaW4gdHJ1c3QgbGlzdC4iKTsgWVlFUlJPUjsgfSApOworCQkJCX0KKwkJCQkjZW5kaWYgLyogR05VVExTX1ZFUlNJT05fMzAwICovCisJCQkJZmNsb3NlKGZkKTsKKwkJCQljb25mLT5jbmZfc2VjX2RhdGEuY2FfZmlsZSA9ICQzOworCQkJCUNIRUNLX0dOVVRMU19ETyggY29uZi0+Y25mX3NlY19kYXRhLmNhX2ZpbGVfbnIgKz0gZ251dGxzX2NlcnRpZmljYXRlX3NldF94NTA5X3RydXN0X2ZpbGUoIAorCQkJCQkJCWNvbmYtPmNuZl9zZWNfZGF0YS5jcmVkZW50aWFscywKKwkJCQkJCQljb25mLT5jbmZfc2VjX2RhdGEuY2FfZmlsZSwKKwkJCQkJCQlHTlVUTFNfWDUwOV9GTVRfUEVNKSwKKwkJCQkJCXsgeXllcnJvciAoJnl5bGxvYywgY29uZiwgIkVycm9yIHNldHRpbmcgQ0EgcGFyYW1ldGVycy4iKTsgWVlFUlJPUjsgfSApOworCQkJCQkJCisJCQl9CisJCQk7CisJCQkKK3Rsc19jcmw6CQlUTFNfQ1JMICc9JyBRU1RSSU5HICc7JworCQkJeworCQkJCUZJTEUgKiBmZDsKKwkJCQlmZCA9IGZvcGVuKCQzLCAicmIiKTsKKwkJCQlpZiAoZmQgPT0gTlVMTCkgeworCQkJCQlpbnQgcmV0ID0gZXJybm87CisJCQkJCVRSQUNFX0VSUk9SKCJVbmFibGUgdG8gb3BlbiBDUkwgZmlsZSAlcyBmb3IgcmVhZGluZzogJXMiLCAkMywgc3RyZXJyb3IocmV0KSk7CisJCQkJCXl5ZXJyb3IgKCZ5eWxsb2MsIGNvbmYsICJFcnJvciBvbiBmaWxlIG5hbWUiKTsgCisJCQkJCVlZRVJST1I7CisJCQkJfQorCQkJCSNpZmRlZiBHTlVUTFNfVkVSU0lPTl8zMDAKKwkJCQl7CisJCQkJCS8qIFdlIGltcG9ydCB0aGVzZSBDUkwgaW4gdGhlIHRydXN0IGxpc3QgKi8KKwkJCQkJZ251dGxzX3g1MDlfY3JsX3QgKiBjcmxsaXN0OworCQkJCQl1bnNpZ25lZCBpbnQgY3JsY291bnQ7CisJCQkJCWdudXRsc19kYXR1bV90IGNybGZpbGU7CisJCQkJCQorCQkJCQlDSEVDS19GQ1RfRE8oIGZkX2NvbmZfc3RyZWFtX3RvX2dudXRsc19kYXR1bShmZCwgJmNybGZpbGUpLCAKKwkJCQkJCQl7IHl5ZXJyb3IgKCZ5eWxsb2MsIGNvbmYsICJFcnJvciByZWFkaW5nIENSTCBmaWxlLiIpOyBZWUVSUk9SOyB9ICk7CisJCQkJCQkJCisJCQkJCUNIRUNLX0dOVVRMU19ETyggZ251dGxzX3g1MDlfY3JsX2xpc3RfaW1wb3J0MigmY3JsbGlzdCwgJmNybGNvdW50LCAmY3JsZmlsZSwgR05VVExTX1g1MDlfRk1UX1BFTSwgMCksCisJCQkJCQkJeyB5eWVycm9yICgmeXlsbG9jLCBjb25mLCAiRXJyb3IgaW1wb3J0aW5nIENSTCBmaWxlLiIpOyBZWUVSUk9SOyB9ICk7CisJCQkJCWZyZWUoY3JsZmlsZS5kYXRhKTsKKwkJCQkJCisJCQkJCUNIRUNLX0dOVVRMU19ETyggZ251dGxzX3g1MDlfdHJ1c3RfbGlzdF9hZGRfY3JscyAoZmRfZ19jb25maWctPmNuZl9zZWNfZGF0YS50cnVzdGxpc3QsIGNybGxpc3QsIGNybGNvdW50LCAKKwkJCQkJCQkJCUdOVVRMU19UTF9WRVJJRllfQ1JMLAorCQkJCQkJCQkJMCksCisJCQkJCQkJeyB5eWVycm9yICgmeXlsbG9jLCBjb25mLCAiRXJyb3IgaW1wb3J0aW5nIENSTCBpbiB0cnVzdCBsaXN0LiIpOyBZWUVSUk9SOyB9ICk7CisJCQkJfQorCQkJCSNlbmRpZiAvKiBHTlVUTFNfVkVSU0lPTl8zMDAgKi8KKwkJCQlmY2xvc2UoZmQpOworCQkJCWNvbmYtPmNuZl9zZWNfZGF0YS5jcmxfZmlsZSA9ICQzOworCQkJCUNIRUNLX0dOVVRMU19ETyggZ251dGxzX2NlcnRpZmljYXRlX3NldF94NTA5X2NybF9maWxlKCAKKwkJCQkJCQljb25mLT5jbmZfc2VjX2RhdGEuY3JlZGVudGlhbHMsCisJCQkJCQkJY29uZi0+Y25mX3NlY19kYXRhLmNybF9maWxlLAorCQkJCQkJCUdOVVRMU19YNTA5X0ZNVF9QRU0pLAorCQkJCQkJeyB5eWVycm9yICgmeXlsbG9jLCBjb25mLCAiRXJyb3Igc2V0dGluZyBDUkwgcGFyYW1ldGVycy4iKTsgWVlFUlJPUjsgfSApOworCQkJfQorCQkJOworCQkJCit0bHNfcHJpbzoJCVRMU19QUklPICc9JyBRU1RSSU5HICc7JworCQkJeworCQkJCWNvbnN0IGNoYXIgKiBlcnJfcG9zID0gTlVMTDsKKwkJCQljb25mLT5jbmZfc2VjX2RhdGEucHJpb19zdHJpbmcgPSAkMzsKKwkJCQlDSEVDS19HTlVUTFNfRE8oIGdudXRsc19wcmlvcml0eV9pbml0KCAKKwkJCQkJCQkmY29uZi0+Y25mX3NlY19kYXRhLnByaW9fY2FjaGUsCisJCQkJCQkJY29uZi0+Y25mX3NlY19kYXRhLnByaW9fc3RyaW5nLAorCQkJCQkJCSZlcnJfcG9zKSwKKwkJCQkJCXsgeXllcnJvciAoJnl5bGxvYywgY29uZiwgIkVycm9yIHNldHRpbmcgUHJpb3JpdHkgcGFyYW1ldGVyLiIpOworCQkJCQkJICBUUkFDRV9FUlJPUigiRXJyb3IgYXQgcG9zaXRpb24gOiAlcyIsIGVycl9wb3MpOworCQkJCQkJICBZWUVSUk9SOyB9ICk7CisJCQl9CisJCQk7CisJCQkKK3Rsc19kaDoJCQlUTFNfREhfQklUUyAnPScgSU5URUdFUiAnOycKKwkJCXsKKwkJCQljb25mLT5jbmZfc2VjX2RhdGEuZGhfYml0cyA9ICQzOworCQkJfQorCQkJfCBUTFNfREhfRklMRSAnPScgUVNUUklORyAnOycKKwkJCXsKKwkJCQlGSUxFICogZmQ7CisJCQkJZnJlZShjb25mLT5jbmZfc2VjX2RhdGEuZGhfZmlsZSk7CisJCQkJY29uZi0+Y25mX3NlY19kYXRhLmRoX2ZpbGUgPSAkMzsKKwkJCQlmZCA9IGZvcGVuKCQzLCAiciIpOworCQkJCWlmIChmZCA9PSBOVUxMKSB7CisJCQkJCWludCByZXQgPSBlcnJubzsKKwkJCQkJVFJBQ0VfRVJST1IoIlVuYWJsZSB0byBvcGVuIERIIGZpbGUgJXMgZm9yIHJlYWRpbmc6ICVzIiwgJDMsIHN0cmVycm9yKHJldCkpOworCQkJCQl5eWVycm9yICgmeXlsbG9jLCBjb25mLCAiRXJyb3Igb24gZmlsZSBuYW1lIik7IAorCQkJCQlZWUVSUk9SOworCQkJCX0KKwkJCQlmY2xvc2UoZmQpOworCQkJfQorCQkJOwpkaWZmIC0tZ2l0IGEvbGliZmRjb3JlL2ZpZm9fc3RhdHMuYyBiL2xpYmZkY29yZS9maWZvX3N0YXRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNmZmEwNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmZkY29yZS9maWZvX3N0YXRzLmMKQEAgLTAsMCArMSw3OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTMsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiZmRjb3JlLWludGVybmFsLmgiCisKKy8qIFNlZSBpbmNsdWRlL2ZyZWVEaWFtZXRlci9saWJmZGNvcmUuaCBmb3IgbW9yZSBpbmZvcm1hdGlvbiAqLworaW50IGZkX3N0YXRfZ2V0c3RhdHMoZW51bSBmZF9zdGF0X3R5cGUgc3RhdCwgc3RydWN0IHBlZXJfaGRyICogcGVlciwgCisJCQlpbnQgKiBjdXJyZW50X2NvdW50LCBpbnQgKiBsaW1pdF9jb3VudCwgaW50ICogaGlnaGVzdF9jb3VudCwgbG9uZyBsb25nICogdG90YWxfY291bnQsIAorCQkJc3RydWN0IHRpbWVzcGVjICogdG90YWwsIHN0cnVjdCB0aW1lc3BlYyAqIGJsb2NraW5nLCBzdHJ1Y3QgdGltZXNwZWMgKiBsYXN0KQoreworCXN0cnVjdCBmZF9wZWVyICogcCA9IChzdHJ1Y3QgZmRfcGVlciAqKXBlZXI7CisJVFJBQ0VfRU5UUlkoICIlZCAlcCAlcCAlcCAlcCAlcCAlcCAlcCAlcCIsIHN0YXQsIHBlZXIsIGN1cnJlbnRfY291bnQsIGxpbWl0X2NvdW50LCBoaWdoZXN0X2NvdW50LCB0b3RhbF9jb3VudCwgdG90YWwsIGJsb2NraW5nLCBsYXN0KTsKKwkKKwlzd2l0Y2ggKHN0YXQpIHsKKwkJY2FzZSBTVEFUX0dfTE9DQUw6IHsKKwkJCUNIRUNLX0ZDVCggZmRfZmlmb19nZXRzdGF0cyhmZF9nX2xvY2FsLCBjdXJyZW50X2NvdW50LCBsaW1pdF9jb3VudCwgaGlnaGVzdF9jb3VudCwgdG90YWxfY291bnQsIHRvdGFsLCBibG9ja2luZywgbGFzdCkgKTsKKwkJfQorCQlicmVhazsKKworCQljYXNlIFNUQVRfR19JTkNPTUlORzogeworCQkJQ0hFQ0tfRkNUKCBmZF9maWZvX2dldHN0YXRzKGZkX2dfaW5jb21pbmcsIGN1cnJlbnRfY291bnQsIGxpbWl0X2NvdW50LCBoaWdoZXN0X2NvdW50LCB0b3RhbF9jb3VudCwgdG90YWwsIGJsb2NraW5nLCBsYXN0KSApOworCQl9CisJCWJyZWFrOworCisJCWNhc2UgU1RBVF9HX09VVEdPSU5HOiB7CisJCQlDSEVDS19GQ1QoIGZkX2ZpZm9fZ2V0c3RhdHMoZmRfZ19vdXRnb2luZywgY3VycmVudF9jb3VudCwgbGltaXRfY291bnQsIGhpZ2hlc3RfY291bnQsIHRvdGFsX2NvdW50LCB0b3RhbCwgYmxvY2tpbmcsIGxhc3QpICk7CisJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSBTVEFUX1BfUFNNOiB7CisJCQlDSEVDS19QQVJBTVMoIENIRUNLX1BFRVIoIHBlZXIgKSApOworCQkJQ0hFQ0tfRkNUKCBmZF9maWZvX2dldHN0YXRzKHAtPnBfZXZlbnRzLCBjdXJyZW50X2NvdW50LCBsaW1pdF9jb3VudCwgaGlnaGVzdF9jb3VudCwgdG90YWxfY291bnQsIHRvdGFsLCBibG9ja2luZywgbGFzdCkgKTsKKwkJfQorCQlicmVhazsKKworCQljYXNlIFNUQVRfUF9UT1NFTkQ6IHsKKwkJCUNIRUNLX1BBUkFNUyggQ0hFQ0tfUEVFUiggcGVlciApICk7CisJCQlDSEVDS19GQ1QoIGZkX2ZpZm9fZ2V0c3RhdHMocC0+cF90b3NlbmQsIGN1cnJlbnRfY291bnQsIGxpbWl0X2NvdW50LCBoaWdoZXN0X2NvdW50LCB0b3RhbF9jb3VudCwgdG90YWwsIGJsb2NraW5nLCBsYXN0KSApOworCQl9CisJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gRUlOVkFMOworCX0KKwkKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYmZkY29yZS9ob29rcy5jIGIvbGliZmRjb3JlL2hvb2tzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAzNTYxNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmZkY29yZS9ob29rcy5jCkBAIC0wLDAgKzEsNDU0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxNSwgV0lERSBQcm9qZWN0IGFuZCBOSUNUCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBXSURFIFByb2plY3Qgb3IgTklDVCBub3IgdGhlIAkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFdJREUgUHJvamVjdCBhbmQgCQkJCQkJICoKKyogICBOSUNULgkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJmZGNvcmUtaW50ZXJuYWwuaCIKKworLyogU3RydWN0dXJlcyBmb3IgdGhlIGZkX2hvb2tfZGF0YV9oZGwgbWFuYWdlbWVudCAqLworc3RhdGljIHN0cnVjdCBmZF9ob29rX2RhdGFfaGRsIHsKKwlzaXplX3QJcG1kX3NpemU7CisJdm9pZCAgKCpwbWRfaW5pdF9jYikoc3RydWN0IGZkX2hvb2tfcGVybXNnZGF0YSAqKTsKKwl2b2lkICAoKnBtZF9maW5pX2NiKShzdHJ1Y3QgZmRfaG9va19wZXJtc2dkYXRhICopOworfSBIREhfYXJyYXlbRkRfSE9PS19IQU5ETEVfTElNSVRdOworc3RhdGljIGludCBtYXhfaW5kZXggPSAwOworc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBIREhfbG9jayA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CisKKy8qIFRoZSBzdHJ1Y3R1cmUgbGlua2VkIGZyb20gdGhlIG1zZyBzdHJ1Y3R1cmUgbGlzdCAqLworc3RydWN0IHBtZF9saXN0X2l0ZW0geworCXN0cnVjdCBmZF9saXN0CWNoYWluOwkJLyogdGhpcyBsaXN0IGlzIG9yZGVyZWQgYnkgaGRsICovCisJc3RydWN0IGZkX2hvb2tfZGF0YV9oZGwgKiBoZGw7IAorCXN0cnVjdCBmZF9ob29rX3Blcm1zZ2RhdGEgeyB9IHBtZDsgLyogdGhpcyBkYXRhIGJlbG9uZ3MgdG8gdGhlIGV4dGVuc2lvbjsgd2Ugb25seSBrbm93IHRoZSBzaXplIG9mIGl0ICovCit9OworCisjZGVmaW5lIHNpemVvZl9wbWQoaGRsKQkoKChzaXplX3QpJigoc3RydWN0IHBtZF9saXN0X2l0ZW0gKikwKS0+cG1kKSArIGhkbC0+cG1kX3NpemUpCisKKy8qIE5vdyBhIGhvb2sgcmVnaXN0ZXJlZCBieSBhbiBleHRlbnNpb24gKi8KK3N0cnVjdCBmZF9ob29rX2hkbCB7CisJc3RydWN0IGZkX2xpc3QgY2hhaW5bSE9PS19MQVNUKzFdOworCXZvaWQgKCpmZF9ob29rX2NiKShlbnVtIGZkX2hvb2tfdHlwZSB0eXBlLCBzdHJ1Y3QgbXNnICogbXNnLCBzdHJ1Y3QgcGVlcl9oZHIgKiBwZWVyLCB2b2lkICogb3RoZXIsIHN0cnVjdCBmZF9ob29rX3Blcm1zZ2RhdGEgKnBtZCwgdm9pZCAqIHJlZ2RhdGEpOworCXZvaWQgICpyZWdkYXRhOworCXN0cnVjdCBmZF9ob29rX2RhdGFfaGRsICpkYXRhX2hkbDsKK307CisKKy8qIEFycmF5IG9mIHRob3NlIGhvb2tzICovCitzdHJ1Y3QgeworCXN0cnVjdCBmZF9saXN0IHNlbnRpbmVsOworCXB0aHJlYWRfcndsb2NrX3Qgcndsb2NrOworfSBIU19hcnJheVtIT09LX0xBU1QrMV07CisKKy8qIEluaXRpYWxpemUgdGhlIGFycmF5IG9mIHNlbnRpbmVscyBmb3IgdGhlIGhvb2tzICovCitpbnQgZmRfaG9va3NfaW5pdCh2b2lkKQoreworCWludCBpOworCWZvciAoaT0wOyBpIDw9IEhPT0tfTEFTVDsgaSsrKSB7CisJCWZkX2xpc3RfaW5pdCgmSFNfYXJyYXlbaV0uc2VudGluZWwsIE5VTEwpOworCQlDSEVDS19QT1NJWCggcHRocmVhZF9yd2xvY2tfaW5pdCgmSFNfYXJyYXlbaV0ucndsb2NrLCBOVUxMKSApOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogR2V0IGEgc2xvdCBpbiB0aGUgYXJyYXkgKi8KK2ludCBmZF9ob29rX2RhdGFfcmVnaXN0ZXIoCisJc2l6ZV90IHBlcm1zZ2RhdGFfc2l6ZSwKKwl2b2lkICgqcGVybXNnZGF0YV9pbml0X2NiKSAoc3RydWN0IGZkX2hvb2tfcGVybXNnZGF0YSAqKSwKKyAgICAgICAgdm9pZCAoKnBlcm1zZ2RhdGFfZmluaV9jYikgKHN0cnVjdCBmZF9ob29rX3Blcm1zZ2RhdGEgKiksCisgICAgICAgIHN0cnVjdCBmZF9ob29rX2RhdGFfaGRsICoqbmV3X2hhbmRsZSkKK3sKKwlpbnQgcmV0ID0gRU5PU1BDLCBpZHg7CisJVFJBQ0VfRU5UUlkoIiV6ZCAlcCAlcCAlcCIsIHBlcm1zZ2RhdGFfc2l6ZSwgcGVybXNnZGF0YV9pbml0X2NiLCBwZXJtc2dkYXRhX2ZpbmlfY2IsIG5ld19oYW5kbGUpOworCQorCUNIRUNLX1BBUkFNUyggcGVybXNnZGF0YV9zaXplICYmIG5ld19oYW5kbGUgKTsKKwkKKwlDSEVDS19QT1NJWCggcHRocmVhZF9tdXRleF9sb2NrKCZIREhfbG9jaykgKTsKKwlpZiAobWF4X2luZGV4IDwgRkRfSE9PS19IQU5ETEVfTElNSVQpIHsKKwkJaWR4ID0gbWF4X2luZGV4Kys7CisJCXJldCA9IDA7CisJfQorCUNIRUNLX1BPU0lYKCBwdGhyZWFkX211dGV4X3VubG9jaygmSERIX2xvY2spICk7CisJCisJaWYgKHJldCA9PSAwKSB7CisJCUhESF9hcnJheVtpZHhdLnBtZF9zaXplID0gcGVybXNnZGF0YV9zaXplOworCQlIREhfYXJyYXlbaWR4XS5wbWRfaW5pdF9jYiA9IHBlcm1zZ2RhdGFfaW5pdF9jYjsKKwkJSERIX2FycmF5W2lkeF0ucG1kX2ZpbmlfY2IgPSBwZXJtc2dkYXRhX2ZpbmlfY2I7CisJCSpuZXdfaGFuZGxlID0gJkhESF9hcnJheVtpZHhdOworCX0KKwkKKwlyZXR1cm4gcmV0OworfQorCisvKiBSZWdpc3RlciBhIG5ldyBob29rIGNhbGxiYWNrICovCitpbnQgZmRfaG9va19yZWdpc3RlciAoICB1aW50MzJfdCB0eXBlX21hc2ssIAorCQkJdm9pZCAoKmZkX2hvb2tfY2IpKGVudW0gZmRfaG9va190eXBlIHR5cGUsIHN0cnVjdCBtc2cgKiBtc2csIHN0cnVjdCBwZWVyX2hkciAqIHBlZXIsIHZvaWQgKiBvdGhlciwgc3RydWN0IGZkX2hvb2tfcGVybXNnZGF0YSAqcG1kLCB2b2lkICogcmVnZGF0YSksIAorCQkJdm9pZCAgKnJlZ2RhdGEsIAorCQkJc3RydWN0IGZkX2hvb2tfZGF0YV9oZGwgKmRhdGFfaGRsLAorCQkJc3RydWN0IGZkX2hvb2tfaGRsICoqIGhhbmRsZXIgKQoreworCXN0cnVjdCBmZF9ob29rX2hkbCAqIG5ld2hkbCA9IE5VTEw7CisJaW50IGk7CisJCisJVFJBQ0VfRU5UUlkoIiV4ICVwICVwICVwICVwIiwgdHlwZV9tYXNrLCBmZF9ob29rX2NiLCByZWdkYXRhLCBkYXRhX2hkbCwgaGFuZGxlcik7CisJCisJQ0hFQ0tfUEFSQU1TKCBmZF9ob29rX2NiICYmIGhhbmRsZXIgKTsKKwkKKwlDSEVDS19NQUxMT0MoIG5ld2hkbCA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGZkX2hvb2tfaGRsKSkgKTsKKwltZW1zZXQobmV3aGRsLCAwLCBzaXplb2Yoc3RydWN0IGZkX2hvb2tfaGRsKSk7CisJCisJbmV3aGRsLT5mZF9ob29rX2NiID0gZmRfaG9va19jYjsKKwluZXdoZGwtPnJlZ2RhdGEgPSByZWdkYXRhOworCW5ld2hkbC0+ZGF0YV9oZGwgPSBkYXRhX2hkbDsKKwkKKwlmb3IgKGk9MDsgaSA8PSBIT09LX0xBU1Q7IGkrKykgeworCQlmZF9saXN0X2luaXQoJm5ld2hkbC0+Y2hhaW5baV0sIG5ld2hkbCk7CisJCWlmICh0eXBlX21hc2sgJiAoMTw8aSkpIHsKKwkJCUNIRUNLX1BPU0lYKCBwdGhyZWFkX3J3bG9ja193cmxvY2soJkhTX2FycmF5W2ldLnJ3bG9jaykgKTsKKwkJCWZkX2xpc3RfaW5zZXJ0X2JlZm9yZSggJkhTX2FycmF5W2ldLnNlbnRpbmVsLCAmbmV3aGRsLT5jaGFpbltpXSk7CisJCQlDSEVDS19QT1NJWCggcHRocmVhZF9yd2xvY2tfdW5sb2NrKCZIU19hcnJheVtpXS5yd2xvY2spICk7CisJCX0KKwl9CisJCisJKmhhbmRsZXIgPSBuZXdoZGw7CisJcmV0dXJuIDA7Cit9CisKKy8qIGZyZWUgdGhpcyBob29rIGNhbGxiYWNrICovCitpbnQgZmRfaG9va191bnJlZ2lzdGVyKCBzdHJ1Y3QgZmRfaG9va19oZGwgKiBoYW5kbGVyICkKK3sKKwlpbnQgaTsKKwlUUkFDRV9FTlRSWSgiJXAiLCBoYW5kbGVyKTsKKwlDSEVDS19QQVJBTVMoIGhhbmRsZXIgKTsKKwkKKwlmb3IgKGk9MDsgaSA8PSBIT09LX0xBU1Q7IGkrKykgeworCQlpZiAoICEgRkRfSVNfTElTVF9FTVBUWSgmaGFuZGxlci0+Y2hhaW5baV0pKSB7CisJCQlDSEVDS19QT1NJWCggcHRocmVhZF9yd2xvY2tfd3Jsb2NrKCZIU19hcnJheVtpXS5yd2xvY2spICk7CisJCQlmZF9saXN0X3VubGluaygmaGFuZGxlci0+Y2hhaW5baV0pOworCQkJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfcndsb2NrX3VubG9jaygmSFNfYXJyYXlbaV0ucndsb2NrKSApOworCQl9CisJfQorCQorCWZyZWUoaGFuZGxlcik7CisJCisJcmV0dXJuIDA7Cit9CisKKy8qIGNhbGxiYWNrIGZvciB0aGUgbGliZmRwcm90byB0byBmcmVlIHRoZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCBhIG1lc3NhZ2UgKi8KK3N0YXRpYyB2b2lkIHBtZGxfZnJlZShzdHJ1Y3QgZmRfbXNnX3BtZGwgKnBtZGwpCit7CisJLyogZGVzdHJveSBhbGwgdGhlIGl0ZW1zIGluIHRoZSBsaXN0ICovCisJd2hpbGUgKCFGRF9JU19MSVNUX0VNUFRZKCZwbWRsLT5zZW50aW5lbCkpIHsKKwkJc3RydWN0IHBtZF9saXN0X2l0ZW0gKiBsaSA9IChzdHJ1Y3QgcG1kX2xpc3RfaXRlbSAqKShwbWRsLT5zZW50aW5lbC5uZXh0KTsKKwkJaWYgKGxpLT5oZGwtPnBtZF9maW5pX2NiKSB7CisJCQkoKmxpLT5oZGwtPnBtZF9maW5pX2NiKSgmbGktPnBtZCk7CisJCX0KKwkJZmRfbGlzdF91bmxpbmsoJmxpLT5jaGFpbik7CisJCWZyZWUobGkpOworCX0KKwlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9tdXRleF9kZXN0cm95KCZwbWRsLT5sb2NrKSwgKTsKKwlwbWRsLT5zZW50aW5lbC5vID0gTlVMTDsKK30KKworLyogU2F2ZSB0aGUgbGlzdCBvZiBwbWQgaW50byB0aGUgbWVzc2FnZSBzdHJ1Y3R1cmUsIGFzIHdlbGwgYXMgdGhlIGNhbGxiYWNrIHRvIGZyZWUgdGhpcyBsaXN0ICovCit2b2lkICAgZmRfaG9va19hc3NvY2lhdGUoc3RydWN0IG1zZyAqIG1zZywgc3RydWN0IGZkX21zZ19wbWRsICogcG1kbCkKK3sKKwlzdHJ1Y3QgZmRfbXNnX3BtZGwgKiBpbl9tc2c7CisJCisJQ0hFQ0tfUEFSQU1TX0RPKCBtc2cgJiYgcG1kbCwgcmV0dXJuICk7CisJaW5fbXNnID0gZmRfbXNnX3BtZGxfZ2V0KG1zZyk7CisJQVNTRVJUKGluX21zZyAmJiAoaW5fbXNnLT5zZW50aW5lbC5vID09IE5VTEwpKTsgLyogZXJyb3IgLyBhbHJlYWR5IGluaXRpYWxpemVkID8/PyAqLworCWluX21zZy0+c2VudGluZWwubyA9IHBtZGxfZnJlZTsKKwkvKiBOb3cgbW92ZSBhbGwgaXRlbXMgZnJvbSB0aGUgcG1kbCBwb2ludGVyIGludG8gdGhlIGluaXRpYWxpemVkIGxpc3QgKi8KKwlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9tdXRleF9sb2NrKCZwbWRsLT5sb2NrKSwgKTsKKwlmZF9saXN0X21vdmVfZW5kKCZpbl9tc2ctPnNlbnRpbmVsLCAmcG1kbC0+c2VudGluZWwpOworCUNIRUNLX1BPU0lYX0RPKCBwdGhyZWFkX211dGV4X3VubG9jaygmcG1kbC0+bG9jayksICk7CisJcG1kbF9mcmVlKHBtZGwpOworCS8qIFdlJ3JlIGRvbmUgKi8KK30KKworLyogUmV0dXJuIHRoZSBsb2NhdGlvbiBvZiB0aGUgcGVybXNnZGF0YSBhcmVhIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBoYW5kbGUsIGFmdGVyIGV2ZW50dWFsbHkgaGF2aW5nIGNyZWF0ZWQgaXQuIFJldHVybiBOVUxMIGluIGNhc2Ugb2YgZmFpbHVyZSAqLworc3RhdGljIHN0cnVjdCBmZF9ob29rX3Blcm1zZ2RhdGEgKiBnZXRfb3JfY3JlYXRlX3BtZChzdHJ1Y3QgZmRfbXNnX3BtZGwgKnBtZGwsIHN0cnVjdCBmZF9ob29rX2hkbCAqIGgpIAoreworCXN0cnVjdCBmZF9ob29rX3Blcm1zZ2RhdGEgKiByZXQgPSBOVUxMOworCXN0cnVjdCBmZF9saXN0ICogbGk7CisJCisJQ0hFQ0tfUE9TSVhfRE8oIHB0aHJlYWRfbXV0ZXhfbG9jaygmcG1kbC0+bG9jayksICk7CisJCisJaWYgKHBtZGwtPnNlbnRpbmVsLm8gPT0gTlVMTCkgeworCQlwbWRsLT5zZW50aW5lbC5vID0gcG1kbF9mcmVlOworCX0KKwkKKwkvKiBTZWFyY2ggaW4gdGhlIGxpc3QgZm9yIGFuIGl0ZW0gd2l0aCB0aGUgc2FtZSBoYW5kbGUuIFRoZSBsaXN0IGlzIG9yZGVyZWQgYnkgdGhpcyBoYW5kbGUgKi8KKwlmb3IgKGxpPXBtZGwtPnNlbnRpbmVsLm5leHQ7IGxpICE9ICZwbWRsLT5zZW50aW5lbDsgbGkgPSBsaS0+bmV4dCkgeworCQlzdHJ1Y3QgcG1kX2xpc3RfaXRlbSAqIHBsaSA9IChzdHJ1Y3QgcG1kX2xpc3RfaXRlbSAqKSBsaTsKKwkJaWYgKHBsaS0+aGRsID09IGgtPmRhdGFfaGRsKQorCQkJcmV0ID0gJnBsaS0+cG1kOworCQlpZiAocGxpLT5oZGwgPj0gaC0+ZGF0YV9oZGwpCisJCQlicmVhazsKKwl9CisJaWYgKCFyZXQpIHsKKwkJLyogd2UgbmVlZCB0byBjcmVhdGUgYSBuZXcgb25lIGFuZCBpbnNlcnQgYmVmb3JlIGxpICovCisJCXN0cnVjdCBwbWRfbGlzdF9pdGVtICogcGxpOworCQlDSEVDS19NQUxMT0NfRE8oIHBsaSA9IG1hbGxvYyhzaXplb2ZfcG1kKGgtPmRhdGFfaGRsKSksICk7CisJCWlmIChwbGkpIHsKKwkJCW1lbXNldChwbGksIDAsIHNpemVvZl9wbWQoaC0+ZGF0YV9oZGwpKTsKKwkJCWZkX2xpc3RfaW5pdCgmcGxpLT5jaGFpbiwgcGxpKTsKKwkJCXBsaS0+aGRsID0gaC0+ZGF0YV9oZGw7CisJCQlyZXQgPSAmcGxpLT5wbWQ7CisJCQlpZiAoaC0+ZGF0YV9oZGwtPnBtZF9pbml0X2NiKSB7CisJCQkJKCpoLT5kYXRhX2hkbC0+cG1kX2luaXRfY2IpKHJldCk7CisJCQl9CisJCQlmZF9saXN0X2luc2VydF9iZWZvcmUobGksICZwbGktPmNoYWluKTsKKwkJfQorCX0KKwkKKwlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9tdXRleF91bmxvY2soJnBtZGwtPmxvY2spLCApOworCXJldHVybiByZXQ7Cit9CisKK3N0cnVjdCBmZF9ob29rX3Blcm1zZ2RhdGEgKiBmZF9ob29rX2dldF9yZXF1ZXN0X3BtZChzdHJ1Y3QgZmRfaG9va19kYXRhX2hkbCAqZGF0YV9oZGwsIHN0cnVjdCBtc2cgKiBhbnN3ZXIpCit7CisJc3RydWN0IG1zZyAqIHFyeTsKKwlzdHJ1Y3QgZmRfbXNnX3BtZGwgKnBtZGw7CisJc3RydWN0IGZkX2hvb2tfcGVybXNnZGF0YSAqIHJldCA9IE5VTEw7CisJc3RydWN0IGZkX2xpc3QgKiBsaTsKKwkKKwlDSEVDS19GQ1RfRE8oIGZkX21zZ19hbnN3X2dldHEoYW5zd2VyLCAmcXJ5KSwgcmV0dXJuIE5VTEwgKTsKKwlpZiAoIXFyeSkKKwkJcmV0dXJuIE5VTEw7CisJCisJcG1kbCA9IGZkX21zZ19wbWRsX2dldChxcnkpOworCWlmICghcG1kbCkKKwkJcmV0dXJuIE5VTEw7CisJCisJQ0hFQ0tfUE9TSVhfRE8oIHB0aHJlYWRfbXV0ZXhfbG9jaygmcG1kbC0+bG9jayksICk7CisJLyogU2VhcmNoIGluIHRoZSBsaXN0IGZvciBhbiBpdGVtIHdpdGggdGhlIHNhbWUgaGFuZGxlLiBUaGUgbGlzdCBpcyBvcmRlcmVkIGJ5IHRoaXMgaGFuZGxlICovCisJZm9yIChsaT1wbWRsLT5zZW50aW5lbC5uZXh0OyBsaSAhPSAmcG1kbC0+c2VudGluZWw7IGxpID0gbGktPm5leHQpIHsKKwkJc3RydWN0IHBtZF9saXN0X2l0ZW0gKiBwbGkgPSAoc3RydWN0IHBtZF9saXN0X2l0ZW0gKikgbGk7CisJCWlmIChwbGktPmhkbCA9PSBkYXRhX2hkbCkKKwkJCXJldCA9ICZwbGktPnBtZDsKKwkJaWYgKHBsaS0+aGRsID49IGRhdGFfaGRsKQorCQkJYnJlYWs7CisJfQorCUNIRUNLX1BPU0lYX0RPKCBwdGhyZWFkX211dGV4X3VubG9jaygmcG1kbC0+bG9jayksICk7CisJcmV0dXJuIHJldDsKK30KKworLyogQ3JlYXRlIGEgbWFzayAqLwordWludDMyX3QgZmRfaG9va19tYXNrX2hlbHBlcihpbnQgZHVtbXksIC4uLikKK3sKKwl2YV9saXN0IGFwOworCXVpbnQzMl90IHJldCA9IDA7CisJaW50IG5leHQ7CisJCisJdmFfc3RhcnQoYXAsIGR1bW15KTsKKwl3aGlsZSAoKG5leHQgPSB2YV9hcmcoYXAsIGludCkpID49IDApIHsKKwkJaWYgKG5leHQgPiBIT09LX0xBU1QpCisJCQlicmVhazsgLyogaW52YWxpZCBwYXJhbWV0ZXIgKi8KKwkJcmV0IHw9ICgxPDxuZXh0KTsKKwl9CisJdmFfZW5kKGFwKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBwdGhyZWFkX211dGV4X3QgaG9va19kZWZhdWx0X210eCA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CitzdGF0aWMgY2hhciAqIGhvb2tfZGVmYXVsdF9idWYgPSBOVUxMOworc3RhdGljIHNpemVfdCBob29rX2RlZmF1bHRfbGVuID0gMDsKKworLyogVGhlIGZ1bmN0aW9uIHRoYXQgZG9lcyB0aGUgd29yayBvZiBjYWxsaW5nIHRoZSBleHRlbnNpb24ncyBjYWxsYmFja3MgYW5kIGFsc28gbWFuYWdpbmcgdGhlIHBlcm1lc3NhZ2VkYXRhIHN0cnVjdHVyZXMgKi8KK3ZvaWQgICBmZF9ob29rX2NhbGwoZW51bSBmZF9ob29rX3R5cGUgdHlwZSwgc3RydWN0IG1zZyAqIG1zZywgc3RydWN0IGZkX3BlZXIgKiBwZWVyLCB2b2lkICogb3RoZXIsIHN0cnVjdCBmZF9tc2dfcG1kbCAqIHBtZGwpCit7CisJc3RydWN0IGZkX2xpc3QgKiBsaTsKKwlBU1NFUlQodHlwZSA8PSBIT09LX0xBU1QpOworCWludCBjYWxsX2RlZmF1bHQgPSAwOworCQorCS8qIGxvY2sgdGhlIGxpc3Qgb2YgaG9va3MgZm9yIHRoaXMgdHlwZSAqLworCUNIRUNLX1BPU0lYX0RPKCBwdGhyZWFkX3J3bG9ja19yZGxvY2soJkhTX2FycmF5W3R5cGVdLnJ3bG9jayksICk7CisJCisJcHRocmVhZF9jbGVhbnVwX3B1c2goIGZkX2NsZWFudXBfcndsb2NrLCAmSFNfYXJyYXlbdHlwZV0ucndsb2NrICk7CisJCisJaWYgKEZEX0lTX0xJU1RfRU1QVFkoJkhTX2FycmF5W3R5cGVdLnNlbnRpbmVsKSkgeworCQljYWxsX2RlZmF1bHQgPSAxOworCX0gZWxzZSB7CisJCS8qIGZvciBlYWNoIHJlZ2lzdGVyZWQgaG9vayAqLworCQlmb3IgKGxpID0gSFNfYXJyYXlbdHlwZV0uc2VudGluZWwubmV4dDsgbGkgIT0gJkhTX2FycmF5W3R5cGVdLnNlbnRpbmVsOyBsaSA9IGxpLT5uZXh0KSB7CisJCQlzdHJ1Y3QgZmRfaG9va19oZGwgKiBoID0gKHN0cnVjdCBmZF9ob29rX2hkbCAqKWxpLT5vOworCQkJc3RydWN0IGZkX2hvb2tfcGVybXNnZGF0YSAqIHBtZCA9IE5VTEw7CisKKwkJCS8qIGRvIHdlIG5lZWQgdG8gaGFuZGxlIHBtZCA/ICovCisJCQlpZiAoaC0+ZGF0YV9oZGwgJiYgcG1kbCkgeworCQkJCXBtZCA9IGdldF9vcl9jcmVhdGVfcG1kKHBtZGwsIGgpOworCQkJfQorCisJCQkvKiBOb3csIGNhbGwgdGhpcyBjYWxsYmFjayAqLworCQkJKCpoLT5mZF9ob29rX2NiKSh0eXBlLCBtc2csICZwZWVyLT5wX2hkciwgb3RoZXIsIHBtZCwgaC0+cmVnZGF0YSk7CisJCX0KKwl9CisJCisJcHRocmVhZF9jbGVhbnVwX3BvcCgwKTsKKwkKKwkvKiBkb25lICovCisJQ0hFQ0tfUE9TSVhfRE8oIHB0aHJlYWRfcndsb2NrX3VubG9jaygmSFNfYXJyYXlbdHlwZV0ucndsb2NrKSwgKTsKKwkKKwlpZiAoY2FsbF9kZWZhdWx0KSB7CisJCUNIRUNLX1BPU0lYX0RPKCBwdGhyZWFkX211dGV4X2xvY2soJmhvb2tfZGVmYXVsdF9tdHgpLCApOworCQkKKwkJcHRocmVhZF9jbGVhbnVwX3B1c2goIGZkX2NsZWFudXBfbXV0ZXgsICZob29rX2RlZmF1bHRfbXR4ICk7CisJCisJCS8qIFRoZXJlIHdhcyBubyByZWdpc3RlcmVkIGhhbmRsZXIsIGRlZmF1bHQgYmVoYXZpb3IgZm9yIHRoaXMgaG9vayAqLworCQlzd2l0Y2ggKHR5cGUpIHsKKwkJCWNhc2UgSE9PS19EQVRBX1JFQ0VJVkVEOiB7CisJCQkJc3RydWN0IGZkX2NueF9yY3ZkYXRhICpyY3ZfZGF0YSA9IG90aGVyOworCQkJCUxPR19BKCJSQ1Y6ICV6ZCBieXRlcyIsIHJjdl9kYXRhLT5sZW5ndGgpOworCQkJCWJyZWFrOworCQkJfQorCQkJCisJCQljYXNlIEhPT0tfTUVTU0FHRV9SRUNFSVZFRDogeworCQkJCUNIRUNLX01BTExPQ19ETyhmZF9tc2dfZHVtcF9zdW1tYXJ5KCZob29rX2RlZmF1bHRfYnVmLCAmaG9va19kZWZhdWx0X2xlbiwgTlVMTCwgbXNnLCBOVUxMLCAwLCAxKSwgYnJlYWspOworCQkJCUxPR19EKCJSQ1YgZnJvbSAnJXMnOiAlcyIsIHBlZXIgPyBwZWVyLT5wX2hkci5pbmZvLnBpX2RpYW1pZCA6ICI8dW5rbm93bj4iLCBob29rX2RlZmF1bHRfYnVmKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCQorCQkJY2FzZSBIT09LX01FU1NBR0VfTE9DQUw6IHsKKwkJCQlDSEVDS19NQUxMT0NfRE8oZmRfbXNnX2R1bXBfZnVsbCgmaG9va19kZWZhdWx0X2J1ZiwgJmhvb2tfZGVmYXVsdF9sZW4sIE5VTEwsIG1zZywgTlVMTCwgMCwgMSksIGJyZWFrKTsKKwkJCQlMT0dfQSgiSGFuZGxlZCB0byBmcmFtZXdvcmsgZm9yIHNlbmRpbmc6ICVzIiwgaG9va19kZWZhdWx0X2J1Zik7CisJCQkJYnJlYWs7CisJCQl9CisJCQkKKwkJCWNhc2UgSE9PS19NRVNTQUdFX1NFTkRJTkc6IHsKKwkJCQlMT0dfQSgiU0VORElORyBtZXNzYWdlIHRvICclcyciLCBwZWVyID8gcGVlci0+cF9oZHIuaW5mby5waV9kaWFtaWQgOiAiPHVua25vd24+Iik7CisJCQkJYnJlYWs7CisJCQl9CisJCQkKKwkJCWNhc2UgSE9PS19NRVNTQUdFX1NFTlQ6IHsKKwkJCQlDSEVDS19NQUxMT0NfRE8oZmRfbXNnX2R1bXBfc3VtbWFyeSgmaG9va19kZWZhdWx0X2J1ZiwgJmhvb2tfZGVmYXVsdF9sZW4sIE5VTEwsIG1zZywgTlVMTCwgMCwgMSksIGJyZWFrKTsKKwkJCQlMT0dfRCgiU0VOVCB0byAnJXMnOiAlcyIsIHBlZXIgPyBwZWVyLT5wX2hkci5pbmZvLnBpX2RpYW1pZCA6ICI8dW5rbm93bj4iLCBob29rX2RlZmF1bHRfYnVmKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCQorCQkJY2FzZSBIT09LX01FU1NBR0VfRkFJTE9WRVI6IHsKKwkJCQlDSEVDS19NQUxMT0NfRE8oZmRfbXNnX2R1bXBfc3VtbWFyeSgmaG9va19kZWZhdWx0X2J1ZiwgJmhvb2tfZGVmYXVsdF9sZW4sIE5VTEwsIG1zZywgTlVMTCwgMCwgMSksIGJyZWFrKTsKKwkJCQlMT0dfRCgiRmFpbGluZyBvdmVyIG1lc3NhZ2Ugc2VudCB0byAnJXMnOiAlcyIsIHBlZXIgPyBwZWVyLT5wX2hkci5pbmZvLnBpX2RpYW1pZCA6ICI8dW5rbm93bj4iLCBob29rX2RlZmF1bHRfYnVmKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCQorCQkJY2FzZSBIT09LX01FU1NBR0VfUEFSU0lOR19FUlJPUjogeworCQkJCWlmIChtc2cpIHsKKwkJCQkJRGlhbUlkX3QgaWQgPSBOVUxMOworCQkJCQlpZiAoZmRfbXNnX3NvdXJjZV9nZXQoIG1zZywgJmlkLCBOVUxMICkpCisJCQkJCQlpZCA9IChEaWFtSWRfdCkiPGVycm9yIGdldHRpbmcgc291cmNlPiI7CisJCQkJCQorCQkJCQlpZiAoIWlkKQorCQkJCQkJaWQgPSAoRGlhbUlkX3QpIjxsb2NhbD4iOworCQkJCQkKKwkJCQkJQ0hFQ0tfTUFMTE9DX0RPKGZkX21zZ19kdW1wX3RyZWV2aWV3KCZob29rX2RlZmF1bHRfYnVmLCAmaG9va19kZWZhdWx0X2xlbiwgTlVMTCwgbXNnLCBOVUxMLCAwLCAxKSwgYnJlYWspOworCQkJCQkKKwkJCQkJTE9HX0UoIlBhcnNpbmcgZXJyb3I6ICclcycgZm9yIHRoZSBmb2xsb3dpbmcgbWVzc2FnZSByZWNlaXZlZCBmcm9tICclcyc6IiwgKGNoYXIgKilvdGhlciwgKGNoYXIgKilpZCk7CisJCQkJCUxPR19TUExJVChGRF9MT0dfRVJST1IsICIgICAiLCBob29rX2RlZmF1bHRfYnVmLCBOVUxMKTsKKwkJCQl9IGVsc2UgeworCQkJCQlzdHJ1Y3QgZmRfY254X3JjdmRhdGEgKnJjdl9kYXRhID0gb3RoZXI7CisJCQkJCUNIRUNLX01BTExPQ19ETyhmZF9kdW1wX2V4dGVuZF9oZXhkdW1wKCZob29rX2RlZmF1bHRfYnVmLCAmaG9va19kZWZhdWx0X2xlbiwgTlVMTCwgcmN2X2RhdGEtPmJ1ZmZlciwgcmN2X2RhdGEtPmxlbmd0aCwgMCwgMCksIGJyZWFrKTsKKwkJCQkJTE9HX0UoIlBhcnNpbmcgZXJyb3I6IGNhbm5vdCBwYXJzZSAlemRCIGJ1ZmZlciBmcm9tICclcyc6ICVzIiwgIHJjdl9kYXRhLT5sZW5ndGgsIHBlZXIgPyBwZWVyLT5wX2hkci5pbmZvLnBpX2RpYW1pZCA6ICI8dW5rbm93bj4iLCBob29rX2RlZmF1bHRfYnVmKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCQkKKwkJCWNhc2UgSE9PS19NRVNTQUdFX1BBUlNJTkdfRVJST1IyOiB7CisJCQkJQ0hFQ0tfTUFMTE9DX0RPKGZkX21zZ19kdW1wX3RyZWV2aWV3KCZob29rX2RlZmF1bHRfYnVmLCAmaG9va19kZWZhdWx0X2xlbiwgTlVMTCwgbXNnLCBOVUxMLCAwLCAxKSwgYnJlYWspOworCisJCQkJTE9HX0UoIlJldHVybmluZyBmb2xsb3dpbmcgbWVzc2FnZSBhZnRlciBwYXJzaW5nIGVycm9yOiIpOworCQkJCUxPR19TUExJVChGRF9MT0dfRVJST1IsICIgICAiLCBob29rX2RlZmF1bHRfYnVmLCBOVUxMKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCQorCQkJY2FzZSBIT09LX01FU1NBR0VfUk9VVElOR19FUlJPUjogeworCQkJCUNIRUNLX01BTExPQ19ETyhmZF9tc2dfZHVtcF90cmVldmlldygmaG9va19kZWZhdWx0X2J1ZiwgJmhvb2tfZGVmYXVsdF9sZW4sIE5VTEwsIG1zZywgTlVMTCwgMCwgMSksIGJyZWFrKTsKKwkJCQlMT0dfRSgiUm91dGluZyBlcnJvcjogJyVzJyBmb3IgdGhlIGZvbGxvd2luZyBtZXNzYWdlOiIsIChjaGFyICopb3RoZXIpOworCQkJCUxPR19TUExJVChGRF9MT0dfRVJST1IsICIgICAiLCBob29rX2RlZmF1bHRfYnVmLCBOVUxMKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCQorCQkJY2FzZSBIT09LX01FU1NBR0VfUk9VVElOR19GT1JXQVJEOiB7CisJCQkJQ0hFQ0tfTUFMTE9DX0RPKGZkX21zZ19kdW1wX3N1bW1hcnkoJmhvb2tfZGVmYXVsdF9idWYsICZob29rX2RlZmF1bHRfbGVuLCBOVUxMLCBtc2csIE5VTEwsIDAsIDEpLCBicmVhayk7CisJCQkJTE9HX0QoIkZPUldBUkRJTkc6ICVzIiwgaG9va19kZWZhdWx0X2J1Zik7CisJCQkJYnJlYWs7CisJCQl9CisJCQkKKwkJCWNhc2UgSE9PS19NRVNTQUdFX1JPVVRJTkdfTE9DQUw6IHsKKwkJCQlDSEVDS19NQUxMT0NfRE8oZmRfbXNnX2R1bXBfc3VtbWFyeSgmaG9va19kZWZhdWx0X2J1ZiwgJmhvb2tfZGVmYXVsdF9sZW4sIE5VTEwsIG1zZywgTlVMTCwgMCwgMSksIGJyZWFrKTsKKwkJCQlMT0dfRCgiRElTUEFUQ0hJTkc6ICVzIiwgaG9va19kZWZhdWx0X2J1Zik7CisJCQkJYnJlYWs7CisJCQl9CisJCQkKKwkJCWNhc2UgSE9PS19NRVNTQUdFX0RST1BQRUQ6IHsKKwkJCQlDSEVDS19NQUxMT0NfRE8oZmRfbXNnX2R1bXBfdHJlZXZpZXcoJmhvb2tfZGVmYXVsdF9idWYsICZob29rX2RlZmF1bHRfbGVuLCBOVUxMLCBtc2csIE5VTEwsIDAsIDEpLCBicmVhayk7CisJCQkJTE9HX0UoIk1lc3NhZ2UgZGlzY2FyZGVkICgnJXMnKToiLCAoY2hhciAqKW90aGVyKTsKKwkJCQlMT0dfU1BMSVQoRkRfTE9HX0VSUk9SLCAiICAgIiwgaG9va19kZWZhdWx0X2J1ZiwgTlVMTCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQkKKwkJCWNhc2UgSE9PS19QRUVSX0NPTk5FQ1RfRkFJTEVEOiB7CisJCQkJaWYgKG1zZykgeworCQkJCQlDSEVDS19NQUxMT0NfRE8oZmRfbXNnX2R1bXBfZnVsbCgmaG9va19kZWZhdWx0X2J1ZiwgJmhvb2tfZGVmYXVsdF9sZW4sIE5VTEwsIG1zZywgTlVMTCwgMCwgMSksIGJyZWFrKTsKKwkJCQkJTE9HX04oIkNvbm5lY3Rpb24gdG8gJyVzJyBmYWlsZWQ6ICclcyc7IENFUi9DRUEgZHVtcDoiLCBwZWVyID8gcGVlci0+cF9oZHIuaW5mby5waV9kaWFtaWQgOiAiPHVua25vd24+IiwgKGNoYXIgKilvdGhlcik7CisJCQkJCUxPR19TUExJVChGRF9MT0dfTk9USUNFLCAiICAgIiwgaG9va19kZWZhdWx0X2J1ZiwgTlVMTCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJTE9HX0QoIkNvbm5lY3Rpb24gdG8gJyVzJyBmYWlsZWQ6ICVzIiwgcGVlciA/IHBlZXItPnBfaGRyLmluZm8ucGlfZGlhbWlkIDogIjx1bmtub3duPiIsIChjaGFyICopb3RoZXIpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJCQorCQkJY2FzZSBIT09LX1BFRVJfQ09OTkVDVF9TVUNDRVNTOiB7CisJCQkJRGlhbUlkX3QgaWQgPSBOVUxMOworCQkJCWlmICgoIWZkX21zZ19zb3VyY2VfZ2V0KCBtc2csICZpZCwgTlVMTCApKSAmJiAoaWQgPT0gTlVMTCkpIHsgLyogVGhlIENFQSBpcyBsb2NhbGx5IGlzc3VlZCAqLworCQkJCQlmZF9tc2dfYW5zd19nZXRxKG1zZywgJm1zZyk7IC8qIFdlIGR1bXAgdGhlIENFUiBpbiB0aGF0IGNhc2UgKi8KKwkJCQl9CisJCQkJQ0hFQ0tfTUFMTE9DX0RPKGZkX21zZ19kdW1wX2Z1bGwoJmhvb2tfZGVmYXVsdF9idWYsICZob29rX2RlZmF1bHRfbGVuLCBOVUxMLCBtc2csIE5VTEwsIDAsIDEpLCBicmVhayk7CisJCQkJY2hhciBwcm90b2J1Zls0MF07CisJCQkJaWYgKHBlZXIpIHsKKwkJCQkJQ0hFQ0tfRkNUX0RPKGZkX3BlZXJfY254X3Byb3RvX2luZm8oJnBlZXItPnBfaGRyLCBwcm90b2J1Ziwgc2l6ZW9mKHByb3RvYnVmKSksIGJyZWFrICk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcHJvdG9idWZbMF0gPSAnLSc7CisJCQkJCXByb3RvYnVmWzFdID0gJ1wwJzsKKwkJCQl9CisJCQkJTE9HX04oIkNvbm5lY3RlZCB0byAnJXMnICglcyksIHJlbW90ZSBjYXBhYmlsaXRpZXM6ICIsIHBlZXIgPyBwZWVyLT5wX2hkci5pbmZvLnBpX2RpYW1pZCA6ICI8dW5rbm93bj4iLCBwcm90b2J1Zik7CisJCQkJTE9HX1NQTElUKEZEX0xPR19OT1RJQ0UsICIgICAiLCBob29rX2RlZmF1bHRfYnVmLCBOVUxMKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCQorCQl9CisJCQorCQlwdGhyZWFkX2NsZWFudXBfcG9wKDApOworCQkKKwkJQ0hFQ0tfUE9TSVhfRE8oIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZob29rX2RlZmF1bHRfbXR4KSwgKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9saWJmZGNvcmUvbWVzc2FnZXMuYyBiL2xpYmZkY29yZS9tZXNzYWdlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNDI4MjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJmZGNvcmUvbWVzc2FnZXMuYwpAQCAtMCwwICsxLDQ1MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTUsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiZmRjb3JlLWludGVybmFsLmgiCisKK3N0YXRpYyBzdHJ1Y3QgZGljdF9vYmplY3QgKiBkaWN0X2F2cF9TSSAgPSBOVUxMOyAvKiBTZXNzaW9uLUlkICovCitzdGF0aWMgc3RydWN0IGRpY3Rfb2JqZWN0ICogZGljdF9hdnBfT0ggID0gTlVMTDsgLyogT3JpZ2luLUhvc3QgKi8KK3N0YXRpYyBzdHJ1Y3QgZGljdF9vYmplY3QgKiBkaWN0X2F2cF9PUiAgPSBOVUxMOyAvKiBPcmlnaW4tUmVhbG0gKi8KK3N0YXRpYyBzdHJ1Y3QgZGljdF9vYmplY3QgKiBkaWN0X2F2cF9FTSAgPSBOVUxMOyAvKiBFcnJvci1NZXNzYWdlICovCitzdGF0aWMgc3RydWN0IGRpY3Rfb2JqZWN0ICogZGljdF9hdnBfRVJIID0gTlVMTDsgLyogRXJyb3ItUmVwb3J0aW5nLUhvc3QgKi8KK3N0YXRpYyBzdHJ1Y3QgZGljdF9vYmplY3QgKiBkaWN0X2F2cF9GQVZQPSBOVUxMOyAvKiBGYWlsZWQtQVZQICovCitzdGF0aWMgc3RydWN0IGRpY3Rfb2JqZWN0ICogZGljdF9hdnBfUkMgID0gTlVMTDsgLyogUmVzdWx0LUNvZGUgKi8KK3N0cnVjdCBkaWN0X29iamVjdCAqIGZkX2RpY3RfYXZwX09TSSA9IE5VTEw7IC8qIE9yaWdpbi1TdGF0ZS1JZCAqLworc3RydWN0IGRpY3Rfb2JqZWN0ICogZmRfZGljdF9jbWRfQ0VSID0gTlVMTDsgLyogQ2FwYWJpbGl0aWVzLUV4Y2hhbmdlLVJlcXVlc3QgKi8KK3N0cnVjdCBkaWN0X29iamVjdCAqIGZkX2RpY3RfY21kX0RXUiA9IE5VTEw7IC8qIERldmljZS1XYXRjaGRvZy1SZXF1ZXN0ICovCitzdHJ1Y3QgZGljdF9vYmplY3QgKiBmZF9kaWN0X2F2cF9EQyAgPSBOVUxMOyAvKiBEaXNjb25uZWN0LUNhdXNlICovCitzdHJ1Y3QgZGljdF9vYmplY3QgKiBmZF9kaWN0X2NtZF9EUFIgPSBOVUxMOyAvKiBEaXNjb25uZWN0LVBlZXItUmVxdWVzdCAqLworCisvKiBSZXNvbHZlIHRoZSBkaWN0aW9uYXJ5IG9iamVjdHMgKi8KK2ludCBmZF9tc2dfaW5pdCh2b2lkKQoreworCVRSQUNFX0VOVFJZKCIiKTsKKwkKKwkvKiBJbml0aWFsaXplIHRoZSBkaWN0aW9uYXJ5IG9iamVjdHMgdGhhdCB3ZSBtYXkgdXNlIGZyZXF1ZW50bHkgKi8KKwlDSEVDS19GQ1QoICBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJTZXNzaW9uLUlkIiwgCSZkaWN0X2F2cF9TSSAsIEVOT0VOVCkgICk7CisJQ0hFQ0tfRkNUKCAgZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiT3JpZ2luLUhvc3QiLCAgICAgCSZkaWN0X2F2cF9PSCAgLCBFTk9FTlQpICApOworCUNIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIk9yaWdpbi1SZWFsbSIsICAgIAkmZGljdF9hdnBfT1IgICwgRU5PRU5UKSAgKTsKKwlDSEVDS19GQ1QoICBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJPcmlnaW4tU3RhdGUtSWQiLCAJJmZkX2RpY3RfYXZwX09TSSAsIEVOT0VOVCkgICk7CisJCisJQ0hFQ0tfRkNUKCAgZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiUmVzdWx0LUNvZGUiLCAgICAgCSZkaWN0X2F2cF9SQyAgLCBFTk9FTlQpICApOworCUNIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIkVycm9yLU1lc3NhZ2UiLCAgIAkmZGljdF9hdnBfRU0gICwgRU5PRU5UKSAgKTsKKwlDSEVDS19GQ1QoICBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJFcnJvci1SZXBvcnRpbmctSG9zdCIsICZkaWN0X2F2cF9FUkggLCBFTk9FTlQpICApOworCUNIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIkZhaWxlZC1BVlAiLCAgICAgIAkmZGljdF9hdnBfRkFWUCwgRU5PRU5UKSAgKTsKKwkKKwlDSEVDS19GQ1QoICBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJEaXNjb25uZWN0LUNhdXNlIiwgCSZmZF9kaWN0X2F2cF9EQyAsIEVOT0VOVCkgICk7CisJCisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIkNhcGFiaWxpdGllcy1FeGNoYW5nZS1SZXF1ZXN0IiwgJmZkX2RpY3RfY21kX0NFUiwgRU5PRU5UICkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoICggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0NPTU1BTkQsIENNRF9CWV9OQU1FLCAiRGV2aWNlLVdhdGNoZG9nLVJlcXVlc3QiLCAmZmRfZGljdF9jbWRfRFdSLCBFTk9FTlQgKSApOworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2ggKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJEaXNjb25uZWN0LVBlZXItUmVxdWVzdCIsICZmZF9kaWN0X2NtZF9EUFIsIEVOT0VOVCApICk7CisJCisJCisJcmV0dXJuIDA7Cit9CisKKy8qIEFkZCBPcmlnaW4tSG9zdCwgT3JpZ2luLVJlYWxtLCBPcmlnaW4tU3RhdGUtSWQgQVZQUyBhdCB0aGUgZW5kIG9mIHRoZSBtZXNzYWdlICovCitpbnQgZmRfbXNnX2FkZF9vcmlnaW4gKCBzdHJ1Y3QgbXNnICogbXNnLCBpbnQgb3NpICkKK3sKKwl1bmlvbiBhdnBfdmFsdWUgdmFsOworCXN0cnVjdCBhdnAgKiBhdnBfT0ggID0gTlVMTDsKKwlzdHJ1Y3QgYXZwICogYXZwX09SICA9IE5VTEw7CisJc3RydWN0IGF2cCAqIGF2cF9PU0kgPSBOVUxMOworCQorCVRSQUNFX0VOVFJZKCIlcCIsIG1zZyk7CisJQ0hFQ0tfUEFSQU1TKCAgbXNnICApOworCQorCS8qIENyZWF0ZSB0aGUgT3JpZ2luLUhvc3QgQVZQICovCisJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyggZGljdF9hdnBfT0gsIDAsICZhdnBfT0ggKSApOworCQorCS8qIFNldCBpdHMgdmFsdWUgKi8KKwltZW1zZXQoJnZhbCwgMCwgc2l6ZW9mKHZhbCkpOworCXZhbC5vcy5kYXRhID0gKG9zMF90KWZkX2dfY29uZmlnLT5jbmZfZGlhbWlkOworCXZhbC5vcy5sZW4gID0gZmRfZ19jb25maWctPmNuZl9kaWFtaWRfbGVuOworCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9zZXR2YWx1ZSggYXZwX09ILCAmdmFsICkgKTsKKwkKKwkvKiBBZGQgaXQgdG8gdGhlIG1lc3NhZ2UgKi8KKwlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkKCBtc2csIE1TR19CUldfTEFTVF9DSElMRCwgYXZwX09IICkgKTsKKwkKKwkKKwkvKiBDcmVhdGUgdGhlIE9yaWdpbi1SZWFsbSBBVlAgKi8KKwlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3KCBkaWN0X2F2cF9PUiwgMCwgJmF2cF9PUiApICk7CisJCisJLyogU2V0IGl0cyB2YWx1ZSAqLworCW1lbXNldCgmdmFsLCAwLCBzaXplb2YodmFsKSk7CisJdmFsLm9zLmRhdGEgPSAob3MwX3QpZmRfZ19jb25maWctPmNuZl9kaWFtcmxtOworCXZhbC5vcy5sZW4gID0gZmRfZ19jb25maWctPmNuZl9kaWFtcmxtX2xlbjsKKwlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUoIGF2cF9PUiwgJnZhbCApICk7CisJCisJLyogQWRkIGl0IHRvIHRoZSBtZXNzYWdlICovCisJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCggbXNnLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cF9PUiApICk7CisJCisJaWYgKG9zaSkgeworCQkvKiBDcmVhdGUgdGhlIE9yaWdpbi1TdGF0ZS1JZCBBVlAgKi8KKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyggZmRfZGljdF9hdnBfT1NJLCAwLCAmYXZwX09TSSApICk7CisKKwkJLyogU2V0IGl0cyB2YWx1ZSAqLworCQltZW1zZXQoJnZhbCwgMCwgc2l6ZW9mKHZhbCkpOworCQl2YWwudTMyID0gZmRfZ19jb25maWctPmNuZl9vcnN0YXRlaWQ7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9zZXR2YWx1ZSggYXZwX09TSSwgJnZhbCApICk7CisKKwkJLyogQWRkIGl0IHRvIHRoZSBtZXNzYWdlICovCisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQoIG1zZywgTVNHX0JSV19MQVNUX0NISUxELCBhdnBfT1NJICkgKTsKKwl9CisJCisJcmV0dXJuIDA7Cit9CisKKy8qIENyZWF0ZSBhIG5ldyBTZXNzaW9uLUlkIGFuZCBhZGQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbWVzc2FnZS4gKi8KK2ludCBmZF9tc2dfbmV3X3Nlc3Npb24oIHN0cnVjdCBtc2cgKiBtc2csIG9zMF90IG9wdCwgc2l6ZV90IG9wdGxlbiApCit7CisJdW5pb24gYXZwX3ZhbHVlIHZhbDsKKwlzdHJ1Y3QgYXZwICogYXZwICA9IE5VTEw7CisJc3RydWN0IHNlc3Npb24gKiBzZXNzID0gTlVMTDsKKwlvczBfdCBzaWQ7CisJc2l6ZV90IHNpZGxlbjsKKwkKKwlUUkFDRV9FTlRSWSgiJXAgJXAgJXpkIiwgbXNnLCBvcHQsIG9wdGxlbik7CisJQ0hFQ0tfUEFSQU1TKCAgbXNnICApOworCQorCS8qIENoZWNrIHRoZXJlIGlzIG5vdCBhbHJlYWR5IGEgc2Vzc2lvbiBpbiB0aGUgbWVzc2FnZSAqLworCUNIRUNLX0ZDVCggZmRfbXNnX3Nlc3NfZ2V0KGZkX2dfY29uZmlnLT5jbmZfZGljdCwgbXNnLCAmc2VzcywgTlVMTCkgKTsKKwlDSEVDS19QQVJBTVMoIHNlc3MgPT0gTlVMTCApOworCQorCS8qIE9rLCBub3cgY3JlYXRlIHRoZSBzZXNzaW9uICovCisJQ0hFQ0tfRkNUKCBmZF9zZXNzX25ldyAoICZzZXNzLCBmZF9nX2NvbmZpZy0+Y25mX2RpYW1pZCwgZmRfZ19jb25maWctPmNuZl9kaWFtaWRfbGVuLCBvcHQsIG9wdGxlbiApICk7CisJQ0hFQ0tfRkNUKCBmZF9zZXNzX2dldHNpZCggc2VzcywgJnNpZCwgJnNpZGxlbikgKTsKKwkKKwkvKiBDcmVhdGUgYW4gQVZQIHRvIGhvbGQgaXQgKi8KKwlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3KCBkaWN0X2F2cF9TSSwgMCwgJmF2cCApICk7CisJCisJLyogU2V0IGl0cyB2YWx1ZSAqLworCW1lbXNldCgmdmFsLCAwLCBzaXplb2YodmFsKSk7CisJdmFsLm9zLmRhdGEgPSBzaWQ7CisJdmFsLm9zLmxlbiAgPSBzaWRsZW47CisJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX3NldHZhbHVlKCBhdnAsICZ2YWwgKSApOworCQorCS8qIEFkZCBpdCB0byB0aGUgbWVzc2FnZSAqLworCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQoIG1zZywgTVNHX0JSV19GSVJTVF9DSElMRCwgYXZwICkgKTsKKwkKKwkvKiBTYXZlIHRoZSBzZXNzaW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVzc2FnZSAqLworCUNIRUNLX0ZDVCggZmRfbXNnX3Nlc3Nfc2V0KCBtc2csIHNlc3MpICk7CisJCisJLyogRG9uZSEgKi8KKwlyZXR1cm4gMDsKK30KKworCisvKiBBZGQgUmVzdWx0LUNvZGUgYW5kIGV2ZW50dWFsbHkgRmFpbGVkLUFWUCwgRXJyb3ItTWVzc2FnZSBhbmQgRXJyb3ItUmVwb3J0aW5nLUhvc3QgQVZQcyAqLworaW50IGZkX21zZ19yZXNjb2RlX3NldCggc3RydWN0IG1zZyAqIG1zZywgY2hhciAqIHJlc2NvZGUsIGNoYXIgKiBlcnJvcm1zZywgc3RydWN0IGF2cCAqIG9wdGF2cCwgaW50IHR5cGVfaWQgKQoreworCXVuaW9uIGF2cF92YWx1ZSB2YWw7CisJc3RydWN0IGF2cCAqIGF2cF9SQyAgPSBOVUxMOworCXN0cnVjdCBhdnAgKiBhdnBfRU0gID0gTlVMTDsKKwlzdHJ1Y3QgYXZwICogYXZwX0VSSCA9IE5VTEw7CisJc3RydWN0IGF2cCAqIGF2cF9GQVZQPSBOVUxMOworCXVpbnQzMl90IHJjX3ZhbCA9IDA7CisJaW50IHNldF9lX2JpdD0wOworCWludCBzdGRfZXJyX21zZz0wOworCQorCVRSQUNFX0VOVFJZKCIlcCAlcyAlcCAlcCAlZCIsIG1zZywgcmVzY29kZSwgZXJyb3Jtc2csIG9wdGF2cCwgdHlwZV9pZCk7CisJCQorCUNIRUNLX1BBUkFNUyggIG1zZyAmJiByZXNjb2RlICApOworCQorCS8qIEZpbmQgdGhlIGVudW0gdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgcmVzY29kZSBzdHJpbmcsIHRoaXMgd2lsbCBnaXZlIHRoZSBjbGFzcyBvZiBlcnJvciAqLworCXsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogZW51bV9vYmogPSBOVUxMOworCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX3JlcXVlc3QgcmVxOworCQltZW1zZXQoJnJlcSwgMCwgc2l6ZW9mKHN0cnVjdCBkaWN0X2VudW12YWxfcmVxdWVzdCkpOworCQkKKwkJLyogRmlyc3QsIGdldCB0aGUgZW51bWVyYXRlZCB0eXBlIG9mIHRoZSBSZXN1bHQtQ29kZSBBVlAgKHRoaXMgaXMgZmFzdCwgbm8gbmVlZCB0byBjYWNoZSB0aGUgb2JqZWN0KSAqLworCQlDSEVDS19GQ1QoICBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1RZUEUsIFRZUEVfT0ZfQVZQLCBkaWN0X2F2cF9SQywgJihyZXEudHlwZV9vYmopLCBFTk9FTlQgICkgICk7CisJCQorCQkvKiBOb3cgc2VhcmNoIGZvciB0aGUgdmFsdWUgZ2l2ZW4gYXMgcGFyYW1ldGVyICovCisJCXJlcS5zZWFyY2guZW51bV9uYW1lID0gcmVzY29kZTsKKwkJQ0hFQ0tfRkNUKCAgZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9FTlVNVkFMLCBFTlVNVkFMX0JZX1NUUlVDVCwgJnJlcSwgJmVudW1fb2JqLCBFTk9UU1VQKSAgKTsKKwkJCisJCS8qIGZpbmFsbHkgcmV0cmlldmUgaXRzIGRhdGEgKi8KKwkJQ0hFQ0tfRkNUX0RPKCAgZmRfZGljdF9nZXR2YWwoIGVudW1fb2JqLCAmKHJlcS5zZWFyY2gpICksIHJldHVybiBFSU5WQUwgKTsKKwkJCisJCS8qIGNvcHkgdGhlIGZvdW5kIHZhbHVlLCB3ZSdyZSBkb25lICovCisJCXJjX3ZhbCA9IHJlcS5zZWFyY2guZW51bV92YWx1ZS51MzI7CisJfQorCQorCWlmICh0eXBlX2lkID09IDEpIHsKKwkJLyogQWRkIHRoZSBPcmlnaW4tSG9zdCBhbmQgT3JpZ2luLVJlYWxtIEFWUCAqLworCQlDSEVDS19GQ1QoIGZkX21zZ19hZGRfb3JpZ2luICggbXNnLCAwICkgKTsKKwl9CisJCisJLyogQ3JlYXRlIHRoZSBSZXN1bHQtQ29kZSBBVlAgKi8KKwlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3KCBkaWN0X2F2cF9SQywgMCwgJmF2cF9SQyApICk7CisJCisJLyogU2V0IGl0cyB2YWx1ZSAqLworCW1lbXNldCgmdmFsLCAwLCBzaXplb2YodmFsKSk7CisJdmFsLnUzMiAgPSByY192YWw7CisJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX3NldHZhbHVlKCBhdnBfUkMsICZ2YWwgKSApOworCQorCS8qIEFkZCBpdCB0byB0aGUgbWVzc2FnZSAqLworCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQoIG1zZywgTVNHX0JSV19MQVNUX0NISUxELCBhdnBfUkMgKSApOworCQorCWlmICh0eXBlX2lkID09IDIpIHsKKwkJLyogQWRkIHRoZSBFcnJvci1SZXBvcnRpbmctSG9zdCBBVlAgKi8KKwkJCisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcoIGRpY3RfYXZwX0VSSCwgMCwgJmF2cF9FUkggKSApOworCisJCS8qIFNldCBpdHMgdmFsdWUgKi8KKwkJbWVtc2V0KCZ2YWwsIDAsIHNpemVvZih2YWwpKTsKKwkJdmFsLm9zLmRhdGEgPSAodWludDhfdCAqKWZkX2dfY29uZmlnLT5jbmZfZGlhbWlkOworCQl2YWwub3MubGVuICA9IGZkX2dfY29uZmlnLT5jbmZfZGlhbWlkX2xlbjsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX3NldHZhbHVlKCBhdnBfRVJILCAmdmFsICkgKTsKKworCQkvKiBBZGQgaXQgdG8gdGhlIG1lc3NhZ2UgKi8KKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCggbXNnLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cF9FUkggKSApOworCQorCX0KKwkKKwkvKiBOb3cgYWRkIHRoZSBvcHRhdnAgaW4gYSBGYWlsZWRBVlAgaWYgcHJvdmlkZWQgKi8KKwlpZiAob3B0YXZwKSB7CisJCXN0cnVjdCBhdnAgKiBvcHRhdnBfY3B5ID0gTlVMTDsKKwkJc3RydWN0IGF2cF9oZHIgKm9wdF9oZHIsICpvcHRjcHlfaGRyOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBvcHRfbW9kZWwgPSBOVUxMOworCQlpbnQgaXNfZ3JvdXBlZCA9IDA7CisJCQorCQkvKiBDcmVhdGUgdGhlIEZhaWxlZC1BVlAgQVZQICovCisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcoIGRpY3RfYXZwX0ZBVlAsIDAsICZhdnBfRkFWUCApICk7CisJCQorCQkvKiBXYXMgdGhpcyBBVlAgYSBncm91cGVkIG9uZT8gQmVzdCBlZmZvcnQgb25seSBoZXJlICovCisJCWlmICghZmRfbXNnX21vZGVsICggb3B0YXZwLCAmb3B0X21vZGVsICkgJiYgKG9wdF9tb2RlbCAhPSBOVUxMKSkgeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgIGRpY3RkYXRhOworCQkJQ0hFQ0tfRkNUKCAgZmRfZGljdF9nZXR2YWwob3B0X21vZGVsLCAmZGljdGRhdGEpICApOworCQkJaWYgKGRpY3RkYXRhLmF2cF9iYXNldHlwZSA9PSBBVlBfVFlQRV9HUk9VUEVEKSAKKwkJCQlpc19ncm91cGVkID0gMTsKKwkJfQorCQkKKwkJLyogQ3JlYXRlIGEgbmV3IEFWUCB3aXRoIGEgY29weSBvZiB0aGUgZGF0YSBvZiB0aGUgaW52YWxpZCBvciBtaXNzaW5nIEFWUCAqLworCQlvcHRhdnBfY3B5ID0gb3B0YXZwOworCQkKKwkJaWYgKGlzX2dyb3VwZWQpIHsKKwkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcoIG9wdF9tb2RlbCwgMCwgJm9wdGF2cF9jcHkpICk7CisJCX0gZWxzZSB7CisJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3KCBOVUxMLCBBVlBGTF9TRVRfQkxBTktfVkFMVUUgfCBBVlBGTF9TRVRfUkFXREFUQV9GUk9NX0FWUCwgJm9wdGF2cF9jcHkpICk7CisJCQorCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2hkcihvcHRhdnAsICZvcHRfaGRyKSApOworCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2hkcihvcHRhdnBfY3B5LCAmb3B0Y3B5X2hkcikgKTsKKwkJCW1lbWNweShvcHRjcHlfaGRyLCBvcHRfaGRyLCBzaXplb2Yoc3RydWN0IGF2cF9oZHIpKTsKKwkJfQorCQkKKwkJLyogQWRkIHRoZSBwYXNzZWQgQVZQIGluc2lkZSBpdCAqLworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkKCBhdnBfRkFWUCwgTVNHX0JSV19MQVNUX0NISUxELCBvcHRhdnBfY3B5ICkgKTsKKwkJCisJCS8qIEFuZCBhZGQgdG8gdGhlIG1lc3NhZ2UgKi8KKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCggbXNnLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cF9GQVZQICkgKTsKKwl9CisJCisJCisJLyogRGVhbCB3aXRoIHRoZSAnRScgYml0IGFuZCB0aGUgZXJyb3IgbWVzc2FnZSAqLworCXN3aXRjaCAocmNfdmFsIC8gMTAwMCkgeworCQljYXNlIDE6CS8qIEluZm9ybWF0aW9uYWwgKi8KKwkJY2FzZSAyOiAvKiBTdWNjZXNzICovCisJCQkvKiBOb3RoaW5nIHNwZWNpYWwgaGVyZTogbm8gRSBiaXQsIG5vIGVycm9yIG1lc3NhZ2UgdW5sZXNzIG9uZSBpcyBzcGVjaWZpZWQgKi8KKwkJCWJyZWFrOworCQkJCisJCWNhc2UgMzogLyogUHJvdG9jb2wgRXJyb3JzICovCisJCQlzZXRfZV9iaXQgPSAxOworCQkJc3RkX2Vycl9tc2cgPSAxOworCQkJYnJlYWs7CisJCQkKKwkJY2FzZSA0OiAvKiBUcmFuc2NpZW50IEZhaWx1cmUgKi8KKwkJY2FzZSA1OiAvKiBQZXJtYW5lbnQgRmFpbHVyZSAqLworCQlkZWZhdWx0OgorCQkJc3RkX2Vycl9tc2cgPSAxOworCQkJYnJlYWs7CisJCQkKKwl9CisJCisJeworCQlzdHJ1Y3QgbXNnX2hkciAqIGhkciA9IE5VTEw7CisJCQorCQlDSEVDS19GQ1QoICBmZF9tc2dfaGRyKCBtc2csICZoZHIgKSAgKTsKKwkJCisJCWlmIChzZXRfZV9iaXQpCisJCQloZHItPm1zZ19mbGFncyB8PSBDTURfRkxBR19FUlJPUjsKKwkJZWxzZQorCQkJaGRyLT5tc2dfZmxhZ3MgJj0gfiBDTURfRkxBR19FUlJPUjsKKwl9CisJCisJaWYgKHN0ZF9lcnJfbXNnIHx8IGVycm9ybXNnKSB7CisJCS8qIEFkZCB0aGUgRXJyb3ItTWVzc2FnZSBBVlAgKi8KKwkJCisJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcoIGRpY3RfYXZwX0VNLCAwLCAmYXZwX0VNICkgKTsKKworCQkvKiBTZXQgaXRzIHZhbHVlICovCisJCW1lbXNldCgmdmFsLCAwLCBzaXplb2YodmFsKSk7CisJCQorCQlpZiAoZXJyb3Jtc2cpIHsKKwkJCXZhbC5vcy5kYXRhID0gKHVpbnQ4X3QgKillcnJvcm1zZzsKKwkJCXZhbC5vcy5sZW4gID0gc3RybGVuKGVycm9ybXNnKTsKKwkJfSBlbHNlIHsKKwkJCXZhbC5vcy5kYXRhID0gKHVpbnQ4X3QgKilyZXNjb2RlOworCQkJdmFsLm9zLmxlbiAgPSBzdHJsZW4ocmVzY29kZSk7CisJCX0KKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX3NldHZhbHVlKCBhdnBfRU0sICZ2YWwgKSApOworCisJCS8qIEFkZCBpdCB0byB0aGUgbWVzc2FnZSAqLworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkKCBtc2csIE1TR19CUldfTEFTVF9DSElMRCwgYXZwX0VNICkgKTsKKwl9CisJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmRfbXNnX3NlbmRfaW50KCBzdHJ1Y3QgbXNnICoqIHBtc2csIHZvaWQgKCphbnNjYikodm9pZCAqLCBzdHJ1Y3QgbXNnICoqKSwgdm9pZCAqIGRhdGEsIHZvaWQgKCpleHBpcmVjYikodm9pZCAqLCBEaWFtSWRfdCwgc2l6ZV90LCBzdHJ1Y3QgbXNnICoqKSwgY29uc3Qgc3RydWN0IHRpbWVzcGVjICp0aW1lb3V0ICkKK3sKKwlzdHJ1Y3QgbXNnX2hkciAqaGRyOworCURpYW1JZF90IGRpYW1pZDsKKwkKKwkvKiBTYXZlIHRoZSBjYWxsYmFjayBpbiB0aGUgbWVzc2FnZSwgd2l0aCB0aGUgdGltZW91dCAqLworCUNIRUNLX0ZDVCggIGZkX21zZ19hbnNjYl9hc3NvY2lhdGUoICpwbXNnLCBhbnNjYiwgZGF0YSwgZXhwaXJlY2IsIHRpbWVvdXQgKSAgKTsKKwkKKwkvKiBJZiB0aGlzIGlzIGEgbmV3IHJlcXVlc3QsIGNhbGwgdGhlIEhPT0tfTUVTU0FHRV9MT0NBTCBob29rICovCisJaWYgKCAoZmRfbXNnX2hkcigqcG1zZywgJmhkcikgPT0gMCkKKwkgJiYgIChoZHItPm1zZ19mbGFncyAmIENNRF9GTEFHX1JFUVVFU1QpCisJICYmICAoZmRfbXNnX3NvdXJjZV9nZXQoKnBtc2csICZkaWFtaWQsIE5VTEwpID09IDApCisJICYmICAoZGlhbWlkID09IE5VTEwpKSB7CisJCWZkX2hvb2tfY2FsbChIT09LX01FU1NBR0VfTE9DQUwsICpwbXNnLCBOVUxMLCBOVUxMLCBmZF9tc2dfcG1kbF9nZXQoKnBtc2cpKTsKKwl9CisJCQorCS8qIFBvc3QgdGhlIG1lc3NhZ2UgaW4gdGhlIG91dGdvaW5nIHF1ZXVlICovCisJQ0hFQ0tfRkNUKCBmZF9maWZvX3Bvc3QoZmRfZ19vdXRnb2luZywgcG1zZykgKTsKKwkKKwlyZXR1cm4gMDsKK30KKworLyogU2VuZCBhIG1lc3NhZ2UgYW5kIG9wdGlvbmFsbHkgcmVnaXN0ZXIgYSBjYWxsYmFjayBmb3IgYW4gYW5zd2VyICovCitpbnQgZmRfbXNnX3NlbmQgKCBzdHJ1Y3QgbXNnICoqIHBtc2csIHZvaWQgKCphbnNjYikodm9pZCAqLCBzdHJ1Y3QgbXNnICoqKSwgdm9pZCAqIGRhdGEgKQoreworCVRSQUNFX0VOVFJZKCIlcCAlcCAlcCIsIHBtc2csIGFuc2NiLCBkYXRhKTsKKwlDSEVDS19QQVJBTVMoIHBtc2cgKTsKKwkKKwlyZXR1cm4gZmRfbXNnX3NlbmRfaW50KHBtc2csIGFuc2NiLCBkYXRhLCBOVUxMLCBOVUxMKTsKK30KKworLyogVGhlIHZhcmlhdGlvbiBvZiB0aGUgc2FtZSBmdW5jdGlvbiB3aXRoIGEgdGltZW91dCBjYWxsYmFjayAqLworaW50IGZkX21zZ19zZW5kX3RpbWVvdXQgKCBzdHJ1Y3QgbXNnICoqIHBtc2csIHZvaWQgKCphbnNjYikodm9pZCAqLCBzdHJ1Y3QgbXNnICoqKSwgdm9pZCAqIGRhdGEsIHZvaWQgKCpleHBpcmVjYikodm9pZCAqLCBEaWFtSWRfdCwgc2l6ZV90LCBzdHJ1Y3QgbXNnICoqKSwgY29uc3Qgc3RydWN0IHRpbWVzcGVjICp0aW1lb3V0ICkKK3sKKwlUUkFDRV9FTlRSWSgiJXAgJXAgJXAgJXAgJXAiLCBwbXNnLCBhbnNjYiwgZGF0YSwgZXhwaXJlY2IsIHRpbWVvdXQpOworCUNIRUNLX1BBUkFNUyggcG1zZyAmJiBleHBpcmVjYiAmJiB0aW1lb3V0ICk7CisJCisJcmV0dXJuIGZkX21zZ19zZW5kX2ludChwbXNnLCBhbnNjYiwgZGF0YSwgZXhwaXJlY2IsIHRpbWVvdXQpOworfQorCisKKy8qIFBhcnNlIGEgbWVzc2FnZSBhZ2FpbnN0IG91ciBkaWN0aW9uYXJ5LCBhbmQgaW4gY2FzZSBvZiBlcnJvciBsb2cgYW5kIGV2ZW50dWFsbHkgYnVpbGQgdGhlIGVycm9yIHJlcGx5IC0tIHJldHVybnMgdGhlIHBhcnNpbmcgc3RhdHVzICovCitpbnQgZmRfbXNnX3BhcnNlX29yX2Vycm9yKCBzdHJ1Y3QgbXNnICoqIG1zZywgc3RydWN0IG1zZyAqKmVycm9yKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBtc2cgKiBtOworCXN0cnVjdCBtc2dfaGRyICogaGRyID0gTlVMTDsKKwlzdHJ1Y3QgZmRfcGVpCXBlaTsKKwkKKwlUUkFDRV9FTlRSWSgiJXAiLCBtc2cpOworCQorCUNIRUNLX1BBUkFNUyhtc2cgJiYgKm1zZyAmJiBlcnJvcik7CisJbSA9ICptc2c7CisJKmVycm9yID0gTlVMTDsKKwkKKwkvKiBQYXJzZSB0aGUgbWVzc2FnZSBhZ2FpbnN0IG91ciBkaWN0aW9uYXJ5ICovCisJcmV0ID0gZmRfbXNnX3BhcnNlX3J1bGVzICggbSwgZmRfZ19jb25maWctPmNuZl9kaWN0LCAmcGVpKTsKKwlpZiAJKChyZXQgIT0gRUJBRE1TRykgCS8qIFBhcnNpbmcgZ3JvdXBlZCBBVlAgZmFpbGVkIC8gQ29uZmxpY3RpbmcgcnVsZSBmb3VuZCAqLworCQkmJiAocmV0ICE9IEVOT1RTVVApKQkvKiBDb21tYW5kIGlzIG5vdCBzdXBwb3J0ZWQgLyBNYW5kYXRvcnkgQVZQIGlzIG5vdCBzdXBwb3J0ZWQgKi8KKwkJcmV0dXJuIHJldDsgLyogMCBvciBhbm90aGVyIGVycm9yICovCisJCisJLyogTG9nICovCisJZmRfaG9va19jYWxsKEhPT0tfTUVTU0FHRV9QQVJTSU5HX0VSUk9SLCBtLCBOVUxMLCBwZWkucGVpX21lc3NhZ2UgPzogcGVpLnBlaV9lcnJjb2RlLCBmZF9tc2dfcG1kbF9nZXQobSkpOworCQorCUNIRUNLX0ZDVCggZmRfbXNnX2hkcihtLCAmaGRyKSApOworCQorCS8qIE5vdyBjcmVhdGUgYW4gYW5zd2VyIGVycm9yIGlmIHRoZSBtZXNzYWdlIGlzIGEgcXVlcnkgKi8KKwlpZiAoaGRyLT5tc2dfZmxhZ3MgJiBDTURfRkxBR19SRVFVRVNUKSB7CisJCQorCQkvKiBDcmVhdGUgdGhlIGVycm9yIG1lc3NhZ2UgKi8KKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfbmV3X2Fuc3dlcl9mcm9tX3JlcSAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgJm0sIHBlaS5wZWlfcHJvdG9lcnIgPyBNU0dGTF9BTlNXX0VSUk9SIDogMCApICk7CisJCQorCQkvKiBTZXQgdGhlIGVycm9yIGNvZGUgKi8KKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfcmVzY29kZV9zZXQobSwgcGVpLnBlaV9lcnJjb2RlLCBwZWkucGVpX21lc3NhZ2UsIHBlaS5wZWlfYXZwLCAxICkgKTsKKwkJCisJCS8qIGZyZWUgdGhlIHBlaSBBVlAgdG8gYXZvaWQgbWVtb3J5IGxlYWsgKi8KKwkJaWYgKHBlaS5wZWlfYXZwX2ZyZWUpIHsKKwkJCWZkX21zZ19mcmVlKHBlaS5wZWlfYXZwKTsKKwkJfQorCQkKKwkJKm1zZyA9IE5VTEw7CisJCSplcnJvciA9IG07CisJCQorCX0gZWxzZSB7CisJCWRvIHsgLyogUmVzY3VlIGVycm9yIG1lc3NhZ2VzICovCisJCQlzdHJ1Y3QgYXZwICogYXZwOworCQkJdW5pb24gYXZwX3ZhbHVlICogcmMgPSBOVUxMOworCQkJCisJCQkvKiBTZWFyY2ggdGhlIFJlc3VsdC1Db2RlIEFWUCAqLworCQkJQ0hFQ0tfRkNUX0RPKCAgZmRfbXNnX2Jyb3dzZSgqbXNnLCBNU0dfQlJXX0ZJUlNUX0NISUxELCAmYXZwLCBOVUxMKSwgYnJlYWsgICk7CisJCQl3aGlsZSAoYXZwKSB7CisJCQkJc3RydWN0IGF2cF9oZHIgKiBhaGRyOworCQkJCUNIRUNLX0ZDVF9ETyggIGZkX21zZ19hdnBfaGRyKCBhdnAsICZhaGRyICksIGJyZWFrICApOworCQkJCQorCQkJCWlmICgoYWhkci0+YXZwX2NvZGUgPT0gQUNfUkVTVUxUX0NPREUpICYmICghIChhaGRyLT5hdnBfZmxhZ3MgJiBBVlBfRkxBR19WRU5ET1IpKSApIHsKKwkJCQkJLyogUGFyc2UgdGhpcyBBVlAgKi8KKwkJCQkJQVNTRVJUKCBhaGRyLT5hdnBfdmFsdWUgKTsKKwkJCQkJcmMgPSBhaGRyLT5hdnBfdmFsdWU7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkKKwkJCQkvKiBHbyB0byBuZXh0IEFWUCAqLworCQkJCUNIRUNLX0ZDVF9ETyggIGZkX21zZ19icm93c2UoYXZwLCBNU0dfQlJXX05FWFQsICZhdnAsIE5VTEwpLCBicmVhayAgKTsKKwkJCX0KKwkJCQorCQkJaWYgKHJjKSB7CisJCQkJc3dpdGNoIChyYy0+dTMyIC8gMTAwMCkgeworCQkJCQljYXNlIDE6CS8qIDF4eHggOiBJbmZvcm1hdGlvbmFsICovCisJCQkJCWNhc2UgMjoJLyogMnh4eCA6IFN1Y2VzcyAqLworCQkJCQkJLyogSW4gdGhlc2UgY2FzZXMsIHdlIHdhbnQgdGhlIG1lc3NhZ2UgdG8gdmFsaWRhdGUgdGhlIEFCTkYsIHNvIHdlIHdpbGwgZGlzY2FyZCB0aGUgYmFkIG1lc3NhZ2UgKi8KKwkJCQkJCWJyZWFrOworCQkJCQkJCisJCQkJCWRlZmF1bHQ6IC8qIE90aGVyIGVycm9ycyAqLworCQkJCQkJLyogV2UgbGV0IHRoZSBhcHBsaWNhdGlvbiBkZWNpZGUgd2hhdCB0byBkbyB3aXRoIHRoZSBtZXNzYWdlLCB3ZSByZXNjdWUgaXQgKi8KKwkJCQkJCSplcnJvciA9IG07CisJCQkJfQorCQkJfQorCQl9IHdoaWxlICgwKTsKKwl9CisJCisJcmV0dXJuIEVCQURNU0c7IC8qIFdlIGNvbnZlcnQgRU5PVFNVUCB0byBFQkFETVNHIGFzIHdlbGwgKi8KK30KZGlmZiAtLWdpdCBhL2xpYmZkY29yZS9wX2NlLmMgYi9saWJmZGNvcmUvcF9jZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNGNkMTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJmZGNvcmUvcF9jZS5jCkBAIC0wLDAgKzEsMTEwMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTUsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiZmRjb3JlLWludGVybmFsLmgiCisKKy8qIFRoaXMgZmlsZSBjb250YWlucyBjb2RlIHRvIGhhbmRsZSBDYXBhYmlsaXRpZXMgRXhjaGFuZ2UgbWVzc2FnZXMgKENFUiBhbmQgQ0VBKSBhbmQgZWxlY3Rpb24gcHJvY2VzcyAqLworCisvKiBTYXZlIGEgY29ubmVjdGlvbiBhcyBwZWVyJ3MgcHJpbmNpcGFsICovCitzdGF0aWMgaW50IHNldF9wZWVyX2NueChzdHJ1Y3QgZmRfcGVlciAqIHBlZXIsIHN0cnVjdCBjbnhjdHggKipjbngpCit7CisJQ0hFQ0tfUEFSQU1TKCBwZWVyLT5wX2NueGN0eCA9PSBOVUxMICk7CisJCisJLyogU2F2ZSB0aGUgY29ubmVjdGlvbiBpbiBwZWVyICovCisJcGVlci0+cF9jbnhjdHggPSAqY254OworCSpjbnggPSBOVUxMOworCQorCS8qIFNldCB0aGUgZXZlbnRzIHRvIGJlIHNlbnQgdG8gdGhlIFBTTSAqLworCUNIRUNLX0ZDVCggZmRfY254X3JlY3Zfc2V0YWx0ZmlmbyhwZWVyLT5wX2NueGN0eCwgcGVlci0+cF9ldmVudHMpICk7CisJCisJLyogUmVhZCB0aGUgY3JlZGVudGlhbHMgaWYgcG9zc2libGUgKi8KKwlpZiAoZmRfY254X2dldFRMUyhwZWVyLT5wX2NueGN0eCkpIHsKKwkJQ0hFQ0tfRkNUKCBmZF9jbnhfZ2V0Y3JlZChwZWVyLT5wX2NueGN0eCwgJnBlZXItPnBfaGRyLmluZm8ucnVudGltZS5waXJfY2VydF9saXN0LCAmcGVlci0+cF9oZHIuaW5mby5ydW50aW1lLnBpcl9jZXJ0X2xpc3Rfc2l6ZSkgKTsKKwl9CisJCisJLyogUmVhZCB0aGUgZW5kcG9pbnRzLCBtYXliZSB1c2VkIHRvIHJlY29ubmVjdCB0byB0aGUgcGVlciBsYXRlciAqLworCUNIRUNLX0ZDVCggZmRfY254X2dldHJlbW90ZWVwcyhwZWVyLT5wX2NueGN0eCwgJnBlZXItPnBfaGRyLmluZm8ucGlfZW5kcG9pbnRzKSApOworCQorCS8qIFJlYWQgdGhlIHByb3RvY29sICovCisJcGVlci0+cF9oZHIuaW5mby5ydW50aW1lLnBpcl9wcm90byA9IGZkX2NueF9nZXRwcm90byhwZWVyLT5wX2NueGN0eCk7CisJCisJcmV0dXJuIDA7Cit9CisKKy8qIERlbGV0ZSB0aGUgcGVlciBjb25uZWN0aW9uLCBhbmQgY2xlYW51cCBhc3NvY2lhdGVkIGluZm9ybWF0aW9uICovCit2b2lkIGZkX3BfY2VfY2xlYXJfY254KHN0cnVjdCBmZF9wZWVyICogcGVlciwgc3RydWN0IGNueGN0eCAqKiBjbnhfa2VwdCkKK3sKKwlwZWVyLT5wX2hkci5pbmZvLnJ1bnRpbWUucGlyX2NlcnRfbGlzdCA9IE5VTEw7CisJcGVlci0+cF9oZHIuaW5mby5ydW50aW1lLnBpcl9jZXJ0X2xpc3Rfc2l6ZSA9IDA7CisJcGVlci0+cF9oZHIuaW5mby5ydW50aW1lLnBpcl9wcm90byA9IDA7CisJCisJaWYgKHBlZXItPnBfY254Y3R4KSB7CisJCWlmIChjbnhfa2VwdCAhPSBOVUxMKSB7CisJCQkqY254X2tlcHQgPSBwZWVyLT5wX2NueGN0eDsKKwkJfSBlbHNlIHsKKwkJCWZkX2NueF9kZXN0cm95KHBlZXItPnBfY254Y3R4KTsKKwkJfQorCQlwZWVyLT5wX2NueGN0eCA9IE5VTEw7CisJfQorfQorCisvKiBFbGVjdGlvbjogY29tcGFyZSB0aGUgRGlhbWV0ZXIgSWRzIGJ5IGxleGljYWwgb3JkZXIsIHJldHVybiB0cnVlIGlmIHRoZSBlbGVjdGlvbiBpcyB3b24gKi8KK3N0YXRpYyBfX2lubGluZV9fIGludCBlbGVjdGlvbl9yZXN1bHQoc3RydWN0IGZkX3BlZXIgKiBwZWVyKQoreworCWludCByZXQgPSAoc3RyY2FzZWNtcChwZWVyLT5wX2hkci5pbmZvLnBpX2RpYW1pZCwgZmRfZ19jb25maWctPmNuZl9kaWFtaWQpIDwgMCk7CisJaWYgKHJldCkgeworCQlUUkFDRV9ERUJVRyhJTkZPLCAiRWxlY3Rpb24gV09OIGFnYWluc3QgcGVlciAnJXMnIiwgcGVlci0+cF9oZHIuaW5mby5waV9kaWFtaWQpOworCX0gZWxzZSB7CisJCVRSQUNFX0RFQlVHKElORk8sICJFbGVjdGlvbiBMT1NUIGFnYWluc3QgcGVlciAnJXMnIiwgcGVlci0+cF9oZHIuaW5mby5waV9kaWFtaWQpOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKiBBZGQgQVZQcyBhYm91dCBsb2NhbCBpbmZvcm1hdGlvbiBpbiBhIENFUiBvciBDRUEgKi8KK3N0YXRpYyBpbnQgYWRkX0NFX2luZm8oc3RydWN0IG1zZyAqbXNnLCBzdHJ1Y3QgY254Y3R4ICogY254LCBpbnQgaXNpX3RscywgaW50IGlzaV9ub25lKQoreworCXN0cnVjdCBkaWN0X29iamVjdCAqIGRpY3RvYmogPSBOVUxMOworCXN0cnVjdCBhdnAgKiBhdnAgPSBOVUxMOworCXVuaW9uIGF2cF92YWx1ZSB2YWw7CisJc3RydWN0IGZkX2xpc3QgKmxpOworCQorCS8qIEFkZCB0aGUgT3JpZ2luLSogQVZQcyAqLworCUNIRUNLX0ZDVCggZmRfbXNnX2FkZF9vcmlnaW4gKCBtc2csIDEgKSApOworCQorCS8qIEZpbmQgdGhlIG1vZGVsIGZvciBIb3N0LUlQLUFkZHJlc3MgQVZQICovCisJQ0hFQ0tfRkNUKCAgZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiSG9zdC1JUC1BZGRyZXNzIiwgJmRpY3RvYmosIEVOT0VOVCApICApOworCQkKKwkvKiBBZGQgdGhlIEFWUChzKSAtLSBub3Qgc3VyZSB3aGF0IGlzIHRoZSBwdXJwb3NlLi4uIFdlIGNvdWxkIHByb2JhYmx5IG9ubHkgYWRkIHRoZSBwcmltYXJ5IG9uZSA/ICovCisJZm9yIChsaSA9IGZkX2dfY29uZmlnLT5jbmZfZW5kcG9pbnRzLm5leHQ7IGxpICE9ICZmZF9nX2NvbmZpZy0+Y25mX2VuZHBvaW50czsgbGkgPSBsaS0+bmV4dCkgeworCQlzdHJ1Y3QgZmRfZW5kcG9pbnQgKiBlcCA9IChzdHJ1Y3QgZmRfZW5kcG9pbnQgKilsaTsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIGRpY3RvYmosIDAsICZhdnAgKSApOworCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfdmFsdWVfZW5jb2RlICggJmVwLT5zcywgYXZwICkgKTsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCggbXNnLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCApICk7CisJfQorCQorCS8qIFZlbmRvci1JZCwgUHJvZHVjdC1OYW1lLCBhbmQgRmlybXdhcmUtUmV2aXNpb24gQVZQcyAqLworCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiVmVuZG9yLUlkIiwgJmRpY3RvYmosIEVOT0VOVCApICApOworCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBkaWN0b2JqLCAwLCAmYXZwICkgKTsKKwl2YWwudTMyID0gTVlfVkVORE9SX0lEOworCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9zZXR2YWx1ZSggYXZwLCAmdmFsICkgKTsKKwlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkKCBtc2csIE1TR19CUldfTEFTVF9DSElMRCwgYXZwICkgKTsKKwkKKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIlByb2R1Y3QtTmFtZSIsICZkaWN0b2JqLCBFTk9FTlQgKSAgKTsKKwlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3ICggZGljdG9iaiwgMCwgJmF2cCApICk7CisJdmFsLm9zLmRhdGEgPSAodW5zaWduZWQgY2hhciAqKUZEX1BST0pFQ1RfTkFNRTsKKwl2YWwub3MubGVuID0gc3RybGVuKEZEX1BST0pFQ1RfTkFNRSk7CisJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX3NldHZhbHVlKCBhdnAsICZ2YWwgKSApOworCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQoIG1zZywgTVNHX0JSV19MQVNUX0NISUxELCBhdnAgKSApOworCQorCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiRmlybXdhcmUtUmV2aXNpb24iLCAmZGljdG9iaiwgRU5PRU5UICkgICk7CisJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIGRpY3RvYmosIDAsICZhdnAgKSApOworCXZhbC51MzIgPSAodWludDMyX3QpKEZEX1BST0pFQ1RfVkVSU0lPTl9NQUpPUiAqIDEwMDAwICsgRkRfUFJPSkVDVF9WRVJTSU9OX01JTk9SICogMTAwICsgRkRfUFJPSkVDVF9WRVJTSU9OX1JFVik7CisJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX3NldHZhbHVlKCBhdnAsICZ2YWwgKSApOworCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQoIG1zZywgTVNHX0JSV19MQVNUX0NISUxELCBhdnAgKSApOworCQorCQorCS8qIEFkZCB0aGUgSW5iYW5kLVNlY3VyaXR5LUlkIEFWUCBpZiBuZWVkZWQgKi8KKwlpZiAoaXNpX3RscyB8fCBpc2lfbm9uZSkgeworCQlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIkluYmFuZC1TZWN1cml0eS1JZCIsICZkaWN0b2JqLCBFTk9FTlQgKSAgKTsKKwkJCisJCWlmIChpc2lfbm9uZSkgeworCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIGRpY3RvYmosIDAsICZhdnAgKSApOworCQkJdmFsLnUzMiA9IEFDVl9JU0lfTk9fSU5CQU5EX1NFQ1VSSVRZOworCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX3NldHZhbHVlKCBhdnAsICZ2YWwgKSApOworCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCggbXNnLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCApICk7CisJCX0KKwkJCisJCWlmIChpc2lfdGxzKSB7CisJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3ICggZGljdG9iaiwgMCwgJmF2cCApICk7CisJCQl2YWwudTMyID0gQUNWX0lTSV9UTFM7CisJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUoIGF2cCwgJnZhbCApICk7CisJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkKCBtc2csIE1TR19CUldfTEFTVF9DSElMRCwgYXZwICkgKTsKKwkJfQorCX0KKwkKKwkvKiBMaXN0IG9mIGxvY2FsIGFwcGxpY2F0aW9ucyAqLworCXsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogZGljdG9ial9hdXRoID0gTlVMTDsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogZGljdG9ial9hY2N0ID0gTlVMTDsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogZGljdG9ial92aWQgPSBOVUxMOworCQkKKwkJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJWZW5kb3ItU3BlY2lmaWMtQXBwbGljYXRpb24tSWQiLCAmZGljdG9iaiwgRU5PRU5UICkgICk7CisJCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiVmVuZG9yLUlkIiwgJmRpY3RvYmpfdmlkLCBFTk9FTlQgKSAgKTsKKwkJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJBdXRoLUFwcGxpY2F0aW9uLUlkIiwgJmRpY3RvYmpfYXV0aCwgRU5PRU5UICkgICk7CisJCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiQWNjdC1BcHBsaWNhdGlvbi1JZCIsICZkaWN0b2JqX2FjY3QsIEVOT0VOVCApICApOworCQkKKwkJZm9yIChsaSA9IGZkX2dfY29uZmlnLT5jbmZfYXBwcy5uZXh0OyBsaSAhPSAmZmRfZ19jb25maWctPmNuZl9hcHBzOyBsaSA9IGxpLT5uZXh0KSB7CisJCQlzdHJ1Y3QgZmRfYXBwICogYSA9IChzdHJ1Y3QgZmRfYXBwICopKGxpKTsKKworCQkJaWYgKGEtPmZsYWdzLmF1dGgpIHsKKwkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3ICggZGljdG9ial9hdXRoLCAwLCAmYXZwICkgKTsKKwkJCQl2YWwudTMyID0gYS0+YXBwaWQ7CisJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX3NldHZhbHVlKCBhdnAsICZ2YWwgKSApOworCQkJCWlmIChhLT52bmRpZCAhPSAwKSB7CisJCQkJCXN0cnVjdCBhdnAgKiBhdnAyID0gTlVMTDsKKwkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIGRpY3RvYmosIDAsICZhdnAyICkgKTsKKwkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCggYXZwMiwgTVNHX0JSV19MQVNUX0NISUxELCBhdnAgKSApOworCQkJCQlhdnAgPSBhdnAyOworCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3ICggZGljdG9ial92aWQsIDAsICZhdnAyICkgKTsKKwkJCQkJdmFsLnUzMiA9IGEtPnZuZGlkOworCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUoIGF2cDIsICZ2YWwgKSApOworCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkKCBhdnAsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwMiApICk7CisJCQkJfQorCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQoIG1zZywgTVNHX0JSV19MQVNUX0NISUxELCBhdnAgKSApOworCQkJfQorCQkJaWYgKGEtPmZsYWdzLmFjY3QpIHsKKwkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3ICggZGljdG9ial9hY2N0LCAwLCAmYXZwICkgKTsKKwkJCQl2YWwudTMyID0gYS0+YXBwaWQ7CisJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX3NldHZhbHVlKCBhdnAsICZ2YWwgKSApOworCQkJCWlmIChhLT52bmRpZCAhPSAwKSB7CisJCQkJCXN0cnVjdCBhdnAgKiBhdnAyID0gTlVMTDsKKwkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIGRpY3RvYmosIDAsICZhdnAyICkgKTsKKwkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX2FkZCggYXZwMiwgTVNHX0JSV19MQVNUX0NISUxELCBhdnAgKSApOworCQkJCQlhdnAgPSBhdnAyOworCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfbmV3ICggZGljdG9ial92aWQsIDAsICZhdnAyICkgKTsKKwkJCQkJdmFsLnUzMiA9IGEtPnZuZGlkOworCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUoIGF2cDIsICZ2YWwgKSApOworCQkJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkKCBhdnAsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwMiApICk7CisJCQkJfQorCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQoIG1zZywgTVNHX0JSV19MQVNUX0NISUxELCBhdnAgKSApOworCQkJfQorCQl9CisJCQorCQkvKiBkbyBub3QgZm9yZ2V0IHRoZSByZWxheSBhcHBsaWNhdGlvbiAqLworCQlpZiAoISBmZF9nX2NvbmZpZy0+Y25mX2ZsYWdzLm5vX2Z3ZCkgeworCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIGRpY3RvYmpfYXV0aCwgMCwgJmF2cCApICk7CisJCQl2YWwudTMyID0gQUlfUkVMQVk7CisJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUoIGF2cCwgJnZhbCApICk7CisJCQlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkKCBtc2csIE1TR19CUldfTEFTVF9DSElMRCwgYXZwICkgKTsKKwkJfQorCX0KKwkKKwkvKiBBZGQgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIHZlbmRvcnMgKi8KKwl7CisJCXVpbnQzMl90ICogYXJyYXkgPSBmZF9kaWN0X2dldF92ZW5kb3JpZF9saXN0KGZkX2dfY29uZmlnLT5jbmZfZGljdCk7CisJCWlmIChhcnJheSkgeworCQkJaW50IGkgPSAwOworCQkJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJTdXBwb3J0ZWQtVmVuZG9yLUlkIiwgJmRpY3RvYmosIEVOT0VOVCApICApOworCQkJCisJCQl3aGlsZSAoYXJyYXlbaV0gIT0gMCkgeworCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9uZXcgKCBkaWN0b2JqLCAwLCAmYXZwICkgKTsKKwkJCQl2YWwudTMyID0gYXJyYXlbaV07CisJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX3NldHZhbHVlKCBhdnAsICZ2YWwgKSApOworCQkJCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQoIG1zZywgTVNHX0JSV19MQVNUX0NISUxELCBhdnAgKSApOworCQkJCWkrKzsKKwkJCX0KKwkJCQorCQkJZnJlZShhcnJheSk7CisJCX0KKwl9CisJCisJcmV0dXJuIDA7Cit9CisKKy8qIFJlbW92ZSBhbnkgaW5mb3JtYXRpb24gc2F2ZWQgZnJvbSBhIHByZXZpb3VzIENFUi9DRUEgZXhjaGFuZ2UgKi8KK3N0YXRpYyB2b2lkIGNsZWFudXBfcmVtb3RlX0NFX2luZm8oc3RydWN0IGZkX3BlZXIgKiBwZWVyKQoreworCS8qIGZyZWUgbGlua2VkIGluZm9ybWF0aW9uICovCisJZnJlZShwZWVyLT5wX2hkci5pbmZvLnJ1bnRpbWUucGlyX3JlYWxtKTsKKwlmcmVlKHBlZXItPnBfaGRyLmluZm8ucnVudGltZS5waXJfcHJvZG5hbWUpOworCXdoaWxlICghRkRfSVNfTElTVF9FTVBUWSgmcGVlci0+cF9oZHIuaW5mby5ydW50aW1lLnBpcl9hcHBzKSkgeworCQlzdHJ1Y3QgZmRfbGlzdCAqIGxpID0gcGVlci0+cF9oZHIuaW5mby5ydW50aW1lLnBpcl9hcHBzLm5leHQ7CisJCWZkX2xpc3RfdW5saW5rKGxpKTsKKwkJZnJlZShsaSk7CisJfQorCS8qIG5vdGU6IHBpcl9jZXJ0X2xpc3QgbmVlZHMgbm90IGJlIGZyZWVkIChiZWxvbmdzIHRvIGdudXRscykgKi8KKwkKKwkvKiBjbGVhbnVwIHRoZSBhcmVhICovCisJbWVtc2V0KCZwZWVyLT5wX2hkci5pbmZvLnJ1bnRpbWUsIDAsIHNpemVvZihwZWVyLT5wX2hkci5pbmZvLnJ1bnRpbWUpKTsKKwkKKwkvKiByZWluaXQgdGhlIGxpc3QgKi8KKwlmZF9saXN0X2luaXQoJnBlZXItPnBfaGRyLmluZm8ucnVudGltZS5waXJfYXBwcywgcGVlcik7CisKKwkvKiBSZW1vdmUgcHJldmlvdXNseSBhZHZlcnRpc2VkIGVuZHBvaW50cyAqLworCWZkX2VwX2NsZWFyZmxhZ3MoICZwZWVyLT5wX2hkci5pbmZvLnBpX2VuZHBvaW50cywgRVBfRkxfQURWICk7Cit9CisKKy8qIEV4dHJhY3QgaW5mb3JtYXRpb24gc2VudCBieSB0aGUgcmVtb3RlIHBlZXIgYW5kIHNhdmUgaXQgaW4gb3VyIHBlZXIgc3RydWN0dXJlICovCitzdGF0aWMgaW50IHNhdmVfcmVtb3RlX0NFX2luZm8oc3RydWN0IG1zZyAqIG1zZywgc3RydWN0IGZkX3BlZXIgKiBwZWVyLCBzdHJ1Y3QgZmRfcGVpICogZXJyb3IsIHVpbnQzMl90ICpyYykKK3sKKwlzdHJ1Y3QgYXZwICogYXZwID0gTlVMTDsKKwkKKwljbGVhbnVwX3JlbW90ZV9DRV9pbmZvKHBlZXIpOworCQorCUNIRUNLX0ZDVCggZmRfbXNnX2Jyb3dzZSggbXNnLCBNU0dfQlJXX0ZJUlNUX0NISUxELCAmYXZwLCBOVUxMKSApOworCQorCS8qIExvb3Agb24gYWxsIEFWUHMgYW5kIHNhdmUgd2hhdCB3ZSBhcmUgaW50ZXJyZXN0ZWQgaW50byAqLworCXdoaWxlIChhdnApIHsKKwkJc3RydWN0IGF2cF9oZHIgKiBoZHI7CisKKwkJQ0hFQ0tfRkNUKCAgZmRfbXNnX2F2cF9oZHIoIGF2cCwgJmhkciApICApOworCisJCWlmIChoZHItPmF2cF9mbGFncyAmIEFWUF9GTEFHX1ZFTkRPUikgeworCQkJLyogSWdub3JlIGFsbCB2ZW5kb3Itc3BlY2lmaWMgQVZQcyBpbiBDRVIvQ0VBIGJlY2F1c2Ugd2UgZG9uJ3Qgc3VwcG9ydCBhbnkgY3VycmVudGx5ICovCisJCQlMT0dfQSgiSWdub3JlZCBhIHZlbmRvci1zcGVjaWZpYyBBVlAgaW4gQ0VSIC8gQ0VBIik7CisJCQlnb3RvIG5leHQ7CisJCX0KKworCQlzd2l0Y2ggKGhkci0+YXZwX2NvZGUpIHsKKwkJCWNhc2UgQUNfUkVTVUxUX0NPREU6IC8qIFJlc3VsdC1Db2RlICovCisJCQkJaWYgKGhkci0+YXZwX3ZhbHVlID09IE5VTEwpIHsKKwkJCQkJLyogVGhpcyBpcyBhIHNhbml0eSBjaGVjayAqLworCQkJCQlMT0dfRigiSWdub3JlZCBhbiBBVlAgKGNvZGUgJXgpIHdpdGggdW5zZXQgdmFsdWUgaW4gQ0VSL0NFQSIsIGhkci0+YXZwX2NvZGUpOworCQkJCQlBU1NFUlQoMCk7IC8qIFRvIGNoZWNrIGlmIHRoaXMgcmVhbGx5IGhhcHBlbnMsIGFuZCB1bmRlcnN0YW5kIHdoeS4uLiAqLworCQkJCQlnb3RvIG5leHQ7CisJCQkJfQorCQkJCQorCQkJCWlmIChyYykKKwkJCQkJKnJjID0gaGRyLT5hdnBfdmFsdWUtPnUzMjsKKwkJCQlicmVhazsKKwkJCisJCQljYXNlIEFDX09SSUdJTl9IT1NUOiAvKiBPcmlnaW4tSG9zdCAqLworCQkJCWlmIChoZHItPmF2cF92YWx1ZSA9PSBOVUxMKSB7CisJCQkJCS8qIFRoaXMgaXMgYSBzYW5pdHkgY2hlY2sgKi8KKwkJCQkJTE9HX0YoIklnbm9yZWQgYW4gQVZQIChjb2RlICV4KSB3aXRoIHVuc2V0IHZhbHVlIGluIENFUi9DRUEiLCBoZHItPmF2cF9jb2RlKTsKKwkJCQkJQVNTRVJUKDApOyAvKiBUbyBjaGVjayBpZiB0aGlzIHJlYWxseSBoYXBwZW5zLCBhbmQgdW5kZXJzdGFuZCB3aHkuLi4gKi8KKwkJCQkJZ290byBuZXh0OworCQkJCX0KKwkJCQkKKwkJCQkvKiBXZSBjaGVjayB0aGF0IHRoZSB2YWx1ZSBtYXRjaGVzIHdoYXQgd2Uga25vdywgb3RoZXJ3aXNlIGRpc2Nvbm5lY3QgdGhlIHBlZXIgKi8KKwkJCQlpZiAoZmRfb3NfYWxtb3N0Y2FzZXNyY2goaGRyLT5hdnBfdmFsdWUtPm9zLmRhdGEsIGhkci0+YXZwX3ZhbHVlLT5vcy5sZW4sIAorCQkJCQkJCXBlZXItPnBfaGRyLmluZm8ucGlfZGlhbWlkLCBwZWVyLT5wX2hkci5pbmZvLnBpX2RpYW1pZGxlbiwgTlVMTCkpIHsKKwkJCQkJVFJBQ0VfREVCVUcoSU5GTywgIlJlY2VpdmVkIGEgbWVzc2FnZSB3aXRoIE9yaWdpbi1Ib3N0IHNldCB0byAnJS4qcycgd2hpbGUgZXhwZWN0aW5nICclcyciLCAKKwkJCQkJCQkoaW50KWhkci0+YXZwX3ZhbHVlLT5vcy5sZW4sIGhkci0+YXZwX3ZhbHVlLT5vcy5kYXRhLCBwZWVyLT5wX2hkci5pbmZvLnBpX2RpYW1pZCk7CisJCQkJCWVycm9yLT5wZWlfZXJyY29kZSA9ICJESUFNRVRFUl9BVlBfTk9UX0FMTE9XRUQiOworCQkJCQllcnJvci0+cGVpX21lc3NhZ2UgPSAiWW91ciBPcmlnaW4tSG9zdCB2YWx1ZSBkb2VzIG5vdCBtYXRjaCBteSBjb25maWd1cmF0aW9uLiI7CisJCQkJCWVycm9yLT5wZWlfYXZwID0gYXZwOworCQkJCQlyZXR1cm4gRUlOVkFMOworCQkJCX0KKworCQkJCWJyZWFrOworCQkKKwkJCWNhc2UgQUNfT1JJR0lOX1JFQUxNOiAvKiBPcmlnaW4tUmVhbG0gKi8KKwkJCQlpZiAoaGRyLT5hdnBfdmFsdWUgPT0gTlVMTCkgeworCQkJCQkvKiBUaGlzIGlzIGEgc2FuaXR5IGNoZWNrICovCisJCQkJCUxPR19GKCJJZ25vcmVkIGFuIEFWUCAoY29kZSAleCkgd2l0aCB1bnNldCB2YWx1ZSBpbiBDRVIvQ0VBIiwgaGRyLT5hdnBfY29kZSk7CisJCQkJCUFTU0VSVCgwKTsgLyogVG8gY2hlY2sgaWYgdGhpcyByZWFsbHkgaGFwcGVucywgYW5kIHVuZGVyc3RhbmQgd2h5Li4uICovCisJCQkJCWdvdG8gbmV4dDsKKwkJCQl9CisJCQkJCisJCQkJLyogSW4gY2FzZSBvZiBtdWx0aXBsZSBBVlBzICovCisJCQkJaWYgKHBlZXItPnBfaGRyLmluZm8ucnVudGltZS5waXJfcmVhbG0pIHsKKwkJCQkJVFJBQ0VfREVCVUcoSU5GTywgIk11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUgT3JpZ2luLVJlYWxtIEFWUCIpOworCQkJCQllcnJvci0+cGVpX2VycmNvZGUgPSAiRElBTUVURVJfQVZQX09DQ1VSU19UT09fTUFOWV9USU1FUyI7CisJCQkJCWVycm9yLT5wZWlfbWVzc2FnZSA9ICJJIGZvdW5kIHNldmVyYWwgT3JpZ2luLVJlYWxtIEFWUHMiOworCQkJCQllcnJvci0+cGVpX2F2cCA9IGF2cDsKKwkJCQkJcmV0dXJuIEVJTlZBTDsKKwkJCQl9CisJCQkJCisJCQkJLyogSWYgdGhlIG9jdGV0IHN0cmluZyBjb250YWlucyBhIFwwICovCisJCQkJaWYgKCFmZF9vc19pc192YWxpZF9EaWFtZXRlcklkZW50aXR5KGhkci0+YXZwX3ZhbHVlLT5vcy5kYXRhLCBoZHItPmF2cF92YWx1ZS0+b3MubGVuKSkgeworCQkJCQllcnJvci0+cGVpX2VycmNvZGUgPSAiRElBTUVURVJfSU5WQUxJRF9BVlBfVkFMVUUiOworCQkJCQllcnJvci0+cGVpX21lc3NhZ2UgPSAiWW91ciBPcmlnaW4tUmVhbG0gY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzLiI7CisJCQkJCWVycm9yLT5wZWlfYXZwID0gYXZwOworCQkJCQlyZXR1cm4gRUlOVkFMOworCQkJCX0KKwkJCQkKKwkJCQkvKiBTYXZlIHRoZSB2YWx1ZSAqLworCQkJCUNIRUNLX01BTExPQyggIHBlZXItPnBfaGRyLmluZm8ucnVudGltZS5waXJfcmVhbG0gPSBvczBkdXAoIGhkci0+YXZwX3ZhbHVlLT5vcy5kYXRhLCBoZHItPmF2cF92YWx1ZS0+b3MubGVuICkgICk7CisJCQkJcGVlci0+cF9oZHIuaW5mby5ydW50aW1lLnBpcl9yZWFsbWxlbiA9IGhkci0+YXZwX3ZhbHVlLT5vcy5sZW47CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQUNfSE9TVF9JUF9BRERSRVNTOiAvKiBIb3N0LUlQLUFkZHJlc3MgKi8KKwkJCQlpZiAoaGRyLT5hdnBfdmFsdWUgPT0gTlVMTCkgeworCQkJCQkvKiBUaGlzIGlzIGEgc2FuaXR5IGNoZWNrICovCisJCQkJCUxPR19GKCJJZ25vcmVkIGFuIEFWUCAoY29kZSAleCkgd2l0aCB1bnNldCB2YWx1ZSBpbiBDRVIvQ0VBIiwgaGRyLT5hdnBfY29kZSk7CisJCQkJCUFTU0VSVCgwKTsgLyogVG8gY2hlY2sgaWYgdGhpcyByZWFsbHkgaGFwcGVucywgYW5kIHVuZGVyc3RhbmQgd2h5Li4uICovCisJCQkJCWdvdG8gbmV4dDsKKwkJCQl9CisJCQkJeworCQkJCQlzU1MJc3M7CisKKwkJCQkJLyogR2V0IHRoZSBzb2NrYWRkciB2YWx1ZSAqLworCQkJCQltZW1zZXQoJnNzLCAwLCBzaXplb2Yoc3MpKTsKKwkJCQkJQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfYXZwX3ZhbHVlX2ludGVycHJldCggYXZwLCAmc3MpLAorCQkJCQkJeworCQkJCQkJCS8qIGluIGNhc2Ugb2YgZXJyb3IsIGFzc3VtZSB0aGUgQVZQIHZhbHVlIHdhcyB3cm9uZyAqLworCQkJCQkJCWVycm9yLT5wZWlfZXJyY29kZSA9ICJESUFNRVRFUl9JTlZBTElEX0FWUF9WQUxVRSI7CisJCQkJCQkJZXJyb3ItPnBlaV9hdnAgPSBhdnA7CisJCQkJCQkJcmV0dXJuIEVJTlZBTDsKKwkJCQkJCX0gKTsKKworCQkJCQkvKiBTYXZlIHRoaXMgZW5kcG9pbnQgaW4gdGhlIGxpc3QgYXMgYWR2ZXJ0aXplZCAqLworCQkJCQlDSEVDS19GQ1QoIGZkX2VwX2FkZF9tZXJnZSggJnBlZXItPnBfaGRyLmluZm8ucGlfZW5kcG9pbnRzLCAoc1NBICopJnNzLCBzaXplb2Yoc1NTKSwgRVBfRkxfQURWICkgKTsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQUNfVkVORE9SX0lEOiAvKiBWZW5kb3ItSWQgKi8KKwkJCQlpZiAoaGRyLT5hdnBfdmFsdWUgPT0gTlVMTCkgeworCQkJCQkvKiBUaGlzIGlzIGEgc2FuaXR5IGNoZWNrICovCisJCQkJCUxPR19GKCJJZ25vcmVkIGFuIEFWUCAoY29kZSAleCkgd2l0aCB1bnNldCB2YWx1ZSBpbiBDRVIvQ0VBIiwgaGRyLT5hdnBfY29kZSk7CisJCQkJCUFTU0VSVCgwKTsgLyogVG8gY2hlY2sgaWYgdGhpcyByZWFsbHkgaGFwcGVucywgYW5kIHVuZGVyc3RhbmQgd2h5Li4uICovCisJCQkJCWdvdG8gbmV4dDsKKwkJCQl9CisJCQkJCisJCQkJLyogSW4gY2FzZSBvZiBtdWx0aXBsZSBBVlBzICovCisJCQkJaWYgKHBlZXItPnBfaGRyLmluZm8ucnVudGltZS5waXJfdmVuZG9yaWQpIHsKKwkJCQkJVFJBQ0VfREVCVUcoSU5GTywgIk11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUgVmVuZG9yLUlkIEFWUCIpOworCQkJCQllcnJvci0+cGVpX2VycmNvZGUgPSAiRElBTUVURVJfQVZQX09DQ1VSU19UT09fTUFOWV9USU1FUyI7CisJCQkJCWVycm9yLT5wZWlfbWVzc2FnZSA9ICJJIGZvdW5kIHNldmVyYWwgVmVuZG9yLUlkIEFWUHMiOworCQkJCQllcnJvci0+cGVpX2F2cCA9IGF2cDsKKwkJCQkJcmV0dXJuIEVJTlZBTDsKKwkJCQl9CisJCQkJCisJCQkJcGVlci0+cF9oZHIuaW5mby5ydW50aW1lLnBpcl92ZW5kb3JpZCA9IGhkci0+YXZwX3ZhbHVlLT51MzI7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQUNfUFJPRFVDVF9OQU1FOiAvKiBQcm9kdWN0LU5hbWUgKi8KKwkJCQlpZiAoaGRyLT5hdnBfdmFsdWUgPT0gTlVMTCkgeworCQkJCQkvKiBUaGlzIGlzIGEgc2FuaXR5IGNoZWNrICovCisJCQkJCUxPR19GKCJJZ25vcmVkIGFuIEFWUCAoY29kZSAleCkgd2l0aCB1bnNldCB2YWx1ZSBpbiBDRVIvQ0VBIiwgaGRyLT5hdnBfY29kZSk7CisJCQkJCUFTU0VSVCgwKTsgLyogVG8gY2hlY2sgaWYgdGhpcyByZWFsbHkgaGFwcGVucywgYW5kIHVuZGVyc3RhbmQgd2h5Li4uICovCisJCQkJCWdvdG8gbmV4dDsKKwkJCQl9CisJCQkJCisJCQkJLyogSW4gY2FzZSBvZiBtdWx0aXBsZSBBVlBzICovCisJCQkJaWYgKHBlZXItPnBfaGRyLmluZm8ucnVudGltZS5waXJfcHJvZG5hbWUpIHsKKwkJCQkJVFJBQ0VfREVCVUcoSU5GTywgIk11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUgUHJvZHVjdC1OYW1lIEFWUCIpOworCQkJCQllcnJvci0+cGVpX2VycmNvZGUgPSAiRElBTUVURVJfQVZQX09DQ1VSU19UT09fTUFOWV9USU1FUyI7CisJCQkJCWVycm9yLT5wZWlfbWVzc2FnZSA9ICJJIGZvdW5kIHNldmVyYWwgUHJvZHVjdC1OYW1lIEFWUHMiOworCQkJCQllcnJvci0+cGVpX2F2cCA9IGF2cDsKKwkJCQkJcmV0dXJuIEVJTlZBTDsKKwkJCQl9CisKKwkJCQlDSEVDS19NQUxMT0MoIHBlZXItPnBfaGRyLmluZm8ucnVudGltZS5waXJfcHJvZG5hbWUgPSBjYWxsb2MoIGhkci0+YXZwX3ZhbHVlLT5vcy5sZW4gKyAxLCAxICkgICk7CisJCQkJbWVtY3B5KHBlZXItPnBfaGRyLmluZm8ucnVudGltZS5waXJfcHJvZG5hbWUsIGhkci0+YXZwX3ZhbHVlLT5vcy5kYXRhLCBoZHItPmF2cF92YWx1ZS0+b3MubGVuKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBBQ19PUklHSU5fU1RBVEVfSUQ6IC8qIE9yaWdpbi1TdGF0ZS1JZCAqLworCQkJCWlmIChoZHItPmF2cF92YWx1ZSA9PSBOVUxMKSB7CisJCQkJCS8qIFRoaXMgaXMgYSBzYW5pdHkgY2hlY2sgKi8KKwkJCQkJTE9HX0YoIklnbm9yZWQgYW4gQVZQIChjb2RlICV4KSB3aXRoIHVuc2V0IHZhbHVlIGluIENFUi9DRUEiLCBoZHItPmF2cF9jb2RlKTsKKwkJCQkJQVNTRVJUKDApOyAvKiBUbyBjaGVjayBpZiB0aGlzIHJlYWxseSBoYXBwZW5zLCBhbmQgdW5kZXJzdGFuZCB3aHkuLi4gKi8KKwkJCQkJZ290byBuZXh0OworCQkJCX0KKwkJCQkKKwkJCQkvKiBJbiBjYXNlIG9mIG11bHRpcGxlIEFWUHMgKi8KKwkJCQlpZiAocGVlci0+cF9oZHIuaW5mby5ydW50aW1lLnBpcl9vcnN0YXRlKSB7CisJCQkJCVRSQUNFX0RFQlVHKElORk8sICJNdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhlIE9yaWdpbi1TdGF0ZS1JZCBBVlAiKTsKKwkJCQkJZXJyb3ItPnBlaV9lcnJjb2RlID0gIkRJQU1FVEVSX0FWUF9PQ0NVUlNfVE9PX01BTllfVElNRVMiOworCQkJCQllcnJvci0+cGVpX21lc3NhZ2UgPSAiSSBmb3VuZCBzZXZlcmFsIE9yaWdpbi1TdGF0ZS1JZCBBVlBzIjsKKwkJCQkJZXJyb3ItPnBlaV9hdnAgPSBhdnA7CisJCQkJCXJldHVybiBFSU5WQUw7CisJCQkJfQorCQkJCQorCQkJCXBlZXItPnBfaGRyLmluZm8ucnVudGltZS5waXJfb3JzdGF0ZSA9IGhkci0+YXZwX3ZhbHVlLT51MzI7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQUNfU1VQUE9SVEVEX1ZFTkRPUl9JRDogLyogU3VwcG9ydGVkLVZlbmRvci1JZCAqLworCQkJCWlmIChoZHItPmF2cF92YWx1ZSA9PSBOVUxMKSB7CisJCQkJCS8qIFRoaXMgaXMgYSBzYW5pdHkgY2hlY2sgKi8KKwkJCQkJTE9HX0YoIklnbm9yZWQgYW4gQVZQIChjb2RlICV4KSB3aXRoIHVuc2V0IHZhbHVlIGluIENFUi9DRUEiLCBoZHItPmF2cF9jb2RlKTsKKwkJCQkJQVNTRVJUKDApOyAvKiBUbyBjaGVjayBpZiB0aGlzIHJlYWxseSBoYXBwZW5zLCBhbmQgdW5kZXJzdGFuZCB3aHkuLi4gKi8KKwkJCQkJZ290byBuZXh0OworCQkJCX0KKwkJCQkKKwkJCQlUUkFDRV9ERUJVRyhGVUxMLCAiJyVzJyBjbGFpbXMgc3VwcG9ydCBmb3IgYSBzdWJzZXQgb2YgdmVuZG9yICVkIGZlYXR1cmVzLiIsIHBlZXItPnBfaGRyLmluZm8ucGlfZGlhbWlkLCBoZHItPmF2cF92YWx1ZS0+dTMyKTsKKwkJCQkvKiBub3QgdGhhdCBpdCBtYWtlcyBhIGRpZmZlcmVuY2UgZm9yIHVzLi4uIAorCQkJCSAtLSBpZiBhbiBhcHBsaWNhdGlvbiBhY3R1YWxseSBuZWVkcyB0aGlzIGluZm8sIHdlIGNvdWxkIHNhdmUgaXQgc29tZXdoZXJlLgorCQkJCSovCisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQUNfVkVORE9SX1NQRUNJRklDX0FQUExJQ0FUSU9OX0lEOiAvKiBWZW5kb3ItU3BlY2lmaWMtQXBwbGljYXRpb24tSWQgKGdyb3VwZWQpKi8KKwkJCQl7CisJCQkJCXN0cnVjdCBhdnAgKiBpbmF2cCA9IE5VTEw7CisJCQkJCXZlbmRvcl9pZF90IHZpZCA9IDA7CisJCQkJCWFwcGxpY2F0aW9uX2lkX3QgYXV0aF9haWQgPSAwOworCQkJCQlhcHBsaWNhdGlvbl9pZF90IGFjY3RfYWlkID0gMDsKKwkJCQkJaW50IGludmFsaWQ9MDsKKworCQkJCQkvKiBnZXQgdGhlIGZpcnN0IGNoaWxkIEFWUCAqLworCQkJCQlDSEVDS19GQ1QoICBmZF9tc2dfYnJvd3NlKGF2cCwgTVNHX0JSV19GSVJTVF9DSElMRCwgJmluYXZwLCBOVUxMKSAgKTsKKworCQkJCQl3aGlsZSAoaW5hdnApIHsKKwkJCQkJCXN0cnVjdCBhdnBfaGRyICogaW5oZHI7CisJCQkJCQlDSEVDS19GQ1QoICBmZF9tc2dfYXZwX2hkciggaW5hdnAsICZpbmhkciApICApOworCisJCQkJCQlpZiAoaW5oZHItPmF2cF9mbGFncyAmIEFWUF9GTEFHX1ZFTkRPUikgeworCQkJCQkJCUxPR19BKCJJZ25vcmVkIGEgdmVuZG9yIEFWUCBpbnNpZGUgVmVuZG9yLVNwZWNpZmljLUFwcGxpY2F0aW9uLUlkIEFWUCIpOworCQkJCQkJCWdvdG8gaW5uZXh0OworCQkJCQkJfQorCisJCQkJCQlpZiAoaW5oZHItPmF2cF92YWx1ZSA9PSBOVUxMKSB7CisJCQkJCQkJLyogVGhpcyBpcyBhIHNhbml0eSBjaGVjayAqLworCQkJCQkJCUxPR19GKCJJZ25vcmVkIGFuIEFWUCAoY29kZSAleCkgd2l0aCB1bnNldCB2YWx1ZSBpbiBDRVIvQ0VBIiwgaGRyLT5hdnBfY29kZSk7CisJCQkJCQkJQVNTRVJUKDApOyAvKiBUbyBjaGVjayBpZiB0aGlzIHJlYWxseSBoYXBwZW5zLCBhbmQgdW5kZXJzdGFuZCB3aHkuLi4gKi8KKwkJCQkJCQlnb3RvIGlubmV4dDsKKwkJCQkJCX0KKwkJCQkJCXN3aXRjaCAoaW5oZHItPmF2cF9jb2RlKSB7CisJCQkJCQkJY2FzZSBBQ19WRU5ET1JfSUQ6IC8qIFZlbmRvci1JZCAqLworI2lmbmRlZiBXT1JLQVJPVU5EX0FDQ0VQVF9JTlZBTElEX1ZTQUkKKwkJCQkJCQkJaWYgKHZpZCAhPSAwKQorCQkJCQkJCQkJaW52YWxpZCsrOyAvKiBXZSBhbHJlYWR5IGhhZCBvbmUgc3VjaCBBVlAuIFRoaXMgaXMgaW52YWxpZCBhY2NvcmRpbmcgdG8gUkZDNjczMyBidXQgbm90IFJGQzM1ODggKGJ1dCB0aGVyZSBpcyBhbiBlcnJhdHVtKSAqLworI2VuZGlmIC8qIFdPUktBUk9VTkRfQUNDRVBUX0lOVkFMSURfVlNBSSAqLworCQkJCQkJCQl2aWQgPSBpbmhkci0+YXZwX3ZhbHVlLT51MzI7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgQUNfQVVUSF9BUFBMSUNBVElPTl9JRDogLyogQXV0aC1BcHBsaWNhdGlvbi1JZCAqLworCQkJCQkJCQlpZiAoYXV0aF9haWQgIT0gMCkKKwkJCQkJCQkJCWludmFsaWQrKzsgLyogV2UgYWxyZWFkeSBoYWQgb25lIHN1Y2ggQVZQICovCisjaWZuZGVmIFdPUktBUk9VTkRfQUNDRVBUX0lOVkFMSURfVlNBSQorCQkJCQkJCQlpZiAoYWNjdF9haWQgIT0gMCkKKwkJCQkJCQkJCWludmFsaWQrKzsgLyogT25seSAxICotQXBwbGljYXRpb24tSWQgQVZQIGlzIGFsbG93ZWQgKi8KKyNlbmRpZiAvKiBXT1JLQVJPVU5EX0FDQ0VQVF9JTlZBTElEX1ZTQUkgKi8KKwkJCQkJCQkJYXV0aF9haWQgPSBpbmhkci0+YXZwX3ZhbHVlLT51MzI7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgQUNfQUNDVF9BUFBMSUNBVElPTl9JRDogLyogQWNjdC1BcHBsaWNhdGlvbi1JZCAqLworCQkJCQkJCQlpZiAoYWNjdF9haWQgIT0gMCkKKwkJCQkJCQkJCWludmFsaWQrKzsgLyogV2UgYWxyZWFkeSBoYWQgb25lIHN1Y2ggQVZQICovCisjaWZuZGVmIFdPUktBUk9VTkRfQUNDRVBUX0lOVkFMSURfVlNBSQorCQkJCQkJCQlpZiAoYXV0aF9haWQgIT0gMCkKKwkJCQkJCQkJCWludmFsaWQrKzsgLyogT25seSAxICotQXBwbGljYXRpb24tSWQgQVZQIGlzIGFsbG93ZWQgKi8KKyNlbmRpZiAvKiBXT1JLQVJPVU5EX0FDQ0VQVF9JTlZBTElEX1ZTQUkgKi8KKwkJCQkJCQkJYWNjdF9haWQgPSBpbmhkci0+YXZwX3ZhbHVlLT51MzI7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCS8qIGlnbm9yZSBvdGhlciBBVlBzICovCisJCQkJCQl9CisJCQkJCQkKKwkJCQkJCWlmIChpbnZhbGlkKSB7CisJCQkJCQkJVFJBQ0VfREVCVUcoRlVMTCwgIkludmFsaWQgVmVuZG9yLVNwZWNpZmljLUFwcGxpY2F0aW9uLUlkIEFWUCByZWNlaXZlZCIpOworCQkJCQkJCWVycm9yLT5wZWlfZXJyY29kZSA9ICJESUFNRVRFUl9JTlZBTElEX0FWUF9WQUxVRSI7CisJCQkJCQkJZXJyb3ItPnBlaV9hdnAgPSBhdnA7CisJCQkJCQkJcmV0dXJuIEVJTlZBTDsKKwkJCQkJCX0KKworCQkJCQlpbm5leHQ6CQkJCisJCQkJCQkvKiBHbyB0byBuZXh0IGluIEFWUCAqLworCQkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfYnJvd3NlKGluYXZwLCBNU0dfQlJXX05FWFQsICZpbmF2cCwgTlVMTCkgKTsKKwkJCQkJfQorCQkJCQkKKwkJCQkJLyogQWRkIGVudHJ5IGluIHRoZSBsaXN0ICovCisJCQkJCWlmIChhdXRoX2FpZCkgeworCQkJCQkJQ0hFQ0tfRkNUKCBmZF9hcHBfbWVyZ2UoJnBlZXItPnBfaGRyLmluZm8ucnVudGltZS5waXJfYXBwcywgYXV0aF9haWQsIHZpZCwgMSwgMCkgKTsKKwkJCQkJfQorCQkJCQlpZiAoYWNjdF9haWQpIHsKKwkJCQkJCUNIRUNLX0ZDVCggZmRfYXBwX21lcmdlKCZwZWVyLT5wX2hkci5pbmZvLnJ1bnRpbWUucGlyX2FwcHMsIGFjY3RfYWlkLCB2aWQsIDAsIDEpICk7CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQUNfQVVUSF9BUFBMSUNBVElPTl9JRDogLyogQXV0aC1BcHBsaWNhdGlvbi1JZCAqLworCQkJCWlmIChoZHItPmF2cF92YWx1ZSA9PSBOVUxMKSB7CisJCQkJCS8qIFRoaXMgaXMgYSBzYW5pdHkgY2hlY2sgKi8KKwkJCQkJTE9HX0YoIklnbm9yZWQgYW4gQVZQIChjb2RlICV4KSB3aXRoIHVuc2V0IHZhbHVlIGluIENFUi9DRUEiLCBoZHItPmF2cF9jb2RlKTsKKwkJCQkJQVNTRVJUKDApOyAvKiBUbyBjaGVjayBpZiB0aGlzIHJlYWxseSBoYXBwZW5zLCBhbmQgdW5kZXJzdGFuZCB3aHkuLi4gKi8KKwkJCQkJZ290byBuZXh0OworCQkJCX0KKwkJCQkKKwkJCQlpZiAoaGRyLT5hdnBfdmFsdWUtPnUzMiA9PSBBSV9SRUxBWSkgeworCQkJCQlwZWVyLT5wX2hkci5pbmZvLnJ1bnRpbWUucGlyX3JlbGF5ID0gMTsKKwkJCQl9IGVsc2UgeworCQkJCQlDSEVDS19GQ1QoIGZkX2FwcF9tZXJnZSgmcGVlci0+cF9oZHIuaW5mby5ydW50aW1lLnBpcl9hcHBzLCBoZHItPmF2cF92YWx1ZS0+dTMyLCAwLCAxLCAwKSApOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJY2FzZSBBQ19BQ0NUX0FQUExJQ0FUSU9OX0lEOiAvKiBBY2N0LUFwcGxpY2F0aW9uLUlkICovCisJCQkJaWYgKGhkci0+YXZwX3ZhbHVlID09IE5VTEwpIHsKKwkJCQkJLyogVGhpcyBpcyBhIHNhbml0eSBjaGVjayAqLworCQkJCQlMT0dfRigiSWdub3JlZCBhbiBBVlAgKGNvZGUgJXgpIHdpdGggdW5zZXQgdmFsdWUgaW4gQ0VSL0NFQSIsIGhkci0+YXZwX2NvZGUpOworCQkJCQlBU1NFUlQoMCk7IC8qIFRvIGNoZWNrIGlmIHRoaXMgcmVhbGx5IGhhcHBlbnMsIGFuZCB1bmRlcnN0YW5kIHdoeS4uLiAqLworCQkJCQlnb3RvIG5leHQ7CisJCQkJfQorCQkJCQorCQkJCWlmIChoZHItPmF2cF92YWx1ZS0+dTMyID09IEFJX1JFTEFZKSB7CisJCQkJCS8qIE5vdCBjbGVhciBpZiB0aGUgcmVsYXkgYXBwbGljYXRpb24gY2FuIGJlIGluc2lkZSB0aGlzIEFWUC4uLiAqLworCQkJCQlwZWVyLT5wX2hkci5pbmZvLnJ1bnRpbWUucGlyX3JlbGF5ID0gMTsKKwkJCQl9IGVsc2UgeworCQkJCQlDSEVDS19GQ1QoIGZkX2FwcF9tZXJnZSgmcGVlci0+cF9oZHIuaW5mby5ydW50aW1lLnBpcl9hcHBzLCBoZHItPmF2cF92YWx1ZS0+dTMyLCAwLCAwLCAxKSApOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJY2FzZSBBQ19GSVJNV0FSRV9SRVZJU0lPTjogLyogRmlybXdhcmUtUmV2aXNpb24gKi8KKwkJCQlpZiAoaGRyLT5hdnBfdmFsdWUgPT0gTlVMTCkgeworCQkJCQkvKiBUaGlzIGlzIGEgc2FuaXR5IGNoZWNrICovCisJCQkJCUxPR19GKCJJZ25vcmVkIGFuIEFWUCAoY29kZSAleCkgd2l0aCB1bnNldCB2YWx1ZSBpbiBDRVIvQ0VBIiwgaGRyLT5hdnBfY29kZSk7CisJCQkJCUFTU0VSVCgwKTsgLyogVG8gY2hlY2sgaWYgdGhpcyByZWFsbHkgaGFwcGVucywgYW5kIHVuZGVyc3RhbmQgd2h5Li4uICovCisJCQkJCWdvdG8gbmV4dDsKKwkJCQl9CisJCQkJCisJCQkJcGVlci0+cF9oZHIuaW5mby5ydW50aW1lLnBpcl9maXJtcmV2ID0gaGRyLT5hdnBfdmFsdWUtPnUzMjsKKwkJCQlicmVhazsKKworCQkJY2FzZSBBQ19JTkJBTkRfU0VDVVJJVFlfSUQ6IC8qIEluYmFuZC1TZWN1cml0eS1JZCAqLworCQkJCWlmIChoZHItPmF2cF92YWx1ZSA9PSBOVUxMKSB7CisJCQkJCS8qIFRoaXMgaXMgYSBzYW5pdHkgY2hlY2sgKi8KKwkJCQkJTE9HX0YoIklnbm9yZWQgYW4gQVZQIChjb2RlICV4KSB3aXRoIHVuc2V0IHZhbHVlIGluIENFUi9DRUEiLCBoZHItPmF2cF9jb2RlKTsKKwkJCQkJQVNTRVJUKDApOyAvKiBUbyBjaGVjayBpZiB0aGlzIHJlYWxseSBoYXBwZW5zLCBhbmQgdW5kZXJzdGFuZCB3aHkuLi4gKi8KKwkJCQkJZ290byBuZXh0OworCQkJCX0KKwkJCQlpZiAoaGRyLT5hdnBfdmFsdWUtPnUzMiA+PSAzMiApIHsKKwkJCQkJZXJyb3ItPnBlaV9lcnJjb2RlID0gIkRJQU1FVEVSX0lOVkFMSURfQVZQX1ZBTFVFIjsKKwkJCQkJZXJyb3ItPnBlaV9tZXNzYWdlID0gIkkgZG9uJ3Qgc3VwcG9ydCB0aGlzIEluYmFuZC1TZWN1cml0eS1JZCB2YWx1ZSAoeWV0KS4iOworCQkJCQllcnJvci0+cGVpX2F2cCA9IGF2cDsKKwkJCQkJcmV0dXJuIEVJTlZBTDsKKwkJCQl9CisJCQkJcGVlci0+cF9oZHIuaW5mby5ydW50aW1lLnBpcl9pc2kgfD0gKDEgPDwgaGRyLT5hdnBfdmFsdWUtPnUzMik7CisJCQkJYnJlYWs7CisJCX0KKworbmV4dDoJCQkKKwkJLyogR28gdG8gbmV4dCBBVlAgKi8KKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYnJvd3NlKGF2cCwgTVNHX0JSV19ORVhULCAmYXZwLCBOVUxMKSApOworCX0KKwkKKwlyZXR1cm4gMDsKK30KKworLyogQ3JlYXRlIGEgQ0VSIG1lc3NhZ2UgZm9yIHNlbmRpbmcgKi8gCitzdGF0aWMgaW50IGNyZWF0ZV9DRVIoc3RydWN0IGZkX3BlZXIgKiBwZWVyLCBzdHJ1Y3QgY254Y3R4ICogY254LCBzdHJ1Y3QgbXNnICoqIGNlcikKK3sKKwlpbnQgaXNpX3RscyA9IDA7CisJaW50IGlzaV9ub25lID0gMDsKKwkKKwkvKiBGaW5kIENFUiBkaWN0aW9uYXJ5IG9iamVjdCBhbmQgY3JlYXRlIGFuIGluc3RhbmNlICovCisJQ0hFQ0tfRkNUKCBmZF9tc2dfbmV3ICggZmRfZGljdF9jbWRfQ0VSLCBNU0dGTF9BTExPQ19FVEVJRCwgY2VyICkgKTsKKwkKKwkvKiBEbyB3ZSBuZWVkIEluYmFuZC1TZWN1cml0eS1JZCBBVlBzID8gSWYgd2UncmUgYWxyZWFkeSB1c2luZyBUTFMsIHdlIGRvbid0Li4uICovCisJaWYgKCFmZF9jbnhfZ2V0VExTKGNueCkpIHsKKwkJaXNpX25vbmUgPSBwZWVyLT5wX2hkci5pbmZvLmNvbmZpZy5waWNfZmxhZ3Muc2VjICYgUElfU0VDX05PTkU7IC8qIHdlIGFkZCBpdCBldmVuIGlmIHRoZSBwZWVyIGRvZXMgbm90IHVzZSB0aGUgb2xkIG1lY2hhbmlzbSwgaXQgaXMgaW1wb3NzaWJsZSB0byBkaXN0aW5ndWlzaCAqLworCisJCWlmIChwZWVyLT5wX2hkci5pbmZvLmNvbmZpZy5waWNfZmxhZ3Muc2VjICYgUElfU0VDX1RMU19PTEQpIHsKKwkJCWlmIChmZF9nX2NvbmZpZy0+Y25mX3NlY19kYXRhLnRsc19kaXNhYmxlZCkgeworCQkJCUxPR19OKCJUTFMgZGlzYWJsZWQgbG9jYWxseSwgc28gSW5iYW5kLVNlY3VyaXR5LUlkIChUTFMpIG5vdCBpbmNsdWRlZCBmb3IgcGVlciAlcyIsIHBlZXItPnBfaGRyLmluZm8ucGlfZGlhbWlkKTsKKwkJCX0gZWxzZSB7CisJCQkJaXNpX3RscyAgPSAxOworCQkJfQorCQl9CisJfQorCQorCS8qIEFkZCB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGxvY2FsIHBlZXIgKi8KKwlDSEVDS19GQ1QoIGFkZF9DRV9pbmZvKCpjZXIsIGNueCwgaXNpX3RscywgaXNpX25vbmUpICk7CisJCisJLyogRG9uZSEgKi8KKwlyZXR1cm4gMDsKK30KKworCisvKiBDb250aW51ZSB3aXRoIHRoZSBpbml0aWF0b3Igc2lkZSAqLworc3RhdGljIGludCB0b193YWl0Y2VhKHN0cnVjdCBmZF9wZWVyICogcGVlciwgc3RydWN0IGNueGN0eCAqIGNueCkKK3sKKwkvKiBXZSBzZW50IGEgQ0VSIG9uIHRoZSBjb25uZWN0aW9uLCBzZXQgdGhlIGV2ZW50IHF1ZXVlIHNvIHRoYXQgd2UgcmVjZWl2ZSB0aGUgQ0VBICovCisJQ0hFQ0tfRkNUKCBzZXRfcGVlcl9jbngocGVlciwgJmNueCkgKTsKKwkKKwkvKiBDaGFuZ2Ugc3RhdGUgYW5kIHJlc2V0IHRoZSB0aW1lciAqLworCUNIRUNLX0ZDVCggZmRfcHNtX2NoYW5nZV9zdGF0ZShwZWVyLCBTVEFURV9XQUlUQ0VBKSApOworCWZkX3BzbV9uZXh0X3RpbWVvdXQocGVlciwgMCwgQ0VBX1RJTUVPVVQpOworCQorCXJldHVybiAwOworfQorCisvKiBSZWplY3QgYW4gaW5jb21pbmcgY29ubmVjdGlvbiBhdHRlbXB0ICovCitzdGF0aWMgdm9pZCByZWNlaXZlcl9yZWplY3Qoc3RydWN0IGNueGN0eCAqKiByZWN2X2NueCwgc3RydWN0IG1zZyAqKiBjZXIsIHN0cnVjdCBmZF9wZWkgKiBlcnJvcikKK3sKKwlzdHJ1Y3QgbXNnX2hkciAqIGhkciA9IE5VTEw7CisJCisJLyogQ3JlYXRlIGFuZCBzZW5kIHRoZSBDRUEgd2l0aCBhcHByb3ByaWF0ZSBlcnJvciBjb2RlICovCisJQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfbmV3X2Fuc3dlcl9mcm9tX3JlcSAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgY2VyLCBNU0dGTF9BTlNXX0VSUk9SICksIGdvdG8gZGVzdHJveSApOworCUNIRUNLX0ZDVF9ETyggZmRfbXNnX3Jlc2NvZGVfc2V0KCpjZXIsIGVycm9yLT5wZWlfZXJyY29kZSwgZXJyb3ItPnBlaV9tZXNzYWdlLCBlcnJvci0+cGVpX2F2cCwgMCApLCBnb3RvIGRlc3Ryb3kgKTsKKwlDSEVDS19GQ1RfRE8oICBmZF9tc2dfaGRyKCAqY2VyLCAmaGRyICksIGdvdG8gZGVzdHJveSAgKTsKKwlpZiAoaGRyLT5tc2dfZmxhZ3MgJiBDTURfRkxBR19FUlJPUikgeworCQkvKiBHZW5lcmljIGVycm9yIGZvcm1hdCwganVzdCBhZGQgdGhlIG9yaWdpbiBBVlBzICovCisJCUNIRUNLX0ZDVF9ETyggZmRfbXNnX2FkZF9vcmlnaW4gKCAqY2VyLCAxICksIGdvdG8gZGVzdHJveSApOworCX0gZWxzZSB7CisJCS8qIEFkZCBvdGhlciBBVlBzIHRvIGJlIGNvbXBsaWFudCB3aXRoIHRoZSBBQk5GICovCisJCUNIRUNLX0ZDVF9ETyggYWRkX0NFX2luZm8oKmNlciwgKnJlY3ZfY254LCAwLCAwKSwgZ290byBkZXN0cm95ICk7CisJfQorCUNIRUNLX0ZDVF9ETyggZmRfb3V0X3NlbmQoY2VyLCAqcmVjdl9jbngsIE5VTEwsIDApLCBnb3RvIGRlc3Ryb3kgKTsKKwkKKwlpZiAoZXJyb3ItPnBlaV9hdnBfZnJlZSkgeworCQlmZF9tc2dfZnJlZShlcnJvci0+cGVpX2F2cCk7CisJfQorCQorCS8qIEFuZCBub3cgZGVzdHJveSB0aGlzIGNvbm5lY3Rpb24gKi8KK2Rlc3Ryb3k6CisJZmRfY254X2Rlc3Ryb3koKnJlY3ZfY254KTsKKwkqcmVjdl9jbnggPSBOVUxMOworCWlmICgqY2VyKSB7CisJCWZkX2hvb2tfY2FsbChIT09LX01FU1NBR0VfRFJPUFBFRCwgKmNlciwgTlVMTCwgIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHJlamVjdGluZyB0aGlzIENFUi4iLCBmZF9tc2dfcG1kbF9nZXQoKmNlcikpOworCQlmZF9tc2dfZnJlZSgqY2VyKTsKKwkJKmNlciA9IE5VTEw7CisJfQorfQorCisvKiBXZSBoYXZlIGVzdGFibGlzaGVkIGEgbmV3IGNvbm5lY3Rpb24gdG8gdGhlIHJlbW90ZSBwZWVyLCBzZW5kIENFUiBhbmQgZXZlbnR1YWxseSBwcm9jZXNzIHRoZSBlbGVjdGlvbiAqLworaW50IGZkX3BfY2VfaGFuZGxlX25ld2NueChzdHJ1Y3QgZmRfcGVlciAqIHBlZXIsIHN0cnVjdCBjbnhjdHggKiBpbml0aWF0b3IpCit7CisJc3RydWN0IG1zZyAqIGNlciA9IE5VTEw7CisJCisJLyogU2VuZCBDRVIgb24gdGhlIG5ldyBjb25uZWN0aW9uICovCisJQ0hFQ0tfRkNUKCBjcmVhdGVfQ0VSKHBlZXIsIGluaXRpYXRvciwgJmNlcikgKTsKKwlDSEVDS19GQ1QoIGZkX291dF9zZW5kKCZjZXIsIGluaXRpYXRvciwgcGVlciwgMCkgKTsKKwkKKwkvKiBBcmUgd2UgZG9pbmcgYW4gZWxlY3Rpb24gPyAqLworCWlmIChmZF9wZWVyX2dldHN0YXRlKHBlZXIpID09IFNUQVRFX1dBSVRDTlhBQ0tfRUxFQykgeworCQlpZiAoZWxlY3Rpb25fcmVzdWx0KHBlZXIpKSB7CisJCQkvKiBDbG9zZSBpbml0aWF0b3IgY29ubmVjdGlvbiAqLworCQkJZmRfY254X2Rlc3Ryb3koaW5pdGlhdG9yKTsKKworCQkJTE9HX0QoIiVzOiBFbGVjdGlvbiBsb3N0IG9uIG91dGdvaW5nIGNvbm5lY3Rpb24sIGNsb3NpbmcgYW5kIGFuc3dlcmluZyBDRUEgb24gaW5jb21pbmcgY29ubmVjdGlvbi4iLCBwZWVyLT5wX2hkci5pbmZvLnBpX2RpYW1pZCk7CisJCQkKKwkJCS8qIFByb2Nlc3Mgd2l0aCB0aGUgcmVjZWl2ZXIgc2lkZSAqLworCQkJQ0hFQ0tfRkNUKCBmZF9wX2NlX3Byb2Nlc3NfcmVjZWl2ZXIocGVlcikgKTsKKworCQl9IGVsc2UgeworCQkJc3RydWN0IGZkX3BlaSBwZWk7CisJCQltZW1zZXQoJnBlaSwgMCwgc2l6ZW9mKHBlaSkpOworCQkJcGVpLnBlaV9lcnJjb2RlID0gIkVMRUNUSU9OX0xPU1QiOworCQkJcGVpLnBlaV9tZXNzYWdlID0gIlBsZWFzZSBhbnN3ZXIgbXkgQ0VSIGluc3RlYWQsIHlvdSB3b24gdGhlIGVsZWN0aW9uLiI7CisJCQlMT0dfRCgiJXM6IEVsZWN0aW9uIGxvc3Qgb24gaW5jb21pbmcgY29ubmVjdGlvbiwgY2xvc2luZyBhbmQgd2FpdGluZyBmb3IgQ0VBIG9uIG91dGdvaW5nIGNvbm5lY3Rpb24uIiwgcGVlci0+cF9oZHIuaW5mby5waV9kaWFtaWQpOworCisJCQkvKiBBbnN3ZXIgYW4gRUxFQ1RJT04gTE9TVCB0byB0aGUgcmVjZWl2ZXIgc2lkZSAqLworCQkJcmVjZWl2ZXJfcmVqZWN0KCZwZWVyLT5wX3JlY2VpdmVyLCAmcGVlci0+cF9jZXIsICZwZWkpOworCQkJQ0hFQ0tfRkNUKCB0b193YWl0Y2VhKHBlZXIsIGluaXRpYXRvcikgKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIE5vIGVsZWN0aW9uICh5ZXQpICovCisJCUNIRUNLX0ZDVCggdG9fd2FpdGNlYShwZWVyLCBpbml0aWF0b3IpICk7CisJfQorCQorCXJldHVybiAwOworfQorCisvKiBXZSBoYXZlIHJlY2VpdmVkIGEgQ2FwYWJpbGl0aWVzIEV4Y2hhbmdlIG1lc3NhZ2Ugb24gdGhlIHBlZXIgY29ubmVjdGlvbiAqLworaW50IGZkX3BfY2VfbXNncmN2KHN0cnVjdCBtc2cgKiogbXNnLCBpbnQgcmVxLCBzdHJ1Y3QgZmRfcGVlciAqIHBlZXIpCit7CisJdWludDMyX3QgcmMgPSAwOworCWludCBzdDsKKwlzdHJ1Y3QgZmRfcGVpIHBlaTsKKwkKKwlUUkFDRV9FTlRSWSgiJXAgJXAiLCBtc2csIHBlZXIpOworCUNIRUNLX1BBUkFNUyggbXNnICYmICptc2cgJiYgQ0hFQ0tfUEVFUihwZWVyKSApOworCQorCS8qIFRoZSBvbmx5IHZhbGlkIHNpdHVhdGlvbiB3aGVyZSB3ZSBhcmUgY2FsbGVkIGlzIGluIFdBSVRDRUEgYW5kIHdlIHJlY2VpdmUgYSBDRUEgKHdlIG1heSBoYXZlIHdvbiBhbiBlbGVjdGlvbikgKi8KKwkKKwkvKiBOb3RlIDogdG8gaW1wbGVtZW50IENhcGFiaWxpdGllcyBVcGRhdGUsIHdlIHdvdWxkIG5lZWQgdG8gY2hhbmdlIGhlcmUgKi8KKwkKKwkvKiBJZiBpdCBpcyBhIENFUiwganVzdCByZXBseSBhbiBlcnJvciAqLworCWlmIChyZXEpIHsKKwkJLyogQ3JlYXRlIHRoZSBlcnJvciBtZXNzYWdlICovCisJCUNIRUNLX0ZDVCggZmRfbXNnX25ld19hbnN3ZXJfZnJvbV9yZXEgKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIG1zZywgTVNHRkxfQU5TV19FUlJPUiApICk7CisJCQorCQkvKiBTZXQgdGhlIGVycm9yIGNvZGUgKi8KKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfcmVzY29kZV9zZXQoKm1zZywgIkRJQU1FVEVSX1VOQUJMRV9UT19DT01QTFkiLCAiTm8gQ0VSIGFsbG93ZWQgaW4gY3VycmVudCBzdGF0ZSIsIE5VTEwsIDEgKSApOworCisJCS8qIG1zZyBub3cgY29udGFpbnMgYW4gYW5zd2VyIG1lc3NhZ2UgdG8gc2VuZCBiYWNrICovCisJCUNIRUNLX0ZDVF9ETyggZmRfb3V0X3NlbmQobXNnLCBOVUxMLCBwZWVyLCAwKSwgLyogSW4gY2FzZSBvZiBlcnJvciB0aGUgbWVzc2FnZSBoYXMgYWxyZWFkeSBiZWVuIGR1bXBlZCAqLyApOworCX0KKwkKKwkvKiBJZiB0aGUgc3RhdGUgaXMgbm90IFdBSVRDRUEsIGp1c3QgZGlzY2FyZCB0aGUgbWVzc2FnZSAqLworCWlmIChyZXEgfHwgKChzdCA9IGZkX3BlZXJfZ2V0c3RhdGUocGVlcikpICE9IFNUQVRFX1dBSVRDRUEpKSB7CisJCWlmICgqbXNnKSB7CisJCQkvKiBJbiBzdWNoIGNhc2UsIGp1c3QgZGlzY2FyZCB0aGUgbWVzc2FnZSAqLworCQkJY2hhciBidWZbMTI4XTsKKwkJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJSZWNlaXZlZCB3aGlsZSBwZWVyIHN0YXRlIG1hY2hpbmUgd2FzIGluIHN0YXRlICVzLiIsIFNUQVRFX1NUUihzdCkpOworCQkJZmRfaG9va19jYWxsKEhPT0tfTUVTU0FHRV9EUk9QUEVELCAqbXNnLCBwZWVyLCBidWYsIGZkX21zZ19wbWRsX2dldCgqbXNnKSk7CisKKwkJCUNIRUNLX0ZDVF9ETyggZmRfbXNnX2ZyZWUoKm1zZyksIC8qIGNvbnRpbnVlICovKTsKKwkJCSptc2cgPSBOVUxMOworCQl9CisJCQorCQlyZXR1cm4gMDsKKwl9CisJCisJbWVtc2V0KCZwZWksIDAsIHNpemVvZihwZWkpKTsKKwkKKwkvKiBTYXZlIGluZm8gZnJvbSB0aGUgQ0VBIGludG8gdGhlIHBlZXIgKi8KKwlDSEVDS19GQ1RfRE8oIHNhdmVfcmVtb3RlX0NFX2luZm8oKm1zZywgcGVlciwgJnBlaSwgJnJjKSwgCisJCXsKKwkJCWZkX2hvb2tfY2FsbChIT09LX1BFRVJfQ09OTkVDVF9GQUlMRUQsICptc2csIHBlZXIsICJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBwcm9jZXNzaW5nIGluY29taW5nIENFQS4iLCBOVUxMKTsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfSApOworCQorCS8qIENoZWNrIHRoZSBSZXN1bHQtQ29kZSAqLworCXN3aXRjaCAocmMpIHsKKwkJY2FzZSBFUl9ESUFNRVRFUl9TVUNDRVNTOgorCQkJLyogTG9nIHN1Y2Nlc3MgKi8KKwkJCWZkX2hvb2tfY2FsbChIT09LX1BFRVJfQ09OTkVDVF9TVUNDRVNTLCAqbXNnLCBwZWVyLCBOVUxMLCBOVUxMKTsKKwkJCQorCQkJLyogRGlzcG9zZSBvZiB0aGUgbWVzc2FnZSwgd2UgZG9uJ3QgbmVlZCBpdCBhbnltb3JlICovCisJCQlDSEVDS19GQ1RfRE8oIGZkX21zZ19mcmVlKCptc2cpLCAvKiBjb250aW51ZSAqLyApOworCQkJKm1zZyA9IE5VTEw7CisJCQkKKwkJCS8qIE5vIHByb2JsZW0sIHdlIGNhbiBjb250aW51ZSAqLworCQkJYnJlYWs7CisJCQkKKwkJY2FzZSBFUl9ESUFNRVRFUl9UT09fQlVTWToKKwkJCS8qIFJldHJ5IGxhdGVyICovCisJCQlmZF9ob29rX2NhbGwoSE9PS19QRUVSX0NPTk5FQ1RfRkFJTEVELCAqbXNnLCBwZWVyLCAiUmVtb3RlIHBlZXIgaXMgdG9vIGJ1c3kiLCBOVUxMKTsKKwkJCWZkX3BzbV9jbGVhbnVwKHBlZXIsIDApOworCQkJZmRfcHNtX25leHRfdGltZW91dChwZWVyLCAwLCAzMDApOworCQkJcmV0dXJuIDA7CisJCQorCQljYXNlIEVSX0VMRUNUSU9OX0xPU1Q6CisJCQkvKiBPaywganVzdCB3YWl0IGZvciBhIGxpdHRsZSB3aGlsZSBmb3IgdGhlIENFUiB0byBiZSBwcm9jZXNzZWQgb24gdGhlIG90aGVyIGNvbm5lY3Rpb24uICovCisJCQlUUkFDRV9ERUJVRyhGVUxMLCAiUGVlciAlcyByZXBsaWVkIGEgQ0VBIHdpdGggUmVzdWx0LUNvZGUgQVZQIEVMRUNUSU9OX0xPU1QsIHdhaXRpbmcgZm9yIGV2ZW50cy4iLCBwZWVyLT5wX2hkci5pbmZvLnBpX2RpYW1pZCk7CisJCQlyZXR1cm4gMDsKKwkJCisJCWRlZmF1bHQ6CisJCQkvKiBJbiBhbnkgb3RoZXIgY2FzZSwgd2UgYWJvcnQgYWxsIGF0dGVtcHRzIHRvIGNvbm5lY3QgdG8gdGhpcyBwZWVyICovCisJCQlmZF9ob29rX2NhbGwoSE9PS19QRUVSX0NPTk5FQ1RfRkFJTEVELCAqbXNnLCBwZWVyLCAiQ0VBIHdpdGggdW5leHBlY3RlZCBlcnJvciBjb2RlIiwgTlVMTCk7CisJCQlyZXR1cm4gRUlOVkFMOworCX0KKwkKKwkKKwkvKiBIYW5kc2hha2UgaWYgbmVlZGVkLCBzdGFydCBjbGVhciBvdGhlcndpc2UgKi8KKwlpZiAoICEgZmRfY254X2dldFRMUyhwZWVyLT5wX2NueGN0eCkgKSB7CisJCWludCB0b2RvID0gcGVlci0+cF9oZHIuaW5mby5jb25maWcucGljX2ZsYWdzLnNlYyAmIHBlZXItPnBfaGRyLmluZm8ucnVudGltZS5waXJfaXNpIDsKKwkJLyogU3BlY2lhbCBjYXNlOiBpZiB0aGUgcGVlciBkaWQgbm90IHNlbmQgYSBJU0kgQVZQICovCisJCWlmIChwZWVyLT5wX2hkci5pbmZvLnJ1bnRpbWUucGlyX2lzaSA9PSAwKQorCQkJdG9kbyA9IHBlZXItPnBfaGRyLmluZm8uY29uZmlnLnBpY19mbGFncy5zZWM7CisJCQorCQlpZiAodG9kbyA9PSBQSV9TRUNfTk9ORSkgeworCQkJLyogT2sgZm9yIGNsZWFyIGNvbm5lY3Rpb24gKi8KKwkJCVRSQUNFX0RFQlVHKElORk8sICJObyBUTFMgcHJvdGVjdGlvbiBuZWdvdGlhdGVkIHdpdGggcGVlciAnJXMnLiIsIHBlZXItPnBfaGRyLmluZm8ucGlfZGlhbWlkKTsKKwkJCUNIRUNLX0ZDVCggZmRfY254X3N0YXJ0X2NsZWFyKHBlZXItPnBfY254Y3R4LCAxKSApOworCQkJCisJCX0gZWxzZSBpZiAoZmRfZ19jb25maWctPmNuZl9zZWNfZGF0YS50bHNfZGlzYWJsZWQpIHsKKwkJCUxPR19FKCJDbGVhciBjb25uZWN0aW9uIHdpdGggcmVtb3RlIHBlZXIgJyVzJyBpcyBub3QgKGV4cGxpY2l0bHkpIGFsbG93ZWQsIGFuZCBUTFMgaXMgZGlzYWJsZWQuIEdpdmluZyB1cC4uLiIsIHBlZXItPnBfaGRyLmluZm8ucGlfZGlhbWlkKTsKKwkJCWZkX2hvb2tfY2FsbChIT09LX1BFRVJfQ09OTkVDVF9GQUlMRUQsIE5VTEwsIHBlZXIsICJUTFMgaXMgZGlzYWJsZWQgYW5kIHBlZXIgaXMgbm90IGNvbmZpZ3VyZWQgZm9yIElQc2VjIiwgTlVMTCk7CisJCQlnb3RvIGNsZWFudXA7CisJCQkKKwkJfSBlbHNlIHsKKwkJCWZkX3BzbV9jaGFuZ2Vfc3RhdGUocGVlciwgU1RBVEVfT1BFTl9IQU5EU0hBS0UpOworCQkJQ0hFQ0tfRkNUX0RPKCBmZF9jbnhfaGFuZHNoYWtlKHBlZXItPnBfY254Y3R4LCBHTlVUTFNfQ0xJRU5ULCBBTEdPX0hBTkRTSEFLRV8zNDM2LCBwZWVyLT5wX2hkci5pbmZvLmNvbmZpZy5waWNfcHJpb3JpdHksIE5VTEwpLAorCQkJCXsKKwkJCQkJLyogSGFuZHNoYWtlIGZhaWxlZCAuLi4gICovCisJCQkJCWZkX2hvb2tfY2FsbChIT09LX1BFRVJfQ09OTkVDVF9GQUlMRUQsIE5VTEwsIHBlZXIsICJUTFMgaGFuZHNoYWtlIGZhaWxlZCBhZnRlciBDRVIvQ0VBIGV4Y2hhbmdlIiwgTlVMTCk7CisJCQkJCWdvdG8gY2xlYW51cDsKKwkJCQl9ICk7CisKKwkJCS8qIFJldHJpZXZlIHRoZSBjcmVkZW50aWFscyAqLworCQkJQ0hFQ0tfRkNUKCBmZF9jbnhfZ2V0Y3JlZChwZWVyLT5wX2NueGN0eCwgJnBlZXItPnBfaGRyLmluZm8ucnVudGltZS5waXJfY2VydF9saXN0LCAmcGVlci0+cF9oZHIuaW5mby5ydW50aW1lLnBpcl9jZXJ0X2xpc3Rfc2l6ZSkgKTsKKwkJfQorCX0KKwkKKwkvKiBNb3ZlIHRvIG5leHQgc3RhdGUgKi8KKwlpZiAocGVlci0+cF9mbGFncy5wZl9jbnhfcGIpIHsKKwkJZmRfcHNtX2NoYW5nZV9zdGF0ZShwZWVyLCBTVEFURV9SRU9QRU4gKTsKKwkJQ0hFQ0tfRkNUKCBmZF9wX2R3X3Jlb3BlbihwZWVyKSApOworCX0gZWxzZSB7CisJCWZkX3BzbV9jaGFuZ2Vfc3RhdGUocGVlciwgU1RBVEVfT1BFTiApOworCQlmZF9wc21fbmV4dF90aW1lb3V0KHBlZXIsIDEsIHBlZXItPnBfaGRyLmluZm8uY29uZmlnLnBpY190d3RpbWVyID86IGZkX2dfY29uZmlnLT5jbmZfdGltZXJfdHcpOworCX0KKwkKKwlyZXR1cm4gMDsKKwkKK2NsZWFudXA6CisJZmRfcF9jZV9jbGVhcl9jbngocGVlciwgTlVMTCk7CisKKwkvKiBTZW5kIHRoZSBlcnJvciB0byB0aGUgcGVlciAqLworCUNIRUNLX0ZDVCggZmRfZXZlbnRfc2VuZChwZWVyLT5wX2V2ZW50cywgRkRFVlBfQ05YX0VSUk9SLCAwLCBOVUxMKSApOworCisJcmV0dXJuIDA7Cit9CisKKy8qIEhhbmRsZSB0aGUgcmVjZWl2ZXIgc2lkZSB0byBnbyB0byBPUEVOIG9yIE9QRU5fTkVXIHN0YXRlIChhbnkgZWxlY3Rpb24gaXMgcmVzb2x2ZWQpICovCitpbnQgZmRfcF9jZV9wcm9jZXNzX3JlY2VpdmVyKHN0cnVjdCBmZF9wZWVyICogcGVlcikKK3sKKwlzdHJ1Y3QgZmRfcGVpIHBlaTsKKwlzdHJ1Y3QgbXNnICogbXNnID0gTlVMTDsKKwlpbnQgaXNpID0gMDsKKwlpbnQgZmF0YWwgPSAwOworCWludCB0bHNfc3luYz0wOworCQorCVRSQUNFX0VOVFJZKCIlcCIsIHBlZXIpOworCQorCUNIRUNLX0ZDVF9ETyggc2V0X3BlZXJfY254KHBlZXIsICZwZWVyLT5wX3JlY2VpdmVyKSwKKwkJeworCQkJZmRfaG9va19jYWxsKEhPT0tfUEVFUl9DT05ORUNUX0ZBSUxFRCwgTlVMTCwgcGVlciwgIkVycm9yIHNhdmluZyB0aGUgaW5jb21pbmcgY29ubmVjdGlvbiBpbiB0aGUgcGVlciBzdHJ1Y3R1cmUiLCBOVUxMKTsKKwkJCXJldHVybiBfX3JldF9fOworCQl9ICk7CisJbXNnID0gcGVlci0+cF9jZXI7CisJcGVlci0+cF9jZXIgPSBOVUxMOworCQorCW1lbXNldCgmcGVpLCAwLCBzaXplb2YocGVpKSk7CisJCisJLyogUGFyc2UgdGhlIGNvbnRlbnQgb2YgdGhlIHJlY2VpdmVkIENFUiAqLworCUNIRUNLX0ZDVF9ETyggc2F2ZV9yZW1vdGVfQ0VfaW5mbyhtc2csIHBlZXIsICZwZWksIE5VTEwpLCBnb3RvIGVycm9yX2Fib3J0ICk7CisJCisJLyogVmFsaWRhdGUgdGhlIHJlYWxtIGlmIG5lZWRlZCAqLworCWlmIChwZWVyLT5wX2hkci5pbmZvLmNvbmZpZy5waWNfcmVhbG0pIHsKKwkJc2l6ZV90IGxlbiA9IHN0cmxlbihwZWVyLT5wX2hkci5pbmZvLmNvbmZpZy5waWNfcmVhbG0pOworCQlpZiAoZmRfb3NfYWxtb3N0Y2FzZXNyY2gocGVlci0+cF9oZHIuaW5mby5jb25maWcucGljX3JlYWxtLCBsZW4sIHBlZXItPnBfaGRyLmluZm8ucnVudGltZS5waXJfcmVhbG0sIHBlZXItPnBfaGRyLmluZm8ucnVudGltZS5waXJfcmVhbG1sZW4sIE5VTEwpKSB7CisJCQlUUkFDRV9ERUJVRyhJTkZPLCAiUmVqZWN0ZWQgQ0VSIGZyb20gcGVlciAnJXMnLCByZWFsbSBtaXNtYXRjaCB3aXRoIGNvbmZpZ3VyZWQgdmFsdWUgKHJldHVybmluZyBESUFNRVRFUl9VTktOT1dOX1BFRVIpLiIsIHBlZXItPnBfaGRyLmluZm8ucGlfZGlhbWlkKTsKKwkJCXBlaS5wZWlfZXJyY29kZSA9ICJESUFNRVRFUl9VTktOT1dOX1BFRVIiOyAvKiBtYXliZSBBVlBfTk9UX0FMTE9XRUQgd291bGQgYmUgYmV0dGVyIGZpdD8gKi8KKwkJCWdvdG8gZXJyb3JfYWJvcnQ7CisJCX0KKwl9CisJCisJLyogU2F2ZSB0aGUgY3JlZGVudGlhbHMgaWYgaGFuZHNoYWtlIGFscmVhZHkgb2NjdXJyZWQgKi8KKwlpZiAoIGZkX2NueF9nZXRUTFMocGVlci0+cF9jbnhjdHgpICkgeworCQlDSEVDS19GQ1QoIGZkX2NueF9nZXRjcmVkKHBlZXItPnBfY254Y3R4LCAmcGVlci0+cF9oZHIuaW5mby5ydW50aW1lLnBpcl9jZXJ0X2xpc3QsICZwZWVyLT5wX2hkci5pbmZvLnJ1bnRpbWUucGlyX2NlcnRfbGlzdF9zaXplKSApOworCX0KKwkKKwkvKiBWYWxpZGF0ZSB0aGUgcGVlciBpZiBuZWVkZWQgKi8KKwlpZiAocGVlci0+cF9mbGFncy5wZl9yZXNwb25kZXIpIHsKKwkJaW50IHJlcyA9IGZkX3BlZXJfdmFsaWRhdGUoIHBlZXIgKTsKKwkJaWYgKHJlcyA8IDApIHsKKwkJCVRSQUNFX0RFQlVHKElORk8sICJSZWplY3RlZCBDRVIgZnJvbSBwZWVyICclcycsIHZhbGlkYXRpb24gZmFpbGVkIChyZXR1cm5pbmcgRElBTUVURVJfVU5LTk9XTl9QRUVSKS4iLCBwZWVyLT5wX2hkci5pbmZvLnBpX2RpYW1pZCk7CisJCQlwZWkucGVpX2VycmNvZGUgPSAiRElBTUVURVJfVU5LTk9XTl9QRUVSIjsKKwkJCWdvdG8gZXJyb3JfYWJvcnQ7CisJCX0KKwkJQ0hFQ0tfRkNUKCByZXMgKTsKKwl9CisJCisJLyogQ2hlY2sgaWYgd2UgaGF2ZSBjb21tb24gYXBwbGljYXRpb25zICovCisJaWYgKCBmZF9nX2NvbmZpZy0+Y25mX2ZsYWdzLm5vX2Z3ZCAmJiAoISBwZWVyLT5wX2hkci5pbmZvLnJ1bnRpbWUucGlyX3JlbGF5KSApIHsKKwkJaW50IGdvdF9jb21tb247CisJCUNIRUNLX0ZDVCggZmRfYXBwX2NoZWNrX2NvbW1vbiggJmZkX2dfY29uZmlnLT5jbmZfYXBwcywgJnBlZXItPnBfaGRyLmluZm8ucnVudGltZS5waXJfYXBwcywgJmdvdF9jb21tb24pICk7CisJCWlmICghZ290X2NvbW1vbikgeworCQkJVFJBQ0VfREVCVUcoSU5GTywgIk5vIGNvbW1vbiBhcHBsaWNhdGlvbiB3aXRoIHBlZXIgJyVzJywgc2VuZGluZyBESUFNRVRFUl9OT19DT01NT05fQVBQTElDQVRJT04iLCBwZWVyLT5wX2hkci5pbmZvLnBpX2RpYW1pZCk7CisJCQlwZWkucGVpX2VycmNvZGUgPSAiRElBTUVURVJfTk9fQ09NTU9OX0FQUExJQ0FUSU9OIjsKKwkJCWZhdGFsID0gMTsKKwkJCWdvdG8gZXJyb3JfYWJvcnQ7CisJCX0KKwl9CisJCisJLyogRG8gd2UgYWdyZWUgb24gSVNJID8gKi8KKwlpZiAoICEgZmRfY254X2dldFRMUyhwZWVyLT5wX2NueGN0eCkgKSB7CisJCQorCQkvKiBJbiBjYXNlIG9mIHJlc3BvbmRlciwgdGhlIHZhbGlkYXRlIGNhbGxiYWNrIG11c3QgaGF2ZSBzZXQgdGhlIGNvbmZpZy5waWNfZmxhZ3Muc2VjIHZhbHVlIGFscmVhZHkgKi8KKwkKKwkJLyogRmlyc3QgY2FzZTogd2UgYXJlIG5vdCB1c2luZyBvbGQgbWVjaGFuaXNtOiBJU0kgYXJlIGRlcHJlY2F0ZWQsIHdlIGlnbm9yZSBpdC4gKi8KKwkJaWYgKCAhIChwZWVyLT5wX2hkci5pbmZvLmNvbmZpZy5waWNfZmxhZ3Muc2VjICYgUElfU0VDX1RMU19PTEQpKSB7CisJCQkvKiBKdXN0IGNoZWNrIHRoZW4gdGhhdCB0aGUgcGVlciBjb25maWd1cmF0aW9uIGFsbG93cyBmb3IgSVBzZWMgcHJvdGVjdGlvbiAqLworCQkJaWYgKHBlZXItPnBfaGRyLmluZm8uY29uZmlnLnBpY19mbGFncy5zZWMgJiBQSV9TRUNfTk9ORSkgeworCQkJCWlzaSA9IFBJX1NFQ19OT05FOworCQkJfSBlbHNlIHsKKwkJCQkvKiBvdGhlcndpc2UsIHdlIHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiBwcm90ZWN0ZWQuIFJlamVjdCAqLworCQkJCVRSQUNFX0RFQlVHKElORk8sICJOb24gVExTLXByb3RlY3RlZCBDRVIvQ0VBIGV4Y2hhbmdlcyBhcmUgbm90IGFsbG93ZWQgd2l0aCB0aGlzIHBlZXIsIHJlamVjdGluZy4iKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIFRoZSBvbGQgbWVjaGFuaXNtIGlzIGFsbG93ZWQgd2l0aCB0aGlzIHBlZXIuIE5vdywgbG9vayBpbnRvIHRoZSBJU0kgQVZQIHZhbHVlcyAqLworCQkJCisJCQkvKiBJbiBjYXNlIG5vIElTSSB3YXMgcHJlc2VudCBhbnl3YXk6ICovCisJCQlpZiAoIXBlZXItPnBfaGRyLmluZm8ucnVudGltZS5waXJfaXNpKSB7CisJCQkJVFJBQ0VfREVCVUcoSU5GTywgIkluYmFuZC1TZWN1cml0eS1JZCBBVlAgaXMgbWlzc2luZyBpbiByZWNlaXZlZCBDRVIuIik7CisJCQkJaWYgKHBlZXItPnBfaGRyLmluZm8uY29uZmlnLnBpY19mbGFncy5zZWMgJiBQSV9TRUNfTk9ORSkgeworCQkJCQlpc2kgPSBQSV9TRUNfTk9ORTsKKwkJCQkJVFJBQ0VfREVCVUcoSU5GTywgIklQc2VjIHByb3RlY3Rpb24gYWxsb3dlZCBieSBjb25maWd1cmF0aW9uLCBhbGxvd2luZyB0aGlzIG1lY2hhbmlzbSB0byBiZSB1c2VkLiIpOworCQkJCX0gZWxzZSB7CisJCQkJCS8qIG90aGVyd2lzZSwgd2Ugc2hvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIHByb3RlY3RlZC4gUmVqZWN0ICovCisJCQkJCVRSQUNFX0RFQlVHKElORk8sICJSZWplY3RpbmcgdGhlIHBlZXIgY29ubmVjdGlvbiAocGxlYXNlIGFsbG93IElQc2VjIGhlcmUgb3IgY29uZmlndXJlIFRMUyBpbiB0aGUgcmVtb3RlIHBlZXIpLiIpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLyogT0ssIHRoZSByZW1vdGUgcGVlciBkaWQgc2VuZCB0aGUgSVNJIEFWUC4gKi8KKwkJCQlpZiAoKHBlZXItPnBfaGRyLmluZm8uY29uZmlnLnBpY19mbGFncy5zZWMgJiBQSV9TRUNfTk9ORSkgJiYgKHBlZXItPnBfaGRyLmluZm8ucnVudGltZS5waXJfaXNpICYgUElfU0VDX05PTkUpKSB7CisJCQkJCS8qIFdlIGhhdmUgYWxsb3dlZCBJUHNlYyAqLworCQkJCQlpc2kgPSBQSV9TRUNfTk9ORTsKKwkJCQl9IGVsc2UgaWYgKGZkX2dfY29uZmlnLT5jbmZfc2VjX2RhdGEudGxzX2Rpc2FibGVkKSB7CisJCQkJCS8qIFdlIGNhbiBhZ3JlZSBvbiBUTFMgKi8KKwkJCQkJVFJBQ0VfREVCVUcoSU5GTywgIlJlbW90ZSBwZWVyIGlzIG5vdCBhbGxvd2VkIGZvciBJUHNlYyBhbmQgVExTIGlzIGRpc2FibGVkLiIpOzsKKwkJCQl9IGVsc2UgaWYgKHBlZXItPnBfaGRyLmluZm8ucnVudGltZS5waXJfaXNpICYgUElfU0VDX1RMU19PTEQpIHsKKwkJCQkJLyogV2UgY2FuIGFncmVlIG9uIFRMUyAqLworCQkJCQlpc2kgPSBQSV9TRUNfVExTX09MRDsKKwkJCQl9IGVsc2UgeworCQkJCQlUUkFDRV9ERUJVRyhJTkZPLCAiUmVtb3RlIHBlZXIgcmVxdWVzdGVkIElQc2VjIHByb3RlY3Rpb24sIGJ1dCBsb2NhbCBjb25maWd1cmF0aW9uIGZvcmJpZHMgaXQuIik7CisJCQkJfQorCQkJfQorCQl9CisJCisJCS8qIElmIHdlIGRpZCBub3QgZmluZCBhbiBhZ3JlZW1lbnQgKi8KKwkJaWYgKCFpc2kpIHsKKwkJCVRSQUNFX0RFQlVHKElORk8sICJObyBjb21tb24gc2VjdXJpdHkgbWVjaGFuaXNtIHdpdGggJyVzJywgc2VuZGluZyBESUFNRVRFUl9OT19DT01NT05fU0VDVVJJVFkiLCBwZWVyLT5wX2hkci5pbmZvLnBpX2RpYW1pZCk7CisJCQlwZWkucGVpX2VycmNvZGUgPSAiRElBTUVURVJfTk9fQ09NTU9OX1NFQ1VSSVRZIjsKKwkJCWZhdGFsID0gMTsKKwkJCWdvdG8gZXJyb3JfYWJvcnQ7CisJCX0KKwkJCisJCS8qIERvIG5vdCBzZW5kIHRoZSBJU0kgSVBzZWMgaWYgd2UgYXJlIHVzaW5nIHRoZSBuZXcgbWVjaGFuaXNtICovCisJCWlmICgoaXNpID09IFBJX1NFQ19OT05FKSAmJiAoISAocGVlci0+cF9oZHIuaW5mby5jb25maWcucGljX2ZsYWdzLnNlYyAmIFBJX1NFQ19UTFNfT0xEKSkpCisJCQlpc2kgPSAwOworCX0gZWxzZSBpZiAocGVlci0+cF9oZHIuaW5mby5ydW50aW1lLnBpcl9pc2kgJiBQSV9TRUNfVExTX09MRCkgeworCQkvKiBTZWVtIHNvbWUgd2VpcmQgcGVlcnMgYXJlIHNlbmRpbmcgdGhlIEluYmFuZC1TZWN1cml0eS1JZCBBVlAgb24gdGhlIHNlY3VyZSBwb3J0Li4uIE5vIGhhcm0gKi8KKwkJaXNpID0gUElfU0VDX1RMU19PTEQ7CisJfQorCQorCS8qIFJlcGx5IGEgQ0VBICovCisJQ0hFQ0tfRkNUKCBmZF9tc2dfbmV3X2Fuc3dlcl9mcm9tX3JlcSAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgJm1zZywgMCApICk7CisJQ0hFQ0tfRkNUKCBmZF9tc2dfcmVzY29kZV9zZXQobXNnLCAiRElBTUVURVJfU1VDQ0VTUyIsIE5VTEwsIE5VTEwsIDAgKSApOworCUNIRUNLX0ZDVCggYWRkX0NFX2luZm8obXNnLCBwZWVyLT5wX2NueGN0eCwgaXNpICYgUElfU0VDX1RMU19PTEQsIGlzaSAmIFBJX1NFQ19OT05FKSApOworCQorCS8qIFRoZSBjb25uZWN0aW9uIGlzIGNvbXBsZXRlLCBidXQgd2UgbWF5IHN0aWxsIG5lZWQgVExTIGhhbmRzaGFrZSAqLworCWZkX2hvb2tfY2FsbChIT09LX1BFRVJfQ09OTkVDVF9TVUNDRVNTLCBtc2csIHBlZXIsIE5VTEwsIE5VTEwpOworCQorCUNIRUNLX0ZDVCggZmRfb3V0X3NlbmQoJm1zZywgcGVlci0+cF9jbnhjdHgsIHBlZXIsIDAgKSApOworCQorCS8qIEhhbmRzaGFrZSBpZiBuZWVkZWQgKi8KKwlpZiAoaXNpICYgUElfU0VDX1RMU19PTEQpIHsKKwkJZmRfcHNtX2NoYW5nZV9zdGF0ZShwZWVyLCBTVEFURV9PUEVOX0hBTkRTSEFLRSk7CisJCUNIRUNLX0ZDVF9ETyggZmRfY254X2hhbmRzaGFrZShwZWVyLT5wX2NueGN0eCwgR05VVExTX1NFUlZFUiwgQUxHT19IQU5EU0hBS0VfMzQzNiwgcGVlci0+cF9oZHIuaW5mby5jb25maWcucGljX3ByaW9yaXR5LCBOVUxMKSwKKwkJCXsKKwkJCQkvKiBIYW5kc2hha2UgZmFpbGVkIC4uLiAgKi8KKwkJCQlmZF9ob29rX2NhbGwoSE9PS19QRUVSX0NPTk5FQ1RfRkFJTEVELCBOVUxMLCBwZWVyLCAiVExTIGhhbmRzaGFrZSBmYWlsZWQgYWZ0ZXIgQ0VSL0NFQSBleGNoYW5nZSIsIE5VTEwpOworCQkJCWdvdG8gY2xlYW51cDsKKwkJCX0gKTsKKwkJCisJCS8qIFJldHJpZXZlIHRoZSBjcmVkZW50aWFscyAqLworCQlDSEVDS19GQ1RfRE8oIGZkX2NueF9nZXRjcmVkKHBlZXItPnBfY254Y3R4LCAmcGVlci0+cF9oZHIuaW5mby5ydW50aW1lLnBpcl9jZXJ0X2xpc3QsICZwZWVyLT5wX2hkci5pbmZvLnJ1bnRpbWUucGlyX2NlcnRfbGlzdF9zaXplKSwKKwkJCXsKKwkJCQkvKiBFcnJvciAuLi4gICovCisJCQkJZmRfaG9va19jYWxsKEhPT0tfUEVFUl9DT05ORUNUX0ZBSUxFRCwgTlVMTCwgcGVlciwgIlVuYWJsZSB0byByZXRyaWV2ZSByZW1vdGUgY3JlZGVudGlhbHMgYWZ0ZXIgVExTIGhhbmRzaGFrZSIsIE5VTEwpOworCQkJCWdvdG8gY2xlYW51cDsKKwkJCX0gKTsKKwkJCisJCQorCQkvKiBDYWxsIHNlY29uZCB2YWxpZGF0aW9uIGNhbGxiYWNrIGlmIG5lZWRlZCAqLworCQlpZiAocGVlci0+cF9jYjIpIHsKKwkJCVRSQUNFX0RFQlVHKEZVTEwsICJDYWxsaW5nIHNlY29uZCB2YWxpZGF0aW9uIGNhbGxiYWNrIGZvciAlcyIsIHBlZXItPnBfaGRyLmluZm8ucGlfZGlhbWlkKTsKKwkJCUNIRUNLX0ZDVF9ETyggKCpwZWVyLT5wX2NiMikoICZwZWVyLT5wX2hkci5pbmZvICksCisJCQkJeworCQkJCQlmZF9ob29rX2NhbGwoSE9PS19QRUVSX0NPTk5FQ1RfRkFJTEVELCBOVUxMLCBwZWVyLCAiVmFsaWRhdGlvbiBjYWxsYmFjayByZWplY3RlZCB0aGUgcGVlciBhZnRlciBoYW5kc2hha2UiLCBOVUxMKTsKKwkJCQkJQ0hFQ0tfRkNUKCBmZF9wc21fdGVybWluYXRlKCBwZWVyLCAiRE9fTk9UX1dBTlRfVE9fVEFMS19UT19ZT1UiICkgKTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfSAgKTsKKwkJfQorCQl0bHNfc3luYyA9IDE7CisJfSBlbHNlIHsKKwkJaWYgKCAhIGZkX2NueF9nZXRUTFMocGVlci0+cF9jbnhjdHgpICkgeworCQkJVFJBQ0VfREVCVUcoSU5GTywgIk5vIFRMUyBwcm90ZWN0aW9uIG5lZ290aWF0ZWQgd2l0aCBwZWVyICclcycuIiwgcGVlci0+cF9oZHIuaW5mby5waV9kaWFtaWQpOworCQkJQ0hFQ0tfRkNUKCBmZF9jbnhfc3RhcnRfY2xlYXIocGVlci0+cF9jbnhjdHgsIDEpICk7CisJCX0KKwl9CisJCQorCS8qIE1vdmUgdG8gT1BFTiBvciBSRU9QRU4gc3RhdGUgKi8KKwlpZiAocGVlci0+cF9mbGFncy5wZl9jbnhfcGIpIHsKKwkJZmRfcHNtX2NoYW5nZV9zdGF0ZShwZWVyLCBTVEFURV9SRU9QRU4gKTsKKwkJQ0hFQ0tfRkNUKCBmZF9wX2R3X3Jlb3BlbihwZWVyKSApOworCX0gZWxzZSB7CisJCWlmICgoIXRsc19zeW5jKSAmJiAoZmRfY254X2lzX3Vub3JkZXJlZF9kZWxpdmVyeV9zdXBwb3J0ZWQocGVlci0+cF9jbnhjdHgpKSkgeworCQkJZmRfcHNtX2NoYW5nZV9zdGF0ZShwZWVyLCBTVEFURV9PUEVOX05FVyApOworCQkJLyogc2VuZCBEV1IgKi8KKwkJCUNIRUNLX0ZDVCggZmRfcF9kd190aW1lb3V0KHBlZXIpICk7CisJCX0gZWxzZSB7CisKKwkJCWZkX3BzbV9jaGFuZ2Vfc3RhdGUocGVlciwgU1RBVEVfT1BFTiApOworCQkJZmRfcHNtX25leHRfdGltZW91dChwZWVyLCAxLCBwZWVyLT5wX2hkci5pbmZvLmNvbmZpZy5waWNfdHd0aW1lciA/OiBmZF9nX2NvbmZpZy0+Y25mX3RpbWVyX3R3KTsKKwkJfQorCX0KKwkKKwlyZXR1cm4gMDsKKworZXJyb3JfYWJvcnQ6CisJaWYgKHBlaS5wZWlfZXJyY29kZSkgeworCQkvKiBTZW5kIHRoZSBlcnJvciAqLworCQlmZF9ob29rX2NhbGwoSE9PS19QRUVSX0NPTk5FQ1RfRkFJTEVELCBtc2csIHBlZXIsIHBlaS5wZWlfbWVzc2FnZSA/OiBwZWkucGVpX2VycmNvZGUsIE5VTEwpOworCQlyZWNlaXZlcl9yZWplY3QoJnBlZXItPnBfY254Y3R4LCAmbXNnLCAmcGVpKTsKKwl9IGVsc2UgeworCQljaGFyIGJ1ZlsxMDI0XTsKKwkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIlVuZXhwZWN0ZWQgZXJyb3Igb2NjdXJyZWQgd2hpbGUgcHJvY2Vzc2luZyBpbmNvbWluZyBjb25uZWN0aW9uIGZyb20gJyVzJy4iLCBwZWVyLT5wX2hkci5pbmZvLnBpX2RpYW1pZCk7CisJCWZkX2hvb2tfY2FsbChIT09LX1BFRVJfQ09OTkVDVF9GQUlMRUQsIG1zZywgcGVlciwgYnVmLCBOVUxMKTsKKwl9CisJCitjbGVhbnVwOgorCWlmIChtc2cpIHsKKwkJZmRfbXNnX2ZyZWUobXNnKTsKKwl9CisJZmRfcF9jZV9jbGVhcl9jbngocGVlciwgTlVMTCk7CisKKwkvKiBTZW5kIHRoZSBlcnJvciB0byB0aGUgcGVlciAqLworCUNIRUNLX0ZDVCggZmRfZXZlbnRfc2VuZChwZWVyLT5wX2V2ZW50cywgZmF0YWwgPyBGREVWUF9URVJNSU5BVEUgOiBGREVWUF9DTlhfRVJST1IsIDAsIE5VTEwpICk7CisKKwlyZXR1cm4gMDsKK30KKworLyogV2UgaGF2ZSByZWNlaXZlZCBhIENFUiBvbiBhIG5ldyBjb25uZWN0aW9uIGZvciB0aGlzIHBlZXIgKi8KK2ludCBmZF9wX2NlX2hhbmRsZV9uZXdDRVIoc3RydWN0IG1zZyAqKiBtc2csIHN0cnVjdCBmZF9wZWVyICogcGVlciwgc3RydWN0IGNueGN0eCAqKiBjbngsIGludCB2YWxpZCkKK3sKKwlzdHJ1Y3QgZmRfcGVpIHBlaTsKKwlpbnQgY3VyX3N0YXRlID0gZmRfcGVlcl9nZXRzdGF0ZShwZWVyKTsKKwltZW1zZXQoJnBlaSwgMCwgc2l6ZW9mKHBlaSkpOworCQorCXN3aXRjaCAoY3VyX3N0YXRlKSB7CisJCWNhc2UgU1RBVEVfQ0xPU0VEOgorCQkJcGVlci0+cF9yZWNlaXZlciA9ICpjbng7CisJCQkqY254ID0gTlVMTDsKKwkJCXBlZXItPnBfY2VyID0gKm1zZzsKKwkJCSptc2cgPSBOVUxMOworCQkJQ0hFQ0tfRkNUKCBmZF9wX2NlX3Byb2Nlc3NfcmVjZWl2ZXIocGVlcikgKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU1RBVEVfV0FJVENOWEFDSzoKKwkJCS8qIFNhdmUgdGhlIHBhcmFtZXRlcnMgaW4gdGhlIHBlZXIsIG1vdmUgdG8gU1RBVEVfV0FJVENOWEFDS19FTEVDICovCisJCQlwZWVyLT5wX3JlY2VpdmVyID0gKmNueDsKKwkJCSpjbnggPSBOVUxMOworCQkJcGVlci0+cF9jZXIgPSAqbXNnOworCQkJKm1zZyA9IE5VTEw7CisJCQlDSEVDS19GQ1QoIGZkX3BzbV9jaGFuZ2Vfc3RhdGUocGVlciwgU1RBVEVfV0FJVENOWEFDS19FTEVDKSApOworCQkJYnJlYWs7CisJCQkKKwkJY2FzZSBTVEFURV9XQUlUQ0VBOgorCQkJaWYgKGVsZWN0aW9uX3Jlc3VsdChwZWVyKSkgeworCQkJCQorCQkJCS8qIENsb3NlIGluaXRpYXRvciBjb25uZWN0aW9uICh3YXMgYWxyZWFkeSBzZXQgYXMgcHJpbmNpcGFsKSAqLworCQkJCUxPR19EKCIlczogRWxlY3Rpb24gbG9zdCBvbiBvdXRnb2luZyBjb25uZWN0aW9uLCBjbG9zaW5nIGFuZCBhbnN3ZXJpbmcgQ0VBIG9uIGluY29taW5nIGNvbm5lY3Rpb24uIiwgcGVlci0+cF9oZHIuaW5mby5waV9kaWFtaWQpOworCQkJCWZkX3BfY2VfY2xlYXJfY254KHBlZXIsIE5VTEwpOworCQkJCQorCQkJCS8qIGFuZCBnbyBvbiB3aXRoIHRoZSByZWNlaXZlciBzaWRlICovCisJCQkJcGVlci0+cF9yZWNlaXZlciA9ICpjbng7CisJCQkJKmNueCA9IE5VTEw7CisJCQkJcGVlci0+cF9jZXIgPSAqbXNnOworCQkJCSptc2cgPSBOVUxMOworCQkJCUNIRUNLX0ZDVCggZmRfcF9jZV9wcm9jZXNzX3JlY2VpdmVyKHBlZXIpICk7CisKKwkJCX0gZWxzZSB7CisKKwkJCQkvKiBBbnN3ZXIgYW4gRUxFQ1RJT04gTE9TVCB0byB0aGUgcmVjZWl2ZXIgc2lkZSBhbmQgY29udGludWUgKi8KKwkJCQlwZWkucGVpX2VycmNvZGUgPSAiRUxFQ1RJT05fTE9TVCI7CisJCQkJcGVpLnBlaV9tZXNzYWdlID0gIlBsZWFzZSBhbnN3ZXIgbXkgQ0VSIGluc3RlYWQsIHlvdSB3b24gdGhlIGVsZWN0aW9uLiI7CisJCQkJTE9HX0QoIiVzOiBFbGVjdGlvbiBsb3N0IG9uIGluY29taW5nIGNvbm5lY3Rpb24sIGNsb3NpbmcgYW5kIHdhaXRpbmcgZm9yIENFQSBvbiBvdXRnb2luZyBjb25uZWN0aW9uLiIsIHBlZXItPnBfaGRyLmluZm8ucGlfZGlhbWlkKTsKKwkJCQlyZWNlaXZlcl9yZWplY3QoY254LCBtc2csICZwZWkpOworCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXBlaS5wZWlfZXJyY29kZSA9ICJESUFNRVRFUl9VTkFCTEVfVE9fQ09NUExZIjsgLyogSU5WQUxJRCBDT01NQU5EPyBpbiBjYXNlIG9mIENhcGFiaWxpdGllcy1VcGRhdGVzPyAqLworCQkJcGVpLnBlaV9tZXNzYWdlID0gIkludmFsaWQgc3RhdGUgdG8gcmVjZWl2ZSBhIG5ldyBjb25uZWN0aW9uIGF0dGVtcHQuIjsKKwkJCUxPR19FKCIlczogUmVqZWN0aW5nIG5ldyBjb25uZWN0aW9uIGF0dGVtcHQgd2hpbGUgb3VyIHN0YXRlIG1hY2hpbmUgaXMgaW4gc3RhdGUgJyVzJyIsIHBlZXItPnBfaGRyLmluZm8ucGlfZGlhbWlkLCBTVEFURV9TVFIoY3VyX3N0YXRlKSk7CisJCQlyZWNlaXZlcl9yZWplY3QoY254LCBtc2csICZwZWkpOworCX0KKwkJCQkKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYmZkY29yZS9wX2NueC5jIGIvbGliZmRjb3JlL3BfY254LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRjMmEwMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmZkY29yZS9wX2NueC5jCkBAIC0wLDAgKzEsMzU3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxMywgV0lERSBQcm9qZWN0IGFuZCBOSUNUCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBXSURFIFByb2plY3Qgb3IgTklDVCBub3IgdGhlIAkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFdJREUgUHJvamVjdCBhbmQgCQkJCQkJICoKKyogICBOSUNULgkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJmZGNvcmUtaW50ZXJuYWwuaCIKKworCisvKiBUT0RPOiBjaGFuZ2UgdGhlIGJlaGF2aW9yIHRvIGhhbmRsZSBwcm9wZXJseSBmb3JjZWQgb3JkZXJpbmcgYXQgYmVnaW5uaW5nICYgZW5kIG9mIE9QRU4gc3RhdGUgKi8KKworLyogVGhpcyBmaWxlIGNvbnRhaW5zIGNvZGUgdXNlZCBieSBhIHBlZXIgc3RhdGUgbWFjaGluZSB0byBpbml0aWF0ZSBhIGNvbm5lY3Rpb24gdG8gcmVtb3RlIHBlZXIgKi8KKworc3RydWN0IG5leHRfY29ubiB7CisJc3RydWN0IGZkX2xpc3QJY2hhaW47CisJaW50CQlwcm90bzsJLyogUHJvdG9jb2wgb2YgdGhlIG5leHQgYXR0ZW1wdCAqLworCXVuaW9uIHsKKwkJc1NTCXNzOwkvKiBUaGUgYWRkcmVzcywgb25seSBmb3IgVENQICovCisJCXNTQTQJc2luOworCQlzU0E2CXNpbjY7CisJfTsKKwl1aW50MTZfdAlwb3J0OwkvKiBUaGUgcG9ydCwgZm9yIFNDVFAgKGluY2x1ZGVkIGluIHNzIGZvciBUQ1ApICovCisJaW50CQlkb3RsczsJLyogSGFuZHNoYWtlIFRMUyBhZnRlciBjb25uZWN0aW9uID8gKi8KK307CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgZmFpbGVkX2Nvbm5lY3Rpb25fYXR0ZW1wdChzdHJ1Y3QgZmRfcGVlciAqIHBlZXIpCit7CisJLyogU2ltcGx5IHJlbW92ZSB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgbGlzdCBpZiBub3QgZW1wdHkgKi8KKwlpZiAoISBGRF9JU19MSVNUX0VNUFRZKCZwZWVyLT5wX2Nvbm5wYXJhbXMpICkgeworCQlzdHJ1Y3QgZmRfbGlzdCAqIGxpID0gcGVlci0+cF9jb25ucGFyYW1zLm5leHQ7CisJCWZkX2xpc3RfdW5saW5rKGxpKTsKKwkJZnJlZShsaSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBlbXB0eV9jb25uZWN0aW9uX2xpc3Qoc3RydWN0IGZkX3BlZXIgKiBwZWVyKQoreworCS8qIFJlbW92ZSBhbGwgaXRlbXMgKi8KKwl3aGlsZSAoIUZEX0lTX0xJU1RfRU1QVFkoJnBlZXItPnBfY29ubnBhcmFtcykpIHsKKwkJZmFpbGVkX2Nvbm5lY3Rpb25fYXR0ZW1wdChwZWVyKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcHJlcGFyZV9jb25uZWN0aW9uX2xpc3Qoc3RydWN0IGZkX3BlZXIgKiBwZWVyKQoreworCXN0cnVjdCBmZF9saXN0ICogbGksICpsYXN0X3ByaW87CisJc3RydWN0IG5leHRfY29ubiAgICogbmV3OyAKKwkKKwl1aW50MTZfdAlwb3J0X25vOyAvKiBuZXR3b3JrIG9yZGVyICovCisJaW50CQlkb3Rsc19pbW1lZGlhdGU7CisJaW50IGNvdW50ID0gMDsKKwkKKwlUUkFDRV9FTlRSWSgiJXAiLCBwZWVyKTsKKwkgCisJLyogUmVzb2x2ZSBwZWVyIGFkZHJlc3MoZXMpIGlmIG5lZWRlZCAqLworCWlmIChGRF9JU19MSVNUX0VNUFRZKCZwZWVyLT5wX2hkci5pbmZvLnBpX2VuZHBvaW50cykpIHsKKwkJc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqYWksICphaXA7CisJCWludCByZXQ7CisKKwkJbWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7CisJCWhpbnRzLmFpX2ZsYWdzID0gQUlfQUREUkNPTkZJRzsKKwkJcmV0ID0gZ2V0YWRkcmluZm8ocGVlci0+cF9oZHIuaW5mby5waV9kaWFtaWQsIE5VTEwsICZoaW50cywgJmFpKTsKKwkJaWYgKHJldCkgeworCQkJVFJBQ0VfREVCVUcoSU5GTywgIlVuYWJsZSB0byByZXNvbHZlIGFkZHJlc3MgZm9yIHBlZXIgJyVzJyAoJXMpLCBhYm9ydGluZyIsIHBlZXItPnBfaGRyLmluZm8ucGlfZGlhbWlkLCBnYWlfc3RyZXJyb3IocmV0KSk7CisJCQlpZiAocmV0ICE9IEVBSV9BR0FJTikKKwkJCQlmZF9wc21fdGVybWluYXRlKCBwZWVyLCBOVUxMICk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQkKKwkJZm9yIChhaXAgPSBhaTsgYWlwICE9IE5VTEw7IGFpcCA9IGFpcC0+YWlfbmV4dCkgeworCQkJQ0hFQ0tfRkNUKCBmZF9lcF9hZGRfbWVyZ2UoICZwZWVyLT5wX2hkci5pbmZvLnBpX2VuZHBvaW50cywgYWlwLT5haV9hZGRyLCBhaXAtPmFpX2FkZHJsZW4sIEVQX0ZMX0RJU0MgKSApOworCQl9CisJCWZyZWVhZGRyaW5mbyhhaSk7CisJfQorCQorCS8qIFJlbW92ZSBhZGRyZXNzZXMgZnJvbSB1bndhbnRlZCBmYW1pbHkgKi8KKwlpZiAocGVlci0+cF9oZHIuaW5mby5jb25maWcucGljX2ZsYWdzLnBybzMpIHsKKwkJQ0hFQ0tfRkNUKCBmZF9lcF9maWx0ZXJfZmFtaWx5KAorCQkJCQkmcGVlci0+cF9oZHIuaW5mby5waV9lbmRwb2ludHMsIAorCQkJCQkocGVlci0+cF9oZHIuaW5mby5jb25maWcucGljX2ZsYWdzLnBybzMgPT0gUElfUDNfSVApID8gCisJCQkJCQlBRl9JTkVUIAorCQkJCQkJOiBBRl9JTkVUNikpOworCX0KKwlpZiAoZmRfZ19jb25maWctPmNuZl9mbGFncy5ub19pcDQpIHsKKwkJQ0hFQ0tfRkNUKCBmZF9lcF9maWx0ZXJfZmFtaWx5KAorCQkJCQkmcGVlci0+cF9oZHIuaW5mby5waV9lbmRwb2ludHMsIAorCQkJCQlBRl9JTkVUNikpOworCX0KKwlpZiAoZmRfZ19jb25maWctPmNuZl9mbGFncy5ub19pcDYpIHsKKwkJQ0hFQ0tfRkNUKCBmZF9lcF9maWx0ZXJfZmFtaWx5KAorCQkJCQkmcGVlci0+cF9oZHIuaW5mby5waV9lbmRwb2ludHMsIAorCQkJCQlBRl9JTkVUKSk7CisJfQorCQorCS8qIFdlIGRvbid0IHVzZSB0aGUgYWx0ZXJuYXRlIGFkZHJlc3NlcyB0aGF0IHdlcmUgc2VudCBieSB0aGUgcmVtb3RlIHBlZXIgKi8KKwlDSEVDS19GQ1QoIGZkX2VwX2NsZWFyZmxhZ3MoJnBlZXItPnBfaGRyLmluZm8ucGlfZW5kcG9pbnRzLCBFUF9GTF9BRFYpICk7CisJCisJCisJLyogTm93IGNoZWNrIHdlIGhhdmUgYXQgbGVhc3Qgb25lIGFkZHJlc3MgdG8gYXR0ZW1wdCAqLworCWlmIChGRF9JU19MSVNUX0VNUFRZKCZwZWVyLT5wX2hkci5pbmZvLnBpX2VuZHBvaW50cykpIHsKKwkJVFJBQ0VfREVCVUcoSU5GTywgIk5vIGFkZHJlc3MgJXNhdmFpbGFibGUgdG8gY29ubmVjdCB0byBwZWVyICclcycsIGFib3J0aW5nIiwgCisJCQkJCXBlZXItPnBfaGRyLmluZm8uY29uZmlnLnBpY19mbGFncy5wcm8zID8gImluIHRoZSBjb25maWd1cmVkIGZhbWlseSAiIDogIiIsIHBlZXItPnBfaGRyLmluZm8ucGlfZGlhbWlkKTsKKwkJZmRfcHNtX3Rlcm1pbmF0ZSggcGVlciwgTlVMTCApOworCQlyZXR1cm4gMDsKKwl9CisJCisJLyogQ2hlY2sgaWYgd2UgYXJlIGFibGUgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGlzIHBlZXIgKi8KKwlpZiAoZmRfZ19jb25maWctPmNuZl9zZWNfZGF0YS50bHNfZGlzYWJsZWQgJiYgKCBwZWVyLT5wX2hkci5pbmZvLmNvbmZpZy5waWNfZmxhZ3Muc2VjICE9IFBJX1NFQ19OT05FKSkgeworCQlMT0dfRSgiUGVlciAnJXMnIG5vdCBjb25maWd1cmVkIGZvciBOb19UTFMgYW5kIFRMUyBpcyBsb2NhbGx5IGRpc2FibGVkOyBnaXZpbmcgdXAgY29ubmVjdGlvbiBhdHRlbXB0cyIsIAorCQkJCQlwZWVyLT5wX2hkci5pbmZvLnBpX2RpYW1pZCk7CisJCWZkX3BzbV90ZXJtaW5hdGUoIHBlZXIsIE5VTEwgKTsKKwkJcmV0dXJuIDA7CisJfQorCQorCS8qIENsZWFudXAgYW55IHByZXZpb3VzIGxpc3QgKi8KKwllbXB0eV9jb25uZWN0aW9uX2xpc3QocGVlcik7CisJCisJLyogUHJlcGFyZSB0aGUgcGFyYW1ldGVycyAqLworCWlmICgocGVlci0+cF9oZHIuaW5mby5jb25maWcucGljX2ZsYWdzLnNlYyAhPSBQSV9TRUNfREVGQVVMVCkgfHwgKGZkX2dfY29uZmlnLT5jbmZfZmxhZ3MudGxzX2FsZykpIHsKKwkJZG90bHNfaW1tZWRpYXRlID0gMDsKKwkJcG9ydF9ubyA9IGh0b25zKHBlZXItPnBfaGRyLmluZm8uY29uZmlnLnBpY19wb3J0ID86IERJQU1FVEVSX1BPUlQpOworCX0gZWxzZSB7CisJCWRvdGxzX2ltbWVkaWF0ZSA9IDE7CisJCXBvcnRfbm8gPSBodG9ucyhwZWVyLT5wX2hkci5pbmZvLmNvbmZpZy5waWNfcG9ydCA/OiBESUFNRVRFUl9TRUNVUkVfUE9SVCk7CisJfQorCQorCWxhc3RfcHJpbyA9ICZwZWVyLT5wX2Nvbm5wYXJhbXM7CisJCisJLyogQ3JlYXRlIFRDUCBwYXJhbWV0ZXJzIHVubGVzcyBzcGVjaWZpZWQgb3RoZXJ3aXNlICovCisJaWYgKCghZmRfZ19jb25maWctPmNuZl9mbGFncy5ub190Y3ApICYmIChwZWVyLT5wX2hkci5pbmZvLmNvbmZpZy5waWNfZmxhZ3MucHJvNCAhPSBQSV9QNF9TQ1RQKSkgeworCQlmb3IgKGxpID0gcGVlci0+cF9oZHIuaW5mby5waV9lbmRwb2ludHMubmV4dDsgbGkgIT0gJnBlZXItPnBfaGRyLmluZm8ucGlfZW5kcG9pbnRzOyBsaSA9IGxpLT5uZXh0KSB7CisJCQlzdHJ1Y3QgZmRfZW5kcG9pbnQgKiBlcCA9IChzdHJ1Y3QgZmRfZW5kcG9pbnQgKilsaTsKKwkJCQorCQkJQ0hFQ0tfTUFMTE9DKCBuZXcgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBuZXh0X2Nvbm4pKSApOworCQkJbWVtc2V0KG5ldywgMCwgc2l6ZW9mKHN0cnVjdCBuZXh0X2Nvbm4pKTsKKwkJCWZkX2xpc3RfaW5pdCgmbmV3LT5jaGFpbiwgbmV3KTsKKwkJCQorCQkJbmV3LT5wcm90byA9IElQUFJPVE9fVENQOworCQkJCisJCQltZW1jcHkoICZuZXctPnNzLCAmZXAtPnNzLCBzaXplb2Yoc1NTKSApOworCQkJc3dpdGNoIChuZXctPnNzLnNzX2ZhbWlseSkgeworCQkJCWNhc2UgQUZfSU5FVDoKKwkJCQkJbmV3LT5zaW4uc2luX3BvcnQgPSBwb3J0X25vOworCQkJCQlicmVhazsKKwkJCQljYXNlIEFGX0lORVQ2OgorCQkJCQluZXctPnNpbjYuc2luNl9wb3J0ID0gcG9ydF9ubzsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJZnJlZShuZXcpOworCQkJCQljb250aW51ZTsgLyogTW92ZSB0byB0aGUgbmV4dCBlbmRwb2ludCAqLworCQkJfQorCQkJCisJCQluZXctPmRvdGxzID0gZG90bHNfaW1tZWRpYXRlOworCQkJCisJCQkvKiBBZGQgdGhlIG5ldyBlbnRyeSB0byB0aGUgYXBwcm9wcmlhdGUgcG9zaXRpb24gKGNvbmYgYW5kIGRpc2MgZ28gZmlyc3QpICovCisJCQlpZiAoZXAtPmZsYWdzICYgKEVQX0ZMX0NPTkYgfCBFUF9GTF9ESVNDKSkgeworCQkJCWZkX2xpc3RfaW5zZXJ0X2FmdGVyKGxhc3RfcHJpbywgJm5ldy0+Y2hhaW4pOworCQkJCWxhc3RfcHJpbyA9ICZuZXctPmNoYWluOworCQkJfSBlbHNlIHsKKwkJCQlmZF9saXN0X2luc2VydF9iZWZvcmUoJnBlZXItPnBfY29ubnBhcmFtcywgJm5ldy0+Y2hhaW4pOworCQkJfQorCQkJY291bnQrKzsKKwkJfQorCX0KKwkKKwkvKiBOb3csIGFkZCB0aGUgU0NUUCBlbnRyeSwgaWYgbm90IGRpc2FibGVkICovCisjaWZuZGVmIERJU0FCTEVfU0NUUAorCWlmICgoIWZkX2dfY29uZmlnLT5jbmZfZmxhZ3Mubm9fc2N0cCkgJiYgKHBlZXItPnBfaGRyLmluZm8uY29uZmlnLnBpY19mbGFncy5wcm80ICE9IFBJX1A0X1RDUCkpIHsKKwkJc3RydWN0IG5leHRfY29ubiAgICogbmV3OworCQkKKwkJQ0hFQ0tfTUFMTE9DKCBuZXcgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBuZXh0X2Nvbm4pKSApOworCQltZW1zZXQobmV3LCAwLCBzaXplb2Yoc3RydWN0IG5leHRfY29ubikpOworCQlmZF9saXN0X2luaXQoJm5ldy0+Y2hhaW4sIG5ldyk7CisKKwkJbmV3LT5wcm90byA9IElQUFJPVE9fU0NUUDsKKwkJbmV3LT5wb3J0ICA9IG50b2hzKHBvcnRfbm8pOyAvKiBiYWNrIHRvIGhvc3QgYnl0ZSBvcmRlci4uLiAqLworCQluZXctPmRvdGxzID0gZG90bHNfaW1tZWRpYXRlOworCisJCS8qIEFkZCB0aGUgbmV3IGVudHJ5IHRvIHRoZSBhcHByb3ByaWF0ZSBwb3NpdGlvbiAoZGVwZW5kaW5nIG9uIHByZWZlcmVuY2VzKSAqLworCQlpZiAoKGZkX2dfY29uZmlnLT5jbmZfZmxhZ3MucHJfdGNwKSB8fCAocGVlci0+cF9oZHIuaW5mby5jb25maWcucGljX2ZsYWdzLmFsZyA9PSBQSV9BTEdQUkVGX1RDUCkpIHsKKwkJCWZkX2xpc3RfaW5zZXJ0X2FmdGVyKGxhc3RfcHJpbywgJm5ldy0+Y2hhaW4pOworCQl9IGVsc2UgeworCQkJZmRfbGlzdF9pbnNlcnRfYWZ0ZXIoJnBlZXItPnBfY29ubnBhcmFtcywgJm5ldy0+Y2hhaW4pOyAvKiB2ZXJ5IGZpcnN0IHBvc2l0aW9uICovCisJCX0KKwkJY291bnQrKzsKKwl9CisjZW5kaWYgLyogRElTQUJMRV9TQ1RQICovCisJCisJTE9HX0QoIlByZXBhcmVkICVkIHNldHMgb2YgY29ubmVjdGlvbiBwYXJhbWV0ZXJzIHRvIHBlZXIgJXMiLCBjb3VudCwgcGVlci0+cF9oZHIuaW5mby5waV9kaWFtaWQpOworCQorCXJldHVybiAwOworfQorCisKKy8qIFRoZSB0aHJlYWQgdGhhdCBhdHRlbXB0cyB0aGUgY29ubmVjdGlvbiAqLworc3RhdGljIHZvaWQgKiBjb25uZWN0X3Rocih2b2lkICogYXJnKQoreworCXN0cnVjdCBmZF9wZWVyICogcGVlciA9IGFyZzsKKwlzdHJ1Y3QgY254Y3R4ICogY254ID0gTlVMTDsKKwlzdHJ1Y3QgbmV4dF9jb25uICogbmMgPSBOVUxMOworCWludCByZWJ1aWx0ID0gMDsKKwlpbnQgZmF0YWxfZXJyb3I9MDsKKwkKKwlUUkFDRV9FTlRSWSgiJXAiLCBhcmcpOworCUNIRUNLX1BBUkFNU19ETyggQ0hFQ0tfUEVFUihwZWVyKSwgcmV0dXJuIE5VTEwgKTsKKworCS8qIFNldCB0aGUgdGhyZWFkIG5hbWUgKi8KKwl7CisJCWNoYXIgYnVmWzQ4XTsKKwkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIkNvbm5UbzolcyIsIHBlZXItPnBfaGRyLmluZm8ucGlfZGlhbWlkKTsKKwkJZmRfbG9nX3RocmVhZG5hbWUgKCBidWYgKTsKKwl9CisJCisJZG8geworCQkvKiBSZWJ1aWxkIHRoZSBsaXN0IGlmIG5lZWRlZCwgaWYgaXQgaXMgZW1wdHkgLS0gYnV0IGF0IG1vc3Qgb25jZSAqLworCQlpZiAoRkRfSVNfTElTVF9FTVBUWSgmcGVlci0+cF9jb25ucGFyYW1zKSkgeworCQkJaWYgKCEgcmVidWlsdCkgeworCQkJCUNIRUNLX0ZDVF9ETyggZmF0YWxfZXJyb3IgPSBwcmVwYXJlX2Nvbm5lY3Rpb25fbGlzdChwZWVyKSwgZ290byBvdXQgKTsKKwkJCQlyZWJ1aWx0ICsrOworCQkJfQorCQkJaWYgKEZEX0lTX0xJU1RfRU1QVFkoJnBlZXItPnBfY29ubnBhcmFtcykpIHsKKwkJCQkvKiBXZSBlbmNvdW50ZXJlZCBhbiBlcnJvciBvciB3ZSBoYXZlIGxvb3BlZCBvdmVyIGFsbCB0aGUgYWRkcmVzc2VzIG9mIHRoZSBwZWVyLiAqLworCQkJCWZkX2hvb2tfY2FsbChIT09LX1BFRVJfQ09OTkVDVF9GQUlMRUQsIE5VTEwsIHBlZXIsICJBbGwgY29ubmVjdGlvbiBhdHRlbXB0cyBmYWlsZWQsIHdpbGwgcmV0cnkgbGF0ZXIiLCBOVUxMKTsKKwkJCQkKKwkJCQlDSEVDS19GQ1RfRE8oIGZhdGFsX2Vycm9yID0gZmRfZXZlbnRfc2VuZChwZWVyLT5wX2V2ZW50cywgRkRFVlBfQ05YX0ZBSUxFRCwgMCwgTlVMTCksIGdvdG8gb3V0ICk7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCX0KKwkJCisJCS8qIEF0dGVtcHQgY29ubmVjdGlvbiB0byB0aGUgZmlyc3QgZW50cnkgKi8KKwkJbmMgPSAoc3RydWN0IG5leHRfY29ubiAqKShwZWVyLT5wX2Nvbm5wYXJhbXMubmV4dCk7CisJCQorCQlzd2l0Y2ggKG5jLT5wcm90bykgeworCQkJY2FzZSBJUFBST1RPX1RDUDoKKwkJCQljbnggPSBmZF9jbnhfY2xpX2Nvbm5lY3RfdGNwKChzU0EgKikmbmMtPnNzLCBzU0FsZW4oJm5jLT5zcykpOworCQkJCWJyZWFrOworI2lmbmRlZiBESVNBQkxFX1NDVFAJCQkKKwkJCWNhc2UgSVBQUk9UT19TQ1RQOgorCQkJCWNueCA9IGZkX2NueF9jbGlfY29ubmVjdF9zY3RwKChwZWVyLT5wX2hkci5pbmZvLmNvbmZpZy5waWNfZmxhZ3MucHJvMyA9PSBQSV9QM19JUCkgPyAxIDogZmRfZ19jb25maWctPmNuZl9mbGFncy5ub19pcDYsIAorCQkJCQkJCW5jLT5wb3J0LCAmcGVlci0+cF9oZHIuaW5mby5waV9lbmRwb2ludHMpOworCQkJCWJyZWFrOworI2VuZGlmIC8qIERJU0FCTEVfU0NUUCAqLworCQl9CisJCQorCQlpZiAoY254KQorCQkJYnJlYWs7CisJCQorCQkvKiBQb3AgdGhlc2UgcGFyYW1ldGVycyBhbmQgY29udGludWUgKi8KKwkJZmFpbGVkX2Nvbm5lY3Rpb25fYXR0ZW1wdChwZWVyKTsKKwkJCisJCXB0aHJlYWRfdGVzdGNhbmNlbCgpOworCQkKKwl9IHdoaWxlICghY254KTsgLyogYW5kIHVudGlsIGNhbmNlbGxhdGlvbiBvciBhbGwgYWRkcmVzc2VzIGF0dGVtcHRlZCB3aXRob3V0IHN1Y2Nlc3MgKi8KKwkKKwkvKiBOb3csIHdlIGhhdmUgYW4gZXN0YWJsaXNoZWQgY29ubmVjdGlvbiBpbiBjbnggKi8KKwkKKwlwdGhyZWFkX2NsZWFudXBfcHVzaCgodm9pZCAqKWZkX2NueF9kZXN0cm95LCBjbngpOworCQorCS8qIFNldCB0aGUgaG9zdG5hbWUgaW4gdGhlIGNvbm5lY3Rpb24sIHNvIHRoYXQgaGFuZHNoYWtlIHZlcmlmaWVzIHRoZSByZW1vdGUgaWRlbnRpdHkgKi8KKwlmZF9jbnhfc2V0aG9zdG5hbWUoY254LHBlZXItPnBfaGRyLmluZm8ucGlfZGlhbWlkKTsKKwkKKwkvKiBIYW5kc2hha2UgaWYgbmVlZGVkIChzZWN1cmUgcG9ydCkgKi8KKwlpZiAobmMtPmRvdGxzKSB7CisJCUNIRUNLX0ZDVF9ETyggZmRfY254X2hhbmRzaGFrZShjbngsIEdOVVRMU19DTElFTlQsIAorCQkJCQkJQUxHT19IQU5EU0hBS0VfMzQzNiwKKwkJCQkJCXBlZXItPnBfaGRyLmluZm8uY29uZmlnLnBpY19wcmlvcml0eSwgTlVMTCksCisJCQl7CisJCQkJLyogSGFuZHNoYWtlIGZhaWxlZCAuLi4gICovCisJCQkJZmRfaG9va19jYWxsKEhPT0tfUEVFUl9DT05ORUNUX0ZBSUxFRCwgTlVMTCwgcGVlciwgIlRMUyBIYW5kc2hha2UgZmFpbGVkIiwgTlVMTCk7CisJCQkJZmRfY254X2Rlc3Ryb3koY254KTsKKwkJCQllbXB0eV9jb25uZWN0aW9uX2xpc3QocGVlcik7CisJCQkJZmRfZXBfZmlsdGVyKCZwZWVyLT5wX2hkci5pbmZvLnBpX2VuZHBvaW50cywgRVBfRkxfQ09ORik7CisJCQkJZ290byBvdXRfcG9wOworCQkJfSApOworCQlMT0dfQSgiJXM6IFRMUyBoYW5kc2hha2Ugc3VjY2Vzc2Z1bC4iLCBwZWVyLT5wX2hkci5pbmZvLnBpX2RpYW1pZCk7CisJfSBlbHNlIHsKKwkJLyogUHJlcGFyZSB0byByZWNlaXZlIHRoZSBuZXh0IG1lc3NhZ2UgKi8KKwkJQ0hFQ0tfRkNUX0RPKCBmYXRhbF9lcnJvciA9IGZkX2NueF9zdGFydF9jbGVhcihjbngsIDApLCBnb3RvIG91dF9wb3AgKTsKKwl9CisJCisJLyogVXBvbiBzdWNjZXNzLCBnZW5lcmF0ZSBGREVWUF9DTlhfRVNUQUJMSVNIRUQgKi8KKwlDSEVDS19GQ1RfRE8oIGZhdGFsX2Vycm9yID0gZmRfZXZlbnRfc2VuZChwZWVyLT5wX2V2ZW50cywgRkRFVlBfQ05YX0VTVEFCTElTSEVELCAwLCBjbngpLCAgKTsKK291dF9wb3A6CisJOwkKKwlwdGhyZWFkX2NsZWFudXBfcG9wKDApOworCQorb3V0OgorCQorCWlmIChmYXRhbF9lcnJvcikgeworCQorCQkvKiBDbGVhbnVwIHRoZSBjb25uZWN0aW9uICovCisJCWlmIChjbngpCisJCQlmZF9jbnhfZGVzdHJveShjbngpOworCisJCS8qIEdlbmVyYXRlIGEgdGVybWluYXRpb24gZXZlbnQgKi8KKwkJQ0hFQ0tfRkNUX0RPKGZkX2NvcmVfc2h1dGRvd24oKSwgKTsKKwl9CisJCisJcmV0dXJuIE5VTEw7Cit9CisKKworLyogSW5pdGlhdGUgYSBjb25uZWN0aW9uIGF0dGVtcHQgdG8gYSByZW1vdGUgcGVlciAqLworaW50IGZkX3BfY254X2luaXQoc3RydWN0IGZkX3BlZXIgKiBwZWVyKQoreworCVRSQUNFX0VOVFJZKCIlcCIsIHBlZXIpOworCQorCS8qIFN0YXJ0IHRoZSBjb25uZWN0IHRocmVhZCAqLworCUNIRUNLX0ZDVCggcHRocmVhZF9jcmVhdGUoJnBlZXItPnBfaW5pX3RociwgTlVMTCwgY29ubmVjdF90aHIsIHBlZXIpICk7CisJcmV0dXJuIDA7Cit9CisKKy8qIENhbmNlbCBhIGNvbm5lY3Rpb24gYXR0ZW1wdCAqLwordm9pZCBmZF9wX2NueF9hYm9ydChzdHJ1Y3QgZmRfcGVlciAqIHBlZXIsIGludCBjbGVhbnVwX2FsbCkKK3sKKwlUUkFDRV9FTlRSWSgiJXAgJWQiLCBwZWVyLCBjbGVhbnVwX2FsbCk7CisJQ0hFQ0tfUEFSQU1TX0RPKCBDSEVDS19QRUVSKHBlZXIpLCByZXR1cm4gKTsKKwkKKwlpZiAocGVlci0+cF9pbmlfdGhyICE9IChwdGhyZWFkX3QpTlVMTCkgeworCQlDSEVDS19GQ1RfRE8oIGZkX3Rocl90ZXJtKCZwZWVyLT5wX2luaV90aHIpLCAvKiBjb250aW51ZSAqLyk7CisJCWZhaWxlZF9jb25uZWN0aW9uX2F0dGVtcHQocGVlcik7CisJfQorCQorCWlmIChjbGVhbnVwX2FsbCkgeworCQllbXB0eV9jb25uZWN0aW9uX2xpc3QocGVlcik7CisJfQorfQorCmRpZmYgLS1naXQgYS9saWJmZGNvcmUvcF9kcC5jIGIvbGliZmRjb3JlL3BfZHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2QzOWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZmRjb3JlL3BfZHAuYwpAQCAtMCwwICsxLDIwNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTMsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiZmRjb3JlLWludGVybmFsLmgiCisKKy8qIFRoaXMgZmlsZSBjb250YWlucyBjb2RlIHRvIGhhbmRsZSBEaXNjb25uZWN0IFBlZXIgbWVzc2FnZXMgKERQUiBhbmQgRFBBKSAqLworCisvKiBEZWxheSB0byB1c2UgYmVmb3JlIG5leHQgcmVjb25uZWN0IGF0dGVtcHQgKi8KK2ludCBmZF9wX2RwX25ld2RlbGF5KHN0cnVjdCBmZF9wZWVyICogcGVlcikgCit7CisJaW50IGRlbGF5ID0gcGVlci0+cF9oZHIuaW5mby5jb25maWcucGljX3RjdGltZXIgPzogZmRfZ19jb25maWctPmNuZl90aW1lcl90YzsKKwkKKwlzd2l0Y2ggKHBlZXItPnBfaGRyLmluZm8ucnVudGltZS5waXJfbGFzdERDKSB7CisJCWNhc2UgQUNWX0RDX1JFQk9PVElORzoKKwkJZGVmYXVsdDoKKwkJCS8qIFdlIHVzZSBUY1RpbWVyIHRvIGF0dGVtcHQgcmVjb25uZWN0aW9uICovCisJCQlicmVhazsKKwkJY2FzZSBBQ1ZfRENfQlVTWToKKwkJCS8qIE5vIG5lZWQgdG8gaGFtbWVyIHRoZSBvdmVybG9hZGVkIHBlZXIgKi8KKwkJCWRlbGF5ICo9IDEwOworCQkJYnJlYWs7CisJCWNhc2UgQUNWX0RDX05PVF9GUklFTkQ6CisJCQkvKiBIZSBkb2VzIG5vdCB3YW50IHRvIHNwZWFrIHRvIHVzLi4uIGxldCdzIHJldHJ5IGEgKmxvdCogbGF0ZXIgbWF5YmUgKi8KKwkJCWRlbGF5ICo9IDIwMDsKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gZGVsYXk7Cit9CisKKy8qIEhhbmRsZSBhIHJlY2VpdmVkIG1lc3NhZ2UgKi8KK2ludCBmZF9wX2RwX2hhbmRsZShzdHJ1Y3QgbXNnICoqIG1zZywgaW50IHJlcSwgc3RydWN0IGZkX3BlZXIgKiBwZWVyKQoreworCWxvbmcgdG9fcmVjZWl2ZSwgdG9fc2VuZDsKKwlUUkFDRV9FTlRSWSgiJXAgJWQgJXAiLCBtc2csIHJlcSwgcGVlcik7CisJCisJaWYgKHJlcSkgeworCQkvKiBXZSByZWNlaXZlZCBhIERQUiwgc2F2ZSB0aGUgRGlzY29ubmVjdC1DYXVzZSBhbmQgZ28gdG8gQ0xPU0lOR19HUkFDRSBvciB0ZXJtaW5hdGUgdGhlIGNvbm5lY3Rpb24gKi8KKwkJc3RydWN0IGF2cCAqIGRjOworCQkKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfc2VhcmNoX2F2cCAoICptc2csIGZkX2RpY3RfYXZwX0RDLCAmZGMgKSk7CisJCWlmIChkYykgeworCQkJc3RydWN0IGF2cF9oZHIgKiBoZHI7CisJCQlDSEVDS19GQ1QoICBmZF9tc2dfYXZwX2hkciggZGMsICZoZHIgKSAgKTsKKwkJCWlmIChoZHItPmF2cF92YWx1ZSA9PSBOVUxMKSB7CisJCQkJLyogVGhpcyBpcyBhIHNhbml0eSBjaGVjayAqLworCQkJCUxPR19GKCJCVUc6IFVuc2V0IHZhbHVlIGluIERpc2Nvbm5lY3QtQ2F1c2UgaW4gRFBSIik7CisJCQkJQVNTRVJUKDApOyAvKiBUbyBjaGVjayBpZiB0aGlzIHJlYWxseSBoYXBwZW5zLCBhbmQgdW5kZXJzdGFuZCB3aHkuLi4gKi8KKwkJCX0KKworCQkJLyogc2F2ZSB0aGUgY2F1c2UgKi8KKwkJCXBlZXItPnBfaGRyLmluZm8ucnVudGltZS5waXJfbGFzdERDID0gaGRyLT5hdnBfdmFsdWUtPnUzMjsKKwkJfQorCQlpZiAoVFJBQ0VfQk9PTChJTkZPKSkgeworCQkJaWYgKGRjKSB7CisJCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogZGljdG9iajsKKwkJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX3JlcXVlc3QgZXI7CisJCQkJbWVtc2V0KCZlciwgMCwgc2l6ZW9mKGVyKSk7CisJCQkJCisJCQkJLyogcHJlcGFyZSB0aGUgcmVxdWVzdCAqLworCQkJCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9UWVBFLCBUWVBFX09GX0FWUCwgZmRfZGljdF9hdnBfREMsICZlci50eXBlX29iaiwgRU5PRU5UICkgICk7CisJCQkJZXIuc2VhcmNoLmVudW1fdmFsdWUudTMyID0gcGVlci0+cF9oZHIuaW5mby5ydW50aW1lLnBpcl9sYXN0REM7CisJCQkJCisJCQkJLyogU2VhcmNoIHRoZSBlbnVtIHZhbHVlICovCisJCQkJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0VOVU1WQUwsIEVOVU1WQUxfQllfU1RSVUNULCAmZXIsICZkaWN0b2JqLCAwICkgICk7CisJCQkJaWYgKGRpY3RvYmopIHsKKwkJCQkJQ0hFQ0tfRkNUKCBmZF9kaWN0X2dldHZhbCggZGljdG9iaiwgJmVyLnNlYXJjaCApICk7CisJCQkJCVRSQUNFX0RFQlVHKElORk8sICJQZWVyICclcycgc2VudCBhIERQUiB3aXRoIGNhdXNlOiAlcyIsIHBlZXItPnBfaGRyLmluZm8ucGlfZGlhbWlkLCBlci5zZWFyY2guZW51bV9uYW1lKTsKKwkJCQl9IGVsc2UgeworCQkJCQlUUkFDRV9ERUJVRyhJTkZPLCAiUGVlciAnJXMnIHNlbnQgYSBEUFIgd2l0aCB1bmtub3duIGNhdXNlOiAldSIsIHBlZXItPnBfaGRyLmluZm8ucGlfZGlhbWlkLCBwZWVyLT5wX2hkci5pbmZvLnJ1bnRpbWUucGlyX2xhc3REQyk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlUUkFDRV9ERUJVRyhJTkZPLCAiUGVlciAnJXMnIHNlbnQgYSBEUFIgd2l0aG91dCBEaXNjb25uZWN0LUNhdXNlIEFWUCIsIHBlZXItPnBfaGRyLmluZm8ucGlfZGlhbWlkKTsKKwkJCX0KKwkJfQorCQkKKwkJLyogTm93IHJlcGx5IHdpdGggYSBEUEEgKi8KKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfbmV3X2Fuc3dlcl9mcm9tX3JlcSAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgbXNnLCAwICkgKTsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfcmVzY29kZV9zZXQoICptc2csICJESUFNRVRFUl9TVUNDRVNTIiwgTlVMTCwgTlVMTCwgMSApICk7CisJCQorCQkvKiBEbyB3ZSBoYXZlIHBlbmRpbmcgZXhjaGFuZ2VzIHdpdGggdGhpcyBwZWVyPyAqLworCQlDSEVDS19GQ1QoIGZkX3BlZXJfZ2V0X2xvYWRfcGVuZGluZygmcGVlci0+cF9oZHIsICZ0b19yZWNlaXZlLCAmdG9fc2VuZCkgKTsKKwkJCisJCWlmICgodG9fcmVjZWl2ZSA9PSAwKSAmJiAodG9fc2VuZCA9PSAwKSkgeworCQkJLyogTm8gcGVuZGluZyBleGNoYW5nZSwgbW92ZSB0byBDTE9TSU5HIGRpcmVjdGx5ICovCisJCQlDSEVDS19GQ1QoIGZkX3BzbV9jaGFuZ2Vfc3RhdGUocGVlciwgU1RBVEVfQ0xPU0lORykgKTsKKwkJCisJCQkvKiBOb3cgc2VuZCB0aGUgRFBBICovCisJCQlDSEVDS19GQ1QoIGZkX291dF9zZW5kKCBtc2csIE5VTEwsIHBlZXIsIDApICk7CisJCQkKKwkJCS8qIGFuZCBtb3ZlIHRvIENMT1NFRCAqLworCQkJZmRfcHNtX2NsZWFudXAocGVlciwgMCk7CisKKwkJCS8qIFJlc2V0IHRoZSB0aW1lciBmb3IgbmV4dCBjb25uZWN0aW9uIGF0dGVtcHQgLS0gd2UnbGwgcmV0cnkgc29vbmVyIG9yIGxhdGVyIGRlcGVuZGluZyBvbiB0aGUgZGlzY29ubmVjdGlvbiBjYXVzZSAqLworCQkJZmRfcHNtX25leHRfdGltZW91dChwZWVyLCAxLCBmZF9wX2RwX25ld2RlbGF5KHBlZXIpKTsKKwkJfSBlbHNlIHsKKwkJCS8qIFdlIGhhdmUgcGVuZGluZyBleGNoYW5nZXMsIHdlIG1vdmUgdG8gQ0xPU0lOR19HUkFDRSB3aGljaCBhbGxvd3MgZXhjaGFuZ2VzIG9mIGFuc3dlcnMgYnV0CisJCQlub3QgbmV3IHJlcXVlc3RzICovCisJCQlDSEVDS19GQ1QoIGZkX3BzbV9jaGFuZ2Vfc3RhdGUocGVlciwgU1RBVEVfQ0xPU0lOR19HUkFDRSkgKTsKKwkJCWZkX3BzbV9uZXh0X3RpbWVvdXQocGVlciwgMCwgR1JBQ0VfVElNRU9VVCk7CisJCQkKKwkJCS8qIE5vdyBzZW5kIHRoZSBEUEEgKi8KKwkJCUNIRUNLX0ZDVCggZmRfb3V0X3NlbmQoIG1zZywgTlVMTCwgcGVlciwgMCkgKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIFdlIHJlY2VpdmVkIGEgRFBBICovCisJCWludCBjdXJzdGF0ZSA9IGZkX3BlZXJfZ2V0c3RhdGUocGVlcik7CisJCWlmIChjdXJzdGF0ZSAhPSBTVEFURV9DTE9TSU5HX0dSQUNFKSB7CisJCQlUUkFDRV9ERUJVRyhJTkZPLCAiSWdub3JpbmcgRFBBIHJlY2VpdmVkIGluIHN0YXRlICVzIiwgU1RBVEVfU1RSKGN1cnN0YXRlKSk7CisJCX0KKwkJCQorCQkvKiBJbiB0aGVvcnksIHdlIHNob3VsZCBjb250cm9sIHRoZSBSZXN1bHQtQ29kZSBBVlAuIEJ1dCBzaW5jZSB3ZSB3aWxsIG5vdCBnbyBiYWNrIHRvIE9QRU4gc3RhdGUgaGVyZSBhbnl3YXksIGxldCdzIHNraXAgaXQgKi8KKwkJCisJCS8qIFRPRE8oIkNvbnRyb2wgUmVzdWx0LUNvZGUgaW4gdGhlIERQQSIpICovCisJCUNIRUNLX0ZDVF9ETyggZmRfbXNnX2ZyZWUoICptc2cgKSwgLyogY29udGludWUgKi8gKTsKKwkJKm1zZyA9IE5VTEw7CisJCQorCQkvKiBEbyB3ZSBzdGlsbCBoYXZlIHBlbmRpbmcgZXhjaGFuZ2VzIHdpdGggdGhpcyBwZWVyPyAqLworCQlDSEVDS19GQ1QoIGZkX3BlZXJfZ2V0X2xvYWRfcGVuZGluZygmcGVlci0+cF9oZHIsICZ0b19yZWNlaXZlLCAmdG9fc2VuZCkgKTsKKwkJaWYgKCh0b19yZWNlaXZlICE9IDApIHx8ICh0b19zZW5kICE9IDApKSB7CisJCQlUUkFDRV9ERUJVRyhJTkZPLCAiUmVjZWl2ZWQgRFBBIGJ1dCBwZW5kaW5nIGxvYWQ6IFslbGQsICVsZF0sIGdpdmluZyBncmFjZSBkZWxheSBiZWZvcmUgY2xvc2luZyIsIHRvX3JlY2VpdmUsIHRvX3NlbmQpOworCQkJZmRfcHNtX25leHRfdGltZW91dChwZWVyLCAwLCBHUkFDRV9USU1FT1VUKTsKKwkJCXBlZXItPnBfZmxhZ3MucGZfbG9jYWx0ZXJtID0gMTsKKwkJfSBlbHNlIHsKKwkJCS8qIG90aGVyd2lzZSwgZ28gdG8gQ0xPU0lORyBzdGF0ZSwgdGhlIHBzbSB3aWxsIGhhbmRsZSB0ZXJtaW5hdGluZyB0aGUgY29ubmVjdGlvbiAqLworCQkJQ0hFQ0tfRkNUKCBmZF9wc21fY2hhbmdlX3N0YXRlKHBlZXIsIFNUQVRFX0NMT1NJTkcpICk7CisJCX0KKwl9CisJCisJcmV0dXJuIDA7Cit9CisKKy8qIFN0YXJ0IGRpc2Nvbm5lY3Rpb24gb2YgYSBwZWVyOiBzZW5kIERQUiAqLworaW50IGZkX3BfZHBfaW5pdGlhdGUoc3RydWN0IGZkX3BlZXIgKiBwZWVyLCBjaGFyICogcmVhc29uKQoreworCXN0cnVjdCBtc2cgKiBtc2cgPSBOVUxMOworCXN0cnVjdCBkaWN0X29iamVjdCAqIGRpY3RvYmogPSBOVUxMOworCXN0cnVjdCBhdnAgKiBhdnAgPSBOVUxMOworCXN0cnVjdCBkaWN0X2VudW12YWxfcmVxdWVzdCBlcjsKKwl1bmlvbiBhdnBfdmFsdWUgdmFsOworCQorCVRSQUNFX0VOVFJZKCIlcCAlcCIsIHBlZXIsIHJlYXNvbik7CisJCisJLyogQ3JlYXRlIGEgbmV3IERXUiBpbnN0YW5jZSAqLworCUNIRUNLX0ZDVCggZmRfbXNnX25ldyAoIGZkX2RpY3RfY21kX0RQUiwgTVNHRkxfQUxMT0NfRVRFSUQsICZtc2cgKSApOworCQorCS8qIEFkZCB0aGUgT3JpZ2luIGluZm9ybWF0aW9uICovCisJQ0hFQ0tfRkNUKCBmZF9tc2dfYWRkX29yaWdpbiAoIG1zZywgMCApICk7CisJCisJLyogQWRkIHRoZSBEaXNjb25uZWN0LUNhdXNlICovCisJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIGZkX2RpY3RfYXZwX0RDLCAwLCAmYXZwICkgKTsKKwkKKwkvKiBTZWFyY2ggdGhlIHZhbHVlIGluIHRoZSBkaWN0aW9uYXJ5ICovCisJbWVtc2V0KCZlciwgMCwgc2l6ZW9mKGVyKSk7CisJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1RZUEUsIFRZUEVfT0ZfQVZQLCBmZF9kaWN0X2F2cF9EQywgJmVyLnR5cGVfb2JqLCBFTk9FTlQgKSAgKTsKKwllci5zZWFyY2guZW51bV9uYW1lID0gcmVhc29uID86ICJSRUJPT1RJTkciOworCUNIRUNLX0ZDVF9ETyggZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9FTlVNVkFMLCBFTlVNVkFMX0JZX1NUUlVDVCwgJmVyLCAmZGljdG9iaiwgRU5PRU5UICksIHsgQVNTRVJUKDApOyAvKiBpbnRlcm5hbCBlcnJvcjogdW5rbm93biByZWFzb24gKi8gfSAgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3RfZ2V0dmFsKCBkaWN0b2JqLCAmZXIuc2VhcmNoICkgKTsKKwkKKwkvKiBTZXQgdGhlIHZhbHVlIGluIHRoZSBBVlAgKi8KKwl2YWwudTMyID0gZXIuc2VhcmNoLmVudW1fdmFsdWUudTMyOworCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9zZXR2YWx1ZSggYXZwLCAmdmFsICkgKTsKKwlDSEVDS19GQ1QoIGZkX21zZ19hdnBfYWRkKCBtc2csIE1TR19CUldfTEFTVF9DSElMRCwgYXZwICkgKTsKKwkKKwkvKiBTYXZlIHRoZSB2YWx1ZSBhbHNvIGluIHRoZSBwZWVyICovCisJcGVlci0+cF9oZHIuaW5mby5ydW50aW1lLnBpcl9sYXN0REMgPSB2YWwudTMyOworCQorCS8qIFVwZGF0ZSB0aGUgcGVlciBzdGF0ZSBhbmQgdGltZXIgKi8KKwlDSEVDS19GQ1QoIGZkX3BzbV9jaGFuZ2Vfc3RhdGUocGVlciwgU1RBVEVfQ0xPU0lOR19HUkFDRSkgKTsKKwlmZF9wc21fbmV4dF90aW1lb3V0KHBlZXIsIDAsIERQUl9USU1FT1VUKTsKKwkKKwkvKiBOb3cgc2VuZCB0aGUgRFBSIG1lc3NhZ2UgKi8KKwlDSEVDS19GQ1RfRE8oIGZkX291dF9zZW5kKCZtc2csIE5VTEwsIHBlZXIsIDApLCAvKiBpZ25vcmUgc2luY2Ugd2UgYXJlIG9uIHRpbWVvdXQgYW55d2F5ICovICk7CisJCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJmZGNvcmUvcF9kdy5jIGIvbGliZmRjb3JlL3BfZHcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzg3ZjhkCi0tLSAvZGV2L251bGwKKysrIGIvbGliZmRjb3JlL3BfZHcuYwpAQCAtMCwwICsxLDE3NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTMsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiZmRjb3JlLWludGVybmFsLmgiCisKKy8qIFRoaXMgZmlsZSBjb250YWlucyBjb2RlIHRvIGhhbmRsZSBEZXZpY2UgV2F0Y2hkb2cgbWVzc2FnZXMgKERXUiBhbmQgRFdBKSAqLworCisvKiBDaGVjayB0aGUgdmFsdWUgb2YgT3JpZ2luLVN0YXRlLUlkIGlzIGNvbnNpc3RlbnQgaW4gYSBEV1Igb3IgRFdBIC0tIHdlIHJldHVybiBhbiBlcnJvciBvdGhlcndpc2UgKi8KK3N0YXRpYyBpbnQgY2hlY2tfc3RhdGVfaWQoc3RydWN0IG1zZyAqIG1zZywgc3RydWN0IGZkX3BlZXIgKiBwZWVyKQoreworCXN0cnVjdCBhdnAgKiBvc2k7CisJCisJLyogQ2hlY2sgaWYgdGhlIHJlcXVlc3QgY29udGFpbnMgdGhlIE9yaWdpbi1TdGF0ZS1JZCAqLworCUNIRUNLX0ZDVCggZmRfbXNnX3NlYXJjaF9hdnAgKCBtc2csIGZkX2RpY3RfYXZwX09TSSwgJm9zaSApICk7CisJaWYgKG9zaSkgeworCQkvKiBDaGVjayB0aGUgdmFsdWUgaXMgY29uc2lzdGVudCB3aXRoIHRoZSBzYXZlZCBvbmUgKi8KKwkJc3RydWN0IGF2cF9oZHIgKiBoZHI7CisJCUNIRUNLX0ZDVCggIGZkX21zZ19hdnBfaGRyKCBvc2ksICZoZHIgKSAgKTsKKwkJaWYgKGhkci0+YXZwX3ZhbHVlID09IE5VTEwpIHsKKwkJCS8qIFRoaXMgaXMgYSBzYW5pdHkgY2hlY2sgKi8KKwkJCUxPR19GKCJJZ25vcmVkIGFuIE9yaWdpbi1TdGF0ZS1JZCBBVlAgd2l0aCB1bnNldCB2YWx1ZSBpbiBEV1IvRFdBIik7CisJCQlBU1NFUlQoMCk7IC8qIFRvIGNoZWNrIGlmIHRoaXMgcmVhbGx5IGhhcHBlbnMsIGFuZCB1bmRlcnN0YW5kIHdoeS4uLiAqLworCQl9CisKKwkJaWYgKCEgcGVlci0+cF9oZHIuaW5mby5ydW50aW1lLnBpcl9vcnN0YXRlKSB7CisJCQkvKiBJdCB3YXMgbm90IGFscmVhZHkgcmVjZWl2ZWQgaW4gQ0VSL0NFQSwgc2F2ZSBpdCBub3cgKi8KKwkJCXBlZXItPnBfaGRyLmluZm8ucnVudGltZS5waXJfb3JzdGF0ZSA9IGhkci0+YXZwX3ZhbHVlLT51MzI7CisJCX0KKworCQlpZiAocGVlci0+cF9oZHIuaW5mby5ydW50aW1lLnBpcl9vcnN0YXRlICE9IGhkci0+YXZwX3ZhbHVlLT51MzIpIHsKKwkJCVRSQUNFX0RFQlVHKElORk8sICJSZWNlaXZlZCBhIG5ldyBPcmlnaW4tU3RhdGUtSWQgZnJvbSBwZWVyICclcychICgleCAtPiAleCk7IHJlc2V0dGluZyB0aGUgY29ubmVjdGlvbi4iLCAKKwkJCQlwZWVyLT5wX2hkci5pbmZvLnBpX2RpYW1pZCwgCisJCQkJcGVlci0+cF9oZHIuaW5mby5ydW50aW1lLnBpcl9vcnN0YXRlLAorCQkJCWhkci0+YXZwX3ZhbHVlLT51MzIgKTsKKwkJCXJldHVybiBFSU5WQUw7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIENyZWF0ZSBhbmQgc2VuZCBhIERXUiAqLworc3RhdGljIGludCBzZW5kX0RXUihzdHJ1Y3QgZmRfcGVlciAqIHBlZXIpCit7CisJc3RydWN0IG1zZyAqIG1zZyA9IE5VTEw7CisJCisJLyogQ3JlYXRlIGEgbmV3IERXUiBpbnN0YW5jZSAqLworCUNIRUNLX0ZDVCggZmRfbXNnX25ldyAoIGZkX2RpY3RfY21kX0RXUiwgTVNHRkxfQUxMT0NfRVRFSUQsICZtc2cgKSApOworCQorCS8qIEFkZCB0aGUgY29udGVudCBvZiB0aGUgbWVzc2FnZSAob25seSB0aGUgb3JpZ2luKSAqLworCUNIRUNLX0ZDVCggZmRfbXNnX2FkZF9vcmlnaW4gKCBtc2csIDEgKSApOworCQorCS8qIE5vdyBzZW5kIHRoaXMgbWVzc2FnZSAqLworCUNIRUNLX0ZDVCggZmRfb3V0X3NlbmQoJm1zZywgTlVMTCwgcGVlciwgMCkgKTsKKwkKKwkvKiBBbmQgbWFyayB0aGUgcGVuZGluZyBEVyAqLworCXBlZXItPnBfZmxhZ3MucGZfZHdfcGVuZGluZyA9IDE7CisJCisJcmV0dXJuIDA7Cit9CisKKy8qIEhhbmRsZSBhbiBpbmNvbWluZyBtZXNzYWdlICovCitpbnQgZmRfcF9kd19oYW5kbGUoc3RydWN0IG1zZyAqKiBtc2csIGludCByZXEsIHN0cnVjdCBmZF9wZWVyICogcGVlcikKK3sKKwlpbnQgcmVzZXRfdG1yID0gMDsKKwkKKwlUUkFDRV9FTlRSWSgiJXAgJWQgJXAiLCBtc2csIHJlcSwgcGVlcik7CisJCisJLyogQ2hlY2sgdGhlIHZhbHVlIG9mIE9TSSBmb3IgaW5mb3JtYXRpb24gKi8KKwlDSEVDS19GQ1QoIGNoZWNrX3N0YXRlX2lkKCptc2csIHBlZXIpICk7CisJCisJaWYgKHJlcSkgeworCQkvKiBJZiB3ZSByZWNlaXZlIGEgRFdSLCBzZW5kIGJhY2sgYSBEV0EgKi8KKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfbmV3X2Fuc3dlcl9mcm9tX3JlcSAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgbXNnLCAwICkgKTsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfcmVzY29kZV9zZXQoICptc2csICJESUFNRVRFUl9TVUNDRVNTIiwgTlVMTCwgTlVMTCwgMCApICk7CisJCUNIRUNLX0ZDVCggZmRfbXNnX2FkZF9vcmlnaW4gKCAqbXNnLCAxICkgKTsKKwkJQ0hFQ0tfRkNUKCBmZF9vdXRfc2VuZCggbXNnLCBwZWVyLT5wX2NueGN0eCwgcGVlciwgMCkgKTsKKwkJCisJfSBlbHNlIHsKKwkJLyogRGlzY2FyZCB0aGUgRFdBICovCisJCUNIRUNLX0ZDVF9ETyggZmRfbXNnX2ZyZWUoKm1zZyksIC8qIGNvbnRpbnVlICovICk7CisJCSptc2cgPSBOVUxMOworCQkKKwkJLyogQW5kIGNsZWFyIHRoZSBwZW5kaW5nIERXIGZsYWcgKi8KKwkJcGVlci0+cF9mbGFncy5wZl9kd19wZW5kaW5nID0gMDsKKwl9CisJCisJLyogTm93IHVwZGF0ZSB0aW1lb3V0ICovCisJaWYgKHJlcSkgeworCQkvKiBVcGRhdGUgdGltZW91dCBvbmx5IGlmIHdlIGRpZCBub3QgYWxyZWFkeSBzZW5kIGEgRFdSIG91cnNlbHZlcyAqLworCQlyZXNldF90bXIgPSAhcGVlci0+cF9mbGFncy5wZl9kd19wZW5kaW5nOworCX0gZWxzZSB7CisJCS8qIFJlc2V0IHRoZSB0aW1lciAqLworCQlyZXNldF90bXIgPSAxOworCX0KKwlpZiAocmVzZXRfdG1yKSB7CisJCWZkX3BzbV9uZXh0X3RpbWVvdXQocGVlciwgMSwgcGVlci0+cF9oZHIuaW5mby5jb25maWcucGljX3R3dGltZXIgPzogZmRfZ19jb25maWctPmNuZl90aW1lcl90dyk7CisJfQorCQorCS8qIElmIHdlIGFyZSBpbiBSRU9QRU4gc3RhdGUsIGluY3JlbWVudCB0aGUgY291bnRlciAqLworCWlmIChmZF9wZWVyX2dldHN0YXRlKHBlZXIpID09IFNUQVRFX1JFT1BFTikgeworCQlwZWVyLT5wX2ZsYWdzLnBmX3Jlb3Blbl9jbnQgKz0gMTsKKwkJCisJCWlmIChwZWVyLT5wX2ZsYWdzLnBmX3Jlb3Blbl9jbnQpIHsKKwkJCS8qIFNlbmQgYSBuZXcgRFdSICovCisJCQlDSEVDS19GQ1QoIHNlbmRfRFdSKHBlZXIpICk7CisJCX0gZWxzZSB7CisJCQkvKiBNb3ZlIHRvIE9QRU4gc3RhdGUgKi8KKwkJCUNIRUNLX0ZDVCggZmRfcHNtX2NoYW5nZV9zdGF0ZShwZWVyLCBTVEFURV9PUEVOKSApOworCQl9CisJfQorCQkKKwlyZXR1cm4gMDsKK30KKworLyogSGFuZGxlIGEgdGltZW91dCBpbiB0aGUgUFNNIChPUEVOIG9yIFJFT1BFTiBzdGF0ZSBvbmx5KSAqLworaW50IGZkX3BfZHdfdGltZW91dChzdHJ1Y3QgZmRfcGVlciAqIHBlZXIpCit7CisJVFJBQ0VfRU5UUlkoIiVwIiwgcGVlcik7CisKKwlpZiAocGVlci0+cF9mbGFncy5wZl9kd19wZW5kaW5nKSB7CisJCS8qIFdlIGhhdmUgc2VudCBhIERXUiBhbmQgcmVjZWl2ZWQgbm8gYW5zd2VyIGR1cmluZyBUd1RpbWVyICovCisJCUNIRUNLX0ZDVCggZmRfcHNtX2NoYW5nZV9zdGF0ZShwZWVyLCBTVEFURV9TVVNQRUNUKSApOworCQlmZF9wc21fbmV4dF90aW1lb3V0KHBlZXIsIDAsIDIgKiAocGVlci0+cF9oZHIuaW5mby5jb25maWcucGljX3R3dGltZXIgPzogZmRfZ19jb25maWctPmNuZl90aW1lcl90dykgKTsKKwl9IGVsc2UgeworCQkvKiBUaGUgdGltZW91dCBoYXMgZXhwaXJlZCwgc2VuZCBhIERXUiAqLworCQlDSEVDS19GQ1QoIHNlbmRfRFdSKHBlZXIpICk7CisJCWZkX3BzbV9uZXh0X3RpbWVvdXQocGVlciwgMCwgcGVlci0+cF9oZHIuaW5mby5jb25maWcucGljX3R3dGltZXIgPzogZmRfZ19jb25maWctPmNuZl90aW1lcl90dyApOworCX0KKwkKKwlyZXR1cm4gMDsKK30KKworLyogSGFuZGxlIERXIGV4Y2hhbmdlcyBhZnRlciB0aGUgcGVlciBoYXMgY29tZSBhbGl2ZSBhZ2FpbiAqLworaW50IGZkX3BfZHdfcmVvcGVuKHN0cnVjdCBmZF9wZWVyICogcGVlcikKK3sKKwlUUkFDRV9FTlRSWSgiJXAiLCBwZWVyKTsKKworCXBlZXItPnBfZmxhZ3MucGZfcmVvcGVuX2NudCA9IDE7CisJcGVlci0+cF9mbGFncy5wZl9jbnhfcGIgPSAwOworCUNIRUNLX0ZDVCggc2VuZF9EV1IocGVlcikgKTsKKwkKKwlyZXR1cm4gMDsKK30KKworCmRpZmYgLS1naXQgYS9saWJmZGNvcmUvcF9leHBpcnkuYyBiL2xpYmZkY29yZS9wX2V4cGlyeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1MWY5ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJmZGNvcmUvcF9leHBpcnkuYwpAQCAtMCwwICsxLDIwNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTMsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiZmRjb3JlLWludGVybmFsLmgiCisKKy8qIERlbGF5IGZvciBnYXJiYWdlIGNvbGxlY3Rpb24gb2YgZXhwaXJlZCBwZWVycywgaW4gc2Vjb25kcyAqLworI2RlZmluZSBHQ19USU1FCQkxMjAKKworc3RhdGljIHB0aHJlYWRfdCAgICAgICBleHBfdGhyID0gKHB0aHJlYWRfdClOVUxMOworc3RhdGljIHB0aHJlYWRfdCAgICAgICBnY190aHIgID0gKHB0aHJlYWRfdClOVUxMOworc3RhdGljIHN0cnVjdCBmZF9saXN0ICBleHBfbGlzdCA9IEZEX0xJU1RfSU5JVElBTElaRVIoIGV4cF9saXN0ICk7CitzdGF0aWMgcHRocmVhZF9jb25kX3QgIGV4cF9jbmQgID0gUFRIUkVBRF9DT05EX0lOSVRJQUxJWkVSOworc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBleHBfbXR4ICA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CisKK3N0YXRpYyB2b2lkICogZ2NfdGhfZmN0KHZvaWQgKiBhcmcpCit7CisJZmRfbG9nX3RocmVhZG5hbWUgKCAiUGVlcnMvZ2FyYi4gY29sLiIgKTsKKwlUUkFDRV9FTlRSWSggIiVwIiwgYXJnICk7CisJCisJZG8geworCQlzdHJ1Y3QgZmRfbGlzdCAqIGxpLCBwdXJnZSA9IEZEX0xJU1RfSU5JVElBTElaRVIocHVyZ2UpOworCQkKKwkJc2xlZXAoR0NfVElNRSk7CS8qIHNsZWVwIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50ICovCisJCQorCQkvKiBOb3cgY2hlY2sgaW4gdGhlIHBlZXJzIGxpc3QgaWYgYW55IHBlZXIgY2FuIGJlIGRlbGV0ZWQgKi8KKwkJQ0hFQ0tfRkNUX0RPKCBwdGhyZWFkX3J3bG9ja193cmxvY2soJmZkX2dfcGVlcnNfcncpLCBnb3RvIGVycm9yICk7CisJCQorCQlmb3IgKGxpID0gZmRfZ19wZWVycy5uZXh0OyBsaSAhPSAmZmRfZ19wZWVyczsgbGkgPSBsaS0+bmV4dCkgeworCQkJc3RydWN0IGZkX3BlZXIgKiBwZWVyID0gKHN0cnVjdCBmZF9wZWVyICopbGktPm87CisJCQkKKwkJCWlmIChmZF9wZWVyX2dldHN0YXRlKHBlZXIpICE9IFNUQVRFX1pPTUJJRSkKKwkJCQljb250aW51ZTsKKwkJCQorCQkJaWYgKHBlZXItPnBfaGRyLmluZm8uY29uZmlnLnBpY19mbGFncy5wZXJzaXN0ID09IFBJX1BSU1RfQUxXQVlTKQorCQkJCWNvbnRpbnVlOyAvKiBUaGlzIHBlZXIgd2FzIG5vdCBzdXBwb3NlZCB0byB0ZXJtaW5hdGUsIGtlZXAgaXQgaW4gdGhlIGxpc3QgZm9yIGRlYnVnICovCisJCQkKKwkJCS8qIE9rLCB0aGUgcGVlciB3YXMgZXhwaXJlZCwgbGV0J3MgcmVtb3ZlIGl0ICovCisJCQlsaSA9IGxpLT5wcmV2OyAvKiB0byBhdm9pZCBicmVha2luZyB0aGUgbG9vcCAqLworCQkJZmRfbGlzdF91bmxpbmsoJnBlZXItPnBfaGRyLmNoYWluKTsKKwkJCWZkX2xpc3RfaW5zZXJ0X2JlZm9yZSgmcHVyZ2UsICZwZWVyLT5wX2hkci5jaGFpbik7CisJCX0KKworCQlDSEVDS19GQ1RfRE8oIHB0aHJlYWRfcndsb2NrX3VubG9jaygmZmRfZ19wZWVyc19ydyksIGdvdG8gZXJyb3IgKTsKKwkJCisJCS8qIE5vdyBkZWxldGUgcGVlcnMgdGhhdCBhcmUgaW4gdGhlIHB1cmdlIGxpc3QgKi8KKwkJd2hpbGUgKCFGRF9JU19MSVNUX0VNUFRZKCZwdXJnZSkpIHsKKwkJCXN0cnVjdCBmZF9wZWVyICogcGVlciA9IChzdHJ1Y3QgZmRfcGVlciAqKShwdXJnZS5uZXh0LT5vKTsKKwkJCWZkX2xpc3RfdW5saW5rKCZwZWVyLT5wX2hkci5jaGFpbik7CisJCQlUUkFDRV9ERUJVRyhJTkZPLCAiR2FyYmFnZSBDb2xsZWN0OiBkZWxldGUgem9tYmllIHBlZXIgJyVzJyIsIHBlZXItPnBfaGRyLmluZm8ucGlfZGlhbWlkKTsKKwkJCUNIRUNLX0ZDVF9ETyggZmRfcGVlcl9mcmVlKCZwZWVyKSwgLyogQ29udGludWUuLi4gd2hhdCBlbHNlIHRvIGRvID8gKi8gKTsKKwkJfQorCX0gd2hpbGUgKDEpOworCQorZXJyb3I6CisJVFJBQ0VfREVCVUcoSU5GTywgIkFuIGVycm9yIG9jY3VycmVkIGluIHBlZXJzIG1vZHVsZSEgR0MgdGhyZWFkIGlzIHRlcm1pbmF0aW5nLi4uIik7CisJQVNTRVJUKDApOworCUNIRUNLX0ZDVF9ETyhmZF9jb3JlX3NodXRkb3duKCksICk7CisJcmV0dXJuIE5VTEw7Cit9CisKKworc3RhdGljIHZvaWQgKiBleHBfdGhfZmN0KHZvaWQgKiBhcmcpCit7CisJZmRfbG9nX3RocmVhZG5hbWUgKCAiUGVlcnMvZXhwaXJlIiApOworCVRSQUNFX0VOVFJZKCAiJXAiLCBhcmcgKTsKKwkKKwlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9tdXRleF9sb2NrKCZleHBfbXR4KSwgeyBBU1NFUlQoMCk7IH0gKTsKKwlwdGhyZWFkX2NsZWFudXBfcHVzaCggZmRfY2xlYW51cF9tdXRleCwgJmV4cF9tdHggKTsKKwkKKwlkbyB7CisJCXN0cnVjdCB0aW1lc3BlYwlub3c7CisJCXN0cnVjdCBmZF9wZWVyICogZmlyc3Q7CisJCQorCQkvKiBDaGVjayBpZiB0aGVyZSBhcmUgZXhwaXJpbmcgcGVlcnMgYXZhaWxhYmxlICovCisJCWlmIChGRF9JU19MSVNUX0VNUFRZKCZleHBfbGlzdCkpIHsKKwkJCS8qIEp1c3Qgd2FpdCBmb3IgYSBjaGFuZ2Ugb3IgY2FuY2VsYXRpb24gKi8KKwkJCUNIRUNLX1BPU0lYX0RPKCBwdGhyZWFkX2NvbmRfd2FpdCggJmV4cF9jbmQsICZleHBfbXR4ICksIHsgQVNTRVJUKDApOyB9ICk7CisJCQkvKiBSZXN0YXJ0IHRoZSBsb29wIG9uIHdha2V1cCAqLworCQkJY29udGludWU7CisJCX0KKwkJCisJCS8qIEdldCB0aGUgcG9pbnRlciB0byB0aGUgcGVlciB0aGF0IGV4cGlyZXMgZmlyc3QgKi8KKwkJZmlyc3QgPSAoc3RydWN0IGZkX3BlZXIgKikoZXhwX2xpc3QubmV4dC0+byk7CisJCUFTU0VSVCggQ0hFQ0tfUEVFUihmaXJzdCkgKTsKKwkJCisJCS8qIEdldCB0aGUgY3VycmVudCB0aW1lICovCisJCUNIRUNLX1NZU19ETyggIGNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZub3cpLCAgeyBBU1NFUlQoMCk7IH0gICk7CisKKwkJLyogSWYgZmlyc3QgcGVlciBpcyBub3QgZXhwaXJlZCwgd2UganVzdCB3YWl0IHVudGlsIGl0IGhhcHBlbnMgKi8KKwkJaWYgKCBUU19JU19JTkZFUklPUiggJm5vdywgJmZpcnN0LT5wX2V4cF90aW1lciApICkgeworCQkJCisJCQlDSEVDS19QT1NJWF9ETzIoICBwdGhyZWFkX2NvbmRfdGltZWR3YWl0KCAmZXhwX2NuZCwgJmV4cF9tdHgsICZmaXJzdC0+cF9leHBfdGltZXIgKSwgIAorCQkJCQlFVElNRURPVVQsIC8qIEVUSU1FRE9VVCBpcyBhIG5vcm1hbCByZXR1cm4gdmFsdWUsIGNvbnRpbnVlICovLAorCQkJCQkvKiBvbiBvdGhlciBlcnJvciwgKi8geyBBU1NFUlQoMCk7IH0gKTsKKwkKKwkJCS8qIG9uIHdha2V1cCwgbG9vcCAqLworCQkJY29udGludWU7CisJCX0KKwkJCisJCS8qIE5vdywgdGhlIGZpcnN0IHBlZXIgaW4gdGhlIGxpc3QgaXMgZXhwaXJlZDsgc2lnbmFsIGl0ICovCisJCWZkX2xpc3RfdW5saW5rKCAmZmlyc3QtPnBfZXhwaXJ5ICk7CisJCUNIRUNLX0ZDVF9ETyggZmRfZXZlbnRfc2VuZChmaXJzdC0+cF9ldmVudHMsIEZERVZQX1RFUk1JTkFURSwgMCwgIkRPX05PVF9XQU5UX1RPX1RBTEtfVE9fWU9VIiksIGJyZWFrICk7CisJCQorCX0gd2hpbGUgKDEpOworCQorCXB0aHJlYWRfY2xlYW51cF9wb3AoIDEgKTsKKworCVRSQUNFX0RFQlVHKElORk8sICJBbiBlcnJvciBvY2N1cnJlZCBpbiBwZWVycyBtb2R1bGUhIEV4cGlyeSB0aHJlYWQgaXMgdGVybWluYXRpbmcuLi4iKTsKKwlDSEVDS19GQ1RfRE8oZmRfY29yZV9zaHV0ZG93bigpLCApOworCXJldHVybiBOVUxMOworfQorCisvKiBJbml0aWFsaXplIHBlZXJzIGV4cGlyeSBtZWNoYW5pc20gKi8KK2ludCBmZF9wX2V4cGlfaW5pdCh2b2lkKQoreworCVRSQUNFX0VOVFJZKCk7CisJQ0hFQ0tfRkNUKCBwdGhyZWFkX2NyZWF0ZSggJmV4cF90aHIsIE5VTEwsIGV4cF90aF9mY3QsIE5VTEwgKSApOworCUNIRUNLX0ZDVCggcHRocmVhZF9jcmVhdGUoICZnY190aHIsICBOVUxMLCBnY190aF9mY3QsICBOVUxMICkgKTsKKwlyZXR1cm4gMDsKK30KKworLyogRmluaXNoIHBlZXJzIGV4cGlyeSBtZWNoYW5pc20gKi8KK2ludCBmZF9wX2V4cGlfZmluaSh2b2lkKQoreworCUNIRUNLX0ZDVF9ETyggZmRfdGhyX3Rlcm0oJmV4cF90aHIpLCApOworCUNIRUNLX1BPU0lYKCBwdGhyZWFkX211dGV4X2xvY2soJmV4cF9tdHgpICk7CisJd2hpbGUgKCFGRF9JU19MSVNUX0VNUFRZKCZleHBfbGlzdCkpIHsKKwkJc3RydWN0IGZkX3BlZXIgKiBwZWVyID0gKHN0cnVjdCBmZF9wZWVyICopKGV4cF9saXN0Lm5leHQtPm8pOworCQlmZF9saXN0X3VubGluaygmcGVlci0+cF9leHBpcnkgKTsKKwl9CisJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZleHBfbXR4KSApOworCQorCUNIRUNLX0ZDVF9ETyggZmRfdGhyX3Rlcm0oJmdjX3RociksICk7CisJcmV0dXJuIDA7Cit9CisKKy8qIEFkZCAvIHJlcXVldWUgYSBwZWVyIGluIHRoZSBleHBpcnkgbGlzdCAqLworaW50IGZkX3BfZXhwaV91cGRhdGUoc3RydWN0IGZkX3BlZXIgKiBwZWVyICkKK3sKKwlUUkFDRV9FTlRSWSgiJXAiLCBwZWVyKTsKKwlDSEVDS19QQVJBTVMoIENIRUNLX1BFRVIocGVlcikgKTsKKwkKKwlDSEVDS19QT1NJWCggcHRocmVhZF9tdXRleF9sb2NrKCZleHBfbXR4KSApOworCQorCWZkX2xpc3RfdW5saW5rKCZwZWVyLT5wX2V4cGlyeSApOworCQorCS8qIGlmIHBlZXIgZXhwaXJlcyAqLworCWlmIChwZWVyLT5wX2hkci5pbmZvLmNvbmZpZy5waWNfZmxhZ3MuZXhwKSB7CisJCXN0cnVjdCBmZF9saXN0ICogbGk7CisJCQorCQkvKiB1cGRhdGUgdGhlIHBfZXhwX3RpbWVyIHZhbHVlICovCisJCUNIRUNLX1NZU19ETyggIGNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZwZWVyLT5wX2V4cF90aW1lciksIHsgQVNTRVJUKDApOyB9ICApOworCQlwZWVyLT5wX2V4cF90aW1lci50dl9zZWMgKz0gcGVlci0+cF9oZHIuaW5mby5jb25maWcucGljX2xmdDsKKwkJCisJCS8qIGFkZCB0byB0aGUgZXhwaXJ5IGxpc3QgaW4gYXBwcm9wcmlhdGUgcG9zaXRpb24gKHByb2JhYmx5IGFyb3VuZCB0aGUgZW5kKSAqLworCQlmb3IgKGxpID0gZXhwX2xpc3QucHJldjsgbGkgIT0gJmV4cF9saXN0OyBsaSA9IGxpLT5wcmV2KSB7CisJCQlzdHJ1Y3QgZmRfcGVlciAqIHAgPSAoc3RydWN0IGZkX3BlZXIgKikobGktPm8pOworCQkJaWYgKFRTX0lTX0lORkVSSU9SKCAmcC0+cF9leHBfdGltZXIsICZwZWVyLT5wX2V4cF90aW1lciApICkKKwkJCQlicmVhazsKKwkJfQorCQkKKwkJZmRfbGlzdF9pbnNlcnRfYWZ0ZXIobGksICZwZWVyLT5wX2V4cGlyeSk7CisJCQorCQkvKiBzaWduYWwgdGhlIGV4cGlyeSB0aHJlYWQgaWYgd2UgYWRkZWQgaW4gZmlyc3QgcG9zaXRpb24gKi8KKwkJaWYgKGxpID09ICZleHBfbGlzdCkgeworCQkJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfY29uZF9zaWduYWwoJmV4cF9jbmQpICk7CisJCX0KKwl9CisJCisJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZleHBfbXR4KSApOworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9saWJmZGNvcmUvcF9vdXQuYyBiL2xpYmZkY29yZS9wX291dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MTBmMTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJmZGNvcmUvcF9vdXQuYwpAQCAtMCwwICsxLDIzNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTUsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiZmRjb3JlLWludGVybmFsLmgiCisKKy8qIEFsbG9jIGEgbmV3IGhiaCBmb3IgcmVxdWVzdHMsIGJ1ZmZlcml6ZSB0aGUgbWVzc2FnZSBhbmQgc2VuZCBvbiB0aGUgY29ubmVjdGlvbiwgc2F2ZSBpbiBzZW50cmVxIGlmIHByb3ZpZGVkICovCitzdGF0aWMgaW50IGRvX3NlbmQoc3RydWN0IG1zZyAqKiBtc2csIHN0cnVjdCBjbnhjdHggKiBjbngsIHVpbnQzMl90ICogaGJoLCBzdHJ1Y3QgZmRfcGVlciAqIHBlZXIpCit7CisJc3RydWN0IG1zZ19oZHIgKiBoZHI7CisJaW50IG1zZ19pc19hX3JlcTsKKwl1aW50OF90ICogYnVmOworCXNpemVfdCBzejsKKwlpbnQgcmV0OworCXVpbnQzMl90IGJrcF9oYmggPSAwOworCXN0cnVjdCBtc2cgKmNweV9mb3JfbG9nc19vbmx5OworCQorCVRSQUNFX0VOVFJZKCIlcCAlcCAlcCAlcCIsIG1zZywgY254LCBoYmgsIHBlZXIpOworCQorCS8qIFJldHJpZXZlIHRoZSBtZXNzYWdlIGhlYWRlciAqLworCUNIRUNLX0ZDVCggZmRfbXNnX2hkcigqbXNnLCAmaGRyKSApOworCQorCW1zZ19pc19hX3JlcSA9IChoZHItPm1zZ19mbGFncyAmIENNRF9GTEFHX1JFUVVFU1QpOworCWlmIChtc2dfaXNfYV9yZXEpIHsKKwkJQ0hFQ0tfUEFSQU1TKGhiaCAmJiBwZWVyKTsKKwkJLyogQWxsb2MgdGhlIGhvcC1ieS1ob3AgaWQgYW5kIGluY3JlbWVudCB0aGUgdmFsdWUgZm9yIG5leHQgbWVzc2FnZSAqLworCQlia3BfaGJoID0gaGRyLT5tc2dfaGJoaWQ7CisJCWhkci0+bXNnX2hiaGlkID0gKmhiaDsKKwkJKmhiaCA9IGhkci0+bXNnX2hiaGlkICsgMTsKKwl9CisJCisJLyogQ3JlYXRlIHRoZSBtZXNzYWdlIGJ1ZmZlciAqLworCUNIRUNLX0ZDVChmZF9tc2dfYnVmZmVyaXplKCAqbXNnLCAmYnVmLCAmc3ogKSk7CisJcHRocmVhZF9jbGVhbnVwX3B1c2goIGZyZWUsIGJ1ZiApOworCQorCWNweV9mb3JfbG9nc19vbmx5ID0gKm1zZzsKKwkKKwkvKiBTYXZlIGEgcmVxdWVzdCBiZWZvcmUgc2VuZGluZyBzbyB0aGF0IHRoZXJlIGlzIG5vIHJhY2UgY29uZGl0aW9uIHdpdGggdGhlIGFuc3dlciAqLworCWlmIChtc2dfaXNfYV9yZXEpIHsKKwkJQ0hFQ0tfRkNUX0RPKCByZXQgPSBmZF9wX3NyX3N0b3JlKCZwZWVyLT5wX3NyLCBtc2csICZoZHItPm1zZ19oYmhpZCwgYmtwX2hiaCksIGdvdG8gb3V0ICk7CisJfQorCQorCS8qIExvZyB0aGUgbWVzc2FnZSAqLworCWZkX2hvb2tfY2FsbChIT09LX01FU1NBR0VfU0VOVCwgY3B5X2Zvcl9sb2dzX29ubHksIHBlZXIsIE5VTEwsIGZkX21zZ19wbWRsX2dldChjcHlfZm9yX2xvZ3Nfb25seSkpOworCQorCXB0aHJlYWRfY2xlYW51cF9wdXNoKCh2b2lkICopZmRfbXNnX2ZyZWUsICptc2cgLyogbWlnaHQgYmUgTlVMTCwgbm8gcHJvYmxlbSAqLyk7CisJCisJLyogU2VuZCB0aGUgbWVzc2FnZSAqLworCUNIRUNLX0ZDVF9ETyggcmV0ID0gZmRfY254X3NlbmQoY254LCBidWYsIHN6KSwgKTsKKwkKKwlwdGhyZWFkX2NsZWFudXBfcG9wKDApOworCQorb3V0OgorCTsJCisJcHRocmVhZF9jbGVhbnVwX3BvcCgxKTsKKwkKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCQorCS8qIEZyZWUgcmVtYWluaW5nIG1lc3NhZ2VzIChpLmUuIGFuc3dlcnMpICovCisJaWYgKCptc2cpIHsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfZnJlZSgqbXNnKSApOworCQkqbXNnID0gTlVMTDsKKwl9CisJCisJcmV0dXJuIDA7Cit9CisKKy8qIFRoZSBjb2RlIG9mIHRoZSAib3V0IiB0aHJlYWQgKi8KK3N0YXRpYyB2b2lkICogb3V0X3Rocih2b2lkICogYXJnKQoreworCXN0cnVjdCBmZF9wZWVyICogcGVlciA9IGFyZzsKKwlpbnQgc3RvcCA9IDA7CisJc3RydWN0IG1zZyAqIG1zZzsKKwlBU1NFUlQoIENIRUNLX1BFRVIocGVlcikgKTsKKwkKKwkvKiBTZXQgdGhlIHRocmVhZCBuYW1lICovCisJeworCQljaGFyIGJ1Zls0OF07CisJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJPVVQvJXMiLCBwZWVyLT5wX2hkci5pbmZvLnBpX2RpYW1pZCk7CisJCWZkX2xvZ190aHJlYWRuYW1lICggYnVmICk7CisJfQorCQorCS8qIExvb3AgdW50aWwgY2FuY2VsYXRpb24gKi8KKwl3aGlsZSAoIXN0b3ApIHsKKwkJaW50IHJldDsKKwkJCisJCS8qIFJldHJpZXZlIG5leHQgbWVzc2FnZSB0byBzZW5kICovCisJCUNIRUNLX0ZDVF9ETyggZmRfZmlmb19nZXQocGVlci0+cF90b3NlbmQsICZtc2cpLCBnb3RvIGVycm9yICk7CisJCQorCQkvKiBTZW5kIHRoZSBtZXNzYWdlLCBsb2cgYW55IGVycm9yICovCisJCUNIRUNLX0ZDVF9ETyggcmV0ID0gZG9fc2VuZCgmbXNnLCBwZWVyLT5wX2NueGN0eCwgJnBlZXItPnBfaGJoLCBwZWVyKSwKKwkJCXsKKwkJCQlpZiAobXNnKSB7CisJCQkJCWNoYXIgYnVmWzI1Nl07CisJCQkJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJFcnJvciB3aGlsZSBzZW5kaW5nIHRoaXMgbWVzc2FnZTogJXMiLCBzdHJlcnJvcihyZXQpKTsKKwkJCQkJZmRfaG9va19jYWxsKEhPT0tfTUVTU0FHRV9EUk9QUEVELCBtc2csIE5VTEwsIGJ1ZiwgZmRfbXNnX3BtZGxfZ2V0KG1zZykpOworCQkJCQlmZF9tc2dfZnJlZShtc2cpOworCQkJCX0KKwkJCQlzdG9wID0gMTsKKwkJCX0gKTsKKwkJCQorCX0KKwkKKwkvKiBJZiB3ZSdyZSBoZXJlIGl0IG1lYW5zIHRoZXJlIHdhcyBhbiBlcnJvciBvbiB0aGUgc29ja2V0LiBXZSBuZWVkIHRvIGNvbnRpbnVlIHRvIHB1cmdlIHRoZSBmaWZvICYgdW50aWwgd2UgYXJlIGNhbmNlbGVkICovCisJQ0hFQ0tfRkNUX0RPKCBmZF9ldmVudF9zZW5kKHBlZXItPnBfZXZlbnRzLCBGREVWUF9DTlhfRVJST1IsIDAsIE5VTEwpLCAvKiBXaGF0IGRvIHdlIGRvIGlmIGl0IGZhaWxzPyAqLyApOworCQorCS8qIFJlcXVldWUgYWxsIHJvdXRhYmxlIG1lc3NhZ2VzIGluIHRoZSBnbG9iYWwgIm91dCIgcXVldWUsIHVudGlsIHdlIGFyZSBjYW5jZWxlZCBvbmNlIHRoZSBQU00gZGVhbHMgd2l0aCB0aGUgQ05YX0VSUk9SIHNlbnQgYWJvdmUgKi8KKwl3aGlsZSAoIGZkX2ZpZm9fZ2V0KHBlZXItPnBfdG9zZW5kLCAmbXNnKSA9PSAwICkgeworCQlpZiAoZmRfbXNnX2lzX3JvdXRhYmxlKG1zZykpIHsKKwkJCUNIRUNLX0ZDVF9ETyhmZF9maWZvX3Bvc3Rfbm9ibG9jayhwZWVyLT5wX3RvZmFpbG92ZXIsICh2b2lkICopJm1zZyksIAorCQkJCXsKKwkJCQkJLyogZmFsbGJhY2s6IGRlc3Ryb3kgdGhlIG1lc3NhZ2UgKi8KKwkJCQkJZmRfaG9va19jYWxsKEhPT0tfTUVTU0FHRV9EUk9QUEVELCBtc2csIE5VTEwsICJJbnRlcm5hbCBlcnJvcjogdW5hYmxlIHRvIHJlcXVldWUgdGhpcyBtZXNzYWdlIGR1cmluZyBmYWlsb3ZlciBwcm9jZXNzIiwgZmRfbXNnX3BtZGxfZ2V0KG1zZykpOworCQkJCQlDSEVDS19GQ1RfRE8oZmRfbXNnX2ZyZWUobXNnKSwgLyogV2hhdCBjYW4gd2UgZG8gbW9yZT8gKi8pCisJCQkJfSApOworCQl9IGVsc2UgeworCQkJLyogSnVzdCBmcmVlIGl0ICovCisJCQkvKiBmZF9ob29rX2NhbGwoSE9PS19NRVNTQUdFX0RST1BQRUQsIG0sIE5VTEwsICJOb24tcm91dGFibGUgbWVzc2FnZSBmcmVlZCBkdXJpbmcgaGFuZG92ZXIiLCBmZF9tc2dfcG1kbF9nZXQobSkpOyAqLworCQkJQ0hFQ0tfRkNUX0RPKGZkX21zZ19mcmVlKG1zZyksIC8qIFdoYXQgY2FuIHdlIGRvIG1vcmU/ICovKQorCQl9CisJfQorCitlcnJvcjoKKwkvKiBJdCBpcyBub3QgcmVhbGx5IGEgY29ubmVjdGlvbiBlcnJvciwgYnV0IHRoZSBlZmZlY3QgaXMgdGhlIHNhbWUsIHdlIGFyZSBub3QgYWJsZSB0byBzZW5kIGFueW1vcmUgbWVzc2FnZSAqLworCUNIRUNLX0ZDVF9ETyggZmRfZXZlbnRfc2VuZChwZWVyLT5wX2V2ZW50cywgRkRFVlBfQ05YX0VSUk9SLCAwLCBOVUxMKSwgLyogV2hhdCBkbyB3ZSBkbyBpZiBpdCBmYWlscz8gKi8gKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyogV3JhcHBlciB0byBzZW5kaW5nIGEgbWVzc2FnZSBlaXRoZXIgYnkgb3V0IHRocmVhZCAocGVlciBpbiBPUEVOIHN0YXRlKSBvciBkaXJlY3RseTsgY254IG9yIHBlZXIgbXVzdCBiZSBwcm92aWRlZC4gRmxhZ3MgYXJlIHZhbGlkIG9ubHkgZm9yIGRpcmVjdCBzZW5kaW5nLCBub3QgdGhyb3VnaCB0aHJlYWQgKHVudXNlZCkgKi8KK2ludCBmZF9vdXRfc2VuZChzdHJ1Y3QgbXNnICoqIG1zZywgc3RydWN0IGNueGN0eCAqIGNueCwgc3RydWN0IGZkX3BlZXIgKiBwZWVyLCBpbnQgdXBkYXRlX3JlcWluX2NudCkKK3sKKwlzdHJ1Y3QgbXNnX2hkciAqIGhkcjsKKwkKKwlUUkFDRV9FTlRSWSgiJXAgJXAgJXAiLCBtc2csIGNueCwgcGVlcik7CisJQ0hFQ0tfUEFSQU1TKCBtc2cgJiYgKm1zZyAmJiAoY254IHx8IChwZWVyICYmIHBlZXItPnBfY254Y3R4KSkpOworCisJZmRfaG9va19jYWxsKEhPT0tfTUVTU0FHRV9TRU5ESU5HLCAqbXNnLCBwZWVyLCBOVUxMLCBmZF9tc2dfcG1kbF9nZXQoKm1zZykpOworCQorCWlmICh1cGRhdGVfcmVxaW5fY250ICYmIHBlZXIpIHsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfaGRyKCptc2csICZoZHIpICk7CisJCWlmICghKGhkci0+bXNnX2ZsYWdzICYgQ01EX0ZMQUdfUkVRVUVTVCkpIHsKKwkJCS8qIFVwZGF0ZSB0aGUgY291bnQgb2YgcGVuZGluZyBhbnN3ZXJzIHRvIHNlbmQgKi8KKwkJCUNIRUNLX1BPU0lYKCBwdGhyZWFkX211dGV4X2xvY2soJnBlZXItPnBfc3RhdGVfbXR4KSApOworCQkJcGVlci0+cF9yZXFpbl9jb3VudC0tOworCQkJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZwZWVyLT5wX3N0YXRlX210eCkgKTsJCQkKKwkJfQorCX0KKwkKKwlpZiAoZmRfcGVlcl9nZXRzdGF0ZShwZWVyKSA9PSBTVEFURV9PUEVOKSB7CisJCS8qIE5vcm1hbCBjYXNlOiBqdXN0IHF1ZXVlIGZvciB0aGUgb3V0IHRocmVhZCB0byBwaWNrIGl0IHVwICovCisJCUNIRUNLX0ZDVCggZmRfZmlmb19wb3N0KHBlZXItPnBfdG9zZW5kLCBtc2cpICk7CisJCQorCX0gZWxzZSB7CisJCWludCByZXQ7CisJCXVpbnQzMl90ICpoYmggPSBOVUxMOworCQkKKwkJLyogSW4gb3RoZXIgY2FzZXMsIHRoZSB0aHJlYWQgaXMgbm90IHJ1bm5pbmcsIHNvIHdlIGhhbmRsZSB0aGUgc2VuZGluZyBkaXJlY3RseSAqLworCQlpZiAocGVlcikKKwkJCWhiaCA9ICZwZWVyLT5wX2hiaDsKKworCQlpZiAoIWNueCkKKwkJCWNueCA9IHBlZXItPnBfY254Y3R4OworCisJCS8qIERvIHNlbmQgdGhlIG1lc3NhZ2UgKi8KKwkJQ0hFQ0tfRkNUX0RPKCByZXQgPSBkb19zZW5kKG1zZywgY254LCBoYmgsIHBlZXIpLAorCQkJeworCQkJCWlmIChtc2cpIHsKKwkJCQkJY2hhciBidWZbMjU2XTsKKwkJCQkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIkVycm9yIHdoaWxlIHNlbmRpbmcgdGhpcyBtZXNzYWdlOiAlcyIsIHN0cmVycm9yKHJldCkpOworCQkJCQlmZF9ob29rX2NhbGwoSE9PS19NRVNTQUdFX0RST1BQRUQsICptc2csIE5VTEwsIGJ1ZiwgZmRfbXNnX3BtZGxfZ2V0KCptc2cpKTsKKwkJCQkJZmRfbXNnX2ZyZWUoKm1zZyk7CisJCQkJCSptc2cgPSBOVUxMOworCQkJCX0KKwkJCX0gKTsKKwl9CisJCisJcmV0dXJuIDA7Cit9CisKKy8qIFN0YXJ0IHRoZSAib3V0IiB0aHJlYWQgdGhhdCBwaWNrcyBtZXNzYWdlcyBpbiBwX3Rvc2VuZCBhbmQgc2VuZCB0aGVtIG9uIHBfY254Y3R4ICovCitpbnQgZmRfb3V0X3N0YXJ0KHN0cnVjdCBmZF9wZWVyICogcGVlcikKK3sKKwlUUkFDRV9FTlRSWSgiJXAiLCBwZWVyKTsKKwlDSEVDS19QQVJBTVMoIENIRUNLX1BFRVIocGVlcikgJiYgKHBlZXItPnBfb3V0dGhyID09IChwdGhyZWFkX3QpTlVMTCkgKTsKKwkKKwlDSEVDS19QT1NJWCggcHRocmVhZF9jcmVhdGUoJnBlZXItPnBfb3V0dGhyLCBOVUxMLCBvdXRfdGhyLCBwZWVyKSApOworCQorCUNIRUNLX0ZDVCggZmRfY254X3Vub3JkZXJlZF9kZWxpdmVyeShwZWVyLT5wX2NueGN0eCwgMSkgKTsKKwkKKwlyZXR1cm4gMDsKK30KKworLyogU3RvcCB0aGF0IHRocmVhZCAqLworaW50IGZkX291dF9zdG9wKHN0cnVjdCBmZF9wZWVyICogcGVlcikKK3sKKwlUUkFDRV9FTlRSWSgiJXAiLCBwZWVyKTsKKwlDSEVDS19QQVJBTVMoIENIRUNLX1BFRVIocGVlcikgKTsKKwkKKwlDSEVDS19GQ1QoIGZkX2NueF91bm9yZGVyZWRfZGVsaXZlcnkocGVlci0+cF9jbnhjdHgsIDApICk7CisJCisJQ0hFQ0tfRkNUKCBmZF90aHJfdGVybSgmcGVlci0+cF9vdXR0aHIpICk7CisJCisJcmV0dXJuIDA7Cit9CisJCQpkaWZmIC0tZ2l0IGEvbGliZmRjb3JlL3BfcHNtLmMgYi9saWJmZGNvcmUvcF9wc20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTMwYzVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliZmRjb3JlL3BfcHNtLmMKQEAgLTAsMCArMSw5NTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDEzLCBXSURFIFByb2plY3QgYW5kIE5JQ1QJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFdJREUgUHJvamVjdCBvciBOSUNUIG5vciB0aGUgCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgV0lERSBQcm9qZWN0IGFuZCAJCQkJCQkgKgorKiAgIE5JQ1QuCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImZkY29yZS1pbnRlcm5hbC5oIgorCisvKgorVGhpcyBmaWxlIGltcGxlbWVudCBhIFBlZXIgU3RhdGUgTWFjaGluZSB3aGljaCBpcyBhIG1peCBvZjoKKyAtIHRoZSBzdGF0ZSBtYWNoaW5lIGRlc2NyaWJlZCBpbiByZmMzNTg4YmlzCisgLSB0aGUgc3RhdGUgbWFjaGluZSBkZXNjcmliZWQgaW4gcmZjMzUzOSNzZWN0aW9uLTMuNAorIC0gdGhlIGZvbGxvd2luZyBvYnNlcnZhdGlvbnMuCisgCitUaGUgZGVsaXZlcnkgb2YgRGlhbWV0ZXIgbWVzc2FnZXMgbXVzdCBub3QgYWx3YXlzIGJlIHVub3JkZXJlZDogb3JkZXIgaXMgaW1wb3J0YW50IGF0CitiZWdpbmluZyBhbmQgZW5kIG9mIGEgY29ubmVjdGlvbiBsaWZldGltZS4gSXQgbWVhbnMgd2UgbmVlZCBhZ2lsaXR5IHRvCitzd2l0Y2ggYmV0d2VlbiAib3JkZXJpbmcgZW5mb3JjZWQiIGFuZCAib3JkZXJpbmcgbm90IGVuZm9yY2VkIHRvIGNvdW50ZXIKK0hlYWQgb2YgdGhlIExpbmUgQmxvY2tpbmciIG1vZGVzIG9mIG9wZXJhdGlvbi4KKworVGhlIGNvbm5lY3Rpb24gc3RhdGUgbWFjaGluZSByZXByZXNlbnRlZCBpbiBSRkMzNTg4IChhbmQgUkZDNjczMykgaXMKK2luY29tcGxldGUsIGJlY2F1c2UgaXQgbGFja3MgdGhlIFNVU1BFQ1Qgc3RhdGUgYW5kIHRoZSAzIERXUi9EV0EKK2V4Y2hhbmdlcyAoc2VjdGlvbiA1LjEpIHdoZW4gdGhlIHBlZXIgcmVjb3ZlcnMgZnJvbSB0aGlzIHN0YXRlLgorUGVyc29ubmFsbHkgSSBkb24ndCBzZWUgdGhlIHJhdGlvbmFsZSBmb3IgZXhjaGFuZ2luZyAzIG1lc3NhZ2VzICh3aHkgMz8pCitidXQsIGlmIHdlIHJlcXVpcmUgYXQgbGVhc3QgMSBEV1IvRFdBIGV4Y2hhbmdlIHRvIGJlIGFsd2F5cyBwZXJmb3JtZWQKK2FmdGVyIHRoZSBDRVIvQ0VBIGV4Y2hhbmdlIChhbmQgaW5pdGlhdGVkIGJ5IHRoZSBwZWVyIHRoYXQgc2VudCB0aGUKK0NFQSksIHdlIGhhdmUgYSBzaW1wbGUgd2F5IHRvIGRlYWwgd2l0aCBvdXIgb3JkZXJpbmcgcHJvYmxlbSwgYXMgcmVzdW1lZAorYmVsb3cuIFBlZXJzIGFyZTogW2ldbml0aWF0b3IsIFtyXWVzcG9uZGVyLgorICgxKSBbaV0gU0NUUCBjb25uZWN0aW9uIGF0dGVtcHQuCisgKDIpIFtyXSBhY2NlcHQgdGhlIGNvbm5lY3Rpb24uCisgKDMpIFtpLHJdIChpZiBzZWN1cmUgcG9ydCkgRFRMUyBoYW5kc2hha2UsIGNsb3NlIG9uIGZhaWx1cmUuCisgKDQpIFtpXSBTZW5kIENFUgorICg1KSBbcl0gUmVjZWl2ZSBDRVIsIHNlbmQgQ0VBIHVzaW5nIHN0cmVhbSAwLCBmbGFnICJ1bm9yZGVyZWQiIGNsZWFyZWQuCisgICAgICAgW3JdIEltbWVkaWF0ZWx5IHNlbmQgYSBEV1IgYWZ0ZXIgdGhlIENFQSwgYWxzbyB1c2luZyBzdHJlYW0gMCwKK2ZsYWcgInVub3JkZXJlZCIgY2xlYXJlZC4KKyAgICAgICBbcl0gTW92ZSB0byBTVEFURV9PUEVOX05FVyBzdGF0ZSAtLSBlcXVpdmFsZW50IHRvIE9QRU4gZXhjZXB0Cit0aGF0IGFsbCBtZXNzYWdlcyBhcmUgc2VudCBvcmRlcmVkIGF0IHRoZSBtb21lbnQuCisgKDYpIFtpXSByZWNlaXZlIENFQSwgbW92ZSB0byBPUEVOIHN0YXRlLiBBbGwgbWVzc2FnZXMgY2FuIGJlIHNlbnQKK3Vub3JkZXJlZCBpbiBPUEVOIHN0YXRlLgorICAgICAgIFtpXSBBcyBwZXIgbm9ybWFsIG9wZXJhdGlvbiwgcmVwbHkgd2l0aCBEV0EgdG8gdGhlIERXUi4KKyAoNykgW3JdIFVwb24gcmVjZXB0aW9uIG9mIHRoZSBEV0EsIG1vdmUgdG8gT1BFTiBzdGF0ZSwgbWVzc2FnZXMgY2FuIGJlCitzZW50IHVub3JkZXJlZCBmcm9tIHRoaXMgcG9pbnQuCisKK05vdGUgYWJvdXQgKDUpIGFuZCAoNik6IGlmIHRoZSBEaWFtZXRlciBJZGVudGl0eSByZWNlaXZlZCBpbiBDRVIgb3IgQ0VBCitkb2VzIG5vdCBtYXRjaCB0aGUgY3JlZGVudGlhbHMgZnJvbSB0aGUgY2VydGlmaWNhdGUgcHJlc2VudGVkIGR1cmluZworVExTIGhhbmRzaGFrZSwgd2UgbWF5IG5lZWQgdG8gc3BlY2lmeSBhIHBhdGggb2YgY2xlYW4gZGlzY29ubmVjdGlvbgorKG5vdCBibG9ja2luZyB0aGUgcmVtb3RlIHBlZXIgd2FpdGluZyBmb3Igc29tZXRoaW5nKS4KKworVGhpcyBwcm9wb3NlZCBtZWNoYW5pc20gcmVtb3ZlcyB0aGUgcHJvYmxlbSBvZiBhcHBsaWNhdGlvbiBtZXNzYWdlcworcmVjZWl2ZWQgYmVmb3JlIHRoZSBDRUEgYnkgdGhlIGluaXRpYXRvci4gTm90ZSB0aGF0IGlmIHRoZSAib2xkIiBpbmJhbmQKK1RMUyBoYW5kc2hha2UgaXMgdXNlZCwgdGhpcyBoYW5kc2hha2UgcGxheXMgdGhlIHNhbWUgc3luY2hyb25pemF0aW9uCityb2xlIHRoYW4gdGhlIG5ldyBEV1IvRFdBLCB3aGljaCBiZWNvbWVzIHVzZWxlc3MuCisKKworVGhlIG90aGVyIHRpbWUgd2hlcmUgb3JkZXJpbmcgaXMgaW1wb3J0YW50IGlzIGJ5IHRoZSBlbmQgb2YgY29ubmVjdGlvbgorbGlmZXRpbWUsIHdoZW4gb25lIHBlZXIgaXMgc2h1dHRpbmcgZG93biB0aGUgbGluayBmb3Igc29tZSByZWFzb24KKyhyZWJvb3QsIG92ZXJsb2FkLCBubyBhY3Rpdml0eSwgZXRjLi4uKS4gSW4gY2FzZSBvZiB1bm9yZGVyZWQgZGVsaXZlcnksCit3ZSBtYXkgaGF2ZToKKy0gcGVlciBBIHNlbmRzIGFuIGFwcGxpY2F0aW9uIG1lc3NhZ2UgZm9sbG93ZWQgYnkgYSBEUFIuIFBlZXIgQiByZWNlaXZlcwordGhlIERQUiBmaXJzdCBhbmQgdGVhcnMgZG93biB0aGUgY29ubmVjdGlvbi4gQXBwbGljYXRpb24gbWVzc2FnZSBpcyBsb3N0LgorLSBQZWVyIEIgc2VuZHMgYW4gYXBwbGljYXRpb24gbWVzc2FnZSwgdGhlbiByZWNlaXZlcyBhIERQUiBhbmQgYW5zd2VycyBhCitEUEEuIFBlZXIgQSByZWNlaXZlcyB0aGUgRFBBIGJlZm9yZSB0aGUgYXBwbGljYXRpb24gbWVzc2FnZS4gVGhlCithcHBsaWNhdGlvbiBtZXNzYWdlIGlzIGxvc3QuCisKK1RoaXMgc2l0dWF0aW9uIGlzIGFjdHVhbGx5IGhhcHBlbmluZyBlYXNpbHkgYmVjYXVzZSBEUFIvRFBBIG1lc3NhZ2VzIGFyZQordmVyeSBzaG9ydCwgd2hpbGUgYXBwbGljYXRpb24gbWVzc2FnZXMgY2FuIGJlIHF1aXRlIGxhcmdlLiBUaGVyZWZvcmUsCit0aGV5IHJlcXVpcmUgbXVjaCBtb3JlIHRpbWUgdG8gZGVsaXZlci4KKworSSByZWFsbHkgY2Fubm90IHNlZSBhIHdheSB0byBjb3VudGVyIHRoaXMgZWZmZWN0IGJ5IHVzaW5nIHRoZSBvcmRlcmluZworb2YgdGhlIG1lc3NhZ2VzLCBleGNlcHQgYnkgYXBwbHlpbmcgYSB0aW1lciAoc3RhdGUgU1RBVEVfQ0xPU0lOR19HUkFDRSkuCitUaGlzIHRpbWVyIGNhbiBiZSBhbHNvIHVzZWZ1bCB3aGVuIHdlIGRldGVjdCB0aGF0IHNvbWUgbWVzc2FnZXMgaGFzIG5vdCAKK3lldCByZWNlaXZlZCBhbiBhbnN3ZXIgb24gdGhpcyBsaW5rLCB0byBnaXZlIHRpbWUgdG8gdGhlIGFwcGxpY2F0aW9uIHRvIAorY29tcGxldGUgdGhlIGV4Y2hhbmdlIG9uZ29pbmcuCisKK0hvd2V2ZXIsIHRoaXMgcHJvYmxlbSBtdXN0IGJlIGJhbGFuY2VkIHdpdGggdGhlIGZhY3QgdGhhdCB0aGUgbWVzc2FnZQordGhhdCBpcyBsb3N0IHdpbGwgYmUgaW4gbWFueSBjYXNlcyBzZW50IGFnYWluIGFzIHRoZSBmYWlsb3ZlciBtZWNoYW5pc20KK3NwZWNpZmllcy4KKyovCisKKy8qIFRoZSBhY3R1YWwgZGVjbGFyYXRpb24gb2YgcGVlcl9zdGF0ZV9zdHIgKi8KK0RFQ0xBUkVfU1RBVEVfU1RSKCk7CisKKy8qIEhlbHBlciBmb3IgbmV4dCBtYWNybyAqLworI2RlZmluZSBjYXNlX3N0ciggX3ZhbCApCQlcCisJY2FzZSBfdmFsIDogcmV0dXJuICNfdmFsCisKK0RFQ0xBUkVfUEVWX1NUUigpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgRGVsYXllZCBzdGFydHVwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHN0YXJ0ZWQgPSAwOworc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCAgc3RhcnRlZF9tdHggPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOworc3RhdGljIHB0aHJlYWRfY29uZF90ICAgc3RhcnRlZF9jbmQgPSBQVEhSRUFEX0NPTkRfSU5JVElBTElaRVI7CisKKy8qIFdhaXQgZm9yIHN0YXJ0IHNpZ25hbCAqLworc3RhdGljIGludCBmZF9wc21fd2FpdHN0YXJ0KCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlUUkFDRV9FTlRSWSgiIik7CisJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfbXV0ZXhfbG9jaygmc3RhcnRlZF9tdHgpICk7Cithd2FrZToJCisJaWYgKCFyZXQgJiYgIXN0YXJ0ZWQpIHsKKwkJcHRocmVhZF9jbGVhbnVwX3B1c2goIGZkX2NsZWFudXBfbXV0ZXgsICZzdGFydGVkX210eCApOworCQlDSEVDS19QT1NJWF9ETyggcmV0ID0gcHRocmVhZF9jb25kX3dhaXQoJnN0YXJ0ZWRfY25kLCAmc3RhcnRlZF9tdHgpLCApOworCQlwdGhyZWFkX2NsZWFudXBfcG9wKCAwICk7CisJCWdvdG8gYXdha2U7CisJfQorCUNIRUNLX1BPU0lYKCBwdGhyZWFkX211dGV4X3VubG9jaygmc3RhcnRlZF9tdHgpICk7CisJcmV0dXJuIHJldDsKK30KKworLyogQWxsb3cgdGhlIHN0YXRlIG1hY2hpbmVzIHRvIHN0YXJ0ICovCitpbnQgZmRfcHNtX3N0YXJ0KCkKK3sKKwlUUkFDRV9FTlRSWSgiIik7CisJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfbXV0ZXhfbG9jaygmc3RhcnRlZF9tdHgpICk7CisJc3RhcnRlZCA9IDE7CisJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfY29uZF9icm9hZGNhc3QoJnN0YXJ0ZWRfY25kKSApOworCUNIRUNLX1BPU0lYKCBwdGhyZWFkX211dGV4X3VubG9jaygmc3RhcnRlZF9tdHgpICk7CisJcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICBNYW5hZ2UgdGhlIGxpc3Qgb2YgYWN0aXZlIHBlZXJzICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBFbnRlci9sZWF2ZSBPUEVOIHN0YXRlICovCitzdGF0aWMgaW50IGVudGVyX29wZW5fc3RhdGUoc3RydWN0IGZkX3BlZXIgKiBwZWVyKQoreworCXN0cnVjdCBmZF9saXN0ICogbGk7CisJQ0hFQ0tfUEFSQU1TKCBGRF9JU19MSVNUX0VNUFRZKCZwZWVyLT5wX2FjdGl2ZXMpICk7CisJCisJLyogQ2FsbGJhY2sgcmVnaXN0ZXJlZCBieSB0aGUgY3JlZGVudGlhbCB2YWxpZGF0b3IgKGZkX3BlZXJfdmFsaWRhdGVfcmVnaXN0ZXIpICovCisJaWYgKHBlZXItPnBfY2IyKSB7CisJCUNIRUNLX0ZDVF9ETyggKCpwZWVyLT5wX2NiMikoJnBlZXItPnBfaGRyLmluZm8pLAorCQkJeworCQkJCVRSQUNFX0RFQlVHKEZVTEwsICJWYWxpZGF0aW9uIGZhaWxlZCwgdGVybWluYXRpbmcgdGhlIGNvbm5lY3Rpb24iKTsKKwkJCQlmZF9wc21fdGVybWluYXRlKHBlZXIsICJET19OT1RfV0FOVF9UT19UQUxLX1RPX1lPVSIgKTsKKwkJCX0gKTsKKwkJcGVlci0+cF9jYjIgPSBOVUxMOworCQlyZXR1cm4gMDsKKwl9CisJCisJLyogSW5zZXJ0IGluIHRoZSBhY3RpdmUgcGVlcnMgbGlzdCAqLworCUNIRUNLX1BPU0lYKCBwdGhyZWFkX3J3bG9ja193cmxvY2soJmZkX2dfYWN0aXZfcGVlcnNfcncpICk7CisJZm9yIChsaSA9IGZkX2dfYWN0aXZfcGVlcnMubmV4dDsgbGkgIT0gJmZkX2dfYWN0aXZfcGVlcnM7IGxpID0gbGktPm5leHQpIHsKKwkJc3RydWN0IGZkX3BlZXIgKiBuZXh0X3AgPSAoc3RydWN0IGZkX3BlZXIgKilsaS0+bzsKKwkJaW50IGNtcCA9IGZkX29zX2NtcChwZWVyLT5wX2hkci5pbmZvLnBpX2RpYW1pZCwgcGVlci0+cF9oZHIuaW5mby5waV9kaWFtaWRsZW4sIAorCQkJCQluZXh0X3AtPnBfaGRyLmluZm8ucGlfZGlhbWlkLCBuZXh0X3AtPnBfaGRyLmluZm8ucGlfZGlhbWlkbGVuKTsKKwkJaWYgKGNtcCA8IDApCisJCQlicmVhazsKKwl9CisJZmRfbGlzdF9pbnNlcnRfYmVmb3JlKGxpLCAmcGVlci0+cF9hY3RpdmVzKTsKKwlDSEVDS19QT1NJWCggcHRocmVhZF9yd2xvY2tfdW5sb2NrKCZmZF9nX2FjdGl2X3BlZXJzX3J3KSApOworCQorCS8qIENhbGxiYWNrIHJlZ2lzdGVyZWQgd2hlbiB0aGUgcGVlciB3YXMgYWRkZWQsIGJ5IGZkX3BlZXJfYWRkICovCisJaWYgKHBlZXItPnBfY2IpIHsKKwkJVFJBQ0VfREVCVUcoRlVMTCwgIkNhbGxpbmcgYWRkIGNhbGxiYWNrIGZvciBwZWVyICVzIiwgcGVlci0+cF9oZHIuaW5mby5waV9kaWFtaWQpOworCQkoKnBlZXItPnBfY2IpKCZwZWVyLT5wX2hkci5pbmZvLCBwZWVyLT5wX2NiX2RhdGEpOyAvKiBUT0RPOiBkbyB0aGlzIGluIGEgc2VwYXJhdGUgZGV0YWNoZWQgdGhyZWFkPyAqLworCQlwZWVyLT5wX2NiID0gTlVMTDsKKwkJcGVlci0+cF9jYl9kYXRhID0gTlVMTDsKKwl9CisJCisJLyogU3RhcnQgdGhlIHRocmVhZCB0byBoYW5kbGUgb3V0Z29pbmcgbWVzc2FnZXMgKi8KKwlDSEVDS19GQ1QoIGZkX291dF9zdGFydChwZWVyKSApOworCQorCS8qIFVwZGF0ZSB0aGUgZXhwaXJ5IHRpbWVyIG5vdyAqLworCUNIRUNLX0ZDVCggZmRfcF9leHBpX3VwZGF0ZShwZWVyKSApOworCQorCXJldHVybiAwOworfQorc3RhdGljIGludCBsZWF2ZV9vcGVuX3N0YXRlKHN0cnVjdCBmZF9wZWVyICogcGVlciwgaW50IHNraXBfZmFpbG92ZXIpCit7CisJLyogUmVtb3ZlIGZyb20gYWN0aXZlIHBlZXJzIGxpc3QgKi8KKwlDSEVDS19QT1NJWCggcHRocmVhZF9yd2xvY2tfd3Jsb2NrKCZmZF9nX2FjdGl2X3BlZXJzX3J3KSApOworCWZkX2xpc3RfdW5saW5rKCAmcGVlci0+cF9hY3RpdmVzICk7CisJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfcndsb2NrX3VubG9jaygmZmRfZ19hY3Rpdl9wZWVyc19ydykgKTsKKwkKKwkvKiBTdG9wIHRoZSAib3V0IiB0aHJlYWQgKi8KKwlDSEVDS19GQ1QoIGZkX291dF9zdG9wKHBlZXIpICk7CisJCisJLyogRmFpbG92ZXIgdGhlIG1lc3NhZ2VzICovCisJaWYgKCFza2lwX2ZhaWxvdmVyKSB7CisJCWZkX3BlZXJfZmFpbG92ZXJfbXNnKHBlZXIpOworCX0KKwkKKwlyZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgSGVscGVycyBmb3Igc3RhdGUgY2hhbmdlcyAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIENsZWFudXAgcGVuZGluZyBldmVudHMgaW4gdGhlIHBlZXIgKi8KK3ZvaWQgZmRfcHNtX2V2ZW50c19mcmVlKHN0cnVjdCBmZF9wZWVyICogcGVlcikKK3sKKwlzdHJ1Y3QgZmRfZXZlbnQgKiBldjsKKwkvKiBQdXJnZSBhbGwgZXZlbnRzLCBhbmQgZnJlZSB0aGUgYXNzb2NpYXRlZCBkYXRhIGlmIGFueSAqLworCXdoaWxlIChmZF9maWZvX3RyeWdldCggcGVlci0+cF9ldmVudHMsICZldiApID09IDApIHsKKwkJc3dpdGNoIChldi0+Y29kZSkgeworCQkJY2FzZSBGREVWUF9DTlhfRVNUQUJMSVNIRUQ6IHsKKwkJCQlmZF9jbnhfZGVzdHJveShldi0+ZGF0YSk7CisJCQl9CisJCQlicmVhazsKKwkJCQorCQkJY2FzZSBGREVWUF9URVJNSU5BVEU6CisJCQkJLyogRG8gbm90IGZyZWUgdGhlIHN0cmluZyBzaW5jZSBpdCBpcyBhIGNvbnN0YW50ICovCisJCQlicmVhazsKKwkJCQorCQkJY2FzZSBGREVWUF9DTlhfSU5DT01JTkc6IHsKKwkJCQlzdHJ1Y3QgY254X2luY29taW5nICogZXZkID0gZXYtPmRhdGE7CisJCQkJZmRfaG9va19jYWxsKEhPT0tfTUVTU0FHRV9EUk9QUEVELCBldmQtPmNlciwgTlVMTCwgIk1lc3NhZ2UgZGlzY2FyZGVkIHdoaWxlIGNsZWFuaW5nIHBlZXIgc3RhdGUgbWFjaGluZSBxdWV1ZS4iLCBmZF9tc2dfcG1kbF9nZXQoZXZkLT5jZXIpKTsKKwkJCQlDSEVDS19GQ1RfRE8oIGZkX21zZ19mcmVlKGV2ZC0+Y2VyKSwgLyogY29udGludWUgKi8pOworCQkJCWZkX2NueF9kZXN0cm95KGV2ZC0+Y254KTsKKwkJCX0KKwkJCWRlZmF1bHQ6CisJCQkJZnJlZShldi0+ZGF0YSk7CisJCX0KKwkJZnJlZShldik7CisJfQorfQorCisvKiBSZWFkIHN0YXRlICovCitpbnQgZmRfcGVlcl9nZXRfc3RhdGUoc3RydWN0IHBlZXJfaGRyICpwZWVyKQoreworCWludCByZXQ7CisJCisJc3RydWN0IGZkX3BlZXIgKiBwID0gKHN0cnVjdCBmZF9wZWVyICopcGVlcjsKKwkKKwlpZiAoIUNIRUNLX1BFRVIocCkpCisJCXJldHVybiAtMTsKKwkKKwlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9tdXRleF9sb2NrKCZwLT5wX3N0YXRlX210eCksIHJldHVybiAtMSApOworCXJldCA9IHAtPnBfc3RhdGU7CisJQ0hFQ0tfUE9TSVhfRE8oIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZwLT5wX3N0YXRlX210eCksIHJldHVybiAtMSApOworCQorCXJldHVybiByZXQ7Cit9CisKKworLyogQ2hhbmdlIHN0YXRlICovCitpbnQgZmRfcHNtX2NoYW5nZV9zdGF0ZShzdHJ1Y3QgZmRfcGVlciAqIHBlZXIsIGludCBuZXdfc3RhdGUpCit7CisJaW50IG9sZDsKKwkKKwlUUkFDRV9FTlRSWSgiJXAgJWQoJXMpIiwgcGVlciwgbmV3X3N0YXRlLCBTVEFURV9TVFIobmV3X3N0YXRlKSk7CisJQ0hFQ0tfUEFSQU1TKCBDSEVDS19QRUVSKHBlZXIpICk7CisJCisJb2xkID0gZmRfcGVlcl9nZXRzdGF0ZShwZWVyKTsKKwlpZiAob2xkID09IG5ld19zdGF0ZSkKKwkJcmV0dXJuIDA7CisJCisJTE9HKCgob2xkID09IFNUQVRFX09QRU4pIHx8IChuZXdfc3RhdGUgPT0gU1RBVEVfT1BFTikpID8gRkRfTE9HX05PVElDRSA6IEZEX0xPR19ERUJVRywgIiclcydcdC0+ICclcydcdCclcyciLAorCQkJU1RBVEVfU1RSKG9sZCksCisJCQlTVEFURV9TVFIobmV3X3N0YXRlKSwKKwkJCXBlZXItPnBfaGRyLmluZm8ucGlfZGlhbWlkKTsKKwkKKwkKKwlDSEVDS19QT1NJWCggcHRocmVhZF9tdXRleF9sb2NrKCZwZWVyLT5wX3N0YXRlX210eCkgKTsKKwlwZWVyLT5wX3N0YXRlID0gbmV3X3N0YXRlOworCUNIRUNLX1BPU0lYKCBwdGhyZWFkX211dGV4X3VubG9jaygmcGVlci0+cF9zdGF0ZV9tdHgpICk7CisJCisJaWYgKG9sZCA9PSBTVEFURV9PUEVOKSB7CisJCUNIRUNLX0ZDVCggbGVhdmVfb3Blbl9zdGF0ZShwZWVyLCBuZXdfc3RhdGUgPT0gU1RBVEVfQ0xPU0lOR19HUkFDRSkgKTsKKwl9CisJaWYgKG9sZCA9PSBTVEFURV9DTE9TSU5HX0dSQUNFKSB7CisJCWZkX3BlZXJfZmFpbG92ZXJfbXNnKHBlZXIpOworCX0KKworCWlmIChuZXdfc3RhdGUgPT0gU1RBVEVfT1BFTikgeworCQlDSEVDS19GQ1QoIGVudGVyX29wZW5fc3RhdGUocGVlcikgKTsKKwl9CisJCisJaWYgKG5ld19zdGF0ZSA9PSBTVEFURV9DTE9TRUQpIHsKKwkJLyogUHVyZ2UgZXZlbnQgbGlzdCAqLworCQlmZF9wc21fZXZlbnRzX2ZyZWUocGVlcik7CisJCQorCQkvKiBSZXNldCB0aGUgY291bnRlciBvZiBwZW5kaW5nIGFud2VycyB0byBzZW5kICovCisJCXBlZXItPnBfcmVxaW5fY291bnQgPSAwOworCQkKKwkJLyogSWYgdGhlIHBlZXIgaXMgbm90IHBlcnNpc3RhbnQsIHdlIGRlc3Ryb3kgaXQgKi8KKwkJaWYgKHBlZXItPnBfaGRyLmluZm8uY29uZmlnLnBpY19mbGFncy5wZXJzaXN0ID09IFBJX1BSU1RfTk9ORSkgeworCQkJQ0hFQ0tfRkNUKCBmZF9ldmVudF9zZW5kKHBlZXItPnBfZXZlbnRzLCBGREVWUF9URVJNSU5BVEUsIDAsIE5VTEwpICk7CisJCX0KKwl9CisJCisJcmV0dXJuIDA7Cit9CisKKy8qIFNldCB0aW1lb3V0IHRpbWVyIG9mIG5leHQgZXZlbnQgKi8KK3ZvaWQgZmRfcHNtX25leHRfdGltZW91dChzdHJ1Y3QgZmRfcGVlciAqIHBlZXIsIGludCBhZGRfcmFuZG9tLCBpbnQgZGVsYXkpCit7CisJVFJBQ0VfREVCVUcoRlVMTCwgIlBlZXIgdGltZW91dCByZXNldCB0byAlZCBzZWNvbmRzJXMiLCBkZWxheSwgYWRkX3JhbmRvbSA/ICIgKCsvLSAyKSIgOiAiIiApOworCQorCS8qIEluaXRpYWxpemUgdGhlIHRpbWVyICovCisJQ0hFQ0tfUE9TSVhfRE8oICBjbG9ja19nZXR0aW1lKCBDTE9DS19SRUFMVElNRSwgICZwZWVyLT5wX3BzbV90aW1lciApLCBBU1NFUlQoMCkgKTsKKwkKKwlpZiAoYWRkX3JhbmRvbSkgeworCQlpZiAoZGVsYXkgPiAyKQorCQkJZGVsYXkgLT0gMjsKKwkJZWxzZQorCQkJZGVsYXkgPSAwOworCisJCS8qIEFkZCBhIHJhbmRvbSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDRzZWMgKi8KKwkJcGVlci0+cF9wc21fdGltZXIudHZfc2VjICs9IHJhbmRvbSgpICUgNDsKKwkJcGVlci0+cF9wc21fdGltZXIudHZfbnNlYys9IHJhbmRvbSgpICUgMTAwMDAwMDAwMEw7CisJCWlmIChwZWVyLT5wX3BzbV90aW1lci50dl9uc2VjID49IDEwMDAwMDAwMDBMKSB7CisJCQlwZWVyLT5wX3BzbV90aW1lci50dl9uc2VjIC09IDEwMDAwMDAwMDBMOworCQkJcGVlci0+cF9wc21fdGltZXIudHZfc2VjICsrOworCQl9CisJfQorCQorCXBlZXItPnBfcHNtX3RpbWVyLnR2X3NlYyArPSBkZWxheTsKKwkKKyNpZmRlZiBTTE9XX1BTTQorCS8qIHRlbXBvcmFyeSBmb3IgZGVidWcgKi8KKwlwZWVyLT5wX3BzbV90aW1lci50dl9zZWMgKz0gMTA7CisjZW5kaWYKK30KKworLyogQ2xlYW51cCB0aGUgcGVlciAqLwordm9pZCBmZF9wc21fY2xlYW51cChzdHJ1Y3QgZmRfcGVlciAqIHBlZXIsIGludCB0ZXJtaW5hdGUpCit7CisJLyogTW92ZSB0byBDTE9TRUQgc3RhdGU6IGZhaWxvdmVyIG1lc3NhZ2VzLCBzdG9wIE9VVCB0aHJlYWQsIHVubGluayBwZWVyIGZyb20gYWN0aXZlIGxpc3QgKi8KKwlpZiAoZmRfcGVlcl9nZXRzdGF0ZShwZWVyKSAhPSBTVEFURV9aT01CSUUpIHsKKwkJQ0hFQ0tfRkNUX0RPKCBmZF9wc21fY2hhbmdlX3N0YXRlKHBlZXIsIFNUQVRFX0NMT1NFRCksIC8qIGNvbnRpbnVlICovICk7CisJfQorCQorCWZkX3BfY254X2Fib3J0KHBlZXIsIHRlcm1pbmF0ZSk7CisJCisJZmRfcF9jZV9jbGVhcl9jbngocGVlciwgTlVMTCk7CisJCisJaWYgKHBlZXItPnBfcmVjZWl2ZXIpIHsKKwkJZmRfY254X2Rlc3Ryb3kocGVlci0+cF9yZWNlaXZlcik7CisJCXBlZXItPnBfcmVjZWl2ZXIgPSBOVUxMOworCX0KKwkKKwlpZiAodGVybWluYXRlKSB7CisJCWZkX3BzbV9ldmVudHNfZnJlZShwZWVyKTsKKwkJQ0hFQ0tfRkNUX0RPKCBmZF9maWZvX2RlbCgmcGVlci0+cF9ldmVudHMpLCAvKiBjb250aW51ZSAqLyApOworCX0KKwkKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgVGhlIFBTTSB0aHJlYWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBDYW5jZWxhdGlvbiBjbGVhbnVwIDogc2V0IFpPTUJJRSBzdGF0ZSBpbiB0aGUgcGVlciAqLwordm9pZCBjbGVhbnVwX3NldHN0YXRlKHZvaWQgKiBhcmcpIAoreworCXN0cnVjdCBmZF9wZWVyICogcGVlciA9IChzdHJ1Y3QgZmRfcGVlciAqKWFyZzsKKwlDSEVDS19QQVJBTVNfRE8oIENIRUNLX1BFRVIocGVlciksIHJldHVybiApOworCUNIRUNLX1BPU0lYX0RPKCBwdGhyZWFkX211dGV4X2xvY2soJnBlZXItPnBfc3RhdGVfbXR4KSwgKTsKKwlwZWVyLT5wX3N0YXRlID0gU1RBVEVfWk9NQklFOworCUNIRUNLX1BPU0lYX0RPKCBwdGhyZWFkX211dGV4X3VubG9jaygmcGVlci0+cF9zdGF0ZV9tdHgpLCApOworCXJldHVybjsKK30KKworLyogVGhlIHN0YXRlIG1hY2hpbmUgdGhyZWFkIChjb250cm9sZXIpICovCitzdGF0aWMgdm9pZCAqIHBfcHNtX3RoKCB2b2lkICogYXJnICkKK3sKKwlzdHJ1Y3QgZmRfcGVlciAqIHBlZXIgPSAoc3RydWN0IGZkX3BlZXIgKilhcmc7CisJaW50IGNyZWF0ZWRfc3RhcnRlZCA9IHN0YXJ0ZWQgPyAxIDogMDsKKwlpbnQgZXZlbnQ7CisJc2l6ZV90IGV2X3N6OworCXZvaWQgKiBldl9kYXRhOworCWludCBjdXJfc3RhdGU7CisJCisJQ0hFQ0tfUEFSQU1TX0RPKCBDSEVDS19QRUVSKHBlZXIpLCBBU1NFUlQoMCkgKTsKKwkKKwlwdGhyZWFkX2NsZWFudXBfcHVzaCggY2xlYW51cF9zZXRzdGF0ZSwgYXJnICk7CisJCisJLyogU2V0IHRoZSB0aHJlYWQgbmFtZSAqLworCXsKKwkJY2hhciBidWZbNDhdOworCQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiUFNNLyVzIiwgcGVlci0+cF9oZHIuaW5mby5waV9kaWFtaWQpOworCQlmZF9sb2dfdGhyZWFkbmFtZSAoIGJ1ZiApOworCX0KKwkKKwkvKiBUaGUgc3RhdGUgbWFjaGluZSBzdGFydHMgaW4gQ0xPU0VEIHN0YXRlICovCisJQ0hFQ0tfUE9TSVhfRE8oIHB0aHJlYWRfbXV0ZXhfbG9jaygmcGVlci0+cF9zdGF0ZV9tdHgpLCBnb3RvIHBzbV9lbmQgKTsKKwlwZWVyLT5wX3N0YXRlID0gU1RBVEVfQ0xPU0VEOworCUNIRUNLX1BPU0lYX0RPKCBwdGhyZWFkX211dGV4X3VubG9jaygmcGVlci0+cF9zdGF0ZV9tdHgpLCBnb3RvIHBzbV9lbmQgKTsKKworCS8qIFdhaXQgdGhhdCB0aGUgUFNNIGFyZSBhdXRob3JpemVkIHRvIHN0YXJ0IGluIHRoZSBkYWVtb24gKi8KKwlDSEVDS19GQ1RfRE8oIGZkX3BzbV93YWl0c3RhcnQoKSwgZ290byBwc21fZW5kICk7CisJCisJLyogSW5pdGlhbGl6ZSB0aGUgdGltZXIgKi8KKwlpZiAocGVlci0+cF9mbGFncy5wZl9yZXNwb25kZXIpIHsKKwkJZmRfcHNtX25leHRfdGltZW91dChwZWVyLCAwLCBJTkNOWF9USU1FT1VUKTsKKwl9IGVsc2UgeworCQlmZF9wc21fbmV4dF90aW1lb3V0KHBlZXIsIGNyZWF0ZWRfc3RhcnRlZCwgMCk7CisJfQorCQorcHNtX2xvb3A6CisJLyogR2V0IG5leHQgZXZlbnQgKi8KKwlUUkFDRV9ERUJVRyhGVUxMLCAiJyVzJyBpbiBzdGF0ZSAnJXMnIHdhaXRpbmcgZm9yIG5leHQgZXZlbnQuIiwKKwkJCXBlZXItPnBfaGRyLmluZm8ucGlfZGlhbWlkLCBTVEFURV9TVFIoZmRfcGVlcl9nZXRzdGF0ZShwZWVyKSkpOworCUNIRUNLX0ZDVF9ETyggZmRfZXZlbnRfdGltZWRnZXQocGVlci0+cF9ldmVudHMsICZwZWVyLT5wX3BzbV90aW1lciwgRkRFVlBfUFNNX1RJTUVPVVQsICZldmVudCwgJmV2X3N6LCAmZXZfZGF0YSksIGdvdG8gcHNtX2VuZCApOworCQorCWN1cl9zdGF0ZSA9IGZkX3BlZXJfZ2V0c3RhdGUocGVlcik7CisJaWYgKGN1cl9zdGF0ZSA9PSAtMSkKKwkJZ290byBwc21fZW5kOworCQorCVRSQUNFX0RFQlVHKEZVTEwsICInJXMnXHQ8LS0gJyVzJ1x0KCVwLCV6ZClcdCclcyciLAorCQkJU1RBVEVfU1RSKGN1cl9zdGF0ZSksCisJCQlmZF9wZXZfc3RyKGV2ZW50KSwgZXZfZGF0YSwgZXZfc3osCisJCQlwZWVyLT5wX2hkci5pbmZvLnBpX2RpYW1pZCk7CisKKwkvKiBOb3csIHRoZSBhY3Rpb24gZGVwZW5kcyBvbiB0aGUgY3VycmVudCBzdGF0ZSBhbmQgdGhlIGluY29taW5nIGV2ZW50ICovCisKKwkvKiBUaGUgZm9sbG93aW5nIHN0YXRlcyBhcmUgaW1wb3NzaWJsZSAqLworCUFTU0VSVCggY3VyX3N0YXRlICE9IFNUQVRFX05FVyApOworCUFTU0VSVCggY3VyX3N0YXRlICE9IFNUQVRFX1pPTUJJRSApOworCUFTU0VSVCggY3VyX3N0YXRlICE9IFNUQVRFX09QRU5fSEFORFNIQUtFICk7IC8qIGJlY2F1c2UgaXQgc2hvdWxkIGV4aXN0IG9ubHkgYmV0d2VlbiB0d28gbG9vcHMgKi8KKworCS8qIFB1cmdlIGludmFsaWQgZXZlbnRzICovCisJaWYgKCFDSEVDS19QRVZFTlQoZXZlbnQpKSB7CisJCVRSQUNFX0RFQlVHKElORk8sICJJbnZhbGlkIGV2ZW50IHJlY2VpdmVkIGluIFBTTSAnJXMnIDogJWQiLCBwZWVyLT5wX2hkci5pbmZvLnBpX2RpYW1pZCwgZXZlbnQpOworCQlBU1NFUlQoMCk7IC8qIHdlIHNob3VsZCBpbnZlc3RpZ2F0ZSB0aGlzIHNpdHVhdGlvbiAqLworCQlnb3RvIHBzbV9sb29wOworCX0KKworCS8qIFJlcXVlc3RzIHRvIHRlcm1pbmF0ZSB0aGUgcGVlciBvYmplY3QgKi8KKwlpZiAoZXZlbnQgPT0gRkRFVlBfVEVSTUlOQVRFKSB7CisJCXN3aXRjaCAoY3VyX3N0YXRlKSB7CisJCQljYXNlIFNUQVRFX09QRU46CisJCQljYXNlIFNUQVRFX09QRU5fTkVXOgorCQkJY2FzZSBTVEFURV9SRU9QRU46CisJCQkJLyogV2UgY2Fubm90IGp1c3QgY2xvc2UgdGhlIGNvbm5lY3Rpb24sIHdlIGhhdmUgdG8gc2VuZCBhIERQUiBmaXJzdCAqLworCQkJCUNIRUNLX0ZDVF9ETyggZmRfcF9kcF9pbml0aWF0ZShwZWVyLCBldl9kYXRhKSwgZ290byBwc21fZW5kICk7CisJCQkJZ290byBwc21fbG9vcDsKKwkJCQorCQkJLyoJCisJCQljYXNlIFNUQVRFX0NMT1NJTkc6CisJCQljYXNlIFNUQVRFX0NMT1NJTkdfR1JBQ0U6CisJCQljYXNlIFNUQVRFX1dBSVRDTlhBQ0s6CisJCQljYXNlIFNUQVRFX1dBSVRDTlhBQ0tfRUxFQzoKKwkJCWNhc2UgU1RBVEVfV0FJVENFQToKKwkJCWNhc2UgU1RBVEVfU1VTUEVDVDoKKwkJCWNhc2UgU1RBVEVfQ0xPU0VEOgorCQkJKi8KKwkJCWRlZmF1bHQ6CisJCQkJLyogSW4gdGhlc2UgY2FzZXMsIHdlIGp1c3QgY2xlYW51cCB0aGUgcGVlciBvYmplY3QgKGlmIG5lZWRlZCkgYW5kIHRlcm1pbmF0ZSAqLworCQkJCWdvdG8gcHNtX2VuZDsKKwkJfQorCX0KKwkKKwkvKiBBIG1lc3NhZ2Ugd2FzIHJlY2VpdmVkICovCisJaWYgKGV2ZW50ID09IEZERVZQX0NOWF9NU0dfUkVDVikgeworCQlzdHJ1Y3QgbXNnICogbXNnID0gTlVMTDsKKwkJc3RydWN0IG1zZ19oZHIgKiBoZHI7CisJCXN0cnVjdCBmZF9jbnhfcmN2ZGF0YSByY3ZfZGF0YTsKKwkJc3RydWN0IGZkX21zZ19wbWRsICogcG1kbCA9IE5VTEw7CisJCQorCQlyY3ZfZGF0YS5idWZmZXIgPSBldl9kYXRhOworCQlyY3ZfZGF0YS5sZW5ndGggPSBldl9zejsKKwkJcG1kbCA9IGZkX21zZ19wbWRsX2dldF9pbmJ1ZihyY3ZfZGF0YS5idWZmZXIsIHJjdl9kYXRhLmxlbmd0aCk7CisJCQorCQkvKiBQYXJzZSB0aGUgcmVjZWl2ZWQgYnVmZmVyICovCisJCUNIRUNLX0ZDVF9ETyggZmRfbXNnX3BhcnNlX2J1ZmZlciggKHZvaWQgKikmZXZfZGF0YSwgZXZfc3osICZtc2cpLCAKKwkJCXsKKwkJCQlmZF9ob29rX2NhbGwoSE9PS19NRVNTQUdFX1BBUlNJTkdfRVJST1IsIE5VTEwsIHBlZXIsICZyY3ZfZGF0YSwgcG1kbCApOworCQkJCWZyZWUoZXZfZGF0YSk7CisJCQkJQ0hFQ0tfRkNUX0RPKCBmZF9ldmVudF9zZW5kKHBlZXItPnBfZXZlbnRzLCBGREVWUF9DTlhfRVJST1IsIDAsIE5VTEwpLCBnb3RvIHBzbV9yZXNldCApOworCQkJCWdvdG8gcHNtX2xvb3A7CisJCQl9ICk7CisJCQkKKwkJZmRfaG9va19hc3NvY2lhdGUobXNnLCBwbWRsKTsKKwkJQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfc291cmNlX3NldCggbXNnLCBwZWVyLT5wX2hkci5pbmZvLnBpX2RpYW1pZCwgcGVlci0+cF9oZHIuaW5mby5waV9kaWFtaWRsZW4pLCBnb3RvIHBzbV9lbmQpOworCQorCQkvKiBJZiB0aGUgY3VycmVudCBzdGF0ZSBkb2VzIG5vdCBhbGxvdyByZWNlaXZpbmcgbWVzc2FnZXMsIGp1c3QgZHJvcCBpdCAqLworCQlpZiAoY3VyX3N0YXRlID09IFNUQVRFX0NMT1NFRCkgeworCQkJLyogSW4gc3VjaCBjYXNlLCBqdXN0IGRpc2NhcmQgdGhlIG1lc3NhZ2UgKi8KKwkJCWZkX2hvb2tfY2FsbChIT09LX01FU1NBR0VfRFJPUFBFRCwgbXNnLCBwZWVyLCAiTWVzc2FnZSBwdXJnZWQgZnJvbSBxdWV1ZSwgcGVlciBpbiBDTE9TRUQgc3RhdGUiLCBmZF9tc2dfcG1kbF9nZXQobXNnKSk7CisJCQlmZF9tc2dfZnJlZShtc2cpOworCQkJZ290byBwc21fbG9vcDsKKwkJfQorCQkKKwkJLyogRXh0cmFjdCB0aGUgaGVhZGVyICovCisJCUNIRUNLX0ZDVF9ETyggZmRfbXNnX2hkcihtc2csICZoZHIpLCBnb3RvIHBzbV9lbmQgKTsKKwkJCisJCS8qIElmIGl0IGlzIGFuIGFuc3dlciwgYXNzb2NpYXRlIHdpdGggdGhlIHJlcXVlc3Qgb3IgZHJvcCAqLworCQlpZiAoIShoZHItPm1zZ19mbGFncyAmIENNRF9GTEFHX1JFUVVFU1QpKSB7CisJCQlzdHJ1Y3QgbXNnICogcmVxOworCQkJLyogU2VhcmNoIG1hdGNoaW5nIHJlcXVlc3QgKHNhbWUgaGJoaWQpICovCisJCQlDSEVDS19GQ1RfRE8oIGZkX3Bfc3JfZmV0Y2goJnBlZXItPnBfc3IsIGhkci0+bXNnX2hiaGlkLCAmcmVxKSwgZ290byBwc21fZW5kICk7CisJCQlpZiAocmVxID09IE5VTEwpIHsKKwkJCQlmZF9ob29rX2NhbGwoSE9PS19NRVNTQUdFX0RST1BQRUQsIG1zZywgcGVlciwgIkFuc3dlciByZWNlaXZlZCB3aXRoIG5vIGNvcnJlc3BvbmRpbmcgc2VudCByZXF1ZXN0LiIsIGZkX21zZ19wbWRsX2dldChtc2cpKTsKKwkJCQlmZF9tc2dfZnJlZShtc2cpOworCQkJCWdvdG8gcHNtX2xvb3A7CisJCQl9CisJCQkKKwkJCS8qIEFzc29jaWF0ZSAqLworCQkJQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfYW5zd19hc3NvY2lhdGUoIG1zZywgcmVxICksIGdvdG8gcHNtX2VuZCApOworCQkJCisJCX0KKwkJCisJCS8qIExvZyBpbmNvbWluZyBtZXNzYWdlICovCisJCWZkX2hvb2tfY2FsbChIT09LX01FU1NBR0VfUkVDRUlWRUQsIG1zZywgcGVlciwgTlVMTCwgZmRfbXNnX3BtZGxfZ2V0KG1zZykpOworCQkKKwkJaWYgKGN1cl9zdGF0ZSA9PSBTVEFURV9PUEVOX05FVykgeworCQkJLyogT0ssIHdlIGhhdmUgcmVjZWl2ZWQgc29tZXRoaW5nLCBzbyB0aGUgY29ubmVjdGlvbiBpcyBzdXBwb3NlZGx5IG5vdyBpbiBPUEVOIHN0YXRlIGF0IHRoZSByZW1vdGUgc2l0ZSAqLworCQkJZmRfcHNtX2NoYW5nZV9zdGF0ZShwZWVyLCBTVEFURV9PUEVOICk7CisJCX0KKwkJCisJCS8qIE5vdyBoYW5kbGUgbm9uLWxpbmstbG9jYWwgbWVzc2FnZXMgKi8KKwkJaWYgKGZkX21zZ19pc19yb3V0YWJsZShtc2cpKSB7CisJCQlzd2l0Y2ggKGN1cl9zdGF0ZSkgeworCQkJCS8qIFRvIG1heGltaXplIGNvbXBhdGliaWxpdHkgLS0gc2hvdWxkIG5vdCBiZSBhIHNlY3VyaXR5IGlzc3VlIGhlcmUgKi8KKwkJCQljYXNlIFNUQVRFX1JFT1BFTjoKKwkJCQljYXNlIFNUQVRFX1NVU1BFQ1Q6CisJCQkJY2FzZSBTVEFURV9DTE9TSU5HOgorCQkJCWNhc2UgU1RBVEVfQ0xPU0lOR19HUkFDRToKKwkJCQkJVFJBQ0VfREVCVUcoRlVMTCwgIkFjY2VwdGVkIGEgbWVzc2FnZSB3aGlsZSBub3QgaW4gT1BFTiBzdGF0ZS4uLiAiKTsKKwkJCQkvKiBUaGUgc3RhbmRhcmQgc2l0dWF0aW9uIDogKi8KKwkJCQljYXNlIFNUQVRFX09QRU5fTkVXOgorCQkJCWNhc2UgU1RBVEVfT1BFTjoKKwkJCQkJLyogV2UgcmVjZWl2ZWQgYSB2YWxpZCByb3V0YWJsZSBtZXNzYWdlLCB1cGRhdGUgdGhlIGV4cGlyeSB0aW1lciAqLworCQkJCQlDSEVDS19GQ1RfRE8oIGZkX3BfZXhwaV91cGRhdGUocGVlciksIGdvdG8gcHNtX2VuZCApOworCisJCQkJCS8qIFNldCB0aGUgbWVzc2FnZSBzb3VyY2UgYW5kIGFkZCB0aGUgUm91dGUtUmVjb3JkICovCisJCQkJCUNIRUNLX0ZDVF9ETyggZmRfbXNnX3NvdXJjZV9zZXRyciggbXNnLCBwZWVyLT5wX2hkci5pbmZvLnBpX2RpYW1pZCwgcGVlci0+cF9oZHIuaW5mby5waV9kaWFtaWRsZW4sIGZkX2dfY29uZmlnLT5jbmZfZGljdCApLCBnb3RvIHBzbV9lbmQpOworCisJCQkJCWlmICgoaGRyLT5tc2dfZmxhZ3MgJiBDTURfRkxBR19SRVFVRVNUKSkgeworCQkJCQkJLyogTWFyayB0aGUgaW5jb21pbmcgcmVxdWVzdCBzbyB0aGF0IHdlIGtub3cgd2UgaGF2ZSBwZW5kaW5nIGFuc3dlcnMgZm9yIHRoaXMgcGVlciAqLworCQkJCQkJQ0hFQ0tfUE9TSVhfRE8oIHB0aHJlYWRfbXV0ZXhfbG9jaygmcGVlci0+cF9zdGF0ZV9tdHgpLCBnb3RvIHBzbV9lbmQgICk7CisJCQkJCQlwZWVyLT5wX3JlcWluX2NvdW50Kys7CisJCQkJCQlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9tdXRleF91bmxvY2soJnBlZXItPnBfc3RhdGVfbXR4KSwgZ290byBwc21fZW5kICApOworCQkJCQl9CisJCQkJCQkKKwkJCQkJLyogUmVxdWV1ZSB0byB0aGUgZ2xvYmFsIGluY29taW5nIHF1ZXVlICovCisJCQkJCUNIRUNLX0ZDVF9ETyhmZF9maWZvX3Bvc3QoZmRfZ19pbmNvbWluZywgJm1zZyksIGdvdG8gcHNtX2VuZCApOworCisJCQkJCS8qIFVwZGF0ZSB0aGUgcGVlciB0aW1lciAob25seSBpbiBPUEVOIHN0YXRlKSAqLworCQkJCQlpZiAoKGN1cl9zdGF0ZSA9PSBTVEFURV9PUEVOKSAmJiAoIXBlZXItPnBfZmxhZ3MucGZfZHdfcGVuZGluZykpIHsKKwkJCQkJCWZkX3BzbV9uZXh0X3RpbWVvdXQocGVlciwgMSwgcGVlci0+cF9oZHIuaW5mby5jb25maWcucGljX3R3dGltZXIgPzogZmRfZ19jb25maWctPmNuZl90aW1lcl90dyk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJCQorCQkJCS8qIEluIG90aGVyIHN0YXRlcywgd2UgZGlzY2FyZCB0aGUgbWVzc2FnZSwgaXQgaXMgZWl0aGVyIG9sZCBvciBpbnZhbGlkIHRvIHNlbmQgaXQgZm9yIHRoZSByZW1vdGUgcGVlciAqLworCQkJCWNhc2UgU1RBVEVfV0FJVENOWEFDSzoKKwkJCQljYXNlIFNUQVRFX1dBSVRDTlhBQ0tfRUxFQzoKKwkJCQljYXNlIFNUQVRFX1dBSVRDRUE6CisJCQkJY2FzZSBTVEFURV9DTE9TRUQ6CisJCQkJZGVmYXVsdDogeworCQkJCQkvKiBJbiBzdWNoIGNhc2UsIGp1c3QgZGlzY2FyZCB0aGUgbWVzc2FnZSAqLworCQkJCQljaGFyIGJ1ZlsxMjhdOworCQkJCQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiUmVjZWl2ZWQgd2hpbGUgcGVlciBzdGF0ZSBtYWNoaW5lIHdhcyBpbiBzdGF0ZSAlcy4iLCBTVEFURV9TVFIoY3VyX3N0YXRlKSk7CisJCQkJCWZkX2hvb2tfY2FsbChIT09LX01FU1NBR0VfRFJPUFBFRCwgbXNnLCBwZWVyLCBidWYsIGZkX21zZ19wbWRsX2dldChtc2cpKTsKKwkJCQkJZmRfbXNnX2ZyZWUobXNnKTsKKwkJCQl9CisJCQl9CisJCQlnb3RvIHBzbV9sb29wOworCQl9CisJCQorCQkvKiBMaW5rLWxvY2FsIG1lc3NhZ2U6IFRoZXkgbXVzdCBiZSB1bmRlcnN0b29kIGJ5IG91ciBkaWN0aW9uYXJ5LCBvdGhlcndpc2Ugd2UgcmV0dXJuIGFuIGVycm9yICovCisJCXsKKwkJCXN0cnVjdCBtc2cgKiBlcnJvciA9IE5VTEw7CisJCQlpbnQgcmV0ID0gZmRfbXNnX3BhcnNlX29yX2Vycm9yKCAmbXNnLCAmZXJyb3IgKTsKKwkJCWlmIChyZXQgIT0gRUJBRE1TRykgeworCQkJCUNIRUNLX0ZDVF9ETyggcmV0LCAKKwkJCQkJeworCQkJCQkJY2hhciBidWZbMjU2XTsKKwkJCQkJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlczogQW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZCB3aGlsZSBwYXJzaW5nIGEgbGluay1sb2NhbCBtZXNzYWdlIiwgcGVlci0+cF9oZHIuaW5mby5waV9kaWFtaWQpOyAKKwkJCQkJCWZkX2hvb2tfY2FsbChIT09LX01FU1NBR0VfRFJPUFBFRCwgbXNnLCBwZWVyLCBidWYsIGZkX21zZ19wbWRsX2dldChtc2cpKTsKKwkJCQkJCWZkX21zZ19mcmVlKG1zZyk7IAorCQkJCQkJZ290byBwc21fZW5kOyAKKwkJCQkJfSApOworCQkJfSBlbHNlIHsKKwkJCQlpZiAobXNnID09IE5VTEwpIHsKKwkJCQkJLyogU2VuZCB0aGUgZXJyb3IgYmFjayB0byB0aGUgcGVlciAqLworCQkJCQlDSEVDS19GQ1RfRE8oIHJldCA9IGZkX291dF9zZW5kKCZlcnJvciwgTlVMTCwgcGVlciwgMCksICApOworCQkJCQlpZiAoZXJyb3IpIHsKKwkJCQkJCWNoYXIgYnVmWzI1Nl07CisJCQkJCQkvKiBPbmx5IGlmIGFuIGVycm9yIG9jY3VycmVkICYgdGhlIG1lc3NhZ2Ugd2FzIG5vdCBzYXZlZCAvIGR1bXBlZCAqLworCQkJCQkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVzOiBlcnJvciBzZW5kaW5nIGEgbWVzc2FnZSIsIHBlZXItPnBfaGRyLmluZm8ucGlfZGlhbWlkKTsgCisJCQkJCQlmZF9ob29rX2NhbGwoSE9PS19NRVNTQUdFX0RST1BQRUQsIGVycm9yLCBwZWVyLCBidWYsIGZkX21zZ19wbWRsX2dldChlcnJvcikpOworCQkJCQkJQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfZnJlZShlcnJvciksIGdvdG8gcHNtX2VuZCk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQljaGFyIGJ1ZlsyNTZdOworCQkJCQkvKiBXZSByZWNlaXZlZCBhbiBpbnZhbGlkIGFuc3dlciwgbGV0J3MgZGlzY29ubmVjdCAqLworCQkJCQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXM6IFJlY2VpdmVkIGludmFsaWQgYW5zd2VyIHRvIEJhc2UgcHJvdG9jb2wgbWVzc2FnZSwgZGlzY29ubmVjdGluZy4uLiIsIHBlZXItPnBfaGRyLmluZm8ucGlfZGlhbWlkKTsKKwkJCQkJZmRfaG9va19jYWxsKEhPT0tfTUVTU0FHRV9EUk9QUEVELCBtc2csIHBlZXIsIGJ1ZiwgZmRfbXNnX3BtZGxfZ2V0KG1zZykpOworCQkJCQlDSEVDS19GQ1RfRE8oIGZkX21zZ19mcmVlKG1zZyksIGdvdG8gcHNtX2VuZCk7CisJCQkJCUNIRUNLX0ZDVF9ETyggZmRfZXZlbnRfc2VuZChwZWVyLT5wX2V2ZW50cywgRkRFVlBfQ05YX0VSUk9SLCAwLCBOVUxMKSwgZ290byBwc21fcmVzZXQgKTsKKwkJCQl9CisJCQkJZ290byBwc21fbG9vcDsKKwkJCX0KKwkJfQorCQkKKwkJLyogSGFuZGxlIHRoZSBMTCBtZXNzYWdlIGFuZCB1cGRhdGUgdGhlIGV4cGlyeSB0aW1lciBhcHByb3ByaWF0ZWx5ICovCisJCXN3aXRjaCAoaGRyLT5tc2dfY29kZSkgeworCQkJY2FzZSBDQ19DQVBBQklMSVRJRVNfRVhDSEFOR0U6CisJCQkJQ0hFQ0tfRkNUX0RPKCBmZF9wX2NlX21zZ3JjdigmbXNnLCAoaGRyLT5tc2dfZmxhZ3MgJiBDTURfRkxBR19SRVFVRVNUKSwgcGVlciksIAorCQkJCQl7CisJCQkJCQlpZiAobXNnKQorCQkJCQkJCUNIRUNLX0ZDVF9ETyggZmRfbXNnX2ZyZWUobXNnKSwgKTsKKwkJCQkJCWdvdG8gcHNtX3Jlc2V0OworCQkJCQl9ICk7CisJCQkJYnJlYWs7CisJCQkKKwkJCWNhc2UgQ0NfRElTQ09OTkVDVF9QRUVSOgorCQkJCUNIRUNLX0ZDVF9ETyggZmRfcF9kcF9oYW5kbGUoJm1zZywgKGhkci0+bXNnX2ZsYWdzICYgQ01EX0ZMQUdfUkVRVUVTVCksIHBlZXIpLCBnb3RvIHBzbV9yZXNldCApOworCQkJCWlmIChmZF9wZWVyX2dldHN0YXRlKHBlZXIpID09IFNUQVRFX0NMT1NJTkcpCisJCQkJCWdvdG8gcHNtX2VuZDsKKworCQkJCWJyZWFrOworCQkJCisJCQljYXNlIENDX0RFVklDRV9XQVRDSERPRzoKKwkJCQlDSEVDS19GQ1RfRE8oIGZkX3BfZHdfaGFuZGxlKCZtc2csIChoZHItPm1zZ19mbGFncyAmIENNRF9GTEFHX1JFUVVFU1QpLCBwZWVyKSwgZ290byBwc21fcmVzZXQgKTsKKwkJCQlicmVhazsKKwkJCQorCQkJZGVmYXVsdDoKKwkJCQkvKiBVbmtub3duIC8gdW5leHBlY3RlZCAvIGludmFsaWQgbWVzc2FnZSAtLSBidXQgdmFsaWRhdGVkIGJ5IG91ciBkaWN0aW9uYXJ5ICovCisJCQkJVFJBQ0VfREVCVUcoSU5GTywgIkludmFsaWQgbm9uLXJvdXRhYmxlIGNvbW1hbmQgcmVjZWl2ZWQ6ICV1LiIsIGhkci0+bXNnX2NvZGUpOworCQkJCWlmIChoZHItPm1zZ19mbGFncyAmIENNRF9GTEFHX1JFUVVFU1QpIHsKKwkJCQkJZG8geworCQkJCQkJLyogUmVwbHkgd2l0aCBhbiBlcnJvciBjb2RlICovCisJCQkJCQlDSEVDS19GQ1RfRE8oIGZkX21zZ19uZXdfYW5zd2VyX2Zyb21fcmVxICggZmRfZ19jb25maWctPmNuZl9kaWN0LCAmbXNnLCBNU0dGTF9BTlNXX0VSUk9SICksIGJyZWFrICk7CisKKwkJCQkJCS8qIFNldCB0aGUgZXJyb3IgY29kZSAqLworCQkJCQkJQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfcmVzY29kZV9zZXQobXNnLCAiRElBTUVURVJfQ09NTUFORF9VTlNVUFBPUlRFRCIsICJPciBtYXliZSB0aGUgUC1iaXQgb3IgYXBwbGljYXRpb24gSWQgYXJlIGVycm9uZW91cy4iLCBOVUxMLCAxICksIGJyZWFrICk7CisKKwkJCQkJCS8qIFNlbmQgdGhlIGFuc3dlciAqLworCQkJCQkJQ0hFQ0tfRkNUX0RPKCBmZF9vdXRfc2VuZCgmbXNnLCBwZWVyLT5wX2NueGN0eCwgcGVlciwgMCksIGJyZWFrICk7CisJCQkJCX0gd2hpbGUgKDApOworCQkJCX0gZWxzZSB7CisJCQkJCS8qIFdlIGRpZCBBU0sgZm9yIGl0ID8/PyAqLworCQkJCQlUUkFDRV9ERUJVRyhJTkZPLCAiUmVjZWl2ZWQgYW5zd2VyIHdpdGggZXJyb25lb3VzICdpc19yb3V0YWJsZScgcmVzdWx0Li4uIik7CisJCQkJfQorCQkJCQorCQkJCS8qIENsZWFudXAgdGhlIG1lc3NhZ2UgaWYgbm90IGRvbmUgKi8KKwkJCQlpZiAobXNnKSB7CisJCQkJCWNoYXIgYnVmWzI1Nl07CisJCQkJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJSZWNlaXZlZCB1bi1oYW5kbGVkIG5vbi1yb3V0YWJsZSBjb21tYW5kIGZyb20gcGVlciAnJXMnLiIsIHBlZXItPnBfaGRyLmluZm8ucGlfZGlhbWlkKTsKKwkJCQkJZmRfaG9va19jYWxsKEhPT0tfTUVTU0FHRV9EUk9QUEVELCBtc2csIE5VTEwsIGJ1ZiwgZmRfbXNnX3BtZGxfZ2V0KG1zZykpOworCQkJCQlDSEVDS19GQ1RfRE8oIGZkX21zZ19mcmVlKG1zZyksIC8qIGNvbnRpbnVlICovKTsKKwkJCQkJbXNnID0gTlVMTDsKKwkJCQl9CisJCX07CisJCQorCQkvKiBBdCB0aGlzIHBvaW50IHRoZSBtZXNzYWdlIG11c3QgaGF2ZSBiZWVuIGZ1bGx5IGhhbmRsZWQgYWxyZWFkeSAqLworCQlpZiAobXNnKSB7CisJCQljaGFyIGJ1ZlsyNTZdOworCQkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIkludGVybmFsIGVycm9yICgnJXMnKTogdW5oYW5kbGVkIG1lc3NhZ2UuIiwgcGVlci0+cF9oZHIuaW5mby5waV9kaWFtaWQpOworCQkJZmRfaG9va19jYWxsKEhPT0tfTUVTU0FHRV9EUk9QUEVELCBtc2csIE5VTEwsIGJ1ZiwgZmRfbXNnX3BtZGxfZ2V0KG1zZykpOworCQkJZmRfbXNnX2ZyZWUobXNnKTsKKwkJfQorCQkKKwkJZ290byBwc21fbG9vcDsKKwl9CisJCisJLyogVGhlIGNvbm5lY3Rpb24gb2JqZWN0IGlzIGJyb2tlbiAqLworCWlmIChldmVudCA9PSBGREVWUF9DTlhfRVJST1IpIHsKKwkJc3dpdGNoIChjdXJfc3RhdGUpIHsKKwkJCWNhc2UgU1RBVEVfV0FJVENOWEFDS19FTEVDOgorCQkJCS8qIEFib3J0IHRoZSBpbml0aWF0aW5nIHNpZGUgKi8KKwkJCQlmZF9wX2NueF9hYm9ydChwZWVyLCAwKTsKKwkJCQkvKiBQcm9jZXNzIHRoZSByZWNlaXZlciBzaWRlICovCisJCQkJQ0hFQ0tfRkNUX0RPKCBmZF9wX2NlX3Byb2Nlc3NfcmVjZWl2ZXIocGVlciksIGdvdG8gcHNtX2VuZCApOworCQkJCWJyZWFrOworCQkJCisJCQljYXNlIFNUQVRFX1dBSVRDRUE6CisJCQljYXNlIFNUQVRFX09QRU46CisJCQljYXNlIFNUQVRFX09QRU5fTkVXOgorCQkJY2FzZSBTVEFURV9SRU9QRU46CisJCQljYXNlIFNUQVRFX1dBSVRDTlhBQ0s6CisJCQljYXNlIFNUQVRFX1NVU1BFQ1Q6CisJCQlkZWZhdWx0OgorCQkJCS8qIE1hcmsgdGhlIGNvbm5lY3Rpb24gcHJvYmxlbSAqLworCQkJCXBlZXItPnBfZmxhZ3MucGZfY254X3BiID0gMTsKKwkJCQorCQkJCWZkX2hvb2tfY2FsbChIT09LX1BFRVJfQ09OTkVDVF9GQUlMRUQsIE5VTEwsIHBlZXIsICJUaGUgY29ubmVjdGlvbiB3YXMgYnJva2VuIiwgTlVMTCk7CisJCQkJCisJCQkJLyogRGVzdHJveSB0aGUgY29ubmVjdGlvbiwgcmVzdGFydCB0aGUgdGltZXIgdG8gYSBuZXcgY29ubmVjdGlvbiBhdHRlbXB0ICovCisJCQkJZmRfcHNtX25leHRfdGltZW91dChwZWVyLCAxLCBwZWVyLT5wX2hkci5pbmZvLmNvbmZpZy5waWNfdGN0aW1lciA/OiBmZF9nX2NvbmZpZy0+Y25mX3RpbWVyX3RjKTsKKwkJCQkKKwkJCWNhc2UgU1RBVEVfQ0xPU0VEOgorCQkJCWdvdG8gcHNtX3Jlc2V0OworCQkJCQorCQkJY2FzZSBTVEFURV9DTE9TSU5HOgorCQkJCS8qIFdlIHNlbnQgYSBEUFIgc28gd2UgYXJlIHRlcm1pbmF0aW5nLCBkbyBub3Qgd2FpdCBmb3IgRFBBICovCisJCQkJZ290byBwc21fZW5kOworCQkJCQorCQkJY2FzZSBTVEFURV9DTE9TSU5HX0dSQUNFOgorCQkJCWlmIChwZWVyLT5wX2ZsYWdzLnBmX2xvY2FsdGVybSkgLyogaW5pdGlhdGVkIGhlcmUgKi8KKwkJCQkJZ290byBwc21fZW5kOworCQkJCQorCQkJCWZkX3BzbV9jbGVhbnVwKHBlZXIsIDApOworCQkJCQorCQkJCS8qIFJlc2V0IHRoZSB0aW1lciBmb3IgbmV4dCBjb25uZWN0aW9uIGF0dGVtcHQgKi8KKwkJCQlmZF9wc21fbmV4dF90aW1lb3V0KHBlZXIsIDEsIGZkX3BfZHBfbmV3ZGVsYXkocGVlcikpOworCQkJCWdvdG8gcHNtX2xvb3A7CisJCX0KKwkJZ290byBwc21fbG9vcDsKKwl9CisJCisJLyogVGhlIGNvbm5lY3Rpb24gbm90aWZpZWQgYSBjaGFuZ2UgaW4gZW5kcG9pbnRzICovCisJaWYgKGV2ZW50ID09IEZERVZQX0NOWF9FUF9DSEFOR0UpIHsKKwkJLyogV2UgYWN0dWFsbHkgZG9uJ3QgY2FyZSBpZiB3ZSBhcmUgaW4gT1BFTiBzdGF0ZSBoZXJlLi4uICovCisJCQorCQkvKiBDbGVhbnVwIHRoZSByZW1vdGUgTEwgYW5kIHByaW1hcnkgYWRkcmVzc2VzICovCisJCUNIRUNLX0ZDVF9ETyggZmRfZXBfZmlsdGVyKCAmcGVlci0+cF9oZHIuaW5mby5waV9lbmRwb2ludHMsIEVQX0ZMX0NPTkYgfCBFUF9GTF9ESVNDIHwgRVBfRkxfQURWICksIC8qIGlnbm9yZSB0aGUgZXJyb3IgKi8pOworCQlDSEVDS19GQ1RfRE8oIGZkX2VwX2NsZWFyZmxhZ3MoICZwZWVyLT5wX2hkci5pbmZvLnBpX2VuZHBvaW50cywgRVBfRkxfUFJJTUFSWSApLCAvKiBpZ25vcmUgdGhlIGVycm9yICovKTsKKwkJCisJCS8qIEdldCB0aGUgbmV3IG9uZXMgKi8KKwkJQ0hFQ0tfRkNUX0RPKCBmZF9jbnhfZ2V0cmVtb3RlZXBzKHBlZXItPnBfY254Y3R4LCAmcGVlci0+cF9oZHIuaW5mby5waV9lbmRwb2ludHMpLCAvKiBpZ25vcmUgdGhlIGVycm9yICovKTsKKwkJCisJCS8qIFdlIGRvIG5vdCBzdXBwb3J0IGxvY2FsIGVuZHBvaW50cyBjaGFuZ2UgY3VycmVudGx5LCBidXQgaXQgY291bGQgYmUgYWRkZWQgaGVyZSBpZiBuZWVkZWQgKHJlZnJlc2ggZmRfZ19jb25maWctPmNuZl9lbmRwb2ludHMpICovCisJCXsKKwkJCWNoYXIgKiBidWYgPSBOVUxMOworCQkJc2l6ZV90IGxlbiA9IDA7CisJCQlMT0dfRCgiR290IGxvdyBsYXllciBub3RpZmljYXRpb24gKElHTk9SRUQpOiByZW1vdGUgZW5kcG9pbnQocykgY2hhbmdlZDogJXMiLCAgZmRfZXBfZHVtcCgmYnVmLCAmbGVuLCBOVUxMLCAwLCAwLCAmcGVlci0+cF9oZHIuaW5mby5waV9lbmRwb2ludHMpID86ICJlcnJvciIpOworCQkJZnJlZShidWYpOworCQl9CisJCQorCQkvKiBEb25lICovCisJCWdvdG8gcHNtX2xvb3A7CisJfQorCQorCS8qIEEgbmV3IGNvbm5lY3Rpb24gd2FzIGVzdGFibGlzaGVkIGFuZCBDRVIgY29udGFpbmluZyB0aGlzIHBlZXIgaWQgd2FzIHJlY2VpdmVkICovCisJaWYgKGV2ZW50ID09IEZERVZQX0NOWF9JTkNPTUlORykgeworCQlzdHJ1Y3QgY254X2luY29taW5nICogcGFyYW1zID0gZXZfZGF0YTsKKwkJQVNTRVJUKHBhcmFtcyk7CisJCQorCQkvKiBIYW5kbGUgdGhlIG1lc3NhZ2UgKi8KKwkJQ0hFQ0tfRkNUX0RPKCBmZF9wX2NlX2hhbmRsZV9uZXdDRVIoJnBhcmFtcy0+Y2VyLCBwZWVyLCAmcGFyYW1zLT5jbngsIHBhcmFtcy0+dmFsaWRhdGUpLCBnb3RvIHBzbV9lbmQgKTsKKwkJCisJCS8qIENsZWFudXAgaWYgbmVlZGVkICovCisJCWlmIChwYXJhbXMtPmNueCkgeworCQkJZmRfY254X2Rlc3Ryb3kocGFyYW1zLT5jbngpOworCQkJcGFyYW1zLT5jbnggPSBOVUxMOworCQl9CisJCWlmIChwYXJhbXMtPmNlcikgeworCQkJQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfZnJlZShwYXJhbXMtPmNlciksICk7CisJCQlwYXJhbXMtPmNlciA9IE5VTEw7CisJCX0KKwkJCisJCS8qIExvb3AgKi8KKwkJZnJlZShldl9kYXRhKTsKKwkJZ290byBwc21fbG9vcDsKKwl9CisJCisJLyogQSBuZXcgY29ubmVjdGlvbiBoYXMgYmVlbiBlc3RhYmxpc2hlZCB3aXRoIHRoZSByZW1vdGUgcGVlciAqLworCWlmIChldmVudCA9PSBGREVWUF9DTlhfRVNUQUJMSVNIRUQpIHsKKwkJc3RydWN0IGNueGN0eCAqIGNueCA9IGV2X2RhdGE7CisJCQorCQkvKiBSZWxlYXNlIHRoZSByZXNvdXJjZXMgb2YgdGhlIGNvbm5lY3RpbmcgdGhyZWFkICovCisJCUNIRUNLX1BPU0lYX0RPKCBwdGhyZWFkX2pvaW4oIHBlZXItPnBfaW5pX3RociwgTlVMTCksIC8qIGlnbm9yZSwgaXQgaXMgbm90IGEgYmlnIGRlYWwgKi8pOworCQlwZWVyLT5wX2luaV90aHIgPSAocHRocmVhZF90KU5VTEw7CisJCQorCQlzd2l0Y2ggKGN1cl9zdGF0ZSkgeworCQkJY2FzZSBTVEFURV9XQUlUQ05YQUNLX0VMRUM6CisJCQljYXNlIFNUQVRFX1dBSVRDTlhBQ0s6CisJCQkJTE9HX0QoIiVzOiBDb25uZWN0aW9uIGVzdGFibGlzaGVkLCAlcyIsIHBlZXItPnBfaGRyLmluZm8ucGlfZGlhbWlkLCBmZF9jbnhfZ2V0aWQoY254KSk7CisJCQkJZmRfcF9jZV9oYW5kbGVfbmV3Y254KHBlZXIsIGNueCk7CisJCQkJYnJlYWs7CisJCQkJCisJCQlkZWZhdWx0OgorCQkJCS8qIEp1c3QgYWJvcnQgdGhlIGF0dGVtcHQgYW5kIGNvbnRpbnVlICovCisJCQkJVFJBQ0VfREVCVUcoRlVMTCwgIkNvbm5lY3Rpb24gYXR0ZW1wdCBzdWNjZXNzZnVsIGJ1dCBjdXJyZW50IHN0YXRlIGlzICVzLCBjbG9zaW5nLi4uICh0b28gc2xvdz8pIiwgU1RBVEVfU1RSKGN1cl9zdGF0ZSkpOworCQkJCWZkX2NueF9kZXN0cm95KGNueCk7CisJCX0KKwkJCisJCWdvdG8gcHNtX2xvb3A7CisJfQorCQorCS8qIEEgbmV3IGNvbm5lY3Rpb24gaGFzIG5vdCBiZWVuIGVzdGFibGlzaGVkIHdpdGggdGhlIHJlbW90ZSBwZWVyICovCisJaWYgKGV2ZW50ID09IEZERVZQX0NOWF9GQUlMRUQpIHsKKwkJCisJCS8qIFJlbGVhc2UgdGhlIHJlc291cmNlcyBvZiB0aGUgY29ubmVjdGluZyB0aHJlYWQgKi8KKwkJQ0hFQ0tfUE9TSVhfRE8oIHB0aHJlYWRfam9pbiggcGVlci0+cF9pbmlfdGhyLCBOVUxMKSwgLyogaWdub3JlLCBpdCBpcyBub3QgYSBiaWcgZGVhbCAqLyk7CisJCXBlZXItPnBfaW5pX3RociA9IChwdGhyZWFkX3QpTlVMTDsKKwkJCisJCXN3aXRjaCAoY3VyX3N0YXRlKSB7CisJCQljYXNlIFNUQVRFX1dBSVRDTlhBQ0tfRUxFQzoKKwkJCQkvKiBBYm9ydCB0aGUgaW5pdGlhdGluZyBzaWRlICovCisJCQkJZmRfcF9jbnhfYWJvcnQocGVlciwgMCk7CisJCQkJLyogUHJvY2VzcyB0aGUgcmVjZWl2ZXIgc2lkZSAqLworCQkJCUNIRUNLX0ZDVF9ETyggZmRfcF9jZV9wcm9jZXNzX3JlY2VpdmVyKHBlZXIpLCBnb3RvIHBzbV9lbmQgKTsKKwkJCQlicmVhazsKKwkJCQkKKwkJCWNhc2UgU1RBVEVfV0FJVENOWEFDSzoKKwkJCQkvKiBHbyBiYWNrIHRvIENMT1NFICovCisJCQkJZmRfcHNtX25leHRfdGltZW91dChwZWVyLCAxLCBwZWVyLT5wX2hkci5pbmZvLmNvbmZpZy5waWNfdGN0aW1lciA/OiBmZF9nX2NvbmZpZy0+Y25mX3RpbWVyX3RjKTsKKwkJCQlnb3RvIHBzbV9yZXNldDsKKwkJCQkKKwkJCWRlZmF1bHQ6CisJCQkJLyogSnVzdCBpZ25vcmUgKi8KKwkJCQlUUkFDRV9ERUJVRyhGVUxMLCAiQ29ubmVjdGlvbiBhdHRlbXB0IGZhaWxlZCBidXQgY3VycmVudCBzdGF0ZSBpcyAlcywgaWdub3JpbmcuLi4iLCBTVEFURV9TVFIoY3VyX3N0YXRlKSk7CisJCX0KKwkJCisJCWdvdG8gcHNtX2xvb3A7CisJfQorCQorCS8qIFRoZSB0aW1lb3V0IGZvciB0aGUgY3VycmVudCBzdGF0ZSBoYXMgYmVlbiByZWFjaGVkICovCisJaWYgKGV2ZW50ID09IEZERVZQX1BTTV9USU1FT1VUKSB7CisJCXN3aXRjaCAoY3VyX3N0YXRlKSB7CisJCQljYXNlIFNUQVRFX09QRU46CisJCQljYXNlIFNUQVRFX1JFT1BFTjoKKwkJCWNhc2UgU1RBVEVfT1BFTl9ORVc6CisJCQkJQ0hFQ0tfRkNUX0RPKCBmZF9wX2R3X3RpbWVvdXQocGVlciksIGdvdG8gcHNtX2VuZCApOworCQkJCWdvdG8gcHNtX2xvb3A7CisJCQkJCisJCQljYXNlIFNUQVRFX0NMT1NFRDoKKwkJCQlMT0dfRCgiJXM6IENvbm5lY3RpbmcuLi4iLCBwZWVyLT5wX2hkci5pbmZvLnBpX2RpYW1pZCk7CisJCQkJQ0hFQ0tfRkNUX0RPKCBmZF9wc21fY2hhbmdlX3N0YXRlKHBlZXIsIFNUQVRFX1dBSVRDTlhBQ0spLCBnb3RvIHBzbV9lbmQgKTsKKwkJCQlmZF9wc21fbmV4dF90aW1lb3V0KHBlZXIsIDAsIENOWF9USU1FT1VUKTsKKwkJCQlDSEVDS19GQ1RfRE8oIGZkX3BfY254X2luaXQocGVlciksIGdvdG8gcHNtX2VuZCApOworCQkJCWdvdG8gcHNtX2xvb3A7CisJCQkJCisJCQljYXNlIFNUQVRFX1NVU1BFQ1Q6CisJCQkJLyogTWFyayB0aGUgY29ubmVjdGlvbiBwcm9ibGVtICovCisJCQkJcGVlci0+cF9mbGFncy5wZl9jbnhfcGIgPSAxOworCQkJY2FzZSBTVEFURV9XQUlUQ05YQUNLOgorCQkJY2FzZSBTVEFURV9XQUlUQ0VBOgorCQkJCWZkX2hvb2tfY2FsbChIT09LX1BFRVJfQ09OTkVDVF9GQUlMRUQsIE5VTEwsIHBlZXIsICJUaW1lb3V0IHdoaWxlIHdhaXRpbmcgZm9yIHJlbW90ZSBwZWVyIiwgTlVMTCk7CisJCQljYXNlIFNUQVRFX0NMT1NJTkc6CisJCQkJLyogRGVzdHJveSB0aGUgY29ubmVjdGlvbiwgcmVzdGFydCB0aGUgdGltZXIgdG8gYSBuZXcgY29ubmVjdGlvbiBhdHRlbXB0ICovCisJCQkJZmRfcHNtX25leHRfdGltZW91dChwZWVyLCAxLCBwZWVyLT5wX2hkci5pbmZvLmNvbmZpZy5waWNfdGN0aW1lciA/OiBmZF9nX2NvbmZpZy0+Y25mX3RpbWVyX3RjKTsKKwkJCQlnb3RvIHBzbV9yZXNldDsKKwkJCQkKKwkJCWNhc2UgU1RBVEVfQ0xPU0lOR19HUkFDRToKKwkJCQkvKiBUaGUgZ3JhY2UgcGVyaW9kIGlzIGNvbXBsZXRlZCwgbm93IGNsb3NlICovCisJCQkJaWYgKHBlZXItPnBfZmxhZ3MucGZfbG9jYWx0ZXJtKQorCQkJCQlnb3RvIHBzbV9lbmQ7CisJCQkJCisJCQkJZmRfcHNtX2NsZWFudXAocGVlciwgMCk7CisJCQkJLyogUmVzZXQgdGhlIHRpbWVyIGZvciBuZXh0IGNvbm5lY3Rpb24gYXR0ZW1wdCAqLworCQkJCWZkX3BzbV9uZXh0X3RpbWVvdXQocGVlciwgMSwgZmRfcF9kcF9uZXdkZWxheShwZWVyKSk7CisJCQkJZ290byBwc21fbG9vcDsKKwkJCQkKKwkJCWNhc2UgU1RBVEVfV0FJVENOWEFDS19FTEVDOgorCQkJCS8qIEFib3J0IHRoZSBpbml0aWF0aW5nIHNpZGUgKi8KKwkJCQlmZF9wX2NueF9hYm9ydChwZWVyLCAwKTsKKwkJCQkvKiBQcm9jZXNzIHRoZSByZWNlaXZlciBzaWRlICovCisJCQkJQ0hFQ0tfRkNUX0RPKCBmZF9wX2NlX3Byb2Nlc3NfcmVjZWl2ZXIocGVlciksIGdvdG8gcHNtX2VuZCApOworCQkJCWdvdG8gcHNtX2xvb3A7CisJCQkKKwkJCWRlZmF1bHQ6CisJCQkJQVNTRVJUKDApOyAvKiBpbXBsZW1lbnRhdGlvbiBwcm9ibGVtLCB3ZSBkaWQgbm90IGZvcmVzZWUgdGhpcyBjYXNlPyAqLworCQl9CisJfQorCQorCS8qIERlZmF1bHQgYWN0aW9uIDogdGhlIGhhbmRsaW5nIGhhcyBub3QgeWV0IGJlZW4gaW1wbGVtZW50ZWQuIFtmb3IgZGVidWcgb25seV0gKi8KKwlUUkFDRV9ERUJVRyhJTkZPLCAiTWlzc2luZyBoYW5kbGVyIGluIFBTTSBmb3IgJyVzJ1x0PC0tICclcyciLCBTVEFURV9TVFIoY3VyX3N0YXRlKSwgZmRfcGV2X3N0cihldmVudCkpOworcHNtX3Jlc2V0OgorCWlmIChwZWVyLT5wX2ZsYWdzLnBmX2RlbGV0ZSkKKwkJZ290byBwc21fZW5kOworCWZkX3BzbV9jbGVhbnVwKHBlZXIsIDApOworCWdvdG8gcHNtX2xvb3A7CisJCitwc21fZW5kOgorCUxPR19FKCIlczogR29pbmcgdG8gWk9NQklFIHN0YXRlIChubyBtb3JlIGFjdGl2aXR5KSIsIHBlZXItPnBfaGRyLmluZm8ucGlfZGlhbWlkKTsKKwlmZF9wc21fY2xlYW51cChwZWVyLCAxKTsKKwlUUkFDRV9ERUJVRyhJTkZPLCAiJyVzJ1x0LT4gJ1NUQVRFX1pPTUJJRScgKHRlcm1pbmF0ZWQpXHQnJXMnIiwKKwkJCVNUQVRFX1NUUihmZF9wZWVyX2dldHN0YXRlKHBlZXIpKSwKKwkJCXBlZXItPnBfaGRyLmluZm8ucGlfZGlhbWlkKTsKKwlwdGhyZWFkX2NsZWFudXBfcG9wKDEpOyAvKiBzZXQgU1RBVEVfWk9NQklFICovCisJcGVlci0+cF9wc20gPSAocHRocmVhZF90KU5VTEw7CisJcHRocmVhZF9kZXRhY2gocHRocmVhZF9zZWxmKCkpOworCXJldHVybiBOVUxMOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbnMgdG8gY29udHJvbCB0aGUgUFNNICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIENyZWF0ZSB0aGUgUFNNIHRocmVhZCBvZiBvbmUgcGVlciBzdHJ1Y3R1cmUgKi8KK2ludCBmZF9wc21fYmVnaW4oc3RydWN0IGZkX3BlZXIgKiBwZWVyICkKK3sKKwlUUkFDRV9FTlRSWSgiJXAiLCBwZWVyKTsKKwkKKwkvKiBDaGVjayB0aGUgcGVlciBhbmQgc3RhdGUgYXJlIE9LICovCisJQ0hFQ0tfUEFSQU1TKCBmZF9wZWVyX2dldHN0YXRlKHBlZXIpID09IFNUQVRFX05FVyApOworCQorCS8qIENyZWF0ZSB0aGUgRklGTyBmb3IgZXZlbnRzICovCisJQ0hFQ0tfRkNUKCBmZF9maWZvX25ldygmcGVlci0+cF9ldmVudHMsIDApICk7CisJCisJLyogQ3JlYXRlIHRoZSBQU00gY29udHJvbGVyIHRocmVhZCAqLworCUNIRUNLX1BPU0lYKCBwdGhyZWFkX2NyZWF0ZSggJnBlZXItPnBfcHNtLCBOVUxMLCBwX3BzbV90aCwgcGVlciApICk7CisJCisJLyogV2UncmUgZG9uZSAqLworCXJldHVybiAwOworfQorCisvKiBFbmQgdGhlIFBTTSAoY2xlYW4gZW5kaW5nKSAqLworaW50IGZkX3BzbV90ZXJtaW5hdGUoc3RydWN0IGZkX3BlZXIgKiBwZWVyLCBjaGFyICogcmVhc29uICkKK3sKKwlUUkFDRV9FTlRSWSgiJXAiLCBwZWVyKTsKKwlDSEVDS19QQVJBTVMoIENIRUNLX1BFRVIocGVlcikgKTsKKwkKKwlpZiAoZmRfcGVlcl9nZXRzdGF0ZShwZWVyKSAhPSBTVEFURV9aT01CSUUpIHsKKwkJQ0hFQ0tfRkNUKCBmZF9ldmVudF9zZW5kKHBlZXItPnBfZXZlbnRzLCBGREVWUF9URVJNSU5BVEUsIDAsIHJlYXNvbikgKTsKKwl9IGVsc2UgeworCQlUUkFDRV9ERUJVRyhGVUxMLCAiUGVlciAnJXMnIHdhcyBhbHJlYWR5IHRlcm1pbmF0ZWQiLCBwZWVyLT5wX2hkci5pbmZvLnBpX2RpYW1pZCk7CisJfQorCXJldHVybiAwOworfQorCisvKiBFbmQgdGhlIFBTTSAmIGNsZWFudXAgdGhlIHBlZXIgc3RydWN0dXJlICovCit2b2lkIGZkX3BzbV9hYm9yZChzdHJ1Y3QgZmRfcGVlciAqIHBlZXIgKQoreworCVRSQUNFX0VOVFJZKCIlcCIsIHBlZXIpOworCQorCS8qIENhbmNlbCBQU00gdGhyZWFkICovCisJQ0hFQ0tfRkNUX0RPKCBmZF90aHJfdGVybSgmcGVlci0+cF9wc20pLCAvKiBjb250aW51ZSAqLyApOworCQorCS8qIENsZWFudXAgdGhlIGRhdGEgKi8KKwlmZF9wc21fY2xlYW51cChwZWVyLCAxKTsKKwkKKwkvKiBEZXN0cm95IHRoZSBldmVudCBsaXN0ICovCisJQ0hFQ0tfRkNUX0RPKCBmZF9maWZvX2RlbCgmcGVlci0+cF9ldmVudHMpLCAvKiBjb250aW51ZSAqLyApOworCQorCS8qIFJlbWFpbmluZyBjbGVhbnVwcyBhcmUgcGVyZm9ybWVkIGluIGZkX3BlZXJfZnJlZSAqLworCXJldHVybjsKK30KKwpkaWZmIC0tZ2l0IGEvbGliZmRjb3JlL3Bfc3IuYyBiL2xpYmZkY29yZS9wX3NyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZiNWE1NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmZkY29yZS9wX3NyLmMKQEAgLTAsMCArMSwzNTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDEzLCBXSURFIFByb2plY3QgYW5kIE5JQ1QJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFdJREUgUHJvamVjdCBvciBOSUNUIG5vciB0aGUgCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgV0lERSBQcm9qZWN0IGFuZCAJCQkJCQkgKgorKiAgIE5JQ1QuCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImZkY29yZS1pbnRlcm5hbC5oIgorCisvKiBTdHJ1Y3R1cmUgdG8gc3RvcmUgYSBzZW50IHJlcXVlc3QgKi8KK3N0cnVjdCBzZW50cmVxIHsKKwlzdHJ1Y3QgZmRfbGlzdAljaGFpbjsgCS8qIHRoZSAibyIgZmllbGQgcG9pbnRzIGRpcmVjdGx5IHRvIHRoZSAobmV3KSBob3AtYnktaG9wIG9mIHRoZSByZXF1ZXN0ICh1aW50MzJfdCAqKSAgKi8KKwlzdHJ1Y3QgbXNnCSpyZXE7CS8qIEEgcmVxdWVzdCB0aGF0IHdhcyBzZW50IGFuZCBub3QgeWV0IGFuc3dlcmVkLiAqLworCXVpbnQzMl90CXByZXZoYmg7LyogVGhlIHZhbHVlIHRvIHNldCBiYWNrIGluIHRoZSBoYmggaGVhZGVyIHdoZW4gdGhlIG1lc3NhZ2UgaXMgcmV0cmlldmVkICovCisJc3RydWN0IGZkX2xpc3QgIGV4cGlyZTsgLyogdGhlIGxpc3Qgb2YgZXhwaXJpbmcgcmVxdWVzdHMgKi8KKwlzdHJ1Y3QgdGltZXNwZWMgdGltZW91dDsgLyogQ2FjaGUgdGhlIGV4cGlyZSBkYXRlIG9mIHRoZSByZXF1ZXN0IHNvIHRoYXQgdGhlIHRpbWVvdXQgdGhyZWFkIGRvZXMgbm90IG5lZWQgdG8gZ2V0IGl0IGVhY2ggdGltZS4gKi8KKwlzdHJ1Y3QgdGltZXNwZWMgYWRkZWRfb247IC8qIHRoZSB0aW1lIHRoZSByZXF1ZXN0IHdhcyBhZGRlZCAqLworfTsKKworLyogRmluZCBhbiBlbGVtZW50IGluIHRoZSBoYmggbGlzdCwgb3IgdGhlIGZvbGxvd2luZyBvbmUgKi8KK3N0YXRpYyBzdHJ1Y3QgZmRfbGlzdCAqIGZpbmRfb3JfbmV4dChzdHJ1Y3QgZmRfbGlzdCAqIHNybGlzdCwgdWludDMyX3QgaGJoLCBpbnQgKiBtYXRjaCkKK3sKKwlzdHJ1Y3QgZmRfbGlzdCAqIGxpOworCSptYXRjaCA9IDA7CisJZm9yIChsaSA9IHNybGlzdC0+bmV4dDsgbGkgIT0gc3JsaXN0OyBsaSA9IGxpLT5uZXh0KSB7CisJCXVpbnQzMl90ICogbmV4dGhiaCA9IGxpLT5vOworCQlpZiAoKm5leHRoYmggPCBoYmgpCisJCQljb250aW51ZTsKKwkJaWYgKCpuZXh0aGJoID09IGhiaCkKKwkJCSptYXRjaCA9IDE7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gbGk7Cit9CisKKy8qIFNpbWlsYXIgYnV0IHN0YXJ0IGZyb20gdGhlIGVuZCwgc2luY2Ugd2UgYWRkIHJlcXVlc3RzIGluIGdyb3dpbmcgaGJoIG9yZGVyIHVzdWFsbHkgKi8KK3N0YXRpYyBzdHJ1Y3QgZmRfbGlzdCAqIGZpbmRfb3JfcHJldihzdHJ1Y3QgZmRfbGlzdCAqIHNybGlzdCwgdWludDMyX3QgaGJoLCBpbnQgKiBtYXRjaCkKK3sKKwlzdHJ1Y3QgZmRfbGlzdCAqIGxpOworCSptYXRjaCA9IDA7CisJZm9yIChsaSA9IHNybGlzdC0+cHJldjsgbGkgIT0gc3JsaXN0OyBsaSA9IGxpLT5wcmV2KSB7CisJCXVpbnQzMl90ICogcHJldmhiaCA9IGxpLT5vOworCQlpZiAoKnByZXZoYmggPiBoYmgpCisJCQljb250aW51ZTsKKwkJaWYgKCpwcmV2aGJoID09IGhiaCkKKwkJCSptYXRjaCA9IDE7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gbGk7Cit9CisKK3N0YXRpYyB2b2lkIHNybF9kdW1wKGNvbnN0IGNoYXIgKiB0ZXh0LCBzdHJ1Y3QgZmRfbGlzdCAqIHNybGlzdCkKK3sKKwlzdHJ1Y3QgZmRfbGlzdCAqIGxpOworCXN0cnVjdCB0aW1lc3BlYyBub3c7CisJCisJTE9HX0QoIiVzU2VudFJlcSBsaXN0IEAlcDoiLCB0ZXh0LCBzcmxpc3QpOworCQorCUNIRUNLX1NZU19ETyggY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJm5vdyksICk7CisJCisJZm9yIChsaSA9IHNybGlzdC0+bmV4dDsgbGkgIT0gc3JsaXN0OyBsaSA9IGxpLT5uZXh0KSB7CisJCXN0cnVjdCBzZW50cmVxICogc3IgPSAoc3RydWN0IHNlbnRyZXEgKilsaTsKKwkJdWludDMyX3QgKiBuZXh0aGJoID0gbGktPm87CisJCQorCQlMT0dfRCgiIC0gTmV4dCByZXEgKGhiaDoweCV4LCBwcmV2OjB4JXgpOiBbc2luY2UgJWxkLiUwNmxkIHNlY10iLCAqbmV4dGhiaCwgc3ItPnByZXZoYmgsCisJCQkobG9uZykoKG5vdy50dl9uc2VjID49IHNyLT5hZGRlZF9vbi50dl9uc2VjKSA/IChub3cudHZfc2VjIC0gc3ItPmFkZGVkX29uLnR2X3NlYykgOiAobm93LnR2X3NlYyAtIHNyLT5hZGRlZF9vbi50dl9zZWMgLSAxKSksCisJCQkobG9uZykoKG5vdy50dl9uc2VjID49IHNyLT5hZGRlZF9vbi50dl9uc2VjKSA/ICgobm93LnR2X25zZWMgLSBzci0+YWRkZWRfb24udHZfbnNlYykgLyAxMDAwKSA6ICgobm93LnR2X25zZWMgLSBzci0+YWRkZWRfb24udHZfbnNlYyArIDEwMDAwMDAwMDApIC8gMTAwMCkpKTsKKwl9Cit9CisKKy8qIHRocmVhZCB0aGF0IGhhbmRsZXMgbWVzc2FnZXMgZXhwaXJpbmcuIFRoZSB0aHJlYWQgaXMgc3RhcnRlZCBvbmx5IHdoZW4gbmVlZGVkICovCitzdGF0aWMgdm9pZCAqIHNyX2V4cGlyeV90aCh2b2lkICogYXJnKSB7CisJc3RydWN0IHNyX2xpc3QgKiBzcmxpc3QgPSBhcmc7CisJCisJVFJBQ0VfRU5UUlkoIiVwIiwgYXJnKTsKKwlDSEVDS19QQVJBTVNfRE8oIGFyZywgcmV0dXJuIE5VTEwgKTsKKwkKKwkvKiBTZXQgdGhlIHRocmVhZCBuYW1lICovCisJeworCQljaGFyIGJ1Zls0OF07CisJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJSZXFFeHAvJXMiLCAoKHN0cnVjdCBmZF9wZWVyICopKHNybGlzdC0+ZXhwLm8pKS0+cF9oZHIuaW5mby5waV9kaWFtaWQpOworCQlmZF9sb2dfdGhyZWFkbmFtZSAoIGJ1ZiApOworCX0KKwkKKwlkbyB7CisJCXN0cnVjdCB0aW1lc3BlYwlub3c7CisJCXN0cnVjdCBzZW50cmVxICogZmlyc3Q7CisJCXN0cnVjdCBtc2cgKiByZXF1ZXN0OworCQlzdHJ1Y3QgZmRfcGVlciAqIHNlbnR0bzsKKwkJdm9pZCAoKmV4cGlyZWNiKSh2b2lkICosIERpYW1JZF90LCBzaXplX3QsIHN0cnVjdCBtc2cgKiopOworCQl2b2lkICogZGF0YTsKKwkJaW50IG5vX2Vycm9yOworCisJCUNIRUNLX1BPU0lYX0RPKCBwdGhyZWFkX211dGV4X2xvY2soJnNybGlzdC0+bXR4KSwgIHJldHVybiBOVUxMICk7CisJCXB0aHJlYWRfY2xlYW51cF9wdXNoKCBmZF9jbGVhbnVwX211dGV4LCAmc3JsaXN0LT5tdHggKTsKKworbG9vcDoJCisJCW5vX2Vycm9yID0gMDsKKworCQkvKiBDaGVjayBpZiB0aGVyZSBhcmUgZXhwaXJpbmcgcmVxdWVzdHMgYXZhaWxhYmxlICovCisJCWlmIChGRF9JU19MSVNUX0VNUFRZKCZzcmxpc3QtPmV4cCkpIHsKKwkJCS8qIEp1c3Qgd2FpdCBmb3IgYSBjaGFuZ2Ugb3IgY2FuY2VsYXRpb24gKi8KKwkJCUNIRUNLX1BPU0lYX0RPKCBwdGhyZWFkX2NvbmRfd2FpdCggJnNybGlzdC0+Y25kLCAmc3JsaXN0LT5tdHggKSwgZ290byB1bmxvY2sgKTsKKwkJCS8qIFJlc3RhcnQgdGhlIGxvb3Agb24gd2FrZXVwICovCisJCQlnb3RvIGxvb3A7CisJCX0KKwkJCisJCS8qIEdldCB0aGUgcG9pbnRlciB0byB0aGUgcmVxdWVzdCB0aGF0IGV4cGlyZXMgZmlyc3QgKi8KKwkJZmlyc3QgPSAoc3RydWN0IHNlbnRyZXEgKikoc3JsaXN0LT5leHAubmV4dC0+byk7CisJCQorCQkvKiBHZXQgdGhlIGN1cnJlbnQgdGltZSAqLworCQlDSEVDS19TWVNfRE8oICBjbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmbm93KSwgIGdvdG8gdW5sb2NrICApOworCisJCS8qIElmIGZpcnN0IHJlcXVlc3QgaXMgbm90IGV4cGlyZWQsIHdlIGp1c3Qgd2FpdCB1bnRpbCBpdCBoYXBwZW5zICovCisJCWlmICggVFNfSVNfSU5GRVJJT1IoICZub3csICZmaXJzdC0+dGltZW91dCApICkgeworCQkJCisJCQlDSEVDS19QT1NJWF9ETzIoICBwdGhyZWFkX2NvbmRfdGltZWR3YWl0KCAmc3JsaXN0LT5jbmQsICZzcmxpc3QtPm10eCwgJmZpcnN0LT50aW1lb3V0ICksICAKKwkJCQkJRVRJTUVET1VULCAvKiBFVElNRURPVVQgaXMgYSBub3JtYWwgcmV0dXJuIHZhbHVlLCBjb250aW51ZSAqLywKKwkJCQkJLyogb24gb3RoZXIgZXJyb3IsICovIGdvdG8gdW5sb2NrICk7CisJCisJCQkvKiBvbiB3YWtldXAsIGxvb3AgKi8KKwkJCWdvdG8gbG9vcDsKKwkJfQorCQkKKwkJLyogTm93LCB0aGUgZmlyc3QgcmVxdWVzdCBpbiB0aGUgbGlzdCBpcyBleHBpcmVkOyByZW1vdmUgaXQgYW5kIGNhbGwgdGhlIGV4cGlyZWNiIGZvciBpdCAqLworCQlyZXF1ZXN0ID0gZmlyc3QtPnJlcTsKKwkJc2VudHRvID0gZmlyc3QtPmNoYWluLmhlYWQtPm87CisJCQorCQlUUkFDRV9ERUJVRyhGVUxMLCAiUmVxdWVzdCAleCB3YXMgbm90IGFuc3dlcmVkIGJ5ICVzIHdpdGhpbiB0aGUgdGltZXIgZGVsYXkiLCAqKCh1aW50MzJfdCAqKWZpcnN0LT5jaGFpbi5vKSwgc2VudHRvLT5wX2hkci5pbmZvLnBpX2RpYW1pZCk7CisJCQorCQkvKiBSZXN0b3JlIHRoZSBoYmhpZCAqLworCQkqKCh1aW50MzJfdCAqKWZpcnN0LT5jaGFpbi5vKSA9IGZpcnN0LT5wcmV2aGJoOyAKKwkJCisJCS8qIEZyZWUgdGhlIHNlbnRyZXEgaW5mb3JtYXRpb24gKi8KKwkJZmRfbGlzdF91bmxpbmsoJmZpcnN0LT5jaGFpbik7CisJCXNybGlzdC0+Y250LS07CisJCXNybGlzdC0+Y250X2xvc3QrKzsgLyogV2UgYXJlIG5vdCB3YWl0aW5nIGZvciB0aGlzIGFuc3dlciBhbnltb3JlLCBidXQgdGhlIHJlbW90ZSBwZWVyIG1heSBzdGlsbCBiZSBwcm9jZXNzaW5nIGl0LiAqLworCQlmZF9saXN0X3VubGluaygmZmlyc3QtPmV4cGlyZSk7CisJCWZyZWUoZmlyc3QpOworCQkKKwkJbm9fZXJyb3IgPSAxOwordW5sb2NrOgorCQk7IC8qIHB0aHJlYWRfY2xlYW51cF9wb3Agc29tZXRpbWVzIGV4cGFuZHMgYXMgIn0gLi4uIiBhbmQgdGhlIGxhYmVsIGJlZm9yZSB0aGlzIGNhdXNlIHNvbWUgY29tcGlsZXJzIHRvIGNvbXBsYWluLi4uICovCisJCXB0aHJlYWRfY2xlYW51cF9wb3AoIDEgKTsgLyogdW5sb2NrIHRoZSBtdXRleCAqLworCQlpZiAoIW5vX2Vycm9yKQorCQkJYnJlYWs7CisKKwkJCisJCS8qIFJldHJpZXZlIGNhbGxiYWNrIGluIHRoZSBtZXNzYWdlICovCisJCUNIRUNLX0ZDVF9ETyggZmRfbXNnX2Fuc2NiX2dldCggcmVxdWVzdCwgTlVMTCwgJmV4cGlyZWNiLCAmZGF0YSApLCBicmVhayk7CisJCUFTU0VSVChleHBpcmVjYik7CisJCisJCS8qIENsZWFuIHVwIHRoaXMgZXhwaXJlY2IgZnJvbSB0aGUgbWVzc2FnZSAqLworCQlDSEVDS19GQ1RfRE8oIGZkX21zZ19hbnNjYl9yZXNldCggcmVxdWVzdCwgMCwgMSApLCBicmVhayk7CisKKwkJLyogQ2FsbCBpdCAqLworCQkoKmV4cGlyZWNiKShkYXRhLCBzZW50dG8tPnBfaGRyLmluZm8ucGlfZGlhbWlkLCBzZW50dG8tPnBfaGRyLmluZm8ucGlfZGlhbWlkbGVuLCAmcmVxdWVzdCk7CisJCisJCS8qIElmIHRoZSBjYWxsYmFjayBkaWQgbm90IGRpc3Bvc2Ugb2YgdGhlIG1lc3NhZ2UsIGRvIGl0IG5vdyAqLworCQlpZiAocmVxdWVzdCkgeworCQkJZmRfaG9va19jYWxsKEhPT0tfTUVTU0FHRV9EUk9QUEVELCByZXF1ZXN0LCBOVUxMLCAiRXhwaXJhdGlvbiBwZXJpb2QgY29tcGxldGVkIHdpdGhvdXQgYW4gYW5zd2VyLCBhbmQgdGhlIGV4cGlyeSBjYWxsYmFjayBkaWQgbm90IGRpc3Bvc2Ugb2YgdGhlIG1lc3NhZ2UuIiwgZmRfbXNnX3BtZGxfZ2V0KHJlcXVlc3QpKTsKKwkJCUNIRUNLX0ZDVF9ETyggZmRfbXNnX2ZyZWUocmVxdWVzdCksIC8qIGlnbm9yZSAqLyApOworCQl9CisJCisJfSB3aGlsZSAoMSk7CisJCisJQVNTRVJUKDApOyAvKiB3ZSBoYXZlIGVuY291bnRlcmVkIGEgcHJvYmxlbSwgbWF5YmUgdGltZSB0byBzaWduYWwgdGhlIGZyYW1ld29yayB0byB0ZXJtaW5hdGU/ICovCisJcmV0dXJuIE5VTEw7Cit9CisKKworLyogU3RvcmUgYSBuZXcgc2VudCByZXF1ZXN0ICovCitpbnQgZmRfcF9zcl9zdG9yZShzdHJ1Y3Qgc3JfbGlzdCAqIHNybGlzdCwgc3RydWN0IG1zZyAqKnJlcSwgdWludDMyX3QgKmhiaGxvYywgdWludDMyX3QgaGJoX3Jlc3RvcmUpCit7CisJc3RydWN0IHNlbnRyZXEgKiBzcjsKKwlzdHJ1Y3QgZmRfbGlzdCAqIHByZXY7CisJaW50IG1hdGNoOworCXN0cnVjdCB0aW1lc3BlYyAqIHRzOworCQorCVRSQUNFX0VOVFJZKCIlcCAlcCAlcCAleCIsIHNybGlzdCwgcmVxLCBoYmhsb2MsIGhiaF9yZXN0b3JlKTsKKwlDSEVDS19QQVJBTVMoc3JsaXN0ICYmIHJlcSAmJiAqcmVxICYmIGhiaGxvYyk7CisJCisJQ0hFQ0tfTUFMTE9DKCBzciA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHNlbnRyZXEpKSApOworCW1lbXNldChzciwgMCwgc2l6ZW9mKHN0cnVjdCBzZW50cmVxKSk7CisJZmRfbGlzdF9pbml0KCZzci0+Y2hhaW4sIGhiaGxvYyk7CisJc3ItPnJlcSA9ICpyZXE7CisJc3ItPnByZXZoYmggPSBoYmhfcmVzdG9yZTsKKwlmZF9saXN0X2luaXQoJnNyLT5leHBpcmUsIHNyKTsKKwlDSEVDS19TWVMoIGNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZzci0+YWRkZWRfb24pICk7CisJCisJLyogU2VhcmNoIHRoZSBwbGFjZSBpbiB0aGUgbGlzdCAqLworCUNIRUNLX1BPU0lYKCBwdGhyZWFkX211dGV4X2xvY2soJnNybGlzdC0+bXR4KSApOworCXByZXYgPSBmaW5kX29yX3ByZXYoJnNybGlzdC0+c3JzLCAqaGJobG9jLCAmbWF0Y2gpOworCWlmIChtYXRjaCkgeworCQlUUkFDRV9ERUJVRyhJTkZPLCAiQSByZXF1ZXN0IHdpdGggdGhlIHNhbWUgaG9wLWJ5LWhvcCBJZCAoMHgleCkgd2FzIGFscmVhZHkgc2VudDogZXJyb3IiLCAqaGJobG9jKTsKKwkJZnJlZShzcik7CisJCXNybF9kdW1wKCJDdXJyZW50IGxpc3Qgb2YgU1I6ICIsICZzcmxpc3QtPnNycyk7CisJCUNIRUNLX1BPU0lYX0RPKCBwdGhyZWFkX211dGV4X3VubG9jaygmc3JsaXN0LT5tdHgpLCAvKiBpZ25vcmUgKi8gKTsKKwkJcmV0dXJuIEVJTlZBTDsKKwl9CisJCisJLyogU2F2ZSBpbiB0aGUgbGlzdCAqLworCSpyZXEgPSBOVUxMOworCWZkX2xpc3RfaW5zZXJ0X2FmdGVyKHByZXYsICZzci0+Y2hhaW4pOworCXNybGlzdC0+Y250Kys7CisJCisJLyogSW4gY2FzZSBvZiByZXF1ZXN0IHdpdGggYSB0aW1lb3V0LCBhbHNvIHN0b3JlIGluIHRoZSB0aW1lb3V0IGxpc3QgKi8KKwl0cyA9IGZkX21zZ19hbnNjYl9nZXR0aW1lb3V0KCBzci0+cmVxICk7CisJaWYgKHRzKSB7CisJCXN0cnVjdCBmZF9saXN0ICogbGk7CisJCQorCQltZW1jcHkoJnNyLT50aW1lb3V0LCB0cywgc2l6ZW9mKHN0cnVjdCB0aW1lc3BlYykpOworCQkKKwkJLyogYnJvd3NlIHNybGlzdC0+ZXhwIGZyb20gdGhlIGVuZCAqLworCQlmb3IgKGxpID0gc3JsaXN0LT5leHAucHJldjsgbGkgIT0gJnNybGlzdC0+ZXhwOyBsaSA9IGxpLT5wcmV2KSB7CisJCQlzdHJ1Y3Qgc2VudHJlcSAqIHMgPSAoc3RydWN0IHNlbnRyZXEgKikobGktPm8pOworCQkJaWYgKFRTX0lTX0lORkVSSU9SKCZzLT50aW1lb3V0LCB0cykpCisJCQkJYnJlYWs7CisJCX0KKwkJCisJCWZkX2xpc3RfaW5zZXJ0X2FmdGVyKGxpLCAmc3ItPmV4cGlyZSk7CisJCisJCS8qIGlmIHRoZSB0aHJlYWQgZG9lcyBub3QgZXhpc3QgeWV0LCBjcmVhdGUgaXQgKi8KKwkJaWYgKHNybGlzdC0+dGhyID09IChwdGhyZWFkX3QpTlVMTCkgeworCQkJQ0hFQ0tfUE9TSVhfRE8oIHB0aHJlYWRfY3JlYXRlKCZzcmxpc3QtPnRociwgTlVMTCwgc3JfZXhwaXJ5X3RoLCBzcmxpc3QpLCAvKiBjb250aW51ZSBhbnl3YXkgKi8pOworCQl9IGVsc2UgeworCQkJLyogb3IsIGlmIGFkZGVkIGluIGZpcnN0IHBvc2l0aW9uLCBzaWduYWwgdGhlIGNvbmR2YXIgdG8gdXBkYXRlIHRoZSBzbGVlcCB0aW1lIG9mIHRoZSB0aHJlYWQgKi8KKwkJCWlmIChsaSA9PSAmc3JsaXN0LT5leHApIHsKKwkJCQlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9jb25kX3NpZ25hbCgmc3JsaXN0LT5jbmQpLCAvKiBjb250aW51ZSBhbnl3YXkgKi8pOworCQkJfQorCQl9CisJfQorCQorCUNIRUNLX1BPU0lYKCBwdGhyZWFkX211dGV4X3VubG9jaygmc3JsaXN0LT5tdHgpICk7CisJcmV0dXJuIDA7Cit9CisKKy8qIEZldGNoIGEgcmVxdWVzdCBieSBoYmggKi8KK2ludCBmZF9wX3NyX2ZldGNoKHN0cnVjdCBzcl9saXN0ICogc3JsaXN0LCB1aW50MzJfdCBoYmgsIHN0cnVjdCBtc2cgKipyZXEpCit7CisJc3RydWN0IHNlbnRyZXEgKiBzcjsKKwlpbnQgbWF0Y2g7CisJCisJVFJBQ0VfRU5UUlkoIiVwICV4ICVwIiwgc3JsaXN0LCBoYmgsIHJlcSk7CisJQ0hFQ0tfUEFSQU1TKHNybGlzdCAmJiByZXEpOworCQorCS8qIFNlYXJjaCB0aGUgcmVxdWVzdCBpbiB0aGUgbGlzdCAqLworCUNIRUNLX1BPU0lYKCBwdGhyZWFkX211dGV4X2xvY2soJnNybGlzdC0+bXR4KSApOworCXNyID0gKHN0cnVjdCBzZW50cmVxICopZmluZF9vcl9uZXh0KCZzcmxpc3QtPnNycywgaGJoLCAmbWF0Y2gpOworCWlmICghbWF0Y2gpIHsKKwkJVFJBQ0VfREVCVUcoSU5GTywgIlRoZXJlIGlzIG5vIHNhdmVkIHJlcXVlc3Qgd2l0aCB0aGlzIGhvcC1ieS1ob3AgaWQgKCV4KSIsIGhiaCk7CisJCXNybF9kdW1wKCJDdXJyZW50IGxpc3Qgb2YgU1I6ICIsICZzcmxpc3QtPnNycyk7CisJCSpyZXEgPSBOVUxMOworCQlpZiAoc3JsaXN0LT5jbnRfbG9zdCA+IDApIHsKKwkJCXNybGlzdC0+Y250X2xvc3QtLTsgLyogVGhpcyBpcyBwcm9iYWJseSBhbiBhbnN3ZXIgZm9yIGEgcmVxdWVzdCB3ZSBhbHJlYWR5IHRpbWVkb3V0LiAqLworCQl9IC8qIGVsc2UsIHByb2JhYmx5IGEgYnVnIGluIHRoZSByZW1vdGUgcGVlciAqLworCX0gZWxzZSB7CisJCS8qIFJlc3RvcmUgaG9wLWJ5LWhvcCBpZCAqLworCQkqKCh1aW50MzJfdCAqKXNyLT5jaGFpbi5vKSA9IHNyLT5wcmV2aGJoOworCQkvKiBVbmxpbmsgKi8KKwkJZmRfbGlzdF91bmxpbmsoJnNyLT5jaGFpbik7CisJCXNybGlzdC0+Y250LS07CisJCWZkX2xpc3RfdW5saW5rKCZzci0+ZXhwaXJlKTsKKwkJKnJlcSA9IHNyLT5yZXE7CisJCWZyZWUoc3IpOworCX0KKwlDSEVDS19QT1NJWCggcHRocmVhZF9tdXRleF91bmxvY2soJnNybGlzdC0+bXR4KSApOworCQorCS8qIGRvIG5vdCBzdG9wIHRoZSBleHBpcmUgdGhyZWFkIGhlcmUsIGl0IG1pZ2h0IGNhdXNlIGNyZWF0aW5nL2Rlc3Ryb3lpbmcgaXQgdmVyeSBvZnRlbiBvdGhlcndpc2UgKi8KKworCS8qIERvbmUgKi8KKwlyZXR1cm4gMDsKK30KKworLyogRmFpbG92ZXIgcmVxdWVzdHMgKGZyZWUgb3IgcmVxdWV1ZSByb3V0YWJsZXMpICovCit2b2lkIGZkX3Bfc3JfZmFpbG92ZXIoc3RydWN0IHNyX2xpc3QgKiBzcmxpc3QpCit7CisJQ0hFQ0tfUE9TSVhfRE8oIHB0aHJlYWRfbXV0ZXhfbG9jaygmc3JsaXN0LT5tdHgpLCAvKiBjb250aW51ZSBhbnl3YXkgKi8gKTsKKwl3aGlsZSAoIUZEX0lTX0xJU1RfRU1QVFkoJnNybGlzdC0+c3JzKSkgeworCQlzdHJ1Y3Qgc2VudHJlcSAqIHNyID0gKHN0cnVjdCBzZW50cmVxICopKHNybGlzdC0+c3JzLm5leHQpOworCQlmZF9saXN0X3VubGluaygmc3ItPmNoYWluKTsKKwkJc3JsaXN0LT5jbnQtLTsKKwkJZmRfbGlzdF91bmxpbmsoJnNyLT5leHBpcmUpOworCQlpZiAoZmRfbXNnX2lzX3JvdXRhYmxlKHNyLT5yZXEpKSB7CisJCQlzdHJ1Y3QgbXNnX2hkciAqIGhkciA9IE5VTEw7CisJCQlpbnQgcmV0OworCQkJCisJCQkvKiBTZXQgdGhlICdUJyBmbGFnICovCisJCQlDSEVDS19GQ1RfRE8oZmRfbXNnX2hkcihzci0+cmVxLCAmaGRyKSwgLyogY29udGludWUgKi8pOworCQkJaWYgKGhkcikKKwkJCQloZHItPm1zZ19mbGFncyB8PSBDTURfRkxBR19SRVRSQU5TTUlUOworCQkJCisJCQkvKiBSZXN0b3JlIHRoZSBvcmlnaW5hbCBob3AtYnktaG9wIGlkIG9mIHRoZSByZXF1ZXN0ICovCisJCQkqKCh1aW50MzJfdCAqKXNyLT5jaGFpbi5vKSA9IHNyLT5wcmV2aGJoOworCQkJCisJCQlmZF9ob29rX2NhbGwoSE9PS19NRVNTQUdFX0ZBSUxPVkVSLCBzci0+cmVxLCAoc3RydWN0IGZkX3BlZXIgKilzcmxpc3QtPnNycy5vLCBOVUxMLCBmZF9tc2dfcG1kbF9nZXQoc3ItPnJlcSkpOworCQkJCisJCQkvKiBSZXF1ZXVlIGZvciBzZW5kaW5nIHRvIGFub3RoZXIgcGVlciAqLworCQkJQ0hFQ0tfRkNUX0RPKCByZXQgPSBmZF9maWZvX3Bvc3Rfbm9ibG9jayhmZF9nX291dGdvaW5nLCAodm9pZCAqKSZzci0+cmVxKSwKKwkJCQl7CisJCQkJCWNoYXIgYnVmWzI1Nl07CisJCQkJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJJbnRlcm5hbCBlcnJvcjogZXJyb3Igd2hpbGUgcmVxdWV1aW5nIGR1cmluZyBmYWlsb3ZlcjogJXMiLCBzdHJlcnJvcihyZXQpKTsKKwkJCQkJZmRfaG9va19jYWxsKEhPT0tfTUVTU0FHRV9EUk9QUEVELCBzci0+cmVxLCBOVUxMLCBidWYsIGZkX21zZ19wbWRsX2dldChzci0+cmVxKSk7CisJCQkJCUNIRUNLX0ZDVF9ETyhmZF9tc2dfZnJlZShzci0+cmVxKSwgLyogV2hhdCBjYW4gd2UgZG8gbW9yZT8gKi8pCisJCQkJfSk7CisJCX0gZWxzZSB7CisJCQkvKiBKdXN0IGZyZWUgdGhlIHJlcXVlc3QuICovCisJCQkvKiBmZF9ob29rX2NhbGwoSE9PS19NRVNTQUdFX0RST1BQRUQsIHNyLT5yZXEsIE5VTEwsICJTZW50ICYgdW5hbnN3ZXJlZCBsb2NhbCBtZXNzYWdlIGRpc2NhcmRlZCBkdXJpbmcgZmFpbG92ZXIuIiwgZmRfbXNnX3BtZGxfZ2V0KHNyLT5yZXEpKTsgKi8KKwkJCUNIRUNLX0ZDVF9ETyhmZF9tc2dfZnJlZShzci0+cmVxKSwgLyogSWdub3JlICovKTsKKwkJfQorCQlmcmVlKHNyKTsKKwl9CisJLyogVGhlIGxpc3Qgb2YgZXhwaXJpbmcgcmVxdWVzdHMgbXVzdCBiZSBlbXB0eSBub3cgKi8KKwlBU1NFUlQoIEZEX0lTX0xJU1RfRU1QVFkoJnNybGlzdC0+ZXhwKSApOworCUFTU0VSVCggc3JsaXN0LT5jbnQgPT0gMCApOyAvKiBkZWJ1ZyB0aGUgY291bnRlciBtYW5hZ2VtZW50IGlmIG5lZWRlZCAqLworCQorCUNIRUNLX1BPU0lYX0RPKCBwdGhyZWFkX211dGV4X3VubG9jaygmc3JsaXN0LT5tdHgpLCAvKiBjb250aW51ZSBhbnl3YXkgKi8gKTsKKwkKKwkvKiBUZXJtaW5hdGUgdGhlIGV4cGlyeSB0aHJlYWQgKG11c3QgYmUgZG9uZSB3aGVuIHRoZSBsb2NrIGNhbiBiZSB0YWtlbikgKi8KKwlDSEVDS19GQ1RfRE8oIGZkX3Rocl90ZXJtKCZzcmxpc3QtPnRociksIC8qIGlnbm9yZSBlcnJvciAqLyApOworfQorCmRpZmYgLS1naXQgYS9saWJmZGNvcmUvcGVlcnMuYyBiL2xpYmZkY29yZS9wZWVycy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4ZjE5MjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJmZGNvcmUvcGVlcnMuYwpAQCAtMCwwICsxLDY5MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTMsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiZmRjb3JlLWludGVybmFsLmgiCisKKy8qIEdsb2JhbCBsaXN0IG9mIHBlZXJzICovCitzdHJ1Y3QgZmRfbGlzdCAgIGZkX2dfcGVlcnMgPSBGRF9MSVNUX0lOSVRJQUxJWkVSKGZkX2dfcGVlcnMpOworcHRocmVhZF9yd2xvY2tfdCBmZF9nX3BlZXJzX3J3ID0gUFRIUkVBRF9SV0xPQ0tfSU5JVElBTElaRVI7CisKKy8qIExpc3Qgb2YgYWN0aXZlIHBlZXJzICovCitzdHJ1Y3QgZmRfbGlzdCAgIGZkX2dfYWN0aXZfcGVlcnMgPSBGRF9MSVNUX0lOSVRJQUxJWkVSKGZkX2dfYWN0aXZfcGVlcnMpOwkvKiBwZWVycyBsaW5rZWQgYnkgdGhlaXIgcF9hY3RpdmVzIG9yZWRlcmVkIGJ5IHBfZGlhbWlkICovCitwdGhyZWFkX3J3bG9ja190IGZkX2dfYWN0aXZfcGVlcnNfcncgPSBQVEhSRUFEX1JXTE9DS19JTklUSUFMSVpFUjsKKworLyogTGlzdCBvZiB2YWxpZGF0aW9uIGNhbGxiYWNrcyAocmVnaXN0ZXJlZCB3aXRoIGZkX3BlZXJfdmFsaWRhdGVfcmVnaXN0ZXIpICovCitzdGF0aWMgc3RydWN0IGZkX2xpc3QgdmFsaWRhdG9ycyA9IEZEX0xJU1RfSU5JVElBTElaRVIodmFsaWRhdG9ycyk7CS8qIGxpc3QgaXRlbXMgYXJlIHNpbXBsZSBmZF9saXN0IHdpdGggIm8iIHBvaW50aW5nIHRvIHRoZSBjYWxsYmFjayAqLworc3RhdGljIHB0aHJlYWRfcndsb2NrX3QgdmFsaWRhdG9yc19ydyA9IFBUSFJFQURfUldMT0NLX0lOSVRJQUxJWkVSOworCisKKy8qIEFsbG9jIC8gcmVpbml0IGEgcGVlciBzdHJ1Y3R1cmUuIGlmICpwdHIgaXMgbm90IE5VTEwsIGl0IG11c3QgYWxyZWFkeSBwb2ludCB0byBhIHZhbGlkIHN0cnVjdCBmZF9wZWVyLiAqLworaW50IGZkX3BlZXJfYWxsb2Moc3RydWN0IGZkX3BlZXIgKiogcHRyKQoreworCXN0cnVjdCBmZF9wZWVyICpwOworCQorCVRSQUNFX0VOVFJZKCIlcCIsIHB0cik7CisJQ0hFQ0tfUEFSQU1TKHB0cik7CisJCisJaWYgKCpwdHIpIHsKKwkJcCA9ICpwdHI7CisJfSBlbHNlIHsKKwkJQ0hFQ0tfTUFMTE9DKCBwID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgZmRfcGVlcikpICk7CisJCSpwdHIgPSBwOworCX0KKwkKKwkvKiBOb3cgaW5pdGlhbGl6ZSB0aGUgY29udGVudCAqLworCW1lbXNldChwLCAwLCBzaXplb2Yoc3RydWN0IGZkX3BlZXIpKTsKKwkKKwlmZF9saXN0X2luaXQoJnAtPnBfaGRyLmNoYWluLCBwKTsKKwkKKwlmZF9saXN0X2luaXQoJnAtPnBfaGRyLmluZm8ucGlfZW5kcG9pbnRzLCBwKTsKKwlmZF9saXN0X2luaXQoJnAtPnBfaGRyLmluZm8ucnVudGltZS5waXJfYXBwcywgcCk7CisJCisJcC0+cF9leWVjID0gRVlFQ19QRUVSOworCUNIRUNLX1BPU0lYKCBwdGhyZWFkX211dGV4X2luaXQoJnAtPnBfc3RhdGVfbXR4LCBOVUxMKSApOworCQorCWZkX2xpc3RfaW5pdCgmcC0+cF9hY3RpdmVzLCBwKTsKKwlmZF9saXN0X2luaXQoJnAtPnBfZXhwaXJ5LCBwKTsKKwlDSEVDS19GQ1QoIGZkX2ZpZm9fbmV3KCZwLT5wX3Rvc2VuZCwgNSkgKTsKKwlDSEVDS19GQ1QoIGZkX2ZpZm9fbmV3KCZwLT5wX3RvZmFpbG92ZXIsIDApICk7CisJcC0+cF9oYmggPSBscmFuZDQ4KCk7CisJCisJZmRfbGlzdF9pbml0KCZwLT5wX3NyLnNycywgcCk7CisJZmRfbGlzdF9pbml0KCZwLT5wX3NyLmV4cCwgcCk7CisJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfbXV0ZXhfaW5pdCgmcC0+cF9zci5tdHgsIE5VTEwpICk7CisJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfY29uZF9pbml0KCZwLT5wX3NyLmNuZCwgTlVMTCkgKTsKKwkKKwlmZF9saXN0X2luaXQoJnAtPnBfY29ubnBhcmFtcywgcCk7CisJCisJcmV0dXJuIDA7Cit9CisKKy8qIEFkZCBhIG5ldyBwZWVyIGVudHJ5ICovCitpbnQgZmRfcGVlcl9hZGQgKCBzdHJ1Y3QgcGVlcl9pbmZvICogaW5mbywgY29uc3QgY2hhciAqIG9yaWdfZGJnLCB2b2lkICgqY2IpKHN0cnVjdCBwZWVyX2luZm8gKiwgdm9pZCAqKSwgdm9pZCAqIGNiX2RhdGEgKQoreworCXN0cnVjdCBmZF9wZWVyICpwID0gTlVMTDsKKwlzdHJ1Y3QgZmRfbGlzdCAqIGxpLCAqbGlfaW5mOworCWludCByZXQgPSAwOworCQorCVRSQUNFX0VOVFJZKCIlcCAlcCAlcCAlcCIsIGluZm8sIG9yaWdfZGJnLCBjYiwgY2JfZGF0YSk7CisJQ0hFQ0tfUEFSQU1TKGluZm8gJiYgaW5mby0+cGlfZGlhbWlkKTsKKwkKKwlpZiAoaW5mby0+Y29uZmlnLnBpY19yZWFsbSkgeworCQlpZiAoIWZkX29zX2lzX3ZhbGlkX0RpYW1ldGVySWRlbnRpdHkoKG9zMF90KWluZm8tPmNvbmZpZy5waWNfcmVhbG0sIHN0cmxlbihpbmZvLT5jb25maWcucGljX3JlYWxtKSkpIHsKKwkJCVRSQUNFX0RFQlVHKElORk8sICInJXMnIGlzIG5vdCBhIHZhbGlkIERpYW1ldGVySWRlbnRpdHkuIiwgaW5mby0+Y29uZmlnLnBpY19yZWFsbSk7CisJCQlyZXR1cm4gRUlOVkFMOworCQl9CisJfQorCQorCS8qIENyZWF0ZSBhIHN0cnVjdHVyZSB0byBjb250YWluIHRoZSBuZXcgcGVlciBpbmZvcm1hdGlvbiAqLworCUNIRUNLX0ZDVCggZmRfcGVlcl9hbGxvYygmcCkgKTsKKwkKKwkvKiBDb3B5IHRoZSBpbmZvcm1hdGlvbnMgZnJvbSB0aGUgcGFyYW1ldGVycyByZWNlaXZlZCAqLworCXAtPnBfaGRyLmluZm8ucGlfZGlhbWlkID0gaW5mby0+cGlfZGlhbWlkOworCUNIRUNLX0ZDVCggZmRfb3NfdmFsaWRhdGVfRGlhbWV0ZXJJZGVudGl0eSgmcC0+cF9oZHIuaW5mby5waV9kaWFtaWQsICZwLT5wX2hkci5pbmZvLnBpX2RpYW1pZGxlbiwgMSkgKTsKKwkKKwltZW1jcHkoICZwLT5wX2hkci5pbmZvLmNvbmZpZywgJmluZm8tPmNvbmZpZywgc2l6ZW9mKHAtPnBfaGRyLmluZm8uY29uZmlnKSApOworCQorCS8qIER1cGxpY2F0ZSB0aGUgc3RyaW5ncyBpZiBwcm92aWRlZCAqLworCWlmIChpbmZvLT5jb25maWcucGljX3JlYWxtKSB7CisJCUNIRUNLX01BTExPQyggcC0+cF9oZHIuaW5mby5jb25maWcucGljX3JlYWxtID0gc3RyZHVwKGluZm8tPmNvbmZpZy5waWNfcmVhbG0pICk7CisJfQorCWlmIChpbmZvLT5jb25maWcucGljX3ByaW9yaXR5KSB7CisJCUNIRUNLX01BTExPQyggcC0+cF9oZHIuaW5mby5jb25maWcucGljX3ByaW9yaXR5ID0gc3RyZHVwKGluZm8tPmNvbmZpZy5waWNfcHJpb3JpdHkpICk7CisJfQorCQorCS8qIE1vdmUgdGhlIGxpc3Qgb2YgZW5kcG9pbnRzIGludG8gdGhlIHBlZXIgKi8KKwlpZiAoaW5mby0+cGlfZW5kcG9pbnRzLm5leHQpCisJCXdoaWxlICghRkRfSVNfTElTVF9FTVBUWSggJmluZm8tPnBpX2VuZHBvaW50cyApICkgeworCQkJbGkgPSBpbmZvLT5waV9lbmRwb2ludHMubmV4dDsKKwkJCWZkX2xpc3RfdW5saW5rKGxpKTsKKwkJCWZkX2xpc3RfaW5zZXJ0X2JlZm9yZSgmcC0+cF9oZHIuaW5mby5waV9lbmRwb2ludHMsIGxpKTsKKwkJfQorCQorCS8qIFRoZSBpbnRlcm5hbCBkYXRhICovCisJaWYgKG9yaWdfZGJnKSB7CisJCUNIRUNLX01BTExPQyggcC0+cF9kYmdvcmlnID0gc3RyZHVwKG9yaWdfZGJnKSApOworCX0gZWxzZSB7CisJCUNIRUNLX01BTExPQyggcC0+cF9kYmdvcmlnID0gc3RyZHVwKCJ1bnNwZWNpZmllZCIpICk7CisJfQorCXAtPnBfY2IgPSBjYjsKKwlwLT5wX2NiX2RhdGEgPSBjYl9kYXRhOworCQorCS8qIE9rLCBub3cgY2hlY2sgaWYgd2UgZG9uJ3QgYWxyZWFkeSBoYXZlIGFuIGVudHJ5IHdpdGggdGhlIHNhbWUgRGlhbWV0ZXIgSWQsIGFuZCBpbnNlcnQgdGhpcyBvbmUgKi8KKwlDSEVDS19QT1NJWCggcHRocmVhZF9yd2xvY2tfd3Jsb2NrKCZmZF9nX3BlZXJzX3J3KSApOworCWxpX2luZiA9ICZmZF9nX3BlZXJzOworCWZvciAobGkgPSBmZF9nX3BlZXJzLm5leHQ7IGxpICE9ICZmZF9nX3BlZXJzOyBsaSA9IGxpLT5uZXh0KSB7CisJCXN0cnVjdCBmZF9wZWVyICogbmV4dCA9IChzdHJ1Y3QgZmRfcGVlciAqKWxpOworCQlpbnQgY29udDsKKwkJaW50IGNtcCA9IGZkX29zX2FsbW9zdGNhc2VzcmNoKCBwLT5wX2hkci5pbmZvLnBpX2RpYW1pZCwgcC0+cF9oZHIuaW5mby5waV9kaWFtaWRsZW4sIAorCQkJCQkJbmV4dC0+cF9oZHIuaW5mby5waV9kaWFtaWQsIG5leHQtPnBfaGRyLmluZm8ucGlfZGlhbWlkbGVuLAorCQkJCQkJJmNvbnQgKTsKKwkJaWYgKGNtcCA+IDApCisJCQlsaV9pbmYgPSBsaTsgLyogaXQgd2lsbCBjb21lIGFmdGVyIHRoaXMgZWxlbWVudCwgZm9yIHN1cmUgKi8KKwkJCisJCWlmIChjbXAgPT0gMCkgeworCQkJcmV0ID0gRUVYSVNUOyAvKiB3ZSBoYXZlIGEgZHVwbGljYXRlICovCisJCQlicmVhazsKKwkJfQorCQlpZiAoIWNvbnQpCisJCQlicmVhazsKKwl9CisJCisJLyogV2UgY2FuIGluc2VydCB0aGUgbmV3IHBlZXIgb2JqZWN0ICovCisJaWYgKCEgcmV0KQorCQlkbyB7CisJCQkvKiBVcGRhdGUgZXhwaXJ5IGxpc3QgKi8KKwkJCUNIRUNLX0ZDVF9ETyggcmV0ID0gZmRfcF9leHBpX3VwZGF0ZSggcCApLCBicmVhayApOworCisJCQkvKiBJbnNlcnQgdGhlIG5ldyBlbGVtZW50IGluIHRoZSBsaXN0ICovCisJCQlmZF9saXN0X2luc2VydF9hZnRlciggbGlfaW5mLCAmcC0+cF9oZHIuY2hhaW4gKTsKKwkJfSB3aGlsZSAoMCk7CisKKwlDSEVDS19QT1NJWCggcHRocmVhZF9yd2xvY2tfdW5sb2NrKCZmZF9nX3BlZXJzX3J3KSApOworCWlmIChyZXQpIHsKKwkJQ0hFQ0tfRkNUKCBmZF9wZWVyX2ZyZWUoJnApICk7CisJfSBlbHNlIHsKKwkJQ0hFQ0tfRkNUKCBmZF9wc21fYmVnaW4ocCkgKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyogU2VhcmNoIGZvciBhIHBlZXIgKi8KK2ludCBmZF9wZWVyX2dldGJ5aWQoIERpYW1JZF90IGRpYW1pZCwgc2l6ZV90IGRpYW1pZGxlbiwgaW50IGlnbmNhc2UsIHN0cnVjdCBwZWVyX2hkciAqKiBwZWVyICkKK3sKKwlzdHJ1Y3QgZmRfbGlzdCAqIGxpOworCVRSQUNFX0VOVFJZKCIlcCAlemQgJWQgJXAiLCBkaWFtaWQsIGRpYW1pZGxlbiwgaWduY2FzZSwgcGVlcik7CisJQ0hFQ0tfUEFSQU1TKCBkaWFtaWQgJiYgZGlhbWlkbGVuICYmIHBlZXIgKTsKKwkKKwkqcGVlciA9IE5VTEw7CisJCisJLyogU2VhcmNoIGluIHRoZSBsaXN0ICovCisJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfcndsb2NrX3JkbG9jaygmZmRfZ19wZWVyc19ydykgKTsKKwlpZiAoaWduY2FzZSkgeworCQlmb3IgKGxpID0gZmRfZ19wZWVycy5uZXh0OyBsaSAhPSAmZmRfZ19wZWVyczsgbGkgPSBsaS0+bmV4dCkgeworCQkJc3RydWN0IGZkX3BlZXIgKiBuZXh0ID0gKHN0cnVjdCBmZF9wZWVyICopbGk7CisJCQlpbnQgY21wLCBjb250OworCQkJY21wID0gZmRfb3NfYWxtb3N0Y2FzZXNyY2goIGRpYW1pZCwgZGlhbWlkbGVuLCBuZXh0LT5wX2hkci5pbmZvLnBpX2RpYW1pZCwgbmV4dC0+cF9oZHIuaW5mby5waV9kaWFtaWRsZW4sICZjb250ICk7CisJCQlpZiAoY21wID09IDApIHsKKwkJCQkqcGVlciA9ICZuZXh0LT5wX2hkcjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICghY29udCkKKwkJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCWZvciAobGkgPSBmZF9nX3BlZXJzLm5leHQ7IGxpICE9ICZmZF9nX3BlZXJzOyBsaSA9IGxpLT5uZXh0KSB7CisJCQlzdHJ1Y3QgZmRfcGVlciAqIG5leHQgPSAoc3RydWN0IGZkX3BlZXIgKilsaTsKKwkJCWludCBjbXAgPSBmZF9vc19jbXAoIGRpYW1pZCwgZGlhbWlkbGVuLCBuZXh0LT5wX2hkci5pbmZvLnBpX2RpYW1pZCwgbmV4dC0+cF9oZHIuaW5mby5waV9kaWFtaWRsZW4gKTsKKwkJCWlmIChjbXAgPiAwKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGNtcCA9PSAwKQorCQkJCSpwZWVyID0gJm5leHQtPnBfaGRyOworCQkJYnJlYWs7CisJCX0KKwl9CisJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfcndsb2NrX3VubG9jaygmZmRfZ19wZWVyc19ydykgKTsKKwkKKwlyZXR1cm4gMDsKK30KKworCisjZGVmaW5lIGZyZWVfbnVsbCggX3YgKSAJXAorCWlmIChfdikgewkJXAorCQlmcmVlKF92KTsJXAorCQkoX3YpID0gTlVMTDsJXAorCX0KKwkKKyNkZWZpbmUgZnJlZV9saXN0KCBfbCApIAkJCQkJCVwKKwl3aGlsZSAoIUZEX0lTX0xJU1RfRU1QVFkoX2wpKSB7CQkJCQlcCisJCXN0cnVjdCBmZF9saXN0ICogX19saSA9ICgoc3RydWN0IGZkX2xpc3QgKikoX2wpKS0+bmV4dDsJXAorCQlmZF9saXN0X3VubGluayhfX2xpKTsJCQkJCVwKKwkJZnJlZShfX2xpKTsJCQkJCQlcCisJfQorCisvKiBFbXB0eSB0aGUgbGlzdHMgb2YgcF90b3NlbmQsIHBfZmFpbG92ZXIsIGFuZCBwX3NlbnRyZXEgbWVzc2FnZXMgKi8KK3ZvaWQgZmRfcGVlcl9mYWlsb3Zlcl9tc2coc3RydWN0IGZkX3BlZXIgKiBwZWVyKQoreworCXN0cnVjdCBtc2cgKm07CisJVFJBQ0VfRU5UUlkoIiVwIiwgcGVlcik7CisJQ0hFQ0tfUEFSQU1TX0RPKENIRUNLX1BFRVIocGVlciksIHJldHVybik7CisJCisJLyogUmVxdWV1ZSBhbGwgbWVzc2FnZXMgaW4gdGhlICJvdXQiIHF1ZXVlICovCisJd2hpbGUgKCBmZF9maWZvX3RyeWdldChwZWVyLT5wX3Rvc2VuZCwgJm0pID09IDAgKSB7CisJCS8qIGJ1dCBvbmx5IGlmIHRoZXkgYXJlIHJvdXRhYmxlICovCisJCWlmIChmZF9tc2dfaXNfcm91dGFibGUobSkpIHsKKwkJCWZkX2hvb2tfY2FsbChIT09LX01FU1NBR0VfRkFJTE9WRVIsIG0sIHBlZXIsIE5VTEwsIGZkX21zZ19wbWRsX2dldChtKSk7CisJCQlDSEVDS19GQ1RfRE8oZmRfZmlmb19wb3N0X25vYmxvY2soZmRfZ19vdXRnb2luZywgKHZvaWQgKikmbSksIAorCQkJCXsKKwkJCQkJLyogZmFsbGJhY2s6IGRlc3Ryb3kgdGhlIG1lc3NhZ2UgKi8KKwkJCQkJZmRfaG9va19jYWxsKEhPT0tfTUVTU0FHRV9EUk9QUEVELCBtLCBOVUxMLCAiSW50ZXJuYWwgZXJyb3I6IHVuYWJsZSB0byByZXF1ZXVlIHRoaXMgbWVzc2FnZSBkdXJpbmcgZmFpbG92ZXIgcHJvY2VzcyIsIGZkX21zZ19wbWRsX2dldChtKSk7CisJCQkJCUNIRUNLX0ZDVF9ETyhmZF9tc2dfZnJlZShtKSwgLyogV2hhdCBjYW4gd2UgZG8gbW9yZT8gKi8pCisJCQkJfSApOworCQl9IGVsc2UgeworCQkJLyogSnVzdCBmcmVlIGl0ICovCisJCQkvKiBmZF9ob29rX2NhbGwoSE9PS19NRVNTQUdFX0RST1BQRUQsIG0sIE5VTEwsICJOb24tcm91dGFibGUgbWVzc2FnZSBmcmVlZCBkdXJpbmcgaGFuZG92ZXIiLCBmZF9tc2dfcG1kbF9nZXQobSkpOyAqLworCQkJQ0hFQ0tfRkNUX0RPKGZkX21zZ19mcmVlKG0pLCAvKiBXaGF0IGNhbiB3ZSBkbyBtb3JlPyAqLykKKwkJfQorCX0KKwkKKwkvKiBSZXF1ZXVlIGFsbCBtZXNzYWdlcyBpbiB0aGUgImZhaWxvdmVyIiBxdWV1ZSAqLworCXdoaWxlICggZmRfZmlmb190cnlnZXQocGVlci0+cF90b2ZhaWxvdmVyLCAmbSkgPT0gMCApIHsKKwkJZmRfaG9va19jYWxsKEhPT0tfTUVTU0FHRV9GQUlMT1ZFUiwgbSwgcGVlciwgTlVMTCwgZmRfbXNnX3BtZGxfZ2V0KG0pKTsKKwkJQ0hFQ0tfRkNUX0RPKGZkX2ZpZm9fcG9zdF9ub2Jsb2NrKGZkX2dfb3V0Z29pbmcsICh2b2lkICopJm0pLCAKKwkJCXsKKwkJCQkvKiBmYWxsYmFjazogZGVzdHJveSB0aGUgbWVzc2FnZSAqLworCQkJCWZkX2hvb2tfY2FsbChIT09LX01FU1NBR0VfRFJPUFBFRCwgbSwgTlVMTCwgIkludGVybmFsIGVycm9yOiB1bmFibGUgdG8gcmVxdWV1ZSB0aGlzIG1lc3NhZ2UgZHVyaW5nIGZhaWxvdmVyIHByb2Nlc3MiLCBmZF9tc2dfcG1kbF9nZXQobSkpOworCQkJCUNIRUNLX0ZDVF9ETyhmZF9tc2dfZnJlZShtKSwgLyogV2hhdCBjYW4gd2UgZG8gbW9yZT8gKi8pCisJCQl9ICk7CisJfQorCQorCS8qIFJlcXVldWUgYWxsIHJvdXRhYmxlIHNlbnQgcmVxdWVzdHMgKi8KKwlmZF9wX3NyX2ZhaWxvdmVyKCZwZWVyLT5wX3NyKTsKKwkKKwkvKiBEb25lICovCisJcmV0dXJuOworfQorCisvKiBEZXNjcmliZSB0aGUgY3VycmVudCBjb25uZWN0aW9uICovCitpbnQgZmRfcGVlcl9jbnhfcHJvdG9faW5mbyhzdHJ1Y3QgcGVlcl9oZHIgKnBlZXIsIGNoYXIgKiBidWYsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IGZkX3BlZXIgKiBwID0gKHN0cnVjdCBmZF9wZWVyICopcGVlcjsKKwlUUkFDRV9FTlRSWSgiJXAgJXAgJXpkIiwgcGVlciwgYnVmLCBsZW4pOworCUNIRUNLX1BBUkFNUyhDSEVDS19QRUVSKHBlZXIpICYmIGJ1ZiAmJiBsZW4pOworCQorCWlmIChwLT5wX2NueGN0eCkgeworCQlDSEVDS19GQ1QoZmRfY254X3Byb3RvX2luZm8ocC0+cF9jbnhjdHgsIGJ1ZiwgbGVuKSk7CisJfSBlbHNlIGlmIChwLT5wX3JlY2VpdmVyKSB7CisJCUNIRUNLX0ZDVChmZF9jbnhfcHJvdG9faW5mbyhwLT5wX3JlY2VpdmVyLCBidWYsIGxlbikpOworCX0gZWxzZSB7CisJCXNucHJpbnRmKGJ1ZiwgbGVuLCAiTm90IENvbm5lY3RlZCIpOworCX0KKwkKKwlyZXR1cm4gMDsKK30KKworLyogUmV0dXJuIHRoZSB2YWx1ZSBvZiBzcmxpc3QtPmNudCAqLworaW50IGZkX3BlZXJfZ2V0X2xvYWRfcGVuZGluZyhzdHJ1Y3QgcGVlcl9oZHIgKnBlZXIsIGxvbmcgKiB0b19yZWNlaXZlLCBsb25nICogdG9fc2VuZCkKK3sKKwlzdHJ1Y3QgZmRfcGVlciAqIHAgPSAoc3RydWN0IGZkX3BlZXIgKilwZWVyOworCVRSQUNFX0VOVFJZKCIlcCAlcCAlcCIsIHBlZXIsIHRvX3JlY2VpdmUsIHRvX3NlbmQpOworCUNIRUNLX1BBUkFNUyhDSEVDS19QRUVSKHBlZXIpKTsKKwkKKwlpZiAodG9fcmVjZWl2ZSkgeworCQlDSEVDS19QT1NJWCggcHRocmVhZF9tdXRleF9sb2NrKCZwLT5wX3NyLm10eCkgKTsKKwkJKnRvX3JlY2VpdmUgPSBwLT5wX3NyLmNudDsKKwkJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZwLT5wX3NyLm10eCkgKTsKKwl9CisJaWYgKHRvX3NlbmQpIHsKKwkJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfbXV0ZXhfbG9jaygmcC0+cF9zdGF0ZV9tdHgpICk7CisJCSp0b19zZW5kID0gcC0+cF9yZXFpbl9jb3VudDsKKwkJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZwLT5wX3N0YXRlX210eCkgKTsKKwl9CisJCisJcmV0dXJuIDA7Cit9CisKKworLyogRGVzdHJveSBhIHN0cnVjdHVyZSBvbmNlIGNsZWFudXBzIGhhdmUgYmVlbiBwZXJmb3JtZWQgKGZkX3BzbV9hYm9yZCwgLi4uKSAqLworaW50IGZkX3BlZXJfZnJlZShzdHJ1Y3QgZmRfcGVlciAqKiBwdHIpCit7CisJc3RydWN0IGZkX3BlZXIgKnA7CisJCisJVFJBQ0VfRU5UUlkoIiVwIiwgcHRyKTsKKwlDSEVDS19QQVJBTVMocHRyKTsKKwlwID0gKnB0cjsKKwkqcHRyID0gTlVMTDsKKwlDSEVDS19QQVJBTVMocCk7CisJCisJQ0hFQ0tfUEFSQU1TKCBGRF9JU19MSVNUX0VNUFRZKCZwLT5wX2hkci5jaGFpbikgKTsKKwkKKwlmcmVlX251bGwocC0+cF9oZHIuaW5mby5waV9kaWFtaWQpOworCQorCWZyZWVfbnVsbChwLT5wX2hkci5pbmZvLmNvbmZpZy5waWNfcmVhbG0pOyAKKwlmcmVlX251bGwocC0+cF9oZHIuaW5mby5jb25maWcucGljX3ByaW9yaXR5KTsgCisJCisJZnJlZV9udWxsKHAtPnBfaGRyLmluZm8ucnVudGltZS5waXJfcmVhbG0pOworCWZyZWVfbnVsbChwLT5wX2hkci5pbmZvLnJ1bnRpbWUucGlyX3Byb2RuYW1lKTsKKwlmcmVlX2xpc3QoICZwLT5wX2hkci5pbmZvLnJ1bnRpbWUucGlyX2FwcHMgKTsKKwkKKwlmcmVlX2xpc3QoICZwLT5wX2hkci5pbmZvLnBpX2VuZHBvaW50cyApOworCQorCWZyZWVfbnVsbChwLT5wX2RiZ29yaWcpOworCQorCWZkX2xpc3RfdW5saW5rKCZwLT5wX2V4cGlyeSk7CisJZmRfbGlzdF91bmxpbmsoJnAtPnBfYWN0aXZlcyk7CisJCisJQ0hFQ0tfRkNUX0RPKCBmZF9maWZvX2RlbCgmcC0+cF90b3NlbmQpLCAvKiBjb250aW51ZSAqLyApOworCUNIRUNLX0ZDVF9ETyggZmRfZmlmb19kZWwoJnAtPnBfdG9mYWlsb3ZlciksIC8qIGNvbnRpbnVlICovICk7CisJQ0hFQ0tfUE9TSVhfRE8oIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmcC0+cF9zdGF0ZV9tdHgpLCAvKiBjb250aW51ZSAqLyk7CisJQ0hFQ0tfUE9TSVhfRE8oIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmcC0+cF9zci5tdHgpLCAvKiBjb250aW51ZSAqLyk7CisJQ0hFQ0tfUE9TSVhfRE8oIHB0aHJlYWRfY29uZF9kZXN0cm95KCZwLT5wX3NyLmNuZCksIC8qIGNvbnRpbnVlICovKTsKKwkKKwkvKiBJZiB0aGUgY2FsbGJhY2sgaXMgc3RpbGwgYXJvdW5kLi4uICovCisJaWYgKHAtPnBfY2IpCisJCSgqcC0+cF9jYikoTlVMTCwgcC0+cF9jYl9kYXRhKTsKKwkKKwkvKiBGcmVlIHRoZSBzdHJ1Y3R1cmUgKi8KKwlmcmVlKHApOworCXJldHVybiAwOworfQorCisvKiBUZXJtaW5hdGUgcGVlciBtb2R1bGUgKGRlc3Ryb3kgYWxsIHBlZXJzLCBmaXJzdCBnZW50bHksIHRoZW4gdmlvbGVudGx5KSAqLworaW50IGZkX3BlZXJfZmluaSgpCit7CisJc3RydWN0IGZkX2xpc3QgKiBsaTsKKwlzdHJ1Y3QgZmRfbGlzdCBwdXJnZSA9IEZEX0xJU1RfSU5JVElBTElaRVIocHVyZ2UpOyAvKiBTdG9yZSB6b21iaWUgcGVlcnMgaGVyZSAqLworCWludCBsaXN0X2VtcHR5OworCXN0cnVjdCB0aW1lc3BlYwl3YWl0X3VudGlsLCBub3c7CisJCisJVFJBQ0VfRU5UUlkoKTsKKwkKKwlDSEVDS19GQ1RfRE8oZmRfcF9leHBpX2ZpbmkoKSwgLyogY29udGludWUgKi8pOworCQorCVRSQUNFX0RFQlVHKElORk8sICJTZW5kaW5nIHRlcm1pbmF0ZSBzaWduYWwgdG8gYWxsIHBlZXIgY29ubmVjdGlvbnMiKTsKKwkKKwlDSEVDS19GQ1RfRE8oIHB0aHJlYWRfcndsb2NrX3dybG9jaygmZmRfZ19wZWVyc19ydyksIC8qIGNvbnRpbnVlICovICk7CisJZm9yIChsaSA9IGZkX2dfcGVlcnMubmV4dDsgbGkgIT0gJmZkX2dfcGVlcnM7IGxpID0gbGktPm5leHQpIHsKKwkJc3RydWN0IGZkX3BlZXIgKiBwZWVyID0gKHN0cnVjdCBmZF9wZWVyICopbGktPm87CisJCQorCQlpZiAoZmRfcGVlcl9nZXRzdGF0ZShwZWVyKSAhPSBTVEFURV9aT01CSUUpIHsKKwkJCUNIRUNLX0ZDVF9ETyggZmRfcHNtX3Rlcm1pbmF0ZShwZWVyLCAiUkVCT09USU5HIiksIC8qIGNvbnRpbnVlICovICk7CisJCX0gZWxzZSB7CisJCQlsaSA9IGxpLT5wcmV2OyAvKiB0byBhdm9pZCBicmVha2luZyB0aGUgbG9vcCAqLworCQkJZmRfbGlzdF91bmxpbmsoJnBlZXItPnBfaGRyLmNoYWluKTsKKwkJCWZkX2xpc3RfaW5zZXJ0X2JlZm9yZSgmcHVyZ2UsICZwZWVyLT5wX2hkci5jaGFpbik7CisJCX0KKwl9CisJbGlzdF9lbXB0eSA9IEZEX0lTX0xJU1RfRU1QVFkoJmZkX2dfcGVlcnMpOworCUNIRUNLX0ZDVF9ETyggcHRocmVhZF9yd2xvY2tfdW5sb2NrKCZmZF9nX3BlZXJzX3J3KSwgLyogY29udGludWUgKi8gKTsKKwkKKwlpZiAoIWxpc3RfZW1wdHkpIHsKKwkJQ0hFQ0tfU1lTKCAgY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJm5vdykgICk7CisJCWZkX3BzbV9zdGFydCgpOyAvKiBqdXN0IGluIGNhc2UgKi8KKwkJVFJBQ0VfREVCVUcoSU5GTywgIldhaXRpbmcgZm9yIGNvbm5lY3Rpb25zIHNodXRkb3duLi4uICglZCBzZWMgbWF4KSIsIERQUl9USU1FT1VUICsgMSk7CisJCXdhaXRfdW50aWwudHZfc2VjICA9IG5vdy50dl9zZWMgKyBEUFJfVElNRU9VVCArIDE7CisJCXdhaXRfdW50aWwudHZfbnNlYyA9IG5vdy50dl9uc2VjOworCX0KKwkKKwl3aGlsZSAoKCFsaXN0X2VtcHR5KSAmJiAoVFNfSVNfSU5GRVJJT1IoJm5vdywgJndhaXRfdW50aWwpKSkgeworCQkKKwkJLyogQWxsb3cgdGhlIFBTTShzKSB0byBleGVjdXRlICovCisJCXVzbGVlcCgxMDAwMDApOworCQkKKwkJLyogUmVtb3ZlIHpvbWJpZSBwZWVycyAqLworCQlDSEVDS19GQ1RfRE8oIHB0aHJlYWRfcndsb2NrX3dybG9jaygmZmRfZ19wZWVyc19ydyksIC8qIGNvbnRpbnVlICovICk7CisJCWZvciAobGkgPSBmZF9nX3BlZXJzLm5leHQ7IGxpICE9ICZmZF9nX3BlZXJzOyBsaSA9IGxpLT5uZXh0KSB7CisJCQlzdHJ1Y3QgZmRfcGVlciAqIHBlZXIgPSAoc3RydWN0IGZkX3BlZXIgKilsaS0+bzsKKwkJCWlmIChmZF9wZWVyX2dldHN0YXRlKHBlZXIpID09IFNUQVRFX1pPTUJJRSkgeworCQkJCWxpID0gbGktPnByZXY7IC8qIHRvIGF2b2lkIGJyZWFraW5nIHRoZSBsb29wICovCisJCQkJZmRfbGlzdF91bmxpbmsoJnBlZXItPnBfaGRyLmNoYWluKTsKKwkJCQlmZF9saXN0X2luc2VydF9iZWZvcmUoJnB1cmdlLCAmcGVlci0+cF9oZHIuY2hhaW4pOworCQkJfQorCQl9CisJCWxpc3RfZW1wdHkgPSBGRF9JU19MSVNUX0VNUFRZKCZmZF9nX3BlZXJzKTsKKwkJQ0hFQ0tfRkNUX0RPKCBwdGhyZWFkX3J3bG9ja191bmxvY2soJmZkX2dfcGVlcnNfcncpLCAvKiBjb250aW51ZSAqLyApOworCQlDSEVDS19TWVMoICBjbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmbm93KSAgKTsKKwl9CisJCisJaWYgKCFsaXN0X2VtcHR5KSB7CisJCVRSQUNFX0RFQlVHKElORk8sICJGb3JjaW5nIGNvbm5lY3Rpb25zIHNodXRkb3duIik7CisJCUNIRUNLX0ZDVF9ETyggcHRocmVhZF9yd2xvY2tfd3Jsb2NrKCZmZF9nX3BlZXJzX3J3KSwgLyogY29udGludWUgKi8gKTsKKwkJd2hpbGUgKCFGRF9JU19MSVNUX0VNUFRZKCZmZF9nX3BlZXJzKSkgeworCQkJc3RydWN0IGZkX3BlZXIgKiBwZWVyID0gKHN0cnVjdCBmZF9wZWVyICopKGZkX2dfcGVlcnMubmV4dC0+byk7CisJCQlmZF9wc21fYWJvcmQocGVlcik7CisJCQlmZF9saXN0X3VubGluaygmcGVlci0+cF9oZHIuY2hhaW4pOworCQkJZmRfbGlzdF9pbnNlcnRfYmVmb3JlKCZwdXJnZSwgJnBlZXItPnBfaGRyLmNoYWluKTsKKwkJfQorCQlDSEVDS19GQ1RfRE8oIHB0aHJlYWRfcndsb2NrX3VubG9jaygmZmRfZ19wZWVyc19ydyksIC8qIGNvbnRpbnVlICovICk7CisJfQorCQorCS8qIEZyZWUgbWVtb3J5IG9iamVjdHMgb2YgYWxsIHBlZXJzICovCisJd2hpbGUgKCFGRF9JU19MSVNUX0VNUFRZKCZwdXJnZSkpIHsKKwkJc3RydWN0IGZkX3BlZXIgKiBwZWVyID0gKHN0cnVjdCBmZF9wZWVyICopKHB1cmdlLm5leHQtPm8pOworCQlmZF9saXN0X3VubGluaygmcGVlci0+cF9oZHIuY2hhaW4pOworCQlmZF9wZWVyX2ZyZWUoJnBlZXIpOworCX0KKwkKKwkvKiBOb3cgZW1wdHkgdGhlIHZhbGlkYXRvcnMgbGlzdCAqLworCUNIRUNLX0ZDVF9ETyggcHRocmVhZF9yd2xvY2tfd3Jsb2NrKCZ2YWxpZGF0b3JzX3J3KSwgLyogY29udGludWUgKi8gKTsKKwl3aGlsZSAoIUZEX0lTX0xJU1RfRU1QVFkoICZ2YWxpZGF0b3JzICkpIHsKKwkJc3RydWN0IGZkX2xpc3QgKiB2ID0gdmFsaWRhdG9ycy5uZXh0OworCQlmZF9saXN0X3VubGluayh2KTsKKwkJZnJlZSh2KTsKKwl9CisJQ0hFQ0tfRkNUX0RPKCBwdGhyZWFkX3J3bG9ja191bmxvY2soJnZhbGlkYXRvcnNfcncpLCAvKiBjb250aW51ZSAqLyApOworCQorCXJldHVybiAwOworfQorCisvKiBEdW1wIGluZm8gb2Ygb25lIHBlZXIgKi8KK0RFQ0xBUkVfRkRfRFVNUF9QUk9UT1RZUEUoZmRfcGVlcl9kdW1wLCBzdHJ1Y3QgcGVlcl9oZHIgKiBwLCBpbnQgZGV0YWlscykKK3sKKwlGRF9EVU1QX0hBTkRMRV9PRkZTRVQoKTsKKwkKKwlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICJ7cGVlcn0oQCVwKTogIiwgcCksIHJldHVybiBOVUxMKTsKKwkKKwlpZiAoIUNIRUNLX1BFRVIocCkpIHsKKwkJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9kdW1wX2V4dGVuZCggRkRfRFVNUF9TVERfUEFSQU1TLCAiSU5WQUxJRC9OVUxMIiksIHJldHVybiBOVUxMKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgZmRfcGVlciAqIHBlZXIgPSAoc3RydWN0IGZkX3BlZXIgKilwOworCQkKKwkJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9kdW1wX2V4dGVuZCggRkRfRFVNUF9TVERfUEFSQU1TLCAiJXMgWyVzLCBjbnQ6JWxkc3IsJWxkcGFdIiwgcGVlci0+cF9oZHIuaW5mby5waV9kaWFtaWQsIFNUQVRFX1NUUihmZF9wZWVyX2dldHN0YXRlKHBlZXIpKSwgcGVlci0+cF9zci5jbnQsIHBlZXItPnBfcmVxaW5fY291bnQpLCByZXR1cm4gTlVMTCk7CisJCWlmIChkZXRhaWxzID4gMCkgeworCQkJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9kdW1wX2V4dGVuZCggRkRfRFVNUF9TVERfUEFSQU1TLCAiIHJsbTolcyIsIHBlZXItPnBfaGRyLmluZm8ucnVudGltZS5waXJfcmVhbG0gPzogIjx1bmtub3duPiIpLCByZXR1cm4gTlVMTCk7CisJCQlpZiAocGVlci0+cF9oZHIuaW5mby5ydW50aW1lLnBpcl9wcm9kbmFtZSkgeworCQkJCUNIRUNLX01BTExPQ19ETyggZmRfZHVtcF9leHRlbmQoIEZEX0RVTVBfU1REX1BBUkFNUywgIiBbJyVzJyAldV0iLCBwZWVyLT5wX2hkci5pbmZvLnJ1bnRpbWUucGlyX3Byb2RuYW1lLCBwZWVyLT5wX2hkci5pbmZvLnJ1bnRpbWUucGlyX2Zpcm1yZXYpLCByZXR1cm4gTlVMTCk7CisJCQl9CisJCX0KKwkJaWYgKGRldGFpbHMgPiAxKSB7CisJCQlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICIgW2Zyb206JXNdIGZsYWdzOiVzJXMlcyVzJXMlcyVzJXMgbGZ0OiVkcyIsIAorCQkJCXBlZXItPnBfZGJnb3JpZyA/OiAidW5zZXQiLAorCQkJCXBlZXItPnBfaGRyLmluZm8uY29uZmlnLnBpY19mbGFncy5wcm8zID09IFBJX1AzX0RFRkFVTFQgPyAiLSIgOgorCQkJCQkocGVlci0+cF9oZHIuaW5mby5jb25maWcucGljX2ZsYWdzLnBybzMgPT0gUElfUDNfSVAgPyAiNCIgOiAiNiIpLAorCQkJCXBlZXItPnBfaGRyLmluZm8uY29uZmlnLnBpY19mbGFncy5wcm80ID09IFBJX1A0X0RFRkFVTFQgPyAiLSIgOgorCQkJCQkocGVlci0+cF9oZHIuaW5mby5jb25maWcucGljX2ZsYWdzLnBybzQgPT0gUElfUDRfVENQID8gIlQiIDogIlMiKSwKKwkJCQlwZWVyLT5wX2hkci5pbmZvLmNvbmZpZy5waWNfZmxhZ3MuYWxnID8gIlAiIDogIi0iLAorCQkJCXBlZXItPnBfaGRyLmluZm8uY29uZmlnLnBpY19mbGFncy5zZWMgJiBQSV9TRUNfTk9ORSA/ICJOIiA6Ii0iLAorCQkJCXBlZXItPnBfaGRyLmluZm8uY29uZmlnLnBpY19mbGFncy5zZWMgJiBQSV9TRUNfVExTX09MRCA/ICJPIiA6Ii0iLAorCQkJCXBlZXItPnBfaGRyLmluZm8uY29uZmlnLnBpY19mbGFncy5zY3Rwc2VjICYgUElfU0NUUFNFQ18zNDM2ID8gIjMiIDoiLSIsCisJCQkJcGVlci0+cF9oZHIuaW5mby5jb25maWcucGljX2ZsYWdzLmV4cCA/ICJFIiA6ICItIiwKKwkJCQlwZWVyLT5wX2hkci5pbmZvLmNvbmZpZy5waWNfZmxhZ3MucGVyc2lzdCA/ICJQIiA6ICItIiwKKwkJCQlwZWVyLT5wX2hkci5pbmZvLmNvbmZpZy5waWNfbGZ0KSwgcmV0dXJuIE5VTEwpOworCQl9CisJCisJfQorCQorCXJldHVybiAqYnVmOworfQorCisvKiBEdW1wIHRoZSBsaXN0IG9mIHBlZXJzICovCitERUNMQVJFX0ZEX0RVTVBfUFJPVE9UWVBFKGZkX3BlZXJfZHVtcF9saXN0LCBpbnQgZGV0YWlscykKK3sKKwlzdHJ1Y3QgZmRfbGlzdCAqIGxpOworCUZEX0RVTVBfSEFORExFX09GRlNFVCgpOworCQorCUNIRUNLX0ZDVF9ETyggcHRocmVhZF9yd2xvY2tfcmRsb2NrKCZmZF9nX3BlZXJzX3J3KSwgLyogY29udGludWUgKi8gKTsKKwkKKwlmb3IgKGxpID0gZmRfZ19wZWVycy5uZXh0OyBsaSAhPSAmZmRfZ19wZWVyczsgbGkgPSBsaS0+bmV4dCkgeworCQlDSEVDS19NQUxMT0NfRE8oIGZkX3BlZXJfZHVtcChGRF9EVU1QX1NURF9QQVJBTVMsIChzdHJ1Y3QgcGVlcl9oZHIgKilsaS0+bywgZGV0YWlscyksIGJyZWFrKTsKKwkJaWYgKGxpLT5uZXh0ICE9ICZmZF9nX3BlZXJzKSB7CisJCQlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICJcbiIpLCBicmVhayk7CisJCX0KKwl9CisJCisJQ0hFQ0tfRkNUX0RPKCBwdGhyZWFkX3J3bG9ja191bmxvY2soJmZkX2dfcGVlcnNfcncpLCAvKiBjb250aW51ZSAqLyApOworCXJldHVybiAqYnVmOworfQorCitzdGF0aWMgc3RydWN0IGRpY3Rfb2JqZWN0ICphdnBfb2hfbW9kZWwgPSBOVUxMOworc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBjYWNoZV9hdnBfbG9jayA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CisKKy8qIEhhbmRsZSBhbiBpbmNvbWluZyBDRVIgcmVxdWVzdCBvbiBhIG5ldyBjb25uZWN0aW9uICovCitpbnQgZmRfcGVlcl9oYW5kbGVfbmV3Q0VSKCBzdHJ1Y3QgbXNnICoqIGNlciwgc3RydWN0IGNueGN0eCAqKiBjbnggKQoreworCXN0cnVjdCBtc2cgKiBtc2c7CisJc3RydWN0IGF2cCAqYXZwX29oOworCXN0cnVjdCBhdnBfaGRyICogYXZwX2hkcjsKKwlzdHJ1Y3QgZmRfbGlzdCAqIGxpLCAqbGlfaW5mOworCWludCBmb3VuZCA9IDA7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGZkX3BlZXIgKiBwZWVyOworCXN0cnVjdCBjbnhfaW5jb21pbmcgKiBldl9kYXRhOworCQorCVRSQUNFX0VOVFJZKCIlcCAlcCIsIGNlciwgY254KTsKKwlDSEVDS19QQVJBTVMoY2VyICYmICpjZXIgJiYgY254ICYmICpjbngpOworCQorCW1zZyA9ICpjZXI7IAorCQorCS8qIElmIG5lZWRlZCwgcmVzb2x2ZSB0aGUgZGljdGlvbmFyeSBtb2RlbCBmb3IgT3JpZ2luLUhvc3QgKi8KKwlDSEVDS19QT1NJWCggcHRocmVhZF9tdXRleF9sb2NrKCZjYWNoZV9hdnBfbG9jaykgKTsKKwlpZiAoIWF2cF9vaF9tb2RlbCkgeworCQlhdnBfY29kZV90IGNvZGUgPSBBQ19PUklHSU5fSE9TVDsKKwkJQ0hFQ0tfRkNUX0RPKCBmZF9kaWN0X3NlYXJjaCAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9DT0RFLCAmY29kZSwgJmF2cF9vaF9tb2RlbCwgRU5PRU5UKSwKKwkJCXsgTE9HX0UoIkNhbm5vdCBmaW5kIE9yaWdpbi1Ib3N0IEFWUCBkZWZpbml0aW9uIGluIHRoZSBkaWN0aW9uYXJ5ISIpOyAodm9pZCkgcHRocmVhZF9tdXRleF91bmxvY2soJmNhY2hlX2F2cF9sb2NrKTsgcmV0dXJuIF9fcmV0X187IH0gKTsKKwl9CisJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZjYWNoZV9hdnBfbG9jaykgKTsKKwkKKwkvKiBGaW5kIHRoZSBEaWFtZXRlciBJZGVudGl0eSBvZiB0aGUgcmVtb3RlIHBlZXIgaW4gdGhlIG1lc3NhZ2UgKi8KKwlDSEVDS19GQ1QoIGZkX21zZ19zZWFyY2hfYXZwICggbXNnLCBhdnBfb2hfbW9kZWwsICZhdnBfb2ggKSApOworCUFTU0VSVChhdnBfb2gpOyAvKiBvdGhlcndpc2UgaXQgc2hvdWxkIG5vdCBoYXZlIHBhc3NlZCBydWxlcyB2YWxpZGF0aW9uLCByaWdodD8gKi8KKwlDSEVDS19GQ1QoIGZkX21zZ19hdnBfaGRyICggYXZwX29oLCAmYXZwX2hkciApICk7CisJCisJLyogRmlyc3QsIGNoZWNrIGlmIHRoZSBPcmlnaW4tSG9zdCB2YWx1ZSBpcyB2YWxpZCAqLworCWlmICghZmRfb3NfaXNfdmFsaWRfRGlhbWV0ZXJJZGVudGl0eShhdnBfaGRyLT5hdnBfdmFsdWUtPm9zLmRhdGEsIGF2cF9oZHItPmF2cF92YWx1ZS0+b3MubGVuKSkgeworCQlDSEVDS19GQ1QoIGZkX21zZ19uZXdfYW5zd2VyX2Zyb21fcmVxICggZmRfZ19jb25maWctPmNuZl9kaWN0LCBjZXIsIE1TR0ZMX0FOU1dfRVJST1IgKSApOworCQlDSEVDS19GQ1QoIGZkX21zZ19yZXNjb2RlX3NldCgqY2VyLCAiRElBTUVURVJfSU5WQUxJRF9BVlBfVkFMVUUiLCAKKwkJCQkJCQkiWW91ciBPcmlnaW4tSG9zdCBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMuIiwgYXZwX29oLCAxICkgKTsKKwkJCisJCWZkX2hvb2tfY2FsbChIT09LX1BFRVJfQ09OTkVDVF9GQUlMRUQsICpjZXIsIE5VTEwsICJSZWNlaXZlZCBDRVIgd2l0aCBpbnZhbGlkIE9yaWdpbi1Ib3N0IEFWUCIsIE5VTEwpOworCQkKKwkJQ0hFQ0tfRkNUKCBmZF9vdXRfc2VuZChjZXIsICpjbngsIE5VTEwsIDApICk7CisJCXJldHVybiBFSU5WQUw7CisJfQorCQorCS8qIFNlYXJjaCBpZiB3ZSBhbHJlYWR5IGhhdmUgdGhpcyBwZWVyIGlkIGluIG91ciBsaXN0LiBXZSB0YWtlIGRpcmVjdGx5IHRoZSB3cml0ZSBsb2NrIHNvIHRoYXQgd2UgZG9uJ3QgbmVlZCB0byB1cGdyYWRlIGlmIGl0IGlzIGEgbmV3IHBlZXIuCisJICogVGhlcmUgaXMgc3BhY2UgZm9yIGEgc21hbGwgb3B0aW1pemF0aW9uIGhlcmUgaWYgbmVlZGVkLgorCSAqLworCUNIRUNLX1BPU0lYKCBwdGhyZWFkX3J3bG9ja193cmxvY2soJmZkX2dfcGVlcnNfcncpICk7CisJCisJbGlfaW5mID0gJmZkX2dfcGVlcnM7CisJZm9yIChsaSA9IGZkX2dfcGVlcnMubmV4dDsgbGkgIT0gJmZkX2dfcGVlcnM7IGxpID0gbGktPm5leHQpIHsKKwkJaW50IGNtcCwgY29udDsKKwkJcGVlciA9IChzdHJ1Y3QgZmRfcGVlciAqKWxpOworCQljbXAgPSBmZF9vc19hbG1vc3RjYXNlc3JjaCggYXZwX2hkci0+YXZwX3ZhbHVlLT5vcy5kYXRhLCBhdnBfaGRyLT5hdnBfdmFsdWUtPm9zLmxlbiwgcGVlci0+cF9oZHIuaW5mby5waV9kaWFtaWQsIHBlZXItPnBfaGRyLmluZm8ucGlfZGlhbWlkbGVuLCAmY29udCApOworCQlpZiAoY21wID4gMCkgeworCQkJbGlfaW5mID0gbGk7CisJCX0KKwkJaWYgKGNtcCA9PSAwKSB7CisJCQlmb3VuZCA9IDE7CisJCQlicmVhazsKKwkJfQorCQlpZiAoIWNvbnQpCisJCQlicmVhazsKKwl9CisJCisJaWYgKCFmb3VuZCkgeworCQkvKiBDcmVhdGUgYSBuZXcgcGVlciBlbnRyeSBmb3IgdGhpcyBuZXcgcmVtb3RlIHBlZXIgKi8KKwkJcGVlciA9IE5VTEw7CisJCUNIRUNLX0ZDVF9ETyggcmV0ID0gZmRfcGVlcl9hbGxvYygmcGVlciksIGdvdG8gb3V0ICk7CisJCQorCQkvKiBTZXQgdGhlIHBlZXIgRGlhbWV0ZXIgSWQgYW5kIHRoZSByZXNwb25kZXIgZmxhZyBwYXJhbWV0ZXJzICovCisJCUNIRUNLX01BTExPQ19ETyggcGVlci0+cF9oZHIuaW5mby5waV9kaWFtaWQgPSBvczBkdXAoYXZwX2hkci0+YXZwX3ZhbHVlLT5vcy5kYXRhLCBhdnBfaGRyLT5hdnBfdmFsdWUtPm9zLmxlbiksIAorCQkJeyByZXQgPSBFTk9NRU07IGdvdG8gb3V0OyB9ICk7CisJCXBlZXItPnBfaGRyLmluZm8ucGlfZGlhbWlkbGVuID0gYXZwX2hkci0+YXZwX3ZhbHVlLT5vcy5sZW47CisJCUNIRUNLX01BTExPQ19ETyggcGVlci0+cF9kYmdvcmlnID0gc3RyZHVwKGZkX2NueF9nZXRpZCgqY254KSksIHsgcmV0ID0gRU5PTUVNOyBnb3RvIG91dDsgfSApOworCQlwZWVyLT5wX2ZsYWdzLnBmX3Jlc3BvbmRlciA9IDE7CisJCXBlZXItPnBfZmxhZ3MucGZfZGVsZXRlID0gMTsKKwkJCisJCUxPR19EKCJDcmVhdGVkIG5ldyBwZWVyIG9iamVjdCBmb3IgaW5jb21pbmcgQ0VSOiAlcyIsIHBlZXItPnBfaGRyLmluZm8ucGlfZGlhbWlkKTsKKwkJCisjaWZuZGVmIERJU0FCTEVfUEVFUl9FWFBJUlkKKwkJLyogU2V0IHRoaXMgcGVlciB0byBleHBpcmUgb24gaW5hY3Rpdml0eSAqLworCQlwZWVyLT5wX2hkci5pbmZvLmNvbmZpZy5waWNfZmxhZ3MuZXhwIAk9IFBJX0VYUF9JTkFDVElWRTsKKwkJcGVlci0+cF9oZHIuaW5mby5jb25maWcucGljX2xmdAkJPSAzNjAwOwkvKiAxIGhvdXIgd2l0aG91dCBhbnkgbWVzc2FnZSAKKwkJLS0gUkZDMzUzOSBzdGF0ZXMgdGhhdCB0aGlzIG11c3Qgbm90IGJlIGluZmVyaW9yIHRvIEJSSU5HRE9XTl9JTlRFUlZBTCA9IDUgbWludXRlcyAqLworCQkKKwkJQ0hFQ0tfRkNUX0RPKCByZXQgPSBmZF9wX2V4cGlfdXBkYXRlKCBwZWVyICksIGdvdG8gb3V0ICk7CisjZW5kaWYgLyogRElTQUJMRV9QRUVSX0VYUElSWSAqLworCQkKKwkJLyogSW5zZXJ0IHRoZSBuZXcgcGVlciBpbiB0aGUgbGlzdCAodGhlIFBTTSB3aWxsIHRha2UgY2FyZSBvZiBzZXR0aW5nIHRoZSBleHBpcnkgYWZ0ZXIgdmFsaWRhdGlvbikgKi8KKwkJZmRfbGlzdF9pbnNlcnRfYWZ0ZXIoIGxpX2luZiwgJnBlZXItPnBfaGRyLmNoYWluICk7CisJCQorCQkvKiBTdGFydCB0aGUgUFNNLCB3aGljaCB3aWxsIHJlY2VpdmUgdGhlIGV2ZW50IGJlbG93ICovCisJCUNIRUNLX0ZDVF9ETyggcmV0ID0gZmRfcHNtX2JlZ2luKHBlZXIpLCBnb3RvIG91dCApOworCX0gZWxzZSB7CisJCS8qIENoZWNrIGlmIHRoZSBwZWVyIGlzIGluIHpvbWJpZSBzdGF0ZSAqLworCQlpZiAoZmRfcGVlcl9nZXRzdGF0ZShwZWVyKSA9PSBTVEFURV9aT01CSUUpIHsKKwkJCS8qIFJlLWFjdGl2YXRlIHRoZSBwZWVyICovCisJCQlpZiAocGVlci0+cF9oZHIuaW5mby5jb25maWcucGljX2ZsYWdzLmV4cCkKKwkJCQlwZWVyLT5wX2ZsYWdzLnBmX3Jlc3BvbmRlciA9IDE7CisJCQlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9tdXRleF9sb2NrKCZwZWVyLT5wX3N0YXRlX210eCksICk7CisJCQlwZWVyLT5wX3N0YXRlID0gU1RBVEVfTkVXOworCQkJQ0hFQ0tfUE9TSVhfRE8oIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZwZWVyLT5wX3N0YXRlX210eCksICk7CisJCQlwZWVyLT5wX2ZsYWdzLnBmX2xvY2FsdGVybSA9IDA7CisJCQlDSEVDS19GQ1RfRE8oIHJldCA9IGZkX3BzbV9iZWdpbihwZWVyKSwgZ290byBvdXQgKTsKKwkJfQorCX0KKwkKKwkvKiBTZW5kIHRoZSBuZXcgY29ubmVjdGlvbiBldmVudCB0byB0aGUgUFNNICovCisJQ0hFQ0tfTUFMTE9DX0RPKCBldl9kYXRhID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgY254X2luY29taW5nKSksIHsgcmV0ID0gRU5PTUVNOyBnb3RvIG91dDsgfSApOworCW1lbXNldChldl9kYXRhLCAwLCBzaXplb2YoKmV2X2RhdGEpKTsKKwkKKwlldl9kYXRhLT5jZXIgPSBtc2c7CisJZXZfZGF0YS0+Y254ID0gKmNueDsKKwlldl9kYXRhLT52YWxpZGF0ZSA9ICFmb3VuZDsKKwkKKwlDSEVDS19GQ1RfRE8oIHJldCA9IGZkX2V2ZW50X3NlbmQocGVlci0+cF9ldmVudHMsIEZERVZQX0NOWF9JTkNPTUlORywgc2l6ZW9mKCpldl9kYXRhKSwgZXZfZGF0YSksIGdvdG8gb3V0ICk7CisJCitvdXQ6CQorCUNIRUNLX1BPU0lYKCBwdGhyZWFkX3J3bG9ja191bmxvY2soJmZkX2dfcGVlcnNfcncpICk7CisKKwlpZiAocmV0ID09IDApIHsKKwkJLyogUmVzZXQgdGhlICJvdXQiIHBhcmFtZXRlcnMsIHNvIHRoYXQgdGhleSBhcmUgbm90IGNsZWFudXAgb24gZnVuY3Rpb24gcmV0dXJuLiAqLworCQkqY2VyID0gTlVMTDsKKwkJKmNueCA9IE5VTEw7CisJfSBlbHNlIHsKKwkJY2hhciBidWZbMTAyNF07CisJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBwcm9jZXNzaW5nIG5ldyBpbmNvbWluZyBDRVI6ICVzIiwgc3RyZXJyb3IocmV0KSk7CisJCWZkX2hvb2tfY2FsbChIT09LX1BFRVJfQ09OTkVDVF9GQUlMRUQsICpjZXIsIE5VTEwsIGJ1ZiwgTlVMTCk7CisJfQorCQorCXJldHVybiByZXQ7Cit9CisKKy8qIFNhdmUgYSBjYWxsYmFjayB0byBhY2NlcHQgLyByZWplY3QgaW5jb21pbmcgdW5rbm93biBwZWVycyAqLworaW50IGZkX3BlZXJfdmFsaWRhdGVfcmVnaXN0ZXIgKCBpbnQgKCpwZWVyX3ZhbGlkYXRlKShzdHJ1Y3QgcGVlcl9pbmZvICogLyogaW5mbyAqLywgaW50ICogLyogYXV0aCAqLywgaW50ICgqKmNiMikoc3RydWN0IHBlZXJfaW5mbyAqKSkgKQoreworCXN0cnVjdCBmZF9saXN0ICogdjsKKwkKKwlUUkFDRV9FTlRSWSgiJXAiLCBwZWVyX3ZhbGlkYXRlKTsKKwlDSEVDS19QQVJBTVMocGVlcl92YWxpZGF0ZSk7CisJCisJLyogQWxsb2MgYSBuZXcgZW50cnkgKi8KKwlDSEVDS19NQUxMT0MoIHYgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBmZF9saXN0KSkgKTsKKwlmZF9saXN0X2luaXQoIHYsIHBlZXJfdmFsaWRhdGUgKTsKKwkKKwkvKiBBZGQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdCAqLworCUNIRUNLX0ZDVCggcHRocmVhZF9yd2xvY2tfd3Jsb2NrKCZ2YWxpZGF0b3JzX3J3KSApOworCWZkX2xpc3RfaW5zZXJ0X2FmdGVyKCZ2YWxpZGF0b3JzLCB2KTsKKwlDSEVDS19GQ1QoIHB0aHJlYWRfcndsb2NrX3VubG9jaygmdmFsaWRhdG9yc19ydykpOworCQorCS8qIERvbmUhICovCisJcmV0dXJuIDA7Cit9CisKKy8qIFZhbGlkYXRlIGEgcGVlciBieSBjYWxsaW5nIHRoZSBjYWxsYmFja3MgaW4gdHVybiAtLSByZXR1cm4gMCBpZiB0aGUgcGVlciBpcyB2YWxpZGF0ZWQsICEgMCBpbiBjYXNlIG9mIGVycm9yICg+MCkgb3IgaWYgdGhlIHBlZXIgaXMgcmVqZWN0ZWQgKC0xKSAqLworaW50IGZkX3BlZXJfdmFsaWRhdGUoIHN0cnVjdCBmZF9wZWVyICogcGVlciApCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGZkX2xpc3QgKiB2OworCQorCUNIRUNLX0ZDVCggcHRocmVhZF9yd2xvY2tfcmRsb2NrKCZ2YWxpZGF0b3JzX3J3KSApOworCWZvciAodiA9IHZhbGlkYXRvcnMubmV4dDsgdiAhPSAmdmFsaWRhdG9yczsgdiA9IHYtPm5leHQpIHsKKwkJaW50IGF1dGggPSAwOworCQlwdGhyZWFkX2NsZWFudXBfcHVzaChmZF9jbGVhbnVwX3J3bG9jaywgJnZhbGlkYXRvcnNfcncpOworCQlDSEVDS19GQ1RfRE8oIHJldCA9ICgoaW50KCopKHN0cnVjdCBwZWVyX2luZm8gKiwgaW50ICosIGludCAoKiopKHN0cnVjdCBwZWVyX2luZm8gKikpKSh2LT5vKSkgKCZwZWVyLT5wX2hkci5pbmZvLCAmYXV0aCwgJnBlZXItPnBfY2IyKSwgICk7CisJCXB0aHJlYWRfY2xlYW51cF9wb3AoMCk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dDsKKwkJaWYgKGF1dGgpIHsKKwkJCXJldCA9IChhdXRoID4gMCkgPyAwIDogLTE7CisJCQlnb3RvIG91dDsKKwkJfQorCQlwZWVyLT5wX2NiMiA9IE5VTEw7CisJfQorCQorCS8qIE5vIGNhbGxiYWNrIGhhcyBnaXZlbiBhIGZpcm0gcmVzdWx0LCB0aGUgZGVmYXVsdCBpcyB0byByZWplY3QgKi8KKwlyZXQgPSAtMTsKK291dDoKKwlDSEVDS19GQ1QoIHB0aHJlYWRfcndsb2NrX3VubG9jaygmdmFsaWRhdG9yc19ydykpOworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9saWJmZGNvcmUvcXVldWVzLmMgYi9saWJmZGNvcmUvcXVldWVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMxN2QzNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmZkY29yZS9xdWV1ZXMuYwpAQCAtMCwwICsxLDg0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxMywgV0lERSBQcm9qZWN0IGFuZCBOSUNUCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBXSURFIFByb2plY3Qgb3IgTklDVCBub3IgdGhlIAkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFdJREUgUHJvamVjdCBhbmQgCQkJCQkJICoKKyogICBOSUNULgkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJmZGNvcmUtaW50ZXJuYWwuaCIKKworLyogVGhlIGdsb2JhbCBtZXNzYWdlIHF1ZXVlcyAqLworc3RydWN0IGZpZm8gKiBmZF9nX2luY29taW5nID0gTlVMTDsKK3N0cnVjdCBmaWZvICogZmRfZ19vdXRnb2luZyA9IE5VTEw7CitzdHJ1Y3QgZmlmbyAqIGZkX2dfbG9jYWwgPSBOVUxMOworCisvKiBJbml0aWFsaXplIHRoZSBtZXNzYWdlIHF1ZXVlcy4gKi8KK2ludCBmZF9xdWV1ZXNfaW5pdCh2b2lkKQoreworCVRSQUNFX0VOVFJZKCk7CisJQ0hFQ0tfRkNUKCBmZF9maWZvX25ldyAoICZmZF9nX2luY29taW5nLCAyMCApICk7CisJQ0hFQ0tfRkNUKCBmZF9maWZvX25ldyAoICZmZF9nX291dGdvaW5nLCAzMCApICk7CisJQ0hFQ0tfRkNUKCBmZF9maWZvX25ldyAoICZmZF9nX2xvY2FsLCAyNSApICk7CisJcmV0dXJuIDA7Cit9CisKKy8qIERlc3Ryb3kgYSBxdWV1ZSBhZnRlciBlbXB0eWluZyBpdCAoYW5kIGR1bXBpbmcgdGhlIGNvbnRlbnQpICovCitpbnQgZmRfcXVldWVzX2Zpbmkoc3RydWN0IGZpZm8gKiogcXVldWUpCit7CisJc3RydWN0IG1zZyAqIG1zZzsKKwlpbnQgcmV0ID0gMDsKKwkKKwlUUkFDRV9FTlRSWSgiJXAiLCBxdWV1ZSk7CisJCisJLyogTm90ZSA6IHRoZSB0aHJlYWRzIHRoYXQgcG9zdCBpbnRvIHRoaXMgcXVldWUgc2hvdWxkIGFscmVhZHkgYmVlbiBzdG9wcGVkIGJlZm9yZSB0aGlzICEhISAqLworCQorCUNIRUNLX1BBUkFNUyhxdWV1ZSk7CisJaWYgKCpxdWV1ZSA9PSBOVUxMKQorCQlyZXR1cm4gMDsgLyogdGhlIHF1ZXVlIHdhcyBub3QgYWxyZWFkeSBpbml0aWFsaXplZCAqLworCisJLyogRW1wdHkgYWxsIGNvbnRlbnRzICovCisJd2hpbGUgKDEpIHsKKwkJLyogQ2hlY2sgaWYgdGhlcmUgaXMgYSBtZXNzYWdlIGluIHRoZSBxdWV1ZSAqLworCQlyZXQgPSBmZF9maWZvX3RyeWdldCgqcXVldWUsICZtc2cpOworCQlpZiAocmV0ID09IEVXT1VMREJMT0NLKQorCQkJYnJlYWs7CisJCUNIRUNLX0ZDVChyZXQpOworCQkKKwkJLyogV2UgZ290IG9uZSEgKi8KKwkJZmRfaG9va19jYWxsKEhPT0tfTUVTU0FHRV9EUk9QUEVELCBtc2csIE5VTEwsICJNZXNzYWdlIGxvc3QgYmVjYXVzZSBmcmFtZXdvcmsgaXMgdGVybWluYXRpbmcuIiwgZmRfbXNnX3BtZGxfZ2V0KG1zZykpOworCQlmZF9tc2dfZnJlZShtc2cpOworCX0KKwkKKwkvKiBOb3csIGRlbGV0ZSB0aGUgZW1wdHkgcXVldWUgKi8KKwlDSEVDS19GQ1QoIGZkX2ZpZm9fZGVsICggcXVldWUgKSApOworCQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliZmRjb3JlL3JvdXRpbmdfZGlzcGF0Y2guYyBiL2xpYmZkY29yZS9yb3V0aW5nX2Rpc3BhdGNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNkZjA2NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmZkY29yZS9yb3V0aW5nX2Rpc3BhdGNoLmMKQEAgLTAsMCArMSwxMzI4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxNSwgV0lERSBQcm9qZWN0IGFuZCBOSUNUCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBXSURFIFByb2plY3Qgb3IgTklDVCBub3IgdGhlIAkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFdJREUgUHJvamVjdCBhbmQgCQkJCQkJICoKKyogICBOSUNULgkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJmZGNvcmUtaW50ZXJuYWwuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgIEZpcnN0IHBhcnQgOiBoYW5kbGluZyB0aGUgZXh0ZW5zaW9ucyBjYWxsYmFja3MgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBMaXN0cyBvZiB0aGUgY2FsbGJhY2tzLCBhbmQgbG9ja3MgdG8gcHJvdGVjdCB0aGVtICovCitzdGF0aWMgcHRocmVhZF9yd2xvY2tfdCBydF9md2RfbG9jayA9IFBUSFJFQURfUldMT0NLX0lOSVRJQUxJWkVSOworc3RhdGljIHN0cnVjdCBmZF9saXN0IAlydF9md2RfbGlzdCA9IEZEX0xJU1RfSU5JVElBTElaRVJfTyhydF9md2RfbGlzdCwgJnJ0X2Z3ZF9sb2NrKTsKKworc3RhdGljIHB0aHJlYWRfcndsb2NrX3QgcnRfb3V0X2xvY2sgPSBQVEhSRUFEX1JXTE9DS19JTklUSUFMSVpFUjsKK3N0YXRpYyBzdHJ1Y3QgZmRfbGlzdCAJcnRfb3V0X2xpc3QgPSBGRF9MSVNUX0lOSVRJQUxJWkVSX08ocnRfb3V0X2xpc3QsICZydF9vdXRfbG9jayk7CisKKy8qIEl0ZW1zIGluIHRoZSBsaXN0cyBhcmUgdGhlIHNhbWUgKi8KK3N0cnVjdCBydF9oZGwgeworCXN0cnVjdCBmZF9saXN0CWNoYWluOwkvKiBsaW5rIGluIHRoZSBydF9md2RfbGlzdCBvciBydF9vdXRfbGlzdCAqLworCXZvaWQgKgkJY2JkYXRhOwkvKiB0aGUgcmVnaXN0ZXJlZCBkYXRhICovCisJdW5pb24geworCQlpbnQJb3JkZXI7CS8qIFRoaXMgdmFsdWUgaXMgdXNlZCB0byBzb3J0IHRoZSBsaXN0ICovCisJCWludCAJZGlyOwkvKiBJdCBpcyB0aGUgZGlyZWN0aW9uIGZvciBGV0QgaGFuZGxlcnMgKi8KKwkJaW50CXByaW87CS8qIGFuZCB0aGUgcHJpb3JpdHkgZm9yIE9VVCBoYW5kbGVycyAqLworCX07CisJdW5pb24geworCQlpbnQgKCpydF9md2RfY2IpKHZvaWQgKiBjYmRhdGEsIHN0cnVjdCBtc2cgKiogbXNnKTsKKwkJaW50ICgqcnRfb3V0X2NiKSh2b2lkICogY2JkYXRhLCBzdHJ1Y3QgbXNnICoqIG1zZywgc3RydWN0IGZkX2xpc3QgKiBjYW5kaWRhdGVzKTsKKwl9OworfTsJCisKKy8qIEFkZCBhIG5ldyBlbnRyeSBpbiB0aGUgbGlzdCAqLworc3RhdGljIGludCBhZGRfb3JkZXJlZChzdHJ1Y3QgcnRfaGRsICogbmV3LCBzdHJ1Y3QgZmRfbGlzdCAqIGxpc3QpCit7CisJLyogVGhlIGxpc3QgaXMgb3JkZXJlZCBieSBwcmlvIHBhcmFtZXRlciAqLworCXN0cnVjdCBmZF9saXN0ICogbGk7CisJCisJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfcndsb2NrX3dybG9jayhsaXN0LT5vKSApOworCQorCWZvciAobGkgPSBsaXN0LT5uZXh0OyBsaSAhPSBsaXN0OyBsaSA9IGxpLT5uZXh0KSB7CisJCXN0cnVjdCBydF9oZGwgKiBoID0gKHN0cnVjdCBydF9oZGwgKikgbGk7CisJCWlmIChuZXctPm9yZGVyIDw9IGgtPm9yZGVyKQorCQkJYnJlYWs7CisJfQorCQorCWZkX2xpc3RfaW5zZXJ0X2JlZm9yZShsaSwgJm5ldy0+Y2hhaW4pOworCQorCUNIRUNLX1BPU0lYKCBwdGhyZWFkX3J3bG9ja191bmxvY2sobGlzdC0+bykgKTsKKwkKKwlyZXR1cm4gMDsKK30KKworLyogUmVnaXN0ZXIgYSBuZXcgRldEIGNhbGxiYWNrICovCitpbnQgZmRfcnRfZndkX3JlZ2lzdGVyICggaW50ICgqcnRfZndkX2NiKSh2b2lkICogY2JkYXRhLCBzdHJ1Y3QgbXNnICoqIG1zZyksIHZvaWQgKiBjYmRhdGEsIGVudW0gZmRfcnRfZndkX2RpciBkaXIsIHN0cnVjdCBmZF9ydF9md2RfaGRsICoqIGhhbmRsZXIgKQoreworCXN0cnVjdCBydF9oZGwgKiBuZXc7CisJCisJVFJBQ0VfRU5UUlkoIiVwICVwICVkICVwIiwgcnRfZndkX2NiLCBjYmRhdGEsIGRpciwgaGFuZGxlcik7CisJQ0hFQ0tfUEFSQU1TKCBydF9md2RfY2IgKTsKKwlDSEVDS19QQVJBTVMoIChkaXIgPj0gUlRfRldEX1JFUSkgJiYgKCBkaXIgPD0gUlRfRldEX0FOUykgKTsKKwkKKwkvKiBDcmVhdGUgYSBuZXcgY29udGFpbmVyICovCisJQ0hFQ0tfTUFMTE9DKG5ldyA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHJ0X2hkbCkpKTsKKwltZW1zZXQobmV3LCAwLCBzaXplb2Yoc3RydWN0IHJ0X2hkbCkpOworCQorCS8qIFdyaXRlIHRoZSBjb250ZW50ICovCisJZmRfbGlzdF9pbml0KCZuZXctPmNoYWluLCBOVUxMKTsKKwluZXctPmNiZGF0YSAJPSBjYmRhdGE7CisJbmV3LT5kaXIgICAgCT0gZGlyOworCW5ldy0+cnRfZndkX2NiIAk9IHJ0X2Z3ZF9jYjsKKwkKKwkvKiBTYXZlIHRoaXMgaW4gdGhlIGxpc3QgKi8KKwlDSEVDS19GQ1QoIGFkZF9vcmRlcmVkKG5ldywgJnJ0X2Z3ZF9saXN0KSApOworCQorCS8qIEdpdmUgaXQgYmFjayB0byB0aGUgZXh0ZW5zaW9uIGlmIG5lZWRlZCAqLworCWlmIChoYW5kbGVyKQorCQkqaGFuZGxlciA9ICh2b2lkICopbmV3OworCQorCXJldHVybiAwOworfQorCisvKiBSZW1vdmUgaXQgKi8KK2ludCBmZF9ydF9md2RfdW5yZWdpc3RlciAoIHN0cnVjdCBmZF9ydF9md2RfaGRsICogaGFuZGxlciwgdm9pZCAqKiBjYmRhdGEgKQoreworCXN0cnVjdCBydF9oZGwgKiBkZWw7CisJVFJBQ0VfRU5UUlkoICIlcCAlcCIsIGhhbmRsZXIsIGNiZGF0YSk7CisJQ0hFQ0tfUEFSQU1TKCBoYW5kbGVyICk7CisJCisJZGVsID0gKHN0cnVjdCBydF9oZGwgKiloYW5kbGVyOworCUNIRUNLX1BBUkFNUyggZGVsLT5jaGFpbi5oZWFkID09ICZydF9md2RfbGlzdCApOworCQorCS8qIFVubGluayAqLworCUNIRUNLX1BPU0lYKCBwdGhyZWFkX3J3bG9ja193cmxvY2soJnJ0X2Z3ZF9sb2NrKSApOworCWZkX2xpc3RfdW5saW5rKCZkZWwtPmNoYWluKTsKKwlDSEVDS19QT1NJWCggcHRocmVhZF9yd2xvY2tfdW5sb2NrKCZydF9md2RfbG9jaykgKTsKKwkKKwlpZiAoY2JkYXRhKQorCQkqY2JkYXRhID0gZGVsLT5jYmRhdGE7CisJCisJZnJlZShkZWwpOworCXJldHVybiAwOworfQorCisvKiBSZWdpc3RlciBhIG5ldyBPVVQgY2FsbGJhY2sgKi8KK2ludCBmZF9ydF9vdXRfcmVnaXN0ZXIgKCBpbnQgKCpydF9vdXRfY2IpKHZvaWQgKiBjYmRhdGEsIHN0cnVjdCBtc2cgKiogcG1zZywgc3RydWN0IGZkX2xpc3QgKiBjYW5kaWRhdGVzKSwgdm9pZCAqIGNiZGF0YSwgaW50IHByaW9yaXR5LCBzdHJ1Y3QgZmRfcnRfb3V0X2hkbCAqKiBoYW5kbGVyICkKK3sKKwlzdHJ1Y3QgcnRfaGRsICogbmV3OworCQorCVRSQUNFX0VOVFJZKCIlcCAlcCAlZCAlcCIsIHJ0X291dF9jYiwgY2JkYXRhLCBwcmlvcml0eSwgaGFuZGxlcik7CisJQ0hFQ0tfUEFSQU1TKCBydF9vdXRfY2IgKTsKKwkKKwkvKiBDcmVhdGUgYSBuZXcgY29udGFpbmVyICovCisJQ0hFQ0tfTUFMTE9DKG5ldyA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHJ0X2hkbCkpKTsKKwltZW1zZXQobmV3LCAwLCBzaXplb2Yoc3RydWN0IHJ0X2hkbCkpOworCQorCS8qIFdyaXRlIHRoZSBjb250ZW50ICovCisJZmRfbGlzdF9pbml0KCZuZXctPmNoYWluLCBOVUxMKTsKKwluZXctPmNiZGF0YSAJPSBjYmRhdGE7CisJbmV3LT5wcmlvICAgIAk9IHByaW9yaXR5OworCW5ldy0+cnRfb3V0X2NiIAk9IHJ0X291dF9jYjsKKwkKKwkvKiBTYXZlIHRoaXMgaW4gdGhlIGxpc3QgKi8KKwlDSEVDS19GQ1QoIGFkZF9vcmRlcmVkKG5ldywgJnJ0X291dF9saXN0KSApOworCQorCS8qIEdpdmUgaXQgYmFjayB0byB0aGUgZXh0ZW5zaW9uIGlmIG5lZWRlZCAqLworCWlmIChoYW5kbGVyKQorCQkqaGFuZGxlciA9ICh2b2lkICopbmV3OworCQorCXJldHVybiAwOworfQorCisvKiBSZW1vdmUgaXQgKi8KK2ludCBmZF9ydF9vdXRfdW5yZWdpc3RlciAoIHN0cnVjdCBmZF9ydF9vdXRfaGRsICogaGFuZGxlciwgdm9pZCAqKiBjYmRhdGEgKQoreworCXN0cnVjdCBydF9oZGwgKiBkZWw7CisJVFJBQ0VfRU5UUlkoICIlcCAlcCIsIGhhbmRsZXIsIGNiZGF0YSk7CisJQ0hFQ0tfUEFSQU1TKCBoYW5kbGVyICk7CisJCisJZGVsID0gKHN0cnVjdCBydF9oZGwgKiloYW5kbGVyOworCUNIRUNLX1BBUkFNUyggZGVsLT5jaGFpbi5oZWFkID09ICZydF9vdXRfbGlzdCApOworCQorCS8qIFVubGluayAqLworCUNIRUNLX1BPU0lYKCBwdGhyZWFkX3J3bG9ja193cmxvY2soJnJ0X291dF9sb2NrKSApOworCWZkX2xpc3RfdW5saW5rKCZkZWwtPmNoYWluKTsKKwlDSEVDS19QT1NJWCggcHRocmVhZF9yd2xvY2tfdW5sb2NrKCZydF9vdXRfbG9jaykgKTsKKwkKKwlpZiAoY2JkYXRhKQorCQkqY2JkYXRhID0gZGVsLT5jYmRhdGE7CisJCisJZnJlZShkZWwpOworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICBTb21lIGRlZmF1bHQgT1VUIHJvdXRpbmcgY2FsbGJhY2tzICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFByZXZlbnQgc2VuZGluZyB0byBwZWVycyB0aGF0IGRvIG5vdCBzdXBwb3J0IHRoZSBtZXNzYWdlIGFwcGxpY2F0aW9uICovCitzdGF0aWMgaW50IGRvbnRfc2VuZF9pZl9ub19jb21tb25fYXBwKHZvaWQgKiBjYmRhdGEsIHN0cnVjdCBtc2cgKiogcG1zZywgc3RydWN0IGZkX2xpc3QgKiBjYW5kaWRhdGVzKQoreworCXN0cnVjdCBtc2cgKiBtc2cgPSAqcG1zZzsKKwlzdHJ1Y3QgZmRfbGlzdCAqIGxpOworCXN0cnVjdCBtc2dfaGRyICogaGRyOworCQorCVRSQUNFX0VOVFJZKCIlcCAlcCAlcCIsIGNiZGF0YSwgbXNnLCBjYW5kaWRhdGVzKTsKKwlDSEVDS19QQVJBTVMobXNnICYmIGNhbmRpZGF0ZXMpOworCQorCUNIRUNLX0ZDVCggZmRfbXNnX2hkcihtc2csICZoZHIpICk7CisJCisJLyogRm9yIEJhc2UgRGlhbWV0ZXIgUHJvdG9jb2wsIGV2ZXJ5IHBlZXIgaXMgc3VwcG9zZWQgdG8gc3VwcG9ydCBpdCwgc28gc2tpcCAqLworCWlmIChoZHItPm1zZ19hcHBsID09IDApCisJCXJldHVybiAwOworCQorCS8qIE90aGVyd2lzZSwgY2hlY2sgdGhhdCB0aGUgcGVlcnMgc3VwcG9ydCB0aGUgYXBwbGljYXRpb24gKi8KKwlmb3IgKGxpID0gY2FuZGlkYXRlcy0+bmV4dDsgbGkgIT0gY2FuZGlkYXRlczsgbGkgPSBsaS0+bmV4dCkgeworCQlzdHJ1Y3QgcnRkX2NhbmRpZGF0ZSAqYyA9IChzdHJ1Y3QgcnRkX2NhbmRpZGF0ZSAqKSBsaTsKKwkJc3RydWN0IGZkX3BlZXIgKiBwZWVyOworCQlzdHJ1Y3QgZmRfYXBwICpmb3VuZDsKKwkJQ0hFQ0tfRkNUKCBmZF9wZWVyX2dldGJ5aWQoIGMtPmRpYW1pZCwgYy0+ZGlhbWlkbGVuLCAwLCAodm9pZCAqKSZwZWVyICkgKTsKKwkJaWYgKHBlZXIgJiYgIXBlZXItPnBfaGRyLmluZm8ucnVudGltZS5waXJfcmVsYXkpIHsKKwkJCS8qIENoZWNrIGlmIHRoZSByZW1vdGUgcGVlciBhZHZlcnRpc2VkIHRoZSBtZXNzYWdlJ3MgYXBwbGkgKi8KKwkJCUNIRUNLX0ZDVCggZmRfYXBwX2NoZWNrKCZwZWVyLT5wX2hkci5pbmZvLnJ1bnRpbWUucGlyX2FwcHMsIGhkci0+bXNnX2FwcGwsICZmb3VuZCkgKTsKKwkJCWlmICghZm91bmQpCisJCQkJYy0+c2NvcmUgKz0gRkRfU0NPUkVfTk9fREVMSVZFUlk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogRGV0ZWN0IGlmIHRoZSBEZXN0aW5hdGlvbi1Ib3N0IGFuZCBEZXN0aW5hdGlvbi1SZWFsbSBtYXRjaCB0aGUgcGVlciAqLworc3RhdGljIGludCBzY29yZV9kZXN0aW5hdGlvbl9hdnAodm9pZCAqIGNiZGF0YSwgc3RydWN0IG1zZyAqKiBwbXNnLCBzdHJ1Y3QgZmRfbGlzdCAqIGNhbmRpZGF0ZXMpCit7CisJc3RydWN0IG1zZyAqIG1zZyA9ICpwbXNnOworCXN0cnVjdCBmZF9saXN0ICogbGk7CisJc3RydWN0IGF2cCAqIGF2cDsKKwl1bmlvbiBhdnBfdmFsdWUgKmRoID0gTlVMTCwgKmRyID0gTlVMTDsKKwkKKwlUUkFDRV9FTlRSWSgiJXAgJXAgJXAiLCBjYmRhdGEsIG1zZywgY2FuZGlkYXRlcyk7CisJQ0hFQ0tfUEFSQU1TKG1zZyAmJiBjYW5kaWRhdGVzKTsKKwkKKwkvKiBTZWFyY2ggdGhlIERlc3RpbmF0aW9uLUhvc3QgYW5kIERlc3RpbmF0aW9uLVJlYWxtIEFWUHMgLS0gd2UgY291bGQgYWxzbyB1c2UgZmRfbXNnX3NlYXJjaF9hdnAgaGVyZSwgYnV0IHRoaXMgb25lIGlzIHNsaWdodGx5IG1vcmUgZWZmaWNpZW50ICovCisJQ0hFQ0tfRkNUKCAgZmRfbXNnX2Jyb3dzZShtc2csIE1TR19CUldfRklSU1RfQ0hJTEQsICZhdnAsIE5VTEwpICk7CisJd2hpbGUgKGF2cCkgeworCQlzdHJ1Y3QgYXZwX2hkciAqIGFoZHI7CisJCUNIRUNLX0ZDVCggIGZkX21zZ19hdnBfaGRyKCBhdnAsICZhaGRyICkgKTsKKworCQlpZiAoISAoYWhkci0+YXZwX2ZsYWdzICYgQVZQX0ZMQUdfVkVORE9SKSkgeworCQkJc3dpdGNoIChhaGRyLT5hdnBfY29kZSkgeworCQkJCWNhc2UgQUNfREVTVElOQVRJT05fSE9TVDoKKwkJCQkJLyogUGFyc2UgdGhpcyBBVlAgKi8KKwkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfcGFyc2VfZGljdCAoIGF2cCwgZmRfZ19jb25maWctPmNuZl9kaWN0LCBOVUxMICkgKTsKKwkJCQkJQVNTRVJUKCBhaGRyLT5hdnBfdmFsdWUgKTsKKwkJCQkJZGggPSBhaGRyLT5hdnBfdmFsdWU7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBBQ19ERVNUSU5BVElPTl9SRUFMTToKKwkJCQkJLyogUGFyc2UgdGhpcyBBVlAgKi8KKwkJCQkJQ0hFQ0tfRkNUKCBmZF9tc2dfcGFyc2VfZGljdCAoIGF2cCwgZmRfZ19jb25maWctPmNuZl9kaWN0LCBOVUxMICkgKTsKKwkJCQkJQVNTRVJUKCBhaGRyLT5hdnBfdmFsdWUgKTsKKwkJCQkJZHIgPSBhaGRyLT5hdnBfdmFsdWU7CisJCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKGRoICYmIGRyKQorCQkJYnJlYWs7CisKKwkJLyogR28gdG8gbmV4dCBBVlAgKi8KKwkJQ0hFQ0tfRkNUKCAgZmRfbXNnX2Jyb3dzZShhdnAsIE1TR19CUldfTkVYVCwgJmF2cCwgTlVMTCkgKTsKKwl9CisJCisJLyogTm93LCBjaGVjayBlYWNoIGNhbmRpZGF0ZSBhZ2FpbnN0IHRoZXNlIEFWUCB2YWx1ZXMgKi8KKwlmb3IgKGxpID0gY2FuZGlkYXRlcy0+bmV4dDsgbGkgIT0gY2FuZGlkYXRlczsgbGkgPSBsaS0+bmV4dCkgeworCQlzdHJ1Y3QgcnRkX2NhbmRpZGF0ZSAqYyA9IChzdHJ1Y3QgcnRkX2NhbmRpZGF0ZSAqKSBsaTsKKwkJCisJICAgICNpZiAwIC8qIHRoaXMgaXMgYWN0dWFsbHkgdXNlbGVzcyBzaW5jZSB0aGUgc2VuZGluZyBwcm9jZXNzIHdpbGwgYWxzbyBlbnN1cmUgdGhhdCB0aGUgcGVlciBpcyBzdGlsbCBhdmFpbGFibGUgKi8KKwkJc3RydWN0IGZkX3BlZXIgKiBwZWVyOworCQkvKiBTaW5jZSB0aGUgY2FuZGlkYXRlcyBsaXN0IGNvbWVzIGZyb20gdGhlIHBlZXJzIGxpc3QsIHdlIGRvIG5vdCBoYXZlIGFueSBpc3N1ZSB3aXRoIHVwcGVyL2xvd2VyIGNhc2UgdG8gZmluZCB0aGUgcGVlciBvYmplY3QgKi8KKwkJQ0hFQ0tfRkNUKCBmZF9wZWVyX2dldGJ5aWQoIGMtPmRpYW1pZCwgYy0+ZGlhbWlkbGVuLCAwLCAodm9pZCAqKSZwZWVyICkgKTsKKwkJaWYgKCFwZWVyKQorCQkJY29udGludWU7IC8qIGl0IGhhcyBiZWVuIGRlbGV0ZWQgc2luY2UgdGhlIGNhbmRpZGF0ZSBsaXN0IHdhcyBnZW5lcmF0ZWQ7IGF2b2lkIHNlbmRpbmcgdG8gdGhpcyBvbmUgaW4gdGhhdCBjYXNlLiAqLworCSAgICAjZW5kaWYgLyogMCAqLworCQkKKwkJLyogSW4gdGhlIEFWUHMsIHRoZSB2YWx1ZSBjb21lcyBmcm9tIHRoZSBuZXR3b3JrLCBzbyBsZXQncyBiZSBjYXNlIHBlcm1pc3NpdmUgKi8KKwkJaWYgKGRoICYmICFmZF9vc19hbG1vc3RjYXNlc3JjaChkaC0+b3MuZGF0YSwgZGgtPm9zLmxlbiwgYy0+ZGlhbWlkLCBjLT5kaWFtaWRsZW4sIE5VTEwpICkgeworCQkJLyogVGhlIGNhbmRpZGF0ZSBpcyB0aGUgRGVzdGluYXRpb24tSG9zdCAqLworCQkJYy0+c2NvcmUgKz0gRkRfU0NPUkVfRklOQUxERVNUOworCQl9IGVsc2UgeworCQkJaWYgKGRyICYmICFmZF9vc19hbG1vc3RjYXNlc3JjaChkci0+b3MuZGF0YSwgZHItPm9zLmxlbiwgYy0+cmVhbG0sIGMtPnJlYWxtbGVuLCBOVUxMKSApIHsKKwkJCQkvKiBUaGUgY2FuZGlkYXRlJ3MgcmVhbG0gbWF0Y2hzIHRoZSBEZXN0aW5hdGlvbi1SZWFsbSAqLworCQkJCWMtPnNjb3JlICs9IEZEX1NDT1JFX1JFQUxNOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgSGVscGVyIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRmluZCAoZmlyc3QpICchJyBhbmQgJ0AnIHBvc2l0aW9ucyBpbiBhIFVURi04IGVuY29kZWQgc3RyaW5nIChVc2VyLU5hbWUgQVZQIHZhbHVlKSAqLworc3RhdGljIHZvaWQgbmFpX2dldF9pbmRleGVzKHVuaW9uIGF2cF92YWx1ZSAqIHVuLCBpbnQgKiBleGNsX2lkeCwgaW50ICogYXRfaWR4KQoreworCWludCBpOworCQorCVRSQUNFX0VOVFJZKCIlcCAlcCAlcCIsIHVuLCBleGNsX2lkeCwgYXRfaWR4KTsKKwlDSEVDS19QQVJBTVNfRE8oIHVuICYmIGV4Y2xfaWR4ICYmIGF0X2lkeCwgcmV0dXJuICk7CisJCisJKmV4Y2xfaWR4ID0gMDsKKwkqYXRfaWR4ID0gMDsKKwkKKwkvKiBTZWFyY2ggaWYgdGhlcmUgaXMgYSAnIScgYmVmb3JlIGFueSAnQCcgLS0gZG8gd2UgbmVlZCB0byBjaGVjayBpdCBjb250YWlucyBhICcuJyA/ICovCisJZm9yIChpID0gMDsgaSA8IHVuLT5vcy5sZW47IGkrKykgeworCQkvKiBUaGUgJyEnIG1hcmtzIHRoZSBkZWNvcmF0ZWQgTkFJICovCisJCWlmICggdW4tPm9zLmRhdGFbaV0gPT0gKHVuc2lnbmVkIGNoYXIpICchJyApIHsKKwkJCWlmICghKmV4Y2xfaWR4KQorCQkJCSpleGNsX2lkeCA9IGk7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBJZiB3ZSByZWFjaCB0aGUgcmVhbG0gcGFydCwgd2UgY2FuIHN0b3AgKi8KKwkJaWYgKCB1bi0+b3MuZGF0YVtpXSA9PSAodW5zaWduZWQgY2hhcikgJ0AnICkgeworCQkJKmF0X2lkeCA9IGk7CisJCQlicmVhazsKKwkJfQorCQkvKiBTdG9wIGlmIHdlIGZpbmQgYSBcMCBpbiB0aGUgbWlkZGxlICovCisJCWlmICggdW4tPm9zLmRhdGFbaV0gPT0gMCApIHsKKwkJCXJldHVybjsKKwkJfQorCQkvKiBTa2lwIGVzY2FwZWQgY2hhcmFjdGVycyAqLworCQlpZiAoIHVuLT5vcy5kYXRhW2ldID09ICh1bnNpZ25lZCBjaGFyKSAnXFwnICkgeworCQkJaSsrOworCQkJY29udGludWU7CisJCX0KKwl9CisJCisJcmV0dXJuOworfQkKKworLyogVGVzdCBpZiBhIFVzZXItTmFtZSBBVlAgY29udGFpbnMgYSBEZWNvcmF0ZWQgTkFJIC0tIFJGQzQyODIsIFJGQzU3MjkgKi8KKy8qIENyZWF0ZSBuZXcgVXNlci1OYW1lIGFuZCBEZXN0aW5hdGlvbi1SZWFsbSB2YWx1ZXMgKi8KK3N0YXRpYyBpbnQgcHJvY2Vzc19kZWNvcmF0ZWRfTkFJKGludCAqIHdhc19uYWksIHVuaW9uIGF2cF92YWx1ZSAqIHVuLCB1bmlvbiBhdnBfdmFsdWUgKiBkcikKK3sKKwlpbnQgYXRfaWR4LCBzZXBfaWR4OworCXVuc2lnbmVkIGNoYXIgKiBvbGRfdW47CisJVFJBQ0VfRU5UUlkoIiVwICVwICVwIiwgd2FzX25haSwgdW4sIGRyKTsKKwlDSEVDS19QQVJBTVMod2FzX25haSAmJiB1biAmJiBkcik7CisJCisJLyogU2F2ZSB0aGUgZGVjb3JhdGVkIFVzZXItTmFtZSwgZm9yIGV4YW1wbGUgJ2hvbWVyZWFsbS5leGFtcGxlLm5ldCF1c2VyQG90aGVycmVhbG0uZXhhbXBsZS5uZXQnICovCisJb2xkX3VuID0gdW4tPm9zLmRhdGE7CisJCisJLyogU2VhcmNoIHRoZSBwb3NpdGlvbnMgb2YgdGhlIGZpcnN0ICchJyBhbmQgdGhlICdAJyBpbiB0aGUgc3RyaW5nICovCisJbmFpX2dldF9pbmRleGVzKHVuLCAmc2VwX2lkeCwgJmF0X2lkeCk7CisJaWYgKCghc2VwX2lkeCkgfHwgKHNlcF9pZHggPiBhdF9pZHgpIHx8ICFmZF9vc19pc192YWxpZF9EaWFtZXRlcklkZW50aXR5KG9sZF91biwgc2VwX2lkeCAvKiB0aGlzIGlzIHRoZSBuZXcgcmVhbG0gcGFydCAqLykpIHsKKwkJKndhc19uYWkgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJCisJKndhc19uYWkgPSAxOworCQorCS8qIENyZWF0ZSB0aGUgbmV3IFVzZXItTmFtZSB2YWx1ZSAqLworCUNIRUNLX01BTExPQyggdW4tPm9zLmRhdGEgPSBtYWxsb2MoIGF0X2lkeCApICk7CisJbWVtY3B5KCB1bi0+b3MuZGF0YSwgb2xkX3VuICsgc2VwX2lkeCArIDEsIGF0X2lkeCAtIHNlcF9pZHggKTsgLyogdXNlckAgKi8KKwltZW1jcHkoIHVuLT5vcy5kYXRhICsgYXRfaWR4IC0gc2VwX2lkeCwgb2xkX3VuLCBzZXBfaWR4ICk7IC8qIGhvbWVyZWFsbS5leGFtcGxlLm5ldCAqLworCQorCS8qIENyZWF0ZSB0aGUgbmV3IERlc3RpbmF0aW9uLVJlYWxtIHZhbHVlICovCisJQ0hFQ0tfTUFMTE9DKCBkci0+b3MuZGF0YSA9IHJlYWxsb2MoZHItPm9zLmRhdGEsIHNlcF9pZHgpICk7CisJbWVtY3B5KCBkci0+b3MuZGF0YSwgb2xkX3VuLCBzZXBfaWR4ICk7CisJZHItPm9zLmxlbiA9IHNlcF9pZHg7CisJCisJVFJBQ0VfREVCVUcoRlVMTCwgIlByb2Nlc3NlZCBEZWNvcmF0ZWQgTkFJIDogJyUuKnMnIGJlY2FtZSAnJS4qcycgKCUuKnMpIiwKKwkJCQkoaW50KXVuLT5vcy5sZW4sIG9sZF91biwKKwkJCQkoaW50KWF0X2lkeCwgdW4tPm9zLmRhdGEsCisJCQkJKGludClkci0+b3MubGVuLCBkci0+b3MuZGF0YSk7CisJCisJdW4tPm9zLmxlbiA9IGF0X2lkeDsKKwlmcmVlKG9sZF91bik7CisJCisJcmV0dXJuIDA7Cit9CisKKworLyogRnVuY3Rpb24gdG8gcmV0dXJuIGFuIGVycm9yIHRvIGFuIGluY29taW5nIHJlcXVlc3QgKi8KK3N0YXRpYyBpbnQgcmV0dXJuX2Vycm9yKHN0cnVjdCBtc2cgKiogcG1zZywgY2hhciAqIGVycm9yX2NvZGUsIGNoYXIgKiBlcnJvcl9tZXNzYWdlLCBzdHJ1Y3QgYXZwICogZmFpbGVkYXZwKQoreworCXN0cnVjdCBmZF9wZWVyICogcGVlcjsKKwlpbnQgaXNfbG9jID0gMDsKKworCS8qIEdldCB0aGUgc291cmNlIG9mIHRoZSBtZXNzYWdlICovCisJeworCQlEaWFtSWRfdCBpZDsKKwkJc2l6ZV90ICAgaWRsZW47CisJCUNIRUNLX0ZDVCggZmRfbXNnX3NvdXJjZV9nZXQoICpwbXNnLCAmaWQsICZpZGxlbiApICk7CisJCQorCQlpZiAoaWQgPT0gTlVMTCkgeworCQkJaXNfbG9jID0gMTsgLyogVGhlIG1lc3NhZ2Ugd2FzIGlzc3VlZCBsb2NhbGx5ICovCisJCX0gZWxzZSB7CisJCQorCQkJLyogU2VhcmNoIHRoZSBwZWVyIHdpdGggdGhpcyBpZCAqLworCQkJQ0hFQ0tfRkNUKCBmZF9wZWVyX2dldGJ5aWQoIGlkLCBpZGxlbiwgMCwgKHZvaWQgKikmcGVlciApICk7CisKKwkJCWlmICghcGVlcikgeworCQkJCWNoYXIgYnVmWzI1Nl07CisJCQkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIlVuYWJsZSB0byBzZW5kIGVycm9yICclcycgdG8gZGVsZXRlZCBwZWVyICclcycgaW4gcmVwbHkgdG8gdGhpcyBtZXNzYWdlLiIsIGVycm9yX2NvZGUsIGlkKTsKKwkJCQlmZF9ob29rX2NhbGwoSE9PS19NRVNTQUdFX0RST1BQRUQsICpwbXNnLCBOVUxMLCBidWYsIGZkX21zZ19wbWRsX2dldCgqcG1zZykpOworCQkJCWZkX21zZ19mcmVlKCpwbXNnKTsKKwkJCQkqcG1zZyA9IE5VTEw7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwl9CisJCisJLyogQ3JlYXRlIHRoZSBlcnJvciBtZXNzYWdlICovCisJQ0hFQ0tfRkNUKCBmZF9tc2dfbmV3X2Fuc3dlcl9mcm9tX3JlcSAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgcG1zZywgTVNHRkxfQU5TV19FUlJPUiApICk7CisKKwkvKiBTZXQgdGhlIGVycm9yIGNvZGUgKi8KKwlDSEVDS19GQ1QoIGZkX21zZ19yZXNjb2RlX3NldCgqcG1zZywgZXJyb3JfY29kZSwgZXJyb3JfbWVzc2FnZSwgZmFpbGVkYXZwLCAxICkgKTsKKworCS8qIFNlbmQgdGhlIGFuc3dlciAqLworCWlmIChpc19sb2MpIHsKKwkJQ0hFQ0tfRkNUKCBmZF9maWZvX3Bvc3QoZmRfZ19pbmNvbWluZywgcG1zZykgKTsKKwl9IGVsc2UgeworCQlDSEVDS19GQ1QoIGZkX291dF9zZW5kKHBtc2csIE5VTEwsIHBlZXIsIDEpICk7CisJfQorCQorCS8qIERvbmUgKi8KKwlyZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgU2Vjb25kIHBhcnQgOiB0aHJlYWRzIG1vdmluZyBtZXNzYWdlcyBpbiB0aGUgZGFlbW9uICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoZSBESVNQQVRDSCBtZXNzYWdlIHByb2Nlc3NpbmcgKi8KK3N0YXRpYyBpbnQgbXNnX2Rpc3BhdGNoKHN0cnVjdCBtc2cgKiBtc2cpCit7CisJc3RydWN0IG1zZ19oZHIgKiBoZHI7CisJaW50IGlzX3JlcSA9IDA7CisJc3RydWN0IHNlc3Npb24gKiBzZXNzOworCWVudW0gZGlzcF9hY3Rpb24gYWN0aW9uOworCWNoYXIgKiBlYyA9IE5VTEw7CisJY2hhciAqIGVtID0gTlVMTDsKKwlzdHJ1Y3QgbXNnICptc2dwdHIgPSBtc2csICplcnJvciA9IE5VTEw7CisKKwkvKiBSZWFkIHRoZSBtZXNzYWdlIGhlYWRlciAqLworCUNIRUNLX0ZDVCggZmRfbXNnX2hkcihtc2csICZoZHIpICk7CisJaXNfcmVxID0gaGRyLT5tc2dfZmxhZ3MgJiBDTURfRkxBR19SRVFVRVNUOworCQorCS8qIE5vdGU6IGlmIHRoZSBtZXNzYWdlIGlzIGZvciBsb2NhbCBkZWxpdmVyeSwgd2Ugc2hvdWxkIHRlc3QgZm9yIGR1cGxpY2F0ZQorCSAgKGRyYWZ0LWFzdmVyZW4tZGltZS1kdXBjb25zLTAwKS4gVGhpcyBtYXkgY29uZmxpY3Qgd2l0aCBwYXRoIHZhbGlkYXRpb24gZGVjaXNpb25zLCBubyBjbGVhciBhbnN3ZXIgeWV0ICovCisKKwkvKiBBdCB0aGlzIHBvaW50LCB3ZSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIG1lc3NhZ2UgY29udGVudCwgc28gcGFyc2UgaXQgKi8KKwlDSEVDS19GQ1RfRE8oIGZkX21zZ19wYXJzZV9vcl9lcnJvciggJm1zZ3B0ciwgJmVycm9yICksCisJCXsKKwkJCWludCByZXNjdWUgPSAwOworCQkJaWYgKF9fcmV0X18gIT0gRUJBRE1TRykgeworCQkJCWZkX2hvb2tfY2FsbChIT09LX01FU1NBR0VfRFJPUFBFRCwgbXNncHRyLCBOVUxMLCAiRXJyb3Igd2hpbGUgcGFyc2luZyByZWNlaXZlZCBhbnN3ZXIiLCBmZF9tc2dfcG1kbF9nZXQobXNncHRyKSk7CisJCQkJZmRfbXNnX2ZyZWUobXNncHRyKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKCFtc2dwdHIpIHsKKwkJCQkJZmRfaG9va19jYWxsKEhPT0tfTUVTU0FHRV9QQVJTSU5HX0VSUk9SMiwgZXJyb3IsIE5VTEwsIE5VTEwsIGZkX21zZ19wbWRsX2dldChlcnJvcikpOworCQkJCQkvKiBlcnJvciBub3cgY29udGFpbnMgdGhlIGFuc3dlciBtZXNzYWdlIHRvIHNlbmQgYmFjayAqLworCQkJCQlDSEVDS19GQ1QoIGZkX2ZpZm9fcG9zdChmZF9nX291dGdvaW5nLCAmZXJyb3IpICk7CisJCQkJfSBlbHNlIGlmICghZXJyb3IpIHsKKwkJCQkJLyogV2UgaGF2ZSByZWNlaXZlZCBhbiBpbnZhbGlkIGFuc3dlciB0byBvdXIgcXVlcnkgKi8KKwkJCQkJZmRfaG9va19jYWxsKEhPT0tfTUVTU0FHRV9EUk9QUEVELCBtc2dwdHIsIE5VTEwsICJSZWNlaXZlZCBhbnN3ZXIgZmFpbGVkIHRoZSBkaWN0aW9uYXJ5IC8gcnVsZXMgcGFyc2luZyIsIGZkX21zZ19wbWRsX2dldChtc2dwdHIpKTsKKwkJCQkJZmRfbXNnX2ZyZWUobXNncHRyKTsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiBXZSB3aWxsIHBhc3MgdGhlIGludmFsaWQgcmVjZWl2ZWQgZXJyb3IgdG8gdGhlIGFwcGxpY2F0aW9uICovCisJCQkJCXJlc2N1ZSA9IDE7CisJCQkJfQorCQkJfQorCQkJaWYgKCFyZXNjdWUpCisJCQkJcmV0dXJuIDA7IC8qIFdlIGFyZSBkb25lIHdpdGggdGhpcyBtZXNzYWdlLCBnbyB0byB0aGUgbmV4dCAqLworCQl9ICk7CisKKwkvKiBGaXJzdCwgaWYgdGhlIG9yaWdpbmFsIHJlcXVlc3Qgd2FzIHJlZ2lzdGVyZWQgd2l0aCBhIGNhbGxiYWNrIGFuZCB3ZSByZWNlaXZlIHRoZSBhbnN3ZXIsIGNhbGwgaXQuICovCisJaWYgKCAhIGlzX3JlcSApIHsKKwkJc3RydWN0IG1zZyAqIHFyeTsKKwkJdm9pZCAoKmFuc2NiKSh2b2lkICosIHN0cnVjdCBtc2cgKiopID0gTlVMTDsKKwkJdm9pZCAqIGRhdGEgPSBOVUxMOworCisJCS8qIFJldHJpZXZlIHRoZSBjb3JyZXNwb25kaW5nIHF1ZXJ5ICovCisJCUNIRUNLX0ZDVCggZmRfbXNnX2Fuc3dfZ2V0cSggbXNncHRyLCAmcXJ5ICkgKTsKKworCQkvKiBSZXRyaWV2ZSBhbnkgcmVnaXN0ZXJlZCBoYW5kbGVyICovCisJCUNIRUNLX0ZDVCggZmRfbXNnX2Fuc2NiX2dldCggcXJ5LCAmYW5zY2IsIE5VTEwsICZkYXRhICkgKTsKKworCQkvKiBJZiBhIGNhbGxiYWNrIHdhcyByZWdpc3RlcmVkLCBwYXNzIHRoZSBtZXNzYWdlIHRvIGl0ICovCisJCWlmIChhbnNjYiAhPSBOVUxMKSB7CisKKwkJCVRSQUNFX0RFQlVHKEZVTEwsICJDYWxsaW5nIGNhbGxiYWNrIHJlZ2lzdGVyZWQgd2hlbiBxdWVyeSB3YXMgc2VudCAoJXAsICVwKSIsIGFuc2NiLCBkYXRhKTsKKwkJCSgqYW5zY2IpKGRhdGEsICZtc2dwdHIpOworCQkJCisJCQkvKiBJZiB0aGUgbWVzc2FnZSBpcyBwcm9jZXNzZWQsIHdlJ3JlIGRvbmUgKi8KKwkJCWlmIChtc2dwdHIgPT0gTlVMTCkgeworCQkJCXJldHVybiAwOworCQkJfQorCQkJCisJCQkvKiBvdGhlcndpc2UgY29udGludWUgdGhlIGRpc3BhdGNoaW5nIC0taG9waW5nIHRoYXQgdGhlIGFuc2NiIGNhbGxiYWNrIGRpZCBub3QgbWVzcyB3aXRoIG91ciBtZXNzYWdlIDopICovCisJCX0KKwl9CisJCisJLyogUmV0cmlldmUgdGhlIHNlc3Npb24gb2YgdGhlIG1lc3NhZ2UgKi8KKwlDSEVDS19GQ1QoIGZkX21zZ19zZXNzX2dldChmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIG1zZ3B0ciwgJnNlc3MsIE5VTEwpICk7CisKKwkvKiBOb3csIGNhbGwgYW55IGNhbGxiYWNrIHJlZ2lzdGVyZWQgZm9yIHRoZSBtZXNzYWdlICovCisJQ0hFQ0tfRkNUKCBmZF9tc2dfZGlzcGF0Y2ggKCAmbXNncHRyLCBzZXNzLCAmYWN0aW9uLCAmZWMsICZlbSwgJmVycm9yKSApOworCisJLyogTm93LCBhY3QgZGVwZW5kaW5nIG9uIG1zZyBhbmQgYWN0aW9uIGFuZCBlYyAqLworCWlmIChtc2dwdHIpIHsKKwkJc3dpdGNoICggYWN0aW9uICkgeworCQkJY2FzZSBESVNQX0FDVF9DT05UOgorCQkJCS8qIE5vIGNhbGxiYWNrIGhhcyBoYW5kbGVkIHRoZSBtZXNzYWdlLCBsZXQncyByZXBseSB3aXRoIGEgZ2VuZXJpYyBlcnJvciBvciByZWxheSBpdCAqLworCQkJCWlmICghZmRfZ19jb25maWctPmNuZl9mbGFncy5ub19md2QpIHsKKwkJCQkJLyogcmVxdWV1ZSB0byBmZF9nX291dGdvaW5nICovCisJCQkJCWZkX2hvb2tfY2FsbChIT09LX01FU1NBR0VfUk9VVElOR19GT1JXQVJELCBtc2dwdHIsIE5VTEwsIE5VTEwsIGZkX21zZ19wbWRsX2dldChtc2dwdHIpKTsKKwkJCQkJQ0hFQ0tfRkNUKCBmZF9maWZvX3Bvc3QoZmRfZ19vdXRnb2luZywgJm1zZ3B0cikgKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8qIFdlIGRvbid0IHJlbGF5ID0+IHJlcGx5IGVycm9yICovCisJCQkJZW0gPSAiVGhlIG1lc3NhZ2Ugd2FzIG5vdCBoYW5kbGVkIGJ5IGFueSBleHRlbnNpb24gY2FsbGJhY2siOworCQkJCWVjID0gIkRJQU1FVEVSX0NPTU1BTkRfVU5TVVBQT1JURUQiOworCQkJCS8qIGFuZCBjb250aW51ZSBhcyBpZiBhbiBlcnJvciBvY2N1cnJlZC4uLiAqLworCQkJY2FzZSBESVNQX0FDVF9FUlJPUjoKKwkJCQkvKiBXZSBoYXZlIGEgcHJvYmxlbSB3aXRoIGRlbGl2ZXJpbmcgdGhlIG1lc3NhZ2UgKi8KKwkJCQlpZiAoZWMgPT0gTlVMTCkgeworCQkJCQllYyA9ICJESUFNRVRFUl9VTkFCTEVfVE9fQ09NUExZIjsKKwkJCQl9CisJCQkJCisJCQkJaWYgKCFpc19yZXEpIHsKKwkJCQkJZmRfaG9va19jYWxsKEhPT0tfTUVTU0FHRV9EUk9QUEVELCBtc2dwdHIsIE5VTEwsICJJbnRlcm5hbCBlcnJvcjogQW5zd2VyIHJlY2VpdmVkIHRvIGxvY2FsbHkgaXNzdWVkIHJlcXVlc3QsIGJ1dCBub3QgaGFuZGxlZCBieSBhbnkgaGFuZGxlci4iLCBmZF9tc2dfcG1kbF9nZXQobXNncHRyKSk7CisJCQkJCWZkX21zZ19mcmVlKG1zZ3B0cik7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkKKwkJCQkvKiBDcmVhdGUgYW4gYW5zd2VyIHdpdGggdGhlIGVycm9yIGNvZGUgYW5kIG1lc3NhZ2UgKi8KKwkJCQlDSEVDS19GQ1QoIGZkX21zZ19uZXdfYW5zd2VyX2Zyb21fcmVxICggZmRfZ19jb25maWctPmNuZl9kaWN0LCAmbXNncHRyLCAwICkgKTsKKwkJCQlDSEVDS19GQ1QoIGZkX21zZ19yZXNjb2RlX3NldChtc2dwdHIsIGVjLCBlbSwgTlVMTCwgMSApICk7CisJCQkJCisJCQljYXNlIERJU1BfQUNUX1NFTkQ6CisJCQkJLyogTm93LCBzZW5kIHRoZSBtZXNzYWdlICovCisJCQkJQ0hFQ0tfRkNUKCBmZF9maWZvX3Bvc3QoZmRfZ19vdXRnb2luZywgJm1zZ3B0cikgKTsKKwkJfQorCX0gZWxzZSBpZiAoZW0pIHsKKwkJZmRfaG9va19jYWxsKEhPT0tfTUVTU0FHRV9EUk9QUEVELCBlcnJvciwgTlVMTCwgZW0sIGZkX21zZ19wbWRsX2dldChlcnJvcikpOworCQlmZF9tc2dfZnJlZShlcnJvcik7CisJfQorCQorCS8qIFdlJ3JlIGRvbmUgd2l0aCBkaXNwYXRjaGluZyB0aGlzIG1lc3NhZ2UgKi8KKwlyZXR1cm4gMDsKK30KKworLyogVGhlIFJPVVRJTkctSU4gbWVzc2FnZSBwcm9jZXNzaW5nICovCitzdGF0aWMgaW50IG1zZ19ydF9pbihzdHJ1Y3QgbXNnICogbXNnKQoreworCXN0cnVjdCBtc2dfaGRyICogaGRyOworCWludCBpc19yZXEgPSAwOworCWludCBpc19lcnIgPSAwOworCURpYW1JZF90IHFyeV9zcmMgPSBOVUxMOworCXN0cnVjdCBtc2cgKm1zZ3B0ciA9IG1zZzsKKworCS8qIFJlYWQgdGhlIG1lc3NhZ2UgaGVhZGVyICovCisJQ0hFQ0tfRkNUKCBmZF9tc2dfaGRyKG1zZywgJmhkcikgKTsKKwlpc19yZXEgPSBoZHItPm1zZ19mbGFncyAmIENNRF9GTEFHX1JFUVVFU1Q7CisJaXNfZXJyID0gaGRyLT5tc2dfZmxhZ3MgJiBDTURfRkxBR19FUlJPUjsKKworCS8qIEhhbmRsZSBpbmNvcnJlY3QgYml0cyAqLworCWlmIChpc19yZXEgJiYgaXNfZXJyKSB7CisJCWZkX2hvb2tfY2FsbChIT09LX01FU1NBR0VfUEFSU0lOR19FUlJPUiwgbXNncHRyLCBOVUxMLCAiUiAmIEUgYml0cyB3ZXJlIHNldCIsIGZkX21zZ19wbWRsX2dldChtc2dwdHIpKTsKKwkJQ0hFQ0tfRkNUKCByZXR1cm5fZXJyb3IoICZtc2dwdHIsICJESUFNRVRFUl9JTlZBTElEX0hEUl9CSVRTIiwgIlIgJiBFIGJpdHMgd2VyZSBzZXQiLCBOVUxMKSApOworCQlyZXR1cm4gMDsKKwl9CisJCisJLyogSWYgaXQgaXMgYSByZXF1ZXN0LCB3ZSBtdXN0IGFuYWx5emUgaXRzIGNvbnRlbnQgdG8gZGVjaWRlIHdoYXQgd2UgZG8gd2l0aCBpdCAqLworCWlmIChpc19yZXEpIHsKKwkJc3RydWN0IGF2cCAqIGF2cCwgKnVuID0gTlVMTDsKKwkJdW5pb24gYXZwX3ZhbHVlICogdW5fdmFsID0gTlVMTCwgKmRyX3ZhbCA9IE5VTEw7CisJCWVudW0gc3RhdHVzIHsgVU5LTk9XTiwgWUVTLCBOTyB9OworCQkvKiBBcmUgd2UgRGVzdGluYXRpb24tSG9zdD8gKi8KKwkJZW51bSBzdGF0dXMgaXNfZGVzdF9ob3N0ID0gVU5LTk9XTjsKKwkJLyogQXJlIHdlIERlc3RpbmF0aW9uLVJlYWxtPyAqLworCQllbnVtIHN0YXR1cyBpc19kZXN0X3JlYWxtID0gVU5LTk9XTjsKKwkJLyogRG8gd2Ugc3VwcG9ydCB0aGUgYXBwbGljYXRpb24gb2YgdGhlIG1lc3NhZ2U/ICovCisJCWVudW0gc3RhdHVzIGlzX2xvY2FsX2FwcCA9IFVOS05PV047CisKKwkJLyogQ2hlY2sgaWYgd2UgaGF2ZSBsb2NhbCBzdXBwb3J0IGZvciB0aGUgbWVzc2FnZSBhcHBsaWNhdGlvbiAqLworCQlpZiAoIChoZHItPm1zZ19hcHBsID09IDApIHx8IChoZHItPm1zZ19hcHBsID09IEFJX1JFTEFZKSApIHsKKwkJCWZkX2hvb2tfY2FsbChIT09LX01FU1NBR0VfUEFSU0lOR19FUlJPUiwgbXNncHRyLCBOVUxMLCAiUmVjZWl2ZWQgYSByb3V0YWJsZSBtZXNzYWdlIHdpdGggYXBwbGljYXRpb24gaWQgMCBvciAiIF9zdHJpbmdpemUoQUlfUkVMQVkpICIgKHJlbGF5KSIsIGZkX21zZ19wbWRsX2dldChtc2dwdHIpKTsKKwkJCUNIRUNLX0ZDVCggcmV0dXJuX2Vycm9yKCAmbXNncHRyLCAiRElBTUVURVJfQVBQTElDQVRJT05fVU5TVVBQT1JURUQiLCAiUm91dGFibGUgbWVzc2FnZSB3aXRoIGFwcGxpY2F0aW9uIGlkIDAgb3IgcmVsYXkiLCBOVUxMKSApOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3QgZmRfYXBwICogYXBwOworCQkJQ0hFQ0tfRkNUKCBmZF9hcHBfY2hlY2soJmZkX2dfY29uZmlnLT5jbmZfYXBwcywgaGRyLT5tc2dfYXBwbCwgJmFwcCkgKTsKKwkJCWlzX2xvY2FsX2FwcCA9IChhcHAgPyBZRVMgOiBOTyk7CisJCX0KKworCQkvKiBQYXJzZSB0aGUgbWVzc2FnZSBmb3IgRGVzdC1Ib3N0LCBEZXN0LVJlYWxtLCBhbmQgUm91dGUtUmVjb3JkICovCisJCUNIRUNLX0ZDVCggIGZkX21zZ19icm93c2UobXNncHRyLCBNU0dfQlJXX0ZJUlNUX0NISUxELCAmYXZwLCBOVUxMKSAgKTsKKwkJd2hpbGUgKGF2cCkgeworCQkJc3RydWN0IGF2cF9oZHIgKiBhaGRyOworCQkJc3RydWN0IGZkX3BlaSBlcnJvcl9pbmZvOworCQkJaW50IHJldDsKKwkJCQorCQkJbWVtc2V0KCZlcnJvcl9pbmZvLCAwLCBzaXplb2Yoc3RydWN0IGZkX3BlaSkpOyAKKwkJCQorCQkJQ0hFQ0tfRkNUKCAgZmRfbXNnX2F2cF9oZHIoIGF2cCwgJmFoZHIgKSAgKTsKKworCQkJaWYgKCEgKGFoZHItPmF2cF9mbGFncyAmIEFWUF9GTEFHX1ZFTkRPUikpIHsKKwkJCQlzd2l0Y2ggKGFoZHItPmF2cF9jb2RlKSB7CisJCQkJCWNhc2UgQUNfREVTVElOQVRJT05fSE9TVDoKKwkJCQkJCS8qIFBhcnNlIHRoaXMgQVZQICovCisJCQkJCQlDSEVDS19GQ1RfRE8oIHJldCA9IGZkX21zZ19wYXJzZV9kaWN0ICggYXZwLCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsICZlcnJvcl9pbmZvICksCisJCQkJCQkJeworCQkJCQkJCQlpZiAoZXJyb3JfaW5mby5wZWlfZXJyY29kZSkgeworCQkJCQkJCQkJZmRfaG9va19jYWxsKEhPT0tfTUVTU0FHRV9QQVJTSU5HX0VSUk9SLCBtc2dwdHIsIE5VTEwsIGVycm9yX2luZm8ucGVpX21lc3NhZ2UgPzogZXJyb3JfaW5mby5wZWlfZXJyY29kZSwgZmRfbXNnX3BtZGxfZ2V0KG1zZ3B0cikpOworCQkJCQkJCQkJQ0hFQ0tfRkNUKCByZXR1cm5fZXJyb3IoICZtc2dwdHIsIGVycm9yX2luZm8ucGVpX2VycmNvZGUsIGVycm9yX2luZm8ucGVpX21lc3NhZ2UsIGVycm9yX2luZm8ucGVpX2F2cCkgKTsKKwkJCQkJCQkJCWlmIChlcnJvcl9pbmZvLnBlaV9hdnBfZnJlZSkgeyBmZF9tc2dfZnJlZShlcnJvcl9pbmZvLnBlaV9hdnApOyB9CisJCQkJCQkJCQlyZXR1cm4gMDsKKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCWZkX2hvb2tfY2FsbChIT09LX01FU1NBR0VfUEFSU0lOR19FUlJPUiwgbXNncHRyLCBOVUxMLCAiVW5zcGVjaWZpZWQgZXJyb3Igd2hpbGUgcGFyc2luZyBEZXN0aW5hdGlvbi1Ib3N0IEFWUCIsIGZkX21zZ19wbWRsX2dldChtc2dwdHIpKTsKKwkJCQkJCQkJCXJldHVybiByZXQ7CisJCQkJCQkJCX0KKwkJCQkJCQl9ICk7CisJCQkJCQlBU1NFUlQoIGFoZHItPmF2cF92YWx1ZSApOworCQkJCQkJLyogQ29tcGFyZSB0aGUgRGVzdGluYXRpb24tSG9zdCBBVlAgb2YgdGhlIG1lc3NhZ2Ugd2l0aCBvdXIgaWRlbnRpdHkgKi8KKwkJCQkJCWlmICghZmRfb3NfYWxtb3N0Y2FzZXNyY2goYWhkci0+YXZwX3ZhbHVlLT5vcy5kYXRhLCBhaGRyLT5hdnBfdmFsdWUtPm9zLmxlbiwgZmRfZ19jb25maWctPmNuZl9kaWFtaWQsIGZkX2dfY29uZmlnLT5jbmZfZGlhbWlkX2xlbiwgTlVMTCkpIHsKKwkJCQkJCQlpc19kZXN0X2hvc3QgPSBZRVM7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWlzX2Rlc3RfaG9zdCA9IE5POworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBBQ19ERVNUSU5BVElPTl9SRUFMTToKKwkJCQkJCS8qIFBhcnNlIHRoaXMgQVZQICovCisJCQkJCQlDSEVDS19GQ1RfRE8oIHJldCA9IGZkX21zZ19wYXJzZV9kaWN0ICggYXZwLCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsICZlcnJvcl9pbmZvICksCisJCQkJCQkJeworCQkJCQkJCQlpZiAoZXJyb3JfaW5mby5wZWlfZXJyY29kZSkgeworCQkJCQkJCQkJZmRfaG9va19jYWxsKEhPT0tfTUVTU0FHRV9QQVJTSU5HX0VSUk9SLCBtc2dwdHIsIE5VTEwsIGVycm9yX2luZm8ucGVpX21lc3NhZ2UgPzogZXJyb3JfaW5mby5wZWlfZXJyY29kZSwgZmRfbXNnX3BtZGxfZ2V0KG1zZ3B0cikpOworCQkJCQkJCQkJQ0hFQ0tfRkNUKCByZXR1cm5fZXJyb3IoICZtc2dwdHIsIGVycm9yX2luZm8ucGVpX2VycmNvZGUsIGVycm9yX2luZm8ucGVpX21lc3NhZ2UsIGVycm9yX2luZm8ucGVpX2F2cCkgKTsKKwkJCQkJCQkJCWlmIChlcnJvcl9pbmZvLnBlaV9hdnBfZnJlZSkgeyBmZF9tc2dfZnJlZShlcnJvcl9pbmZvLnBlaV9hdnApOyB9CisJCQkJCQkJCQlyZXR1cm4gMDsKKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCWZkX2hvb2tfY2FsbChIT09LX01FU1NBR0VfUEFSU0lOR19FUlJPUiwgbXNncHRyLCBOVUxMLCAiVW5zcGVjaWZpZWQgZXJyb3Igd2hpbGUgcGFyc2luZyBEZXN0aW5hdGlvbi1SZWFsbSBBVlAiLCBmZF9tc2dfcG1kbF9nZXQobXNncHRyKSk7CisJCQkJCQkJCQlyZXR1cm4gcmV0OworCQkJCQkJCQl9CisJCQkJCQkJfSApOworCQkJCQkJQVNTRVJUKCBhaGRyLT5hdnBfdmFsdWUgKTsKKwkJCQkJCWRyX3ZhbCA9IGFoZHItPmF2cF92YWx1ZTsKKwkJCQkJCS8qIENvbXBhcmUgdGhlIERlc3RpbmF0aW9uLVJlYWxtIEFWUCBvZiB0aGUgbWVzc2FnZSB3aXRoIG91ciBpZGVudGl0eSAqLworCQkJCQkJaWYgKCFmZF9vc19hbG1vc3RjYXNlc3JjaChkcl92YWwtPm9zLmRhdGEsIGRyX3ZhbC0+b3MubGVuLCBmZF9nX2NvbmZpZy0+Y25mX2RpYW1ybG0sIGZkX2dfY29uZmlnLT5jbmZfZGlhbXJsbV9sZW4sIE5VTEwpKSB7CisJCQkJCQkJaXNfZGVzdF9yZWFsbSA9IFlFUzsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJaXNfZGVzdF9yZWFsbSA9IE5POworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisKKwkJCQkJLyogd2UgYWxzbyB1c2UgVXNlci1OYW1lIGZvciBkZWNvcmF0ZWQgTkFJICovCisJCQkJCWNhc2UgQUNfVVNFUl9OQU1FOgorCQkJCQkJLyogUGFyc2UgdGhpcyBBVlAgKi8KKwkJCQkJCUNIRUNLX0ZDVF9ETyggcmV0ID0gZmRfbXNnX3BhcnNlX2RpY3QgKCBhdnAsIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgJmVycm9yX2luZm8gKSwKKwkJCQkJCQl7CisJCQkJCQkJCWlmIChlcnJvcl9pbmZvLnBlaV9lcnJjb2RlKSB7CisJCQkJCQkJCQlmZF9ob29rX2NhbGwoSE9PS19NRVNTQUdFX1BBUlNJTkdfRVJST1IsIG1zZ3B0ciwgTlVMTCwgZXJyb3JfaW5mby5wZWlfbWVzc2FnZSA/OiBlcnJvcl9pbmZvLnBlaV9lcnJjb2RlLCBmZF9tc2dfcG1kbF9nZXQobXNncHRyKSk7CisJCQkJCQkJCQlDSEVDS19GQ1QoIHJldHVybl9lcnJvciggJm1zZ3B0ciwgZXJyb3JfaW5mby5wZWlfZXJyY29kZSwgZXJyb3JfaW5mby5wZWlfbWVzc2FnZSwgZXJyb3JfaW5mby5wZWlfYXZwKSApOworCQkJCQkJCQkJaWYgKGVycm9yX2luZm8ucGVpX2F2cF9mcmVlKSB7IGZkX21zZ19mcmVlKGVycm9yX2luZm8ucGVpX2F2cCk7IH0KKwkJCQkJCQkJCXJldHVybiAwOworCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJZmRfaG9va19jYWxsKEhPT0tfTUVTU0FHRV9QQVJTSU5HX0VSUk9SLCBtc2dwdHIsIE5VTEwsICJVbnNwZWNpZmllZCBlcnJvciB3aGlsZSBwYXJzaW5nIFVzZXItTmFtZSBBVlAiLCBmZF9tc2dfcG1kbF9nZXQobXNncHRyKSk7CisJCQkJCQkJCQlyZXR1cm4gcmV0OworCQkJCQkJCQl9CisJCQkJCQkJfSApOworCQkJCQkJQVNTRVJUKCBhaGRyLT5hdnBfdmFsdWUgKTsKKwkJCQkJCXVuID0gYXZwOworCQkJCQkJdW5fdmFsID0gYWhkci0+YXZwX3ZhbHVlOworCQkJCQkJYnJlYWs7CisJCQkJCQkKKwkJCQkJY2FzZSBBQ19ST1VURV9SRUNPUkQ6CisJCQkJCQkvKiBQYXJzZSB0aGlzIEFWUCAqLworCQkJCQkJQ0hFQ0tfRkNUX0RPKCByZXQgPSBmZF9tc2dfcGFyc2VfZGljdCAoIGF2cCwgZmRfZ19jb25maWctPmNuZl9kaWN0LCAmZXJyb3JfaW5mbyApLAorCQkJCQkJCXsKKwkJCQkJCQkJaWYgKGVycm9yX2luZm8ucGVpX2VycmNvZGUpIHsKKwkJCQkJCQkJCWZkX2hvb2tfY2FsbChIT09LX01FU1NBR0VfUEFSU0lOR19FUlJPUiwgbXNncHRyLCBOVUxMLCBlcnJvcl9pbmZvLnBlaV9tZXNzYWdlID86IGVycm9yX2luZm8ucGVpX2VycmNvZGUsIGZkX21zZ19wbWRsX2dldChtc2dwdHIpKTsKKwkJCQkJCQkJCUNIRUNLX0ZDVCggcmV0dXJuX2Vycm9yKCAmbXNncHRyLCBlcnJvcl9pbmZvLnBlaV9lcnJjb2RlLCBlcnJvcl9pbmZvLnBlaV9tZXNzYWdlLCBlcnJvcl9pbmZvLnBlaV9hdnApICk7CisJCQkJCQkJCQlpZiAoZXJyb3JfaW5mby5wZWlfYXZwX2ZyZWUpIHsgZmRfbXNnX2ZyZWUoZXJyb3JfaW5mby5wZWlfYXZwKTsgfQorCQkJCQkJCQkJcmV0dXJuIDA7CisJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQlmZF9ob29rX2NhbGwoSE9PS19NRVNTQUdFX1BBUlNJTkdfRVJST1IsIG1zZ3B0ciwgTlVMTCwgIlVuc3BlY2lmaWVkIGVycm9yIHdoaWxlIHBhcnNpbmcgUm91dGUtUmVjb3JkIEFWUCIsIGZkX21zZ19wbWRsX2dldChtc2dwdHIpKTsKKwkJCQkJCQkJCXJldHVybiByZXQ7CisJCQkJCQkJCX0KKwkJCQkJCQl9ICk7CisJCQkJCQlBU1NFUlQoIGFoZHItPmF2cF92YWx1ZSApOworCQkJCQkJLyogSXMgdGhpcyBvdXIgb3duIG5hbWUgPyAqLworCQkJCQkJaWYgKCFmZF9vc19hbG1vc3RjYXNlc3JjaChhaGRyLT5hdnBfdmFsdWUtPm9zLmRhdGEsIGFoZHItPmF2cF92YWx1ZS0+b3MubGVuLCBmZF9nX2NvbmZpZy0+Y25mX2RpYW1pZCwgZmRfZ19jb25maWctPmNuZl9kaWFtaWRfbGVuLCBOVUxMKSkgeworCQkJCQkJCS8qIFllczogdGhlbiB3ZSBtdXN0IHJldHVybiBESUFNRVRFUl9MT09QX0RFVEVDVEVEIGFjY29yZGluZyB0byBEaWFtZXRlciBSRkMgKi8KKwkJCQkJCQljaGFyICogZXJyb3IgPSAiRElBTUVURVJfTE9PUF9ERVRFQ1RFRCI7CisJCQkJCQkJZmRfaG9va19jYWxsKEhPT0tfTUVTU0FHRV9QQVJTSU5HX0VSUk9SLCBtc2dwdHIsIE5VTEwsIGVycm9yLCBmZF9tc2dfcG1kbF9nZXQobXNncHRyKSk7CisJCQkJCQkJQ0hFQ0tfRkNUKCByZXR1cm5fZXJyb3IoICZtc2dwdHIsIGVycm9yLCBOVUxMLCBOVUxMKSApOworCQkJCQkJCXJldHVybiAwOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCQkKKwkJCQkJCisJCQkJfQorCQkJfQorCisJCQkvKiBTdG9wIHdoZW4gd2UgZm91bmQgYWxsIDMgQVZQcyAtLSB0aGV5IGFyZSBzdXBwb3NlZCB0byBiZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtZXNzYWdlLCBzbyB0aGlzIHNob3VsZCBiZSBmYXN0ICovCisJCQlpZiAoKGlzX2Rlc3RfaG9zdCAhPSBVTktOT1dOKSAmJiAoaXNfZGVzdF9yZWFsbSAhPSBVTktOT1dOKSAmJiB1bikKKwkJCQlicmVhazsKKworCQkJLyogR28gdG8gbmV4dCBBVlAgKi8KKwkJCUNIRUNLX0ZDVCggIGZkX21zZ19icm93c2UoYXZwLCBNU0dfQlJXX05FWFQsICZhdnAsIE5VTEwpICApOworCQl9CisKKwkJLyogT0ssIG5vdyBkZWNpZGUgd2hhdCB3ZSBkbyB3aXRoIHRoZSByZXF1ZXN0ICovCisKKwkJLyogSGFuZGxlIHRoZSBtaXNzaW5nIHJvdXRpbmcgQVZQcyBmaXJzdCAqLworCQlpZiAoIGlzX2Rlc3RfcmVhbG0gPT0gVU5LTk9XTiApIHsKKwkJCWZkX2hvb2tfY2FsbChIT09LX01FU1NBR0VfUEFSU0lOR19FUlJPUiwgbXNncHRyLCBOVUxMLCAiTm9uLXJvdXRhYmxlIG1lc3NhZ2Ugbm90IHN1cHBvcnRlZCAoaW52YWxpZCBiaXQgPyBtaXNzaW5nIERlc3RpbmF0aW9uLVJlYWxtID8pIiwgZmRfbXNnX3BtZGxfZ2V0KG1zZ3B0cikpOworCQkJQ0hFQ0tfRkNUKCByZXR1cm5fZXJyb3IoICZtc2dwdHIsICJESUFNRVRFUl9DT01NQU5EX1VOU1VQUE9SVEVEIiwgIk5vbi1yb3V0YWJsZSBtZXNzYWdlIG5vdCBzdXBwb3J0ZWQgKGludmFsaWQgYml0ID8gbWlzc2luZyBEZXN0aW5hdGlvbi1SZWFsbSA/KSIsIE5VTEwpICk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCS8qIElmIHdlIGFyZSBsaXN0ZWQgYXMgRGVzdGluYXRpb24tSG9zdCAqLworCQlpZiAoaXNfZGVzdF9ob3N0ID09IFlFUykgeworCQkJaWYgKGlzX2xvY2FsX2FwcCA9PSBZRVMpIHsKKwkJCQkvKiBPaywgZ2l2ZSB0aGUgbWVzc2FnZSB0byB0aGUgZGlzcGF0Y2ggdGhyZWFkICovCisJCQkJZmRfaG9va19jYWxsKEhPT0tfTUVTU0FHRV9ST1VUSU5HX0xPQ0FMLCBtc2dwdHIsIE5VTEwsIE5VTEwsIGZkX21zZ19wbWRsX2dldChtc2dwdHIpKTsKKwkJCQlDSEVDS19GQ1QoIGZkX2ZpZm9fcG9zdChmZF9nX2xvY2FsLCAmbXNncHRyKSApOworCQkJfSBlbHNlIHsKKwkJCQkvKiBXZSBkb24ndCBzdXBwb3J0IHRoZSBhcHBsaWNhdGlvbiwgcmVwbHkgYW4gZXJyb3IgKi8KKwkJCQlmZF9ob29rX2NhbGwoSE9PS19NRVNTQUdFX1BBUlNJTkdfRVJST1IsIG1zZ3B0ciwgTlVMTCwgIkFwcGxpY2F0aW9uIHVuc3VwcG9ydGVkIiwgZmRfbXNnX3BtZGxfZ2V0KG1zZ3B0cikpOworCQkJCUNIRUNLX0ZDVCggcmV0dXJuX2Vycm9yKCAmbXNncHRyLCAiRElBTUVURVJfQVBQTElDQVRJT05fVU5TVVBQT1JURUQiLCBOVUxMLCBOVUxMKSApOworCQkJfQorCQkJcmV0dXJuIDA7CisJCX0KKworCQkvKiBJZiB0aGUgbWVzc2FnZSBpcyBleHBsaWNpdGVseSBmb3Igc29tZW9uZSBlbHNlICovCisJCWlmICgoaXNfZGVzdF9ob3N0ID09IE5PKSB8fCAoaXNfZGVzdF9yZWFsbSA9PSBOTykpIHsKKwkJCWlmIChmZF9nX2NvbmZpZy0+Y25mX2ZsYWdzLm5vX2Z3ZCkgeworCQkJCWZkX2hvb2tfY2FsbChIT09LX01FU1NBR0VfUk9VVElOR19FUlJPUiwgbXNncHRyLCBOVUxMLCAiTWVzc2FnZSBmb3IgYW5vdGhlciByZWFsbS9ob3N0IiwgZmRfbXNnX3BtZGxfZ2V0KG1zZ3B0cikpOworCQkJCUNIRUNLX0ZDVCggcmV0dXJuX2Vycm9yKCAmbXNncHRyLCAiRElBTUVURVJfVU5BQkxFX1RPX0RFTElWRVIiLCAiSSBhbSBub3QgYSBEaWFtZXRlciBhZ2VudCIsIE5VTEwpICk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0gZWxzZSB7CisJCS8qIERlc3RpbmF0aW9uLUhvc3Qgd2FzIG5vdCBzZXQsIGFuZCBEZXN0aW5hdGlvbi1SZWFsbSBpcyBtYXRjaGluZyA6IHdlIG1heSBoYW5kbGUgb3IgcGFzcyB0byBhIGZlbGxvdyBwZWVyICovCisJCQlpbnQgaXNfbmFpID0gMDsKKworCQkJLyogdGVzdCBmb3IgZGVjb3JhdGVkIE5BSSAgKFJGQzU3Mjkgc2VjdGlvbiA0LjQpICovCisJCQkvKiBIYW5kbGUgdGhlIGRlY29yYXRlZCBOQUkgKi8KKwkJCWlmICh1bl92YWwpIHsKKwkJCQlDSEVDS19GQ1RfRE8oIHByb2Nlc3NfZGVjb3JhdGVkX05BSSgmaXNfbmFpLCB1bl92YWwsIGRyX3ZhbCksCisJCQkJCXsKKwkJCQkJCS8qIElmIHRoZSBwcm9jZXNzIGZhaWxlZCwgd2UgYXNzdW1lIGl0IGlzIGJlY2F1c2Ugb2YgdGhlIEFWUCBmb3JtYXQgKi8KKwkJCQkJCWZkX2hvb2tfY2FsbChIT09LX01FU1NBR0VfUEFSU0lOR19FUlJPUiwgbXNncHRyLCBOVUxMLCAiRmFpbGVkIHRvIHByb2Nlc3MgZGVjb3JhdGVkIE5BSSIsIGZkX21zZ19wbWRsX2dldChtc2dwdHIpKTsKKwkJCQkJCUNIRUNLX0ZDVCggcmV0dXJuX2Vycm9yKCAmbXNncHRyLCAiRElBTUVURVJfSU5WQUxJRF9BVlBfVkFMVUUiLCAiRmFpbGVkIHRvIHByb2Nlc3MgZGVjb3JhdGVkIE5BSSIsIHVuKSApOworCQkJCQkJcmV0dXJuIDA7CisJCQkJCX0gKTsKKwkJCX0KKwkJCQkKKwkJCWlmIChpc19uYWkpIHsKKwkJCQkvKiBXZSBoYXZlIHRyYW5zZm9ybWVkIHRoZSBBVlAsIG5vdyBzdWJtaXQgaXQgYWdhaW4gaW4gdGhlIHF1ZXVlICovCisJCQkJQ0hFQ0tfRkNUKGZkX2ZpZm9fcG9zdChmZF9nX2luY29taW5nLCAmbXNncHRyKSApOworCQkJCXJldHVybiAwOworCQkJfQorCisJCQlpZiAoaXNfbG9jYWxfYXBwID09IFlFUykgeworCQkJCS8qIEhhbmRsZSBsb2NhbHkgc2luY2Ugd2UgYXJlIGFibGUgdG8gKi8KKwkJCQlmZF9ob29rX2NhbGwoSE9PS19NRVNTQUdFX1JPVVRJTkdfTE9DQUwsIG1zZ3B0ciwgTlVMTCwgTlVMTCwgZmRfbXNnX3BtZGxfZ2V0KG1zZ3B0cikpOworCQkJCUNIRUNLX0ZDVChmZF9maWZvX3Bvc3QoZmRfZ19sb2NhbCwgJm1zZ3B0cikgKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKworCQkJaWYgKGZkX2dfY29uZmlnLT5jbmZfZmxhZ3Mubm9fZndkKSB7CisJCQkJLyogV2UgcmV0dXJuIGFuIGVycm9yICovCisJCQkJZmRfaG9va19jYWxsKEhPT0tfTUVTU0FHRV9ST1VUSU5HX0VSUk9SLCBtc2dwdHIsIE5VTEwsICJBcHBsaWNhdGlvbiB1bnN1cHBvcnRlZCIsIGZkX21zZ19wbWRsX2dldChtc2dwdHIpKTsKKwkJCQlDSEVDS19GQ1QoIHJldHVybl9lcnJvciggJm1zZ3B0ciwgIkRJQU1FVEVSX0FQUExJQ0FUSU9OX1VOU1VQUE9SVEVEIiwgTlVMTCwgTlVMTCkgKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCisJCS8qIEZyb20gdGhhdCBwb2ludCwgZm9yIHJlcXVlc3RzLCB3ZSB3aWxsIGNhbGwgdGhlIHJlZ2lzdGVyZWQgY2FsbGJhY2tzLCB0aGVuIGZvcndhcmQgdG8gYW5vdGhlciBwZWVyICovCisKKwl9IGVsc2UgeworCQkvKiBUaGUgbWVzc2FnZSBpcyBhbiBhbnN3ZXIgKi8KKwkJc3RydWN0IG1zZyAqIHFyeTsKKworCQkvKiBSZXRyaWV2ZSB0aGUgY29ycmVzcG9uZGluZyBxdWVyeSBhbmQgaXRzIG9yaWdpbiAqLworCQlDSEVDS19GQ1QoIGZkX21zZ19hbnN3X2dldHEoIG1zZ3B0ciwgJnFyeSApICk7CisJCUNIRUNLX0ZDVCggZmRfbXNnX3NvdXJjZV9nZXQoIHFyeSwgJnFyeV9zcmMsIE5VTEwgKSApOworCisJCWlmICgoIXFyeV9zcmMpICYmICghaXNfZXJyKSkgeworCQkJLyogVGhlIG1lc3NhZ2UgaXMgYSBub3JtYWwgYW5zd2VyIHRvIGEgcmVxdWVzdCBpc3N1ZWQgbG9jYWx5LCB3ZSBkbyBub3QgY2FsbCB0aGUgY2FsbGJhY2tzIGNoYWluIG9uIGl0LiAqLworCQkJZmRfaG9va19jYWxsKEhPT0tfTUVTU0FHRV9ST1VUSU5HX0xPQ0FMLCBtc2dwdHIsIE5VTEwsIE5VTEwsIGZkX21zZ19wbWRsX2dldChtc2dwdHIpKTsKKwkJCUNIRUNLX0ZDVChmZF9maWZvX3Bvc3QoZmRfZ19sb2NhbCwgJm1zZ3B0cikgKTsKKwkJCXJldHVybiAwOworCQl9CisJCQorCQkvKiBGcm9tIHRoYXQgcG9pbnQsIGZvciBhbnN3ZXJzLCB3ZSB3aWxsIGNhbGwgdGhlIHJlZ2lzdGVyZWQgY2FsbGJhY2tzLCB0aGVuIHBhc3MgaXQgdG8gdGhlIGRpc3BhdGNoIG1vZHVsZSBvciBmb3J3YXJkIGl0ICovCisJfQorCisJLyogQ2FsbCBhbGwgcmVnaXN0ZXJlZCBjYWxsYmFja3MgZm9yIHRoaXMgbWVzc2FnZSAqLworCXsKKwkJc3RydWN0IGZkX2xpc3QgKiBsaTsKKworCQlDSEVDS19GQ1QoIHB0aHJlYWRfcndsb2NrX3JkbG9jayggJnJ0X2Z3ZF9sb2NrICkgKTsKKwkJcHRocmVhZF9jbGVhbnVwX3B1c2goIGZkX2NsZWFudXBfcndsb2NrLCAmcnRfZndkX2xvY2sgKTsKKworCQkvKiByZXF1ZXN0czogZGlyID0gMSAmIDIgPT4gaW4gb3JkZXI7IGFuc3dlcnMgPSAzICYgMiA9PiBpbiByZXZlcnNlIG9yZGVyICovCisJCWZvciAoCWxpID0gKGlzX3JlcSA/IHJ0X2Z3ZF9saXN0Lm5leHQgOiBydF9md2RfbGlzdC5wcmV2KSA7IG1zZ3B0ciAmJiAobGkgIT0gJnJ0X2Z3ZF9saXN0KSA7IGxpID0gKGlzX3JlcSA/IGxpLT5uZXh0IDogbGktPnByZXYpICkgeworCQkJc3RydWN0IHJ0X2hkbCAqIHJoID0gKHN0cnVjdCBydF9oZGwgKilsaTsKKwkJCWludCByZXQ7CisKKwkJCWlmIChpc19yZXEgJiYgKHJoLT5kaXIgPiBSVF9GV0RfQUxMKSkKKwkJCQlicmVhazsKKwkJCWlmICgoIWlzX3JlcSkgJiYgKHJoLT5kaXIgPCBSVF9GV0RfQUxMKSkKKwkJCQlicmVhazsKKworCQkJLyogT2ssIGNhbGwgdGhpcyBjYiAqLworCQkJVFJBQ0VfREVCVUcoQU5OT1lJTkcsICJDYWxsaW5nIG5leHQgRldEIGNhbGxiYWNrIG9uICVwIDogJXAiLCBtc2dwdHIsIHJoLT5ydF9md2RfY2IpOworCQkJQ0hFQ0tfRkNUX0RPKCByZXQgPSAoKnJoLT5ydF9md2RfY2IpKHJoLT5jYmRhdGEsICZtc2dwdHIpLAorCQkJCXsKKwkJCQkJY2hhciBidWZbMjU2XTsKKwkJCQkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIkEgRldEIHJvdXRpbmcgY2FsbGJhY2sgcmV0dXJuZWQgYW4gZXJyb3I6ICVzIiwgc3RyZXJyb3IocmV0KSk7CisJCQkJCWZkX2hvb2tfY2FsbChIT09LX01FU1NBR0VfUk9VVElOR19FUlJPUiwgbXNncHRyLCBOVUxMLCBidWYsIGZkX21zZ19wbWRsX2dldChtc2dwdHIpKTsKKwkJCQkJZmRfaG9va19jYWxsKEhPT0tfTUVTU0FHRV9EUk9QUEVELCBtc2dwdHIsIE5VTEwsIGJ1ZiwgZmRfbXNnX3BtZGxfZ2V0KG1zZ3B0cikpOworCQkJCQlmZF9tc2dfZnJlZShtc2dwdHIpOworCQkJCQltc2dwdHIgPSBOVUxMOworCQkJCQlicmVhazsKKwkJCQl9ICk7CisJCX0KKworCQlwdGhyZWFkX2NsZWFudXBfcG9wKDApOworCQlDSEVDS19GQ1QoIHB0aHJlYWRfcndsb2NrX3VubG9jayggJnJ0X2Z3ZF9sb2NrICkgKTsKKworCQkvKiBJZiBhIGNhbGxiYWNrIGhhcyBoYW5kbGVkIHRoZSBtZXNzYWdlLCB3ZSBzdG9wIG5vdyAqLworCQlpZiAoIW1zZ3B0cikKKwkJCXJldHVybiAwOworCX0KKworCS8qIE5vdyBwYXNzIHRoZSBtZXNzYWdlIHRvIHRoZSBuZXh0IHN0ZXA6IGVpdGhlciBmb3J3YXJkIHRvIGFub3RoZXIgcGVlciwgb3IgZGlzcGF0Y2ggdG8gbG9jYWwgZXh0ZW5zaW9ucyAqLworCWlmIChpc19yZXEgfHwgcXJ5X3NyYykgeworCQlmZF9ob29rX2NhbGwoSE9PS19NRVNTQUdFX1JPVVRJTkdfRk9SV0FSRCwgbXNncHRyLCBOVUxMLCBOVUxMLCBmZF9tc2dfcG1kbF9nZXQobXNncHRyKSk7CisJCUNIRUNLX0ZDVChmZF9maWZvX3Bvc3QoZmRfZ19vdXRnb2luZywgJm1zZ3B0cikgKTsKKwl9IGVsc2UgeworCQlmZF9ob29rX2NhbGwoSE9PS19NRVNTQUdFX1JPVVRJTkdfTE9DQUwsIG1zZ3B0ciwgTlVMTCwgTlVMTCwgZmRfbXNnX3BtZGxfZ2V0KG1zZ3B0cikpOworCQlDSEVDS19GQ1QoZmRfZmlmb19wb3N0KGZkX2dfbG9jYWwsICZtc2dwdHIpICk7CisJfQorCisJLyogV2UncmUgZG9uZSB3aXRoIHRoaXMgbWVzc2FnZSAqLworCXJldHVybiAwOworfQorCQkKKworLyogVGhlIFJPVVRJTkctT1VUIG1lc3NhZ2UgcHJvY2Vzc2luZyAqLworc3RhdGljIGludCBtc2dfcnRfb3V0KHN0cnVjdCBtc2cgKiBtc2cpCit7CisJc3RydWN0IHJ0X2RhdGEgKiBydGQgPSBOVUxMOworCXN0cnVjdCBtc2dfaGRyICogaGRyOworCWludCBpc19yZXEgPSAwOworCWludCByZXQ7CisJc3RydWN0IGZkX2xpc3QgKiBsaSwgKmNhbmRpZGF0ZXM7CisJc3RydWN0IGF2cCAqIGF2cDsKKwlzdHJ1Y3QgcnRkX2NhbmRpZGF0ZSAqIGM7CisJc3RydWN0IG1zZyAqbXNncHRyID0gbXNnOworCURpYW1JZF90IHFyeV9zcmMgPSBOVUxMOworCXNpemVfdCBxcnlfc3JjX2xlbiA9IDA7CisJCisJLyogUmVhZCB0aGUgbWVzc2FnZSBoZWFkZXIgKi8KKwlDSEVDS19GQ1QoIGZkX21zZ19oZHIobXNncHRyLCAmaGRyKSApOworCWlzX3JlcSA9IGhkci0+bXNnX2ZsYWdzICYgQ01EX0ZMQUdfUkVRVUVTVDsKKwkKKwkvKiBGb3IgYW5zd2VycywgdGhlIHJvdXRpbmcgaXMgdmVyeSBlYXN5ICovCisJaWYgKCAhIGlzX3JlcSApIHsKKwkJc3RydWN0IG1zZyAqIHFyeTsKKwkJc3RydWN0IG1zZ19oZHIgKiBxcnlfaGRyOworCQlzdHJ1Y3QgZmRfcGVlciAqIHBlZXIgPSBOVUxMOworCisJCS8qIFJldHJpZXZlIHRoZSBjb3JyZXNwb25kaW5nIHF1ZXJ5IGFuZCBpdHMgb3JpZ2luICovCisJCUNIRUNLX0ZDVCggZmRfbXNnX2Fuc3dfZ2V0cSggbXNncHRyLCAmcXJ5ICkgKTsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfc291cmNlX2dldCggcXJ5LCAmcXJ5X3NyYywgJnFyeV9zcmNfbGVuICkgKTsKKworCQlBU1NFUlQoIHFyeV9zcmMgKTsgLyogaWYgaXQgaXMgTlVMTCwgdGhlIG1lc3NhZ2Ugc2hvdWxkIGhhdmUgYmVlbiBpbiB0aGUgTE9DQUwgcXVldWUhICovCisKKwkJLyogRmluZCB0aGUgcGVlciBjb3JyZXNwb25kaW5nIHRvIHRoaXMgbmFtZSAqLworCQlDSEVDS19GQ1QoIGZkX3BlZXJfZ2V0YnlpZCggcXJ5X3NyYywgcXJ5X3NyY19sZW4sIDAsICh2b2lkICopICZwZWVyICkgKTsKKwkJaWYgKGZkX3BlZXJfZ2V0c3RhdGUocGVlcikgIT0gU1RBVEVfT1BFTiAmJiBmZF9wZWVyX2dldHN0YXRlKHBlZXIpICE9IFNUQVRFX0NMT1NJTkdfR1JBQ0UpIHsKKwkJCWNoYXIgYnVmWzEyOF07CisJCQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiVW5hYmxlIHRvIGZvcndhcmQgYW5zd2VyIHRvIGRlbGV0ZWQgLyBjbG9zZWQgcGVlciAnJXMnLiIsIHFyeV9zcmMpOworCQkJZmRfaG9va19jYWxsKEhPT0tfTUVTU0FHRV9ST1VUSU5HX0VSUk9SLCBtc2dwdHIsIE5VTEwsIGJ1ZiwgZmRfbXNnX3BtZGxfZ2V0KG1zZ3B0cikpOworCQkJZmRfaG9va19jYWxsKEhPT0tfTUVTU0FHRV9EUk9QUEVELCBtc2dwdHIsIE5VTEwsIGJ1ZiwgZmRfbXNnX3BtZGxfZ2V0KG1zZ3B0cikpOworCQkJZmRfbXNnX2ZyZWUobXNncHRyKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJLyogV2UgbXVzdCByZXN0b3JlIHRoZSBob3AtYnktaG9wIGlkICovCisJCUNIRUNLX0ZDVCggZmRfbXNnX2hkcihxcnksICZxcnlfaGRyKSApOworCQloZHItPm1zZ19oYmhpZCA9IHFyeV9oZHItPm1zZ19oYmhpZDsKKworCQkvKiBQdXNoIHRoZSBtZXNzYWdlIGludG8gdGhpcyBwZWVyICovCisJCUNIRUNLX0ZDVCggZmRfb3V0X3NlbmQoJm1zZ3B0ciwgTlVMTCwgcGVlciwgMSkgKTsKKworCQkvKiBXZSdyZSBkb25lIHdpdGggdGhpcyBhbnN3ZXIgKi8KKwkJcmV0dXJuIDA7CisJfQorCQorCS8qIEZyb20gdGhhdCBwb2ludCwgdGhlIG1lc3NhZ2UgaXMgYSByZXF1ZXN0ICovCisJQ0hFQ0tfRkNUKCBmZF9tc2dfc291cmNlX2dldCggbXNncHRyLCAmcXJ5X3NyYywgJnFyeV9zcmNfbGVuICkgKTsKKwkvKiBpZiBxcnlfc3JjICE9IE5VTEwsIHRoaXMgbWVzc2FnZSBpcyByZWxheWVkLCBvdGhlcndpc2UgaXQgaXMgbG9jYWxseSBpc3N1ZWQgKi8KKworCS8qIEdldCB0aGUgcm91dGluZyBkYXRhIG91dCBvZiB0aGUgbWVzc2FnZSBpZiBhbnkgKGluIGNhc2Ugb2YgcmUtdHJhbnNtaXQpICovCisJQ0hFQ0tfRkNUKCBmZF9tc2dfcnRfZ2V0ICggbXNncHRyLCAmcnRkICkgKTsKKworCS8qIElmIHRoZXJlIGlzIG5vIHJvdXRpbmcgZGF0YSBhbHJlYWR5LCBsZXQncyBjcmVhdGUgaXQgKi8KKwlpZiAocnRkID09IE5VTEwpIHsKKwkJQ0hFQ0tfRkNUKCBmZF9ydGRfaW5pdCgmcnRkKSApOworCisJCS8qIEFkZCBhbGwgcGVlcnMgY3VycmVudGx5IGluIE9QRU4gc3RhdGUgKi8KKwkJQ0hFQ0tfRkNUKCBwdGhyZWFkX3J3bG9ja19yZGxvY2soJmZkX2dfYWN0aXZfcGVlcnNfcncpICk7CisJCWZvciAobGkgPSBmZF9nX2FjdGl2X3BlZXJzLm5leHQ7IGxpICE9ICZmZF9nX2FjdGl2X3BlZXJzOyBsaSA9IGxpLT5uZXh0KSB7CisJCQlzdHJ1Y3QgZmRfcGVlciAqIHAgPSAoc3RydWN0IGZkX3BlZXIgKilsaS0+bzsKKwkJCUNIRUNLX0ZDVF9ETyggcmV0ID0gZmRfcnRkX2NhbmRpZGF0ZV9hZGQocnRkLCAKKwkJCQkJCQlwLT5wX2hkci5pbmZvLnBpX2RpYW1pZCwgCisJCQkJCQkJcC0+cF9oZHIuaW5mby5waV9kaWFtaWRsZW4sIAorCQkJCQkJCXAtPnBfaGRyLmluZm8ucnVudGltZS5waXJfcmVhbG0sCisJCQkJCQkJcC0+cF9oZHIuaW5mby5ydW50aW1lLnBpcl9yZWFsbWxlbiksIAorCQkJCXsgQ0hFQ0tfRkNUX0RPKCBwdGhyZWFkX3J3bG9ja191bmxvY2soJmZkX2dfYWN0aXZfcGVlcnNfcncpLCApOyByZXR1cm4gcmV0OyB9ICk7CisJCX0KKwkJQ0hFQ0tfRkNUKCBwdGhyZWFkX3J3bG9ja191bmxvY2soJmZkX2dfYWN0aXZfcGVlcnNfcncpICk7CisKKwkJLyogTm93IGxldCdzIHJlbW92ZSBhbGwgcGVlcnMgZnJvbSB0aGUgUm91dGUtUmVjb3JkcyAqLworCQlDSEVDS19GQ1QoICBmZF9tc2dfYnJvd3NlKG1zZ3B0ciwgTVNHX0JSV19GSVJTVF9DSElMRCwgJmF2cCwgTlVMTCkgICk7CisJCXdoaWxlIChhdnApIHsKKwkJCXN0cnVjdCBhdnBfaGRyICogYWhkcjsKKwkJCXN0cnVjdCBmZF9wZWkgZXJyb3JfaW5mbzsKKwkJCUNIRUNLX0ZDVCggIGZkX21zZ19hdnBfaGRyKCBhdnAsICZhaGRyICkgICk7CisKKwkJCWlmICgoYWhkci0+YXZwX2NvZGUgPT0gQUNfUk9VVEVfUkVDT1JEKSAmJiAoISAoYWhkci0+YXZwX2ZsYWdzICYgQVZQX0ZMQUdfVkVORE9SKSkgKSB7CisJCQkJLyogUGFyc2UgdGhpcyBBVlAgKi8KKwkJCQlDSEVDS19GQ1RfRE8oIHJldCA9IGZkX21zZ19wYXJzZV9kaWN0ICggYXZwLCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsICZlcnJvcl9pbmZvICksCisJCQkJCXsKKwkJCQkJCWlmIChlcnJvcl9pbmZvLnBlaV9lcnJjb2RlKSB7CisJCQkJCQkJQ0hFQ0tfRkNUKCByZXR1cm5fZXJyb3IoICZtc2dwdHIsIGVycm9yX2luZm8ucGVpX2VycmNvZGUsIGVycm9yX2luZm8ucGVpX21lc3NhZ2UsIGVycm9yX2luZm8ucGVpX2F2cCkgKTsKKwkJCQkJCQlpZiAoZXJyb3JfaW5mby5wZWlfYXZwX2ZyZWUpIHsgZmRfbXNnX2ZyZWUoZXJyb3JfaW5mby5wZWlfYXZwKTsgfQorCQkJCQkJCXJldHVybiAwOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlyZXR1cm4gcmV0OworCQkJCQkJfQorCQkJCQl9ICk7CisJCQkJQVNTRVJUKCBhaGRyLT5hdnBfdmFsdWUgKTsKKwkJCQkvKiBSZW1vdmUgdGhpcyB2YWx1ZSBmcm9tIHRoZSBsaXN0LiBXZSBkb24ndCBuZWVkIHRvIHBheSBzcGVjaWFsIGF0dGVudGlvbiB0byB0aGUgY29udGVudHMgaGVyZS4gKi8KKwkJCQlmZF9ydGRfY2FuZGlkYXRlX2RlbChydGQsIGFoZHItPmF2cF92YWx1ZS0+b3MuZGF0YSwgYWhkci0+YXZwX3ZhbHVlLT5vcy5sZW4pOworCQkJfQorCisJCQkvKiBHbyB0byBuZXh0IEFWUCAqLworCQkJQ0hFQ0tfRkNUKCAgZmRfbXNnX2Jyb3dzZShhdnAsIE1TR19CUldfTkVYVCwgJmF2cCwgTlVMTCkgICk7CisJCX0KKwkJCisJCS8qIFNhdmUgdGhlIHJvdXRpbmcgaW5mb3JtYXRpb24gaW4gdGhlIG1lc3NhZ2UgKi8KKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfcnRfYXNzb2NpYXRlICggbXNncHRyLCBydGQgKSApOworCX0KKworCS8qIE5vdGU6IHdlIHJlc2V0IHRoZSBzY29yZXMgYW5kIHBhc3MgdGhlIG1lc3NhZ2UgdG8gdGhlIGNhbGxiYWNrcywgbWF5YmUgd2UgY291bGQgcmUtdXNlIHRoZSBzYXZlZCBzY29yZXMgd2hlbiB3ZSBoYXZlIHJlY2VpdmVkIGFuIGVycm9yID8gLS0gVE9ETyAqLworCisJLyogT2ssIHdlIGhhdmUgb3VyIGxpc3QgaW4gcnRkIG5vdywgbGV0J3MgKHJlKWluaXRpYWxpemUgdGhlIHNjb3JlcyAqLworCWZkX3J0ZF9jYW5kaWRhdGVfZXh0cmFjdChydGQsICZjYW5kaWRhdGVzLCBGRF9TQ09SRV9JTkkpOworCisJLyogUGFzcyB0aGUgbGlzdCB0byByZWdpc3RlcmVkIGNhbGxiYWNrcyAoZXZlbiBpZiBpdCBpcyBlbXB0eSBsaXN0KSAqLworCXsKKwkJQ0hFQ0tfRkNUKCBwdGhyZWFkX3J3bG9ja19yZGxvY2soICZydF9vdXRfbG9jayApICk7CisJCXB0aHJlYWRfY2xlYW51cF9wdXNoKCBmZF9jbGVhbnVwX3J3bG9jaywgJnJ0X291dF9sb2NrICk7CisKKwkJLyogV2UgY2FsbCB0aGUgY2IgYnkgcmV2ZXJzZSBwcmlvcml0eSBvcmRlciAqLworCQlmb3IgKAlsaSA9IHJ0X291dF9saXN0LnByZXYgOyAobXNncHRyICE9IE5VTEwpICYmIChsaSAhPSAmcnRfb3V0X2xpc3QpIDsgbGkgPSBsaS0+cHJldiApIHsKKwkJCXN0cnVjdCBydF9oZGwgKiByaCA9IChzdHJ1Y3QgcnRfaGRsICopbGk7CisKKwkJCVRSQUNFX0RFQlVHKEFOTk9ZSU5HLCAiQ2FsbGluZyBuZXh0IE9VVCBjYWxsYmFjayBvbiAlcCA6ICVwIChwcmlvICVkKSIsIG1zZ3B0ciwgcmgtPnJ0X291dF9jYiwgcmgtPnByaW8pOworCQkJQ0hFQ0tfRkNUX0RPKCByZXQgPSAoKnJoLT5ydF9vdXRfY2IpKHJoLT5jYmRhdGEsICZtc2dwdHIsIGNhbmRpZGF0ZXMpLAorCQkJCXsKKwkJCQkJY2hhciBidWZbMjU2XTsKKwkJCQkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIkFuIE9VVCByb3V0aW5nIGNhbGxiYWNrIHJldHVybmVkIGFuIGVycm9yOiAlcyIsIHN0cmVycm9yKHJldCkpOworCQkJCQlmZF9ob29rX2NhbGwoSE9PS19NRVNTQUdFX1JPVVRJTkdfRVJST1IsIG1zZ3B0ciwgTlVMTCwgYnVmLCBmZF9tc2dfcG1kbF9nZXQobXNncHRyKSk7CisJCQkJCWZkX2hvb2tfY2FsbChIT09LX01FU1NBR0VfRFJPUFBFRCwgbXNncHRyLCBOVUxMLCBidWYsIGZkX21zZ19wbWRsX2dldChtc2dwdHIpKTsKKwkJCQkJZmRfbXNnX2ZyZWUobXNncHRyKTsKKwkJCQkJbXNncHRyID0gTlVMTDsKKwkJCQl9ICk7CisJCX0KKworCQlwdGhyZWFkX2NsZWFudXBfcG9wKDApOworCQlDSEVDS19GQ1QoIHB0aHJlYWRfcndsb2NrX3VubG9jayggJnJ0X291dF9sb2NrICkgKTsKKworCQkvKiBJZiBhbiBlcnJvciBvY2N1cnJlZCBvciB0aGUgY2FsbGJhY2sgZGlzcG9zZWQgb2YgdGhlIG1lc3NhZ2UsIGdvIHRvIG5leHQgbWVzc2FnZSAqLworCQlpZiAoISBtc2dwdHIpIHsKKwkJCXJldHVybiAwOworCQl9CisJfQorCQorCS8qIE9yZGVyIHRoZSBjYW5kaWRhdGUgcGVlcnMgYnkgc2NvcmUgYXR0cmlidXRlZCBieSB0aGUgY2FsbGJhY2tzICovCisJQ0hFQ0tfRkNUKCBmZF9ydGRfY2FuZGlkYXRlX3Jlb3JkZXIoY2FuZGlkYXRlcykgKTsKKworCS8qIE5vdyB0cnkgc2VuZGluZyB0aGUgbWVzc2FnZSAqLworCWZvciAobGkgPSBjYW5kaWRhdGVzLT5wcmV2OyBsaSAhPSBjYW5kaWRhdGVzOyBsaSA9IGxpLT5wcmV2KSB7CisJCXN0cnVjdCBmZF9wZWVyICogcGVlcjsKKworCQljID0gKHN0cnVjdCBydGRfY2FuZGlkYXRlICopIGxpOworCisJCS8qIFN0b3Agd2hlbiB3ZSBoYXZlIHJlYWNoZWQgdGhlIGVuZCBvZiB2YWxpZCBjYW5kaWRhdGVzICovCisJCWlmIChjLT5zY29yZSA8IDApCisJCQlicmVhazsKKworCQkvKiBTZWFyY2ggZm9yIHRoZSBwZWVyICovCisJCUNIRUNLX0ZDVCggZmRfcGVlcl9nZXRieWlkKCBjLT5kaWFtaWQsIGMtPmRpYW1pZGxlbiwgMCwgKHZvaWQgKikmcGVlciApICk7CisKKwkJaWYgKGZkX3BlZXJfZ2V0c3RhdGUocGVlcikgPT0gU1RBVEVfT1BFTikgeworCQkJLyogU2VuZCB0byB0aGlzIG9uZSAqLworCQkJQ0hFQ0tfRkNUX0RPKCBmZF9vdXRfc2VuZCgmbXNncHRyLCBOVUxMLCBwZWVyLCAxKSwgY29udGludWUgKTsKKwkJCQorCQkJLyogSWYgdGhlIHNlbmRpbmcgd2FzIHN1Y2Nlc3NmdWwgKi8KKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogSWYgdGhlIG1lc3NhZ2UgaGFzIG5vdCBiZWVuIHNlbnQsIHJldHVybiBhbiBlcnJvciAqLworCWlmIChtc2dwdHIpIHsKKwkJZmRfaG9va19jYWxsKEhPT0tfTUVTU0FHRV9ST1VUSU5HX0VSUk9SLCBtc2dwdHIsIE5VTEwsICJObyByZW1haW5pbmcgc3VpdGFibGUgY2FuZGlkYXRlIHRvIHJvdXRlIHRoZSBtZXNzYWdlIHRvIiwgZmRfbXNnX3BtZGxfZ2V0KG1zZ3B0cikpOworCQlyZXR1cm5fZXJyb3IoICZtc2dwdHIsICJESUFNRVRFUl9VTkFCTEVfVE9fREVMSVZFUiIsICJObyBzdWl0YWJsZSBjYW5kaWRhdGUgdG8gcm91dGUgdGhlIG1lc3NhZ2UgdG8iLCBOVUxMKTsKKwl9CisKKwkvKiBXZSdyZSBkb25lIHdpdGggdGhpcyBtZXNzYWdlICovCisJCisJcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICBNYW5hZ2VtZW50IG9mIHRoZSB0aHJlYWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBOb3RlOiBpbiB0aGUgZmlyc3QgdmVyc2lvbiwgd2Ugb25seSBjcmVhdGUgb25lIHRocmVhZCBvZiBlYWNoIGtpbmQuCisgV2UgY291bGQgaW1wcm92ZSB0aGUgc2NhbGFiaWxpdHkgYnkgdXNpbmcgdGhlIHRocmVzaG9sZCBmZWF0dXJlIG9mIHRoZSBxdWV1ZXMKKyB0byBjcmVhdGUgYWRkaXRpb25hbCB0aHJlYWRzIGlmIGEgcXVldWUgaXMgZmlsbGluZyB1cCwgb3IgYXQgbGVhc3QgZ2l2aW5nIGEgY29uZmlndXJhYmxlCisgbnVtYmVyIG9mIHRocmVhZHMgb2YgZWFjaCBraW5kLgorICovCisKKy8qIENvbnRyb2wgb2YgdGhlIHRocmVhZHMgKi8KK3N0YXRpYyBlbnVtIHsgUlVOID0gMCwgU1RPUCA9IDEgfSBvcmRlcl92YWwgPSBSVU47CitzdGF0aWMgcHRocmVhZF9tdXRleF90IG9yZGVyX3N0YXRlX2xvY2sgPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOworCisvKiBUaHJlYWRzIHJlcG9ydCB0aGVpciBzdGF0dXMgKi8KK2VudW0gdGhyZWFkX3N0YXRlIHsgTk9UUlVOTklORyA9IDAsIFJVTk5JTkcgPSAxIH07CitzdGF0aWMgdm9pZCBjbGVhbnVwX3N0YXRlKHZvaWQgKiBzdGF0ZV9sb2MpCit7CisJQ0hFQ0tfUE9TSVhfRE8oIHB0aHJlYWRfbXV0ZXhfbG9jaygmb3JkZXJfc3RhdGVfbG9jayksICk7CisJKihlbnVtIHRocmVhZF9zdGF0ZSAqKXN0YXRlX2xvYyA9IE5PVFJVTk5JTkc7CisJQ0hFQ0tfUE9TSVhfRE8oIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZvcmRlcl9zdGF0ZV9sb2NrKSwgKTsKK30KKworLyogVGhpcyBpcyB0aGUgY29tbW9uIHRocmVhZCBjb2RlIChzYW1lIGZvciByb3V0aW5nIGFuZCBkaXNwYXRjaGluZykgKi8KK3N0YXRpYyB2b2lkICogcHJvY2Vzc190aHIodm9pZCAqIGFyZywgaW50ICgqYWN0aW9uX2NiKShzdHJ1Y3QgbXNnICogbXNnKSwgc3RydWN0IGZpZm8gKiBxdWV1ZSwgY2hhciAqIGFjdGlvbl9uYW1lKQoreworCVRSQUNFX0VOVFJZKCIlcCAlcCAlcCAlcCIsIGFyZywgYWN0aW9uX2NiLCBxdWV1ZSwgYWN0aW9uX25hbWUpOworCQorCS8qIFNldCB0aGUgdGhyZWFkIG5hbWUgKi8KKwl7CisJCWNoYXIgYnVmWzQ4XTsKKwkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVzICglcCkiLCBhY3Rpb25fbmFtZSwgYXJnKTsKKwkJZmRfbG9nX3RocmVhZG5hbWUgKCBidWYgKTsKKwl9CisJCisJLyogVGhlIHRocmVhZCByZXBvcnRzIGl0cyBzdGF0dXMgd2hlbiBjYW5jZWxlZCAqLworCUNIRUNLX1BBUkFNU19ETyhhcmcsIHJldHVybiBOVUxMKTsKKwlwdGhyZWFkX2NsZWFudXBfcHVzaCggY2xlYW51cF9zdGF0ZSwgYXJnICk7CisJCisJLyogTWFyayB0aGUgdGhyZWFkIHJ1bm5pbmcgKi8KKwlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9tdXRleF9sb2NrKCZvcmRlcl9zdGF0ZV9sb2NrKSwgKTsKKwkqKGVudW0gdGhyZWFkX3N0YXRlICopYXJnID0gUlVOTklORzsKKwlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9tdXRleF91bmxvY2soJm9yZGVyX3N0YXRlX2xvY2spLCApOworCQorCWRvIHsKKwkJc3RydWN0IG1zZyAqIG1zZzsKKwkKKwkJLyogVGVzdCB0aGUgY3VycmVudCBvcmRlciAqLworCQl7CisJCQlpbnQgbXVzdF9zdG9wOworCQkJQ0hFQ0tfUE9TSVhfRE8oIHB0aHJlYWRfbXV0ZXhfbG9jaygmb3JkZXJfc3RhdGVfbG9jayksIHsgQVNTRVJUKDApOyB9ICk7IC8qIHdlIGxvY2sgdG8gZmx1c2ggdGhlIGNhY2hlcyAqLworCQkJbXVzdF9zdG9wID0gKG9yZGVyX3ZhbCA9PSBTVE9QKTsKKwkJCUNIRUNLX1BPU0lYX0RPKCBwdGhyZWFkX211dGV4X3VubG9jaygmb3JkZXJfc3RhdGVfbG9jayksIHsgQVNTRVJUKDApOyB9ICk7CisJCQlpZiAobXVzdF9zdG9wKQorCQkJCWdvdG8gZW5kOworCQkJCisJCQlwdGhyZWFkX3Rlc3RjYW5jZWwoKTsKKwkJfQorCQkKKwkJLyogT2ssIHdlIGFyZSBhbGxvd2VkIHRvIHJ1biAqLworCQkKKwkJLyogR2V0IHRoZSBuZXh0IG1lc3NhZ2UgZnJvbSB0aGUgcXVldWUgKi8KKwkJeworCQkJaW50IHJldDsKKwkJCXN0cnVjdCB0aW1lc3BlYyB0czsKKwkJCQorCQkJQ0hFQ0tfU1lTX0RPKCBjbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmdHMpLCBnb3RvIGZhdGFsX2Vycm9yICk7CisJCQl0cy50dl9zZWMgKz0gMTsKKwkJCQorCQkJcmV0ID0gZmRfZmlmb190aW1lZGdldCAoIHF1ZXVlLCAmbXNnLCAmdHMgKTsKKwkJCWlmIChyZXQgPT0gRVRJTUVET1VUKQorCQkJCS8qIGxvb3AsIGNoZWNrIGlmIHRoZSB0aHJlYWQgbXVzdCBzdG9wIG5vdyAqLworCQkJCWNvbnRpbnVlOworCQkJaWYgKHJldCA9PSBFUElQRSkKKwkJCQkvKiBUaGUgcXVldWUgd2FzIGRlc3Ryb3llZCwgd2UgYXJlIHByb2JhYmx5IGV4aXRpbmcgKi8KKwkJCQlnb3RvIGVuZDsKKwkJCQorCQkJLyogY2hlY2sgaWYgYW5vdGhlciBlcnJvciBvY2N1cnJlZCAqLworCQkJQ0hFQ0tfRkNUX0RPKCByZXQsIGdvdG8gZmF0YWxfZXJyb3IgKTsKKwkJfQorCQkKKwkJTE9HX0EoIiVzOiBQaWNrZWQgbmV4dCBtZXNzYWdlIiwgYWN0aW9uX25hbWUpOworCisJCS8qIE5vdyBwcm9jZXNzIHRoZSBtZXNzYWdlICovCisJCUNIRUNLX0ZDVF9ETyggKCphY3Rpb25fY2IpKG1zZyksIGdvdG8gZmF0YWxfZXJyb3IpOworCisJCS8qIFdlJ3JlIGRvbmUgd2l0aCB0aGlzIG1lc3NhZ2UgKi8KKwkKKwl9IHdoaWxlICgxKTsKKwkKK2ZhdGFsX2Vycm9yOgorCVRSQUNFX0RFQlVHKElORk8sICJBbiB1bnJlY292ZXJhYmxlIGVycm9yIG9jY3VycmVkLCAlcyB0aHJlYWQgaXMgdGVybWluYXRpbmcuLi4iLCBhY3Rpb25fbmFtZSk7CisJQ0hFQ0tfRkNUX0RPKGZkX2NvcmVfc2h1dGRvd24oKSwgKTsKKwkKK2VuZDoJCisJOyAvKiBub29wIHNvIHRoYXQgd2UgZ2V0IHJpZCBvZiAibGFiZWwgYXQgZW5kIG9mIGNvbXB1bmQgc3RhdGVtZW50IiB3YXJuaW5nICovCisJLyogTWFyayB0aGUgdGhyZWFkIGFzIHRlcm1pbmF0ZWQgKi8KKwlwdGhyZWFkX2NsZWFudXBfcG9wKDEpOworCXJldHVybiBOVUxMOworfQorCisvKiBUaGUgZGlzcGF0Y2ggdGhyZWFkICovCitzdGF0aWMgdm9pZCAqIGRpc3BhdGNoX3Rocih2b2lkICogYXJnKQoreworCXJldHVybiBwcm9jZXNzX3RocihhcmcsIG1zZ19kaXNwYXRjaCwgZmRfZ19sb2NhbCwgIkRpc3BhdGNoIik7Cit9CisKKy8qIFRoZSAocm91dGluZy1pbikgdGhyZWFkIC0tIHNlZSBkZXNjcmlwdGlvbiBpbiBmcmVlRGlhbWV0ZXIuaCAqLworc3RhdGljIHZvaWQgKiByb3V0aW5nX2luX3Rocih2b2lkICogYXJnKQoreworCXJldHVybiBwcm9jZXNzX3RocihhcmcsIG1zZ19ydF9pbiwgZmRfZ19pbmNvbWluZywgIlJvdXRpbmctSU4iKTsKK30KKworLyogVGhlIChyb3V0aW5nLW91dCkgdGhyZWFkIC0tIHNlZSBkZXNjcmlwdGlvbiBpbiBmcmVlRGlhbWV0ZXIuaCAqLworc3RhdGljIHZvaWQgKiByb3V0aW5nX291dF90aHIodm9pZCAqIGFyZykKK3sKKwlyZXR1cm4gcHJvY2Vzc190aHIoYXJnLCBtc2dfcnRfb3V0LCBmZF9nX291dGdvaW5nLCAiUm91dGluZy1PVVQiKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgIFRoZSBmdW5jdGlvbnMgZm9yIHRoZSBvdGhlciBmaWxlcyAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBwdGhyZWFkX3QgKiBkaXNwYXRjaCA9IE5VTEw7CitzdGF0aWMgZW51bSB0aHJlYWRfc3RhdGUgKiBkaXNwX3N0YXRlID0gTlVMTDsKKworLyogTGF0ZXI6IG1ha2UgdGhpcyBtb3JlIGR5bmFtaWMgKi8KK3N0YXRpYyBwdGhyZWFkX3QgcnRfb3V0ID0gKHB0aHJlYWRfdClOVUxMOworc3RhdGljIGVudW0gdGhyZWFkX3N0YXRlIG91dF9zdGF0ZSA9IE5PVFJVTk5JTkc7CisKK3N0YXRpYyBwdGhyZWFkX3QgcnRfaW4gID0gKHB0aHJlYWRfdClOVUxMOworc3RhdGljIGVudW0gdGhyZWFkX3N0YXRlIGluX3N0YXRlID0gTk9UUlVOTklORzsKKworLyogSW5pdGlhbGl6ZSB0aGUgcm91dGluZyBhbmQgZGlzcGF0Y2ggdGhyZWFkcyAqLworaW50IGZkX3J0ZGlzcF9pbml0KHZvaWQpCit7CisJaW50IGk7CisJCisJLyogUHJlcGFyZSB0aGUgYXJyYXkgZm9yIGRpc3BhdGNoICovCisJQ0hFQ0tfTUFMTE9DKCBkaXNwX3N0YXRlID0gY2FsbG9jKGZkX2dfY29uZmlnLT5jbmZfZGlzcHRociwgc2l6ZW9mKGVudW0gdGhyZWFkX3N0YXRlKSkgKTsKKwlDSEVDS19NQUxMT0MoIGRpc3BhdGNoID0gY2FsbG9jKGZkX2dfY29uZmlnLT5jbmZfZGlzcHRociwgc2l6ZW9mKHB0aHJlYWRfdCkpICk7CisJCisJLyogQ3JlYXRlIHRoZSB0aHJlYWRzICovCisJZm9yIChpPTA7IGkgPCBmZF9nX2NvbmZpZy0+Y25mX2Rpc3B0aHI7IGkrKykgeworCQlDSEVDS19QT1NJWCggcHRocmVhZF9jcmVhdGUoICZkaXNwYXRjaFtpXSwgTlVMTCwgZGlzcGF0Y2hfdGhyLCAmZGlzcF9zdGF0ZVtpXSApICk7CisJfQorCUNIRUNLX1BPU0lYKCBwdGhyZWFkX2NyZWF0ZSggJnJ0X291dCwgTlVMTCwgcm91dGluZ19vdXRfdGhyLCAmb3V0X3N0YXRlKSApOworCUNIRUNLX1BPU0lYKCBwdGhyZWFkX2NyZWF0ZSggJnJ0X2luLCAgTlVMTCwgcm91dGluZ19pbl90aHIsICAmaW5fc3RhdGUpICk7CisJCisJLyogTGF0ZXI6IFRPRE8oIlNldCB0aGUgdGhyZXNob2xkcyBmb3IgdGhlIHF1ZXVlcyB0byBjcmVhdGUgbW9yZSB0aHJlYWRzIGFzIG5lZWRlZCIpOyAqLworCQorCS8qIFJlZ2lzdGVyIHRoZSBidWlsdC1pbiBjYWxsYmFja3MgKi8KKwlDSEVDS19GQ1QoIGZkX3J0X291dF9yZWdpc3RlciggZG9udF9zZW5kX2lmX25vX2NvbW1vbl9hcHAsIE5VTEwsIDEwLCBOVUxMICkgKTsKKwlDSEVDS19GQ1QoIGZkX3J0X291dF9yZWdpc3Rlciggc2NvcmVfZGVzdGluYXRpb25fYXZwLCBOVUxMLCAxMCwgTlVMTCApICk7CisJCisJcmV0dXJuIDA7Cit9CisKKy8qIEFzayB0aGUgdGhyZWFkIHRvIHRlcm1pbmF0ZSBhZnRlciBuZXh0IGl0ZXJhdGlvbiAqLworaW50IGZkX3J0ZGlzcF9jbGVhbnN0b3Aodm9pZCkKK3sKKwlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9tdXRleF9sb2NrKCZvcmRlcl9zdGF0ZV9sb2NrKSwgKTsKKwlvcmRlcl92YWwgPSBTVE9QOworCUNIRUNLX1BPU0lYX0RPKCBwdGhyZWFkX211dGV4X3VubG9jaygmb3JkZXJfc3RhdGVfbG9jayksICk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc3RvcF90aHJlYWRfZGVsYXllZChlbnVtIHRocmVhZF9zdGF0ZSAqc3QsIHB0aHJlYWRfdCAqIHRociwgY2hhciAqIHRoX25hbWUpCit7CisJVFJBQ0VfRU5UUlkoIiVwICVwIiwgc3QsIHRocik7CisJQ0hFQ0tfUEFSQU1TX0RPKHN0ICYmIHRociwgcmV0dXJuKTsKKwlpbnQgdGVybWluYXRlZDsKKwkKKwlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9tdXRleF9sb2NrKCZvcmRlcl9zdGF0ZV9sb2NrKSwgKTsKKwl0ZXJtaW5hdGVkID0gKCpzdCA9PSBOT1RSVU5OSU5HKTsKKwlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9tdXRleF91bmxvY2soJm9yZGVyX3N0YXRlX2xvY2spLCApOworCQorCisJLyogV2FpdCBmb3IgYSBzZWNvbmQgZm9yIHRoZSB0aHJlYWQgdG8gY29tcGxldGUsIGJ5IG1vbml0b3JpbmcgbXlfc3RhdGUgKi8KKwlpZiAoIXRlcm1pbmF0ZWQpIHsKKwkJVFJBQ0VfREVCVUcoSU5GTywgIldhaXRpbmcgZm9yIHRoZSAlcyB0aHJlYWQgdG8gaGF2ZSBhIGNoYW5jZSB0byB0ZXJtaW5hdGUiLCB0aF9uYW1lKTsKKwkJZG8geworCQkJc3RydWN0IHRpbWVzcGVjCSB0cywgdHNfZmluYWw7CisKKwkJCUNIRUNLX1NZU19ETyggY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJnRzKSwgYnJlYWsgKTsKKwkJCQorCQkJdHNfZmluYWwudHZfc2VjID0gdHMudHZfc2VjICsgMTsKKwkJCXRzX2ZpbmFsLnR2X25zZWMgPSB0cy50dl9uc2VjOworCQkJCisJCQl3aGlsZSAoVFNfSVNfSU5GRVJJT1IoICZ0cywgJnRzX2ZpbmFsICkpIHsKKwkJCQorCQkJCUNIRUNLX1BPU0lYX0RPKCBwdGhyZWFkX211dGV4X2xvY2soJm9yZGVyX3N0YXRlX2xvY2spLCApOworCQkJCXRlcm1pbmF0ZWQgPSAoKnN0ID09IE5PVFJVTk5JTkcpOworCQkJCUNIRUNLX1BPU0lYX0RPKCBwdGhyZWFkX211dGV4X3VubG9jaygmb3JkZXJfc3RhdGVfbG9jayksICk7CisJCQkJaWYgKHRlcm1pbmF0ZWQpCisJCQkJCWJyZWFrOworCQkJCQorCQkJCXVzbGVlcCgxMDAwMDApOworCQkJCUNIRUNLX1NZU19ETyggY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJnRzKSwgYnJlYWsgKTsKKwkJCX0KKwkJfSB3aGlsZSAoMCk7CisJfQorCisJLyogTm93IHN0b3AgdGhlIHRocmVhZCBhbmQgcmVjbGFpbSBpdHMgcmVzb3VyY2VzICovCisJQ0hFQ0tfRkNUX0RPKCBmZF90aHJfdGVybSh0aHIgKSwgLyogY29udGludWUgKi8pOworCQorfQorCisvKiBTdG9wIHRoZSB0aHJlYWQgYWZ0ZXIgdXAgdG8gb25lIHNlY29uZCBvZiB3YWl0ICovCitpbnQgZmRfcnRkaXNwX2Zpbmkodm9pZCkKK3sKKwlpbnQgaTsKKwkKKwkvKiBEZXN0cm95IHRoZSBpbmNvbWluZyBxdWV1ZSAqLworCUNIRUNLX0ZDVF9ETyggZmRfcXVldWVzX2ZpbmkoJmZkX2dfaW5jb21pbmcpLCAvKiBpZ25vcmUgKi8pOworCQorCS8qIFN0b3AgdGhlIHJvdXRpbmcgSU4gdGhyZWFkICovCisJc3RvcF90aHJlYWRfZGVsYXllZCgmaW5fc3RhdGUsICZydF9pbiwgIklOIHJvdXRpbmciKTsKKwkKKwkvKiBEZXN0cm95IHRoZSBvdXRnb2luZyBxdWV1ZSAqLworCUNIRUNLX0ZDVF9ETyggZmRfcXVldWVzX2ZpbmkoJmZkX2dfb3V0Z29pbmcpLCAvKiBpZ25vcmUgKi8pOworCQorCS8qIFN0b3AgdGhlIHJvdXRpbmcgT1VUIHRocmVhZCAqLworCXN0b3BfdGhyZWFkX2RlbGF5ZWQoJm91dF9zdGF0ZSwgJnJ0X291dCwgIk9VVCByb3V0aW5nIik7CisJCisJLyogRGVzdHJveSB0aGUgbG9jYWwgcXVldWUgKi8KKwlDSEVDS19GQ1RfRE8oIGZkX3F1ZXVlc19maW5pKCZmZF9nX2xvY2FsKSwgLyogaWdub3JlICovKTsKKwkKKwkvKiBTdG9wIHRoZSBEaXNwYXRjaCB0aHJlYWRzICovCisJaWYgKGRpc3BhdGNoICE9IE5VTEwpIHsKKwkJZm9yIChpPTA7IGkgPCBmZF9nX2NvbmZpZy0+Y25mX2Rpc3B0aHI7IGkrKykgeworCQkJc3RvcF90aHJlYWRfZGVsYXllZCgmZGlzcF9zdGF0ZVtpXSwgJmRpc3BhdGNoW2ldLCAiRGlzcGF0Y2hpbmciKTsKKwkJfQorCQlmcmVlKGRpc3BhdGNoKTsKKwkJZGlzcGF0Y2ggPSBOVUxMOworCX0KKwlpZiAoZGlzcF9zdGF0ZSAhPSBOVUxMKSB7CisJCWZyZWUoZGlzcF9zdGF0ZSk7CisJCWRpc3Bfc3RhdGUgPSBOVUxMOworCX0KKwkKKwlyZXR1cm4gMDsKK30KKworLyogQ2xlYW51cCBoYW5kbGVycyAqLworaW50IGZkX3J0ZGlzcF9jbGVhbnVwKHZvaWQpCit7CisJLyogQ2xlYW51cCBhbGwgcmVtYWluaW5nIGhhbmRsZXJzICovCisJd2hpbGUgKCFGRF9JU19MSVNUX0VNUFRZKCZydF9md2RfbGlzdCkpIHsKKwkJQ0hFQ0tfRkNUX0RPKCBmZF9ydF9md2RfdW5yZWdpc3RlciAoICh2b2lkICopcnRfZndkX2xpc3QubmV4dCwgTlVMTCApLCAvKiBjb250aW51ZSAqLyApOworCX0KKwl3aGlsZSAoIUZEX0lTX0xJU1RfRU1QVFkoJnJ0X291dF9saXN0KSkgeworCQlDSEVDS19GQ1RfRE8oIGZkX3J0X291dF91bnJlZ2lzdGVyICggKHZvaWQgKilydF9vdXRfbGlzdC5uZXh0LCBOVUxMICksIC8qIGNvbnRpbnVlICovICk7CisJfQorCQorCWZkX2Rpc3BfdW5yZWdpc3Rlcl9hbGwoKTsgLyogZGVzdHJveSByZW1haW5pbmcgaGFuZGxlcnMgKi8KKworCXJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgRm9yIGV4dGVuc2lvbnMgdG8gcmVnaXN0ZXIgYSBuZXcgYXBwbCAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQWRkIGFuIGFwcGxpY2F0aW9uIGludG8gdGhlIHBlZXIncyBzdXBwb3J0ZWQgYXBwcyAqLworaW50IGZkX2Rpc3BfYXBwX3N1cHBvcnQgKCBzdHJ1Y3QgZGljdF9vYmplY3QgKiBhcHAsIHN0cnVjdCBkaWN0X29iamVjdCAqIHZlbmRvciwgaW50IGF1dGgsIGludCBhY2N0ICkKK3sKKwlhcHBsaWNhdGlvbl9pZF90IGFpZCA9IDA7CisJdmVuZG9yX2lkX3QJIHZpZCA9IDA7CisJCisJVFJBQ0VfRU5UUlkoIiVwICVwICVkICVkIiwgYXBwLCB2ZW5kb3IsIGF1dGgsIGFjY3QpOworCUNIRUNLX1BBUkFNUyggYXBwICYmIChhdXRoIHx8IGFjY3QpICk7CisJCisJeworCQllbnVtIGRpY3Rfb2JqZWN0X3R5cGUgdHlwZSA9IDA7CisJCXN0cnVjdCBkaWN0X2FwcGxpY2F0aW9uX2RhdGEgZGF0YTsKKwkJQ0hFQ0tfRkNUKCBmZF9kaWN0X2dldHR5cGUoYXBwLCAmdHlwZSkgKTsKKwkJQ0hFQ0tfUEFSQU1TKCB0eXBlID09IERJQ1RfQVBQTElDQVRJT04gKTsKKwkJQ0hFQ0tfRkNUKCBmZF9kaWN0X2dldHZhbChhcHAsICZkYXRhKSApOworCQlhaWQgPSBkYXRhLmFwcGxpY2F0aW9uX2lkOworCX0KKworCWlmICh2ZW5kb3IpIHsKKwkJZW51bSBkaWN0X29iamVjdF90eXBlIHR5cGUgPSAwOworCQlzdHJ1Y3QgZGljdF92ZW5kb3JfZGF0YSBkYXRhOworCQlDSEVDS19GQ1QoIGZkX2RpY3RfZ2V0dHlwZSh2ZW5kb3IsICZ0eXBlKSApOworCQlDSEVDS19QQVJBTVMoIHR5cGUgPT0gRElDVF9WRU5ET1IgKTsKKwkJQ0hFQ0tfRkNUKCBmZF9kaWN0X2dldHZhbCh2ZW5kb3IsICZkYXRhKSApOworCQl2aWQgPSBkYXRhLnZlbmRvcl9pZDsKKwl9CisJCisJcmV0dXJuIGZkX2FwcF9tZXJnZSgmZmRfZ19jb25maWctPmNuZl9hcHBzLCBhaWQsIHZpZCwgYXV0aCwgYWNjdCk7Cit9CisKKworCmRpZmYgLS1naXQgYS9saWJmZGNvcmUvc2N0cC5jIGIvbGliZmRjb3JlL3NjdHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODBhNDk3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZmRjb3JlL3NjdHAuYwpAQCAtMCwwICsxLDEzNTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDE1LCBXSURFIFByb2plY3QgYW5kIE5JQ1QJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFdJREUgUHJvamVjdCBvciBOSUNUIG5vciB0aGUgCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgV0lERSBQcm9qZWN0IGFuZCAJCQkJCQkgKgorKiAgIE5JQ1QuCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImZkY29yZS1pbnRlcm5hbC5oIgorI2luY2x1ZGUgImNueGN0eC5oIgorCisjaW5jbHVkZSA8bmV0aW5ldC9zY3RwLmg+CisjaW5jbHVkZSA8c3lzL3Vpby5oPgorCisvKiBTaXplIG9mIGJ1ZmZlciB0byByZWNlaXZlIGFuY2lsbGlhcnkgZGF0YS4gTWF5IG5lZWQgdG8gYmUgZW5sYXJnZWQgaWYgbW9yZSBzb2Nrb3B0IGFyZSBzZXQuLi4gKi8KKyNpZm5kZWYgQ01TR19CVUZfTEVOCisjZGVmaW5lIENNU0dfQlVGX0xFTgkxMDI0CisjZW5kaWYgLyogQ01TR19CVUZfTEVOICovCisKKy8qIFVzZSBvbGQgZHJhZnQtaWV0Zi10c3Z3Zy1zY3Rwc29ja2V0LTE3IEFQSSA/IElmIG5vdCBkZWZpbmVkLCBSRkM2NDU4IEFQSSB3aWxsIGJlIHVzZWQgKi8KKy8qICNkZWZpbmUgT0xEX1NDVFBfU09DS0VUX0FQSSAqLworCisvKiBBdXRvbWF0aWNhbGx5IGZhbGxiYWNrIHRvIG9sZCBBUEkgaWYgc29tZSBvZiB0aGUgbmV3IHN5bWJvbHMgYXJlIG5vdCBkZWZpbmVkICovCisjaWYgKCFkZWZpbmVkKFNDVFBfQ09OTkVDVFhfNF9BUkdTKSB8fCAoIWRlZmluZWQoU0NUUF9SRUNWUkNWSU5GTykpIHx8ICghZGVmaW5lZChTQ1RQX1NORElORk8pKSkgCisjIGRlZmluZSBPTERfU0NUUF9TT0NLRVRfQVBJCisjZW5kaWYKKworCisvKiBUZW1wZXIgd2l0aCB0aGUgcmV0cmFuc21pc3Npb24gdGltZXJzIHRvIHRyeSBhbmQgaW1wcm92ZSBkaXNjb25uZWN0aW9uIGRldGVjdGlvbiByZXNwb25zZT8gVW5kZWYgdGhpcyB0byBrZWVwIHRoZSBkZWZhdWx0cyBvZiBTQ1RQIHN0YWNrICovCisjaWZuZGVmIFVTRV9ERUZBVUxUX1NDVFBfUlRYX1BBUkFNUwkvKiBtYWtlIHRoaXMgYSBjb25maWd1cmF0aW9uIG9wdGlvbiBpZiB1c2VmdWwgKi8KKyNkZWZpbmUgQURKVVNUX1JUWF9QQVJBTVMKKyNlbmRpZiAvKiBVU0VfREVGQVVMVF9TQ1RQX1JUWF9QQVJBTVMgKi8KKworLyogUHJlLWJpbmRpbmcgc29ja2V0IG9wdGlvbnMgLS0gIyBzdHJlYW1zIHJlYWQgaW4gY29uZmlnICovCitzdGF0aWMgaW50IGZkX3NldHNvY2tvcHRfcHJlYmluZChpbnQgc2spCit7CisJc29ja2xlbl90IHN6OworCQorCVRSQUNFX0VOVFJZKCAiJWQiLCBzayk7CisJCisJQ0hFQ0tfUEFSQU1TKCBzayA+IDAgKTsKKwkKKwl7CisJCWludCByZXVzZSA9IDE7CisJCUNIRUNLX1NZUyggIHNldHNvY2tvcHQoc2ssIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwgJnJldXNlLCBzaXplb2YocmV1c2UpKSAgKTsKKwl9CisJCisjaWZkZWYgQURKVVNUX1JUWF9QQVJBTVMKKwkvKiBTZXQgdGhlIHJldHJhbnNtaXQgcGFyYW1ldGVycyAqLworCSNpZmRlZiBTQ1RQX1JUT0lORk8KKwl7CisJCXN0cnVjdCBzY3RwX3J0b2luZm8gcnRvaW5mbzsKKwkJbWVtc2V0KCZydG9pbmZvLCAwLCBzaXplb2YocnRvaW5mbykpOworCisJCWlmIChUUkFDRV9CT09MKEFOTk9ZSU5HKSkgeworCQkJc3ogPSBzaXplb2YocnRvaW5mbyk7CisJCQkvKiBSZWFkIHNvY2tldCBkZWZhdWx0cyAqLworCQkJQ0hFQ0tfU1lTKCAgZ2V0c29ja29wdChzaywgSVBQUk9UT19TQ1RQLCBTQ1RQX1JUT0lORk8sICZydG9pbmZvLCAmc3opICApOworCQkJaWYgKHN6ICE9IHNpemVvZihydG9pbmZvKSkKKwkJCXsKKwkJCQlUUkFDRV9ERUJVRyhJTkZPLCAiSW52YWxpZCBzaXplIG9mIHNvY2tldCBvcHRpb246ICVkIC8gJWQiLCBzeiwgKHNvY2tsZW5fdClzaXplb2YocnRvaW5mbykpOworCQkJCXJldHVybiBFTk9UU1VQOworCQkJfQorCQkJZmRfbG9nX2RlYnVnKCAiRGVmIFNDVFBfUlRPSU5GTyA6IHNydG9faW5pdGlhbCA6ICV1IiwgcnRvaW5mby5zcnRvX2luaXRpYWwpOworCQkJZmRfbG9nX2RlYnVnKCAiICAgICAgICAgICAgICAgICAgIHNydG9fbWluICAgICA6ICV1IiwgcnRvaW5mby5zcnRvX21pbik7CisJCQlmZF9sb2dfZGVidWcoICIgICAgICAgICAgICAgICAgICAgc3J0b19tYXggICAgIDogJXUiLCBydG9pbmZvLnNydG9fbWF4KTsKKwkJfQorCisJCS8qIHJ0b2luZm8uc3J0b19pbml0aWFsOiBFc3RpbWF0ZSBvZiB0aGUgUlRUIGJlZm9yZSBpdCBjYW4gYmUgbWVhc3VyZWQ7IGtlZXAgdGhlIGRlZmF1bHQgdmFsdWUgKi8KKwkJcnRvaW5mby5zcnRvX21heCA9IDUwMDA7IC8qIE1heGltdW0gcmV0cmFuc21pdCB0aW1lciAoaW4gbXMpLCB3ZSB3YW50IGZhc3QgcmV0cmFuc21pc3Npb24gdGltZS4gKi8KKwkJcnRvaW5mby5zcnRvX21pbiA9IDEwMDA7IC8qIFZhbHVlIHVuZGVyIHdoaWNoIHRoZSBSVE8gZG9lcyBub3QgZGVzY2VuZCwgd2Ugc2V0IHRoaXMgdmFsdWUgdG8gbm90IGNvbmZsaWN0IHdpdGggc3J0b19tYXggKi8KKworCQkvKiBTZXQgdGhlIG9wdGlvbiB0byB0aGUgc29ja2V0ICovCisJCUNIRUNLX1NZUyggIHNldHNvY2tvcHQoc2ssIElQUFJPVE9fU0NUUCwgU0NUUF9SVE9JTkZPLCAmcnRvaW5mbywgc2l6ZW9mKHJ0b2luZm8pKSAgKTsKKwkJCisJCWlmIChUUkFDRV9CT09MKEFOTk9ZSU5HKSkgeworCQkJLyogQ2hlY2sgbmV3IHZhbHVlcyAqLworCQkJQ0hFQ0tfU1lTKCAgZ2V0c29ja29wdChzaywgSVBQUk9UT19TQ1RQLCBTQ1RQX1JUT0lORk8sICZydG9pbmZvLCAmc3opICApOworCQkJZmRfbG9nX2RlYnVnKCAiTmV3IFNDVFBfUlRPSU5GTyA6IHNydG9faW5pdGlhbCA6ICV1IiwgcnRvaW5mby5zcnRvX2luaXRpYWwpOworCQkJZmRfbG9nX2RlYnVnKCAiICAgICAgICAgICAgICAgICAgIHNydG9fbWF4ICAgICA6ICV1IiwgcnRvaW5mby5zcnRvX21heCk7CisJCQlmZF9sb2dfZGVidWcoICIgICAgICAgICAgICAgICAgICAgc3J0b19taW4gICAgIDogJXUiLCBydG9pbmZvLnNydG9fbWluKTsKKwkJfQorCX0KKwkjZWxzZSAvKiBTQ1RQX1JUT0lORk8gKi8KKwlUUkFDRV9ERUJVRyhBTk5PWUlORywgIlNraXBwaW5nIFNDVFBfUlRPSU5GTyIpOworCSNlbmRpZiAvKiBTQ1RQX1JUT0lORk8gKi8KKwkKKwkvKiBTZXQgdGhlIGFzc29jaWF0aW9uIHBhcmFtZXRlcnM6IG1heCBudW1iZXIgb2YgcmV0cmFuc21pdHMsIC4uLiAqLworCSNpZmRlZiBTQ1RQX0FTU09DSU5GTworCXsKKwkJc3RydWN0IHNjdHBfYXNzb2NwYXJhbXMgYXNzb2M7CisJCW1lbXNldCgmYXNzb2MsIDAsIHNpemVvZihhc3NvYykpOworCisJCWlmIChUUkFDRV9CT09MKEFOTk9ZSU5HKSkgeworCQkJc3ogPSBzaXplb2YoYXNzb2MpOworCQkJLyogUmVhZCBzb2NrZXQgZGVmYXVsdHMgKi8KKwkJCUNIRUNLX1NZUyggIGdldHNvY2tvcHQoc2ssIElQUFJPVE9fU0NUUCwgU0NUUF9BU1NPQ0lORk8sICZhc3NvYywgJnN6KSAgKTsKKwkJCWlmIChzeiAhPSBzaXplb2YoYXNzb2MpKQorCQkJeworCQkJCVRSQUNFX0RFQlVHKElORk8sICJJbnZhbGlkIHNpemUgb2Ygc29ja2V0IG9wdGlvbjogJWQgLyAlZCIsIHN6LCAoc29ja2xlbl90KXNpemVvZihhc3NvYykpOworCQkJCXJldHVybiBFTk9UU1VQOworCQkJfQorCQkJZmRfbG9nX2RlYnVnKCAiRGVmIFNDVFBfQVNTT0NJTkZPIDogc2Fzb2NfYXNvY21heHJ4dCAgICAgICAgICAgICAgIDogJWh1IiwgYXNzb2Muc2Fzb2NfYXNvY21heHJ4dCk7CisJCQlmZF9sb2dfZGVidWcoICIgICAgICAgICAgICAgICAgICAgICBzYXNvY19udW1iZXJfcGVlcl9kZXN0aW5hdGlvbnMgOiAlaHUiLCBhc3NvYy5zYXNvY19udW1iZXJfcGVlcl9kZXN0aW5hdGlvbnMpOworCQkJZmRfbG9nX2RlYnVnKCAiICAgICAgICAgICAgICAgICAgICAgc2Fzb2NfcGVlcl9yd25kICAgICAgICAgICAgICAgIDogJXUiICwgYXNzb2Muc2Fzb2NfcGVlcl9yd25kKTsKKwkJCWZkX2xvZ19kZWJ1ZyggIiAgICAgICAgICAgICAgICAgICAgIHNhc29jX2xvY2FsX3J3bmQgICAgICAgICAgICAgICA6ICV1IiAsIGFzc29jLnNhc29jX2xvY2FsX3J3bmQpOworCQkJZmRfbG9nX2RlYnVnKCAiICAgICAgICAgICAgICAgICAgICAgc2Fzb2NfY29va2llX2xpZmUgICAgICAgICAgICAgIDogJXUiICwgYXNzb2Muc2Fzb2NfY29va2llX2xpZmUpOworCQl9CisKKwkJYXNzb2Muc2Fzb2NfYXNvY21heHJ4dCA9IDQ7CS8qIE1heGltdW0gbnVtYmVyIG9mIHJldHJhbnNtaXNzaW9uIGF0dGVtcHRzOiB3ZSB3YW50IGZhc3QgZGV0ZWN0aW9uIG9mIGVycm9ycyAqLworCQkJCQkJLyogTm90ZSB0aGF0IHRoaXMgbXVzdCByZW1haW4gbGVzcyB0aGFuIHRoZSBzdW0gb2YgcmV0cmFuc21pc3Npb24gcGFyYW1ldGVycyBvZiB0aGUgZGlmZmVyZW50IHBhdGhzLiAqLworCQkKKwkJLyogU2V0IHRoZSBvcHRpb24gdG8gdGhlIHNvY2tldCAqLworCQlDSEVDS19TWVMoICBzZXRzb2Nrb3B0KHNrLCBJUFBST1RPX1NDVFAsIFNDVFBfQVNTT0NJTkZPLCAmYXNzb2MsIHNpemVvZihhc3NvYykpICApOworCQkKKwkJaWYgKFRSQUNFX0JPT0woQU5OT1lJTkcpKSB7CisJCQkvKiBDaGVjayBuZXcgdmFsdWVzICovCisJCQlDSEVDS19TWVMoICBnZXRzb2Nrb3B0KHNrLCBJUFBST1RPX1NDVFAsIFNDVFBfQVNTT0NJTkZPLCAmYXNzb2MsICZzeikgICk7CisJCQlmZF9sb2dfZGVidWcoICJOZXcgU0NUUF9BU1NPQ0lORk8gOiBzYXNvY19hc29jbWF4cnh0ICAgICAgICAgICAgICAgOiAlaHUiLCBhc3NvYy5zYXNvY19hc29jbWF4cnh0KTsKKwkJCWZkX2xvZ19kZWJ1ZyggIiAgICAgICAgICAgICAgICAgICAgIHNhc29jX251bWJlcl9wZWVyX2Rlc3RpbmF0aW9ucyA6ICVodSIsIGFzc29jLnNhc29jX251bWJlcl9wZWVyX2Rlc3RpbmF0aW9ucyk7CisJCQlmZF9sb2dfZGVidWcoICIgICAgICAgICAgICAgICAgICAgICBzYXNvY19wZWVyX3J3bmQgICAgICAgICAgICAgICAgOiAldSIgLCBhc3NvYy5zYXNvY19wZWVyX3J3bmQpOworCQkJZmRfbG9nX2RlYnVnKCAiICAgICAgICAgICAgICAgICAgICAgc2Fzb2NfbG9jYWxfcnduZCAgICAgICAgICAgICAgIDogJXUiICwgYXNzb2Muc2Fzb2NfbG9jYWxfcnduZCk7CisJCQlmZF9sb2dfZGVidWcoICIgICAgICAgICAgICAgICAgICAgICBzYXNvY19jb29raWVfbGlmZSAgICAgICAgICAgICAgOiAldSIgLCBhc3NvYy5zYXNvY19jb29raWVfbGlmZSk7CisJCX0KKwl9CisJI2Vsc2UgLyogU0NUUF9BU1NPQ0lORk8gKi8KKwlUUkFDRV9ERUJVRyhBTk5PWUlORywgIlNraXBwaW5nIFNDVFBfQVNTT0NJTkZPIik7CisJI2VuZGlmIC8qIFNDVFBfQVNTT0NJTkZPICovCisjZW5kaWYgLyogQURKVVNUX1JUWF9QQVJBTVMgKi8KKwkKKwkvKiBTZXQgdGhlIElOSVQgcGFyYW1ldGVycywgc3VjaCBhcyBudW1iZXIgb2Ygc3RyZWFtcyAqLworCSNpZmRlZiBTQ1RQX0lOSVRNU0cKKwl7CisJCXN0cnVjdCBzY3RwX2luaXRtc2cgaW5pdDsKKwkJbWVtc2V0KCZpbml0LCAwLCBzaXplb2YoaW5pdCkpOworCQkKKwkJaWYgKFRSQUNFX0JPT0woQU5OT1lJTkcpKSB7CisJCQlzeiA9IHNpemVvZihpbml0KTsKKworCQkJLyogUmVhZCBzb2NrZXQgZGVmYXVsdHMgKi8KKwkJCUNIRUNLX1NZUyggIGdldHNvY2tvcHQoc2ssIElQUFJPVE9fU0NUUCwgU0NUUF9JTklUTVNHLCAmaW5pdCwgJnN6KSAgKTsKKwkJCWlmIChzeiAhPSBzaXplb2YoaW5pdCkpCisJCQl7CisJCQkJVFJBQ0VfREVCVUcoSU5GTywgIkludmFsaWQgc2l6ZSBvZiBzb2NrZXQgb3B0aW9uOiAlZCAvICVkIiwgc3osIChzb2NrbGVuX3Qpc2l6ZW9mKGluaXQpKTsKKwkJCQlyZXR1cm4gRU5PVFNVUDsKKwkJCX0KKwkJCWZkX2xvZ19kZWJ1ZyggIkRlZiBTQ1RQX0lOSVRNU0cgOiBzaW5pdF9udW1fb3N0cmVhbXMgICA6ICVodSIsIGluaXQuc2luaXRfbnVtX29zdHJlYW1zKTsKKwkJCWZkX2xvZ19kZWJ1ZyggIiAgICAgICAgICAgICAgICAgICBzaW5pdF9tYXhfaW5zdHJlYW1zICA6ICVodSIsIGluaXQuc2luaXRfbWF4X2luc3RyZWFtcyk7CisJCQlmZF9sb2dfZGVidWcoICIgICAgICAgICAgICAgICAgICAgc2luaXRfbWF4X2F0dGVtcHRzICAgOiAlaHUiLCBpbml0LnNpbml0X21heF9hdHRlbXB0cyk7CisJCQlmZF9sb2dfZGVidWcoICIgICAgICAgICAgICAgICAgICAgc2luaXRfbWF4X2luaXRfdGltZW8gOiAlaHUiLCBpbml0LnNpbml0X21heF9pbml0X3RpbWVvKTsKKwkJfQorCisJCS8qIFNldCB0aGUgaW5pdCBvcHRpb25zIC0tIG5lZWQgdG8gcmVjZWl2ZSBTQ1RQX0NPTU1fVVAgdG8gY29uZmlybSB0aGUgcmVxdWVzdGVkIHBhcmFtZXRlcnMsIGJ1dCB3ZSBkb24ndCBjYXJlIChiZXN0IGVmZm9ydCkgKi8KKwkJaW5pdC5zaW5pdF9udW1fb3N0cmVhbXMJICA9IGZkX2dfY29uZmlnLT5jbmZfc2N0cF9zdHI7CS8qIGRlc2lyZWQgbnVtYmVyIG9mIG91dGdvaW5nIHN0cmVhbXMgKi8KKwkJaW5pdC5zaW5pdF9tYXhfaW5pdF90aW1lbyA9IENOWF9USU1FT1VUICogMTAwMDsKKworCQkvKiBTZXQgdGhlIG9wdGlvbiB0byB0aGUgc29ja2V0ICovCisJCUNIRUNLX1NZUyggIHNldHNvY2tvcHQoc2ssIElQUFJPVE9fU0NUUCwgU0NUUF9JTklUTVNHLCAmaW5pdCwgc2l6ZW9mKGluaXQpKSAgKTsKKwkJCisJCWlmIChUUkFDRV9CT09MKEFOTk9ZSU5HKSkgeworCQkJLyogQ2hlY2sgbmV3IHZhbHVlcyAqLworCQkJQ0hFQ0tfU1lTKCAgZ2V0c29ja29wdChzaywgSVBQUk9UT19TQ1RQLCBTQ1RQX0lOSVRNU0csICZpbml0LCAmc3opICApOworCQkJZmRfbG9nX2RlYnVnKCAiTmV3IFNDVFBfSU5JVE1TRyA6IHNpbml0X251bV9vc3RyZWFtcyAgIDogJWh1IiwgaW5pdC5zaW5pdF9udW1fb3N0cmVhbXMpOworCQkJZmRfbG9nX2RlYnVnKCAiICAgICAgICAgICAgICAgICAgIHNpbml0X21heF9pbnN0cmVhbXMgIDogJWh1IiwgaW5pdC5zaW5pdF9tYXhfaW5zdHJlYW1zKTsKKwkJCWZkX2xvZ19kZWJ1ZyggIiAgICAgICAgICAgICAgICAgICBzaW5pdF9tYXhfYXR0ZW1wdHMgICA6ICVodSIsIGluaXQuc2luaXRfbWF4X2F0dGVtcHRzKTsKKwkJCWZkX2xvZ19kZWJ1ZyggIiAgICAgICAgICAgICAgICAgICBzaW5pdF9tYXhfaW5pdF90aW1lbyA6ICVodSIsIGluaXQuc2luaXRfbWF4X2luaXRfdGltZW8pOworCQl9CisJfQorCSNlbHNlIC8qIFNDVFBfSU5JVE1TRyAqLworCVRSQUNFX0RFQlVHKEFOTk9ZSU5HLCAiU2tpcHBpbmcgU0NUUF9JTklUTVNHIik7CisJI2VuZGlmIC8qIFNDVFBfSU5JVE1TRyAqLworCQorCS8qIFRoZSBTT19MSU5HRVIgb3B0aW9uIHdpbGwgYmUgcmVzZXQgaWYgd2Ugd2FudCB0byBwZXJmb3JtIFNDVFAgQUJPUlQgKi8KKwkjaWZkZWYgU09fTElOR0VSCisJeworCQlzdHJ1Y3QgbGluZ2VyIGxpbmdlcjsKKwkJbWVtc2V0KCZsaW5nZXIsIDAsIHNpemVvZihsaW5nZXIpKTsKKwkJCisJCWlmIChUUkFDRV9CT09MKEFOTk9ZSU5HKSkgeworCQkJc3ogPSBzaXplb2YobGluZ2VyKTsKKwkJCS8qIFJlYWQgc29ja2V0IGRlZmF1bHRzICovCisJCQlDSEVDS19TWVMoICBnZXRzb2Nrb3B0KHNrLCBTT0xfU09DS0VULCBTT19MSU5HRVIsICZsaW5nZXIsICZzeikgICk7CisJCQlpZiAoc3ogIT0gc2l6ZW9mKGxpbmdlcikpCisJCQl7CisJCQkJVFJBQ0VfREVCVUcoSU5GTywgIkludmFsaWQgc2l6ZSBvZiBzb2NrZXQgb3B0aW9uOiAlZCAvICVkIiwgc3osIChzb2NrbGVuX3Qpc2l6ZW9mKGxpbmdlcikpOworCQkJCXJldHVybiBFTk9UU1VQOworCQkJfQorCQkJZmRfbG9nX2RlYnVnKCAiRGVmIFNPX0xJTkdFUiA6IGxfb25vZmYgIDogJWQiLCBsaW5nZXIubF9vbm9mZik7CisJCQlmZF9sb2dfZGVidWcoICIgCSAgICAgICBsX2xpbmdlciA6ICVkIiwgbGluZ2VyLmxfbGluZ2VyKTsKKwkJfQorCQkKKwkJbGluZ2VyLmxfb25vZmYJPSAwOwkvKiBEbyBub3QgYWN0aXZhdGUgdGhlIGxpbmdlciAqLworCQlsaW5nZXIubF9saW5nZXIgPSAwOwkvKiBJZ25vcmVkLCBidXQgaXQgd291bGQgbWVhbiA6IFJldHVybiBpbW1lZGlhdGVseSB3aGVuIGNsb3NpbmcgKD0+IGFib3J0KSAoZ3JhY2VmdWwgc2h1dGRvd24gaW4gYmFja2dyb3VuZCkgKi8KKwkJCisJCS8qIFNldCB0aGUgb3B0aW9uICovCisJCUNIRUNLX1NZUyggIHNldHNvY2tvcHQoc2ssIFNPTF9TT0NLRVQsIFNPX0xJTkdFUiwgJmxpbmdlciwgc2l6ZW9mKGxpbmdlcikpICApOworCQkKKwkJaWYgKFRSQUNFX0JPT0woQU5OT1lJTkcpKSB7CisJCQkvKiBDaGVjayBuZXcgdmFsdWVzICovCisJCQlDSEVDS19TWVMoICBnZXRzb2Nrb3B0KHNrLCBTT0xfU09DS0VULCBTT19MSU5HRVIsICZsaW5nZXIsICZzeikgICk7CisJCQlmZF9sb2dfZGVidWcoICJOZXcgU09fTElOR0VSIDogbF9vbm9mZiAgOiAlZCIsIGxpbmdlci5sX29ub2ZmKTsKKwkJCWZkX2xvZ19kZWJ1ZyggIgkJICBsX2xpbmdlciA6ICVkIiwgbGluZ2VyLmxfbGluZ2VyKTsKKwkJfQorCX0KKwkjZWxzZSAvKiBTT19MSU5HRVIgKi8KKwlUUkFDRV9ERUJVRyhBTk5PWUlORywgIlNraXBwaW5nIFNPX0xJTkdFUiIpOworCSNlbmRpZiAvKiBTT19MSU5HRVIgKi8KKwkKKwkvKiBTZXQgdGhlIE5PREVMQVkgb3B0aW9uIChOYWdsZS1saWtlIGFsZ29yaXRobSkgKi8KKwkjaWZkZWYgU0NUUF9OT0RFTEFZCisJeworCQlpbnQgbm9kZWxheTsKKwkJCisJCWlmIChUUkFDRV9CT09MKEFOTk9ZSU5HKSkgeworCQkJc3ogPSBzaXplb2Yobm9kZWxheSk7CisJCQkvKiBSZWFkIHNvY2tldCBkZWZhdWx0cyAqLworCQkJQ0hFQ0tfU1lTKCAgZ2V0c29ja29wdChzaywgSVBQUk9UT19TQ1RQLCBTQ1RQX05PREVMQVksICZub2RlbGF5LCAmc3opICApOworCQkJaWYgKHN6ICE9IHNpemVvZihub2RlbGF5KSkKKwkJCXsKKwkJCQlUUkFDRV9ERUJVRyhJTkZPLCAiSW52YWxpZCBzaXplIG9mIHNvY2tldCBvcHRpb246ICVkIC8gJWQiLCBzeiwgKHNvY2tsZW5fdClzaXplb2Yobm9kZWxheSkpOworCQkJCXJldHVybiBFTk9UU1VQOworCQkJfQorCQkJZmRfbG9nX2RlYnVnKCAiRGVmIFNDVFBfTk9ERUxBWSB2YWx1ZSA6ICVzIiwgbm9kZWxheSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworCQl9CisKKwkJbm9kZWxheSA9IDE7CS8qIFdlIHR1cm4gT04gdG8gZGlzYWJsZSB0aGUgTmFnbGUgYWxnb3JpdGhtLCBzbyB0aGF0IHBhY2tldHMgYXJlIHNlbnQgQVNBUC4gKi8KKwkJCisJCS8qIFNldCB0aGUgb3B0aW9uIHRvIHRoZSBzb2NrZXQgKi8KKwkJQ0hFQ0tfU1lTKCAgc2V0c29ja29wdChzaywgSVBQUk9UT19TQ1RQLCBTQ1RQX05PREVMQVksICZub2RlbGF5LCBzaXplb2Yobm9kZWxheSkpICApOworCQkKKwkJaWYgKFRSQUNFX0JPT0woQU5OT1lJTkcpKSB7CisJCQkvKiBDaGVjayBuZXcgdmFsdWVzICovCisJCQlDSEVDS19TWVMoICBnZXRzb2Nrb3B0KHNrLCBJUFBST1RPX1NDVFAsIFNDVFBfTk9ERUxBWSwgJm5vZGVsYXksICZzeikgICk7CisJCQlmZF9sb2dfZGVidWcoICJOZXcgU0NUUF9OT0RFTEFZIHZhbHVlIDogJXMiLCBub2RlbGF5ID8gInRydWUiIDogImZhbHNlIik7CisJCX0KKwl9CisJI2Vsc2UgLyogU0NUUF9OT0RFTEFZICovCisJVFJBQ0VfREVCVUcoQU5OT1lJTkcsICJTa2lwcGluZyBTQ1RQX05PREVMQVkiKTsKKwkjZW5kaWYgLyogU0NUUF9OT0RFTEFZICovCisJCisJLyoKKwkgICBTT19SQ1ZCVUYJCQlzaXplIG9mIHJlY2VpdmVyIHdpbmRvdworCSAgIFNPX1NOREJVRgkJCXNpemUgb2YgcGVuZGluZyBkYXRhIHRvIHNlbmQKKwkgICBTQ1RQX0FVVE9DTE9TRQkJZm9yIG9uZS10by1tYW55IG9ubHkKKwkgICBTQ1RQX1BSSU1BUllfQUREUgkJdXNlIHRoaXMgYWRkcmVzcyBhcyBwcmltYXJ5IGxvY2FsbHkKKwkgICBTQ1RQX0FEQVBUQVRJT05fTEFZRVIJc2V0IGFkYXB0YXRpb24gbGF5ZXIgaW5kaWNhdGlvbiwgd2UgZG9uJ3QgdXNlIHRoaXMgCisJKi8KKwkKKwkvKiBTZXQgdGhlIFNDVFBfRElTQUJMRV9GUkFHTUVOVFMgb3B0aW9uLCByZXF1aXJlZCBmb3IgVExTICovCisJI2lmZGVmIFNDVFBfRElTQUJMRV9GUkFHTUVOVFMKKwl7CisJCWludCBub2ZyYWc7CisJCQorCQlpZiAoVFJBQ0VfQk9PTChBTk5PWUlORykpIHsKKwkJCXN6ID0gc2l6ZW9mKG5vZnJhZyk7CisJCQkvKiBSZWFkIHNvY2tldCBkZWZhdWx0cyAqLworCQkJQ0hFQ0tfU1lTKCAgZ2V0c29ja29wdChzaywgSVBQUk9UT19TQ1RQLCBTQ1RQX0RJU0FCTEVfRlJBR01FTlRTLCAmbm9mcmFnLCAmc3opICApOworCQkJaWYgKHN6ICE9IHNpemVvZihub2ZyYWcpKQorCQkJeworCQkJCVRSQUNFX0RFQlVHKElORk8sICJJbnZhbGlkIHNpemUgb2Ygc29ja2V0IG9wdGlvbjogJWQgLyAlZCIsIHN6LCAoc29ja2xlbl90KXNpemVvZihub2ZyYWcpKTsKKwkJCQlyZXR1cm4gRU5PVFNVUDsKKwkJCX0KKwkJCWZkX2xvZ19kZWJ1ZyggIkRlZiBTQ1RQX0RJU0FCTEVfRlJBR01FTlRTIHZhbHVlIDogJXMiLCBub2ZyYWcgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKwkJfQorCisJCW5vZnJhZyA9IDA7CS8qIFdlIHR1cm4gT04gdGhlIGZyYWdtZW50YXRpb24sIHNpbmNlIERpYW1ldGVyIG1lc3NhZ2VzICYgVExTIG1lc3NhZ2VzIGNhbiBiZSBxdWl0ZSBsYXJnZS4gKi8KKwkJCisJCS8qIFNldCB0aGUgb3B0aW9uIHRvIHRoZSBzb2NrZXQgKi8KKwkJQ0hFQ0tfU1lTKCAgc2V0c29ja29wdChzaywgSVBQUk9UT19TQ1RQLCBTQ1RQX0RJU0FCTEVfRlJBR01FTlRTLCAmbm9mcmFnLCBzaXplb2Yobm9mcmFnKSkgICk7CisJCQorCQlpZiAoVFJBQ0VfQk9PTChBTk5PWUlORykpIHsKKwkJCS8qIENoZWNrIG5ldyB2YWx1ZXMgKi8KKwkJCUNIRUNLX1NZUyggIGdldHNvY2tvcHQoc2ssIElQUFJPVE9fU0NUUCwgU0NUUF9ESVNBQkxFX0ZSQUdNRU5UUywgJm5vZnJhZywgJnN6KSAgKTsKKwkJCWZkX2xvZ19kZWJ1ZyggIk5ldyBTQ1RQX0RJU0FCTEVfRlJBR01FTlRTIHZhbHVlIDogJXMiLCBub2ZyYWcgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKwkJfQorCX0KKwkjZWxzZSAvKiBTQ1RQX0RJU0FCTEVfRlJBR01FTlRTICovCisJIyBlcnJvciAiVExTIHJlcXVpcmVzIHN1cHBvcnQgb2YgU0NUUF9ESVNBQkxFX0ZSQUdNRU5UUyIKKwkjZW5kaWYgLyogU0NUUF9ESVNBQkxFX0ZSQUdNRU5UUyAqLworCQorCS8qIFNDVFBfUEVFUl9BRERSX1BBUkFNUwljb250cm9sIGhlYXJ0YmVhdCBwZXIgcGVlciBhZGRyZXNzLiBXZSBzZXQgaXQgYXMgYSBkZWZhdWx0IGZvciBhbGwgYWRkcmVzc2VzIGluIHRoZSBhc3NvY2lhdGlvbjsgbm90IHN1cmUgaWYgaXQgd29ya3MgLi4uICovCisJI2lmZGVmIFNDVFBfUEVFUl9BRERSX1BBUkFNUworCXsKKwkJc3RydWN0IHNjdHBfcGFkZHJwYXJhbXMgcGFybXM7CisJCW1lbXNldCgmcGFybXMsIDAsIHNpemVvZihwYXJtcykpOworCQkKKwkJLyogU29tZSBrZXJuZWwgdmVyc2lvbnMgbmVlZCB0aGlzIHRvIGJlIHNldCAqLworCQlwYXJtcy5zcHBfYWRkcmVzcy5zc19mYW1pbHkgPSBBRl9JTkVUOworCQkKKwkJaWYgKFRSQUNFX0JPT0woQU5OT1lJTkcpKSB7CisJCQlzeiA9IHNpemVvZihwYXJtcyk7CisKKwkJCS8qIFJlYWQgc29ja2V0IGRlZmF1bHRzICovCisJCQlDSEVDS19TWVMoICBnZXRzb2Nrb3B0KHNrLCBJUFBST1RPX1NDVFAsIFNDVFBfUEVFUl9BRERSX1BBUkFNUywgJnBhcm1zLCAmc3opICApOworCQkJaWYgKHN6ICE9IHNpemVvZihwYXJtcykpCisJCQl7CisJCQkJVFJBQ0VfREVCVUcoSU5GTywgIkludmFsaWQgc2l6ZSBvZiBzb2NrZXQgb3B0aW9uOiAlZCAvICVkIiwgc3osIChzb2NrbGVuX3Qpc2l6ZW9mKHBhcm1zKSk7CisJCQkJcmV0dXJuIEVOT1RTVVA7CisJCQl9CisJCQlmZF9sb2dfZGVidWcoICJEZWYgU0NUUF9QRUVSX0FERFJfUEFSQU1TIDogc3BwX2hiaW50ZXJ2YWwgICAgOiAldSIsICBwYXJtcy5zcHBfaGJpbnRlcnZhbCk7CisJCQlmZF9sb2dfZGVidWcoICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BwX3BhdGhtYXhyeHQgICAgOiAlaHUiLCBwYXJtcy5zcHBfcGF0aG1heHJ4dCk7CisJCQlmZF9sb2dfZGVidWcoICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BwX3BhdGhtdHUgICAgICAgOiAldSIsICBwYXJtcy5zcHBfcGF0aG10dSk7CisJCQlmZF9sb2dfZGVidWcoICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BwX2ZsYWdzICAgICAgICAgOiAleCIsICBwYXJtcy5zcHBfZmxhZ3MpOworCQkJLy8gZmRfbG9nX2RlYnVnKCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcF9pcHY2X2Zsb3dsYWJlbDogJXUiLCAgcGFybXMuc3BwX2lwdjZfZmxvd2xhYmVsKTsKKwkJCS8vIGZkX2xvZ19kZWJ1ZyggIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHBfaXB2NF90b3MgICAgICA6ICVoaHUiLHBhcm1zLnNwcF9pcHY0X3Rvcyk7CisJCX0KKworCQlwYXJtcy5zcHBfZmxhZ3MgPSBTUFBfSEJfRU5BQkxFOwkvKiBFbmFibGUgaGVhcnRiZWF0IGZvciB0aGUgYXNzb2NpYXRpb24gKi8KKwkJI2lmZGVmIFNQUF9QTVRVRF9FTkFCTEUKKwkJcGFybXMuc3BwX2ZsYWdzIHw9IFNQUF9QTVRVRF9FTkFCTEU7CS8qIGFsc28gZW5hYmxlIHBhdGggTVRVIGRpc2NvdmVyeSBtZWNoYW5pc20gKi8KKwkJI2VuZGlmIC8qIFNQUF9QTVRVRF9FTkFCTEUgKi8KKwkJCisjaWZkZWYgQURKVVNUX1JUWF9QQVJBTVMKKwkJcGFybXMuc3BwX2hiaW50ZXJ2YWwgPSA2MDAwOwkJLyogU2VuZCBhbiBoZWFydGJlYXQgZXZlcnkgNiBzZWNvbmRzIHRvIHF1aWNrbHkgc3RhcnQgcmV0cmFuc21pc3Npb25zICovCisJCS8qIHBhcm1zLnNwcF9wYXRobWF4cnh0IDogbWF4IG5iciBvZiByZXN0cmFuc21pc3Npb25zIG9uIHRoaXMgYWRkcmVzcy4gVGhlcmUgaXMgYSByZWxhdGlvbnNoaXAgd2l0aCBzYXNvY19hc29jbWF4cnh0LCBzbyB3ZSBsZWF2ZSB0aGUgZGVmYXVsdCBoZXJlICovCisjZW5kaWYgLyogQURKVVNUX1JUWF9QQVJBTVMgKi8KKworCQkvKiBTZXQgdGhlIG9wdGlvbiB0byB0aGUgc29ja2V0ICovCisJCUNIRUNLX1NZUyggIHNldHNvY2tvcHQoc2ssIElQUFJPVE9fU0NUUCwgU0NUUF9QRUVSX0FERFJfUEFSQU1TLCAmcGFybXMsIHNpemVvZihwYXJtcykpICk7CisJCQorCQlpZiAoVFJBQ0VfQk9PTChBTk5PWUlORykpIHsKKwkJCS8qIENoZWNrIG5ldyB2YWx1ZXMgKi8KKwkJCUNIRUNLX1NZUyggIGdldHNvY2tvcHQoc2ssIElQUFJPVE9fU0NUUCwgU0NUUF9QRUVSX0FERFJfUEFSQU1TLCAmcGFybXMsICZzeikgICk7CisJCQlmZF9sb2dfZGVidWcoICJOZXcgU0NUUF9QRUVSX0FERFJfUEFSQU1TIDogc3BwX2hiaW50ZXJ2YWwgICAgOiAldSIsICBwYXJtcy5zcHBfaGJpbnRlcnZhbCk7CisJCQlmZF9sb2dfZGVidWcoICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BwX3BhdGhtYXhyeHQgICAgOiAlaHUiLCBwYXJtcy5zcHBfcGF0aG1heHJ4dCk7CisJCQlmZF9sb2dfZGVidWcoICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BwX3BhdGhtdHUgICAgICAgOiAldSIsICBwYXJtcy5zcHBfcGF0aG10dSk7CisJCQlmZF9sb2dfZGVidWcoICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BwX2ZsYWdzICAgICAgICAgOiAleCIsICBwYXJtcy5zcHBfZmxhZ3MpOworCQkJLy8gZmRfbG9nX2RlYnVnKCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcF9pcHY2X2Zsb3dsYWJlbDogJXUiLCAgcGFybXMuc3BwX2lwdjZfZmxvd2xhYmVsKTsKKwkJCS8vIGZkX2xvZ19kZWJ1ZyggIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHBfaXB2NF90b3MgICAgICA6ICVoaHUiLHBhcm1zLnNwcF9pcHY0X3Rvcyk7CisJCX0KKwl9CisJI2Vsc2UgLyogU0NUUF9QRUVSX0FERFJfUEFSQU1TICovCisJVFJBQ0VfREVCVUcoQU5OT1lJTkcsICJTa2lwcGluZyBTQ1RQX1BFRVJfQUREUl9QQVJBTVMiKTsKKwkjZW5kaWYgLyogU0NUUF9QRUVSX0FERFJfUEFSQU1TICovCisJCisJLyoKKwkgICBTQ1RQX0RFRkFVTFRfU0VORF9QQVJBTSAtIERFUFJFQ0FURUQgLy8gcGFyYW1ldGVycyBmb3IgdGhlIHNlbmR0bygpIGNhbGwsIHdlIGRvbid0IHVzZSBpdC4KKwkqLworCisJLyogU3Vic2NyaWJlIHRvIHNvbWUgbm90aWZpY2F0aW9ucyAqLworI2lmZGVmIE9MRF9TQ1RQX1NPQ0tFVF9BUEkKKwkjaWZkZWYgU0NUUF9FVkVOVFMgLyogREVQUkVDQVRFRCAqLworCXsKKwkJc3RydWN0IHNjdHBfZXZlbnRfc3Vic2NyaWJlIGV2ZW50OworCisJCW1lbXNldCgmZXZlbnQsIDAsIHNpemVvZihldmVudCkpOworCQlldmVudC5zY3RwX2RhdGFfaW9fZXZlbnQJPSAxOwkvKiB0byByZWNlaXZlIHRoZSBzdHJlYW0gSUQgaW4gU0NUUF9TTkRSQ1YgYW5jaWxsaWFyeSBkYXRhIG9uIG1lc3NhZ2UgcmVjZXB0aW9uICovCisJCWV2ZW50LnNjdHBfYXNzb2NpYXRpb25fZXZlbnQJPSAwOwkvKiBuZXcgb3IgY2xvc2VkIGFzc29jaWF0aW9ucyAobW9zdGx5IGZvciBvbmUtdG8tbWFueSBzdHlsZSBzb2NrZXRzKSAqLworCQlldmVudC5zY3RwX2FkZHJlc3NfZXZlbnQJPSAxOwkvKiBhZGRyZXNzIGNoYW5nZXMgKi8KKwkJZXZlbnQuc2N0cF9zZW5kX2ZhaWx1cmVfZXZlbnQJPSAxOwkvKiBkZWxpdmVyeSBmYWlsdXJlcyAqLworCQlldmVudC5zY3RwX3BlZXJfZXJyb3JfZXZlbnQJPSAxOwkvKiByZW1vdGUgcGVlciBzZW5kcyBhbiBlcnJvciAqLworCQlldmVudC5zY3RwX3NodXRkb3duX2V2ZW50CT0gMTsJLyogcGVlciBoYXMgc2VudCBhIFNIVVRET1dOICovCisJCWV2ZW50LnNjdHBfcGFydGlhbF9kZWxpdmVyeV9ldmVudCA9IDE7CS8qIGEgcGFydGlhbCBkZWxpdmVyeSBpcyBhYm9ydGVkLCBwcm9iYWJseSBpbmRpY2F0aW5nIHRoZSBjb25uZWN0aW9uIGlzIGJlaW5nIHNodXRkb3duICovCisJCS8vIGV2ZW50LnNjdHBfYWRhcHRhdGlvbl9sYXllcl9ldmVudCA9IDA7CS8qIGFkYXB0YXRpb24gbGF5ZXIgbm90aWZpY2F0aW9ucyAqLworCQkvLyBldmVudC5zY3RwX2F1dGhlbnRpY2F0aW9uX2V2ZW50ID0gMDsJLyogd2hlbiBuZXcga2V5IGlzIG1hZGUgYWN0aXZlICovCisKKwkJLyogU2V0IHRoZSBvcHRpb24gdG8gdGhlIHNvY2tldCAqLworCQlDSEVDS19TWVMoICBzZXRzb2Nrb3B0KHNrLCBJUFBST1RPX1NDVFAsIFNDVFBfRVZFTlRTLCAmZXZlbnQsIHNpemVvZihldmVudCkpICk7CisJCQorCQlpZiAoVFJBQ0VfQk9PTChBTk5PWUlORykpIHsKKwkJCXN6ID0gc2l6ZW9mKGV2ZW50KTsKKwkJCUNIRUNLX1NZUyggIGdldHNvY2tvcHQoc2ssIElQUFJPVE9fU0NUUCwgU0NUUF9FVkVOVFMsICZldmVudCwgJnN6KSApOworCQkJaWYgKHN6ICE9IHNpemVvZihldmVudCkpCisJCQl7CisJCQkJVFJBQ0VfREVCVUcoSU5GTywgIkludmFsaWQgc2l6ZSBvZiBzb2NrZXQgb3B0aW9uOiAlZCAvICVkIiwgc3osIChzb2NrbGVuX3Qpc2l6ZW9mKGV2ZW50KSk7CisJCQkJcmV0dXJuIEVOT1RTVVA7CisJCQl9CisKKwkJCWZkX2xvZ19kZWJ1ZyggIlNDVFBfRVZFTlRTIDogc2N0cF9kYXRhX2lvX2V2ZW50ICAgICAgICAgIDogJWhodSIsIGV2ZW50LnNjdHBfZGF0YV9pb19ldmVudCk7CisJCQlmZF9sb2dfZGVidWcoICIgICAgICAgCSAgICAgc2N0cF9hc3NvY2lhdGlvbl9ldmVudCAgICAgIDogJWhodSIsIGV2ZW50LnNjdHBfYXNzb2NpYXRpb25fZXZlbnQpOworCQkJZmRfbG9nX2RlYnVnKCAiICAgICAgIAkgICAgIHNjdHBfYWRkcmVzc19ldmVudAkgICAgICAgICA6ICVoaHUiLCBldmVudC5zY3RwX2FkZHJlc3NfZXZlbnQpOworCQkJZmRfbG9nX2RlYnVnKCAiICAgICAgIAkgICAgIHNjdHBfc2VuZF9mYWlsdXJlX2V2ZW50ICAgICA6ICVoaHUiLCBldmVudC5zY3RwX3NlbmRfZmFpbHVyZV9ldmVudCk7CisJCQlmZF9sb2dfZGVidWcoICIgICAgICAgCSAgICAgc2N0cF9wZWVyX2Vycm9yX2V2ZW50ICAgICAgIDogJWhodSIsIGV2ZW50LnNjdHBfcGVlcl9lcnJvcl9ldmVudCk7CisJCQlmZF9sb2dfZGVidWcoICIgICAgICAgCSAgICAgc2N0cF9zaHV0ZG93bl9ldmVudAkgOiAlaGh1IiwgZXZlbnQuc2N0cF9zaHV0ZG93bl9ldmVudCk7CisJCQlmZF9sb2dfZGVidWcoICIgICAgICAgCSAgICAgc2N0cF9wYXJ0aWFsX2RlbGl2ZXJ5X2V2ZW50IDogJWhodSIsIGV2ZW50LnNjdHBfcGFydGlhbF9kZWxpdmVyeV9ldmVudCk7CisJCQlmZF9sb2dfZGVidWcoICIgICAgICAgCSAgICAgc2N0cF9hZGFwdGF0aW9uX2xheWVyX2V2ZW50IDogJWhodSIsIGV2ZW50LnNjdHBfYWRhcHRhdGlvbl9sYXllcl9ldmVudCk7CisJCQkvLyBmZF9sb2dfZGVidWcoICIgICAgICAgICAgICAgc2N0cF9hdXRoZW50aWNhdGlvbl9ldmVudCAgICA6ICVoaHUiLCBldmVudC5zY3RwX2F1dGhlbnRpY2F0aW9uX2V2ZW50KTsKKwkJfQorCX0KKwkjZWxzZSAvKiBTQ1RQX0VWRU5UUyAqLworCVRSQUNFX0RFQlVHKEFOTk9ZSU5HLCAiU2tpcHBpbmcgU0NUUF9FVkVOVFMiKTsKKwkjZW5kaWYgLyogU0NUUF9FVkVOVFMgKi8KKyNlbmRpZiAvKiAgT0xEX1NDVFBfU09DS0VUX0FQSSAqLworCQorCS8qIFNldCB0aGUgdjQgbWFwcGVkIGFkZHJlc3NlcyBvcHRpb24gKi8KKwkjaWZkZWYgU0NUUF9JX1dBTlRfTUFQUEVEX1Y0X0FERFIKKwlpZiAoIWZkX2dfY29uZmlnLT5jbmZfZmxhZ3Mubm9faXA2KSB7CisJCWludCB2NG1hcHBlZDsKKwkJCisJCWlmIChUUkFDRV9CT09MKEFOTk9ZSU5HKSkgeworCQkJc3ogPSBzaXplb2YodjRtYXBwZWQpOworCQkJLyogUmVhZCBzb2NrZXQgZGVmYXVsdHMgKi8KKwkJCUNIRUNLX1NZUyggIGdldHNvY2tvcHQoc2ssIElQUFJPVE9fU0NUUCwgU0NUUF9JX1dBTlRfTUFQUEVEX1Y0X0FERFIsICZ2NG1hcHBlZCwgJnN6KSAgKTsKKwkJCWlmIChzeiAhPSBzaXplb2YodjRtYXBwZWQpKQorCQkJeworCQkJCVRSQUNFX0RFQlVHKElORk8sICJJbnZhbGlkIHNpemUgb2Ygc29ja2V0IG9wdGlvbjogJWQgLyAlZCIsIHN6LCAoc29ja2xlbl90KXNpemVvZih2NG1hcHBlZCkpOworCQkJCXJldHVybiBFTk9UU1VQOworCQkJfQorCQkJZmRfbG9nX2RlYnVnKCAiRGVmIFNDVFBfSV9XQU5UX01BUFBFRF9WNF9BRERSIHZhbHVlIDogJXMiLCB2NG1hcHBlZCA/ICJ0cnVlIiA6ICJmYWxzZSIpOworCQl9CisKKwkJI2lmbmRlZiBTQ1RQX1VTRV9NQVBQRURfQUREUkVTU0VTCisJCXY0bWFwcGVkID0gMDsJLyogV2UgZG9uJ3Qgd2FudCB2NCBtYXBwZWQgYWRkcmVzc2VzICovCisJCSNlbHNlIC8qIFNDVFBfVVNFX01BUFBFRF9BRERSRVNTRVMgKi8KKwkJdjRtYXBwZWQgPSAxOwkvKiBidXQgd2UgbWF5IGhhdmUgdG8sIG90aGVyd2lzZSB0aGUgYmluZCBmYWlscyBpbiBzb21lIGVudmlyb25tZW50cyAqLworCQkjZW5kaWYgLyogU0NUUF9VU0VfTUFQUEVEX0FERFJFU1NFUyAqLworCQkKKwkJLyogU2V0IHRoZSBvcHRpb24gdG8gdGhlIHNvY2tldCAqLworCQlDSEVDS19TWVMoICBzZXRzb2Nrb3B0KHNrLCBJUFBST1RPX1NDVFAsIFNDVFBfSV9XQU5UX01BUFBFRF9WNF9BRERSLCAmdjRtYXBwZWQsIHNpemVvZih2NG1hcHBlZCkpICApOworCQkKKwkJaWYgKFRSQUNFX0JPT0woQU5OT1lJTkcpKSB7CisJCQkvKiBDaGVjayBuZXcgdmFsdWVzICovCisJCQlDSEVDS19TWVMoICBnZXRzb2Nrb3B0KHNrLCBJUFBST1RPX1NDVFAsIFNDVFBfSV9XQU5UX01BUFBFRF9WNF9BRERSLCAmdjRtYXBwZWQsICZzeikgICk7CisJCQlmZF9sb2dfZGVidWcoICJOZXcgU0NUUF9JX1dBTlRfTUFQUEVEX1Y0X0FERFIgdmFsdWUgOiAlcyIsIHY0bWFwcGVkID8gInRydWUiIDogImZhbHNlIik7CisJCX0KKwl9IGVsc2UgeworCQlUUkFDRV9ERUJVRyhBTk5PWUlORywgIlNraXBwaW5nIFNDVFBfSV9XQU5UX01BUFBFRF9WNF9BRERSLCBzaW5jZSBJUHY2IGRpc2FibGVkLiIpOworCX0KKwkjZWxzZSAvKiBTQ1RQX0lfV0FOVF9NQVBQRURfVjRfQUREUiAqLworCVRSQUNFX0RFQlVHKEFOTk9ZSU5HLCAiU2tpcHBpbmcgU0NUUF9JX1dBTlRfTUFQUEVEX1Y0X0FERFIiKTsKKwkjZW5kaWYgLyogU0NUUF9JX1dBTlRfTUFQUEVEX1Y0X0FERFIgKi8KKwkKKwkvKgorCSAgIFNDVFBfTUFYU0VHCQkJbWF4IHNpemUgb2YgZnJhZ21lbnRlZCBzZWdtZW50cyAtLSBib3VuZCB0byBQTVRVCisJICAgU0NUUF9ITUFDX0lERU5UCQlhdXRoZW50aWNhdGlvbiBhbGdvcml0aG1zCisJICAgU0NUUF9BVVRIX0FDVElWRV9LRVkJCXNldCB0aGUgYWN0aXZlIGtleQorCSAgIFNDVFBfREVMQVlFRF9TQUNLCQljb250cm9sIGRlbGF5ZWQgYWNrcworCSovCisJCisJCisJLyogU2V0IHRoZSBpbnRlcmxlYXZpbmcgb3B0aW9uICovCisJI2lmZGVmIFNDVFBfRlJBR01FTlRfSU5URVJMRUFWRQorCXsKKwkJaW50IGludGVybGVhdmU7CisJCQorCQlpZiAoVFJBQ0VfQk9PTChBTk5PWUlORykpIHsKKwkJCXN6ID0gc2l6ZW9mKGludGVybGVhdmUpOworCQkJLyogUmVhZCBzb2NrZXQgZGVmYXVsdHMgKi8KKwkJCUNIRUNLX1NZUyggIGdldHNvY2tvcHQoc2ssIElQUFJPVE9fU0NUUCwgU0NUUF9GUkFHTUVOVF9JTlRFUkxFQVZFLCAmaW50ZXJsZWF2ZSwgJnN6KSAgKTsKKwkJCWlmIChzeiAhPSBzaXplb2YoaW50ZXJsZWF2ZSkpCisJCQl7CisJCQkJVFJBQ0VfREVCVUcoSU5GTywgIkludmFsaWQgc2l6ZSBvZiBzb2NrZXQgb3B0aW9uOiAlZCAvICVkIiwgc3osIChzb2NrbGVuX3Qpc2l6ZW9mKGludGVybGVhdmUpKTsKKwkJCQlyZXR1cm4gRU5PVFNVUDsKKwkJCX0KKwkJCWZkX2xvZ19kZWJ1ZyggIkRlZiBTQ1RQX0ZSQUdNRU5UX0lOVEVSTEVBVkUgdmFsdWUgOiAlZCIsIGludGVybGVhdmUpOworCQl9CisKKwkJI2lmIDAKKwkJaW50ZXJsZWF2ZSA9IDI7CS8qIEFsbG93IHBhcnRpYWwgZGVsaXZlcnkgb24gc2V2ZXJhbCBzdHJlYW1zIGF0IHRoZSBzYW1lIHRpbWUsIHNpbmNlIHdlIGFyZSBzdHJlYW0tYXdhcmUgaW4gb3VyIHNlY3VyaXR5IG1vZHVsZXMgKi8KKwkJI2Vsc2UgLyogMCAqLworCQlpbnRlcmxlYXZlID0gMTsJLyogaG1tbSBhY3R1YWxseSwgd2UgYXJlIG5vdCB5ZXQgY2FwYWJsZSBvZiBoYW5kbGluZyB0aGlzLCBhbmQgd2UgZG9uIHQgbmVlZCBpdC4gKi8KKwkJI2VuZGlmIC8qIDAgKi8KKwkJCisJCS8qIFNldCB0aGUgb3B0aW9uIHRvIHRoZSBzb2NrZXQgKi8KKwkJQ0hFQ0tfU1lTKCAgc2V0c29ja29wdChzaywgSVBQUk9UT19TQ1RQLCBTQ1RQX0ZSQUdNRU5UX0lOVEVSTEVBVkUsICZpbnRlcmxlYXZlLCBzaXplb2YoaW50ZXJsZWF2ZSkpICApOworCQkKKwkJaWYgKFRSQUNFX0JPT0woQU5OT1lJTkcpKSB7CisJCQkvKiBDaGVjayBuZXcgdmFsdWVzICovCisJCQlDSEVDS19TWVMoICBnZXRzb2Nrb3B0KHNrLCBJUFBST1RPX1NDVFAsIFNDVFBfRlJBR01FTlRfSU5URVJMRUFWRSwgJmludGVybGVhdmUsICZzeikgICk7CisJCQlmZF9sb2dfZGVidWcoICJOZXcgU0NUUF9GUkFHTUVOVF9JTlRFUkxFQVZFIHZhbHVlIDogJWQiLCBpbnRlcmxlYXZlKTsKKwkJfQorCX0KKwkjZWxzZSAvKiBTQ1RQX0ZSQUdNRU5UX0lOVEVSTEVBVkUgKi8KKwlUUkFDRV9ERUJVRyhBTk5PWUlORywgIlNraXBwaW5nIFNDVFBfRlJBR01FTlRfSU5URVJMRUFWRSIpOworCSNlbmRpZiAvKiBTQ1RQX0ZSQUdNRU5UX0lOVEVSTEVBVkUgKi8KKwkKKwkvKgorCSAgIFNDVFBfUEFSVElBTF9ERUxJVkVSWV9QT0lOVAljb250cm9sIHBhcnRpYWwgZGVsaXZlcnkgc2l6ZQorCSAgIFNDVFBfVVNFX0VYVF9SQ1ZJTkZPCS0gREVQUkVDQVRFRAl1c2UgZXh0ZW5kZWQgcmVjZWl2ZSBpbmZvIHN0cnVjdHVyZSAoaW5mb3JtYXRpb24gYWJvdXQgdGhlIG5leHQgbWVzc2FnZSBpZiBhdmFpbGFibGUpCisJICovCisJLyogU0NUUF9BVVRPX0FTQ09ORiBpcyBzZXQgYnkgdGhlIHBvc3RiaW5kIGZ1bmN0aW9uICovCisJLyoKKwkgICBTQ1RQX01BWF9CVVJTVAkJbnVtYmVyIG9mIHBhY2tldHMgdGhhdCBjYW4gYmUgYnVyc3QgZW1pdHRlZAorCSAgIFNDVFBfQ09OVEVYVAkJCXNhdmUgYSBjb250ZXh0IGluZm9ybWF0aW9uIGFsb25nIHdpdGggdGhlIGFzc29jaWF0aW9uLgorCSAqLworCSAKKwkvKiBTQ1RQX0VYUExJQ0lUX0VPUjogd2UgYXNzdW1lIGltcGxpY2l0IEVPUiBpbiBmcmVlRGlhbWV0ZXIsIHNvIGxldCdzIGVuc3VyZSB0aGlzIGlzIGtub3duIGJ5IHRoZSBzdGFjayAqLworCSNpZmRlZiBTQ1RQX0VYUExJQ0lUX0VPUgorCXsKKwkJaW50IGJvb2w7CisJCQorCQlpZiAoVFJBQ0VfQk9PTChBTk5PWUlORykpIHsKKwkJCXN6ID0gc2l6ZW9mKGJvb2wpOworCQkJLyogUmVhZCBzb2NrZXQgZGVmYXVsdHMgKi8KKwkJCUNIRUNLX1NZUyggIGdldHNvY2tvcHQoc2ssIElQUFJPVE9fU0NUUCwgU0NUUF9FWFBMSUNJVF9FT1IsICZib29sLCAmc3opICApOworCQkJaWYgKHN6ICE9IHNpemVvZihib29sKSkKKwkJCXsKKwkJCQlUUkFDRV9ERUJVRyhJTkZPLCAiSW52YWxpZCBzaXplIG9mIHNvY2tldCBvcHRpb246ICVkIC8gJWQiLCBzeiwgKHNvY2tsZW5fdClzaXplb2YoYm9vbCkpOworCQkJCXJldHVybiBFTk9UU1VQOworCQkJfQorCQkJZmRfbG9nX2RlYnVnKCAiRGVmIFNDVFBfRVhQTElDSVRfRU9SIHZhbHVlIDogJXMiLCBib29sID8gInRydWUiIDogImZhbHNlIik7CisJCX0KKworCQlib29sID0gMDsKKwkJCisJCS8qIFNldCB0aGUgb3B0aW9uIHRvIHRoZSBzb2NrZXQgKi8KKwkJQ0hFQ0tfU1lTKCAgc2V0c29ja29wdChzaywgSVBQUk9UT19TQ1RQLCBTQ1RQX0VYUExJQ0lUX0VPUiwgJmJvb2wsIHNpemVvZihib29sKSkgICk7CisJCQorCQlpZiAoVFJBQ0VfQk9PTChBTk5PWUlORykpIHsKKwkJCS8qIENoZWNrIG5ldyB2YWx1ZXMgKi8KKwkJCUNIRUNLX1NZUyggIGdldHNvY2tvcHQoc2ssIElQUFJPVE9fU0NUUCwgU0NUUF9FWFBMSUNJVF9FT1IsICZib29sLCAmc3opICApOworCQkJZmRfbG9nX2RlYnVnKCAiTmV3IFNDVFBfRVhQTElDSVRfRU9SIHZhbHVlIDogJXMiLCBib29sID8gInRydWUiIDogImZhbHNlIik7CisJCX0KKwl9CisJI2Vsc2UgLyogU0NUUF9FWFBMSUNJVF9FT1IgKi8KKwlUUkFDRV9ERUJVRyhBTk5PWUlORywgIlNraXBwaW5nIFNDVFBfRVhQTElDSVRfRU9SIik7CisJI2VuZGlmIC8qIFNDVFBfRVhQTElDSVRfRU9SICovCisJCisJLyoKKwkgICBTQ1RQX1JFVVNFX1BPUlQJCXNoYXJlIG9uZSBsaXN0ZW5pbmcgcG9ydCB3aXRoIHNldmVyYWwgc29ja2V0cworCSovCisJCisjaWZuZGVmIE9MRF9TQ1RQX1NPQ0tFVF9BUEkKKwkjaWZkZWYgU0NUUF9FVkVOVAorCXsKKwkJLyogU3Vic2NyaWJlIHRvIHRoZSBmb2xsb3dpbmcgZXZlbnRzICovCisJCWludCBldmVudHNfSV93YW50W10gPSB7CisJCSNpZmRlZiBTQ1RQX0FTU09DX0NIQU5HRQorCQkJLyogU0NUUF9BU1NPQ19DSEFOR0UsICovCisJCSNlbmRpZiAKKwkJI2lmZGVmIFNDVFBfUEVFUl9BRERSX0NIQU5HRQorCQkJU0NUUF9QRUVSX0FERFJfQ0hBTkdFLAorCQkjZW5kaWYKKwkJI2lmZGVmIFNDVFBfUkVNT1RFX0VSUk9SCisJCQlTQ1RQX1JFTU9URV9FUlJPUiwKKwkJI2VuZGlmCisJCSNpZmRlZiBTQ1RQX1NFTkRfRkFJTEVEX0VWRU5UCisJCQlTQ1RQX1NFTkRfRkFJTEVEX0VWRU5ULAorCQkjZW5kaWYKKwkJI2lmZGVmIFNDVFBfU0hVVERPV05fRVZFTlQKKwkJCVNDVFBfU0hVVERPV05fRVZFTlQsCisJCSNlbmRpZgorCQkjaWZkZWYgU0NUUF9BREFQVEFUSU9OX0lORElDQVRJT04KKwkJCS8qIFNDVFBfQURBUFRBVElPTl9JTkRJQ0FUSU9OLCAqLworCQkjZW5kaWYKKwkJI2lmZGVmIFNDVFBfUEFSVElBTF9ERUxJVkVSWV9FVkVOVAorCQkJLyogU0NUUF9QQVJUSUFMX0RFTElWRVJZX0VWRU5ULCAqLworCQkjZW5kaWYKKwkJI2lmZGVmIFNDVFBfQVVUSEVOVElDQVRJT05fRVZFTlQKKwkJCS8qIFNDVFBfQVVUSEVOVElDQVRJT05fRVZFTlQsICovCisJCSNlbmRpZgorCQkjaWZkZWYgU0NUUF9TRU5ERVJfRFJZX0VWRU5UCisJCQkvKiBTQ1RQX1NFTkRFUl9EUllfRVZFTlQsICovCisJCSNlbmRpZgorCQkJMAorCQl9OworCQlpbnQgaTsKKwkJCisJCXN0cnVjdCBzY3RwX2V2ZW50IGV2ZW50OworCQkKKwkJZm9yIChpID0gMDsgaSA8IChzaXplb2YoZXZlbnRzX0lfd2FudCkgLyBzaXplb2YoZXZlbnRzX0lfd2FudFswXSkgLSAxKTsgaSsrKSB7CisJCQltZW1zZXQoJmV2ZW50LCAwLCBzaXplb2YoZXZlbnQpKTsKKwkJCWV2ZW50LnNlX3R5cGUgPSBldmVudHNfSV93YW50W2ldOworCQkJZXZlbnQuc2Vfb24gPSAxOworCQkJCisJCQkvKiBTZXQgdGhlIG9wdGlvbiB0byB0aGUgc29ja2V0ICovCisJCQlDSEVDS19TWVMoICBzZXRzb2Nrb3B0KHNrLCBJUFBST1RPX1NDVFAsIFNDVFBfRVZFTlQsICZldmVudCwgc2l6ZW9mKGV2ZW50KSkgKTsKKwkJfQorCX0KKwkjZWxzZSAvKiBTQ1RQX0VWRU5UICovCisJVFJBQ0VfREVCVUcoQU5OT1lJTkcsICJTa2lwcGluZyBTQ1RQX0VWRU5UIik7CisJI2VuZGlmIC8qIFNDVFBfRVZFTlQgKi8KKwkKKwkKKwkjaWZkZWYgU0NUUF9SRUNWUkNWSU5GTyAvKiBSZXBsYWNlcyBTQ1RQX1NORFJDViAqLworCXsKKwkJaW50IGJvb2wgPSAxOworCQkKKwkJLyogU2V0IHRoZSBvcHRpb24gdG8gdGhlIHNvY2tldCAqLworCQlDSEVDS19TWVMoICBzZXRzb2Nrb3B0KHNrLCBJUFBST1RPX1NDVFAsIFNDVFBfUkVDVlJDVklORk8sICZib29sLCBzaXplb2YoYm9vbCkpICApOworCQkKKwl9CisJI2Vsc2UgLyogU0NUUF9SRUNWUkNWSU5GTyAqLworCVRSQUNFX0RFQlVHKEFOTk9ZSU5HLCAiU2tpcHBpbmcgU0NUUF9SRUNWUkNWSU5GTyIpOworCSNlbmRpZiAvKiBTQ1RQX1JFQ1ZSQ1ZJTkZPICovCisJCisJCisjZW5kaWYgLyogT0xEX1NDVFBfU09DS0VUX0FQSSAqLworCQorCS8qIAorCQlTQ1RQX1JFQ1ZOWFRJTkZPCisJCQorCQlTQ1RQX0RFRkFVTFRfU05ESU5GTyA6IHNlbmQgZGVmYXVsdHMKKwkJU0NUUF9ERUZBVUxUX1BSSU5GTyAgOiBkZWZhdWx0IFBSLVNDVFAKKwkqLworCQorCisJLyogSW4gY2FzZSBvZiBub19pcDQsIGZvcmNlIHRoZSB2Nm9ubHkgb3B0aW9uICovCisJI2lmZGVmIElQVjZfVjZPTkxZCisJaWYgKGZkX2dfY29uZmlnLT5jbmZfZmxhZ3Mubm9faXA0KSB7CisJCWludCBvcHQgPSAxOworCQlDSEVDS19TWVMoc2V0c29ja29wdChzaywgSVBQUk9UT19JUFY2LCBJUFY2X1Y2T05MWSwgJm9wdCwgc2l6ZW9mKG9wdCkpKTsKKwl9CisJI2VuZGlmIC8qIElQVjZfVjZPTkxZICovCisJCisJcmV0dXJuIDA7Cit9CisKKworLyogUG9zdC1iaW5kaW5nIHNvY2tldCBvcHRpb25zICovCitzdGF0aWMgaW50IGZkX3NldHNvY2tvcHRfcG9zdGJpbmQoaW50IHNrLCBpbnQgYm91bmRfdG9fZGVmYXVsdCkKK3sKKwlUUkFDRV9FTlRSWSggIiVkICVkIiwgc2ssIGJvdW5kX3RvX2RlZmF1bHQpOworCQorCUNIRUNLX1BBUkFNUyggKHNrID4gMCkgKTsKKwkKKwkvKiBTZXQgdGhlIEFTQ09ORiBvcHRpb24gKi8KKwkjaWZkZWYgU0NUUF9BVVRPX0FTQ09ORgorCWlmIChib3VuZF90b19kZWZhdWx0KSB7CisJCWludCBhc2NvbmY7CisJCQorCQlpZiAoVFJBQ0VfQk9PTChBTk5PWUlORykpIHsKKwkJCXNvY2tsZW5fdCBzejsKKworCQkJc3ogPSBzaXplb2YoYXNjb25mKTsKKwkJCS8qIFJlYWQgc29ja2V0IGRlZmF1bHRzICovCisJCQlDSEVDS19TWVMoICBnZXRzb2Nrb3B0KHNrLCBJUFBST1RPX1NDVFAsIFNDVFBfQVVUT19BU0NPTkYsICZhc2NvbmYsICZzeikgICk7CisJCQlpZiAoc3ogIT0gc2l6ZW9mKGFzY29uZikpCisJCQl7CisJCQkJVFJBQ0VfREVCVUcoSU5GTywgIkludmFsaWQgc2l6ZSBvZiBzb2NrZXQgb3B0aW9uOiAlZCAvICVkIiwgc3osIChzb2NrbGVuX3Qpc2l6ZW9mKGFzY29uZikpOworCQkJCXJldHVybiBFTk9UU1VQOworCQkJfQorCQkJZmRfbG9nX2RlYnVnKCAiRGVmIFNDVFBfQVVUT19BU0NPTkYgdmFsdWUgOiAlcyIsIGFzY29uZiA/ICJ0cnVlIiA6ICJmYWxzZSIpOworCQl9CisKKwkJYXNjb25mID0gMTsJLyogYWxsb3cgYXV0b21hdGljIHVzZSBvZiBhZGRlZCBvciByZW1vdmVkIGFkZHJlc3NlcyBpbiB0aGUgYXNzb2NpYXRpb24gKGZvciBib3VuZC1hbGwgc29ja2V0cykgKi8KKwkJCisJCS8qIFNldCB0aGUgb3B0aW9uIHRvIHRoZSBzb2NrZXQgKi8KKwkJQ0hFQ0tfU1lTKCAgc2V0c29ja29wdChzaywgSVBQUk9UT19TQ1RQLCBTQ1RQX0FVVE9fQVNDT05GLCAmYXNjb25mLCBzaXplb2YoYXNjb25mKSkgICk7CisJCQorCQlpZiAoVFJBQ0VfQk9PTChBTk5PWUlORykpIHsKKwkJCXNvY2tsZW5fdCBzeiA9IHNpemVvZihhc2NvbmYpOworCQkJLyogQ2hlY2sgbmV3IHZhbHVlcyAqLworCQkJQ0hFQ0tfU1lTKCAgZ2V0c29ja29wdChzaywgSVBQUk9UT19TQ1RQLCBTQ1RQX0FVVE9fQVNDT05GLCAmYXNjb25mLCAmc3opICApOworCQkJZmRfbG9nX2RlYnVnKCAiTmV3IFNDVFBfQVVUT19BU0NPTkYgdmFsdWUgOiAlcyIsIGFzY29uZiA/ICJ0cnVlIiA6ICJmYWxzZSIpOworCQl9CisJfQorCSNlbHNlIC8qIFNDVFBfQVVUT19BU0NPTkYgKi8KKwlUUkFDRV9ERUJVRyhBTk5PWUlORywgIlNraXBwaW5nIFNDVFBfQVVUT19BU0NPTkYiKTsKKwkjZW5kaWYgLyogU0NUUF9BVVRPX0FTQ09ORiAqLworCQorCXJldHVybiAwOworfQorCisvKiBBZGQgYWRkcmVzc2VzIGZyb20gYSBsaXN0IHRvIGFuIGFycmF5LCB3aXRoIGZpbHRlciBvbiB0aGUgZmxhZ3MgKi8KK3N0YXRpYyBpbnQgYWRkX2FkZHJlc3Nlc19mcm9tX2xpc3RfbWFzayh1aW50OF90ICoqIGFycmF5LCBzaXplX3QgKiBzaXplLCBpbnQgKiBhZGRyX2NvdW50LCBpbnQgdGFyZ2V0X2ZhbWlseSwgdWludDE2X3QgcG9ydCwgc3RydWN0IGZkX2xpc3QgKiBsaXN0LCB1aW50MzJfdCBtYXNrLCB1aW50MzJfdCB2YWwpCit7CisJc3RydWN0IGZkX2xpc3QgKiBsaTsKKwlpbnQgdG9fYWRkNCA9IDA7CisJaW50IHRvX2FkZDYgPSAwOworCXVuaW9uIHsKKwkJdWludDhfdCAqYnVmOworCQlzU0E0CSpzaW47CisJCXNTQTYJKnNpbjY7CisJfSBwdHI7CisJc2l6ZV90IHN6OworCQorCS8qIEZpcnN0LCBjb3VudCB0aGUgbnVtYmVyIG9mIGFkZHJlc3NlcyB0byBhZGQgKi8KKwlmb3IgKGxpID0gbGlzdC0+bmV4dDsgbGkgIT0gbGlzdDsgbGkgPSBsaS0+bmV4dCkgeworCQlzdHJ1Y3QgZmRfZW5kcG9pbnQgKiBlcCA9IChzdHJ1Y3QgZmRfZW5kcG9pbnQgKikgbGk7CisJCQorCQkvKiBEbyB0aGUgZmxhZyBtYXRjaCA/ICovCisJCWlmICgodmFsICYgbWFzaykgIT0gKGVwLT5mbGFncyAmIG1hc2spKQorCQkJY29udGludWU7CisJCQorCQlpZiAoZXAtPnNhLnNhX2ZhbWlseSA9PSBBRl9JTkVUKSB7CisJCQl0b19hZGQ0ICsrOworCQl9IGVsc2UgeworCQkJdG9fYWRkNiArKzsKKwkJfQorCX0KKwkKKwlpZiAoKHRvX2FkZDQgKyB0b19hZGQ2KSA9PSAwKQorCQlyZXR1cm4gMDsgLyogbm90aGluZyB0byBkbyAqLworCQorCS8qIFRoZSBzaXplIHRvIGFkZCAqLworCWlmICh0YXJnZXRfZmFtaWx5ID09IEFGX0lORVQpIHsKKwkJc3ogPSB0b19hZGQ0ICogc2l6ZW9mKHNTQTQpOworCX0gZWxzZSB7CisJCSNpZm5kZWYgU0NUUF9VU0VfTUFQUEVEX0FERFJFU1NFUworCQkJc3ogPSAodG9fYWRkNCAqIHNpemVvZihzU0E0KSkgKyAodG9fYWRkNiAqIHNpemVvZihzU0E2KSk7CisJCSNlbHNlIC8qIFNDVFBfVVNFX01BUFBFRF9BRERSRVNTRVMgKi8KKwkJCXN6ID0gKHRvX2FkZDQgKyB0b19hZGQ2KSAqIHNpemVvZihzU0E2KTsKKwkJI2VuZGlmIC8qIFNDVFBfVVNFX01BUFBFRF9BRERSRVNTRVMgKi8KKwl9CisJCisJLyogTm93LCAocmUpYWxsb2MgdGhlIGFycmF5IHRvIHN0b3JlIHRoZSBuZXcgYWRkcmVzc2VzICovCisJQ0hFQ0tfTUFMTE9DKCAqYXJyYXkgPSByZWFsbG9jKCphcnJheSwgKnNpemUgKyBzeikgKTsKKwkKKwkvKiBGaW5hbGx5LCBhZGQgdGhlIGFkZHJlc3NlcyAqLworCWZvciAobGkgPSBsaXN0LT5uZXh0OyBsaSAhPSBsaXN0OyBsaSA9IGxpLT5uZXh0KSB7CisJCXN0cnVjdCBmZF9lbmRwb2ludCAqIGVwID0gKHN0cnVjdCBmZF9lbmRwb2ludCAqKSBsaTsKKwkJCisJCS8qIFNraXAgdjYgYWRkcmVzc2VzIGZvciB2NCBzb2NrZXQgKi8KKwkJaWYgKCh0YXJnZXRfZmFtaWx5ID09IEFGX0lORVQpICYmIChlcC0+c2Euc2FfZmFtaWx5ID09IEFGX0lORVQ2KSkKKwkJCWNvbnRpbnVlOworCQkKKwkJLyogQXJlIHRoZSBmbGFncyBtYXRjaGluZyA/ICovCisJCWlmICgodmFsICYgbWFzaykgIT0gKGVwLT5mbGFncyAmIG1hc2spKQorCQkJY29udGludWU7CisJCQorCQkvKiBTaXplIG9mIHRoZSBuZXcgU0Egd2UgYXJlIGFkZGluZyAoYXJyYXkgbWF5IGNvbnRhaW4gYSBtaXggb2Ygc29ja2FkZHJfaW4gYW5kIHNvY2thZGRyX2luNikgKi8KKwkJI2lmbmRlZiBTQ1RQX1VTRV9NQVBQRURfQUREUkVTU0VTCisJCWlmIChlcC0+c2Euc2FfZmFtaWx5ID09IEFGX0lORVQ2KQorCQkjZWxzZSAvKiBTQ1RQX1VTRV9NQVBQRURfQUREUkVTU0VTICovCisJCWlmICh0YXJnZXRfZmFtaWx5ID09IEFGX0lORVQ2KQorCQkjZW5kaWYgLyogU0NUUF9VU0VfTUFQUEVEX0FERFJFU1NFUyAqLworCQkJc3ogPSBzaXplb2Yoc1NBNik7CisJCWVsc2UKKwkJCXN6ID0gc2l6ZW9mKHNTQTQpOworCQkKKwkJLyogUGxhY2Ugd2hlcmUgd2UgYWRkIHRoZSBuZXcgYWRkcmVzcyAqLworCQlwdHIuYnVmID0gKmFycmF5ICsgKnNpemU7IC8qIHBsYWNlIG9mIHRoZSBuZXcgU0EgKi8KKwkJCisJCS8qIFVwZGF0ZSBvdGhlciBpbmZvcm1hdGlvbiAqLworCQkqc2l6ZSArPSBzejsKKwkJKmFkZHJfY291bnQgKz0gMTsKKwkJCisJCS8qIEFuZCB3cml0ZSB0aGUgYWRkciBpbiB0aGUgYnVmZmVyICovCisJCWlmIChzeiA9PSBzaXplb2Yoc1NBNCkpIHsKKwkJCW1lbWNweShwdHIuYnVmLCAmZXAtPnNpbiwgc3opOworCQkJcHRyLnNpbi0+c2luX3BvcnQgPSBwb3J0OworCQl9IGVsc2UgeworCQkJaWYgKGVwLT5zYS5zYV9mYW1pbHkgPT0gQUZfSU5FVCkgeyAvKiBXZSBtdXN0IG1hcCB0aGUgYWRkcmVzcyAqLyAKKwkJCQltZW1zZXQocHRyLmJ1ZiwgMCwgc3opOworCQkJCXB0ci5zaW42LT5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OworCQkJCUlONl9BRERSX1Y0TUFQKCAmcHRyLnNpbjYtPnNpbjZfYWRkci5zNl9hZGRyLCBlcC0+c2luLnNpbl9hZGRyLnNfYWRkciApOworCQkJfSBlbHNlIHsKKwkJCQltZW1jcHkocHRyLnNpbjYsICZlcC0+c2luNiwgc3opOworCQkJfQorCQkJcHRyLnNpbjYtPnNpbjZfcG9ydCA9IHBvcnQ7CisJCX0KKwl9CisJCisJcmV0dXJuIDA7Cit9CisKKy8qIENyZWF0ZSBhIHNvY2tldCBzZXJ2ZXIgYW5kIGJpbmQgaXQgYWNjb3JkaW5nIHRvIGRhZW1vbiBzIGNvbmZpZ3VyYXRpb24gKi8KK2ludCBmZF9zY3RwX2NyZWF0ZV9iaW5kX3NlcnZlciggaW50ICogc29jaywgaW50IGZhbWlseSwgc3RydWN0IGZkX2xpc3QgKiBsaXN0LCB1aW50MTZfdCBwb3J0ICkKK3sKKwlpbnQgYmluZF9kZWZhdWx0OworCQorCVRSQUNFX0VOVFJZKCIlcCAlaSAlcCAlaHUiLCBzb2NrLCBmYW1pbHksIGxpc3QsIHBvcnQpOworCUNIRUNLX1BBUkFNUyhzb2NrKTsKKwkKKwkvKiBDcmVhdGUgdGhlIHNvY2tldCAqLworCUNIRUNLX1NZUyggKnNvY2sgPSBzb2NrZXQoZmFtaWx5LCBTT0NLX1NUUkVBTSwgSVBQUk9UT19TQ1RQKSApOworCQorCS8qIFNldCBwcmUtYmluZGluZyBzb2NrZXQgb3B0aW9ucywgaW5jbHVkaW5nIG51bWJlciBvZiBzdHJlYW1zIGV0Yy4uLiAqLworCUNIRUNLX0ZDVCggZmRfc2V0c29ja29wdF9wcmViaW5kKCpzb2NrKSApOworCQorCWJpbmRfZGVmYXVsdCA9ICghIGxpc3QpIHx8IChGRF9JU19MSVNUX0VNUFRZKGxpc3QpKSA7CityZWRvOgorCWlmICggYmluZF9kZWZhdWx0ICkgeworCQkvKiBJbXBsaWNpdCBlbmRwb2ludHMgOiBiaW5kIHRvIGRlZmF1bHQgYWRkcmVzc2VzICovCisJCXVuaW9uIHsKKwkJCXNTUyAgc3M7CisJCQlzU0EgIHNhOworCQkJc1NBNCBzaW47CisJCQlzU0E2IHNpbjY7CisJCX0gczsKKwkJCisJCS8qIDAuMC4wLjAgYW5kIFs6Ol0gYXJlIGFsbCB6ZXJvcyAqLworCQltZW1zZXQoJnMsIDAsIHNpemVvZihzKSk7CisJCQorCQlzLnNhLnNhX2ZhbWlseSA9IGZhbWlseTsKKwkJCisJCWlmIChmYW1pbHkgPT0gQUZfSU5FVCkKKwkJCXMuc2luLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7CisJCWVsc2UKKwkJCXMuc2luNi5zaW42X3BvcnQgPSBodG9ucyhwb3J0KTsKKwkJCisJCUNIRUNLX1NZUyggYmluZCgqc29jaywgJnMuc2EsIHNTQWxlbigmcykpICk7CisJCQorCX0gZWxzZSB7CisJCS8qIEV4cGxpY2l0IGVuZHBvaW50cyB0byBiaW5kIHRvIGZyb20gY29uZmlnICovCisJCQorCQlzU0EgKiBzYXIgPSBOVUxMOyAvKiBhcnJheSBvZiBhZGRyZXNzZXMgKi8KKwkJc2l6ZV90IHN6ID0gMDsgLyogc2l6ZSBvZiB0aGUgYXJyYXkgKi8KKwkJaW50IGNvdW50ID0gMDsgLyogbnVtYmVyIG9mIHNvY2sgYWRkciBpbiB0aGUgYXJyYXkgKi8KKwkJCisJCS8qIENyZWF0ZSB0aGUgYXJyYXkgb2YgY29uZmlndXJlZCBhZGRyZXNzZXMgKi8KKwkJQ0hFQ0tfRkNUKCBhZGRfYWRkcmVzc2VzX2Zyb21fbGlzdF9tYXNrKCh2b2lkICopJnNhciwgJnN6LCAmY291bnQsIGZhbWlseSwgaHRvbnMocG9ydCksIGxpc3QsIEVQX0ZMX0NPTkYsIEVQX0ZMX0NPTkYpICk7CisJCQorCQlpZiAoIWNvdW50KSB7CisJCQkvKiBOb25lIG9mIHRoZSBhZGRyZXNzZXMgaW4gdGhlIGxpc3QgY2FtZSBmcm9tIGNvbmZpZ3VyYXRpb24sIHdlIGJpbmQgdG8gZGVmYXVsdCAqLworCQkJYmluZF9kZWZhdWx0ID0gMTsKKwkJCWdvdG8gcmVkbzsKKwkJfQorCQkKKwkJI2lmIDAKKwkJCXVuaW9uIHsKKwkJCQlzU0EJKnNhOworCQkJCXVpbnQ4X3QgKmJ1ZjsKKwkJCX0gcHRyOworCQkJaW50IGk7CisJCQlwdHIuc2EgPSBzYXI7CisJCQlmZF9sb2dfZGVidWcoIkNhbGxpbmcgc2N0cF9iaW5keCB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkcmVzcyBhcnJheToiKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCQkJVFJBQ0Vfc1NBKEZEX0xPR19ERUJVRywgRlVMTCwgIiAgICAtICIsIHB0ci5zYSwgTklfTlVNRVJJQ0hPU1QgfCBOSV9OVU1FUklDU0VSViwgIiIgKTsKKwkJCQlwdHIuYnVmICs9IChwdHIuc2EtPnNhX2ZhbWlseSA9PSBBRl9JTkVUKSA/IHNpemVvZihzU0E0KSA6IHNpemVvZihzU0E2KSA7CisJCQl9CisJCSNlbmRpZgorCQkKKwkJLyogQmluZCB0byB0aGlzIGFycmF5ICovCisJCUNIRUNLX1NZUyggIHNjdHBfYmluZHgoKnNvY2ssIHNhciwgY291bnQsIFNDVFBfQklORFhfQUREX0FERFIpICApOworCQkKKwkJLyogV2UgZG9uJ3QgbmVlZCBzYXIgYW55bW9yZSAqLworCQlmcmVlKHNhcik7CisJfQorCQorCS8qIE5vdywgdGhlIHNlcnZlciBpcyBib3VuZCwgc2V0IHJlbWFpbmluZyBzb2Nrb3B0ICovCisJQ0hFQ0tfRkNUKCBmZF9zZXRzb2Nrb3B0X3Bvc3RiaW5kKCpzb2NrLCBiaW5kX2RlZmF1bHQpICk7CisJCisJLyogRGVidWc6IHNob3cgYWxsIGxvY2FsIGxpc3RlbmluZyBhZGRyZXNzZXMgKi8KKwkjaWYgMAorCQlzU0EgKnNhcjsKKwkJdW5pb24geworCQkJc1NBCSpzYTsKKwkJCXVpbnQ4X3QgKmJ1ZjsKKwkJfSBwdHI7CisJCWludCBzejsKKwkJCisJCUNIRUNLX1NZUyggIHN6ID0gc2N0cF9nZXRsYWRkcnMoKnNvY2ssIDAsICZzYXIpICApOworCQkKKwkJZmRfbG9nX2RlYnVnKCJTQ1RQIHNlcnZlciBib3VuZCBvbiA6Iik7CisJCWZvciAocHRyLnNhID0gc2FyOyBzei0tID4gMDsgcHRyLmJ1ZiArPSAocHRyLnNhLT5zYV9mYW1pbHkgPT0gQUZfSU5FVCkgPyBzaXplb2Yoc1NBNCkgOiBzaXplb2Yoc1NBNikpIHsKKwkJCVRSQUNFX3NTQShGRF9MT0dfREVCVUcsIEZVTEwsICIgICAgLSAiLCBwdHIuc2EsIE5JX05VTUVSSUNIT1NUIHwgTklfTlVNRVJJQ1NFUlYsICIiICk7CisJCX0KKwkJc2N0cF9mcmVlbGFkZHJzKHNhcik7CisJI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworLyogQWxsb3cgY2xpZW50cyBjb25uZWN0aW9ucyBvbiBzZXJ2ZXIgc29ja2V0cyAqLworaW50IGZkX3NjdHBfbGlzdGVuKCBpbnQgc29jayApCit7CisJVFJBQ0VfRU5UUlkoIiVkIiwgc29jayk7CisJQ0hFQ0tfU1lTKCBsaXN0ZW4oc29jaywgNSkgKTsKKwlyZXR1cm4gMDsKK30KKworLyogQ3JlYXRlIGEgY2xpZW50IHNvY2tldCBhbmQgY29ubmVjdCB0byByZW1vdGUgc2VydmVyICovCitpbnQgZmRfc2N0cF9jbGllbnQoIGludCAqc29jaywgaW50IG5vX2lwNiwgdWludDE2X3QgcG9ydCwgc3RydWN0IGZkX2xpc3QgKiBsaXN0ICkKK3sKKwlpbnQgZmFtaWx5OworCXVuaW9uIHsKKwkJdWludDhfdCAqYnVmOworCQlzU0EJKnNhOworCX0gc2FyOworCXNpemVfdCBzaXplID0gMDsKKwlpbnQgY291bnQgPSAwOworCWludCByZXQ7CisJCisJc2FyLmJ1ZiA9IE5VTEw7CisJCisJVFJBQ0VfRU5UUlkoIiVwICVpICVodSAlcCIsIHNvY2ssIG5vX2lwNiwgcG9ydCwgbGlzdCk7CisJQ0hFQ0tfUEFSQU1TKCBzb2NrICYmIGxpc3QgJiYgKCFGRF9JU19MSVNUX0VNUFRZKGxpc3QpKSApOworCQorCWlmIChub19pcDYpIHsKKwkJZmFtaWx5ID0gQUZfSU5FVDsKKwl9IGVsc2UgeworCQlmYW1pbHkgPSBBRl9JTkVUNjsKKwl9CisJCisJLyogQ3JlYXRlIHRoZSBzb2NrZXQgKi8KKwlDSEVDS19TWVMoICpzb2NrID0gc29ja2V0KGZhbWlseSwgU09DS19TVFJFQU0sIElQUFJPVE9fU0NUUCkgKTsKKwkKKwkvKiBDbGVhbnVwIGlmIHdlIGFyZSBjYW5jZWxsZWQgKi8KKwlwdGhyZWFkX2NsZWFudXBfcHVzaChmZF9jbGVhbnVwX3NvY2tldCwgc29jayk7CisJCisJLyogU2V0IHRoZSBzb2NrZXQgb3B0aW9ucyAqLworCUNIRUNLX0ZDVF9ETyggcmV0ID0gZmRfc2V0c29ja29wdF9wcmViaW5kKCpzb2NrKSwgZ290byBvdXQgKTsKKwkKKwkvKiBDcmVhdGUgdGhlIGFycmF5IG9mIGFkZHJlc3NlcywgYWRkIGZpcnN0IHRoZSBjb25maWd1cmVkIGFkZHJlc3NlcywgdGhlbiB0aGUgZGlzY292ZXJlZCwgdGhlbiB0aGUgb3RoZXIgb25lcyAqLworCUNIRUNLX0ZDVF9ETyggcmV0ID0gYWRkX2FkZHJlc3Nlc19mcm9tX2xpc3RfbWFzaygmc2FyLmJ1ZiwgJnNpemUsICZjb3VudCwgZmFtaWx5LCBodG9ucyhwb3J0KSwgbGlzdCwgRVBfRkxfQ09ORiwgICAgICAgICAgICAgIEVQX0ZMX0NPTkYJKSwgZ290byBvdXQgKTsKKwlDSEVDS19GQ1RfRE8oIHJldCA9IGFkZF9hZGRyZXNzZXNfZnJvbV9saXN0X21hc2soJnNhci5idWYsICZzaXplLCAmY291bnQsIGZhbWlseSwgaHRvbnMocG9ydCksIGxpc3QsIEVQX0ZMX0NPTkYgfCBFUF9GTF9ESVNDLCBFUF9GTF9ESVNDCSksIGdvdG8gb3V0ICk7CisJQ0hFQ0tfRkNUX0RPKCByZXQgPSBhZGRfYWRkcmVzc2VzX2Zyb21fbGlzdF9tYXNrKCZzYXIuYnVmLCAmc2l6ZSwgJmNvdW50LCBmYW1pbHksIGh0b25zKHBvcnQpLCBsaXN0LCBFUF9GTF9DT05GIHwgRVBfRkxfRElTQywgMAkJKSwgZ290byBvdXQgKTsKKwkKKwkvKiBUcnkgY29ubmVjdGluZyAqLworCUxPR19BKCJBdHRlbXB0aW5nIFNDVFAgY29ubmVjdGlvbiAoJWQgYWRkcmVzc2VzIGF0dGVtcHRlZCkgIiwgY291bnQpOworCQkKKyNpZiAwCisJCS8qIER1bXAgdGhlIFNBcyAqLworCQl1bmlvbiB7CisJCQl1aW50OF90ICpidWY7CisJCQlzU0EJKnNhOworCQkJc1NBNAkqc2luOworCQkJc1NBNgkqc2luNjsKKwkJfSBwdHI7CisJCWludCBpOworCQlwdHIuYnVmID0gc2FyLmJ1ZjsKKwkJZm9yIChpPTA7IGk8IGNvdW50OyBpKyspIHsKKwkJCVRSQUNFX3NTQShGRF9MT0dfREVCVUcsIEZVTEwsICIgIC0gIiwgcHRyLnNhLCBOSV9OVU1FUklDSE9TVCB8IE5JX05VTUVSSUNTRVJWLCAiIiApOworCQkJcHRyLmJ1ZiArPSAocHRyLnNhLT5zYV9mYW1pbHkgPT0gQUZfSU5FVCkgPyBzaXplb2Yoc1NBNCkgOiBzaXplb2Yoc1NBNik7CisJCX0KKyNlbmRpZgorCQorCS8qIEJ1ZyBpbiBzb21lIExpbnV4IGtlcm5lbCwgdGhlIHNjdHBfY29ubmVjdHggaXMgbm90IGEgY2FuY2VsbGF0aW9uIHBvaW50LiBUbyBhdm9pZCBibG9ja2luZyBmcmVlRGlhbWV0ZXIsIHdlIGFsbG93IGFzeW5jIGNhbmNlbCBoZXJlICovCisJcHRocmVhZF9zZXRjYW5jZWx0eXBlKFBUSFJFQURfQ0FOQ0VMX0FTWU5DSFJPTk9VUywgTlVMTCk7CisjaWZkZWYgU0NUUF9DT05ORUNUWF80X0FSR1MKKwlyZXQgPSBzY3RwX2Nvbm5lY3R4KCpzb2NrLCBzYXIuc2EsIGNvdW50LCBOVUxMKTsKKyNlbHNlIC8qIFNDVFBfQ09OTkVDVFhfNF9BUkdTICovCisJcmV0ID0gc2N0cF9jb25uZWN0eCgqc29jaywgc2FyLnNhLCBjb3VudCk7CisjZW5kaWYgLyogU0NUUF9DT05ORUNUWF80X0FSR1MgKi8KKwkvKiBiYWNrIHRvIG5vcm1hbCBjYW5jZWxhdGlvbiBiZWhhYmlvciAqLworCXB0aHJlYWRfc2V0Y2FuY2VsdHlwZShQVEhSRUFEX0NBTkNFTF9ERUZFUlJFRCwgTlVMTCk7CisJCisJaWYgKHJldCA8IDApIHsKKwkJcmV0ID0gZXJybm87CisJCS8qIFNvbWUgZXJyb3JzIGFyZSBleHBlY3RlZCwgd2UgbG9nIGF0IGRpZmZlcmVudCBsZXZlbCAqLworCQlMT0dfQSgic2N0cF9jb25uZWN0eCByZXR1cm5lZCBhbiBlcnJvcjogJXMiLCBzdHJlcnJvcihyZXQpKTsKKwkJZ290byBvdXQ7CisJfQorCQorCWZyZWUoc2FyLmJ1Zik7IHNhci5idWYgPSBOVUxMOworCQorCS8qIFNldCB0aGUgcmVtYWluaW5nIHNvY2tvcHRzICovCisJQ0hFQ0tfRkNUX0RPKCByZXQgPSBmZF9zZXRzb2Nrb3B0X3Bvc3RiaW5kKCpzb2NrLCAxKSwgCisJCXsgCisJCQlDSEVDS19TWVNfRE8oIHNodXRkb3duKCpzb2NrLCBTSFVUX1JEV1IpLCAvKiBjb250aW51ZSAqLyApOworCQl9ICk7CisJCitvdXQ6CisJOworCXB0aHJlYWRfY2xlYW51cF9wb3AoMCk7CisJCisJaWYgKHJldCkgeworCQlpZiAoKnNvY2sgPiAwKSB7CisJCQlDSEVDS19TWVNfRE8oIGNsb3NlKCpzb2NrKSwgLyogY29udGludWUgKi8gKTsKKwkJCSpzb2NrID0gLTE7CisJCX0KKwkJZnJlZShzYXIuYnVmKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyogUmV0cmlldmUgc3RyZWFtcyBpbmZvcm1hdGlvbiBmcm9tIGEgY29ubmVjdGVkIGFzc29jaWF0aW9uIC0tIG9wdGlvbmFsbHkgcHJvdmlkZSB0aGUgcHJpbWFyeSBhZGRyZXNzICovCitpbnQgZmRfc2N0cF9nZXRfc3RyX2luZm8oIGludCBzb2NrLCB1aW50MTZfdCAqaW4sIHVpbnQxNl90ICpvdXQsIHNTUyAqcHJpbWFyeSApCit7CisJc3RydWN0IHNjdHBfc3RhdHVzIHN0YXR1czsKKwlzb2NrbGVuX3Qgc3ogPSBzaXplb2Yoc3RhdHVzKTsKKwkKKwlUUkFDRV9FTlRSWSgiJWQgJXAgJXAgJXAiLCBzb2NrLCBpbiwgb3V0LCBwcmltYXJ5KTsKKwlDSEVDS19QQVJBTVMoIChzb2NrID4gMCkgJiYgaW4gJiYgb3V0ICk7CisJCisJLyogUmVhZCB0aGUgYXNzb2NpYXRpb24gcGFyYW1ldGVycyAqLworCW1lbXNldCgmc3RhdHVzLCAwLCBzaXplb2Yoc3RhdHVzKSk7CisJQ0hFQ0tfU1lTKCAgZ2V0c29ja29wdChzb2NrLCBJUFBST1RPX1NDVFAsIFNDVFBfU1RBVFVTLCAmc3RhdHVzLCAmc3opICk7CisJaWYgKHN6ICE9IHNpemVvZihzdGF0dXMpKQorCXsKKwkJVFJBQ0VfREVCVUcoSU5GTywgIkludmFsaWQgc2l6ZSBvZiBzb2NrZXQgb3B0aW9uOiAlZCAvICV6ZCIsIHN6LCBzaXplb2Yoc3RhdHVzKSk7CisJCXJldHVybiBFTk9UU1VQOworCX0KKyNpZiAwCisJCWNoYXIgc2FfYnVmW3NTQV9EVU1QX1NUUkxFTl07CisJCWZkX3NhX3NkdW1wX251bWVyaWMoc2FfYnVmLCAmc3RhdHVzLnNzdGF0X3ByaW1hcnkuc3BpbmZvX2FkZHJlc3MpOworCQlmZF9sb2dfZGVidWcoICJTQ1RQX1NUQVRVUyA6IHNzdGF0X3N0YXRlICAgICAgICAgICAgICAgICAgOiAlaSIgLCBzdGF0dXMuc3N0YXRfc3RhdGUpOworCQlmZF9sb2dfZGVidWcoICIgICAgICAgICAgICAgIHNzdGF0X3J3bmQgIAkgICAgICAgICAgOiAldSIgLCBzdGF0dXMuc3N0YXRfcnduZCk7CisJCWZkX2xvZ19kZWJ1ZyggIgkJICAgICBzc3RhdF91bmFja2RhdGEJICAgICAgICAgIDogJWh1Iiwgc3RhdHVzLnNzdGF0X3VuYWNrZGF0YSk7CisJCWZkX2xvZ19kZWJ1ZyggIgkJICAgICBzc3RhdF9wZW5kZGF0YSAJICAgICAgICAgIDogJWh1Iiwgc3RhdHVzLnNzdGF0X3BlbmRkYXRhKTsKKwkJZmRfbG9nX2RlYnVnKCAiCQkgICAgIHNzdGF0X2luc3RybXMgIAkgICAgICAgICAgOiAlaHUiLCBzdGF0dXMuc3N0YXRfaW5zdHJtcyk7CisJCWZkX2xvZ19kZWJ1ZyggIgkJICAgICBzc3RhdF9vdXRzdHJtcyAJICAgICAgICAgIDogJWh1Iiwgc3RhdHVzLnNzdGF0X291dHN0cm1zKTsKKwkJZmRfbG9nX2RlYnVnKCAiCQkgICAgIHNzdGF0X2ZyYWdtZW50YXRpb25fcG9pbnQgICAgOiAldSIgLCBzdGF0dXMuc3N0YXRfZnJhZ21lbnRhdGlvbl9wb2ludCk7CisJCWZkX2xvZ19kZWJ1ZyggIgkJICAgICBzc3RhdF9wcmltYXJ5LnNwaW5mb19hZGRyZXNzIDogJXMiICwgc2FfYnVmKTsKKwkJZmRfbG9nX2RlYnVnKCAiCQkgICAgIHNzdGF0X3ByaW1hcnkuc3BpbmZvX3N0YXRlICAgOiAlZCIgLCBzdGF0dXMuc3N0YXRfcHJpbWFyeS5zcGluZm9fc3RhdGUpOworCQlmZF9sb2dfZGVidWcoICIJCSAgICAgc3N0YXRfcHJpbWFyeS5zcGluZm9fY3duZCAgICA6ICV1IiAsIHN0YXR1cy5zc3RhdF9wcmltYXJ5LnNwaW5mb19jd25kKTsKKwkJZmRfbG9nX2RlYnVnKCAiCQkgICAgIHNzdGF0X3ByaW1hcnkuc3BpbmZvX3NydHQgICAgOiAldSIgLCBzdGF0dXMuc3N0YXRfcHJpbWFyeS5zcGluZm9fc3J0dCk7CisJCWZkX2xvZ19kZWJ1ZyggIgkJICAgICBzc3RhdF9wcmltYXJ5LnNwaW5mb19ydG8gICAgIDogJXUiICwgc3RhdHVzLnNzdGF0X3ByaW1hcnkuc3BpbmZvX3J0byk7CisJCWZkX2xvZ19kZWJ1ZyggIgkJICAgICBzc3RhdF9wcmltYXJ5LnNwaW5mb19tdHUgICAgIDogJXUiICwgc3RhdHVzLnNzdGF0X3ByaW1hcnkuc3BpbmZvX210dSk7CisjZW5kaWYgLyogMCAqLworCQorCSppbiA9IHN0YXR1cy5zc3RhdF9pbnN0cm1zOworCSpvdXQgPSBzdGF0dXMuc3N0YXRfb3V0c3RybXM7CisJCisJaWYgKHByaW1hcnkpCisJCW1lbWNweShwcmltYXJ5LCAmc3RhdHVzLnNzdGF0X3ByaW1hcnkuc3BpbmZvX2FkZHJlc3MsIHNpemVvZihzU1MpKTsKKwkKKwlyZXR1cm4gMDsKK30KKworLyogR2V0IHRoZSBsaXN0IG9mIHJlbW90ZSBlbmRwb2ludHMgb2YgdGhlIHNvY2tldCAqLworaW50IGZkX3NjdHBfZ2V0X3JlbW90ZV9lcChpbnQgc29jaywgc3RydWN0IGZkX2xpc3QgKiBsaXN0KQoreworCXVuaW9uIHsKKwkJc1NBCSpzYTsKKwkJdWludDhfdAkqYnVmOworCX0gcHRyOworCQorCXNTQSAqIGRhdGEgPSBOVUxMOworCWludCBjb3VudDsKKwkKKwlUUkFDRV9FTlRSWSgiJWQgJXAiLCBzb2NrLCBsaXN0KTsKKwlDSEVDS19QQVJBTVMobGlzdCk7CisJCisJLyogUmVhZCB0aGUgbGlzdCBvbiB0aGUgc29ja2V0ICovCisJQ0hFQ0tfU1lTKCBjb3VudCA9IHNjdHBfZ2V0cGFkZHJzKHNvY2ssIDAsICZkYXRhKSAgKTsKKwlwdHIuc2EgPSBkYXRhOworCQorCXdoaWxlIChjb3VudCkgeworCQlzb2NrbGVuX3Qgc2w7CisJCXN3aXRjaCAocHRyLnNhLT5zYV9mYW1pbHkpIHsKKwkJCWNhc2UgQUZfSU5FVDoJc2wgPSBzaXplb2Yoc1NBNCk7IGJyZWFrOworCQkJY2FzZSBBRl9JTkVUNjoJc2wgPSBzaXplb2Yoc1NBNik7IGJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlUUkFDRV9ERUJVRyhJTkZPLCAiVW5rbm93biBhZGRyZXNzIGZhbWlseSByZXR1cm5lZCBpbiBzY3RwX2dldHBhZGRyczogJWQsIHNraXAiLCBwdHIuc2EtPnNhX2ZhbWlseSk7CisJCQkJLyogVGhlcmUgaXMgYSBidWcgaW4gY3VycmVudCBMaW51eCBrZXJuZWw6IGh0dHA6Ly93d3cuc3Bpbmljcy5uZXQvbGlzdHMvbGludXgtc2N0cC9tc2cwMDc2MC5odG1sICovCisJCQkJZ290byBzdG9wOworCQl9CisJCQkJCisJCUNIRUNLX0ZDVCggZmRfZXBfYWRkX21lcmdlKCBsaXN0LCBwdHIuc2EsIHNsLCBFUF9GTF9MTCApICk7CisJCXB0ci5idWYgKz0gc2w7CisJCWNvdW50IC0tOworCX0KK3N0b3A6CQorCS8qIEZyZWUgdGhlIGxpc3QgKi8KKwlzY3RwX2ZyZWVwYWRkcnMoZGF0YSk7CisJCisJLyogTm93IGdldCB0aGUgcHJpbWFyeSBhZGRyZXNzLCB0aGUgYWRkIGZ1bmN0aW9uIHdpbGwgdGFrZSBjYXJlIG9mIG1lcmdpbmcgd2l0aCBleGlzdGluZyBlbnRyeSAqLworCXsKKwkJIAorCQlzdHJ1Y3Qgc2N0cF9zdGF0dXMgc3RhdHVzOworCQlzb2NrbGVuX3Qgc3ogPSBzaXplb2Yoc3RhdHVzKTsKKwkJaW50IHJldDsKKwkJCisJCW1lbXNldCgmc3RhdHVzLCAwLCBzaXplb2Yoc3RhdHVzKSk7CisJCS8qIEF0dGVtcHQgdG8gdXNlIFNDVFBfU1RBVFVTIG1lc3NhZ2UgdG8gcmV0cmlldmUgdGhlIHByaW1hcnkgYWRkcmVzcyAqLworCQlDSEVDS19TWVNfRE8oIHJldCA9IGdldHNvY2tvcHQoc29jaywgSVBQUk9UT19TQ1RQLCBTQ1RQX1NUQVRVUywgJnN0YXR1cywgJnN6KSwgLyogY29udGludWUgKi8pOworCQlpZiAoc3ogIT0gc2l6ZW9mKHN0YXR1cykpCisJCQlyZXQgPSAtMTsKKwkJc3ogPSBzaXplb2Yoc1NTKTsKKwkJaWYgKHJldCA8IDApCisJCXsKKwkJCS8qIEZhbGxiYWNrIHRvIGdldHNvY2tuYW1lIC0tIG5vdCByZWNvbW1lbmRlZCBieSBkcmFmdC1pZXRmLXRzdndnLXNjdHBzb2NrZXQtMTkjc2VjdGlvbi03LjQgKi8KKwkJCUNIRUNLX1NZUyhnZXRwZWVybmFtZShzb2NrLCAoc1NBICopJnN0YXR1cy5zc3RhdF9wcmltYXJ5LnNwaW5mb19hZGRyZXNzLCAmc3opKTsKKwkJfQorCQkJCisJCUNIRUNLX0ZDVCggZmRfZXBfYWRkX21lcmdlKCBsaXN0LCAoc1NBICopJnN0YXR1cy5zc3RhdF9wcmltYXJ5LnNwaW5mb19hZGRyZXNzLCBzeiwgRVBfRkxfUFJJTUFSWSApICk7CisJfQorCQorCS8qIERvbmUhICovCisJcmV0dXJuIDA7Cit9CisKKy8qIFNlbmQgYSB2ZWN0b3Igb3ZlciBhIHNwZWNpZmllZCBzdHJlYW0gKi8KK3NzaXplX3QgZmRfc2N0cF9zZW5kc3RydihzdHJ1Y3QgY254Y3R4ICogY29ubiwgdWludDE2X3Qgc3RyaWQsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LCBpbnQgaW92Y250KQoreworCXN0cnVjdCBtc2doZHIgbWhkcjsKKwlzdHJ1Y3QgY21zZ2hkciAJCSpoZHI7CisjaWZkZWYgT0xEX1NDVFBfU09DS0VUX0FQSQorCXN0cnVjdCBzY3RwX3NuZHJjdmluZm8JKnNuZHJjdjsKKwl1aW50OF90IGFuY2lbQ01TR19TUEFDRShzaXplb2Yoc3RydWN0IHNjdHBfc25kcmN2aW5mbykpXTsKKyNlbHNlIC8qIE9MRF9TQ1RQX1NPQ0tFVF9BUEkgKi8KKwlzdHJ1Y3Qgc2N0cF9zbmRpbmZvIAkqc25kaW5mOworCXVpbnQ4X3QgYW5jaVtDTVNHX1NQQUNFKHNpemVvZihzdHJ1Y3Qgc2N0cF9zbmRpbmZvKSldOwkKKyNlbmRpZiAvKiBPTERfU0NUUF9TT0NLRVRfQVBJICovCisJc3NpemVfdCByZXQ7CisJc3RydWN0IHRpbWVzcGVjIHRzLCBub3c7CisJCisJVFJBQ0VfRU5UUlkoIiVwICVodSAlcCAlZCIsIGNvbm4sIHN0cmlkLCBpb3YsIGlvdmNudCk7CisJQ0hFQ0tfUEFSQU1TX0RPKGNvbm4gJiYgaW92ICYmIGlvdmNudCwgeyBlcnJubyA9IEVJTlZBTDsgcmV0dXJuIC0xOyB9ICk7CisJQ0hFQ0tfU1lTX0RPKCAgY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJnRzKSwgcmV0dXJuIC0xICk7CisJCisJbWVtc2V0KCZtaGRyLCAwLCBzaXplb2YobWhkcikpOworCW1lbXNldCgmYW5jaSwgMCwgc2l6ZW9mKGFuY2kpKTsKKwkKKwkvKiBBbmNpbGlhcnkgZGF0YTogc3BlY2lmeSBTQ1RQIHN0cmVhbSAqLworCWhkciA9IChzdHJ1Y3QgY21zZ2hkciAqKWFuY2k7CisJaGRyLT5jbXNnX2xlbiAgID0gc2l6ZW9mKGFuY2kpOworCWhkci0+Y21zZ19sZXZlbCA9IElQUFJPVE9fU0NUUDsKKyNpZmRlZiBPTERfU0NUUF9TT0NLRVRfQVBJCisJaGRyLT5jbXNnX3R5cGUgID0gU0NUUF9TTkRSQ1Y7CisJc25kcmN2ID0gKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8gKilDTVNHX0RBVEEoaGRyKTsKKwlzbmRyY3YtPnNpbmZvX3N0cmVhbSA9IHN0cmlkOworI2Vsc2UgLyogT0xEX1NDVFBfU09DS0VUX0FQSSAqLworCWhkci0+Y21zZ190eXBlICA9IFNDVFBfU05ESU5GTzsKKwlzbmRpbmYgPSAoc3RydWN0IHNjdHBfc25kaW5mbyAqKUNNU0dfREFUQShoZHIpOworCXNuZGluZi0+c25kX3NpZCA9IHN0cmlkOworI2VuZGlmIC8qIE9MRF9TQ1RQX1NPQ0tFVF9BUEkgKi8KKwkvKiBub3RlIDogd2UgY291bGQgc3RvcmUgb3RoZXIgZGF0YSBhbHNvLCBmb3IgZXhhbXBsZSBpbiAuc2luZm9fcHBpZCBmb3IgcmVtb3RlIHBlZXIgb3IgaW4gLnNpbmZvX2NvbnRleHQgZm9yIGVycm9ycy4gKi8KKwkKKwkvKiBXZSBkb24ndCB1c2UgbWhkci5tc2dfbmFtZSBoZXJlOyBpdCBjb3VsZCBiZSB1c2VkIHRvIHNwZWNpZnkgYW4gYWRkcmVzcyBkaWZmZXJlbnQgZnJvbSB0aGUgcHJpbWFyeSAqLworCQorCW1oZHIubXNnX2lvdiAgICA9IChzdHJ1Y3QgaW92ZWMgKilpb3Y7CisJbWhkci5tc2dfaW92bGVuID0gaW92Y250OworCQorCW1oZHIubXNnX2NvbnRyb2wgICAgPSBhbmNpOworCW1oZHIubXNnX2NvbnRyb2xsZW4gPSBzaXplb2YoYW5jaSk7CisJCisJVFJBQ0VfREVCVUcoRlVMTCwgIlNlbmRpbmcgJWQgY2h1bmtzIG9mIGRhdGEgKGZpcnN0OiV6ZGIpIG9uIHN0cmVhbSAlaHUgb2Ygc29ja2V0ICVkIiwgaW92Y250LCBpb3ZbMF0uaW92X2xlbiwgc3RyaWQsIGNvbm4tPmNjX3NvY2tldCk7CithZ2FpbjoJCisJcmV0ID0gc2VuZG1zZyhjb25uLT5jY19zb2NrZXQsICZtaGRyLCAwKTsKKwkvKiBIYW5kbGUgc3BlY2lhbCBjYXNlIG9mIHRpbWVvdXQgKi8KKwlpZiAoKHJldCA8IDApICYmICgoZXJybm8gPT0gRUFHQUlOKSB8fCAoZXJybm8gPT0gRUlOVFIpKSkgeworCQlwdGhyZWFkX3Rlc3RjYW5jZWwoKTsKKwkJLyogQ2hlY2sgaG93IG11Y2ggdGltZSB3ZSB3ZXJlIGJsb2NrZWQgZm9yIHRoaXMgc2VuZGluZy4gKi8KKwkJQ0hFQ0tfU1lTX0RPKCAgY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJm5vdyksIHJldHVybiAtMSApOworCQlpZiAoICgobm93LnR2X3NlYyAtIHRzLnR2X3NlYykgKiAxMDAwICsgKChub3cudHZfbnNlYyAtIHRzLnR2X25zZWMpIC8gMTAwMDAwMEwpKSA+IE1BWF9IT1RMX0JMT0NLSU5HX1RJTUUpIHsKKwkJCUxPR19EKCJVbmFibGUgdG8gc2VuZCBhbnkgZGF0YSBmb3IgJWRtcywgY2xvc2luZyB0aGUgY29ubmVjdGlvbiIsIE1BWF9IT1RMX0JMT0NLSU5HX1RJTUUpOworCQl9IGVsc2UgaWYgKCEgZmRfY254X3Rlc3RzdGF0ZShjb25uLCBDQ19TVEFUVVNfQ0xPU0lORyApKSB7CisJCQlnb3RvIGFnYWluOyAvKiBkb24ndCBjYXJlLCBqdXN0IGlnbm9yZSAqLworCQl9CisJCQorCQkvKiBwcm9wYWdhdGUgdGhlIGVycm9yICovCisJCWVycm5vID0gLXJldDsKKwkJcmV0ID0gLTE7CisJfQorCQorCUNIRUNLX1NZU19ETyggcmV0LCApOyAvKiBmb3IgdHJhY2luZyBlcnJvciBvbmx5ICovCisJCisJcmV0dXJuIHJldDsKK30KKworLyogUmVjZWl2ZSB0aGUgbmV4dCBkYXRhIGZyb20gdGhlIHNvY2tldCwgb3IgbmV4dCBub3RpZmljYXRpb24gKi8KK2ludCBmZF9zY3RwX3JlY3ZtZXRhKHN0cnVjdCBjbnhjdHggKiBjb25uLCB1aW50MTZfdCAqIHN0cmlkLCB1aW50OF90ICoqIGJ1Ziwgc2l6ZV90ICogbGVuLCBpbnQgKmV2ZW50KQoreworCXNzaXplX3QgCQkgcmV0ID0gMDsKKwlzdHJ1Y3QgbXNnaGRyIAkJIG1oZHI7CisJY2hhciAgIAkJCSBhbmNpZGF0YVsgQ01TR19CVUZfTEVOIF07CisJc3RydWN0IGlvdmVjIAkJIGlvdjsKKwl1aW50OF90CQkJKmRhdGEgPSBOVUxMOworCXNpemVfdCAJCQkgYnVmc3ogPSAwLCBkYXRhc2l6ZSA9IDA7CisJc2l6ZV90CQkJIG1lbXBhZ2VzeiA9IHN5c2NvbmYoX1NDX1BBR0VTSVpFKTsgLyogV2UgYWxsb2MgYnVmZmVyIGJ5IG1lbW9yeSBwYWdlcyBmb3IgZWZmaWNpZW5jeSAqLworCWludCAJCQkgdGltZWRvdXQgPSAwOworCQorCVRSQUNFX0VOVFJZKCIlcCAlcCAlcCAlcCAlcCIsIGNvbm4sIHN0cmlkLCBidWYsIGxlbiwgZXZlbnQpOworCUNIRUNLX1BBUkFNUyggY29ubiAmJiBidWYgJiYgbGVuICYmIGV2ZW50ICk7CisJCisJLyogQ2xlYW51cCBvdXQgcGFyYW1ldGVycyAqLworCSpidWYgPSBOVUxMOworCSpsZW4gPSAwOworCSpldmVudCA9IDA7CisJCisJLyogUHJlcGFyZSBoZWFkZXIgZm9yIHJlY2VpdmluZyBtZXNzYWdlICovCisJbWVtc2V0KCZtaGRyLCAwLCBzaXplb2YobWhkcikpOworCW1oZHIubXNnX2lvdiAgICA9ICZpb3Y7CisJbWhkci5tc2dfaW92bGVuID0gMTsKKwltaGRyLm1zZ19jb250cm9sICAgID0gJmFuY2lkYXRhOworCW1oZHIubXNnX2NvbnRyb2xsZW4gPSBzaXplb2YoYW5jaWRhdGEpOworCQorbmV4dF9tZXNzYWdlOgorCWRhdGFzaXplID0gMDsKKwkKKwkvKiBXZSB3aWxsIGxvb3Agd2hpbGUgYWxsIGRhdGEgaXMgbm90IHJlY2VpdmVkLiAqLworaW5jb21wbGV0ZToKKwl3aGlsZSAoZGF0YXNpemUgPj0gYnVmc3ogKSB7CisJCS8qIFRoZSBidWZmZXIgaXMgZnVsbCwgZW5sYXJnZSBpdCAqLworCQlidWZzeiArPSBtZW1wYWdlc3o7CisJCUNIRUNLX01BTExPQyggZGF0YSA9IHJlYWxsb2MoZGF0YSwgYnVmc3ogKSApOworCX0KKwkvKiB0aGUgbmV3IGRhdGEgd2lsbCBiZSByZWNlaXZlZCBmb2xsb3dpbmcgdGhlIHByZWNlZGluZyAqLworCW1lbXNldCgmaW92LCAgMCwgc2l6ZW9mKGlvdikpOworCWlvdi5pb3ZfYmFzZSA9IGRhdGEgKyBkYXRhc2l6ZSA7CisJaW92Lmlvdl9sZW4gID0gYnVmc3ogLSBkYXRhc2l6ZTsKKworCS8qIFJlY2VpdmUgZGF0YSBmcm9tIHRoZSBzb2NrZXQgKi8KK2FnYWluOgorCXB0aHJlYWRfY2xlYW51cF9wdXNoKGZyZWUsIGRhdGEpOworCXJldCA9IHJlY3Ztc2coY29ubi0+Y2Nfc29ja2V0LCAmbWhkciwgMCk7CisJcHRocmVhZF90ZXN0Y2FuY2VsKCk7CisJcHRocmVhZF9jbGVhbnVwX3BvcCgwKTsKKwkKKwkvKiBGaXJzdCwgaGFuZGxlIHRpbWVvdXRzIChzYW1lIGFzIGZkX2NueF9zX3JlY3YpICovCisJaWYgKChyZXQgPCAwKSAmJiAoKGVycm5vID09IEVBR0FJTikgfHwgKGVycm5vID09IEVJTlRSKSkpIHsKKwkJaWYgKCEgZmRfY254X3Rlc3RzdGF0ZShjb25uLCBDQ19TVEFUVVNfQ0xPU0lORyApKQorCQkJZ290byBhZ2FpbjsgLyogZG9uJ3QgY2FyZSwganVzdCBpZ25vcmUgKi8KKwkJaWYgKCF0aW1lZG91dCkgeworCQkJdGltZWRvdXQgKys7IC8qIGFsbG93IGZvciBvbmUgdGltZW91dCB3aGlsZSBjbG9zaW5nICovCisJCQlnb3RvIGFnYWluOworCQl9CisJCS8qIGZhbGxiYWNrIHRvIG5vcm1hbCBoYW5kbGluZyAqLworCX0KKwkKKwkvKiBIYW5kbGUgZXJyb3JzICovCisJaWYgKHJldCA8PSAwKSB7IC8qIFNvY2tldCB0aW1lZG91dCwgY2xvc2VkLCBvciBhbiBlcnJvciBvY2N1cnJlZCAqLworCQlDSEVDS19TWVNfRE8ocmV0LCAvKiB0byBsb2cgaW4gY2FzZSBvZiBlcnJvciAqLyk7CisJCWZyZWUoZGF0YSk7CisJCSpldmVudCA9IEZERVZQX0NOWF9FUlJPUjsKKwkJcmV0dXJuIDA7CisJfQorCQorCS8qIFVwZGF0ZSB0aGUgc2l6ZSBvZiBkYXRhIHdlIHJlY2VpdmVkICovCisJZGF0YXNpemUgKz0gcmV0OworCisJLyogU0NUUCBwcm92aWRlcyBhbiBpbmRpY2F0aW9uIHdoZW4gd2UgcmVjZWl2ZWQgYSBmdWxsIHJlY29yZDsgbG9vcCBpZiBpdCBpcyBub3QgdGhlIGNhc2UgKi8KKwlpZiAoICEgKG1oZHIubXNnX2ZsYWdzICYgTVNHX0VPUikgKSB7CisJCWdvdG8gaW5jb21wbGV0ZTsKKwl9CisJCisJLyogSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZSBkYXRhIHJlY2VpdmVkIGlzIGEgbm90aWZpY2F0aW9uICovCisJaWYgKG1oZHIubXNnX2ZsYWdzICYgTVNHX05PVElGSUNBVElPTikgeworCQl1bmlvbiBzY3RwX25vdGlmaWNhdGlvbiAqIG5vdGlmID0gKHVuaW9uIHNjdHBfbm90aWZpY2F0aW9uICopIGRhdGE7CisJCQorCQlUUkFDRV9ERUJVRyhGVUxMLCAiUmVjZWl2ZWQgJXpkYiBkYXRhIG9mIG5vdGlmaWNhdGlvbiBvbiBzb2NrZXQgJWQiLCBkYXRhc2l6ZSwgY29ubi0+Y2Nfc29ja2V0KTsKKwkKKwkJc3dpdGNoIChub3RpZi0+c25faGVhZGVyLnNuX3R5cGUpIHsKKwkJCQorCQkJY2FzZSBTQ1RQX0FTU09DX0NIQU5HRTogLyogV2Ugc2hvdWxkIG5vdCByZWNlaXZlIHRoZXNlIGFzIHdlIGRpZCBub3Qgc3Vic2NyaWJlIGZvciBpdCAqLworCQkJCVRSQUNFX0RFQlVHKEZVTEwsICJSZWNlaXZlZCBTQ1RQX0FTU09DX0NIQU5HRSBub3RpZmljYXRpb24iKTsKKwkJCQlUUkFDRV9ERUJVRyhBTk5PWUlORywgIiAgICBzdGF0ZSA6ICVodSIsIG5vdGlmLT5zbl9hc3NvY19jaGFuZ2Uuc2FjX3N0YXRlKTsKKwkJCQlUUkFDRV9ERUJVRyhBTk5PWUlORywgIiAgICBlcnJvciA6ICVodSIsIG5vdGlmLT5zbl9hc3NvY19jaGFuZ2Uuc2FjX2Vycm9yKTsKKwkJCQlUUkFDRV9ERUJVRyhBTk5PWUlORywgIiAgICBpbnN0ciA6ICVodSIsIG5vdGlmLT5zbl9hc3NvY19jaGFuZ2Uuc2FjX2luYm91bmRfc3RyZWFtcyk7CisJCQkJVFJBQ0VfREVCVUcoQU5OT1lJTkcsICIgICBvdXRzdHIgOiAlaHUiLCBub3RpZi0+c25fYXNzb2NfY2hhbmdlLnNhY19vdXRib3VuZF9zdHJlYW1zKTsKKwkJCQkKKwkJCQkqZXZlbnQgPSBGREVWUF9DTlhfRVBfQ0hBTkdFOworCQkJCWJyZWFrOworCQorCQkJY2FzZSBTQ1RQX1BFRVJfQUREUl9DSEFOR0U6CisJCQkJVFJBQ0VfREVCVUcoRlVMTCwgIlJlY2VpdmVkIFNDVFBfUEVFUl9BRERSX0NIQU5HRSBub3RpZmljYXRpb24iKTsKKwkJCQkvKiBUUkFDRV9zU0EoRkRfTE9HX0RFQlVHLCBBTk5PWUlORywgIiAgICBpbnRmX2NoYW5nZSA6ICIsICYobm90aWYtPnNuX3BhZGRyX2NoYW5nZS5zcGNfYWFkZHIpLCBOSV9OVU1FUklDSE9TVCB8IE5JX05VTUVSSUNTRVJWLCAiIiApOyAqLworCQkJCVRSQUNFX0RFQlVHKEFOTk9ZSU5HLCAiICAgICAgICAgIHN0YXRlIDogJWQiLCBub3RpZi0+c25fcGFkZHJfY2hhbmdlLnNwY19zdGF0ZSk7CisJCQkJVFJBQ0VfREVCVUcoQU5OT1lJTkcsICIgICAgICAgICAgZXJyb3IgOiAlZCIsIG5vdGlmLT5zbl9wYWRkcl9jaGFuZ2Uuc3BjX2Vycm9yKTsKKwkJCQkKKwkJCQkqZXZlbnQgPSBGREVWUF9DTlhfRVBfQ0hBTkdFOworCQkJCWJyZWFrOworCQorCQkJY2FzZSBTQ1RQX1JFTU9URV9FUlJPUjoKKwkJCQlUUkFDRV9ERUJVRyhGVUxMLCAiUmVjZWl2ZWQgU0NUUF9SRU1PVEVfRVJST1Igbm90aWZpY2F0aW9uIik7CisJCQkJVFJBQ0VfREVCVUcoQU5OT1lJTkcsICIgICAgZXJyIDogJWh1IiwgbnRvaHMobm90aWYtPnNuX3JlbW90ZV9lcnJvci5zcmVfZXJyb3IpKTsKKwkJCQlUUkFDRV9ERUJVRyhBTk5PWUlORywgIiAgICBsZW4gOiAlaHUiLCBudG9ocyhub3RpZi0+c25fcmVtb3RlX2Vycm9yLnNyZV9sZW5ndGgpKTsKKwkJCQkKKwkJCQkqZXZlbnQgPSBGREVWUF9DTlhfRVJST1I7CisJCQkJYnJlYWs7CisJCisjaWZkZWYgT0xEX1NDVFBfU09DS0VUX0FQSQorCQkJY2FzZSBTQ1RQX1NFTkRfRkFJTEVEOgorCQkJCVRSQUNFX0RFQlVHKEZVTEwsICJSZWNlaXZlZCBTQ1RQX1NFTkRfRkFJTEVEIG5vdGlmaWNhdGlvbiIpOworCQkJCVRSQUNFX0RFQlVHKEFOTk9ZSU5HLCAiICAgIGxlbiA6ICVodSIsIG5vdGlmLT5zbl9zZW5kX2ZhaWxlZC5zc2ZfbGVuZ3RoKTsKKwkJCQlUUkFDRV9ERUJVRyhBTk5PWUlORywgIiAgICBlcnIgOiAlZCIsICBub3RpZi0+c25fc2VuZF9mYWlsZWQuc3NmX2Vycm9yKTsKKwkJCQkKKwkJCQkqZXZlbnQgPSBGREVWUF9DTlhfRVJST1I7CisJCQkJYnJlYWs7CisjZWxzZSAvKiAgT0xEX1NDVFBfU09DS0VUX0FQSSAqLworCQkJY2FzZSBTQ1RQX1NFTkRfRkFJTEVEX0VWRU5UOgorCQkJCVRSQUNFX0RFQlVHKEZVTEwsICJSZWNlaXZlZCBTQ1RQX1NFTkRfRkFJTEVEX0VWRU5UIG5vdGlmaWNhdGlvbiIpOworCQkJCSpldmVudCA9IEZERVZQX0NOWF9FUlJPUjsKKwkJCQlicmVhazsKKyNlbmRpZgkvKiAgT0xEX1NDVFBfU09DS0VUX0FQSSAqLwkJCisJCQljYXNlIFNDVFBfU0hVVERPV05fRVZFTlQ6CisJCQkJVFJBQ0VfREVCVUcoRlVMTCwgIlJlY2VpdmVkIFNDVFBfU0hVVERPV05fRVZFTlQgbm90aWZpY2F0aW9uIik7CisJCQkJCisJCQkJKmV2ZW50ID0gRkRFVlBfQ05YX1NIVVRET1dOOworCQkJCWJyZWFrOworCQkJCQorI2lmbmRlZiBPTERfU0NUUF9TT0NLRVRfQVBJCisJCQljYXNlIFNDVFBfTk9USUZJQ0FUSU9OU19TVE9QUEVEX0VWRU5UOgorCQkJCVRSQUNFX0RFQlVHKElORk8sICJSZWNlaXZlZCBTQ1RQX05PVElGSUNBVElPTlNfU1RPUFBFRF9FVkVOVCBub3RpZmljYXRpb24sIG1hcmtpbmcgdGhlIGFzc29jaWF0aW9uIGluIGVycm9yIHN0YXRlIik7CisJCQkJKmV2ZW50ID0gRkRFVlBfQ05YX0VSUk9SOworCQkJCWJyZWFrOworI2VuZGlmCS8qICBPTERfU0NUUF9TT0NLRVRfQVBJICovCQkKKwkJCQorCQkJZGVmYXVsdDoJCisJCQkJVFJBQ0VfREVCVUcoRlVMTCwgIlJlY2VpdmVkIHVua25vd24gbm90aWZpY2F0aW9uICVkLCBpZ25vcmVkIiwgbm90aWYtPnNuX2hlYWRlci5zbl90eXBlKTsKKwkJCQlnb3RvIG5leHRfbWVzc2FnZTsKKwkJfQorCQkKKwkJZnJlZShkYXRhKTsKKwkJcmV0dXJuIDA7CisJfQorCQorCS8qIEZyb20gdGhpcyBwb2ludCwgd2UgaGF2ZSByZWNlaXZlZCBhIG1lc3NhZ2UgKi8KKwkqZXZlbnQgPSBGREVWUF9DTlhfTVNHX1JFQ1Y7CisJKmJ1ZiA9IGRhdGE7CisJKmxlbiA9IGRhdGFzaXplOworCQorCWlmIChzdHJpZCkgeworCQlzdHJ1Y3QgY21zZ2hkciAJCSpoZHI7CisjaWZkZWYgT0xEX1NDVFBfU09DS0VUX0FQSQorCQlzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvCSpzbmRyY3Y7CisjZWxzZSAvKiAgT0xEX1NDVFBfU09DS0VUX0FQSSAqLworCQlzdHJ1Y3Qgc2N0cF9yY3ZpbmZvCSpyY3ZpbmY7CisjZW5kaWYgLyogIE9MRF9TQ1RQX1NPQ0tFVF9BUEkgKi8KKwkJCisJCS8qIEhhbmRsZSB0aGUgYW5jaWxpYXJ5IGRhdGEgKi8KKwkJZm9yIChoZHIgPSBDTVNHX0ZJUlNUSERSKCZtaGRyKTsgaGRyOyBoZHIgPSBDTVNHX05YVEhEUigmbWhkciwgaGRyKSkgeworCisJCQkvKiBXZSBkZWFsIG9ubHkgd2l0aCBhbmNpbGlhcnkgZGF0YSBhdCBTQ1RQIGxldmVsICovCisJCQlpZiAoaGRyLT5jbXNnX2xldmVsICE9IElQUFJPVE9fU0NUUCkgeworCQkJCVRSQUNFX0RFQlVHKEZVTEwsICJSZWNlaXZlZCBzb21lIGFuY2lsaWFyeSBkYXRhIGF0IGxldmVsICVkLCBza2lwcGVkIiwgaGRyLT5jbXNnX2xldmVsKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCQorI2lmZGVmIE9MRF9TQ1RQX1NPQ0tFVF9BUEkKKwkJCS8qIEFsc28gb25seSBpbnRlcmVzdGVkIGluIFNDVFBfU05EUkNWIG1lc3NhZ2UgZm9yIHRoZSBtb21lbnQgKi8KKwkJCWlmIChoZHItPmNtc2dfdHlwZSAhPSBTQ1RQX1NORFJDVikgeworCQkJCVRSQUNFX0RFQlVHKEZVTEwsICJBbmNpbGlhcnkgYmxvY2sgSVBQUk9UT19TQ1RQIC8gJWQsIHNraXBwZWQiLCBoZHItPmNtc2dfdHlwZSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQkKKwkJCXNuZHJjdiA9IChzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvICopIENNU0dfREFUQShoZHIpOworCQkJaWYgKFRSQUNFX0JPT0woQU5OT1lJTkcpKSB7CisJCQkJZmRfbG9nX2RlYnVnKCAiQW5jaWxpYXJ5IGJsb2NrIElQUFJPVE9fU0NUUCAvIFNDVFBfU05EUkNWIik7CisJCQkJZmRfbG9nX2RlYnVnKCAiICAgIHNpbmZvX3N0cmVhbSAgICA6ICVodSIsIHNuZHJjdi0+c2luZm9fc3RyZWFtKTsKKwkJCQlmZF9sb2dfZGVidWcoICIgICAgc2luZm9fc3NuICAgICAgIDogJWh1Iiwgc25kcmN2LT5zaW5mb19zc24pOworCQkJCWZkX2xvZ19kZWJ1ZyggIiAgICBzaW5mb19mbGFncyAgICAgOiAlaHUiLCBzbmRyY3YtPnNpbmZvX2ZsYWdzKTsKKwkJCQkvKiBmZF9sb2dfZGVidWcoICIgICAgc2luZm9fcHJfcG9saWN5IDogJWh1Iiwgc25kcmN2LT5zaW5mb19wcl9wb2xpY3kpOyAqLworCQkJCWZkX2xvZ19kZWJ1ZyggIiAgICBzaW5mb19wcGlkICAgICAgOiAldSIgLCBzbmRyY3YtPnNpbmZvX3BwaWQpOworCQkJCWZkX2xvZ19kZWJ1ZyggIiAgICBzaW5mb19jb250ZXh0ICAgOiAldSIgLCBzbmRyY3YtPnNpbmZvX2NvbnRleHQpOworCQkJCS8qIGZkX2xvZ19kZWJ1ZyggIiAgICBzaW5mb19wcl92YWx1ZSAgOiAldSIgLCBzbmRyY3YtPnNpbmZvX3ByX3ZhbHVlKTsgKi8KKwkJCQlmZF9sb2dfZGVidWcoICIgICAgc2luZm9fdHNuICAgICAgIDogJXUiICwgc25kcmN2LT5zaW5mb190c24pOworCQkJCWZkX2xvZ19kZWJ1ZyggIiAgICBzaW5mb19jdW10c24gICAgOiAldSIgLCBzbmRyY3YtPnNpbmZvX2N1bXRzbik7CisJCQl9CisKKwkJCSpzdHJpZCA9IHNuZHJjdi0+c2luZm9fc3RyZWFtOworI2Vsc2UgLyogIE9MRF9TQ1RQX1NPQ0tFVF9BUEkgKi8KKwkJCS8qIEFsc28gb25seSBpbnRlcmVzdGVkIGluIFNDVFBfUkNWSU5GTyBtZXNzYWdlIGZvciB0aGUgbW9tZW50ICovCisJCQlpZiAoaGRyLT5jbXNnX3R5cGUgIT0gU0NUUF9SQ1ZJTkZPKSB7CisJCQkJVFJBQ0VfREVCVUcoRlVMTCwgIkFuY2lsaWFyeSBibG9jayBJUFBST1RPX1NDVFAgLyAlZCwgc2tpcHBlZCIsIGhkci0+Y21zZ190eXBlKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCQorCQkJcmN2aW5mID0gKHN0cnVjdCBzY3RwX3JjdmluZm8gKikgQ01TR19EQVRBKGhkcik7CisKKwkJCSpzdHJpZCA9IHJjdmluZi0+cmN2X3NpZDsKKyNlbmRpZiAvKiAgT0xEX1NDVFBfU09DS0VUX0FQSSAqLworCQkJCisJCQkKKwkJfQorCQlUUkFDRV9ERUJVRyhGVUxMLCAiUmVjZWl2ZWQgJXpkYiBkYXRhIG9uIHNvY2tldCAlZCwgc3RyZWFtICVodSIsIGRhdGFzaXplLCBjb25uLT5jY19zb2NrZXQsICpzdHJpZCk7CisJfSBlbHNlIHsKKwkJVFJBQ0VfREVCVUcoRlVMTCwgIlJlY2VpdmVkICV6ZGIgZGF0YSBvbiBzb2NrZXQgJWQgKHN0cmVhbSBpZ25vcmVkKSIsIGRhdGFzaXplLCBjb25uLT5jY19zb2NrZXQpOworCX0KKwkKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYmZkY29yZS9zY3RwMzQzNi5jIGIvbGliZmRjb3JlL3NjdHAzNDM2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ1YTFhYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmZkY29yZS9zY3RwMzQzNi5jCkBAIC0wLDAgKzEsNzkzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxMywgV0lERSBQcm9qZWN0IGFuZCBOSUNUCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBXSURFIFByb2plY3Qgb3IgTklDVCBub3IgdGhlIAkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFdJREUgUHJvamVjdCBhbmQgCQkJCQkJICoKKyogICBOSUNULgkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoaXMgZmlsZSBjb250YWlucyBjb2RlIGZvciBUTFMgb3ZlciBtdWx0aS1zdHJlYW0gU0NUUCB3cmFwcGVyIGltcGxlbWVudGF0aW9uIChHbnVUTFMgZG9lcyBub3Qgc3VwcG9ydCB0aGlzKSAqLworLyogU2VlIGh0dHA6Ly9hYWEua29nYW5laS53aWRlLmFkLmpwL2Jsb2dzL2luZGV4LnBocC93YWFhZC8yMDA4LzA4LzE4L3Rscy1vdmVyLXNjdHAgZm9yIGhpc3RvcnkgKi8KKworI2luY2x1ZGUgImZkY29yZS1pbnRlcm5hbC5oIgorI2luY2x1ZGUgImNueGN0eC5oIgorCisjaW5jbHVkZSA8bmV0aW5ldC9zY3RwLmg+CisjaW5jbHVkZSA8c3lzL3Vpby5oPgorCisvKgorCitBcmNoaXRlY3R1cmUgb2YgdGhpcyB3cmFwcGVyOgorIC0gd2UgaGF2ZSBzZXZlcmFsIGZpZm8gcXVldWVzICgxIHBlciBzdHJlYW0gcGFpcnMpLgorIEdudVRMUyBpcyBjb25maWd1cmVkIHRvIHVzZSBjdXN0b20gcHVzaCAvIHB1bGwgZnVuY3Rpb25zOgorIC0gdGhlIHB1bGwgZnVuY3Rpb24gcmV0cmlldmVzIHRoZSBkYXRhIGZyb20gdGhlIGZpZm8gcXVldWUgY29ycmVzcG9uZGluZyB0byBhIHN0cmVhbSAjLgorIC0gdGhlIHB1c2ggZnVuY3Rpb24gc2VuZHMgdGhlIGRhdGEgb24gYSBjZXJ0YWluIHN0cmVhbS4KKyBXZSBhbHNvIGhhdmUgYSBkZW11eCB0aHJlYWQgdGhhdCByZWFkcyB0aGUgc29ja2V0IGFuZCBzdG9yZSByZWNlaXZlZCBkYXRhIGluIHRoZSBhcHByb3ByaWF0ZSBmaWZvCisgCisgV2UgaGF2ZSBvbmUgZ251dGxzX3Nlc3Npb24gcGVyIHN0cmVhbSBwYWlyLCBhbmQgYXMgbWFueSB0aHJlYWRzIHRoYXQgcmVhZCB0aGUgZ251dGxzIHJlY29yZHMgYW5kIHNhdmUgaW5jb21pbmcgZGF0YSB0byB0aGUgdGFyZ2V0IHF1ZXVlLgorIAorVGhpcyBjb21wbGV4aXR5IGlzIHJlcXVpcmVkIGJlY2F1c2Ugd2UgY2Fubm90IHJlYWQgYSBzb2NrZXQgZm9yIGEgZ2l2ZW4gc3RyZWFtIG9ubHk7IHdlIGNhbiBvbmx5IGdldCB0aGUgbmV4dCBtZXNzYWdlIGFuZCBmaW5kIGl0cyBzdHJlYW0uCisqLworCisvKiBOb3RlIHRoYXQgdGhpcyBtZWNoYW5pc20gaXMgcmVwbGFjZWQgYnkgRFRMUyBpbiBSRkM2NzMzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgdGhyZWFkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRGVtdXggcmVjZWl2ZWQgZGF0YSBhbmQgc3RvcmUgaW4gdGhlIGFwcHJvcHJpYXRlIGZpZm8gKi8KK3N0YXRpYyB2b2lkICogZGVtdXhlcih2b2lkICogYXJnKQoreworCXN0cnVjdCBjbnhjdHggKiBjb25uID0gYXJnOworCXVpbnQ4X3QgKiBidWY7CisJc2l6ZV90ICAgIGJ1ZnN6OworCWludAkgIGV2ZW50OworCXVpbnQxNl90ICBzdHJpZDsKKwkKKwlUUkFDRV9FTlRSWSgiJXAiLCBhcmcpOworCUNIRUNLX1BBUkFNU19ETyhjb25uICYmIChjb25uLT5jY19zb2NrZXQgPiAwKSwgZ290byBvdXQpOworCQorCS8qIFNldCB0aGUgdGhyZWFkIG5hbWUgKi8KKwl7CisJCWNoYXIgYnVmWzQ4XTsKKwkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIkRlbXV4ZXIgKCVkOiVzKSIsIGNvbm4tPmNjX3NvY2tldCwgY29ubi0+Y2NfcmVtaWQpOworCQlmZF9sb2dfdGhyZWFkbmFtZSAoIGJ1ZiApOworCX0KKwkKKwlBU1NFUlQoIGNvbm4tPmNjX3Byb3RvID09IElQUFJPVE9fU0NUUCApOworCUFTU0VSVCggZmRfY254X3RhcmdldF9xdWV1ZShjb25uKSApOworCUFTU0VSVCggY29ubi0+Y2Nfc2N0cDM0MzZfZGF0YS5hcnJheSApOworCQorCWRvIHsKKwkJQ0hFQ0tfRkNUX0RPKCBmZF9zY3RwX3JlY3ZtZXRhKGNvbm4sICZzdHJpZCwgJmJ1ZiwgJmJ1ZnN6LCAmZXZlbnQpLCBnb3RvIGZhdGFsICk7CisJCXN3aXRjaCAoZXZlbnQpIHsKKwkJCWNhc2UgRkRFVlBfQ05YX01TR19SRUNWOgorCQkJCS8qIERlbXV4IHRoaXMgbWVzc2FnZSB0byB0aGUgYXBwcm9wcmlhdGUgZmlmbywgYW5vdGhlciB0aHJlYWQgd2lsbCBwdWxsLCBnbnV0bHMgcHJvY2VzcywgYW5kIHNlbmQgdG8gdGFyZ2V0IHF1ZXVlICovCisJCQkJaWYgKHN0cmlkIDwgY29ubi0+Y2Nfc2N0cF9wYXJhLnBhaXJzKSB7CisJCQkJCUNIRUNLX0ZDVF9ETyhmZF9ldmVudF9zZW5kKGNvbm4tPmNjX3NjdHAzNDM2X2RhdGEuYXJyYXlbc3RyaWRdLnJhd19yZWN2LCBldmVudCwgYnVmc3osIGJ1ZiksIGdvdG8gZmF0YWwgKTsKKwkJCQl9IGVsc2UgeworCQkJCQlUUkFDRV9ERUJVRyhJTkZPLCAiUmVjZWl2ZWQgcGFja2V0ICglemQgYnl0ZXMpIG9uIG91dC1vZi1yYW5nZSBzdHJlYW0gIyVkIGZyb20gJXMsIGRpc2NhcmRlZC4iLCBidWZzeiwgc3RyaWQsIGNvbm4tPmNjX3JlbWlkKTsKKwkJCQkJZnJlZShidWYpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCQkKKwkJCWNhc2UgRkRFVlBfQ05YX0VQX0NIQU5HRToKKwkJCQkvKiBTZW5kIHRoaXMgZXZlbnQgdG8gdGhlIHRhcmdldCBxdWV1ZSAqLworCQkJCUNIRUNLX0ZDVF9ETyggZmRfZXZlbnRfc2VuZCggZmRfY254X3RhcmdldF9xdWV1ZShjb25uKSwgZXZlbnQsIGJ1ZnN6LCBidWYpLCBnb3RvIGZhdGFsICk7CisJCQkJYnJlYWs7CisJCQkKKwkJCWNhc2UgRkRFVlBfQ05YX0VSUk9SOgorCQkJCWdvdG8gb3V0OworCQkJCQorCQkJY2FzZSBGREVWUF9DTlhfU0hVVERPV046CisJCQkJLyogSnVzdCBpZ25vcmUgdGhlIG5vdGlmaWNhdGlvbiBmb3Igbm93LCB3ZSB3aWxsIGdldCBhbm90aGVyIGVycm9yIGxhdGVyIGFueXdheSAqLworCQkJCWNvbnRpbnVlOworCQkJCQorCQkJZGVmYXVsdDoKKwkJCQlnb3RvIGZhdGFsOworCQl9CisJCQorCX0gd2hpbGUgKGNvbm4tPmNjX2xvb3ApOworCQorb3V0OgorCS8qIFNpZ25hbCB0ZXJtaW5hdGlvbiBvZiB0aGUgY29ubmVjdGlvbiB0byBhbGwgZGVjaXBoZXIgdGhyZWFkcyAqLworCWZvciAoc3RyaWQgPSAwOyBzdHJpZCA8IGNvbm4tPmNjX3NjdHBfcGFyYS5wYWlyczsgc3RyaWQrKykgeworCQlpZiAoY29ubi0+Y2Nfc2N0cDM0MzZfZGF0YS5hcnJheVtzdHJpZF0ucmF3X3JlY3YpIHsKKwkJCUNIRUNLX0ZDVF9ETyhmZF9ldmVudF9zZW5kKGNvbm4tPmNjX3NjdHAzNDM2X2RhdGEuYXJyYXlbc3RyaWRdLnJhd19yZWN2LCBGREVWUF9DTlhfRVJST1IsIDAsIE5VTEwpLCBnb3RvIGZhdGFsICk7CisJCX0KKwl9CisJZmRfY254X21hcmtlcnJvcihjb25uKTsKKwlUUkFDRV9ERUJVRyhGVUxMLCAiVGhyZWFkIHRlcm1pbmF0ZWQiKTsJCisJcmV0dXJuIE5VTEw7CisJCitmYXRhbDoKKwkvKiBBbiB1bnJlY292ZXJhYmxlIGVycm9yIG9jY3VycmVkLCBzdG9wIHRoZSBkYWVtb24gKi8KKwlDSEVDS19GQ1RfRE8oZmRfY29yZV9zaHV0ZG93bigpLCApOworCWdvdG8gb3V0OworfQorCisvKiBEZWNyeXB0IHRoZSBkYXRhIHJlY2VpdmVkIGluIHRoaXMgc3RyZWFtIHBhaXIgYW5kIHN0b3JlIGl0IGluIHRoZSB0YXJnZXQgcXVldWUgKi8KK3N0YXRpYyB2b2lkICogZGVjaXBoZXIodm9pZCAqIGFyZykKK3sKKwlzdHJ1Y3Qgc2N0cDM0MzZfY3R4ICogY3R4ID0gYXJnOworCXN0cnVjdCBjbnhjdHggCSAqY254OworCQorCVRSQUNFX0VOVFJZKCIlcCIsIGFyZyk7CisJQ0hFQ0tfUEFSQU1TX0RPKGN0eCAmJiBjdHgtPnJhd19yZWN2ICYmIGN0eC0+cGFyZW50LCBnb3RvIGVycm9yKTsKKwljbnggPSBjdHgtPnBhcmVudDsKKwlBU1NFUlQoIGZkX2NueF90YXJnZXRfcXVldWUoY254KSApOworCQorCS8qIFNldCB0aGUgdGhyZWFkIG5hbWUgKi8KKwl7CisJCWNoYXIgYnVmWzQ4XTsKKwkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIkRlY2lwaGVyICglaHVAJWQ6JXMpIiwgY3R4LT5zdHJpZCwgY254LT5jY19zb2NrZXQsIGNueC0+Y2NfcmVtaWQpOworCQlmZF9sb2dfdGhyZWFkbmFtZSAoIGJ1ZiApOworCX0KKwkKKwkvKiBUaGUgbmV4dCBmdW5jdGlvbiBsb29wcyB3aGlsZSB0aGVyZSBpcyBubyBlcnJvciAqLworCUNIRUNLX0ZDVF9ETyhmZF90bHNfcmN2dGhyX2NvcmUoY254LCBjdHgtPnN0cmlkID8gY3R4LT5zZXNzaW9uIDogY254LT5jY190bHNfcGFyYS5zZXNzaW9uKSwgLyogY29udGludWUgKi8pOworZXJyb3I6CisJZmRfY254X21hcmtlcnJvcihjbngpOworCVRSQUNFX0RFQlVHKEZVTEwsICJUaHJlYWQgdGVybWluYXRlZCIpOwkKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgIHB1c2ggLyBwdWxsICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgR05VVExTX1ZFUlNJT05fMzAwCisvKiBDaGVjayBpZiBkYXRhIGlzIGF2YWlsYWJsZSBmb3IgZ251dGxzIG9uIGEgZ2l2ZW4gY29udGV4dCAqLworc3RhdGljIGludCBzY3RwMzQzNl9wdWxsX3RpbWVvdXQoZ251dGxzX3RyYW5zcG9ydF9wdHJfdCB0ciwgdW5zaWduZWQgaW50IG1zKQoreworCXN0cnVjdCBzY3RwMzQzNl9jdHggKiBjdHggPSAoc3RydWN0IHNjdHAzNDM2X2N0eCAqKSB0cjsKKwlzdHJ1Y3QgdGltZXNwZWMgdHNzdG9yZSwgKnRzID0gTlVMTDsKKwlpbnQgcmV0OworCQorCVRSQUNFX0VOVFJZKCIlcCAlZCIsIHRyLCBtcyk7CisJCisJaWYgKGN0eC0+cGFydGlhbC5idWYpCisJCXJldHVybiAxOyAvKiBkYXRhIGlzIGFscmVhZHkgYXZhaWxhYmxlIGZvciBwdWxsICovCisJCisJaWYgKG1zKSB7CisJCUNIRUNLX1NZU19ETyggIGNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZ0c3N0b3JlKSwgIHJldHVybiAtMSAgKTsKKwkJdHNzdG9yZS50dl9uc2VjICs9IChsb25nKW1zICogMTAwMDAwMDsKKwkJdHNzdG9yZS50dl9zZWMgKz0gdHNzdG9yZS50dl9uc2VjIC8gMTAwMDAwMDAwMEw7CisJCXRzc3RvcmUudHZfbnNlYyAlPSAxMDAwMDAwMDAwTDsKKwkJdHMgPSAmdHNzdG9yZTsKKwl9CisJCisJcmV0ID0gZmRfZmlmb19zZWxlY3QgKCBjdHgtPnJhd19yZWN2LCB0cyApOworCWlmIChyZXQgPCAwKSB7CisJCWVycm5vID0gLXJldDsKKwkJcmV0ID0gLTE7CisJfQorCQkKKwlyZXR1cm4gcmV0OworfQorI2VuZGlmIC8qIEdOVVRMU19WRVJTSU9OXzMwMCAqLworCisvKiBTZW5kIGRhdGEgb3ZlciB0aGUgY29ubmVjdGlvbiwgY2FsbGVkIGJ5IGdudXRscyAqLworI2lmbmRlZiBHTlVUTFNfVkVSU0lPTl8yMTIKK3N0YXRpYyBzc2l6ZV90IHNjdHAzNDM2X3B1c2goZ251dGxzX3RyYW5zcG9ydF9wdHJfdCB0ciwgY29uc3Qgdm9pZCAqIGRhdGEsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IHNjdHAzNDM2X2N0eCAqIGN0eCA9IChzdHJ1Y3Qgc2N0cDM0MzZfY3R4ICopIHRyOworCXN0cnVjdCBpb3ZlYyBpb3Y7CisJCisJVFJBQ0VfRU5UUlkoIiVwICVwICV6ZCIsIHRyLCBkYXRhLCBsZW4pOworCUNIRUNLX1BBUkFNU19ETyggdHIgJiYgZGF0YSwgeyBlcnJubyA9IEVJTlZBTDsgcmV0dXJuIC0xOyB9ICk7CisJCisJaW92Lmlvdl9iYXNlID0gKHZvaWQgKilkYXRhOworCWlvdi5pb3ZfbGVuICA9IGxlbjsKKwkKKwlyZXR1cm4gZmRfc2N0cF9zZW5kc3RydihjdHgtPnBhcmVudCwgY3R4LT5zdHJpZCwgJmlvdiwgMSk7Cit9CisjZWxzZSAvKiAgR05VVExTX1ZFUlNJT05fMjEyICovCitzdGF0aWMgc3NpemVfdCBzY3RwMzQzNl9wdXNodihnbnV0bHNfdHJhbnNwb3J0X3B0cl90IHRyLCBjb25zdCBnaW92ZWNfdCAqIGlvdiwgaW50IGlvdmNudCkKK3sKKwlzdHJ1Y3Qgc2N0cDM0MzZfY3R4ICogY3R4ID0gKHN0cnVjdCBzY3RwMzQzNl9jdHggKikgdHI7CisJCisJVFJBQ0VfRU5UUlkoIiVwICVwICVkIiwgdHIsIGlvdiwgaW92Y250KTsKKwlDSEVDS19QQVJBTVNfRE8oIHRyICYmIGlvdiwgeyBlcnJubyA9IEVJTlZBTDsgcmV0dXJuIC0xOyB9ICk7CisJCisJcmV0dXJuIGZkX3NjdHBfc2VuZHN0cnYoY3R4LT5wYXJlbnQsIGN0eC0+c3RyaWQsIChjb25zdCBzdHJ1Y3QgaW92ZWMgKilpb3YsIGlvdmNudCk7Cit9CisjZW5kaWYgLyogIEdOVVRMU19WRVJTSU9OXzIxMiAqLworCisvKiBSZXRyaWV2ZSBkYXRhIHJlY2VpdmVkIG9uIGEgc3RyZWFtIGFuZCBhbHJlYWR5IGRlbXVsdGlwbGV4ZWQgKi8KK3N0YXRpYyBzc2l6ZV90IHNjdHAzNDM2X3B1bGwoZ251dGxzX3RyYW5zcG9ydF9wdHJfdCB0ciwgdm9pZCAqIGJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3Qgc2N0cDM0MzZfY3R4ICogY3R4ID0gKHN0cnVjdCBzY3RwMzQzNl9jdHggKikgdHI7CisJc2l6ZV90IHB1bGxlZCA9IDA7CisJaW50IGVtcHRpZWQ7CisJCisJVFJBQ0VfRU5UUlkoIiVwICVwICV6ZCIsIHRyLCBidWYsIGxlbik7CisJQ0hFQ0tfUEFSQU1TX0RPKCB0ciAmJiBidWYsIHsgZXJybm8gPSBFSU5WQUw7IGdvdG8gZXJyb3I7IH0gKTsKKwkKKwkvKiBJZiB3ZSBkb24ndCBoYXZlIGRhdGEgYXZhaWxhYmxlIG5vdywgcHVsbCBuZXcgbWVzc2FnZSBmcm9tIHRoZSBmaWZvIC0tIHRoaXMgaXMgYmxvY2tpbmcgKHVudGlsIHRoZSBxdWV1ZSBpcyBkZXN0cm95ZWQpICovCisJaWYgKCFjdHgtPnBhcnRpYWwuYnVmKSB7CisJCWludCBldjsKKwkJQ0hFQ0tfRkNUX0RPKCBlcnJubyA9IGZkX2V2ZW50X2dldChjdHgtPnJhd19yZWN2LCAmZXYsICZjdHgtPnBhcnRpYWwuYnVmc3osICh2b2lkICopJmN0eC0+cGFydGlhbC5idWYpLCBnb3RvIGVycm9yICk7CisJCWlmIChldiA9PSBGREVWUF9DTlhfRVJST1IpIHsKKwkJCS8qIERvY3VtZW50YXRpb25zIHNheXMgdG8gcmV0dXJuIDAgb24gY29ubmVjdGlvbiBjbG9zZWQsIGJ1dCBpdCBkb2VzIGhhbmcgd2l0aGluIGdudXRsc19oYW5kc2hha2UgKi8KKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKwkJCisJcHVsbGVkID0gY3R4LT5wYXJ0aWFsLmJ1ZnN6IC0gY3R4LT5wYXJ0aWFsLm9mZnNldDsKKwlpZiAocHVsbGVkIDw9IGxlbikgeworCQllbXB0aWVkID0gMTsKKwl9IGVsc2UgeworCQkvKiBsaW1pdCB0byB0aGUgY2FwYWNpdHkgb2YgZGVzdGluYXRpb24gYnVmZmVyICovCisJCWVtcHRpZWQgPSAwOworCQlwdWxsZWQgPSBsZW47CisJfQorCisJLyogU3RvcmUgdGhlIGRhdGEgaW4gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciAqLworCW1lbWNweShidWYsIGN0eC0+cGFydGlhbC5idWYgKyBjdHgtPnBhcnRpYWwub2Zmc2V0LCBwdWxsZWQpOworCisJLyogRnJlZSB0aGUgYnVmZmVyIGlmIHdlIHJlYWQgYWxsIGl0cyBjb250ZW50LCBhbmQgcmVzZXQgdGhlIHBhcnRpYWwgc3RydWN0dXJlICovCisJaWYgKGVtcHRpZWQpIHsKKwkJZnJlZShjdHgtPnBhcnRpYWwuYnVmKTsKKwkJbWVtc2V0KCZjdHgtPnBhcnRpYWwsIDAsIHNpemVvZihjdHgtPnBhcnRpYWwpKTsKKwl9IGVsc2UgeworCQljdHgtPnBhcnRpYWwub2Zmc2V0ICs9IHB1bGxlZDsKKwl9CisKKwkvKiBXZSBhcmUgZG9uZSAqLworCXJldHVybiBwdWxsZWQ7CisJCitlcnJvcjoKKwlnbnV0bHNfdHJhbnNwb3J0X3NldF9lcnJubyAoY3R4LT5zZXNzaW9uLCBlcnJubyk7CisJcmV0dXJuIC0xOworfQorCisvKiBTZXQgdGhlIHBhcmFtZXRlcnMgb2YgYSBzZXNzaW9uIHRvIHVzZSB0aGUgYXBwcm9wcmlhdGUgZmlmbyBhbmQgc3RyZWFtIGluZm9ybWF0aW9uICovCisjaWZuZGVmIEdOVVRMU19WRVJTSU9OXzMwMAorR0NDX0RJQUdfT0ZGKCItV2RlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIikKKyNlbmRpZiAvKiAhR05VVExTX1ZFUlNJT05fMzAwICovCitzdGF0aWMgdm9pZCBzZXRfc2Vzc190cmFuc3BvcnQoZ251dGxzX3Nlc3Npb25fdCBzZXNzaW9uLCBzdHJ1Y3Qgc2N0cDM0MzZfY3R4ICpjdHgpCit7CisJLyogU2V0IHRoZSB0cmFuc3BvcnQgcG9pbnRlciBwYXNzZWQgdG8gcHVzaCAmIHB1bGwgY2FsbGJhY2tzICovCisJR05VVExTX1RSQUNFKCBnbnV0bHNfdHJhbnNwb3J0X3NldF9wdHIoIHNlc3Npb24sIChnbnV0bHNfdHJhbnNwb3J0X3B0cl90KSBjdHggKSApOworCQorCS8qIFJlc2V0IHRoZSBsb3cgd2F0ZXIgdmFsdWUsIHNpbmNlIHdlIGRvbid0IHVzZSBzb2NrZXRzICovCisjaWZuZGVmIEdOVVRMU19WRVJTSU9OXzMwMAorCS8qIHN0YXJ0aW5nIHZlcnNpb24gMi4xMiwgdGhpcyBjYWxsIGlzIG5vdCBuZWVkZWQgKi8KKwlHTlVUTFNfVFJBQ0UoIGdudXRsc190cmFuc3BvcnRfc2V0X2xvd2F0KCBzZXNzaW9uLCAwICkgKTsKKyNlbHNlICAvKiBHTlVUTFNfVkVSU0lPTl8zMDAgKi8KKwkvKiBidXQgaW4gMy4wIHdlIGhhdmUgdG8gcHJvdmlkZSB0aGUgcHVsbF90aW1lb3V0IGNhbGxiYWNrICovCisJR05VVExTX1RSQUNFKCBnbnV0bHNfdHJhbnNwb3J0X3NldF9wdWxsX3RpbWVvdXRfZnVuY3Rpb24oIHNlc3Npb24sIHNjdHAzNDM2X3B1bGxfdGltZW91dCApICk7CisjZW5kaWYgLyogR05VVExTX1ZFUlNJT05fMzAwICovCisJCisJLyogU2V0IHRoZSBwdXNoIGFuZCBwdWxsIGNhbGxiYWNrcyAqLworCUdOVVRMU19UUkFDRSggZ251dGxzX3RyYW5zcG9ydF9zZXRfcHVsbF9mdW5jdGlvbihzZXNzaW9uLCBzY3RwMzQzNl9wdWxsKSApOworI2lmbmRlZiBHTlVUTFNfVkVSU0lPTl8yMTIKKwlHTlVUTFNfVFJBQ0UoIGdudXRsc190cmFuc3BvcnRfc2V0X3B1c2hfZnVuY3Rpb24oc2Vzc2lvbiwgc2N0cDM0MzZfcHVzaCkgKTsKKyNlbHNlIC8qIEdOVVRMU19WRVJTSU9OXzIxMiAqLworCUdOVVRMU19UUkFDRSggZ251dGxzX3RyYW5zcG9ydF9zZXRfdmVjX3B1c2hfZnVuY3Rpb24oc2Vzc2lvbiwgc2N0cDM0MzZfcHVzaHYpICk7CisjZW5kaWYgLyogR05VVExTX1ZFUlNJT05fMjEyICovCisKKwlyZXR1cm47Cit9CisjaWZuZGVmIEdOVVRMU19WRVJTSU9OXzMwMAorR0NDX0RJQUdfT04oIi1XZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMiKQorI2VuZGlmIC8qICFHTlVUTFNfVkVSU0lPTl8zMDAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgIFNlc3Npb24gcmVzdW1pbmcgc3VwcG9ydCAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3Qgc3Jfc3RvcmUgeworCXN0cnVjdCBmZF9saXN0CSBsaXN0OwkvKiBsaXN0IG9mIHNyX2RhdGEsIG9yZGVyZWQgYnkga2V5LnNpemUgdGhlbiBrZXkuZGF0YSAqLworCXB0aHJlYWRfcndsb2NrX3QgbG9jazsKKwlzdHJ1Y3QgY254Y3R4ICAgKnBhcmVudDsKKwkvKiBBZGQgYW5vdGhlciBsaXN0IHRvIGNoYWluIGluIGEgZ2xvYmFsIGxpc3QgdG8gaW1wbGVtZW50IGEgZ2FyYmFnZSBjb2xsZWN0b3Igb24gc2Vzc2lvbnMgLS0gVE9ETyBpZiBuZWVkZWQgKi8KK307CisKKy8qIFNhdmVkIG1hc3RlciBzZXNzaW9uIGRhdGEgZm9yIHJlc3VtaW5nIHNlc3Npb25zICovCitzdHJ1Y3Qgc3JfZGF0YSB7CisJc3RydWN0IGZkX2xpc3QJY2hhaW47CisJZ251dGxzX2RhdHVtX3QJa2V5OworCWdudXRsc19kYXR1bV90IAlkYXRhOworfTsKKworLyogSW5pdGlhbGl6ZSB0aGUgc3RvcmUgYXJlYSBmb3IgYSBjb25uZWN0aW9uICovCitzdGF0aWMgaW50IHN0b3JlX2luaXQoc3RydWN0IGNueGN0eCAqIGNvbm4pCit7CisJVFJBQ0VfRU5UUlkoIiVwIiwgY29ubik7CisJQ0hFQ0tfUEFSQU1TKCBjb25uICYmICFjb25uLT5jY19zY3RwMzQzNl9kYXRhLnNlc3Nfc3RvcmUgKTsKKwkKKwlDSEVDS19NQUxMT0MoIGNvbm4tPmNjX3NjdHAzNDM2X2RhdGEuc2Vzc19zdG9yZSA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHNyX3N0b3JlKSkgKTsKKwltZW1zZXQoY29ubi0+Y2Nfc2N0cDM0MzZfZGF0YS5zZXNzX3N0b3JlLCAwLCBzaXplb2Yoc3RydWN0IHNyX3N0b3JlKSk7CisJCisJZmRfbGlzdF9pbml0KCZjb25uLT5jY19zY3RwMzQzNl9kYXRhLnNlc3Nfc3RvcmUtPmxpc3QsIE5VTEwpOworCUNIRUNLX1BPU0lYKCBwdGhyZWFkX3J3bG9ja19pbml0KCZjb25uLT5jY19zY3RwMzQzNl9kYXRhLnNlc3Nfc3RvcmUtPmxvY2ssIE5VTEwpICk7CisJY29ubi0+Y2Nfc2N0cDM0MzZfZGF0YS5zZXNzX3N0b3JlLT5wYXJlbnQgPSBjb25uOworCQorCXJldHVybiAwOworfQorCisvKiBEZXN0cm95IHRoZSBzdG9yZSBhcmVhIGZvciBhIGNvbm5lY3Rpb24sIGFuZCBhbGwgaXRzIGNvbnRlbnQgKi8KK3N0YXRpYyB2b2lkIHN0b3JlX2Rlc3Ryb3koc3RydWN0IGNueGN0eCAqIGNvbm4pCit7CisJLyogRGVsIGFsbCBsaXN0IGVudHJpZXMgKi8KKwlUUkFDRV9FTlRSWSgiJXAiLCBjb25uKTsKKwlDSEVDS19QQVJBTVNfRE8oIGNvbm4sIHJldHVybiApOworCQorCWlmICghY29ubi0+Y2Nfc2N0cDM0MzZfZGF0YS5zZXNzX3N0b3JlKQorCQlyZXR1cm47CisJCisJQ0hFQ0tfUE9TSVhfRE8oIHB0aHJlYWRfcndsb2NrX2Rlc3Ryb3koJmNvbm4tPmNjX3NjdHAzNDM2X2RhdGEuc2Vzc19zdG9yZS0+bG9jayksIC8qIGNvbnRpbnVlICovICk7CisJCisJd2hpbGUgKCFGRF9JU19MSVNUX0VNUFRZKCZjb25uLT5jY19zY3RwMzQzNl9kYXRhLnNlc3Nfc3RvcmUtPmxpc3QpKSB7CisJCXN0cnVjdCBzcl9kYXRhICogc3IgPSAoc3RydWN0IHNyX2RhdGEgKikgY29ubi0+Y2Nfc2N0cDM0MzZfZGF0YS5zZXNzX3N0b3JlLT5saXN0Lm5leHQ7CisJCWZkX2xpc3RfdW5saW5rKCAmc3ItPmNoYWluICk7CisJCWZyZWUoc3ItPmtleS5kYXRhKTsKKwkJZnJlZShzci0+ZGF0YS5kYXRhKTsKKwkJZnJlZShzcik7CisJfQorCQorCWZyZWUoY29ubi0+Y2Nfc2N0cDM0MzZfZGF0YS5zZXNzX3N0b3JlKTsKKwljb25uLT5jY19zY3RwMzQzNl9kYXRhLnNlc3Nfc3RvcmUgPSBOVUxMOworCXJldHVybjsKK30KKworLyogU2VhcmNoIHRoZSBwb3NpdGlvbiAob3IgbmV4dCBpZiBub3QgZm91bmQpIG9mIGEga2V5IGluIGEgc3RvcmUgKi8KK3N0YXRpYyBzdHJ1Y3QgZmRfbGlzdCAqIGZpbmRfb3JfbmV4dChzdHJ1Y3Qgc3Jfc3RvcmUgKiBzdG8sIGdudXRsc19kYXR1bV90IGtleSwgaW50ICogbWF0Y2gpCit7CisJc3RydWN0IGZkX2xpc3QgKiByZXQ7CisJKm1hdGNoID0gMDsKKwkKKwlmb3IgKHJldCA9IHN0by0+bGlzdC5uZXh0OyByZXQgIT0gJnN0by0+bGlzdDsgcmV0ID0gcmV0LT5uZXh0KSB7CisJCWludCBjbXAgPSAwOworCQlzdHJ1Y3Qgc3JfZGF0YSAqIHNyID0gKHN0cnVjdCBzcl9kYXRhICopcmV0OworCQkKKwkJY21wID0gZmRfb3NfY21wKGtleS5kYXRhLCBrZXkuc2l6ZSwgc3ItPmtleS5kYXRhLCBzci0+a2V5LnNpemUpOworCQlpZiAoY21wID4gMCkKKwkJCWNvbnRpbnVlOworCQkKKwkJaWYgKGNtcCA9PSAwKQorCQkJKm1hdGNoID0gMTsKKwkJCisJCWJyZWFrOworCX0KKwkKKwlyZXR1cm4gcmV0OworfQorCisvKiBDYWxsYmFja3MgZm9yIHRoZSBUTFMgc2VydmVyIHNpZGUgb2YgdGhlIGNvbm5lY3Rpb24sIGNhbGxlZCBkdXJpbmcgZ251dGxzX2hhbmRzaGFrZSAqLworc3RhdGljIGludCBzcl9zdG9yZSAodm9pZCAqZGJmLCBnbnV0bHNfZGF0dW1fdCBrZXksIGdudXRsc19kYXR1bV90IGRhdGEpCit7CisJc3RydWN0IHNyX3N0b3JlICogc3RvID0gKHN0cnVjdCBzcl9zdG9yZSAqKWRiZjsKKwlzdHJ1Y3QgZmRfbGlzdCAqIGxpOworCXN0cnVjdCBzcl9kYXRhICogc3I7CisJaW50IG1hdGNoID0gMDsKKwlpbnQgcmV0ID0gMDsKKwkKKwlUUkFDRV9ERUJVRyggR05VVExTX0RCR19MRVZFTCwgIkdOVVRMUyBDYWxsYmFjazogJXMiLCBfX1BSRVRUWV9GVU5DVElPTl9fICk7CisJQ0hFQ0tfUEFSQU1TX0RPKCBzdG8gJiYga2V5LmRhdGEgJiYgZGF0YS5kYXRhLCByZXR1cm4gLTEgKTsKKwkKKwlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9yd2xvY2tfd3Jsb2NrKCZzdG8tPmxvY2spLCByZXR1cm4gLTEgKTsKKwlUUkFDRV9CVUZGRVIoRkRfTE9HX0RFQlVHLCBHTlVUTFNfREJHX0xFVkVMLCAiU2Vzc2lvbiBzdG9yZSBba2V5ICIsIGtleS5kYXRhLCBrZXkuc2l6ZSwgIl0iKTsKKwkKKwlsaSA9IGZpbmRfb3JfbmV4dChzdG8sIGtleSwgJm1hdGNoKTsKKwlpZiAobWF0Y2gpIHsKKwkJc3IgPSAoc3RydWN0IHNyX2RhdGEgKilsaTsKKwkJCisJCS8qIENoZWNrIHRoZSBkYXRhIGlzIHRoZSBzYW1lICovCisJCWlmICgoZGF0YS5zaXplICE9IHNyLT5kYXRhLnNpemUpIHx8IG1lbWNtcChkYXRhLmRhdGEsIHNyLT5kYXRhLmRhdGEsIGRhdGEuc2l6ZSkpIHsKKwkJCVRSQUNFX0RFQlVHKElORk8sICJHbnVUTFMgdHJpZWQgdG8gc3RvcmUgYSBzZXNzaW9uIHdpdGggc2FtZSBrZXkgYW5kIGRpZmZlcmVudCBkYXRhISIpOworCQkJVFJBQ0VfQlVGRkVSKEZEX0xPR19ERUJVRywgSU5GTywgIlNlc3Npb24gc3RvcmUgW2tleSAiLCBrZXkuZGF0YSwga2V5LnNpemUsICJdIik7CisJCQlUUkFDRV9CVUZGRVIoRkRfTE9HX0RFQlVHLCBJTkZPLCAiICAtLSBvbGQgZGF0YSBbIiwgc3ItPmRhdGEuZGF0YSwgc3ItPmRhdGEuc2l6ZSwgIl0iKTsKKwkJCVRSQUNFX0JVRkZFUihGRF9MT0dfREVCVUcsIElORk8sICIgIC0tIG5ldyBkYXRhIFsiLCBkYXRhLmRhdGEsIGRhdGEuc2l6ZSwgIl0iKTsKKwkJCQorCQkJcmV0ID0gLTE7CisJCX0gZWxzZSB7CisJCQlUUkFDRV9ERUJVRyhHTlVUTFNfREJHX0xFVkVMLCAiR251VExTIHRyaWVkIHRvIHN0b3JlIGEgc2Vzc2lvbiB3aXRoIHNhbWUga2V5IGFuZCBzYW1lIGRhdGEsIHNraXBwZWQuIik7CisJCX0KKwkJZ290byBvdXQ7CisJfQorCQorCS8qIENyZWF0ZSBhIG5ldyBlbnRyeSAqLworCUNIRUNLX01BTExPQ19ETyggc3IgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzcl9kYXRhKSksIHsgcmV0ID0gLTE7IGdvdG8gb3V0OyB9ICk7CisJbWVtc2V0KHNyLCAwLCBzaXplb2Yoc3RydWN0IHNyX2RhdGEpKTsKKworCWZkX2xpc3RfaW5pdCgmc3ItPmNoYWluLCBzcik7CisKKwlDSEVDS19NQUxMT0NfRE8oIHNyLT5rZXkuZGF0YSA9IG1hbGxvYyhrZXkuc2l6ZSksIHsgcmV0ID0gLTE7IGdvdG8gb3V0OyB9ICk7CisJc3ItPmtleS5zaXplID0ga2V5LnNpemU7CisJbWVtY3B5KHNyLT5rZXkuZGF0YSwga2V5LmRhdGEsIGtleS5zaXplKTsKKworCUNIRUNLX01BTExPQ19ETyggc3ItPmRhdGEuZGF0YSA9IG1hbGxvYyhkYXRhLnNpemUpLCB7IHJldCA9IC0xOyBnb3RvIG91dDsgfSApOworCXNyLT5kYXRhLnNpemUgPSBkYXRhLnNpemU7CisJbWVtY3B5KHNyLT5kYXRhLmRhdGEsIGRhdGEuZGF0YSwgZGF0YS5zaXplKTsKKwkKKwkvKiBTYXZlIHRoaXMgbmV3IGVudHJ5IGluIHRoZSBsaXN0LCB3ZSBhcmUgZG9uZSAqLworCWZkX2xpc3RfaW5zZXJ0X2JlZm9yZShsaSwgJnNyLT5jaGFpbik7CisKK291dDoJCisJQ0hFQ0tfUE9TSVhfRE8oIHB0aHJlYWRfcndsb2NrX3VubG9jaygmc3RvLT5sb2NrKSwgcmV0dXJuIC0xICk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzcl9yZW1vdmUgKHZvaWQgKmRiZiwgZ251dGxzX2RhdHVtX3Qga2V5KQoreworCXN0cnVjdCBzcl9zdG9yZSAqIHN0byA9IChzdHJ1Y3Qgc3Jfc3RvcmUgKilkYmY7CisJc3RydWN0IGZkX2xpc3QgKiBsaTsKKwlzdHJ1Y3Qgc3JfZGF0YSAqIHNyOworCWludCBtYXRjaCA9IDA7CisJaW50IHJldCA9IDA7CisJCisJVFJBQ0VfREVCVUcoIEdOVVRMU19EQkdfTEVWRUwsICJHTlVUTFMgQ2FsbGJhY2s6ICVzIiwgX19QUkVUVFlfRlVOQ1RJT05fXyApOworCUNIRUNLX1BBUkFNU19ETyggc3RvICYmIGtleS5kYXRhLCByZXR1cm4gLTEgKTsKKwkKKwlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9yd2xvY2tfd3Jsb2NrKCZzdG8tPmxvY2spLCByZXR1cm4gLTEgKTsKKwlUUkFDRV9CVUZGRVIoRkRfTE9HX0RFQlVHLCBHTlVUTFNfREJHX0xFVkVMLCAiU2Vzc2lvbiBkZWxldGUgW2tleSAiLCBrZXkuZGF0YSwga2V5LnNpemUsICJdIik7CisJCisJbGkgPSBmaW5kX29yX25leHQoc3RvLCBrZXksICZtYXRjaCk7CisJaWYgKG1hdGNoKSB7CisJCXNyID0gKHN0cnVjdCBzcl9kYXRhICopbGk7CisJCQorCQkvKiBEZXN0cm95IHRoaXMgZGF0YSAqLworCQlmZF9saXN0X3VubGluayhsaSk7CisJCWZyZWUoc3ItPmtleS5kYXRhKTsKKwkJZnJlZShzci0+ZGF0YS5kYXRhKTsKKwkJZnJlZShzcik7CisJfSBlbHNlIHsKKwkJLyogSXQgd2FzIG5vdCBmb3VuZCAqLworCQlyZXQgPSAtMTsKKwl9CisJCisJQ0hFQ0tfUE9TSVhfRE8oIHB0aHJlYWRfcndsb2NrX3VubG9jaygmc3RvLT5sb2NrKSwgcmV0dXJuIC0xICk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdudXRsc19kYXR1bV90IHNyX2ZldGNoICh2b2lkICpkYmYsIGdudXRsc19kYXR1bV90IGtleSkKK3sKKwlzdHJ1Y3Qgc3Jfc3RvcmUgKiBzdG8gPSAoc3RydWN0IHNyX3N0b3JlICopZGJmOworCXN0cnVjdCBmZF9saXN0ICogbGk7CisJc3RydWN0IHNyX2RhdGEgKiBzcjsKKwlpbnQgbWF0Y2ggPSAwOworCWdudXRsc19kYXR1bV90IHJlcyA9IHsgTlVMTCwgMCB9OworCWdudXRsc19kYXR1bV90IGVycm9yID0geyBOVUxMLCAwIH07CisKKwlUUkFDRV9ERUJVRyggR05VVExTX0RCR19MRVZFTCwgIkdOVVRMUyBDYWxsYmFjazogJXMiLCBfX1BSRVRUWV9GVU5DVElPTl9fICk7CisJQ0hFQ0tfUEFSQU1TX0RPKCBzdG8gJiYga2V5LmRhdGEsIHJldHVybiBlcnJvciApOworCisJQ0hFQ0tfUE9TSVhfRE8oIHB0aHJlYWRfcndsb2NrX3JkbG9jaygmc3RvLT5sb2NrKSwgcmV0dXJuIGVycm9yICk7CisJVFJBQ0VfQlVGRkVSKEZEX0xPR19ERUJVRywgR05VVExTX0RCR19MRVZFTCwgIlNlc3Npb24gZmV0Y2ggW2tleSAiLCBrZXkuZGF0YSwga2V5LnNpemUsICJdIik7CisJCisJbGkgPSBmaW5kX29yX25leHQoc3RvLCBrZXksICZtYXRjaCk7CisJaWYgKG1hdGNoKSB7CisJCXNyID0gKHN0cnVjdCBzcl9kYXRhICopbGk7CisJCUdOVVRMU19UUkFDRSggQ0hFQ0tfTUFMTE9DX0RPKHJlcy5kYXRhID0gZ251dGxzX21hbGxvYyhzci0+ZGF0YS5zaXplKSwgZ290byBvdXQgKSApOworCQlyZXMuc2l6ZSA9IHNyLT5kYXRhLnNpemU7CisJCW1lbWNweShyZXMuZGF0YSwgc3ItPmRhdGEuZGF0YSwgcmVzLnNpemUpOworCX0KK291dDoJCisJVFJBQ0VfREVCVUcoR05VVExTX0RCR19MRVZFTCwgIkZldGNoZWQgKCVwLCAlZCkgZnJvbSBzdG9yZSAlcCIsIHJlcy5kYXRhLCByZXMuc2l6ZSwgc3RvKTsKKwlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9yd2xvY2tfdW5sb2NrKCZzdG8tPmxvY2spLCByZXR1cm4gZXJyb3IpOworCXJldHVybiByZXM7Cit9CisKKy8qIFNldCB0aGUgc2Vzc2lvbiBwb2ludGVyIGluIGEgc2Vzc2lvbiBvYmplY3QgKi8KK3N0YXRpYyB2b2lkIHNldF9yZXN1bWVfY2FsbGJhY2tzKGdudXRsc19zZXNzaW9uX3Qgc2Vzc2lvbiwgc3RydWN0IGNueGN0eCAqIGNvbm4pCit7CisJVFJBQ0VfRU5UUlkoIiVwIiwgY29ubik7CisJCisJR05VVExTX1RSQUNFKCBnbnV0bHNfZGJfc2V0X3JldHJpZXZlX2Z1bmN0aW9uKHNlc3Npb24sIHNyX2ZldGNoKSk7CisJR05VVExTX1RSQUNFKCBnbnV0bHNfZGJfc2V0X3JlbW92ZV9mdW5jdGlvbiAgKHNlc3Npb24sIHNyX3JlbW92ZSkpOworCUdOVVRMU19UUkFDRSggZ251dGxzX2RiX3NldF9zdG9yZV9mdW5jdGlvbiAgIChzZXNzaW9uLCBzcl9zdG9yZSkpOworCUdOVVRMU19UUkFDRSggZ251dGxzX2RiX3NldF9wdHIgICAgICAgICAgICAgIChzZXNzaW9uLCBjb25uLT5jY19zY3RwMzQzNl9kYXRhLnNlc3Nfc3RvcmUpKTsKKwkKKwlyZXR1cm47Cit9CisKKy8qIFRoZSBoYW5kc2hha2UgaXMgbWFkZSBpbiBwYXJhbGxlbCBpbiBzZXZlcmFsIHRocmVhZHMgdG8gc3BlZWQgdXAgKi8KK3N0YXRpYyB2b2lkICogaGFuZHNoYWtlX3Jlc3VtZV90aCh2b2lkICogYXJnKQoreworCXN0cnVjdCBzY3RwMzQzNl9jdHggKiBjdHggPSAoc3RydWN0IHNjdHAzNDM2X2N0eCAqKSBhcmc7CisJaW50IHJlc3VtZWQ7CisJCisJVFJBQ0VfRU5UUlkoIiVwIiwgYXJnKTsKKwkKKwkvKiBTZXQgdGhlIHRocmVhZCBuYW1lICovCisJeworCQljaGFyIGJ1Zls0OF07CisJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJIYW5kc2hha2UgcmVzdW1lICglaHVAJWQpIiwgY3R4LT5zdHJpZCwgY3R4LT5wYXJlbnQtPmNjX3NvY2tldCk7CisJCWZkX2xvZ190aHJlYWRuYW1lICggYnVmICk7CisJfQorCQorCVRSQUNFX0RFQlVHKEZVTEwsICJTdGFydGluZyBUTFMgcmVzdW1lZCBoYW5kc2hha2Ugb24gc3RyZWFtICVodSIsIGN0eC0+c3RyaWQpOworCisJQ0hFQ0tfR05VVExTX0RPKCBnbnV0bHNfaGFuZHNoYWtlKCBjdHgtPnNlc3Npb24gKSwgcmV0dXJuIE5VTEwpOworCQkJCisJR05VVExTX1RSQUNFKCByZXN1bWVkID0gZ251dGxzX3Nlc3Npb25faXNfcmVzdW1lZChjdHgtPnNlc3Npb24pICk7CisJI2lmbmRlZiBHTlVUTFNfVkVSU0lPTl8zMDAKKwlpZiAoIXJlc3VtZWQpIHsKKwkJLyogQ2hlY2sgdGhlIGNyZWRlbnRpYWxzIGhlcmUgYWxzbyAqLworCQlDSEVDS19GQ1RfRE8oIGZkX3Rsc192ZXJpZnlfY3JlZGVudGlhbHMoY3R4LT5zZXNzaW9uLCBjdHgtPnBhcmVudCwgMCksIHJldHVybiBOVUxMICk7CisJfQorCSNlbmRpZiAvKiBHTlVUTFNfVkVSU0lPTl8zMDAgKi8KKwlpZiAoVFJBQ0VfQk9PTChGVUxMKSkgeworCQlpZiAocmVzdW1lZCkgeworCQkJZmRfbG9nX2RlYnVnKCJTZXNzaW9uIHdhcyByZXN1bWVkIHN1Y2Nlc3NmdWxseSBvbiBzdHJlYW0gJWh1IChjb25uOiAnJXMnKSIsIGN0eC0+c3RyaWQsIGZkX2NueF9nZXRpZChjdHgtPnBhcmVudCkpOworCQl9IGVsc2UgeworCQkJZmRfbG9nX2RlYnVnKCJTZXNzaW9uIHdhcyBOT1QgcmVzdW1lZCBvbiBzdHJlYW0gJWh1ICAoZnVsbCBoYW5kc2hha2UpIChjb25uOiAnJXMnKSIsIGN0eC0+c3RyaWQsIGZkX2NueF9nZXRpZChjdHgtPnBhcmVudCkpOworCQl9CisJfQorCQkJCisJLyogRmluaXNoZWQsIE9LICovCisJcmV0dXJuIGFyZzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgRXhwb3J0ZWQgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEluaXRpYWxpemUgdGhlIHdyYXBwZXIgZm9yIHRoZSBjb25uZWN0aW9uICovCitpbnQgZmRfc2N0cDM0MzZfaW5pdChzdHJ1Y3QgY254Y3R4ICogY29ubikKK3sKKwl1aW50MTZfdCBpOworCQorCVRSQUNFX0VOVFJZKCIlcCIsIGNvbm4pOworCUNIRUNLX1BBUkFNUyggY29ubiAmJiAoY29ubi0+Y2Nfc2N0cF9wYXJhLnBhaXJzID4gMSkgJiYgKCFjb25uLT5jY19zY3RwMzQzNl9kYXRhLmFycmF5KSApOworCQorCS8qIEZpcnN0LCBhbGxvYyB0aGUgYXJyYXkgYW5kIGluaXRpYWxpemUgdGhlIG5vbi1UTFMgZGF0YSAqLworCUNIRUNLX01BTExPQyggY29ubi0+Y2Nfc2N0cDM0MzZfZGF0YS5hcnJheSA9IGNhbGxvYyhjb25uLT5jY19zY3RwX3BhcmEucGFpcnMsIHNpemVvZihzdHJ1Y3Qgc2N0cDM0MzZfY3R4KSkgICk7CisJZm9yIChpID0gMDsgaSA8IGNvbm4tPmNjX3NjdHBfcGFyYS5wYWlyczsgaSsrKSB7CisJCWNvbm4tPmNjX3NjdHAzNDM2X2RhdGEuYXJyYXlbaV0ucGFyZW50ID0gY29ubjsKKwkJY29ubi0+Y2Nfc2N0cDM0MzZfZGF0YS5hcnJheVtpXS5zdHJpZCAgPSBpOworCQlDSEVDS19GQ1QoIGZkX2ZpZm9fbmV3KCZjb25uLT5jY19zY3RwMzQzNl9kYXRhLmFycmF5W2ldLnJhd19yZWN2LCAxMCkgKTsKKwl9CisJCisJLyogU2V0IHB1c2gvcHVsbCBmdW5jdGlvbnMgaW4gdGhlIG1hc3RlciBzZXNzaW9uLCB1c2luZyBmaWZvIGluIGFycmF5WzBdICovCisJc2V0X3Nlc3NfdHJhbnNwb3J0KGNvbm4tPmNjX3Rsc19wYXJhLnNlc3Npb24sICZjb25uLT5jY19zY3RwMzQzNl9kYXRhLmFycmF5WzBdKTsKKwkKKwkvKiBGb3Igc2VydmVyIHNpZGUsIHdlIGFsc28gaW5pdGlhbGl6ZSB0aGUgcmVzdW1pbmcgY2FwYWJpbGl0aWVzICovCisJaWYgKGNvbm4tPmNjX3Rsc19wYXJhLm1vZGUgPT0gR05VVExTX1NFUlZFUikgeworCQkKKwkJLyogUHJlcGFyZSB0aGUgc3RvcmUgZm9yIHNlc3Npb25zIGRhdGEgKi8KKwkJQ0hFQ0tfRkNUKCBzdG9yZV9pbml0KGNvbm4pICk7CisJCQorCQkvKiBTZXQgdGhlIGNhbGxiYWNrcyBmb3IgcmVzdW1pbmcgaW4gdGhlIG1hc3RlciBzZXNzaW9uICovCisJCXNldF9yZXN1bWVfY2FsbGJhY2tzKGNvbm4tPmNjX3Rsc19wYXJhLnNlc3Npb24sIGNvbm4pOworCX0KKworCS8qIFN0YXJ0IHRoZSBkZW11eCB0aHJlYWQgKi8KKwlDSEVDS19QT1NJWCggcHRocmVhZF9jcmVhdGUoICZjb25uLT5jY19yY3Z0aHIsIE5VTEwsIGRlbXV4ZXIsIGNvbm4gKSApOworCQorCXJldHVybiAwOworfQorCisvKiBIYW5kc2hha2Ugb3RoZXIgc3RyZWFtcywgYWZ0ZXIgZnVsbCBoYW5kc2hha2Ugb24gdGhlIG1hc3RlciBzZXNzaW9uICovCitpbnQgZmRfc2N0cDM0MzZfaGFuZHNoYWtlX290aGVycyhzdHJ1Y3QgY254Y3R4ICogY29ubiwgY2hhciAqIHByaW9yaXR5LCB2b2lkICogYWx0X2NyZWRzKQoreworCXVpbnQxNl90IGk7CisJaW50IGVycm9ycyA9IDA7CisJZ251dGxzX2RhdHVtX3QgCW1hc3Rlcl9kYXRhOworCQorCVRSQUNFX0VOVFJZKCIlcCAlcCIsIGNvbm4sIHByaW9yaXR5KTsKKwlDSEVDS19QQVJBTVMoIGNvbm4gJiYgKGNvbm4tPmNjX3NjdHBfcGFyYS5wYWlycyA+IDEpICYmIGNvbm4tPmNjX3NjdHAzNDM2X2RhdGEuYXJyYXkgKTsKKworCS8qIFNlcnZlciBzaWRlOiB3ZSBzZXQgYWxsIHRoZSBwYXJhbWV0ZXJzLCB0aGUgcmVzdW1lIGNhbGxiYWNrIHdpbGwgdGFrZSBjYXJlIG9mIHJlc3VtaW5nIHRoZSBzZXNzaW9uICovCisJLyogQ2xpZW50IHNpZGU6IHdlIGR1cGxpY2F0ZSB0aGUgcGFyYW1ldGVycyBvZiB0aGUgbWFzdGVyIHNlc3Npb24sIHRoZW4gc2V0IHRoZSB0cmFuc3BvcnQgcG9pbnRlciAqLworCQorCS8qIEZvciBjbGllbnQgc2lkZSwgcmV0cmlldmUgdGhlIG1hc3RlciBzZXNzaW9uIHBhcmFtZXRlcnMgKi8KKwlpZiAoY29ubi0+Y2NfdGxzX3BhcmEubW9kZSA9PSBHTlVUTFNfQ0xJRU5UKSB7CisJCUNIRUNLX0dOVVRMU19ETyggZ251dGxzX3Nlc3Npb25fZ2V0X2RhdGEyKGNvbm4tPmNjX3Rsc19wYXJhLnNlc3Npb24sICZtYXN0ZXJfZGF0YSksIHJldHVybiBFTk9NRU0gKTsKKwkJLyogRm9yIGRlYnVnOiAqLworCQlpZiAoVFJBQ0VfQk9PTChHTlVUTFNfREJHX0xFVkVMKSkgeworCQkJdWludDhfdCAgaWRbMjU2XTsKKwkJCXNpemVfdAkgaWRzID0gc2l6ZW9mKGlkKTsKKwkJCUNIRUNLX0dOVVRMU19ETyggZ251dGxzX3Nlc3Npb25fZ2V0X2lkKGNvbm4tPmNjX3Rsc19wYXJhLnNlc3Npb24sIGlkLCAmaWRzKSwgLyogY29udGludWUgKi8gKTsKKwkJCVRSQUNFX0JVRkZFUihGRF9MT0dfREVCVUcsIEdOVVRMU19EQkdfTEVWRUwsICJNYXN0ZXIgc2Vzc2lvbiBpZDogWyIsIGlkLCBpZHMsICJdIik7CisJCX0KKwl9CisJCisJLyogSW5pdGlhbGl6ZSB0aGUgc2Vzc2lvbiBvYmplY3RzIGFuZCBzdGFydCB0aGUgaGFuZHNoYWtlIGluIGEgc2VwYXJhdGUgdGhyZWFkICovCisJZm9yIChpID0gMTsgaSA8IGNvbm4tPmNjX3NjdHBfcGFyYS5wYWlyczsgaSsrKSB7CisJCS8qIFNldCBjcmVkZW50aWFscyBhbmQgcHJpb3JpdHkgKi8KKwkJQ0hFQ0tfRkNUKCBmZF90bHNfcHJlcGFyZSgmY29ubi0+Y2Nfc2N0cDM0MzZfZGF0YS5hcnJheVtpXS5zZXNzaW9uLCBjb25uLT5jY190bHNfcGFyYS5tb2RlLCAwLCBwcmlvcml0eSwgYWx0X2NyZWRzKSApOworCQkKKwkJLyogYWRkaXRpb25hbCBpbml0aWFsaXphdGlvbiBmb3IgZ251dGxzIDMueCAqLworCQkjaWZkZWYgR05VVExTX1ZFUlNJT05fMzAwCisJCQkvKiB0aGUgdmVyaWZ5IGZ1bmN0aW9uIGhhcyBhbHJlYWR5IGJlZW4gc2V0IGluIHRoZSBnbG9iYWwgaW5pdGlhbGl6YXRpb24gaW4gY29uZmlnLmMgKi8KKworCQkvKiBmZF90bHNfdmVyaWZ5X2NyZWRlbnRpYWxzXzIgdXNlcyB0aGUgY29ubmVjdGlvbiAqLworCQlnbnV0bHNfc2Vzc2lvbl9zZXRfcHRyIChjb25uLT5jY19zY3RwMzQzNl9kYXRhLmFycmF5W2ldLnNlc3Npb24sICh2b2lkICopIGNvbm4pOworCisJCWlmICgoY29ubi0+Y2NfdGxzX3BhcmEuY24gIT0gTlVMTCkgJiYgKGNvbm4tPmNjX3Rsc19wYXJhLm1vZGUgPT0gR05VVExTX0NMSUVOVCkpIHsKKwkJCS8qIHRoaXMgbWlnaHQgYWxsb3cgdmlydHVhbCBob3N0aW5nIG9uIHRoZSByZW1vdGUgcGVlciAqLworCQkJQ0hFQ0tfR05VVExTX0RPKCBnbnV0bHNfc2VydmVyX25hbWVfc2V0IChjb25uLT5jY19zY3RwMzQzNl9kYXRhLmFycmF5W2ldLnNlc3Npb24sIEdOVVRMU19OQU1FX0ROUywgY29ubi0+Y2NfdGxzX3BhcmEuY24sIHN0cmxlbihjb25uLT5jY190bHNfcGFyYS5jbikpLCAvKiBpZ25vcmUgZmFpbHVyZSAqLyk7CisJCX0KKworCQkjZW5kaWYgLyogR05VVExTX1ZFUlNJT05fMzAwICovCisKKwkJI2lmZGVmIEdOVVRMU19WRVJTSU9OXzMxMAorCQlHTlVUTFNfVFJBQ0UoIGdudXRsc19oYW5kc2hha2Vfc2V0X3RpbWVvdXQoIGNvbm4tPmNjX3NjdHAzNDM2X2RhdGEuYXJyYXlbaV0uc2Vzc2lvbiwgR05VVExTX0RFRkFVTFRfSEFORFNIQUtFX1RJTUVPVVQpKTsKKwkJI2VuZGlmIC8qIEdOVVRMU19WRVJTSU9OXzMxMCAqLworCisJCS8qIEZvciB0aGUgY2xpZW50LCBjb3B5IGRhdGEgZnJvbSBtYXN0ZXIgc2Vzc2lvbjsgZm9yIHRoZSBzZXJ2ZXIsIHNldCBzZXNzaW9uIHJlc3VtaW5nIHBvaW50ZXJzICovCisJCWlmIChjb25uLT5jY190bHNfcGFyYS5tb2RlID09IEdOVVRMU19DTElFTlQpIHsKKwkJCUNIRUNLX0dOVVRMU19ETyggZ251dGxzX3Nlc3Npb25fc2V0X2RhdGEoY29ubi0+Y2Nfc2N0cDM0MzZfZGF0YS5hcnJheVtpXS5zZXNzaW9uLCBtYXN0ZXJfZGF0YS5kYXRhLCBtYXN0ZXJfZGF0YS5zaXplKSwgcmV0dXJuIEVOT01FTSApOworCQl9IGVsc2UgeworCQkJc2V0X3Jlc3VtZV9jYWxsYmFja3MoY29ubi0+Y2Nfc2N0cDM0MzZfZGF0YS5hcnJheVtpXS5zZXNzaW9uLCBjb25uKTsKKwkJfQorCQkKKwkJLyogU2V0IHRyYW5zcG9ydCBwYXJhbWV0ZXJzICovCisJCXNldF9zZXNzX3RyYW5zcG9ydChjb25uLT5jY19zY3RwMzQzNl9kYXRhLmFycmF5W2ldLnNlc3Npb24sICZjb25uLT5jY19zY3RwMzQzNl9kYXRhLmFycmF5W2ldKTsKKwkJCisJCS8qIFN0YXJ0IHRoZSBoYW5kc2hha2UgdGhyZWFkICovCisJCUNIRUNLX1BPU0lYKCBwdGhyZWFkX2NyZWF0ZSggJmNvbm4tPmNjX3NjdHAzNDM2X2RhdGEuYXJyYXlbaV0udGhyLCBOVUxMLCBoYW5kc2hha2VfcmVzdW1lX3RoLCAmY29ubi0+Y2Nfc2N0cDM0MzZfZGF0YS5hcnJheVtpXSApICk7CisJfQorCQorCS8qIFdlIGNhbiBub3cgcmVsZWFzZSB0aGUgbWVtb3J5IG9mIG1hc3RlciBzZXNzaW9uIGRhdGEgaWYgYW55ICovCisJaWYgKGNvbm4tPmNjX3Rsc19wYXJhLm1vZGUgPT0gR05VVExTX0NMSUVOVCkgeworCQlHTlVUTFNfVFJBQ0UoIGdudXRsc19mcmVlKG1hc3Rlcl9kYXRhLmRhdGEpICk7CisJfQorCQorCS8qIE5vdyB3YWl0IGZvciBhbGwgaGFuZHNoYWtlcyB0byBmaW5pc2ggKi8KKwlmb3IgKGkgPSAxOyBpIDwgY29ubi0+Y2Nfc2N0cF9wYXJhLnBhaXJzOyBpKyspIHsKKwkJdm9pZCAqIHJldDsKKwkJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfam9pbihjb25uLT5jY19zY3RwMzQzNl9kYXRhLmFycmF5W2ldLnRociwgJnJldCkgKTsKKwkJY29ubi0+Y2Nfc2N0cDM0MzZfZGF0YS5hcnJheVtpXS50aHIgPSAocHRocmVhZF90KSBOVUxMOworCQlpZiAocmV0ID09IE5VTEwpIHsKKwkJCWVycm9ycysrOyAvKiBIYW5kc2hha2UgZmFpbGVkIG9uIHRoaXMgc3RyZWFtICovCisJCX0KKwl9CisJCisJaWYgKGVycm9ycykgeworCQlUUkFDRV9ERUJVRyhJTkZPLCAiSGFuZHNoYWtlIGZhaWxlZCBvbiAlZC8laGQgc3RyZWFtIHBhaXJzIiwgZXJyb3JzLCBjb25uLT5jY19zY3RwX3BhcmEucGFpcnMpOworCQlmZF9jbnhfbWFya2Vycm9yKGNvbm4pOworCQlyZXR1cm4gRU5PVENPTk47CisJfQorCQorCXJldHVybiAwOworfQorCisvKiBSZWNlaXZlIG1lc3NhZ2VzIGZyb20gb3RoZXJzID8gYWxsIG90aGVyIHN0cmVhbSBwYWlycyA6IHRoZSBtYXN0ZXIgcGFpciAqLworaW50IGZkX3NjdHAzNDM2X3N0YXJ0dGhyZWFkcyhzdHJ1Y3QgY254Y3R4ICogY29ubiwgaW50IG90aGVycykKK3sKKwl1aW50MTZfdCBpOworCQorCVRSQUNFX0VOVFJZKCIlcCIsIGNvbm4pOworCUNIRUNLX1BBUkFNUyggY29ubiAmJiBjb25uLT5jY19zY3RwMzQzNl9kYXRhLmFycmF5ICk7CisJCisJaWYgKG90aGVycykgeworCQlmb3IgKGkgPSAxOyBpIDwgY29ubi0+Y2Nfc2N0cF9wYXJhLnBhaXJzOyBpKyspIHsKKworCQkJLyogU3RhcnQgdGhlIGRlY2lwaGVyIHRocmVhZCAqLworCQkJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfY3JlYXRlKCAmY29ubi0+Y2Nfc2N0cDM0MzZfZGF0YS5hcnJheVtpXS50aHIsIE5VTEwsIGRlY2lwaGVyLCAmY29ubi0+Y2Nfc2N0cDM0MzZfZGF0YS5hcnJheVtpXSApICk7CisJCX0KKwl9IGVsc2UgeworCQlDSEVDS19QT1NJWCggcHRocmVhZF9jcmVhdGUoICZjb25uLT5jY19zY3RwMzQzNl9kYXRhLmFycmF5WzBdLnRociwgTlVMTCwgZGVjaXBoZXIsICZjb25uLT5jY19zY3RwMzQzNl9kYXRhLmFycmF5WzBdICkgKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIEluaXRpYXRlIGEgImJ5ZSIgb24gYWxsIHN0cmVhbSBwYWlycyAqLwordm9pZCBmZF9zY3RwMzQzNl9ieWUoc3RydWN0IGNueGN0eCAqIGNvbm4pCit7CisJdWludDE2X3QgaTsKKwkKKwlDSEVDS19QQVJBTVNfRE8oIGNvbm4gJiYgY29ubi0+Y2Nfc2N0cDM0MzZfZGF0YS5hcnJheSwgcmV0dXJuICk7CisJCisJLyogRW5kIGFsbCBUTFMgc2Vzc2lvbnMsIGluIHNlcmllcyAobm90IGFzIGVmZmljaWVudCBhcyBwYXJhbGVsLCBidXQgc2ltcGxlcikgKi8KKwlmb3IgKGkgPSAxOyBpIDwgY29ubi0+Y2Nfc2N0cF9wYXJhLnBhaXJzOyBpKyspIHsKKwkJaWYgKCAhIGZkX2NueF90ZXN0c3RhdGUoY29ubiwgQ0NfU1RBVFVTX0VSUk9SKSkgeworCQkJQ0hFQ0tfR05VVExTX0RPKCBnbnV0bHNfYnllKGNvbm4tPmNjX3NjdHAzNDM2X2RhdGEuYXJyYXlbaV0uc2Vzc2lvbiwgR05VVExTX1NIVVRfV1IpLCBmZF9jbnhfbWFya2Vycm9yKGNvbm4pICk7CisJCX0KKwl9Cit9CisKKy8qIEFmdGVyICJieWUiIHdhcyBzZW50IG9uIGFsbCBzdHJlYW1zLCByZWFkIGZyb20gc2Vzc2lvbnMgdW50aWwgYW4gZXJyb3IgaXMgcmVjZWl2ZWQgKi8KK3ZvaWQgZmRfc2N0cDM0MzZfd2FpdHRocmVhZHN0ZXJtKHN0cnVjdCBjbnhjdHggKiBjb25uKQoreworCXVpbnQxNl90IGk7CisJCisJVFJBQ0VfRU5UUlkoIiVwIiwgY29ubik7CisJQ0hFQ0tfUEFSQU1TX0RPKCBjb25uICYmIGNvbm4tPmNjX3NjdHAzNDM2X2RhdGEuYXJyYXksIHJldHVybiApOworCQorCWZvciAoaSA9IDA7IGkgPCBjb25uLT5jY19zY3RwX3BhcmEucGFpcnM7IGkrKykgeworCQlpZiAoY29ubi0+Y2Nfc2N0cDM0MzZfZGF0YS5hcnJheVtpXS50aHIgIT0gKHB0aHJlYWRfdClOVUxMKSB7CisJCQlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9qb2luKGNvbm4tPmNjX3NjdHAzNDM2X2RhdGEuYXJyYXlbaV0udGhyLCBOVUxMKSwgLyogY29udGludWUgKi8gKTsKKwkJCWNvbm4tPmNjX3NjdHAzNDM2X2RhdGEuYXJyYXlbaV0udGhyID0gKHB0aHJlYWRfdClOVUxMOworCQl9CisJfQorCXJldHVybjsKK30KKworLyogRnJlZSBnbnV0bHMgcmVzb3VyY2VzIG9mIGFsbCBzZXNzaW9ucyAqLwordm9pZCBmZF9zY3RwMzQzNl9nbnV0bHNfZGVpbml0X290aGVycyhzdHJ1Y3QgY254Y3R4ICogY29ubikKK3sKKwl1aW50MTZfdCBpOworCQorCVRSQUNFX0VOVFJZKCIlcCIsIGNvbm4pOworCUNIRUNLX1BBUkFNU19ETyggY29ubiAmJiBjb25uLT5jY19zY3RwMzQzNl9kYXRhLmFycmF5LCByZXR1cm4gKTsKKwkKKwlmb3IgKGkgPSAxOyBpIDwgY29ubi0+Y2Nfc2N0cF9wYXJhLnBhaXJzOyBpKyspIHsKKwkJaWYgKGNvbm4tPmNjX3NjdHAzNDM2X2RhdGEuYXJyYXlbaV0uc2Vzc2lvbikgeworCQkJR05VVExTX1RSQUNFKCBnbnV0bHNfZGVpbml0KGNvbm4tPmNjX3NjdHAzNDM2X2RhdGEuYXJyYXlbaV0uc2Vzc2lvbikgKTsKKwkJCWNvbm4tPmNjX3NjdHAzNDM2X2RhdGEuYXJyYXlbaV0uc2Vzc2lvbiA9IE5VTEw7CisJCX0KKwl9Cit9CisKKworLyogU3RvcCBhbGwgcmVjZWl2ZXIgdGhyZWFkcyAqLwordm9pZCBmZF9zY3RwMzQzNl9zdG9wdGhyZWFkcyhzdHJ1Y3QgY254Y3R4ICogY29ubikKK3sKKwl1aW50MTZfdCBpOworCQorCVRSQUNFX0VOVFJZKCIlcCIsIGNvbm4pOworCUNIRUNLX1BBUkFNU19ETyggY29ubiAmJiBjb25uLT5jY19zY3RwMzQzNl9kYXRhLmFycmF5LCByZXR1cm4gKTsKKwkKKwlmb3IgKGkgPSAwOyBpIDwgY29ubi0+Y2Nfc2N0cF9wYXJhLnBhaXJzOyBpKyspIHsKKwkJQ0hFQ0tfRkNUX0RPKCBmZF90aHJfdGVybSgmY29ubi0+Y2Nfc2N0cDM0MzZfZGF0YS5hcnJheVtpXS50aHIpLCAvKiBjb250aW51ZSAqLyApOworCX0KKwlyZXR1cm47Cit9CisKKy8qIERlc3Ryb3kgYSB3cmFwcGVyIGNvbnRleHQgKi8KK3ZvaWQgZmRfc2N0cDM0MzZfZGVzdHJveShzdHJ1Y3QgY254Y3R4ICogY29ubikKK3sKKwl1aW50MTZfdCBpOworCQorCUNIRUNLX1BBUkFNU19ETyggY29ubiAmJiBjb25uLT5jY19zY3RwMzQzNl9kYXRhLmFycmF5LCByZXR1cm4gKTsKKwkKKwkvKiBUZXJtaW5hdGUgYWxsIHJlY2VpdmluZyB0aHJlYWRzIGluIGNhc2Ugd2UgZGlkIG5vdCBkbyBpdCB5ZXQgKi8KKwlmZF9zY3RwMzQzNl9zdG9wdGhyZWFkcyhjb25uKTsKKwkKKwkvKiBOb3csIHN0b3AgdGhlIGRlbXV4IHRocmVhZCAqLworCUNIRUNLX0ZDVF9ETyggZmRfdGhyX3Rlcm0oJmNvbm4tPmNjX3JjdnRociksIC8qIGNvbnRpbnVlICovICk7CisJCisJLyogRnJlZSByZW1haW5pbmcgZGF0YSBpbiB0aGUgYXJyYXkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY29ubi0+Y2Nfc2N0cF9wYXJhLnBhaXJzOyBpKyspIHsKKwkJaWYgKGNvbm4tPmNjX3NjdHAzNDM2X2RhdGEuYXJyYXlbaV0ucmF3X3JlY3YpCisJCQlmZF9ldmVudF9kZXN0cm95KCAmY29ubi0+Y2Nfc2N0cDM0MzZfZGF0YS5hcnJheVtpXS5yYXdfcmVjdiwgZnJlZSApOworCQlmcmVlKGNvbm4tPmNjX3NjdHAzNDM2X2RhdGEuYXJyYXlbaV0ucGFydGlhbC5idWYpOworCQlpZiAoY29ubi0+Y2Nfc2N0cDM0MzZfZGF0YS5hcnJheVtpXS5zZXNzaW9uKSB7CisJCQlHTlVUTFNfVFJBQ0UoIGdudXRsc19kZWluaXQoY29ubi0+Y2Nfc2N0cDM0MzZfZGF0YS5hcnJheVtpXS5zZXNzaW9uKSApOworCQkJY29ubi0+Y2Nfc2N0cDM0MzZfZGF0YS5hcnJheVtpXS5zZXNzaW9uID0gTlVMTDsKKwkJfQorCX0KKwkKKwkvKiBGcmVlIHRoZSBhcnJheSBpdHNlbGYgbm93ICovCisJZnJlZShjb25uLT5jY19zY3RwMzQzNl9kYXRhLmFycmF5KTsKKwljb25uLT5jY19zY3RwMzQzNl9kYXRhLmFycmF5ID0gTlVMTDsKKwkKKwkvKiBEZWxldGUgdGhlIHN0b3JlIG9mIHNlc3Npb25zICovCisJc3RvcmVfZGVzdHJveShjb25uKTsKKwkKKwlyZXR1cm4gOworfQpkaWZmIC0tZ2l0IGEvbGliZmRjb3JlL3NlcnZlci5jIGIvbGliZmRjb3JlL3NlcnZlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1YTg1NjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJmZGNvcmUvc2VydmVyLmMKQEAgLTAsMCArMSw1MDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDEzLCBXSURFIFByb2plY3QgYW5kIE5JQ1QJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFdJREUgUHJvamVjdCBvciBOSUNUIG5vciB0aGUgCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgV0lERSBQcm9qZWN0IGFuZCAJCQkJCQkgKgorKiAgIE5JQ1QuCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImZkY29yZS1pbnRlcm5hbC5oIgorCisvKiBTZXJ2ZXIgKGxpc3RlbmluZykgcGFydCBvZiB0aGUgZnJhbWV3b3JrICovCisKK3N0YXRpYyBzdHJ1Y3QgZmRfbGlzdAlGRF9TRVJWRVJTID0gRkRfTElTVF9JTklUSUFMSVpFUihGRF9TRVJWRVJTKTsJLyogVGhlIGxpc3Qgb2YgYWxsIHNlcnZlciBvYmplY3RzICovCisvKiBXZSBkb24ndCBuZWVkIHRvIHByb3RlY3QgdGhpcyBsaXN0LCBpdCBpcyBvbmx5IGFjY2Vzc2VkIGZyb20gdGhlIG1haW4gZnJhbWV3b3JrIHRocmVhZC4gKi8KKworZW51bSBzX3N0YXRlIHsKKwlOT1RfQ1JFQVRFRD0wLAorCVJVTk5JTkcsCisJVEVSTUlOQVRFRCwKKwlFUlJPUgkvKiBhbiBlcnJvciBvY2N1cnJlZCwgdGhpcyBpcyBub3QgYSB2YWxpZCBzdGF0dXMgKi8KK307CisKKy8qIFNlcnZlcnMgaW5mb3JtYXRpb24gKi8KK3N0cnVjdCBzZXJ2ZXIgeworCXN0cnVjdCBmZF9saXN0CWNoYWluOwkJLyogbGluayBpbiB0aGUgRkRfU0VSVkVSUyBsaXN0ICovCisKKwlzdHJ1Y3QgY254Y3R4ICoJY29ubjsJCS8qIHNlcnZlciBjb25uZWN0aW9uIGNvbnRleHQgKGxpc3RlbmluZyBzb2NrZXQpICovCisJaW50IAkJcHJvdG87CQkvKiBJUFBST1RPX1RDUCBvciBJUFBST1RPX1NDVFAgKi8KKwlpbnQgCQlzZWN1cjsJCS8qIFRMUyBpcyBzdGFydGVkIGltbWVkaWF0bHkgYWZ0ZXIgY29ubmVjdGlvbiA/IDA6IG5vOyAxOiBSRlU7IDI6IHllcyAoVExTL1RDUCBvciBUTFMvU0NUUCkgKi8KKwkKKwlwdGhyZWFkX3QJdGhyOwkJLyogVGhlIHRocmVhZCB3YWl0aW5nIGZvciBuZXcgY29ubmVjdGlvbnMgKHdpbGwgc3RvcmUgdGhlIGRhdGEgaW4gdGhlIGNsaWVudHMgZmlmbykgKi8KKwllbnVtIHNfc3RhdGUJc3RhdGU7CQkvKiBzdGF0ZSBvZiB0aGUgdGhyZWFkICovCisJCisJc3RydWN0IGZpZm8JKnBlbmRpbmc7CS8qIEZJRk8gb2Ygc3RydWN0IGNueGN0eCAqLworCXN0cnVjdCBwb29sX3dvcmtlcnMgeworCQlzdHJ1Y3Qgc2VydmVyICogczsJLyogcG9pbnRlciB0byB0aGUgcGFyZW50IHNlcnZlciBzdHJ1Y3R1cmUgKi8KKwkJaW50CQlpZDsJLyogVGhlIHdvcmtlciBpZCBmb3IgbG9ncyAqLworCQlwdGhyZWFkX3QJd29ya2VyOyAvKiBUaGUgdGhyZWFkICovCisJfQkJKndvcmtlcnM7CS8qIGFycmF5IG9mIGNuZl90aHJfc3J2IGl0ZW1zICovCit9OworCisKKy8qIE1pY3JvIGZ1bmN0aW9ucyB0byByZWFkL2NoYW5nZSB0aGUgc3RhdHVzIHRocmVhZC1zYWZlbHkgKi8KK3N0YXRpYyBwdGhyZWFkX211dGV4X3Qgc19sb2NrID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKK3N0YXRpYyBlbnVtIHNfc3RhdGUgZ2V0X3N0YXR1cyhzdHJ1Y3Qgc2VydmVyICogcykKK3sKKwllbnVtIHNfc3RhdGUgcjsKKwlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9tdXRleF9sb2NrKCZzX2xvY2spLCByZXR1cm4gRVJST1IgKTsKKwlyID0gcy0+c3RhdGU7CisJQ0hFQ0tfUE9TSVhfRE8oIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZzX2xvY2spLCByZXR1cm4gRVJST1IgKTsKKwlyZXR1cm4gcjsKK30KK3N0YXRpYyB2b2lkIHNldF9zdGF0dXMoc3RydWN0IHNlcnZlciAqIHMsIGVudW0gc19zdGF0ZSBzdCkKK3sKKwlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9tdXRleF9sb2NrKCZzX2xvY2spLCByZXR1cm4gKTsKKwlzLT5zdGF0ZSA9IHN0OworCUNIRUNLX1BPU0lYX0RPKCBwdGhyZWFkX211dGV4X3VubG9jaygmc19sb2NrKSwgcmV0dXJuICk7Cit9CisJCisKKy8qIGR1bXAgb25lIGl0ZW0gb2YgdGhlIHNlcnZlci0+cGVuZGluZyBmaWZvICovCitzdGF0aWMgREVDTEFSRV9GRF9EVU1QX1BST1RPVFlQRShkdW1wX2NueCwgdm9pZCAqIGl0ZW0pIHsKKwlzdHJ1Y3QgY254Y3R4ICogYyA9IGl0ZW07CisJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9kdW1wX2V4dGVuZCggRkRfRFVNUF9TVERfUEFSQU1TLCAiICclcyciLCBmZF9jbnhfZ2V0aWQoYykpLCByZXR1cm4gTlVMTCk7CisJcmV0dXJuICpidWY7Cit9CisKKy8qIER1bXAgYWxsIHNlcnZlcnMgaW5mb3JtYXRpb24gKi8KK0RFQ0xBUkVfRkRfRFVNUF9QUk9UT1RZUEUoZmRfc2VydmVyc19kdW1wLCBpbnQgZGV0YWlscykKK3sKKwlzdHJ1Y3QgZmRfbGlzdCAqIGxpOworCQorCUZEX0RVTVBfSEFORExFX09GRlNFVCgpOworCQorCWZvciAobGkgPSBGRF9TRVJWRVJTLm5leHQ7IGxpICE9ICZGRF9TRVJWRVJTOyBsaSA9IGxpLT5uZXh0KSB7CisJCXN0cnVjdCBzZXJ2ZXIgKiBzID0gKHN0cnVjdCBzZXJ2ZXIgKilsaTsKKwkJZW51bSBzX3N0YXRlIHN0ID0gZ2V0X3N0YXR1cyhzKTsKKwkJCisJCWlmIChkZXRhaWxzKSB7CisJCQlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICJ7c2VydmVyfShAJXApJyVzJzogJXMsICVzKCVkKSwgJXMiLCBzLCBmZF9jbnhfZ2V0aWQocy0+Y29ubiksIAorCQkJCQlJUFBST1RPX05BTUUoIHMtPnByb3RvICksCisJCQkJCXMtPnNlY3VyID8gIlNlY3VyIiA6ICJOb3RTZWN1ciIsIHMtPnNlY3VyLAorCQkJCQkoc3QgPT0gTk9UX0NSRUFURUQpID8gIlRocmVhZCBub3QgY3JlYXRlZCIgOgorCQkJCQkoKHN0ID09IFJVTk5JTkcpID8gIlRocmVhZCBydW5uaW5nIiA6CisJCQkJCSgoc3QgPT0gVEVSTUlOQVRFRCkgPyAiVGhyZWFkIHRlcm1pbmF0ZWQiIDoKKwkJCQkJCQkJICAiVGhyZWFkIHN0YXR1cyB1bmtub3duIikpKSwgcmV0dXJuIE5VTEwpOworCQkJLyogRHVtcCB0aGUgY2xpZW50IGxpc3Qgb2YgdGhpcyBzZXJ2ZXIgKi8KKwkJCUNIRUNLX01BTExPQ19ETyggZmRfZmlmb19kdW1wKEZEX0RVTVBfU1REX1BBUkFNUywgInBlbmRpbmcgY29ubmVjdGlvbnMiLCBzLT5wZW5kaW5nLCBkdW1wX2NueCksIHJldHVybiBOVUxMICk7CisKKwkJCWlmIChsaS0+bmV4dCAhPSAmRkRfU0VSVkVSUykgeworCQkJCUNIRUNLX01BTExPQ19ETyggZmRfZHVtcF9leHRlbmQoIEZEX0RVTVBfU1REX1BBUkFNUywgIlxuIiksIHJldHVybiBOVUxMKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCUNIRUNLX01BTExPQ19ETyggZmRfZHVtcF9leHRlbmQoIEZEX0RVTVBfU1REX1BBUkFNUywgIiclcycoJXMsJXMpICAiLCBmZF9jbnhfZ2V0aWQocy0+Y29ubiksIAorCQkJCQlJUFBST1RPX05BTUUoIHMtPnByb3RvICksIHMtPnNlY3VyID8gIlNlY3VyIiA6ICJOb3RTZWN1ciIpLCByZXR1cm4gTlVMTCk7CisJCX0KKwl9CisJCisJcmV0dXJuICpidWY7Cit9CisKKworLyogVGhlIHRocmVhZCBpbiB0aGUgcG9vbCBmb3IgaGFuZGxpbmcgbmV3IGNsaWVudHMgY29ubmVjdGluZyB0byBhIHNlcnZlciAqLworc3RhdGljIHZvaWQgKiBjbGllbnRfd29ya2VyKHZvaWQgKiBhcmcpCit7CisJc3RydWN0IHBvb2xfd29ya2VycyAqIHB3ID0gYXJnOworCXN0cnVjdCBzZXJ2ZXIgKiBzID0gcHctPnM7CisJc3RydWN0IGNueGN0eCAqIGMgPSBOVUxMOworCWludCBmYXRhbCA9IDA7CisJc3RydWN0IHRpbWVzcGVjIHRzOworCXN0cnVjdCBmZF9jbnhfcmN2ZGF0YSByY3ZfZGF0YTsKKwlzdHJ1Y3QgZmRfbXNnX3BtZGwgKiBwbWRsID0gTlVMTDsKKwlzdHJ1Y3QgbXNnICAgICogbXNnID0gTlVMTDsKKwlzdHJ1Y3QgbXNnX2hkciAqaGRyID0gTlVMTDsKKwlzdHJ1Y3QgZmRfcGVpIHBlaTsKKwkKKwlUUkFDRV9FTlRSWSgiJXAiLCBhcmcpOworCQorCS8qIFNldCB0aGUgdGhyZWFkIG5hbWUgKi8KKwl7CisJCWNoYXIgYnVmWzQ4XTsKKwkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIldvcmtlciMlZFslcyVzXSIsIHB3LT5pZCwgSVBQUk9UT19OQU1FKHMtPnByb3RvKSwgcy0+c2VjdXI/IiwgU2VjIiA6ICIiKTsKKwkJZmRfbG9nX3RocmVhZG5hbWUgKCBidWYgKTsKKwl9CisJCisJLyogTG9vcCB1bnRpbCBjYW5jZWxlZCAvIGVycm9yICovCituZXh0X2NsaWVudDoKKwlMT0dfQSgiUmVhZHkgdG8gcHJvY2VzcyBuZXh0IGluY29taW5nIGNvbm5lY3Rpb24iKTsKKworCW1lbXNldCgmcmN2X2RhdGEsIDAsIHNpemVvZihyY3ZfZGF0YSkpOworCQorCS8qIEdldCB0aGUgbmV4dCBjb25uZWN0aW9uICovCisJQ0hFQ0tfRkNUX0RPKCBmZF9maWZvX2dldCggcy0+cGVuZGluZywgJmMgKSwgeyBmYXRhbCA9IDE7IGdvdG8gY2xlYW51cDsgfSApOworCisJLyogSGFuZHNoYWtlIGlmIHdlIGFyZSBhIHNlY3VyZSBzZXJ2ZXIgcG9ydCwgb3Igc3RhcnQgY2xlYXIgb3RoZXJ3aXNlICovCisJaWYgKHMtPnNlY3VyKSB7CisJCUxPR19EKCJTdGFydGluZyBoYW5kc2hha2Ugd2l0aCAlcyIsIGZkX2NueF9nZXRpZChjKSk7CisKKwkJaW50IHJldCA9IGZkX2NueF9oYW5kc2hha2UoYywgR05VVExTX1NFUlZFUiwgKHMtPnNlY3VyID09IDEpID8gQUxHT19IQU5EU0hBS0VfREVGQVVMVCA6IEFMR09fSEFORFNIQUtFXzM0MzYsIE5VTEwsIE5VTEwpOworCQlpZiAocmV0ICE9IDApIHsKKwkJCWNoYXIgYnVmWzEwMjRdOworCQkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIlRMUyBoYW5kc2hha2UgZmFpbGVkIGZvciBjb25uZWN0aW9uICclcycsIGNvbm5lY3Rpb24gY2xvc2VkLiIsIGZkX2NueF9nZXRpZChjKSk7CisKKwkJCWZkX2hvb2tfY2FsbChIT09LX1BFRVJfQ09OTkVDVF9GQUlMRUQsIE5VTEwsIE5VTEwsIGJ1ZiwgTlVMTCk7CisKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCX0gZWxzZSB7CisJCUNIRUNLX0ZDVF9ETyggZmRfY254X3N0YXJ0X2NsZWFyKGMsIDApLCBnb3RvIGNsZWFudXAgKTsKKwl9CisJCisJLyogU2V0IHRoZSB0aW1lb3V0IHRvIHJlY2VpdmUgdGhlIGZpcnN0IG1lc3NhZ2UgKi8KKwlDSEVDS19TWVNfRE8oIGNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZ0cyksIHsgZmF0YWwgPSAxOyBnb3RvIGNsZWFudXA7IH0gKTsKKwl0cy50dl9zZWMgKz0gSU5DTlhfVElNRU9VVDsKKwkKKwkvKiBSZWNlaXZlIHRoZSBmaXJzdCBEaWFtZXRlciBtZXNzYWdlIG9uIHRoZSBjb25uZWN0aW9uIC0tIGNsZWFudXAgaW4gY2FzZSBvZiB0aW1lb3V0ICovCisJQ0hFQ0tfRkNUX0RPKCBmZF9jbnhfcmVjZWl2ZShjLCAmdHMsICZyY3ZfZGF0YS5idWZmZXIsICZyY3ZfZGF0YS5sZW5ndGgpLCAKKwkJeworCQkJY2hhciBidWZbMTAyNF07CisJCQkKKwkJCXN3aXRjaCAoX19yZXRfXykgeworCQkJY2FzZSBFVElNRURPVVQ6CisJCQkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIkNsaWVudCAnJXMnIGRpZCBub3Qgc2VuZCBDRVIgd2l0aGluICVkcywgY29ubmVjdGlvbiBhYm9ydGVkLiIsIGZkX2NueF9nZXRpZChjKSwgSU5DTlhfVElNRU9VVCk7CisJCQkJZmRfaG9va19jYWxsKEhPT0tfUEVFUl9DT05ORUNUX0ZBSUxFRCwgTlVMTCwgTlVMTCwgYnVmLCBOVUxMKTsKKwkJCQlicmVhazsKKwkJCQorCQkJY2FzZSBFTk9UQ09OTjoKKwkJCQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiQ29ubmVjdGlvbiBmcm9tICclcycgaW4gZXJyb3IgYmVmb3JlIENFUiB3YXMgcmVjZWl2ZWQuIiwgZmRfY254X2dldGlkKGMpKTsKKwkJCQlmZF9ob29rX2NhbGwoSE9PS19QRUVSX0NPTk5FQ1RfRkFJTEVELCBOVUxMLCBOVUxMLCBidWYsIE5VTEwpOworCQkJCWJyZWFrOworCQkJCisJCQlkZWZhdWx0OgorCQkJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJDb25uZWN0aW9uIGZyb20gJyVzJzogdW5zcGVjaWZpZWQgZXJyb3IsIGNvbm5lY3Rpb24gYWJvcnRlZC4iLCBmZF9jbnhfZ2V0aWQoYykpOworCQkJCWZkX2hvb2tfY2FsbChIT09LX1BFRVJfQ09OTkVDVF9GQUlMRUQsIE5VTEwsIE5VTEwsIGJ1ZiwgTlVMTCk7CisJCQl9CisJCQlnb3RvIGNsZWFudXA7CisJCX0gKTsKKwkKKwlUUkFDRV9ERUJVRyhGVUxMLCAiUmVjZWl2ZWQgJXpkYiBmcm9tIG5ldyBjbGllbnQgJyVzJyIsIHJjdl9kYXRhLmxlbmd0aCwgZmRfY254X2dldGlkKGMpKTsKKwkKKwlwbWRsID0gZmRfbXNnX3BtZGxfZ2V0X2luYnVmKHJjdl9kYXRhLmJ1ZmZlciwgcmN2X2RhdGEubGVuZ3RoKTsKKwkKKwkvKiBUcnkgcGFyc2luZyB0aGlzIG1lc3NhZ2UgKi8KKwlDSEVDS19GQ1RfRE8oIGZkX21zZ19wYXJzZV9idWZmZXIoICZyY3ZfZGF0YS5idWZmZXIsIHJjdl9kYXRhLmxlbmd0aCwgJm1zZyApLCAKKwkJeyAJLyogUGFyc2luZyBmYWlsZWQgKi8gCisJCQlmZF9ob29rX2NhbGwoSE9PS19NRVNTQUdFX1BBUlNJTkdfRVJST1IsIE5VTEwsIE5VTEwsICZyY3ZfZGF0YSwgcG1kbCApOworCQkJZ290byBjbGVhbnVwOworCQl9ICk7CisJCisJLyogTG9nIGluY29taW5nIG1lc3NhZ2UgKi8KKwlmZF9ob29rX2Fzc29jaWF0ZShtc2csIHBtZGwpOworCWZkX2hvb2tfY2FsbChIT09LX01FU1NBR0VfUkVDRUlWRUQsIG1zZywgTlVMTCwgZmRfY254X2dldGlkKGMpLCBmZF9tc2dfcG1kbF9nZXQobXNnKSk7CisJCisJLyogV2UgZXhwZWN0IGEgQ0VSLCBpdCBtdXN0IHBhcnNlIHdpdGggb3VyIGRpY3Rpb25hcnkgYW5kIHJ1bGVzICovCisJQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfcGFyc2VfcnVsZXMoIG1zZywgZmRfZ19jb25maWctPmNuZl9kaWN0LCAmcGVpICksIAorCQl7IC8qIFBhcnNpbmcgZmFpbGVkIC0tIHRyYWNlIGRldGFpbHMgKi8gCisJCQljaGFyIGJ1ZlsxMDI0XTsKKwkJCQorCQkJZmRfaG9va19jYWxsKEhPT0tfTUVTU0FHRV9QQVJTSU5HX0VSUk9SLCBtc2csIE5VTEwsIHBlaS5wZWlfbWVzc2FnZSA/OiBwZWkucGVpX2VycmNvZGUsIGZkX21zZ19wbWRsX2dldChtc2cpKTsKKwkJCQorCQkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIkVycm9yIHBhcnNpbmcgQ0VSIGZyb20gJyVzJywgY29ubmVjdGlvbiBhYm9ydGVkLiIsIGZkX2NueF9nZXRpZChjKSk7CisJCQlmZF9ob29rX2NhbGwoSE9PS19QRUVSX0NPTk5FQ1RfRkFJTEVELCBOVUxMLCBOVUxMLCBidWYsIE5VTEwpOworCQkJCisJCQlnb3RvIGNsZWFudXA7CisJCX0gKTsKKwkKKwkvKiBOb3cgY2hlY2sgd2UgcmVjZWl2ZWQgYSBDRVIgKi8KKwlDSEVDS19GQ1RfRE8oIGZkX21zZ19oZHIgKCBtc2csICZoZHIgKSwgeyBmYXRhbCA9IDE7IGdvdG8gY2xlYW51cDsgfSAgKTsKKwlDSEVDS19QQVJBTVNfRE8oIChoZHItPm1zZ19hcHBsID09IDApICYmIChoZHItPm1zZ19mbGFncyAmIENNRF9GTEFHX1JFUVVFU1QpICYmIChoZHItPm1zZ19jb2RlID09IENDX0NBUEFCSUxJVElFU19FWENIQU5HRSksCisJCXsgLyogUGFyc2luZyBmYWlsZWQgLS0gdHJhY2UgZGV0YWlscyAqLyAKKwkJCWNoYXIgYnVmWzEwMjRdOworCQkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIkV4cGVjdGVkIENFUiBmcm9tICclcycsIHJlY2VpdmVkIGEgZGlmZmVyZW50IG1lc3NhZ2UsIGNvbm5lY3Rpb24gYWJvcnRlZC4iLCBmZF9jbnhfZ2V0aWQoYykpOworCQkJZmRfaG9va19jYWxsKEhPT0tfUEVFUl9DT05ORUNUX0ZBSUxFRCwgbXNnLCBOVUxMLCBidWYsIE5VTEwpOworCQkJZ290byBjbGVhbnVwOworCQl9ICk7CisJCisJLyogRmluYWxseSwgcGFzcyB0aGUgaW5mb3JtYXRpb24gdG8gdGhlIHBlZXJzIG1vZHVsZSB3aGljaCB3aWxsIGhhbmRsZSBpdCBpbiBhIHNlcGFyYXRlIHRocmVhZCAqLworCXB0aHJlYWRfY2xlYW51cF9wdXNoKCh2b2lkICopZmRfY254X2Rlc3Ryb3ksIGMpOworCXB0aHJlYWRfY2xlYW51cF9wdXNoKCh2b2lkICopZmRfbXNnX2ZyZWUsIG1zZyk7CisJQ0hFQ0tfRkNUX0RPKCBmZF9wZWVyX2hhbmRsZV9uZXdDRVIoICZtc2csICZjICksICApOworCXB0aHJlYWRfY2xlYW51cF9wb3AoMCk7CisJcHRocmVhZF9jbGVhbnVwX3BvcCgwKTsKKworY2xlYW51cDoKKwkvKiBDbGVhbnVwIHRoZSBwYXJzZWQgbWVzc2FnZSBpZiBhbnkgKi8KKwlpZiAobXNnKSB7CisJCUNIRUNLX0ZDVF9ETyggZmRfbXNnX2ZyZWUobXNnKSwgLyogY29udGludWUgKi8pOworCQltc2cgPSBOVUxMOworCX0KKwkKKwkvKiBDbG9zZSB0aGUgY29ubmVjdGlvbiBpZiBuZWVkZWQgKi8KKwlpZiAoYyAhPSBOVUxMKSB7CisJCWZkX2NueF9kZXN0cm95KGMpOworCQljID0gTlVMTDsKKwl9CisJCisJLyogQ2xlYW51cCB0aGUgcmVjZWl2ZWQgYnVmZmVyIGlmIGFueSAqLworCWZyZWUocmN2X2RhdGEuYnVmZmVyKTsKKwkKKwkKKwlpZiAoIWZhdGFsKQorCQlnb3RvIG5leHRfY2xpZW50OworCisJTE9HX0UoIldvcmtlciB0aHJlYWQgZXhpdGluZy4iKTsKKwlyZXR1cm4gTlVMTDsKK30JCisKKy8qIFRoZSB0aHJlYWQgbWFuYWdpbmcgYSBzZXJ2ZXIgKi8KK3N0YXRpYyB2b2lkICogc2Vydl90aCh2b2lkICogYXJnKQoreworCXN0cnVjdCBzZXJ2ZXIgKnMgPSAoc3RydWN0IHNlcnZlciAqKWFyZzsKKwkKKwlDSEVDS19QQVJBTVNfRE8ocywgZ290byBlcnJvcik7CisJZmRfbG9nX3RocmVhZG5hbWUgKCBmZF9jbnhfZ2V0aWQocy0+Y29ubikgKTsKKwkKKwlzZXRfc3RhdHVzKHMsIFJVTk5JTkcpOworCQorCS8qIEFjY2VwdCBpbmNvbWluZyBjb25uZWN0aW9ucyAqLworCUNIRUNLX0ZDVF9ETyggZmRfY254X3NlcnZfbGlzdGVuKHMtPmNvbm4pLCBnb3RvIGVycm9yICk7CisJCisJZG8geworCQlzdHJ1Y3QgY254Y3R4ICogY29ubiA9IE5VTEw7CisJCQorCQkvKiBXYWl0IGZvciBhIG5ldyBjbGllbnQgb3IgY2FuY2VsICovCisJCUNIRUNLX01BTExPQ19ETyggY29ubiA9IGZkX2NueF9zZXJ2X2FjY2VwdChzLT5jb25uKSwgYnJlYWsgKTsKKwkJCisJCS8qIFN0b3JlIHRoaXMgY29ubmVjdGlvbiBpbiB0aGUgZmlmbyBmb3IgcHJvY2Vzc2luZyBieSB0aGUgd29ya2VyIHBvb2wuIFdpbGwgYmxvY2sgd2hlbiB0aGUgZmlmbyBpcyBmdWxsICovCisJCXB0aHJlYWRfY2xlYW51cF9wdXNoKCh2b2lkICopZmRfY254X2Rlc3Ryb3ksIGNvbm4pOworCQlDSEVDS19GQ1RfRE8oIGZkX2ZpZm9fcG9zdCggcy0+cGVuZGluZywgJmNvbm4gKSwgYnJlYWsgKTsKKwkJcHRocmVhZF9jbGVhbnVwX3BvcCgwKTsKKwkJCisJfSB3aGlsZSAoMSk7CitlcnJvcjoJCisJaWYgKHMpCisJCXNldF9zdGF0dXMocywgVEVSTUlOQVRFRCk7CisKKwkvKiBTZW5kIGVycm9yIHNpZ25hbCB0byB0aGUgY29yZSAqLworCUxPR19GKCAiQW4gZXJyb3Igb2NjdXJyZWQgaW4gc2VydmVyIG1vZHVsZSEgVGhyZWFkIGlzIHRlcm1pbmF0aW5nLi4uIik7CisJQ0hFQ0tfRkNUX0RPKGZkX2NvcmVfc2h1dGRvd24oKSwgKTsKKworCXJldHVybiBOVUxMOworfQorCisKKy8qIENyZWF0ZSBhIG5ldyBzZXJ2ZXIgc3RydWN0dXJlICovCitzdGF0aWMgc3RydWN0IHNlcnZlciAqIG5ld19zZXJ2KCBpbnQgcHJvdG8sIGludCBzZWN1ciApCit7CisJc3RydWN0IHNlcnZlciAqIG5ldzsKKwlpbnQgaTsKKwkKKwkvKiBOZXcgc2VydmVyIHN0cnVjdHVyZSAqLworCUNIRUNLX01BTExPQ19ETyggbmV3ID0gbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2VydmVyKSksIHJldHVybiBOVUxMICk7CisJCisJbWVtc2V0KG5ldywgMCwgc2l6ZW9mKHN0cnVjdCBzZXJ2ZXIpKTsKKwlmZF9saXN0X2luaXQoJm5ldy0+Y2hhaW4sIG5ldyk7CisJbmV3LT5wcm90byA9IHByb3RvOworCW5ldy0+c2VjdXIgPSBzZWN1cjsKKwkKKwlDSEVDS19GQ1RfRE8oIGZkX2ZpZm9fbmV3KCZuZXctPnBlbmRpbmcsIDUpLCByZXR1cm4gTlVMTCk7CisJQ0hFQ0tfTUFMTE9DX0RPKCBuZXctPndvcmtlcnMgPSBjYWxsb2MoIGZkX2dfY29uZmlnLT5jbmZfdGhyX3Nydiwgc2l6ZW9mKHN0cnVjdCBwb29sX3dvcmtlcnMpICksIHJldHVybiBOVUxMICk7CisJCisJZm9yIChpID0gMDsgaSA8IGZkX2dfY29uZmlnLT5jbmZfdGhyX3NydjsgaSsrKSB7CisJCS8qIENyZWF0ZSB0aGUgcG9vbCAqLworCQluZXctPndvcmtlcnNbaV0ucyA9IG5ldzsKKwkJbmV3LT53b3JrZXJzW2ldLmlkID0gaTsKKwkJQ0hFQ0tfUE9TSVhfRE8oIHB0aHJlYWRfY3JlYXRlKCAmbmV3LT53b3JrZXJzW2ldLndvcmtlciwgTlVMTCwgY2xpZW50X3dvcmtlciwgJm5ldy0+d29ya2Vyc1tpXSksIHJldHVybiBOVUxMICk7CisJfQorCQorCXJldHVybiBuZXc7Cit9CisKKy8qIFN0YXJ0IGFsbCB0aGUgc2VydmVycyAqLworaW50IGZkX3NlcnZlcnNfc3RhcnQoKQoreworCXN0cnVjdCBzZXJ2ZXIgKiBzOworCQorCWludCBlbXB0eV9jb25mX2VwID0gRkRfSVNfTElTVF9FTVBUWSgmZmRfZ19jb25maWctPmNuZl9lbmRwb2ludHMpOworCQorCS8qIFNDVFAgKi8KKwlpZiAoIWZkX2dfY29uZmlnLT5jbmZfZmxhZ3Mubm9fc2N0cCkgeworI2lmZGVmIERJU0FCTEVfU0NUUAorCQlBU1NFUlQoMCk7CisjZWxzZSAvKiBESVNBQkxFX1NDVFAgKi8KKwkJCisJCS8qIENyZWF0ZSB0aGUgc2VydmVyIG9uIHVuc2VjdXJlIHBvcnQgKi8KKwkJaWYgKGZkX2dfY29uZmlnLT5jbmZfcG9ydCkgeworCQkJQ0hFQ0tfTUFMTE9DKCBzID0gbmV3X3NlcnYoSVBQUk9UT19TQ1RQLCAwKSApOworCQkJQ0hFQ0tfTUFMTE9DKCBzLT5jb25uID0gZmRfY254X3NlcnZfc2N0cChmZF9nX2NvbmZpZy0+Y25mX3BvcnQsIGVtcHR5X2NvbmZfZXAgPyBOVUxMIDogJmZkX2dfY29uZmlnLT5jbmZfZW5kcG9pbnRzKSApOworCQkJZmRfbGlzdF9pbnNlcnRfYmVmb3JlKCAmRkRfU0VSVkVSUywgJnMtPmNoYWluICk7CisJCQlDSEVDS19QT1NJWCggcHRocmVhZF9jcmVhdGUoICZzLT50aHIsIE5VTEwsIHNlcnZfdGgsIHMgKSApOworCQl9CisJCQorCQkvKiBDcmVhdGUgdGhlIHNlcnZlciBvbiBzZWN1cmUgcG9ydCAqLworCQlpZiAoZmRfZ19jb25maWctPmNuZl9wb3J0X3RscykgeworCQkJQ0hFQ0tfTUFMTE9DKCBzID0gbmV3X3NlcnYoSVBQUk9UT19TQ1RQLCAyIC8qIENoYW5nZSB3aGVuIERUTFMgaXMgaW50cm9kdWNlZCAqLykgKTsKKwkJCUNIRUNLX01BTExPQyggcy0+Y29ubiA9IGZkX2NueF9zZXJ2X3NjdHAoZmRfZ19jb25maWctPmNuZl9wb3J0X3RscywgZW1wdHlfY29uZl9lcCA/IE5VTEwgOiAmZmRfZ19jb25maWctPmNuZl9lbmRwb2ludHMpICk7CisJCQlmZF9saXN0X2luc2VydF9iZWZvcmUoICZGRF9TRVJWRVJTLCAmcy0+Y2hhaW4gKTsKKwkJCUNIRUNLX1BPU0lYKCBwdGhyZWFkX2NyZWF0ZSggJnMtPnRociwgTlVMTCwgc2Vydl90aCwgcyApICk7CisJCX0KKwkJCisJCS8qIENyZWF0ZSB0aGUgb3RoZXIgc2VydmVyIG9uIDM0MzYgc2VjdXJlIHBvcnQgKi8KKwkJLyppZiAoZmRfZ19jb25maWctPmNuZl9wb3J0XzM0MzYpIHsKKwkJCUNIRUNLX01BTExPQyggcyA9IG5ld19zZXJ2KElQUFJPVE9fU0NUUCwgMikgKTsKKwkJCUNIRUNLX01BTExPQyggcy0+Y29ubiA9IGZkX2NueF9zZXJ2X3NjdHAoZmRfZ19jb25maWctPmNuZl9wb3J0XzM0MzYsIGVtcHR5X2NvbmZfZXAgPyBOVUxMIDogJmZkX2dfY29uZmlnLT5jbmZfZW5kcG9pbnRzKSApOworCQkJZmRfbGlzdF9pbnNlcnRfYmVmb3JlKCAmRkRfU0VSVkVSUywgJnMtPmNoYWluICk7CisJCQlDSEVDS19QT1NJWCggcHRocmVhZF9jcmVhdGUoICZzLT50aHIsIE5VTEwsIHNlcnZfdGgsIHMgKSApOworCQl9Ki8KKwkJCisjZW5kaWYgLyogRElTQUJMRV9TQ1RQICovCisJfQorCQorCS8qIFRDUCAqLworCWlmICghZmRfZ19jb25maWctPmNuZl9mbGFncy5ub190Y3ApIHsKKwkJCisJCWlmIChlbXB0eV9jb25mX2VwKSB7CisJCQkvKiBCaW5kIFRDUCBzZXJ2ZXJzIG9uIFswLjAuMC4wXSAqLworCQkJaWYgKCFmZF9nX2NvbmZpZy0+Y25mX2ZsYWdzLm5vX2lwNCkgeworCQkJCQorCQkJCWlmIChmZF9nX2NvbmZpZy0+Y25mX3BvcnQpIHsKKwkJCQkJQ0hFQ0tfTUFMTE9DKCBzID0gbmV3X3NlcnYoSVBQUk9UT19UQ1AsIDApICk7CisJCQkJCUNIRUNLX01BTExPQyggcy0+Y29ubiA9IGZkX2NueF9zZXJ2X3RjcChmZF9nX2NvbmZpZy0+Y25mX3BvcnQsIEFGX0lORVQsIE5VTEwpICk7CisJCQkJCWZkX2xpc3RfaW5zZXJ0X2JlZm9yZSggJkZEX1NFUlZFUlMsICZzLT5jaGFpbiApOworCQkJCQlDSEVDS19QT1NJWCggcHRocmVhZF9jcmVhdGUoICZzLT50aHIsIE5VTEwsIHNlcnZfdGgsIHMgKSApOworCQkJCX0KKworCQkJCWlmIChmZF9nX2NvbmZpZy0+Y25mX3BvcnRfdGxzKSB7CisJCQkJCUNIRUNLX01BTExPQyggcyA9IG5ld19zZXJ2KElQUFJPVE9fVENQLCAxKSApOworCQkJCQlDSEVDS19NQUxMT0MoIHMtPmNvbm4gPSBmZF9jbnhfc2Vydl90Y3AoZmRfZ19jb25maWctPmNuZl9wb3J0X3RscywgQUZfSU5FVCwgTlVMTCkgKTsKKwkJCQkJZmRfbGlzdF9pbnNlcnRfYmVmb3JlKCAmRkRfU0VSVkVSUywgJnMtPmNoYWluICk7CisJCQkJCUNIRUNLX1BPU0lYKCBwdGhyZWFkX2NyZWF0ZSggJnMtPnRociwgTlVMTCwgc2Vydl90aCwgcyApICk7CisJCQkJfQorCQkJfQorCQkJCisJCQkvKiBCaW5kIFRDUCBzZXJ2ZXJzIG9uIFs6Ol0gKi8KKwkJCWlmICghZmRfZ19jb25maWctPmNuZl9mbGFncy5ub19pcDYpIHsKKworCQkJCWlmIChmZF9nX2NvbmZpZy0+Y25mX3BvcnQpIHsKKwkJCQkJQ0hFQ0tfTUFMTE9DKCBzID0gbmV3X3NlcnYoSVBQUk9UT19UQ1AsIDApICk7CisJCQkJCUNIRUNLX01BTExPQyggcy0+Y29ubiA9IGZkX2NueF9zZXJ2X3RjcChmZF9nX2NvbmZpZy0+Y25mX3BvcnQsIEFGX0lORVQ2LCBOVUxMKSApOworCQkJCQlmZF9saXN0X2luc2VydF9iZWZvcmUoICZGRF9TRVJWRVJTLCAmcy0+Y2hhaW4gKTsKKwkJCQkJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfY3JlYXRlKCAmcy0+dGhyLCBOVUxMLCBzZXJ2X3RoLCBzICkgKTsKKwkJCQl9CisKKwkJCQlpZiAoZmRfZ19jb25maWctPmNuZl9wb3J0X3RscykgeworCQkJCQlDSEVDS19NQUxMT0MoIHMgPSBuZXdfc2VydihJUFBST1RPX1RDUCwgMSkgKTsKKwkJCQkJQ0hFQ0tfTUFMTE9DKCBzLT5jb25uID0gZmRfY254X3NlcnZfdGNwKGZkX2dfY29uZmlnLT5jbmZfcG9ydF90bHMsIEFGX0lORVQ2LCBOVUxMKSApOworCQkJCQlmZF9saXN0X2luc2VydF9iZWZvcmUoICZGRF9TRVJWRVJTLCAmcy0+Y2hhaW4gKTsKKwkJCQkJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfY3JlYXRlKCAmcy0+dGhyLCBOVUxMLCBzZXJ2X3RoLCBzICkgKTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBDcmVhdGUgYWxsIGVuZHBvaW50cyAtLSBjaGVjayBmbGFncyAqLworCQkJc3RydWN0IGZkX2xpc3QgKiBsaTsKKwkJCWZvciAobGkgPSBmZF9nX2NvbmZpZy0+Y25mX2VuZHBvaW50cy5uZXh0OyBsaSAhPSAmZmRfZ19jb25maWctPmNuZl9lbmRwb2ludHM7IGxpID0gbGktPm5leHQpIHsKKwkJCQlzdHJ1Y3QgZmRfZW5kcG9pbnQgKiBlcCA9IChzdHJ1Y3QgZmRfZW5kcG9pbnQgKilsaTsKKwkJCQlzU0EgKiBzYSA9IChzU0EgKikgJmVwLT5zczsKKwkJCQlpZiAoISAoZXAtPmZsYWdzICYgRVBfRkxfQ09ORikpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmIChmZF9nX2NvbmZpZy0+Y25mX2ZsYWdzLm5vX2lwNCAmJiAoc2EtPnNhX2ZhbWlseSA9PSBBRl9JTkVUKSkKKwkJCQkJY29udGludWU7CisJCQkJaWYgKGZkX2dfY29uZmlnLT5jbmZfZmxhZ3Mubm9faXA2ICYmIChzYS0+c2FfZmFtaWx5ID09IEFGX0lORVQ2KSkKKwkJCQkJY29udGludWU7CisJCQkJCisJCQkJaWYgKGZkX2dfY29uZmlnLT5jbmZfcG9ydCkgeworCQkJCQlDSEVDS19NQUxMT0MoIHMgPSBuZXdfc2VydihJUFBST1RPX1RDUCwgMCkgKTsKKwkJCQkJQ0hFQ0tfTUFMTE9DKCBzLT5jb25uID0gZmRfY254X3NlcnZfdGNwKGZkX2dfY29uZmlnLT5jbmZfcG9ydCwgc2EtPnNhX2ZhbWlseSwgZXApICk7CisJCQkJCWZkX2xpc3RfaW5zZXJ0X2JlZm9yZSggJkZEX1NFUlZFUlMsICZzLT5jaGFpbiApOworCQkJCQlDSEVDS19QT1NJWCggcHRocmVhZF9jcmVhdGUoICZzLT50aHIsIE5VTEwsIHNlcnZfdGgsIHMgKSApOworCQkJCX0KKworCQkJCWlmIChmZF9nX2NvbmZpZy0+Y25mX3BvcnRfdGxzKSB7CisJCQkJCUNIRUNLX01BTExPQyggcyA9IG5ld19zZXJ2KElQUFJPVE9fVENQLCAxKSApOworCQkJCQlDSEVDS19NQUxMT0MoIHMtPmNvbm4gPSBmZF9jbnhfc2Vydl90Y3AoZmRfZ19jb25maWctPmNuZl9wb3J0X3Rscywgc2EtPnNhX2ZhbWlseSwgZXApICk7CisJCQkJCWZkX2xpc3RfaW5zZXJ0X2JlZm9yZSggJkZEX1NFUlZFUlMsICZzLT5jaGFpbiApOworCQkJCQlDSEVDS19QT1NJWCggcHRocmVhZF9jcmVhdGUoICZzLT50aHIsIE5VTEwsIHNlcnZfdGgsIHMgKSApOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwkKKwkvKiBOb3csIGlmIHdlIGhhZCBhbiBlbXB0eSBsaXN0IG9mIGxvY2FsIGFkcmVzc2VzIChubyBhZGRyZXNzIGNvbmZpZ3VyZWQpLCB0cnkgdG8gcmVhZCB0aGUgcmVhbCBhZGRyZXNzZXMgZnJvbSB0aGUga2VybmVsICovCisJaWYgKGVtcHR5X2NvbmZfZXApIHsKKwkJQ0hFQ0tfRkNUKGZkX2NueF9nZXRfbG9jYWxfZXBzKCZmZF9nX2NvbmZpZy0+Y25mX2VuZHBvaW50cykpOworCQlpZiAoRkRfSVNfTElTVF9FTVBUWSgmZmRfZ19jb25maWctPmNuZl9lbmRwb2ludHMpKSB7CisJCQlUUkFDRV9ERUJVRyhJTkZPLCAiVW5hYmxlIHRvIGZpbmQgdGhlIGFkZHJlc3MoZXMpIG9mIHRoZSBsb2NhbCBzeXN0ZW0uICIgCisJCQkJCSJQbGVhc2UgdXNlIFwiTGlzdGVuT25cIiBwYXJhbWV0ZXIgaW4gdGhlIGNvbmZpZ3VyYXRpb24uICIKKwkJCQkJIlRoaXMgaW5mb3JtYXRpb24gaXMgcmVxdWlyZWQgdG8gZ2VuZXJhdGUgdGhlIENFUi9DRUEgbWVzc2FnZXMuIik7CisJCQlyZXR1cm4gRUlOVkFMOworCQl9CisJfQorCQorCXsKKwkJY2hhciAqIGJ1ZiA9IE5VTEw7CisJCXNpemVfdCBsZW4gPSAwLCBvZmZzZXQgPSAwOworCQlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCAmYnVmLCAmbGVuLCAmb2Zmc2V0ICwgIkxvY2FsIHNlcnZlciBhZGRyZXNzKGVzKTogIiksICk7CisJCUNIRUNLX01BTExPQ19ETyggZmRfZXBfZHVtcCggICZidWYsICZsZW4sICZvZmZzZXQsIDAsIDAsICZmZF9nX2NvbmZpZy0+Y25mX2VuZHBvaW50cyApLCApOworCQlMT0dfTigiJXMiLCBidWYgPzogIkVycm9yIGR1bXBpbmcgYWRkcmVzc2VzIik7CisJCWZyZWUoYnVmKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIFRlcm1pbmF0ZSBhbGwgdGhlIHNlcnZlcnMgKi8KK2ludCBmZF9zZXJ2ZXJzX3N0b3AoKQoreworCVRSQUNFX0VOVFJZKCIiKTsKKwkKKwlUUkFDRV9ERUJVRyhJTkZPLCAiU2h1dHRpbmcgZG93biBzZXJ2ZXIgc29ja2V0cy4uLiIpOworCQorCS8qIExvb3Agb24gYWxsIHNlcnZlcnMgKi8KKwl3aGlsZSAoIUZEX0lTX0xJU1RfRU1QVFkoJkZEX1NFUlZFUlMpKSB7CisJCXN0cnVjdCBzZXJ2ZXIgKiBzID0gKHN0cnVjdCBzZXJ2ZXIgKikoRkRfU0VSVkVSUy5uZXh0KTsKKwkJaW50IGk7CisJCXN0cnVjdCBjbnhjdHggKiBjOworCQkKKwkJLyogY2FuY2VsIHRocmVhZCAqLworCQlDSEVDS19GQ1RfRE8oIGZkX3Rocl90ZXJtKCZzLT50aHIpLCAvKiBjb250aW51ZSAqLyk7CisJCQorCQkvKiBkZXN0cm95IHNlcnZlciBjb25uZWN0aW9uIGNvbnRleHQgKi8KKwkJZmRfY254X2Rlc3Ryb3kocy0+Y29ubik7CisJCQorCQkvKiBjYW5jZWwgYW5kIGRlc3Ryb3kgYWxsIHdvcmtlciB0aHJlYWRzICovCisJCWZvciAoaSA9IDA7IGkgPCBmZF9nX2NvbmZpZy0+Y25mX3Rocl9zcnY7IGkrKykgeworCQkJLyogRGVzdHJveSB3b3JrZXIgdGhyZWFkICovCisJCQlDSEVDS19GQ1RfRE8oIGZkX3Rocl90ZXJtKCZzLT53b3JrZXJzW2ldLndvcmtlciksIC8qIGNvbnRpbnVlICovKTsKKwkJfQorCQlmcmVlKHMtPndvcmtlcnMpOworCQkKKwkJLyogQ2xvc2UgYW55IHBlbmRpbmcgY29ubmVjdGlvbiAqLworCQl3aGlsZSAoIGZkX2ZpZm9fdHJ5Z2V0KCBzLT5wZW5kaW5nLCAmYyApID09IDAgKSB7CisJCQlmZF9jbnhfZGVzdHJveShjKTsKKwkJfQorCQlDSEVDS19GQ1RfRE8oIGZkX2ZpZm9fZGVsKCZzLT5wZW5kaW5nKSwgKTsKKwkJCisJCS8qIE5vdyBkZXN0cm95IHRoZSBzZXJ2ZXIgb2JqZWN0ICovCisJCWZkX2xpc3RfdW5saW5rKCZzLT5jaGFpbik7CisJCWZyZWUocyk7CisJfQorCQorCS8qIFdlJ3JlIGRvbmUhICovCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJmZGNvcmUvdGNwLmMgYi9saWJmZGNvcmUvdGNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI2Y2YxZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmZkY29yZS90Y3AuYwpAQCAtMCwwICsxLDE2OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTMsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiZmRjb3JlLWludGVybmFsLmgiCisjaW5jbHVkZSAiY254Y3R4LmgiCisKKyNpbmNsdWRlIDxuZXRpbmV0L3RjcC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaXA2Lmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCisvKiBTZXQgdGhlIHNvY2tldCBvcHRpb25zIGZvciBUQ1Agc29ja2V0cywgYmVmb3JlIGJpbmQgaXMgY2FsbGVkICovCitzdGF0aWMgaW50IGZkX3RjcF9zZXRzb2Nrb3B0KGludCBmYW1pbHksIGludCBzaykKK3sKKwlpbnQgcmV0ID0gMDsKKwlpbnQgb3B0OworCQorCS8qIENsZWFyIHRoZSBOT0RFTEFZIG9wdGlvbiBpbiBjYXNlIGl0IHdhcyBzZXQsIGFzIHJlcXVlc3RlZCBieSByZmMzNTM5I3NlY3Rpb24tMy4yICovCisJLyogTm90ZSB0aGF0IHRoaXMgaXMgc3VwcG9zZWQgdG8gYmUgdGhlIGRlZmF1bHQsIHNvIHdlIGNvdWxkIHByb2JhYmx5IHJlbW92ZSB0aGlzIGNhbGwgLi4uICovCisJb3B0ID0gMDsKKwlyZXQgPSBzZXRzb2Nrb3B0KHNrLCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksICZvcHQsIHNpemVvZihvcHQpKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJcmV0ID0gZXJybm87CisJCVRSQUNFX0RFQlVHKElORk8sICJVbmFibGUgdG8gc2V0IHRoZSBzb2NrZXQgVENQX05PREVMQVkgb3B0aW9uOiAlcyIsIHN0cmVycm9yKHJldCkpOworCQlyZXR1cm4gcmV0OworCX0KKwkKKwkvKiBVbmRlciBMaW51eCwgd2UgbWF5IGFsc28gc2V0IHRoZSBUQ1BfQ09OR0VTVElPTiBvcHRpb24gdG8gb25lIG9mIHRoZSBmb2xsb3dpbmcgc3RyaW5nczoKKwkgICAgLSByZW5vIChkZWZhdWx0KQorCSAgICAtIGJpYworCSAgICAtIGN1YmljCisJICAgIC0gaGlnaHNwZWVkCisJICAgIC0gaHRjcAorCSAgICAtIGh5YmxhCisJICAgIC0gaWxsaW5vaXMKKwkgICAgLSBscAorCSAgICAtIHNjYWxhYmxlCisJICAgIC0gdmVnYXMKKwkgICAgLSB2ZW5vCisJICAgIC0gd2VzdHdvb2QKKwkgICAgLSB5ZWFoCisJKi8KKwkKKwkvKiBJbiBjYXNlIG9mIHY2IGFkZHJlc3MsIGZvcmNlIHRoZSB2Nm9ubHkgb3B0aW9uLCB3ZSB1c2UgYSBkaWZmZXJlbnQgc29ja2V0IGZvciB2NCAqLworCSNpZmRlZiBJUFY2X1Y2T05MWQorCWlmIChmYW1pbHkgPT0gQUZfSU5FVDYpIHsKKwkJb3B0ID0gMTsKKwkJQ0hFQ0tfU1lTKHNldHNvY2tvcHQoc2ssIElQUFJPVE9fSVBWNiwgSVBWNl9WNk9OTFksICZvcHQsIHNpemVvZihvcHQpKSk7CisJfQorCSNlbmRpZiAvKiBJUFY2X1Y2T05MWSAqLworCQorCXsKKwkJb3B0ID0gMTsKKwkJQ0hFQ0tfU1lTKCAgc2V0c29ja29wdChzaywgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmb3B0LCBzaXplb2Yob3B0KSkgICk7CisJfQorCQorCS8qIFRoZXJlIGFyZSBhbHNvIG90aGVycyBzb2Nrb3B0IHRoYXQgY2FuIGJlIHNldCwgYnV0IG5vdGhpbmcgdXNlZnVsIGZvciB1cyBBRkFJQ1QgKi8KKwkKKwlyZXR1cm4gMDsKK30KKworLyogQ3JlYXRlIGEgc29ja2V0IHNlcnZlciBhbmQgYmluZCBpdCAqLworaW50IGZkX3RjcF9jcmVhdGVfYmluZF9zZXJ2ZXIoIGludCAqIHNvY2ssIHNTQSAqIHNhLCBzb2NrbGVuX3Qgc2FsZW4gKQoreworCVRSQUNFX0VOVFJZKCIlcCAlcCAlZCIsIHNvY2ssIHNhLCBzYWxlbik7CisJCisJQ0hFQ0tfUEFSQU1TKCAgc29jayAmJiBzYSAgKTsKKwkKKwkvKiBDcmVhdGUgdGhlIHNvY2tldCAqLworCUNIRUNLX1NZUyggICpzb2NrID0gc29ja2V0KHNhLT5zYV9mYW1pbHksIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1RDUCkgICk7CisKKwkvKiBTZXQgdGhlIHNvY2tldCBvcHRpb25zICovCisJQ0hFQ0tfRkNUKCAgZmRfdGNwX3NldHNvY2tvcHQoc2EtPnNhX2ZhbWlseSwgKnNvY2spICApOworCQorCS8qIEJpbmQgdGhlIHNvY2tldCAqLworCUNIRUNLX1NZUyggIGJpbmQoICpzb2NrLCBzYSwgc2FsZW4gKSAgKTsKKwkJCQorCS8qIFdlJ3JlIGRvbmUgKi8KKwlyZXR1cm4gMDsKK30KKworLyogQWxsb3cgY2xpZW50cyBjb25uZWN0aW9ucyBvbiBzZXJ2ZXIgc29ja2V0cyAqLworaW50IGZkX3RjcF9saXN0ZW4oIGludCBzb2NrICkKK3sKKwlUUkFDRV9FTlRSWSgiJWQiLCBzb2NrKTsKKwlDSEVDS19TWVMoIGxpc3Rlbihzb2NrLCA1KSApOworCXJldHVybiAwOworfQorCisvKiBDcmVhdGUgYSBjbGllbnQgc29ja2V0IGFuZCBjb25uZWN0IHRvIHJlbW90ZSBzZXJ2ZXIgKi8KK2ludCBmZF90Y3BfY2xpZW50KCBpbnQgKnNvY2ssIHNTQSAqIHNhLCBzb2NrbGVuX3Qgc2FsZW4gKQoreworCWludCByZXQgPSAwOworCWludCBzOworCQorCVRSQUNFX0VOVFJZKCIlcCAlcCAlZCIsIHNvY2ssIHNhLCBzYWxlbik7CisJQ0hFQ0tfUEFSQU1TKCBzb2NrICYmICgqc29jayA8PSAwKSAmJiBzYSAmJiBzYWxlbiApOworCQorCS8qIENyZWF0ZSB0aGUgc29ja2V0ICovCisJQ0hFQ0tfU1lTKCAgcyA9IHNvY2tldChzYS0+c2FfZmFtaWx5LCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApICApOworCQorCS8qIFNldCB0aGUgc29ja2V0IG9wdGlvbnMgKi8KKwlDSEVDS19GQ1QoICBmZF90Y3Bfc2V0c29ja29wdChzYS0+c2FfZmFtaWx5LCBzKSAgKTsKKwkKKwkvKiBDbGVhbnVwIGlmIHdlIGFyZSBjYW5jZWxsZWQgKi8KKwlwdGhyZWFkX2NsZWFudXBfcHVzaChmZF9jbGVhbnVwX3NvY2tldCwgJnMpOworCQorCS8qIFRyeSBjb25uZWN0aW5nIHRvIHRoZSByZW1vdGUgYWRkcmVzcyAqLworCXJldCA9IGNvbm5lY3Qocywgc2EsIHNhbGVuKTsKKwkKKwlwdGhyZWFkX2NsZWFudXBfcG9wKDApOworCQorCWlmIChyZXQgPCAwKSB7CisJCXJldCA9IGVycm5vOworCQlMT0dfQSggImNvbm5lY3QgcmV0dXJuZWQgYW4gZXJyb3I6ICVzIiwgc3RyZXJyb3IocmV0KSk7CisJCUNIRUNLX1NZU19ETyggY2xvc2UocyksIC8qIGNvbnRpbnVlICovICk7CisJCSpzb2NrID0gLTE7CisJCXJldHVybiByZXQ7CisJfQorCQorCS8qIERvbmUhICovCisJKnNvY2sgPSBzOworCXJldHVybiByZXQ7Cit9CisKKy8qIEdldCB0aGUgcmVtb3RlIG5hbWUgb2YgYSBUQ1Agc29ja2V0ICovCitpbnQgZmRfdGNwX2dldF9yZW1vdGVfZXAoaW50IHNvY2ssIHNTUyAqIHNzLCBzb2NrbGVuX3QgKnNsKQoreworCVRSQUNFX0VOVFJZKCIlZCAlcCAlcCIsIHNvY2ssIHNzLCBzbCk7CisJQ0hFQ0tfUEFSQU1TKCBzcyAmJiBzbCApOworCQorCSpzbCA9IHNpemVvZihzU1MpOworCUNIRUNLX1NZUyhnZXRwZWVybmFtZShzb2NrLCAoc1NBICopc3MsIHNsKSk7CisJCisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2xpYmZkY29yZS92ZXJzaW9uLmMgYi9saWJmZGNvcmUvdmVyc2lvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhM2E3MzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJmZGNvcmUvdmVyc2lvbi5jCkBAIC0wLDAgKzEsNDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDEzLCBXSURFIFByb2plY3QgYW5kIE5JQ1QJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFdJREUgUHJvamVjdCBvciBOSUNUIG5vciB0aGUgCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgV0lERSBQcm9qZWN0IGFuZCAJCQkJCQkgKgorKiAgIE5JQ1QuCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGZkY29yZS1pbnRlcm5hbC5oPgorI2luY2x1ZGUgPGZyZWVEaWFtZXRlci92ZXJzaW9uLmg+CisKKyNpZmRlZiBGRF9QUk9KRUNUX1ZFUlNJT05fSEcKKyMgZGVmaW5lIEZEX0xJQkZEQ09SRV9WRVJTSU9OIFwKKwlfc3RyaW5naXplKEZEX1BST0pFQ1RfVkVSU0lPTl9NQUpPUikgIi4iIF9zdHJpbmdpemUoRkRfUFJPSkVDVF9WRVJTSU9OX01JTk9SKSAiLiIgX3N0cmluZ2l6ZShGRF9QUk9KRUNUX1ZFUlNJT05fUkVWKSAiLSIgRkRfUFJPSkVDVF9WRVJTSU9OX0hHX1ZBTAorI2Vsc2UKKyMgZGVmaW5lIEZEX0xJQkZEQ09SRV9WRVJTSU9OIFwKKwlfc3RyaW5naXplKEZEX1BST0pFQ1RfVkVSU0lPTl9NQUpPUikgIi4iIF9zdHJpbmdpemUoRkRfUFJPSkVDVF9WRVJTSU9OX01JTk9SKSAiLiIgX3N0cmluZ2l6ZShGRF9QUk9KRUNUX1ZFUlNJT05fUkVWKQorI2VuZGlmCisKK2NvbnN0IGNoYXIgZmRfY29yZV92ZXJzaW9uW10gPSBGRF9MSUJGRENPUkVfVkVSU0lPTjsKZGlmZiAtLWdpdCBhL2xpYmZkcHJvdG8vQ01ha2VMaXN0cy50eHQgYi9saWJmZHByb3RvL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NTA3MTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJmZHByb3RvL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNTggQEAKKyMgTmFtZSBvZiB0aGUgc3VicHJvamVjdAorUHJvamVjdCgibGliZmRwcm90byIgQykKKworIyBDb25maWd1cmF0aW9uIGZvciBuZXdlciBjbWFrZQorY21ha2VfcG9saWN5KFZFUlNJT04gMi42KQoraWYgKFBPTElDWSBDTVAwMDIyKQorCWNtYWtlX3BvbGljeShTRVQgQ01QMDAyMiBPTEQpCitlbmRpZiAoUE9MSUNZIENNUDAwMjIpCisKKyMgTGlzdCBvZiBzb3VyY2UgZmlsZXMgZm9yIHRoZSBsaWJyYXJ5CitTRVQoTEZEUFJPVE9fU1JDCisJZmRwcm90by1pbnRlcm5hbC5oCisJZGljdGlvbmFyeS5jCisJZGljdGlvbmFyeV9mdW5jdGlvbnMuYworCWRpc3BhdGNoLmMKKwlmaWZvLmMKKwlpbml0LmMKKwlsaXN0cy5jCisJbG9nLmMKKwltZXNzYWdlcy5jCisJb3N0ci5jCisJcG9ydGFiaWxpdHkuYworCXJ0X2RhdGEuYworCXNlc3Npb25zLmMKKwl1dGlscy5jCisJdmVyc2lvbi5jCisJKQorCisKKyMgU2F2ZSB0aGUgbGlzdCBvZiBmaWxlcyBmb3IgdGVzdGNhc2VzIGluIHRoZSBjb3JlJ3MgZGlyZWN0b3J5CitTRVQoTEZEUFJPVE9fU1JDICR7TEZEUFJPVE9fU1JDfSBQQVJFTlRfU0NPUEUpCisKKyMgSW5jbHVkZSBwYXRoCitJTkNMVURFX0RJUkVDVE9SSUVTKCR7TEZEUFJPVE9fSU5DTFVERVN9KQorCisjIEJ1aWxkIGFzIGEgc2hhcmVkIGxpYnJhcnkKK0FERF9MSUJSQVJZKGxpYmZkcHJvdG8gU0hBUkVEICR7TEZEUFJPVE9fU1JDfSkKKworQUREX0RFUEVOREVOQ0lFUyhsaWJmZHByb3RvIHZlcnNpb25faW5mb3JtYXRpb24pCisKKyMgQXZvaWQgdGhlIGxpYmxpYiBuYW1lLCBhbmQgc2V0IHRoZSB2ZXJzaW9uCitTRVRfVEFSR0VUX1BST1BFUlRJRVMobGliZmRwcm90byBQUk9QRVJUSUVTIAorCU9VVFBVVF9OQU1FICJmZHByb3RvIgorCVNPVkVSU0lPTiAke0ZEX1BST0pFQ1RfVkVSU0lPTl9BUEl9CisJVkVSU0lPTiAke0ZEX1BST0pFQ1RfVkVSU0lPTl9NQUpPUn0uJHtGRF9QUk9KRUNUX1ZFUlNJT05fTUlOT1J9LiR7RkRfUFJPSkVDVF9WRVJTSU9OX1JFVn0KKwlMSU5LX0lOVEVSRkFDRV9MSUJSQVJJRVMgIiR7TEZEUFJPVE9fTElOS19JTlRFUkZBQ0VTfSIpCisKKyMgVGhlIGxpYnJhcnkgaXRzZWxmIG5lZWRzIG90aGVyIGxpYnJhcmllcyAKK1RBUkdFVF9MSU5LX0xJQlJBUklFUyhsaWJmZHByb3RvICR7TEZEUFJPVE9fTElCU30pCisKKworIyMjIworIyMgSU5TVEFMTCBzZWN0aW9uICMjCisKK0lOU1RBTEwoVEFSR0VUUyBsaWJmZHByb3RvCisJTElCUkFSWSBERVNUSU5BVElPTiAke0lOU1RBTExfTElCUkFSWV9TVUZGSVh9CisJQ09NUE9ORU5UIGZyZWVEaWFtZXRlci1jb21tb24pCisKZGlmZiAtLWdpdCBhL2xpYmZkcHJvdG8vZGljdGlvbmFyeS5jIGIvbGliZmRwcm90by9kaWN0aW9uYXJ5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY5MDJhMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmZkcHJvdG8vZGljdGlvbmFyeS5jCkBAIC0wLDAgKzEsMjMwNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTUsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiZmRwcm90by1pbnRlcm5hbC5oIgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKy8qIE5hbWVzIG9mIHRoZSBiYXNlIHR5cGVzICovCitjb25zdCBjaGFyICogdHlwZV9iYXNlX25hbWVbXSA9IHsgLyogbXVzdCBrZWVwIGluIHN5bmMgd2l0aCBkaWN0X2F2cF9iYXNldHlwZSAqLworCSJHUk9VUEVEIiwgCS8qIEFWUF9UWVBFX0dST1VQRUQgKi8KKwkiT0NURVRTVFJJTkciLCAJLyogQVZQX1RZUEVfT0NURVRTVFJJTkcgKi8KKwkiSU5URUdFUjMyIiwgCS8qIEFWUF9UWVBFX0lOVEVHRVIzMiAqLworCSJJTlRFR0VSNjQiLCAJLyogQVZQX1RZUEVfSU5URUdFUjY0ICovCisJIlVOU0lHTkVEMzIiLCAJLyogQVZQX1RZUEVfVU5TSUdORUQzMiAqLworCSJVTlNJR05FRDY0IiwgCS8qIEFWUF9UWVBFX1VOU0lHTkVENjQgKi8KKwkiRkxPQVQzMiIsIAkvKiBBVlBfVFlQRV9GTE9BVDMyICovCisJIkZMT0FUNjQiCS8qIEFWUF9UWVBFX0ZMT0FUNjQgKi8KKwl9OworCisvKiBUaGUgbnVtYmVyIG9mIGxpc3RzIGluIGFuIG9iamVjdCAqLworI2RlZmluZSBOQl9MSVNUU19QRVJfT0JKCTMKKworLyogU29tZSBleWUgY2F0Y2hlcnMgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgT0JKRUNUX0VZRUNBVENIRVIJKDB4MGIxM2M3KQorI2RlZmluZSBESUNUX0VZRUNBVENIRVIJCSgweDAwZDFjNykKKworLyogRGVmaW5pdGlvbiBvZiB0aGUgZGljdGlvbmFyeSBvYmplY3RzICovCitzdHJ1Y3QgZGljdF9vYmplY3QgeworCWVudW0gZGljdF9vYmplY3RfdHlwZQl0eXBlOwkvKiBXaGF0IHR5cGUgb2Ygb2JqZWN0IGlzIHRoaXM/ICovCisJaW50CQkJb2JqZXllYzsvKiBleWVjYXRjaGVyIGZvciB0aGlzIG9iamVjdCAqLworCWludAkJCXR5cGV5ZWM7LyogZXllY2F0Y2hlciBmb3IgdGhpcyB0eXBlIG9mIG9iamVjdCAqLworCXN0cnVjdCBkaWN0aW9uYXJ5CSpkaWNvOyAgLyogVGhlIGRpY3Rpb25hcnkgdGhpcyBvYmplY3QgYmVsb25ncyB0byAqLworCQorCXVuaW9uIHsKKwkJc3RydWN0IGRpY3RfdmVuZG9yX2RhdGEJCXZlbmRvcjsJCS8qIGRhdGFzdHJfbGVuID0gc3RybGVuKHZlbmRvcl9uYW1lKSAqLworCQlzdHJ1Y3QgZGljdF9hcHBsaWNhdGlvbl9kYXRhCWFwcGxpY2F0aW9uOwkvKiBkYXRhc3RyX2xlbiA9IHN0cmxlbihhcHBsaWNhdGlvbl9uYW1lKSAqLworCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEJCXR5cGU7CQkvKiBkYXRhc3RyX2xlbiA9IHN0cmxlbih0eXBlX25hbWUpICovCisJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YQllbnVtdmFsOwkvKiBkYXRhc3RyX2xlbiA9IHN0cmxlbihlbnVtX25hbWUpICovCisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhCQlhdnA7CQkvKiBkYXRhc3RyX2xlbiA9IHN0cmxlbihhdnBfbmFtZSkgKi8KKwkJc3RydWN0IGRpY3RfY21kX2RhdGEJCWNtZDsJCS8qIGRhdGFzdHJfbGVuID0gc3RybGVuKGNtZF9uYW1lKSAqLworCQlzdHJ1Y3QgZGljdF9ydWxlX2RhdGEJCXJ1bGU7CQkvKiBkYXRhc3RyX2xlbiA9IDAgKi8KKwl9IGRhdGE7CQkJCS8qIFRoZSBkYXRhIG9mIHRoaXMgb2JqZWN0ICovCisJCisJc2l6ZV90CQkJZGF0YXN0cl9sZW47IC8qIGNhY2hlZCBsZW5ndGggb2YgdGhlIHN0cmluZyBpbnNpZGUgdGhlIGRhdGEuIFNhdmVkIHdoZW4gdGhlIG9iamVjdCBpcyBjcmVhdGVkLiAqLworCQorCXN0cnVjdCBkaWN0X29iamVjdCAqCXBhcmVudDsgLyogVGhlIHBhcmVudCBvZiB0aGlzIG9iamVjdCwgaWYgYW55ICovCisJCisJc3RydWN0IGZkX2xpc3QJCWxpc3RbTkJfTElTVFNfUEVSX09CSl07LyogdXNlZCB0byBjaGFpbiBvYmplY3RzLiovCisJLyogTW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbGlzdHMgOgorCQorCSAtIHRoZSB1c2UgZm9yIGVhY2ggbGlzdCBkZXBlbmRzIG9uIHRoZSB0eXBlIG9mIG9iamVjdC4gU2VlIGRldGFpbCBiZWxvdy4KKwkgCisJIC0gYSBzZW50aW5lbCBmb3IgYSBsaXN0IGhhcyBpdHMgJ28nIGZpZWxkIGNsZWFyZWQuICh0aGlzIGlzIHRoZSBjcml0ZXJpYSB0byBkZXRlY3QgZW5kIG9mIGEgbG9vcCkKKwkgCisJIC0gVGhlIGxpc3RzIGFyZSBhbHdheXMgb3JkZXJlZC4gVGhlIGNyaXRlcmlhIGFyZSBkZXNjcmliZWQgYmVsb3cuIHRoZSBmdW5jdGlvbnMgdG8gb3JkZXIgdGhlbSBhcmUgcmVmZXJlbmNlZCBpbiBkaWN0X29ial9pbmZvCisJIAorCSAtIFRoZSBkaWN0X2xvY2sgbXVzdCBiZSBoZWxkIGZvciBhbnkgbGlzdCBvcGVyYXRpb24uCisJIAorCSA9PiBWRU5ET1JTOgorCSBsaXN0WzBdOiBsaXN0IG9mIHRoZSB2ZW5kb3JzLCBvcmRlcmVkIGJ5IHRoZWlyIGlkLiBUaGUgc2VudGluZWwgaXMgZ19kaWN0X3ZlbmRvcnMgKHZlbmRvciB3aXRoIGlkIDApCisJIGxpc3RbMV06IHNlbnRpbmVsIGZvciB0aGUgbGlzdCBvZiBBVlBzIGZyb20gdGhpcyB2ZW5kb3IsIG9yZGVyZWQgYnkgQVZQIGNvZGUuCisJIGxpc3RbMl06IHNlbnRpbmVsIGZvciB0aGUgbGlzdCBvZiBBVlBzIGZyb20gdGhpcyB2ZW5kb3IsIG9yZGVyZWQgYnkgQVZQIG5hbWUgKGZkX29zX2NtcCkuCisJIAorCSA9PiBBUFBMSUNBVElPTlM6CisJIGxpc3RbMF06IGxpc3Qgb2YgdGhlIGFwcGxpY2F0aW9ucywgb3JkZXJlZCBieSB0aGVpciBpZC4gVGhlIHNlbnRpbmVsIGlzIGdfZGljdF9hcHBsaWNhdGlvbnMgKGFwcGxpY2F0aW9uIHdpdGggaWQgMCkKKwkgbGlzdFsxXTogbm90IHVzZWQKKwkgbGlzdFsyXTogbm90IHVzZWQuCisJIAorCSA9PiBUWVBFUzoKKwkgbGlzdFswXTogbGlzdCBvZiB0aGUgdHlwZXMsIG9yZGVyZWQgYnkgdGhlaXIgbmFtZXMuIFRoZSBzZW50aW5lbCBpcyBnX2xpc3RfdHlwZXMuCisJIGxpc3RbMV06IHNlbnRpbmVsIGZvciB0aGUgdHlwZV9lbnVtIGxpc3Qgb2YgdGhpcyB0eXBlLCBvcmRlcmVkIGJ5IHRoZWlyIGNvbnN0YW50IG5hbWUgKGZkX29zX2NtcCkuCisJIGxpc3RbMl06IHNlbnRpbmVsIGZvciB0aGUgdHlwZV9lbnVtIGxpc3Qgb2YgdGhpcyB0eXBlLCBvcmRlcmVkIGJ5IHRoZWlyIGNvbnN0YW50IHZhbHVlLgorCSAKKwkgPT4gVFlQRV9FTlVNUzoKKwkgbGlzdFswXTogbGlzdCBvZiB0aGUgY29udGFudHMgZm9yIGEgZ2l2ZW4gdHlwZSwgb3JkZXJlZCBieSB0aGUgY29uc3RhbnQgbmFtZSAoZmRfb3NfY21wKS4gU2VudGluZWwgaXMgYSAobGlzdFsxXSkgZWxlbWVudCBvZiBhIFRZUEUgb2JqZWN0LgorCSBsaXN0WzFdOiBsaXN0IG9mIHRoZSBjb250YW50cyBmb3IgYSBnaXZlbiB0eXBlLCBvcmRlcmVkIGJ5IHRoZSBjb25zdGFudCB2YWx1ZS4gU2VudGluZWwgaXMgYSAobGlzdFsyXSkgZWxlbWVudCBvZiBhIFRZUEUgb2JqZWN0LgorCSBsaXN0WzJdOiBub3QgdXNlZAorCSAKKwkgPT4gQVZQUzoKKwkgbGlzdFswXTogbGlzdCBvZiB0aGUgQVZQIGZyb20gYSBnaXZlbiB2ZW5kb3IsIG9yZGVyZWQgYnkgYXZwIGNvZGUuIFNlbnRpbmVsIGlzIGEgbGlzdFsxXSBlbGVtZW50IG9mIGEgVkVORE9SIG9iamVjdC4KKwkgbGlzdFsxXTogbGlzdCBvZiB0aGUgQVZQIGZyb20gYSBnaXZlbiB2ZW5kb3IsIG9yZGVyZWQgYnkgYXZwIG5hbWUgKGZkX29zX2NtcCkuIFNlbnRpbmVsIGlzIGEgbGlzdFsyXSBlbGVtZW50IG9mIGEgVkVORE9SIG9iamVjdC4KKwkgbGlzdFsyXTogc2VudGluZWwgZm9yIHRoZSBydWxlIGxpc3QgdGhhdCBhcHBseSB0byB0aGlzIEFWUC4KKwkgCisJID0+IENPTU1BTkRTOgorCSBsaXN0WzBdOiBsaXN0IG9mIHRoZSBjb21tYW5kcywgb3JkZXJlZCBieSB0aGVpciBuYW1lcyAoZmRfb3NfY21wKS4gVGhlIHNlbnRpbmVsIGlzIGdfbGlzdF9jbWRfbmFtZS4KKwkgbGlzdFsxXTogbGlzdCBvZiB0aGUgY29tbWFuZHMsIG9yZGVyZWQgYnkgdGhlaXIgY29tbWFuZCBjb2RlIGFuZCAnUicgZmxhZy4gVGhlIHNlbnRpbmVsIGlzIGdfbGlzdF9jbWRfY29kZS4KKwkgbGlzdFsyXTogc2VudGluZWwgZm9yIHRoZSBydWxlIGxpc3QgdGhhdCBhcHBseSB0byB0aGlzIGNvbW1hbmQuCisJIAorCSA9PiBSVUxFUzoKKwkgbGlzdFswXTogbGlzdCBvZiB0aGUgcnVsZXMgZm9yIGEgZ2l2ZW4gKGdyb3VwZWQpIEFWUCBvciBDb21tYW5kLCBvcmRlcmVkIGJ5IHRoZSBBVlAgdmVuZG9yICYgY29kZSB0byB3aGljaCB0aGV5IHJlZmVyLiBzZW50aW5lbCBpcyBsaXN0WzJdIG9mIGEgY29tbWFuZCBvciAoZ3JvdXBlZCkgYXZwLgorCSBsaXN0WzFdOiBub3QgdXNlZAorCSBsaXN0WzJdOiBub3QgdXNlZC4KKwkgCisJICovCisJIAorCSAvKiBTZW50aW5lbCBmb3IgdGhlIGRpc3BhdGNoIGNhbGxiYWNrcyAqLworCSBzdHJ1Y3QgZmRfbGlzdAkJZGlzcF9jYnM7CisJCit9OworCisvKiBEZWZpbml0aW9uIG9mIHRoZSBkaWN0aW9uYXJ5IHN0cnVjdHVyZSAqLworc3RydWN0IGRpY3Rpb25hcnkgeworCWludAkJIAlkaWN0X2V5ZWM7CQkvKiBFeWUtY2F0Y2hlciBmb3IgdGhlIGRpY3Rpb25hcnkgKERJQ1RfRVlFQ0FUQ0hFUikgKi8KKwkKKwlwdGhyZWFkX3J3bG9ja190IAlkaWN0X2xvY2s7CQkvKiBUaGUgZ2xvYmFsIHJ3bG9jayBmb3IgdGhlIGRpY3Rpb25hcnkgKi8KKwkKKwlzdHJ1Y3QgZGljdF9vYmplY3QJZGljdF92ZW5kb3JzOwkJLyogU2VudGluZWwgZm9yIHRoZSBsaXN0IG9mIHZlbmRvcnMsIGNvcnJlc3BvbmRpbmcgdG8gdmVuZG9yIDAgKi8KKwlzdHJ1Y3QgZGljdF9vYmplY3QJZGljdF9hcHBsaWNhdGlvbnM7CS8qIFNlbnRpbmVsIGZvciB0aGUgbGlzdCBvZiBhcHBsaWNhdGlvbnMsIGNvcnJlc3BvbmRpbmcgdG8gYXBwIDAgKi8KKwlzdHJ1Y3QgZmRfbGlzdAkJZGljdF90eXBlczsJCS8qIFNlbnRpbmVsIGZvciB0aGUgbGlzdCBvZiB0eXBlcyAqLworCXN0cnVjdCBmZF9saXN0CQlkaWN0X2NtZF9uYW1lOwkJLyogU2VudGluZWwgZm9yIHRoZSBsaXN0IG9mIGNvbW1hbmRzLCBvcmRlcmVkIGJ5IG5hbWVzICovCisJc3RydWN0IGZkX2xpc3QJCWRpY3RfY21kX2NvZGU7CQkvKiBTZW50aW5lbCBmb3IgdGhlIGxpc3Qgb2YgY29tbWFuZHMsIG9yZGVyZWQgYnkgY29kZXMgKi8KKwkKKwlzdHJ1Y3QgZGljdF9vYmplY3QJZGljdF9jbWRfZXJyb3I7CQkvKiBTcGVjaWFsIGNvbW1hbmQgb2JqZWN0IGZvciBhbnN3ZXJzIHdpdGggdGhlICdFJyBiaXQgc2V0ICovCisJCisJaW50CQkJZGljdF9jb3VudFtESUNUX1RZUEVfTUFYICsgMV07IC8qIE51bWJlciBvZiBvYmplY3RzIG9mIGVhY2ggdHlwZSAqLworfTsKKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgb2YgZHVtcCBmdW5jdGlvbnMgKi8KK3N0YXRpYyBERUNMQVJFX0ZEX0RVTVBfUFJPVE9UWVBFKGR1bXBfdmVuZG9yX2RhdGEsIHZvaWQgKiBkYXRhICk7CitzdGF0aWMgREVDTEFSRV9GRF9EVU1QX1BST1RPVFlQRShkdW1wX2FwcGxpY2F0aW9uX2RhdGEsIHZvaWQgKiBkYXRhICk7CitzdGF0aWMgREVDTEFSRV9GRF9EVU1QX1BST1RPVFlQRShkdW1wX3R5cGVfZGF0YSwgdm9pZCAqIGRhdGEgKTsKKyAgLyogdGhlIGR1bXAgZnVuY3Rpb24gZm9yIGVudW0gaGFzIGEgZGlmZmVyZW50IHByb3RvdHlwZSBzaW5jZSBpdCBuZWVkIHRoZSBkYXRhdHlwZSAqLworc3RhdGljIERFQ0xBUkVfRkRfRFVNUF9QUk9UT1RZUEUoZHVtcF9hdnBfZGF0YSwgdm9pZCAqIGRhdGEgKTsKK3N0YXRpYyBERUNMQVJFX0ZEX0RVTVBfUFJPVE9UWVBFKGR1bXBfY29tbWFuZF9kYXRhLCB2b2lkICogZGF0YSApOworc3RhdGljIERFQ0xBUkVfRkRfRFVNUF9QUk9UT1RZUEUoZHVtcF9ydWxlX2RhdGEsIHZvaWQgKiBkYXRhICk7CisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zIG9mIHNlYXJjaCBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgc2VhcmNoX3ZlbmRvciAJKCBzdHJ1Y3QgZGljdGlvbmFyeSAqIGRpY3QsIGludCBjcml0ZXJpYSwgY29uc3Qgdm9pZCAqIHdoYXQsIHN0cnVjdCBkaWN0X29iamVjdCAqKnJlc3VsdCApOworc3RhdGljIGludCBzZWFyY2hfYXBwbGljYXRpb24gICAoIHN0cnVjdCBkaWN0aW9uYXJ5ICogZGljdCwgaW50IGNyaXRlcmlhLCBjb25zdCB2b2lkICogd2hhdCwgc3RydWN0IGRpY3Rfb2JqZWN0ICoqcmVzdWx0ICk7CitzdGF0aWMgaW50IHNlYXJjaF90eXBlIAkJKCBzdHJ1Y3QgZGljdGlvbmFyeSAqIGRpY3QsIGludCBjcml0ZXJpYSwgY29uc3Qgdm9pZCAqIHdoYXQsIHN0cnVjdCBkaWN0X29iamVjdCAqKnJlc3VsdCApOworc3RhdGljIGludCBzZWFyY2hfZW51bXZhbCAJKCBzdHJ1Y3QgZGljdGlvbmFyeSAqIGRpY3QsIGludCBjcml0ZXJpYSwgY29uc3Qgdm9pZCAqIHdoYXQsIHN0cnVjdCBkaWN0X29iamVjdCAqKnJlc3VsdCApOworc3RhdGljIGludCBzZWFyY2hfYXZwCQkoIHN0cnVjdCBkaWN0aW9uYXJ5ICogZGljdCwgaW50IGNyaXRlcmlhLCBjb25zdCB2b2lkICogd2hhdCwgc3RydWN0IGRpY3Rfb2JqZWN0ICoqcmVzdWx0ICk7CitzdGF0aWMgaW50IHNlYXJjaF9jbWQJCSggc3RydWN0IGRpY3Rpb25hcnkgKiBkaWN0LCBpbnQgY3JpdGVyaWEsIGNvbnN0IHZvaWQgKiB3aGF0LCBzdHJ1Y3QgZGljdF9vYmplY3QgKipyZXN1bHQgKTsKK3N0YXRpYyBpbnQgc2VhcmNoX3J1bGUJCSggc3RydWN0IGRpY3Rpb25hcnkgKiBkaWN0LCBpbnQgY3JpdGVyaWEsIGNvbnN0IHZvaWQgKiB3aGF0LCBzdHJ1Y3QgZGljdF9vYmplY3QgKipyZXN1bHQgKTsKKworLyogVGhlIGZvbGxvd2luZyBhcnJheSBjb250YWlucyBsb3Qgb2YgZGF0YSBhYm91dCB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIG9iamVjdHMsIGZvciBhdXRvbWF0ZWQgaGFuZGxpbmcgKi8KK3N0YXRpYyBzdHJ1Y3QgeworCWVudW0gZGljdF9vYmplY3RfdHlwZSAJdHlwZTsgCQkvKiBpbmZvcm1hdGlvbiBmb3IgdGhpcyB0eXBlICovCisJY2hhciAqCQkJbmFtZTsJCS8qIHN0cmluZyBkZXNjcmliaW5nIHRoaXMgb2JqZWN0LCBmb3IgZGVidWcgKi8KKwlzaXplX3QJCQlkYXRhc2l6ZTsJLyogVGhlIHNpemUgb2YgdGhlIGRhdGEgc3RydWN0dXJlICovCisJaW50CQkJcGFyZW50OwkJLyogMDogbmV2ZXI7IDE6IG1heTsgMjogbXVzdCAqLworCWVudW0gZGljdF9vYmplY3RfdHlwZQlwYXJlbnR0eXBlOwkvKiBUaGUgdHlwZSBvZiB0aGUgcGFyZW50LCB3aGVuIHJlbGV2YW50ICovCisJaW50CQkJZXllY2F0Y2hlcjsJLyogQSBraW5kIG9mIHNpZ25hdHVyZSBmb3IgdGhpcyBvYmplY3QgKi8KKwlERUNMQVJFX0ZEX0RVTVBfUFJPVE9UWVBFKCAoKmR1bXBfZGF0YSksIHZvaWQgKiBkYXRhICk7CS8qIFRoZSBmdW5jdGlvbiB0byBkdW1wIHRoZSBkYXRhIHNlY3Rpb24gKi8KKwlpbnQgCQkgICAgICAoKnNlYXJjaF9mY3QpKHN0cnVjdCBkaWN0aW9uYXJ5ICogZGljdCwgaW50IGNyaXRlcmlhLCBjb25zdCB2b2lkICogd2hhdCwgc3RydWN0IGRpY3Rfb2JqZWN0ICoqcmVzdWx0ICk7OwkvKiBUaGUgZnVuY3Rpb24gdG8gc2VhcmNoIGFuIG9iamVjdCBvZiB0aGlzIHR5cGUgKi8KKwlpbnQJCQloYXNsaXN0W05CX0xJU1RTX1BFUl9PQkpdOwkvKiBUZWxsIGlmIHRoaXMgbGlzdCBpcyB1c2VkICovCit9IGRpY3Rfb2JqX2luZm9bXSA9IHsgeyAwLCAiKGVycm9yKSIsIDAsIDAsIDAsIDAsIE5VTEwsIE5VTEwsIHswLCAwLCAwfSB9CisKKwkvKiB0eXBlCQkJIG5hbWUJCWRhdGFzaXplCQkgICAJICBwYXJlbnQgIAlwYXJlbnR0eXBlIAorCQkJZXllY2F0Y2hlcgkJZHVtcF9kYXRhCSAgCXNlYXJjaF9mY3QsCQloYXNsaXN0W10gCSovCisKKwkseyBESUNUX1ZFTkRPUiwJCSJWRU5ET1IiLAlzaXplb2Yoc3RydWN0IGRpY3RfdmVuZG9yX2RhdGEpLAkwLCAJMCwKKwkJCU9CSkVDVF9FWUVDQVRDSEVSICsgMSwgCWR1bXBfdmVuZG9yX2RhdGEsIAlzZWFyY2hfdmVuZG9yLCAJCXsgMSwgMCwgMCB9IH0KKwkKKwkseyBESUNUX0FQUExJQ0FUSU9OLAkiQVBQTElDQVRJT04iLAlzaXplb2Yoc3RydWN0IGRpY3RfYXBwbGljYXRpb25fZGF0YSksCTEsIAlESUNUX1ZFTkRPUiwKKwkJCU9CSkVDVF9FWUVDQVRDSEVSICsgMiwJZHVtcF9hcHBsaWNhdGlvbl9kYXRhLAlzZWFyY2hfYXBwbGljYXRpb24sCXsgMSwgMCwgMCB9IH0KKwkKKwkseyBESUNUX1RZUEUsCQkiVFlQRSIsCQlzaXplb2Yoc3RydWN0IGRpY3RfdHlwZV9kYXRhKSwJCTEsIAlESUNUX0FQUExJQ0FUSU9OLAorCQkJT0JKRUNUX0VZRUNBVENIRVIgKyAzLAlkdW1wX3R5cGVfZGF0YSwJCXNlYXJjaF90eXBlLAkJeyAxLCAwLCAwIH0gfQorCQorCSx7IERJQ1RfRU5VTVZBTCwJIkVOVU1WQUwiLAlzaXplb2Yoc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhKSwJMiwgCURJQ1RfVFlQRSwKKwkJCU9CSkVDVF9FWUVDQVRDSEVSICsgNCwJTlVMTCwJCQlzZWFyY2hfZW51bXZhbCwJeyAxLCAxLCAwIH0gfQorCQorCSx7IERJQ1RfQVZQLAkJIkFWUCIsCQlzaXplb2Yoc3RydWN0IGRpY3RfYXZwX2RhdGEpLAkJMSwgCURJQ1RfVFlQRSwKKwkJCU9CSkVDVF9FWUVDQVRDSEVSICsgNSwJZHVtcF9hdnBfZGF0YSwJCXNlYXJjaF9hdnAsCQl7IDEsIDEsCTAgfSB9CisJCisJLHsgRElDVF9DT01NQU5ELAkiQ09NTUFORCIsCXNpemVvZihzdHJ1Y3QgZGljdF9jbWRfZGF0YSksCQkxLCAJRElDVF9BUFBMSUNBVElPTiwKKwkJCU9CSkVDVF9FWUVDQVRDSEVSICsgNiwJZHVtcF9jb21tYW5kX2RhdGEsCXNlYXJjaF9jbWQsCQl7IDEsIDEsIDAgfSB9CisJCisJLHsgRElDVF9SVUxFLAkJIlJVTEUiLAkJc2l6ZW9mKHN0cnVjdCBkaWN0X3J1bGVfZGF0YSksCQkyLCAJLTEgLyogc3BlY2lhbCBjYXNlOiBncm91cGVkIGF2cCBvciBjb21tYW5kICovLAorCQkJT0JKRUNUX0VZRUNBVENIRVIgKyA3LAlkdW1wX3J1bGVfZGF0YSwJCXNlYXJjaF9ydWxlLAkJeyAxLCAwLCAwIH0gfQorCQorfTsKKwkKKy8qIE1hY3JvIHRvIHZlcmlmeSBhICJ0eXBlIiB2YWx1ZSAqLworI2RlZmluZSBDSEVDS19UWVBFKCB0eXBlICkgKCAoKHR5cGUpID4gMCkgJiYgKCh0eXBlKSA8PSBESUNUX1RZUEVfTUFYKSApCisKKy8qIENhc3QgbWFjcm8gKi8KKyNkZWZpbmUgX08oIG9iamVjdCApICgoc3RydWN0IGRpY3Rfb2JqZWN0ICopIChvYmplY3QpKQorCisvKiBHZXQgaW5mb3JtYXRpb24gbGluZSBmb3IgYSBnaXZlbiBvYmplY3QgKi8KKyNkZWZpbmUgX09CSU5GTyhvYmplY3QpIChkaWN0X29ial9pbmZvW0NIRUNLX1RZUEUoX08ob2JqZWN0KS0+dHlwZSkgPyBfTyhvYmplY3QpLT50eXBlIDogMF0pCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdHMgbWFuYWdlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBGdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBvYmplY3RzIGNyZWF0aW9uIGFuZCBkZXN0cnVjdGlvbi4gKi8KKworLyogRHVwbGljYXRlIGEgc3RyaW5nIGlucGxhY2UsIHNhdmUgaXRzIGxlbmd0aCAqLworI2RlZmluZSBEVVBfc3RyaW5nX2xlbiggc3RyLCBwbGVuICkgewkJXAorCSoocGxlbikgPSBzdHJsZW4oKHN0cikpOwkJXAorCXN0ciA9IG9zMGR1cCggc3RyLCAqKHBsZW4pKTsJCVwKK30KKwkKKy8qIEluaXRpYWxpemUgYW4gb2JqZWN0ICovCitzdGF0aWMgdm9pZCBpbml0X29iamVjdCggc3RydWN0IGRpY3Rfb2JqZWN0ICogb2JqLCBlbnVtIGRpY3Rfb2JqZWN0X3R5cGUgdHlwZSApCit7CisJaW50IGk7CisJCisJVFJBQ0VfRU5UUlkoIiVwICVkIiwgb2JqLCB0eXBlKTsKKwkKKwkvKiBDbGVhbiB0aGUgb2JqZWN0IGZpcnN0ICovCisJbWVtc2V0ICggb2JqLCAwLCBzaXplb2Yoc3RydWN0IGRpY3Rfb2JqZWN0KSk7CisJCisJQ0hFQ0tfUEFSQU1TX0RPKCAgQ0hFQ0tfVFlQRSh0eXBlKSwgIHJldHVybiAgKTsKKworCW9iai0+dHlwZSA9IHR5cGU7CisJb2JqLT5vYmpleWVjID0gT0JKRUNUX0VZRUNBVENIRVI7CisJb2JqLT50eXBleWVjID0gX09CSU5GTyhvYmopLmV5ZWNhdGNoZXI7CisKKwkvKiBXZSBkb24ndCBpbml0aWFsaXplIHRoZSBkYXRhIG5vciB0aGUgcGFyZW50IGhlcmUgKi8KKwkKKwkvKiBOb3cgaW5pdCB0aGUgbGlzdHMgKi8KKwlmb3IgKGk9MDsgaTxOQl9MSVNUU19QRVJfT0JKOyBpKyspIHsKKwkJaWYgKF9PQklORk8ob2JqKS5oYXNsaXN0W2ldICE9IDApIAorCQkJZmRfbGlzdF9pbml0KCZvYmotPmxpc3RbaV0sIG9iaik7CisJCWVsc2UKKwkJCWZkX2xpc3RfaW5pdCgmb2JqLT5saXN0W2ldLCBOVUxMKTsKKwl9CisJCisJZmRfbGlzdF9pbml0KCZvYmotPmRpc3BfY2JzLCBOVUxMKTsKK30KKworLyogSW5pdGlhbGl6ZSB0aGUgImRhdGEiIHBhcnQgb2YgYW4gb2JqZWN0ICovCitzdGF0aWMgaW50IGluaXRfb2JqZWN0X2RhdGEoc3RydWN0IGRpY3Rfb2JqZWN0ICogZGVzdCwgdm9pZCAqIHNvdXJjZSwgZW51bSBkaWN0X29iamVjdF90eXBlIHR5cGUsIGludCBkdXBvcykKK3sKKwlUUkFDRV9FTlRSWSgiJXAgJXAgJWQiLCBkZXN0LCBzb3VyY2UsIHR5cGUpOworCUNIRUNLX1BBUkFNUyggZGVzdCAmJiBzb3VyY2UgJiYgQ0hFQ0tfVFlQRSh0eXBlKSApOworCQorCS8qIEdlbmVyaWM6IGNvcHkgdGhlIGZ1bGwgZGF0YSBzdHJ1Y3R1cmUgKi8JCisJbWVtY3B5KCAmZGVzdC0+ZGF0YSwgc291cmNlLCBkaWN0X29ial9pbmZvW3R5cGVdLmRhdGFzaXplICk7CisJCisJLyogVGhlbiBzdHJpbmdzIG11c3QgYmUgZHVwbGljYXRlZCwgbm90IGNvcGllZCAqLworCS8qIFRoaXMgZnVuY3Rpb24gbWlnaHQgYmUgc2ltcGxpZmllZCBieSBhbHdheXMgZGVmaW5pbmcgdGhlICJuYW1lIiBmaWVsZCBhcyB0aGUgZmlyc3QgZmllbGQgb2YgdGhlIHN0cnVjdHVyZXMsIGJ1dC4uLiBpdCdzIGVycm9yLXByb25lICovCisJc3dpdGNoICh0eXBlKSB7CisJCWNhc2UgRElDVF9WRU5ET1I6CisJCQlEVVBfc3RyaW5nX2xlbiggZGVzdC0+ZGF0YS52ZW5kb3IudmVuZG9yX25hbWUsICZkZXN0LT5kYXRhc3RyX2xlbiApOworCQkJYnJlYWs7CisJCQorCQljYXNlIERJQ1RfQVBQTElDQVRJT046CisJCQlEVVBfc3RyaW5nX2xlbiggZGVzdC0+ZGF0YS5hcHBsaWNhdGlvbi5hcHBsaWNhdGlvbl9uYW1lLCAmZGVzdC0+ZGF0YXN0cl9sZW4gKTsKKwkJCWJyZWFrOworCQkJCisJCWNhc2UgRElDVF9UWVBFOgorCQkJRFVQX3N0cmluZ19sZW4oIGRlc3QtPmRhdGEudHlwZS50eXBlX25hbWUsICZkZXN0LT5kYXRhc3RyX2xlbiApOworCQkJYnJlYWs7CisJCQkKKwkJY2FzZSBESUNUX0VOVU1WQUw6CisJCQlEVVBfc3RyaW5nX2xlbiggZGVzdC0+ZGF0YS5lbnVtdmFsLmVudW1fbmFtZSwgJmRlc3QtPmRhdGFzdHJfbGVuICk7CisJCQlpZiAoZHVwb3MpIHsKKwkJCQkvLyB3ZSBhbHNvIG5lZWQgdG8gZHVwbGljYXRlIHRoZSBvY3RldHN0cmluZyBjb25zdGFudCB2YWx1ZSBzaW5jZSBpdCBpcyBhIHBvaW50ZXIuCisJCQkJZGVzdC0+ZGF0YS5lbnVtdmFsLmVudW1fdmFsdWUub3MuZGF0YSA9IG9zMGR1cCggCisJCQkJCQkoKHN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAqKXNvdXJjZSktPmVudW1fdmFsdWUub3MuZGF0YSwgCisJCQkJCQkoKHN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSAqKXNvdXJjZSktPmVudW1fdmFsdWUub3MubGVuCisJCQkJCSk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIERJQ1RfQVZQOgorCQkJRFVQX3N0cmluZ19sZW4oIGRlc3QtPmRhdGEuYXZwLmF2cF9uYW1lLCAmZGVzdC0+ZGF0YXN0cl9sZW4gKTsKKwkJCWJyZWFrOworCQkJCisJCWNhc2UgRElDVF9DT01NQU5EOgorCQkJRFVQX3N0cmluZ19sZW4oIGRlc3QtPmRhdGEuY21kLmNtZF9uYW1lLCAmZGVzdC0+ZGF0YXN0cl9sZW4gKTsKKwkJCWJyZWFrOworCQkKKwkJZGVmYXVsdDoKKwkJCS8qIE5vdGhpbmcgdG8gZG8gZm9yIFJVTEVTICovCisJCQk7CisJfQorCQorCXJldHVybiAwOworfQorCisvKiBDaGVjayB0aGF0IGFuIG9iamVjdCBpcyB2YWxpZCAoMTogT0ssIDA6IGVycm9yKSAqLworc3RhdGljIGludCB2ZXJpZnlfb2JqZWN0KCBzdHJ1Y3QgZGljdF9vYmplY3QgKiBvYmogKQoreworCVRSQUNFX0VOVFJZKCIlcCIsIG9iaik7CisJCisJQ0hFQ0tfUEFSQU1TX0RPKCAgb2JqCisJCQkmJiAob2JqLT5vYmpleWVjID09IE9CSkVDVF9FWUVDQVRDSEVSKQorCQkJJiYgQ0hFQ0tfVFlQRShvYmotPnR5cGUpCisJCQkmJiAob2JqLT50eXBleWVjID09IGRpY3Rfb2JqX2luZm9bb2JqLT50eXBlXS5leWVjYXRjaGVyKSwKKwkJeworCQkJaWYgKG9iaikgeworCQkJCVRSQUNFX0RFQlVHKEZVTEwsICJJbnZhbGlkIG9iamVjdDogJXAsIG9iai0+b2JqZXllYzogJXgvJXgsIG9iai0+dHlwZTogJWQsIG9iai0+b2JqZXllYzogJXgvJXgsIG9iai0+dHlwZXllYzogJXgvJXgiLAorCQkJCQkJb2JqLAorCQkJCQkJb2JqLT5vYmpleWVjLCBPQkpFQ1RfRVlFQ0FUQ0hFUiwKKwkJCQkJCW9iai0+dHlwZSwKKwkJCQkJCW9iai0+b2JqZXllYywgT0JKRUNUX0VZRUNBVENIRVIsCisJCQkJCQlvYmotPnR5cGV5ZWMsIF9PQklORk8ob2JqKS5leWVjYXRjaGVyKTsKKwkJCX0gZWxzZSB7CisJCQkJVFJBQ0VfREVCVUcoRlVMTCwgIkludmFsaWQgb2JqZWN0IDogTlVMTCBwb2ludGVyIik7CisJCQl9CisJCQlyZXR1cm4gMDsKKwkJfSAgKTsKKwkKKwkvKiBUaGUgb2JqZWN0IGlzIHByb2JhYmx5IHZhbGlkLiAqLworCXJldHVybiAxOworfQorCisvKiBGcmVlIHRoZSBkYXRhIGFzc29jaWF0ZWQgdG8gYW4gb2JqZWN0ICovCitzdGF0aWMgdm9pZCBkZXN0cm95X29iamVjdF9kYXRhKHN0cnVjdCBkaWN0X29iamVjdCAqIG9iaikKK3sKKwkvKiBUUkFDRV9FTlRSWSgiJXAiLCBvYmopOyAqLworCQorCXN3aXRjaCAob2JqLT50eXBlKSB7CisJCWNhc2UgRElDVF9WRU5ET1I6CisJCQlmcmVlKCBvYmotPmRhdGEudmVuZG9yLnZlbmRvcl9uYW1lICk7CisJCQlicmVhazsKKwkJCisJCWNhc2UgRElDVF9BUFBMSUNBVElPTjoKKwkJCWZyZWUoIG9iai0+ZGF0YS5hcHBsaWNhdGlvbi5hcHBsaWNhdGlvbl9uYW1lICk7CisJCQlicmVhazsKKwkJCQorCQljYXNlIERJQ1RfVFlQRToKKwkJCWZyZWUoIG9iai0+ZGF0YS50eXBlLnR5cGVfbmFtZSApOworCQkJYnJlYWs7CisJCQkKKwkJY2FzZSBESUNUX0VOVU1WQUw6CisJCQlmcmVlKCBvYmotPmRhdGEuZW51bXZhbC5lbnVtX25hbWUgKTsKKwkJCWJyZWFrOworCisJCWNhc2UgRElDVF9BVlA6CisJCQlmcmVlKCBvYmotPmRhdGEuYXZwLmF2cF9uYW1lICk7CisJCQlicmVhazsKKwkJCQorCQljYXNlIERJQ1RfQ09NTUFORDoKKwkJCWZyZWUoIG9iai0+ZGF0YS5jbWQuY21kX25hbWUgKTsKKwkJCWJyZWFrOworCQkKKwkJZGVmYXVsdDoKKwkJCS8qIG5vdGhpbmcgdG8gZG8gKi8KKwkJCTsKKwl9Cit9CisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb24gKi8KK3N0YXRpYyB2b2lkIGRlc3Ryb3lfb2JqZWN0KHN0cnVjdCBkaWN0X29iamVjdCAqIG9iaik7CisKKy8qIERlc3Ryb3kgYWxsIG9iamVjdHMgaW4gYSBsaXN0IC0gdGhlIGxvY2sgbXVzdCBiZSBoZWxkICovCitzdGF0aWMgdm9pZCBkZXN0cm95X2xpc3Qoc3RydWN0IGZkX2xpc3QgKiBoZWFkKSAKK3sKKwkvKiBUUkFDRV9FTlRSWSgiJXAiLCBoZWFkKTsgKi8KKwkKKwkvKiBsb29wIGluIHRoZSBsaXN0ICovCisJd2hpbGUgKCFGRF9JU19MSVNUX0VNUFRZKGhlYWQpKQorCXsKKwkJLyogV2hlbiBkZXN0cm95aW5nIHRoZSBvYmplY3QsIGl0IGlzIHVubGlua2VkIGZyb20gdGhlIGxpc3QgKi8KKwkJZGVzdHJveV9vYmplY3QoX08oaGVhZC0+bmV4dC0+bykpOworCX0KK30KKwkKKy8qIEZyZWUgYW4gb2JqZWN0IGFuZCBpdHMgc3VibGlzdHMgKi8KK3N0YXRpYyB2b2lkIGRlc3Ryb3lfb2JqZWN0KHN0cnVjdCBkaWN0X29iamVjdCAqIG9iaikKK3sKKwlpbnQgaTsKKwkKKwkvKiBUUkFDRV9FTlRSWSgiJXAiLCBvYmopOyAqLworCQorCS8qIFVwZGF0ZSBnbG9iYWwgY291bnQgKi8KKwlpZiAob2JqLT5kaWNvKSAKKwkJb2JqLT5kaWNvLT5kaWN0X2NvdW50W29iai0+dHlwZV0tLTsKKwkKKwkvKiBNYXJrIHRoZSBvYmplY3QgYXMgaW52YWxpZCAqLworCW9iai0+b2JqZXllYyA9IDB4ZGVhZDsKKwkKKwkvKiBGaXJzdCwgZGVzdHJveSB0aGUgZGF0YSBhc3NvY2lhdGVkIHRvIHRoZSBvYmplY3QgKi8KKwlkZXN0cm95X29iamVjdF9kYXRhKG9iaik7CisJCisJZm9yIChpPTA7IGk8TkJfTElTVFNfUEVSX09CSjsgaSsrKSB7CisJCWlmIChfT0JJTkZPKG9iaikuaGFzbGlzdFtpXSkKKwkJCS8qIHVubGluayB0aGUgZWxlbWVudCBmcm9tIHRoZSBsaXN0ICovCisJCQlmZF9saXN0X3VubGluayggJm9iai0+bGlzdFtpXSApOworCQllbHNlCisJCQkvKiBUaGlzIGlzIGVpdGhlciBhIHNlbnRpbmVsIG9yIHVudXNlZCAoPWVtdHB5KSBsaXN0LCBsZXQncyBkZXN0cm95IGl0ICovCisJCQlkZXN0cm95X2xpc3QoICZvYmotPmxpc3RbaV0gKTsKKwl9CisJCisJLyogVW5saW5rIGFsbCBlbGVtZW50cyBmcm9tIHRoZSBkaXNwYXRjaCBsaXN0OyB0aGV5IHdpbGwgYmUgZnJlZWQgd2hlbiBjYWxsYmFjayBpcyB1bnJlZ2lzdGVyZWQgKi8KKwlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9yd2xvY2tfd3Jsb2NrKCZmZF9kaXNwX2xvY2spLCAvKiBjb250aW51ZSAqLyApOworCXdoaWxlICghRkRfSVNfTElTVF9FTVBUWSgmb2JqLT5kaXNwX2NicykpIHsKKwkJZmRfbGlzdF91bmxpbmsoIG9iai0+ZGlzcF9jYnMubmV4dCApOworCX0KKwlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9yd2xvY2tfdW5sb2NrKCZmZF9kaXNwX2xvY2spLCAvKiBjb250aW51ZSAqLyApOworCQorCS8qIExhc3QsIGRlc3Ryb3kgdGhlIG9iamVjdCAqLworCWZyZWUob2JqKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGFyZSBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIENvbXBhcmUgdHdvIHZhbHVlcyAqLworI2RlZmluZSBPUkRFUl9zY2FsYXIoIGkxLCBpMiApIFwKKwkoKGkxIDwgaTIgKSA/IC0xIDogKCBpMSA+IGkyID8gMSA6IDAgKSkgCisKKworLyogQ29tcGFyZSB0d28gdmVuZG9yIG9iamVjdHMgYnkgdGhlaXIgaWQgKGNoZWNrcyBhbHJlYWR5IHBlcmZvcm1lZCkgKi8KK3N0YXRpYyBpbnQgb3JkZXJfdmVuZG9yX2J5X2lkICggc3RydWN0IGRpY3Rfb2JqZWN0ICpvMSwgc3RydWN0IGRpY3Rfb2JqZWN0ICpvMiApCit7CisJVFJBQ0VfRU5UUlkoIiVwICVwIiwgbzEsIG8yKTsKKwkKKwlyZXR1cm4gT1JERVJfc2NhbGFyKCBvMS0+ZGF0YS52ZW5kb3IudmVuZG9yX2lkLCBvMi0+ZGF0YS52ZW5kb3IudmVuZG9yX2lkICk7Cit9CisKKy8qIENvbXBhcmUgdHdvIGFwcGxpY2F0aW9uIG9iamVjdHMgYnkgdGhlaXIgaWQgKGNoZWNrcyBhbHJlYWR5IHBlcmZvcm1lZCkgKi8KK3N0YXRpYyBpbnQgb3JkZXJfYXBwbGlfYnlfaWQgICggc3RydWN0IGRpY3Rfb2JqZWN0ICpvMSwgc3RydWN0IGRpY3Rfb2JqZWN0ICpvMiApCit7CisJVFJBQ0VfRU5UUlkoIiVwICVwIiwgbzEsIG8yKTsKKwkKKwlyZXR1cm4gT1JERVJfc2NhbGFyKCBvMS0+ZGF0YS5hcHBsaWNhdGlvbi5hcHBsaWNhdGlvbl9pZCwgbzItPmRhdGEuYXBwbGljYXRpb24uYXBwbGljYXRpb25faWQgKTsKK30KKworLyogQ29tcGFyZSB0d28gdHlwZSBvYmplY3RzIGJ5IHRoZWlyIG5hbWUgKGNoZWNrcyBhbHJlYWR5IHBlcmZvcm1lZCkgKi8KK3N0YXRpYyBpbnQgb3JkZXJfdHlwZV9ieV9uYW1lICggc3RydWN0IGRpY3Rfb2JqZWN0ICpvMSwgc3RydWN0IGRpY3Rfb2JqZWN0ICpvMiApCit7CisJVFJBQ0VfRU5UUlkoIiVwICVwIiwgbzEsIG8yKTsKKwkKKwlyZXR1cm4gZmRfb3NfY21wKCBvMS0+ZGF0YS50eXBlLnR5cGVfbmFtZSwgbzEtPmRhdGFzdHJfbGVuLCBvMi0+ZGF0YS50eXBlLnR5cGVfbmFtZSwgbzItPmRhdGFzdHJfbGVuICk7Cit9CisKKy8qIENvbXBhcmUgdHdvIHR5cGVfZW51bSBvYmplY3RzIGJ5IHRoZWlyIG5hbWVzIChjaGVja3MgYWxyZWFkeSBwZXJmb3JtZWQpICovCitzdGF0aWMgaW50IG9yZGVyX2VudW1fYnlfbmFtZSAoIHN0cnVjdCBkaWN0X29iamVjdCAqbzEsIHN0cnVjdCBkaWN0X29iamVjdCAqbzIgKQoreworCVRSQUNFX0VOVFJZKCIlcCAlcCIsIG8xLCBvMik7CisJCisJcmV0dXJuIGZkX29zX2NtcCggbzEtPmRhdGEuZW51bXZhbC5lbnVtX25hbWUsIG8xLT5kYXRhc3RyX2xlbiwgbzItPmRhdGEuZW51bXZhbC5lbnVtX25hbWUsIG8yLT5kYXRhc3RyX2xlbiApOworfQorCisvKiBDb21wYXJlIHR3byB0eXBlX2VudW0gb2JqZWN0cyBieSB0aGVpciB2YWx1ZXMgKGNoZWNrcyBhbHJlYWR5IHBlcmZvcm1lZCkgKi8KK3N0YXRpYyBpbnQgb3JkZXJfZW51bV9ieV92YWwgICggc3RydWN0IGRpY3Rfb2JqZWN0ICpvMSwgc3RydWN0IGRpY3Rfb2JqZWN0ICpvMiApCit7CisJVFJBQ0VfRU5UUlkoIiVwICVwIiwgbzEsIG8yKTsKKwkKKwkvKiBUaGUgY29tcGFyaXNvbiBmdW5jdGlvbiBkZXBlbmRzIG9uIHRoZSB0eXBlIG9mIGRhdGEgKi8KKwlzd2l0Y2ggKCBvMS0+cGFyZW50LT5kYXRhLnR5cGUudHlwZV9iYXNlICkgeworCQljYXNlIEFWUF9UWVBFX09DVEVUU1RSSU5HOgorCQkJcmV0dXJuIGZkX29zX2NtcCggbzEtPmRhdGEuZW51bXZhbC5lbnVtX3ZhbHVlLm9zLmRhdGEsIG8xLT5kYXRhLmVudW12YWwuZW51bV92YWx1ZS5vcy5sZW4sIAorCQkJCQkgIG8yLT5kYXRhLmVudW12YWwuZW51bV92YWx1ZS5vcy5kYXRhLCBvMi0+ZGF0YS5lbnVtdmFsLmVudW1fdmFsdWUub3MubGVuKTsKKwkJCisJCWNhc2UgQVZQX1RZUEVfSU5URUdFUjMyOgorCQkJcmV0dXJuIE9SREVSX3NjYWxhciggbzEtPmRhdGEuZW51bXZhbC5lbnVtX3ZhbHVlLmkzMiwgbzItPmRhdGEuZW51bXZhbC5lbnVtX3ZhbHVlLmkzMiApOworCisJCWNhc2UgQVZQX1RZUEVfSU5URUdFUjY0OgorCQkJcmV0dXJuIE9SREVSX3NjYWxhciggbzEtPmRhdGEuZW51bXZhbC5lbnVtX3ZhbHVlLmk2NCwgbzItPmRhdGEuZW51bXZhbC5lbnVtX3ZhbHVlLmk2NCApOworCisJCWNhc2UgQVZQX1RZUEVfVU5TSUdORUQzMjoKKwkJCXJldHVybiBPUkRFUl9zY2FsYXIoIG8xLT5kYXRhLmVudW12YWwuZW51bV92YWx1ZS51MzIsIG8yLT5kYXRhLmVudW12YWwuZW51bV92YWx1ZS51MzIgKTsKKworCQljYXNlIEFWUF9UWVBFX1VOU0lHTkVENjQ6CisJCQlyZXR1cm4gT1JERVJfc2NhbGFyKCBvMS0+ZGF0YS5lbnVtdmFsLmVudW1fdmFsdWUudTY0LCBvMi0+ZGF0YS5lbnVtdmFsLmVudW1fdmFsdWUudTY0ICk7CisKKwkJY2FzZSBBVlBfVFlQRV9GTE9BVDMyOgorCQkJcmV0dXJuIE9SREVSX3NjYWxhciggbzEtPmRhdGEuZW51bXZhbC5lbnVtX3ZhbHVlLmYzMiwgbzItPmRhdGEuZW51bXZhbC5lbnVtX3ZhbHVlLmYzMiApOworCisJCWNhc2UgQVZQX1RZUEVfRkxPQVQ2NDoKKwkJCXJldHVybiBPUkRFUl9zY2FsYXIoIG8xLT5kYXRhLmVudW12YWwuZW51bV92YWx1ZS5mNjQsIG8yLT5kYXRhLmVudW12YWwuZW51bV92YWx1ZS5mNjQgKTsKKworCQljYXNlIEFWUF9UWVBFX0dST1VQRUQ6CisJCWRlZmF1bHQ6CisJCQlBU1NFUlQoMCk7CisJfQorCXJldHVybiAwOworfQorCisvKiBDb21wYXJlIHR3byBhdnAgb2JqZWN0cyBieSB0aGVpciBjb2RlcyAoY2hlY2tzIGFscmVhZHkgcGVyZm9ybWVkKSAqLworc3RhdGljIGludCBvcmRlcl9hdnBfYnlfY29kZSAgKCBzdHJ1Y3QgZGljdF9vYmplY3QgKm8xLCBzdHJ1Y3QgZGljdF9vYmplY3QgKm8yICkKK3sKKwlUUkFDRV9FTlRSWSgiJXAgJXAiLCBvMSwgbzIpOworCQorCXJldHVybiBPUkRFUl9zY2FsYXIoIG8xLT5kYXRhLmF2cC5hdnBfY29kZSwgbzItPmRhdGEuYXZwLmF2cF9jb2RlICk7Cit9CisKKy8qIENvbXBhcmUgdHdvIGF2cCBvYmplY3RzIGJ5IHRoZWlyIG5hbWVzIChjaGVja3MgYWxyZWFkeSBwZXJmb3JtZWQpICovCitzdGF0aWMgaW50IG9yZGVyX2F2cF9ieV9uYW1lICAoIHN0cnVjdCBkaWN0X29iamVjdCAqbzEsIHN0cnVjdCBkaWN0X29iamVjdCAqbzIgKQoreworCVRSQUNFX0VOVFJZKCIlcCAlcCIsIG8xLCBvMik7CisJCisJcmV0dXJuIGZkX29zX2NtcCggbzEtPmRhdGEuYXZwLmF2cF9uYW1lLCBvMS0+ZGF0YXN0cl9sZW4sIG8yLT5kYXRhLmF2cC5hdnBfbmFtZSwgbzItPmRhdGFzdHJfbGVuICk7Cit9CisKKy8qIENvbXBhcmUgdHdvIGNvbW1hbmQgb2JqZWN0cyBieSB0aGVpciBuYW1lcyAoY2hlY2tzIGFscmVhZHkgcGVyZm9ybWVkKSAqLworc3RhdGljIGludCBvcmRlcl9jbWRfYnlfbmFtZSAgKCBzdHJ1Y3QgZGljdF9vYmplY3QgKm8xLCBzdHJ1Y3QgZGljdF9vYmplY3QgKm8yICkKK3sKKwlUUkFDRV9FTlRSWSgiJXAgJXAiLCBvMSwgbzIpOworCQorCXJldHVybiBmZF9vc19jbXAoIG8xLT5kYXRhLmNtZC5jbWRfbmFtZSwgbzEtPmRhdGFzdHJfbGVuLCBvMi0+ZGF0YS5jbWQuY21kX25hbWUsIG8yLT5kYXRhc3RyX2xlbiApOworfQorCisvKiBDb21wYXJlIHR3byBjb21tYW5kIG9iamVjdHMgYnkgdGhlaXIgY29kZXMgYW5kIGZsYWdzIChyZXF1ZXN0IG9yIGFuc3dlcikgKGNoZWNrcyBhbHJlYWR5IHBlcmZvcm1lZCkgKi8KK3N0YXRpYyBpbnQgb3JkZXJfY21kX2J5X2NvZGVmbCggc3RydWN0IGRpY3Rfb2JqZWN0ICpvMSwgc3RydWN0IGRpY3Rfb2JqZWN0ICpvMiApCit7CisJdWludDhfdCBmbDEsIGZsMjsKKwlpbnQgY21wID0gMDsKKwkKKwlUUkFDRV9FTlRSWSgiJXAgJXAiLCBvMSwgbzIpOworCQorCWNtcCA9IE9SREVSX3NjYWxhciggbzEtPmRhdGEuY21kLmNtZF9jb2RlLCBvMi0+ZGF0YS5jbWQuY21kX2NvZGUgKTsKKwlpZiAoY21wKSAKKwkJcmV0dXJuIGNtcDsKKwkKKwkvKiBTYW1lIGNvbW1hbmQgY29kZSwgd2UgbXVzdCBjb21wYXJlIHRoZSB2YWx1ZSBvZiB0aGUgJ1InIGZsYWcgKi8KKwlmbDEgPSBvMS0+ZGF0YS5jbWQuY21kX2ZsYWdfdmFsICYgQ01EX0ZMQUdfUkVRVUVTVDsKKwlmbDIgPSBvMi0+ZGF0YS5jbWQuY21kX2ZsYWdfdmFsICYgQ01EX0ZMQUdfUkVRVUVTVDsKKwkKKwkvKiBXZSB3YW50IHJlcXVlc3RzIGZpcnN0LCBzbyB3ZSByZXZlcnNlIHRoZSBvcGVyYXRvcnMgaGVyZSAqLworCXJldHVybiBPUkRFUl9zY2FsYXIoZmwyLCBmbDEpOworCQkKK30KKworLyogQ29tcGFyZSB0d28gcnVsZSBvYmplY3QgYnkgdGhlIEFWUCB2ZW5kb3IgJiBjb2RlIHRoYXQgdGhleSByZWZlciAoY2hlY2tzIGFscmVhZHkgcGVyZm9ybWVkKSAqLworc3RhdGljIGludCBvcmRlcl9ydWxlX2J5X2F2cHZjICggc3RydWN0IGRpY3Rfb2JqZWN0ICpvMSwgc3RydWN0IGRpY3Rfb2JqZWN0ICpvMiApCit7CisJVFJBQ0VfRU5UUlkoIiVwICVwIiwgbzEsIG8yKTsKKwkKKwlyZXR1cm4gT1JERVJfc2NhbGFyKG8xLT5kYXRhLnJ1bGUucnVsZV9hdnAtPmRhdGEuYXZwLmF2cF92ZW5kb3IsIG8yLT5kYXRhLnJ1bGUucnVsZV9hdnAtPmRhdGEuYXZwLmF2cF92ZW5kb3IpIAorCQk/OiBPUkRFUl9zY2FsYXIobzEtPmRhdGEucnVsZS5ydWxlX2F2cC0+ZGF0YS5hdnAuYXZwX2NvZGUsIG8yLT5kYXRhLnJ1bGUucnVsZV9hdnAtPmRhdGEuYXZwLmF2cF9jb2RlKSA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlYXJjaCAgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBGdW5jdGlvbnMgdXNlZCB0byBzZWFyY2ggZm9yIG9iamVjdHMgaW4gdGhlIGxpc3RzLCBhY2NvcmRpbmcgdG8gc29tZSBjcml0ZXJpYSAqLworCisvKiBPbiBhIGdlbmVyYWwgbm90ZSwgaWYgcmVzdWx0IGlzIG5vdCBOVUxMLCBFTk9FTlQgaXMgbm90IHJldHVybmVkIGJ1dCAqcmVzdWx0IGlzIE5VTEwuICovCisKKy8qIFRoZSBmb2xsb3dpbmcgbWFjcm9zIGFzc3VtZSB0aGF0ICJ3aGF0IiwgInJldCIsICJyZXN1bHQiICh2YXJpYWJsZXMpLCBhbmQgImVuZCIgKGxhYmVsKSBleGlzdAoraW4gdGhlIGxvY2FsIGNvbnRleHQgd2hlcmUgdGhleSBhcmUgY2FsbGVkLiBUaGV5IGFyZSBtZWFudCB0byBiZSBjYWxsZWQgb25seSBmcm9tIHRoZSBmdW5jdGlvbnMgdGhhdCBmb2xsb3cuICovCisKKy8qIEZvciBzZWFyY2hzIG9mIHR5cGUgInh4eF9PRl94eHgiOiBjaGlsZHJlbidzIHBhcmVudCBvciBkZWZhdWx0IHBhcmVudCAqLworI2RlZmluZSBTRUFSQ0hfY2hpbGRzX3BhcmVudCggdHlwZV9vZl9jaGlsZCwgZGVmYXVsdF9wYXJlbnQgKSB7CQkJXAorCXN0cnVjdCBkaWN0X29iamVjdCAqX19jaGlsZCA9IChzdHJ1Y3QgZGljdF9vYmplY3QgKikgd2hhdDsJCVwKKwlDSEVDS19QQVJBTVNfRE8oIHZlcmlmeV9vYmplY3QoX19jaGlsZCkgJiYgCQkJCVwKKwkJKF9fY2hpbGQtPnR5cGUgPT0gKHR5cGVfb2ZfY2hpbGQpKSwgCQkJCVwKKwkJICAgeyAgcmV0ID0gRUlOVkFMOyBnb3RvIGVuZDsgIH0gICk7CQkJCVwKKwlyZXQgPSAwOwkJCQkJCQkJXAorCWlmIChyZXN1bHQpCQkJCQkJCQlcCisJCSpyZXN1bHQgPSAoX19jaGlsZC0+cGFyZW50ID8gX19jaGlsZC0+cGFyZW50IDooZGVmYXVsdF9wYXJlbnQpKTtcCit9CisKKy8qIEZvciBzZWFyY2ggb2Ygc3RyaW5ncyBpbiBsaXN0cy4gaXNpbmRleD0gMSBpZiB0aGUgc3RyaW5nIGlzIHRoZSBvcmRlcmluZyBrZXkgb2YgdGhlIGxpc3QgKi8KKy8qIGl0IGlzIGV4cGVjdGVkIHRoYXQgb2JqZWN0LT5kYXRhc3RyX2xlbiBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBkYXRhZmllbGQgcGFyYW1ldGVyICovCisjZGVmaW5lIFNFQVJDSF9vczBfbCggc3RyLCBsZW4sIHNlbnRpbmVsLCBkYXRhZmllbGQsIGlzaW5kZXggKSB7CQlcCisJY2hhciAqICBfX3N0ciA9IChjaGFyICopIChzdHIpOwkJCQkJCVwKKwlzaXplX3QgX19zdHJsZW4gPSAoc2l6ZV90KShsZW4pOwkJCQkJXAorCWludCBfX2NtcDsJCQkJCQkJCVwKKwlzdHJ1Y3QgZmRfbGlzdCAqIF9fbGk7CQkJCQkJCVwKKwlyZXQgPSAwOwkJCQkJCQkJXAorCWZvciAgKF9fbGkgPSAoc2VudGluZWwpLT5uZXh0OyBfX2xpICE9IChzZW50aW5lbCk7IF9fbGkgPSBfX2xpLT5uZXh0KSB7CVwKKwkJX19jbXAgPSBmZF9vc19jbXAoX19zdHIsIF9fc3RybGVuLAkJCQlcCisJCQlfTyhfX2xpLT5vKS0+ZGF0YS4gZGF0YWZpZWxkLCBfTyhfX2xpLT5vKS0+ZGF0YXN0cl9sZW4pO1wKKwkJaWYgKF9fY21wID09IDApIHsJCQkJCQlcCisJCQlpZiAocmVzdWx0KQkJCQkJCVwKKwkJCQkqcmVzdWx0ID0gX08oX19saS0+byk7CQkJCVwKKwkJCWdvdG8gZW5kOwkJCQkJCVwKKwkJfQkJCQkJCQkJXAorCQlpZiAoKGlzaW5kZXgpICYmIChfX2NtcCA8IDApKQkJCQkJXAorCQkJYnJlYWs7CQkJCQkJCVwKKwl9CQkJCQkJCQkJXAorCWlmIChyZXN1bHQpCQkJCQkJCQlcCisJCSpyZXN1bHQgPSBOVUxMOwkJCQkJCQlcCisJZWxzZQkJCQkJCQkJCVwKKwkJcmV0ID0gRU5PRU5UOwkJCQkJCQlcCit9CisKKy8qIFdoZW4gbGVuIGlzIG5vdCBwcm92aWRlZCAqLworI2RlZmluZSBTRUFSQ0hfb3MwKCBzdHIsIHNlbnRpbmVsLCBkYXRhZmllbGQsIGlzaW5kZXggKSB7CQkJXAorCWNoYXIgKiAgX3N0ciA9IChjaGFyICopIChzdHIpOwkJCQkJCVwKKwlzaXplX3QgIF9zdHJsZW4gPSBzdHJsZW4oX3N0cik7CQkJCQkJXAorCVNFQVJDSF9vczBfbCggX3N0ciwgX3N0cmxlbiwgc2VudGluZWwsIGRhdGFmaWVsZCwgaXNpbmRleCApOwkJXAorfQorCisKKy8qIEZvciBzZWFyY2ggb2Ygb2N0ZXRzdHJpbmdzIGluIGxpc3RzLiAqLworI2RlZmluZSBTRUFSQ0hfb3MoICBzdHIsIHN0cmxlbiwgc2VudGluZWwsIG9zZGF0YWZpZWxkLCBpc2luZGV4ICkgewkJXAorCXVpbnQ4X3QgKiBfX3N0ciA9ICh1aW50OF90ICopIChzdHIpOwkJCQkJXAorCXNpemVfdCBfX3N0cmxlbiA9IChzaXplX3QpKHN0cmxlbik7CQkJCQlcCisJaW50IF9fY21wOwkJCQkJCQkJXAorCXN0cnVjdCBmZF9saXN0ICogX19saTsJCQkJCQkJXAorCXJldCA9IDA7CQkJCQkJCQlcCisJZm9yICAoX19saSA9IChzZW50aW5lbCktPm5leHQ7IF9fbGkgIT0gKHNlbnRpbmVsKTsgX19saSA9IF9fbGktPm5leHQpIHsJXAorCQlfX2NtcCA9IGZkX29zX2NtcChfX3N0ciwgX19zdHJsZW4sCQkJCVwKKwkJCV9PKF9fbGktPm8pLT5kYXRhLiBvc2RhdGFmaWVsZCAuZGF0YSwJCQlcCisJCQlfTyhfX2xpLT5vKS0+ZGF0YS4gb3NkYXRhZmllbGQgLmxlbik7CQkJXAorCQlpZiAoX19jbXAgPT0gMCkgewkJCQkJCVwKKwkJCWlmIChyZXN1bHQpCQkJCQkJXAorCQkJCSpyZXN1bHQgPSBfTyhfX2xpLT5vKTsJCQkJXAorCQkJZ290byBlbmQ7CQkJCQkJXAorCQl9CQkJCQkJCQlcCisJCWlmICgoaXNpbmRleCkgJiYgKF9fY21wIDwgMCkpCQkJCQlcCisJCQlicmVhazsJCQkJCQkJXAorCX0JCQkJCQkJCQlcCisJaWYgKHJlc3VsdCkJCQkJCQkJCVwKKwkJKnJlc3VsdCA9IE5VTEw7CQkJCQkJCVwKKwllbHNlCQkJCQkJCQkJXAorCQlyZXQgPSBFTk9FTlQ7CQkJCQkJCVwKK30KKworLyogRm9yIHNlYXJjaCBvZiBBVlAgbmFtZSBpbiBydWxlIGxpc3RzIC0tIHRoZSBsaXN0IGlzIG5vdCBvcmRlcmVkIGJ5IEFWUCBuYW1lcyEgKi8KKyNkZWZpbmUgU0VBUkNIX3J1bGVhdnBuYW1lKCBzdHIsIHN0cmxlbiwgc2VudGluZWwgKSB7CQkJCVwKKwljaGFyICogX19zdHIgPSAoY2hhciAqKSAoc3RyKTsJCQkJCQlcCisJc2l6ZV90IF9fc3RybGVuID0gKHNpemVfdCkgKHN0cmxlbik7CQkJCQlcCisJaW50IF9fY21wOwkJCQkJCQkJXAorCXN0cnVjdCBmZF9saXN0ICogX19saTsJCQkJCQkJXAorCXJldCA9IDA7CQkJCQkJCQlcCisJZm9yICAoX19saSA9IChzZW50aW5lbCktPm5leHQ7IF9fbGkgIT0gKHNlbnRpbmVsKTsgX19saSA9IF9fbGktPm5leHQpIHsJXAorCQlfX2NtcCA9IGZkX29zX2NtcChfX3N0ciwgX19zdHJsZW4sIAkJCQlcCisJCSAgCV9PKF9fbGktPm8pLT5kYXRhLnJ1bGUucnVsZV9hdnAtPmRhdGEuYXZwLmF2cF9uYW1lLAlcCisJCQlfTyhfX2xpLT5vKS0+ZGF0YS5ydWxlLnJ1bGVfYXZwLT5kYXRhc3RyX2xlbik7CQlcCisJCWlmIChfX2NtcCA9PSAwKSB7CQkJCQkJXAorCQkJaWYgKHJlc3VsdCkJCQkJCQlcCisJCQkJKnJlc3VsdCA9IF9PKF9fbGktPm8pOwkJCQlcCisJCQlnb3RvIGVuZDsJCQkJCQlcCisJCX0JCQkJCQkJCVwKKwl9CQkJCQkJCQkJXAorCWlmIChyZXN1bHQpCQkJCQkJCQlcCisJCSpyZXN1bHQgPSBOVUxMOwkJCQkJCQlcCisJZWxzZQkJCQkJCQkJCVwKKwkJcmV0ID0gRU5PRU5UOwkJCQkJCQlcCit9CisKKy8qIEZvciBzZWFyY2ggb2Ygc2NhbGFycyBpbiBsaXN0cy4gaXNpbmRleD0gMSBpZiB0aGUgdmFsdWUgaXMgdGhlIG9yZGVyaW5nIGtleSBvZiB0aGUgbGlzdCAqLworI2RlZmluZSBTRUFSQ0hfc2NhbGFyKCB2YWx1ZSwgc2VudGluZWwsIGRhdGFmaWVsZCwgaXNpbmRleCwgZGVmYXVsdG9iaiApIHsJXAorCWludCBfX2NtcDsJCQkJCQkJCVwKKwlzdHJ1Y3QgZmRfbGlzdCAqIF9fbGk7CQkJCQkJCVwKKwlyZXQgPSAwOwkJCQkJCQkJXAorCWlmICggICgoZGVmYXVsdG9iaikgIT0gTlVMTCkgCQkJCQkJXAorCQkgICAmJiAoX08oZGVmYXVsdG9iaiktPmRhdGEuIGRhdGFmaWVsZCAgPT0gdmFsdWUpKSB7CQlcCisJCWlmIChyZXN1bHQpCQkJCQkJCVwKKwkJCSpyZXN1bHQgPSBfTyhkZWZhdWx0b2JqKTsJCQkJXAorCQlnb3RvIGVuZDsJCQkJCQkJXAorCX0JCQkJCQkJCQlcCisJZm9yICAoX19saSA9IChzZW50aW5lbCktPm5leHQ7IF9fbGkgIT0gKHNlbnRpbmVsKTsgX19saSA9IF9fbGktPm5leHQpIHsJXAorCQlfX2NtcD0gT1JERVJfc2NhbGFyKHZhbHVlLCBfTyhfX2xpLT5vKS0+ZGF0YS4gZGF0YWZpZWxkICk7CVwKKwkJaWYgKF9fY21wID09IDApIHsJCQkJCQlcCisJCQlpZiAocmVzdWx0KQkJCQkJCVwKKwkJCQkqcmVzdWx0ID0gX08oX19saS0+byk7CQkJCVwKKwkJCWdvdG8gZW5kOwkJCQkJCVwKKwkJfQkJCQkJCQkJXAorCQlpZiAoKGlzaW5kZXgpICYmIChfX2NtcCA8IDApKQkJCQkJXAorCQkJYnJlYWs7CQkJCQkJCVwKKwl9CQkJCQkJCQkJXAorCWlmIChyZXN1bHQpCQkJCQkJCQlcCisJCSpyZXN1bHQgPSBOVUxMOwkJCQkJCQlcCisJZWxzZQkJCQkJCQkJCVwKKwkJcmV0ID0gRU5PRU5UOwkJCQkJCQlcCit9CisKKy8qIEZvciBzZWFyY2ggb2YgY29tbWFuZHMgaW4gbGlzdHMgYnkgY29kZSBhbmQgZmxhZy4gUl9mbGFnX3ZhbCA9IDAgb3IgQ01EX0ZMQUdfUkVRVUVTVCAqLworI2RlZmluZSBTRUFSQ0hfY29kZWZsKCB2YWx1ZSwgUl9mbGFnX3ZhbCwgc2VudGluZWwpIHsJCQkJCVwKKwlpbnQgX19jbXA7CQkJCQkJCQlcCisJc3RydWN0IGZkX2xpc3QgKiBfX2xpOwkJCQkJCQlcCisJcmV0ID0gMDsJCQkJCQkJCVwKKwlmb3IgIChfX2xpID0gKHNlbnRpbmVsKS0+bmV4dDsgX19saSAhPSAoc2VudGluZWwpOyBfX2xpID0gX19saS0+bmV4dCkgewlcCisJCV9fY21wID0gT1JERVJfc2NhbGFyKHZhbHVlLCAJCQkJCVwKKwkJCQlfTyhfX2xpLT5vKS0+ZGF0YS5jbWQuY21kX2NvZGUgKTsJCVwKKwkJaWYgKF9fY21wID09IDApIHsJCQkJCQlcCisJCQl1aW50OF90IF9fbWFzaywgX192YWw7CQkJCQlcCisJCQlfX21hc2sgPSBfTyhfX2xpLT5vKS0+ZGF0YS5jbWQuY21kX2ZsYWdfbWFzazsJCVwKKwkJCV9fdmFsICA9IF9PKF9fbGktPm8pLT5kYXRhLmNtZC5jbWRfZmxhZ192YWw7CQlcCisJCQlpZiAoICEgKF9fbWFzayAmIENNRF9GTEFHX1JFUVVFU1QpICkJCQlcCisJCQkJY29udGludWU7CQkJCQlcCisJCQlpZiAoICggX192YWwgJiBDTURfRkxBR19SRVFVRVNUICkgIT0gUl9mbGFnX3ZhbCApCVwKKwkJCQljb250aW51ZTsJCQkJCVwKKwkJCWlmIChyZXN1bHQpCQkJCQkJXAorCQkJCSpyZXN1bHQgPSBfTyhfX2xpLT5vKTsJCQkJXAorCQkJZ290byBlbmQ7CQkJCQkJXAorCQl9CQkJCQkJCQlcCisJCWlmIChfX2NtcCA8IDApCQkJCQkJCVwKKwkJCWJyZWFrOwkJCQkJCQlcCisJfQkJCQkJCQkJCVwKKwlpZiAocmVzdWx0KQkJCQkJCQkJXAorCQkqcmVzdWx0ID0gTlVMTDsJCQkJCQkJXAorCWVsc2UJCQkJCQkJCQlcCisJCXJldCA9IEVOT0VOVDsJCQkJCQkJXAorfQorCisvKiBGb3Igc2VhcmNocyBvZiB0eXBlICJ4eHhfT0ZfeHh4IjogaWYgdGhlIHNlYXJjaCBvYmplY3QgaXMgc2VudGluZWwgbGlzdCBmb3IgdGhlICJ3aGF0IiBvYmplY3QgKi8KKyNkZWZpbmUgU0VBUkNIX3NlbnRpbmVsKCB0eXBlX29mX3doYXQsIHdoYXRfbGlzdF9uciwgc2VudGluZWxfbGlzdF9uciApIHsJCQlcCisJc3RydWN0IGRpY3Rfb2JqZWN0ICpfX3doYXQgPSAoc3RydWN0IGRpY3Rfb2JqZWN0ICopIHdoYXQ7CQkJCVwKKwlDSEVDS19QQVJBTVNfRE8oIHZlcmlmeV9vYmplY3QoX193aGF0KSAmJiAJCQkJCQlcCisJCShfX3doYXQtPnR5cGUgPT0gKHR5cGVfb2Zfd2hhdCkpLCAJCQkJCQlcCisJCSAgIHsgIHJldCA9IEVJTlZBTDsgZ290byBlbmQ7ICB9ICApOwkJCQkJCVwKKwlyZXQgPSAwOwkJCQkJCQkJCQlcCisJaWYgKHJlc3VsdCkgewkJCQkJCQkJCQlcCisJCS8qIHRoaXMgaXMgc2ltaWxhciB0byB0aGUgImNvbnRhaW5lcl9vZiIgKi8JCQkJCVwKKwkJKnJlc3VsdCA9IChzdHJ1Y3QgZGljdF9vYmplY3QgKikoKGNoYXIgKikoX193aGF0LT5saXN0W3doYXRfbGlzdF9ucl0uaGVhZCkgLSAJXAorCQkgICAJCShzaXplX3QpJigoKHN0cnVjdCBkaWN0X29iamVjdCAqKTApLT5saXN0W3NlbnRpbmVsX2xpc3RfbnJdKSk7CVwKKwl9CQkJCQkJCQkJCQlcCit9CisKKworc3RhdGljIGludCBzZWFyY2hfdmVuZG9yICggc3RydWN0IGRpY3Rpb25hcnkgKiBkaWN0LCBpbnQgY3JpdGVyaWEsIGNvbnN0IHZvaWQgKiB3aGF0LCBzdHJ1Y3QgZGljdF9vYmplY3QgKipyZXN1bHQgKQoreworCWludCByZXQgPSAwOworCXZlbmRvcl9pZF90IGlkOworCQorCVRSQUNFX0VOVFJZKCIlcCAlZCAlcCAlcCIsIGRpY3QsIGNyaXRlcmlhLCB3aGF0LCByZXN1bHQpOworCQorCXN3aXRjaCAoY3JpdGVyaWEpIHsKKwkJY2FzZSBWRU5ET1JfQllfSUQ6CisJCQlpZCA9ICoodmVuZG9yX2lkX3QgKikgd2hhdDsKKwkJCVNFQVJDSF9zY2FsYXIoIGlkLCAmZGljdC0+ZGljdF92ZW5kb3JzLmxpc3RbMF0sIHZlbmRvci52ZW5kb3JfaWQsIDEsICZkaWN0LT5kaWN0X3ZlbmRvcnMgKTsKKwkJCWJyZWFrOworCQkJCQorCQljYXNlIFZFTkRPUl9CWV9OQU1FOgorCQkJLyogIndoYXQiIGlzIGEgdmVuZG9yIG5hbWUgKi8KKwkJCVNFQVJDSF9vczAoIHdoYXQsICZkaWN0LT5kaWN0X3ZlbmRvcnMubGlzdFswXSwgdmVuZG9yLnZlbmRvcl9uYW1lLCAwKTsKKwkJCWJyZWFrOworCQkJCisJCWNhc2UgVkVORE9SX09GX0FQUExJQ0FUSU9OOgorCQkJLyogIndoYXQiIHNob3VsZCBiZSBhbiBhcHBsaWNhdGlvbiBvYmplY3QgKi8KKwkJCVNFQVJDSF9jaGlsZHNfcGFyZW50KCBESUNUX0FQUExJQ0FUSU9OLCAmZGljdC0+ZGljdF92ZW5kb3JzICk7CisJCQlicmVhazsKKwkJCisJCWNhc2UgVkVORE9SX09GX0FWUDoKKwkJCS8qICJ3aGF0IiBzaG91bGQgYmUgYW4gYXZwIG9iamVjdCAqLworCQkJU0VBUkNIX3NlbnRpbmVsKCBESUNUX0FWUCwgMCwgMSApOworCQkJYnJlYWs7CisJCQorCQlkZWZhdWx0OgorCQkJLyogSW52YWxpZCBjcml0ZXJpYSAqLworCQkJQ0hFQ0tfUEFSQU1TKCBjcml0ZXJpYSA9IDAgKTsKKwl9CitlbmQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzZWFyY2hfYXBwbGljYXRpb24gKCBzdHJ1Y3QgZGljdGlvbmFyeSAqIGRpY3QsIGludCBjcml0ZXJpYSwgY29uc3Qgdm9pZCAqIHdoYXQsIHN0cnVjdCBkaWN0X29iamVjdCAqKnJlc3VsdCApCit7CisJaW50IHJldCA9IDA7CisJYXBwbGljYXRpb25faWRfdCBpZDsKKwkKKwlUUkFDRV9FTlRSWSgiJXAgJWQgJXAgJXAiLCBkaWN0LCBjcml0ZXJpYSwgd2hhdCwgcmVzdWx0KTsKKwkKKwlzd2l0Y2ggKGNyaXRlcmlhKSB7CisJCWNhc2UgQVBQTElDQVRJT05fQllfSUQ6CisJCQlpZCA9ICooYXBwbGljYXRpb25faWRfdCAqKSB3aGF0OworCisJCQlTRUFSQ0hfc2NhbGFyKCBpZCwgJmRpY3QtPmRpY3RfYXBwbGljYXRpb25zLmxpc3RbMF0sICBhcHBsaWNhdGlvbi5hcHBsaWNhdGlvbl9pZCwgMSwgJmRpY3QtPmRpY3RfYXBwbGljYXRpb25zICk7CisJCQlicmVhazsKKwkJCQkKKwkJY2FzZSBBUFBMSUNBVElPTl9CWV9OQU1FOgorCQkJLyogIndoYXQiIGlzIGFuIGFwcGxpY2F0aW9uIG5hbWUgKi8KKwkJCVNFQVJDSF9vczAoIHdoYXQsICZkaWN0LT5kaWN0X2FwcGxpY2F0aW9ucy5saXN0WzBdLCBhcHBsaWNhdGlvbi5hcHBsaWNhdGlvbl9uYW1lLCAwKTsKKwkJCWJyZWFrOworCQkJCisJCWNhc2UgQVBQTElDQVRJT05fT0ZfVFlQRToKKwkJCS8qICJ3aGF0IiBzaG91bGQgYmUgYSB0eXBlIG9iamVjdCAqLworCQkJU0VBUkNIX2NoaWxkc19wYXJlbnQoIERJQ1RfVFlQRSwgJmRpY3QtPmRpY3RfYXBwbGljYXRpb25zICk7CisJCQlicmVhazsKKwkJCisJCWNhc2UgQVBQTElDQVRJT05fT0ZfQ09NTUFORDoKKwkJCS8qICJ3aGF0IiBzaG91bGQgYmUgYSBjb21tYW5kIG9iamVjdCAqLworCQkJU0VBUkNIX2NoaWxkc19wYXJlbnQoIERJQ1RfQ09NTUFORCwgJmRpY3QtPmRpY3RfYXBwbGljYXRpb25zICk7CisJCQlicmVhazsKKwkJCisJCWRlZmF1bHQ6CisJCQkvKiBJbnZhbGlkIGNyaXRlcmlhICovCisJCQlDSEVDS19QQVJBTVMoIGNyaXRlcmlhID0gMCApOworCX0KK2VuZDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNlYXJjaF90eXBlICggc3RydWN0IGRpY3Rpb25hcnkgKiBkaWN0LCBpbnQgY3JpdGVyaWEsIGNvbnN0IHZvaWQgKiB3aGF0LCBzdHJ1Y3QgZGljdF9vYmplY3QgKipyZXN1bHQgKQoreworCWludCByZXQgPSAwOworCQorCVRSQUNFX0VOVFJZKCIlcCAlZCAlcCAlcCIsIGRpY3QsIGNyaXRlcmlhLCB3aGF0LCByZXN1bHQpOworCQorCXN3aXRjaCAoY3JpdGVyaWEpIHsKKwkJY2FzZSBUWVBFX0JZX05BTUU6CisJCQkvKiAid2hhdCIgaXMgYSB0eXBlIG5hbWUgKi8KKwkJCVNFQVJDSF9vczAoIHdoYXQsICZkaWN0LT5kaWN0X3R5cGVzLCB0eXBlLnR5cGVfbmFtZSwgMSk7CisJCQlicmVhazsKKwkJCQorCQljYXNlIFRZUEVfT0ZfRU5VTVZBTDoKKwkJCS8qICJ3aGF0IiBzaG91bGQgYmUgYSB0eXBlX2VudW0gb2JqZWN0ICovCisJCQlTRUFSQ0hfY2hpbGRzX3BhcmVudCggRElDVF9FTlVNVkFMLCBOVUxMICk7CisJCQlicmVhazsKKwkJCisJCWNhc2UgVFlQRV9PRl9BVlA6CisJCQkvKiAid2hhdCIgc2hvdWxkIGJlIGFuIGF2cCBvYmplY3QgKi8KKwkJCVNFQVJDSF9jaGlsZHNfcGFyZW50KCBESUNUX0FWUCwgTlVMTCApOworCQkJYnJlYWs7CisJCQorCQkJCQorCQlkZWZhdWx0OgorCQkJLyogSW52YWxpZCBjcml0ZXJpYSAqLworCQkJQ0hFQ0tfUEFSQU1TKCBjcml0ZXJpYSA9IDAgKTsKKwl9CitlbmQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzZWFyY2hfZW51bXZhbCAoIHN0cnVjdCBkaWN0aW9uYXJ5ICogZGljdCwgaW50IGNyaXRlcmlhLCBjb25zdCB2b2lkICogd2hhdCwgc3RydWN0IGRpY3Rfb2JqZWN0ICoqcmVzdWx0ICkKK3sKKwlpbnQgcmV0ID0gMDsKKwkKKwlUUkFDRV9FTlRSWSgiJXAgJWQgJXAgJXAiLCBkaWN0LCBjcml0ZXJpYSwgd2hhdCwgcmVzdWx0KTsKKwkKKwlzd2l0Y2ggKGNyaXRlcmlhKSB7CisJCWNhc2UgRU5VTVZBTF9CWV9TVFJVQ1Q6CisJCQl7CisJCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogcGFyZW50ID0gTlVMTDsKKwkJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX3JlcXVlc3QgKiBfd2hhdCA9IChzdHJ1Y3QgZGljdF9lbnVtdmFsX3JlcXVlc3QgKikgd2hhdDsKKwkJCQkKKwkJCQlDSEVDS19QQVJBTVMoICBfd2hhdCAgJiYgICggX3doYXQtPnR5cGVfb2JqIHx8IF93aGF0LT50eXBlX25hbWUgKSAgKTsKKwkJCQkKKwkJCQlpZiAoX3doYXQtPnR5cGVfb2JqICE9IE5VTEwpIHsKKwkJCQkJcGFyZW50ID0gX3doYXQtPnR5cGVfb2JqOworCQkJCQlDSEVDS19QQVJBTVMoICB2ZXJpZnlfb2JqZWN0KHBhcmVudCkgICYmICAocGFyZW50LT50eXBlID09IERJQ1RfVFlQRSkgICk7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogV2UgcmVjZWl2ZWQgb25seSB0aGUgdHlwZSBuYW1lLCB3ZSBtdXN0IGZpbmQgaXQgZmlyc3QgKi8KKwkJCQkJQ0hFQ0tfRkNUX0RPKCBzZWFyY2hfdHlwZSggZGljdCwgVFlQRV9CWV9OQU1FLCBfd2hhdC0+dHlwZV9uYW1lLCAmcGFyZW50ICksCisJCQkJCQkJQ0hFQ0tfUEFSQU1TKCAwICkgKTsKKwkJCQl9CisJCQkJCisJCQkJLyogRnJvbSBoZXJlIHRoZSAicGFyZW50IiBvYmplY3QgaXMgdmFsaWQgKi8KKwkJCQkKKwkJCQlpZiAoIF93aGF0LT5zZWFyY2guZW51bV9uYW1lICE9IE5VTEwgKSB7CisJCQkJCS8qIFdlIGFyZSBsb29raW5nIGZvciB0aGlzIHN0cmluZyAqLworCQkJCQlTRUFSQ0hfb3MwKCAgX3doYXQtPnNlYXJjaC5lbnVtX25hbWUsICZwYXJlbnQtPmxpc3RbMV0sIGVudW12YWwuZW51bV9uYW1lLCAxICk7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogV2UgYXJlIGxvb2tpbmcgZm9yIHRoZSB2YWx1ZSBpbiBlbnVtX3ZhbHVlICovCisJCQkJCXN3aXRjaCAocGFyZW50LT5kYXRhLnR5cGUudHlwZV9iYXNlKSB7CisJCQkJCQljYXNlIEFWUF9UWVBFX09DVEVUU1RSSU5HOgorCQkJCQkJCVNFQVJDSF9vcygJIF93aGF0LT5zZWFyY2guZW51bV92YWx1ZS5vcy5kYXRhLCAKKwkJCQkJCQkJCSBfd2hhdC0+c2VhcmNoLmVudW1fdmFsdWUub3MubGVuLCAKKwkJCQkJCQkJCSAmcGFyZW50LT5saXN0WzJdLCAKKwkJCQkJCQkJCSBlbnVtdmFsLmVudW1fdmFsdWUub3MgLCAKKwkJCQkJCQkJCSAxICk7CisJCQkJCQkJYnJlYWs7CisKKwkJCQkJCWNhc2UgQVZQX1RZUEVfSU5URUdFUjMyOgorCQkJCQkJCVNFQVJDSF9zY2FsYXIoCV93aGF0LT5zZWFyY2guZW51bV92YWx1ZS5pMzIsCisJCQkJCQkJCQkmcGFyZW50LT5saXN0WzJdLAorCQkJCQkJCQkJZW51bXZhbC5lbnVtX3ZhbHVlLmkzMiwKKwkJCQkJCQkJCTEsCisJCQkJCQkJCQkoc3RydWN0IGRpY3Rfb2JqZWN0ICopTlVMTCk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQkJCisJCQkJCQljYXNlIEFWUF9UWVBFX0lOVEVHRVI2NDoKKwkJCQkJCQlTRUFSQ0hfc2NhbGFyKAlfd2hhdC0+c2VhcmNoLmVudW1fdmFsdWUuaTY0LAorCQkJCQkJCQkJJnBhcmVudC0+bGlzdFsyXSwKKwkJCQkJCQkJCWVudW12YWwuZW51bV92YWx1ZS5pNjQsCisJCQkJCQkJCQkxLAorCQkJCQkJCQkJKHN0cnVjdCBkaWN0X29iamVjdCAqKU5VTEwpOworCQkJCQkJCWJyZWFrOworCQkJCQkJCQorCQkJCQkJY2FzZSBBVlBfVFlQRV9VTlNJR05FRDMyOgorCQkJCQkJCVNFQVJDSF9zY2FsYXIoCV93aGF0LT5zZWFyY2guZW51bV92YWx1ZS51MzIsCisJCQkJCQkJCQkmcGFyZW50LT5saXN0WzJdLAorCQkJCQkJCQkJZW51bXZhbC5lbnVtX3ZhbHVlLnUzMiwKKwkJCQkJCQkJCTEsCisJCQkJCQkJCQkoc3RydWN0IGRpY3Rfb2JqZWN0ICopTlVMTCk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQkJCisJCQkJCQljYXNlIEFWUF9UWVBFX1VOU0lHTkVENjQ6CisJCQkJCQkJU0VBUkNIX3NjYWxhcigJX3doYXQtPnNlYXJjaC5lbnVtX3ZhbHVlLnU2NCwKKwkJCQkJCQkJCSZwYXJlbnQtPmxpc3RbMl0sCisJCQkJCQkJCQllbnVtdmFsLmVudW1fdmFsdWUudTY0LAorCQkJCQkJCQkJMSwKKwkJCQkJCQkJCShzdHJ1Y3QgZGljdF9vYmplY3QgKilOVUxMKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCQkKKwkJCQkJCWNhc2UgQVZQX1RZUEVfRkxPQVQzMjoKKwkJCQkJCQlTRUFSQ0hfc2NhbGFyKAlfd2hhdC0+c2VhcmNoLmVudW1fdmFsdWUuZjMyLAorCQkJCQkJCQkJJnBhcmVudC0+bGlzdFsyXSwKKwkJCQkJCQkJCWVudW12YWwuZW51bV92YWx1ZS5mMzIsCisJCQkJCQkJCQkxLAorCQkJCQkJCQkJKHN0cnVjdCBkaWN0X29iamVjdCAqKU5VTEwpOworCQkJCQkJCWJyZWFrOworCQkJCQkJCQorCQkJCQkJY2FzZSBBVlBfVFlQRV9GTE9BVDY0OgorCQkJCQkJCVNFQVJDSF9zY2FsYXIoCV93aGF0LT5zZWFyY2guZW51bV92YWx1ZS5mNjQsCisJCQkJCQkJCQkmcGFyZW50LT5saXN0WzJdLAorCQkJCQkJCQkJZW51bXZhbC5lbnVtX3ZhbHVlLmY2NCwKKwkJCQkJCQkJCTEsCisJCQkJCQkJCQkoc3RydWN0IGRpY3Rfb2JqZWN0ICopTlVMTCk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQkJCisJCQkJCQlkZWZhdWx0OgorCQkJCQkJCS8qIEludmFsaWQgcGFyZW50IHR5cGUgYmFzZXR5cGUgKi8KKwkJCQkJCQlDSEVDS19QQVJBTVMoIHBhcmVudCA9IE5VTEwgKTsKKwkJCQkJfQorCQkJCX0KKwkJCQkKKwkJCX0KKwkJCWJyZWFrOworCQkKKwkJCQkKKwkJZGVmYXVsdDoKKwkJCS8qIEludmFsaWQgY3JpdGVyaWEgKi8KKwkJCUNIRUNLX1BBUkFNUyggY3JpdGVyaWEgPSAwICk7CisJfQorZW5kOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc2VhcmNoX2F2cCAoIHN0cnVjdCBkaWN0aW9uYXJ5ICogZGljdCwgaW50IGNyaXRlcmlhLCBjb25zdCB2b2lkICogd2hhdCwgc3RydWN0IGRpY3Rfb2JqZWN0ICoqcmVzdWx0ICkKK3sKKwlpbnQgcmV0ID0gMDsKKwkKKwlUUkFDRV9FTlRSWSgiJXAgJWQgJXAgJXAiLCBkaWN0LCBjcml0ZXJpYSwgd2hhdCwgcmVzdWx0KTsKKwkKKwlzd2l0Y2ggKGNyaXRlcmlhKSB7CisJCWNhc2UgQVZQX0JZX0NPREU6CisJCQl7CisJCQkJYXZwX2NvZGVfdCBjb2RlOworCQkJCWNvZGUgPSAqKGF2cF9jb2RlX3QgKikgd2hhdDsKKworCQkJCVNFQVJDSF9zY2FsYXIoIGNvZGUsICZkaWN0LT5kaWN0X3ZlbmRvcnMubGlzdFsxXSwgIGF2cC5hdnBfY29kZSwgMSwgKHN0cnVjdCBkaWN0X29iamVjdCAqKU5VTEwgKTsKKwkJCX0KKwkJCWJyZWFrOworCQkJCQorCQljYXNlIEFWUF9CWV9OQU1FOgorCQkJLyogIndoYXQiIGlzIHRoZSBBVlAgbmFtZSwgdmVuZG9yIDAgKi8KKwkJCVNFQVJDSF9vczAoIHdoYXQsICZkaWN0LT5kaWN0X3ZlbmRvcnMubGlzdFsyXSwgYXZwLmF2cF9uYW1lLCAxKTsKKwkJCWJyZWFrOworCQkJCisJCWNhc2UgQVZQX0JZX0NPREVfQU5EX1ZFTkRPUjoKKwkJY2FzZSBBVlBfQllfTkFNRV9BTkRfVkVORE9SOgorCQkJeworCQkJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0ICogX3doYXQgPSAoc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgKikgd2hhdDsKKwkJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiB2ZW5kb3IgPSBOVUxMOworCQkJCQorCQkJCUNIRUNLX1BBUkFNUyggKGNyaXRlcmlhICE9IEFWUF9CWV9OQU1FX0FORF9WRU5ET1IpIHx8IF93aGF0LT5hdnBfbmFtZSAgKTsKKwkJCQkKKwkJCQkvKiBOb3cgbG9vayBmb3IgdGhlIHZlbmRvciBmaXJzdCAqLworCQkJCUNIRUNLX0ZDVCggc2VhcmNoX3ZlbmRvciggZGljdCwgVkVORE9SX0JZX0lELCAmX3doYXQtPmF2cF92ZW5kb3IsICZ2ZW5kb3IgKSApOworCQkJCWlmICh2ZW5kb3IgPT0gTlVMTCkgeworCQkJCQlpZiAocmVzdWx0KQorCQkJCQkJKnJlc3VsdCA9IE5VTEw7CisJCQkJCWVsc2UKKwkJCQkJCXJldCA9IEVOT0VOVDsKKwkJCQkJZ290byBlbmQ7CisJCQkJfQorCQkJCQorCQkJCS8qIFdlIG5vdyBoYXZlIG91ciB2ZW5kb3IgPSBoZWFkIG9mIHRoZSBhcHByb3ByaWF0ZSBhdnAgbGlzdCAqLworCQkJCWlmIChjcml0ZXJpYSA9PSBBVlBfQllfTkFNRV9BTkRfVkVORE9SKSB7CisJCQkJCVNFQVJDSF9vczAoIF93aGF0LT5hdnBfbmFtZSwgJnZlbmRvci0+bGlzdFsyXSwgYXZwLmF2cF9uYW1lLCAxKTsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiBBVlBfQllfQ09ERV9BTkRfVkVORE9SICovCisJCQkJCVNFQVJDSF9zY2FsYXIoIF93aGF0LT5hdnBfY29kZSwgJnZlbmRvci0+bGlzdFsxXSwgYXZwLmF2cF9jb2RlLCAxLCAoc3RydWN0IGRpY3Rfb2JqZWN0ICopTlVMTCApOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQkKKwkJY2FzZSBBVlBfQllfU1RSVUNUOgorCQkJeworCQkJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0X2V4ICogX3doYXQgPSAoc3RydWN0IGRpY3RfYXZwX3JlcXVlc3RfZXggKikgd2hhdDsKKwkJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiB2ZW5kb3IgPSBOVUxMOworCQkJCQorCQkJCUNIRUNLX1BBUkFNUyggX3doYXQtPmF2cF92ZW5kb3IudmVuZG9yIHx8IF93aGF0LT5hdnBfdmVuZG9yLnZlbmRvcl9pZCB8fCBfd2hhdC0+YXZwX3ZlbmRvci52ZW5kb3JfbmFtZSApOworCQkJCUNIRUNLX1BBUkFNUyggX3doYXQtPmF2cF9kYXRhLmF2cF9jb2RlIHx8IF93aGF0LT5hdnBfZGF0YS5hdnBfbmFtZSApOworCQkJCQorCQkJCS8qIE5vdyBsb29rIGZvciB0aGUgdmVuZG9yIGZpcnN0ICovCisJCQkJaWYgKF93aGF0LT5hdnBfdmVuZG9yLnZlbmRvcikgeworCQkJCQlDSEVDS19QQVJBTVMoICEgX3doYXQtPmF2cF92ZW5kb3IudmVuZG9yX2lkICYmICEgX3doYXQtPmF2cF92ZW5kb3IudmVuZG9yX25hbWUgKTsKKwkJCQkJdmVuZG9yID0gX3doYXQtPmF2cF92ZW5kb3IudmVuZG9yOworCQkJCX0gZWxzZSBpZiAoX3doYXQtPmF2cF92ZW5kb3IudmVuZG9yX2lkKSB7CisJCQkJCUNIRUNLX1BBUkFNUyggISBfd2hhdC0+YXZwX3ZlbmRvci52ZW5kb3JfbmFtZSApOworCQkJCQlDSEVDS19GQ1QoIHNlYXJjaF92ZW5kb3IoIGRpY3QsIFZFTkRPUl9CWV9JRCwgJl93aGF0LT5hdnBfdmVuZG9yLnZlbmRvcl9pZCwgJnZlbmRvciApICk7CisJCQkJfSBlbHNlIHsKKwkJCQkJQ0hFQ0tfRkNUKCBzZWFyY2hfdmVuZG9yKCBkaWN0LCBWRU5ET1JfQllfTkFNRSwgX3doYXQtPmF2cF92ZW5kb3IudmVuZG9yX25hbWUsICZ2ZW5kb3IgKSApOworCQkJCX0KKwkJCQkKKwkJCQlpZiAodmVuZG9yID09IE5VTEwpIHsKKwkJCQkJaWYgKHJlc3VsdCkKKwkJCQkJCSpyZXN1bHQgPSBOVUxMOworCQkJCQllbHNlCisJCQkJCQlyZXQgPSBFTk9FTlQ7CisJCQkJCWdvdG8gZW5kOworCQkJCX0KKwkJCQkKKwkJCQkvKiBXZSBub3cgaGF2ZSBvdXIgdmVuZG9yID0gaGVhZCBvZiB0aGUgYXBwcm9wcmlhdGUgYXZwIGxpc3QgKi8KKwkJCQlpZiAoX3doYXQtPmF2cF9kYXRhLmF2cF9jb2RlKSB7CisJCQkJCUNIRUNLX1BBUkFNUyggISBfd2hhdC0+YXZwX2RhdGEuYXZwX25hbWUgKTsKKwkJCQkJU0VBUkNIX3NjYWxhciggX3doYXQtPmF2cF9kYXRhLmF2cF9jb2RlLCAmdmVuZG9yLT5saXN0WzFdLCBhdnAuYXZwX2NvZGUsIDEsIChzdHJ1Y3QgZGljdF9vYmplY3QgKilOVUxMICk7CisJCQkJfSBlbHNlIHsKKwkJCQkJU0VBUkNIX29zMCggX3doYXQtPmF2cF9kYXRhLmF2cF9uYW1lLCAmdmVuZG9yLT5saXN0WzJdLCBhdnAuYXZwX25hbWUsIDEpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQkKKwkJY2FzZSBBVlBfQllfTkFNRV9BTExfVkVORE9SUzoKKwkJCXsKKwkJCQlzdHJ1Y3QgZmRfbGlzdCAqIGxpOworCQkJCXNpemVfdCB3bCA9IHN0cmxlbigoY2hhciAqKXdoYXQpOworCQkJCQorCQkJCS8qIEZpcnN0LCBzZWFyY2ggZm9yIHZlbmRvciAwICovCisJCQkJU0VBUkNIX29zMF9sKCB3aGF0LCB3bCwgJmRpY3QtPmRpY3RfdmVuZG9ycy5saXN0WzJdLCBhdnAuYXZwX25hbWUsIDEpOworCQkJCQorCQkJCS8qIElmIG5vdCBmb3VuZCwgbG9vcCBmb3IgYWxsIHZlbmRvcnMsIHVudGlsIGZvdW5kICovCisJCQkJZm9yIChsaSA9IGRpY3QtPmRpY3RfdmVuZG9ycy5saXN0WzBdLm5leHQ7IGxpICE9ICZkaWN0LT5kaWN0X3ZlbmRvcnMubGlzdFswXTsgbGkgPSBsaS0+bmV4dCkgeworCQkJCQlTRUFSQ0hfb3MwX2woIHdoYXQsIHdsLCAmX08obGktPm8pLT5saXN0WzJdLCBhdnAuYXZwX25hbWUsIDEpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQkKKwkJZGVmYXVsdDoKKwkJCS8qIEludmFsaWQgY3JpdGVyaWEgKi8KKwkJCUNIRUNLX1BBUkFNUyggY3JpdGVyaWEgPSAwICk7CisJfQorZW5kOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc2VhcmNoX2NtZCAoIHN0cnVjdCBkaWN0aW9uYXJ5ICogZGljdCwgaW50IGNyaXRlcmlhLCBjb25zdCB2b2lkICogd2hhdCwgc3RydWN0IGRpY3Rfb2JqZWN0ICoqcmVzdWx0ICkKK3sKKwlpbnQgcmV0ID0gMDsKKwkKKwlUUkFDRV9FTlRSWSgiJXAgJWQgJXAgJXAiLCBkaWN0LCBjcml0ZXJpYSwgd2hhdCwgcmVzdWx0KTsKKwkKKwlzd2l0Y2ggKGNyaXRlcmlhKSB7CisJCWNhc2UgQ01EX0JZX05BTUU6CisJCQkvKiAid2hhdCIgaXMgYSBjb21tYW5kIG5hbWUgKi8KKwkJCVNFQVJDSF9vczAoIHdoYXQsICZkaWN0LT5kaWN0X2NtZF9uYW1lLCBjbWQuY21kX25hbWUsIDEpOworCQkJYnJlYWs7CisJCQkKKwkJY2FzZSBDTURfQllfQ09ERV9SOgorCQljYXNlIENNRF9CWV9DT0RFX0E6CisJCQl7CisJCQkJY29tbWFuZF9jb2RlX3QgY29kZTsKKwkJCQl1aW50OF90IHNlYXJjaGZsID0gMDsKKwkJCQkKKwkJCQkvKiBUaGUgY29tbWFuZCBjb2RlIHRoYXQgd2UgYXJlIHNlYXJjaGluZyAqLworCQkJCWNvZGUgPSAqKGNvbW1hbmRfY29kZV90ICopIHdoYXQ7CisJCQkJCisJCQkJLyogVGhlIGZsYWcgKHJlcXVlc3Qgb3IgYW5zd2VyKSBvZiB0aGUgY29tbWFuZCB3ZSBhcmUgc2VhcmNoaW5nICovCisJCQkJaWYgKGNyaXRlcmlhID09IENNRF9CWV9DT0RFX1IpIHsKKwkJCQkJc2VhcmNoZmwgPSBDTURfRkxBR19SRVFVRVNUOworCQkJCX0KKwkJCQkKKwkJCQkvKiBwZXJmb3JtIHRoZSBzZWFyY2ggKi8KKwkJCQlTRUFSQ0hfY29kZWZsKCBjb2RlLCBzZWFyY2hmbCwgJmRpY3QtPmRpY3RfY21kX2NvZGUgKTsKKwkJCX0KKwkJCWJyZWFrOworCQkJCQorCQljYXNlIENNRF9BTlNXRVI6CisJCQl7CisJCQkJLyogIndoYXQiIGlzIGEgY29tbWFuZCBvYmplY3Qgb2YgdHlwZSAicmVxdWVzdCIgKi8KKwkJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiByZXEgPSAoc3RydWN0IGRpY3Rfb2JqZWN0ICopIHdoYXQ7CisJCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYW5zID0gTlVMTDsKKwkJCQkKKwkJCQlDSEVDS19QQVJBTVMoIHZlcmlmeV9vYmplY3QocmVxKSAKKwkJCQkJCSYmIChyZXEtPnR5cGUgPT0gRElDVF9DT01NQU5EKQorCQkJCQkJJiYgKHJlcS0+ZGF0YS5jbWQuY21kX2ZsYWdfbWFzayAmIENNRF9GTEFHX1JFUVVFU1QpCisJCQkJCQkmJiAocmVxLT5kYXRhLmNtZC5jbWRfZmxhZ192YWwgICYgQ01EX0ZMQUdfUkVRVUVTVCkgKTsKKwkJCQkKKwkJCQkvKiBUaGUgYW5zd2VyIGlzIHN1cHBvc2VkIHRvIGJlIHRoZSBuZXh0IGVsZW1lbnQgaW4gdGhlIGxpc3QsIGlmIGl0IGV4aXN0cyAqLworCQkJCWFucyA9IHJlcS0+bGlzdFsxXS5uZXh0LT5vOworCQkJCWlmICggYW5zID09IE5VTEwgKSB7CisJCQkJCVRSQUNFX0RFQlVHKCBGVUxMLCAidGhlIHJlcXVlc3Qgd2FzIHRoZSBsYXN0IGVsZW1lbnQgaW4gdGhlIGxpc3QiICk7CisJCQkJCXJldCA9IEVOT0VOVDsKKwkJCQkJZ290byBlbmQ7CisJCQkJfQorCQkJCQorCQkJCS8qIE5vdyBjaGVjayB0aGF0IHRoZSBhbnMgZWxlbWVudCBpcyByZWFsbHkgdGhlIGNvcnJlY3Qgb25lICovCisJCQkJaWYgKCAgKGFucy0+ZGF0YS5jbWQuY21kX2NvZGUgIT0gcmVxLT5kYXRhLmNtZC5jbWRfY29kZSkKKwkJCQkgICB8fCAoIShhbnMtPmRhdGEuY21kLmNtZF9mbGFnX21hc2sgJiBDTURfRkxBR19SRVFVRVNUKSkKKwkJCQkgICB8fCAoICBhbnMtPmRhdGEuY21kLmNtZF9mbGFnX3ZhbCAgJiBDTURfRkxBR19SRVFVRVNUICkgKSB7CisJCQkJCVRSQUNFX0RFQlVHKCBGVUxMLCAidGhlIGFuc3dlciBkb2VzIG5vdCBmb2xsb3cgdGhlIHJlcXVlc3QgaW4gdGhlIGxpc3QiICk7CisJCQkJCXJldCA9IEVOT0VOVDsKKwkJCQkJZ290byBlbmQ7CisJCQkJfQorCQkJCQorCQkJCWlmIChyZXN1bHQpCisJCQkJCSpyZXN1bHQgPSBhbnM7CisJCQkJcmV0ID0gMDsKKwkJCX0JCQkJCQkKKwkJCWJyZWFrOworCQkJCisJCWRlZmF1bHQ6CisJCQkvKiBJbnZhbGlkIGNyaXRlcmlhICovCisJCQlDSEVDS19QQVJBTVMoIGNyaXRlcmlhID0gMCApOworCX0KK2VuZDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNlYXJjaF9ydWxlICggc3RydWN0IGRpY3Rpb25hcnkgKiBkaWN0LCBpbnQgY3JpdGVyaWEsIGNvbnN0IHZvaWQgKiB3aGF0LCBzdHJ1Y3QgZGljdF9vYmplY3QgKipyZXN1bHQgKQoreworCWludCByZXQgPSAwOworCQorCVRSQUNFX0VOVFJZKCIlcCAlZCAlcCAlcCIsIGRpY3QsIGNyaXRlcmlhLCB3aGF0LCByZXN1bHQpOworCQorCXN3aXRjaCAoY3JpdGVyaWEpIHsKKwkJY2FzZSBSVUxFX0JZX0FWUF9BTkRfUEFSRU5UOgorCQkJeworCQkJCXN0cnVjdCBkaWN0X29iamVjdCAqIHBhcmVudCA9IE5VTEw7CisJCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwID0gTlVMTDsKKwkJCQlzdHJ1Y3QgZGljdF9ydWxlX3JlcXVlc3QgKiBfd2hhdCA9IChzdHJ1Y3QgZGljdF9ydWxlX3JlcXVlc3QgKikgd2hhdDsKKwkJCQkKKwkJCQlDSEVDS19QQVJBTVMoIF93aGF0IAorCQkJCQkJJiYgKHBhcmVudCA9IF93aGF0LT5ydWxlX3BhcmVudCkKKwkJCQkJCSYmIChhdnAgICAgPSBfd2hhdC0+cnVsZV9hdnAgICApICk7CisJCQkJCisJCQkJQ0hFQ0tfUEFSQU1TKCB2ZXJpZnlfb2JqZWN0KHBhcmVudCkgCisJCQkJCQkmJiAoKHBhcmVudC0+dHlwZSA9PSBESUNUX0NPTU1BTkQpIAorCQkJCQkJIHx8ICgocGFyZW50LT50eXBlID09IERJQ1RfQVZQKSAmJiAocGFyZW50LT5kYXRhLmF2cC5hdnBfYmFzZXR5cGUgPT0gQVZQX1RZUEVfR1JPVVBFRCkpKSApOworCQkJCQorCQkJCUNIRUNLX1BBUkFNUyggdmVyaWZ5X29iamVjdChhdnApICYmIChhdnAtPnR5cGUgPT0gRElDVF9BVlApICk7CisJCQkJCisJCQkJLyogUGVyZm9ybSB0aGUgc2VhcmNoICovCisJCQkJU0VBUkNIX3J1bGVhdnBuYW1lKCBhdnAtPmRhdGEuYXZwLmF2cF9uYW1lLCBhdnAtPmRhdGFzdHJfbGVuLCAmcGFyZW50LT5saXN0WzJdKTsKKwkJCQkKKwkJCX0KKwkJCWJyZWFrOworCQkJCisJCWRlZmF1bHQ6CisJCQkvKiBJbnZhbGlkIGNyaXRlcmlhICovCisJCQlDSEVDS19QQVJBTVMoIGNyaXRlcmlhID0gMCApOworCX0KK2VuZDoKKwlyZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEdW1wIC8gZGVidWcgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSB1c2VkIHRvIGRlYnVnIHRoZSBtb2R1bGUsIGFuZCBhbGxvdyB0byBwcmludCBvdXQgdGhlIGNvbnRlbnQgb2YgdGhlIGRpY3Rpb25hcnkgKi8KK3N0YXRpYyBERUNMQVJFX0ZEX0RVTVBfUFJPVE9UWVBFKGR1bXBfdmVuZG9yX2RhdGEsIHZvaWQgKiBkYXRhICkKK3sKKwlzdHJ1Y3QgZGljdF92ZW5kb3JfZGF0YSAqIHZlbmRvciA9IChzdHJ1Y3QgZGljdF92ZW5kb3JfZGF0YSAqKWRhdGE7CisJCisJcmV0dXJuIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICJkYXRhOiAlLTZ1IFwiJXNcIiIsIHZlbmRvci0+dmVuZG9yX2lkLCB2ZW5kb3ItPnZlbmRvcl9uYW1lKTsKK30KK3N0YXRpYyBERUNMQVJFX0ZEX0RVTVBfUFJPVE9UWVBFKGR1bXBfYXBwbGljYXRpb25fZGF0YSwgdm9pZCAqIGRhdGEgKQoreworCXN0cnVjdCBkaWN0X2FwcGxpY2F0aW9uX2RhdGEgKiBhcHBsaSA9IChzdHJ1Y3QgZGljdF9hcHBsaWNhdGlvbl9kYXRhICopIGRhdGE7CisJcmV0dXJuIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICJkYXRhOiAlLTZ1IFwiJXNcIiIsIGFwcGxpLT5hcHBsaWNhdGlvbl9pZCwgYXBwbGktPmFwcGxpY2F0aW9uX25hbWUpOworfQorc3RhdGljIERFQ0xBUkVfRkRfRFVNUF9QUk9UT1RZUEUoZHVtcF90eXBlX2RhdGEsIHZvaWQgKiBkYXRhICkKK3sKKwlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgKiB0eXBlID0gKCBzdHJ1Y3QgZGljdF90eXBlX2RhdGEgKiApIGRhdGE7CisJCisJcmV0dXJuIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICJkYXRhOiAlLTEycyBcIiVzXCIiLCAKKwkJCXR5cGVfYmFzZV9uYW1lW3R5cGUtPnR5cGVfYmFzZV0sIAorCQkJdHlwZS0+dHlwZV9uYW1lKTsKK30KK3N0YXRpYyBERUNMQVJFX0ZEX0RVTVBfUFJPVE9UWVBFKGR1bXBfZW51bXZhbF9kYXRhLCBzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgKiBlbnVtdmFsLCBlbnVtIGRpY3RfYXZwX2Jhc2V0eXBlIHR5cGUgKQoreworCWNvbnN0IGludCBMRU5fTUFYID0gMjA7CisJQ0hFQ0tfTUFMTE9DX0RPKGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICJkYXRhOiAoJS0xMnMpIFwiJXNcIiAtPiAiLCB0eXBlX2Jhc2VfbmFtZVt0eXBlXSwgZW51bXZhbC0+ZW51bV9uYW1lKSwgcmV0dXJuIE5VTEwpOworCXN3aXRjaCAodHlwZSkgeworCQljYXNlIEFWUF9UWVBFX09DVEVUU1RSSU5HOgorCQkJeworCQkJCWludCBpLCBuPUxFTl9NQVg7CisJCQkJaWYgKGVudW12YWwtPmVudW1fdmFsdWUub3MubGVuIDwgTEVOX01BWCkKKwkJCQkJbiA9IGVudW12YWwtPmVudW1fdmFsdWUub3MubGVuOworCQkJCWZvciAoaT0wOyBpIDwgbjsgaSsrKQorCQkJCQlDSEVDS19NQUxMT0NfRE8oZmRfZHVtcF9leHRlbmQoIEZEX0RVTVBfU1REX1BBUkFNUywgIjB4JTJoaFgvJyVjJyAiLCBlbnVtdmFsLT5lbnVtX3ZhbHVlLm9zLmRhdGFbaV0sIEFTQ0lJKGVudW12YWwtPmVudW1fdmFsdWUub3MuZGF0YVtpXSkpLCByZXR1cm4gTlVMTCk7CisJCQkJaWYgKG4gPT0gTEVOX01BWCkKKwkJCQkJQ0hFQ0tfTUFMTE9DX0RPKGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICIuLi4iKSwgcmV0dXJuIE5VTEwpOworCQkJfQorCQkJYnJlYWs7CisJCQorCQljYXNlIEFWUF9UWVBFX0lOVEVHRVIzMjoKKwkJCUNIRUNLX01BTExPQ19ETyhmZF9kdW1wX2V4dGVuZCggRkRfRFVNUF9TVERfUEFSQU1TLCAiJWkiLCBlbnVtdmFsLT5lbnVtX3ZhbHVlLmkzMiksIHJldHVybiBOVUxMKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQVZQX1RZUEVfSU5URUdFUjY0OgorCQkJQ0hFQ0tfTUFMTE9DX0RPKGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICIlIlBSSWQ2NCwgZW51bXZhbC0+ZW51bV92YWx1ZS5pNjQpLCByZXR1cm4gTlVMTCk7CisJCQlicmVhazsKKworCQljYXNlIEFWUF9UWVBFX1VOU0lHTkVEMzI6CisJCQlDSEVDS19NQUxMT0NfRE8oZmRfZHVtcF9leHRlbmQoIEZEX0RVTVBfU1REX1BBUkFNUywgIiV1IiwgZW51bXZhbC0+ZW51bV92YWx1ZS51MzIpLCByZXR1cm4gTlVMTCk7CisJCQlicmVhazsKKworCQljYXNlIEFWUF9UWVBFX1VOU0lHTkVENjQ6CisJCQlDSEVDS19NQUxMT0NfRE8oZmRfZHVtcF9leHRlbmQoIEZEX0RVTVBfU1REX1BBUkFNUywgIiUiUFJJdTY0LCBlbnVtdmFsLT5lbnVtX3ZhbHVlLnU2NCksIHJldHVybiBOVUxMKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQVZQX1RZUEVfRkxPQVQzMjoKKwkJCUNIRUNLX01BTExPQ19ETyhmZF9kdW1wX2V4dGVuZCggRkRfRFVNUF9TVERfUEFSQU1TLCAiJWYiLCBlbnVtdmFsLT5lbnVtX3ZhbHVlLmYzMiksIHJldHVybiBOVUxMKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQVZQX1RZUEVfRkxPQVQ2NDoKKwkJCUNIRUNLX01BTExPQ19ETyhmZF9kdW1wX2V4dGVuZCggRkRfRFVNUF9TVERfUEFSQU1TLCAiJWciLCBlbnVtdmFsLT5lbnVtX3ZhbHVlLmY2NCksIHJldHVybiBOVUxMKTsKKwkJCWJyZWFrOworCQkKKwkJZGVmYXVsdDoKKwkJCUNIRUNLX01BTExPQ19ETyhmZF9kdW1wX2V4dGVuZCggRkRfRFVNUF9TVERfUEFSQU1TLCAiPz8/IChFUlJPUiB1bmtub3duIHR5cGUgJWQpIiwgdHlwZSksIHJldHVybiBOVUxMKTsKKwl9CisJcmV0dXJuICpidWY7Cit9CitzdGF0aWMgREVDTEFSRV9GRF9EVU1QX1BST1RPVFlQRShkdW1wX2F2cF9kYXRhLCB2b2lkICogZGF0YSApCit7CisJc3RydWN0IGRpY3RfYXZwX2RhdGEgKiBhdnAgPSAoc3RydWN0IGRpY3RfYXZwX2RhdGEgKiApIGRhdGE7CisJcmV0dXJuIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICJkYXRhOiB2L206IiBEVU1QX0FWUEZMX3N0ciAiLyIgRFVNUF9BVlBGTF9zdHIgIiwgJTEycywgJS02dSBcIiVzXCIiLCAKKwkJCURVTVBfQVZQRkxfdmFsKGF2cC0+YXZwX2ZsYWdfdmFsKSwgCisJCQlEVU1QX0FWUEZMX3ZhbChhdnAtPmF2cF9mbGFnX21hc2spLCAKKwkJCXR5cGVfYmFzZV9uYW1lW2F2cC0+YXZwX2Jhc2V0eXBlXSwgCisJCQlhdnAtPmF2cF9jb2RlLCAKKwkJCWF2cC0+YXZwX25hbWUgKTsKK30KK3N0YXRpYyBERUNMQVJFX0ZEX0RVTVBfUFJPVE9UWVBFKGR1bXBfY29tbWFuZF9kYXRhLCB2b2lkICogZGF0YSApCit7CisJc3RydWN0IGRpY3RfY21kX2RhdGEgKiBjbWQgPSAoc3RydWN0IGRpY3RfY21kX2RhdGEgKikgZGF0YTsKKwlyZXR1cm4gZmRfZHVtcF9leHRlbmQoIEZEX0RVTVBfU1REX1BBUkFNUywgImRhdGE6IHYvbToiIERVTVBfQ01ERkxfc3RyICIvIiBEVU1QX0NNREZMX3N0ciAiLCAlLTZ1IFwiJXNcIiIsIAorCQkJRFVNUF9DTURGTF92YWwoY21kLT5jbWRfZmxhZ192YWwpLCBEVU1QX0NNREZMX3ZhbChjbWQtPmNtZF9mbGFnX21hc2spLCBjbWQtPmNtZF9jb2RlLCBjbWQtPmNtZF9uYW1lKTsKK30KK3N0YXRpYyBERUNMQVJFX0ZEX0RVTVBfUFJPVE9UWVBFKGR1bXBfcnVsZV9kYXRhLCB2b2lkICogZGF0YSApCit7CisJc3RydWN0IGRpY3RfcnVsZV9kYXRhICogcnVsZSA9IChzdHJ1Y3QgZGljdF9ydWxlX2RhdGEgKiApZGF0YTsKKwlyZXR1cm4gZmRfZHVtcF9leHRlbmQoIEZEX0RVTVBfU1REX1BBUkFNUywgImRhdGE6IHBvczolZCBvcmQ6JWQgbS9NOiUyZC8lMmQgYXZwOlwiJXNcIiIsCisJCQlydWxlLT5ydWxlX3Bvc2l0aW9uLCAKKwkJCXJ1bGUtPnJ1bGVfb3JkZXIsIAorCQkJcnVsZS0+cnVsZV9taW4sIAorCQkJcnVsZS0+cnVsZV9tYXgsCisJCQlydWxlLT5ydWxlX2F2cC0+ZGF0YS5hdnAuYXZwX25hbWUpOworfQorCitzdGF0aWMgREVDTEFSRV9GRF9EVU1QX1BST1RPVFlQRShkdW1wX29iamVjdCwgc3RydWN0IGRpY3Rfb2JqZWN0ICogb2JqLCBpbnQgcGFyZW50cywgaW50IGRlcHRoLCBpbnQgaW5kZW50ICk7CisKK3N0YXRpYyBERUNMQVJFX0ZEX0RVTVBfUFJPVE9UWVBFKGR1bXBfbGlzdCwgc3RydWN0IGZkX2xpc3QgKiBzZW50aW5lbCwgaW50IHBhcmVudHMsIGludCBkZXB0aCwgaW50IGluZGVudCApCit7CisJc3RydWN0IGZkX2xpc3QgKiBsaSA9IHNlbnRpbmVsOworCS8qIFdlIGRvbid0IGxvY2sgaGVyZSwgdGhlIGNhbGxlciBtdXN0IGhhdmUgdGFrZW4gdGhlIGRpY3Rpb25hcnkgbG9jayBmb3IgcmVhZGluZyBhbHJlYWR5ICovCisJaWYgKEZEX0lTX0xJU1RfRU1QVFkoc2VudGluZWwpKSB7CisJCUNIRUNLX01BTExPQ19ETyggZmRfZHVtcF9leHRlbmQoIEZEX0RVTVBfU1REX1BBUkFNUywgIlxuJSpze2VtcHR5IGxpc3R9IiwgaW5kZW50LCAiIiksIHJldHVybiBOVUxMKTsKKwl9IGVsc2UgeworCQl3aGlsZSAobGktPm5leHQgIT0gc2VudGluZWwpCisJCXsKKwkJCWxpID0gbGktPm5leHQ7CisJCQlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICJcbiIpLCByZXR1cm4gTlVMTCk7CisJCQlDSEVDS19NQUxMT0NfRE8oIGR1bXBfb2JqZWN0IChGRF9EVU1QX1NURF9QQVJBTVMsIF9PKGxpLT5vKSwgcGFyZW50cywgZGVwdGgsIGluZGVudCApLCByZXR1cm4gTlVMTCk7CisJCX0KKwl9CisJcmV0dXJuICpidWY7Cit9CisKK3N0YXRpYyBERUNMQVJFX0ZEX0RVTVBfUFJPVE9UWVBFKGR1bXBfb2JqZWN0LCBzdHJ1Y3QgZGljdF9vYmplY3QgKiBvYmosIGludCBwYXJlbnRzLCBpbnQgZGVwdGgsIGludCBpbmRlbnQgKQoreworCUNIRUNLX01BTExPQ19ETyggZmRfZHVtcF9leHRlbmQoIEZEX0RVTVBfU1REX1BBUkFNUywgIiUqc3tkaWN0b2JqfShAJXApOiAiLCBpbmRlbnQsICIiLCBvYmopLCByZXR1cm4gTlVMTCk7CisJCisJaWYgKCF2ZXJpZnlfb2JqZWN0KG9iaikpIHsKKwkJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9kdW1wX2V4dGVuZCggRkRfRFVNUF9TVERfUEFSQU1TLCAiSU5WQUxJRC9OVUxMIiksIHJldHVybiBOVUxMKTsKKwkJcmV0dXJuICpidWY7CisJfQorCQorCUNIRUNLX01BTExPQ19ETyggZmRfZHVtcF9leHRlbmQoIEZEX0RVTVBfU1REX1BBUkFNUywgIiVzIHA6JXAgIiwgCisJCQkJCQkJCV9PQklORk8ob2JqKS5uYW1lLCAKKwkJCQkJCQkJb2JqLT5wYXJlbnQpLCByZXR1cm4gTlVMTCk7CisJCisJaWYgKG9iai0+dHlwZSA9PSBESUNUX0VOVU1WQUwpIHsKKwkJQ0hFQ0tfTUFMTE9DX0RPKCBkdW1wX2VudW12YWxfZGF0YSAoIEZEX0RVTVBfU1REX1BBUkFNUywgJm9iai0+ZGF0YS5lbnVtdmFsLCBvYmotPnBhcmVudC0+ZGF0YS50eXBlLnR5cGVfYmFzZSApLCByZXR1cm4gTlVMTCk7CisJfSBlbHNlIHsKKwkJQ0hFQ0tfTUFMTE9DX0RPKCBfT0JJTkZPKG9iaikuZHVtcF9kYXRhKEZEX0RVTVBfU1REX1BBUkFNUywgJm9iai0+ZGF0YSksIHJldHVybiBOVUxMKTsKKwl9CisJCisJaWYgKHBhcmVudHMpIHsKKwkJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9kdW1wX2V4dGVuZCggRkRfRFVNUF9TVERfUEFSQU1TLCAiXG4lKnNwYXJlbnQ6IiwgaW5kZW50ICsgMSwgIiIpLCByZXR1cm4gTlVMTCk7CisJCUNIRUNLX01BTExPQ19ETyggZHVtcF9vYmplY3QgKEZEX0RVTVBfU1REX1BBUkFNUywgb2JqLT5wYXJlbnQsIHBhcmVudHMtMSwgMCwgMCApLCByZXR1cm4gTlVMTCk7CisJfQorCQorCWlmIChkZXB0aCkgeworCQlpbnQgaTsKKwkJZm9yIChpPTA7IGk8TkJfTElTVFNfUEVSX09CSjsgaSsrKSB7CisJCQlpZiAoKG9iai0+bGlzdFtpXS5vID09IE5VTEwpICYmIChvYmotPmxpc3RbaV0ubmV4dCAhPSAmb2JqLT5saXN0W2ldKSkgeworCQkJCUNIRUNLX01BTExPQ19ETyggZHVtcF9saXN0KEZEX0RVTVBfU1REX1BBUkFNUywgJm9iai0+bGlzdFtpXSwgMCwgZGVwdGggLSAxLCBpbmRlbnQgKyAyKSwgcmV0dXJuIE5VTEwpOworCQkJCWJyZWFrOyAvKiB3ZSBnZXQgZHVwbGljYXRlIGluZm9ybWF0aW9uIHNvcnRlZCBieSBhbm90aGVyIGNyaXRlcmlhIG90aGVyd2lzZSwgd2hpY2ggaXMgbm90IHZlcnkgdXNlZnVsICovCisJCQl9CisJCX0KKwl9CisJCisJcmV0dXJuICpidWY7Cit9CisKK0RFQ0xBUkVfRkRfRFVNUF9QUk9UT1RZUEUoZmRfZGljdF9kdW1wX29iamVjdCwgc3RydWN0IGRpY3Rfb2JqZWN0ICogb2JqKQoreworCUZEX0RVTVBfSEFORExFX09GRlNFVCgpOworCQorCUNIRUNLX01BTExPQ19ETyggZHVtcF9vYmplY3QoRkRfRFVNUF9TVERfUEFSQU1TLCBvYmosIDEsIDIsIDApLCByZXR1cm4gTlVMTCk7CisJCisJcmV0dXJuICpidWY7Cit9CisKK0RFQ0xBUkVfRkRfRFVNUF9QUk9UT1RZUEUoZmRfZGljdF9kdW1wLCBzdHJ1Y3QgZGljdGlvbmFyeSAqIGRpY3QpCit7CisJaW50IGk7CisJc3RydWN0IGZkX2xpc3QgKiBsaTsKKwkKKwlGRF9EVU1QX0hBTkRMRV9PRkZTRVQoKTsKKwkJCisJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9kdW1wX2V4dGVuZCggRkRfRFVNUF9TVERfUEFSQU1TLCAie2RpY3Rpb25hcnl9KEAlcCk6ICIsIGRpY3QpLCByZXR1cm4gTlVMTCk7CisJCisJaWYgKChkaWN0ID09IE5VTEwpIHx8IChkaWN0LT5kaWN0X2V5ZWMgIT0gRElDVF9FWUVDQVRDSEVSKSkgeworCQlyZXR1cm4gZmRfZHVtcF9leHRlbmQoRkRfRFVNUF9TVERfUEFSQU1TLCAiSU5WQUxJRC9OVUxMIik7CisJfQorCQorCUNIRUNLX1BPU0lYX0RPKCAgcHRocmVhZF9yd2xvY2tfcmRsb2NrKCAmZGljdC0+ZGljdF9sb2NrICksIC8qIGlnbm9yZSAqLyAgKTsKKwkKKwlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICJcbiB7ZGljdCglcCkgOiBWRU5ET1JTIC8gQVZQIC8gUlVMRVN9XG4iLCBkaWN0KSwgZ290byBlcnJvcik7CisJQ0hFQ0tfTUFMTE9DX0RPKCBkdW1wX29iamVjdCAoRkRfRFVNUF9TVERfUEFSQU1TLCAmZGljdC0+ZGljdF92ZW5kb3JzLCAwLCAzLCAzICksIGdvdG8gZXJyb3IpOworCWZvciAobGkgPSBkaWN0LT5kaWN0X3ZlbmRvcnMubGlzdFswXS5uZXh0OyBsaSAhPSAmZGljdC0+ZGljdF92ZW5kb3JzLmxpc3RbMF07IGxpID0gbGktPm5leHQpIHsKKwkJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9kdW1wX2V4dGVuZCggRkRfRFVNUF9TVERfUEFSQU1TLCAiXG4iKSwgcmV0dXJuIE5VTEwpOworCQlDSEVDS19NQUxMT0NfRE8oIGR1bXBfb2JqZWN0IChGRF9EVU1QX1NURF9QQVJBTVMsIGxpLT5vLCAwLCAzLCAzICksIGdvdG8gZXJyb3IpOworCX0KKwkKKwlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICJcbiB7ZGljdCglcCkgOiBBUFBMSUNBVElPTlN9XG4iLCBkaWN0KSwgZ290byBlcnJvcik7CisJQ0hFQ0tfTUFMTE9DX0RPKCBkdW1wX29iamVjdCAoRkRfRFVNUF9TVERfUEFSQU1TLCAmZGljdC0+ZGljdF9hcHBsaWNhdGlvbnMsIDAsIDEsIDMgKSwgZ290byBlcnJvcik7CisJZm9yIChsaSA9IGRpY3QtPmRpY3RfYXBwbGljYXRpb25zLmxpc3RbMF0ubmV4dDsgbGkgIT0gJmRpY3QtPmRpY3RfYXBwbGljYXRpb25zLmxpc3RbMF07IGxpID0gbGktPm5leHQpIHsKKwkJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9kdW1wX2V4dGVuZCggRkRfRFVNUF9TVERfUEFSQU1TLCAiXG4iKSwgcmV0dXJuIE5VTEwpOworCQlDSEVDS19NQUxMT0NfRE8oIGR1bXBfb2JqZWN0IChGRF9EVU1QX1NURF9QQVJBTVMsIGxpLT5vLCAwLCAxLCAzICksIGdvdG8gZXJyb3IpOworCX0KKwkKKwlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICJcbiB7ZGljdCglcCkgOiBUWVBFUyAvIEVOVU1WQUx9IiwgZGljdCksIGdvdG8gZXJyb3IpOworCUNIRUNLX01BTExPQ19ETyggZHVtcF9saXN0KEZEX0RVTVBfU1REX1BBUkFNUywgJmRpY3QtPmRpY3RfdHlwZXMsIDAsIDIsIDMgKSwgZ290byBlcnJvcik7CisJCisJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9kdW1wX2V4dGVuZCggRkRfRFVNUF9TVERfUEFSQU1TLCAiXG4ge2RpY3QoJXApIDogQ09NTUFORFMgLyBSVUxFU30iLCBkaWN0KSwgZ290byBlcnJvcik7CisJQ0hFQ0tfTUFMTE9DX0RPKCBkdW1wX2xpc3QoRkRfRFVNUF9TVERfUEFSQU1TLCAmZGljdC0+ZGljdF9jbWRfY29kZSwgMCwgMCwgMyApLCBnb3RvIGVycm9yKTsKKwkKKwlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICJcbiB7ZGljdCglcCkgOiBzdGF0aXN0aWNzfSIsIGRpY3QpLCBnb3RvIGVycm9yKTsKKwlmb3IgKGk9MTsgaTw9RElDVF9UWVBFX01BWDsgaSsrKQorCQlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICJcbiAgICU1ZDogJXMiLCAgZGljdC0+ZGljdF9jb3VudFtpXSwgZGljdF9vYmpfaW5mb1tpXS5uYW1lKSwgZ290byBlcnJvcik7CisJCisJQ0hFQ0tfUE9TSVhfRE8oICBwdGhyZWFkX3J3bG9ja191bmxvY2soICZkaWN0LT5kaWN0X2xvY2sgKSwgLyogaWdub3JlICovICApOworCXJldHVybiAqYnVmOworZXJyb3I6CQorCS8qIEZyZWUgdGhlIHJ3bG9jayAqLworCUNIRUNLX1BPU0lYX0RPKCAgcHRocmVhZF9yd2xvY2tfdW5sb2NrKCAmZGljdC0+ZGljdF9sb2NrICksIC8qIGlnbm9yZSAqLyAgKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogRHVtcCBBVlAgdmFsdWVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBEZWZhdWx0IGR1bXAgZnVuY3Rpb25zICovCitzdGF0aWMgREVDTEFSRV9GRF9EVU1QX1BST1RPVFlQRShkdW1wX3ZhbF9vcywgdW5pb24gYXZwX3ZhbHVlICogdmFsdWUpCit7CisJaW50IGk7CisJCisJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9kdW1wX2V4dGVuZCggRkRfRFVNUF9TVERfUEFSQU1TLCAiPCIpLCByZXR1cm4gTlVMTCk7CisJZm9yIChpID0gMDsgaSA8IHZhbHVlLT5vcy5sZW47IGkrKykgeworCQlpZiAoaSA9PSAxMDI0KSB7IC8qIER1bXAgb25seSB1cCB0byAxMDI0IGJ5dGVzIG9mIHRoZSBidWZmZXIgKi8KKwkJCUNIRUNLX01BTExPQ19ETyggZmRfZHVtcF9leHRlbmQoIEZEX0RVTVBfU1REX1BBUkFNUywgIlsuLi5dIChsZW49JXpkKSIsIHZhbHVlLT5vcy5sZW4pLCByZXR1cm4gTlVMTCk7CisJCQlicmVhazsKKwkJfQorCQlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICIlcyUwMmhoWCIsIChpPT0wID8gIiIgOiAiICIpLCB2YWx1ZS0+b3MuZGF0YVtpXSksIHJldHVybiBOVUxMKTsKKwl9CisJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9kdW1wX2V4dGVuZCggRkRfRFVNUF9TVERfUEFSQU1TLCAiPiIpLCByZXR1cm4gTlVMTCk7CisJcmV0dXJuICpidWY7Cit9CisKK3N0YXRpYyBERUNMQVJFX0ZEX0RVTVBfUFJPVE9UWVBFKGR1bXBfdmFsX2kzMiwgdW5pb24gYXZwX3ZhbHVlICogdmFsdWUpCit7CisJcmV0dXJuIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICIlaSAoMHgleCkiLCB2YWx1ZS0+aTMyLCB2YWx1ZS0+aTMyKTsKK30KKworc3RhdGljIERFQ0xBUkVfRkRfRFVNUF9QUk9UT1RZUEUoZHVtcF92YWxfaTY0LCB1bmlvbiBhdnBfdmFsdWUgKiB2YWx1ZSkKK3sKKwlyZXR1cm4gZmRfZHVtcF9leHRlbmQoIEZEX0RVTVBfU1REX1BBUkFNUywgIiUiIFBSSWQ2NCAiICgweCUiIFBSSXg2NCAiKSIsIHZhbHVlLT5pNjQsIHZhbHVlLT5pNjQpOworfQorCitzdGF0aWMgREVDTEFSRV9GRF9EVU1QX1BST1RPVFlQRShkdW1wX3ZhbF91MzIsIHVuaW9uIGF2cF92YWx1ZSAqIHZhbHVlKQoreworCXJldHVybiBmZF9kdW1wX2V4dGVuZCggRkRfRFVNUF9TVERfUEFSQU1TLCAiJXUgKDB4JXgpIiwgdmFsdWUtPnUzMiwgdmFsdWUtPnUzMik7Cit9CisKK3N0YXRpYyBERUNMQVJFX0ZEX0RVTVBfUFJPVE9UWVBFKGR1bXBfdmFsX3U2NCwgdW5pb24gYXZwX3ZhbHVlICogdmFsdWUpCit7CisJcmV0dXJuIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICIlIiBQUkl1NjQgIiAoMHglIiBQUkl4NjQgIikiLCB2YWx1ZS0+dTY0LCB2YWx1ZS0+dTY0KTsKK30KKworc3RhdGljIERFQ0xBUkVfRkRfRFVNUF9QUk9UT1RZUEUoZHVtcF92YWxfZjMyLCB1bmlvbiBhdnBfdmFsdWUgKiB2YWx1ZSkKK3sKKwlyZXR1cm4gZmRfZHVtcF9leHRlbmQoIEZEX0RVTVBfU1REX1BBUkFNUywgIiVmIiwgdmFsdWUtPmYzMik7Cit9CisKK3N0YXRpYyBERUNMQVJFX0ZEX0RVTVBfUFJPVE9UWVBFKGR1bXBfdmFsX2Y2NCwgdW5pb24gYXZwX3ZhbHVlICogdmFsdWUpCit7CisJcmV0dXJuIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICIlZyIsIHZhbHVlLT5mNjQpOworfQorCisvKiBHZXQgdGhlIGR1bXAgZnVuY3Rpb24gZm9yIGJhc2ljIGRpY3RfYXZwX2Jhc2V0eXBlICovCitzdGF0aWMgREVDTEFSRV9GRF9EVU1QX1BST1RPVFlQRSgoKmdldF9kZWZhdWx0X2R1bXBfdmFsX2NiKGVudW0gZGljdF9hdnBfYmFzZXR5cGUgZGF0YXR5cGUpKSwgdW5pb24gYXZwX3ZhbHVlICopCit7CisJc3dpdGNoIChkYXRhdHlwZSkgeworCQljYXNlIEFWUF9UWVBFX09DVEVUU1RSSU5HOgorCQkJcmV0dXJuICZkdW1wX3ZhbF9vczsKKwkJCisJCWNhc2UgQVZQX1RZUEVfSU5URUdFUjMyOgorCQkJcmV0dXJuICZkdW1wX3ZhbF9pMzI7CisKKwkJY2FzZSBBVlBfVFlQRV9JTlRFR0VSNjQ6CisJCQlyZXR1cm4gJmR1bXBfdmFsX2k2NDsKKworCQljYXNlIEFWUF9UWVBFX1VOU0lHTkVEMzI6CisJCQlyZXR1cm4gJmR1bXBfdmFsX3UzMjsKKworCQljYXNlIEFWUF9UWVBFX1VOU0lHTkVENjQ6CisJCQlyZXR1cm4gJmR1bXBfdmFsX3U2NDsKKworCQljYXNlIEFWUF9UWVBFX0ZMT0FUMzI6CisJCQlyZXR1cm4gJmR1bXBfdmFsX2YzMjsKKworCQljYXNlIEFWUF9UWVBFX0ZMT0FUNjQ6CisJCQlyZXR1cm4gJmR1bXBfdmFsX2Y2NDsKKwkJCisJCWNhc2UgQVZQX1RZUEVfR1JPVVBFRDoKKwkJCVRSQUNFX0RFQlVHKEZVTEwsICJlcnJvcjogZ3JvdXBlZCBBVlAgd2l0aCBhIHZhbHVlISIpOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyogaW5kZW50IGluc2lkZSBhbiBvYmplY3QgKGR1cGxpY2F0ZSBmcm9tIG1lc3NhZ2VzLmMpICovCisjZGVmaW5lIElOT0JKSERSIAkiJSpzICAgIgorI2RlZmluZSBJTk9CSkhEUlZBTCAJaW5kZW50PDAgPyAxIDogaW5kZW50LCBpbmRlbnQ8MCA/ICItIiA6ICJ8IgorCit0eXBlZGVmIERFQ0xBUkVfRkRfRFVNUF9QUk9UT1RZUEUoKCpkdW1wX3ZhbF9jYl90KSwgdW5pb24gYXZwX3ZhbHVlICopOworCisvKiBGb3JtYXR0ZXIgZm9yIHRoZSBBVlAgdmFsdWUgZHVtcCBsaW5lICovCitzdGF0aWMgREVDTEFSRV9GRF9EVU1QX1BST1RPVFlQRShkdW1wX2F2cF92YWwsIHVuaW9uIGF2cF92YWx1ZSAqYXZwX3ZhbHVlLCAKKwkJCWR1bXBfdmFsX2NiX3QgZGVmX2R1bXBfdmFsX2NiLCAKKwkJCWR1bXBfdmFsX2NiX3QgZHVtcF92YWxfY2IsIAorCQkJZW51bSBkaWN0X2F2cF9iYXNldHlwZSBkYXRhdHlwZSwgCisJCQljaGFyICogdHlwZV9uYW1lLCAKKwkJCWNoYXIgKiBjb25zdF9uYW1lLCAKKwkJCWludCBpbmRlbnQsIAorCQkgICAgICAgIGludCBoZWFkZXIpCit7CisJaWYgKGhlYWRlcikgeworCQkvKiBIZWFkZXIgZm9yIGFsbCBBVlAgdmFsdWVzIGR1bXBzOiAqLworCQlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsIElOT0JKSERSICJ2YWx1ZSAiLCBJTk9CSkhEUlZBTCksIHJldHVybiBOVUxMKTsKKwkKKwkJLyogSWYgdGhlIHR5cGUgaXMgcHJvdmlkZWQsIHdyaXRlIGl0ICovCisJCWlmICh0eXBlX25hbWUpIHsKKwkJCUNIRUNLX01BTExPQ19ETyggZmRfZHVtcF9leHRlbmQoIEZEX0RVTVBfU1REX1BBUkFNUywgInQ6ICclcycgIiwgdHlwZV9uYW1lKSwgcmV0dXJuIE5VTEwpOworCQl9CisJCisJCS8qIEFsd2F5cyBnaXZlIHRoZSBiYXNlIGRhdGF0eXBlIGFueXdheSAqLworCQlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICIoJXMpICIsIHR5cGVfYmFzZV9uYW1lW2RhdGF0eXBlXSksIHJldHVybiBOVUxMKTsKKworCQkvKiBOb3csIHRoZSB2YWx1ZSAqLworCQlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICJ2OiAiKSwgcmV0dXJuIE5VTEwpOworCX0KKwlpZiAoY29uc3RfbmFtZSkgeworCQlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICInJXMnICgiLCBjb25zdF9uYW1lKSwgcmV0dXJuIE5VTEwpOworCX0KKwlpZiAoZHVtcF92YWxfY2IpIHsKKwkJQ0hFQ0tfTUFMTE9DX0RPKCAoKmR1bXBfdmFsX2NiKSggRkRfRFVNUF9TVERfUEFSQU1TLCBhdnBfdmFsdWUpLCBmZF9kdW1wX2V4dGVuZCggRkRfRFVNUF9TVERfUEFSQU1TLCAiKGR1bXAgZmFpbGVkKSIpKTsKKwl9IGVsc2UgeworCQlDSEVDS19NQUxMT0NfRE8oICgqZGVmX2R1bXBfdmFsX2NiKSggRkRfRFVNUF9TVERfUEFSQU1TLCBhdnBfdmFsdWUpLCByZXR1cm4gTlVMTCk7CisJfQorCWlmIChjb25zdF9uYW1lKSB7CisJCUNIRUNLX01BTExPQ19ETyggZmRfZHVtcF9leHRlbmQoIEZEX0RVTVBfU1REX1BBUkFNUywgIikiKSwgcmV0dXJuIE5VTEwpOworCX0KKwkKKwkvKiBEb25lISAqLworCXJldHVybiAqYnVmOworfQorCisvKiBEdW1wIHRoZSB2YWx1ZSBvZiBhbiBBVlAgb2Yga25vd24gdHlwZSBpbnRvIHRoZSByZXR1cm5lZCBzdHIgKi8KK0RFQ0xBUkVfRkRfRFVNUF9QUk9UT1RZUEUoZmRfZGljdF9kdW1wX2F2cF92YWx1ZSwgdW5pb24gYXZwX3ZhbHVlICphdnBfdmFsdWUsIHN0cnVjdCBkaWN0X29iamVjdCAqIG1vZGVsLCBpbnQgaW5kZW50LCBpbnQgaGVhZGVyKQoreworCURFQ0xBUkVfRkRfRFVNUF9QUk9UT1RZUEUoKCpkdW1wX3ZhbF9jYiksIHVuaW9uIGF2cF92YWx1ZSAqYXZwX3ZhbHVlKSA9IE5VTEw7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogdHlwZSA9IE5VTEw7CisJY2hhciAqIHR5cGVfbmFtZSA9IE5VTEw7CisJY2hhciAqIGNvbnN0X25hbWUgPSBOVUxMOworCQorCUZEX0RVTVBfSEFORExFX09GRlNFVCgpOworCQorCS8qIEhhbmRsZSBpbnZhbGlkIHBhcmFtZXRlcnMgKi8KKwlpZiAoIWF2cF92YWx1ZSkgeworCQlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICIoYXZwIHZhbHVlIG5vdCBzZXQpIiksIHJldHVybiBOVUxMKTsKKwkJcmV0dXJuICpidWY7CisJfQorCisJaWYgKCFtb2RlbCkgeworCQlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICIobW9kZWwgbm90IHNldCkiKSwgcmV0dXJuIE5VTEwpOworCQlyZXR1cm4gKmJ1ZjsKKwl9CisJCisJaWYgKCEgKAl2ZXJpZnlfb2JqZWN0KG1vZGVsKSAmJiAobW9kZWwtPnR5cGUgPT0gRElDVF9BVlApICkpIHsKKwkJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9kdW1wX2V4dGVuZCggRkRfRFVNUF9TVERfUEFSQU1TLCAiKGludmFsaWQgbW9kZWwpIiksIHJldHVybiBOVUxMKTsKKwkJcmV0dXJuICpidWY7CisJfQorCQorCS8qIEdldCB0aGUgdHlwZSBkZWZpbml0aW9uIG9mIHRoaXMgQVZQICovCisJdHlwZSA9IG1vZGVsLT5wYXJlbnQ7CisJaWYgKHR5cGUpIHsKKwkJc3RydWN0IGRpY3RfZW51bXZhbF9yZXF1ZXN0ICByZXF1ZXN0OworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBlbnVtdmFsID0gTlVMTDsKKwkJCisJCXR5cGVfbmFtZSA9IHR5cGUtPmRhdGEudHlwZS50eXBlX25hbWU7CisJCQorCQkvKiBvdmVyd3JpdGUgdGhlIGR1bXAgZnVuY3Rpb24gPyAqLworCQlpZiAodHlwZS0+ZGF0YS50eXBlLnR5cGVfZHVtcCkKKwkJCWR1bXBfdmFsX2NiID0gdHlwZS0+ZGF0YS50eXBlLnR5cGVfZHVtcDsKKwkJCisJCS8qIE5vdyBjaGVjayBpZiB0aGUgQVZQIHZhbHVlIG1hdGNoZXMgYSBjb25zdGFudCAqLworCQltZW1zZXQoJnJlcXVlc3QsIDAsIHNpemVvZihyZXF1ZXN0KSk7CisJCXJlcXVlc3QudHlwZV9vYmogPSB0eXBlOworCQltZW1jcHkoJnJlcXVlc3Quc2VhcmNoLmVudW1fdmFsdWUsIGF2cF92YWx1ZSwgc2l6ZW9mKHVuaW9uIGF2cF92YWx1ZSkpOworCQkvKiBieXBhc3MgY2hlY2tzICovCisJCWlmICgoc2VhcmNoX2VudW12YWwoIHR5cGUtPmRpY28sIEVOVU1WQUxfQllfU1RSVUNULCAmcmVxdWVzdCwgJmVudW12YWwgKSA9PSAwKSAmJiAoZW51bXZhbCkpIHsKKwkJCS8qIFdlIGZvdW5kIGEgY29uc3RhbnQsIGdldCBpdHMgbmFtZSAqLworCQkJY29uc3RfbmFtZSA9IGVudW12YWwtPmRhdGEuZW51bXZhbC5lbnVtX25hbWU7CisJCX0KKwl9CisJCisJLyogQW5kIGZpbmFsbHksIGR1bXAgdGhlIHZhbHVlICovCisJQ0hFQ0tfTUFMTE9DX0RPKCBkdW1wX2F2cF92YWwoRkRfRFVNUF9TVERfUEFSQU1TLCBhdnBfdmFsdWUsIGdldF9kZWZhdWx0X2R1bXBfdmFsX2NiKG1vZGVsLT5kYXRhLmF2cC5hdnBfYmFzZXR5cGUpLCBkdW1wX3ZhbF9jYiwgbW9kZWwtPmRhdGEuYXZwLmF2cF9iYXNldHlwZSwgdHlwZV9uYW1lLCBjb25zdF9uYW1lLCBpbmRlbnQsIGhlYWRlciksIHJldHVybiBOVUxMICk7CisJcmV0dXJuICpidWY7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cG9ydGVkIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGVzZSBhcmUgdGhlIGZ1bmN0aW9ucyBleHBvcnRlZCBvdXRzaWRlIGxpYmZyZWVEaWFtZXRlci4gKi8KKworLyogR2V0IHRoZSBkYXRhIGFzc29jaWF0ZWQgdG8gYW4gb2JqZWN0ICovCitpbnQgZmRfZGljdF9nZXR0eXBlICggc3RydWN0IGRpY3Rfb2JqZWN0ICogb2JqZWN0LCBlbnVtIGRpY3Rfb2JqZWN0X3R5cGUgKiB0eXBlKQoreworCVRSQUNFX0VOVFJZKCIlcCAlcCIsIG9iamVjdCwgdHlwZSk7CisJCisJQ0hFQ0tfUEFSQU1TKCB0eXBlICYmIHZlcmlmeV9vYmplY3Qob2JqZWN0KSApOworCQorCS8qIENvcHkgdGhlIHZhbHVlIGFuZCByZXR1cm4gKi8KKwkqdHlwZSA9IG9iamVjdC0+dHlwZTsKKwlyZXR1cm4gMDsKK30KKworaW50IGZkX2RpY3RfZ2V0ZGljdCAoIHN0cnVjdCBkaWN0X29iamVjdCAqIG9iamVjdCwgc3RydWN0IGRpY3Rpb25hcnkgKiogZGljdCkKK3sKKwlUUkFDRV9FTlRSWSgiJXAgJXAiLCBvYmplY3QsIGRpY3QpOworCQorCUNIRUNLX1BBUkFNUyggZGljdCAmJiB2ZXJpZnlfb2JqZWN0KG9iamVjdCkgKTsKKwkKKwkvKiBDb3B5IHRoZSB2YWx1ZSBhbmQgcmV0dXJuICovCisJKmRpY3QgPSBvYmplY3QtPmRpY287CisJcmV0dXJuIDA7Cit9CisKKworLyogR2V0IHRoZSBkYXRhIGFzc29jaWF0ZWQgdG8gYW4gb2JqZWN0ICovCitpbnQgZmRfZGljdF9nZXR2YWwgKCBzdHJ1Y3QgZGljdF9vYmplY3QgKiBvYmplY3QsIHZvaWQgKiB2YWwpCit7CisJVFJBQ0VfRU5UUlkoIiVwICVwIiwgb2JqZWN0LCB2YWwpOworCQorCUNIRUNLX1BBUkFNUyggdmFsICYmIHZlcmlmeV9vYmplY3Qob2JqZWN0KSApOworCQorCS8qIENvcHkgdGhlIHZhbHVlIGFuZCByZXR1cm4gKi8KKwltZW1jcHkodmFsLCAmb2JqZWN0LT5kYXRhLCBfT0JJTkZPKG9iamVjdCkuZGF0YXNpemUpOzsKKwlyZXR1cm4gMDsKK30KKworLyogQWRkIGEgbmV3IG9iamVjdCBpbiB0aGUgZGljdGlvbmFyeSAqLworaW50IGZkX2RpY3RfbmV3ICggc3RydWN0IGRpY3Rpb25hcnkgKiBkaWN0LCBlbnVtIGRpY3Rfb2JqZWN0X3R5cGUgdHlwZSwgdm9pZCAqIGRhdGEsIHN0cnVjdCBkaWN0X29iamVjdCAqIHBhcmVudCwgc3RydWN0IGRpY3Rfb2JqZWN0ICoqcmVmICkKK3sKKwlpbnQgcmV0ID0gMDsKKwlpbnQgZHVwb3MgPSAwOworCXN0cnVjdCBkaWN0X29iamVjdCAqIG5ldyA9IE5VTEw7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogdmVuZG9yID0gTlVMTDsKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBsb2NyZWYgPSBOVUxMOworCQorCVRSQUNFX0VOVFJZKCIlcCAlZCglcykgJXAgJXAgJXAiLCBkaWN0LCB0eXBlLCBkaWN0X29ial9pbmZvW0NIRUNLX1RZUEUodHlwZSkgPyB0eXBlIDogMF0ubmFtZSwgZGF0YSwgcGFyZW50LCByZWYpOworCQorCS8qIENoZWNrIHBhcmFtZXRlcnMgKi8KKwlDSEVDS19QQVJBTVMoIGRpY3QgJiYgKGRpY3QtPmRpY3RfZXllYyA9PSBESUNUX0VZRUNBVENIRVIpICYmIENIRUNLX1RZUEUodHlwZSkgJiYgZGF0YSAgKTsKKwkKKwkvKiBDaGVjayB0aGUgInBhcmVudCIgcGFyYW1ldGVyICovCisJc3dpdGNoIChkaWN0X29ial9pbmZvW3R5cGVdLnBhcmVudCkgeworCQljYXNlIDA6CS8qIHBhcmVudCBpcyBmb3JiaWRkZW4gKi8KKwkJCUNIRUNLX1BBUkFNU19ETyggcGFyZW50ID09IE5VTEwsIGdvdG8gZXJyb3JfcGFyYW0gKTsKKwkJCisJCWNhc2UgMToJLyogcGFyZW50IGlzIG9wdGlvbmFsICovCisJCQlpZiAocGFyZW50ID09IE5VTEwpCisJCQkJYnJlYWs7CisJCQorCQljYXNlIDI6IC8qIHBhcmVudCBpcyBtYW5kYXRvcnkgKi8KKwkJCUNIRUNLX1BBUkFNU19ETyggIHZlcmlmeV9vYmplY3QocGFyZW50KSwgZ290byBlcnJvcl9wYXJhbSAgKTsKKwkJCQorCQkJaWYgKHR5cGUgPT0gRElDVF9SVUxFICkgeyAvKiBTcGVjaWFsIGNhc2UgOiBncm91cGVkIEFWUCBvciBDb21tYW5kIHBhcmVudHMgYXJlIGFsbG93ZWQgKi8KKwkJCQlDSEVDS19QQVJBTVNfRE8oIChwYXJlbnQtPnR5cGUgPT0gRElDVF9DT01NQU5EICkgCisJCQkJCQl8fCAoIChwYXJlbnQtPnR5cGUgPT0gRElDVF9BVlApICYmIChwYXJlbnQtPmRhdGEuYXZwLmF2cF9iYXNldHlwZSA9PSBBVlBfVFlQRV9HUk9VUEVEICkgKSwgZ290byBlcnJvcl9wYXJhbSApOworCQkJfSBlbHNlIHsKKwkJCQlDSEVDS19QQVJBTVNfRE8oIHBhcmVudC0+dHlwZSA9PSBkaWN0X29ial9pbmZvW3R5cGVdLnBhcmVudHR5cGUsIGdvdG8gZXJyb3JfcGFyYW0gKTsKKwkJCX0KKwl9CisJCisJLyogRm9yIEFWUCBvYmplY3QsIHdlIG11c3QgYWxzbyBjaGVjayB0aGF0IHRoZSAidmVuZG9yIiByZWZlcmVuY2VkIGV4aXN0cyAqLworCWlmICh0eXBlID09IERJQ1RfQVZQKSB7CisJCUNIRUNLX0ZDVF9ETyggIGZkX2RpY3Rfc2VhcmNoKCBkaWN0LCBESUNUX1ZFTkRPUiwgVkVORE9SX0JZX0lELCAmKCgoc3RydWN0IGRpY3RfYXZwX2RhdGEgKilkYXRhKS0+YXZwX3ZlbmRvciksICh2b2lkKikmdmVuZG9yLCBFTk9FTlQgKSwKKwkJCXsgVFJBQ0VfREVCVUcoSU5GTywgIlVuYWJsZSB0byBmaW5kIHZlbmRvciAnJWQnIHJlZmVyZW5jZWQgaW4gdGhlIEFWUCBkYXRhIiwgKChzdHJ1Y3QgZGljdF9hdnBfZGF0YSAqKWRhdGEpLT5hdnBfdmVuZG9yKTsgZ290byBlcnJvcl9wYXJhbTsgfSAgKTsKKwkJCisJCS8qIEFsc28gY2hlY2sgaWYgYSBwYXJlbnQgaXMgcHJvdmlkZWQsIHRoYXQgdGhlIHR5cGUgYXJlIHRoZSBzYW1lICovCisJCWlmIChwYXJlbnQpIHsKKwkJCUNIRUNLX1BBUkFNU19ETyggIHBhcmVudC0+ZGF0YS50eXBlLnR5cGVfYmFzZSA9PSAoKHN0cnVjdCBkaWN0X2F2cF9kYXRhICopZGF0YSktPmF2cF9iYXNldHlwZSwgZ290byBlcnJvcl9wYXJhbSAgKTsKKwkJfQorCX0KKwkKKwkvKiBGb3IgUlVMRSBvYmplY3QsIHdlIG11c3QgYWxzbyBjaGVjayB0aGF0IHRoZSAiYXZwIiByZWZlcmVuY2VkIGV4aXN0cyAqLworCWlmICh0eXBlID09IERJQ1RfUlVMRSkgeworCQlDSEVDS19QQVJBTVNfRE8oICB2ZXJpZnlfb2JqZWN0KCgoc3RydWN0IGRpY3RfcnVsZV9kYXRhICopZGF0YSktPnJ1bGVfYXZwKSwgZ290byBlcnJvcl9wYXJhbSAgKTsKKwkJQ0hFQ0tfUEFSQU1TX0RPKCAgKChzdHJ1Y3QgZGljdF9ydWxlX2RhdGEgKilkYXRhKS0+cnVsZV9hdnAtPnR5cGUgPT0gRElDVF9BVlAsIGdvdG8gZXJyb3JfcGFyYW0gICk7CisJfQorCQorCS8qIEZvciBDT01NQU5EIG9iamVjdCwgY2hlY2sgdGhhdCB0aGUgJ1InIGZsYWcgaXMgZml4ZWQgKi8KKwlpZiAodHlwZSA9PSBESUNUX0NPTU1BTkQpIHsKKwkJQ0hFQ0tfUEFSQU1TX0RPKCAoKHN0cnVjdCBkaWN0X2NtZF9kYXRhICopZGF0YSktPmNtZF9mbGFnX21hc2sgJiBDTURfRkxBR19SRVFVRVNULCBnb3RvIGVycm9yX3BhcmFtICAgKTsKKwl9CisKKwkvKiBGb3IgRU5VTVZBTCBvYmplY3QsIGNoZWNrIGlmIHRoZSBwYXJlbnQgdHlwZSBpcyBhbiBPY3RldFN0cmluZyAqLworCWlmICh0eXBlID09IERJQ1RfRU5VTVZBTCkgeworCQlpZiAocGFyZW50LT5kYXRhLnR5cGUudHlwZV9iYXNlID09IEFWUF9UWVBFX09DVEVUU1RSSU5HKQorCQkJZHVwb3MgPSAxOworCX0KKwkKKwkvKiBXZSBoYXZlIHRvIGNoZWNrIHRoYXQgdGhlIG5ldyB2YWx1ZXMgYXJlIG5vdCBlcXVhbCB0byB0aGUgc2VudGluZWxzICovCisJaWYgKHR5cGUgPT0gRElDVF9WRU5ET1IpIHsKKwkJQ0hFQ0tfUEFSQU1TX0RPKCAoKHN0cnVjdCBkaWN0X3ZlbmRvcl9kYXRhICopZGF0YSktPnZlbmRvcl9pZCAhPSAwLCBnb3RvIGVycm9yX3BhcmFtICAgKTsKKwl9CisJaWYgKHR5cGUgPT0gRElDVF9BUFBMSUNBVElPTikgeworCQlDSEVDS19QQVJBTVNfRE8oICgoc3RydWN0IGRpY3RfYXBwbGljYXRpb25fZGF0YSAqKWRhdGEpLT5hcHBsaWNhdGlvbl9pZCAhPSAwLCBnb3RvIGVycm9yX3BhcmFtICAgKTsKKwl9CisJCisJLyogUGFyYW1ldGVycyBhcmUgdmFsaWQsIGNyZWF0ZSB0aGUgbmV3IG9iamVjdCAqLworCUNIRUNLX01BTExPQyggIG5ldyA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGRpY3Rfb2JqZWN0KSkgICk7CisJCisJLyogSW5pdGlhbGl6ZSB0aGUgZGF0YSBvZiB0aGUgbmV3IG9iamVjdCAqLworCWluaXRfb2JqZWN0KG5ldywgdHlwZSk7CisJaW5pdF9vYmplY3RfZGF0YShuZXcsIGRhdGEsIHR5cGUsIGR1cG9zKTsKKwluZXctPmRpY28gPSBkaWN0OworCW5ldy0+cGFyZW50ID0gcGFyZW50OworCQorCS8qIFdlIHdpbGwgY2hhbmdlIHRoZSBkaWN0aW9uYXJ5ID0+IGFjcXVpcmUgdGhlIHdyaXRlIGxvY2sgKi8KKwlDSEVDS19QT1NJWF9ETyggIHJldCA9IHB0aHJlYWRfcndsb2NrX3dybG9jaygmZGljdC0+ZGljdF9sb2NrKSwgIGdvdG8gZXJyb3JfZnJlZSAgKTsKKwkKKwkvKiBOb3cgbGluayB0aGUgb2JqZWN0IC0tIHRoaXMgYWxzbyBjaGVja3MgdGhhdCBubyBvYmplY3Qgd2l0aCBzYW1lIGtleXMgYWxyZWFkeSBleGlzdHMgKi8KKwlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBESUNUX1ZFTkRPUjoKKwkJCS8qIEEgdmVuZG9yIG9iamVjdCBpcyBsaW5rZWQgaW4gdGhlIGdfZGljdF92ZW5kb3JzLmxpc3RbMF0sIGJ5IHRoZWlyIGlkICovCisJCQlyZXQgPSBmZF9saXN0X2luc2VydF9vcmRlcmVkICggJmRpY3QtPmRpY3RfdmVuZG9ycy5saXN0WzBdLCAmbmV3LT5saXN0WzBdLCAoaW50ICgqKSh2b2lkKiwgdm9pZCAqKSlvcmRlcl92ZW5kb3JfYnlfaWQsICh2b2lkICoqKSZsb2NyZWYgKTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBlcnJvcl91bmxvY2s7CisJCQlicmVhazsKKwkJCisJCWNhc2UgRElDVF9BUFBMSUNBVElPTjoKKwkJCS8qIEFuIGFwcGxpY2F0aW9uIG9iamVjdCBpcyBsaW5rZWQgaW4gdGhlIGdfZGljdF9hcHBsY2lhdGlvbnMubGlzdFswXSwgYnkgdGhlaXIgaWQgKi8KKwkJCXJldCA9IGZkX2xpc3RfaW5zZXJ0X29yZGVyZWQgKCAmZGljdC0+ZGljdF9hcHBsaWNhdGlvbnMubGlzdFswXSwgJm5ldy0+bGlzdFswXSwgKGludCAoKikodm9pZCosIHZvaWQgKikpb3JkZXJfYXBwbGlfYnlfaWQsICh2b2lkICoqKSZsb2NyZWYgKTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBlcnJvcl91bmxvY2s7CisJCQlicmVhazsKKwkJCisJCWNhc2UgRElDVF9UWVBFOgorCQkJLyogQSB0eXBlIG9iamVjdCBpcyBsaW5rZWQgaW4gZ19saXN0X3R5cGVzIGJ5IGl0cyBuYW1lICovCisJCQlyZXQgPSBmZF9saXN0X2luc2VydF9vcmRlcmVkICggJmRpY3QtPmRpY3RfdHlwZXMsICZuZXctPmxpc3RbMF0sIChpbnQgKCopKHZvaWQqLCB2b2lkICopKW9yZGVyX3R5cGVfYnlfbmFtZSwgKHZvaWQgKiopJmxvY3JlZiApOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIGVycm9yX3VubG9jazsKKwkJCWJyZWFrOworCQkKKwkJY2FzZSBESUNUX0VOVU1WQUw6CisJCQkvKiBBIHR5cGVfZW51bSBvYmplY3QgaXMgbGlua2VkIGluIGl0J3MgcGFyZW50ICd0eXBlJyBvYmplY3QgbGlzdHMgMSBhbmQgMiBieSBpdHMgbmFtZSBhbmQgdmFsdWVzICovCisJCQlyZXQgPSBmZF9saXN0X2luc2VydF9vcmRlcmVkICggJnBhcmVudC0+bGlzdFsxXSwgJm5ldy0+bGlzdFswXSwgKGludCAoKikodm9pZCosIHZvaWQgKikpb3JkZXJfZW51bV9ieV9uYW1lLCAodm9pZCAqKikmbG9jcmVmICk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gZXJyb3JfdW5sb2NrOworCQkJCisJCQlyZXQgPSBmZF9saXN0X2luc2VydF9vcmRlcmVkICggJnBhcmVudC0+bGlzdFsyXSwgJm5ldy0+bGlzdFsxXSwgKGludCAoKikodm9pZCosIHZvaWQgKikpb3JkZXJfZW51bV9ieV92YWwsICh2b2lkICoqKSZsb2NyZWYgKTsKKwkJCWlmIChyZXQpIHsgCisJCQkJZmRfbGlzdF91bmxpbmsoJm5ldy0+bGlzdFswXSk7IAorCQkJCWdvdG8gZXJyb3JfdW5sb2NrOyAKKwkJCX0KKwkJCWJyZWFrOworCQkKKwkJY2FzZSBESUNUX0FWUDoKKwkJCS8qIEFuIGF2cCBvYmplY3QgaXMgbGlua2VkIGluIGxpc3RzIDEgYW5kIDIgb2YgaXRzIHZlbmRvciwgYnkgY29kZSBhbmQgbmFtZSAqLworCQkJcmV0ID0gZmRfbGlzdF9pbnNlcnRfb3JkZXJlZCAoICZ2ZW5kb3ItPmxpc3RbMV0sICZuZXctPmxpc3RbMF0sIChpbnQgKCopKHZvaWQqLCB2b2lkICopKW9yZGVyX2F2cF9ieV9jb2RlLCAodm9pZCAqKikmbG9jcmVmICk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gZXJyb3JfdW5sb2NrOworCQkJCisJCQlyZXQgPSBmZF9saXN0X2luc2VydF9vcmRlcmVkICggJnZlbmRvci0+bGlzdFsyXSwgJm5ldy0+bGlzdFsxXSwgKGludCAoKikodm9pZCosIHZvaWQgKikpb3JkZXJfYXZwX2J5X25hbWUsICh2b2lkICoqKSZsb2NyZWYgKTsKKwkJCWlmIChyZXQpIHsKKwkJCQlmZF9saXN0X3VubGluaygmbmV3LT5saXN0WzBdKTsKKwkJCQlnb3RvIGVycm9yX3VubG9jazsKKwkJCX0KKwkJCWJyZWFrOworCQkJCisJCWNhc2UgRElDVF9DT01NQU5EOgorCQkJLyogQSBjb21tYW5kIG9iamVjdCBpcyBsaW5rZWQgaW4gZ19saXN0X2NtZF9uYW1lIGFuZCBnX2xpc3RfY21kX2NvZGUgYnkgaXRzIG5hbWUgYW5kIGNvZGUgKi8KKwkJCXJldCA9IGZkX2xpc3RfaW5zZXJ0X29yZGVyZWQgKCAmZGljdC0+ZGljdF9jbWRfY29kZSwgJm5ldy0+bGlzdFsxXSwgKGludCAoKikodm9pZCosIHZvaWQgKikpb3JkZXJfY21kX2J5X2NvZGVmbCwgKHZvaWQgKiopJmxvY3JlZiApOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIGVycm9yX3VubG9jazsKKwkJCQorCQkJcmV0ID0gZmRfbGlzdF9pbnNlcnRfb3JkZXJlZCAoICZkaWN0LT5kaWN0X2NtZF9uYW1lLCAmbmV3LT5saXN0WzBdLCAoaW50ICgqKSh2b2lkKiwgdm9pZCAqKSlvcmRlcl9jbWRfYnlfbmFtZSwgKHZvaWQgKiopJmxvY3JlZiApOworCQkJaWYgKHJldCkgeworCQkJCWZkX2xpc3RfdW5saW5rKCZuZXctPmxpc3RbMV0pOworCQkJCWdvdG8gZXJyb3JfdW5sb2NrOworCQkJfQorCQkJYnJlYWs7CisJCQorCQljYXNlIERJQ1RfUlVMRToKKwkJCS8qIEEgcnVsZSBvYmplY3QgaXMgbGlua2VkIGluIGxpc3RbMl0gb2YgaXRzIHBhcmVudCBjb21tYW5kIG9yIEFWUCBieSB0aGUgbmFtZSBvZiB0aGUgQVZQIGl0IHJlZmVycyAqLworCQkJcmV0ID0gZmRfbGlzdF9pbnNlcnRfb3JkZXJlZCAoICZwYXJlbnQtPmxpc3RbMl0sICZuZXctPmxpc3RbMF0sIChpbnQgKCopKHZvaWQqLCB2b2lkICopKW9yZGVyX3J1bGVfYnlfYXZwdmMsICh2b2lkICoqKSZsb2NyZWYgKTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBlcnJvcl91bmxvY2s7CisJCQlicmVhazsKKwkJCQorCQlkZWZhdWx0OgorCQkJQVNTRVJUKDApOworCX0KKwkKKwkvKiBBIG5ldyBvYmplY3QgaGFzIGJlZW4gY3JlYXRlZCwgaW5jcmVtZW50IHRoZSBnbG9iYWwgY291bnRlciAqLworCWRpY3QtPmRpY3RfY291bnRbdHlwZV0rKzsKKwkKKwkvKiBVbmxvY2sgdGhlIGRpY3Rpb25hcnkgKi8KKwlDSEVDS19QT1NJWF9ETyggIHJldCA9IHB0aHJlYWRfcndsb2NrX3VubG9jaygmZGljdC0+ZGljdF9sb2NrKSwgIGdvdG8gZXJyb3JfZnJlZSAgKTsKKwkKKwkvKiBTYXZlIHRoZSBwb2ludGVyIHRvIHRoZSBuZXcgb2JqZWN0ICovCisJaWYgKHJlZikKKwkJKnJlZiA9IG5ldzsKKwkKKwlyZXR1cm4gMDsKKwkKK2Vycm9yX3BhcmFtOgorCXJldCA9IEVJTlZBTDsKKwlnb3RvIGFsbF9lcnJvcnM7CisKK2Vycm9yX3VubG9jazoKKwlDSEVDS19QT1NJWF9ETyggIHB0aHJlYWRfcndsb2NrX3VubG9jaygmZGljdC0+ZGljdF9sb2NrKSwgIC8qIGNvbnRpbnVlICovICApOworCWlmIChyZXQgPT0gRUVYSVNUKSB7CisJCS8qIFdlIGhhdmUgYSBkdXBsaWNhdGUga2V5IGluIGxvY3JlZi4gQ2hlY2sgaWYgdGhlIHBvaW50ZWQgb2JqZWN0IGlzIHRoZSBzYW1lIG9yIG5vdCAqLworCQlzd2l0Y2ggKHR5cGUpIHsKKwkJCWNhc2UgRElDVF9WRU5ET1I6CisJCQkJVFJBQ0VfREVCVUcoRlVMTCwgIlZlbmRvciAlcyBhbHJlYWR5IGluIGRpY3Rpb25hcnkiLCBuZXctPmRhdGEudmVuZG9yLnZlbmRvcl9uYW1lKTsKKwkJCQkvKiBpZiB3ZSBhcmUgaGVyZSwgaXQgbWVhbnMgdGhlIHR3byB2ZW5kb3JzIGlkIGFyZSBpZGVudGljYWwgKi8KKwkJCQlpZiAoZmRfb3NfY21wKGxvY3JlZi0+ZGF0YS52ZW5kb3IudmVuZG9yX25hbWUsIGxvY3JlZi0+ZGF0YXN0cl9sZW4sIAorCQkJCQkJbmV3LT5kYXRhLnZlbmRvci52ZW5kb3JfbmFtZSwgbmV3LT5kYXRhc3RyX2xlbikpIHsKKwkJCQkJVFJBQ0VfREVCVUcoSU5GTywgIkNvbmZsaWN0aW5nIHZlbmRvciBuYW1lOiAlcyIsIG5ldy0+ZGF0YS52ZW5kb3IudmVuZG9yX25hbWUpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJLyogT3RoZXJ3aXNlIChzYW1lIG5hbWUpLCB3ZSBjb25zaWRlciB0aGUgZnVuY3Rpb24gc3VjY2VlZGVkLCBzaW5jZSB0aGUgKHNhbWUpIG9iamVjdCBpcyBpbiB0aGUgZGljdGlvbmFyeSAqLworCQkJCXJldCA9IDA7IAorCQkJCWJyZWFrOworCisJCQljYXNlIERJQ1RfQVBQTElDQVRJT046CisJCQkJVFJBQ0VfREVCVUcoRlVMTCwgIkFwcGxpY2F0aW9uICVzIGFscmVhZHkgaW4gZGljdGlvbmFyeSIsIG5ldy0+ZGF0YS5hcHBsaWNhdGlvbi5hcHBsaWNhdGlvbl9uYW1lKTsKKwkJCQkvKiBnb3Qgc2FtZSBpZCAqLworCQkJCWlmIChmZF9vc19jbXAobG9jcmVmLT5kYXRhLmFwcGxpY2F0aW9uLmFwcGxpY2F0aW9uX25hbWUsIGxvY3JlZi0+ZGF0YXN0cl9sZW4sIAorCQkJCQkJbmV3LT5kYXRhLmFwcGxpY2F0aW9uLmFwcGxpY2F0aW9uX25hbWUsIG5ldy0+ZGF0YXN0cl9sZW4pKSB7CisJCQkJCVRSQUNFX0RFQlVHKEZVTEwsICJDb25mbGljdGluZyBhcHBsaWNhdGlvbiBuYW1lIik7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlyZXQgPSAwOworCQkJCWJyZWFrOworCisJCQljYXNlIERJQ1RfVFlQRToKKwkJCQlUUkFDRV9ERUJVRyhGVUxMLCAiVHlwZSAlcyBhbHJlYWR5IGluIGRpY3Rpb25hcnkiLCBuZXctPmRhdGEudHlwZS50eXBlX25hbWUpOworCQkJCS8qIGdvdCBzYW1lIG5hbWUgKi8KKwkJCQlpZiAobG9jcmVmLT5kYXRhLnR5cGUudHlwZV9iYXNlICE9IG5ldy0+ZGF0YS50eXBlLnR5cGVfYmFzZSkgeworCQkJCQlUUkFDRV9ERUJVRyhGVUxMLCAiQ29uZmxpY3RpbmcgYmFzZSB0eXBlIik7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvKiBkaXNjYXJkIG5ldyBkZWZpbml0aW9uIG9ubHkgaXQgYSBjYWxsYmFjayBpcyBwcm92aWRlZCBhbmQgZGlmZmVyZW50IGZyb20gdGhlIHByZXZpb3VzIG9uZSAqLworCQkJCWlmICgobmV3LT5kYXRhLnR5cGUudHlwZV9pbnRlcnByZXQpICYmIChsb2NyZWYtPmRhdGEudHlwZS50eXBlX2ludGVycHJldCAhPSBuZXctPmRhdGEudHlwZS50eXBlX2ludGVycHJldCkpIHsKKwkJCQkJVFJBQ0VfREVCVUcoRlVMTCwgIkNvbmZsaWN0aW5nIGludGVycHJldCBjYiIpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaWYgKChuZXctPmRhdGEudHlwZS50eXBlX2VuY29kZSkgJiYgKGxvY3JlZi0+ZGF0YS50eXBlLnR5cGVfZW5jb2RlICE9IG5ldy0+ZGF0YS50eXBlLnR5cGVfZW5jb2RlKSkgeworCQkJCQlUUkFDRV9ERUJVRyhGVUxMLCAiQ29uZmxpY3RpbmcgZW5jb2RlIGNiIik7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlpZiAoKG5ldy0+ZGF0YS50eXBlLnR5cGVfZHVtcCkgJiYgKGxvY3JlZi0+ZGF0YS50eXBlLnR5cGVfZHVtcCAhPSBuZXctPmRhdGEudHlwZS50eXBlX2R1bXApKSB7CisJCQkJCVRSQUNFX0RFQlVHKEZVTEwsICJDb25mbGljdGluZyBkdW1wIGNiIik7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlyZXQgPSAwOworCQkJCWJyZWFrOworCisJCQljYXNlIERJQ1RfRU5VTVZBTDoKKwkJCQlUUkFDRV9ERUJVRyhGVUxMLCAiRW51bSAlcyBhbHJlYWR5IGluIGRpY3Rpb25hcnkiLCBuZXctPmRhdGEuZW51bXZhbC5lbnVtX25hbWUpOworCQkJCS8qIGdvdCBlaXRoZXIgc2FtZSBuYW1lIG9yIHNhbWUgdmFsdWUuIFdlIGNoZWNrIHRoYXQgYm90aCBhcmUgdHJ1ZSAqLworCQkJCWlmIChvcmRlcl9lbnVtX2J5X25hbWUobG9jcmVmLCBuZXcpKSB7CisJCQkJCVRSQUNFX0RFQlVHKEZVTEwsICJDb25mbGljdGluZyBlbnVtIG5hbWUiKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWlmIChvcmRlcl9lbnVtX2J5X3ZhbChsb2NyZWYsIG5ldykpIHsKKwkJCQkJVFJBQ0VfREVCVUcoRlVMTCwgIkNvbmZsaWN0aW5nIGVudW0gdmFsdWUiKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXJldCA9IDA7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgRElDVF9BVlA6CisJCQkJVFJBQ0VfREVCVUcoRlVMTCwgIkFWUCAlcyBhbHJlYWR5IGluIGRpY3Rpb25hcnkiLCBuZXctPmRhdGEuYXZwLmF2cF9uYW1lKTsKKwkJCQkvKiBnb3QgZWl0aGVyIHNhbWUgbmFtZSBvciBjb2RlICovCisJCQkJaWYgKG9yZGVyX2F2cF9ieV9jb2RlKGxvY3JlZiwgbmV3KSkgeworCQkJCQlUUkFDRV9ERUJVRyhGVUxMLCAiQ29uZmxpY3RpbmcgQVZQIGNvZGUiKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWlmIChvcmRlcl9hdnBfYnlfbmFtZShsb2NyZWYsIG5ldykpIHsKKwkJCQkJVFJBQ0VfREVCVUcoRlVMTCwgIkNvbmZsaWN0aW5nIEFWUCBuYW1lIik7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlpZiAgKGxvY3JlZi0+ZGF0YS5hdnAuYXZwX3ZlbmRvciAhPSBuZXctPmRhdGEuYXZwLmF2cF92ZW5kb3IpIHsKKwkJCQkJVFJBQ0VfREVCVUcoRlVMTCwgIkNvbmZsaWN0aW5nIEFWUCB2ZW5kb3IiKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWlmICAobG9jcmVmLT5kYXRhLmF2cC5hdnBfZmxhZ19tYXNrICE9IG5ldy0+ZGF0YS5hdnAuYXZwX2ZsYWdfbWFzaykgeworCQkJCQlUUkFDRV9ERUJVRyhGVUxMLCAiQ29uZmxpY3RpbmcgQVZQIGZsYWdzIG1hc2siKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWlmICAoKGxvY3JlZi0+ZGF0YS5hdnAuYXZwX2ZsYWdfdmFsICYgbG9jcmVmLT5kYXRhLmF2cC5hdnBfZmxhZ19tYXNrKSAhPSAobmV3LT5kYXRhLmF2cC5hdnBfZmxhZ192YWwgJiBuZXctPmRhdGEuYXZwLmF2cF9mbGFnX21hc2spKSB7CisJCQkJCVRSQUNFX0RFQlVHKEZVTEwsICJDb25mbGljdGluZyBBVlAgZmxhZ3MgdmFsdWUiKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWlmICAobG9jcmVmLT5kYXRhLmF2cC5hdnBfYmFzZXR5cGUgIT0gbmV3LT5kYXRhLmF2cC5hdnBfYmFzZXR5cGUpIHsKKwkJCQkJVFJBQ0VfREVCVUcoRlVMTCwgIkNvbmZsaWN0aW5nIEFWUCBiYXNlIHR5cGUiKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXJldCA9IDA7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgRElDVF9DT01NQU5EOgorCQkJCVRSQUNFX0RFQlVHKEZVTEwsICJDb21tYW5kICVzIGFscmVhZHkgaW4gZGljdGlvbmFyeSIsIG5ldy0+ZGF0YS5jbWQuY21kX25hbWUpOworCQkJCS8qIFdlIGdvdCBlaXRoZXIgc2FtZSBuYW1lLCBvciBzYW1lIGNvZGUgKyBSIGZsYWcgKi8KKwkJCQlpZiAob3JkZXJfY21kX2J5X25hbWUobG9jcmVmLCBuZXcpKSB7CisJCQkJCVRSQUNFX0RFQlVHKEZVTEwsICJDb25mbGljdGluZyBjb21tYW5kIG5hbWUiKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWlmIChsb2NyZWYtPmRhdGEuY21kLmNtZF9jb2RlICE9IG5ldy0+ZGF0YS5jbWQuY21kX2NvZGUpIHsKKwkJCQkJVFJBQ0VfREVCVUcoRlVMTCwgIkNvbmZsaWN0aW5nIGNvbW1hbmQgY29kZSIpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaWYgKGxvY3JlZi0+ZGF0YS5jbWQuY21kX2ZsYWdfbWFzayAhPSBuZXctPmRhdGEuY21kLmNtZF9mbGFnX21hc2spIHsKKwkJCQkJVFJBQ0VfREVCVUcoRlVMTCwgIkNvbmZsaWN0aW5nIGNvbW1hbmQgZmxhZ3MgbWFzayAlaGh4OiVoaHgiLCBsb2NyZWYtPmRhdGEuY21kLmNtZF9mbGFnX21hc2ssIG5ldy0+ZGF0YS5jbWQuY21kX2ZsYWdfbWFzayk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlpZiAoKGxvY3JlZi0+ZGF0YS5jbWQuY21kX2ZsYWdfdmFsICYgbG9jcmVmLT5kYXRhLmNtZC5jbWRfZmxhZ19tYXNrKSAhPSAobmV3LT5kYXRhLmNtZC5jbWRfZmxhZ192YWwgJiBuZXctPmRhdGEuY21kLmNtZF9mbGFnX21hc2spKSB7CisJCQkJCVRSQUNFX0RFQlVHKEZVTEwsICJDb25mbGljdGluZyBjb21tYW5kIGZsYWdzIHZhbHVlIik7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlyZXQgPSAwOworCQkJCWJyZWFrOworCisJCQljYXNlIERJQ1RfUlVMRToKKwkJCQkvKiBCb3RoIHJ1bGVzIHBvaW50IHRvIHRoZSBzYW1lIEFWUHMgKGNvZGUgJiB2ZW5kb3IpICovCisJCQkJaWYgKGxvY3JlZi0+ZGF0YS5ydWxlLnJ1bGVfcG9zaXRpb24gIT0gbmV3LT5kYXRhLnJ1bGUucnVsZV9wb3NpdGlvbikgeworCQkJCQlUUkFDRV9ERUJVRyhGVUxMLCAiQ29uZmxpY3RpbmcgcnVsZSBwb3NpdGlvbiIpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaWYgKCAoKGxvY3JlZi0+ZGF0YS5ydWxlLnJ1bGVfcG9zaXRpb24gPT0gUlVMRV9GSVhFRF9IRUFEKSB8fAorCQkJCQkobG9jcmVmLT5kYXRhLnJ1bGUucnVsZV9wb3NpdGlvbiA9PSBSVUxFX0ZJWEVEX1RBSUwpKQorCQkJCSAgICAmJiAobG9jcmVmLT5kYXRhLnJ1bGUucnVsZV9vcmRlciAhPSBuZXctPmRhdGEucnVsZS5ydWxlX29yZGVyKSkgeworCQkJCQlUUkFDRV9ERUJVRyhGVUxMLCAiQ29uZmxpY3RpbmcgcnVsZSBvcmRlciIpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaWYgKGxvY3JlZi0+ZGF0YS5ydWxlLnJ1bGVfbWluICE9IG5ldy0+ZGF0YS5ydWxlLnJ1bGVfbWluKSB7CisJCQkJCWludCByMSA9IGxvY3JlZi0+ZGF0YS5ydWxlLnJ1bGVfbWluOworCQkJCQlpbnQgcjIgPSBuZXctPmRhdGEucnVsZS5ydWxlX21pbjsKKwkJCQkJaW50IHAgID0gbG9jcmVmLT5kYXRhLnJ1bGUucnVsZV9wb3NpdGlvbjsKKwkJCQkJaWYgKCAgKChyMSAhPSAtMSkgJiYgKHIyICE9IC0xKSkgLyogbm9uZSBvZiB0aGUgZGVmaW5pdGlvbnMgY29udGFpbnMgdGhlICJkZWZhdWx0IiB2YWx1ZSAqLworCQkJCQkgICB8fCAoKHAgPT0gUlVMRV9PUFRJT05BTCkgJiYgKHIxICE9IDApICYmIChyMiAhPSAwKSkgLyogdGhlIG90aGVyIHZhbHVlIGlzIG5vdCAwIGZvciBhbiBvcHRpb25hbCBydWxlICovCisJCQkJCSAgIHx8ICgocjEgIT0gMSkgJiYgKHIyICE9IDEpKSAvKiB0aGUgb3RoZXIgdmFsdWUgaXMgbm90IDEgZm9yIGFub3RoZXIgcnVsZSAqLworCQkJCQkpIHsKKwkJCQkJCVRSQUNFX0RFQlVHKEZVTEwsICJDb25mbGljdGluZyBydWxlIG1pbiIpOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKGxvY3JlZi0+ZGF0YS5ydWxlLnJ1bGVfbWF4ICE9IG5ldy0+ZGF0YS5ydWxlLnJ1bGVfbWF4KSB7CisJCQkJCVRSQUNFX0RFQlVHKEZVTEwsICJDb25mbGljdGluZyBydWxlIG1heCIpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJcmV0ID0gMDsKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoIXJldCkgeworCQkJVFJBQ0VfREVCVUcoRlVMTCwgIkFuIGV4aXN0aW5nIG9iamVjdCB3aXRoIHRoZSBzYW1lIGRhdGEgd2FzIGZvdW5kLCBpZ25vcmluZyB0aGUgZXJyb3IuLi4iKTsKKwkJfQorCQlpZiAocmVmKQorCQkJKnJlZiA9IGxvY3JlZjsKKwl9CithbGxfZXJyb3JzOgorCWlmIChyZXQgIT0gMCkgeworCQljaGFyICogYnVmID0gTlVMTDsKKwkJc2l6ZV90IGxlbiA9IDAsIG9mZnNldD0wOworCQkKKwkJaWYgKHR5cGUgPT0gRElDVF9FTlVNVkFMKSB7CisJCQlDSEVDS19NQUxMT0MoIGR1bXBfZW51bXZhbF9kYXRhICggJmJ1ZiwgJmxlbiwgJm9mZnNldCwgZGF0YSwgcGFyZW50LT5kYXRhLnR5cGUudHlwZV9iYXNlICkpOworCQl9IGVsc2UgeworCQkJQ0hFQ0tfTUFMTE9DKCBkaWN0X29ial9pbmZvW0NIRUNLX1RZUEUodHlwZSkgPyB0eXBlIDogMF0uZHVtcF9kYXRhKCZidWYsICZsZW4sICZvZmZzZXQsIGRhdGEpICk7CisJCX0KKwkKKwkJVFJBQ0VfREVCVUcoSU5GTywgIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGFkZGluZyB0aGUgZm9sbG93aW5nIGRhdGEgaW4gdGhlIGRpY3Rpb25hcnk6ICVzIiwgYnVmKTsKKwkJCisJCWlmIChyZXQgPT0gRUVYSVNUKSB7CisJCQlvZmZzZXQ9MDsKKwkJCUNIRUNLX01BTExPQyggZHVtcF9vYmplY3QoJmJ1ZiwgJmxlbiwgJm9mZnNldCwgbG9jcmVmLCAwLCAwLCAwKSApOworCQkJVFJBQ0VfREVCVUcoSU5GTywgIkNvbmZsaWN0aW5nIGVudHJ5IGluIHRoZSBkaWN0aW9uYXJ5OiAlcyIsIGJ1Zik7CisJCX0KKwkJZnJlZShidWYpOworCX0KK2Vycm9yX2ZyZWU6CisJZnJlZShuZXcpOworCXJldHVybiByZXQ7Cit9CisKKworaW50IGZkX2RpY3RfZGVsZXRlKHN0cnVjdCBkaWN0X29iamVjdCAqIG9iaikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgZGljdGlvbmFyeSAqIGRpY3Q7CisJaW50IHJldD0wOworCQorCS8qIGNoZWNrIHBhcmFtcyAqLworCUNIRUNLX1BBUkFNUyggdmVyaWZ5X29iamVjdChvYmopICYmIG9iai0+ZGljbyk7CisJZGljdCA9IG9iai0+ZGljbzsKKworCS8qIExvY2sgdGhlIGRpY3Rpb25hcnkgZm9yIGNoYW5nZSAqLworCUNIRUNLX1BPU0lYKCAgcHRocmVhZF9yd2xvY2tfd3Jsb2NrKCZkaWN0LT5kaWN0X2xvY2spICApOworCQorCS8qIGNoZWNrIHRoZSBvYmplY3QgaXMgbm90IHNlbnRpbmVsIGZvciBhbm90aGVyIGxpc3QgKi8KKwlmb3IgKGk9MDsgaTxOQl9MSVNUU19QRVJfT0JKOyBpKyspIHsKKwkJaWYgKCFfT0JJTkZPKG9iaikuaGFzbGlzdFtpXSAmJiAhKEZEX0lTX0xJU1RfRU1QVFkoJm9iai0+bGlzdFtpXSkpKSB7CisJCQkvKiBUaGVyZSBhcmUgY2hpbGRyZW4sIHRoaXMgaXMgbm90IGdvb2QgKi8KKwkJCXJldCA9IEVJTlZBTDsKKwkJCVRSQUNFX0RFQlVHIChGVUxMLCAiQ2Fubm90IGRlbGV0ZSBvYmplY3QsIGxpc3QgJWQgbm90IGVtcHR5OiIsIGkpOworCQkJI2lmIDAKKwkJCWR1bXBfbGlzdCgmb2JqLT5saXN0W2ldLCAwLDAsMCk7CisJCQkjZW5kaWYKKwkJCWJyZWFrOworCQl9CisJfQorCQorCS8qIG9rLCBub3cgZGVzdHJveSB0aGUgb2JqZWN0ICovCisJaWYgKCFyZXQpCisJCWRlc3Ryb3lfb2JqZWN0KG9iaik7CisJCisJLyogVW5sb2NrICovCisJQ0hFQ0tfUE9TSVgoICBwdGhyZWFkX3J3bG9ja191bmxvY2soJmRpY3QtPmRpY3RfbG9jaykgICk7CisJCisJcmV0dXJuIHJldDsKK30KKworCitpbnQgZmRfZGljdF9zZWFyY2ggKCBzdHJ1Y3QgZGljdGlvbmFyeSAqIGRpY3QsIGVudW0gZGljdF9vYmplY3RfdHlwZSB0eXBlLCBpbnQgY3JpdGVyaWEsIGNvbnN0IHZvaWQgKiB3aGF0LCBzdHJ1Y3QgZGljdF9vYmplY3QgKipyZXN1bHQsIGludCByZXR2YWwgKQoreworCWludCByZXQgPSAwOworCQorCVRSQUNFX0VOVFJZKCIlcCAlZCglcykgJWQgJXAgJXAgJWQiLCBkaWN0LCB0eXBlLCBkaWN0X29ial9pbmZvW0NIRUNLX1RZUEUodHlwZSkgPyB0eXBlIDogMF0ubmFtZSwgY3JpdGVyaWEsIHdoYXQsIHJlc3VsdCwgcmV0dmFsKTsKKwkKKwkvKiBDaGVjayBwYXJhbSAqLworCUNIRUNLX1BBUkFNUyggZGljdCAmJiAoZGljdC0+ZGljdF9leWVjID09IERJQ1RfRVlFQ0FUQ0hFUikgJiYgQ0hFQ0tfVFlQRSh0eXBlKSApOworCQorCS8qIExvY2sgdGhlIGRpY3Rpb25hcnkgZm9yIHJlYWRpbmcgKi8KKwlDSEVDS19QT1NJWCggIHB0aHJlYWRfcndsb2NrX3JkbG9jaygmZGljdC0+ZGljdF9sb2NrKSAgKTsKKwkKKwkvKiBOb3cgY2FsbCB0aGUgdHlwZS1zcGVjaWZpYyBzZWFyY2ggZnVuY3Rpb24gKi8KKwlyZXQgPSBkaWN0X29ial9pbmZvW3R5cGVdLnNlYXJjaF9mY3QgKGRpY3QsIGNyaXRlcmlhLCB3aGF0LCByZXN1bHQpOworCQorCS8qIFVubG9jayAqLworCUNIRUNLX1BPU0lYKCAgcHRocmVhZF9yd2xvY2tfdW5sb2NrKCZkaWN0LT5kaWN0X2xvY2spICApOworCQorCS8qIFVwZGF0ZSB0aGUgcmV0dXJuIHZhbHVlIGFzIG5lZWRlZCAqLworCWlmICgocmVzdWx0ICE9IE5VTEwpICYmICgqcmVzdWx0ID09IE5VTEwpKQorCQlyZXQgPSByZXR2YWw7CisJCisJcmV0dXJuIHJldDsKK30KKworLyogRnVuY3Rpb24gdG8gcmV0cmlldmUgbGlzdCBvZiBvYmplY3RzIGluIHRoZSBkaWN0aW9uYXJ5LiBVc2Ugd2l0aCBjYXJlIChyZWFkIG9ubHkpLgorCitBbGwgcmV0dXJuZWQgbGlzdCBtdXN0IGJlIGFjY2Vzc2VkIGxpa2UgdGhpczoKKworICBmb3IgKGxpID0gc2VudGluZWwtPm5leHQ7IGxpICE9IHNlbnRpbmVsOyBsaT1saS0+bmV4dCkgeworCXN0cnVjdCBkaWN0X29iamVjdCAqIG9iaiA9IGxpLT5vOworCS4uLgorICB9CisKK1RoZSBmb2xsb3dpbmcgY3JpdGVyaWEgYXJlIGFsbG93ZWQsIHdpdGggY29ycmVzcG9uZGluZyBwYXJlbnQuIAorVGhlIHBhcmVudCBpcyBlaXRoZXIgc3RydWN0IGRpY3Rpb25hcnkgKiBvciBzdHJ1Y3QgZGljdF9vYmplY3QgKgorCQkKK1ZFTkRPUl9CWV9JRCA6IChwYXJlbnQgPSBkaWN0aW9uYXJ5KSByZXR1cm5zIGxpc3Qgb2YgdmVuZG9ycyBvcmRlcmVkIGJ5IElECitBUFBMSUNBVElPTl9CWV9JRCA6IChwYXJlbnQgPSBkaWN0aW9uYXJ5KSByZXR1cm5zIGxpc3Qgb2YgYXBwbGljYXRpb25zIG9yZGVyZWQgYnkgSUQKKyAgKiogZm9yIHRoZXNlIHR3byBsaXN0cywgdGhlIFZlbmRvciB3aXRoIGlkIDAgYW5kIGFwcGxjaWF0aW9uIHdpdGggaWQgMCBhcmUgZXhjbHVkZWQuIAorICAgICBZb3UgbXVzdCByZXNvbHZlIHRoZW0gc2VwYXJhdGx5IHdpdGggZGljdF9zZWFyY2guCisJCQorVFlQRV9CWV9OQU1FIDogKHBhcmVudCA9IGRpY3Rpb25hcnkpIHJldHVybnMgbGlzdCBvZiB0eXBlcyBvcmRlcmVkIGJ5IG5hbWUgKG9zc3RyaW5nIG9yZGVyKQorRU5VTVZBTF9CWV9OQU1FIDogKHBhcmVudCA9IHR5cGUgb2JqZWN0KSByZXR1cm4gbGlzdCBvZiBjb25zdGFudHMgZm9yIHRoaXMgdHlwZSBvcmRlcmVkIGJ5IG5hbWUgKG9zc3RyaW5nIG9yZGVyKQorRU5VTVZBTF9CWV9WQUxVRSA6IChwYXJlbnQgPSB0eXBlIG9iamVjdCkgcmV0dXJuIGxpc3Qgb2YgY29uc3RhbnRzIGZvciB0aGlzIHR5cGUgb3JkZXJlZCBieSB2YWx1ZXMKK0FWUF9CWV9OQU1FIDogKHBhcmVudCA9IHZlbmRvciBvYmplY3QpIHJldHVybiBsaXN0IG9mIEFWUCBmb3IgdGhpcyB2ZW5kb3Igb3JkZXJlZCBieSBuYW1lIChvc3N0cmluZyBvcmRlcikKK0FWUF9CWV9DT0RFIDogKHBhcmVudCA9IHZlbmRvciBvYmplY3QpIHJldHVybiBsaXN0IG9mIEFWUCBmb3IgdGhpcyB2ZW5kb3Igb3JkZXJlZCBieSBjb2RlCitDTURfQllfTkFNRSA6IChwYXJlbnQgPSBkaWN0aW9uYXJ5KSByZXR1cm5zIGxpc3Qgb2YgY29tbWFuZHMgb3JkZXJlZCBieSBuYW1lIChvc3N0cmluZyBvcmRlcikKK0NNRF9CWV9DT0RFX1IgOiAocGFyZW50ID0gZGljdGlvbmFyeSkgcmV0dXJucyBsaXN0IG9mIGNvbW1hbmRzIG9yZGVyZWQgYnkgY29kZQorUlVMRV9CWV9BVlBfQU5EX1BBUkVOVDogKHBhcmVudCA9IGNvbW1hbmQgb3IgZ3JvdXBlZCBBVlAgb2JqZWN0KSByZXR1cm4gbGlzdCBvZiBydWxlcyBmb3IgdGhpcyBvYmplY3Qgb3JkZXJlZCBieSBBVlAgdmVuZG9yL2NvZGUKKworQWxsIG90aGVyIGNyaXRlcmlhIGFyZSByZWplY3RlZC4KKyAqLworaW50IGZkX2RpY3RfZ2V0bGlzdG9mKGludCBjcml0ZXJpYSwgdm9pZCAqIHBhcmVudCwgc3RydWN0IGZkX2xpc3QgKiogc2VudGluZWwpCit7CisJc3RydWN0IGRpY3Rpb25hcnkgKiBkaWN0ID0gcGFyZW50OworCXN0cnVjdCBkaWN0X29iamVjdCAqIG9ial9wYXJlbnQgPSBwYXJlbnQ7CisJCisJVFJBQ0VfRU5UUlkoIiVpICVwICVwIiwgY3JpdGVyaWEsIHBhcmVudCwgc2VudGluZWwpOworCQorCUNIRUNLX1BBUkFNUyhzZW50aW5lbCAmJiBwYXJlbnQpOworCQorCXN3aXRjaChjcml0ZXJpYSkgeworCQljYXNlIFZFTkRPUl9CWV9JRDogLyogcGFyZW50IG11c3QgYmUgdGhlIGRpY3Rpb25hcnkgKi8KKwkJCUNIRUNLX1BBUkFNUyhkaWN0LT5kaWN0X2V5ZWMgPT0gRElDVF9FWUVDQVRDSEVSKTsKKwkJCSpzZW50aW5lbCA9ICZkaWN0LT5kaWN0X3ZlbmRvcnMubGlzdFswXTsKKwkJCWJyZWFrOworCQkJCisJCWNhc2UgQVBQTElDQVRJT05fQllfSUQ6IC8qIHBhcmVudCBtdXN0IGJlIHRoZSBkaWN0aW9uYXJ5ICovCisJCQlDSEVDS19QQVJBTVMoZGljdC0+ZGljdF9leWVjID09IERJQ1RfRVlFQ0FUQ0hFUik7CisJCQkqc2VudGluZWwgPSAmZGljdC0+ZGljdF9hcHBsaWNhdGlvbnMubGlzdFswXTsKKwkJCWJyZWFrOworCQkJCisJCWNhc2UgVFlQRV9CWV9OQU1FOiAvKiBwYXJlbnQgbXVzdCBiZSB0aGUgZGljdGlvbmFyeSAqLworCQkJQ0hFQ0tfUEFSQU1TKGRpY3QtPmRpY3RfZXllYyA9PSBESUNUX0VZRUNBVENIRVIpOworCQkJKnNlbnRpbmVsID0gJmRpY3QtPmRpY3RfdHlwZXM7CisJCQlicmVhazsKKwkJCQorCQljYXNlIEVOVU1WQUxfQllfTkFNRTogLyogcGFyZW50IG11c3QgYmUgYSB0eXBlIG9iamVjdCAqLworCQkJQ0hFQ0tfUEFSQU1TKHZlcmlmeV9vYmplY3Qob2JqX3BhcmVudCkgJiYgKG9ial9wYXJlbnQtPnR5cGUgPT0gRElDVF9UWVBFKSk7CisJCQkqc2VudGluZWwgPSAmb2JqX3BhcmVudC0+bGlzdFsxXTsKKwkJCWJyZWFrOworCQkJCisJCWNhc2UgRU5VTVZBTF9CWV9WQUxVRTogLyogcGFyZW50IG11c3QgYmUgYSB0eXBlIG9iamVjdCAqLworCQkJQ0hFQ0tfUEFSQU1TKHZlcmlmeV9vYmplY3Qob2JqX3BhcmVudCkgJiYgKG9ial9wYXJlbnQtPnR5cGUgPT0gRElDVF9UWVBFKSk7CisJCQkqc2VudGluZWwgPSAmb2JqX3BhcmVudC0+bGlzdFsyXTsKKwkJCWJyZWFrOworCQkJCisJCWNhc2UgQVZQX0JZX05BTUU6IC8qIHBhcmVudCBtdXN0IGJlIGEgVkVORE9SIG9iamVjdCAqLworCQkJQ0hFQ0tfUEFSQU1TKHZlcmlmeV9vYmplY3Qob2JqX3BhcmVudCkgJiYgKG9ial9wYXJlbnQtPnR5cGUgPT0gRElDVF9WRU5ET1IpKTsKKwkJCSpzZW50aW5lbCA9ICZvYmpfcGFyZW50LT5saXN0WzJdOworCQkJYnJlYWs7CisJCQkKKwkJY2FzZSBBVlBfQllfQ09ERTogLyogcGFyZW50IG11c3QgYmUgYSBWRU5ET1Igb2JqZWN0ICovCisJCQlDSEVDS19QQVJBTVModmVyaWZ5X29iamVjdChvYmpfcGFyZW50KSAmJiAob2JqX3BhcmVudC0+dHlwZSA9PSBESUNUX1ZFTkRPUikpOworCQkJKnNlbnRpbmVsID0gJm9ial9wYXJlbnQtPmxpc3RbMV07CisJCQlicmVhazsKKwkJCQorCQljYXNlIENNRF9CWV9OQU1FOiAvKiBwYXJlbnQgbXVzdCBiZSB0aGUgZGljdGlvbmFyeSAqLworCQkJQ0hFQ0tfUEFSQU1TKGRpY3QtPmRpY3RfZXllYyA9PSBESUNUX0VZRUNBVENIRVIpOworCQkJKnNlbnRpbmVsID0gJmRpY3QtPmRpY3RfY21kX25hbWU7CisJCQlicmVhazsKKwkJCQorCQljYXNlIENNRF9CWV9DT0RFX1I6IC8qIHBhcmVudCBtdXN0IGJlIHRoZSBkaWN0aW9uYXJ5ICovCisJCQlDSEVDS19QQVJBTVMoZGljdC0+ZGljdF9leWVjID09IERJQ1RfRVlFQ0FUQ0hFUik7CisJCQkqc2VudGluZWwgPSAmZGljdC0+ZGljdF9jbWRfY29kZTsKKwkJCWJyZWFrOworCQkJCisJCWNhc2UgUlVMRV9CWV9BVlBfQU5EX1BBUkVOVDogLyogcGFyZW50IG11c3QgYmUgY29tbWFuZCBvciBncm91cGVkIEFWUCAqLworCQkJQ0hFQ0tfUEFSQU1TKHZlcmlmeV9vYmplY3Qob2JqX3BhcmVudCkpOworCQkJQ0hFQ0tfUEFSQU1TKAkob2JqX3BhcmVudC0+dHlwZSA9PSBESUNUX0NPTU1BTkQpIHx8CisJCQkJCSgob2JqX3BhcmVudC0+dHlwZSA9PSBESUNUX0FWUCkgCisJCQkJCSAgJiYgKG9ial9wYXJlbnQtPmRhdGEuYXZwLmF2cF9iYXNldHlwZSA9PSBBVlBfVFlQRV9HUk9VUEVEKSkgKTsKKwkJCSpzZW50aW5lbCA9ICZvYmpfcGFyZW50LT5saXN0WzJdOworCQkJYnJlYWs7CisJCQkKKwkJZGVmYXVsdDoKKwkJCUNIRUNLX1BBUkFNUygwKTsKKwl9CisJCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBpbml0L2ZpbmkgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBJbml0aWFsaXplIHRoZSBkaWN0aW9uYXJ5ICovCitpbnQgZmRfZGljdF9pbml0ICggc3RydWN0IGRpY3Rpb25hcnkgKiogZGljdCkKK3sKKwlzdHJ1Y3QgZGljdGlvbmFyeSAqIG5ldyA9IE5VTEw7CisJCisJVFJBQ0VfRU5UUlkoIiVwIiwgZGljdCk7CisJCisJLyogU2FuaXR5IGNoZWNrcyAqLworCUFTU0VSVCggKHNpemVvZih0eXBlX2Jhc2VfbmFtZSkgLyBzaXplb2YodHlwZV9iYXNlX25hbWVbMF0pKSA9PSAoQVZQX1RZUEVfTUFYICsgMSkgKTsKKwlBU1NFUlQoIChzaXplb2YoZGljdF9vYmpfaW5mbykgIC8gc2l6ZW9mKGRpY3Rfb2JqX2luZm9bMF0pKSAgPT0gKERJQ1RfVFlQRV9NQVggKyAxKSApOworCUNIRUNLX1BBUkFNUyhkaWN0KTsKKwkKKwkvKiBBbGxvY2F0ZSB0aGUgbWVtb3J5IGZvciB0aGUgZGljdGlvbmFyeSAqLworCUNIRUNLX01BTExPQyggbmV3ID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgZGljdGlvbmFyeSkpICk7CisJbWVtc2V0KG5ldywgMCwgc2l6ZW9mKHN0cnVjdCBkaWN0aW9uYXJ5KSk7CisJCisJbmV3LT5kaWN0X2V5ZWMgPSBESUNUX0VZRUNBVENIRVI7CisJCisJLyogSW5pdGlhbGl6ZSB0aGUgbG9jayBmb3IgdGhlIGRpY3Rpb25hcnkgKi8KKwlDSEVDS19QT1NJWCggIHB0aHJlYWRfcndsb2NrX2luaXQoJm5ldy0+ZGljdF9sb2NrLCBOVUxMKSAgKTsKKwkKKwkvKiBJbml0aWFsaXplIHRoZSBzZW50aW5lbCBmb3IgdmVuZG9ycyBhbmQgQVZQIGxpc3RzICovCisJaW5pdF9vYmplY3QoICZuZXctPmRpY3RfdmVuZG9ycywgRElDVF9WRU5ET1IgKTsKKwkjZGVmaW5lIE5PX1ZFTkRPUl9OQU1FCSIobm8gdmVuZG9yKSIKKwluZXctPmRpY3RfdmVuZG9ycy5kYXRhLnZlbmRvci52ZW5kb3JfbmFtZSA9IE5PX1ZFTkRPUl9OQU1FOworCW5ldy0+ZGljdF92ZW5kb3JzLmRhdGFzdHJfbGVuID0gQ09OU1RTVFJMRU4oTk9fVkVORE9SX05BTUUpOworCS8qIG5ldy0+ZGljdF92ZW5kb3JzLmxpc3RbMF0ubyA9IE5VTEw7ICovLyogb3ZlcndyaXRlIHNpbmNlIGVsZW1lbnQgaXMgYWxzbyBzZW50aW5lbCBmb3IgdGhpcyBsaXN0LiAqLworCW5ldy0+ZGljdF92ZW5kb3JzLmRpY28gPSBuZXc7CisJCisJLyogSW5pdGlhbGl6ZSB0aGUgc2VudGluZWwgZm9yIGFwcGxpY2F0aW9ucyAqLworCWluaXRfb2JqZWN0KCAmbmV3LT5kaWN0X2FwcGxpY2F0aW9ucywgRElDVF9BUFBMSUNBVElPTiApOworCSNkZWZpbmUgQVBQTElDQVRJT05fMF9OQU1FCSJEaWFtZXRlciBDb21tb24gTWVzc2FnZXMiCisJbmV3LT5kaWN0X2FwcGxpY2F0aW9ucy5kYXRhLmFwcGxpY2F0aW9uLmFwcGxpY2F0aW9uX25hbWUgPSBBUFBMSUNBVElPTl8wX05BTUU7CisJbmV3LT5kaWN0X2FwcGxpY2F0aW9ucy5kYXRhc3RyX2xlbiA9IENPTlNUU1RSTEVOKEFQUExJQ0FUSU9OXzBfTkFNRSk7CisJLyogbmV3LT5kaWN0X2FwcGxpY2F0aW9ucy5saXN0WzBdLm8gPSBOVUxMOyAqLy8qIG92ZXJ3cml0ZSBzaW5jZSBzaW5jZSBlbGVtZW50IGlzIGFsc28gc2VudGluZWwgZm9yIHRoaXMgbGlzdC4gKi8KKwluZXctPmRpY3RfYXBwbGljYXRpb25zLmRpY28gPSBuZXc7CisJCQkKKwkvKiBJbml0aWFsaXplIHRoZSBzZW50aW5lbCBmb3IgdHlwZXMgKi8KKwlmZF9saXN0X2luaXQgKCAmbmV3LT5kaWN0X3R5cGVzLCBOVUxMICk7CisJCisJLyogSW5pdGlhbGl6ZSB0aGUgc2VudGluZWxzIGZvciBjb21tYW5kcyAqLworCWZkX2xpc3RfaW5pdCAoICZuZXctPmRpY3RfY21kX25hbWUsIE5VTEwgKTsKKwlmZF9saXN0X2luaXQgKCAmbmV3LT5kaWN0X2NtZF9jb2RlLCBOVUxMICk7CisJCisJLyogSW5pdGlhbGl6ZSB0aGUgZXJyb3IgY29tbWFuZCBvYmplY3QgKi8KKwlpbml0X29iamVjdCggJm5ldy0+ZGljdF9jbWRfZXJyb3IsIERJQ1RfQ09NTUFORCApOworCSNkZWZpbmUgR0VORVJJQ19FUlJPUl9OQU1FCSIoZ2VuZXJpYyBlcnJvciBmb3JtYXQpIgorCW5ldy0+ZGljdF9jbWRfZXJyb3IuZGF0YS5jbWQuY21kX25hbWUgPSBHRU5FUklDX0VSUk9SX05BTUU7CisJbmV3LT5kaWN0X2NtZF9lcnJvci5kYXRhc3RyX2xlbiA9IENPTlNUU1RSTEVOKEdFTkVSSUNfRVJST1JfTkFNRSk7CisJbmV3LT5kaWN0X2NtZF9lcnJvci5kYXRhLmNtZC5jbWRfZmxhZ19tYXNrPUNNRF9GTEFHX0VSUk9SIHwgQ01EX0ZMQUdfUkVRVUVTVCB8IENNRF9GTEFHX1JFVFJBTlNNSVQ7CisJbmV3LT5kaWN0X2NtZF9lcnJvci5kYXRhLmNtZC5jbWRfZmxhZ192YWwgPUNNRF9GTEFHX0VSUk9SOworCW5ldy0+ZGljdF9jbWRfZXJyb3IuZGljbyA9IG5ldzsKKwkKKwkqZGljdCA9IG5ldzsKKwkKKwkvKiBEb25lICovCisJcmV0dXJuIDA7Cit9CisKKy8qIERlc3Ryb3kgYSBkaWN0aW9uYXJ5ICovCitpbnQgZmRfZGljdF9maW5pICggc3RydWN0IGRpY3Rpb25hcnkgKiogZGljdCkKK3sKKwlpbnQgaTsKKwkKKwlUUkFDRV9FTlRSWSgiIik7CisJQ0hFQ0tfUEFSQU1TKCBkaWN0ICYmICpkaWN0ICYmICgoKmRpY3QpLT5kaWN0X2V5ZWMgPT0gRElDVF9FWUVDQVRDSEVSKSApOworCQorCS8qIEFjcXVpcmUgdGhlIHdyaXRlIGxvY2sgdG8gbWFrZSBzdXJlIG5vIG90aGVyIG9wZXJhdGlvbiBpcyBvbmdvaW5nICovCisJQ0hFQ0tfUE9TSVgoICBwdGhyZWFkX3J3bG9ja193cmxvY2soJigqZGljdCktPmRpY3RfbG9jaykgICk7CisJCisJLyogRW1wdHkgYWxsIHRoZSBsaXN0cywgZnJlZSB0aGUgZWxlbWVudHMgKi8KKwlkZXN0cm95X2xpc3QgKCAmKCpkaWN0KS0+ZGljdF9jbWRfZXJyb3IubGlzdFsyXSApOworCWRlc3Ryb3lfbGlzdCAoICYoKmRpY3QpLT5kaWN0X2NtZF9jb2RlICk7CisJZGVzdHJveV9saXN0ICggJigqZGljdCktPmRpY3RfY21kX25hbWUgKTsKKwlkZXN0cm95X2xpc3QgKCAmKCpkaWN0KS0+ZGljdF90eXBlcyApOworCWZvciAoaT0wOyBpPCBOQl9MSVNUU19QRVJfT0JKOyBpKyspIHsKKwkJZGVzdHJveV9saXN0ICggJigqZGljdCktPmRpY3RfYXBwbGljYXRpb25zLmxpc3RbaV0gKTsKKwkJZGVzdHJveV9saXN0ICggJigqZGljdCktPmRpY3RfdmVuZG9ycy5saXN0W2ldICk7CisJfQorCQorCS8qIERpY3Rpb25hcnkgaXMgZW1wdHksIG5vdyBkZXN0cm95IHRoZSBsb2NrICovCisJQ0hFQ0tfUE9TSVgoICBwdGhyZWFkX3J3bG9ja191bmxvY2soJigqZGljdCktPmRpY3RfbG9jaykgICk7CisJQ0hFQ0tfUE9TSVgoICBwdGhyZWFkX3J3bG9ja19kZXN0cm95KCYoKmRpY3QpLT5kaWN0X2xvY2spICApOworCQorCWZyZWUoKmRpY3QpOworCSpkaWN0ID0gTlVMTDsKKwkKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3RoZXIgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEl0ZXJhdGUgYSBjYWxsYmFjayBvbiB0aGUgcnVsZXMgZm9yIGFuIG9iamVjdCAqLworaW50IGZkX2RpY3RfaXRlcmF0ZV9ydWxlcyAoIHN0cnVjdCBkaWN0X29iamVjdCAqcGFyZW50LCB2b2lkICogZGF0YSwgaW50ICgqY2IpKHZvaWQgKiwgc3RydWN0IGRpY3RfcnVsZV9kYXRhICopICkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgZmRfbGlzdCAqIGxpOworCQorCVRSQUNFX0VOVFJZKCIlcCAlcCAlcCIsIHBhcmVudCwgZGF0YSwgY2IpOworCQorCS8qIENoZWNrIHBhcmFtZXRlcnMgKi8KKwlDSEVDS19QQVJBTVMoICB2ZXJpZnlfb2JqZWN0KHBhcmVudCkgICk7CisJQ0hFQ0tfUEFSQU1TKCAgKHBhcmVudC0+dHlwZSA9PSBESUNUX0NPTU1BTkQpIAorCQkJfHwgKChwYXJlbnQtPnR5cGUgPT0gRElDVF9BVlApICYmIChwYXJlbnQtPmRhdGEuYXZwLmF2cF9iYXNldHlwZSA9PSBBVlBfVFlQRV9HUk9VUEVEKSkgKTsKKwlUUkFDRV9ERUJVRyAoRlVMTCwgIkl0ZXJhdGluZyBvbiBydWxlcyBvZiAlczogJyVzJy4iLCAKKwkJCV9PQklORk8ocGFyZW50KS5uYW1lLCAKKwkJCXBhcmVudC0+dHlwZSA9PSBESUNUX0NPTU1BTkQgPyAKKwkJCQkgIHBhcmVudC0+ZGF0YS5jbWQuY21kX25hbWUKKwkJCQk6IHBhcmVudC0+ZGF0YS5hdnAuYXZwX25hbWUpOworCQorCS8qIEFjcXVpcmUgdGhlIHJlYWQgbG9jayAgKi8KKwlDSEVDS19QT1NJWCggIHB0aHJlYWRfcndsb2NrX3JkbG9jaygmcGFyZW50LT5kaWNvLT5kaWN0X2xvY2spICApOworCQorCS8qIGdvIHRocm91Z2ggdGhlIGxpc3QgYW5kIGNhbGwgdGhlIGNiIG9uIGVhY2ggcnVsZSBkYXRhICovCisJZm9yIChsaSA9ICYocGFyZW50LT5saXN0WzJdKTsgbGktPm5leHQgIT0gJihwYXJlbnQtPmxpc3RbMl0pOyBsaSA9IGxpLT5uZXh0KSB7CisJCXJldCA9ICgqY2IpKGRhdGEsICYoX08obGktPm5leHQtPm8pLT5kYXRhLnJ1bGUpKTsKKwkJaWYgKHJldCAhPSAwKQorCQkJYnJlYWs7CisJfQorCQkKKwkvKiBSZWxlYXNlIHRoZSBsb2NrICovCisJQ0hFQ0tfUE9TSVgoICBwdGhyZWFkX3J3bG9ja191bmxvY2soJnBhcmVudC0+ZGljby0+ZGljdF9sb2NrKSAgKTsKKwkKKwlyZXR1cm4gcmV0OworfQorCisvKiBDcmVhdGUgdGhlIGxpc3Qgb2YgdmVuZG9ycy4gUmV0dXJucyBhIDAtdGVybWluYXRlZCBhcnJheSwgdGhhdCBtdXN0IGJlIGZyZWVkIGFmdGVyIHVzZS4gUmV0dXJucyBOVUxMIG9uIGVycm9yLiAqLwordWludDMyX3QgKiBmZF9kaWN0X2dldF92ZW5kb3JpZF9saXN0KHN0cnVjdCBkaWN0aW9uYXJ5ICogZGljdCkKK3sKKwl1aW50MzJfdCAqIHJldCA9IE5VTEw7CisJaW50IGkgPSAwOworCXN0cnVjdCBmZF9saXN0ICogbGk7CisJCisJVFJBQ0VfRU5UUlkoKTsKKwkKKwkvKiBBY3F1aXJlIHRoZSByZWFkIGxvY2sgKi8KKwlDSEVDS19QT1NJWF9ETyggIHB0aHJlYWRfcndsb2NrX3JkbG9jaygmZGljdC0+ZGljdF9sb2NrKSwgcmV0dXJuIE5VTEwgICk7CisJCisJLyogQWxsb2NhdGUgYW4gYXJyYXkgdG8gY29udGFpbiBhbGwgdGhlIGVsZW1lbnRzICovCisJQ0hFQ0tfTUFMTE9DX0RPKCByZXQgPSBjYWxsb2MoIGRpY3QtPmRpY3RfY291bnRbRElDVF9WRU5ET1JdICsgMSwgc2l6ZW9mKHVpbnQzMl90KSApLCBnb3RvIG91dCApOworCQorCS8qIENvcHkgdGhlIHZlbmRvcnMgSURzICovCisJZm9yIChsaSA9IGRpY3QtPmRpY3RfdmVuZG9ycy5saXN0WzBdLm5leHQ7IGxpICE9ICYoZGljdC0+ZGljdF92ZW5kb3JzLmxpc3RbMF0pOyBsaSA9IGxpLT5uZXh0KSB7CisJCXJldFtpXSA9IF9PKGxpLT5vKS0+ZGF0YS52ZW5kb3IudmVuZG9yX2lkOworCQlpKys7CisJCUFTU0VSVCggaSA8PSBkaWN0LT5kaWN0X2NvdW50W0RJQ1RfVkVORE9SXSApOworCX0KK291dDoJCisJLyogUmVsZWFzZSB0aGUgbG9jayAqLworCUNIRUNLX1BPU0lYX0RPKCAgcHRocmVhZF9yd2xvY2tfdW5sb2NrKCZkaWN0LT5kaWN0X2xvY2spLCByZXR1cm4gTlVMTCAgKTsKKwkKKwlyZXR1cm4gcmV0OworfQorCisvKiBSZXR1cm4gdGhlIGxvY2F0aW9uIG9mIHRoZSBjYiBsaXN0IGZvciBhbiBvYmplY3QsIGFmdGVyIGNoZWNraW5nIGl0cyB0eXBlICovCitpbnQgZmRfZGljdF9kaXNwX2NiKGVudW0gZGljdF9vYmplY3RfdHlwZSB0eXBlLCBzdHJ1Y3QgZGljdF9vYmplY3QgKm9iaiwgc3RydWN0IGZkX2xpc3QgKiogY2JfbGlzdCkKK3sKKwlUUkFDRV9FTlRSWSgiJWQgJXAgJXAiLCB0eXBlLCBvYmosIGNiX2xpc3QpOworCUNIRUNLX1BBUkFNUyggdmVyaWZ5X29iamVjdChvYmopICk7CisJQ0hFQ0tfUEFSQU1TKCBfT0JJTkZPKG9iaikudHlwZSA9PSB0eXBlICk7CisJQ0hFQ0tfUEFSQU1TKCBjYl9saXN0ICk7CisJKmNiX2xpc3QgPSAmb2JqLT5kaXNwX2NiczsKKwlyZXR1cm4gMDsKK30KKworaW50IGZkX2RpY3RfZ2V0X2Vycm9yX2NtZChzdHJ1Y3QgZGljdGlvbmFyeSAqIGRpY3QsIHN0cnVjdCBkaWN0X29iamVjdCAqKm9iaikKK3sKKwlUUkFDRV9FTlRSWSgiJXAgJXAiLCBkaWN0LCBvYmopOworCUNIRUNLX1BBUkFNUyggZGljdCAmJiAoZGljdC0+ZGljdF9leWVjID09IERJQ1RfRVlFQ0FUQ0hFUikgJiYgb2JqICk7CisJKm9iaiA9ICZkaWN0LT5kaWN0X2NtZF9lcnJvcjsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYmZkcHJvdG8vZGljdGlvbmFyeV9mdW5jdGlvbnMuYyBiL2xpYmZkcHJvdG8vZGljdGlvbmFyeV9mdW5jdGlvbnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTViNDE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZmRwcm90by9kaWN0aW9uYXJ5X2Z1bmN0aW9ucy5jCkBAIC0wLDAgKzEsMzg3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxNSwgV0lERSBQcm9qZWN0IGFuZCBOSUNUCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBXSURFIFByb2plY3Qgb3IgTklDVCBub3IgdGhlIAkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFdJREUgUHJvamVjdCBhbmQgCQkJCQkJICoKKyogICBOSUNULgkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJmZHByb3RvLWludGVybmFsLmgiCisjaW5jbHVkZSA8dGltZS5oPgorCisvKiBUaGlzIGZpbGUgY29udGFpbnMgaGVscGVycyBmdW5jdGlvbnMgdG8gYmUgcmV1c2VkIGFzIGNhbGxiYWNrcyBpbiB0aGUgc3RydWN0IGRpY3RfdHlwZV9kYXRhIHN0cnVjdHVyZS4KK1RoZXJlIGFyZSB0aHJlZSBjYWxsYmFja3MgdGhlcmU6CisKKyAtIHR5cGVfZW5jb2RlICAgIDoKKyAtIHR5cGVfaW50ZXJwcmV0IDoKKyAJICBUaG9zZSB0d28gY2FsbGJhY2tzIGFsbG93IHRvIG1hbmlwdWxhdGUgbW9yZSBuYXR1cmFsIHN0cnVjdHVyZXMgb2YgZGF0YSBpbiB0aGUgY29kZSwgYW5kIHRvIAorCW1hcCB0cmFuc3BhcmVudGx5IHRoZXNlIG5hdHVyYWwgc3RydWN0dXJlcyB3aXRoIHRoZSBBVlAtZW5jb2RlZCBmb3JtYXQgYnkgY2FsbGluZyB0aGUgZnVuY3Rpb25zCisJbXNnX2F2cF92YWx1ZV9lbmNvZGUgb3IgbXNnX2F2cF92YWx1ZV9pbnRlcnByZXQuCisgLSB0eXBlX2R1bXAgOiAKKyAJICBUaGlzIGNhbGxiYWNrIGlmIHByb3ZpZGVkIGdpdmVzIGEgbW9yZSBodW1hbi1yZWFkYWJsZSBkZWJ1ZyBpbmZvcm1hdGlvbi4KKworICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgQWRkcmVzcyAgQVZQICB0eXBlICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVGhlIGludGVycHJldCBhbmQgZW5jb2RlIGZ1bmN0aW9ucyB3b3JrIHdpdGggYSAic3RydWN0IHNvY2thZGRyX3N0b3JhZ2UiIHBvaW50ZXIgZm9yIG1hcHBpbmcgCit0aGUgY29udGVudHMgb2YgdGhlIEFWUCAqLworCitpbnQgZmRfZGljdGZjdF9BZGRyZXNzX2VuY29kZSh2b2lkICogZGF0YSwgdW5pb24gYXZwX3ZhbHVlICogYXZwX3ZhbHVlKQoreworCXNTUyAqIHNzID0gKHNTUyAqKSBkYXRhOworCXVpbnQxNl90IEFkZHJlc3NUeXBlID0gMDsKKwlzaXplX3QJc2l6ZSA9IDA7CisJdW5zaWduZWQgY2hhciAqIGJ1ZiA9IE5VTEw7CisJCisJVFJBQ0VfRU5UUlkoIiVwICVwIiwgZGF0YSwgYXZwX3ZhbHVlKTsKKwlDSEVDS19QQVJBTVMoIGRhdGEgJiYgYXZwX3ZhbHVlICApOworCQorCXN3aXRjaCAoc3MtPnNzX2ZhbWlseSkgeworCQljYXNlIEFGX0lORVQ6CisJCQl7CisJCQkJLyogV2UgYXJlIGVuY29kaW5nIGFuIElQIGFkZHJlc3MgKi8KKwkJCQlzU0E0ICogc2luID0gKHNTQTQgKilzczsKKwkJCQkKKwkJCQlBZGRyZXNzVHlwZSA9IDE7Lyogc2VlIGh0dHA6Ly93d3cuaWFuYS5vcmcvYXNzaWdubWVudHMvYWRkcmVzcy1mYW1pbHktbnVtYmVycy8gKi8KKwkJCQlzaXplID0gNjsJLyogMiBmb3IgQWRkcmVzc1R5cGUgKyA0IGZvciBkYXRhICovCisJCQkJCisJCQkJQ0hFQ0tfTUFMTE9DKCAgYnVmID0gbWFsbG9jKHNpemUpICApOworCQkJCQorCQkJCS8qIG1heSBub3Qgd29yayBiZWNhdXNlIG9mIGFsaWdubWVudDogKih1aW50MzJfdCAqKShidWYrMikgPSBodG9ubChzaW4tPnNpbl9hZGRyLnNfYWRkcik7ICovCisJCQkJbWVtY3B5KGJ1ZiArIDIsICZzaW4tPnNpbl9hZGRyLnNfYWRkciwgNCk7CisJCQl9CisJCQlicmVhazsKKwkJCQkKKwkJY2FzZSBBRl9JTkVUNjoKKwkJCXsKKwkJCQkvKiBXZSBhcmUgZW5jb2RpbmcgYW4gSVB2NiBhZGRyZXNzICovCisJCQkJc1NBNiAqIHNpbjYgPSAoc1NBNiAqKXNzOworCQkJCQorCQkJCUFkZHJlc3NUeXBlID0gMjsvKiBzZWUgaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9hZGRyZXNzLWZhbWlseS1udW1iZXJzLyAqLworCQkJCXNpemUgPSAxODsJLyogMiBmb3IgQWRkcmVzc1R5cGUgKyAxNiBmb3IgZGF0YSAqLworCQkJCQorCQkJCUNIRUNLX01BTExPQyggIGJ1ZiA9IG1hbGxvYyhzaXplKSAgKTsKKwkJCQkKKwkJCQkvKiBUaGUgb3JkZXIgaXMgYWxyZWFkeSBnb29kIGhlcmUgKi8KKwkJCQltZW1jcHkoYnVmICsgMiwgJnNpbjYtPnNpbjZfYWRkci5zNl9hZGRyLCAxNik7CisJCQkJCisJCQl9CisJCQlicmVhazsKKwkJCQkKKwkJZGVmYXVsdDoKKwkJCUNIRUNLX1BBUkFNUyggQWRkcmVzc1R5cGUgPSAwICk7CisJfQorCQorCSoodWludDE2X3QgKilidWYgPSBodG9ucyhBZGRyZXNzVHlwZSk7CisKKwlhdnBfdmFsdWUtPm9zLmxlbiA9IHNpemU7CisJYXZwX3ZhbHVlLT5vcy5kYXRhID0gYnVmOworCQorCXJldHVybiAwOworfQorCitpbnQgZmRfZGljdGZjdF9BZGRyZXNzX2ludGVycHJldCh1bmlvbiBhdnBfdmFsdWUgKiBhdnBfdmFsdWUsIHZvaWQgKiBpbnRlcnByZXRlZCkKK3sKKwl1aW50MTZfdCBBZGRyZXNzVHlwZSA9IDA7CisJdW5zaWduZWQgY2hhciAqIGJ1ZjsKKwkKKwlUUkFDRV9FTlRSWSgiJXAgJXAiLCBhdnBfdmFsdWUsIGludGVycHJldGVkKTsKKwkKKwlDSEVDS19QQVJBTVMoIGF2cF92YWx1ZSAmJiBpbnRlcnByZXRlZCAmJiAoYXZwX3ZhbHVlLT5vcy5sZW4gPj0gMikgICk7CisJCisJQWRkcmVzc1R5cGUgPSBudG9ocygqKHVpbnQxNl90ICopYXZwX3ZhbHVlLT5vcy5kYXRhKTsKKwlidWYgPSAmYXZwX3ZhbHVlLT5vcy5kYXRhWzJdOworCQorCXN3aXRjaCAoQWRkcmVzc1R5cGUpIHsKKwkJY2FzZSAxIC8qIElQICovOgorCQkJeworCQkJCXNTQTQgKiBzaW4gPSAoc1NBNCAqKWludGVycHJldGVkOworCQkJCQorCQkJCUNIRUNLX1BBUkFNUyggIGF2cF92YWx1ZS0+b3MubGVuID09IDYgICk7CisJCQkJCisJCQkJc2luLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwkJCQkvKiBzaW4tPnNpbl9hZGRyLnNfYWRkciA9IG50b2hsKCAqICh1aW50MzJfdCAqKSBidWYpOyAtLSBtYXkgbm90IHdvcmsgYmVjYXVzZSBvZiBiYWQgYWxpZ25tZW50ICovCisJCQkJbWVtY3B5KCZzaW4tPnNpbl9hZGRyLnNfYWRkciwgYnVmLCA0KTsKKwkJCX0KKwkJCWJyZWFrOworCQkJCQorCQljYXNlIDIgLyogSVA2ICovOgorCQkJeworCQkJCXNTQTYgKiBzaW42ID0gKHNTQTYgKilpbnRlcnByZXRlZDsKKwkJCQkKKwkJCQlDSEVDS19QQVJBTVMoICBhdnBfdmFsdWUtPm9zLmxlbiA9PSAxOCAgKTsKKwkJCQkKKwkJCQlzaW42LT5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OworCQkJCW1lbWNweSgmc2luNi0+c2luNl9hZGRyLnM2X2FkZHIsIGJ1ZiwgMTYpOworCQkJCQorCQkJfQorCQkJYnJlYWs7CisJCQkJCisJCWRlZmF1bHQ6CisJCQlDSEVDS19QQVJBTVMoIEFkZHJlc3NUeXBlID0gMCApOworCX0KKwkKKwlyZXR1cm4gMDsKK30KKworLyogRHVtcCB0aGUgY29udGVudCBvZiBhbiBBZGRyZXNzIEFWUCAqLworREVDTEFSRV9GRF9EVU1QX1BST1RPVFlQRShmZF9kaWN0ZmN0X0FkZHJlc3NfZHVtcCwgdW5pb24gYXZwX3ZhbHVlICogYXZwX3ZhbHVlKQoreworCXVuaW9uIHsKKwkJc1NBCXNhOworCQlzU1MJc3M7CisJCXNTQTQJc2luOworCQlzU0E2CXNpbjY7CisJfSBzOworCXVpbnQxNl90IGZhbTsKKwkKKwlGRF9EVU1QX0hBTkRMRV9PRkZTRVQoKTsKKwkKKwltZW1zZXQoJnMsIDAsIHNpemVvZihzKSk7CisJCisJLyogVGhlIGZpcnN0IHR3byBvY3RldHMgcmVwcmVzZW50IHRoZSBhZGRyZXNzIGZhbWlseSwgaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9hZGRyZXNzLWZhbWlseS1udW1iZXJzLyAqLworCWlmIChhdnBfdmFsdWUtPm9zLmxlbiA8IDIpIHsKKwkJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9kdW1wX2V4dGVuZChGRF9EVU1QX1NURF9QQVJBTVMsICJbaW52YWxpZCBsZW5ndGg6ICV6ZF0iLCBhdnBfdmFsdWUtPm9zLmxlbiksIHJldHVybiBOVUxMKTsKKwkJcmV0dXJuICpidWY7CisJfQorCQorCS8qIEZvbGxvd2luZyBvY3RldHMgYXJlIHRoZSBhZGRyZXNzIGluIG5ldHdvcmsgYnl0ZSBvcmRlciBhbHJlYWR5ICovCisJZmFtID0gYXZwX3ZhbHVlLT5vcy5kYXRhWzBdIDw8IDggfCBhdnBfdmFsdWUtPm9zLmRhdGFbMV07CisJc3dpdGNoIChmYW0pIHsKKwkJY2FzZSAxOgorCQkJLyogSVAgKi8KKwkJCXMuc2Euc2FfZmFtaWx5ID0gQUZfSU5FVDsKKwkJCWlmICgoYXZwX3ZhbHVlLT5vcy5sZW4gIT0gNikgJiYgKGF2cF92YWx1ZS0+b3MubGVuICE9IDgpKSB7CisJCQkJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9kdW1wX2V4dGVuZChGRF9EVU1QX1NURF9QQVJBTVMsICJbaW52YWxpZCBJUCBsZW5ndGg6ICV6ZF0iLCBhdnBfdmFsdWUtPm9zLmxlbiksIHJldHVybiBOVUxMKTsKKwkJCQlyZXR1cm4gKmJ1ZjsKKwkJCX0KKwkJCW1lbWNweSgmcy5zaW4uc2luX2FkZHIuc19hZGRyLCBhdnBfdmFsdWUtPm9zLmRhdGEgKyAyLCA0KTsKKwkJCWlmIChhdnBfdmFsdWUtPm9zLmxlbiA9PSA4KQorCQkJCW1lbWNweSgmcy5zaW4uc2luX3BvcnQsIGF2cF92YWx1ZS0+b3MuZGF0YSArIDYsIDIpOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCS8qIElQNiAqLworCQkJcy5zYS5zYV9mYW1pbHkgPSBBRl9JTkVUNjsKKwkJCWlmICgoYXZwX3ZhbHVlLT5vcy5sZW4gIT0gMTgpICYmIChhdnBfdmFsdWUtPm9zLmxlbiAhPSAyMCkpIHsKKwkJCQlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKEZEX0RVTVBfU1REX1BBUkFNUywgIltpbnZhbGlkIElQNiBsZW5ndGg6ICV6ZF0iLCBhdnBfdmFsdWUtPm9zLmxlbiksIHJldHVybiBOVUxMKTsKKwkJCQlyZXR1cm4gKmJ1ZjsKKwkJCX0KKwkJCW1lbWNweSgmcy5zaW42LnNpbjZfYWRkci5zNl9hZGRyLCBhdnBfdmFsdWUtPm9zLmRhdGEgKyAyLCAxNik7CisJCQlpZiAoYXZwX3ZhbHVlLT5vcy5sZW4gPT0gMjApCisJCQkJbWVtY3B5KCZzLnNpbjYuc2luNl9wb3J0LCBhdnBfdmFsdWUtPm9zLmRhdGEgKyAxOCwgMik7CisJCQlicmVhazsKKwkJY2FzZSA4OgorCQkJLyogRS4xNjQgKi8KKwkJCUNIRUNLX01BTExPQ19ETyggZmRfZHVtcF9leHRlbmQoRkRfRFVNUF9TVERfUEFSQU1TLCAiJS4qcyIsIChpbnQpKGF2cF92YWx1ZS0+b3MubGVuLTIpLCBhdnBfdmFsdWUtPm9zLmRhdGErMiksIHJldHVybiBOVUxMKTsKKwkJCXJldHVybiAqYnVmOworCQlkZWZhdWx0OgorCQkJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9kdW1wX2V4dGVuZChGRF9EVU1QX1NURF9QQVJBTVMsICJbdW5zdXBwb3J0ZWQgZmFtaWx5OiAweCVoeF0iLCBmYW0pLCByZXR1cm4gTlVMTCk7CisJCQlyZXR1cm4gKmJ1ZjsKKwl9CisJCisJcmV0dXJuIGZkX3NhX2R1bXAoRkRfRFVNUF9TVERfUEFSQU1TLCAmcy5zYSwgTklfTlVNRVJJQ0hPU1QpOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICBVVEY4U3RyaW5nICBBVlAgIHR5cGUgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBEdW1wIHRoZSBBVlAgaW4gYSBuYXR1cmFsIGh1bWFuLXJlYWRhYmxlIGZvcm1hdC4gVGhpcyBkdW1wcyB0aGUgY29tcGxldGUgbGVuZ3RoIG9mIHRoZSBBVlAsIGl0IGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8gdHJ1bmNhdGUgaWYgbmVlZGVkICovCitERUNMQVJFX0ZEX0RVTVBfUFJPVE9UWVBFKGZkX2RpY3RmY3RfVVRGOFN0cmluZ19kdW1wLCB1bmlvbiBhdnBfdmFsdWUgKiBhdnBfdmFsdWUpCit7CisJc2l6ZV90IGw7CisJRkRfRFVNUF9IQU5ETEVfT0ZGU0VUKCk7CisJCisJbCA9IGF2cF92YWx1ZS0+b3MubGVuOworCS8qIEp1c3QgaW4gY2FzZSB0aGUgc3RyaW5nIGVuZHMgaW4gaW52YWxpZCBVVEYtOCBjaGFycywgd2Ugc2hvcnRlbiBpdCAqLworCXdoaWxlICgobCA+IDApICYmIChhdnBfdmFsdWUtPm9zLmRhdGFbbCAtIDFdICYgMHg4MCkpIHsKKwkJLyogdGhpcyBieXRlIGlzIHN0YXJ0IG9yIGNvbnQuIG9mIG11bHRpYnl0ZSBzZXF1ZW5jZSwgYXMgd2UgZG8gbm90IGtub3cgdGhlIG5leHQgYnl0ZSB3ZSBuZWVkIHRvIGRlbGV0ZSBpdC4gKi8KKwkJbC0tOworCQlpZiAoYXZwX3ZhbHVlLT5vcy5kYXRhW2xdICYgMHg0MCkKKwkJCWJyZWFrOyAvKiBUaGlzIHdhcyBhIHN0YXJ0IGJ5dGUsIHdlIGNhbiBzdG9wIHRoZSBsb29wICovCisJfQorCQorCUNIRUNLX01BTExPQ19ETyggZmRfZHVtcF9leHRlbmQoRkRfRFVNUF9TVERfUEFSQU1TLCAiXCIlLipzXCIiLCAoaW50KWwsIChjaGFyICopYXZwX3ZhbHVlLT5vcy5kYXRhKSwgcmV0dXJuIE5VTEwpOworCQorCXJldHVybiAqYnVmOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgVGltZSAgQVZQICB0eXBlICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVGhlIGludGVycHJldCBhbmQgZW5jb2RlIGZ1bmN0aW9ucyB3b3JrIHdpdGggYSAidGltZV90IiBwb2ludGVyIGZvciBtYXBwaW5nIAordGhlIGNvbnRlbnRzIG9mIHRoZSBBVlAgKi8KKworLyogVW5peCBFcG9jaCBzdGFydHMgMTk3MC0wMS0wMSwgTlRQIDAgaXMgYXQgMTkwMC0wMS0wMSAqLworI2RlZmluZSBESUZGX0VQT0NIX1RPX05UUCAoKDM2NSooMTk3MC0xOTAwKSArIDE3dWwpICogMjQgKiA2MCAqIDYwKQorCitzdGF0aWMgaW50IGRpYW1ldGVyX3N0cmluZ190b190aW1lX3QoY29uc3QgY2hhciAqc3RyLCBzaXplX3QgbGVuLCB0aW1lX3QgKnJlc3VsdCkgeworICAgIHRpbWVfdCB0aW1lX3N0YW1wOworICAgIENIRUNLX1BBUkFNUyhsZW4gPT0gNCk7CisgICAKKyAgICB0aW1lX3N0YW1wID0gKCgodW5zaWduZWQgbG9uZykoc3RyWzBdJjB4ZmYpKTw8MjQpICsgKChzdHJbMV0mMHhmZik8PDE2KSArICgoc3RyWzJdJjB4ZmYpPDw4KSArICgoc3RyWzNdJjB4ZmYpKTsKKyAgICB0aW1lX3N0YW1wIC09IERJRkZfRVBPQ0hfVE9fTlRQOworI2lmZGVmIEZJWF9fTkVFREVEX0ZPUl9ZRUFSXzIwMzZfQU5EX0xBVEVSCisvKiBOVFAgb3ZlcmZsb3dzIGluIDIwMzY7IGFmdGVyIHRoYXQsIHZhbHVlcyBzdGFydCBhdCB6ZXJvIGFnYWluICovCisjZGVmaW5lIE5UUF9PVkVSRkxPV19DT1JSRUNUSU9OICgweDEwMDAwMDAwMHVsbCkKKyAgICAvKiBYWFg6IGRlYnVnIGFuZCBmaW5kIGNvcnJlY3QgY29udmVyc2lvbiAqLworICAgIGlmIChzdHJbMF0gJiAweDgwID09IDB4MDApIHsKKyAgICAgICAgdGltZV9zdGFtcCArPSBOVFBfT1ZFUkZMT1dfQ09SUkVDVElPTjsKKyAgICB9CisjZW5kaWYKKyAgICAqcmVzdWx0ID0gdGltZV9zdGFtcDsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0aW1lX3RfdG9fZGlhbWV0ZXJfc3RyaW5nKHRpbWVfdCB0aW1lX3N0YW1wLCBjaGFyICoqcmVzdWx0KSB7CisgICAgdWludDY0X3Qgb3V0ID0gdGltZV9zdGFtcDsKKyAgICBjaGFyICpjb252OworICAgIC8qIFhYWDogMjAzNiBmaXggKi8KKyAgICBvdXQgKz0gRElGRl9FUE9DSF9UT19OVFA7CisgICAgQ0hFQ0tfUEFSQU1TKCAob3V0ID4+IDMyKSA9PSAwKTsKKworICAgIENIRUNLX01BTExPQyhjb252PShjaGFyICopbWFsbG9jKDUpKTsKKyAgICAKKyAgICBjb252WzBdID0gKG91dD4+MjQpICYgMHhmZjsKKyAgICBjb252WzFdID0gKG91dD4+MTYpICYgMHhmZjsKKyAgICBjb252WzJdID0gKG91dD4+IDgpICYgMHhmZjsKKyAgICBjb252WzNdID0gIG91dCAgICAgICYgMHhmZjsKKyAgICBjb252WzRdID0gJ1wwJzsKKyAgICAqcmVzdWx0ID0gY29udjsKKyAgICByZXR1cm4gMDsKK30KKworaW50IGZkX2RpY3RmY3RfVGltZV9lbmNvZGUodm9pZCAqIGRhdGEsIHVuaW9uIGF2cF92YWx1ZSAqIGF2cF92YWx1ZSkKK3sKKwljaGFyICogYnVmOworCXNpemVfdCBsZW47CisJCisJVFJBQ0VfRU5UUlkoIiVwICVwIiwgZGF0YSwgYXZwX3ZhbHVlKTsKKwlDSEVDS19QQVJBTVMoIGRhdGEgJiYgYXZwX3ZhbHVlICApOworCQorCUNIRUNLX0ZDVCggdGltZV90X3RvX2RpYW1ldGVyX3N0cmluZyggKigodGltZV90ICopZGF0YSksICZidWYpICk7CisJLyogRklYTUU6IHJldHVybiBsZW4gZnJvbSB0aGUgZnVuY3Rpb24gYWJvdmU/ICovIGxlbiA9IDQ7CisJCisJYXZwX3ZhbHVlLT5vcy5sZW4gPSBsZW47CisJYXZwX3ZhbHVlLT5vcy5kYXRhID0gKHVpbnQ4X3QgKilidWY7CisJcmV0dXJuIDA7Cit9CisKK2ludCBmZF9kaWN0ZmN0X1RpbWVfaW50ZXJwcmV0KHVuaW9uIGF2cF92YWx1ZSAqIGF2cF92YWx1ZSwgdm9pZCAqIGludGVycHJldGVkKQoreworCVRSQUNFX0VOVFJZKCIlcCAlcCIsIGF2cF92YWx1ZSwgaW50ZXJwcmV0ZWQpOworCQorCUNIRUNLX1BBUkFNUyggYXZwX3ZhbHVlICYmIGludGVycHJldGVkICk7CisJCisJcmV0dXJuIGRpYW1ldGVyX3N0cmluZ190b190aW1lX3QoKGNvbnN0IGNoYXIgKilhdnBfdmFsdWUtPm9zLmRhdGEsIGF2cF92YWx1ZS0+b3MubGVuLCBpbnRlcnByZXRlZCk7Cit9CisKK3N0YXRpYyB2b2lkIF9mb3JtYXRfb2ZmcyAobG9uZyBvZmZzZXQsIGNoYXIgKmJ1ZikgeworICAgIGludCBvZmZzX2hvdXJzLCBvZmZzX21pbnV0ZXMsIHNnbiA9IDE7CisgICAgaWYgKG9mZnNldCA8IDApIHsKKyAgICAgICAgb2Zmc2V0ID0gLW9mZnNldDsKKyAgICAgICAgc2duID0gMTsKKyAgICB9CisgICAgb2Zmc19ob3VycyA9IChpbnQpKG9mZnNldC8zNjAwKTsKKyAgICBvZmZzX21pbnV0ZXMgPSAob2Zmc2V0JTM2MDApLzYwOworCisgICAgY2hhciogcyA9IGJ1ZjsKKworICAgICoocysrKSA9IHNnbiA9PSAxID8gJysnIDogJy0nOworICAgICoocysrKSA9IChjaGFyKShvZmZzX2hvdXJzLzEwKSArICcwJzsKKyAgICAqKHMrKykgPSBvZmZzX2hvdXJzJTEwICsgJzAnOworCisgICAgaWYgKG9mZnNfbWludXRlcyA9PSAwKSB7CisgICAgICAgICoocysrKSA9ICdcMCc7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKihzKyspID0gKGNoYXIpKG9mZnNfbWludXRlcy8xMCkgKyAnMCc7CisgICAgICAgICoocysrKSA9IG9mZnNfbWludXRlcyUxMCArICcwJzsKKyAgICAgICAgKihzKyspID0gJ1wwJzsKKyAgICB9Cit9CisKK0RFQ0xBUkVfRkRfRFVNUF9QUk9UT1RZUEUoZmRfZGljdGZjdF9UaW1lX2R1bXAsIHVuaW9uIGF2cF92YWx1ZSAqIGF2cF92YWx1ZSkKK3sKKwl0aW1lX3QgdmFsOworCXN0cnVjdCB0bSBjb252OworCWNoYXIgdHpfYnVmWzddOworCQkKKwlGRF9EVU1QX0hBTkRMRV9PRkZTRVQoKTsKKwkKKwlpZiAoYXZwX3ZhbHVlLT5vcy5sZW4gIT0gNCkgeworCQlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKEZEX0RVTVBfU1REX1BBUkFNUywgIltpbnZhbGlkIGxlbmd0aDogJXpkXSIsIGF2cF92YWx1ZS0+b3MubGVuKSwgcmV0dXJuIE5VTEwpOworCQlyZXR1cm4gKmJ1ZjsKKwl9CisKKwlpZiAoZGlhbWV0ZXJfc3RyaW5nX3RvX3RpbWVfdCgoY2hhciAqKWF2cF92YWx1ZS0+b3MuZGF0YSwgYXZwX3ZhbHVlLT5vcy5sZW4sICZ2YWwpICE9IDApIHsKKwkJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9kdW1wX2V4dGVuZChGRF9EVU1QX1NURF9QQVJBTVMsICJbdGltZSBjb252ZXJzaW9uIGVycm9yXSIpLCByZXR1cm4gTlVMTCk7CisJCXJldHVybiAqYnVmOworCX0KKwkKKwlDSEVDS19NQUxMT0NfRE8oIGxvY2FsdGltZV9yKCZ2YWwsICZjb252KSwgcmV0dXJuIE5VTEwpOworCV9mb3JtYXRfb2Zmcyhjb252LnRtX2dtdG9mZiwgdHpfYnVmKTsKKwlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKEZEX0RVTVBfU1REX1BBUkFNUywgIiVkJTAyZCUwMmRUJTAyZCUwMmQlMDJkJXMiLCBjb252LnRtX3llYXIrMTkwMCwgY29udi50bV9tb24rMSwgY29udi50bV9tZGF5LCBjb252LnRtX2hvdXIsIGNvbnYudG1fbWluLCBjb252LnRtX3NlYywgdHpfYnVmKSwgcmV0dXJuIE5VTEwpOworCXJldHVybiAqYnVmOworfQorCisvKiBDaGVjayB0aGF0IGEgZ2l2ZW4gQVZQIHZhbHVlIGNvbnRhaW5zIGFsbCB0aGUgY2hhcmFjdGVycyBmcm9tIGRhdGEgaW4gdGhlIHNhbWUgb3JkZXIgKi8KK3N0YXRpYyBjaGFyIGVycm9yX21lc3NhZ2VbODBdOworaW50IGZkX2RpY3RmY3RfQ2hhckluT1NfY2hlY2sodm9pZCAqIGRhdGEsIHVuaW9uIGF2cF92YWx1ZSAqIHZhbCwgY2hhciAqKiBlcnJvcl9tc2cpCit7CisJY2hhciAqIGluQ2hhciA9IGRhdGE7CisJY2hhciAqIGluRGF0YSA9IChjaGFyICopdmFsLT5vcy5kYXRhOworCWludCBpID0gMDsKKwlDSEVDS19QQVJBTVMoZGF0YSk7CisJd2hpbGUgKCppbkNoYXIgIT0gJ1wwJykgeworCQl3aGlsZSAoaSA8IHZhbC0+b3MubGVuKSB7CisJCQlpZiAoKmluQ2hhciA9PSBpbkRhdGFbaSsrXSkgeworCQkJCWluQ2hhcisrOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChpID49IHZhbC0+b3MubGVuKQorCQkJYnJlYWs7CisJfQorCWlmICgqaW5DaGFyID09ICdcMCcpCisJCXJldHVybiAwOworCQorCWlmIChlcnJvcl9tc2cpIHsKKwkJc25wcmludGYoZXJyb3JfbWVzc2FnZSwgc2l6ZW9mKGVycm9yX21lc3NhZ2UpLCAiQ291bGQgbm90IGZpbmQgJyVjJyBpbiBBVlAiLCAqaW5DaGFyKTsKKwkJKmVycm9yX21zZyA9IGVycm9yX21lc3NhZ2U7CisJfQorCXJldHVybiBFQkFETVNHOworfQpkaWZmIC0tZ2l0IGEvbGliZmRwcm90by9kaXNwYXRjaC5jIGIvbGliZmRwcm90by9kaXNwYXRjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMTE5MTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJmZHByb3RvL2Rpc3BhdGNoLmMKQEAgLTAsMCArMSwyMjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDEzLCBXSURFIFByb2plY3QgYW5kIE5JQ1QJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFdJREUgUHJvamVjdCBvciBOSUNUIG5vciB0aGUgCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgV0lERSBQcm9qZWN0IGFuZCAJCQkJCQkgKgorKiAgIE5JQ1QuCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImZkcHJvdG8taW50ZXJuYWwuaCIKKworLyogVGhlIGRpc3BhdGNoIG1vZHVsZSBpbiB0aGUgbGlicmFyeSBpcyBxdWl0ZSBzaW1wbGU6IGNhbGxiYWNrcyBhcmUgc2F2ZWQgaW4gYSBnbG9iYWwgbGlzdAorICogaW4gbm8gcGFydGljdWxhciBvcmRlci4gSW4gYWRkaXRpb24sIHRoZXkgYXJlIGFsc28gbGlua2VkIGZyb20gdGhlIGRpY3Rpb25hcnkgb2JqZWN0cyB0aGV5CisgKiByZWZlciB0by4gKi8KKworLyogUHJvdGVjdGlvbiBmb3IgdGhlIGxpc3RzIG1hbmFnZWQgaW4gdGhpcyBtb2R1bGUuICovCitwdGhyZWFkX3J3bG9ja190IGZkX2Rpc3BfbG9jayA9IFBUSFJFQURfUldMT0NLX0lOSVRJQUxJWkVSOworCisvKiBMaXN0IG9mIGFsbCByZWdpc3RlcmVkIGhhbmRsZXJzIC0tIHVzZWZ1bCBpZiB3ZSB3YW50IHRvIGNsZWFudXAgcHJvcGVybHkgYXQgc29tZSBwb2ludC4uLiAqLworc3RhdGljIHN0cnVjdCBmZF9saXN0IGFsbF9oYW5kbGVycyA9IEZEX0xJU1RfSU5JVElBTElaRVIoIGFsbF9oYW5kbGVycyApOworCisvKiBMaXN0IG9mIGhhbmRsZXJzIHJlZ2lzdGVyZWQgZm9yIERJU1BfSE9XX0FOWS4gT3RoZXIgaGFuZGxlcnMgYXJlIHN0b3JlZCBpbiB0aGUgZGljdGlvbmFyeSAqLworc3RhdGljIHN0cnVjdCBmZF9saXN0IGFueV9oYW5kbGVycyA9IEZEX0xJU1RfSU5JVElBTElaRVIoIGFueV9oYW5kbGVycyApOworCisvKiBUaGUgc3RydWN0dXJlIHRvIHN0b3JlIGEgY2FsbGJhY2sgKi8KK3N0cnVjdCBkaXNwX2hkbCB7CisJaW50CQkgZXllYzsJLyogRXllIGNhdGNoZXIsIERJU1BfRVlFQyAqLworCXN0cnVjdCBmZF9saXN0CSBhbGw7CS8qIGxpbmsgaW4gdGhlIGFsbF9oYW5kbGVycyBsaXN0ICovCisJc3RydWN0IGZkX2xpc3QJIHBhcmVudDsvKiBsaW5rIGluIGRpY3Rpb25hcnkgY2JfbGlzdCBvciBpbiBhbnlfaGFuZGxlcnMgKi8KKwllbnVtIGRpc3BfaG93CSBob3c7CS8qIENvcHkgb2YgcmVnaXN0cmF0aW9uIHBhcmFtZXRlciAqLworCXN0cnVjdCBkaXNwX3doZW4gd2hlbjsJLyogQ29weSBvZiByZWdpc3RyYXRpb24gcGFyYW1ldGVyICovCisJaW50CQkoKmNiKSggc3RydWN0IG1zZyAqKiwgc3RydWN0IGF2cCAqLCBzdHJ1Y3Qgc2Vzc2lvbiAqLCB2b2lkICosIGVudW0gZGlzcF9hY3Rpb24gKik7CS8qIFRoZSBjYWxsYmFjayBpdHNlbGYgKi8KKwl2b2lkICAgICAgICAgICAgKm9wYXF1ZTsgLyogb3BhcXVlIGRhdGEgcGFzc2VkIGJhY2sgdG8gdGhlIGNhbGxiYWNrICovCit9OworCisjZGVmaW5lIERJU1BfRVlFQwkweEQxNTI0MUMxCisjZGVmaW5lIFZBTElEQVRFX0hETCggX2hkbCApIFwKKwkoICggKCBfaGRsICkgIT0gTlVMTCApICYmICggKChzdHJ1Y3QgZGlzcF9oZGwgKikoIF9oZGwgKSktPmV5ZWMgPT0gRElTUF9FWUVDICkgKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIENhbGwgQ0JzIGZyb20gYSBnaXZlbiBsaXN0IChhbnlfaGFuZGxlcnMgaWYgY2JfbGlzdCBpcyBOVUxMKSAtLSBtdXN0IGhhdmUgbG9ja2VkIGZkX2Rpc3BfbG9jayBiZWZvcmUgKi8KK2ludCBmZF9kaXNwX2NhbGxfY2JfaW50KCBzdHJ1Y3QgZmRfbGlzdCAqIGNiX2xpc3QsIHN0cnVjdCBtc2cgKiogbXNnLCBzdHJ1Y3QgYXZwICphdnAsIHN0cnVjdCBzZXNzaW9uICpzZXNzLCBlbnVtIGRpc3BfYWN0aW9uICphY3Rpb24sIAorCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogb2JqX2FwcCwgc3RydWN0IGRpY3Rfb2JqZWN0ICogb2JqX2NtZCwgc3RydWN0IGRpY3Rfb2JqZWN0ICogb2JqX2F2cCwgc3RydWN0IGRpY3Rfb2JqZWN0ICogb2JqX2VudSwKKwkJCWNoYXIgKiogZHJvcF9yZWFzb24sIHN0cnVjdCBtc2cgKiogZHJvcF9tc2cpCit7CisJc3RydWN0IGZkX2xpc3QgKiBzZW50aSwgKmxpOworCWludCByOworCVRSQUNFX0VOVFJZKCIlcCAlcCAlcCAlcCAlcCAlcCAlcCAlcCAlcCIsIGNiX2xpc3QsIG1zZywgYXZwLCBzZXNzLCBhY3Rpb24sIG9ial9hcHAsIG9ial9jbWQsIG9ial9hdnAsIG9ial9lbnUpOworCUNIRUNLX1BBUkFNUyhtc2cgJiYgYWN0aW9uKTsKKwkKKwlzZW50aSA9IGNiX2xpc3Q7CisJaWYgKCFzZW50aSkKKwkJc2VudGkgPSAmYW55X2hhbmRsZXJzOworCQorCWZvciAobGkgPSBzZW50aS0+bmV4dDsgbGkgIT0gc2VudGk7IGxpID0gbGktPm5leHQpIHsKKwkJc3RydWN0IGRpc3BfaGRsICogaGRsID0gKHN0cnVjdCBkaXNwX2hkbCAqKShsaS0+byk7CisJCQorCQlUUkFDRV9ERUJVRyhBTk5PWUlORywgIndoZW46ICVwICVwICVwICVwIiwgaGRsLT53aGVuLmFwcCwgaGRsLT53aGVuLmNvbW1hbmQsIGhkbC0+d2hlbi5hdnAsIGhkbC0+d2hlbi52YWx1ZSk7CisJCQorCQkvKiBDaGVjayB0aGlzIGhhbmRsZXIgbWF0Y2hlcyB0aGlzIG1lc3NhZ2UgLyBhdnAgKi8KKwkJaWYgKGhkbC0+d2hlbi5hcHAgICAgICYmIChoZGwtPndoZW4uYXBwICAgICAhPSBvYmpfYXBwKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoaGRsLT53aGVuLmNvbW1hbmQgJiYgKGhkbC0+d2hlbi5jb21tYW5kICE9IG9ial9jbWQpKQorCQkJY29udGludWU7CisJCWlmIChoZGwtPndoZW4uYXZwICAgICAmJiAoaGRsLT53aGVuLmF2cCAgICAgIT0gb2JqX2F2cCkpCisJCQljb250aW51ZTsKKwkJaWYgKGhkbC0+d2hlbi52YWx1ZSAgICYmIChoZGwtPndoZW4udmFsdWUgICAhPSBvYmpfZW51KSkKKwkJCWNvbnRpbnVlOworCQkKKwkJLyogV2UgaGF2ZSBhIG1hdGNoLCB0aGUgY2IgbXVzdCBiZSBjYWxsZWQuICovCisJCUNIRUNLX0ZDVF9ETyggKHIgPSAoKmhkbC0+Y2IpKG1zZywgYXZwLCBzZXNzLCBoZGwtPm9wYXF1ZSwgYWN0aW9uKSksCisJCQl7CisJCQkJKmRyb3BfcmVhc29uID0gIkludGVybmFsIGVycm9yOiBhIERJU1BBVENIIGNhbGxiYWNrIHJldHVybmVkIGFuIGVycm9yIjsKKwkJCQkqZHJvcF9tc2cgPSAqbXNnOworCQkJCSptc2cgPSBOVUxMOworCQkJfQorCQkgKTsKKwkJCisJCWlmICgqYWN0aW9uICE9IERJU1BfQUNUX0NPTlQpCisJCQlicmVhazsKKwkJCisJCWlmICggKm1zZyAgPT0gTlVMTCApCisJCQlicmVhazsKKwl9CisJCisJLyogV2UncmUgZG9uZSBvbiB0aGlzIGxpc3QgKi8KKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBDcmVhdGUgYSBuZXcgaGFuZGxlciBhbmQgbGluayBpdCAqLworaW50IGZkX2Rpc3BfcmVnaXN0ZXIgKCBpbnQgKCpjYikoIHN0cnVjdCBtc2cgKiosIHN0cnVjdCBhdnAgKiwgc3RydWN0IHNlc3Npb24gKiwgdm9pZCAqLCBlbnVtIGRpc3BfYWN0aW9uICopLCAKKwkJCWVudW0gZGlzcF9ob3cgaG93LCBzdHJ1Y3QgZGlzcF93aGVuICogd2hlbiwgdm9pZCAqIG9wYXF1ZSwgc3RydWN0IGRpc3BfaGRsICoqIGhhbmRsZSApCit7CisJc3RydWN0IGZkX2xpc3QgKiBjYl9saXN0ID0gTlVMTDsKKwlzdHJ1Y3QgZGlzcF9oZGwgKiBuZXc7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogdHlwZV9lbnVtID0gTlVMTCwgKiB0eXBlX2F2cDsKKwlzdHJ1Y3QgZGljdGlvbmFyeSAgKiBkaWN0ID0gTlVMTDsKKwkKKwlUUkFDRV9FTlRSWSgiJXAgJWQgJXAgJXAiLCBjYiwgaG93LCB3aGVuLCBoYW5kbGUpOworCUNIRUNLX1BBUkFNUyggY2IgJiYgKCAoaG93ID09IERJU1BfSE9XX0FOWSkgfHwgd2hlbiApKTsKKwkKKwlzd2l0Y2ggKGhvdykgeworCQljYXNlIERJU1BfSE9XX0FOWToKKwkJCWNiX2xpc3QgPSAmYW55X2hhbmRsZXJzOworCQkJYnJlYWs7CisJCQorCQljYXNlIERJU1BfSE9XX0FQUElEOgorCQkJQ0hFQ0tfRkNUKCBmZF9kaWN0X2Rpc3BfY2IoRElDVF9BUFBMSUNBVElPTiwgd2hlbi0+YXBwLCAmY2JfbGlzdCkgKTsKKwkJCWJyZWFrOworCQkKKwkJY2FzZSBESVNQX0hPV19DQzoKKwkJCUNIRUNLX0ZDVCggZmRfZGljdF9kaXNwX2NiKERJQ1RfQ09NTUFORCwgd2hlbi0+Y29tbWFuZCwgJmNiX2xpc3QpICk7CisJCQlicmVhazsKKwkJCisJCWNhc2UgRElTUF9IT1dfQVZQX0VOVU1WQUw6CisJCQlDSEVDS19GQ1QoIGZkX2RpY3RfZGlzcF9jYihESUNUX0VOVU1WQUwsIHdoZW4tPnZhbHVlLCAmY2JfbGlzdCkgKTsgLyogY2JfbGlzdCBpcyB0aGVuIG92ZXJ3cml0dGVuICovCisJCQlDSEVDS19GQ1QoIGZkX2RpY3RfZ2V0ZGljdCh3aGVuLT52YWx1ZSwgJmRpY3QpICk7CisJCQlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKGRpY3QsIERJQ1RfVFlQRSwgVFlQRV9PRl9FTlVNVkFMLCB3aGVuLT52YWx1ZSwgJnR5cGVfZW51bSwgRUlOVkFMKSApOworCQljYXNlIERJU1BfSE9XX0FWUDoKKwkJCUNIRUNLX0ZDVCggZmRfZGljdF9kaXNwX2NiKERJQ1RfQVZQLCB3aGVuLT5hdnAsICZjYl9saXN0KSApOworCQkJaWYgKGRpY3QpIHsKKwkJCQlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKGRpY3QsIERJQ1RfVFlQRSwgVFlQRV9PRl9BVlAsIHdoZW4tPmF2cCwgJnR5cGVfYXZwLCBFSU5WQUwpICk7CisJCQkJaWYgKHR5cGVfZW51bSkgeworCQkJCQlDSEVDS19QQVJBTVMoIHR5cGVfZW51bSA9PSB0eXBlX2F2cCApOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQkKKwkJZGVmYXVsdDoKKwkJCUNIRUNLX1BBUkFNUyhob3cgPSAwKTsKKwl9CisJLyogV2UgbWlnaHQgZnVydGhlciBjaGVjayBvcHRpb25hbCBmaWVsZHMsIGJ1dCB3ZSB0cnVzdCB0aGUgY2FsbGVyIF5eICovCisJCisJLyogQ3JlYXRlIHRoZSBuZXcgaGFuZGxlciAqLworCUNIRUNLX01BTExPQyggbmV3ID0gbWFsbG9jKCBzaXplb2Yoc3RydWN0IGRpc3BfaGRsKSApICk7CisJbWVtc2V0KG5ldywgMCwgc2l6ZW9mKHN0cnVjdCBkaXNwX2hkbCkpOworCW5ldy0+ZXllYyA9IERJU1BfRVlFQzsKKwlmZF9saXN0X2luaXQoJm5ldy0+YWxsLCBuZXcpOworCWZkX2xpc3RfaW5pdCgmbmV3LT5wYXJlbnQsIG5ldyk7CisJbmV3LT5ob3cgPSBob3c7CisJc3dpdGNoIChob3cpIHsKKwkJY2FzZSBESVNQX0hPV19BTlk6CisJCQkvKiB0aGVyZSBpcyBubyAid2hlbiIgaW4gdGhhdCBjYXNlICovCisJCQlicmVhazsKKwkJY2FzZSBESVNQX0hPV19BVlBfRU5VTVZBTDoKKwkJCW5ldy0+d2hlbi52YWx1ZSAgID0gd2hlbi0+dmFsdWU7CisJCWNhc2UgRElTUF9IT1dfQVZQOgorCQkJbmV3LT53aGVuLmF2cCAgICAgPSB3aGVuLT5hdnA7CisJCWNhc2UgRElTUF9IT1dfQ0M6CisJCQluZXctPndoZW4uY29tbWFuZCA9IHdoZW4tPmNvbW1hbmQ7CisJCWNhc2UgRElTUF9IT1dfQVBQSUQ6CisJCQluZXctPndoZW4uYXBwICAgICA9IHdoZW4tPmFwcDsKKwl9CisJbmV3LT5jYiA9IGNiOworCW5ldy0+b3BhcXVlID0gb3BhcXVlOworCQorCS8qIE5vdywgbGluayB0aGlzIG5ldyBlbGVtZW50IGluIHRoZSBhcHByb3ByaWF0ZSBsaXN0cyAqLworCUNIRUNLX1BPU0lYKCBwdGhyZWFkX3J3bG9ja193cmxvY2soJmZkX2Rpc3BfbG9jaykgKTsKKwlmZF9saXN0X2luc2VydF9iZWZvcmUoJmFsbF9oYW5kbGVycywgJm5ldy0+YWxsKTsKKwlmZF9saXN0X2luc2VydF9iZWZvcmUoY2JfbGlzdCwgJm5ldy0+cGFyZW50KTsKKwlDSEVDS19QT1NJWCggcHRocmVhZF9yd2xvY2tfdW5sb2NrKCZmZF9kaXNwX2xvY2spICk7CisJCisJLyogV2UncmUgZG9uZSAqLworCWlmIChoYW5kbGUpCisJCSpoYW5kbGUgPSBuZXc7CisJCisJcmV0dXJuIDA7Cit9CisKKy8qIERlbGV0ZSBhIGhhbmRsZXIgKi8KK2ludCBmZF9kaXNwX3VucmVnaXN0ZXIgKCBzdHJ1Y3QgZGlzcF9oZGwgKiogaGFuZGxlLCB2b2lkICoqIG9wYXF1ZSApCit7CisJc3RydWN0IGRpc3BfaGRsICogZGVsOworCVRSQUNFX0VOVFJZKCIlcCIsIGhhbmRsZSk7CisJQ0hFQ0tfUEFSQU1TKCBoYW5kbGUgJiYgVkFMSURBVEVfSERMKCpoYW5kbGUpICk7CisJZGVsID0gKmhhbmRsZTsKKwkqaGFuZGxlID0gTlVMTDsKKwkKKwlDSEVDS19QT1NJWCggcHRocmVhZF9yd2xvY2tfd3Jsb2NrKCZmZF9kaXNwX2xvY2spICk7CisJZmRfbGlzdF91bmxpbmsoJmRlbC0+YWxsKTsKKwlmZF9saXN0X3VubGluaygmZGVsLT5wYXJlbnQpOworCUNIRUNLX1BPU0lYKCBwdGhyZWFkX3J3bG9ja191bmxvY2soJmZkX2Rpc3BfbG9jaykgKTsKKwkKKwlpZiAob3BhcXVlKQorCQkqb3BhcXVlID0gZGVsLT5vcGFxdWU7CisJCisJZnJlZShkZWwpOworCXJldHVybiAwOworfQorCisvKiBEZWxldGUgYWxsIGhhbmRsZXJzICovCit2b2lkIGZkX2Rpc3BfdW5yZWdpc3Rlcl9hbGwgKCB2b2lkICkKK3sKKwlUUkFDRV9FTlRSWSgiIik7CisJd2hpbGUgKCFGRF9JU19MSVNUX0VNUFRZKCZhbGxfaGFuZGxlcnMpKSB7CisJCUNIRUNLX0ZDVF9ETyggZmRfZGlzcF91bnJlZ2lzdGVyKCh2b2lkICopJihhbGxfaGFuZGxlcnMubmV4dC0+byksIE5VTEwpLCAvKiBjb250aW51ZSAqLyApOworCX0KKwlyZXR1cm47Cit9CmRpZmYgLS1naXQgYS9saWJmZHByb3RvL2ZkcHJvdG8taW50ZXJuYWwuaCBiL2xpYmZkcHJvdG8vZmRwcm90by1pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMjhjNTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJmZHByb3RvL2ZkcHJvdG8taW50ZXJuYWwuaApAQCAtMCwwICsxLDY1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxMywgV0lERSBQcm9qZWN0IGFuZCBOSUNUCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBXSURFIFByb2plY3Qgb3IgTklDVCBub3IgdGhlIAkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFdJREUgUHJvamVjdCBhbmQgCQkJCQkJICoKKyogICBOSUNULgkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgZm9yIGludGVybmFsIHVzZSBpbiB0aGUgZnJlZURpYW1ldGVyIHByb3RvY29sIGxpYnJhcnkgKi8KKworI2lmbmRlZiBfTElCRkRQUk9UT19JTlRFUk5BTF9ICisjZGVmaW5lIF9MSUJGRFBST1RPX0lOVEVSTkFMX0gKKworI2luY2x1ZGUgPGZyZWVEaWFtZXRlci9mcmVlRGlhbWV0ZXItaG9zdC5oPgorI2luY2x1ZGUgPGZyZWVEaWFtZXRlci9saWJmZHByb3RvLmg+CisKKy8qIEludGVybmFsIHRvIHRoZSBsaWJyYXJ5ICovCitleHRlcm4gY29uc3QgY2hhciAqIHR5cGVfYmFzZV9uYW1lW107Cit2b2lkIGZkX21zZ19ldGVpZF9pbml0KHZvaWQpOworaW50IGZkX3Nlc3NfaW5pdCh2b2lkKTsKK3ZvaWQgZmRfc2Vzc19maW5pKHZvaWQpOworCisvKiBJdGVyYXRvciBvbiB0aGUgcnVsZXMgb2YgYSBwYXJlbnQgb2JqZWN0ICovCitpbnQgZmRfZGljdF9pdGVyYXRlX3J1bGVzICggc3RydWN0IGRpY3Rfb2JqZWN0ICpwYXJlbnQsIHZvaWQgKiBkYXRhLCBpbnQgKCpjYikodm9pZCAqLCBzdHJ1Y3QgZGljdF9ydWxlX2RhdGEgKikgKTsKKworLyogRGlzcGF0Y2ggLyBtZXNzYWdlcyAvIGRpY3Rpb25hcnkgQVBJICovCitpbnQgZmRfZGljdF9kaXNwX2NiKGVudW0gZGljdF9vYmplY3RfdHlwZSB0eXBlLCBzdHJ1Y3QgZGljdF9vYmplY3QgKm9iaiwgc3RydWN0IGZkX2xpc3QgKiogY2JfbGlzdCk7CitERUNMQVJFX0ZEX0RVTVBfUFJPVE9UWVBFKGZkX2RpY3RfZHVtcF9hdnBfdmFsdWUsIHVuaW9uIGF2cF92YWx1ZSAqYXZwX3ZhbHVlLCBzdHJ1Y3QgZGljdF9vYmplY3QgKiBtb2RlbCwgaW50IGluZGVudCwgaW50IGhlYWRlcik7CitpbnQgZmRfZGlzcF9jYWxsX2NiX2ludCggc3RydWN0IGZkX2xpc3QgKiBjYl9saXN0LCBzdHJ1Y3QgbXNnICoqIG1zZywgc3RydWN0IGF2cCAqYXZwLCBzdHJ1Y3Qgc2Vzc2lvbiAqc2VzcywgZW51bSBkaXNwX2FjdGlvbiAqYWN0aW9uLCAKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIG9ial9hcHAsIHN0cnVjdCBkaWN0X29iamVjdCAqIG9ial9jbWQsIHN0cnVjdCBkaWN0X29iamVjdCAqIG9ial9hdnAsIHN0cnVjdCBkaWN0X29iamVjdCAqIG9ial9lbnUsCisJCQljaGFyICoqIGRyb3BfcmVhc29uLCBzdHJ1Y3QgbXNnICoqIGRyb3BfbXNnKTsKK2V4dGVybiBwdGhyZWFkX3J3bG9ja190IGZkX2Rpc3BfbG9jazsKKworLyogTWVzc2FnZXMgLyBzZXNzaW9ucyBBUEkgKi8KK2ludCBmZF9zZXNzX3JlY2xhaW1fbXNnICggc3RydWN0IHNlc3Npb24gKiogc2Vzc2lvbiApOworCisKKyNlbmRpZiAvKiBfTElCRkRQUk9UT19JTlRFUk5BTF9IICovCmRpZmYgLS1naXQgYS9saWJmZHByb3RvL2ZpZm8uYyBiL2xpYmZkcHJvdG8vZmlmby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNWI3ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJmZHByb3RvL2ZpZm8uYwpAQCAtMCwwICsxLDcwMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTMsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBGSUZPIHF1ZXVlcyBtb2R1bGUuCisgKgorICogVGhlIHRocmVhZHMgdGhhdCBjYWxsIHRoZXNlIGZ1bmN0aW9ucyBtdXN0IGJlIGluIHRoZSBjYW5jZWxsYXRpb24gc3RhdGUgUFRIUkVBRF9DQU5DRUxfRU5BQkxFIGFuZCB0eXBlIFBUSFJFQURfQ0FOQ0VMX0RFRkVSUkVELgorICogVGhpcyBpcyB0aGUgZGVmYXVsdCBzdGF0ZSBhbmQgdHlwZSBvbiB0aHJlYWQgY3JlYXRpb24uCisgKgorICogSW4gb3JkZXIgdG8gZGVzdHJveSBwcm9wZXJseSBhIHF1ZXVlLCB0aGUgYXBwbGljYXRpb24gbXVzdDoKKyAqICAtPiBzaHV0ZG93biBhbnkgcHJvY2VzcyB0aGF0IGNhbiBhZGQgaW50byB0aGUgcXVldWUgZmlyc3QuCisgKiAgLT4gcHRocmVhZF9jYW5jZWwgYW55IHRocmVhZCB0aGF0IGNvdWxkIGJlIHdhaXRpbmcgb24gdGhlIHF1ZXVlLgorICogIC0+IGNvbnN1bWUgYW55IGVsZW1lbnQgdGhhdCBpcyBpbiB0aGUgcXVldWUsIHVzaW5nIGZkX3F1X3RyeWdldF9pbnQuCisgKiAgLT4gdGhlbiBkZXN0cm95IHRoZSBxdWV1ZSB1c2luZyBmZF9tcV9kZWwuCisgKi8KKworI2luY2x1ZGUgImZkcHJvdG8taW50ZXJuYWwuaCIKKworLyogRGVmaW5pdGlvbiBvZiBhIEZJRk8gcXVldWUgb2JqZWN0ICovCitzdHJ1Y3QgZmlmbyB7CisJaW50CQlleWVjOwkvKiBBbiBleWUgY2F0Y2hlciwgYWxzbyB1c2VkIHRvIGNoZWNrIGEgcXVldWUgaXMgdmFsaWQuIEZJRk9fRVlFQyAqLworCQorCXB0aHJlYWRfbXV0ZXhfdAltdHg7CS8qIE11dGV4IHByb3RlY3RpbmcgdGhpcyBxdWV1ZSAqLworCXB0aHJlYWRfY29uZF90CWNvbmRfcHVsbDsJLyogY29uZGl0aW9uIHZhcmlhYmxlIGZvciBwdWxsaW5nIHRocmVhZHMgKi8KKwlwdGhyZWFkX2NvbmRfdAljb25kX3B1c2g7CS8qIGNvbmRpdGlvbiB2YXJpYWJsZSBmb3IgcHVzaGluZyB0aHJlYWRzICovCisJCisJc3RydWN0IGZkX2xpc3QJbGlzdDsJLyogc2VudGluZWwgZm9yIHRoZSBsaXN0IG9mIGVsZW1lbnRzICovCisJaW50CQljb3VudDsJLyogbnVtYmVyIG9mIG9iamVjdHMgaW4gdGhlIGxpc3QgKi8KKwlpbnQJCXRocnM7CS8qIG51bWJlciBvZiB0aHJlYWRzIHdhaXRpbmcgZm9yIGEgbmV3IGVsZW1lbnQgKHdoZW4gY291bnQgaXMgMCkgKi8KKwkKKwlpbnQgCQltYXg7CS8qIG1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIHRvIGFjY2VwdCBpZiBub3QgMCAqLworCWludAkJdGhyc19wdXNoOyAvKiBudW1iZXIgb2YgdGhyZWFkcyB3YWl0bmlnIHRvIHB1c2ggYW4gaXRlbSAqLworCQorCXVpbnQxNl90CWhpZ2g7CS8qIEhpZ2ggbGV2ZWwgdGhyZXNob2xkIChzZWUgbGliZnJlZURpYW1ldGVyLmggZm9yIGRldGFpbHMpICovCisJdWludDE2X3QJbG93OwkvKiBMb3cgbGV2ZWwgdGhyZXNoaG9sZCAqLworCXZvaWQgCQkqZGF0YTsJLyogT3BhcXVlIHBvaW50ZXIgZm9yIHRocmVzaG9sZCBjYWxsYmFja3MgKi8KKwl2b2lkCQkoKmhfY2IpKHN0cnVjdCBmaWZvICosIHZvaWQgKiopOyAvKiBUaGUgY2FsbGJhY2tzICovCisJdm9pZAkJKCpsX2NiKShzdHJ1Y3QgZmlmbyAqLCB2b2lkICoqKTsKKwlpbnQgCQloaWdoZXN0Oy8qIFRoZSBoaWdoZXN0IGNvdW50IHZhbHVlIGZvciB3aGljaCBoX2NiIGhhcyBiZWVuIGNhbGxlZCAqLworCWludAkJaGlnaGVzdF9ldmVyOyAvKiBUaGUgbWF4IGNvdW50IHZhbHVlIHRoaXMgcXVldWUgaGFzIHJlYWNoZWQgKGZvciB0d2Vha2luZykgKi8KKwkKKwlsb25nIGxvbmcJdG90YWxfaXRlbXM7ICAgLyogQ3VtdWxhdGVkIG51bWJlciBvZiBpdGVtcyB0aGF0IHdlbnQgdGhyb3VnaCB0aGlzIGZpZm8gKGV4Y2x1ZGluZyBjdXJyZW50IGNvdW50KSwgYWx3YXlzIGluY3JlYXNpbmcuICovCisJc3RydWN0IHRpbWVzcGVjIHRvdGFsX3RpbWU7ICAgIC8qIEN1bXVsYXRlZCB0aW1lIGFsbCBpdGVtcyBzcGVudCBpbiB0aGlzIHF1ZXVlLCBpbmNsdWRpbmcgYmxvY2tpbmcgdGltZSAoYWx3YXlzIGdyb3dpbmcsIHVzZSBkZWx0YXMgZm9yIG1vbml0b3JpbmcpICovCisJc3RydWN0IHRpbWVzcGVjIGJsb2NraW5nX3RpbWU7IC8qIEN1bXVsYXRlZCB0aW1lIHRocmVhZHMgdHJ5aW5nIHRvIHBvc3QgbmV3IGl0ZW1zIHdlcmUgYmxvY2tlZCAocXVldWUgZnVsbCkuICovCisJc3RydWN0IHRpbWVzcGVjIGxhc3RfdGltZTsgICAgIC8qIEZvciB0aGUgbGFzdCBlbGVtZW50IHJldHJpZXZlZCBmcm9tIHRoZSBxdWV1ZSwgaG93IGxvbmcgaXQgdGFrZSBiZXR3ZWVuIHBvc3RpbmcgKGluY2x1ZGluZyBibG9ja2luZykgYW5kIHBvcGluZyAqLworCQorfTsKKworc3RydWN0IGZpZm9faXRlbSB7CisJc3RydWN0IGZkX2xpc3QgICBpdGVtOworCXN0cnVjdCB0aW1lc3BlYyAgcG9zdGVkX29uOworfTsKKworLyogVGhlIGV5ZSBjYXRjaGVyIHZhbHVlICovCisjZGVmaW5lIEZJRk9fRVlFQwkweGU3ZWMxMTMwCisKKy8qIE1hY3JvIHRvIGNoZWNrIGEgcG9pbnRlciAqLworI2RlZmluZSBDSEVDS19GSUZPKCBfcXVldWUgKSAoKCAoX3F1ZXVlKSAhPSBOVUxMKSAmJiAoIChfcXVldWUpLT5leWVjID09IEZJRk9fRVlFQykgKQorCisKKy8qIENyZWF0ZSBhIG5ldyBxdWV1ZSwgd2l0aCBtYXggbnVtYmVyIG9mIGl0ZW1zIC0tIHVzZSAwIGZvciBubyBtYXggKi8KK2ludCBmZF9maWZvX25ldyAoIHN0cnVjdCBmaWZvICoqIHF1ZXVlLCBpbnQgbWF4ICkKK3sKKwlzdHJ1Y3QgZmlmbyAqIG5ldzsKKwkKKwlUUkFDRV9FTlRSWSggIiVwIiwgcXVldWUgKTsKKwkKKwlDSEVDS19QQVJBTVMoIHF1ZXVlICk7CisJCisJLyogQ3JlYXRlIGEgbmV3IG9iamVjdCAqLworCUNIRUNLX01BTExPQyggbmV3ID0gbWFsbG9jIChzaXplb2YgKHN0cnVjdCBmaWZvKSApICApOworCQorCS8qIEluaXRpYWxpemUgdGhlIGNvbnRlbnQgKi8KKwltZW1zZXQobmV3LCAwLCBzaXplb2Yoc3RydWN0IGZpZm8pKTsKKwkKKwluZXctPmV5ZWMgPSBGSUZPX0VZRUM7CisJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfbXV0ZXhfaW5pdCgmbmV3LT5tdHgsIE5VTEwpICk7CisJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfY29uZF9pbml0KCZuZXctPmNvbmRfcHVsbCwgTlVMTCkgKTsKKwlDSEVDS19QT1NJWCggcHRocmVhZF9jb25kX2luaXQoJm5ldy0+Y29uZF9wdXNoLCBOVUxMKSApOworCW5ldy0+bWF4ID0gbWF4OworCQorCWZkX2xpc3RfaW5pdCgmbmV3LT5saXN0LCBOVUxMKTsKKwkKKwkvKiBXZSdyZSBkb25lICovCisJKnF1ZXVlID0gbmV3OworCXJldHVybiAwOworfQorCisvKiBEdW1wIHRoZSBjb250ZW50IG9mIGEgcXVldWUgKi8KK0RFQ0xBUkVfRkRfRFVNUF9QUk9UT1RZUEUoZmRfZmlmb19kdW1wLCBjaGFyICogbmFtZSwgc3RydWN0IGZpZm8gKiBxdWV1ZSwgZmRfZmlmb19kdW1wX2l0ZW1fY2IgZHVtcF9pdGVtKQoreworCUZEX0RVTVBfSEFORExFX09GRlNFVCgpOworCQorCWlmIChuYW1lKSB7CisJCUNIRUNLX01BTExPQ19ETyggZmRfZHVtcF9leHRlbmQoIEZEX0RVTVBfU1REX1BBUkFNUywgIiclcycoQCVwKTogIiwgbmFtZSwgcXVldWUpLCByZXR1cm4gTlVMTCk7CQorCX0gZWxzZSB7CisJCUNIRUNLX01BTExPQ19ETyggZmRfZHVtcF9leHRlbmQoIEZEX0RVTVBfU1REX1BBUkFNUywgIntmaWZvfShAJXApOiAiLCBxdWV1ZSksIHJldHVybiBOVUxMKTsKKwl9CisJCisJaWYgKCFDSEVDS19GSUZPKCBxdWV1ZSApKSB7CisJCXJldHVybiBmZF9kdW1wX2V4dGVuZChGRF9EVU1QX1NURF9QQVJBTVMsICJJTlZBTElEL05VTEwiKTsKKwl9CisJCisJQ0hFQ0tfUE9TSVhfRE8oICBwdGhyZWFkX211dGV4X2xvY2soICZxdWV1ZS0+bXR4ICksIC8qIGNvbnRpbnVlICovICApOworCUNIRUNLX01BTExPQ19ETyggZmRfZHVtcF9leHRlbmQoIEZEX0RVTVBfU1REX1BBUkFNUywgIml0ZW1zOiVkLCVkLCVkIHRocmVhZHM6JWQsJWQgc3RhdHM6JWxsZC8lbGQuJTA2bGQsJWxkLiUwNmxkLCVsZC4lMDZsZCB0aHJlc2hvbGRzOiVkLCVkLCVkLCVwLCVwLCVwIiwgCisJCQkJCQlxdWV1ZS0+Y291bnQsIHF1ZXVlLT5oaWdoZXN0X2V2ZXIsIHF1ZXVlLT5tYXgsCisJCQkJCQlxdWV1ZS0+dGhycywgcXVldWUtPnRocnNfcHVzaCwKKwkJCQkJCXF1ZXVlLT50b3RhbF9pdGVtcywobG9uZylxdWV1ZS0+dG90YWxfdGltZS50dl9zZWMsKGxvbmcpKHF1ZXVlLT50b3RhbF90aW1lLnR2X25zZWMvMTAwMCksKGxvbmcpcXVldWUtPmJsb2NraW5nX3RpbWUudHZfc2VjLChsb25nKShxdWV1ZS0+YmxvY2tpbmdfdGltZS50dl9uc2VjLzEwMDApLChsb25nKXF1ZXVlLT5sYXN0X3RpbWUudHZfc2VjLChsb25nKShxdWV1ZS0+bGFzdF90aW1lLnR2X25zZWMvMTAwMCksCisJCQkJCQlxdWV1ZS0+aGlnaCwgcXVldWUtPmxvdywgcXVldWUtPmhpZ2hlc3QsIHF1ZXVlLT5oX2NiLCBxdWV1ZS0+bF9jYiwgcXVldWUtPmRhdGEpLCAKKwkJCSBnb3RvIGVycm9yKTsKKwkKKwlpZiAoZHVtcF9pdGVtKSB7CisJCXN0cnVjdCBmZF9saXN0ICogbGk7CisJCWludCBpID0gMDsKKwkJZm9yIChsaSA9IHF1ZXVlLT5saXN0Lm5leHQ7IGxpICE9ICZxdWV1ZS0+bGlzdDsgbGkgPSBsaS0+bmV4dCkgeworCQkJc3RydWN0IGZpZm9faXRlbSAqIGZpID0gKHN0cnVjdCBmaWZvX2l0ZW0gKilsaTsKKwkJCUNIRUNLX01BTExPQ19ETyggZmRfZHVtcF9leHRlbmQoIEZEX0RVTVBfU1REX1BBUkFNUywgIlxuIFsjJWldKEAlcClAJWxkLiUwNmxkOiAiLCAKKwkJCQkJCWkrKywgZmktPml0ZW0ubywgKGxvbmcpZmktPnBvc3RlZF9vbi50dl9zZWMsKGxvbmcpKGZpLT5wb3N0ZWRfb24udHZfbnNlYy8xMDAwKSksIAorCQkJCQkgZ290byBlcnJvcik7CisJCQlDSEVDS19NQUxMT0NfRE8oICgqZHVtcF9pdGVtKShGRF9EVU1QX1NURF9QQVJBTVMsIGZpLT5pdGVtLm8pLCBnb3RvIGVycm9yKTsKKwkJfQorCX0KKwlDSEVDS19QT1NJWF9ETyggIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCAmcXVldWUtPm10eCApLCAvKiBjb250aW51ZSAqLyAgKTsKKwkKKwlyZXR1cm4gKmJ1ZjsKK2Vycm9yOgorCUNIRUNLX1BPU0lYX0RPKCAgcHRocmVhZF9tdXRleF91bmxvY2soICZxdWV1ZS0+bXR4ICksIC8qIGNvbnRpbnVlICovICApOworCXJldHVybiBOVUxMOworfQorCisvKiBEZWxldGUgYSBxdWV1ZS4gSXQgbXVzdCBiZSBlbXB0eS4gKi8gCitpbnQgZmRfZmlmb19kZWwgKCBzdHJ1Y3QgZmlmbyAgKiogcXVldWUgKQoreworCXN0cnVjdCBmaWZvICogcTsKKwlpbnQgbG9vcHMgPSAwOworCQorCVRSQUNFX0VOVFJZKCAiJXAiLCBxdWV1ZSApOworCisJQ0hFQ0tfUEFSQU1TKCBxdWV1ZSAmJiBDSEVDS19GSUZPKCAqcXVldWUgKSApOworCQorCXEgPSAqcXVldWU7CisJCisJQ0hFQ0tfUE9TSVgoICBwdGhyZWFkX211dGV4X2xvY2soICZxLT5tdHggKSAgKTsKKwkKKwlpZiAoKHEtPmNvdW50ICE9IDApIHx8IChxLT5kYXRhICE9IE5VTEwpKSB7CisJCVRSQUNFX0RFQlVHKElORk8sICJUaGUgcXVldWUgY2Fubm90IGJlIGRlc3Ryb3llZCAoJWQsICVwKSIsIHEtPmNvdW50LCBxLT5kYXRhKTsKKwkJQ0hFQ0tfUE9TSVhfRE8oICBwdGhyZWFkX211dGV4X3VubG9jayggJnEtPm10eCApLCAvKiBubyBmYWxsYmFjayAqLyAgKTsKKwkJcmV0dXJuIEVJTlZBTDsKKwl9CisJCisJLyogT2ssIG5vdyBpbnZhbGlkYXRlIHRoZSBxdWV1ZSAqLworCXEtPmV5ZWMgPSAweGRlYWQ7CisJCisJLyogSGF2ZSBhbGwgd2FpdGluZyB0aHJlYWRzIHJldHVybiBhbiBlcnJvciAqLworCXdoaWxlIChxLT50aHJzKSB7CisJCUNIRUNLX1BPU0lYKCAgcHRocmVhZF9tdXRleF91bmxvY2soICZxLT5tdHggKSk7CisJCUNIRUNLX1BPU0lYKCAgcHRocmVhZF9jb25kX3NpZ25hbCgmcS0+Y29uZF9wdWxsKSAgKTsKKwkJdXNsZWVwKDEwMDApOworCQkKKwkJQ0hFQ0tfUE9TSVgoICBwdGhyZWFkX211dGV4X2xvY2soICZxLT5tdHggKSAgKTsKKwkJQVNTRVJUKCArK2xvb3BzIDwgMjAgKTsgLyogZGV0ZWN0IGluZmluaXRlIGxvb3BzICovCisJfQorCQorCS8qIHNhbml0eSBjaGVjayAqLworCUFTU0VSVChGRF9JU19MSVNUX0VNUFRZKCZxLT5saXN0KSk7CisJCisJLyogQW5kIGRlc3Ryb3kgaXQgKi8KKwlDSEVDS19QT1NJWCggIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCAmcS0+bXR4ICkgICk7CisJCisJQ0hFQ0tfUE9TSVhfRE8oICBwdGhyZWFkX2NvbmRfZGVzdHJveSggJnEtPmNvbmRfcHVsbCApLCAgKTsKKwkKKwlDSEVDS19QT1NJWF9ETyggIHB0aHJlYWRfY29uZF9kZXN0cm95KCAmcS0+Y29uZF9wdXNoICksICApOworCQorCUNIRUNLX1BPU0lYX0RPKCAgcHRocmVhZF9tdXRleF9kZXN0cm95KCAmcS0+bXR4ICksICApOworCQorCWZyZWUocSk7CisJKnF1ZXVlID0gTlVMTDsKKwkKKwlyZXR1cm4gMDsKK30KKworLyogTW92ZSB0aGUgY29udGVudCBvZiBvbGQgaW50byBuZXcsIGFuZCB1cGRhdGUgbG9jX3VwZGF0ZSBhdG9taWNhbGx5LiBXZSBsZWF2ZSB0aGUgb2xkIHF1ZXVlIGVtcHR5IGJ1dCB2YWxpZCAqLworaW50IGZkX2ZpZm9fbW92ZSAoIHN0cnVjdCBmaWZvICogb2xkLCBzdHJ1Y3QgZmlmbyAqIG5ldywgc3RydWN0IGZpZm8gKiogbG9jX3VwZGF0ZSApCit7CisJaW50IGxvb3BzID0gMDsKKwkKKwlUUkFDRV9FTlRSWSgiJXAgJXAgJXAiLCBvbGQsIG5ldywgbG9jX3VwZGF0ZSk7CisJQ0hFQ0tfUEFSQU1TKCBDSEVDS19GSUZPKCBvbGQgKSAmJiBDSEVDS19GSUZPKCBuZXcgKSk7CisJCisJQ0hFQ0tfUEFSQU1TKCAhIG9sZC0+ZGF0YSApOworCWlmIChuZXctPmhpZ2gpIHsKKwkJVE9ETygiSW1wbGVtZW50IHN1cHBvcnQgZm9yIHRocmVzaG9sZHMgaW4gZmRfZmlmb19tb3ZlLi4uIik7CisJfQorCQorCS8qIFVwZGF0ZSBsb2NfdXBkYXRlICovCisJaWYgKGxvY191cGRhdGUpCisJCSpsb2NfdXBkYXRlID0gbmV3OworCQorCS8qIExvY2sgdGhlIHF1ZXVlcyAqLworCUNIRUNLX1BPU0lYKCAgcHRocmVhZF9tdXRleF9sb2NrKCAmb2xkLT5tdHggKSAgKTsKKwkKKwlDSEVDS19QQVJBTVNfRE8oICghIG9sZC0+dGhyc19wdXNoKSwgeworCQkJcHRocmVhZF9tdXRleF91bmxvY2soICZvbGQtPm10eCApOworCQkJcmV0dXJuIEVJTlZBTDsKKwkJfSApOworCQorCUNIRUNLX1BPU0lYKCAgcHRocmVhZF9tdXRleF9sb2NrKCAmbmV3LT5tdHggKSAgKTsKKwkKKwkvKiBBbnkgd2FpdGluZyB0aHJlYWQgb24gdGhlIG9sZCBxdWV1ZSByZXR1cm5zIGFuIGVycm9yICovCisJb2xkLT5leWVjID0gMHhkZWFkOworCXdoaWxlIChvbGQtPnRocnMpIHsKKwkJQ0hFQ0tfUE9TSVgoICBwdGhyZWFkX211dGV4X3VubG9jayggJm9sZC0+bXR4ICkpOworCQlDSEVDS19QT1NJWCggIHB0aHJlYWRfY29uZF9zaWduYWwoICZvbGQtPmNvbmRfcHVsbCApICApOworCQl1c2xlZXAoMTAwMCk7CisJCQorCQlDSEVDS19QT1NJWCggIHB0aHJlYWRfbXV0ZXhfbG9jayggJm9sZC0+bXR4ICkgICk7CisJCUFTU0VSVCggbG9vcHMgPCAyMCApOyAvKiBkZXRlY3QgaW5maW5pdGUgbG9vcHMgKi8KKwl9CisJCisJLyogTW92ZSBhbGwgZGF0YSBmcm9tIG9sZCB0byBuZXcgKi8KKwlmZF9saXN0X21vdmVfZW5kKCAmbmV3LT5saXN0LCAmb2xkLT5saXN0ICk7CisJaWYgKG9sZC0+Y291bnQgJiYgKCFuZXctPmNvdW50KSkgeworCQlDSEVDS19QT1NJWCggIHB0aHJlYWRfY29uZF9zaWduYWwoJm5ldy0+Y29uZF9wdWxsKSAgKTsKKwl9CisJbmV3LT5jb3VudCArPSBvbGQtPmNvdW50OworCQorCS8qIFJlc2V0IG9sZCAqLworCW9sZC0+Y291bnQgPSAwOworCW9sZC0+ZXllYyA9IEZJRk9fRVlFQzsKKwkKKwkvKiBNZXJnZSB0aGUgc3RhdHMgaW4gdGhlIG5ldyBxdWV1ZSAqLworCW5ldy0+dG90YWxfaXRlbXMgKz0gb2xkLT50b3RhbF9pdGVtczsKKwlvbGQtPnRvdGFsX2l0ZW1zID0gMDsKKwkKKwluZXctPnRvdGFsX3RpbWUudHZfbnNlYyArPSBvbGQtPnRvdGFsX3RpbWUudHZfbnNlYzsKKwluZXctPnRvdGFsX3RpbWUudHZfc2VjICs9IG9sZC0+dG90YWxfdGltZS50dl9zZWMgKyAobmV3LT50b3RhbF90aW1lLnR2X25zZWMgLyAxMDAwMDAwMDAwKTsKKwluZXctPnRvdGFsX3RpbWUudHZfbnNlYyAlPSAxMDAwMDAwMDAwOworCW9sZC0+dG90YWxfdGltZS50dl9uc2VjID0gMDsKKwlvbGQtPnRvdGFsX3RpbWUudHZfc2VjID0gMDsKKwkKKwluZXctPmJsb2NraW5nX3RpbWUudHZfbnNlYyArPSBvbGQtPmJsb2NraW5nX3RpbWUudHZfbnNlYzsKKwluZXctPmJsb2NraW5nX3RpbWUudHZfc2VjICs9IG9sZC0+YmxvY2tpbmdfdGltZS50dl9zZWMgKyAobmV3LT5ibG9ja2luZ190aW1lLnR2X25zZWMgLyAxMDAwMDAwMDAwKTsKKwluZXctPmJsb2NraW5nX3RpbWUudHZfbnNlYyAlPSAxMDAwMDAwMDAwOworCW9sZC0+YmxvY2tpbmdfdGltZS50dl9uc2VjID0gMDsKKwlvbGQtPmJsb2NraW5nX3RpbWUudHZfc2VjID0gMDsKKwkKKwkvKiBVbmxvY2ssIHdlJ3JlIGRvbmUgKi8KKwlDSEVDS19QT1NJWCggIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCAmbmV3LT5tdHggKSAgKTsKKwlDSEVDS19QT1NJWCggIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCAmb2xkLT5tdHggKSAgKTsKKwkKKwlyZXR1cm4gMDsKK30KKworLyogR2V0IHRoZSBpbmZvcm1hdGlvbiBvbiB0aGUgcXVldWUgKi8KK2ludCBmZF9maWZvX2dldHN0YXRzKCBzdHJ1Y3QgZmlmbyAqIHF1ZXVlLCBpbnQgKiBjdXJyZW50X2NvdW50LCBpbnQgKiBsaW1pdF9jb3VudCwgaW50ICogaGlnaGVzdF9jb3VudCwgbG9uZyBsb25nICogdG90YWxfY291bnQsIAorCQkJCSAgICAgICAgICAgc3RydWN0IHRpbWVzcGVjICogdG90YWwsIHN0cnVjdCB0aW1lc3BlYyAqIGJsb2NraW5nLCBzdHJ1Y3QgdGltZXNwZWMgKiBsYXN0KQoreworCVRSQUNFX0VOVFJZKCAiJXAgJXAgJXAgJXAgJXAgJXAgJXAgJXAiLCBxdWV1ZSwgY3VycmVudF9jb3VudCwgbGltaXRfY291bnQsIGhpZ2hlc3RfY291bnQsIHRvdGFsX2NvdW50LCB0b3RhbCwgYmxvY2tpbmcsIGxhc3QpOworCQorCS8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisJQ0hFQ0tfUEFSQU1TKCBDSEVDS19GSUZPKCBxdWV1ZSApICk7CisJCisJLyogbG9jayB0aGUgcXVldWUgKi8KKwlDSEVDS19QT1NJWCggIHB0aHJlYWRfbXV0ZXhfbG9jayggJnF1ZXVlLT5tdHggKSAgKTsKKwkKKwlpZiAoY3VycmVudF9jb3VudCkKKwkJKmN1cnJlbnRfY291bnQgPSBxdWV1ZS0+Y291bnQ7CisJCisJaWYgKGxpbWl0X2NvdW50KQorCQkqbGltaXRfY291bnQgPSBxdWV1ZS0+bWF4OworCQorCWlmIChoaWdoZXN0X2NvdW50KQorCQkqaGlnaGVzdF9jb3VudCA9IHF1ZXVlLT5oaWdoZXN0X2V2ZXI7CisJCisJaWYgKHRvdGFsX2NvdW50KQorCQkqdG90YWxfY291bnQgPSBxdWV1ZS0+dG90YWxfaXRlbXM7CisJCisJaWYgKHRvdGFsKQorCQltZW1jcHkodG90YWwsICZxdWV1ZS0+dG90YWxfdGltZSwgc2l6ZW9mKHN0cnVjdCB0aW1lc3BlYykpOworCQorCWlmIChibG9ja2luZykKKwkJbWVtY3B5KGJsb2NraW5nLCAmcXVldWUtPmJsb2NraW5nX3RpbWUsIHNpemVvZihzdHJ1Y3QgdGltZXNwZWMpKTsKKwkKKwlpZiAobGFzdCkKKwkJbWVtY3B5KGxhc3QsICZxdWV1ZS0+bGFzdF90aW1lLCBzaXplb2Yoc3RydWN0IHRpbWVzcGVjKSk7CisJCisJLyogVW5sb2NrICovCisJQ0hFQ0tfUE9TSVgoICBwdGhyZWFkX211dGV4X3VubG9jayggJnF1ZXVlLT5tdHggKSAgKTsKKwkKKwkvKiBEb25lICovCisJcmV0dXJuIDA7Cit9CisKKworLyogYWx0ZXJuYXRlIHZlcnNpb24gd2l0aCBubyBlcnJvciBjaGVja2luZyAqLworaW50IGZkX2ZpZm9fbGVuZ3RoICggc3RydWN0IGZpZm8gKiBxdWV1ZSApCit7CisJaWYgKCAhQ0hFQ0tfRklGTyggcXVldWUgKSApCisJCXJldHVybiAwOworCQorCXJldHVybiBxdWV1ZS0+Y291bnQ7IC8qIExldCdzIGhvcGUgaXQncyByZWFkIGF0b21pY2FsbHksIHNpbmNlIHdlIGFyZSBub3QgbG9ja2luZy4uLiAqLworfQorCisvKiBTZXQgdGhlIHRocmVzaG9sZHMgb2YgdGhlIHF1ZXVlICovCitpbnQgZmRfZmlmb19zZXR0aHJoZCAoIHN0cnVjdCBmaWZvICogcXVldWUsIHZvaWQgKiBkYXRhLCB1aW50MTZfdCBoaWdoLCB2b2lkICgqaF9jYikoc3RydWN0IGZpZm8gKiwgdm9pZCAqKiksIHVpbnQxNl90IGxvdywgdm9pZCAoKmxfY2IpKHN0cnVjdCBmaWZvICosIHZvaWQgKiopICkKK3sKKwlUUkFDRV9FTlRSWSggIiVwICVwICVodSAlcCAlaHUgJXAiLCBxdWV1ZSwgZGF0YSwgaGlnaCwgaF9jYiwgbG93LCBsX2NiICk7CisJCisJLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKwlDSEVDS19QQVJBTVMoIENIRUNLX0ZJRk8oIHF1ZXVlICkgJiYgKGhpZ2ggPiBsb3cpICYmIChxdWV1ZS0+ZGF0YSA9PSBOVUxMKSApOworCQorCS8qIGxvY2sgdGhlIHF1ZXVlICovCisJQ0hFQ0tfUE9TSVgoICBwdGhyZWFkX211dGV4X2xvY2soICZxdWV1ZS0+bXR4ICkgICk7CisJCisJLyogU2F2ZSB0aGUgdmFsdWVzICovCisJcXVldWUtPmhpZ2ggPSBoaWdoOworCXF1ZXVlLT5sb3cgID0gbG93OworCXF1ZXVlLT5kYXRhID0gZGF0YTsKKwlxdWV1ZS0+aF9jYiA9IGhfY2I7CisJcXVldWUtPmxfY2IgPSBsX2NiOworCQorCS8qIFVubG9jayAqLworCUNIRUNLX1BPU0lYKCAgcHRocmVhZF9tdXRleF91bmxvY2soICZxdWV1ZS0+bXR4ICkgICk7CisJCisJLyogRG9uZSAqLworCXJldHVybiAwOworfQorCisKKy8qIFRoaXMgaGFuZGxlciBpcyBjYWxsZWQgd2hlbiBhIHRocmVhZCBpcyBibG9ja2VkIG9uIGEgcXVldWUsIGFuZCBjYW5jZWxsZWQgKi8KK3N0YXRpYyB2b2lkIGZpZm9fY2xlYW51cF9wdXNoKHZvaWQgKiBxdWV1ZSkKK3sKKwlzdHJ1Y3QgZmlmbyAqIHEgPSAoc3RydWN0IGZpZm8gKilxdWV1ZTsKKwlUUkFDRV9FTlRSWSggIiVwIiwgcXVldWUgKTsKKwkKKwkvKiBUaGUgdGhyZWFkIGhhcyBiZWVuIGNhbmNlbGxlZCwgdGhlcmVmb3JlIGl0IGRvZXMgbm90IHdhaXQgb24gdGhlIHF1ZXVlIGFueW1vcmUgKi8KKwlxLT50aHJzX3B1c2gtLTsKKwkKKwkvKiBOb3cgdW5sb2NrIHRoZSBxdWV1ZSwgYW5kIHdlJ3JlIGRvbmUgKi8KKwlDSEVDS19QT1NJWF9ETyggIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCAmcS0+bXR4ICksICAvKiBub3RoaW5nICovICApOworCQorCS8qIEVuZCBvZiBjbGVhbnVwIGhhbmRsZXIgKi8KKwlyZXR1cm47Cit9CisKKworLyogUG9zdCBhIG5ldyBpdGVtIGluIHRoZSBxdWV1ZSAqLworaW50IGZkX2ZpZm9fcG9zdF9pbnRlcm5hbCAoIHN0cnVjdCBmaWZvICogcXVldWUsIHZvaWQgKiogaXRlbSwgaW50IHNraXBfbWF4ICkKK3sKKwlzdHJ1Y3QgZmlmb19pdGVtICogbmV3OworCWludCBjYWxsX2NiID0gMDsKKwlzdHJ1Y3QgdGltZXNwZWMgcG9zdGVkX29uLCBxdWV1ZWRfb247CisJCisJLyogR2V0IHRoZSB0aW1pbmcgb2YgdGhpcyBjYWxsICovCisJQ0hFQ0tfU1lTKCAgY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJnBvc3RlZF9vbikgICk7CisJCisJLyogbG9jayB0aGUgcXVldWUgKi8KKwlDSEVDS19QT1NJWCggIHB0aHJlYWRfbXV0ZXhfbG9jayggJnF1ZXVlLT5tdHggKSAgKTsKKwkKKwlpZiAoKCFza2lwX21heCkgJiYgKHF1ZXVlLT5tYXgpKSB7CisJCXdoaWxlIChxdWV1ZS0+Y291bnQgPj0gcXVldWUtPm1heCkgeworCQkJaW50IHJldCA9IDA7CisJCQkKKwkJCS8qIFdlIGhhdmUgdG8gd2FpdCBmb3IgYW4gaXRlbSB0byBiZSBwdWxsZWQgKi8KKwkJCXF1ZXVlLT50aHJzX3B1c2grKyA7CisJCQlwdGhyZWFkX2NsZWFudXBfcHVzaCggZmlmb19jbGVhbnVwX3B1c2gsIHF1ZXVlKTsKKwkJCXJldCA9IHB0aHJlYWRfY29uZF93YWl0KCAmcXVldWUtPmNvbmRfcHVzaCwgJnF1ZXVlLT5tdHggKTsKKwkJCXB0aHJlYWRfY2xlYW51cF9wb3AoMCk7CisJCQlxdWV1ZS0+dGhyc19wdXNoLS0gOworCQkJCisJCQlBU1NFUlQoIHJldCA9PSAwICk7CisJCX0KKwl9CisJCisJLyogQ3JlYXRlIGEgbmV3IGxpc3QgaXRlbSAqLworCUNIRUNLX01BTExPQ19ETyggIG5ldyA9IG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgZmlmb19pdGVtKSkgLCB7CisJCQlwdGhyZWFkX211dGV4X3VubG9jayggJnF1ZXVlLT5tdHggKTsKKwkJCXJldHVybiBFTk9NRU07CisJCX0gKTsKKwkKKwlmZF9saXN0X2luaXQoJm5ldy0+aXRlbSwgKml0ZW0pOworCSppdGVtID0gTlVMTDsKKwkKKwkvKiBBZGQgdGhlIG5ldyBpdGVtIGF0IHRoZSBlbmQgKi8KKwlmZF9saXN0X2luc2VydF9iZWZvcmUoICZxdWV1ZS0+bGlzdCwgJm5ldy0+aXRlbSk7CisJcXVldWUtPmNvdW50Kys7CisJaWYgKHF1ZXVlLT5oaWdoZXN0X2V2ZXIgPCBxdWV1ZS0+Y291bnQpCisJCXF1ZXVlLT5oaWdoZXN0X2V2ZXIgPSBxdWV1ZS0+Y291bnQ7CisJaWYgKHF1ZXVlLT5oaWdoICYmICgocXVldWUtPmNvdW50ICUgcXVldWUtPmhpZ2gpID09IDApKSB7CisJCWNhbGxfY2IgPSAxOworCQlxdWV1ZS0+aGlnaGVzdCA9IHF1ZXVlLT5jb3VudDsKKwl9CisJCisJLyogc3RvcmUgdGltaW5nICovCisJbWVtY3B5KCZuZXctPnBvc3RlZF9vbiwgJnBvc3RlZF9vbiwgc2l6ZW9mKHN0cnVjdCB0aW1lc3BlYykpOworCQorCS8qIHVwZGF0ZSBxdWV1ZSB0aW1pbmcgaW5mbyAiYmxvY2tpbmcgdGltZSIgKi8KKwl7CisJCWxvbmcgbG9uZyBibG9ja2VkX25zOworCQlDSEVDS19TWVMoICBjbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmcXVldWVkX29uKSAgKTsKKwkJYmxvY2tlZF9ucyA9IChxdWV1ZWRfb24udHZfc2VjIC0gcG9zdGVkX29uLnR2X3NlYykgKiAxMDAwMDAwMDAwOworCQlibG9ja2VkX25zICs9IChxdWV1ZWRfb24udHZfbnNlYyAtIHBvc3RlZF9vbi50dl9uc2VjKTsKKwkJYmxvY2tlZF9ucyArPSBxdWV1ZS0+YmxvY2tpbmdfdGltZS50dl9uc2VjOworCQlxdWV1ZS0+YmxvY2tpbmdfdGltZS50dl9zZWMgKz0gYmxvY2tlZF9ucyAvIDEwMDAwMDAwMDA7CisJCXF1ZXVlLT5ibG9ja2luZ190aW1lLnR2X25zZWMgPSBibG9ja2VkX25zICUgMTAwMDAwMDAwMDsKKwl9CisJCisJLyogU2lnbmFsIGlmIHRocmVhZHMgYXJlIGFzbGVlcCAqLworCWlmIChxdWV1ZS0+dGhycyA+IDApIHsKKwkJQ0hFQ0tfUE9TSVgoICBwdGhyZWFkX2NvbmRfc2lnbmFsKCZxdWV1ZS0+Y29uZF9wdWxsKSAgKTsKKwl9CisJaWYgKHF1ZXVlLT50aHJzX3B1c2ggPiAwKSB7CisJCS8qIGNhc2NhZGUgKi8KKwkJQ0hFQ0tfUE9TSVgoICBwdGhyZWFkX2NvbmRfc2lnbmFsKCZxdWV1ZS0+Y29uZF9wdXNoKSAgKTsKKwl9CisJCisJLyogVW5sb2NrICovCisJQ0hFQ0tfUE9TSVgoICBwdGhyZWFkX211dGV4X3VubG9jayggJnF1ZXVlLT5tdHggKSAgKTsKKwkKKwkvKiBDYWxsIGhpZ2gtd2F0ZXJtYXJrIGNiIGFzIG5lZWRlZCAqLworCWlmIChjYWxsX2NiICYmIHF1ZXVlLT5oX2NiKQorCQkoKnF1ZXVlLT5oX2NiKShxdWV1ZSwgJnF1ZXVlLT5kYXRhKTsKKwkKKwkvKiBEb25lICovCisJcmV0dXJuIDA7Cit9CisKKy8qIFBvc3QgYSBuZXcgaXRlbSBpbiB0aGUgcXVldWUgKi8KK2ludCBmZF9maWZvX3Bvc3RfaW50ICggc3RydWN0IGZpZm8gKiBxdWV1ZSwgdm9pZCAqKiBpdGVtICkKK3sKKwlUUkFDRV9FTlRSWSggIiVwICVwIiwgcXVldWUsIGl0ZW0gKTsKKwkKKwkvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworCUNIRUNLX1BBUkFNUyggQ0hFQ0tfRklGTyggcXVldWUgKSAmJiBpdGVtICYmICppdGVtICk7CisJCisJcmV0dXJuIGZkX2ZpZm9fcG9zdF9pbnRlcm5hbCAoIHF1ZXVlLGl0ZW0sIDAgKTsKKwkKK30KKworLyogUG9zdCBhIG5ldyBpdGVtIGluIHRoZSBxdWV1ZSwgbm90IGJsb2NraW5nICovCitpbnQgZmRfZmlmb19wb3N0X25vYmxvY2sgKCBzdHJ1Y3QgZmlmbyAqIHF1ZXVlLCB2b2lkICoqIGl0ZW0gKQoreworCVRSQUNFX0VOVFJZKCAiJXAgJXAiLCBxdWV1ZSwgaXRlbSApOworCQorCS8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisJQ0hFQ0tfUEFSQU1TKCBDSEVDS19GSUZPKCBxdWV1ZSApICYmIGl0ZW0gJiYgKml0ZW0gKTsKKwkKKwlyZXR1cm4gZmRfZmlmb19wb3N0X2ludGVybmFsICggcXVldWUsaXRlbSwgMSApOworCQorfQorCisvKiBQb3AgdGhlIGZpcnN0IGl0ZW0gZnJvbSB0aGUgcXVldWUgKi8KK3N0YXRpYyB2b2lkICogbXFfcG9wKHN0cnVjdCBmaWZvICogcXVldWUpCit7CisJdm9pZCAqIHJldCA9IE5VTEw7CisJc3RydWN0IGZpZm9faXRlbSAqIGZpOworCXN0cnVjdCB0aW1lc3BlYyBub3c7CisJCisJQVNTRVJUKCAhIEZEX0lTX0xJU1RfRU1QVFkoJnF1ZXVlLT5saXN0KSApOworCQorCWZpID0gKHN0cnVjdCBmaWZvX2l0ZW0gKikocXVldWUtPmxpc3QubmV4dCk7CisJcmV0ID0gZmktPml0ZW0ubzsKKwlmZF9saXN0X3VubGluaygmZmktPml0ZW0pOworCXF1ZXVlLT5jb3VudC0tOworCXF1ZXVlLT50b3RhbF9pdGVtcysrOworCQorCS8qIFVwZGF0ZSB0aGUgdGltaW5ncyAqLworCUNIRUNLX1NZU19ETyggIGNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZub3cpLCBnb3RvIHNraXBfdGltaW5nICApOworCXsKKwkJbG9uZyBsb25nIGVsYXBzZWQgPSAobm93LnR2X3NlYyAtIGZpLT5wb3N0ZWRfb24udHZfc2VjKSAqIDEwMDAwMDAwMDA7CisJCWVsYXBzZWQgKz0gbm93LnR2X25zZWMgLSBmaS0+cG9zdGVkX29uLnR2X25zZWM7CisJCQorCQlxdWV1ZS0+bGFzdF90aW1lLnR2X3NlYyA9IGVsYXBzZWQgLyAxMDAwMDAwMDAwOworCQlxdWV1ZS0+bGFzdF90aW1lLnR2X25zZWMgPSBlbGFwc2VkICUgMTAwMDAwMDAwMDsKKwkJCisJCWVsYXBzZWQgKz0gcXVldWUtPnRvdGFsX3RpbWUudHZfbnNlYzsKKwkJcXVldWUtPnRvdGFsX3RpbWUudHZfc2VjICs9IGVsYXBzZWQgLyAxMDAwMDAwMDAwOworCQlxdWV1ZS0+dG90YWxfdGltZS50dl9uc2VjID0gZWxhcHNlZCAlIDEwMDAwMDAwMDA7CisJfQorc2tpcF90aW1pbmc6CQorCWZyZWUoZmkpOworCQorCWlmIChxdWV1ZS0+dGhyc19wdXNoKSB7CisJCUNIRUNLX1BPU0lYX0RPKCBwdGhyZWFkX2NvbmRfc2lnbmFsKCAmcXVldWUtPmNvbmRfcHVzaCApLCApOworCX0KKwkKKwlyZXR1cm4gcmV0OworfQorCisvKiBDaGVjayBpZiB0aGUgbG93IHdhdGVybWFyayBjYWxsYmFjayBtdXN0IGJlIGNhbGxlZC4gKi8KK3N0YXRpYyBfX2lubGluZV9fIGludCB0ZXN0X2xfY2Ioc3RydWN0IGZpZm8gKiBxdWV1ZSkKK3sKKwlpZiAoKHF1ZXVlLT5oaWdoID09IDApIHx8IChxdWV1ZS0+bG93ID09IDApIHx8IChxdWV1ZS0+bF9jYiA9PSAwKSkKKwkJcmV0dXJuIDA7CisJCisJaWYgKCgocXVldWUtPmNvdW50ICUgcXVldWUtPmhpZ2gpID09IHF1ZXVlLT5sb3cpICYmIChxdWV1ZS0+aGlnaGVzdCA+IHF1ZXVlLT5jb3VudCkpIHsKKwkJcXVldWUtPmhpZ2hlc3QgLT0gcXVldWUtPmhpZ2g7CisJCXJldHVybiAxOworCX0KKwkKKwlyZXR1cm4gMDsKK30KKworLyogVHJ5IHBvcGluZyBhbiBpdGVtICovCitpbnQgZmRfZmlmb190cnlnZXRfaW50ICggc3RydWN0IGZpZm8gKiBxdWV1ZSwgdm9pZCAqKiBpdGVtICkKK3sKKwlpbnQgd291bGRibG9jayA9IDA7CisJaW50IGNhbGxfY2IgPSAwOworCQorCVRSQUNFX0VOVFJZKCAiJXAgJXAiLCBxdWV1ZSwgaXRlbSApOworCQorCS8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisJQ0hFQ0tfUEFSQU1TKCBDSEVDS19GSUZPKCBxdWV1ZSApICYmIGl0ZW0gKTsKKwkKKwkvKiBsb2NrIHRoZSBxdWV1ZSAqLworCUNIRUNLX1BPU0lYKCAgcHRocmVhZF9tdXRleF9sb2NrKCAmcXVldWUtPm10eCApICApOworCQorCS8qIENoZWNrIHF1ZXVlIHN0YXR1cyAqLworCWlmIChxdWV1ZS0+Y291bnQgPiAwKSB7Citnb3RfaXRlbToKKwkJLyogVGhlcmUgYXJlIGVsZW1lbnRzIGluIHRoZSBxdWV1ZSwgc28gcGljayB0aGUgZmlyc3Qgb25lICovCisJCSppdGVtID0gbXFfcG9wKHF1ZXVlKTsKKwkJY2FsbF9jYiA9IHRlc3RfbF9jYihxdWV1ZSk7CisJfSBlbHNlIHsKKwkJaWYgKHF1ZXVlLT50aHJzX3B1c2ggPiAwKSB7CisJCQkvKiBBIHRocmVhZCBpcyB0cnlpbmcgdG8gcHVzaCBzb21ldGhpbmcsIGxldCdzIGdpdmUgaXQgYSBjaGFuY2UgKi8KKwkJCUNIRUNLX1BPU0lYKCAgcHRocmVhZF9tdXRleF91bmxvY2soICZxdWV1ZS0+bXR4ICkgICk7CisJCQlDSEVDS19QT1NJWCggIHB0aHJlYWRfY29uZF9zaWduYWwoICZxdWV1ZS0+Y29uZF9wdXNoICkgICk7CisJCQl1c2xlZXAoMTAwMCk7CisJCQlDSEVDS19QT1NJWCggIHB0aHJlYWRfbXV0ZXhfbG9jayggJnF1ZXVlLT5tdHggKSAgKTsKKwkJCWlmIChxdWV1ZS0+Y291bnQgPiAwKQorCQkJCWdvdG8gZ290X2l0ZW07CisJCX0KKwkJCisJCXdvdWxkYmxvY2sgPSAxOworCQkqaXRlbSA9IE5VTEw7CisJfQorCQkKKwkvKiBVbmxvY2sgKi8KKwlDSEVDS19QT1NJWCggIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCAmcXVldWUtPm10eCApICApOworCQorCS8qIENhbGwgbG93IHdhdGVybWFyayBjYWxsYmFjayBhcyBuZWVkZWQgKi8KKwlpZiAoY2FsbF9jYikKKwkJKCpxdWV1ZS0+bF9jYikocXVldWUsICZxdWV1ZS0+ZGF0YSk7CisJCisJLyogRG9uZSAqLworCXJldHVybiB3b3VsZGJsb2NrID8gRVdPVUxEQkxPQ0sgOiAwOworfQorCisvKiBUaGlzIGhhbmRsZXIgaXMgY2FsbGVkIHdoZW4gYSB0aHJlYWQgaXMgYmxvY2tlZCBvbiBhIHF1ZXVlLCBhbmQgY2FuY2VsbGVkICovCitzdGF0aWMgdm9pZCBmaWZvX2NsZWFudXAodm9pZCAqIHF1ZXVlKQoreworCXN0cnVjdCBmaWZvICogcSA9IChzdHJ1Y3QgZmlmbyAqKXF1ZXVlOworCVRSQUNFX0VOVFJZKCAiJXAiLCBxdWV1ZSApOworCQorCS8qIFRoZSB0aHJlYWQgaGFzIGJlZW4gY2FuY2VsbGVkLCB0aGVyZWZvcmUgaXQgZG9lcyBub3Qgd2FpdCBvbiB0aGUgcXVldWUgYW55bW9yZSAqLworCXEtPnRocnMtLTsKKwkKKwkvKiBOb3cgdW5sb2NrIHRoZSBxdWV1ZSwgYW5kIHdlJ3JlIGRvbmUgKi8KKwlDSEVDS19QT1NJWF9ETyggIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCAmcS0+bXR4ICksICAvKiBub3RoaW5nICovICApOworCQorCS8qIEVuZCBvZiBjbGVhbnVwIGhhbmRsZXIgKi8KKwlyZXR1cm47Cit9CisKKy8qIFRoZSBpbnRlcm5hbCBmdW5jdGlvbiBmb3IgZmRfZmlmb190aW1lZGdldCBhbmQgZmRfZmlmb19nZXQgKi8KK3N0YXRpYyBpbnQgZmlmb190Z2V0ICggc3RydWN0IGZpZm8gKiBxdWV1ZSwgdm9pZCAqKiBpdGVtLCBpbnQgaXN0aW1lZCwgY29uc3Qgc3RydWN0IHRpbWVzcGVjICphYnN0aW1lKQoreworCWludCBjYWxsX2NiID0gMDsKKwlpbnQgcmV0ID0gMDsKKwkKKwkvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworCUNIRUNLX1BBUkFNUyggQ0hFQ0tfRklGTyggcXVldWUgKSAmJiBpdGVtICYmIChhYnN0aW1lIHx8ICFpc3RpbWVkKSApOworCQorCS8qIEluaXRpYWxpemUgdGhlIHJldHVybiB2YWx1ZSAqLworCSppdGVtID0gTlVMTDsKKwkKKwkvKiBsb2NrIHRoZSBxdWV1ZSAqLworCUNIRUNLX1BPU0lYKCAgcHRocmVhZF9tdXRleF9sb2NrKCAmcXVldWUtPm10eCApICApOworCQorYXdha2VuOgorCS8qIENoZWNrIHF1ZXVlIHN0YXR1cyAqLworCWlmICghQ0hFQ0tfRklGTyggcXVldWUgKSkgeworCQkvKiBUaGUgcXVldWUgaXMgYmVpbmcgZGVzdHJveWVkICovCisJCUNIRUNLX1BPU0lYKCAgcHRocmVhZF9tdXRleF91bmxvY2soICZxdWV1ZS0+bXR4ICkgICk7CisJCVRSQUNFX0RFQlVHKEZVTEwsICJUaGUgcXVldWUgaXMgYmVpbmcgZGVzdHJveWVkIC0+IEVQSVBFIik7CisJCXJldHVybiBFUElQRTsKKwl9CisJCisJaWYgKHF1ZXVlLT5jb3VudCA+IDApIHsKKwkJLyogVGhlcmUgYXJlIGl0ZW1zIGluIHRoZSBxdWV1ZSwgc28gcGljayB0aGUgZmlyc3Qgb25lICovCisJCSppdGVtID0gbXFfcG9wKHF1ZXVlKTsKKwkJY2FsbF9jYiA9IHRlc3RfbF9jYihxdWV1ZSk7CisJfSBlbHNlIHsKKwkJLyogV2UgaGF2ZSB0byB3YWl0IGZvciBhIG5ldyBpdGVtICovCisJCXF1ZXVlLT50aHJzKysgOworCQlwdGhyZWFkX2NsZWFudXBfcHVzaCggZmlmb19jbGVhbnVwLCBxdWV1ZSk7CisJCWlmIChpc3RpbWVkKSB7CisJCQlyZXQgPSBwdGhyZWFkX2NvbmRfdGltZWR3YWl0KCAmcXVldWUtPmNvbmRfcHVsbCwgJnF1ZXVlLT5tdHgsIGFic3RpbWUgKTsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IHB0aHJlYWRfY29uZF93YWl0KCAmcXVldWUtPmNvbmRfcHVsbCwgJnF1ZXVlLT5tdHggKTsKKwkJfQorCQlwdGhyZWFkX2NsZWFudXBfcG9wKDApOworCQlxdWV1ZS0+dGhycy0tIDsKKwkJaWYgKHJldCA9PSAwKQorCQkJZ290byBhd2FrZW47ICAvKiB0ZXN0IGZvciBzcHVyaW91cyB3YWtlLXVwcyAqLworCQkKKwkJLyogb3RoZXJ3aXNlIChFVElNRURPVVQgLyBvdGhlciBlcnJvcikganVzdCBjb250aW51ZSAqLworCX0KKwkKKwkvKiBVbmxvY2sgKi8KKwlDSEVDS19QT1NJWCggIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCAmcXVldWUtPm10eCApICApOworCQorCS8qIENhbGwgbG93IHdhdGVybWFyayBjYWxsYmFjayBhcyBuZWVkZWQgKi8KKwlpZiAoY2FsbF9jYikKKwkJKCpxdWV1ZS0+bF9jYikocXVldWUsICZxdWV1ZS0+ZGF0YSk7CisJCisJLyogRG9uZSAqLworCXJldHVybiByZXQ7Cit9CisKKy8qIEdldCB0aGUgbmV4dCBhdmFpbGFibGUgaXRlbSwgYmxvY2sgdW50aWwgdGhlcmUgaXMgb25lICovCitpbnQgZmRfZmlmb19nZXRfaW50ICggc3RydWN0IGZpZm8gKiBxdWV1ZSwgdm9pZCAqKiBpdGVtICkKK3sKKwlUUkFDRV9FTlRSWSggIiVwICVwIiwgcXVldWUsIGl0ZW0gKTsKKwlyZXR1cm4gZmlmb190Z2V0KHF1ZXVlLCBpdGVtLCAwLCBOVUxMKTsKK30KKworLyogR2V0IHRoZSBuZXh0IGF2YWlsYWJsZSBpdGVtLCBibG9jayB1bnRpbCB0aGVyZSBpcyBvbmUsIG9yIHRoZSB0aW1lb3V0IGV4cGlyZXMgKi8KK2ludCBmZF9maWZvX3RpbWVkZ2V0X2ludCAoIHN0cnVjdCBmaWZvICogcXVldWUsIHZvaWQgKiogaXRlbSwgY29uc3Qgc3RydWN0IHRpbWVzcGVjICphYnN0aW1lICkKK3sKKwlUUkFDRV9FTlRSWSggIiVwICVwICVwIiwgcXVldWUsIGl0ZW0sIGFic3RpbWUgKTsKKwlyZXR1cm4gZmlmb190Z2V0KHF1ZXVlLCBpdGVtLCAxLCBhYnN0aW1lKTsKK30KKworLyogVGVzdCBpZiBkYXRhIGlzIGF2YWlsYWJsZSBpbiB0aGUgcXVldWUsIHdpdGhvdXQgcHVsbGluZyBpdCAqLworaW50IGZkX2ZpZm9fc2VsZWN0ICggc3RydWN0IGZpZm8gKiBxdWV1ZSwgY29uc3Qgc3RydWN0IHRpbWVzcGVjICphYnN0aW1lICkKK3sKKwlpbnQgcmV0ID0gMDsKKwlUUkFDRV9FTlRSWSggIiVwICVwIiwgcXVldWUsIGFic3RpbWUgKTsKKwkKKwlDSEVDS19QQVJBTVNfRE8oIENIRUNLX0ZJRk8oIHF1ZXVlICksIHJldHVybiAtRUlOVkFMICk7CisJCisJLyogbG9jayB0aGUgcXVldWUgKi8KKwlDSEVDS19QT1NJWF9ETyggIHB0aHJlYWRfbXV0ZXhfbG9jayggJnF1ZXVlLT5tdHggKSwgcmV0dXJuIC1fX3JldF9fICApOworCQorYXdha2VuOgkKKwlyZXQgPSAocXVldWUtPmNvdW50ID4gMCApID8gcXVldWUtPmNvdW50IDogMDsKKwlpZiAoKHJldCA9PSAwKSAmJiAoYWJzdGltZSAhPSBOVUxMKSkgeworCQkvKiBXZSBoYXZlIHRvIHdhaXQgZm9yIGEgbmV3IGl0ZW0gKi8KKwkJcXVldWUtPnRocnMrKyA7CisJCXB0aHJlYWRfY2xlYW51cF9wdXNoKCBmaWZvX2NsZWFudXAsIHF1ZXVlKTsKKwkJcmV0ID0gcHRocmVhZF9jb25kX3RpbWVkd2FpdCggJnF1ZXVlLT5jb25kX3B1bGwsICZxdWV1ZS0+bXR4LCBhYnN0aW1lICk7CisJCXB0aHJlYWRfY2xlYW51cF9wb3AoMCk7CisJCXF1ZXVlLT50aHJzLS0gOworCQlpZiAocmV0ID09IDApCisJCQlnb3RvIGF3YWtlbjsgIC8qIHRlc3QgZm9yIHNwdXJpb3VzIHdha2UtdXBzICovCisJCQorCQlpZiAocmV0ID09IEVUSU1FRE9VVCkKKwkJCXJldCA9IDA7CisJCWVsc2UgCisJCQlyZXQgPSAtcmV0OworCX0KKwkKKwkvKiBVbmxvY2sgKi8KKwlDSEVDS19QT1NJWF9ETyggIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCAmcXVldWUtPm10eCApLCByZXR1cm4gLV9fcmV0X18gICk7CisJCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2xpYmZkcHJvdG8vaW5pdC5jIGIvbGliZmRwcm90by9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUxOWNhNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmZkcHJvdG8vaW5pdC5jCkBAIC0wLDAgKzEsNzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDEzLCBXSURFIFByb2plY3QgYW5kIE5JQ1QJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFdJREUgUHJvamVjdCBvciBOSUNUIG5vciB0aGUgCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgV0lERSBQcm9qZWN0IGFuZCAJCQkJCQkgKgorKiAgIE5JQ1QuCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImZkcHJvdG8taW50ZXJuYWwuaCIKKworLyogZnVuY3Rpb24gdG8gZnJlZSB0aGUgdGhyZWFkbmFtZXMgKi8KK3N0YXRpYyB2b2lkIGZyZWVsb2dzdHIodm9pZCAqIHN0cikgeworCWlmIChUUkFDRV9CT09MKEFOTk9ZSU5HKSkgeworCQlpZiAoc3RyKSB7CisJCQlmZF9sb2dfZGVidWcoIihUaHJlYWQgJyVzJyB0ZXJtaW5hdGluZykiLCAoY2hhciAqKXN0cik7CisJCX0KKwl9CisJZnJlZShzdHIpOworfQorCisvKiBJbml0aWFsaXplIGxpYnJhcnkgdmFyaWFibGVzIGFuZCB0aHJlYWRzICovCitpbnQgZmRfbGlicHJvdG9faW5pdCgpCit7CisJaW50IHJldCA9IDA7CisJCisJLyogQ3JlYXRlIHRoZSB0aHJlYWQga2V5IHRoYXQgY29udGFpbnMgdGhyZWFkIG5hbWUgZm9yIGRlYnVnIG1lc3NhZ2VzICovCisJcmV0ID0gcHRocmVhZF9rZXlfY3JlYXRlKCZmZF9sb2dfdGhuYW1lLCBmcmVlbG9nc3RyKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJFcnJvciBpbml0aWFsaXppbmcgdGhlIGxpYmZyZWVEaWFtZXRlciBsaWJyYXJ5OiAlc1xuIiwgc3RyZXJyb3IocmV0KSApOworCQlyZXR1cm4gcmV0OworCX0KKwkKKwkvKiBJbml0aWFsaXplIHRoZSBtb2R1bGVzIHRoYXQgbmVlZCBpdCAqLworCWZkX21zZ19ldGVpZF9pbml0KCk7CisJQ0hFQ0tfRkNUKCBmZF9zZXNzX2luaXQoKSApOworCQorCXJldHVybiAwOworfQorCisvKiBTdG9wIGFsbCB0aHJlYWRzIGNyZWF0ZWQgaW4gdGhlIGxpYnJhcnkgKi8KK3ZvaWQgZmRfbGlicHJvdG9fZmluaSh2b2lkKQoreworCWZkX3Nlc3NfZmluaSgpOworfQpkaWZmIC0tZ2l0IGEvbGliZmRwcm90by9saXN0cy5jIGIvbGliZmRwcm90by9saXN0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYTE0MjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJmZHByb3RvL2xpc3RzLmMKQEAgLTAsMCArMSwxNjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDEzLCBXSURFIFByb2plY3QgYW5kIE5JQ1QJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFdJREUgUHJvamVjdCBvciBOSUNUIG5vciB0aGUgCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgV0lERSBQcm9qZWN0IGFuZCAJCQkJCQkgKgorKiAgIE5JQ1QuCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImZkcHJvdG8taW50ZXJuYWwuaCIKKworLyogSW5pdGlhbGl6ZSBhIGxpc3QgZWxlbWVudCAqLwordm9pZCBmZF9saXN0X2luaXQgKCBzdHJ1Y3QgZmRfbGlzdCAqIGxpc3QsIHZvaWQgKiBvYmogKQoreworCW1lbXNldChsaXN0LCAwLCBzaXplb2Yoc3RydWN0IGZkX2xpc3QpKTsKKwlsaXN0LT5uZXh0ID0gbGlzdDsKKwlsaXN0LT5wcmV2ID0gbGlzdDsKKwlsaXN0LT5oZWFkID0gbGlzdDsKKwlsaXN0LT5vICAgID0gb2JqOworfQorCisjZGVmaW5lIENIRUNLX1NJTkdMRSggbGkgKSB7CQkJXAorCUFTU0VSVCggKChzdHJ1Y3QgZmRfbGlzdCAqKShsaSkpLT5uZXh0ID09IChsaSkgKTsJXAorCUFTU0VSVCggKChzdHJ1Y3QgZmRfbGlzdCAqKShsaSkpLT5wcmV2ID09IChsaSkgKTsJXAorCUFTU0VSVCggKChzdHJ1Y3QgZmRfbGlzdCAqKShsaSkpLT5oZWFkID09IChsaSkgKTsJXAorfQorCisvKiBpbnNlcnQgYWZ0ZXIgYSByZWZlcmVuY2UsIGNoZWNrcyBkb25lICovCitzdGF0aWMgdm9pZCBsaXN0X2luc2VydF9hZnRlciggc3RydWN0IGZkX2xpc3QgKiByZWYsIHN0cnVjdCBmZF9saXN0ICogaXRlbSApCit7CisJaXRlbS0+cHJldiA9IHJlZjsKKwlpdGVtLT5uZXh0ID0gcmVmLT5uZXh0OworCWl0ZW0tPmhlYWQgPSByZWYtPmhlYWQ7CisJcmVmLT5uZXh0LT5wcmV2ID0gaXRlbTsKKwlyZWYtPm5leHQgPSBpdGVtOworfQorCisvKiBpbnNlcnQgYWZ0ZXIgYSByZWZlcmVuY2UgKi8KK3ZvaWQgZmRfbGlzdF9pbnNlcnRfYWZ0ZXIgICggc3RydWN0IGZkX2xpc3QgKiByZWYsIHN0cnVjdCBmZF9saXN0ICogaXRlbSApCit7CisJQVNTRVJUKGl0ZW0gIT0gTlVMTCk7CisJQVNTRVJUKHJlZiAhPSBOVUxMKTsKKwlDSEVDS19TSU5HTEUgKCBpdGVtICk7CisJQVNTRVJUKHJlZi0+aGVhZCAhPSBpdGVtKTsKKwlsaXN0X2luc2VydF9hZnRlcihyZWYsIGl0ZW0pOworfQorCisvKiBNb3ZlIGFsbCBlbGVtZW50cyBvZiBsaXN0IHNlbnRpIGF0IHRoZSBlbmQgb2YgbGlzdCByZWYgKi8KK3ZvaWQgZmRfbGlzdF9tb3ZlX2VuZChzdHJ1Y3QgZmRfbGlzdCAqIHJlZiwgc3RydWN0IGZkX2xpc3QgKiBzZW50aSkKK3sKKwlzdHJ1Y3QgZmRfbGlzdCAqIGxpOworCUFTU0VSVChyZWYtPmhlYWQgPT0gcmVmKTsKKwlBU1NFUlQoc2VudGktPmhlYWQgPT0gc2VudGkpOworCQorCWlmIChzZW50aS0+bmV4dCA9PSBzZW50aSkKKwkJcmV0dXJuOworCQorCWZvciAobGkgPSBzZW50aS0+bmV4dDsgbGkgIT0gc2VudGk7IGxpID0gbGktPm5leHQpCisJCWxpLT5oZWFkID0gcmVmOworCQorCXNlbnRpLT5uZXh0LT5wcmV2ID0gcmVmLT5wcmV2OworCXJlZi0+cHJldi0+bmV4dCAgID0gc2VudGktPm5leHQ7CisJc2VudGktPnByZXYtPm5leHQgPSByZWY7CisJcmVmLT5wcmV2ICAgICAgICAgPSBzZW50aS0+cHJldjsKKwlzZW50aS0+cHJldiA9IHNlbnRpOworCXNlbnRpLT5uZXh0ID0gc2VudGk7Cit9CisKKy8qIGluc2VydCBiZWZvcmUgYSByZWZlcmVuY2UsIGNoZWNrcyBkb25lICovCitzdGF0aWMgdm9pZCBsaXN0X2luc2VydF9iZWZvcmUgKCBzdHJ1Y3QgZmRfbGlzdCAqIHJlZiwgc3RydWN0IGZkX2xpc3QgKiBpdGVtICkKK3sKKwlpdGVtLT5wcmV2ID0gcmVmLT5wcmV2OworCWl0ZW0tPm5leHQgPSByZWY7CisJaXRlbS0+aGVhZCA9IHJlZi0+aGVhZDsKKwlyZWYtPnByZXYtPm5leHQgPSBpdGVtOworCXJlZi0+cHJldiA9IGl0ZW07Cit9CisKKy8qIGluc2VydCBiZWZvcmUgYSByZWZlcmVuY2UgKi8KK3ZvaWQgZmRfbGlzdF9pbnNlcnRfYmVmb3JlICggc3RydWN0IGZkX2xpc3QgKiByZWYsIHN0cnVjdCBmZF9saXN0ICogaXRlbSApCit7CisJQVNTRVJUKGl0ZW0gIT0gTlVMTCk7CisJQVNTRVJUKHJlZiAhPSBOVUxMKTsKKwlDSEVDS19TSU5HTEUgKCBpdGVtICk7CisJQVNTRVJUKHJlZi0+aGVhZCAhPSBpdGVtKTsKKwlsaXN0X2luc2VydF9iZWZvcmUocmVmLCBpdGVtKTsKK30KKworLyogSW5zZXJ0IGFuIGl0ZW0gaW4gYW4gb3JkZXJlZCBsaXN0IC0tIG9yZGVyaW5nIGZ1bmN0aW9uIHByb3ZpZGVkLiBJZiBkdXBsaWNhdGUgb2JqZWN0IGZvdW5kLCBpdCBpcyByZXR1cm5lZCBpbiByZWZfZHVwbGljYXRlICovCitpbnQgZmRfbGlzdF9pbnNlcnRfb3JkZXJlZCggc3RydWN0IGZkX2xpc3QgKiBoZWFkLCBzdHJ1Y3QgZmRfbGlzdCAqIGl0ZW0sIGludCAoKmNtcF9mY3QpKHZvaWQgKiwgdm9pZCAqKSwgdm9pZCAqKiByZWZfZHVwbGljYXRlKQoreworCXN0cnVjdCBmZF9saXN0ICogcHRyID0gaGVhZDsKKwlpbnQgY21wOworCQorCS8qIFNvbWUgZGVidWcgc2FuaXR5IGNoZWNrcyAqLworCUFTU0VSVChoZWFkICE9IE5VTEwpOworCUFTU0VSVChpdGVtICE9IE5VTEwpOworCUFTU0VSVChjbXBfZmN0ICE9IE5VTEwpOworCUFTU0VSVChoZWFkLT5oZWFkID09IGhlYWQpOworCUNIRUNLX1NJTkdMRSAoIGl0ZW0gKTsKKwkKKwkvKiBsb29wIGluIHRoZSBsaXN0ICovCisJd2hpbGUgKHB0ci0+bmV4dCAhPSBoZWFkKQorCXsKKwkJLyogQ29tcGFyZSB0aGUgb2JqZWN0IHRvIGluc2VydCB3aXRoIHRoZSBuZXh0IG9iamVjdCBpbiBsaXN0ICovCisJCWNtcCA9IGNtcF9mY3QoIGl0ZW0tPm8sIHB0ci0+bmV4dC0+byApOworCQlpZiAoIWNtcCkgeworCQkJLyogQW4gZWxlbWVudCB3aXRoIHRoZSBzYW1lIGtleSBhbHJlYWR5IGV4aXN0cyAqLworCQkJaWYgKHJlZl9kdXBsaWNhdGUgIT0gTlVMTCkKKwkJCQkqcmVmX2R1cGxpY2F0ZSA9IHB0ci0+bmV4dC0+bzsKKwkJCXJldHVybiBFRVhJU1Q7CisJCX0KKwkJCisJCWlmIChjbXAgPCAwKQorCQkJYnJlYWs7IC8qIFdlIG11c3QgaW5zZXJ0IHRoZSBlbGVtZW50IGhlcmUgKi8KKwkJCisJCXB0ciA9IHB0ci0+bmV4dDsKKwl9CisJCisJLyogTm93IGluc2VydCB0aGUgZWxlbWVudCBiZXR3ZWVuIHB0ciBhbmQgcHRyLT5uZXh0ICovCisJbGlzdF9pbnNlcnRfYWZ0ZXIoIHB0ciwgaXRlbSApOworCQorCS8qIE9rICovCisJcmV0dXJuIDA7Cit9CisJCisvKiBVbmxpbmsgYW4gb2JqZWN0ICovCit2b2lkIGZkX2xpc3RfdW5saW5rICggc3RydWN0IGZkX2xpc3QgKiBpdGVtICkKK3sKKwlBU1NFUlQoaXRlbSAhPSBOVUxMKTsKKwlpZiAoaXRlbS0+aGVhZCA9PSBpdGVtKQorCQlyZXR1cm47CisJLyogdW5saW5rICovCisJaXRlbS0+bmV4dC0+cHJldiA9IGl0ZW0tPnByZXY7CisJaXRlbS0+cHJldi0+bmV4dCA9IGl0ZW0tPm5leHQ7CisJLyogc2FuaXRpemUgKi8KKwlpdGVtLT5uZXh0ID0gaXRlbTsKKwlpdGVtLT5wcmV2ID0gaXRlbTsKKwlpdGVtLT5oZWFkID0gaXRlbTsKK30KKworCmRpZmYgLS1naXQgYS9saWJmZHByb3RvL2xvZy5jIGIvbGliZmRwcm90by9sb2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmJlMzA3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZmRwcm90by9sb2cuYwpAQCAtMCwwICsxLDMyNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTUsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiZmRwcm90by1pbnRlcm5hbC5oIgorCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKK3B0aHJlYWRfbXV0ZXhfdCBmZF9sb2dfbG9jayA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CitwdGhyZWFkX2tleV90CWZkX2xvZ190aG5hbWU7CitpbnQgZmRfZ19kZWJ1Z19sdmwgPSBGRF9MT0dfTk9USUNFOworCitzdGF0aWMgdm9pZCBmZF9pbnRlcm5hbF9sb2dnZXIoIGludCwgY29uc3QgY2hhciAqLCB2YV9saXN0ICk7CitzdGF0aWMgaW50IHVzZV9jb2xvcnMgPSAwOyAvKiAwOiBub3QgaW5pdCwgMTogeWVzLCAyOiBubyAqLworCisvKiBUaGVzZSBtYXkgYmUgdXNlZCB0byBwYXNzIHNwZWNpZmljIGRlYnVnIHJlcXVlc3RzIHZpYSB0aGUgY29tbWFuZC1saW5lIHBhcmFtZXRlcnMgKi8KK2NoYXIgKiBmZF9kZWJ1Z19vbmVfZnVuY3Rpb24gPSBOVUxMOworY2hhciAqIGZkX2RlYnVnX29uZV9maWxlID0gTlVMTDsKKworLyogVXNlbGVzcyBmdW5jdGlvbiwgb25seSB0byBlYXNlIHNldHRpbmcgdXAgYSBicmVha3BvaW50IGluIGdkYiAoYnJlYWsgZmRfYnJlYWtoZXJlKSAtLSB1c2UgVFJBQ0VfSEVSRSAqLworaW50IGZkX2JyZWFrcyA9IDA7CitpbnQgZmRfYnJlYWtoZXJlKHZvaWQpIHsgcmV0dXJuICsrZmRfYnJlYWtzOyB9CisKKy8qIEFsbG93IHBhc3Npbmcgb2YgdGhlIGxvZyBhbmQgZGVidWcgaW5mb3JtYXRpb24gZnJvbSBiYXNlIHN0YWNrIHRvIGV4dGVuc2lvbnMgKi8KK3ZvaWQgKCpmZF9sb2dnZXIpKCBpbnQgbG9nbGV2ZWwsIGNvbnN0IGNoYXIgKiBmb3JtYXQsIHZhX2xpc3QgYXJncyApID0gZmRfaW50ZXJuYWxfbG9nZ2VyOworCisvKiBSZWdpc3RlciBhbiBleHRlcm5hbCBjYWxsIGJhY2sgZm9yIHRyYWNpbmcgYW5kIGRlYnVnICovCitpbnQgZmRfbG9nX2hhbmRsZXJfcmVnaXN0ZXIoIHZvaWQgKCpsb2dnZXIpKGludCBsb2dsZXZlbCwgY29uc3QgY2hhciAqIGZvcm1hdCwgdmFfbGlzdCBhcmdzKSApCit7CisgICAgICAgIENIRUNLX1BBUkFNUyggbG9nZ2VyICk7CisKKyAgICAgICAgaWYgKCBmZF9sb2dnZXIgIT0gZmRfaW50ZXJuYWxfbG9nZ2VyICkKKyAgICAgICAgeworICAgICAgICAgICAgICAgcmV0dXJuIEVBTFJFQURZOyAvKiBvbmx5IG9uZSByZWdpc3RyYXRpb24gYWxsb3dlZCAqLworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgICAgZmRfbG9nZ2VyID0gbG9nZ2VyOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKy8qIEltcGxlbWVudCBhIHNpbXBsZSByZXNldCBmdW5jdGlvbiBoZXJlICovCitpbnQgZmRfbG9nX2hhbmRsZXJfdW5yZWdpc3RlciAoIHZvaWQgKQoreworICAgICAgICBmZF9sb2dnZXIgPSBmZF9pbnRlcm5hbF9sb2dnZXI7CisgICAgICAgIHJldHVybiAwOyAvKiBTdWNjZXNzZnVsbCBpbiBhbGwgY2FzZXMuICovCit9CisKK3N0YXRpYyB2b2lkIGZkX2NsZWFudXBfbXV0ZXhfc2lsZW50KCB2b2lkICogbXV0ZXggKQoreworCSh2b2lkKXB0aHJlYWRfbXV0ZXhfdW5sb2NrKChwdGhyZWFkX211dGV4X3QgKiltdXRleCk7Cit9CisKKworc3RhdGljIHZvaWQgZmRfaW50ZXJuYWxfbG9nZ2VyKCBpbnQgcHJpbnRsZXZlbCwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFwICkKK3sKKyAgICBjaGFyIGJ1ZlsyNV07CisKKyAgICAvKiBEbyB3ZSBuZWVkIHRvIHRyYWNlIHRoaXMgPyAqLworICAgIGlmIChwcmludGxldmVsIDwgZmRfZ19kZWJ1Z19sdmwpCisgICAgCXJldHVybjsKKworICAgIC8qIGFkZCB0aW1lc3RhbXAgKi8KKyAgICBwcmludGYoIiVzICAiLCBmZF9sb2dfdGltZShOVUxMLCBidWYsIHNpemVvZihidWYpLCAKKyNpZiAoZGVmaW5lZChERUJVRykgJiYgZGVmaW5lZChERUJVR19XSVRIX01FVEEpKQorICAgIAkxLCAxCisjZWxzZSAvKiAoZGVmaW5lZChERUJVRykgJiYgZGVmaW5lZChERUJVR19XSVRIX01FVEEpKSAqLworICAgICAgICAwLCAwCisjZW5kaWYgLyogKGRlZmluZWQoREVCVUcpICYmIGRlZmluZWQoREVCVUdfV0lUSF9NRVRBKSkgKi8KKwkgICAgKSk7CisgICAgLyogVXNlIGNvbG9ycyBvbiBzdGRvdXQgPyAqLworICAgIGlmICghdXNlX2NvbG9ycykgeworCWlmIChpc2F0dHkoU1RET1VUX0ZJTEVOTykpCisJCXVzZV9jb2xvcnMgPSAxOworCWVsc2UKKwkJdXNlX2NvbG9ycyA9IDI7CisgICAgfQorICAgIAorICAgIHN3aXRjaChwcmludGxldmVsKSB7CisJICAgIGNhc2UgRkRfTE9HX0FOTk9ZSU5HOiAgcHJpbnRmKCIlcwlBICAgIiwgKHVzZV9jb2xvcnMgPT0gMSkgPyAiXGVbMDszN20iIDogIiIpOyBicmVhazsKKwkgICAgY2FzZSBGRF9MT0dfREVCVUc6ICAgICBwcmludGYoIiVzIERCRyAgICIsICh1c2VfY29sb3JzID09IDEpID8gIlxlWzA7MzdtIiA6ICIiKTsgYnJlYWs7CisJICAgIGNhc2UgRkRfTE9HX05PVElDRTogICAgcHJpbnRmKCIlc05PVEkgICAiLCAodXNlX2NvbG9ycyA9PSAxKSA/ICJcZVsxOzM3bSIgOiAiIik7IGJyZWFrOworCSAgICBjYXNlIEZEX0xPR19FUlJPUjogICAgIHByaW50ZigiJXNFUlJPUiAgIiwgKHVzZV9jb2xvcnMgPT0gMSkgPyAiXGVbMDszMW0iIDogIiIpOyBicmVhazsKKwkgICAgY2FzZSBGRF9MT0dfRkFUQUw6ICAgICBwcmludGYoIiVzRkFUQUwhICIsICh1c2VfY29sb3JzID09IDEpID8gIlxlWzA7MzFtIiA6ICIiKTsgYnJlYWs7CisJICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgcHJpbnRmKCIlcyA/Pz8gICAiLCAodXNlX2NvbG9ycyA9PSAxKSA/ICJcZVswOzMxbSIgOiAiIik7CisgICAgfQorICAgIHZwcmludGYoZm9ybWF0LCBhcCk7CisgICAgaWYgKHVzZV9jb2xvcnMgPT0gMSkKKwkgICAgIHByaW50ZigiXGVbMDBtIik7CisgICAgcHJpbnRmKCJcbiIpOworICAgIAorICAgIGZmbHVzaChzdGRvdXQpOworfQorCisvKiBMb2cgYSBkZWJ1ZyBtZXNzYWdlICovCit2b2lkIGZkX2xvZyAoIGludCBsb2dsZXZlbCwgY29uc3QgY2hhciAqIGZvcm1hdCwgLi4uICkKK3sKKwl2YV9saXN0IGFwOworCQorCSh2b2lkKXB0aHJlYWRfbXV0ZXhfbG9jaygmZmRfbG9nX2xvY2spOworCQorCXB0aHJlYWRfY2xlYW51cF9wdXNoKGZkX2NsZWFudXBfbXV0ZXhfc2lsZW50LCAmZmRfbG9nX2xvY2spOworCQorCXZhX3N0YXJ0KGFwLCBmb3JtYXQpOworCWZkX2xvZ2dlcihsb2dsZXZlbCwgZm9ybWF0LCBhcCk7CisJdmFfZW5kKGFwKTsKKworCXB0aHJlYWRfY2xlYW51cF9wb3AoMCk7CisJCisJKHZvaWQpcHRocmVhZF9tdXRleF91bmxvY2soJmZkX2xvZ19sb2NrKTsKK30KKworLyogTG9nIGEgZGVidWcgbWVzc2FnZSAqLwordm9pZCBmZF9sb2dfdmEgKCBpbnQgbG9nbGV2ZWwsIGNvbnN0IGNoYXIgKiBmb3JtYXQsIHZhX2xpc3QgYXJncyApCit7CisJKHZvaWQpcHRocmVhZF9tdXRleF9sb2NrKCZmZF9sb2dfbG9jayk7CisJCisJcHRocmVhZF9jbGVhbnVwX3B1c2goZmRfY2xlYW51cF9tdXRleF9zaWxlbnQsICZmZF9sb2dfbG9jayk7CisJZmRfbG9nZ2VyKGxvZ2xldmVsLCBmb3JtYXQsIGFyZ3MpOworCXB0aHJlYWRfY2xlYW51cF9wb3AoMCk7CisJCisJKHZvaWQpcHRocmVhZF9tdXRleF91bmxvY2soJmZkX2xvZ19sb2NrKTsKK30KKworLyogRnVuY3Rpb24gdG8gc2V0IHRoZSB0aHJlYWQncyBmcmllbmRseSBuYW1lICovCit2b2lkIGZkX2xvZ190aHJlYWRuYW1lICggY29uc3QgY2hhciAqIG5hbWUgKQoreworCXZvaWQgKiB2YWwgPSBOVUxMOworCQorCVRSQUNFX0VOVFJZKCIlcCglcykiLCBuYW1lLCBuYW1lPzoiLyIpOworCQorCS8qIEZpcnN0LCBjaGVjayBpZiBhIHZhbHVlIGlzIGFscmVhZHkgYXNzaWduZWQgdG8gdGhlIGN1cnJlbnQgdGhyZWFkICovCisJdmFsID0gcHRocmVhZF9nZXRzcGVjaWZpYyhmZF9sb2dfdGhuYW1lKTsKKwlpZiAoVFJBQ0VfQk9PTChBTk5PWUlORykpIHsKKwkJaWYgKHZhbCkgeworCQkJZmRfbG9nX2RlYnVnKCIoVGhyZWFkICclcycgcmVuYW1lZCB0byAnJXMnKSIsIChjaGFyICopdmFsLCBuYW1lPzoiKG5pbCkiKTsKKwkJfSBlbHNlIHsKKwkJCWZkX2xvZ19kZWJ1ZygiKFRocmVhZCAlcCBuYW1lZCAnJXMnKSIsICh2b2lkICopcHRocmVhZF9zZWxmKCksIG5hbWU/OiIobmlsKSIpOworCQl9CisJfQorCWlmICh2YWwgIT0gTlVMTCkgeworCQlmcmVlKHZhbCk7CisJfQorCQorCS8qIE5vdyBjcmVhdGUgdGhlIG5ldyBzdHJpbmcgKi8KKwlpZiAobmFtZSA9PSBOVUxMKSB7CisJCUNIRUNLX1BPU0lYX0RPKCBwdGhyZWFkX3NldHNwZWNpZmljKGZkX2xvZ190aG5hbWUsIE5VTEwpLCAvKiBjb250aW51ZSAqLyk7CisJCXJldHVybjsKKwl9CisJCisJQ0hFQ0tfTUFMTE9DX0RPKCB2YWwgPSBzdHJkdXAobmFtZSksIHJldHVybiApOworCQorCUNIRUNLX1BPU0lYX0RPKCBwdGhyZWFkX3NldHNwZWNpZmljKGZkX2xvZ190aG5hbWUsIHZhbCksIC8qIGNvbnRpbnVlICovKTsKKwlyZXR1cm47Cit9CisKKy8qIFdyaXRlIHRpbWUgaW50byBhIGJ1ZmZlciAqLworY2hhciAqIGZkX2xvZ190aW1lICggc3RydWN0IHRpbWVzcGVjICogdHMsIGNoYXIgKiBidWYsIHNpemVfdCBsZW4sIGludCBpbmNsX2RhdGUsIGludCBpbmNsX21zICkKK3sKKwlpbnQgcmV0OworCXNpemVfdCBvZmZzZXQgPSAwOworCXN0cnVjdCB0aW1lc3BlYyB0cDsKKwlzdHJ1Y3QgdG0gdG07CisJCisJLyogR2V0IGN1cnJlbnQgdGltZSAqLworCWlmICghdHMpIHsKKwkJcmV0ID0gY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJnRwKTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlzbnByaW50ZihidWYsIGxlbiwgIiVzIiwgc3RyZXJyb3IocmV0KSk7CisJCQlyZXR1cm4gYnVmOworCQl9CisJCXRzID0gJnRwOworCX0KKwkKKwlvZmZzZXQgKz0gc3RyZnRpbWUoYnVmICsgb2Zmc2V0LCBsZW4gLSBvZmZzZXQsIGluY2xfZGF0ZT8iJUQsJVQiOiIlVCIsIGxvY2FsdGltZV9yKCAmdHMtPnR2X3NlYyAsICZ0bSApKTsKKwlpZiAoaW5jbF9tcykKKwkJb2Zmc2V0ICs9IHNucHJpbnRmKGJ1ZiArIG9mZnNldCwgbGVuIC0gb2Zmc2V0LCAiLiU2LjZsZCIsIHRzLT50dl9uc2VjIC8gMTAwMCk7CisKKwlyZXR1cm4gYnVmOworfQorCisKK3N0YXRpYyBzaXplX3Qgc3lzX21lbXBhZ2VzeiA9IDA7CisKK3N0YXRpYyBzaXplX3QgZ2V0X21lbXBhZ2Vzeih2b2lkKSB7CisJaWYgKCFzeXNfbWVtcGFnZXN6KSB7CisJCXN5c19tZW1wYWdlc3ogPSBzeXNjb25mKF9TQ19QQUdFU0laRSk7IC8qIFdlIGFsbG9jIGJ1ZmZlciBieSBtZW1vcnkgcGFnZXMgZm9yIGVmZmljaWVuY3kuIFRoaXMgY2FuIGJlIHJlYWRqdXN0ZWQgaWYgdG9vIG1lbW9yeSBjb25zdW1pbmcgKi8KKwkJaWYgKHN5c19tZW1wYWdlc3ogPD0gMCkKKwkJCXN5c19tZW1wYWdlc3ogPSAyNTY7IC8qIGRlZmF1bHQgc2l6ZSBpZiBhYm92ZSBjYWxsIGZhaWxlZCAqLworCX0KKwlyZXR1cm4gc3lzX21lbXBhZ2VzejsKK30KKworCisvKiBIZWxwZXIgZnVuY3Rpb24gZm9yIGZkXypfZHVtcC4gUHJpbnRzIHRoZSBmb3JtYXQgc3RyaW5nIGZyb20gJ29mZnNldCcgaW50byAnKmJ1ZicsIGV4dGVuZHMgaWYgbmVlZGVkLiBUaGUgbG9jYXRpb24gb2YgYnVmIGNhbiBiZSB1cGRhdGVkIGJ5IHRoaXMgZnVuY3Rpb24uICovCitjaGFyICogZmRfZHVtcF9leHRlbmQoY2hhciAqKiBidWYsIHNpemVfdCAqbGVuLCBzaXplX3QgKm9mZnNldCwgY29uc3QgY2hhciAqIGZvcm1hdCwgLi4uICkKK3sKKwl2YV9saXN0IGFwOworCWludCB0b193cml0ZTsKKwlzaXplX3QgbyA9IDA7CisJc2l6ZV90IG1lbXBhZ2VzeiA9IGdldF9tZW1wYWdlc3ooKTsKKwkKKwkvKiB3ZSBkbyBub3QgVFJBQ0VfRU5UUlkgdGhpcyBvbmUgb24gcHVycG9zZSAqLworCQorCUNIRUNLX1BBUkFNU19ETyhidWYgJiYgbGVuLCByZXR1cm4gTlVMTCk7CisJCisJaWYgKCpidWYgPT0gTlVMTCkgeworCQlDSEVDS19NQUxMT0NfRE8oKmJ1ZiA9IG1hbGxvYyhtZW1wYWdlc3opLCByZXR1cm4gTlVMTCk7CisJCSpsZW4gPSBtZW1wYWdlc3o7CisJfQorCQorCWlmIChvZmZzZXQpCisJCW8gPSAqb2Zmc2V0OworCQorCXZhX3N0YXJ0KGFwLCBmb3JtYXQpOworCXRvX3dyaXRlID0gdnNucHJpbnRmKCpidWYgKyBvLCAqbGVuIC0gbywgZm9ybWF0LCBhcCk7CisJdmFfZW5kKGFwKTsKKwkKKwlpZiAodG9fd3JpdGUgKyBvID49ICpsZW4pIHsKKwkJLyogVGhlcmUgd2FzIG5vIHJvb20gaW4gdGhlIGJ1ZmZlciwgd2UgZXh0ZW5kIGFuZCByZWRvICovCisJCXNpemVfdCBuZXdfbGVuID0gKCgodG9fd3JpdGUgKyBvKSAvIG1lbXBhZ2VzeikgKyAxKSAqIG1lbXBhZ2VzejsKKwkJQ0hFQ0tfTUFMTE9DX0RPKCpidWYgPSByZWFsbG9jKCpidWYsIG5ld19sZW4pLCByZXR1cm4gTlVMTCk7CisJCSpsZW4gPSBuZXdfbGVuOworCQkKKwkJdmFfc3RhcnQoYXAsIGZvcm1hdCk7CisJCXRvX3dyaXRlID0gdnNucHJpbnRmKCpidWYgKyBvLCAqbGVuIC0gbywgZm9ybWF0LCBhcCk7CisJCXZhX2VuZChhcCk7CisJfQorCQorCWlmIChvZmZzZXQpCisJCSpvZmZzZXQgKz0gdG9fd3JpdGU7CisJCisJcmV0dXJuICpidWY7Cit9CisKK2NoYXIgKiBmZF9kdW1wX2V4dGVuZF9oZXhkdW1wKGNoYXIgKiogYnVmLCBzaXplX3QgKmxlbiwgc2l6ZV90ICpvZmZzZXQsIHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBkYXRhbGVuLCBzaXplX3QgdHJ1bmMsIHNpemVfdCB3cmFwICkKK3sKKwlpbnQgdHJ1bmNhdGVkID0gMDsKKwlzaXplX3QgdG93cml0ZSA9IDA7CisJc2l6ZV90IG8gPSAwOworCWludCBpOworCWNoYXIgKiBwOworCXNpemVfdCBtZW1wYWdlc3ogPSBnZXRfbWVtcGFnZXN6KCk7CisjZGVmaW5lIFRSVU5LX01BUksgIlsuLi5dIgorCisJQ0hFQ0tfUEFSQU1TX0RPKGJ1ZiAmJiBsZW4gJiYgZGF0YSwgcmV0dXJuIE5VTEwpOworCQorCWlmICh0cnVuYyAmJiAoZGF0YWxlbiA+IHRydW5jKSkgeworCQlkYXRhbGVuID0gdHJ1bmM7CisJCXRydW5jYXRlZCA9IDE7CisJfQorCQorCXRvd3JpdGUgPSBkYXRhbGVuICogMjsKKwkKKwlpZiAod3JhcCkKKwkJdG93cml0ZSArPSBkYXRhbGVuIC8gd3JhcDsgLyogYWRkIDEgJ1xuJyBldmVyeSB3cmFwIGJ5dGUgKi8KKwkKKwlpZiAodHJ1bmNhdGVkKQorCQl0b3dyaXRlICs9IENPTlNUU1RSTEVOKFRSVU5LX01BUkspOworCQorCQorCWlmIChvZmZzZXQpCisJCW8gPSAqb2Zmc2V0OworCQorCWlmICgqYnVmID09IE5VTEwpIHsKKwkJLyogRGlyZWN0bHkgYWxsb2NhdGUgdGhlIHNpemUgd2UgbmVlZCAqLworCQkqbGVuID0gKCgodG93cml0ZSArIG8pIC8gbWVtcGFnZXN6KSArIDEgKSAqIG1lbXBhZ2VzejsKKwkJQ0hFQ0tfTUFMTE9DX0RPKCpidWYgPSBtYWxsb2MoKmxlbiksIHJldHVybiBOVUxMKTsKKwl9IGVsc2UgaWYgKCh0b3dyaXRlICsgbykgPj0gKmxlbikgeworCQkvKiBUaGVyZSBpcyBubyByb29tIGluIHRoZSBidWZmZXIsIHdlIGV4dGVuZCBhbmQgcmVkbyAqLworCQlzaXplX3QgbmV3X2xlbiA9ICgoKHRvd3JpdGUgKyBvKSAvIG1lbXBhZ2VzeikgKyAxKSAqIG1lbXBhZ2VzejsKKwkJQ0hFQ0tfTUFMTE9DX0RPKCpidWYgPSByZWFsbG9jKCpidWYsIG5ld19sZW4pLCByZXR1cm4gTlVMTCk7CisJCSpsZW4gPSBuZXdfbGVuOworCX0KKwkKKwlwID0gKmJ1ZiArIG87CisJZm9yIChpID0gMDsgaSA8IGRhdGFsZW47IGkrKykgeworCQlzcHJpbnRmKHAsICIlMDJoaFgiLCBkYXRhW2ldKTsKKwkJcCs9MjsKKwkJaWYgKCh3cmFwKSAmJiAoKGkrMSkgJSB3cmFwID09IDApKSB7CisJCQkqcCsrPSdcbic7ICpwID0nXDAnOyAvKiB3ZSB3YW50IHRvIGVuc3VyZSB0aGUgYnVmZmVyIGlzIGFsd2F5cyAwLXRlcm1pbmF0ZWQgKi8KKwkJfQorCX0KKwkKKwlpZiAodHJ1bmNhdGVkKQorCQltZW1jcHkocCwgVFJVTktfTUFSSywgQ09OU1RTVFJMRU4oVFJVTktfTUFSSykpOworCQkKKwlpZiAob2Zmc2V0KQorCQkqb2Zmc2V0ICs9IHRvd3JpdGU7CisJCisJcmV0dXJuICpidWY7Cit9CmRpZmYgLS1naXQgYS9saWJmZHByb3RvL21lc3NhZ2VzLmMgYi9saWJmZHByb3RvL21lc3NhZ2VzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RhOGQyZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmZkcHJvdG8vbWVzc2FnZXMuYwpAQCAtMCwwICsxLDI4NTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDE1LCBXSURFIFByb2plY3QgYW5kIE5JQ1QJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFdJREUgUHJvamVjdCBvciBOSUNUIG5vciB0aGUgCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgV0lERSBQcm9qZWN0IGFuZCAJCQkJCQkgKgorKiAgIE5JQ1QuCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogTWVzc2FnZXMgbW9kdWxlLgorICogCisgKiBUaGlzIG1vZHVsZSBhbGxvd3MgdG8gbWFuaXB1bGF0ZSB0aGUgbXNnIGFuZCBhdnAgc3RydWN0dXJlcyB0aGF0IHJlcHJlc2VudHMgYSBEaWFtZXRlciBtZXNzYWdlIGluIG1lbW9yeS4KKyAqLworCisjaW5jbHVkZSAiZmRwcm90by1pbnRlcm5hbC5oIgorCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisKKy8qIFR5cGUgb2Ygb2JqZWN0ICovCitlbnVtIG1zZ19vYmp0eXBlIHsKKwlNU0dfTVNHID0gMSwgCisJTVNHX0FWUAorfTsKKworLyogQ2hhaW5pbmcgb2YgZWxlbWVudHMgYXMgYSBmcmVlIGhpZXJhcmNoeSAqLworc3RydWN0IG1zZ19hdnBfY2hhaW4geworCXN0cnVjdCBmZF9saXN0CQljaGFpbmluZzsJLyogQ2hhaW5pbmcgaW5mb3JtYXRpb24gYXQgdGhpcyBsZXZlbC4gKi8KKwlzdHJ1Y3QgZmRfbGlzdAkJY2hpbGRyZW47CS8qIHNlbnRpbmVsIGZvciB0aGUgY2hpbGRyZW4gb2YgdGhpcyBvYmplY3QgKi8KKwllbnVtIG1zZ19vYmp0eXBlIAl0eXBlOwkJLyogVHlwZSBvZiB0aGlzIG9iamVjdCwgX01TR19NU0cgb3IgX01TR19BVlAgKi8KK307CisKKy8qIFJldHVybiB0aGUgY2hhaW4gaW5mb3JtYXRpb24gZnJvbSBhbiBBVlAgb3IgTVNHLiBTaW5jZSBpdCdzIHRoZSBmaXJzdCBmaWVsZCwgd2UganVzdCBjYXN0ICovCisjZGVmaW5lIF9DKF94KSAoKHN0cnVjdCBtc2dfYXZwX2NoYWluICopKF94KSkKKworLyogU29tZSBkZXRhaWxzIGFib3V0IGNoYWluaW5nOgorICoKKyAqICBBIG1lc3NhZ2UgaXMgbWFkZSBvZiBhIGhlYWRlciAoIG1zZyApIGFuZCAwIG9yIG1vcmUgQVZQcyAoIGF2cCApLgorICogVGhlIHN0cnVjdHVyZSBpcyBhIGtpbmQgb2YgdHJlZSwgd2hlcmUgc29tZSBBVlBzIChncm91cGVkIEFWUHMpIGNhbiBjb250YWluIG90aGVyIEFWUHMuCisgKiBFeGFtcGxlOgorICogbXNnCisgKiAgfC1hdnAKKyAqICB8LWdhdnAKKyAqICB8ICAgfC1hdnAKKyAqICB8ICAgfC1hdnAKKyAqICB8ICAgXC1hdnAKKyAqICB8LWF2cAorICogIFwtYXZwCisgKgorICogRWFjaCBpdGVtIChtc2cgb3IgYXZwKSBzdHJ1Y3R1cmUgYmVnaW5zIHdpdGggYSBtc2dfYXZwX2NoYWluIHN0cnVjdHVyZS4KKyAqIFRoZSBlbGVtZW50IGF0IHRoZSB0b3Agb2YgdGhlIGhpZXJhcmNoeSAobXNnIGluIG91ciBleGFtcGxlKSBoYXMgYWxsIHRoZSBmaWVsZHMgb2YgaXRzICJjaGFpbmluZyIgZXF1YWwgdG8gdGhlIHNhbWUgdmFsdWUuCisgKgorICogQWxsIGVsZW1lbnRzIGF0IHRoZSBzYW1lIGxldmVsIGFyZSBsaW5rZWQgYnkgdGhlaXIgImNoYWluaW5nIiBsaXN0LgorICogVGhlICJjaGlsZHJlbiIgbGlzdCBpcyB0aGUgc2VudGluZWwgZm9yIHRoZSBsaXN0cyBvZiBjaGlsZHJlbiBvZiB0aGlzIGVsZW1lbnQuCisgKi8KKworLyogVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyBhcmUgdXNlZCB0byByZWNvZ25pemUgb2JqZWN0cyBpbiBtZW1vcnkuICovCisjZGVmaW5lIE1TR19NU0dfRVlFQwkoMHgxMTM1NTQ2MykKKyNkZWZpbmUgTVNHX0FWUF9FWUVDCSgweDExMzU1NDY3KQorCisvKiBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZSByZXByZXNlbnRzIGFuIEFWUCBpbnN0YW5jZS4gKi8KK3N0cnVjdCBhdnAgeworCXN0cnVjdCBtc2dfYXZwX2NoYWluCSBhdnBfY2hhaW47CQkvKiBDaGFpbmluZyBpbmZvcm1hdGlvbiBvZiB0aGlzIEFWUCAqLworCWludAkJCSBhdnBfZXllYzsJCS8qIE11c3QgYmUgZXF1YWwgdG8gTVNHX0FWUF9FWUVDICovCisJc3RydWN0IGRpY3Rfb2JqZWN0CSphdnBfbW9kZWw7CQkvKiBJZiBub3QgTlVMTCwgcG9pbnRlciB0byB0aGUgZGljdGlvbmFyeSBvYmplY3Qgb2YgdGhpcyBhdnAgKi8KKwlzdHJ1Y3QgeworCQlhdnBfY29kZV90CSBtbmZfY29kZTsJCQorCQl2ZW5kb3JfaWRfdAkgbW5mX3ZlbmRvcjsJCQorCX0gIAkJCSBhdnBfbW9kZWxfbm90X2ZvdW5kOwkvKiBXaGVuIG1vZGVsIHJlc29sdXRpb24gaGFzIGZhaWxlZCwgc3RvcmUgYSBjb3B5IG9mIHRoZSBkYXRhIGhlcmUgdG8gYXZvaWQgc2VhcmNoaW5nIGFnYWluICovCisJc3RydWN0IGF2cF9oZHIJCSBhdnBfcHVibGljOwkJLyogQVZQIGRhdGEgdGhhdCBjYW4gYmUgbWFuYWdlZCBieSBvdGhlciBtb2R1bGVzICovCisJCisJdWludDhfdAkJCSphdnBfc291cmNlOwkJLyogSWYgdGhlIG1lc3NhZ2Ugd2FzIHBhcnNlZCBmcm9tIGEgYnVmZmVyLCBwb2ludGVyIHRvIHRoZSBBVlAgZGF0YSBzdGFydCBpbiB0aGUgYnVmZmVyLiAqLworCXVpbnQ4X3QJCQkqYXZwX3Jhd2RhdGE7CQkvKiB3aGVuIHRoZSBkYXRhIGNhbiBub3QgYmUgaW50ZXJwcmV0ZWQsIHRoZSByYXcgZGF0YSBpcyBjb3BpZWQgaGVyZS4gVGhlIGhlYWRlciBpcyBub3QgcGFydCBvZiBpdC4gKi8KKwlzaXplX3QJCQkgYXZwX3Jhd2xlbjsJCS8qIFRoZSBsZW5ndGggb2YgdGhlIHJhdyBidWZmZXIuICovCisJdW5pb24gYXZwX3ZhbHVlCQkgYXZwX3N0b3JhZ2U7CQkvKiBUbyBhdm9pZCBtYW55IGFsbG9jL2ZyZWUsIHN0b3JlIHRoZSBpbnRlZ2VyIHZhbHVlcyBoZXJlIGFuZCBzZXQgYXZwX3B1YmxpYy5hdnBfZGF0YSB0byAmc3RvcmFnZSAqLworCWludAkJCSBhdnBfbXVzdGZyZWVvczsJLyogMSBpZiBhbiBvY3RldHN0cmluZyBpcyBtYWxsb2MnZCBpbiBhdnBfc3RvcmFnZSBhbmQgbXVzdCBiZSBmcmVlZC4gKi8KK307CisKKy8qIE1hY3JvIHRvIGNvbXB1dGUgdGhlIEFWUCBoZWFkZXIgc2l6ZSAqLworI2RlZmluZSBBVlBIRFJTWl9OT1ZFTkQJOAorI2RlZmluZSBBVlBIRFJTWl9WRU5ET1IJMTIKKyNkZWZpbmUgR0VUQVZQSERSU1ooIF9mbGFnICkgKChfZmxhZyAmIEFWUF9GTEFHX1ZFTkRPUikgPyBBVlBIRFJTWl9WRU5ET1IgOiBBVlBIRFJTWl9OT1ZFTkQpCisKKy8qIE1hY3JvIHRvIGNhc3QgYSBtc2dfYXZwX3QgKi8KKyNkZWZpbmUgX0EoX3gpICgoc3RydWN0IGF2cCAqKShfeCkpCisvKiBDaGVjayB0aGUgdHlwZSBhbmQgZXllY2F0Y2hlciAqLworI2RlZmluZSBDSEVDS19BVlAoX3gpICgoX3gpICYmIChfQyhfeCktPnR5cGUgPT0gTVNHX0FWUCkgJiYgKF9BKF94KS0+YXZwX2V5ZWMgPT0gTVNHX0FWUF9FWUVDKSkKKworLyogVGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgcmVwcmVzZW50cyBhbiBpbnN0YW5jZSBvZiBhIG1lc3NhZ2UgKGNvbW1hbmQgYW5kIGNoaWxkcmVuIEFWUHMpLiAqLworc3RydWN0IG1zZyB7CisJc3RydWN0IG1zZ19hdnBfY2hhaW4JIG1zZ19jaGFpbjsJCS8qIExpc3Qgb2YgdGhlIEFWUHMgaW4gdGhlIG1lc3NhZ2UgKi8KKwlpbnQJCQkgbXNnX2V5ZWM7CQkvKiBNdXN0IGJlIGVxdWFsIHRvIE1TR19NU0dfRVlFQyAqLworCXN0cnVjdCBkaWN0X29iamVjdAkqbXNnX21vZGVsOwkJLyogSWYgbm90IE5VTEwsIHBvaW50ZXIgdG8gdGhlIGRpY3Rpb25hcnkgb2JqZWN0IG9mIHRoaXMgbWVzc2FnZSAqLworCXN0cnVjdCB7CisJCWNvbW1hbmRfY29kZV90CSBtbmZfY29kZTsKKwkJdWludDhfdAkJIG1uZl9mbGFnczsJCQorCX0gIAkJCSBtc2dfbW9kZWxfbm90X2ZvdW5kOwkvKiBXaGVuIG1vZGVsIHJlc29sdXRpb24gaGFzIGZhaWxlZCwgc3RvcmUgYSBjb3B5IG9mIHRoZSBkYXRhIGhlcmUgdG8gYXZvaWQgc2VhcmNoaW5nIGFnYWluICovCisJc3RydWN0IG1zZ19oZHIJCSBtc2dfcHVibGljOwkJLyogTWVzc2FnZSBkYXRhIHRoYXQgY2FuIGJlIG1hbmFnZWQgYnkgZXh0ZW5zaW9ucy4gKi8KKwkKKwl1aW50OF90CQkJKm1zZ19yYXdidWZmZXI7CQkvKiBkYXRhIGJ1ZmZlciB0aGF0IHdhcyByZWNlaXZlZCwgc2F2ZWQgZHVyaW5nIGZkX21zZ19wYXJzZV9idWZmZXIgYW5kIGZyZWVkIGluIGZkX21zZ19wYXJzZV9kaWN0ICovCisJaW50CQkJIG1zZ19yb3V0YWJsZTsJCS8qIElzIHRoaXMgYSByb3V0YWJsZSBtZXNzYWdlPyAoMDogdW5kZWYsIDE6IHJvdXRhYmxlLCAyOiBub24gcm91dGFibGUpICovCisJc3RydWN0IG1zZwkJKm1zZ19xdWVyeTsJCS8qIHRoZSBhc3NvY2lhdGVkIHF1ZXJ5IGlmIHRoZSBtZXNzYWdlIGlzIGEgcmVjZWl2ZWQgYW5zd2VyICovCisJaW50CQkJIG1zZ19hc3NvY2lhdGVkOwkvKiBhbmQgdGhlIGNvdW50ZXIgcGFydCBpbmZvcm1hdGlvbiBpbiB0aGUgcXVlcnksIHRvIGF2b2lkIGRvdWJsZSBmcmVlICovCisJc3RydWN0IHJ0X2RhdGEJCSptc2dfcnRkYXRhOwkJLyogUm91dGluZyBsaXN0IGZvciB0aGUgcXVlcnkgKi8KKwlzdHJ1Y3Qgc2Vzc2lvbgkJKm1zZ19zZXNzOwkJLyogQ2FjaGVkIG1lc3NhZ2Ugc2Vzc2lvbiBpZiBhbnkgKi8KKwlzdHJ1Y3QgeworCQkJdm9pZCAoKmFuc2NiKSh2b2lkICosIHN0cnVjdCBtc2cgKiopOworCQkJdm9pZCAoKmV4cGlyZWNiKSh2b2lkICosIERpYW1JZF90LCBzaXplX3QsIHN0cnVjdCBtc2cgKiopOworCQkJdm9pZCAqIGRhdGE7CisJCQlzdHJ1Y3QgdGltZXNwZWMgdGltZW91dDsKKwkJfQkJIG1zZ19jYjsJCS8qIENhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIGFuIGFuc3dlciBpcyByZWNlaXZlZCwgb3IgdGltZW91dCBleHBpcmVzLCBpZiBub3QgTlVMTCAqLworCURpYW1JZF90CQkgbXNnX3NyY19pZDsJCS8qIERpYW1ldGVyIElkIG9mIHRoZSBwZWVyIHRoaXMgbWVzc2FnZSB3YXMgcmVjZWl2ZWQgZnJvbS4gVGhpcyBzdHJpbmcgaXMgbWFsbG9jJ2QgYW5kIG11c3QgYmUgZnJlZWQgKi8KKwlzaXplX3QJCQkgbXNnX3NyY19pZF9sZW47CS8qIGNhY2hlZCBsZW5ndGggb2YgdGhpcyBzdHJpbmcgKi8KKwlzdHJ1Y3QgZmRfbXNnX3BtZGwJIG1zZ19wbWRsOwkJLyogbGlzdCBvZiBwZXJtZXNzYWdlZGF0YSBzdHJ1Y3R1cmVzLiAqLworfTsKKworLyogTWFjcm8gdG8gY29tcHV0ZSB0aGUgbWVzc2FnZSBoZWFkZXIgc2l6ZSAqLworI2RlZmluZSBHRVRNU0dIRFJTWigpIAkyMAorCisvKiBNYWNybyB0byBjYXN0IGEgbXNnX2F2cF90ICovCisjZGVmaW5lIF9NKF94KSAoKHN0cnVjdCBtc2cgKikoX3gpKQorLyogQ2hlY2sgdGhlIHR5cGUgYW5kIGV5ZWNhdGNoZXIgKi8KKyNkZWZpbmUgQ0hFQ0tfTVNHKF94KSAoKF94KSAmJiAoX0MoX3gpLT50eXBlID09IE1TR19NU0cpICYmIChfTShfeCktPm1zZ19leWVjID09IE1TR19NU0dfRVlFQykpCisKKyNkZWZpbmUgVkFMSURBVEVfT0JKKF94KSAoIChDSEVDS19NU0coX3gpKSB8fCAoQ0hFQ0tfQVZQKF94KSkgKQorCisKKy8qIE1hY3JvIHRvIHZhbGlkYXRlIGEgTVNHRkxfIHZhbHVlICovCisjZGVmaW5lIENIRUNLX0FWUEZMKF9mbCkgKCAoKF9mbCkgJiAoLSAoQVZQRkxfTUFYIDw8IDEpICkpID09IDAgKQorI2RlZmluZSBDSEVDS19NU0dGTChfZmwpICggKChfZmwpICYgKC0gKE1TR0ZMX01BWCA8PCAxKSApKSA9PSAwICkKKworCisvKiBpbml0aWFsIHNpemVzIG9mIEFWUCBmcm9tIHRoZWlyIHR5cGVzLCBpbiBieXRlcy4gKi8KK3N0YXRpYyBpbnQgYXZwX3ZhbHVlX3NpemVzW10gPSB7IAorCSAwLAkvKiBBVlBfVFlQRV9HUk9VUEVEOiBzaXplIGlzIGR5bmFtaWMgKi8KKwkgMCwJLyogQVZQX1RZUEVfT0NURVRTVFJJTkc6IHNpemUgaXMgZHluYW1pYyAqLworCSA0LAkvKiBBVlBfVFlQRV9JTlRFR0VSMzI6IHNpemUgaXMgMzIgYml0cyAqLworCSA4LAkvKiBBVlBfVFlQRV9JTlRFR0VSNjQ6IHNpemUgaXMgNjQgYml0cyAqLworCSA0LAkvKiBBVlBfVFlQRV9VTlNJR05FRDMyOiBzaXplIGlzIDMyIGJpdHMgKi8KKwkgOCwJLyogQVZQX1RZUEVfVU5TSUdORUQ2NDogc2l6ZSBpcyA2NCBiaXRzICovCisJIDQsCS8qIEFWUF9UWVBFX0ZMT0FUMzI6IHNpemUgaXMgMzIgYml0cyAqLworCSA4CS8qIEFWUF9UWVBFX0ZMT0FUNjQ6IHNpemUgaXMgNjQgYml0cyAqLworfTsKKyNkZWZpbmUgQ0hFQ0tfQkFTRVRZUEUoIF90eXBlICkgKCAoKF90eXBlKSA8PSBBVlBfVFlQRV9NQVgpICYmICgoX3R5cGUpID49IDApICkKKyNkZWZpbmUgR0VUSU5JVElBTFNJWkUoIF90eXBlLCBfdmVuZCApIChhdnBfdmFsdWVfc2l6ZXNbIENIRUNLX0JBU0VUWVBFKF90eXBlKSA/IChfdHlwZSkgOiAwXSArIEdFVEFWUEhEUlNaKF92ZW5kKSkKKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbiAqLworc3RhdGljIGludCBwYXJzZWRpY3RfZG9fbXNnKHN0cnVjdCBkaWN0aW9uYXJ5ICogZGljdCwgc3RydWN0IG1zZyAqIG1zZywgaW50IG9ubHlfaGRyLCBzdHJ1Y3QgZmRfcGVpICplcnJvcl9pbmZvKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIENyZWF0aW5nIG9iamVjdHMgKi8KKworLyogSW5pdGlhbGl6ZSBhIG1zZ19hdnBfY2hhaW4gc3RydWN0dXJlICovCitzdGF0aWMgdm9pZCBpbml0X2NoYWluKHN0cnVjdCBtc2dfYXZwX2NoYWluICogY2hhaW4sIGludCB0eXBlKQoreworCWZkX2xpc3RfaW5pdCggJmNoYWluLT5jaGFpbmluZywgKHZvaWQgKiljaGFpbik7CisJZmRfbGlzdF9pbml0KCAmY2hhaW4tPmNoaWxkcmVuLCAodm9pZCAqKWNoYWluKTsKKwljaGFpbi0+dHlwZSA9IHR5cGU7Cit9CisKKy8qIEluaXRpYWxpemUgYSBuZXcgQVZQIG9iamVjdCAqLworc3RhdGljIHZvaWQgaW5pdF9hdnAgKCBzdHJ1Y3QgYXZwICogYXZwICkKK3sKKwlUUkFDRV9FTlRSWSgiJXAiLCBhdnApOworCQorCW1lbXNldChhdnAsIDAsIHNpemVvZihzdHJ1Y3QgYXZwKSk7CisJaW5pdF9jaGFpbiggJmF2cC0+YXZwX2NoYWluLCBNU0dfQVZQKTsKKwlhdnAtPmF2cF9leWVjID0gTVNHX0FWUF9FWUVDOworfQorCQorLyogSW5pdGlhbGl6ZSBhIG5ldyBNU0cgb2JqZWN0ICovCitzdGF0aWMgdm9pZCBpbml0X21zZyAoIHN0cnVjdCBtc2cgKiBtc2cgKQoreworCVRSQUNFX0VOVFJZKCIlcCIsIG1zZyk7CisJCisJbWVtc2V0KG1zZywgMCwgc2l6ZW9mKHN0cnVjdCBtc2cpKTsKKwlpbml0X2NoYWluKCAmbXNnLT5tc2dfY2hhaW4sIE1TR19NU0cpOworCW1zZy0+bXNnX2V5ZWMgPSBNU0dfTVNHX0VZRUM7CisJCisJZmRfbGlzdF9pbml0KCZtc2ctPm1zZ19wbWRsLnNlbnRpbmVsLCBOVUxMKTsKKwlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9tdXRleF9pbml0KCZtc2ctPm1zZ19wbWRsLmxvY2ssIE5VTEwpLCApOworfQorCisKKy8qIENyZWF0ZSBhIG5ldyBBVlAgaW5zdGFuY2UgKi8KK2ludCBmZF9tc2dfYXZwX25ldyAoIHN0cnVjdCBkaWN0X29iamVjdCAqIG1vZGVsLCBpbnQgZmxhZ3MsIHN0cnVjdCBhdnAgKiogYXZwICkKK3sKKwlzdHJ1Y3QgYXZwICpuZXcgPSBOVUxMOworCQorCVRSQUNFX0VOVFJZKCIlcCAleCAlcCIsIG1vZGVsLCBmbGFncywgYXZwKTsKKwkKKwkvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworCUNIRUNLX1BBUkFNUyggIGF2cCAmJiBDSEVDS19BVlBGTChmbGFncykgICk7CisJCisJaWYgKG1vZGVsKSB7CisJCWVudW0gZGljdF9vYmplY3RfdHlwZSAJIGRpY3R0eXBlOworCQlDSEVDS19QQVJBTVMoIChmZF9kaWN0X2dldHR5cGUobW9kZWwsICZkaWN0dHlwZSkgPT0gMCkgJiYgKGRpY3R0eXBlID09IERJQ1RfQVZQKSApOworCX0KKwkKKwkvKiBDcmVhdGUgYSBuZXcgb2JqZWN0ICovCisJQ0hFQ0tfTUFMTE9DKCAgbmV3ID0gbWFsbG9jIChzaXplb2Yoc3RydWN0IGF2cCkpICApOworCQorCS8qIEluaXRpYWxpemUgdGhlIGZpZWxkcyAqLworCWluaXRfYXZwKG5ldyk7CisJCisJaWYgKG1vZGVsKSB7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRpY3RkYXRhOworCQkKKwkJQ0hFQ0tfRkNUX0RPKCAgZmRfZGljdF9nZXR2YWwobW9kZWwsICZkaWN0ZGF0YSksIHsgZnJlZShuZXcpOyByZXR1cm4gX19yZXRfXzsgfSAgKTsKKwkKKwkJbmV3LT5hdnBfbW9kZWwgPSBtb2RlbDsKKwkJbmV3LT5hdnBfcHVibGljLmF2cF9jb2RlICAgID0gZGljdGRhdGEuYXZwX2NvZGU7CisJCW5ldy0+YXZwX3B1YmxpYy5hdnBfZmxhZ3MgICA9IGRpY3RkYXRhLmF2cF9mbGFnX3ZhbDsKKwkJbmV3LT5hdnBfcHVibGljLmF2cF9sZW4gPSBHRVRJTklUSUFMU0laRShkaWN0ZGF0YS5hdnBfYmFzZXR5cGUsIGRpY3RkYXRhLmF2cF9mbGFnX3ZhbCApOworCQluZXctPmF2cF9wdWJsaWMuYXZwX3ZlbmRvciAgPSBkaWN0ZGF0YS5hdnBfdmVuZG9yOworCX0KKwkKKwlpZiAoZmxhZ3MgJiBBVlBGTF9TRVRfQkxBTktfVkFMVUUpIHsKKwkJbmV3LT5hdnBfcHVibGljLmF2cF92YWx1ZSA9ICZuZXctPmF2cF9zdG9yYWdlOworCX0KKwkKKwlpZiAoZmxhZ3MgJiBBVlBGTF9TRVRfUkFXREFUQV9GUk9NX0FWUCkgeworCQluZXctPmF2cF9yYXdsZW4gPSAoKmF2cCktPmF2cF9wdWJsaWMuYXZwX2xlbiAtIEdFVEFWUEhEUlNaKCAoKmF2cCktPmF2cF9wdWJsaWMuYXZwX2ZsYWdzICk7CisJCWlmIChuZXctPmF2cF9yYXdsZW4pIHsKKwkJCUNIRUNLX01BTExPQ19ETyggIG5ldy0+YXZwX3Jhd2RhdGEgPSBtYWxsb2MobmV3LT5hdnBfcmF3bGVuKSwgeyBmcmVlKG5ldyk7IHJldHVybiBfX3JldF9fOyB9ICApOworCQkJbWVtc2V0KG5ldy0+YXZwX3Jhd2RhdGEsIDB4MDAsIG5ldy0+YXZwX3Jhd2xlbik7CisJCX0KKwl9CisJCisJLyogVGhlIG5ldyBvYmplY3QgaXMgcmVhZHksIHJldHVybiAqLworCSphdnAgPSBuZXc7CisJcmV0dXJuIDA7Cit9CisKK2ludCBmZF9tc2dfbmV3ICggc3RydWN0IGRpY3Rfb2JqZWN0ICogbW9kZWwsIGludCBmbGFncywgc3RydWN0IG1zZyAqKiBtc2cgKQoreworICAgcmV0dXJuIGZkX21zZ19uZXdfYXBwbCggbW9kZWwsIE5VTEwsIGZsYWdzLCBtc2cgKTsKK30KKworLyogQ3JlYXRlIGEgbmV3IG1lc3NhZ2UgaW5zdGFuY2UgKi8KK2ludCBmZF9tc2dfbmV3X2FwcGwgKCBzdHJ1Y3QgZGljdF9vYmplY3QgKiBtb2RlbCwgc3RydWN0IGRpY3Rfb2JqZWN0ICogYXBwbCwgaW50IGZsYWdzLCBzdHJ1Y3QgbXNnICoqIG1zZyApCit7CisJc3RydWN0IG1zZyAqIG5ldyA9IE5VTEw7CisJCisJVFJBQ0VfRU5UUlkoIiVwICV4ICVwIiwgbW9kZWwsIGZsYWdzLCBtc2cpOworCQorCS8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisJQ0hFQ0tfUEFSQU1TKCAgbXNnICYmIENIRUNLX01TR0ZMKGZsYWdzKSAgKTsKKwkKKwlpZiAobW9kZWwpIHsKKwkJZW51bSBkaWN0X29iamVjdF90eXBlIAkgZGljdHR5cGU7CisJCUNIRUNLX1BBUkFNUyggKGZkX2RpY3RfZ2V0dHlwZShtb2RlbCwgJmRpY3R0eXBlKSA9PSAwKSAmJiAoZGljdHR5cGUgPT0gRElDVF9DT01NQU5EKSApOworCX0KKwkKKwkvKiBDcmVhdGUgYSBuZXcgb2JqZWN0ICovCisJQ0hFQ0tfTUFMTE9DKCAgbmV3ID0gbWFsbG9jIChzaXplb2Yoc3RydWN0IG1zZykpICApOworCQorCS8qIEluaXRpYWxpemUgdGhlIGZpZWxkcyAqLworCWluaXRfbXNnKG5ldyk7CisJbmV3LT5tc2dfcHVibGljLm1zZ192ZXJzaW9uCT0gRElBTUVURVJfVkVSU0lPTjsKKwluZXctPm1zZ19wdWJsaWMubXNnX2xlbmd0aAk9IEdFVE1TR0hEUlNaKCk7IC8qIFRoaXMgd2lsbCBiZSB1cGRhdGVkIGxhdGVyICovCisKKwlpZiAobW9kZWwpIHsKKwkJc3RydWN0IGRpY3Rpb25hcnkgCSpkaWN0OworCQlzdHJ1Y3QgZGljdF9jbWRfZGF0YSAgICAgZGljdGRhdGE7CisJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgCSpkaWN0YXBwbDsKKwkJCisJCUNIRUNLX0ZDVF9ETyggZmRfZGljdF9nZXRkaWN0KG1vZGVsLCAmZGljdCksIHsgZnJlZShuZXcpOyByZXR1cm4gX19yZXRfXzsgfSApOworCQlDSEVDS19GQ1RfRE8oIGZkX2RpY3RfZ2V0dmFsKG1vZGVsLCAmZGljdGRhdGEpLCB7IGZyZWUobmV3KTsgcmV0dXJuIF9fcmV0X187IH0gICk7CisJCQorCQluZXctPm1zZ19tb2RlbCA9IG1vZGVsOworCQluZXctPm1zZ19wdWJsaWMubXNnX2ZsYWdzCT0gZGljdGRhdGEuY21kX2ZsYWdfdmFsOworCQluZXctPm1zZ19wdWJsaWMubXNnX2NvZGUJPSBkaWN0ZGF0YS5jbWRfY29kZTsKKworCQkvKiBJbml0aWFsaXplIGFwcGxpY2F0aW9uIGZyb20gdGhlIHBhcmVudCwgaWYgYW55ICovCisJCWlmIChhcHBsKQorCQkJZGljdGFwcGwgPSBhcHBsOworCQllbHNlCisJCQlDSEVDS19GQ1RfRE8oICBmZF9kaWN0X3NlYXJjaCggZGljdCwgRElDVF9BUFBMSUNBVElPTiwgQVBQTElDQVRJT05fT0ZfQ09NTUFORCwgbW9kZWwsICZkaWN0YXBwbCwgMCksIHsgZnJlZShuZXcpOyByZXR1cm4gX19yZXRfXzsgfSAgKTsKKwkJaWYgKGRpY3RhcHBsICE9IE5VTEwpIHsKKwkJCXN0cnVjdCBkaWN0X2FwcGxpY2F0aW9uX2RhdGEgYXBwZGF0YTsKKwkJCUNIRUNLX0ZDVF9ETyggIGZkX2RpY3RfZ2V0dmFsKGRpY3RhcHBsLCAmYXBwZGF0YSksIHsgZnJlZShuZXcpOyByZXR1cm4gX19yZXRfXzsgfSAgKTsKKwkJCW5ldy0+bXNnX3B1YmxpYy5tc2dfYXBwbCA9IGFwcGRhdGEuYXBwbGljYXRpb25faWQ7CisJCX0KKwl9CisJCisJaWYgKGZsYWdzICYgTVNHRkxfQUxMT0NfRVRFSUQpIHsKKwkJbmV3LT5tc2dfcHVibGljLm1zZ19ldGVpZCA9IGZkX21zZ19ldGVpZF9nZXQoKTsKKwl9CisJCisJLyogVGhlIG5ldyBvYmplY3QgaXMgcmVhZHksIHJldHVybiAqLworCSptc2cgPSBuZXc7CisJcmV0dXJuIDA7Cit9CQorCitzdGF0aWMgaW50IGJ1ZmZlcml6ZV9hdnAodW5zaWduZWQgY2hhciAqIGJ1ZmZlciwgc2l6ZV90IGJ1Zmxlbiwgc2l6ZV90ICogb2Zmc2V0LCAgc3RydWN0IGF2cCAqIGF2cCk7CitzdGF0aWMgaW50IHBhcnNlYnVmX2xpc3QodW5zaWduZWQgY2hhciAqIGJ1Ziwgc2l6ZV90IGJ1Zmxlbiwgc3RydWN0IGZkX2xpc3QgKiBoZWFkKTsKK3N0YXRpYyBpbnQgcGFyc2VkaWN0X2RvX2NoYWluKHN0cnVjdCBkaWN0aW9uYXJ5ICogZGljdCwgc3RydWN0IGZkX2xpc3QgKiBoZWFkLCBpbnQgbWFuZGF0b3J5LCBzdHJ1Y3QgZmRfcGVpICplcnJvcl9pbmZvKTsKKworCisvKiBDcmVhdGUgYW5zd2VyIGZyb20gYSByZXF1ZXN0ICovCitpbnQgZmRfbXNnX25ld19hbnN3ZXJfZnJvbV9yZXEgKCBzdHJ1Y3QgZGljdGlvbmFyeSAqIGRpY3QsIHN0cnVjdCBtc2cgKiogbXNnLCBpbnQgZmxhZ3MgKQoreworCXN0cnVjdCBkaWN0X29iamVjdCAqIG1vZGVsID0gTlVMTDsKKwlzdHJ1Y3QgbXNnICpxcnksICphbnM7CisJc3RydWN0IHNlc3Npb24gKiBzZXNzID0gTlVMTDsKKwkKKwlUUkFDRV9FTlRSWSgiJXAgJXgiLCBtc2csIGZsYWdzKTsKKwkKKwkvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworCUNIRUNLX1BBUkFNUyggIG1zZyApOworCXFyeSA9ICptc2c7CisJQ0hFQ0tfUEFSQU1TKCBDSEVDS19NU0cocXJ5KSAmJiAocXJ5LT5tc2dfcHVibGljLm1zZ19mbGFncyAmIENNRF9GTEFHX1JFUVVFU1QpICk7CisJCisJaWYgKCEgKGZsYWdzICYgTVNHRkxfQU5TV19OT1NJRCkpIHsKKwkJLyogR2V0IHRoZSBzZXNzaW9uIG9mIHRoZSBtZXNzYWdlICovCisJCUNIRUNLX0ZDVF9ETyggZmRfbXNnX3Nlc3NfZ2V0KGRpY3QsIHFyeSwgJnNlc3MsIE5VTEwpLCAvKiBpZ25vcmUgYW4gZXJyb3IgKi8gKTsKKwl9CisJCisJLyogRmluZCB0aGUgbW9kZWwgZm9yIHRoZSBhbnN3ZXIgKi8KKwlpZiAoZmxhZ3MgJiBNU0dGTF9BTlNXX0VSUk9SKSB7CisJCS8qIFRoZSBtb2RlbCBpcyB0aGUgZ2VuZXJpYyBlcnJvciBmb3JtYXQgKi8KKwkJQ0hFQ0tfRkNUKCBmZF9kaWN0X2dldF9lcnJvcl9jbWQoZGljdCwgJm1vZGVsKSApOworCX0gZWxzZSB7CisJCS8qIFRoZSBtb2RlbCBpcyB0aGUgYW5zd2VyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHF1ZXJ5LiBJdCBzdXBwb3NlcyB0aGF0IHRoZXNlIGFyZSBkZWZpbmVkIGluIHRoZSBkaWN0aW9uYXJ5ICovCisJCUNIRUNLX0ZDVF9ETyggIHBhcnNlZGljdF9kb19tc2coIGRpY3QsIHFyeSwgMSwgTlVMTCksIC8qIGNvbnRpbnVlICovICApOworCQlpZiAocXJ5LT5tc2dfbW9kZWwpIHsKKwkJCUNIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoICggZGljdCwgRElDVF9DT01NQU5ELCBDTURfQU5TV0VSLCBxcnktPm1zZ19tb2RlbCwgJm1vZGVsLCBFSU5WQUwgKSAgKTsKKwkJfQorCX0KKwkKKwkvKiBDcmVhdGUgdGhlIGFuc3dlciAqLworCUNIRUNLX0ZDVCggIGZkX21zZ19uZXcoIG1vZGVsLCBmbGFncywgJmFucyApICApOworCQorCS8qIFNldCBpbmZvcm1hdGlvbnMgaW4gdGhlIGFuc3dlciBhcyBpbiB0aGUgcXVlcnkgKi8KKwlhbnMtPm1zZ19wdWJsaWMubXNnX2NvZGUgPSBxcnktPm1zZ19wdWJsaWMubXNnX2NvZGU7IC8qIHVzZWZ1bCBmb3IgTVNHRkxfQU5TV19FUlJPUiAqLworCWFucy0+bXNnX3B1YmxpYy5tc2dfYXBwbCA9IHFyeS0+bXNnX3B1YmxpYy5tc2dfYXBwbDsKKwlhbnMtPm1zZ19wdWJsaWMubXNnX2V0ZWlkID0gcXJ5LT5tc2dfcHVibGljLm1zZ19ldGVpZDsKKwlhbnMtPm1zZ19wdWJsaWMubXNnX2hiaGlkID0gcXJ5LT5tc2dfcHVibGljLm1zZ19oYmhpZDsKKwkKKwkvKiBBZGQgdGhlIFNlc3Npb24tSWQgQVZQIGlmIHNlc3Npb24gaXMga25vd24gKi8KKwlpZiAoc2VzcyAmJiBkaWN0KSB7CisJCXN0YXRpYyBzdHJ1Y3QgZGljdF9vYmplY3QgKiBzZXNzX2lkX2F2cCA9IE5VTEw7CisJCW9zMF90IHNpZDsKKwkJc2l6ZV90IHNpZGxlbjsKKwkJc3RydWN0IGF2cCAqIGF2cDsKKwkJdW5pb24gYXZwX3ZhbHVlIHZhbDsKKwkJCisJCWlmICghc2Vzc19pZF9hdnApIHsKKwkJCUNIRUNLX0ZDVF9ETyggZmRfZGljdF9zZWFyY2goIGRpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIlNlc3Npb24tSWQiLCAmc2Vzc19pZF9hdnAsIEVOT0VOVCksIHsgZnJlZShhbnMpOyByZXR1cm4gX19yZXRfXzsgfSApOworCQl9CisJCUNIRUNLX0ZDVF9ETyggZmRfc2Vzc19nZXRzaWQgKCBzZXNzLCAmc2lkLCAmc2lkbGVuICksIHsgZnJlZShhbnMpOyByZXR1cm4gX19yZXRfXzsgfSApOworCQlDSEVDS19GQ1RfRE8oIGZkX21zZ19hdnBfbmV3ICggc2Vzc19pZF9hdnAsIDAsICZhdnAgKSwgeyBmcmVlKGFucyk7IHJldHVybiBfX3JldF9fOyB9ICk7CisJCXZhbC5vcy5kYXRhID0gc2lkOworCQl2YWwub3MubGVuICA9IHNpZGxlbjsKKwkJQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfYXZwX3NldHZhbHVlKCBhdnAsICZ2YWwgKSwgeyBmcmVlKGF2cCk7IGZyZWUoYW5zKTsgcmV0dXJuIF9fcmV0X187IH0gKTsKKwkJQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfYXZwX2FkZCggYW5zLCBNU0dfQlJXX0ZJUlNUX0NISUxELCBhdnAgKSwgeyBmcmVlKGF2cCk7IGZyZWUoYW5zKTsgcmV0dXJuIF9fcmV0X187IH0gKTsKKwkJYW5zLT5tc2dfc2VzcyA9IHNlc3M7CisJCUNIRUNLX0ZDVF9ETyggZmRfc2Vzc19yZWZfbXNnKHNlc3MpLCB7IGZyZWUoYW5zKTsgcmV0dXJuIF9fcmV0X187IH0gICk7CisJfQorCQorCS8qIEFkZCBhbGwgUHJveHktSW5mbyBBVlBzIGZyb20gdGhlIHF1ZXJ5IGlmIGFueSAqLworCWlmICghIChmbGFncyAmIE1TR0ZMX0FOU1dfTk9QUk9YWUlORk8pKSB7CisJCXN0cnVjdCBhdnAgKiBhdnA7CisJCXN0cnVjdCBmZF9wZWkgcGVpOworCQlzdHJ1Y3QgZmRfbGlzdCBhdnBjcHlsaXN0ID0gRkRfTElTVF9JTklUSUFMSVpFUihhdnBjcHlsaXN0KTsKKwkJCisJCUNIRUNLX0ZDVF9ETyggIGZkX21zZ19icm93c2UocXJ5LCBNU0dfQlJXX0ZJUlNUX0NISUxELCAmYXZwLCBOVUxMKSAsIHsgZnJlZShhbnMpOyByZXR1cm4gX19yZXRfXzsgfSApOworCQl3aGlsZSAoYXZwKSB7CisJCQlpZiAoIChhdnAtPmF2cF9wdWJsaWMuYXZwX2NvZGUgICA9PSBBQ19QUk9YWV9JTkZPKQorCQkJICAmJiAoYXZwLT5hdnBfcHVibGljLmF2cF92ZW5kb3IgPT0gMCkgKSB7CisJCQkJLyogV2UgZm91bmQgYSBQcm94eS1JbmZvLCBuZWVkIHRvIGR1cGxpY2F0ZSBpdCBpbiB0aGUgYW5zd2VyICovCisKKwkJCQkvKiBJbiBvcmRlciB0byBhdm9pZCBkZWFsaW5nIHdpdGggYWxsIGRpZmZlcmVudCBwb3NzaWJpbGl0aWVzIG9mIHN0YXRlcywgd2UganVzdCBjcmVhdGUgYSBidWZmZXIgdGhlbiBwYXJzZSBpdCAqLworCQkJCXVuc2lnbmVkIGNoYXIgKiBidWYgPSBOVUxMOworCQkJCXNpemVfdCBvZmZzZXQgPSAwOworCisJCQkJLyogQ3JlYXRlIGEgYnVmZmVyIHdpdGggdGhlIGNvbnRlbnQgb2YgdGhlIEFWUC4gVGhpcyBpcyBlYXNpZXIgdGhhbiBnb2luZyB0aHJvdWdoIHRoZSBsaXN0ICovCisJCQkJQ0hFQ0tfRkNUX0RPKCAgZmRfbXNnX3VwZGF0ZV9sZW5ndGgoYXZwKSwgeyBmcmVlKGFucyk7IHJldHVybiBfX3JldF9fOyB9ICApOworCQkJCUNIRUNLX01BTExPQ19ETyggIGJ1ZiA9IG1hbGxvYyhhdnAtPmF2cF9wdWJsaWMuYXZwX2xlbiksIHsgZnJlZShhbnMpOyByZXR1cm4gX19yZXRfXzsgfSAgKTsKKwkJCQlDSEVDS19GQ1RfRE8oIGJ1ZmZlcml6ZV9hdnAoYnVmLCBhdnAtPmF2cF9wdWJsaWMuYXZwX2xlbiwgJm9mZnNldCwgYXZwKSwgeyBmcmVlKGJ1Zik7IGZyZWUoYW5zKTsgcmV0dXJuIF9fcmV0X187IH0gICk7CisKKwkJCQkvKiBOb3cgd2UgcGFyc2UgdGhpcyBidWZmZXIgdG8gY3JlYXRlIGEgY29weSBBVlAgKi8KKwkJCQlDSEVDS19GQ1RfRE8oIHBhcnNlYnVmX2xpc3QoYnVmLCBhdnAtPmF2cF9wdWJsaWMuYXZwX2xlbiwgJmF2cGNweWxpc3QpLCB7IGZyZWUoYnVmKTsgZnJlZShhbnMpOyByZXR1cm4gX19yZXRfXzsgfSApOworCQkJCQorCQkJCS8qIFBhcnNlIGRpY3Rpb25hcnkgb2JqZWN0cyBub3cgdG8gcmVtb3ZlIHRoZSBkZXBlbmRlbmN5IG9uIHRoZSBidWZmZXIgKi8KKwkJCQlDSEVDS19GQ1RfRE8oIHBhcnNlZGljdF9kb19jaGFpbihkaWN0LCAmYXZwY3B5bGlzdCwgMCwgJnBlaSksIHsgLyogbGVha2luZyB0aGUgYXZwY3B5bGlzdCAtLSB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4gYW55d2F5ICovIGZyZWUoYnVmKTsgZnJlZShhbnMpOyByZXR1cm4gX19yZXRfXzsgfSApOworCisJCQkJLyogRG9uZSBmb3IgdGhpcyBBVlAgKi8KKwkJCQlmcmVlKGJ1Zik7CisKKwkJCQkvKiBXZSBtb3ZlIHRoaXMgQVZQIG5vdyBzbyB0aGF0IHdlIGRvIG5vdCBwYXJzZSBhZ2FpbiBpbiBuZXh0IGxvb3AgKi8KKwkJCQlmZF9saXN0X21vdmVfZW5kKCZhbnMtPm1zZ19jaGFpbi5jaGlsZHJlbiwgJmF2cGNweWxpc3QpOworCQkJfQorCQkJLyogbW92ZSB0byBuZXh0IEFWUCBpbiB0aGUgbWVzc2FnZSwgd2UgY2FuIGhhdmUgc2V2ZXJhbCBQcm94eS1JbmZvIGluc3RhbmNlcyAqLworCQkJQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfYnJvd3NlKGF2cCwgTVNHX0JSV19ORVhULCAmYXZwLCBOVUxMKSwgeyBmcmVlKGFucyk7IHJldHVybiBfX3JldF9fOyB9ICk7CisJCX0KKwl9CisKKwkvKiBhc3NvY2lhdGUgd2l0aCBxdWVyeSAqLworCWFucy0+bXNnX3F1ZXJ5ID0gcXJ5OworCXFyeS0+bXNnX2Fzc29jaWF0ZWQgPSAxOworCQorCS8qIERvbmUgKi8KKwkqbXNnID0gYW5zOworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBFeHBsb3JlIGEgbWVzc2FnZSAqLworaW50IGZkX21zZ19icm93c2VfaW50ZXJuYWwgKCBtc2dfb3JfYXZwICogcmVmZXJlbmNlLCBlbnVtIG1zZ19icndfZGlyIGRpciwgbXNnX29yX2F2cCAqKiBmb3VuZCwgaW50ICogZGVwdGggKQoreworCXN0cnVjdCBtc2dfYXZwX2NoYWluICpyZXN1bHQgPSBOVUxMOworCWludCBkaWZmID0gMDsKKwlzdHJ1Y3QgZmRfbGlzdCAqbGkgPSBOVUxMOworCQorCVRSQUNFX0VOVFJZKCIlcCAlZCAlcCAlcCIsIHJlZmVyZW5jZSwgZGlyLCBmb3VuZCwgZGVwdGgpOworCQorCS8qIEluaXRpYWxpemUgdGhlICJmb3VuZCIgcmVzdWx0IGlmIGFueSAqLworCWlmIChmb3VuZCkKKwkJKmZvdW5kID0gTlVMTDsKKwkKKwkvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworCUNIRUNLX1BBUkFNUyggIFZBTElEQVRFX09CSihyZWZlcmVuY2UpICApOworCQorCVRSQUNFX0RFQlVHKEZDVFMsICJjaGFpbmluZyglcCk6IG54dDolcCBwcnY6JXAgaGVhOiVwIHRvcDolcCIsIAorCQkJJl9DKHJlZmVyZW5jZSktPmNoYWluaW5nLAorCQkJX0MocmVmZXJlbmNlKS0+Y2hhaW5pbmcubmV4dCwKKwkJCV9DKHJlZmVyZW5jZSktPmNoYWluaW5nLnByZXYsCisJCQlfQyhyZWZlcmVuY2UpLT5jaGFpbmluZy5oZWFkLAorCQkJX0MocmVmZXJlbmNlKS0+Y2hhaW5pbmcubyk7CisJVFJBQ0VfREVCVUcoRkNUUywgImNoaWxkcmVuKCVwKTogbnh0OiVwIHBydjolcCBoZWE6JXAgdG9wOiVwIiwgCisJCQkmX0MocmVmZXJlbmNlKS0+Y2hpbGRyZW4sCisJCQlfQyhyZWZlcmVuY2UpLT5jaGlsZHJlbi5uZXh0LAorCQkJX0MocmVmZXJlbmNlKS0+Y2hpbGRyZW4ucHJldiwKKwkJCV9DKHJlZmVyZW5jZSktPmNoaWxkcmVuLmhlYWQsCisJCQlfQyhyZWZlcmVuY2UpLT5jaGlsZHJlbi5vKTsKKworCS8qIE5vdyBzZWFyY2ggKi8KKwlzd2l0Y2ggKGRpcikgeworCQljYXNlIE1TR19CUldfTkVYVDoKKwkJCS8qIENoZWNrIHRoZSByZWZlcmVuY2UgaXMgYW4gQVZQICovCisJCQlDSEVDS19QQVJBTVMoICBfQyhyZWZlcmVuY2UpLT50eXBlID09IE1TR19BVlAgICk7CisKKwkJCWxpID0gJl9DKHJlZmVyZW5jZSktPmNoYWluaW5nOworCQkJCisJCQkvKiBDaGVjayBpZiB0aGUgbmV4dCBlbGVtZW50IGlzIG5vdCB0aGUgc2VudGluZWwgKCA9PT4gdGhlIHBhcmVudCkgKi8KKwkJCWlmIChsaS0+bmV4dCAhPSBsaS0+aGVhZCkKKwkJCQlyZXN1bHQgPSBfQyhsaS0+bmV4dC0+byk7CisJCQlicmVhazsKKworCQljYXNlIE1TR19CUldfUFJFVjoKKwkJCS8qIENoZWNrIHRoZSByZWZlcmVuY2UgaXMgYW4gQVZQICovCisJCQlDSEVDS19QQVJBTVMoICBfQyhyZWZlcmVuY2UpLT50eXBlID09IE1TR19BVlAgICk7CisKKwkJCWxpID0gJl9DKHJlZmVyZW5jZSktPmNoYWluaW5nOworCQkJCisJCQkvKiBDaGVjayBpZiB0aGUgcHJldiBlbGVtZW50IGlzIG5vdCB0aGUgc2VudGluZWwgKCA9PT4gdGhlIHBhcmVudCkgKi8KKwkJCWlmIChsaS0+cHJldiAhPSBsaS0+aGVhZCkKKwkJCQlyZXN1bHQgPSBfQyhsaS0+cHJldi0+byk7CisJCQlicmVhazsKKworCQljYXNlIE1TR19CUldfRklSU1RfQ0hJTEQ6CisJCQlsaSA9ICZfQyhyZWZlcmVuY2UpLT5jaGlsZHJlbjsKKwkJCWlmICghIEZEX0lTX0xJU1RfRU1QVFkobGkpKSB7CisJCQkJcmVzdWx0ID0gX0MobGktPm5leHQtPm8pOworCQkJCWRpZmYgPSAxOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBNU0dfQlJXX0xBU1RfQ0hJTEQ6CisJCQlsaSA9ICZfQyhyZWZlcmVuY2UpLT5jaGlsZHJlbjsKKwkJCWlmICghIEZEX0lTX0xJU1RfRU1QVFkobGkpKSB7CisJCQkJcmVzdWx0ID0gX0MobGktPnByZXYtPm8pOworCQkJCWRpZmYgPSAxOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBNU0dfQlJXX1BBUkVOVDoKKwkJCS8qIElmIHRoZSBvYmplY3QgaXMgbm90IGNoYWluZWQsIGl0IGhhcyBubyBwYXJlbnQgKi8KKwkJCWxpID0gJl9DKHJlZmVyZW5jZSktPmNoYWluaW5nOworCQkJaWYgKGxpICE9IGxpLT5oZWFkKSB7CisJCQkJLyogVGhlIHNlbnRpbmVsIGlzIHRoZSBwYXJlbnQncyBjaGlsZHJlbiBsaXN0ICovCisJCQkJcmVzdWx0ID0gX0MobGktPmhlYWQtPm8pOworCQkJCWRpZmYgPSAtMTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgTVNHX0JSV19XQUxLOgorCQkJLyogRmlyc3QsIHRyeSB0byBmaW5kIGEgY2hpbGQgKi8KKwkJCWxpID0gJl9DKHJlZmVyZW5jZSktPmNoaWxkcmVuOworCQkJaWYgKCAhIEZEX0lTX0xJU1RfRU1QVFkobGkpICkgeworCQkJCXJlc3VsdCA9IF9DKGxpLT5uZXh0LT5vKTsKKwkJCQlkaWZmID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCQorCQkJLyogVGhlbiB0cnkgdG8gZmluZCBhICJuZXh0IiBhdCB0aGlzIGxldmVsIG9yIG9uZSBvZiB0aGUgcGFyZW50J3MgKi8KKwkJCWxpID0gJl9DKHJlZmVyZW5jZSktPmNoYWluaW5nOworCQkJZG8geworCQkJCS8qIElmIHRoaXMgZWxlbWVudCBoYXMgYSAibmV4dCIgZWxlbWVudCwgcmV0dXJuIGl0ICovCisJCQkJaWYgKGxpLT5uZXh0ICE9IGxpLT5oZWFkKSB7CisJCQkJCXJlc3VsdCA9IF9DKGxpLT5uZXh0LT5vKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8qIG90aGVyd2lzZSwgY2hlY2sgaWYgd2UgaGF2ZSBhIHBhcmVudCAqLworCQkJCWlmIChsaSA9PSBsaS0+aGVhZCkgeworCQkJCQkvKiBubyBwYXJlbnQgKi8KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8qIEdvIHRvIHRoZSBwYXJlbnQncyBjaGFpbmluZyBpbmZvcm1hdGlvbiBhbmQgbG9vcCAqLworCQkJCWRpZmYgLT0gMTsKKwkJCQlsaSA9ICZfQyhsaS0+aGVhZC0+byktPmNoYWluaW5nOworCQkJfSB3aGlsZSAoMSk7IAorCQkJYnJlYWs7CisJCQkKKwkJZGVmYXVsdDoKKwkJCS8qIE90aGVyIGRpcmVjdGlvbnMgYXJlIGludmFsaWQgKi8KKwkJCUNIRUNLX1BBUkFNUyggZGlyID0gMCApOworCX0KKwkKKwkvKiBTYXZlIHRoZSBmb3VuZCBvYmplY3QsIGlmIGFueSAqLworCWlmIChmb3VuZCAmJiByZXN1bHQpCisJCSpmb3VuZCA9ICh2b2lkICopcmVzdWx0OworCQorCS8qIE1vZGlmeSB0aGUgZGVwdGggYWNjb3JkaW5nIHRvIHRoZSB3YWxrIGRpcmVjdGlvbiAqLworCWlmIChkZXB0aCAmJiBkaWZmKQorCQkoKmRlcHRoKSArPSBkaWZmOworCQorCS8qIFJldHVybiBFTk9FTlQgaWYgZm91bmQgd2FzIE5VTEwgKi8KKwlpZiAoKCFmb3VuZCkgJiYgKCFyZXN1bHQpKQorCQlyZXR1cm4gRU5PRU5UOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKKy8qIEFkZCBhbiBBVlAgaW50byBhIHRyZWUgKi8KK2ludCBmZF9tc2dfYXZwX2FkZCAoIG1zZ19vcl9hdnAgKiByZWZlcmVuY2UsIGVudW0gbXNnX2Jyd19kaXIgZGlyLCBzdHJ1Y3QgYXZwICphdnApCit7CisJVFJBQ0VfRU5UUlkoIiVwICVkICVwIiwgcmVmZXJlbmNlLCBkaXIsIGF2cCk7CisJCisJLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKwlDSEVDS19QQVJBTVMoICBWQUxJREFURV9PQkoocmVmZXJlbmNlKSAgJiYgIENIRUNLX0FWUChhdnApICAmJiAgRkRfSVNfTElTVF9FTVBUWSgmYXZwLT5hdnBfY2hhaW4uY2hhaW5pbmcpICApOworCQorCS8qIE5vdyBpbnNlcnQgKi8KKwlzd2l0Y2ggKGRpcikgeworCQljYXNlIE1TR19CUldfTkVYVDoKKwkJCS8qIENoZWNrIHRoZSByZWZlcmVuY2UgaXMgYW4gQVZQIC0tIHdlIGRvIG5vdCBjaGFpbiBBVlBzIGF0IHNhbWUgbGV2ZWwgYXMgbXNncy4gKi8KKwkJCUNIRUNLX1BBUkFNUyggIF9DKHJlZmVyZW5jZSktPnR5cGUgPT0gTVNHX0FWUCAgKTsKKwkJCQorCQkJLyogSW5zZXJ0IHRoZSBuZXcgYXZwIGFmdGVyIHRoZSByZWZlcmVuY2UgKi8KKwkJCWZkX2xpc3RfaW5zZXJ0X2FmdGVyKCAmX0EocmVmZXJlbmNlKS0+YXZwX2NoYWluLmNoYWluaW5nLCAmYXZwLT5hdnBfY2hhaW4uY2hhaW5pbmcgKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTVNHX0JSV19QUkVWOgorCQkJLyogQ2hlY2sgdGhlIHJlZmVyZW5jZSBpcyBhbiBBVlAgKi8KKwkJCUNIRUNLX1BBUkFNUyggIF9DKHJlZmVyZW5jZSktPnR5cGUgPT0gTVNHX0FWUCAgKTsKKwkJCQorCQkJLyogSW5zZXJ0IHRoZSBuZXcgYXZwIGJlZm9yZSB0aGUgcmVmZXJlbmNlICovCisJCQlmZF9saXN0X2luc2VydF9iZWZvcmUoICZfQShyZWZlcmVuY2UpLT5hdnBfY2hhaW4uY2hhaW5pbmcsICZhdnAtPmF2cF9jaGFpbi5jaGFpbmluZyApOworCQkJYnJlYWs7CisKKwkJY2FzZSBNU0dfQlJXX0ZJUlNUX0NISUxEOgorCQkJLyogSW5zZXJ0IHRoZSBuZXcgYXZwIGFmdGVyIHRoZSBjaGlsZHJlbiBzZW50aW5lbCAqLworCQkJZmRfbGlzdF9pbnNlcnRfYWZ0ZXIoICZfQyhyZWZlcmVuY2UpLT5jaGlsZHJlbiwgJmF2cC0+YXZwX2NoYWluLmNoYWluaW5nICk7CisJCQlicmVhazsKKworCQljYXNlIE1TR19CUldfTEFTVF9DSElMRDoKKwkJCS8qIEluc2VydCB0aGUgbmV3IGF2cCBiZWZvcmUgdGhlIGNoaWxkcmVuIHNlbnRpbmVsICovCisJCQlmZF9saXN0X2luc2VydF9iZWZvcmUoICZfQyhyZWZlcmVuY2UpLT5jaGlsZHJlbiwgJmF2cC0+YXZwX2NoYWluLmNoYWluaW5nICk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJLyogT3RoZXIgZGlyZWN0aW9ucyBhcmUgaW52YWxpZCAqLworCQkJQ0hFQ0tfUEFSQU1TKCBkaXIgPSAwICk7CisJfQorCQkJCisJcmV0dXJuIDA7Cit9CisKKy8qIFNlYXJjaCBhIGdpdmVuIEFWUCBtb2RlbCBpbiBhIG1lc3NhZ2UgKi8KK2ludCBmZF9tc2dfc2VhcmNoX2F2cCAoIHN0cnVjdCBtc2cgKiBtc2csIHN0cnVjdCBkaWN0X29iamVjdCAqIHdoYXQsIHN0cnVjdCBhdnAgKiogYXZwICkKK3sKKwlzdHJ1Y3QgYXZwICogbmV4dGF2cDsKKwlzdHJ1Y3QgZGljdF9hdnBfZGF0YSAJZGljdGRhdGE7CisJZW51bSBkaWN0X29iamVjdF90eXBlIAlkaWN0dHlwZTsKKwkKKwlUUkFDRV9FTlRSWSgiJXAgJXAgJXAiLCBtc2csIHdoYXQsIGF2cCk7CisJCisJQ0hFQ0tfUEFSQU1TKCBDSEVDS19NU0cobXNnKSAmJiB3aGF0ICk7CisJCisJQ0hFQ0tfUEFSQU1TKCAoZmRfZGljdF9nZXR0eXBlKHdoYXQsICZkaWN0dHlwZSkgPT0gMCkgJiYgKGRpY3R0eXBlID09IERJQ1RfQVZQKSApOworCUNIRUNLX0ZDVCggIGZkX2RpY3RfZ2V0dmFsKHdoYXQsICZkaWN0ZGF0YSkgICk7CisJCisJLyogTG9vcCBvbiBhbGwgdG9wIEFWUHMgKi8KKwlDSEVDS19GQ1QoICBmZF9tc2dfYnJvd3NlKG1zZywgTVNHX0JSV19GSVJTVF9DSElMRCwgKHZvaWQgKikmbmV4dGF2cCwgTlVMTCkgICk7CisJd2hpbGUgKG5leHRhdnApIHsKKwkJCisJCWlmICggKG5leHRhdnAtPmF2cF9wdWJsaWMuYXZwX2NvZGUgICA9PSBkaWN0ZGF0YS5hdnBfY29kZSkKKwkJICAmJiAobmV4dGF2cC0+YXZwX3B1YmxpYy5hdnBfdmVuZG9yID09IGRpY3RkYXRhLmF2cF92ZW5kb3IpICkgLyogYWx3YXlzIDAgaWYgbm8gViBmbGFnICovCisJCQlicmVhazsKKwkJCisJCS8qIE90aGVyd2lzZSBtb3ZlIHRvIG5leHQgQVZQIGluIHRoZSBtZXNzYWdlICovCisJCUNIRUNLX0ZDVCggZmRfbXNnX2Jyb3dzZShuZXh0YXZwLCBNU0dfQlJXX05FWFQsICh2b2lkICopJm5leHRhdnAsIE5VTEwpICk7CisJfQorCQorCWlmIChhdnApCisJCSphdnAgPSBuZXh0YXZwOworCQorCWlmIChhdnAgJiYgbmV4dGF2cCkgeworCQlzdHJ1Y3QgZGljdGlvbmFyeSAqIGRpY3Q7CisJCUNIRUNLX0ZDVCggZmRfZGljdF9nZXRkaWN0KCB3aGF0LCAmZGljdCkgKTsKKwkJQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfcGFyc2VfZGljdCggbmV4dGF2cCwgZGljdCwgTlVMTCApLCAvKiBub3RoaW5nICovICk7CisJfQorCQorCWlmIChhdnAgfHwgbmV4dGF2cCkKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gRU5PRU5UOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEZWxldGluZyBvYmplY3RzICovCisKKy8qIERlc3Ryb3kgYW5kIGZyZWUgYW4gQVZQIG9yIG1lc3NhZ2UgKi8KK3N0YXRpYyBpbnQgZGVzdHJveV9vYmogKHN0cnVjdCBtc2dfYXZwX2NoYWluICogb2JqICkKK3sKKwlUUkFDRV9FTlRSWSgiJXAiLCBvYmopOworCQorCS8qIENoZWNrIHRoZSBwYXJhbWV0ZXIgaXMgYSB2YWxpZCBvYmplY3QgKi8KKwlDSEVDS19QQVJBTVMoICBWQUxJREFURV9PQkoob2JqKSAmJiBGRF9JU19MSVNUX0VNUFRZKCAmb2JqLT5jaGlsZHJlbiApICk7CisKKwkvKiBVbmxpbmsgdGhpcyBvYmplY3QgaWYgbmVlZGVkICovCisJZmRfbGlzdF91bmxpbmsoICZvYmotPmNoYWluaW5nICk7CisJCisJLyogRnJlZSB0aGUgb2N0ZXRzdHJpbmcgaWYgbmVlZGVkICovCisJaWYgKChvYmotPnR5cGUgPT0gTVNHX0FWUCkgJiYgKF9BKG9iaiktPmF2cF9tdXN0ZnJlZW9zID09IDEpKSB7CisJCWZyZWUoX0Eob2JqKS0+YXZwX3N0b3JhZ2Uub3MuZGF0YSk7CisJfQorCS8qIEZyZWUgdGhlIHJhd2RhdGEgaWYgbmVlZGVkICovCisJaWYgKChvYmotPnR5cGUgPT0gTVNHX0FWUCkgJiYgKF9BKG9iaiktPmF2cF9yYXdkYXRhICE9IE5VTEwpKSB7CisJCWZyZWUoX0Eob2JqKS0+YXZwX3Jhd2RhdGEpOworCX0KKwlpZiAoKG9iai0+dHlwZSA9PSBNU0dfTVNHKSAmJiAoX00ob2JqKS0+bXNnX3Jhd2J1ZmZlciAhPSBOVUxMKSkgeworCQlmcmVlKF9NKG9iaiktPm1zZ19yYXdidWZmZXIpOworCX0KKwkKKwlpZiAoKG9iai0+dHlwZSA9PSBNU0dfTVNHKSAmJiAoX00ob2JqKS0+bXNnX3NyY19pZCAhPSBOVUxMKSkgeworCQlmcmVlKF9NKG9iaiktPm1zZ19zcmNfaWQpOworCX0KKwkKKwlpZiAoKG9iai0+dHlwZSA9PSBNU0dfTVNHKSAmJiAoX00ob2JqKS0+bXNnX3J0ZGF0YSAhPSBOVUxMKSkgeworCQlmZF9ydGRfZnJlZSgmX00ob2JqKS0+bXNnX3J0ZGF0YSk7CisJfQorCQorCWlmICgob2JqLT50eXBlID09IE1TR19NU0cpICYmIChfTShvYmopLT5tc2dfc2VzcyAhPSBOVUxMKSkgeworCQlDSEVDS19GQ1RfRE8oIGZkX3Nlc3NfcmVjbGFpbV9tc2cgKCAmX00ob2JqKS0+bXNnX3Nlc3MgKSwgLyogY29udGludWUgKi8pOworCX0KKwkKKwlpZiAoKG9iai0+dHlwZSA9PSBNU0dfTVNHKSAmJiAoX00ob2JqKS0+bXNnX3BtZGwuc2VudGluZWwubyAhPSBOVUxMKSkgeworCQkoKHZvaWQgKCopKHN0cnVjdCBmZF9tc2dfcG1kbCAqKSlfTShvYmopLT5tc2dfcG1kbC5zZW50aW5lbC5vKSgmX00ob2JqKS0+bXNnX3BtZGwpOworCX0KKwkKKwkvKiBmcmVlIHRoZSBvYmplY3QgKi8KKwlmcmVlKG9iaik7CisJCisJcmV0dXJuIDA7Cit9CisKKy8qIERlc3Ryb3kgYW4gb2JqZWN0IGFuZCBhbGwgaXRzIGNoaWxkcmVuICovCitzdGF0aWMgdm9pZCBkZXN0cm95X3RyZWUoc3RydWN0IG1zZ19hdnBfY2hhaW4gKiBvYmopCit7CisJc3RydWN0IGZkX2xpc3QgKnJlbTsKKwkKKwlUUkFDRV9FTlRSWSgiJXAiLCBvYmopOworCQorCS8qIERlc3Ryb3kgYW55IHN1YnRyZWUgKi8KKwl3aGlsZSAoIChyZW0gPSBvYmotPmNoaWxkcmVuLm5leHQpICE9ICZvYmotPmNoaWxkcmVuKQorCQlkZXN0cm95X3RyZWUoX0MocmVtLT5vKSk7CisJCisJLyogVGhlbiB1bmxpbmsgYW5kIGRlc3Ryb3kgdGhlIG9iamVjdCAqLworCUNIRUNLX0ZDVF9ETyggIGRlc3Ryb3lfb2JqKG9iaiksICAvKiBub3RoaW5nICovICApOworfQorCisvKiBGcmVlIGFuIG9iamVjdCBhbmQgaXRzIHRyZWUgKi8KK2ludCBmZF9tc2dfZnJlZSAoIG1zZ19vcl9hdnAgKiBvYmplY3QgKQoreworCVRSQUNFX0VOVFJZKCIlcCIsIG9iamVjdCk7CisJCisJaWYgKG9iamVjdCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwkKKwlpZiAoQ0hFQ0tfTVNHKG9iamVjdCkpIHsKKwkJaWYgKF9NKG9iamVjdCktPm1zZ19xdWVyeSkgeworCQkJX00oX00ob2JqZWN0KS0+bXNnX3F1ZXJ5KS0+bXNnX2Fzc29jaWF0ZWQgPSAwOworCQkJQ0hFQ0tfRkNUKCAgZmRfbXNnX2ZyZWUoIF9NKG9iamVjdCktPm1zZ19xdWVyeSApICApOworCQkJX00ob2JqZWN0KS0+bXNnX3F1ZXJ5ID0gTlVMTDsKKwkJfSBlbHNlIHsKKwkJCWlmIChfTShvYmplY3QpLT5tc2dfYXNzb2NpYXRlZCkgeworCQkJCVRSQUNFX0RFQlVHKElORk8sICJOb3QgZnJlZWluZyBxdWVyeSAlcCByZWZlcmVuY2VkIGluIGFuIGFuc3dlciAod2lsbCBiZSBmcmVlZCBhbG9uZyB0aGUgYW5zd2VyKS4iLCBvYmplY3QpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJfQorCQorCWRlc3Ryb3lfdHJlZShfQyhvYmplY3QpKTsKKwlyZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRGVidWcgZnVuY3Rpb25zOiBkdW1waW5nICovCisKKy8qIG1lc3NhZ2VzIGFuZCBBVlAgZm9ybWF0dGVycyAqLwordHlwZWRlZiBERUNMQVJFX0ZEX0RVTVBfUFJPVE9UWVBFKCAoKm1zZ19kdW1wX2Zvcm1hdHRlcl9tc2cpLCBzdHJ1Y3QgbXNnICogbXNnICk7Cit0eXBlZGVmIERFQ0xBUkVfRkRfRFVNUF9QUk9UT1RZUEUoICgqbXNnX2R1bXBfZm9ybWF0dGVyX2F2cCksIHN0cnVjdCBhdnAgKiBhdnAsIGludCBsZXZlbCwgaW50IGZpcnN0LCBpbnQgbGFzdCApOworCisvKiBDb3JlIGZ1bmN0aW9uIHRvIHByb2Nlc3MgdGhlIGR1bXBpbmcgKi8KK3N0YXRpYyBERUNMQVJFX0ZEX0RVTVBfUFJPVE9UWVBFKCBtc2dfZHVtcF9wcm9jZXNzLCBtc2dfZHVtcF9mb3JtYXR0ZXJfbXNnIG1zZ19mb3JtYXQsIG1zZ19kdW1wX2Zvcm1hdHRlcl9hdnAgYXZwX2Zvcm1hdCwgbXNnX29yX2F2cCAqb2JqLCBzdHJ1Y3QgZGljdGlvbmFyeSAqZGljdCwgaW50IGZvcmNlX3BhcnNpbmcsIGludCByZWN1cnNlICkKK3sKKwlGRF9EVU1QX0hBTkRMRV9PRkZTRVQoKTsKKwkJCisJaWYgKCFWQUxJREFURV9PQkoob2JqKSkgeworCQlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICJJTlZBTElEIE1FU1NBR0UgT1IgQVZQIEAlcCIsIG9iaiksIHJldHVybiBOVUxMKTsKKwkJcmV0dXJuICpidWY7CisJfQorCQorCWlmIChmb3JjZV9wYXJzaW5nKSB7CisJCSh2b2lkKSBmZF9tc2dfcGFyc2VfZGljdChvYmosIGRpY3QsIE5VTEwpOworCX0KKwkKKwlzd2l0Y2ggKF9DKG9iaiktPnR5cGUpIHsKKwkJY2FzZSBNU0dfQVZQOgorCQkJQ0hFQ0tfTUFMTE9DX0RPKCAoKmF2cF9mb3JtYXQpKEZEX0RVTVBfU1REX1BBUkFNUywgKHN0cnVjdCBhdnAgKilvYmosIDAsIDEsIDEpLCByZXR1cm4gTlVMTCk7CisJCQlicmVhazsKKworCQljYXNlIE1TR19NU0c6CisJCQlDSEVDS19NQUxMT0NfRE8oICgqbXNnX2Zvcm1hdCkoRkRfRFVNUF9TVERfUEFSQU1TLCAoc3RydWN0IG1zZyAqKW9iaiksIHJldHVybiBOVUxMKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlBU1NFUlQoMCk7CisJCQlmcmVlKCpidWYpOworCQkJKmJ1ZiA9IE5VTEw7CisJCQlyZXR1cm4gTlVMTDsKKwl9CisJCQorCWlmIChyZWN1cnNlKSB7CisJCXN0cnVjdCBhdnAgKiBhdnAgPSBOVUxMOworCQlpbnQgZmlyc3QgPSAxOworCQlDSEVDS19GQ1RfRE8oICBmZF9tc2dfYnJvd3NlICggb2JqLCBNU0dfQlJXX0ZJUlNUX0NISUxELCAmYXZwLCBOVUxMICksIGF2cCA9IE5VTEwgKTsKKwkJd2hpbGUgKGF2cCkgeworCQkJc3RydWN0IGF2cCAqIG5leHRhdnAgPSBOVUxMOworCQkJQ0hFQ0tfRkNUX0RPKCAgZmRfbXNnX2Jyb3dzZSAoIGF2cCwgTVNHX0JSV19ORVhULCAmbmV4dGF2cCwgTlVMTCApLCBuZXh0YXZwID0gTlVMTCAgKTsKKwkJCUNIRUNLX01BTExPQ19ETyggKCphdnBfZm9ybWF0KShGRF9EVU1QX1NURF9QQVJBTVMsIGF2cCwgMSwgZmlyc3QsIG5leHRhdnAgPyAwIDogMSksIHJldHVybiBOVUxMKTsKKwkJCWF2cCA9IG5leHRhdnA7CisJCQlmaXJzdCA9IDA7CisJCX07CisJfQorCQorCXJldHVybiAqYnVmOworfQorCisvKgorICogVHJlZSBWaWV3IG1lc3NhZ2UgZHVtcAorICovCitzdGF0aWMgREVDTEFSRV9GRF9EVU1QX1BST1RPVFlQRSggbXNnX2Zvcm1hdF90cmVldmlldywgc3RydWN0IG1zZyAqIG1zZyApCit7CisJaWYgKCFDSEVDS19NU0cobXNnKSkgeworCQlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICJJTlZBTElEIE1FU1NBR0UiKSwgcmV0dXJuIE5VTEwpOworCQlyZXR1cm4gKmJ1ZjsKKwl9CisJCisJaWYgKCFtc2ctPm1zZ19tb2RlbCkgeworCQlpZiAobXNnLT5tc2dfbW9kZWxfbm90X2ZvdW5kLm1uZl9jb2RlKSB7CisJCQlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICIobm90IGZvdW5kIGluIGRpY3Rpb25hcnkpXG4iKSwgcmV0dXJuIE5VTEwpOworCQl9IGVsc2UgeworCQkJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9kdW1wX2V4dGVuZCggRkRfRFVNUF9TVERfUEFSQU1TLCAiKG5vdCBzZWFyY2hlZCBpbiBkaWN0aW9uYXJ5KVxuIiksIHJldHVybiBOVUxMKTsKKwkJfQorCX0gZWxzZSB7CisJCWVudW0gZGljdF9vYmplY3RfdHlwZSBkaWN0dHlwZTsKKwkJc3RydWN0IGRpY3RfY21kX2RhdGEgIGRpY3RkYXRhOworCQlpZiAoZmRfZGljdF9nZXR0eXBlKG1zZy0+bXNnX21vZGVsLCAmZGljdHR5cGUpIHx8IChkaWN0dHlwZSAhPSBESUNUX0NPTU1BTkQpKSB7CisJCQlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICIoaW52YWxpZCBtb2RlbCBpbmZvcm1hdGlvbilcbiIpLCByZXR1cm4gTlVMTCk7CisJCX0gZWxzZSBpZiAoZmRfZGljdF9nZXR2YWwobXNnLT5tc2dfbW9kZWwsICZkaWN0ZGF0YSkpIHsKKwkJCUNIRUNLX01BTExPQ19ETyggZmRfZHVtcF9leHRlbmQoIEZEX0RVTVBfU1REX1BBUkFNUywgIihlcnJvciBnZXR0aW5nIG1vZGVsIGluZm9ybWF0aW9uKVxuIiksIHJldHVybiBOVUxMKTsKKwkJfSBlbHNlIHsKKwkJCUNIRUNLX01BTExPQ19ETyggZmRfZHVtcF9leHRlbmQoIEZEX0RVTVBfU1REX1BBUkFNUywgIiclcydcbiIsIGRpY3RkYXRhLmNtZF9uYW1lKSwgcmV0dXJuIE5VTEwpOworCQl9CisJfQorCQkKKwlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICIgIFZlcnNpb246IDB4JTAyaGhYXG4iLCBtc2ctPm1zZ19wdWJsaWMubXNnX3ZlcnNpb24pLCByZXR1cm4gTlVMTCk7CisJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9kdW1wX2V4dGVuZCggRkRfRFVNUF9TVERfUEFSQU1TLCAiICBMZW5ndGg6ICVkXG4iLCBtc2ctPm1zZ19wdWJsaWMubXNnX2xlbmd0aCksIHJldHVybiBOVUxMKTsKKwlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICIgIEZsYWdzOiAweCUwMmhoWCAoIiBEVU1QX0NNREZMX3N0ciAiKVxuIiwgbXNnLT5tc2dfcHVibGljLm1zZ19mbGFncywgRFVNUF9DTURGTF92YWwobXNnLT5tc2dfcHVibGljLm1zZ19mbGFncykpLCByZXR1cm4gTlVMTCk7CisJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9kdW1wX2V4dGVuZCggRkRfRFVNUF9TVERfUEFSQU1TLCAiICBDb21tYW5kIENvZGU6ICV1XG4iLCBtc2ctPm1zZ19wdWJsaWMubXNnX2NvZGUpLCByZXR1cm4gTlVMTCk7CisJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9kdW1wX2V4dGVuZCggRkRfRFVNUF9TVERfUEFSQU1TLCAiICBBcHBsaWNhdGlvbklkOiAlZFxuIiwgbXNnLT5tc2dfcHVibGljLm1zZ19hcHBsKSwgcmV0dXJuIE5VTEwpOworCUNIRUNLX01BTExPQ19ETyggZmRfZHVtcF9leHRlbmQoIEZEX0RVTVBfU1REX1BBUkFNUywgIiAgSG9wLWJ5LUhvcCBJZGVudGlmaWVyOiAweCUwOFhcbiIsIG1zZy0+bXNnX3B1YmxpYy5tc2dfaGJoaWQpLCByZXR1cm4gTlVMTCk7CisJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9kdW1wX2V4dGVuZCggRkRfRFVNUF9TVERfUEFSQU1TLCAiICBFbmQtdG8tRW5kIElkZW50aWZpZXI6IDB4JTA4WFxuIiwgbXNnLT5tc2dfcHVibGljLm1zZ19ldGVpZCksIHJldHVybiBOVUxMKTsKKwlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICIgICB7aW50ZXJuYWwgZGF0YX06IHNyYzolcyglemQpIHJ3YjolcCBydDolZCBjYjolcCwlcCglcCkgcXJ5OiVwIGFzc286JWQgc2VzczolcCIsIG1zZy0+bXNnX3NyY19pZD86IihuaWwpIiwgbXNnLT5tc2dfc3JjX2lkX2xlbiwgbXNnLT5tc2dfcmF3YnVmZmVyLCBtc2ctPm1zZ19yb3V0YWJsZSwgbXNnLT5tc2dfY2IuYW5zY2IsIG1zZy0+bXNnX2NiLmV4cGlyZWNiLCBtc2ctPm1zZ19jYi5kYXRhLCBtc2ctPm1zZ19xdWVyeSwgbXNnLT5tc2dfYXNzb2NpYXRlZCwgbXNnLT5tc2dfc2VzcyksIHJldHVybiBOVUxMKTsKKwkKKwlyZXR1cm4gKmJ1ZjsKK30KKworc3RhdGljIERFQ0xBUkVfRkRfRFVNUF9QUk9UT1RZUEUoIGF2cF9mb3JtYXRfdHJlZXZpZXcsIHN0cnVjdCBhdnAgKiBhdnAsIGludCBsZXZlbCwgaW50IGZpcnN0LCBpbnQgbGFzdCApCit7CisJY2hhciAqIG5hbWU7CisJc3RydWN0IGRpY3RfYXZwX2RhdGEgIGRpY3RkYXRhOworCXN0cnVjdCBkaWN0X2F2cF9kYXRhICpkaWN0aW5mbyA9IE5VTEw7CisJc3RydWN0IGRpY3RfdmVuZG9yX2RhdGEgIHZlbmRvcmRhdGE7CisJc3RydWN0IGRpY3RfdmVuZG9yX2RhdGEgKnZlbmRvcmluZm8gPSBOVUxMOworCQorCWlmIChsZXZlbCkgeworCQlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICJcbiIpLCByZXR1cm4gTlVMTCk7CisJfQorCQorCWlmICghQ0hFQ0tfQVZQKGF2cCkpIHsKKwkJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9kdW1wX2V4dGVuZCggRkRfRFVNUF9TVERfUEFSQU1TLCAiSU5WQUxJRCBBVlAiKSwgcmV0dXJuIE5VTEwpOworCQlyZXR1cm4gKmJ1ZjsKKwl9CisJCisJaWYgKGxldmVsKSB7CisJCUNIRUNLX01BTExPQ19ETyggZmRfZHVtcF9leHRlbmQoIEZEX0RVTVBfU1REX1BBUkFNUywgIiUqc0FWUDogIiwgbGV2ZWwgKiAzLCAiIiksIHJldHVybiBOVUxMKTsKKwl9CisJCisJaWYgKCFhdnAtPmF2cF9tb2RlbCkgeworCQlpZiAoYXZwLT5hdnBfbW9kZWxfbm90X2ZvdW5kLm1uZl9jb2RlKSB7CisJCQluYW1lID0gIihub3QgZm91bmQgaW4gZGljdGlvbmFyeSkiOworCQl9IGVsc2UgeworCQkJbmFtZSA9ICIobm90IHNlYXJjaGVkIGluIGRpY3Rpb25hcnkpIjsKKwkJfQorCX0gZWxzZSB7CisJCWVudW0gZGljdF9vYmplY3RfdHlwZSBkaWN0dHlwZTsKKwkJaWYgKGZkX2RpY3RfZ2V0dHlwZShhdnAtPmF2cF9tb2RlbCwgJmRpY3R0eXBlKSB8fCAoZGljdHR5cGUgIT0gRElDVF9BVlApKSB7CisJCQluYW1lID0gIihpbnZhbGlkIG1vZGVsIGluZm9ybWF0aW9uKSI7CisJCX0gZWxzZSBpZiAoZmRfZGljdF9nZXR2YWwoYXZwLT5hdnBfbW9kZWwsICZkaWN0ZGF0YSkpIHsKKwkJCW5hbWUgPSAiKGVycm9yIGdldHRpbmcgbW9kZWwgaW5mb3JtYXRpb24pIjsKKwkJfSBlbHNlIHsKKwkJCW5hbWUgPSBkaWN0ZGF0YS5hdnBfbmFtZTsKKwkJCWRpY3RpbmZvID0gJmRpY3RkYXRhOworCQkJaWYgKGF2cC0+YXZwX3B1YmxpYy5hdnBfZmxhZ3MgJiBBVlBfRkxBR19WRU5ET1IpIHsKKwkJCQlzdHJ1Y3QgZGljdGlvbmFyeSAqIGRpY3Q7CisJCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogdmVuZG9yOworCQkJCWlmICgoIWZkX2RpY3RfZ2V0ZGljdChhdnAtPmF2cF9tb2RlbCwgJmRpY3QpKQorCQkJCSYmICghZmRfZGljdF9zZWFyY2goZGljdCwgRElDVF9WRU5ET1IsIFZFTkRPUl9PRl9BVlAsIGF2cC0+YXZwX21vZGVsLCAmdmVuZG9yLCBFTk9FTlQpKQorCQkJCSYmICghZmRfZGljdF9nZXR2YWwodmVuZG9yLCAmdmVuZG9yZGF0YSkpKSB7CisJCQkJCXZlbmRvcmluZm8gPSAmdmVuZG9yZGF0YTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJCisJaWYgKGRpY3RpbmZvKSB7CisJCUNIRUNLX01BTExPQ19ETyggZmRfZHVtcF9leHRlbmQoIEZEX0RVTVBfU1REX1BBUkFNUywgIiclcycoJXUpIiwgbmFtZSwgYXZwLT5hdnBfcHVibGljLmF2cF9jb2RlKSwgcmV0dXJuIE5VTEwpOworCX0gZWxzZSB7CisJCUNIRUNLX01BTExPQ19ETyggZmRfZHVtcF9leHRlbmQoIEZEX0RVTVBfU1REX1BBUkFNUywgIiV1JXMiLCBhdnAtPmF2cF9wdWJsaWMuYXZwX2NvZGUsIG5hbWUpLCByZXR1cm4gTlVMTCk7CisJfQorCQorCWlmIChhdnAtPmF2cF9wdWJsaWMuYXZwX2ZsYWdzICYgQVZQX0ZMQUdfVkVORE9SKSB7CisJCWlmICh2ZW5kb3JpbmZvKSB7CisJCQlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICIgdmVuZD0nJXMnKCV1KSIsIHZlbmRvcmluZm8tPnZlbmRvcl9uYW1lLCBhdnAtPmF2cF9wdWJsaWMuYXZwX3ZlbmRvciksIHJldHVybiBOVUxMKTsKKwkJfSBlbHNlIHsKKwkJCUNIRUNLX01BTExPQ19ETyggZmRfZHVtcF9leHRlbmQoIEZEX0RVTVBfU1REX1BBUkFNUywgIiB2ZW5kPSV1IiwgYXZwLT5hdnBfcHVibGljLmF2cF92ZW5kb3IpLCByZXR1cm4gTlVMTCk7CisJCX0KKwl9CisKKwlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICIgbD0lZCBmPSIgRFVNUF9BVlBGTF9zdHIgIiB2YWw9IiwgYXZwLT5hdnBfcHVibGljLmF2cF9sZW4sIERVTVBfQVZQRkxfdmFsKGF2cC0+YXZwX3B1YmxpYy5hdnBfZmxhZ3MpKSwgcmV0dXJuIE5VTEwpOworCQorCWlmIChkaWN0aW5mbyAmJiAoZGljdGluZm8tPmF2cF9iYXNldHlwZSA9PSBBVlBfVFlQRV9HUk9VUEVEKSkgeworCQlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICIoZ3JvdXBlZCkiKSwgcmV0dXJuIE5VTEwpOworCQlpZiAobGV2ZWwpIHsKKwkJCXN0cnVjdCBhdnAgKiBpbmF2cCA9IE5VTEw7CisJCQlpbnQgZmlyc3QgPSAxOworCQkJQ0hFQ0tfRkNUX0RPKCAgZmRfbXNnX2Jyb3dzZSAoIGF2cCwgTVNHX0JSV19GSVJTVF9DSElMRCwgJmluYXZwLCBOVUxMICksIGluYXZwID0gTlVMTCApOworCQkJd2hpbGUgKGluYXZwKSB7CisJCQkJc3RydWN0IGF2cCAqIG5leHRhdnAgPSBOVUxMOworCQkJCUNIRUNLX0ZDVF9ETyggIGZkX21zZ19icm93c2UgKCBpbmF2cCwgTVNHX0JSV19ORVhULCAmbmV4dGF2cCwgTlVMTCApLCBpbmF2cCA9IE5VTEwgICk7CisJCQkJQ0hFQ0tfTUFMTE9DX0RPKCBhdnBfZm9ybWF0X3RyZWV2aWV3KEZEX0RVTVBfU1REX1BBUkFNUywgaW5hdnAsIGxldmVsICsgMSwgZmlyc3QsIG5leHRhdnAgPyAwIDogMSksIHJldHVybiBOVUxMKTsKKwkJCQlpbmF2cCA9IG5leHRhdnA7CisJCQkJZmlyc3QgPSAwOworCQkJfTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChhdnAtPmF2cF9wdWJsaWMuYXZwX3ZhbHVlKSB7CisJCQlDSEVDS19NQUxMT0NfRE8oIGZkX2RpY3RfZHVtcF9hdnBfdmFsdWUoRkRfRFVNUF9TVERfUEFSQU1TLCBhdnAtPmF2cF9wdWJsaWMuYXZwX3ZhbHVlLCBhdnAtPmF2cF9tb2RlbCwgMCwgMCksIHJldHVybiBOVUxMKTsKKwkJfSBlbHNlIGlmIChhdnAtPmF2cF9yYXdkYXRhKSB7CisJCQlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kX2hleGR1bXAoRkRfRFVNUF9TVERfUEFSQU1TLCBhdnAtPmF2cF9yYXdkYXRhLCBhdnAtPmF2cF9yYXdsZW4sIDAsIDApLCByZXR1cm4gTlVMTCk7CisJCX0gZWxzZSB7CisJCQlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICIobm90IHNldCkiKSwgcmV0dXJuIE5VTEwpOworCQl9CisJfQorCisJcmV0dXJuICpidWY7Cit9CisKKy8qIG11bHRpLWxpbmUgaHVtYW4tcmVhZGFibGUgZHVtcCBzaW1pbGFyIHRvIHdpcmVzaGFyayBvdXRwdXQgKi8KK0RFQ0xBUkVfRkRfRFVNUF9QUk9UT1RZUEUoIGZkX21zZ19kdW1wX3RyZWV2aWV3LCBtc2dfb3JfYXZwICpvYmosIHN0cnVjdCBkaWN0aW9uYXJ5ICpkaWN0LCBpbnQgZm9yY2VfcGFyc2luZywgaW50IHJlY3Vyc2UgKQoreworCXJldHVybiBtc2dfZHVtcF9wcm9jZXNzKEZEX0RVTVBfU1REX1BBUkFNUywgbXNnX2Zvcm1hdF90cmVldmlldywgYXZwX2Zvcm1hdF90cmVldmlldywgb2JqLCBkaWN0LCBmb3JjZV9wYXJzaW5nLCByZWN1cnNlKTsKK30KKworCisvKgorICogT25lLWxpbmUgZHVtcGVyIGZvciBjb21wYWN0IGJ1dCBjb21wbGV0ZSB0cmFjZXMKKyAqLworc3RhdGljIERFQ0xBUkVfRkRfRFVNUF9QUk9UT1RZUEUoIG1zZ19mb3JtYXRfZnVsbCwgc3RydWN0IG1zZyAqIG1zZyApCit7CisJaW50IHN1Y2Nlc3MgPSAwOworCXN0cnVjdCBkaWN0X2NtZF9kYXRhIGRpY3RkYXRhOworCQorCWlmICghQ0hFQ0tfTVNHKG1zZykpIHsKKwkJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9kdW1wX2V4dGVuZCggRkRfRFVNUF9TVERfUEFSQU1TLCAiSU5WQUxJRCBNRVNTQUdFIiksIHJldHVybiBOVUxMKTsKKwkJcmV0dXJuICpidWY7CisJfQorCQorCWlmICghbXNnLT5tc2dfbW9kZWwpIHsKKwkJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9kdW1wX2V4dGVuZCggRkRfRFVNUF9TVERfUEFSQU1TLCAiKG5vIG1vZGVsKSAiKSwgcmV0dXJuIE5VTEwpOworCX0gZWxzZSB7CisJCWVudW0gZGljdF9vYmplY3RfdHlwZSBkaWN0dHlwZT0wOworCQlpZiAoZmRfZGljdF9nZXR0eXBlKG1zZy0+bXNnX21vZGVsLCAmZGljdHR5cGUpIHx8IChkaWN0dHlwZSAhPSBESUNUX0NPTU1BTkQpKSB7CisJCQlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICIoaW52YWxpZCBtb2RlbCAlZCkgIiwgZGljdHR5cGUpLCByZXR1cm4gTlVMTCk7CisJCX0gZWxzZSBpZiAoZmRfZGljdF9nZXR2YWwobXNnLT5tc2dfbW9kZWwsICZkaWN0ZGF0YSkpIHsKKwkJCUNIRUNLX01BTExPQ19ETyggZmRfZHVtcF9leHRlbmQoIEZEX0RVTVBfU1REX1BBUkFNUywgIihlcnJvciBnZXR0aW5nIG1vZGVsIGRhdGEpICIpLCByZXR1cm4gTlVMTCk7CisJCX0gZWxzZSB7CisJCQlzdWNjZXNzID0gMTsKKwkJfQorCX0KKwlpZiAobXNnLT5tc2dfcHVibGljLm1zZ19hcHBsKSB7CisJCUNIRUNLX01BTExPQ19ETyggZmRfZHVtcF9leHRlbmQoIEZEX0RVTVBfU1REX1BBUkFNUywgCisJCQkJICAgIiVzKCV1LyV1KVsiIERVTVBfQ01ERkxfc3RyICJdLCBMZW5ndGg9JXUsIEhvcC1CeS1Ib3AtSWQ9MHglMDh4LCBFbmQtdG8tRW5kPTB4JTA4eCIsCisJCQkJCXN1Y2Nlc3MgPyBkaWN0ZGF0YS5jbWRfbmFtZSA6ICAidW5rbm93biIsICBtc2ctPm1zZ19wdWJsaWMubXNnX2FwcGwsIG1zZy0+bXNnX3B1YmxpYy5tc2dfY29kZSwgRFVNUF9DTURGTF92YWwobXNnLT5tc2dfcHVibGljLm1zZ19mbGFncyksCisJCQkJCW1zZy0+bXNnX3B1YmxpYy5tc2dfbGVuZ3RoLCBtc2ctPm1zZ19wdWJsaWMubXNnX2hiaGlkLCBtc2ctPm1zZ19wdWJsaWMubXNnX2V0ZWlkKSwgcmV0dXJuIE5VTEwpOworCX0gZWxzZSB7CisJCUNIRUNLX01BTExPQ19ETyggZmRfZHVtcF9leHRlbmQoIEZEX0RVTVBfU1REX1BBUkFNUywgCisJCQkJICAgIiVzKCV1KVsiIERVTVBfQ01ERkxfc3RyICJdLCBMZW5ndGg9JXUsIEhvcC1CeS1Ib3AtSWQ9MHglMDh4LCBFbmQtdG8tRW5kPTB4JTA4eCIsCisJCQkJCXN1Y2Nlc3MgPyBkaWN0ZGF0YS5jbWRfbmFtZSA6ICAidW5rbm93biIsIG1zZy0+bXNnX3B1YmxpYy5tc2dfY29kZSwgRFVNUF9DTURGTF92YWwobXNnLT5tc2dfcHVibGljLm1zZ19mbGFncyksCisJCQkJCW1zZy0+bXNnX3B1YmxpYy5tc2dfbGVuZ3RoLCBtc2ctPm1zZ19wdWJsaWMubXNnX2hiaGlkLCBtc2ctPm1zZ19wdWJsaWMubXNnX2V0ZWlkKSwgcmV0dXJuIE5VTEwpOworCX0KKwlyZXR1cm4gKmJ1ZjsKK30KKworc3RhdGljIERFQ0xBUkVfRkRfRFVNUF9QUk9UT1RZUEUoIGF2cF9mb3JtYXRfZnVsbCwgc3RydWN0IGF2cCAqIGF2cCwgaW50IGxldmVsLCBpbnQgZmlyc3QsIGludCBsYXN0ICkKK3sKKwlpbnQgc3VjY2VzcyA9IDA7CisJc3RydWN0IGRpY3RfYXZwX2RhdGEgIGRpY3RkYXRhOworCQorCWlmIChsZXZlbCkgeworCQlpZiAoKGZpcnN0KSAmJiAoKCpidWYpWypvZmZzZXQgLSAxXSA9PSAnPScpKSB7CisJCQkvKiBXZSBhcmUgZmlyc3QgQVZQIG9mIGEgZ3JvdXBlZCBBVlAgKi8KKwkJCUNIRUNLX01BTExPQ19ETyggZmRfZHVtcF9leHRlbmQoIEZEX0RVTVBfU1REX1BBUkFNUywgInsgIiksIHJldHVybiBOVUxMKTsKKwkJfSBlbHNlIHsKKwkJCS8qIFdlIGZvbGxvdyBhbm90aGVyIEFWUCwgb3IgYSBtZXNzYWdlIGhlYWRlciAqLworCQkJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9kdW1wX2V4dGVuZCggRkRfRFVNUF9TVERfUEFSQU1TLCAiLCB7ICIpLCByZXR1cm4gTlVMTCk7CisJCX0KKwl9CisJCisJaWYgKCFDSEVDS19BVlAoYXZwKSkgeworCQlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICJJTlZBTElEIEFWUCIpLCByZXR1cm4gTlVMTCk7CisJCWdvdG8gZW5kOworCX0KKwkKKworCWlmIChhdnAtPmF2cF9tb2RlbCkgeworCQllbnVtIGRpY3Rfb2JqZWN0X3R5cGUgZGljdHR5cGU7CisJCWlmIChmZF9kaWN0X2dldHR5cGUoYXZwLT5hdnBfbW9kZWwsICZkaWN0dHlwZSkgfHwgKGRpY3R0eXBlICE9IERJQ1RfQVZQKSkgeworCQkJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9kdW1wX2V4dGVuZCggRkRfRFVNUF9TVERfUEFSQU1TLCAiKGludmFsaWQgbW9kZWw6ICVkKSAiLCBkaWN0dHlwZSksIHJldHVybiBOVUxMKTsKKwkJfSBlbHNlIGlmIChmZF9kaWN0X2dldHZhbChhdnAtPmF2cF9tb2RlbCwgJmRpY3RkYXRhKSkgeworCQkJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9kdW1wX2V4dGVuZCggRkRfRFVNUF9TVERfUEFSQU1TLCAiKGVycm9yIGdldHRpbmcgbW9kZWwgZGF0YSkgIiksIHJldHVybiBOVUxMKTsKKwkJfSBlbHNlIHsKKwkJCXN1Y2Nlc3MgPSAxOworCQl9CisJfQorCQorCWlmIChhdnAtPmF2cF9wdWJsaWMuYXZwX2ZsYWdzICYgQVZQX0ZMQUdfVkVORE9SKSB7CisJCUNIRUNLX01BTExPQ19ETyggZmRfZHVtcF9leHRlbmQoIEZEX0RVTVBfU1REX1BBUkFNUywgIiVzKCV1LyV1KVsiIERVTVBfQVZQRkxfc3RyICJdPSIsIAorCQkJCQlzdWNjZXNzID8gZGljdGRhdGEuYXZwX25hbWUgOiAidW5rbm93biIsIGF2cC0+YXZwX3B1YmxpYy5hdnBfdmVuZG9yLCBhdnAtPmF2cF9wdWJsaWMuYXZwX2NvZGUsIERVTVBfQVZQRkxfdmFsKGF2cC0+YXZwX3B1YmxpYy5hdnBfZmxhZ3MpKSwgcmV0dXJuIE5VTEwpOworCX0gZWxzZSB7CisJCUNIRUNLX01BTExPQ19ETyggZmRfZHVtcF9leHRlbmQoIEZEX0RVTVBfU1REX1BBUkFNUywgIiVzKCV1KVsiIERVTVBfQVZQRkxfc3RyICJdPSIsIAorCQkJCQlzdWNjZXNzID8gZGljdGRhdGEuYXZwX25hbWUgOiAidW5rbm93biIsIGF2cC0+YXZwX3B1YmxpYy5hdnBfY29kZSwgRFVNUF9BVlBGTF92YWwoYXZwLT5hdnBfcHVibGljLmF2cF9mbGFncykpLCByZXR1cm4gTlVMTCk7CisJfQorCisJCQorCWlmIChzdWNjZXNzICYmIChkaWN0ZGF0YS5hdnBfYmFzZXR5cGUgPT0gQVZQX1RZUEVfR1JPVVBFRCkpIHsKKwkJaWYgKGxldmVsKSB7CisJCQlzdHJ1Y3QgYXZwICogaW5hdnAgPSBOVUxMOworCQkJaW50IGZpcnN0ID0gMTsKKwkJCUNIRUNLX0ZDVF9ETyggIGZkX21zZ19icm93c2UgKCBhdnAsIE1TR19CUldfRklSU1RfQ0hJTEQsICZpbmF2cCwgTlVMTCApLCBpbmF2cCA9IE5VTEwgKTsKKwkJCXdoaWxlIChpbmF2cCkgeworCQkJCXN0cnVjdCBhdnAgKiBuZXh0YXZwID0gTlVMTDsKKwkJCQlDSEVDS19GQ1RfRE8oICBmZF9tc2dfYnJvd3NlICggaW5hdnAsIE1TR19CUldfTkVYVCwgJm5leHRhdnAsIE5VTEwgKSwgaW5hdnAgPSBOVUxMICApOworCQkJCUNIRUNLX01BTExPQ19ETyggYXZwX2Zvcm1hdF9mdWxsKEZEX0RVTVBfU1REX1BBUkFNUywgaW5hdnAsIGxldmVsICsgMSwgZmlyc3QsIG5leHRhdnAgPyAwIDogMSksIHJldHVybiBOVUxMKTsKKwkJCQlpbmF2cCA9IG5leHRhdnA7CisJCQkJZmlyc3QgPSAwOworCQkJfTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChhdnAtPmF2cF9wdWJsaWMuYXZwX3ZhbHVlKSB7CisJCQlDSEVDS19NQUxMT0NfRE8oIGZkX2RpY3RfZHVtcF9hdnBfdmFsdWUoRkRfRFVNUF9TVERfUEFSQU1TLCBhdnAtPmF2cF9wdWJsaWMuYXZwX3ZhbHVlLCBhdnAtPmF2cF9tb2RlbCwgMCwgMCksIHJldHVybiBOVUxMKTsKKwkJfSBlbHNlIGlmIChhdnAtPmF2cF9yYXdkYXRhKSB7CisJCQlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kX2hleGR1bXAoRkRfRFVNUF9TVERfUEFSQU1TLCBhdnAtPmF2cF9yYXdkYXRhLCBhdnAtPmF2cF9yYXdsZW4sIDAsIDApLCByZXR1cm4gTlVMTCk7CisJCX0gZWxzZSB7CisJCQlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICIobm90IHNldCkiKSwgcmV0dXJuIE5VTEwpOworCQl9CisJfQorCQorZW5kOgorCWlmIChsZXZlbCkgeworCQlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICIgfSIpLCByZXR1cm4gTlVMTCk7CisJfQorCQorCXJldHVybiAqYnVmOworfQorCisvKiBvbmUtbGluZSBkdW1wIHdpdGggYWxsIHRoZSBjb250ZW50cyBvZiB0aGUgbWVzc2FnZSAqLworREVDTEFSRV9GRF9EVU1QX1BST1RPVFlQRSggZmRfbXNnX2R1bXBfZnVsbCwgbXNnX29yX2F2cCAqb2JqLCBzdHJ1Y3QgZGljdGlvbmFyeSAqZGljdCwgaW50IGZvcmNlX3BhcnNpbmcsIGludCByZWN1cnNlICkKK3sKKwlyZXR1cm4gbXNnX2R1bXBfcHJvY2VzcyhGRF9EVU1QX1NURF9QQVJBTVMsIG1zZ19mb3JtYXRfZnVsbCwgYXZwX2Zvcm1hdF9mdWxsLCBvYmosIGRpY3QsIGZvcmNlX3BhcnNpbmcsIHJlY3Vyc2UpOworfQorCisKKworLyoKKyAqIE9uZS1saW5lIGR1bXBlciBmb3IgY29tcGFjdCBidXQgY29tcGxldGUgdHJhY2VzCisgKi8KK3N0YXRpYyBERUNMQVJFX0ZEX0RVTVBfUFJPVE9UWVBFKCBtc2dfZm9ybWF0X3N1bW1hcnksIHN0cnVjdCBtc2cgKiBtc2cgKQoreworCWlmICghQ0hFQ0tfTVNHKG1zZykpIHsKKwkJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9kdW1wX2V4dGVuZCggRkRfRFVNUF9TVERfUEFSQU1TLCAiSU5WQUxJRCBNRVNTQUdFIiksIHJldHVybiBOVUxMKTsKKwkJcmV0dXJuICpidWY7CisJfQorCQorCWlmICghbXNnLT5tc2dfbW9kZWwpIHsKKwkJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9kdW1wX2V4dGVuZCggRkRfRFVNUF9TVERfUEFSQU1TLCAiKG5vIG1vZGVsKSIpLCByZXR1cm4gTlVMTCk7CisJfSBlbHNlIHsKKwkJZW51bSBkaWN0X29iamVjdF90eXBlIGRpY3R0eXBlOworCQlzdHJ1Y3QgZGljdF9jbWRfZGF0YSAgZGljdGRhdGE7CisJCWlmIChmZF9kaWN0X2dldHR5cGUobXNnLT5tc2dfbW9kZWwsICZkaWN0dHlwZSkgfHwgKGRpY3R0eXBlICE9IERJQ1RfQ09NTUFORCkgfHwgKGZkX2RpY3RfZ2V0dmFsKG1zZy0+bXNnX21vZGVsLCAmZGljdGRhdGEpKSkgeworCQkJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9kdW1wX2V4dGVuZCggRkRfRFVNUF9TVERfUEFSQU1TLCAiKG1vZGVsIGVycm9yKSIpLCByZXR1cm4gTlVMTCk7CisJCX0gZWxzZSB7CisJCQlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICInJXMnIiwgZGljdGRhdGEuY21kX25hbWUpLCByZXR1cm4gTlVMTCk7CisJCX0KKwl9CisJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9kdW1wX2V4dGVuZCggRkRfRFVNUF9TVERfUEFSQU1TLCAiJXUvJXUgZjoiIERVTVBfQ01ERkxfc3RyICIgc3JjOiclcycgbGVuOiVkIiwgCisJCQkJbXNnLT5tc2dfcHVibGljLm1zZ19hcHBsLCBtc2ctPm1zZ19wdWJsaWMubXNnX2NvZGUsIERVTVBfQ01ERkxfdmFsKG1zZy0+bXNnX3B1YmxpYy5tc2dfZmxhZ3MpLCBtc2ctPm1zZ19zcmNfaWQ/OiIobmlsKSIsIG1zZy0+bXNnX3B1YmxpYy5tc2dfbGVuZ3RoKSwgcmV0dXJuIE5VTEwpOworCisJcmV0dXJuICpidWY7Cit9CisKK3N0YXRpYyBERUNMQVJFX0ZEX0RVTVBfUFJPVE9UWVBFKCBhdnBfZm9ybWF0X3N1bW1hcnksIHN0cnVjdCBhdnAgKiBhdnAsIGludCBsZXZlbCwgaW50IGZpcnN0LCBpbnQgbGFzdCApCit7CisJY2hhciAqIG5hbWU7CisJc3RydWN0IGRpY3RfYXZwX2RhdGEgIGRpY3RkYXRhOworCXN0cnVjdCBkaWN0X2F2cF9kYXRhICpkaWN0aW5mbyA9IE5VTEw7CisJc3RydWN0IGRpY3RfdmVuZG9yX2RhdGEgIHZlbmRvcmRhdGE7CisJc3RydWN0IGRpY3RfdmVuZG9yX2RhdGEgKnZlbmRvcmluZm8gPSBOVUxMOworCQorCWlmIChsZXZlbCkgeworCQlpZiAoZmlyc3QpIHsKKwkJCUNIRUNLX01BTExPQ19ETyggZmRfZHVtcF9leHRlbmQoIEZEX0RVTVBfU1REX1BBUkFNUywgIiB7IiksIHJldHVybiBOVUxMKTsKKwkJfSBlbHNlIHsKKwkJCUNIRUNLX01BTExPQ19ETyggZmRfZHVtcF9leHRlbmQoIEZEX0RVTVBfU1REX1BBUkFNUywgIiwiKSwgcmV0dXJuIE5VTEwpOworCQl9CisJfQorCQorCWlmICghQ0hFQ0tfQVZQKGF2cCkpIHsKKwkJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9kdW1wX2V4dGVuZCggRkRfRFVNUF9TVERfUEFSQU1TLCAiSU5WQUxJRCBBVlAiKSwgcmV0dXJuIE5VTEwpOworCQlnb3RvIGVuZDsKKwl9CisJCisJaWYgKCFsZXZlbCkgeworCQkvKiBXZSBoYXZlIGJlZW4gY2FsbGVkIHRvIGV4cGxpY2l0ZWx5IGR1bXAgdGhpcyBBVlAsIHNvIHdlIHBhcnNlIGl0cyBuYW1lIGlmIGF2YWlsYWJsZSAqLworCQlpZiAoIWF2cC0+YXZwX21vZGVsKSB7CisJCQluYW1lID0gIihubyBtb2RlbCkiOworCQl9IGVsc2UgeworCQkJZW51bSBkaWN0X29iamVjdF90eXBlIGRpY3R0eXBlOworCQkJaWYgKGZkX2RpY3RfZ2V0dHlwZShhdnAtPmF2cF9tb2RlbCwgJmRpY3R0eXBlKSB8fCAoZGljdHR5cGUgIT0gRElDVF9BVlApIHx8IChmZF9kaWN0X2dldHZhbChhdnAtPmF2cF9tb2RlbCwgJmRpY3RkYXRhKSkpIHsKKwkJCQluYW1lID0gIihtb2RlbCBlcnJvcikiOworCQkJfSBlbHNlIHsKKwkJCQluYW1lID0gZGljdGRhdGEuYXZwX25hbWU7CisJCQkJZGljdGluZm8gPSAmZGljdGRhdGE7CisJCQkJaWYgKGF2cC0+YXZwX3B1YmxpYy5hdnBfZmxhZ3MgJiBBVlBfRkxBR19WRU5ET1IpIHsKKwkJCQkJc3RydWN0IGRpY3Rpb25hcnkgKiBkaWN0OworCQkJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiB2ZW5kb3I7CisJCQkJCWlmICgoIWZkX2RpY3RfZ2V0ZGljdChhdnAtPmF2cF9tb2RlbCwgJmRpY3QpKQorCQkJCQkmJiAoIWZkX2RpY3Rfc2VhcmNoKGRpY3QsIERJQ1RfVkVORE9SLCBWRU5ET1JfT0ZfQVZQLCBhdnAtPmF2cF9tb2RlbCwgJnZlbmRvciwgRU5PRU5UKSkKKwkJCQkJJiYgKCFmZF9kaWN0X2dldHZhbCh2ZW5kb3IsICZ2ZW5kb3JkYXRhKSkpIHsKKwkJCQkJCXZlbmRvcmluZm8gPSAmdmVuZG9yZGF0YTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmIChkaWN0aW5mbykgeworCQkJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9kdW1wX2V4dGVuZCggRkRfRFVNUF9TVERfUEFSQU1TLCAiJyVzJygldSkiLCBuYW1lLCBhdnAtPmF2cF9wdWJsaWMuYXZwX2NvZGUpLCByZXR1cm4gTlVMTCk7CisJCX0gZWxzZSB7CisJCQlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICIldSVzIiwgYXZwLT5hdnBfcHVibGljLmF2cF9jb2RlLCBuYW1lKSwgcmV0dXJuIE5VTEwpOworCQl9CisKKwkJaWYgKGF2cC0+YXZwX3B1YmxpYy5hdnBfZmxhZ3MgJiBBVlBfRkxBR19WRU5ET1IpIHsKKwkJCWlmICh2ZW5kb3JpbmZvKSB7CisJCQkJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9kdW1wX2V4dGVuZCggRkRfRFVNUF9TVERfUEFSQU1TLCAiIFY9JyVzJygldSkiLCB2ZW5kb3JpbmZvLT52ZW5kb3JfbmFtZSwgYXZwLT5hdnBfcHVibGljLmF2cF92ZW5kb3IpLCByZXR1cm4gTlVMTCk7CisJCQl9IGVsc2UgeworCQkJCUNIRUNLX01BTExPQ19ETyggZmRfZHVtcF9leHRlbmQoIEZEX0RVTVBfU1REX1BBUkFNUywgIiBWPSV1IiwgYXZwLT5hdnBfcHVibGljLmF2cF92ZW5kb3IpLCByZXR1cm4gTlVMTCk7CisJCQl9CisJCX0KKworCQlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICIgTD0lZCBGPSIgRFVNUF9BVlBGTF9zdHIgIiBWPSIsIGF2cC0+YXZwX3B1YmxpYy5hdnBfbGVuLCBEVU1QX0FWUEZMX3ZhbChhdnAtPmF2cF9wdWJsaWMuYXZwX2ZsYWdzKSksIHJldHVybiBOVUxMKTsKKworCQlpZiAoKCFkaWN0aW5mbykgfHwgKGRpY3RpbmZvLT5hdnBfYmFzZXR5cGUgIT0gQVZQX1RZUEVfR1JPVVBFRCkpIHsKKwkJCWlmIChhdnAtPmF2cF9wdWJsaWMuYXZwX3ZhbHVlKSB7CisJCQkJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9kaWN0X2R1bXBfYXZwX3ZhbHVlKEZEX0RVTVBfU1REX1BBUkFNUywgYXZwLT5hdnBfcHVibGljLmF2cF92YWx1ZSwgYXZwLT5hdnBfbW9kZWwsIDAsIDApLCByZXR1cm4gTlVMTCk7CisJCQl9IGVsc2UgaWYgKGF2cC0+YXZwX3Jhd2RhdGEpIHsKKwkJCQlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kX2hleGR1bXAoRkRfRFVNUF9TVERfUEFSQU1TLCBhdnAtPmF2cF9yYXdkYXRhLCBhdnAtPmF2cF9yYXdsZW4sIDAsIDApLCByZXR1cm4gTlVMTCk7CisJCQl9IGVsc2UgeworCQkJCUNIRUNLX01BTExPQ19ETyggZmRfZHVtcF9leHRlbmQoIEZEX0RVTVBfU1REX1BBUkFNUywgIihub3Qgc2V0KSIpLCByZXR1cm4gTlVMTCk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQkvKiBGb3IgZW1iZWRkZWQgQVZQcywgd2Ugb25seSBkaXNwbGF5ICh2ZW5kb3IsKSBjb2RlICYgbGVuZ3RoICovCisJCWlmIChhdnAtPmF2cF9wdWJsaWMuYXZwX2ZsYWdzICYgQVZQX0ZMQUdfVkVORE9SKSB7CisJCQlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICJWOiV1LyIsIGF2cC0+YXZwX3B1YmxpYy5hdnBfdmVuZG9yKSwgcmV0dXJuIE5VTEwpOworCQl9CisJCUNIRUNLX01BTExPQ19ETyggZmRfZHVtcF9leHRlbmQoIEZEX0RVTVBfU1REX1BBUkFNUywgIkM6JXUvbDolZCIsIGF2cC0+YXZwX3B1YmxpYy5hdnBfY29kZSwgYXZwLT5hdnBfcHVibGljLmF2cF9sZW4pLCByZXR1cm4gTlVMTCk7CisJfQorCQorZW5kOgorCWlmICgobGV2ZWwpICYmIChsYXN0KSkgeworCQlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICJ9IiksIHJldHVybiBOVUxMKTsKKwl9CisJCisJcmV0dXJuICpidWY7Cit9CisKKy8qIFRoaXMgb25lIG9ubHkgcHJpbnRzIGEgc2hvcnQgZGlzcGxheSwgZG9lcyBub3QgZ28gaW50byB0aGUgY29tcGxldGUgdHJlZSAqLworREVDTEFSRV9GRF9EVU1QX1BST1RPVFlQRSggZmRfbXNnX2R1bXBfc3VtbWFyeSwgbXNnX29yX2F2cCAqb2JqLCBzdHJ1Y3QgZGljdGlvbmFyeSAqZGljdCwgaW50IGZvcmNlX3BhcnNpbmcsIGludCByZWN1cnNlICkKK3sKKwlyZXR1cm4gbXNnX2R1bXBfcHJvY2VzcyhGRF9EVU1QX1NURF9QQVJBTVMsIG1zZ19mb3JtYXRfc3VtbWFyeSwgYXZwX2Zvcm1hdF9zdW1tYXJ5LCBvYmosIGRpY3QsIGZvcmNlX3BhcnNpbmcsIHJlY3Vyc2UpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogU2ltcGxlIG1ldGEtZGF0YSBtYW5hZ2VtZW50ICovCisKKy8qIFJldHJpZXZlIHRoZSBtb2RlbCBvZiBhbiBvYmplY3QgKi8KK2ludCBmZF9tc2dfbW9kZWwgKCBtc2dfb3JfYXZwICogcmVmZXJlbmNlLCBzdHJ1Y3QgZGljdF9vYmplY3QgKiogbW9kZWwgKQoreworCVRSQUNFX0VOVFJZKCIlcCAlcCIsIHJlZmVyZW5jZSwgbW9kZWwpOworCQorCS8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisJQ0hFQ0tfUEFSQU1TKCAgbW9kZWwgJiYgVkFMSURBVEVfT0JKKHJlZmVyZW5jZSkgICk7CisJCisJLyogY29weSB0aGUgbW9kZWwgcmVmZXJlbmNlICovCisJc3dpdGNoIChfQyhyZWZlcmVuY2UpLT50eXBlKSB7CisJCWNhc2UgTVNHX0FWUDoKKwkJCSptb2RlbCA9IF9BKHJlZmVyZW5jZSktPmF2cF9tb2RlbDsKKwkJCWJyZWFrOworCQkKKwkJY2FzZSBNU0dfTVNHOgorCQkJKm1vZGVsID0gX00ocmVmZXJlbmNlKS0+bXNnX21vZGVsOworCQkJYnJlYWs7CisJCQorCQlkZWZhdWx0OgorCQkJQ0hFQ0tfUEFSQU1TKDApOworCX0KKwkKKwlyZXR1cm4gMDsKK30KKworLyogUmV0cmlldmUgdGhlIGFkZHJlc3Mgb2YgdGhlIG1zZ19wdWJsaWMgZmllbGQgb2YgYSBtZXNzYWdlICovCitpbnQgZmRfbXNnX2hkciAoIHN0cnVjdCBtc2cgKm1zZywgc3RydWN0IG1zZ19oZHIgKipwZGF0YSApCit7CisJVFJBQ0VfRU5UUlkoIiVwICVwIiwgbXNnLCBwZGF0YSk7CisJQ0hFQ0tfUEFSQU1TKCAgQ0hFQ0tfTVNHKG1zZykgJiYgcGRhdGEgICk7CisJCisJKnBkYXRhID0gJm1zZy0+bXNnX3B1YmxpYzsKKwlyZXR1cm4gMDsKK30KKworLyogUmV0cmlldmUgdGhlIGFkZHJlc3Mgb2YgdGhlIGF2cF9wdWJsaWMgZmllbGQgb2YgYW4gYXZwICovCitpbnQgZmRfbXNnX2F2cF9oZHIgKCBzdHJ1Y3QgYXZwICphdnAsIHN0cnVjdCBhdnBfaGRyICoqcGRhdGEgKQoreworCVRSQUNFX0VOVFJZKCIlcCAlcCIsIGF2cCwgcGRhdGEpOworCUNIRUNLX1BBUkFNUyggIENIRUNLX0FWUChhdnApICYmIHBkYXRhICApOworCQorCSpwZGF0YSA9ICZhdnAtPmF2cF9wdWJsaWM7CisJcmV0dXJuIDA7Cit9CisKKy8qIEFzc29jaWF0ZSBhbnN3ZXJzIGFuZCBxdWVyaWVzICovCitpbnQgZmRfbXNnX2Fuc3dfYXNzb2NpYXRlKCBzdHJ1Y3QgbXNnICogYW5zd2VyLCBzdHJ1Y3QgbXNnICogcXVlcnkgKQoreworCVRSQUNFX0VOVFJZKCAiJXAgJXAiLCBhbnN3ZXIsIHF1ZXJ5ICk7CisJCisJQ0hFQ0tfUEFSQU1TKCAgQ0hFQ0tfTVNHKGFuc3dlcikgJiYgQ0hFQ0tfTVNHKHF1ZXJ5KSAmJiAoYW5zd2VyLT5tc2dfcXVlcnkgPT0gTlVMTCApICApOworCQorCWFuc3dlci0+bXNnX3F1ZXJ5ID0gcXVlcnk7CisJcXVlcnktPm1zZ19hc3NvY2lhdGVkID0gMTsKKwkKKwlyZXR1cm4gMDsKK30JCisKK2ludCBmZF9tc2dfYW5zd19nZXRxKCBzdHJ1Y3QgbXNnICogYW5zd2VyLCBzdHJ1Y3QgbXNnICoqIHF1ZXJ5ICkKK3sKKwlUUkFDRV9FTlRSWSggIiVwICVwIiwgYW5zd2VyLCBxdWVyeSApOworCQorCUNIRUNLX1BBUkFNUyggIENIRUNLX01TRyhhbnN3ZXIpICYmIHF1ZXJ5ICApOworCQorCSpxdWVyeSA9IGFuc3dlci0+bXNnX3F1ZXJ5OworCQorCXJldHVybiAwOworfQkKKworaW50IGZkX21zZ19hbnN3X2RldGFjaCggc3RydWN0IG1zZyAqIGFuc3dlciApCit7CisJVFJBQ0VfRU5UUlkoICIlcCIsIGFuc3dlciApOworCQorCUNIRUNLX1BBUkFNUyggIENIRUNLX01TRyhhbnN3ZXIpICk7CisJCisJYW5zd2VyLT5tc2dfcXVlcnktPm1zZ19hc3NvY2lhdGVkID0gMDsKKwlhbnN3ZXItPm1zZ19xdWVyeSA9IE5VTEw7CisJCisJcmV0dXJuIDA7Cit9CisKKy8qIEFzc29jaWF0ZSAvIGdldCBhbnN3ZXIgY2FsbGJhY2tzICovCitpbnQgZmRfbXNnX2Fuc2NiX2Fzc29jaWF0ZSggc3RydWN0IG1zZyAqIG1zZywgdm9pZCAoICphbnNjYikodm9pZCAqLCBzdHJ1Y3QgbXNnICoqKSwgdm9pZCAgKiBkYXRhLCB2b2lkICgqZXhwaXJlY2IpKHZvaWQgKiwgRGlhbUlkX3QsIHNpemVfdCwgc3RydWN0IG1zZyAqKiksIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqdGltZW91dCApCit7CisJVFJBQ0VfRU5UUlkoIiVwICVwICVwICVwIiwgbXNnLCBhbnNjYiwgZXhwaXJlY2IsIGRhdGEpOworCQorCS8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisJQ0hFQ0tfUEFSQU1TKCBDSEVDS19NU0cobXNnKSApOworCQorCWlmICghIChtc2ctPm1zZ19wdWJsaWMubXNnX2ZsYWdzICYgQ01EX0ZMQUdfUkVRVUVTVCApKQorCQlyZXR1cm4gYW5zY2IgPyBFSU5WQUwgOiAwOyAvKiB3ZSBhc3NvY2lhdGUgd2l0aCByZXF1ZXN0cyBvbmx5ICovCisJCisJQ0hFQ0tfUEFSQU1TKCAoYW5zY2IgPT0gTlVMTCkgICAgfHwgKG1zZy0+bXNnX2NiLmFuc2NiID09IE5VTEwpICk7IC8qIFdlIGFyZSBub3Qgb3ZlcndyaXRpbmcgYSBjYiAqLworCUNIRUNLX1BBUkFNUyggKGV4cGlyZWNiID09IE5VTEwpIHx8IChtc2ctPm1zZ19jYi5leHBpcmVjYiA9PSBOVUxMKSApOyAvKiBXZSBhcmUgbm90IG92ZXJ3cml0aW5nIGEgY2IgKi8KKwkKKwkvKiBBc3NvY2lhdGUgY2FsbGJhY2sgYW5kIGRhdGEgd2l0aCB0aGUgbWVzc2FnZSwgaWYgYW55ICovCisJaWYgKGFuc2NiKSB7CisJCW1zZy0+bXNnX2NiLmFuc2NiID0gYW5zY2I7CisJCW1zZy0+bXNnX2NiLmRhdGEgPSBkYXRhOworCX0KKwlpZiAoZXhwaXJlY2IpIHsKKwkJbXNnLT5tc2dfY2IuZXhwaXJlY2IgPSBleHBpcmVjYjsKKwkJaWYgKHRpbWVvdXQpIHsKKwkJCW1lbWNweSgmbXNnLT5tc2dfY2IudGltZW91dCwgdGltZW91dCwgc2l6ZW9mKHN0cnVjdCB0aW1lc3BlYykpOworCQl9CisJfQorCQorCXJldHVybiAwOworfQorCisvKiBSZW1vdmUgYSBjYWxsYmFjayAqLworaW50IGZkX21zZ19hbnNjYl9yZXNldChzdHJ1Y3QgbXNnICogbXNnLCBpbnQgY2xlYXJfYW5zY2IsIGludCBjbGVhcl9leHBpcmVjYikgCit7CisJVFJBQ0VfRU5UUlkoIiVwICVkICVkIiwgbXNnLCBjbGVhcl9hbnNjYiwgY2xlYXJfZXhwaXJlY2IpOworCQorCS8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisJQ0hFQ0tfUEFSQU1TKCBDSEVDS19NU0cobXNnKSApOworCQorCWlmIChjbGVhcl9hbnNjYikgeworCQltc2ctPm1zZ19jYi5hbnNjYiA9IE5VTEw7CisJCW1zZy0+bXNnX2NiLmRhdGEgPSBOVUxMOworCX0KKwlpZiAoY2xlYXJfZXhwaXJlY2IpIHsKKwkJbXNnLT5tc2dfY2IuZXhwaXJlY2IgPSBOVUxMOworCQltZW1zZXQoJm1zZy0+bXNnX2NiLnRpbWVvdXQsIDAsIHNpemVvZihzdHJ1Y3QgdGltZXNwZWMpKTsKKwl9CisJCisJcmV0dXJuIDA7Cit9CisKKworaW50IGZkX21zZ19hbnNjYl9nZXQoIHN0cnVjdCBtc2cgKiBtc2csIHZvaWQgKCoqYW5zY2IpKHZvaWQgKiwgc3RydWN0IG1zZyAqKiksIHZvaWQgKCoqZXhwaXJlY2IpKHZvaWQgKiwgRGlhbUlkX3QsIHNpemVfdCwgc3RydWN0IG1zZyAqKiksIHZvaWQgKiogZGF0YSApCit7CisJVFJBQ0VfRU5UUlkoIiVwICVwICVwICVwIiwgbXNnLCBhbnNjYiwgZXhwaXJlY2IsIGRhdGEpOworCQorCS8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisJQ0hFQ0tfUEFSQU1TKCBDSEVDS19NU0cobXNnKSApOworCQorCS8qIENvcHkgdGhlIHJlc3VsdCAqLworCWlmIChhbnNjYikKKwkJKmFuc2NiID0gbXNnLT5tc2dfY2IuYW5zY2I7CisJaWYgKGRhdGEpCisJCSpkYXRhICA9IG1zZy0+bXNnX2NiLmRhdGE7CisJaWYgKGV4cGlyZWNiKQorCQkqZXhwaXJlY2IgPSBtc2ctPm1zZ19jYi5leHBpcmVjYjsKKwkKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHRpbWVzcGVjICpmZF9tc2dfYW5zY2JfZ2V0dGltZW91dCggc3RydWN0IG1zZyAqIG1zZyApCit7CisJVFJBQ0VfRU5UUlkoIiVwIiwgbXNnKTsKKwkKKwkvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworCUNIRUNLX1BBUkFNU19ETyggQ0hFQ0tfTVNHKG1zZyksIHJldHVybiBOVUxMICk7CisJCisJaWYgKCFtc2ctPm1zZ19jYi50aW1lb3V0LnR2X3NlYykgeworCQlyZXR1cm4gTlVMTDsKKwl9CisJCisJcmV0dXJuICZtc2ctPm1zZ19jYi50aW1lb3V0OworfQorCisvKiBBc3NvY2lhdGUgcm91dGluZyBsaXN0cyAqLworaW50IGZkX21zZ19ydF9hc3NvY2lhdGUoIHN0cnVjdCBtc2cgKiBtc2csIHN0cnVjdCBydF9kYXRhICogcnRkICkKK3sKKwlUUkFDRV9FTlRSWSggIiVwICVwIiwgbXNnLCBydGQgKTsKKwkKKwlDSEVDS19QQVJBTVMoICBDSEVDS19NU0cobXNnKSAmJiBydGQgICk7CisJCisJbXNnLT5tc2dfcnRkYXRhID0gcnRkOworCQorCXJldHVybiAwOworfQorCitpbnQgZmRfbXNnX3J0X2dldCggc3RydWN0IG1zZyAqIG1zZywgc3RydWN0IHJ0X2RhdGEgKiogcnRkICkKK3sKKwlUUkFDRV9FTlRSWSggIiVwICVwIiwgbXNnLCBydGQgKTsKKwkKKwlDSEVDS19QQVJBTVMoICBDSEVDS19NU0cobXNnKSAmJiBydGQgICk7CisJCisJKnJ0ZCA9IG1zZy0+bXNnX3J0ZGF0YTsKKwkKKwlyZXR1cm4gMDsKK30JCisKKy8qIEZpbmQgaWYgYSBtZXNzYWdlIGlzIHJvdXRhYmxlICovCitpbnQgZmRfbXNnX2lzX3JvdXRhYmxlICggc3RydWN0IG1zZyAqIG1zZyApCit7CisJVFJBQ0VfRU5UUlkoIiVwIiwgbXNnKTsKKwkKKwlDSEVDS19QQVJBTVNfRE8oICBDSEVDS19NU0cobXNnKSwgIHJldHVybiAwIC8qIHByZXRlbmQgdGhlIG1lc3NhZ2UgaXMgbm90IHJvdXRhYmxlICovICk7CisJCisJaWYgKCAhIG1zZy0+bXNnX3JvdXRhYmxlICkgeworCQkvKiBUbyBkZWZpbmUgaWYgYSBtZXNzYWdlIGlzIHJvdXRhYmxlLCB3ZSByZWx5IG9uIHRoZSAiUFhZIiBmbGFnIChmb3IgYXBwbGljYXRpb24gMCkuICovCisJCW1zZy0+bXNnX3JvdXRhYmxlID0gKChtc2ctPm1zZ19wdWJsaWMubXNnX2FwcGwgIT0gMCkgfHwgKG1zZy0+bXNnX3B1YmxpYy5tc2dfZmxhZ3MgJiBDTURfRkxBR19QUk9YSUFCTEUpKSA/IDEgOiAyOworCQkKKwkJLyogTm90ZSA6IHRoZSAncmVhbCcgY3JpdGVyaWEgYWNjb3JkaW5nIHRvIHRoZSBEaWFtZXRlciBJLUQgaXMgdGhhdCB0aGUgbWVzc2FnZSBpcyAKKwkJIHJvdXRhYmxlIGlmIGFuZCBvbmx5IGlmIHRoZSAiRGVzdGluYXRpb24tUmVhbG0iIEFWUCBpcyByZXF1aXJlZCBieSB0aGUgY29tbWFuZCBBQk5GLgorCQkgV2UgY291bGQgbWFrZSBhIHRlc3QgZm9yIHRoaXMgaGVyZSwgYnV0IGl0J3MgbW9yZSBjb21wdXRhdGlvbmFsIHdvcmsgYW5kIG91ciB0ZXN0CisJCSBzZWVtcyBhY2N1cmF0ZSAodW50aWwgcHJvdmVuIG90aGVyd2lzZS4uLikgKi8KKwl9CisJCisJcmV0dXJuIChtc2ctPm1zZ19yb3V0YWJsZSA9PSAxKSA/IDEgOiAwOworfQorCisvKiBjYWNoZSB0aGUgZGljdGlvbmFyeSBtb2RlbCBmb3IgbmV4dCBmdW5jdGlvbiB0byBhdm9pZCByZS1zZWFyY2hpbmcgYXQgZXZlcnkgaW5jb21pbmcgbWVzc2FnZSAqLworc3RhdGljIHN0cnVjdCBkaWN0X29iamVjdCAqY2FjaGVkX2F2cF9ycl9tb2RlbCA9IE5VTEw7CitzdGF0aWMgc3RydWN0IGRpY3Rpb25hcnkgICpjYWNoZWRfYXZwX3JyX2RpY3QgID0gTlVMTDsKK3N0YXRpYyBwdGhyZWFkX211dGV4X3QgICAgIGNhY2hlZF9hdnBfcnJfbG9jayA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CisKKy8qIEFzc29jaWF0ZSBzb3VyY2UgcGVlciAqLworaW50IGZkX21zZ19zb3VyY2Vfc2V0KCBzdHJ1Y3QgbXNnICogbXNnLCBEaWFtSWRfdCBkaWFtaWQsIHNpemVfdCBkaWFtaWRsZW4gKQoreworCVRSQUNFX0VOVFJZKCAiJXAgJXAgJXpkIiwgbXNnLCBkaWFtaWQsIGRpYW1pZGxlbik7CisJCisJLyogQ2hlY2sgd2UgcmVjZWl2ZWQgYSB2YWxpZCBtZXNzYWdlICovCisJQ0hFQ0tfUEFSQU1TKCBDSEVDS19NU0cobXNnKSApOworCQorCS8qIENsZWFudXAgYW55IHByZXZpb3VzIHNvdXJjZSAqLworCWZyZWUobXNnLT5tc2dfc3JjX2lkKTsgbXNnLT5tc2dfc3JjX2lkID0gTlVMTDsgbXNnLT5tc2dfc3JjX2lkX2xlbiA9IDA7CisJCisJLyogSWYgdGhlIHJlcXVlc3QgaXMgdG8gY2xlYW51cCB0aGUgc291cmNlLCB3ZSBhcmUgZG9uZSAqLworCWlmIChkaWFtaWQgPT0gTlVMTCkgeworCQlyZXR1cm4gMDsKKwl9CisJCisJLyogT3RoZXJ3aXNlIHNhdmUgdGhlIG5ldyBpbmZvcm1hdGlvbnMgKi8KKwlDSEVDS19NQUxMT0MoIG1zZy0+bXNnX3NyY19pZCA9IG9zMGR1cChkaWFtaWQsIGRpYW1pZGxlbikgKTsKKwltc2ctPm1zZ19zcmNfaWRfbGVuID0gZGlhbWlkbGVuOworCS8qIGRvbmUgKi8KKwlyZXR1cm4gMDsKK30KKworLyogQXNzb2NpYXRlIHNvdXJjZSBwZWVyICovCitpbnQgZmRfbXNnX3NvdXJjZV9zZXRyciggc3RydWN0IG1zZyAqIG1zZywgRGlhbUlkX3QgZGlhbWlkLCBzaXplX3QgZGlhbWlkbGVuLCBzdHJ1Y3QgZGljdGlvbmFyeSAqIGRpY3QgKQoreworCXN0cnVjdCBkaWN0X29iamVjdCAJKmF2cF9ycl9tb2RlbCA9IE5VTEw7CisJYXZwX2NvZGVfdCAJCSBjb2RlID0gQUNfUk9VVEVfUkVDT1JEOworCXN0cnVjdCBhdnAgCQkqYXZwOworCXVuaW9uIGF2cF92YWx1ZQkJIHZhbDsKKworCVRSQUNFX0VOVFJZKCAiJXAgJXAgJXpkICVwIiwgbXNnLCBkaWFtaWQsIGRpYW1pZGxlbiwgZGljdCk7CisJCisJLyogQ2hlY2sgd2UgcmVjZWl2ZWQgYSB2YWxpZCBtZXNzYWdlICovCisJQ0hFQ0tfUEFSQU1TKCBDSEVDS19NU0cobXNnKSAmJiBkaWN0ICk7CisJCisJLyogTG9jayB0aGUgY2FjaGVkIHZhbHVlcyAqLworCUNIRUNLX1BPU0lYKCBwdGhyZWFkX211dGV4X2xvY2soJmNhY2hlZF9hdnBfcnJfbG9jaykgKTsKKwlpZiAoY2FjaGVkX2F2cF9ycl9kaWN0ID09IGRpY3QpIHsKKwkJYXZwX3JyX21vZGVsID0gY2FjaGVkX2F2cF9ycl9tb2RlbDsKKwl9CisJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZjYWNoZWRfYXZwX3JyX2xvY2spICk7CisKKwkvKiBJZiBpdCB3YXMgbm90IGNhY2hlZCAqLworCWlmICghYXZwX3JyX21vZGVsKSB7CisJCS8qIEZpbmQgdGhlIG1vZGVsIGZvciBSb3V0ZS1SZWNvcmQgaW4gdGhlIGRpY3Rpb25hcnkgKi8KKwkJQ0hFQ0tfRkNUKCBmZF9kaWN0X3NlYXJjaCAoIGRpY3QsIERJQ1RfQVZQLCBBVlBfQllfQ09ERSwgJmNvZGUsICZhdnBfcnJfbW9kZWwsIEVOT0VOVCkgKTsKKworCQkvKiBOb3cgY2FjaGUgdGhpcyByZXN1bHQgKi8KKwkJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfbXV0ZXhfbG9jaygmY2FjaGVkX2F2cF9ycl9sb2NrKSApOworCQljYWNoZWRfYXZwX3JyX2RpY3QgID0gZGljdDsKKwkJY2FjaGVkX2F2cF9ycl9tb2RlbCA9IGF2cF9ycl9tb2RlbDsKKwkJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZjYWNoZWRfYXZwX3JyX2xvY2spICk7CisJfQorCisJLyogQ3JlYXRlIHRoZSBBVlAgd2l0aCB0aGlzIG1vZGVsICovCisJQ0hFQ0tfRkNUKCBmZF9tc2dfYXZwX25ldyAoIGF2cF9ycl9tb2RlbCwgMCwgJmF2cCApICk7CisKKwkvKiBTZXQgdGhlIEFWUCB2YWx1ZSB3aXRoIHRoZSBkaWFtZXRlciBpZCAqLworCW1lbXNldCgmdmFsLCAwLCBzaXplb2YodmFsKSk7CisJdmFsLm9zLmRhdGEgPSAodWludDhfdCAqKWRpYW1pZDsKKwl2YWwub3MubGVuICA9IGRpYW1pZGxlbjsKKwlDSEVDS19GQ1QoIGZkX21zZ19hdnBfc2V0dmFsdWUoIGF2cCwgJnZhbCApICk7CisKKwkvKiBBZGQgdGhlIEFWUCBpbiB0aGUgbWVzc2FnZSAqLworCUNIRUNLX0ZDVCggZmRfbXNnX2F2cF9hZGQoIG1zZywgTVNHX0JSV19MQVNUX0NISUxELCBhdnAgKSApOworCQorCS8qIGRvbmUgKi8KKwlyZXR1cm4gMDsKK30KKworaW50IGZkX21zZ19zb3VyY2VfZ2V0KCBzdHJ1Y3QgbXNnICogbXNnLCBEaWFtSWRfdCogZGlhbWlkLCBzaXplX3QgKiBkaWFtaWRsZW4gKQoreworCVRSQUNFX0VOVFJZKCAiJXAgJXAgJXAiLCBtc2csIGRpYW1pZCwgZGlhbWlkbGVuKTsKKwkKKwkvKiBDaGVjayB3ZSByZWNlaXZlZCB2YWxpZCBwYXJhbWV0ZXJzICovCisJQ0hFQ0tfUEFSQU1TKCBDSEVDS19NU0cobXNnKSApOworCUNIRUNLX1BBUkFNUyggZGlhbWlkICk7CisJCisJLyogQ29weSB0aGUgaW5mb3JtYXRpb25zICovCisJKmRpYW1pZCA9IG1zZy0+bXNnX3NyY19pZDsKKwkKKwlpZiAoZGlhbWlkbGVuKQorCQkqZGlhbWlkbGVuID0gbXNnLT5tc2dfc3JjX2lkX2xlbjsKKwkKKwkvKiBkb25lICovCisJcmV0dXJuIDA7Cit9CisKKy8qIEFzc29jaWF0ZSBhIHNlc3Npb24gd2l0aCBhIG1lc3NhZ2UsIHVzZSBvbmx5IHdoZW4gdGhlIHNlc3Npb24gd2FzIGp1c3QgY3JlYXRlZCAqLworaW50IGZkX21zZ19zZXNzX3NldChzdHJ1Y3QgbXNnICogbXNnLCBzdHJ1Y3Qgc2Vzc2lvbiAqIHNlc3Npb24pCit7CisJVFJBQ0VfRU5UUlkoIiVwICVwIiwgbXNnLCBzZXNzaW9uKTsKKwkKKwkvKiBDaGVjayB3ZSByZWNlaXZlZCB2YWxpZCBwYXJhbWV0ZXJzICovCisJQ0hFQ0tfUEFSQU1TKCBDSEVDS19NU0cobXNnKSApOworCUNIRUNLX1BBUkFNUyggc2Vzc2lvbiApOworCUNIRUNLX1BBUkFNUyggbXNnLT5tc2dfc2VzcyA9PSBOVUxMICk7CisJCisJbXNnLT5tc2dfc2VzcyA9IHNlc3Npb247CisJcmV0dXJuIDA7Cit9CisKKworLyogUmV0cmlldmUgdGhlIHNlc3Npb24gb2YgdGhlIG1lc3NhZ2UgKi8KK2ludCBmZF9tc2dfc2Vzc19nZXQoc3RydWN0IGRpY3Rpb25hcnkgKiBkaWN0LCBzdHJ1Y3QgbXNnICogbXNnLCBzdHJ1Y3Qgc2Vzc2lvbiAqKiBzZXNzaW9uLCBpbnQgKiBuZXcpCit7CisJc3RydWN0IGF2cCAqIGF2cDsKKwkKKwlUUkFDRV9FTlRSWSgiJXAgJXAgJXAiLCBtc2csIHNlc3Npb24sIG5ldyk7CisJCisJLyogQ2hlY2sgd2UgcmVjZWl2ZWQgdmFsaWQgcGFyYW1ldGVycyAqLworCUNIRUNLX1BBUkFNUyggQ0hFQ0tfTVNHKG1zZykgKTsKKwlDSEVDS19QQVJBTVMoIHNlc3Npb24gKTsKKwkKKwkvKiBJZiB3ZSBhbHJlYWR5IHJlc29sdmVkIHRoZSBzZXNzaW9uLCBqdXN0IHNlbmQgaXQgYmFjayAqLworCWlmIChtc2ctPm1zZ19zZXNzKSB7CisJCSpzZXNzaW9uID0gbXNnLT5tc2dfc2VzczsKKwkJaWYgKG5ldykKKwkJCSpuZXcgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJCisJLyogT0ssIHdlIGhhdmUgdG8gc2VhcmNoIGZvciBTZXNzaW9uLUlkIEFWUCAtLSBpdCBpcyB1c3VhbGx5IHRoZSBmaXJzdCBBVlAsIGJ1dCBsZXQncyBiZSBwZXJtaXNzaXZlIGhlcmUgKi8KKwkvKiAtLSBub3RlOiB3ZSBhY2NlcHQgbWVzc2FnZXMgdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbiBkaWN0aW9uYXJ5IHBhcnNlZC4uLiAqLworCUNIRUNLX0ZDVCggIGZkX21zZ19icm93c2UobXNnLCBNU0dfQlJXX0ZJUlNUX0NISUxELCAmYXZwLCBOVUxMKSAgKTsKKwl3aGlsZSAoYXZwKSB7CisJCWlmICggKGF2cC0+YXZwX3B1YmxpYy5hdnBfY29kZSAgID09IEFDX1NFU1NJT05fSUQpCisJCSAgJiYgKGF2cC0+YXZwX3B1YmxpYy5hdnBfdmVuZG9yID09IDApICkKKwkJCWJyZWFrOworCQkKKwkJLyogT3RoZXJ3aXNlIG1vdmUgdG8gbmV4dCBBVlAgaW4gdGhlIG1lc3NhZ2UgKi8KKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfYnJvd3NlKGF2cCwgTVNHX0JSV19ORVhULCAmYXZwLCBOVUxMKSApOworCX0KKwkKKwlpZiAoIWF2cCkgeworCQlUUkFDRV9ERUJVRyhGVUxMLCAiTm8gU2Vzc2lvbi1JZCBBVlAgZm91bmQgaW4gbWVzc2FnZSAlcCIsIG1zZyk7CisJCSpzZXNzaW9uID0gTlVMTDsKKwkJcmV0dXJuIDA7CisJfQorCQorCWlmICghYXZwLT5hdnBfbW9kZWwpIHsKKwkJQ0hFQ0tfRkNUKCBmZF9tc2dfcGFyc2VfZGljdCAoIGF2cCwgZGljdCwgTlVMTCApICk7CisJfQorCQorCUFTU0VSVCggYXZwLT5hdnBfcHVibGljLmF2cF92YWx1ZSApOworCQorCS8qIFJlc29sdmUgdGhlIHNlc3Npb24gYW5kIHdlIGFyZSBkb25lICovCisJaWYgKGF2cC0+YXZwX3B1YmxpYy5hdnBfdmFsdWUtPm9zLmxlbiA+IDApIHsKKwkJQ0hFQ0tfRkNUKCBmZF9zZXNzX2Zyb21zaWRfbXNnICggYXZwLT5hdnBfcHVibGljLmF2cF92YWx1ZS0+b3MuZGF0YSwgYXZwLT5hdnBfcHVibGljLmF2cF92YWx1ZS0+b3MubGVuLCAmbXNnLT5tc2dfc2VzcywgbmV3KSApOworCQkqc2Vzc2lvbiA9IG1zZy0+bXNnX3Nlc3M7CisJfSBlbHNlIHsKKwkJVFJBQ0VfREVCVUcoRlVMTCwgIlNlc3Npb24tSWQgQVZQIHdpdGggMC1ieXRlIGxlbmd0aCBmb3VuZCBpbiBtZXNzYWdlICVwIiwgbXNnKTsKKwkJKnNlc3Npb24gPSBOVUxMOworCX0KKwkKKwlyZXR1cm4gMDsKK30KKworLyogUmV0cmlldmUgdGhlIGxvY2F0aW9uIG9mIHRoZSBwbWQgbGlzdCBmb3IgdGhlIG1lc3NhZ2U7IHJldHVybiBOVUxMIGlmIGZhaWxlZCAqLworc3RydWN0IGZkX21zZ19wbWRsICogZmRfbXNnX3BtZGxfZ2V0KHN0cnVjdCBtc2cgKiBtc2cpCit7CisJQ0hFQ0tfUEFSQU1TX0RPKCBDSEVDS19NU0cobXNnKSwgcmV0dXJuIE5VTEwgKTsKKwlyZXR1cm4gJm1zZy0+bXNnX3BtZGw7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKiogRW5kLXRvLWVuZCBjb3VudGVyICoqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB1aW50MzJfdCBmZF9ldGVpZDsKK3N0YXRpYyBwdGhyZWFkX211dGV4X3QgZmRfZXRlaWRfbGNrID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKKwordm9pZCBmZF9tc2dfZXRlaWRfaW5pdCh2b2lkKQoreworCXVpbnQzMl90IHQgPSAodWludDMyX3QpdGltZShOVUxMKTsKKwlzcmFuZDQ4KHQpOworCWZkX2V0ZWlkID0gKHQgPDwgMjApIHwgKCh1aW50MzJfdClscmFuZDQ4KCkgJiAoICgxIDw8IDIwKSAtIDEgKSk7Cit9CisKK3VpbnQzMl90IGZkX21zZ19ldGVpZF9nZXQgKCB2b2lkICkKK3sKKwl1aW50MzJfdCByZXQ7CisJCisJQ0hFQ0tfUE9TSVhfRE8oIHB0aHJlYWRfbXV0ZXhfbG9jaygmZmRfZXRlaWRfbGNrKSwgLyogY29udGludWUgKi8gKTsKKwkKKwlyZXQgPSBmZF9ldGVpZCArKzsKKwkKKwlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9tdXRleF91bmxvY2soJmZkX2V0ZWlkX2xjayksIC8qIGNvbnRpbnVlICovICk7CisJCisJcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE1hbmFnZSBBVlBzIHZhbHVlcyAqLworCisvKiBTZXQgdGhlIHZhbHVlIG9mIGFuIEFWUCAqLworaW50IGZkX21zZ19hdnBfc2V0dmFsdWUgKCBzdHJ1Y3QgYXZwICphdnAsIHVuaW9uIGF2cF92YWx1ZSAqdmFsdWUgKQoreworCWVudW0gZGljdF9hdnBfYmFzZXR5cGUgdHlwZSA9IC0xOworCQorCVRSQUNFX0VOVFJZKCIlcCAlcCIsIGF2cCwgdmFsdWUpOworCQorCS8qIENoZWNrIHBhcmFtZXRlciAqLworCUNIRUNLX1BBUkFNUyggIENIRUNLX0FWUChhdnApICYmIGF2cC0+YXZwX21vZGVsICApOworCQorCS8qIFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIEFWUCBtb2RlbCAqLworCXsKKwkJZW51bSBkaWN0X29iamVjdF90eXBlIGRpY3R0eXBlOworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSAgZGljdGRhdGE7CisJCQorCQlDSEVDS19QQVJBTVMoIChmZF9kaWN0X2dldHR5cGUoYXZwLT5hdnBfbW9kZWwsICZkaWN0dHlwZSkgPT0gMCkgJiYgKGRpY3R0eXBlID09IERJQ1RfQVZQKSApOworCQlDSEVDS19GQ1QoICBmZF9kaWN0X2dldHZhbChhdnAtPmF2cF9tb2RlbCwgJmRpY3RkYXRhKSAgKTsKKwkJdHlwZSA9IGRpY3RkYXRhLmF2cF9iYXNldHlwZTsKKwkJQ0hFQ0tfUEFSQU1TKCAgdHlwZSAhPSBBVlBfVFlQRV9HUk9VUEVEICApOworCX0KKwkKKwkvKiBGaXJzdCwgY2xlYW4gYW55IHByZXZpb3VzIHZhbHVlICovCisJaWYgKGF2cC0+YXZwX211c3RmcmVlb3MgIT0gMCkgeworCQlmcmVlKGF2cC0+YXZwX3N0b3JhZ2Uub3MuZGF0YSk7CisJCWF2cC0+YXZwX211c3RmcmVlb3MgPSAwOworCX0KKwkKKwltZW1zZXQoJmF2cC0+YXZwX3N0b3JhZ2UsIDAsIHNpemVvZih1bmlvbiBhdnBfdmFsdWUpKTsKKwkKKwkvKiBJZiB0aGUgcmVxdWVzdCB3YXMgdG8gZGVsZXRlIGEgdmFsdWU6ICovCisJaWYgKCF2YWx1ZSkgeworCQlhdnAtPmF2cF9wdWJsaWMuYXZwX3ZhbHVlID0gTlVMTDsKKwkJcmV0dXJuIDA7CisJfQorCQorCS8qIE5vdyB3ZSBoYXZlIHRvIHNldCB0aGUgdmFsdWUgKi8KKwltZW1jcHkoJmF2cC0+YXZwX3N0b3JhZ2UsIHZhbHVlLCBzaXplb2YodW5pb24gYXZwX3ZhbHVlKSk7CisJCisJLyogRHVwbGljYXRlIGFuIG9jdGV0c3RyaW5nIGlmIG5lZWRlZC4gKi8KKwlpZiAodHlwZSA9PSBBVlBfVFlQRV9PQ1RFVFNUUklORykgeworCQlDSEVDS19NQUxMT0MoICBhdnAtPmF2cF9zdG9yYWdlLm9zLmRhdGEgPSBvczBkdXAodmFsdWUtPm9zLmRhdGEsIHZhbHVlLT5vcy5sZW4pICApOworCQlhdnAtPmF2cF9tdXN0ZnJlZW9zID0gMTsKKwl9CisJCisJLyogU2V0IHRoZSBkYXRhIHBvaW50ZXIgb2YgdGhlIHB1YmxpYyBwYXJ0ICovCisJYXZwLT5hdnBfcHVibGljLmF2cF92YWx1ZSA9ICZhdnAtPmF2cF9zdG9yYWdlOworCQorCXJldHVybiAwOwkJCit9CisKKy8qIFNldCB0aGUgdmFsdWUgb2YgYW4gQVZQLCB1c2luZyBmb3JtYXR0ZWQgZGF0YSAqLworaW50IGZkX21zZ19hdnBfdmFsdWVfZW5jb2RlICggdm9pZCAqZGF0YSwgc3RydWN0IGF2cCAqYXZwICkKK3sKKwllbnVtIGRpY3RfYXZwX2Jhc2V0eXBlIHR5cGUgPSAtMTsKKwlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgdHlwZV9kYXRhOworCQorCVRSQUNFX0VOVFJZKCIlcCAlcCIsIGRhdGEsIGF2cCk7CisJCisJLyogQ2hlY2sgcGFyYW1ldGVyICovCisJQ0hFQ0tfUEFSQU1TKCAgQ0hFQ0tfQVZQKGF2cCkgJiYgYXZwLT5hdnBfbW9kZWwgICk7CisJCisJLyogUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgQVZQIG1vZGVsIGFuZCBpdCdzIHBhcmVudCB0eXBlICovCisJeworCQllbnVtIGRpY3Rfb2JqZWN0X3R5cGUgZGljdHR5cGU7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhICBkaWN0ZGF0YTsKKwkJc3RydWN0IGRpY3Rpb25hcnkgICAqIGRpY3Q7CisJCXN0cnVjdCBkaWN0X29iamVjdCAgKiBwYXJlbnR0eXBlID0gTlVMTDsKKwkJCisJCS8qIEZpcnN0IGNoZWNrIHRoZSBiYXNlIHR5cGUgb2YgdGhlIEFWUCAqLworCQlDSEVDS19QQVJBTVMoIChmZF9kaWN0X2dldHR5cGUoYXZwLT5hdnBfbW9kZWwsICZkaWN0dHlwZSkgPT0gMCkgJiYgKGRpY3R0eXBlID09IERJQ1RfQVZQKSApOworCQlDSEVDS19GQ1QoICBmZF9kaWN0X2dldHZhbChhdnAtPmF2cF9tb2RlbCwgJmRpY3RkYXRhKSAgKTsKKwkJdHlwZSA9IGRpY3RkYXRhLmF2cF9iYXNldHlwZTsKKwkJQ0hFQ0tfUEFSQU1TKCAgdHlwZSAhPSBBVlBfVFlQRV9HUk9VUEVEICApOworCQkKKwkJLyogVGhlbiByZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGFyZW50J3MgdHlwZSAoPSBkZXJpdmVkIHR5cGUpICovCisJCUNIRUNLX0ZDVCggIGZkX2RpY3RfZ2V0ZGljdCggYXZwLT5hdnBfbW9kZWwsICZkaWN0ICkgICk7CisJCUNIRUNLX0ZDVCggIGZkX2RpY3Rfc2VhcmNoKCBkaWN0LCBESUNUX1RZUEUsIFRZUEVfT0ZfQVZQLCBhdnAtPmF2cF9tb2RlbCwgJnBhcmVudHR5cGUsIEVJTlZBTCkgICk7CisJCUNIRUNLX0ZDVCggIGZkX2RpY3RfZ2V0dmFsKHBhcmVudHR5cGUsICZ0eXBlX2RhdGEpICApOworCQlpZiAodHlwZV9kYXRhLnR5cGVfZW5jb2RlID09IE5VTEwpIHsKKwkJCVRSQUNFX0RFQlVHKElORk8sICJUaGlzIEFWUCB0eXBlIGRvZXMgbm90IHByb3ZpZGUgYSBjYWxsYmFjayB0byBlbmNvZGUgZm9ybWF0dGVkIGRhdGEuIEVOT1RTVVAuIik7CisJCQlyZXR1cm4gRU5PVFNVUDsKKwkJfQorCX0KKwkKKwkvKiBPaywgbm93IHdlIGNhbiBlbmNvZGUgdGhlIHZhbHVlICovCisJCisJLyogRmlyc3QsIGNsZWFuIGFueSBwcmV2aW91cyB2YWx1ZSAqLworCWlmIChhdnAtPmF2cF9tdXN0ZnJlZW9zICE9IDApIHsKKwkJZnJlZShhdnAtPmF2cF9zdG9yYWdlLm9zLmRhdGEpOworCQlhdnAtPmF2cF9tdXN0ZnJlZW9zID0gMDsKKwl9CisJYXZwLT5hdnBfcHVibGljLmF2cF92YWx1ZSA9IE5VTEw7CisJbWVtc2V0KCZhdnAtPmF2cF9zdG9yYWdlLCAwLCBzaXplb2YodW5pb24gYXZwX3ZhbHVlKSk7CisJCisJLyogTm93IGNhbGwgdGhlIHR5cGUncyBjYWxsYmFjayB0byBlbmNvZGUgdGhlIGRhdGEgKi8KKwlDSEVDS19GQ1QoICAoKnR5cGVfZGF0YS50eXBlX2VuY29kZSkoZGF0YSwgJmF2cC0+YXZwX3N0b3JhZ2UpICApOworCQorCS8qIElmIGFuIG9jdGV0c3RyaW5nIGhhcyBiZWVuIGFsbG9jYXRlZCwgbGV0J3MgbWFyayBpdCB0byBiZSBmcmVlZCAqLworCWlmICh0eXBlID09IEFWUF9UWVBFX09DVEVUU1RSSU5HKQorCQlhdnAtPmF2cF9tdXN0ZnJlZW9zID0gMTsKKwkKKwkvKiBTZXQgdGhlIGRhdGEgcG9pbnRlciBvZiB0aGUgcHVibGljIHBhcnQgKi8KKwlhdnAtPmF2cF9wdWJsaWMuYXZwX3ZhbHVlID0gJmF2cC0+YXZwX3N0b3JhZ2U7CisJCisJcmV0dXJuIDA7CQkKK30KKworLyogSW50ZXJwcmV0IHRoZSB2YWx1ZSBvZiBhbiBBVlAgaW50byBmb3JtYXR0ZWQgZGF0YSAqLworaW50IGZkX21zZ19hdnBfdmFsdWVfaW50ZXJwcmV0ICggc3RydWN0IGF2cCAqYXZwLCB2b2lkICpkYXRhICkKK3sKKwlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgdHlwZV9kYXRhOworCQorCVRSQUNFX0VOVFJZKCIlcCAlcCIsIGF2cCwgZGF0YSk7CisJCisJLyogQ2hlY2sgcGFyYW1ldGVyICovCisJQ0hFQ0tfUEFSQU1TKCAgQ0hFQ0tfQVZQKGF2cCkgJiYgYXZwLT5hdnBfbW9kZWwgJiYgYXZwLT5hdnBfcHVibGljLmF2cF92YWx1ZSAgKTsKKwkKKwkvKiBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgQVZQIHBhcmVudCB0eXBlICovCisJeworCQlzdHJ1Y3QgZGljdGlvbmFyeSAgICogZGljdDsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICAqIHBhcmVudHR5cGUgPSBOVUxMOworCQkKKwkJQ0hFQ0tfRkNUKCAgZmRfZGljdF9nZXRkaWN0KCBhdnAtPmF2cF9tb2RlbCwgJmRpY3QgKSAgKTsKKwkJQ0hFQ0tfRkNUKCAgZmRfZGljdF9zZWFyY2goIGRpY3QsIERJQ1RfVFlQRSwgVFlQRV9PRl9BVlAsIGF2cC0+YXZwX21vZGVsLCAmcGFyZW50dHlwZSwgRUlOVkFMKSAgKTsKKwkJQ0hFQ0tfRkNUKCAgZmRfZGljdF9nZXR2YWwocGFyZW50dHlwZSwgJnR5cGVfZGF0YSkgICk7CisJCWlmICh0eXBlX2RhdGEudHlwZV9pbnRlcnByZXQgPT0gTlVMTCkgeworCQkJVFJBQ0VfREVCVUcoSU5GTywgIlRoaXMgQVZQIHR5cGUgZG9lcyBub3QgcHJvdmlkZSBhIGNhbGxiYWNrIHRvIGludGVycHJldCB2YWx1ZSBpbiBmb3JtYXR0ZWQgZGF0YS4gRU5PVFNVUC4iKTsKKwkJCXJldHVybiBFTk9UU1VQOworCQl9CisJfQorCQorCS8qIE9rLCBub3cgd2UgY2FuIGludGVycHJldCB0aGUgdmFsdWUgKi8KKwkKKwlDSEVDS19GQ1QoICAoKnR5cGVfZGF0YS50eXBlX2ludGVycHJldCkoYXZwLT5hdnBfcHVibGljLmF2cF92YWx1ZSwgZGF0YSkgICk7CisJCisJcmV0dXJuIDA7CQkKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIENyZWF0aW5nIGEgYnVmZmVyIGZyb20gbWVtb3J5IG9iamVjdHMgKGJ1ZmZlcml6ZSBhIHN0cnVjdCBtc2cpICovCisKKy8qIEZvbGxvd2luZyBtYWNyb3MgYXJlIHVzZWQgdG8gc3RvcmUgMzIgYW5kIDY0IGJpdCBmaWVsZHMgaW50byBhIGJ1ZmZlciBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIgKi8KKyNkZWZpbmUgUFVUX2luX2J1Zl8zMiggX3UzMmRhdGEsIF9idWZwdHIgKSB7CQkJCQkJCVwKKwkqKHVpbnQzMl90ICopKF9idWZwdHIpID0gaHRvbmwoKHVpbnQzMl90KShfdTMyZGF0YSkpOwkJCQkJXAorfQorCisvKiBUaGUgbG9jYXRpb24gaXMgbm90IG9uIDY0YiBib3VuZGFyeSwgc28gd2Ugc3BsaXQgdGhlIHdyaXRpbmcgaW4gdHdvIG9wZXJhdGlvbnMgdG8gYXZvaWQgc2lnYnVzICovCisjZGVmaW5lIFBVVF9pbl9idWZfNjQoIF91NjRkYXRhLCBfYnVmcHRyICkgewkJCQkJCQlcCisJdWludDY0X3QgX192ID0gaHRvbmxsKCh1aW50NjRfdCkoX3U2NGRhdGEpKTsJCQkJCQlcCisJbWVtY3B5KF9idWZwdHIsICZfX3YsIHNpemVvZihfX3YpKTsJCQkJCQkJXAorfQorCisvKiBXcml0ZSBhIG1lc3NhZ2UgaGVhZGVyIGluIHRoZSBidWZmZXIgKi8KK3N0YXRpYyBpbnQgYnVmZmVyaXplX21zZyh1bnNpZ25lZCBjaGFyICogYnVmZmVyLCBzaXplX3QgYnVmbGVuLCBzaXplX3QgKiBvZmZzZXQsIHN0cnVjdCBtc2cgKiBtc2cpCit7CisJVFJBQ0VfRU5UUlkoIiVwICV6ZCAlcCAlcCIsIGJ1ZmZlciwgYnVmbGVuLCBvZmZzZXQsIG1zZyk7CisJCisJaWYgKChidWZsZW4gLSAqb2Zmc2V0KSA8IEdFVE1TR0hEUlNaKCkpCisJCXJldHVybiBFTk9TUEM7CisJCisJaWYgKCpvZmZzZXQgJiAweDMpCisJCXJldHVybiBFRkFVTFQ7CS8qIFdlIGFyZSBzdXBwb3NlZCB0byBzdGFydCBvbiAzMiBiaXQgYm91bmRhcmllcyAqLworCQorCVBVVF9pbl9idWZfMzIobXNnLT5tc2dfcHVibGljLm1zZ19sZW5ndGgsIGJ1ZmZlciArICpvZmZzZXQpOworCWJ1ZmZlclsqb2Zmc2V0XSA9IG1zZy0+bXNnX3B1YmxpYy5tc2dfdmVyc2lvbjsKKwkqb2Zmc2V0ICs9IDQ7CisJCisJUFVUX2luX2J1Zl8zMihtc2ctPm1zZ19wdWJsaWMubXNnX2NvZGUsIGJ1ZmZlciArICpvZmZzZXQpOworCWJ1ZmZlclsqb2Zmc2V0XSA9IG1zZy0+bXNnX3B1YmxpYy5tc2dfZmxhZ3M7CisJKm9mZnNldCArPSA0OworCQorCVBVVF9pbl9idWZfMzIobXNnLT5tc2dfcHVibGljLm1zZ19hcHBsLCBidWZmZXIgKyAqb2Zmc2V0KTsKKwkqb2Zmc2V0ICs9IDQ7CisJCisJUFVUX2luX2J1Zl8zMihtc2ctPm1zZ19wdWJsaWMubXNnX2hiaGlkLCBidWZmZXIgKyAqb2Zmc2V0KTsKKwkqb2Zmc2V0ICs9IDQ7CisJCisJUFVUX2luX2J1Zl8zMihtc2ctPm1zZ19wdWJsaWMubXNnX2V0ZWlkLCBidWZmZXIgKyAqb2Zmc2V0KTsKKwkqb2Zmc2V0ICs9IDQ7CisJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYnVmZmVyaXplX2NoYWluKHVuc2lnbmVkIGNoYXIgKiBidWZmZXIsIHNpemVfdCBidWZsZW4sIHNpemVfdCAqIG9mZnNldCwgc3RydWN0IGZkX2xpc3QgKiBsaXN0KTsKKworLyogV3JpdGUgYW4gQVZQIGluIHRoZSBidWZmZXIgKi8KK3N0YXRpYyBpbnQgYnVmZmVyaXplX2F2cCh1bnNpZ25lZCBjaGFyICogYnVmZmVyLCBzaXplX3QgYnVmbGVuLCBzaXplX3QgKiBvZmZzZXQsICBzdHJ1Y3QgYXZwICogYXZwKQoreworCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGRpY3RkYXRhOworCQorCVRSQUNFX0VOVFJZKCIlcCAlemQgJXAgJXAiLCBidWZmZXIsIGJ1Zmxlbiwgb2Zmc2V0LCBhdnApOworCQorCWlmICgoYnVmbGVuIC0gKm9mZnNldCkgPCBhdnAtPmF2cF9wdWJsaWMuYXZwX2xlbikKKwkJcmV0dXJuIEVOT1NQQzsKKwkKKwkvKiBXcml0ZSB0aGUgaGVhZGVyICovCisJUFVUX2luX2J1Zl8zMihhdnAtPmF2cF9wdWJsaWMuYXZwX2NvZGUsIGJ1ZmZlciArICpvZmZzZXQpOworCSpvZmZzZXQgKz0gNDsKKwkKKwlQVVRfaW5fYnVmXzMyKGF2cC0+YXZwX3B1YmxpYy5hdnBfbGVuLCBidWZmZXIgKyAqb2Zmc2V0KTsKKwlidWZmZXJbKm9mZnNldF0gPSBhdnAtPmF2cF9wdWJsaWMuYXZwX2ZsYWdzOworCSpvZmZzZXQgKz0gNDsKKwkKKwlpZiAoYXZwLT5hdnBfcHVibGljLmF2cF9mbGFncyAmIEFWUF9GTEFHX1ZFTkRPUikgeworCQlQVVRfaW5fYnVmXzMyKGF2cC0+YXZwX3B1YmxpYy5hdnBfdmVuZG9yLCBidWZmZXIgKyAqb2Zmc2V0KTsKKwkJKm9mZnNldCArPSA0OworCX0KKwkKKwkvKiBUaGVuIHdlIG11c3Qgd3JpdGUgdGhlIEFWUCB2YWx1ZSAqLworCQorCWlmIChhdnAtPmF2cF9tb2RlbCA9PSBOVUxMKSB7CisJCS8qIEluIHRoZSBjYXNlIHdoZXJlIHdlIGRvbid0IGtub3cgdGhlIHR5cGUgb2YgQVZQLCBqdXN0IGNvcHkgdGhlIHJhdyBkYXRhIG9yIHNvdXJjZSAqLworCQlDSEVDS19QQVJBTVMoIGF2cC0+YXZwX3NvdXJjZSB8fCBhdnAtPmF2cF9yYXdkYXRhICk7CisJCQorCQlpZiAoIGF2cC0+YXZwX3Jhd2RhdGEgIT0gTlVMTCApIHsKKwkJCS8qIHRoZSBjb250ZW50IHdhcyBzdG9yZWQgaW4gcmF3ZGF0YSAqLworCQkJbWVtY3B5KCZidWZmZXJbKm9mZnNldF0sIGF2cC0+YXZwX3Jhd2RhdGEsIGF2cC0+YXZwX3Jhd2xlbik7CisJCQkqb2Zmc2V0ICs9IFBBRDQoYXZwLT5hdnBfcmF3bGVuKTsKKwkJfSBlbHNlIHsKKwkJCS8qIHRoZSBtZXNzYWdlIHdhcyBub3QgcGFyc2VkIGNvbXBsZXRlbHkgKi8KKwkJCXNpemVfdCBkYXRhbGVuID0gYXZwLT5hdnBfcHVibGljLmF2cF9sZW4gLSBHRVRBVlBIRFJTWihhdnAtPmF2cF9wdWJsaWMuYXZwX2ZsYWdzKTsKKwkJCW1lbWNweSgmYnVmZmVyWypvZmZzZXRdLCBhdnAtPmF2cF9zb3VyY2UsIGRhdGFsZW4pOworCQkJKm9mZnNldCArPSBQQUQ0KGRhdGFsZW4pOworCQl9CisJCQorCX0gZWxzZSB7CisJCS8qIFRoZSBBVlAgaXMgZGVmaW5lZCBpbiB0aGUgZGljdGlvbmFyeSAqLworCQlDSEVDS19GQ1QoICBmZF9kaWN0X2dldHZhbChhdnAtPmF2cF9tb2RlbCwgJmRpY3RkYXRhKSAgKTsKKworCQlDSEVDS19QQVJBTVMoICggZGljdGRhdGEuYXZwX2Jhc2V0eXBlID09IEFWUF9UWVBFX0dST1VQRUQgKSB8fCBhdnAtPmF2cF9wdWJsaWMuYXZwX3ZhbHVlICk7CisJCQorCQlzd2l0Y2ggKGRpY3RkYXRhLmF2cF9iYXNldHlwZSkgeworCQkJY2FzZSBBVlBfVFlQRV9HUk9VUEVEOgorCQkJCXJldHVybiBidWZmZXJpemVfY2hhaW4oYnVmZmVyLCBidWZsZW4sIG9mZnNldCwgJmF2cC0+YXZwX2NoYWluLmNoaWxkcmVuKTsKKworCQkJY2FzZSBBVlBfVFlQRV9PQ1RFVFNUUklORzoKKwkJCQlpZiAoYXZwLT5hdnBfcHVibGljLmF2cF92YWx1ZS0+b3MubGVuKQorCQkJCQltZW1jcHkoJmJ1ZmZlclsqb2Zmc2V0XSwgYXZwLT5hdnBfcHVibGljLmF2cF92YWx1ZS0+b3MuZGF0YSwgYXZwLT5hdnBfcHVibGljLmF2cF92YWx1ZS0+b3MubGVuKTsKKwkJCQkqb2Zmc2V0ICs9IFBBRDQoYXZwLT5hdnBfcHVibGljLmF2cF92YWx1ZS0+b3MubGVuKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBBVlBfVFlQRV9JTlRFR0VSMzI6CisJCQkJUFVUX2luX2J1Zl8zMihhdnAtPmF2cF9wdWJsaWMuYXZwX3ZhbHVlLT5pMzIsIGJ1ZmZlciArICpvZmZzZXQpOworCQkJCSpvZmZzZXQgKz0gNDsKKwkJCQlicmVhazsKKworCQkJY2FzZSBBVlBfVFlQRV9JTlRFR0VSNjQ6CisJCQkJUFVUX2luX2J1Zl82NChhdnAtPmF2cF9wdWJsaWMuYXZwX3ZhbHVlLT5pNjQsIGJ1ZmZlciArICpvZmZzZXQpOworCQkJCSpvZmZzZXQgKz0gODsKKwkJCQlicmVhazsKKworCQkJY2FzZSBBVlBfVFlQRV9VTlNJR05FRDMyOgorCQkJCVBVVF9pbl9idWZfMzIoYXZwLT5hdnBfcHVibGljLmF2cF92YWx1ZS0+dTMyLCBidWZmZXIgKyAqb2Zmc2V0KTsKKwkJCQkqb2Zmc2V0ICs9IDQ7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQVZQX1RZUEVfVU5TSUdORUQ2NDoKKwkJCQlQVVRfaW5fYnVmXzY0KGF2cC0+YXZwX3B1YmxpYy5hdnBfdmFsdWUtPnU2NCwgYnVmZmVyICsgKm9mZnNldCk7CisJCQkJKm9mZnNldCArPSA4OworCQkJCWJyZWFrOworCisJCQljYXNlIEFWUF9UWVBFX0ZMT0FUMzI6CisJCQkJLyogV2UgcmVhZCB0aGUgZjMyIGFzICJ1MzIiIGhlcmUgdG8gYXZvaWQgY2FzdGluZyB0byB1aW50IG1ha2UgZGVjaW1hbHMgZ28gYXdheS4gCisJCQkJIFRoZSBhbHRlcm5hdGl2ZSB3b3VsZCBiZSBzb21ldGhpbmcgbGlrZSAiKih1aW50MzJfdCAqKSgmIGYzMikiIGJ1dAorCQkJCSB0aGVuIHRoZSBjb21waWxlciBjb21wbGFpbnMgYWJvdXQgc3RyaWN0LWFsaWFzaW5nIHJ1bGVzLiAqLworCQkJCVBVVF9pbl9idWZfMzIoYXZwLT5hdnBfcHVibGljLmF2cF92YWx1ZS0+dTMyLCBidWZmZXIgKyAqb2Zmc2V0KTsKKwkJCQkqb2Zmc2V0ICs9IDQ7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQVZQX1RZUEVfRkxPQVQ2NDoKKwkJCQkvKiBTYW1lIHJlbWFyayBhcyBwcmV2aW91c2x5ICovCisJCQkJUFVUX2luX2J1Zl82NChhdnAtPmF2cF9wdWJsaWMuYXZwX3ZhbHVlLT51NjQsIGJ1ZmZlciArICpvZmZzZXQpOworCQkJCSpvZmZzZXQgKz0gODsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlBU1NFUlQoMCk7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisJCQkKKy8qIFdyaXRlIGEgY2hhaW4gb2YgQVZQcyBpbiB0aGUgYnVmZmVyICovCitzdGF0aWMgaW50IGJ1ZmZlcml6ZV9jaGFpbih1bnNpZ25lZCBjaGFyICogYnVmZmVyLCBzaXplX3QgYnVmbGVuLCBzaXplX3QgKiBvZmZzZXQsIHN0cnVjdCBmZF9saXN0ICogbGlzdCkKK3sKKwlzdHJ1Y3QgZmRfbGlzdCAqIGF2cGNoOworCQorCVRSQUNFX0VOVFJZKCIlcCAlemQgJXAgJXAiLCBidWZmZXIsIGJ1Zmxlbiwgb2Zmc2V0LCBsaXN0KTsKKwkKKwlmb3IgKGF2cGNoID0gbGlzdC0+bmV4dDsgYXZwY2ggIT0gbGlzdDsgYXZwY2ggPSBhdnBjaC0+bmV4dCkgeworCQkvKiBCdWZmZXJpemUgdGhlIEFWUCAqLworCQlDSEVDS19GQ1QoIGJ1ZmZlcml6ZV9hdnAoYnVmZmVyLCBidWZsZW4sIG9mZnNldCwgX0EoYXZwY2gtPm8pKSAgKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIENyZWF0ZSB0aGUgbWVzc2FnZSBidWZmZXIsIGluIG5ldHdvcmstYnl0ZSBvcmRlci4gV2UgYnJvd3NlIHRoZSB0cmVlIHR3aWNlLCB0aGlzIGNvdWxkIGJlIHByb2JhYmx5IGltcHJvdmVkIGlmIG5lZWRlZCAqLworaW50IGZkX21zZ19idWZmZXJpemUgKCBzdHJ1Y3QgbXNnICogbXNnLCB1bnNpZ25lZCBjaGFyICoqIGJ1ZmZlciwgc2l6ZV90ICogbGVuICkKK3sKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBjaGFyICogYnVmID0gTlVMTDsKKwlzaXplX3Qgb2Zmc2V0ID0gMDsKKwkKKwlUUkFDRV9FTlRSWSgiJXAgJXAgJXAiLCBtc2csIGJ1ZmZlciwgbGVuKTsKKwkKKwkvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworCUNIRUNLX1BBUkFNUyggIGJ1ZmZlciAmJiBDSEVDS19NU0cobXNnKSAgKTsKKwkKKwkvKiBVcGRhdGUgdGhlIGxlbmd0aC4gVGhpcyBhbHNvIGNoZWNrcyB0aGF0IGFsbCBBVlAgaGF2ZSB0aGVpciB2YWx1ZXMgc2V0ICovCisJQ0hFQ0tfRkNUKCAgZmRfbXNnX3VwZGF0ZV9sZW5ndGgobXNnKSAgKTsKKwkKKwkvKiBOb3cgYWxsb2NhdGUgYSBidWZmZXIgdG8gc3RvcmUgdGhlIG1lc3NhZ2UgKi8KKwlDSEVDS19NQUxMT0MoICBidWYgPSBtYWxsb2MobXNnLT5tc2dfcHVibGljLm1zZ19sZW5ndGgpICApOworCQorCS8qIENsZWFyIHRoZSBtZW1vcnksIHNvIHRoYXQgdGhlIHBhZGRpbmcgaXMgYWx3YXlzIDAgKHNob3VsZCBub3QgbWF0dGVyKSAqLworCW1lbXNldChidWYsIDAsIG1zZy0+bXNnX3B1YmxpYy5tc2dfbGVuZ3RoKTsKKwkKKwkvKiBXcml0ZSB0aGUgbWVzc2FnZSBoZWFkZXIgaW4gdGhlIGJ1ZmZlciAqLworCUNIRUNLX0ZDVF9ETyggcmV0ID0gYnVmZmVyaXplX21zZyhidWYsIG1zZy0+bXNnX3B1YmxpYy5tc2dfbGVuZ3RoLCAmb2Zmc2V0LCBtc2cpLCAKKwkJeworCQkJZnJlZShidWYpOworCQkJcmV0dXJuIHJldDsKKwkJfSAgKTsKKwkKKwkvKiBXcml0ZSB0aGUgbGlzdCBvZiBBVlBzICovCisJQ0hFQ0tfRkNUX0RPKCByZXQgPSBidWZmZXJpemVfY2hhaW4oYnVmLCBtc2ctPm1zZ19wdWJsaWMubXNnX2xlbmd0aCwgJm9mZnNldCwgJm1zZy0+bXNnX2NoYWluLmNoaWxkcmVuKSwKKwkJeworCQkJZnJlZShidWYpOworCQkJcmV0dXJuIHJldDsKKwkJfSAgKTsKKwkKKwlBU1NFUlQob2Zmc2V0ID09IG1zZy0+bXNnX3B1YmxpYy5tc2dfbGVuZ3RoKTsgLyogb3IgdGhlIG1zZ191cGRhdGVfbGVuZ3RoIGlzIGJ1Z2d5ICovCisJCQorCWlmIChsZW4pIHsKKwkJKmxlbiA9IG9mZnNldDsKKwl9CisJCisJKmJ1ZmZlciA9IGJ1ZjsKKwlyZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUGFyc2luZyBidWZmZXJzIGFuZCBidWlsZGluZyBBVlAgb2JqZWN0cyBsaXN0cyAobm90IHBhcnNpbmcgdGhlIEFWUCB2YWx1ZXMgd2hpY2ggcmVxdWlyZXMgZGljdGlvbmFyeSBrbm93bGVkZ2UpICovCisKKy8qIFBhcnNlIGEgYnVmZmVyIGNvbnRhaW5pbmcgYSBzdXBwb3NlZCBsaXN0IG9mIEFWUHMgKi8KK3N0YXRpYyBpbnQgcGFyc2VidWZfbGlzdCh1bnNpZ25lZCBjaGFyICogYnVmLCBzaXplX3QgYnVmbGVuLCBzdHJ1Y3QgZmRfbGlzdCAqIGhlYWQpCit7CisJc2l6ZV90IG9mZnNldCA9IDA7CisJCisJVFJBQ0VfRU5UUlkoIiVwICV6ZCAlcCIsIGJ1ZiwgYnVmbGVuLCBoZWFkKTsKKwkKKwl3aGlsZSAob2Zmc2V0IDwgYnVmbGVuKSB7CisJCXN0cnVjdCBhdnAgKiBhdnA7CisJCQorCQlpZiAoYnVmbGVuIC0gb2Zmc2V0IDwgQVZQSERSU1pfTk9WRU5EKSB7CisJCQlUUkFDRV9ERUJVRyhJTkZPLCAidHJ1bmNhdGVkIGJ1ZmZlcjogcmVtYWluaW5nIG9ubHkgJXpkIGJ5dGVzIiwgYnVmbGVuIC0gb2Zmc2V0KTsKKwkJCXJldHVybiBFQkFETVNHOworCQl9CisJCQorCQkvKiBDcmVhdGUgYSBuZXcgQVZQIG9iamVjdCAqLworCQlDSEVDS19NQUxMT0MoICBhdnAgPSBtYWxsb2MgKHNpemVvZihzdHJ1Y3QgYXZwKSkgICk7CisJCQorCQlpbml0X2F2cChhdnApOworCQkKKwkJLyogSW5pdGlhbGl6ZSB0aGUgaGVhZGVyICovCisJCWF2cC0+YXZwX3B1YmxpYy5hdnBfY29kZSAgICA9IG50b2hsKCoodWludDMyX3QgKikoYnVmICsgb2Zmc2V0KSk7CisJCWF2cC0+YXZwX3B1YmxpYy5hdnBfZmxhZ3MgICA9IGJ1ZltvZmZzZXQgKyA0XTsKKwkJYXZwLT5hdnBfcHVibGljLmF2cF9sZW4gICAgID0gKCh1aW50MzJfdClidWZbb2Zmc2V0KzVdKSA8PCAxNiB8ICAoKHVpbnQzMl90KWJ1ZltvZmZzZXQrNl0pIDw8IDggfCAgKCh1aW50MzJfdClidWZbb2Zmc2V0KzddKSA7CisJCQorCQlvZmZzZXQgKz0gODsKKwkJCisJCWlmIChhdnAtPmF2cF9wdWJsaWMuYXZwX2ZsYWdzICYgQVZQX0ZMQUdfVkVORE9SKSB7CisJCQlpZiAoYnVmbGVuIC0gb2Zmc2V0IDwgNCkgeworCQkJCVRSQUNFX0RFQlVHKElORk8sICJ0cnVuY2F0ZWQgYnVmZmVyOiByZW1haW5pbmcgb25seSAlemQgYnl0ZXMgZm9yIHZlbmRvciBhbmQgZGF0YSIsIGJ1ZmxlbiAtIG9mZnNldCk7CisJCQkJZnJlZShhdnApOworCQkJCXJldHVybiBFQkFETVNHOworCQkJfQorCQkJYXZwLT5hdnBfcHVibGljLmF2cF92ZW5kb3IgID0gbnRvaGwoKih1aW50MzJfdCAqKShidWYgKyBvZmZzZXQpKTsKKwkJCW9mZnNldCArPSA0OworCQl9CisJCQorCQkvKiBDaGVjayB0aGVyZSBpcyBlbm91Z2ggcmVtYWluaW5nIGRhdGEgaW4gdGhlIGJ1ZmZlciAqLworCQlpZiAoIChhdnAtPmF2cF9wdWJsaWMuYXZwX2xlbiA+IEdFVEFWUEhEUlNaKGF2cC0+YXZwX3B1YmxpYy5hdnBfZmxhZ3MpKQorCQkmJiAoYnVmbGVuIC0gb2Zmc2V0IDwgYXZwLT5hdnBfcHVibGljLmF2cF9sZW4gLSBHRVRBVlBIRFJTWihhdnAtPmF2cF9wdWJsaWMuYXZwX2ZsYWdzKSkpIHsKKwkJCVRSQUNFX0RFQlVHKElORk8sICJ0cnVuY2F0ZWQgYnVmZmVyOiByZW1haW5pbmcgb25seSAlemQgYnl0ZXMgZm9yIGRhdGEsIGFuZCBhdnAgZGF0YSBzaXplIGlzICVkIiwgCisJCQkJCWJ1ZmxlbiAtIG9mZnNldCwgCisJCQkJCWF2cC0+YXZwX3B1YmxpYy5hdnBfbGVuIC0gR0VUQVZQSERSU1ooYXZwLT5hdnBfcHVibGljLmF2cF9mbGFncykpOworCQkJZnJlZShhdnApOworCQkJcmV0dXJuIEVCQURNU0c7CisJCX0KKwkJCisJCS8qIGJ1ZltvZmZzZXRdIGlzIG5vdyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkYXRhICovCisJCWF2cC0+YXZwX3NvdXJjZSA9ICZidWZbb2Zmc2V0XTsKKwkJCisJCS8qIE5vdyBlYXQgdGhlIGRhdGEgYW5kIGV2ZW50dWFsIHBhZGRpbmcgKi8KKwkJb2Zmc2V0ICs9IFBBRDQoYXZwLT5hdnBfcHVibGljLmF2cF9sZW4gLSBHRVRBVlBIRFJTWihhdnAtPmF2cF9wdWJsaWMuYXZwX2ZsYWdzKSk7CisJCQorCQkvKiBBbmQgaW5zZXJ0IHRoaXMgYXZwIGluIHRoZSBsaXN0LCBhdCB0aGUgZW5kICovCisJCWZkX2xpc3RfaW5zZXJ0X2JlZm9yZSggaGVhZCwgJmF2cC0+YXZwX2NoYWluLmNoYWluaW5nICk7CisJfQorCQorCXJldHVybiAwOworfQorCisvKiBDcmVhdGUgYSBtZXNzYWdlIG9iamVjdCBmcm9tIGEgYnVmZmVyLiBEaWN0aW9uYXJ5IG9iamVjdHMgYXJlIG5vdCByZXNvbHZlZCwgQVZQIGNvbnRlbnRzIGFyZSBub3QgaW50ZXJwcmV0ZWQsIGJ1ZmZlciBpcyBzYXZlZCBpbiBtc2cgKi8KK2ludCBmZF9tc2dfcGFyc2VfYnVmZmVyICggdW5zaWduZWQgY2hhciAqKiBidWZmZXIsIHNpemVfdCBidWZsZW4sIHN0cnVjdCBtc2cgKiogbXNnICkKK3sKKwlzdHJ1Y3QgbXNnICogbmV3ID0gTlVMTDsKKwlpbnQgcmV0ID0gMDsKKwl1aW50MzJfdCBtc2dsZW4gPSAwOworCXVuc2lnbmVkIGNoYXIgKiBidWY7CisJCisJVFJBQ0VfRU5UUlkoIiVwICV6ZCAlcCIsIGJ1ZmZlciwgYnVmbGVuLCBtc2cpOworCQorCUNIRUNLX1BBUkFNUyggIGJ1ZmZlciAmJiAgKmJ1ZmZlciAgJiYgIG1zZyAgJiYgIChidWZsZW4gPj0gR0VUTVNHSERSU1ooKSkgICk7CisJYnVmID0gKmJ1ZmZlcjsKKwkKKwlpZiAoIGJ1ZlswXSAhPSBESUFNRVRFUl9WRVJTSU9OKSB7CisJCVRSQUNFX0RFQlVHKElORk8sICJJbnZhbGlkIHZlcnNpb24gaW4gbWVzc2FnZTogJWQgKHN1cHBvcnRlZDogJWQpIiwgYnVmWzBdLCBESUFNRVRFUl9WRVJTSU9OKTsKKwkJcmV0dXJuIEVCQURNU0c7CisJfQorCQorCW1zZ2xlbiA9IG50b2hsKCoodWludDMyX3QgKilidWYpICYgMHgwMGZmZmZmZjsKKwlpZiAoIGJ1ZmxlbiA8IG1zZ2xlbiApIHsgIAorCQlUUkFDRV9ERUJVRyhJTkZPLCAiVHJ1bmNhdGVkIG1lc3NhZ2UgKCV6ZCAvICVkKSIsIGJ1ZmxlbiwgbXNnbGVuICk7CisJCXJldHVybiBFQkFETVNHOyAKKwl9CisJCisJLyogQ3JlYXRlIGEgbmV3IG9iamVjdCAqLworCUNIRUNLX01BTExPQyggbmV3ID0gbWFsbG9jIChzaXplb2Yoc3RydWN0IG1zZykpICk7CisJCisJLyogSW5pdGlhbGl6ZSB0aGUgZmllbGRzICovCisJaW5pdF9tc2cobmV3KTsKKwkKKwkvKiBOb3cgcmVhZCBmcm9tIHRoZSBidWZmZXIgKi8KKwluZXctPm1zZ19wdWJsaWMubXNnX3ZlcnNpb24gPSBidWZbMF07CisJbmV3LT5tc2dfcHVibGljLm1zZ19sZW5ndGggPSBtc2dsZW47CisKKwluZXctPm1zZ19wdWJsaWMubXNnX2ZsYWdzID0gYnVmWzRdOworCW5ldy0+bXNnX3B1YmxpYy5tc2dfY29kZSA9IG50b2hsKCoodWludDMyX3QgKikoYnVmKzQpKSAmIDB4MDBmZmZmZmY7CisJCisJbmV3LT5tc2dfcHVibGljLm1zZ19hcHBsID0gbnRvaGwoKih1aW50MzJfdCAqKShidWYrOCkpOworCW5ldy0+bXNnX3B1YmxpYy5tc2dfaGJoaWQgPSBudG9obCgqKHVpbnQzMl90ICopKGJ1ZisxMikpOworCW5ldy0+bXNnX3B1YmxpYy5tc2dfZXRlaWQgPSBudG9obCgqKHVpbnQzMl90ICopKGJ1ZisxNikpOworCQorCS8qIFBhcnNlIHRoZSBBVlAgbGlzdCAqLworCUNIRUNLX0ZDVF9ETyggcmV0ID0gcGFyc2VidWZfbGlzdChidWYgKyBHRVRNU0dIRFJTWigpLCBidWZsZW4gLSBHRVRNU0dIRFJTWigpLCAmbmV3LT5tc2dfY2hhaW4uY2hpbGRyZW4pLCB7IGRlc3Ryb3lfdHJlZShfQyhuZXcpKTsgcmV0dXJuIHJldDsgfSAgKTsKKwkKKwkvKiBQYXJzaW5nIHN1Y2Nlc3NmdWwgKi8KKwluZXctPm1zZ19yYXdidWZmZXIgPSBidWY7CisJKmJ1ZmZlciA9IE5VTEw7CisJKm1zZyA9IG5ldzsKKwlyZXR1cm4gMDsKK30KKworCQkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBQYXJzaW5nIG1lc3NhZ2VzIGFuZCBBVlAgd2l0aCBkaWN0aW9uYXJ5IGluZm9ybWF0aW9uICovCisKKy8qIFJlc29sdmUgZGljdGlvbmFyeSBvYmplY3RzIG9mIHRoZSBjbWQgYW5kIGF2cCBpbnN0YW5jZXMsIGZyb20gdGhlaXIgaGVhZGVycy4KKyAqIFdoZW4gdGhlIG1vZGVsIGlzIGZvdW5kLCB0aGUgZGF0YSBpcyBpbnRlcnByZXRlZCBmcm9tIHRoZSBhdnBfc291cmNlIGJ1ZmZlciBhbmQgY29waWVkIHRvIGF2cF9zdG9yYWdlLgorICogV2hlbiB0aGUgbW9kZWwgaXMgbm90IGZvdW5kLCB0aGUgZGF0YSBpcyBjb3BpZWQgYXMgcmF3ZGF0YSBhbmQgc2F2ZWQgKGluIGNhc2Ugd2UgRlcgdGhlIG1lc3NhZ2UpLgorICogVGhlcmVmb3JlLCBhZnRlciB0aGlzIGZ1bmN0aW9uIGhhcyBiZWVuIGNhbGxlZCwgdGhlIHNvdXJjZSBidWZmZXIgY2FuIGJlIGZyZWVkLgorICogRm9yIGNvbW1hbmQsIGlmIHRoZSBkaWN0aW9uYXJ5IG1vZGVsIGlzIG5vdCBmb3VuZCwgYW4gZXJyb3IgaXMgcmV0dXJuZWQuCisgKi8KKworc3RhdGljIGNoYXIgZXJyb3JfbWVzc2FnZVsyNTZdOworCisvKiBQcm9jZXNzIGFuIEFWUC4gSWYgd2UgYXJlIG5vdCBpbiByZWNoZWNrLCB0aGUgYXZwX3NvdXJjZSBtdXN0IGJlIHNldC4gKi8KK3N0YXRpYyBpbnQgcGFyc2VkaWN0X2RvX2F2cChzdHJ1Y3QgZGljdGlvbmFyeSAqIGRpY3QsIHN0cnVjdCBhdnAgKiBhdnAsIGludCBtYW5kYXRvcnksIHN0cnVjdCBmZF9wZWkgKmVycm9yX2luZm8pCit7CisJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGljdGRhdGE7CisJc3RydWN0IGRpY3RfdHlwZV9kYXRhIGRlcml2ZWR0eXBlZGF0YTsKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnBfZGVyaXZlZF90eXBlID0gTlVMTDsKKwl1aW50OF90ICogc291cmNlOworCQorCVRSQUNFX0VOVFJZKCIlcCAlcCAlZCAlcCIsIGRpY3QsIGF2cCwgbWFuZGF0b3J5LCBlcnJvcl9pbmZvKTsKKwkKKwkvKiBGaXJzdCBjaGVjayB3ZSByZWNlaXZlZCBhbiBBVlAgYXMgaW5wdXQgKi8KKwlDSEVDS19QQVJBTVMoICBDSEVDS19BVlAoYXZwKSApOworCQorCWlmIChhdnAtPmF2cF9tb2RlbCAhPSBOVUxMKSB7CisJCS8qIHRoZSBtb2RlbCBoYXMgYWxyZWFkeSBiZWVuIHJlc29sdmVkLiB3ZSBkbyBjaGVjayBpdCBpcyBzdGlsbCB2YWxpZCAqLworCisJCUNIRUNLX0ZDVCggIGZkX2RpY3RfZ2V0dmFsKGF2cC0+YXZwX21vZGVsLCAmZGljdGRhdGEpICApOworCisJCWlmICggYXZwLT5hdnBfcHVibGljLmF2cF9jb2RlID09IGRpY3RkYXRhLmF2cF9jb2RlICApIHsKKwkJCS8qIE9rIHRoZW4ganVzdCBwcm9jZXNzIHRoZSBjaGlsZHJlbiBpZiBhbnkgKi8KKwkJCXJldHVybiBwYXJzZWRpY3RfZG9fY2hhaW4oZGljdCwgJmF2cC0+YXZwX2NoYWluLmNoaWxkcmVuLCBtYW5kYXRvcnkgJiYgKGF2cC0+YXZwX3B1YmxpYy5hdnBfZmxhZ3MgJiBBVlBfRkxBR19NQU5EQVRPUlkpLCBlcnJvcl9pbmZvKTsKKwkJfSBlbHNlIHsKKwkJCS8qIFdlIGp1c3QgZXJhc2UgdGhlIG9sZCBtb2RlbCAqLworCQkJYXZwLT5hdnBfbW9kZWwgPSBOVUxMOworCQl9CisJfQorCQorCS8qIENoZWNrIGlmIHdlIGFscmVhZHkgc2VhcmNoZWQgZm9yIHRoaXMgbW9kZWwgd2l0aG91dCBzdWNjZXNzICovCisJaWYgKChhdnAtPmF2cF9tb2RlbF9ub3RfZm91bmQubW5mX2NvZGUgIT0gYXZwLT5hdnBfcHVibGljLmF2cF9jb2RlKQorCXx8ICAoYXZwLT5hdnBfbW9kZWxfbm90X2ZvdW5kLm1uZl92ZW5kb3IgIT0gYXZwLT5hdnBfcHVibGljLmF2cF92ZW5kb3IpKSB7CisJCisJCS8qIE5vdyB0cnkgYW5kIHJlc29sdmUgdGhlIG1vZGVsIGZyb20gdGhlIGF2cCBjb2RlIGFuZCB2ZW5kb3IgKi8KKwkJaWYgKGF2cC0+YXZwX3B1YmxpYy5hdnBfZmxhZ3MgJiBBVlBfRkxBR19WRU5ET1IpIHsKKwkJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0X2V4IGF2cHJlcTsKKwkJCW1lbXNldCgmYXZwcmVxLCAwLCBzaXplb2YoYXZwcmVxKSk7CisJCQlhdnByZXEuYXZwX3ZlbmRvci52ZW5kb3JfaWQgPSBhdnAtPmF2cF9wdWJsaWMuYXZwX3ZlbmRvcjsKKwkJCWF2cHJlcS5hdnBfZGF0YS5hdnBfY29kZSA9IGF2cC0+YXZwX3B1YmxpYy5hdnBfY29kZTsKKwkJCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2ggKCBkaWN0LCBESUNUX0FWUCwgQVZQX0JZX1NUUlVDVCwgJmF2cHJlcSwgJmF2cC0+YXZwX21vZGVsLCAwKSk7CisJCX0gZWxzZSB7CisJCQkvKiBubyB2ZW5kb3IgKi8KKwkJCUNIRUNLX0ZDVCggZmRfZGljdF9zZWFyY2ggKCBkaWN0LCBESUNUX0FWUCwgQVZQX0JZX0NPREUsICZhdnAtPmF2cF9wdWJsaWMuYXZwX2NvZGUsICZhdnAtPmF2cF9tb2RlbCwgMCkpOworCQl9CisJCQorCQlpZiAoIWF2cC0+YXZwX21vZGVsKSB7CisJCQlhdnAtPmF2cF9tb2RlbF9ub3RfZm91bmQubW5mX2NvZGUgPSBhdnAtPmF2cF9wdWJsaWMuYXZwX2NvZGU7CisJCQlhdnAtPmF2cF9tb2RlbF9ub3RfZm91bmQubW5mX3ZlbmRvciA9IGF2cC0+YXZwX3B1YmxpYy5hdnBfdmVuZG9yOworCQl9CisJfQorCQorCS8qIEZpcnN0IGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB3ZSBoYXZlIG5vdCBmb3VuZCB0aGlzIEFWUCBpbiB0aGUgZGljdGlvbmFyeSAqLworCWlmICghYXZwLT5hdnBfbW9kZWwpIHsKKwkJCisJCWlmIChtYW5kYXRvcnkgJiYgKGF2cC0+YXZwX3B1YmxpYy5hdnBfZmxhZ3MgJiBBVlBfRkxBR19NQU5EQVRPUlkpKSB7CisJCQlUUkFDRV9ERUJVRyhJTkZPLCAiVW5zdXBwb3J0ZWQgbWFuZGF0b3J5IEFWUCBmb3VuZCIpOworCQkJaWYgKGVycm9yX2luZm8pIHsKKwkJCQllcnJvcl9pbmZvLT5wZWlfZXJyY29kZSA9ICJESUFNRVRFUl9BVlBfVU5TVVBQT1JURUQiOworCQkJCWVycm9yX2luZm8tPnBlaV9hdnAgPSBhdnA7CisJCQl9IGVsc2UgeworCQkJCWNoYXIgKiBidWYgPSBOVUxMOworCQkJCXNpemVfdCBidWZsZW47CisJCQkJQ0hFQ0tfTUFMTE9DKGZkX21zZ19kdW1wX3RyZWV2aWV3KCZidWYsICZidWZsZW4sIE5VTEwsIGF2cCwgTlVMTCwgMCwgMCkpOworCQkJCUxPR19FKCJVbnN1cHBvcnRlZCBBVlA6ICVzIiwgYnVmKTsKKwkJCQlmcmVlKGJ1Zik7CisJCQl9CisJCQlyZXR1cm4gRU5PVFNVUDsKKwkJfQorCQkKKwkJaWYgKGF2cC0+YXZwX3NvdXJjZSkgeworCQkJLyogd2UgbXVzdCBjb3B5IHRoZSBkYXRhIGZyb20gdGhlIHNvdXJjZSB0byB0aGUgaW50ZXJuYWwgYnVmZmVyIGFyZWEgKi8KKwkJCUNIRUNLX1BBUkFNUyggIWF2cC0+YXZwX3Jhd2RhdGEgICk7CisJCQkKKwkJCWF2cC0+YXZwX3Jhd2xlbiA9IGF2cC0+YXZwX3B1YmxpYy5hdnBfbGVuIC0gR0VUQVZQSERSU1ooIGF2cC0+YXZwX3B1YmxpYy5hdnBfZmxhZ3MgKTsKKwkJCQorCQkJaWYgKGF2cC0+YXZwX3Jhd2xlbikgeworCQkJCUNIRUNLX01BTExPQyggIGF2cC0+YXZwX3Jhd2RhdGEgPSBtYWxsb2MoYXZwLT5hdnBfcmF3bGVuKSAgKTsKKwkJCQorCQkJCW1lbWNweShhdnAtPmF2cF9yYXdkYXRhLCBhdnAtPmF2cF9zb3VyY2UsIGF2cC0+YXZwX3Jhd2xlbik7CisJCQl9CisJCQkKKwkJCWF2cC0+YXZwX3NvdXJjZSA9IE5VTEw7CisJCQkKKwkJCVRSQUNFX0RFQlVHKEZVTEwsICJVbnN1cHBvcnRlZCBvcHRpb25hbCBBVlAgZm91bmQsIHJhdyBzb3VyY2UgZGF0YSBzYXZlZCBpbiBhdnBfcmF3ZGF0YS4iKTsKKwkJfQorCQkKKwkJcmV0dXJuIDA7CisJfQorCQorCS8qIE9rIHdlIGhhdmUgcmVzb2x2ZWQgdGhlIG9iamVjdC4gTm93IHdlIG5lZWQgdG8gaW50ZXJwcmV0IGl0cyBjb250ZW50LiAqLworCQorCUNIRUNLX0ZDVCggIGZkX2RpY3RfZ2V0dmFsKGF2cC0+YXZwX21vZGVsLCAmZGljdGRhdGEpICApOworCQorCWlmIChhdnAtPmF2cF9yYXdkYXRhKSB7CisJCS8qIFRoaXMgaGFwcGVucyBpZiB0aGUgZGljdGlvbmFyeSBvYmplY3Qgd2FzIGRlZmluZWQgYWZ0ZXIgdGhlIGZpcnN0IGNoZWNrICovCisJCWF2cC0+YXZwX3NvdXJjZSA9IGF2cC0+YXZwX3Jhd2RhdGE7CisJfQorCQorCS8qIEEgYml0IG9mIHNhbml0eSBoZXJlLi4uICovCisJQVNTRVJUKENIRUNLX0JBU0VUWVBFKGRpY3RkYXRhLmF2cF9iYXNldHlwZSkpOworCQorCS8qIENoZWNrIHRoZSBzaXplIGlzIHZhbGlkICovCisJaWYgKChhdnBfdmFsdWVfc2l6ZXNbZGljdGRhdGEuYXZwX2Jhc2V0eXBlXSAhPSAwKSAmJgorCSAgICAoYXZwLT5hdnBfcHVibGljLmF2cF9sZW4gLSBHRVRBVlBIRFJTWiggYXZwLT5hdnBfcHVibGljLmF2cF9mbGFncyApICE9IGF2cF92YWx1ZV9zaXplc1tkaWN0ZGF0YS5hdnBfYmFzZXR5cGVdKSkgeworCQlUUkFDRV9ERUJVRyhJTkZPLCAiVGhlIEFWUCBzaXplIGlzIG5vdCBzdWl0YWJsZSBmb3IgdGhlIHR5cGUiKTsKKwkJaWYgKGVycm9yX2luZm8pIHsKKwkJCWVycm9yX2luZm8tPnBlaV9lcnJjb2RlID0gIkRJQU1FVEVSX0lOVkFMSURfQVZQX0xFTkdUSCI7CisJCQllcnJvcl9pbmZvLT5wZWlfYXZwID0gYXZwOworCQkJc25wcmludGYoZXJyb3JfbWVzc2FnZSwgc2l6ZW9mKGVycm9yX21lc3NhZ2UpLCAiSSBleHBlY3RlZCBhIHNpemUgb2YgJWQgZm9yIHRoaXMgQVZQIGFjY29yZGluZyB0byBteSBkaWN0aW9uYXJ5IiwgYXZwX3ZhbHVlX3NpemVzW2RpY3RkYXRhLmF2cF9iYXNldHlwZV0pOworCQkJZXJyb3JfaW5mby0+cGVpX21lc3NhZ2UgPSBlcnJvcl9tZXNzYWdlOworCQl9IGVsc2UgeworCQkJY2hhciAqIGJ1ZiA9IE5VTEw7CisJCQlzaXplX3QgYnVmbGVuOworCQkJQ0hFQ0tfTUFMTE9DKGZkX21zZ19kdW1wX3RyZWV2aWV3KCZidWYsICZidWZsZW4sIE5VTEwsIGF2cCwgTlVMTCwgMCwgMCkpOworCQkJTE9HX0UoIkludmFsaWQgbGVuZ3RoIEFWUDogJXMiLCBidWYpOworCQkJZnJlZShidWYpOworCQl9CisJCWF2cC0+YXZwX21vZGVsID0gTlVMTDsKKwkJcmV0dXJuIEVCQURNU0c7CisJfQorCQorCXNvdXJjZSA9IGF2cC0+YXZwX3NvdXJjZTsKKwlhdnAtPmF2cF9zb3VyY2UgPSBOVUxMOworCisJLyogTm93IGdldCB0aGUgdmFsdWUgaW5zaWRlICovCisJc3dpdGNoIChkaWN0ZGF0YS5hdnBfYmFzZXR5cGUpIHsKKwkJY2FzZSBBVlBfVFlQRV9HUk9VUEVEOiB7CisJCQlpbnQgcmV0OworCQkJCisJCQkvKiBUaGlzIGlzIGEgZ3JvdXBlZCBBVlAsIHNvIGxldCdzIHBhcnNlIHRoZSBsaXN0IG9mIEFWUHMgaW5zaWRlICovCisJCQlDSEVDS19GQ1RfRE8oICByZXQgPSBwYXJzZWJ1Zl9saXN0KHNvdXJjZSwgYXZwLT5hdnBfcHVibGljLmF2cF9sZW4gLSBHRVRBVlBIRFJTWiggYXZwLT5hdnBfcHVibGljLmF2cF9mbGFncyApLCAmYXZwLT5hdnBfY2hhaW4uY2hpbGRyZW4pLAorCQkJCXsKKwkJCQkJaWYgKChyZXQgPT0gRUJBRE1TRykgJiYgKGVycm9yX2luZm8pKSB7CisJCQkJCQllcnJvcl9pbmZvLT5wZWlfZXJyY29kZSA9ICJESUFNRVRFUl9JTlZBTElEX0FWUF9WQUxVRSI7CisJCQkJCQllcnJvcl9pbmZvLT5wZWlfYXZwID0gYXZwOworCQkJCQkJc25wcmludGYoZXJyb3JfbWVzc2FnZSwgc2l6ZW9mKGVycm9yX21lc3NhZ2UpLCAiSSBjYW5ub3QgcGFyc2UgdGhpcyBBVlAgYXMgYSBHcm91cGVkIEFWUCIpOworCQkJCQkJZXJyb3JfaW5mby0+cGVpX21lc3NhZ2UgPSBlcnJvcl9tZXNzYWdlOworCQkJCQl9CisJCQkJCWF2cC0+YXZwX3NvdXJjZSA9IHNvdXJjZTsKKwkJCQkJcmV0dXJuIHJldDsKKwkJCQl9ICApOworCQkJCisJCQlyZXR1cm4gcGFyc2VkaWN0X2RvX2NoYWluKGRpY3QsICZhdnAtPmF2cF9jaGFpbi5jaGlsZHJlbiwgbWFuZGF0b3J5ICYmIChhdnAtPmF2cF9wdWJsaWMuYXZwX2ZsYWdzICYgQVZQX0ZMQUdfTUFOREFUT1JZKSwgZXJyb3JfaW5mbyk7CisJCX0KKwkJCQorCQljYXNlIEFWUF9UWVBFX09DVEVUU1RSSU5HOgorCQkJLyogV2UganVzdCBoYXZlIHRvIGNvcHkgdGhlIHN0cmluZyBpbnRvIHRoZSBzdG9yYWdlIGFyZWEgKi8KKwkJCUNIRUNLX1BBUkFNU19ETyggYXZwLT5hdnBfcHVibGljLmF2cF9sZW4gPj0gR0VUQVZQSERSU1ooIGF2cC0+YXZwX3B1YmxpYy5hdnBfZmxhZ3MgKSwKKwkJCQl7CisJCQkJCWlmIChlcnJvcl9pbmZvKSB7CisJCQkJCQllcnJvcl9pbmZvLT5wZWlfZXJyY29kZSA9ICJESUFNRVRFUl9JTlZBTElEX0FWUF9MRU5HVEgiOworCQkJCQkJZXJyb3JfaW5mby0+cGVpX2F2cCA9IGF2cDsKKwkJCQkJfQorCQkJCQlhdnAtPmF2cF9zb3VyY2UgPSBzb3VyY2U7CisJCQkJCXJldHVybiBFQkFETVNHOworCQkJCX0gKTsKKwkJCWF2cC0+YXZwX3N0b3JhZ2Uub3MubGVuID0gYXZwLT5hdnBfcHVibGljLmF2cF9sZW4gLSBHRVRBVlBIRFJTWiggYXZwLT5hdnBfcHVibGljLmF2cF9mbGFncyApOworCQkJQ0hFQ0tfTUFMTE9DKCAgYXZwLT5hdnBfc3RvcmFnZS5vcy5kYXRhID0gb3MwZHVwKHNvdXJjZSwgYXZwLT5hdnBfc3RvcmFnZS5vcy5sZW4pICApOworCQkJYXZwLT5hdnBfbXVzdGZyZWVvcyA9IDE7CisJCQlicmVhazsKKwkJCisJCWNhc2UgQVZQX1RZUEVfSU5URUdFUjMyOgorCQkJYXZwLT5hdnBfc3RvcmFnZS5pMzIgPSAoaW50MzJfdCludG9obCgqKHVpbnQzMl90ICopc291cmNlKTsKKwkJCWJyZWFrOworCQorCQljYXNlIEFWUF9UWVBFX0lOVEVHRVI2NDoKKwkJCS8qIHRoZSBzdG9yYWdlIG1pZ2h0IG5vdCBiZSBhbGlnbmVkIG9uIDY0YiBib3VuZGFyeSwgc28gbm8gZGlyZWN0IGluZGlyZWN0aW9uIGhlcmUgaXMgcG9zc2libGUgKi8KKwkJCXsKKwkJCQl1aW50NjRfdCBfX3N0b3I7CisJCQkJbWVtY3B5KCZfX3N0b3IsIHNvdXJjZSwgc2l6ZW9mKF9fc3RvcikpOworCQkJCWF2cC0+YXZwX3N0b3JhZ2UuaTY0ID0gKGludDY0X3QpbnRvaGxsKF9fc3Rvcik7CisJCQl9CisJCQlicmVhazsKKwkKKwkJY2FzZSBBVlBfVFlQRV9VTlNJR05FRDMyOgorCQljYXNlIEFWUF9UWVBFX0ZMT0FUMzI6IC8qIEZvciBmbG9hdCwgd2UgbXVzdCBub3QgY2FzdCwgb3IgdGhlIHZhbHVlIGlzIGNoYW5nZWQuIEluc3RlYWQgd2UgdXNlIGltcGxpY2l0IGNhc3QgYnkgY2hhbmdpbmcgdGhlIG1lbWJlciBvZiB0aGUgdW5pb24gKi8KKwkJCWF2cC0+YXZwX3N0b3JhZ2UudTMyID0gKHVpbnQzMl90KW50b2hsKCoodWludDMyX3QgKilzb3VyY2UpOworCQkJYnJlYWs7CisJCisJCWNhc2UgQVZQX1RZUEVfVU5TSUdORUQ2NDoKKwkJY2FzZSBBVlBfVFlQRV9GTE9BVDY0OiAvKiBzYW1lIGFzIDMyIGJpdHMgKi8KKwkJCXsKKwkJCQl1aW50NjRfdCBfX3N0b3I7CisJCQkJbWVtY3B5KCZfX3N0b3IsIHNvdXJjZSwgc2l6ZW9mKF9fc3RvcikpOworCQkJCWF2cC0+YXZwX3N0b3JhZ2UudTY0ID0gKHVpbnQ2NF90KW50b2hsbChfX3N0b3IpOworCQkJfQorCQkJYnJlYWs7CisJCisJfQorCQorCS8qIElzIHRoZXJlIGEgZGVyaXZlZCB0eXBlIGNoZWNrIGZ1bmN0aW9uID8gKi8KKwlDSEVDS19GQ1QgKCBmZF9kaWN0X3NlYXJjaCAoIGRpY3QsIERJQ1RfVFlQRSwgVFlQRV9PRl9BVlAsIGF2cC0+YXZwX21vZGVsLCAmYXZwX2Rlcml2ZWRfdHlwZSwgMCkgKTsKKwlpZiAoYXZwX2Rlcml2ZWRfdHlwZSkgeworCQlDSEVDS19GQ1QoICBmZF9kaWN0X2dldHZhbChhdnBfZGVyaXZlZF90eXBlLCAmZGVyaXZlZHR5cGVkYXRhKSAgKTsKKwkJaWYgKGRlcml2ZWR0eXBlZGF0YS50eXBlX2NoZWNrICE9IE5VTEwpIHsKKwkJCWNoYXIgKiBlcnI7CisJCQlpbnQgcmV0ID0gKCpkZXJpdmVkdHlwZWRhdGEudHlwZV9jaGVjaykoIGRlcml2ZWR0eXBlZGF0YS50eXBlX2NoZWNrX3BhcmFtLCAmYXZwLT5hdnBfc3RvcmFnZSwgJmVyciApOworCisJCQlpZiAocmV0ICE9IDApIHsKKwkJCQlUUkFDRV9ERUJVRyhJTkZPLCAiVGhlIEFWUCBmYWlsZWQgdG8gcGFzcyB0aGUgZGljdGlvbmFyeSB2YWxpZGF0aW9uIik7CisJCQkJaWYgKGVycm9yX2luZm8pIHsJCQkJCisJCQkJCQllcnJvcl9pbmZvLT5wZWlfZXJyY29kZSA9ICJESUFNRVRFUl9JTlZBTElEX0FWUF9WQUxVRSI7CisJCQkJCQllcnJvcl9pbmZvLT5wZWlfYXZwID0gYXZwOworCQkJCQkJc3RybmNweShlcnJvcl9tZXNzYWdlLCBlcnIsIHNpemVvZihlcnJvcl9tZXNzYWdlKSk7CisJCQkJCQllcnJvcl9pbmZvLT5wZWlfbWVzc2FnZSA9IGVycm9yX21lc3NhZ2U7CisJCQkJfSBlbHNlIHsKKwkJCQkJY2hhciAqIGJ1ZiA9IE5VTEw7CisJCQkJCXNpemVfdCBidWZsZW47CisJCQkJCUNIRUNLX01BTExPQyhmZF9tc2dfZHVtcF90cmVldmlldygmYnVmLCAmYnVmbGVuLCBOVUxMLCBhdnAsIE5VTEwsIDAsIDApKTsKKwkJCQkJTE9HX0UoIkludmFsaWQgQVZQOiAlcyIsIGJ1Zik7CisJCQkJCWZyZWUoYnVmKTsKKwkJCQl9CisJCQkJcmV0dXJuIHJldDsgLyogc2hvdWxkIHdlIGp1c3QgcmV0dXJuIEVCQURNU0c/ICovCisJCQl9CisJCX0KKwl9CisJCisJLyogVGhlIHZhbHVlIGlzIG5vdyBzZXQsIHNvIHNldCB0aGUgZGF0YSBwb2ludGVyIGFuZCByZXR1cm4gMCAqLworCWF2cC0+YXZwX3B1YmxpYy5hdnBfdmFsdWUgPSAmYXZwLT5hdnBfc3RvcmFnZTsKKwlyZXR1cm4gMDsKK30KKworLyogUHJvY2VzcyBhIGxpc3Qgb2YgQVZQcyAqLworc3RhdGljIGludCBwYXJzZWRpY3RfZG9fY2hhaW4oc3RydWN0IGRpY3Rpb25hcnkgKiBkaWN0LCBzdHJ1Y3QgZmRfbGlzdCAqIGhlYWQsIGludCBtYW5kYXRvcnksIHN0cnVjdCBmZF9wZWkgKmVycm9yX2luZm8pCit7CisJc3RydWN0IGZkX2xpc3QgKiBhdnBjaDsKKwkKKwlUUkFDRV9FTlRSWSgiJXAgJXAgJWQgJXAiLCBkaWN0LCBoZWFkLCBtYW5kYXRvcnksIGVycm9yX2luZm8pOworCQorCS8qIFNhbml0eSBjaGVjayAqLworCUFTU0VSVCAoIGhlYWQgPT0gaGVhZC0+aGVhZCApOworCQorCS8qIE5vdyBwcm9jZXNzIHRoZSBsaXN0ICovCisJZm9yIChhdnBjaD1oZWFkLT5uZXh0OyBhdnBjaCAhPSBoZWFkOyBhdnBjaCA9IGF2cGNoLT5uZXh0KSB7CisJCUNIRUNLX0ZDVCggIHBhcnNlZGljdF9kb19hdnAoZGljdCwgX0EoYXZwY2gtPm8pLCBtYW5kYXRvcnksIGVycm9yX2luZm8pICApOworCX0KKwkKKwkvKiBEb25lICovCisJcmV0dXJuIDA7Cit9CisKKy8qIFByb2Nlc3MgYSBtc2cgaGVhZGVyLiAqLworc3RhdGljIGludCBwYXJzZWRpY3RfZG9fbXNnKHN0cnVjdCBkaWN0aW9uYXJ5ICogZGljdCwgc3RydWN0IG1zZyAqIG1zZywgaW50IG9ubHlfaGRyLCBzdHJ1Y3QgZmRfcGVpICplcnJvcl9pbmZvKQoreworCWludCByZXQgPSAwOworCQorCVRSQUNFX0VOVFJZKCIlcCAlcCAlZCAlcCIsIGRpY3QsIG1zZywgb25seV9oZHIsIGVycm9yX2luZm8pOworCQorCUNIRUNLX1BBUkFNUyggIENIRUNLX01TRyhtc2cpICApOworCQorCS8qIEZpcnN0LCBjaGVjayBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBtb2RlbC4gKi8KKwlpZiAobXNnLT5tc2dfbW9kZWwgIT0gTlVMTCkgeworCQkvKiBDaGVjayBpZiB0aGlzIG1vZGVsIGlzIHN0aWxsIHZhbGlkIGZvciB0aGUgbWVzc2FnZSBkYXRhICovCisJCWVudW0gZGljdF9vYmplY3RfdHlwZSAJIGRpY3R0eXBlOworCQlzdHJ1Y3QgZGljdF9jbWRfZGF0YSAgICAgZGF0YTsKKwkJQVNTRVJUKCgoZmRfZGljdF9nZXR0eXBlKG1zZy0+bXNnX21vZGVsLCAmZGljdHR5cGUpID09IDApICYmIChkaWN0dHlwZSA9PSBESUNUX0NPTU1BTkQpKSk7CisJCSh2b2lkKWZkX2RpY3RfZ2V0dmFsKCBtc2ctPm1zZ19tb2RlbCwgJmRhdGEpOworCQlpZiAoKGRhdGEuY21kX2NvZGUgIT0gbXNnLT5tc2dfcHVibGljLm1zZ19jb2RlKSAKKwkJfHwgICgoZGF0YS5jbWRfZmxhZ192YWwgJiBkYXRhLmNtZF9mbGFnX21hc2spICE9IChtc2ctPm1zZ19wdWJsaWMubXNnX2ZsYWdzICYmIGRhdGEuY21kX2ZsYWdfbWFzaykpKSB7CisJCQltc2ctPm1zZ19tb2RlbCA9IE5VTEw7CisJCX0gZWxzZSB7CisJCQlnb3RvIGNoYWluOworCQl9CisJfQorCQorCS8qIENoZWNrIGlmIHdlIGFscmVhZHkgc2VhcmNoZWQgZm9yIHRoaXMgbW9kZWwgd2l0aG91dCBzdWNjZXNzICovCisJaWYgKChtc2ctPm1zZ19tb2RlbF9ub3RfZm91bmQubW5mX2NvZGUgPT0gbXNnLT5tc2dfcHVibGljLm1zZ19jb2RlKSAKKwkmJiAobXNnLT5tc2dfbW9kZWxfbm90X2ZvdW5kLm1uZl9mbGFncyA9PSBtc2ctPm1zZ19wdWJsaWMubXNnX2ZsYWdzKSkgeworCQlnb3RvIG5vX21vZGVsOworCX0gZWxzZSB7CisJCW1zZy0+bXNnX21vZGVsX25vdF9mb3VuZC5tbmZfY29kZSA9IDA7CisJfQorCQorCS8qIExvb2sgZm9yIHRoZSBtb2RlbCBmcm9tIHRoZSBoZWFkZXIgKi8KKwlDSEVDS19GQ1RfRE8oIHJldCA9IGZkX2RpY3Rfc2VhcmNoICggZGljdCwgRElDVF9DT01NQU5ELCAKKwkJCShtc2ctPm1zZ19wdWJsaWMubXNnX2ZsYWdzICYgQ01EX0ZMQUdfUkVRVUVTVCkgPyBDTURfQllfQ09ERV9SIDogQ01EX0JZX0NPREVfQSwKKwkJCSZtc2ctPm1zZ19wdWJsaWMubXNnX2NvZGUsCisJCQkmbXNnLT5tc2dfbW9kZWwsIEVOT1RTVVApLAorCQl7CisJCQlpZiAocmV0ID09IEVOT1RTVVApIHsKKwkJCQkvKiB1cGRhdGUgdGhlIG1vZGVsIG5vdCBmb3VuZCBpbmZvICovCisJCQkJbXNnLT5tc2dfbW9kZWxfbm90X2ZvdW5kLm1uZl9jb2RlID0gbXNnLT5tc2dfcHVibGljLm1zZ19jb2RlOworCQkJCW1zZy0+bXNnX21vZGVsX25vdF9mb3VuZC5tbmZfZmxhZ3MgPSBtc2ctPm1zZ19wdWJsaWMubXNnX2ZsYWdzOworCQkJCWdvdG8gbm9fbW9kZWw7CisJCQl9CisJCQlyZXR1cm4gcmV0OworCQl9ICk7CitjaGFpbjoJCisJaWYgKCFvbmx5X2hkcikgeworCQkvKiBUaGVuIHByb2Nlc3MgdGhlIGNoaWxkcmVuICovCisJCXJldCA9IHBhcnNlZGljdF9kb19jaGFpbihkaWN0LCAmbXNnLT5tc2dfY2hhaW4uY2hpbGRyZW4sIDEsIGVycm9yX2luZm8pOworCisJCS8qIEZyZWUgdGhlIHJhdyBidWZmZXIgaWYgYW55ICovCisJCWlmICgocmV0ID09IDApICYmIChtc2ctPm1zZ19yYXdidWZmZXIgIT0gTlVMTCkpIHsKKwkJCWZyZWUobXNnLT5tc2dfcmF3YnVmZmVyKTsKKwkJCW1zZy0+bXNnX3Jhd2J1ZmZlcj1OVUxMOworCQl9CisJfQorCQorCXJldHVybiByZXQ7Citub19tb2RlbDoKKwlpZiAoZXJyb3JfaW5mbykgeworCQllcnJvcl9pbmZvLT5wZWlfZXJyY29kZSA9ICJESUFNRVRFUl9DT01NQU5EX1VOU1VQUE9SVEVEIjsKKwkJZXJyb3JfaW5mby0+cGVpX3Byb3RvZXJyID0gMTsKKwl9CisJcmV0dXJuIEVOT1RTVVA7Cit9CisKK2ludCBmZF9tc2dfcGFyc2VfZGljdCAoIG1zZ19vcl9hdnAgKiBvYmplY3QsIHN0cnVjdCBkaWN0aW9uYXJ5ICogZGljdCwgc3RydWN0IGZkX3BlaSAqZXJyb3JfaW5mbyApCit7CisJVFJBQ0VfRU5UUlkoIiVwICVwICVwIiwgZGljdCwgb2JqZWN0LCBlcnJvcl9pbmZvKTsKKwkKKwlDSEVDS19QQVJBTVMoICBWQUxJREFURV9PQkoob2JqZWN0KSAgKTsKKwkKKwlpZiAoZXJyb3JfaW5mbykKKwkJbWVtc2V0KGVycm9yX2luZm8sIDAsIHNpemVvZihzdHJ1Y3QgZmRfcGVpKSk7CisJCisJc3dpdGNoIChfQyhvYmplY3QpLT50eXBlKSB7CisJCWNhc2UgTVNHX01TRzoKKwkJCXJldHVybiBwYXJzZWRpY3RfZG9fbXNnKGRpY3QsIF9NKG9iamVjdCksIDAsIGVycm9yX2luZm8pOworCQkKKwkJY2FzZSBNU0dfQVZQOgorCQkJcmV0dXJuIHBhcnNlZGljdF9kb19hdnAoZGljdCwgX0Eob2JqZWN0KSwgMCwgZXJyb3JfaW5mbyk7CisJCQorCQlkZWZhdWx0OgorCQkJQVNTRVJUKDApOworCX0KKwlyZXR1cm4gRUlOVkFMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUGFyc2luZyBtZXNzYWdlcyBhbmQgQVZQIGZvciBydWxlcyAoQUJORikgY29tcGxpYW5jZSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZ2V0IHN0YXRzIChmaXJzdCBvY2N1cmVuY2UgcG9zaXRpb24sIGxhc3Qgb2NjdXJlbmNlIHBvc2l0aW9uLCBudW1iZXIgb2Ygb2NjdXJlbmNlcykgCisgICBvZiBBVlAgaW5zdGFuY2VzIG9mIGEgZ2l2ZW4gbW9kZWwgaW4gYSBjaGFpbiBvZiBBVlAgKi8KK3N0YXRpYyB2b2lkIHBhcnNlcnVsZXNfc3RhdF9hdnBzKCBzdHJ1Y3QgZGljdF9vYmplY3QgKiBtb2RlbF9hdnAsIHN0cnVjdCBmZF9saXN0ICpsaXN0LCBpbnQgKiBjb3VudCwgaW50ICogZmlyc3Rwb3MsIGludCAqIGxhc3Rwb3MpIAoreworCXN0cnVjdCBmZF9saXN0ICogbGk7CisJaW50IGN1cnBvcyA9IDA7IC8qIFRoZSBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBsaXN0ICovCisJCisJVFJBQ0VfRU5UUlkoIiVwICVwICVwICVwICVwIiwgbW9kZWxfYXZwLCBsaXN0LCBjb3VudCwgZmlyc3Rwb3MsIGxhc3Rwb3MpOworCQorCSpjb3VudCA9IDA7CS8qIG51bWJlciBvZiBpbnN0YW5jZXMgZm91bmQgKi8KKwkqZmlyc3Rwb3MgPSAwOwkvKiBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgaW5zdGFuY2UgKi8KKwkqbGFzdHBvcyA9IDA7CS8qIHBvc2l0aW9uIG9mIHRoZSBsYXN0IGluc3RhbmNlLCBzdGFydGluZyBmcm9tIHRoZSBlbmQgKi8KKwkKKwlmb3IgKGxpID0gbGlzdC0+bmV4dDsgbGkgIT0gbGlzdDsgbGkgPSBsaS0+bmV4dCkgeworCQkvKiBJbmNyZW1lbnQgdGhlIGN1cnJlbnQgcG9zaXRpb24gY291bnRlciAqLworCQljdXJwb3MrKzsKKwkJCisJCS8qIElmIHdlIHByZXZpb3VzbHkgc2F2ZWQgYSAibGFzdHBvcyIgaW5mb3JtYXRpb24sIGluY3JlbWVudCBpdCAqLworCQlpZiAoKmxhc3Rwb3MgIT0gMCkKKwkJCSgqbGFzdHBvcykrKzsKKwkJCisJCS8qIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBuZXh0IEFWUC4gV2UgY2FuIGNvbXBhcmUgdGhlIHJlZmVyZW5jZXMgZGlyZWN0bHksIGl0IGlzIHNhZmUuICovCisJCWlmIChfQShsaS0+byktPmF2cF9tb2RlbCA9PSBtb2RlbF9hdnApIHsKKwkJCQorCQkJLyogVGhpcyBBVlAgaXMgb2YgdGhlIHR5cGUgd2UgYXJlIHNlYXJjaGluZyAqLworCQkJKCpjb3VudCkrKzsKKwkJCQorCQkJLyogSWYgd2UgZG9uJ3QgaGF2ZSB5ZXQgYSAiZmlyc3Rwb3MiLCBzYXZlIGl0ICovCisJCQlpZiAoKmZpcnN0cG9zID09IDApCisJCQkJKmZpcnN0cG9zID0gY3VycG9zOworCQkJCisJCQkvKiBSZXNldCB0aGUgbGFzdHBvcyAqLworCQkJKCpsYXN0cG9zKSA9IDE7CisJCX0KKwl9Cit9CisKKy8qIFdlIHVzZSB0aGlzIHN0cnVjdHVyZSBhcyBwYXJhbWV0ZXIgZm9yIHRoZSBuZXh0IGZ1bmN0aW9uICovCitzdHJ1Y3QgcGFyc2VydWxlc19kYXRhIHsKKwlzdHJ1Y3QgZmRfbGlzdCAgKiBzZW50aW5lbDsgIAkvKiBTZW50aW5lbCBvZiB0aGUgbGlzdCBvZiBjaGlsZHJlbiBBVlAgKi8KKwlzdHJ1Y3QgZmRfcGVpIAkqIHBlaTsgICAJLyogSWYgdGhlIHJ1bGUgY29uZmxpY3RzLCBzYXZlIHRoZSBlcnJvciBoZXJlICovCit9OworCisvKiBDcmVhdGUgYW4gZW1wdHkgQVZQIG9mIGEgZ2l2ZW4gbW9kZWwgKHRvIHVzZSBpbiBGYWlsZWQtQVZQKSAqLworc3RhdGljIHN0cnVjdCBhdnAgKiBlbXB0eV9hdnAoc3RydWN0IGRpY3Rfb2JqZWN0ICogbW9kZWxfYXZwKQoreworCXN0cnVjdCBhdnAgKiBhdnAgPSBOVUxMOworCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGF2cF9pbmZvOworCXVuaW9uIGF2cF92YWx1ZSB2YWw7CisJdW5zaWduZWQgY2hhciBvc1sxXSA9IHsgJ1wwJyB9OworCQorCS8qIENyZWF0ZSBhbiBpbnN0YW5jZSAqLworCUNIRUNLX0ZDVF9ETyggZmRfbXNnX2F2cF9uZXcobW9kZWxfYXZwLCAwLCAmYXZwICksIHJldHVybiBOVUxMICk7CisJCisJLyogVHlwZSBvZiB0aGUgQVZQICovCisJQ0hFQ0tfRkNUX0RPKCBmZF9kaWN0X2dldHZhbChtb2RlbF9hdnAsICZhdnBfaW5mbyksIHJldHVybiBOVUxMICk7CisJCisJLyogU2V0IGFuIGluaXRpYWwgc2l6ZSAqLworCWF2cC0+YXZwX3B1YmxpYy5hdnBfbGVuID0gR0VUQVZQSERSU1ooIGF2cC0+YXZwX3B1YmxpYy5hdnBfZmxhZ3MgKSArIGF2cF92YWx1ZV9zaXplc1thdnBfaW5mby5hdnBfYmFzZXR5cGVdOworCQorCS8qIFByZXBhcmUgdGhlIGVtcHR5IHZhbHVlICovCisJbWVtc2V0KCZ2YWwsIDAsIHNpemVvZih2YWwpKTsKKwlzd2l0Y2ggKGF2cF9pbmZvLmF2cF9iYXNldHlwZSkgeworCQljYXNlIEFWUF9UWVBFX09DVEVUU1RSSU5HOgorCQkJdmFsLm9zLmRhdGEgPSBvczsKKwkJCXZhbC5vcy5sZW4gID0gc2l6ZW9mKG9zKTsKKwkJCWF2cC0+YXZwX3B1YmxpYy5hdnBfbGVuICs9IHZhbC5vcy5sZW47CisJCWNhc2UgQVZQX1RZUEVfSU5URUdFUjMyOgorCQljYXNlIEFWUF9UWVBFX0lOVEVHRVI2NDoKKwkJY2FzZSBBVlBfVFlQRV9VTlNJR05FRDMyOgorCQljYXNlIEFWUF9UWVBFX1VOU0lHTkVENjQ6CisJCWNhc2UgQVZQX1RZUEVfRkxPQVQzMjoKKwkJY2FzZSBBVlBfVFlQRV9GTE9BVDY0OgorCQkJQ0hFQ0tfRkNUX0RPKCBmZF9tc2dfYXZwX3NldHZhbHVlKGF2cCwgJnZhbCksIHJldHVybiBOVUxMICk7CisJCWNhc2UgQVZQX1RZUEVfR1JPVVBFRDoKKwkJCS8qIEZvciBBVlBfVFlQRV9HUk9VUEVEIHdlIGRvbid0IGRvIGFueXRoaW5nICovCisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUFTU0VSVCgwKTsgLyogbm90IGhhbmRsZWQgKi8KKwl9CisJCisJcmV0dXJuIGF2cDsKK30KKworLyogQ2hlY2sgdGhhdCBhIGxpc3Qgb2YgQVZQcyBpcyBjb21wbGlhbnQgd2l0aCBhIGdpdmVuIHJ1bGUgLS0gd2lsbCBiZSBpdGVyYXRlZCBvbiB0aGUgbGlzdCBvZiBydWxlcyAqLworc3RhdGljIGludCBwYXJzZXJ1bGVzX2NoZWNrX29uZV9ydWxlKHZvaWQgKiBkYXRhLCBzdHJ1Y3QgZGljdF9ydWxlX2RhdGEgKnJ1bGUpCit7CisJaW50IGNvdW50LCBmaXJzdCwgbGFzdCwgbWluOworCXN0cnVjdCBwYXJzZXJ1bGVzX2RhdGEgKiBwcl9kYXRhID0gZGF0YTsKKwljaGFyICogYXZwX25hbWUgPSAiPHVucmVzb2x2ZWQgbmFtZT4iOworCQorCVRSQUNFX0VOVFJZKCIlcCAlcCIsIGRhdGEsIHJ1bGUpOworCQorCS8qIEdldCBzdGF0aXN0aWNzIG9mIHRoZSBBVlAgY29uY2VybmVkIGJ5IHRoaXMgcnVsZSBpbiB0aGUgcGFyZW50IGluc3RhbmNlICovCisJcGFyc2VydWxlc19zdGF0X2F2cHMoIHJ1bGUtPnJ1bGVfYXZwLCBwcl9kYXRhLT5zZW50aW5lbCwgJmNvdW50LCAmZmlyc3QsICZsYXN0KTsKKwkKKwlpZiAoVFJBQ0VfQk9PTChJTkZPKSkKKwl7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGF2cGRhdGE7CisJCWludCByZXQ7CisJCXJldCA9IGZkX2RpY3RfZ2V0dmFsKHJ1bGUtPnJ1bGVfYXZwLCAmYXZwZGF0YSk7CisJCWlmIChyZXQgPT0gMCkKKwkJCWF2cF9uYW1lID0gYXZwZGF0YS5hdnBfbmFtZTsKKwkJCisJCVRSQUNFX0RFQlVHKEFOTk9ZSU5HLCAiQ2hlY2tpbmcgcnVsZTogcDolZCglZCkgbS9NOiUyZC8lMmQuIENvdW50ZWQgJWQgKGZpcnN0OiAlZCwgbGFzdDolZCkgb2YgQVZQICclcyciLCAKKwkJCQkJcnVsZS0+cnVsZV9wb3NpdGlvbiwKKwkJCQkJcnVsZS0+cnVsZV9vcmRlciwKKwkJCQkJcnVsZS0+cnVsZV9taW4sCisJCQkJCXJ1bGUtPnJ1bGVfbWF4LAorCQkJCQljb3VudCwgCisJCQkJCWZpcnN0LCAKKwkJCQkJbGFzdCwKKwkJCQkJYXZwX25hbWUKKwkJCQkpOworCX0KKwkKKwkvKiBOb3cgY2hlY2sgdGhlIHJ1bGUgaXMgbm90IGNvbmZsaWN0aW5nICovCisJCisJLyogQ2hlY2sgdGhlICJtaW4iIHZhbHVlICovCisJaWYgKChtaW4gPSBydWxlLT5ydWxlX21pbikgPT0gLTEpIHsKKwkJaWYgKHJ1bGUtPnJ1bGVfcG9zaXRpb24gPT0gUlVMRV9PUFRJT05BTCkKKwkJCW1pbiA9IDA7CisJCWVsc2UKKwkJCW1pbiA9IDE7CisJfQorCWlmIChjb3VudCA8IG1pbikgeworCQlmZF9sb2dfZXJyb3IoIkNvbmZsaWN0aW5nIHJ1bGU6IHRoZSBudW1iZXIgb2Ygb2NjdXJlbmNlcyAoJWQpIGlzIDwgdGhlIHJ1bGUgbWluICglZCkgZm9yICclcycuIiwgY291bnQsIG1pbiwgYXZwX25hbWUpOworCQlpZiAocHJfZGF0YS0+cGVpKSB7CisJCQlwcl9kYXRhLT5wZWktPnBlaV9lcnJjb2RlID0gIkRJQU1FVEVSX01JU1NJTkdfQVZQIjsKKwkJCXByX2RhdGEtPnBlaS0+cGVpX2F2cCA9IGVtcHR5X2F2cChydWxlLT5ydWxlX2F2cCk7CisJCQlwcl9kYXRhLT5wZWktPnBlaV9hdnBfZnJlZSA9IDE7CisJCX0KKwkJcmV0dXJuIEVCQURNU0c7CisJfQorCQorCS8qIENoZWNrIHRoZSAibWF4IiB2YWx1ZSAqLworCWlmICgocnVsZS0+cnVsZV9tYXggIT0gLTEpICYmIChjb3VudCA+IHJ1bGUtPnJ1bGVfbWF4KSkgeworCQlmZF9sb2dfZXJyb3IoIkNvbmZsaWN0aW5nIHJ1bGU6IHRoZSBudW1iZXIgb2Ygb2NjdXJlbmNlcyAoJWQpIGlzID4gdGhlIHJ1bGUgbWF4ICglZCkgZm9yICclcycuIiwgY291bnQsIHJ1bGUtPnJ1bGVfbWF4LCBhdnBfbmFtZSk7CisJCWlmIChwcl9kYXRhLT5wZWkpIHsKKwkJCWlmIChydWxlLT5ydWxlX21heCA9PSAwKQorCQkJCXByX2RhdGEtPnBlaS0+cGVpX2VycmNvZGUgPSAiRElBTUVURVJfQVZQX05PVF9BTExPV0VEIjsKKwkJCWVsc2UKKwkJCQlwcl9kYXRhLT5wZWktPnBlaV9lcnJjb2RlID0gIkRJQU1FVEVSX0FWUF9PQ0NVUlNfVE9PX01BTllfVElNRVMiOworCQkJcHJfZGF0YS0+cGVpLT5wZWlfYXZwID0gZW1wdHlfYXZwKHJ1bGUtPnJ1bGVfYXZwKTsgLyogV2VsbCB3ZSBhcmUgc3VwcG9zZWQgdG8gcmV0dXJuIHRoZSAobWF4ICsgMSl0aCBpbnN0YW5jZSBvZiB0aGUgQVZQIGluc3RlYWQuLi4gUGZmZi4uLiAqLyBUT0RPKCJJbXByb3ZlLi4uIik7CisJCQlwcl9kYXRhLT5wZWktPnBlaV9hdnBfZnJlZSA9IDE7CisJCX0KKwkJcmV0dXJuIEVCQURNU0c7CisJfQorCQkKKwkvKiBDaGVjayB0aGUgcG9zaXRpb24gYW5kIG9yZGVyIChpZiByZWxldmFudCkgKi8KKwlzd2l0Y2ggKHJ1bGUtPnJ1bGVfcG9zaXRpb24pIHsKKwkJY2FzZSBSVUxFX09QVElPTkFMOgorCQljYXNlIFJVTEVfUkVRVUlSRUQ6CisJCQkvKiBObyBzcGVjaWFsIHBvc2l0aW9uIGNvbnN0cmFpbnRzICovCisJCQlicmVhazsKKwkJCisJCWNhc2UgUlVMRV9GSVhFRF9IRUFEOgorCQkJLyogU2luY2UgIjAqMTxmaXhlZD4iIGlzIGEgdmFsaWQgcnVsZSBzcGVjaWZpZXIsIHdlIG9ubHkgcmVqZWN0IGNhc2VzIHdoZXJlIHRoZSBBVlAgYXBwZWFycyAqYWZ0ZXIqIGl0cyBmaXhlZCBwb3NpdGlvbiAqLworCQkJaWYgKGZpcnN0ID4gcnVsZS0+cnVsZV9vcmRlcikgeworCQkJCWZkX2xvZ19lcnJvcigiQ29uZmxpY3RpbmcgcnVsZTogdGhlIEZJWEVEX0hFQUQgQVZQIGFwcGVhcnMgZmlyc3QgaW4gKCVkKSBwb3NpdGlvbiwgdGhlIHJ1bGUgcmVxdWlyZXMgKCVkKSBmb3IgJyVzJy4iLCBmaXJzdCwgcnVsZS0+cnVsZV9vcmRlciwgYXZwX25hbWUpOworCQkJCWlmIChwcl9kYXRhLT5wZWkpIHsKKwkJCQkJcHJfZGF0YS0+cGVpLT5wZWlfZXJyY29kZSA9ICJESUFNRVRFUl9NSVNTSU5HX0FWUCI7CisJCQkJCXByX2RhdGEtPnBlaS0+cGVpX21lc3NhZ2UgPSAiQVZQIHdhcyBub3QgaW4gaXRzIGZpeGVkIHBvc2l0aW9uIjsKKwkJCQkJcHJfZGF0YS0+cGVpLT5wZWlfYXZwID0gZW1wdHlfYXZwKHJ1bGUtPnJ1bGVfYXZwKTsKKwkJCQkJcHJfZGF0YS0+cGVpLT5wZWlfYXZwX2ZyZWUgPSAxOworCQkJCX0KKwkJCQlyZXR1cm4gRUJBRE1TRzsKKwkJCX0KKwkJCWJyZWFrOworCQorCQljYXNlIFJVTEVfRklYRURfVEFJTDoKKwkJCS8qIFNpbmNlICIwKjE8Zml4ZWQ+IiBpcyBhIHZhbGlkIHJ1bGUgc3BlY2lmaWVyLCB3ZSBvbmx5IHJlamVjdCBjYXNlcyB3aGVyZSB0aGUgQVZQIGFwcGVhcnMgKmJlZm9yZSogaXRzIGZpeGVkIHBvc2l0aW9uICovCisJCQlpZiAobGFzdCA+IHJ1bGUtPnJ1bGVfb3JkZXIpIHsJLyogV2UgaGF2ZSBhICI+IiBoZXJlIGJlY2F1c2Ugd2UgY291bnQgaW4gcmV2ZXJzZSBvcmRlciAoaS5lLiBmcm9tIHRoZSBlbmQpICovCisJCQkJZmRfbG9nX2Vycm9yKCJDb25mbGljdGluZyBydWxlOiB0aGUgRklYRURfVEFJTCBBVlAgYXBwZWFycyBsYXN0IGluICglZCkgcG9zaXRpb24sIHRoZSBydWxlIHJlcXVpcmVzICglZCkgZm9yICclcycuIiwgbGFzdCwgcnVsZS0+cnVsZV9vcmRlciwgYXZwX25hbWUpOworCQkJCWlmIChwcl9kYXRhLT5wZWkpIHsKKwkJCQkJcHJfZGF0YS0+cGVpLT5wZWlfZXJyY29kZSA9ICJESUFNRVRFUl9NSVNTSU5HX0FWUCI7CisJCQkJCXByX2RhdGEtPnBlaS0+cGVpX21lc3NhZ2UgPSAiQVZQIHdhcyBub3QgaW4gaXRzIGZpeGVkIHBvc2l0aW9uIjsKKwkJCQkJcHJfZGF0YS0+cGVpLT5wZWlfYXZwID0gZW1wdHlfYXZwKHJ1bGUtPnJ1bGVfYXZwKTsKKwkJCQkJcHJfZGF0YS0+cGVpLT5wZWlfYXZwX2ZyZWUgPSAxOworCQkJCX0KKwkJCQlyZXR1cm4gRUJBRE1TRzsKKwkJCX0KKwkJCWJyZWFrOworCQkKKwkJZGVmYXVsdDoKKwkJCS8qIFdoYXQgaXMgdGhpcyBwb3NpdGlvbiA/Pz8gKi8KKwkJCUFTU0VSVCgwKTsKKwkJCXJldHVybiBFTk9UU1VQOworCX0KKwkKKwkvKiBXZSd2ZSBjaGVja2VkIGFsbCB0aGUgcGFyYW1ldGVycyAqLworCXJldHVybiAwOworfQorCisvKiBDaGVjayB0aGUgcnVsZXMgcmVjdXJzaXZlbHkgKi8KK3N0YXRpYyBpbnQgcGFyc2VydWxlc19kbyAoIHN0cnVjdCBkaWN0aW9uYXJ5ICogZGljdCwgbXNnX29yX2F2cCAqIG9iamVjdCwgc3RydWN0IGZkX3BlaSAqZXJyb3JfaW5mbywgaW50IG1hbmRhdG9yeSkKK3sKKwlzdHJ1Y3QgcGFyc2VydWxlc19kYXRhIGRhdGE7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogbW9kZWwgPSBOVUxMOworCQorCVRSQUNFX0VOVFJZKCIlcCAlcCAlcCAlZCIsIGRpY3QsIG9iamVjdCwgZXJyb3JfaW5mbywgbWFuZGF0b3J5KTsKKwkKKwkvKiBvYmplY3QgaGFzIGFscmVhZHkgYmVlbiBjaGVja2VkIGFuZCBkaWN0LXBhcnNlZCB3aGVuIHdlIGFyZSBjYWxsZWQuICovCisJCisJLyogRmlyc3QsIGhhbmRsZSB0aGUgY2FzZXMgd2hlcmUgdGhlcmUgaXMgbm8gbW9kZWwgKi8KKwl7CisJCWlmIChDSEVDS19NU0cob2JqZWN0KSkgeworCQkJaWYgKCBfTShvYmplY3QpLT5tc2dfcHVibGljLm1zZ19mbGFncyAmIENNRF9GTEFHX0VSUk9SICkgeworCQkJCS8qIFRoZSBjYXNlIG9mIGVycm9yIG1lc3NhZ2VzOiB0aGUgQUJORiBpcyBkaWZmZXJlbnQgKi8KKwkJCQlDSEVDS19GQ1QoIGZkX2RpY3RfZ2V0X2Vycm9yX2NtZChkaWN0LCAmbW9kZWwpICk7CisJCQl9IGVsc2UgeworCQkJCW1vZGVsID0gX00ob2JqZWN0KS0+bXNnX21vZGVsOworCQkJfQorCQkJLyogQ29tbWFuZHMgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gdGhlIGRpY3Rpb25hcnkgKi8KKwkJCWlmIChtb2RlbCA9PSBOVUxMKSB7CisJCQkJVFJBQ0VfREVCVUcoSU5GTywgIk1lc3NhZ2Ugd2l0aCBubyBkaWN0aW9uYXJ5IG1vZGVsLiBFQkFETVNHIik7CisJCQkJaWYgKGVycm9yX2luZm8pIHsKKwkJCQkJZXJyb3JfaW5mby0+cGVpX2VycmNvZGUgPSAiRElBTUVURVJfQ09NTUFORF9VTlNVUFBPUlRFRCI7CisJCQkJCWVycm9yX2luZm8tPnBlaV9wcm90b2VyciA9IDE7CisJCQkJfQorCQkJCXJldHVybiBFQkFETVNHOworCQkJfQorCQl9CisKKwkJLyogQVZQIHdpdGggdGhlICdNJyBmbGFnIG11c3QgYWxzbyBiZSByZWNvZ25pemVkIGluIHRoZSBkaWN0aW9uYXJ5IC0tIGV4Y2VwdCBpbnNpZGUgYW4gb3B0aW9uYWwgZ3JvdXBlZCBBVlAgKi8KKwkJaWYgKENIRUNLX0FWUChvYmplY3QpICYmICgobW9kZWwgPSBfQShvYmplY3QpLT5hdnBfbW9kZWwpID09IE5VTEwpKSB7CisJCQlpZiAoIG1hbmRhdG9yeSAmJiAoX0Eob2JqZWN0KS0+YXZwX3B1YmxpYy5hdnBfZmxhZ3MgJiBBVlBfRkxBR19NQU5EQVRPUlkpKSB7CisJCQkJLyogUmV0dXJuIGFuIGVycm9yIGluIHRoaXMgY2FzZSAqLworCQkJCVRSQUNFX0RFQlVHKElORk8sICJNYW5kYXRvcnkgQVZQIHdpdGggbm8gZGljdGlvbmFyeSBtb2RlbC4gRUJBRE1TRyIpOworCQkJCWlmIChlcnJvcl9pbmZvKSB7CisJCQkJCWVycm9yX2luZm8tPnBlaV9lcnJjb2RlID0gIkRJQU1FVEVSX0FWUF9VTlNVUFBPUlRFRCI7CisJCQkJCWVycm9yX2luZm8tPnBlaV9hdnAgPSBvYmplY3Q7CisJCQkJfQorCQkJCXJldHVybiBFQkFETVNHOworCQkJfSBlbHNlIHsKKwkJCQkvKiBXZSBkb24ndCBrbm93IGFueSBydWxlIGZvciB0aGlzIG9iamVjdCwgc28gYXNzdW1lIE9LICovCisJCQkJVFJBQ0VfREVCVUcoRlVMTCwgIlVua25vd24gaW5mb3JtYXRpb25hbCBBVlAsIGlnbm9yaW5nLi4uIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwl9CisJCisJLyogQXQgdGhpcyBwb2ludCB3ZSBrbm93ICJtb2RlbCIgaXMgc2V0IGFuZCBwb2ludHMgdG8gdGhlIG9iamVjdCdzIG1vZGVsICovCisJCisJLyogSWYgd2UgYXJlIGFuIEFWUCB3aXRoIG5vIGNoaWxkcmVuLCBqdXN0IHJldHVybiBPSyAqLworCWlmIChDSEVDS19BVlAob2JqZWN0KSkgeworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YQlkaWN0ZGF0YTsKKwkJQ0hFQ0tfRkNUKCAgZmRfZGljdF9nZXR2YWwobW9kZWwsICZkaWN0ZGF0YSkgICk7CisJCWlmIChkaWN0ZGF0YS5hdnBfYmFzZXR5cGUgIT0gQVZQX1RZUEVfR1JPVVBFRCkgeworCQkJLyogVGhpcyBvYmplY3QgaGFzIG5vIGNoaWxkcmVuIGFuZCBubyBydWxlcyAqLworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJCisJLyogSWYgdGhpcyBvYmplY3QgaGFzIGNoaWxkcmVuLCBmaXJzdCBjaGVjayB0aGUgcnVsZXMgZm9yIGFsbCBpdHMgY2hpbGRyZW4gKi8KKwl7CisJCWludCBpc19jaGlsZF9tYW5kID0gMDsKKwkJc3RydWN0IGZkX2xpc3QgKiBjaCA9IE5VTEw7CisJCWlmICggIENIRUNLX01TRyhvYmplY3QpIAorCQkgICB8fCAobWFuZGF0b3J5ICYmIChfQShvYmplY3QpLT5hdnBfcHVibGljLmF2cF9mbGFncyAmIEFWUF9GTEFHX01BTkRBVE9SWSkpICkKKwkJCWlzX2NoaWxkX21hbmQgPSAxOworCQlmb3IgKGNoID0gX0Mob2JqZWN0KS0+Y2hpbGRyZW4ubmV4dDsgY2ggIT0gJl9DKG9iamVjdCktPmNoaWxkcmVuOyBjaCA9IGNoLT5uZXh0KSB7CisJCQlDSEVDS19GQ1QoICBwYXJzZXJ1bGVzX2RvICggZGljdCwgX0MoY2gtPm8pLCBlcnJvcl9pbmZvLCBpc19jaGlsZF9tYW5kICkgICk7CisJCX0KKwl9CisKKwkvKiBOb3cgY2hlY2sgYWxsIHJ1bGVzIG9mIHRoaXMgb2JqZWN0ICovCisJZGF0YS5zZW50aW5lbCA9ICZfQyhvYmplY3QpLT5jaGlsZHJlbjsKKwlkYXRhLnBlaSAgPSBlcnJvcl9pbmZvOworCUNIRUNLX0ZDVCggZmRfZGljdF9pdGVyYXRlX3J1bGVzICggbW9kZWwsICZkYXRhLCBwYXJzZXJ1bGVzX2NoZWNrX29uZV9ydWxlICkgKTsKKwkKKwlyZXR1cm4gMDsKK30KKworaW50IGZkX21zZ19wYXJzZV9ydWxlcyAoIG1zZ19vcl9hdnAgKiBvYmplY3QsIHN0cnVjdCBkaWN0aW9uYXJ5ICogZGljdCwgc3RydWN0IGZkX3BlaSAqZXJyb3JfaW5mbykKK3sKKwlUUkFDRV9FTlRSWSgiJXAgJXAgJXAiLCBvYmplY3QsIGRpY3QsIGVycm9yX2luZm8pOworCQorCWlmIChlcnJvcl9pbmZvKQorCQltZW1zZXQoZXJyb3JfaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBmZF9wZWkpKTsKKwkKKwkvKiBSZXNvbHZlIHRoZSBkaWN0aW9uYXJ5IG9iamVjdHMgd2hlbiBtaXNzaW5nLiBUaGlzIGFsc28gdmFsaWRhdGVzIHRoZSBvYmplY3QuICovCisJQ0hFQ0tfRkNUKCAgZmRfbXNnX3BhcnNlX2RpY3QgKCBvYmplY3QsIGRpY3QsIGVycm9yX2luZm8gKSAgKTsKKwkKKwkvKiBDYWxsIHRoZSByZWN1cnNpdmUgZnVuY3Rpb24gKi8KKwlyZXR1cm4gcGFyc2VydWxlc19kbyAoIGRpY3QsIG9iamVjdCwgZXJyb3JfaW5mbywgMSApIDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQ29tcHV0ZSB0aGUgbGVuZ2ggb2YgYW4gb2JqZWN0IGFuZCBpdHMgc3VidHJlZS4gKi8KK2ludCBmZF9tc2dfdXBkYXRlX2xlbmd0aCAoIG1zZ19vcl9hdnAgKiBvYmplY3QgKQoreworCXNpemVfdCBzeiA9IDA7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogbW9kZWw7CisJdW5pb24geworCQlzdHJ1Y3QgZGljdF9jbWRfZGF0YSAgIGNtZGRhdGE7CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhICAgYXZwZGF0YTsKKwl9IGRpY3RkYXRhOworCQorCVRSQUNFX0VOVFJZKCIlcCIsIG9iamVjdCk7CisJCisJLyogR2V0IHRoZSBtb2RlbCBvZiB0aGUgb2JqZWN0LiBUaGlzIGFsc28gdmFsaWRhdGVzIHRoZSBvYmplY3QgKi8KKwlDSEVDS19GQ1QoIGZkX21zZ19tb2RlbCAoIG9iamVjdCwgJm1vZGVsICkgKTsKKwkKKwkvKiBHZXQgdGhlIGluZm9ybWF0aW9uIG9mIHRoZSBtb2RlbCAqLworCWlmIChtb2RlbCkgeworCQlDSEVDS19GQ1QoICBmZF9kaWN0X2dldHZhbChtb2RlbCwgJmRpY3RkYXRhKSAgKTsKKwl9IGVsc2UgeworCQkvKiBGb3IgdW5rbm93biBBVlAsIGp1c3QgZG9uJ3QgY2hhbmdlIHRoZSBzaXplICovCisJCWlmIChfQyhvYmplY3QpLT50eXBlID09IE1TR19BVlApCisJCQlyZXR1cm4gMDsKKwl9CisJCisJLyogRGVhbCB3aXRoIGVhc3kgY2FzZXM6IEFWUHMgd2l0aG91dCBjaGlsZHJlbiAqLworCWlmICgoX0Mob2JqZWN0KS0+dHlwZSA9PSBNU0dfQVZQKSAmJiAoZGljdGRhdGEuYXZwZGF0YS5hdnBfYmFzZXR5cGUgIT0gQVZQX1RZUEVfR1JPVVBFRCkpIHsKKwkJLyogU2FuaXR5IGNoZWNrICovCisJCUFTU0VSVChGRF9JU19MSVNUX0VNUFRZKCZfQShvYmplY3QpLT5hdnBfY2hhaW4uY2hpbGRyZW4pKTsKKwkJCisJCS8qIE5vdyBjaGVjayB0aGF0IHRoZSBkYXRhIGlzIHNldCBpbiB0aGUgQVZQICovCisJCUNIRUNLX1BBUkFNUyggIF9BKG9iamVjdCktPmF2cF9wdWJsaWMuYXZwX3ZhbHVlICApOworCQkKKwkJc3ogPSBHRVRBVlBIRFJTWiggX0Eob2JqZWN0KS0+YXZwX3B1YmxpYy5hdnBfZmxhZ3MgKTsKKwkJCisJCXN3aXRjaCAoZGljdGRhdGEuYXZwZGF0YS5hdnBfYmFzZXR5cGUpIHsKKwkJCWNhc2UgQVZQX1RZUEVfT0NURVRTVFJJTkc6CisJCQkJc3ogKz0gX0Eob2JqZWN0KS0+YXZwX3B1YmxpYy5hdnBfdmFsdWUtPm9zLmxlbjsKKwkJCQlicmVhazsKKwkJCQorCQkJY2FzZSBBVlBfVFlQRV9JTlRFR0VSMzI6CisJCQljYXNlIEFWUF9UWVBFX0lOVEVHRVI2NDoKKwkJCWNhc2UgQVZQX1RZUEVfVU5TSUdORUQzMjoKKwkJCWNhc2UgQVZQX1RZUEVfVU5TSUdORUQ2NDoKKwkJCWNhc2UgQVZQX1RZUEVfRkxPQVQzMjoKKwkJCWNhc2UgQVZQX1RZUEVfRkxPQVQ2NDoKKwkJCQlzeiArPSBhdnBfdmFsdWVfc2l6ZXNbZGljdGRhdGEuYXZwZGF0YS5hdnBfYmFzZXR5cGVdOworCQkJCWJyZWFrOworCQkJCisJCQlkZWZhdWx0OgorCQkJCS8qIFNvbWV0aGluZyB3ZW50IHdyb25nLi4uICovCisJCQkJQVNTRVJUKDApOworCQl9CisJfQorCWVsc2UgIC8qIG1lc3NhZ2Ugb3IgZ3JvdXBlZCBBVlAgKi8KKwl7CisJCXN0cnVjdCBmZF9saXN0ICogY2ggPSBOVUxMOworCQkKKwkJLyogRmlyc3QsIGNvbXB1dGUgdGhlIGhlYWRlciBzaXplICovCisJCWlmIChfQyhvYmplY3QpLT50eXBlID09IE1TR19BVlApIHsKKwkJCXN6ID0gR0VUQVZQSERSU1ooIF9BKG9iamVjdCktPmF2cF9wdWJsaWMuYXZwX2ZsYWdzICk7CisJCX0gZWxzZSB7CisJCQlzeiA9IEdFVE1TR0hEUlNaKCApOworCQl9CisJCQorCQkvKiBSZWN1cnNlIGluIGFsbCBjaGlsZHJlbiBhbmQgdXBkYXRlIHRoZSBzeiBpbmZvcm1hdGlvbiAqLworCQlmb3IgKGNoID0gX0Mob2JqZWN0KS0+Y2hpbGRyZW4ubmV4dDsgY2ggIT0gJl9DKG9iamVjdCktPmNoaWxkcmVuOyBjaCA9IGNoLT5uZXh0KSB7CisJCQlDSEVDS19GQ1QoICBmZF9tc2dfdXBkYXRlX2xlbmd0aCAoIGNoLT5vICkgICk7CisJCQkKKwkJCS8qIEFkZCB0aGUgcGFkZGVkIHNpemUgdG8gdGhlIHBhcmVudCAqLworCQkJc3ogKz0gUEFENCggX0EoY2gtPm8pLT5hdnBfcHVibGljLmF2cF9sZW4gKTsKKwkJfQorCX0KKwkKKwkvKiBXaGVuIHdlIGFycml2ZSBoZXJlLCB0aGUgInN6IiB2YXJpYWJsZSBjb250YWlucyB0aGUgc2l6ZSB0byB3cml0ZSBpbiB0aGUgb2JqZWN0ICovCisJaWYgKF9DKG9iamVjdCktPnR5cGUgPT0gTVNHX0FWUCkgCisJCV9BKG9iamVjdCktPmF2cF9wdWJsaWMuYXZwX2xlbiA9IHN6OworCWVsc2UKKwkJX00ob2JqZWN0KS0+bXNnX3B1YmxpYy5tc2dfbGVuZ3RoID0gc3o7CisJCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBNYWNybyB0byBjaGVjayBpZiBmdXJ0aGVyIGNhbGxiYWNrcyBtdXN0IGJlIGNhbGxlZCAqLworI2RlZmluZSBURVNUX0FDVElPTl9TVE9QKCkJCQkJCVwKKwlpZiAoKCptc2cgPT0gTlVMTCkgfHwgKCphY3Rpb24gIT0gRElTUF9BQ1RfQ09OVCkpCVwKKwkJZ290byBvdXQ7CisKKy8qIENhbGwgYWxsIGRpc3BhdGNoIGNhbGxiYWNrcyBmb3IgYSBnaXZlbiBtZXNzYWdlICovCitpbnQgZmRfbXNnX2Rpc3BhdGNoICggc3RydWN0IG1zZyAqKiBtc2csIHN0cnVjdCBzZXNzaW9uICogc2Vzc2lvbiwgZW51bSBkaXNwX2FjdGlvbiAqYWN0aW9uLCBjaGFyICoqIGVycm9yX2NvZGUsIGNoYXIgKiogZHJvcF9yZWFzb24sIHN0cnVjdCBtc2cgKiogZHJvcF9tc2cpCit7CisJc3RydWN0IGRpY3Rpb25hcnkgICogZGljdDsKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhcHA7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogY21kOworCXN0cnVjdCBhdnAgKiBhdnA7CisJc3RydWN0IGZkX2xpc3QgKiBjYl9saXN0OworCWludCByZXQgPSAwLCByMjsKKwkKKwlUUkFDRV9FTlRSWSgiJXAgJXAgJXAgJXAiLCBtc2csIHNlc3Npb24sIGFjdGlvbiwgZXJyb3JfY29kZSk7CisJQ0hFQ0tfUEFSQU1TKCBtc2cgJiYgQ0hFQ0tfTVNHKCptc2cpICYmIGFjdGlvbik7CisJCisJaWYgKGVycm9yX2NvZGUpCisJCSplcnJvcl9jb2RlID0gTlVMTDsKKwlpZiAoZHJvcF9yZWFzb24pCisJCSpkcm9wX3JlYXNvbiA9IE5VTEw7CisJKmFjdGlvbiA9IERJU1BfQUNUX0NPTlQ7CisJCisJLyogVGFrZSB0aGUgZGlzcGF0Y2ggbG9jayAqLworCUNIRUNLX0ZDVCggcHRocmVhZF9yd2xvY2tfcmRsb2NrKCZmZF9kaXNwX2xvY2spICk7CisJcHRocmVhZF9jbGVhbnVwX3B1c2goIGZkX2NsZWFudXBfcndsb2NrLCAmZmRfZGlzcF9sb2NrICk7CisJCisJLyogRmlyc3QsIGNhbGwgdGhlIERJU1BfSE9XX0FOWSBjYWxsYmFja3MgKi8KKwlDSEVDS19GQ1RfRE8oIHJldCA9IGZkX2Rpc3BfY2FsbF9jYl9pbnQoIE5VTEwsIG1zZywgTlVMTCwgc2Vzc2lvbiwgYWN0aW9uLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBkcm9wX3JlYXNvbiwgZHJvcF9tc2cgKSwgZ290byBvdXQgKTsKKworCVRFU1RfQUNUSU9OX1NUT1AoKTsKKwkKKwkvKiBJZiB3ZSBkb24ndCBrbm93IHRoZSBtb2RlbCBhdCB0aGlzIHBvaW50LCB3ZSBzdG9wIGNhdXNlIHdlIGNhbm5vdCBnZXQgdGhlIGRpY3Rpb25hcnkuIEl0J3MgaW52YWxpZDogYW4gZXJyb3Igc2hvdWxkIGFscmVhZHkgaGF2ZSBiZWVuIHRyaWdnZWQgYnkgQU5ZIGNhbGxiYWNrcyAqLworCUNIRUNLX1BBUkFNU19ETyhjbWQgPSAoKm1zZyktPm1zZ19tb2RlbCwgeyByZXQgPSBFSU5WQUw7IGdvdG8gb3V0OyB9ICk7CisJCisJLyogTm93IHJlc29sdmUgbWVzc2FnZSBhcHBsaWNhdGlvbiAqLworCUNIRUNLX0ZDVF9ETyggcmV0ID0gZmRfZGljdF9nZXRkaWN0KCBjbWQsICZkaWN0ICksIGdvdG8gb3V0ICk7CisJQ0hFQ0tfRkNUX0RPKCByZXQgPSBmZF9kaWN0X3NlYXJjaCggZGljdCwgRElDVF9BUFBMSUNBVElPTiwgQVBQTElDQVRJT05fQllfSUQsICYoKm1zZyktPm1zZ19wdWJsaWMubXNnX2FwcGwsICZhcHAsIDAgKSwgZ290byBvdXQgKTsKKwkKKwlpZiAoYXBwID09IE5VTEwpIHsKKwkJaWYgKCgqbXNnKS0+bXNnX3B1YmxpYy5tc2dfZmxhZ3MgJiBDTURfRkxBR19SRVFVRVNUKSB7CisJCQlpZiAoZXJyb3JfY29kZSkKKwkJCQkqZXJyb3JfY29kZSA9ICJESUFNRVRFUl9BUFBMSUNBVElPTl9VTlNVUFBPUlRFRCI7CisJCQkqYWN0aW9uID0gRElTUF9BQ1RfRVJST1I7CisJCX0gZWxzZSB7CisJCQkqZHJvcF9yZWFzb24gPSAiSW50ZXJuYWwgZXJyb3I6IFJlY2VpdmVkIHRoaXMgYW5zd2VyIHRvIGEgbG9jYWwgcXVlcnkgd2l0aCBhbiB1bnN1cHBvcnRlZCBhcHBsaWNhdGlvbiI7CisJCQkqZHJvcF9tc2cgPSAqbXNnOworCQkJKm1zZyA9IE5VTEw7CisJCX0KKwkJZ290byBvdXQ7CisJfQorCQorCS8qIFNvIHN0YXJ0IGJyb3dzaW5nIHRoZSBtZXNzYWdlICovCisJQ0hFQ0tfRkNUX0RPKCByZXQgPSBmZF9tc2dfYnJvd3NlKCAqbXNnLCBNU0dfQlJXX0ZJUlNUX0NISUxELCAmYXZwLCBOVUxMICksIGdvdG8gb3V0ICk7CisJd2hpbGUgKGF2cCAhPSBOVUxMKSB7CisJCS8qIEZvciB1bmtub3duIEFWUCwgd2UgZG9uJ3QgaGF2ZSBhIGNhbGxiYWNrIHJlZ2lzdGVyZWQsIHNvIGp1c3Qgc2tpcCAqLworCQlpZiAoYXZwLT5hdnBfbW9kZWwpIHsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGVudW12YWwgPSBOVUxMOworCQkJCisJCQkvKiBHZXQgdGhlIGxpc3Qgb2YgY2FsbGJhY2sgZm9yIHRoaXMgQVZQICovCisJCQlDSEVDS19GQ1RfRE8oIHJldCA9IGZkX2RpY3RfZGlzcF9jYihESUNUX0FWUCwgYXZwLT5hdnBfbW9kZWwsICZjYl9saXN0KSwgZ290byBvdXQgKTsKKwkJCQorCQkJLyogV2Ugc2VhcmNoIGVudW1lcmF0ZWQgdmFsdWVzIG9ubHkgaW4gY2FzZSBvZiBub24tZ3JvdXBlZCBBVlAgKi8KKwkJCWlmICggYXZwLT5hdnBfcHVibGljLmF2cF92YWx1ZSApIHsKKwkJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiB0eXBlOworCQkJCS8qIENoZWNrIGlmIHRoZSBBVlAgaGFzIGEgY29uc3RhbnQgdmFsdWUgKi8KKwkJCQlDSEVDS19GQ1RfRE8oIHJldCA9IGZkX2RpY3Rfc2VhcmNoKGRpY3QsIERJQ1RfVFlQRSwgVFlQRV9PRl9BVlAsIGF2cC0+YXZwX21vZGVsLCAmdHlwZSwgMCksIGdvdG8gb3V0ICk7CisJCQkJaWYgKHR5cGUpIHsKKwkJCQkJc3RydWN0IGRpY3RfZW51bXZhbF9yZXF1ZXN0IHJlcTsKKwkJCQkJbWVtc2V0KCZyZXEsIDAsIHNpemVvZihzdHJ1Y3QgZGljdF9lbnVtdmFsX3JlcXVlc3QpKTsKKwkJCQkJcmVxLnR5cGVfb2JqID0gdHlwZTsKKwkJCQkJbWVtY3B5KCAmcmVxLnNlYXJjaC5lbnVtX3ZhbHVlLCBhdnAtPmF2cF9wdWJsaWMuYXZwX3ZhbHVlLCBzaXplb2YodW5pb24gYXZwX3ZhbHVlKSApOworCQkJCQlDSEVDS19GQ1RfRE8oIHJldCA9IGZkX2RpY3Rfc2VhcmNoKGRpY3QsIERJQ1RfRU5VTVZBTCwgRU5VTVZBTF9CWV9TVFJVQ1QsICZyZXEsICZlbnVtdmFsLCAwKSwgZ290byBvdXQgKTsKKwkJCQl9CisJCQl9CisJCQkKKwkJCS8qIENhbGwgdGhlIGNhbGxiYWNrcyAqLworCQkJQ0hFQ0tfRkNUX0RPKCByZXQgPSBmZF9kaXNwX2NhbGxfY2JfaW50KCBjYl9saXN0LCBtc2csIGF2cCwgc2Vzc2lvbiwgYWN0aW9uLCBhcHAsIGNtZCwgYXZwLT5hdnBfbW9kZWwsIGVudW12YWwsIGRyb3BfcmVhc29uLCBkcm9wX21zZyApLCBnb3RvIG91dCApOworCQkJVEVTVF9BQ1RJT05fU1RPUCgpOworCQl9CisJCS8qIEdvIHRvIG5leHQgQVZQICovCisJCUNIRUNLX0ZDVF9ETyggIHJldCA9IGZkX21zZ19icm93c2UoIGF2cCwgTVNHX0JSV19XQUxLLCAmYXZwLCBOVUxMICksIGdvdG8gb3V0ICk7CisJfQorCQkKKwkvKiBOb3cgY2FsbCBjb21tYW5kIGFuZCBhcHBsaWNhdGlvbiBjYWxsYmFja3MgKi8KKwlDSEVDS19GQ1RfRE8oIHJldCA9IGZkX2RpY3RfZGlzcF9jYihESUNUX0NPTU1BTkQsIGNtZCwgJmNiX2xpc3QpLCBnb3RvIG91dCApOworCUNIRUNLX0ZDVF9ETyggcmV0ID0gZmRfZGlzcF9jYWxsX2NiX2ludCggY2JfbGlzdCwgbXNnLCBOVUxMLCBzZXNzaW9uLCBhY3Rpb24sIGFwcCwgY21kLCBOVUxMLCBOVUxMLCBkcm9wX3JlYXNvbiwgZHJvcF9tc2cgKSwgZ290byBvdXQgKTsKKwlURVNUX0FDVElPTl9TVE9QKCk7CisJCisJaWYgKGFwcCkgeworCQlDSEVDS19GQ1RfRE8oIHJldCA9IGZkX2RpY3RfZGlzcF9jYihESUNUX0FQUExJQ0FUSU9OLCBhcHAsICZjYl9saXN0KSwgZ290byBvdXQgKTsKKwkJQ0hFQ0tfRkNUX0RPKCByZXQgPSBmZF9kaXNwX2NhbGxfY2JfaW50KCBjYl9saXN0LCBtc2csIE5VTEwsIHNlc3Npb24sIGFjdGlvbiwgYXBwLCBjbWQsIE5VTEwsIE5VTEwsIGRyb3BfcmVhc29uLCBkcm9wX21zZyApLCBnb3RvIG91dCApOworCQlURVNUX0FDVElPTl9TVE9QKCk7CisJfQorb3V0OgorCTsgLyogc29tZSBzeXN0ZW1zIHdvdWxkIGNvbXBsYWluIHdpdGhvdXQgdGhpcyAqLwkKKwlwdGhyZWFkX2NsZWFudXBfcG9wKDApOworCQorCUNIRUNLX1BPU0lYX0RPKHIyID0gcHRocmVhZF9yd2xvY2tfdW5sb2NrKCZmZF9kaXNwX2xvY2spLCAvKiBpZ25vcmUgKi8gKTsKKwlyZXR1cm4gcmV0ID86IHIyOworfQorCisKZGlmZiAtLWdpdCBhL2xpYmZkcHJvdG8vb3N0ci5jIGIvbGliZmRwcm90by9vc3RyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRjOTk3MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmZkcHJvdG8vb3N0ci5jCkBAIC0wLDAgKzEsNTYxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxMywgV0lERSBQcm9qZWN0IGFuZCBOSUNUCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBXSURFIFByb2plY3Qgb3IgTklDVCBub3IgdGhlIAkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFdJREUgUHJvamVjdCBhbmQgCQkJCQkJICoKKyogICBOSUNULgkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJmZHByb3RvLWludGVybmFsLmgiCisKKyNpZiAoIWRlZmluZWQoRElBTUlEX0lETkFfSUdOT1JFKSAmJiAhZGVmaW5lZChESUFNSURfSUROQV9SRUpFQ1QpKQorLyogUHJvY2VzcyBJRE5BIHdpdGggc3RyaW5ncHJlcCAtLSBTZWUgUkZDNTg5MCAtLSBhbmQgbGliaWRuIGRvY3VtZW50YXRpb24uLi4gKi8KKyNpbmNsdWRlIDxpZG5hLmg+IC8qIGlkbmFfdG9fYXNjaWlfOHooKSAqLworI2VuZGlmIC8qICFkZWZpbmVkKERJQU1JRF9JRE5BX0lHTk9SRSkgJiYgIWRlZmluZWQoRElBTUlEX0lETkFfUkVKRUNUKSAqLworCisvKiBTaW1pbGFyIHRvIHN0cmR1cCB3aXRoIChtdXN0IGhhdmUgYmVlbiB2ZXJpZmllZCkgb3MwX3QgKi8KK29zMF90IG9zMGR1cF9pbnQob3MwX3Qgcywgc2l6ZV90IGwpIHsKKwlvczBfdCByOworCUNIRUNLX01BTExPQ19ETyggciA9IG1hbGxvYyhsKzEpLCByZXR1cm4gTlVMTCApOworCWlmIChsKQorCQltZW1jcHkociwgcywgbCk7IC8qIHRoaXMgbWlnaHQgYmUgZmFzdGVyIHRoYW4gYSBzdHJjcHkgb3Igc3RyZHVwIGJlY2F1c2UgaXQgY2FuIHdvcmsgd2l0aCAzMiBvciA2NGIgYmxvY2tzICovCisJcltsXSA9ICdcMCc7CisJcmV0dXJuIHI7Cit9CisKKy8qIGNhc2Ugc2Vuc2l0aXZlIGNvbXBhcmlzb24sIGZhc3QgKi8KK2ludCBmZF9vc19jbXBfaW50KHVpbnQ4X3QgKiBvczEsIHNpemVfdCBvczFzeiwgdWludDhfdCAqIG9zMiwgc2l6ZV90IG9zMnN6KQoreworCUFTU0VSVCggb3MxICYmIG9zMik7CisJaWYgKG9zMXN6IDwgb3Myc3opCisJCXJldHVybiAtMTsKKwlpZiAob3Mxc3ogPiBvczJzeikKKwkJcmV0dXJuIDE7CisJcmV0dXJuIG9zMXN6ID8gbWVtY21wKG9zMSwgb3MyLCBvczFzeikgOiAwOworfQorCisvKiBhIGxvY2FsIHZlcnNpb24gb2YgdG9sb3dlcigpIHRoYXQgZG9lcyBub3QgZGVwZW5kIG9uIExDX0NUWVBFIGxvY2FsZSAqLworc3RhdGljIGlubGluZSB1aW50OF90IGFzY2lpdG9sb3dlcih1aW50OF90IGEpCit7CisJaWYgKChhID49ICdBJykgJiYgKGEgPD0gJ1onKSkKKwkJcmV0dXJuIGEgKyAzMiAvKiA9PSAnYScgLSAnQScgKi87CisJcmV0dXJuIGE7Cit9CisKKy8qIGxlc3Mgc2Vuc2l0aXZlIHRvIGNhc2UsIHNsb3dlci4gKi8KKy8qIHRoZSBzZW1hbnRpY3Mgb2YgIm1heWJlZnVydGhlciIgYXNzdW1lIHlvdSBhcmUgc2VhcmNoaW5nIGZvciBvczEgaW4gYSBsaXN0IG9mIGVsZW1lbnRzIG9yZGVyZWQsIGVhY2ggZWxlbWVudCBwYXNzZWQgYXMgb3MyICovCitpbnQgZmRfb3NfYWxtb3N0Y2FzZXNyY2hfaW50KHVpbnQ4X3QgKiBvczEsIHNpemVfdCBvczFzeiwgdWludDhfdCAqIG9zMiwgc2l6ZV90IG9zMnN6LCBpbnQgKm1heWJlZnVydGhlcikKK3sKKwlpbnQgaTsKKwlpbnQgcmVzID0gMDsKKwkKKwlBU1NFUlQoIG9zMSAmJiBvczIpOworCWlmIChtYXliZWZ1cnRoZXIpCisJCSptYXliZWZ1cnRoZXIgPSAwOworCQorCWlmIChvczFzeiA8IG9zMnN6KQorCQlyZXR1cm4gLTE7CisJCisJaWYgKG1heWJlZnVydGhlcikKKwkJKm1heWJlZnVydGhlciA9IDE7CisJCisJaWYgKG9zMXN6ID4gb3Myc3opCisJCXJldHVybiAxOworCQorCWZvciAoaSA9IDA7IGkgPCBvczFzejsgaSsrKSB7CisJCWlmIChvczFbaV0gPT0gb3MyW2ldKQorCQkJY29udGludWU7CisJCQorCQlpZiAoIXJlcykgCisJCQlyZXMgPSBvczFbaV0gPCBvczJbaV0gPyAtMSA6IDE7CisJCQorCQlpZiAoYXNjaWl0b2xvd2VyKG9zMVtpXSkgPT0gYXNjaWl0b2xvd2VyKG9zMltpXSkpIAorCQkJY29udGludWU7CisJCQorCQlyZXR1cm4gcmVzOworCX0KKwkKKwlyZXR1cm4gMDsKK30KKworLyogQ2hlY2sgaWYgdGhlIHN0cmluZyBjb250YWlucyBvbmx5IEFTQ0lJICovCitpbnQgZmRfb3NfaXNfdmFsaWRfRGlhbWV0ZXJJZGVudGl0eSh1aW50OF90ICogb3MsIHNpemVfdCBvc3N6KQoreworI2lmZGVmIERJQU1JRF9JRE5BX0lHTk9SRQorCQorCS8qIEFsbG93IGFueXRoaW5nICovCisJCisjZWxzZSAvKiBESUFNSURfSUROQV9JR05PUkUgKi8KKwkKKwlpbnQgaTsKKwkKKwkvKiBBbGxvdyBvbmx5IGxldHRlcnMsIGRpZ2l0cywgaHlwaGVuLCBkb3QgKi8KKwlmb3IgKGk9MDsgaSA8IG9zc3o7IGkrKykgeworCQlpZiAob3NbaV0gPiAneicpCisJCQlicmVhazsKKwkJaWYgKG9zW2ldID49ICdhJykKKwkJCWNvbnRpbnVlOworCQlpZiAoKG9zW2ldID49ICdBJykgJiYgKG9zW2ldIDw9ICdaJykpCisJCQljb250aW51ZTsKKwkJaWYgKChvc1tpXSA9PSAnLScpIHx8IChvc1tpXSA9PSAnLicpKQorCQkJY29udGludWU7CisJCWlmICgob3NbaV0gPj0gJzAnKSAmJiAob3NbaV0gPD0gJzknKSkKKwkJCWNvbnRpbnVlOworCQlicmVhazsKKwl9CisJaWYgKGkgPCBvc3N6KSB7CisJCWludCBuYiA9IDE7CisJCS8qIFRvIGdldCBhIGJldHRlciBkaXNwbGF5LCBjaGVjayBpZiB0aGUgaW52YWxpZCBjaGFyIGlzIFVURi04ICovCisJCWlmICgob3NbaV0gJiAweEUwKSA9PSAweEMwIC8qIDExMHh4eHh4ICovKSB7CisJCQlpZiAoKGkgPCBvc3N6IC0gMSkgJiYgKChvc1tpICsgMV0gJiAweEMwKSA9PSAweDgwIC8qIDEweHh4eHh4ICovKSkKKwkJCQluYiA9IDI7CisJCQlnb3RvIGRpc3A7CisJCX0KKwkJaWYgKChvc1tpXSAmIDB4RjApID09IDB4RTAgLyogMTExMHh4eHggKi8pIHsKKwkJCWlmICgoaSA8IG9zc3ogLSAyKSAmJiAoKG9zW2kgKyAxXSAmIDB4QzApID09IDB4ODAgLyogMTB4eHh4eHggKi8pCisJCQkJCSAgICYmICgob3NbaSArIDJdICYgMHhDMCkgPT0gMHg4MCAvKiAxMHh4eHh4eCAqLykpCisJCQkJbmIgPSAzOworCQkJZ290byBkaXNwOworCQl9CisJCWlmICgob3NbaV0gJiAweEY4KSA9PSAweEYwIC8qIDExMTEweHh4ICovKSB7CisJCQlpZiAoKGkgPCBvc3N6IC0gMykgJiYgKChvc1tpICsgMV0gJiAweEMwKSA9PSAweDgwIC8qIDEweHh4eHh4ICovKQorCQkJCQkgICAmJiAoKG9zW2kgKyAyXSAmIDB4QzApID09IDB4ODAgLyogMTB4eHh4eHggKi8pCisJCQkJCSAgICYmICgob3NbaSArIDNdICYgMHhDMCkgPT0gMHg4MCAvKiAxMHh4eHh4eCAqLykpCisJCQkJbmIgPSA0OworCQkJZ290byBkaXNwOworCQl9CisJCWlmICgob3NbaV0gJiAweEZDKSA9PSAweEY4IC8qIDExMTExMHh4ICovKSB7CisJCQlpZiAoKGkgPCBvc3N6IC0gNCkgJiYgKChvc1tpICsgMV0gJiAweEMwKSA9PSAweDgwIC8qIDEweHh4eHh4ICovKQorCQkJCQkgICAmJiAoKG9zW2kgKyAyXSAmIDB4QzApID09IDB4ODAgLyogMTB4eHh4eHggKi8pCisJCQkJCSAgICYmICgob3NbaSArIDNdICYgMHhDMCkgPT0gMHg4MCAvKiAxMHh4eHh4eCAqLykKKwkJCQkJICAgJiYgKChvc1tpICsgNF0gJiAweEMwKSA9PSAweDgwIC8qIDEweHh4eHh4ICovKSkKKwkJCQluYiA9IDU7CisJCQlnb3RvIGRpc3A7CisJCX0KKwkJaWYgKChvc1tpXSAmIDB4RkUpID09IDB4RkMgLyogMTExMTExMHggKi8pIHsKKwkJCWlmICgoaSA8IG9zc3ogLSA1KSAmJiAoKG9zW2kgKyAxXSAmIDB4QzApID09IDB4ODAgLyogMTB4eHh4eHggKi8pCisJCQkJCSAgICYmICgob3NbaSArIDJdICYgMHhDMCkgPT0gMHg4MCAvKiAxMHh4eHh4eCAqLykKKwkJCQkJICAgJiYgKChvc1tpICsgM10gJiAweEMwKSA9PSAweDgwIC8qIDEweHh4eHh4ICovKQorCQkJCQkgICAmJiAoKG9zW2kgKyA0XSAmIDB4QzApID09IDB4ODAgLyogMTB4eHh4eHggKi8pCisJCQkJCSAgICYmICgob3NbaSArIDVdICYgMHhDMCkgPT0gMHg4MCAvKiAxMHh4eHh4eCAqLykpCisJCQkJbmIgPSA2OworCQkJZ290byBkaXNwOworCQl9CisJCS8qIG90aGVyd2lzZSwgd2UganVzdCBkaXNwbGF5IHRoZSBoZXggY29kZSAqLworCQlUUkFDRV9ERUJVRyhJTkZPLCAiSW52YWxpZCBjaGFyYWN0ZXIgKDB4JWhoWCkgYXQgb2Zmc2V0ICVkIGluIERpYW1ldGVySWRlbnRpdHkgJyUuKnMnIiwgb3NbaV0sIGkrMSwgKGludClvc3N6LCBvcyk7CisJCXJldHVybiAwOworZGlzcDoKKwkJVFJBQ0VfREVCVUcoSU5GTywgIkludmFsaWQgY2hhcmFjdGVyICclLipzJyBhdCBvZmZzZXQgJWQgaW4gRGlhbWV0ZXJJZGVudGl0eSAnJS4qcyciLCBuYiwgb3MgKyBpLCBpKzEsIChpbnQpb3Nzeiwgb3MpOworCQlyZXR1cm4gMDsKKwl9CisJCisjZW5kaWYgLyogRElBTUlEX0lETkFfSUdOT1JFICovCisJCisJcmV0dXJuIDE7Cit9CisKKy8qIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gdmFsaWRhdGVzIGEgc3RyaW5nIGFzIGEgRGlhbWV0ZXIgSWRlbnRpdHkgb3IgYXBwbGllcyB0aGUgSUROQSB0cmFuc2Zvcm1hdGlvbiBvbiBpdCAKKyBpZiAqaW5vdXRzeiBpcyAhPSAwIG9uIGVudHJ5LCAqaWQgbWF5IG5vdCBiZSBcMC10ZXJtaW5hdGVkLgorIG1lbW9yeSBoYXMgdGhlIGZvbGxvd2luZyBtZWFuaW5nOiAwOiAqaWQgY2FuIGJlIHJlYWxsb2MnZC4gMTogKmlkIG11c3QgYmUgbWFsbG9jJ2Qgb24gb3V0cHV0ICh3YXMgc3RhdGljKQorKi8KK2ludCBmZF9vc192YWxpZGF0ZV9EaWFtZXRlcklkZW50aXR5KGNoYXIgKiogaWQsIHNpemVfdCAqIGlub3V0c3osIGludCBtZW1vcnkpCit7CisjaWYgIWRlZmluZWQoRElBTUlEX0lETkFfSUdOT1JFKSAmJiAhZGVmaW5lZChESUFNSURfSUROQV9SRUpFQ1QpCisJaW50IGdvdHNpemUgPSAwOworI2VuZGlmIC8qIGRlZmluZWQoRElBTUlEX0lETkFfSUdOT1JFKSB8fCBkZWZpbmVkKERJQU1JRF9JRE5BX1JFSkVDVCkgKi8KKwkKKwlUUkFDRV9FTlRSWSgiJXAgJXAiLCBpZCwgaW5vdXRzeik7CisJQ0hFQ0tfUEFSQU1TKCBpZCAmJiAqaWQgJiYgaW5vdXRzeiApOworCQorCWlmICghKmlub3V0c3opCisJCSppbm91dHN6ID0gc3RybGVuKCppZCk7CisjaWYgIWRlZmluZWQoRElBTUlEX0lETkFfSUdOT1JFKSAmJiAhZGVmaW5lZChESUFNSURfSUROQV9SRUpFQ1QpCisJZWxzZQorCQlnb3RzaXplID0gMTsKKyNlbmRpZiAvKiBkZWZpbmVkKERJQU1JRF9JRE5BX0lHTk9SRSkgfHwgZGVmaW5lZChESUFNSURfSUROQV9SRUpFQ1QpICovCisJCisjaWZuZGVmIERJQU1JRF9JRE5BX0lHTk9SRQorCQorCWlmICghZmRfb3NfaXNfdmFsaWRfRGlhbWV0ZXJJZGVudGl0eSgob3MwX3QpKmlkLCAqaW5vdXRzeikpIHsKKwkKKyNpZmRlZiBESUFNSURfSUROQV9SRUpFQ1QKKwkJCisJCVRSQUNFX0RFQlVHKElORk8sICJUaGUgc3RyaW5nICclcycgaXMgbm90IGEgdmFsaWQgRGlhbWV0ZXJJZGVudGl0eSEiLCAqaWQpOworCQlUUkFDRV9ERUJVRyhJTkZPLCAiUmV0dXJuaW5nIEVJTlZBTCBzaW5jZSBmRCBpcyBjb21waWxlZCB3aXRoIG9wdGlvbiBESUFNSURfSUROQV9SRUpFQ1QuIik7CisJCXJldHVybiBFSU5WQUw7CisJCisjZWxzZSAvKiBESUFNSURfSUROQV9SRUpFQ1QgKi8KKwkKKwkJY2hhciAqcHJvY2Vzc2VkOworCQlpbnQgcmV0OworCQkKKwkJaWYgKGdvdHNpemUpIHsgLyogbWFrZSBpdCBcMC10ZXJtaW5hdGVkICovCisJCQlpZiAobWVtb3J5KSB7CisJCQkJQ0hFQ0tfTUFMTE9DKCAqaWQgPSBvczBkdXAoKmlkLCAqaW5vdXRzeikgKTsKKwkJCQltZW1vcnkgPSAwOworCQkJfSBlbHNlIHsKKwkJCQlDSEVDS19NQUxMT0MoICppZCA9IHJlYWxsb2MoKmlkLCAqaW5vdXRzeiArIDEpICk7CisJCQkJKCppZClbKmlub3V0c3pdID0gJzAnOworCQkJfQorCQl9CisJCQorCQlyZXQgPSBpZG5hX3RvX2FzY2lpXzh6ICggKmlkLCAmcHJvY2Vzc2VkLCBJRE5BX1VTRV9TVEQzX0FTQ0lJX1JVTEVTICk7CisJCWlmIChyZXQgPT0gSUROQV9TVUNDRVNTKSB7CisJCQlUUkFDRV9ERUJVRyhJTkZPLCAiVGhlIHN0cmluZyAnJXMnIGlzIG5vdCBhIHZhbGlkIERpYW1ldGVySWRlbnRpdHksIGl0IHdhcyBjaGFuZ2VkIHRvICclcyciLCAqaWQsIHByb2Nlc3NlZCk7CisJCQlpZiAobWVtb3J5ID09IDApCisJCQkJZnJlZSgqaWQpOworCQkJKmlkID0gcHJvY2Vzc2VkOworCQkJKmlub3V0c3ogPSBzdHJsZW4ocHJvY2Vzc2VkKTsKKwkJCS8qIERvbmUhICovCisJCX0gZWxzZSB7CisJCQlUUkFDRV9ERUJVRyhJTkZPLCAiVGhlIHN0cmluZyAnJXMnIGlzIG5vdCBhIHZhbGlkIERpYW1ldGVySWRlbnRpdHkgYW5kIGNhbm5vdCBiZSBzYW5pdGFuaXplZDogJXMiLCAqaWQsIGlkbmFfc3RyZXJyb3IgKHJldCkpOworCQkJcmV0dXJuIEVJTlZBTDsKKwkJfQorCQorI2VuZGlmIC8qIERJQU1JRF9JRE5BX1JFSkVDVCAqLworCX0gZWxzZQorI2VuZGlmIC8qICEgRElBTUlEX0lETkFfSUdOT1JFICovCisJeworCQlpZiAobWVtb3J5ID09IDEpIHsKKwkJCUNIRUNLX01BTExPQyggKmlkID0gb3MwZHVwKCppZCwgKmlub3V0c3opICk7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIEFuYWx5emUgYSBEaWFtZXRlclVSSSBhbmQgcmV0dXJuIGl0cyBjb21wb25lbnRzLiAKKyAgUmV0dXJuIEVJTlZBTCBpZiB0aGUgVVJJIGlzIG5vdCB2YWxpZC4gCisgICpkaWFtaWQgaXMgbWFsbG9jJ2Qgb24gZnVuY3Rpb24gcmV0dXJuIGFuZCBtdXN0IGJlIGZyZWVkIChpdCBpcyBwcm9jZXNzZWQgYnkgZmRfb3NfdmFsaWRhdGVfRGlhbWV0ZXJJZGVudGl0eSkuCisgICpzZWN1cmUgaXMgMCAobm8gc2VjdXJpdHkpIG9yIDEgKHNlY3VyaXR5IGVuYWJsZWQpIG9uIHJldHVybi4KKyAgKnBvcnQgaXMgMCAoZGVmYXVsdCkgb3IgYSB2YWx1ZSBpbiBob3N0IGJ5dGUgb3JkZXIgb24gcmV0dXJuLgorICAqdHJhbnNwb3J0IGlzIDAgKGRlZmF1bHQpIG9yIElQUFJPVE9fKiBvbiByZXR1cm4uCisgICpwcm90byBpcyAwIChkZWZhdWx0KSBvciAnZCcgKGRpYW1ldGVyKSwgJ3InIChyYWRpdXMpLCBvciAndCcgKHRhY2FjcyspIG9uIHJldHVybi4KKyAgKi8KK2ludCBmZF9vc19wYXJzZV9EaWFtZXRlclVSSSh1aW50OF90ICogdXJpLCBzaXplX3QgdXJpc3osIERpYW1JZF90ICogZGlhbWlkLCBzaXplX3QgKiBkaWFtaWRsZW4sIGludCAqIHNlY3VyZSwgdWludDE2X3QgKiBwb3J0LCBpbnQgKiB0cmFuc3BvcnQsIGNoYXIgKnByb3RvKQoreworCXNpemVfdCBvZmZzZXQgPSAwOworCURpYW1JZF90IGZxZG4gPSBOVUxMOworCXNpemVfdCAgIGZxZG5sZW47CisJVFJBQ0VfRU5UUlkoIiVwICV6ZCAlcCAlcCAlcCAlcCAlcCAlcCIsIHVyaSwgdXJpc3osIGRpYW1pZCwgZGlhbWlkbGVuLCBzZWN1cmUsIHBvcnQsIHRyYW5zcG9ydCwgcHJvdG8pOworCUNIRUNLX1BBUkFNUyggdXJpICYmIHVyaXN6ICk7CisJCisJQ0hFQ0tfUEFSQU1TKCB1cmlzeiA+IDcgKTsgLyogImFhYSIgKyAiOi8vIiArIHNvbWV0aGluZyBlbHNlIGF0IGxlYXN0ICovCisJCisJLyogSW5pdGlhbGl6ZSB2YWx1ZXMgKi8KKwlpZiAoc2VjdXJlKQorCQkqc2VjdXJlID0gMDsKKwlpZiAocG9ydCkKKwkJKnBvcnQgPSAwOworCWlmICh0cmFuc3BvcnQpCisJCSp0cmFuc3BvcnQgPSAwOworCWlmIChwcm90bykKKwkJKnByb3RvID0gMDsKKwkKKwkvKiBDaGVjayB0aGUgYmVnaW5uaW5nICovCisJaWYgKG1lbWNtcCggdXJpLCAiYWFhIiwgMykpIHsKKwkJVFJBQ0VfREVCVUcoSU5GTywgIkludmFsaWQgRGlhbWV0ZXJVUkkgcHJlZml4OiBnb3QgJyUuKnMnLCBleHBlY3RlZCAnYWFhJyIsIDMsIHVyaSk7CisJCXJldHVybiBFSU5WQUw7CisJfQorCW9mZnNldCArPSAzOworCQorCS8qIFNlY3VyZT8gKi8KKwlpZiAodXJpW29mZnNldF0gPT0gKHVpbnQ4X3QpJ3MnKSB7CisJCWlmIChzZWN1cmUpCisJCQkqc2VjdXJlID0gMTsKKwkJb2Zmc2V0ICs9IDE7CisJfQorCQorCS8qIFJlbWFpbmluZyBvZiBVUkkgbWFya2VyICovCisJaWYgKG1lbWNtcCggdXJpICsgb2Zmc2V0LCAiOi8vIiwgMykpIHsKKwkJVFJBQ0VfREVCVUcoSU5GTywgIkludmFsaWQgRGlhbWV0ZXJVUkkgcHJlZml4OiBnb3QgJyUuKnMnLCBleHBlY3RlZCAnYWFhOi8vJyBvciAnYWFhczovLyciLCAoaW50KW9mZnNldCArIDMsIHVyaSk7CisJCXJldHVybiBFSU5WQUw7CisJfQorCW9mZnNldCArPSAzOworCQorCS8qIFRoaXMgaXMgdGhlIHN0YXJ0IG9mIHRoZSBGUUROICovCisJZnFkbiA9IChEaWFtSWRfdCl1cmkgKyBvZmZzZXQ7CisJZm9yICggOyBvZmZzZXQgPCB1cmlzeiA7IG9mZnNldCsrICkgeworCQkvKiBTdG9wIG9ubHkgd2hlbiB3ZSBmaW5kICc6JyBvciAnOycgKi8KKwkJaWYgKCh1cmlbb2Zmc2V0XSA9PSAodWludDhfdCknOicpIHx8ICh1cmlbb2Zmc2V0XSA9PSAodWludDhfdCknOycpKQorCQkJYnJlYWs7CisJfQorCWZxZG5sZW4gPSBvZmZzZXQgLSAoZnFkbiAtIChEaWFtSWRfdCl1cmkpOworCUNIRUNLX0ZDVChmZF9vc192YWxpZGF0ZV9EaWFtZXRlcklkZW50aXR5KCZmcWRuLCAmZnFkbmxlbiwgMSkpOworCWlmIChkaWFtaWQpCisJCSpkaWFtaWQgPSBmcWRuOworCWVsc2UKKwkJZnJlZShmcWRuKTsKKwlpZiAoZGlhbWlkbGVuKQorCQkqZGlhbWlkbGVuID0gZnFkbmxlbjsKKwkKKwlpZiAob2Zmc2V0ID09IHVyaXN6KQorCQlyZXR1cm4gMDsgLyogRmluaXNoZWQgKi8KKwkKKwkvKiBJcyB0aGVyZSBhIHBvcnQgPyAqLworCWlmICh1cmlbb2Zmc2V0XSA9PSAnOicpIHsKKwkJdWludDE2X3QgcCA9IDA7CisJCWRvIHsKKwkJCW9mZnNldCsrOworCisJCQlpZiAob2Zmc2V0ID09IHVyaXN6KQorCQkJCWJyZWFrOworCisJCQl1aW50MzJfdCB0ID0gKHVpbnQzMl90KSgoY2hhcil1cmlbb2Zmc2V0XSAtICcwJyk7CisJCQlpZiAodCA+IDkpCisJCQkJYnJlYWs7IC8qIHdlIGRpZCBub3QgZ2V0IGEgZGlnaXQgKi8KKworCQkJdCArPSBwICogMTA7IC8qIHRoZSBwb3J0IGlzIHNwZWNpZmllZCBpbiBkZWNpbWFsIGJhc2UgKi8KKwkJCQorCQkJaWYgKHQgPj0gKDE8PDE2KSkgeworCQkJCVRSQUNFX0RFQlVHKElORk8sICJJbnZhbGlkIERpYW1ldGVyVVJJOiBwb3J0IHZhbHVlIGlzIHRvbyBiaWcuIik7CisJCQkJcmV0dXJuIEVJTlZBTDsKKwkJCX0KKworCQkJcCA9IHQ7CisJCX0gd2hpbGUgKDEpOworCisJCWlmIChwb3J0KQorCQkJKnBvcnQgPSBwOworCX0KKwkKKwlpZiAob2Zmc2V0ID09IHVyaXN6KQorCQlyZXR1cm4gMDsgLyogRmluaXNoZWQgKi8KKwkKKwkvKiBJcyB0aGVyZSBhIHRyYW5zcG9ydD8gKi8KKwlpZiAoICh1cmlzeiAtIG9mZnNldCA+IENPTlNUU1RSTEVOKCI7dHJhbnNwb3J0PSIpKSAKKwkJJiYgIXN0cm5jYXNlY21wKChjaGFyICopdXJpICsgb2Zmc2V0LCAiO3RyYW5zcG9ydD0iLCBDT05TVFNUUkxFTigiO3RyYW5zcG9ydD0iKSkgKSB7CisJCisJCW9mZnNldCArPSBDT05TVFNUUkxFTigiO3RyYW5zcG9ydD0iKTsKKworCQlpZiAodXJpc3ogLSBvZmZzZXQgPCAzKSB7CisJCQlUUkFDRV9ERUJVRyhJTkZPLCAiSW52YWxpZCBEaWFtZXRlclVSSTogdHJhbnNwb3J0IHN0cmluZyBpcyB0b28gc2hvcnQsIGlnbm9yZWQuIik7CisJCQlyZXR1cm4gMDsKKwkJfQkJCisJCWlmICghc3RybmNhc2VjbXAoKGNoYXIgKil1cmkgKyBvZmZzZXQsICJ0Y3AiLCBDT05TVFNUUkxFTigidGNwIikpKSB7CisJCQlpZiAodHJhbnNwb3J0KQorCQkJCSp0cmFuc3BvcnQgPSBJUFBST1RPX1RDUDsKKwkJCW9mZnNldCArPSBDT05TVFNUUkxFTigidGNwIik7CisJCQlnb3RvIGFmdGVyX3RyYW5zcG9ydDsKKwkJfQorCQlpZiAoIXN0cm5jYXNlY21wKChjaGFyICopdXJpICsgb2Zmc2V0LCAidWRwIiwgQ09OU1RTVFJMRU4oInVkcCIpKSkgeworCQkJaWYgKHRyYW5zcG9ydCkKKwkJCQkqdHJhbnNwb3J0ID0gSVBQUk9UT19VRFA7CisJCQlvZmZzZXQgKz0gQ09OU1RTVFJMRU4oInVkcCIpOworCQkJZ290byBhZnRlcl90cmFuc3BvcnQ7CisJCX0KKwkJaWYgKCh1cmlzeiAtIG9mZnNldCA+IDMpICYmICFzdHJuY2FzZWNtcCgoY2hhciAqKXVyaSArIG9mZnNldCwgInNjdHAiLCBDT05TVFNUUkxFTigic2N0cCIpKSkgeworCQkJaWYgKHRyYW5zcG9ydCkgeworI2lmbmRlZiBESVNBQkxFX1NDVFAKKwkJCQkqdHJhbnNwb3J0ID0gSVBQUk9UT19TQ1RQOworI2Vsc2UgLyogRElTQUJMRV9TQ1RQICovCisJCQkJVFJBQ0VfREVCVUcoSU5GTywgIlJlY2VpdmVkIERpYW1ldGVyVVJJIHdpdGggJ3RyYW5zcG9ydD1zY3RwJyBidXQgRElTQUJMRV9TQ1RQIHdhcyBzZWxlY3RlZCIpOworCQkJCSp0cmFuc3BvcnQgPSAwOworI2VuZGlmIC8qIERJU0FCTEVfU0NUUCAqLworCQkJfQorCQkJb2Zmc2V0ICs9IENPTlNUU1RSTEVOKCJzY3RwIik7CisJCQlnb3RvIGFmdGVyX3RyYW5zcG9ydDsKKwkJfQorCQkKKwkJVFJBQ0VfREVCVUcoSU5GTywgIkludmFsaWQgRGlhbWV0ZXJVUkk6IHRyYW5zcG9ydCBzdHJpbmcgaXMgbm90IHJlY29nbml6ZWQgKCclLipzJykuIiwgKGludCkodXJpc3ogLSBvZmZzZXQpLCB1cmkgKyBvZmZzZXQpOworCQlyZXR1cm4gRUlOVkFMOworCX0KK2FmdGVyX3RyYW5zcG9ydDoKKwlpZiAob2Zmc2V0ID09IHVyaXN6KQorCQlyZXR1cm4gMDsgLyogRmluaXNoZWQgKi8KKwkKKwkvKiBJcyB0aGVyZSBhIHByb3RvY29sPyAqLworCWlmICggKCh1cmlzeiAtIG9mZnNldCkgPiBDT05TVFNUUkxFTigiO3Byb3RvY29sPSIpKSAKKwkJJiYgKCFzdHJuY2FzZWNtcCgoY2hhciAqKXVyaSArIG9mZnNldCwgIjtwcm90b2NvbD0iLCBDT05TVFNUUkxFTigiO3Byb3RvY29sPSIpKSkgKSB7CisJCisJCW9mZnNldCArPSBDT05TVFNUUkxFTigiO3Byb3RvY29sPSIpOworCisJCWlmICggKCh1cmlzeiAtIG9mZnNldCkgPj0gQ09OU1RTVFJMRU4oImRpYW1ldGVyIikpIAorCQkgICAgJiYgKCFzdHJuY2FzZWNtcCgoY2hhciAqKXVyaSArIG9mZnNldCwgImRpYW1ldGVyIiwgQ09OU1RTVFJMRU4oImRpYW1ldGVyIikpKSApIHsKKwkJCWlmIChwcm90bykKKwkJCQkqcHJvdG8gPSAnZCc7CisJCQlvZmZzZXQgKz0gQ09OU1RTVFJMRU4oImRpYW1ldGVyIik7CisJCQlnb3RvIGFmdGVyX3Byb3RvOworCQl9CisJCQorCQlpZiAoICgodXJpc3ogLSBvZmZzZXQpID49IENPTlNUU1RSTEVOKCJyYWRpdXMiKSkgCisJCSAgICAmJiAoIXN0cm5jYXNlY21wKChjaGFyICopdXJpICsgb2Zmc2V0LCAicmFkaXVzIiwgQ09OU1RTVFJMRU4oInJhZGl1cyIpKSkgKSB7CisJCQlpZiAocHJvdG8pCisJCQkJKnByb3RvID0gJ3InOworCQkJb2Zmc2V0ICs9IENPTlNUU1RSTEVOKCJyYWRpdXMiKTsKKwkJCWdvdG8gYWZ0ZXJfcHJvdG87CisJCX0KKwkJCisJCWlmICggKCh1cmlzeiAtIG9mZnNldCkgPj0gQ09OU1RTVFJMRU4oInRhY2FjcysiKSkgCisJCSAgICAmJiAoIXN0cm5jYXNlY21wKChjaGFyICopdXJpICsgb2Zmc2V0LCAidGFjYWNzKyIsIENPTlNUU1RSTEVOKCJ0YWNhY3MrIikpKSApIHsKKwkJCWlmIChwcm90bykKKwkJCQkqcHJvdG8gPSAndCc7CisJCQlvZmZzZXQgKz0gQ09OU1RTVFJMRU4oInRhY2FjcysiKTsKKwkJCWdvdG8gYWZ0ZXJfcHJvdG87CisJCX0KKwkJCisJCVRSQUNFX0RFQlVHKElORk8sICJJbnZhbGlkIERpYW1ldGVyVVJJOiBwcm90b2NvbCBzdHJpbmcgaXMgbm90IHJlY29nbml6ZWQgKCclLipzJykuIiwgKGludCkodXJpc3ogLSBvZmZzZXQpLCB1cmkgKyBvZmZzZXQpOworCQlyZXR1cm4gRUlOVkFMOworCQkKKwl9CithZnRlcl9wcm90bzoKKwlpZiAob2Zmc2V0ID09IHVyaXN6KQorCQlyZXR1cm4gMDsgLyogRmluaXNoZWQgKi8KKwkKKwlUUkFDRV9ERUJVRyhJTkZPLCAiSW52YWxpZCBEaWFtZXRlclVSSTogZmluYWwgcGFydCBvZiBzdHJpbmcgaXMgbm90IHJlY29nbml6ZWQgKCclLipzJykuIiwgKGludCkodXJpc3ogLSBvZmZzZXQpLCB1cmkgKyBvZmZzZXQpOworCXJldHVybiBFSU5WQUw7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogSGFzaCBmdW5jdGlvbiAtLSBjcmVkaXRzIHRvIEF1c3RpbiBBcHBsZWJ5LCB0aGFuayB5b3UgXl4gKi8KKy8qIFNlZSBodHRwOi8vbXVybXVyaGFzaC5nb29nbGVwYWdlcy5jb20gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhpcyBmdW5jdGlvbiAqLworCisvKiB0aGUgc3RyaW5ncyBhcmUgTk9UIGFsd2F5cyBhbGlnbmVkIHByb3Blcmx5IChleDogcmVjZWl2ZWQgaW4gUkFESVVTIG1lc3NhZ2UpLCBzbyB3ZSB1c2UgdGhlIGFsaWduZWQgTXVybXVySGFzaDIgZnVuY3Rpb24gYXMgbmVlZGVkICovCisjZGVmaW5lIF9IQVNIX01JWChoLGssbSkgeyBrICo9IG07IGsgXj0gayA+PiByOyBrICo9IG07IGggKj0gbTsgaCBePSBrOyB9Cit1aW50MzJfdCBmZF9vc19oYXNoICggdWludDhfdCAqIHN0cmluZywgc2l6ZV90IGxlbiApCit7CisJdWludDMyX3QgaGFzaCA9IGxlbjsKKwl1aW50OF90ICogZGF0YSA9IHN0cmluZzsKKwkKKwljb25zdCB1bnNpZ25lZCBpbnQgbSA9IDB4NWJkMWU5OTU7CisJY29uc3QgaW50IHIgPSAyNDsKKwlpbnQgYWxpZ24gPSAobG9uZylzdHJpbmcgJiAzOworCQorCWlmICghYWxpZ24gfHwgKGxlbiA8IDQpKSB7CisJCS8qIEluIGNhc2UgZGF0YSBpcyBhbGlnbmVkLCBNdXJtdXJIYXNoMiBmdW5jdGlvbiAqLworCQl3aGlsZShsZW4gPj0gNCkKKwkJeworCQkJLyogTWl4IDQgYnl0ZXMgYXQgYSB0aW1lIGludG8gdGhlIGhhc2ggKi8KKwkJCXVpbnQzMl90IGsgPSAqKHVpbnQzMl90ICopZGF0YTsJLyogV2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgYnl0ZSBvcmRlciAqLworCisJCQlfSEFTSF9NSVgoaGFzaCwgaywgbSk7CisKKwkJCWRhdGEgKz0gNDsKKwkJCWxlbiAtPSA0OworCQl9CisKKwkJLyogSGFuZGxlIHRoZSBsYXN0IGZldyBieXRlcyBvZiB0aGUgaW5wdXQgKi8KKwkJc3dpdGNoKGxlbikgeworCQkJY2FzZSAzOiBoYXNoIF49IGRhdGFbMl0gPDwgMTY7CisJCQljYXNlIDI6IGhhc2ggXj0gZGF0YVsxXSA8PCA4OworCQkJY2FzZSAxOiBoYXNoIF49IGRhdGFbMF07CisJICAgICAgICAJCWhhc2ggKj0gbTsKKwkJfQorCQkKKwl9IGVsc2UgeworCQkvKiBVbmFsaWduZWQgZGF0YSwgdXNlIGFsaWdubWVudC1zYWZlIHNsb3dlciB2ZXJzaW9uICovCisJCQorCQkvKiBQcmUtbG9hZCB0aGUgdGVtcCByZWdpc3RlcnMgKi8KKwkJdWludDMyX3QgdCA9IDAsIGQgPSAwOworCQlzd2l0Y2goYWxpZ24pCisJCXsKKwkJCWNhc2UgMTogdCB8PSBkYXRhWzJdIDw8IDE2OworCQkJY2FzZSAyOiB0IHw9IGRhdGFbMV0gPDwgODsKKwkJCWNhc2UgMzogdCB8PSBkYXRhWzBdOworCQl9CisJCXQgPDw9ICg4ICogYWxpZ24pOworCisJCWRhdGEgKz0gNC1hbGlnbjsKKwkJbGVuIC09IDQtYWxpZ247CisJCQorCQkvKiBGcm9tIHRoaXMgcG9pbnQsICJkYXRhIiBjYW4gYmUgcmVhZCBieSBjaHVua3Mgb2YgNCBieXRlcyAqLworCQkKKwkJaW50IHNsID0gOCAqICg0LWFsaWduKTsKKwkJaW50IHNyID0gOCAqIGFsaWduOworCisJCS8qIE1peCAqLworCQl3aGlsZShsZW4gPj0gNCkKKwkJeworCQkJdWludDMyX3QgazsKKwkJCQorCQkJZCA9ICoodW5zaWduZWQgaW50ICopZGF0YTsKKwkJCWsgPSAodCA+PiBzcikgfCAoZCA8PCBzbCk7CisKKwkJCV9IQVNIX01JWChoYXNoLCBrLCBtKTsKKworCQkJdCA9IGQ7CisKKwkJCWRhdGEgKz0gNDsKKwkJCWxlbiAtPSA0OworCQl9CisKKwkJLyogSGFuZGxlIGxlZnRvdmVyIGRhdGEgaW4gdGVtcCByZWdpc3RlcnMgKi8KKwkJZCA9IDA7CisJCWlmKGxlbiA+PSBhbGlnbikKKwkJeworCQkJdWludDMyX3QgazsKKwkJCQorCQkJc3dpdGNoKGFsaWduKQorCQkJeworCQkJY2FzZSAzOiBkIHw9IGRhdGFbMl0gPDwgMTY7CisJCQljYXNlIDI6IGQgfD0gZGF0YVsxXSA8PCA4OworCQkJY2FzZSAxOiBkIHw9IGRhdGFbMF07CisJCQl9CisKKwkJCWsgPSAodCA+PiBzcikgfCAoZCA8PCBzbCk7CisJCQlfSEFTSF9NSVgoaGFzaCwgaywgbSk7CisKKwkJCWRhdGEgKz0gYWxpZ247CisJCQlsZW4gLT0gYWxpZ247CisKKwkJCS8qIEhhbmRsZSB0YWlsIGJ5dGVzICovCisKKwkJCXN3aXRjaChsZW4pCisJCQl7CisJCQljYXNlIDM6IGhhc2ggXj0gZGF0YVsyXSA8PCAxNjsKKwkJCWNhc2UgMjogaGFzaCBePSBkYXRhWzFdIDw8IDg7CisJCQljYXNlIDE6IGhhc2ggXj0gZGF0YVswXTsKKwkJCQkJaGFzaCAqPSBtOworCQkJfTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXN3aXRjaChsZW4pCisJCQl7CisJCQljYXNlIDM6IGQgfD0gZGF0YVsyXSA8PCAxNjsKKwkJCWNhc2UgMjogZCB8PSBkYXRhWzFdIDw8IDg7CisJCQljYXNlIDE6IGQgfD0gZGF0YVswXTsKKwkJCWNhc2UgMDogaGFzaCBePSAodCA+PiBzcikgfCAoZCA8PCBzbCk7CisJCQkJCWhhc2ggKj0gbTsKKwkJCX0KKwkJfQorCisKKwl9CisKKwkvKiBEbyBhIGZldyBmaW5hbCBtaXhlcyBvZiB0aGUgaGFzaCB0byBlbnN1cmUgdGhlIGxhc3QgZmV3CisJICAgYnl0ZXMgYXJlIHdlbGwtaW5jb3Jwb3JhdGVkLiAqLworCWhhc2ggXj0gaGFzaCA+PiAxMzsKKwloYXNoICo9IG07CisJaGFzaCBePSBoYXNoID4+IDE1OworCisJcmV0dXJuIGhhc2g7Cit9IAorCmRpZmYgLS1naXQgYS9saWJmZHByb3RvL3BvcnRhYmlsaXR5LmMgYi9saWJmZHByb3RvL3BvcnRhYmlsaXR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzExMWNjMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmZkcHJvdG8vcG9ydGFiaWxpdHkuYwpAQCAtMCwwICsxLDcwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxMiwgV0lERSBQcm9qZWN0IGFuZCBOSUNUCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBXSURFIFByb2plY3Qgb3IgTklDVCBub3IgdGhlIAkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFdJREUgUHJvamVjdCBhbmQgCQkJCQkJICoKKyogICBOSUNULgkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJmZHByb3RvLWludGVybmFsLmgiCisKKy8qIFJlcGxhY2VtZW50IGZvciBjbG9ja19nZXR0aW1lIGZvciB0aGUgTWFjIE9TICovCisjaWZuZGVmIEhBVkVfQ0xPQ0tfR0VUVElNRQoraW50IGNsb2NrX2dldHRpbWUoaW50IGNsa19pZCwgc3RydWN0IHRpbWVzcGVjKiB0cykKK3sKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwlnZXR0aW1lb2ZkYXkgKCZ0diwgTlVMTCk7CisJdHMtPnR2X3NlYyA9IHR2LnR2X3NlYzsKKwl0cy0+dHZfbnNlYyA9IHR2LnR2X3VzZWMgKiAxMDAwOworCXJldHVybiAwOworfQorI2VuZGlmIC8qIEhBVkVfQ0xPQ0tfR0VUVElNRSAqLworCisvKiBSZXBsYWNlbWVudCBmb3Igc3RybmR1cCBmb3IgdGhlIE1hYyBPUyAqLworI2lmbmRlZiBIQVZFX1NUUk5EVVAKK2NoYXIgKiBzdHJuZHVwIChjaGFyICpzdHIsIHNpemVfdCBsZW4pCit7CisJY2hhciAqIG91dHB1dDsKKwlzaXplX3Qgb3V0bGVuOworCQorCW91dHB1dCA9IG1lbWNocihzdHIsIDAsIGxlbik7CisJaWYgKG91dHB1dCA9PSBOVUxMKSB7CisJCW91dGxlbiA9IGxlbjsKKwl9IGVsc2UgeworCQlvdXRsZW4gPSBvdXRwdXQgLSBzdHI7CisJfQorCQorCUNIRUNLX01BTExPQ19ETyggb3V0cHV0ID0gbWFsbG9jIChvdXRsZW4gKyAxKSwgcmV0dXJuIE5VTEwgKTsKKworCW91dHB1dFtvdXRsZW5dID0gJ1wwJzsKKwltZW1jcHkgKG91dHB1dCwgc3RyLCBvdXRsZW4pOworCXJldHVybiBvdXRwdXQ7Cit9CisjZW5kaWYgLyogSEFWRV9TVFJORFVQICovCmRpZmYgLS1naXQgYS9saWJmZHByb3RvL3J0X2RhdGEuYyBiL2xpYmZkcHJvdG8vcnRfZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMDVlZjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJmZHByb3RvL3J0X2RhdGEuYwpAQCAtMCwwICsxLDMzOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTMsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBSb3V0aW5nIG1vZHVsZSBoZWxwZXJzLgorICogCisgKiBUaGlzIGZpbGUgcHJvdmlkZXMgc3VwcG9ydCBmb3IgdGhlIHJ0X2RhdGEgc3RydWN0dXJlIG1hbmlwdWxhdGlvbi4KKyAqLworCisjaW5jbHVkZSAiZmRwcm90by1pbnRlcm5hbC5oIgorCisvKiBTdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGUgcm91dGluZyBkYXRhIGZvciBhIG1lc3NhZ2UgKi8KK3N0cnVjdCBydF9kYXRhIHsKKwlpbnQJCWV4dHJhY3RlZDsJLyogaWYgMCwgY2FuZGlkYXRlcyBpcyBvcmRlcmVkIGJ5IGRpYW1pZCwgb3RoZXJ3aXNlIHRoZSBvcmRlciBpcyB1bnNwZWNpZmllZC4gVGhpcyBhbHNvIGNvdW50cyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBtZXNzYWdlIHdhcyAocmUtKXNlbnQsIGFzIGEgc2lkZSBlZmZlY3QgKi8KKwlzdHJ1Y3QgZmRfbGlzdAljYW5kaWRhdGVzOwkvKiBBbGwgdGhlIGNhbmRpZGF0ZXMuIEl0ZW1zIGFyZSBzdHJ1Y3QgcnRkX2NhbmRpZGF0ZS4gKi8KKwlzdHJ1Y3QgZmRfbGlzdAllcnJvcnM7CQkvKiBBbGwgZXJyb3JzIHJlY2VpdmVkIGZyb20gb3RoZXIgcGVlcnMgZm9yIHRoaXMgbWVzc2FnZSAqLworfTsKKworLyogSXRlbXMgb2YgdGhlIGVycm9ycyBsaXN0ICovCitzdHJ1Y3QgcnRkX2Vycm9yIHsKKwlzdHJ1Y3QgZmRfbGlzdAljaGFpbjsJLyogbGluayBpbiB0aGUgbGlzdCwgb3JkZXJlZCBieSBuZXh0aG9wIChmZF9vc19jbXApICovCisJRGlhbUlkX3QgCW5leHRob3A7LyogdGhlIHBlZXIgdGhlIG1lc3NhZ2Ugd2FzIHNlbnQgdG8gKi8KKwlzaXplX3QJCW5leHRob3BsZW47IC8qIGNhY2hlZCBzdHJpbmcgbGVuZ3RoICovCisJRGlhbUlkX3QJZXJoOwkvKiB0aGUgb3JpZ2luIG9mIHRoZSBlcnJvciAqLworCXNpemVfdAkJZXJobGVuOyAvKiBjYWNoZWQgc3RyaW5nIGxlbmd0aCAqLworCXVpbnQzMl90CWNvZGU7CS8qIHRoZSBlcnJvciBjb2RlICovCit9OworCisvKiBDcmVhdGUgYSBuZXcgc3RydWN0dXJlIHRvIHN0b3JlIHJvdXRpbmcgZGF0YSAqLworaW50ICBmZF9ydGRfaW5pdChzdHJ1Y3QgcnRfZGF0YSAqKiBydGQpCit7CisJc3RydWN0IHJ0X2RhdGEgKm5ldzsKKwlUUkFDRV9FTlRSWSgiJXAiLCBydGQpOworCUNIRUNLX1BBUkFNUyhydGQpOworCQorCS8qIEFsbG9jIHRoZSBzdHJ1Y3R1cmUgKi8KKwlDSEVDS19NQUxMT0MoIG5ldyA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHJ0X2RhdGEpKSApOworCW1lbXNldChuZXcsIDAsIHNpemVvZihzdHJ1Y3QgcnRfZGF0YSkgKTsKKwlmZF9saXN0X2luaXQoJm5ldy0+Y2FuZGlkYXRlcywgbmV3KTsKKwlmZF9saXN0X2luaXQoJm5ldy0+ZXJyb3JzLCBuZXcpOworCQorCSpydGQgPSBuZXc7CisJcmV0dXJuIDA7Cit9CisKKy8qIERlc3Ryb3kgdGhlIHJvdXRpbmcgZGF0YSAqLwordm9pZCBmZF9ydGRfZnJlZShzdHJ1Y3QgcnRfZGF0YSAqKiBydGQpCit7CisJc3RydWN0IHJ0X2RhdGEgKm9sZDsKKwkKKwlUUkFDRV9FTlRSWSgiJXAiLCBydGQpOworCUNIRUNLX1BBUkFNU19ETyhydGQsIHJldHVybiApOworCQorCW9sZCA9ICpydGQ7CisJKnJ0ZCA9IE5VTEw7CisJCisJd2hpbGUgKCFGRF9JU19MSVNUX0VNUFRZKCZvbGQtPmNhbmRpZGF0ZXMpKSB7CisJCXN0cnVjdCBydGRfY2FuZGlkYXRlICogYyA9IChzdHJ1Y3QgcnRkX2NhbmRpZGF0ZSAqKSBvbGQtPmNhbmRpZGF0ZXMubmV4dDsKKwkJCisJCWZkX2xpc3RfdW5saW5rKCZjLT5jaGFpbik7CisJCWZyZWUoYy0+ZGlhbWlkKTsKKwkJZnJlZShjLT5yZWFsbSk7CisJCWZyZWUoYyk7CisJfQorCQorCXdoaWxlICghRkRfSVNfTElTVF9FTVBUWSgmb2xkLT5lcnJvcnMpKSB7CisJCXN0cnVjdCBydGRfZXJyb3IgKiBjID0gKHN0cnVjdCBydGRfZXJyb3IgKikgb2xkLT5lcnJvcnMubmV4dDsKKwkJCisJCWZkX2xpc3RfdW5saW5rKCZjLT5jaGFpbik7CisJCWZyZWUoYy0+bmV4dGhvcCk7CisJCWZyZWUoYy0+ZXJoKTsKKwkJZnJlZShjKTsKKwl9CisJCisJZnJlZShvbGQpOworCQorCXJldHVybjsKK30KKworLyogQWRkIGEgcGVlciB0byB0aGUgY2FuZGlkYXRlcyBsaXN0LiBUaGUgc291cmNlIGlzIG91ciBsb2NhbCBwZWVyIGxpc3QsIHNvIG5vIG5lZWQgdG8gY2FyZSBmb3IgdGhlIGNhc2UgaGVyZS4gKi8KK2ludCAgZmRfcnRkX2NhbmRpZGF0ZV9hZGQoc3RydWN0IHJ0X2RhdGEgKiBydGQsIERpYW1JZF90IHBlZXJpZCwgc2l6ZV90IHBlZXJpZGxlbiwgRGlhbUlkX3QgcmVhbG0sIHNpemVfdCByZWFsbWxlbikKK3sKKwlzdHJ1Y3QgZmRfbGlzdCAqIHByZXY7CisJc3RydWN0IHJ0ZF9jYW5kaWRhdGUgKiBuZXc7CisJCisJVFJBQ0VfRU5UUlkoIiVwICVwICV6ZCAlcCAlemQiLCBydGQsIHBlZXJpZCwgcGVlcmlkbGVuLCByZWFsbSwgcmVhbG1sZW4pOworCUNIRUNLX1BBUkFNUyhydGQgJiYgcGVlcmlkICYmIHBlZXJpZGxlbik7CisJCisJLyogU2luY2UgdGhlIHBlZXJzIGFyZSBvcmRlcmVkIHdoZW4gdGhleSBhcmUgYWRkZWQgKGZkX2dfYWN0aXZfcGVlcnMpIHdlIHNlYXJjaCBmb3IgdGhlIHBvc2l0aW9uIGZyb20gdGhlIGVuZCAtLSB0aGlzIHNob3VsZCBiZSBlZmZpY2llbnQgKi8KKwlmb3IgKHByZXYgPSBydGQtPmNhbmRpZGF0ZXMucHJldjsgcHJldiAhPSAmcnRkLT5jYW5kaWRhdGVzOyBwcmV2ID0gcHJldi0+cHJldikgeworCQlzdHJ1Y3QgcnRkX2NhbmRpZGF0ZSAqIGNwID0gKHN0cnVjdCBydGRfY2FuZGlkYXRlICopIHByZXY7CisJCWludCBjbXAgPSBmZF9vc19jbXAocGVlcmlkLCBwZWVyaWRsZW4sIGNwLT5kaWFtaWQsIGNwLT5kaWFtaWRsZW4pOworCQlpZiAoY21wID4gMCkKKwkJCWJyZWFrOworCQlpZiAoY21wID09IDApCisJCQkvKiBUaGUgY2FuZGlkYXRlIGlzIGFscmVhZHkgaW4gdGhlIGxpc3QgKi8KKwkJCXJldHVybiAwOworCX0KKwkKKwkvKiBDcmVhdGUgdGhlIG5ldyBlbnRyeSAqLworCUNIRUNLX01BTExPQyggbmV3ID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgcnRkX2NhbmRpZGF0ZSkpICk7CisJbWVtc2V0KG5ldywgMCwgc2l6ZW9mKHN0cnVjdCBydGRfY2FuZGlkYXRlKSApOworCWZkX2xpc3RfaW5pdCgmbmV3LT5jaGFpbiwgbmV3KTsKKwlDSEVDS19NQUxMT0MoIG5ldy0+ZGlhbWlkID0gb3MwZHVwKHBlZXJpZCwgcGVlcmlkbGVuKSApCisJbmV3LT5kaWFtaWRsZW4gPSBwZWVyaWRsZW47CisJaWYgKHJlYWxtKSB7CisJCUNIRUNLX01BTExPQyggbmV3LT5yZWFsbSA9IG9zMGR1cChyZWFsbSwgcmVhbG1sZW4pICkKKwkJbmV3LT5yZWFsbWxlbiA9IHJlYWxtbGVuOworCX0KKwkKKwkvKiBpbnNlcnQgaW4gdGhlIGxpc3QgYXQgdGhlIGNvcnJlY3QgcG9zaXRpb24gKi8KKwlmZF9saXN0X2luc2VydF9hZnRlcihwcmV2LCAmbmV3LT5jaGFpbik7CisJCisJcmV0dXJuIDA7Cit9CisKKy8qIFJlbW92ZSBhIHBlZXIgZnJvbSB0aGUgY2FuZGlkYXRlcyAoaWYgaXQgaXMgZm91bmQpLiBDYXNlIGluc2Vuc2l0aXZlIHNlYXJjaCBzaW5jZSB0aGUgbmFtZXMgYXJlIHJlY2VpdmVkIGZyb20gb3RoZXIgcGVlcnMgKi8KK3ZvaWQgZmRfcnRkX2NhbmRpZGF0ZV9kZWwoc3RydWN0IHJ0X2RhdGEgKiBydGQsIHVpbnQ4X3QgKiBpZCwgc2l6ZV90IGlkc3opCit7CisJc3RydWN0IGZkX2xpc3QgKiBsaTsKKwkKKwlUUkFDRV9FTlRSWSgiJXAgJXAgJXpkIiwgcnRkLCBpZCwgaWRzeik7CisJQ0hFQ0tfUEFSQU1TX0RPKCBydGQgJiYgaWQgJiYgaWRzeiwgcmV0dXJuICk7CisJCisJaWYgKCFmZF9vc19pc192YWxpZF9EaWFtZXRlcklkZW50aXR5KGlkLCBpZHN6KSkKKwkJLyogaXQgY2Fubm90IGJlIGluIHRoZSBsaXN0ICovCisJCXJldHVybjsKKwkKKwlmb3IgKGxpID0gcnRkLT5jYW5kaWRhdGVzLm5leHQ7IGxpICE9ICZydGQtPmNhbmRpZGF0ZXM7IGxpID0gbGktPm5leHQpIHsKKwkJc3RydWN0IHJ0ZF9jYW5kaWRhdGUgKiBjID0gKHN0cnVjdCBydGRfY2FuZGlkYXRlICopIGxpOworCQlpbnQgY29udDsKKwkJaW50IGNtcCA9IGZkX29zX2FsbW9zdGNhc2VzcmNoKGlkLCBpZHN6LCBjLT5kaWFtaWQsIGMtPmRpYW1pZGxlbiwgJmNvbnQpOworCQkKKwkJaWYgKCFjbXApIHsKKwkJCS8qIEZvdW5kIGl0ISBSZW1vdmUgaXQgKi8KKwkJCWZkX2xpc3RfdW5saW5rKCZjLT5jaGFpbik7CisJCQlmcmVlKGMtPmRpYW1pZCk7CisJCQlmcmVlKGMtPnJlYWxtKTsKKwkJCWZyZWUoYyk7CisJCQlicmVhazsKKwkJfQorCQkKKwkJaWYgKGNvbnQpCisJCQljb250aW51ZTsKKwkJCisJCS8qIFRoZSBsaXN0IGlzIGd1YXJhbnRlZWQgdG8gYmUgb3JkZXJlZCBvbmx5IGlmIG5vdCBleHRyYWN0ZWQgKi8KKwkJaWYgKCEgcnRkLT5leHRyYWN0ZWQpCisJCQlicmVhazsKKwl9CisJCisJcmV0dXJuOworfQorCisvKiBJZiBhIHBlZXIgcmV0dXJuZWQgYSBwcm90b2NvbCBlcnJvciBmb3IgdGhpcyBtZXNzYWdlLCBzYXZlIGl0IHNvIHRoYXQgd2UgZG9uJ3QgdHJ5IHRvIHNlbmQgaXQgdGhlcmUgYWdhaW4uCisgQ2FzZSBpbnNlbnNpdGl2ZSBzZWFyY2ggc2luY2UgdGhlIG5hbWVzIGFyZSByZWNlaXZlZCBmcm9tIG90aGVyIHBlZXJzKi8KK2ludCAgZmRfcnRkX2Vycm9yX2FkZChzdHJ1Y3QgcnRfZGF0YSAqIHJ0ZCwgRGlhbUlkX3Qgc2VudHRvLCBzaXplX3Qgc2VudHRvbGVuLCB1aW50OF90ICogb3JpZ2luLCBzaXplX3Qgb3JpZ2luc3osIHVpbnQzMl90IHJjb2RlLCBzdHJ1Y3QgZmRfbGlzdCAqKiBjYW5kaWRhdGVzLCBpbnQgKiBzZW5kaW5nYXR0ZW10cHMpCit7CisJc3RydWN0IGZkX2xpc3QgKiBsaTsKKwlpbnQgbWF0Y2ggPSAwOworCQorCVRSQUNFX0VOVFJZKCIlcCAlcCAlemQgJXAgJXpkICV1ICVwICVwIiwgcnRkLCBzZW50dG8sIHNlbnR0b2xlbiwgb3JpZ2luLCBvcmlnaW5zeiwgcmNvZGUsIGNhbmRpZGF0ZXMsIHNlbmRpbmdhdHRlbXRwcyk7CisJQ0hFQ0tfUEFSQU1TKCBydGQgJiYgc2VudHRvICYmIHNlbnR0b2xlbiApOyAvKiBvcmlnaW4gbWF5IGJlIE5VTEwgKi8KKwkKKwkvKiBGaXJzdCBhZGQgdGhlIG5ldyBlcnJvciBlbnRyeSAqLworCWZvciAobGkgPSBydGQtPmVycm9ycy5uZXh0OyBsaSAhPSAmcnRkLT5lcnJvcnM7IGxpID0gbGktPm5leHQpIHsKKwkJc3RydWN0IHJ0ZF9lcnJvciAqIGUgPSAoc3RydWN0IHJ0ZF9lcnJvciAqKSBsaTsKKwkJaW50IGNtcCA9IGZkX29zX2NtcChzZW50dG8sIHNlbnR0b2xlbiwgZS0+bmV4dGhvcCwgZS0+bmV4dGhvcGxlbik7CisJCWlmIChjbXAgPiAwKQorCQkJY29udGludWU7CisJCWlmICghY21wKQorCQkJbWF0Y2ggPSAxOworCQlicmVhazsKKwl9CisJCisJLyogSWYgd2UgYWxyZWFkeSBoYWQgdGhpcyBlbnRyeSwgd2Ugc2hvdWxkIG5vdCBoYXZlIHNlbnQgdGhlIG1lc3NhZ2UgYWdhaW4gdG8gdGhpcyBwZWVyLi4uIGFueXdheSwgbGV0J3MgY2xvc2Ugb3VyIGV5ZXMuICovCisJLyogaW4gdGhlIG5vcm1hbCBjYXNlLCB3ZSBzYXZlIHRoZSBlcnJvciAqLworCWlmICghbWF0Y2gpIHsKKwkJLyogQWRkIGEgbmV3IGVudHJ5IGluIHRoZSBlcnJvciBsaXN0ICovCisJCXN0cnVjdCBydGRfZXJyb3IgKiBuZXc7CisJCUNIRUNLX01BTExPQyggbmV3ID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgcnRkX2Vycm9yKSkgKTsKKwkJbWVtc2V0KG5ldywgMCwgc2l6ZW9mKHN0cnVjdCBydGRfZXJyb3IpKTsKKwkJZmRfbGlzdF9pbml0KCZuZXctPmNoYWluLCBOVUxMKTsKKworCQlDSEVDS19NQUxMT0MobmV3LT5uZXh0aG9wID0gb3MwZHVwKHNlbnR0bywgc2VudHRvbGVuKSk7CisJCW5ldy0+bmV4dGhvcGxlbiA9IHNlbnR0b2xlbjsKKwkJCisJCWlmIChvcmlnaW4pIHsKKwkJCWlmICghb3JpZ2luc3opIHsKKwkJCQlvcmlnaW5zej1zdHJsZW4oKGNoYXIgKilvcmlnaW4pOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoIWZkX29zX2lzX3ZhbGlkX0RpYW1ldGVySWRlbnRpdHkob3JpZ2luLCBvcmlnaW5zeikpeworCQkJCQlUUkFDRV9ERUJVRyhGVUxMLCAiUmVjZWl2ZWQgZXJyb3IgJWQgZnJvbSBwZWVyIHdpdGggaW52YWxpZCBPcmlnaW4tSG9zdCBBVlAsIG5vdCBzYXZlZCIsIHJjb2RlKTsKKwkJCQkJb3JpZ2luID0gTlVMTDsKKwkJCQkJZ290byBhZnRlcl9vcmlnaW47CisJCQkJfQorCQkJfQorCQkJQ0hFQ0tfTUFMTE9DKCBuZXctPmVyaCA9IChEaWFtSWRfdClvczBkdXAob3JpZ2luLCBvcmlnaW5zeikgKTsKKwkJCW5ldy0+ZXJobGVuID0gb3JpZ2luc3o7CisJCX0KK2FmdGVyX29yaWdpbjoKKwkJbmV3LT5jb2RlID0gcmNvZGU7CisJCWZkX2xpc3RfaW5zZXJ0X2JlZm9yZShsaSwgJm5ldy0+Y2hhaW4pOworCX0KKwkKKwkvKiBGaW5hbGx5LCByZW1vdmUgdGhpcyAodGhlc2UpIHBlZXJzIGZyb20gdGhlIGNhbmRpZGF0ZSBsaXN0ICovCisJZmRfcnRkX2NhbmRpZGF0ZV9kZWwocnRkLCAob3MwX3Qpc2VudHRvLCBzZW50dG9sZW4pOworCWlmIChvcmlnaW4pCisJCWZkX3J0ZF9jYW5kaWRhdGVfZGVsKHJ0ZCwgb3JpZ2luLCBvcmlnaW5zeik7CisJCisJaWYgKGNhbmRpZGF0ZXMpCisJCSpjYW5kaWRhdGVzID0gJnJ0ZC0+Y2FuZGlkYXRlczsKKwkKKwlpZiAoc2VuZGluZ2F0dGVtdHBzKQorCQkqc2VuZGluZ2F0dGVtdHBzID0gcnRkLT5leHRyYWN0ZWQ7CisJCisJLyogRG9uZSEgKi8KKwlyZXR1cm4gMDsKK30KKworLyogT25seSByZXRyaWV2ZSB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoaXMgbWVzc2FnZSBoYXMgYmVlbiBwcm9jZXNzZWQgYnkgdGhlIHJvdXRpbmctb3V0IG1lY2hhbmlzbSAoaS5lLiBudW1iZXIgb2YgdGltZXMgaXQgd2FzIGZhaWxlZCBvdmVyKSAqLworaW50ICBmZF9ydGRfZ2V0X25iX2F0dGVtcHRzKHN0cnVjdCBydF9kYXRhICogcnRkLCBpbnQgKiBzZW5kaW5nYXR0ZW10cHMpCit7CisJVFJBQ0VfRU5UUlkoIiVwICVwIiwgcnRkLCBzZW5kaW5nYXR0ZW10cHMpOworCUNIRUNLX1BBUkFNUyggcnRkICYmIHNlbmRpbmdhdHRlbXRwcyApOworCQorCSpzZW5kaW5nYXR0ZW10cHMgPSBydGQtPmV4dHJhY3RlZDsKKwkKKwkvKiBEb25lISAqLworCXJldHVybiAwOworfQorCisvKiBFeHRyYWN0IHRoZSBsaXN0IG9mIHZhbGlkIGNhbmRpZGF0ZXMsIGFuZCBpbml0aWFsaXplIHRoZWlyIHNjb3JlcyAqLwordm9pZCBmZF9ydGRfY2FuZGlkYXRlX2V4dHJhY3Qoc3RydWN0IHJ0X2RhdGEgKiBydGQsIHN0cnVjdCBmZF9saXN0ICoqIGNhbmRpZGF0ZXMsIGludCBpbmlfc2NvcmUpCit7CisJc3RydWN0IGZkX2xpc3QgKiBsaTsKKwkKKwlUUkFDRV9FTlRSWSgiJXAgJXAiLCBydGQsIGNhbmRpZGF0ZXMpOworCUNIRUNLX1BBUkFNU19ETyggY2FuZGlkYXRlcywgcmV0dXJuICk7CisJQ0hFQ0tfUEFSQU1TX0RPKCBydGQsIHsgKmNhbmRpZGF0ZXMgPSBOVUxMOyByZXR1cm47IH0gKTsKKwkKKwkqY2FuZGlkYXRlcyA9ICZydGQtPmNhbmRpZGF0ZXM7CisJCisJLyogUmVzZXQgYWxsIHNjb3JlcyB0byBJTklUSUFMIHNjb3JlICovCisJZm9yIChsaSA9IHJ0ZC0+Y2FuZGlkYXRlcy5uZXh0OyBsaSAhPSAmcnRkLT5jYW5kaWRhdGVzOyBsaSA9IGxpLT5uZXh0KSB7CisJCXN0cnVjdCBydGRfY2FuZGlkYXRlICogYyA9IChzdHJ1Y3QgcnRkX2NhbmRpZGF0ZSAqKSBsaTsKKwkJYy0+c2NvcmUgPSBpbmlfc2NvcmU7CisJfQorCQorCXJ0ZC0+ZXh0cmFjdGVkICs9IDE7CisJcmV0dXJuOworfQorCisvKiBSZW9yZGVyIHRoZSBsaXN0IG9mIHBlZXJzLiBJZiBzZXZlcmFsIHBlZXIgaGF2ZSB0aGUgc2FtZSBoaWdoZXN0IHNjb3JlLCB0aGV5IGFyZSByYW5kb21pemVkLiAqLworaW50ICBmZF9ydGRfY2FuZGlkYXRlX3Jlb3JkZXIoc3RydWN0IGZkX2xpc3QgKiBjYW5kaWRhdGVzKQoreworCXN0cnVjdCBmZF9saXN0IHVub3JkZXJlZCA9IEZEX0xJU1RfSU5JVElBTElaRVIodW5vcmRlcmVkKSwgKmxpOworCXN0cnVjdCBmZF9saXN0IGhpZ2hlc3QgPSBGRF9MSVNUX0lOSVRJQUxJWkVSKGhpZ2hlc3QpOworCWludCBocyA9IC0xOworCQorCVRSQUNFX0VOVFJZKCIlcCIsIGNhbmRpZGF0ZXMpOworCUNIRUNLX1BBUkFNUyggY2FuZGlkYXRlcyApOworCQorCS8qIEZpcnN0LCBtb3ZlIGFsbCBpdGVtcyBmcm9tIGNhbmRpZGF0ZXMgdG8gdGhlIHVuZG9yZGVyZWQgbGlzdCAqLworCWZkX2xpc3RfbW92ZV9lbmQoJnVub3JkZXJlZCwgY2FuZGlkYXRlcyk7CisJCisJLyogTm93IGV4dHJhY3QgZWFjaCBlbGVtZW50IGZyb20gdW5vcmRlcmVkIGFuZCBhZGQgaXQgYmFjayB0byBsaXN0IG9yZGVyZWQgYnkgc2NvcmUgKi8KKwl3aGlsZSAoIUZEX0lTX0xJU1RfRU1QVFkoJnVub3JkZXJlZCkpIHsKKwkJc3RydWN0IHJ0ZF9jYW5kaWRhdGUgKiBjID0gKHN0cnVjdCBydGRfY2FuZGlkYXRlICopIHVub3JkZXJlZC5uZXh0OworCQkKKwkJZmRfbGlzdF91bmxpbmsoJmMtPmNoYWluKTsKKwkJCisJCS8qIElmIHRoaXMgY2FuZGlkYXRlIGhhcyBhIGhpZ2hlciBzY29yZSB0aGFuIHRoZSBwcmV2aW91cyBvbmVzICovCisJCWlmIChjLT5zY29yZSA+IGhzKSB7CisJCQkvKiBUaGVuIHdlIG1vdmUgdGhlIHByZXZpb3VzIGhpZ2ggc2NvcmUgaXRlbXMgYXQgZW5kIG9mIHRoZSBsaXN0ICovCisJCQlmZF9saXN0X21vdmVfZW5kKGNhbmRpZGF0ZXMsICZoaWdoZXN0KTsKKwkJCQorCQkJLyogQW5kIHRoZSBuZXcgaGlnaCBzY29yZSBpcyBzZXQgKi8KKwkJCWhzID0gYy0+c2NvcmU7CisJCX0KKwkJCisJCS8qIElmIHRoaXMgY2FuZGlkYXRlIGVxdWFscyB0aGUgaGlnaGVyIHNjb3JlLCBhZGQgaXQgaW50byBoaWdoZXN0IGxpc3QgYXQgYSByYW5kb20gcGxhY2UgKi8KKwkJaWYgKGMtPnNjb3JlID09IGhzKSB7CisJCQlpZiAocmFuZCgpICYgMSkgeworCQkJCWZkX2xpc3RfaW5zZXJ0X2FmdGVyKCZoaWdoZXN0LCAmYy0+Y2hhaW4pOworCQkJfSBlbHNlIHsKKwkJCQlmZF9saXN0X2luc2VydF9iZWZvcmUoJmhpZ2hlc3QsICZjLT5jaGFpbik7CisJCQl9CisJCS8qIE90aGVyd2lzZSwgaW5zZXJ0IGF0IG5vcm1hbCBwbGFjZSBpbiB0aGUgbGlzdCAqLworCQl9IGVsc2UgeworCQkJLyogRmluZCB0aGUgcG9zaXRpb24gaW4gb3JkZXJlZCBjYW5kaWRhdGVzIGxpc3QgKi8KKwkJCWZvciAobGkgPSBjYW5kaWRhdGVzLT5uZXh0OyBsaSAhPSBjYW5kaWRhdGVzOyBsaSA9IGxpLT5uZXh0KSB7CisJCQkJc3RydWN0IHJ0ZF9jYW5kaWRhdGUgKiBjbmV4dCA9IChzdHJ1Y3QgcnRkX2NhbmRpZGF0ZSAqKSBsaTsKKwkJCQlpZiAoY25leHQtPnNjb3JlID49IGMtPnNjb3JlKQorCQkJCQlicmVhazsKKwkJCX0KKworCQkJLyogQWRkIHRoZSBlbGVtZW50IHRoZXJlICovCisJCQlmZF9saXN0X2luc2VydF9iZWZvcmUobGksICZjLT5jaGFpbik7CisJCX0KKwl9CisJCisJLyogTm93IHNpbXBseSBtb3ZlIGJhY2sgYWxsIHRoZSAiaGlnaGVzdCIgY2FuZGlkYXRlcyBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0ICovCisJZmRfbGlzdF9tb3ZlX2VuZChjYW5kaWRhdGVzLCAmaGlnaGVzdCk7CisJCisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2xpYmZkcHJvdG8vc2Vzc2lvbnMuYyBiL2xpYmZkcHJvdG8vc2Vzc2lvbnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmM5NGZhCi0tLSAvZGV2L251bGwKKysrIGIvbGliZmRwcm90by9zZXNzaW9ucy5jCkBAIC0wLDAgKzEsOTQwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxMywgV0lERSBQcm9qZWN0IGFuZCBOSUNUCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBXSURFIFByb2plY3Qgb3IgTklDVCBub3IgdGhlIAkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFdJREUgUHJvamVjdCBhbmQgCQkJCQkJICoKKyogICBOSUNULgkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFNlc3Npb25zIG1vZHVsZS4KKyAqIAorICogQmFzaWMgZnVuY3Rpb25hbGl0aWVzIHRvIGhlbHAgaW1wbGVtZW50aW5nIFVzZXIgc2Vzc2lvbnMgc3RhdGUgbWFjaGluZXMgZnJvbSBSRkMzNTg4LgorICovCisKKyNpbmNsdWRlICJmZHByb3RvLWludGVybmFsLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiBQYXJhbWV0ZXJzICoqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFNpemUgb2YgdGhlIGhhc2ggdGFibGUgY29udGFpbmluZyB0aGUgc2Vzc2lvbiBvYmplY3RzIChwb3cgb2YgMi4gZXg6IDYgPT4gMl42ID0gNjQpLiBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMzEuICovCisjaWZuZGVmIFNFU1NfSEFTSF9TSVpFCisjZGVmaW5lIFNFU1NfSEFTSF9TSVpFCTYKKyNlbmRpZiAvKiBTRVNTX0hBU0hfU0laRSAqLworCisvKiBEZWZhdWx0IGxpZmV0aW1lIG9mIGEgc2Vzc2lvbiwgaW4gc2Vjb25kcy4gKDMxIGRheXMgPSAyNjc4NDAwIHNlY29uZHMpICovCisjaWZuZGVmIFNFU1NfREVGQVVMVF9MSUZFVElNRQorI2RlZmluZSBTRVNTX0RFRkFVTFRfTElGRVRJTUUJMjY3ODQwMAorI2VuZGlmIC8qIFNFU1NfREVGQVVMVF9MSUZFVElNRSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiAvUGFyYW1ldGVycyAqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBFeWVzY2F0Y2hlcnMgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgU0hfRVlFQyAweDUzNTU0QUQxCisjZGVmaW5lIFNEX0VZRUMgMHg1MzU1RDQ3NAorI2RlZmluZSBTSV9FWUVDIDB4NTM1NTFECisKKy8qIE1hY3JvIHRvIGNoZWNrIGFuIG9iamVjdCBpcyB2YWxpZCAqLworI2RlZmluZSBWQUxJREFURV9TSCggX29iaiApICggKChfb2JqKSAhPSBOVUxMKSAmJiAoICgoc3RydWN0IHNlc3Npb25faGFuZGxlciAqKShfb2JqKSktPmV5ZWMgPT0gU0hfRVlFQykgKQorI2RlZmluZSBWQUxJREFURV9TSSggX29iaiApICggKChfb2JqKSAhPSBOVUxMKSAmJiAoICgoc3RydWN0IHNlc3Npb24gICAgICAgICAqKShfb2JqKSktPmV5ZWMgPT0gU0lfRVlFQykgKQorCisKKy8qIEhhbmRsZXJzIHJlZ2lzdGVyZWQgYnkgdXNlcnMgb2YgdGhlIHNlc3Npb24gbW9kdWxlICovCitzdHJ1Y3Qgc2Vzc2lvbl9oYW5kbGVyIHsKKwlpbnQJCSAgZXllYzsJLyogQW4gZXllIGNhdGNoZXIgYWxzbyB1c2VkIHRvIGVuc3VyZSB0aGUgb2JqZWN0IGlzIHZhbGlkLCBtdXN0IGJlIFNIX0VZRUMgKi8KKwlpbnQJCSAgaWQ7CS8qIEEgdW5pcXVlIGludGVnZXIgdG8gaWRlbnRpZnkgdGhpcyBoYW5kbGVyICovCisJdm9pZCAJCSgqY2xlYW51cCkoc3RydWN0IHNlc3Nfc3RhdGUgKiwgb3MwX3QsIHZvaWQgKik7IC8qIFRoZSBjbGVhbnVwIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBmb3IgY2xlYW5pbmcgYSBzdGF0ZSAqLworCXNlc3Npb25fc3RhdGVfZHVtcCBzdGF0ZV9kdW1wOyAvKiBkdW1wZXIgZnVuY3Rpb24gKi8KKwl2b2lkICAgICAgICAgICAgICpvcGFxdWU7IC8qIGEgdmFsdWUgdGhhdCBpcyBwYXNzZWQgYXMgaXMgdG8gdGhlIGNsZWFudXAgY2FsbGJhY2sgKi8KK307CisKK3N0YXRpYyBpbnQgCQloZGxfaWQgPSAwOwkJCQkvKiBBIGdsb2JhbCBjb3VudGVyIHRvIGluaXRpYWxpemUgdGhlIGlkIGZpZWxkICovCitzdGF0aWMgcHRocmVhZF9tdXRleF90CWhkbF9sb2NrID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsJLyogbG9jayB0byBwcm90ZWN0IGhkbF9pZDsgd2UgY291bGQgdXNlIGF0b21pYyBvcGVyYXRpb25zIG90aGVyd2lzZSAobGVzcyBwb3J0YWJsZSkgKi8KKworCisvKiBEYXRhIHN0cnVjdHVyZXMgbGlua2VkIGZyb20gdGhlIHNlc3Npb25zLCBjb250YWluaW5nIHRoZSBhcHBsaWNhdGlvbnMgc3RhdGVzICovCitzdHJ1Y3Qgc3RhdGUgeworCWludAkJCSBleWVjOwkvKiBNdXN0IGJlIFNEX0VZRUMgKi8KKwlzdHJ1Y3Qgc2Vzc19zdGF0ZQkqc3RhdGU7CS8qIFRoZSBzdGF0ZSByZWdpc3RlcmVkIGJ5IHRoZSBhcHBsaWNhdGlvbiwgbmV2ZXIgTlVMTCAob3IgdGhlIHdob2xlIG9iamVjdCBpcyBkZWxldGVkKSAqLworCXN0cnVjdCBmZF9saXN0CQkgY2hhaW47CS8qIENoYWluaW5nIGluIHRoZSBsaXN0IG9mIHNlc3Npb24ncyBzdGF0ZXMgb3JkZXJlZCBieSBoZGwtPmlkICovCisJdW5pb24geworCQlzdHJ1Y3Qgc2Vzc2lvbl9oYW5kbGVyCSpoZGw7CS8qIFRoZSBoYW5kbGVyIGZvciB3aGljaCB0aGlzIHN0YXRlIHdhcyByZWdpc3RlcmVkICovCisJCW9zMF90IAkJCSBzaWQ7CS8qIEZvciBkZWxldGVkIHN0YXRlLCB0aGUgc2lkIG9mIHRoZSBzZXNzaW9uIGl0IGJlbG9uZyB0byAqLworCX07Cit9OworCisvKiBTZXNzaW9uIG9iamVjdCwgb25lIGZvciBlYWNoIHZhbHVlIG9mIFNlc3Npb24tSWQgQVZQICovCitzdHJ1Y3Qgc2Vzc2lvbiB7CisJaW50IAkJZXllYzsJLyogRXllY2F0Y2hlciwgU0lfRVlFQyAqLworCQorCW9zMF90CQlzaWQ7CS8qIFRoZSBcMC10ZXJtaW5hdGVkIFNlc3Npb24tSWQgKi8KKwlzaXplX3QJCXNpZGxlbjsgLyogY2FjaGVkIGxlbmd0aCBvZiBzaWQgKi8KKwl1aW50MzJfdAloYXNoOwkvKiBjb21wdXRlZCBoYXNoIG9mIHNpZCAqLworCXN0cnVjdCBmZF9saXN0CWNoYWluX2g7LyogY2hhaW5pbmcgaW4gdGhlIGhhc2ggdGFibGUgb2Ygc2Vzc2lvbnMuICovCisJCisJc3RydWN0IHRpbWVzcGVjCXRpbWVvdXQ7LyogVGltZW91dCBkYXRlIGZvciB0aGUgc2Vzc2lvbiAqLworCXN0cnVjdCBmZF9saXN0CWV4cGlyZTsJLyogTGlzdCBvZiBleHBpcmluZyBzZXNzaW9ucywgb3JkZXJlZCBieSB0aW1lb3V0cy4gKi8KKwkKKwlwdGhyZWFkX211dGV4X3Qgc3Rsb2NrOwkvKiBBIGxvY2sgdG8gcHJvdGVjdCB0aGUgbGlzdCBvZiBzdGF0ZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2Vzc2lvbiAqLworCXN0cnVjdCBmZF9saXN0CXN0YXRlczsJLyogU2VudGluZWwgZm9yIHRoZSBsaXN0IG9mIHN0YXRlcyBvZiB0aGlzIHNlc3Npb24uICovCisJaW50CQltc2dfY250Oy8qIFJlZmVyZW5jZSBjb3VudGVyIGZvciB0aGUgbWVzc2FnZXMgcG9pbnRpbmcgdG8gdGhpcyBzZXNzaW9uICovCisJaW50CQlpc19kZXN0cm95ZWQ7IC8qIGJvb2xlYW4gdGVsbGluZyBpZiBmZF9zZXNzX2RldHJveSBoYXMgYmVlbiBjYWxsZWQgb24gdGhpcyAqLworfTsKKworLyogU2Vzc2lvbnMgaGFzaCB0YWJsZSwgdG8gYWxsb3cgZmFzdCBzaWQgdG8gc2Vzc2lvbiByZXRyaWV2YWwgKi8KK3N0YXRpYyBzdHJ1Y3QgeworCXN0cnVjdCBmZF9saXN0CXNlbnRpbmVsOwkvKiBzZW50aW5lbCBlbGVtZW50IGZvciB0aGlzIHN1Ymxpc3QuIFRoZSBzdWJsaXN0IGlzIG9yZGVyZWQgYnkgaGFzaCB2YWx1ZSwgdGhlbiBmZF9vc19jbXAoc2lkKS4gKi8KKwlwdGhyZWFkX211dGV4X3QgbG9jazsJCS8qIHRoZSBtdXRleCBmb3IgdGhpcyBzdWJsaXN0IC0tIHdlIG1pZ2h0IHByb2JhYmx5IGNoYW5nZSBpdCB0byByd2xvY2sgZm9yIGEgbGl0dGxlIG9wdGltaXphdGlvbiAqLworfSBzZXNzX2hhc2ggWyAxIDw8IFNFU1NfSEFTSF9TSVpFIF0gOworI2RlZmluZSBIX01BU0soIF9faGFzaCApICgoX19oYXNoKSAmICgoIDEgPDwgU0VTU19IQVNIX1NJWkUgKSAtIDEpKQorI2RlZmluZSBIX0xJU1QoIF9oYXNoICkgKCYoc2Vzc19oYXNoW0hfTUFTSyhfaGFzaCldLnNlbnRpbmVsKSkKKyNkZWZpbmUgSF9MT0NLKCBfaGFzaCApICgmKHNlc3NfaGFzaFtIX01BU0soX2hhc2gpXS5sb2NrICAgICkpCisKK3N0YXRpYyB1aW50MzJfdAkJc2Vzc19jbnQgPSAwOyAvKiBjb3VudHMgYWxsIGFjdGl2ZSBzZXNzaW9uICh0aGF0IGFyZSBpbiB0aGUgZXhwaXJ5IGxpc3QpICovCisKKy8qIFRoZSBmb2xsb3dpbmcgYXJlIHVzZWQgdG8gZ2VuZXJhdGUgc2lkIHZhbHVlcyB0aGF0IGFyZSBldGVybmFseSB1bmlxdWUgKi8KK3N0YXRpYyB1aW50MzJfdCAgIAlzaWRfaDsJLyogaW5pdGlhbGl6ZWQgdG8gdGhlIGN1cnJlbnQgdGltZSBpbiBmZF9zZXNzX2luaXQgKi8KK3N0YXRpYyB1aW50MzJfdCAgIAlzaWRfbDsJLyogaW5jcmVtZW50ZWQgZWFjaCB0aW1lIGEgc2Vzc2lvbiBpZCBpcyBjcmVhdGVkICovCitzdGF0aWMgcHRocmVhZF9tdXRleF90IAlzaWRfbG9jayA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CisKKy8qIEV4cGlyaW5nIHNlc3Npb25zIG1hbmFnZW1lbnQgKi8KK3N0YXRpYyBzdHJ1Y3QgZmRfbGlzdAlleHBfc2VudGluZWwgPSBGRF9MSVNUX0lOSVRJQUxJWkVSKGV4cF9zZW50aW5lbCk7CS8qIGxpc3Qgb2Ygc2Vzc2lvbnMgb3JkZXJlZCBieSB0aGVpciB0aW1lb3V0IGRhdGUgKi8KK3N0YXRpYyBwdGhyZWFkX211dGV4X3QJZXhwX2xvY2sgPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOwkvKiBsb2NrIHByb3RlY3RpbmcgdGhlIGxpc3QuICovCitzdGF0aWMgcHRocmVhZF9jb25kX3QJZXhwX2NvbmQgPSBQVEhSRUFEX0NPTkRfSU5JVElBTElaRVI7CS8qIGNvbmR2YXIgdXNlZCBieSB0aGUgZXhwaXJ5IG1lY2FoaW5zbS4gKi8KK3N0YXRpYyBwdGhyZWFkX3QJZXhwX3RociA9IChwdGhyZWFkX3QpTlVMTDsgCS8qIFRoZSBleHBpcnkgdGhyZWFkIHRoYXQgaGFuZGxlcyBjbGVhbnVwIG9mIGV4cGlyZWQgc2Vzc2lvbnMgKi8KKworLyogSGllcmFyY2h5IG9mIHRoZSBsb2NrcywgdG8gYXZvaWQgZGVhZGxvY2tzOgorICogIGhhc2ggbG9jayA+IHN0YXRlIGxvY2sgPiBleHBpcnkgbG9jaworICogaS5lLiBzdGF0ZSBsb2NrIGNhbiBiZSB0YWtlbiB3aGlsZSBob2xkaW5nIHRoZSBoYXNoIGxvY2ssIGJ1dCBub3Qgd2hpbGUgaG9sZGluZyB0aGUgZXhwaXJ5IGxvY2suCisgKiBBcyB3ZWxsLCB0aGUgaGFzaCBsb2NrIGNhbm5vdCBiZSB0YWtlbiB3aGlsZSBob2xkaW5nIGEgc3RhdGUgbG9jay4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEluaXRpYWxpemUgYSBzZXNzaW9uIG9iamVjdC4gSXQgaXMgbm90IGxpbmtlZCBub3cuIHNpZCBtdXN0IGJlIGFscmVhZHkgbWFsbG9jJ2VkLiBUaGUgaGFzaCBoYXMgYWxyZWFkeSBiZWVuIGNvbXB1dGVkLiAqLworc3RhdGljIHN0cnVjdCBzZXNzaW9uICogbmV3X3Nlc3Npb24ob3MwX3Qgc2lkLCBzaXplX3Qgc2lkbGVuLCB1aW50MzJfdCBoYXNoKQoreworCXN0cnVjdCBzZXNzaW9uICogc2VzczsKKwkKKwlUUkFDRV9FTlRSWSgiJXAgJXpkIiwgc2lkLCBzaWRsZW4pOworCUNIRUNLX1BBUkFNU19ETyggc2lkICYmIHNpZGxlbiwgcmV0dXJuIE5VTEwgKTsKKwkKKwlDSEVDS19NQUxMT0NfRE8oIHNlc3MgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzZXNzaW9uKSksIHJldHVybiBOVUxMICk7CisJbWVtc2V0KHNlc3MsIDAsIHNpemVvZihzdHJ1Y3Qgc2Vzc2lvbikpOworCQorCXNlc3MtPmV5ZWMgPSBTSV9FWUVDOworCQorCXNlc3MtPnNpZCAgPSBzaWQ7CisJc2Vzcy0+c2lkbGVuID0gc2lkbGVuOworCXNlc3MtPmhhc2ggPSBoYXNoOworCWZkX2xpc3RfaW5pdCgmc2Vzcy0+Y2hhaW5faCwgc2Vzcyk7CisJCisJQ0hFQ0tfU1lTX0RPKCBjbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmc2Vzcy0+dGltZW91dCksIHJldHVybiBOVUxMICk7CisJc2Vzcy0+dGltZW91dC50dl9zZWMgKz0gU0VTU19ERUZBVUxUX0xJRkVUSU1FOworCWZkX2xpc3RfaW5pdCgmc2Vzcy0+ZXhwaXJlLCBzZXNzKTsKKwkKKwlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9tdXRleF9pbml0KCZzZXNzLT5zdGxvY2ssIE5VTEwpLCByZXR1cm4gTlVMTCApOworCWZkX2xpc3RfaW5pdCgmc2Vzcy0+c3RhdGVzLCBzZXNzKTsKKwkKKwlyZXR1cm4gc2VzczsKK30KKworLyogZGVzdHJveSB0aGUgc2Vzc2lvbiBvYmplY3QuIEl0IHNob3VsZCByZWFsbHkgYmUgYWxyZWFkeSB1bmxpbmtlZC4uLiAqLworc3RhdGljIHZvaWQgZGVsX3Nlc3Npb24oc3RydWN0IHNlc3Npb24gKiBzKQoreworCUFTU0VSVChGRF9JU19MSVNUX0VNUFRZKCZzLT5zdGF0ZXMpKTsKKwlmcmVlKHMtPnNpZCk7CisJZmRfbGlzdF91bmxpbmsoJnMtPmNoYWluX2gpOworCWZkX2xpc3RfdW5saW5rKCZzLT5leHBpcmUpOworCUNIRUNLX1BPU0lYX0RPKCBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJnMtPnN0bG9jayksIC8qIGNvbnRpbnVlICovICk7CisJZnJlZShzKTsKK30KKwkKKy8qIFRoZSBleHBpcnkgdGhyZWFkICovCitzdGF0aWMgdm9pZCAqIGV4cF9mY3Qodm9pZCAqIGFyZykKK3sKKwlmZF9sb2dfdGhyZWFkbmFtZSAoICJTZXNzaW9uL2V4cGlyZSIgKTsKKwlUUkFDRV9FTlRSWSggIiIgKTsKKwkKKwkKKwlkbyB7CisJCXN0cnVjdCB0aW1lc3BlYwlub3c7CisJCXN0cnVjdCBzZXNzaW9uICogZmlyc3Q7CisJCQorCQlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9tdXRleF9sb2NrKCZleHBfbG9jayksICBicmVhayApOworCQlwdGhyZWFkX2NsZWFudXBfcHVzaCggZmRfY2xlYW51cF9tdXRleCwgJmV4cF9sb2NrICk7CithZ2FpbjoJCQorCQkvKiBDaGVjayBpZiB0aGVyZSBhcmUgZXhwaXJpbmcgc2Vzc2lvbnMgYXZhaWxhYmxlICovCisJCWlmIChGRF9JU19MSVNUX0VNUFRZKCZleHBfc2VudGluZWwpKSB7CisJCQkvKiBKdXN0IHdhaXQgZm9yIGEgY2hhbmdlIG9yIGNhbmNlbGF0aW9uICovCisJCQlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9jb25kX3dhaXQoICZleHBfY29uZCwgJmV4cF9sb2NrICksIGJyZWFrIC8qIHRoaXMgbWlnaHQgbm90IHBvcCB0aGUgY2xlYW51cCBoYW5kbGVyLCBidXQgc2luY2Ugd2UgQVNTRVJUKDApLCBpdCBpcyBub3QgdGhlIGJpZyBpc3N1ZS4uLiAqLyApOworCQkJLyogUmVzdGFydCB0aGUgbG9vcCBvbiB3YWtldXAgKi8KKwkJCWdvdG8gYWdhaW47CisJCX0KKwkJCisJCS8qIEdldCB0aGUgcG9pbnRlciB0byB0aGUgc2Vzc2lvbiB0aGF0IGV4cGlyZXMgZmlyc3QgKi8KKwkJZmlyc3QgPSAoc3RydWN0IHNlc3Npb24gKikoZXhwX3NlbnRpbmVsLm5leHQtPm8pOworCQlBU1NFUlQoIFZBTElEQVRFX1NJKGZpcnN0KSApOworCQkKKwkJLyogR2V0IHRoZSBjdXJyZW50IHRpbWUgKi8KKwkJQ0hFQ0tfU1lTX0RPKCAgY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJm5vdyksICBicmVhayAgKTsKKworCQkvKiBJZiBmaXJzdCBzZXNzaW9uIGlzIG5vdCBleHBpcmVkLCB3ZSBqdXN0IHdhaXQgdW50aWwgaXQgaGFwcGVucyAqLworCQlpZiAoIFRTX0lTX0lORkVSSU9SKCAmbm93LCAmZmlyc3QtPnRpbWVvdXQgKSApIHsKKwkJCQorCQkJQ0hFQ0tfUE9TSVhfRE8yKCAgcHRocmVhZF9jb25kX3RpbWVkd2FpdCggJmV4cF9jb25kLCAmZXhwX2xvY2ssICZmaXJzdC0+dGltZW91dCApLCAgCisJCQkJCUVUSU1FRE9VVCwgLyogRVRJTUVET1VUIGlzIGEgbm9ybWFsIGVycm9yLCBjb250aW51ZSAqLywKKwkJCQkJLyogb24gb3RoZXIgZXJyb3IsICovIGJyZWFrICk7CisJCisJCQkvKiBvbiB3YWtldXAsIGxvb3AgKi8KKwkJCWdvdG8gYWdhaW47CisJCX0KKwkJCisJCS8qIE5vdywgdGhlIGZpcnN0IHNlc3Npb24gaW4gdGhlIGxpc3QgaXMgZXhwaXJlZDsgZGVzdHJveSBpdCAqLworCQlwdGhyZWFkX2NsZWFudXBfcG9wKCAwICk7CisJCUNIRUNLX1BPU0lYX0RPKCBwdGhyZWFkX211dGV4X3VubG9jaygmZXhwX2xvY2spLCAgYnJlYWsgKTsKKwkJCisJCUNIRUNLX0ZDVF9ETyggZmRfc2Vzc19kZXN0cm95KCAmZmlyc3QgKSwgYnJlYWsgKTsKKwkJCisJfSB3aGlsZSAoMSk7CisJCisJVFJBQ0VfREVCVUcoSU5GTywgIkEgc3lzdGVtIGVycm9yIG9jY3VycmVkIGluIHNlc3Npb24gbW9kdWxlISBFeHBpcnkgdGhyZWFkIGlzIHRlcm1pbmF0aW5nLi4uIik7CisJQVNTRVJUKDApOworCXJldHVybiBOVUxMOworfQorCQorCQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEluaXRpYWxpemUgdGhlIHNlc3Npb24gbW9kdWxlICovCitpbnQgZmRfc2Vzc19pbml0KHZvaWQpCit7CisJaW50IGk7CisJCisJVFJBQ0VfRU5UUlkoICIiICk7CisJCisJLyogSW5pdGlhbGl6ZSB0aGUgZ2xvYmFsIGNvdW50ZXJzICovCisJc2lkX2ggPSAodWludDMyX3QpIHRpbWUoTlVMTCk7CisJc2lkX2wgPSAwOworCQorCS8qIEluaXRpYWxpemUgdGhlIGhhc2ggdGFibGUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHNlc3NfaGFzaCkgLyBzaXplb2Yoc2Vzc19oYXNoWzBdKTsgaSsrKSB7CisJCWZkX2xpc3RfaW5pdCggJnNlc3NfaGFzaFtpXS5zZW50aW5lbCwgTlVMTCApOworCQlDSEVDS19QT1NJWCggIHB0aHJlYWRfbXV0ZXhfaW5pdCgmc2Vzc19oYXNoW2ldLmxvY2ssIE5VTEwpICApOworCX0KKwkKKwlyZXR1cm4gMDsKK30KKworLyogUnVuIHRoaXMgd2hlbiBpbml0aWFsaXphdGlvbnMgYXJlIGNvbXBsZXRlLiAqLworaW50IGZkX3Nlc3Nfc3RhcnQodm9pZCkKK3sKKwkvKiBTdGFydCBzZXNzaW9uIGdhcmJhZ2UgY29sbGVjdG9yIChleHBpcnkpICovCisJQ0hFQ0tfUE9TSVgoICBwdGhyZWFkX2NyZWF0ZSgmZXhwX3RociwgTlVMTCwgZXhwX2ZjdCwgTlVMTCkgICk7CisJCisJcmV0dXJuIDA7Cit9CisKKy8qIFRlcm1pbmF0ZSAqLwordm9pZCBmZF9zZXNzX2Zpbmkodm9pZCkKK3sKKwlUUkFDRV9FTlRSWSgiIik7CisJQ0hFQ0tfRkNUX0RPKCBmZF90aHJfdGVybSgmZXhwX3RociksIC8qIGNvbnRpbnVlICovICk7CisJCisJLyogRGVzdHJveSBhbGwgc2Vzc2lvbnMgaW4gdGhlIGhhc2ggdGFibGUsIGFuZCB0aGUgaGFzaCB0YWJsZSBpdHNlbGY/IC0tIEhvdyB0byBkbyBpdCB3aXRob3V0IGEgcmFjZSBjb25kaXRpb24gPyAqLworCQorCXJldHVybjsKK30KKworLyogQ3JlYXRlIGEgbmV3IGhhbmRsZXIgKi8KK2ludCBmZF9zZXNzX2hhbmRsZXJfY3JlYXRlICggc3RydWN0IHNlc3Npb25faGFuZGxlciAqKiBoYW5kbGVyLCB2b2lkICgqY2xlYW51cCkoc3RydWN0IHNlc3Nfc3RhdGUgKiwgb3MwX3QsIHZvaWQgKiksIHNlc3Npb25fc3RhdGVfZHVtcCBkdW1wZXIsIHZvaWQgKiBvcGFxdWUgKQoreworCXN0cnVjdCBzZXNzaW9uX2hhbmRsZXIgKm5ldzsKKwkKKwlUUkFDRV9FTlRSWSgiJXAgJXAiLCBoYW5kbGVyLCBjbGVhbnVwKTsKKwkKKwlDSEVDS19QQVJBTVMoIGhhbmRsZXIgJiYgY2xlYW51cCApOworCQorCUNIRUNLX01BTExPQyggbmV3ID0gbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2Vzc2lvbl9oYW5kbGVyKSkgKTsKKwltZW1zZXQobmV3LCAwLCBzaXplb2Yoc3RydWN0IHNlc3Npb25faGFuZGxlcikpOworCQorCUNIRUNLX1BPU0lYKCBwdGhyZWFkX211dGV4X2xvY2soJmhkbF9sb2NrKSApOworCW5ldy0+aWQgPSArK2hkbF9pZDsKKwlDSEVDS19QT1NJWCggcHRocmVhZF9tdXRleF91bmxvY2soJmhkbF9sb2NrKSApOworCQorCW5ldy0+ZXllYyA9IFNIX0VZRUM7CisJbmV3LT5jbGVhbnVwID0gY2xlYW51cDsKKwluZXctPnN0YXRlX2R1bXAgPSBkdW1wZXI7CisJbmV3LT5vcGFxdWUgPSBvcGFxdWU7CisJCisJKmhhbmRsZXIgPSBuZXc7CisJcmV0dXJuIDA7Cit9CisKKy8qIERlc3Ryb3kgYSBoYW5kbGVyLCBhbmQgYWxsIHN0YXRlcyBhdHRhY2hlZCB0byB0aGlzIGhhbmRsZXIuIFRoaXMgb3BlcmF0aW9uIGlzIHZlcnkgc2xvdyBidXQgd2UgZG9uJ3QgY2FyZSBzaW5jZSBpdCdzIHJhcmVseSB1c2VkLiAKKyAqIE5vdGUgdGhhdCBpdCdzIGJldHRlciB0byBjYWxsIHRoaXMgZnVuY3Rpb24gYWZ0ZXIgYWxsIHNlc3Npb25zIGhhdmUgYmVlbiBkZWxldGVkLi4uICovCitpbnQgZmRfc2Vzc19oYW5kbGVyX2Rlc3Ryb3kgKCBzdHJ1Y3Qgc2Vzc2lvbl9oYW5kbGVyICoqIGhhbmRsZXIsIHZvaWQgKiogb3BhcXVlICkKK3sKKwlzdHJ1Y3Qgc2Vzc2lvbl9oYW5kbGVyICogZGVsOworCS8qIHBsYWNlIHRvIHNhdmUgdGhlIGxpc3Qgb2Ygc3RhdGVzIHRvIGJlIGNsZWFuZWQgdXAuIFdlIGRvIGl0IGFmdGVyIGZpbmRpbmcgdGhlbSB0byBhdm9pZCBkZWFkbG9ja3MuIHRoZSAibyIgZmllbGQgYmVjb21lcyBhIGNvcHkgb2YgdGhlIHNpZC4gKi8KKwlzdHJ1Y3QgZmRfbGlzdCBkZWxldGVkX3N0YXRlcyA9IEZEX0xJU1RfSU5JVElBTElaRVIoIGRlbGV0ZWRfc3RhdGVzICk7CisJaW50IGk7CisJCisJVFJBQ0VfRU5UUlkoIiVwIiwgaGFuZGxlcik7CisJQ0hFQ0tfUEFSQU1TKCBoYW5kbGVyICYmIFZBTElEQVRFX1NIKCpoYW5kbGVyKSApOworCQorCWRlbCA9ICpoYW5kbGVyOworCSpoYW5kbGVyID0gTlVMTDsKKwkKKwlkZWwtPmV5ZWMgPSAweGRlYWQ7IC8qIFRoZSBoYW5kbGVyIGlzIG5vdCB2YWxpZCBhbnltb3JlIGZvciBhbnkgb3RoZXIgb3BlcmF0aW9uICovCisJCisJLyogTm93IGZpbmQgYWxsIHNlc3Npb25zIHdpdGggZGF0YSByZWdpc3RlcmVkIGZvciB0aGlzIGhhbmRsZXIsIGFuZCBtb3ZlIHRoaXMgZGF0YSB0byB0aGUgZGVsZXRlZF9zdGF0ZXMgbGlzdC4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHNlc3NfaGFzaCkgLyBzaXplb2Yoc2Vzc19oYXNoWzBdKTsgaSsrKSB7CisJCXN0cnVjdCBmZF9saXN0ICogbGlfc2k7CisJCUNIRUNLX1BPU0lYKCAgcHRocmVhZF9tdXRleF9sb2NrKCZzZXNzX2hhc2hbaV0ubG9jaykgICk7CisJCQorCQlmb3IgKGxpX3NpID0gc2Vzc19oYXNoW2ldLnNlbnRpbmVsLm5leHQ7IGxpX3NpICE9ICZzZXNzX2hhc2hbaV0uc2VudGluZWw7IGxpX3NpID0gbGlfc2ktPm5leHQpIHsgLyogZm9yIGVhY2ggc2Vzc2lvbiBpbiB0aGUgaGFzaCBsaW5lICovCisJCQlzdHJ1Y3QgZmRfbGlzdCAqIGxpX3N0OworCQkJc3RydWN0IHNlc3Npb24gKiBzZXNzID0gKHN0cnVjdCBzZXNzaW9uICopKGxpX3NpLT5vKTsKKwkJCUNIRUNLX1BPU0lYKCAgcHRocmVhZF9tdXRleF9sb2NrKCZzZXNzLT5zdGxvY2spICApOworCQkJZm9yIChsaV9zdCA9IHNlc3MtPnN0YXRlcy5uZXh0OyBsaV9zdCAhPSAmc2Vzcy0+c3RhdGVzOyBsaV9zdCA9IGxpX3N0LT5uZXh0KSB7IC8qIGZvciBlYWNoIHN0YXRlIGluIHRoaXMgc2Vzc2lvbiAqLworCQkJCXN0cnVjdCBzdGF0ZSAqIHN0ID0gKHN0cnVjdCBzdGF0ZSAqKShsaV9zdC0+byk7CisJCQkJLyogVGhlIGxpc3QgaXMgb3JkZXJlZCAqLworCQkJCWlmIChzdC0+aGRsLT5pZCA8IGRlbC0+aWQpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmIChzdC0+aGRsLT5pZCA9PSBkZWwtPmlkKSB7CisJCQkJCS8qIFRoaXMgc3RhdGUgYmVsb25ncyB0byB0aGUgaGFuZGxlciB3ZSBhcmUgZGVsZXRpbmcsIG1vdmUgdGhlIGl0ZW0gdG8gdGhlIGRlbGV0ZWRfc3RhdGVzIGxpc3QgKi8KKwkJCQkJZmRfbGlzdF91bmxpbmsoJnN0LT5jaGFpbik7CisJCQkJCXN0LT5zaWQgPSBzZXNzLT5zaWQ7CisJCQkJCWZkX2xpc3RfaW5zZXJ0X2JlZm9yZSgmZGVsZXRlZF9zdGF0ZXMsICZzdC0+Y2hhaW4pOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJCUNIRUNLX1BPU0lYKCAgcHRocmVhZF9tdXRleF91bmxvY2soJnNlc3MtPnN0bG9jaykgICk7CisJCX0KKwkJQ0hFQ0tfUE9TSVgoICBwdGhyZWFkX211dGV4X3VubG9jaygmc2Vzc19oYXNoW2ldLmxvY2spICApOworCX0KKwkKKwkvKiBOb3csIGRlbGV0ZSBhbGwgc3RhdGVzIGFmdGVyIGNhbGxpbmcgdGhlaXIgY2xlYW51cCBoYW5kbGVyICovCisJd2hpbGUgKCFGRF9JU19MSVNUX0VNUFRZKCZkZWxldGVkX3N0YXRlcykpIHsKKwkJc3RydWN0IHN0YXRlICogc3QgPSAoc3RydWN0IHN0YXRlICopKGRlbGV0ZWRfc3RhdGVzLm5leHQtPm8pOworCQlUUkFDRV9ERUJVRyhGVUxMLCAiQ2FsbGluZyBjbGVhbnVwIGhhbmRsZXIgZm9yIHNlc3Npb24gJyVzJyBhbmQgZGF0YSAlcCIsIHN0LT5zaWQsIHN0LT5zdGF0ZSk7CisJCSgqZGVsLT5jbGVhbnVwKShzdC0+c3RhdGUsIHN0LT5zaWQsIGRlbC0+b3BhcXVlKTsKKwkJZmRfbGlzdF91bmxpbmsoJnN0LT5jaGFpbik7CisJCWZyZWUoc3QpOworCX0KKwkKKwlpZiAob3BhcXVlKQorCQkqb3BhcXVlID0gZGVsLT5vcGFxdWU7CisJCisJLyogRnJlZSB0aGUgaGFuZGxlciAqLworCWZyZWUoZGVsKTsKKwkKKwlyZXR1cm4gMDsKK30KKworCisKKy8qIENyZWF0ZSBhIG5ldyBzZXNzaW9uIG9iamVjdCB3aXRoIHRoZSBkZWZhdWx0IHRpbWVvdXQgdmFsdWUsIGFuZCBsaW5rIGl0LiBUaGUgcmVmY291bnQgaXMgaW5jcmVhc2VkIGJ5IDEsIHdoZXRoZXIgdGhlIHNlc3Npb24gZXhpc3RlZCBvciBub3QgKi8KK2ludCBmZF9zZXNzX25ldyAoIHN0cnVjdCBzZXNzaW9uICoqIHNlc3Npb24sIERpYW1JZF90IGRpYW1pZCwgc2l6ZV90IGRpYW1pZGxlbiwgdWludDhfdCAqIG9wdCwgc2l6ZV90IG9wdGxlbiApCit7CisJb3MwX3QgIHNpZCA9IE5VTEw7CisJc2l6ZV90IHNpZGxlbjsKKwl1aW50MzJfdCBoYXNoOworCXN0cnVjdCBzZXNzaW9uICogc2VzczsKKwlzdHJ1Y3QgZmRfbGlzdCAqIGxpOworCWludCBmb3VuZCA9IDA7CisJaW50IHJldCA9IDA7CisJCisJVFJBQ0VfRU5UUlkoIiVwICVwICV6ZCAlcCAlemQiLCBzZXNzaW9uLCBkaWFtaWQsIGRpYW1pZGxlbiwgb3B0LCBvcHRsZW4pOworCUNIRUNLX1BBUkFNUyggc2Vzc2lvbiAmJiAoZGlhbWlkIHx8IG9wdCkgKTsKKworCWlmIChkaWFtaWQpIHsJCisJCWlmICghZGlhbWlkbGVuKSB7CisJCQlkaWFtaWRsZW4gPSBzdHJsZW4oZGlhbWlkKTsKKwkJfSAKKwkJLyogV2UgY2hlY2sgaWYgdGhlIHN0cmluZyBpcyBhIHZhbGlkIERpYW1ldGVySWRlbnRpdHkgKi8KKwkJQ0hFQ0tfUEFSQU1TKCBmZF9vc19pc192YWxpZF9EaWFtZXRlcklkZW50aXR5KCh1aW50OF90ICopZGlhbWlkLCBkaWFtaWRsZW4pICk7CisJfSBlbHNlIHsKKwkJZGlhbWlkbGVuID0gMDsKKwl9CisJaWYgKG9wdCkgewkKKwkJaWYgKCFvcHRsZW4pIHsKKwkJCW9wdGxlbiA9IHN0cmxlbigoY2hhciAqKW9wdCk7CisJCX0gZWxzZSB7CisJCQlDSEVDS19QQVJBTVMoIGZkX29zX2lzX3ZhbGlkX29zMChvcHQsIG9wdGxlbikgKTsKKwkJfQorCX0gZWxzZSB7CisJCW9wdGxlbiA9IDA7CisJfQorCQkKKwkvKiBPaywgZmlyc3QgY3JlYXRlIHRoZSBpZGVudGlmaWVyIGZvciB0aGUgc3RyaW5nICovCisJaWYgKGRpYW1pZCA9PSBOVUxMKSB7CisJCS8qIG9wdCBpcyB0aGUgZnVsbCBzdHJpbmcgKi8KKwkJQ0hFQ0tfTUFMTE9DKCBzaWQgPSBvczBkdXAob3B0LCBvcHRsZW4pICk7CisJCXNpZGxlbiA9IG9wdGxlbjsKKwl9IGVsc2UgeworCQl1aW50MzJfdCBzaWRfaF9jcHk7CisJCXVpbnQzMl90IHNpZF9sX2NweTsKKwkJLyogIjxkaWFtSWQ+OzxoaWdoMzI+Ozxsb3czMj5bO29wdF0iICovCisJCXNpZGxlbiA9IGRpYW1pZGxlbjsKKwkJc2lkbGVuICs9IDIyOyAvKiBtYXggc2l6ZSBvZiAnOzxoaWdoMzI+Ozxsb3czMj4nICovCisJCWlmIChvcHQpCisJCQlzaWRsZW4gKz0gMSArIG9wdGxlbjsgLyogJztvcHQnICovCisJCXNpZGxlbisrOyAvKiBzcGFjZSBmb3IgdGhlIGZpbmFsIFwwIGFsc28gKi8KKwkJQ0hFQ0tfTUFMTE9DKCBzaWQgPSBtYWxsb2Moc2lkbGVuKSApOworCQkKKwkJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfbXV0ZXhfbG9jaygmc2lkX2xvY2spICk7CisJCWlmICggKytzaWRfbCA9PSAwICkgLyogb3ZlcmZsb3cgKi8KKwkJCSsrc2lkX2g7CisJCXNpZF9oX2NweSA9IHNpZF9oOworCQlzaWRfbF9jcHkgPSBzaWRfbDsKKwkJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZzaWRfbG9jaykgKTsKKwkJCisJCWlmIChvcHQpIHsKKwkJCXNpZGxlbiA9IHNucHJpbnRmKChjaGFyKilzaWQsIHNpZGxlbiwgIiUuKnM7JXU7JXU7JS4qcyIsIChpbnQpZGlhbWlkbGVuLCBkaWFtaWQsIHNpZF9oX2NweSwgc2lkX2xfY3B5LCAoaW50KW9wdGxlbiwgb3B0KTsKKwkJfSBlbHNlIHsKKwkJCXNpZGxlbiA9IHNucHJpbnRmKChjaGFyKilzaWQsIHNpZGxlbiwgIiUuKnM7JXU7JXUiLCAoaW50KWRpYW1pZGxlbiwgZGlhbWlkLCBzaWRfaF9jcHksIHNpZF9sX2NweSk7CisJCX0KKwl9CisJCisJaGFzaCA9IGZkX29zX2hhc2goc2lkLCBzaWRsZW4pOworCQorCS8qIE5vdyBmaW5kIHRoZSBwbGFjZSB0byBhZGQgdGhpcyBvYmplY3QgaW4gdGhlIGhhc2ggdGFibGUuICovCisJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfbXV0ZXhfbG9jayggSF9MT0NLKGhhc2gpICkgKTsKKwlwdGhyZWFkX2NsZWFudXBfcHVzaCggZmRfY2xlYW51cF9tdXRleCwgSF9MT0NLKGhhc2gpICk7CisJCisJZm9yIChsaSA9IEhfTElTVChoYXNoKS0+bmV4dDsgbGkgIT0gSF9MSVNUKGhhc2gpOyBsaSA9IGxpLT5uZXh0KSB7CisJCWludCBjbXA7CisJCXN0cnVjdCBzZXNzaW9uICogcyA9IChzdHJ1Y3Qgc2Vzc2lvbiAqKShsaS0+byk7CisJCQorCQkvKiBUaGUgbGlzdCBpcyBvcmRlcmVkIGJ5IGhhc2ggYW5kIHNpZCAoaW4gY2FzZSBvZiBjb2xsaXNpb25zKSAqLworCQlpZiAocy0+aGFzaCA8IGhhc2gpCisJCQljb250aW51ZTsKKwkJaWYgKHMtPmhhc2ggPiBoYXNoKQorCQkJYnJlYWs7CisJCQorCQljbXAgPSBmZF9vc19jbXAocy0+c2lkLCBzLT5zaWRsZW4sIHNpZCwgc2lkbGVuKTsKKwkJaWYgKGNtcCA8IDApCisJCQljb250aW51ZTsKKwkJaWYgKGNtcCA+IDApCisJCQlicmVhazsKKwkJCisJCS8qIEEgc2Vzc2lvbiB3aXRoIHRoZSBzYW1lIHNpZCB3YXMgYWxyZWFkeSBpbiB0aGUgaGFzaCB0YWJsZSAqLworCQlmb3VuZCA9IDE7CisJCSpzZXNzaW9uID0gczsKKwkJYnJlYWs7CisJfQorCQorCS8qIElmIHRoZSBzZXNzaW9uIGRpZCBub3QgZXhpc3QsIHdlIGNhbiBjcmVhdGUgaXQgJiBsaW5rIGl0IGluIGdsb2JhbCB0YWJsZXMgKi8KKwlpZiAoIWZvdW5kKSB7CisJCUNIRUNLX01BTExPQ19ETyhzZXNzID0gbmV3X3Nlc3Npb24oc2lkLCBzaWRsZW4sIGhhc2gpLAorCQkJeworCQkJCXJldCA9IEVOT01FTTsKKwkJCQlmcmVlKHNpZCk7CisJCQkJZ290byBvdXQ7CisJCQl9ICk7CisJCisJCWZkX2xpc3RfaW5zZXJ0X2JlZm9yZShsaSwgJnNlc3MtPmNoYWluX2gpOyAvKiBoYXNoIHRhYmxlICovCisJCXNlc3MtPm1zZ19jbnQrKzsKKwl9IGVsc2UgeworCQlmcmVlKHNpZCk7CisJCQorCQlDSEVDS19QT1NJWCggcHRocmVhZF9tdXRleF9sb2NrKCYoKnNlc3Npb24pLT5zdGxvY2spICk7IAorCQkoKnNlc3Npb24pLT5tc2dfY250Kys7CisJCUNIRUNLX1BPU0lYKCBwdGhyZWFkX211dGV4X3VubG9jaygmKCpzZXNzaW9uKS0+c3Rsb2NrKSApOyAKKwkJCisJCS8qIGl0IHdhcyBmb3VuZDogd2FzIGl0IHByZXZpb3VzbHkgZGVzdHJveWVkPyAqLworCQlpZiAoKCpzZXNzaW9uKS0+aXNfZGVzdHJveWVkID09IDApIHsKKwkJCXJldCA9IEVBTFJFQURZOworCQkJZ290byBvdXQ7CisJCX0gZWxzZSB7CisJCQkvKiB0aGUgc2Vzc2lvbiB3YXMgbWFya2VkIGRlc3Ryb3llZCwgbGV0J3MgcmUtYWN0aXZhdGUgaXQuICovCisJCQlzZXNzID0gKnNlc3Npb247CisJCQlzZXNzLT5pc19kZXN0cm95ZWQgPSAwOworCQkJCisJCQkvKiB1cGRhdGUgdGhlIGV4cGlyeSB0aW1lICovCisJCQlDSEVDS19TWVNfRE8oIGNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZzZXNzLT50aW1lb3V0KSwgeyBBU1NFUlQoMCk7IH0gKTsKKwkJCXNlc3MtPnRpbWVvdXQudHZfc2VjICs9IFNFU1NfREVGQVVMVF9MSUZFVElNRTsKKwkJfQorCX0KKwkJCisJLyogV2UgbXVzdCBpbnNlcnQgaW4gdGhlIGV4cGlyeSBsaXN0ICovCisJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfbXV0ZXhfbG9jayggJmV4cF9sb2NrICkgKTsKKwlwdGhyZWFkX2NsZWFudXBfcHVzaCggZmRfY2xlYW51cF9tdXRleCwgJmV4cF9sb2NrICk7CisKKwkvKiBGaW5kIHRoZSBwb3NpdGlvbiBpbiB0aGF0IGxpc3QuIFdlIHRha2UgaXQgaW4gcmV2ZXJzZSBvcmRlciAqLworCWZvciAobGkgPSBleHBfc2VudGluZWwucHJldjsgbGkgIT0gJmV4cF9zZW50aW5lbDsgbGkgPSBsaS0+cHJldikgeworCQlzdHJ1Y3Qgc2Vzc2lvbiAqIHMgPSAoc3RydWN0IHNlc3Npb24gKikobGktPm8pOworCQlpZiAoVFNfSVNfSU5GRVJJT1IoICZzLT50aW1lb3V0LCAmc2Vzcy0+dGltZW91dCApICkKKwkJCWJyZWFrOworCX0KKwlmZF9saXN0X2luc2VydF9hZnRlciggbGksICZzZXNzLT5leHBpcmUgKTsKKwlzZXNzX2NudCsrOworCisJLyogV2UgYWRkZWQgYSBuZXcgZXhwaXJpbmcgZWxlbWVudCwgd2UgbXVzdCBzaWduYWwgKi8KKwlpZiAobGkgPT0gJmV4cF9zZW50aW5lbCkgeworCQlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9jb25kX3NpZ25hbCgmZXhwX2NvbmQpLCB7IEFTU0VSVCgwKTsgfSApOyAvKiBpZiBpdCBmYWlscywgd2UgbWlnaHQgbm90IHBvcCB0aGUgY2xlYW51cCBoYW5kbGVycywgYnV0IHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gLS0gYW5kIHdlJ2QgaGF2ZSBhIHNlcmlvdXMgcHJvYmxlbSBvdGhlcndpc2UgKi8KKwl9CisKKwkvKiBXZSdyZSBkb25lIHdpdGggdGhlIGxvY2tlZCBwYXJ0ICovCisJcHRocmVhZF9jbGVhbnVwX3BvcCgwKTsKKwlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9tdXRleF91bmxvY2soICZleHBfbG9jayApLCB7IEFTU0VSVCgwKTsgfSApOyAvKiBpZiBpdCBmYWlscywgd2UgbWlnaHQgbm90IHBvcCB0aGUgY2xlYW51cCBoYW5kbGVyLCBidXQgdGhpcyBzaG91bGQgbm90IGhhcHBlbiAtLSBhbmQgd2UnZCBoYXZlIGEgc2VyaW91cyBwcm9ibGVtIG90aGVyd2lzZSAqLworCitvdXQ6CisJOworCXB0aHJlYWRfY2xlYW51cF9wb3AoMCk7CisJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCBIX0xPQ0soaGFzaCkgKSApOworCQorCWlmIChyZXQpIC8qIGluIGNhc2Ugb2YgZXJyb3IgKi8KKwkJcmV0dXJuIHJldDsKKwkKKwkqc2Vzc2lvbiA9IHNlc3M7CisJcmV0dXJuIDA7Cit9CisKKy8qIEZpbmQgb3IgY3JlYXRlIGEgc2Vzc2lvbiAtLSB0aGUgbXNnIHJlZmNvdW50IGlzIGluY3JlYXNlZCAqLworaW50IGZkX3Nlc3NfZnJvbXNpZF9tc2cgKCB1aW50OF90ICogc2lkLCBzaXplX3QgbGVuLCBzdHJ1Y3Qgc2Vzc2lvbiAqKiBzZXNzaW9uLCBpbnQgKiBuZXcpCit7CisJaW50IHJldDsKKwkKKwlUUkFDRV9FTlRSWSgiJXAgJXpkICVwICVwIiwgc2lkLCBsZW4sIHNlc3Npb24sIG5ldyk7CisJQ0hFQ0tfUEFSQU1TKCBzaWQgJiYgc2Vzc2lvbiApOworCQorCWlmICghZmRfb3NfaXNfdmFsaWRfb3MwKHNpZCxsZW4pKSB7CisJCVRSQUNFX0RFQlVHKElORk8sICJXYXJuaW5nOiBhIFNlc3Npb24tSWQgdmFsdWUgY29udGFpbnMgXFwwIGNoYXJzLi4uIChsZW46JXpkLCBiZWdpbjonJS4qcycpID0+IERlYnVnIG1lc3NhZ2VzIG1heSBiZSB0cnVuY2F0ZWQuIiwgbGVuLCAoaW50KWxlbiwgc2lkKTsKKwl9CisJCisJLyogQWxsIHRoZSB3b3JrIGlzIGRvbmUgaW4gc2Vzc19uZXcgKi8KKwlyZXQgPSBmZF9zZXNzX25ldyAoIHNlc3Npb24sIE5VTEwsIDAsIHNpZCwgbGVuICk7CisJc3dpdGNoIChyZXQpIHsKKwkJY2FzZSAwOgorCQljYXNlIEVBTFJFQURZOgorCQkJYnJlYWs7CisJCQorCQlkZWZhdWx0OgorCQkJQ0hFQ0tfRkNUKHJldCk7CisJfQorCQorCWlmIChuZXcpCisJCSpuZXcgPSByZXQgPyAwIDogMTsKKwkKKwlyZXR1cm4gMDsKK30KKworLyogR2V0IHRoZSBzaWQgb2YgYSBzZXNzaW9uICovCitpbnQgZmRfc2Vzc19nZXRzaWQgKCBzdHJ1Y3Qgc2Vzc2lvbiAqIHNlc3Npb24sIG9zMF90ICogc2lkLCBzaXplX3QgKiBzaWRsZW4gKQoreworCVRSQUNFX0VOVFJZKCIlcCAlcCIsIHNlc3Npb24sIHNpZCk7CisJCisJQ0hFQ0tfUEFSQU1TKCBWQUxJREFURV9TSShzZXNzaW9uKSAmJiBzaWQgKTsKKwkKKwkqc2lkID0gc2Vzc2lvbi0+c2lkOworCWlmIChzaWRsZW4pCisJCSpzaWRsZW4gPSBzZXNzaW9uLT5zaWRsZW47CisJCisJcmV0dXJuIDA7Cit9CisKKy8qIENoYW5nZSB0aGUgdGltZW91dCB2YWx1ZSBvZiBhIHNlc3Npb24gKi8KK2ludCBmZF9zZXNzX3NldHRpbWVvdXQoIHN0cnVjdCBzZXNzaW9uICogc2Vzc2lvbiwgY29uc3Qgc3RydWN0IHRpbWVzcGVjICogdGltZW91dCApCit7CisJc3RydWN0IGZkX2xpc3QgKiBsaTsKKwkKKwlUUkFDRV9FTlRSWSgiJXAgJXAiLCBzZXNzaW9uLCB0aW1lb3V0KTsKKwlDSEVDS19QQVJBTVMoIFZBTElEQVRFX1NJKHNlc3Npb24pICYmIHRpbWVvdXQgKTsKKwkKKwkvKiBMb2NrIC0tIGRvIHdlIG5lZWQgdG8gbG9jayB0aGUgaGFzaCB0YWJsZSBhcyB3ZWxsPyBJIGRvbid0IHRoaW5rIHNvLi4uICovCisJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfbXV0ZXhfbG9jayggJmV4cF9sb2NrICkgKTsKKwlwdGhyZWFkX2NsZWFudXBfcHVzaCggZmRfY2xlYW51cF9tdXRleCwgJmV4cF9sb2NrICk7CisJCisJLyogVXBkYXRlIHRoZSB0aW1lb3V0ICovCisJZmRfbGlzdF91bmxpbmsoJnNlc3Npb24tPmV4cGlyZSk7CisJbWVtY3B5KCZzZXNzaW9uLT50aW1lb3V0LCB0aW1lb3V0LCBzaXplb2Yoc3RydWN0IHRpbWVzcGVjKSk7CisJCisJLyogRmluZCB0aGUgbmV3IHBvc2l0aW9uIGluIGV4cGlyZSBsaXN0LiBXZSB0YWtlIGl0IGluIG5vcm1hbCBvcmRlciAqLworCWZvciAobGkgPSBleHBfc2VudGluZWwubmV4dDsgbGkgIT0gJmV4cF9zZW50aW5lbDsgbGkgPSBsaS0+bmV4dCkgeworCQlzdHJ1Y3Qgc2Vzc2lvbiAqIHMgPSAoc3RydWN0IHNlc3Npb24gKikobGktPm8pOworCisJCWlmIChUU19JU19JTkZFUklPUiggJnMtPnRpbWVvdXQsICZzZXNzaW9uLT50aW1lb3V0ICkgKQorCQkJY29udGludWU7CisKKwkJYnJlYWs7CisJfQorCWZkX2xpc3RfaW5zZXJ0X2JlZm9yZSggbGksICZzZXNzaW9uLT5leHBpcmUgKTsKKworCS8qIFdlIGFkZGVkIGEgbmV3IGV4cGlyaW5nIGVsZW1lbnQsIHdlIG11c3Qgc2lnbmFsIGlmIGl0IHdhcyBpbiBmaXJzdCBwb3NpdGlvbiAqLworCWlmIChzZXNzaW9uLT5leHBpcmUucHJldiA9PSAmZXhwX3NlbnRpbmVsKSB7CisJCUNIRUNLX1BPU0lYX0RPKCBwdGhyZWFkX2NvbmRfc2lnbmFsKCZleHBfY29uZCksIHsgQVNTRVJUKDApOyAvKiBzbyB0aGF0IHdlIGRvbid0IGhhdmUgYSBwZW5kaW5nIGNhbmNlbGxhdGlvbiBoYW5kbGVyICovIH0gKTsKKwl9CisKKwkvKiBXZSdyZSBkb25lICovCisJcHRocmVhZF9jbGVhbnVwX3BvcCgwKTsKKwlDSEVDS19QT1NJWCggcHRocmVhZF9tdXRleF91bmxvY2soICZleHBfbG9jayApICk7CisJCisJcmV0dXJuIDA7Cit9CisKKy8qIERlc3Ryb3kgdGhlIHN0YXRlcyBhc3NvY2lhdGVkIHRvIGEgc2Vzc2lvbiwgYW5kIG1hcmsgaXQgZGVzdHJveWVkLiAqLworaW50IGZkX3Nlc3NfZGVzdHJveSAoIHN0cnVjdCBzZXNzaW9uICoqIHNlc3Npb24gKQoreworCXN0cnVjdCBzZXNzaW9uICogc2VzczsKKwlpbnQgZGVzdHJveV9ub3c7CisJb3MwX3Qgc2lkOworCWludCByZXQgPSAwOworCQorCS8qIHBsYWNlIHRvIHNhdmUgdGhlIGxpc3Qgb2Ygc3RhdGVzIHRvIGJlIGNsZWFuZWQgdXAuIFdlIGRvIGl0IGFmdGVyIGZpbmRpbmcgdGhlbSB0byBhdm9pZCBkZWFkbG9ja3MuIHRoZSAibyIgZmllbGQgYmVjb21lcyBhIGNvcHkgb2YgdGhlIHNpZC4gKi8KKwlzdHJ1Y3QgZmRfbGlzdCBkZWxldGVkX3N0YXRlcyA9IEZEX0xJU1RfSU5JVElBTElaRVIoIGRlbGV0ZWRfc3RhdGVzICk7CisJCisJVFJBQ0VfRU5UUlkoIiVwIiwgc2Vzc2lvbik7CisJQ0hFQ0tfUEFSQU1TKCBzZXNzaW9uICYmIFZBTElEQVRFX1NJKCpzZXNzaW9uKSApOworCQorCXNlc3MgPSAqc2Vzc2lvbjsKKwkqc2Vzc2lvbiA9IE5VTEw7CisJCisJLyogTG9jayB0aGUgaGFzaCBsaW5lICovCisJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfbXV0ZXhfbG9jayggSF9MT0NLKHNlc3MtPmhhc2gpICkgKTsKKwlwdGhyZWFkX2NsZWFudXBfcHVzaCggZmRfY2xlYW51cF9tdXRleCwgSF9MT0NLKHNlc3MtPmhhc2gpICk7CisJCisJLyogVW5saW5rIGZyb20gdGhlIGV4cGlyeSBsaXN0ICovCisJQ0hFQ0tfUE9TSVhfRE8oIHB0aHJlYWRfbXV0ZXhfbG9jayggJmV4cF9sb2NrICksIHsgQVNTRVJUKDApOyAvKiBvdGhlcndpc2UgY2xlYW51cCBoYW5kbGVyIGlzIG5vdCBwb3AnZCAqLyB9ICk7CisJaWYgKCFGRF9JU19MSVNUX0VNUFRZKCZzZXNzLT5leHBpcmUpKSB7CisJCXNlc3NfY250LS07CisJCWZkX2xpc3RfdW5saW5rKCAmc2Vzcy0+ZXhwaXJlICk7IC8qIG5vIG5lZWQgdG8gc2lnbmFsIHRoZSBjb25kaXRpb24gaGVyZSAqLworCX0KKwlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9tdXRleF91bmxvY2soICZleHBfbG9jayApLCB7IEFTU0VSVCgwKTsgLyogb3RoZXJ3aXNlIGNsZWFudXAgaGFuZGxlciBpcyBub3QgcG9wJ2QgKi8gfSApOworCQorCS8qIE5vdyBtb3ZlIGFsbCBzdGF0ZXMgYXNzb2NpYXRlZCB0byB0aGlzIHNlc3Npb24gaW50byBkZWxldGVkX3N0YXRlcyAqLworCUNIRUNLX1BPU0lYX0RPKCBwdGhyZWFkX211dGV4X2xvY2soICZzZXNzLT5zdGxvY2sgKSwgeyBBU1NFUlQoMCk7IC8qIG90aGVyd2lzZSBjbGVhbnVwIGhhbmRsZXIgaXMgbm90IHBvcCdkICovIH0gKTsKKwl3aGlsZSAoIUZEX0lTX0xJU1RfRU1QVFkoJnNlc3MtPnN0YXRlcykpIHsKKwkJc3RydWN0IHN0YXRlICogc3QgPSAoc3RydWN0IHN0YXRlICopKHNlc3MtPnN0YXRlcy5uZXh0LT5vKTsKKwkJZmRfbGlzdF91bmxpbmsoJnN0LT5jaGFpbik7CisJCWZkX2xpc3RfaW5zZXJ0X2JlZm9yZSgmZGVsZXRlZF9zdGF0ZXMsICZzdC0+Y2hhaW4pOworCX0KKwlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9tdXRleF91bmxvY2soICZzZXNzLT5zdGxvY2sgKSwgeyBBU1NFUlQoMCk7IC8qIG90aGVyd2lzZSBjbGVhbnVwIGhhbmRsZXIgaXMgbm90IHBvcCdkICovIH0gKTsKKwkKKwkvKiBNYXJrIHRoZSBzZXNzaW9uIGFzIGRlc3Ryb3llZCAqLworCWRlc3Ryb3lfbm93ID0gKHNlc3MtPm1zZ19jbnQgPT0gMCk7CisJaWYgKGRlc3Ryb3lfbm93KSB7CisJCWZkX2xpc3RfdW5saW5rKCAmc2Vzcy0+Y2hhaW5faCApOworCQlzaWQgPSBzZXNzLT5zaWQ7CisJfSBlbHNlIHsKKwkJc2Vzcy0+aXNfZGVzdHJveWVkID0gMTsKKwkJQ0hFQ0tfTUFMTE9DX0RPKCBzaWQgPSBvczBkdXAoc2Vzcy0+c2lkLCBzZXNzLT5zaWRsZW4pLCByZXQgPSBFTk9NRU0gKTsKKwl9CisJcHRocmVhZF9jbGVhbnVwX3BvcCgwKTsKKwlDSEVDS19QT1NJWCggcHRocmVhZF9tdXRleF91bmxvY2soIEhfTE9DSyhzZXNzLT5oYXNoKSApICk7CisJCisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwkKKwkvKiBOb3csIHJlYWxseSBkZWxldGUgdGhlIHN0YXRlcyAqLworCXdoaWxlICghRkRfSVNfTElTVF9FTVBUWSgmZGVsZXRlZF9zdGF0ZXMpKSB7CisJCXN0cnVjdCBzdGF0ZSAqIHN0ID0gKHN0cnVjdCBzdGF0ZSAqKShkZWxldGVkX3N0YXRlcy5uZXh0LT5vKTsKKwkJZmRfbGlzdF91bmxpbmsoJnN0LT5jaGFpbik7CisJCVRSQUNFX0RFQlVHKEZVTEwsICJDYWxsaW5nIGhhbmRsZXIgJXAgY2xlYW51cCBmb3Igc3RhdGUgJXAgcmVnaXN0ZXJlZCB3aXRoIHNlc3Npb24gJyVzJyIsIHN0LT5oZGwsIHN0LCBzaWQpOworCQkoKnN0LT5oZGwtPmNsZWFudXApKHN0LT5zdGF0ZSwgc2lkLCBzdC0+aGRsLT5vcGFxdWUpOworCQlmcmVlKHN0KTsKKwl9CisJCisJLyogRmluYWxseSwgZGVzdHJveSB0aGUgc2Vzc2lvbiBpdHNlbGYsIGlmIGl0IGlzIG5vdCByZWZlcnJlbmNlZCBieSBhbnkgbWVzc2FnZSBhbnltb3JlICovCisJaWYgKGRlc3Ryb3lfbm93KSB7CisJCWRlbF9zZXNzaW9uKHNlc3MpOworCX0gZWxzZSB7CisJCWZyZWUoc2lkKTsKKwl9CisJCisJcmV0dXJuIDA7Cit9CisKKy8qIERlc3Ryb3kgYSBzZXNzaW9uIGlmIGl0IGlzIG5vdCB1c2VkICovCitpbnQgZmRfc2Vzc19yZWNsYWltICggc3RydWN0IHNlc3Npb24gKiogc2Vzc2lvbiApCit7CisJc3RydWN0IHNlc3Npb24gKiBzZXNzOworCXVpbnQzMl90IGhhc2g7CisJaW50IGRlc3Ryb3lfbm93ID0gMDsKKwkKKwlUUkFDRV9FTlRSWSgiJXAiLCBzZXNzaW9uKTsKKwlDSEVDS19QQVJBTVMoIHNlc3Npb24gJiYgVkFMSURBVEVfU0koKnNlc3Npb24pICk7CisJCisJc2VzcyA9ICpzZXNzaW9uOworCWhhc2ggPSBzZXNzLT5oYXNoOworCSpzZXNzaW9uID0gTlVMTDsKKwkKKwlDSEVDS19QT1NJWCggcHRocmVhZF9tdXRleF9sb2NrKCBIX0xPQ0soaGFzaCkgKSApOworCXB0aHJlYWRfY2xlYW51cF9wdXNoKCBmZF9jbGVhbnVwX211dGV4LCBIX0xPQ0soaGFzaCkgKTsKKwlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9tdXRleF9sb2NrKCAmc2Vzcy0+c3Rsb2NrICksIHsgQVNTRVJUKDApOyAvKiBvdGhlcndpc2UsIGNsZWFudXAgbm90IHBvcGVkIG9uIEZyZWVCU0QgKi8gfSApOworCXB0aHJlYWRfY2xlYW51cF9wdXNoKCBmZF9jbGVhbnVwX211dGV4LCAmc2Vzcy0+c3Rsb2NrICk7CisJQ0hFQ0tfUE9TSVhfRE8oIHB0aHJlYWRfbXV0ZXhfbG9jayggJmV4cF9sb2NrICksIHsgQVNTRVJUKDApOyAvKiBvdGhlcndpc2UsIGNsZWFudXAgbm90IHBvcGVkIG9uIEZyZWVCU0QgKi8gfSApOworCQorCS8qIFdlIG9ubHkgZG8gc29tZXRoaW5nIGlmIHRoZSBzdGF0ZXMgbGlzdCBpcyBlbXB0eSAqLworCWlmIChGRF9JU19MSVNUX0VNUFRZKCZzZXNzLT5zdGF0ZXMpKSB7CisJCS8qIEluIHRoaXMgY2FzZSwgd2UgZG8gYXMgaW4gZGVzdHJveSAqLworCQlmZF9saXN0X3VubGluayggJnNlc3MtPmV4cGlyZSApOworCQlkZXN0cm95X25vdyA9IChzZXNzLT5tc2dfY250ID09IDApOworCQlpZiAoZGVzdHJveV9ub3cpIHsKKwkJCWZkX2xpc3RfdW5saW5rKCZzZXNzLT5jaGFpbl9oKTsKKwkJfSBlbHNlIHsKKwkJCS8qIGp1c3QgbWFyayBpdCBhcyBkZXN0cm95ZWQsIGl0IHdpbGwgYmUgZnJlZWQgd2hlbiB0aGUgbGFzdCBtZXNzYWdlIHN0b3BzIHJlZmVyZW5jaW5nIGl0ICovCisJCQlzZXNzLT5pc19kZXN0cm95ZWQgPSAxOworCQl9CisJfQorCQorCUNIRUNLX1BPU0lYX0RPKCBwdGhyZWFkX211dGV4X3VubG9jayggJmV4cF9sb2NrICksIHsgQVNTRVJUKDApOyAvKiBvdGhlcndpc2UsIGNsZWFudXAgbm90IHBvcGVkIG9uIEZyZWVCU0QgKi8gfSApOworCXB0aHJlYWRfY2xlYW51cF9wb3AoMCk7CisJQ0hFQ0tfUE9TSVhfRE8oIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCAmc2Vzcy0+c3Rsb2NrICksIHsgQVNTRVJUKDApOyAvKiBvdGhlcndpc2UsIGNsZWFudXAgbm90IHBvcGVkIG9uIEZyZWVCU0QgKi8gfSApOworCXB0aHJlYWRfY2xlYW51cF9wb3AoMCk7CisJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCBIX0xPQ0soaGFzaCkgKSApOworCQorCWlmIChkZXN0cm95X25vdykKKwkJZGVsX3Nlc3Npb24oc2Vzcyk7CisJCisJcmV0dXJuIDA7Cit9CisKKy8qIFNhdmUgYSBzdGF0ZSBpbmZvcm1hdGlvbiB3aXRoIGEgc2Vzc2lvbiAqLworaW50IGZkX3Nlc3Nfc3RhdGVfc3RvcmUgKCBzdHJ1Y3Qgc2Vzc2lvbl9oYW5kbGVyICogaGFuZGxlciwgc3RydWN0IHNlc3Npb24gKiBzZXNzaW9uLCBzdHJ1Y3Qgc2Vzc19zdGF0ZSAqKiBzdGF0ZSApCit7CisJc3RydWN0IHN0YXRlICpuZXc7CisJc3RydWN0IGZkX2xpc3QgKiBsaTsKKwlpbnQgYWxyZWFkeSA9IDA7CisJaW50IHJldCA9IDA7CisJCisJVFJBQ0VfRU5UUlkoIiVwICVwICVwIiwgaGFuZGxlciwgc2Vzc2lvbiwgc3RhdGUpOworCUNIRUNLX1BBUkFNUyggaGFuZGxlciAmJiBWQUxJREFURV9TSChoYW5kbGVyKSAmJiBzZXNzaW9uICYmIFZBTElEQVRFX1NJKHNlc3Npb24pICYmICghc2Vzc2lvbi0+aXNfZGVzdHJveWVkKSAmJiBzdGF0ZSApOworCQorCS8qIExvY2sgdGhlIHNlc3Npb24gc3RhdGUgbGlzdCAqLworCUNIRUNLX1BPU0lYKCBwdGhyZWFkX211dGV4X2xvY2soJnNlc3Npb24tPnN0bG9jaykgKTsKKwlwdGhyZWFkX2NsZWFudXBfcHVzaCggZmRfY2xlYW51cF9tdXRleCwgJnNlc3Npb24tPnN0bG9jayApOworCQkJCisJLyogQ3JlYXRlIHRoZSBuZXcgc3RhdGUgb2JqZWN0ICovCisJQ0hFQ0tfTUFMTE9DX0RPKG5ldyA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHN0YXRlKSksIHsgcmV0ID0gRU5PTUVNOyBnb3RvIG91dDsgfSApOworCW1lbXNldChuZXcsIDAsIHNpemVvZihzdHJ1Y3Qgc3RhdGUpKTsKKwkKKwluZXctPmV5ZWMgPSBTRF9FWUVDOworCW5ldy0+c3RhdGU9ICpzdGF0ZTsKKwlmZF9saXN0X2luaXQoJm5ldy0+Y2hhaW4sIG5ldyk7CisJbmV3LT5oZGwgPSBoYW5kbGVyOworCQorCS8qIGZpbmQgcGxhY2UgZm9yIHRoaXMgc3RhdGUgaW4gdGhlIGxpc3QgKi8KKwlmb3IgKGxpID0gc2Vzc2lvbi0+c3RhdGVzLm5leHQ7IGxpICE9ICZzZXNzaW9uLT5zdGF0ZXM7IGxpID0gbGktPm5leHQpIHsKKwkJc3RydWN0IHN0YXRlICogc3QgPSAoc3RydWN0IHN0YXRlICopKGxpLT5vKTsKKwkJLyogVGhlIGxpc3QgaXMgb3JkZXJlZCBieSBoYW5kbGVyJ3MgaWQgKi8KKwkJaWYgKHN0LT5oZGwtPmlkIDwgaGFuZGxlci0+aWQpCisJCQljb250aW51ZTsKKwkJCisJCWlmIChzdC0+aGRsLT5pZCA9PSBoYW5kbGVyLT5pZCkgeworCQkJVFJBQ0VfREVCVUcoSU5GTywgIkEgc3RhdGUgd2FzIGFscmVhZHkgc3RvcmVkIGZvciBzZXNzaW9uICclcycgYW5kIGhhbmRsZXIgJyVwJywgYXQgbG9jYXRpb24gJXAiLCBzZXNzaW9uLT5zaWQsIHN0LT5oZGwsIHN0LT5zdGF0ZSk7CisJCQlhbHJlYWR5ID0gRUFMUkVBRFk7CisJCX0KKwkJCisJCWJyZWFrOworCX0KKwkKKwlpZiAoIWFscmVhZHkpIHsKKwkJZmRfbGlzdF9pbnNlcnRfYmVmb3JlKGxpLCAmbmV3LT5jaGFpbik7CisJCSpzdGF0ZSA9IE5VTEw7CisJfSBlbHNlIHsKKwkJZnJlZShuZXcpOworCX0KK291dDoKKwk7CQorCXB0aHJlYWRfY2xlYW51cF9wb3AoMCk7CisJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZzZXNzaW9uLT5zdGxvY2spICk7CisJCisJcmV0dXJuIHJldCA/OiBhbHJlYWR5OworfQorCisvKiBHZXQgdGhlIGRhdGEgYmFjayAqLworaW50IGZkX3Nlc3Nfc3RhdGVfcmV0cmlldmUgKCBzdHJ1Y3Qgc2Vzc2lvbl9oYW5kbGVyICogaGFuZGxlciwgc3RydWN0IHNlc3Npb24gKiBzZXNzaW9uLCBzdHJ1Y3Qgc2Vzc19zdGF0ZSAqKiBzdGF0ZSApCit7CisJc3RydWN0IGZkX2xpc3QgKiBsaTsKKwlzdHJ1Y3Qgc3RhdGUgKiBzdCA9IE5VTEw7CisJCisJVFJBQ0VfRU5UUlkoIiVwICVwICVwIiwgaGFuZGxlciwgc2Vzc2lvbiwgc3RhdGUpOworCUNIRUNLX1BBUkFNUyggaGFuZGxlciAmJiBWQUxJREFURV9TSChoYW5kbGVyKSAmJiBzZXNzaW9uICYmIFZBTElEQVRFX1NJKHNlc3Npb24pICYmIHN0YXRlICk7CisJCisJKnN0YXRlID0gTlVMTDsKKwkKKwkvKiBMb2NrIHRoZSBzZXNzaW9uIHN0YXRlIGxpc3QgKi8KKwlDSEVDS19QT1NJWCggcHRocmVhZF9tdXRleF9sb2NrKCZzZXNzaW9uLT5zdGxvY2spICk7CisJcHRocmVhZF9jbGVhbnVwX3B1c2goIGZkX2NsZWFudXBfbXV0ZXgsICZzZXNzaW9uLT5zdGxvY2sgKTsKKwkKKwkvKiBmaW5kIHRoZSBzdGF0ZSBpbiB0aGUgbGlzdCAqLworCWZvciAobGkgPSBzZXNzaW9uLT5zdGF0ZXMubmV4dDsgbGkgIT0gJnNlc3Npb24tPnN0YXRlczsgbGkgPSBsaS0+bmV4dCkgeworCQlzdCA9IChzdHJ1Y3Qgc3RhdGUgKikobGktPm8pOworCQkKKwkJLyogVGhlIGxpc3QgaXMgb3JkZXJlZCBieSBoYW5kbGVyJ3MgaWQgKi8KKwkJaWYgKHN0LT5oZGwtPmlkID4gaGFuZGxlci0+aWQpCisJCQlicmVhazsKKwl9CisJCisJLyogSWYgd2UgZm91bmQgdGhlIHN0YXRlICovCisJaWYgKHN0ICYmIChzdC0+aGRsID09IGhhbmRsZXIpKSB7CisJCWZkX2xpc3RfdW5saW5rKCZzdC0+Y2hhaW4pOworCQkqc3RhdGUgPSBzdC0+c3RhdGU7CisJCWZyZWUoc3QpOworCX0KKwkKKwlwdGhyZWFkX2NsZWFudXBfcG9wKDApOworCUNIRUNLX1BPU0lYKCBwdGhyZWFkX211dGV4X3VubG9jaygmc2Vzc2lvbi0+c3Rsb2NrKSApOworCQorCXJldHVybiAwOworfQorCisvKiBGb3IgdGhlIG1lc3NhZ2VzIG1vZHVsZSAqLworaW50IGZkX3Nlc3NfZnJvbXNpZCAoIHVpbnQ4X3QgKiBzaWQsIHNpemVfdCBsZW4sIHN0cnVjdCBzZXNzaW9uICoqIHNlc3Npb24sIGludCAqIG5ldykKK3sKKwlUUkFDRV9FTlRSWSgiJXAgJXpkICVwICVwIiwgc2lkLCBsZW4sIHNlc3Npb24sIG5ldyk7CisJQ0hFQ0tfUEFSQU1TKCBzaWQgJiYgbGVuICYmIHNlc3Npb24gKTsKKwkKKwkvKiBHZXQgdGhlIHNlc3Npb24gb2JqZWN0ICovCisJQ0hFQ0tfRkNUKCBmZF9zZXNzX2Zyb21zaWRfbXNnICggc2lkLCBsZW4sIHNlc3Npb24sIG5ldykgKTsKKwkKKwkvKiBEZWNyZWFzZSB0aGUgcmVmY291bnQgKi8KKwlDSEVDS19QT1NJWCggcHRocmVhZF9tdXRleF9sb2NrKCYoKnNlc3Npb24pLT5zdGxvY2spICk7CisJKCpzZXNzaW9uKS0+bXNnX2NudC0tOyAvKiB3YXMgaW5jcmVhc2VkIGluIGZkX3Nlc3NfbmV3ICovCisJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCYoKnNlc3Npb24pLT5zdGxvY2spICk7CisJCQorCS8qIERvbmUgKi8KKwlyZXR1cm4gMDsKK30KKworaW50IGZkX3Nlc3NfcmVmX21zZyAoIHN0cnVjdCBzZXNzaW9uICogc2Vzc2lvbiApCit7CisJVFJBQ0VfRU5UUlkoIiVwIiwgc2Vzc2lvbik7CisJQ0hFQ0tfUEFSQU1TKCBWQUxJREFURV9TSShzZXNzaW9uKSApOworCisJLyogVXBkYXRlIHRoZSBtc2cgcmVmY291bnQgKi8KKwlDSEVDS19QT1NJWCggcHRocmVhZF9tdXRleF9sb2NrKCZzZXNzaW9uLT5zdGxvY2spICk7CisJc2Vzc2lvbi0+bXNnX2NudCsrOworCUNIRUNLX1BPU0lYKCBwdGhyZWFkX211dGV4X3VubG9jaygmc2Vzc2lvbi0+c3Rsb2NrKSApOworCQorCXJldHVybiAwOworfQorCitpbnQgZmRfc2Vzc19yZWNsYWltX21zZyAoIHN0cnVjdCBzZXNzaW9uICoqIHNlc3Npb24gKQoreworCWludCByZWNsYWltOworCXVpbnQzMl90IGhhc2g7CisJCisJVFJBQ0VfRU5UUlkoIiVwIiwgc2Vzc2lvbik7CisJQ0hFQ0tfUEFSQU1TKCBzZXNzaW9uICYmIFZBTElEQVRFX1NJKCpzZXNzaW9uKSApOworCQorCS8qIExvY2sgdGhlIGhhc2ggbGluZSB0byBhdm9pZCBwb3NzaWJpbGl0eSB0aGF0IHNlc3Npb24gaXMgZnJlZWQgd2hpbGUgd2UgYXJlIHJlY2xhaW1pbmcgKi8KKwloYXNoID0gKCpzZXNzaW9uKS0+aGFzaDsKKwlDSEVDS19QT1NJWCggcHRocmVhZF9tdXRleF9sb2NrKCBIX0xPQ0soaGFzaCkpICk7CisJcHRocmVhZF9jbGVhbnVwX3B1c2goIGZkX2NsZWFudXBfbXV0ZXgsIEhfTE9DSyhoYXNoKSApOyAKKworCS8qIFVwZGF0ZSB0aGUgbXNnIHJlZmNvdW50ICovCisJQ0hFQ0tfUE9TSVgoIHB0aHJlYWRfbXV0ZXhfbG9jaygmKCpzZXNzaW9uKS0+c3Rsb2NrKSApOworCXJlY2xhaW0gPSAoKnNlc3Npb24pLT5tc2dfY250OworCSgqc2Vzc2lvbiktPm1zZ19jbnQgPSByZWNsYWltIC0gMTsKKwlDSEVDS19QT1NJWCggcHRocmVhZF9tdXRleF91bmxvY2soJigqc2Vzc2lvbiktPnN0bG9jaykgKTsKKwkKKwkvKiBPaywgbm93IHVubG9jayB0aGUgaGFzaCBsaW5lICovCisJcHRocmVhZF9jbGVhbnVwX3BvcCggMCApOworCUNIRUNLX1BPU0lYKCBwdGhyZWFkX211dGV4X3VubG9jayggSF9MT0NLKGhhc2gpICkgKTsKKwkKKwkvKiBhbmQgcmVjbGFpbSBpZiBubyBtZXNzYWdlIHJlZmVyZW5jZXMgdGhlIHNlc3Npb24gYW55bW9yZSAqLworCWlmIChyZWNsYWltID09IDEpIHsKKwkJQ0hFQ0tfRkNUKGZkX3Nlc3NfcmVjbGFpbSAoIHNlc3Npb24gKSk7CisJfSBlbHNlIHsKKwkJKnNlc3Npb24gPSBOVUxMOworCX0KKwlyZXR1cm4gMDsKK30KKworCisKKy8qIER1bXAgZnVuY3Rpb25zICovCitERUNMQVJFX0ZEX0RVTVBfUFJPVE9UWVBFKGZkX3Nlc3NfZHVtcCwgc3RydWN0IHNlc3Npb24gKiBzZXNzaW9uLCBpbnQgd2l0aF9zdGF0ZXMpCit7CisJRkRfRFVNUF9IQU5ETEVfT0ZGU0VUKCk7CisJCisJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9kdW1wX2V4dGVuZCggRkRfRFVNUF9TVERfUEFSQU1TLCAie3Nlc3Npb259KEAlcCk6ICIsIHNlc3Npb24pLCByZXR1cm4gTlVMTCk7CisJCisJaWYgKCFWQUxJREFURV9TSShzZXNzaW9uKSkgeworCQlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICJJTlZBTElEL05VTEwiKSwgcmV0dXJuIE5VTEwpOworCX0gZWxzZSB7CisJCWNoYXIgdGltZWJ1ZlszMF07CisJCXN0cnVjdCB0bSB0bTsKKworCQlzdHJmdGltZSh0aW1lYnVmLCBzaXplb2YodGltZWJ1ZiksICIlRCwlVCIsIGxvY2FsdGltZV9yKCAmc2Vzc2lvbi0+dGltZW91dC50dl9zZWMgLCAmdG0gKSk7CisJCUNIRUNLX01BTExPQ19ETyggZmRfZHVtcF9leHRlbmQoIEZEX0RVTVBfU1REX1BBUkFNUywgIiclcycoJXpkKSBoOiV4IG06JWQgZDolZCB0bzolcy4lMDZsZCIsCisJCQkJCQkJc2Vzc2lvbi0+c2lkLCBzZXNzaW9uLT5zaWRsZW4sIHNlc3Npb24tPmhhc2gsIHNlc3Npb24tPm1zZ19jbnQsIHNlc3Npb24tPmlzX2Rlc3Ryb3llZCwKKwkJCQkJCQl0aW1lYnVmLCBzZXNzaW9uLT50aW1lb3V0LnR2X25zZWMvMTAwMCksIAorCQkJCSByZXR1cm4gTlVMTCk7CisJCQorCQlpZiAod2l0aF9zdGF0ZXMpIHsKKwkJCXN0cnVjdCBmZF9saXN0ICogbGk7CisJCQlDSEVDS19QT1NJWF9ETyggcHRocmVhZF9tdXRleF9sb2NrKCZzZXNzaW9uLT5zdGxvY2spLCAvKiBpZ25vcmUgKi8gKTsKKwkJCXB0aHJlYWRfY2xlYW51cF9wdXNoKCBmZF9jbGVhbnVwX211dGV4LCAmc2Vzc2lvbi0+c3Rsb2NrICk7CisJCQkKKwkJCWZvciAobGkgPSBzZXNzaW9uLT5zdGF0ZXMubmV4dDsgbGkgIT0gJnNlc3Npb24tPnN0YXRlczsgbGkgPSBsaS0+bmV4dCkgeworCQkJCXN0cnVjdCBzdGF0ZSAqIHN0ID0gKHN0cnVjdCBzdGF0ZSAqKShsaS0+byk7CisJCQkJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9kdW1wX2V4dGVuZCggRkRfRFVNUF9TVERfUEFSQU1TLCAiXG4gIHtzdGF0ZSBpOiVkfShAJXApOiAiLCBzdC0+aGRsLT5pZCwgc3QpLCByZXR1cm4gTlVMTCk7CisJCQkJaWYgKHN0LT5oZGwtPnN0YXRlX2R1bXApIHsKKwkJCQkJQ0hFQ0tfTUFMTE9DX0RPKCAoKnN0LT5oZGwtPnN0YXRlX2R1bXApKCBGRF9EVU1QX1NURF9QQVJBTVMsIHN0LT5zdGF0ZSksIAorCQkJCQkJCWZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICJbZHVtcGVyIGVycm9yXSIpKTsKKwkJCQl9IGVsc2UgeworCQkJCQlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICI8JXA+Iiwgc3QtPnN0YXRlKSwgcmV0dXJuIE5VTEwpOworCQkJCX0KKwkJCX0KKwkJCQorCQkJcHRocmVhZF9jbGVhbnVwX3BvcCgwKTsKKwkJCUNIRUNLX1BPU0lYX0RPKCBwdGhyZWFkX211dGV4X3VubG9jaygmc2Vzc2lvbi0+c3Rsb2NrKSwgLyogaWdub3JlICovICk7CisJCX0KKwl9CisJCisJcmV0dXJuICpidWY7Cit9CisKK0RFQ0xBUkVfRkRfRFVNUF9QUk9UT1RZUEUoZmRfc2Vzc19kdW1wX2hkbCwgc3RydWN0IHNlc3Npb25faGFuZGxlciAqIGhhbmRsZXIpCit7CisJRkRfRFVNUF9IQU5ETEVfT0ZGU0VUKCk7CisJCisJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9kdW1wX2V4dGVuZCggRkRfRFVNUF9TVERfUEFSQU1TLCAie3Nlc3NoZGx9KEAlcCk6ICIsIGhhbmRsZXIpLCByZXR1cm4gTlVMTCk7CisJCisJaWYgKCFWQUxJREFURV9TSChoYW5kbGVyKSkgeworCQlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICJJTlZBTElEL05VTEwiKSwgcmV0dXJuIE5VTEwpOworCX0gZWxzZSB7CisJCUNIRUNLX01BTExPQ19ETyggZmRfZHVtcF9leHRlbmQoIEZEX0RVTVBfU1REX1BBUkFNUywgImk6JWQgY2w6JXAgZDolcCBvOiVwIiwgaGFuZGxlci0+aWQsIGhhbmRsZXItPmNsZWFudXAsIGhhbmRsZXItPnN0YXRlX2R1bXAsIGhhbmRsZXItPm9wYXF1ZSksIHJldHVybiBOVUxMKTsKKwl9CisJcmV0dXJuICpidWY7Cit9CQorCitpbnQgZmRfc2Vzc19nZXRjb3VudCh1aW50MzJfdCAqY250KQoreworCUNIRUNLX1BBUkFNUyhjbnQpOworCUNIRUNLX1BPU0lYKCBwdGhyZWFkX211dGV4X2xvY2soICZleHBfbG9jayApICk7CisJKmNudCA9IHNlc3NfY250OworCUNIRUNLX1BPU0lYKCBwdGhyZWFkX211dGV4X3VubG9jayggJmV4cF9sb2NrICkgKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYmZkcHJvdG8vdXRpbHMuYyBiL2xpYmZkcHJvdG8vdXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjQ0MGNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliZmRwcm90by91dGlscy5jCkBAIC0wLDAgKzEsODQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDEzLCBXSURFIFByb2plY3QgYW5kIE5JQ1QJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFdJREUgUHJvamVjdCBvciBOSUNUIG5vciB0aGUgCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgV0lERSBQcm9qZWN0IGFuZCAJCQkJCQkgKgorKiAgIE5JQ1QuCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImZkcHJvdG8taW50ZXJuYWwuaCIKKworREVDTEFSRV9GRF9EVU1QX1BST1RPVFlQRShmZF9zYV9kdW1wLCBzU0EgKiBzYSwgaW50IGZsYWdzKSAKK3sKKwljaGFyIGFkZHJidWZbSU5FVDZfQUREUlNUUkxFTl07CisJY2hhciBzZXJ2YnVmWzMyXTsKKwlpbnQgcmM7CisJRkRfRFVNUF9IQU5ETEVfT0ZGU0VUKCk7CisJCisJc2VydmJ1ZlswXSA9IDA7CisJCisJaWYgKHNhKSB7CisJCWlmIChzU0Fwb3J0KHNhKSkgeworCQkJcmMgPSBnZXRuYW1laW5mbyhzYSwgc1NBbGVuKCBzYSApLCBhZGRyYnVmLCBzaXplb2YoYWRkcmJ1ZiksIHNlcnZidWYsIHNpemVvZihzZXJ2YnVmKSwgZmxhZ3MpOworCQl9IGVsc2UgeworCQkJcmMgPSBnZXRuYW1laW5mbyhzYSwgc1NBbGVuKCBzYSApLCBhZGRyYnVmLCBzaXplb2YoYWRkcmJ1ZiksIE5VTEwsIDAsIGZsYWdzKTsKKwkJfQorCQlpZiAocmMpIHsKKwkJCUNIRUNLX01BTExPQ19ETyggZmRfZHVtcF9leHRlbmQoIEZEX0RVTVBfU1REX1BBUkFNUywgIiVzIiwgZ2FpX3N0cmVycm9yKHJjKSksIHJldHVybiBOVUxMKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChzZXJ2YnVmWzBdKSB7CisJCQkJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9kdW1wX2V4dGVuZCggRkRfRFVNUF9TVERfUEFSQU1TLCAiJXMoJXMpIiwgJmFkZHJidWZbMF0sICZzZXJ2YnVmWzBdKSwgcmV0dXJuIE5VTEwpOworCQkJfSBlbHNlIHsKKwkJCQlDSEVDS19NQUxMT0NfRE8oIGZkX2R1bXBfZXh0ZW5kKCBGRF9EVU1QX1NURF9QQVJBTVMsICIlcyIsICZhZGRyYnVmWzBdKSwgcmV0dXJuIE5VTEwpOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJQ0hFQ0tfTUFMTE9DX0RPKCBmZF9kdW1wX2V4dGVuZCggRkRfRFVNUF9TVERfUEFSQU1TLCAiKE5VTEwgLyBBTlkpIiksIHJldHVybiBOVUxMKTsKKwl9CisJcmV0dXJuICpidWY7Cit9CisKK3ZvaWQgZmRfc2Ffc2R1bXBfbnVtZXJpYyhjaGFyICogYnVmIC8qIG11c3QgYmUgYXQgbGVhc3Qgc1NBX0RVTVBfU1RSTEVOICovLCBzU0EgKiBzYSkKK3sKKwljaGFyIGFkZHJidWZbSU5FVDZfQUREUlNUUkxFTl07CisJY2hhciBzZXJ2YnVmWzMyXTsKKwkKKwlpZiAoc2EpIHsKKwkJaW50IHJjID0gZ2V0bmFtZWluZm8oc2EsIHNTQWxlbiggc2EgKSwgYWRkcmJ1Ziwgc2l6ZW9mKGFkZHJidWYpLCBzZXJ2YnVmLCBzaXplb2Yoc2VydmJ1ZiksIE5JX05VTUVSSUNIT1NUIHwgTklfTlVNRVJJQ1NFUlYpOworCQlpZiAocmMpIHsKKwkJCXNucHJpbnRmKGJ1Ziwgc1NBX0RVTVBfU1RSTEVOLCAiJXMiLCBnYWlfc3RyZXJyb3IocmMpKTsKKwkJfSBlbHNlIHsKKwkJCXNucHJpbnRmKGJ1Ziwgc1NBX0RVTVBfU1RSTEVOLCAiJXMoJXMpIiwgYWRkcmJ1Ziwgc2VydmJ1Zik7CisJCX0KKwl9IGVsc2UgeworCQlzbnByaW50ZihidWYsIHNTQV9EVU1QX1NUUkxFTiwgIihOVUxMIC8gQU5ZKSIpOworCX0KKwkKK30KZGlmZiAtLWdpdCBhL2xpYmZkcHJvdG8vdmVyc2lvbi5jIGIvbGliZmRwcm90by92ZXJzaW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhkY2Y4ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmZkcHJvdG8vdmVyc2lvbi5jCkBAIC0wLDAgKzEsNDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDEzLCBXSURFIFByb2plY3QgYW5kIE5JQ1QJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFdJREUgUHJvamVjdCBvciBOSUNUIG5vciB0aGUgCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgV0lERSBQcm9qZWN0IGFuZCAJCQkJCQkgKgorKiAgIE5JQ1QuCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImZkcHJvdG8taW50ZXJuYWwuaCIKKyNpbmNsdWRlIDxmcmVlRGlhbWV0ZXIvdmVyc2lvbi5oPgorCisjaWZkZWYgRkRfUFJPSkVDVF9WRVJTSU9OX0hHCisjIGRlZmluZSBGRF9MSUJGRFBST1RPX1ZFUlNJT04gXAorCV9zdHJpbmdpemUoRkRfUFJPSkVDVF9WRVJTSU9OX01BSk9SKSAiLiIgX3N0cmluZ2l6ZShGRF9QUk9KRUNUX1ZFUlNJT05fTUlOT1IpICIuIiBfc3RyaW5naXplKEZEX1BST0pFQ1RfVkVSU0lPTl9SRVYpICItIiBGRF9QUk9KRUNUX1ZFUlNJT05fSEdfVkFMCisjZWxzZQorIyBkZWZpbmUgRkRfTElCRkRQUk9UT19WRVJTSU9OIFwKKwlfc3RyaW5naXplKEZEX1BST0pFQ1RfVkVSU0lPTl9NQUpPUikgIi4iIF9zdHJpbmdpemUoRkRfUFJPSkVDVF9WRVJTSU9OX01JTk9SKSAiLiIgX3N0cmluZ2l6ZShGRF9QUk9KRUNUX1ZFUlNJT05fUkVWKQorI2VuZGlmCisKK2NvbnN0IGNoYXIgZmRfbGlicHJvdG9fdmVyc2lvbltdID0gRkRfTElCRkRQUk9UT19WRVJTSU9OOwpkaWZmIC0tZ2l0IGEvdGVzdC50eHQgYi90ZXN0LnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc5ZjE4OC4uMDAwMDAwMAotLS0gYS90ZXN0LnR4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXB1c2ggdGVzdApkaWZmIC0tZ2l0IGEvdGVzdDIudHh0IGIvdGVzdDIudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjNiMzcxLi4wMDAwMDAwCi0tLSBhL3Rlc3QyLnR4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXRoaXMgaXMgcHVzaCB0ZXN0MgpkaWZmIC0tZ2l0IGEvdGVzdHMvQ01ha2VMaXN0cy50eHQgYi90ZXN0cy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWFhYTk0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxMTcgQEAKKyMgVGVzdCBkaXJlY3RvcnkKK1BST0pFQ1QoImZyZWVEaWFtZXRlciB0ZXN0cyIgQykKKworIyBnaXZlIHRoZSBwb3NzaWJpbGl0eSB0byBjb25maWd1cmUgdGhlIHRpbWVvdXQgZHVyYXRpb24gZm9yIHRoZSB0ZXN0cworT1BUSU9OKFRFU1RfVElNRU9VVCAiVGltZW91dCBmb3IgdGhlIHRlc3RzLCBpbiBzZWNvbmRzIChkZWZhdWx0OiAxMjApPyIpCitJRihURVNUX1RJTUVPVVQpCisJQUREX0RFRklOSVRJT05TKC1EVEVTVF9USU1FT1VUPSR7VEVTVF9USU1FT1VUfSkKK0VORElGKFRFU1RfVElNRU9VVCkKKworIyBkZWZhdWx0IGNvbW1hbmQgbGluZSBmb3IgdGhlIHRlc3RzCitPUFRJT04oT1BUX1RFU1RfQVJHVU1FTlRTICJTcGVjaWZ5IHRoZSBkZWZhdWx0IGFyZ3VtZW50cyBmb3IgdGhlIHRlc3RzIiBPRkYpCitJRihPUFRfVEVTVF9BUkdVTUVOVFMpCisJU0VUKFRFU1RfQVJHVU1FTlRTICR7T1BUX1RFU1RfQVJHVU1FTlRTfSkKK0VMU0UoT1BUX1RFU1RfQVJHVU1FTlRTKQorCVNFVChURVNUX0FSR1VNRU5UUyAiIikKK0VORElGKE9QVF9URVNUX0FSR1VNRU5UUykKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBMaXN0IHRoZSB0ZXN0IGNhc2VzCitTRVQoVEVTVF9MSVNUCisJdGVzdHNjdHAKKwl0ZXN0b3N0cgorCXRlc3RmaWZvCisJdGVzdHBlZXJzCisJdGVzdGRpY3QKKwl0ZXN0bWVzZworCXRlc3RtZXNnX3N0cmVzcworCXRlc3RzZXNzCisJdGVzdGRpc3AKKwl0ZXN0Y254CisJdGVzdGxvYWRleHQKKykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgU29tZSBwYXJhbWV0ZXJzIGZvciB0aGUgdGVzdHMKKworQUREX0RFRklOSVRJT05TKC1EVEVTVF9ERUJVRykKK0FERF9ERUZJTklUSU9OUygtREJVSUxEX0RJUj0iJHtDTUFLRV9CSU5BUllfRElSfSIpCisKK0lOQ0xVREVfRElSRUNUT1JJRVMoICIuLi9saWJmZHByb3RvIiApCitJTkNMVURFX0RJUkVDVE9SSUVTKCAiLi4vbGliZmRjb3JlIiApCitJTkNMVURFX0RJUkVDVE9SSUVTKCR7TEZEQ09SRV9JTkNMVURFU30pCisKKworU0VUKHRlc3RjbnhfQURESVRJT05BTF9MSUIgICR7Q0xPQ0tfR0VUVElNRV9MSUJTfSkKK1NFVCh0ZXN0Zmlmb19BRERJVElPTkFMX0xJQiAke0NMT0NLX0dFVFRJTUVfTElCU30pCitTRVQodGVzdHNlc3NfQURESVRJT05BTF9MSUIgJHtDTE9DS19HRVRUSU1FX0xJQlN9KQorU0VUKHRlc3Rsb2FkZXh0X0FERElUSU9OQUxfTElCICR7Q01BS0VfRExfTElCU30pCitTRVQodGVzdG1lc2dfc3RyZXNzX0FERElUSU9OQUxfTElCICR7Q0xPQ0tfR0VUVElNRV9MSUJTfSAke0NNQUtFX0RMX0xJQlN9KQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQXBwX2FjY3QgdGVzdAorCitJRihCVUlMRF9BUFBfQUNDVCBPUiBBTExfRVhURU5TSU9OUykKKwlPUFRJT04oVEVTVF9BUFBfQUNDVCAiVGVzdCBhcHBfYWNjdCBleHRlbnNpb24/IChSZXF1aXJlcyBhIGNvbmZpZ3VyZWQgZGF0YWJhc2UsIHNlZSB0ZXN0YXBwYWNjdC5jIGZvciBkZXRhaWxzKSIgT0ZGKQorCUlGKFRFU1RfQVBQX0FDQ1QpCisJCisJCU9QVElPTihURVNUX0FQUF9BQ0NUX0NPTk5JTkZPICJUaGUgY29ubmVjdGlvbiBzdHJpbmcgdG8gdGhlIGRhdGFiYXNlIikKKwkJSUYoVEVTVF9BUFBfQUNDVF9DT05OSU5GTykKKwkJCUFERF9ERUZJTklUSU9OUygtRFRFU1RfQ09OTklORk89IiR7VEVTVF9BUFBfQUNDVF9DT05OSU5GT30iKQorCQlFTkRJRihURVNUX0FQUF9BQ0NUX0NPTk5JTkZPKQorCQorCQlTRVQoVEVTVF9MSVNUICR7VEVTVF9MSVNUfSB0ZXN0YXBwYWNjdCkKKworCQkjIEV4dGVuc2lvbiBkZXBlbmRlbmNpZXMKKwkJRklORF9QQUNLQUdFKFBvc3RncmVTUUwgUkVRVUlSRUQpCisJCUlOQ0xVREVfRElSRUNUT1JJRVMoJHtQT1NUR1JFU1FMX0lOQ0xVREVfRElSfSkKKwkJU0VUKHRlc3RhcHBhY2N0X0FERElUSU9OQUxfTElCICR7UE9TVEdSRVNRTF9MSUJSQVJJRVN9KQorCisJCSMgTGlzdCBvZiBzb3VyY2UgZmlsZXMsIGNvcGllZCBmcm9tIHRoZSBleHRlbnNpb24gQ01ha2VMaXN0cy4KKwkJQklTT05fRklMRSguLi9leHRlbnNpb25zL2FwcF9hY2N0L2FjY3RfY29uZi55KQorCQlGTEVYX0ZJTEUoLi4vZXh0ZW5zaW9ucy9hcHBfYWNjdC9hY2N0X2NvbmYubCkKKwkJI1NFVF9TT1VSQ0VfRklMRVNfUFJPUEVSVElFUyhsZXguYWNjdF9jb25mLmMgYWNjdF9jb25mLnRhYi5jIFBST1BFUlRJRVMgQ09NUElMRV9GTEFHUyAiLUkgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9IikKKwkJCisJCVNFVCggQVBQX0FDQ1RfU1JDCisJCQlhcHBfYWNjdC5oCisJCQlhcHBfYWNjdC5jCisJCQlhY2N0X2RiLmMKKwkJCWFjY3RfcmVjb3Jkcy5jCisJCSkKKwkJU0VUKCBBUFBfQUNDVF9TUkNfR0VOCisJCQlsZXguYWNjdF9jb25mLmMKKwkJCWFjY3RfY29uZi50YWIuYworCQkJYWNjdF9jb25mLnRhYi5oCisJCSkKKworCQkjIFRoZSBleHRlbnNpb24gaGVhZGVycworCQlJTkNMVURFX0RJUkVDVE9SSUVTKCAiLi4vZXh0ZW5zaW9ucy9hcHBfYWNjdCIgKQorCisJCVNFVCh0ZXN0YXBwYWNjdF9BRERJVElPTkFMICIiKQorCisJCUZPUkVBQ0goIFNSQ19GSUxFICR7QVBQX0FDQ1RfU1JDfSkKKwkJICAgU0VUKHRlc3RhcHBhY2N0X0FERElUSU9OQUwgJHt0ZXN0YXBwYWNjdF9BRERJVElPTkFMfSAiLi4vZXh0ZW5zaW9ucy9hcHBfYWNjdC8ke1NSQ19GSUxFfSIpCisJCUVOREZPUkVBQ0goU1JDX0ZJTEUpCisKKwkJRk9SRUFDSCggU1JDX0ZJTEUgJHtBUFBfQUNDVF9TUkNfR0VOfSkKKwkJICAgU0VUKHRlc3RhcHBhY2N0X0FERElUSU9OQUwgJHt0ZXN0YXBwYWNjdF9BRERJVElPTkFMfSAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9Ly4uL2V4dGVuc2lvbnMvYXBwX2FjY3QvJHtTUkNfRklMRX0iKQorCQlFTkRGT1JFQUNIKFNSQ19GSUxFKQorCisJRU5ESUYoVEVTVF9BUFBfQUNDVCkKK0VORElGKEJVSUxEX0FQUF9BQ0NUIE9SIEFMTF9FWFRFTlNJT05TKQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvbXBpbGUgZWFjaCB0ZXN0CitGT1JFQUNIKCBURVNUICR7VEVTVF9MSVNUfSApCisgICBBRERfRVhFQ1VUQUJMRSgke1RFU1R9ICR7VEVTVH0uYyB0ZXN0cy5oICR7JHtURVNUfV9BRERJVElPTkFMfSkKKyAgIFRBUkdFVF9MSU5LX0xJQlJBUklFUygke1RFU1R9IGxpYmZkcHJvdG8gbGliZmRjb3JlICR7R05VVExTX0xJQlJBUklFU30gJHtHQ1JZUFRfTElCUkFSWX0gJHske1RFU1R9X0FERElUSU9OQUxfTElCfSkKKyAgIEFERF9URVNUKCR7VEVTVH0gJHtFWEVDVVRBQkxFX09VVFBVVF9QQVRIfS8ke1RFU1R9ICR7VEVTVF9BUkdVTUVOVFN9KQorRU5ERk9SRUFDSCggVEVTVCApCisKKworIyMjIworIyMgSU5TVEFMTCBzZWN0aW9uICMjCisKKyMgd2UgZG8gbm90IGluc3RhbGwgdGhlIHRlc3RzCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0YXBwYWNjdC5jIGIvdGVzdHMvdGVzdGFwcGFjY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWM5NGYzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdGFwcGFjY3QuYwpAQCAtMCwwICsxLDI3OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTMsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAidGVzdHMuaCIKKworLyogVGhlIGNvbm5lY3Rpb24gc3RyaW5nIHRvIHRoZSBkYXRhYmFzZSAqLworI2lmbmRlZiBURVNUX0NPTk5JTkZPCisjZXJyb3IgIlBsZWFzZSBzcGVjaWZ5IHRoZSBjb25uaW5mbyBpbmZvcm1hdGlvbiIKKyNlbmRpZiAvKiBURVNUX0NPTk5JTkZPICovCisKKy8qIFRoZSB0YWJsZSB1c2VkIGZvciB0ZXN0cy4gVGhpcyB0YWJsZSB3aWxsIHJlY2VpdmUgdGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnM6CitEUk9QIFRBQkxFIDx0YWJsZT47CitDUkVBVEUgVEFCTEUgPHRhYmxlPgorKAorICByZWNvcmRlZF9vbiB0aW1lc3RhbXAgd2l0aCB0aW1lIHpvbmUgTk9UIE5VTEwsCisgICJBY2NvdW50aW5nLVJlY29yZC1UeXBlIiBpbnRlZ2VyLAorICAiU2Vzc2lvbi1JZCIgYnl0ZWEsCisgICJBY2NvdW50aW5nLVJlY29yZC1OdW1iZXIiIGludGVnZXIsCisgICJSb3V0ZS1SZWNvcmQxIiBieXRlYSwKKyAgIlJvdXRlLVJlY29yZDIiIGJ5dGVhLAorICAiUm91dGUtUmVjb3JkMyIgYnl0ZWEsCisgICJSb3V0ZS1SZWNvcmQ0IiBieXRlYQorKTsKKyovCisjZGVmaW5lIFRBQkxFICJpbmNvbWluZ190ZXN0IgorCisjaW5jbHVkZSAiYXBwX2FjY3QuaCIKKyNpbmNsdWRlIDxsaWJwcS1mZS5oPgorCitzdGF0aWMgaW50IGFkZF9hdnBfaW5fY29uZihjaGFyICogYXZwbmFtZSwgaW50IG11bHRpKSAKK3sKKwlzdHJ1Y3QgYWNjdF9jb25mX2F2cCAqbmV3OworCXN0cnVjdCBkaWN0X29iamVjdCAqIGRpY3Q7CisJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGljdGRhdGE7CisKKwkvKiBWYWxpZGF0ZSB0aGUgYXZwIG5hbWUgZmlyc3QgKi8KKwlDSEVDS19GQ1QoIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgYXZwbmFtZSwgJmRpY3QsIEVOT0VOVCkgKTsKKwlDSEVDS19GQ1QoIGZkX2RpY3RfZ2V0dmFsKCBkaWN0LCAmZGljdGRhdGEgKSk7CisKKwkvKiBDcmVhdGUgYSBuZXcgZW50cnkgKi8KKwlDSEVDS19NQUxMT0MoIG5ldyA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGFjY3RfY29uZl9hdnApKSApOworCW1lbXNldChuZXcsIDAsIHNpemVvZihzdHJ1Y3QgYWNjdF9jb25mX2F2cCkpOworCWZkX2xpc3RfaW5pdCgmbmV3LT5jaGFpbiwgTlVMTCk7CisJbmV3LT5hdnBuYW1lID0gYXZwbmFtZTsKKwluZXctPmF2cG9iaiA9IGRpY3Q7CisJbmV3LT5hdnB0eXBlID0gZGljdGRhdGEuYXZwX2Jhc2V0eXBlOworCW5ldy0+bXVsdGkgPSBtdWx0aTsKKworCS8qIEFkZCB0aGlzIG5ldyBlbnRyeSBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0ICovCisJZmRfbGlzdF9pbnNlcnRfYmVmb3JlKCAmYWNjdF9jb25maWctPmF2cHMsICZuZXctPmNoYWluICk7CisJCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgTE9DQUxfSUQJInRlc3QuYXBwLmFjY3QiCisjZGVmaW5lIExPQ0FMX1JFQUxNCSJhcHAuYWNjdCIKKworLyogTWFpbiB0ZXN0IHJvdXRpbmUgKi8KK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJZXh0ZXJuIHB0aHJlYWRfa2V5X3QgY29ubms7IC8qIGluIGFjY3RfZGIuYyAqLworCVBHY29ubiAqY29ubjsKKwlleHRlcm4gaW50IGZkX2V4dF9pbml0KGludCBtYWpvciwgaW50IG1pbm9yLCBjaGFyICogY29uZmZpbGUpOyAvKiBkZWZpbmVkIGluIGluY2x1ZGUncyBleHRlbnNpb24uaCAqLworCWV4dGVybiB2b2lkIGZkX2V4dF9maW5pKHZvaWQpOyAvKiBkZWZpbmVkIGluIHRoZSBleHRlbnNpb24gaXRzZWxmICovCisJc3RydWN0IG1zZyAqIG1zZzsKKwlvczBfdCBzZXNzX2JrcDsKKwlzaXplX3Qgc2Vzc19ia3BfbGVuOworCQorCS8qIEZpcnN0LCBpbml0aWFsaXplIHRoZSBkYWVtb24gbW9kdWxlcyAqLworCUlOSVRfRkQoKTsKKwlmZF9nX2NvbmZpZy0+Y25mX2RpYW1pZCA9IHN0cmR1cChMT0NBTF9JRCk7CisJZmRfZ19jb25maWctPmNuZl9kaWFtaWRfbGVuID0gQ09OU1RTVFJMRU4oTE9DQUxfSUQpOworCWZkX2dfY29uZmlnLT5jbmZfZGlhbXJsbSA9IHN0cmR1cChMT0NBTF9SRUFMTSk7CisJZmRfZ19jb25maWctPmNuZl9kaWFtcmxtX2xlbiA9IENPTlNUU1RSTEVOKExPQ0FMX1JFQUxNKTsKKwkKKwlDSEVDSyggMCwgZmRfcXVldWVzX2luaXQoKSAgKTsKKwlDSEVDSyggMCwgZmRfbXNnX2luaXQoKSAgKTsKKwlDSEVDSyggMCwgZmRfcnRkaXNwX2luaXQoKSAgKTsKKwkKKwkvKiBJbml0aWFsaXplIHRoZSBleHRlbnNpb24gY29uZmlndXJhdGlvbiBmb3IgdGhlIHRlc3QgKi8KKwl7CisJCUNIRUNLKCAwLCBhY2N0X2NvbmZfaW5pdCgpICk7CisJCWFjY3RfY29uZmlnLT5jb25uaW5mbyA9IHN0cmR1cChURVNUX0NPTk5JTkZPKTsKKwkJYWNjdF9jb25maWctPnRhYmxlbmFtZSA9IHN0cmR1cChUQUJMRSk7CisJCWFjY3RfY29uZmlnLT50c2ZpZWxkID0gc3RyZHVwKCJyZWNvcmRlZF9vbiIpOworCQlDSEVDSyggMCwgYWRkX2F2cF9pbl9jb25mKHN0cmR1cCgiU2Vzc2lvbi1JZCIpLCAwKSApOworCQlDSEVDSyggMCwgYWRkX2F2cF9pbl9jb25mKHN0cmR1cCgiQWNjb3VudGluZy1SZWNvcmQtVHlwZSIpLCAwKSApOworCQlDSEVDSyggMCwgYWRkX2F2cF9pbl9jb25mKHN0cmR1cCgiQWNjb3VudGluZy1SZWNvcmQtTnVtYmVyIiksIDApICk7CisJCUNIRUNLKCAwLCBhZGRfYXZwX2luX2NvbmYoc3RyZHVwKCJSb3V0ZS1SZWNvcmQiKSwgNCkgKTsKKwkJCisJCS8qIE5vdywgY2FsbCB0aGUgb25lIG9mIHRoZSBleHRlbnNpb24gKi8KKwkJQ0hFQ0soIDAsIGZkX2V4dF9pbml0KEZEX1BST0pFQ1RfVkVSU0lPTl9NQUpPUiwgRkRfUFJPSkVDVF9WRVJTSU9OX01JTk9SLE5VTEwpICk7CisJCWNvbm4gPSBwdGhyZWFkX2dldHNwZWNpZmljKGNvbm5rKTsKKwl9CisJCisJLyogRHJvcCBhbmQgcmVjcmVhdGUgdGhlIHRhYmxlIGZvciB0aGUgdGVzdCAqLworCXsKKwkJUEdyZXN1bHQgKiByZXM7CisJCUNIRUNLKCBDT05ORUNUSU9OX09LLCBQUXN0YXR1cyhjb25uKSApOworCQkKKwkJcmVzID0gUFFleGVjKGNvbm4sICJEUk9QIFRBQkxFICIgVEFCTEUgIjsiKTsKKwkJQ0hFQ0soIFBHUkVTX0NPTU1BTkRfT0ssIFBRcmVzdWx0U3RhdHVzKHJlcykgKTsKKwkJUFFjbGVhcihyZXMpOworCQkKKwkJcmVzID0gUFFleGVjKGNvbm4sICJDUkVBVEUgVEFCTEUgIiBUQUJMRSAiICggIgorCQkJCQkiICByZWNvcmRlZF9vbiB0aW1lc3RhbXAgd2l0aCB0aW1lIHpvbmUgTk9UIE5VTEwsICIKKwkJCQkJIiAgXCJBY2NvdW50aW5nLVJlY29yZC1UeXBlXCIgaW50ZWdlciwgIgorCQkJCQkiICBcIlNlc3Npb24tSWRcIiBieXRlYSwgIgorCQkJCQkiICBcIkFjY291bnRpbmctUmVjb3JkLU51bWJlclwiIGludGVnZXIsICIKKwkJCQkJIiAgXCJSb3V0ZS1SZWNvcmQxXCIgYnl0ZWEsICIKKwkJCQkJIiAgXCJSb3V0ZS1SZWNvcmQyXCIgYnl0ZWEsICIKKwkJCQkJIiAgXCJSb3V0ZS1SZWNvcmQzXCIgYnl0ZWEsICIKKwkJCQkJIiAgXCJSb3V0ZS1SZWNvcmQ0XCIgYnl0ZWEgIgorCQkJCQkiKTsiCisJCQkJKTsKKwkJQ0hFQ0soIFBHUkVTX0NPTU1BTkRfT0ssIFBRcmVzdWx0U3RhdHVzKHJlcykgKTsKKwkJUFFjbGVhcihyZXMpOworCX0KKwkKKwkvKiBPSywgd2UgYXJlIHJlYWR5IHRvIHRlc3Qgbm93LiBDcmVhdGUgYW4gQUNSIG1lc3NhZ2UgdGhhdCB3aWxsIHBhc3MgdGhlIEFCTkYgY2hlY2sgKi8KKwl7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGQgPSBOVUxMOworCQlzdHJ1Y3QgYXZwICphdnAgPSBOVUxMOworCQl1bmlvbiBhdnBfdmFsdWUgYXZwX3ZhbDsKKworCQkvKiBOb3cgZmluZCB0aGUgQUNSIGRpY3Rpb25hcnkgb2JqZWN0ICovCisJCUNIRUNLKCAwLCBmZF9kaWN0X3NlYXJjaCAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIkFjY291bnRpbmctUmVxdWVzdCIsICZkLCBFTk9FTlQgKSApOworCisJCS8qIENyZWF0ZSB0aGUgaW5zdGFuY2UgKi8KKwkJQ0hFQ0soIDAsIGZkX21zZ19uZXcgKCBkLCBNU0dGTF9BTExPQ19FVEVJRCwgJm1zZyApICk7CisJCQorCQkvKiBBcHAgaWQgKi8KKwkJeworCQkJc3RydWN0IG1zZ19oZHIgKiBoOworCQkJQ0hFQ0soIDAsIGZkX21zZ19oZHIoIG1zZywgJmggKSApOworCQkJaC0+bXNnX2FwcGwgPSAzOworCQl9CisJCQorCQkvKiBzaWQgKi8KKwkJeworCQkJc3RydWN0IHNlc3Npb24gKiBzZXNzID0gTlVMTDsKKwkJCW9zMF90IHM7CisJCQlDSEVDSyggMCwgZmRfc2Vzc19uZXcoICZzZXNzLCBmZF9nX2NvbmZpZy0+Y25mX2RpYW1pZCwgZmRfZ19jb25maWctPmNuZl9kaWFtaWRfbGVuLCBOVUxMLCAwKSApOworCQkJQ0hFQ0soIDAsIGZkX3Nlc3NfZ2V0c2lkKHNlc3MsICZzLCAmc2Vzc19ia3BfbGVuKSApOworCQkJQ0hFQ0soIDEsIChzZXNzX2JrcCA9IG9zMGR1cChzLCBzZXNzX2JrcF9sZW4pKSA/IDEgOiAwKTsKKworCQkJQ0hFQ0soIDAsIGZkX2RpY3Rfc2VhcmNoICggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJTZXNzaW9uLUlkIiwgJmQsIEVOT0VOVCApICk7CisJCQlDSEVDSyggMCwgZmRfbXNnX2F2cF9uZXcgKCBkLCAwLCAmYXZwICkgKTsKKwkJCW1lbXNldCgmYXZwX3ZhbCwgMCwgc2l6ZW9mKGF2cF92YWwpKTsKKwkJCWF2cF92YWwub3MuZGF0YSA9IHNlc3NfYmtwOworCQkJYXZwX3ZhbC5vcy5sZW4gPSBzZXNzX2JrcF9sZW47CisJCQlDSEVDSyggMCwgZmRfbXNnX2F2cF9zZXR2YWx1ZSAoIGF2cCwgJmF2cF92YWwgKSApOworCQkJQ0hFQ0soIDAsIGZkX21zZ19hdnBfYWRkICggbXNnLCBNU0dfQlJXX0ZJUlNUX0NISUxELCBhdnApICk7CisJCX0KKwkJCisJCS8qIE9yaWdpbi0qICovCisJCUNIRUNLKCAwLCBmZF9tc2dfYWRkX29yaWdpbihtc2csIDEpICk7CisJCQorCQkvKiBEZXN0aW5hdGlvbi1SZWFsbSAqLworCQl7CisJCQlDSEVDSyggMCwgZmRfZGljdF9zZWFyY2ggKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIkRlc3RpbmF0aW9uLVJlYWxtIiwgJmQsIEVOT0VOVCApICk7CisJCQlDSEVDSyggMCwgZmRfbXNnX2F2cF9uZXcgKCBkLCAwLCAmYXZwICkgKTsKKwkJCW1lbXNldCgmYXZwX3ZhbCwgMCwgc2l6ZW9mKGF2cF92YWwpKTsKKwkJCWF2cF92YWwub3MuZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopZmRfZ19jb25maWctPmNuZl9kaWFtcmxtOworCQkJYXZwX3ZhbC5vcy5sZW4gPSBmZF9nX2NvbmZpZy0+Y25mX2RpYW1ybG1fbGVuOworCQkJQ0hFQ0soIDAsIGZkX21zZ19hdnBfc2V0dmFsdWUgKCBhdnAsICZhdnBfdmFsICkgKTsKKwkJCUNIRUNLKCAwLCBmZF9tc2dfYXZwX2FkZCAoIG1zZywgTVNHX0JSV19MQVNUX0NISUxELCBhdnApICk7CisJCX0KKwkJCisJCS8qIEFjY291bnRpbmctUmVjb3JkLVR5cGUgKi8KKwkJeworCQkJQ0hFQ0soIDAsIGZkX2RpY3Rfc2VhcmNoICggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJBY2NvdW50aW5nLVJlY29yZC1UeXBlIiwgJmQsIEVOT0VOVCApICk7CisJCQlDSEVDSyggMCwgZmRfbXNnX2F2cF9uZXcgKCBkLCAwLCAmYXZwICkgKTsKKwkJCW1lbXNldCgmYXZwX3ZhbCwgMCwgc2l6ZW9mKGF2cF92YWwpKTsKKwkJCWF2cF92YWwudTMyID0gMjsKKwkJCUNIRUNLKCAwLCBmZF9tc2dfYXZwX3NldHZhbHVlICggYXZwLCAmYXZwX3ZhbCApICk7CisJCQlDSEVDSyggMCwgZmRfbXNnX2F2cF9hZGQgKCBtc2csIE1TR19CUldfTEFTVF9DSElMRCwgYXZwKSApOworCQl9CisJCQorCQkvKiBBY2NvdW50aW5nLVJlY29yZC1OdW1iZXIgKi8KKwkJeworCQkJQ0hFQ0soIDAsIGZkX2RpY3Rfc2VhcmNoICggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJBY2NvdW50aW5nLVJlY29yZC1OdW1iZXIiLCAmZCwgRU5PRU5UICkgKTsKKwkJCUNIRUNLKCAwLCBmZF9tc2dfYXZwX25ldyAoIGQsIDAsICZhdnAgKSApOworCQkJbWVtc2V0KCZhdnBfdmFsLCAwLCBzaXplb2YoYXZwX3ZhbCkpOworCQkJYXZwX3ZhbC51MzIgPSAyOworCQkJQ0hFQ0soIDAsIGZkX21zZ19hdnBfc2V0dmFsdWUgKCBhdnAsICZhdnBfdmFsICkgKTsKKwkJCUNIRUNLKCAwLCBmZF9tc2dfYXZwX2FkZCAoIG1zZywgTVNHX0JSV19MQVNUX0NISUxELCBhdnApICk7CisJCX0KKwkJCisJCS8qIFJvdXRlLVJlY29yZCAqLworCQl7CisJCQlDSEVDSyggMCwgZmRfZGljdF9zZWFyY2ggKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIlJvdXRlLVJlY29yZCIsICZkLCBFTk9FTlQgKSApOworCQkJQ0hFQ0soIDAsIGZkX21zZ19hdnBfbmV3ICggZCwgMCwgJmF2cCApICk7CisJCQltZW1zZXQoJmF2cF92YWwsIDAsIHNpemVvZihhdnBfdmFsKSk7CisJCQlhdnBfdmFsLm9zLmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSJwZWVyMSI7CisJCQlhdnBfdmFsLm9zLmxlbiA9IHN0cmxlbigoY2hhciAqKWF2cF92YWwub3MuZGF0YSk7CisJCQlDSEVDSyggMCwgZmRfbXNnX2F2cF9zZXR2YWx1ZSAoIGF2cCwgJmF2cF92YWwgKSApOworCQkJQ0hFQ0soIDAsIGZkX21zZ19hdnBfYWRkICggbXNnLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCkgKTsKKwkJCQorCQkJQ0hFQ0soIDAsIGZkX21zZ19hdnBfbmV3ICggZCwgMCwgJmF2cCApICk7CisJCQltZW1zZXQoJmF2cF92YWwsIDAsIHNpemVvZihhdnBfdmFsKSk7CisJCQlhdnBfdmFsLm9zLmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSJwZWVyMiI7CisJCQlhdnBfdmFsLm9zLmxlbiA9IHN0cmxlbigoY2hhciAqKWF2cF92YWwub3MuZGF0YSk7CisJCQlDSEVDSyggMCwgZmRfbXNnX2F2cF9zZXR2YWx1ZSAoIGF2cCwgJmF2cF92YWwgKSApOworCQkJQ0hFQ0soIDAsIGZkX21zZ19hdnBfYWRkICggbXNnLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCkgKTsKKwkJfQorCQkKKwkJLyogU291cmNlICovCisJCUNIRUNLKCAwLCBmZF9tc2dfc291cmNlX3NldCggbXNnLCAicGVlcjMiLCBDT05TVFNUUkxFTigicGVlcjMiKSApICk7CisJCUNIRUNLKCAwLCBmZF9tc2dfc291cmNlX3NldHJyKCBtc2csICJwZWVyMyIsIENPTlNUU1RSTEVOKCJwZWVyMyIpLCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QgKSApOworCX0KKwkKKwkvKiBOb3csIGhhdmUgdGhlIGRhZW1vbiBoYW5kbGUgdGhpcyAqLworCUNIRUNLKCAwLCBmZF9maWZvX3Bvc3QoZmRfZ19pbmNvbWluZywgJm1zZykgKTsKKwkKKwkvKiBJdCBpcyBwaWNrZWQgYnkgdGhlIGRpc3BhdGNoIG1vZHVsZSwgdGhlIGV4dGVuc2lvbiBoYW5kbGVzIHRoZSBxdWVyeSwgaW5zZXJ0cyB0aGUgcmVjb3JkcyBpbiB0aGUgREIsIHNlbmQgY3JlYXRlcyB0aGUgYW5zd2VyLgorCSAgIE9uY2UgdGhlIGFuc3dlciBpcyByZWFkeSwgaXQgaXMgc2VudCB0byAicGVlcjMiIHdoaWNoIGlzIG5vdCBhdmFpbGFibGUgb2YgY291cnNlOyB0aGVuIHRoZSBtZXNzYWdlIGlzIHNpbXBseSBkZXN0cm95ZWQuCisJICAgV2Ugd2FpdCAxIHNlY29uZCBmb3IgdGhpcyB0byBoYXBwZW4uLi4gKi8KKwlzbGVlcCgxKTsKKwkKKwkvKiBOb3csIGNoZWNrIHRoZSByZWNvcmQgd2FzIGFjdHVhbGx5IHJlZ2lzdGVyZWQgcHJvcGVybHkgKi8KKwl7CisJCVBHcmVzdWx0ICogcmVzOworCQl1aW50OF90ICogYnM7CisJCWNoYXIgKiBlczsKKwkJc2l6ZV90IGw7CisJCQorCQlyZXMgPSBQUWV4ZWMoY29ubiwgIlNFTEVDVCBcIlNlc3Npb24tSWRcIiBmcm9tICIgVEFCTEUgIjsiKTsKKwkJQ0hFQ0soIFBHUkVTX1RVUExFU19PSywgUFFyZXN1bHRTdGF0dXMocmVzKSApOworCQkKKwkJLyogV2UgYWxzbyBjaGVjayB0aGF0IHRoZSBTZXNzaW9uLUlkIHdlIHJldHJpZXZlIGlzIHRoZSBzYW1lIGFzIHdoYXQgd2UgZ2VuZXJhdGVkIGVhcmxpZXIgKG5vdCB0cmFzaGVkIGluIHRoZSBwcm9jZXNzKSAqLworCQllcyA9IFBRZ2V0dmFsdWUocmVzLCAwLCAwKTsKKwkJYnMgPSBQUXVuZXNjYXBlQnl0ZWEoKHVpbnQ4X3QgKillcywgJmwpOworCQkKKwkJQ0hFQ0soIDAsIGZkX29zX2NtcChicywgbCwgc2Vzc19ia3AsIHNlc3NfYmtwX2xlbikgKTsKKwkJCisJCVBRY2xlYXIocmVzKTsKKwkJUFFmcmVlbWVtKGJzKTsKKwl9ICAKKworCS8qIFRoYXQncyBhbGwgZm9yIHRoZSB0ZXN0cyB5ZXQgKi8KKwlmcmVlKHNlc3NfYmtwKTsKKwkKKwlQQVNTVEVTVCgpOworfSAKKwkKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RjbnguYyBiL3Rlc3RzL3Rlc3RjbnguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTgyNmM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdGNueC5jCkBAIC0wLDAgKzEsMjAwOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTMsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAidGVzdHMuaCIKKworI2lmbmRlZiBURVNUX1BPUlQKKyNkZWZpbmUgVEVTVF9QT1JUCTM4NjgKKyNlbmRpZiAvKiBURVNUX1BPUlQgKi8KKworI2lmbmRlZiBOQl9TVFJFQU1TCisjZGVmaW5lIE5CX1NUUkVBTVMJMTAKKyNlbmRpZiAvKiBOQl9TVFJFQU1TICovCisKKyNpZm5kZWYgR05VVExTX0RFRkFVTFRfUFJJT1JJVFkKKyMgZGVmaW5lIEdOVVRMU19ERUZBVUxUX1BSSU9SSVRZICJOT1JNQUwiCisjZW5kaWYgLyogR05VVExTX0RFRkFVTFRfUFJJT1JJVFkgKi8KKworI2lmbmRlZiBHTlVUTFNfREVGQVVMVF9ESEJJVFMKKyMgZGVmaW5lIEdOVVRMU19ERUZBVUxUX0RIQklUUyAxMDI0CisjZW5kaWYgLyogR05VVExTX0RFRkFVTFRfREhCSVRTICovCisKKworLyogVGhlIGNyeXB0b2dyYXBoaWMgZGF0YSAqLworc3RhdGljIGNoYXIgY2FfZGF0YVtdID0JCSItLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS1cbiIKKwkJCQkiTUlJRXFqQ0NBNUtnQXdJQkFnSUpBTktnRHdkbERZUURNQTBHQ1NxR1NJYjNEUUVCQlFVQU1JR1VNUXN3Q1FZRFxuIgorCQkJCSJWUVFHRXdKS1VERU9NQXdHQTFVRUNBd0ZWRzlyZVc4eEVEQU9CZ05WQkFjTUIwdHZaMkZ1WldreERUQUxCZ05WXG4iCisJCQkJIkJBb01CRmRKUkVVeER6QU5CZ05WQkFzTUJrRkJRU0JYUnpFZk1CMEdBMVVFQXd3V1kyaGhkbkp2ZFhndVkyOTNcbiIKKwkJCQkiWVdSa2FXTjBMbTl5WnpFaU1DQUdDU3FHU0liM0RRRUpBUllUYzJSbFkzVm5hWE5BYm1samRDNW5ieTVxY0RBZVxuIgorCQkJCSJGdzB3T1RFd01EVXdPRFV4TkRSYUZ3MHhPVEV3TURNd09EVXhORFJhTUlHVU1Rc3dDUVlEVlFRR0V3SktVREVPXG4iCisJCQkJIk1Bd0dBMVVFQ0F3RlZHOXJlVzh4RURBT0JnTlZCQWNNQjB0dloyRnVaV2t4RFRBTEJnTlZCQW9NQkZkSlJFVXhcbiIKKwkJCQkiRHpBTkJnTlZCQXNNQmtGQlFTQlhSekVmTUIwR0ExVUVBd3dXWTJoaGRuSnZkWGd1WTI5M1lXUmthV04wTG05eVxuIgorCQkJCSJaekVpTUNBR0NTcUdTSWIzRFFFSkFSWVRjMlJsWTNWbmFYTkFibWxqZEM1bmJ5NXFjRENDQVNJd0RRWUpLb1pJXG4iCisJCQkJImh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTTVjNnc0Tm5uZ1R2R05XY0p6Ym8wS2tscCtrdlVOUU5nR3VcbiIKKwkJCQkibXl2ejgyNnFQcDA3SFRTeUpySWNnRm51WURSME5kMTMwT3Q5dTVvc3FwUWhIVHZvbHhERTg3VGlpOGkzaEpTalxuIgorCQkJCSJUVFk5SzBad0diNEFaNlFrdXlNWFMxanRPWTY1N0hxanBHWnFULzJTeWgwaTdkTS9ocVNYRncwU1BieXErVzFIXG4iCisJCQkJIlNWRldhMUNUa1B5d0ZXQXp3ZHI1V0thaDc3dVoxZHhXcWdQZ1VkY1pPaUlRdExScDVuM2ZnNDBOd3NvNVlkd1NcbiIKKwkJCQkiNjQrZWJCWDFwa2hyQ1E4QUdjOE82MUVwMUpUWGNPN2pxUW1QZ3pqaU4rRmVvc3RJMURwNzNTM01xbGVUQUhqUlxuIgorCQkJCSJocVo3N1ZGN25rcm9NTTlidE1ISkJheG5md2MyZXdVTFVKd251T2lHV3J2TXEvOVo0SjhDQXdFQUFhT0IvRENCXG4iCisJCQkJIitUQWRCZ05WSFE0RUZnUVVrcXBWbjdOM2dtaUo3WDV6UTJia2krN3F2NFV3Z2NrR0ExVWRJd1NCd1RDQnZvQVVcbiIKKwkJCQkia3FwVm43TjNnbWlKN1g1elEyYmtpKzdxdjRXaGdacWtnWmN3Z1pReEN6QUpCZ05WQkFZVEFrcFFNUTR3REFZRFxuIgorCQkJCSJWUVFJREFWVWIydDViekVRTUE0R0ExVUVCd3dIUzI5bllXNWxhVEVOTUFzR0ExVUVDZ3dFVjBsRVJURVBNQTBHXG4iCisJCQkJIkExVUVDd3dHUVVGQklGZEhNUjh3SFFZRFZRUUREQlpqYUdGMmNtOTFlQzVqYjNkaFpHUnBZM1F1YjNKbk1TSXdcbiIKKwkJCQkiSUFZSktvWklodmNOQVFrQkZoTnpaR1ZqZFdkcGMwQnVhV04wTG1kdkxtcHdnZ2tBMHFBUEIyVU5oQU13REFZRFxuIgorCQkJCSJWUjBUQkFVd0F3RUIvekFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBSnkwWExrOGo4WUxTVHQyL1ZNeTlUQVV4XG4iCisJCQkJImVzWFVpWmowVW5nK2drcjdBMUswTm53WXhEekcyYWRNaGYxM3VwSG95ZHUyRXJMTW1ENkY3N3grUXVZL3E3bmNcbiIKKwkJCQkiWnZPMHR2Y29BUDZUb1NEd2l5cFU1ZG5UbW5ma2d3Vnd6RmtOQ2kxc0dSb3NFbThjL2MvOE1mSzBJMG5WZGoxL1xuIgorCQkJCSJCSWtJRzd0VERWaTlKdmtXWWwwVWxTS1dUWktybnRWd0Ntc2NmQzAyREdiK0dvTGJPOStRbWlOTTVZM3lPWVo0XG4iCisJCQkJIlBjN1NTb0tMTDByd0pCbXBQTnM3Ym9Zc3dlZVN1Q0FWdTBzaFJmZ0M5MG9kWGNlajJFTjVFVGZDdVUxZXZYTldcbiIKKwkJCQkiNWNBK3pac0RLL25XSnd4QmFXMEN4QUhYNTc5RkVsRldsSzQrQm56aFpSZERobUpEbk41ZGg0ZWtKR002TGc9PVxuIgorCQkJCSItLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tXG4iOworCQkJCQorLyogQ2xpZW50OgorCQkJCUNlcnRpZmljYXRlOgorCQkJCSAgICBEYXRhOgorICAgICAgICAJCQkJVmVyc2lvbjogMyAoMHgyKQorICAgICAgICAJCQkJU2VyaWFsIE51bWJlcjogNSAoMHg1KQorICAgICAgICAJCQkJU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIAkJCQlJc3N1ZXI6IEM9SlAsIFNUPVRva3lvLCBMPUtvZ2FuZWksIE89V0lERSwgT1U9QUFBIFdHLCBDTj1jaGF2cm91eC5jb3dhZGRpY3Qub3JnL2VtYWlsQWRkcmVzcz1zZGVjdWdpc0BuaWN0LmdvLmpwCisgICAgICAgIAkJCQlWYWxpZGl0eQorICAgICAgICAJCQkJICAgIE5vdCBCZWZvcmU6IE9jdCAyNyAwNDowNDowNSAyMDA5IEdNVAorICAgICAgICAJCQkJICAgIE5vdCBBZnRlciA6IE9jdCAyNSAwNDowNDowNSAyMDE5IEdNVAorICAgICAgICAJCQkJU3ViamVjdDogQz1KUCwgU1Q9VG9reW8sIEw9S29nYW5laSwgTz1XSURFLCBPVT1BQUEgV0csIENOPWNsaWVudC50ZXN0L2VtYWlsQWRkcmVzcz1jbGllbnRAdGVzdAorICAgICAgICAJCQkJU3ViamVjdCBQdWJsaWMgS2V5IEluZm86CisgICAgICAgIAkJCQkgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgCQkJCSAgICBSU0EgUHVibGljIEtleTogKDEwMjQgYml0KQorICAgICAgICAgICAgICAgIAkJCQlNb2R1bHVzICgxMDI0IGJpdCk6CisgICAgICAgICAgICAgICAgCQkJCSAgICAwMDpiZDplYjo1MDoxZTo5ZDo3YTpjZDo5ZDpiYjplNzpiYzo0ZTozODo0YToKKyAgICAgICAgICAgICAgICAJCQkJICAgIGIyOmNjOjllOmI0Ojg5Ojc3OjAxOmVmOmQxOmM2OjE5OjI5OjAwOmZlOmNlOgorICAgICAgICAgICAgICAgIAkJCQkgICAgM2M6NjI6MDU6MTM6YjE6OGM6ZmY6MzE6N2E6MGY6YzE6MmU6NGI6M2M6MGM6CisgICAgICAgICAgICAgICAgCQkJCSAgICA0MDoxZTozNjo0ZTo3NjpkYTowYTo2NDo0MzpmYzoxZTplYTowYzo5NzpiMjoKKyAgICAgICAgICAgICAgICAJCQkJICAgIDU3OjljOjljOjhjOjkwOmJkOmViOjIzOjdiOmI4OmI3OjVjOjAzOmVkOjZmOgorICAgICAgICAgICAgICAgIAkJCQkgICAgNDg6NTU6OGE6ODg6MDg6Mzg6YzU6Y2Q6MzM6Yjc6YWI6YTg6M2E6NmY6N2Y6CisgICAgICAgICAgICAgICAgCQkJCSAgICAxMzoxMDo2NTphNTo1MDpiOTpmNDo4YjpjYzoyZTplOTo3OTo1ODphNjoxMToKKyAgICAgICAgICAgICAgICAJCQkJICAgIGYwOjU4OjQ1OjQxOmVmOjM2OmIzOjM1OmNiOjE0OmVjOjgyOjBjOmFkOjExOgorICAgICAgICAgICAgICAgIAkJCQkgICAgNmE6ZWE6NjQ6ZWY6Mjg6YTI6NmU6NDc6NDUKKyAgICAgICAgICAgICAgICAJCQkJRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgICAgICAJCQkJWDUwOXYzIGV4dGVuc2lvbnM6CisgICAgICAgIAkJCQkgICAgWDUwOXYzIEJhc2ljIENvbnN0cmFpbnRzOiAKKyAgICAgICAgICAgICAgICAJCQkJQ0E6RkFMU0UKKyAgICAgICAgCQkJCSAgICBOZXRzY2FwZSBDb21tZW50OiAKKyAgICAgICAgICAgICAgICAJCQkJT3BlblNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUKKyAgICAgICAgCQkJCSAgICBYNTA5djMgU3ViamVjdCBLZXkgSWRlbnRpZmllcjogCisgICAgICAgICAgICAgICAgCQkJCUJFOkIzOjg5OjRGOjlEOjhGOjZDOjIwOkM0OkQwOjNFOjZBOjA1OjExOjgyOjUwOjU0OjQ5OjcwOkEyCisgICAgICAgIAkJCQkgICAgWDUwOXYzIEF1dGhvcml0eSBLZXkgSWRlbnRpZmllcjogCisgICAgICAgICAgICAgICAgCQkJCWtleWlkOjkyOkFBOjU1OjlGOkIzOjc3OjgyOjY4Ojg5OkVEOjdFOjczOjQzOjY2OkU0OjhCOkVFOkVBOkJGOjg1CisKKwkJCQkgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIAkJCQlhMzo4ODpmNToxNTpiNTphZDoyMDo2MDphMTo4NToxOTozZjpiOTo1ZToxZTpiZTozMTo3ZjoKKyAgICAgICAgCQkJCTg0OjdhOmMyOjE4OjNhOjYzOjZhOjY3OjFmOjQ2Ojg2OjRkOjEwOmQ2OjFkOmFkOmEyOmM4OgorICAgICAgICAJCQkJMGI6OTU6MzM6ZmE6ZTQ6MDU6ZjQ6Yjg6NzA6MzQ6Nzc6Zjc6ODU6NmU6NzA6NDY6YWM6Mzk6CisgICAgICAgIAkJCQk1NDphOTo1ZjplYTo1ZTpkMTozMzpiYjpjOTphMzo0Mjo4MTo0MTo5MDoyNTpiNTo5Mjo4YjoKKyAgICAgICAgCQkJCWU4OjZlOjNlOjk3OjA2OmRkOjlhOmNjOjI5OjYxOjM0OjVhOmQzOjFjOjVkOmFkOmQxOmEzOgorICAgICAgICAJCQkJZWI6NmE6NDc6YjQ6ZDA6YzI6MTc6ODk6ZTE6ZTI6MmQ6MzY6MTg6NTA6MWE6ZTc6ZDQ6ZmM6CisgICAgICAgIAkJCQkzODoyZTo0NzowYjozOTo1MDo4NzoyZjphYTowNzo2NDpmODo5YTo0ZDo0NzowMTpkYToxMDoKKyAgICAgICAgCQkJCWQ4Ojk3OmM3OmE2OjEzOmJjOjBlOmNhOjYzOmMxOmYyOjA5OmZiOmY4OjZhOmE0OjVmOjA4OgorICAgICAgICAJCQkJYjU6YWQ6ZWQ6NGY6NzE6Yjk6ODk6N2Y6NDM6Mjc6ODU6NzI6ZTc6OGQ6YTg6NGE6Y2M6ZjY6CisgICAgICAgIAkJCQkzNjpjYTo4YTphZTo4MjpiNTphODo0Mjo0MTo5OTo4Nzo4NDo3YzpmMDo5MDpmZDpjYTo5NjoKKyAgICAgICAgCQkJCTM3OmEyOmUwOmQ5OmZhOmRkOmE0OmM5OmYxOjUwOmI3OmU1OmU2OjhmOmFmOjgzOjhjOjIzOgorICAgICAgICAJCQkJYjY6MjA6Y2M6NjY6ZTM6MDg6NjA6MTM6MDI6OGY6NDI6M2E6MDc6OTE6YTc6Mzg6YjI6NzI6CisgICAgICAgIAkJCQkxNjpmZDpiZDphOTo2MDpmMDplMjo5ZjoyMzpmMzpjMDo5OTplMzoxNzpiYzowMDo3YzpiMzoKKyAgICAgICAgCQkJCTg5OjljOmVhOmZhOjNlOmY2OjY5OmExOjk4OmMyOmVjOjQ2OmRhOjcwOmI2OmY5OmMzOjkzOgorICAgICAgICAJCQkJYTc6ZmM6MzY6ZGQKKyovCitzdGF0aWMgY2hhciBjbGllbnRfY2VydF9kYXRhW10gPSItLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS1cbiIKKwkJCQkiTUlJRGlUQ0NBbkdnQXdJQkFnSUJCVEFOQmdrcWhraUc5dzBCQVFVRkFEQ0JsREVMTUFrR0ExVUVCaE1DU2xBeFxuIgorCQkJCSJEakFNQmdOVkJBZ01CVlJ2YTNsdk1SQXdEZ1lEVlFRSERBZExiMmRoYm1WcE1RMHdDd1lEVlFRS0RBUlhTVVJGXG4iCisJCQkJIk1ROHdEUVlEVlFRTERBWkJRVUVnVjBjeEh6QWRCZ05WQkFNTUZtTm9ZWFp5YjNWNExtTnZkMkZrWkdsamRDNXZcbiIKKwkJCQkiY21jeElqQWdCZ2txaGtpRzl3MEJDUUVXRTNOa1pXTjFaMmx6UUc1cFkzUXVaMjh1YW5Bd0hoY05NRGt4TURJM1xuIgorCQkJCSJNRFF3TkRBMVdoY05NVGt4TURJMU1EUXdOREExV2pDQmdURUxNQWtHQTFVRUJoTUNTbEF4RGpBTUJnTlZCQWdNXG4iCisJCQkJIkJWUnZhM2x2TVJBd0RnWURWUVFIREFkTGIyZGhibVZwTVEwd0N3WURWUVFLREFSWFNVUkZNUTh3RFFZRFZRUUxcbiIKKwkJCQkiREFaQlFVRWdWMGN4RkRBU0JnTlZCQU1NQzJOc2FXVnVkQzUwWlhOME1Sb3dHQVlKS29aSWh2Y05BUWtCRmd0alxuIgorCQkJCSJiR2xsYm5SQWRHVnpkRENCbnpBTkJna3Foa2lHOXcwQkFRRUZBQU9CalFBd2dZa0NnWUVBdmV0UUhwMTZ6WjI3XG4iCisJCQkJIjU3eE9PRXF5eko2MGlYY0I3OUhHR1NrQS9zNDhZZ1VUc1l6L01Yb1B3UzVMUEF4QUhqWk9kdG9LWkVQOEh1b01cbiIKKwkJCQkibDdKWG5KeU1rTDNySTN1NHQxd0Q3VzlJVllxSUNEakZ6VE8zcTZnNmIzOFRFR1dsVUxuMGk4d3U2WGxZcGhId1xuIgorCQkJCSJXRVZCN3phek5jc1U3SUlNclJGcTZtVHZLS0p1UjBVQ0F3RUFBYU43TUhrd0NRWURWUjBUQkFJd0FEQXNCZ2xnXG4iCisJCQkJImhrZ0JodmhDQVEwRUh4WWRUM0JsYmxOVFRDQkhaVzVsY21GMFpXUWdRMlZ5ZEdsbWFXTmhkR1V3SFFZRFZSME9cbiIKKwkJCQkiQkJZRUZMNnppVStkajJ3Z3hOQSthZ1VSZ2xCVVNYQ2lNQjhHQTFVZEl3UVlNQmFBRkpLcVZaK3pkNEpvaWUxK1xuIgorCQkJCSJjME5tNUl2dTZyK0ZNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUNqaVBVVnRhMGdZS0dGR1QrNVhoNitNWCtFXG4iCisJCQkJImVzSVlPbU5xWng5R2hrMFExaDJ0b3NnTGxUUDY1QVgwdUhBMGQvZUZibkJHckRsVXFWL3FYdEV6dThtalFvRkJcbiIKKwkJCQkia0NXMWtvdm9iajZYQnQyYXpDbGhORnJUSEYydDBhUHJha2UwME1JWGllSGlMVFlZVUJybjFQdzRMa2NMT1ZDSFxuIgorCQkJCSJMNm9IWlBpYVRVY0IyaERZbDhlbUU3d095bVBCOGduNytHcWtYd2kxcmUxUGNibUpmME1uaFhMbmphaEt6UFkyXG4iCisJCQkJInlvcXVncldvUWtHWmg0Ujg4SkQ5eXBZM291RFordDJreWZGUXQrWG1qNitEakNPMklNeG00d2hnRXdLUFFqb0hcbiIKKwkJCQkia2FjNHNuSVcvYjJwWVBEaW55UHp3Sm5qRjd3QWZMT0puT3I2UHZacG9aakM3RWJhY0xiNXc1T24vRGJkXG4iCisJCQkJIi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS1cbiI7CitzdGF0aWMgY2hhciBjbGllbnRfcHJpdl9kYXRhW10gPSItLS0tLUJFR0lOIFJTQSBQUklWQVRFIEtFWS0tLS0tXG4iCisJCQkJIk1JSUNYZ0lCQUFLQmdRQzk2MUFlblhyTm5idm52RTQ0U3JMTW5yU0pkd0h2MGNZWktRRCt6anhpQlJPeGpQOHhcbiIKKwkJCQkiZWcvQkxrczhERUFlTms1MjJncGtRL3dlNmd5WHNsZWNuSXlRdmVzamU3aTNYQVB0YjBoVmlvZ0lPTVhOTTdlclxuIgorCQkJCSJxRHB2ZnhNUVphVlF1ZlNMekM3cGVWaW1FZkJZUlVIdk5yTTF5eFRzZ2d5dEVXcnFaTzhvb201SFJRSURBUUFCXG4iCisJCQkJIkFvR0JBSVluc09MUGJ5M0xuQzVuOEFFSGt5SERnZGdRdnNkL01TWVl0dUZISVpSRDdkTmZ1K3hoUXJ1OVRkdk9cbiIKKwkJCQkiODRQajdLMDcvRmN6UnVjM2dVbXU2d0J2L1VJUDlUbzE1UkhaaCsvbjUzN255Ykd1czVTNElZS1Z2YXA0NzdUb1xuIgorCQkJCSIwclFEZjllYzI3aXc3N2d4Yjdtb1E5T3R1eHdidjBoMForMUVWTEk4ZDhqSE9xMEJBa0VBOVlOcjBSKzdLWEJTXG4iCisJCQkJIjQ4eVQ0M2c1SHBPRmtUWnpOWFdWZHBTdllHbmViNTZ3c2xrNUVhdHAyMzVJNHV6L2E3UmVqNXY5OVcwTTNuU2VcbiIKKwkJCQkiL0FnSGZZbjc1UUpCQU1ZSC9wQngvV2tyTGorcFBhQVJsTndJbkNJQzV6VWhyNkIwSUtDdDJ0dnk1ZXl1YzVzZFxuIgorCQkJCSJBb1RGYVUrY1NJK1pxc1J6WThqTUtrb25rdHhCZzQ4b0orRUNRUUN0NEF0bHFjRlZrYlZDbThwSkdRWHEvN05pXG4iCisJCQkJInFsdGhpd3IxVmt2MlRrUTRiUHphOHBHV1QvM0NjMmVQUHlXTjA4bjhqdytHMTFwNzJjQVc0bURicWZONUFrRUFcbiIKKwkJCQkibU5ZS3JraUxuK05ucWxKZjhXNGdTVUdMM3VRR3RZYnVHUlFIS251RGNrV2hGbTM5WXpXY2dBUXNKdmtqTjFFTlxuIgorCQkJCSI3dGh2cHNXTHpmZUU3T0RUUEdWdGdRSkFUT2J4WUpPdDZybXMzZkFTdHd1WFczRVQ3N1RBMWphNFhzVUVlNVl1XG4iCisJCQkJIkpwY1FPcnVKYjlYd25kcXpOYkwwZFNVZVBiOWdGaUJDR0tZT3lyZU5UVFJUbXc9PVxuIgorCQkJCSItLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLVxuIjsKKwkJCQkKKy8qIFNlcnZlcjoKKwkJCQlDZXJ0aWZpY2F0ZToKKwkJCQkgICAgRGF0YToKKyAgICAgICAgCQkJCVZlcnNpb246IDMgKDB4MikKKyAgICAgICAgCQkJCVNlcmlhbCBOdW1iZXI6IDQgKDB4NCkKKyAgICAgICAgCQkJCVNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICAJCQkJSXNzdWVyOiBDPUpQLCBTVD1Ub2t5bywgTD1Lb2dhbmVpLCBPPVdJREUsIE9VPUFBQSBXRywgQ049Y2hhdnJvdXguY293YWRkaWN0Lm9yZy9lbWFpbEFkZHJlc3M9c2RlY3VnaXNAbmljdC5nby5qcAorICAgICAgICAJCQkJVmFsaWRpdHkKKyAgICAgICAgCQkJCSAgICBOb3QgQmVmb3JlOiBPY3QgMjcgMDQ6MDM6MzkgMjAwOSBHTVQKKyAgICAgICAgCQkJCSAgICBOb3QgQWZ0ZXIgOiBPY3QgMjUgMDQ6MDM6MzkgMjAxOSBHTVQKKyAgICAgICAgCQkJCVN1YmplY3Q6IEM9SlAsIFNUPVRva3lvLCBMPUtvZ2FuZWksIE89V0lERSwgT1U9QUFBIFdHLCBDTj1zZXJ2LnRlc3QvZW1haWxBZGRyZXNzPXNlcnZAdGVzdAorICAgICAgICAJCQkJU3ViamVjdCBQdWJsaWMgS2V5IEluZm86CisgICAgICAgIAkJCQkgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgCQkJCSAgICBSU0EgUHVibGljIEtleTogKDEwMjQgYml0KQorICAgICAgICAgICAgICAgIAkJCQlNb2R1bHVzICgxMDI0IGJpdCk6CisgICAgICAgICAgICAgICAgCQkJCSAgICAwMDphNjpmNzoxYzphOTo5MDo1YjpmYTpjODpmNjphMzowNDowYzpkMDo4YjoKKyAgICAgICAgICAgICAgICAJCQkJICAgIDQ1OmMzOjkwOmY3OjJkOmMyOmM5OmQ3OmJkOjY2OjhhOjdjOjFjOjUxOjg5OgorICAgICAgICAgICAgICAgIAkJCQkgICAgNDA6OWU6Y2Q6NzA6NTc6Y2I6MDA6NDc6YTM6ZTg6NzY6OGI6MDA6YjM6Yzk6CisgICAgICAgICAgICAgICAgCQkJCSAgICBjMzowZDpiMTpiOToyYTowODo5Zjo1Mjo5Mjo4MjpkMzoxODpjMTpkODpkMToKKyAgICAgICAgICAgICAgICAJCQkJICAgIGI4OjFlOmZkOjcxOmZlOjIzOmVjOjE5OmU5OjZkOjlkOmZkOmFlOjg4OmJjOgorICAgICAgICAgICAgICAgIAkJCQkgICAgMzk6NDQ6N2E6Mzc6YWQ6YzY6ODg6ZDE6NjQ6N2M6YjE6ZDQ6M2M6YTk6MzA6CisgICAgICAgICAgICAgICAgCQkJCSAgICBjNDpkZTo1MTowMjpjNDo0ODo0ZjoyNTozZToyZjo5MzphZToyNTozMjo2NjoKKyAgICAgICAgICAgICAgICAJCQkJICAgIDlhOmRjOmY0OjQ0OjQ1OmZmOjdmOjEyOjQ5Ojk3OjBkOjAxOjhkOjEzOjlhOgorICAgICAgICAgICAgICAgIAkJCQkgICAgZDM6OGY6OWU6MmQ6NjI6OTU6MDI6MGE6YzcKKyAgICAgICAgICAgICAgICAJCQkJRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgICAgICAJCQkJWDUwOXYzIGV4dGVuc2lvbnM6CisgICAgICAgIAkJCQkgICAgWDUwOXYzIEJhc2ljIENvbnN0cmFpbnRzOiAKKyAgICAgICAgICAgICAgICAJCQkJQ0E6RkFMU0UKKyAgICAgICAgCQkJCSAgICBOZXRzY2FwZSBDb21tZW50OiAKKyAgICAgICAgICAgICAgICAJCQkJT3BlblNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUKKyAgICAgICAgCQkJCSAgICBYNTA5djMgU3ViamVjdCBLZXkgSWRlbnRpZmllcjogCisgICAgICAgICAgICAgICAgCQkJCTBDOjMzOkM0OjdGOjM5OkQwOjM0OkZGOkY4OjYxOkExOjQ2OjhCOjQ5OjFEOkEzOjU3OkIzOjREOjU4CisgICAgICAgIAkJCQkgICAgWDUwOXYzIEF1dGhvcml0eSBLZXkgSWRlbnRpZmllcjogCisgICAgICAgICAgICAgICAgCQkJCWtleWlkOjkyOkFBOjU1OjlGOkIzOjc3OjgyOjY4Ojg5OkVEOjdFOjczOjQzOjY2OkU0OjhCOkVFOkVBOkJGOjg1CisKKwkJCQkgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIAkJCQk4NzpmNTo0OTphNjowNDpmOTo5ODo5YTpmMToxYTo2ODpjZTowNjphZTo0YzowYzowODplYjoKKyAgICAgICAgCQkJCWJhOjk4OmU3OjNmOmRmOjIyOjdmOjM1Ojg4OjFkOmI3OjhhOmYzOjg5OmEzOjY4OjBkOjUzOgorICAgICAgICAJCQkJNDU6ZWI6MjM6YTE6ZGQ6NmI6ZGM6YjA6ODA6NTg6MGM6MTA6MGI6NDk6NzQ6ZWE6YTg6YjY6CisgICAgICAgIAkJCQk4YzoyZTpjNjo3MzpkYzo3YTo3NDpjNzo1OTozZTo3OTo1YTpkMjo1YzoxNTowYjpmMTpkODoKKyAgICAgICAgCQkJCTE5OjM3OjJhOmMwOjIyOjc1OjEwOjNmOjRjOmU5OmExOmUwOmViOmIyOjllOjA5OjcwOjNkOgorICAgICAgICAJCQkJMmE6NGM6ZmU6OWM6OTk6MzY6NGI6YWE6NmM6ZTE6OGI6OWM6YWE6ZTE6Mjk6MWY6NDk6NmI6CisgICAgICAgIAkJCQkxNDpkYjoxMjphZTpjZjo2ODo0YTpkZDowMzplMTozYjphZDo3OTpiNDo1NDo4NDoxZDpiYjoKKyAgICAgICAgCQkJCWFjOjQ1OmM0Ojg1OmYxOjAzOjY1OjY1Ojk2OjIzOmFlOmU3Ojk3OjNjOjVjOmRiOmNlOjU1OgorICAgICAgICAJCQkJMzQ6NWQ6YzM6NzM6ZWM6Y2Q6ZjY6MGY6YTU6ODE6NWY6YzI6YWI6YTM6NDI6ZmE6MzY6N2Y6CisgICAgICAgIAkJCQk4MzplZjpkYjowZjpjZDo2MjowYjplYTpkOTo0Zjo3MzozNTo2ODo1ZjoyMzpkNTowYTpiZToKKyAgICAgICAgCQkJCWZmOjdmOjIzOjlhOmFmOjBkOmE1OmY4OjNlOjNhOmYwOjYzOjFjOmUxOmQyOjk2OjgxOmNmOgorICAgICAgICAJCQkJN2I6NWE6NmI6ZDA6OWI6Njc6NTY6OWU6YWE6YTk6ZTg6ZjE6NmM6ZmI6NTQ6MmI6MWE6ZjQ6CisgICAgICAgIAkJCQllZjoxNjo1YTpiZToxZDphOTpjODpkNjpjYzpmNzo0Mjo4YzpmZTo4MzoyYzo4NDo4Yzo4MDoKKyAgICAgICAgCQkJCWZiOjFjOjg4OmY2OjM1OjFjOmFlOjQzOjcyOmZhOjY4OjMwOjljOjI1OjhiOmRiOjJjOjg0OgorICAgICAgICAJCQkJODc6NzY6OWQ6YjkKKyovCitzdGF0aWMgY2hhciBzZXJ2ZXJfY2VydF9kYXRhW10gPSItLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS1cbiIKKwkJCQkiTUlJRGhEQ0NBbXlnQXdJQkFnSUJCREFOQmdrcWhraUc5dzBCQVFVRkFEQ0JsREVMTUFrR0ExVUVCaE1DU2xBeFxuIgorCQkJCSJEakFNQmdOVkJBZ01CVlJ2YTNsdk1SQXdEZ1lEVlFRSERBZExiMmRoYm1WcE1RMHdDd1lEVlFRS0RBUlhTVVJGXG4iCisJCQkJIk1ROHdEUVlEVlFRTERBWkJRVUVnVjBjeEh6QWRCZ05WQkFNTUZtTm9ZWFp5YjNWNExtTnZkMkZrWkdsamRDNXZcbiIKKwkJCQkiY21jeElqQWdCZ2txaGtpRzl3MEJDUUVXRTNOa1pXTjFaMmx6UUc1cFkzUXVaMjh1YW5Bd0hoY05NRGt4TURJM1xuIgorCQkJCSJNRFF3TXpNNVdoY05NVGt4TURJMU1EUXdNek01V2pCOU1Rc3dDUVlEVlFRR0V3SktVREVPTUF3R0ExVUVDQXdGXG4iCisJCQkJIlZHOXJlVzh4RURBT0JnTlZCQWNNQjB0dloyRnVaV2t4RFRBTEJnTlZCQW9NQkZkSlJFVXhEekFOQmdOVkJBc01cbiIKKwkJCQkiQmtGQlFTQlhSekVTTUJBR0ExVUVBd3dKYzJWeWRpNTBaWE4wTVJnd0ZnWUpLb1pJaHZjTkFRa0JGZ2x6WlhKMlxuIgorCQkJCSJRSFJsYzNRd2daOHdEUVlKS29aSWh2Y05BUUVCQlFBRGdZMEFNSUdKQW9HQkFLYjNIS21RVy9ySTlxTUVETkNMXG4iCisJCQkJIlJjT1E5eTNDeWRlOVpvcDhIRkdKUUo3TmNGZkxBRWVqNkhhTEFMUEp3dzJ4dVNvSW4xS1NndE1Zd2RqUnVCNzlcbiIKKwkJCQkiY2Y0ajdCbnBiWjM5cm9pOE9VUjZONjNHaU5Ga2ZMSFVQS2t3eE41UkFzUklUeVUrTDVPdUpUSm1tdHowUkVYL1xuIgorCQkJCSJmeEpKbHcwQmpST2EwNCtlTFdLVkFnckhBZ01CQUFHamV6QjVNQWtHQTFVZEV3UUNNQUF3TEFZSllJWklBWWI0XG4iCisJCQkJIlFnRU5CQjhXSFU5d1pXNVRVMHdnUjJWdVpYSmhkR1ZrSUVObGNuUnBabWxqWVhSbE1CMEdBMVVkRGdRV0JCUU1cbiIKKwkJCQkiTThSL09kQTAvL2hob1VhTFNSMmpWN05OV0RBZkJnTlZIU01FR0RBV2dCU1NxbFdmczNlQ2FJbnRmbk5EWnVTTFxuIgorCQkJCSI3dXEvaFRBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQWgvVkpwZ1Q1bUpyeEdtak9CcTVNREFqcnVwam5QOThpXG4iCisJCQkJImZ6V0lIYmVLODRtamFBMVRSZXNqb2QxcjNMQ0FXQXdRQzBsMDZxaTJqQzdHYzl4NmRNZFpQbmxhMGx3VkMvSFlcbiIKKwkJCQkiR1RjcXdDSjFFRDlNNmFIZzY3S2VDWEE5S2t6K25KazJTNnBzNFl1Y3F1RXBIMGxyRk5zU3JzOW9TdDBENFR1dFxuIgorCQkJCSJlYlJVaEIyN3JFWEVoZkVEWldXV0k2N25senhjMjg1Vk5GM0RjK3pOOWcrbGdWL0NxNk5DK2paL2crL2JEODFpXG4iCisJCQkJIkMrclpUM00xYUY4ajFRcSsvMzhqbXE4TnBmZytPdkJqSE9IU2xvSFBlMXByMEp0blZwNnFxZWp4YlB0VUt4cjBcbiIKKwkJCQkiN3haYXZoMnB5TmJNOTBLTS9vTXNoSXlBK3h5STlqVWNya055K21nd25DV0wyeXlFaDNhZHVRPT1cbiIKKwkJCQkiLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLVxuIjsKK3N0YXRpYyBjaGFyIHNlcnZlcl9wcml2X2RhdGFbXSA9Ii0tLS0tQkVHSU4gUlNBIFBSSVZBVEUgS0VZLS0tLS1cbiIKKwkJCQkiTUlJQ1hRSUJBQUtCZ1FDbTl4eXBrRnY2eVBhakJBelFpMFhEa1BjdHdzblh2V2FLZkJ4UmlVQ2V6WEJYeXdCSFxuIgorCQkJCSJvK2gyaXdDenljTU5zYmtxQ0o5U2tvTFRHTUhZMGJnZS9YSCtJK3daNlcyZC9hNkl2RGxFZWpldHhvalJaSHl4XG4iCisJCQkJIjFEeXBNTVRlVVFMRVNFOGxQaStUcmlVeVpwcmM5RVJGLzM4U1NaY05BWTBUbXRPUG5pMWlsUUlLeHdJREFRQUJcbiIKKwkJCQkiQW9HQVp2M0RkbTBQNzlDTEl0OWFzRUZZMVZ2VXZTdU1xa0d3d1BmeDEvSGNKSmtCRllhcE00Zk4yMkcvR3lmM1xuIgorCQkJCSI0N2lmU1doc0x0a2xUZVhWblZNd1NoMTRkSmFKUXVTRW5hRm5VVVdmamlSYkVBWFpuTUZ3QUlpYXN6RVpiUGFwXG4iCisJCQkJIk5VTnBjR2wwNkZacnBoWUFNa2pPVlVmakNqZk9aREF2TDRKR3BvMjcxWng0bDBFQ1FRRFlvRkZRcEJDUHgwUEtcbiIKKwkJCQkiVFdVbXZhdFhJL0Ftbzk0WGtHZm9mYmRlZUk4UGlBSkJPNVVJNnJtampJVndzSndPOWRRYi9JbFAxL09uQmVKdlxuIgorCQkJCSJwOVlXNXVpeEFrRUF4VkFPS3U3bXBHdTBRL0syaUVVVVlEWDlZSGYyNTNrZ2tkSURGNGlaazRUY2Vjam94dXJ1XG4iCisJCQkJImZJV3U5ZE10eURWVitIVDJYNGNORW5PMS9vUzNrSklJOXdKQkFKa2R3RHdpcXo0bFY2by95Rlo0ekFvYzhkc3VcbiIKKwkJCQkiQ29aWFlNcTVTWW94NXRUUWl0OTI4T0hMbjRtVmdxQmpoUHNpRVZueXgwK3pVWnBtRTJaZW1IbTVueEVDUUhmRVxuIgorCQkJCSJGQlZ6VllSUDYrZWlsN0UzWFJyWktxYzNxaUx1bnhwa0E0UnhZZWJ0S25heHdMbWRPSTFWQjlJbkVROEpjTm1UXG4iCisJCQkJIkJVa096Sng2cCttSjNYSmZjaGtDUVFEV21iTVlZSmFqc2psUzRZcGRVVWo3Y0JTb3RBNnZ0a05WSEZyMC9hay9cbiIKKwkJCQkiUyt0TGtNTnVydWFJbldpeksrQktZVElKTGxRRGY1dTVOVHJ3NDF2eWU1SHZcbiIKKwkJCQkiLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS1cbiI7CisKKy8qIEV4cGlyZWQ6CisJCQkJQ2VydGlmaWNhdGU6CisJCQkJICAgIERhdGE6CisgICAgICAgIAkJCQlWZXJzaW9uOiAzICgweDIpCisgICAgICAgIAkJCQlTZXJpYWwgTnVtYmVyOiA2ICgweDYpCisgICAgICAgIAkJCQlTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgCQkJCUlzc3VlcjogQz1KUCwgU1Q9VG9reW8sIEw9S29nYW5laSwgTz1XSURFLCBPVT1BQUEgV0csIENOPWNoYXZyb3V4LmNvd2FkZGljdC5vcmcvZW1haWxBZGRyZXNzPXNkZWN1Z2lzQG5pY3QuZ28uanAKKyAgICAgICAgCQkJCVZhbGlkaXR5CisgICAgICAgIAkJCQkgICAgTm90IEJlZm9yZTogT2N0IDI3IDA0OjA2OjM1IDIwMDkgR01UCisgICAgICAgIAkJCQkgICAgTm90IEFmdGVyIDogT2N0IDI4IDA0OjA2OjM1IDIwMDkgR01UCisgICAgICAgIAkJCQlTdWJqZWN0OiBDPUpQLCBTVD1Ub2t5bywgTD1Lb2dhbmVpLCBPPVdJREUsIE9VPUFBQSBXRywgQ049ZXhwaXJlZC50ZXN0L2VtYWlsQWRkcmVzcz1leHBpcmVkQHRlc3QKKyAgICAgICAgCQkJCVN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAJCQkJICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgIAkJCQkgICAgUlNBIFB1YmxpYyBLZXk6ICgxMDI0IGJpdCkKKyAgICAgICAgICAgICAgICAJCQkJTW9kdWx1cyAoMTAyNCBiaXQpOgorICAgICAgICAgICAgICAgIAkJCQkgICAgMDA6ZTM6MTc6MTU6NTQ6ODU6ZGM6Y2Y6Yzc6YTA6MzI6NGE6NDk6N2Q6NTU6CisgICAgICAgICAgICAgICAgCQkJCSAgICA3NTo5YjoyOToxNTpkYjo3ZTo4NzoxNzpkOTowZTo2NTo0NDo1MzpkNzoxOToKKyAgICAgICAgICAgICAgICAJCQkJICAgIDM3OjI3OmM3OmM2OmZlOmM2OmRjOjcyOjJiOmRjOjg2OjFhOmZmOjI0OjZjOgorICAgICAgICAgICAgICAgIAkJCQkgICAgNjM6M2Y6NzU6OWM6MGE6MTQ6ZTE6NzA6MDY6Nzk6ZDQ6Yjk6MjY6ZDQ6Njg6CisgICAgICAgICAgICAgICAgCQkJCSAgICA0YzoyODozODpiYTozNDo2MDo1NjowMjozZDo5NDo1NTo0YToxZjo0ZTo1YToKKyAgICAgICAgICAgICAgICAJCQkJICAgIGYwOmE1OjcxOjRjOjNlOjcxOjY5OjM5OmFkOmJjOmFhOjU1OjM1OmZiOjczOgorICAgICAgICAgICAgICAgIAkJCQkgICAgNWI6NWY6NmM6MzA6NzE6OGU6OGE6YjY6YTU6MDY6Y2M6ZWU6ZGQ6Mjk6Yzc6CisgICAgICAgICAgICAgICAgCQkJCSAgICA1MjowZDphNzo5YzowZjphMTpiYTo1MjoxMTplMjoxYjpiOTo3NDo2YjowODoKKyAgICAgICAgICAgICAgICAJCQkJICAgIDg3OjExOmQyOmVjOmE5OmFjOjYzOjYzOjRmCisgICAgICAgICAgICAgICAgCQkJCUV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICAgICAgCQkJCVg1MDl2MyBleHRlbnNpb25zOgorICAgICAgICAJCQkJICAgIFg1MDl2MyBCYXNpYyBDb25zdHJhaW50czogCisgICAgICAgICAgICAgICAgCQkJCUNBOkZBTFNFCisgICAgICAgIAkJCQkgICAgTmV0c2NhcGUgQ29tbWVudDogCisgICAgICAgICAgICAgICAgCQkJCU9wZW5TU0wgR2VuZXJhdGVkIENlcnRpZmljYXRlCisgICAgICAgIAkJCQkgICAgWDUwOXYzIFN1YmplY3QgS2V5IElkZW50aWZpZXI6IAorICAgICAgICAgICAgICAgIAkJCQkxQzpBRjo2Njo0Mjo1QjpBRDpBQTpBNTo5QjpEOTpBRTozQTpDMTo1QTpBQzoyRjpDQzpDRToyMjo2QworICAgICAgICAJCQkJICAgIFg1MDl2MyBBdXRob3JpdHkgS2V5IElkZW50aWZpZXI6IAorICAgICAgICAgICAgICAgIAkJCQlrZXlpZDo5MjpBQTo1NTo5RjpCMzo3Nzo4Mjo2ODo4OTpFRDo3RTo3Mzo0Mzo2NjpFNDo4QjpFRTpFQTpCRjo4NQorCisJCQkJICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICAJCQkJNjA6OGY6NTU6NTU6NTk6ODI6MGY6NjQ6Y2I6Yjg6MTE6Yzg6NDQ6Y2U6YmY6Njk6MDc6MGQ6CisgICAgICAgIAkJCQliZTpjMjozNDpiZTo0Mjo2YTo3ODoxNTozOTo5ZjpiZTo4YToxNzpkNjo0Mzo0MjpjOTo3YzoKKyAgICAgICAgCQkJCWYxOjZkOjVkOmFhOmMzOjFiOjRkOmIwOmYwOmI2OjczOjQ2OjJhOjg3OmNkOjU1OjU2OmEzOgorICAgICAgICAJCQkJNmQ6Y2M6ZGU6YTg6Mjg6NmE6NTM6ODU6OWU6ZTU6Njg6Yjc6M2M6ZjU6NzI6MTM6N2I6ZDA6CisgICAgICAgIAkJCQkyMTpmMjo5MTo0OTozNTplMDozNzoxZToyODoxOTpkNToxYjpjYzplMTozMjoxZTo3ZjpiMDoKKyAgICAgICAgCQkJCTg2OmRmOjQzOmE0OjQ3OjBmOjI5OjBiOmViOjUxOjYwOjlhOmY1OmNhOjUwOmY0OjJkOjU5OgorICAgICAgICAJCQkJY2Q6ZmM6NTA6OWQ6Mjk6ZWQ6NDU6OTg6ZGU6YTI6NWM6ZDE6YjU6N2E6MzQ6YWQ6N2E6NzM6CisgICAgICAgIAkJCQk0ODo4YjphMjo5Yjo4OTo4ZTo0YToyZToyYTowNDoxOTpkNjo2Mjo2YTowZDpmMDo5NjpmMjoKKyAgICAgICAgCQkJCWYwOmQwOjIyOjc3OjNiOjdmOmIxOjJhOmY0OjNiOjE3OjQ3OjVlOjM4OjA3OjA5OjY1OmFkOgorICAgICAgICAJCQkJMWQ6ZWE6NDY6Njk6NmE6OTY6YjY6NmI6M2I6NWM6Y2M6NmU6MzA6ZDc6Y2I6NTM6Njk6NTk6CisgICAgICAgIAkJCQljMjo2Mzo3ODoyYjowMzpkNDpkNDpmNzoxNzoyOTo5OTo5YTo0MzpmZjo3ODowYTphZjo0MjoKKyAgICAgICAgCQkJCWM1OmIzOjhkOjA5OjM4OjViOjMwOjcwOjI4OmMxOjk3OmFiOmZkOjdmOjg3OjlhOmVjOmYyOgorICAgICAgICAJCQkJOTc6NDQ6ZmY6ZjU6Yjk6NDE6MzA6ZDE6YzY6MzI6OTg6Njk6MzQ6YzQ6Mzk6MzA6NmY6ZTI6CisgICAgICAgIAkJCQlkMzpiMjo3MDo5Nzo2NjplZTo0MTpmNTphZTowZjowOTpmMDplZDo2MDo5Njo2NzphOTo4YToKKyAgICAgICAgCQkJCWNkOmQ2Ojk1OmYyCisqLworc3RhdGljIGNoYXIgZXhwaXJlZF9jZXJ0X2RhdGFbXT0iLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tXG4iCisJCQkJIk1JSURpekNDQW5PZ0F3SUJBZ0lCQmpBTkJna3Foa2lHOXcwQkFRVUZBRENCbERFTE1Ba0dBMVVFQmhNQ1NsQXhcbiIKKwkJCQkiRGpBTUJnTlZCQWdNQlZSdmEzbHZNUkF3RGdZRFZRUUhEQWRMYjJkaGJtVnBNUTB3Q3dZRFZRUUtEQVJYU1VSRlxuIgorCQkJCSJNUTh3RFFZRFZRUUxEQVpCUVVFZ1YwY3hIekFkQmdOVkJBTU1GbU5vWVhaeWIzVjRMbU52ZDJGa1pHbGpkQzV2XG4iCisJCQkJImNtY3hJakFnQmdrcWhraUc5dzBCQ1FFV0UzTmtaV04xWjJselFHNXBZM1F1WjI4dWFuQXdIaGNOTURreE1ESTNcbiIKKwkJCQkiTURRd05qTTFXaGNOTURreE1ESTRNRFF3TmpNMVdqQ0JnekVMTUFrR0ExVUVCaE1DU2xBeERqQU1CZ05WQkFnTVxuIgorCQkJCSJCVlJ2YTNsdk1SQXdEZ1lEVlFRSERBZExiMmRoYm1WcE1RMHdDd1lEVlFRS0RBUlhTVVJGTVE4d0RRWURWUVFMXG4iCisJCQkJIkRBWkJRVUVnVjBjeEZUQVRCZ05WQkFNTURHVjRjR2x5WldRdWRHVnpkREViTUJrR0NTcUdTSWIzRFFFSkFSWU1cbiIKKwkJCQkiWlhod2FYSmxaRUIwWlhOME1JR2ZNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0R05BRENCaVFLQmdRRGpGeFZVaGR6UFxuIgorCQkJCSJ4NkF5U2tsOVZYV2JLUlhiZm9jWDJRNWxSRlBYR1Rjbng4Yit4dHh5Szl5R0d2OGtiR00vZFp3S0ZPRndCbm5VXG4iCisJCQkJInVTYlVhRXdvT0xvMFlGWUNQWlJWU2g5T1d2Q2xjVXcrY1drNXJieXFWVFg3YzF0ZmJEQnhqb3EycFFiTTd0MHBcbiIKKwkJCQkieDFJTnA1d1BvYnBTRWVJYnVYUnJDSWNSMHV5cHJHTmpUd0lEQVFBQm8zc3dlVEFKQmdOVkhSTUVBakFBTUN3R1xuIgorCQkJCSJDV0NHU0FHRytFSUJEUVFmRmgxUGNHVnVVMU5NSUVkbGJtVnlZWFJsWkNCRFpYSjBhV1pwWTJGMFpUQWRCZ05WXG4iCisJCQkJIkhRNEVGZ1FVSEs5bVFsdXRxcVdiMmE0NndWcXNMOHpPSW13d0h3WURWUjBqQkJnd0ZvQVVrcXBWbjdOM2dtaUpcbiIKKwkJCQkiN1g1elEyYmtpKzdxdjRVd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFHQ1BWVlZaZ2c5a3k3Z1J5RVRPdjJrSFxuIgorCQkJCSJEYjdDTkw1Q2FuZ1ZPWisraWhmV1EwTEpmUEZ0WGFyREcwMnc4TFp6UmlxSHpWVldvMjNNM3Fnb2FsT0ZudVZvXG4iCisJCQkJInR6ejFjaE43MENIeWtVazE0RGNlS0JuVkc4emhNaDUvc0liZlE2UkhEeWtMNjFGZ212WEtVUFF0V2MzOFVKMHBcbiIKKwkJCQkiN1VXWTNxSmMwYlY2TksxNmMwaUxvcHVKamtvdUtnUVoxbUpxRGZDVzh2RFFJbmM3ZjdFcTlEc1hSMTQ0QndsbFxuIgorCQkJCSJyUjNxUm1scWxyWnJPMXpNYmpEWHkxTnBXY0pqZUNzRDFOVDNGeW1abWtQL2VBcXZRc1d6alFrNFd6QndLTUdYXG4iCisJCQkJInEvMS9oNXJzOHBkRS8vVzVRVERSeGpLWWFUVEVPVEJ2NHRPeWNKZG03a0gxcmc4SjhPMWdsbWVwaXMzV2xmST1cbiIKKwkJCQkiLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLVxuIjsKK3N0YXRpYyBjaGFyIGV4cGlyZWRfcHJpdl9kYXRhW109Ii0tLS0tQkVHSU4gUlNBIFBSSVZBVEUgS0VZLS0tLS1cbiIKKwkJCQkiTUlJQ1hnSUJBQUtCZ1FEakZ4VlVoZHpQeDZBeVNrbDlWWFdiS1JYYmZvY1gyUTVsUkZQWEdUY254OGIreHR4eVxuIgorCQkJCSJLOXlHR3Y4a2JHTS9kWndLRk9Gd0JublV1U2JVYUV3b09MbzBZRllDUFpSVlNoOU9XdkNsY1V3K2NXazVyYnlxXG4iCisJCQkJIlZUWDdjMXRmYkRCeGpvcTJwUWJNN3QwcHgxSU5wNXdQb2JwU0VlSWJ1WFJyQ0ljUjB1eXByR05qVHdJREFRQUJcbiIKKwkJCQkiQW9HQVN3UG9EdWk5WFlIVElHbTd4d1JBK2tWakxBT3ErcXkvL2FISmxFZUhHY1A3cjFQZnBITnF3SDRRaEdhdFxuIgorCQkJCSJqbHY2ZExZYkZsZDlUVkR3UzhBOFVCa1ZJUExXbkN5c2Q1dEYyQTRDNWFreDZvdVc2SGxpVy9KaGVZcmdsOEFWXG4iCisJCQkJIlBWZVIzYm05MVVibnBDMEFCVmx3ODdqcDFPdnlyNjBTdW80anNvSnorQ3lUYTJFQ1FRRDBMSldwbnduMWpJbFJcbiIKKwkJCQkiREdrTGk3RjNFNzBKSmNkaFRXekJqR0ZEK05hKy8yWk8wTUtMaEsrTzFXVWtLYTBvaStlNVAxSk9uR0lwVEk4Y1xuIgorCQkJCSJCSk9PNDE1UkFrRUE3aGF1YXBZdXFHSS9hdVNQSDgvbkZCNXoxRzk0UlR4bzJhNVRIS2NHNU1xUy84TjN1YkZqXG4iCisJCQkJImkyUFBTMGxFWVZqcW9IRXNaVXNNbkRtWHA2S0RLTUFmbndKQkFJcCtUMVVxTThmbXNtd2FFZXJPalJYeFNDTk1cbiIKKwkJCQkiSGs1K1Q5Vm4vak5Eak9wQWlwTGhyYmJjeDRiSVd0bXNHZDhKbTZGaTNSaGhjdnZoeExvcmpsWlplRUVDUVFDZlxuIgorCQkJCSJJYVBEODhzTm1sVWV3ZEx6aFViQ2lMUU1hZEN1SGZsS2ZSeHB5eTF0WUFRdVZGeENUZERseW5renJhMjVqdStLXG4iCisJCQkJIit2bWNYalA0ZXZuay9sYkJ0dCtyQWtFQWdPcjRBcGdzM25NcHBuZ1BWNXlGeDBORHFIMm44UGxFQU0xSWw0UXNcbiIKKwkJCQkiSXV1SzE4djBLd2xVR0FmRUVtQ2lOaDFlMXFrTG1EMENuSTJRallBamNMUVVodz09XG4iCisJCQkJIi0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tXG4iOworCisvKiBVbmtub3duIENBIGNlcnRpZmljYXRlIDoKKwkJCQlDZXJ0aWZpY2F0ZToKKwkJCQkgICAgRGF0YToKKyAgICAgICAgCQkJCVZlcnNpb246IDMgKDB4MikKKyAgICAgICAgCQkJCVNlcmlhbCBOdW1iZXI6IDEgKDB4MSkKKyAgICAgICAgCQkJCVNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICAJCQkJSXNzdWVyOiBDPUpQLCBTVD1Ub2t5bywgTD1Lb2dhbmVpLCBPPVdJREUsIE9VPUFBQSBXRywgQ049Y2hhdnJvdXguY293YWRkaWN0Lm9yZy9lbWFpbEFkZHJlc3M9c2RlY3VnaXNAbmljdC5nby5qcAorICAgICAgICAJCQkJVmFsaWRpdHkKKyAgICAgICAgCQkJCSAgICBOb3QgQmVmb3JlOiBPY3QgMjggMDg6MDQ6NDAgMjAwOSBHTVQKKyAgICAgICAgCQkJCSAgICBOb3QgQWZ0ZXIgOiBPY3QgMjggMDg6MDQ6NDAgMjAxMCBHTVQKKyAgICAgICAgCQkJCVN1YmplY3Q6IEM9SlAsIFNUPVRva3lvLCBMPUtvZ2FuZWksIE89V0lERSwgT1U9QUFBIFdHLCBDTj11bmtub3duLmNzL2VtYWlsQWRkcmVzcz11bmtub3duQGNhCisgICAgICAgIAkJCQlTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgCQkJCSAgICBQdWJsaWMgS2V5IEFsZ29yaXRobTogcnNhRW5jcnlwdGlvbgorICAgICAgICAJCQkJICAgIFJTQSBQdWJsaWMgS2V5OiAoMTAyNCBiaXQpCisgICAgICAgICAgICAgICAgCQkJCU1vZHVsdXMgKDEwMjQgYml0KToKKyAgICAgICAgICAgICAgICAJCQkJICAgIDAwOmU2OjNhOmQ1OjhhOjE0OmM4OjE1OmQwOmYwOjVjOjAzOmMzOmFmOjMzOgorICAgICAgICAgICAgICAgIAkJCQkgICAgNTE6MmM6MTc6Yjc6NjU6YWM6NDU6ZTg6NDg6MmQ6YWU6NzA6ZmQ6N2M6Nzk6CisgICAgICAgICAgICAgICAgCQkJCSAgICAzYTpjNzo4MDpjODo1MDo1MzpkMDoxOTpkODozYToyNjphODoxNjo0ZDo0YzoKKyAgICAgICAgICAgICAgICAJCQkJICAgIDA0OjE3OjA5OmRmOjY5OjliOjU5OjJiOjg5OmM4OmUwOjYwOmJiOjFkOjM3OgorICAgICAgICAgICAgICAgIAkJCQkgICAgODI6ZDI6M2Y6MTc6Mzk6Yzk6OGY6NWQ6NzY6ZTE6MGY6NmU6MDg6OWE6OGY6CisgICAgICAgICAgICAgICAgCQkJCSAgICAxNjo0YTplYTo4Mzo4NjpmOTpiZDoxNToxNDo1Njo2ODo4Nzo3OTowNTpmOToKKyAgICAgICAgICAgICAgICAJCQkJICAgIDVmOjY2OjExOmJkOjIyOjQ2OjI2OjY0OmJlOjU3OjE2OjUxOjY2OjQxOjUwOgorICAgICAgICAgICAgICAgIAkJCQkgICAgYWM6ZjI6YjE6Y2E6ZDA6Mzg6MTE6NGI6NGM6YjI6ZWU6MjU6MzY6NmU6ZDM6CisgICAgICAgICAgICAgICAgCQkJCSAgICBiOTo2Mzo3MjpjNDo4NDo4MjoxYzoyYjoyNworICAgICAgICAgICAgICAgIAkJCQlFeHBvbmVudDogNjU1MzcgKDB4MTAwMDEpCisgICAgICAgIAkJCQlYNTA5djMgZXh0ZW5zaW9uczoKKyAgICAgICAgCQkJCSAgICBYNTA5djMgQmFzaWMgQ29uc3RyYWludHM6IAorICAgICAgICAgICAgICAgIAkJCQlDQTpGQUxTRQorICAgICAgICAJCQkJICAgIE5ldHNjYXBlIENvbW1lbnQ6IAorICAgICAgICAgICAgICAgIAkJCQlPcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZQorICAgICAgICAJCQkJICAgIFg1MDl2MyBTdWJqZWN0IEtleSBJZGVudGlmaWVyOiAKKyAgICAgICAgICAgICAgICAJCQkJQkE6NUE6OUQ6RDI6QjA6NEI6NzI6RDY6MUY6MDA6MTE6MEI6QjU6N0I6NTk6REY6MDg6Mzg6ODE6QkUKKyAgICAgICAgCQkJCSAgICBYNTA5djMgQXV0aG9yaXR5IEtleSBJZGVudGlmaWVyOiAKKyAgICAgICAgICAgICAgICAJCQkJa2V5aWQ6NTI6QzU6QTQ6NjM6Qjg6REI6QUM6RjI6OTI6MzQ6MkY6NzI6NTY6NzE6Qzg6MTE6OEU6NzY6RTY6REYKKworCQkJCSAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgCQkJCTkwOjhmOjNiOmJkOmUzOmExOmNhOjZhOjkyOmE2OmZkOmYwOjY0OmFlOjQ2OjgzOjMyOjM1OgorICAgICAgICAJCQkJNjE6ODA6NTc6OGI6MzA6MTI6NzA6MDI6ZTE6NTE6ZDk6ODc6Yzg6YWY6ZDk6NGI6Yjk6NmQ6CisgICAgICAgIAkJCQliZjphYjo4Njo1ZjoxOToxZjpkYzphZjo4NDo2NzpiZjozYzpiZjozMzpmMzo3YzpjNjo4MToKKyAgICAgICAgCQkJCTdiOmU0OmU5OjI2OjFkOmJjOmQ2OjhjOmFiOjcyOjk0OjdmOjg1OjMzOjk1OmQ5OjI0OmVjOgorICAgICAgICAJCQkJZmQ6N2I6ZDI6ZmQ6NTA6M2U6ZTU6NjE6NGY6NzU6NTE6YWU6YzY6NGE6ZWM6ZGY6Y2Y6YWE6CisgICAgICAgIAkJCQk3MzphNTowODpmNzpmMzo5YTo0MDo2Njo0ODpmMDo4ZTo5Yjo0MzpiMTozMDpmMzplMzpjODoKKyAgICAgICAgCQkJCTM2OjNmOjY4OjM2OjZhOjFjOmFhOjE2OjQwOjQ5OmI0OjczOjlhOjcxOmYxOjE3OjZjOjBiOgorICAgICAgICAJCQkJZDM6ZTE6YTc6Yjc6NDA6ZGU6MmM6M2M6MzY6N2M6ZDQ6ZGQ6ZDY6OTQ6Yzk6ZDc6NWY6ZjU6CisgICAgICAgIAkJCQlhZTozNTo1NjplODpjYzo2NTo5YzpiYjozZDplODo3YTpjYTowZTplZDo3ODowMzo0MTpjYjoKKyAgICAgICAgCQkJCWZkOjgwOjgxOmRlOmY5OmRlOmIyOjE0OjRiOjgxOjI0OjM2OmRlOjI5OmMxOjA2OjExOjg2OgorICAgICAgICAJCQkJOGM6YTk6YjA6MGM6Yzc6NTc6Y2Y6Nzk6YTc6M2E6ODQ6MGM6Mjc6ZGM6ODY6NmQ6Y2I6NDQ6CisgICAgICAgIAkJCQkyZDoyNjpkYzo3ZTpmYjoxNzpkNjpiMjozZDozMTowMzpkMzpmMTphYjo1ZDo5MTo1ZDo5NDoKKyAgICAgICAgCQkJCWU0Ojk0Ojg4OjcwOjk2OmIzOjdjOjBmOjE1OmZlOmM4OmM2OjRkOjk5OjM3OmFiOjA5OjBjOgorICAgICAgICAJCQkJZGE6YmE6YjY6MGU6ZmE6NWU6YmI6NGI6Y2U6MDQ6MjE6MDY6MDk6YTk6MmM6Mjc6ODY6NzY6CisgICAgICAgIAkJCQljYzplZTo3Mzo2ZgorKi8KK3N0YXRpYyBjaGFyIG5vdHJ1c3RfY2FfZGF0YVtdID0JIi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLVxuIgorCQkJCSJNSUlFcWpDQ0E1S2dBd0lCQWdJSkFQM1VNZ2hTbEg5UE1BMEdDU3FHU0liM0RRRUJCUVVBTUlHVU1Rc3dDUVlEXG4iCisJCQkJIlZRUUdFd0pLVURFT01Bd0dBMVVFQ0F3RlZHOXJlVzh4RURBT0JnTlZCQWNNQjB0dloyRnVaV2t4RFRBTEJnTlZcbiIKKwkJCQkiQkFvTUJGZEpSRVV4RHpBTkJnTlZCQXNNQmtGQlFTQlhSekVmTUIwR0ExVUVBd3dXWTJoaGRuSnZkWGd1WTI5M1xuIgorCQkJCSJZV1JrYVdOMExtOXlaekVpTUNBR0NTcUdTSWIzRFFFSkFSWVRjMlJsWTNWbmFYTkFibWxqZEM1bmJ5NXFjREFlXG4iCisJCQkJIkZ3MHdPVEV3TWpnd09EQXpORFJhRncweE9URXdNall3T0RBek5EUmFNSUdVTVFzd0NRWURWUVFHRXdKS1VERU9cbiIKKwkJCQkiTUF3R0ExVUVDQXdGVkc5cmVXOHhFREFPQmdOVkJBY01CMHR2WjJGdVpXa3hEVEFMQmdOVkJBb01CRmRKUkVVeFxuIgorCQkJCSJEekFOQmdOVkJBc01Ca0ZCUVNCWFJ6RWZNQjBHQTFVRUF3d1dZMmhoZG5KdmRYZ3VZMjkzWVdSa2FXTjBMbTl5XG4iCisJCQkJIlp6RWlNQ0FHQ1NxR1NJYjNEUUVKQVJZVGMyUmxZM1ZuYVhOQWJtbGpkQzVuYnk1cWNEQ0NBU0l3RFFZSktvWklcbiIKKwkJCQkiaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFMS1c5aVNVZ2dGNW1idlllMVhrMTI4Q3NmaWlqeCtmd0g1eVxuIgorCQkJCSJacVdySE50MFlHL3RaU3d5Q0RNV0JMWFRldVlzbnRnNXkwbWNwc3JOOHYwMnR2clBpQ3pEZlJQeXozbUc2OHVzXG4iCisJCQkJIkRQRUVnUTFrcUwyR3N0aTJEVWNzZHlaY0RNKzRyZ3NXUml2Z09UVnlvTmltdjVmK3hnbVBZb0Vsa2dlbEx3WktcbiIKKwkJCQkiV3hHdDFWQ2ViT3hQM3FaQTNoU0hXRTFoSmdMNHN2ZnVsN1JEMVBid1B6aWR4SktJVHlBaUpvUEtXUUE5Y2pTYVxuIgorCQkJCSJnVnpSUTdTNHZtWUFMSm43eGUrZE1GUmNmQUs4Uk12Ny9nSkY2Unc3enVmVzBESVpLOThLWnM2YUwwbG1NUFZrXG4iCisJCQkJImYzMU4ydXZuZGYrY2p5MG40bHV3RW9YWStUZUpaWTIwNWxid0hyelIwckg3NUZTbTBSc0NBd0VBQWFPQi9EQ0JcbiIKKwkJCQkiK1RBZEJnTlZIUTRFRmdRVVVzV2tZN2piclBLU05DOXlWbkhJRVk1MjV0OHdnY2tHQTFVZEl3U0J3VENCdm9BVVxuIgorCQkJCSJVc1drWTdqYnJQS1NOQzl5Vm5ISUVZNTI1dCtoZ1pxa2daY3dnWlF4Q3pBSkJnTlZCQVlUQWtwUU1RNHdEQVlEXG4iCisJCQkJIlZRUUlEQVZVYjJ0NWJ6RVFNQTRHQTFVRUJ3d0hTMjluWVc1bGFURU5NQXNHQTFVRUNnd0VWMGxFUlRFUE1BMEdcbiIKKwkJCQkiQTFVRUN3d0dRVUZCSUZkSE1SOHdIUVlEVlFRRERCWmphR0YyY205MWVDNWpiM2RoWkdScFkzUXViM0puTVNJd1xuIgorCQkJCSJJQVlKS29aSWh2Y05BUWtCRmhOelpHVmpkV2RwYzBCdWFXTjBMbWR2TG1wd2dna0EvZFF5Q0ZLVWYwOHdEQVlEXG4iCisJCQkJIlZSMFRCQVV3QXdFQi96QU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFDQU5vNklSM09RbFFhWEhKYXByVlZEdmxcbiIKKwkJCQkib01KQzBGUmJWQ0s1MDNzYm1XVEpMOThVcXhSZHNUWk5JTDA3Z1hsSzBvVUt5aU5paklYaUxHOGQ1SWxVckR4RlxuIgorCQkJCSJIL1ZzdTZzOGszL1BwQVVWZWlPMm95Z1dxdlU1Tkd2dDBqZzU0TXJPSktoWVlQV3J6Ym1IdHkrY0FYeW9Oek9SXG4iCisJCQkJIitXNVJYNkhSUWd4dlpXUXEyT2s0NlZYNjIyUjFuTmpGbUNCWVQ3STcvZ1dHK2hrYklBb0g2ZDlzVUxManBDK0JcbiIKKwkJCQkiYkkrTC9ON2FjOS9PZzhwR0lncFVJNjBHbjV6TzkzK0UrTmhnKzFCbGNESEduUUQ2dkZOczhMWXA1Q0NYL1pqMVxuIgorCQkJCSJ0V0ZWWFpueDU4b2RhVTNNNHQ5L1pRbmtaZHg5WUpJcm9FVGJOMFBvcWxuU2FnQmpnVXZiV3duNFlDb3RDQT09XG4iCisJCQkJIi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS1cbiI7CisJCQkJCitzdGF0aWMgY2hhciBub3RydXN0X2NlcnRfZGF0YVtdPSItLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS1cbiIKKwkJCQkiTUlJRGhqQ0NBbTZnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFVRkFEQ0JsREVMTUFrR0ExVUVCaE1DU2xBeFxuIgorCQkJCSJEakFNQmdOVkJBZ01CVlJ2YTNsdk1SQXdEZ1lEVlFRSERBZExiMmRoYm1WcE1RMHdDd1lEVlFRS0RBUlhTVVJGXG4iCisJCQkJIk1ROHdEUVlEVlFRTERBWkJRVUVnVjBjeEh6QWRCZ05WQkFNTUZtTm9ZWFp5YjNWNExtTnZkMkZrWkdsamRDNXZcbiIKKwkJCQkiY21jeElqQWdCZ2txaGtpRzl3MEJDUUVXRTNOa1pXTjFaMmx6UUc1cFkzUXVaMjh1YW5Bd0hoY05NRGt4TURJNFxuIgorCQkJCSJNRGd3TkRRd1doY05NVEF4TURJNE1EZ3dORFF3V2pCL01Rc3dDUVlEVlFRR0V3SktVREVPTUF3R0ExVUVDQXdGXG4iCisJCQkJIlZHOXJlVzh4RURBT0JnTlZCQWNNQjB0dloyRnVaV2t4RFRBTEJnTlZCQW9NQkZkSlJFVXhEekFOQmdOVkJBc01cbiIKKwkJCQkiQmtGQlFTQlhSekVUTUJFR0ExVUVBd3dLZFc1cmJtOTNiaTVqY3pFWk1CY0dDU3FHU0liM0RRRUpBUllLZFc1clxuIgorCQkJCSJibTkzYmtCallUQ0JuekFOQmdrcWhraUc5dzBCQVFFRkFBT0JqUUF3Z1lrQ2dZRUE1anJWaWhUSUZkRHdYQVBEXG4iCisJCQkJInJ6TlJMQmUzWmF4RjZFZ3RybkQ5ZkhrNng0RElVRlBRR2RnNkpxZ1dUVXdFRnduZmFadFpLNG5JNEdDN0hUZUNcbiIKKwkJCQkiMGo4WE9jbVBYWGJoRDI0SW1vOFdTdXFEaHZtOUZSUldhSWQ1QmZsZlpoRzlJa1ltWkw1WEZsRm1RVkNzOHJIS1xuIgorCQkJCSIwRGdSUzB5eTdpVTJidE81WTNMRWhJSWNLeWNDQXdFQUFhTjdNSGt3Q1FZRFZSMFRCQUl3QURBc0JnbGdoa2dCXG4iCisJCQkJImh2aENBUTBFSHhZZFQzQmxibE5UVENCSFpXNWxjbUYwWldRZ1EyVnlkR2xtYVdOaGRHVXdIUVlEVlIwT0JCWUVcbiIKKwkJCQkiRkxwYW5kS3dTM0xXSHdBUkM3VjdXZDhJT0lHK01COEdBMVVkSXdRWU1CYUFGRkxGcEdPNDI2enlralF2Y2xaeFxuIgorCQkJCSJ5QkdPZHViZk1BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQ1FqenU5NDZIS2FwS20vZkJrcmthRE1qVmhnRmVMXG4iCisJCQkJIk1CSndBdUZSMllmSXI5bEx1VzIvcTRaZkdSL2NyNFJudnp5L00vTjh4b0Y3NU9rbUhieldqS3R5bEgrRk01WFpcbiIKKwkJCQkiSk96OWU5TDlVRDdsWVU5MVVhN0dTdXpmejZwenBRajM4NXBBWmtqd2pwdERzVER6NDhnMlAyZzJhaHlxRmtCSlxuIgorCQkJCSJ0SE9hY2ZFWGJBdlQ0YWUzUU40c1BEWjgxTjNXbE1uWFgvV3VOVmJvekdXY3V6M29lc29PN1hnRFFjdjlnSUhlXG4iCisJCQkJIitkNnlGRXVCSkRiZUtjRUdFWWFNcWJBTXgxZlBlYWM2aEF3bjNJWnR5MFF0SnR4Kyt4ZldzajB4QTlQeHExMlJcbiIKKwkJCQkiWFpUa2xJaHdsck44RHhYK3lNWk5tVGVyQ1F6YXVyWU8rbDY3Uzg0RUlRWUpxU3duaG5iTTduTnZcbiIKKwkJCQkiLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLVxuIjsKK3N0YXRpYyBjaGFyIG5vdHJ1c3RfcHJpdl9kYXRhW109Ii0tLS0tQkVHSU4gUlNBIFBSSVZBVEUgS0VZLS0tLS1cbiIKKwkJCQkiTUlJQ1hRSUJBQUtCZ1FEbU90V0tGTWdWMFBCY0E4T3ZNMUVzRjdkbHJFWG9TQzJ1Y1AxOGVUckhnTWhRVTlBWlxuIgorCQkJCSIyRG9tcUJaTlRBUVhDZDlwbTFrcmljamdZTHNkTjRMU1B4YzV5WTlkZHVFUGJnaWFqeFpLNm9PRytiMFZGRlpvXG4iCisJCQkJImgza0YrVjltRWIwaVJpWmt2bGNXVVdaQlVLenlzY3JRT0JGTFRMTHVKVFp1MDdsamNzU0VnaHdySndJREFRQUJcbiIKKwkJCQkiQW9HQWVSZWMxU0dWRTVSdnQ1WHJTSzB2Rm9mcTJEbENFNmhURHBzeldGTFREYmU0cERkUkR5YmhmdytObTE1T1xuIgorCQkJCSJFR2dLOEJyYlRjRU12S2RrQXp2OVBPUWVMREU4SkltZ2VzSFpGeE4zam5rSytiNzYyQkdSRHQ1N0R6dk1Kc2ZqXG4iCisJCQkJIjFMQmxlK1VCblpCMUN2anJJTnZ1K3ROTVZQbFVwaklzdGJwTXEwRCtzMDEraWpFQ1FRRDhNSFR2L00rVWM4NnVcbiIKKwkJCQkiMVNGeXdncytlUVBROGcwT29UTHh6cW82WWhXOEZ0d0xqb1JDWngyVE5RUzVnWUJ1UXJpeGQveUUwU3BmdjlhU1xuIgorCQkJCSJVdGxBYU9jMUFrRUE2YlZ1ZmdnSFZIY2dpV3FTOENIemI2Zy9HUnhRaXhWc2hPc29WTE1rQ1N6MDR6bHdJZlhGXG4iCisJCQkJImMwM2hoNVJKVnY3am11Qm1oSGJheXVqTWd2aW53NzVvYXdKQVFiOW9YVUR0NVdnajFGVGdlWWk1WWJvdkVvUm9cbiIKKwkJCQkiZnczcnVEc0hDbDJVQ1F0MHB0YXJDSnpWaXhGaGYvT1JSaTNDOVJHeEZmZHFNcmhTK3FiNjJONEFtUUpCQUxZVVxuIgorCQkJCSJUMUJMaXdKb2lXWG1MVEovRVAwVjlJcm92MnVNdG01Y0U2RGhySnFsZHVrc3o4cjFndTdSWjN0TXNWTGc1SXkrXG4iCisJCQkJImRjQ1FKT2ZmTmE1NGNhUVVUWjhDUVFEVHMvNzBOcjZGNmt0cnRtdFUvUzdsSWl0cFFKQ3U5dS9TUHlCWVBtRlpcbiIKKwkJCQkiOUF4eTZFZTY2UGhwK2VXRE5QNExuNGF4cmFwRDA3MzJ3RDhEY21HRFZIaWpcbiIKKwkJCQkiLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS1cbiI7CisKKy8qIERpZmZpZS1IZWxsbWFuIHBhcmFtZXRlcnMsIGdlbmVyYXRlZCB3aXRoIEdOVVRMUyBjZXJ0dG9vbDoKK2NlcnR0b29sIC0tZ2VuZXJhdGUtZGgtcGFyYW1zCisJCQkJR2VuZXJhdG9yOiAwNgorCisJCQkJUHJpbWU6IGVhOmMzOjc1OjBiOjMyOmNmOmQ5OjE3Ojk4OjVjOmRhOmQxCisJCQkJCWUwOjFkOmI5OjdjOmJlOjI5OjYwOmIwOjZmOjY4OmE5OmY2CisJCQkJCThkOjc1OjA1OjU5OjY5OjA0OmFlOjM5OjdjOjJiOjc0OjA0CisJCQkJCTNjOmUyOmRhOjI4OjhhOjliOjkzOmFhOjY3OjA1OmE3OjNlCisJCQkJCTA2OjNlOjBkOjMxOjYzOjg4OjU1OmFkOjVhOmJkOjQxOjIyCisJCQkJCWI3OjU4OmE3OjQ1OmIzOmQ1OjAzOmFkOmRlOjNjOjhkOjY5CisJCQkJCTQyOmJmOjg0OjNkOmMxOjkwOmU3OjM5OjZhOjRiOjg3OjAxCisJCQkJCTE5OmU1OmYzOmE0OmU1OjhlOmUyOjQ1OmQ1OjBjOjZiOjE3CisJCQkJCTIyOjJiOjJlOjUwOjgzOjkxOjBjOjViOjgyOmZjOjcyOjI3CisJCQkJCTQ5OjNiOjlmOjI5OjExOjUzOmM3OjkwOmI4OjhkOjg3OjczCisJCQkJCTFhOjdiOjA1OmFiOmNiOjMwOjU5OjE2OjcxOjMwOjYwOjFiCisJCQkJCTRjOjgwOjE1OjNhOmEyOmQzOjQ3OmI3OjRhOjYxOmRlOjY0CisJCQkJCTdlOjc5OmRlOjg4OjUzOmI3OjdhOmM2OmEyOjlhOmJiOjU1CisJCQkJCTQwOjJkOjdhOjcxOmM3OjQxOmI1OjI5OmRmOmQ3OjVjOmZiCisJCQkJCTQyOmU0OmQ4OjVlOjBiOjk5OmQzOjNjOjkzOjBmOjMzOjUxCisJCQkJCThiOmY0OjYwOmU0OmM1OmI1OjU4OjIxOmMwOjUxOmM0OjQzCisJCQkJCTI1OjdjOjM3OmZlOjVjOmQzOjYyOjZjOjJhOmFmOmE3OjJhCisJCQkJCTgyOmQ1OmQzOmUyOmJiOjVkOmFkOjg0OjE1OmY2Ojc4OmQ5CisJCQkJCWQ1OmE4OmY3OmYwOjQ4OjVjOjhkOmUwOjNkOjA0OmFjOmNmCisJCQkJCWFhOjM0OjNmOjVkOmYyOjBkOjNkOmVlOmVjOmI4OmQ4OmU4CisJCQkJCWFkOmRjOmQzOjQwOjU5OmEwOmZkOjQ1OjYyOjQ3OjYzOmMwCisJCQkJCWJkOmY1OmRmOjhiCisqLworc3RhdGljIGNoYXIgZGhfcGFyYW1zX2RhdGFbXSA9ICAiLS0tLS1CRUdJTiBESCBQQVJBTUVURVJTLS0tLS1cbiIKKwkJCQkiTUlJQkNBS0NBUUVBNnNOMUN6TFAyUmVZWE5yUjRCMjVmTDRwWUxCdmFLbjJqWFVGV1drRXJqbDhLM1FFUE9MYVxuIgorCQkJCSJLSXFiazZwbkJhYytCajROTVdPSVZhMWF2VUVpdDFpblJiUFZBNjNlUEkxcFFyK0VQY0dRNXpscVM0Y0JHZVh6XG4iCisJCQkJInBPV080a1hWREdzWElpc3VVSU9SREZ1Qy9ISW5TVHVmS1JGVHg1QzRqWWR6R25zRnE4c3dXUlp4TUdBYlRJQVZcbiIKKwkJCQkiT3FMVFI3ZEtZZDVrZm5uZWlGTzNlc2FpbXJ0VlFDMTZjY2RCdFNuZjExejdRdVRZWGd1WjB6eVREek5SaS9SZ1xuIgorCQkJCSI1TVcxV0NIQVVjUkRKWHczL2x6VFltd3FyNmNxZ3RYVDRydGRyWVFWOW5qWjFhajM4RWhjamVBOUJLelBxalEvXG4iCisJCQkJIlhmSU5QZTdzdU5qb3JkelRRRm1nL1VWaVIyUEF2ZlhmaXdJQkJnPT1cbiIKKwkJCQkiLS0tLS1FTkQgREggUEFSQU1FVEVSUy0tLS0tXG4iOworCisKKy8qIExpc3Qgc2VydmVyIGVuZHBvaW50cyAqLworc3RhdGljIHN0cnVjdCBmZF9saXN0IGVwcyA9IEZEX0xJU1RfSU5JVElBTElaRVIoZXBzKTsKKworLyogUGFzcyBwYXJhbWV0ZXJzIHRvIHRoZSBjb25uZWN0IHRocmVhZCAqLworc3RydWN0IGNvbm5lY3RfZmxhZ3MgeworCWludAlwcm90bzsKKwlpbnQJZXhwZWN0X2ZhaWx1cmU7IC8qIDAgb3IgMSAqLworfTsKKworLyogQ2xpZW50J3Mgc2lkZSBvZiB0aGUgY29ubmVjdGlvbiBlc3RhYmxpc2hlZCBmcm9tIGEgc2VwYXJhdGUgdGhyZWFkICovCitzdGF0aWMgdm9pZCAqIGNvbm5lY3RfdGhyKHZvaWQgKiBhcmcpCit7CisJc3RydWN0IGNvbm5lY3RfZmxhZ3MgKiBjZiA9IGFyZzsKKwlzdHJ1Y3QgY254Y3R4ICogY254ID0gTlVMTDsKKwkKKwlmZF9sb2dfdGhyZWFkbmFtZSAoICJ0ZXN0Y254OmNvbm5lY3QiICk7CisJCisJLyogQ29ubmVjdCB0byB0aGUgc2VydmVyICovCisJc3dpdGNoIChjZi0+cHJvdG8pIHsKKwkJY2FzZSBJUFBST1RPX1RDUDoKKwkJCXsKKwkJCQlzdHJ1Y3QgZmRfZW5kcG9pbnQgKiBlcCA9IChzdHJ1Y3QgZmRfZW5kcG9pbnQgKikoZXBzLm5leHQpOworCQkJCWNueCA9IGZkX2NueF9jbGlfY29ubmVjdF90Y3AoICZlcC0+c2EsIHNTQWxlbigmZXAtPnNzKSApOworCQkJCUNIRUNLKCAxLCAoY254ID8gMSA6IDApIF4gY2YtPmV4cGVjdF9mYWlsdXJlICk7CisJCQl9CisJCQlicmVhazsKKyNpZm5kZWYgRElTQUJMRV9TQ1RQCisJCWNhc2UgSVBQUk9UT19TQ1RQOgorCQkJeworCQkJCWNueCA9IGZkX2NueF9jbGlfY29ubmVjdF9zY3RwKDAsIFRFU1RfUE9SVCwgJmVwcyk7CisJCQkJQ0hFQ0soIDEsIChjbnggPyAxIDogMCkgXiBjZi0+ZXhwZWN0X2ZhaWx1cmUgKTsKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmIC8qIERJU0FCTEVfU0NUUCAqLworCQlkZWZhdWx0OgorCQkJQ0hFQ0soIDAsIDEgKTsKKwl9CisJCisJLyogZXhpdCAqLworCXJldHVybiBjbng7Cit9CisKKy8qIFBhcmFtZXRlcnMgdG8gdGhlIGhhbmRzaGFrZSB0aHJlYWQgKi8KK3N0cnVjdCBoYW5kc2hha2VfZmxhZ3MgeworCXN0cnVjdCBjbnhjdHggKiBjbng7CisJZ251dGxzX2NlcnRpZmljYXRlX2NyZWRlbnRpYWxzX3QJY3JlZHM7CisJaW50IGFsZ287CisJaW50IHJldDsKK307CisKKy8qIEhhbmRzaGFrZSB0aGUgY2xpZW50J3Mgc2lkZSAqLworc3RhdGljIHZvaWQgKiBoYW5kc2hha2VfdGhyKHZvaWQgKiBhcmcpCit7CisJc3RydWN0IGhhbmRzaGFrZV9mbGFncyAqIGhmID0gYXJnOworCWZkX2xvZ190aHJlYWRuYW1lICggInRlc3Rjbng6aGFuZHNoYWtlIiApOworCWhmLT5yZXQgPSBmZF9jbnhfaGFuZHNoYWtlKGhmLT5jbngsIEdOVVRMU19DTElFTlQsIGhmLT5hbGdvLCBOVUxMLCBoZi0+Y3JlZHMpOworCXJldHVybiBOVUxMOworfQorCisvKiBUZXJtaW5hdGUgdGhlIGNsaWVudCdzIGNvbm5lY3Rpb24gc2lkZSAqLworc3RhdGljIHZvaWQgKiBkZXN0cm95X3Rocih2b2lkICogYXJnKQoreworCXN0cnVjdCBjbnhjdHggKiBjbnggPSBhcmc7CisJZmRfbG9nX3RocmVhZG5hbWUgKCAidGVzdGNueDpkZXN0cm95IiApOworCWZkX2NueF9kZXN0cm95KGNueCk7CisJcmV0dXJuIE5VTEw7Cit9CisJCisvKiBNYWluIHRlc3Qgcm91dGluZSAqLworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlnbnV0bHNfZGF0dW1fdCBjYSAJCT0geyAodWludDhfdCAqKWNhX2RhdGEsIAkJc2l6ZW9mKGNhX2RhdGEpIAkgIH07CisJZ251dGxzX2RhdHVtX3Qgc2VydmVyX2NlcnQgCT0geyAodWludDhfdCAqKXNlcnZlcl9jZXJ0X2RhdGEsIAlzaXplb2Yoc2VydmVyX2NlcnRfZGF0YSkgIH07CisJZ251dGxzX2RhdHVtX3Qgc2VydmVyX3ByaXYgCT0geyAodWludDhfdCAqKXNlcnZlcl9wcml2X2RhdGEsIAlzaXplb2Yoc2VydmVyX3ByaXZfZGF0YSkgIH07CisJZ251dGxzX2RhdHVtX3QgY2xpZW50X2NlcnQJPSB7ICh1aW50OF90ICopY2xpZW50X2NlcnRfZGF0YSwgCXNpemVvZihjbGllbnRfY2VydF9kYXRhKSAgfTsKKwlnbnV0bHNfZGF0dW1fdCBjbGllbnRfcHJpdiAJPSB7ICh1aW50OF90ICopY2xpZW50X3ByaXZfZGF0YSwgCXNpemVvZihjbGllbnRfcHJpdl9kYXRhKSAgfTsKKwlnbnV0bHNfZGF0dW1fdCBleHBpcmVkX2NlcnQgCT0geyAodWludDhfdCAqKWV4cGlyZWRfY2VydF9kYXRhLCAJc2l6ZW9mKGV4cGlyZWRfY2VydF9kYXRhKSB9OworCWdudXRsc19kYXR1bV90IGV4cGlyZWRfcHJpdiAJPSB7ICh1aW50OF90ICopZXhwaXJlZF9wcml2X2RhdGEsIAlzaXplb2YoZXhwaXJlZF9wcml2X2RhdGEpIH07CisJZ251dGxzX2RhdHVtX3Qgbm90cnVzdF9jYSAJPSB7ICh1aW50OF90ICopbm90cnVzdF9jYV9kYXRhLCAJc2l6ZW9mKG5vdHJ1c3RfY2FfZGF0YSkgICB9OworCWdudXRsc19kYXR1bV90IG5vdHJ1c3RfY2VydCAJPSB7ICh1aW50OF90ICopbm90cnVzdF9jZXJ0X2RhdGEsIAlzaXplb2Yobm90cnVzdF9jZXJ0X2RhdGEpIH07CisJZ251dGxzX2RhdHVtX3Qgbm90cnVzdF9wcml2IAk9IHsgKHVpbnQ4X3QgKilub3RydXN0X3ByaXZfZGF0YSwgCXNpemVvZihub3RydXN0X3ByaXZfZGF0YSkgfTsKKwlnbnV0bHNfZGF0dW1fdCBkaF9wYXJhbXMJPSB7ICh1aW50OF90ICopZGhfcGFyYW1zX2RhdGEsIAkJc2l6ZW9mKGRoX3BhcmFtc19kYXRhKSAJICB9OworCQorCS8qIExpc3RlbmluZyBzb2NrZXQsIHNlcnZlciBzaWRlICovCisJc3RydWN0IGNueGN0eCAqIGxpc3RlbmVyOworI2lmbmRlZiBESVNBQkxFX1NDVFAKKwlzdHJ1Y3QgY254Y3R4ICogbGlzdGVuZXJfc2N0cDsKKyNlbmRpZiAvKiBESVNBQkxFX1NDVFAgKi8KKwkKKwkvKiBTZXJ2ZXIgJiBjbGllbnQgY29ubmVjdGVkIHNvY2tldHMgKi8KKwlzdHJ1Y3QgY254Y3R4ICogc2VydmVyX3NpZGU7CisJc3RydWN0IGNueGN0eCAqIGNsaWVudF9zaWRlOworCQorCXB0aHJlYWRfdCB0aHI7CisJaW50IHJldCwgaTsKKwl1aW50OF90ICogY2VyX2J1ZjsKKwlzaXplX3QgCSAgY2VyX3N6OworCXVpbnQ4X3QgKiByY3ZfYnVmOworCXNpemVfdCAJICByY3Zfc3o7CisJCisJLyogRmlyc3QsIGluaXRpYWxpemUgdGhlIGRhZW1vbiBtb2R1bGVzICovCisJSU5JVF9GRCgpOworCQorCS8qIFJlc3RyYWluIHRoZSAjIG9mIHN0cmVhbXMgKi8KKwlmZF9nX2NvbmZpZy0+Y25mX3NjdHBfc3RyID0gTkJfU1RSRUFNUzsKKwkKKwkvKiBTZXQgdGhlIENBIHBhcmFtZXRlciBpbiB0aGUgY29uZmlnICovCisJQ0hFQ0tfR05VVExTX0RPKCByZXQgPSBnbnV0bHNfY2VydGlmaWNhdGVfc2V0X3g1MDlfdHJ1c3RfbWVtKCBmZF9nX2NvbmZpZy0+Y25mX3NlY19kYXRhLmNyZWRlbnRpYWxzLAorCQkJCQkJCQkJICZjYSwKKwkJCQkJCQkJCSBHTlVUTFNfWDUwOV9GTVRfUEVNKSwgKTsKKwlDSEVDSyggMSwgcmV0ICk7CisJCisJI2lmZGVmIEdOVVRMU19WRVJTSU9OXzMwMAorCXsKKwkJLyogV2UgaW1wb3J0IHRoZXNlIENBIGluIHRoZSB0cnVzdCBsaXN0ICovCisJCWdudXRsc194NTA5X2NydF90ICogY2FsaXN0OworCQl1bnNpZ25lZCBpbnQgY2Fjb3VudCA9IDA7CisJCQorCQlDSEVDS19HTlVUTFNfRE8oIHJldCA9IGdudXRsc194NTA5X2NydF9saXN0X2ltcG9ydDIoJmNhbGlzdCwgJmNhY291bnQsICZjYSwgR05VVExTX1g1MDlfRk1UX1BFTSwgCisJCQkJCQkJR05VVExTX1g1MDlfQ1JUX0xJU1RfRkFJTF9JRl9VTlNPUlRFRCksICk7CisJCUNIRUNLKCAxLCBjYWNvdW50ICk7CisKKwkJQ0hFQ0tfR05VVExTX0RPKCByZXQgPSBnbnV0bHNfeDUwOV90cnVzdF9saXN0X2FkZF9jYXMgKGZkX2dfY29uZmlnLT5jbmZfc2VjX2RhdGEudHJ1c3RsaXN0LCBjYWxpc3QsIGNhY291bnQsIDApLCApOworCQlDSEVDSyggMSwgcmV0ICk7CisJfQorCQkKKwkvKiBVc2UgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uIGR1cmluZyB0aGUgaGFuZHNoYWtlICovCisJZ251dGxzX2NlcnRpZmljYXRlX3NldF92ZXJpZnlfZnVuY3Rpb24gKGZkX2dfY29uZmlnLT5jbmZfc2VjX2RhdGEuY3JlZGVudGlhbHMsIGZkX3Rsc192ZXJpZnlfY3JlZGVudGlhbHNfMik7CisJCisJI2VuZGlmIC8qIEdOVVRMU19WRVJTSU9OXzMwMCAqLworCQkJCQkJCQorCQorCS8qIFNldCB0aGUgc2VydmVyIGNyZWRlbnRpYWxzIChpbiBjb25maWcpICovCisJQ0hFQ0tfR05VVExTX0RPKCByZXQgPSBnbnV0bHNfY2VydGlmaWNhdGVfc2V0X3g1MDlfa2V5X21lbSggZmRfZ19jb25maWctPmNuZl9zZWNfZGF0YS5jcmVkZW50aWFscywKKwkJCQkJCQkJCSZzZXJ2ZXJfY2VydCwKKwkJCQkJCQkJCSZzZXJ2ZXJfcHJpdiwKKwkJCQkJCQkJCUdOVVRMU19YNTA5X0ZNVF9QRU0pLCApOworCUNIRUNLKCBHTlVUTFNfRV9TVUNDRVNTLCByZXQgKTsKKwkKKwkvKiBTZXQgdGhlIGRlZmF1bHQgcHJpb3JpdHkgKi8KKwlDSEVDS19HTlVUTFNfRE8oIHJldCA9IGdudXRsc19wcmlvcml0eV9pbml0KCAmZmRfZ19jb25maWctPmNuZl9zZWNfZGF0YS5wcmlvX2NhY2hlLCBHTlVUTFNfREVGQVVMVF9QUklPUklUWSwgTlVMTCksICk7CisJQ0hFQ0soIEdOVVRMU19FX1NVQ0NFU1MsIHJldCApOworCQorCS8qIFNldCBkZWZhdWx0IERIIHBhcmFtcyAqLworCUNIRUNLX0dOVVRMU19ETyggcmV0ID0gZ251dGxzX2RoX3BhcmFtc19pbXBvcnRfcGtjczMoIGZkX2dfY29uZmlnLT5jbmZfc2VjX2RhdGEuZGhfY2FjaGUsICZkaF9wYXJhbXMsIEdOVVRMU19YNTA5X0ZNVF9QRU0pLCApOworCUNIRUNLKCBHTlVUTFNfRV9TVUNDRVNTLCByZXQgKTsKKwkKKwkKKwkvKiBJbml0aWFsaXplIHRoZSBzZXJ2ZXIgYWRkcmVzcyAodGhpcyBzaG91bGQgZ2l2ZSBhIHNhZmUgbG9vcGJhY2sgYWRkcmVzcyArIHBvcnQsIGV2ZW4gb24gbm9uLXN0YW5kYXJkIGNvbmZpZ3MpICovCisJeworCQlzdHJ1Y3QgYWRkcmluZm8gaGludHMsICphaSwgKmFpcDsKKwkJbWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7CisJCWhpbnRzLmFpX2ZsYWdzICA9IEFJX05VTUVSSUNTRVJWOworCQloaW50cy5haV9mYW1pbHkgPSBBRl9JTkVUOworCQlDSEVDSyggMCwgZ2V0YWRkcmluZm8oImxvY2FsaG9zdCIsIF9zdHJpbmdpemUoVEVTVF9QT1JUKSwgJmhpbnRzLCAmYWkpICk7CisJCWFpcCA9IGFpOworCQl3aGlsZSAoYWlwKSB7CisJCQlDSEVDSyggMCwgZmRfZXBfYWRkX21lcmdlKCAmZXBzLCBhaXAtPmFpX2FkZHIsIGFpcC0+YWlfYWRkcmxlbiwgRVBfRkxfRElTQyB8IEVQX0FDQ0VQVEFMTCApKTsKKwkJCWFpcCA9IGFpcC0+YWlfbmV4dDsKKwkJfTsKKwkJZnJlZWFkZHJpbmZvKGFpKTsKKwkJCisJCUNIRUNLKCAwLCBGRF9JU19MSVNUX0VNUFRZKCZlcHMpID8gMSA6IDAgKTsKKwl9CisJCisJLyogU3RhcnQgdGhlIHNlcnZlcihzKSAqLworCXsKKwkJLyogVENQIHNlcnZlciAqLworCQlsaXN0ZW5lciA9IGZkX2NueF9zZXJ2X3RjcChURVNUX1BPUlQsIDAsIChzdHJ1Y3QgZmRfZW5kcG9pbnQgKikoZXBzLm5leHQpKTsKKwkJQ0hFQ0soIDEsIGxpc3RlbmVyID8gMSA6IDAgKTsKKwkJCisJCS8qIEFjY2VwdCBpbmNvbWluZyBjbGllbnRzICovCisJCUNIRUNLKCAwLCBmZF9jbnhfc2Vydl9saXN0ZW4obGlzdGVuZXIpKTsKKworI2lmbmRlZiBESVNBQkxFX1NDVFAKKwkJLyogU0NUUCBzZXJ2ZXIgKi8KKwkJbGlzdGVuZXJfc2N0cCA9IGZkX2NueF9zZXJ2X3NjdHAoVEVTVF9QT1JULCAmZXBzKTsKKwkJQ0hFQ0soIDEsIGxpc3RlbmVyX3NjdHAgPyAxIDogMCApOworCQkKKwkJLyogQWNjZXB0IGluY29taW5nIGNsaWVudHMgKi8KKwkJQ0hFQ0soIDAsIGZkX2NueF9zZXJ2X2xpc3RlbihsaXN0ZW5lcl9zY3RwKSk7CisjZW5kaWYgLyogRElTQUJMRV9TQ1RQICovCisKKwl9CQorCQorCS8qIEluaXRpYWxpemUgdGhlIENFUiBtZXNzYWdlICovCisJeworCQlzdHJ1Y3QgbXNnICogY2VyOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBtb2RlbCA9IE5VTEw7CisJCXN0cnVjdCBhdnAgKiBvaDsKKwkJdW5pb24gYXZwX3ZhbHVlIHZhbHVlOworCisJCS8qIEZpbmQgdGhlIENFUiBkaWN0aW9uYXJ5IG9iamVjdCAqLworCQlDSEVDSyggMCwgZmRfZGljdF9zZWFyY2ggKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJDYXBhYmlsaXRpZXMtRXhjaGFuZ2UtUmVxdWVzdCIsICZtb2RlbCwgRU5PRU5UICkgKTsKKworCQkvKiBDcmVhdGUgdGhlIGluc3RhbmNlICovCisJCUNIRUNLKCAwLCBmZF9tc2dfbmV3ICggbW9kZWwsIDAsICZjZXIgKSApOworCQkKKwkJLyogTm93IGZpbmQgdGhlIE9yaWdpbi1Ib3N0IGRpY3Rpb25hcnkgb2JqZWN0ICovCisJCUNIRUNLKCAwLCBmZF9kaWN0X3NlYXJjaCAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiT3JpZ2luLUhvc3QiLCAmbW9kZWwsIEVOT0VOVCApICk7CisKKwkJLyogQ3JlYXRlIHRoZSBpbnN0YW5jZSAqLworCQlDSEVDSyggMCwgZmRfbXNnX2F2cF9uZXcgKCBtb2RlbCwgMCwgJm9oICkgKTsKKwkJdmFsdWUub3MuZGF0YSA9ICh1aW50OF90ICopIkNsaWVudC5zaWRlIjsKKwkJdmFsdWUub3MubGVuID0gc3RybGVuKChjaGFyICopdmFsdWUub3MuZGF0YSk7CisJCUNIRUNLKCAwLCBmZF9tc2dfYXZwX3NldHZhbHVlICggb2gsICZ2YWx1ZSApICk7CisJCQorCQkvKiBBZGQgdGhlIEFWUCAqLworCQlDSEVDSyggMCwgZmRfbXNnX2F2cF9hZGQoIGNlciwgTVNHX0JSV19MQVNUX0NISUxELCBvaCkgKTsKKworCQkjaWYgMAorCQkvKiBGb3IgZGVidWc6IGR1bXAgdGhlIG9iamVjdCAqLworCQlmZF9sb2dfZGVidWcoIkR1bXBpbmcgQ0VSIik7CisJCWZkX2xvZ19kZWJ1ZygiJXMiLCBmZF9tc2dfZHVtcF90cmVldmlldyhGRF9EVU1QX1RFU1RfUEFSQU1TLCBjZXIsIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgMCwgMSkpOworCQkjZW5kaWYKKwkJCisJCUNIRUNLKCAwLCBmZF9tc2dfYnVmZmVyaXplKCBjZXIsICZjZXJfYnVmLCAmY2VyX3N6ICkgKTsKKwkJQ0hFQ0soIDAsIGZkX21zZ19mcmVlKGNlcikgKTsKKwl9CisJCisJLyogU2ltcGxlIFRDUCBjbGllbnQgLyBzZXJ2ZXIgdGVzdCAobm8gVExTKSAqLworCXsKKwkJc3RydWN0IGNvbm5lY3RfZmxhZ3MgY2Y7CisJCQorCQltZW1zZXQoJmNmLCAwLCBzaXplb2YoY2YpKTsKKwkJY2YucHJvdG8gPSBJUFBST1RPX1RDUDsKKwkJCisJCS8qIFN0YXJ0IHRoZSBjbGllbnQgdGhyZWFkICovCisJCUNIRUNLKCAwLCBwdGhyZWFkX2NyZWF0ZSgmdGhyLCBOVUxMLCBjb25uZWN0X3RociwgJmNmKSApOworCisJCS8qIEFjY2VwdCB0aGUgY29ubmVjdGlvbiBvZiB0aGUgY2xpZW50ICovCisJCXNlcnZlcl9zaWRlID0gZmRfY254X3NlcnZfYWNjZXB0KGxpc3RlbmVyKTsKKwkJQ0hFQ0soIDEsIHNlcnZlcl9zaWRlID8gMSA6IDAgKTsKKwkJQ0hFQ0soIDAsIGZkX2NueF9zdGFydF9jbGVhcihzZXJ2ZXJfc2lkZSwgMCkgKTsKKwkJCisJCS8qIFJldHJpZXZlIHRoZSBjbGllbnQgY29ubmVjdGlvbiBvYmplY3QgKi8KKwkJQ0hFQ0soIDAsIHB0aHJlYWRfam9pbiggdGhyLCAodm9pZCAqKSZjbGllbnRfc2lkZSApICk7CisJCUNIRUNLKCAxLCBjbGllbnRfc2lkZSA/IDEgOiAwICk7CisJCUNIRUNLKCAwLCBmZF9jbnhfc3RhcnRfY2xlYXIoY2xpZW50X3NpZGUsIDApICk7CisJCQorCQkvKiBTZW5kIGEgbWVzc2FnZSBhbmQgcmVjZWl2ZSBpdCAqLworCQlDSEVDSyggMCwgZmRfY254X3NlbmQoc2VydmVyX3NpZGUsIGNlcl9idWYsIGNlcl9zeikpOworCQlDSEVDSyggMCwgZmRfY254X3JlY2VpdmUoY2xpZW50X3NpZGUsIE5VTEwsICZyY3ZfYnVmLCAmcmN2X3N6KSk7CisJCUNIRUNLKCBjZXJfc3osIHJjdl9zeiApOworCQlDSEVDSyggMCwgbWVtY21wKCByY3ZfYnVmLCBjZXJfYnVmLCBjZXJfc3ogKSApOworCQlmcmVlKHJjdl9idWYpOworCQkKKwkJLyogRG8gaXQgaW4gdGhlIG90aGVyIGRpcmVjdGlvbiAqLworCQlDSEVDSyggMCwgZmRfY254X3NlbmQoY2xpZW50X3NpZGUsIGNlcl9idWYsIGNlcl9zeikpOworCQlDSEVDSyggMCwgZmRfY254X3JlY2VpdmUoc2VydmVyX3NpZGUsIE5VTEwsICZyY3ZfYnVmLCAmcmN2X3N6KSk7CisJCUNIRUNLKCBjZXJfc3osIHJjdl9zeiApOworCQlDSEVDSyggMCwgbWVtY21wKCByY3ZfYnVmLCBjZXJfYnVmLCBjZXJfc3ogKSApOworCQlmcmVlKHJjdl9idWYpOworCQkKKwkJLyogTm93IGNsb3NlIHRoZSBjb25uZWN0aW9ucyAqLworCQlmZF9jbnhfZGVzdHJveShjbGllbnRfc2lkZSk7CisJCWZkX2NueF9kZXN0cm95KHNlcnZlcl9zaWRlKTsKKwl9CisJCQorI2lmbmRlZiBESVNBQkxFX1NDVFAKKwkvKiBTaW1wbGUgU0NUUCBjbGllbnQgLyBzZXJ2ZXIgdGVzdCAobm8gVExTKSAqLworCXsKKwkJc3RydWN0IGNvbm5lY3RfZmxhZ3MgY2Y7CisJCQorCQltZW1zZXQoJmNmLCAwLCBzaXplb2YoY2YpKTsKKwkJY2YucHJvdG8gPSBJUFBST1RPX1NDVFA7CisJCQorCQkvKiBTdGFydCB0aGUgY2xpZW50IHRocmVhZCAqLworCQlDSEVDSyggMCwgcHRocmVhZF9jcmVhdGUoJnRociwgTlVMTCwgY29ubmVjdF90aHIsICZjZikgKTsKKworCQkvKiBBY2NlcHQgdGhlIGNvbm5lY3Rpb24gb2YgdGhlIGNsaWVudCAqLworCQlzZXJ2ZXJfc2lkZSA9IGZkX2NueF9zZXJ2X2FjY2VwdChsaXN0ZW5lcl9zY3RwKTsKKwkJQ0hFQ0soIDEsIHNlcnZlcl9zaWRlID8gMSA6IDAgKTsKKwkJCisJCS8qIFJldHJpZXZlIHRoZSBjbGllbnQgY29ubmVjdGlvbiBvYmplY3QgKi8KKwkJQ0hFQ0soIDAsIHB0aHJlYWRfam9pbiggdGhyLCAodm9pZCAqKSZjbGllbnRfc2lkZSApICk7CisJCUNIRUNLKCAxLCBjbGllbnRfc2lkZSA/IDEgOiAwICk7CisJCQorCQlDSEVDSyggMCwgZmRfY254X3N0YXJ0X2NsZWFyKHNlcnZlcl9zaWRlLCAxKSApOworCQkKKwkJLyogU2VuZCBhIG1lc3NhZ2UgYW5kIHJlY2VpdmUgaXQgKi8KKwkJQ0hFQ0soIDAsIGZkX2NueF9zZW5kKHNlcnZlcl9zaWRlLCBjZXJfYnVmLCBjZXJfc3opKTsKKwkJQ0hFQ0soIEVJTlZBTCwgZmRfY254X3JlY2VpdmUoY2xpZW50X3NpZGUsIE5VTEwsICZyY3ZfYnVmLCAmcmN2X3N6KSk7CisJCUNIRUNLKCAwLCBmZF9jbnhfc3RhcnRfY2xlYXIoY2xpZW50X3NpZGUsIDApICk7CisJCUNIRUNLKCAwLCBmZF9jbnhfcmVjZWl2ZShjbGllbnRfc2lkZSwgTlVMTCwgJnJjdl9idWYsICZyY3Zfc3opKTsKKwkJQ0hFQ0soIGNlcl9zeiwgcmN2X3N6ICk7CisJCUNIRUNLKCAwLCBtZW1jbXAoIHJjdl9idWYsIGNlcl9idWYsIGNlcl9zeiApICk7CisJCWZyZWUocmN2X2J1Zik7CisJCQorCQkvKiBEbyBpdCBpbiB0aGUgb3RoZXIgZGlyZWN0aW9uICovCisJCUNIRUNLKCAwLCBmZF9jbnhfc2VuZChjbGllbnRfc2lkZSwgY2VyX2J1ZiwgY2VyX3N6KSk7CisJCUNIRUNLKCAwLCBmZF9jbnhfcmVjZWl2ZShzZXJ2ZXJfc2lkZSwgTlVMTCwgJnJjdl9idWYsICZyY3Zfc3opKTsKKwkJQ0hFQ0soIGNlcl9zeiwgcmN2X3N6ICk7CisJCUNIRUNLKCAwLCBtZW1jbXAoIHJjdl9idWYsIGNlcl9idWYsIGNlcl9zeiApICk7CisJCWZyZWUocmN2X2J1Zik7CisJCQorCQkvKiBEbyBpdCBvbmUgbW9yZSB0aW1lIHRvIHVzZSBhbm90aGVyIHN0cmVhbSAqLworCQlDSEVDSyggMCwgZmRfY254X3NlbmQoY2xpZW50X3NpZGUsIGNlcl9idWYsIGNlcl9zeikpOworCQlDSEVDSyggMCwgZmRfY254X3JlY2VpdmUoc2VydmVyX3NpZGUsIE5VTEwsICZyY3ZfYnVmLCAmcmN2X3N6KSk7CisJCUNIRUNLKCBjZXJfc3osIHJjdl9zeiApOworCQlDSEVDSyggMCwgbWVtY21wKCByY3ZfYnVmLCBjZXJfYnVmLCBjZXJfc3ogKSApOworCQlmcmVlKHJjdl9idWYpOworCQkKKwkJLyogTm93IGNsb3NlIHRoZSBjb25uZWN0aW9uICovCisJCWZkX2NueF9kZXN0cm95KGNsaWVudF9zaWRlKTsKKwkJZmRfY254X2Rlc3Ryb3koc2VydmVyX3NpZGUpOworCX0KKyNlbmRpZiAvKiBESVNBQkxFX1NDVFAgKi8KKwkKKwkvKiBUQ1AgQ2xpZW50IC8gc2VydmVyIGVtdWxhdGluZyBvbGQgRGlhbWV0ZXIgYmVoYXZpb3IgKGhhbmRzaGFrZSBhZnRlciAxIG1lc3NhZ2UgZXhjaGFuZ2UpICovCisJeworCQlzdHJ1Y3QgY29ubmVjdF9mbGFncyBjZjsKKwkJc3RydWN0IGhhbmRzaGFrZV9mbGFncyBoZjsKKwkJCisJCW1lbXNldCgmY2YsIDAsIHNpemVvZihjZikpOworCQljZi5wcm90byA9IElQUFJPVE9fVENQOworCQkKKwkJbWVtc2V0KCZoZiwgMCwgc2l6ZW9mKGhmKSk7CisJCQorCQkvKiBJbml0aWFsaXplIHJlbW90ZSBjZXJ0aWZpY2F0ZSAqLworCQlDSEVDS19HTlVUTFNfRE8oIHJldCA9IGdudXRsc19jZXJ0aWZpY2F0ZV9hbGxvY2F0ZV9jcmVkZW50aWFscyAoJmhmLmNyZWRzKSwgKTsKKwkJQ0hFQ0soIEdOVVRMU19FX1NVQ0NFU1MsIHJldCApOworCQkvKiBTZXQgdGhlIENBICovCisJCUNIRUNLX0dOVVRMU19ETyggcmV0ID0gZ251dGxzX2NlcnRpZmljYXRlX3NldF94NTA5X3RydXN0X21lbSggaGYuY3JlZHMsICZjYSwgR05VVExTX1g1MDlfRk1UX1BFTSksICk7CisJCUNIRUNLKCAxLCByZXQgKTsKKwkJLyogU2V0IHRoZSBrZXkgKi8KKwkJQ0hFQ0tfR05VVExTX0RPKCByZXQgPSBnbnV0bHNfY2VydGlmaWNhdGVfc2V0X3g1MDlfa2V5X21lbSggaGYuY3JlZHMsICZjbGllbnRfY2VydCwgJmNsaWVudF9wcml2LCBHTlVUTFNfWDUwOV9GTVRfUEVNKSwgKTsKKwkJQ0hFQ0soIEdOVVRMU19FX1NVQ0NFU1MsIHJldCApOworCQkKKwkJLyogU3RhcnQgdGhlIGNsaWVudCB0aHJlYWQgKi8KKwkJQ0hFQ0soIDAsIHB0aHJlYWRfY3JlYXRlKCZ0aHIsIE5VTEwsIGNvbm5lY3RfdGhyLCAmY2YpICk7CisKKwkJLyogQWNjZXB0IHRoZSBjb25uZWN0aW9uIG9mIHRoZSBjbGllbnQgKi8KKwkJc2VydmVyX3NpZGUgPSBmZF9jbnhfc2Vydl9hY2NlcHQobGlzdGVuZXIpOworCQlDSEVDSyggMSwgc2VydmVyX3NpZGUgPyAxIDogMCApOworCQkKKwkJLyogUmV0cmlldmUgdGhlIGNsaWVudCBjb25uZWN0aW9uIG9iamVjdCAqLworCQlDSEVDSyggMCwgcHRocmVhZF9qb2luKCB0aHIsICh2b2lkICopJmNsaWVudF9zaWRlICkgKTsKKwkJQ0hFQ0soIDEsIGNsaWVudF9zaWRlID8gMSA6IDAgKTsKKwkJaGYuY254ID0gY2xpZW50X3NpZGU7CisJCQorCQkvKiBJbiBsZWdhY3kgRGlhbWV0ZXIsIHdlIGV4Y2hhbmdlIGZpcnN0IG9uZSBtZXNzYWdlIChDRVIgLyBDRUEpICovCisJCQorCQlDSEVDSyggMCwgZmRfY254X3N0YXJ0X2NsZWFyKHNlcnZlcl9zaWRlLCAwKSApOworCQlDSEVDSyggMCwgZmRfY254X3N0YXJ0X2NsZWFyKGNsaWVudF9zaWRlLCAwKSApOworCQkKKwkJLyogU2VuZCBhIG1lc3NhZ2UgYW5kIHJlY2VpdmUgaXQgKi8KKwkJQ0hFQ0soIDAsIGZkX2NueF9zZW5kKHNlcnZlcl9zaWRlLCBjZXJfYnVmLCBjZXJfc3opKTsKKwkJQ0hFQ0soIDAsIGZkX2NueF9yZWNlaXZlKGNsaWVudF9zaWRlLCBOVUxMLCAmcmN2X2J1ZiwgJnJjdl9zeikpOworCQlDSEVDSyggY2VyX3N6LCByY3Zfc3ogKTsKKwkJQ0hFQ0soIDAsIG1lbWNtcCggcmN2X2J1ZiwgY2VyX2J1ZiwgY2VyX3N6ICkgKTsKKwkJZnJlZShyY3ZfYnVmKTsKKwkJCisJCS8qIEFuZCB0aGUgc3VwcG9zZWQgcmVwbHkgKi8KKwkJQ0hFQ0soIDAsIGZkX2NueF9zZW5kKGNsaWVudF9zaWRlLCBjZXJfYnVmLCBjZXJfc3opKTsKKwkJQ0hFQ0soIDAsIGZkX2NueF9yZWNlaXZlKHNlcnZlcl9zaWRlLCBOVUxMLCAmcmN2X2J1ZiwgJnJjdl9zeikpOworCQlDSEVDSyggY2VyX3N6LCByY3Zfc3ogKTsKKwkJQ0hFQ0soIDAsIG1lbWNtcCggcmN2X2J1ZiwgY2VyX2J1ZiwgY2VyX3N6ICkgKTsKKwkJZnJlZShyY3ZfYnVmKTsKKwkJCisJCS8qIEF0IHRoaXMgcG9pbnQgaW4gbGVnYWN5IERpYW1ldGVyIHdlIHN0YXJ0IHRoZSBoYW5kc2hha2UgKi8KKwkJQ0hFQ0soIDAsIHB0aHJlYWRfY3JlYXRlKCZ0aHIsIE5VTEwsIGhhbmRzaGFrZV90aHIsICZoZikgKTsKKwkJQ0hFQ0soIDAsIGZkX2NueF9oYW5kc2hha2Uoc2VydmVyX3NpZGUsIEdOVVRMU19TRVJWRVIsIEFMR09fSEFORFNIQUtFX0RFRkFVTFQgLyogTm8gaW1wYWN0IG9uIFRDUCAqLywgTlVMTCwgTlVMTCkgKTsKKwkJQ0hFQ0soIDAsIHB0aHJlYWRfam9pbih0aHIsIE5VTEwpICk7CisJCUNIRUNLKCAwLCBoZi5yZXQgKTsKKwkJCisJCS8qIFNlbmQgYSBmZXcgVExTIHByb3RlY3RlZCBtZXNzYWdlLCBhbmQgcmVwbGllcyAqLworCQlmb3IgKGkgPSAwOyBpIDwgMiAqIE5CX1NUUkVBTVM7IGkrKykgeworCQkJQ0hFQ0soIDAsIGZkX2NueF9zZW5kKHNlcnZlcl9zaWRlLCBjZXJfYnVmLCBjZXJfc3opKTsKKwkJCUNIRUNLKCAwLCBmZF9jbnhfcmVjZWl2ZShjbGllbnRfc2lkZSwgTlVMTCwgJnJjdl9idWYsICZyY3Zfc3opKTsKKwkJCUNIRUNLKCBjZXJfc3osIHJjdl9zeiApOworCQkJQ0hFQ0soIDAsIG1lbWNtcCggcmN2X2J1ZiwgY2VyX2J1ZiwgY2VyX3N6ICkgKTsKKwkJCWZyZWUocmN2X2J1Zik7CisKKwkJCUNIRUNLKCAwLCBmZF9jbnhfc2VuZChjbGllbnRfc2lkZSwgY2VyX2J1ZiwgY2VyX3N6KSk7CisJCQlDSEVDSyggMCwgZmRfY254X3JlY2VpdmUoc2VydmVyX3NpZGUsIE5VTEwsICZyY3ZfYnVmLCAmcmN2X3N6KSk7CisJCQlDSEVDSyggY2VyX3N6LCByY3Zfc3ogKTsKKwkJCUNIRUNLKCAwLCBtZW1jbXAoIHJjdl9idWYsIGNlcl9idWYsIGNlcl9zeiApICk7CisJCQlmcmVlKHJjdl9idWYpOworCQl9CisJCQorCQkKKwkJLyogTm93IGNsb3NlIHRoZSBjb25uZWN0aW9uICovCisJCUNIRUNLKCAwLCBwdGhyZWFkX2NyZWF0ZSgmdGhyLCBOVUxMLCBkZXN0cm95X3RociwgY2xpZW50X3NpZGUpICk7CisJCWZkX2NueF9kZXN0cm95KHNlcnZlcl9zaWRlKTsKKwkJQ0hFQ0soIDAsIHB0aHJlYWRfam9pbih0aHIsIE5VTEwpICk7CisJCQorCQkvKiBGcmVlIHRoZSBjcmVkZW50aWFscyAqLworCQlnbnV0bHNfY2VydGlmaWNhdGVfZnJlZV9rZXlzKGhmLmNyZWRzKTsKKwkJZ251dGxzX2NlcnRpZmljYXRlX2ZyZWVfY2FzKGhmLmNyZWRzKTsKKwkJZ251dGxzX2NlcnRpZmljYXRlX2ZyZWVfY3JlZGVudGlhbHMoaGYuY3JlZHMpOworCX0KKwkJCisjaWZuZGVmIERJU0FCTEVfU0NUUAorCS8qIFNDVFAgQ2xpZW50IC8gc2VydmVyIGVtdWxhdGluZyBvbGQgRGlhbWV0ZXIgYmVoYXZpb3IgKGhhbmRzaGFrZSBhZnRlciAxIG1lc3NhZ2UgZXhjaGFuZ2UpICovCisJeworCQlzdHJ1Y3QgY29ubmVjdF9mbGFncyBjZjsKKwkJc3RydWN0IGhhbmRzaGFrZV9mbGFncyBoZjsKKwkJCisJCW1lbXNldCgmY2YsIDAsIHNpemVvZihjZikpOworCQljZi5wcm90byA9IElQUFJPVE9fU0NUUDsKKwkJCisJCW1lbXNldCgmaGYsIDAsIHNpemVvZihoZikpOworCQloZi5hbGdvID0gQUxHT19IQU5EU0hBS0VfMzQzNjsgLyogdGhpcyBpcyBtYW5kYXRvcnkgZm9yIG9sZCBUTFMgbWVjaGFuaXNtICovCisJCQorCQkvKiBJbml0aWFsaXplIHJlbW90ZSBjZXJ0aWZpY2F0ZSAqLworCQlDSEVDS19HTlVUTFNfRE8oIHJldCA9IGdudXRsc19jZXJ0aWZpY2F0ZV9hbGxvY2F0ZV9jcmVkZW50aWFscyAoJmhmLmNyZWRzKSwgKTsKKwkJQ0hFQ0soIEdOVVRMU19FX1NVQ0NFU1MsIHJldCApOworCQkvKiBTZXQgdGhlIENBICovCisJCUNIRUNLX0dOVVRMU19ETyggcmV0ID0gZ251dGxzX2NlcnRpZmljYXRlX3NldF94NTA5X3RydXN0X21lbSggaGYuY3JlZHMsICZjYSwgR05VVExTX1g1MDlfRk1UX1BFTSksICk7CisJCUNIRUNLKCAxLCByZXQgKTsKKwkJLyogU2V0IHRoZSBrZXkgKi8KKwkJQ0hFQ0tfR05VVExTX0RPKCByZXQgPSBnbnV0bHNfY2VydGlmaWNhdGVfc2V0X3g1MDlfa2V5X21lbSggaGYuY3JlZHMsICZjbGllbnRfY2VydCwgJmNsaWVudF9wcml2LCBHTlVUTFNfWDUwOV9GTVRfUEVNKSwgKTsKKwkJQ0hFQ0soIEdOVVRMU19FX1NVQ0NFU1MsIHJldCApOworCQkKKwkJLyogU3RhcnQgdGhlIGNsaWVudCB0aHJlYWQgKi8KKwkJQ0hFQ0soIDAsIHB0aHJlYWRfY3JlYXRlKCZ0aHIsIE5VTEwsIGNvbm5lY3RfdGhyLCAmY2YpICk7CisKKwkJLyogQWNjZXB0IHRoZSBjb25uZWN0aW9uIG9mIHRoZSBjbGllbnQgKi8KKwkJc2VydmVyX3NpZGUgPSBmZF9jbnhfc2Vydl9hY2NlcHQobGlzdGVuZXJfc2N0cCk7CisJCUNIRUNLKCAxLCBzZXJ2ZXJfc2lkZSA/IDEgOiAwICk7CisJCQorCQkvKiBSZXRyaWV2ZSB0aGUgY2xpZW50IGNvbm5lY3Rpb24gb2JqZWN0ICovCisJCUNIRUNLKCAwLCBwdGhyZWFkX2pvaW4oIHRociwgKHZvaWQgKikmY2xpZW50X3NpZGUgKSApOworCQlDSEVDSyggMSwgY2xpZW50X3NpZGUgPyAxIDogMCApOworCQloZi5jbnggPSBjbGllbnRfc2lkZTsKKwkJCisJCS8qIEluIGxlZ2FjeSBEaWFtZXRlciwgd2UgZXhjaGFuZ2UgZmlyc3Qgb25lIG1lc3NhZ2UgKENFUiAvIENFQSkgKi8KKwkJCisJCUNIRUNLKCAwLCBmZF9jbnhfc3RhcnRfY2xlYXIoc2VydmVyX3NpZGUsIDApICk7CisJCUNIRUNLKCAwLCBmZF9jbnhfc3RhcnRfY2xlYXIoY2xpZW50X3NpZGUsIDApICk7CisJCQorCQkvKiBTZW5kIGEgbWVzc2FnZSBhbmQgcmVjZWl2ZSBpdCAqLworCQlDSEVDSyggMCwgZmRfY254X3NlbmQoc2VydmVyX3NpZGUsIGNlcl9idWYsIGNlcl9zeikpOworCQlDSEVDSyggMCwgZmRfY254X3JlY2VpdmUoY2xpZW50X3NpZGUsIE5VTEwsICZyY3ZfYnVmLCAmcmN2X3N6KSk7CisJCUNIRUNLKCBjZXJfc3osIHJjdl9zeiApOworCQlDSEVDSyggMCwgbWVtY21wKCByY3ZfYnVmLCBjZXJfYnVmLCBjZXJfc3ogKSApOworCQlmcmVlKHJjdl9idWYpOworCQkKKwkJLyogQW5kIHRoZSBzdXBwb3NlZCByZXBseSAqLworCQlDSEVDSyggMCwgZmRfY254X3NlbmQoY2xpZW50X3NpZGUsIGNlcl9idWYsIGNlcl9zeikpOworCQlDSEVDSyggMCwgZmRfY254X3JlY2VpdmUoc2VydmVyX3NpZGUsIE5VTEwsICZyY3ZfYnVmLCAmcmN2X3N6KSk7CisJCUNIRUNLKCBjZXJfc3osIHJjdl9zeiApOworCQlDSEVDSyggMCwgbWVtY21wKCByY3ZfYnVmLCBjZXJfYnVmLCBjZXJfc3ogKSApOworCQlmcmVlKHJjdl9idWYpOworCQkKKwkJLyogQXQgdGhpcyBwb2ludCBpbiBsZWdhY3kgRGlhbWV0ZXIgd2Ugc3RhcnQgdGhlIGhhbmRzaGFrZSAqLworCQlDSEVDSyggMCwgcHRocmVhZF9jcmVhdGUoJnRociwgTlVMTCwgaGFuZHNoYWtlX3RociwgJmhmKSApOworCQlDSEVDSyggMCwgZmRfY254X2hhbmRzaGFrZShzZXJ2ZXJfc2lkZSwgR05VVExTX1NFUlZFUiwgQUxHT19IQU5EU0hBS0VfMzQzNiwgTlVMTCwgTlVMTCkgKTsKKwkJQ0hFQ0soIDAsIHB0aHJlYWRfam9pbih0aHIsIE5VTEwpICk7CisJCUNIRUNLKCAwLCBoZi5yZXQgKTsKKwkJCisJCS8qIFNlbmQgYSBmZXcgVExTIHByb3RlY3RlZCBtZXNzYWdlLCBhbmQgcmVwbGllcyAqLworCQlmb3IgKGkgPSAwOyBpIDwgMiAqIE5CX1NUUkVBTVM7IGkrKykgeworCQkJQ0hFQ0soIDAsIGZkX2NueF9zZW5kKHNlcnZlcl9zaWRlLCBjZXJfYnVmLCBjZXJfc3opKTsKKwkJCUNIRUNLKCAwLCBmZF9jbnhfcmVjZWl2ZShjbGllbnRfc2lkZSwgTlVMTCwgJnJjdl9idWYsICZyY3Zfc3opKTsKKwkJCUNIRUNLKCBjZXJfc3osIHJjdl9zeiApOworCQkJQ0hFQ0soIDAsIG1lbWNtcCggcmN2X2J1ZiwgY2VyX2J1ZiwgY2VyX3N6ICkgKTsKKwkJCWZyZWUocmN2X2J1Zik7CisKKwkJCUNIRUNLKCAwLCBmZF9jbnhfc2VuZChjbGllbnRfc2lkZSwgY2VyX2J1ZiwgY2VyX3N6KSk7CisJCQlDSEVDSyggMCwgZmRfY254X3JlY2VpdmUoc2VydmVyX3NpZGUsIE5VTEwsICZyY3ZfYnVmLCAmcmN2X3N6KSk7CisJCQlDSEVDSyggY2VyX3N6LCByY3Zfc3ogKTsKKwkJCUNIRUNLKCAwLCBtZW1jbXAoIHJjdl9idWYsIGNlcl9idWYsIGNlcl9zeiApICk7CisJCQlmcmVlKHJjdl9idWYpOworCQl9CisJCQorCQkKKwkJLyogTm93IGNsb3NlIHRoZSBjb25uZWN0aW9uICovCisJCUNIRUNLKCAwLCBwdGhyZWFkX2NyZWF0ZSgmdGhyLCBOVUxMLCBkZXN0cm95X3RociwgY2xpZW50X3NpZGUpICk7CisJCWZkX2NueF9kZXN0cm95KHNlcnZlcl9zaWRlKTsKKwkJQ0hFQ0soIDAsIHB0aHJlYWRfam9pbih0aHIsIE5VTEwpICk7CisJCQorCQkvKiBGcmVlIHRoZSBjcmVkZW50aWFscyAqLworCQlnbnV0bHNfY2VydGlmaWNhdGVfZnJlZV9rZXlzKGhmLmNyZWRzKTsKKwkJZ251dGxzX2NlcnRpZmljYXRlX2ZyZWVfY2FzKGhmLmNyZWRzKTsKKwkJZ251dGxzX2NlcnRpZmljYXRlX2ZyZWVfY3JlZGVudGlhbHMoaGYuY3JlZHMpOworCX0KKyNlbmRpZiAvKiBESVNBQkxFX1NDVFAgKi8KKwkKKwkvKiBUQ1AgQ2xpZW50IC8gc2VydmVyIGVtdWxhdGluZyBuZXcgRGlhbWV0ZXIgYmVoYXZpb3IgKGhhbmRzaGFrZSBhdCBjb25uZWN0aW9uIGRpcmVjdGx5KSAqLworCXsKKwkJc3RydWN0IGNvbm5lY3RfZmxhZ3MgY2Y7CisJCXN0cnVjdCBoYW5kc2hha2VfZmxhZ3MgaGY7CisJCQorCQltZW1zZXQoJmNmLCAwLCBzaXplb2YoY2YpKTsKKwkJY2YucHJvdG8gPSBJUFBST1RPX1RDUDsKKwkJCisJCW1lbXNldCgmaGYsIDAsIHNpemVvZihoZikpOworCQkKKwkJLyogSW5pdGlhbGl6ZSByZW1vdGUgY2VydGlmaWNhdGUgKi8KKwkJQ0hFQ0tfR05VVExTX0RPKCByZXQgPSBnbnV0bHNfY2VydGlmaWNhdGVfYWxsb2NhdGVfY3JlZGVudGlhbHMgKCZoZi5jcmVkcyksICk7CisJCUNIRUNLKCBHTlVUTFNfRV9TVUNDRVNTLCByZXQgKTsKKwkJLyogU2V0IHRoZSBDQSAqLworCQlDSEVDS19HTlVUTFNfRE8oIHJldCA9IGdudXRsc19jZXJ0aWZpY2F0ZV9zZXRfeDUwOV90cnVzdF9tZW0oIGhmLmNyZWRzLCAmY2EsIEdOVVRMU19YNTA5X0ZNVF9QRU0pLCApOworCQlDSEVDSyggMSwgcmV0ICk7CisJCS8qIFNldCB0aGUga2V5ICovCisJCUNIRUNLX0dOVVRMU19ETyggcmV0ID0gZ251dGxzX2NlcnRpZmljYXRlX3NldF94NTA5X2tleV9tZW0oIGhmLmNyZWRzLCAmY2xpZW50X2NlcnQsICZjbGllbnRfcHJpdiwgR05VVExTX1g1MDlfRk1UX1BFTSksICk7CisJCUNIRUNLKCBHTlVUTFNfRV9TVUNDRVNTLCByZXQgKTsKKwkJCisJCS8qIFN0YXJ0IHRoZSBjbGllbnQgdGhyZWFkICovCisJCUNIRUNLKCAwLCBwdGhyZWFkX2NyZWF0ZSgmdGhyLCBOVUxMLCBjb25uZWN0X3RociwgJmNmKSApOworCisJCS8qIEFjY2VwdCB0aGUgY29ubmVjdGlvbiBvZiB0aGUgY2xpZW50ICovCisJCXNlcnZlcl9zaWRlID0gZmRfY254X3NlcnZfYWNjZXB0KGxpc3RlbmVyKTsKKwkJQ0hFQ0soIDEsIHNlcnZlcl9zaWRlID8gMSA6IDAgKTsKKwkJCisJCS8qIFJldHJpZXZlIHRoZSBjbGllbnQgY29ubmVjdGlvbiBvYmplY3QgKi8KKwkJQ0hFQ0soIDAsIHB0aHJlYWRfam9pbiggdGhyLCAodm9pZCAqKSZjbGllbnRfc2lkZSApICk7CisJCUNIRUNLKCAxLCBjbGllbnRfc2lkZSA/IDEgOiAwICk7CisJCWhmLmNueCA9IGNsaWVudF9zaWRlOworCQkKKwkJLyogU3RhcnQgdGhlIGhhbmRzaGFrZSBkaXJlY3RseSAqLworCQlDSEVDSyggMCwgcHRocmVhZF9jcmVhdGUoJnRociwgTlVMTCwgaGFuZHNoYWtlX3RociwgJmhmKSApOworCQlDSEVDSyggMCwgZmRfY254X2hhbmRzaGFrZShzZXJ2ZXJfc2lkZSwgR05VVExTX1NFUlZFUiwgQUxHT19IQU5EU0hBS0VfREVGQVVMVCwgTlVMTCwgTlVMTCkgKTsKKwkJQ0hFQ0soIDAsIHB0aHJlYWRfam9pbih0aHIsIE5VTEwpICk7CisJCUNIRUNLKCAwLCBoZi5yZXQgKTsKKwkJCisJCS8qIFNlbmQgYSBmZXcgVExTIHByb3RlY3RlZCBtZXNzYWdlLCBhbmQgcmVwbGllcyAqLworCQlmb3IgKGkgPSAwOyBpIDwgMiAqIE5CX1NUUkVBTVM7IGkrKykgeworCQkJQ0hFQ0soIDAsIGZkX2NueF9zZW5kKHNlcnZlcl9zaWRlLCBjZXJfYnVmLCBjZXJfc3opKTsKKwkJCUNIRUNLKCAwLCBmZF9jbnhfcmVjZWl2ZShjbGllbnRfc2lkZSwgTlVMTCwgJnJjdl9idWYsICZyY3Zfc3opKTsKKwkJCUNIRUNLKCBjZXJfc3osIHJjdl9zeiApOworCQkJQ0hFQ0soIDAsIG1lbWNtcCggcmN2X2J1ZiwgY2VyX2J1ZiwgY2VyX3N6ICkgKTsKKwkJCWZyZWUocmN2X2J1Zik7CisKKwkJCUNIRUNLKCAwLCBmZF9jbnhfc2VuZChjbGllbnRfc2lkZSwgY2VyX2J1ZiwgY2VyX3N6KSk7CisJCQlDSEVDSyggMCwgZmRfY254X3JlY2VpdmUoc2VydmVyX3NpZGUsIE5VTEwsICZyY3ZfYnVmLCAmcmN2X3N6KSk7CisJCQlDSEVDSyggY2VyX3N6LCByY3Zfc3ogKTsKKwkJCUNIRUNLKCAwLCBtZW1jbXAoIHJjdl9idWYsIGNlcl9idWYsIGNlcl9zeiApICk7CisJCQlmcmVlKHJjdl9idWYpOworCQl9CisJCQorCQkvKiBOb3cgY2xvc2UgdGhlIGNvbm5lY3Rpb24gKi8KKwkJQ0hFQ0soIDAsIHB0aHJlYWRfY3JlYXRlKCZ0aHIsIE5VTEwsIGRlc3Ryb3lfdGhyLCBjbGllbnRfc2lkZSkgKTsKKwkJZmRfY254X2Rlc3Ryb3koc2VydmVyX3NpZGUpOworCQlDSEVDSyggMCwgcHRocmVhZF9qb2luKHRociwgTlVMTCkgKTsKKwkJCisJCS8qIEZyZWUgdGhlIGNyZWRlbnRpYWxzICovCisJCWdudXRsc19jZXJ0aWZpY2F0ZV9mcmVlX2tleXMoaGYuY3JlZHMpOworCQlnbnV0bHNfY2VydGlmaWNhdGVfZnJlZV9jYXMoaGYuY3JlZHMpOworCQlnbnV0bHNfY2VydGlmaWNhdGVfZnJlZV9jcmVkZW50aWFscyhoZi5jcmVkcyk7CisJfQorCQorI2lmbmRlZiBESVNBQkxFX1NDVFAKKwkKKwkKKwkvKiBTQ1RQIENsaWVudCAvIHNlcnZlciBlbXVsYXRpbmcgbmV3IERpYW1ldGVyIGJlaGF2aW9yIChEVExTIGhhbmRzaGFrZSBhdCBjb25uZWN0aW9uIGRpcmVjdGx5KSAqLworCVRPRE8oIkVuYWJsZWQgYWZ0ZXIgRFRMUyBpbXBsZW1lbnRhdGlvbiIpOworCWlmICgwKQorCXsKKwkJc3RydWN0IGNvbm5lY3RfZmxhZ3MgY2Y7CisJCXN0cnVjdCBoYW5kc2hha2VfZmxhZ3MgaGY7CisJCQorCQltZW1zZXQoJmNmLCAwLCBzaXplb2YoY2YpKTsKKwkJY2YucHJvdG8gPSBJUFBST1RPX1NDVFA7CisJCQorCQltZW1zZXQoJmhmLCAwLCBzaXplb2YoaGYpKTsKKwkJCisJCS8qIEluaXRpYWxpemUgcmVtb3RlIGNlcnRpZmljYXRlICovCisJCUNIRUNLX0dOVVRMU19ETyggcmV0ID0gZ251dGxzX2NlcnRpZmljYXRlX2FsbG9jYXRlX2NyZWRlbnRpYWxzICgmaGYuY3JlZHMpLCApOworCQlDSEVDSyggR05VVExTX0VfU1VDQ0VTUywgcmV0ICk7CisJCS8qIFNldCB0aGUgQ0EgKi8KKwkJQ0hFQ0tfR05VVExTX0RPKCByZXQgPSBnbnV0bHNfY2VydGlmaWNhdGVfc2V0X3g1MDlfdHJ1c3RfbWVtKCBoZi5jcmVkcywgJmNhLCBHTlVUTFNfWDUwOV9GTVRfUEVNKSwgKTsKKwkJQ0hFQ0soIDEsIHJldCApOworCQkvKiBTZXQgdGhlIGtleSAqLworCQlDSEVDS19HTlVUTFNfRE8oIHJldCA9IGdudXRsc19jZXJ0aWZpY2F0ZV9zZXRfeDUwOV9rZXlfbWVtKCBoZi5jcmVkcywgJmNsaWVudF9jZXJ0LCAmY2xpZW50X3ByaXYsIEdOVVRMU19YNTA5X0ZNVF9QRU0pLCApOworCQlDSEVDSyggR05VVExTX0VfU1VDQ0VTUywgcmV0ICk7CisJCQorCQkvKiBTdGFydCB0aGUgY2xpZW50IHRocmVhZCAqLworCQlDSEVDSyggMCwgcHRocmVhZF9jcmVhdGUoJnRociwgTlVMTCwgY29ubmVjdF90aHIsICZjZikgKTsKKworCQkvKiBBY2NlcHQgdGhlIGNvbm5lY3Rpb24gb2YgdGhlIGNsaWVudCAqLworCQlzZXJ2ZXJfc2lkZSA9IGZkX2NueF9zZXJ2X2FjY2VwdChsaXN0ZW5lcl9zY3RwKTsKKwkJQ0hFQ0soIDEsIHNlcnZlcl9zaWRlID8gMSA6IDAgKTsKKwkJCisJCS8qIFJldHJpZXZlIHRoZSBjbGllbnQgY29ubmVjdGlvbiBvYmplY3QgKi8KKwkJQ0hFQ0soIDAsIHB0aHJlYWRfam9pbiggdGhyLCAodm9pZCAqKSZjbGllbnRfc2lkZSApICk7CisJCUNIRUNLKCAxLCBjbGllbnRfc2lkZSA/IDEgOiAwICk7CisJCWhmLmNueCA9IGNsaWVudF9zaWRlOworCQkKKwkJLyogU3RhcnQgdGhlIGhhbmRzaGFrZSBkaXJlY3RseSAqLworCQlDSEVDSyggMCwgcHRocmVhZF9jcmVhdGUoJnRociwgTlVMTCwgaGFuZHNoYWtlX3RociwgJmhmKSApOworCQlDSEVDSyggMCwgZmRfY254X2hhbmRzaGFrZShzZXJ2ZXJfc2lkZSwgR05VVExTX1NFUlZFUiwgQUxHT19IQU5EU0hBS0VfREVGQVVMVCwgTlVMTCwgTlVMTCkgKTsKKwkJQ0hFQ0soIDAsIHB0aHJlYWRfam9pbih0aHIsIE5VTEwpICk7CisJCUNIRUNLKCAwLCBoZi5yZXQgKTsKKwkJCisJCS8qIFNlbmQgYSBmZXcgVExTIHByb3RlY3RlZCBtZXNzYWdlcywgYW5kIHJlcGxpZXMgKi8KKwkJZm9yIChpID0gMDsgaSA8IDIgKiBOQl9TVFJFQU1TOyBpKyspIHsKKwkJCUNIRUNLKCAwLCBmZF9jbnhfc2VuZChzZXJ2ZXJfc2lkZSwgY2VyX2J1ZiwgY2VyX3N6KSk7CisJCQlDSEVDSyggMCwgZmRfY254X3JlY2VpdmUoY2xpZW50X3NpZGUsIE5VTEwsICZyY3ZfYnVmLCAmcmN2X3N6KSk7CisJCQlDSEVDSyggY2VyX3N6LCByY3Zfc3ogKTsKKwkJCUNIRUNLKCAwLCBtZW1jbXAoIHJjdl9idWYsIGNlcl9idWYsIGNlcl9zeiApICk7CisJCQlmcmVlKHJjdl9idWYpOworCisJCQlDSEVDSyggMCwgZmRfY254X3NlbmQoY2xpZW50X3NpZGUsIGNlcl9idWYsIGNlcl9zeikpOworCQkJQ0hFQ0soIDAsIGZkX2NueF9yZWNlaXZlKHNlcnZlcl9zaWRlLCBOVUxMLCAmcmN2X2J1ZiwgJnJjdl9zeikpOworCQkJQ0hFQ0soIGNlcl9zeiwgcmN2X3N6ICk7CisJCQlDSEVDSyggMCwgbWVtY21wKCByY3ZfYnVmLCBjZXJfYnVmLCBjZXJfc3ogKSApOworCQkJZnJlZShyY3ZfYnVmKTsKKwkJfQorCQkKKwkJCisJCS8qIE5vdyBjbG9zZSB0aGUgY29ubmVjdGlvbiAqLworCQlDSEVDSyggMCwgcHRocmVhZF9jcmVhdGUoJnRociwgTlVMTCwgZGVzdHJveV90aHIsIGNsaWVudF9zaWRlKSApOworCQlmZF9jbnhfZGVzdHJveShzZXJ2ZXJfc2lkZSk7CisJCUNIRUNLKCAwLCBwdGhyZWFkX2pvaW4odGhyLCBOVUxMKSApOworCQkKKwkJLyogRnJlZSB0aGUgY3JlZGVudGlhbHMgKi8KKwkJZ251dGxzX2NlcnRpZmljYXRlX2ZyZWVfa2V5cyhoZi5jcmVkcyk7CisJCWdudXRsc19jZXJ0aWZpY2F0ZV9mcmVlX2NhcyhoZi5jcmVkcyk7CisJCWdudXRsc19jZXJ0aWZpY2F0ZV9mcmVlX2NyZWRlbnRpYWxzKGhmLmNyZWRzKTsKKwl9CisJCisJLyogU0NUUCBDbGllbnQgLyBzZXJ2ZXIgZW11bGF0aW5nIG9sZCBpbnRlcm1lZGlhcnkgRGlhbWV0ZXIgYmVoYXZpb3IgKFRMUyBoYW5kc2hha2UgYXQgY29ubmVjdGlvbiBkaXJlY3RseSkgKi8KKwl7CisJCXN0cnVjdCBjb25uZWN0X2ZsYWdzIGNmOworCQlzdHJ1Y3QgaGFuZHNoYWtlX2ZsYWdzIGhmOworCQkKKwkJbWVtc2V0KCZjZiwgMCwgc2l6ZW9mKGNmKSk7CisJCWNmLnByb3RvID0gSVBQUk9UT19TQ1RQOworCQkKKwkJbWVtc2V0KCZoZiwgMCwgc2l6ZW9mKGhmKSk7CisJCWhmLmFsZ28gPSBBTEdPX0hBTkRTSEFLRV8zNDM2OyAvKiB0aGlzIGlzIG1hbmRhdG9yeSBmb3Igb2xkIFRMUyBtZWNoYW5pc20gKi8KKwkJCisJCS8qIEluaXRpYWxpemUgcmVtb3RlIGNlcnRpZmljYXRlICovCisJCUNIRUNLX0dOVVRMU19ETyggcmV0ID0gZ251dGxzX2NlcnRpZmljYXRlX2FsbG9jYXRlX2NyZWRlbnRpYWxzICgmaGYuY3JlZHMpLCApOworCQlDSEVDSyggR05VVExTX0VfU1VDQ0VTUywgcmV0ICk7CisJCS8qIFNldCB0aGUgQ0EgKi8KKwkJQ0hFQ0tfR05VVExTX0RPKCByZXQgPSBnbnV0bHNfY2VydGlmaWNhdGVfc2V0X3g1MDlfdHJ1c3RfbWVtKCBoZi5jcmVkcywgJmNhLCBHTlVUTFNfWDUwOV9GTVRfUEVNKSwgKTsKKwkJQ0hFQ0soIDEsIHJldCApOworCQkvKiBTZXQgdGhlIGtleSAqLworCQlDSEVDS19HTlVUTFNfRE8oIHJldCA9IGdudXRsc19jZXJ0aWZpY2F0ZV9zZXRfeDUwOV9rZXlfbWVtKCBoZi5jcmVkcywgJmNsaWVudF9jZXJ0LCAmY2xpZW50X3ByaXYsIEdOVVRMU19YNTA5X0ZNVF9QRU0pLCApOworCQlDSEVDSyggR05VVExTX0VfU1VDQ0VTUywgcmV0ICk7CisJCQorCQkvKiBTdGFydCB0aGUgY2xpZW50IHRocmVhZCAqLworCQlDSEVDSyggMCwgcHRocmVhZF9jcmVhdGUoJnRociwgTlVMTCwgY29ubmVjdF90aHIsICZjZikgKTsKKworCQkvKiBBY2NlcHQgdGhlIGNvbm5lY3Rpb24gb2YgdGhlIGNsaWVudCAqLworCQlzZXJ2ZXJfc2lkZSA9IGZkX2NueF9zZXJ2X2FjY2VwdChsaXN0ZW5lcl9zY3RwKTsKKwkJQ0hFQ0soIDEsIHNlcnZlcl9zaWRlID8gMSA6IDAgKTsKKwkJCisJCS8qIFJldHJpZXZlIHRoZSBjbGllbnQgY29ubmVjdGlvbiBvYmplY3QgKi8KKwkJQ0hFQ0soIDAsIHB0aHJlYWRfam9pbiggdGhyLCAodm9pZCAqKSZjbGllbnRfc2lkZSApICk7CisJCUNIRUNLKCAxLCBjbGllbnRfc2lkZSA/IDEgOiAwICk7CisJCWhmLmNueCA9IGNsaWVudF9zaWRlOworCQkKKwkJLyogU3RhcnQgdGhlIGhhbmRzaGFrZSBkaXJlY3RseSAqLworCQlDSEVDSyggMCwgcHRocmVhZF9jcmVhdGUoJnRociwgTlVMTCwgaGFuZHNoYWtlX3RociwgJmhmKSApOworCQlDSEVDSyggMCwgZmRfY254X2hhbmRzaGFrZShzZXJ2ZXJfc2lkZSwgR05VVExTX1NFUlZFUiwgQUxHT19IQU5EU0hBS0VfMzQzNiwgTlVMTCwgTlVMTCkgKTsKKwkJQ0hFQ0soIDAsIHB0aHJlYWRfam9pbih0aHIsIE5VTEwpICk7CisJCUNIRUNLKCAwLCBoZi5yZXQgKTsKKwkJCisJCS8qIFNlbmQgYSBmZXcgVExTIHByb3RlY3RlZCBtZXNzYWdlcywgYW5kIHJlcGxpZXMgKi8KKwkJZm9yIChpID0gMDsgaSA8IDIgKiBOQl9TVFJFQU1TOyBpKyspIHsKKwkJCUNIRUNLKCAwLCBmZF9jbnhfc2VuZChzZXJ2ZXJfc2lkZSwgY2VyX2J1ZiwgY2VyX3N6KSk7CisJCQlDSEVDSyggMCwgZmRfY254X3JlY2VpdmUoY2xpZW50X3NpZGUsIE5VTEwsICZyY3ZfYnVmLCAmcmN2X3N6KSk7CisJCQlDSEVDSyggY2VyX3N6LCByY3Zfc3ogKTsKKwkJCUNIRUNLKCAwLCBtZW1jbXAoIHJjdl9idWYsIGNlcl9idWYsIGNlcl9zeiApICk7CisJCQlmcmVlKHJjdl9idWYpOworCisJCQlDSEVDSyggMCwgZmRfY254X3NlbmQoY2xpZW50X3NpZGUsIGNlcl9idWYsIGNlcl9zeikpOworCQkJQ0hFQ0soIDAsIGZkX2NueF9yZWNlaXZlKHNlcnZlcl9zaWRlLCBOVUxMLCAmcmN2X2J1ZiwgJnJjdl9zeikpOworCQkJQ0hFQ0soIGNlcl9zeiwgcmN2X3N6ICk7CisJCQlDSEVDSyggMCwgbWVtY21wKCByY3ZfYnVmLCBjZXJfYnVmLCBjZXJfc3ogKSApOworCQkJZnJlZShyY3ZfYnVmKTsKKwkJfQorCQkKKwkJCisJCS8qIE5vdyBjbG9zZSB0aGUgY29ubmVjdGlvbiAqLworCQlDSEVDSyggMCwgcHRocmVhZF9jcmVhdGUoJnRociwgTlVMTCwgZGVzdHJveV90aHIsIGNsaWVudF9zaWRlKSApOworCQlmZF9jbnhfZGVzdHJveShzZXJ2ZXJfc2lkZSk7CisJCUNIRUNLKCAwLCBwdGhyZWFkX2pvaW4odGhyLCBOVUxMKSApOworCQkKKwkJLyogRnJlZSB0aGUgY3JlZGVudGlhbHMgKi8KKwkJZ251dGxzX2NlcnRpZmljYXRlX2ZyZWVfa2V5cyhoZi5jcmVkcyk7CisJCWdudXRsc19jZXJ0aWZpY2F0ZV9mcmVlX2NhcyhoZi5jcmVkcyk7CisJCWdudXRsc19jZXJ0aWZpY2F0ZV9mcmVlX2NyZWRlbnRpYWxzKGhmLmNyZWRzKTsKKwl9CisjZW5kaWYgLyogRElTQUJMRV9TQ1RQICovCisJCisJLyogVGVzdCB3aXRoIGRpZmZlcmVudCBudW1iZXIgb2Ygc3RyZWFtcyBiZXR3ZWVuIHNlcnZlciBhbmQgY2xpZW50ICovCisjaWZuZGVmIERJU0FCTEVfU0NUUAorCS8qIERUTFMgLyBTQ1RQIHN0eWxlICovCisJVE9ETygiRW5hYmxlZCBhZnRlciBEVExTIGltcGxlbWVudGF0aW9uIik7CisJaWYgKDApCisJeworCQlzdHJ1Y3QgY29ubmVjdF9mbGFncyBjZjsKKwkJc3RydWN0IGhhbmRzaGFrZV9mbGFncyBoZjsKKwkJCisJCW1lbXNldCgmY2YsIDAsIHNpemVvZihjZikpOworCQljZi5wcm90byA9IElQUFJPVE9fU0NUUDsKKwkJCisJCW1lbXNldCgmaGYsIDAsIHNpemVvZihoZikpOworCQkKKwkJLyogSW5pdGlhbGl6ZSByZW1vdGUgY2VydGlmaWNhdGUgKi8KKwkJQ0hFQ0tfR05VVExTX0RPKCByZXQgPSBnbnV0bHNfY2VydGlmaWNhdGVfYWxsb2NhdGVfY3JlZGVudGlhbHMgKCZoZi5jcmVkcyksICk7CisJCUNIRUNLKCBHTlVUTFNfRV9TVUNDRVNTLCByZXQgKTsKKwkJLyogU2V0IHRoZSBDQSAqLworCQlDSEVDS19HTlVUTFNfRE8oIHJldCA9IGdudXRsc19jZXJ0aWZpY2F0ZV9zZXRfeDUwOV90cnVzdF9tZW0oIGhmLmNyZWRzLCAmY2EsIEdOVVRMU19YNTA5X0ZNVF9QRU0pLCApOworCQlDSEVDSyggMSwgcmV0ICk7CisJCS8qIFNldCB0aGUga2V5ICovCisJCUNIRUNLX0dOVVRMU19ETyggcmV0ID0gZ251dGxzX2NlcnRpZmljYXRlX3NldF94NTA5X2tleV9tZW0oIGhmLmNyZWRzLCAmY2xpZW50X2NlcnQsICZjbGllbnRfcHJpdiwgR05VVExTX1g1MDlfRk1UX1BFTSksICk7CisJCUNIRUNLKCBHTlVUTFNfRV9TVUNDRVNTLCByZXQgKTsKKwkJCisJCS8qIFN0YXJ0IHRoZSBjbGllbnQgdGhyZWFkIHdpdGggbW9yZSBzdHJlYW1zIHRoYW4gdGhlIHNlcnZlciAqLworCQlmZF9nX2NvbmZpZy0+Y25mX3NjdHBfc3RyID0gMiAqIE5CX1NUUkVBTVM7CisJCUNIRUNLKCAwLCBwdGhyZWFkX2NyZWF0ZSgmdGhyLCBOVUxMLCBjb25uZWN0X3RociwgJmNmKSApOworCisJCS8qIEFjY2VwdCB0aGUgY29ubmVjdGlvbiBvZiB0aGUgY2xpZW50ICovCisJCXNlcnZlcl9zaWRlID0gZmRfY254X3NlcnZfYWNjZXB0KGxpc3RlbmVyX3NjdHApOworCQlDSEVDSyggMSwgc2VydmVyX3NpZGUgPyAxIDogMCApOworCQkKKwkJLyogUmV0cmlldmUgdGhlIGNsaWVudCBjb25uZWN0aW9uIG9iamVjdCAqLworCQlDSEVDSyggMCwgcHRocmVhZF9qb2luKCB0aHIsICh2b2lkICopJmNsaWVudF9zaWRlICkgKTsKKwkJQ0hFQ0soIDEsIGNsaWVudF9zaWRlID8gMSA6IDAgKTsKKwkJaGYuY254ID0gY2xpZW50X3NpZGU7CisJCQorCQkvKiBTdGFydCB0aGUgaGFuZHNoYWtlIGRpcmVjdGx5ICovCisJCUNIRUNLKCAwLCBwdGhyZWFkX2NyZWF0ZSgmdGhyLCBOVUxMLCBoYW5kc2hha2VfdGhyLCAmaGYpICk7CisJCUNIRUNLKCAwLCBmZF9jbnhfaGFuZHNoYWtlKHNlcnZlcl9zaWRlLCBHTlVUTFNfU0VSVkVSLCBBTEdPX0hBTkRTSEFLRV9ERUZBVUxULCBOVUxMLCBOVUxMKSApOworCQlDSEVDSyggMCwgcHRocmVhZF9qb2luKHRociwgTlVMTCkgKTsKKwkJQ0hFQ0soIDAsIGhmLnJldCApOworCQkKKwkJLyogU2VuZCBhIGZldyBUTFMgcHJvdGVjdGVkIG1lc3NhZ2UsIGFuZCByZXBsaWVzICovCisJCWZvciAoaSA9IDA7IGkgPCA0ICogTkJfU1RSRUFNUzsgaSsrKSB7CisJCQlDSEVDSyggMCwgZmRfY254X3NlbmQoc2VydmVyX3NpZGUsIGNlcl9idWYsIGNlcl9zeikpOworCQkJQ0hFQ0soIDAsIGZkX2NueF9yZWNlaXZlKGNsaWVudF9zaWRlLCBOVUxMLCAmcmN2X2J1ZiwgJnJjdl9zeikpOworCQkJQ0hFQ0soIGNlcl9zeiwgcmN2X3N6ICk7CisJCQlDSEVDSyggMCwgbWVtY21wKCByY3ZfYnVmLCBjZXJfYnVmLCBjZXJfc3ogKSApOworCQkJZnJlZShyY3ZfYnVmKTsKKworCQkJQ0hFQ0soIDAsIGZkX2NueF9zZW5kKGNsaWVudF9zaWRlLCBjZXJfYnVmLCBjZXJfc3opKTsKKwkJCUNIRUNLKCAwLCBmZF9jbnhfcmVjZWl2ZShzZXJ2ZXJfc2lkZSwgTlVMTCwgJnJjdl9idWYsICZyY3Zfc3opKTsKKwkJCUNIRUNLKCBjZXJfc3osIHJjdl9zeiApOworCQkJQ0hFQ0soIDAsIG1lbWNtcCggcmN2X2J1ZiwgY2VyX2J1ZiwgY2VyX3N6ICkgKTsKKwkJCWZyZWUocmN2X2J1Zik7CisJCX0KKwkJCisJCS8qIE5vdyBjbG9zZSB0aGUgY29ubmVjdGlvbiAqLworCQlDSEVDSyggMCwgcHRocmVhZF9jcmVhdGUoJnRociwgTlVMTCwgZGVzdHJveV90aHIsIGNsaWVudF9zaWRlKSApOworCQlmZF9jbnhfZGVzdHJveShzZXJ2ZXJfc2lkZSk7CisJCUNIRUNLKCAwLCBwdGhyZWFkX2pvaW4odGhyLCBOVUxMKSApOworCQkKKwkJLyogRG8gdGhlIHNhbWUgdGVzdCBidXQgd2l0aCBtb3JlIHN0cmVhbXMgb24gdGhlIHNlcnZlciB0aGlzIHRpbWUgKi8KKwkJZmRfZ19jb25maWctPmNuZl9zY3RwX3N0ciA9IE5CX1NUUkVBTVMgLyAyOworCQlDSEVDSyggMCwgcHRocmVhZF9jcmVhdGUoJnRociwgTlVMTCwgY29ubmVjdF90aHIsICZjZikgKTsKKworCQkvKiBBY2NlcHQgdGhlIGNvbm5lY3Rpb24gb2YgdGhlIGNsaWVudCAqLworCQlzZXJ2ZXJfc2lkZSA9IGZkX2NueF9zZXJ2X2FjY2VwdChsaXN0ZW5lcl9zY3RwKTsKKwkJQ0hFQ0soIDEsIHNlcnZlcl9zaWRlID8gMSA6IDAgKTsKKwkJCisJCS8qIFJldHJpZXZlIHRoZSBjbGllbnQgY29ubmVjdGlvbiBvYmplY3QgKi8KKwkJQ0hFQ0soIDAsIHB0aHJlYWRfam9pbiggdGhyLCAodm9pZCAqKSZjbGllbnRfc2lkZSApICk7CisJCUNIRUNLKCAxLCBjbGllbnRfc2lkZSA/IDEgOiAwICk7CisJCWhmLmNueCA9IGNsaWVudF9zaWRlOworCQkKKwkJLyogU3RhcnQgdGhlIGhhbmRzaGFrZSBkaXJlY3RseSAqLworCQlDSEVDSyggMCwgcHRocmVhZF9jcmVhdGUoJnRociwgTlVMTCwgaGFuZHNoYWtlX3RociwgJmhmKSApOworCQlDSEVDSyggMCwgZmRfY254X2hhbmRzaGFrZShzZXJ2ZXJfc2lkZSwgR05VVExTX1NFUlZFUiwgQUxHT19IQU5EU0hBS0VfREVGQVVMVCwgTlVMTCwgTlVMTCkgKTsKKwkJQ0hFQ0soIDAsIHB0aHJlYWRfam9pbih0aHIsIE5VTEwpICk7CisJCUNIRUNLKCAwLCBoZi5yZXQgKTsKKwkJCisJCS8qIFNlbmQgYSBmZXcgVExTIHByb3RlY3RlZCBtZXNzYWdlLCBhbmQgcmVwbGllcyAqLworCQlmb3IgKGkgPSAwOyBpIDwgMiAqIE5CX1NUUkVBTVM7IGkrKykgeworCQkJQ0hFQ0soIDAsIGZkX2NueF9zZW5kKHNlcnZlcl9zaWRlLCBjZXJfYnVmLCBjZXJfc3opKTsKKwkJCUNIRUNLKCAwLCBmZF9jbnhfcmVjZWl2ZShjbGllbnRfc2lkZSwgTlVMTCwgJnJjdl9idWYsICZyY3Zfc3opKTsKKwkJCUNIRUNLKCBjZXJfc3osIHJjdl9zeiApOworCQkJQ0hFQ0soIDAsIG1lbWNtcCggcmN2X2J1ZiwgY2VyX2J1ZiwgY2VyX3N6ICkgKTsKKwkJCWZyZWUocmN2X2J1Zik7CisKKwkJCUNIRUNLKCAwLCBmZF9jbnhfc2VuZChjbGllbnRfc2lkZSwgY2VyX2J1ZiwgY2VyX3N6KSk7CisJCQlDSEVDSyggMCwgZmRfY254X3JlY2VpdmUoc2VydmVyX3NpZGUsIE5VTEwsICZyY3ZfYnVmLCAmcmN2X3N6KSk7CisJCQlDSEVDSyggY2VyX3N6LCByY3Zfc3ogKTsKKwkJCUNIRUNLKCAwLCBtZW1jbXAoIHJjdl9idWYsIGNlcl9idWYsIGNlcl9zeiApICk7CisJCQlmcmVlKHJjdl9idWYpOworCQl9CisJCQorCQkvKiBOb3cgY2xvc2UgdGhlIGNvbm5lY3Rpb24gKi8KKwkJQ0hFQ0soIDAsIHB0aHJlYWRfY3JlYXRlKCZ0aHIsIE5VTEwsIGRlc3Ryb3lfdGhyLCBjbGllbnRfc2lkZSkgKTsKKwkJZmRfY254X2Rlc3Ryb3koc2VydmVyX3NpZGUpOworCQlDSEVDSyggMCwgcHRocmVhZF9qb2luKHRociwgTlVMTCkgKTsKKwkJCisJCQorCQkvKiBGcmVlIHRoZSBjcmVkZW50aWFscyAqLworCQlnbnV0bHNfY2VydGlmaWNhdGVfZnJlZV9rZXlzKGhmLmNyZWRzKTsKKwkJZ251dGxzX2NlcnRpZmljYXRlX2ZyZWVfY2FzKGhmLmNyZWRzKTsKKwkJZ251dGxzX2NlcnRpZmljYXRlX2ZyZWVfY3JlZGVudGlhbHMoaGYuY3JlZHMpOworCX0KKwkKKwkvKiBUTFMgLyBTQ1RQIHN0eWxlICovCisJeworCQlzdHJ1Y3QgY29ubmVjdF9mbGFncyBjZjsKKwkJc3RydWN0IGhhbmRzaGFrZV9mbGFncyBoZjsKKwkJCisJCW1lbXNldCgmY2YsIDAsIHNpemVvZihjZikpOworCQljZi5wcm90byA9IElQUFJPVE9fU0NUUDsKKwkJCisJCW1lbXNldCgmaGYsIDAsIHNpemVvZihoZikpOworCQloZi5hbGdvID0gQUxHT19IQU5EU0hBS0VfMzQzNjsKKwkJCisJCS8qIEluaXRpYWxpemUgcmVtb3RlIGNlcnRpZmljYXRlICovCisJCUNIRUNLX0dOVVRMU19ETyggcmV0ID0gZ251dGxzX2NlcnRpZmljYXRlX2FsbG9jYXRlX2NyZWRlbnRpYWxzICgmaGYuY3JlZHMpLCApOworCQlDSEVDSyggR05VVExTX0VfU1VDQ0VTUywgcmV0ICk7CisJCS8qIFNldCB0aGUgQ0EgKi8KKwkJQ0hFQ0tfR05VVExTX0RPKCByZXQgPSBnbnV0bHNfY2VydGlmaWNhdGVfc2V0X3g1MDlfdHJ1c3RfbWVtKCBoZi5jcmVkcywgJmNhLCBHTlVUTFNfWDUwOV9GTVRfUEVNKSwgKTsKKwkJQ0hFQ0soIDEsIHJldCApOworCQkvKiBTZXQgdGhlIGtleSAqLworCQlDSEVDS19HTlVUTFNfRE8oIHJldCA9IGdudXRsc19jZXJ0aWZpY2F0ZV9zZXRfeDUwOV9rZXlfbWVtKCBoZi5jcmVkcywgJmNsaWVudF9jZXJ0LCAmY2xpZW50X3ByaXYsIEdOVVRMU19YNTA5X0ZNVF9QRU0pLCApOworCQlDSEVDSyggR05VVExTX0VfU1VDQ0VTUywgcmV0ICk7CisJCQorCQkvKiBTdGFydCB0aGUgY2xpZW50IHRocmVhZCB3aXRoIG1vcmUgc3RyZWFtcyB0aGFuIHRoZSBzZXJ2ZXIgKi8KKwkJZmRfZ19jb25maWctPmNuZl9zY3RwX3N0ciA9IDIgKiBOQl9TVFJFQU1TOworCQlDSEVDSyggMCwgcHRocmVhZF9jcmVhdGUoJnRociwgTlVMTCwgY29ubmVjdF90aHIsICZjZikgKTsKKworCQkvKiBBY2NlcHQgdGhlIGNvbm5lY3Rpb24gb2YgdGhlIGNsaWVudCAqLworCQlzZXJ2ZXJfc2lkZSA9IGZkX2NueF9zZXJ2X2FjY2VwdChsaXN0ZW5lcl9zY3RwKTsKKwkJQ0hFQ0soIDEsIHNlcnZlcl9zaWRlID8gMSA6IDAgKTsKKwkJCisJCS8qIFJldHJpZXZlIHRoZSBjbGllbnQgY29ubmVjdGlvbiBvYmplY3QgKi8KKwkJQ0hFQ0soIDAsIHB0aHJlYWRfam9pbiggdGhyLCAodm9pZCAqKSZjbGllbnRfc2lkZSApICk7CisJCUNIRUNLKCAxLCBjbGllbnRfc2lkZSA/IDEgOiAwICk7CisJCWhmLmNueCA9IGNsaWVudF9zaWRlOworCQkKKwkJLyogU3RhcnQgdGhlIGhhbmRzaGFrZSBkaXJlY3RseSAqLworCQlDSEVDSyggMCwgcHRocmVhZF9jcmVhdGUoJnRociwgTlVMTCwgaGFuZHNoYWtlX3RociwgJmhmKSApOworCQlDSEVDSyggMCwgZmRfY254X2hhbmRzaGFrZShzZXJ2ZXJfc2lkZSwgR05VVExTX1NFUlZFUiwgQUxHT19IQU5EU0hBS0VfMzQzNiwgTlVMTCwgTlVMTCkgKTsKKwkJQ0hFQ0soIDAsIHB0aHJlYWRfam9pbih0aHIsIE5VTEwpICk7CisJCUNIRUNLKCAwLCBoZi5yZXQgKTsKKwkJCisJCS8qIFNlbmQgYSBmZXcgVExTIHByb3RlY3RlZCBtZXNzYWdlLCBhbmQgcmVwbGllcyAqLworCQlmb3IgKGkgPSAwOyBpIDwgNCAqIE5CX1NUUkVBTVM7IGkrKykgeworCQkJQ0hFQ0soIDAsIGZkX2NueF9zZW5kKHNlcnZlcl9zaWRlLCBjZXJfYnVmLCBjZXJfc3opKTsKKwkJCUNIRUNLKCAwLCBmZF9jbnhfcmVjZWl2ZShjbGllbnRfc2lkZSwgTlVMTCwgJnJjdl9idWYsICZyY3Zfc3opKTsKKwkJCUNIRUNLKCBjZXJfc3osIHJjdl9zeiApOworCQkJQ0hFQ0soIDAsIG1lbWNtcCggcmN2X2J1ZiwgY2VyX2J1ZiwgY2VyX3N6ICkgKTsKKwkJCWZyZWUocmN2X2J1Zik7CisKKwkJCUNIRUNLKCAwLCBmZF9jbnhfc2VuZChjbGllbnRfc2lkZSwgY2VyX2J1ZiwgY2VyX3N6KSk7CisJCQlDSEVDSyggMCwgZmRfY254X3JlY2VpdmUoc2VydmVyX3NpZGUsIE5VTEwsICZyY3ZfYnVmLCAmcmN2X3N6KSk7CisJCQlDSEVDSyggY2VyX3N6LCByY3Zfc3ogKTsKKwkJCUNIRUNLKCAwLCBtZW1jbXAoIHJjdl9idWYsIGNlcl9idWYsIGNlcl9zeiApICk7CisJCQlmcmVlKHJjdl9idWYpOworCQl9CisJCQorCQkvKiBOb3cgY2xvc2UgdGhlIGNvbm5lY3Rpb24gKi8KKwkJQ0hFQ0soIDAsIHB0aHJlYWRfY3JlYXRlKCZ0aHIsIE5VTEwsIGRlc3Ryb3lfdGhyLCBjbGllbnRfc2lkZSkgKTsKKwkJZmRfY254X2Rlc3Ryb3koc2VydmVyX3NpZGUpOworCQlDSEVDSyggMCwgcHRocmVhZF9qb2luKHRociwgTlVMTCkgKTsKKwkJCisJCS8qIERvIHRoZSBzYW1lIHRlc3QgYnV0IHdpdGggbW9yZSBzdHJlYW1zIG9uIHRoZSBzZXJ2ZXIgdGhpcyB0aW1lICovCisJCWZkX2dfY29uZmlnLT5jbmZfc2N0cF9zdHIgPSBOQl9TVFJFQU1TIC8gMjsKKwkJQ0hFQ0soIDAsIHB0aHJlYWRfY3JlYXRlKCZ0aHIsIE5VTEwsIGNvbm5lY3RfdGhyLCAmY2YpICk7CisKKwkJLyogQWNjZXB0IHRoZSBjb25uZWN0aW9uIG9mIHRoZSBjbGllbnQgKi8KKwkJc2VydmVyX3NpZGUgPSBmZF9jbnhfc2Vydl9hY2NlcHQobGlzdGVuZXJfc2N0cCk7CisJCUNIRUNLKCAxLCBzZXJ2ZXJfc2lkZSA/IDEgOiAwICk7CisJCQorCQkvKiBSZXRyaWV2ZSB0aGUgY2xpZW50IGNvbm5lY3Rpb24gb2JqZWN0ICovCisJCUNIRUNLKCAwLCBwdGhyZWFkX2pvaW4oIHRociwgKHZvaWQgKikmY2xpZW50X3NpZGUgKSApOworCQlDSEVDSyggMSwgY2xpZW50X3NpZGUgPyAxIDogMCApOworCQloZi5jbnggPSBjbGllbnRfc2lkZTsKKwkJCisJCS8qIFN0YXJ0IHRoZSBoYW5kc2hha2UgZGlyZWN0bHkgKi8KKwkJQ0hFQ0soIDAsIHB0aHJlYWRfY3JlYXRlKCZ0aHIsIE5VTEwsIGhhbmRzaGFrZV90aHIsICZoZikgKTsKKwkJQ0hFQ0soIDAsIGZkX2NueF9oYW5kc2hha2Uoc2VydmVyX3NpZGUsIEdOVVRMU19TRVJWRVIsIEFMR09fSEFORFNIQUtFXzM0MzYsIE5VTEwsIE5VTEwpICk7CisJCUNIRUNLKCAwLCBwdGhyZWFkX2pvaW4odGhyLCBOVUxMKSApOworCQlDSEVDSyggMCwgaGYucmV0ICk7CisJCQorCQkvKiBTZW5kIGEgZmV3IFRMUyBwcm90ZWN0ZWQgbWVzc2FnZSwgYW5kIHJlcGxpZXMgKi8KKwkJZm9yIChpID0gMDsgaSA8IDIgKiBOQl9TVFJFQU1TOyBpKyspIHsKKwkJCUNIRUNLKCAwLCBmZF9jbnhfc2VuZChzZXJ2ZXJfc2lkZSwgY2VyX2J1ZiwgY2VyX3N6KSk7CisJCQlDSEVDSyggMCwgZmRfY254X3JlY2VpdmUoY2xpZW50X3NpZGUsIE5VTEwsICZyY3ZfYnVmLCAmcmN2X3N6KSk7CisJCQlDSEVDSyggY2VyX3N6LCByY3Zfc3ogKTsKKwkJCUNIRUNLKCAwLCBtZW1jbXAoIHJjdl9idWYsIGNlcl9idWYsIGNlcl9zeiApICk7CisJCQlmcmVlKHJjdl9idWYpOworCisJCQlDSEVDSyggMCwgZmRfY254X3NlbmQoY2xpZW50X3NpZGUsIGNlcl9idWYsIGNlcl9zeikpOworCQkJQ0hFQ0soIDAsIGZkX2NueF9yZWNlaXZlKHNlcnZlcl9zaWRlLCBOVUxMLCAmcmN2X2J1ZiwgJnJjdl9zeikpOworCQkJQ0hFQ0soIGNlcl9zeiwgcmN2X3N6ICk7CisJCQlDSEVDSyggMCwgbWVtY21wKCByY3ZfYnVmLCBjZXJfYnVmLCBjZXJfc3ogKSApOworCQkJZnJlZShyY3ZfYnVmKTsKKwkJfQorCQkKKwkJLyogTm93IGNsb3NlIHRoZSBjb25uZWN0aW9uICovCisJCUNIRUNLKCAwLCBwdGhyZWFkX2NyZWF0ZSgmdGhyLCBOVUxMLCBkZXN0cm95X3RociwgY2xpZW50X3NpZGUpICk7CisJCWZkX2NueF9kZXN0cm95KHNlcnZlcl9zaWRlKTsKKwkJQ0hFQ0soIDAsIHB0aHJlYWRfam9pbih0aHIsIE5VTEwpICk7CisJCQorCQkKKwkJLyogRnJlZSB0aGUgY3JlZGVudGlhbHMgKi8KKwkJZ251dGxzX2NlcnRpZmljYXRlX2ZyZWVfa2V5cyhoZi5jcmVkcyk7CisJCWdudXRsc19jZXJ0aWZpY2F0ZV9mcmVlX2NhcyhoZi5jcmVkcyk7CisJCWdudXRsc19jZXJ0aWZpY2F0ZV9mcmVlX2NyZWRlbnRpYWxzKGhmLmNyZWRzKTsKKwl9CisJCisjZW5kaWYgLyogRElTQUJMRV9TQ1RQICovCisJCisJCisJLyogQmFzaWMgb3BlcmF0aW9uIHRlc3RlZCBzdWNjZXNzZnVsbHksIG5vdyB0ZXN0IHdlIGRldGVjdCBlcnJvciBjb25kaXRpb25zICovCisKKwkvKiBVbnRydXN0ZWQgY2VydGlmaWNhdGUsIFRDUCAqLworCXsKKwkJc3RydWN0IGNvbm5lY3RfZmxhZ3MgY2Y7CisJCXN0cnVjdCBoYW5kc2hha2VfZmxhZ3MgaGY7CisJCQorCQltZW1zZXQoJmNmLCAwLCBzaXplb2YoY2YpKTsKKwkJY2YucHJvdG8gPSBJUFBST1RPX1RDUDsKKwkJCisJCW1lbXNldCgmaGYsIDAsIHNpemVvZihoZikpOworCQkKKwkJLyogSW5pdGlhbGl6ZSByZW1vdGUgY2VydGlmaWNhdGUgKi8KKwkJQ0hFQ0tfR05VVExTX0RPKCByZXQgPSBnbnV0bHNfY2VydGlmaWNhdGVfYWxsb2NhdGVfY3JlZGVudGlhbHMgKCZoZi5jcmVkcyksICk7CisJCUNIRUNLKCBHTlVUTFNfRV9TVUNDRVNTLCByZXQgKTsKKwkJLyogU2V0IHRoZSBDQSAqLworCQlDSEVDS19HTlVUTFNfRE8oIHJldCA9IGdudXRsc19jZXJ0aWZpY2F0ZV9zZXRfeDUwOV90cnVzdF9tZW0oIGhmLmNyZWRzLCAmbm90cnVzdF9jYSwgR05VVExTX1g1MDlfRk1UX1BFTSksICk7CisJCUNIRUNLX0dOVVRMU19ETyggcmV0ID0gZ251dGxzX2NlcnRpZmljYXRlX3NldF94NTA5X3RydXN0X21lbSggaGYuY3JlZHMsICZjYSwgR05VVExTX1g1MDlfRk1UX1BFTSksICk7CisJCUNIRUNLKCAxLCByZXQgKTsKKwkJLyogU2V0IHRoZSBrZXkgKi8KKwkJQ0hFQ0tfR05VVExTX0RPKCByZXQgPSBnbnV0bHNfY2VydGlmaWNhdGVfc2V0X3g1MDlfa2V5X21lbSggaGYuY3JlZHMsICZub3RydXN0X2NlcnQsICZub3RydXN0X3ByaXYsIEdOVVRMU19YNTA5X0ZNVF9QRU0pLCApOworCQlDSEVDSyggR05VVExTX0VfU1VDQ0VTUywgcmV0ICk7CisJCQorCQkvKiBTdGFydCB0aGUgY2xpZW50IHRocmVhZCAqLworCQlDSEVDSyggMCwgcHRocmVhZF9jcmVhdGUoJnRociwgTlVMTCwgY29ubmVjdF90aHIsICZjZikgKTsKKworCQkvKiBBY2NlcHQgdGhlIGNvbm5lY3Rpb24gb2YgdGhlIGNsaWVudCAqLworCQlzZXJ2ZXJfc2lkZSA9IGZkX2NueF9zZXJ2X2FjY2VwdChsaXN0ZW5lcik7CisJCUNIRUNLKCAxLCBzZXJ2ZXJfc2lkZSA/IDEgOiAwICk7CisJCQorCQkvKiBSZXRyaWV2ZSB0aGUgY2xpZW50IGNvbm5lY3Rpb24gb2JqZWN0ICovCisJCUNIRUNLKCAwLCBwdGhyZWFkX2pvaW4oIHRociwgKHZvaWQgKikmY2xpZW50X3NpZGUgKSApOworCQlDSEVDSyggMSwgY2xpZW50X3NpZGUgPyAxIDogMCApOworCQloZi5jbnggPSBjbGllbnRfc2lkZTsKKwkJCisJCS8qIFN0YXJ0IHRoZSBoYW5kc2hha2UgZGlyZWN0bHkgKi8KKwkJQ0hFQ0soIDAsIHB0aHJlYWRfY3JlYXRlKCZ0aHIsIE5VTEwsIGhhbmRzaGFrZV90aHIsICZoZikgKTsKKwkJQ0hFQ0soIEVJTlZBTCwgZmRfY254X2hhbmRzaGFrZShzZXJ2ZXJfc2lkZSwgR05VVExTX1NFUlZFUiwgQUxHT19IQU5EU0hBS0VfREVGQVVMVCwgTlVMTCwgTlVMTCkgKTsKKwkJZmRfY254X2Rlc3Ryb3koc2VydmVyX3NpZGUpOworCQkKKwkJQ0hFQ0soIDAsIHB0aHJlYWRfam9pbih0aHIsIE5VTEwpICk7CisJCQorCQkvKiBOb3cgY2xvc2UgdGhlIGNvbm5lY3Rpb24gKi8KKwkJQ0hFQ0soIDAsIHB0aHJlYWRfY3JlYXRlKCZ0aHIsIE5VTEwsIGRlc3Ryb3lfdGhyLCBjbGllbnRfc2lkZSkgKTsKKwkJQ0hFQ0soIDAsIHB0aHJlYWRfam9pbih0aHIsIE5VTEwpICk7CisJCQorCQkvKiBGcmVlIHRoZSBjcmVkZW50aWFscyAqLworCQlnbnV0bHNfY2VydGlmaWNhdGVfZnJlZV9rZXlzKGhmLmNyZWRzKTsKKwkJZ251dGxzX2NlcnRpZmljYXRlX2ZyZWVfY2FzKGhmLmNyZWRzKTsKKwkJZ251dGxzX2NlcnRpZmljYXRlX2ZyZWVfY3JlZGVudGlhbHMoaGYuY3JlZHMpOworCX0KKwkKKwkvKiBTYW1lIGluIFNDVFAgKi8KKyNpZm5kZWYgRElTQUJMRV9TQ1RQCisJLyogRFRMUyAqLworCVRPRE8oIkVuYWJsZWQgYWZ0ZXIgRFRMUyBpbXBsZW1lbnRhdGlvbiIpOworCWlmICgwKQorCXsKKwkJc3RydWN0IGNvbm5lY3RfZmxhZ3MgY2Y7CisJCXN0cnVjdCBoYW5kc2hha2VfZmxhZ3MgaGY7CisJCQorCQltZW1zZXQoJmNmLCAwLCBzaXplb2YoY2YpKTsKKwkJY2YucHJvdG8gPSBJUFBST1RPX1NDVFA7CisJCQorCQltZW1zZXQoJmhmLCAwLCBzaXplb2YoaGYpKTsKKwkJCisJCS8qIEluaXRpYWxpemUgcmVtb3RlIGNlcnRpZmljYXRlICovCisJCUNIRUNLX0dOVVRMU19ETyggcmV0ID0gZ251dGxzX2NlcnRpZmljYXRlX2FsbG9jYXRlX2NyZWRlbnRpYWxzICgmaGYuY3JlZHMpLCApOworCQlDSEVDSyggR05VVExTX0VfU1VDQ0VTUywgcmV0ICk7CisJCS8qIFNldCB0aGUgQ0EgKi8KKwkJQ0hFQ0tfR05VVExTX0RPKCByZXQgPSBnbnV0bHNfY2VydGlmaWNhdGVfc2V0X3g1MDlfdHJ1c3RfbWVtKCBoZi5jcmVkcywgJm5vdHJ1c3RfY2EsIEdOVVRMU19YNTA5X0ZNVF9QRU0pLCApOworCQlDSEVDS19HTlVUTFNfRE8oIHJldCA9IGdudXRsc19jZXJ0aWZpY2F0ZV9zZXRfeDUwOV90cnVzdF9tZW0oIGhmLmNyZWRzLCAmY2EsIEdOVVRMU19YNTA5X0ZNVF9QRU0pLCApOworCQlDSEVDSyggMSwgcmV0ICk7CisJCS8qIFNldCB0aGUga2V5ICovCisJCUNIRUNLX0dOVVRMU19ETyggcmV0ID0gZ251dGxzX2NlcnRpZmljYXRlX3NldF94NTA5X2tleV9tZW0oIGhmLmNyZWRzLCAmbm90cnVzdF9jZXJ0LCAmbm90cnVzdF9wcml2LCBHTlVUTFNfWDUwOV9GTVRfUEVNKSwgKTsKKwkJQ0hFQ0soIEdOVVRMU19FX1NVQ0NFU1MsIHJldCApOworCQkKKwkJLyogU3RhcnQgdGhlIGNsaWVudCB0aHJlYWQgKi8KKwkJQ0hFQ0soIDAsIHB0aHJlYWRfY3JlYXRlKCZ0aHIsIE5VTEwsIGNvbm5lY3RfdGhyLCAmY2YpICk7CisKKwkJLyogQWNjZXB0IHRoZSBjb25uZWN0aW9uIG9mIHRoZSBjbGllbnQgKi8KKwkJc2VydmVyX3NpZGUgPSBmZF9jbnhfc2Vydl9hY2NlcHQobGlzdGVuZXJfc2N0cCk7CisJCUNIRUNLKCAxLCBzZXJ2ZXJfc2lkZSA/IDEgOiAwICk7CisJCQorCQkvKiBSZXRyaWV2ZSB0aGUgY2xpZW50IGNvbm5lY3Rpb24gb2JqZWN0ICovCisJCUNIRUNLKCAwLCBwdGhyZWFkX2pvaW4oIHRociwgKHZvaWQgKikmY2xpZW50X3NpZGUgKSApOworCQlDSEVDSyggMSwgY2xpZW50X3NpZGUgPyAxIDogMCApOworCQloZi5jbnggPSBjbGllbnRfc2lkZTsKKwkJCisJCS8qIFN0YXJ0IHRoZSBoYW5kc2hha2UgZGlyZWN0bHkgKi8KKwkJQ0hFQ0soIDAsIHB0aHJlYWRfY3JlYXRlKCZ0aHIsIE5VTEwsIGhhbmRzaGFrZV90aHIsICZoZikgKTsKKwkJQ0hFQ0soIEVJTlZBTCwgZmRfY254X2hhbmRzaGFrZShzZXJ2ZXJfc2lkZSwgR05VVExTX1NFUlZFUiwgQUxHT19IQU5EU0hBS0VfREVGQVVMVCwgTlVMTCwgTlVMTCkgKTsKKwkJZmRfY254X2Rlc3Ryb3koc2VydmVyX3NpZGUpOworCQlDSEVDSyggMCwgcHRocmVhZF9qb2luKHRociwgTlVMTCkgKTsKKwkJCisJCS8qIE5vdyBjbG9zZSB0aGUgY29ubmVjdGlvbiAqLworCQlDSEVDSyggMCwgcHRocmVhZF9jcmVhdGUoJnRociwgTlVMTCwgZGVzdHJveV90aHIsIGNsaWVudF9zaWRlKSApOworCQlDSEVDSyggMCwgcHRocmVhZF9qb2luKHRociwgTlVMTCkgKTsKKwkJCisJCS8qIEZyZWUgdGhlIGNyZWRlbnRpYWxzICovCisJCWdudXRsc19jZXJ0aWZpY2F0ZV9mcmVlX2tleXMoaGYuY3JlZHMpOworCQlnbnV0bHNfY2VydGlmaWNhdGVfZnJlZV9jYXMoaGYuY3JlZHMpOworCQlnbnV0bHNfY2VydGlmaWNhdGVfZnJlZV9jcmVkZW50aWFscyhoZi5jcmVkcyk7CisJfQorCQorCS8qIFRMUyAqLworCXsKKwkJc3RydWN0IGNvbm5lY3RfZmxhZ3MgY2Y7CisJCXN0cnVjdCBoYW5kc2hha2VfZmxhZ3MgaGY7CisJCQorCQltZW1zZXQoJmNmLCAwLCBzaXplb2YoY2YpKTsKKwkJY2YucHJvdG8gPSBJUFBST1RPX1NDVFA7CisJCQorCQltZW1zZXQoJmhmLCAwLCBzaXplb2YoaGYpKTsKKwkJaGYuYWxnbyA9IEFMR09fSEFORFNIQUtFXzM0MzY7CisJCQorCQkvKiBJbml0aWFsaXplIHJlbW90ZSBjZXJ0aWZpY2F0ZSAqLworCQlDSEVDS19HTlVUTFNfRE8oIHJldCA9IGdudXRsc19jZXJ0aWZpY2F0ZV9hbGxvY2F0ZV9jcmVkZW50aWFscyAoJmhmLmNyZWRzKSwgKTsKKwkJQ0hFQ0soIEdOVVRMU19FX1NVQ0NFU1MsIHJldCApOworCQkvKiBTZXQgdGhlIENBICovCisJCUNIRUNLX0dOVVRMU19ETyggcmV0ID0gZ251dGxzX2NlcnRpZmljYXRlX3NldF94NTA5X3RydXN0X21lbSggaGYuY3JlZHMsICZub3RydXN0X2NhLCBHTlVUTFNfWDUwOV9GTVRfUEVNKSwgKTsKKwkJQ0hFQ0tfR05VVExTX0RPKCByZXQgPSBnbnV0bHNfY2VydGlmaWNhdGVfc2V0X3g1MDlfdHJ1c3RfbWVtKCBoZi5jcmVkcywgJmNhLCBHTlVUTFNfWDUwOV9GTVRfUEVNKSwgKTsKKwkJQ0hFQ0soIDEsIHJldCApOworCQkvKiBTZXQgdGhlIGtleSAqLworCQlDSEVDS19HTlVUTFNfRE8oIHJldCA9IGdudXRsc19jZXJ0aWZpY2F0ZV9zZXRfeDUwOV9rZXlfbWVtKCBoZi5jcmVkcywgJm5vdHJ1c3RfY2VydCwgJm5vdHJ1c3RfcHJpdiwgR05VVExTX1g1MDlfRk1UX1BFTSksICk7CisJCUNIRUNLKCBHTlVUTFNfRV9TVUNDRVNTLCByZXQgKTsKKwkJCisJCS8qIFN0YXJ0IHRoZSBjbGllbnQgdGhyZWFkICovCisJCUNIRUNLKCAwLCBwdGhyZWFkX2NyZWF0ZSgmdGhyLCBOVUxMLCBjb25uZWN0X3RociwgJmNmKSApOworCisJCS8qIEFjY2VwdCB0aGUgY29ubmVjdGlvbiBvZiB0aGUgY2xpZW50ICovCisJCXNlcnZlcl9zaWRlID0gZmRfY254X3NlcnZfYWNjZXB0KGxpc3RlbmVyX3NjdHApOworCQlDSEVDSyggMSwgc2VydmVyX3NpZGUgPyAxIDogMCApOworCQkKKwkJLyogUmV0cmlldmUgdGhlIGNsaWVudCBjb25uZWN0aW9uIG9iamVjdCAqLworCQlDSEVDSyggMCwgcHRocmVhZF9qb2luKCB0aHIsICh2b2lkICopJmNsaWVudF9zaWRlICkgKTsKKwkJQ0hFQ0soIDEsIGNsaWVudF9zaWRlID8gMSA6IDAgKTsKKwkJaGYuY254ID0gY2xpZW50X3NpZGU7CisJCQorCQkvKiBTdGFydCB0aGUgaGFuZHNoYWtlIGRpcmVjdGx5ICovCisJCUNIRUNLKCAwLCBwdGhyZWFkX2NyZWF0ZSgmdGhyLCBOVUxMLCBoYW5kc2hha2VfdGhyLCAmaGYpICk7CisJCUNIRUNLKCBFSU5WQUwsIGZkX2NueF9oYW5kc2hha2Uoc2VydmVyX3NpZGUsIEdOVVRMU19TRVJWRVIsIEFMR09fSEFORFNIQUtFXzM0MzYsIE5VTEwsIE5VTEwpICk7CisJCWZkX2NueF9kZXN0cm95KHNlcnZlcl9zaWRlKTsKKwkJQ0hFQ0soIDAsIHB0aHJlYWRfam9pbih0aHIsIE5VTEwpICk7CisJCQorCQkvKiBOb3cgY2xvc2UgdGhlIGNvbm5lY3Rpb24gKi8KKwkJQ0hFQ0soIDAsIHB0aHJlYWRfY3JlYXRlKCZ0aHIsIE5VTEwsIGRlc3Ryb3lfdGhyLCBjbGllbnRfc2lkZSkgKTsKKwkJQ0hFQ0soIDAsIHB0aHJlYWRfam9pbih0aHIsIE5VTEwpICk7CisJCQorCQkvKiBGcmVlIHRoZSBjcmVkZW50aWFscyAqLworCQlnbnV0bHNfY2VydGlmaWNhdGVfZnJlZV9rZXlzKGhmLmNyZWRzKTsKKwkJZ251dGxzX2NlcnRpZmljYXRlX2ZyZWVfY2FzKGhmLmNyZWRzKTsKKwkJZ251dGxzX2NlcnRpZmljYXRlX2ZyZWVfY3JlZGVudGlhbHMoaGYuY3JlZHMpOworCX0KKyNlbmRpZiAvKiBESVNBQkxFX1NDVFAgKi8KKwkKKwkvKiBFeHBpcmVkIGNlcnRpZmljYXRlICovCisJeworCQlzdHJ1Y3QgY29ubmVjdF9mbGFncyBjZjsKKwkJc3RydWN0IGhhbmRzaGFrZV9mbGFncyBoZjsKKwkJCisJCW1lbXNldCgmY2YsIDAsIHNpemVvZihjZikpOworCQljZi5wcm90byA9IElQUFJPVE9fVENQOworCQkKKwkJbWVtc2V0KCZoZiwgMCwgc2l6ZW9mKGhmKSk7CisJCQorCQkvKiBJbml0aWFsaXplIHJlbW90ZSBjZXJ0aWZpY2F0ZSAqLworCQlDSEVDS19HTlVUTFNfRE8oIHJldCA9IGdudXRsc19jZXJ0aWZpY2F0ZV9hbGxvY2F0ZV9jcmVkZW50aWFscyAoJmhmLmNyZWRzKSwgKTsKKwkJQ0hFQ0soIEdOVVRMU19FX1NVQ0NFU1MsIHJldCApOworCQkvKiBTZXQgdGhlIENBICovCisJCUNIRUNLX0dOVVRMU19ETyggcmV0ID0gZ251dGxzX2NlcnRpZmljYXRlX3NldF94NTA5X3RydXN0X21lbSggaGYuY3JlZHMsICZjYSwgR05VVExTX1g1MDlfRk1UX1BFTSksICk7CisJCUNIRUNLKCAxLCByZXQgKTsKKwkJLyogU2V0IHRoZSBrZXkgKi8KKwkJQ0hFQ0tfR05VVExTX0RPKCByZXQgPSBnbnV0bHNfY2VydGlmaWNhdGVfc2V0X3g1MDlfa2V5X21lbSggaGYuY3JlZHMsICZleHBpcmVkX2NlcnQsICZleHBpcmVkX3ByaXYsIEdOVVRMU19YNTA5X0ZNVF9QRU0pLCApOworCQlDSEVDSyggR05VVExTX0VfU1VDQ0VTUywgcmV0ICk7CisJCQorCQkvKiBTdGFydCB0aGUgY2xpZW50IHRocmVhZCAqLworCQlDSEVDSyggMCwgcHRocmVhZF9jcmVhdGUoJnRociwgTlVMTCwgY29ubmVjdF90aHIsICZjZikgKTsKKworCQkvKiBBY2NlcHQgdGhlIGNvbm5lY3Rpb24gb2YgdGhlIGNsaWVudCAqLworCQlzZXJ2ZXJfc2lkZSA9IGZkX2NueF9zZXJ2X2FjY2VwdChsaXN0ZW5lcik7CisJCUNIRUNLKCAxLCBzZXJ2ZXJfc2lkZSA/IDEgOiAwICk7CisJCQorCQkvKiBSZXRyaWV2ZSB0aGUgY2xpZW50IGNvbm5lY3Rpb24gb2JqZWN0ICovCisJCUNIRUNLKCAwLCBwdGhyZWFkX2pvaW4oIHRociwgKHZvaWQgKikmY2xpZW50X3NpZGUgKSApOworCQlDSEVDSyggMSwgY2xpZW50X3NpZGUgPyAxIDogMCApOworCQloZi5jbnggPSBjbGllbnRfc2lkZTsKKwkJCisJCS8qIFN0YXJ0IHRoZSBoYW5kc2hha2UgZGlyZWN0bHkgKi8KKwkJQ0hFQ0soIDAsIHB0aHJlYWRfY3JlYXRlKCZ0aHIsIE5VTEwsIGhhbmRzaGFrZV90aHIsICZoZikgKTsKKwkJQ0hFQ0soIEVJTlZBTCwgZmRfY254X2hhbmRzaGFrZShzZXJ2ZXJfc2lkZSwgR05VVExTX1NFUlZFUiwgQUxHT19IQU5EU0hBS0VfREVGQVVMVCwgTlVMTCwgTlVMTCkgKTsKKwkJZmRfY254X2Rlc3Ryb3koc2VydmVyX3NpZGUpOworCQlDSEVDSyggMCwgcHRocmVhZF9qb2luKHRociwgTlVMTCkgKTsKKwkJCisJCS8qIE5vdyBjbG9zZSB0aGUgY29ubmVjdGlvbiAqLworCQlDSEVDSyggMCwgcHRocmVhZF9jcmVhdGUoJnRociwgTlVMTCwgZGVzdHJveV90aHIsIGNsaWVudF9zaWRlKSApOworCQlDSEVDSyggMCwgcHRocmVhZF9qb2luKHRociwgTlVMTCkgKTsKKwkJCisJCS8qIEZyZWUgdGhlIGNyZWRlbnRpYWxzICovCisJCWdudXRsc19jZXJ0aWZpY2F0ZV9mcmVlX2tleXMoaGYuY3JlZHMpOworCQlnbnV0bHNfY2VydGlmaWNhdGVfZnJlZV9jYXMoaGYuY3JlZHMpOworCQlnbnV0bHNfY2VydGlmaWNhdGVfZnJlZV9jcmVkZW50aWFscyhoZi5jcmVkcyk7CisJfQorCQorCS8qIE5vbiBtYXRjaGluZyBob3N0bmFtZSAqLworCQorCXsKKwkJc3RydWN0IGNvbm5lY3RfZmxhZ3MgY2Y7CisJCXN0cnVjdCBoYW5kc2hha2VfZmxhZ3MgaGY7CisJCQorCQltZW1zZXQoJmNmLCAwLCBzaXplb2YoY2YpKTsKKwkJY2YucHJvdG8gPSBJUFBST1RPX1RDUDsKKwkJCisJCW1lbXNldCgmaGYsIDAsIHNpemVvZihoZikpOworCQkKKwkJLyogSW5pdGlhbGl6ZSByZW1vdGUgY2VydGlmaWNhdGUgKi8KKwkJQ0hFQ0tfR05VVExTX0RPKCByZXQgPSBnbnV0bHNfY2VydGlmaWNhdGVfYWxsb2NhdGVfY3JlZGVudGlhbHMgKCZoZi5jcmVkcyksICk7CisJCUNIRUNLKCBHTlVUTFNfRV9TVUNDRVNTLCByZXQgKTsKKwkJLyogU2V0IHRoZSBDQSAqLworCQlDSEVDS19HTlVUTFNfRE8oIHJldCA9IGdudXRsc19jZXJ0aWZpY2F0ZV9zZXRfeDUwOV90cnVzdF9tZW0oIGhmLmNyZWRzLCAmY2EsIEdOVVRMU19YNTA5X0ZNVF9QRU0pLCApOworCQlDSEVDSyggMSwgcmV0ICk7CisJCS8qIFNldCB0aGUga2V5ICovCisJCUNIRUNLX0dOVVRMU19ETyggcmV0ID0gZ251dGxzX2NlcnRpZmljYXRlX3NldF94NTA5X2tleV9tZW0oIGhmLmNyZWRzLCAmY2xpZW50X2NlcnQsICZjbGllbnRfcHJpdiwgR05VVExTX1g1MDlfRk1UX1BFTSksICk7CisJCUNIRUNLKCBHTlVUTFNfRV9TVUNDRVNTLCByZXQgKTsKKwkJCisJCS8qIFN0YXJ0IHRoZSBjbGllbnQgdGhyZWFkICovCisJCUNIRUNLKCAwLCBwdGhyZWFkX2NyZWF0ZSgmdGhyLCBOVUxMLCBjb25uZWN0X3RociwgJmNmKSApOworCisJCS8qIEFjY2VwdCB0aGUgY29ubmVjdGlvbiBvZiB0aGUgY2xpZW50ICovCisJCXNlcnZlcl9zaWRlID0gZmRfY254X3NlcnZfYWNjZXB0KGxpc3RlbmVyKTsKKwkJQ0hFQ0soIDEsIHNlcnZlcl9zaWRlID8gMSA6IDAgKTsKKwkJCisJCS8qIFJldHJpZXZlIHRoZSBjbGllbnQgY29ubmVjdGlvbiBvYmplY3QgKi8KKwkJQ0hFQ0soIDAsIHB0aHJlYWRfam9pbiggdGhyLCAodm9pZCAqKSZjbGllbnRfc2lkZSApICk7CisJCUNIRUNLKCAxLCBjbGllbnRfc2lkZSA/IDEgOiAwICk7CisJCWhmLmNueCA9IGNsaWVudF9zaWRlOworCQkKKwkJLyogU2V0IHRoZSBjb3JyZWN0IGhvc3RuYW1lIHdlIGV4cGVjdCBmcm9tIHRoZSBjbGllbnQgKGluIHRoZSBzZXJ2ZXIpICovCisJCWZkX2NueF9zZXRob3N0bmFtZShzZXJ2ZXJfc2lkZSwgImNsaWVudC50ZXN0Iik7CisJCQorCQkvKiBTdGFydCB0aGUgaGFuZHNoYWtlLCBjaGVjayBpdCBpcyBzdWNjZXNzZnVsICovCisJCUNIRUNLKCAwLCBwdGhyZWFkX2NyZWF0ZSgmdGhyLCBOVUxMLCBoYW5kc2hha2VfdGhyLCAmaGYpICk7CisJCUNIRUNLKCAwLCBmZF9jbnhfaGFuZHNoYWtlKHNlcnZlcl9zaWRlLCBHTlVUTFNfU0VSVkVSLCBBTEdPX0hBTkRTSEFLRV9ERUZBVUxULCBOVUxMLCBOVUxMKSApOworCQlDSEVDSyggMCwgcHRocmVhZF9qb2luKHRociwgTlVMTCkgKTsKKwkJQ0hFQ0soIDAsIGhmLnJldCApOworCQkKKwkJLyogTm93IGNsb3NlIHRoZSBjb25uZWN0aW9uICovCisJCUNIRUNLKCAwLCBwdGhyZWFkX2NyZWF0ZSgmdGhyLCBOVUxMLCBkZXN0cm95X3RociwgY2xpZW50X3NpZGUpICk7CisJCWZkX2NueF9kZXN0cm95KHNlcnZlcl9zaWRlKTsKKwkJQ0hFQ0soIDAsIHB0aHJlYWRfam9pbih0aHIsIE5VTEwpICk7CisJCQorCQkvKiBEbyBpdCBhZ2FpbiB3aXRoIGFuIGludmFsaWQgaG9zdG5hbWUgKi8KKwkJQ0hFQ0soIDAsIHB0aHJlYWRfY3JlYXRlKCZ0aHIsIE5VTEwsIGNvbm5lY3RfdGhyLCAmY2YpICk7CisKKwkJLyogQWNjZXB0IHRoZSBjb25uZWN0aW9uIG9mIHRoZSBjbGllbnQgKi8KKwkJc2VydmVyX3NpZGUgPSBmZF9jbnhfc2Vydl9hY2NlcHQobGlzdGVuZXIpOworCQlDSEVDSyggMSwgc2VydmVyX3NpZGUgPyAxIDogMCApOworCQkKKwkJLyogUmV0cmlldmUgdGhlIGNsaWVudCBjb25uZWN0aW9uIG9iamVjdCAqLworCQlDSEVDSyggMCwgcHRocmVhZF9qb2luKCB0aHIsICh2b2lkICopJmNsaWVudF9zaWRlICkgKTsKKwkJQ0hFQ0soIDEsIGNsaWVudF9zaWRlID8gMSA6IDAgKTsKKwkJaGYuY254ID0gY2xpZW50X3NpZGU7CisJCQorCQkvKiBTZXQgdGhlIGNvcnJlY3QgaG9zdG5hbWUgd2UgZXhwZWN0IGZyb20gdGhlIGNsaWVudCAoaW4gdGhlIHNlcnZlcikgKi8KKwkJZmRfY254X3NldGhvc3RuYW1lKHNlcnZlcl9zaWRlLCAibm9tYXRjaC50ZXN0Iik7CisJCQorCQkvKiBTdGFydCB0aGUgaGFuZHNoYWtlLCBjaGVjayBpdCBpcyBzdWNjZXNzZnVsICovCisJCUNIRUNLKCAwLCBwdGhyZWFkX2NyZWF0ZSgmdGhyLCBOVUxMLCBoYW5kc2hha2VfdGhyLCAmaGYpICk7CisJCUNIRUNLKCBFSU5WQUwsIGZkX2NueF9oYW5kc2hha2Uoc2VydmVyX3NpZGUsIEdOVVRMU19TRVJWRVIsIEFMR09fSEFORFNIQUtFX0RFRkFVTFQsIE5VTEwsIE5VTEwpICk7CisJCWZkX2NueF9kZXN0cm95KHNlcnZlcl9zaWRlKTsKKwkJQ0hFQ0soIDAsIHB0aHJlYWRfam9pbih0aHIsIE5VTEwpICk7CisJCQorCQkvKiBOb3cgY2xvc2UgdGhlIGNvbm5lY3Rpb24gKi8KKwkJQ0hFQ0soIDAsIHB0aHJlYWRfY3JlYXRlKCZ0aHIsIE5VTEwsIGRlc3Ryb3lfdGhyLCBjbGllbnRfc2lkZSkgKTsKKwkJQ0hFQ0soIDAsIHB0aHJlYWRfam9pbih0aHIsIE5VTEwpICk7CisJCQorCQkvKiBGcmVlIHRoZSBjcmVkZW50aWFscyAqLworCQlnbnV0bHNfY2VydGlmaWNhdGVfZnJlZV9rZXlzKGhmLmNyZWRzKTsKKwkJZ251dGxzX2NlcnRpZmljYXRlX2ZyZWVfY2FzKGhmLmNyZWRzKTsKKwkJZ251dGxzX2NlcnRpZmljYXRlX2ZyZWVfY3JlZGVudGlhbHMoaGYuY3JlZHMpOworCX0KKwkKKwkvKiBUZXN0IHRoZSBvdGhlciBmdW5jdGlvbnMgb2YgdGhlIG1vZHVsZSAqLworCXsKKwkJc3RydWN0IGNvbm5lY3RfZmxhZ3MgY2Y7CisJCXN0cnVjdCBoYW5kc2hha2VfZmxhZ3MgaGY7CisJCWNoYXIgKiBzdHI7CisJCWNvbnN0IGdudXRsc19kYXR1bV90ICpjZXJ0X2xpc3Q7CisJCXVuc2lnbmVkIGludCBjZXJ0X2xpc3Rfc2l6ZTsKKwkJc3RydWN0IGZpZm8gKiBteWZpZm8gPSBOVUxMOworCQlzdHJ1Y3QgdGltZXNwZWMgbm93OworCQlpbnQgZXZfY29kZTsKKwkJCisJCW1lbXNldCgmY2YsIDAsIHNpemVvZihjZikpOworCQljZi5wcm90byA9IElQUFJPVE9fVENQOworCQkKKwkJbWVtc2V0KCZoZiwgMCwgc2l6ZW9mKGhmKSk7CisJCQorCQkvKiBJbml0aWFsaXplIHJlbW90ZSBjZXJ0aWZpY2F0ZSAqLworCQlDSEVDS19HTlVUTFNfRE8oIHJldCA9IGdudXRsc19jZXJ0aWZpY2F0ZV9hbGxvY2F0ZV9jcmVkZW50aWFscyAoJmhmLmNyZWRzKSwgKTsKKwkJQ0hFQ0soIEdOVVRMU19FX1NVQ0NFU1MsIHJldCApOworCQkvKiBTZXQgdGhlIENBICovCisJCUNIRUNLX0dOVVRMU19ETyggcmV0ID0gZ251dGxzX2NlcnRpZmljYXRlX3NldF94NTA5X3RydXN0X21lbSggaGYuY3JlZHMsICZjYSwgR05VVExTX1g1MDlfRk1UX1BFTSksICk7CisJCUNIRUNLKCAxLCByZXQgKTsKKwkJLyogU2V0IHRoZSBrZXkgKi8KKwkJQ0hFQ0tfR05VVExTX0RPKCByZXQgPSBnbnV0bHNfY2VydGlmaWNhdGVfc2V0X3g1MDlfa2V5X21lbSggaGYuY3JlZHMsICZjbGllbnRfY2VydCwgJmNsaWVudF9wcml2LCBHTlVUTFNfWDUwOV9GTVRfUEVNKSwgKTsKKwkJQ0hFQ0soIEdOVVRMU19FX1NVQ0NFU1MsIHJldCApOworCQkKKwkJLyogU3RhcnQgdGhlIGNsaWVudCB0aHJlYWQgKi8KKwkJQ0hFQ0soIDAsIHB0aHJlYWRfY3JlYXRlKCZ0aHIsIE5VTEwsIGNvbm5lY3RfdGhyLCAmY2YpICk7CisKKwkJLyogQWNjZXB0IHRoZSBjb25uZWN0aW9uIG9mIHRoZSBjbGllbnQgKi8KKwkJc2VydmVyX3NpZGUgPSBmZF9jbnhfc2Vydl9hY2NlcHQobGlzdGVuZXIpOworCQlDSEVDSyggMSwgc2VydmVyX3NpZGUgPyAxIDogMCApOworCQkKKwkJLyogUmV0cmlldmUgdGhlIGNsaWVudCBjb25uZWN0aW9uIG9iamVjdCAqLworCQlDSEVDSyggMCwgcHRocmVhZF9qb2luKCB0aHIsICh2b2lkICopJmNsaWVudF9zaWRlICkgKTsKKwkJQ0hFQ0soIDEsIGNsaWVudF9zaWRlID8gMSA6IDAgKTsKKwkJaGYuY254ID0gY2xpZW50X3NpZGU7CisJCQorCQkvKiBTdGFydCB0aGUgaGFuZHNoYWtlICovCisJCUNIRUNLKCAwLCBwdGhyZWFkX2NyZWF0ZSgmdGhyLCBOVUxMLCBoYW5kc2hha2VfdGhyLCAmaGYpICk7CisJCUNIRUNLKCAwLCBmZF9jbnhfaGFuZHNoYWtlKHNlcnZlcl9zaWRlLCBHTlVUTFNfU0VSVkVSLCBBTEdPX0hBTkRTSEFLRV9ERUZBVUxULCBOVUxMLCBOVUxMKSApOworCQlDSEVDSyggMCwgcHRocmVhZF9qb2luKHRociwgTlVMTCkgKTsKKwkJQ0hFQ0soIDAsIGhmLnJldCApOworCQkKKwkJLyogVGVzdCBzb21lIHNpbXBsZSBmdW5jdGlvbnMgKi8KKwkJCisJCS8qIGZkX2NueF9nZXRpZCAqLworCQlzdHIgPSBmZF9jbnhfZ2V0aWQoc2VydmVyX3NpZGUpOworCQlDSEVDSyggMSwgc3RyID8gMSA6IDAgKTsKKwkJQ0hFQ0soIDEsIChzdHJbMF0gIT0gJ1wwJykgPyAxIDogMCApOworCQkKKwkJLyogZmRfY254X2dldHByb3RvICovCisJCWkgPSBmZF9jbnhfZ2V0cHJvdG8oc2VydmVyX3NpZGUpOworCQlDSEVDSyggSVBQUk9UT19UQ1AsIGkpOworCQkKKwkJLyogZmRfY254X2dldFRMUyAqLworCQlpID0gZmRfY254X2dldFRMUyhzZXJ2ZXJfc2lkZSk7CisJCUNIRUNLKCAxLCBpID8gMSA6IDAgKTsKKwkJCisJCS8qIGZkX2NueF9nZXRjcmVkICovCisJCUNIRUNLKCAwLCBmZF9jbnhfZ2V0Y3JlZChzZXJ2ZXJfc2lkZSwgJmNlcnRfbGlzdCwgJmNlcnRfbGlzdF9zaXplKSApOworCQlDSEVDSyggMSwgKGNlcnRfbGlzdF9zaXplID4gMCkgPyAxIDogMCApOworCQkvKiBXZSBjb3VsZCBhbHNvIHZlcmlmeSB0aGF0IHRoZSBjZXJ0X2xpc3QgcmVhbGx5IGNvbnRhaW5zIHRoZSBjbGllbnRfY2VydCBhbmQgY2EgY2VydGlmaWNhdGVzICovCisJCQorCQkvKiBmZF9jbnhfZ2V0cmVtb3RlaWQgKi8KKwkJc3RyID0gZmRfY254X2dldHJlbW90ZWlkKHNlcnZlcl9zaWRlKTsKKwkJQ0hFQ0soIDEsIHN0ciA/IDEgOiAwICk7CisJCUNIRUNLKCAxLCAoc3RyWzBdICE9ICdcMCcpID8gMSA6IDAgKTsKKwkJCisJCS8qIGZkX2NueF9yZWN2X3NldGFsdGZpZm8gKi8KKwkJQ0hFQ0soIDAsIGZkX2NueF9zZW5kKGNsaWVudF9zaWRlLCBjZXJfYnVmLCBjZXJfc3opKTsKKwkJQ0hFQ0soIDAsIGZkX2ZpZm9fbmV3KCZteWZpZm8sIDApICk7CisJCUNIRUNLKCAwLCBmZF9jbnhfcmVjdl9zZXRhbHRmaWZvKHNlcnZlcl9zaWRlLCBteWZpZm8pICk7CisJCUNIRUNLKCAwLCBjbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmbm93KSApOworCQlkbyB7CisJCQlDSEVDSyggMCwgZmRfZXZlbnRfdGltZWRnZXQobXlmaWZvLCAmbm93LCBFVElNRURPVVQsICZldl9jb2RlLCBOVUxMLCAodm9pZCAqKSZyY3ZfYnVmKSApOworCQkJZnJlZShyY3ZfYnVmKTsKKwkJfSB3aGlsZSAoZXZfY29kZSAhPSBGREVWUF9DTlhfTVNHX1JFQ1YpOworCQkKKwkJLyogTm93IGNsb3NlIHRoZSBjb25uZWN0aW9uICovCisJCUNIRUNLKCAwLCBwdGhyZWFkX2NyZWF0ZSgmdGhyLCBOVUxMLCBkZXN0cm95X3RociwgY2xpZW50X3NpZGUpICk7CisJCWZkX2NueF9kZXN0cm95KHNlcnZlcl9zaWRlKTsKKwkJQ0hFQ0soIDAsIHB0aHJlYWRfam9pbih0aHIsIE5VTEwpICk7CisJCQorCQlmZF9ldmVudF9kZXN0cm95KCZteWZpZm8sIGZyZWUpOworCQkKKwkJLyogRnJlZSB0aGUgY3JlZGVudGlhbHMgKi8KKwkJZ251dGxzX2NlcnRpZmljYXRlX2ZyZWVfa2V5cyhoZi5jcmVkcyk7CisJCWdudXRsc19jZXJ0aWZpY2F0ZV9mcmVlX2NhcyhoZi5jcmVkcyk7CisJCWdudXRsc19jZXJ0aWZpY2F0ZV9mcmVlX2NyZWRlbnRpYWxzKGhmLmNyZWRzKTsKKwl9CisJCisjaWZuZGVmIERJU0FCTEVfU0NUUAorCS8qIEFuZCByZS10ZXN0IHdpdGggYSBTQ1RQIGNvbm5lY3Rpb24gKi8KKwlUT0RPKCJFbmFibGVkIGFmdGVyIERUTFMgaW1wbGVtZW50YXRpb24iKTsKKwlpZiAoMCkKKwl7CisJCXN0cnVjdCBjb25uZWN0X2ZsYWdzIGNmOworCQlzdHJ1Y3QgaGFuZHNoYWtlX2ZsYWdzIGhmOworCQljaGFyICogc3RyOworCQljb25zdCBnbnV0bHNfZGF0dW1fdCAqY2VydF9saXN0OworCQl1bnNpZ25lZCBpbnQgY2VydF9saXN0X3NpemU7CisJCXN0cnVjdCBmaWZvICogbXlmaWZvID0gTlVMTDsKKwkJc3RydWN0IHRpbWVzcGVjIG5vdzsKKwkJaW50IGV2X2NvZGU7CisJCQorCQltZW1zZXQoJmNmLCAwLCBzaXplb2YoY2YpKTsKKwkJY2YucHJvdG8gPSBJUFBST1RPX1NDVFA7CisJCQorCQltZW1zZXQoJmhmLCAwLCBzaXplb2YoaGYpKTsKKwkJCisJCS8qIEluaXRpYWxpemUgcmVtb3RlIGNlcnRpZmljYXRlICovCisJCUNIRUNLX0dOVVRMU19ETyggcmV0ID0gZ251dGxzX2NlcnRpZmljYXRlX2FsbG9jYXRlX2NyZWRlbnRpYWxzICgmaGYuY3JlZHMpLCApOworCQlDSEVDSyggR05VVExTX0VfU1VDQ0VTUywgcmV0ICk7CisJCS8qIFNldCB0aGUgQ0EgKi8KKwkJQ0hFQ0tfR05VVExTX0RPKCByZXQgPSBnbnV0bHNfY2VydGlmaWNhdGVfc2V0X3g1MDlfdHJ1c3RfbWVtKCBoZi5jcmVkcywgJmNhLCBHTlVUTFNfWDUwOV9GTVRfUEVNKSwgKTsKKwkJQ0hFQ0soIDEsIHJldCApOworCQkvKiBTZXQgdGhlIGtleSAqLworCQlDSEVDS19HTlVUTFNfRE8oIHJldCA9IGdudXRsc19jZXJ0aWZpY2F0ZV9zZXRfeDUwOV9rZXlfbWVtKCBoZi5jcmVkcywgJmNsaWVudF9jZXJ0LCAmY2xpZW50X3ByaXYsIEdOVVRMU19YNTA5X0ZNVF9QRU0pLCApOworCQlDSEVDSyggR05VVExTX0VfU1VDQ0VTUywgcmV0ICk7CisJCQorCQkvKiBTdGFydCB0aGUgY2xpZW50IHRocmVhZCAqLworCQlDSEVDSyggMCwgcHRocmVhZF9jcmVhdGUoJnRociwgTlVMTCwgY29ubmVjdF90aHIsICZjZikgKTsKKworCQkvKiBBY2NlcHQgdGhlIGNvbm5lY3Rpb24gb2YgdGhlIGNsaWVudCAqLworCQlzZXJ2ZXJfc2lkZSA9IGZkX2NueF9zZXJ2X2FjY2VwdChsaXN0ZW5lcl9zY3RwKTsKKwkJQ0hFQ0soIDEsIHNlcnZlcl9zaWRlID8gMSA6IDAgKTsKKwkJCisJCS8qIFJldHJpZXZlIHRoZSBjbGllbnQgY29ubmVjdGlvbiBvYmplY3QgKi8KKwkJQ0hFQ0soIDAsIHB0aHJlYWRfam9pbiggdGhyLCAodm9pZCAqKSZjbGllbnRfc2lkZSApICk7CisJCUNIRUNLKCAxLCBjbGllbnRfc2lkZSA/IDEgOiAwICk7CisJCWhmLmNueCA9IGNsaWVudF9zaWRlOworCQkKKwkJLyogU3RhcnQgdGhlIGhhbmRzaGFrZSAqLworCQlDSEVDSyggMCwgcHRocmVhZF9jcmVhdGUoJnRociwgTlVMTCwgaGFuZHNoYWtlX3RociwgJmhmKSApOworCQlDSEVDSyggMCwgZmRfY254X2hhbmRzaGFrZShzZXJ2ZXJfc2lkZSwgR05VVExTX1NFUlZFUiwgQUxHT19IQU5EU0hBS0VfREVGQVVMVCwgTlVMTCwgTlVMTCkgKTsKKwkJQ0hFQ0soIDAsIHB0aHJlYWRfam9pbih0aHIsIE5VTEwpICk7CisJCUNIRUNLKCAwLCBoZi5yZXQgKTsKKwkJCisJCS8qIFRlc3Qgc29tZSBzaW1wbGUgZnVuY3Rpb25zICovCisJCQorCQkvKiBmZF9jbnhfZ2V0aWQgKi8KKwkJc3RyID0gZmRfY254X2dldGlkKHNlcnZlcl9zaWRlKTsKKwkJQ0hFQ0soIDEsIHN0ciA/IDEgOiAwICk7CisJCUNIRUNLKCAxLCAoc3RyWzBdICE9ICdcMCcpID8gMSA6IDAgKTsKKwkJCisJCS8qIGZkX2NueF9nZXRwcm90byAqLworCQlpID0gZmRfY254X2dldHByb3RvKHNlcnZlcl9zaWRlKTsKKwkJQ0hFQ0soIElQUFJPVE9fU0NUUCwgaSk7CisJCQorCQkvKiBmZF9jbnhfZ2V0VExTICovCisJCWkgPSBmZF9jbnhfZ2V0VExTKHNlcnZlcl9zaWRlKTsKKwkJQ0hFQ0soIDEsIGkgPyAxIDogMCApOworCQkKKwkJLyogZmRfY254X2dldGNyZWQgKi8KKwkJQ0hFQ0soIDAsIGZkX2NueF9nZXRjcmVkKHNlcnZlcl9zaWRlLCAmY2VydF9saXN0LCAmY2VydF9saXN0X3NpemUpICk7CisJCUNIRUNLKCAxLCAoY2VydF9saXN0X3NpemUgPiAwKSA/IDEgOiAwICk7CisJCS8qIFdlIGNvdWxkIGFsc28gdmVyaWZ5IHRoYXQgdGhlIGNlcnRfbGlzdCByZWFsbHkgY29udGFpbnMgdGhlIGNsaWVudF9jZXJ0IGFuZCBjYSBjZXJ0aWZpY2F0ZXMgKi8KKwkJCisJCS8qIGZkX2NueF9nZXRyZW1vdGVpZCAqLworCQlzdHIgPSBmZF9jbnhfZ2V0cmVtb3RlaWQoc2VydmVyX3NpZGUpOworCQlDSEVDSyggMSwgc3RyID8gMSA6IDAgKTsKKwkJQ0hFQ0soIDEsIChzdHJbMF0gIT0gJ1wwJykgPyAxIDogMCApOworCQkKKwkJLyogZmRfY254X3JlY3Zfc2V0YWx0ZmlmbyAqLworCQlDSEVDSyggMCwgZmRfY254X3NlbmQoY2xpZW50X3NpZGUsIGNlcl9idWYsIGNlcl9zeikpOworCQlDSEVDSyggMCwgZmRfZmlmb19uZXcoJm15ZmlmbywgMCkgKTsKKwkJQ0hFQ0soIDAsIGZkX2NueF9yZWN2X3NldGFsdGZpZm8oc2VydmVyX3NpZGUsIG15ZmlmbykgKTsKKwkJQ0hFQ0soIDAsIGNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZub3cpICk7CisJCWRvIHsKKwkJCUNIRUNLKCAwLCBmZF9ldmVudF90aW1lZGdldChteWZpZm8sICZub3csIEVUSU1FRE9VVCwgJmV2X2NvZGUsIE5VTEwsICh2b2lkICopJnJjdl9idWYpICk7CisJCQlmcmVlKHJjdl9idWYpOworCQl9IHdoaWxlIChldl9jb2RlICE9IEZERVZQX0NOWF9NU0dfUkVDVik7CisJCQorCQkvKiBOb3cgY2xvc2UgdGhlIGNvbm5lY3Rpb24gKi8KKwkJQ0hFQ0soIDAsIHB0aHJlYWRfY3JlYXRlKCZ0aHIsIE5VTEwsIGRlc3Ryb3lfdGhyLCBjbGllbnRfc2lkZSkgKTsKKwkJZmRfY254X2Rlc3Ryb3koc2VydmVyX3NpZGUpOworCQlDSEVDSyggMCwgcHRocmVhZF9qb2luKHRociwgTlVMTCkgKTsKKwkJCisJCWZkX2V2ZW50X2Rlc3Ryb3koJm15ZmlmbywgZnJlZSk7CisJCQorCQkvKiBGcmVlIHRoZSBjcmVkZW50aWFscyAqLworCQlnbnV0bHNfY2VydGlmaWNhdGVfZnJlZV9rZXlzKGhmLmNyZWRzKTsKKwkJZ251dGxzX2NlcnRpZmljYXRlX2ZyZWVfY2FzKGhmLmNyZWRzKTsKKwkJZ251dGxzX2NlcnRpZmljYXRlX2ZyZWVfY3JlZGVudGlhbHMoaGYuY3JlZHMpOworCX0KKwkKKwkvKiBUTFMgKi8KKwl7CisJCXN0cnVjdCBjb25uZWN0X2ZsYWdzIGNmOworCQlzdHJ1Y3QgaGFuZHNoYWtlX2ZsYWdzIGhmOworCQljaGFyICogc3RyOworCQljb25zdCBnbnV0bHNfZGF0dW1fdCAqY2VydF9saXN0OworCQl1bnNpZ25lZCBpbnQgY2VydF9saXN0X3NpemU7CisJCXN0cnVjdCBmaWZvICogbXlmaWZvID0gTlVMTDsKKwkJc3RydWN0IHRpbWVzcGVjIG5vdzsKKwkJaW50IGV2X2NvZGU7CisJCQorCQltZW1zZXQoJmNmLCAwLCBzaXplb2YoY2YpKTsKKwkJY2YucHJvdG8gPSBJUFBST1RPX1NDVFA7CisJCQorCQltZW1zZXQoJmhmLCAwLCBzaXplb2YoaGYpKTsKKwkJaGYuYWxnbyA9IEFMR09fSEFORFNIQUtFXzM0MzY7CisJCQorCQkvKiBJbml0aWFsaXplIHJlbW90ZSBjZXJ0aWZpY2F0ZSAqLworCQlDSEVDS19HTlVUTFNfRE8oIHJldCA9IGdudXRsc19jZXJ0aWZpY2F0ZV9hbGxvY2F0ZV9jcmVkZW50aWFscyAoJmhmLmNyZWRzKSwgKTsKKwkJQ0hFQ0soIEdOVVRMU19FX1NVQ0NFU1MsIHJldCApOworCQkvKiBTZXQgdGhlIENBICovCisJCUNIRUNLX0dOVVRMU19ETyggcmV0ID0gZ251dGxzX2NlcnRpZmljYXRlX3NldF94NTA5X3RydXN0X21lbSggaGYuY3JlZHMsICZjYSwgR05VVExTX1g1MDlfRk1UX1BFTSksICk7CisJCUNIRUNLKCAxLCByZXQgKTsKKwkJLyogU2V0IHRoZSBrZXkgKi8KKwkJQ0hFQ0tfR05VVExTX0RPKCByZXQgPSBnbnV0bHNfY2VydGlmaWNhdGVfc2V0X3g1MDlfa2V5X21lbSggaGYuY3JlZHMsICZjbGllbnRfY2VydCwgJmNsaWVudF9wcml2LCBHTlVUTFNfWDUwOV9GTVRfUEVNKSwgKTsKKwkJQ0hFQ0soIEdOVVRMU19FX1NVQ0NFU1MsIHJldCApOworCQkKKwkJLyogU3RhcnQgdGhlIGNsaWVudCB0aHJlYWQgKi8KKwkJQ0hFQ0soIDAsIHB0aHJlYWRfY3JlYXRlKCZ0aHIsIE5VTEwsIGNvbm5lY3RfdGhyLCAmY2YpICk7CisKKwkJLyogQWNjZXB0IHRoZSBjb25uZWN0aW9uIG9mIHRoZSBjbGllbnQgKi8KKwkJc2VydmVyX3NpZGUgPSBmZF9jbnhfc2Vydl9hY2NlcHQobGlzdGVuZXJfc2N0cCk7CisJCUNIRUNLKCAxLCBzZXJ2ZXJfc2lkZSA/IDEgOiAwICk7CisJCQorCQkvKiBSZXRyaWV2ZSB0aGUgY2xpZW50IGNvbm5lY3Rpb24gb2JqZWN0ICovCisJCUNIRUNLKCAwLCBwdGhyZWFkX2pvaW4oIHRociwgKHZvaWQgKikmY2xpZW50X3NpZGUgKSApOworCQlDSEVDSyggMSwgY2xpZW50X3NpZGUgPyAxIDogMCApOworCQloZi5jbnggPSBjbGllbnRfc2lkZTsKKwkJCisJCS8qIFN0YXJ0IHRoZSBoYW5kc2hha2UgKi8KKwkJQ0hFQ0soIDAsIHB0aHJlYWRfY3JlYXRlKCZ0aHIsIE5VTEwsIGhhbmRzaGFrZV90aHIsICZoZikgKTsKKwkJQ0hFQ0soIDAsIGZkX2NueF9oYW5kc2hha2Uoc2VydmVyX3NpZGUsIEdOVVRMU19TRVJWRVIsIEFMR09fSEFORFNIQUtFXzM0MzYsIE5VTEwsIE5VTEwpICk7CisJCUNIRUNLKCAwLCBwdGhyZWFkX2pvaW4odGhyLCBOVUxMKSApOworCQlDSEVDSyggMCwgaGYucmV0ICk7CisJCQorCQkvKiBUZXN0IHNvbWUgc2ltcGxlIGZ1bmN0aW9ucyAqLworCQkKKwkJLyogZmRfY254X2dldGlkICovCisJCXN0ciA9IGZkX2NueF9nZXRpZChzZXJ2ZXJfc2lkZSk7CisJCUNIRUNLKCAxLCBzdHIgPyAxIDogMCApOworCQlDSEVDSyggMSwgKHN0clswXSAhPSAnXDAnKSA/IDEgOiAwICk7CisJCQorCQkvKiBmZF9jbnhfZ2V0cHJvdG8gKi8KKwkJaSA9IGZkX2NueF9nZXRwcm90byhzZXJ2ZXJfc2lkZSk7CisJCUNIRUNLKCBJUFBST1RPX1NDVFAsIGkpOworCQkKKwkJLyogZmRfY254X2dldFRMUyAqLworCQlpID0gZmRfY254X2dldFRMUyhzZXJ2ZXJfc2lkZSk7CisJCUNIRUNLKCAxLCBpID8gMSA6IDAgKTsKKwkJCisJCS8qIGZkX2NueF9nZXRjcmVkICovCisJCUNIRUNLKCAwLCBmZF9jbnhfZ2V0Y3JlZChzZXJ2ZXJfc2lkZSwgJmNlcnRfbGlzdCwgJmNlcnRfbGlzdF9zaXplKSApOworCQlDSEVDSyggMSwgKGNlcnRfbGlzdF9zaXplID4gMCkgPyAxIDogMCApOworCQkvKiBXZSBjb3VsZCBhbHNvIHZlcmlmeSB0aGF0IHRoZSBjZXJ0X2xpc3QgcmVhbGx5IGNvbnRhaW5zIHRoZSBjbGllbnRfY2VydCBhbmQgY2EgY2VydGlmaWNhdGVzICovCisJCQorCQkvKiBmZF9jbnhfZ2V0cmVtb3RlaWQgKi8KKwkJc3RyID0gZmRfY254X2dldHJlbW90ZWlkKHNlcnZlcl9zaWRlKTsKKwkJQ0hFQ0soIDEsIHN0ciA/IDEgOiAwICk7CisJCUNIRUNLKCAxLCAoc3RyWzBdICE9ICdcMCcpID8gMSA6IDAgKTsKKwkJCisJCS8qIGZkX2NueF9yZWN2X3NldGFsdGZpZm8gKi8KKwkJQ0hFQ0soIDAsIGZkX2NueF9zZW5kKGNsaWVudF9zaWRlLCBjZXJfYnVmLCBjZXJfc3opKTsKKwkJQ0hFQ0soIDAsIGZkX2ZpZm9fbmV3KCZteWZpZm8sIDApICk7CisJCUNIRUNLKCAwLCBmZF9jbnhfcmVjdl9zZXRhbHRmaWZvKHNlcnZlcl9zaWRlLCBteWZpZm8pICk7CisJCUNIRUNLKCAwLCBjbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmbm93KSApOworCQlkbyB7CisJCQlDSEVDSyggMCwgZmRfZXZlbnRfdGltZWRnZXQobXlmaWZvLCAmbm93LCBFVElNRURPVVQsICZldl9jb2RlLCBOVUxMLCAodm9pZCAqKSZyY3ZfYnVmKSApOworCQkJZnJlZShyY3ZfYnVmKTsKKwkJfSB3aGlsZSAoZXZfY29kZSAhPSBGREVWUF9DTlhfTVNHX1JFQ1YpOworCQkKKwkJLyogTm93IGNsb3NlIHRoZSBjb25uZWN0aW9uICovCisJCUNIRUNLKCAwLCBwdGhyZWFkX2NyZWF0ZSgmdGhyLCBOVUxMLCBkZXN0cm95X3RociwgY2xpZW50X3NpZGUpICk7CisJCWZkX2NueF9kZXN0cm95KHNlcnZlcl9zaWRlKTsKKwkJQ0hFQ0soIDAsIHB0aHJlYWRfam9pbih0aHIsIE5VTEwpICk7CisJCQorCQlmZF9ldmVudF9kZXN0cm95KCZteWZpZm8sIGZyZWUpOworCQkKKwkJLyogRnJlZSB0aGUgY3JlZGVudGlhbHMgKi8KKwkJZ251dGxzX2NlcnRpZmljYXRlX2ZyZWVfa2V5cyhoZi5jcmVkcyk7CisJCWdudXRsc19jZXJ0aWZpY2F0ZV9mcmVlX2NhcyhoZi5jcmVkcyk7CisJCWdudXRsc19jZXJ0aWZpY2F0ZV9mcmVlX2NyZWRlbnRpYWxzKGhmLmNyZWRzKTsKKwl9CisjZW5kaWYgLyogRElTQUJMRV9TQ1RQICovCisJCisKKwkvKiBEZXN0cm95IHRoZSBzZXJ2ZXJzICovCisJeworCQlmZF9jbnhfZGVzdHJveShsaXN0ZW5lcik7CisjaWZuZGVmIERJU0FCTEVfU0NUUAorCQlmZF9jbnhfZGVzdHJveShsaXN0ZW5lcl9zY3RwKTsKKyNlbmRpZiAvKiBESVNBQkxFX1NDVFAgKi8KKwl9CisJCisJLyogQ2hlY2sgdGhhdCBjb25uZWN0aW9uIGF0dGVtcHQgZmFpbHMgdGhlbiAqLworCXsKKwkJc3RydWN0IGNvbm5lY3RfZmxhZ3MgY2Y7CisJCQorCQltZW1zZXQoJmNmLCAwLCBzaXplb2YoY2YpKTsKKwkJY2YucHJvdG8gPSBJUFBST1RPX1RDUDsKKwkJY2YuZXhwZWN0X2ZhaWx1cmUgPSAxOworCQkKKwkJLyogU3RhcnQgdGhlIGNsaWVudCB0aHJlYWQsIHRoYXQgc2hvdWxkIGZhaWwgKi8KKwkJQ0hFQ0soIDAsIHB0aHJlYWRfY3JlYXRlKCZ0aHIsIE5VTEwsIGNvbm5lY3RfdGhyLCAmY2YpICk7CisJCUNIRUNLKCAwLCBwdGhyZWFkX2pvaW4oIHRociwgKHZvaWQgKikmY2xpZW50X3NpZGUgKSApOworCQlDSEVDSyggMCwgY2xpZW50X3NpZGUgPyAxIDogMCApOworCX0KKwkJCisjaWZuZGVmIERJU0FCTEVfU0NUUAorCXsKKwkJc3RydWN0IGNvbm5lY3RfZmxhZ3MgY2Y7CisJCQorCQltZW1zZXQoJmNmLCAwLCBzaXplb2YoY2YpKTsKKwkJY2YucHJvdG8gPSBJUFBST1RPX1NDVFA7CisJCWNmLmV4cGVjdF9mYWlsdXJlID0gMTsKKwkJCisJCS8qIFN0YXJ0IHRoZSBjbGllbnQgdGhyZWFkLCB0aGF0IHNob3VsZCBmYWlsICovCisJCUNIRUNLKCAwLCBwdGhyZWFkX2NyZWF0ZSgmdGhyLCBOVUxMLCBjb25uZWN0X3RociwgJmNmKSApOworCQlDSEVDSyggMCwgcHRocmVhZF9qb2luKCB0aHIsICh2b2lkICopJmNsaWVudF9zaWRlICkgKTsKKwkJQ0hFQ0soIDAsIGNsaWVudF9zaWRlID8gMSA6IDAgKTsKKwl9CisjZW5kaWYgLyogRElTQUJMRV9TQ1RQICovCisJCisJCisJLyogVGhhdCdzIGFsbCBmb3IgdGhlIHRlc3RzIHlldCAqLworCVBBU1NURVNUKCk7Cit9IAorCQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdGRpY3QuYyBiL3Rlc3RzL3Rlc3RkaWN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ1ZDUyZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RkaWN0LmMKQEAgLTAsMCArMSwyMTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDEzLCBXSURFIFByb2plY3QgYW5kIE5JQ1QJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFdJREUgUHJvamVjdCBvciBOSUNUIG5vciB0aGUgCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgV0lERSBQcm9qZWN0IGFuZCAJCQkJCQkgKgorKiAgIE5JQ1QuCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInRlc3RzLmgiCisKKy8qIFRlc3QgZm9yIHRoZSBkaWN0X2l0ZXJhdGVfcnVsZXMgZnVuY3Rpb24gKi8KK2ludCBpdGVyX3Rlc3Qodm9pZCAqIGRhdGEsIHN0cnVjdCBkaWN0X3J1bGVfZGF0YSAqIHJ1bGUpCit7CisJc3RydWN0IGRpY3RfYXZwX2RhdGEgYXZwZGF0YTsKKwkoKihpbnQgKilkYXRhKSsrOworCQorCUNIRUNLKCAwLCBmZF9kaWN0X2dldHZhbCAoIHJ1bGUtPnJ1bGVfYXZwLCAmYXZwZGF0YSApICk7CisJVFJBQ0VfREVCVUcoRlVMTCwgInJ1bGUgIyVkOiBhdnAgJyVzJyIsICooaW50ICopZGF0YSwgYXZwZGF0YS5hdnBfbmFtZSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIE1haW4gdGVzdCByb3V0aW5lICovCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCS8qIEZpcnN0LCBpbml0aWFsaXplIHRoZSBkYWVtb24gbW9kdWxlcyAqLworCUlOSVRfRkQoKTsKKwkKKwkvKiBUZXN0IGNyZWF0aW5nIGFuZCBzZWFyY2hpbmcgYWxsIHR5cGVzIG9mIG9iamVjdHMgKi8KKwl7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIG9iajEgPSBOVUxMOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBvYmoyID0gTlVMTDsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogb2JqMyA9IE5VTEw7CisKKwkJdmVuZG9yX2lkX3QgdmVuZG9yX2lkID0gNzM1NjcxOworCQlzdHJ1Y3QgZGljdF92ZW5kb3JfZGF0YSB2ZW5kb3IxX2RhdGEgPSB7IDczNTY3MSwgIlZlbmRvciB0ZXN0IDEiIH07CisJCXN0cnVjdCBkaWN0X3ZlbmRvcl9kYXRhIHZlbmRvcjJfZGF0YSA9IHsgNzM1NjcyLCAiVmVuZG9yIHRlc3QgMiIgfTsKKwkJc3RydWN0IGRpY3RfYXBwbGljYXRpb25fZGF0YSBhcHAxX2RhdGEgPSB7IDczNTY3NCwgIkFwcGxpY2F0aW9uIHRlc3QgMSIgfTsKKwkJCisJCQorCQkvKiBDcmVhdGUgdHdvIHZlbmRvcnMgKi8KKwkJQ0hFQ0soIDAsIGZkX2RpY3RfbmV3ICggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1ZFTkRPUiwgJnZlbmRvcjFfZGF0YSAsIE5VTEwsICZvYmoxICkgKTsKKwkJQ0hFQ0soIDAsIGZkX2RpY3RfbmV3ICggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1ZFTkRPUiwgJnZlbmRvcjJfZGF0YSAsIE5VTEwsIE5VTEwgKSApOworCQkKKwkJLyogQ2hlY2sgd2UgYWx3YXlzIHJldHJpZXZlIHRoZSBjb3JyZWN0IHZlbmRvciBvYmplY3QgKi8KKwkJQ0hFQ0soIDAsIGZkX2RpY3Rfc2VhcmNoICggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1ZFTkRPUiwgVkVORE9SX0JZX0lELCAmdmVuZG9yX2lkLCAmb2JqMiwgRU5PRU5UICkgKTsKKwkJQ0hFQ0soIG9iajEsIG9iajIpOworCQlDSEVDSyggMCwgZmRfZGljdF9zZWFyY2ggKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfVkVORE9SLCBWRU5ET1JfQllfTkFNRSwgIlZlbmRvciB0ZXN0IDEiLCAmb2JqMiwgRU5PRU5UICkgKTsKKwkJQ0hFQ0soIG9iajEsIG9iajIpOworCQkKKwkJLyogQ2hlY2sgdGhlIGVycm9yIGNvbmRpdGlvbnMgKi8KKwkJQ0hFQ0soIDAsIGZkX2RpY3Rfc2VhcmNoICggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1ZFTkRPUiwgVkVORE9SX0JZX0lELCAmdmVuZG9yX2lkLCBOVUxMLCBFTk9FTlQgKSApOworCQkKKwkJdmVuZG9yX2lkID0gNzM1NjczOyAvKiBOb3QgZGVmaW5lZCAqLworCQlDSEVDSyggRU5PRU5ULCBmZF9kaWN0X3NlYXJjaCAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9WRU5ET1IsIFZFTkRPUl9CWV9JRCwgJnZlbmRvcl9pZCwgTlVMTCwgRU5PRU5UICkgKTsKKwkJQ0hFQ0soIEVOT0VOVCwgZmRfZGljdF9zZWFyY2ggKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfVkVORE9SLCBWRU5ET1JfQllfTkFNRSwgIlZlbmRvciB0ZXN0IDMiLCBOVUxMLCBFTk9FTlQgKSApOworCQlDSEVDSyggRU5PRU5ULCBmZF9kaWN0X3NlYXJjaCAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9WRU5ET1IsIFZFTkRPUl9CWV9JRCwgJnZlbmRvcl9pZCwgJm9iajIsIEVOT0VOVCApICk7CisJCUNIRUNLKCBFTk9FTlQsIGZkX2RpY3Rfc2VhcmNoICggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1ZFTkRPUiwgVkVORE9SX0JZX05BTUUsICJWZW5kb3IgdGVzdCAzIiwgJm9iajIsIEVOT0VOVCApICk7CisJCUNIRUNLKCBFTk9UU1VQLCBmZF9kaWN0X3NlYXJjaCAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9WRU5ET1IsIFZFTkRPUl9CWV9OQU1FLCAiVmVuZG9yIHRlc3QgMyIsICZvYmoyLCBFTk9UU1VQICkgKTsKKwkJCisJCS8qIENoZWNrIHRoZSBnZXRfKiBmdW5jdGlvbnMgKi8KKwkJQ0hFQ0soIDAsIGZkX2RpY3RfZ2V0dmFsICggb2JqMSwgJnZlbmRvcjFfZGF0YSApICk7CisJCUNIRUNLKCA3MzU2NzEsIHZlbmRvcjFfZGF0YS52ZW5kb3JfaWQgKTsKKwkJQ0hFQ0soIDAsIHN0cmNtcCh2ZW5kb3IxX2RhdGEudmVuZG9yX25hbWUsICJWZW5kb3IgdGVzdCAxIikgKTsKKwkJLyogZXJyb3IgY29uZGl0aW9ucyAqLworCQlDSEVDSyggRUlOVkFMLCBmZF9kaWN0X2dldHZhbCAoIChzdHJ1Y3QgZGljdF9vYmplY3QgKikibm90IGFuIG9iamVjdCIsICZ2ZW5kb3IxX2RhdGEgKSApOworCQkKKwkJLyogQ3JlYXRlIHRoZSBhcHBsaWNhdGlvbiB3aXRoIHZlbmRvcjEgYXMgcGFyZW50ICovCisJCUNIRUNLKCBFSU5WQUwsIGZkX2RpY3RfbmV3ICggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FQUExJQ0FUSU9OLCAmYXBwMV9kYXRhICwgKHN0cnVjdCBkaWN0X29iamVjdCAqKSJiYWQgb2JqZWN0IiwgJm9iajIgKSApOworCQlDSEVDSyggMCwgZmRfZGljdF9uZXcgKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVBQTElDQVRJT04sICZhcHAxX2RhdGEgLCBvYmoxLCAmb2JqMiApICk7CisJCQorCQlDSEVDSyggMCwgZmRfZGljdF9zZWFyY2ggKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfVkVORE9SLCBWRU5ET1JfT0ZfQVBQTElDQVRJT04sIG9iajIsICZvYmozLCBFTk9FTlQgKSApOworCQlDSEVDSyggb2JqMSwgb2JqMyk7CisJCQorCQkvKiBDcmVhdGluZyBhbmQgc2VhcmNoaW5nIHRoZSBvdGhlciBvYmplY3RzIGlzIGFscmVhZHkgZG9uZSBpbiBkaWN0aW9uYXJ5IGluaXRpYWxpemF0aW9uICovCisJfQorCisJLyogVGVzdCBjcmVhdGlvbiBvZiB0aGUgIkV4YW1wbGUtQVZQIiBncm91cGVkIEFWUCBmcm9tIHRoZSBSRkMgKi8KKwl7CisJCWludCBuYnIgPSAwOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBvcmlnaW5faG9zdF9hdnAgPSBOVUxMOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBzZXNzaW9uX2lkX2F2cCA9IE5VTEw7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGV4YW1wbGVfYXZwX2F2cCA9IE5VTEw7CisJCXN0cnVjdCBkaWN0X3J1bGVfZGF0YSBydWxlX2RhdGEgPSB7IE5VTEwsIFJVTEVfUkVRVUlSRUQsIC0xLCAtMSB9OworCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBleGFtcGxlX2F2cF9kYXRhID0geyA5OTk5OTksIDAsICJFeGFtcGxlLUFWUCIsIEFWUF9GTEFHX1ZFTkRPUiAsIDAsIEFWUF9UWVBFX0dST1VQRUQgfTsKKworCQlDSEVDSyggMCwgZmRfZGljdF9zZWFyY2ggKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIk9yaWdpbi1Ib3N0IiwgJm9yaWdpbl9ob3N0X2F2cCwgRU5PRU5UICkgKTsKKwkJQ0hFQ0soIDAsIGZkX2RpY3Rfc2VhcmNoICggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUUsICJTZXNzaW9uLUlkIiwgJnNlc3Npb25faWRfYXZwLCBFTk9FTlQgKSApOworCQkKKwkJQ0hFQ0soIDAsIGZkX2RpY3RfbmV3ICggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgJmV4YW1wbGVfYXZwX2RhdGEgLCBOVUxMLCAmZXhhbXBsZV9hdnBfYXZwICkgKTsKKwkJCisJCXJ1bGVfZGF0YS5ydWxlX2F2cCA9IG9yaWdpbl9ob3N0X2F2cDsKKwkJcnVsZV9kYXRhLnJ1bGVfbWluID0gMTsKKwkJcnVsZV9kYXRhLnJ1bGVfbWF4ID0gMTsKKwkJQ0hFQ0soIDAsIGZkX2RpY3RfbmV3ICggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1JVTEUsICZydWxlX2RhdGEsIGV4YW1wbGVfYXZwX2F2cCwgTlVMTCApICk7CisJCQorCQlydWxlX2RhdGEucnVsZV9hdnAgPSBzZXNzaW9uX2lkX2F2cDsKKwkJcnVsZV9kYXRhLnJ1bGVfbWluID0gMTsKKwkJcnVsZV9kYXRhLnJ1bGVfbWF4ID0gLTE7CisJCUNIRUNLKCAwLCBmZF9kaWN0X25ldyAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9SVUxFLCAmcnVsZV9kYXRhLCBleGFtcGxlX2F2cF9hdnAsIE5VTEwgKSApOworCQkKKwkJQ0hFQ0soIDAsIGZkX2RpY3RfaXRlcmF0ZV9ydWxlcyAoIGV4YW1wbGVfYXZwX2F2cCwgJm5iciwgaXRlcl90ZXN0KSApOworCQlDSEVDSyggMiwgbmJyICk7CisJfQorCQorCS8qIFRlc3QgbGlzdCBmdW5jdGlvbiAqLworCXsKKwkJc3RydWN0IGZkX2xpc3QgKiBsaSA9IE5VTEw7CisJCXN0cnVjdCBmZF9saXN0ICogc2VudGluZWwgPSBOVUxMOworCQllbnVtIGRpY3Rfb2JqZWN0X3R5cGUJdHlwZTsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogZGVmdm5kPU5VTEw7CisJCXZlbmRvcl9pZF90IHZpZCA9IDA7CisJCWludCBmaXJzdCA9IDE7CisJCQorCQlDSEVDSyggMCwgZmRfZGljdF9nZXRsaXN0b2YoVkVORE9SX0JZX0lELCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsICZzZW50aW5lbCkpOworCQkKKwkJZm9yIChsaSA9IHNlbnRpbmVsOyAobGkgIT0gc2VudGluZWwpIHx8IChmaXJzdCAhPSAwKTsgbGkgPSBsaS0+bmV4dCkgeworCQkJZmlyc3QgPSAwOworCQkJQ0hFQ0soMCwgZmRfZGljdF9nZXR0eXBlKGxpLT5vLCAmdHlwZSkpOworCQkJQ0hFQ0soRElDVF9WRU5ET1IsIHR5cGUpOworI2lmIDAKKwkJCXN0cnVjdCBkaWN0X3ZlbmRvcl9kYXRhIGRhdGE7CisJCQlDSEVDSyggMCwgZmRfZGljdF9nZXR2YWwobGktPm8sICZkYXRhKSApOworCQkJcHJpbnRmKCIlZCA6ICVzXG4iLCBkYXRhLnZlbmRvcl9pZCwgZGF0YS52ZW5kb3JfbmFtZSk7CisjZW5kaWYKKwkJfQorCQkKKwkJQ0hFQ0soIDAsIGZkX2RpY3Rfc2VhcmNoKGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9WRU5ET1IsIFZFTkRPUl9CWV9JRCwgJnZpZCwgJmRlZnZuZCwgRU5PRU5UKSApOworCQkKKwkJQ0hFQ0soIDAsIGZkX2RpY3RfZ2V0bGlzdG9mKEFWUF9CWV9OQU1FLCBkZWZ2bmQsICZzZW50aW5lbCkpOworCQlmb3IgKGxpID0gc2VudGluZWwtPm5leHQ7IGxpICE9IHNlbnRpbmVsOyBsaSA9IGxpLT5uZXh0KSB7CisJCQlDSEVDSygwLCBmZF9kaWN0X2dldHR5cGUobGktPm8sICZ0eXBlKSk7CisJCQlDSEVDSyhESUNUX0FWUCwgdHlwZSk7CisjaWYgMAorCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgZGF0YTsKKwkJCUNIRUNLKCAwLCBmZF9kaWN0X2dldHZhbChsaS0+bywgJmRhdGEpICk7CisJCQlwcmludGYoIiVkIDogJXNcbiIsIGRhdGEuYXZwX2NvZGUsIGRhdGEuYXZwX25hbWUpOworI2VuZGlmCisJCX0KKwl9CisKKwkvKiBUZXN0IGRlbGV0ZSBmdW5jdGlvbiAqLworCXsKKwkJc3RydWN0IGZkX2xpc3QgKiBsaSA9IE5VTEw7CisJCXN0cnVjdCBmZF9saXN0ICogc2VudGluZWwgPSBOVUxMOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBvYmo9TlVMTDsKKwkJdmVuZG9yX2lkX3QgdmlkID0gMDsKKwkJaW50IGNvdW50ID0gMCwgY250YmtwOworCQkKKwkJQ0hFQ0soIDAsIGZkX2RpY3Rfc2VhcmNoKGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9WRU5ET1IsIFZFTkRPUl9CWV9JRCwgJnZpZCwgJm9iaiwgRU5PRU5UKSApOworCQkKKwkJQ0hFQ0soIEVJTlZBTCwgZmRfZGljdF9kZWxldGUob2JqKSApOworCQkJCisJCQorCQlDSEVDSyggMCwgZmRfZGljdF9nZXRsaXN0b2YoQVZQX0JZX05BTUUsIG9iaiwgJnNlbnRpbmVsKSk7CisJCW9iaiA9IE5VTEw7CisJCQorCQlmb3IgKGxpID0gc2VudGluZWwtPm5leHQ7IGxpICE9IHNlbnRpbmVsOyBsaSA9IGxpLT5uZXh0KSB7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBkYXRhOworCQkJQ0hFQ0soIDAsIGZkX2RpY3RfZ2V0dmFsKGxpLT5vLCAmZGF0YSkgKTsKKwkJCWNvdW50Kys7CisJCQlpZiAoZGF0YS5hdnBfYmFzZXR5cGUgIT0gQVZQX1RZUEVfR1JPVVBFRCkKKwkJCQlvYmogPSBsaS0+bzsKKwkJfQorCQkKKwkJQ0hFQ0soMSwgb2JqID8gMSA6IDAgKTsKKyNpZiAxCisJCWZkX2xvZ19kZWJ1ZygiJXMiLCBmZF9kaWN0X2R1bXBfb2JqZWN0KEZEX0RVTVBfVEVTVF9QQVJBTVMsIG9iaikpOworI2VuZGlmCisJCUNIRUNLKCAwLCBmZF9kaWN0X2RlbGV0ZShvYmopICk7CisJCWNudGJrcCA9IGNvdW50OworCQljb3VudCA9IDA7CisJCWZvciAobGkgPSBzZW50aW5lbC0+bmV4dDsgbGkgIT0gc2VudGluZWw7IGxpID0gbGktPm5leHQpIHsKKwkJCWNvdW50Kys7CisJCX0KKwkJQ0hFQ0soIDEsIGNudGJrcCAtIGNvdW50ICk7CisJCQorCX0KKwkKKwlMT0dfRCggIkRpY3Rpb25hcnkgYXQgdGhlIGVuZCBvZiAlczogJXMiLCBfX0ZJTEVfXywgZmRfZGljdF9kdW1wKEZEX0RVTVBfVEVTVF9QQVJBTVMsIGZkX2dfY29uZmlnLT5jbmZfZGljdCkgPzogImVycm9yIik7CisJCisJLyogVGhhdCdzIGFsbCBmb3IgdGhlIHRlc3RzIHlldCAqLworCVBBU1NURVNUKCk7Cit9IAorCQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdGRpc3AuYyBiL3Rlc3RzL3Rlc3RkaXNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYyNWE2OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RkaXNwLmMKQEAgLTAsMCArMSw3MjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDEzLCBXSURFIFByb2plY3QgYW5kIE5JQ1QJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFdJREUgUHJvamVjdCBvciBOSUNUIG5vciB0aGUgCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgV0lERSBQcm9qZWN0IGFuZCAJCQkJCQkgKgorKiAgIE5JQ1QuCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInRlc3RzLmgiCisJCisjZGVmaW5lIERlZmluZV9jYiggX19pbnQsIF9fZXh0cmEgKQkJCQkJCQkJCQkJCVwKK2ludCBjYl8jI19faW50KCBzdHJ1Y3QgbXNnICoqIG1zZywgc3RydWN0IGF2cCAqIGF2cCwgc3RydWN0IHNlc3Npb24gKiBzZXNzaW9uLCB2b2lkICogb3BhcXVlLCBlbnVtIGRpc3BfYWN0aW9uICogYWN0aW9uICkJXAorewkJCQkJCQkJCQkJCQkJCQlcCisJQ0hFQ0soIDEsIG1zZyA/IDEgOiAwICk7CQkJCQkJCQkJCQkJXAorCUNIRUNLKCAxLCBhY3Rpb24gPyAxIDogMCApOwkJCQkJCQkJCQkJCVwKKwlDSEVDSyggc2Vzcywgc2Vzc2lvbiApOwkJCQkJCQkJCQkJCQlcCisJaWYgKG9wYXF1ZSkgewkJCQkJCQkJCQkJCQkJXAorCQlDSEVDSyggMSwgb3BhcXVlID09IGdfb3BhcXVlID8gMSA6IDAgKTsJCQkJCQkJCQkJXAorCX0JCQkJCQkJCQkJCQkJCQlcCisJKmFjdGlvbiA9IERJU1BfQUNUX0NPTlQ7CQkJCQkJCQkJCQkJXAorCWNiY2FsbGVkW19faW50XSArPSAxOwkJCQkJCQkJCQkJCQlcCisJZG8gewkJCQkJCQkJCQkJCQkJCVwKKwkJX19leHRyYSA7CQkJCQkJCQkJCQkJCVwKKwl9IHdoaWxlICgwKTsJCQkJCQkJCQkJCQkJCVwKKwlyZXR1cm4gMDsJCQkJCQkJCQkJCQkJCVwKK30KKworI2RlZmluZSBOQl9DQgkxMAorY2hhciBjYmNhbGxlZFtOQl9DQl07CitzdHJ1Y3Qgc2Vzc2lvbiAqIHNlc3M7Cit2b2lkICogZ19vcGFxdWUgPSAodm9pZCAqKSJ0ZXN0IjsKKworLyogY2JfMCAqLyAgRGVmaW5lX2NiKCAwLCApOworLyogY2JfMSAqLyAgRGVmaW5lX2NiKCAxLCApOworLyogY2JfMiAqLyAgRGVmaW5lX2NiKCAyLCApOworLyogY2JfMyAqLyAgRGVmaW5lX2NiKCAzLCApOworLyogY2JfNCAqLyAgRGVmaW5lX2NiKCA0LCApOworLyogY2JfNSAqLyAgRGVmaW5lX2NiKCA1LCApOworLyogY2JfNiAqLyAgRGVmaW5lX2NiKCA2LCByZXR1cm4gMTIzNDUgKTsKKy8qIGNiXzcgKi8gIERlZmluZV9jYiggNywgeyBDSEVDSyggMSwgYXZwID8gMSA6IDAgKTsgfSApOworLyogY2JfOCAqLyAgRGVmaW5lX2NiKCA4LCB7IENIRUNLKCAwLCBmZF9tc2dfZnJlZSggKm1zZyApICk7ICptc2cgPSBOVUxMOyB9ICk7CisvKiBjYl85ICovICBEZWZpbmVfY2IoIDksICphY3Rpb24gPSBESVNQX0FDVF9TRU5EICk7CisvKiBtYXg6IGNiXzxOQl9DQiAtIDE+ICovCisKKy8qIENyZWF0ZSBhIG5ldyBtZXNzYWdlIGNvbnRhaW5pbmcgd2hhdCB3ZSB3YW50ICovCitzdHJ1Y3QgbXNnICogbmV3X21zZyhpbnQgYXBwaWQsIHN0cnVjdCBkaWN0X29iamVjdCAqIGNtZCwgc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwMSwgc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwMiwgaW50IHZhbCkKK3sKKwlzdHJ1Y3QgbXNnICpuZXc7CisJc3RydWN0IGF2cCAqYXZwOworCXVuaW9uIGF2cF92YWx1ZSB2YWx1ZTsKKwlzdHJ1Y3QgbXNnX2hkciAqIG1zZ19oZHIgPSBOVUxMOworCQorCUNIRUNLKCAwLCBmZF9tc2dfbmV3ICggY21kLCAwLCAmbmV3ICkgKTsKKwlDSEVDSyggMCwgZmRfbXNnX2hkciAoIG5ldywgJm1zZ19oZHIgKSApOworCW1zZ19oZHItPm1zZ19hcHBsID0gYXBwaWQ7CisJCisJaWYgKGF2cDEpIHsKKwkJQ0hFQ0soIDAsIGZkX21zZ19hdnBfbmV3ICggYXZwMSwgMCwgJmF2cCApICk7CisJCXZhbHVlLnUzMiA9IDA7CisJCUNIRUNLKCAwLCBmZF9tc2dfYXZwX3NldHZhbHVlICggYXZwLCAmdmFsdWUgKSApOworCQlDSEVDSyggMCwgZmRfbXNnX2F2cF9hZGQgKCBuZXcsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwICkgKTsKKwl9CisJCisJaWYgKGF2cDIpIHsKKwkJQ0hFQ0soIDAsIGZkX21zZ19hdnBfbmV3ICggYXZwMiwgMCwgJmF2cCApICk7CisJCXZhbHVlLnUzMiA9IHZhbDsKKwkJQ0hFQ0soIDAsIGZkX21zZ19hdnBfc2V0dmFsdWUgKCBhdnAsICZ2YWx1ZSApICk7CisJCUNIRUNLKCAwLCBmZF9tc2dfYXZwX2FkZCAoIG5ldywgTVNHX0JSV19MQVNUX0NISUxELCBhdnAgKSApOworCX0KKwkKKwlyZXR1cm4gbmV3OwkKK30KKworLyogTWFpbiB0ZXN0IHJvdXRpbmUgKi8KK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXBwMSwgKiBhcHAyOworCXN0cnVjdCBkaWN0X29iamVjdCAqIGNtZDEsICogY21kMjsKKwlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhdnAxLCAqIGF2cDI7IC8qIGF2cDIgaXMgZW51bWVyYXRlZDsgdGhleSBhcmUgYm90aCB1bnNpZ25lZDMyIHR5cGVzICovCisJc3RydWN0IGRpY3Rfb2JqZWN0ICogZW51MSwgKiBlbnUyOworCXN0cnVjdCBtc2cgKiBtc2cgPSBOVUxMLCAqZXJyb3I7CisJZW51bSBkaXNwX2FjdGlvbiBhY3Rpb247CisJc3RydWN0IGRpc3BfaGRsICogaGRsW05CX0NCXTsKKwlzdHJ1Y3QgZGlzcF93aGVuIHdoZW47CisJY2hhciAqIGVjLCAqZW07CisJCisJLyogRmlyc3QsIGluaXRpYWxpemUgdGhlIGRhZW1vbiBtb2R1bGVzICovCisJSU5JVF9GRCgpOworCQorCS8qIENyZWF0ZSBhIGR1bW15IHNlc3Npb24sIHdlIGRvbid0IHVzZSBpdCBhbnl3YXkgKi8KKwkjZGVmaW5lIERVTU1ZX1NJRCAidGVzdC5kaXNwIgorCUNIRUNLKCAwLCBmZF9zZXNzX25ldyggJnNlc3MsIERVTU1ZX1NJRCwgQ09OU1RTVFJMRU4oRFVNTVlfU0lEKSwgTlVMTCwgMCApICk7CisJCisJbWVtc2V0KCZ3aGVuLCAweGZmLCBzaXplb2Yod2hlbikpOyAvKiBjaGVjayB0aGF0IHdlIGRvbid0IHVzZSB1bi1pbml0aWFsaXplZCBwYXJ0cyAqLworCQorCS8qIEluaXRpYWxpemUgZGljdGlvbmFyeSBvYmplY3RzICovCisJeworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBlbnV0eXBlOworCQlzdHJ1Y3QgZGljdF9hcHBsaWNhdGlvbl9kYXRhIGFwcDFfZGF0YSA9IHsgMSwgIkFwcGxpY2F0aW9uIHRlc3QgMSIgfTsKKwkJc3RydWN0IGRpY3RfYXBwbGljYXRpb25fZGF0YSBhcHAyX2RhdGEgPSB7IDIsICJBcHBsaWNhdGlvbiB0ZXN0IDIiIH07CisJCXN0cnVjdCBkaWN0X2NtZF9kYXRhIGNtZDFfZGF0YSA9IHsgMSwgIkNvbW1hbmQgdGVzdCAxIChyZXEpIiwgQ01EX0ZMQUdfUkVRVUVTVCwJQ01EX0ZMQUdfUkVRVUVTVCB9OworCQlzdHJ1Y3QgZGljdF9jbWRfZGF0YSBjbWQyX2RhdGEgPSB7IDEsICJDb21tYW5kIHRlc3QgMiAoYW5zKSIsIENNRF9GTEFHX1JFUVVFU1QsCTAgfTsKKwkJc3RydWN0IGRpY3RfdHlwZV9kYXRhIHR5cGVfZGF0YSA9IHsgQVZQX1RZUEVfVU5TSUdORUQzMiwgIlR5cGUgdGVzdCIsIE5VTEwsIE5VTEwgfTsKKwkJc3RydWN0IGRpY3RfYXZwX2RhdGEgYXZwMV9kYXRhID0geyAxMDAwMSwgMCwgIkFWUCB0ZXN0IDEiLCAwLCAwLCBBVlBfVFlQRV9VTlNJR05FRDMyIH07CisJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGF2cDJfZGF0YSA9IHsgMTAwMDIsIDAsICJBVlAgdGVzdCAyIiwgMCwgMCwgQVZQX1RZUEVfVU5TSUdORUQzMiB9OworCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgZW51MV9kYXRhID0geyAiRU5VIHRlc3QgMSIsIHsgLnUzMiA9IDEgfX07CisJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSBlbnUyX2RhdGEgPSB7ICJFTlUgdGVzdCAyIiwgeyAudTMyID0gMiB9fTsKKwkJCisJCUNIRUNLKCAwLCBmZF9kaWN0X25ldyAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BUFBMSUNBVElPTiwgJmFwcDFfZGF0YSwgTlVMTCwgJmFwcDEgKSApOworCQlDSEVDSyggMCwgZmRfZGljdF9uZXcgKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVBQTElDQVRJT04sICZhcHAyX2RhdGEsIE5VTEwsICZhcHAyICkgKTsKKwkJQ0hFQ0soIDAsIGZkX2RpY3RfbmV3ICggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0NPTU1BTkQsICZjbWQxX2RhdGEsIE5VTEwsICZjbWQxICkgKTsKKwkJQ0hFQ0soIDAsIGZkX2RpY3RfbmV3ICggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0NPTU1BTkQsICZjbWQyX2RhdGEsIE5VTEwsICZjbWQyICkgKTsKKwkJQ0hFQ0soIDAsIGZkX2RpY3RfbmV3ICggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1RZUEUsICZ0eXBlX2RhdGEsIE5VTEwsICZlbnV0eXBlICkgKTsKKwkJQ0hFQ0soIDAsIGZkX2RpY3RfbmV3ICggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgJmF2cDFfZGF0YSwgTlVMTCwgICAgJmF2cDEgKSApOworCQlDSEVDSyggMCwgZmRfZGljdF9uZXcgKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCAmYXZwMl9kYXRhLCBlbnV0eXBlLCAmYXZwMiApICk7CisJCUNIRUNLKCAwLCBmZF9kaWN0X25ldyAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9FTlVNVkFMLCAmZW51MV9kYXRhLCBlbnV0eXBlLCAmZW51MSApICk7CisJCUNIRUNLKCAwLCBmZF9kaWN0X25ldyAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9FTlVNVkFMLCAmZW51Ml9kYXRhLCBlbnV0eXBlLCAmZW51MiApICk7CisJfQorCQorCS8qIFJlZ2lzdGVyIGZpcnN0IGhhbmRsZXIsIHZlcnkgc2ltcGxlIHRlc3QgKi8KKwl7CisJCUNIRUNLKCAwLCBmZF9kaXNwX3JlZ2lzdGVyKCBjYl8wLCBESVNQX0hPV19BTlksIE5VTEwsIE5VTEwsICZoZGxbMF0gKSApOworCQlDSEVDSyggMSwgaGRsWzBdID8gMSA6IDAgKTsKKwkJQ0hFQ0soIDAsIGZkX2Rpc3BfdW5yZWdpc3RlciggJmhkbFswXSwgTlVMTCApICk7CisJCUNIRUNLKCBOVUxMLCBoZGxbMF0gKTsKKwkJQ0hFQ0soIDAsIGZkX2Rpc3BfcmVnaXN0ZXIoIGNiXzAsIERJU1BfSE9XX0FOWSwgTlVMTCwgTlVMTCwgJmhkbFswXSApICk7CisJCisJCS8qIENoZWNrIHRoaXMgaGFuZGxlciBpcyBjYWxsZWQgZm9yIGEgbWVzc2FnZSAqLworCQltc2cgPSBuZXdfbXNnKCAwLCBjbWQxLCBhdnAxLCBOVUxMLCAwICk7CisJCW1lbXNldChjYmNhbGxlZCwgMCwgc2l6ZW9mKGNiY2FsbGVkKSk7CisJCUNIRUNLKCAwLCBmZF9tc2dfZGlzcGF0Y2ggKCAmbXNnLCBzZXNzLCAmYWN0aW9uLCAmZWMsICZlbSwgJmVycm9yICkgKTsKKwkJQ0hFQ0soIDEsIGNiY2FsbGVkWzBdICk7CisJCUNIRUNLKCBESVNQX0FDVF9DT05ULCBhY3Rpb24gKTsKKwkJCisJCS8qIERlbGV0ZSB0aGUgbWVzc2FnZSAqLworCQlDSEVDSyggMCwgZmRfbXNnX2ZyZWUoIG1zZyApICk7CisJCUNIRUNLKCAwLCBmZF9kaXNwX3VucmVnaXN0ZXIoICZoZGxbMF0sIE5VTEwgKSApOworCX0KKwkKKwkvKiBIYW5kbGVycyBmb3IgYXBwbGljYXRpb25zICovCisJeworCQlDSEVDSyggMCwgZmRfZGlzcF9yZWdpc3RlciggY2JfMCwgRElTUF9IT1dfQU5ZLCAmd2hlbiwgTlVMTCwgJmhkbFswXSApICk7CisJCXdoZW4uYXBwID0gYXBwMTsKKwkJQ0hFQ0soIDAsIGZkX2Rpc3BfcmVnaXN0ZXIoIGNiXzEsIERJU1BfSE9XX0FQUElELCAmd2hlbiwgTlVMTCwgJmhkbFsxXSApICk7CisJCXdoZW4uYXBwID0gYXBwMjsKKwkJQ0hFQ0soIDAsIGZkX2Rpc3BfcmVnaXN0ZXIoIGNiXzIsIERJU1BfSE9XX0FQUElELCAmd2hlbiwgTlVMTCwgJmhkbFsyXSApICk7CisJCXdoZW4uYXZwID0gYXZwMjsKKwkJQ0hFQ0soIDAsIGZkX2Rpc3BfcmVnaXN0ZXIoIGNiXzMsIERJU1BfSE9XX0FQUElELCAmd2hlbiwgTlVMTCwgJmhkbFszXSApICk7CisJCXdoZW4uYXZwID0gYXZwMTsKKwkJQ0hFQ0soIDAsIGZkX2Rpc3BfcmVnaXN0ZXIoIGNiXzQsIERJU1BfSE9XX0FQUElELCAmd2hlbiwgTlVMTCwgJmhkbFs0XSApICk7CisJCisJCS8qIENoZWNrIHRoZSBjYWxsYmFja3MgYXJlIGNhbGxlZCBhcyBhcHByb3ByaWF0ZSAqLworCQltZW1zZXQoY2JjYWxsZWQsIDAsIHNpemVvZihjYmNhbGxlZCkpOworCQltc2cgPSBuZXdfbXNnKCAwLCBjbWQxLCBhdnAxLCBOVUxMLCAwICk7CisJCUNIRUNLKCAwLCBmZF9tc2dfZGlzcGF0Y2ggKCAmbXNnLCBzZXNzLCAmYWN0aW9uLCAmZWMsICZlbSwgJmVycm9yICkgKTsKKwkJQ0hFQ0soIDEsIGNiY2FsbGVkWzBdICk7CisJCUNIRUNLKCAwLCBjYmNhbGxlZFsxXSApOworCQlDSEVDSyggMCwgY2JjYWxsZWRbMl0gKTsKKwkJQ0hFQ0soIDAsIGNiY2FsbGVkWzNdICk7CisJCUNIRUNLKCAwLCBjYmNhbGxlZFs0XSApOworCQlDSEVDSyggRElTUF9BQ1RfQ09OVCwgYWN0aW9uICk7CisJCUNIRUNLKCAwLCBmZF9tc2dfZnJlZSggbXNnICkgKTsKKwkJCisJCW1lbXNldChjYmNhbGxlZCwgMCwgc2l6ZW9mKGNiY2FsbGVkKSk7CisJCW1zZyA9IG5ld19tc2coIDEsIGNtZDEsIGF2cDEsIE5VTEwsIDAgKTsKKwkJQ0hFQ0soIDAsIGZkX21zZ19kaXNwYXRjaCAoICZtc2csIHNlc3MsICZhY3Rpb24sICZlYywgJmVtLCAmZXJyb3IgKSApOworCQlDSEVDSyggMSwgY2JjYWxsZWRbMF0gKTsKKwkJQ0hFQ0soIDEsIGNiY2FsbGVkWzFdICk7CisJCUNIRUNLKCAwLCBjYmNhbGxlZFsyXSApOworCQlDSEVDSyggMCwgY2JjYWxsZWRbM10gKTsKKwkJQ0hFQ0soIDAsIGNiY2FsbGVkWzRdICk7CisJCUNIRUNLKCBESVNQX0FDVF9DT05ULCBhY3Rpb24gKTsKKwkJQ0hFQ0soIDAsIGZkX21zZ19mcmVlKCBtc2cgKSApOworCQkKKwkJbWVtc2V0KGNiY2FsbGVkLCAwLCBzaXplb2YoY2JjYWxsZWQpKTsKKwkJbXNnID0gbmV3X21zZyggMiwgY21kMSwgYXZwMSwgTlVMTCwgMCApOworCQlDSEVDSyggMCwgZmRfbXNnX2Rpc3BhdGNoICggJm1zZywgc2VzcywgJmFjdGlvbiwgJmVjLCAmZW0sICZlcnJvciApICk7CisJCUNIRUNLKCAxLCBjYmNhbGxlZFswXSApOworCQlDSEVDSyggMCwgY2JjYWxsZWRbMV0gKTsKKwkJQ0hFQ0soIDEsIGNiY2FsbGVkWzJdICk7CisJCUNIRUNLKCAxLCBjYmNhbGxlZFszXSApOworCQlDSEVDSyggMSwgY2JjYWxsZWRbNF0gKTsKKwkJQ0hFQ0soIERJU1BfQUNUX0NPTlQsIGFjdGlvbiApOworCQlDSEVDSyggMCwgZmRfbXNnX2ZyZWUoIG1zZyApICk7CisJCQorCQlDSEVDSyggMCwgZmRfZGlzcF91bnJlZ2lzdGVyKCAmaGRsWzBdLCBOVUxMICkgKTsKKwkJQ0hFQ0soIDAsIGZkX2Rpc3BfdW5yZWdpc3RlciggJmhkbFsxXSwgTlVMTCApICk7CisJCUNIRUNLKCAwLCBmZF9kaXNwX3VucmVnaXN0ZXIoICZoZGxbMl0sIE5VTEwgKSApOworCQlDSEVDSyggMCwgZmRfZGlzcF91bnJlZ2lzdGVyKCAmaGRsWzNdLCBOVUxMICkgKTsKKwkJQ0hFQ0soIDAsIGZkX2Rpc3BfdW5yZWdpc3RlciggJmhkbFs0XSwgTlVMTCApICk7CisJfQorCQorCS8qIEhhbmRsZXJzIGZvciBjb21tYW5kcyAqLworCXsKKwkJd2hlbi5hcHAgPSBOVUxMOworCQl3aGVuLmNvbW1hbmQgPSBOVUxMOworCQlDSEVDSyggMCwgZmRfZGlzcF9yZWdpc3RlciggY2JfMCwgRElTUF9IT1dfQU5ZLCAmd2hlbiwgTlVMTCwgJmhkbFswXSApICk7CisJCUNIRUNLKCBFSU5WQUwsIGZkX2Rpc3BfcmVnaXN0ZXIoIGNiXzEsIERJU1BfSE9XX0NDLCAmd2hlbiwgTlVMTCwgJmhkbFsxXSApICk7CisJCXdoZW4uY29tbWFuZCA9IGNtZDE7CisJCUNIRUNLKCAwLCBmZF9kaXNwX3JlZ2lzdGVyKCBjYl8xLCBESVNQX0hPV19DQywgJndoZW4sIE5VTEwsICZoZGxbMV0gKSApOyAvKiBjbWQxICovCisJCXdoZW4uYXBwID0gYXBwMjsKKwkJQ0hFQ0soIDAsIGZkX2Rpc3BfcmVnaXN0ZXIoIGNiXzIsIERJU1BfSE9XX0NDLCAmd2hlbiwgTlVMTCwgJmhkbFsyXSApICk7IC8qIGFwcDIgKyBjbWQxICovCisJCXdoZW4uY29tbWFuZCA9IGNtZDI7CisJCXdoZW4uYXBwID0gTlVMTDsKKwkJd2hlbi5hdnAgPSBhdnAxOworCQlDSEVDSyggMCwgZmRfZGlzcF9yZWdpc3RlciggY2JfMywgRElTUF9IT1dfQ0MsICZ3aGVuLCBOVUxMLCAmaGRsWzNdICkgKTsgLyogY21kMiAoYXZwMSBpZ25vcmVkKSAqLworCQkKKwkJLyogQ2hlY2sgdGhlIGNhbGxiYWNrcyBhcmUgY2FsbGVkIGFzIGFwcHJvcHJpYXRlICovCisJCW1lbXNldChjYmNhbGxlZCwgMCwgc2l6ZW9mKGNiY2FsbGVkKSk7CisJCW1zZyA9IG5ld19tc2coIDAsIGNtZDEsIGF2cDEsIE5VTEwsIDAgKTsKKwkJQ0hFQ0soIDAsIGZkX21zZ19kaXNwYXRjaCAoICZtc2csIHNlc3MsICZhY3Rpb24sICZlYywgJmVtLCAmZXJyb3IgKSApOworCQlDSEVDSyggMSwgY2JjYWxsZWRbMF0gKTsKKwkJQ0hFQ0soIDEsIGNiY2FsbGVkWzFdICk7CisJCUNIRUNLKCAwLCBjYmNhbGxlZFsyXSApOworCQlDSEVDSyggMCwgY2JjYWxsZWRbM10gKTsKKwkJQ0hFQ0soIERJU1BfQUNUX0NPTlQsIGFjdGlvbiApOworCQlDSEVDSyggMCwgZmRfbXNnX2ZyZWUoIG1zZyApICk7CisJCQorCQltZW1zZXQoY2JjYWxsZWQsIDAsIHNpemVvZihjYmNhbGxlZCkpOworCQltc2cgPSBuZXdfbXNnKCAyLCBjbWQxLCBhdnAxLCBOVUxMLCAwICk7CisJCUNIRUNLKCAwLCBmZF9tc2dfZGlzcGF0Y2ggKCAmbXNnLCBzZXNzLCAmYWN0aW9uLCAmZWMsICZlbSwgJmVycm9yICkgKTsKKwkJQ0hFQ0soIDEsIGNiY2FsbGVkWzBdICk7CisJCUNIRUNLKCAxLCBjYmNhbGxlZFsxXSApOworCQlDSEVDSyggMSwgY2JjYWxsZWRbMl0gKTsKKwkJQ0hFQ0soIDAsIGNiY2FsbGVkWzNdICk7CisJCUNIRUNLKCBESVNQX0FDVF9DT05ULCBhY3Rpb24gKTsKKwkJQ0hFQ0soIDAsIGZkX21zZ19mcmVlKCBtc2cgKSApOworCQkKKwkJbWVtc2V0KGNiY2FsbGVkLCAwLCBzaXplb2YoY2JjYWxsZWQpKTsKKwkJbXNnID0gbmV3X21zZyggMiwgY21kMiwgYXZwMSwgTlVMTCwgMCApOworCQlDSEVDSyggMCwgZmRfbXNnX2Rpc3BhdGNoICggJm1zZywgc2VzcywgJmFjdGlvbiwgJmVjLCAmZW0sICZlcnJvciApICk7CisJCUNIRUNLKCAxLCBjYmNhbGxlZFswXSApOworCQlDSEVDSyggMCwgY2JjYWxsZWRbMV0gKTsKKwkJQ0hFQ0soIDAsIGNiY2FsbGVkWzJdICk7CisJCUNIRUNLKCAxLCBjYmNhbGxlZFszXSApOworCQlDSEVDSyggRElTUF9BQ1RfQ09OVCwgYWN0aW9uICk7CisJCUNIRUNLKCAwLCBmZF9tc2dfZnJlZSggbXNnICkgKTsKKwkJCisJCW1lbXNldChjYmNhbGxlZCwgMCwgc2l6ZW9mKGNiY2FsbGVkKSk7CisJCW1zZyA9IG5ld19tc2coIDEsIGNtZDIsIE5VTEwsIGF2cDIsIDAgKTsKKwkJQ0hFQ0soIDAsIGZkX21zZ19kaXNwYXRjaCAoICZtc2csIHNlc3MsICZhY3Rpb24sICZlYywgJmVtLCAmZXJyb3IgKSApOworCQlDSEVDSyggMSwgY2JjYWxsZWRbMF0gKTsKKwkJQ0hFQ0soIDAsIGNiY2FsbGVkWzFdICk7CisJCUNIRUNLKCAwLCBjYmNhbGxlZFsyXSApOworCQlDSEVDSyggMSwgY2JjYWxsZWRbM10gKTsKKwkJQ0hFQ0soIERJU1BfQUNUX0NPTlQsIGFjdGlvbiApOworCQlDSEVDSyggMCwgZmRfbXNnX2ZyZWUoIG1zZyApICk7CisJCQorCQlDSEVDSyggMCwgZmRfZGlzcF91bnJlZ2lzdGVyKCAmaGRsWzBdLCBOVUxMICkgKTsKKwkJQ0hFQ0soIDAsIGZkX2Rpc3BfdW5yZWdpc3RlciggJmhkbFsxXSwgTlVMTCApICk7CisJCUNIRUNLKCAwLCBmZF9kaXNwX3VucmVnaXN0ZXIoICZoZGxbMl0sIE5VTEwgKSApOworCQlDSEVDSyggMCwgZmRfZGlzcF91bnJlZ2lzdGVyKCAmaGRsWzNdLCBOVUxMICkgKTsKKwl9CisJCisJLyogSGFuZGxlcnMgZm9yIEFWUHMgKi8KKwl7CisJCXdoZW4uYXBwID0gTlVMTDsKKwkJd2hlbi5jb21tYW5kID0gTlVMTDsKKwkJd2hlbi5hdnAgPSBOVUxMOworCQorCQlDSEVDSyggMCwgZmRfZGlzcF9yZWdpc3RlciggY2JfMCwgRElTUF9IT1dfQU5ZLCAmd2hlbiwgTlVMTCwgJmhkbFswXSApICk7IC8qIGFsbCAqLworCQlDSEVDSyggRUlOVkFMLCBmZF9kaXNwX3JlZ2lzdGVyKCBjYl8xLCBESVNQX0hPV19BVlAsICZ3aGVuLCBOVUxMLCAmaGRsWzFdICkgKTsKKwkJCisJCXdoZW4uYXZwID0gYXZwMTsKKwkJQ0hFQ0soIDAsIGZkX2Rpc3BfcmVnaXN0ZXIoIGNiXzEsIERJU1BfSE9XX0FWUCwgJndoZW4sIE5VTEwsICZoZGxbMV0gKSApOyAvKiBhdnAxICovCisJCQorCQl3aGVuLmNvbW1hbmQgPSBjbWQxOworCQlDSEVDSyggMCwgZmRfZGlzcF9yZWdpc3RlciggY2JfMiwgRElTUF9IT1dfQVZQLCAmd2hlbiwgTlVMTCwgJmhkbFsyXSApICk7IC8qIGF2cDEgKyBjbWQxICovCisJCQorCQl3aGVuLmNvbW1hbmQgPSBOVUxMOworCQl3aGVuLmFwcCA9IGFwcDE7CisJCUNIRUNLKCAwLCBmZF9kaXNwX3JlZ2lzdGVyKCBjYl8zLCBESVNQX0hPV19BVlAsICZ3aGVuLCBOVUxMLCAmaGRsWzNdICkgKTsgLyogYXZwMSArIGFwcDEgKi8KKwkJCisJCXdoZW4uY29tbWFuZCA9IGNtZDE7CisJCUNIRUNLKCAwLCBmZF9kaXNwX3JlZ2lzdGVyKCBjYl80LCBESVNQX0hPV19BVlAsICZ3aGVuLCBOVUxMLCAmaGRsWzRdICkgKTsgLyogYXZwMSArIGNtZDEgKyBhcHAxICovCisJCQorCQl3aGVuLmFwcCA9IE5VTEw7CisJCXdoZW4uY29tbWFuZCA9IE5VTEw7CisJCXdoZW4uYXZwID0gYXZwMjsKKwkJd2hlbi52YWx1ZSA9IGVudTE7CisJCUNIRUNLKCAwLCBmZF9kaXNwX3JlZ2lzdGVyKCBjYl81LCBESVNQX0hPV19BVlAsICZ3aGVuLCBOVUxMLCAmaGRsWzVdICkgKTsgLyogYXZwMiAqLworCQkKKwkJd2hlbi52YWx1ZSA9IGVudTI7CisJCUNIRUNLKCAwLCBmZF9kaXNwX3JlZ2lzdGVyKCBjYl83LCBESVNQX0hPV19BVlAsICZ3aGVuLCBOVUxMLCAmaGRsWzZdICkgKTsgLyogYXZwMiAqLworCQkKKwkJCisJCQorCQkvKiBDaGVjayB0aGUgY2FsbGJhY2tzIGFyZSBjYWxsZWQgYXMgYXBwcm9wcmlhdGUgKi8KKwkJbWVtc2V0KGNiY2FsbGVkLCAwLCBzaXplb2YoY2JjYWxsZWQpKTsKKwkJbXNnID0gbmV3X21zZyggMCwgY21kMSwgTlVMTCwgTlVMTCwgMCApOworCQlDSEVDSyggMCwgZmRfbXNnX2Rpc3BhdGNoICggJm1zZywgc2VzcywgJmFjdGlvbiwgJmVjLCAmZW0sICZlcnJvciApICk7CisJCUNIRUNLKCAxLCBjYmNhbGxlZFswXSApOworCQlDSEVDSyggMCwgY2JjYWxsZWRbMV0gKTsKKwkJQ0hFQ0soIDAsIGNiY2FsbGVkWzJdICk7CisJCUNIRUNLKCAwLCBjYmNhbGxlZFszXSApOworCQlDSEVDSyggMCwgY2JjYWxsZWRbNF0gKTsKKwkJQ0hFQ0soIDAsIGNiY2FsbGVkWzVdICk7CisJCUNIRUNLKCBESVNQX0FDVF9DT05ULCBhY3Rpb24gKTsKKwkJQ0hFQ0soIDAsIGZkX21zZ19mcmVlKCBtc2cgKSApOworCQkKKwkJbWVtc2V0KGNiY2FsbGVkLCAwLCBzaXplb2YoY2JjYWxsZWQpKTsKKwkJbXNnID0gbmV3X21zZyggMCwgY21kMSwgYXZwMSwgTlVMTCwgMCApOworCQlDSEVDSyggMCwgZmRfbXNnX2Rpc3BhdGNoICggJm1zZywgc2VzcywgJmFjdGlvbiwgJmVjLCAmZW0sICZlcnJvciApICk7CisJCUNIRUNLKCAxLCBjYmNhbGxlZFswXSApOworCQlDSEVDSyggMSwgY2JjYWxsZWRbMV0gKTsKKwkJQ0hFQ0soIDEsIGNiY2FsbGVkWzJdICk7CisJCUNIRUNLKCAwLCBjYmNhbGxlZFszXSApOworCQlDSEVDSyggMCwgY2JjYWxsZWRbNF0gKTsKKwkJQ0hFQ0soIDAsIGNiY2FsbGVkWzVdICk7CisJCUNIRUNLKCBESVNQX0FDVF9DT05ULCBhY3Rpb24gKTsKKwkJQ0hFQ0soIDAsIGZkX21zZ19mcmVlKCBtc2cgKSApOworCQkKKwkJbWVtc2V0KGNiY2FsbGVkLCAwLCBzaXplb2YoY2JjYWxsZWQpKTsKKwkJbXNnID0gbmV3X21zZyggMSwgY21kMiwgYXZwMSwgTlVMTCwgMCApOworCQlDSEVDSyggMCwgZmRfbXNnX2Rpc3BhdGNoICggJm1zZywgc2VzcywgJmFjdGlvbiwgJmVjLCAmZW0sICZlcnJvciApICk7CisJCUNIRUNLKCAxLCBjYmNhbGxlZFswXSApOworCQlDSEVDSyggMSwgY2JjYWxsZWRbMV0gKTsKKwkJQ0hFQ0soIDAsIGNiY2FsbGVkWzJdICk7CisJCUNIRUNLKCAxLCBjYmNhbGxlZFszXSApOworCQlDSEVDSyggMCwgY2JjYWxsZWRbNF0gKTsKKwkJQ0hFQ0soIDAsIGNiY2FsbGVkWzVdICk7CisJCUNIRUNLKCBESVNQX0FDVF9DT05ULCBhY3Rpb24gKTsKKwkJQ0hFQ0soIDAsIGZkX21zZ19mcmVlKCBtc2cgKSApOworCQkKKwkJbWVtc2V0KGNiY2FsbGVkLCAwLCBzaXplb2YoY2JjYWxsZWQpKTsKKwkJbXNnID0gbmV3X21zZyggMSwgY21kMSwgYXZwMSwgTlVMTCwgMCApOworCQlDSEVDSyggMCwgZmRfbXNnX2Rpc3BhdGNoICggJm1zZywgc2VzcywgJmFjdGlvbiwgJmVjLCAmZW0sICZlcnJvciApICk7CisJCUNIRUNLKCAxLCBjYmNhbGxlZFswXSApOworCQlDSEVDSyggMSwgY2JjYWxsZWRbMV0gKTsKKwkJQ0hFQ0soIDEsIGNiY2FsbGVkWzJdICk7CisJCUNIRUNLKCAxLCBjYmNhbGxlZFszXSApOworCQlDSEVDSyggMSwgY2JjYWxsZWRbNF0gKTsKKwkJQ0hFQ0soIDAsIGNiY2FsbGVkWzVdICk7CisJCUNIRUNLKCBESVNQX0FDVF9DT05ULCBhY3Rpb24gKTsKKwkJQ0hFQ0soIDAsIGZkX21zZ19mcmVlKCBtc2cgKSApOworCQkKKwkJbWVtc2V0KGNiY2FsbGVkLCAwLCBzaXplb2YoY2JjYWxsZWQpKTsKKwkJbXNnID0gbmV3X21zZyggMSwgY21kMSwgYXZwMSwgYXZwMiwgMCApOworCQlDSEVDSyggMCwgZmRfbXNnX2Rpc3BhdGNoICggJm1zZywgc2VzcywgJmFjdGlvbiwgJmVjLCAmZW0sICZlcnJvciApICk7CisJCUNIRUNLKCAxLCBjYmNhbGxlZFswXSApOworCQlDSEVDSyggMSwgY2JjYWxsZWRbMV0gKTsKKwkJQ0hFQ0soIDEsIGNiY2FsbGVkWzJdICk7CisJCUNIRUNLKCAxLCBjYmNhbGxlZFszXSApOworCQlDSEVDSyggMSwgY2JjYWxsZWRbNF0gKTsKKwkJQ0hFQ0soIDEsIGNiY2FsbGVkWzVdICk7CisJCUNIRUNLKCAxLCBjYmNhbGxlZFs3XSApOworCQlDSEVDSyggRElTUF9BQ1RfQ09OVCwgYWN0aW9uICk7CisJCUNIRUNLKCAwLCBmZF9tc2dfZnJlZSggbXNnICkgKTsKKwkJCisJCW1lbXNldChjYmNhbGxlZCwgMCwgc2l6ZW9mKGNiY2FsbGVkKSk7CisJCW1zZyA9IG5ld19tc2coIDEsIGNtZDEsIE5VTEwsIGF2cDIsIDEgKTsKKwkJQ0hFQ0soIDAsIGZkX21zZ19kaXNwYXRjaCAoICZtc2csIHNlc3MsICZhY3Rpb24sICZlYywgJmVtLCAmZXJyb3IgKSApOworCQlDSEVDSyggMSwgY2JjYWxsZWRbMF0gKTsKKwkJQ0hFQ0soIDAsIGNiY2FsbGVkWzFdICk7CisJCUNIRUNLKCAwLCBjYmNhbGxlZFsyXSApOworCQlDSEVDSyggMCwgY2JjYWxsZWRbM10gKTsKKwkJQ0hFQ0soIDAsIGNiY2FsbGVkWzRdICk7CisJCUNIRUNLKCAxLCBjYmNhbGxlZFs1XSApOworCQlDSEVDSyggMSwgY2JjYWxsZWRbN10gKTsKKwkJQ0hFQ0soIERJU1BfQUNUX0NPTlQsIGFjdGlvbiApOworCQlDSEVDSyggMCwgZmRfbXNnX2ZyZWUoIG1zZyApICk7CisJCQorCQltZW1zZXQoY2JjYWxsZWQsIDAsIHNpemVvZihjYmNhbGxlZCkpOworCQltc2cgPSBuZXdfbXNnKCAxLCBjbWQxLCBOVUxMLCBhdnAyLCAyICk7CisJCUNIRUNLKCAwLCBmZF9tc2dfZGlzcGF0Y2ggKCAmbXNnLCBzZXNzLCAmYWN0aW9uLCAmZWMsICZlbSwgJmVycm9yICkgKTsKKwkJQ0hFQ0soIDEsIGNiY2FsbGVkWzBdICk7CisJCUNIRUNLKCAwLCBjYmNhbGxlZFsxXSApOworCQlDSEVDSyggMCwgY2JjYWxsZWRbMl0gKTsKKwkJQ0hFQ0soIDAsIGNiY2FsbGVkWzNdICk7CisJCUNIRUNLKCAwLCBjYmNhbGxlZFs0XSApOworCQlDSEVDSyggMSwgY2JjYWxsZWRbNV0gKTsKKwkJQ0hFQ0soIDEsIGNiY2FsbGVkWzddICk7CisJCUNIRUNLKCBESVNQX0FDVF9DT05ULCBhY3Rpb24gKTsKKwkJQ0hFQ0soIDAsIGZkX21zZ19mcmVlKCBtc2cgKSApOworCQkKKwkJQ0hFQ0soIDAsIGZkX2Rpc3BfdW5yZWdpc3RlciggJmhkbFswXSwgTlVMTCApICk7CisJCUNIRUNLKCAwLCBmZF9kaXNwX3VucmVnaXN0ZXIoICZoZGxbMV0sIE5VTEwgKSApOworCQlDSEVDSyggMCwgZmRfZGlzcF91bnJlZ2lzdGVyKCAmaGRsWzJdLCBOVUxMICkgKTsKKwkJQ0hFQ0soIDAsIGZkX2Rpc3BfdW5yZWdpc3RlciggJmhkbFszXSwgTlVMTCApICk7CisJCUNIRUNLKCAwLCBmZF9kaXNwX3VucmVnaXN0ZXIoICZoZGxbNF0sIE5VTEwgKSApOworCQlDSEVDSyggMCwgZmRfZGlzcF91bnJlZ2lzdGVyKCAmaGRsWzVdLCBOVUxMICkgKTsKKwkJQ0hFQ0soIDAsIGZkX2Rpc3BfdW5yZWdpc3RlciggJmhkbFs2XSwgTlVMTCApICk7CisJfQorCQkKKwkvKiBIYW5kbGVycyBmb3IgZW51bSB2YWx1ZXMgKi8KKwl7CisJCXdoZW4uYXBwID0gTlVMTDsKKwkJd2hlbi5jb21tYW5kID0gTlVMTDsKKwkJd2hlbi5hdnAgPSBOVUxMOworCQl3aGVuLnZhbHVlID0gTlVMTDsKKwkJCisJCUNIRUNLKCAwLCBmZF9kaXNwX3JlZ2lzdGVyKCBjYl8wLCBESVNQX0hPV19BTlksICZ3aGVuLCBOVUxMLCAmaGRsWzBdICkgKTsgLyogYWxsICovCisJCUNIRUNLKCBFSU5WQUwsIGZkX2Rpc3BfcmVnaXN0ZXIoIGNiXzEsIERJU1BfSE9XX0FWUF9FTlVNVkFMLCAmd2hlbiwgTlVMTCwgJmhkbFsxXSApICk7CisJCXdoZW4udmFsdWUgPSBlbnUxOworCQlDSEVDSyggRUlOVkFMLCBmZF9kaXNwX3JlZ2lzdGVyKCBjYl8xLCBESVNQX0hPV19BVlBfRU5VTVZBTCwgJndoZW4sIE5VTEwsICZoZGxbMV0gKSApOworCQl3aGVuLmF2cCA9IGF2cDE7CisJCUNIRUNLKCBFSU5WQUwsIGZkX2Rpc3BfcmVnaXN0ZXIoIGNiXzEsIERJU1BfSE9XX0FWUF9FTlVNVkFMLCAmd2hlbiwgTlVMTCwgJmhkbFsxXSApICk7CisJCXdoZW4uYXZwID0gYXZwMjsKKwkJQ0hFQ0soIDAsIGZkX2Rpc3BfcmVnaXN0ZXIoIGNiXzEsIERJU1BfSE9XX0FWUF9FTlVNVkFMLCAmd2hlbiwgTlVMTCwgJmhkbFsxXSApICk7IC8qIGF2cDIsIGVudTEgKi8KKwkJCisJCXdoZW4uY29tbWFuZCA9IGNtZDE7CisJCUNIRUNLKCAwLCBmZF9kaXNwX3JlZ2lzdGVyKCBjYl8yLCBESVNQX0hPV19BVlBfRU5VTVZBTCwgJndoZW4sIE5VTEwsICZoZGxbMl0gKSApOyAvKiBhdnAyLCBlbnUxICsgY21kMSAqLworCQkKKwkJd2hlbi5jb21tYW5kID0gTlVMTDsKKwkJd2hlbi5hcHAgPSBhcHAxOworCQl3aGVuLnZhbHVlID0gZW51MjsKKwkJQ0hFQ0soIDAsIGZkX2Rpc3BfcmVnaXN0ZXIoIGNiXzMsIERJU1BfSE9XX0FWUF9FTlVNVkFMLCAmd2hlbiwgTlVMTCwgJmhkbFszXSApICk7IC8qIGF2cDIsIGVudTIgKyBhcHAxICovCisJCQorCQkvKiBDaGVjayB0aGUgY2FsbGJhY2tzIGFyZSBjYWxsZWQgYXMgYXBwcm9wcmlhdGUgKi8KKwkJbWVtc2V0KGNiY2FsbGVkLCAwLCBzaXplb2YoY2JjYWxsZWQpKTsKKwkJbXNnID0gbmV3X21zZyggMCwgY21kMSwgYXZwMSwgTlVMTCwgMCApOworCQlDSEVDSyggMCwgZmRfbXNnX2Rpc3BhdGNoICggJm1zZywgc2VzcywgJmFjdGlvbiwgJmVjLCAmZW0sICZlcnJvciApICk7CisJCUNIRUNLKCAxLCBjYmNhbGxlZFswXSApOworCQlDSEVDSyggMCwgY2JjYWxsZWRbMV0gKTsKKwkJQ0hFQ0soIDAsIGNiY2FsbGVkWzJdICk7CisJCUNIRUNLKCAwLCBjYmNhbGxlZFszXSApOworCQlDSEVDSyggRElTUF9BQ1RfQ09OVCwgYWN0aW9uICk7CisJCUNIRUNLKCAwLCBmZF9tc2dfZnJlZSggbXNnICkgKTsKKwkJCisJCW1lbXNldChjYmNhbGxlZCwgMCwgc2l6ZW9mKGNiY2FsbGVkKSk7CisJCW1zZyA9IG5ld19tc2coIDEsIGNtZDIsIGF2cDEsIGF2cDIsIDAgKTsKKwkJQ0hFQ0soIDAsIGZkX21zZ19kaXNwYXRjaCAoICZtc2csIHNlc3MsICZhY3Rpb24sICZlYywgJmVtLCAmZXJyb3IgKSApOworCQlDSEVDSyggMSwgY2JjYWxsZWRbMF0gKTsKKwkJQ0hFQ0soIDAsIGNiY2FsbGVkWzFdICk7CisJCUNIRUNLKCAwLCBjYmNhbGxlZFsyXSApOworCQlDSEVDSyggMCwgY2JjYWxsZWRbM10gKTsKKwkJQ0hFQ0soIERJU1BfQUNUX0NPTlQsIGFjdGlvbiApOworCQlDSEVDSyggMCwgZmRfbXNnX2ZyZWUoIG1zZyApICk7CisJCQorCQltZW1zZXQoY2JjYWxsZWQsIDAsIHNpemVvZihjYmNhbGxlZCkpOworCQltc2cgPSBuZXdfbXNnKCAxLCBjbWQyLCBhdnAxLCBhdnAyLCAxICk7CisJCUNIRUNLKCAwLCBmZF9tc2dfZGlzcGF0Y2ggKCAmbXNnLCBzZXNzLCAmYWN0aW9uLCAmZWMsICZlbSwgJmVycm9yICkgKTsKKwkJQ0hFQ0soIDEsIGNiY2FsbGVkWzBdICk7CisJCUNIRUNLKCAxLCBjYmNhbGxlZFsxXSApOworCQlDSEVDSyggMCwgY2JjYWxsZWRbMl0gKTsKKwkJQ0hFQ0soIDAsIGNiY2FsbGVkWzNdICk7CisJCUNIRUNLKCBESVNQX0FDVF9DT05ULCBhY3Rpb24gKTsKKwkJQ0hFQ0soIDAsIGZkX21zZ19mcmVlKCBtc2cgKSApOworCQkKKwkJbWVtc2V0KGNiY2FsbGVkLCAwLCBzaXplb2YoY2JjYWxsZWQpKTsKKwkJbXNnID0gbmV3X21zZyggMSwgY21kMiwgYXZwMSwgYXZwMiwgMiApOworCQlDSEVDSyggMCwgZmRfbXNnX2Rpc3BhdGNoICggJm1zZywgc2VzcywgJmFjdGlvbiwgJmVjLCAmZW0sICZlcnJvciApICk7CisJCUNIRUNLKCAxLCBjYmNhbGxlZFswXSApOworCQlDSEVDSyggMCwgY2JjYWxsZWRbMV0gKTsKKwkJQ0hFQ0soIDAsIGNiY2FsbGVkWzJdICk7CisJCUNIRUNLKCAxLCBjYmNhbGxlZFszXSApOworCQlDSEVDSyggRElTUF9BQ1RfQ09OVCwgYWN0aW9uICk7CisJCUNIRUNLKCAwLCBmZF9tc2dfZnJlZSggbXNnICkgKTsKKwkJCisJCW1lbXNldChjYmNhbGxlZCwgMCwgc2l6ZW9mKGNiY2FsbGVkKSk7CisJCW1zZyA9IG5ld19tc2coIDEsIGNtZDEsIGF2cDEsIGF2cDIsIDEgKTsKKwkJQ0hFQ0soIDAsIGZkX21zZ19kaXNwYXRjaCAoICZtc2csIHNlc3MsICZhY3Rpb24sICZlYywgJmVtLCAmZXJyb3IgKSApOworCQlDSEVDSyggMSwgY2JjYWxsZWRbMF0gKTsKKwkJQ0hFQ0soIDEsIGNiY2FsbGVkWzFdICk7CisJCUNIRUNLKCAxLCBjYmNhbGxlZFsyXSApOworCQlDSEVDSyggMCwgY2JjYWxsZWRbM10gKTsKKwkJQ0hFQ0soIERJU1BfQUNUX0NPTlQsIGFjdGlvbiApOworCQlDSEVDSyggMCwgZmRfbXNnX2ZyZWUoIG1zZyApICk7CisJCQorCQltZW1zZXQoY2JjYWxsZWQsIDAsIHNpemVvZihjYmNhbGxlZCkpOworCQltc2cgPSBuZXdfbXNnKCAxLCBjbWQyLCBhdnAxLCBhdnAyLCAxICk7CisJCXsKKwkJCXN0cnVjdCBhdnAgKmF2cDsKKwkJCXVuaW9uIGF2cF92YWx1ZSB2YWx1ZTsKKwkJCUNIRUNLKCAwLCBmZF9tc2dfYXZwX25ldyAoIGF2cDIsIDAsICZhdnAgKSApOworCQkJdmFsdWUudTMyID0gMjsKKwkJCUNIRUNLKCAwLCBmZF9tc2dfYXZwX3NldHZhbHVlICggYXZwLCAmdmFsdWUgKSApOworCQkJQ0hFQ0soIDAsIGZkX21zZ19hdnBfYWRkICggbXNnLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCApICk7CisJCX0KKwkJQ0hFQ0soIDAsIGZkX21zZ19kaXNwYXRjaCAoICZtc2csIHNlc3MsICZhY3Rpb24sICZlYywgJmVtLCAmZXJyb3IgKSApOworCQlDSEVDSyggMSwgY2JjYWxsZWRbMF0gKTsKKwkJQ0hFQ0soIDEsIGNiY2FsbGVkWzFdICk7CisJCUNIRUNLKCAwLCBjYmNhbGxlZFsyXSApOworCQlDSEVDSyggMSwgY2JjYWxsZWRbM10gKTsKKwkJQ0hFQ0soIERJU1BfQUNUX0NPTlQsIGFjdGlvbiApOworCQlDSEVDSyggMCwgZmRfbXNnX2ZyZWUoIG1zZyApICk7CisJCQorCQlDSEVDSyggMCwgZmRfZGlzcF91bnJlZ2lzdGVyKCAmaGRsWzBdLCBOVUxMICkgKTsKKwkJQ0hFQ0soIDAsIGZkX2Rpc3BfdW5yZWdpc3RlciggJmhkbFsxXSwgTlVMTCApICk7CisJCUNIRUNLKCAwLCBmZF9kaXNwX3VucmVnaXN0ZXIoICZoZGxbMl0sIE5VTEwgKSApOworCQlDSEVDSyggMCwgZmRfZGlzcF91bnJlZ2lzdGVyKCAmaGRsWzNdLCBOVUxMICkgKTsKKwl9CisJCisJLyogVGVzdCBiZWhhdmlvciBvZiBoYW5kbGVycyAqLworCXsKKwkJQ0hFQ0soIDAsIGZkX2Rpc3BfcmVnaXN0ZXIoIGNiXzAsIERJU1BfSE9XX0FOWSwgJndoZW4sIE5VTEwsICZoZGxbMF0gKSApOworCQlDSEVDSyggMCwgZmRfZGlzcF9yZWdpc3RlciggY2JfMSwgRElTUF9IT1dfQU5ZLCAmd2hlbiwgTlVMTCwgJmhkbFsxXSApICk7CisJCUNIRUNLKCAwLCBmZF9kaXNwX3JlZ2lzdGVyKCBjYl82LCBESVNQX0hPV19BTlksICZ3aGVuLCBOVUxMLCAmaGRsWzJdICkgKTsKKwkJQ0hFQ0soIDAsIGZkX2Rpc3BfcmVnaXN0ZXIoIGNiXzIsIERJU1BfSE9XX0FOWSwgJndoZW4sIE5VTEwsICZoZGxbM10gKSApOworCQlDSEVDSyggMCwgZmRfZGlzcF9yZWdpc3RlciggY2JfMywgRElTUF9IT1dfQU5ZLCAmd2hlbiwgTlVMTCwgJmhkbFs0XSApICk7CisJCQorCQltZW1zZXQoY2JjYWxsZWQsIDAsIHNpemVvZihjYmNhbGxlZCkpOworCQltc2cgPSBuZXdfbXNnKCAxLCBjbWQxLCBhdnAxLCBhdnAyLCAxICk7CisJCUNIRUNLKCAwLCBmZF9tc2dfZGlzcGF0Y2ggKCAmbXNnLCBzZXNzLCAmYWN0aW9uLCAmZWMsICZlbSwgJmVycm9yICkgKTsKKwkJQ0hFQ0soIDEsIGNiY2FsbGVkWzBdICk7CisJCUNIRUNLKCAxLCBjYmNhbGxlZFsxXSApOworCQlDSEVDSyggMSwgY2JjYWxsZWRbNl0gKTsKKwkJQ0hFQ0soIDAsIGNiY2FsbGVkWzJdICk7CisJCUNIRUNLKCAwLCBjYmNhbGxlZFszXSApOworCQlDSEVDSyggMCwgbXNnID8gMSA6IDApOworCQlDSEVDSyggMSwgZW0gPyAxIDogMCk7CisJCUNIRUNLKCAwLCBmZF9tc2dfZnJlZSggZXJyb3IgKSApOworCQkKKwkJQ0hFQ0soIDAsIGZkX2Rpc3BfdW5yZWdpc3RlciggJmhkbFswXSwgTlVMTCApICk7CisJCUNIRUNLKCAwLCBmZF9kaXNwX3VucmVnaXN0ZXIoICZoZGxbMV0sIE5VTEwgKSApOworCQlDSEVDSyggMCwgZmRfZGlzcF91bnJlZ2lzdGVyKCAmaGRsWzJdLCBOVUxMICkgKTsKKwkJQ0hFQ0soIDAsIGZkX2Rpc3BfdW5yZWdpc3RlciggJmhkbFszXSwgTlVMTCApICk7CisJCUNIRUNLKCAwLCBmZF9kaXNwX3VucmVnaXN0ZXIoICZoZGxbNF0sIE5VTEwgKSApOworCQkKKwkJQ0hFQ0soIDAsIGZkX2Rpc3BfcmVnaXN0ZXIoIGNiXzAsIERJU1BfSE9XX0FOWSwgJndoZW4sIE5VTEwsICZoZGxbMF0gKSApOworCQlDSEVDSyggMCwgZmRfZGlzcF9yZWdpc3RlciggY2JfMSwgRElTUF9IT1dfQU5ZLCAmd2hlbiwgTlVMTCwgJmhkbFsxXSApICk7CisJCUNIRUNLKCAwLCBmZF9kaXNwX3JlZ2lzdGVyKCBjYl84LCBESVNQX0hPV19BTlksICZ3aGVuLCBOVUxMLCAmaGRsWzJdICkgKTsKKwkJQ0hFQ0soIDAsIGZkX2Rpc3BfcmVnaXN0ZXIoIGNiXzIsIERJU1BfSE9XX0FOWSwgJndoZW4sIE5VTEwsICZoZGxbM10gKSApOworCQlDSEVDSyggMCwgZmRfZGlzcF9yZWdpc3RlciggY2JfMywgRElTUF9IT1dfQU5ZLCAmd2hlbiwgTlVMTCwgJmhkbFs0XSApICk7CisJCQorCQltZW1zZXQoY2JjYWxsZWQsIDAsIHNpemVvZihjYmNhbGxlZCkpOworCQltc2cgPSBuZXdfbXNnKCAxLCBjbWQxLCBhdnAxLCBhdnAyLCAxICk7CisJCUNIRUNLKCAwLCBmZF9tc2dfZGlzcGF0Y2ggKCAmbXNnLCBzZXNzLCAmYWN0aW9uLCAmZWMsICZlbSwgJmVycm9yICkgKTsKKwkJQ0hFQ0soIDEsIGNiY2FsbGVkWzBdICk7CisJCUNIRUNLKCAxLCBjYmNhbGxlZFsxXSApOworCQlDSEVDSyggMSwgY2JjYWxsZWRbOF0gKTsKKwkJQ0hFQ0soIDAsIGNiY2FsbGVkWzJdICk7CisJCUNIRUNLKCAwLCBjYmNhbGxlZFszXSApOworCQlDSEVDSyggTlVMTCwgbXNnICk7CisJCUNIRUNLKCBOVUxMLCBlbSApOworCQkKKwkJQ0hFQ0soIDAsIGZkX2Rpc3BfdW5yZWdpc3RlciggJmhkbFswXSwgTlVMTCApICk7CisJCUNIRUNLKCAwLCBmZF9kaXNwX3VucmVnaXN0ZXIoICZoZGxbMV0sIE5VTEwgKSApOworCQlDSEVDSyggMCwgZmRfZGlzcF91bnJlZ2lzdGVyKCAmaGRsWzJdLCBOVUxMICkgKTsKKwkJQ0hFQ0soIDAsIGZkX2Rpc3BfdW5yZWdpc3RlciggJmhkbFszXSwgTlVMTCApICk7CisJCUNIRUNLKCAwLCBmZF9kaXNwX3VucmVnaXN0ZXIoICZoZGxbNF0sIE5VTEwgKSApOworCQkKKwkJQ0hFQ0soIDAsIGZkX2Rpc3BfcmVnaXN0ZXIoIGNiXzAsIERJU1BfSE9XX0FOWSwgJndoZW4sIE5VTEwsICZoZGxbMF0gKSApOworCQlDSEVDSyggMCwgZmRfZGlzcF9yZWdpc3RlciggY2JfMSwgRElTUF9IT1dfQU5ZLCAmd2hlbiwgTlVMTCwgJmhkbFsxXSApICk7CisJCUNIRUNLKCAwLCBmZF9kaXNwX3JlZ2lzdGVyKCBjYl85LCBESVNQX0hPV19BTlksICZ3aGVuLCBOVUxMLCAmaGRsWzJdICkgKTsKKwkJQ0hFQ0soIDAsIGZkX2Rpc3BfcmVnaXN0ZXIoIGNiXzIsIERJU1BfSE9XX0FOWSwgJndoZW4sIE5VTEwsICZoZGxbM10gKSApOworCQlDSEVDSyggMCwgZmRfZGlzcF9yZWdpc3RlciggY2JfMywgRElTUF9IT1dfQU5ZLCAmd2hlbiwgTlVMTCwgJmhkbFs0XSApICk7CisJCQorCQltZW1zZXQoY2JjYWxsZWQsIDAsIHNpemVvZihjYmNhbGxlZCkpOworCQltc2cgPSBuZXdfbXNnKCAxLCBjbWQxLCBhdnAxLCBhdnAyLCAxICk7CisJCUNIRUNLKCAwLCBmZF9tc2dfZGlzcGF0Y2ggKCAmbXNnLCBzZXNzLCAmYWN0aW9uLCAmZWMsICZlbSwgJmVycm9yICkgKTsKKwkJQ0hFQ0soIDEsIGNiY2FsbGVkWzBdICk7CisJCUNIRUNLKCAxLCBjYmNhbGxlZFsxXSApOworCQlDSEVDSyggMSwgY2JjYWxsZWRbOV0gKTsKKwkJQ0hFQ0soIDAsIGNiY2FsbGVkWzJdICk7CisJCUNIRUNLKCAwLCBjYmNhbGxlZFszXSApOworCQlDSEVDSyggRElTUF9BQ1RfU0VORCwgYWN0aW9uICk7CisJCUNIRUNLKCAwLCBmZF9tc2dfZnJlZSggbXNnICkgKTsKKwkJCisJCUNIRUNLKCAwLCBmZF9kaXNwX3VucmVnaXN0ZXIoICZoZGxbMF0sIE5VTEwgKSApOworCQlDSEVDSyggMCwgZmRfZGlzcF91bnJlZ2lzdGVyKCAmaGRsWzFdLCBOVUxMICkgKTsKKwkJQ0hFQ0soIDAsIGZkX2Rpc3BfdW5yZWdpc3RlciggJmhkbFsyXSwgTlVMTCApICk7CisJCUNIRUNLKCAwLCBmZF9kaXNwX3VucmVnaXN0ZXIoICZoZGxbM10sIE5VTEwgKSApOworCQlDSEVDSyggMCwgZmRfZGlzcF91bnJlZ2lzdGVyKCAmaGRsWzRdLCBOVUxMICkgKTsKKwl9CisJCQorCS8qIFRlc3Qgb3JkZXIgb2YgaGFuZGxlcnMgKi8KKwl7CisJCXdoZW4uYXBwID0gYXBwMjsKKwkJd2hlbi5jb21tYW5kID0gY21kMjsKKwkJd2hlbi5hdnAgPSBhdnAyOworCQl3aGVuLnZhbHVlID0gZW51MjsKKwkJCisJCUNIRUNLKCAwLCBmZF9kaXNwX3JlZ2lzdGVyKCBjYl8wLCBESVNQX0hPV19BTlksICZ3aGVuLCBOVUxMLCAmaGRsWzBdICkgKTsKKwkJQ0hFQ0soIDAsIGZkX2Rpc3BfcmVnaXN0ZXIoIGNiXzEsIERJU1BfSE9XX0FWUF9FTlVNVkFMLCAmd2hlbiwgTlVMTCwgJmhkbFsxXSApICk7CisJCUNIRUNLKCAwLCBmZF9kaXNwX3JlZ2lzdGVyKCBjYl8yLCBESVNQX0hPV19BVlAsICZ3aGVuLCBOVUxMLCAmaGRsWzJdICkgKTsKKwkJQ0hFQ0soIDAsIGZkX2Rpc3BfcmVnaXN0ZXIoIGNiXzMsIERJU1BfSE9XX0NDLCAmd2hlbiwgTlVMTCwgJmhkbFszXSApICk7CisJCUNIRUNLKCAwLCBmZF9kaXNwX3JlZ2lzdGVyKCBjYl80LCBESVNQX0hPV19BUFBJRCwgJndoZW4sIE5VTEwsICZoZGxbNF0gKSApOworCQkKKwkJbWVtc2V0KGNiY2FsbGVkLCAwLCBzaXplb2YoY2JjYWxsZWQpKTsKKwkJbXNnID0gbmV3X21zZyggMiwgY21kMiwgYXZwMSwgYXZwMiwgMiApOworCQlDSEVDSyggMCwgZmRfbXNnX2Rpc3BhdGNoICggJm1zZywgc2VzcywgJmFjdGlvbiwgJmVjLCAmZW0sICZlcnJvciApICk7CisJCUNIRUNLKCAxLCBjYmNhbGxlZFswXSApOworCQlDSEVDSyggMSwgY2JjYWxsZWRbMV0gKTsKKwkJQ0hFQ0soIDEsIGNiY2FsbGVkWzJdICk7CisJCUNIRUNLKCAxLCBjYmNhbGxlZFszXSApOworCQlDSEVDSyggMSwgY2JjYWxsZWRbNF0gKTsKKwkJQ0hFQ0soIDAsIGNiY2FsbGVkWzldICk7CisJCUNIRUNLKCAwLCBmZF9tc2dfZnJlZSggbXNnICkgKTsKKwkJCisJCUNIRUNLKCAwLCBmZF9kaXNwX3JlZ2lzdGVyKCBjYl85LCBESVNQX0hPV19BTlksICZ3aGVuLCBOVUxMLCAmaGRsWzVdICkgKTsKKwkJbWVtc2V0KGNiY2FsbGVkLCAwLCBzaXplb2YoY2JjYWxsZWQpKTsKKwkJbXNnID0gbmV3X21zZyggMiwgY21kMiwgYXZwMSwgYXZwMiwgMiApOworCQlDSEVDSyggMCwgZmRfbXNnX2Rpc3BhdGNoICggJm1zZywgc2VzcywgJmFjdGlvbiwgJmVjLCAmZW0sICZlcnJvciApICk7CisJCUNIRUNLKCAxLCBjYmNhbGxlZFswXSApOworCQlDSEVDSyggMCwgY2JjYWxsZWRbMV0gKTsKKwkJQ0hFQ0soIDAsIGNiY2FsbGVkWzJdICk7CisJCUNIRUNLKCAwLCBjYmNhbGxlZFszXSApOworCQlDSEVDSyggMCwgY2JjYWxsZWRbNF0gKTsKKwkJQ0hFQ0soIDEsIGNiY2FsbGVkWzldICk7CisJCUNIRUNLKCAwLCBmZF9tc2dfZnJlZSggbXNnICkgKTsKKwkJQ0hFQ0soIDAsIGZkX2Rpc3BfdW5yZWdpc3RlciggJmhkbFs1XSwgTlVMTCApICk7CisJCQorCQlDSEVDSyggMCwgZmRfZGlzcF9yZWdpc3RlciggY2JfOSwgRElTUF9IT1dfQVZQX0VOVU1WQUwsICZ3aGVuLCBOVUxMLCAmaGRsWzVdICkgKTsKKwkJbWVtc2V0KGNiY2FsbGVkLCAwLCBzaXplb2YoY2JjYWxsZWQpKTsKKwkJbXNnID0gbmV3X21zZyggMiwgY21kMiwgYXZwMSwgYXZwMiwgMiApOworCQlDSEVDSyggMCwgZmRfbXNnX2Rpc3BhdGNoICggJm1zZywgc2VzcywgJmFjdGlvbiwgJmVjLCAmZW0sICZlcnJvciApICk7CisJCUNIRUNLKCAxLCBjYmNhbGxlZFswXSApOworCQlDSEVDSyggMSwgY2JjYWxsZWRbMV0gKTsKKwkJQ0hFQ0soIDEsIGNiY2FsbGVkWzJdICk7CisJCUNIRUNLKCAwLCBjYmNhbGxlZFszXSApOworCQlDSEVDSyggMCwgY2JjYWxsZWRbNF0gKTsKKwkJQ0hFQ0soIDEsIGNiY2FsbGVkWzldICk7CisJCUNIRUNLKCAwLCBmZF9tc2dfZnJlZSggbXNnICkgKTsKKwkJQ0hFQ0soIDAsIGZkX2Rpc3BfdW5yZWdpc3RlciggJmhkbFs1XSwgTlVMTCApICk7CisJCQorCQlDSEVDSyggMCwgZmRfZGlzcF9yZWdpc3RlciggY2JfOSwgRElTUF9IT1dfQVZQLCAmd2hlbiwgTlVMTCwgJmhkbFs1XSApICk7CisJCW1lbXNldChjYmNhbGxlZCwgMCwgc2l6ZW9mKGNiY2FsbGVkKSk7CisJCW1zZyA9IG5ld19tc2coIDIsIGNtZDIsIGF2cDEsIGF2cDIsIDIgKTsKKwkJQ0hFQ0soIDAsIGZkX21zZ19kaXNwYXRjaCAoICZtc2csIHNlc3MsICZhY3Rpb24sICZlYywgJmVtLCAmZXJyb3IgKSApOworCQlDSEVDSyggMSwgY2JjYWxsZWRbMF0gKTsKKwkJQ0hFQ0soIDEsIGNiY2FsbGVkWzFdICk7CisJCUNIRUNLKCAxLCBjYmNhbGxlZFsyXSApOworCQlDSEVDSyggMCwgY2JjYWxsZWRbM10gKTsKKwkJQ0hFQ0soIDAsIGNiY2FsbGVkWzRdICk7CisJCUNIRUNLKCAxLCBjYmNhbGxlZFs5XSApOworCQlDSEVDSyggMCwgZmRfbXNnX2ZyZWUoIG1zZyApICk7CisJCUNIRUNLKCAwLCBmZF9kaXNwX3VucmVnaXN0ZXIoICZoZGxbNV0sIE5VTEwgKSApOworCQkKKwkJQ0hFQ0soIDAsIGZkX2Rpc3BfcmVnaXN0ZXIoIGNiXzksIERJU1BfSE9XX0NDLCAmd2hlbiwgTlVMTCwgJmhkbFs1XSApICk7CisJCW1lbXNldChjYmNhbGxlZCwgMCwgc2l6ZW9mKGNiY2FsbGVkKSk7CisJCW1zZyA9IG5ld19tc2coIDIsIGNtZDIsIGF2cDEsIGF2cDIsIDIgKTsKKwkJQ0hFQ0soIDAsIGZkX21zZ19kaXNwYXRjaCAoICZtc2csIHNlc3MsICZhY3Rpb24sICZlYywgJmVtLCAmZXJyb3IgKSApOworCQlDSEVDSyggMSwgY2JjYWxsZWRbMF0gKTsKKwkJQ0hFQ0soIDEsIGNiY2FsbGVkWzFdICk7CisJCUNIRUNLKCAxLCBjYmNhbGxlZFsyXSApOworCQlDSEVDSyggMSwgY2JjYWxsZWRbM10gKTsKKwkJQ0hFQ0soIDAsIGNiY2FsbGVkWzRdICk7CisJCUNIRUNLKCAxLCBjYmNhbGxlZFs5XSApOworCQlDSEVDSyggMCwgZmRfbXNnX2ZyZWUoIG1zZyApICk7CisJCUNIRUNLKCAwLCBmZF9kaXNwX3VucmVnaXN0ZXIoICZoZGxbNV0sIE5VTEwgKSApOworCQkKKwkJQ0hFQ0soIDAsIGZkX2Rpc3BfcmVnaXN0ZXIoIGNiXzksIERJU1BfSE9XX0FQUElELCAmd2hlbiwgTlVMTCwgJmhkbFs1XSApICk7CisJCW1lbXNldChjYmNhbGxlZCwgMCwgc2l6ZW9mKGNiY2FsbGVkKSk7CisJCW1zZyA9IG5ld19tc2coIDIsIGNtZDIsIGF2cDEsIGF2cDIsIDIgKTsKKwkJQ0hFQ0soIDAsIGZkX21zZ19kaXNwYXRjaCAoICZtc2csIHNlc3MsICZhY3Rpb24sICZlYywgJmVtLCAmZXJyb3IgKSApOworCQlDSEVDSyggMSwgY2JjYWxsZWRbMF0gKTsKKwkJQ0hFQ0soIDEsIGNiY2FsbGVkWzFdICk7CisJCUNIRUNLKCAxLCBjYmNhbGxlZFsyXSApOworCQlDSEVDSyggMSwgY2JjYWxsZWRbM10gKTsKKwkJQ0hFQ0soIDEsIGNiY2FsbGVkWzRdICk7CisJCUNIRUNLKCAxLCBjYmNhbGxlZFs5XSApOworCQlDSEVDSyggMCwgZmRfbXNnX2ZyZWUoIG1zZyApICk7CisJCUNIRUNLKCAwLCBmZF9kaXNwX3VucmVnaXN0ZXIoICZoZGxbNV0sIE5VTEwgKSApOworCQkKKwkJQ0hFQ0soIDAsIGZkX2Rpc3BfdW5yZWdpc3RlciggJmhkbFswXSwgTlVMTCApICk7CisJCUNIRUNLKCAwLCBmZF9kaXNwX3VucmVnaXN0ZXIoICZoZGxbMV0sIE5VTEwgKSApOworCQlDSEVDSyggMCwgZmRfZGlzcF91bnJlZ2lzdGVyKCAmaGRsWzJdLCBOVUxMICkgKTsKKwkJQ0hFQ0soIDAsIGZkX2Rpc3BfdW5yZWdpc3RlciggJmhkbFszXSwgTlVMTCApICk7CisJCUNIRUNLKCAwLCBmZF9kaXNwX3VucmVnaXN0ZXIoICZoZGxbNF0sIE5VTEwgKSApOworCX0JCQkKKwkKKwkvKiBUZXN0IGFwcGxpY2F0aW9uIHN1cHBvcnQgYWR2ZXJ0aXNlbWVudCAqLworCXsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogdm5kOworCQlzdHJ1Y3QgZGljdF92ZW5kb3JfZGF0YSB2bmRfZGF0YSA9IHsgMSwgIlZlbmRvciB0ZXN0IiB9OworCQlzdHJ1Y3QgZmRfYXBwICogYXBwOworCQkKKwkJQ0hFQ0soIDAsIGZkX2RpY3RfbmV3ICggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1ZFTkRPUiwgJnZuZF9kYXRhLCBOVUxMLCAmdm5kICkgKTsKKwkJCisJCUNIRUNLKCBFSU5WQUwsIGZkX2Rpc3BfYXBwX3N1cHBvcnQgKCB2bmQsIE5VTEwsIDEsIDAgKSApOworCQlDSEVDSyggRUlOVkFMLCBmZF9kaXNwX2FwcF9zdXBwb3J0ICggYXBwMSwgTlVMTCwgMCwgMCApICk7CisJCUNIRUNLKCAwLCBmZF9kaXNwX2FwcF9zdXBwb3J0ICggYXBwMSwgTlVMTCwgMSwgMCApICk7CisJCUNIRUNLKCAwLCBmZF9kaXNwX2FwcF9zdXBwb3J0ICggYXBwMSwgTlVMTCwgMCwgMSApICk7CisJCUNIRUNLKCAwLCBmZF9kaXNwX2FwcF9zdXBwb3J0ICggYXBwMiwgdm5kLCAxLCAwICkgKTsKKwkJCisJCWFwcCA9IChzdHJ1Y3QgZmRfYXBwICopKGZkX2dfY29uZmlnLT5jbmZfYXBwcy5uZXh0KTsKKwkJQ0hFQ0soIDEsIGFwcC0+YXBwaWQgKTsKKwkJQ0hFQ0soIDEsIGFwcC0+ZmxhZ3MuYXV0aCApOworCQlDSEVDSyggMSwgYXBwLT5mbGFncy5hY2N0ICk7CisJCWFwcCA9IChzdHJ1Y3QgZmRfYXBwICopKGZkX2dfY29uZmlnLT5jbmZfYXBwcy5wcmV2KTsKKwkJQ0hFQ0soIDIsIGFwcC0+YXBwaWQgKTsKKwkJQ0hFQ0soIDEsIGFwcC0+ZmxhZ3MuYXV0aCApOworCQlDSEVDSyggMCwgYXBwLT5mbGFncy5hY2N0ICk7CisJCQorCQkjaWYgMAorCQlmZF9sb2dfZGVidWcoIiVzIiwgZmRfY29uZl9kdW1wKEZEX0RVTVBfVEVTVF9QQVJBTVMpKTsKKwkJI2VuZGlmCisJfQorCQorCS8qIFRlc3Qgb3BhcXVlIHBvaW50ZXIgbWFuYWdlbWVudCAqLworCXsKKwkJdm9pZCAqIHB0cjsKKwkJQ0hFQ0soIDAsIGZkX2Rpc3BfcmVnaXN0ZXIoIGNiXzAsIERJU1BfSE9XX0FOWSwgTlVMTCwgZ19vcGFxdWUsICZoZGxbMF0gKSApOworCQorCQkvKiBDaGVjayB0aGlzIGhhbmRsZXIgaXMgY2FsbGVkIGZvciBhIG1lc3NhZ2UgKi8KKwkJbXNnID0gbmV3X21zZyggMCwgY21kMSwgYXZwMSwgTlVMTCwgMCApOworCQltZW1zZXQoY2JjYWxsZWQsIDAsIHNpemVvZihjYmNhbGxlZCkpOworCQlDSEVDSyggMCwgZmRfbXNnX2Rpc3BhdGNoICggJm1zZywgc2VzcywgJmFjdGlvbiwgJmVjLCAmZW0sICZlcnJvciApICk7CisJCUNIRUNLKCAxLCBjYmNhbGxlZFswXSApOworCQlDSEVDSyggRElTUF9BQ1RfQ09OVCwgYWN0aW9uICk7CisJCQorCQkvKiBEZWxldGUgdGhlIG1lc3NhZ2UgKi8KKwkJQ0hFQ0soIDAsIGZkX21zZ19mcmVlKCBtc2cgKSApOworCQlDSEVDSyggMCwgZmRfZGlzcF91bnJlZ2lzdGVyKCAmaGRsWzBdLCAmcHRyICkgKTsKKwkJQ0hFQ0soIDEsIHB0ciA9PSBnX29wYXF1ZSA/IDEgOiAwICk7CisJfQorCQorCS8qIFRoYXQncyBhbGwgZm9yIHRoZSB0ZXN0cyB5ZXQgKi8KKwlQQVNTVEVTVCgpOworfSAKKwkKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RmaWZvLmMgYi90ZXN0cy90ZXN0Zmlmby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYzdjZjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0Zmlmby5jCkBAIC0wLDAgKzEsNTc5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxMywgV0lERSBQcm9qZWN0IGFuZCBOSUNUCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBXSURFIFByb2plY3Qgb3IgTklDVCBub3IgdGhlIAkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFdJREUgUHJvamVjdCBhbmQgCQkJCQkJICoKKyogICBOSUNULgkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJ0ZXN0cy5oIgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorCisvKiBXcmFwcGVyIGZvciBwdGhyZWFkX2JhcnJpZXIgc3R1ZmYgb24gTWFjIE9TIFggKi8KKyNpZm5kZWYgSEFWRV9QVEhSRUFEX0JBUgorCisjZGVmaW5lIFBUSFJFQURfQkFSUklFUl9TRVJJQUxfVEhSRUFEIDEKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgY291bnQ7CisJaW50IGVudGVyZWQ7CisJaW50IHNlcmlhbDsKKwlwdGhyZWFkX211dGV4X3QgbXV0ZXg7CisJcHRocmVhZF9jb25kX3QgY29uZDsKK30gcHRocmVhZF9iYXJyaWVyX3Q7CisKK2ludCBwdGhyZWFkX2JhcnJpZXJfaW5pdChwdGhyZWFkX2JhcnJpZXJfdCAqIGJhcnJpZXIsIGludCAqIGJhcnJpZXJfYXR0ciwgaW50IGNvdW50KQoreworCW1lbXNldChiYXJyaWVyLCAwLCBzaXplb2YocHRocmVhZF9iYXJyaWVyX3QpKTsKKwliYXJyaWVyLT5jb3VudCA9IGNvdW50OworCXB0aHJlYWRfbXV0ZXhfaW5pdCgmYmFycmllci0+bXV0ZXgsIE5VTEwpOworCXB0aHJlYWRfY29uZF9pbml0KCZiYXJyaWVyLT5jb25kLCBOVUxMKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHB0aHJlYWRfYmFycmllcl9kZXN0cm95KHB0aHJlYWRfYmFycmllcl90ICogYmFycmllcikKK3sKKwlwdGhyZWFkX211dGV4X2Rlc3Ryb3koJmJhcnJpZXItPm11dGV4KTsKKwlwdGhyZWFkX2NvbmRfZGVzdHJveSgmYmFycmllci0+Y29uZCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBwdGhyZWFkX2JhcnJpZXJfd2FpdChwdGhyZWFkX2JhcnJpZXJfdCAqIGJhcnJpZXIpCit7CisJaW50IHJldCA9IDA7CisJaW50IHNlcmlhbDsKKwlwdGhyZWFkX211dGV4X2xvY2soJmJhcnJpZXItPm11dGV4KTsKKwlzZXJpYWwgPSBiYXJyaWVyLT5zZXJpYWw7CisJCisJLyogZmlyc3QgdGhyZWFkIGdldHMgdGhlIHNwZWNpYWwgdmFsdWUgKi8KKwlpZiAoYmFycmllci0+ZW50ZXJlZCsrID09IDApIAorCQlyZXQgPSBQVEhSRUFEX0JBUlJJRVJfU0VSSUFMX1RIUkVBRDsKKwkKKwkvKiBDb3VudCB3YXMgYWNoaWV2ZWQ/ICovCisJaWYgKGJhcnJpZXItPmVudGVyZWQgPT0gYmFycmllci0+Y291bnQpIHsKKwkJLyogT2ssIGluY3JlYXNlIHNlcmlhbCwgcmVzZXQgbnVtYmVyIG9mIHRocmVhZHMsIGFuZCBzaWduYWwgZXZlcnlvbmUgKi8KKwkJYmFycmllci0+ZW50ZXJlZCA9IDA7CisJCWJhcnJpZXItPnNlcmlhbCsrOworCQlwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KCZiYXJyaWVyLT5jb25kKTsKKwl9IGVsc2UgeworCQlkbyB7CisJCQlwdGhyZWFkX2NvbmRfd2FpdCgmYmFycmllci0+Y29uZCwgJmJhcnJpZXItPm11dGV4KTsKKwkJfSB3aGlsZSAoYmFycmllci0+c2VyaWFsID09IHNlcmlhbCk7CisJCS8qIHRoaXMgcHJvdGVjdHMgYWdhaW5zdCBzcHVyaW91cyB3YWtlcyAqLworCX0KKwlwdGhyZWFkX211dGV4X3VubG9jaygmYmFycmllci0+bXV0ZXgpOworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogSEFWRV9QVEhSRUFEX0JBUiAqLworCisvKiBTdHJ1Y3R1cmUgZm9yIHRlc3RpbmcgdGhyZXNob2xkIGZ1bmN0aW9uICovCitzdGF0aWMgc3RydWN0IHRocmhfdGVzdCB7CisJc3RydWN0IGZpZm8gKiAgIHF1ZXVlOyAvKiBwb2ludGVyIHRvIHRoZSBxdWV1ZSAqLworCWludAkJaF9jYWxsczsgLyogbnVtYmVyIG9mIGNhbGxzIG9mIGhfY2IgKi8KKwlpbnQJCWxfY2FsbHM7IC8qIG51bWJlciBvZiBjYWxscyBvZiBsX2NiICovCit9IHRocmhfdGQ7CisKKy8qIENhbGxiYWNrcyBmb3IgdGhyZWFzaG9sZHMgdGVzdCAqLwordm9pZCB0aHJoX2NiX2goc3RydWN0IGZpZm8gKnF1ZXVlLCB2b2lkICoqZGF0YSkKK3sKKwlpZiAodGhyaF90ZC5oX2NhbGxzID09IHRocmhfdGQubF9jYWxscykgeworCQlDSEVDSyggTlVMTCwgKmRhdGEgKTsKKwkJKmRhdGEgPSAmdGhyaF90ZDsKKwl9IGVsc2UgeworCQlDSEVDSyggKmRhdGEsICZ0aHJoX3RkICk7CisJfQorCUNIRUNLKCBxdWV1ZSwgdGhyaF90ZC5xdWV1ZSApOworCQorCS8qIFVwZGF0ZSB0aGUgY291bnQgKi8KKwl0aHJoX3RkLmhfY2FsbHMgKys7Cit9Cit2b2lkIHRocmhfY2JfbChzdHJ1Y3QgZmlmbyAqcXVldWUsIHZvaWQgKipkYXRhKQoreworCUNIRUNLKCAxLCBkYXRhID8gMSA6IDAgKTsKKwlDSEVDSyggKmRhdGEsICZ0aHJoX3RkICk7CisKKwkvKiBDaGVjayB0aGUgcXVldWUgcGFyYW1ldGVyIGlzIGNvcnJlY3QgKi8KKwlDSEVDSyggcXVldWUsIHRocmhfdGQucXVldWUgKTsKKwkKKwkvKiBVcGRhdGUgdGhlIGNvdW50ICovCisJdGhyaF90ZC5sX2NhbGxzICsrOworCS8qIENsZWFudXAgdGhlIGRhdGEgcHRyIGlmIG5lZWRlZCAqLworCWlmICh0aHJoX3RkLmxfY2FsbHMgPT0gdGhyaF90ZC5oX2NhbGxzKQorCQkqZGF0YSA9IE5VTEw7CisJLyogZG9uZSAqLworfQorCisKKy8qIFN0cnVjdHVyZSB0aGF0IGlzIHBhc3NlZCB0byB0aGUgdGVzdCBmdW5jdGlvbiAqLworc3RydWN0IHRlc3RfZGF0YSB7CisJc3RydWN0IGZpZm8gICAgICogcXVldWU7IC8qIHBvaW50ZXIgdG8gdGhlIHF1ZXVlICovCisJcHRocmVhZF9iYXJyaWVyX3QgKiBiYXI7ICAgLyogaWYgbm90IE5VTEwsIGJhcnJpZXIgdG8gc3luY2hyb25pemUgYmVmb3JlIGdldHRpbmcgbWVzc2FnZXMgKi8KKwlzdHJ1Y3QgdGltZXNwZWMgICAqIHRzOwkgICAvKiBpZiBub3QgTlVMTCwgdXNlIGEgdGltZWRnZXQgaW5zdGVhZCBvZiBhIGdldCAqLworCWludAkJICAgIG5icjsgICAvKiBudW1iZXIgb2YgbWVzc2FnZXMgdG8gcmV0cmlldmUgZnJvbSB0aGUgcXVldWUgKi8KK307CisKKy8qIFRoZSB0ZXN0IGZ1bmN0aW9uLCB0byBiZSB0aHJlYWRlZCAqLworc3RhdGljIHZvaWQgKiB0ZXN0X2ZjdCh2b2lkICogZGF0YSkKK3sKKwlpbnQgcmV0ID0gMCwgaTsKKwlzdHJ1Y3QgbXNnICogbXNnID0gTlVMTDsKKwlzdHJ1Y3QgdGVzdF9kYXRhICogdGQgPSAoc3RydWN0IHRlc3RfZGF0YSAqKSBkYXRhOworCQorCWlmICh0ZC0+YmFyICE9IE5VTEwpIHsKKwkJcmV0ID0gcHRocmVhZF9iYXJyaWVyX3dhaXQodGQtPmJhcik7CisJCWlmIChyZXQgIT0gUFRIUkVBRF9CQVJSSUVSX1NFUklBTF9USFJFQUQpIHsKKwkJCUNIRUNLKCAwLCByZXQpOworCQl9IGVsc2UgeworCQkJQ0hFQ0soIFBUSFJFQURfQkFSUklFUl9TRVJJQUxfVEhSRUFELCByZXQpOyAvKiBqdXN0IGZvciB0aGUgdHJhY2VzICovCisJCX0KKwl9CisJCisJZm9yIChpPTA7IGk8IHRkLT5uYnI7IGkrKykgeworCQlpZiAodGQtPnRzICE9IE5VTEwpIHsKKwkJCUNIRUNLKCAwLCBmZF9maWZvX3RpbWVkZ2V0KHRkLT5xdWV1ZSwgJm1zZywgdGQtPnRzKSApOworCQl9IGVsc2UgeworCQkJQ0hFQ0soIDAsIGZkX2ZpZm9fZ2V0KHRkLT5xdWV1ZSwgJm1zZykgKTsKKwkJfQorCX0KKwkKKwlyZXR1cm4gTlVMTDsKK30KKworLyogVGhlIHRlc3QgZnVuY3Rpb24sIHRvIGJlIHRocmVhZGVkICovCitzdGF0aWMgaW50IGl0ZXIgID0gMDsKK3N0YXRpYyB2b2lkICogdGVzdF9mY3QyKHZvaWQgKiBkYXRhKQoreworCWludCBpOworCWludCAqIGl0ZW07CisJc3RydWN0IHRlc3RfZGF0YSAqIHRkID0gKHN0cnVjdCB0ZXN0X2RhdGEgKikgZGF0YTsKKwkKKwlmb3IgKGk9MDsgaTwgdGQtPm5icjsgaSsrKSB7CisJCWl0ZW0gPSBtYWxsb2Moc2l6ZW9mKGludCkpOworCQlDSEVDSyggMSwgaXRlbSA/IDEgOiAwICk7CisJCSppdGVtID0gaTsKKwkJQ0hFQ0soIDAsIGZkX2ZpZm9fcG9zdCh0ZC0+cXVldWUsICZpdGVtKSApOworCQlpdGVyKys7CisJfQorCQorCXJldHVybiBOVUxMOworfQorCisKKy8qIE1haW4gdGVzdCByb3V0aW5lICovCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCXN0cnVjdCB0aW1lc3BlYyB0czsKKwkKKwlzdHJ1Y3QgbXNnICogbXNnMSA9IE5VTEw7CisJc3RydWN0IG1zZyAqIG1zZzIgPSBOVUxMOworCXN0cnVjdCBtc2cgKiBtc2czID0gTlVMTDsKKwkKKwkvKiBGaXJzdCwgaW5pdGlhbGl6ZSB0aGUgZGFlbW9uIG1vZHVsZXMgKi8KKwlJTklUX0ZEKCk7CisJCisJLyogUHJvbG9nOiBjcmVhdGUgdGhlIG1lc3NhZ2VzICovCisJeworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBhY3JfbW9kZWwgPSBOVUxMOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBjZXJfbW9kZWwgPSBOVUxMOworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBkd3JfbW9kZWwgPSBOVUxMOworCisJCUNIRUNLKCAwLCBmZF9kaWN0X3NlYXJjaCAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIkFjY291bnRpbmctUmVxdWVzdCIsIAkJCSZhY3JfbW9kZWwsIEVOT0VOVCApICk7CisJCUNIRUNLKCAwLCBmZF9kaWN0X3NlYXJjaCAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIkNhcGFiaWxpdGllcy1FeGNoYW5nZS1SZXF1ZXN0IiwgCSZjZXJfbW9kZWwsIEVOT0VOVCApICk7CisJCUNIRUNLKCAwLCBmZF9kaWN0X3NlYXJjaCAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIkRldmljZS1XYXRjaGRvZy1SZXF1ZXN0IiwJCSZkd3JfbW9kZWwsIEVOT0VOVCApICk7CisJCUNIRUNLKCAwLCBmZF9tc2dfbmV3ICggYWNyX21vZGVsLCAwLCAmbXNnMSApICk7CisJCUNIRUNLKCAwLCBmZF9tc2dfbmV3ICggY2VyX21vZGVsLCAwLCAmbXNnMiApICk7CisJCUNIRUNLKCAwLCBmZF9tc2dfbmV3ICggZHdyX21vZGVsLCAwLCAmbXNnMyApICk7CisJfQorCQorCS8qIEJhc2ljIG9wZXJhdGlvbiAqLworCXsKKwkJc3RydWN0IGZpZm8gKiBxdWV1ZSA9IE5VTEw7CisJCXN0cnVjdCBtc2cgKiBtc2cgID0gTlVMTDsKKwkJaW50IG1heDsKKwkJbG9uZyBsb25nIGNvdW50OworCQkKKwkJLyogQ3JlYXRlIHRoZSBxdWV1ZSAqLworCQlDSEVDSyggMCwgZmRfZmlmb19uZXcoJnF1ZXVlLCAwKSApOworCQkKKwkJLyogQ2hlY2sgdGhlIGNvdW50IGlzIDAgKi8KKwkJQ0hFQ0soIDAsIGZkX2ZpZm9fbGVuZ3RoKHF1ZXVlKSApOworCQkKKwkJLyogTm93IGVucXVldWUgKi8KKwkJbXNnID0gbXNnMTsKKwkJQ0hFQ0soIDAsIGZkX2ZpZm9fcG9zdChxdWV1ZSwgJm1zZykgKTsKKwkJbXNnID0gbXNnMjsKKwkJQ0hFQ0soIDAsIGZkX2ZpZm9fcG9zdChxdWV1ZSwgJm1zZykgKTsKKwkJbXNnID0gbXNnMzsKKwkJQ0hFQ0soIDAsIGZkX2ZpZm9fcG9zdChxdWV1ZSwgJm1zZykgKTsKKwkJCisJCS8qIENoZWNrIHRoZSBjb3VudCBpcyAzICovCisJCUNIRUNLKCAzLCBmZF9maWZvX2xlbmd0aChxdWV1ZSkgKTsKKwkJCisJCS8qIFJldHJpZXZlIHRoZSBmaXJzdCBtZXNzYWdlIHVzaW5nIGZkX2ZpZm9fZ2V0ICovCisJCUNIRUNLKCAwLCBmZF9maWZvX2dldChxdWV1ZSwgJm1zZykgKTsKKwkJQ0hFQ0soIG1zZzEsIG1zZyk7CisJCUNIRUNLKCAyLCBmZF9maWZvX2xlbmd0aChxdWV1ZSkgKTsKKwkJCisJCS8qIFJldHJpZXZlIHRoZSBzZWNvbmQgbWVzc2FnZSB1c2luZyBmZF9maWZvX3RpbWVkZ2V0ICovCisJCUNIRUNLKDAsIGNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZ0cykpOworCQl0cy50dl9zZWMgKz0gMTsgLyogU2V0IHRoZSB0aW1lb3V0IHRvIDEgc2Vjb25kICovCisJCUNIRUNLKCAwLCBmZF9maWZvX3RpbWVkZ2V0KHF1ZXVlLCAmbXNnLCAmdHMpICk7CisJCUNIRUNLKCBtc2cyLCBtc2cpOworCQlDSEVDSyggMSwgZmRfZmlmb19sZW5ndGgocXVldWUpICk7CisJCQorCQkvKiBSZXRyaWV2ZSB0aGUgdGhpcmQgbWVzc2FnZSB1c2luZyBtZXFfdHJ5Z2V0ICovCisJCUNIRUNLKCAwLCBmZF9maWZvX3RyeWdldChxdWV1ZSwgJm1zZykgKTsKKwkJQ0hFQ0soIG1zZzMsIG1zZyk7CisJCUNIRUNLKCAwLCBmZF9maWZvX2xlbmd0aChxdWV1ZSkgKTsKKwkJCisJCS8qIENoZWNrIHRoYXQgYW5vdGhlciBtZXFfdHJ5Z2V0IGRvZXMgbm90IGJsb2NrICovCisJCUNIRUNLKCBFV09VTERCTE9DSywgZmRfZmlmb190cnlnZXQocXVldWUsICZtc2cpICk7CisJCUNIRUNLKCAwLCBmZF9maWZvX2xlbmd0aChxdWV1ZSkgKTsKKwkJCisJCS8qIENoZWNrIHRoZSB0aW1lZGdldCBhY3R1YWxseSB0aW1lc291dCAqLworCQlDSEVDSygwLCBjbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmdHMpKTsKKwkJdHMudHZfbnNlYyArPSAxMDAwMDAwOyAvKiAxIG1pbGxpc2Vjb25kICovCisJCWlmICh0cy50dl9uc2VjID49IDEwMDAwMDAwMDBMKSB7CisJCQl0cy50dl9uc2VjIC09IDEwMDAwMDAwMDBMOworCQkJdHMudHZfc2VjICs9IDE7CisJCX0KKwkJQ0hFQ0soIEVUSU1FRE9VVCwgZmRfZmlmb190aW1lZGdldChxdWV1ZSwgJm1zZywgJnRzKSApOworCQlDSEVDSyggMCwgZmRfZmlmb19sZW5ndGgocXVldWUpICk7CisJCQorCQkvKiBQb3N0ICYgZ2V0IGFub3RoZXIgbWVzc2FnZSAqLworCQltc2cgPSBtc2cxOworCQlDSEVDSyggMCwgZmRfZmlmb19wb3N0KHF1ZXVlLCAmbXNnKSApOworCQlDSEVDSyggMCwgZmRfZmlmb190aW1lZGdldChxdWV1ZSwgJm1zZywgJnRzKSApOworCQlDSEVDSyggbXNnMSwgbXNnKTsJCQorCQkKKwkJLyogQ2hlY2sgc29tZSBzdGF0aXN0aWNzICovCisJCUNIRUNLKCAwLCBmZF9maWZvX2dldHN0YXRzKHF1ZXVlLCBOVUxMLCBOVUxMLCAmbWF4LCAmY291bnQsIE5VTEwsIE5VTEwsIE5VTEwpICk7CisJCUNIRUNLKCAzLCBtYXggKTsKKwkJQ0hFQ0soIDQsIGNvdW50ICk7CQorCQkKKwkJLyogV2UncmUgZG9uZSBmb3IgYmFzaWMgdGVzdHMgKi8KKwkJQ0hFQ0soIDAsIGZkX2ZpZm9fZGVsKCZxdWV1ZSkgKTsKKwl9CisJCisJLyogVGVzdCByb2J1c3RuZXNzLCBlbnN1cmUgbm8gbWVzc2FnZXMgYXJlIGxvc3QgKi8KKwl7CisjZGVmaW5lIE5CUl9NU0cJCTIwMAorI2RlZmluZSBOQlJfVEhSRUFEUwk2MAorCQlzdHJ1Y3QgZmlmbyAgCQkqcXVldWUgPSBOVUxMOworCQlwdGhyZWFkX2JhcnJpZXJfdAkgYmFyOworCQlzdHJ1Y3QgdGVzdF9kYXRhCSB0ZF8xOworCQlzdHJ1Y3QgdGVzdF9kYXRhCSB0ZF8yOworCQlzdHJ1Y3QgbXNnICAgCQkqbXNnc1tOQlJfTVNHICogTkJSX1RIUkVBRFMgKiAyXSwgKm1zZzsKKwkJcHRocmVhZF90ICAJCSB0aHIgW05CUl9USFJFQURTICogMl07CisJCXN0cnVjdCBkaWN0X29iamVjdAkqZHdyX21vZGVsID0gTlVMTDsKKwkJaW50CQkJIGk7CisJCWludAkJCSBuYnJfdGhyZWFkczsKKyNpZmRlZiBfUE9TSVhfVEhSRUFEX1RIUkVBRFNfTUFYCisJCW5icl90aHJlYWRzID0gX1BPU0lYX1RIUkVBRF9USFJFQURTX01BWDsKKyNlbHNlIC8qIF9QT1NJWF9USFJFQURfVEhSRUFEU19NQVggKi8KKwkJbmJyX3RocmVhZHMgPSBzeXNjb25mKF9TQ19USFJFQURfVEhSRUFEU19NQVgpOworI2VuZGlmIC8qIF9QT1NJWF9USFJFQURfVEhSRUFEU19NQVggKi8KKwkJaWYgKChuYnJfdGhyZWFkcyA8PSAwKSB8fCAobmJyX3RocmVhZHMgPiBOQlJfVEhSRUFEUyAqIDIpKSB7CisJCQluYnJfdGhyZWFkcyA9IE5CUl9USFJFQURTOworCQl9IGVsc2UgeworCQkJVFJBQ0VfREVCVUcoSU5GTywgIkxvY2FsIGxpbWl0IG9uIG51bWJlciBvZiB0aHJlYWRzOiAlZCIsIG5icl90aHJlYWRzKTsKKwkJCS8qIFRoZSBsb2NhbCBsaW1pdCBpcyBiZWxvdyBOQlJfVEhSRUFEUyAqLworCQkJbmJyX3RocmVhZHMgPSAobmJyX3RocmVhZHMgLyAyKSAtIDE7CisJCQkvKiBFbnN1cmUgd2UgY3JlYXRlIGF0IGxlYXN0IGEgZmV3IHRocmVhZHMhICovCisJCQlDSEVDSyggMSwgbmJyX3RocmVhZHMgPj0gMTAgPyAxIDogMCApOworCQl9CisJCQorCQkvKiBDcmVhdGUgdGhlIHF1ZXVlICovCisJCUNIRUNLKCAwLCBmZF9maWZvX25ldygmcXVldWUsIDApICk7CisJCQorCQkvKiBDcmVhdGUgdGhlIGJhcnJpZXIgKi8KKwkJQ0hFQ0soIDAsIHB0aHJlYWRfYmFycmllcl9pbml0KCZiYXIsIE5VTEwsIG5icl90aHJlYWRzICogMiArIDEpICk7CisJCQorCQkvKiBJbml0aWFsaXplIHRoZSB0cyAqLworCQlDSEVDSygwLCBjbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmdHMpKTsKKwkJdHMudHZfc2VjICs9IDIwOyAvKiBTZXQgdGhlIHRpbWVvdXQgdG8gMjAgc2Vjb25kICovCisJCQorCQkvKiBDcmVhdGUgdGhlIG1lc3NhZ2VzICovCisJCUNIRUNLKCAwLCBmZF9kaWN0X3NlYXJjaCAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIkRldmljZS1XYXRjaGRvZy1SZXF1ZXN0IiwJCSZkd3JfbW9kZWwsIEVOT0VOVCApICk7CisJCWZvciAoaSA9IDA7IGkgPCBOQlJfTVNHICogbmJyX3RocmVhZHMgKiAyOyBpKyspIHsKKwkJCUNIRUNLKCAwLCBmZF9tc2dfbmV3ICggZHdyX21vZGVsLCAwLCAmbXNnc1tpXSApICk7CisJCX0KKwkJCisJCS8qIEluaXRpYWxpemUgdGhlIHRlc3QgZGF0YSBzdHJ1Y3R1cmVzICovCisJCXRkXzEucXVldWUgPSBxdWV1ZTsKKwkJdGRfMS5iYXIgPSAmYmFyOworCQl0ZF8xLnRzICA9ICZ0czsKKwkJdGRfMS5uYnIgPSBOQlJfTVNHOworCQl0ZF8yLnF1ZXVlID0gcXVldWU7CisJCXRkXzIuYmFyID0gJmJhcjsKKwkJdGRfMi50cyAgPSBOVUxMOworCQl0ZF8yLm5iciA9IE5CUl9NU0c7CisJCQorCQkvKiBDcmVhdGUgdGhlIHRocmVhZHMgKi8KKwkJZm9yIChpPTA7IGkgPCBuYnJfdGhyZWFkcyAqIDI7IGkrKykgeworCQkJQ0hFQ0soIDAsIHB0aHJlYWRfY3JlYXRlKCAmdGhyW2ldLCBOVUxMLCB0ZXN0X2ZjdCwgKGkgJiAxKSA/ICZ0ZF8xIDogJnRkXzIgKSApOworCQl9CisJCQorCQkvKiBTeW5jaHJvbml6ZSBldmVyeW9uZSAqLworCQl7CisJCQlpbnQgcmV0ID0gcHRocmVhZF9iYXJyaWVyX3dhaXQoJmJhcik7CisJCQlpZiAocmV0ICE9IFBUSFJFQURfQkFSUklFUl9TRVJJQUxfVEhSRUFEKSB7CisJCQkJQ0hFQ0soIDAsIHJldCk7CisJCQl9IGVsc2UgeworCQkJCUNIRUNLKCBQVEhSRUFEX0JBUlJJRVJfU0VSSUFMX1RIUkVBRCwgcmV0KTsgLyogZm9yIHRyYWNlIG9ubHkgKi8KKwkJCX0KKwkJfQorCQkKKwkJLyogTm93IHBvc3QgYWxsIHRoZSBtZXNzYWdlcyAqLworCQlmb3IgKGk9MDsgaSA8IE5CUl9NU0cgKiBuYnJfdGhyZWFkcyAqIDI7IGkrKykgeworCQkJbXNnID0gbXNnc1tpXTsKKwkJCUNIRUNLKCAwLCBmZF9maWZvX3Bvc3QocXVldWUsICZtc2cpICk7CisJCX0KKwkJCisJCS8qIEpvaW4gYWxsIHRocmVhZHMuIFRoaXMgYmxvY2tzIGlmIG1lc3NhZ2VzIGFyZSBsb3N0Li4uICovCisJCWZvciAoaT0wOyBpIDwgbmJyX3RocmVhZHMgKiAyOyBpKyspIHsKKwkJCUNIRUNLKCAwLCBwdGhyZWFkX2pvaW4oIHRocltpXSwgTlVMTCApICk7CisJCX0KKwkJCisJCS8qIENoZWNrIHRoZSBjb3VudCBvZiB0aGUgcXVldWUgaXMgYmFjayB0byAwICovCisJCUNIRUNLKCAwLCBmZF9maWZvX2xlbmd0aChxdWV1ZSkgKTsKKwkJCisJCS8qIERlc3Ryb3kgdGhpcyBxdWV1ZSBhbmQgdGhlIG1lc3NhZ2VzICovCisJCUNIRUNLKCAwLCBmZF9maWZvX2RlbCgmcXVldWUpICk7CisJCWZvciAoaT0wOyBpIDwgTkJSX01TRyAqIG5icl90aHJlYWRzICogMjsgaSsrKSB7CisJCQlDSEVDSyggMCwgZmRfbXNnX2ZyZWUoICBtc2dzW2ldICkgKTsKKwkJfQorCX0KKwkKKwkvKiBUZXN0IHRocmVhZCBjYW5jZWxhdGlvbiAqLworCXsKKwkJc3RydWN0IGZpZm8gICAgICAJKnF1ZXVlID0gTlVMTDsKKwkJcHRocmVhZF9iYXJyaWVyX3QJIGJhcjsKKwkJc3RydWN0IHRlc3RfZGF0YQkgdGQ7CisJCXB0aHJlYWRfdAkJIHRoOworCQkKKwkJLyogQ3JlYXRlIHRoZSBxdWV1ZSAqLworCQlDSEVDSyggMCwgZmRfZmlmb19uZXcoJnF1ZXVlLCAwKSApOworCQkKKwkJLyogQ3JlYXRlIHRoZSBiYXJyaWVyICovCisJCUNIRUNLKCAwLCBwdGhyZWFkX2JhcnJpZXJfaW5pdCgmYmFyLCBOVUxMLCAyKSApOworCQkKKwkJLyogSW5pdGlhbGl6ZSB0aGUgdHMgKi8KKwkJQ0hFQ0soMCwgY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJnRzKSk7CisJCXRzLnR2X3NlYyArPSAxMDsgLyogU2V0IHRoZSB0aW1lb3V0IHRvIDEwIHNlY29uZCAqLworCQkKKwkJLyogSW5pdGlhbGl6ZSB0aGUgdGVzdCBkYXRhIHN0cnVjdHVyZXMgKi8KKwkJdGQucXVldWUgPSBxdWV1ZTsKKwkJdGQuYmFyID0gJmJhcjsKKwkJdGQudHMgID0gJnRzOworCQl0ZC5uYnIgPSAxOworCQkKKwkJLyogQ3JlYXRlIHRoZSB0aHJlYWQgKi8KKwkJQ0hFQ0soIDAsIHB0aHJlYWRfY3JlYXRlKCAmdGgsIE5VTEwsIHRlc3RfZmN0LCAmdGQgKSApOworCQkKKwkJLyogV2FpdCBmb3IgdGhlIHRocmVhZCB0byBiZSBydW5uaW5nICovCisJCXsKKwkJCWludCByZXQgPSBwdGhyZWFkX2JhcnJpZXJfd2FpdCgmYmFyKTsKKwkJCWlmIChyZXQgIT0gUFRIUkVBRF9CQVJSSUVSX1NFUklBTF9USFJFQUQpIHsKKwkJCQlDSEVDSyggMCwgcmV0KTsKKwkJCX0gZWxzZSB7CisJCQkJQ0hFQ0soIFBUSFJFQURfQkFSUklFUl9TRVJJQUxfVEhSRUFELCByZXQgKTsKKwkJCX0KKwkJfQorCQkKKwkJLyogTm93IGNhbmNlbCB0aGUgdGhyZWFkICovCisJCUNIRUNLKCAwLCBwdGhyZWFkX2NhbmNlbCggdGggKSApOworCQkKKwkJLyogSm9pbiBpdCAqLworCQlDSEVDSyggMCwgcHRocmVhZF9qb2luKCB0aCwgTlVMTCApICk7CisJCQorCQkvKiBEbyB0aGUgc2FtZSB3aXRoIHRoZSBvdGhlciBmdW5jdGlvbiAqLworCQl0ZC50cyAgPSBOVUxMOworCQkKKwkJLyogQ3JlYXRlIHRoZSB0aHJlYWQgKi8KKwkJQ0hFQ0soIDAsIHB0aHJlYWRfY3JlYXRlKCAmdGgsIE5VTEwsIHRlc3RfZmN0LCAmdGQgKSApOworCQkKKwkJLyogV2FpdCBmb3IgdGhlIHRocmVhZCB0byBiZSBydW5uaW5nICovCisJCXsKKwkJCWludCByZXQgPSBwdGhyZWFkX2JhcnJpZXJfd2FpdCgmYmFyKTsKKwkJCWlmIChyZXQgIT0gUFRIUkVBRF9CQVJSSUVSX1NFUklBTF9USFJFQUQpIHsKKwkJCQlDSEVDSyggMCwgcmV0KTsKKwkJCX0gZWxzZSB7CisJCQkJQ0hFQ0soIFBUSFJFQURfQkFSUklFUl9TRVJJQUxfVEhSRUFELCByZXQgKTsKKwkJCX0KKwkJfQorCQkKKwkJLyogTm93IGNhbmNlbCB0aGUgdGhyZWFkICovCisJCUNIRUNLKCAwLCBwdGhyZWFkX2NhbmNlbCggdGggKSApOworCQkKKwkJLyogSm9pbiBpdCAqLworCQlDSEVDSyggMCwgcHRocmVhZF9qb2luKCB0aCwgTlVMTCApICk7CisJCQorCQkvKiBEZXN0cm95IHRoZSBxdWV1ZSAqLworCQlDSEVDSyggMCwgZmRfZmlmb19kZWwoJnF1ZXVlKSApOworCX0KKwkKKwkvKiBUZXN0IHRoZSB0aHJlYXNob2xkIGZ1bmN0aW9uICovCisJeworCQlzdHJ1Y3QgZmlmbyAqIHF1ZXVlID0gTlVMTDsKKwkJaW50IGk7CisJCXN0cnVjdCBtc2cgKiBtc2cgID0gTlVMTDsKKwkJCisJCS8qIENyZWF0ZSB0aGUgcXVldWUgKi8KKwkJQ0hFQ0soIDAsIGZkX2ZpZm9fbmV3KCZxdWV1ZSwgMCkgKTsKKwkJCisJCS8qIFByZXBhcmUgdGhlIHRlc3QgZGF0YSAqLworCQltZW1zZXQoJnRocmhfdGQsIDAsIHNpemVvZih0aHJoX3RkKSk7CisJCXRocmhfdGQucXVldWUgPSBxdWV1ZTsKKwkJCisJCS8qIFNldCB0aGUgdGhyZXNob2xkcyBmb3IgdGhlIHF1ZXVlICovCisJCUNIRUNLKCAwLCBmZF9maWZvX3NldHRocmhkICggcXVldWUsIE5VTEwsIDYsIHRocmhfY2JfaCwgNCwgdGhyaF9jYl9sICkgKTsKKwkJCisJCS8qIFBvc3QgNSBtZXNzYWdlcywgbm8gY2IgbXVzdCBiZSBjYWxsZWQuICovCisJCWZvciAoaT0wOyBpPDU7IGkrKykgeworCQkJbXNnID0gbXNnMTsKKwkJCUNIRUNLKCAwLCBmZF9maWZvX3Bvc3QocXVldWUsICZtc2cpICk7CisJCX0gLyogNSBtc2cgaW4gcXVldWUgKi8KKwkJQ0hFQ0soIDAsIHRocmhfdGQuaF9jYWxscyApOworCQlDSEVDSyggMCwgdGhyaF90ZC5sX2NhbGxzICk7CisJCQorCQkvKiBHZXQgYWxsIHRoZXNlIG1lc3NhZ2VzLCBhbmQgY2hlY2sgYWdhaW4gKi8KKwkJZm9yIChpPTA7IGk8NTsgaSsrKSB7CisJCQlDSEVDSyggMCwgZmRfZmlmb19nZXQocXVldWUsICZtc2cpICk7CisJCX0gLyogMCBtc2cgaW4gcXVldWUgKi8KKwkJQ0hFQ0soIDAsIHRocmhfdGQuaF9jYWxscyApOworCQlDSEVDSyggMCwgdGhyaF90ZC5sX2NhbGxzICk7CisJCQorCQkvKiBOb3csIHBvc3QgNiBtZXNzYWdlcywgdGhlIGhpZ2ggdGhyZWFzaG9sZCAqLworCQlmb3IgKGk9MDsgaTw2OyBpKyspIHsKKwkJCW1zZyA9IG1zZzE7CisJCQlDSEVDSyggMCwgZmRfZmlmb19wb3N0KHF1ZXVlLCAmbXNnKSApOworCQl9IC8qIDYgbXNnIGluIHF1ZXVlICovCisJCUNIRUNLKCAxLCB0aHJoX3RkLmhfY2FsbHMgKTsKKwkJQ0hFQ0soIDAsIHRocmhfdGQubF9jYWxscyApOworCQkKKwkJLyogUmVtb3ZlIDIgbWVzc2FnZXMsIHRvIHJlYWNoIHRoZSBsb3cgdGhyZXNob2xkICovCisJCWZvciAoaT0wOyBpPDI7IGkrKykgeworCQkJQ0hFQ0soIDAsIGZkX2ZpZm9fZ2V0KHF1ZXVlLCAmbXNnKSApOworCQl9IC8qIDQgbXNnIGluIHF1ZXVlICovCisJCUNIRUNLKCAxLCB0aHJoX3RkLmhfY2FsbHMgKTsKKwkJQ0hFQ0soIDEsIHRocmhfdGQubF9jYWxscyApOworCQkKKwkJLyogQ29tZSBhZ2FpbiBhdCB0aGUgaGlnaCB0aHJlc2hvbGQgKi8KKwkJZm9yIChpPTA7IGk8MjsgaSsrKSB7CisJCQltc2cgPSBtc2cxOworCQkJQ0hFQ0soIDAsIGZkX2ZpZm9fcG9zdChxdWV1ZSwgJm1zZykgKTsKKwkJfSAvKiA2IG1zZyBpbiBxdWV1ZSAqLworCQlDSEVDSyggMiwgdGhyaF90ZC5oX2NhbGxzICk7CisJCUNIRUNLKCAxLCB0aHJoX3RkLmxfY2FsbHMgKTsKKwkJCisJCS8qIFN1cHBvc2UgdGhlIHF1ZXVlIGNvbnRpbnVlcyB0byBncm93ICovCisJCWZvciAoaT0wOyBpPDY7IGkrKykgeworCQkJbXNnID0gbXNnMTsKKwkJCUNIRUNLKCAwLCBmZF9maWZvX3Bvc3QocXVldWUsICZtc2cpICk7CisJCX0gLyogMTIgbXNnIGluIHF1ZXVlICovCisJCUNIRUNLKCAzLCB0aHJoX3RkLmhfY2FsbHMgKTsKKwkJQ0hFQ0soIDEsIHRocmhfdGQubF9jYWxscyApOworCQlmb3IgKGk9MDsgaTw1OyBpKyspIHsKKwkJCW1zZyA9IG1zZzE7CisJCQlDSEVDSyggMCwgZmRfZmlmb19wb3N0KHF1ZXVlLCAmbXNnKSApOworCQl9IC8qIDE3IG1zZyBpbiBxdWV1ZSAqLworCQlDSEVDSyggMywgdGhyaF90ZC5oX2NhbGxzICk7CisJCUNIRUNLKCAxLCB0aHJoX3RkLmxfY2FsbHMgKTsKKwkJCisJCS8qIE5vdyB0aGUgcXVldWUgZ29lcyBiYWNrIHRvIDAgbWVzc2FnZXMgKi8KKwkJZm9yIChpPTA7IGk8MTc7IGkrKykgeworCQkJQ0hFQ0soIDAsIGZkX2ZpZm9fZ2V0KHF1ZXVlLCAmbXNnKSApOworCQl9IC8qIDAgbXNnIGluIHF1ZXVlICovCisJCUNIRUNLKCAzLCB0aHJoX3RkLmhfY2FsbHMgKTsKKwkJQ0hFQ0soIDMsIHRocmhfdGQubF9jYWxscyApOworCQkKKwkJLyogV2UncmUgZG9uZSBmb3IgdGhpcyB0ZXN0ICovCisJCUNIRUNLKCAwLCBmZF9maWZvX2RlbCgmcXVldWUpICk7CisJfQorCQorCS8qIFRlc3QgbWF4IHF1ZXVlIGxpbWl0ICovCisJeworCQlzdHJ1Y3QgZmlmbyAgICAgIAkqcXVldWUgPSBOVUxMOworCQlzdHJ1Y3QgdGVzdF9kYXRhCSB0ZDsKKwkJcHRocmVhZF90CQkgdGg7CisJCWludCAqCQkJaXRlbSwgaTsKKwkJCisJCS8qIENyZWF0ZSB0aGUgcXVldWUgKi8KKwkJQ0hFQ0soIDAsIGZkX2ZpZm9fbmV3KCZxdWV1ZSwgMTApICk7CisJCQorCQkvKiBJbml0aWFsaXplIHRoZSB0ZXN0IGRhdGEgc3RydWN0dXJlcyAqLworCQl0ZC5xdWV1ZSA9IHF1ZXVlOworCQl0ZC5uYnIgPSAxNTsKKwkJCisJCUNIRUNLKCAwLCBwdGhyZWFkX2NyZWF0ZSggJnRoLCBOVUxMLCB0ZXN0X2ZjdDIsICZ0ZCApICk7CisJCQorCQl1c2xlZXAoMTAwMDAwKTsgLyogMTAwIG1pbGxpc2VjICovCisJCQorCQlDSEVDSyggMTAsIGl0ZXIgKTsKKwkJCisJCUNIRUNLKCAwLCBmZF9maWZvX3RyeWdldChxdWV1ZSwgJml0ZW0pICk7CisJCUNIRUNLKCAwLCAqaXRlbSk7CisJCWZyZWUoaXRlbSk7CisJCQorCQl1c2xlZXAoMTAwMDAwKTsgLyogMTAwIG1pbGxpc2VjICovCisJCQorCQlDSEVDSyggMTEsIGl0ZXIgKTsKKwkJCisJCWZvciAoaT0xOyBpPDQ7IGkrKykgeworCQkJQ0hFQ0soIDAsIGZkX2ZpZm9fZ2V0KHF1ZXVlLCAmaXRlbSkgKTsKKwkJCUNIRUNLKCBpLCAqaXRlbSk7CisJCQlmcmVlKGl0ZW0pOworCQl9CisJCQorCQl1c2xlZXAoMTAwMDAwKTsgLyogMTAwIG1pbGxpc2VjICovCisJCQorCQlDSEVDSyggMTQsIGl0ZXIgKTsKKwkJCisJCWZvciAoOyBpIDwgdGQubmJyOyBpKyspIHsKKwkJCUNIRUNLKCAwLCBmZF9maWZvX3RyeWdldChxdWV1ZSwgJml0ZW0pICk7CisJCQlDSEVDSyggaSwgKml0ZW0pOworCQkJZnJlZShpdGVtKTsKKwkJfQorCQkKKwkJQ0hFQ0soIDAsIHB0aHJlYWRfam9pbiggdGgsIE5VTEwgKSApOworCQlDSEVDSyggMTUsIGl0ZXIgKTsKKwkJCisJfQorCQorCS8qIERlbGV0ZSB0aGUgbWVzc2FnZXMgKi8KKwlDSEVDSyggMCwgZmRfbXNnX2ZyZWUoIG1zZzEgKSApOworCUNIRUNLKCAwLCBmZF9tc2dfZnJlZSggbXNnMiApICk7CisJQ0hFQ0soIDAsIGZkX21zZ19mcmVlKCBtc2czICkgKTsKKworCS8qIFRoYXQncyBhbGwgZm9yIHRoZSB0ZXN0cyB5ZXQgKi8KKwlQQVNTVEVTVCgpOworfSAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3Rsb2FkZXh0LmMgYi90ZXN0cy90ZXN0bG9hZGV4dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MjczN2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0bG9hZGV4dC5jCkBAIC0wLDAgKzEsMTAwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxMSwgV0lERSBQcm9qZWN0IGFuZCBOSUNUCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBXSURFIFByb2plY3Qgb3IgTklDVCBub3IgdGhlIAkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFdJREUgUHJvamVjdCBhbmQgCQkJCQkJICoKKyogICBOSUNULgkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCisjaWZuZGVmIEJVSUxEX0RJUgorI2Vycm9yICJNaXNzaW5nIEJVSUxEX0RJUiBpbmZvcm1hdGlvbiIKKyNlbmRpZiAvKiBCVUlMRF9ESVIgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPGxpYmdlbi5oPgorI2luY2x1ZGUgPGRsZmNuLmg+CisKKy8qIE1haW4gdGVzdCByb3V0aW5lICovCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCURJUiAqZGlyOworCXN0cnVjdCBkaXJlbnQgKmRwOworCWNoYXIgZnVsbG5hbWVbNTEyXTsKKwlpbnQgcGF0aGxlbjsKKworCS8qIEZpcnN0LCBpbml0aWFsaXplIHRoZSBkYWVtb24gbW9kdWxlcyAqLworCUlOSVRfRkQoKTsKKwlDSEVDSyggMCwgZmRfcXVldWVzX2luaXQoKSAgKTsKKwlDSEVDSyggMCwgZmRfbXNnX2luaXQoKSAgKTsKKwlDSEVDSyggMCwgZmRfcnRkaXNwX2luaXQoKSAgKTsKKwkKKwkvKiBGaW5kIGFsbCBleHRlbnNpb25zIHdoaWNoIGhhdmUgYmVlbiBjb21waWxlZCBhbG9uZyB0aGUgdGVzdCAqLworCVRSQUNFX0RFQlVHKElORk8sICJMb2FkaW5nIGZyb206ICclcyciLCBCVUlMRF9ESVIgIi9leHRlbnNpb25zIik7CisJQ0hFQ0soIDAsIChkaXIgPSBvcGVuZGlyIChCVUlMRF9ESVIgIi9leHRlbnNpb25zIikpID09IE5VTEwgPyAxIDogMCApOworCXBhdGhsZW4gPSBzbnByaW50ZihmdWxsbmFtZSwgc2l6ZW9mKGZ1bGxuYW1lKSwgQlVJTERfRElSICIvZXh0ZW5zaW9ucy8iKTsKKwkKKwl3aGlsZSAoKGRwID0gcmVhZGRpciAoZGlyKSkgIT0gTlVMTCkgeworCQljaGFyICogZG90ID0gc3RycmNocihkcC0+ZF9uYW1lLCAnLicpOworCQlpZiAoZG90ICYmICEoc3RyY21wKGRvdCwgIi5mZHgiKSkpIHsKKwkJCS8qIFdlIGZvdW5kIGEgZmlsZSB3aXRoIG5hbWUgKi5mZHgsIGF0dGVtcHQgdG8gbG9hZCBpdCAqLworCQkJdm9pZCAqaGRsLCAqIGVwOworCQkJc25wcmludGYoZnVsbG5hbWUgKyBwYXRobGVuLCBzaXplb2YoZnVsbG5hbWUpIC0gcGF0aGxlbiwgIiVzIiwgZHAtPmRfbmFtZSk7CisJCQkKKwkJCVRSQUNFX0RFQlVHKElORk8sICJFeHRlbnNpb246ICclcyciLCBkcC0+ZF9uYW1lKTsKKwkJCQorCQkJLyogbG9hZCAqLworCQkJaGRsID0gZGxvcGVuKGZ1bGxuYW1lLCBSVExEX05PVyB8IFJUTERfR0xPQkFMKTsKKwkJCWlmICghaGRsKSB7CisJCQkJVFJBQ0VfREVCVUcoSU5GTywgIlVuYWJsZSB0byBsb2FkICclcyc6ICVzLiIsIGZ1bGxuYW1lLCBkbGVycm9yKCkpOworCQkJfQorCQkJQ0hFQ0soIDAsIGhkbCA9PSBOVUxMID8gMSA6IDAgKTsKKwkJCQorCQkJLyogcmVzb2x2ZSBlbnRyeSAqLworCQkJZXAgPSBkbHN5bSggaGRsLCAiZmRfZXh0X2luaXQiICk7CisJCQlpZiAoIWVwKSB7CisJCQkJVFJBQ0VfREVCVUcoSU5GTywgIk5vICdmZF9leHRfaW5pdCcgZW50cnkgcG9pbnQgaW4gJyVzJzogJXMuIiwgZnVsbG5hbWUsIGRsZXJyb3IoKSk7CisJCQl9CisJCQlDSEVDSyggMCwgZXAgPT0gTlVMTCA/IDEgOiAwICk7CisJCQkKKwkJCS8qIERvbmUsIG5vdyB1bmxvYWQgKi8KKyNpZm5kZWYgU0tJUF9ETENMT1NFCisJCQlDSEVDSyggMCwgZGxjbG9zZShoZGwpICk7CisjZW5kaWYgLyogU0tJUF9ETENMT1NFICovCisJCX0KKwl9CisJCisJQ0hFQ0soIDAsIGNsb3NlZGlyKGRpcikgKTsKKwkKKwlQQVNTVEVTVCgpOworfSAKKwkKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RtZXNnLmMgYi90ZXN0cy90ZXN0bWVzZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1MjVmZjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0bWVzZy5jCkBAIC0wLDAgKzEsMTQ1NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTUsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAidGVzdHMuaCIKKworLyogTWFpbiB0ZXN0IHJvdXRpbmUgKi8KK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJc3RydWN0IG1zZyAqIGFjciA9IE5VTEw7CisJc3RydWN0IGF2cCAqIHBpID0gTlVMTCwgKmF2cDEsICphdnAyOworCXVuc2lnbmVkIGNoYXIgKiBidWYgPSBOVUxMOworCQorCS8qIEZpcnN0LCBpbml0aWFsaXplIHRoZSBkYWVtb24gbW9kdWxlcyAqLworCUlOSVRfRkQoKTsKKwkKKwkvKiBDcmVhdGUgdGhlIG1lc3NhZ2Ugb2JqZWN0IGZyb20gbW9kZWwgKi8KKwl7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGFjcl9tb2RlbCA9IE5VTEw7CisKKwkJLyogTm93IGZpbmQgdGhlIEFDUiBkaWN0aW9uYXJ5IG9iamVjdCAqLworCQlDSEVDSyggMCwgZmRfZGljdF9zZWFyY2ggKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJBY2NvdW50aW5nLVJlcXVlc3QiLCAmYWNyX21vZGVsLCBFTk9FTlQgKSApOworCisJCS8qIENyZWF0ZSB0aGUgaW5zdGFuY2UsIHVzaW5nIHRoZSB0ZW1wbGF0ZXMgKi8KKwkJQ0hFQ0soIDAsIGZkX21zZ19uZXcgKCBhY3JfbW9kZWwsIDAsICZhY3IgKSApOworCisJCS8qIENoZWNrIHRoZXJlIGlzIG5vIGNoaWxkICovCisJCUNIRUNLKCBFTk9FTlQsIGZkX21zZ19icm93c2UgKCBhY3IsIE1TR19CUldfRklSU1RfQ0hJTEQsIE5VTEwsIE5VTEwpICk7CisJCQorCQkjaWYgMAorCQkvKiBGb3IgZGVidWc6IGR1bXAgdGhlIG9iamVjdCAqLworCQlmZF9sb2dfZGVidWcoIkR1bXBpbmcgQWNjb3VudGluZy1SZXF1ZXN0IGVtcHR5IG1lc3NhZ2U6Iik7CisJCWZkX2xvZ19kZWJ1ZygiJXMiLCBmZF9tc2dfZHVtcF90cmVldmlldyhGRF9EVU1QX1RFU1RfUEFSQU1TLCBhY3IsIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgMCwgMSkpOworCQkjZW5kaWYKKwl9CisJCisJLyogQ3JlYXRlIHRoZSBQcm94eS1JbmZvIEFWUCBmcm9tIG1vZGVsICovCisJeworCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBwaV9tb2RlbCA9IE5VTEw7CisKKwkJLyogTm93IGZpbmQgdGhlIEFDUiBkaWN0aW9uYXJ5IG9iamVjdCAqLworCQlDSEVDSyggMCwgZmRfZGljdF9zZWFyY2ggKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIlByb3h5LUluZm8iLCAmcGlfbW9kZWwsIEVOT0VOVCApICk7CisKKwkJLyogQ3JlYXRlIHRoZSBpbnN0YW5jZSwgdXNpbmcgdGhlIHRlbXBsYXRlcyAqLworCQlDSEVDSyggMCwgZmRfbXNnX2F2cF9uZXcgKCBwaV9tb2RlbCwgMCwgJnBpICkgKTsKKworCQkjaWYgMAorCQkvKiBGb3IgZGVidWc6IGR1bXAgdGhlIG9iamVjdCAqLworCQlmZF9sb2dfZGVidWcoIkR1bXBpbmcgUHJveHktSW5mbyBBVlAiKTsKKwkJZmRfbG9nX2RlYnVnKCIlcyIsIGZkX21zZ19kdW1wX3RyZWV2aWV3KEZEX0RVTVBfVEVTVF9QQVJBTVMsIHBpLCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIDAsIDEpKTsKKwkJZmRfbG9nX2RlYnVnKCJEdW1waW5nIGRpY3Rpb25hcnkgbW9kZWwiKTsKKwkJZmRfbG9nX2RlYnVnKCIlcyIsIGZkX2RpY3RfZHVtcF9vYmplY3QoRkRfRFVNUF9URVNUX1BBUkFNUywgcGlfbW9kZWwpKTsKKwkJI2VuZGlmCisJCQorCX0KKwkKKwkvKiBHZXQgYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgbGFzdCBBVlAgaW4gdGhlIG1lc3NhZ2UgKi8KKwl7CisJCWludCBkaWZmID0gMDsKKwkJCisJCUNIRUNLKCAwLCBmZF9tc2dfYXZwX25ldyAoIE5VTEwsIDAsICZhdnAxICkgKTsKKwkJQ0hFQ0soIDAsIGZkX21zZ19hdnBfYWRkICggYWNyLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cDEpICk7CisJCQorCQlDSEVDSyggMCwgZmRfbXNnX2Jyb3dzZSAoIGFjciwgTVNHX0JSV19MQVNUX0NISUxELCAmYXZwMiwgJmRpZmYpICk7CisJCUNIRUNLKCAxLCBkaWZmICk7CisJCUNIRUNLKCBhdnAxLCBhdnAyICk7CisJCQorCQkvKiBDaGVjayB0aGF0IHdlIGNhbm5vdCBhZGQgdGhpcyBBVlAgdG8gYW5vdGhlciBvYmplY3Qgc2luY2UgaXQgaXMgYWxyZWFkeSBsaW5rZWQgKi8KKwkJQ0hFQ0soIEVJTlZBTCwgZmRfbXNnX2F2cF9hZGQoIHBpLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cDEpICk7CisJfQorCisJLyogTm93IGFkZCB0aGUgUHJveHktSW5mbyBBVlAgYXQgdGhlIGVuZCBvZiB0aGUgbWVzc2FnZSAqLworCXsKKwkJQ0hFQ0soIDAsIGZkX21zZ19hdnBfYWRkKCBhY3IsIE1TR19CUldfTEFTVF9DSElMRCwgcGkpICk7CisJCSNpZiAwCisJCS8qIEZvciBkZWJ1ZzogZHVtcCB0aGUgb2JqZWN0ICovCisJCWZkX2xvZ19kZWJ1ZygiRHVtcGluZyBBY2NvdW50aW5nLVJlcXVlc3Qgd2l0aCBQcm94eS1JbmZvIEFWUCBhdCB0aGUgZW5kIik7CisJCWZkX2xvZ19kZWJ1ZygiJXMiLCBmZF9tc2dfZHVtcF90cmVldmlldyhGRF9EVU1QX1RFU1RfUEFSQU1TLCBhY3IsIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgMCwgMSkpOworCQkjZW5kaWYKKwl9CisJCisJLyogQ2hlY2sgdGhlIGxhc3QgY2hpbGQgaXMgbm93IHRoZSBwcm94eS1JbmZvICovCisJeworCQlDSEVDSyggMCwgZmRfbXNnX2Jyb3dzZSAoIGFjciwgTVNHX0JSV19MQVNUX0NISUxELCAmYXZwMiwgTlVMTCkgKTsKKwkJQ0hFQ0soIHBpLCBhdnAyICk7CisJfQorCQorCS8qIENoZWNrIHRoYXQgdGhlIGF2cCBiZWZvcmUgdGhlIHByb3h5LWluZm8gaXMgdGhlIHByZXZpb3VzIGxhc3Qgb25lICovCisJeworCQlpbnQgZGlmZiA9IDA7CisJCUNIRUNLKCAwLCBmZF9tc2dfYnJvd3NlICggcGksIE1TR19CUldfUFJFViwgJmF2cDIsICZkaWZmKSApOworCQlDSEVDSyggYXZwMSwgYXZwMiApOworCQlDSEVDSyggMCwgZGlmZik7CisJfQorCQorCS8qIENoZWNrIHRoYXQgdGhlcmUgYXJlIG5vIEFWUCBhZnRlciB0aGUgcHJveHktaW5mbyAqLworCUNIRUNLKCBFTk9FTlQsIGZkX21zZ19icm93c2UgKCBwaSwgTVNHX0JSV19ORVhULCBOVUxMLCBOVUxMKSApOworCQorCS8qIFRlc3QgdGhlIGZkX21zZ19mcmVlIGZ1bmN0aW9uIHVubGlua3MgdGhlIG9iamVjdCBwcm9wZXJseSAqLworCXsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogcnJfbW9kZWwgPSBOVUxMOworCisJCS8qIE5vdyBmaW5kIHRoZSBkaWN0aW9uYXJ5IG9iamVjdCAqLworCQlDSEVDSyggMCwgZmRfZGljdF9zZWFyY2ggKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIlJvdXRlLVJlY29yZCIsICZycl9tb2RlbCwgRU5PRU5UICkgKTsKKworCQkvKiBDcmVhdGUgdGhlIGluc3RhbmNlLCB1c2luZyB0aGUgdGVtcGxhdGVzICovCisJCUNIRUNLKCAwLCBmZF9tc2dfYXZwX25ldyAoIHJyX21vZGVsLCAwLCAmYXZwMSApICk7CisJCQorCQkvKiBBZGQgdGhlIEFWUCBhdCB0aGUgZW5kIG9mIHRoZSBtZXNzYWdlICovCisJCUNIRUNLKCAwLCBmZF9tc2dfYXZwX2FkZCggcGksIE1TR19CUldfTkVYVCwgYXZwMSkgKTsKKwkJCisJCS8qIENoZWNrIHRoZSBsYXN0IEFWUCBvZiB0aGUgbWVzc2FnZSBpcyBub3cgdGhpcyBvbmUgKi8KKwkJQ0hFQ0soIDAsIGZkX21zZ19icm93c2UgKCBhY3IsIE1TR19CUldfTEFTVF9DSElMRCwgJmF2cDIsIE5VTEwpICk7CisJCUNIRUNLKCBhdnAxLCBhdnAyICk7CisJCQorCQkvKiBOb3cgZGVsZXRlIGl0ICovCisJCUNIRUNLKCAwLCBmZF9tc2dfZnJlZSggYXZwMSApICk7CisJCQorCQkvKiBDaGVjayB0aGUgbGFzdCBBVlAgb2YgdGhlIG1lc3NhZ2UgaXMgYmFjayB0byBwaSAqLworCQlDSEVDSyggMCwgZmRfbXNnX2Jyb3dzZSAoIGFjciwgTVNHX0JSV19MQVNUX0NISUxELCAmYXZwMiwgTlVMTCkgKTsKKwkJQ0hFQ0soIHBpLCBhdnAyICk7CisJCQorCQkvKiBEZWxldGUgdGhlIHdob2xlIG1lc3NhZ2UgKi8KKwkJQ0hFQ0soIDAsIGZkX21zZ19mcmVlKCBhY3IgKSApOworCX0KKwkKKwkvKiBSZWNyZWF0ZSB0aGUgbWVzc2FnZSBvYmplY3QgKi8KKwl7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGFjcl9tb2RlbCA9IE5VTEw7CisKKwkJLyogTm93IGZpbmQgdGhlIEFDUiBkaWN0aW9uYXJ5IG9iamVjdCAqLworCQlDSEVDSyggMCwgZmRfZGljdF9zZWFyY2ggKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJBY2NvdW50aW5nLVJlcXVlc3QiLCAmYWNyX21vZGVsLCBFTk9FTlQgKSApOworCisJCS8qIENyZWF0ZSB0aGUgaW5zdGFuY2UsIHVzaW5nIHRoZSB0ZW1wbGF0ZXMgKi8KKwkJQ0hFQ0soIDAsIGZkX21zZ19uZXcgKCBhY3JfbW9kZWwsIDAsICZhY3IgKSApOworCX0KKwkKKwkvKiBOb3cgbGV0J3MgY3JlYXRlIHNvbWUgYWRkaXRpb25hbCBEaWN0aW9uYXJ5IG9iamVjdHMgZm9yIHRoZSB0ZXN0ICovCisJeworCQkvKiBUaGUgY29uc3RhbnQgdmFsdWVzIHVzZWQgaGVyZSBhcmUgdG90YWxseSBhcmJpdHJhcnkgY2hvc2VuICovCisJCXN0cnVjdCBkaWN0X29iamVjdCAqIHZlbmRvcjsKKwkJeworCQkJc3RydWN0IGRpY3RfdmVuZG9yX2RhdGEgdmVuZG9yX2RhdGEgPSB7IDczNTY1LCAiVmVuZG9yIHRlc3QiIH07CisJCQlDSEVDSyggMCwgZmRfZGljdF9uZXcgKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfVkVORE9SLCAmdmVuZG9yX2RhdGEgLCBOVUxMLCAmdmVuZG9yICkgKTsKKwkJfQorCQkKKwkJeworCQkJc3RydWN0IGRpY3RfYXBwbGljYXRpb25fZGF0YSBhcHBfZGF0YSA9IHsgNzM1NjYsICJBcHBsaWNhdGlvbiB0ZXN0IiB9OworCQkJQ0hFQ0soIDAsIGZkX2RpY3RfbmV3ICggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FQUExJQ0FUSU9OLCAmYXBwX2RhdGEgLCB2ZW5kb3IsIE5VTEwgKSApOworCQl9CisJCQorCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBhdnBfZGF0YSA9IHsgNzM1NjcsIDAsICJBVlAgVGVzdCAtIG5vIHZlbmRvciAtIGYzMiIsIDAsIDAsIEFWUF9UWVBFX0ZMT0FUMzIgfTsKKwkJCUNIRUNLKCAwLCBmZF9kaWN0X25ldyAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsICZhdnBfZGF0YSAsIE5VTEwsIE5VTEwgKSApOworCQl9CisJCQorCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBhdnBfZGF0YSA9IHsgMTM5MTAzLCAwLCAiQVZQIFRlc3QgLSBubyB2ZW5kb3IgLSBmNjQiLCAwLCAwLCBBVlBfVFlQRV9GTE9BVDY0IH07CisJCQlDSEVDSyggMCwgZmRfZGljdF9uZXcgKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCAmYXZwX2RhdGEgLCBOVUxMLCBOVUxMICkgKTsKKwkJfQorCQkKKwkJeyAKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgKiB0eXBlID0gTlVMTDsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSB0eXBlX2RhdGEgPSB7IEFWUF9UWVBFX0lOVEVHRVI2NCwgIkludDY0IHRlc3QiIH07CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSAgYXZwX2RhdGEgPSB7IDczNTY4LCA3MzU2NSwgIkFWUCBUZXN0IC0gaTY0IiwgQVZQX0ZMQUdfVkVORE9SLCBBVlBfRkxBR19WRU5ET1IsIEFWUF9UWVBFX0lOVEVHRVI2NCB9OworCQkJQ0hFQ0soIDAsIGZkX2RpY3RfbmV3ICggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1RZUEUsICZ0eXBlX2RhdGEgLCBOVUxMLCAmdHlwZSApICk7CisJCQlDSEVDSyggMCwgZmRfZGljdF9uZXcgKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCAmYXZwX2RhdGEgLCB0eXBlLCBOVUxMICkgKTsKKwkJfQorCQkKKwkJeworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAgICAqIHR5cGUgPSBOVUxMOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhICAgIHR5cGVfZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjMyLCAiRW51bTMyIHRlc3QiIH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgdmFsMSA9IHsgImkzMiBjb25zdCB0ZXN0ICh2YWwgMSkiLCB7IC5pMzIgPSAxIH0gfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSB2YWwyID0geyAiaTMyIGNvbnN0IHRlc3QgKHZhbCAyKSIsIHsgLmkzMiA9IDIgfSB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIHZhbDMgPSB7ICJpMzIgY29uc3QgdGVzdCAodmFsIC01KSIseyAuaTMyID0gLTUgfSB9OworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgICAgIGF2cF9kYXRhID0geyA3MzU2OSwgNzM1NjUsICJBVlAgVGVzdCAtIGVudW1pMzIiLCBBVlBfRkxBR19WRU5ET1IsIEFWUF9GTEFHX1ZFTkRPUiwgQVZQX1RZUEVfSU5URUdFUjMyIH07CisJCQkKKwkJCUNIRUNLKCAwLCBmZF9kaWN0X25ldyAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9UWVBFLCAmdHlwZV9kYXRhICwgTlVMTCwgJnR5cGUgKSApOworCQkJQ0hFQ0soIDAsIGZkX2RpY3RfbmV3ICggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgJmF2cF9kYXRhICwgdHlwZSwgTlVMTCApICk7CisJCQlDSEVDSyggMCwgZmRfZGljdF9uZXcgKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfRU5VTVZBTCwgJnZhbDEgLCB0eXBlLCBOVUxMICkgKTsKKwkJCUNIRUNLKCAwLCBmZF9kaWN0X25ldyAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9FTlVNVkFMLCAmdmFsMiAsIHR5cGUsIE5VTEwgKSApOworCQkJQ0hFQ0soIDAsIGZkX2RpY3RfbmV3ICggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0VOVU1WQUwsICZ2YWwzICwgdHlwZSwgTlVMTCApICk7CisJCX0KKwkJCQorCQl7IAorCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAqIHR5cGUgPSBOVUxMOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhIHR5cGVfZGF0YSA9IHsgQVZQX1RZUEVfT0NURVRTVFJJTkcsICJPUyB0ZXN0IiB9OworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgIGF2cF9kYXRhID0geyA3MzU3MCwgNzM1NjUsICJBVlAgVGVzdCAtIG9zIiwgQVZQX0ZMQUdfVkVORE9SLCBBVlBfRkxBR19WRU5ET1IsIEFWUF9UWVBFX09DVEVUU1RSSU5HIH07CisJCQlDSEVDSyggMCwgZmRfZGljdF9uZXcgKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfVFlQRSwgJnR5cGVfZGF0YSAsIE5VTEwsICZ0eXBlICkgKTsKKwkJCUNIRUNLKCAwLCBmZF9kaWN0X25ldyAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsICZhdnBfZGF0YSAsIHR5cGUsIE5VTEwgKSApOworCQl9CisJCQorCQl7CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICogdHlwZSA9IE5VTEw7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgdHlwZV9kYXRhID0geyBBVlBfVFlQRV9PQ1RFVFNUUklORywgIk9TIGVudW0gdGVzdCIgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSB2YWwxID0geyAib3MgY29uc3QgdGVzdCAoVGVzdCkiLCB7IC5vcyA9IHsgKHVuc2lnbmVkIGNoYXIgKikiVGVzdCIsIDQgfSB9IH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgdmFsMiA9IHsgIm9zIGNvbnN0IHRlc3QgKHdhYWFkKSIsIHsgLm9zID0geyAodW5zaWduZWQgY2hhciAqKSJ3YWFhZCIsIDUgfSB9IH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgdmFsMyA9IHsgIm9zIGNvbnN0IHRlc3QgKHdhYSkiLCB7IC5vcyA9IHsgKHVuc2lnbmVkIGNoYXIgKikid2FhYWQiLCAzIH0gfSB9OworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgICAgIGF2cF9kYXRhID0geyA3MzU3MSwgNzM1NjUsICJBVlAgVGVzdCAtIGVudW1vcyIsIEFWUF9GTEFHX1ZFTkRPUiwgQVZQX0ZMQUdfVkVORE9SLCBBVlBfVFlQRV9PQ1RFVFNUUklORyB9OworCQkJCisJCQlDSEVDSyggMCwgZmRfZGljdF9uZXcgKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfVFlQRSwgJnR5cGVfZGF0YSAsIE5VTEwsICZ0eXBlICkgKTsKKwkJCUNIRUNLKCAwLCBmZF9kaWN0X25ldyAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsICZhdnBfZGF0YSAsIHR5cGUsIE5VTEwgKSApOworCQkJQ0hFQ0soIDAsIGZkX2RpY3RfbmV3ICggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0VOVU1WQUwsICZ2YWwxICwgdHlwZSwgTlVMTCApICk7CisJCQlDSEVDSyggMCwgZmRfZGljdF9uZXcgKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfRU5VTVZBTCwgJnZhbDIgLCB0eXBlLCBOVUxMICkgKTsKKwkJCUNIRUNLKCAwLCBmZF9kaWN0X25ldyAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9FTlVNVkFMLCAmdmFsMyAsIHR5cGUsIE5VTEwgKSApOworCQl9CisJCQorCQl7CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBnYXZwID0gTlVMTDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGF2cF9kYXRhID0geyA3MzU3MiwgNzM1NjUsICJBVlAgVGVzdCAtIGdyb3VwZWQiLCBBVlBfRkxBR19WRU5ET1IsIEFWUF9GTEFHX1ZFTkRPUiwgQVZQX1RZUEVfR1JPVVBFRCB9OworCQkJCisJCQlDSEVDSyggMCwgZmRfZGljdF9uZXcgKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCAmYXZwX2RhdGEgLCBOVUxMLCAmZ2F2cCApICk7CisJCQkKKwkJCS8qIE1hY3JvIHRvIHNlYXJjaCBBVlAgYW5kIGNyZWF0ZSBhIHJ1bGUgKi8JCQorCQkJI2RlZmluZSBBRERfUlVMRSggX3BhcmVudCwgX3ZlbmRvciwgX2F2cG5hbWUsIF9wb3MsIF9taW4sIF9tYXgsIF9vcmQgKSB7CQlcCisJCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogX2F2cCA9IE5VTEw7CQkJCQkJXAorCQkJCXN0cnVjdCBkaWN0X2F2cF9yZXF1ZXN0IF9yZXEgPSB7IChfdmVuZG9yKSwgMCwgKF9hdnBuYW1lKSB9OwkJCVwKKwkJCQlzdHJ1Y3QgZGljdF9ydWxlX2RhdGEgX2RhdGE7CQkJCQkJCVwKKwkJCQlDSEVDSyggMCwgZmRfZGljdF9zZWFyY2goIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FX0FORF9WRU5ET1IsICZfcmVxLCAmX2F2cCwgRU5PRU5UKSk7XAorCQkJCV9kYXRhLnJ1bGVfYXZwID0gX2F2cDsJCQkJCQkJCVwKKwkJCQlfZGF0YS5ydWxlX3Bvc2l0aW9uID0gKF9wb3MpOwkJCQkJCQlcCisJCQkJX2RhdGEucnVsZV9vcmRlciA9IChfb3JkKTsJCQkJCQkJXAorCQkJCV9kYXRhLnJ1bGVfbWluID0gKF9taW4pOwkJCQkJCQlcCisJCQkJX2RhdGEucnVsZV9tYXggPSAoX21heCk7CQkJCQkJCVwKKwkJCQlDSEVDSyggMCwgZmRfZGljdF9uZXcgKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfUlVMRSwgJl9kYXRhICwgKF9wYXJlbnQpLCBOVUxMICkgKTsJXAorCQkJfQorCQkJCisJCQlBRERfUlVMRShnYXZwLCA3MzU2NSwgIkFWUCBUZXN0IC0gb3MiLCBSVUxFX09QVElPTkFMLCAgIC0xLCAtMSwgIDApOworCQkJCisJCX0KKwkJCQorCQl7CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICogYXBwbGljYXRpb24gPSBOVUxMOworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAqIGNvbW1hbmQgPSBOVUxMOworCQkJc3RydWN0IGRpY3RfY21kX2RhdGEgIGNtZF9kYXRhID0geyA3MzU3MywgIlRlc3QtQ29tbWFuZC1SZXF1ZXN0IiwgQ01EX0ZMQUdfUkVRVUVTVCwgQ01EX0ZMQUdfUkVRVUVTVCB9OworCQkJCisJCQlDSEVDSyggMCwgZmRfZGljdF9zZWFyY2ggKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVBQTElDQVRJT04sIEFQUExJQ0FUSU9OX0JZX05BTUUsICJBcHBsaWNhdGlvbiB0ZXN0IiwgJmFwcGxpY2F0aW9uLCBFTk9FTlQgKSApOworCQkJQ0hFQ0soIDAsIGZkX2RpY3RfbmV3ICggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0NPTU1BTkQsICZjbWRfZGF0YSAsIGFwcGxpY2F0aW9uLCAmY29tbWFuZCApICk7CisJCQlBRERfUlVMRShjb21tYW5kLCAwLCAgICAgIkFWUCBUZXN0IC0gbm8gdmVuZG9yIC0gZjMyIiwgCVJVTEVfRklYRURfSEVBRCwgLTEsICAxLCAgMSk7CisJCQlBRERfUlVMRShjb21tYW5kLCA3MzU2NSwgIkFWUCBUZXN0IC0gaTY0IiwJCVJVTEVfUkVRVUlSRUQsICAgLTEsIC0xLCAgMCk7CisJCQlBRERfUlVMRShjb21tYW5kLCA3MzU2NSwgIkFWUCBUZXN0IC0gZW51bWkzMiIsIAkJUlVMRV9PUFRJT05BTCwgICAtMSwgLTEsICAwKTsKKwkJCUFERF9SVUxFKGNvbW1hbmQsIDczNTY1LCAiQVZQIFRlc3QgLSBvcyIsIAkJUlVMRV9PUFRJT05BTCwgICAtMSwgLTEsICAwKTsKKwkJCUFERF9SVUxFKGNvbW1hbmQsIDczNTY1LCAiQVZQIFRlc3QgLSBlbnVtb3MiLCAJCVJVTEVfT1BUSU9OQUwsICAgLTEsIC0xLCAgMCk7CisJCQlBRERfUlVMRShjb21tYW5kLCA3MzU2NSwgIkFWUCBUZXN0IC0gZ3JvdXBlZCIsIAkJUlVMRV9PUFRJT05BTCwgICAtMSwgLTEsICAwKTsKKwkJfQorCQkKKwkJeworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAqIGFwcGxpY2F0aW9uID0gTlVMTDsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgKiBjb21tYW5kID0gTlVMTDsKKwkJCXN0cnVjdCBkaWN0X2NtZF9kYXRhICBjbWRfZGF0YSA9IHsgNzM1NzMsICJUZXN0LUNvbW1hbmQtQW5zd2VyIiwgQ01EX0ZMQUdfUkVRVUVTVCwgMCB9OworCQkJCisJCQlDSEVDSyggMCwgZmRfZGljdF9zZWFyY2ggKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVBQTElDQVRJT04sIEFQUExJQ0FUSU9OX0JZX05BTUUsICJBcHBsaWNhdGlvbiB0ZXN0IiwgJmFwcGxpY2F0aW9uLCBFTk9FTlQgKSApOworCQkJQ0hFQ0soIDAsIGZkX2RpY3RfbmV3ICggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0NPTU1BTkQsICZjbWRfZGF0YSAsIGFwcGxpY2F0aW9uLCAmY29tbWFuZCApICk7CisJCX0KKwkJCisJCXsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgKiBnYXZwID0gTlVMTDsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhICBhdnBfZGF0YSA9IHsgNzM1NzQsIDczNTY1LCAiQVZQIFRlc3QgLSBydWxlcyIsIEFWUF9GTEFHX1ZFTkRPUiwgQVZQX0ZMQUdfVkVORE9SLCBBVlBfVFlQRV9HUk9VUEVEIH07CisJCQkKKwkJCUNIRUNLKCAwLCBmZF9kaWN0X25ldyAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsICZhdnBfZGF0YSAsIE5VTEwsICZnYXZwICkgKTsKKwkJCQorCQkJQUREX1JVTEUoZ2F2cCwgICAgIDAsICJBVlAgVGVzdCAtIG5vIHZlbmRvciAtIGYzMiIsIFJVTEVfRklYRURfSEVBRCwgICAwLCAxLCAxKTsKKwkJCUFERF9SVUxFKGdhdnAsIDczNTY1LCAiQVZQIFRlc3QgLSBpNjQiLCAJICAgIFJVTEVfRklYRURfSEVBRCwgIC0xLCAxLCAyKTsKKwkJCUFERF9SVUxFKGdhdnAsIDczNTY1LCAiQVZQIFRlc3QgLSBlbnVtaTMyIiwgCSAgICBSVUxFX0ZJWEVEX0hFQUQsICAtMSwgMSwgMyk7CisJCQlBRERfUlVMRShnYXZwLCA3MzU2NSwgIkFWUCBUZXN0IC0gb3MiLCAJICAgIAkgICAgUlVMRV9SRVFVSVJFRCwgICAgIDIsIDMsIDApOworCQkJQUREX1JVTEUoZ2F2cCwgNzM1NjUsICJBVlAgVGVzdCAtIGVudW1vcyIsICAgICAJICAgIFJVTEVfT1BUSU9OQUwsICAgICAwLCAxLCAwKTsKKwkJCUFERF9SVUxFKGdhdnAsIDczNTY1LCAiQVZQIFRlc3QgLSBncm91cGVkIiwgICAgICAgICBSVUxFX0ZJWEVEX1RBSUwsICAtMSwgMSwgMSk7CisJCQkvKiBBQk5GIDogCisJCQkJPCBubyB2ZW5kb3IgLSBmMzIgPgorCQkJCTwgaTY0ID4KKwkJCQk8IGVudW1pMzIgPgorCQkJICAgIDIqMyB7IG9zIH0KKwkJCSAgICAgKjEgWyBlbnVtb3MgXQorCQkJCTwgZ3JvdXBlZCA+CisJCQkJCQkqLworCQkJI2lmIDAKKwkJCWZkX2xvZ19kZWJ1ZygiJXMiLCBmZF9kaWN0X2R1bXBfb2JqZWN0KEZEX0RVTVBfVEVTVF9QQVJBTVMsIGdhdnApKTsKKwkJCSNlbmRpZgorCQl9CisKKwkJeyAKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgKiB0eXBlID0gTlVMTDsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSB0eXBlX2RhdGEgPSB7IEFWUF9UWVBFX09DVEVUU1RSSU5HLCAiT1MgdGVzdDIiLCBOVUxMLCBOVUxMLCBOVUxMLCBmZF9kaWN0ZmN0X0NoYXJJbk9TX2NoZWNrLCAiQC4iIH07CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSAgYXZwX2RhdGEgPSB7IDczNTc1LCA3MzU2NSwgIkFWUCBUZXN0IC0gb3MyIiwgQVZQX0ZMQUdfVkVORE9SLCBBVlBfRkxBR19WRU5ET1IsIEFWUF9UWVBFX09DVEVUU1RSSU5HIH07CisJCQlDSEVDSyggMCwgZmRfZGljdF9uZXcgKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfVFlQRSwgJnR5cGVfZGF0YSAsIE5VTEwsICZ0eXBlICkgKTsKKwkJCUNIRUNLKCAwLCBmZF9kaWN0X25ldyAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsICZhdnBfZGF0YSAsIHR5cGUsIE5VTEwgKSApOworCQl9CisJCQorCQkjaWYgMAorCQl7CisJCQlmZF9sb2dfZGVidWcoIiVzIiwgZmRfZGljdF9kdW1wX29iamVjdChGRF9EVU1QX1RFU1RfUEFSQU1TLCB2ZW5kb3IpKTsKKwkJfQorCQkjZW5kaWYKKwl9CisJCisJLyogTm93IGNyZWF0ZSBzb21lIHZhbHVlcyBhbmQgY2hlY2sgdGhlIGxlbmd0aCBpcyBjb3JyZWN0bHkgaGFuZGxlZCAqLworCXsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogY21kX21vZGVsID0gTlVMTDsKKwkJc3RydWN0IG1zZyAgICAgICAgICogbXNnID0gTlVMTDsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwX21vZGVsID0gTlVMTDsKKwkJc3RydWN0IGF2cCAgICAgICAgICogYXZwID0gTlVMTDsKKwkJdW5pb24gYXZwX3ZhbHVlICAgICAgdmFsdWU7CisJCQorCQlDSEVDSyggMCwgZmRfZGljdF9zZWFyY2ggKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJUZXN0LUNvbW1hbmQtUmVxdWVzdCIsICZjbWRfbW9kZWwsIEVOT0VOVCApICk7CisJCQorCQkvKiBDaGVjayBhbiBlcnJvciBpcyB0cmlnZ2VkIGlmIHRoZSBBVlAgaGFzIG5vIHZhbHVlIHNldCAqLworCQl7CisJCQlDSEVDSyggMCwgZmRfZGljdF9zZWFyY2ggKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCAgICAgQVZQX0JZX05BTUUsICAgICAiQVZQIFRlc3QgLSBubyB2ZW5kb3IgLSBmMzIiLCAmYXZwX21vZGVsLCBFTk9FTlQgKSApOworCQkJCisJCQlDSEVDSyggMCwgZmRfbXNnX25ldyAoIGNtZF9tb2RlbCwgMCwgJm1zZyApICk7CisJCQlDSEVDSyggMCwgZmRfbXNnX2F2cF9uZXcgKCBhdnBfbW9kZWwsIDAsICZhdnAgKSApOworCQkJCisJCQlDSEVDSyggMCwgZmRfbXNnX2F2cF9hZGQgKCBtc2csIE1TR19CUldfRklSU1RfQ0hJTEQsIGF2cCApICk7CisJCQkKKwkJCUNIRUNLKCBFSU5WQUwsIGZkX21zZ191cGRhdGVfbGVuZ3RoICggYXZwICkgKTsKKwkJCUNIRUNLKCBFSU5WQUwsIGZkX21zZ191cGRhdGVfbGVuZ3RoICggbXNnICkgKTsKKwkJCQorCQkJQ0hFQ0soIDAsIGZkX21zZ19mcmVlKCBtc2cgKSApOworCQl9CisJCQorCQkvKiBDaGVjayB0aGUgc2l6ZXMgYXJlIGhhbmRsZWQgcHJvcGVybHkgKi8KKwkJeworCQkJc3RydWN0IGF2cCAqIGF2cGkgPSBOVUxMOworCQkJc3RydWN0IGF2cCAqIGF2cGNoID0gTlVMTDsKKwkJCXN0cnVjdCBhdnBfaGRyICogYXZwZGF0YSA9IE5VTEw7CisJCQlzdHJ1Y3QgbXNnX2hkciAqIG1zZ2RhdGEgPSBOVUxMOworCQkJI2RlZmluZSBBRERfQVZQKCBfcGFyZW50LCBfcG9zaXRpb24sIF9hdnBpLCBfYXZwdmVuZG9yLCBfYXZwbmFtZSkgewkJCVwKKwkJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBfYXZwID0gTlVMTDsJCQkJCQlcCisJCQkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgX3JlcSA9IHsgKF9hdnB2ZW5kb3IpLCAwLCAoX2F2cG5hbWUpIH07CQkJXAorCQkJCUNIRUNLKCAwLCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJl9yZXEsICZfYXZwLCBFTk9FTlQpKTtcCisJCQkJQ0hFQ0soIDAsIGZkX21zZ19hdnBfbmV3ICggX2F2cCwgMCwgJl9hdnBpICkgKTsJCQkJCVwKKwkJCQlDSEVDSyggMCwgZmRfbXNnX2F2cF9hZGQgKCAoX3BhcmVudCksIChfcG9zaXRpb24pLCBfYXZwaSApICk7CQkJXAorCQkJfQorCQkJLyogQ3JlYXRlIGEgbWVzc2FnZSB3aXRoIG1hbnkgQVZQIGluc2lkZSAqLworCQkJQ0hFQ0soIDAsIGZkX21zZ19uZXcgKCBjbWRfbW9kZWwsIDAsICZtc2cgKSApOworCQkJQ0hFQ0soIDAsIGZkX21zZ19oZHIgKCBtc2csICZtc2dkYXRhICkgKTsKKwkJCQorCQkJLyogQXZwIG5vIHZlbmRvciwgZmxvYXQzMiA9PiBzaXplID0gMTIgKi8KKwkJCUFERF9BVlAoIG1zZywgTVNHX0JSV19MQVNUX0NISUxELCBhdnBpLCAwLCAgICAgIkFWUCBUZXN0IC0gbm8gdmVuZG9yIC0gZjMyIiApOworCQkJdmFsdWUuZjMyID0gMy4xNDE1OworCQkJQ0hFQ0soIDAsIGZkX21zZ19hdnBfc2V0dmFsdWUgKCBhdnBpLCAmdmFsdWUgKSApOworCQkJQ0hFQ0soIDAsIGZkX21zZ191cGRhdGVfbGVuZ3RoICggYXZwaSApICk7CisJCQkjaWYgMAorCQkJZmRfbG9nX2RlYnVnKCJBVlAgbm8gdmVuZG9yLCB2YWx1ZSAzLjE0MTU6Iik7CisJCQlmZF9sb2dfZGVidWcoIiVzIiwgZmRfbXNnX2R1bXBfdHJlZXZpZXcoRkRfRFVNUF9URVNUX1BBUkFNUywgYXZwaSwgZmRfZ19jb25maWctPmNuZl9kaWN0LCAwLCAwKSk7CisJCQkjZW5kaWYKKwkJCUNIRUNLKCAwLCBmZF9tc2dfYXZwX2hkciAoIGF2cGksICZhdnBkYXRhICkgKTsKKwkJCUNIRUNLKCAxMiwgYXZwZGF0YS0+YXZwX2xlbiApOworCQkJCisJCQkvKiBDaGVjayB3aGF0IGhhcHBlbnMgd2hlbiB3ZSBkZWxldGUgdGhlIHZhbHVlICovCisJCQlDSEVDSyggMCwgZmRfbXNnX2F2cF9zZXR2YWx1ZSAoIGF2cGksIE5VTEwgKSApOworCQkJQ0hFQ0soIEVJTlZBTCwgZmRfbXNnX3VwZGF0ZV9sZW5ndGggKCBhdnBpICkgKTsKKwkJCUNIRUNLKCAwLCBmZF9tc2dfYXZwX3NldHZhbHVlICggYXZwaSwgJnZhbHVlICkgKTsKKwkJCQorCQkJLyogQWRkIGEgdmVuZG9yIEFWUCwgaW50ZWdlcjY0ID0+IHNpemUgPSAyMCAqLworCQkJQUREX0FWUCggbXNnLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cGksIDczNTY1LCAiQVZQIFRlc3QgLSBpNjQiICk7CisJCQl2YWx1ZS5pNjQgPSAweDEyMzQ1Njc4OWFiY2RlTEw7CisJCQlDSEVDSyggMCwgZmRfbXNnX2F2cF9zZXR2YWx1ZSAoIGF2cGksICZ2YWx1ZSApICk7CisJCQlDSEVDSyggMCwgZmRfbXNnX3VwZGF0ZV9sZW5ndGggKCBhdnBpICkgKTsKKwkJCSNpZiAwCisJCQlmZF9sb2dfZGVidWcoIkFWUCB2ZW5kb3IsIHZhbHVlIDB4MTIzNDU2Nzg5YWJjZGVMOiIpOworCQkJZmRfbG9nX2RlYnVnKCIlcyIsIGZkX21zZ19kdW1wX3RyZWV2aWV3KEZEX0RVTVBfVEVTVF9QQVJBTVMsIGF2cGksIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgMCwgMCkpOworCQkJI2VuZGlmCisJCQlDSEVDSyggMCwgZmRfbXNnX2F2cF9oZHIgKCBhdnBpLCAmYXZwZGF0YSApICk7CisJCQlDSEVDSyggMjAsIGF2cGRhdGEtPmF2cF9sZW4gKTsKKwkJCQorCQkJLyogQ2hlY2sgdGhlIHNpemUgb2YgdGhlIG1lc3NhZ2UgaXMgMjAgKGhlYWRlcikgKyAxMiArIDIwID0gNTIgKi8KKwkJCUNIRUNLKCAwLCBmZF9tc2dfdXBkYXRlX2xlbmd0aCAoIG1zZyApICk7CisJCQlDSEVDSyggNTIsIG1zZ2RhdGEtPm1zZ19sZW5ndGggKTsKKwkJCQorCQkJLyogQWRkIGFuIEFWUCB3aXRoIGFuIGVudW0gdmFsdWUgKi8KKwkJCUFERF9BVlAoIG1zZywgTVNHX0JSV19MQVNUX0NISUxELCBhdnBpLCA3MzU2NSwgIkFWUCBUZXN0IC0gZW51bWkzMiIgKTsKKwkJCXsKKwkJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiB0eXBlX21vZGVsID0gTlVMTDsKKwkJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiB2YWx1ZV9tb2RlbCA9IE5VTEw7CisJCQkJc3RydWN0IGRpY3RfZW51bXZhbF9yZXF1ZXN0IHJlcXVlc3Q7CisJCQkJCisJCQkJQ0hFQ0soIDAsIGZkX21zZ19tb2RlbCAoIGF2cGksICZhdnBfbW9kZWwgKSApOworCQkJCUNIRUNLKCAwLCBmZF9kaWN0X3NlYXJjaCAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9UWVBFLCBUWVBFX09GX0FWUCwgYXZwX21vZGVsLCAmdHlwZV9tb2RlbCwgRU5PRU5UICkgKTsKKwkJCQltZW1zZXQoJnJlcXVlc3QsIDAsIHNpemVvZihyZXF1ZXN0KSk7CisJCQkJcmVxdWVzdC50eXBlX29iaiA9IHR5cGVfbW9kZWw7CisJCQkJcmVxdWVzdC5zZWFyY2guZW51bV9uYW1lID0gImkzMiBjb25zdCB0ZXN0ICh2YWwgMikiOworCQkJCUNIRUNLKCAwLCBmZF9kaWN0X3NlYXJjaCAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9FTlVNVkFMLCBFTlVNVkFMX0JZX1NUUlVDVCwgJnJlcXVlc3QsICZ2YWx1ZV9tb2RlbCwgRU5PRU5UICkgKTsKKwkJCQlDSEVDSyggMCwgZmRfZGljdF9nZXR2YWwgKCB2YWx1ZV9tb2RlbCwgJnJlcXVlc3Quc2VhcmNoICkgKTsKKwkJCQlDSEVDSyggMCwgZmRfbXNnX2F2cF9zZXR2YWx1ZSAoIGF2cGksICZyZXF1ZXN0LnNlYXJjaC5lbnVtX3ZhbHVlICkgKTsKKwkJCQkjaWYgMAorCQkJCWZkX2xvZ19kZWJ1ZygiQVZQIGVudW0gaTMyLCB2YWx1ZSAyIChmcm9tIGNvbnN0KToiKTsKKwkJCQlmZF9sb2dfZGVidWcoIiVzIiwgZmRfbXNnX2R1bXBfdHJlZXZpZXcoRkRfRFVNUF9URVNUX1BBUkFNUywgYXZwaSwgZmRfZ19jb25maWctPmNuZl9kaWN0LCAwLCAwKSk7CisJCQkJI2VuZGlmCisJCQl9CisJCQkKKwkJCS8qIEFkZCBhbiBBVlAgd2l0aCBhbiBlbnVtIHZhbHVlLCBuZWdhdGl2ZSAqLworCQkJQUREX0FWUCggbXNnLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cGksIDczNTY1LCAiQVZQIFRlc3QgLSBlbnVtaTMyIiApOworCQkJeworCQkJCXN0cnVjdCBkaWN0X29iamVjdCAgKiB0eXBlX21vZGVsID0gTlVMTDsKKwkJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICogdmFsdWVfbW9kZWwgPSBOVUxMOworCQkJCXN0cnVjdCBkaWN0X2VudW12YWxfcmVxdWVzdCByZXF1ZXN0OworCQkJCQorCQkJCUNIRUNLKCAwLCBmZF9tc2dfbW9kZWwgKCBhdnBpLCAmYXZwX21vZGVsICkgKTsKKwkJCQlDSEVDSyggMCwgZmRfZGljdF9zZWFyY2ggKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfVFlQRSwgVFlQRV9PRl9BVlAsIGF2cF9tb2RlbCwgJnR5cGVfbW9kZWwsIEVOT0VOVCApICk7CisJCQkJbWVtc2V0KCZyZXF1ZXN0LCAwLCBzaXplb2YocmVxdWVzdCkpOworCQkJCXJlcXVlc3QudHlwZV9vYmogPSB0eXBlX21vZGVsOworCQkJCXJlcXVlc3Quc2VhcmNoLmVudW1fbmFtZSA9ICJpMzIgY29uc3QgdGVzdCAodmFsIC01KSI7CisJCQkJQ0hFQ0soIDAsIGZkX2RpY3Rfc2VhcmNoICggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0VOVU1WQUwsIEVOVU1WQUxfQllfU1RSVUNULCAmcmVxdWVzdCwgJnZhbHVlX21vZGVsLCBFTk9FTlQgKSApOworCQkJCUNIRUNLKCAwLCBmZF9kaWN0X2dldHZhbCAoIHZhbHVlX21vZGVsLCAmcmVxdWVzdC5zZWFyY2ggKSApOworCQkJCUNIRUNLKCAwLCBmZF9tc2dfYXZwX3NldHZhbHVlICggYXZwaSwgJnJlcXVlc3Quc2VhcmNoLmVudW1fdmFsdWUgKSApOworCQkJCSNpZiAwCisJCQkJZmRfbG9nX2RlYnVnKCJBVlAgZW51bSBpMzIsIHZhbHVlIC01IChmcm9tIGNvbnN0KToiKTsKKwkJCQlmZF9sb2dfZGVidWcoIiVzIiwgZmRfbXNnX2R1bXBfdHJlZXZpZXcoRkRfRFVNUF9URVNUX1BBUkFNUywgYXZwaSwgZmRfZ19jb25maWctPmNuZl9kaWN0LCAwLCAwKSk7CisJCQkJI2VuZGlmCisJCQkJLyogQ2hlY2sgdGhlIHNpemUgaXMgY29ycmVjdCAoIDEyIGZvciBoZWFkZXIgKyA0IGZvciB2YWx1ZSApICovCisJCQkJQ0hFQ0soIDAsIGZkX21zZ191cGRhdGVfbGVuZ3RoICggYXZwaSApICk7CisJCQkJQ0hFQ0soIDAsIGZkX21zZ19hdnBfaGRyICggYXZwaSwgJmF2cGRhdGEgKSApOworCQkJCUNIRUNLKCAxNiwgYXZwZGF0YS0+YXZwX2xlbiApOworCQkJfQorCQkJCisJCQkvKiBOb3cgYWRkIGEgdmFsdWUgd2hpY2ggaXMgbm90IGEgY29uc3RhbnQgaW50byBhbiBlbnVtZXJhdGVkIEFWUCAqLworCQkJQUREX0FWUCggbXNnLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cGksIDczNTY1LCAiQVZQIFRlc3QgLSBlbnVtaTMyIiApOworCQkJdmFsdWUuaTMyID0gLTEwOworCQkJQ0hFQ0soIDAsIGZkX21zZ19hdnBfc2V0dmFsdWUgKCBhdnBpLCAmdmFsdWUgKSApOworCQkJQ0hFQ0soIDAsIGZkX21zZ191cGRhdGVfbGVuZ3RoICggYXZwaSApICk7CisJCQkjaWYgMAorCQkJZmRfbG9nX2RlYnVnKCJBVlAgdmVuZG9yIGVudW0gaTMyLCB2YWx1ZSAtMTAgKG5vdCBjb25zdCk6Iik7CisJCQlmZF9sb2dfZGVidWcoIiVzIiwgZmRfbXNnX2R1bXBfdHJlZXZpZXcoRkRfRFVNUF9URVNUX1BBUkFNUywgYXZwaSwgZmRfZ19jb25maWctPmNuZl9kaWN0LCAwLCAwKSk7CisJCQkjZW5kaWYKKwkJCQorCQkJLyogQWRkIGFuIG9jdGV0c3RyaW5nIEFWUCAqLworCQkJQUREX0FWUCggbXNnLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cGksIDczNTY1LCAiQVZQIFRlc3QgLSBvcyIgKTsKKwkJCXsKKwkJCQl1bnNpZ25lZCBjaGFyIGJ1Zls5MF07CisJCQkJbWVtY3B5KCZidWYsICJUaGlzXDAgaXMgYSBidWZmZXIgb2YgZGF0XGEuIEl0IGlzIG5vdCBhIHN0cmluZyBzbyB3ZSBjYW4gaGF2ZSBhbnkgY1wwbnRyXDBsIGNoYXJhY3RlciBoZXJlLi4uXDBcMCIsIDg5KTsKKwkJCQl2YWx1ZS5vcy5kYXRhID0gYnVmOworCQkJCXZhbHVlLm9zLmxlbiA9IDg5OworCQkJCUNIRUNLKCAwLCBmZF9tc2dfYXZwX3NldHZhbHVlICggYXZwaSwgJnZhbHVlICkgKTsKKwkJCQltZW1zZXQoJmJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOyAvKiBUZXN0IHRoYXQgdGhlIE9TIHZhbHVlIGlzIHJlYWxseSBjb3BpZWQgKi8KKwkJCQlDSEVDSyggMCwgZmRfbXNnX3VwZGF0ZV9sZW5ndGggKCBhdnBpICkgKTsKKwkJCQkjaWYgMAorCQkJCWZkX2xvZ19kZWJ1ZygiQVZQIG9jdGV0IHN0cmluZywgJ1RoaXNcXDAgaXMgYSBiLi4uJyIpOworCQkJCWZkX2xvZ19kZWJ1ZygiJXMiLCBmZF9tc2dfZHVtcF90cmVldmlldyhGRF9EVU1QX1RFU1RfUEFSQU1TLCBhdnBpLCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIDAsIDApKTsKKwkJCQkjZW5kaWYKKwkJCQlDSEVDSyggMCwgZmRfbXNnX2F2cF9oZHIgKCBhdnBpLCAmYXZwZGF0YSApICk7CisJCQkJQ0hFQ0soIDEwMSwgYXZwZGF0YS0+YXZwX2xlbiApOworCQkJCUNIRUNLKCAnVCcsIGF2cGRhdGEtPmF2cF92YWx1ZS0+b3MuZGF0YVswXSApOworCQkJCUNIRUNLKCAnaScsIGF2cGRhdGEtPmF2cF92YWx1ZS0+b3MuZGF0YVs2XSApOworCQkJfQorCisJCQkvKiBDaGVjayB0aGUgc2l6ZSBvZiB0aGUgbWVzc2FnZSBpcyAyMCAoaGVhZGVyKSArIDEyICsgMjAgKyAxNiAqIDMgKyAxMDEgKyAzIChwYWRkaW5nKSA9IDIwNCAqLworCQkJQ0hFQ0soIDAsIGZkX21zZ191cGRhdGVfbGVuZ3RoICggbXNnICkgKTsKKwkJCUNIRUNLKCAyMDQsIG1zZ2RhdGEtPm1zZ19sZW5ndGggKTsKKwkJCQorCQkJLyogQWRkIGFuIG9jdGV0c3RyaW5nIGZyb20gYW4gZW51bWVyYXRlZCBjb25zdGFudCAqLworCQkJQUREX0FWUCggbXNnLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cGksIDczNTY1LCAiQVZQIFRlc3QgLSBlbnVtb3MiICk7CisJCQl7CisJCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAqIHR5cGVfbW9kZWwgPSBOVUxMOworCQkJCXN0cnVjdCBkaWN0X29iamVjdCAgKiB2YWx1ZV9tb2RlbCA9IE5VTEw7CisJCQkJc3RydWN0IGRpY3RfZW51bXZhbF9yZXF1ZXN0IHJlcXVlc3Q7CisJCQkJCisJCQkJQ0hFQ0soIDAsIGZkX21zZ19tb2RlbCAoIGF2cGksICZhdnBfbW9kZWwgKSApOworCQkJCUNIRUNLKCAwLCBmZF9kaWN0X3NlYXJjaCAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9UWVBFLCBUWVBFX09GX0FWUCwgYXZwX21vZGVsLCAmdHlwZV9tb2RlbCwgRU5PRU5UICkgKTsKKwkJCQltZW1zZXQoJnJlcXVlc3QsIDAsIHNpemVvZihyZXF1ZXN0KSk7CisJCQkJcmVxdWVzdC50eXBlX29iaiA9IHR5cGVfbW9kZWw7CisJCQkJcmVxdWVzdC5zZWFyY2guZW51bV9uYW1lID0gIm9zIGNvbnN0IHRlc3QgKHdhYWFkKSI7CisJCQkJQ0hFQ0soIDAsIGZkX2RpY3Rfc2VhcmNoICggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0VOVU1WQUwsIEVOVU1WQUxfQllfU1RSVUNULCAmcmVxdWVzdCwgJnZhbHVlX21vZGVsLCBFTk9FTlQgKSApOworCQkJCUNIRUNLKCAwLCBmZF9kaWN0X2dldHZhbCAoIHZhbHVlX21vZGVsLCAmcmVxdWVzdC5zZWFyY2ggKSApOworCQkJCUNIRUNLKCAwLCBmZF9tc2dfYXZwX3NldHZhbHVlICggYXZwaSwgJnJlcXVlc3Quc2VhcmNoLmVudW1fdmFsdWUgKSApOworCQkJCSNpZiAwCisJCQkJZmRfbG9nX2RlYnVnKCJBVlAgRW51bXVlcmF0ZWQgT2N0ZXRTdHJpbmcgKGZyb20gY29uc3QpOiIpOworCQkJCWZkX2xvZ19kZWJ1ZygiJXMiLCBmZF9tc2dfZHVtcF90cmVldmlldyhGRF9EVU1QX1RFU1RfUEFSQU1TLCBhdnBpLCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIDAsIDApKTsKKwkJCQkjZW5kaWYKKwkJCQkvKiBDaGVjayB0aGUgc2l6ZSBpcyBjb3JyZWN0ICggMTIgZm9yIGhlYWRlciArIDUgZm9yIHZhbHVlICkgKi8KKwkJCQlDSEVDSyggMCwgZmRfbXNnX3VwZGF0ZV9sZW5ndGggKCBhdnBpICkgKTsKKwkJCQlDSEVDSyggMCwgZmRfbXNnX2F2cF9oZHIgKCBhdnBpLCAmYXZwZGF0YSApICk7CisJCQkJQ0hFQ0soIDE3LCBhdnBkYXRhLT5hdnBfbGVuICk7CisJCQl9CisJCQkJCisJCQkvKiBBZGQgYW4gb2N0ZXRzdHJpbmcgZnJvbSBhbiBlbnVtZXJhdGVkIGNvbnN0YW50ICovCisJCQlBRERfQVZQKCBtc2csIE1TR19CUldfTEFTVF9DSElMRCwgYXZwaSwgNzM1NjUsICJBVlAgVGVzdCAtIGVudW1vcyIgKTsKKwkJCXsKKwkJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICogdHlwZV9tb2RlbCA9IE5VTEw7CisJCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAqIHZhbHVlX21vZGVsID0gTlVMTDsKKwkJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX3JlcXVlc3QgcmVxdWVzdDsKKwkJCQkKKwkJCQlDSEVDSyggMCwgZmRfbXNnX21vZGVsICggYXZwaSwgJmF2cF9tb2RlbCApICk7CisJCQkJQ0hFQ0soIDAsIGZkX2RpY3Rfc2VhcmNoICggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1RZUEUsIFRZUEVfT0ZfQVZQLCBhdnBfbW9kZWwsICZ0eXBlX21vZGVsLCBFTk9FTlQgKSApOworCQkJCW1lbXNldCgmcmVxdWVzdCwgMCwgc2l6ZW9mKHJlcXVlc3QpKTsKKwkJCQlyZXF1ZXN0LnR5cGVfb2JqID0gdHlwZV9tb2RlbDsKKwkJCQlyZXF1ZXN0LnNlYXJjaC5lbnVtX25hbWUgPSAib3MgY29uc3QgdGVzdCAod2FhKSI7CisJCQkJQ0hFQ0soIDAsIGZkX2RpY3Rfc2VhcmNoICggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0VOVU1WQUwsIEVOVU1WQUxfQllfU1RSVUNULCAmcmVxdWVzdCwgJnZhbHVlX21vZGVsLCBFTk9FTlQgKSApOworCQkJCUNIRUNLKCAwLCBmZF9kaWN0X2dldHZhbCAoIHZhbHVlX21vZGVsLCAmcmVxdWVzdC5zZWFyY2ggKSApOworCQkJCUNIRUNLKCAwLCBmZF9tc2dfYXZwX3NldHZhbHVlICggYXZwaSwgJnJlcXVlc3Quc2VhcmNoLmVudW1fdmFsdWUgKSApOworCQkJCSNpZiAwCisJCQkJZmRfbG9nX2RlYnVnKCJBVlAgRW51bXVlcmF0ZWQgT2N0ZXRTdHJpbmcgKGZyb20gY29uc3QpOiIpOworCQkJCWZkX2xvZ19kZWJ1ZygiJXMiLCBmZF9tc2dfZHVtcF90cmVldmlldyhGRF9EVU1QX1RFU1RfUEFSQU1TLCBhdnBpLCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIDAsIDApKTsKKwkJCQkjZW5kaWYKKwkJCQkvKiBDaGVjayB0aGUgc2l6ZSBpcyBjb3JyZWN0ICggMTIgZm9yIGhlYWRlciArIDMgZm9yIHZhbHVlICkgKi8KKwkJCQlDSEVDSyggMCwgZmRfbXNnX3VwZGF0ZV9sZW5ndGggKCBhdnBpICkgKTsKKwkJCQlDSEVDSyggMCwgZmRfbXNnX2F2cF9oZHIgKCBhdnBpLCAmYXZwZGF0YSApICk7CisJCQkJQ0hFQ0soIDE1LCBhdnBkYXRhLT5hdnBfbGVuICk7CisJCQl9CisJCQkJCisKKwkJCS8qIENoZWNrIHRoZSBzaXplIG9mIHRoZSBtZXNzYWdlIGlzIDIwIChoZWFkZXIpICsgMTIgKyAyMCArIDE2ICogMyArICgxMDEgKyAzKSArICgxNyArIDMpICsgKDE1ICsgMSkgPSAyNDAgKi8KKwkJCUNIRUNLKCAwLCBmZF9tc2dfdXBkYXRlX2xlbmd0aCAoIG1zZyApICk7CisJCQlDSEVDSyggMjQwLCBtc2dkYXRhLT5tc2dfbGVuZ3RoICk7CisJCQkKKwkJCS8qIE5vdyB0ZXN0IHRoZSBncm91cGVkIEFWUHMgKi8JCisJCQlBRERfQVZQKCBtc2csIE1TR19CUldfTEFTVF9DSElMRCwgYXZwaSwgNzM1NjUsICJBVlAgVGVzdCAtIGdyb3VwZWQiICk7CisJCQkgIEFERF9BVlAoIGF2cGksIE1TR19CUldfTEFTVF9DSElMRCwgYXZwY2gsIDczNTY1LCAiQVZQIFRlc3QgLSBvcyIgKTsKKwkJCSAgeworCQkJCXZhbHVlLm9zLmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSIxMjM0NTY3OCI7CisJCQkJdmFsdWUub3MubGVuID0gODsKKwkJCQlDSEVDSyggMCwgZmRfbXNnX2F2cF9zZXR2YWx1ZSAoIGF2cGNoLCAmdmFsdWUgKSApOworCQkJCSNpZiAwCisJCQkJZmRfbG9nX2RlYnVnKCJBVlAgb2N0ZXQgc3RyaW5nLCAnMTIzNDY3OCciKTsKKwkJCQlmZF9sb2dfZGVidWcoIiVzIiwgZmRfbXNnX2R1bXBfdHJlZXZpZXcoRkRfRFVNUF9URVNUX1BBUkFNUywgYXZwY2gsIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgMCwgMCkpOworCQkJCSNlbmRpZgorCQkJCUNIRUNLKCAwLCBmZF9tc2dfdXBkYXRlX2xlbmd0aCAoIGF2cGNoICkgKTsKKwkJCQlDSEVDSyggMCwgZmRfbXNnX2F2cF9oZHIgKCBhdnBjaCwgJmF2cGRhdGEgKSApOworCQkJCUNIRUNLKCAyMCwgYXZwZGF0YS0+YXZwX2xlbiApOworCQkJICB9CisJCQkgIEFERF9BVlAoIGF2cGksIE1TR19CUldfTEFTVF9DSElMRCwgYXZwY2gsIDczNTY1LCAiQVZQIFRlc3QgLSBvcyIgKTsKKwkJCSAgeworCQkJCXZhbHVlLm9zLmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSIxMjM0NTY3ODkiOworCQkJCXZhbHVlLm9zLmxlbiA9IDk7CisJCQkJQ0hFQ0soIDAsIGZkX21zZ19hdnBfc2V0dmFsdWUgKCBhdnBjaCwgJnZhbHVlICkgKTsKKwkJCQkjaWYgMAorCQkJCWZkX2xvZ19kZWJ1ZygiQVZQIG9jdGV0IHN0cmluZywgJzEyMzQ2Nzg5JyIpOworCQkJCWZkX2xvZ19kZWJ1ZygiJXMiLCBmZF9tc2dfZHVtcF90cmVldmlldyhGRF9EVU1QX1RFU1RfUEFSQU1TLCBhdnBjaCwgZmRfZ19jb25maWctPmNuZl9kaWN0LCAwLCAwKSk7CisJCQkJI2VuZGlmCisJCQkgIH0KKwkJCQorCQkJLyogQ2hlY2sgdGhlIHNpemUgaXMgdXBkYXRlZCByZWN1cnNpdmVseTogKGdhdnAgaGRyOiAxMikgKyAoYXZwMTogMjApICsgKGF2cDI6IDIxICsgMykgPSA1NiAqLworCQkJQ0hFQ0soIDAsIGZkX21zZ191cGRhdGVfbGVuZ3RoICggYXZwaSApICk7CisJCQlDSEVDSyggMCwgZmRfbXNnX2F2cF9oZHIgKCBhdnBpLCAmYXZwZGF0YSApICk7CisJCQlDSEVDSyggNTYsIGF2cGRhdGEtPmF2cF9sZW4gKTsKKwkJCQorCQkJLyogQWRkIGFub3RoZXIgc2ltaWxhciBncm91cGVkIEFWUCwgdG8gaGF2ZSBsb3Qgb2YgcGFkZGluZyAqLworCQkJQUREX0FWUCggbXNnLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cGksIDczNTY1LCAiQVZQIFRlc3QgLSBncm91cGVkIiApOworCQkJICBBRERfQVZQKCBhdnBpLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cGNoLCA3MzU2NSwgIkFWUCBUZXN0IC0gb3MiICk7CisJCQkgIHsKKwkJCQl2YWx1ZS5vcy5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikiMSI7CisJCQkJdmFsdWUub3MubGVuID0gMTsKKwkJCQlDSEVDSyggMCwgZmRfbXNnX2F2cF9zZXR2YWx1ZSAoIGF2cGNoLCAmdmFsdWUgKSApOworCQkJICB9CisJCQkgIEFERF9BVlAoIGF2cGksIE1TR19CUldfTEFTVF9DSElMRCwgYXZwY2gsIDczNTY1LCAiQVZQIFRlc3QgLSBvcyIgKTsKKwkJCSAgeworCQkJCXZhbHVlLm9zLmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSIxMjM0NTY3IjsKKwkJCQl2YWx1ZS5vcy5sZW4gPSA3OworCQkJCUNIRUNLKCAwLCBmZF9tc2dfYXZwX3NldHZhbHVlICggYXZwY2gsICZ2YWx1ZSApICk7CisJCQkgIH0KKwkJCQorCQkJLyogTm93IGNoZWNrIHRoZSBnbG9iYWwgc2l6ZSBvZiB0aGUgbWVzc2FnZSwgaWYgcGFkZGluZyBpcyBjb3JyZWN0bHkgaGFuZGxlZCAqLworCQkJLyogc2l6ZSA9IDIwIChoZWFkZXIpICsgMTIgKyAyMCArIDE2ICogMyArICgxMDEgKyAzKSArICgxNyArIDMpICsgKDE1ICsgMSkgCisJCQkgKiAgICAgICAgKyAoIDEyICsgKCAyMCArIDIxKSArIDMgKSAgICAgICAgICMgcGFkZGluZyBmb3IgdGhlIGdyb3VwZWQgQVZQID0gMworCQkJICogICAgICAgICsgKCAxMiArICggKDEzICsgMykgKyAxOSApICsgMSApICAjIGFuZCAxIGZvciB0aGlzIG9uZQorCQkJICogc2l6ZSA9IDI0MCArIDU2ICsgNDggPSAzNDQKKwkJCSAqLworCQkJQ0hFQ0soIDAsIGZkX21zZ191cGRhdGVfbGVuZ3RoICggbXNnICkgKTsKKwkJCSNpZiAwCisJCQlmZF9sb2dfZGVidWcoIiVzIiwgZmRfbXNnX2R1bXBfdHJlZXZpZXcoRkRfRFVNUF9URVNUX1BBUkFNUywgbXNnLCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIDAsIDEpKTsKKwkJCSNlbmRpZgorCQkJQ0hFQ0soIDM0NCwgbXNnZGF0YS0+bXNnX2xlbmd0aCApOworCQkJCisJCQkvKiBTZXQgdGhlIGFwcGxpY2F0aW9uIHRvIHRoZSB0ZXN0IGFwcGxpY2F0aW9uOiA3MzU2NiAqLworCQkJbXNnZGF0YS0+bXNnX2FwcGwgPSA3MzU2NjsKKwkJCQorCQkJLyogU2V0IHRoZSBob3AtYnktaG9wIElEIHRvIGEgcmFuZG9tIHZhbHVlOiAweDRiNDRiNDFkICovCisJCQltc2dkYXRhLT5tc2dfaGJoaWQgPSAweDRiNDRiNDFkOworCQkJLyogU2V0IHRoZSBlbmQtdG8tZW5kIElEIHRvIGEgcmFuZG9tIHZhbHVlOiAweGUyZWUyZTFkICovCisJCQltc2dkYXRhLT5tc2dfZXRlaWQgPSAweGUyZWUyZTFkOworCQl9CisJCQorCQkvKiBUZXN0IHRoZSBtc2dfYnVmZmVyaXplIGZ1bmN0aW9uICovCisJCXsKKwkJCQorCQkJQ0hFQ0soIDAsIGZkX21zZ19idWZmZXJpemUoIG1zZywgJmJ1ZiwgTlVMTCApICk7CisJCQkKKwkJCS8qIFRlc3QgdGhlIGZpcnN0IGJ5dGVzICovCisJCQlDSEVDSyggMHgwMSwgYnVmWzBdICk7IC8qIFZlcnNpb24gKi8KKwkJCUNIRUNLKCAweDAwLCBidWZbMV0gKTsgLyogTGVuZ3RoOiAzNDQgPSAweDAwMDE1OCAqLworCQkJQ0hFQ0soIDB4MDEsIGJ1ZlsyXSApOworCQkJQ0hFQ0soIDB4NTgsIGJ1ZlszXSApOworCQkJQ0hFQ0soIDB4ODAsIGJ1Zls0XSApOyAvKiBmbGFnczogb25seSAiUiIgaXMgc2V0LiAqLworCQkJQ0hFQ0soIDB4MDEsIGJ1Zls1XSApOyAvKiBDb21tYW5kIGNvZGU6IDczNTczID0gMHgwMTFGNjUgKi8KKwkJCUNIRUNLKCAweDFGLCBidWZbNl0gKTsKKwkJCUNIRUNLKCAweDY1LCBidWZbN10gKTsKKwkJCUNIRUNLKCAweDAwLCBidWZbOF0gKTsgLyogQXBwIElEOiA3MzU2NiA9IDB4MDAwMTFGNUUgKi8KKwkJCUNIRUNLKCAweDAxLCBidWZbOV0gKTsgCisJCQlDSEVDSyggMHgxRiwgYnVmWzEwXSApOworCQkJQ0hFQ0soIDB4NUUsIGJ1ZlsxMV0gKTsKKwkJCUNIRUNLKCAweDRiLCBidWZbMTJdICk7IC8qIGhvcC1ieS1ob3AgaWQ6IDB4NGI0NGI0MWQgKi8KKwkJCUNIRUNLKCAweDQ0LCBidWZbMTNdICk7CisJCQlDSEVDSyggMHhiNCwgYnVmWzE0XSApOworCQkJQ0hFQ0soIDB4MWQsIGJ1ZlsxNV0gKTsKKwkJCUNIRUNLKCAweGUyLCBidWZbMTZdICk7IC8qIGVuZC10by1lbmQgaWQ6IDB4ZTJlZTJlMWQgKi8KKwkJCUNIRUNLKCAweGVlLCBidWZbMTddICk7CisJCQlDSEVDSyggMHgyZSwgYnVmWzE4XSApOworCQkJQ0hFQ0soIDB4MWQsIGJ1ZlsxOV0gKTsKKwkJCQorCQkJQ0hFQ0soIDB4MDAsIGJ1ZlsyMF0gKTsgLyogRmlyc3QgQVZQIChBVlAgVGVzdCAtIG5vIHZlbmRvciAtIGYzMikgYmVnaW46IGNvZGUgNzM1NjcgPSAweDAwMDExRjVGICovCisJCQlDSEVDSyggMHgwMSwgYnVmWzIxXSApOworCQkJQ0hFQ0soIDB4MUYsIGJ1ZlsyMl0gKTsKKwkJCUNIRUNLKCAweDVGLCBidWZbMjNdICk7CisJCQlDSEVDSyggMHgwMCwgYnVmWzI0XSApOyAvKiBmbGFnczogMCAqLworCQkJQ0hFQ0soIDB4MDAsIGJ1ZlsyNV0gKTsgLyogbGVuZ3RoOiAxMiA9IDB4MDAwMDBjICovCisJCQlDSEVDSyggMHgwMCwgYnVmWzI2XSApOworCQkJQ0hFQ0soIDB4MEMsIGJ1ZlsyN10gKTsKKwkJCUNIRUNLKCAweDQwLCBidWZbMjhdICk7IC8qIFZhbHVlOiAzLjE0MTU6ICBzaWduID0gJysnID0+IG1vc3Qgc2lnbmlmaWNhbnQgYml0ID0gMCAqLworCQkJQ0hFQ0soIDB4NDksIGJ1ZlsyOV0gKTsgLyogMiA8PSAzLjE0MTUgPCA0ID0+IGV4cG9uZW50ID0gMSA9PiBiaWFpc2VkIChvbiA4IGJpdHMpID0gKGRlY2ltYWwpIDEyOCA9IChiaW5hcnkpIDEwMCAwMDAwIDAgKi8KKwkJCUNIRUNLKCAweDBlLCBidWZbMzBdICk7IC8qIHNpZ25pZmljYW5kID0gKGRlY2ltYWwpIDEuNTcwNzUgPSAoYmluYXJ5KSAxLjEwMCAxMDAxIDAwMDAgMTExMCAwMTAxIDAxMTAgKi8KKwkJCUNIRUNLKCAweDU2LCBidWZbMzFdICk7IC8qIHRvdGFsID0+IDAxMDAgMDAwMCAwMTAwIDEwMDEgMDAwMCAxMTEwIDAxMDEgMDExMCA9IChoZXhhKSA0MCA0OSAwZSA1NiovCisJCQkKKwkJCS8qIFRoZSBvdGhlciBBVlBzIHdpbGwgYmUgdGVzdGVkIGJ5IHN1Y2Nlc3NmdWwgcGFyc2luZy4uLiAqLworCQl9CisJCQorCQkvKiBOb3cgZnJlZSB0aGUgbWVzc2FnZSwgd2Uga2VlcCBvbmx5IHRoZSBidWZmZXIuICovCisJCUNIRUNLKCAwLCBmZF9tc2dfZnJlZSggbXNnICkgKTsKKwkJCisJfQorCQorCS8qIFRlc3QgdGhlIHBhcnNpbmcgb2YgYnVmZmVycyBhbmQgbWVzc2FnZXMgKi8KKwl7CisJCXVuc2lnbmVkIGNoYXIgKiBidWZfY3B5ID0gTlVMTDsKKwkJc3RydWN0IG1zZyAqIG1zZzsKKwkJCisJCSNkZWZpbmUgQ1BZQlVGKCkgewkJCVwKKwkJCWJ1Zl9jcHkgPSBtYWxsb2MoMzQ0KTsJCVwKKwkJCUNIRUNLKCBidWZfY3B5ID8gMSA6IDAsIDEpOwlcCisJCQltZW1jcHkoYnVmX2NweSwgYnVmLCAzNDQpOwlcCisJCX0KKwkJCisJCS8qIFRlc3QgdGhlIG1zZ19wYXJzZV9idWZmZXIgZnVuY3Rpb24gKi8KKwkJeworCQkJQ1BZQlVGKCk7CisJCQlDSEVDSyggRUJBRE1TRywgZmRfbXNnX3BhcnNlX2J1ZmZlciggJmJ1Zl9jcHksIDM0MCwgJm1zZykgKTsKKwkJCQorCQkJQ1BZQlVGKCk7CisJCQlDSEVDSyggMCwgZmRfbXNnX3BhcnNlX2J1ZmZlciggJmJ1Zl9jcHksIDM0NCwgJm1zZykgKTsKKwkJCSNpZiAwCisJCQlmZF9sb2dfZGVidWcoIiVzIiwgZmRfbXNnX2R1bXBfdHJlZXZpZXcoRkRfRFVNUF9URVNUX1BBUkFNUywgbXNnLCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIDAsIDEpKTsKKwkJCSNlbmRpZgorCQkJCisJCQkvKiByZWluaXQgdGhlIG1zZyAqLworCQkJQ0hFQ0soIDAsIGZkX21zZ19mcmVlICggbXNnICkgKTsKKwkJCQkKKwkJfQorCQkKKwkJLyogVGVzdCB0aGUgZmRfbXNnX3NlYXJjaF9hdnAgZnVuY3Rpb24gKi8KKwkJeworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwX21vZGVsOworCQkJc3RydWN0IGF2cCAJICAgKiBmb3VuZDsKKwkJCXN0cnVjdCBhdnBfaGRyICAgICAqIGF2cGRhdGEgPSBOVUxMOworCQkJCisJCQkvKiBOb3cgZmluZCB0aGUgQUNSIGRpY3Rpb25hcnkgb2JqZWN0ICovCisJCQlDSEVDSyggMCwgZmRfZGljdF9zZWFyY2ggKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRSwgIkFWUCBUZXN0IC0gbm8gdmVuZG9yIC0gZjMyIiwgJmF2cF9tb2RlbCwgRU5PRU5UICkgKTsKKwkJCQorCQkJQ1BZQlVGKCk7CisJCQlDSEVDSyggMCwgZmRfbXNnX3BhcnNlX2J1ZmZlciggJmJ1Zl9jcHksIDM0NCwgJm1zZykgKTsKKwkJCQorCQkJLyogU2VhcmNoIHRoaXMgQVZQIGluc3RhbmNlIGluIHRoZSBtc2cgKi8KKwkJCUNIRUNLKCAwLCBmZF9tc2dfc2VhcmNoX2F2cCggbXNnLCBhdnBfbW9kZWwsICZmb3VuZCApICk7CisJCQkKKwkJCS8qIENoZWNrIHRoZSBBVlAgdmFsdWUgaXMgMy4xNDE1ICovCisJCQlDSEVDSyggMCwgZmRfbXNnX2F2cF9oZHIgKCBmb3VuZCwgJmF2cGRhdGEgKSApOworCQkJQ0hFQ0soIDMuMTQxNUYsIGF2cGRhdGEtPmF2cF92YWx1ZS0+ZjMyICk7CisJCQkKKwkJCS8qIHJlaW5pdCB0aGUgbXNnICovCisJCQlDSEVDSyggMCwgZmRfbXNnX2ZyZWUgKCBtc2cgKSApOworCQkJCQorCQl9CisJCQorCQkvKiBUZXN0IHRoZSBtc2dfcGFyc2VfZGljdCBmdW5jdGlvbiAqLworCQl7CisJCQkvKiBUZXN0IHdpdGggYW4gdW5rbm93biBjb21tYW5kIGNvZGUgKi8KKwkJCXsKKwkJCQlDUFlCVUYoKTsKKwkJCQkKKwkJCQkvKiBDaGFuZ2UgdGhlIGNvbW1hbmQtY29kZSAqLworCQkJCWJ1Zl9jcHlbNV0gPSAweDExOworCQkJCUNIRUNLKCAwLCBmZF9tc2dfcGFyc2VfYnVmZmVyKCAmYnVmX2NweSwgMzQ0LCAmbXNnKSApOworCQkJCUNIRUNLKCBFTk9UU1VQLCBmZF9tc2dfcGFyc2VfZGljdCggbXNnLCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIE5VTEwgKSApOworCQkJCQorCQkJCS8qIHJlc2V0ICovCisJCQkJQ0hFQ0soIDAsIGZkX21zZ19mcmVlICggbXNnICkgKTsKKwkJCX0KKwkJCQorCQkJLyogVGVzdCB3aXRoIGFuIHVua25vd24gTWFuZGF0b3J5IEFWUCAqLworCQkJeworCQkJCUNQWUJVRigpOworCQkJCQorCQkJCWJ1Zl9jcHlbMjBdID0gMHgxMTsJLyogTmV3IEFWUCBjb2RlID0gMHgxMTAxMUY1RiwgdW5kZWZpbmVkICovCisJCQkJYnVmX2NweVsyNF0gPSAweDQwOyAJLyogQWRkIHRoZSAnTScgZmxhZyAqLworCQkJCQorCQkJCS8qIENoZWNrIHRoYXQgd2UgY2Fubm90IHN1cHBvcnQgdGhpcyBtZXNzYWdlIG5vdyAqLworCQkJCUNIRUNLKCAwLCBmZF9tc2dfcGFyc2VfYnVmZmVyKCAmYnVmX2NweSwgMzQ0LCAmbXNnKSApOworCQkJCUNIRUNLKCBFTk9UU1VQLCBmZF9tc2dfcGFyc2VfZGljdCggbXNnLCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIE5VTEwgKSApOworCQkJCQorCQkJCS8qIHJlc2V0ICovCisJCQkJQ0hFQ0soIDAsIGZkX21zZ19mcmVlICggbXNnICkgKTsKKwkJCX0KKwkJCQorCQkJLyogVGVzdCB3aXRoIGFuIHVua25vd24gb3B0aW9uYWwgQVZQICovCisJCQl7CisJCQkJQ1BZQlVGKCk7CisJCQkJCisJCQkJYnVmX2NweVsyMF0gPSAweDExOwkvKiBOZXcgQVZQIGNvZGUgPSAweDExMDExRjVGLCB1bmRlZmluZWQgKi8KKwkJCQkKKwkJCQkvKiBDaGVjayB0aGF0IHdlIGNhbiBzdXBwb3J0IHRoaXMgbWVzc2FnZSBub3cgKi8KKwkJCQlDSEVDSyggMCwgZmRfbXNnX3BhcnNlX2J1ZmZlciggJmJ1Zl9jcHksIDM0NCwgJm1zZykgKTsKKwkJCQlDSEVDSyggMCwgZmRfbXNnX3BhcnNlX2RpY3QoIG1zZywgZmRfZ19jb25maWctPmNuZl9kaWN0LCBOVUxMICkgKTsKKwkJCQkKKwkJCQkjaWYgMAorCQkJCWZkX2xvZ19kZWJ1ZygiJXMiLCBmZF9tc2dfZHVtcF90cmVldmlldyhGRF9EVU1QX1RFU1RfUEFSQU1TLCBtc2csIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgMCwgMSkpOworCQkJCSNlbmRpZgorCQkJCQorCQkJCS8qIHJlc2V0ICovCisJCQkJQ0hFQ0soIDAsIGZkX21zZ19mcmVlICggbXNnICkgKTsKKwkJCX0KKwkJCQorCQkJLyogVGVzdCB3aXRoIGFuIGludmFsaWQgQVZQIChkZWZpbml0aW9uIG1pc21hdGNoIHdpdGggdGhlIGRpY3Rpb25hcnkpICovCisJCQl7CisJCQkJQ1BZQlVGKCk7CisJCQkJCisJCQkJYnVmX2NweVsyMV0gPSAweDAyOwkvKiBOZXcgQVZQIGNvZGUgPSAweDAwMDIxRjVGLCBmNjQgdHlwZSBpbiB0aGUgZGljdGlvbmFyeSAqLworCQkJCQorCQkJCQorCQkJCS8qIENoZWNrIHRoYXQgd2UgY2Fubm90IHN1cHBvcnQgdGhpcyBtZXNzYWdlIG5vdyAqLworCQkJCUNIRUNLKCAwLCBmZF9tc2dfcGFyc2VfYnVmZmVyKCAmYnVmX2NweSwgMzQ0LCAmbXNnKSApOworCQkJCUNIRUNLKCBFQkFETVNHLCBmZF9tc2dfcGFyc2VfZGljdCggbXNnLCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIE5VTEwgKSApOworCQkJCQorCQkJCS8qIHJlc2V0ICovCisJCQkJQ0hFQ0soIDAsIGZkX21zZ19mcmVlICggbXNnICkgKTsKKwkJCX0KKwkJCQorCQkJLyogVGVzdCB3aXRoIGEgdHlwZSB2ZXJpZmllciAqLworCQkJeworCQkJCXN0cnVjdCBmZF9wZWkgZXJyb3JfaW5mbzsKKwkJCQlDUFlCVUYoKTsKKwkJCQlidWZfY3B5WzEwM10gPSAweDY3OwkvKiBSZXBsYWNlZCBBVlAgY29kZSA9IDB4MDAwMTFGNjcsIE9TIHRlc3QyIHR5cGUgaW4gdGhlIGRpY3Rpb25hcnkgKi8KKwkJCQkKKwkJCQkvKiBDaGVjayB0aGF0IHdlIGNhbm5vdCBzdXBwb3J0IHRoaXMgbWVzc2FnZSBub3cgKi8KKwkJCQlDSEVDSyggMCwgZmRfbXNnX3BhcnNlX2J1ZmZlciggJmJ1Zl9jcHksIDM0NCwgJm1zZykgKTsKKwkJCQlDSEVDSyggRUJBRE1TRywgZmRfbXNnX3BhcnNlX2RpY3QoIG1zZywgZmRfZ19jb25maWctPmNuZl9kaWN0LCBOVUxMICkgKTsKKwkJCQkKKwkJCQkvKiByZXNldCAqLworCQkJCUNIRUNLKCAwLCBmZF9tc2dfZnJlZSAoIG1zZyApICk7CisKKwkJCQlDUFlCVUYoKTsKKwkJCQlidWZfY3B5WzEwM10gPSAweDY3OwkvKiBSZXBsYWNlZCBBVlAgY29kZSA9IDB4MDAwMTFGNjcsIE9TIHRlc3QyIHR5cGUgaW4gdGhlIGRpY3Rpb25hcnkgKi8KKwkJCQkKKwkJCQkvKiBDaGVjayBlcnJvciByZXBvcnRpbmcgd29ya3MgKi8KKwkJCQlDSEVDSyggMCwgZmRfbXNnX3BhcnNlX2J1ZmZlciggJmJ1Zl9jcHksIDM0NCwgJm1zZykgKTsKKwkJCQlDSEVDSyggRUJBRE1TRywgZmRfbXNnX3BhcnNlX2RpY3QoIG1zZywgZmRfZ19jb25maWctPmNuZl9kaWN0LCAmZXJyb3JfaW5mbyApICk7CisJCQkJCisJCQkJI2lmIDEKKwkJCQlmZF9sb2dfZGVidWcoIkVycm9yIHJlcG9ydGVkOiAlc1xuIGluIEFWUDogJXMiLCBlcnJvcl9pbmZvLnBlaV9tZXNzYWdlLCBmZF9tc2dfZHVtcF90cmVldmlldyhGRF9EVU1QX1RFU1RfUEFSQU1TLCBlcnJvcl9pbmZvLnBlaV9hdnAsIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgMCwgMSkpOworCQkJCSNlbmRpZgorCQkJCQorCQkJCS8qIHJlc2V0ICovCisJCQkJQ0hFQ0soIDAsIGZkX21zZ19mcmVlICggbXNnICkgKTsKKwkJCQkKKwkJCQlDUFlCVUYoKTsKKwkJCQlidWZfY3B5WzEwM10gPSAweDY3OwkvKiBSZXBsYWNlZCBBVlAgY29kZSA9IDB4MDAwMTFGNjcsIE9TIHRlc3QyIHR5cGUgaW4gdGhlIGRpY3Rpb25hcnkgKi8KKwkJCQlidWZfY3B5WzEzMF0gPSAnQCc7CisJCQkJYnVmX2NweVsxNDBdID0gJy4nOyAgICAgLyogbm93IHdlIGNvbXBseSB0byB0aGUgY29uc3RyYWludHMgKi8KKwkJCQkKKwkJCQkvKiBDaGVjayB0aGF0IHdlIGNhbm5vdCBzdXBwb3J0IHRoaXMgbWVzc2FnZSBub3cgKi8KKwkJCQlDSEVDSyggMCwgZmRfbXNnX3BhcnNlX2J1ZmZlciggJmJ1Zl9jcHksIDM0NCwgJm1zZykgKTsKKwkJCQlDSEVDSyggMCwgZmRfbXNnX3BhcnNlX2RpY3QoIG1zZywgZmRfZ19jb25maWctPmNuZl9kaWN0LCBOVUxMICkgKTsKKwkJCQkKKwkJCQkvKiByZXNldCAqLworCQkJCUNIRUNLKCAwLCBmZF9tc2dfZnJlZSAoIG1zZyApICk7CisJCQkJCisJCQkJCisJCQl9CisJCQkKKwkJCXsKKwkJCQl1bnNpZ25lZCBjaGFyICogYnVmdG1wID0gTlVMTDsKKwkJCQlzdHJ1Y3QgbXNnICogZXJyb3I7CisJCQkJLyogQ2hlY2sgdGhlIHBhcnNlIG9yIGVycm9yIHdvcmtzIGFzIGV4cGVjdGVkICovCisJCQkJQ1BZQlVGKCk7CisJCQkJCisJCQkJYnVmX2NweVsyMV0gPSAweDAyOwkvKiBOZXcgQVZQIGNvZGUgPSAweDAwMDIxRjVGLCBmNjQgdHlwZSBpbiB0aGUgZGljdGlvbmFyeSAqLworCQkJCQorCQkJCS8qIENoZWNrIHRoYXQgd2UgY2Fubm90IHN1cHBvcnQgdGhpcyBtZXNzYWdlIG5vdyAqLworCQkJCUNIRUNLKCAwLCBmZF9tc2dfaW5pdCgpICk7CisJCQkJQ0hFQ0soIDAsIGZkX21zZ19wYXJzZV9idWZmZXIoICZidWZfY3B5LCAzNDQsICZtc2cpICk7CisJCQkJQ0hFQ0soIEVCQURNU0csIGZkX21zZ19wYXJzZV9vcl9lcnJvciggJm1zZywgJmVycm9yICkgKTsKKwkJCQlDSEVDSyggTlVMTCwgbXNnICk7CisJCQkJbXNnID0gZXJyb3I7CisJCQkJCisJCQkJQ0hFQ0soIDAsIGZkX21zZ19idWZmZXJpemUoIG1zZywgJmJ1ZnRtcCwgTlVMTCApICk7CQkJCQorCQkJCQorCQkJCWZkX2xvZ19kZWJ1ZygiJXMiLCBmZF9tc2dfZHVtcF90cmVldmlldyhGRF9EVU1QX1RFU1RfUEFSQU1TLCBtc2csIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgMCwgMSkpOworCQkJCQorCQkJCVRPRE8oIkNoZWNrIHRoZSBGYWlsZWQtQVZQIGlzIGFzIGV4cGVjdGVkIik7CisJCQkJCisJCQkJCisJCQkJLyogcmVzZXQgKi8KKwkJCQlDSEVDSyggMCwgZmRfbXNnX2ZyZWUgKCBtc2cgKSApOworCQkJCWZyZWUoYnVmdG1wKTsKKwkJCX0KKwkJCQorCQkJCisJCQlDSEVDSyggMCwgZmRfbXNnX3BhcnNlX2J1ZmZlciggJmJ1ZiwgMzQ0LCAmbXNnKSApOworCQkJQ0hFQ0soIDAsIGZkX21zZ19wYXJzZV9kaWN0KCBtc2csIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgTlVMTCApICk7CisJCQkjaWYgMAorCQkJZmRfbG9nX2RlYnVnKCIlcyIsIGZkX21zZ19kdW1wX3RyZWV2aWV3KEZEX0RVTVBfVEVTVF9QQVJBTVMsIG1zZywgZmRfZ19jb25maWctPmNuZl9kaWN0LCAwLCAxKSk7CisJCQkjZW5kaWYKKwkJfQorCQkKKwkJLyogTm93IHRlc3QgdGhlIG1zZ19wYXJzZV9ydWxlIGZ1bmN0aW9uICovCisJCXsKKwkJCXN0cnVjdCBmZF9wZWkgcGVpOworCQkJCisJCQlDSEVDSyggMCwgZmRfbXNnX3BhcnNlX3J1bGVzKCBtc2csIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgJnBlaSApICk7CisJCQkKKwkJCS8qIFVzZSB0aGUgIkFWUCBUZXN0IC0gcnVsZXMiIEFWUCB0byB0ZXN0IHRoZSBydWxlcyAqLworCQkJeworCQkJCXN0cnVjdCBhdnAgKiB0YXZwID0gTlVMTDsKKwkJCQlzdHJ1Y3QgYXZwICogdGVtcGF2cCA9IE5VTEw7CisJCQkJc3RydWN0IGF2cCAqIGNoaWxkYXZwID0gTlVMTDsKKwkJCQkKKwkJCQlBRERfQVZQKCBtc2csIE1TR19CUldfTEFTVF9DSElMRCwgdGF2cCwgNzM1NjUsICJBVlAgVGVzdCAtIHJ1bGVzIiApOworCQkJCQorCQkJCS8qIENyZWF0ZSBhIGNvbmZvcm1pbmcgbWVzc2FnZSBmaXJzdCAqLworCQkJCUFERF9BVlAoIHRhdnAsIE1TR19CUldfTEFTVF9DSElMRCwgY2hpbGRhdnAsICAgICAwLCAiQVZQIFRlc3QgLSBubyB2ZW5kb3IgLSBmMzIiICk7CisJCQkJQUREX0FWUCggdGF2cCwgTVNHX0JSV19MQVNUX0NISUxELCBjaGlsZGF2cCwgNzM1NjUsICJBVlAgVGVzdCAtIGk2NCIgKTsKKwkJCQlBRERfQVZQKCB0YXZwLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGNoaWxkYXZwLCA3MzU2NSwgIkFWUCBUZXN0IC0gZW51bWkzMiIgKTsKKwkJCQlBRERfQVZQKCB0YXZwLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGNoaWxkYXZwLCA3MzU2NSwgIkFWUCBUZXN0IC0gb3MiICk7CisJCQkJQUREX0FWUCggdGF2cCwgTVNHX0JSV19MQVNUX0NISUxELCBjaGlsZGF2cCwgNzM1NjUsICJBVlAgVGVzdCAtIG9zIiApOworCQkJCUFERF9BVlAoIHRhdnAsIE1TR19CUldfTEFTVF9DSElMRCwgY2hpbGRhdnAsIDczNTY1LCAiQVZQIFRlc3QgLSBncm91cGVkIiApOworCQkJCQorCQkJCS8qIENoZWNrIHRoZSBtZXNzYWdlIGlzIHN0aWxsIGNvbmZvcm0gKi8KKwkJCQlDSEVDSyggMCwgZmRfbXNnX3BhcnNlX3J1bGVzKCBtc2csIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgJnBlaSApICk7CisJCQkJCisJCQkJLyogVGhlIGZpcnN0IGF2cCBpcyBvcHRpb25hbCBpbiBmaXhlZCBwb3NpdGlvbiwgc28gcmVtb3ZlIGl0IGFuZCBjaGVjayB0aGUgbWVzc2FnZSBpcyBzdGlsbCBPSyAqLworCQkJCUNIRUNLKCAwLCBmZF9tc2dfYnJvd3NlICggdGF2cCwgTVNHX0JSV19GSVJTVF9DSElMRCwgJmNoaWxkYXZwLCBOVUxMKSApOworCQkJCUNIRUNLKCAwLCBmZF9tc2dfZnJlZSAoIGNoaWxkYXZwICkgKTsKKwkJCQlDSEVDSyggMCwgZmRfbXNnX3BhcnNlX3J1bGVzKCBtc2csIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgJnBlaSApICk7CisJCQkJQUREX0FWUCggdGF2cCwgTVNHX0JSV19GSVJTVF9DSElMRCwgY2hpbGRhdnAsICAgICAwLCAiQVZQIFRlc3QgLSBubyB2ZW5kb3IgLSBmMzIiICk7CisJCQkJCisJCQkJCisJCQkJLyogTm93IGJyZWFrIHNvbWUgcnVsZXMgYW5kIGNoZWNrIGl0IGlzIGRldGVjdGVkICovCisJCQkJI2RlZmluZSBDSEVDS19DT05GTElDVCggX21zZywgX2Vycm9yLCBfY29uZmxpY3RhdnBfbmFtZSwgX2NvbmZsaWN0YXZwX3ZuZCApCQl7CVwKKwkJCQkJc3RydWN0IGZkX3BlaSBfcGVpOwkJCQkJCQkJCVwKKwkJCQkJQ0hFQ0soIEVCQURNU0csICBmZF9tc2dfcGFyc2VfcnVsZXMoIF9tc2csIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgJl9wZWkgKSApOwkJXAorCQkJCQlpZiAoX2Vycm9yKSB7CQkJCQkJCQkJCVwKKwkJCQkJCUNIRUNLKCAwLCBzdHJjbXAoIF9lcnJvciwgX3BlaS5wZWlfZXJyY29kZSApICk7CQkJCQlcCisJCQkJCX0JCQkJCQkJCQkJCVwKKwkJCQkJaWYgKChfY29uZmxpY3RhdnBfbmFtZSkgPT0gTlVMTCkgewkJCQkJCQlcCisJCQkJCQlDSEVDSyggTlVMTCwgX3BlaS5wZWlfYXZwKTsJCQkJCQkJXAorCQkJCQl9IGVsc2UgewkJCQkJCQkJCQlcCisJCQkJCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBfcmVxID0geyAoX2NvbmZsaWN0YXZwX3ZuZCksIDAsIChfY29uZmxpY3RhdnBfbmFtZSkgfTsJXAorCQkJCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogICAgX2F2cDsJCQkJCQkJXAorCQkJCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogX2NvbmZsaWN0OwkJCQkJCQlcCisJCQkJCQlDSEVDSyggMSwgKF9wZWkucGVpX2F2cCkgPyAxIDogMCApOwkJCQkJCVwKKwkJCQkJCUNIRUNLKCAwLCBmZF9tc2dfbW9kZWwoIF9wZWkucGVpX2F2cCwgJl9jb25mbGljdCApICk7CQkJCVwKKwkJCQkJCUNIRUNLKCAwLCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJl9yZXEsICZfYXZwLCBFTk9FTlQpKTsJXAorCQkJCQkJQ0hFQ0soIF9hdnAsIF9jb25mbGljdCApOwkJCQkJCQlcCisJCQkJCX0JCQkJCQkJCQkJCVwKKwkJCQl9CisKKwkJCS8qIEFCTkYgOiAKKwkJCQk8IG5vIHZlbmRvciAtIGYzMiA+CisJCQkJPCBpNjQgPgorCQkJCTwgZW51bWkzMiA+CisJCQkgICAgMiozIHsgb3MgfQorCQkJICAgICAqMSBbIGVudW1vcyBdCisJCQkJPCBncm91cGVkID4KKwkJCQkJCSovCisJCQkJeworCQkJCQkvKiBUZXN0IHRoZSBGSVhFRF9IRUFEIHJ1bGVzIHBvc2l0aW9uczogYWRkIGFub3RoZXIgQVZQIGJlZm9yZSB0aGUgdGhpcmQgKi8KKwkJCQkJQ0hFQ0soIDAsIGZkX21zZ19icm93c2UgKCB0YXZwLCBNU0dfQlJXX0ZJUlNUX0NISUxELCAmdGVtcGF2cCwgTlVMTCkgKTsgLyogdGVtcGF2cCBpcyB0aGUgbm92ZW5kb3IgYXZwICovCisJCQkJCUNIRUNLKCAwLCBmZF9tc2dfYnJvd3NlICggdGVtcGF2cCwgTVNHX0JSV19ORVhULCAmdGVtcGF2cCwgTlVMTCkgKTsgICAgIC8qIHRlbXBhdnAgaXMgdGhlIGk2NCBhdnAgKi8KKwkJCQkJQUREX0FWUCggdGVtcGF2cCwgTVNHX0JSV19ORVhULCBjaGlsZGF2cCwgNzM1NjUsICJBVlAgVGVzdCAtIG9zIiApOworCQkJCQkKKwkJCQkJQ0hFQ0tfQ09ORkxJQ1QoIG1zZywgIkRJQU1FVEVSX01JU1NJTkdfQVZQIiwgIkFWUCBUZXN0IC0gZW51bWkzMiIsIDczNTY1ICk7CisJCQkJCQorCQkJCQkvKiBOb3cgcmVtb3ZlIHRoaXMgQVZQICovCisJCQkJCUNIRUNLKCAwLCBmZF9tc2dfZnJlZSAoIGNoaWxkYXZwICkgKTsKKwkJCQl9CisJCQkJeworCQkJCQkvKiBSZW1vdmUgdGhlIHRoaXJkIEFWUCwgc2FtZSBydWxlIG11c3QgY29uZmxpY3QgKi8KKwkJCQkJQ0hFQ0soIDAsIGZkX21zZ19icm93c2UgKCB0ZW1wYXZwLCBNU0dfQlJXX05FWFQsICZjaGlsZGF2cCwgTlVMTCkgKTsgICAgIC8qIGNoaWxkYXZwIGlzIHRoZSBlbnVtaTMyIGF2cCAqLworCQkJCQlDSEVDSyggMCwgZmRfbXNnX2ZyZWUgKCBjaGlsZGF2cCApICk7CisJCQkJCQorCQkJCQlDSEVDS19DT05GTElDVCggbXNnLCAiRElBTUVURVJfTUlTU0lOR19BVlAiLCAiQVZQIFRlc3QgLSBlbnVtaTMyIiwgNzM1NjUgKTsKKwkJCQkJCisJCQkJCS8qIEFkZCB0aGUgQVZQIGJhY2sgKi8KKwkJCQkJQUREX0FWUCggdGVtcGF2cCwgTVNHX0JSV19ORVhULCBjaGlsZGF2cCwgNzM1NjUsICJBVlAgVGVzdCAtIGVudW1pMzIiICk7CisJCQkJfQorCQkJCQorCQkJCXsKKwkJCQkJLyogVGVzdCB0aGUgbWluaW11bSB2YWx1ZSBpbiB0aGUgUkVRVUlSRUQgcnVsZTogZGVsZXRlIG9uZSBvZiB0aGUgb3MgQVZQcyAqLworCQkJCQlDSEVDSyggMCwgZmRfbXNnX2Jyb3dzZSAoIGNoaWxkYXZwLCBNU0dfQlJXX05FWFQsICZ0ZW1wYXZwLCBOVUxMKSApOyAgICAgLyogdGVtcGF2cCBpcyB0aGUgb3MgYXZwICovCisJCQkJCUNIRUNLKCAwLCBmZF9tc2dfZnJlZSAoIHRlbXBhdnAgKSApOworCQkJCQkKKwkJCQkJQ0hFQ0tfQ09ORkxJQ1QoIG1zZywgIkRJQU1FVEVSX01JU1NJTkdfQVZQIiwgIkFWUCBUZXN0IC0gb3MiLCA3MzU2NSApOyAvKiBUaGUgcnVsZSByZXF1aXJlcyBhdCBsZWFzdCAyIEFWUCwgd2UgaGF2ZSBvbmx5IDEgKi8KKwkJCQkJCisJCQkJCS8qIE5vdyBhZGQgdGhpcyBBVlAgKi8KKwkJCQkJQUREX0FWUCggY2hpbGRhdnAsIE1TR19CUldfTkVYVCwgdGVtcGF2cCwgNzM1NjUsICJBVlAgVGVzdCAtIG9zIiApOworCQkJCX0KKwkJCQl7CisJCQkJCS8qIFRlc3QgdGhlIG1heGltdW0gdmFsdWUgaW4gdGhlIFJFUVVJUkVEIHJ1bGU6IGFkZCBtb3JlIG9mIHRoZSBvcyBBVlBzICovCisJCQkJCUFERF9BVlAoIGNoaWxkYXZwLCBNU0dfQlJXX05FWFQsIHRlbXBhdnAsIDczNTY1LCAiQVZQIFRlc3QgLSBvcyIgKTsKKwkJCQkJQUREX0FWUCggY2hpbGRhdnAsIE1TR19CUldfTkVYVCwgdGVtcGF2cCwgNzM1NjUsICJBVlAgVGVzdCAtIG9zIiApOworCQkJCQkKKwkJCQkJQ0hFQ0tfQ09ORkxJQ1QoIG1zZywgIkRJQU1FVEVSX0FWUF9PQ0NVUlNfVE9PX01BTllfVElNRVMiLCAiQVZQIFRlc3QgLSBvcyIsIDczNTY1ICk7IC8qIFRoZSBydWxlIHJlcXVpcmVzIGF0IG1vc3QgMyBBVlAsIHdlIGhhdmUgNCAqLworCQkJCQkKKwkJCQkJLyogTm93IGRlbGV0ZSB0aGVzZSBBVlAgKi8KKwkJCQkJQ0hFQ0soIDAsIGZkX21zZ19mcmVlICggdGVtcGF2cCApICk7CisJCQkJCUNIRUNLKCAwLCBmZF9tc2dfYnJvd3NlICggY2hpbGRhdnAsIE1TR19CUldfTkVYVCwgJnRlbXBhdnAsIE5VTEwpICk7CisJCQkJCUNIRUNLKCAwLCBmZF9tc2dfZnJlZSAoIHRlbXBhdnAgKSApOworCQkJCX0KKwkJCQkKKwkJCQl7CisJCQkJCS8qIFRlc3QgdGhlIG1heGltdW0gdmFsdWUgaW4gdGhlIE9QVElPTkFMIHJ1bGU6IGFkZCAyIGVudW1vcyBBVlBzICovCisJCQkJCUFERF9BVlAoIGNoaWxkYXZwLCBNU0dfQlJXX05FWFQsIHRlbXBhdnAsIDczNTY1LCAiQVZQIFRlc3QgLSBlbnVtb3MiICk7CisJCQkJCQorCQkJCQkvKiBUaGUgbWVzc2FnZSBpcyBzdGlsbCBjb25mb3JtICovCisJCQkJCUNIRUNLKCAwLCBmZF9tc2dfcGFyc2VfcnVsZXMoIG1zZywgZmRfZ19jb25maWctPmNuZl9kaWN0LCAmcGVpICkgKTsKKwkJCQkJCisJCQkJCS8qIE5vdyBicmVhayB0aGUgcnVsZSAqLworCQkJCQlBRERfQVZQKCBjaGlsZGF2cCwgTVNHX0JSV19ORVhULCB0ZW1wYXZwLCA3MzU2NSwgIkFWUCBUZXN0IC0gZW51bW9zIiApOworCQkJCQkKKwkJCQkJQ0hFQ0tfQ09ORkxJQ1QoIG1zZywgIkRJQU1FVEVSX0FWUF9PQ0NVUlNfVE9PX01BTllfVElNRVMiLCAiQVZQIFRlc3QgLSBlbnVtb3MiLCA3MzU2NSApOworCQkJCQkKKwkJCQkJLyogTm93IGRlbGV0ZSB0aGlzIEFWUCAqLworCQkJCQlDSEVDSyggMCwgZmRfbXNnX2ZyZWUgKCB0ZW1wYXZwICkgKTsKKwkJCQl9CisJCQkJCisJCQkJeworCQkJCQkvKiBUZXN0IHRoZSBSVUxFX0ZJWEVEX1RBSUwgcnVsZXMgcG9zaXRpb25zOiBhZGQgYW5vdGhlciBBVlAgYXQgdGhlIGVuZCAqLworCQkJCQlBRERfQVZQKCB0YXZwLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGNoaWxkYXZwLCA3MzU2NSwgIkFWUCBUZXN0IC0gb3MiICk7CisJCQkJCQorCQkJCQlDSEVDS19DT05GTElDVCggbXNnLCAiRElBTUVURVJfTUlTU0lOR19BVlAiLCAiQVZQIFRlc3QgLSBncm91cGVkIiwgNzM1NjUgKTsKKwkJCQkJCisJCQkJCS8qIE5vdyByZW1vdmUgdGhpcyBBVlAgKi8KKwkJCQkJQ0hFQ0soIDAsIGZkX21zZ19mcmVlICggY2hpbGRhdnAgKSApOworCQkJCX0KKwkJCX0KKwkJfQorCQkKKwkJLyogVGVzdCB0aGUgZmRfbXNnX25ld19hbnN3ZXJfZnJvbV9yZXEgZnVuY3Rpb24gKi8KKwkJeworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICogY21kX21vZGVsID0gTlVMTDsKKwkJCXN0cnVjdCBtc2cgICAgICAgICAqIG1zZyA9IE5VTEw7CisJCQlzdHJ1Y3QgYXZwICogcGkxLCAqcGkyLCAqYXZwOworCQkJY2hhciAqIGhvc3QxPSJob3N0MSIsICogaG9zdDI9Imhvc3QyIjsKKwkJCXVuaW9uIGF2cF92YWx1ZSAgICAgIHZhbHVlOworCQkJc3RydWN0IG1zZ19oZHIgKiBtc2dkYXRhID0gTlVMTDsKKwkJCQorCQkJQ0hFQ0soIDAsIGZkX2RpY3Rfc2VhcmNoICggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0NPTU1BTkQsIENNRF9CWV9OQU1FLCAiVGVzdC1Db21tYW5kLVJlcXVlc3QiLCAmY21kX21vZGVsLCBFTk9FTlQgKSApOworCQkJCisJCQkvKiBUZXN0IGRlZmF1bHQgYmVoYXZpb3Igd2l0aG91dCBmbGFncyAqLworCQkJeyAKKwkJCQkvKiBDcmVhdGUgYSBtZXNzYWdlIHdpdGggc29tZSBBVlBzIGluc2lkZSAqLworCQkJCUNIRUNLKCAwLCBmZF9tc2dfbmV3ICggY21kX21vZGVsLCAwLCAmbXNnICkgKTsKKwkJCQlDSEVDSyggMCwgZmRfbXNnX2hkciAoIG1zZywgJm1zZ2RhdGEgKSApOworCQkJCQorCQkJCS8qIEFkZCBhIHNlc3Npb24gaWQgKi8KKwkJCQlDSEVDSyggMCwgZmRfbXNnX25ld19zZXNzaW9uKCBtc2csIChvczBfdCkidGVzdG1zZyIsIHN0cmxlbigidGVzdG1zZyIpICkgKTsKKwkJCQkKKwkJCQkvKiBDcmVhdGUgdHdvIGluc3RhbmNlcyBvZiBQcm94eS1JbmZvICovCisJCQkJQUREX0FWUCggbXNnLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIHBpMSwgMCwgIlByb3h5LUluZm8iKTsKKwkJCQlBRERfQVZQKCBtc2csIE1TR19CUldfTEFTVF9DSElMRCwgcGkyLCAwLCAiUHJveHktSW5mbyIpOworCisJCQkJQUREX0FWUCggcGkxLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cCwgMCwgIlByb3h5LVN0YXRlIik7CisJCQkJdmFsdWUub3MuZGF0YSA9IChvczBfdCkicHNfcGkxIjsKKwkJCQl2YWx1ZS5vcy5sZW4gPSBzdHJsZW4oKGNoYXIgKil2YWx1ZS5vcy5kYXRhKTsKKwkJCQlDSEVDSyggMCwgZmRfbXNnX2F2cF9zZXR2YWx1ZSAoIGF2cCwgJnZhbHVlICkgKTsKKwkJCQkKKwkJCQlBRERfQVZQKCBwaTIsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwLCAwLCAiUHJveHktU3RhdGUiKTsKKwkJCQl2YWx1ZS5vcy5kYXRhID0gKG9zMF90KSJwaTJfc3RhdGUiOworCQkJCXZhbHVlLm9zLmxlbiA9IHN0cmxlbigoY2hhciAqKXZhbHVlLm9zLmRhdGEpOworCQkJCUNIRUNLKCAwLCBmZF9tc2dfYXZwX3NldHZhbHVlICggYXZwLCAmdmFsdWUgKSApOworCQkJCQorCQkJCUFERF9BVlAoIHBpMSwgTVNHX0JSV19GSVJTVF9DSElMRCwgYXZwLCAwLCAiUHJveHktSG9zdCIpOworCQkJCXZhbHVlLm9zLmRhdGEgPSAob3MwX3QpaG9zdDE7CisJCQkJdmFsdWUub3MubGVuID0gc3RybGVuKGhvc3QxKTsKKwkJCQlDSEVDSyggMCwgZmRfbXNnX2F2cF9zZXR2YWx1ZSAoIGF2cCwgJnZhbHVlICkgKTsKKwkJCQkKKwkJCQlBRERfQVZQKCBwaTIsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwLCAwLCAiUHJveHktSG9zdCIpOworCQkJCXZhbHVlLm9zLmRhdGEgPSAob3MwX3QpaG9zdDI7CisJCQkJdmFsdWUub3MubGVuID0gc3RybGVuKGhvc3QyKTsKKwkJCQlDSEVDSyggMCwgZmRfbXNnX2F2cF9zZXR2YWx1ZSAoIGF2cCwgJnZhbHVlICkgKTsKKwkJCQkKKwkJCQlBRERfQVZQKCBwaTIsIE1TR19CUldfTEFTVF9DSElMRCwgYXZwLCA3MzU2NSwgIkFWUCBUZXN0IC0gaTY0Iik7CisJCQkJdmFsdWUuaTY0ID0gMHgxMjM0NTY3ODlhYmNkZUxMOworCQkJCUNIRUNLKCAwLCBmZF9tc2dfYXZwX3NldHZhbHVlICggYXZwLCAmdmFsdWUgKSApOworCQkJCQorCQkJCQorCQkJCS8qIE5vdyBjYWxsIHRoZSBmZF9tc2dfbmV3X2Fuc3dlcl9mcm9tX3JlcSBmdW5jdGlvbiAqLworCQkJCUNIRUNLKCAwLCBmZF9tc2dfbmV3X2Fuc3dlcl9mcm9tX3JlcSAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgJm1zZywgMCApICk7CisJCQkJCisJCQkJLyogQ2hlY2sgdGhlcmUgaXMgYSBTZXNzaW9uLUlkIEFWUCAqLworCQkJCXsKKwkJCQkJc3RydWN0IHNlc3Npb24gKiBzZXNzOworCQkJCQlpbnQgbmV3OworCQkJCQlDSEVDSyggMCwgZmRfbXNnX3Nlc3NfZ2V0KGZkX2dfY29uZmlnLT5jbmZfZGljdCwgbXNnLCAmc2VzcywgJm5ldykgKTsKKwkJCQkJQ0hFQ0soIDEsIHNlc3MgPT0gTlVMTCA/IDAgOiAxICk7CisJCQkJCUNIRUNLKCAwLCBuZXcgPyAxIDogMCApOworCQkJCX0KKwkJCQkKKwkJCQkvKiBDaGVjayB0aGVyZSBhcmUgdHdvIFByb3h5LUluZm8gd2l0aCB0aGUgdHdvIGhvc3RzICovCisJCQkJeworCQkJCQlpbnQgZ290X2gxID0gMCwgZ290X2gyPTA7CisJCQkJCUNIRUNLKCAwLCBmZF9tc2dfYnJvd3NlICggbXNnLCBNU0dfQlJXX0ZJUlNUX0NISUxELCAmYXZwLCBOVUxMKSApOworCQkJCQl3aGlsZShhdnApIHsKKwkJCQkJCXN0cnVjdCBhdnBfaGRyICogYXZwZGF0YSA9IE5VTEw7CisJCQkJCQlDSEVDSyggMCwgZmRfbXNnX2F2cF9oZHIgKCBhdnAsICZhdnBkYXRhICkgKTsKKwkJCQkJCWlmIChhdnBkYXRhLT5hdnBfY29kZSA9PSBBQ19QUk9YWV9JTkZPKSB7CisJCQkJCQkJc3RydWN0IGF2cCAqIGlhdnA7CisJCQkJCQkJQ0hFQ0soIDAsIGZkX21zZ19icm93c2UgKCBhdnAsIE1TR19CUldfRklSU1RfQ0hJTEQsICZpYXZwLCBOVUxMKSApOworCQkJCQkJCXdoaWxlKGlhdnApIHsKKwkJCQkJCQkJc3RydWN0IGF2cF9oZHIgKiBpYXZwZGF0YSA9IE5VTEw7CisJCQkJCQkJCUNIRUNLKCAwLCBmZF9tc2dfYXZwX2hkciAoIGlhdnAsICZpYXZwZGF0YSApICk7CisJCQkJCQkJCWlmIChpYXZwZGF0YS0+YXZwX2NvZGUgPT0gQUNfUFJPWFlfSE9TVCkgeworCQkJCQkJCQkJaWYgKCFtZW1jbXAoaG9zdDEsIGlhdnBkYXRhLT5hdnBfdmFsdWUtPm9zLmRhdGEsIHN0cmxlbihob3N0MSkpKQorCQkJCQkJCQkJCWdvdF9oMSsrOworCQkJCQkJCQkJaWYgKCFtZW1jbXAoaG9zdDIsIGlhdnBkYXRhLT5hdnBfdmFsdWUtPm9zLmRhdGEsIHN0cmxlbihob3N0MikpKQorCQkJCQkJCQkJCWdvdF9oMisrOworCQkJCQkJCQl9CisJCQkJCQkJCUNIRUNLKCAwLCBmZF9tc2dfYnJvd3NlICggaWF2cCwgTVNHX0JSV19ORVhULCAmaWF2cCwgTlVMTCkgKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQkKKwkJCQkJCUNIRUNLKCAwLCBmZF9tc2dfYnJvd3NlICggYXZwLCBNU0dfQlJXX05FWFQsICZhdnAsIE5VTEwpICk7CisJCQkJCX0KKwkJCQkJCisJCQkJCUNIRUNLKDEsIGdvdF9oMSk7CisJCQkJCUNIRUNLKDEsIGdvdF9oMik7CisJCQkJfQorCQkJCQorCQkJCS8qIE5vdyB0ZXN0IHRoZSBiZWhhdmlvciBvZiBmZF9tc2dfcmVzY29kZV9zZXQgd2l0aCBhIGdyb3VwZWQgQVZQICovCisJCQkJQ0hFQ0soIDAsIGZkX21zZ19yZXNjb2RlX3NldChtc2csICJESUFNRVRFUl9BVlBfT0NDVVJTX1RPT19NQU5ZX1RJTUVTIiwgTlVMTCwgcGkxLCAxKSApOworCQkJCQorCQkJCWZkX2xvZ19kZWJ1ZygiJXMiLCBmZF9tc2dfZHVtcF90cmVldmlldyhGRF9EVU1QX1RFU1RfUEFSQU1TLCBtc2csIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgMCwgMSkpOworCQkJCQorCQkJCVRPRE8oIkNoZWNrIHRoZSBGYWlsZWQtQVZQIGlzIGFzIGV4cGVjdGVkIik7CisJCQl9CisJCQkKKwkJfQorCX0KKwkKKwkvKiBUZXN0IHRoZSBtc2dfYXZwX3ZhbHVlX2ludGVycHJldCBhbmQgbXNnX2F2cF92YWx1ZV9lbmNvZGUgZnVuY3Rpb25zLiB1c2UgdGhlIEFkZHJlc3MgdHlwZSBhbmQgSG9zdC1JUC1BZGRyZXNzIEFWUHMgKi8KKwl7CisJCXN0cnVjdCBkaWN0X29iamVjdCAqIGNlcl9tb2RlbCA9IE5VTEw7CisJCXN0cnVjdCBtc2cgKiBjZXIgPSBOVUxMOworCQkKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogaGlhX21vZGVsID0gTlVMTDsKKwkJc3RydWN0IGF2cCAqYXZwNCwgKmF2cDY7CisJCSNkZWZpbmUgVEVTVF9JUDQgIjE5Mi4xNjguMTAwLjEwMSIKKwkJY2hhciBidWY0W0lORVRfQUREUlNUUkxFTl07CisJCSNkZWZpbmUJVEVTVF9JUDYgIjExMTE6MjIyMjozMzMzOjQ0NDQ6MTIzNDo1Njc4OjlhYmM6ZGVmMCIKKwkJY2hhciBidWY2W0lORVQ2X0FERFJTVFJMRU5dOworCQkKKwkJc3RydWN0IHNvY2thZGRyX3N0b3JhZ2Ugc3M7CisJCXN0cnVjdCBzb2NrYWRkcl9pbiAgc2luLCAgKnBzaW47CisJCXN0cnVjdCBzb2NrYWRkcl9pbjYgc2luNiwgKnBzaW42OworCQkKKwkJLyogRmluZCB0aGUgQ0VSIGRpY3Rpb25hcnkgb2JqZWN0ICovCisJCUNIRUNLKCAwLCBmZF9kaWN0X3NlYXJjaCAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIkNhcGFiaWxpdGllcy1FeGNoYW5nZS1SZXF1ZXN0IiwgJmNlcl9tb2RlbCwgRU5PRU5UICkgKTsKKworCQkvKiBOb3cgZmluZCB0aGUgSG9zdC1JUC1BZGRyZXNzIGRpY3Rpb25hcnkgb2JqZWN0ICovCisJCUNIRUNLKCAwLCBmZF9kaWN0X3NlYXJjaCAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsIEFWUF9CWV9OQU1FLCAiSG9zdC1JUC1BZGRyZXNzIiwgJmhpYV9tb2RlbCwgRU5PRU5UICkgKTsKKworCQkvKiBDcmVhdGUgdGhlIG1zZyBpbnN0YW5jZSAqLworCQlDSEVDSyggMCwgZmRfbXNnX25ldyAoIGNlcl9tb2RlbCwgMCwgJmNlciApICk7CisKKwkJLyogQ3JlYXRlIHRoZSBhdnAgaW5zdGFuY2VzICovCisJCUNIRUNLKCAwLCBmZF9tc2dfYXZwX25ldyAoIGhpYV9tb2RlbCwgMCwgJmF2cDQgKSApOworCQlDSEVDSyggMCwgZmRfbXNnX2F2cF9uZXcgKCBoaWFfbW9kZWwsIDAsICZhdnA2ICkgKTsKKwkJCisJCS8qIFNldCB0aGUgdmFsdWUgb2YgdGhlIElQIGF2cCAqLworCQlzaW4uc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJCUNIRUNLKCAxLCBpbmV0X3B0b24oIEFGX0lORVQsIFRFU1RfSVA0LCAmc2luLnNpbl9hZGRyLnNfYWRkciApICk7CisJCUNIRUNLKCAwLCBmZF9tc2dfYXZwX3ZhbHVlX2VuY29kZSAoICZzaW4sIGF2cDQgKSApOworCQkKKwkJLyogU2V0IHRoZSB2YWx1ZSBvZiB0aGUgSVA2IGF2cCAqLworCQlzaW42LnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CisJCUNIRUNLKCAxLCBpbmV0X3B0b24oIEFGX0lORVQ2LCBURVNUX0lQNiwgJnNpbjYuc2luNl9hZGRyLnM2X2FkZHIgKSApOworCQlDSEVDSyggMCwgZmRfbXNnX2F2cF92YWx1ZV9lbmNvZGUgKCAmc2luNiwgYXZwNiApICk7CisJCQorCQkvKiBBZGQgdGhlc2UgQVZQcyBpbiB0aGUgbWVzc2FnZSAqLworCQlDSEVDSyggMCwgZmRfbXNnX2F2cF9hZGQoIGNlciwgTVNHX0JSV19MQVNUX0NISUxELCBhdnA0KSApOworCQlDSEVDSyggMCwgZmRfbXNnX2F2cF9hZGQoIGNlciwgTVNHX0JSV19MQVNUX0NISUxELCBhdnA2KSApOworCQkKKwkJLyogQ3JlYXRlIHRoZSBidWZmZXIgZm9yIHRoaXMgbWVzc2FnZSAqLworCQlDSEVDSyggMCwgZmRfbXNnX2J1ZmZlcml6ZSggY2VyLCAmYnVmLCBOVUxMICkgKTsKKwkJCisJCS8qIE5vdyBmcmVlIHRoZSBtZXNzYWdlLCB3ZSBrZWVwIG9ubHkgdGhlIGJ1ZmZlci4gKi8KKwkJQ0hFQ0soIDAsIGZkX21zZ19mcmVlKCBjZXIgKSApOworCQkKKwkJLyogQ2hlY2sgdGhlIGNvbnRlbnQgb2YgdGhlIGJ1ZmZlciBpcyBjb3JyZWN0IChza2lwIGNvbW1hbmQgaGVhZGVyKSAqLworCQlDSEVDSyggMHgwMCwgYnVmWzIwXSApOyAvKiBGaXJzdCBBVlAgKElQNCkgYmVnaW5zOiBjb2RlIDI1NyA9IDB4MDAwMDAxMDEgKi8KKwkJQ0hFQ0soIDB4MDAsIGJ1ZlsyMV0gKTsKKwkJQ0hFQ0soIDB4MDEsIGJ1ZlsyMl0gKTsKKwkJQ0hFQ0soIDB4MDEsIGJ1ZlsyM10gKTsKKwkJQ0hFQ0soIDB4NDAsIGJ1ZlsyNF0gKTsgLyogZmxhZ3M6IE0gKi8KKwkJQ0hFQ0soIDB4MDAsIGJ1ZlsyNV0gKTsgLyogbGVuZ3RoOiA4KzYgPSAweDAwMDAwZSAqLworCQlDSEVDSyggMHgwMCwgYnVmWzI2XSApOworCQlDSEVDSyggMHgwRSwgYnVmWzI3XSApOworCQlDSEVDSyggMHgwMCwgYnVmWzI4XSApOyAvKiBWYWx1ZTogQWRkcmVzc1R5cGUgMSAqLworCQlDSEVDSyggMHgwMSwgYnVmWzI5XSApOyAKKwkJQ0hFQ0soICAxOTIsIGJ1ZlszMF0gKTsgLyogMTkyLjE2OC4xMDAuMTAxICovCisJCUNIRUNLKCAgMTY4LCBidWZbMzFdICk7IAorCQlDSEVDSyggIDEwMCwgYnVmWzMyXSApOyAKKwkJQ0hFQ0soICAxMDEsIGJ1ZlszM10gKTsKKwkJCisJCUNIRUNLKCAweDAwLCBidWZbMzRdICk7IC8qIFBhZGRpbmcgKi8KKwkJQ0hFQ0soIDB4MDAsIGJ1ZlszNV0gKTsKKwkJCisJCUNIRUNLKCAweDAwLCBidWZbMzZdICk7IC8qIFNlY29uZCBBVlAgKElQNikgYmVnaW5zOiBjb2RlIDI1NyA9IDB4MDAwMDAxMDEgKi8KKwkJQ0hFQ0soIDB4MDAsIGJ1ZlszN10gKTsKKwkJQ0hFQ0soIDB4MDEsIGJ1ZlszOF0gKTsKKwkJQ0hFQ0soIDB4MDEsIGJ1ZlszOV0gKTsKKwkJQ0hFQ0soIDB4NDAsIGJ1Zls0MF0gKTsgLyogZmxhZ3M6IE0gKi8KKwkJQ0hFQ0soIDB4MDAsIGJ1Zls0MV0gKTsgLyogbGVuZ3RoOiA4KzE4ID0gMHgwMDAwMWEgKi8KKwkJQ0hFQ0soIDB4MDAsIGJ1Zls0Ml0gKTsKKwkJQ0hFQ0soIDB4MUEsIGJ1Zls0M10gKTsKKwkJQ0hFQ0soIDB4MDAsIGJ1Zls0NF0gKTsgLyogVmFsdWU6IEFkZHJlc3NUeXBlIDIgKi8KKwkJQ0hFQ0soIDB4MDIsIGJ1Zls0NV0gKTsgCisJCUNIRUNLKCAweDExLCBidWZbNDZdICk7IC8qIDExMTE6MjIyMjozMzMzOjQ0NDQ6MTIzNDo1Njc4OjlhYmM6ZGVmMCAqLworCQlDSEVDSyggMHgxMSwgYnVmWzQ3XSApOyAKKwkJQ0hFQ0soIDB4MjIsIGJ1Zls0OF0gKTsgCisJCUNIRUNLKCAweDIyLCBidWZbNDldICk7CisJCUNIRUNLKCAweDMzLCBidWZbNTBdICk7CisJCUNIRUNLKCAweDMzLCBidWZbNTFdICk7CisJCUNIRUNLKCAweDQ0LCBidWZbNTJdICk7CisJCUNIRUNLKCAweDQ0LCBidWZbNTNdICk7CisJCUNIRUNLKCAweDEyLCBidWZbNTRdICk7CisJCUNIRUNLKCAweDM0LCBidWZbNTVdICk7CisJCUNIRUNLKCAweDU2LCBidWZbNTZdICk7CisJCUNIRUNLKCAweDc4LCBidWZbNTddICk7CisJCUNIRUNLKCAweDlhLCBidWZbNThdICk7CisJCUNIRUNLKCAweGJjLCBidWZbNTldICk7CisJCUNIRUNLKCAweGRlLCBidWZbNjBdICk7CisJCUNIRUNLKCAweGYwLCBidWZbNjFdICk7CisJCQorCQkvKiBPaywgbm93IGxldCdzIHJlY3JlYXRlIHRoZSBtZXNzYWdlICovCisJCUNIRUNLKCAwLCBmZF9tc2dfcGFyc2VfYnVmZmVyKCAmYnVmLCA2NCwgJmNlcikgKTsKKwkJQ0hFQ0soIDAsIGZkX21zZ19wYXJzZV9kaWN0KCBjZXIsIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgTlVMTCApICk7CisJCQorCQkvKiBHZXQgdGhlIHBvaW50ZXJzIHRvIHRoZSBmaXJzdCBhbmQgbGFzdCBBVlAgKi8KKwkJQ0hFQ0soIDAsIGZkX21zZ19icm93c2UoIGNlciwgTVNHX0JSV19GSVJTVF9DSElMRCwgJmF2cDQsIE5VTEwpICk7CisJCUNIRUNLKCAwLCBmZF9tc2dfYnJvd3NlKCBjZXIsIE1TR19CUldfTEFTVF9DSElMRCwgICZhdnA2LCBOVUxMKSApOworCQkKKwkJLyogVHJ5IGFuZCBpbnRlcnByZXQgdGhlIGRhdGEgaW4gdGhlIEFWUHMgKi8KKwkJQ0hFQ0soIDAsIGZkX21zZ19hdnBfdmFsdWVfaW50ZXJwcmV0ICggYXZwNCwgJnNzICkgKTsKKwkJcHNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmc3M7CisJCUNIRUNLKCBBRl9JTkVULCBwc2luLT5zaW5fZmFtaWx5ICk7CisJCUNIRUNLKCAwLCAoaW5ldF9udG9wKCBBRl9JTkVULCAmcHNpbi0+c2luX2FkZHIuc19hZGRyLCBidWY0LCBzaXplb2YoYnVmNCkgKSA9PSBOVUxMKSA/IGVycm5vIDogMCApOworCQlDSEVDSyggMCwgc3RyY21wKCBidWY0LCBURVNUX0lQNCApICk7CisJCQorCQlDSEVDSyggMCwgZmRfbXNnX2F2cF92YWx1ZV9pbnRlcnByZXQgKCBhdnA2LCAmc3MgKSApOworCQlwc2luNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopJnNzOworCQlDSEVDSyggQUZfSU5FVDYsIHBzaW42LT5zaW42X2ZhbWlseSApOworCQlDSEVDSyggMCwgKGluZXRfbnRvcCggQUZfSU5FVDYsICZwc2luNi0+c2luNl9hZGRyLnM2X2FkZHIsIGJ1ZjYsIHNpemVvZihidWY2KSApID09IE5VTEwpID8gZXJybm8gOiAwICk7CisJCUNIRUNLKCAwLCBzdHJjYXNlY21wKCBidWY2LCBURVNUX0lQNiApICk7CisJCQorCQkvKiBPaywgaXQncyBkb25lICovCisJCUNIRUNLKCAwLCBmZF9tc2dfZnJlZSggY2VyICkgKTsKKwl9CisJCisJLyogQ2hlY2sgcHJvcGVyIGVuY29kaW5nIC8gZGVjb2RpbmcgZm9yIGFsbCBiYXNpYyB0eXBlcyBvZiBBVlAgKi8KKwl7CisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGF2cF9kYXRhID0geyA5MTAwMSwgMCwgIkFWUCBUZXN0IDIgLSBvcyIsIDAsIDAsIEFWUF9UWVBFX09DVEVUU1RSSU5HIH07CisJCQlDSEVDSyggMCwgZmRfZGljdF9uZXcgKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCAmYXZwX2RhdGEgLCBOVUxMLCBOVUxMICkgKTsKKwkJfQorCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBhdnBfZGF0YSA9IHsgOTEwMDIsIDAsICJBVlAgVGVzdCAyIC0gaTMyIiwgMCwgMCwgQVZQX1RZUEVfSU5URUdFUjMyIH07CisJCQlDSEVDSyggMCwgZmRfZGljdF9uZXcgKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCAmYXZwX2RhdGEgLCBOVUxMLCBOVUxMICkgKTsKKwkJfQorCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBhdnBfZGF0YSA9IHsgOTEwMDMsIDAsICJBVlAgVGVzdCAyIC0gaTY0IiwgMCwgMCwgQVZQX1RZUEVfSU5URUdFUjY0IH07CisJCQlDSEVDSyggMCwgZmRfZGljdF9uZXcgKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCAmYXZwX2RhdGEgLCBOVUxMLCBOVUxMICkgKTsKKwkJfQorCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBhdnBfZGF0YSA9IHsgOTEwMDQsIDAsICJBVlAgVGVzdCAyIC0gdTMyIiwgMCwgMCwgQVZQX1RZUEVfVU5TSUdORUQzMiB9OworCQkJQ0hFQ0soIDAsIGZkX2RpY3RfbmV3ICggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgJmF2cF9kYXRhICwgTlVMTCwgTlVMTCApICk7CisJCX0KKwkJeworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgYXZwX2RhdGEgPSB7IDkxMDA1LCAwLCAiQVZQIFRlc3QgMiAtIHU2NCIsIDAsIDAsIEFWUF9UWVBFX1VOU0lHTkVENjQgfTsKKwkJCUNIRUNLKCAwLCBmZF9kaWN0X25ldyAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsICZhdnBfZGF0YSAsIE5VTEwsIE5VTEwgKSApOworCQl9CisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGF2cF9kYXRhID0geyA5MTAwNiwgMCwgIkFWUCBUZXN0IDIgLSBmMzIiLCAwLCAwLCBBVlBfVFlQRV9GTE9BVDMyIH07CisJCQlDSEVDSyggMCwgZmRfZGljdF9uZXcgKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCAmYXZwX2RhdGEgLCBOVUxMLCBOVUxMICkgKTsKKwkJfQorCQl7CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSBhdnBfZGF0YSA9IHsgOTEwMDcsIDAsICJBVlAgVGVzdCAyIC0gZjY0IiwgMCwgMCwgQVZQX1RZUEVfRkxPQVQ2NCB9OworCQkJQ0hFQ0soIDAsIGZkX2RpY3RfbmV3ICggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgJmF2cF9kYXRhICwgTlVMTCwgTlVMTCApICk7CisJCX0KKwkJCisJCXsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGNtZF9tb2RlbCA9IE5VTEw7CisJCQlzdHJ1Y3QgbXNnICAgICAgICAgKiBtc2cgPSBOVUxMOworCQkJc3RydWN0IGF2cCAgICAgICAgICogYXZwID0gTlVMTDsKKwkJCXVuaW9uIGF2cF92YWx1ZSAgICAgIHZhbHVlOworCQkJc3RydWN0IGF2cCAgICAgICAgICogYXZwaSA9IE5VTEw7CisJCQlzdHJ1Y3QgYXZwX2hkciAgICAgKiBhdnBkYXRhID0gTlVMTDsKKwkJCXN0cnVjdCBtc2dfaGRyICAgICAqIG1zZ2RhdGEgPSBOVUxMOworCisJCQlDSEVDSyggMCwgZmRfZGljdF9zZWFyY2ggKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJUZXN0LUNvbW1hbmQtUmVxdWVzdCIsICZjbWRfbW9kZWwsIEVOT0VOVCApICk7CisKKwkJCS8qIENyZWF0ZSBhIG1lc3NhZ2UgKi8KKwkJCUNIRUNLKCAwLCBmZF9tc2dfbmV3ICggY21kX21vZGVsLCAwLCAmbXNnICkgKTsKKwkJCUNIRUNLKCAwLCBmZF9tc2dfaGRyICggbXNnLCAmbXNnZGF0YSApICk7CisJCQkKKwkJCUFERF9BVlAoIG1zZywgTVNHX0JSV19MQVNUX0NISUxELCBhdnBpLCAwLCAJIkFWUCBUZXN0IDIgLSBvcyIgKTsKKwkJCXZhbHVlLm9zLmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSAid2FhYWQiOworCQkJdmFsdWUub3MubGVuID0gNjsKKwkJCUNIRUNLKCAwLCBmZF9tc2dfYXZwX3NldHZhbHVlICggYXZwaSwgJnZhbHVlICkgKTsKKworCQkJQUREX0FWUCggbXNnLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cGksIDAsCSJBVlAgVGVzdCAyIC0gaTMyIiApOworCQkJdmFsdWUuaTMyID0gMHgxMjM0NTY7CisJCQlDSEVDSyggMCwgZmRfbXNnX2F2cF9zZXR2YWx1ZSAoIGF2cGksICZ2YWx1ZSApICk7CisKKwkJCUFERF9BVlAoIG1zZywgTVNHX0JSV19MQVNUX0NISUxELCBhdnBpLCAwLAkiQVZQIFRlc3QgMiAtIGkzMiIgKTsKKwkJCXZhbHVlLmkzMiA9IC0weDEyMzQ1NjsKKwkJCUNIRUNLKCAwLCBmZF9tc2dfYXZwX3NldHZhbHVlICggYXZwaSwgJnZhbHVlICkgKTsKKworCQkJQUREX0FWUCggbXNnLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cGksIDAsCSJBVlAgVGVzdCAyIC0gaTY0IiApOworCQkJdmFsdWUuaTY0ID0gMHgxMTIyMzM0NDU1NjY3N0xMOworCQkJQ0hFQ0soIDAsIGZkX21zZ19hdnBfc2V0dmFsdWUgKCBhdnBpLCAmdmFsdWUgKSApOworCisJCQlBRERfQVZQKCBtc2csIE1TR19CUldfTEFTVF9DSElMRCwgYXZwaSwgMCwJIkFWUCBUZXN0IDIgLSBpNjQiICk7CisJCQl2YWx1ZS5pNjQgPSAtMHgxMTIyMzM0NDU1NjY3N0xMOworCQkJQ0hFQ0soIDAsIGZkX21zZ19hdnBfc2V0dmFsdWUgKCBhdnBpLCAmdmFsdWUgKSApOworCisJCQlBRERfQVZQKCBtc2csIE1TR19CUldfTEFTVF9DSElMRCwgYXZwaSwgMCwJIkFWUCBUZXN0IDIgLSB1MzIiICk7CisJCQl2YWx1ZS51MzIgPSAweEZFRENCQTk4OworCQkJQ0hFQ0soIDAsIGZkX21zZ19hdnBfc2V0dmFsdWUgKCBhdnBpLCAmdmFsdWUgKSApOworCisJCQlBRERfQVZQKCBtc2csIE1TR19CUldfTEFTVF9DSElMRCwgYXZwaSwgMCwJIkFWUCBUZXN0IDIgLSB1NjQiICk7CisJCQl2YWx1ZS51NjQgPSAweDEyMzQ1Njc4OWFiY2RlZjBMTDsKKwkJCUNIRUNLKCAwLCBmZF9tc2dfYXZwX3NldHZhbHVlICggYXZwaSwgJnZhbHVlICkgKTsKKworCQkJQUREX0FWUCggbXNnLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cGksIDAsCSJBVlAgVGVzdCAyIC0gZjMyIiApOworCQkJdmFsdWUuZjMyID0gMjA5NzE1My4wRjsKKwkJCUNIRUNLKCAwLCBmZF9tc2dfYXZwX3NldHZhbHVlICggYXZwaSwgJnZhbHVlICkgKTsKKworCQkJQUREX0FWUCggbXNnLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cGksIDAsCSJBVlAgVGVzdCAyIC0gZjY0IiApOworCQkJdmFsdWUuZjY0ID0gLTEwOTk1MTE2Mjc3NzdMTDsKKwkJCUNIRUNLKCAwLCBmZF9tc2dfYXZwX3NldHZhbHVlICggYXZwaSwgJnZhbHVlICkgKTsKKwkJCQorCQkJLyogT2sgbm93IGJ1ZmZlcml6ZSAqLworCQkJQ0hFQ0soIDAsIGZkX21zZ19idWZmZXJpemUoIG1zZywgJmJ1ZiwgTlVMTCApICk7CisJCQkKKwkJCS8qIFRlc3QgdGhlIGZpcnN0IGJ5dGVzICovCisJCQlDSEVDSyggMHgwMSwgYnVmWzBdICk7IC8qIFZlcnNpb24gKi8KKwkJCUNIRUNLKCAweDAwLCBidWZbMV0gKTsgLyogTGVuZ3RoOiAxNDggPSAweDAwMDA5NCAqLworCQkJQ0hFQ0soIDB4MDAsIGJ1ZlsyXSApOworCQkJQ0hFQ0soIDB4OTQsIGJ1ZlszXSApOworCQkJQ0hFQ0soIDB4ODAsIGJ1Zls0XSApOyAvKiBmbGFnczogb25seSAiUiIgaXMgc2V0LiAqLworCQkJQ0hFQ0soIDB4MDEsIGJ1Zls1XSApOyAvKiBDb21tYW5kIGNvZGU6IDczNTczID0gMHgwMTFGNjUgKi8KKwkJCUNIRUNLKCAweDFGLCBidWZbNl0gKTsKKwkJCUNIRUNLKCAweDY1LCBidWZbN10gKTsKKwkJCUNIRUNLKCAweDAwLCBidWZbOF0gKTsgLyogQXBwIElEICovCisJCQlDSEVDSyggMHgwMSwgYnVmWzldICk7IAorCQkJQ0hFQ0soIDB4MUYsIGJ1ZlsxMF0gKTsKKwkJCUNIRUNLKCAweDVFLCBidWZbMTFdICk7CisJCQlDSEVDSyggMHgwMCwgYnVmWzEyXSApOyAvKiBob3AtYnktaG9wIGlkICovCisJCQlDSEVDSyggMHgwMCwgYnVmWzEzXSApOworCQkJQ0hFQ0soIDB4MDAsIGJ1ZlsxNF0gKTsKKwkJCUNIRUNLKCAweDAwLCBidWZbMTVdICk7CisJCQlDSEVDSyggMHgwMCwgYnVmWzE2XSApOyAvKiBlbmQtdG8tZW5kIGlkICovCisJCQlDSEVDSyggMHgwMCwgYnVmWzE3XSApOworCQkJQ0hFQ0soIDB4MDAsIGJ1ZlsxOF0gKTsKKwkJCUNIRUNLKCAweDAwLCBidWZbMTldICk7CisJCQkKKwkJCUNIRUNLKCAweDAwLCBidWZbMjBdICk7IC8qIEZpcnN0IEFWUCAoQVZQIFRlc3QgMiAtIG9zKSBiZWdpbjogY29kZSA5MTAwMSA9IDB4MDAwMTYzNzkgKi8KKwkJCUNIRUNLKCAweDAxLCBidWZbMjFdICk7CisJCQlDSEVDSyggMHg2MywgYnVmWzIyXSApOworCQkJQ0hFQ0soIDB4NzksIGJ1ZlsyM10gKTsKKwkJCUNIRUNLKCAweDAwLCBidWZbMjRdICk7IC8qIGZsYWdzOiAwICovCisJCQlDSEVDSyggMHgwMCwgYnVmWzI1XSApOyAvKiBsZW5ndGg6IDE0ID0gMHgwMDAwMGUgKi8KKwkJCUNIRUNLKCAweDAwLCBidWZbMjZdICk7CisJCQlDSEVDSyggMHgwZSwgYnVmWzI3XSApOworCQkJCisJCQlDSEVDSyggMHg3NywgYnVmWzI4XSApOyAvKiAid2FhYWRcMCIgKyBwYWRkaW5nICovCisJCQlDSEVDSyggMHg2MSwgYnVmWzI5XSApOworCQkJQ0hFQ0soIDB4NjEsIGJ1ZlszMF0gKTsKKwkJCUNIRUNLKCAweDYxLCBidWZbMzFdICk7CisJCQlDSEVDSyggMHg2NCwgYnVmWzMyXSApOworCQkJQ0hFQ0soIDB4MDAsIGJ1ZlszM10gKTsKKwkJCUNIRUNLKCAweDAwLCBidWZbMzRdICk7CisJCQlDSEVDSyggMHgwMCwgYnVmWzM1XSApOworCQkJCisJCQkvKiAzNiB+IDQzIDogMm5kIEFWUCBoZWFkZXIgKHNpemUgYXQgbGFzdCBvY3RldCkgKi8KKwkJCUNIRUNLKCAweDBjLCBidWZbNDNdICk7CisJCQlDSEVDSyggMHgwMCwgYnVmWzQ0XSApOyAvKiAweDEyMzQ1NiBzdG9yZWQgaW4gaW50ZWdlcjMyIGluIG5ldHdvcmsgYnl0ZSBvcmRlciAqLworCQkJQ0hFQ0soIDB4MTIsIGJ1Zls0NV0gKTsKKwkJCUNIRUNLKCAweDM0LCBidWZbNDZdICk7CisJCQlDSEVDSyggMHg1NiwgYnVmWzQ3XSApOworCQkJCisJCQkvKiA0OCB+IDU1IDogbmV4dCBBVlAgaGVhZGVyICovCisJCQlDSEVDSyggMHhmZiwgYnVmWzU2XSApOyAvKiAtMHgxMjM0NTYgc3RvcmVkIGluIGludGVnZXIzMiBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIuICovIAorCQkJQ0hFQ0soIDB4ZWQsIGJ1Zls1N10gKTsgLyogV2UgYXNzdW1lIHRoYXQgdHdvJ3MgY29tcGxlbWVudCBpcyB0aGUgY29ycmVjdCByZXByZXNlbnRhdGlvbiwgYWx0aG91Z2ggaXQncyBub3QgY2xlYXJseSBzcGVjaWZpZWQuICovCisJCQlDSEVDSyggMHhjYiwgYnVmWzU4XSApOyAvKiAwMCAxMiAzNCA1NiBpbnZlcnNlZCA9PiBGRiBFRCBDQiBBOSAqLworCQkJQ0hFQ0soIDB4YWEsIGJ1Zls1OV0gKTsgLyogdGhlbiAiKzEiID0+IEZGIEVEIENCIEFBICovCisJCQkKKwkJCS8qIDYwIH4gNjcgOiBuZXh0IGhlYWRlciAqLworCQkJQ0hFQ0soIDB4MTAsIGJ1Zls2N10gKTsgLyogKHRoZSBzaXplKSAqLworCQkJQ0hFQ0soIDB4MDAsIGJ1Zls2OF0gKTsgLyogMHgxMTIyMzM0NDU1NjY3NyBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIgKi8KKwkJCUNIRUNLKCAweDExLCBidWZbNjldICk7CisJCQlDSEVDSyggMHgyMiwgYnVmWzcwXSApOworCQkJQ0hFQ0soIDB4MzMsIGJ1Zls3MV0gKTsKKwkJCUNIRUNLKCAweDQ0LCBidWZbNzJdICk7CisJCQlDSEVDSyggMHg1NSwgYnVmWzczXSApOworCQkJQ0hFQ0soIDB4NjYsIGJ1Zls3NF0gKTsKKwkJCUNIRUNLKCAweDc3LCBidWZbNzVdICk7CisJCQkKKwkJCS8qIDc2IH4gODMgOiBuZXh0IGhlYWRlciAqLworCQkJQ0hFQ0soIDB4RkYsIGJ1Zls4NF0gKTsgLyogIC0gMHgxMTIyMzM0NDU1NjY3NyAoaW4gdHdvJ3MgY29tcGxlbWVudCkgKi8KKwkJCUNIRUNLKCAweEVFLCBidWZbODVdICk7IC8qIGdpdmVzIEZGIEVFIEREIENDIEJCIEFBIDk5IDg5ICovCisJCQlDSEVDSyggMHhERCwgYnVmWzg2XSApOworCQkJQ0hFQ0soIDB4Q0MsIGJ1Zls4N10gKTsKKwkJCUNIRUNLKCAweEJCLCBidWZbODhdICk7CisJCQlDSEVDSyggMHhBQSwgYnVmWzg5XSApOworCQkJQ0hFQ0soIDB4OTksIGJ1Zls5MF0gKTsKKwkJCUNIRUNLKCAweDg5LCBidWZbOTFdICk7CisJCQkKKwkJCS8qIDkyIH4gOTkgOiBuZXh0IGhlYWRlciAqLworCQkJQ0hFQ0soIDB4MGMsIGJ1Zls5OV0gKTsgLyogKHRoZSBzaXplKSAqLworCQkJQ0hFQ0soIDB4RkUsIGJ1ZlsxMDBdKTsgLyogMHhGRURDQkE5OCBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIgKi8KKwkJCUNIRUNLKCAweERDLCBidWZbMTAxXSk7CisJCQlDSEVDSyggMHhCQSwgYnVmWzEwMl0pOworCQkJQ0hFQ0soIDB4OTgsIGJ1ZlsxMDNdKTsKKwkJCQorCQkJLyogMTA0IH4gMTExIDogbmV4dCBoZWFkZXIgKi8KKwkJCUNIRUNLKCAweDEwLCBidWZbMTExXSApOyAvKiAodGhlIHNpemUpICovCisJCQlDSEVDSyggMHgxMiwgYnVmWzExMl0pOyAvKiAweDEyMzQ1Njc4OWFiY2RlZjBMTCBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIgKi8KKwkJCUNIRUNLKCAweDM0LCBidWZbMTEzXSk7CisJCQlDSEVDSyggMHg1NiwgYnVmWzExNF0pOworCQkJQ0hFQ0soIDB4NzgsIGJ1ZlsxMTVdKTsKKwkJCUNIRUNLKCAweDlhLCBidWZbMTE2XSk7CisJCQlDSEVDSyggMHhiYywgYnVmWzExN10pOworCQkJQ0hFQ0soIDB4ZGUsIGJ1ZlsxMThdKTsKKwkJCUNIRUNLKCAweGYwLCBidWZbMTE5XSk7CisJCQkKKwkJCS8qIDEyMCB+IDEyNyA6IG5leHQgaGVhZGVyICovCisJCQlDSEVDSyggMHgwYywgYnVmWzEyN10gKTsgLyogKHRoZSBzaXplKSAqLworCQkJQ0hFQ0soIDB4NGEsIGJ1ZlsxMjhdKTsgLyogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JRUVFXzc1NC0xOTg1IHRvIGdldCBkZXNjdnJpcHRpb24gb2YgdGhlIGZvcm1hdCAqLworCQkJQ0hFQ0soIDB4MDAsIGJ1ZlsxMjldKTsgLyogdiA9IDIwOTcxNTMgPSAyXjIxICsgMiBeIDA7IHNpZ24gOiAiKyIsIDJeMjEgPD0gdiA8IDJeMjIgPT4gZXhwb25lbnQgPSAyMTsgYmlhaXNlZCBvbiA4IGJpdHMgPT4gMjEgKyAxMjcgPT4gMTAwIDEwMTAgMCAqLworCQkJQ0hFQ0soIDB4MDAsIGJ1ZlsxMzBdKTsgLyogdiA9ICgrMSkgKiAoMSBeIDIxKSAqICggMSArIDJeLTIxICkgPT4gc2lnbmlmaWNhbmQgMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDEwMCAqLworCQkJQ0hFQ0soIDB4MDQsIGJ1ZlsxMzFdKTsgLyogcmVzdWx0OiA0YSAwMCAwMCAwNCAqLworCQkJCisJCQkvKiAxMzIgfiAxMzkgOiBuZXh0IGhlYWRlciAqLworCQkJQ0hFQ0soIDB4MTAsIGJ1ZlsxMzldICk7IC8qICh0aGUgc2l6ZSkgKi8KKwkJCUNIRUNLKCAweGMyLCBidWZbMTQwXSk7IC8qIC0xMDk5NTExNjI3Nzc3TCAoIDJeNDAgKyAxICkgaW4gbmV0d29yayBieXRlIG9yZGVyICovCisJCQlDSEVDSyggMHg3MCwgYnVmWzE0MV0pOyAvKiBzaWduOiAtID0+IG1vc3Qgc2lnbmlmaWNhbnQgYml0ID0gMSAqLworCQkJQ0hFQ0soIDB4MDAsIGJ1ZlsxNDJdKTsgLyogMl40MCA8PSB2IDwgMl40MSA9PiBiaWFpc2VkIGV4cG9uZW50IG9uIDExIGJpdHM6IDEwMjMgKyA0MDogMTAwIDAwMTAgIDAxMTEgKi8KKwkJCUNIRUNLKCAweDAwLCBidWZbMTQzXSk7IC8qIHNpZ25pZmljYW5kOiAxICsgMl4tNDAgPT4gMDAwMCAgMDAwMCAwMDAwICAwMDAwIDAwMDAgIDAwMDAgMDAwMCAgMDAwMCAwMDAwICAwMDAxIDAwMDAgIDAwMDAgMDAwMCAqLworCQkJQ0hFQ0soIDB4MDAsIGJ1ZlsxNDRdKTsgLyogcmVzdWx0OiBjMiA3MCAwMCAwMCAwMCAwMCAxMCAwMCAqLworCQkJQ0hFQ0soIDB4MDAsIGJ1ZlsxNDVdKTsKKwkJCUNIRUNLKCAweDEwLCBidWZbMTQ2XSk7CisJCQlDSEVDSyggMHgwMCwgYnVmWzE0N10pOworCQkJCisJCQkKKwkJCQorCQkJLyogT2theSwgbm93IGRlbGV0ZSB0aGUgbWVzc2FnZSBhbmQgcGFyc2UgdGhlIGJ1ZmZlciwgdGhlbiBjaGVjayB3ZSBvYnRhaW4gdGhlIHNhbWUgdmFsdWVzIGJhY2sgKi8KKwkJCSNpZiAwCisJCQlmZF9sb2dfZGVidWcoIiVzIiwgZmRfbXNnX2R1bXBfdHJlZXZpZXcoRkRfRFVNUF9URVNUX1BBUkFNUywgbXNnLCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIDAsIDEpKTsKKwkJCSNlbmRpZgorCQkJQ0hFQ0soIDAsIGZkX21zZ19mcmVlKCBtc2cgKSApOworCQkJCisJCQlDSEVDSyggMCwgZmRfbXNnX3BhcnNlX2J1ZmZlciggJmJ1ZiwgMTQ4LCAmbXNnKSApOworCQkJQ0hFQ0soIDAsIGZkX21zZ19wYXJzZV9kaWN0KCBtc2csIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgTlVMTCApICk7CisJCQkjaWYgMAorCQkJZmRfbG9nX2RlYnVnKCIlcyIsIGZkX21zZ19kdW1wX3RyZWV2aWV3KEZEX0RVTVBfVEVTVF9QQVJBTVMsIG1zZywgZmRfZ19jb25maWctPmNuZl9kaWN0LCAwLCAxKSk7CisJCQkjZW5kaWYKKwkJCQorCQkJQ0hFQ0soIDAsIGZkX21zZ19icm93c2UgKCBtc2csIE1TR19CUldfRklSU1RfQ0hJTEQsICZhdnAsIE5VTEwpICk7CisJCQlDSEVDSyggMCwgZmRfbXNnX2F2cF9oZHIgKCBhdnAsICZhdnBkYXRhICkgKTsKKwkJCUNIRUNLKCA2LCBhdnBkYXRhLT5hdnBfdmFsdWUtPm9zLmxlbiApOworCQkJQ0hFQ0soICd3JywgKGNoYXIpKGF2cGRhdGEtPmF2cF92YWx1ZS0+b3MuZGF0YVswXSkgKTsKKwkJCUNIRUNLKCAnYScsIChjaGFyKShhdnBkYXRhLT5hdnBfdmFsdWUtPm9zLmRhdGFbMV0pICk7CisJCQlDSEVDSyggJ2QnLCAoY2hhcikoYXZwZGF0YS0+YXZwX3ZhbHVlLT5vcy5kYXRhWzRdKSApOworCQkJQ0hFQ0soICdcMCcsIChjaGFyKShhdnBkYXRhLT5hdnBfdmFsdWUtPm9zLmRhdGFbNV0pICk7CisJCQkKKwkJCUNIRUNLKCAwLCBmZF9tc2dfYnJvd3NlICggYXZwLCBNU0dfQlJXX05FWFQsICZhdnAsIE5VTEwpICk7CisJCQlDSEVDSyggMCwgZmRfbXNnX2F2cF9oZHIgKCBhdnAsICZhdnBkYXRhICkgKTsKKwkJCUNIRUNLKCAweDEyMzQ1NiwgYXZwZGF0YS0+YXZwX3ZhbHVlLT5pMzIgKTsKKwkJCQorCQkJQ0hFQ0soIDAsIGZkX21zZ19icm93c2UgKCBhdnAsIE1TR19CUldfTkVYVCwgJmF2cCwgTlVMTCkgKTsKKwkJCUNIRUNLKCAwLCBmZF9tc2dfYXZwX2hkciAoIGF2cCwgJmF2cGRhdGEgKSApOworCQkJQ0hFQ0soIC0weDEyMzQ1NiwgYXZwZGF0YS0+YXZwX3ZhbHVlLT5pMzIgKTsKKwkJCQorCQkJQ0hFQ0soIDAsIGZkX21zZ19icm93c2UgKCBhdnAsIE1TR19CUldfTkVYVCwgJmF2cCwgTlVMTCkgKTsKKwkJCUNIRUNLKCAwLCBmZF9tc2dfYXZwX2hkciAoIGF2cCwgJmF2cGRhdGEgKSApOworCQkJQ0hFQ0soIDB4MTEyMjMzNDQ1NTY2NzdMTCwgYXZwZGF0YS0+YXZwX3ZhbHVlLT5pNjQgKTsKKwkJCQorCQkJQ0hFQ0soIDAsIGZkX21zZ19icm93c2UgKCBhdnAsIE1TR19CUldfTkVYVCwgJmF2cCwgTlVMTCkgKTsKKwkJCUNIRUNLKCAwLCBmZF9tc2dfYXZwX2hkciAoIGF2cCwgJmF2cGRhdGEgKSApOworCQkJQ0hFQ0soIC0weDExMjIzMzQ0NTU2Njc3TEwsIGF2cGRhdGEtPmF2cF92YWx1ZS0+aTY0ICk7CisJCQkKKwkJCUNIRUNLKCAwLCBmZF9tc2dfYnJvd3NlICggYXZwLCBNU0dfQlJXX05FWFQsICZhdnAsIE5VTEwpICk7CisJCQlDSEVDSyggMCwgZmRfbXNnX2F2cF9oZHIgKCBhdnAsICZhdnBkYXRhICkgKTsKKwkJCUNIRUNLKCAweEZFRENCQTk4LCBhdnBkYXRhLT5hdnBfdmFsdWUtPnUzMiApOworCQkJCisJCQlDSEVDSyggMCwgZmRfbXNnX2Jyb3dzZSAoIGF2cCwgTVNHX0JSV19ORVhULCAmYXZwLCBOVUxMKSApOworCQkJQ0hFQ0soIDAsIGZkX21zZ19hdnBfaGRyICggYXZwLCAmYXZwZGF0YSApICk7CisJCQlDSEVDSyggMHgxMjM0NTY3ODlhYmNkZWYwTEwsIGF2cGRhdGEtPmF2cF92YWx1ZS0+dTY0ICk7CisJCQkKKwkJCUNIRUNLKCAwLCBmZF9tc2dfYnJvd3NlICggYXZwLCBNU0dfQlJXX05FWFQsICZhdnAsIE5VTEwpICk7CisJCQlDSEVDSyggMCwgZmRfbXNnX2F2cF9oZHIgKCBhdnAsICZhdnBkYXRhICkgKTsKKwkJCUNIRUNLKCAyMDk3MTUzLjBGLCBhdnBkYXRhLT5hdnBfdmFsdWUtPmYzMiApOworCQkJCisJCQlDSEVDSyggMCwgZmRfbXNnX2Jyb3dzZSAoIGF2cCwgTVNHX0JSV19ORVhULCAmYXZwLCBOVUxMKSApOworCQkJQ0hFQ0soIDAsIGZkX21zZ19hdnBfaGRyICggYXZwLCAmYXZwZGF0YSApICk7CisJCQlDSEVDSyggLTEwOTk1MTE2Mjc3NzdMTCwgYXZwZGF0YS0+YXZwX3ZhbHVlLT5mNjQgKTsKKwkJCQorCQkJQ0hFQ0soIDAsIGZkX21zZ19mcmVlKCBtc2cgKSApOworCQl9CisJfQorCQorCS8qIFRoYXQncyBhbGwgZm9yIHRoZSB0ZXN0cyB5ZXQgKi8KKwlQQVNTVEVTVCgpOworfSAKKwkKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RtZXNnX3N0cmVzcy5jIGIvdGVzdHMvdGVzdG1lc2dfc3RyZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzEwYTlkMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RtZXNnX3N0cmVzcy5jCkBAIC0wLDAgKzEsNjg5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxMywgV0lERSBQcm9qZWN0IGFuZCBOSUNUCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBXSURFIFByb2plY3Qgb3IgTklDVCBub3IgdGhlIAkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFdJREUgUHJvamVjdCBhbmQgCQkJCQkJICoKKyogICBOSUNULgkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJ0ZXN0cy5oIgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPGxpYmdlbi5oPgorI2luY2x1ZGUgPGRsZmNuLmg+CisKKyNpZm5kZWYgQlVJTERfRElSCisjZXJyb3IgIk1pc3NpbmcgQlVJTERfRElSIGluZm9ybWF0aW9uIgorI2VuZGlmIC8qIEJVSUxEX0RJUiAqLworCisKKy8qIFRoZSBudW1iZXIgb2YgdGltZXMgZWFjaCBvcGVyYXRpb24gaXMgcmVwZWF0ZWQgdG8gbWVhc3VyZSB0aGUgYXZlcmFnZSBvcGVyYXRpb24gdGltZSAqLworI2RlZmluZSBERUZBVUxUX05VTUJFUl9PRl9TQU1QTEVTCTEwMDAwMAorCitzdGF0aWMgdm9pZCBkaXNwbGF5X3Jlc3VsdChpbnQgbnIsIHN0cnVjdCB0aW1lc3BlYyAqIHN0YXJ0LCBzdHJ1Y3QgdGltZXNwZWMgKiBlbmQsIGNoYXIgKiBmY3QsIGNoYXIgKiB0eXBlLCBjaGFyICpvcCkKK3sKKwlsb25nIGRvdWJsZSBkdXIgPSAobG9uZyBkb3VibGUpZW5kLT50dl9zZWMgKyAobG9uZyBkb3VibGUpZW5kLT50dl9uc2VjLzEwMDAwMDAwMDA7CisJZHVyIC09IChsb25nIGRvdWJsZSlzdGFydC0+dHZfc2VjICsgKGxvbmcgZG91YmxlKXN0YXJ0LT50dl9uc2VjLzEwMDAwMDAwMDA7CisJbG9uZyBkb3VibGUgdGhycCA9IChsb25nIGRvdWJsZSluciAvIGR1cjsKKwlwcmludGYoIiUtMTlzOiAlZCAlLThzICUtN3MgaW4gJS42TEZzICglLjFMRm1zZy9zKVxuIiwgZmN0LCBuciwgdHlwZSwgb3AsIGR1ciwgdGhycCk7Cit9CisKK3N0cnVjdCBleHRfaW5mbyB7CisJc3RydWN0IGZkX2xpc3QJY2hhaW47CQkvKiBsaW5rIGluIHRoZSBsaXN0ICovCisJdm9pZCAJCSpoYW5kbGVyOwkvKiBvYmplY3QgcmV0dXJuZWQgYnkgZGxvcGVuKCkgKi8KKwlpbnQgCQkoKmluaXRfY2IpKGludCwgaW50LCBjaGFyICopOworCWNoYXIJCSpleHRfbmFtZTsJLyogcG9pbnRzIHRvIHRoZSBleHRlbnNpb24gbmFtZSwgZWl0aGVyIGluc2lkZSBkZXBlbmRzLCBvciBiYXNlbmFtZShmaWxlbmFtZSkgKi8KKwlpbnQJCWZyZWVfZXh0X25hbWU7CS8qIG11c3QgYmUgZnJlZWQgaWYgaXQgd2FzIG1hbGxvYydkICovCisJY29uc3QgY2hhciAJKipkZXBlbmRzOwkvKiBuYW1lcyBvZiB0aGUgb3RoZXIgZXh0ZW5zaW9ucyB0aGlzIG9uZSBkZXBlbmRzIG9uIChpZiBwcm92aWRlZCkgKi8KK307CisJCitzdGF0aWMgdm9pZCBsb2FkX2FsbF9leHRlbnNpb25zKGNoYXIgKiBwcmVmaXgpCit7CisJRElSICpkaXI7CisJc3RydWN0IGRpcmVudCAqZHA7CisJY2hhciBmdWxsbmFtZVs1MTJdOworCWludCBwYXRobGVuOworCXN0cnVjdCBmZF9saXN0IGFsbF9leHRlbnNpb25zID0gRkRfTElTVF9JTklUSUFMSVpFUihhbGxfZXh0ZW5zaW9ucyk7CisJc3RydWN0IGZkX2xpc3QgZXh0X3dpdGhfZGVwZW5kcyA9IEZEX0xJU1RfSU5JVElBTElaRVIoZXh0X3dpdGhfZGVwZW5kcyk7CisKKwkvKiBGaW5kIGFsbCBleHRlbnNpb25zIHdoaWNoIGhhdmUgYmVlbiBjb21waWxlZCBhbG9uZyB0aGUgdGVzdCAqLworCUxPR19EKCJMb2FkaW5nICVzKi5mZHggZnJvbTogJyVzJyIsIEJVSUxEX0RJUiAiL2V4dGVuc2lvbnMiLCBwcmVmaXggPzogIiIpOworCUNIRUNLKCAwLCAoZGlyID0gb3BlbmRpciAoQlVJTERfRElSICIvZXh0ZW5zaW9ucyIpKSA9PSBOVUxMID8gMSA6IDAgKTsKKwlwYXRobGVuID0gc25wcmludGYoZnVsbG5hbWUsIHNpemVvZihmdWxsbmFtZSksIEJVSUxEX0RJUiAiL2V4dGVuc2lvbnMvIik7CisJCisJd2hpbGUgKChkcCA9IHJlYWRkaXIgKGRpcikpICE9IE5VTEwpIHsKKwkJY2hhciAqIGRvdCA9IHN0cnJjaHIoZHAtPmRfbmFtZSwgJy4nKTsKKwkJaWYgKGRvdCAmJiAoKCFwcmVmaXgpIHx8ICEoc3RybmNtcChkcC0+ZF9uYW1lLCBwcmVmaXgsIHN0cmxlbihwcmVmaXgpKSkpICYmICghKHN0cmNtcChkb3QsICIuZmR4IikpKSkgeworCQkJLyogV2UgZm91bmQgYSBmaWxlIHdpdGggbmFtZSBkaWN0XyouZmR4LCBhdHRlbXB0IHRvIGxvYWQgaXQgKi8KKwkJCXN0cnVjdCBleHRfaW5mbyAqIG5ldyA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGV4dF9pbmZvKSk7CisJCQlDSEVDSyggMSwgbmV3ID8gMTowKTsKKwkJCWZkX2xpc3RfaW5pdCgmbmV3LT5jaGFpbiwgbmV3KTsKKwkJCQorCQkJc25wcmludGYoZnVsbG5hbWUgKyBwYXRobGVuLCBzaXplb2YoZnVsbG5hbWUpIC0gcGF0aGxlbiwgIiVzIiwgZHAtPmRfbmFtZSk7CisJCQkKKwkJCUxPR19EKCJFeHRlbnNpb246ICclcyciLCBkcC0+ZF9uYW1lKTsKKwkJCQorCQkJLyogbG9hZCAqLworCQkJbmV3LT5oYW5kbGVyID0gZGxvcGVuKGZ1bGxuYW1lLCBSVExEX05PVyB8IFJUTERfR0xPQkFMKTsKKwkJCWlmICghbmV3LT5oYW5kbGVyKSB7CisJCQkJVFJBQ0VfREVCVUcoSU5GTywgIlVuYWJsZSB0byBsb2FkICclcyc6ICVzLiIsIGZ1bGxuYW1lLCBkbGVycm9yKCkpOworCQkJfQorCQkJQ0hFQ0soIDAsIG5ldy0+aGFuZGxlciA9PSBOVUxMID8gMSA6IDAgKTsKKwkJCQorCQkJLyogcmVzb2x2ZSBlbnRyeSAqLworCQkJbmV3LT5pbml0X2NiID0gZGxzeW0oIG5ldy0+aGFuZGxlciwgImZkX2V4dF9pbml0IiApOworCQkJaWYgKCFuZXctPmluaXRfY2IpIHsKKwkJCQlUUkFDRV9ERUJVRyhJTkZPLCAiTm8gJ2ZkX2V4dF9pbml0JyBlbnRyeSBwb2ludCBpbiAnJXMnOiAlcy4iLCBmdWxsbmFtZSwgZGxlcnJvcigpKTsKKwkJCX0KKwkJCUNIRUNLKCAwLCBuZXctPmluaXRfY2IgPT0gTlVMTCA/IDEgOiAwICk7CisJCQkKKwkJCW5ldy0+ZGVwZW5kcyA9IGRsc3ltKCBuZXctPmhhbmRsZXIsICJmZF9leHRfZGVwZW5kcyIgKTsKKwkJCWlmIChuZXctPmRlcGVuZHMpIHsKKwkJCQluZXctPmV4dF9uYW1lID0gKGNoYXIgKiluZXctPmRlcGVuZHNbMF07CisJCQkJbmV3LT5mcmVlX2V4dF9uYW1lID0gMDsKKwkJCQlpZiAoIG5ldy0+ZGVwZW5kc1sxXSApIHsKKwkJCQkJZmRfbGlzdF9pbnNlcnRfYmVmb3JlKCZleHRfd2l0aF9kZXBlbmRzLCAmbmV3LT5jaGFpbik7CisJCQkJfSBlbHNlIHsKKwkJCQkJZmRfbGlzdF9pbnNlcnRfYmVmb3JlKCZhbGxfZXh0ZW5zaW9ucywgJm5ldy0+Y2hhaW4pOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJbmV3LT5leHRfbmFtZSA9IHN0cmR1cChiYXNlbmFtZShkcC0+ZF9uYW1lKSk7CisJCQkJbmV3LT5mcmVlX2V4dF9uYW1lID0gMTsKKwkJCQlmZF9saXN0X2luc2VydF9iZWZvcmUoJmFsbF9leHRlbnNpb25zLCAmbmV3LT5jaGFpbik7CisJCQl9CisJCQkKKwkJfQorCX0KKwkKKwkvKiBOb3csIHJlb3JkZXIgdGhlIGxpc3QgYnkgZGVwZW5kZW5jaWVzICovCisJeworCQlpbnQgY291bnQsIHByZXZjb3VudCA9IDA7CisJCXN0cnVjdCBmZF9saXN0ICogbGk7CisJCWRvIHsKKwkJCWNvdW50ID0gMDsKKwkJCWZvciAobGk9ZXh0X3dpdGhfZGVwZW5kcy5uZXh0OyBsaSAhPSAmZXh0X3dpdGhfZGVwZW5kczsgbGk9bGktPm5leHQpIHsKKwkJCQlzdHJ1Y3QgZXh0X2luZm8gKiBlID0gbGktPm87CisJCQkJaW50IGQ7CisJCQkJaW50IHNhdGlzZmllZD0wOworCQkJCQorCQkJCS8qIENhbiB3ZSBzYXRpc2Z5IGFsbCBkZXBlbmRlbmNpZXM/ICovCisJCQkJZm9yIChkPTE7ICA7ZCsrKSB7CisJCQkJCXN0cnVjdCBmZF9saXN0ICogZWxpOworCQkJCQlpZiAoIWUtPmRlcGVuZHNbZF0pIHsKKwkJCQkJCXNhdGlzZmllZCA9IDE7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQkKKwkJCQkJLyogY2FuIHdlIGZpbmQgdGhpcyBkZXBlbmRlbmN5IGluIHRoZSBsaXN0PyAqLworCQkJCQlmb3IgKGVsaT1hbGxfZXh0ZW5zaW9ucy5uZXh0OyBlbGkgIT0gJmFsbF9leHRlbnNpb25zOyBlbGkgPSBlbGktPm5leHQpIHsKKwkJCQkJCXN0cnVjdCBleHRfaW5mbyAqIGRlID0gZWxpLT5vOworCQkJCQkJaWYgKCFzdHJjYXNlY21wKGRlLT5leHRfbmFtZSwgZS0+ZGVwZW5kc1tkXSkpCisJCQkJCQkJYnJlYWs7IC8qIHRoaXMgZGVwZW5kZW5jeSBpcyBzYXRpc2ZpZWQgKi8KKwkJCQkJfQorCQkJCQkKKwkJCQkJaWYgKGVsaSA9PSAmYWxsX2V4dGVuc2lvbnMpIHsKKwkJCQkJCXNhdGlzZmllZCA9IDA7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCQkKKwkJCQlpZiAoc2F0aXNmaWVkKSB7CisJCQkJCS8qIE9LLCB3ZSBoYXZlIGFsbCBvdXIgZGVwZW5kZW5jaWVzIGluIHRoZSBsaXN0ICovCisJCQkJCWxpPWxpLT5wcmV2OworCQkJCQlmZF9saXN0X3VubGluaygmZS0+Y2hhaW4pOworCQkJCQlmZF9saXN0X2luc2VydF9iZWZvcmUoJmFsbF9leHRlbnNpb25zLCAmZS0+Y2hhaW4pOworCQkJCX0gZWxzZSB7CisJCQkJCWNvdW50Kys7CisJCQkJfQorCQkJfQorCQkJCisJCQlpZiAocHJldmNvdW50ICYmIChwcmV2Y291bnQgPT0gY291bnQpKSB7CisJCQkJTE9HX0UoIlNvbWUgZXh0ZW5zaW9ucyBjYW5ub3QgaGF2ZSB0aGVpciBkZXBlbmRlbmNpZXMgc2F0aXNmaWVkLCBlLmcuOiAlcyIsICgoc3RydWN0IGV4dF9pbmZvICopZXh0X3dpdGhfZGVwZW5kcy5uZXh0LT5vKS0+ZXh0X25hbWUpOworCQkJCUNIRUNLKDAsIDEpOworCQkJfQorCQkJcHJldmNvdW50ID0gY291bnQ7CisJCQkKKwkJCWlmIChGRF9JU19MSVNUX0VNUFRZKCZleHRfd2l0aF9kZXBlbmRzKSkKKwkJCQlicmVhazsKKwkJfSB3aGlsZSAoMSk7CisJfQorCQorCS8qIE5vdywgbG9hZCBhbGwgdGhlIGV4dGVuc2lvbnMgKi8KKwl7CisJCXN0cnVjdCBmZF9saXN0ICogbGk7CisJCWZvciAobGk9YWxsX2V4dGVuc2lvbnMubmV4dDsgbGkgIT0gJmFsbF9leHRlbnNpb25zOyBsaT1saS0+bmV4dCkgeworCQkJc3RydWN0IGV4dF9pbmZvICogZSA9IGxpLT5vOworCQkJaW50IHJldCA9ICgqZS0+aW5pdF9jYikoIEZEX1BST0pFQ1RfVkVSU0lPTl9NQUpPUiwgRkRfUFJPSkVDVF9WRVJTSU9OX01JTk9SLCBOVUxMICk7CisJCQlMT0dfTigiSW5pdGlhbGl6aW5nIGV4dGVuc2lvbiAnJXMnOiAlcyIsIGUtPmV4dF9uYW1lLCByZXQgPyBzdHJlcnJvcihyZXQpIDogIlN1Y2Nlc3MiKTsKKwkJfQorCX0KKwkKKwkvKiBXZSBzaG91bGQgcHJvYmFibHkgY2xlYW4gdGhlIGxpc3QgaGVyZSA/ICovCit9CisKKy8qIE1haW4gdGVzdCByb3V0aW5lICovCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCXN0cnVjdCBtc2cgKiBhY3IgPSBOVUxMOworCXVuc2lnbmVkIGNoYXIgKiBidWYgPSBOVUxMOworCQorCWludCBkaWN0aW9uYXJpZXNfbG9hZGVkID0gMDsKKwkKKwl0ZXN0X3BhcmFtZXRlciA9IERFRkFVTFRfTlVNQkVSX09GX1NBTVBMRVM7CisJCisJLyogRmlyc3QsIGluaXRpYWxpemUgdGhlIGRhZW1vbiBtb2R1bGVzICovCisJSU5JVF9GRCgpOworCUNIRUNLKCAwLCBmZF9xdWV1ZXNfaW5pdCgpICApOworCUNIRUNLKCAwLCBmZF9tc2dfaW5pdCgpICApOworCUNIRUNLKCAwLCBmZF9ydGRpc3BfaW5pdCgpICApOworCQorCQorCXsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYWNyX21vZGVsID0gTlVMTDsKKworCQkvKiBOb3cgZmluZCB0aGUgQUNSIGRpY3Rpb25hcnkgb2JqZWN0ICovCisJCUNIRUNLKCAwLCBmZF9kaWN0X3NlYXJjaCAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9DT01NQU5ELCBDTURfQllfTkFNRSwgIkFjY291bnRpbmctUmVxdWVzdCIsICZhY3JfbW9kZWwsIEVOT0VOVCApICk7CisKKwkJLyogQ3JlYXRlIHRoZSBpbnN0YW5jZSwgdXNpbmcgdGhlIHRlbXBsYXRlcyAqLworCQlDSEVDSyggMCwgZmRfbXNnX25ldyAoIGFjcl9tb2RlbCwgMCwgJmFjciApICk7CisJfQorCQorCS8qIE5vdyBsZXQncyBjcmVhdGUgc29tZSBhZGRpdGlvbmFsIERpY3Rpb25hcnkgb2JqZWN0cyBmb3IgdGhlIHRlc3QgKi8KKwl7CisJCS8qIFRoZSBjb25zdGFudCB2YWx1ZXMgdXNlZCBoZXJlIGFyZSB0b3RhbGx5IGFyYml0cmFyeSBjaG9zZW4gKi8KKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogdmVuZG9yOworCQl7CisJCQlzdHJ1Y3QgZGljdF92ZW5kb3JfZGF0YSB2ZW5kb3JfZGF0YSA9IHsgNzM1NjUsICJWZW5kb3IgdGVzdCIgfTsKKwkJCUNIRUNLKCAwLCBmZF9kaWN0X25ldyAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9WRU5ET1IsICZ2ZW5kb3JfZGF0YSAsIE5VTEwsICZ2ZW5kb3IgKSApOworCQl9CisJCQorCQl7CisJCQlzdHJ1Y3QgZGljdF9hcHBsaWNhdGlvbl9kYXRhIGFwcF9kYXRhID0geyA3MzU2NiwgIkFwcGxpY2F0aW9uIHRlc3QiIH07CisJCQlDSEVDSyggMCwgZmRfZGljdF9uZXcgKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVBQTElDQVRJT04sICZhcHBfZGF0YSAsIHZlbmRvciwgTlVMTCApICk7CisJCX0KKwkJCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGF2cF9kYXRhID0geyA3MzU2NywgMCwgIkFWUCBUZXN0IC0gbm8gdmVuZG9yIC0gZjMyIiwgMCwgMCwgQVZQX1RZUEVfRkxPQVQzMiB9OworCQkJQ0hFQ0soIDAsIGZkX2RpY3RfbmV3ICggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgJmF2cF9kYXRhICwgTlVMTCwgTlVMTCApICk7CisJCX0KKwkJCisJCXsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhIGF2cF9kYXRhID0geyAxMzkxMDMsIDAsICJBVlAgVGVzdCAtIG5vIHZlbmRvciAtIGY2NCIsIDAsIDAsIEFWUF9UWVBFX0ZMT0FUNjQgfTsKKwkJCUNIRUNLKCAwLCBmZF9kaWN0X25ldyAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsICZhdnBfZGF0YSAsIE5VTEwsIE5VTEwgKSApOworCQl9CisJCQorCQl7IAorCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAqIHR5cGUgPSBOVUxMOworCQkJc3RydWN0IGRpY3RfdHlwZV9kYXRhIHR5cGVfZGF0YSA9IHsgQVZQX1RZUEVfSU5URUdFUjY0LCAiSW50NjQgdGVzdCIgfTsKKwkJCXN0cnVjdCBkaWN0X2F2cF9kYXRhICBhdnBfZGF0YSA9IHsgNzM1NjgsIDczNTY1LCAiQVZQIFRlc3QgLSBpNjQiLCBBVlBfRkxBR19WRU5ET1IsIEFWUF9GTEFHX1ZFTkRPUiwgQVZQX1RZUEVfSU5URUdFUjY0IH07CisJCQlDSEVDSyggMCwgZmRfZGljdF9uZXcgKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfVFlQRSwgJnR5cGVfZGF0YSAsIE5VTEwsICZ0eXBlICkgKTsKKwkJCUNIRUNLKCAwLCBmZF9kaWN0X25ldyAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsICZhdnBfZGF0YSAsIHR5cGUsIE5VTEwgKSApOworCQl9CisJCQorCQl7CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICAgICogdHlwZSA9IE5VTEw7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgICAgdHlwZV9kYXRhID0geyBBVlBfVFlQRV9JTlRFR0VSMzIsICJFbnVtMzIgdGVzdCIgfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSB2YWwxID0geyAiaTMyIGNvbnN0IHRlc3QgKHZhbCAxKSIsIHsgLmkzMiA9IDEgfSB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIHZhbDIgPSB7ICJpMzIgY29uc3QgdGVzdCAodmFsIDIpIiwgeyAuaTMyID0gMiB9IH07CisJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX2RhdGEgdmFsMyA9IHsgImkzMiBjb25zdCB0ZXN0ICh2YWwgLTUpIix7IC5pMzIgPSAtNSB9IH07CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSAgICAgYXZwX2RhdGEgPSB7IDczNTY5LCA3MzU2NSwgIkFWUCBUZXN0IC0gZW51bWkzMiIsIEFWUF9GTEFHX1ZFTkRPUiwgQVZQX0ZMQUdfVkVORE9SLCBBVlBfVFlQRV9JTlRFR0VSMzIgfTsKKwkJCQorCQkJQ0hFQ0soIDAsIGZkX2RpY3RfbmV3ICggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1RZUEUsICZ0eXBlX2RhdGEgLCBOVUxMLCAmdHlwZSApICk7CisJCQlDSEVDSyggMCwgZmRfZGljdF9uZXcgKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCAmYXZwX2RhdGEgLCB0eXBlLCBOVUxMICkgKTsKKwkJCUNIRUNLKCAwLCBmZF9kaWN0X25ldyAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9FTlVNVkFMLCAmdmFsMSAsIHR5cGUsIE5VTEwgKSApOworCQkJQ0hFQ0soIDAsIGZkX2RpY3RfbmV3ICggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0VOVU1WQUwsICZ2YWwyICwgdHlwZSwgTlVMTCApICk7CisJCQlDSEVDSyggMCwgZmRfZGljdF9uZXcgKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfRU5VTVZBTCwgJnZhbDMgLCB0eXBlLCBOVUxMICkgKTsKKwkJfQorCQkJCisJCXsgCisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICogdHlwZSA9IE5VTEw7CisJCQlzdHJ1Y3QgZGljdF90eXBlX2RhdGEgdHlwZV9kYXRhID0geyBBVlBfVFlQRV9PQ1RFVFNUUklORywgIk9TIHRlc3QiIH07CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSAgYXZwX2RhdGEgPSB7IDczNTcwLCA3MzU2NSwgIkFWUCBUZXN0IC0gb3MiLCBBVlBfRkxBR19WRU5ET1IsIEFWUF9GTEFHX1ZFTkRPUiwgQVZQX1RZUEVfT0NURVRTVFJJTkcgfTsKKwkJCUNIRUNLKCAwLCBmZF9kaWN0X25ldyAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9UWVBFLCAmdHlwZV9kYXRhICwgTlVMTCwgJnR5cGUgKSApOworCQkJQ0hFQ0soIDAsIGZkX2RpY3RfbmV3ICggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgJmF2cF9kYXRhICwgdHlwZSwgTlVMTCApICk7CisJCX0KKwkJCisJCXsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgICAgKiB0eXBlID0gTlVMTDsKKwkJCXN0cnVjdCBkaWN0X3R5cGVfZGF0YSAgICB0eXBlX2RhdGEgPSB7IEFWUF9UWVBFX09DVEVUU1RSSU5HLCAiT1MgZW51bSB0ZXN0IiB9OworCQkJc3RydWN0IGRpY3RfZW51bXZhbF9kYXRhIHZhbDEgPSB7ICJvcyBjb25zdCB0ZXN0IChUZXN0KSIsIHsgLm9zID0geyAodW5zaWduZWQgY2hhciAqKSJUZXN0IiwgNCB9IH0gfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSB2YWwyID0geyAib3MgY29uc3QgdGVzdCAod2FhYWQpIiwgeyAub3MgPSB7ICh1bnNpZ25lZCBjaGFyICopIndhYWFkIiwgNSB9IH0gfTsKKwkJCXN0cnVjdCBkaWN0X2VudW12YWxfZGF0YSB2YWwzID0geyAib3MgY29uc3QgdGVzdCAod2FhKSIsIHsgLm9zID0geyAodW5zaWduZWQgY2hhciAqKSJ3YWFhZCIsIDMgfSB9IH07CisJCQlzdHJ1Y3QgZGljdF9hdnBfZGF0YSAgICAgYXZwX2RhdGEgPSB7IDczNTcxLCA3MzU2NSwgIkFWUCBUZXN0IC0gZW51bW9zIiwgQVZQX0ZMQUdfVkVORE9SLCBBVlBfRkxBR19WRU5ET1IsIEFWUF9UWVBFX09DVEVUU1RSSU5HIH07CisJCQkKKwkJCUNIRUNLKCAwLCBmZF9kaWN0X25ldyAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9UWVBFLCAmdHlwZV9kYXRhICwgTlVMTCwgJnR5cGUgKSApOworCQkJQ0hFQ0soIDAsIGZkX2RpY3RfbmV3ICggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgJmF2cF9kYXRhICwgdHlwZSwgTlVMTCApICk7CisJCQlDSEVDSyggMCwgZmRfZGljdF9uZXcgKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfRU5VTVZBTCwgJnZhbDEgLCB0eXBlLCBOVUxMICkgKTsKKwkJCUNIRUNLKCAwLCBmZF9kaWN0X25ldyAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9FTlVNVkFMLCAmdmFsMiAsIHR5cGUsIE5VTEwgKSApOworCQkJQ0hFQ0soIDAsIGZkX2RpY3RfbmV3ICggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0VOVU1WQUwsICZ2YWwzICwgdHlwZSwgTlVMTCApICk7CisJCX0KKwkJCisJCXsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAqIGdhdnAgPSBOVUxMOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgYXZwX2RhdGEgPSB7IDczNTcyLCA3MzU2NSwgIkFWUCBUZXN0IC0gZ3JvdXBlZCIsIEFWUF9GTEFHX1ZFTkRPUiwgQVZQX0ZMQUdfVkVORE9SLCBBVlBfVFlQRV9HUk9VUEVEIH07CisJCQkKKwkJCUNIRUNLKCAwLCBmZF9kaWN0X25ldyAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BVlAsICZhdnBfZGF0YSAsIE5VTEwsICZnYXZwICkgKTsKKwkJCQorCQkJLyogTWFjcm8gdG8gc2VhcmNoIEFWUCBhbmQgY3JlYXRlIGEgcnVsZSAqLwkJCisJCQkjZGVmaW5lIEFERF9SVUxFKCBfcGFyZW50LCBfdmVuZG9yLCBfYXZwbmFtZSwgX3BvcywgX21pbiwgX21heCwgX29yZCApIHsJCVwKKwkJCQlzdHJ1Y3QgZGljdF9vYmplY3QgKiBfYXZwID0gTlVMTDsJCQkJCQlcCisJCQkJc3RydWN0IGRpY3RfYXZwX3JlcXVlc3QgX3JlcSA9IHsgKF92ZW5kb3IpLCAwLCAoX2F2cG5hbWUpIH07CQkJXAorCQkJCXN0cnVjdCBkaWN0X3J1bGVfZGF0YSBfZGF0YTsJCQkJCQkJXAorCQkJCUNIRUNLKCAwLCBmZF9kaWN0X3NlYXJjaCggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgQVZQX0JZX05BTUVfQU5EX1ZFTkRPUiwgJl9yZXEsICZfYXZwLCBFTk9FTlQpKTtcCisJCQkJX2RhdGEucnVsZV9hdnAgPSBfYXZwOwkJCQkJCQkJXAorCQkJCV9kYXRhLnJ1bGVfcG9zaXRpb24gPSAoX3Bvcyk7CQkJCQkJCVwKKwkJCQlfZGF0YS5ydWxlX29yZGVyID0gKF9vcmQpOwkJCQkJCQlcCisJCQkJX2RhdGEucnVsZV9taW4gPSAoX21pbik7CQkJCQkJCVwKKwkJCQlfZGF0YS5ydWxlX21heCA9IChfbWF4KTsJCQkJCQkJXAorCQkJCUNIRUNLKCAwLCBmZF9kaWN0X25ldyAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9SVUxFLCAmX2RhdGEgLCAoX3BhcmVudCksIE5VTEwgKSApOwlcCisJCQl9CisJCQkKKwkJCUFERF9SVUxFKGdhdnAsIDczNTY1LCAiQVZQIFRlc3QgLSBvcyIsIFJVTEVfT1BUSU9OQUwsICAgLTEsIC0xLCAgMCk7CisJCQkKKwkJfQorCQkJCisJCXsKKwkJCXN0cnVjdCBkaWN0X29iamVjdCAgKiBhcHBsaWNhdGlvbiA9IE5VTEw7CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICogY29tbWFuZCA9IE5VTEw7CisJCQlzdHJ1Y3QgZGljdF9jbWRfZGF0YSAgY21kX2RhdGEgPSB7IDczNTczLCAiVGVzdC1Db21tYW5kLVJlcXVlc3QiLCBDTURfRkxBR19SRVFVRVNULCBDTURfRkxBR19SRVFVRVNUIH07CisJCQkKKwkJCUNIRUNLKCAwLCBmZF9kaWN0X3NlYXJjaCAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BUFBMSUNBVElPTiwgQVBQTElDQVRJT05fQllfTkFNRSwgIkFwcGxpY2F0aW9uIHRlc3QiLCAmYXBwbGljYXRpb24sIEVOT0VOVCApICk7CisJCQlDSEVDSyggMCwgZmRfZGljdF9uZXcgKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQ09NTUFORCwgJmNtZF9kYXRhICwgYXBwbGljYXRpb24sICZjb21tYW5kICkgKTsKKwkJCUFERF9SVUxFKGNvbW1hbmQsIDAsICAgICAiQVZQIFRlc3QgLSBubyB2ZW5kb3IgLSBmMzIiLCAJUlVMRV9GSVhFRF9IRUFELCAtMSwgIDEsICAxKTsKKwkJCUFERF9SVUxFKGNvbW1hbmQsIDczNTY1LCAiQVZQIFRlc3QgLSBpNjQiLAkJUlVMRV9SRVFVSVJFRCwgICAtMSwgLTEsICAwKTsKKwkJCUFERF9SVUxFKGNvbW1hbmQsIDczNTY1LCAiQVZQIFRlc3QgLSBlbnVtaTMyIiwgCQlSVUxFX09QVElPTkFMLCAgIC0xLCAtMSwgIDApOworCQkJQUREX1JVTEUoY29tbWFuZCwgNzM1NjUsICJBVlAgVGVzdCAtIG9zIiwgCQlSVUxFX09QVElPTkFMLCAgIC0xLCAtMSwgIDApOworCQkJQUREX1JVTEUoY29tbWFuZCwgNzM1NjUsICJBVlAgVGVzdCAtIGVudW1vcyIsIAkJUlVMRV9PUFRJT05BTCwgICAtMSwgLTEsICAwKTsKKwkJCUFERF9SVUxFKGNvbW1hbmQsIDczNTY1LCAiQVZQIFRlc3QgLSBncm91cGVkIiwgCQlSVUxFX09QVElPTkFMLCAgIC0xLCAtMSwgIDApOworCQl9CisJCQorCQl7CisJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICogYXBwbGljYXRpb24gPSBOVUxMOworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAqIGNvbW1hbmQgPSBOVUxMOworCQkJc3RydWN0IGRpY3RfY21kX2RhdGEgIGNtZF9kYXRhID0geyA3MzU3MywgIlRlc3QtQ29tbWFuZC1BbnN3ZXIiLCBDTURfRkxBR19SRVFVRVNULCAwIH07CisJCQkKKwkJCUNIRUNLKCAwLCBmZF9kaWN0X3NlYXJjaCAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9BUFBMSUNBVElPTiwgQVBQTElDQVRJT05fQllfTkFNRSwgIkFwcGxpY2F0aW9uIHRlc3QiLCAmYXBwbGljYXRpb24sIEVOT0VOVCApICk7CisJCQlDSEVDSyggMCwgZmRfZGljdF9uZXcgKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQ09NTUFORCwgJmNtZF9kYXRhICwgYXBwbGljYXRpb24sICZjb21tYW5kICkgKTsKKwkJfQorCQkKKwkJeworCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAqIGdhdnAgPSBOVUxMOworCQkJc3RydWN0IGRpY3RfYXZwX2RhdGEgIGF2cF9kYXRhID0geyA3MzU3NCwgNzM1NjUsICJBVlAgVGVzdCAtIHJ1bGVzIiwgQVZQX0ZMQUdfVkVORE9SLCBBVlBfRkxBR19WRU5ET1IsIEFWUF9UWVBFX0dST1VQRUQgfTsKKwkJCQorCQkJQ0hFQ0soIDAsIGZkX2RpY3RfbmV3ICggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0FWUCwgJmF2cF9kYXRhICwgTlVMTCwgJmdhdnAgKSApOworCQkJCisJCQlBRERfUlVMRShnYXZwLCAgICAgMCwgIkFWUCBUZXN0IC0gbm8gdmVuZG9yIC0gZjMyIiwgUlVMRV9GSVhFRF9IRUFELCAgIDAsIDEsIDEpOworCQkJQUREX1JVTEUoZ2F2cCwgNzM1NjUsICJBVlAgVGVzdCAtIGk2NCIsIAkgICAgUlVMRV9GSVhFRF9IRUFELCAgLTEsIDEsIDIpOworCQkJQUREX1JVTEUoZ2F2cCwgNzM1NjUsICJBVlAgVGVzdCAtIGVudW1pMzIiLCAJICAgIFJVTEVfRklYRURfSEVBRCwgIC0xLCAxLCAzKTsKKwkJCUFERF9SVUxFKGdhdnAsIDczNTY1LCAiQVZQIFRlc3QgLSBvcyIsIAkgICAgCSAgICBSVUxFX1JFUVVJUkVELCAgICAgMiwgMywgMCk7CisJCQlBRERfUlVMRShnYXZwLCA3MzU2NSwgIkFWUCBUZXN0IC0gZW51bW9zIiwgICAgIAkgICAgUlVMRV9PUFRJT05BTCwgICAgIDAsIDEsIDApOworCQkJQUREX1JVTEUoZ2F2cCwgNzM1NjUsICJBVlAgVGVzdCAtIGdyb3VwZWQiLCAgICAgICAgIFJVTEVfRklYRURfVEFJTCwgIC0xLCAxLCAxKTsKKwkJCS8qIEFCTkYgOiAKKwkJCQk8IG5vIHZlbmRvciAtIGYzMiA+CisJCQkJPCBpNjQgPgorCQkJCTwgZW51bWkzMiA+CisJCQkgICAgMiozIHsgb3MgfQorCQkJICAgICAqMSBbIGVudW1vcyBdCisJCQkJPCBncm91cGVkID4KKwkJCQkJCSovCisJCX0KKwl9CisJCisJLyogTm93IGNyZWF0ZSBzb21lIHZhbHVlcyBhbmQgY2hlY2sgdGhlIGxlbmd0aCBpcyBjb3JyZWN0bHkgaGFuZGxlZCAqLworCXsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogY21kX21vZGVsID0gTlVMTDsKKwkJc3RydWN0IG1zZyAgICAgICAgICogbXNnID0gTlVMTDsKKwkJc3RydWN0IGRpY3Rfb2JqZWN0ICogYXZwX21vZGVsID0gTlVMTDsKKwkJdW5pb24gYXZwX3ZhbHVlICAgICAgdmFsdWU7CisJCQorCQlDSEVDSyggMCwgZmRfZGljdF9zZWFyY2ggKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQ09NTUFORCwgQ01EX0JZX05BTUUsICJUZXN0LUNvbW1hbmQtUmVxdWVzdCIsICZjbWRfbW9kZWwsIEVOT0VOVCApICk7CisJCQorCQkvKiBDaGVjayB0aGUgc2l6ZXMgYXJlIGhhbmRsZWQgcHJvcGVybHkgKi8KKwkJeworCQkJc3RydWN0IGF2cCAqIGF2cGkgPSBOVUxMOworCQkJc3RydWN0IGF2cCAqIGF2cGNoID0gTlVMTDsKKwkJCXN0cnVjdCBtc2dfaGRyICogbXNnZGF0YSA9IE5VTEw7CisJCQkjZGVmaW5lIEFERF9BVlAoIF9wYXJlbnQsIF9wb3NpdGlvbiwgX2F2cGksIF9hdnB2ZW5kb3IsIF9hdnBuYW1lKSB7CQkJXAorCQkJCXN0cnVjdCBkaWN0X29iamVjdCAqIF9hdnAgPSBOVUxMOwkJCQkJCVwKKwkJCQlzdHJ1Y3QgZGljdF9hdnBfcmVxdWVzdCBfcmVxID0geyAoX2F2cHZlbmRvciksIDAsIChfYXZwbmFtZSkgfTsJCQlcCisJCQkJQ0hFQ0soIDAsIGZkX2RpY3Rfc2VhcmNoKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIERJQ1RfQVZQLCBBVlBfQllfTkFNRV9BTkRfVkVORE9SLCAmX3JlcSwgJl9hdnAsIEVOT0VOVCkpO1wKKwkJCQlDSEVDSyggMCwgZmRfbXNnX2F2cF9uZXcgKCBfYXZwLCAwLCAmX2F2cGkgKSApOwkJCQkJXAorCQkJCUNIRUNLKCAwLCBmZF9tc2dfYXZwX2FkZCAoIChfcGFyZW50KSwgKF9wb3NpdGlvbiksIF9hdnBpICkgKTsJCQlcCisJCQl9CisJCQkvKiBDcmVhdGUgYSBtZXNzYWdlIHdpdGggbWFueSBBVlAgaW5zaWRlICovCisJCQlDSEVDSyggMCwgZmRfbXNnX25ldyAoIGNtZF9tb2RlbCwgMCwgJm1zZyApICk7CisJCQlDSEVDSyggMCwgZmRfbXNnX2hkciAoIG1zZywgJm1zZ2RhdGEgKSApOworCQkJCisJCQkvKiBBdnAgbm8gdmVuZG9yLCBmbG9hdDMyID0+IHNpemUgPSAxMiAqLworCQkJQUREX0FWUCggbXNnLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cGksIDAsICAgICAiQVZQIFRlc3QgLSBubyB2ZW5kb3IgLSBmMzIiICk7CisJCQl2YWx1ZS5mMzIgPSAzLjE0MTU7CisJCQlDSEVDSyggMCwgZmRfbXNnX2F2cF9zZXR2YWx1ZSAoIGF2cGksICZ2YWx1ZSApICk7CisJCQkKKwkJCS8qIEFkZCBhIHZlbmRvciBBVlAsIGludGVnZXI2NCA9PiBzaXplID0gMjAgKi8KKwkJCUFERF9BVlAoIG1zZywgTVNHX0JSV19MQVNUX0NISUxELCBhdnBpLCA3MzU2NSwgIkFWUCBUZXN0IC0gaTY0IiApOworCQkJdmFsdWUuaTY0ID0gMHgxMjM0NTY3ODlhYmNkZUxMOworCQkJQ0hFQ0soIDAsIGZkX21zZ19hdnBfc2V0dmFsdWUgKCBhdnBpLCAmdmFsdWUgKSApOworCQkJCisJCQkvKiBBZGQgYW4gQVZQIHdpdGggYW4gZW51bSB2YWx1ZSAqLworCQkJQUREX0FWUCggbXNnLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cGksIDczNTY1LCAiQVZQIFRlc3QgLSBlbnVtaTMyIiApOworCQkJeworCQkJCXN0cnVjdCBkaWN0X29iamVjdCAqIHR5cGVfbW9kZWwgPSBOVUxMOworCQkJCXN0cnVjdCBkaWN0X29iamVjdCAqIHZhbHVlX21vZGVsID0gTlVMTDsKKwkJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX3JlcXVlc3QgcmVxdWVzdDsKKwkJCQkKKwkJCQlDSEVDSyggMCwgZmRfbXNnX21vZGVsICggYXZwaSwgJmF2cF9tb2RlbCApICk7CisJCQkJQ0hFQ0soIDAsIGZkX2RpY3Rfc2VhcmNoICggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1RZUEUsIFRZUEVfT0ZfQVZQLCBhdnBfbW9kZWwsICZ0eXBlX21vZGVsLCBFTk9FTlQgKSApOworCQkJCW1lbXNldCgmcmVxdWVzdCwgMCwgc2l6ZW9mKHJlcXVlc3QpKTsKKwkJCQlyZXF1ZXN0LnR5cGVfb2JqID0gdHlwZV9tb2RlbDsKKwkJCQlyZXF1ZXN0LnNlYXJjaC5lbnVtX25hbWUgPSAiaTMyIGNvbnN0IHRlc3QgKHZhbCAyKSI7CisJCQkJQ0hFQ0soIDAsIGZkX2RpY3Rfc2VhcmNoICggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0VOVU1WQUwsIEVOVU1WQUxfQllfU1RSVUNULCAmcmVxdWVzdCwgJnZhbHVlX21vZGVsLCBFTk9FTlQgKSApOworCQkJCUNIRUNLKCAwLCBmZF9kaWN0X2dldHZhbCAoIHZhbHVlX21vZGVsLCAmcmVxdWVzdC5zZWFyY2ggKSApOworCQkJCUNIRUNLKCAwLCBmZF9tc2dfYXZwX3NldHZhbHVlICggYXZwaSwgJnJlcXVlc3Quc2VhcmNoLmVudW1fdmFsdWUgKSApOworCQkJfQorCQkJCisJCQkvKiBBZGQgYW4gQVZQIHdpdGggYW4gZW51bSB2YWx1ZSwgbmVnYXRpdmUgKi8KKwkJCUFERF9BVlAoIG1zZywgTVNHX0JSV19MQVNUX0NISUxELCBhdnBpLCA3MzU2NSwgIkFWUCBUZXN0IC0gZW51bWkzMiIgKTsKKwkJCXsKKwkJCQlzdHJ1Y3QgZGljdF9vYmplY3QgICogdHlwZV9tb2RlbCA9IE5VTEw7CisJCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAqIHZhbHVlX21vZGVsID0gTlVMTDsKKwkJCQlzdHJ1Y3QgZGljdF9lbnVtdmFsX3JlcXVlc3QgcmVxdWVzdDsKKwkJCQkKKwkJCQlDSEVDSyggMCwgZmRfbXNnX21vZGVsICggYXZwaSwgJmF2cF9tb2RlbCApICk7CisJCQkJQ0hFQ0soIDAsIGZkX2RpY3Rfc2VhcmNoICggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX1RZUEUsIFRZUEVfT0ZfQVZQLCBhdnBfbW9kZWwsICZ0eXBlX21vZGVsLCBFTk9FTlQgKSApOworCQkJCW1lbXNldCgmcmVxdWVzdCwgMCwgc2l6ZW9mKHJlcXVlc3QpKTsKKwkJCQlyZXF1ZXN0LnR5cGVfb2JqID0gdHlwZV9tb2RlbDsKKwkJCQlyZXF1ZXN0LnNlYXJjaC5lbnVtX25hbWUgPSAiaTMyIGNvbnN0IHRlc3QgKHZhbCAtNSkiOworCQkJCUNIRUNLKCAwLCBmZF9kaWN0X3NlYXJjaCAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9FTlVNVkFMLCBFTlVNVkFMX0JZX1NUUlVDVCwgJnJlcXVlc3QsICZ2YWx1ZV9tb2RlbCwgRU5PRU5UICkgKTsKKwkJCQlDSEVDSyggMCwgZmRfZGljdF9nZXR2YWwgKCB2YWx1ZV9tb2RlbCwgJnJlcXVlc3Quc2VhcmNoICkgKTsKKwkJCQlDSEVDSyggMCwgZmRfbXNnX2F2cF9zZXR2YWx1ZSAoIGF2cGksICZyZXF1ZXN0LnNlYXJjaC5lbnVtX3ZhbHVlICkgKTsKKwkJCX0KKwkJCQorCQkJLyogTm93IGFkZCBhIHZhbHVlIHdoaWNoIGlzIG5vdCBhIGNvbnN0YW50IGludG8gYW4gZW51bWVyYXRlZCBBVlAgKi8KKwkJCUFERF9BVlAoIG1zZywgTVNHX0JSV19MQVNUX0NISUxELCBhdnBpLCA3MzU2NSwgIkFWUCBUZXN0IC0gZW51bWkzMiIgKTsKKwkJCXZhbHVlLmkzMiA9IC0xMDsKKwkJCUNIRUNLKCAwLCBmZF9tc2dfYXZwX3NldHZhbHVlICggYXZwaSwgJnZhbHVlICkgKTsKKwkJCQorCQkJLyogQWRkIGFuIG9jdGV0c3RyaW5nIEFWUCAqLworCQkJQUREX0FWUCggbXNnLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cGksIDczNTY1LCAiQVZQIFRlc3QgLSBvcyIgKTsKKwkJCXsKKwkJCQl1bnNpZ25lZCBjaGFyIGJ1Zls5MF07CisJCQkJbWVtY3B5KCZidWYsICJUaGlzXDAgaXMgYSBidWZmZXIgb2YgZGF0XGEuIEl0IGlzIG5vdCBhIHN0cmluZyBzbyB3ZSBjYW4gaGF2ZSBhbnkgY1wwbnRyXDBsIGNoYXJhY3RlciBoZXJlLi4uXDBcMCIsIDg5KTsKKwkJCQl2YWx1ZS5vcy5kYXRhID0gYnVmOworCQkJCXZhbHVlLm9zLmxlbiA9IDg5OworCQkJCUNIRUNLKCAwLCBmZF9tc2dfYXZwX3NldHZhbHVlICggYXZwaSwgJnZhbHVlICkgKTsKKwkJCQltZW1zZXQoJmJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOyAvKiBUZXN0IHRoYXQgdGhlIE9TIHZhbHVlIGlzIHJlYWxseSBjb3BpZWQgKi8KKwkJCX0KKworCQkJLyogQWRkIGFuIG9jdGV0c3RyaW5nIGZyb20gYW4gZW51bWVyYXRlZCBjb25zdGFudCAqLworCQkJQUREX0FWUCggbXNnLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cGksIDczNTY1LCAiQVZQIFRlc3QgLSBlbnVtb3MiICk7CisJCQl7CisJCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAqIHR5cGVfbW9kZWwgPSBOVUxMOworCQkJCXN0cnVjdCBkaWN0X29iamVjdCAgKiB2YWx1ZV9tb2RlbCA9IE5VTEw7CisJCQkJc3RydWN0IGRpY3RfZW51bXZhbF9yZXF1ZXN0IHJlcXVlc3Q7CisJCQkJCisJCQkJQ0hFQ0soIDAsIGZkX21zZ19tb2RlbCAoIGF2cGksICZhdnBfbW9kZWwgKSApOworCQkJCUNIRUNLKCAwLCBmZF9kaWN0X3NlYXJjaCAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9UWVBFLCBUWVBFX09GX0FWUCwgYXZwX21vZGVsLCAmdHlwZV9tb2RlbCwgRU5PRU5UICkgKTsKKwkJCQltZW1zZXQoJnJlcXVlc3QsIDAsIHNpemVvZihyZXF1ZXN0KSk7CisJCQkJcmVxdWVzdC50eXBlX29iaiA9IHR5cGVfbW9kZWw7CisJCQkJcmVxdWVzdC5zZWFyY2guZW51bV9uYW1lID0gIm9zIGNvbnN0IHRlc3QgKHdhYWFkKSI7CisJCQkJQ0hFQ0soIDAsIGZkX2RpY3Rfc2VhcmNoICggZmRfZ19jb25maWctPmNuZl9kaWN0LCBESUNUX0VOVU1WQUwsIEVOVU1WQUxfQllfU1RSVUNULCAmcmVxdWVzdCwgJnZhbHVlX21vZGVsLCBFTk9FTlQgKSApOworCQkJCUNIRUNLKCAwLCBmZF9kaWN0X2dldHZhbCAoIHZhbHVlX21vZGVsLCAmcmVxdWVzdC5zZWFyY2ggKSApOworCQkJCUNIRUNLKCAwLCBmZF9tc2dfYXZwX3NldHZhbHVlICggYXZwaSwgJnJlcXVlc3Quc2VhcmNoLmVudW1fdmFsdWUgKSApOworCQkJfQorCQkJCQorCQkJLyogQWRkIGFuIG9jdGV0c3RyaW5nIGZyb20gYW4gZW51bWVyYXRlZCBjb25zdGFudCAqLworCQkJQUREX0FWUCggbXNnLCBNU0dfQlJXX0xBU1RfQ0hJTEQsIGF2cGksIDczNTY1LCAiQVZQIFRlc3QgLSBlbnVtb3MiICk7CisJCQl7CisJCQkJc3RydWN0IGRpY3Rfb2JqZWN0ICAqIHR5cGVfbW9kZWwgPSBOVUxMOworCQkJCXN0cnVjdCBkaWN0X29iamVjdCAgKiB2YWx1ZV9tb2RlbCA9IE5VTEw7CisJCQkJc3RydWN0IGRpY3RfZW51bXZhbF9yZXF1ZXN0IHJlcXVlc3Q7CisJCQkJCisJCQkJQ0hFQ0soIDAsIGZkX21zZ19tb2RlbCAoIGF2cGksICZhdnBfbW9kZWwgKSApOworCQkJCUNIRUNLKCAwLCBmZF9kaWN0X3NlYXJjaCAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9UWVBFLCBUWVBFX09GX0FWUCwgYXZwX21vZGVsLCAmdHlwZV9tb2RlbCwgRU5PRU5UICkgKTsKKwkJCQltZW1zZXQoJnJlcXVlc3QsIDAsIHNpemVvZihyZXF1ZXN0KSk7CisJCQkJcmVxdWVzdC50eXBlX29iaiA9IHR5cGVfbW9kZWw7CisJCQkJcmVxdWVzdC5zZWFyY2guZW51bV9uYW1lID0gIm9zIGNvbnN0IHRlc3QgKHdhYSkiOworCQkJCUNIRUNLKCAwLCBmZF9kaWN0X3NlYXJjaCAoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgRElDVF9FTlVNVkFMLCBFTlVNVkFMX0JZX1NUUlVDVCwgJnJlcXVlc3QsICZ2YWx1ZV9tb2RlbCwgRU5PRU5UICkgKTsKKwkJCQlDSEVDSyggMCwgZmRfZGljdF9nZXR2YWwgKCB2YWx1ZV9tb2RlbCwgJnJlcXVlc3Quc2VhcmNoICkgKTsKKwkJCQlDSEVDSyggMCwgZmRfbXNnX2F2cF9zZXR2YWx1ZSAoIGF2cGksICZyZXF1ZXN0LnNlYXJjaC5lbnVtX3ZhbHVlICkgKTsKKwkJCX0KKwkJCQkKKwkJCS8qIE5vdyB0ZXN0IHRoZSBncm91cGVkIEFWUHMgKi8JCisJCQlBRERfQVZQKCBtc2csIE1TR19CUldfTEFTVF9DSElMRCwgYXZwaSwgNzM1NjUsICJBVlAgVGVzdCAtIGdyb3VwZWQiICk7CisJCQkgIEFERF9BVlAoIGF2cGksIE1TR19CUldfTEFTVF9DSElMRCwgYXZwY2gsIDczNTY1LCAiQVZQIFRlc3QgLSBvcyIgKTsKKwkJCSAgeworCQkJCXZhbHVlLm9zLmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSIxMjM0NTY3OCI7CisJCQkJdmFsdWUub3MubGVuID0gODsKKwkJCQlDSEVDSyggMCwgZmRfbXNnX2F2cF9zZXR2YWx1ZSAoIGF2cGNoLCAmdmFsdWUgKSApOworCQkJICB9CisJCQkgIEFERF9BVlAoIGF2cGksIE1TR19CUldfTEFTVF9DSElMRCwgYXZwY2gsIDczNTY1LCAiQVZQIFRlc3QgLSBvcyIgKTsKKwkJCSAgeworCQkJCXZhbHVlLm9zLmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSIxMjM0NTY3ODkiOworCQkJCXZhbHVlLm9zLmxlbiA9IDk7CisJCQkJQ0hFQ0soIDAsIGZkX21zZ19hdnBfc2V0dmFsdWUgKCBhdnBjaCwgJnZhbHVlICkgKTsKKwkJCSAgfQorCQkJCisJCQkvKiBBZGQgYW5vdGhlciBzaW1pbGFyIGdyb3VwZWQgQVZQLCB0byBoYXZlIGxvdCBvZiBwYWRkaW5nICovCisJCQlBRERfQVZQKCBtc2csIE1TR19CUldfTEFTVF9DSElMRCwgYXZwaSwgNzM1NjUsICJBVlAgVGVzdCAtIGdyb3VwZWQiICk7CisJCQkgIEFERF9BVlAoIGF2cGksIE1TR19CUldfTEFTVF9DSElMRCwgYXZwY2gsIDczNTY1LCAiQVZQIFRlc3QgLSBvcyIgKTsKKwkJCSAgeworCQkJCXZhbHVlLm9zLmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSIxIjsKKwkJCQl2YWx1ZS5vcy5sZW4gPSAxOworCQkJCUNIRUNLKCAwLCBmZF9tc2dfYXZwX3NldHZhbHVlICggYXZwY2gsICZ2YWx1ZSApICk7CisJCQkgIH0KKwkJCSAgQUREX0FWUCggYXZwaSwgTVNHX0JSV19MQVNUX0NISUxELCBhdnBjaCwgNzM1NjUsICJBVlAgVGVzdCAtIG9zIiApOworCQkJICB7CisJCQkJdmFsdWUub3MuZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIjEyMzQ1NjciOworCQkJCXZhbHVlLm9zLmxlbiA9IDc7CisJCQkJQ0hFQ0soIDAsIGZkX21zZ19hdnBfc2V0dmFsdWUgKCBhdnBjaCwgJnZhbHVlICkgKTsKKwkJCSAgfQorCQkJCisJCQkvKiBTZXQgdGhlIGFwcGxpY2F0aW9uIHRvIHRoZSB0ZXN0IGFwcGxpY2F0aW9uOiA3MzU2NiAqLworCQkJbXNnZGF0YS0+bXNnX2FwcGwgPSA3MzU2NjsKKwkJCQorCQkJLyogU2V0IHRoZSBob3AtYnktaG9wIElEIHRvIGEgcmFuZG9tIHZhbHVlOiAweDRiNDRiNDFkICovCisJCQltc2dkYXRhLT5tc2dfaGJoaWQgPSAweDRiNDRiNDFkOworCQkJLyogU2V0IHRoZSBlbmQtdG8tZW5kIElEIHRvIGEgcmFuZG9tIHZhbHVlOiAweGUyZWUyZTFkICovCisJCQltc2dkYXRhLT5tc2dfZXRlaWQgPSAweGUyZWUyZTFkOworCQl9CisJCQorCQlDSEVDSyggMCwgZmRfbXNnX2J1ZmZlcml6ZSggbXNnLCAmYnVmLCBOVUxMICkgKTsKKwkJCisJCUxPR19EKCAiVGVzdCBtZXNzYWdlOiAlcyIsIGZkX21zZ19kdW1wX3RyZWV2aWV3KEZEX0RVTVBfVEVTVF9QQVJBTVMsIG1zZywgTlVMTCwgMCwgMSkpOworCQkKKwkJLyogTm93IGZyZWUgdGhlIG1lc3NhZ2UsIHdlIGtlZXAgb25seSB0aGUgYnVmZmVyLiAqLworCQlDSEVDSyggMCwgZmRfbXNnX2ZyZWUoIG1zZyApICk7CisJCQorCX0KKwkKKwkvKiBXZSBoYXZlIG91ciAiYnVmIiBub3csIGxlbmd0aCBpcyAzNDQgLS0gY2YuIHRlc3RtZXNnLmMuICovCityZWRvOgkKKwkvKiBUZXN0IHRoZSB0aHJvdWdocHV0IG9mIHRoZSBkaWZmZXJlbnQgZnVuY3Rpb25zIGZ1bmN0aW9uICovCisJeworCQlzdHJ1Y3Qgc3RyZXNzX3N0cnVjdCB7CisJCQlzdHJ1Y3QgbXNnICogbTsKKwkJCXVpbnQ4X3QgKiBiOworCQl9ICogc3RyZXNzX2FycmF5OworCQlpbnQgaTsKKwkJc3RydWN0IHRpbWVzcGVjIHN0YXJ0LCBlbmQ7CisJCQorCQkvKiBDcmVhdGUgdGhlIGNvcGllcyBvZiB0aGUgbWVzc2FnZSBidWZmZXIgKi8KKwkJc3RyZXNzX2FycmF5ID0gY2FsbG9jKHRlc3RfcGFyYW1ldGVyLCBzaXplb2Yoc3RydWN0IHN0cmVzc19zdHJ1Y3QpKTsKKwkJQ0hFQ0soIHN0cmVzc19hcnJheSA/IDEgOiAwLCAxKTsKKwkJCisJCWZvciAoaT0wOyBpIDwgdGVzdF9wYXJhbWV0ZXI7IGkrKykgeworCQkJc3RyZXNzX2FycmF5W2ldLmIgPSBtYWxsb2MoMzQ0KTsKKwkJCWlmICghc3RyZXNzX2FycmF5W2ldLmIpCisJCQkJYnJlYWs7CisJCQltZW1jcHkoc3RyZXNzX2FycmF5W2ldLmIsIGJ1ZiwgMzQ0KTsKKwkJfQorCQlDSEVDSyggdGVzdF9wYXJhbWV0ZXIsIGkgKTsgLyogaWYgZmFsc2UsIGEgbWFsbG9jIGZhaWxlZCAqLworCQkKKwkvKiBmZF9tc2dfcGFyc2VfYnVmZmVyICovCisJCQorCQlDSEVDSyggMCwgY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJnN0YXJ0KSApOworCQkKKwkJLyogVGVzdCB0aGUgbXNnX3BhcnNlX2J1ZmZlciBmdW5jdGlvbiAqLworCQlmb3IgKGk9MDsgaSA8IHRlc3RfcGFyYW1ldGVyOyBpKyspIHsKKwkJCWlmICgwICE9IGZkX21zZ19wYXJzZV9idWZmZXIoICZzdHJlc3NfYXJyYXlbaV0uYiwgMzQ0LCAmc3RyZXNzX2FycmF5W2ldLm0pICkKKwkJCQlicmVhazsKKwkJfQorCQlDSEVDSyggdGVzdF9wYXJhbWV0ZXIsIGkgKTsgLyogaWYgZmFsc2UsIGEgY2FsbCBmYWlsZWQgKi8KKwkJCisJCUNIRUNLKCAwLCBjbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmZW5kKSApOworCQlkaXNwbGF5X3Jlc3VsdCh0ZXN0X3BhcmFtZXRlciwgJnN0YXJ0LCAmZW5kLCAiZmRfbXNnX3BhcnNlX2J1ZmZlciIsICJidWZmZXJzIiwgInBhcnNlZCIpOworCQkKKwkvKiBmZF9tc2dfcGFyc2VfZGljdCAqLworCQkKKwkJQ0hFQ0soIDAsIGNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZzdGFydCkgKTsKKwkJCisJCS8qIFRlc3QgdGhlIGZkX21zZ19wYXJzZV9kaWN0IGZ1bmN0aW9uICovCisJCWZvciAoaT0wOyBpIDwgdGVzdF9wYXJhbWV0ZXI7IGkrKykgeworCQkJaWYgKDAgIT0gZmRfbXNnX3BhcnNlX2RpY3QoIHN0cmVzc19hcnJheVtpXS5tLCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsIE5VTEwgKSApCisJCQkJYnJlYWs7CisJCX0KKwkJQ0hFQ0soIHRlc3RfcGFyYW1ldGVyLCBpICk7IC8qIGlmIGZhbHNlLCBhIGNhbGwgZmFpbGVkICovCisJCQorCQlDSEVDSyggMCwgY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJmVuZCkgKTsKKwkJZGlzcGxheV9yZXN1bHQodGVzdF9wYXJhbWV0ZXIsICZzdGFydCwgJmVuZCwgImZkX21zZ19wYXJzZV9kaWN0IiwgIm1lc3NhZ2VzIiwgInBhcnNlZCIpOworCQkKKwkJCisJLyogZmRfbXNnX3BhcnNlX3J1bGVzICovCisJCQorCQlDSEVDSyggMCwgY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJnN0YXJ0KSApOworCQkKKwkJLyogVGVzdCB0aGUgZmRfbXNnX3BhcnNlX3J1bGVzIGZ1bmN0aW9uICovCisJCWZvciAoaT0wOyBpIDwgdGVzdF9wYXJhbWV0ZXI7IGkrKykgeworCQkJaWYgKDAgIT0gZmRfbXNnX3BhcnNlX3J1bGVzKCBzdHJlc3NfYXJyYXlbaV0ubSwgZmRfZ19jb25maWctPmNuZl9kaWN0LCBOVUxMICkgKQorCQkJCWJyZWFrOworCQl9CisJCUNIRUNLKCB0ZXN0X3BhcmFtZXRlciwgaSApOyAvKiBpZiBmYWxzZSwgYSBjYWxsIGZhaWxlZCAqLworCQkKKwkJQ0hFQ0soIDAsIGNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZlbmQpICk7CisJCWRpc3BsYXlfcmVzdWx0KHRlc3RfcGFyYW1ldGVyLCAmc3RhcnQsICZlbmQsICJmZF9tc2dfcGFyc2VfcnVsZXMiLCAibWVzc2FnZXMiLCAicGFyc2VkIik7CisJCQorCQkKKwkvKiBmZF9tc2dfbmV3X2Fuc3dlcl9mcm9tX3JlcSAoMCkgKi8KKwkJCisJCUNIRUNLKCAwLCBjbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmc3RhcnQpICk7CisJCQorCQkvKiBUZXN0IHRoZSBmZF9tc2dfbmV3X2Fuc3dlcl9mcm9tX3JlcSBmdW5jdGlvbiAqLworCQlmb3IgKGk9MDsgaSA8IHRlc3RfcGFyYW1ldGVyOyBpKyspIHsKKwkJCWlmICgwICE9IGZkX21zZ19uZXdfYW5zd2VyX2Zyb21fcmVxKCBmZF9nX2NvbmZpZy0+Y25mX2RpY3QsICZzdHJlc3NfYXJyYXlbaV0ubSwgMCApICkKKwkJCQlicmVhazsKKwkJfQorCQlDSEVDSyggdGVzdF9wYXJhbWV0ZXIsIGkgKTsgLyogaWYgZmFsc2UsIGEgY2FsbCBmYWlsZWQgKi8KKwkJCisJCUNIRUNLKCAwLCBjbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmZW5kKSApOworCQlkaXNwbGF5X3Jlc3VsdCh0ZXN0X3BhcmFtZXRlciwgJnN0YXJ0LCAmZW5kLCAibmV3X2Fuc3dlcihub3JtYWwpIiwgIm1lc3NhZ2VzIiwgImNyZWF0ZWQiKTsKKwkJCisJCS8qIHVubGluayBhbnN3ZXJzIGFuZCBnbyBiYWNrIHRvIHJlcXVlc3QgbWVzc2FnZXMgKi8KKwkJZm9yIChpPTA7IGkgPCB0ZXN0X3BhcmFtZXRlcjsgaSsrKSB7CisJCQlzdHJ1Y3QgbXNnICogYW5zID0gc3RyZXNzX2FycmF5W2ldLm07CisJCQlpZiAoMCAhPSBmZF9tc2dfYW5zd19nZXRxKCBhbnMsICZzdHJlc3NfYXJyYXlbaV0ubSApICkKKwkJCQlicmVhazsKKwkJCWlmICgwICE9IGZkX21zZ19hbnN3X2RldGFjaCggYW5zICkgKQorCQkJCWJyZWFrOworCQkJZmRfbXNnX2ZyZWUoIGFucyApOworCQl9CisJCUNIRUNLKCB0ZXN0X3BhcmFtZXRlciwgaSApOyAvKiBpZiBmYWxzZSwgYSBjYWxsIGZhaWxlZCAqLworCQkKKwkJCisJLyogZmRfbXNnX25ld19hbnN3ZXJfZnJvbV9yZXEgKE1TR0ZMX0FOU1dfRVJST1IpICovCisJCQorCQlDSEVDSyggMCwgY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJnN0YXJ0KSApOworCQkKKwkJLyogVGVzdCB0aGUgZmRfbXNnX25ld19hbnN3ZXJfZnJvbV9yZXEgZnVuY3Rpb24gKi8KKwkJZm9yIChpPTA7IGkgPCB0ZXN0X3BhcmFtZXRlcjsgaSsrKSB7CisJCQlpZiAoIDAgIT0gZmRfbXNnX25ld19hbnN3ZXJfZnJvbV9yZXEoIGZkX2dfY29uZmlnLT5jbmZfZGljdCwgJnN0cmVzc19hcnJheVtpXS5tLCBNU0dGTF9BTlNXX0VSUk9SICkgKQorCQkJCWJyZWFrOworCQl9CisJCUNIRUNLKCB0ZXN0X3BhcmFtZXRlciwgaSApOyAvKiBpZiBmYWxzZSwgYSBjYWxsIGZhaWxlZCAqLworCQkKKwkJQ0hFQ0soIDAsIGNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZlbmQpICk7CisJCWRpc3BsYXlfcmVzdWx0KHRlc3RfcGFyYW1ldGVyLCAmc3RhcnQsICZlbmQsICJuZXdfYW5zd2VyKGVycm9yKSIsICJtZXNzYWdlcyIsICJjcmVhdGVkIik7CisJCQorCQkvKiB1bmxpbmsgYW5zd2VycyBhbmQgZ28gYmFjayB0byByZXF1ZXN0IG1lc3NhZ2VzICovCisJCWZvciAoaT0wOyBpIDwgdGVzdF9wYXJhbWV0ZXI7IGkrKykgeworCQkJc3RydWN0IG1zZyAqIGFucyA9IHN0cmVzc19hcnJheVtpXS5tOworCQkJaWYgKDAgIT0gZmRfbXNnX2Fuc3dfZ2V0cSggYW5zLCAmc3RyZXNzX2FycmF5W2ldLm0gKSApCisJCQkJYnJlYWs7CisJCQlpZiAoMCAhPSBmZF9tc2dfYW5zd19kZXRhY2goIGFucyApICkKKwkJCQlicmVhazsKKwkJCWZkX21zZ19mcmVlKCBhbnMgKTsKKwkJfQorCQkKKwkJCisJLyogZmRfbXNnX2J1ZmZlcml6ZSAqLworCQkKKworCQlDSEVDSyggMCwgY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJnN0YXJ0KSApOworCQkKKwkJLyogVGVzdCB0aGUgZmRfbXNnX2J1ZmZlcml6ZSBmdW5jdGlvbiAqLworCQlmb3IgKGk9MDsgaSA8IHRlc3RfcGFyYW1ldGVyOyBpKyspIHsKKwkJCXNpemVfdCBsZW4gPSAwOworCQkJaWYgKDAgIT0gZmRfbXNnX2J1ZmZlcml6ZSggc3RyZXNzX2FycmF5W2ldLm0sICZzdHJlc3NfYXJyYXlbaV0uYiwgJmxlbiApICkKKwkJCQlicmVhazsKKwkJfQorCQlDSEVDSyggdGVzdF9wYXJhbWV0ZXIsIGkgKTsgLyogaWYgZmFsc2UsIGEgY2FsbCBmYWlsZWQgKi8KKwkJCisJCUNIRUNLKCAwLCBjbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmZW5kKSApOworCQlkaXNwbGF5X3Jlc3VsdCh0ZXN0X3BhcmFtZXRlciwgJnN0YXJ0LCAmZW5kLCAiZmRfbXNnX2J1ZmZlcml6ZSIsICJidWZmZXJzIiwgImNyZWF0ZWQiKTsKKwkJCisJCQorCS8qIGZkX21zZ19mcmVlICovCisJCQorCQlDSEVDSyggMCwgY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJnN0YXJ0KSApOworCQkKKwkJLyogRnJlZSB0aG9zZSBtZXNzYWdlcyAqLworCQlmb3IgKGk9MDsgaSA8IHRlc3RfcGFyYW1ldGVyOyBpKyspIHsKKwkJCWZkX21zZ19mcmVlKCBzdHJlc3NfYXJyYXlbaV0ubSApOworCQl9CisJCQorCQlDSEVDSyggMCwgY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJmVuZCkgKTsKKwkJZGlzcGxheV9yZXN1bHQodGVzdF9wYXJhbWV0ZXIsICZzdGFydCwgJmVuZCwgImZkX21zZ19mcmVlIiwgIm1lc3NhZ2VzIiwgImZyZWVkIik7CisJCQorCQkKKwkJZm9yIChpPTA7IGkgPCB0ZXN0X3BhcmFtZXRlcjsgaSsrKSB7CisJCQlmcmVlKHN0cmVzc19hcnJheVtpXS5iKTsKKwkJfQorCQlmcmVlKHN0cmVzc19hcnJheSk7CisJfQorCQorCWlmICghZGljdGlvbmFyaWVzX2xvYWRlZCkgeworCQlsb2FkX2FsbF9leHRlbnNpb25zKCJkaWN0XyIpOworCQlkaWN0aW9uYXJpZXNfbG9hZGVkID0gMTsKKwkJcHJpbnRmKCJMb2FkZWQgYWxsIGRpY3Rpb25hcnkgZXh0ZW5zaW9ucywgcmVzdGFydGluZy4uLlxuIik7CisJCWdvdG8gcmVkbzsKKwl9CisJCisJLyogVGhhdCdzIGFsbCBmb3IgdGhlIHRlc3RzIHlldCAqLworCVBBU1NURVNUKCk7Cit9IAorCQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdG9zdHIuYyBiL3Rlc3RzL3Rlc3Rvc3RyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRhNjRjNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3Rvc3RyLmMKQEAgLTAsMCArMSwyMDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDExLCBXSURFIFByb2plY3QgYW5kIE5JQ1QJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFdJREUgUHJvamVjdCBvciBOSUNUIG5vciB0aGUgCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgV0lERSBQcm9qZWN0IGFuZCAJCQkJCQkgKgorKiAgIE5JQ1QuCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInRlc3RzLmgiCisKKyNkZWZpbmUgVEVTVF9TVFIgKG9zMF90KSJUaGlzIGlzIG15IHRlc3Qgc3RyaW5nICh3aXRoIGV4dHJhIHVudXNlZCBkYXRhKSIKKworLyogVGhlIGZvbGxvd2luZyBzdHJpbmcgY29udGFpbnMgVVRGLTggZW5jb2RlZCBjaGFyYWN0ZXJzIChDaGluZXNlIGNoYXJhY3RlcnMpICovCisjZGVmaW5lIFRFU1RfSUROX1VURjggICJmcmVlRGlhbWV0ZXIu5Lit5Zu9IgorI2RlZmluZSBURVNUX0lETl9DT05WICAiZnJlZURpYW1ldGVyLnhuLS1maXFzOHMiCisKKy8qIE1haW4gdGVzdCByb3V0aW5lICovCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCS8qIEZpcnN0LCBpbml0aWFsaXplIHRoZSBkYWVtb24gbW9kdWxlcyAqLworCUlOSVRfRkQoKTsKKwkKKwkvKiBDaGVjayB0aGUgaGFzaCBmdW5jdGlvbiAqLworCXsKKwkJdWludDhfdCBidWZbMzBdOworCQkKKwkJdWludDMyX3QgaGFzaCA9IGZkX29zX2hhc2goVEVTVF9TVFIsIENPTlNUU1RSTEVOKFRFU1RfU1RSKSk7IC8qIHJlZmVyZW5jZSB2YWx1ZSAqLworCQkKKwkJLyogQ2hlY2sgdGhhdCBhIGhhc2ggb2YgYSBzdWJzdHJpbmcgLyBzdXJzdHJpbmcgaXMgZGlmZmVyZW50ICovCisJCUNIRUNLKCAxLCBoYXNoICE9IGZkX29zX2hhc2goVEVTVF9TVFIsIENPTlNUU1RSTEVOKFRFU1RfU1RSKSAtIDEpID8gMSA6IDAgKTsKKwkJQ0hFQ0soIDEsIGhhc2ggIT0gZmRfb3NfaGFzaChURVNUX1NUUiwgQ09OU1RTVFJMRU4oVEVTVF9TVFIpICsgMSkgPyAxIDogMCApOworCQkKKwkJLyogQ2hlY2sgYWxpZ25tZW50IG9mIHRoZSBzdHJpbmcgaXMgbm90IGltcG9ydGFudCAqLworCQltZW1jcHkoYnVmICsgNCwgVEVTVF9TVFIsIENPTlNUU1RSTEVOKFRFU1RfU1RSKSk7CisJCUNIRUNLKCBoYXNoLCBmZF9vc19oYXNoKGJ1ZiArIDQsIENPTlNUU1RSTEVOKFRFU1RfU1RSKSkgKTsKKwkJCisJCW1lbWNweShidWYgKyAzLCBURVNUX1NUUiwgQ09OU1RTVFJMRU4oVEVTVF9TVFIpKTsKKwkJQ0hFQ0soIGhhc2gsIGZkX29zX2hhc2goYnVmICsgMywgQ09OU1RTVFJMRU4oVEVTVF9TVFIpKSApOworCQkKKwkJbWVtY3B5KGJ1ZiArIDIsIFRFU1RfU1RSLCBDT05TVFNUUkxFTihURVNUX1NUUikpOworCQlDSEVDSyggaGFzaCwgZmRfb3NfaGFzaChidWYgKyAyLCBDT05TVFNUUkxFTihURVNUX1NUUikpICk7CisJCQorCQltZW1jcHkoYnVmICsgMSwgVEVTVF9TVFIsIENPTlNUU1RSTEVOKFRFU1RfU1RSKSk7CisJCUNIRUNLKCBoYXNoLCBmZF9vc19oYXNoKGJ1ZiArIDEsIENPTlNUU1RSTEVOKFRFU1RfU1RSKSkgKTsKKwl9CisJCisJLyogQ2hlY2sgdGhlIERpYW1ldGVyIElkZW50aXR5IGZ1bmN0aW9ucyAqLworCXsKKwkJY2hhciAqIHJlczsKKwkJc2l6ZV90IGxlbj0wOworCQkKKwkJLyogQSB2YWxpZCBBU0NJSSBkb21haW4gbmFtZSAqLworCQlyZXMgPSBURVNUX0lETl9DT05WOworCQlDSEVDSyggMCwgZmRfb3NfdmFsaWRhdGVfRGlhbWV0ZXJJZGVudGl0eSgmcmVzLCAmbGVuLCAxKSApOworCQlDSEVDSyggMCwgc3RyY2FzZWNtcChyZXMsIFRFU1RfSUROX0NPTlYpICk7IC8qIHRoZSBmdW5jdGlvbiBkb2VzIG5vdCBjaGFuZ2UgYSB2YWxpZCBETiAqLworCQlDSEVDSyggMCwgZmRfb3NfdmFsaWRhdGVfRGlhbWV0ZXJJZGVudGl0eSgmcmVzLCAmbGVuLCAwKSApOworCQlDSEVDSyggMCwgc3RyY2FzZWNtcChyZXMsIFRFU1RfSUROX0NPTlYpICk7CisJCUNIRUNLKCBDT05TVFNUUkxFTihURVNUX0lETl9DT05WKSwgbGVuICk7CisJCWZyZWUocmVzKTsKKwkJCisJCS8qIE5vdywgYW4gaW52YWxpZCBzdHJpbmcgKi8KKwkJcmVzID0gVEVTVF9JRE5fVVRGODsKKwkJbGVuID0gMDsKKwkJCisJCSNpZmRlZiBESUFNSURfSUROQV9JR05PUkUKKwkJCisJCS8qIFRoZSBVVEYtOCBjaGFycyBhcmUgY29uc2lkZXJlZCB2YWxpZCAqLworCQlDSEVDSyggMSwgZmRfb3NfaXNfdmFsaWRfRGlhbWV0ZXJJZGVudGl0eSgob3MwX3QpVEVTVF9JRE5fVVRGOCwgQ09OU1RTVFJMRU4oVEVTVF9JRE5fVVRGOCkgKSApOworCQkKKwkJLyogVGhlIHN0cmluZyBzaG91bGQgYmUgcGFzc2VkIHVubW9kaWZpZWQgKi8KKwkJQ0hFQ0soIDAsIGZkX29zX3ZhbGlkYXRlX0RpYW1ldGVySWRlbnRpdHkoJnJlcywgJmxlbiwgMSkgKTsKKwkJQ0hFQ0soIDAsIHN0cmNhc2VjbXAocmVzLCBURVNUX0lETl9VVEY4KSApOworCQlDSEVDSyggMCwgZmRfb3NfY21wKHJlcywgbGVuLCBURVNUX0lETl9VVEY4LCBDT05TVFNUUkxFTihURVNUX0lETl9VVEY4KSkgKTsKKwkJQ0hFQ0soIDAsIGZkX29zX2FsbW9zdGNhc2VzcmNoKHJlcywgbGVuLCBURVNUX0lETl9VVEY4LCBDT05TVFNUUkxFTihURVNUX0lETl9VVEY4KSwgTlVMTCkgKTsKKwkJQ0hFQ0soIDAsIGZkX29zX3ZhbGlkYXRlX0RpYW1ldGVySWRlbnRpdHkoJnJlcywgJmxlbiwgMCkgKTsKKwkJQ0hFQ0soIDAsIHN0cmNhc2VjbXAocmVzLCBURVNUX0lETl9VVEY4KSApOworCQlDSEVDSyggQ09OU1RTVFJMRU4oVEVTVF9JRE5fVVRGOCksIGxlbiApOworCQlmcmVlKHJlcyk7CisJCQorCQkjZWxzZSAvKiBESUFNSURfSUROQV9JR05PUkUgKi8KKwkJCisJCS8qIFRoZSBVVEYtOCBjaGFycyBhcmUgcmVjb2duaXplZCBhcyBpbnZhbGlkIERpYW1ldGVySWRlbnRpdHkgKi8KKwkJQ0hFQ0soIDAsIGZkX29zX2lzX3ZhbGlkX0RpYW1ldGVySWRlbnRpdHkoKG9zMF90KVRFU1RfSUROX1VURjgsIENPTlNUU1RSTEVOKFRFU1RfSUROX1VURjgpICkpOworCQkKKwkJIyBpZmRlZiBESUFNSURfSUROQV9SRUpFQ1QKKwkJCisJCS8qIFRoZSBzdHJpbmcgbXVzdCBiZSByZWplY3RlZCAqLworCQlDSEVDSyggRUlOVkFMLCBmZF9vc192YWxpZGF0ZV9EaWFtZXRlcklkZW50aXR5KCZyZXMsICZsZW4sIDEpICk7CisJCQorCQkjIGVsc2UgLyogRElBTUlEX0lETkFfUkVKRUNUICovCisJCQorCQkvKiBUaGUgc3RyaW5nIHNob3VsZCBiZSB0cmFuc2Zvcm1lZCBpbnRvIFRFU1RfSUROX0NPTlYgKi8KKwkJQ0hFQ0soIDAsIGZkX29zX3ZhbGlkYXRlX0RpYW1ldGVySWRlbnRpdHkoJnJlcywgJmxlbiwgMSkgKTsKKwkJQ0hFQ0soIDAsIHN0cmNhc2VjbXAocmVzLCBURVNUX0lETl9DT05WKSApOworCQlDSEVDSyggQ09OU1RTVFJMRU4oVEVTVF9JRE5fQ09OViksIGxlbiApOworCQlmcmVlKHJlcyk7CisJCQorCQkjIGVuZGlmIC8qIERJQU1JRF9JRE5BX1JFSkVDVCAqLworCQkjZW5kaWYgLyogRElBTUlEX0lETkFfSUdOT1JFICovCisKKwl9CisJCisJeworCQkvKiB0ZXN0IGZkX29zX2NtcCBhbmQgZmRfb3NfYWxtb3N0Y2FzZXNyY2ggYW5kIHRoYXQgdGhleSBhcmUgY29tcGF0aWJsZSAqLworCQljaGFyICp0MSA9ICJhIjsKKwkJY2hhciAqdDIgPSAiYiI7CisJCWNoYXIgKnQzID0gIkMiOworCQljaGFyICp0NCA9ICJkIjsKKwkJY2hhciAqdDUgPSAiYWEiOworCQljaGFyICp0NiA9ICJhQiI7CisJCWNoYXIgKnQ3ID0gIkFjIjsKKwkJY2hhciAqdDggPSAiYUQiOworCQljaGFyICp0OSA9ICJBQUEiOworCQkKKwkJY2hhciAqdDViID0gIkFhIjsKKwkJY2hhciAqdDZiID0gImFiIjsKKwkJCisJCS8qIEZpcnN0LCBjcmVhdGUgYSBsaXN0IHdpdGggYWxsIHRoZSBlbGVtZW50cyBpbiBvcmRlciBnaXZlbiBieSBmZF9vc19jbXAgKi8KKwkJY2hhciAqdFtdID0geyB0MSwgdDIsIHQzLCB0NCwgdDUsIHQ2LHQ3LCB0OCwgdDkgfTsKKwkJaW50IGk7CisJCXN0cnVjdCBmZF9saXN0ICpsaSwgbCA9IEZEX0xJU1RfSU5JVElBTElaRVIobCk7CisJCWZvciAoaSA9IDA7IGkgPCBzaXplb2YodCkgLyBzaXplb2YodFswXSk7IGkrKykgeworCQkJLyogaW5zZXJ0IHRbaV0gKi8KKwkJCXN0cnVjdCBmZF9saXN0ICpuID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgZmRfbGlzdCkpOworCQkJQ0hFQ0soIDEsIG4gPyAxIDogMCApOworCQkJZmRfbGlzdF9pbml0KG4sIHRbaV0pOworCQkJZm9yIChsaSA9IGwubmV4dDsgbGkgIT0gJmw7IGxpID0gbGktPm5leHQpIHsKKwkJCQlpZiAoIGZkX29zX2NtcCh0W2ldLCBzdHJsZW4odFtpXSksIGxpLT5vLCBzdHJsZW4obGktPm8pKSA8IDAgKQorCQkJCQlicmVhazsKKwkJCX0gCisJCQlmZF9saXN0X2luc2VydF9iZWZvcmUobGksIG4pOworCQl9CisJCS8qIGluIHByaW5jaXBsZSB0aGUgcmVzdWx0IGlzOiBbICJDIiwgImEiLCAiYiIsICJkIiwgIkFjIiwgImFCIiwgImFEIiwgImFhIiwgIkFBQSIgXSAqLworCQkKKwkJLyogU2luY2UgdGhlcmUgaXMgbm8gZXF1YWwgdmFsdWUgaW4gdGhlIGxpc3QgKGV2ZW4gY2FzZS1pbnNlbnNpdGl2ZSksIGNoZWNrIHRoYXQgdGhlIG9yZGVyIGlzIHZhbGlkIGFsc28gZm9yIHRoZSBjYXNlaW5zZW5zaXRpdmUgdmFyaWFudCAqLworCQlmb3IgKGxpID0gbC5uZXh0OyBsaSAhPSBsLnByZXY7IGxpID0gbGktPm5leHQpIHsKKwkJCUNIRUNLKCAxLCBmZF9vc19hbG1vc3RjYXNlc3JjaChsaS0+bywgc3RybGVuKGxpLT5vKSwgbGktPm5leHQtPm8sIHN0cmxlbihsaS0+bmV4dC0+byksIE5VTEwpIDwgMCA/IDEgOiAwICk7CisJCX0KKwkJCisJCS8qIE5vdyBjaGVjayB0aGF0IHdlIGNhbiBjYXNlLWluc2VudGl2ZWx5IGZpbmQgdDViIGFuZCB0NmIgdG8gYmUgZXF1YWwgdG8gdDUgYW5kIHQ2IHJlc3AuICh0aGlzIGlzIGhvdyB3ZSB1c2UgaXQgaW4gdGhlIGRhZW1vbikgKi8KKwkJZm9yIChsaSA9IGwubmV4dDsgbGkgIT0gJmw7IGxpID0gbGktPm5leHQpIHsKKwkJCWludCBjb250LCBjbXA7CisJCQljbXAgPSBmZF9vc19hbG1vc3RjYXNlc3JjaCh0NWIsIHN0cmxlbih0NWIpLCBsaS0+bywgc3RybGVuKGxpLT5vKSwgJmNvbnQpOworCQkJVFJBQ0VfREVCVUcoRlVMTCwgIkNvbXAgJyVzJyA6ICVkLCAlZCIsIChjaGFyICopbGktPm8sIGNtcCwgY29udCk7CisJCQlpZiAoY21wID09IDApCisJCQkJYnJlYWs7CisJCQlpZiAoIWNvbnQpCisJCQkJYnJlYWs7CisJCX0KKwkJQ0hFQ0soIGxpLT5vLCB0NSApOworCQkKKwkJZm9yIChsaSA9IGwubmV4dDsgbGkgIT0gJmw7IGxpID0gbGktPm5leHQpIHsKKwkJCWludCBjb250LCBjbXA7CisJCQljbXAgPSBmZF9vc19hbG1vc3RjYXNlc3JjaCh0NmIsIHN0cmxlbih0NmIpLCBsaS0+bywgc3RybGVuKGxpLT5vKSwgJmNvbnQpOworCQkJVFJBQ0VfREVCVUcoRlVMTCwgIkNvbXAgJyVzJyA6ICVkLCAlZCIsIChjaGFyICopbGktPm8sIGNtcCwgY29udCk7CisJCQlpZiAoY21wID09IDApCisJCQkJYnJlYWs7CisJCQlpZiAoIWNvbnQpCisJCQkJYnJlYWs7CisJCX0KKwkJQ0hFQ0soIGxpLT5vLCB0NiApOworCQkKKwkJCisJCS8qIGRvbmUgKi8KKwkJd2hpbGUgKCFGRF9JU19MSVNUX0VNUFRZKCZsKSkgeworCQkJbGkgPSBsLm5leHQ7CisJCQlmZF9saXN0X3VubGluayhsaSk7CisJCQlmcmVlKGxpKTsKKwkJfQorCX0KKwkKKwkvKiBUaGF0J3MgYWxsIGZvciB0aGUgdGVzdHMgeWV0ICovCisJUEFTU1RFU1QoKTsKK30gCisJCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0cGVlcnMuYyBiL3Rlc3RzL3Rlc3RwZWVycy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZDI1MmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cGVlcnMuYwpAQCAtMCwwICsxLDc4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IChCU0QgTGljZW5zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEF1dGhvcjogU2ViYXN0aWVuIERlY3VnaXMgPHNkZWN1Z2lzQGZyZWVkaWFtZXRlci5uZXQ+CQkJCQkJCSAqCisqCQkJCQkJCQkJCQkJCSAqCisqIENvcHlyaWdodCAoYykgMjAxMywgV0lERSBQcm9qZWN0IGFuZCBOSUNUCQkJCQkJCQkgKgorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlICAqCisqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyLgkJCQkJCQkJCQkgKgorKiAgICAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIJCQkJCQkgKgorKiAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBXSURFIFByb2plY3Qgb3IgTklDVCBub3IgdGhlIAkJCQkJCSAqCisqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIAkJCQkJCSAqCisqICAgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAkJCQkJCSAqCisqICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFdJREUgUHJvamVjdCBhbmQgCQkJCQkJICoKKyogICBOSUNULgkJCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgKgorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgKgorKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgKgorKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCAJICoKKyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIAkgKgorKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgKgorKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGICAgKgorKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4JCQkJCQkJCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCitjb25zdCBjaGFyICogaWRzW10gPSB7ICJiMTEiLCAiYjE0IiwgImIxIiwgImI0IiB9OworI2RlZmluZSBEb21haW5OYW1lICJsb2NhbGRvbWFpbiIKKworLyogTWFpbiB0ZXN0IHJvdXRpbmUgKi8KK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJLyogRmlyc3QsIGluaXRpYWxpemUgdGhlIGRhZW1vbiBtb2R1bGVzICovCisJSU5JVF9GRCgpOworCQorCS8qIENyZWF0ZSA0IHBlZXJzIHdpdGggdGhlc2UgaWRzICovCisJeworCQlpbnQgaTsKKwkJc3RydWN0IHBlZXJfaW5mbyBpbmY7CisJCWNoYXIgbG9jaWRbMjU1XTsKKwkJbWVtc2V0KCZpbmYsIDAsIHNpemVvZihpbmYpKTsKKwkJaW5mLnBpX2RpYW1pZCA9IChjaGFyICopbG9jaWQ7CisJCWZvciAoaT0wOyBpIDwgc2l6ZW9mKGlkcykgLyBzaXplb2YoaWRzWzBdKTsgaSsrKSB7CisJCQlzbnByaW50Zihsb2NpZCwgc2l6ZW9mKGxvY2lkKSwgIiVzLiIgRG9tYWluTmFtZSwgaWRzW2ldKTsKKwkJCUNIRUNLKCAwLCBmZF9wZWVyX2FkZCgmaW5mLCBfX0ZJTEVfXywgTlVMTCwgTlVMTCkpOworCQl9CisJfQorCWZkX2xvZ19kZWJ1ZygiJXMiLCBmZF9wZWVyX2R1bXBfbGlzdChGRF9EVU1QX1RFU1RfUEFSQU1TLCAwKSk7CisJLyogQ2hlY2sgd2UgYXJlIGFibGUgdG8gZmluZCBhZ2FpbiBhbnkgb2YgdGhlc2UgKi8KKwl7CisJCWludCBpOworCQljaGFyIGxvY2lkWzI1NV07CisJCXN0cnVjdCBwZWVyX2hkciAqcDsKKwkJZm9yIChpPTA7IGkgPCBzaXplb2YoaWRzKSAvIHNpemVvZihpZHNbMF0pOyBpKyspIHsKKwkJCXNucHJpbnRmKGxvY2lkLCBzaXplb2YobG9jaWQpLCAiJXMuIiBEb21haW5OYW1lLCBpZHNbaV0pOworCQkJQ0hFQ0soIDAsIGZkX3BlZXJfZ2V0YnlpZCgoRGlhbUlkX3QpbG9jaWQsIHN0cmxlbigoY2hhciAqKWxvY2lkKSwgMCwgJnApKTsKKwkJCUNIRUNLKCAwLCBzdHJjbXAoKGNoYXIgKilsb2NpZCwgcC0+aW5mby5waV9kaWFtaWQpKTsKKwkJCUNIRUNLKCAwLCBmZF9wZWVyX2dldGJ5aWQoKERpYW1JZF90KWxvY2lkLCBzdHJsZW4oKGNoYXIgKilsb2NpZCksIDEsICZwKSk7CisJCQlDSEVDSyggMCwgc3RyY21wKChjaGFyICopbG9jaWQsIHAtPmluZm8ucGlfZGlhbWlkKSk7CisJCX0KKwl9CisJCisJCisJLyogVGhhdCdzIGFsbCBmb3IgdGhlIHRlc3RzIHlldCAqLworCVBBU1NURVNUKCk7Cit9IAorCQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHMuaCBiL3Rlc3RzL3Rlc3RzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVlNmQ5YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzLmgKQEAgLTAsMCArMSwyMzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDEzLCBXSURFIFByb2plY3QgYW5kIE5JQ1QJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFdJREUgUHJvamVjdCBvciBOSUNUIG5vciB0aGUgCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgV0lERSBQcm9qZWN0IGFuZCAJCQkJCQkgKgorKiAgIE5JQ1QuCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIG91ciB0ZXN0IGhhcm5lc3MuCisgKiBUaGUgaGFybmVzcyBpcyB2ZXJ5IHNpbXBsZSB5ZXQuCisgKiBJdCBtYXkgYmUgaW50ZXJlc3NhbnQgdG8gZ28gdG8gZGVqYWdudSBsYXRlci4uLgorICoKKyAqLworI2lmbmRlZiBfVEVTVFNfSAorI2RlZmluZSBfVEVTVFNfSAorCisjaW5jbHVkZSAiZmRwcm90by1pbnRlcm5hbC5oIgorI2luY2x1ZGUgImZkY29yZS1pbnRlcm5hbC5oIgorCisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CitHQ0NfRElBR19PRkYoIi1XZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMiKQorI2luY2x1ZGUgPGdjcnlwdC5oPgorR0NDX0RJQUdfT04oIi1XZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMiKQorCisvKiBUZXN0IHRpbWVvdXQgZHVyYXRpb24sIHVubGVzcyAtbiBpcyBwYXNzZWQgb24gdGhlIGNvbW1hbmQgbGluZSAqLworI2lmbmRlZiBURVNUX1RJTUVPVVQKKyNkZWZpbmUgVEVTVF9USU1FT1VUCTEyMAkvKiBpbiBzZWNvbmRzICovCisjZW5kaWYgLyogVEVTVF9USU1FT1VUICovCisKKy8qIFN0YW5kYXJkIGluY2x1ZGVzICovCisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPGxpYmdlbi5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorCisvKiBEZWZpbmUgdGhlIHJldHVybiBjb2RlIHZhbHVlcyAqLworI2RlZmluZSBQQVNTCTAKKyNkZWZpbmUgRkFJTAkxCisKKy8qIERlZmluZSB0aGUgbWFjcm8gdG8gZmFpbCBhIHRlc3Qgd2l0aCBhIG1lc3NhZ2UgKi8KKyNkZWZpbmUgRkFJTFRFU1QoIG1lc3NhZ2UuLi4gKXsJCQkJXAorCUxPR19GKG1lc3NhZ2UpOwkJCQkJXAorCUxPR19GKCJGQUlMRUQ6ICVzICIsIF9fU1RSSVBQRURfRklMRV9fKTsJXAorCWZyZWUodGJ1Zik7CQkJCQlcCisJZXhpdChGQUlMKTsJCQkJCVwKK30KKworLyogRGVmaW5lIHRoZSBtYWNybyB0byBwYXNzIGEgdGVzdCAqLworI2RlZmluZSBQQVNTVEVTVCggKXsJCQkJCVwKKwlMT0dfTigiUEFTUzogJXMiLCBfX1NUUklQUEVEX0ZJTEVfXyk7CQlcCisJKHZvaWQpZmRfY29yZV9zaHV0ZG93bigpOwkJCVwKKwkodm9pZClmZF9jb3JlX3dhaXRfc2h1dGRvd25fY29tcGxldGUoKTsJCVwKKwkodm9pZClmZF90aHJfdGVybSgmc2lnbmFsX3Rocik7CQkJXAorCWZyZWUodGJ1Zik7CQkJCQlcCisJZXhpdChQQVNTKTsJCQkJCVwKK30KKworc3RhdGljIHN0cnVjdCBmZF9jb25maWcgY29uZjsKK2V4dGVybiBzdHJ1Y3QgZmRfY29uZmlnICogZmRfZ19jb25maWc7CisKKy8qIGZvciBkdW1wcyAqLworc3RhdGljIGNoYXIgKiB0YnVmID0gTlVMTDsgc2l6ZV90IHRidWZsZW4gPSAwOworI2RlZmluZSBGRF9EVU1QX1RFU1RfUEFSQU1TICZ0YnVmLCAmdGJ1ZmxlbiwgTlVMTAorCisKKy8qIERlZmluZSB0aGUgc3RhbmRhcmQgY2hlY2sgcm91dGluZXMgKi8KKyNkZWZpbmUgQ0hFQ0soIF92YWwsIF9hc3NlcnQgKXsJCQkJXAorCUxPR19EKCJDSEVDSyggJXMgPT0gJXMgKSIsCQkJXAorCQkJCSNfYXNzZXJ0LAkJXAorCQkJCSNfdmFsKTsJCQlcCisJewkJCQkJCVwKKwlfX3R5cGVvZl9fIChfdmFsKSBfX3JldCA9IChfYXNzZXJ0KTsJCVwKKwlpZiAoX19yZXQgIT0gKF92YWwpKSB7CQkJCVwKKwkJRkFJTFRFU1QoICIlczolZDogQ0hFQ0sgRkFJTEVEIDogJXMgPT0gJWx4ICE9ICVseCIsCVwKKwkJCV9fU1RSSVBQRURfRklMRV9fLAkJXAorCQkJX19MSU5FX18sCQkJXAorCQkJI19hc3NlcnQsCQkJXAorCQkJKHVuc2lnbmVkIGxvbmcpX19yZXQsCQlcCisJCQkodW5zaWduZWQgbG9uZykoX3ZhbCkpOwkJXAorCX19CQkJCQkJXAorfQorCitzdGF0aWMgcHRocmVhZF90IHNpZ25hbF90aHI7CitzdGF0aWMgdm9pZCAqIHNpZ25hbF9jYXRjaCh2b2lkICogYXJnKQoreworCWludCBzaWc7CisJc2lnc2V0X3Qgc3M7CisJZmRfbG9nX3RocmVhZG5hbWUgKCAiU2lnbmFsIGNhdGNoZXIiICk7CisJCisJc2lnZW1wdHlzZXQoJnNzKTsKKwkKKwkvKiBXZSB1c2UgU0lHQUxSTSAqLworCXNpZ2FkZHNldCgmc3MsIFNJR0FMUk0pOworCQorCS8qIFVuYmxvY2sgYW55IG90aGVyIHNpZ25hbCBmb3IgdGhpcyB0aHJlYWQsIHNvIHRoYXQgZGVmYXVsdCBoYW5kbGVyIGlzIGVuYWJsZWQgKi8KKwlDSEVDS19TWVNfRE8oIHB0aHJlYWRfc2lnbWFzayggU0lHX1NFVE1BU0ssICZzcywgTlVMTCApLCApOworCQorCS8qIE5vdyB3YWl0IGZvciBzaWd3YWl0IG9yIGNhbmNlbGF0aW9uICovCisJQ0hFQ0tfUE9TSVhfRE8oIHNpZ3dhaXQoJnNzLCAmc2lnKSwgICk7CisJRkFJTFRFU1QoIlRoZSB0aW1lb3V0ICgiIF9zdHJpbmdpemUoVEVTVF9USU1FT1VUKSAiIHNlYykgd2FzIHJlYWNoZWQuIFVzZSAtbiBvciBjaGFuZ2UgVEVTVF9USU1FT1VUIGlmIHRoZSB0ZXN0IG5lZWRzIG1vcmUgdGltZSB0byBleGVjdXRlLiIpOworCQorCXJldHVybiBOVUxMOworfQorCQorCitHQ1JZX1RIUkVBRF9PUFRJT05fUFRIUkVBRF9JTVBMOworCisvKiBnbnV0bHMgZGVidWcuICovCitzdGF0aWMgdm9pZCBmZF9nbnV0bHNfZGVidWcoaW50IGxldmVsLCBjb25zdCBjaGFyICogc3RyKSB7CisJY29uc3QgY2hhciAqIF9fdGhuID0gKChjaGFyICopcHRocmVhZF9nZXRzcGVjaWZpYyhmZF9sb2dfdGhuYW1lKSA/OiAidW5uYW1lZCIpOwkKKwlmZF9sb2dfZGVidWcoInRpZDolLTIwc1tnbnV0bHM6JWRdICVzIiwgX190aG4sIGxldmVsLCBzdHIpOworfQorc3RhdGljIGludCBnbnV0bHNfZGVidWcgPSAwOworCitzdGF0aWMgaW50IHRlc3RfcGFyYW1ldGVyID0gMDsKKworc3RhdGljIGlubGluZSB2b2lkIHBhcnNlX2NtZGxpbmUoaW50IGFyZ2MsIGNoYXIgKiBhcmd2W10pIHsKKwlpbnQgYzsKKwlpbnQgbm9fdGltZW91dCA9IDA7CisJd2hpbGUgKChjID0gZ2V0b3B0IChhcmdjLCBhcmd2LCAiZHFuZjpGOmc6cDoiKSkgIT0gLTEpIHsKKwkJc3dpdGNoIChjKSB7CisJCQljYXNlICdkJzoJLyogSW5jcmVhc2UgdmVyYm9zaXR5IG9mIGRlYnVnIG1lc3NhZ2VzLiAgKi8KKwkJCQlmZF9nX2RlYnVnX2x2bC0tOworCQkJCWJyZWFrOworCQkJCQorCQkJY2FzZSAncSc6CS8qIERlY3JlYXNlIHZlcmJvc2l0eS4gICovCisJCQkJZmRfZ19kZWJ1Z19sdmwrKzsKKwkJCQlicmVhazsKKwkJCQorCQkJY2FzZSAnbic6CS8qIERpc2FibGUgdGhlIHRpbWVvdXQgb2YgdGhlIHRlc3QuICAqLworCQkJCW5vX3RpbWVvdXQgPSAxOworCQkJCWJyZWFrOworCQkJCisJCQljYXNlICdmJzoJLyogRnVsbCBkZWJ1ZyBmb3IgdGhlIGZ1bmN0aW9uIHdpdGggdGhpcyBuYW1lLiAgKi8KKwkJCQkjaWZkZWYgREVCVUcKKwkJCQlmZF9kZWJ1Z19vbmVfZnVuY3Rpb24gPSBvcHRhcmc7CisJCQkJI2Vsc2UgLyogREVCVUcgKi8KKwkJCQlUUkFDRV9ERUJVRyhJTkZPLCAiRXJyb3I6IG11c3QgY29tcGlsZSB3aXRoIERFQlVHIHN1cHBvcnQgdG8gdXNlIHRoaXMgZmVhdHVyZSIpOworCQkJCSNlbmRpZiAvKiBERUJVRyAqLworCQkJCWJyZWFrOworCQkJCQorCQkJY2FzZSAnRic6CS8qIEZ1bGwgZGVidWcgZm9yIHRoZSBmdW5jdGlvbnMgaW4gZmlsZSB3aXRoIHRoaXMgbmFtZS4gICovCisJCQkJI2lmZGVmIERFQlVHCisJCQkJZmRfZGVidWdfb25lX2ZpbGUgPSBvcHRhcmc7CisJCQkJI2Vsc2UgLyogREVCVUcgKi8KKwkJCQlUUkFDRV9ERUJVRyhJTkZPLCAiRXJyb3I6IG11c3QgY29tcGlsZSB3aXRoIERFQlVHIHN1cHBvcnQgdG8gdXNlIHRoaXMgZmVhdHVyZSIpOworCQkJCSNlbmRpZiAvKiBERUJVRyAqLworCQkJCWJyZWFrOworCQkJCQorCQkJY2FzZSAnZyc6CS8qIFNldCBhIGRlYnVnIGxldmVsIGFuZCBmdW5jdGlvbiBmb3IgR05VIFRMUyBjYWxscy4gICovCisJCQkJZ251dGxzX2RlYnVnID0gKGludClhdG9pKG9wdGFyZyk7CisJCQkJYnJlYWs7CisJCQkJCisJCQljYXNlICdwJzoJLyogU2V0IGEgZGVidWcgbGV2ZWwgYW5kIGZ1bmN0aW9uIGZvciBHTlUgVExTIGNhbGxzLiAgKi8KKwkJCQl0ZXN0X3BhcmFtZXRlciA9IChpbnQpYXRvaShvcHRhcmcpOworCQkJCWJyZWFrOworCQkJCQorCQkJZGVmYXVsdDoJLyogYnVnOiBvcHRpb24gbm90IGNvbnNpZGVyZWQuICAqLworCQkJCXJldHVybjsKKwkJfQorCX0KKwlpZiAoIW5vX3RpbWVvdXQpIHsKKwkJYWxhcm0oVEVTVF9USU1FT1VUKTsKKwl9CisJQ0hFQ0soIDAsIHB0aHJlYWRfY3JlYXRlKCZzaWduYWxfdGhyLCBOVUxMLCBzaWduYWxfY2F0Y2gsIE5VTEwpICk7Cit9CisgCitzdGF0aWMgaW5saW5lIHZvaWQgdGVzdF9pbml0KGludCBhcmdjLCBjaGFyICogYXJndltdLCBjaGFyICpmbmFtZSkKK3sKKwlzaWdzZXRfdCBzaWdfYWxsOworCXNpZ2ZpbGxzZXQoJnNpZ19hbGwpOworCQorCUNIRUNLKCAwLCBwdGhyZWFkX3NpZ21hc2soU0lHX0JMT0NLLCAmc2lnX2FsbCwgTlVMTCkpOworCQorCWZkX2dfY29uZmlnID0gJmNvbmY7CisJbWVtc2V0KGZkX2dfY29uZmlnLCAwLCBzaXplb2Yoc3RydWN0IGZkX2NvbmZpZykpOworCQorCUNIRUNLKCAwLCBmZF9saWJwcm90b19pbml0KCkgKTsKKwkKKwlDSEVDSyggMCwgZmRfaG9va3NfaW5pdCgpICk7CQorCQorCWZkX2xvZ190aHJlYWRuYW1lKGZuYW1lKTsKKwkKKwkvKiBQYXJzZSB0aGUgY29tbWFuZCBsaW5lICovCisJcGFyc2VfY21kbGluZShhcmdjLCBhcmd2KTsKKwkKKwkvKiBJbml0aWFsaXplIGdjcnlwdCBhbmQgZ251dGxzICovCisJKHZvaWQpIGdjcnlfY29udHJvbCAoR0NSWUNUTF9TRVRfVEhSRUFEX0NCUywgJmdjcnlfdGhyZWFkc19wdGhyZWFkKTsKKwkodm9pZCkgZ2NyeV9jb250cm9sIChHQ1JZQ1RMX0VOQUJMRV9RVUlDS19SQU5ET00sIDApOworCUNIRUNLKCAwLCBnbnV0bHNfZ2xvYmFsX2luaXQoKSk7CisJLyogU2V0IGdudXRscyBkZWJ1ZyBsZXZlbCA/ICovCisJaWYgKGdudXRsc19kZWJ1ZykgeworCQlnbnV0bHNfZ2xvYmFsX3NldF9sb2dfZnVuY3Rpb24oKGdudXRsc19sb2dfZnVuYylmZF9nbnV0bHNfZGVidWcpOworCQlnbnV0bHNfZ2xvYmFsX3NldF9sb2dfbGV2ZWwgKGdudXRsc19kZWJ1Zyk7CisJCVRSQUNFX0RFQlVHKElORk8sICJFbmFibGVkIEdOVVRMUyBkZWJ1ZyBhdCBsZXZlbCAlZCIsIGdudXRsc19kZWJ1Zyk7CisJfQorCQorCS8qIEluaXRpYWxpemUgdGhlIGNvbmZpZyAqLworCUNIRUNLKCAwLCBmZF9jb25mX2luaXQoKSApOworCisJLyogQWRkIGRlZmluaXRpb25zIG9mIHRoZSBiYXNlIHByb3RvY29sICovCisJQ0hFQ0soIDAsIGZkX2RpY3RfYmFzZV9wcm90b2NvbChmZF9nX2NvbmZpZy0+Y25mX2RpY3QpICk7CisJCisJLyogSW5pdGlhbGl6ZSBvbmx5IHRoZSBzZXNzaW9ucyAqLworCUNIRUNLKCAwLCBmZF9zZXNzX3N0YXJ0KCkgICk7CisJCisJcmV0dXJuOworfQorI2RlZmluZSBJTklUX0ZEKCkgIHRlc3RfaW5pdChhcmdjLCBhcmd2LCBfX1NUUklQUEVEX0ZJTEVfXykKKworI2VuZGlmIC8qIF9URVNUU19IICovCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0c2N0cC5jIGIvdGVzdHMvdGVzdHNjdHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjQ1M2M4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHNjdHAuYwpAQCAtMCwwICsxLDE0NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBdXRob3I6IFNlYmFzdGllbiBEZWN1Z2lzIDxzZGVjdWdpc0BmcmVlZGlhbWV0ZXIubmV0PgkJCQkJCQkgKgorKgkJCQkJCQkJCQkJCQkgKgorKiBDb3B5cmlnaHQgKGMpIDIwMTMsIFdJREUgUHJvamVjdCBhbmQgTklDVAkJCQkJCQkJICoKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4JCQkJCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSAgKgorKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAkJCQkJCSAqCisqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSAJCQkJCQkJICoKKyogICBmb2xsb3dpbmcgZGlzY2xhaW1lci4JCQkJCQkJCQkJICoKKyogICAgCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCQkJCQkJICoKKyogICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV0lERSBQcm9qZWN0IG9yIE5JQ1Qgbm9yIHRoZSAJCQkJCQkgKgorKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciAJCQkJCQkgKgorKiAgIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAJCQkJCQkgKgorKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBXSURFIFByb2plY3QgYW5kIAkJCQkJCSAqCisqICAgTklDVC4JCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEICoKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBICoKKyogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SICoKKyogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgCSAqCisqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyAJICoKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICoKKyogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiAgICoKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCQkJCQkJCQkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAidGVzdHMuaCIKKworI2luY2x1ZGUgPGNueGN0eC5oPgorCisjaWZuZGVmIFRFU1RfUE9SVAorI2RlZmluZSBURVNUX1BPUlQJMzg2OAorI2VuZGlmIC8qIFRFU1RfUE9SVCAqLworCisjaWZuZGVmIE5CX1NUUkVBTVMKKyNkZWZpbmUgTkJfU1RSRUFNUwkxMAorI2VuZGlmIC8qIE5CX1NUUkVBTVMgKi8KKworCisKKy8qIE1haW4gdGVzdCByb3V0aW5lICovCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworI2lmZGVmIERJU0FCTEVfU0NUUAorCUlOSVRfRkQoKTsKKwkvKiBJbiB0aGlzIGNhc2UsIHdlIGRvbid0IHBlcmZvcm0gdGhpcyBzaW1wbGUgdGVzdCAqLworCVBBU1NURVNUKCk7CisjZWxzZSAvKiBESVNBQkxFX1NDVFAgKi8KKwlzdHJ1Y3QgY254Y3R4IGNsaSwgc3J2OyAvKiB3ZSB1c2Ugb25seSB0aGVpciBjY19zb2NrZXQgJiBjY19zdGF0ZSAqLworCWludCBzb2NrOworCWNoYXIgYnVmMVtdPSJhYmNkZWYiOworCWNoYXIgKmJ1ZjI7CisJc2l6ZV90IHN6OworCXN0cnVjdCBpb3ZlYyBpb3Y7CisJc3RydWN0IGZkX2xpc3QgZXBzID0gRkRfTElTVF9JTklUSUFMSVpFUihlcHMpOworCXVpbnQxNl90IHN0cjsKKwlpbnQgZXY7CisJCisJLyogSW5pdGlhbGl6ZSB0aGUgc2VydmVyIGFkZHJlc3NlcyAqLworCXsKKwkJc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqYWksICphaXA7CisJCW1lbXNldCgmaGludHMsIDAsIHNpemVvZihoaW50cykpOworCQloaW50cy5haV9mbGFncyAgPSBBSV9OVU1FUklDU0VSVjsKKwkJaGludHMuYWlfZmFtaWx5ID0gQUZfSU5FVDsKKwkJQ0hFQ0soIDAsIGdldGFkZHJpbmZvKCJsb2NhbGhvc3QiLCBfc3RyaW5naXplKFRFU1RfUE9SVCksICZoaW50cywgJmFpKSApOworCQlhaXAgPSBhaTsKKwkJd2hpbGUgKGFpcCkgeworCQkJQ0hFQ0soIDAsIGZkX2VwX2FkZF9tZXJnZSggJmVwcywgYWlwLT5haV9hZGRyLCBhaXAtPmFpX2FkZHJsZW4sIEVQX0ZMX0RJU0MgfCBFUF9BQ0NFUFRBTEwgKSk7CisJCQlhaXAgPSBhaXAtPmFpX25leHQ7CisJCX07CisJCWZyZWVhZGRyaW5mbyhhaSk7CisJCQorCQlDSEVDSyggMCwgRkRfSVNfTElTVF9FTVBUWSgmZXBzKSA/IDEgOiAwICk7CisJfQorCQorCW1lbXNldCgmY2xpLCAwLCBzaXplb2YoY2xpKSk7CisJbWVtc2V0KCZzcnYsIDAsIHNpemVvZihzcnYpKTsKKwkKKwkvKiBGaXJzdCwgaW5pdGlhbGl6ZSB0aGUgZGFlbW9uIG1vZHVsZXMgKi8KKwlJTklUX0ZEKCk7CisJCisJLyogUmVzdHJhaW4gdGhlICMgb2Ygc3RyZWFtcyAqLworCWZkX2dfY29uZmlnLT5jbmZfc2N0cF9zdHIgPSBOQl9TVFJFQU1TOworCQorCS8qIENyZWF0ZSB0aGUgc2VydmVyIHNvY2tldCAqLworCUNIRUNLKCAwLCBmZF9zY3RwX2NyZWF0ZV9iaW5kX3NlcnZlciggJnNvY2ssIEFGX0lORVQ2LCAmZXBzLCBURVNUX1BPUlQgKSk7CisJCisJLyogQWNjZXB0IGluY29taW5nIGNsaWVudHMgKi8KKwlDSEVDSyggMCwgZmRfc2N0cF9saXN0ZW4oIHNvY2sgKSk7CisJCisJLyogTm93LCBjcmVhdGUgdGhlIGNsaWVudCBzb2NrZXQgKi8KKwlDSEVDSyggMCwgZmRfc2N0cF9jbGllbnQoICZjbGkuY2Nfc29ja2V0LCAwLCBURVNUX1BPUlQsICZlcHMgKSk7CisJCisJLyogQWNjZXB0IHRoaXMgY29ubmVjdGlvbiAqLworCXNydi5jY19zb2NrZXQgPSBhY2NlcHQoc29jaywgTlVMTCwgTlVMTCk7CisJCisJLyogU2VuZCBhIGZpcnN0IG1lc3NhZ2UgKi8KKwlpb3YuaW92X2Jhc2UgPSBidWYxOworCWlvdi5pb3ZfbGVuID0gc2l6ZW9mKGJ1ZjEpOworCUNIRUNLKCBzaXplb2YoYnVmMSksIGZkX3NjdHBfc2VuZHN0cnYoJnNydiwgMSwgJmlvdiwgMSApICk7CisJQ0hFQ0soIDAsIHNydi5jY19zdGF0ZSk7CisJCisJLyogUmVjZWl2ZSB0aGlzIG1lc3NhZ2UgKi8KK3JlZG8xOgorCUNIRUNLKCAwLCBmZF9zY3RwX3JlY3ZtZXRhKCZjbGksICZzdHIsICh1aW50OF90ICoqKSZidWYyLCAmc3osICZldikgKTsKKwlpZiAoZXYgPT0gRkRFVlBfQ05YX0VQX0NIQU5HRSkKKwkJZ290byByZWRvMTsKKwlDSEVDSyggRkRFVlBfQ05YX01TR19SRUNWLCBldik7CisJQ0hFQ0soIDAsIGNsaS5jY19zdGF0ZSk7CisJQ0hFQ0soIDEsIHN0cik7CisJQ0hFQ0soIHNpemVvZihidWYxKSwgc3ogKTsKKwlDSEVDSyggMCwgbWVtY21wKGJ1ZjEsIGJ1ZjIsIHN6KSApOworCWZyZWUoYnVmMik7IGJ1ZjIgPSBOVUxMOworCQorCS8qIFNlbmQgaW4gdGhlIG90aGVyIGRpcmVjdGlvbiAqLworCUNIRUNLKCBzaXplb2YoYnVmMSksIGZkX3NjdHBfc2VuZHN0cnYoJmNsaSwgMiwgJmlvdiwgMSkgKTsKKwlDSEVDSyggMCwgY2xpLmNjX3N0YXRlKTsKKwkKKwkvKiBSZWNlaXZlIHRoaXMgbWVzc2FnZSAqLworcmVkbzI6CisJQ0hFQ0soIDAsIGZkX3NjdHBfcmVjdm1ldGEoJnNydiwgJnN0ciwgKHVpbnQ4X3QgKiopJmJ1ZjIsICZzeiwgJmV2KSApOworCWlmIChldiA9PSBGREVWUF9DTlhfRVBfQ0hBTkdFKQorCQlnb3RvIHJlZG8yOworCUNIRUNLKCBGREVWUF9DTlhfTVNHX1JFQ1YsIGV2KTsKKwlDSEVDSyggMCwgc3J2LmNjX3N0YXRlKTsKKwlDSEVDSyggMiwgc3RyKTsKKwlDSEVDSyggc2l6ZW9mKGJ1ZjEpLCBzeiApOworCUNIRUNLKCAwLCBtZW1jbXAoYnVmMSwgYnVmMiwgc3opICk7CisJZnJlZShidWYyKTsgYnVmMiA9IE5VTEw7CisJCisJLyogVGhhdCdzIGFsbCBmb3IgdGhlIHRlc3RzIHlldCAqLworCVBBU1NURVNUKCk7CisjZW5kaWYgLyogRElTQUJMRV9TQ1RQICovCit9IAorCQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHNlc3MuYyBiL3Rlc3RzL3Rlc3RzZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFjYzMzNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RzZXNzLmMKQEAgLTAsMCArMSw0MDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgKEJTRCBMaWNlbnNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQXV0aG9yOiBTZWJhc3RpZW4gRGVjdWdpcyA8c2RlY3VnaXNAZnJlZWRpYW1ldGVyLm5ldD4JCQkJCQkJICoKKyoJCQkJCQkJCQkJCQkJICoKKyogQ29weXJpZ2h0IChjKSAyMDEzLCBXSURFIFByb2plY3QgYW5kIE5JQ1QJCQkJCQkJCSAqCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCQkJCQkJCQkJCQkgKgorKiAJCQkJCQkJCQkJCQkJICoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgICoKKyogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAJCQkJCQkgKgorKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgCQkJCQkJCSAqCisqICAgZm9sbG93aW5nIGRpc2NsYWltZXIuCQkJCQkJCQkJCSAqCisqICAgIAkJCQkJCQkJCQkJCQkgKgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCQkJCQkJICoKKyogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIAkJCQkJCQkgKgorKiAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgkJCQkJCSAqCisqICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4JCQkJCQkJCSAqCisqIAkJCQkJCQkJCQkJCQkgKgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFdJREUgUHJvamVjdCBvciBOSUNUIG5vciB0aGUgCQkJCQkJICoKKyogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgCQkJCQkJICoKKyogICBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCQkJCQkJICoKKyogICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgV0lERSBQcm9qZWN0IGFuZCAJCQkJCQkgKgorKiAgIE5JQ1QuCQkJCQkJCQkJCQkJICoKKyogCQkJCQkJCQkJCQkJCSAqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCAqCisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSAqCisqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAqCisqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIAkgKgorKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCSAqCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAqCisqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgICAqCisqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgkJCQkJCQkJICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInRlc3RzLmgiCisKKyNkZWZpbmUgVEVTVF9ESUFNX0lEIAkidGVzdHNlc3MubXlpZCIKKyNkZWZpbmUgVEVTVF9PUFRfSU4JInN1ZmZpeCIKKyNkZWZpbmUgVEVTVF9PUFQJKG9zMF90KVRFU1RfT1BUX0lOCisjZGVmaW5lIFRFU1RfU0lEX0lOCVRFU1RfRElBTV9JRCAiOzEyMzQ7NTY3ODsiIFRFU1RfT1BUX0lOCisjZGVmaW5lIFRFU1RfU0lECShvczBfdClURVNUX1NJRF9JTgorCisjZGVmaW5lIFRFU1RfRVlFQwkweDdlNTdlMWVjCitzdHJ1Y3Qgc2Vzc19zdGF0ZSB7CisJaW50CWV5ZWM7CS8qIFRFU1RfRVlFQyAqLworCW9zMF90ICAgc2lkOyAJLyogdGhlIHNlc3Npb24gd2l0aCB3aGljaCB0aGUgZGF0YSB3YXMgcmVnaXN0ZXJlZCAqLworCWludCAgKiAgZnJlZWQ7CS8qIGxvY2F0aW9uIHdoZXJlIHRvIHdyaXRlIHRoZSBmcmVlZCBzdGF0dXMgKi8KKwl2b2lkICogIG9wYXF1ZTsgLyogaWYgb3BhcXVlIHdhcyBwcm92aWRlZCwgdGhpcyBpcyB0aGUgdmFsdWUgd2UgZXhwZWN0ICovCit9OworCitzdGF0aWMgdm9pZCBteWNsZWFudXAoIHN0cnVjdCBzZXNzX3N0YXRlICogZGF0YSwgb3MwX3Qgc2lkLCB2b2lkICogb3BhcXVlICkKK3sKKwkvKiBzYW5pdHkgKi8KKwlDSEVDSyggMSwgc2lkID8gMSA6IDAgKTsKKwlDSEVDSyggMSwgZGF0YT8gMSA6IDAgKTsKKwlDSEVDSyggVEVTVF9FWUVDLCBkYXRhLT5leWVjICk7CisJQ0hFQ0soIDAsIHN0cmNtcCgoY2hhciAqKXNpZCwgKGNoYXIgKilkYXRhLT5zaWQpICk7CisJaWYgKGRhdGEtPmZyZWVkKQorCQkqKGRhdGEtPmZyZWVkKSArPSAxOworCWlmIChkYXRhLT5vcGFxdWUpIHsKKwkJQ0hFQ0soIDEsIG9wYXF1ZSA9PSBkYXRhLT5vcGFxdWUgPyAxIDogMCApOyAgCisJfQorCS8qIE5vdywgZnJlZSB0aGUgZGF0YSAqLworCWZyZWUoZGF0YS0+c2lkKTsKKwlmcmVlKGRhdGEpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBzdHJ1Y3Qgc2Vzc19zdGF0ZSAqIG5ld19zdGF0ZShvczBfdCBzaWQsIGludCAqZnJlZWQpIAoreworCXN0cnVjdCBzZXNzX3N0YXRlICpuZXc7CisJbmV3ID0gbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2Vzc19zdGF0ZSkpOworCUNIRUNLKCAxLCBuZXcgPyAxIDogMCApOworCW1lbXNldChuZXcsIDAsIHNpemVvZihzdHJ1Y3Qgc2Vzc19zdGF0ZSkpOworCW5ldy0+ZXllYyA9IFRFU1RfRVlFQzsKKwluZXctPnNpZCA9IG9zMGR1cChzaWQsIHN0cmxlbigoY2hhciAqKXNpZCkpOworCUNIRUNLKCAxLCBuZXctPnNpZCA/IDEgOiAwICk7CisJbmV3LT5mcmVlZCA9IGZyZWVkOworCXJldHVybiBuZXc7Cit9CisKK3ZvaWQgKiBnX29wYXF1ZSA9ICh2b2lkICopInRlc3QiOworCisvKiBBdm9pZCBhIGxvdCBvZiBjYXN0cyAqLworI3VuZGVmIHN0cmxlbgorI2RlZmluZSBzdHJsZW4ocykgc3RybGVuKChjaGFyICopcykKKyN1bmRlZiBzdHJuY21wCisjZGVmaW5lIHN0cm5jbXAoczEsczIsbCkgc3RybmNtcCgoY2hhciAqKXMxLCAoY2hhciAqKXMyLCBsKQorI3VuZGVmIHN0cmNtcAorI2RlZmluZSBzdHJjbXAoczEsczIpIHN0cmNtcCgoY2hhciAqKXMxLCAoY2hhciAqKXMyKQorCQorCisvKiBNYWluIHRlc3Qgcm91dGluZSAqLworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlzdHJ1Y3Qgc2Vzc2lvbl9oYW5kbGVyICogaGRsMSwgKmhkbDI7CisJc3RydWN0IHNlc3Npb24gKnNlc3MxLCAqc2VzczIsICpzZXNzMzsKKwlvczBfdCBzdHIxLCBzdHIyOworCXNpemVfdCBzdHIxbGVuLCBzdHIybGVuOworCWludCBuZXc7CisJCisJLyogRmlyc3QsIGluaXRpYWxpemUgdGhlIGRhZW1vbiBtb2R1bGVzICovCisJSU5JVF9GRCgpOworCQorCS8qIFRlc3QgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gaGFuZGxlcnMgKHNpbXBsZSBzaXR1YXRpb24pICovCisJeworCQl2b2lkICogdGVzdHB0ciA9IE5VTEw7CisJCUNIRUNLKCAwLCBmZF9zZXNzX2hhbmRsZXJfY3JlYXRlICggJmhkbDEsIG15Y2xlYW51cCwgTlVMTCwgTlVMTCApICk7CisJCUNIRUNLKCAwLCBmZF9zZXNzX2hhbmRsZXJfY3JlYXRlICggJmhkbDIsIG15Y2xlYW51cCwgTlVMTCwgTlVMTCApICk7CisJCUNIRUNLKCAwLCBmZF9zZXNzX2hhbmRsZXJfZGVzdHJveSggJmhkbDIsICZ0ZXN0cHRyICkgKTsKKwkJQ0hFQ0soIDEsIHRlc3RwdHIgPT0gTlVMTCA/IDEgOiAwICk7CisJCUNIRUNLKCAwLCBmZF9zZXNzX2hhbmRsZXJfY3JlYXRlICggJmhkbDIsIG15Y2xlYW51cCwgTlVMTCwgZ19vcGFxdWUgKSApOworCQkjaWYgMAorCQlmZF9sb2dfZGVidWcoIiVzIiwgZmRfc2Vzc19kdW1wX2hkbChGRF9EVU1QX1RFU1RfUEFSQU1TLCBoZGwxKSk7CisJCWZkX2xvZ19kZWJ1ZygiJXMiLCBmZF9zZXNzX2R1bXBfaGRsKEZEX0RVTVBfVEVTVF9QQVJBTVMsIGhkbDIpKTsKKwkJI2VuZGlmCisJfQorCQorCS8qIFRlc3QgU2Vzc2lvbiBJZCBnZW5lcmF0aW9uIChmZF9zZXNzX25ldykgKi8KKwl7CisJCS8qIERpYW1JZCBpcyBwcm92aWRlZCwgbm90IG9wdCAqLworCQlDSEVDSyggMCwgZmRfc2Vzc19uZXcoICZzZXNzMSwgVEVTVF9ESUFNX0lELCBDT05TVFNUUkxFTihURVNUX0RJQU1fSUQpLCBOVUxMLCAwICkgKTsKKwkJQ0hFQ0soIDAsIGZkX3Nlc3NfbmV3KCAmc2VzczIsIFRFU1RfRElBTV9JRCwgQ09OU1RTVFJMRU4oVEVTVF9ESUFNX0lEKSwgTlVMTCwgMCApICk7CisJCSNpZiAwCisJCWZkX2xvZ19kZWJ1ZygiJXMiLCBmZF9zZXNzX2R1bXAoRkRfRFVNUF9URVNUX1BBUkFNUywgc2VzczEsIDEpKTsKKwkJZmRfbG9nX2RlYnVnKCIlcyIsIGZkX3Nlc3NfZHVtcChGRF9EVU1QX1RFU1RfUEFSQU1TLCBzZXNzMiwgMSkpOworCQkjZW5kaWYKKwkJCisJCS8qIENoZWNrIGJvdGggc3RyaW5nIHN0YXJ0IHdpdGggdGhlIGRpYW1ldGVyIElkLCBidXQgYXJlIGRpZmZlcmVudCAqLworCQlDSEVDSyggMCwgZmRfc2Vzc19nZXRzaWQoc2VzczEsICZzdHIxLCAmc3RyMWxlbikgKTsKKwkJQ0hFQ0soIDEsIChzdHJsZW4oc3RyMSkgPT0gc3RyMWxlbikgPyAxIDogMCApOworCQlDSEVDSyggMCwgc3RybmNtcChzdHIxLCBURVNUX0RJQU1fSUQgIjsiLCBDT05TVFNUUkxFTihURVNUX0RJQU1fSUQpICsgMSkgKTsKKwkJQ0hFQ0soIDAsIGZkX3Nlc3NfZ2V0c2lkKHNlc3MyLCAmc3RyMiwgJnN0cjJsZW4pICk7CisJCUNIRUNLKCAwLCBzdHJuY21wKHN0cjIsIFRFU1RfRElBTV9JRCAiOyIsIENPTlNUU1RSTEVOKFRFU1RfRElBTV9JRCkgKyAxKSApOworCQlDSEVDSyggMSwgc3RyY21wKHN0cjEsIHN0cjIpID8gMSA6IDAgKTsKKwkJQ0hFQ0soIDAsIGZkX3Nlc3NfZGVzdHJveSggJnNlc3MxICkgKTsKKwkJQ0hFQ0soIDAsIGZkX3Nlc3NfZGVzdHJveSggJnNlc3MyICkgKTsKKwkJCisJCS8qIGRpYW1JZCBhbmQgb3B0ICovCisJCUNIRUNLKCAwLCBmZF9zZXNzX25ldyggJnNlc3MxLCBURVNUX0RJQU1fSUQsIDAsIFRFU1RfT1BULCAwICkgKTsKKwkJQ0hFQ0soIDAsIGZkX3Nlc3NfbmV3KCAmc2VzczIsIFRFU1RfRElBTV9JRCwgQ09OU1RTVFJMRU4oVEVTVF9ESUFNX0lEKSwgVEVTVF9PUFQsIENPTlNUU1RSTEVOKFRFU1RfT1BUX0lOKSAtIDEgKSApOworCQkjaWYgMAorCQlmZF9sb2dfZGVidWcoIiVzIiwgZmRfc2Vzc19kdW1wKEZEX0RVTVBfVEVTVF9QQVJBTVMsIHNlc3MxLCAxKSk7CisJCWZkX2xvZ19kZWJ1ZygiJXMiLCBmZF9zZXNzX2R1bXAoRkRfRFVNUF9URVNUX1BBUkFNUywgc2VzczIsIDEpKTsKKwkJI2VuZGlmCisJCQorCQlDSEVDSyggMCwgZmRfc2Vzc19nZXRzaWQoc2VzczEsICZzdHIxLCAmc3RyMWxlbikgKTsKKwkJQ0hFQ0soIDAsIHN0cm5jbXAoc3RyMSwgVEVTVF9ESUFNX0lEICI7IiwgQ09OU1RTVFJMRU4oVEVTVF9ESUFNX0lEKSArIDEpICk7CisJCUNIRUNLKCAwLCBzdHJjbXAoc3RyMSArIHN0cjFsZW4gLSBDT05TVFNUUkxFTihURVNUX09QVF9JTikgLSAxLCAiOyIgVEVTVF9PUFRfSU4pICk7CisJCQorCQlDSEVDSyggMCwgZmRfc2Vzc19nZXRzaWQoc2VzczIsICZzdHIyLCAmc3RyMmxlbikgKTsKKwkJQ0hFQ0soIDAsIHN0cm5jbXAoc3RyMiwgVEVTVF9ESUFNX0lEICI7IiwgQ09OU1RTVFJMRU4oVEVTVF9ESUFNX0lEKSArIDEpICk7CisJCUNIRUNLKCAwLCBzdHJuY21wKHN0cjIgKyBzdHIybGVuIC0gQ09OU1RTVFJMRU4oVEVTVF9PUFRfSU4pLCAiOyIgVEVTVF9PUFRfSU4sIENPTlNUU1RSTEVOKFRFU1RfT1BUX0lOKSkgKTsKKwkJCisJCUNIRUNLKCAxLCBzdHJjbXAoc3RyMSwgc3RyMikgPyAxIDogMCApOworCQlDSEVDSyggMCwgZmRfc2Vzc19kZXN0cm95KCAmc2VzczEgKSApOworCQlDSEVDSyggMCwgZmRfc2Vzc19kZXN0cm95KCAmc2VzczIgKSApOworCQkKKwkJLyogTm93LCBvbmx5IG9wdCBpcyBwcm92aWRlZCAqLworCQlDSEVDSyggMCwgZmRfc2Vzc19uZXcoICZzZXNzMSwgTlVMTCwgMCwgVEVTVF9TSUQsIDAgKSApOworCQlDSEVDSyggRUFMUkVBRFksIGZkX3Nlc3NfbmV3KCAmc2VzczIsIE5VTEwsIDAsIFRFU1RfU0lELCAwICkgKTsKKwkJQ0hFQ0soIHNlc3MyLCBzZXNzMSApOworCQlDSEVDSyggRUFMUkVBRFksIGZkX3Nlc3NfbmV3KCAmc2VzczMsIE5VTEwsIDAsIFRFU1RfU0lELCBDT05TVFNUUkxFTihURVNUX1NJRF9JTikgKSApOworCQlDSEVDSyggc2VzczMsIHNlc3MxICk7CisJCUNIRUNLKCAwLCBmZF9zZXNzX25ldyggJnNlc3MyLCBOVUxMLCAwLCBURVNUX1NJRCwgQ09OU1RTVFJMRU4oVEVTVF9TSURfSU4pIC0gMSApICk7CisJCSNpZiAwCisJCWZkX2xvZ19kZWJ1ZygiJXMiLCBmZF9zZXNzX2R1bXAoRkRfRFVNUF9URVNUX1BBUkFNUywgc2VzczEsIDEpKTsKKwkJZmRfbG9nX2RlYnVnKCIlcyIsIGZkX3Nlc3NfZHVtcChGRF9EVU1QX1RFU1RfUEFSQU1TLCBzZXNzMiwgMSkpOworCQkjZW5kaWYKKwkJQ0hFQ0soIDAsIGZkX3Nlc3NfZ2V0c2lkKHNlc3MxLCAmc3RyMSwgJnN0cjFsZW4pICk7CisJCUNIRUNLKCAwLCBmZF9zZXNzX2dldHNpZChzZXNzMiwgJnN0cjIsICZzdHIybGVuKSApOworCQlDSEVDSyggMCwgc3RybmNtcCggc3RyMSwgc3RyMiwgQ09OU1RTVFJMRU4oVEVTVF9TSURfSU4pIC0gMSApICk7CisJCUNIRUNLKCAwLCBzdHJjbXAoIHN0cjEsIFRFU1RfU0lEICkgKTsKKwkJQ0hFQ0soIDEsIHN0cmNtcCggc3RyMSwgc3RyMiApID8gMSA6IDAgKTsKKwkJCisJCUNIRUNLKCAwLCBmZF9zZXNzX2Rlc3Ryb3koICZzZXNzMiApICk7CisJCUNIRUNLKCAwLCBmZF9zZXNzX2Rlc3Ryb3koICZzZXNzMSApICk7CisJfQorCQorCS8qIFRlc3QgZmRfc2Vzc19nZXRjb3VudCAqLworCXsKKwkJdWludDMyX3QgY250OworCQlDSEVDSyggMCwgZmRfc2Vzc19uZXcoICZzZXNzMSwgVEVTVF9ESUFNX0lELCBDT05TVFNUUkxFTihURVNUX0RJQU1fSUQpLCBOVUxMLCAwICkgKTsKKwkJQ0hFQ0soIDAsIGZkX3Nlc3NfbmV3KCAmc2VzczIsIFRFU1RfRElBTV9JRCwgQ09OU1RTVFJMRU4oVEVTVF9ESUFNX0lEKSwgTlVMTCwgMCApICk7CisJCUNIRUNLKCAwLCBmZF9zZXNzX2dldGNvdW50KCZjbnQpKTsKKwkJQ0hFQ0soIDIsIGNudCk7CisJCUNIRUNLKCAwLCBmZF9zZXNzX2Rlc3Ryb3koICZzZXNzMiApICk7CisJCUNIRUNLKCAwLCBmZF9zZXNzX2dldGNvdW50KCZjbnQpKTsKKwkJQ0hFQ0soIDEsIGNudCk7CisJCUNIRUNLKCAwLCBmZF9zZXNzX2Rlc3Ryb3koICZzZXNzMSApICk7CisJCUNIRUNLKCAwLCBmZF9zZXNzX2dldGNvdW50KCZjbnQpKTsKKwkJQ0hFQ0soIDAsIGNudCk7CisJCQorCX0KKwkJCisJLyogVGVzdCBmZF9zZXNzX2Zyb21zaWQgKi8KKwl7CisJCUNIRUNLKCAwLCBmZF9zZXNzX2Zyb21zaWQoIFRFU1RfU0lELCBDT05TVFNUUkxFTihURVNUX1NJRF9JTiksICZzZXNzMSwgJm5ldyApICk7CisJCUNIRUNLKCAxLCBuZXcgPyAxIDogMCApOworCQkKKwkJQ0hFQ0soIDAsIGZkX3Nlc3NfZnJvbXNpZCggVEVTVF9TSUQsIENPTlNUU1RSTEVOKFRFU1RfU0lEX0lOKSwgJnNlc3MyLCAmbmV3ICkgKTsKKwkJQ0hFQ0soIDAsIG5ldyApOworCQlDSEVDSyggc2VzczEsIHNlc3MyICk7CisJCQorCQlDSEVDSyggMCwgZmRfc2Vzc19mcm9tc2lkKCBURVNUX1NJRCwgQ09OU1RTVFJMRU4oVEVTVF9TSURfSU4pLCAmc2VzczMsIE5VTEwgKSApOworCQlDSEVDSyggc2VzczEsIHNlc3MzICk7CisJCQorCQlDSEVDSyggMCwgZmRfc2Vzc19kZXN0cm95KCAmc2VzczEgKSApOworCX0KKwkKKwkvKiBUZXN0IGZkX3Nlc3NfcmVjbGFpbSAqLworCXsKKwkJc3RydWN0IHNlc3Nfc3RhdGUgKnRtczsKKwkJCisJCUNIRUNLKCAwLCBmZF9zZXNzX2Zyb21zaWQoIFRFU1RfU0lELCBDT05TVFNUUkxFTihURVNUX1NJRF9JTiksICZzZXNzMSwgJm5ldyApICk7CisJCUNIRUNLKCAxLCBuZXcgPyAxIDogMCApOworCQkKKwkJQ0hFQ0soIDAsIGZkX3Nlc3NfcmVjbGFpbSggJnNlc3MxICkgKTsKKwkJQ0hFQ0soIE5VTEwsIHNlc3MxICk7CisJCQorCQlDSEVDSyggMCwgZmRfc2Vzc19mcm9tc2lkKCBURVNUX1NJRCwgQ09OU1RTVFJMRU4oVEVTVF9TSURfSU4pLCAmc2VzczEsICZuZXcgKSApOworCQlDSEVDSyggMSwgbmV3ID8gMSA6IDAgKTsKKwkJCisJCXRtcyA9IG5ld19zdGF0ZShURVNUX1NJRCwgTlVMTCk7CisJCUNIRUNLKCAwLCBmZF9zZXNzX3N0YXRlX3N0b3JlICggaGRsMSwgc2VzczEsICZ0bXMgKSApOworCQkKKwkJQ0hFQ0soIDAsIGZkX3Nlc3NfcmVjbGFpbSggJnNlc3MxICkgKTsKKwkJQ0hFQ0soIE5VTEwsIHNlc3MxICk7CisJCQorCQlDSEVDSyggMCwgZmRfc2Vzc19mcm9tc2lkKCBURVNUX1NJRCwgQ09OU1RTVFJMRU4oVEVTVF9TSURfSU4pLCAmc2VzczEsICZuZXcgKSApOworCQlDSEVDSyggMCwgbmV3ICk7CisJCQorCQlDSEVDSyggMCwgZmRfc2Vzc19kZXN0cm95KCAmc2VzczEgKSApOworCQkKKwkJQ0hFQ0soIDAsIGZkX3Nlc3NfZnJvbXNpZCggVEVTVF9TSUQsIENPTlNUU1RSTEVOKFRFU1RfU0lEX0lOKSwgJnNlc3MxLCAmbmV3ICkgKTsKKwkJQ0hFQ0soIDEsIG5ldyA/IDEgOiAwICk7CisJCQorCQlDSEVDSyggMCwgZmRfc2Vzc19kZXN0cm95KCAmc2VzczEgKSApOworCX0KKwkKKwkvKiBUZXN0IHRpbWVvdXQgZnVuY3Rpb24gKi8KKwl7CisJCXN0cnVjdCB0aW1lc3BlYyB0aW1lb3V0OworCQkKKwkJQ0hFQ0soIDAsIGZkX3Nlc3NfZnJvbXNpZCggVEVTVF9TSUQsIENPTlNUU1RSTEVOKFRFU1RfU0lEX0lOKSwgJnNlc3MxLCAmbmV3ICkgKTsKKwkJQ0hFQ0soIDEsIG5ldyA/IDEgOiAwICk7CisJCQorCQlDSEVDSyggMCwgY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJnRpbWVvdXQpICk7CisJCUNIRUNLKCAwLCBmZF9zZXNzX3NldHRpbWVvdXQoIHNlc3MxLCAmdGltZW91dCkgKTsgLyogZXhwaXJlIG5vdyAqLworCQl0aW1lb3V0LnR2X3NlYyA9IDA7CisJCXRpbWVvdXQudHZfbnNlYz0gNTAwMDAwMDA7IC8qIDUwIG1zICovCisJCUNIRUNLKCAwLCBuYW5vc2xlZXAoJnRpbWVvdXQsIE5VTEwpICk7CisJCQorCQlDSEVDSyggMCwgZmRfc2Vzc19mcm9tc2lkKCBURVNUX1NJRCwgQ09OU1RTVFJMRU4oVEVTVF9TSURfSU4pLCAmc2VzczEsICZuZXcgKSApOworCQlDSEVDSyggMSwgbmV3ID8gMSA6IDAgKTsKKwkJCisJCUNIRUNLKCAwLCBjbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmdGltZW91dCkgKTsKKwkJdGltZW91dC50dl9zZWMgKz0gMjY3ODUwMDsgLyogbG9uZ2VyIHRoYXQgU0VTU19ERUZBVUxUX0xJRkVUSU1FICovCisJCUNIRUNLKCAwLCBmZF9zZXNzX3NldHRpbWVvdXQoIHNlc3MxLCAmdGltZW91dCkgKTsKKwkJCisJCS8qIENyZWF0ZSBhIHNlY29uZCBzZXNzaW9uICovCisJCUNIRUNLKCAwLCBmZF9zZXNzX25ldyggJnNlc3MyLCBURVNUX0RJQU1fSUQsIDAsIE5VTEwsIDAgKSApOworCQkKKwkJLyogV2UgZG9uJ3QgcmVhbGx5IGhhdmUgYSB3YXkgdG8gdmVyaWZ5IHRoZSBleHBpcnkgbGlzdCBpcyBpbiBwcm9wZXIgb3JkZXIgYXV0b21hdGljYWxseSBoZXJlLi4uICovCisJCQorCQlDSEVDSyggMCwgZmRfc2Vzc19kZXN0cm95KCAmc2VzczIgKSApOworCQlDSEVDSyggMCwgZmRfc2Vzc19kZXN0cm95KCAmc2VzczEgKSApOworCX0KKwkKKwkKKwkvKiBUZXN0IHN0YXRlcyBvcGVyYXRpb25zICovCisJeworCQlzdHJ1Y3Qgc2Vzc19zdGF0ZSAqIG1zWzZdLCAqdG1zOworCQlpbnQgZnJlZWRbNl07CisJCXN0cnVjdCB0aW1lc3BlYyB0aW1lb3V0OworCQl2b2lkICogdGVzdHB0ciA9IE5VTEw7CisJCQorCQkvKiBDcmVhdGUgdGhyZWUgc2Vzc2lvbnMgKi8KKwkJQ0hFQ0soIDAsIGZkX3Nlc3NfbmV3KCAmc2VzczEsIFRFU1RfRElBTV9JRCwgMCwgTlVMTCwgMCApICk7CisJCUNIRUNLKCAwLCBmZF9zZXNzX25ldyggJnNlc3MyLCBURVNUX0RJQU1fSUQsIDAsIE5VTEwsIDAgKSApOworCQlDSEVDSyggMCwgZmRfc2Vzc19uZXcoICZzZXNzMywgVEVTVF9ESUFNX0lELCAwLCBOVUxMLCAwICkgKTsKKwkJCisJCS8qIENyZWF0ZSAyIHN0YXRlcyAqLworCQlDSEVDSyggMCwgZmRfc2Vzc19nZXRzaWQoc2VzczEsICZzdHIxLCAmc3RyMWxlbikgKTsKKwkJZnJlZWRbMF0gPSAwOworCQltc1swXSA9IG5ld19zdGF0ZShzdHIxLCAmZnJlZWRbMF0pOworCQltc1sxXSA9IG5ld19zdGF0ZShzdHIxLCBOVUxMKTsKKworCQl0bXMgPSBtc1swXTsgLyogc2F2ZSBhIGNvcHkgKi8KKwkJQ0hFQ0soIDAsIGZkX3Nlc3Nfc3RhdGVfc3RvcmUgKCBoZGwxLCBzZXNzMSwgJm1zWzBdICkgKTsKKwkJQ0hFQ0soIE5VTEwsIG1zWzBdICk7CisJCUNIRUNLKCBFSU5WQUwsIGZkX3Nlc3Nfc3RhdGVfc3RvcmUgKCBoZGwxLCBzZXNzMSwgTlVMTCApICk7CisJCUNIRUNLKCBFQUxSRUFEWSwgZmRfc2Vzc19zdGF0ZV9zdG9yZSAoIGhkbDEsIHNlc3MxLCAmbXNbMV0gKSApOworCQlDSEVDSyggMSwgbXNbMV0gPyAxIDogMCApOworCQkKKwkJI2lmIDAKKwkJZmRfbG9nX2RlYnVnKCIlcyIsIGZkX3Nlc3NfZHVtcChGRF9EVU1QX1RFU1RfUEFSQU1TLCBzZXNzMSwgMSkpOworCQkjZW5kaWYKKwkJCisJCUNIRUNLKCAwLCBmZF9zZXNzX3N0YXRlX3JldHJpZXZlKCBoZGwxLCBzZXNzMSwgJm1zWzBdICkgKTsKKwkJQ0hFQ0soIHRtcywgbXNbMF0gKTsKKwkJQ0hFQ0soIDAsIGZyZWVkWzBdICk7CisJCQorCQlDSEVDSyggMCwgZmRfc2Vzc19zdGF0ZV9yZXRyaWV2ZSggaGRsMSwgc2VzczIsICZ0bXMgKSApOworCQlDSEVDSyggTlVMTCwgdG1zICk7CisJCQorCQlteWNsZWFudXAobXNbMF0sIHN0cjEsIE5VTEwpOworCQlteWNsZWFudXAobXNbMV0sIHN0cjEsIE5VTEwpOworCQkKKwkJLyogTm93IGNyZWF0ZSA2IHN0YXRlcyAqLworCQltZW1zZXQoJmZyZWVkWzBdLCAwLCBzaXplb2YoZnJlZWQpKTsKKwkJQ0hFQ0soIDAsIGZkX3Nlc3NfZ2V0c2lkKHNlc3MxLCAmc3RyMSwgJnN0cjFsZW4pICk7CisJCW1zWzBdID0gbmV3X3N0YXRlKHN0cjEsICZmcmVlZFswXSk7CisJCW1zWzFdID0gbmV3X3N0YXRlKHN0cjEsICZmcmVlZFsxXSk7CisJCUNIRUNLKCAwLCBmZF9zZXNzX2dldHNpZChzZXNzMiwgJnN0cjEsICZzdHIxbGVuKSApOworCQltc1syXSA9IG5ld19zdGF0ZShzdHIxLCAmZnJlZWRbMl0pOworCQltc1szXSA9IG5ld19zdGF0ZShzdHIxLCAmZnJlZWRbM10pOworCQlDSEVDSyggMCwgZmRfc2Vzc19nZXRzaWQoc2VzczMsICZzdHIxLCAmc3RyMWxlbikgKTsKKwkJbXNbNF0gPSBuZXdfc3RhdGUoc3RyMSwgJmZyZWVkWzRdKTsKKwkJbXNbNV0gPSBuZXdfc3RhdGUoc3RyMSwgJmZyZWVkWzVdKTsKKwkJbXNbNV0tPm9wYXF1ZSA9IGdfb3BhcXVlOworCQlzdHIyID0gb3MwZHVwKHN0cjEsIHN0cjFsZW4pOworCQlDSEVDSyggMSwgc3RyMiA/IDEgOiAwICk7CisJCQorCQkvKiBTdG9yZSB0aGUgc2l4IHN0YXRlcyAqLworCQlDSEVDSyggMCwgZmRfc2Vzc19zdGF0ZV9zdG9yZSAoIGhkbDEsIHNlc3MxLCAmbXNbMF0gKSApOworCQlDSEVDSyggMCwgZmRfc2Vzc19zdGF0ZV9zdG9yZSAoIGhkbDIsIHNlc3MxLCAmbXNbMV0gKSApOworCQlDSEVDSyggMCwgZmRfc2Vzc19zdGF0ZV9zdG9yZSAoIGhkbDEsIHNlc3MyLCAmbXNbMl0gKSApOworCQlDSEVDSyggMCwgZmRfc2Vzc19zdGF0ZV9zdG9yZSAoIGhkbDIsIHNlc3MyLCAmbXNbM10gKSApOworCQlDSEVDSyggMCwgZmRfc2Vzc19zdGF0ZV9zdG9yZSAoIGhkbDEsIHNlc3MzLCAmbXNbNF0gKSApOworCQlDSEVDSyggMCwgZmRfc2Vzc19zdGF0ZV9zdG9yZSAoIGhkbDIsIHNlc3MzLCAmbXNbNV0gKSApOworCQkKKwkJI2lmIDAKKwkJZmRfbG9nX2RlYnVnKCIlcyIsIGZkX3Nlc3NfZHVtcChGRF9EVU1QX1RFU1RfUEFSQU1TLCBzZXNzMSwgMSkpOworCQlmZF9sb2dfZGVidWcoIiVzIiwgZmRfc2Vzc19kdW1wKEZEX0RVTVBfVEVTVF9QQVJBTVMsIHNlc3MyLCAxKSk7CisJCWZkX2xvZ19kZWJ1ZygiJXMiLCBmZF9zZXNzX2R1bXAoRkRfRFVNUF9URVNUX1BBUkFNUywgc2VzczMsIDEpKTsKKwkJI2VuZGlmCisJCQorCQkvKiBEZXN0cm95IHNlc3Npb24gMyAqLworCQlDSEVDSyggMCwgZmRfc2Vzc19kZXN0cm95KCAmc2VzczMgKSApOworCQlDSEVDSyggMCwgZnJlZWRbMF0gKTsKKwkJQ0hFQ0soIDAsIGZyZWVkWzFdICk7CisJCUNIRUNLKCAwLCBmcmVlZFsyXSApOworCQlDSEVDSyggMCwgZnJlZWRbM10gKTsKKwkJQ0hFQ0soIDEsIGZyZWVkWzRdICk7CisJCUNIRUNLKCAxLCBmcmVlZFs1XSApOworCQkKKwkJLyogRGVzdHJveSBoYW5kbGVyIDIgKi8KKwkJQ0hFQ0soIDAsIGZkX3Nlc3NfaGFuZGxlcl9kZXN0cm95KCAmaGRsMiwgJnRlc3RwdHIgKSApOworCQlDSEVDSyggMCwgZnJlZWRbMF0gKTsKKwkJQ0hFQ0soIDEsIGZyZWVkWzFdICk7CisJCUNIRUNLKCAwLCBmcmVlZFsyXSApOworCQlDSEVDSyggMSwgZnJlZWRbM10gKTsKKwkJQ0hFQ0soIDEsIGZyZWVkWzRdICk7CisJCUNIRUNLKCAxLCBmcmVlZFs1XSApOworCQlDSEVDSyggMSwgdGVzdHB0ciA9PSBnX29wYXF1ZSA/IDEgOiAwICk7CisJCQorCQkjaWYgMQorCQlmZF9sb2dfZGVidWcoIiVzIiwgZmRfc2Vzc19kdW1wKEZEX0RVTVBfVEVTVF9QQVJBTVMsIHNlc3MxLCAxKSk7CisJCWZkX2xvZ19kZWJ1ZygiJXMiLCBmZF9zZXNzX2R1bXAoRkRfRFVNUF9URVNUX1BBUkFNUywgc2VzczIsIDEpKTsKKwkJI2VuZGlmCisJCQorCQkvKiBDcmVhdGUgYWdhaW4gc2Vzc2lvbiAzLCBjaGVjayB0aGF0IG5vIGRhdGEgaXMgYXNzb2NpYXRlZCB0byBpdCAqLworCQlDSEVDSyggMCwgZmRfc2Vzc19mcm9tc2lkKCBzdHIyLCBzdHIxbGVuLCAmc2VzczMsICZuZXcgKSApOworCQlDSEVDSyggMSwgbmV3ID8gMSA6IDAgKTsKKwkJQ0hFQ0soIDAsIGZkX3Nlc3Nfc3RhdGVfcmV0cmlldmUoIGhkbDEsIHNlc3MzLCAmdG1zICkgKTsKKwkJQ0hFQ0soIE5VTEwsIHRtcyApOworCQlDSEVDSyggMCwgZmRfc2Vzc19kZXN0cm95KCAmc2VzczMgKSApOworCQlmcmVlKHN0cjIpOworCQkKKwkJLyogVGltZW91dCBkb2VzIGNhbGwgY2xlYW51cHMgKi8KKwkJQ0hFQ0soIDAsIGNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZ0aW1lb3V0KSApOworCQlDSEVDSyggMCwgZmRfc2Vzc19zZXR0aW1lb3V0KCBzZXNzMiwgJnRpbWVvdXQpICk7CisJCSNpZiAxCisJCWZkX2xvZ19kZWJ1ZygiJXMiLCBmZF9zZXNzX2R1bXAoRkRfRFVNUF9URVNUX1BBUkFNUywgc2VzczEsIDEpKTsKKwkJZmRfbG9nX2RlYnVnKCIlcyIsIGZkX3Nlc3NfZHVtcChGRF9EVU1QX1RFU1RfUEFSQU1TLCBzZXNzMiwgMSkpOworCQkjZW5kaWYKKwkJdGltZW91dC50dl9zZWMgPSAwOworCQl0aW1lb3V0LnR2X25zZWM9IDUwMDAwMDAwOyAvKiA1MCBtcyAqLworCQlDSEVDSyggMCwgbmFub3NsZWVwKCZ0aW1lb3V0LCBOVUxMKSApOworCQlDSEVDSyggMCwgZnJlZWRbMF0gKTsKKwkJQ0hFQ0soIDEsIGZyZWVkWzFdICk7CisJCUNIRUNLKCAxLCBmcmVlZFsyXSApOworCQlDSEVDSyggMSwgZnJlZWRbM10gKTsKKwkJQ0hFQ0soIDEsIGZyZWVkWzRdICk7CisJCUNIRUNLKCAxLCBmcmVlZFs1XSApOworCQkKKwkJLyogQ2hlY2sgdGhlIGxhc3QgZGF0YSBjYW4gc3RpbGwgYmUgcmV0cmlldmVkICovCisJCUNIRUNLKCAwLCBmZF9zZXNzX3N0YXRlX3JldHJpZXZlKCBoZGwxLCBzZXNzMSwgJnRtcyApICk7CisJCUNIRUNLKCAxLCB0bXMgPyAxIDogMCk7CisJCUNIRUNLKCAwLCBmZF9zZXNzX2dldHNpZChzZXNzMSwgJnN0cjEsICZzdHIxbGVuKSApOworCQlteWNsZWFudXAodG1zLCBzdHIxLCBOVUxMKTsKKwl9CisJCisJLyogVE9ETzogYWRkIHRlc3RzIG9uIG1lc3NhZ2VzIHJlZmVyZW5jaW5nIHNlc3Npb25zICovCisJCisJLyogVGhhdCdzIGFsbCBmb3IgdGhlIHRlc3RzIHlldCAqLworCVBBU1NURVNUKCk7Cit9IAorCQo=