ZGlmZiAtLWdpdCBhL0FOTk9VTkNFIGIvQU5OT1VOQ0UKaW5kZXggYTkwZTBkYi4uYjlhMDIyMiAxMDA2NDQKLS0tIGEvQU5OT1VOQ0UKKysrIGIvQU5OT1VOQ0UKQEAgLTEsMTQgKzEsMTQgQEAKLVRoaXMgaXMgcmVsZWFzZSA5NjA1MDYgb2YgV2luZSB0aGUgTVMgV2luZG93cyBlbXVsYXRvci4gIFRoaXMgaXMgc3RpbGwgYQorVGhpcyBpcyByZWxlYXNlIDk2MDUxNiBvZiBXaW5lIHRoZSBNUyBXaW5kb3dzIGVtdWxhdG9yLiAgVGhpcyBpcyBzdGlsbCBhCiBkZXZlbG9wZXIncyBvbmx5IHJlbGVhc2UuICBUaGVyZSBhcmUgbWFueSBidWdzIGFuZCBtYW55IHVuaW1wbGVtZW50ZWQgQVBJCiBmZWF0dXJlcy4gIE1vc3QgYXBwbGljYXRpb25zIHN0aWxsIGRvIG5vdCB3b3JrLgogCiBQYXRjaGVzIHNob3VsZCBiZSBzdWJtaXR0ZWQgdG8gImp1bGxpYXJkQGxyYy5lcGZsLmNoIi4gIFBsZWFzZSBkb24ndAogZm9yZ2V0IHRvIGluY2x1ZGUgYSBDaGFuZ2VMb2cgZW50cnkuCiAKLVdIQVQnUyBORVcgd2l0aCBXaW5lLTk2MDUwNjogKHNlZSBDaGFuZ2VMb2cgZm9yIGRldGFpbHMpCi0JLSBNb3ZlYWJsZSBhbmQgZGlzY2FyZGFibGUgYmxvY2tzIGluIGxvY2FsIGhlYXAuCi0JLSBDb21ib2JveGVzIGltcHJvdmVtZW50cy4KLQktIFdpbmhlbHAgY2xvbmUgdXNpbmcgV2luZWxpYi4KK1dIQVQnUyBORVcgd2l0aCBXaW5lLTk2MDUxNjogKHNlZSBDaGFuZ2VMb2cgZm9yIGRldGFpbHMpCisJLSBUb25zIG9mIFdpbjMyIHN1cHBvcnQuCisJLSBTZXZlcmFsIGxvY2FsIGhlYXAgZml4ZXMuCisJLSBXaW5kb3cgbWFuYWdlbWVudCBpbXByb3ZlbWVudHMuCiAJLSBMb3RzIG9mIGJ1ZyBmaXhlcy4KIAogU2VlIHRoZSBSRUFETUUgZmlsZSBpbiB0aGUgZGlzdHJpYnV0aW9uIGZvciBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zLgpAQCAtMTcsMTAgKzE3LDEwIEBACiB0aGUgcmVsZWFzZSBpcyBhdmFpbGFibGUgYXQgdGhlIGZ0cCBzaXRlcy4gIFRoZSBzb3VyY2VzIHdpbGwgYmUgYXZhaWxhYmxlCiBmcm9tIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOgogCi0gICAgc3Vuc2l0ZS51bmMuZWR1Oi9wdWIvTGludXgvQUxQSEEvd2luZS9kZXZlbG9wbWVudC9XaW5lLTk2MDUwNi50YXIuZ3oKLSAgICB0c3gtMTEubWl0LmVkdTovcHViL2xpbnV4L0FMUEhBL1dpbmUvZGV2ZWxvcG1lbnQvV2luZS05NjA1MDYudGFyLmd6Ci0gICAgZnRwLmluZm9tYWdpYy5jb206L3B1Yi9taXJyb3JzL2xpbnV4L3dpbmUvZGV2ZWxvcG1lbnQvV2luZS05NjA1MDYudGFyLmd6Ci0gICAgYXJpcy5jb206L3B1Yi9saW51eC9BTFBIQS9XaW5lL2RldmVsb3BtZW50L1dpbmUtOTYwNTA2LnRhci5negorICAgIHN1bnNpdGUudW5jLmVkdTovcHViL0xpbnV4L0FMUEhBL3dpbmUvZGV2ZWxvcG1lbnQvV2luZS05NjA1MTYudGFyLmd6CisgICAgdHN4LTExLm1pdC5lZHU6L3B1Yi9saW51eC9BTFBIQS9XaW5lL2RldmVsb3BtZW50L1dpbmUtOTYwNTE2LnRhci5negorICAgIGZ0cC5pbmZvbWFnaWMuY29tOi9wdWIvbWlycm9ycy9saW51eC93aW5lL2RldmVsb3BtZW50L1dpbmUtOTYwNTE2LnRhci5negorICAgIGFyaXMuY29tOi9wdWIvbGludXgvQUxQSEEvV2luZS9kZXZlbG9wbWVudC9XaW5lLTk2MDUxNi50YXIuZ3oKIAogSXQgc2hvdWxkIGFsc28gYmUgYXZhaWxhYmxlIGZyb20gYW55IHNpdGUgdGhhdCBtaXJyb3JzIHRzeC0xMSBvciBzdW5zaXRlLgogCmRpZmYgLS1naXQgYS9DaGFuZ2VMb2cgYi9DaGFuZ2VMb2cKaW5kZXggZThiMDZlYS4uMjM3ZDMxOSAxMDA2NDQKLS0tIGEvQ2hhbmdlTG9nCisrKyBiL0NoYW5nZUxvZwpAQCAtMSw0ICsxLDEyMyBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGh1IE1heSAxNiAxMzozNTozMSAxOTk2ICBBbGV4YW5kcmUgSnVsbGlhcmQgIDxqdWxsaWFyZEBscmMuZXBmbC5jaD4KKworCSogWyovKi5jXQorCVJlbmFtZWQgUkVDVCwgUE9JTlQgYW5kIFNJWkUgc3RydWN0dXJlcyB0byBSRUNUMTYsIFBPSU5UMTYgYW5kCisJU0laRTE2LiBJbXBsZW1lbnRlZCBXaW4zMiB2ZXJzaW9uIG9mIG1vc3QgZnVuY3Rpb25zIHRoYXQgdGFrZQorCXRoZXNlIHR5cGVzIGFzIHBhcmFtZXRlcnMuCisKKwkqIFtjb25maWd1cmVdCisJUGF0Y2hlZCBhdXRvY29uZiB0byBhdHRlbXB0IHRvIGNvcnJlY3RseSBkZXRlY3QgLWxuc2wgYW5kCisJLWxzb2NrZXQuIFBsZWFzZSBjaGVjayB0aGlzIG91dC4KKwkKKwkqIFtjb250cm9scy9idXR0b24uY10KKwlBZGRlZCBzdXBwb3J0IGZvciBXaW4zMiBCTV8qIG1lc3NhZ2VzLgorCisJKiBbY29udHJvbHMvbWVudS5jXQorCUF2b2lkIHNlbmRpbmcgZXh0cmEgV01fTUVOVVNFTEVDVCBtZXNzYWdlcy4gVGhpcyBhdm9pZHMgY3Jhc2hlcworCXdpdGggRXhjZWwuCisKKwkqIFttZW1vcnkuaGVhcC5jXSBbaW5jbHVkZS9oZWFwLmhdCisJQWRkZWQgc3VwcG9ydCBmb3IgU0VHUFRScyBpbiBXaW4zMiBoZWFwcy4gQWRkZWQgYSBmZXcgbWFjcm9zIHRvCisgCW1ha2UgdXNpbmcgU0VHUFRScyBlYXNpZXIuIFRoZXkgYXJlIGEgYml0IHNsb3dlciB0aGFuIE1BS0VfU0VHUFRSLAorIAlidXQgdGhleSB3b3JrIHdpdGggV2luMzIuCisKKwkqIFttZW1vcnkvYXRvbS5jXQorCUltcGxlbWVudGVkIFdpbjMyIGF0b20gZnVuY3Rpb25zLgorCisJKiBbbWVtb3J5L2xvY2FsLmNdCisJRml4ZWQgTG9jYWxSZUFsbG9jKCkgY2hhbmdlcyB0byBhdm9pZCBjb3B5aW5nIHRoZSB3aG9sZSBibG9jayB0d2ljZS4KKworCSogW3dpbjMyL21lbW9yeS5jXQorCVVzZSAvZGV2L3plcm8gaW5zdGVhZCBvZiBNQVBfQU5PTiBmb3IgVmlydHVhbEFsbG9jKCkuCisKKwkqIFt3aW5kb3dzL2NsYXNzLmNdCisJUHJvcGVybHkgaW1wbGVtZW50ZWQgdGhlIFdpbjMyIGNsYXNzIGZ1bmN0aW9ucy4KKworCSogW3dpbmRvd3Mvd2lucHJvYy5jXSAoTmV3IGZpbGUpCisJTmV3IGZpbGUgaGFuZGxpbmcgdGhlIG1lc3NhZ2UgdHJhbnNsYXRpb24gYmV0d2VlbiBXaW4xNiBhbmQgV2luMzIuCisKK01vbiBNYXkgMTMgMTg6MDA6MDAgMTk5NiBBbGV4IEtvcm9ia2EgPGFsZXhAcGhtMzAucGhhcm0uc3VueXNiLmVkdT4KKworCSogW3dpbmRvd3MvbWRpLmNdIFt3aW5kb3dzL21lbnUuY10KKwlJbXByb3ZlZCBXTV9NRElDUkVBVEUgYW5kIFdNX01ESUNBU0NBREUgaGFuZGxpbmcuCisKKwkqIFt3aW5kb3dzL2V2ZW50LmNdIFtvYmplY3RzL2JpdGJsdC5jXQorCUhhbmRsZSBHcmFwaGljc0V4cG9zZSBldmVudCBmb3IgQml0Qmx0IGZyb20gc2NyZWVuIHRvIHNjcmVlbi4KKworCSogW3dpbmRvd3MvZXZlbnQuY10gW3dpbmRvd3Mvd2luLmNdIFt3aW5kb3dzL25vbmNsaWVudC5jXQorCUJ1bmNoIG9mIGZpeGVzIGZvciBwcm9ibGVtcyB3aXRoIC1tYW5hZ2VkLgorCisJKiBbd2luZG93cy93aW4uY10gW3dpbmRvd3Mvd2lucG9zLmNdCisJQ2hhbmdlZCBjb25kaXRpb25zIGZvciBXTV9TSVpFLCBXTV9NT1ZFLCBhbmQgV01fR0VUTUlOTUFYSU5GTworCWluIENyZWF0ZVdpbmRvdy4KKworCSogW3dpbmRvd3Mvd2luLmNdIFt3aW5kb3dzL3F1ZXVlLmNdIFttaXNjL3VzZXIuY10KKwlEbyBub3Qgc2VuZCBXTV9QQVJFTlROT1RJRlkgd2hlbiBpbiBBcHBFeGl0IGFuZCBjYWxsIFdIX1NIRUxMCisJb24gd2luZG93IGNyZWF0aW9uL2Rlc3RydWN0aW9uLgorCisJKiBbb2JqZWN0cy9wYWxldHRlLmNdCisJQ3J1ZGUgUmVhbGl6ZVBhbGV0dGUoKS4gQXQgbGVhc3Qgc29tZXRoaW5nIGlzIHZpc2libGUgaW4gTHZpZXdQcm8uCisKK1N1biBNYXkgMTIgMDI6MDU6MDAgMTk5NiAgVGhvbWFzIFNhbmRmb3JkIDx0LmQuZy5zYW5kZm9yZEBwcmRzLWdybi5kZW1vbi5jby51az4KKworCSogW2lmMTYzMi9nZGkzMi5zcGVjXQorCUFkZGVkIFJlY3RhbmdsZSAodXNlIHdpbjE2IHZlcnNpb24pLgorCisJKiBbaWYxNjMyL2tlcm5lbDMyLnNwZWNdCisJQWRkZWQgR2V0V2luZG93c0RpcmVjdG9yeUEgKHVzZSB3aW4xNiBHZXRXaW5kb3dzRGlyZWN0b3J5KS4KKworCSogW2lmMTYzMi91c2VyMzIuc3BlY10KKwlBZGRlZCBHZXRTdWJNZW51LCBNb3ZlV2luZG93LCBTZXRTY3JvbGxQb3MsIFNldFNjcm9sbFJhbmdlICh1c2Ugd2luMTYKKwl2ZXJzaW9ucykuCisJQWRkZWQgU2V0V2luZG93c0hvb2tFeEEgKGVtcHR5IHN0dWIgZm9yIG5vdykuCisKKwkqIFtpbmNsdWRlL2hhbmRsZTMyLmhdCisJQ2hhbmdlZCAjaW5jbHVkZSA8bWFsbG9jLmg+IHRvICNpbmNsdWRlIDxzdGRsaWIuaD4gdG8gcHJldmVudAorCWhhdGUgbWVzc2FnZSBmcm9tIEZyZWVCU0QgY29tcGlsZXIuCisKKwkqIFt3aW4zMi9uZXdmbnMuY10KKwlBZGRlZCBuZXcgZnVuY3Rpb24gU2V0V2luZG93c0hvb2tFeDMyQSAoZW1wdHkgc3R1YiBmb3Igbm93KS4KKworCSogW3dpbjMyL3VzZXIzMi5jXQorCVJlbW92ZWQgcmVkdW5kYW50IGRlYnVnZ2luZyBwcmludGYgc3RhdGVtZW50LgorCitTdW4gTWF5IDEyIDAxOjI0OjU3IDE5OTYgIEh1dyBELiBNLiBEYXZpZXMgPGguZGF2aWVzMUBwaHlzaWNzLm94Zm9yZC5hYy51az4KKworCSogW21lbW9yeS9sb2NhbC5jXQorCUF2b2lkIGNyZWF0aW5nIGFkamFjZW50IGZyZWUgYmxvY2tzLgorCUZyZWUgdGhlIGJsb2NrIGluIExvY2FsUmVBbGxvYygpIGJlZm9yZSBhbGxvY2F0aW5nIGEgbmV3IG9uZS4KKwlGaXhlZCBMb2NhbFJlQWxsb2MoKSBmb3IgZGlzY2FyZGVkIGJsb2Nrcy4KKwkKK0ZyaSBNYXkgMTAgMjM6MDU6MTIgMTk5NiAgSnVra2EgSWl2b25lbiA8aWl2b25lbkBjYy5oZWxzaW5raS5maT4KKworCSogW3Jlc291cmNlcy9zeXNyZXNfRmkucmNdCisJQ2hvb3NlRm9udCBhbmQgQ2hvb3NlQ29sb3IgZGlhbG9ncyB1cGRhdGVkLgorCitGcmkgTWF5IDEwIDE3OjE5OjMzIDE5OTYgIE1hcmN1cyBNZWlzc25lciA8bXNtZWlzc25AY2lwLmluZm9ybWF0aWsudW5pLWVybGFuZ2VuLmRlPgorCisJKiBbZmlsZXMvZHJpdmUuYyxpZjE2MzIva2VybmVsLnNwZWNdCisJR2V0Q3VycmVudERpcmVjdG9yeSgpLFNldEN1cnJlbnREaXJlY3RvcnkoKSBpbXBsZW1lbnRlZC4KKworCSogW2lmMTYzMi9hZHZhcGkzMi5zcGVjXSBbaWYxNjMyL2tlcm5lbC5zcGVjXSBbaWYxNjMyL3NoZWxsLnNwZWNdCisJICBbaW5jbHVkZS93aW5kb3dzLmhdIFtpbmNsdWRlL3dpbnJlZy5oXSBbbG9hZGVyL21haW4uY10KKwkgIFttaXNjL21haW4uY10gW21pc2Mvc2hlbGwuY10gW21pc2MvcmVnaXN0cnkuY10KKwlSZWdpc3RyeSBmaXhlczoKKwktIGxvYWRzIHdpbjk1IHJlZ2lzdHJ5IGRhdGFiYXNlcywKKwktIHNhdmUgb25seSB1cGRhdGVkIGtleXMgb24gZGVmYXVsdCwKKwktIG5vdyBhZGhlcnMgdG8gdGhlIG5ldyBmdW5jdGlvbiBuYW1pbmcgc3RhbmRhcmQsCisJLSBtaW5vciBjbGVhbnVwcy4KKworVHVlIE1heSA3IDIyOjM2OjEzIDE5OTYgIEFsYnJlY2h0IEtsZWluZSAgPGtsZWluZUBhay5zYXguZGU+CisKKwkqIFtjb21iby5jXQorCUFkZGVkIFdNX0NPTU1BTkQtaGFuZGxpbmcgZm9yIGludGVyYWN0aW9uIGJldHdlZW4gRURJVCBhbmQgQ09NQk9MQk9YCisgICAgICAgIGFuZCBzeW5jaHJvbml6ZWQgbWluZSB3aXRoIEdyZWcgS3JlaWRlcidzIHdvcmtzLgorCisJKiBbY29tbWRsZy5jXQorCUJ1Z2ZpeCBpbiBDaG9vc2VGb250OiBmb250IHNpemUgaGFuZGxpbmcuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIE1vbiBNYXkgIDYgMTI6NTY6MjYgMTk5NiAgQWxleGFuZHJlIEp1bGxpYXJkICA8anVsbGlhcmRAbHJjLmVwZmwuY2g+CiAKIAkqIFtERVZFTE9QRVJTLUhJTlRTXQpkaWZmIC0tZ2l0IGEvUkVBRE1FIGIvUkVBRE1FCmluZGV4IDEzNWNmM2MuLjVkZDdiYTcgMTAwNjQ0Ci0tLSBhL1JFQURNRQorKysgYi9SRUFETUUKQEAgLTI1LDYgKzI1LDExIEBACiBUaGUgZXhlY3V0YWJsZSAid2luZSIgd2lsbCBiZSBidWlsdC4gICJ3aW5lIiB3aWxsIGxvYWQgYW5kIHJ1biAxNi1iaXQKIFdpbmRvd3MgZXhlY3V0YWJsZXMuCiAKK1RvIGJ1aWxkIFdpbmVsaWIsIGRvIGEgIi4vY29uZmlndXJlIC0td2l0aC1saWJyYXJ5IiwgYW5kIHRoZW4gYSAibWFrZQorZGVwZW5kOyBtYWtlIi4gVGhlIGxpYnJhcnkgIndpbmVsaWIuYSIgd2lsbCBiZSBidWlsdCwgYWxsb3dpbmcgdG8KK2NvbXBpbGUgV2luZG93cyBzb3VyY2UgY29kZSB1bmRlciBVbml4LiBJZiB5b3UgaGF2ZSBhbiBFTEYgY29tcGlsZXIsCit5b3UgY2FuIHVzZSAiLi9jb25maWd1cmUgLS13aXRoLWRsbCIgaW5zdGVhZCB0byBidWlsZCBhIHNoYXJlZCBsaWJyYXJ5LgorCiBUbyB1cGdyYWRlIHRvIGEgbmV3IHJlbGVhc2UgYnkgdXNpbmcgYSBwYXRjaCBmaWxlLCBmaXJzdCBjZCB0byB0aGUKIHRvcC1sZXZlbCBkaXJlY3Rvcnkgb2YgdGhlIHJlbGVhc2UgKHRoZSBvbmUgY29udGFpbmluZyB0aGlzIFJFQURNRQogZmlsZSkuIFRoZW4gZG8gYSAibWFrZSBjbGVhbiIsIGFuZCBwYXRjaCB0aGUgcmVsZWFzZSB3aXRoOgpkaWZmIC0tZ2l0IGEvY29uZmlndXJlIGIvY29uZmlndXJlCmluZGV4IDY5NjcwOTMuLjcyYjMxNDMgMTAwNzU1Ci0tLSBhL2NvbmZpZ3VyZQorKysgYi9jb25maWd1cmUKQEAgLTIsNyArMiw3IEBACiAKICMgRnJvbSBjb25maWd1cmUuaW4gY29uZmlndXJlLmluIDEuMDAKICMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgdXNpbmcgYXV0b2NvbmYgdmVyc2lvbiAyLjkgCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IHVzaW5nIGF1dG9jb25mIHZlcnNpb24gMi4xMC1wYXRjaGVkIAogIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgogIwogIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgpAQCAtMzQxLDcgKzM0MSw3IEBACiAgICAgdmVyYm9zZT15ZXMgOzsKIAogICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycykKLSAgICBlY2hvICJjb25maWd1cmUgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi45IgorICAgIGVjaG8gImNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEwLXBhdGNoZWQiCiAgICAgZXhpdCAwIDs7CiAKICAgLXdpdGgtKiB8IC0td2l0aC0qKQpAQCAtMTA4MCw3ICsxMDgwLDcgQEAKICAgIyBsaWJyYXJpZXMgd2UgY2hlY2sgZm9yIGJlbG93LCBzbyB1c2UgYSBkaWZmZXJlbnQgdmFyaWFibGUuCiAgICMgIC0taW50ZXJyYW5AdWx1cnUuU3RhbmZvcmQuRURVLCBrYkBjcy51bWIuZWR1LgogICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgLWxJQ0UiIi4uLiAkYWNfYyIgMT4mNgotYWNfbGliX3Zhcj1gZWNobyBJQ0VfSWNlQ29ubmVjdGlvbk51bWJlciB8IHRyICcuLS8rJyAnX19fcCdgCithY19saWJfdmFyPWBlY2hvIElDRSdfJ0ljZUNvbm5lY3Rpb25OdW1iZXIgfCB0ciAnLi8rXDA1NScgJ19fcF8nYAogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC0xMDkwLDYgKzEwOTAsOCBAQAogI2xpbmUgMTA5MSAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCiBjaGFyIEljZUNvbm5lY3Rpb25OdW1iZXIoKTsKIAogaW50IG1haW4oKSB7IHJldHVybiAwOyB9CkBAIC0xMDk3LDcgKzEwOTksNyBAQAogSWNlQ29ubmVjdGlvbk51bWJlcigpCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTEwMTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTAzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKIGVsc2UKQEAgLTExMjYsMTYgKzExMjgsMTggQEAKICAgICAjIGxpYnJhcmllcyB3ZXJlIGJ1aWx0IHdpdGggREVDbmV0IHN1cHBvcnQuICBBbmQga2FybEBjcy51bWIuZWR1IHNheXMKICAgICAjIHRoZSBBbHBoYSBuZWVkcyBkbmV0X3N0dWIgKGRuZXQgZG9lcyBub3QgZXhpc3QpLgogICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAtbGRuZXQiIi4uLiAkYWNfYyIgMT4mNgotYWNfbGliX3Zhcj1gZWNobyBkbmV0X2RuZXRfbnRvYSB8IHRyICcuLS8rJyAnX19fcCdgCithY19saWJfdmFyPWBlY2hvIGRuZXQnXydkbmV0X250b2EgfCB0ciAnLi8rXDA1NScgJ19fcF8nYAogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGFjX3NhdmVfTElCUz0iJExJQlMiCiBMSUJTPSItbGRuZXQgICRMSUJTIgogY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTEzNyAiY29uZmlndXJlIgorI2xpbmUgMTEzOSAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCiBjaGFyIGRuZXRfbnRvYSgpOwogCiBpbnQgbWFpbigpIHsgcmV0dXJuIDA7IH0KQEAgLTExNDMsNyArMTE0Nyw3IEBACiBkbmV0X250b2EoKQogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExNDc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH07IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTE1MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfTsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCiBlbHNlCkBAIC0xMTYzLDE2ICsxMTY3LDE4IEBACiAKICAgICBpZiB0ZXN0ICRhY19jdl9saWJfZG5ldF9kbmV0X250b2EgPSBubzsgdGhlbgogICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIC1sZG5ldF9zdHViIiIuLi4gJGFjX2MiIDE+JjYKLWFjX2xpYl92YXI9YGVjaG8gZG5ldF9zdHViX2RuZXRfbnRvYSB8IHRyICcuLS8rJyAnX19fcCdgCithY19saWJfdmFyPWBlY2hvIGRuZXRfc3R1YidfJ2RuZXRfbnRvYSB8IHRyICcuLytcMDU1JyAnX19wXydgCiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKIExJQlM9Ii1sZG5ldF9zdHViICAkTElCUyIKIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDExNzQgImNvbmZpZ3VyZSIKKyNsaW5lIDExNzggImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwogY2hhciBkbmV0X250b2EoKTsKIAogaW50IG1haW4oKSB7IHJldHVybiAwOyB9CkBAIC0xMTgwLDcgKzExODYsNyBAQAogZG5ldF9udG9hKCkKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTg0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExOTA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH07IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgogZWxzZQpAQCAtMTIwNSwxNiArMTIxMSwxOCBAQAogICAgICMgTm90IHN1cmUgd2hpY2ggZmxhdm9yIG9mIDM4NiBVTklYIHRoaXMgaXMsIGJ1dCBpdCBzZWVtcyBoYXJtbGVzcyB0bwogICAgICMgY2hlY2sgZm9yIGl0LgogICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAtbG5zbCIiLi4uICRhY19jIiAxPiY2Ci1hY19saWJfdmFyPWBlY2hvIG5zbF90X2FjY2VwdCB8IHRyICcuLS8rJyAnX19fcCdgCithY19saWJfdmFyPWBlY2hvIG5zbCdfJ3RfYWNjZXB0IHwgdHIgJy4vK1wwNTUnICdfX3BfJ2AKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBhY19zYXZlX0xJQlM9IiRMSUJTIgogTElCUz0iLWxuc2wgICRMSUJTIgogY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTIxNiAiY29uZmlndXJlIgorI2xpbmUgMTIyMiAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCiBjaGFyIHRfYWNjZXB0KCk7CiAKIGludCBtYWluKCkgeyByZXR1cm4gMDsgfQpAQCAtMTIyMiw3ICsxMjMwLDcgQEAKIHRfYWNjZXB0KCkKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjI2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEyMzQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH07IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgogZWxzZQpAQCAtMTI0NSwxNyArMTI1MywyMCBAQAogICAgICMgc29ja2V0L3NldHNvY2tvcHQgYW5kIG90aGVyIHJvdXRpbmVzIGFyZSB1bmRlZmluZWQgdW5kZXIgU0NPIE9EVCAyLjAuCiAgICAgIyBCdXQgLWxzb2NrZXQgaXMgYnJva2VuIG9uIElSSVgsIGFjY29yZGluZyB0byBzaW1vbkBsaWEuZGkuZXBmbC5jaC4KICAgICBpZiB0ZXN0ICJgKHVuYW1lKSAyPi9kZXYvbnVsbGAiICE9IElSSVg7IHRoZW4KLSAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAtbHNvY2tldCIiLi4uICRhY19jIiAxPiY2Ci1hY19saWJfdmFyPWBlY2hvIHNvY2tldF9zb2NrZXQgfCB0ciAnLi0vKycgJ19fX3AnYAorICAgICAgaWYgdGVzdCAkYWNfY3ZfbGliX25zbF90X2FjY2VwdCA9IG5vOyB0aGVuCisgICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAtbHNvY2tldCIiLi4uICRhY19jIiAxPiY2CithY19saWJfdmFyPWBlY2hvIHNvY2tldCdfJ3NvY2tldCB8IHRyICcuLytcMDU1JyAnX19wXydgCiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKIExJQlM9Ii1sc29ja2V0ICAkTElCUyIKIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEyNTcgImNvbmZpZ3VyZSIKKyNsaW5lIDEyNjYgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwogY2hhciBzb2NrZXQoKTsKIAogaW50IG1haW4oKSB7IHJldHVybiAwOyB9CkBAIC0xMjYzLDcgKzEyNzQsNyBAQAogc29ja2V0KCkKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjY3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEyNzg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH07IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgogZWxzZQpAQCAtMTI4MSw2ICsxMjkyLDQ3IEBACiAgIGVjaG8gIiRhY190IiJubyIgMT4mNgogZmkKIAorICAgICAgZWxzZQorICAgICAgICAjIElmIHdlIGZvdW5kIC1sbnNsLCB1c2UgaXQgdG8gY2hlY2sgZm9yIC1sc29ja2V0LiAtLSBBSgorICAgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgLWxzb2NrZXQiIi4uLiAkYWNfYyIgMT4mNgorYWNfbGliX3Zhcj1gZWNobyBzb2NrZXQnXydzb2NrZXQgfCB0ciAnLi8rXDA1NScgJ19fcF8nYAoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGFjX3NhdmVfTElCUz0iJExJQlMiCitMSUJTPSItbHNvY2tldCAtbG5zbCAkTElCUyIKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEzMDYgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciBzb2NrZXQoKTsKKworaW50IG1haW4oKSB7IHJldHVybiAwOyB9CitpbnQgdCgpIHsKK3NvY2tldCgpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTMxODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorTElCUz0iJGFjX3NhdmVfTElCUyIKKworZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgWF9FWFRSQV9MSUJTPSIkWF9FWFRSQV9MSUJTIC1sc29ja2V0IgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgICAgIGZpCiAgICAgZmkKICAgZmkKIGZpCkBAIC0xMzUzLDE2ICsxNDA1LDE4IEBACiAgICopIGFjX2xpYj1sIDs7CiAgIGVzYWMKICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIC1sJGFjX2xpYiIiLi4uICRhY19jIiAxPiY2Ci1hY19saWJfdmFyPWBlY2hvICRhY19saWJfeXl3cmFwIHwgdHIgJy4tLysnICdfX19wJ2AKK2FjX2xpYl92YXI9YGVjaG8gJGFjX2xpYidfJ3l5d3JhcCB8IHRyICcuLytcMDU1JyAnX19wXydgCiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKIExJQlM9Ii1sJGFjX2xpYiAgJExJQlMiCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMzY0ICJjb25maWd1cmUiCisjbGluZSAxNDE2ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KIGNoYXIgeXl3cmFwKCk7CiAKIGludCBtYWluKCkgeyByZXR1cm4gMDsgfQpAQCAtMTM3MCw3ICsxNDI0LDcgQEAKIHl5d3JhcCgpCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTM3NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDI4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKIGVsc2UKQEAgLTE0NzgsMTYgKzE1MzIsMTggQEAKIHRlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCiAKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAtbGkzODYiIi4uLiAkYWNfYyIgMT4mNgotYWNfbGliX3Zhcj1gZWNobyBpMzg2X2kzODZfc2V0X2xkdCB8IHRyICcuLS8rJyAnX19fcCdgCithY19saWJfdmFyPWBlY2hvIGkzODYnXydpMzg2X3NldF9sZHQgfCB0ciAnLi8rXDA1NScgJ19fcF8nYAogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGFjX3NhdmVfTElCUz0iJExJQlMiCiBMSUJTPSItbGkzODYgICRMSUJTIgogY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTQ4OSAiY29uZmlndXJlIgorI2xpbmUgMTU0MyAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCiBjaGFyIGkzODZfc2V0X2xkdCgpOwogCiBpbnQgbWFpbigpIHsgcmV0dXJuIDA7IH0KQEAgLTE0OTUsNyArMTU1MSw3IEBACiBpMzg2X3NldF9sZHQoKQogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE0OTk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH07IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTU1NTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfTsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCiBlbHNlCkBAIC0xNTI3LDExICsxNTgzLDExIEBACiAgIGFjX2N2X2NfY3Jvc3M9eWVzCiBlbHNlCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNTMxICJjb25maWd1cmUiCisjbGluZSAxNTg3ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIG1haW4oKXtyZXR1cm4oMCk7fQogRU9GCi17IChldmFsIGVjaG8gY29uZmlndXJlOjE1MzU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0KK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MTU5MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfQogaWYgdGVzdCAtcyBjb25mdGVzdCAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KICAgYWNfY3ZfY19jcm9zcz1ubwogZWxzZQpAQCAtMTU1Miw3ICsxNjA4LDcgQEAKICAgYWNfY3ZfY19nY2Nfc3RyZW5ndGhfYnVnPSJ5ZXMiCiBlbHNlCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNTU2ICJjb25maWd1cmUiCisjbGluZSAxNjEyICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIAogaW50IG1haW4odm9pZCkgewpAQCAtMTU2Myw3ICsxNjE5LDcgQEAKICAgZXhpdCggQXJyYXlbMV0gIT0gLTIgKTsKIH0KIEVPRgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTY3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9Cit7IChldmFsIGVjaG8gY29uZmlndXJlOjE2MjM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0KIGlmIHRlc3QgLXMgY29uZnRlc3QgJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCiAgIGFjX2N2X2NfZ2NjX3N0cmVuZ3RoX2J1Zz0ibm8iCiBlbHNlCkBAIC0xNTg4LDEyICsxNjQ0LDE0IEBACiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE1OTIgImNvbmZpZ3VyZSIKKyNsaW5lIDE2NDggImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAogICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwogI2luY2x1ZGUgPGFzc2VydC5oPgogLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwogY2hhciAkYWNfZnVuYygpOwogCiBpbnQgbWFpbigpIHsgcmV0dXJuIDA7IH0KQEAgLTE2MTAsNyArMTY2OCw3IEBACiAKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNjE0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2NzI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH07IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKIGVsc2UKQEAgLTE2NDAsMTIgKzE2OTgsMTIgQEAKICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTY0NCAiY29uZmlndXJlIgorI2xpbmUgMTcwMiAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8JGFjX2hkcj4KIEVPRgogYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MTY0OTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MTcwNzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KIGFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0YAogaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgpAQCAtMTY3NCw3ICsxNzMyLDcgQEAKICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTY3OCAiY29uZmlndXJlIgorI2xpbmUgMTczNiAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KQEAgLTE3MjksNyArMTc4Nyw3IEBACiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE3MzMgImNvbmZpZ3VyZSIKKyNsaW5lIDE3OTEgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogCiBpbnQgbWFpbigpIHsgcmV0dXJuIDA7IH0KQEAgLTE3NzksNyArMTgzNyw3IEBACiAKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNzgzOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE4NDE6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBhY19jdl9jX2NvbnN0PXllcwogZWxzZQpAQCAtMTgwMyw3ICsxODYxLDcgQEAKICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTgwNyAiY29uZmlndXJlIgorI2xpbmUgMTg2NSAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RkYXJnLmg+CkBAIC0xODExLDcgKzE4NjksNyBAQAogI2luY2x1ZGUgPGZsb2F0Lmg+CiBFT0YKIGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjE4MTU6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Cit7IChldmFsIGVjaG8gY29uZmlndXJlOjE4NzM6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CiBhY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dGAKIGlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKQEAgLTE4MjYsNyArMTg4NCw3IEBACiBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgogICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxODMwICJjb25maWd1cmUiCisjbGluZSAxODg4ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDxzdHJpbmcuaD4KIEVPRgpAQCAtMTg0NCw3ICsxOTAyLDcgQEAKIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCiAgICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE4NDggImNvbmZpZ3VyZSIKKyNsaW5lIDE5MDYgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogRU9GCkBAIC0xODY1LDcgKzE5MjMsNyBAQAogICA6CiBlbHNlCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxODY5ICJjb25maWd1cmUiCisjbGluZSAxOTI3ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDxjdHlwZS5oPgogI2RlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCkBAIC0xODc2LDcgKzE5MzQsNyBAQAogZXhpdCAoMCk7IH0KIAogRU9GCi17IChldmFsIGVjaG8gY29uZmlndXJlOjE4ODA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0KK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MTkzODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfQogaWYgdGVzdCAtcyBjb25mdGVzdCAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KICAgOgogZWxzZQpAQCAtMTkwMCw3ICsxOTU4LDcgQEAKICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTkwNCAiY29uZmlndXJlIgorI2xpbmUgMTk2MiAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaWYgU1REQ19IRUFERVJTCkBAIC0yMDE5LDcgKzIwNzcsNyBAQAogICAgIGVjaG8gInJ1bm5pbmcgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIKICAgICBleGVjIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24gOzsKICAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYpCi0gICAgZWNobyAiJENPTkZJR19TVEFUVVMgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi45IgorICAgIGVjaG8gIiRDT05GSUdfU1RBVFVTIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTAtcGF0Y2hlZCIKICAgICBleGl0IDAgOzsKICAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtLWgpCiAgICAgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMCA7OwpkaWZmIC0tZ2l0IGEvY29udHJvbHMvYnV0dG9uLmMgYi9jb250cm9scy9idXR0b24uYwppbmRleCBmNWU3ZWZmLi42MDU1OGVjIDEwMDY0NAotLS0gYS9jb250cm9scy9idXR0b24uYworKysgYi9jb250cm9scy9idXR0b24uYwpAQCAtMTAsNyArMTAsNyBAQAogI2luY2x1ZGUgInN5c2NvbG9yLmgiCiAjaW5jbHVkZSAiZ3JhcGhpY3MuaCIKICNpbmNsdWRlICJidXR0b24uaCIKLSNpbmNsdWRlICJzdGFja2ZyYW1lLmgiCisjaW5jbHVkZSAiaGVhcC5oIgogCiBleHRlcm4gdm9pZCBERUZXTkRfU2V0VGV4dCggV05EICp3bmRQdHIsIExQU1RSIHRleHQgKTsgIC8qIHdpbmRvd3MvZGVmd25kLmMgKi8KIApAQCAtODAsOCArODAsNyBAQAogCiBMUkVTVUxUIEJ1dHRvblduZFByb2MoSFdORCBoV25kLCBVSU5UIHVNc2csIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7Ci0gICAgICAgIFJFQ1QgcmVjdDsKLSAgICAgICAgUE9JTlQgcHQ7CisgICAgICAgIFJFQ1QxNiByZWN0OwogCUxPTkcgbFJlc3VsdCA9IDA7CiAJV05EICp3bmRQdHIgPSBXSU5fRmluZFduZFB0cihoV25kKTsKIAlMT05HIHN0eWxlID0gd25kUHRyLT5kd1N0eWxlICYgMHgwMDAwMDAwRjsKQEAgLTEzMiwxNSArMTMxLDE1IEBACiAJY2FzZSBXTV9QQUlOVDoKICAgICAgICAgICAgICAgICBpZiAoYnRuUGFpbnRGdW5jW3N0eWxlXSkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFBBSU5UU1RSVUNUIHBzOwotICAgICAgICAgICAgICAgICAgICBIREMgaGRjID0gQmVnaW5QYWludCggaFduZCwgJnBzICk7CisgICAgICAgICAgICAgICAgICAgIFBBSU5UU1RSVUNUMTYgcHM7CisgICAgICAgICAgICAgICAgICAgIEhEQyBoZGMgPSBCZWdpblBhaW50MTYoIGhXbmQsICZwcyApOwogICAgICAgICAgICAgICAgICAgICAoYnRuUGFpbnRGdW5jW3N0eWxlXSkoIHduZFB0ciwgaGRjLCBPREFfRFJBV0VOVElSRSApOwotICAgICAgICAgICAgICAgICAgICBSZWxlYXNlREMoIGhXbmQsIGhkYyApOworICAgICAgICAgICAgICAgICAgICBFbmRQYWludDE2KCBoV25kLCAmcHMgKTsKICAgICAgICAgICAgICAgICB9CiAJCWJyZWFrOwogCiAJY2FzZSBXTV9MQlVUVE9ORE9XTjoKLSAgICAgICAgICAgICAgICBTZW5kTWVzc2FnZSggaFduZCwgQk1fU0VUU1RBVEUsIFRSVUUsIDAgKTsKKyAgICAgICAgICAgICAgICBTZW5kTWVzc2FnZSggaFduZCwgQk1fU0VUU1RBVEUxNiwgVFJVRSwgMCApOwogICAgICAgICAgICAgICAgIFNldEZvY3VzKCBoV25kICk7CiAgICAgICAgICAgICAgICAgU2V0Q2FwdHVyZSggaFduZCApOwogCQlicmVhazsKQEAgLTE0OCwyMyArMTQ3LDIxIEBACiAJY2FzZSBXTV9MQlVUVE9OVVA6CiAJICAgICAgICBSZWxlYXNlQ2FwdHVyZSgpOwogCSAgICAgICAgaWYgKCEoaW5mb1B0ci0+c3RhdGUgJiBCVVRUT05fSElHSExJR0hURUQpKSBicmVhazsKLSAgICAgICAgICAgICAgICBTZW5kTWVzc2FnZSggaFduZCwgQk1fU0VUU1RBVEUsIEZBTFNFLCAwICk7Ci0gICAgICAgICAgICAgICAgR2V0Q2xpZW50UmVjdCggaFduZCwgJnJlY3QgKTsKLSAgICAgICAgICAgICAgICBwdC54ID0gTE9XT1JEKGxQYXJhbSk7Ci0gICAgICAgICAgICAgICAgcHQueSA9IEhJV09SRChsUGFyYW0pOwotICAgICAgICAgICAgICAgIGlmIChQdEluUmVjdCggJnJlY3QsIHB0ICkpCisgICAgICAgICAgICAgICAgU2VuZE1lc3NhZ2UoIGhXbmQsIEJNX1NFVFNUQVRFMTYsIEZBTFNFLCAwICk7CisgICAgICAgICAgICAgICAgR2V0Q2xpZW50UmVjdDE2KCBoV25kLCAmcmVjdCApOworICAgICAgICAgICAgICAgIGlmIChQdEluUmVjdDE2KCAmcmVjdCwgTUFLRVBPSU5UMTYobFBhcmFtKSApKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHN0eWxlKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgQlNfQVVUT0NIRUNLQk9YOgotICAgICAgICAgICAgICAgICAgICAgICAgU2VuZE1lc3NhZ2UoIGhXbmQsIEJNX1NFVENIRUNLLAorICAgICAgICAgICAgICAgICAgICAgICAgU2VuZE1lc3NhZ2UoIGhXbmQsIEJNX1NFVENIRUNLMTYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhKGluZm9QdHItPnN0YXRlICYgQlVUVE9OX0NIRUNLRUQpLCAwICk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBCU19BVVRPUkFESU9CVVRUT046Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZW5kTWVzc2FnZSggaFduZCwgQk1fU0VUQ0hFQ0ssIFRSVUUsIDAgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNlbmRNZXNzYWdlKCBoV25kLCBCTV9TRVRDSEVDSzE2LCBUUlVFLCAwICk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBCU19BVVRPM1NUQVRFOgotICAgICAgICAgICAgICAgICAgICAgICAgU2VuZE1lc3NhZ2UoIGhXbmQsIEJNX1NFVENIRUNLLAorICAgICAgICAgICAgICAgICAgICAgICAgU2VuZE1lc3NhZ2UoIGhXbmQsIEJNX1NFVENIRUNLMTYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGluZm9QdHItPnN0YXRlICYgQlVUVE9OXzNTVEFURSkgPyAwIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGluZm9QdHItPnN0YXRlICYgMykgKyAxKSwgMCApOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xODIsMTIgKzE3OSw5IEBACiAgICAgICAgIGNhc2UgV01fTU9VU0VNT1ZFOgogICAgICAgICAgICAgICAgIGlmIChHZXRDYXB0dXJlKCkgPT0gaFduZCkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEdldENsaWVudFJlY3QoIGhXbmQsICZyZWN0ICk7Ci0gICAgICAgICAgICAgICAgICAgIHB0LnggPSBMT1dPUkQobFBhcmFtKTsKLSAgICAgICAgICAgICAgICAgICAgcHQueSA9IEhJV09SRChsUGFyYW0pOwotICAgICAgICAgICAgICAgICAgICBpZiAoUHRJblJlY3QoICZyZWN0LCBwdCkgKQotICAgICAgICAgICAgICAgICAgICAgICBTZW5kTWVzc2FnZSggaFduZCwgQk1fU0VUU1RBVEUsIFRSVUUsIDAgKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSBTZW5kTWVzc2FnZSggaFduZCwgQk1fU0VUU1RBVEUsIEZBTFNFLCAwICk7CisgICAgICAgICAgICAgICAgICAgIEdldENsaWVudFJlY3QxNiggaFduZCwgJnJlY3QgKTsKKyAgICAgICAgICAgICAgICAgICAgU2VuZE1lc3NhZ2UoaFduZCwgQk1fU0VUU1RBVEUxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRJblJlY3QxNiggJnJlY3QsTUFLRVBPSU5UMTYobFBhcmFtKSApLCAwICk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogCkBAIC0yMjEsMTAgKzIxNSwxMSBAQAogCQlicmVhazsKIAogCWNhc2UgV01fU1lTQ09MT1JDSEFOR0U6Ci0JCUludmFsaWRhdGVSZWN0KGhXbmQsIE5VTEwsIEZBTFNFKTsKKwkJSW52YWxpZGF0ZVJlY3QzMiggaFduZCwgTlVMTCwgRkFMU0UgKTsKIAkJYnJlYWs7CiAKLQljYXNlIEJNX1NFVFNUWUxFOgorCWNhc2UgQk1fU0VUU1RZTEUxNjoKKwljYXNlIEJNX1NFVFNUWUxFMzI6CiAJCWlmICgod1BhcmFtICYgMHgwZikgPj0gTUFYX0JUTl9UWVBFKSBicmVhazsKIAkJd25kUHRyLT5kd1N0eWxlID0gKHduZFB0ci0+ZHdTdHlsZSAmIDB4ZmZmZmZmZjApIAogCQkgICAgICAgICAgICAgICAgICAgfCAod1BhcmFtICYgMHgwMDAwMDAwZik7CkBAIC0yMzIsMTEgKzIyNywxMyBAQAogICAgICAgICAgICAgICAgIFBBSU5UX0JVVFRPTiggd25kUHRyLCBzdHlsZSwgT0RBX0RSQVdFTlRJUkUgKTsKIAkJYnJlYWs7CiAKLQljYXNlIEJNX0dFVENIRUNLOgorCWNhc2UgQk1fR0VUQ0hFQ0sxNjoKKwljYXNlIEJNX0dFVENIRUNLMzI6CiAJCWxSZXN1bHQgPSBpbmZvUHRyLT5zdGF0ZSAmIDM7CiAJCWJyZWFrOwogCi0JY2FzZSBCTV9TRVRDSEVDSzoKKwljYXNlIEJNX1NFVENIRUNLMTY6CisJY2FzZSBCTV9TRVRDSEVDSzMyOgogICAgICAgICAgICAgICAgIGlmICh3UGFyYW0gPiBtYXhDaGVja1N0YXRlW3N0eWxlXSkKICAgICAgICAgICAgICAgICAgICAgd1BhcmFtID0gbWF4Q2hlY2tTdGF0ZVtzdHlsZV07CiAJCWlmICgoaW5mb1B0ci0+c3RhdGUgJiAzKSAhPSB3UGFyYW0pCkBAIC0yNDgsMTEgKzI0NSwxMyBAQAogCQkJQlVUVE9OX0NoZWNrQXV0b1JhZGlvQnV0dG9uKCB3bmRQdHIgKTsKICAgICAgICAgICAgICAgICBicmVhazsKIAotCWNhc2UgQk1fR0VUU1RBVEU6CisJY2FzZSBCTV9HRVRTVEFURTE2OgorCWNhc2UgQk1fR0VUU1RBVEUzMjoKIAkJbFJlc3VsdCA9IGluZm9QdHItPnN0YXRlOwogCQlicmVhazsKIAotCWNhc2UgQk1fU0VUU1RBVEU6CisJY2FzZSBCTV9TRVRTVEFURTE2OgorCWNhc2UgQk1fU0VUU1RBVEUzMjoKICAgICAgICAgICAgICAgICBpZiAod1BhcmFtKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm9QdHItPnN0YXRlICYgQlVUVE9OX0hJR0hMSUdIVEVEKSBicmVhazsKQEAgLTI4MSwyMCArMjgwLDIwIEBACiAKIHN0YXRpYyB2b2lkIFBCX1BhaW50KCBXTkQgKnduZFB0ciwgSERDIGhEQywgV09SRCBhY3Rpb24gKQogewotICAgIFJFQ1QgcmM7Ci0gICAgSFBFTiBoT2xkUGVuOworICAgIFJFQ1QxNiByYzsKKyAgICBIUEVOMTYgaE9sZFBlbjsKICAgICBIQlJVU0ggaE9sZEJydXNoOwogICAgIGNoYXIgKnRleHQ7CiAgICAgRFdPUkQgZHdUZXh0U2l6ZTsKICAgICBURVhUTUVUUklDIHRtOwogICAgIEJVVFRPTklORk8gKmluZm9QdHIgPSAoQlVUVE9OSU5GTyAqKXduZFB0ci0+d0V4dHJhOwogCi0gICAgR2V0Q2xpZW50UmVjdCh3bmRQdHItPmh3bmRTZWxmLCAmcmMpOworICAgIEdldENsaWVudFJlY3QxNih3bmRQdHItPmh3bmRTZWxmLCAmcmMpOwogCiAgICAgICAvKiBTZW5kIFdNX0NUTENPTE9SIHRvIGFsbG93IGNoYW5naW5nIHRoZSBmb250ICh0aGUgY29sb3JzIGFyZSBmaXhlZCkgKi8KICAgICBpZiAoaW5mb1B0ci0+aEZvbnQpIFNlbGVjdE9iamVjdCggaERDLCBpbmZvUHRyLT5oRm9udCApOwogICAgIEJVVFRPTl9TRU5EX0NUTENPTE9SKCB3bmRQdHIsIGhEQyApOwotICAgIGhPbGRQZW4gPSAoSFBFTilTZWxlY3RPYmplY3QoaERDLCBzeXNDb2xvck9iamVjdHMuaHBlbldpbmRvd0ZyYW1lKTsKKyAgICBoT2xkUGVuID0gKEhQRU4xNilTZWxlY3RPYmplY3QoaERDLCBzeXNDb2xvck9iamVjdHMuaHBlbldpbmRvd0ZyYW1lKTsKICAgICBoT2xkQnJ1c2ggPSAoSEJSVVNIKVNlbGVjdE9iamVjdChoREMsIHN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hCdG5GYWNlKTsKICAgICBTZXRCa01vZGUoaERDLCBUUkFOU1BBUkVOVCk7CiAgICAgUmVjdGFuZ2xlKGhEQywgcmMubGVmdCwgcmMudG9wLCByYy5yaWdodCwgcmMuYm90dG9tKTsKQEAgLTMwNSwxMiArMzA0LDEyIEBACiAgICAgICAgIFNldFBpeGVsKCBoREMsIHJjLnJpZ2h0LTEsIHJjLnRvcCwgR2V0U3lzQ29sb3IoQ09MT1JfV0lORE9XKSApOwogICAgICAgICBTZXRQaXhlbCggaERDLCByYy5yaWdodC0xLCByYy5ib3R0b20tMSwgR2V0U3lzQ29sb3IoQ09MT1JfV0lORE9XKSApOwogICAgIH0KLSAgICBJbmZsYXRlUmVjdCggJnJjLCAtMSwgLTEgKTsKKyAgICBJbmZsYXRlUmVjdDE2KCAmcmMsIC0xLCAtMSApOwogCiAgICAgaWYgKCh3bmRQdHItPmR3U3R5bGUgJiAweDAwMGYpID09IEJTX0RFRlBVU0hCVVRUT04pCiAgICAgewogICAgICAgICBSZWN0YW5nbGUoaERDLCByYy5sZWZ0LCByYy50b3AsIHJjLnJpZ2h0LCByYy5ib3R0b20pOwotICAgICAgICBJbmZsYXRlUmVjdCggJnJjLCAtMSwgLTEgKTsKKyAgICAgICAgSW5mbGF0ZVJlY3QxNiggJnJjLCAtMSwgLTEgKTsKICAgICB9CiAKICAgICBpZiAoaW5mb1B0ci0+c3RhdGUgJiBCVVRUT05fSElHSExJR0hURUQpCkBAIC0zMzAsOCArMzI5LDggQEAKICAgICB7CiAgICAgICAgIFNldFRleHRDb2xvciggaERDLCAod25kUHRyLT5kd1N0eWxlICYgV1NfRElTQUJMRUQpID8KICAgICAgICAgICAgICAgICAgICAgIEdldFN5c0NvbG9yKENPTE9SX0dSQVlURVhUKSA6IEdldFN5c0NvbG9yKENPTE9SX0JUTlRFWFQpKTsKLSAgICAgICAgRHJhd1RleHQoaERDLCB0ZXh0LCAtMSwgJnJjLAotICAgICAgICAgICAgICAgICBEVF9TSU5HTEVMSU5FIHwgRFRfQ0VOVEVSIHwgRFRfVkNFTlRFUik7CisgICAgICAgIERyYXdUZXh0MTYoIGhEQywgdGV4dCwgLTEsICZyYywKKyAgICAgICAgICAgICAgICAgICAgRFRfU0lOR0xFTElORSB8IERUX0NFTlRFUiB8IERUX1ZDRU5URVIgKTsKICAgICAgICAgLyogZG8gd2UgaGF2ZSB0aGUgZm9jdXM/ICovCiAgICAgICAgIGlmIChpbmZvUHRyLT5zdGF0ZSAmIEJVVFRPTl9IQVNGT0NVUykKICAgICAgICAgewpAQCAtMzQyLDggKzM0MSw4IEBACiAgICAgICAgICAgICB5ZGVsdGEgPSAoKHJjLmJvdHRvbSAtIHJjLnRvcCkgLSB0bS50bUhlaWdodCAtIDEpIC8gMjsKICAgICAgICAgICAgIGlmICh4ZGVsdGEgPCAwKSB4ZGVsdGEgPSAwOwogICAgICAgICAgICAgaWYgKHlkZWx0YSA8IDApIHlkZWx0YSA9IDA7Ci0gICAgICAgICAgICBJbmZsYXRlUmVjdCggJnJjLCAteGRlbHRhLCAteWRlbHRhICk7Ci0gICAgICAgICAgICBEcmF3Rm9jdXNSZWN0KCBoREMsICZyYyApOworICAgICAgICAgICAgSW5mbGF0ZVJlY3QxNiggJnJjLCAteGRlbHRhLCAteWRlbHRhICk7CisgICAgICAgICAgICBEcmF3Rm9jdXNSZWN0MTYoIGhEQywgJnJjICk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTM1OCwxOSArMzU3LDE5IEBACiAKIHN0YXRpYyB2b2lkIENCX1BhaW50KCBXTkQgKnduZFB0ciwgSERDIGhEQywgV09SRCBhY3Rpb24gKQogewotICAgIFJFQ1QgcmM7CisgICAgUkVDVDE2IHJjOwogICAgIEhCUlVTSCBoQnJ1c2g7CiAgICAgaW50IHRleHRsZW4sIGRlbHRhLCB4LCB5OwogICAgIGNoYXIgKnRleHQ7CiAgICAgVEVYVE1FVFJJQyB0bTsKLSAgICBTSVpFIHNpemU7CisgICAgU0laRTE2IHNpemU7CiAgICAgQlVUVE9OSU5GTyAqaW5mb1B0ciA9IChCVVRUT05JTkZPICopd25kUHRyLT53RXh0cmE7CiAKLSAgICBHZXRDbGllbnRSZWN0KHduZFB0ci0+aHduZFNlbGYsICZyYyk7CisgICAgR2V0Q2xpZW50UmVjdDE2KHduZFB0ci0+aHduZFNlbGYsICZyYyk7CiAKICAgICBpZiAoaW5mb1B0ci0+aEZvbnQpIFNlbGVjdE9iamVjdCggaERDLCBpbmZvUHRyLT5oRm9udCApOwogICAgIGhCcnVzaCA9IEJVVFRPTl9TRU5EX0NUTENPTE9SKCB3bmRQdHIsIGhEQyApOwotICAgIGlmIChhY3Rpb24gPT0gT0RBX0RSQVdFTlRJUkUpIEZpbGxSZWN0KGhEQywgJnJjLCBoQnJ1c2gpOworICAgIGlmIChhY3Rpb24gPT0gT0RBX0RSQVdFTlRJUkUpIEZpbGxSZWN0MTYoIGhEQywgJnJjLCBoQnJ1c2ggKTsKIAogICAgIEdldFRleHRNZXRyaWNzKGhEQywgJnRtKTsKICAgICBkZWx0YSA9IChyYy5ib3R0b20gLSByYy50b3AgLSB0bS50bUhlaWdodCkgPj4gMTsKQEAgLTM5MywxMyArMzkyLDEzIEBACiAgICAgewogICAgICAgICBpZiAod25kUHRyLT5kd1N0eWxlICYgV1NfRElTQUJMRUQpCiAgICAgICAgICAgICBTZXRUZXh0Q29sb3IoIGhEQywgR2V0U3lzQ29sb3IoQ09MT1JfR1JBWVRFWFQpICk7Ci0gICAgICAgIERyYXdUZXh0KGhEQywgdGV4dCwgdGV4dGxlbiwgJnJjLCBEVF9TSU5HTEVMSU5FIHwgRFRfVkNFTlRFUik7CisgICAgICAgIERyYXdUZXh0MTYoIGhEQywgdGV4dCwgdGV4dGxlbiwgJnJjLCBEVF9TSU5HTEVMSU5FIHwgRFRfVkNFTlRFUiApOwogICAgIH0KICAgICAKICAgICBpZiAoKGFjdGlvbiA9PSBPREFfRk9DVVMpIHx8CiAgICAgICAgICgoYWN0aW9uID09IE9EQV9EUkFXRU5USVJFKSAmJiAoaW5mb1B0ci0+c3RhdGUgJiBCVVRUT05fSEFTRk9DVVMpKSkKICAgICB7Ci0gICAgICAgIEdldFRleHRFeHRlbnRQb2ludChoREMsIHRleHQsIHRleHRsZW4sICZzaXplKTsKKyAgICAgICAgR2V0VGV4dEV4dGVudFBvaW50MTYoIGhEQywgdGV4dCwgdGV4dGxlbiwgJnNpemUgKTsKICAgICAgICAgaWYgKGRlbHRhID4gMSkKICAgICAgICAgewogICAgICAgICAgICAgcmMudG9wICs9IGRlbHRhIC0gMTsKQEAgLTQwNyw3ICs0MDYsNyBAQAogICAgICAgICB9CiAgICAgICAgIHJjLmxlZnQtLTsKICAgICAgICAgcmMucmlnaHQgPSBNSU4oIHJjLmxlZnQgKyBzaXplLmN4ICsgMiwgcmMucmlnaHQgKTsKLSAgICAgICAgRHJhd0ZvY3VzUmVjdChoREMsICZyYyk7CisgICAgICAgIERyYXdGb2N1c1JlY3QxNiggaERDLCAmcmMgKTsKICAgICB9CiB9CiAKQEAgLTQyNSw3ICs0MjQsNyBAQAogICAgIGZvcihzaWJsaW5nID0gR2V0TmV4dERsZ0dyb3VwSXRlbShwYXJlbnQsd25kUHRyLT5od25kU2VsZixGQUxTRSk7CiAgICAgICAgIHNpYmxpbmcgIT0gd25kUHRyLT5od25kU2VsZjsKICAgICAgICAgc2libGluZyA9IEdldE5leHREbGdHcm91cEl0ZW0ocGFyZW50LHNpYmxpbmcsRkFMU0UpKQotCSAgICBTZW5kTWVzc2FnZShzaWJsaW5nLEJNX1NFVENIRUNLLEJVVFRPTl9VTkNIRUNLRUQsMCk7CisJICAgIFNlbmRNZXNzYWdlKCBzaWJsaW5nLCBCTV9TRVRDSEVDSzE2LCBCVVRUT05fVU5DSEVDS0VELCAwICk7CiB9CiAKIApAQCAtNDM1LDkgKzQzNCw5IEBACiAKIHN0YXRpYyB2b2lkIEdCX1BhaW50KCBXTkQgKnduZFB0ciwgSERDIGhEQywgV09SRCBhY3Rpb24gKQogewotICAgIFJFQ1QgcmM7CisgICAgUkVDVDE2IHJjOwogICAgIGNoYXIgKnRleHQ7Ci0gICAgU0laRSBzaXplOworICAgIFNJWkUxNiBzaXplOwogICAgIEJVVFRPTklORk8gKmluZm9QdHIgPSAoQlVUVE9OSU5GTyAqKXduZFB0ci0+d0V4dHJhOwogCiAgICAgaWYgKGFjdGlvbiAhPSBPREFfRFJBV0VOVElSRSkgcmV0dXJuOwpAQCAtNDQ2LDcgKzQ0NSw3IEBACiAgICAgQlVUVE9OX1NFTkRfQ1RMQ09MT1IoIHduZFB0ciwgaERDICk7CiAgICAgU2VsZWN0T2JqZWN0KCBoREMsIHN5c0NvbG9yT2JqZWN0cy5ocGVuV2luZG93RnJhbWUgKTsKIAotICAgIEdldENsaWVudFJlY3QoIHduZFB0ci0+aHduZFNlbGYsICZyYyk7CisgICAgR2V0Q2xpZW50UmVjdDE2KCB3bmRQdHItPmh3bmRTZWxmLCAmcmMpOwogCiAgICAgTW92ZVRvKCBoREMsIHJjLmxlZnQsIHJjLnRvcCsyICk7CiAgICAgTGluZVRvKCBoREMsIHJjLnJpZ2h0LTEsIHJjLnRvcCsyICk7CkBAIC00NTUsMTMgKzQ1NCwxMyBAQAogICAgIExpbmVUbyggaERDLCByYy5sZWZ0LCByYy50b3ArMiApOwogCiAgICAgaWYgKCEodGV4dCA9IChjaGFyKikgVVNFUl9IRUFQX0xJTl9BRERSKCB3bmRQdHItPmhUZXh0ICkpKSByZXR1cm47Ci0gICAgR2V0VGV4dEV4dGVudFBvaW50KGhEQywgdGV4dCwgc3RybGVuKHRleHQpLCAmc2l6ZSk7CisgICAgR2V0VGV4dEV4dGVudFBvaW50MTYoIGhEQywgdGV4dCwgc3RybGVuKHRleHQpLCAmc2l6ZSApOwogICAgIHJjLmxlZnQgICs9IDEwOwogICAgIHJjLnJpZ2h0ICA9IHJjLmxlZnQgKyBzaXplLmN4ICsgMTsKICAgICByYy5ib3R0b20gPSBzaXplLmN5OwogICAgIGlmICh3bmRQdHItPmR3U3R5bGUgJiBXU19ESVNBQkxFRCkKICAgICAgICAgU2V0VGV4dENvbG9yKCBoREMsIEdldFN5c0NvbG9yKENPTE9SX0dSQVlURVhUKSApOwotICAgIERyYXdUZXh0KGhEQywgdGV4dCwgLTEsICZyYywgRFRfU0lOR0xFTElORSApOworICAgIERyYXdUZXh0MTYoIGhEQywgdGV4dCwgLTEsICZyYywgRFRfU0lOR0xFTElORSApOwogfQogCiAKQEAgLTQ3MSwyMSArNDcwLDIxIEBACiAKIHN0YXRpYyB2b2lkIFVCX1BhaW50KCBXTkQgKnduZFB0ciwgSERDIGhEQywgV09SRCBhY3Rpb24gKQogewotICAgIFJFQ1QgcmM7CisgICAgUkVDVDE2IHJjOwogICAgIEhCUlVTSCBoQnJ1c2g7CiAgICAgQlVUVE9OSU5GTyAqaW5mb1B0ciA9IChCVVRUT05JTkZPICopd25kUHRyLT53RXh0cmE7CiAKICAgICBpZiAoYWN0aW9uID09IE9EQV9TRUxFQ1QpIHJldHVybjsKIAotICAgIEdldENsaWVudFJlY3QoIHduZFB0ci0+aHduZFNlbGYsICZyYyk7CisgICAgR2V0Q2xpZW50UmVjdDE2KCB3bmRQdHItPmh3bmRTZWxmLCAmcmMpOwogCiAgICAgaWYgKGluZm9QdHItPmhGb250KSBTZWxlY3RPYmplY3QoIGhEQywgaW5mb1B0ci0+aEZvbnQgKTsKICAgICBoQnJ1c2ggPSBCVVRUT05fU0VORF9DVExDT0xPUiggd25kUHRyLCBoREMgKTsKLSAgICBGaWxsUmVjdChoREMsICZyYywgaEJydXNoKTsKKyAgICBGaWxsUmVjdDE2KCBoREMsICZyYywgaEJydXNoICk7CiAKICAgICBpZiAoKGFjdGlvbiA9PSBPREFfRk9DVVMpIHx8CiAgICAgICAgICgoYWN0aW9uID09IE9EQV9EUkFXRU5USVJFKSAmJiAoaW5mb1B0ci0+c3RhdGUgJiBCVVRUT05fSEFTRk9DVVMpKSkKLSAgICAgICAgRHJhd0ZvY3VzUmVjdChoREMsICZyYyk7CisgICAgICAgIERyYXdGb2N1c1JlY3QxNiggaERDLCAmcmMgKTsKIH0KIAogCkBAIC00OTUsMjAgKzQ5NCwyMiBAQAogCiBzdGF0aWMgdm9pZCBPQl9QYWludCggV05EICp3bmRQdHIsIEhEQyBoREMsIFdPUkQgYWN0aW9uICkKIHsKLSAgICBEUkFXSVRFTVNUUlVDVCBkaXM7CisgICAgRFJBV0lURU1TVFJVQ1QxNiAqZGlzOwogICAgIEJVVFRPTklORk8gKmluZm9QdHIgPSAoQlVUVE9OSU5GTyAqKXduZFB0ci0+d0V4dHJhOwogCi0gICAgZGlzLkN0bFR5cGUgICAgPSBPRFRfQlVUVE9OOwotICAgIGRpcy5DdGxJRCAgICAgID0gd25kUHRyLT53SURtZW51OwotICAgIGRpcy5pdGVtSUQgICAgID0gMDsKLSAgICBkaXMuaXRlbUFjdGlvbiA9IGFjdGlvbjsKLSAgICBkaXMuaXRlbVN0YXRlICA9IChpbmZvUHRyLT5zdGF0ZSAmIEJVVFRPTl9IQVNGT0NVUykgPyBPRFNfRk9DVVMgOiAwIHwKKyAgICBpZiAoIShkaXMgPSBTRUdQVFJfTkVXKERSQVdJVEVNU1RSVUNUMTYpKSkgcmV0dXJuOworICAgIGRpcy0+Q3RsVHlwZSAgICA9IE9EVF9CVVRUT047CisgICAgZGlzLT5DdGxJRCAgICAgID0gd25kUHRyLT53SURtZW51OworICAgIGRpcy0+aXRlbUlEICAgICA9IDA7CisgICAgZGlzLT5pdGVtQWN0aW9uID0gYWN0aW9uOworICAgIGRpcy0+aXRlbVN0YXRlICA9IChpbmZvUHRyLT5zdGF0ZSAmIEJVVFRPTl9IQVNGT0NVUykgPyBPRFNfRk9DVVMgOiAwIHwKICAgICAgICAgICAgICAgICAgICAgIChpbmZvUHRyLT5zdGF0ZSAmIEJVVFRPTl9ISUdITElHSFRFRCkgPyBPRFNfU0VMRUNURUQgOiAwIHwKICAgICAgICAgICAgICAgICAgICAgICh3bmRQdHItPmR3U3R5bGUgJiBXU19ESVNBQkxFRCkgPyBPRFNfRElTQUJMRUQgOiAwOwotICAgIGRpcy5od25kSXRlbSAgID0gd25kUHRyLT5od25kU2VsZjsKLSAgICBkaXMuaERDICAgICAgICA9IGhEQzsKLSAgICBHZXRDbGllbnRSZWN0KCB3bmRQdHItPmh3bmRTZWxmLCAmZGlzLnJjSXRlbSApOwotICAgIGRpcy5pdGVtRGF0YSAgID0gMDsKKyAgICBkaXMtPmh3bmRJdGVtICAgPSB3bmRQdHItPmh3bmRTZWxmOworICAgIGRpcy0+aERDICAgICAgICA9IGhEQzsKKyAgICBHZXRDbGllbnRSZWN0MTYoIHduZFB0ci0+aHduZFNlbGYsICZkaXMtPnJjSXRlbSApOworICAgIGRpcy0+aXRlbURhdGEgICA9IDA7CiAgICAgU2VuZE1lc3NhZ2UoIEdldFBhcmVudCh3bmRQdHItPmh3bmRTZWxmKSwgV01fRFJBV0lURU0sIDEsCi0gICAgICAgICAgICAgICAgIChMUEFSQU0pTUFLRV9TRUdQVFIoJmRpcykgKTsKKyAgICAgICAgICAgICAgICAgKExQQVJBTSlTRUdQVFJfR0VUKGRpcykgKTsKKyAgICBTRUdQVFJfRlJFRShkaXMpOwogfQpkaWZmIC0tZ2l0IGEvY29udHJvbHMvY29tYm8uYyBiL2NvbnRyb2xzL2NvbWJvLmMKaW5kZXggZDJkYzgxOS4uNDZiNGI5ZiAxMDA2NDQKLS0tIGEvY29udHJvbHMvY29tYm8uYworKysgYi9jb250cm9scy9jb21iby5jCkBAIC0zLDYgKzMsNyBAQAogICogCiAgKiBDb3B5cmlnaHQgMTk5MyBNYXJ0aW4gQXlvdHRlCiAgKiBDb3B5cmlnaHQgMTk5NSBCZXJuZCBTY2htaWR0CisgKiBDb3B5cmlnaHQgMTk5NiBBbGJyZWNodCBLbGVpbmUgIFtzb21lIGZpeGVzXQogICogCiAgKi8KIApAQCAtMTksNiArMjAsNyBAQAogI2luY2x1ZGUgInVzZXIuaCIKICNpbmNsdWRlICJ3aW4uaCIKICNpbmNsdWRlICJncmFwaGljcy5oIgorI2luY2x1ZGUgImhlYXAuaCIKICNpbmNsdWRlICJsaXN0Ym94LmgiCiAjaW5jbHVkZSAiZG9zX2ZzLmgiCiAjaW5jbHVkZSAiZHJpdmUuaCIKQEAgLTMzLDE4ICszNSw4IEBACiAgICogSSBob3BlIG5vIHByb2dyYW1zIHJlbHkgb24gdGhlIGltcGxlbWVudGF0aW9uIG9mIGNvbWJvcy4KICAgKi8KIAotIC8qCi0gICogTWF5IDJuZDogIEkgYWRkZWQgMyAid29yayBhcm91bmRzIiAgKCMxLCMyLCMzKSAgIHRvIG1ha2UgY29tYm9zIAotICAqICAgICAgICAgICB3aXRoIEVESVQgd29yay4gKFdlIG5lZWQgdGhhdCBmb3IgQ2hvb3NlRm9udCBkaWFsb2cuKQotICAqICAgICAgICAgICBQZXJoYXBzIHdlIGhhdmUgdG8gcmV3cml0ZSBzb21ldGhpbmcgbW9yZS4KLSAgKiAgICAgICAgICAgSSBoYXZlIHByZXBhcmVkIHNvbWUgbW9yZSBzdHVmZiwgYnV0IGl0IGRvZXNuJ3QgCi0gICogICAgICAgICAgIGNvbnRhaW4gaGVyZSwgIGJlY2F1c2UgaXQncyBub3QgcmVhZHkgOy0pCi0gICoKLSAgKiAgICAgICAgICAgSWYgeW91J3JlIHdyaXRpbmcgb24gY29tYm8uYywgcGxlYXNlIG1haWwgdG8gbWUuCi0gICoKLSAgKiAgICAgICAgICAgQWxicmVjaHQgS2xlaW5lICA8a2xlaW5lQGFrLnNheC5kZT4KLSAgKi8KLQorI2RlZmluZSBJRF9FRElUICAxCisjZGVmaW5lIElEX0NMQiAgIDIKICNkZWZpbmUgQ0JMTU1fRURHRSAgIDQgICAgLyogZGlzdGFuY2UgaW5zaWRlIGJveCB3aGljaCBpcyBzYW1lIGFzIG1vdmluZyBtb3VzZQogCQkJICAgICBvdXRzaWRlIGJveCwgdG8gdHJpZ2dlciBzY3JvbGxpbmcgb2YgQ0JMICovCiAKQEAgLTk3LDkgKzg5LDcgQEAKIAogICBpZiAod25kUHRyLT5kd1N0eWxlICYgV1NfVlNDUk9MTCkgCiAgICAgU2V0U2Nyb2xsUmFuZ2UobHBoYy0+aFduZExCb3gsU0JfVkVSVCwwLExpc3RNYXhGaXJzdFZpc2libGUobHBobCksVFJVRSk7Ci0gIGlmIChyZXBhaW50ICYmIGxwaGwtPmJSZWRyYXdGbGFnKSB7Ci0gICAgSW52YWxpZGF0ZVJlY3QoaHduZCwgTlVMTCwgVFJVRSk7Ci0gIH0KKyAgaWYgKHJlcGFpbnQgJiYgbHBobC0+YlJlZHJhd0ZsYWcpIEludmFsaWRhdGVSZWN0MzIoIGh3bmQsIE5VTEwsIFRSVUUgKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMDcsMTEgKzk3LDExIEBACiAgKi8KIHN0YXRpYyBMUkVTVUxUIENCTkNDcmVhdGUoSFdORCBod25kLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewotICBDUkVBVEVTVFJVQ1QgKmNyZWF0ZVN0cnVjdDsKKyAgQ1JFQVRFU1RSVUNUMTYgKmNyZWF0ZVN0cnVjdDsKIAogICBpZiAoIWhDb21ib0JpdCkgQ09NQk9fSW5pdCgpOwogCi0gIGNyZWF0ZVN0cnVjdCA9IChDUkVBVEVTVFJVQ1QgKilQVFJfU0VHX1RPX0xJTihsUGFyYW0pOworICBjcmVhdGVTdHJ1Y3QgPSAoQ1JFQVRFU1RSVUNUMTYgKilQVFJfU0VHX1RPX0xJTihsUGFyYW0pOwogICBjcmVhdGVTdHJ1Y3QtPnN0eWxlIHw9IFdTX0JPUkRFUjsKICAgU2V0V2luZG93TG9uZyhod25kLCBHV0xfU1RZTEUsIGNyZWF0ZVN0cnVjdC0+c3R5bGUpOwogCkBAIC0xMjksMTAgKzExOSwxMSBAQAogICBMUEhFQURDT01CTyAgbHBoYzsKICAgTE9ORyAgICAgICAgIHN0eWxlID0gMDsKICAgTE9ORyAgICAgICAgIGNzdHlsZSA9IEdldFdpbmRvd0xvbmcoaHduZCxHV0xfU1RZTEUpOwotICBSRUNUICAgICAgICAgcmVjdCxsYm94cmVjdDsKKyAgUkVDVDE2ICAgICAgIHJlY3QsbGJveHJlY3Q7CiAgIFdORCogICAgICAgICB3bmRQdHIgPSBXSU5fRmluZFduZFB0cihod25kKTsKICAgY2hhciBjbGFzc05hbWVbXSA9ICJDT01CT0xCT1giOyAgLyogSGFjayBzbyB0aGF0IGNsYXNzIG5hbWVzIGFyZSA+IDB4MTAwMDAgKi8KICAgY2hhciBlZGl0TmFtZVtdID0gIkVESVQiOworICBIV05EIGh3bmRwPTA7CiAKICAgLyogdHJhbnNsYXRlIGNvbWJvIGludG8gbGlzdGJveCBzdHlsZXMgKi8KICAgY3N0eWxlIHw9IFdTX0JPUkRFUjsKQEAgLTE0Nyw4MCArMTM4LDYxIEBACiAgIGxwaGwgPSBDb21ib0dldExpc3RIZWFkZXIoaHduZCk7CiAgIGxwaGMgPSBDb21ib0dldFN0b3JhZ2VIZWFkZXIoaHduZCk7CiAKLSAgR2V0Q2xpZW50UmVjdChod25kLCZyZWN0KTsKLSAgR2V0V2luZG93UmVjdChod25kLCZsYm94cmVjdCk7CisgIEdldENsaWVudFJlY3QxNihod25kLCZyZWN0KTsKKyAgbHBoYy0+TEJveFRvcCA9IGxwaGwtPlN0ZEl0ZW1IZWlnaHQ7CiAKLSAgLyogRklYTUU6IGNvbWJvcyB3aXRoIGVkaXQgY29udHJvbHMgYXJlIGJyb2tlbi4gKi8KLSAgc3dpdGNoKGNzdHlsZSAmIDMpIHsKKyAgc3dpdGNoKGNzdHlsZSAmIDMpIAorICB7CiAgICBjYXNlIENCU19TSU1QTEU6ICAgICAgICAgICAgLyogZWRpdCBjb250cm9sLCBsaXN0IGFsd2F5cyB2aXNpYmxlICAqLwotICAgIGRwcmludGZfY29tYm8oc3RkZGViLCJDQlNfU0lNUExFXG4iKTsKLSAgICBTZXRSZWN0RW1wdHkoJmxwaGMtPlJlY3RCdXR0b24pOwotICAgIGxib3hyZWN0PXJlY3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3b3JrIGFyb3VuZCAjMSAqLyAgIAotICAgIGxwaGMtPkxCb3hUb3AgPSBscGhsLT5TdGRJdGVtSGVpZ2h0OwotICAgIGxwaGMtPmhXbmRFZGl0ID0gQ3JlYXRlV2luZG93MTYoTUFLRV9TRUdQVFIoZWRpdE5hbWUpLCAoU0VHUFRSKTAsIAotCQkJCSAgV1NfQ0hJTEQgfCBXU19DTElQQ0hJTERSRU4gfCBXU19WSVNJQkxFIHwgU1NfTEVGVCB8IFdTX0JPUkRFUiwKLQkJCQkgIDAsIDAsIHJlY3QucmlnaHQsIGxwaGwtPlN0ZEl0ZW1IZWlnaHQsCi0JCQkJICBod25kLCAoSE1FTlUpMSwgV0lOX0dldFdpbmRvd0luc3RhbmNlKGh3bmQpLCAwTCk7Ci0gICAgYnJlYWs7CisgICAgIGxib3hyZWN0PXJlY3Q7ICAgIAorICAgICBsYm94cmVjdC5sZWZ0ICs9ODsKKyAgICAgZHByaW50Zl9jb21ibyhzdGRkZWIsIkNCU19TSU1QTEVcbiIpOworICAgICBzdHlsZT0gV1NfQk9SREVSIHwgIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1ZTQ1JPTEw7CisgICAgIFNldFJlY3RFbXB0eTE2KCZscGhjLT5SZWN0QnV0dG9uKTsKKyAgICAgaHduZHA9aHduZDsKKyAgICAgYnJlYWs7CisKKyAgIGNhc2UgQ0JTX0RST1BET1dOTElTVDogICAgICAvKiBzdGF0aWMgY29udHJvbCwgZHJvcGRvd24gbGlzdGJveCAgICovCiAgICBjYXNlIENCU19EUk9QRE9XTjogICAgICAgICAgLyogZWRpdCBjb250cm9sLCBkcm9wZG93biBsaXN0Ym94ICAgICAqLwotICAgIGRwcmludGZfY29tYm8oc3RkZGViLCJDQlNfRFJPUERPV05cbiIpOwotICAgIGxwaGMtPlJlY3RCdXR0b24gPSByZWN0OwotICAgIGxwaGMtPlJlY3RCdXR0b24ubGVmdCA9IGxwaGMtPlJlY3RCdXR0b24ucmlnaHQgLSA2IC0gQ0JpdFdpZHRoOwotICAgIGxwaGMtPlJlY3RCdXR0b24uYm90dG9tID0gbHBoYy0+UmVjdEJ1dHRvbi50b3AgKyBscGhsLT5TdGRJdGVtSGVpZ2h0OwotICAgIGxwaGMtPkxCb3hUb3AgPSBscGhsLT5TdGRJdGVtSGVpZ2h0OwotICAgIFNldFdpbmRvd1Bvcyhod25kLCAwLCAwLCAwLCByZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0ICsgMipTWVNNRVRSSUNTX0NYQk9SREVSLAorICAgICBHZXRXaW5kb3dSZWN0MTYoaHduZCwmbGJveHJlY3QpOworICAgICBzdHlsZSA9IFdTX1BPUFVQIHwgV1NfQk9SREVSIHwgV1NfVlNDUk9MTDsKKyAgICAgLyogRklYTUU6IFdpblNpZ2h0IHNheXMgdGhlc2Ugc2hvdWxkIGJlIENISUxEIHdpbmRvd3Mgd2l0aCB0aGUgVE9QTU9TVCBmbGFnCisgICAgICAqIHNldC4gV2luZSBkb2Vzbid0IHN1cHBvcnQgVE9QTU9TVCwgYW5kIHNpbXBseSBzZXR0aW5nIHRoZSBXU19DSElMRAorICAgICAgKiBmbGFnIGRvZXNuJ3Qgd29yay4gKi8KKyAgICAgbHBoYy0+UmVjdEJ1dHRvbiA9IHJlY3Q7CisgICAgIGxwaGMtPlJlY3RCdXR0b24ubGVmdCA9IGxwaGMtPlJlY3RCdXR0b24ucmlnaHQgLSA2IC0gQ0JpdFdpZHRoOworICAgICBscGhjLT5SZWN0QnV0dG9uLmJvdHRvbSA9IGxwaGMtPlJlY3RCdXR0b24udG9wICsgbHBobC0+U3RkSXRlbUhlaWdodDsKKyAgICAgU2V0V2luZG93UG9zKGh3bmQsIDAsIDAsIDAsIHJlY3QucmlnaHQgLSByZWN0LmxlZnQgKyAyKlNZU01FVFJJQ1NfQ1hCT1JERVIsCiAJCSBscGhsLT5TdGRJdGVtSGVpZ2h0ICsgMipTWVNNRVRSSUNTX0NZQk9SREVSLAogCQkgU1dQX05PTU9WRSB8IFNXUF9OT1pPUkRFUik7Ci0gICAgbHBoYy0+aFduZEVkaXQgPSBDcmVhdGVXaW5kb3cxNihNQUtFX1NFR1BUUihlZGl0TmFtZSksIChTRUdQVFIpMCwKLQkJCQkgIFdTX0NISUxEIHwgV1NfQ0xJUENISUxEUkVOIHwgV1NfVklTSUJMRSB8IFNTX0xFRlQsCi0JCQkJICAwLCAwLCBscGhjLT5SZWN0QnV0dG9uLmxlZnQsIGxwaGwtPlN0ZEl0ZW1IZWlnaHQsCi0JCQkJICBod25kLCAoSE1FTlUpMSwgV0lOX0dldFdpbmRvd0luc3RhbmNlKGh3bmQpLCAwTCk7Ci0gICAgYnJlYWs7Ci0gICBjYXNlIENCU19EUk9QRE9XTkxJU1Q6ICAgICAgLyogc3RhdGljIGNvbnRyb2wsIGRyb3Bkb3duIGxpc3Rib3ggICAqLwotICAgIGRwcmludGZfY29tYm8oc3RkZGViLCJDQlNfRFJPUERPV05MSVNUXG4iKTsKLSAgICBscGhjLT5SZWN0QnV0dG9uID0gcmVjdDsKLSAgICBscGhjLT5SZWN0QnV0dG9uLmxlZnQgPSBscGhjLT5SZWN0QnV0dG9uLnJpZ2h0IC0gNiAtIENCaXRXaWR0aDsKLSAgICBscGhjLT5SZWN0QnV0dG9uLmJvdHRvbSA9IGxwaGMtPlJlY3RCdXR0b24udG9wICsgbHBobC0+U3RkSXRlbUhlaWdodDsKLSAgICBscGhjLT5MQm94VG9wID0gbHBobC0+U3RkSXRlbUhlaWdodDsKLQotICAgIFNldFdpbmRvd1Bvcyhod25kLCAwLCAwLCAwLCByZWN0LnJpZ2h0LCAKLQkJIGxwaGwtPlN0ZEl0ZW1IZWlnaHQgKyAyKlNZU01FVFJJQ1NfQ1lCT1JERVIsIAotCQkgU1dQX05PTU9WRSB8IFNXUF9OT1pPUkRFUik7Ci0gICAgYnJlYWs7CisgICAgIHJlY3QucmlnaHQ9bHBoYy0+UmVjdEJ1dHRvbi5sZWZ0IC0gODsKKyAgICAgZHByaW50Zl9jb21ibyhzdGRkZWIsKGNzdHlsZSAmIDMpPT1DQlNfRFJPUERPV04gPyAiQ0JTX0RST1BET1dOXG4iOiAiQ0JTX0RST1BET1dOTElTVFxuIik7CisgICAgIGJyZWFrOworICAgICAKKyAgIGRlZmF1bHQ6IGZwcmludGYoc3RkZXJyLCJDT01CT0JPWCBlcnJvcjogYmFkIGNsYXNzIHN0eWxlIVxuIik7CisgICAgIHJldHVybiAwOwogICB9Ci0gIGxib3hyZWN0LnRvcCArPSBscGhjLT5MQm94VG9wOwotICAvKiBGSVhNRTogV2luU2lnaHQgc2F5cyB0aGVzZSBzaG91bGQgYmUgQ0hJTEQgd2luZG93cyB3aXRoIHRoZSBUT1BNT1NUIGZsYWcKLSAgICogc2V0LiBXaW5lIGRvZXNuJ3Qgc3VwcG9ydCBUT1BNT1NULCBhbmQgc2ltcGx5IHNldHRpbmcgdGhlIFdTX0NISUxECi0gICAqIGZsYWcgZG9lc24ndCB3b3JrLiAqLwotICAgaWYgKChjc3R5bGUgJiAzKT09Q0JTX1NJTVBMRSkgICAgICAgICAgICAgICAgICAgICAvKiB3b3JrIGFyb3VuZCAjMiAqLwotICAgewotICAgIGxwaGMtPmhXbmRMQm94ID0gQ3JlYXRlV2luZG93MTYoTUFLRV9TRUdQVFIoY2xhc3NOYW1lKSwgKFNFR1BUUikwLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU19CT1JERVIgfCAgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwKLSAJCQkJKChjc3R5bGUgJiBXU19IU0NST0xMKT8gV1NfSFNDUk9MTCA6IDApIHwKLSAJCQkJKChjc3R5bGUgJiBXU19WU0NST0xMKT8gV1NfVlNDUk9MTCA6IDApLAotCQkJCWxib3hyZWN0LmxlZnQgKzggLCBsYm94cmVjdC50b3AsCi0JCQkJbGJveHJlY3QucmlnaHQgLSBsYm94cmVjdC5sZWZ0IC0gOCwgCi0JCQkJbGJveHJlY3QuYm90dG9tIC0gbGJveHJlY3QudG9wLAotCQkJCSAgaHduZCwwLCBXSU5fR2V0V2luZG93SW5zdGFuY2UoaHduZCksCi0JCQkJKFNFR1BUUilod25kICk7Ci0gICB9Ci0gICBlbHNlCi0gICB7Ci0gICAgbHBoYy0+aFduZExCb3ggPSBDcmVhdGVXaW5kb3cxNihNQUtFX1NFR1BUUihjbGFzc05hbWUpLCAoU0VHUFRSKTAsIAotCQkJCVdTX1BPUFVQIHwgV1NfQk9SREVSIHwKKworICBpZiAoKGNzdHlsZSAmIDMpICE9IENCU19EUk9QRE9XTkxJU1QpCisgICAgICBscGhjLT5oV25kRWRpdCA9IENyZWF0ZVdpbmRvdzE2KE1BS0VfU0VHUFRSKGVkaXROYW1lKSwgKFNFR1BUUikwLAorCQkJCSAgV1NfQ0hJTEQgfCBXU19DTElQQ0hJTERSRU4gfCBXU19WSVNJQkxFIHwgRVNfTEVGVCB8IFdTX0JPUkRFUiwKKwkJCQkgIDAsIDAsIHJlY3QucmlnaHQsIGxwaGwtPlN0ZEl0ZW1IZWlnaHQsCisJCQkJICBod25kLCAoSE1FTlUpSURfRURJVCwgV0lOX0dldFdpbmRvd0luc3RhbmNlKGh3bmQpLCAwTCk7CisJCQkJICAKKyAgbGJveHJlY3QudG9wKz1scGhjLT5MQm94VG9wOworICBscGhjLT5oV25kTEJveCA9IENyZWF0ZVdpbmRvdzE2KE1BS0VfU0VHUFRSKGNsYXNzTmFtZSksIChTRUdQVFIpMCwgc3R5bGUgfAogIAkJCQkoKGNzdHlsZSAmIFdTX0hTQ1JPTEwpPyBXU19IU0NST0xMIDogMCkgfAogIAkJCQkoKGNzdHlsZSAmIFdTX1ZTQ1JPTEwpPyBXU19WU0NST0xMIDogMCksCiAJCQkJbGJveHJlY3QubGVmdCwgbGJveHJlY3QudG9wLAogCQkJCWxib3hyZWN0LnJpZ2h0IC0gbGJveHJlY3QubGVmdCwgCiAJCQkJbGJveHJlY3QuYm90dG9tIC0gbGJveHJlY3QudG9wLAotCQkJCTAsIDAsIFdJTl9HZXRXaW5kb3dJbnN0YW5jZShod25kKSwKKwkJCQlod25kcCwoSE1FTlUpSURfQ0xCLCBXSU5fR2V0V2luZG93SW5zdGFuY2UoaHduZCksCiAJCQkJKFNFR1BUUilod25kICk7Ci0gICAgU2hvd1dpbmRvdyhscGhjLT5oV25kTEJveCwgU1dfSElERSk7Ci0gICB9ICAKKwogICAgd25kUHRyLT5kd1N0eWxlICY9IH4oV1NfVlNDUk9MTCB8IFdTX0hTQ1JPTEwpOwotICAgCi0gICBkcHJpbnRmX2NvbWJvKCBzdGRkZWIsICJDb21ibyBDcmVhdGlvbiBod25kPSUwNHggIExCb3g9JTA0eFxuIiwKLSAgICAgICAgICAgICAgICAgIGh3bmQsIGxwaGMtPmhXbmRMQm94KTsKKworICAgZHByaW50Zl9jb21ibyggc3RkZGViLCAiQ29tYm8gQ3JlYXRpb24gaHduZD0lMDR4ICBMQm94PSUwNHggIEVkaXQ9JTA0eFxuIiwKKyAgICAgICAgICAgICAgICAgIGh3bmQsIGxwaGMtPmhXbmRMQm94LCBscGhjLT5oV25kRWRpdCk7CiAgICBkcHJpbnRmX2NvbWJvKCBzdGRkZWIsICIgIGxib3ggJWQsJWQtJWQsJWQgICAgIGJ1dHRvbiAlZCwlZC0lZCwlZFxuIiwKICAgICAgICAgICAgICAgICAgIGxib3hyZWN0LmxlZnQsIGxib3hyZWN0LnRvcCwgbGJveHJlY3QucmlnaHQsIGxib3hyZWN0LmJvdHRvbSwKICAgICAgICAgICAgICAgICAgIGxwaGMtPlJlY3RCdXR0b24ubGVmdCwgbHBoYy0+UmVjdEJ1dHRvbi50b3AsCkBAIC0yNTQsMTQgKzIyNiwxNSBAQAogICBMUEhFQURMSVNUIGxwaGwgPSBDb21ib0dldExpc3RIZWFkZXIoaHduZCk7CiAgIExQSEVBRENPTUJPIGxwaGMgPSBDb21ib0dldFN0b3JhZ2VIZWFkZXIoaHduZCk7CiAgIExQTElTVFNUUlVDVCBscGxzOwotICBQQUlOVFNUUlVDVCAgcHM7CisgIFBBSU5UU1RSVUNUMTYgIHBzOwogICBIQlJVU0ggaEJydXNoOwogICBIRk9OVCAgaE9sZEZvbnQ7Ci0gIEhEQyAgaGRjOwotICBSRUNUIHJlY3Q7CisgIEhEQzE2IGhkYzsKKyAgUkVDVDE2IHJlY3Q7CiAgIAotICBoZGMgPSBCZWdpblBhaW50KGh3bmQsICZwcyk7Ci0gIGlmIChoQ29tYm9CaXQgIT0gMCAmJiAhSXNSZWN0RW1wdHkoJmxwaGMtPlJlY3RCdXR0b24pKSB7ICAgICAgICAgICAvKiB3b3JrIGFyb3VuZCAjMyAqLworICBoZGMgPSBCZWdpblBhaW50MTYoaHduZCwgJnBzKTsKKyAgaWYgKGhDb21ib0JpdCAhPSAwICYmICFJc1JlY3RFbXB0eTE2KCZscGhjLT5SZWN0QnV0dG9uKSkKKyAgewogICAgIEdSQVBIX0RyYXdSZWxpZWZSZWN0KGhkYywgJmxwaGMtPlJlY3RCdXR0b24sIDIsIDIsIEZBTFNFKTsKICAgICBHUkFQSF9EcmF3Qml0bWFwKGhkYywgaENvbWJvQml0LAogCQkgICAgIGxwaGMtPlJlY3RCdXR0b24ubGVmdCArIDIsbHBoYy0+UmVjdEJ1dHRvbi50b3AgKyAyLApAQCAtMjcxLDcgKzI0NCw3IEBACiAgICAgICB8fCAobHBoYy0+ZHdTdHlsZSAmIDMpICE9IENCU19EUk9QRE9XTkxJU1QpIAogICB7CiAgICAgLyogd2UgZG9uJ3Qgd2FudCB0byBkcmF3IGFuIGVudHJ5IHdoZW4gdGhlcmUgaXMgYW4gZWRpdCBjb250cm9sICovCi0gICAgRW5kUGFpbnQoaHduZCwgJnBzKTsKKyAgICBFbmRQYWludDE2KGh3bmQsICZwcyk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMjg1LDIxICsyNTgsMjEgQEAKICNlbmRpZgogICBpZiAoaEJydXNoID09IDApIGhCcnVzaCA9IEdldFN0b2NrT2JqZWN0KFdISVRFX0JSVVNIKTsKIAotICBHZXRDbGllbnRSZWN0KGh3bmQsICZyZWN0KTsKKyAgR2V0Q2xpZW50UmVjdDE2KGh3bmQsICZyZWN0KTsKIAogICBDQkNoZWNrU2l6ZShod25kKTsKICAgcmVjdC5yaWdodCAtPSAobHBoYy0+UmVjdEJ1dHRvbi5yaWdodCAtIGxwaGMtPlJlY3RCdXR0b24ubGVmdCk7CiAKICAgbHBscyA9IExpc3RCb3hHZXRJdGVtKGxwaGwsbHBobC0+SXRlbUZvY3VzZWQpOwogICBpZiAobHBscyAhPSBOVUxMKSB7ICAKLSAgICBGaWxsUmVjdChoZGMsICZyZWN0LCBoQnJ1c2gpOworICAgIEZpbGxSZWN0MTYoaGRjLCAmcmVjdCwgaEJydXNoKTsKICAgICBMaXN0Qm94RHJhd0l0ZW0gKGh3bmQsIGxwaGwsIGhkYywgbHBscywgJnJlY3QsIE9EQV9EUkFXRU5USVJFLCAwKTsKICAgICBpZiAoR2V0Rm9jdXMoKSA9PSBod25kKQogICAgIExpc3RCb3hEcmF3SXRlbSAoaHduZCxscGhsLCBoZGMsIGxwbHMsICZyZWN0LCBPREFfRk9DVVMsIE9EU19GT0NVUyk7CiAgIH0KLSAgZWxzZSBGaWxsUmVjdChoZGMsICZyZWN0LCBoQnJ1c2gpOworICBlbHNlIEZpbGxSZWN0MTYoaGRjLCAmcmVjdCwgaEJydXNoKTsKICAgU2VsZWN0T2JqZWN0KGhkYyxoT2xkRm9udCk7Ci0gIEVuZFBhaW50KGh3bmQsICZwcyk7CisgIEVuZFBhaW50MTYoaHduZCwgJnBzKTsKICAgcmV0dXJuIDA7CiB9CiAKQEAgLTM1MCwxMiArMzIzLDEzIEBACiAgICAgbmV3Rm9jdXNlZCA9IGxwaGwtPkl0ZW1zQ291bnQgLSAxOwogICAKICAgTGlzdEJveFNldEN1clNlbChscGhsLCBuZXdGb2N1c2VkKTsKKyAgU2VuZE1lc3NhZ2UoaHduZCwgV01fQ09NTUFORCxJRF9DTEIsTUFLRUxPTkcoMCxDQk5fU0VMQ0hBTkdFKSk7CiAgIExpc3RCb3hTZW5kTm90aWZpY2F0aW9uKGxwaGwsIENCTl9TRUxDSEFOR0UpOwogCiAgIGxwaGwtPkl0ZW1Gb2N1c2VkID0gbmV3Rm9jdXNlZDsKICAgTGlzdEJveFNjcm9sbFRvRm9jdXMobHBobCk7CiAvKiAgU2V0U2Nyb2xsUG9zKGh3bmQsIFNCX1ZFUlQsIGxwaGwtPkZpcnN0VmlzaWJsZSwgVFJVRSk7Ki8KLSAgSW52YWxpZGF0ZVJlY3QoaHduZCwgTlVMTCwgVFJVRSk7CisgIEludmFsaWRhdGVSZWN0MzIoIGh3bmQsIE5VTEwsIFRSVUUgKTsKIAogICByZXR1cm4gMDsKIH0KQEAgLTM3NSwxMiArMzQ5LDEzIEBACiAgICAgbmV3Rm9jdXNlZCA9IGxwaGwtPkl0ZW1zQ291bnQgLSAxOwogICAKICAgTGlzdEJveFNldEN1clNlbChscGhsLCBuZXdGb2N1c2VkKTsKKyAgU2VuZE1lc3NhZ2UoaHduZCwgV01fQ09NTUFORCxJRF9DTEIsTUFLRUxPTkcoMCxDQk5fU0VMQ0hBTkdFKSk7CiAgIExpc3RCb3hTZW5kTm90aWZpY2F0aW9uKGxwaGwsIENCTl9TRUxDSEFOR0UpOwogICBscGhsLT5JdGVtRm9jdXNlZCA9IG5ld0ZvY3VzZWQ7CiAgIExpc3RCb3hTY3JvbGxUb0ZvY3VzKGxwaGwpOwogICAKIC8qICBTZXRTY3JvbGxQb3MoaHduZCwgU0JfVkVSVCwgbHBobC0+Rmlyc3RWaXNpYmxlLCBUUlVFKTsqLwotICBJbnZhbGlkYXRlUmVjdChod25kLCBOVUxMLCBUUlVFKTsKKyAgSW52YWxpZGF0ZVJlY3QzMiggaHduZCwgTlVMTCwgVFJVRSApOwogCiAgIHJldHVybiAwOwogfQpAQCAtNTIyLDcgKzQ5Nyw3IEBACiAgIGRwcmludGZfY29tYm8oc3RkZGViLCJDQlNldEN1clNlbDogaHduZCAlMDR4IHdwICV4IGxwICVseCB3UmV0ICVkXG4iLAogCQlod25kLHdQYXJhbSxsUGFyYW0sd1JldCk7CiAvKiAgU2V0U2Nyb2xsUG9zKGh3bmQsIFNCX1ZFUlQsIGxwaGwtPkZpcnN0VmlzaWJsZSwgVFJVRSk7Ki8KLSAgSW52YWxpZGF0ZVJlY3QoaHduZCwgTlVMTCwgVFJVRSk7CisgIEludmFsaWRhdGVSZWN0MzIoIGh3bmQsIE5VTEwsIFRSVUUgKTsKIAogICByZXR1cm4gd1JldDsKIH0KQEAgLTU3MywxMiArNTQ4LDE0IEBACiBzdGF0aWMgTFJFU1VMVCBDQlNldEZvbnQoSFdORCBod25kLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewogICBMUEhFQURMSVNUICBscGhsID0gQ29tYm9HZXRMaXN0SGVhZGVyKGh3bmQpOwotCisgIExQSEVBRENPTUJPIGxwaGMgPSBDb21ib0dldFN0b3JhZ2VIZWFkZXIoaHduZCk7CisgIAogICBpZiAod1BhcmFtID09IDApCiAgICAgbHBobC0+aEZvbnQgPSBHZXRTdG9ja09iamVjdChTWVNURU1fRk9OVCk7CiAgIGVsc2UKICAgICBscGhsLT5oRm9udCA9IChIRk9OVCl3UGFyYW07Ci0KKyAgaWYgKGxwaGMtPmhXbmRFZGl0KQorICAgICBTZW5kTWVzc2FnZShscGhjLT5oV25kRWRpdCxXTV9TRVRGT05ULGxwaGwtPmhGb250LDApOyAKICAgcmV0dXJuIDA7CiB9CiAKQEAgLTYyNywxNCArNjA0LDE0IEBACiBzdGF0aWMgTFJFU1VMVCBDQlNob3dEcm9wRG93bihIV05EIGh3bmQsIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7CiAgIExQSEVBRENPTUJPIGxwaGMgPSBDb21ib0dldFN0b3JhZ2VIZWFkZXIoaHduZCk7Ci0gIFJFQ1QgcmVjdDsKKyAgUkVDVDMyIHJlY3Q7CiAgIAogICBpZiAoKGxwaGMtPmR3U3R5bGUgJiAzKSA9PSBDQlNfU0lNUExFKSByZXR1cm4gTEJfRVJSOwogICAKICAgd1BhcmFtID0gISF3UGFyYW07CiAgIGlmICh3UGFyYW0gIT0gbHBoYy0+RHJvcERvd25WaXNpYmxlKSB7CiAgICAgbHBoYy0+RHJvcERvd25WaXNpYmxlID0gd1BhcmFtOwotICAgIEdldFdpbmRvd1JlY3QoaHduZCwmcmVjdCk7CisgICAgR2V0V2luZG93UmVjdDMyKGh3bmQsJnJlY3QpOwogICAgIFNldFdpbmRvd1BvcyhscGhjLT5oV25kTEJveCwgMCwgcmVjdC5sZWZ0LCByZWN0LnRvcCtscGhjLT5MQm94VG9wLCAwLCAwLAogCQkgU1dQX05PU0laRSB8ICh3UGFyYW0gPyBTV1BfU0hPV1dJTkRPVyA6IFNXUF9ISURFV0lORE9XKSk7CiAgICAgaWYgKCF3UGFyYW0pIFNldEZvY3VzKGh3bmQpOwpAQCAtNjUxLDI3ICs2MjgsMjcgQEAKICAgTFBIRUFEQ09NQk8gIGxwaGMgPSBDb21ib0dldFN0b3JhZ2VIZWFkZXIoaHduZCk7CiAgIExQSEVBRExJU1QgICBscGhsID0gQ29tYm9HZXRMaXN0SGVhZGVyKGh3bmQpOwogICBMT05HICAgICAgICAgY3N0eWxlID0gR2V0V2luZG93TG9uZyhod25kLEdXTF9TVFlMRSk7Ci0gIFJFQ1QgICAgICAgICBjUmVjdCx3UmVjdDsKKyAgUkVDVDE2ICAgICAgIGNSZWN0LHdSZWN0OwogCiAgIC8qIFRPRE8gLSBUaGUgc2l6ZSBvZiBjb21ibydzIGFuZCB0aGVpciBsaXN0Ym94ZXMgaXMgc3RpbGwgYnJva2VuICovCiAKICAgaWYgKGxwaGMtPmhXbmRMQm94ID09IDApIHJldHVybiBGQUxTRTsKIAotICBHZXRDbGllbnRSZWN0KGh3bmQsJmNSZWN0KTsKLSAgR2V0V2luZG93UmVjdChod25kLCZ3UmVjdCk7CisgIEdldENsaWVudFJlY3QxNihod25kLCZjUmVjdCk7CisgIEdldFdpbmRvd1JlY3QxNihod25kLCZ3UmVjdCk7CiAKLSAgZHByaW50Zl92eGQoc3RkZGViLCJDQkNoZWNrU2l6ZTogY1JlY3QgJWQsJWQtJWQsJWQgIHdSZWN0ICVkLCVkLSVkLCVkXG4iLAorICBkcHJpbnRmX2NvbWJvKHN0ZGRlYiwiQ0JDaGVja1NpemU6IGNSZWN0ICVkLCVkLSVkLCVkICB3UmVjdCAlZCwlZC0lZCwlZFxuIiwKIAkJY1JlY3QubGVmdCxjUmVjdC50b3AsY1JlY3QucmlnaHQsY1JlY3QuYm90dG9tLAogCQl3UmVjdC5sZWZ0LHdSZWN0LnRvcCx3UmVjdC5yaWdodCx3UmVjdC5ib3R0b20pOwotCisgIGlmICgoY3N0eWxlICYgMykgPT0gQ0JTX1NJTVBMRSAgKSByZXR1cm4gVFJVRSA7CiAgIGlmICgoY1JlY3QuYm90dG9tIC0gY1JlY3QudG9wKSA+IAogICAgICAgKGxwaGwtPlN0ZEl0ZW1IZWlnaHQgKyAyKlNZU01FVFJJQ1NfQ1lCT1JERVIpKSB7CiAgICAgU2V0V2luZG93UG9zKGh3bmQsIDAsIDAsIDAsIAogCQkgY1JlY3QucmlnaHQtY1JlY3QubGVmdCwKIAkJIGxwaGwtPlN0ZEl0ZW1IZWlnaHQrMipTWVNNRVRSSUNTX0NZQk9SREVSLCAKIAkJIFNXUF9OT01PVkUgfCBTV1BfTk9aT1JERVIgfCBTV1BfTk9SRURSQVcgfCBTV1BfTk9BQ1RJVkFURSApOwotICAgIEdldENsaWVudFJlY3QoaHduZCwmY1JlY3QpOwotICAgIEdldFdpbmRvd1JlY3QoaHduZCwmd1JlY3QpOworICAgIEdldENsaWVudFJlY3QxNihod25kLCZjUmVjdCk7CisgICAgR2V0V2luZG93UmVjdDE2KGh3bmQsJndSZWN0KTsKICAgfQogCiAgIHN3aXRjaCAoY3N0eWxlICYgMykgewpAQCAtNjkxLDEwICs2NjgsNjUgQEAKICAgICB9CiAKICAgQ0JMQ2hlY2tTaXplKGh3bmQpOwotCiAgIHJldHVybiBUUlVFOwogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBDQkNvbW1hbmQgICAgICAgIAorICovCitzdGF0aWMgTFJFU1VMVCBDQkNvbW1hbmQoSFdORCBod25kLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICBMUEhFQURDT01CTyBscGhjID0gQ29tYm9HZXRTdG9yYWdlSGVhZGVyKGh3bmQpOworICBMUEhFQURMSVNUIGxwaGwgPSBDb21ib0dldExpc3RIZWFkZXIoaHduZCk7CisgIGNoYXIgICAgICAgYnVmZmVyWzI1Nl07CisgIFdPUkQgICAgICAgbmV3Rm9jdXNlZDsKKyAgV09SRCAgICAgICBpZDsKKyAgaWYgKGxwaGMtPmhXbmRFZGl0KSAgLyogaW50ZXJkZXBlbmRlbmNlIG9ubHkgdXNlZCBmb3IgQ0JTX1NJTVBMRSBhbmQgQ0JTX0RST1BET1dOIHN0eWxlcyAqLworICB7CisgICBzd2l0Y2ggKHdQYXJhbSkKKyAgIHsKKyAgICBjYXNlIElEX0NMQjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdXBkYXRlIEVESVQgd2luZG93ICovCisgICAgICAgICAgICAgICAgaWYgKEhJV09SRChsUGFyYW0pPT1DQk5fU0VMQ0hBTkdFKQorICAgICAgICAgICAgICAgICBpZiAobHBobC0+SGFzU3RyaW5ncykKKyAgICAgICAgICAgICAgICAgeyAKKyAgICAgICAgICAgICAgICAgIExpc3RCb3hHZXRUZXh0KGxwaGwsbHBobC0+SXRlbUZvY3VzZWQsIGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICBkcHJpbnRmX2NvbWJvKHN0ZGRlYiwiQ0JDb21tYW5kOiB1cGRhdGUgRWRpdDogJXNcbiIsYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgIFNlbmRNZXNzYWdlKCBscGhjLT5oV25kRWRpdCwgV01fU0VUVEVYVCwgMCwgKExQQVJBTSlNQUtFX1NFR1BUUihidWZmZXIpKTsKKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgIGNhc2UgSURfRURJVDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVwZGF0ZSBMSVNUQk9YIHdpbmRvdyAqLworICAgICAgICAgICAgICAgICBpZD1HZXRXaW5kb3dXb3JkKGh3bmQsR1dXX0lEKTsKKyAgICAgICAgICAgICAgICAgc3dpdGNoIChISVdPUkQobFBhcmFtKSkKKyAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgY2FzZSBFTl9VUERBVEU6R2V0V2luZG93VGV4dChscGhjLT5oV25kRWRpdCxidWZmZXIsMjU1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgqYnVmZmVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0ZvY3VzZWQ9TGlzdEJveEZpbmRTdHJpbmcobHBobCwgLTEsIE1BS0VfU0VHUFRSKGJ1ZmZlcikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwcmludGZfY29tYm8oc3RkZGViLCJDQkNvbW1hbmQ6IG5ldyBzZWxlY3Rpb24gIyVkIGlzPSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0ZvY3VzZWQsYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Rm9jdXNlZCAhPSAoV09SRClMQl9FUlIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgZm91bmQgc29tZXRoaW5nICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RCb3hTZXRDdXJTZWwobHBobCwgbmV3Rm9jdXNlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RCb3hTZW5kTm90aWZpY2F0aW9uKGxwaGwsIENCTl9TRUxDSEFOR0UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZhbGlkYXRlUmVjdDMyKGh3bmQsIE5VTEwsIFRSVUUpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZW5kTWVzc2FnZShHZXRQYXJlbnQoaHduZCksV01fQ09NTUFORCxpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFLRUxPTkcoaHduZCwgQ0JOX0VESVRVUERBVEUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgY2FzZSBFTl9DSEFOR0U6U2VuZE1lc3NhZ2UoR2V0UGFyZW50KGh3bmQpLFdNX0NPTU1BTkQsaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BS0VMT05HKGh3bmQsIENCTl9FRElUQ0hBTkdFKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgRU5fRVJSU1BBQ0U6U2VuZE1lc3NhZ2UoR2V0UGFyZW50KGh3bmQpLFdNX0NPTU1BTkQsaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BS0VMT05HKGh3bmQsIENCTl9FUlJTUEFDRSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgCisgICB9CisgIH0gCisgIHJldHVybiAwOworfQorCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIENvbWJvV25kUHJvYwpAQCAtNzE1LDYgKzc0Nyw3IEBACiAgICAgIGNhc2UgV01fU0VURk9DVVM6IHJldHVybiBDQlNldEZvY3VzKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKICAgICAgY2FzZSBXTV9LSUxMRk9DVVM6IHJldHVybiBDQktpbGxGb2N1cyhod25kLCB3UGFyYW0sIGxQYXJhbSk7CiAgICAgIGNhc2UgV01fU0laRTogcmV0dXJuIENCQ2hlY2tTaXplKGh3bmQpOworICAgICBjYXNlIFdNX0NPTU1BTkQ6IHJldHVybiBDQkNvbW1hbmQoaHduZCwgd1BhcmFtLCBsUGFyYW0pOwogICAgICBjYXNlIENCX1JFU0VUQ09OVEVOVDogcmV0dXJuIENCUmVzZXRDb250ZW50KGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKICAgICAgY2FzZSBDQl9ESVI6IHJldHVybiBDQkRpcihod25kLCB3UGFyYW0sIGxQYXJhbSk7CiAgICAgIGNhc2UgQ0JfQUREU1RSSU5HOiByZXR1cm4gQ0JBZGRTdHJpbmcoaHduZCwgd1BhcmFtLCBsUGFyYW0pOwpAQCAtNzU4LDcgKzc5MSw3IEBACiAgKi8KIHN0YXRpYyBMUkVTVUxUIENCTENyZWF0ZSggSFdORCBod25kLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtICkKIHsKLSAgQ1JFQVRFU1RSVUNUICpjcmVhdGVTdHJ1Y3QgPSAoQ1JFQVRFU1RSVUNUICopUFRSX1NFR19UT19MSU4obFBhcmFtKTsKKyAgQ1JFQVRFU1RSVUNUMTYgKmNyZWF0ZVN0cnVjdCA9IChDUkVBVEVTVFJVQ1QxNiAqKVBUUl9TRUdfVE9fTElOKGxQYXJhbSk7CiAjaWZkZWYgV0lORUxJQjMyCiAgIFNldFdpbmRvd0xvbmcoaHduZCwwLChMT05HKWNyZWF0ZVN0cnVjdC0+bHBDcmVhdGVQYXJhbXMpOwogI2Vsc2UKQEAgLTgxNSwxMSArODQ4LDExIEBACiAgIAogICBMaXN0Qm94U2V0Q3VyU2VsKGxwaGwsIG5ld0ZvY3VzZWQpOwogICBMaXN0Qm94U2VuZE5vdGlmaWNhdGlvbihscGhsLCBDQk5fU0VMQ0hBTkdFKTsKLQorICBTZW5kTWVzc2FnZShHZXRQYXJlbnQoaHduZCksIFdNX0NPTU1BTkQsSURfQ0xCLE1BS0VMT05HKDAsQ0JOX1NFTENIQU5HRSkpOwogICBscGhsLT5JdGVtRm9jdXNlZCA9IG5ld0ZvY3VzZWQ7CiAgIExpc3RCb3hTY3JvbGxUb0ZvY3VzKGxwaGwpOwogICBTZXRTY3JvbGxQb3MoaHduZCwgU0JfVkVSVCwgbHBobC0+Rmlyc3RWaXNpYmxlLCBUUlVFKTsKLSAgSW52YWxpZGF0ZVJlY3QoaHduZCwgTlVMTCwgVFJVRSk7ICAKKyAgSW52YWxpZGF0ZVJlY3QzMiggaHduZCwgTlVMTCwgVFJVRSApOwogICByZXR1cm4gMDsKIH0KIApAQCAtODM4LDIwICs4NzEsMjAgQEAKIHsKICAgTFBIRUFETElTVCAgIGxwaGwgPSBDTEJveEdldExpc3RIZWFkZXIoaHduZCk7CiAgIExQTElTVFNUUlVDVCBscGxzOwotICBQQUlOVFNUUlVDVCAgcHM7CisgIFBBSU5UU1RSVUNUMTYgIHBzOwogICBIQlJVU0ggICAgICAgaEJydXNoOwogICBIRk9OVCAgICAgICAgaE9sZEZvbnQ7CiAgIFdORCAqIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGh3bmQpOwogICBIV05EICBjb21ib2h3bmQgPSBDTEJveEdldENvbWJvKGh3bmQpOwotICBIREMgCWhkYzsKLSAgUkVDVCAJcmVjdDsKKyAgSERDMTYgaGRjOworICBSRUNUMTYgcmVjdDsKICAgaW50ICAgaSwgdG9wLCBoZWlnaHQ7CiAKICAgdG9wID0gMDsKLSAgaGRjID0gQmVnaW5QYWludCggaHduZCwgJnBzICk7CisgIGhkYyA9IEJlZ2luUGFpbnQxNiggaHduZCwgJnBzICk7CiAKICAgaWYgKCFJc1dpbmRvd1Zpc2libGUoaHduZCkgfHwgIWxwaGwtPmJSZWRyYXdGbGFnKSB7Ci0gICAgRW5kUGFpbnQoaHduZCwgJnBzKTsKKyAgICBFbmRQYWludDE2KGh3bmQsICZwcyk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtODU5LDggKzg5Miw4IEBACiAgIC8qIGxpc3Rib3hlcyBzaG91bGQgYmUgd2hpdGUgKi8KICAgaEJydXNoID0gR2V0U3RvY2tPYmplY3QoV0hJVEVfQlJVU0gpOwogCi0gIEdldENsaWVudFJlY3QoaHduZCwgJnJlY3QpOwotICBGaWxsUmVjdChoZGMsICZyZWN0LCBoQnJ1c2gpOworICBHZXRDbGllbnRSZWN0MTYoaHduZCwgJnJlY3QpOworICBGaWxsUmVjdDE2KGhkYywgJnJlY3QsIGhCcnVzaCk7CiAgIENCTENoZWNrU2l6ZShod25kKTsKIAogICBscGxzID0gbHBobC0+bHBGaXJzdDsKQEAgLTkwMyw3ICs5MzYsNyBAQAogICAgICAgU2V0U2Nyb2xsUmFuZ2UoaHduZCwgU0JfVkVSVCwgMCwgTGlzdE1heEZpcnN0VmlzaWJsZShscGhsKSwgVFJVRSk7CiAKICAgU2VsZWN0T2JqZWN0KGhkYyxoT2xkRm9udCk7Ci0gIEVuZFBhaW50KCBod25kLCAmcHMgKTsKKyAgRW5kUGFpbnQxNiggaHduZCwgJnBzICk7CiAgIHJldHVybiAwOwogCiB9CkBAIC05MzQsNyArOTY3LDcgQEAKIHsKICAgTFBIRUFETElTVCBscGhsID0gQ0xCb3hHZXRMaXN0SGVhZGVyKGh3bmQpOwogICBpbnQgICAgICAgIHk7Ci0gIFJFQ1QgICAgICAgcmVjdHNlbDsKKyAgUkVDVDE2ICAgICByZWN0c2VsOwogCiAgIFNldEZvY3VzKGh3bmQpOwogICBTZXRDYXB0dXJlKGh3bmQpOwpAQCAtOTQ4LDcgKzk4MSw3IEBACiAgIExpc3RCb3hTZXRDdXJTZWwobHBobCwgeSk7CiAgIExpc3RCb3hHZXRJdGVtUmVjdChscGhsLCB5LCAmcmVjdHNlbCk7CiAKLSAgSW52YWxpZGF0ZVJlY3QoaHduZCwgTlVMTCwgVFJVRSk7CisgIEludmFsaWRhdGVSZWN0MzIoIGh3bmQsIE5VTEwsIFRSVUUgKTsKICAgcmV0dXJuIDA7CiB9CiAKQEAgLTk2OCw2ICsxMDAxLDcgQEAKICAgZWxzZSBpZiAobHBobC0+UHJldkZvY3VzZWQgIT0gbHBobC0+SXRlbUZvY3VzZWQpIAogICAgICAgICAgIHsKICAgICAgIAkJU2VuZE1lc3NhZ2UoQ0xCb3hHZXRDb21ibyhod25kKSxDQl9TRVRDVVJTRUwsbHBobC0+SXRlbUZvY3VzZWQsMCk7CisgICAgICAJCVNlbmRNZXNzYWdlKEdldFBhcmVudChod25kKSwgV01fQ09NTUFORCxJRF9DTEIsTUFLRUxPTkcoMCxDQk5fU0VMQ0hBTkdFKSk7CiAgICAgICAJCUxpc3RCb3hTZW5kTm90aWZpY2F0aW9uKGxwaGwsIENCTl9TRUxDSEFOR0UpOwogICAgICAJICB9CiAKQEAgLTk4NCwxMiArMTAxOCwxMiBAQAogICBMUEhFQURMSVNUIGxwaGwgPSBDTEJveEdldExpc3RIZWFkZXIoaHduZCk7CiAgIHNob3J0IHk7CiAgIFdPUkQgd1JldDsKLSAgUkVDVCByZWN0LCByZWN0c2VsOworICBSRUNUMTYgcmVjdCwgcmVjdHNlbDsKIAogICB5ID0gU0hJV09SRChsUGFyYW0pOwogICB3UmV0ID0gTGlzdEJveEZpbmRNb3VzZShscGhsLCBMT1dPUkQobFBhcmFtKSwgSElXT1JEKGxQYXJhbSkpOwogICBMaXN0Qm94R2V0SXRlbVJlY3QobHBobCwgd1JldCwgJnJlY3RzZWwpOwotICBHZXRDbGllbnRSZWN0KGh3bmQsICZyZWN0KTsKKyAgR2V0Q2xpZW50UmVjdDE2KGh3bmQsICZyZWN0KTsKIAogICBkcHJpbnRmX2NvbWJvKHN0ZGRlYiwiQ0JMTW91c2VNb3ZlOiBod25kICUwNHggd3AgJXggbHAgJWx4ICB5ICVkICBpZiAlZCB3cmV0ICVkICVkLCVkLSVkLCVkXG4iLAogaHduZCx3UGFyYW0sbFBhcmFtLHksbHBobC0+SXRlbUZvY3VzZWQsd1JldCxyZWN0c2VsLmxlZnQscmVjdHNlbC50b3AscmVjdHNlbC5yaWdodCxyZWN0c2VsLmJvdHRvbSk7CkBAIC0xMDAwLDcgKzEwMzQsNyBAQAogCWxwaGwtPkZpcnN0VmlzaWJsZS0tOwogCVNldFNjcm9sbFBvcyhod25kLCBTQl9WRVJULCBscGhsLT5GaXJzdFZpc2libGUsIFRSVUUpOwogCUxpc3RCb3hTZXRDdXJTZWwobHBobCwgd1JldCk7Ci0JSW52YWxpZGF0ZVJlY3QoaHduZCwgTlVMTCwgVFJVRSk7CisJSW52YWxpZGF0ZVJlY3QzMiggaHduZCwgTlVMTCwgVFJVRSApOwogCXJldHVybiAwOwogICAgICAgfQogICAgIH0KQEAgLTEwMDksMTQgKzEwNDMsMTQgQEAKIAlscGhsLT5GaXJzdFZpc2libGUrKzsKIAlTZXRTY3JvbGxQb3MoaHduZCwgU0JfVkVSVCwgbHBobC0+Rmlyc3RWaXNpYmxlLCBUUlVFKTsKIAlMaXN0Qm94U2V0Q3VyU2VsKGxwaGwsIHdSZXQpOwotCUludmFsaWRhdGVSZWN0KGh3bmQsIE5VTEwsIFRSVUUpOworCUludmFsaWRhdGVSZWN0MzIoIGh3bmQsIE5VTEwsIFRSVUUgKTsKIAlyZXR1cm4gMDsKICAgICAgIH0KICAgICB9CiAgICAgZWxzZSB7CiAgICAgICBpZiAoKHNob3J0KSB3UmV0ID09IGxwaGwtPkl0ZW1Gb2N1c2VkKSByZXR1cm4gMDsKICAgICAgIExpc3RCb3hTZXRDdXJTZWwobHBobCwgd1JldCk7Ci0gICAgICBJbnZhbGlkYXRlUmVjdChod25kLCBOVUxMLCBUUlVFKTsKKyAgICAgIEludmFsaWRhdGVSZWN0MzIoIGh3bmQsIE5VTEwsIFRSVUUgKTsKICAgICB9CiAgIH0KIApAQCAtMTA2NSw3ICsxMDk5LDcgQEAKIAogICBpZiAoeSAhPSBscGhsLT5GaXJzdFZpc2libGUpIHsKICAgICBTZXRTY3JvbGxQb3MoaHduZCwgU0JfVkVSVCwgbHBobC0+Rmlyc3RWaXNpYmxlLCBUUlVFKTsKLSAgICBJbnZhbGlkYXRlUmVjdChod25kLCBOVUxMLCBUUlVFKTsKKyAgICBJbnZhbGlkYXRlUmVjdDMyKCBod25kLCBOVUxMLCBUUlVFICk7CiAgIH0KIAogICByZXR1cm4gMDsKQEAgLTEwODEsMjYgKzExMTUsMjYgQEAKICAgTFBIRUFETElTVCAgIGxwaGwgPSBDb21ib0dldExpc3RIZWFkZXIoaHduZCk7CiAgIExQTElTVFNUUlVDVCBscGxzOwogICBIV05EICAgICAgICAgaFduZExCb3g7Ci0gIFJFQ1QgY1JlY3Qsd1JlY3QsbFJlY3QsbHdSZWN0OworICBSRUNUMTYgY1JlY3Qsd1JlY3QsbFJlY3QsbHdSZWN0OwogICBpbnQgdG90aGVpZ2h0OwogICBjaGFyIGNsYXNzTmFtZVs4MF07CiAKLSAgR2V0Q2xhc3NOYW1lKGh3bmQsY2xhc3NOYW1lLDgwKTsKKyAgR2V0Q2xhc3NOYW1lMzJBKGh3bmQsY2xhc3NOYW1lLDgwKTsKICAgZmZsdXNoKHN0ZGRlYik7CiAgIGlmIChzdHJuY21wKGNsYXNzTmFtZSwiQ09NQk9CT1giLDgpKSByZXR1cm4gRkFMU0U7CiAgIGlmICgoaFduZExCb3ggPSBscGhjLT5oV25kTEJveCkgPT0gMCkgcmV0dXJuIEZBTFNFOwotICBkcHJpbnRmX3Z4ZChzdGRkZWIsIkNCTENoZWNrU2l6ZSBoZWFkZXJzIGh3ICUwNHggIGxiICUwNHggIG5hbWUgJXNcbiIsCisgIGRwcmludGZfY29tYm8oc3RkZGViLCJDQkxDaGVja1NpemUgaGVhZGVycyBodyAlMDR4ICBsYiAlMDR4ICBuYW1lICVzXG4iLAogCQlod25kLGhXbmRMQm94LGNsYXNzTmFtZSk7CiAKLSAgR2V0Q2xpZW50UmVjdChod25kLCZjUmVjdCk7Ci0gIEdldFdpbmRvd1JlY3QoaHduZCwmd1JlY3QpOwotICBHZXRDbGllbnRSZWN0KGhXbmRMQm94LCZsUmVjdCk7Ci0gIEdldFdpbmRvd1JlY3QoaFduZExCb3gsJmx3UmVjdCk7CisgIEdldENsaWVudFJlY3QxNihod25kLCZjUmVjdCk7CisgIEdldFdpbmRvd1JlY3QxNihod25kLCZ3UmVjdCk7CisgIEdldENsaWVudFJlY3QxNihoV25kTEJveCwmbFJlY3QpOworICBHZXRXaW5kb3dSZWN0MTYoaFduZExCb3gsJmx3UmVjdCk7CiAKLSAgZHByaW50Zl92eGQoc3RkZGViLCJDQkxDaGVja1NpemU6IGluaXQgY1JlY3QgJWQsJWQtJWQsJWQgIHdSZWN0ICVkLCVkLSVkLCVkXG4iLAorICBkcHJpbnRmX2NvbWJvKHN0ZGRlYiwiQ0JMQ2hlY2tTaXplOiBpbml0IGNSZWN0ICVkLCVkLSVkLCVkICB3UmVjdCAlZCwlZC0lZCwlZFxuIiwKIAkJY1JlY3QubGVmdCxjUmVjdC50b3AsY1JlY3QucmlnaHQsY1JlY3QuYm90dG9tLAogCQl3UmVjdC5sZWZ0LHdSZWN0LnRvcCx3UmVjdC5yaWdodCx3UmVjdC5ib3R0b20pOwotICBkcHJpbnRmX3Z4ZChzdGRkZWIsIiAgICAgICAgICAgICAgICAgICBsUmVjdCAlZCwlZC0lZCwlZCAgbHdSZWN0ICVkLCVkLSVkLCVkXG4iLAorICBkcHJpbnRmX2NvbWJvKHN0ZGRlYiwiICAgICAgICAgICAgICAgICAgIGxSZWN0ICVkLCVkLSVkLCVkICBsd1JlY3QgJWQsJWQtJWQsJWRcbiIsCiAJICAgICAgbFJlY3QubGVmdCxsUmVjdC50b3AsbFJlY3QucmlnaHQsbFJlY3QuYm90dG9tLAogCSAgICAgIGx3UmVjdC5sZWZ0LGx3UmVjdC50b3AsbHdSZWN0LnJpZ2h0LGx3UmVjdC5ib3R0b20pOwogICBmZmx1c2goc3RkZGViKTsKQEAgLTExMTEsMTMgKzExNDUsMTIgQEAKIAogICAvKiBUT0RPOiBUaGlzIGlzbid0IHJlYWxseSB3aGF0IHdpbmRvd3MgZG9lcyAqLwogICBpZiAobFJlY3QuYm90dG9tLWxSZWN0LnRvcCA8IDMqbHBobC0+U3RkSXRlbUhlaWdodCkgewotICAgIGRwcmludGZfdnhkKHN0ZGRlYiwiICAgIENoYW5naW5nOyB0b3RIZWlnaHQgJWQgIFN0ZEl0ZW1IZ2h0ICVkXG4iLAorICAgIGRwcmludGZfY29tYm8oc3RkZGViLCIgICAgQ2hhbmdpbmc7IHRvdEhlaWdodCAlZCAgU3RkSXRlbUhnaHQgJWRcbiIsCiAJCXRvdGhlaWdodCxscGhsLT5TdGRJdGVtSGVpZ2h0KTsKICAgICBTZXRXaW5kb3dQb3MoaFduZExCb3gsIDAsIGxSZWN0LmxlZnQsIGxSZWN0LnRvcCwgCiAJCSBsd1JlY3QucmlnaHQtbHdSZWN0LmxlZnQsIHRvdGhlaWdodCsyKlNZU01FVFJJQ1NfQ1lCT1JERVIsIAogCQkgU1dQX05PTU9WRSB8IFNXUF9OT1pPUkRFUiB8IFNXUF9OT1JFRFJBVyB8IFNXUF9OT0FDVElWQVRFICk7CiAgIH0KLQogICByZXR1cm4gVFJVRTsKIH0KIApAQCAtMTE3NCwxMyArMTIwNywxNyBAQAogICAgIH0KICAgICBpZiAoaWRTdGF0aWMpCiAgICAgewotICAgICAgICBjaGFyIHRlbXBbMjU2XTsKICAgICAgICAgaW50IGRyaXZlID0gRFJJVkVfR2V0Q3VycmVudERyaXZlKCk7CisgICAgICAgIGNvbnN0IGNoYXIgKmN3ZCA9IERSSVZFX0dldERvc0N3ZChkcml2ZSk7CisgICAgICAgIGNoYXIgKnRlbXAgPSBTRUdQVFJfQUxMT0MoIHN0cmxlbihjd2QpICsgNCApOworICAgICAgICBpZiAoIXRlbXApIHJldHVybiBGQUxTRTsKICAgICAgICAgc3RyY3B5KCB0ZW1wLCAiQTpcXCIgKTsKICAgICAgICAgdGVtcFswXSArPSBkcml2ZTsKLSAgICAgICAgbHN0cmNweW4oIHRlbXArMywgRFJJVkVfR2V0RG9zQ3dkKGRyaXZlKSwgMjUzICk7CisgICAgICAgIHN0cmNweSggdGVtcCArIDMsIGN3ZCApOworICAgICAgICBBbnNpTG93ZXIoIHRlbXAgKTsKICAgICAgICAgU2VuZERsZ0l0ZW1NZXNzYWdlKCBoRGxnLCBpZFN0YXRpYywgV01fU0VUVEVYVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAoTFBBUkFNKU1BS0VfU0VHUFRSKHRlbXApICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgKExQQVJBTSlTRUdQVFJfR0VUKHRlbXApICk7CisgICAgICAgIFNFR1BUUl9GUkVFKHRlbXApOwogICAgIH0gCiAgICAgcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2NvbnRyb2xzL2Rlc2t0b3AuYyBiL2NvbnRyb2xzL2Rlc2t0b3AuYwppbmRleCBjMGQ0OGZiLi4xZTBjMTA2IDEwMDY0NAotLS0gYS9jb250cm9scy9kZXNrdG9wLmMKKysrIGIvY29udHJvbHMvZGVza3RvcC5jCkBAIC03OCw4ICs3OCw4IEBACiAgKi8KIHN0YXRpYyBMT05HIERFU0tUT1BfRG9FcmFzZUJrZ25kKCBIV05EIGh3bmQsIEhEQyBoZGMsIERFU0tUT1BJTkZPICppbmZvUHRyICkKIHsKLSAgICBSRUNUIHJlY3Q7Ci0gICAgR2V0Q2xpZW50UmVjdCggaHduZCwgJnJlY3QgKTsgICAgCisgICAgUkVDVDE2IHJlY3Q7CisgICAgR2V0Q2xpZW50UmVjdDE2KCBod25kLCAmcmVjdCApOyAgICAKIAogICAgIC8qIFBhaW50IGRlc2t0b3AgcGF0dGVybiAob25seSBpZiB3YWxsIHBhcGVyIGRvZXMgbm90IGNvdmVyIGV2ZXJ5dGhpbmcpICovCiAKQEAgLTkwLDcgKzkwLDcgQEAKIAkgIC8qIFNldCBjb2xvcnMgaW4gY2FzZSBwYXR0ZXJuIGlzIGEgbW9ub2Nocm9tZSBiaXRtYXAgKi8KIAlTZXRCa0NvbG9yKCBoZGMsIFJHQigwLDAsMCkgKTsKIAlTZXRUZXh0Q29sb3IoIGhkYywgR2V0U3lzQ29sb3IoQ09MT1JfQkFDS0dST1VORCkgKTsKLQlGaWxsUmVjdCggaGRjLCAmcmVjdCwgaW5mb1B0ci0+aGJydXNoUGF0dGVybiApOworCUZpbGxSZWN0MTYoIGhkYywgJnJlY3QsIGluZm9QdHItPmhicnVzaFBhdHRlcm4gKTsKICAgICB9CiAKICAgICAgIC8qIFBhaW50IHdhbGwgcGFwZXIgKi8KZGlmZiAtLWdpdCBhL2NvbnRyb2xzL2VkaXQuYyBiL2NvbnRyb2xzL2VkaXQuYwppbmRleCBkNTVjOTU0Li42YmJhOGEzIDEwMDY0NAotLS0gYS9jb250cm9scy9lZGl0LmMKKysrIGIvY29udHJvbHMvZWRpdC5jCkBAIC0xMjUsNyArMTI1LDcgQEAKIHN0YXRpYyB2b2lkICAgIEVESVRfRGVsUmlnaHQoV05EICp3bmRQdHIpOwogc3RhdGljIFVJTlQgICAgRURJVF9HZXRBdmVDaGFyV2lkdGgoV05EICp3bmRQdHIpOwogc3RhdGljIFVJTlQgICAgRURJVF9HZXRMaW5lSGVpZ2h0KFdORCAqd25kUHRyKTsKLXN0YXRpYyB2b2lkICAgIEVESVRfR2V0TGluZVJlY3QoV05EICp3bmRQdHIsIFVJTlQgbGluZSwgVUlOVCBzY29sLCBVSU5UIGVjb2wsIExQUkVDVCByYyk7CitzdGF0aWMgdm9pZCAgICBFRElUX0dldExpbmVSZWN0KFdORCAqd25kUHRyLCBVSU5UIGxpbmUsIFVJTlQgc2NvbCwgVUlOVCBlY29sLCBMUFJFQ1QxNiByYyk7CiBzdGF0aWMgY2hhciAqICBFRElUX0dldFBvaW50ZXIoV05EICp3bmRQdHIpOwogc3RhdGljIExSRVNVTFQgRURJVF9HZXRSZWN0KFdORCAqd25kUHRyLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKIHN0YXRpYyBCT09MICAgIEVESVRfR2V0UmVkcmF3KFdORCAqd25kUHRyKTsKQEAgLTcyNSw3ICs3MjUsNyBAQAogICoJY29sdW1uIHRvIGFuIGVuZGluZyBjb2x1bW4uCiAgKgogICovCi1zdGF0aWMgdm9pZCBFRElUX0dldExpbmVSZWN0KFdORCAqd25kUHRyLCBVSU5UIGxpbmUsIFVJTlQgc2NvbCwgVUlOVCBlY29sLCBMUFJFQ1QgcmMpCitzdGF0aWMgdm9pZCBFRElUX0dldExpbmVSZWN0KFdORCAqd25kUHRyLCBVSU5UIGxpbmUsIFVJTlQgc2NvbCwgVUlOVCBlY29sLCBMUFJFQ1QxNiByYykKIHsKIAlyYy0+dG9wID0gRURJVF9XbmRZRnJvbUxpbmUod25kUHRyLCBsaW5lKTsKIAlyYy0+Ym90dG9tID0gcmMtPnRvcCArIEVESVRfR2V0TGluZUhlaWdodCh3bmRQdHIpOwpAQCAtNzY0LDcgKzc2NCw3IEBACiAgKi8KIHN0YXRpYyBMUkVTVUxUIEVESVRfR2V0UmVjdChXTkQgKnduZFB0ciwgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKLQlHZXRDbGllbnRSZWN0KHduZFB0ci0+aHduZFNlbGYsIChMUFJFQ1QpbFBhcmFtKTsKKwlHZXRDbGllbnRSZWN0MTYoIHduZFB0ci0+aHduZFNlbGYsIChMUFJFQ1QxNilsUGFyYW0gKTsKIAlyZXR1cm4gMEw7CiB9CiAKQEAgLTgwMiw3ICs4MDIsNyBAQAogICovCiBzdGF0aWMgVUlOVCBFRElUX0dldFZpc2libGVMaW5lQ291bnQoV05EICp3bmRQdHIpCiB7Ci0JUkVDVCByYzsKKwlSRUNUMTYgcmM7CiAJCiAJRURJVF9HZXRSZWN0KHduZFB0ciwgMCwgKExQQVJBTSkmcmMpOwogCXJldHVybiBNQVgoMSwgTUFYKHJjLmJvdHRvbSAtIHJjLnRvcCwgMCkgLyBFRElUX0dldExpbmVIZWlnaHQod25kUHRyKSk7CkBAIC04MTYsNyArODE2LDcgQEAKICAqLwogc3RhdGljIFVJTlQgRURJVF9HZXRXbmRXaWR0aChXTkQgKnduZFB0cikKIHsKLQlSRUNUIHJjOworCVJFQ1QxNiByYzsKIAkKIAlFRElUX0dldFJlY3Qod25kUHRyLCAwLCAoTFBBUkFNKSZyYyk7CiAJcmV0dXJuIHJjLnJpZ2h0IC0gcmMubGVmdDsKQEAgLTg1NSw5ICs4NTUsOSBAQAogCVVJTlQgZWw7CiAJVUlOVCBzYzsKIAlVSU5UIGVjOwotCVJFQ1QgcmNXbmQ7Ci0JUkVDVCByY0xpbmU7Ci0JUkVDVCByY1VwZGF0ZTsKKwlSRUNUMTYgcmNXbmQ7CisJUkVDVDE2IHJjTGluZTsKKwlSRUNUMTYgcmNVcGRhdGU7CiAJVUlOVCBsOwogCiAJaWYgKGVuZCA9PSBzdGFydCApCkBAIC04ODUsMjYgKzg4NSwyNiBAQAogCUVESVRfR2V0UmVjdCh3bmRQdHIsIDAsIChMUEFSQU0pJnJjV25kKTsKIAlpZiAoc2wgPT0gZWwpIHsKIAkJRURJVF9HZXRMaW5lUmVjdCh3bmRQdHIsIHNsLCBzYywgZWMsICZyY0xpbmUpOwotCQlpZiAoSW50ZXJzZWN0UmVjdCgmcmNVcGRhdGUsICZyY1duZCwgJnJjTGluZSkpCi0JCQlJbnZhbGlkYXRlUmVjdCh3bmRQdHItPmh3bmRTZWxmLCAmcmNVcGRhdGUsIEZBTFNFKTsKKwkJaWYgKEludGVyc2VjdFJlY3QxNigmcmNVcGRhdGUsICZyY1duZCwgJnJjTGluZSkpCisJCQlJbnZhbGlkYXRlUmVjdDE2KCB3bmRQdHItPmh3bmRTZWxmLCAmcmNVcGRhdGUsIEZBTFNFICk7CiAJfSBlbHNlIHsKIAkJRURJVF9HZXRMaW5lUmVjdCh3bmRQdHIsIHNsLCBzYywKIAkJCQkoVUlOVClFRElUX0VNX0xpbmVMZW5ndGgod25kUHRyLAogCQkJCQkoVUlOVClFRElUX0VNX0xpbmVJbmRleCh3bmRQdHIsIHNsLCAwTCksIDBMKSwKIAkJCQkmcmNMaW5lKTsKLQkJaWYgKEludGVyc2VjdFJlY3QoJnJjVXBkYXRlLCAmcmNXbmQsICZyY0xpbmUpKQotCQkJSW52YWxpZGF0ZVJlY3Qod25kUHRyLT5od25kU2VsZiwgJnJjVXBkYXRlLCBGQUxTRSk7CisJCWlmIChJbnRlcnNlY3RSZWN0MTYoJnJjVXBkYXRlLCAmcmNXbmQsICZyY0xpbmUpKQorCQkJSW52YWxpZGF0ZVJlY3QxNiggd25kUHRyLT5od25kU2VsZiwgJnJjVXBkYXRlLCBGQUxTRSApOwogCQlmb3IgKGwgPSBzbCArIDEgOyBsIDwgZWwgOyBsKyspIHsKIAkJCUVESVRfR2V0TGluZVJlY3Qod25kUHRyLCBsLCAwLAogCQkJCShVSU5UKUVESVRfRU1fTGluZUxlbmd0aCh3bmRQdHIsCiAJCQkJCShVSU5UKUVESVRfRU1fTGluZUluZGV4KHduZFB0ciwgbCwgMEwpLCAwTCksCiAJCQkJJnJjTGluZSk7Ci0JCQlpZiAoSW50ZXJzZWN0UmVjdCgmcmNVcGRhdGUsICZyY1duZCwgJnJjTGluZSkpCi0JCQkJSW52YWxpZGF0ZVJlY3Qod25kUHRyLT5od25kU2VsZiwgJnJjVXBkYXRlLCBGQUxTRSk7CisJCQlpZiAoSW50ZXJzZWN0UmVjdDE2KCZyY1VwZGF0ZSwgJnJjV25kLCAmcmNMaW5lKSkKKwkJCQlJbnZhbGlkYXRlUmVjdDE2KHduZFB0ci0+aHduZFNlbGYsICZyY1VwZGF0ZSwgRkFMU0UpOwogCQl9CiAJCUVESVRfR2V0TGluZVJlY3Qod25kUHRyLCBlbCwgMCwgZWMsICZyY0xpbmUpOwotCQlpZiAoSW50ZXJzZWN0UmVjdCgmcmNVcGRhdGUsICZyY1duZCwgJnJjTGluZSkpCi0JCQlJbnZhbGlkYXRlUmVjdCh3bmRQdHItPmh3bmRTZWxmLCAmcmNVcGRhdGUsIEZBTFNFKTsKKwkJaWYgKEludGVyc2VjdFJlY3QxNigmcmNVcGRhdGUsICZyY1duZCwgJnJjTGluZSkpCisJCQlJbnZhbGlkYXRlUmVjdDE2KCB3bmRQdHItPmh3bmRTZWxmLCAmcmNVcGRhdGUsIEZBTFNFICk7CiAJfQogfQogCkBAIC0xMzQ4LDcgKzEzNDgsNyBAQAogCUVESVRfTk9USUZZX1BBUkVOVCh3bmRQdHIsIEVOX1VQREFURSk7CiAJRURJVF9XTV9TZXRSZWRyYXcod25kUHRyLCByZWRyYXcsIDBMKTsKIAlpZiAocmVkcmF3KSB7Ci0JCUludmFsaWRhdGVSZWN0KHduZFB0ci0+aHduZFNlbGYsIE5VTEwsIFRSVUUpOworCQlJbnZhbGlkYXRlUmVjdDMyKCB3bmRQdHItPmh3bmRTZWxmLCBOVUxMLCBUUlVFICk7CiAJCUVESVRfTk9USUZZX1BBUkVOVCh3bmRQdHIsIEVOX0NIQU5HRSk7CiAJfQogCXJldHVybiAwTDsKQEAgLTE4MDUsNyArMTgwNSw3IEBACiAJVUlOVCB0dyA9IEVESVRfR2V0VGV4dFdpZHRoKHduZFB0cik7CiAJSU5UIGR4OwogCUlOVCBkeTsKLQlQT0lOVCBwb3M7CisJUE9JTlQxNiBwb3M7CiAJSFJHTiBoUmduOwogCiAJaWYgKG5mdiA+PSBsYykKQEAgLTE4MjMsNyArMTgyMyw3IEBACiAJCQlHZXRVcGRhdGVSZ24od25kUHRyLT5od25kU2VsZiwgaFJnbiwgRkFMU0UpOwogCQkJVmFsaWRhdGVSZ24od25kUHRyLT5od25kU2VsZiwgMCk7CiAJCQlPZmZzZXRSZ24oaFJnbiwgZHgsIGR5KTsKLQkJCUludmFsaWRhdGVSZ24od25kUHRyLT5od25kU2VsZiwgaFJnbiwgVFJVRSk7CisJCQlJbnZhbGlkYXRlUmduKCB3bmRQdHItPmh3bmRTZWxmLCBoUmduLCBUUlVFICk7CiAJCQlEZWxldGVPYmplY3QoaFJnbik7CiAJCQlTY3JvbGxXaW5kb3cod25kUHRyLT5od25kU2VsZiwgZHgsIGR5LCBOVUxMLCBOVUxMKTsKIAkJfQpAQCAtMTgzNiw3ICsxODM2LDcgQEAKIAkJCVNldFNjcm9sbFBvcyh3bmRQdHItPmh3bmRTZWxmLCBTQl9IT1JaLAogCQkJCUVESVRfV01fSFNjcm9sbCh3bmRQdHIsIEVNX0dFVFRIVU1CLCAwTCksIFRSVUUpOwogCQlpZiAod25kUHRyLT5od25kU2VsZiA9PSBHZXRGb2N1cygpKSB7Ci0JCQlHZXRDYXJldFBvcygmcG9zKTsKKwkJCUdldENhcmV0UG9zMTYoJnBvcyk7CiAJCQlTZXRDYXJldFBvcyhwb3MueCArIGR4LCBwb3MueSArIGR5KTsKIAkJCVNob3dDYXJldCh3bmRQdHItPmh3bmRTZWxmKTsKIAkJfQpAQCAtMTg5NCw3ICsxODk0LDcgQEAKIAkJRURJVF9FTV9TZXRNb2RpZnkod25kUHRyLCBGQUxTRSwgMEwpOwogCQlFRElUX0J1aWxkTGluZURlZnMod25kUHRyKTsKIAkJaWYgKEVESVRfR2V0UmVkcmF3KHduZFB0cikpCi0JCQlJbnZhbGlkYXRlUmVjdCh3bmRQdHItPmh3bmRTZWxmLCBOVUxMLCBUUlVFKTsKKwkJCUludmFsaWRhdGVSZWN0MzIoIHduZFB0ci0+aHduZFNlbGYsIE5VTEwsIFRSVUUgKTsKIAkJRURJVF9TY3JvbGxJbnRvVmlldyh3bmRQdHIpOwogCX0KIAlyZXR1cm4gMEw7CkBAIC0yMTMwLDcgKzIxMzAsNyBAQAogCQlFRElUX05PVElGWV9QQVJFTlQod25kUHRyLCBFTl9VUERBVEUpOwogCQlFRElUX1dNX1NldFJlZHJhdyh3bmRQdHIsIHJlZHJhdywgMEwpOwogCQlpZiAocmVkcmF3KSB7Ci0JCQlJbnZhbGlkYXRlUmVjdCh3bmRQdHItPmh3bmRTZWxmLCBOVUxMLCBUUlVFKTsKKwkJCUludmFsaWRhdGVSZWN0MzIoIHduZFB0ci0+aHduZFNlbGYsIE5VTEwsIFRSVUUgKTsKIAkJCUVESVRfTk9USUZZX1BBUkVOVCh3bmRQdHIsIEVOX0NIQU5HRSk7CiAJCX0KIAl9CkBAIC0yMTc5LDcgKzIxNzksNyBAQAogICovCiBzdGF0aWMgTFJFU1VMVCBFRElUX1dNX0NyZWF0ZShXTkQgKnduZFB0ciwgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKLQlDUkVBVEVTVFJVQ1QgKmNzID0gKENSRUFURVNUUlVDVCAqKVBUUl9TRUdfVE9fTElOKGxQYXJhbSk7CisJQ1JFQVRFU1RSVUNUMTYgKmNzID0gKENSRUFURVNUUlVDVDE2ICopUFRSX1NFR19UT19MSU4obFBhcmFtKTsKIAlFRElUU1RBVEUgKmVzOwogCWNoYXIgKnRleHQ7CiAKQEAgLTIyMDcsNyArMjIwNyw4IEBACiAJCWVzLT5QYXNzd29yZENoYXIgPSAoY3MtPnN0eWxlICYgRVNfUEFTU1dPUkQpID8gJyonIDogJ1wwJzsKIAl9CiAJaWYgKCFMT0NBTF9IZWFwU2l6ZSh3bmRQdHItPmhJbnN0YW5jZSkpIHsKLQkJaWYgKCFMb2NhbEluaXQod25kUHRyLT5oSW5zdGFuY2UsIDAsIEdsb2JhbFNpemUod25kUHRyLT5oSW5zdGFuY2UpKSkgeworCQlpZiAoIUxvY2FsSW5pdCh3bmRQdHItPmhJbnN0YW5jZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWxTaXplMTYod25kUHRyLT5oSW5zdGFuY2UpKSkgewogCQkJZnByaW50ZihzdGRlcnIsICJlZGl0OiBXTV9DUkVBVEU6IGNvdWxkIG5vdCBpbml0aWFsaXplIGxvY2FsIGhlYXBcbiIpOwogCQkJcmV0dXJuIC0xTDsKIAkJfQpAQCAtMjI4MiwyMiArMjI4MywyMiBAQAogc3RhdGljIExSRVNVTFQgRURJVF9XTV9FcmFzZUJrR25kKFdORCAqd25kUHRyLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewogCUhCUlVTSCBoQnJ1c2g7Ci0JUkVDVCByYzsKKwlSRUNUMTYgcmM7CiAKIAloQnJ1c2ggPSAoSEJSVVNIKUVESVRfU0VORF9DVExDT0xPUih3bmRQdHIsIHdQYXJhbSk7CiAJaWYgKCFoQnJ1c2gpCiAJCWhCcnVzaCA9IChIQlJVU0gpR2V0U3RvY2tPYmplY3QoV0hJVEVfQlJVU0gpOwogCi0JR2V0Q2xpZW50UmVjdCh3bmRQdHItPmh3bmRTZWxmLCAmcmMpOworCUdldENsaWVudFJlY3QxNih3bmRQdHItPmh3bmRTZWxmLCAmcmMpOwogCUludGVyc2VjdENsaXBSZWN0KChIREMpd1BhcmFtLCByYy5sZWZ0LCByYy50b3AsIHJjLnJpZ2h0LCByYy5ib3R0b20pOwotCUdldENsaXBCb3goKEhEQyl3UGFyYW0sICZyYyk7CisJR2V0Q2xpcEJveDE2KChIREMpd1BhcmFtLCAmcmMpOwogCS8qCiAJICoJRklYTUU6CXNwZWNzIHNheSB0aGF0IHdlIHNob3VsZCBVbnJlYWxpemVPYmplY3QoKSB0aGUgYnJ1c2gsCiAJICoJCWJ1dCB0aGUgc3BlY3Mgb2YgVW5yZWFsaXplT2JqZWN0KCkgc2F5IHRoYXQgd2Ugc2hvdWxkbid0CiAJICoJCXVucmVhbGl6ZSBhIHN0b2NrIG9iamVjdC4gIFRoZSBkZWZhdWx0IGJydXNoIHRoYXQKIAkgKgkJRGVmV25kUHJvYygpIHJldHVybnMgaXMgLi4uIGEgc3RvY2sgb2JqZWN0LgogCSAqLwotCUZpbGxSZWN0KChIREMpd1BhcmFtLCAmcmMsIGhCcnVzaCk7CisJRmlsbFJlY3QxNigoSERDKXdQYXJhbSwgJnJjLCBoQnJ1c2gpOwogCXJldHVybiAtMUw7CiB9CiAKQEAgLTI2NDIsMjMgKzI2NDMsMjMgQEAKICAqLwogc3RhdGljIExSRVNVTFQgRURJVF9XTV9QYWludChXTkQgKnduZFB0ciwgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKLQlQQUlOVFNUUlVDVCBwczsKKwlQQUlOVFNUUlVDVDE2IHBzOwogCVVJTlQgaTsKIAlVSU5UIGZ2ID0gKFVJTlQpRURJVF9FTV9HZXRGaXJzdFZpc2libGVMaW5lKHduZFB0ciwgMCwgMEwpOwogCVVJTlQgdmxjID0gRURJVF9HZXRWaXNpYmxlTGluZUNvdW50KHduZFB0cik7CiAJVUlOVCBsYyA9IChVSU5UKUVESVRfRU1fR2V0TGluZUNvdW50KHduZFB0ciwgMCwgMEwpOwotCUhEQyBoZGM7CisJSERDMTYgaGRjOwogCUhGT05UIGhGb250OwogCUhGT05UIG9sZEZvbnQgPSAwOwotCVJFQ1QgcmM7Ci0JUkVDVCByY0xpbmU7Ci0JUkVDVCByY1JnbjsKKwlSRUNUMTYgcmM7CisJUkVDVDE2IHJjTGluZTsKKwlSRUNUMTYgcmNSZ247CiAJQk9PTCByZXYgPSBJc1dpbmRvd0VuYWJsZWQod25kUHRyLT5od25kU2VsZikgJiYKIAkJCQkoKEdldEZvY3VzKCkgPT0gd25kUHRyLT5od25kU2VsZikgfHwKIAkJCQkJKHduZFB0ci0+ZHdTdHlsZSAmIEVTX05PSElERVNFTCkpOwogCi0JaGRjID0gQmVnaW5QYWludCh3bmRQdHItPmh3bmRTZWxmLCAmcHMpOwotCUdldENsaWVudFJlY3Qod25kUHRyLT5od25kU2VsZiwgJnJjKTsKKwloZGMgPSBCZWdpblBhaW50MTYod25kUHRyLT5od25kU2VsZiwgJnBzKTsKKwlHZXRDbGllbnRSZWN0MTYod25kUHRyLT5od25kU2VsZiwgJnJjKTsKIAlJbnRlcnNlY3RDbGlwUmVjdChoZGMsIHJjLmxlZnQsIHJjLnRvcCwgcmMucmlnaHQsIHJjLmJvdHRvbSk7CiAJaEZvbnQgPSBFRElUX1dNX0dldEZvbnQod25kUHRyLCAwLCAwTCk7CiAJaWYgKGhGb250KQpAQCAtMjY2NiwxNSArMjY2NywxNSBAQAogCUVESVRfU0VORF9DVExDT0xPUih3bmRQdHIsIGhkYyk7CiAJaWYgKCFJc1dpbmRvd0VuYWJsZWQod25kUHRyLT5od25kU2VsZikpCiAJCVNldFRleHRDb2xvcihoZGMsIEdldFN5c0NvbG9yKENPTE9SX0dSQVlURVhUKSk7Ci0JR2V0Q2xpcEJveChoZGMsICZyY1Jnbik7CisJR2V0Q2xpcEJveDE2KGhkYywgJnJjUmduKTsKIAlmb3IgKGkgPSBmdiA7IGkgPD0gTUlOKGZ2ICsgdmxjLCBmdiArIGxjIC0gMSkgOyBpKysgKSB7CiAJCUVESVRfR2V0TGluZVJlY3Qod25kUHRyLCBpLCAwLCAtMSwgJnJjTGluZSk7Ci0JCWlmIChJbnRlcnNlY3RSZWN0KCZyYywgJnJjUmduLCAmcmNMaW5lKSkKKwkJaWYgKEludGVyc2VjdFJlY3QxNigmcmMsICZyY1JnbiwgJnJjTGluZSkpCiAJCQlFRElUX1BhaW50TGluZSh3bmRQdHIsIGhkYywgaSwgcmV2KTsKIAl9CiAJaWYgKGhGb250KQogCQlTZWxlY3RPYmplY3QoaGRjLCBvbGRGb250KTsKLQlFbmRQYWludCh3bmRQdHItPmh3bmRTZWxmLCAmcHMpOworCUVuZFBhaW50MTYod25kUHRyLT5od25kU2VsZiwgJnBzKTsKIAlyZXR1cm4gMEw7CiB9CiAKQEAgLTI3NjAsNyArMjc2MSw3IEBACiAJUmVsZWFzZURDKHduZFB0ci0+aHduZFNlbGYsIGhkYyk7CiAJRURJVF9CdWlsZExpbmVEZWZzKHduZFB0cik7CiAJaWYgKChCT09MKWxQYXJhbSAmJiBFRElUX0dldFJlZHJhdyh3bmRQdHIpKQotCQlJbnZhbGlkYXRlUmVjdCh3bmRQdHItPmh3bmRTZWxmLCBOVUxMLCBUUlVFKTsKKwkJSW52YWxpZGF0ZVJlY3QzMiggd25kUHRyLT5od25kU2VsZiwgTlVMTCwgVFJVRSApOwogCWlmICh3bmRQdHItPmh3bmRTZWxmID09IEdldEZvY3VzKCkpIHsKIAkJRGVzdHJveUNhcmV0KCk7CiAJCUNyZWF0ZUNhcmV0KHduZFB0ci0+aHduZFNlbGYsIDAsIDIsIEVESVRfR2V0TGluZUhlaWdodCh3bmRQdHIpKTsKQEAgLTI4MTUsNyArMjgxNiw3IEBACiAJCQkJKHdQYXJhbSA9PSBTSVpFX1JFU1RPUkVEKSkpIHsKIAkJaWYgKElzTXVsdGlMaW5lKHduZFB0cikgJiYgSXNXb3JkV3JhcCh3bmRQdHIpKQogCQkJRURJVF9CdWlsZExpbmVEZWZzKHduZFB0cik7Ci0JCUludmFsaWRhdGVSZWN0KHduZFB0ci0+aHduZFNlbGYsIE5VTEwsIFRSVUUpOworCQlJbnZhbGlkYXRlUmVjdDMyKCB3bmRQdHItPmh3bmRTZWxmLCBOVUxMLCBUUlVFICk7CiAJfQogCXJldHVybiAwTDsKIH0KZGlmZiAtLWdpdCBhL2NvbnRyb2xzL2xpc3Rib3guYyBiL2NvbnRyb2xzL2xpc3Rib3guYwppbmRleCBiNmQzMWMwLi45ZTQwY2JhIDEwMDY0NAotLS0gYS9jb250cm9scy9saXN0Ym94LmMKKysrIGIvY29udHJvbHMvbGlzdGJveC5jCkBAIC0yNyw3ICsyNyw3IEBACiAjaW5jbHVkZSAiZG9zX2ZzLmgiCiAjaW5jbHVkZSAiZHJpdmUuaCIKICNpbmNsdWRlICJmaWxlLmgiCi0jaW5jbHVkZSAic3RhY2tmcmFtZS5oIgorI2luY2x1ZGUgImhlYXAuaCIKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAieG1hbGxvYy5oIgpAQCAtMTE3LDcgKzExNyw3IEBACiAgIGlmIChscGhsLT5Pd25lckRyYXduKSB7CiAgICAgTElTVFNUUlVDVCBkdW1teWxzOwogICAgIAotICAgIGxwaGwtPmhEcmF3SXRlbVN0cnVjdCA9IFVTRVJfSEVBUF9BTExPQyhzaXplb2YoRFJBV0lURU1TVFJVQ1QpKTsKKyAgICBscGhsLT5oRHJhd0l0ZW1TdHJ1Y3QgPSBVU0VSX0hFQVBfQUxMT0Moc2l6ZW9mKERSQVdJVEVNU1RSVUNUMTYpKTsKICAgICBscGhsLT5uZWVkTWVhc3VyZSA9IFRSVUU7CiAgICAgZHVtbXlscy5taXMuQ3RsVHlwZSAgICA9IGxwaGwtPkRyYXdDdGxUeXBlOwogICAgIGR1bW15bHMubWlzLkN0bElEICAgICAgPSBscGhsLT5DdGxJRDsKQEAgLTE4Nyw5ICsxODcsNyBAQAogICAgIFNldFNjcm9sbFJhbmdlKGh3bmQsIFNCX0hPUlosIDEsIGxwaGwtPkl0ZW1zVmlzaWJsZSAvCiAJCSAgIGxwaGwtPkl0ZW1zUGVyQ29sdW1uICsgMSwgVFJVRSk7CiAKLSAgaWYgKHJlcGFpbnQgJiYgbHBobC0+YlJlZHJhd0ZsYWcpIHsKLSAgICBJbnZhbGlkYXRlUmVjdChod25kLCBOVUxMLCBUUlVFKTsKLSAgfQorICBpZiAocmVwYWludCAmJiBscGhsLT5iUmVkcmF3RmxhZykgSW52YWxpZGF0ZVJlY3QzMiggaHduZCwgTlVMTCwgVFJVRSApOwogfQogCiAvKiBSZXR1cm5zOiAwIGlmIG5vdGhpbmcgbmVlZHMgdG8gYmUgY2hhbmdlZCAqLwpAQCAtMjM3LDEwICsyMzUsMTAgQEAKIAogCiB2b2lkIExpc3RCb3hEcmF3SXRlbSAoSFdORCBod25kLCBMUEhFQURMSVNUIGxwaGwsIEhEQyBoZGMsIExQTElTVFNUUlVDVCBscGxzLCAKLQkJICAgICAgUkVDVCAqcmVjdCwgV09SRCBpdGVtQWN0aW9uLCBXT1JEIGl0ZW1TdGF0ZSkKKwkJICAgICAgUkVDVDE2ICpyZWN0LCBXT1JEIGl0ZW1BY3Rpb24sIFdPUkQgaXRlbVN0YXRlKQogewogICBpZiAobHBobC0+T3duZXJEcmF3bikgewotICAgIERSQVdJVEVNU1RSVUNUICAgKmRpcyA9IFVTRVJfSEVBUF9MSU5fQUREUihscGhsLT5oRHJhd0l0ZW1TdHJ1Y3QpOworICAgIERSQVdJVEVNU1RSVUNUMTYgICAqZGlzID0gVVNFUl9IRUFQX0xJTl9BRERSKGxwaGwtPmhEcmF3SXRlbVN0cnVjdCk7CiAKICAgICBkaXMtPkN0bElEICAgID0gbHBscy0+bWlzLkN0bElEOwogICAgIGRpcy0+Q3RsVHlwZSAgPSBscGxzLT5taXMuQ3RsVHlwZTsKQEAgLTI2Miw3ICsyNjAsNyBAQAogCiAgICAgICBpZiAoaXRlbVN0YXRlICE9IDApIHsKIAlkd09sZFRleHRDb2xvciA9IFNldFRleHRDb2xvcihoZGMsIDB4MDBGRkZGRkZMKTsKLQlGaWxsUmVjdChoZGMsIHJlY3QsIEdldFN0b2NrT2JqZWN0KEJMQUNLX0JSVVNIKSk7CisJRmlsbFJlY3QxNihoZGMsIHJlY3QsIEdldFN0b2NrT2JqZWN0KEJMQUNLX0JSVVNIKSk7CiAgICAgICB9CiAKICAgICAgIGlmIChscGhsLT5kd1N0eWxlICYgTEJTX1VTRVRBQlNUT1BTKSB7CkBAIC0yNzAsOCArMjY4LDggQEAKIAkJICAgICAgKGNoYXIgKilscGxzLT5pdGVtVGV4dCwgc3RybGVuKChjaGFyICopbHBscy0+aXRlbVRleHQpLCAKIAkJICAgICAgbHBobC0+aU51bVN0b3BzLCBscGhsLT5UYWJTdG9wcywgMCk7CiAgICAgICB9IGVsc2UgewotCVRleHRPdXQoaGRjLCByZWN0LT5sZWZ0ICsgNSwgcmVjdC0+dG9wICsgMiwKLQkJKGNoYXIgKilscGxzLT5pdGVtVGV4dCwgc3RybGVuKChjaGFyICopbHBscy0+aXRlbVRleHQpKTsKKwlUZXh0T3V0MTYoaGRjLCByZWN0LT5sZWZ0ICsgNSwgcmVjdC0+dG9wICsgMiwKKyAgICAgICAgICAgICAgICAgIChjaGFyICopbHBscy0+aXRlbVRleHQsIHN0cmxlbigoY2hhciAqKWxwbHMtPml0ZW1UZXh0KSk7CiAgICAgICB9CiAKICAgICAgIGlmIChpdGVtU3RhdGUgIT0gMCkgewpAQCAtMjc5LDcgKzI3Nyw3IEBACiAgICAgICB9CiAgICAgICAKICAgICAgIFNldEJrTW9kZShoZGMsIE9sZEJrTW9kZSk7Ci0gICAgfSBlbHNlIERyYXdGb2N1c1JlY3QoaGRjLCByZWN0KTsKKyAgICB9IGVsc2UgRHJhd0ZvY3VzUmVjdDE2KGhkYywgcmVjdCk7CiAgIH0KIAogICByZXR1cm47CkBAIC0yOTAsNyArMjg4LDcgQEAKIHsKICAgTFBMSVNUU1RSVUNUIGxwbHMgPSBscGhsLT5scEZpcnN0OwogICBpbnQgICAgICAgICAgaSwgajsKLSAgUE9JTlQgICAgICAgIHBvaW50OworICBQT0lOVDE2ICAgICAgcG9pbnQ7CiAgIAogICBwb2ludC54ID0gWDsgcG9pbnQueSA9IFk7CiAgIGlmIChscGhsLT5JdGVtc0NvdW50ID09IDApIHJldHVybiBMQl9FUlI7CkBAIC0zMDEsNyArMjk5LDcgQEAKICAgfQogICBmb3IoaiA9IDA7IGogPCBscGhsLT5JdGVtc1Zpc2libGU7IGkrKywgaisrKSB7CiAgICAgaWYgKGxwbHMgPT0gTlVMTCkgcmV0dXJuIExCX0VSUjsKLSAgICBpZiAoUHRJblJlY3QoJmxwbHMtPml0ZW1SZWN0LHBvaW50KSkgeworICAgIGlmIChQdEluUmVjdDE2KCZscGxzLT5pdGVtUmVjdCxwb2ludCkpIHsKICAgICAgIHJldHVybiBpOwogICAgIH0KICAgICBscGxzID0gbHBscy0+bHBOZXh0OwpAQCAtMzQ5LDcgKzM0Nyw3IEBACiAgIGxwbHNuZXctPm1pcy5pdGVtSGVpZ2h0ID0gbHBobC0+U3RkSXRlbUhlaWdodDsKICAgbHBsc25ldy0+bWlzLml0ZW1XaWR0aCAgPSAwOyAvKiBpZ25vcmVkICovCiAgIGxwbHNuZXctPm1pcy5pdGVtRGF0YSAgID0gMDsKLSAgU2V0UmVjdCgmbHBsc25ldy0+aXRlbVJlY3QsIDAsIDAsIDAsIDApOworICBTZXRSZWN0RW1wdHkxNiggJmxwbHNuZXctPml0ZW1SZWN0ICk7CiAKICAgcmV0dXJuIGxwbHNuZXc7CiB9CkBAIC01OTgsNyArNTk2LDggQEAKICAgICBscGxzLT5pdGVtU3RhdGUgPSAwOwogICB9CiAKLSAgaWYgKHdJbmRleCAhPSAoVUlOVCktMSkgeworICBpZiAoKHdJbmRleCAhPSAoVUlOVCktMSkgJiYgKHdJbmRleCA8IGxwaGwtPkl0ZW1zQ291bnQpKQorICB7CiAgICAgbHBobC0+SXRlbUZvY3VzZWQgPSB3SW5kZXg7CiAgICAgbHBscyA9IExpc3RCb3hHZXRJdGVtKGxwaGwsIHdJbmRleCk7CiAgICAgaWYgKGxwbHMgPT0gMCkgcmV0dXJuIExCX0VSUjsKQEAgLTcxNCw3ICs3MTMsNyBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGRpbWVuc2lvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1pbnQgTGlzdEJveEdldEl0ZW1SZWN0KExQSEVBRExJU1QgbHBobCwgV09SRCB3SW5kZXgsIExQUkVDVCBscHJlY3QpCitpbnQgTGlzdEJveEdldEl0ZW1SZWN0KExQSEVBRExJU1QgbHBobCwgV09SRCB3SW5kZXgsIExQUkVDVDE2IGxwcmVjdCkKIHsKICAgTFBMSVNUU1RSVUNUIGxwbHMgPSBMaXN0Qm94R2V0SXRlbShscGhsLHdJbmRleCk7CiAKQEAgLTc3MywxNCArNzcyLDE0IEBACiB7CiAgIExQSEVBRExJU1QgICBscGhsOwogICBMT05HCSAgICAgICBkd1N0eWxlID0gR2V0V2luZG93TG9uZyhod25kLEdXTF9TVFlMRSk7Ci0gIFJFQ1QgcmVjdDsKKyAgUkVDVDE2IHJlY3Q7CiAKICAgQ3JlYXRlTGlzdEJveFN0cnVjdChod25kLCBPRFRfTElTVEJPWCwgZHdTdHlsZSwgR2V0UGFyZW50KGh3bmQpKTsKICAgbHBobCA9IExpc3RCb3hHZXRTdG9yYWdlSGVhZGVyKGh3bmQpOwogICBkcHJpbnRmX2xpc3Rib3goc3RkZGViLCJMaXN0Qm94IGNyZWF0ZWQ6IGxwaGwgPSAlcCBkd1N0eWxlID0gJTA0eDolMDR4XG4iLCAKIAkJCSAgbHBobCwgSElXT1JEKGR3U3R5bGUpLCBMT1dPUkQoZHdTdHlsZSkpOwogCi0gIEdldENsaWVudFJlY3QoaHduZCwmcmVjdCk7CisgIEdldENsaWVudFJlY3QxNihod25kLCZyZWN0KTsKICAgbHBobC0+Q29sdW1uc1dpZHRoID0gcmVjdC5yaWdodCAtIHJlY3QubGVmdDsKIAogICBpZiAoZHdTdHlsZSAmIFdTX1ZTQ1JPTEwpIApAQCAtODUwLDcgKzg0OSw3IEBACiAKICAgaWYgKHkgIT0gbHBobC0+Rmlyc3RWaXNpYmxlKSB7CiAgICAgU2V0U2Nyb2xsUG9zKGh3bmQsIFNCX1ZFUlQsIGxwaGwtPkZpcnN0VmlzaWJsZSwgVFJVRSk7Ci0gICAgSW52YWxpZGF0ZVJlY3QoaHduZCwgTlVMTCwgVFJVRSk7CisgICAgSW52YWxpZGF0ZVJlY3QzMiggaHduZCwgTlVMTCwgVFJVRSApOwogICB9CiAgIHJldHVybiAwOwogfQpAQCAtOTA2LDcgKzkwNSw3IEBACiAgICAgaWYgKHkgIT0gbHBobC0+Rmlyc3RWaXNpYmxlKSB7CiAgICAgICBTZXRTY3JvbGxQb3MoaHduZCwgU0JfSE9SWiwgbHBobC0+Rmlyc3RWaXNpYmxlIC8gCiAJCSAgIGxwaGwtPkl0ZW1zUGVyQ29sdW1uICsgMSwgVFJVRSk7Ci0gICAgICBJbnZhbGlkYXRlUmVjdChod25kLCBOVUxMLCBUUlVFKTsKKyAgICAgIEludmFsaWRhdGVSZWN0MzIoIGh3bmQsIE5VTEwsIFRSVUUgKTsKICAgICB9CiAgIH0KICAgcmV0dXJuIDA7CkBAIC05MjAsOSArOTE5LDcgQEAKICAgTFBIRUFETElTVCBscGhsID0gTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoaHduZCk7CiAgIFdPUkQgICAgICAgd1JldDsKICAgaW50ICAgICAgICB5LG47Ci0gIFJFQ1QgICAgICAgcmVjdHNlbDsKLSAgUE9JTlQgICAgICB0bXBQT0lOVDsKLSAgdG1wUE9JTlQueCA9IExPV09SRChsUGFyYW0pOyB0bXBQT0lOVC55ID0gSElXT1JEKGxQYXJhbSk7CisgIFJFQ1QxNiAgICAgcmVjdHNlbDsKIAogICBTZXRGb2N1cyhod25kKTsKICAgU2V0Q2FwdHVyZShod25kKTsKQEAgLTk1Nyw3ICs5NTQsNyBAQAogICAgICAgICAgICAgICAgICAgIGxwbHMtPml0ZW1TdGF0ZSA9IE9EU19GT0NVUyB8IE9EU19TRUxFQ1RFRDsKIAogICAgICAgICAgICAgICAgICAgIGlmKCBuID4gMSAmJiBuICE9IExCX0VSUiApCi0gICAgICAgICAgICAgICAgICAgICBJbnZhbGlkYXRlUmVjdChod25kLE5VTEwsVFJVRSk7CisgICAgICAgICAgICAgICAgICAgICBJbnZhbGlkYXRlUmVjdDMyKCBod25kLE5VTEwsVFJVRSApOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKQEAgLTk3OCwxNyArOTc1LDE3IEBACiAgaWYoIGxwaGwtPmR3U3R5bGUgJiBMQlNfTVVMVElQTEVTRUwgfHwgeSE9bHBobC0+UHJldkZvY3VzZWQgKQogICAgewogICAgICBMaXN0Qm94R2V0SXRlbVJlY3QobHBobCwgeSwgJnJlY3RzZWwpOwotICAgICBJbnZhbGlkYXRlUmVjdChod25kLCAmcmVjdHNlbCwgVFJVRSk7CisgICAgIEludmFsaWRhdGVSZWN0MTYoIGh3bmQsICZyZWN0c2VsLCBUUlVFICk7CiAgICB9CiAgaWYoIGxwaGwtPlByZXZGb2N1c2VkIT0tMSAmJiB5IT1scGhsLT5QcmV2Rm9jdXNlZCApIAogICAgewogICAgICBMaXN0Qm94R2V0SXRlbVJlY3QobHBobCwgbHBobC0+UHJldkZvY3VzZWQsICZyZWN0c2VsKTsKLSAgICAgSW52YWxpZGF0ZVJlY3QoaHduZCwgJnJlY3RzZWwsIFRSVUUpOworICAgICBJbnZhbGlkYXRlUmVjdDE2KCBod25kLCAmcmVjdHNlbCwgVFJVRSApOwogICAgfQogCiAjaWZuZGVmIFdJTkVMSUIKICAgaWYgKEdldFdpbmRvd0xvbmcobHBobC0+aFNlbGYsR1dMX0VYU1RZTEUpICYgV1NfRVhfRFJBR0RFVEVDVCkKLSAgICAgaWYoIERyYWdEZXRlY3QobHBobC0+aFNlbGYsdG1wUE9JTlQpICkKKyAgICAgaWYoIERyYWdEZXRlY3QobHBobC0+aFNlbGYsTUFLRVBPSU5UMTYobFBhcmFtKSkgKQogICAgICAgICAgU2VuZE1lc3NhZ2UobHBobC0+aFBhcmVudCwgV01fQkVHSU5EUkFHLDAsMEwpOwogI2VuZGlmCiAgIHJldHVybiAwOwpAQCAtMTAzNiw3ICsxMDMzLDcgQEAKICAgTFBIRUFETElTVCBscGhsID0gTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoaHduZCk7CiAgIGludCAgeSxyZWRyYXdfcHJldiA9IDA7CiAgIGludCAgaVJldDsKLSAgUkVDVCByZWN0LCByZWN0c2VsOyAgIC8qIFhYWCBCcm9rZW4gKi8KKyAgUkVDVDE2IHJlY3QsIHJlY3RzZWw7ICAgLyogWFhYIEJyb2tlbiAqLwogCiAgIGRwcmludGZfbGlzdGJveChzdGRkZWIsIkxCTW91c2VNb3ZlICVkICVkXG4iLFNMT1dPUkQobFBhcmFtKSxTSElXT1JEKGxQYXJhbSkpOwogICBpZiAoKHdQYXJhbSAmIE1LX0xCVVRUT04pICE9IDApIHsKQEAgLTEwNDUsMTYgKzEwNDIsMTYgQEAKICAgICAgIGlmIChscGhsLT5GaXJzdFZpc2libGUgPiAwKSB7CiAJbHBobC0+Rmlyc3RWaXNpYmxlLS07CiAJU2V0U2Nyb2xsUG9zKGh3bmQsIFNCX1ZFUlQsIGxwaGwtPkZpcnN0VmlzaWJsZSwgVFJVRSk7Ci0JSW52YWxpZGF0ZVJlY3QoaHduZCwgTlVMTCwgVFJVRSk7CisJSW52YWxpZGF0ZVJlY3QzMiggaHduZCwgTlVMTCwgVFJVRSApOwogCXJldHVybiAwOwogICAgICAgfQogICAgIH0KLSAgICBHZXRDbGllbnRSZWN0KGh3bmQsICZyZWN0KTsKKyAgICBHZXRDbGllbnRSZWN0MTYoaHduZCwgJnJlY3QpOwogICAgIGlmICh5ID49IChyZWN0LmJvdHRvbS1MQk1NX0VER0UpKSB7CiAgICAgICBpZiAobHBobC0+Rmlyc3RWaXNpYmxlIDwgTGlzdE1heEZpcnN0VmlzaWJsZShscGhsKSkgewogCWxwaGwtPkZpcnN0VmlzaWJsZSsrOwogCVNldFNjcm9sbFBvcyhod25kLCBTQl9WRVJULCBscGhsLT5GaXJzdFZpc2libGUsIFRSVUUpOwotCUludmFsaWRhdGVSZWN0KGh3bmQsIE5VTEwsIFRSVUUpOworCUludmFsaWRhdGVSZWN0MzIoIGh3bmQsIE5VTEwsIFRSVUUgKTsKIAlyZXR1cm4gMDsKICAgICAgIH0KICAgICAgIH0KQEAgLTEwODQsMTAgKzEwODEsMTAgQEAKICAgICAgICAgaWYoIGxwaGwtPlByZXZGb2N1c2VkIT0tMSAmJiByZWRyYXdfcHJldiApCiAgICAgICAgICAgewogICAgICAgICAgICAgTGlzdEJveEdldEl0ZW1SZWN0KGxwaGwsIGxwaGwtPlByZXZGb2N1c2VkLCAmcmVjdHNlbCk7Ci0gICAgICAgICAgICBJbnZhbGlkYXRlUmVjdChod25kLCAmcmVjdHNlbCwgVFJVRSk7CisgICAgICAgICAgICBJbnZhbGlkYXRlUmVjdDE2KCBod25kLCAmcmVjdHNlbCwgVFJVRSApOwogICAgICAgICAgIH0KICAgICAgICAgTGlzdEJveEdldEl0ZW1SZWN0KGxwaGwsIGlSZXQsICZyZWN0c2VsKTsKLQlJbnZhbGlkYXRlUmVjdChod25kLCAmcmVjdHNlbCwgVFJVRSk7CisJSW52YWxpZGF0ZVJlY3QxNiggaHduZCwgJnJlY3RzZWwsIFRSVUUgKTsKICAgICAgIH0KICAgICB9CiAgIH0KQEAgLTExMDQsNyArMTEwMSw3IEBACiB7CiAgIExQSEVBRExJU1QgbHBobCA9IExpc3RCb3hHZXRTdG9yYWdlSGVhZGVyKGh3bmQpOwogICBXT1JEICAgICAgIG5ld0ZvY3VzZWQgPSAweEZGRkY7Ci0gIFJFQ1QJICAgICByZWN0OworICBSRUNUMTYgICAgIHJlY3Q7CiAKICAgTGlzdEJveEdldEl0ZW1SZWN0KGxwaGwsbHBobC0+SXRlbUZvY3VzZWQsJnJlY3QpOwogICBzd2l0Y2god1BhcmFtKSAKQEAgLTExOTcsMTQgKzExOTQsMTQgQEAKIAogICBpZiggTGlzdEJveFNjcm9sbFRvRm9jdXMobHBobCkgfHwgKGxwaGwtPmR3U3R5bGUgJiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgKExCU19NVUxUSVBMRVNFTCB8IExCU19FWFRFTkRFRFNFTCkpICkKLSAgSW52YWxpZGF0ZVJlY3QoaHduZCwgTlVMTCwgVFJVRSk7CisgIEludmFsaWRhdGVSZWN0MzIoIGh3bmQsIE5VTEwsIFRSVUUgKTsKICAgZWxzZQogICAgIHsKLQlJbnZhbGlkYXRlUmVjdChod25kLCAmcmVjdCwgVFJVRSk7CisJSW52YWxpZGF0ZVJlY3QxNiggaHduZCwgJnJlY3QsIFRSVUUgKTsKIAlpZiggbmV3Rm9jdXNlZCA8IDB4ODAwMCApCiAgICAgICAgICAgewogCSAgIExpc3RCb3hHZXRJdGVtUmVjdChscGhsLCBuZXdGb2N1c2VkLCAmcmVjdCk7Ci0JICAgSW52YWxpZGF0ZVJlY3QoaHduZCwgJnJlY3QsIFRSVUUpOworCSAgIEludmFsaWRhdGVSZWN0MTYoIGh3bmQsICZyZWN0LCBUUlVFICk7CiAgICAgICAgICAgfQogICAgIH0KIApAQCAtMTI0Niw3ICsxMjQzLDcgQEAKICAgTGlzdEJveFNjcm9sbFRvRm9jdXMobHBobCk7CiAgIFNldFNjcm9sbFBvcyhod25kLCBTQl9WRVJULCBscGhsLT5GaXJzdFZpc2libGUsIFRSVUUpOwogCi0gIEludmFsaWRhdGVSZWN0KGh3bmQsIE5VTEwsIFRSVUUpOworICBJbnZhbGlkYXRlUmVjdDMyKCBod25kLCBOVUxMLCBUUlVFICk7CiAKICAgcmV0dXJuIDA7CiB9CkBAIC0xMzAxLDI0ICsxMjk4LDI0IEBACiB7CiAgIExQSEVBRExJU1QgICBscGhsID0gTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoaHduZCk7CiAgIExQTElTVFNUUlVDVCBscGxzOwotICBQQUlOVFNUUlVDVCAgcHM7CisgIFBBSU5UU1RSVUNUMTYgcHM7CiAgIEhCUlVTSCAgICAgICBoQnJ1c2g7CiAgIEhGT05UICAgICAgICBoT2xkRm9udDsKLSAgSERDICAgaGRjICAgID0gQmVnaW5QYWludCggaHduZCwgJnBzICk7CisgIEhEQzE2IGhkYyAgICA9IEJlZ2luUGFpbnQxNiggaHduZCwgJnBzICk7CiAgIERDICAgICpkYyAgICA9IChEQyAqKUdESV9HZXRPYmpQdHIoaGRjLCBEQ19NQUdJQyk7Ci0gIFJFQ1QgIHJlY3QsIHBhaW50UmVjdCwgc2NyYXRjaFJlY3Q7CisgIFJFQ1QxNiAgcmVjdCwgcGFpbnRSZWN0LCBzY3JhdGNoUmVjdDsKICAgaW50ICAgaSwgdG9wLCBoZWlnaHQsIG1heHdpZHRoLCBpcGM7CiAKICAgdG9wID0gMDsKIAogICBpZiAoIUlzV2luZG93VmlzaWJsZShod25kKSB8fCAhbHBobC0+YlJlZHJhd0ZsYWcpIHsKLSAgICBFbmRQYWludChod25kLCAmcHMpOworICAgIEVuZFBhaW50MTYoaHduZCwgJnBzKTsKICAgICByZXR1cm4gMDsKICAgfQogCi0gIEdldFJnbkJveChkYy0+dy5oR0NDbGlwUmduLCZwYWludFJlY3QpOwotICBHZXRDbGllbnRSZWN0KGh3bmQsICZyZWN0KTsKLSAgSW50ZXJzZWN0UmVjdCgmcGFpbnRSZWN0LCZyZWN0LCZwYWludFJlY3QpOworICBHZXRSZ25Cb3gxNihkYy0+dy5oR0NDbGlwUmduLCZwYWludFJlY3QpOworICBHZXRDbGllbnRSZWN0MTYoaHduZCwgJnJlY3QpOworICBJbnRlcnNlY3RSZWN0MTYoJnBhaW50UmVjdCwmcmVjdCwmcGFpbnRSZWN0KTsKIAogICBoT2xkRm9udCA9IFNlbGVjdE9iamVjdChoZGMsIGxwaGwtPmhGb250KTsKIApAQCAtMTMzMiw3ICsxMzI5LDcgQEAKIAogICBpZiAoaEJydXNoID09IDApIGhCcnVzaCA9IEdldFN0b2NrT2JqZWN0KFdISVRFX0JSVVNIKTsKIAotICBGaWxsUmVjdChoZGMsICZyZWN0LCBoQnJ1c2gpOworICBGaWxsUmVjdDE2KGhkYywgJnJlY3QsIGhCcnVzaCk7CiAKICAgbWF4d2lkdGggPSByZWN0LnJpZ2h0OwogICBpZiAobHBobC0+ZHdTdHlsZSAmIExCU19NVUxUSUNPTFVNTikgewpAQCAtMTM2Nyw3ICsxMzY0LDcgQEAKICAgICAgIGxwbHMtPml0ZW1SZWN0LmxlZnQgICA9IHJlY3QubGVmdDsKICAgICAgIGxwbHMtPml0ZW1SZWN0LnJpZ2h0ICA9IHJlY3QucmlnaHQ7CiAKLSAgICAgIGlmKCBJbnRlcnNlY3RSZWN0KCZzY3JhdGNoUmVjdCwmcGFpbnRSZWN0LCZscGxzLT5pdGVtUmVjdCkgKQorICAgICAgaWYoIEludGVyc2VjdFJlY3QxNigmc2NyYXRjaFJlY3QsJnBhaW50UmVjdCwmbHBscy0+aXRlbVJlY3QpICkKICAgICAgICB7CiAgICAgICAgIGRwcmludGZfbGlzdGJveChzdGRkZWIsIkxCUGFpbnQ6IGRyYXdpbmcgaXRlbTogJWQgJWQgJWQgJWQgJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LmxlZnQsdG9wLHJlY3QucmlnaHQsdG9wK2hlaWdodCxscGxzLT5pdGVtU3RhdGUpOwpAQCAtMTM5NCw3ICsxMzkxLDcgQEAKICAgfQogICBMaXN0Qm94VXBkYXRlV2luZG93KGh3bmQsbHBobCxGQUxTRSk7CiAgIFNlbGVjdE9iamVjdChoZGMsaE9sZEZvbnQpOwotICBFbmRQYWludCggaHduZCwgJnBzICk7CisgIEVuZFBhaW50MTYoIGh3bmQsICZwcyApOwogICByZXR1cm4gMDsKIH0KIApAQCAtMTQ1NCw3ICsxNDUxLDcgQEAKICAgICAgICAgICAgICBkcHJpbnRmX2xpc3Rib3goc3RkZGViLCJMQktpbGxGb2N1czogbm8gZm9jdXNlZCBpdGVtIVxuIik7CiAgICAgIH0KICAgZWxzZQotICAgICBJbnZhbGlkYXRlUmVjdChod25kLCBOVUxMLCBUUlVFKTsKKyAgICAgSW52YWxpZGF0ZVJlY3QzMiggaHduZCwgTlVMTCwgVFJVRSApOwogCiAgIExpc3RCb3hTZW5kTm90aWZpY2F0aW9uKGxwaGwsIExCTl9LSUxMRk9DVVMpOwogCkBAIC0xNzM1LDcgKzE3MzIsNyBAQAogICAgICAgICAgTGlzdEJveFNldEN1clNlbChscGhsLGlSZXQpOwogCiAgICAgICBscGhsLT5JdGVtRm9jdXNlZCA9IGlSZXQ7Ci0gICAgICBJbnZhbGlkYXRlUmVjdChod25kLDAsVFJVRSk7CisgICAgICBJbnZhbGlkYXRlUmVjdDMyKCBod25kLCAwLCBUUlVFICk7CiAgICAgfQogICByZXR1cm4gaVJldDsKIH0KQEAgLTE3OTMsNyArMTc5MCw3IEBACiAKICAgU2V0U2Nyb2xsUG9zKGh3bmQsIFNCX1ZFUlQsIGxwaGwtPkZpcnN0VmlzaWJsZSwgVFJVRSk7CiAgIGlmKGkpCi0gICAgSW52YWxpZGF0ZVJlY3QoaHduZCwgTlVMTCwgVFJVRSk7CisgICAgSW52YWxpZGF0ZVJlY3QzMiggaHduZCwgTlVMTCwgVFJVRSApOwogIAogICByZXR1cm4gMTsKIH0KQEAgLTE4MDUsNyArMTgwMiw3IEBACiB7CiAgIExQSEVBRExJU1QgbHBobCA9IExpc3RCb3hHZXRTdG9yYWdlSGVhZGVyKGh3bmQpOwogICBscGhsLT5Db2x1bW5zV2lkdGggPSB3UGFyYW07Ci0gIEludmFsaWRhdGVSZWN0KGh3bmQsTlVMTCxUUlVFKTsKKyAgSW52YWxpZGF0ZVJlY3QzMiggaHduZCwgTlVMTCwgVFJVRSApOwogICByZXR1cm4gMDsKIH0KIApAQCAtMTg3NSw3ICsxODcyLDcgQEAKICAgd1JldCA9IExpc3RCb3hTZXRDdXJTZWwobHBobCwgd1BhcmFtKTsKIAogICBTZXRTY3JvbGxQb3MoaHduZCwgU0JfVkVSVCwgbHBobC0+Rmlyc3RWaXNpYmxlLCBUUlVFKTsKLSAgSW52YWxpZGF0ZVJlY3QoaHduZCwgTlVMTCwgVFJVRSk7CisgIEludmFsaWRhdGVSZWN0MzIoIGh3bmQsIE5VTEwsIFRSVUUgKTsKIAogICByZXR1cm4gd1JldDsKIH0KQEAgLTE4ODYsMjYgKzE4ODMsMjUgQEAKIHN0YXRpYyBMT05HIExCU2V0U2VsKEhXTkQgaHduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQogewogICBMUEhFQURMSVNUIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKLSAgUkVDVCByZWN0OworICBSRUNUMTYgcmVjdDsKICAgaW50IGlSZXQ7CiAKICAgZHByaW50Zl9saXN0Ym94KHN0ZGRlYiwiTGlzdEJveCBMQl9TRVRTRUwgd1BhcmFtPSV4IGxQYXJhbT0lbFggIVxuIiwgd1BhcmFtLCBsUGFyYW0pOwogCiAgIGlSZXQgPSBMaXN0Qm94U2V0U2VsKGxwaGwsIExPV09SRChsUGFyYW0pLCB3UGFyYW0pOwogCi0gIGlmKCBpUmV0ID4gMSApICAgCi0gICAgICBJbnZhbGlkYXRlUmVjdChod25kLCBOVUxMLCBUUlVFKTsKKyAgaWYoIGlSZXQgPiAxICkgSW52YWxpZGF0ZVJlY3QzMiggaHduZCwgTlVMTCwgVFJVRSApOwogICBlbHNlIGlmKCBpUmV0ICE9IExCX0VSUiApCiAgICAgICB7CiAgICAgICAgIGlmKCBscGhsLT5kd1N0eWxlICYgTEJTX0VYVEVOREVEU0VMICYmCiAgICAgICAgICAgICBscGhsLT5JdGVtRm9jdXNlZCAhPSBMT1dPUkQobFBhcmFtKSApCiAgICAgICAgICAgewogICAgICAgICAgICAgTGlzdEJveEdldEl0ZW1SZWN0KGxwaGwsIGxwaGwtPkl0ZW1Gb2N1c2VkICwgJnJlY3QpOwotICAgICAgICAgICAgSW52YWxpZGF0ZVJlY3QoaHduZCwmcmVjdCxUUlVFKTsKKyAgICAgICAgICAgIEludmFsaWRhdGVSZWN0MTYoIGh3bmQsICZyZWN0LCBUUlVFICk7CiAgICAgICAgICAgICBscGhsLT5JdGVtRm9jdXNlZCA9IExPV09SRChsUGFyYW0pOwogICAgICAgICAgIH0KICAgICAgICAgTGlzdEJveEdldEl0ZW1SZWN0KGxwaGwsTE9XT1JEKGxQYXJhbSksJnJlY3QpOwotICAgICAgICBJbnZhbGlkYXRlUmVjdChod25kLCZyZWN0LFRSVUUpOworICAgICAgICBJbnZhbGlkYXRlUmVjdDE2KCBod25kLCAmcmVjdCwgVFJVRSApOwogICAgICAgfQogCiAgIHJldHVybiAoaVJldCA9PSAoV09SRClMQl9FUlIpPyBMQl9FUlI6IDA7CkBAIC0xOTIzLDcgKzE5MTksNyBAQAogICBscGhsLT5GaXJzdFZpc2libGUgPSB3UGFyYW07CiAgIFNldFNjcm9sbFBvcyhod25kLCBTQl9WRVJULCBscGhsLT5GaXJzdFZpc2libGUsIFRSVUUpOwogCi0gIEludmFsaWRhdGVSZWN0KGh3bmQsIE5VTEwsIFRSVUUpOworICBJbnZhbGlkYXRlUmVjdDMyKCBod25kLCBOVUxMLCBUUlVFICk7CiAKICAgcmV0dXJuIDA7CiB9CkBAIC0xOTM4LDcgKzE5MzQsNyBAQAogICAKICAgZHByaW50Zl9saXN0Ym94KHN0ZGRlYiwiTGlzdEJveCBMQl9TRVRJVEVNSEVJR0hUIHdQYXJhbT0leCBsUGFyYW09JWxYICFcbiIsIHdQYXJhbSwgbFBhcmFtKTsKICAgd1JldCA9IExpc3RCb3hTZXRJdGVtSGVpZ2h0KGxwaGwsIHdQYXJhbSwgbFBhcmFtKTsKLSAgSW52YWxpZGF0ZVJlY3QoaHduZCxOVUxMLFRSVUUpOworICBJbnZhbGlkYXRlUmVjdDMyKCBod25kLCBOVUxMLCBUUlVFICk7CiAgIHJldHVybiB3UmV0OwogfQogCkBAIC0yMDQ1LDEzICsyMDQxLDE0IEBACiAgKi8KIEJPT0wgRGxnRGlyU2VsZWN0KCBIV05EIGhEbGcsIExQU1RSIGxwU3RyLCBJTlQgaWQgKQogewotICAgIGNoYXIgYnVmZmVyWzIwXTsKKyAgICBjaGFyICpidWZmZXI7CiAgICAgSU5UIGk7CiAKICAgICBkcHJpbnRmX2xpc3Rib3goIHN0ZGRlYiwgIkRsZ0RpclNlbGVjdDogJTA0eCAnJXMnICVkXG4iLCBoRGxnLCBscFN0ciwgaWQgKTsKICAgICBpZiAoKGkgPSBTZW5kRGxnSXRlbU1lc3NhZ2UoIGhEbGcsIGlkLCBMQl9HRVRDVVJTRUwsIDAsIDAgKSkgPT0gTEJfRVJSKQogICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgU2VuZERsZ0l0ZW1NZXNzYWdlKCBoRGxnLCBpZCwgTEJfR0VUVEVYVCwgaSwgKExQQVJBTSlNQUtFX1NFR1BUUihidWZmZXIpICk7CisgICAgaWYgKCEoYnVmZmVyID0gU0VHUFRSX0FMTE9DKCAyMCAqIHNpemVvZihjaGFyKSApKSkgcmV0dXJuIEZBTFNFOworICAgIFNlbmREbGdJdGVtTWVzc2FnZSggaERsZywgaWQsIExCX0dFVFRFWFQsIGksIChMUEFSQU0pU0VHUFRSX0dFVChidWZmZXIpICk7CiAgICAgaWYgKGJ1ZmZlclswXSA9PSAnWycpICAvKiBkcml2ZSBvciBkaXJlY3RvcnkgKi8KICAgICB7CiAgICAgICAgIGlmIChidWZmZXJbMV0gPT0gJy0nKSAgLyogZHJpdmUgKi8KQEAgLTIwNjAsMTUgKzIwNTcsMTggQEAKICAgICAgICAgICAgIGxwU3RyWzFdID0gJzonOwogICAgICAgICAgICAgbHBTdHJbMl0gPSAnXDAnOwogICAgICAgICAgICAgZHByaW50Zl9saXN0Ym94KCBzdGRkZWIsICJSZXR1cm5pbmcgZHJpdmUgJyVzJ1xuIiwgbHBTdHIgKTsKKyAgICAgICAgICAgIFNFR1BUUl9GUkVFKGJ1ZmZlcik7CiAgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQogICAgICAgICBzdHJjcHkoIGxwU3RyLCBidWZmZXIgKyAxICk7CiAgICAgICAgIGxwU3RyW3N0cmxlbihscFN0ciktMV0gPSAnXFwnOwogICAgICAgICBkcHJpbnRmX2xpc3Rib3goIHN0ZGRlYiwgIlJldHVybmluZyBkaXJlY3RvcnkgJyVzJ1xuIiwgbHBTdHIgKTsKKyAgICAgICAgU0VHUFRSX0ZSRUUoYnVmZmVyKTsKICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIHN0cmNweSggbHBTdHIsIGJ1ZmZlciApOwogICAgIGRwcmludGZfbGlzdGJveCggc3RkZGViLCAiUmV0dXJuaW5nIGZpbGUgJyVzJ1xuIiwgbHBTdHIgKTsKKyAgICBTRUdQVFJfRlJFRShidWZmZXIpOwogICAgIHJldHVybiBGQUxTRTsKIH0KIApAQCAtMjEwMSw3ICsyMTAxLDYgQEAKICAgICBpZiAoaWRMQm94ICYmICgoaHduZCA9IEdldERsZ0l0ZW0oIGhEbGcsIGlkTEJveCApKSAhPSAwKSkKICAgICB7CiAgICAgICAgIGNoYXIgbWFza1syMF07Ci0gICAgICAgIGNoYXIgdGVtcFtdID0gIiouKiI7CiAgICAgICAgIAogICAgICAgICBpZiAoIWZpbGVzcGVjWzBdKSBzdHJjcHkoIG1hc2ssICIqLioiICk7CiAgICAgICAgIGVsc2UKQEAgLTIxMzEsMTAgKzIxMzAsMTggQEAKICAgICAgICAgU0VORE1TRyggTEJfUkVTRVRDT05URU5ULCAwLCAwICk7CiAgICAgICAgIGlmICgoYXR0cmliICYgRERMX0RJUkVDVE9SWSkgJiYgIShhdHRyaWIgJiBERExfRVhDTFVTSVZFKSkKICAgICAgICAgeworICAgICAgICAgICAgY2hhciAqdGVtcDsKICAgICAgICAgICAgIGlmIChTRU5ETVNHKCBMQl9ESVIsIGF0dHJpYiAmIH4oRERMX0RJUkVDVE9SWSB8IERETF9EUklWRVMpLAogICAgICAgICAgICAgICAgICAgICAgICAgIChMUEFSQU0pc3BlYyApID09IExCX0VSUikgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgaWYgKCEodGVtcCA9IFNFR1BUUl9BTExPQyggNCpzaXplb2YoY2hhcikgKSkpIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHN0cmNweSggdGVtcCwgIiouKiIgKTsKICAgICAgICAgICAgIGlmIChTRU5ETVNHKCBMQl9ESVIsIChhdHRyaWIgJiAoRERMX0RJUkVDVE9SWSB8IERETF9EUklWRVMpKSB8IERETF9FWENMVVNJVkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKExQQVJBTSlNQUtFX1NFR1BUUih0ZW1wKSApID09IExCX0VSUikgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgIChMUEFSQU0pU0VHUFRSX0dFVCh0ZW1wKSApID09IExCX0VSUikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTRUdQVFJfRlJFRSh0ZW1wKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTRUdQVFJfRlJFRSh0ZW1wKTsKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKQEAgLTIxNDQsMTIgKzIxNTEsMTUgQEAKIAogICAgIGlmIChpZFN0YXRpYyAmJiAoKGh3bmQgPSBHZXREbGdJdGVtKCBoRGxnLCBpZFN0YXRpYyApKSAhPSAwKSkKICAgICB7Ci0gICAgICAgIGNoYXIgdGVtcFsyNTZdOworICAgICAgICBjb25zdCBjaGFyICpjd2QgPSBEUklWRV9HZXREb3NDd2QoZHJpdmUpOworICAgICAgICBjaGFyICp0ZW1wID0gU0VHUFRSX0FMTE9DKCBzdHJsZW4oY3dkKSArIDQgKTsKKyAgICAgICAgaWYgKCF0ZW1wKSByZXR1cm4gRkFMU0U7CiAgICAgICAgIHN0cmNweSggdGVtcCwgIkE6XFwiICk7CiAgICAgICAgIHRlbXBbMF0gKz0gZHJpdmU7Ci0gICAgICAgIGxzdHJjcHluKCB0ZW1wKzMsIERSSVZFX0dldERvc0N3ZChkcml2ZSksIDI1MyApOworICAgICAgICBzdHJjcHkoIHRlbXAgKyAzLCBjd2QgKTsKICAgICAgICAgQW5zaUxvd2VyKCB0ZW1wICk7Ci0gICAgICAgIFNFTkRNU0coIFdNX1NFVFRFWFQsIDAsIChMUEFSQU0pTUFLRV9TRUdQVFIodGVtcCkgKTsKKyAgICAgICAgU0VORE1TRyggV01fU0VUVEVYVCwgMCwgKExQQVJBTSlTRUdQVFJfR0VUKHRlbXApICk7CisgICAgICAgIFNFR1BUUl9GUkVFKHRlbXApOwogICAgIH0KICAgICByZXR1cm4gVFJVRTsKICN1bmRlZiBTRU5ETVNHCmRpZmYgLS1naXQgYS9jb250cm9scy9tZW51LmMgYi9jb250cm9scy9tZW51LmMKaW5kZXggMjBmNGUwNi4uZTM2ZGVhMCAxMDA2NDQKLS0tIGEvY29udHJvbHMvbWVudS5jCisrKyBiL2NvbnRyb2xzL21lbnUuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgInN5c21ldHJpY3MuaCIKICNpbmNsdWRlICJ0YXNrLmgiCiAjaW5jbHVkZSAid2luLmgiCisjaW5jbHVkZSAiaGVhcC5oIgogI2luY2x1ZGUgIm1lbnUuaCIKICNpbmNsdWRlICJtb2R1bGUuaCIKICNpbmNsdWRlICJuZWV4ZS5oIgpAQCAtMjcsNyArMjgsNiBAQAogI2luY2x1ZGUgIm1lc3NhZ2UuaCIKICNpbmNsdWRlICJncmFwaGljcy5oIgogI2luY2x1ZGUgInJlc291cmNlLmgiCi0jaW5jbHVkZSAic3RhY2tmcmFtZS5oIgogI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIApAQCAtNjIsNyArNjIsOCBAQAogICAoKERXT1JEKU1BS0VMT05HKCAoV09SRCkoaXRlbSktPmhUZXh0LCAoaXRlbSktPnhUYWIgKSkKIAogZXh0ZXJuIHZvaWQgTkNfRHJhd1N5c0J1dHRvbihIV05EIGh3bmQsIEhEQyBoZGMsIEJPT0wgZG93bik7ICAvKiBub25jbGllbnQuYyAqLwotc3RhdGljIEhNRU5VIE1FTlVfQ29weVN5c01lbnUodm9pZCk7CisKK0hNRU5VIE1FTlVfQ29weVN5c01lbnUodm9pZCk7CiAKIHN0YXRpYyBIQklUTUFQIGhTdGRDaGVjayA9IDA7CiBzdGF0aWMgSEJJVE1BUCBoU3RkTW5BcnJvdyA9IDA7CkBAIC0xMzYsNyArMTM3LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTUVOVV9Db3B5U3lzTWVudQogICovCi1zdGF0aWMgSE1FTlUgTUVOVV9Db3B5U3lzTWVudSh2b2lkKQorSE1FTlUgTUVOVV9Db3B5U3lzTWVudSh2b2lkKQogewogICAgIEhNRU5VIGhNZW51OwogICAgIEhHTE9CQUwgaGFuZGxlOwpAQCAtMTYzLDcgKzE2NCw3IEBACiAgKiBDaGVjayB3aGV0aGVyIHRoZSBwb2ludCAoaW4gc2NyZWVuIGNvb3JkcykgaXMgaW4gdGhlIHN5c3RlbSBtZW51CiAgKiBvZiB0aGUgd2luZG93IG93bmluZyB0aGUgZ2l2ZW4gbWVudS4KICAqLwotc3RhdGljIEJPT0wgTUVOVV9Jc0luU3lzTWVudSggUE9QVVBNRU5VICptZW51LCBQT0lOVCBwdCApCitzdGF0aWMgQk9PTCBNRU5VX0lzSW5TeXNNZW51KCBQT1BVUE1FTlUgKm1lbnUsIFBPSU5UMTYgcHQgKQogewogICAgIFdORCAqd25kUHRyOwogCkBAIC0zMDMsMjEgKzMwNCwyMyBAQAogICAgIERXT1JEIGR3U2l6ZTsKICAgICBjaGFyICpwOwogCi0gICAgU2V0UmVjdCggJmxwaXRlbS0+cmVjdCwgb3JnWCwgb3JnWSwgb3JnWCwgb3JnWSApOworICAgIFNldFJlY3QxNiggJmxwaXRlbS0+cmVjdCwgb3JnWCwgb3JnWSwgb3JnWCwgb3JnWSApOwogCiAgICAgaWYgKGxwaXRlbS0+aXRlbV9mbGFncyAmIE1GX09XTkVSRFJBVykKICAgICB7Ci0gICAgICAgIE1FQVNVUkVJVEVNU1RSVUNUIG1pczsKLSAgICAgICAgbWlzLkN0bFR5cGUgICAgPSBPRFRfTUVOVTsKLSAgICAgICAgbWlzLml0ZW1JRCAgICAgPSBscGl0ZW0tPml0ZW1faWQ7Ci0gICAgICAgIG1pcy5pdGVtRGF0YSAgID0gR0VUX09XTkVSRFJBV19EQVRBKGxwaXRlbSk7Ci0gICAgICAgIG1pcy5pdGVtSGVpZ2h0ID0gMTY7Ci0gICAgICAgIG1pcy5pdGVtV2lkdGggID0gMzA7Ci0gICAgICAgIFNlbmRNZXNzYWdlKCBod25kT3duZXIsIFdNX01FQVNVUkVJVEVNLCAwLCAoTFBBUkFNKU1BS0VfU0VHUFRSKCZtaXMpICk7Ci0gICAgICAgIGxwaXRlbS0+cmVjdC5ib3R0b20gKz0gbWlzLml0ZW1IZWlnaHQ7Ci0gICAgICAgIGxwaXRlbS0+cmVjdC5yaWdodCAgKz0gbWlzLml0ZW1XaWR0aDsKKyAgICAgICAgTUVBU1VSRUlURU1TVFJVQ1QgKm1pczsKKyAgICAgICAgaWYgKCEobWlzID0gU0VHUFRSX05FVyhNRUFTVVJFSVRFTVNUUlVDVCkpKSByZXR1cm47CisgICAgICAgIG1pcy0+Q3RsVHlwZSAgICA9IE9EVF9NRU5VOworICAgICAgICBtaXMtPml0ZW1JRCAgICAgPSBscGl0ZW0tPml0ZW1faWQ7CisgICAgICAgIG1pcy0+aXRlbURhdGEgICA9IEdFVF9PV05FUkRSQVdfREFUQShscGl0ZW0pOworICAgICAgICBtaXMtPml0ZW1IZWlnaHQgPSAxNjsKKyAgICAgICAgbWlzLT5pdGVtV2lkdGggID0gMzA7CisgICAgICAgIFNlbmRNZXNzYWdlKCBod25kT3duZXIsIFdNX01FQVNVUkVJVEVNLCAwLCAoTFBBUkFNKVNFR1BUUl9HRVQobWlzKSApOworICAgICAgICBscGl0ZW0tPnJlY3QuYm90dG9tICs9IG1pcy0+aXRlbUhlaWdodDsKKyAgICAgICAgbHBpdGVtLT5yZWN0LnJpZ2h0ICArPSBtaXMtPml0ZW1XaWR0aDsKICAgICAgICAgZHByaW50Zl9tZW51KCBzdGRkZWIsICJEcmF3TWVudUl0ZW06IE1lYXN1cmVJdGVtICUwNHggJWR4JWQhXG4iLAotICAgICAgICAgICAgICAgICAgICAgIGxwaXRlbS0+aXRlbV9pZCwgbWlzLml0ZW1XaWR0aCwgbWlzLml0ZW1IZWlnaHQgKTsKKyAgICAgICAgICAgICAgICAgICAgICBscGl0ZW0tPml0ZW1faWQsIG1pcy0+aXRlbVdpZHRoLCBtaXMtPml0ZW1IZWlnaHQgKTsKKyAgICAgICAgU0VHUFRSX0ZSRUUobWlzKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0gCiAKQEAgLTQzNCw3ICs0MzcsNyBAQAogICoKICAqIENhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgbWVudSBiYXIuCiAgKi8KLXN0YXRpYyB2b2lkIE1FTlVfTWVudUJhckNhbGNTaXplKCBIREMgaGRjLCBMUFJFQ1QgbHByZWN0LCBMUFBPUFVQTUVOVSBscHBvcCwKK3N0YXRpYyB2b2lkIE1FTlVfTWVudUJhckNhbGNTaXplKCBIREMgaGRjLCBMUFJFQ1QxNiBscHJlY3QsIExQUE9QVVBNRU5VIGxwcG9wLAogCQkJCSAgSFdORCBod25kT3duZXIgKQogewogICAgIExQTUVOVUlURU0gbHBpdGVtLCBpdGVtczsKQEAgLTUwNiwyNSArNTA5LDI3IEBACiBzdGF0aWMgdm9pZCBNRU5VX0RyYXdNZW51SXRlbSggSFdORCBod25kLCBIREMgaGRjLCBMUE1FTlVJVEVNIGxwaXRlbSwKIAkJCSAgICAgICBVSU5UIGhlaWdodCwgQk9PTCBtZW51QmFyICkKIHsKLSAgICBSRUNUIHJlY3Q7CisgICAgUkVDVDE2IHJlY3Q7CiAKICAgICBpZiAobHBpdGVtLT5pdGVtX2ZsYWdzICYgTUZfT1dORVJEUkFXKQogICAgIHsKLSAgICAgICAgRFJBV0lURU1TVFJVQ1QgZGlzOworICAgICAgICBEUkFXSVRFTVNUUlVDVDE2ICpkaXM7CiAKKyAgICAgICAgaWYgKCEoZGlzID0gU0VHUFRSX05FVyhEUkFXSVRFTVNUUlVDVDE2KSkpIHJldHVybjsKICAgICAgICAgZHByaW50Zl9tZW51KCBzdGRkZWIsICJEcmF3TWVudUl0ZW06IE93bmVyZHJhdyFcbiIgKTsKLSAgICAgICAgZGlzLkN0bFR5cGUgICA9IE9EVF9NRU5VOwotICAgICAgICBkaXMuaXRlbUlEICAgID0gbHBpdGVtLT5pdGVtX2lkOwotICAgICAgICBkaXMuaXRlbURhdGEgID0gR0VUX09XTkVSRFJBV19EQVRBKGxwaXRlbSk7Ci0gICAgICAgIGRpcy5pdGVtU3RhdGUgPSAwOwotICAgICAgICBpZiAobHBpdGVtLT5pdGVtX2ZsYWdzICYgTUZfQ0hFQ0tFRCkgZGlzLml0ZW1TdGF0ZSB8PSBPRFNfQ0hFQ0tFRDsKLSAgICAgICAgaWYgKGxwaXRlbS0+aXRlbV9mbGFncyAmIE1GX0dSQVlFRCkgIGRpcy5pdGVtU3RhdGUgfD0gT0RTX0dSQVlFRDsKLSAgICAgICAgaWYgKGxwaXRlbS0+aXRlbV9mbGFncyAmIE1GX0hJTElURSkgIGRpcy5pdGVtU3RhdGUgfD0gT0RTX1NFTEVDVEVEOwotICAgICAgICBkaXMuaXRlbUFjdGlvbiA9IE9EQV9EUkFXRU5USVJFIHwgT0RBX1NFTEVDVCB8IE9EQV9GT0NVUzsKLSAgICAgICAgZGlzLmh3bmRJdGVtICAgPSBod25kOwotICAgICAgICBkaXMuaERDICAgICAgICA9IGhkYzsKLSAgICAgICAgZGlzLnJjSXRlbSAgICAgPSBscGl0ZW0tPnJlY3Q7Ci0gICAgICAgIFNlbmRNZXNzYWdlKCBod25kLCBXTV9EUkFXSVRFTSwgMCwgKExQQVJBTSlNQUtFX1NFR1BUUigmZGlzKSApOworICAgICAgICBkaXMtPkN0bFR5cGUgICA9IE9EVF9NRU5VOworICAgICAgICBkaXMtPml0ZW1JRCAgICA9IGxwaXRlbS0+aXRlbV9pZDsKKyAgICAgICAgZGlzLT5pdGVtRGF0YSAgPSBHRVRfT1dORVJEUkFXX0RBVEEobHBpdGVtKTsKKyAgICAgICAgZGlzLT5pdGVtU3RhdGUgPSAwOworICAgICAgICBpZiAobHBpdGVtLT5pdGVtX2ZsYWdzICYgTUZfQ0hFQ0tFRCkgZGlzLT5pdGVtU3RhdGUgfD0gT0RTX0NIRUNLRUQ7CisgICAgICAgIGlmIChscGl0ZW0tPml0ZW1fZmxhZ3MgJiBNRl9HUkFZRUQpICBkaXMtPml0ZW1TdGF0ZSB8PSBPRFNfR1JBWUVEOworICAgICAgICBpZiAobHBpdGVtLT5pdGVtX2ZsYWdzICYgTUZfSElMSVRFKSAgZGlzLT5pdGVtU3RhdGUgfD0gT0RTX1NFTEVDVEVEOworICAgICAgICBkaXMtPml0ZW1BY3Rpb24gPSBPREFfRFJBV0VOVElSRSB8IE9EQV9TRUxFQ1QgfCBPREFfRk9DVVM7CisgICAgICAgIGRpcy0+aHduZEl0ZW0gICA9IGh3bmQ7CisgICAgICAgIGRpcy0+aERDICAgICAgICA9IGhkYzsKKyAgICAgICAgZGlzLT5yY0l0ZW0gICAgID0gbHBpdGVtLT5yZWN0OworICAgICAgICBTZW5kTWVzc2FnZSggaHduZCwgV01fRFJBV0lURU0sIDAsIChMUEFSQU0pU0VHUFRSX0dFVChkaXMpICk7CisgICAgICAgIFNFR1BUUl9GUkVFKGRpcyk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTUzNCw4ICs1MzksOCBAQAogICAgICAgLyogRHJhdyB0aGUgYmFja2dyb3VuZCAqLwogCiAgICAgaWYgKGxwaXRlbS0+aXRlbV9mbGFncyAmIE1GX0hJTElURSkKLQlGaWxsUmVjdCggaGRjLCAmcmVjdCwgc3lzQ29sb3JPYmplY3RzLmhicnVzaEhpZ2hsaWdodCApOwotICAgIGVsc2UgRmlsbFJlY3QoIGhkYywgJnJlY3QsIHN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hNZW51ICk7CisJRmlsbFJlY3QxNiggaGRjLCAmcmVjdCwgc3lzQ29sb3JPYmplY3RzLmhicnVzaEhpZ2hsaWdodCApOworICAgIGVsc2UgRmlsbFJlY3QxNiggaGRjLCAmcmVjdCwgc3lzQ29sb3JPYmplY3RzLmhicnVzaE1lbnUgKTsKICAgICBTZXRCa01vZGUoIGhkYywgVFJBTlNQQVJFTlQgKTsKIAogICAgICAgLyogRHJhdyB0aGUgc2VwYXJhdG9yIGJhciAoaWYgYW55KSAqLwpAQCAtNjMxLDE4ICs2MzYsMTggQEAKICAgICAgICAgICAgICAgICBpZiAoKHRleHRbaV0gPT0gJ1x0JykgfHwgKHRleHRbaV0gPT0gJ1xiJykpIGJyZWFrOwogCX0KIAkKLQlEcmF3VGV4dCggaGRjLCB0ZXh0LCBpLCAmcmVjdCwgRFRfTEVGVCB8IERUX1ZDRU5URVIgfCBEVF9TSU5HTEVMSU5FICk7CisJRHJhd1RleHQxNiggaGRjLCB0ZXh0LCBpLCAmcmVjdCwgRFRfTEVGVCB8IERUX1ZDRU5URVIgfCBEVF9TSU5HTEVMSU5FKTsKIAogCWlmICh0ZXh0W2ldKSAgLyogVGhlcmUncyBhIHRhYiBvciBmbHVzaC1yaWdodCBjaGFyICovCiAJewogCSAgICBpZiAodGV4dFtpXSA9PSAnXHQnKQogCSAgICB7CiAJCXJlY3QubGVmdCA9IGxwaXRlbS0+eFRhYjsKLQkJRHJhd1RleHQoIGhkYywgdGV4dCArIGkgKyAxLCAtMSwgJnJlY3QsCi0JCQkgIERUX0xFRlQgfCBEVF9WQ0VOVEVSIHwgRFRfU0lOR0xFTElORSApOworCQlEcmF3VGV4dDE2KCBoZGMsIHRleHQgKyBpICsgMSwgLTEsICZyZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERUX0xFRlQgfCBEVF9WQ0VOVEVSIHwgRFRfU0lOR0xFTElORSApOwogCSAgICB9Ci0JICAgIGVsc2UgRHJhd1RleHQoIGhkYywgdGV4dCArIGkgKyAxLCAtMSwgJnJlY3QsCi0JCQkgICBEVF9SSUdIVCB8IERUX1ZDRU5URVIgfCBEVF9TSU5HTEVMSU5FICk7CisJICAgIGVsc2UgRHJhd1RleHQxNiggaGRjLCB0ZXh0ICsgaSArIDEsIC0xLCAmcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFRfUklHSFQgfCBEVF9WQ0VOVEVSIHwgRFRfU0lOR0xFTElORSApOwogCX0KICAgICB9CiB9CkBAIC02NTcsMTEgKzY2MiwxMSBAQAogewogICAgIFBPUFVQTUVOVSAqbWVudTsKICAgICBNRU5VSVRFTSAqaXRlbTsKLSAgICBSRUNUIHJlY3Q7CisgICAgUkVDVDE2IHJlY3Q7CiAgICAgaW50IGk7CiAKLSAgICBHZXRDbGllbnRSZWN0KCBod25kLCAmcmVjdCApOwotICAgIEZpbGxSZWN0KCBoZGMsICZyZWN0LCBzeXNDb2xvck9iamVjdHMuaGJydXNoTWVudSApOworICAgIEdldENsaWVudFJlY3QxNiggaHduZCwgJnJlY3QgKTsKKyAgICBGaWxsUmVjdDE2KCBoZGMsICZyZWN0LCBzeXNDb2xvck9iamVjdHMuaGJydXNoTWVudSApOwogICAgIG1lbnUgPSAoUE9QVVBNRU5VICopIFVTRVJfSEVBUF9MSU5fQUREUiggaG1lbnUgKTsKICAgICBpZiAoIW1lbnUgfHwgIW1lbnUtPm5JdGVtcykgcmV0dXJuOwogICAgIGl0ZW0gPSAoTUVOVUlURU0gKikgVVNFUl9IRUFQX0xJTl9BRERSKCBtZW51LT5oSXRlbXMgKTsKQEAgLTY3NSw3ICs2ODAsNyBAQAogICoKICAqIFBhaW50IGEgbWVudSBiYXIuIFJldHVybnMgdGhlIGhlaWdodCBvZiB0aGUgbWVudSBiYXIuCiAgKi8KLVVJTlQgTUVOVV9EcmF3TWVudUJhcihIREMgaERDLCBMUFJFQ1QgbHByZWN0LCBIV05EIGh3bmQsIEJPT0wgc3VwcHJlc3NfZHJhdykKK1VJTlQgTUVOVV9EcmF3TWVudUJhcihIREMgaERDLCBMUFJFQ1QxNiBscHJlY3QsIEhXTkQgaHduZCwgQk9PTCBzdXBwcmVzc19kcmF3KQogewogICAgIExQUE9QVVBNRU5VIGxwcG9wOwogICAgIExQTUVOVUlURU0gbHBpdGVtOwpAQCAtNjkwLDcgKzY5NSw3IEBACiAgICAgbHByZWN0LT5ib3R0b20gPSBscHJlY3QtPnRvcCArIGxwcG9wLT5IZWlnaHQ7CiAgICAgaWYgKHN1cHByZXNzX2RyYXcpIHJldHVybiBscHBvcC0+SGVpZ2h0OwogICAgIAotICAgIEZpbGxSZWN0KGhEQywgbHByZWN0LCBzeXNDb2xvck9iamVjdHMuaGJydXNoTWVudSApOworICAgIEZpbGxSZWN0MTYoaERDLCBscHJlY3QsIHN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hNZW51ICk7CiAgICAgU2VsZWN0T2JqZWN0KCBoREMsIHN5c0NvbG9yT2JqZWN0cy5ocGVuV2luZG93RnJhbWUgKTsKICAgICBNb3ZlVG8oIGhEQywgbHByZWN0LT5sZWZ0LCBscHJlY3QtPmJvdHRvbSApOwogICAgIExpbmVUbyggaERDLCBscHJlY3QtPnJpZ2h0LCBscHJlY3QtPmJvdHRvbSApOwpAQCAtNzk3LDcgKzgwMiw4IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBNRU5VX1NlbGVjdEl0ZW0KICAqLwotc3RhdGljIHZvaWQgTUVOVV9TZWxlY3RJdGVtKCBIV05EIGh3bmRPd25lciwgSE1FTlUgaG1lbnUsIFVJTlQgd0luZGV4ICkKK3N0YXRpYyB2b2lkIE1FTlVfU2VsZWN0SXRlbSggSFdORCBod25kT3duZXIsIEhNRU5VIGhtZW51LCBVSU5UIHdJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCBzZW5kTWVudVNlbGVjdCApCiB7CiAgICAgTUVOVUlURU0gKml0ZW1zOwogICAgIExQUE9QVVBNRU5VIGxwcG9wOwpAQCAtODM0LDE2ICs4NDAsMTcgQEAKIAlpZiAobHBwb3AtPkZvY3VzZWRJdGVtID09IFNZU01FTlVfU0VMRUNURUQpCiAgICAgICAgIHsKIAkgICAgTkNfRHJhd1N5c0J1dHRvbiggbHBwb3AtPmhXbmQsIGhkYywgVFJVRSApOworICAgICAgICAgICAgaWYgKHNlbmRNZW51U2VsZWN0KQogI2lmZGVmIFdJTkVMSUIzMgogLyogRklYOiBMb3N0SW5mbyAqLwotICAgICAgICAgICAgU2VuZE1lc3NhZ2UoIGh3bmRPd25lciwgV01fTUVOVVNFTEVDVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBNQUtFV1BBUkFNKCBXSU5fRmluZFduZFB0cihscHBvcC0+aFduZCktPmhTeXNNZW51LAotCQkJCSAgICAgbHBwb3AtPndGbGFncyB8IE1GX01PVVNFU0VMRUNUICksCi0JCQkgKExQQVJBTSlobWVudSApOworICAgICAgICAgICAgICAgIFNlbmRNZXNzYWdlKCBod25kT3duZXIsIFdNX01FTlVTRUxFQ1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BS0VXUEFSQU0oIFdJTl9GaW5kV25kUHRyKGxwcG9wLT5oV25kKS0+aFN5c01lbnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwcG9wLT53RmxhZ3MgfCBNRl9NT1VTRVNFTEVDVCApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBBUkFNKWhtZW51ICk7CiAjZWxzZQotICAgICAgICAgICAgU2VuZE1lc3NhZ2UoIGh3bmRPd25lciwgV01fTUVOVVNFTEVDVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBXSU5fRmluZFduZFB0cihscHBvcC0+aFduZCktPmhTeXNNZW51LAotICAgICAgICAgICAgICAgICAgICAgICAgIE1BS0VMT05HKCBscHBvcC0+d0ZsYWdzIHwgTUZfTU9VU0VTRUxFQ1QsIGhtZW51ICkgKTsKKyAgICAgICAgICAgICAgICBTZW5kTWVzc2FnZSggaHduZE93bmVyLCBXTV9NRU5VU0VMRUNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5fRmluZFduZFB0cihscHBvcC0+aFduZCktPmhTeXNNZW51LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQUtFTE9ORyhscHBvcC0+d0ZsYWdzIHwgTUZfTU9VU0VTRUxFQ1QsIGhtZW51KSk7CiAjZW5kaWYKICAgICAgICAgfQogCWVsc2UKQEAgLTg1MSwyNyArODU4LDMwIEBACiAJICAgIGl0ZW1zW2xwcG9wLT5Gb2N1c2VkSXRlbV0uaXRlbV9mbGFncyB8PSBNRl9ISUxJVEU7CiAJICAgIE1FTlVfRHJhd01lbnVJdGVtKCBscHBvcC0+aFduZCwgaGRjLCAmaXRlbXNbbHBwb3AtPkZvY3VzZWRJdGVtXSwgbHBwb3AtPkhlaWdodCwKIAkJCSAgICAgICAhKGxwcG9wLT53RmxhZ3MgJiBNRl9QT1BVUCkgKTsKKyAgICAgICAgICAgIGlmIChzZW5kTWVudVNlbGVjdCkKICNpZmRlZiBXSU5FTElCMzIKLQkgICAgU2VuZE1lc3NhZ2UoIGh3bmRPd25lciwgV01fTUVOVVNFTEVDVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBNQUtFV1BBUkFNKCBpdGVtc1tscHBvcC0+Rm9jdXNlZEl0ZW1dLml0ZW1faWQsCi0JCQkJICAgICBpdGVtc1tscHBvcC0+Rm9jdXNlZEl0ZW1dLml0ZW1fZmxhZ3MgfCAKLQkJCQkgICAgIE1GX01PVVNFU0VMRUNUICksCi0JCQkgKExQQVJBTSkgaG1lbnUgKTsKKyAgICAgICAgICAgICAgICBTZW5kTWVzc2FnZSggaHduZE93bmVyLCBXTV9NRU5VU0VMRUNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQUtFV1BBUkFNKCBpdGVtc1tscHBvcC0+Rm9jdXNlZEl0ZW1dLml0ZW1faWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zW2xwcG9wLT5Gb2N1c2VkSXRlbV0uaXRlbV9mbGFnc3wgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1GX01PVVNFU0VMRUNUICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMUEFSQU0pIGhtZW51ICk7CiAjZWxzZQotCSAgICBTZW5kTWVzc2FnZSggaHduZE93bmVyLCBXTV9NRU5VU0VMRUNULAotICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zW2xwcG9wLT5Gb2N1c2VkSXRlbV0uaXRlbV9pZCwKLQkJICAgICAgICAgTUFLRUxPTkcoIGl0ZW1zW2xwcG9wLT5Gb2N1c2VkSXRlbV0uaXRlbV9mbGFncyB8IE1GX01PVVNFU0VMRUNULCBobWVudSkpOworCSAgICAgICAgU2VuZE1lc3NhZ2UoIGh3bmRPd25lciwgV01fTUVOVVNFTEVDVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXNbbHBwb3AtPkZvY3VzZWRJdGVtXS5pdGVtX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQUtFTE9ORyggaXRlbXNbbHBwb3AtPkZvY3VzZWRJdGVtXS5pdGVtX2ZsYWdzIHwgTUZfTU9VU0VTRUxFQ1QsIGhtZW51KSk7CiAjZW5kaWYKIAl9CiAgICAgfQogI2lmZGVmIFdJTkVMSUIzMgogLyogRklYOiBMb3N0IEluZm8gKi8KLSAgICBlbHNlIFNlbmRNZXNzYWdlKCBod25kT3duZXIsIFdNX01FTlVTRUxFQ1QsIAotCQkgICAgICBNQUtFV1BBUkFNKCAoRFdPUkQpaG1lbnUsIGxwcG9wLT53RmxhZ3MgfCBNRl9NT1VTRVNFTEVDVCksCi0JCSAgICAgIGhtZW51ICk7CisgICAgZWxzZSBpZiAoc2VuZE1lbnVTZWxlY3QpCisgICAgICAgIFNlbmRNZXNzYWdlKCBod25kT3duZXIsIFdNX01FTlVTRUxFQ1QsIAorICAgICAgICAgICAgICAgICAgICAgTUFLRVdQQVJBTSggKERXT1JEKWhtZW51LCBscHBvcC0+d0ZsYWdzIHwgTUZfTU9VU0VTRUxFQ1QpLAorICAgICAgICAgICAgICAgICAgICAgaG1lbnUgKTsKICNlbHNlCi0gICAgZWxzZSBTZW5kTWVzc2FnZSggaHduZE93bmVyLCBXTV9NRU5VU0VMRUNULCBobWVudSwKLSAgICAgICAgICAgICAgICAgICAgICBNQUtFTE9ORyggbHBwb3AtPndGbGFncyB8IE1GX01PVVNFU0VMRUNULCBobWVudSApICk7CisgICAgZWxzZSBpZiAoc2VuZE1lbnVTZWxlY3QpCisgICAgICAgIFNlbmRNZXNzYWdlKCBod25kT3duZXIsIFdNX01FTlVTRUxFQ1QsIGhtZW51LAorICAgICAgICAgICAgICAgICAgICAgTUFLRUxPTkcoIGxwcG9wLT53RmxhZ3MgfCBNRl9NT1VTRVNFTEVDVCwgaG1lbnUgKSApOwogI2VuZGlmCiAKICAgICBSZWxlYXNlREMoIGxwcG9wLT5oV25kLCBoZGMgKTsKQEAgLTg5NywxMyArOTA3LDEzIEBACiAJewogCSAgICBpZiAoIShpdGVtc1tpXS5pdGVtX2ZsYWdzICYgTUZfU0VQQVJBVE9SKSkKIAkgICAgewotCQlNRU5VX1NlbGVjdEl0ZW0oIGh3bmRPd25lciwgaG1lbnUsIGkgKTsKKwkJTUVOVV9TZWxlY3RJdGVtKCBod25kT3duZXIsIGhtZW51LCBpLCBUUlVFICk7CiAJCXJldHVybjsKIAkgICAgfQogCX0KIAlpZiAoTUVOVV9IYXNTeXNNZW51KCBtZW51ICkpCiAJewotCSAgICBNRU5VX1NlbGVjdEl0ZW0oIGh3bmRPd25lciwgaG1lbnUsIFNZU01FTlVfU0VMRUNURUQgKTsKKwkgICAgTUVOVV9TZWxlY3RJdGVtKCBod25kT3duZXIsIGhtZW51LCBTWVNNRU5VX1NFTEVDVEVELCBUUlVFICk7CiAJICAgIHJldHVybjsKIAl9CiAgICAgfQpAQCAtOTExLDEyICs5MjEsMTIgQEAKICAgICB7CiAJaWYgKCEoaXRlbXNbaV0uaXRlbV9mbGFncyAmIE1GX1NFUEFSQVRPUikpCiAJewotCSAgICBNRU5VX1NlbGVjdEl0ZW0oIGh3bmRPd25lciwgaG1lbnUsIGkgKTsKKwkgICAgTUVOVV9TZWxlY3RJdGVtKCBod25kT3duZXIsIGhtZW51LCBpLCBUUlVFICk7CiAJICAgIHJldHVybjsKIAl9CiAgICAgfQogICAgIGlmIChNRU5VX0hhc1N5c01lbnUoIG1lbnUgKSkKLSAgICAgICAgTUVOVV9TZWxlY3RJdGVtKCBod25kT3duZXIsIGhtZW51LCBTWVNNRU5VX1NFTEVDVEVEICk7CisgICAgICAgIE1FTlVfU2VsZWN0SXRlbSggaHduZE93bmVyLCBobWVudSwgU1lTTUVOVV9TRUxFQ1RFRCwgVFJVRSApOwogfQogCiAKQEAgLTkzOSwxMyArOTQ5LDEzIEBACiAJewogCSAgICBpZiAoIShpdGVtc1tpXS5pdGVtX2ZsYWdzICYgTUZfU0VQQVJBVE9SKSkKIAkgICAgewotCQlNRU5VX1NlbGVjdEl0ZW0oIGh3bmRPd25lciwgaG1lbnUsIGkgKTsKKwkJTUVOVV9TZWxlY3RJdGVtKCBod25kT3duZXIsIGhtZW51LCBpLCBUUlVFICk7CiAJCXJldHVybjsKIAkgICAgfQogCX0KIAlpZiAoTUVOVV9IYXNTeXNNZW51KCBtZW51ICkpCiAJewotCSAgICBNRU5VX1NlbGVjdEl0ZW0oIGh3bmRPd25lciwgaG1lbnUsIFNZU01FTlVfU0VMRUNURUQgKTsKKwkgICAgTUVOVV9TZWxlY3RJdGVtKCBod25kT3duZXIsIGhtZW51LCBTWVNNRU5VX1NFTEVDVEVELCBUUlVFICk7CiAJICAgIHJldHVybjsKIAl9CiAgICAgfQpAQCAtOTUzLDEyICs5NjMsMTIgQEAKICAgICB7CiAJaWYgKCEoaXRlbXNbaV0uaXRlbV9mbGFncyAmIE1GX1NFUEFSQVRPUikpCiAJewotCSAgICBNRU5VX1NlbGVjdEl0ZW0oIGh3bmRPd25lciwgaG1lbnUsIGkgKTsKKwkgICAgTUVOVV9TZWxlY3RJdGVtKCBod25kT3duZXIsIGhtZW51LCBpLCBUUlVFICk7CiAJICAgIHJldHVybjsKIAl9CiAgICAgfQogICAgIGlmIChNRU5VX0hhc1N5c01lbnUoIG1lbnUgKSkKLSAgICAgICAgTUVOVV9TZWxlY3RJdGVtKCBod25kT3duZXIsIGhtZW51LCBTWVNNRU5VX1NFTEVDVEVEICk7CisgICAgICAgIE1FTlVfU2VsZWN0SXRlbSggaHduZE93bmVyLCBobWVudSwgU1lTTUVOVV9TRUxFQ1RFRCwgVFJVRSApOwogfQogCiAKQEAgLTEwMDAsNyArMTAxMCw3IEBACiAKICAgICBpdGVtLT5pdGVtX2ZsYWdzID0gZmxhZ3MgJiB+KE1GX0hJTElURSB8IE1GX01PVVNFU0VMRUNUKTsKICAgICBpdGVtLT5pdGVtX2lkICAgID0gaWQ7Ci0gICAgU2V0UmVjdEVtcHR5KCAmaXRlbS0+cmVjdCApOworICAgIFNldFJlY3RFbXB0eTE2KCAmaXRlbS0+cmVjdCApOwogICAgIGlmIChoUHJldlRleHQpIFVTRVJfSEVBUF9GUkVFKCBoUHJldlRleHQgKTsKICAgICByZXR1cm4gVFJVRTsKIH0KQEAgLTExNDQsNyArMTE1NCw4IEBACiAgKgogICogSGlkZSB0aGUgc3ViLXBvcHVwIG1lbnVzIG9mIHRoaXMgbWVudS4KICAqLwotc3RhdGljIHZvaWQgTUVOVV9IaWRlU3ViUG9wdXBzKCBIV05EIGh3bmRPd25lciwgSE1FTlUgaG1lbnUgKQorc3RhdGljIHZvaWQgTUVOVV9IaWRlU3ViUG9wdXBzKCBIV05EIGh3bmRPd25lciwgSE1FTlUgaG1lbnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgc2VuZE1lbnVTZWxlY3QgKQogewogICAgIE1FTlVJVEVNICppdGVtOwogICAgIFBPUFVQTUVOVSAqbWVudSwgKnN1Ym1lbnU7CkBAIC0xMTY1LDE4ICsxMTc2LDE4IEBACiAJaHN1Ym1lbnUgPSAoSE1FTlUpaXRlbS0+aXRlbV9pZDsKICAgICB9CiAgICAgc3VibWVudSA9IChQT1BVUE1FTlUgKikgVVNFUl9IRUFQX0xJTl9BRERSKCBoc3VibWVudSApOwotICAgIE1FTlVfSGlkZVN1YlBvcHVwcyggaHduZE93bmVyLCBoc3VibWVudSApOworICAgIE1FTlVfSGlkZVN1YlBvcHVwcyggaHduZE93bmVyLCBoc3VibWVudSwgRkFMU0UgKTsKKyAgICBNRU5VX1NlbGVjdEl0ZW0oIGh3bmRPd25lciwgaHN1Ym1lbnUsIE5PX1NFTEVDVEVEX0lURU0sIHNlbmRNZW51U2VsZWN0ICk7CiAgICAgaWYgKHN1Ym1lbnUtPmhXbmQgPT0gcFRvcFBXbmQtPmh3bmRTZWxmICkgCi0gICAgICB7CisgICAgewogCVNob3dXaW5kb3coIHN1Ym1lbnUtPmhXbmQsIFNXX0hJREUgKTsKIAl1U3ViUFduZExldmVsID0gMDsKLSAgICAgIH0KKyAgICB9CiAgICAgZWxzZQotICAgICAgeworICAgIHsKIAlEZXN0cm95V2luZG93KCBzdWJtZW51LT5oV25kICk7CiAJc3VibWVudS0+aFduZCA9IDA7Ci0gICAgICB9Ci0gICAgTUVOVV9TZWxlY3RJdGVtKCBod25kT3duZXIsIGhzdWJtZW51LCBOT19TRUxFQ1RFRF9JVEVNICk7CisgICAgfQogfQogCiAKQEAgLTEyMjgsMTIgKzEyMzksMTIgQEAKICAqCiAgKiBGaW5kIHRoZSBtZW51IGNvbnRhaW5pbmcgYSBnaXZlbiBwb2ludCAoaW4gc2NyZWVuIGNvb3JkcykuCiAgKi8KLXN0YXRpYyBITUVOVSBNRU5VX0ZpbmRNZW51QnlDb29yZHMoIEhNRU5VIGhtZW51LCBQT0lOVCBwdCApCitzdGF0aWMgSE1FTlUgTUVOVV9GaW5kTWVudUJ5Q29vcmRzKCBITUVOVSBobWVudSwgUE9JTlQxNiBwdCApCiB7CiAgICAgUE9QVVBNRU5VICptZW51OwogICAgIEhXTkQgaHduZDsKIAotICAgIGlmICghKGh3bmQgPSBXaW5kb3dGcm9tUG9pbnQoIHB0ICkpKSByZXR1cm4gMDsKKyAgICBpZiAoIShod25kID0gV2luZG93RnJvbVBvaW50MTYoIHB0ICkpKSByZXR1cm4gMDsKICAgICB3aGlsZSAoaG1lbnUpCiAgICAgewogCW1lbnUgPSAoUE9QVVBNRU5VICopIFVTRVJfSEVBUF9MSU5fQUREUiggaG1lbnUgKTsKQEAgLTEzMDAsNyArMTMxMSw3IEBACiAgKiBSZXR1cm4gVFJVRSBpZiB3ZSBjYW4gZ28gb24gd2l0aCBtZW51IHRyYWNraW5nLgogICovCiBzdGF0aWMgQk9PTCBNRU5VX0J1dHRvbkRvd24oIEhXTkQgaHduZE93bmVyLCBITUVOVSBobWVudSwgSE1FTlUgKmhtZW51Q3VycmVudCwKLQkJCSAgICAgUE9JTlQgcHQgKQorCQkJICAgICBQT0lOVDE2IHB0ICkKIHsKICAgICBQT1BVUE1FTlUgKm1lbnU7CiAgICAgTUVOVUlURU0gKml0ZW07CkBAIC0xMzI0LDcgKzEzMzUsNyBAQAogCSAgICB7CiAJCWlmIChtZW51LT53RmxhZ3MgJiBNRl9QT1BVUCkKIAkJewotCQkgICAgTUVOVV9IaWRlU3ViUG9wdXBzKCBod25kT3duZXIsIGhtZW51ICk7CisJCSAgICBNRU5VX0hpZGVTdWJQb3B1cHMoIGh3bmRPd25lciwgaG1lbnUsIFRSVUUgKTsKIAkJICAgICpobWVudUN1cnJlbnQgPSBobWVudTsKIAkJfQogCQllbHNlIHJldHVybiBGQUxTRTsKQEAgLTEzMzQsOCArMTM0NSw4IEBACiAgICAgfQogICAgIGVsc2UKICAgICB7Ci0JTUVOVV9IaWRlU3ViUG9wdXBzKCBod25kT3duZXIsIGhtZW51ICk7Ci0JTUVOVV9TZWxlY3RJdGVtKCBod25kT3duZXIsIGhtZW51LCBpZCApOworCU1FTlVfSGlkZVN1YlBvcHVwcyggaHduZE93bmVyLCBobWVudSwgRkFMU0UgKTsKKwlNRU5VX1NlbGVjdEl0ZW0oIGh3bmRPd25lciwgaG1lbnUsIGlkLCBUUlVFICk7CiAJKmhtZW51Q3VycmVudCA9IE1FTlVfU2hvd1N1YlBvcHVwKCBod25kT3duZXIsIGhtZW51LCBGQUxTRSApOwogICAgIH0KICAgICByZXR1cm4gVFJVRTsKQEAgLTEzNTAsNyArMTM2MSw3IEBACiAgKiBSZXR1cm4gVFJVRSBpZiB3ZSBjYW4gZ28gb24gd2l0aCBtZW51IHRyYWNraW5nLgogICovCiBzdGF0aWMgQk9PTCBNRU5VX0J1dHRvblVwKCBIV05EIGh3bmRPd25lciwgSE1FTlUgaG1lbnUsIEhNRU5VICpobWVudUN1cnJlbnQsCi0JCQkgICBQT0lOVCBwdCApCisJCQkgICBQT0lOVDE2IHB0ICkKIHsKICAgICBQT1BVUE1FTlUgKm1lbnU7CiAgICAgTUVOVUlURU0gKml0ZW07CkBAIC0xMzc4LDcgKzEzODksNyBAQAogCWhzdWJtZW51ID0gKEhNRU5VKWl0ZW0tPml0ZW1faWQ7CiAgICAgfQogICAgICAgLyogU2VsZWN0IGZpcnN0IGl0ZW0gb2Ygc3ViLXBvcHVwICovCi0gICAgTUVOVV9TZWxlY3RJdGVtKCBod25kT3duZXIsIGhzdWJtZW51LCBOT19TRUxFQ1RFRF9JVEVNICk7CisgICAgTUVOVV9TZWxlY3RJdGVtKCBod25kT3duZXIsIGhzdWJtZW51LCBOT19TRUxFQ1RFRF9JVEVNLCBGQUxTRSApOwogICAgIE1FTlVfU2VsZWN0TmV4dEl0ZW0oIGh3bmRPd25lciwgaHN1Ym1lbnUgKTsKICAgICByZXR1cm4gVFJVRTsKIH0KQEAgLTEzOTIsNyArMTQwMyw3IEBACiAgKiBSZXR1cm4gVFJVRSBpZiB3ZSBjYW4gZ28gb24gd2l0aCBtZW51IHRyYWNraW5nLgogICovCiBzdGF0aWMgQk9PTCBNRU5VX01vdXNlTW92ZSggSFdORCBod25kT3duZXIsIEhNRU5VIGhtZW51LCBITUVOVSAqaG1lbnVDdXJyZW50LAotCQkJICAgIFBPSU5UIHB0ICkKKwkJCSAgICBQT0lOVDE2IHB0ICkKIHsKICAgICBNRU5VSVRFTSAqaXRlbTsKICAgICBQT1BVUE1FTlUgKm1lbnUgPSAoUE9QVVBNRU5VICopIFVTRVJfSEVBUF9MSU5fQUREUiggaG1lbnUgKTsKQEAgLTE0MTAsMTIgKzE0MjEsMTIgQEAKICAgICB9CQogICAgIGlmIChpZCA9PSBOT19TRUxFQ1RFRF9JVEVNKQogICAgIHsKLQlNRU5VX1NlbGVjdEl0ZW0oIGh3bmRPd25lciwgKmhtZW51Q3VycmVudCwgTk9fU0VMRUNURURfSVRFTSApOworCU1FTlVfU2VsZWN0SXRlbSggaHduZE93bmVyLCAqaG1lbnVDdXJyZW50LCBOT19TRUxFQ1RFRF9JVEVNLCBUUlVFICk7CiAgICAgfQogICAgIGVsc2UgaWYgKG1lbnUtPkZvY3VzZWRJdGVtICE9IGlkKQogICAgIHsKLQlNRU5VX0hpZGVTdWJQb3B1cHMoIGh3bmRPd25lciwgaG1lbnUgKTsKLQlNRU5VX1NlbGVjdEl0ZW0oIGh3bmRPd25lciwgaG1lbnUsIGlkICk7CisJTUVOVV9IaWRlU3ViUG9wdXBzKCBod25kT3duZXIsIGhtZW51LCBGQUxTRSApOworCU1FTlVfU2VsZWN0SXRlbSggaHduZE93bmVyLCBobWVudSwgaWQsIFRSVUUgKTsKIAkqaG1lbnVDdXJyZW50ID0gTUVOVV9TaG93U3ViUG9wdXAoIGh3bmRPd25lciwgaG1lbnUsIEZBTFNFICk7CiAgICAgfQogICAgIHJldHVybiBUUlVFOwpAQCAtMTQ0MCw3ICsxNDUxLDcgQEAKIAlobWVudXRtcCA9IE1FTlVfR2V0U3ViUG9wdXAoIGhtZW51cHJldiApOwogCWlmIChobWVudXRtcCAhPSAqaG1lbnVDdXJyZW50KSBobWVudXByZXYgPSBobWVudXRtcDsKICAgICB9Ci0gICAgTUVOVV9IaWRlU3ViUG9wdXBzKCBod25kT3duZXIsIGhtZW51cHJldiApOworICAgIE1FTlVfSGlkZVN1YlBvcHVwcyggaHduZE93bmVyLCBobWVudXByZXYsIFRSVUUgKTsKIAogICAgIGlmICgoaG1lbnVwcmV2ID09IGhtZW51KSAmJiAhKG1lbnUtPndGbGFncyAmIE1GX1BPUFVQKSkKICAgICB7CkBAIC0xNDgzLDcgKzE0OTQsNyBAQAogICAgICAgLyogSWYgb24gbWVudS1iYXIsIGdvIHRvIG5leHQgaXRlbSAqLwogICAgIGlmICghKG1lbnUtPndGbGFncyAmIE1GX1BPUFVQKSkKICAgICB7Ci0JTUVOVV9IaWRlU3ViUG9wdXBzKCBod25kT3duZXIsIGhtZW51ICk7CisJTUVOVV9IaWRlU3ViUG9wdXBzKCBod25kT3duZXIsIGhtZW51LCBGQUxTRSApOwogCU1FTlVfU2VsZWN0TmV4dEl0ZW0oIGh3bmRPd25lciwgaG1lbnUgKTsKIAlpZiAoKmhtZW51Q3VycmVudCAhPSBobWVudSkKIAl7CkBAIC0xNTAwLDcgKzE1MTEsNyBAQAogCSAgICBobWVudXRtcCA9IE1FTlVfR2V0U3ViUG9wdXAoIGhtZW51cHJldiApOwogCSAgICBpZiAoaG1lbnV0bXAgIT0gKmhtZW51Q3VycmVudCkgaG1lbnVwcmV2ID0gaG1lbnV0bXA7CiAJfQotCU1FTlVfSGlkZVN1YlBvcHVwcyggaHduZE93bmVyLCBobWVudXByZXYgKTsKKwlNRU5VX0hpZGVTdWJQb3B1cHMoIGh3bmRPd25lciwgaG1lbnVwcmV2LCBUUlVFICk7CiAJKmhtZW51Q3VycmVudCA9IGhtZW51cHJldjsKICAgICB9CiB9CkBAIC0xNTE0LDcgKzE1MjUsNyBAQAogICogYmVmb3JlIGJlZ2lubmluZyB0cmFja2luZy4gVGhpcyBpcyB0byBoZWxwIG1lbnUtYmFyIHRyYWNraW5nLgogICovCiBzdGF0aWMgQk9PTCBNRU5VX1RyYWNrTWVudSggSE1FTlUgaG1lbnUsIFVJTlQgd0ZsYWdzLCBpbnQgeCwgaW50IHksCi0JCQkgICAgSFdORCBod25kLCBMUFJFQ1QgbHByZWN0ICkKKwkJCSAgICBIV05EIGh3bmQsIGNvbnN0IFJFQ1QxNiAqbHByZWN0ICkKIHsKICAgICBNU0cgKm1zZzsKICAgICBITE9DQUwxNiBoTXNnOwpAQCAtMTUyNyw3ICsxNTM4LDcgQEAKICAgICBpZiAoIShtZW51ID0gKFBPUFVQTUVOVSAqKSBVU0VSX0hFQVBfTElOX0FERFIoIGhtZW51ICkpKSByZXR1cm4gRkFMU0U7CiAgICAgaWYgKHggJiYgeSkKICAgICB7Ci0JUE9JTlQgcHQgPSB7IHgsIHkgfTsKKwlQT0lOVDE2IHB0ID0geyB4LCB5IH07CiAJTUVOVV9CdXR0b25Eb3duKCBod25kLCBobWVudSwgJmhtZW51Q3VycmVudCwgcHQgKTsKICAgICB9CiAgICAgU2V0Q2FwdHVyZSggaHduZCApOwpAQCAtMTU2NCw3ICsxNTc1LDcgQEAKIAkgICAgY2FzZSBXTV9MQlVUVE9OVVA6CiAJICAgIGNhc2UgV01fTkNMQlVUVE9OVVA6CiAJCSAgLyogSWYgb3V0c2lkZSBhbGwgbWVudXMgYnV0IGluc2lkZSBscHJlY3QsIGlnbm9yZSBpdCAqLwotCQlpZiAoIWhzdWJtZW51ICYmIGxwcmVjdCAmJiBQdEluUmVjdCggbHByZWN0LCBtc2ctPnB0ICkpIGJyZWFrOworCQlpZiAoIWhzdWJtZW51ICYmIGxwcmVjdCAmJiBQdEluUmVjdDE2KGxwcmVjdCwgbXNnLT5wdCkpIGJyZWFrOwogCQlmQ2xvc2VkID0gIU1FTlVfQnV0dG9uVXAoIGh3bmQsIGhzdWJtZW51LAogCQkJCQkgICZobWVudUN1cnJlbnQsIG1zZy0+cHQgKTsKICAgICAgICAgICAgICAgICBmUmVtb3ZlID0gVFJVRTsgIC8qIFJlbW92ZSBldmVudCBldmVuIGlmIG91dHNpZGUgbWVudSAqLwpAQCAtMTU5MCwxMiArMTYwMSwxMiBAQAogCQlzd2l0Y2gobXNnLT53UGFyYW0pCiAJCXsKIAkJY2FzZSBWS19IT01FOgotCQkgICAgTUVOVV9TZWxlY3RJdGVtKCBod25kLCBobWVudUN1cnJlbnQsIE5PX1NFTEVDVEVEX0lURU0gKTsKKwkJICAgIE1FTlVfU2VsZWN0SXRlbSggaHduZCwgaG1lbnVDdXJyZW50LCBOT19TRUxFQ1RFRF9JVEVNLCBGQUxTRSApOwogCQkgICAgTUVOVV9TZWxlY3ROZXh0SXRlbSggaHduZCwgaG1lbnVDdXJyZW50ICk7CiAJCSAgICBicmVhazsKIAogCQljYXNlIFZLX0VORDoKLQkJICAgIE1FTlVfU2VsZWN0SXRlbSggaHduZCwgaG1lbnVDdXJyZW50LCBOT19TRUxFQ1RFRF9JVEVNICk7CisJCSAgICBNRU5VX1NlbGVjdEl0ZW0oIGh3bmQsIGhtZW51Q3VycmVudCwgTk9fU0VMRUNURURfSVRFTSwgRkFMU0UgKTsKIAkJICAgIE1FTlVfU2VsZWN0UHJldkl0ZW0oIGh3bmQsIGhtZW51Q3VycmVudCApOwogCQkgICAgYnJlYWs7CiAKQEAgLTE2NTQsNyArMTY2NSw3IEBACiAJCSAgICBlbHNlIGlmIChwb3MgPT0gKFVJTlQpLTEpIE1lc3NhZ2VCZWVwKDApOwogCQkgICAgZWxzZQogCQkgICAgewotCQkJTUVOVV9TZWxlY3RJdGVtKCBod25kLCBobWVudUN1cnJlbnQsIHBvcyApOworCQkJTUVOVV9TZWxlY3RJdGVtKCBod25kLCBobWVudUN1cnJlbnQsIHBvcywgVFJVRSApOwogCQkJZkNsb3NlZCA9ICFNRU5VX0V4ZWNGb2N1c2VkSXRlbSggaHduZCwgaG1lbnVDdXJyZW50LAogCQkJCQkJCSAmaG1lbnVDdXJyZW50ICk7CiAJCQkKQEAgLTE2NzUsMTMgKzE2ODYsMTMgQEAKICAgICB9CiAgICAgVVNFUl9IRUFQX0ZSRUUoIGhNc2cgKTsKICAgICBSZWxlYXNlQ2FwdHVyZSgpOwotICAgIE1FTlVfSGlkZVN1YlBvcHVwcyggaHduZCwgaG1lbnUgKTsKKyAgICBNRU5VX0hpZGVTdWJQb3B1cHMoIGh3bmQsIGhtZW51LCBGQUxTRSApOwogICAgIGlmIChtZW51LT53RmxhZ3MgJiBNRl9QT1BVUCkgCi0gICAgICAgeworICAgIHsKICAgICAgICAgIFNob3dXaW5kb3coIG1lbnUtPmhXbmQsIFNXX0hJREUgKTsKIAkgdVN1YlBXbmRMZXZlbCA9IDA7Ci0gICAgICAgfQotICAgIE1FTlVfU2VsZWN0SXRlbSggaHduZCwgaG1lbnUsIE5PX1NFTEVDVEVEX0lURU0gKTsKKyAgICB9CisgICAgTUVOVV9TZWxlY3RJdGVtKCBod25kLCBobWVudSwgTk9fU0VMRUNURURfSVRFTSwgRkFMU0UgKTsKICAgICBTZW5kTWVzc2FnZSggaHduZCwgV01fTUVOVVNFTEVDVCwgMCwgTUFLRUxPTkcoIDB4ZmZmZiwgMCApICk7CiAgICAgZkVuZE1lbnVDYWxsZWQgPSBGQUxTRTsKICAgICByZXR1cm4gVFJVRTsKQEAgLTE2OTMsNyArMTcwNCw3IEBACiAgKgogICogTWVudS1iYXIgdHJhY2tpbmcgdXBvbiBhIG1vdXNlIGV2ZW50LiBDYWxsZWQgZnJvbSBOQ19IYW5kbGVTeXNDb21tYW5kKCkuCiAgKi8KLXZvaWQgTUVOVV9UcmFja01vdXNlTWVudUJhciggSFdORCBod25kLCBQT0lOVCBwdCApCit2b2lkIE1FTlVfVHJhY2tNb3VzZU1lbnVCYXIoIEhXTkQgaHduZCwgUE9JTlQxNiBwdCApCiB7CiAgICAgV05EICp3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApOwogICAgIEhpZGVDYXJldCgwKTsKQEAgLTE3NTgsNyArMTc2OSw3IEBACiAJICB9CiAgICAgICB9CiAKLSAgICBNRU5VX1NlbGVjdEl0ZW0oIHduZFB0ci0+aHduZFNlbGYsIGhUcmFja01lbnUsIHVJdGVtICk7CisgICAgTUVOVV9TZWxlY3RJdGVtKCB3bmRQdHItPmh3bmRTZWxmLCBoVHJhY2tNZW51LCB1SXRlbSwgVFJVRSApOwogICAgIGlmKCB1SXRlbSA9PSBOT19TRUxFQ1RFRF9JVEVNICkKICAgICAgIE1FTlVfU2VsZWN0TmV4dEl0ZW0oIHduZFB0ci0+aHduZFNlbGYsIGhUcmFja01lbnUgKTsKICAgICBlbHNlCkBAIC0xNzczLDIyICsxNzg0LDMzIEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBUcmFja1BvcHVwTWVudSAgIChVU0VSLjQxNikKKyAqICAgICAgICAgICBUcmFja1BvcHVwTWVudTE2ICAgKFVTRVIuNDE2KQogICovCi1CT09MIFRyYWNrUG9wdXBNZW51KCBITUVOVSBoTWVudSwgVUlOVCB3RmxhZ3MsIHNob3J0IHgsIHNob3J0IHksCi0JCSAgICAgc2hvcnQgblJlc2VydmVkLCBIV05EIGhXbmQsIExQUkVDVCBscFJlY3QgKQorQk9PTDE2IFRyYWNrUG9wdXBNZW51MTYoIEhNRU5VMTYgaE1lbnUsIFVJTlQxNiB3RmxhZ3MsIElOVDE2IHgsIElOVDE2IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMTYgblJlc2VydmVkLCBIV05EMTYgaFduZCwgY29uc3QgUkVDVDE2ICpscFJlY3QgKQogewotICAgIEJPT0wgcmV0OworICAgIEJPT0wgcmV0ID0gRkFMU0U7CisKICAgICBIaWRlQ2FyZXQoMCk7Ci0gICAgaWYgKCFNRU5VX1Nob3dQb3B1cCggaFduZCwgaE1lbnUsIDAsIHgsIHkgKSkgCi0JcmV0ID0gRkFMU0U7Ci0gICAgZWxzZQorICAgIGlmIChNRU5VX1Nob3dQb3B1cCggaFduZCwgaE1lbnUsIDAsIHgsIHkgKSkgCiAJcmV0ID0gTUVOVV9UcmFja01lbnUoIGhNZW51LCB3RmxhZ3MsIDAsIDAsIGhXbmQsIGxwUmVjdCApOwogICAgIFNob3dDYXJldCgwKTsKICAgICByZXR1cm4gcmV0OwogfQogCiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgVHJhY2tQb3B1cE1lbnUzMiAgIChVU0VSMzIuNTQ4KQorICovCitCT09MMzIgVHJhY2tQb3B1cE1lbnUzMiggSE1FTlUzMiBoTWVudSwgVUlOVDMyIHdGbGFncywgSU5UMzIgeCwgSU5UMzIgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJTlQzMiBuUmVzZXJ2ZWQsIEhXTkQzMiBoV25kLCBjb25zdCBSRUNUMzIgKmxwUmVjdCApCit7CisgICAgUkVDVDE2IHI7CisgICAgQ09OVl9SRUNUMzJUTzE2KCBscFJlY3QsICZyICk7CisgICAgcmV0dXJuIFRyYWNrUG9wdXBNZW51MTYoIGhNZW51LCB3RmxhZ3MsIHgsIHksIG5SZXNlcnZlZCwgaFduZCwgJnIgKTsKK30KKworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBQb3B1cE1lbnVXbmRQcm9jCiAgKi8KQEAgLTE3OTgsMTIgKzE4MjAsMTIgQEAKICAgICB7CiAgICAgY2FzZSBXTV9DUkVBVEU6CiAJewotCSAgICBDUkVBVEVTVFJVQ1QgKmNyZWF0ZVN0cnVjdCA9IChDUkVBVEVTVFJVQ1QqKVBUUl9TRUdfVE9fTElOKGxQYXJhbSk7CisJICAgIENSRUFURVNUUlVDVDE2ICpjcyA9IChDUkVBVEVTVFJVQ1QxNiopUFRSX1NFR19UT19MSU4obFBhcmFtKTsKICNpZmRlZiBXSU5FTElCMzIKLQkgICAgSE1FTlUgaG1lbnUgPSAoSE1FTlUpIChjcmVhdGVTdHJ1Y3QtPmxwQ3JlYXRlUGFyYW1zKTsKKwkgICAgSE1FTlUgaG1lbnUgPSAoSE1FTlUpIChjcy0+bHBDcmVhdGVQYXJhbXMpOwogCSAgICBTZXRXaW5kb3dMb25nKCBod25kLCAwLCBobWVudSApOwogI2Vsc2UKLQkgICAgSE1FTlUgaG1lbnUgPSAoSE1FTlUpICgoaW50KWNyZWF0ZVN0cnVjdC0+bHBDcmVhdGVQYXJhbXMgJiAweGZmZmYpOworCSAgICBITUVOVSBobWVudSA9IChITUVOVSkgKChpbnQpY3MtPmxwQ3JlYXRlUGFyYW1zICYgMHhmZmZmKTsKIAkgICAgU2V0V2luZG93V29yZCggaHduZCwgMCwgaG1lbnUgKTsKICNlbmRpZgogCSAgICByZXR1cm4gMDsKQEAgLTE4MTQsOCArMTgzNiw4IEBACiAKICAgICBjYXNlIFdNX1BBSU5UOgogCXsKLQkgICAgUEFJTlRTVFJVQ1QgcHM7Ci0JICAgIEJlZ2luUGFpbnQoIGh3bmQsICZwcyApOworCSAgICBQQUlOVFNUUlVDVDE2IHBzOworCSAgICBCZWdpblBhaW50MTYoIGh3bmQsICZwcyApOwogCSAgICBNRU5VX0RyYXdQb3B1cE1lbnUoIGh3bmQsIHBzLmhkYywKICNpZmRlZiBXSU5FTElCMzIKIAkJCSAgICAgICAgKEhNRU5VKUdldFdpbmRvd0xvbmcoIGh3bmQsIDAgKQpAQCAtMTgyMyw3ICsxODQ1LDcgQEAKIAkJCSAgICAgICAgKEhNRU5VKUdldFdpbmRvd1dvcmQoIGh3bmQsIDAgKQogI2VuZGlmCiAgCQkJICAgICAgICk7Ci0JICAgIEVuZFBhaW50KCBod25kLCAmcHMgKTsKKwkgICAgRW5kUGFpbnQxNiggaHduZCwgJnBzICk7CiAJICAgIHJldHVybiAwOwogCX0KIApAQCAtMTg2MSw3ICsxODgzLDcgQEAKIFVJTlQgTUVOVV9HZXRNZW51QmFySGVpZ2h0KCBIV05EIGh3bmQsIFVJTlQgbWVudWJhcldpZHRoLCBpbnQgb3JnWCwgaW50IG9yZ1kgKQogewogICAgIEhEQyBoZGM7Ci0gICAgUkVDVCByZWN0QmFyOworICAgIFJFQ1QxNiByZWN0QmFyOwogICAgIFdORCAqd25kUHRyOwogICAgIExQUE9QVVBNRU5VIGxwcG9wOwogCkBAIC0xODY5LDcgKzE4OTEsNyBAQAogICAgIGlmICghKGxwcG9wID0gKExQUE9QVVBNRU5VKVVTRVJfSEVBUF9MSU5fQUREUigoSE1FTlUpd25kUHRyLT53SURtZW51KSkpCiAgICAgICByZXR1cm4gMDsKICAgICBoZGMgPSBHZXREQyggaHduZCApOwotICAgIFNldFJlY3QoICZyZWN0QmFyLCBvcmdYLCBvcmdZLCBvcmdYK21lbnViYXJXaWR0aCwgb3JnWStTWVNNRVRSSUNTX0NZTUVOVSApOworICAgIFNldFJlY3QxNigmcmVjdEJhciwgb3JnWCwgb3JnWSwgb3JnWCttZW51YmFyV2lkdGgsIG9yZ1krU1lTTUVUUklDU19DWU1FTlUpOwogICAgIE1FTlVfTWVudUJhckNhbGNTaXplKCBoZGMsICZyZWN0QmFyLCBscHBvcCwgaHduZCApOwogICAgIFJlbGVhc2VEQyggaHduZCwgaGRjICk7CiAgICAgcmV0dXJuIGxwcG9wLT5IZWlnaHQ7CkBAIC0xOTg0LDggKzIwMDYsOCBAQAogICAgIGlmICghKGxwaXRlbSA9IE1FTlVfRmluZEl0ZW0oICZoTWVudSwgJndJdGVtSUQsIHdIaWxpdGUgKSkpIHJldHVybiBGQUxTRTsKICAgICBpZiAoIShtZW51ID0gKExQUE9QVVBNRU5VKSBVU0VSX0hFQVBfTElOX0FERFIoaE1lbnUpKSkgcmV0dXJuIEZBTFNFOwogICAgIGlmIChtZW51LT5Gb2N1c2VkSXRlbSA9PSB3SXRlbUlEKSByZXR1cm4gVFJVRTsKLSAgICBNRU5VX0hpZGVTdWJQb3B1cHMoIGhXbmQsIGhNZW51ICk7Ci0gICAgTUVOVV9TZWxlY3RJdGVtKCBoV25kLCBoTWVudSwgd0l0ZW1JRCApOworICAgIE1FTlVfSGlkZVN1YlBvcHVwcyggaFduZCwgaE1lbnUsIEZBTFNFICk7CisgICAgTUVOVV9TZWxlY3RJdGVtKCBoV25kLCBoTWVudSwgd0l0ZW1JRCwgVFJVRSApOwogICAgIHJldHVybiBUUlVFOwogfQogCmRpZmYgLS1naXQgYS9jb250cm9scy9zY3JvbGwuYyBiL2NvbnRyb2xzL3Njcm9sbC5jCmluZGV4IGUwZTc2MTcuLjkzMmY1ODQgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL3Njcm9sbC5jCisrKyBiL2NvbnRyb2xzL3Njcm9sbC5jCkBAIC0xNDYsNyArMTQ2LDcgQEAKICAqIHRoZSB0aHVtYiByZWxhdGl2ZSB0byB0aGUgbGVmdCBvciB0byB0aGUgdG9wLgogICogUmV0dXJuIFRSVUUgaWYgdGhlIHNjcm9sbGJhciBpcyB2ZXJ0aWNhbCwgRkFMU0UgaWYgaG9yaXpvbnRhbC4KICAqLwotc3RhdGljIEJPT0wgU0NST0xMX0dldFNjcm9sbEJhclJlY3QoIEhXTkQgaHduZCwgaW50IG5CYXIsIFJFQ1QgKmxwcmVjdCwKK3N0YXRpYyBCT09MIFNDUk9MTF9HZXRTY3JvbGxCYXJSZWN0KCBIV05EIGh3bmQsIGludCBuQmFyLCBSRUNUMTYgKmxwcmVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXT1JEICphcnJvd1NpemUsIFdPUkQgKnRodW1iUG9zICkKIHsKICAgICBpbnQgcGl4ZWxzOwpAQCAtMTcyLDcgKzE3Miw3IEBACiAJYnJlYWs7CiAKICAgICAgIGNhc2UgU0JfQ1RMOgotCUdldENsaWVudFJlY3QoIGh3bmQsIGxwcmVjdCApOworCUdldENsaWVudFJlY3QxNiggaHduZCwgbHByZWN0ICk7CiAgICAgICAgIHZlcnRpY2FsID0gKCh3bmRQdHItPmR3U3R5bGUgJiBTQlNfVkVSVCkgIT0gMCk7CiAJYnJlYWs7CiAKQEAgLTIxNSw3ICsyMTUsNyBAQAogICogQ29tcHV0ZSB0aGUgY3VycmVudCBzY3JvbGwgcG9zaXRpb24gYmFzZWQgb24gdGhlIHRodW1iIHBvc2l0aW9uIGluIHBpeGVscwogICogZnJvbSB0aGUgdG9wIG9mIHRoZSBzY3JvbGwtYmFyLgogICovCi1zdGF0aWMgVUlOVCBTQ1JPTExfR2V0VGh1bWJWYWwoIFNDUk9MTElORk8gKmluZm9QdHIsIFJFQ1QgKnJlY3QsCitzdGF0aWMgVUlOVCBTQ1JPTExfR2V0VGh1bWJWYWwoIFNDUk9MTElORk8gKmluZm9QdHIsIFJFQ1QxNiAqcmVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCB2ZXJ0aWNhbCwgV09SRCBwb3MgKQogewogICAgIGludCBwaXhlbHMgPSB2ZXJ0aWNhbCA/IHJlY3QtPmJvdHRvbS1yZWN0LT50b3AgOiByZWN0LT5yaWdodC1yZWN0LT5sZWZ0OwpAQCAtMjM3LDE0ICsyMzcsMTQgQEAKICAqCiAgKiBTY3JvbGwtYmFyIGhpdCB0ZXN0aW5nIChkb24ndCBjb25mdXNlIHRoaXMgd2l0aCBXTV9OQ0hJVFRFU1QhKS4KICAqLwotc3RhdGljIGVudW0gU0NST0xMX0hJVFRFU1QgU0NST0xMX0hpdFRlc3QoIEhXTkQgaHduZCwgaW50IG5CYXIsIFBPSU5UIHB0ICkKK3N0YXRpYyBlbnVtIFNDUk9MTF9ISVRURVNUIFNDUk9MTF9IaXRUZXN0KCBIV05EIGh3bmQsIGludCBuQmFyLCBQT0lOVDE2IHB0ICkKIHsKICAgICBXT1JEIGFycm93U2l6ZSwgdGh1bWJQb3M7Ci0gICAgUkVDVCByZWN0OworICAgIFJFQ1QxNiByZWN0OwogCiAgICAgQk9PTCB2ZXJ0aWNhbCA9IFNDUk9MTF9HZXRTY3JvbGxCYXJSZWN0KCBod25kLCBuQmFyLCAmcmVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhcnJvd1NpemUsICZ0aHVtYlBvcyApOwotICAgIGlmICghUHRJblJlY3QoICZyZWN0LCBwdCApKSByZXR1cm4gU0NST0xMX05PV0hFUkU7CisgICAgaWYgKCFQdEluUmVjdDE2KCAmcmVjdCwgcHQgKSkgcmV0dXJuIFNDUk9MTF9OT1dIRVJFOwogCiAgICAgaWYgKHZlcnRpY2FsKQogICAgIHsKQEAgLTI3NCw3ICsyNzQsNyBAQAogICoKICAqIERyYXcgdGhlIHNjcm9sbCBiYXIgYXJyb3dzLgogICovCi1zdGF0aWMgdm9pZCBTQ1JPTExfRHJhd0Fycm93cyggSERDIGhkYywgU0NST0xMSU5GTyAqaW5mb1B0ciwgUkVDVCAqcmVjdCwKK3N0YXRpYyB2b2lkIFNDUk9MTF9EcmF3QXJyb3dzKCBIREMgaGRjLCBTQ1JPTExJTkZPICppbmZvUHRyLCBSRUNUMTYgKnJlY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV09SRCBhcnJvd1NpemUsIEJPT0wgdmVydGljYWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCB0b3BfcHJlc3NlZCwgQk9PTCBib3R0b21fcHJlc3NlZCApCiB7CkBAIC0zMTUsMTAgKzMxNSwxMCBAQAogICoKICAqIERyYXcgdGhlIG1vdmluZyB0aHVtYiByZWN0YW5nbGUuCiAgKi8KLXN0YXRpYyB2b2lkIFNDUk9MTF9EcmF3TW92aW5nVGh1bWIoIEhEQyBoZGMsIFJFQ1QgKnJlY3QsIEJPT0wgdmVydGljYWwsCitzdGF0aWMgdm9pZCBTQ1JPTExfRHJhd01vdmluZ1RodW1iKCBIREMgaGRjLCBSRUNUMTYgKnJlY3QsIEJPT0wgdmVydGljYWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXT1JEIGFycm93U2l6ZSwgV09SRCB0aHVtYlBvcyApCiB7Ci0gICAgUkVDVCByID0gKnJlY3Q7CisgICAgUkVDVDE2IHIgPSAqcmVjdDsKICAgICBpZiAodmVydGljYWwpCiAgICAgewogICAgICAgICByLnRvcCArPSB0aHVtYlBvczsKQEAgLTMzNSw4ICszMzUsOCBAQAogICAgICAgICAgICAgci5sZWZ0ID0gcmVjdC0+cmlnaHQgLSBhcnJvd1NpemUgLSBTWVNNRVRSSUNTX0NYVlNDUk9MTCAtIDE7CiAgICAgICAgIHIucmlnaHQgPSByLmxlZnQgKyBTWVNNRVRSSUNTX0NYVlNDUk9MTCArIDE7CiAgICAgfQotICAgIEluZmxhdGVSZWN0KCAmciwgLTEsIC0xICk7Ci0gICAgRHJhd0ZvY3VzUmVjdCggaGRjLCAmciApOworICAgIEluZmxhdGVSZWN0MTYoICZyLCAtMSwgLTEgKTsKKyAgICBEcmF3Rm9jdXNSZWN0MTYoIGhkYywgJnIgKTsKIH0KIAogCkBAIC0zNDUsMTIgKzM0NSwxMiBAQAogICoKICAqIERyYXcgdGhlIHNjcm9sbCBiYXIgaW50ZXJpb3IgKGV2ZXJ5dGhpbmcgZXhjZXB0IHRoZSBhcnJvd3MpLgogICovCi1zdGF0aWMgdm9pZCBTQ1JPTExfRHJhd0ludGVyaW9yKCBIV05EIGh3bmQsIEhEQyBoZGMsIGludCBuQmFyLCBSRUNUICpyZWN0LAorc3RhdGljIHZvaWQgU0NST0xMX0RyYXdJbnRlcmlvciggSFdORCBod25kLCBIREMgaGRjLCBpbnQgbkJhciwgUkVDVDE2ICpyZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV09SRCBhcnJvd1NpemUsIFdPUkQgdGh1bWJQb3MsIFdPUkQgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MIHZlcnRpY2FsLCBCT09MIHRvcF9zZWxlY3RlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgYm90dG9tX3NlbGVjdGVkICkKIHsKLSAgICBSRUNUIHI7CisgICAgUkVDVDE2IHI7CiAKICAgICAgIC8qIFNlbGVjdCB0aGUgY29ycmVjdCBicnVzaCBhbmQgcGVuICovCiAKQEAgLTQzOCw3ICs0MzgsNyBAQAogCiAgICAgU2VsZWN0T2JqZWN0KCBoZGMsIHN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hCdG5GYWNlICk7CiAgICAgUmVjdGFuZ2xlKCBoZGMsIHIubGVmdCwgci50b3AsIHIucmlnaHQsIHIuYm90dG9tICk7Ci0gICAgSW5mbGF0ZVJlY3QoICZyLCAtMSwgLTEgKTsKKyAgICBJbmZsYXRlUmVjdDE2KCAmciwgLTEsIC0xICk7CiAgICAgR1JBUEhfRHJhd1JlbGllZlJlY3QoIGhkYywgJnIsIDEsIDIsIEZBTFNFICk7CiAgICAgaWYgKChod25kVHJhY2tpbmcgPT0gaHduZCkgJiYgKG5CYXJUcmFja2luZyA9PSBuQmFyKSkKICAgICAgICAgU0NST0xMX0RyYXdNb3ZpbmdUaHVtYiggaGRjLCByZWN0LCB2ZXJ0aWNhbCwgYXJyb3dTaXplLCB1VHJhY2tpbmdQb3MpOwpAQCAtNDUzLDcgKzQ1Myw3IEBACiB2b2lkIFNDUk9MTF9EcmF3U2Nyb2xsQmFyKCBIV05EIGh3bmQsIEhEQyBoZGMsIGludCBuQmFyICkKIHsKICAgICBXT1JEIGFycm93U2l6ZSwgdGh1bWJQb3M7Ci0gICAgUkVDVCByZWN0OworICAgIFJFQ1QxNiByZWN0OwogICAgIEJPT0wgdmVydGljYWw7CiAgICAgV05EICp3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApOwogICAgIFNDUk9MTElORk8gKmluZm9QdHIgPSBTQ1JPTExfR2V0UHRyU2Nyb2xsSW5mbyggd25kUHRyLCBuQmFyICk7CkBAIC00ODMsNyArNDgzLDcgQEAKIHN0YXRpYyB2b2lkIFNDUk9MTF9SZWZyZXNoU2Nyb2xsQmFyKCBIV05EIGh3bmQsIGludCBuQmFyICkKIHsKICAgICBXT1JEIGFycm93U2l6ZSwgdGh1bWJQb3M7Ci0gICAgUkVDVCByZWN0OworICAgIFJFQ1QxNiByZWN0OwogICAgIEJPT0wgdmVydGljYWw7CiAgICAgSERDIGhkYzsKICAgICBXTkQgKnduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICk7CkBAIC01NDMsMTAgKzU0MywxMCBAQAogICogJ3B0JyBpcyB0aGUgbG9jYXRpb24gb2YgdGhlIG1vdXNlIGV2ZW50IGluIGNsaWVudCAoZm9yIFNCX0NUTCkgb3IKICAqIHdpbmRvd3MgY29vcmRpbmF0ZXMuCiAgKi8KLXZvaWQgU0NST0xMX0hhbmRsZVNjcm9sbEV2ZW50KCBIV05EIGh3bmQsIGludCBuQmFyLCBXT1JEIG1zZywgUE9JTlQgcHQgKQordm9pZCBTQ1JPTExfSGFuZGxlU2Nyb2xsRXZlbnQoIEhXTkQgaHduZCwgaW50IG5CYXIsIFdPUkQgbXNnLCBQT0lOVDE2IHB0ICkKIHsKICAgICAgIC8qIFByZXZpb3VzIG1vdXNlIHBvc2l0aW9uIGZvciB0aW1lciBldmVudHMgKi8KLSAgICBzdGF0aWMgUE9JTlQgcHJldlB0OworICAgIHN0YXRpYyBQT0lOVDE2IHByZXZQdDsKICAgICAgIC8qIEhpdCB0ZXN0IGNvZGUgb2YgdGhlIGxhc3QgYnV0dG9uLWRvd24gZXZlbnQgKi8KICAgICBzdGF0aWMgZW51bSBTQ1JPTExfSElUVEVTVCB0cmFja0hpdFRlc3Q7CiAgICAgICAvKiBUaHVtYiBwb3NpdGlvbiB3aGVuIHRyYWNraW5nIHN0YXJ0ZWQuICovCkBAIC01NjAsNyArNTYwLDcgQEAKICAgICBIV05EIGh3bmRPd25lciwgaHduZEN0bDsKICAgICBCT09MIHZlcnRpY2FsOwogICAgIFdPUkQgYXJyb3dTaXplLCB0aHVtYlBvczsKLSAgICBSRUNUIHJlY3Q7CisgICAgUkVDVDE2IHJlY3Q7CiAgICAgSERDIGhkYzsKIAogICAgIFNDUk9MTElORk8gKmluZm9QdHIgPSBTQ1JPTExfR2V0U2Nyb2xsSW5mbyggaHduZCwgbkJhciApOwpAQCAtNjc1LDcgKzY3NSw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIFVJTlQgcG9zLCB2YWw7CiAKLSAgICAgICAgICAgIGlmICghUHRJblJlY3QoICZyZWN0LCBwdCApKSBwb3MgPSBsYXN0Q2xpY2tQb3M7CisgICAgICAgICAgICBpZiAoIVB0SW5SZWN0MTYoICZyZWN0LCBwdCApKSBwb3MgPSBsYXN0Q2xpY2tQb3M7CiAgICAgICAgICAgICBlbHNlIHBvcyA9IHZlcnRpY2FsID8gKHB0LnkgLSByZWN0LnRvcCkgOiAocHQueCAtIHJlY3QubGVmdCk7CiAgICAgICAgICAgICBpZiAocG9zICE9IGxhc3RNb3VzZVBvcykKICAgICAgICAgICAgIHsKQEAgLTc3OSwxNSArNzc5LDExIEBACiAgKi8KIExPTkcgU2Nyb2xsQmFyV25kUHJvYyggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApCiB7Ci0gICAgUE9JTlQgUHQ7Ci0gICAgUHQueCA9IExPV09SRChsUGFyYW0pOyBQdC55ID0gSElXT1JEKGxQYXJhbSk7Ci0gICAgLyogXiBDYW4ndCB1c2UgTUFLRVBPSU5UIG1hY3JvIGluIFdJTkVMSUIzMiAqLwotCiAgICAgc3dpdGNoKG1lc3NhZ2UpCiAgICAgewogICAgIGNhc2UgV01fQ1JFQVRFOgogICAgICAgICB7Ci0JICAgIENSRUFURVNUUlVDVCAqbHBDcmVhdCA9IChDUkVBVEVTVFJVQ1QgKilQVFJfU0VHX1RPX0xJTihsUGFyYW0pOworCSAgICBDUkVBVEVTVFJVQ1QxNiAqbHBDcmVhdCA9IChDUkVBVEVTVFJVQ1QxNiAqKVBUUl9TRUdfVE9fTElOKGxQYXJhbSk7CiAgICAgICAgICAgICBpZiAobHBDcmVhdC0+c3R5bGUgJiBTQlNfU0laRUJPWCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBmcHJpbnRmKCBzdGRuaW1wLCAiVW5pbXBsZW1lbnRlZCBzdHlsZSBTQlNfU0laRUJPWC5cbiIgKTsKQEAgLTgyNSw3ICs4MjEsNyBAQAogICAgIGNhc2UgV01fTEJVVFRPTlVQOgogICAgIGNhc2UgV01fTU9VU0VNT1ZFOgogICAgIGNhc2UgV01fU1lTVElNRVI6Ci0gICAgICAgIFNDUk9MTF9IYW5kbGVTY3JvbGxFdmVudCggaHduZCwgU0JfQ1RMLCBtZXNzYWdlLCBQdCApOworICAgICAgICBTQ1JPTExfSGFuZGxlU2Nyb2xsRXZlbnQoIGh3bmQsIFNCX0NUTCwgbWVzc2FnZSwgTUFLRVBPSU5UMTYobFBhcmFtKSApOwogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgV01fS0VZRE9XTjoKQEAgLTg0MCwxMCArODM2LDEwIEBACiAKICAgICBjYXNlIFdNX1BBSU5UOgogICAgICAgICB7Ci0gICAgICAgICAgICBQQUlOVFNUUlVDVCBwczsKLSAgICAgICAgICAgIEhEQyBoZGMgPSBCZWdpblBhaW50KCBod25kLCAmcHMgKTsKKyAgICAgICAgICAgIFBBSU5UU1RSVUNUMTYgcHM7CisgICAgICAgICAgICBIREMxNiBoZGMgPSBCZWdpblBhaW50MTYoIGh3bmQsICZwcyApOwogICAgICAgICAgICAgU0NST0xMX0RyYXdTY3JvbGxCYXIoIGh3bmQsIGhkYywgU0JfQ1RMICk7Ci0gICAgICAgICAgICBFbmRQYWludCggaHduZCwgJnBzICk7CisgICAgICAgICAgICBFbmRQYWludDE2KCBod25kLCAmcHMgKTsKICAgICAgICAgfQogICAgICAgICBicmVhazsKIApkaWZmIC0tZ2l0IGEvY29udHJvbHMvc3RhdGljLmMgYi9jb250cm9scy9zdGF0aWMuYwppbmRleCA5Yjg4MTE2Li43YWY1MjZmIDEwMDY0NAotLS0gYS9jb250cm9scy9zdGF0aWMuYworKysgYi9jb250cm9scy9zdGF0aWMuYwpAQCAtNzksMTkgKzc5LDE4IEBACiAKIAlzd2l0Y2ggKHVNc2cpIHsKIAljYXNlIFdNX0VOQUJMRToKLQkgICAgSW52YWxpZGF0ZVJlY3QoaFduZCwgTlVMTCwgRkFMU0UpOworCSAgICBJbnZhbGlkYXRlUmVjdDMyKCBoV25kLCBOVUxMLCBGQUxTRSApOwogCSAgICBicmVhazsKIAogICAgICAgICBjYXNlIFdNX05DQ1JFQVRFOgogCSAgICBpZiAoc3R5bGUgPT0gU1NfSUNPTikKICAgICAgICAgICAgIHsKLQkJQ1JFQVRFU1RSVUNUICogY3JlYXRlU3RydWN0ID0gKENSRUFURVNUUlVDVCAqKVBUUl9TRUdfVE9fTElOKGxQYXJhbSk7Ci0JCWlmIChjcmVhdGVTdHJ1Y3QtPmxwc3pOYW1lKQorCQlDUkVBVEVTVFJVQ1QxNiAqY3MgPSAoQ1JFQVRFU1RSVUNUMTYgKilQVFJfU0VHX1RPX0xJTihsUGFyYW0pOworCQlpZiAoY3MtPmxwc3pOYW1lKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgSElDT04gaGljb24gPSBMb2FkSWNvbiggY3JlYXRlU3RydWN0LT5oSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVN0cnVjdC0+bHBzek5hbWUgKTsKKyAgICAgICAgICAgICAgICAgICAgSElDT04gaGljb24gPSBMb2FkSWNvbiggY3MtPmhJbnN0YW5jZSwgY3MtPmxwc3pOYW1lICk7CiAgICAgICAgICAgICAgICAgICAgIGlmICghaGljb24pICAvKiBUcnkgT0VNIGljb24gKEZJWE1FOiBpcyB0aGlzIHJpZ2h0PykgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGhpY29uID0gTG9hZEljb24oIDAsIGNyZWF0ZVN0cnVjdC0+bHBzek5hbWUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhpY29uID0gTG9hZEljb24oIDAsIGNzLT5scHN6TmFtZSApOwogICAgICAgICAgICAgICAgICAgICBTVEFUSUNfU2V0SWNvbiggd25kUHRyLCBoaWNvbiApOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICByZXR1cm4gMTsKQEAgLTEyMCwxMSArMTE5LDExIEBACiAKIAljYXNlIFdNX1BBSU5UOgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFBBSU5UU1RSVUNUIHBzOwotICAgICAgICAgICAgICAgIEJlZ2luUGFpbnQoIGhXbmQsICZwcyApOworICAgICAgICAgICAgICAgIFBBSU5UU1RSVUNUMTYgcHM7CisgICAgICAgICAgICAgICAgQmVnaW5QYWludDE2KCBoV25kLCAmcHMgKTsKICAgICAgICAgICAgICAgICBpZiAoc3RhdGljUGFpbnRGdW5jW3N0eWxlXSkKICAgICAgICAgICAgICAgICAgICAgKHN0YXRpY1BhaW50RnVuY1tzdHlsZV0pKCB3bmRQdHIsIHBzLmhkYyApOwotICAgICAgICAgICAgICAgIEVuZFBhaW50KCBoV25kLCAmcHMgKTsKKyAgICAgICAgICAgICAgICBFbmRQYWludDE2KCBoV25kLCAmcHMgKTsKICAgICAgICAgICAgIH0KIAkgICAgYnJlYWs7CiAKQEAgLTEzMiw3ICsxMzEsNyBAQAogCSAgICBjb2xvcl93aW5kb3dmcmFtZSAgPSBHZXRTeXNDb2xvcihDT0xPUl9XSU5ET1dGUkFNRSk7CiAJICAgIGNvbG9yX2JhY2tncm91bmQgICA9IEdldFN5c0NvbG9yKENPTE9SX0JBQ0tHUk9VTkQpOwogCSAgICBjb2xvcl93aW5kb3cgICAgICAgPSBHZXRTeXNDb2xvcihDT0xPUl9XSU5ET1cpOwotCSAgICBJbnZhbGlkYXRlUmVjdChoV25kLCBOVUxMLCBUUlVFKTsKKwkgICAgSW52YWxpZGF0ZVJlY3QzMiggaFduZCwgTlVMTCwgVFJVRSApOwogCSAgICBicmVhazsKIAogCWNhc2UgV01fU0VUVEVYVDoKQEAgLTE0Miw3ICsxNDEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU0VHUFRSKWxQYXJhbSApKTsKICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICBERUZXTkRfU2V0VGV4dCggd25kUHRyLCAoTFBTVFIpUFRSX1NFR19UT19MSU4obFBhcmFtKSApOwotCSAgICBJbnZhbGlkYXRlUmVjdCggaFduZCwgTlVMTCwgRkFMU0UgKTsKKwkgICAgSW52YWxpZGF0ZVJlY3QzMiggaFduZCwgTlVMTCwgRkFMU0UgKTsKIAkgICAgVXBkYXRlV2luZG93KCBoV25kICk7CiAJICAgIGJyZWFrOwogCkBAIC0xNTEsNyArMTUwLDcgQEAKICAgICAgICAgICAgIGluZm9QdHItPmhGb250ID0gKEhGT05UKXdQYXJhbTsKICAgICAgICAgICAgIGlmIChMT1dPUkQobFBhcmFtKSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBJbnZhbGlkYXRlUmVjdCggaFduZCwgTlVMTCwgRkFMU0UgKTsKKyAgICAgICAgICAgICAgICBJbnZhbGlkYXRlUmVjdDMyKCBoV25kLCBOVUxMLCBGQUxTRSApOwogICAgICAgICAgICAgICAgIFVwZGF0ZVdpbmRvdyggaFduZCApOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CkBAIC0xNzAsNyArMTY5LDcgQEAKIAogCWNhc2UgU1RNX1NFVElDT046CiAgICAgICAgICAgICBsUmVzdWx0ID0gU1RBVElDX1NldEljb24oIHduZFB0ciwgKEhJQ09OKXdQYXJhbSApOwotICAgICAgICAgICAgSW52YWxpZGF0ZVJlY3QoIGhXbmQsIE5VTEwsIEZBTFNFICk7CisgICAgICAgICAgICBJbnZhbGlkYXRlUmVjdDMyKCBoV25kLCBOVUxMLCBGQUxTRSApOwogICAgICAgICAgICAgVXBkYXRlV2luZG93KCBoV25kICk7CiAJICAgIGJyZWFrOwogCkBAIC0xODUsNyArMTg0LDcgQEAKIAogc3RhdGljIHZvaWQgU1RBVElDX1BhaW50VGV4dGZuKCBXTkQgKnduZFB0ciwgSERDIGhkYyApCiB7Ci0gICAgUkVDVCByYzsKKyAgICBSRUNUMTYgcmM7CiAgICAgSEJSVVNIIGhCcnVzaDsKICAgICBjaGFyICp0ZXh0OwogICAgIFdPUkQgd0Zvcm1hdDsKQEAgLTE5Myw3ICsxOTIsNyBAQAogICAgIExPTkcgc3R5bGUgPSB3bmRQdHItPmR3U3R5bGU7CiAgICAgU1RBVElDSU5GTyAqaW5mb1B0ciA9IChTVEFUSUNJTkZPICopd25kUHRyLT53RXh0cmE7CiAKLSAgICBHZXRDbGllbnRSZWN0KCB3bmRQdHItPmh3bmRTZWxmLCAmcmMpOworICAgIEdldENsaWVudFJlY3QxNiggd25kUHRyLT5od25kU2VsZiwgJnJjKTsKICAgICB0ZXh0ID0gVVNFUl9IRUFQX0xJTl9BRERSKCB3bmRQdHItPmhUZXh0ICk7CiAKICAgICBzd2l0Y2ggKHN0eWxlICYgMHgwMDAwMDAwRikKQEAgLTIzNCw0MiArMjMzLDQyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BS0VMT05HKHduZFB0ci0+aHduZFNlbGYsIENUTENPTE9SX1NUQVRJQykpOwogI2VuZGlmCiAgICAgaWYgKCFoQnJ1c2gpIGhCcnVzaCA9IEdldFN0b2NrT2JqZWN0KFdISVRFX0JSVVNIKTsKLSAgICBGaWxsUmVjdChoZGMsICZyYywgaEJydXNoKTsKLSAgICBpZiAodGV4dCkgRHJhd1RleHQoIGhkYywgdGV4dCwgLTEsICZyYywgd0Zvcm1hdCApOworICAgIEZpbGxSZWN0MTYoaGRjLCAmcmMsIGhCcnVzaCk7CisgICAgaWYgKHRleHQpIERyYXdUZXh0MTYoIGhkYywgdGV4dCwgLTEsICZyYywgd0Zvcm1hdCApOwogfQogCiBzdGF0aWMgdm9pZCBTVEFUSUNfUGFpbnRSZWN0Zm4oIFdORCAqd25kUHRyLCBIREMgaGRjICkKIHsKLSAgICBSRUNUIHJjOworICAgIFJFQ1QxNiByYzsKICAgICBIQlJVU0ggaEJydXNoOwogCi0gICAgR2V0Q2xpZW50UmVjdCggd25kUHRyLT5od25kU2VsZiwgJnJjKTsKKyAgICBHZXRDbGllbnRSZWN0MTYoIHduZFB0ci0+aHduZFNlbGYsICZyYyk7CiAgICAgCiAgICAgc3dpdGNoICh3bmRQdHItPmR3U3R5bGUgJiAweDBmKQogICAgIHsKICAgICBjYXNlIFNTX0JMQUNLUkVDVDoKIAloQnJ1c2ggPSBDcmVhdGVTb2xpZEJydXNoKGNvbG9yX3dpbmRvd2ZyYW1lKTsKLSAgICAgICAgRmlsbFJlY3QoIGhkYywgJnJjLCBoQnJ1c2ggKTsKKyAgICAgICAgRmlsbFJlY3QxNiggaGRjLCAmcmMsIGhCcnVzaCApOwogCWJyZWFrOwogICAgIGNhc2UgU1NfR1JBWVJFQ1Q6CiAJaEJydXNoID0gQ3JlYXRlU29saWRCcnVzaChjb2xvcl9iYWNrZ3JvdW5kKTsKLSAgICAgICAgRmlsbFJlY3QoIGhkYywgJnJjLCBoQnJ1c2ggKTsKKyAgICAgICAgRmlsbFJlY3QxNiggaGRjLCAmcmMsIGhCcnVzaCApOwogCWJyZWFrOwogICAgIGNhc2UgU1NfV0hJVEVSRUNUOgogCWhCcnVzaCA9IENyZWF0ZVNvbGlkQnJ1c2goY29sb3Jfd2luZG93KTsKLSAgICAgICAgRmlsbFJlY3QoIGhkYywgJnJjLCBoQnJ1c2ggKTsKKyAgICAgICAgRmlsbFJlY3QxNiggaGRjLCAmcmMsIGhCcnVzaCApOwogCWJyZWFrOwogICAgIGNhc2UgU1NfQkxBQ0tGUkFNRToKIAloQnJ1c2ggPSBDcmVhdGVTb2xpZEJydXNoKGNvbG9yX3dpbmRvd2ZyYW1lKTsKLSAgICAgICAgRnJhbWVSZWN0KCBoZGMsICZyYywgaEJydXNoICk7CisgICAgICAgIEZyYW1lUmVjdDE2KCBoZGMsICZyYywgaEJydXNoICk7CiAJYnJlYWs7CiAgICAgY2FzZSBTU19HUkFZRlJBTUU6CiAJaEJydXNoID0gQ3JlYXRlU29saWRCcnVzaChjb2xvcl9iYWNrZ3JvdW5kKTsKLSAgICAgICAgRnJhbWVSZWN0KCBoZGMsICZyYywgaEJydXNoICk7CisgICAgICAgIEZyYW1lUmVjdDE2KCBoZGMsICZyYywgaEJydXNoICk7CiAJYnJlYWs7CiAgICAgY2FzZSBTU19XSElURUZSQU1FOgogCWhCcnVzaCA9IENyZWF0ZVNvbGlkQnJ1c2goY29sb3Jfd2luZG93KTsKLSAgICAgICAgRnJhbWVSZWN0KCBoZGMsICZyYywgaEJydXNoICk7CisgICAgICAgIEZyYW1lUmVjdDE2KCBoZGMsICZyYywgaEJydXNoICk7CiAJYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgICAgcmV0dXJuOwpAQCAtMjgwLDExICsyNzksMTEgQEAKIAogc3RhdGljIHZvaWQgU1RBVElDX1BhaW50SWNvbmZuKCBXTkQgKnduZFB0ciwgSERDIGhkYyApCiB7Ci0gICAgUkVDVCAJcmM7CisgICAgUkVDVDE2IHJjOwogICAgIEhCUlVTSCAgICAgIGhicnVzaDsKICAgICBTVEFUSUNJTkZPICppbmZvUHRyID0gKFNUQVRJQ0lORk8gKil3bmRQdHItPndFeHRyYTsKIAotICAgIEdldENsaWVudFJlY3QoIHduZFB0ci0+aHduZFNlbGYsICZyYyk7CisgICAgR2V0Q2xpZW50UmVjdDE2KCB3bmRQdHItPmh3bmRTZWxmLCAmcmMpOwogI2lmZGVmIFdJTkVMSUIzMgogICAgIGhicnVzaCA9IFNlbmRNZXNzYWdlKCBHZXRQYXJlbnQod25kUHRyLT5od25kU2VsZiksIFdNX0NUTENPTE9SU1RBVElDLAogICAgICAgICAgICAgICAgICAgICAgICAgICBoZGMsIHduZFB0ci0+aHduZFNlbGYgKTsKQEAgLTI5Miw2ICsyOTEsNiBAQAogICAgIGhicnVzaCA9IFNlbmRNZXNzYWdlKCBHZXRQYXJlbnQod25kUHRyLT5od25kU2VsZiksIFdNX0NUTENPTE9SLCBoZGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BS0VMT05HKHduZFB0ci0+aHduZFNlbGYsIENUTENPTE9SX1NUQVRJQykpOwogI2VuZGlmCi0gICAgRmlsbFJlY3QoIGhkYywgJnJjLCBoYnJ1c2ggKTsKKyAgICBGaWxsUmVjdDE2KCBoZGMsICZyYywgaGJydXNoICk7CiAgICAgaWYgKGluZm9QdHItPmhJY29uKSBEcmF3SWNvbiggaGRjLCByYy5sZWZ0LCByYy50b3AsIGluZm9QdHItPmhJY29uICk7CiB9CmRpZmYgLS1naXQgYS9jb250cm9scy93aWRnZXRzLmMgYi9jb250cm9scy93aWRnZXRzLmMKaW5kZXggMWY3MzdiYy4uZGM1YTQ0MSAxMDA2NDQKLS0tIGEvY29udHJvbHMvd2lkZ2V0cy5jCisrKyBiL2NvbnRyb2xzL3dpZGdldHMuYwpAQCAtMTMsMzggKzEzLDM4IEBACiAjaW5jbHVkZSAiZ2RpLmgiCiAjaW5jbHVkZSAidXNlci5oIgogI2luY2x1ZGUgIm1vZHVsZS5oIgotI2luY2x1ZGUgInN0YWNrZnJhbWUuaCIKKyNpbmNsdWRlICJoZWFwLmgiCiAKIHN0YXRpYyBXTkRDTEFTUzE2IFdJREdFVFNfQnVpbHRpbkNsYXNzZXNbXSA9CiB7CiAgICAgeyBDU19HTE9CQUxDTEFTUyB8IENTX0RCTENMS1MgfCBDU19WUkVEUkFXIHwgQ1NfSFJFRFJBVyB8IENTX1BBUkVOVERDLAotICAgICAgICAgIChXTkRQUk9DKSJCdXR0b25XbmRQcm9jIiwgMCwgc2l6ZW9mKEJVVFRPTklORk8pLAorICAgICAgICAgIChXTkRQUk9DMTYpIkJ1dHRvblduZFByb2MiLCAwLCBzaXplb2YoQlVUVE9OSU5GTyksCiAgICAgICAgICAgMCwgMCwgMCwgMCwgMCwgKFNFR1BUUikiQlVUVE9OIiB9LAogICAgIHsgQ1NfR0xPQkFMQ0xBU1MgfCBDU19QQVJFTlREQywKLSAgICAgICAgICAoV05EUFJPQykiU3RhdGljV25kUHJvYyIsIDAsIHNpemVvZihTVEFUSUNJTkZPKSwKKyAgICAgICAgICAoV05EUFJPQzE2KSJTdGF0aWNXbmRQcm9jIiwgMCwgc2l6ZW9mKFNUQVRJQ0lORk8pLAogICAgICAgICAgIDAsIDAsIDAsIDAsIDAsIChTRUdQVFIpIlNUQVRJQyIgfSwKICAgICB7IENTX0dMT0JBTENMQVNTIHwgQ1NfREJMQ0xLUyB8IENTX1ZSRURSQVcgfCBDU19IUkVEUkFXIHwgQ1NfUEFSRU5UREMsCi0gICAgICAgICAgKFdORFBST0MpIlNjcm9sbEJhclduZFByb2MiLCAwLCBzaXplb2YoU0NST0xMSU5GTyksCisgICAgICAgICAgKFdORFBST0MxNikiU2Nyb2xsQmFyV25kUHJvYyIsIDAsIHNpemVvZihTQ1JPTExJTkZPKSwKICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAoU0VHUFRSKSJTQ1JPTExCQVIiIH0sCiAgICAgeyBDU19HTE9CQUxDTEFTUyB8IENTX1BBUkVOVERDIHwgQ1NfREJMQ0xLUywKLSAgICAgICAgICAoV05EUFJPQykiTGlzdEJveFduZFByb2MiLCAwLCA4LAorICAgICAgICAgIChXTkRQUk9DMTYpIkxpc3RCb3hXbmRQcm9jIiwgMCwgOCwKICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAoU0VHUFRSKSJMSVNUQk9YIiB9LAogICAgIHsgQ1NfR0xPQkFMQ0xBU1MgfCBDU19QQVJFTlREQyB8IENTX0RCTENMS1MsCi0gICAgICAgICAgKFdORFBST0MpIkNvbWJvQm94V25kUHJvYyIsIDAsIDgsCisgICAgICAgICAgKFdORFBST0MxNikiQ29tYm9Cb3hXbmRQcm9jIiwgMCwgOCwKICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAoU0VHUFRSKSJDT01CT0JPWCIgfSwKICAgICB7IENTX0dMT0JBTENMQVNTIHwgQ1NfREJMQ0xLUyB8IENTX1NBVkVCSVRTLAotICAgICAgICAgIChXTkRQUk9DKSJDb21ib0xCb3hXbmRQcm9jIiwgMCwgOCwKKyAgICAgICAgICAoV05EUFJPQzE2KSJDb21ib0xCb3hXbmRQcm9jIiwgMCwgOCwKICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAoU0VHUFRSKSJDT01CT0xCT1giIH0sCiAgICAgeyBDU19HTE9CQUxDTEFTUyB8IENTX1BBUkVOVERDIHwgQ1NfREJMQ0xLUywKLSAgICAgICAgICAoV05EUFJPQykiRWRpdFduZFByb2MiLCAwLCBzaXplb2YoRFdPUkQpLAorICAgICAgICAgIChXTkRQUk9DMTYpIkVkaXRXbmRQcm9jIiwgMCwgc2l6ZW9mKERXT1JEKSwKICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAoU0VHUFRSKSJFRElUIiB9LAotICAgIHsgQ1NfR0xPQkFMQ0xBU1MgfCBDU19TQVZFQklUUywgKFdORFBST0MpIlBvcHVwTWVudVduZFByb2MiLCAwLCA4LAorICAgIHsgQ1NfR0xPQkFMQ0xBU1MgfCBDU19TQVZFQklUUywgKFdORFBST0MxNikiUG9wdXBNZW51V25kUHJvYyIsIDAsIDgsCiAgICAgICAgICAgMCwgMCwgMCwgMCwgMCwgKFNFR1BUUilQT1BVUE1FTlVfQ0xBU1NfTkFNRSB9LAotICAgIHsgQ1NfR0xPQkFMQ0xBU1MsIChXTkRQUk9DKSJEZXNrdG9wV25kUHJvYyIsIDAsIHNpemVvZihERVNLVE9QSU5GTyksCisgICAgeyBDU19HTE9CQUxDTEFTUywgKFdORFBST0MxNikiRGVza3RvcFduZFByb2MiLCAwLCBzaXplb2YoREVTS1RPUElORk8pLAogICAgICAgICAgIDAsIDAsIDAsIDAsIDAsIChTRUdQVFIpREVTS1RPUF9DTEFTU19OQU1FIH0sCi0gICAgeyBDU19HTE9CQUxDTEFTUyB8IENTX1NBVkVCSVRTLCAoV05EUFJPQykiRGVmRGxnUHJvYyIsIDAsIERMR1dJTkRPV0VYVFJBLAorICAgIHsgQ1NfR0xPQkFMQ0xBU1MgfCBDU19TQVZFQklUUywgKFdORFBST0MxNikiRGVmRGxnUHJvYyIsIDAsIERMR1dJTkRPV0VYVFJBLAogICAgICAgICAgIDAsIDAsIDAsIDAsIDAsIChTRUdQVFIpRElBTE9HX0NMQVNTX05BTUUgfSwKLSAgICB7IENTX0dMT0JBTENMQVNTLCAoV05EUFJPQykiTURJQ2xpZW50V25kUHJvYyIsIDAsIHNpemVvZihNRElDTElFTlRJTkZPKSwKKyAgICB7IENTX0dMT0JBTENMQVNTLCAoV05EUFJPQzE2KSJNRElDbGllbnRXbmRQcm9jIiwgMCwgc2l6ZW9mKE1ESUNMSUVOVElORk8pLAogICAgICAgICAgIDAsIDAsIDAsIFNUT0NLX0xUR1JBWV9CUlVTSCwgMCwgKFNFR1BUUikiTURJQ0xJRU5UIiB9CiB9OwogCkBAIC02MCwxNiArNjAsMTggQEAKIEJPT0wgV0lER0VUU19Jbml0KHZvaWQpCiB7CiAgICAgaW50IGk7Ci0gICAgY2hhciBuYW1lWzIwXTsKKyAgICBjaGFyICpuYW1lOwogICAgIFdORENMQVNTMTYgKmNsYXNzID0gV0lER0VUU19CdWlsdGluQ2xhc3NlczsKIAorICAgIGlmICghKG5hbWUgPSBTRUdQVFJfQUxMT0MoIDIwICogc2l6ZW9mKGNoYXIpICkpKSByZXR1cm4gRkFMU0U7CiAgICAgZm9yIChpID0gMDsgaSA8IE5CX0JVSUxUSU5fQ0xBU1NFUzsgaSsrLCBjbGFzcysrKQogICAgIHsKICAgICAgICAgc3RyY3B5KCBuYW1lLCAoY2hhciAqKWNsYXNzLT5scHN6Q2xhc3NOYW1lICk7Ci0gICAgICAgIGNsYXNzLT5scHN6Q2xhc3NOYW1lID0gTUFLRV9TRUdQVFIobmFtZSk7CisgICAgICAgIGNsYXNzLT5scHN6Q2xhc3NOYW1lID0gU0VHUFRSX0dFVChuYW1lKTsKICAgICAgICAgY2xhc3MtPmhDdXJzb3IgPSBMb2FkQ3Vyc29yKCAwLCBJRENfQVJST1cgKTsKICAgICAgICAgY2xhc3MtPmxwZm5XbmRQcm9jID0gTU9EVUxFX0dldFduZFByb2NFbnRyeTE2KCAoY2hhciAqKWNsYXNzLT5scGZuV25kUHJvYyApOwogICAgICAgICBpZiAoIVJlZ2lzdGVyQ2xhc3MxNiggY2xhc3MgKSkgcmV0dXJuIEZBTFNFOwogICAgIH0KKyAgICBTRUdQVFJfRlJFRShuYW1lKTsKICAgICByZXR1cm4gVFJVRTsKIH0KZGlmZiAtLWdpdCBhL2ZpbGVzL2RyaXZlLmMgYi9maWxlcy9kcml2ZS5jCmluZGV4IDkyYzJjMjYuLmMxYjNlNjggMTAwNjQ0Ci0tLSBhL2ZpbGVzL2RyaXZlLmMKKysrIGIvZmlsZXMvZHJpdmUuYwpAQCAtNDc0LDMgKzQ3NCwyOCBAQAogICAgIGRlZmF1bHQ6ICAgICAgICAgICByZXR1cm4gRFJJVkVfQ0FOTk9UREVURVJNSU5FOwogICAgIH0KIH0KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBHZXRDdXJyZW50RGlyZWN0b3J5ICAgKEtFUk5FTC40MTEpCisgKi8KK1VJTlQzMiBHZXRDdXJyZW50RGlyZWN0b3J5KCBVSU5UMzIgYnVmbGVuLCBMUFNUUiBidWYgKQoreworICAgIGNvbnN0IGNoYXIgKnMgPSBEUklWRV9HZXREb3NDd2QoIERSSVZFX0dldEN1cnJlbnREcml2ZSgpICk7CisgICAgaWYgKCFzKQorICAgIHsKKyAgICAgICAgKmJ1ZiA9ICdcMCc7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBsc3RyY3B5biggYnVmLCBzLCBidWZsZW4gKTsKKyAgICByZXR1cm4gc3RybGVuKHMpOyAvKiB5ZXMgKi8KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBTZXRDdXJyZW50RGlyZWN0b3J5ICAgKEtFUk5FTC40MTIpCisgKi8KK0JPT0wzMiBTZXRDdXJyZW50RGlyZWN0b3J5KCBMUENTVFIgZGlyICkKK3sKKyAgICByZXR1cm4gRFJJVkVfQ2hkaXIoIERSSVZFX0dldEN1cnJlbnREcml2ZSgpLCBkaXIgKTsKK30KZGlmZiAtLWdpdCBhL2lmMTYzMi9NYWtlZmlsZS5pbiBiL2lmMTYzMi9NYWtlZmlsZS5pbgppbmRleCBjMzNiZjUyLi5hZTE4MzRkIDEwMDY0NAotLS0gYS9pZjE2MzIvTWFrZWZpbGUuaW4KKysrIGIvaWYxNjMyL01ha2VmaWxlLmluCkBAIC01MCw4ICs1MCw3IEBACiBDX1NSQ1MgPSBcCiAJY2FsbGJhY2suYyBcCiAJZHVtbXkuYyBcCi0JcmVsYXkuYyBcCi0JcmVsYXkzMi5jCisJcmVsYXkuYwogCiBBU01fU1JDUyA9IFwKIAkkKFNQRUNfRklMRVMpIFwKZGlmZiAtLWdpdCBhL2lmMTYzMi9hZHZhcGkzMi5zcGVjIGIvaWYxNjMyL2FkdmFwaTMyLnNwZWMKaW5kZXggMjg5MTZjNC4uNTY0N2FjYiAxMDA2NDQKLS0tIGEvaWYxNjMyL2FkdmFwaTMyLnNwZWMKKysrIGIvaWYxNjMyL2FkdmFwaTMyLnNwZWMKQEAgLTEyOCw0MCArMTI4LDQwIEBACiAwMTIzIHN0dWIgUXVlcnlTZXJ2aWNlU3RhdHVzCiAwMTI0IHN0dWIgUmVhZEV2ZW50TG9nQQogMDEyNSBzdHViIFJlYWRFdmVudExvZ1cKLTAxMjYgCXN0ZGNhbGwgUmVnQ2xvc2VLZXkobG9uZykgUmVnQ2xvc2VLZXkKKzAxMjYgc3RkY2FsbCBSZWdDbG9zZUtleShsb25nKSBSZWdDbG9zZUtleQogMDEyNyBzdHViIFJlZ0Nvbm5lY3RSZWdpc3RyeUEKIDAxMjggc3R1YiBSZWdDb25uZWN0UmVnaXN0cnlXCi0wMTI5IAlzdGRjYWxsIFJlZ0NyZWF0ZUtleUEobG9uZyBwdHIgcHRyKSBSZWdDcmVhdGVLZXlBCi0wMTMwIAlzdGRjYWxsIFJlZ0NyZWF0ZUtleUV4QShsb25nIHB0ciBsb25nIHB0ciBsb25nIGxvbmcgcHRyIHB0ciBwdHIpIFJlZ0NyZWF0ZUtleUV4QQotMDEzMSAJc3RkY2FsbCBSZWdDcmVhdGVLZXlFeFcobG9uZyBwdHIgbG9uZyBwdHIgbG9uZyBsb25nIHB0ciBwdHIgcHRyKSBSZWdDcmVhdGVLZXlFeFcKLTAxMzIgCXN0ZGNhbGwgUmVnQ3JlYXRlS2V5Vyhsb25nIHB0ciBwdHIpIFJlZ0NyZWF0ZUtleVcKLTAxMzMgCXN0ZGNhbGwgUmVnRGVsZXRlS2V5QShsb25nIHB0cikgUmVnRGVsZXRlS2V5QQotMDEzNCAJc3RkY2FsbCBSZWdEZWxldGVLZXlXKGxvbmcgcHRyKSBSZWdEZWxldGVLZXlXCi0wMTM1IAlzdGRjYWxsCVJlZ0RlbGV0ZVZhbHVlQShsb25nIHB0cikgUmVnRGVsZXRlVmFsdWVBCi0wMTM2IAlzdGRjYWxsIFJlZ0RlbGV0ZVZhbHVlVyhsb25nIHB0cikgUmVnRGVsZXRlVmFsdWVXCi0wMTM3IAlzdGRjYWxsIFJlZ0VudW1LZXlBKGxvbmcgbG9uZyBwdHIgbG9uZykgUmVnRW51bUtleUEKLTAxMzggCXN0ZGNhbGwgUmVnRW51bUtleUV4QShsb25nIGxvbmcgcHRyIHB0ciBwdHIgcHRyIHB0ciBwdHIpIFJlZ0VudW1LZXlFeEEKLTAxMzkgCXN0ZGNhbGwgUmVnRW51bUtleUV4Vyhsb25nIGxvbmcgcHRyIHB0ciBwdHIgcHRyIHB0ciBwdHIpIFJlZ0VudW1LZXlFeFcKLTAxNDAgCXN0ZGNhbGwgUmVnRW51bUtleVcobG9uZyBsb25nIHB0ciBsb25nKSBSZWdFbnVtS2V5VwotMDE0MSAJc3RkY2FsbCBSZWdFbnVtVmFsdWVBKGxvbmcgbG9uZyBwdHIgcHRyIHB0ciBwdHIgcHRyIHB0cikgUmVnRW51bVZhbHVlQQotMDE0MiAJc3RkY2FsbCBSZWdFbnVtVmFsdWVXKGxvbmcgbG9uZyBwdHIgcHRyIHB0ciBwdHIgcHRyIHB0cikgUmVnRW51bVZhbHVlVwotMDE0MyAJc3RkY2FsbCBSZWdGbHVzaEtleShsb25nKSBSZWdGbHVzaEtleQorMDEyOSBzdGRjYWxsIFJlZ0NyZWF0ZUtleUEobG9uZyBwdHIgcHRyKSBSZWdDcmVhdGVLZXkzMkEKKzAxMzAgc3RkY2FsbCBSZWdDcmVhdGVLZXlFeEEobG9uZyBwdHIgbG9uZyBwdHIgbG9uZyBsb25nIHB0ciBwdHIgcHRyKSBSZWdDcmVhdGVLZXlFeDMyQQorMDEzMSBzdGRjYWxsIFJlZ0NyZWF0ZUtleUV4Vyhsb25nIHB0ciBsb25nIHB0ciBsb25nIGxvbmcgcHRyIHB0ciBwdHIpIFJlZ0NyZWF0ZUtleUV4MzJXCiswMTMyIHN0ZGNhbGwgUmVnQ3JlYXRlS2V5Vyhsb25nIHB0ciBwdHIpIFJlZ0NyZWF0ZUtleTMyVworMDEzMyBzdGRjYWxsIFJlZ0RlbGV0ZUtleUEobG9uZyBwdHIpIFJlZ0RlbGV0ZUtleTMyQQorMDEzNCBzdGRjYWxsIFJlZ0RlbGV0ZUtleVcobG9uZyBwdHIpIFJlZ0RlbGV0ZUtleTMyVworMDEzNSBzdGRjYWxsIFJlZ0RlbGV0ZVZhbHVlQShsb25nIHB0cikgUmVnRGVsZXRlVmFsdWUzMkEKKzAxMzYgc3RkY2FsbCBSZWdEZWxldGVWYWx1ZVcobG9uZyBwdHIpIFJlZ0RlbGV0ZVZhbHVlMzJXCiswMTM3IHN0ZGNhbGwgUmVnRW51bUtleUEobG9uZyBsb25nIHB0ciBsb25nKSBSZWdFbnVtS2V5MzJBCiswMTM4IHN0ZGNhbGwgUmVnRW51bUtleUV4QShsb25nIGxvbmcgcHRyIHB0ciBwdHIgcHRyIHB0ciBwdHIpIFJlZ0VudW1LZXlFeDMyQQorMDEzOSBzdGRjYWxsIFJlZ0VudW1LZXlFeFcobG9uZyBsb25nIHB0ciBwdHIgcHRyIHB0ciBwdHIgcHRyKSBSZWdFbnVtS2V5RXgzMlcKKzAxNDAgc3RkY2FsbCBSZWdFbnVtS2V5Vyhsb25nIGxvbmcgcHRyIGxvbmcpIFJlZ0VudW1LZXkzMlcKKzAxNDEgc3RkY2FsbCBSZWdFbnVtVmFsdWVBKGxvbmcgbG9uZyBwdHIgcHRyIHB0ciBwdHIgcHRyIHB0cikgUmVnRW51bVZhbHVlMzJBCiswMTQyIHN0ZGNhbGwgUmVnRW51bVZhbHVlVyhsb25nIGxvbmcgcHRyIHB0ciBwdHIgcHRyIHB0ciBwdHIpIFJlZ0VudW1WYWx1ZTMyVworMDE0MyBzdGRjYWxsIFJlZ0ZsdXNoS2V5KGxvbmcpIFJlZ0ZsdXNoS2V5CiAwMTQ0IHN0dWIgUmVnR2V0S2V5U2VjdXJpdHkKIDAxNDUgc3R1YiBSZWdMb2FkS2V5QQogMDE0NiBzdHViIFJlZ0xvYWRLZXlXCiAwMTQ3IHN0dWIgUmVnTm90aWZ5Q2hhbmdlS2V5VmFsdWUKLTAxNDggCXN0ZGNhbGwgUmVnT3BlbktleUEobG9uZyBwdHIgcHRyKSBSZWdPcGVuS2V5QQotMDE0OSAJc3RkY2FsbCBSZWdPcGVuS2V5RXhBKGxvbmcgcHRyIGxvbmcgbG9uZyBwdHIpIFJlZ09wZW5LZXlFeEEKLTAxNTAgCXN0ZGNhbGwgUmVnT3BlbktleUV4Vyhsb25nIHB0ciBsb25nIGxvbmcgcHRyKSBSZWdPcGVuS2V5RXhXCi0wMTUxIAlzdGRjYWxsIFJlZ09wZW5LZXlXKGxvbmcgcHRyIHB0cikgUmVnT3BlbktleVcKLTAxNTIgCXN0ZGNhbGwgUmVnUXVlcnlJbmZvS2V5QShsb25nIHB0ciBwdHIgcHRyIHB0ciBwdHIgcHRyIHB0ciBwdHIgcHRyIHB0ciBwdHIpIFJlZ1F1ZXJ5SW5mb0tleUEKLTAxNTMgCXN0ZGNhbGwgUmVnUXVlcnlJbmZvS2V5Vyhsb25nIHB0ciBwdHIgcHRyIHB0ciBwdHIgcHRyIHB0ciBwdHIgcHRyIHB0ciBwdHIpIFJlZ1F1ZXJ5SW5mb0tleVcKKzAxNDggc3RkY2FsbCBSZWdPcGVuS2V5QShsb25nIHB0ciBwdHIpIFJlZ09wZW5LZXkzMkEKKzAxNDkgc3RkY2FsbCBSZWdPcGVuS2V5RXhBKGxvbmcgcHRyIGxvbmcgbG9uZyBwdHIpIFJlZ09wZW5LZXlFeDMyQQorMDE1MCBzdGRjYWxsIFJlZ09wZW5LZXlFeFcobG9uZyBwdHIgbG9uZyBsb25nIHB0cikgUmVnT3BlbktleUV4MzJXCiswMTUxIHN0ZGNhbGwgUmVnT3BlbktleVcobG9uZyBwdHIgcHRyKSBSZWdPcGVuS2V5MzJXCiswMTUyIHN0ZGNhbGwgUmVnUXVlcnlJbmZvS2V5QShsb25nIHB0ciBwdHIgcHRyIHB0ciBwdHIgcHRyIHB0ciBwdHIgcHRyIHB0ciBwdHIpIFJlZ1F1ZXJ5SW5mb0tleTMyQQorMDE1MyBzdGRjYWxsIFJlZ1F1ZXJ5SW5mb0tleVcobG9uZyBwdHIgcHRyIHB0ciBwdHIgcHRyIHB0ciBwdHIgcHRyIHB0ciBwdHIgcHRyKSBSZWdRdWVyeUluZm9LZXkzMlcKIDAxNTQgc3R1YiBSZWdRdWVyeU11bHRpcGxlVmFsdWVzQQogMDE1NSBzdHViIFJlZ1F1ZXJ5TXVsdGlwbGVWYWx1ZXNXCi0wMTU2IAlzdGRjYWxsIFJlZ1F1ZXJ5VmFsdWVBKGxvbmcgcHRyIHB0ciBwdHIpIFJlZ1F1ZXJ5VmFsdWVBCi0wMTU3IAlzdGRjYWxsIFJlZ1F1ZXJ5VmFsdWVFeEEobG9uZyBwdHIgcHRyIHB0ciBwdHIgcHRyKSBSZWdRdWVyeVZhbHVlRXhBCi0wMTU4IAlzdGRjYWxsIFJlZ1F1ZXJ5VmFsdWVFeFcobG9uZyBwdHIgcHRyIHB0ciBwdHIgcHRyKSBSZWdRdWVyeVZhbHVlRXhXCi0wMTU5IAlzdGRjYWxsIFJlZ1F1ZXJ5VmFsdWVXKGxvbmcgcHRyIHB0ciBwdHIpIFJlZ1F1ZXJ5VmFsdWVXCiswMTU2IHN0ZGNhbGwgUmVnUXVlcnlWYWx1ZUEobG9uZyBwdHIgcHRyIHB0cikgUmVnUXVlcnlWYWx1ZTMyQQorMDE1NyBzdGRjYWxsIFJlZ1F1ZXJ5VmFsdWVFeEEobG9uZyBwdHIgcHRyIHB0ciBwdHIgcHRyKSBSZWdRdWVyeVZhbHVlRXgzMkEKKzAxNTggc3RkY2FsbCBSZWdRdWVyeVZhbHVlRXhXKGxvbmcgcHRyIHB0ciBwdHIgcHRyIHB0cikgUmVnUXVlcnlWYWx1ZUV4MzJXCiswMTU5IHN0ZGNhbGwgUmVnUXVlcnlWYWx1ZVcobG9uZyBwdHIgcHRyIHB0cikgUmVnUXVlcnlWYWx1ZTMyVwogMDE2MCBzdHViIFJlZ1JlbWFwUHJlRGVmS2V5CiAwMTYxIHN0dWIgUmVnUmVwbGFjZUtleUEKIDAxNjIgc3R1YiBSZWdSZXBsYWNlS2V5VwpAQCAtMTcwLDEwICsxNzAsMTAgQEAKIDAxNjUgc3R1YiBSZWdTYXZlS2V5QQogMDE2NiBzdHViIFJlZ1NhdmVLZXlXCiAwMTY3IHN0dWIgUmVnU2V0S2V5U2VjdXJpdHkKLTAxNjggCXN0ZGNhbGwgUmVnU2V0VmFsdWVBKGxvbmcgcHRyIGxvbmcgcHRyIGxvbmcpIFJlZ1NldFZhbHVlQQotMDE2OSAJc3RkY2FsbCBSZWdTZXRWYWx1ZUV4QShsb25nIHB0ciBsb25nIGxvbmcgcHRyIGxvbmcpIFJlZ1NldFZhbHVlRXhBCi0wMTcwIAlzdGRjYWxsIFJlZ1NldFZhbHVlRXhXKGxvbmcgcHRyIGxvbmcgbG9uZyBwdHIgbG9uZykgUmVnU2V0VmFsdWVFeFcKLTAxNzEgCXN0ZGNhbGwgUmVnU2V0VmFsdWVXKGxvbmcgcHRyIGxvbmcgcHRyIGxvbmcpIFJlZ1NldFZhbHVlVworMDE2OCBzdGRjYWxsIFJlZ1NldFZhbHVlQShsb25nIHB0ciBsb25nIHB0ciBsb25nKSBSZWdTZXRWYWx1ZTMyQQorMDE2OSBzdGRjYWxsIFJlZ1NldFZhbHVlRXhBKGxvbmcgcHRyIGxvbmcgbG9uZyBwdHIgbG9uZykgUmVnU2V0VmFsdWVFeDMyQQorMDE3MCBzdGRjYWxsIFJlZ1NldFZhbHVlRXhXKGxvbmcgcHRyIGxvbmcgbG9uZyBwdHIgbG9uZykgUmVnU2V0VmFsdWVFeDMyVworMDE3MSBzdGRjYWxsIFJlZ1NldFZhbHVlVyhsb25nIHB0ciBsb25nIHB0ciBsb25nKSBSZWdTZXRWYWx1ZTMyVwogMDE3MiBzdHViIFJlZ1VuTG9hZEtleUEKIDAxNzMgc3R1YiBSZWdVbkxvYWRLZXlXCiAwMTc0IHN0dWIgUmVnaXN0ZXJFdmVudFNvdXJjZUEKQEAgLTIwMiw0ICsyMDIsMyBAQAogMDE5NyBzdHViIFN0YXJ0U2VydmljZUN0cmxEaXNwYXRjaGVyVwogMDE5OCBzdHViIFN0YXJ0U2VydmljZVcKIDAxOTkgc3R1YiBVbmxvY2tTZXJ2aWNlRGF0YWJhc2UKLQpkaWZmIC0tZ2l0IGEvaWYxNjMyL2NhbGxiYWNrLmMgYi9pZjE2MzIvY2FsbGJhY2suYwppbmRleCA5MWU5MWUyLi4zMTMyNTFjIDEwMDY0NAotLS0gYS9pZjE2MzIvY2FsbGJhY2suYworKysgYi9pZjE2MzIvY2FsbGJhY2suYwpAQCAtOSw0MCArOSwxMSBAQAogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJjYWxsYmFjay5oIgogI2luY2x1ZGUgInN0YWNrZnJhbWUuaCIKLSNpbmNsdWRlICJ3aW4uaCIKLSNpbmNsdWRlICJhbGlhcy5oIgotI2luY2x1ZGUgInJlbGF5MzIuaCIKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCSAgICAgQ2FsbFdpbmRvd1Byb2MgICAgKFVTRVIuMTIyKQotICovCi1MT05HIENhbGxXaW5kb3dQcm9jKCBXTkRQUk9DIGZ1bmMsIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLAotCQkgICAgIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApCi17Ci0gICAgRlVOQ1RJT05BTElBUyAqYTsKLSAgICBXTkQgKnduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICk7Ci0KLSAgICBpZiAoIXduZFB0cikgcmV0dXJuIDA7Ci0KLSAgICAvKiBjaGVjayBpZiB3ZSBoYXZlIHNvbWV0aGluZyBiZXR0ZXIgdGhhbiAxNiBiaXQgcmVsYXlzICovCi0gICAgaWYoIUFMSUFTX1VzZUFsaWFzZXMgfHwgIShhPUFMSUFTX0xvb2t1cEFsaWFzKChEV09SRClmdW5jKSkgfHwKLSAgICAgICAgKCFhLT53aW5lICYmICFhLT53aW4zMikpCi0gICAgICAgIHJldHVybiBDYWxsV25kUHJvYyggKEZBUlBST0MpZnVuYywgd25kUHRyLT5oSW5zdGFuY2UsIAotICAgICAgICAgICAgICAgICAgICAgICAgaHduZCwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0gKTsKLSAgICBpZihhLT53aW5lKQotICAgICAgICByZXR1cm4gKChMT05HKCopKFdPUkQsV09SRCxXT1JELExPTkcpKShhLT53aW5lKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaHduZCxtZXNzYWdlLHdQYXJhbSxsUGFyYW0pOwotICAgIGlmKCFhLT53aW4zMikKLSAgICAgICAgZnByaW50ZihzdGRlcnIsIldoZXJlIGlzIHRoZSBXaW4zMiBjYWxsYmFjaz9cbiIpOwotICAgIGlmIChVc2VzTFBhcmFtUHRyKG1lc3NhZ2UpKQotCXJldHVybiBSRUxBWTMyX0NhbGxXaW5kb3dQcm9jQ29udlN0cnVjdChhLT53aW4zMixod25kLG1lc3NhZ2Usd1BhcmFtLGxQYXJhbSk7Ci0gICAgcmV0dXJuIENhbGxXbmRQcm9jMzIoIChGQVJQUk9DKWEtPndpbjMyLCBod25kLCBtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJICAgICBDYXRjaCAgICAoS0VSTkVMLjU1KQogICovCiBJTlQgQ2F0Y2goIExQQ0FUQ0hCVUYgbHBidWYgKQpkaWZmIC0tZ2l0IGEvaWYxNjMyL2dkaS5zcGVjIGIvaWYxNjMyL2dkaS5zcGVjCmluZGV4IDliMTk1NjQuLjNkOTExOWEgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9nZGkuc3BlYworKysgYi9pZjE2MzIvZ2RpLnNwZWMKQEAgLTM4LDEzICszOCwxMyBAQAogMzAgIHBhc2NhbDE2IFNhdmVEQyh3b3JkKSBTYXZlREMKIDMxICBwYXNjYWwgICBTZXRQaXhlbCh3b3JkIHNfd29yZCBzX3dvcmQgbG9uZykgU2V0UGl4ZWwKIDMyICBwYXNjYWwxNiBPZmZzZXRDbGlwUmduKHdvcmQgc193b3JkIHNfd29yZCkgT2Zmc2V0Q2xpcFJnbgotMzMgIHBhc2NhbDE2IFRleHRPdXQod29yZCBzX3dvcmQgc193b3JkIHB0ciB3b3JkKSBUZXh0T3V0CiszMyAgcGFzY2FsMTYgVGV4dE91dCh3b3JkIHNfd29yZCBzX3dvcmQgcHRyIHdvcmQpIFRleHRPdXQxNgogMzQgIHBhc2NhbDE2IEJpdEJsdCggd29yZCBzX3dvcmQgc193b3JkIHNfd29yZCBzX3dvcmQgd29yZCBzX3dvcmQgc193b3JkIGxvbmcpCiAgICAgICAgICAgICAgQml0Qmx0CiAzNSAgcGFzY2FsMTYgU3RyZXRjaEJsdCh3b3JkIHNfd29yZCBzX3dvcmQgc193b3JkIHNfd29yZCB3b3JkIHNfd29yZCBzX3dvcmQKICAgICAgICAgICAgICAgICAgICAgICAgIHNfd29yZCBzX3dvcmQgbG9uZykgU3RyZXRjaEJsdAotMzYgIHBhc2NhbDE2IFBvbHlnb24gKHdvcmQgcHRyIHdvcmQpIFBvbHlnb24gCi0zNyAgcGFzY2FsMTYgUG9seWxpbmUgKHdvcmQgcHRyIHdvcmQpIFBvbHlsaW5lIAorMzYgIHBhc2NhbDE2IFBvbHlnb24gKHdvcmQgcHRyIHdvcmQpIFBvbHlnb24xNgorMzcgIHBhc2NhbDE2IFBvbHlsaW5lICh3b3JkIHB0ciB3b3JkKSBQb2x5bGluZTE2CiAzOCAgcGFzY2FsIEVzY2FwZSh3b3JkIHdvcmQgd29yZCBwdHIgcHRyKSBFc2NhcGUKIDM5ICBwYXNjYWwxNiBSZXN0b3JlREMod29yZCBzX3dvcmQpIFJlc3RvcmVEQwogNDAgIHBhc2NhbDE2IEZpbGxSZ24od29yZCB3b3JkIHdvcmQpIEZpbGxSZ24KQEAgLTU0LDcgKzU0LDcgQEAKIDQ0ICBwYXNjYWwxNiBTZWxlY3RDbGlwUmduKHdvcmQgd29yZCkgU2VsZWN0Q2xpcFJnbgogNDUgIHBhc2NhbDE2IFNlbGVjdE9iamVjdCh3b3JkIHdvcmQpIFNlbGVjdE9iamVjdAogIzQ2ICBwYXNjYWwgX19HUD8KLTQ3ICBwYXNjYWwxNiBDb21iaW5lUmduKHdvcmQgd29yZCB3b3JkIHdvcmQpIENvbWJpbmVSZ24KKzQ3ICBwYXNjYWwxNiBDb21iaW5lUmduKHdvcmQgd29yZCB3b3JkIHNfd29yZCkgQ29tYmluZVJnbgogNDggIHBhc2NhbDE2IENyZWF0ZUJpdG1hcCh3b3JkIHdvcmQgd29yZCB3b3JkIHB0cikgQ3JlYXRlQml0bWFwCiA0OSAgcGFzY2FsMTYgQ3JlYXRlQml0bWFwSW5kaXJlY3QocHRyKSBDcmVhdGVCaXRtYXBJbmRpcmVjdAogNTAgIHBhc2NhbDE2IENyZWF0ZUJydXNoSW5kaXJlY3QocHRyKSBDcmVhdGVCcnVzaEluZGlyZWN0CkBAIC02Miw3ICs2Miw3IEBACiA1MiAgcGFzY2FsMTYgQ3JlYXRlQ29tcGF0aWJsZURDKHdvcmQpIENyZWF0ZUNvbXBhdGlibGVEQwogNTMgIHBhc2NhbDE2IENyZWF0ZURDKHB0ciBwdHIgcHRyIHB0cikgQ3JlYXRlREMKIDU0ICBwYXNjYWwxNiBDcmVhdGVFbGxpcHRpY1JnbihzX3dvcmQgc193b3JkIHNfd29yZCBzX3dvcmQpIENyZWF0ZUVsbGlwdGljUmduCi01NSAgcGFzY2FsMTYgQ3JlYXRlRWxsaXB0aWNSZ25JbmRpcmVjdChwdHIpIENyZWF0ZUVsbGlwdGljUmduSW5kaXJlY3QKKzU1ICBwYXNjYWwxNiBDcmVhdGVFbGxpcHRpY1JnbkluZGlyZWN0KHB0cikgQ3JlYXRlRWxsaXB0aWNSZ25JbmRpcmVjdDE2CiA1NiAgcGFzY2FsMTYgQ3JlYXRlRm9udChzX3dvcmQgc193b3JkIHNfd29yZCBzX3dvcmQgc193b3JkIHdvcmQgd29yZCB3b3JkCiAgICAgICAgICAgICAgICAgICAgICAgICB3b3JkIHdvcmQgd29yZCB3b3JkIHdvcmQgcHRyKSBDcmVhdGVGb250CiA1NyAgcGFzY2FsMTYgQ3JlYXRlRm9udEluZGlyZWN0KHB0cikgQ3JlYXRlRm9udEluZGlyZWN0CkBAIC03MCwxMSArNzAsMTEgQEAKIDYwICBwYXNjYWwxNiBDcmVhdGVQYXR0ZXJuQnJ1c2god29yZCkgQ3JlYXRlUGF0dGVybkJydXNoCiA2MSAgcGFzY2FsMTYgQ3JlYXRlUGVuKHNfd29yZCBzX3dvcmQgbG9uZykgQ3JlYXRlUGVuCiA2MiAgcGFzY2FsMTYgQ3JlYXRlUGVuSW5kaXJlY3QocHRyKSBDcmVhdGVQZW5JbmRpcmVjdAotNjMgIHBhc2NhbDE2IENyZWF0ZVBvbHlnb25SZ24ocHRyIHdvcmQgd29yZCkgQ3JlYXRlUG9seWdvblJnbgorNjMgIHBhc2NhbDE2IENyZWF0ZVBvbHlnb25SZ24ocHRyIHdvcmQgd29yZCkgQ3JlYXRlUG9seWdvblJnbjE2CiA2NCAgcGFzY2FsMTYgQ3JlYXRlUmVjdFJnbihzX3dvcmQgc193b3JkIHNfd29yZCBzX3dvcmQpIENyZWF0ZVJlY3RSZ24KLTY1ICBwYXNjYWwxNiBDcmVhdGVSZWN0UmduSW5kaXJlY3QocHRyKSBDcmVhdGVSZWN0UmduSW5kaXJlY3QKKzY1ICBwYXNjYWwxNiBDcmVhdGVSZWN0UmduSW5kaXJlY3QocHRyKSBDcmVhdGVSZWN0UmduSW5kaXJlY3QxNgogNjYgIHBhc2NhbDE2IENyZWF0ZVNvbGlkQnJ1c2gobG9uZykgQ3JlYXRlU29saWRCcnVzaAotNjcgIHBhc2NhbDE2IERQdG9MUCh3b3JkIHB0ciBzX3dvcmQpIERQdG9MUAorNjcgIHBhc2NhbDE2IERQdG9MUCh3b3JkIHB0ciBzX3dvcmQpIERQdG9MUDE2CiA2OCAgcGFzY2FsMTYgRGVsZXRlREMod29yZCkgRGVsZXRlREMKIDY5ICBwYXNjYWwxNiBEZWxldGVPYmplY3Qod29yZCkgRGVsZXRlT2JqZWN0CiA3MCAgcGFzY2FsMTYgRW51bUZvbnRzKHdvcmQgcHRyIHNlZ3B0ciBsb25nKSBFbnVtRm9udHMKQEAgLTg0LDcgKzg0LDcgQEAKIDc0ICBwYXNjYWwgR2V0Qml0bWFwQml0cyh3b3JkIGxvbmcgcHRyKSBHZXRCaXRtYXBCaXRzCiA3NSAgcGFzY2FsIEdldEJrQ29sb3Iod29yZCkgR2V0QmtDb2xvcgogNzYgIHBhc2NhbDE2IEdldEJrTW9kZSh3b3JkKSBHZXRCa01vZGUKLTc3ICBwYXNjYWwxNiBHZXRDbGlwQm94KHdvcmQgcHRyKSBHZXRDbGlwQm94Cis3NyAgcGFzY2FsMTYgR2V0Q2xpcEJveCh3b3JkIHB0cikgR2V0Q2xpcEJveDE2CiA3OCAgcGFzY2FsIEdldEN1cnJlbnRQb3NpdGlvbih3b3JkKSBHZXRDdXJyZW50UG9zaXRpb24KIDc5ICBwYXNjYWwgR2V0RENPcmcod29yZCkgR2V0RENPcmcKIDgwICBwYXNjYWwxNiBHZXREZXZpY2VDYXBzKHdvcmQgc193b3JkKSBHZXREZXZpY2VDYXBzCkBAIC0xMDcsMTIgKzEwNywxMiBAQAogOTcgIHBhc2NhbCBHZXRXaW5kb3dPcmcod29yZCkgR2V0V2luZG93T3JnCiA5OCAgcGFzY2FsMTYgSW50ZXJzZWN0VmlzUmVjdCh3b3JkIHNfd29yZCBzX3dvcmQgc193b3JkIHNfd29yZCkKICAgICAgICAgICAgICBJbnRlcnNlY3RWaXNSZWN0Ci05OSAgcGFzY2FsMTYgTFB0b0RQKHdvcmQgcHRyIHNfd29yZCkgTFB0b0RQCis5OSAgcGFzY2FsMTYgTFB0b0RQKHdvcmQgcHRyIHNfd29yZCkgTFB0b0RQMTYKIDEwMCBwYXNjYWwxNiBMaW5lRERBKHNfd29yZCBzX3dvcmQgc193b3JkIHNfd29yZCBzZWdwdHIgbG9uZykgTGluZUREQQogMTAxIHBhc2NhbDE2IE9mZnNldFJnbih3b3JkIHNfd29yZCBzX3dvcmQpIE9mZnNldFJnbgogMTAyIHBhc2NhbDE2IE9mZnNldFZpc1Jnbih3b3JkIHNfd29yZCBzX3dvcmQpIE9mZnNldFZpc1JnbgogMTAzIHBhc2NhbDE2IFB0VmlzaWJsZSh3b3JkIHNfd29yZCBzX3dvcmQpIFB0VmlzaWJsZQotMTA0IHBhc2NhbDE2IFJlY3RWaXNpYmxlT2xkKHdvcmQgcHRyKSBSZWN0VmlzaWJsZQorMTA0IHBhc2NhbDE2IFJlY3RWaXNpYmxlT2xkKHdvcmQgcHRyKSBSZWN0VmlzaWJsZTE2CiAxMDUgcGFzY2FsMTYgU2VsZWN0VmlzUmduKHdvcmQgd29yZCkgU2VsZWN0VmlzUmduCiAxMDYgcGFzY2FsIFNldEJpdG1hcEJpdHMod29yZCBsb25nIHB0cikgU2V0Qml0bWFwQml0cwogMTE3IHBhc2NhbCBTZXREQ09yZyh3b3JkIHNfd29yZCBzX3dvcmQpIFNldERDT3JnCkBAIC0xMzAsNyArMTMwLDcgQEAKIDEzMSBwYXNjYWwxNiBJbnF1aXJlVmlzUmduKHdvcmQpIElucXVpcmVWaXNSZ24KIDEzMiBwYXNjYWwxNiBTZXRFbnZpcm9ubWVudChwdHIgcHRyIHdvcmQpIFNldEVudmlyb25tZW50CiAxMzMgcGFzY2FsMTYgR2V0RW52aXJvbm1lbnQocHRyIHB0ciB3b3JkKSBHZXRFbnZpcm9ubWVudAotMTM0IHBhc2NhbDE2IEdldFJnbkJveCh3b3JkIHB0cikgR2V0UmduQm94CisxMzQgcGFzY2FsMTYgR2V0UmduQm94KHdvcmQgcHRyKSBHZXRSZ25Cb3gxNgogIzEzNSBwYXNjYWwgU2NhbkxyCiAxMzYgcGFzY2FsMTYgUmVtb3ZlRm9udFJlc291cmNlKHB0cikgUmVtb3ZlRm9udFJlc291cmNlCiAxNDggcGFzY2FsIFNldEJydXNoT3JnKHdvcmQgc193b3JkIHNfd29yZCkgU2V0QnJ1c2hPcmcKQEAgLTE0NCw4ICsxNDQsOCBAQAogMTU5IHBhc2NhbDE2IEdldE1ldGFGaWxlQml0cyh3b3JkKSBHZXRNZXRhRmlsZUJpdHMKIDE2MCBwYXNjYWwxNiBTZXRNZXRhRmlsZUJpdHMod29yZCkgU2V0TWV0YUZpbGVCaXRzCiAxNjEgcGFzY2FsMTYgUHRJblJlZ2lvbih3b3JkIHNfd29yZCBzX3dvcmQpIFB0SW5SZWdpb24KLTE2MiBwYXNjYWwgR2V0Qml0bWFwRGltZW5zaW9uKHdvcmQpIEdldEJpdG1hcERpbWVuc2lvbgotMTYzIHBhc2NhbCBTZXRCaXRtYXBEaW1lbnNpb24od29yZCBzX3dvcmQgc193b3JkKSBTZXRCaXRtYXBEaW1lbnNpb24KKzE2MiBwYXNjYWwgICBHZXRCaXRtYXBEaW1lbnNpb24od29yZCkgR2V0Qml0bWFwRGltZW5zaW9uCisxNjMgcGFzY2FsICAgU2V0Qml0bWFwRGltZW5zaW9uKHdvcmQgc193b3JkIHNfd29yZCkgU2V0Qml0bWFwRGltZW5zaW9uCiAxNjkgc3R1YiBJc0RDRGlydHkKIDE3MCBzdHViIFNldERDU3RhdHVzCiAxNzIgcGFzY2FsMTYgU2V0UmVjdFJnbih3b3JkIHNfd29yZCBzX3dvcmQgc193b3JkIHNfd29yZCkgU2V0UmVjdFJnbgpAQCAtMTU0LDcgKzE1NCw3IEBACiAxNzYgcGFzY2FsMTYgUGxheU1ldGFGaWxlUmVjb3JkKHdvcmQgcHRyIHB0ciB3b3JkKSBQbGF5TWV0YUZpbGVSZWNvcmQKIDE3OSBwYXNjYWwxNiBHZXREQ1N0YXRlKHdvcmQpIEdldERDU3RhdGUKIDE4MCBwYXNjYWwxNiBTZXREQ1N0YXRlKHdvcmQgd29yZCkgU2V0RENTdGF0ZQotMTgxIHBhc2NhbDE2IFJlY3RJblJlZ2lvbk9sZCh3b3JkIHB0cikgUmVjdEluUmVnaW9uCisxODEgcGFzY2FsMTYgUmVjdEluUmVnaW9uT2xkKHdvcmQgcHRyKSBSZWN0SW5SZWdpb24xNgogMTg4IHN0dWIgR2V0VGV4dEV4dGVudEV4CiAxOTAgc3R1YiBTZXREQ0hvb2sKIDE5MSBzdHViIEdldERDSG9vawpAQCAtMjM1LDcgKzIzNSw3IEBACiAgICAgICAgICAgICAgICAgICAgc193b3JkIHNfd29yZCkgQ2hvcmQKIDM0OSBwYXNjYWwgU2V0TWFwcGVyRmxhZ3Mod29yZCBsb25nKSBTZXRNYXBwZXJGbGFncwogMzUwIHBhc2NhbDE2IEdldENoYXJXaWR0aCh3b3JkIHdvcmQgd29yZCBwdHIpIEdldENoYXJXaWR0aAotMzUxIHBhc2NhbDE2IEV4dFRleHRPdXQod29yZCBzX3dvcmQgc193b3JkIHdvcmQgcHRyIHB0ciBzX3dvcmQgcHRyKSBFeHRUZXh0T3V0CiszNTEgcGFzY2FsMTYgRXh0VGV4dE91dCh3b3JkIHNfd29yZCBzX3dvcmQgd29yZCBwdHIgcHRyIHNfd29yZCBwdHIpIEV4dFRleHRPdXQxNgogMzUyIHN0dWIgR2V0UGh5c2ljYWxGb250SGFuZGxlCiAzNTMgc3R1YiBHZXRBc3BlY3RSYXRpb0ZpbHRlcgogMzU0IHN0dWIgU2hyaW5rR0RJSGVhcApAQCAtMjgzLDM3ICsyODMsMzcgQEAKICAgICAgICAgICAgICBDcmVhdGVSb3VuZFJlY3RSZ24KIDQ0NSBwYXNjYWwxNiBDcmVhdGVESUJQYXR0ZXJuQnJ1c2god29yZCB3b3JkKSBDcmVhdGVESUJQYXR0ZXJuQnJ1c2gKIDQ0OSBzdHViIERFVklDRUNPTE9STUFUQ0gKLTQ1MCBwYXNjYWwxNiBQb2x5UG9seWdvbih3b3JkIHB0ciBwdHIgd29yZCkgUG9seVBvbHlnb24KLTQ1MSBwYXNjYWwxNiBDcmVhdGVQb2x5UG9seWdvblJnbihwdHIgcHRyIHdvcmQgd29yZCkgQ3JlYXRlUG9seVBvbHlnb25SZ24KKzQ1MCBwYXNjYWwxNiBQb2x5UG9seWdvbih3b3JkIHB0ciBwdHIgd29yZCkgUG9seVBvbHlnb24xNgorNDUxIHBhc2NhbDE2IENyZWF0ZVBvbHlQb2x5Z29uUmduKHB0ciBwdHIgd29yZCB3b3JkKSBDcmVhdGVQb2x5UG9seWdvblJnbjE2CiA0NTIgc3R1YiBHRElTRUVHRElETwogNDYwIHN0dWIgR0RJVEFTS1RFUk1JTkFUSU9OCiA0NjEgcmV0dXJuIFNldE9iamVjdE93bmVyIDQgMAogNDYyIHBhc2NhbDE2IElzR0RJT2JqZWN0KHdvcmQpIElzR0RJT2JqZWN0CiA0NjMgc3R1YiBNQUtFT0JKRUNUUFJJVkFURQogNDY0IHN0dWIgRklYVVBCT0dVU1BVQkxJU0hFUk1FVEFGSUxFCi00NjUgcGFzY2FsMTYgUmVjdFZpc2libGUod29yZCBwdHIpIFJlY3RWaXNpYmxlCi00NjYgcGFzY2FsMTYgUmVjdEluUmVnaW9uKHdvcmQgcHRyKSBSZWN0SW5SZWdpb24KKzQ2NSBwYXNjYWwxNiBSZWN0VmlzaWJsZSh3b3JkIHB0cikgUmVjdFZpc2libGUxNgorNDY2IHBhc2NhbDE2IFJlY3RJblJlZ2lvbih3b3JkIHB0cikgUmVjdEluUmVnaW9uMTYKIDQ2NyBzdHViIFVOSUNPREVUT0FOU0kKLTQ2OCBwYXNjYWwxNiBHZXRCaXRtYXBEaW1lbnNpb25FeCh3b3JkIHB0cikgR2V0Qml0bWFwRGltZW5zaW9uRXgKLTQ2OSBwYXNjYWwxNiBHZXRCcnVzaE9yZ0V4KHdvcmQgcHRyKSBHZXRCcnVzaE9yZ0V4Ci00NzAgcGFzY2FsMTYgR2V0Q3VycmVudFBvc2l0aW9uRXgod29yZCBwdHIpIEdldEN1cnJlbnRQb3NpdGlvbkV4Ci00NzEgcGFzY2FsMTYgR2V0VGV4dEV4dGVudFBvaW50KHdvcmQgcHRyIHNfd29yZCBwdHIpIEdldFRleHRFeHRlbnRQb2ludAotNDcyIHBhc2NhbDE2IEdldFZpZXdwb3J0RXh0RXgod29yZCBwdHIpIEdldFZpZXdwb3J0RXh0RXgKLTQ3MyBwYXNjYWwxNiBHZXRWaWV3cG9ydE9yZ0V4KHdvcmQgcHRyKSBHZXRWaWV3cG9ydE9yZ0V4Ci00NzQgcGFzY2FsMTYgR2V0V2luZG93RXh0RXgod29yZCBwdHIpIEdldFdpbmRvd0V4dEV4Ci00NzUgcGFzY2FsMTYgR2V0V2luZG93T3JnRXgod29yZCBwdHIpIEdldFdpbmRvd09yZ0V4Ci00NzYgcGFzY2FsMTYgT2Zmc2V0Vmlld3BvcnRPcmdFeCh3b3JkIHNfd29yZCBzX3dvcmQgcHRyKSBPZmZzZXRWaWV3cG9ydE9yZ0V4Ci00NzcgcGFzY2FsMTYgT2Zmc2V0V2luZG93T3JnRXgod29yZCBzX3dvcmQgc193b3JkIHB0cikgT2Zmc2V0V2luZG93T3JnRXgKLTQ3OCBwYXNjYWwxNiBTZXRCaXRtYXBEaW1lbnNpb25FeCh3b3JkIHNfd29yZCBzX3dvcmQgcHRyKSBTZXRCaXRtYXBEaW1lbnNpb25FeAotNDc5IHBhc2NhbDE2IFNldFZpZXdwb3J0RXh0RXgod29yZCBzX3dvcmQgc193b3JkIHB0cikgU2V0Vmlld3BvcnRFeHRFeAotNDgwIHBhc2NhbDE2IFNldFZpZXdwb3J0T3JnRXgod29yZCBzX3dvcmQgc193b3JkIHB0cikgU2V0Vmlld3BvcnRPcmdFeAotNDgxIHBhc2NhbDE2IFNldFdpbmRvd0V4dEV4KHdvcmQgc193b3JkIHNfd29yZCBwdHIpIFNldFdpbmRvd0V4dEV4Ci00ODIgcGFzY2FsMTYgU2V0V2luZG93T3JnRXgod29yZCBzX3dvcmQgc193b3JkIHB0cikgU2V0V2luZG93T3JnRXgKLTQ4MyBwYXNjYWwxNiBNb3ZlVG9FeCh3b3JkIHNfd29yZCBzX3dvcmQgcHRyKSBNb3ZlVG9FeAorNDY4IHBhc2NhbDE2IEdldEJpdG1hcERpbWVuc2lvbkV4KHdvcmQgcHRyKSBHZXRCaXRtYXBEaW1lbnNpb25FeDE2Cis0NjkgcGFzY2FsMTYgR2V0QnJ1c2hPcmdFeCh3b3JkIHB0cikgR2V0QnJ1c2hPcmdFeDE2Cis0NzAgcGFzY2FsMTYgR2V0Q3VycmVudFBvc2l0aW9uRXgod29yZCBwdHIpIEdldEN1cnJlbnRQb3NpdGlvbkV4MTYKKzQ3MSBwYXNjYWwxNiBHZXRUZXh0RXh0ZW50UG9pbnQod29yZCBwdHIgc193b3JkIHB0cikgR2V0VGV4dEV4dGVudFBvaW50MTYKKzQ3MiBwYXNjYWwxNiBHZXRWaWV3cG9ydEV4dEV4KHdvcmQgcHRyKSBHZXRWaWV3cG9ydEV4dEV4MTYKKzQ3MyBwYXNjYWwxNiBHZXRWaWV3cG9ydE9yZ0V4KHdvcmQgcHRyKSBHZXRWaWV3cG9ydE9yZ0V4MTYKKzQ3NCBwYXNjYWwxNiBHZXRXaW5kb3dFeHRFeCh3b3JkIHB0cikgR2V0V2luZG93RXh0RXgxNgorNDc1IHBhc2NhbDE2IEdldFdpbmRvd09yZ0V4KHdvcmQgcHRyKSBHZXRXaW5kb3dPcmdFeDE2Cis0NzYgcGFzY2FsMTYgT2Zmc2V0Vmlld3BvcnRPcmdFeCh3b3JkIHNfd29yZCBzX3dvcmQgcHRyKSBPZmZzZXRWaWV3cG9ydE9yZ0V4MTYKKzQ3NyBwYXNjYWwxNiBPZmZzZXRXaW5kb3dPcmdFeCh3b3JkIHNfd29yZCBzX3dvcmQgcHRyKSBPZmZzZXRXaW5kb3dPcmdFeDE2Cis0NzggcGFzY2FsMTYgU2V0Qml0bWFwRGltZW5zaW9uRXgod29yZCBzX3dvcmQgc193b3JkIHB0cikgU2V0Qml0bWFwRGltZW5zaW9uRXgxNgorNDc5IHBhc2NhbDE2IFNldFZpZXdwb3J0RXh0RXgod29yZCBzX3dvcmQgc193b3JkIHB0cikgU2V0Vmlld3BvcnRFeHRFeDE2Cis0ODAgcGFzY2FsMTYgU2V0Vmlld3BvcnRPcmdFeCh3b3JkIHNfd29yZCBzX3dvcmQgcHRyKSBTZXRWaWV3cG9ydE9yZ0V4MTYKKzQ4MSBwYXNjYWwxNiBTZXRXaW5kb3dFeHRFeCh3b3JkIHNfd29yZCBzX3dvcmQgcHRyKSBTZXRXaW5kb3dFeHRFeDE2Cis0ODIgcGFzY2FsMTYgU2V0V2luZG93T3JnRXgod29yZCBzX3dvcmQgc193b3JkIHB0cikgU2V0V2luZG93T3JnRXgxNgorNDgzIHBhc2NhbDE2IE1vdmVUb0V4KHdvcmQgc193b3JkIHNfd29yZCBwdHIpIE1vdmVUb0V4MTYKIDQ4NCBwYXNjYWwxNiBTY2FsZVZpZXdwb3J0RXh0RXgod29yZCBzX3dvcmQgc193b3JkIHNfd29yZCBzX3dvcmQgcHRyKQotICAgICAgICAgICAgIFNjYWxlVmlld3BvcnRFeHRFeAorICAgICAgICAgICAgIFNjYWxlVmlld3BvcnRFeHRFeDE2CiA0ODUgcGFzY2FsMTYgU2NhbGVXaW5kb3dFeHRFeCh3b3JkIHNfd29yZCBzX3dvcmQgc193b3JkIHNfd29yZCBwdHIpCi0gICAgICAgICAgICAgU2NhbGVXaW5kb3dFeHRFeAorICAgICAgICAgICAgIFNjYWxlV2luZG93RXh0RXgxNgogNDg2IHN0dWIgR0VUQVNQRUNUUkFUSU9GSUxURVJFWAogNDg5IHN0dWIgQ3JlYXRlRElCU2VjdGlvbgogNDkwIHN0dWIgQ2xvc2VFbmhNZXRhZmlsZQpkaWZmIC0tZ2l0IGEvaWYxNjMyL2dkaTMyLnNwZWMgYi9pZjE2MzIvZ2RpMzIuc3BlYwppbmRleCBkYWU5Y2MxLi5hZmEwZDFjIDEwMDY0NAotLS0gYS9pZjE2MzIvZ2RpMzIuc3BlYworKysgYi9pZjE2MzIvZ2RpMzIuc3BlYwpAQCAtNDEsOCArNDEsOCBAQAogMDAzNiBzdHViIENyZWF0ZURJQlNlY3Rpb24KIDAwMzcgc3R1YiBDcmVhdGVESUJpdG1hcAogMDAzOCBzdHViIENyZWF0ZURpc2NhcmRhYmxlQml0bWFwCi0wMDM5IHN0dWIgQ3JlYXRlRWxsaXB0aWNSZ24KLTAwNDAgc3R1YiBDcmVhdGVFbGxpcHRpY1JnbkluZGlyZWN0CiswMDM5IHN0ZGNhbGwgQ3JlYXRlRWxsaXB0aWNSZ24obG9uZyBsb25nIGxvbmcgbG9uZykgQ3JlYXRlRWxsaXB0aWNSZ24KKzAwNDAgc3RkY2FsbCBDcmVhdGVFbGxpcHRpY1JnbkluZGlyZWN0KHB0cikgQ3JlYXRlRWxsaXB0aWNSZ25JbmRpcmVjdDMyCiAwMDQxIHN0dWIgQ3JlYXRlRW5oTWV0YUZpbGVBCiAwMDQyIHN0dWIgQ3JlYXRlRW5oTWV0YUZpbGVXCiAwMDQzIHN0dWIgQ3JlYXRlRm9udEEKQEAgLTYyLDEyICs2MiwxMiBAQAogMDA1NyBzdHViIENyZWF0ZVBvbHlQb2x5Z29uUmduCiAwMDU4IHN0dWIgQ3JlYXRlUG9seWdvblJnbgogMDA1OSBzdGRjYWxsIENyZWF0ZVJlY3RSZ24obG9uZyBsb25nIGxvbmcgbG9uZykgQ3JlYXRlUmVjdFJnbgotMDA2MCBzdHViIENyZWF0ZVJlY3RSZ25JbmRpcmVjdAotMDA2MSBzdHViIENyZWF0ZVJvdW5kUmVjdFJnbgorMDA2MCBzdGRjYWxsIENyZWF0ZVJlY3RSZ25JbmRpcmVjdChwdHIpIENyZWF0ZVJlY3RSZ25JbmRpcmVjdDMyCiswMDYxIHN0ZGNhbGwgQ3JlYXRlUm91bmRSZWN0UmduKGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nKSBDcmVhdGVSb3VuZFJlY3RSZ24KIDAwNjIgc3R1YiBDcmVhdGVTY2FsYWJsZUZvbnRSZXNvdXJjZUEKIDAwNjMgc3R1YiBDcmVhdGVTY2FsYWJsZUZvbnRSZXNvdXJjZVcKIDAwNjQgc3RkY2FsbCBDcmVhdGVTb2xpZEJydXNoKGxvbmcpIENyZWF0ZVNvbGlkQnJ1c2gKLTAwNjUgc3R1YiBEUHRvTFAKKzAwNjUgc3RkY2FsbCBEUHRvTFAobG9uZyBwdHIgbG9uZykgRFB0b0xQMzIKIDAwNjYgc3R1YiBEZWxldGVDb2xvclNwYWNlCiAwMDY3IHN0ZGNhbGwgRGVsZXRlREMobG9uZykgRGVsZXRlREMKIDAwNjggc3R1YiBEZWxldGVFbmhNZXRhRmlsZQpAQCAtOTIsNyArOTIsNyBAQAogMDA4NyBzdHViIEVudW1JQ01Qcm9maWxlc1cKIDAwODggc3R1YiBFbnVtTWV0YUZpbGUKIDAwODkgc3R1YiBFbnVtT2JqZWN0cwotMDA5MCBzdHViIEVxdWFsUmduCiswMDkwIHN0ZGNhbGwgRXF1YWxSZ24obG9uZyBsb25nKSBFcXVhbFJnbgogMDA5MSBzdHViIEVzY2FwZQogMDA5MiBzdHViIEV4Y2x1ZGVDbGlwUmVjdAogMDA5MyBzdHViIEV4dENyZWF0ZVBlbgpAQCAtMTAwLDggKzEwMCw4IEBACiAwMDk1IHN0dWIgRXh0RXNjYXBlCiAwMDk2IHN0dWIgRXh0Rmxvb2RGaWxsCiAwMDk3IHN0dWIgRXh0U2VsZWN0Q2xpcFJnbgotMDA5OCBzdHViIEV4dFRleHRPdXRBCi0wMDk5IHN0dWIgRXh0VGV4dE91dFcKKzAwOTggc3RkY2FsbCBFeHRUZXh0T3V0QShsb25nIGxvbmcgbG9uZyBsb25nIHB0ciBwdHIgbG9uZyBwdHIpIEV4dFRleHRPdXQzMkEKKzAwOTkgc3RkY2FsbCBFeHRUZXh0T3V0Vyhsb25nIGxvbmcgbG9uZyBsb25nIHB0ciBwdHIgbG9uZyBwdHIpIEV4dFRleHRPdXQzMlcKIDAxMDAgc3R1YiBGaWxsUGF0aAogMDEwMSBzdHViIEZpbGxSZ24KIDAxMDIgc3R1YiBGaXhCcnVzaE9yZ0V4CkBAIC0xNDYsNyArMTQ2LDcgQEAKIDAxNDEgc3R1YiBHZXRBcmNEaXJlY3Rpb24KIDAxNDIgc3R1YiBHZXRBc3BlY3RSYXRpb0ZpbHRlckV4CiAwMTQzIHN0dWIgR2V0Qml0bWFwQml0cwotMDE0NCBzdHViIEdldEJpdG1hcERpbWVuc2lvbkV4CiswMTQ0IHN0ZGNhbGwgR2V0Qml0bWFwRGltZW5zaW9uRXgobG9uZyBwdHIpIEdldEJpdG1hcERpbWVuc2lvbkV4MzIKIDAxNDUgc3R1YiBHZXRCa0NvbG9yCiAwMTQ2IHN0dWIgR2V0QmtNb2RlCiAwMTQ3IHN0dWIgR2V0Qm91bmRzUmVjdApAQCAtMTY0LDcgKzE2NCw3IEBACiAwMTU5IHN0dWIgR2V0Q2hhcldpZHRoV09XCiAwMTYwIHN0dWIgR2V0Q2hhcmFjdGVyUGxhY2VtZW50QQogMDE2MSBzdHViIEdldENoYXJhY3RlclBsYWNlbWVudFcKLTAxNjIgc3R1YiBHZXRDbGlwQm94CiswMTYyIHN0ZGNhbGwgR2V0Q2xpcEJveChsb25nIHB0cikgR2V0Q2xpcEJveDMyCiAwMTYzIHN0dWIgR2V0Q2xpcFJnbgogMDE2NCBzdHViIEdldENvbG9yQWRqdXN0bWVudAogMDE2NSBzdHViIEdldENvbG9yU3BhY2UKQEAgLTIyMSw4ICsyMjEsOCBAQAogMDIxNiBzdHViIEdldFJhc3Rlcml6ZXJDYXBzCiAwMjE3IHN0dWIgR2V0UmVnaW9uRGF0YQogMDIxOCBzdHViIEdldFJlbEFicwotMDIxOSBzdHViIEdldFJnbkJveAotMDIyMCBzdGRjYWxsIEdldFN0b2NrT2JqZWN0KGxvbmcpCUdldFN0b2NrT2JqZWN0CiswMjE5IHN0ZGNhbGwgR2V0UmduQm94KGxvbmcgcHRyKSBHZXRSZ25Cb3gzMgorMDIyMCBzdGRjYWxsIEdldFN0b2NrT2JqZWN0KGxvbmcpIEdldFN0b2NrT2JqZWN0CiAwMjIxIHN0dWIgR2V0U3RyZXRjaEJsdE1vZGUKIDAyMjIgc3R1YiBHZXRTeXN0ZW1QYWxldHRlRW50cmllcwogMDIyMyBzdHViIEdldFN5c3RlbVBhbGV0dGVVc2UKQEAgLTIzNCw4ICsyMzQsOCBAQAogMDIyOSBzdHViIEdldFRleHRFeHRlbnRFeFBvaW50VwogMDIzMCBzdHViIEdldFRleHRFeHRlbnRQb2ludDMyQQogMDIzMSBzdHViIEdldFRleHRFeHRlbnRQb2ludDMyVwotMDIzMiBzdGRjYWxsIEdldFRleHRFeHRlbnRQb2ludEEobG9uZyBwdHIgbG9uZyBwdHIpIFdJTjMyX0dldFRleHRFeHRlbnRQb2ludEEKLTAyMzMgc3R1YiBHZXRUZXh0RXh0ZW50UG9pbnRXCiswMjMyIHN0ZGNhbGwgR2V0VGV4dEV4dGVudFBvaW50QShsb25nIHB0ciBsb25nIHB0cikgR2V0VGV4dEV4dGVudFBvaW50MzJBCiswMjMzIHN0ZGNhbGwgR2V0VGV4dEV4dGVudFBvaW50Vyhsb25nIHB0ciBsb25nIHB0cikgR2V0VGV4dEV4dGVudFBvaW50MzJXCiAwMjM0IHN0dWIgR2V0VGV4dEZhY2VBCiAwMjM1IHN0dWIgR2V0VGV4dEZhY2VXCiAwMjM2IHN0dWIgR2V0VGV4dE1ldHJpY3NBCkBAIC0yNDksMTggKzI0OSwxOCBAQAogMDI0NCBzdHViIEdldFdvcmxkVHJhbnNmb3JtCiAwMjQ1IHN0dWIgSW50ZXJzZWN0Q2xpcFJlY3QKIDAyNDYgc3R1YiBJbnZlcnRSZ24KLTAyNDcgc3R1YiBMUHRvRFAKKzAyNDcgc3RkY2FsbCBMUHRvRFAobG9uZyBwdHIgbG9uZykgTFB0b0RQMzIKIDAyNDggc3R1YiBMaW5lRERBCiAwMjQ5IHN0ZGNhbGwgTGluZVRvKGxvbmcgbG9uZyBsb25nKSBMaW5lVG8KIDAyNTAgc3R1YiBMb2FkSW1hZ2VDb2xvck1hdGNoZXJBCiAwMjUxIHN0dWIgTG9hZEltYWdlQ29sb3JNYXRjaGVyVwogMDI1MiBzdHViIE1hc2tCbHQKIDAyNTMgc3R1YiBNb2RpZnlXb3JsZFRyYW5zZm9ybQotMDI1NCBzdGRjYWxsIE1vdmVUb0V4KGxvbmcgbG9uZyBsb25nIHB0cikgV0lOMzJfTW92ZVRvRXgKKzAyNTQgc3RkY2FsbCBNb3ZlVG9FeChsb25nIGxvbmcgbG9uZyBwdHIpIE1vdmVUb0V4MzIKIDAyNTUgc3R1YiBPZmZzZXRDbGlwUmduCi0wMjU2IHN0dWIgT2Zmc2V0UmduCi0wMjU3IHN0dWIgT2Zmc2V0Vmlld3BvcnRPcmdFeAotMDI1OCBzdHViIE9mZnNldFdpbmRvd09yZ0V4CiswMjU2IHN0ZGNhbGwgT2Zmc2V0UmduKGxvbmcgbG9uZyBsb25nKSBPZmZzZXRSZ24KKzAyNTcgc3RkY2FsbCBPZmZzZXRWaWV3cG9ydE9yZ0V4KGxvbmcgbG9uZyBsb25nIHB0cikgT2Zmc2V0Vmlld3BvcnRPcmdFeDMyCiswMjU4IHN0ZGNhbGwgT2Zmc2V0V2luZG93T3JnRXgobG9uZyBsb25nIGxvbmcgcHRyKSBPZmZzZXRXaW5kb3dPcmdFeDMyCiAwMjU5IHN0dWIgUGFpbnRSZ24KIDAyNjAgc3RkY2FsbCBQYXRCbHQobG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcpIFBhdEJsdAogMDI2MSBzdHViIFBhdGhUb1JlZ2lvbgpAQCAtMjgwLDEyICsyODAsMTIgQEAKIDAyNzUgc3R1YiBQb2x5Z29uCiAwMjc2IHN0dWIgUG9seWxpbmUKIDAyNzcgc3R1YiBQb2x5bGluZVRvCi0wMjc4IHN0dWIgUHRJblJlZ2lvbgorMDI3OCBzdGRjYWxsIFB0SW5SZWdpb24obG9uZyBsb25nIGxvbmcpIFB0SW5SZWdpb24KIDAyNzkgc3R1YiBQdFZpc2libGUKIDAyODAgc3R1YiBSZWFsaXplUGFsZXR0ZQotMDI4MSBzdHViIFJlY3RJblJlZ2lvbgotMDI4MiBzdHViIFJlY3RWaXNpYmxlCi0wMjgzIHN0dWIgUmVjdGFuZ2xlCiswMjgxIHN0ZGNhbGwgUmVjdEluUmVnaW9uKGxvbmcgcHRyKSBSZWN0SW5SZWdpb24zMgorMDI4MiBzdGRjYWxsIFJlY3RWaXNpYmxlKGxvbmcgcHRyKSBSZWN0VmlzaWJsZTMyCiswMjgzIHN0ZGNhbGwgUmVjdGFuZ2xlKGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZykgUmVjdGFuZ2xlCiAwMjg0IHN0dWIgUmVtb3ZlRm9udFJlc291cmNlQQogMDI4NSBzdHViIFJlbW92ZUZvbnRSZXNvdXJjZVRyYWNraW5nCiAwMjg2IHN0dWIgUmVtb3ZlRm9udFJlc291cmNlVwpAQCAtMjk1LDggKzI5NSw4IEBACiAwMjkwIHN0dWIgUmVzdG9yZURDCiAwMjkxIHN0dWIgUm91bmRSZWN0CiAwMjkyIHN0dWIgU2F2ZURDCi0wMjkzIHN0dWIgU2NhbGVWaWV3cG9ydEV4dEV4Ci0wMjk0IHN0dWIgU2NhbGVXaW5kb3dFeHRFeAorMDI5MyBzdGRjYWxsIFNjYWxlVmlld3BvcnRFeHRFeChsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgcHRyKSBTY2FsZVZpZXdwb3J0RXh0RXgzMgorMDI5NCBzdGRjYWxsIFNjYWxlV2luZG93RXh0RXgobG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIHB0cikgU2NhbGVXaW5kb3dFeHRFeDMyCiAwMjk1IHN0dWIgU2VsZWN0QnJ1c2hMb2NhbAogMDI5NiBzdHViIFNlbGVjdENsaXBQYXRoCiAwMjk3IHN0dWIgU2VsZWN0Q2xpcFJnbgpAQCAtMzA2LDcgKzMwNiw3IEBACiAwMzAxIHN0dWIgU2V0QWJvcnRQcm9jCiAwMzAyIHN0dWIgU2V0QXJjRGlyZWN0aW9uCiAwMzAzIHN0dWIgU2V0Qml0bWFwQml0cwotMDMwNCBzdHViIFNldEJpdG1hcERpbWVuc2lvbkV4CiswMzA0IHN0ZGNhbGwgU2V0Qml0bWFwRGltZW5zaW9uRXgobG9uZyBsb25nIGxvbmcgcHRyKSBTZXRCaXRtYXBEaW1lbnNpb25FeDMyCiAwMzA1IHN0ZGNhbGwgU2V0QmtDb2xvcihsb25nIGxvbmcpIFNldEJrQ29sb3IKIDAzMDYgc3R1YiBTZXRCa01vZGUKIDAzMDcgc3R1YiBTZXRCb3VuZHNSZWN0CkBAIC0zNDIsMTIgKzM0MiwxMiBAQAogMDMzNyBzdHViIFNldFRleHRDaGFyYWN0ZXJFeHRyYQogMDMzOCBzdGRjYWxsIFNldFRleHRDb2xvcihsb25nIGxvbmcpIFNldFRleHRDb2xvcgogMDMzOSBzdHViIFNldFRleHRKdXN0aWZpY2F0aW9uCi0wMzQwIHN0dWIgU2V0Vmlld3BvcnRFeHRFeAotMDM0MSBzdHViIFNldFZpZXdwb3J0T3JnRXgKKzAzNDAgc3RkY2FsbCBTZXRWaWV3cG9ydEV4dEV4KGxvbmcgbG9uZyBsb25nIHB0cikgU2V0Vmlld3BvcnRFeHRFeDMyCiswMzQxIHN0ZGNhbGwgU2V0Vmlld3BvcnRPcmdFeChsb25nIGxvbmcgbG9uZyBwdHIpIFNldFZpZXdwb3J0T3JnRXgzMgogMDM0MiBzdHViIFNldFZpcnR1YWxSZXNvbHV0aW9uCiAwMzQzIHN0dWIgU2V0V2luTWV0YUZpbGVCaXRzCi0wMzQ0IHN0dWIgU2V0V2luZG93RXh0RXgKLTAzNDUgc3R1YiBTZXRXaW5kb3dPcmdFeAorMDM0NCBzdGRjYWxsIFNldFdpbmRvd0V4dEV4KGxvbmcgbG9uZyBsb25nIHB0cikgU2V0V2luZG93RXh0RXgzMgorMDM0NSBzdGRjYWxsIFNldFdpbmRvd09yZ0V4KGxvbmcgbG9uZyBsb25nIHB0cikgU2V0V2luZG93T3JnRXgzMgogMDM0NiBzdHViIFNldFdvcmxkVHJhbnNmb3JtCiAwMzQ3IHN0dWIgU3RhcnREb2NBCiAwMzQ4IHN0dWIgU3RhcnREb2NXCkBAIC0zNTcsOCArMzU3LDggQEAKIDAzNTIgc3R1YiBTdHJva2VBbmRGaWxsUGF0aAogMDM1MyBzdHViIFN0cm9rZVBhdGgKIDAzNTQgc3R1YiBTd2FwQnVmZmVycwotMDM1NSBzdGRjYWxsIFRleHRPdXRBKGxvbmcgbG9uZyBsb25nIHB0ciBsb25nKSBUZXh0T3V0Ci0wMzU2IHN0dWIgVGV4dE91dFcKKzAzNTUgc3RkY2FsbCBUZXh0T3V0QShsb25nIGxvbmcgbG9uZyBwdHIgbG9uZykgVGV4dE91dDMyQQorMDM1NiBzdGRjYWxsIFRleHRPdXRXKGxvbmcgbG9uZyBsb25nIHB0ciBsb25nKSBUZXh0T3V0MzJXCiAwMzU3IHN0dWIgVW5sb2FkTmV0d29ya0ZvbnRzCiAwMzU4IHN0dWIgVW5yZWFsaXplT2JqZWN0CiAwMzU5IHN0dWIgVXBkYXRlQ29sb3JzCmRpZmYgLS1naXQgYS9pZjE2MzIva2VybmVsLnNwZWMgYi9pZjE2MzIva2VybmVsLnNwZWMKaW5kZXggZDhiNGYzMS4uYWMxZTk4MiAxMDA2NDQKLS0tIGEvaWYxNjMyL2tlcm5lbC5zcGVjCisrKyBiL2lmMTYzMi9rZXJuZWwuc3BlYwpAQCAtMjA1LDE3ICsyMDUsMTcgQEAKIDIwNSBzdHViIENWV0JyZWFrCiAyMDYgcGFzY2FsMTYgQWxsb2NTZWxlY3RvckFycmF5KHdvcmQpIEFsbG9jU2VsZWN0b3JBcnJheQogMjA3IHJldHVybiBJc0RCQ1NMZWFkQnl0ZSAyIDAKLTIxNiBwYXNjYWwgICBSZWdFbnVtS2V5KGxvbmcgbG9uZyBwdHIgbG9uZykgUmVnRW51bUtleQotMjE3IHBhc2NhbCAgIFJlZ09wZW5LZXkobG9uZyBwdHIgcHRyKSBSZWdPcGVuS2V5Ci0yMTggcGFzY2FsICAgUmVnQ3JlYXRlS2V5KGxvbmcgcHRyIHB0cikgUmVnQ3JlYXRlS2V5Ci0yMTkgcGFzY2FsICAgUmVnRGVsZXRlS2V5KGxvbmcgcHRyKSBSZWdEZWxldGVLZXkKKzIxNiBwYXNjYWwgICBSZWdFbnVtS2V5KGxvbmcgbG9uZyBwdHIgbG9uZykgUmVnRW51bUtleTE2CisyMTcgcGFzY2FsICAgUmVnT3BlbktleShsb25nIHB0ciBwdHIpIFJlZ09wZW5LZXkxNgorMjE4IHBhc2NhbCAgIFJlZ0NyZWF0ZUtleShsb25nIHB0ciBwdHIpIFJlZ0NyZWF0ZUtleTE2CisyMTkgcGFzY2FsICAgUmVnRGVsZXRlS2V5KGxvbmcgcHRyKSBSZWdEZWxldGVLZXkxNgogMjIwIHBhc2NhbCAgIFJlZ0Nsb3NlS2V5KGxvbmcpIFJlZ0Nsb3NlS2V5Ci0yMjEgcGFzY2FsICAgUmVnU2V0VmFsdWUobG9uZyBwdHIgbG9uZyBwdHIgbG9uZykgUmVnU2V0VmFsdWUKLTIyMiBwYXNjYWwgICBSZWdEZWxldGVWYWx1ZShsb25nIHB0cikgUmVnRGVsZXRlVmFsdWUKLTIyMyBwYXNjYWwgICBSZWdFbnVtVmFsdWUobG9uZyBsb25nIHB0ciBwdHIgcHRyIHB0ciBwdHIgcHRyKSBSZWdFbnVtVmFsdWUKLTIyNCBwYXNjYWwgICBSZWdRdWVyeVZhbHVlKGxvbmcgcHRyIHB0ciBwdHIpIFJlZ1F1ZXJ5VmFsdWUKLTIyNSBwYXNjYWwgICBSZWdRdWVyeVZhbHVlRXgobG9uZyBwdHIgcHRyIHB0ciBwdHIgcHRyKSBSZWdRdWVyeVZhbHVlRXgKLTIyNiBwYXNjYWwgICBSZWdTZXRWYWx1ZUV4KGxvbmcgcHRyIGxvbmcgbG9uZyBwdHIgbG9uZykgUmVnU2V0VmFsdWVFeAorMjIxIHBhc2NhbCAgIFJlZ1NldFZhbHVlKGxvbmcgcHRyIGxvbmcgcHRyIGxvbmcpIFJlZ1NldFZhbHVlMTYKKzIyMiBwYXNjYWwgICBSZWdEZWxldGVWYWx1ZShsb25nIHB0cikgUmVnRGVsZXRlVmFsdWUxNgorMjIzIHBhc2NhbCAgIFJlZ0VudW1WYWx1ZShsb25nIGxvbmcgcHRyIHB0ciBwdHIgcHRyIHB0ciBwdHIpIFJlZ0VudW1WYWx1ZTE2CisyMjQgcGFzY2FsICAgUmVnUXVlcnlWYWx1ZShsb25nIHB0ciBwdHIgcHRyKSBSZWdRdWVyeVZhbHVlMTYKKzIyNSBwYXNjYWwgICBSZWdRdWVyeVZhbHVlRXgobG9uZyBwdHIgcHRyIHB0ciBwdHIgcHRyKSBSZWdRdWVyeVZhbHVlRXgxNgorMjI2IHBhc2NhbCAgIFJlZ1NldFZhbHVlRXgobG9uZyBwdHIgbG9uZyBsb25nIHB0ciBsb25nKSBSZWdTZXRWYWx1ZUV4MTYKIDIyNyBwYXNjYWwgICBSZWdGbHVzaEtleShsb25nKSBSZWdGbHVzaEtleQogIzIyOCBLMjI4CiAjMjI5IEsyMjkKQEAgLTI3MCw4ICsyNzAsOCBAQAogNDA0IHBhc2NhbDE2IEZhckdldE93bmVyKHdvcmQpIEZhckdldE93bmVyCiA0MDYgc3R1YiBXcml0ZVByaXZhdGVQcm9maWxlU3RydWN0CiA0MDcgc3R1YiBHZXRQcml2YXRlUHJvZmlsZVN0cnVjdAotNDExIHN0dWIgR2V0Q3VycmVudERpcmVjdG9yeQotNDEyIHN0dWIgU2V0Q3VycmVudERpcmVjdG9yeQorNDExIHBhc2NhbCAgIEdldEN1cnJlbnREaXJlY3RvcnkobG9uZyBwdHIpIEdldEN1cnJlbnREaXJlY3RvcnkKKzQxMiBwYXNjYWwxNiBTZXRDdXJyZW50RGlyZWN0b3J5KHB0cikgU2V0Q3VycmVudERpcmVjdG9yeQogNDEzIHN0dWIgRmluZEZpcnN0RmlsZQogNDE0IHN0dWIgRmluZE5leHRGaWxlCiA0MTUgc3R1YiBGaW5kQ2xvc2UKZGlmZiAtLWdpdCBhL2lmMTYzMi9rZXJuZWwzMi5zcGVjIGIvaWYxNjMyL2tlcm5lbDMyLnNwZWMKaW5kZXggZmU5OTE3MC4uMjU4MmZhYyAxMDA2NDQKLS0tIGEvaWYxNjMyL2tlcm5lbDMyLnNwZWMKKysrIGIvaWYxNjMyL2tlcm5lbDMyLnNwZWMKQEAgLTMxNCwyMCArMzE0LDIwIEBACiAwMzA4IHN0dWIgR2V0VmVyc2lvbkV4VwogMDMwOSBzdHViIEdldFZvbHVtZUluZm9ybWF0aW9uQQogMDMxMCBzdHViIEdldFZvbHVtZUluZm9ybWF0aW9uVwotMDMxMSBzdHViIEdldFdpbmRvd3NEaXJlY3RvcnlBCiswMzExIHN0ZGNhbGwgR2V0V2luZG93c0RpcmVjdG9yeUEocHRyIGxvbmcpIEdldFdpbmRvd3NEaXJlY3RvcnkKIDAzMTIgc3R1YiBHZXRXaW5kb3dzRGlyZWN0b3J5VwotMDMxMyBzdGRjYWxsIEdsb2JhbEFkZEF0b21BKGxvbmcpIFdJTjMyX0dsb2JhbEFkZEF0b21BCi0wMzE0IHN0dWIgR2xvYmFsQWRkQXRvbVcKKzAzMTMgc3RkY2FsbCBHbG9iYWxBZGRBdG9tQShwdHIpIEdsb2JhbEFkZEF0b20zMkEKKzAzMTQgc3RkY2FsbCBHbG9iYWxBZGRBdG9tVyhwdHIpIEdsb2JhbEFkZEF0b20zMlcKIDAzMTUgc3RkY2FsbCBHbG9iYWxBbGxvYyhsb25nIGxvbmcpIEdsb2JhbEFsbG9jMzIKIDAzMTYgc3RkY2FsbCBHbG9iYWxDb21wYWN0KGxvbmcpIEdsb2JhbENvbXBhY3QzMgotMDMxNyBzdHViIEdsb2JhbERlbGV0ZUF0b20KLTAzMTggc3R1YiBHbG9iYWxGaW5kQXRvbUEKLTAzMTkgc3R1YiBHbG9iYWxGaW5kQXRvbVcKKzAzMTcgc3RkY2FsbCBHbG9iYWxEZWxldGVBdG9tKGxvbmcpIEdsb2JhbERlbGV0ZUF0b20KKzAzMTggc3RkY2FsbCBHbG9iYWxGaW5kQXRvbUEocHRyKSBHbG9iYWxGaW5kQXRvbTMyQQorMDMxOSBzdGRjYWxsIEdsb2JhbEZpbmRBdG9tVyhwdHIpIEdsb2JhbEZpbmRBdG9tMzJXCiAwMzIwIHN0dWIgR2xvYmFsRml4CiAwMzIxIHN0ZGNhbGwgR2xvYmFsRmxhZ3MobG9uZykgR2xvYmFsRmxhZ3MzMgogMDMyMiBzdGRjYWxsIEdsb2JhbEZyZWUobG9uZykgR2xvYmFsRnJlZTMyCi0wMzIzIHN0dWIgR2xvYmFsR2V0QXRvbU5hbWVBCi0wMzI0IHN0dWIgR2xvYmFsR2V0QXRvbU5hbWVXCiswMzIzIHN0ZGNhbGwgR2xvYmFsR2V0QXRvbU5hbWVBKGxvbmcgcHRyIGxvbmcpIEdsb2JhbEdldEF0b21OYW1lMzJBCiswMzI0IHN0ZGNhbGwgR2xvYmFsR2V0QXRvbU5hbWVXKGxvbmcgcHRyIGxvbmcpIEdsb2JhbEdldEF0b21OYW1lMzJXCiAwMzI1IHN0ZGNhbGwgR2xvYmFsSGFuZGxlKHB0cikgR2xvYmFsSGFuZGxlMzIKIDAzMjYgc3RkY2FsbCBHbG9iYWxMb2NrKGxvbmcpIEdsb2JhbExvY2szMgogMDMyNyBzdHViIEdsb2JhbE1lbW9yeVN0YXR1cwpkaWZmIC0tZ2l0IGEvaWYxNjMyL21tc3lzdGVtLnNwZWMgYi9pZjE2MzIvbW1zeXN0ZW0uc3BlYwppbmRleCBkMmViZDAwLi42ZWM3NTJjIDEwMDY0NAotLS0gYS9pZjE2MzIvbW1zeXN0ZW0uc3BlYworKysgYi9pZjE2MzIvbW1zeXN0ZW0uc3BlYwpAQCAtNSw3ICs1LDcgQEAKIDIgICAgICBwYXNjYWwgIFNORFBMQVlTT1VORChwdHIgd29yZCkgc25kUGxheVNvdW5kCiA1ICAgICAgcGFzY2FsICBNTVNZU1RFTUdFVFZFUlNJT04oKSBtbXN5c3RlbUdldFZlcnNpb24KIDYgICAgICBwYXNjYWwgIERyaXZlclByb2MobG9uZyB3b3JkIHdvcmQgbG9uZyBsb25nKSBEcml2ZXJQcm9jCi0zMCAgICAgcGFzY2FsICBPVVRQVVRERUJVR1NUUihwdHIpIE91dHB1dERlYnVnU3RyCiszMCAgICAgcGFzY2FsMTYgT3V0cHV0RGVidWdTdHIocHRyKSBPdXRwdXREZWJ1Z1N0cmluZwogMzEgICAgIHBhc2NhbCAgRHJpdmVyQ2FsbGJhY2sobG9uZyB3b3JkIHdvcmQgd29yZCBsb25nIGxvbmcgbG9uZykKICAgICAgICAgICAgICAgIERyaXZlckNhbGxiYWNrCiAjMzIgICAgcGFzY2FsICBTVEFDS0VOVEVSCmRpZmYgLS1naXQgYS9pZjE2MzIvcmVsYXkzMi5jIGIvaWYxNjMyL3JlbGF5MzIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YwYTI0ZTQuLjAwMDAwMDAKLS0tIGEvaWYxNjMyL3JlbGF5MzIuYworKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMTk5NSBNYXJ0aW4gdm9uIExvZXdpcwotICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgIndpbmRvd3MuaCIKLSNpbmNsdWRlICJjYWxsYmFjay5oIgotI2luY2x1ZGUgIm1vZHVsZS5oIgotI2luY2x1ZGUgIm5lZXhlLmgiCi0jaW5jbHVkZSAicGVleGUuaCIKLSNpbmNsdWRlICJyZWxheTMyLmgiCi0jaW5jbHVkZSAic3RydWN0MzIuaCIKLSNpbmNsdWRlICJzdGFja2ZyYW1lLmgiCi0jaW5jbHVkZSAibGR0LmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKLSNpbmNsdWRlICJkZWJ1Zy5oIgotCi0KLUxPTkcgUkVMQVkzMl9DYWxsV2luZG93UHJvY0NvbnZTdHJ1Y3QoIFdORFBST0MgZnVuYywgaW50IGh3bmQsIGludCBtZXNzYWdlLAotCWludCB3UGFyYW0sIExQQVJBTSBsUGFyYW0xNikKLXsKLQlXSU5ET1dQT1MzMiB3cDsKLQl1bmlvbiB7Ci0JCU1JTk1BWElORk8zMiBtbWk7Ci0JCU5DQ0FMQ1NJWkVfUEFSQU1TMzIgbmNjczsKLQkJQ1JFQVRFU1RSVUNUMzIgY3M7Ci0JfSBzdDsKLQlDUkVBVEVTVFJVQ1QgKmxwY3M7Ci0JTE9ORyByZXN1bHQ7Ci0Jdm9pZCAqbFBhcmFtOwotCWlmKCFsUGFyYW0xNikKLQkJcmV0dXJuIENhbGxXbmRQcm9jMzIoZnVuYyxod25kLG1lc3NhZ2Usd1BhcmFtLChpbnQpbFBhcmFtMTYpOwotCWxQYXJhbSA9IFBUUl9TRUdfVE9fTElOKGxQYXJhbTE2KTsKLQlzd2l0Y2gobWVzc2FnZSkgewotCQljYXNlIFdNX0dFVE1JTk1BWElORk86Ci0JCQlTVFJVQ1QzMl9NSU5NQVhJTkZPMTZ0bzMyKGxQYXJhbSwmc3QubW1pKTsKLQkJCXJlc3VsdD1DYWxsV25kUHJvYzMyKGZ1bmMsaHduZCxtZXNzYWdlLHdQYXJhbSwoaW50KSZzdC5tbWkpOwotCQkJU1RSVUNUMzJfTUlOTUFYSU5GTzMydG8xNigmc3QubW1pLGxQYXJhbSk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQljYXNlIFdNX1dJTkRPV1BPU0NIQU5HSU5HOgotCQljYXNlIFdNX1dJTkRPV1BPU0NIQU5HRUQ6Ci0JCQlTVFJVQ1QzMl9XSU5ET1dQT1MxNnRvMzIobFBhcmFtLCZ3cCk7Ci0JCQlyZXN1bHQ9Q2FsbFduZFByb2MzMihmdW5jLGh3bmQsbWVzc2FnZSx3UGFyYW0sKGludCkmd3ApOwotCQkJU1RSVUNUMzJfV0lORE9XUE9TMzJ0bzE2KCZ3cCxsUGFyYW0pOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJY2FzZSBXTV9OQ0NBTENTSVpFOgotCQkJU1RSVUNUMzJfTkNDQUxDU0laRTE2dG8zMkZsYXQobFBhcmFtLCZzdC5uY2NzKTsKLQkJCWlmKHdQYXJhbSAmJiAoKE5DQ0FMQ1NJWkVfUEFSQU1TKilsUGFyYW0pLT5scHBvcykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVFJVQ1QzMl9XSU5ET1dQT1MxNnRvMzIoUFRSX1NFR19UT19MSU4oKChOQ0NBTENTSVpFX1BBUkFNUyopbFBhcmFtKS0+bHBwb3MpLCZ3cCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QubmNjcy5scHBvcz0md3A7Ci0JCQl9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHN0Lm5jY3MubHBwb3M9IDA7Ci0JCQlyZXN1bHQ9Q2FsbFduZFByb2MzMihmdW5jLGh3bmQsbWVzc2FnZSx3UGFyYW0sKGludCkmc3QubmNjcyk7Ci0JCQlTVFJVQ1QzMl9OQ0NBTENTSVpFMzJ0bzE2RmxhdCgmc3QubmNjcyxsUGFyYW0pOwotCQkJaWYod1BhcmFtICYmICgoTkNDQUxDU0laRV9QQVJBTVMqKWxQYXJhbSktPmxwcG9zKQotCQkJCVNUUlVDVDMyX1dJTkRPV1BPUzMydG8xNigmd3AsUFRSX1NFR19UT19MSU4oKChOQ0NBTENTSVpFX1BBUkFNUyopbFBhcmFtKS0+bHBwb3MpKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCWNhc2UgV01fTkNDUkVBVEU6Ci0JCQlscGNzID0gKENSRUFURVNUUlVDVCopbFBhcmFtOwotCQkJU1RSVUNUMzJfQ1JFQVRFU1RSVUNUMTZ0bzMyKGxQYXJhbSwmc3QuY3MpOwotCQkJc3QuY3MubHBzek5hbWUgPSBISVdPUkQobHBjcy0+bHBzek5hbWUpID8gCi0JCQkJUFRSX1NFR19UT19MSU4obHBjcy0+bHBzek5hbWUpIDogKGNoYXIqKWxwY3MtPmxwc3pOYW1lOwotCQkJc3QuY3MubHBzekNsYXNzID0gSElXT1JEKGxwY3MtPmxwc3pDbGFzcykgPyAKLQkJCQlQVFJfU0VHX1RPX0xJTihscGNzLT5scHN6Q2xhc3MpIDogKGNoYXIqKWxwY3MtPmxwc3pDbGFzczsKLQkJCXJlc3VsdD1DYWxsV25kUHJvYzMyKGZ1bmMsaHduZCxtZXNzYWdlLHdQYXJhbSwoaW50KSZzdC5jcyk7Ci0JCQlTVFJVQ1QzMl9DUkVBVEVTVFJVQ1QzMnRvMTYoJnN0LmNzLGxQYXJhbSk7Ci0JCQlscGNzLT5scHN6TmFtZSA9IEhJV09SRChzdC5jcy5scHN6TmFtZSkgPyAKLQkJCQlNQUtFX1NFR1BUUihzdC5jcy5scHN6TmFtZSkgOiAoU0VHUFRSKXN0LmNzLmxwc3pOYW1lOwotCQkJbHBjcy0+bHBzekNsYXNzID0gSElXT1JEKHN0LmNzLmxwc3pDbGFzcykgPyAKLQkJCQlNQUtFX1NFR1BUUihzdC5jcy5scHN6Q2xhc3MpIDogKFNFR1BUUilzdC5jcy5scHN6Q2xhc3M7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQljYXNlIFdNX0dFVFRFWFQ6Ci0JCWNhc2UgV01fU0VUVEVYVDoKLQkJCXJldHVybiBDYWxsV25kUHJvYzMyKGZ1bmMsaHduZCxtZXNzYWdlLHdQYXJhbSwoaW50KWxQYXJhbSk7Ci0JCWRlZmF1bHQ6Ci0JCQlmcHJpbnRmKHN0ZGVyciwiTm8gY29udmVyc2lvbiBmdW5jdGlvbiBmb3IgbWVzc2FnZSAlZFxuIixtZXNzYWdlKTsKLQl9Ci0JcmV0dXJuIENhbGxXbmRQcm9jMzIoZnVuYyxod25kLG1lc3NhZ2Usd1BhcmFtLChpbnQpbFBhcmFtKTsKLX0KZGlmZiAtLWdpdCBhL2lmMTYzMi9zaGVsbC5zcGVjIGIvaWYxNjMyL3NoZWxsLnNwZWMKaW5kZXggNzYyM2ZhYy4uYTZkNzIyZCAxMDA2NDQKLS0tIGEvaWYxNjMyL3NoZWxsLnNwZWMKKysrIGIvaWYxNjMyL3NoZWxsLnNwZWMKQEAgLTEsMTMgKzEsMTMgQEAKIG5hbWUJc2hlbGwKIHR5cGUJd2luMTYKIAotICAxIHBhc2NhbCAgIFJlZ09wZW5LZXkobG9uZyBwdHIgcHRyKSBSZWdPcGVuS2V5Ci0gIDIgcGFzY2FsICAgUmVnQ3JlYXRlS2V5KGxvbmcgcHRyIHB0cikgUmVnQ3JlYXRlS2V5CisgIDEgcGFzY2FsICAgUmVnT3BlbktleShsb25nIHB0ciBwdHIpIFJlZ09wZW5LZXkxNgorICAyIHBhc2NhbCAgIFJlZ0NyZWF0ZUtleShsb25nIHB0ciBwdHIpIFJlZ0NyZWF0ZUtleTE2CiAgIDMgcGFzY2FsICAgUmVnQ2xvc2VLZXkobG9uZykgUmVnQ2xvc2VLZXkKLSAgNCBwYXNjYWwgICBSZWdEZWxldGVLZXkobG9uZyBwdHIpIFJlZ0RlbGV0ZUtleQotICA1IHBhc2NhbCAgIFJlZ1NldFZhbHVlKGxvbmcgcHRyIGxvbmcgcHRyIGxvbmcpIFJlZ1NldFZhbHVlCi0gIDYgcGFzY2FsICAgUmVnUXVlcnlWYWx1ZShsb25nIHB0ciBwdHIgcHRyKSBSZWdRdWVyeVZhbHVlCi0gIDcgcGFzY2FsICAgUmVnRW51bUtleShsb25nIGxvbmcgcHRyIGxvbmcpIFJlZ0VudW1LZXkKKyAgNCBwYXNjYWwgICBSZWdEZWxldGVLZXkobG9uZyBwdHIpIFJlZ0RlbGV0ZUtleTE2CisgIDUgcGFzY2FsICAgUmVnU2V0VmFsdWUobG9uZyBwdHIgbG9uZyBwdHIgbG9uZykgUmVnU2V0VmFsdWUxNgorICA2IHBhc2NhbCAgIFJlZ1F1ZXJ5VmFsdWUobG9uZyBwdHIgcHRyIHB0cikgUmVnUXVlcnlWYWx1ZTE2CisgIDcgcGFzY2FsICAgUmVnRW51bUtleShsb25nIGxvbmcgcHRyIGxvbmcpIFJlZ0VudW1LZXkxNgogICA5IHBhc2NhbDE2IERyYWdBY2NlcHRGaWxlcyh3b3JkIHdvcmQpIERyYWdBY2NlcHRGaWxlcwogIDExIHBhc2NhbDE2IERyYWdRdWVyeUZpbGUod29yZCBzX3dvcmQgcHRyIHNfd29yZCkgRHJhZ1F1ZXJ5RmlsZQogIDEyIHBhc2NhbDE2IERyYWdGaW5pc2god29yZCkgRHJhZ0ZpbmlzaApkaWZmIC0tZ2l0IGEvaWYxNjMyL3VzZXIuc3BlYyBiL2lmMTYzMi91c2VyLnNwZWMKaW5kZXggNzMxYzBjMC4uOTYxMGJiZSAxMDA2NDQKLS0tIGEvaWYxNjMyL3VzZXIuc3BlYworKysgYi9pZjE2MzIvdXNlci5zcGVjCkBAIC0xNSw4ICsxNSw4IEBACiAxMyAgcGFzY2FsICAgR2V0VGlja0NvdW50KCkgR2V0VGlja0NvdW50CiAxNCAgcGFzY2FsICAgR2V0VGltZXJSZXNvbHV0aW9uKCkgR2V0VGltZXJSZXNvbHV0aW9uCiAxNSAgcGFzY2FsICAgR2V0Q3VycmVudFRpbWUoKSBHZXRDdXJyZW50VGltZQotMTYgIHBhc2NhbDE2IENsaXBDdXJzb3IocHRyKSBDbGlwQ3Vyc29yCi0xNyAgcGFzY2FsMTYgR2V0Q3Vyc29yUG9zKHB0cikgR2V0Q3Vyc29yUG9zCisxNiAgcGFzY2FsMTYgQ2xpcEN1cnNvcihwdHIpIENsaXBDdXJzb3IxNgorMTcgIHBhc2NhbDE2IEdldEN1cnNvclBvcyhwdHIpIEdldEN1cnNvclBvczE2CiAxOCAgcGFzY2FsMTYgU2V0Q2FwdHVyZSh3b3JkKSBTZXRDYXB0dXJlCiAxOSAgcGFzY2FsMTYgUmVsZWFzZUNhcHR1cmUoKSBSZWxlYXNlQ2FwdHVyZQogMjAgIHBhc2NhbDE2IFNldERvdWJsZUNsaWNrVGltZSh3b3JkKSBTZXREb3VibGVDbGlja1RpbWUKQEAgLTI3LDE5ICsyNywxOSBAQAogMjUgIHBhc2NhbDE2IEdldFByb3Aod29yZCBzZWdwdHIpIEdldFByb3AKIDI2ICBwYXNjYWwxNiBTZXRQcm9wKHdvcmQgc2VncHRyIHdvcmQpIFNldFByb3AKIDI3ICBwYXNjYWwxNiBFbnVtUHJvcHMod29yZCBzZWdwdHIpIEVudW1Qcm9wcwotMjggIHBhc2NhbDE2IENsaWVudFRvU2NyZWVuKHdvcmQgcHRyKSBDbGllbnRUb1NjcmVlbgotMjkgIHBhc2NhbDE2IFNjcmVlblRvQ2xpZW50KHdvcmQgcHRyKSBTY3JlZW5Ub0NsaWVudAotMzAgIHBhc2NhbDE2IFdpbmRvd0Zyb21Qb2ludChsb25nKSBXaW5kb3dGcm9tUG9pbnQKKzI4ICBwYXNjYWwxNiBDbGllbnRUb1NjcmVlbih3b3JkIHB0cikgQ2xpZW50VG9TY3JlZW4xNgorMjkgIHBhc2NhbDE2IFNjcmVlblRvQ2xpZW50KHdvcmQgcHRyKSBTY3JlZW5Ub0NsaWVudDE2CiszMCAgcGFzY2FsMTYgV2luZG93RnJvbVBvaW50KGxvbmcpIFdpbmRvd0Zyb21Qb2ludDE2CiAzMSAgcGFzY2FsMTYgSXNJY29uaWMod29yZCkgSXNJY29uaWMKLTMyICBwYXNjYWwxNiBHZXRXaW5kb3dSZWN0KHdvcmQgcHRyKSBHZXRXaW5kb3dSZWN0Ci0zMyAgcGFzY2FsMTYgR2V0Q2xpZW50UmVjdCh3b3JkIHB0cikgR2V0Q2xpZW50UmVjdAorMzIgIHBhc2NhbDE2IEdldFdpbmRvd1JlY3Qod29yZCBwdHIpIEdldFdpbmRvd1JlY3QxNgorMzMgIHBhc2NhbDE2IEdldENsaWVudFJlY3Qod29yZCBwdHIpIEdldENsaWVudFJlY3QxNgogMzQgIHBhc2NhbDE2IEVuYWJsZVdpbmRvdyh3b3JkIHdvcmQpIEVuYWJsZVdpbmRvdwogMzUgIHBhc2NhbDE2IElzV2luZG93RW5hYmxlZCh3b3JkKSBJc1dpbmRvd0VuYWJsZWQKIDM2ICBwYXNjYWwxNiBHZXRXaW5kb3dUZXh0KHdvcmQgc2VncHRyIHdvcmQpIFdJTjE2X0dldFdpbmRvd1RleHQKIDM3ICBwYXNjYWwxNiBTZXRXaW5kb3dUZXh0KHdvcmQgc2VncHRyKSBXSU4xNl9TZXRXaW5kb3dUZXh0CiAzOCAgcGFzY2FsMTYgR2V0V2luZG93VGV4dExlbmd0aCh3b3JkKSBHZXRXaW5kb3dUZXh0TGVuZ3RoCi0zOSAgcGFzY2FsMTYgQmVnaW5QYWludCh3b3JkIHB0cikgQmVnaW5QYWludAotNDAgIHBhc2NhbDE2IEVuZFBhaW50KHdvcmQgcHRyKSBFbmRQYWludAorMzkgIHBhc2NhbDE2IEJlZ2luUGFpbnQod29yZCBwdHIpIEJlZ2luUGFpbnQxNgorNDAgIHBhc2NhbDE2IEVuZFBhaW50KHdvcmQgcHRyKSBFbmRQYWludDE2CiA0MSAgcGFzY2FsMTYgQ3JlYXRlV2luZG93KHNlZ3B0ciBzZWdwdHIgbG9uZyBzX3dvcmQgc193b3JkIHNfd29yZCBzX3dvcmQKIAkgICAgICAgICAgICAgICAgICB3b3JkIHdvcmQgd29yZCBzZWdwdHIpIENyZWF0ZVdpbmRvdzE2CiA0MiAgcGFzY2FsMTYgU2hvd1dpbmRvdyh3b3JkIHdvcmQpIFNob3dXaW5kb3cKQEAgLTUwLDcgKzUwLDcgQEAKIDQ3ICBwYXNjYWwxNiBJc1dpbmRvdyh3b3JkKSBJc1dpbmRvdwogNDggIHBhc2NhbDE2IElzQ2hpbGQod29yZCB3b3JkKSBJc0NoaWxkCiA0OSAgcGFzY2FsMTYgSXNXaW5kb3dWaXNpYmxlKHdvcmQpIElzV2luZG93VmlzaWJsZQotNTAgIHBhc2NhbDE2IEZpbmRXaW5kb3coc2VncHRyIHB0cikgRmluZFdpbmRvdworNTAgIHBhc2NhbDE2IEZpbmRXaW5kb3coc2VncHRyIHB0cikgRmluZFdpbmRvdzE2CiAjNTEgQkVBUjUxCiA1MiAgcGFzY2FsMTYgQW55UG9wdXAoKSBBbnlQb3B1cAogNTMgIHBhc2NhbDE2IERlc3Ryb3lXaW5kb3cod29yZCkgRGVzdHJveVdpbmRvdwpAQCAtNTgsNyArNTgsNyBAQAogNTUgIHBhc2NhbDE2IEVudW1DaGlsZFdpbmRvd3Mod29yZCBzZWdwdHIgbG9uZykgRW51bUNoaWxkV2luZG93cwogNTYgIHBhc2NhbDE2IE1vdmVXaW5kb3cod29yZCB3b3JkIHdvcmQgd29yZCB3b3JkIHdvcmQpIE1vdmVXaW5kb3cKIDU3ICBwYXNjYWwxNiBSZWdpc3RlckNsYXNzKHB0cikgUmVnaXN0ZXJDbGFzczE2Ci01OCAgcGFzY2FsMTYgR2V0Q2xhc3NOYW1lKHdvcmQgcHRyIHdvcmQpIEdldENsYXNzTmFtZQorNTggIHBhc2NhbDE2IEdldENsYXNzTmFtZSh3b3JkIHB0ciB3b3JkKSBHZXRDbGFzc05hbWUxNgogNTkgIHBhc2NhbDE2IFNldEFjdGl2ZVdpbmRvdyh3b3JkKSBTZXRBY3RpdmVXaW5kb3cKIDYwICBwYXNjYWwxNiBHZXRBY3RpdmVXaW5kb3coKSBHZXRBY3RpdmVXaW5kb3cKIDYxICBwYXNjYWwxNiBTY3JvbGxXaW5kb3cod29yZCBzX3dvcmQgc193b3JkIHB0ciBwdHIpIFNjcm9sbFdpbmRvdwpAQCAtNzIsMjAgKzcyLDIwIEBACiA2OSAgcGFzY2FsMTYgU2V0Q3Vyc29yKHdvcmQpIFNldEN1cnNvcgogNzAgIHBhc2NhbDE2IFNldEN1cnNvclBvcyh3b3JkIHdvcmQpIFNldEN1cnNvclBvcwogNzEgIHBhc2NhbDE2IFNob3dDdXJzb3Iod29yZCkgU2hvd0N1cnNvcgotNzIgIHBhc2NhbDE2IFNldFJlY3QocHRyIHNfd29yZCBzX3dvcmQgc193b3JkIHNfd29yZCkgU2V0UmVjdAotNzMgIHBhc2NhbDE2IFNldFJlY3RFbXB0eShwdHIpIFNldFJlY3RFbXB0eQotNzQgIHBhc2NhbDE2IENvcHlSZWN0KHB0ciBwdHIpIENvcHlSZWN0Ci03NSAgcGFzY2FsMTYgSXNSZWN0RW1wdHkocHRyKSBJc1JlY3RFbXB0eQotNzYgIHBhc2NhbDE2IFB0SW5SZWN0KHB0ciBsb25nKSBQdEluUmVjdAotNzcgIHBhc2NhbDE2IE9mZnNldFJlY3QocHRyIHNfd29yZCBzX3dvcmQpIE9mZnNldFJlY3QKLTc4ICBwYXNjYWwxNiBJbmZsYXRlUmVjdChwdHIgc193b3JkIHNfd29yZCkgSW5mbGF0ZVJlY3QKLTc5ICBwYXNjYWwxNiBJbnRlcnNlY3RSZWN0KHB0ciBwdHIgcHRyKSBJbnRlcnNlY3RSZWN0Ci04MCAgcGFzY2FsMTYgVW5pb25SZWN0KHB0ciBwdHIgcHRyKSBVbmlvblJlY3QKLTgxICBwYXNjYWwxNiBGaWxsUmVjdCh3b3JkIHB0ciB3b3JkKSBGaWxsUmVjdAotODIgIHBhc2NhbDE2IEludmVydFJlY3Qod29yZCBwdHIpIEludmVydFJlY3QKLTgzICBwYXNjYWwxNiBGcmFtZVJlY3Qod29yZCBwdHIgd29yZCkgRnJhbWVSZWN0Cis3MiAgcGFzY2FsMTYgU2V0UmVjdChwdHIgc193b3JkIHNfd29yZCBzX3dvcmQgc193b3JkKSBTZXRSZWN0MTYKKzczICBwYXNjYWwxNiBTZXRSZWN0RW1wdHkocHRyKSBTZXRSZWN0RW1wdHkxNgorNzQgIHBhc2NhbDE2IENvcHlSZWN0KHB0ciBwdHIpIENvcHlSZWN0MTYKKzc1ICBwYXNjYWwxNiBJc1JlY3RFbXB0eShwdHIpIElzUmVjdEVtcHR5MTYKKzc2ICBwYXNjYWwxNiBQdEluUmVjdChwdHIgbG9uZykgUHRJblJlY3QxNgorNzcgIHBhc2NhbDE2IE9mZnNldFJlY3QocHRyIHNfd29yZCBzX3dvcmQpIE9mZnNldFJlY3QxNgorNzggIHBhc2NhbDE2IEluZmxhdGVSZWN0KHB0ciBzX3dvcmQgc193b3JkKSBJbmZsYXRlUmVjdDE2Cis3OSAgcGFzY2FsMTYgSW50ZXJzZWN0UmVjdChwdHIgcHRyIHB0cikgSW50ZXJzZWN0UmVjdDE2Cis4MCAgcGFzY2FsMTYgVW5pb25SZWN0KHB0ciBwdHIgcHRyKSBVbmlvblJlY3QxNgorODEgIHBhc2NhbDE2IEZpbGxSZWN0KHdvcmQgcHRyIHdvcmQpIEZpbGxSZWN0MTYKKzgyICBwYXNjYWwxNiBJbnZlcnRSZWN0KHdvcmQgcHRyKSBJbnZlcnRSZWN0MTYKKzgzICBwYXNjYWwxNiBGcmFtZVJlY3Qod29yZCBwdHIgd29yZCkgRnJhbWVSZWN0MTYKIDg0ICBwYXNjYWwxNiBEcmF3SWNvbih3b3JkIHNfd29yZCBzX3dvcmQgd29yZCkgRHJhd0ljb24KLTg1ICBwYXNjYWwxNiBEcmF3VGV4dCh3b3JkIHB0ciBzX3dvcmQgcHRyIHdvcmQpIERyYXdUZXh0Cis4NSAgcGFzY2FsMTYgRHJhd1RleHQod29yZCBwdHIgc193b3JkIHB0ciB3b3JkKSBEcmF3VGV4dDE2CiA4NyAgcGFzY2FsMTYgRGlhbG9nQm94KHdvcmQgc2VncHRyIHdvcmQgc2VncHRyKSBEaWFsb2dCb3gKIDg4ICBwYXNjYWwxNiBFbmREaWFsb2cod29yZCBzX3dvcmQpIEVuZERpYWxvZwogODkgIHBhc2NhbDE2IENyZWF0ZURpYWxvZyh3b3JkIHNlZ3B0ciB3b3JkIHNlZ3B0cikgQ3JlYXRlRGlhbG9nCkBAIC0xMDEsOCArMTAxLDggQEAKIDk5ICBwYXNjYWwxNiBEbGdEaXJTZWxlY3Qod29yZCBwdHIgd29yZCkgRGxnRGlyU2VsZWN0CiAxMDAgcGFzY2FsMTYgRGxnRGlyTGlzdCh3b3JkIHNlZ3B0ciB3b3JkIHdvcmQgd29yZCkgRGxnRGlyTGlzdAogMTAxIHBhc2NhbCAgIFNlbmREbGdJdGVtTWVzc2FnZSh3b3JkIHdvcmQgd29yZCB3b3JkIGxvbmcpIFNlbmREbGdJdGVtTWVzc2FnZQotMTAyIHBhc2NhbDE2IEFkanVzdFdpbmRvd1JlY3QocHRyIGxvbmcgd29yZCkgQWRqdXN0V2luZG93UmVjdAotMTAzIHBhc2NhbDE2IE1hcERpYWxvZ1JlY3Qod29yZCBwdHIpIE1hcERpYWxvZ1JlY3QKKzEwMiBwYXNjYWwxNiBBZGp1c3RXaW5kb3dSZWN0KHB0ciBsb25nIHdvcmQpIEFkanVzdFdpbmRvd1JlY3QxNgorMTAzIHBhc2NhbDE2IE1hcERpYWxvZ1JlY3Qod29yZCBwdHIpIE1hcERpYWxvZ1JlY3QxNgogMTA0IHBhc2NhbDE2IE1lc3NhZ2VCZWVwKHdvcmQpIE1lc3NhZ2VCZWVwCiAxMDUgcGFzY2FsMTYgRmxhc2hXaW5kb3cod29yZCB3b3JkKSBGbGFzaFdpbmRvdwogMTA2IHBhc2NhbDE2IEdldEtleVN0YXRlKHdvcmQpIEdldEtleVN0YXRlCkBAIC0xMTYsMjIgKzExNiwyMiBAQAogMTE0IHBhc2NhbCAgIERpc3BhdGNoTWVzc2FnZShwdHIpIERpc3BhdGNoTWVzc2FnZQogMTE1IHN0dWIgUmVwbHlNZXNzYWdlCiAxMTYgcGFzY2FsMTYgUG9zdEFwcE1lc3NhZ2Uod29yZCB3b3JkIHdvcmQgbG9uZykgUG9zdEFwcE1lc3NhZ2UKLTExOCBwYXNjYWwxNiBSZWdpc3RlcldpbmRvd01lc3NhZ2UobG9uZykgUmVnaXN0ZXJXaW5kb3dNZXNzYWdlCisxMTggcGFzY2FsMTYgUmVnaXN0ZXJXaW5kb3dNZXNzYWdlKHNlZ3B0cikgUmVnaXN0ZXJXaW5kb3dNZXNzYWdlMTYKIDExNyBzdHViIFdpbmRvd0Zyb21EQwogMTE5IHBhc2NhbCAgIEdldE1lc3NhZ2VQb3MoKSBHZXRNZXNzYWdlUG9zCiAxMjAgcGFzY2FsICAgR2V0TWVzc2FnZVRpbWUoKSBHZXRNZXNzYWdlVGltZQogMTIxIHBhc2NhbCAgIFNldFdpbmRvd3NIb29rKHNfd29yZCBzZWdwdHIpIFNldFdpbmRvd3NIb29rCi0xMjIgcGFzY2FsICAgQ2FsbFdpbmRvd1Byb2Moc2VncHRyIHdvcmQgd29yZCB3b3JkIGxvbmcpIENhbGxXaW5kb3dQcm9jCisxMjIgcGFzY2FsICAgQ2FsbFdpbmRvd1Byb2Moc2VncHRyIHdvcmQgd29yZCB3b3JkIGxvbmcpIENhbGxXaW5kb3dQcm9jMTYKIDEyMyBwYXNjYWwxNiBDYWxsTXNnRmlsdGVyKHNlZ3B0ciBzX3dvcmQpIENhbGxNc2dGaWx0ZXIKIDEyNCBwYXNjYWwxNiBVcGRhdGVXaW5kb3cod29yZCkgVXBkYXRlV2luZG93Ci0xMjUgcGFzY2FsMTYgSW52YWxpZGF0ZVJlY3Qod29yZCBwdHIgd29yZCkgSW52YWxpZGF0ZVJlY3QKKzEyNSBwYXNjYWwxNiBJbnZhbGlkYXRlUmVjdCh3b3JkIHB0ciB3b3JkKSBJbnZhbGlkYXRlUmVjdDE2CiAxMjYgcGFzY2FsMTYgSW52YWxpZGF0ZVJnbih3b3JkIHdvcmQgd29yZCkgSW52YWxpZGF0ZVJnbgotMTI3IHBhc2NhbDE2IFZhbGlkYXRlUmVjdCh3b3JkIHB0cikgVmFsaWRhdGVSZWN0CisxMjcgcGFzY2FsMTYgVmFsaWRhdGVSZWN0KHdvcmQgcHRyKSBWYWxpZGF0ZVJlY3QxNgogMTI4IHBhc2NhbDE2IFZhbGlkYXRlUmduKHdvcmQgd29yZCkgVmFsaWRhdGVSZ24KIDEyOSBwYXNjYWwxNiBHZXRDbGFzc1dvcmQod29yZCBzX3dvcmQpIEdldENsYXNzV29yZAogMTMwIHBhc2NhbDE2IFNldENsYXNzV29yZCh3b3JkIHNfd29yZCB3b3JkKSBTZXRDbGFzc1dvcmQKLTEzMSBwYXNjYWwgICBHZXRDbGFzc0xvbmcod29yZCBzX3dvcmQpIEdldENsYXNzTG9uZwotMTMyIHBhc2NhbCAgIFNldENsYXNzTG9uZyh3b3JkIHNfd29yZCBsb25nKSBTZXRDbGFzc0xvbmcKKzEzMSBwYXNjYWwgICBHZXRDbGFzc0xvbmcod29yZCBzX3dvcmQpIEdldENsYXNzTG9uZzE2CisxMzIgcGFzY2FsICAgU2V0Q2xhc3NMb25nKHdvcmQgc193b3JkIGxvbmcpIFNldENsYXNzTG9uZzE2CiAxMzMgcGFzY2FsMTYgR2V0V2luZG93V29yZCh3b3JkIHNfd29yZCkgR2V0V2luZG93V29yZAogMTM0IHBhc2NhbDE2IFNldFdpbmRvd1dvcmQod29yZCBzX3dvcmQgd29yZCkgU2V0V2luZG93V29yZAogMTM1IHBhc2NhbCAgIEdldFdpbmRvd0xvbmcod29yZCBzX3dvcmQpIEdldFdpbmRvd0xvbmcKQEAgLTE4MiwxNSArMTgyLDE1IEBACiAxODAgcGFzY2FsICAgR2V0U3lzQ29sb3Iod29yZCkgR2V0U3lzQ29sb3IKIDE4MSBwYXNjYWwxNiBTZXRTeXNDb2xvcnMod29yZCBwdHIgcHRyKSBTZXRTeXNDb2xvcnMKIDE4MiBwYXNjYWwxNiBLaWxsU3lzdGVtVGltZXIod29yZCB3b3JkKSBLaWxsU3lzdGVtVGltZXIKLTE4MyBwYXNjYWwxNiBHZXRDYXJldFBvcyhwdHIpIEdldENhcmV0UG9zCisxODMgcGFzY2FsMTYgR2V0Q2FyZXRQb3MocHRyKSBHZXRDYXJldFBvczE2CiAxODQgc3R1YiBRdWVyeVNlbmRNZXNzYWdlCiAxODUgcGFzY2FsMTYgR3JheVN0cmluZyh3b3JkIHdvcmQgcHRyIHB0ciB3b3JkIHdvcmQgd29yZCB3b3JkIHdvcmQpIEdyYXlTdHJpbmcKIDE4NiBwYXNjYWwxNiBTd2FwTW91c2VCdXR0b24od29yZCkgU3dhcE1vdXNlQnV0dG9uCiAxODcgcGFzY2FsMTYgRW5kTWVudSgpIEVuZE1lbnUKIDE4OCBwYXNjYWwxNiBTZXRTeXNNb2RhbFdpbmRvdyh3b3JkKSBTZXRTeXNNb2RhbFdpbmRvdwogMTg5IHBhc2NhbDE2IEdldFN5c01vZGFsV2luZG93KCkgR2V0U3lzTW9kYWxXaW5kb3cKLTE5MCBwYXNjYWwxNiBHZXRVcGRhdGVSZWN0KHdvcmQgcHRyIHdvcmQpIEdldFVwZGF0ZVJlY3QKLTE5MSBwYXNjYWwxNiBDaGlsZFdpbmRvd0Zyb21Qb2ludCh3b3JkIGxvbmcpIENoaWxkV2luZG93RnJvbVBvaW50CisxOTAgcGFzY2FsMTYgR2V0VXBkYXRlUmVjdCh3b3JkIHB0ciB3b3JkKSBHZXRVcGRhdGVSZWN0MTYKKzE5MSBwYXNjYWwxNiBDaGlsZFdpbmRvd0Zyb21Qb2ludCh3b3JkIGxvbmcpIENoaWxkV2luZG93RnJvbVBvaW50MTYKIDE5MiBwYXNjYWwxNiBJblNlbmRNZXNzYWdlKCkgSW5TZW5kTWVzc2FnZQogMTkzIHBhc2NhbDE2IElzQ2xpcGJvYXJkRm9ybWF0QXZhaWxhYmxlKHdvcmQpIElzQ2xpcGJvYXJkRm9ybWF0QXZhaWxhYmxlCiAxOTQgcGFzY2FsMTYgRGxnRGlyU2VsZWN0Q29tYm9Cb3god29yZCBwdHIgd29yZCkgRGxnRGlyU2VsZWN0Q29tYm9Cb3gKQEAgLTI0Niw3ICsyNDYsNyBAQAogMjQyIHBhc2NhbDE2IENyZWF0ZURpYWxvZ0luZGlyZWN0UGFyYW0od29yZCBzZWdwdHIgd29yZCBzZWdwdHIgbG9uZykKICAgICAgICAgICAgICBDcmVhdGVEaWFsb2dJbmRpcmVjdFBhcmFtCiAyNDMgcGFzY2FsICAgR2V0RGlhbG9nQmFzZVVuaXRzKCkgR2V0RGlhbG9nQmFzZVVuaXRzCi0yNDQgcGFzY2FsMTYgRXF1YWxSZWN0KHB0ciBwdHIpIEVxdWFsUmVjdAorMjQ0IHBhc2NhbDE2IEVxdWFsUmVjdChwdHIgcHRyKSBFcXVhbFJlY3QxNgogMjQ1IHN0dWIgRW5hYmxlQ29tbU5vdGlmaWNhdGlvbgogMjQ2IHN0dWIgRXhpdFdpbmRvd3NFeGVjCiAyNDcgcGFzY2FsMTYgR2V0Q3Vyc29yKCkgR2V0Q3Vyc29yCkBAIC0yNjAsNyArMjYwLDcgQEAKIDI1NSBwYXNjYWwgICBEZWZEcml2ZXJQcm9jKGxvbmcgd29yZCB3b3JkIGxvbmcgbG9uZykgRGVmRHJpdmVyUHJvYwogMjU2IHBhc2NhbDE2IEdldERyaXZlckluZm8od29yZCBwdHIpIEdldERyaXZlckluZm8KIDI1NyBwYXNjYWwxNiBHZXROZXh0RHJpdmVyKHdvcmQgbG9uZykgR2V0TmV4dERyaXZlcgotMjU4IHBhc2NhbDE2IE1hcFdpbmRvd1BvaW50cyh3b3JkIHdvcmQgcHRyIHdvcmQpIE1hcFdpbmRvd1BvaW50cworMjU4IHBhc2NhbDE2IE1hcFdpbmRvd1BvaW50cyh3b3JkIHdvcmQgcHRyIHdvcmQpIE1hcFdpbmRvd1BvaW50czE2CiAyNTkgcGFzY2FsMTYgQmVnaW5EZWZlcldpbmRvd1BvcyhzX3dvcmQpIEJlZ2luRGVmZXJXaW5kb3dQb3MKIDI2MCBwYXNjYWwxNiBEZWZlcldpbmRvd1Bvcyh3b3JkIHdvcmQgd29yZCBzX3dvcmQgc193b3JkIHNfd29yZCBzX3dvcmQgd29yZCkKICAgICAgICAgICAgICBEZWZlcldpbmRvd1BvcwpAQCAtMjcxLDEwICsyNzEsMTAgQEAKIDI2NSBwYXNjYWwxNiBTaG93T3duZWRQb3B1cHMod29yZCB3b3JkKSBTaG93T3duZWRQb3B1cHMKIDI2NiBwYXNjYWwxNiBTZXRNZXNzYWdlUXVldWUod29yZCkgU2V0TWVzc2FnZVF1ZXVlCiAyNjcgcGFzY2FsMTYgU2hvd1Njcm9sbEJhcih3b3JkIHdvcmQgd29yZCkgU2hvd1Njcm9sbEJhcgotMjY4IHBhc2NhbDE2IEdsb2JhbEFkZEF0b20oc2VncHRyKSBHbG9iYWxBZGRBdG9tCisyNjggcGFzY2FsMTYgR2xvYmFsQWRkQXRvbShzZWdwdHIpIEdsb2JhbEFkZEF0b20xNgogMjY5IHBhc2NhbDE2IEdsb2JhbERlbGV0ZUF0b20od29yZCkgR2xvYmFsRGVsZXRlQXRvbQotMjcwIHBhc2NhbDE2IEdsb2JhbEZpbmRBdG9tKHNlZ3B0cikgR2xvYmFsRmluZEF0b20KLTI3MSBwYXNjYWwxNiBHbG9iYWxHZXRBdG9tTmFtZSh3b3JkIHB0ciBzX3dvcmQpIEdsb2JhbEdldEF0b21OYW1lCisyNzAgcGFzY2FsMTYgR2xvYmFsRmluZEF0b20oc2VncHRyKSBHbG9iYWxGaW5kQXRvbTE2CisyNzEgcGFzY2FsMTYgR2xvYmFsR2V0QXRvbU5hbWUod29yZCBwdHIgc193b3JkKSBHbG9iYWxHZXRBdG9tTmFtZTE2CiAyNzIgcGFzY2FsMTYgSXNab29tZWQod29yZCkgSXNab29tZWQKIDI3MyBzdHViIENvbnRyb2xQYW5lbEluZm8KIDI3NCBzdHViIEdldE5leHRRdWV1ZVdpbmRvdwpAQCAtMjkzLDcgKzI5Myw3IEBACiAyODcgcGFzY2FsMTYgR2V0TGFzdEFjdGl2ZVBvcHVwKHdvcmQpIEdldExhc3RBY3RpdmVQb3B1cAogMjg4IHBhc2NhbCAgIEdldE1lc3NhZ2VFeHRyYUluZm8oKSBHZXRNZXNzYWdlRXh0cmFJbmZvCiAjMjg5IEtFWUJfRVZFTlQKLTI5MCBwYXNjYWwxNiBSZWRyYXdXaW5kb3cod29yZCBwdHIgd29yZCB3b3JkKSBSZWRyYXdXaW5kb3cKKzI5MCBwYXNjYWwxNiBSZWRyYXdXaW5kb3cod29yZCBwdHIgd29yZCB3b3JkKSBSZWRyYXdXaW5kb3cxNgogMjkxIHBhc2NhbCAgIFNldFdpbmRvd3NIb29rRXgoc193b3JkIHNlZ3B0ciB3b3JkIHdvcmQpIFNldFdpbmRvd3NIb29rRXgKIDI5MiBwYXNjYWwxNiBVbmhvb2tXaW5kb3dzSG9va0V4KHNlZ3B0cikgVW5ob29rV2luZG93c0hvb2tFeAogMjkzIHBhc2NhbCAgIENhbGxOZXh0SG9va0V4KHNlZ3B0ciBzX3dvcmQgd29yZCBsb25nKSBDYWxsTmV4dEhvb2tFeApAQCAtMzAzLDcgKzMwMyw3IEBACiAjMzAxIEJPWk9TTElWRUhFUkUgOi0pKQk8LSB0aGlzIGlzIGFjdHVhbGx5IEVkaXRXbmRQcm9jCiAjMzA2IEJFQVIzMDYKIDMwOCBwYXNjYWwgICBEZWZEbGdQcm9jKHdvcmQgd29yZCB3b3JkIGxvbmcpIERlZkRsZ1Byb2MKLTMwOSBwYXNjYWwxNiBHZXRDbGlwQ3Vyc29yKHB0cikgR2V0Q2xpcEN1cnNvcgorMzA5IHBhc2NhbDE2IEdldENsaXBDdXJzb3IocHRyKSBHZXRDbGlwQ3Vyc29yMTYKIDMxNCBzdHViIFNpZ25hbFByb2MKIDMxOSBwYXNjYWwxNiBTY3JvbGxXaW5kb3dFeCh3b3JkIHNfd29yZCBzX3dvcmQgcHRyIHB0ciB3b3JkIHB0ciB3b3JkKQogICAgICAgICAgICAgIFNjcm9sbFdpbmRvd0V4CkBAIC0zMzEsMTAgKzMzMSwxMCBAQAogMzY0IHN0dWIgTG9va3VwSWNvbklERnJvbURpcmVjdG9yeUV4CiAzNjggcGFzY2FsMTYgQ29weUljb24od29yZCB3b3JkKSBDb3B5SWNvbgogMzY5IHBhc2NhbDE2IENvcHlDdXJzb3Iod29yZCB3b3JkKSBDb3B5Q3Vyc29yCi0zNzAgcGFzY2FsMTYgR2V0V2luZG93UGxhY2VtZW50KHdvcmQgcHRyKSBHZXRXaW5kb3dQbGFjZW1lbnQKLTM3MSBwYXNjYWwxNiBTZXRXaW5kb3dQbGFjZW1lbnQod29yZCBwdHIpIFNldFdpbmRvd1BsYWNlbWVudAorMzcwIHBhc2NhbDE2IEdldFdpbmRvd1BsYWNlbWVudCh3b3JkIHB0cikgR2V0V2luZG93UGxhY2VtZW50MTYKKzM3MSBwYXNjYWwxNiBTZXRXaW5kb3dQbGFjZW1lbnQod29yZCBwdHIpIFNldFdpbmRvd1BsYWNlbWVudDE2CiAzNzIgc3R1YiBHZXRJbnRlcm5hbEljb25IZWFkZXIKLTM3MyBwYXNjYWwxNiBTdWJ0cmFjdFJlY3QocHRyIHB0ciBwdHIpIFN1YnRyYWN0UmVjdAorMzczIHBhc2NhbDE2IFN1YnRyYWN0UmVjdChwdHIgcHRyIHB0cikgU3VidHJhY3RSZWN0MTYKIDM3NSBzdHViIERyYXdUZXh0RXgKIDM3NiBzdHViIFNldE1lc3NhZ2VFeHRyYUluZm8KIDM3OCBzdHViIFNldFByb3BFeApAQCAtMzUwLDE0ICszNTAsMTQgQEAKIDM5MSBzdHViIFNpZ25hbFByb2MzMgogMzk0IHN0dWIgRHJhd0ljb25FeAogMzk1IHN0dWIgR2V0SWNvbkluZm8KLTM5NyBzdHViIFJlZ2lzdGVyQ2xhc3NFeAotMzk4IHN0dWIgR2V0Q2xhc3NJbmZvRXgKKzM5NyBwYXNjYWwxNiBSZWdpc3RlckNsYXNzRXgocHRyKSBSZWdpc3RlckNsYXNzRXgxNgorMzk4IHBhc2NhbDE2IEdldENsYXNzSW5mb0V4KHdvcmQgc2VncHRyIHB0cikgR2V0Q2xhc3NJbmZvRXgxNgogMzk5IHN0dWIgQ2hpbGRXaW5kb3dGcm9tUG9pbnRFeAogNDAwIHN0dWIgRmluYWxVc2VySW5pdAogNDAyIHBhc2NhbDE2IEdldFByaW9yaXR5Q2xpcGJvYXJkRm9ybWF0KHdvcmQgcHRyIHNfd29yZCkKICAgICAgICAgICAgICBHZXRQcmlvcml0eUNsaXBib2FyZEZvcm1hdAogNDAzIHBhc2NhbDE2IFVucmVnaXN0ZXJDbGFzcyhzZWdwdHIgd29yZCkgVW5yZWdpc3RlckNsYXNzMTYKLTQwNCBwYXNjYWwxNiBHZXRDbGFzc0luZm8od29yZCBzZWdwdHIgcHRyKSBHZXRDbGFzc0luZm8KKzQwNCBwYXNjYWwxNiBHZXRDbGFzc0luZm8od29yZCBzZWdwdHIgcHRyKSBHZXRDbGFzc0luZm8xNgogNDA2IHBhc2NhbDE2IENyZWF0ZUN1cnNvcih3b3JkIHdvcmQgd29yZCB3b3JkIHdvcmQgcHRyIHB0cikgQ3JlYXRlQ3Vyc29yCiA0MDcgcGFzY2FsMTYgQ3JlYXRlSWNvbih3b3JkIHdvcmQgd29yZCB3b3JkIHdvcmQgcHRyIHB0cikgQ3JlYXRlSWNvbgogNDA4IHBhc2NhbDE2IENyZWF0ZUN1cnNvckljb25JbmRpcmVjdCh3b3JkIHB0ciBwdHIgcHRyKQpAQCAtMzY5LDE0ICszNjksMTQgQEAKIDQxMyBwYXNjYWwxNiBEZWxldGVNZW51KHdvcmQgd29yZCB3b3JkKSBEZWxldGVNZW51CiA0MTQgcGFzY2FsMTYgTW9kaWZ5TWVudSh3b3JkIHdvcmQgd29yZCB3b3JkIHNlZ3B0cikgTW9kaWZ5TWVudQogNDE1IHBhc2NhbDE2IENyZWF0ZVBvcHVwTWVudSgpIENyZWF0ZVBvcHVwTWVudQotNDE2IHBhc2NhbDE2IFRyYWNrUG9wdXBNZW51KHdvcmQgd29yZCB3b3JkIHdvcmQgd29yZCB3b3JkIHB0cikgVHJhY2tQb3B1cE1lbnUKKzQxNiBwYXNjYWwxNiBUcmFja1BvcHVwTWVudSh3b3JkIHdvcmQgc193b3JkIHNfd29yZCBzX3dvcmQgd29yZCBwdHIpIFRyYWNrUG9wdXBNZW51MTYKIDQxNyBwYXNjYWwgICBHZXRNZW51Q2hlY2tNYXJrRGltZW5zaW9ucygpIEdldE1lbnVDaGVja01hcmtEaW1lbnNpb25zCiA0MTggcGFzY2FsMTYgU2V0TWVudUl0ZW1CaXRtYXBzKHdvcmQgd29yZCB3b3JkIHdvcmQgd29yZCkgU2V0TWVudUl0ZW1CaXRtYXBzCiA0MjAgcGFzY2FsMTYgd3NwcmludGYoKSB3c3ByaW50ZgogNDIxIHBhc2NhbDE2IHd2c3ByaW50ZihwdHIgcHRyIHB0cikgd3ZzcHJpbnRmCiA0MjIgc3R1YiBEbGdEaXJTZWxlY3RFeAogNDIzIHN0dWIgRGxnRGlyU2VsZWN0Q29tYm9Cb3hFeAotNDI3IHBhc2NhbDE2IEZpbmRXaW5kb3dFeCh3b3JkIHdvcmQgc2VncHRyIHB0cikgRmluZFdpbmRvd0V4Cis0MjcgcGFzY2FsMTYgRmluZFdpbmRvd0V4KHdvcmQgd29yZCBzZWdwdHIgcHRyKSBGaW5kV2luZG93RXgxNgogNDI4IHN0dWIgVGlsZVdpbmRvd3MKIDQyOSBzdHViIENhc2NhZGVXaW5kb3dzCiA0MzAgcGFzY2FsMTYgbHN0cmNtcChwdHIgcHRyKSBsc3RyY21wCkBAIC0zOTksMTkgKzM5OSwxOSBAQAogNDUxIHBhc2NhbDE2IFRyYW5zbGF0ZU1ESVN5c0FjY2VsKHdvcmQgcHRyKSBUcmFuc2xhdGVNRElTeXNBY2NlbAogNDUyIHBhc2NhbDE2IENyZWF0ZVdpbmRvd0V4KGxvbmcgc2VncHRyIHNlZ3B0ciBsb25nIHNfd29yZCBzX3dvcmQgc193b3JkIHNfd29yZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmQgd29yZCB3b3JkIHNlZ3B0cikgQ3JlYXRlV2luZG93RXgxNgotNDU0IHBhc2NhbDE2IEFkanVzdFdpbmRvd1JlY3RFeChwdHIgbG9uZyB3b3JkIGxvbmcpIEFkanVzdFdpbmRvd1JlY3RFeAorNDU0IHBhc2NhbDE2IEFkanVzdFdpbmRvd1JlY3RFeChwdHIgbG9uZyB3b3JkIGxvbmcpIEFkanVzdFdpbmRvd1JlY3RFeDE2CiA0NTUgcGFzY2FsMTYgR2V0SWNvbklEKHdvcmQgbG9uZykgR2V0SWNvbklECiA0NTYgcGFzY2FsMTYgTG9hZEljb25IYW5kbGVyKHdvcmQgd29yZCkgTG9hZEljb25IYW5kbGVyCiA0NTcgcGFzY2FsMTYgRGVzdHJveUljb24od29yZCkgRGVzdHJveUljb24KIDQ1OCBwYXNjYWwxNiBEZXN0cm95Q3Vyc29yKHdvcmQpIERlc3Ryb3lDdXJzb3IKIDQ1OSBwYXNjYWwgICBEdW1wSWNvbihzZWdwdHIgcHRyIHB0ciBwdHIpIER1bXBJY29uCi00NjAgcGFzY2FsMTYgR2V0SW50ZXJuYWxXaW5kb3dQb3Mod29yZCBwdHIgcHRyKSBHZXRJbnRlcm5hbFdpbmRvd1BvcwotNDYxIHBhc2NhbDE2IFNldEludGVybmFsV2luZG93UG9zKHdvcmQgd29yZCBwdHIgcHRyKSBTZXRJbnRlcm5hbFdpbmRvd1BvcworNDYwIHBhc2NhbDE2IEdldEludGVybmFsV2luZG93UG9zKHdvcmQgcHRyIHB0cikgR2V0SW50ZXJuYWxXaW5kb3dQb3MxNgorNDYxIHBhc2NhbDE2IFNldEludGVybmFsV2luZG93UG9zKHdvcmQgd29yZCBwdHIgcHRyKSBTZXRJbnRlcm5hbFdpbmRvd1BvczE2CiA0NjIgcGFzY2FsMTYgQ2FsY0NoaWxkU2Nyb2xsKHdvcmQgd29yZCkgQ2FsY0NoaWxkU2Nyb2xsCiA0NjMgcGFzY2FsMTYgU2Nyb2xsQ2hpbGRyZW4od29yZCB3b3JkIHdvcmQgbG9uZykgU2Nyb2xsQ2hpbGRyZW4KIDQ2NCBwYXNjYWwgICBEcmFnT2JqZWN0KHdvcmQgd29yZCB3b3JkIHdvcmQgd29yZCB3b3JkKSBEcmFnT2JqZWN0CiA0NjUgcGFzY2FsMTYgRHJhZ0RldGVjdCh3b3JkIGxvbmcpIERyYWdEZXRlY3QKLTQ2NiBwYXNjYWwxNiBEcmF3Rm9jdXNSZWN0KHdvcmQgcHRyKSBEcmF3Rm9jdXNSZWN0Cis0NjYgcGFzY2FsMTYgRHJhd0ZvY3VzUmVjdCh3b3JkIHB0cikgRHJhd0ZvY3VzUmVjdDE2CiA0NzAgc3R1YiBTdHJpbmdGdW5jCiA0NzEgcGFzY2FsMTYgbHN0cmNtcGkocHRyIHB0cikgbHN0cmNtcGkKIDQ3MiBwYXNjYWwgICBBbnNpTmV4dChzZWdwdHIpIEFuc2lOZXh0CmRpZmYgLS1naXQgYS9pZjE2MzIvdXNlcjMyLnNwZWMgYi9pZjE2MzIvdXNlcjMyLnNwZWMKaW5kZXggZTM4ZGY4OC4uNDA2NWIzNSAxMDA2NDQKLS0tIGEvaWYxNjMyL3VzZXIzMi5zcGVjCisrKyBiL2lmMTYzMi91c2VyMzIuc3BlYwpAQCAtMywxNSArMywxNSBAQAogYmFzZQkxCiAKIDAwMDAgc3R1YiBBY3RpdmF0ZUtleWJvYXJkTGF5b3V0Ci0wMDAxIHN0dWIgQWRqdXN0V2luZG93UmVjdAotMDAwMiBzdHViIEFkanVzdFdpbmRvd1JlY3RFeAorMDAwMSBzdGRjYWxsIEFkanVzdFdpbmRvd1JlY3QocHRyIGxvbmcgbG9uZykgQWRqdXN0V2luZG93UmVjdDMyCiswMDAyIHN0ZGNhbGwgQWRqdXN0V2luZG93UmVjdEV4KHB0ciBsb25nIGxvbmcgbG9uZykgQWRqdXN0V2luZG93UmVjdEV4MzIKIDAwMDMgc3R1YiBBbnlQb3B1cAogMDAwNCBzdHViIEFwcGVuZE1lbnVBCiAwMDA1IHN0dWIgQXBwZW5kTWVudVcKIDAwMDYgc3R1YiBBcnJhbmdlSWNvbmljV2luZG93cwogMDAwNyBzdHViIEF0dGFjaFRocmVhZElucHV0CiAwMDA4IHN0dWIgQmVnaW5EZWZlcldpbmRvd1BvcwotMDAwOSBzdGRjYWxsIEJlZ2luUGFpbnQobG9uZyBwdHIpIFVTRVIzMl9CZWdpblBhaW50CiswMDA5IHN0ZGNhbGwgQmVnaW5QYWludChsb25nIHB0cikgQmVnaW5QYWludDMyCiAwMDEwIHN0dWIgQnJpbmdXaW5kb3dUb1RvcAogMDAxMSBzdHViIEJyb2FkY2FzdFN5c3RlbU1lc3NhZ2UKIDAwMTIgc3R1YiBDYWxjQ2hpbGRTY3JvbGwKQEAgLTE5LDggKzE5LDggQEAKIDAwMTQgc3R1YiBDYWxsTXNnRmlsdGVyQQogMDAxNSBzdHViIENhbGxNc2dGaWx0ZXJXCiAwMDE2IHN0dWIgQ2FsbE5leHRIb29rRXgKLTAwMTcgc3R1YiBDYWxsV2luZG93UHJvY0EKLTAwMTggc3R1YiBDYWxsV2luZG93UHJvY1cKKzAwMTcgc3RkY2FsbCBDYWxsV2luZG93UHJvY0EocHRyIGxvbmcgbG9uZyBsb25nIGxvbmcpIENhbGxXaW5kb3dQcm9jMzJBCiswMDE4IHN0ZGNhbGwgQ2FsbFdpbmRvd1Byb2NXKHB0ciBsb25nIGxvbmcgbG9uZyBsb25nKSBDYWxsV2luZG93UHJvYzMyVwogMDAxOSBzdHViIENhc2NhZGVDaGlsZFdpbmRvd3MKIDAwMjAgc3R1YiBDYXNjYWRlV2luZG93cwogMDAyMSBzdHViIENoYW5nZUNsaXBib2FyZENoYWluCkBAIC01MCwxMSArNTAsMTEgQEAKIDAwNDUgc3RkY2FsbCBDaGVja01lbnVJdGVtKGxvbmcgbG9uZyBsb25nKSBDaGVja01lbnVJdGVtCiAwMDQ2IHN0dWIgQ2hlY2tNZW51UmFkaW9JdGVtCiAwMDQ3IHN0dWIgQ2hlY2tSYWRpb0J1dHRvbgotMDA0OCBzdHViIENoaWxkV2luZG93RnJvbVBvaW50CiswMDQ4IHN0ZGNhbGwgQ2hpbGRXaW5kb3dGcm9tUG9pbnQobG9uZyBsb25nIGxvbmcpIENoaWxkV2luZG93RnJvbVBvaW50MzIKIDAwNDkgc3R1YiBDaGlsZFdpbmRvd0Zyb21Qb2ludEV4CiAwMDUwIHN0dWIgQ2xpZW50VGhyZWFkQ29ubmVjdAotMDA1MSBzdHViIENsaWVudFRvU2NyZWVuCi0wMDUyIHN0dWIgQ2xpcEN1cnNvcgorMDA1MSBzdGRjYWxsIENsaWVudFRvU2NyZWVuKGxvbmcgcHRyKSBDbGllbnRUb1NjcmVlbjMyCiswMDUyIHN0ZGNhbGwgQ2xpcEN1cnNvcihwdHIpIENsaXBDdXJzb3IzMgogMDA1MyBzdHViIENsb3NlQ2xpcGJvYXJkCiAwMDU0IHN0dWIgQ2xvc2VEZXNrdG9wCiAwMDU1IHN0dWIgQ2xvc2VXaW5kb3cKQEAgLTYzLDcgKzYzLDcgQEAKIDAwNTggc3R1YiBDb3B5QWNjZWxlcmF0b3JUYWJsZVcKIDAwNTkgc3R1YiBDb3B5SWNvbgogMDA2MCBzdHViIENvcHlJbWFnZQotMDA2MSBzdHViIENvcHlSZWN0CiswMDYxIHN0ZGNhbGwgQ29weVJlY3QocHRyIHB0cikgQ29weVJlY3QzMgogMDA2MiBzdHViIENvdW50Q2xpcGJvYXJkRm9ybWF0cwogMDA2MyBzdHViIENyZWF0ZUFjY2VsZXJhdG9yVGFibGVBCiAwMDY0IHN0dWIgQ3JlYXRlQWNjZWxlcmF0b3JUYWJsZVcKQEAgLTE2NCw3ICsxNjQsNyBAQAogMDE1MiBzdHViIERyYXdBbmltYXRlZFJlY3RzCiAwMTUzIHN0dWIgRHJhd0NhcHRpb24KIDAxNTQgc3R1YiBEcmF3RWRnZQotMDE1NSBzdHViIERyYXdGb2N1c1JlY3QKKzAxNTUgc3RkY2FsbCBEcmF3Rm9jdXNSZWN0KGxvbmcgcHRyKSBEcmF3Rm9jdXNSZWN0MzIKIDAxNTYgc3R1YiBEcmF3RnJhbWUKIDAxNTcgc3R1YiBEcmF3RnJhbWVDb250cm9sCiAwMTU4IHN0dWIgRHJhd0ljb24KQEAgLTE3MiwxMCArMTcyLDEwIEBACiAwMTYwIHN0ZGNhbGwgRHJhd01lbnVCYXIobG9uZykgRHJhd01lbnVCYXIKIDAxNjEgc3R1YiBEcmF3U3RhdGVBCiAwMTYyIHN0dWIgRHJhd1N0YXRlVwotMDE2MyBzdGRjYWxsIERyYXdUZXh0QShsb25nIHB0ciBsb25nIHB0ciBsb25nKSBVU0VSMzJfRHJhd1RleHRBCiswMTYzIHN0ZGNhbGwgRHJhd1RleHRBKGxvbmcgcHRyIGxvbmcgcHRyIGxvbmcpIERyYXdUZXh0MzJBCiAwMTY0IHN0dWIgRHJhd1RleHRFeEEKIDAxNjUgc3R1YiBEcmF3VGV4dEV4VwotMDE2NiBzdHViIERyYXdUZXh0VworMDE2NiBzdGRjYWxsIERyYXdUZXh0Vyhsb25nIHB0ciBsb25nIHB0ciBsb25nKSBEcmF3VGV4dDMyVwogMDE2NyBzdHViIEVkaXRXbmRQcm9jCiAwMTY4IHN0ZGNhbGwgRW1wdHlDbGlwYm9hcmQoKQkJCQlFbXB0eUNsaXBib2FyZAogMDE2OSBzdGRjYWxsIEVuYWJsZU1lbnVJdGVtKGxvbmcgbG9uZyBsb25nKSBFbmFibGVNZW51SXRlbQpAQCAtMTg0LDcgKzE4NCw3IEBACiAwMTcyIHN0dWIgRW5kRGVmZXJXaW5kb3dQb3MKIDAxNzMgc3RkY2FsbCBFbmREaWFsb2cobG9uZyBsb25nKSBFbmREaWFsb2cKIDAxNzQgc3R1YiBFbmRNZW51Ci0wMTc1IHN0ZGNhbGwgRW5kUGFpbnQobG9uZyBwdHIpIFVTRVIzMl9FbmRQYWludAorMDE3NSBzdGRjYWxsIEVuZFBhaW50KGxvbmcgcHRyKSBFbmRQYWludDMyCiAwMTc2IHN0dWIgRW5kVGFzawogMDE3NyBzdHViIEVudW1DaGlsZFdpbmRvd3MKIDAxNzggc3R1YiBFbnVtQ2xpcGJvYXJkRm9ybWF0cwpAQCAtMjAyLDM0ICsyMDIsMzQgQEAKIDAxOTAgc3R1YiBFbnVtV2luZG93U3RhdGlvbnNBCiAwMTkxIHN0dWIgRW51bVdpbmRvd1N0YXRpb25zVwogMDE5MiBzdHViIEVudW1XaW5kb3dzCi0wMTkzIHN0dWIgRXF1YWxSZWN0Ci0wMTk0IHN0dWIgRXhjbHVkZVVwZGF0ZVJnbgorMDE5MyBzdGRjYWxsIEVxdWFsUmVjdChwdHIgcHRyKSBFcXVhbFJlY3QzMgorMDE5NCBzdGRjYWxsIEV4Y2x1ZGVVcGRhdGVSZ24obG9uZyBsb25nKSBFeGNsdWRlVXBkYXRlUmduCiAwMTk1IHN0dWIgRXhpdFdpbmRvd3NFeAotMDE5NiBzdHViIEZpbGxSZWN0Ci0wMTk3IAlyZXR1cm4gRmluZFdpbmRvd0EgOCAwCi0wMTk4IHN0dWIgRmluZFdpbmRvd0V4QQotMDE5OSBzdHViIEZpbmRXaW5kb3dFeFcKLTAyMDAgc3R1YiBGaW5kV2luZG93VworMDE5NiBzdGRjYWxsIEZpbGxSZWN0KGxvbmcgcHRyIGxvbmcpIEZpbGxSZWN0MzIKKzAxOTcgc3RkY2FsbCBGaW5kV2luZG93QShwdHIgcHRyKSBGaW5kV2luZG93MzJBCiswMTk4IHN0ZGNhbGwgRmluZFdpbmRvd0V4QShsb25nIGxvbmcgcHRyIHB0cikgRmluZFdpbmRvd0V4MzJBCiswMTk5IHN0ZGNhbGwgRmluZFdpbmRvd0V4Vyhsb25nIGxvbmcgcHRyIHB0cikgRmluZFdpbmRvd0V4MzJXCiswMjAwIHN0ZGNhbGwgRmluZFdpbmRvd1cocHRyIHB0cikgRmluZFdpbmRvdzMyVwogMDIwMSBzdGRjYWxsIEZsYXNoV2luZG93KGxvbmcgbG9uZykgRmxhc2hXaW5kb3cKLTAyMDIgc3R1YiBGcmFtZVJlY3QKKzAyMDIgc3RkY2FsbCBGcmFtZVJlY3QobG9uZyBwdHIgbG9uZykgRnJhbWVSZWN0MzIKIDAyMDMgc3R1YiBGcmVlRERFbFBhcmFtCiAwMjA0IHN0dWIgR2V0QWN0aXZlV2luZG93CiAwMjA1IHN0dWIgR2V0QXBwQ29tcGF0RmxhZ3MKIDAyMDYgc3R1YiBHZXRBc3luY0tleVN0YXRlCiAwMjA3IHN0dWIgR2V0Q2FwdHVyZQogMDIwOCBzdHViIEdldENhcmV0QmxpbmtUaW1lCi0wMjA5IHN0dWIgR2V0Q2FyZXRQb3MKLTAyMTAgc3R1YiBHZXRDbGFzc0luZm9BCi0wMjExIHN0dWIgR2V0Q2xhc3NJbmZvRXhBCi0wMjEyIHN0dWIgR2V0Q2xhc3NJbmZvRXhXCi0wMjEzIHN0dWIgR2V0Q2xhc3NJbmZvVwotMDIxNCBzdHViIEdldENsYXNzTG9uZ0EKLTAyMTUgc3R1YiBHZXRDbGFzc0xvbmdXCi0wMjE2IHN0dWIgR2V0Q2xhc3NOYW1lQQotMDIxNyBzdHViIEdldENsYXNzTmFtZVcKLTAyMTggc3R1YiBHZXRDbGFzc1dvcmQKLTAyMTkgc3RkY2FsbCBHZXRDbGllbnRSZWN0KGxvbmcgbG9uZykgVVNFUjMyX0dldENsaWVudFJlY3QKLTAyMjAgc3R1YiBHZXRDbGlwQ3Vyc29yCiswMjA5IHN0ZGNhbGwgR2V0Q2FyZXRQb3MocHRyKSBHZXRDYXJldFBvczMyCiswMjEwIHN0ZGNhbGwgR2V0Q2xhc3NJbmZvQShsb25nIHB0ciBwdHIpIEdldENsYXNzSW5mbzMyQQorMDIxMSBzdGRjYWxsIEdldENsYXNzSW5mb0V4QShsb25nIHB0ciBwdHIpIEdldENsYXNzSW5mb0V4MzJBCiswMjEyIHN0ZGNhbGwgR2V0Q2xhc3NJbmZvRXhXKGxvbmcgcHRyIHB0cikgR2V0Q2xhc3NJbmZvRXgzMlcKKzAyMTMgc3RkY2FsbCBHZXRDbGFzc0luZm9XKGxvbmcgcHRyIHB0cikgR2V0Q2xhc3NJbmZvMzJXCiswMjE0IHN0ZGNhbGwgR2V0Q2xhc3NMb25nQShsb25nIGxvbmcpIEdldENsYXNzTG9uZzMyQQorMDIxNSBzdGRjYWxsIEdldENsYXNzTG9uZ1cobG9uZyBsb25nKSBHZXRDbGFzc0xvbmczMlcKKzAyMTYgc3RkY2FsbCBHZXRDbGFzc05hbWVBKGxvbmcgcHRyIGxvbmcpIEdldENsYXNzTmFtZTMyQQorMDIxNyBzdGRjYWxsIEdldENsYXNzTmFtZVcobG9uZyBwdHIgbG9uZykgR2V0Q2xhc3NOYW1lMzJXCiswMjE4IHN0ZGNhbGwgR2V0Q2xhc3NXb3JkKGxvbmcgbG9uZykgR2V0Q2xhc3NXb3JkCiswMjE5IHN0ZGNhbGwgR2V0Q2xpZW50UmVjdChsb25nIGxvbmcpIEdldENsaWVudFJlY3QzMgorMDIyMCBzdGRjYWxsIEdldENsaXBDdXJzb3IocHRyKSBHZXRDbGlwQ3Vyc29yMzIKIDAyMjEgc3R1YiBHZXRDbGlwYm9hcmREYXRhCiAwMjIyIHN0dWIgR2V0Q2xpcGJvYXJkRm9ybWF0TmFtZUEKIDAyMjMgc3R1YiBHZXRDbGlwYm9hcmRGb3JtYXROYW1lVwpAQCAtMjM3LDcgKzIzNyw3IEBACiAwMjI1IHN0dWIgR2V0Q2xpcGJvYXJkVmlld2VyCiAwMjI2IHN0dWIgR2V0Q3Vyc29yCiAwMjI3IHN0dWIgR2V0Q3Vyc29ySW5mbwotMDIyOCBzdGRjYWxsIEdldEN1cnNvclBvcyhwdHIpIEdldEN1cnNvclBvcworMDIyOCBzdGRjYWxsIEdldEN1cnNvclBvcyhwdHIpIEdldEN1cnNvclBvczMyCiAwMjI5IHN0ZGNhbGwgR2V0REMobG9uZykgR2V0REMKIDAyMzAgc3R1YiBHZXREQ0V4CiAwMjMxIHN0ZGNhbGwgR2V0RGVza3RvcFdpbmRvdygpIEdldERlc2t0b3BXaW5kb3cKQEAgLTI1Myw3ICsyNTMsNyBAQAogMDI0MSBzdHViIEdldEljb25JbmZvCiAwMjQyIHN0dWIgR2V0SW5wdXREZXNrdG9wCiAwMjQzIHN0dWIgR2V0SW5wdXRTdGF0ZQotMDI0NCBzdHViIEdldEludGVybmFsV2luZG93UG9zCiswMjQ0IHN0ZGNhbGwgR2V0SW50ZXJuYWxXaW5kb3dQb3MobG9uZyBwdHIgcHRyKSBHZXRJbnRlcm5hbFdpbmRvd1BvczMyCiAwMjQ1IHN0dWIgR2V0S0JDb2RlUGFnZQogMDI0NiBzdHViIEdldEtleU5hbWVUZXh0QQogMDI0NyBzdHViIEdldEtleU5hbWVUZXh0VwpAQCAtMjk2LDcgKzI5Niw3IEBACiAwMjg0IHN0dWIgR2V0U2Nyb2xsUG9zCiAwMjg1IHN0dWIgR2V0U2Nyb2xsUmFuZ2UKIDAyODYgc3R1YiBHZXRTaGVsbFdpbmRvdwotMDI4NyBzdHViIEdldFN1Yk1lbnUKKzAyODcgc3RkY2FsbCBHZXRTdWJNZW51KGxvbmcgbG9uZykgR2V0U3ViTWVudQogMDI4OCAJc3RkY2FsbCBHZXRTeXNDb2xvcihsb25nKSBHZXRTeXNDb2xvcgogMDI4OSBzdGRjYWxsIEdldFN5c0NvbG9yQnJ1c2gobG9uZykgR2V0U3lzQ29sb3JCcnVzaAogMDI5MCBzdGRjYWxsIEdldFN5c3RlbU1lbnUobG9uZyBsb25nKSBHZXRTeXN0ZW1NZW51CkBAIC0zMDUsOCArMzA1LDggQEAKIDAyOTMgc3R1YiBHZXRUYWJiZWRUZXh0RXh0ZW50VwogMDI5NCBzdHViIEdldFRocmVhZERlc2t0b3AKIDAyOTUgc3R1YiBHZXRUb3BXaW5kb3cKLTAyOTYgc3R1YiBHZXRVcGRhdGVSZWN0Ci0wMjk3IHN0dWIgR2V0VXBkYXRlUmduCiswMjk2IHN0ZGNhbGwgR2V0VXBkYXRlUmVjdChsb25nIHB0ciBsb25nKSBHZXRVcGRhdGVSZWN0MzIKKzAyOTcgc3RkY2FsbCBHZXRVcGRhdGVSZ24obG9uZyBsb25nIGxvbmcpIEdldFVwZGF0ZVJnbgogMDI5OCBzdHViIEdldFVzZXJPYmplY3RJbmZvcm1hdGlvbkEKIDAyOTkgc3R1YiBHZXRVc2VyT2JqZWN0SW5mb3JtYXRpb25XCiAwMzAwIHN0dWIgR2V0VXNlck9iamVjdFNlY3VyaXR5CkBAIC0zMTUsOCArMzE1LDggQEAKIDAzMDMgc3RkY2FsbCBHZXRXaW5kb3dEQyhsb25nKSBHZXRXaW5kb3dEQwogMDMwNCBzdHViIEdldFdpbmRvd0xvbmdBCiAwMzA1IHN0dWIgR2V0V2luZG93TG9uZ1cKLTAzMDYgc3R1YiBHZXRXaW5kb3dQbGFjZW1lbnQKLTAzMDcgc3R1YiBHZXRXaW5kb3dSZWN0CiswMzA2IHN0ZGNhbGwgR2V0V2luZG93UGxhY2VtZW50KGxvbmcgcHRyKSBHZXRXaW5kb3dQbGFjZW1lbnQzMgorMDMwNyBzdGRjYWxsIEdldFdpbmRvd1JlY3QobG9uZyBwdHIpIEdldFdpbmRvd1JlY3QzMgogMDMwOCBzdGRjYWxsIEdldFdpbmRvd1RleHRBKGxvbmcgc2VncHRyIGxvbmcpIFdJTjE2X0dldFdpbmRvd1RleHQKIDAzMDkgc3R1YiBHZXRXaW5kb3dUZXh0TGVuZ3RoQQogMDMxMCBzdHViIEdldFdpbmRvd1RleHRMZW5ndGhXCkBAIC0zMjksMTYgKzMyOSwxNiBAQAogMDMxNyBzdHViIEhpbGl0ZU1lbnVJdGVtCiAwMzE4IHN0dWIgSW1wZXJzb25hdGVEZGVDbGllbnRXaW5kb3cKIDAzMTkgc3R1YiBJblNlbmRNZXNzYWdlCi0wMzIwIHN0dWIgSW5mbGF0ZVJlY3QKKzAzMjAgc3RkY2FsbCBJbmZsYXRlUmVjdChwdHIgbG9uZyBsb25nKSBJbmZsYXRlUmVjdDMyCiAwMzIxIHN0dWIgSW5zZXJ0TWVudUEKIDAzMjIgc3R1YiBJbnNlcnRNZW51SXRlbUEKIDAzMjMgc3R1YiBJbnNlcnRNZW51SXRlbVcKIDAzMjQgc3R1YiBJbnNlcnRNZW51VwogMDMyNSBzdHViIEludGVybmFsR2V0V2luZG93VGV4dAotMDMyNiBzdHViIEludGVyc2VjdFJlY3QKLTAzMjcgc3RkY2FsbCBJbnZhbGlkYXRlUmVjdChsb25nIHB0ciBsb25nKQlVU0VSMzJfSW52YWxpZGF0ZVJlY3QKLTAzMjggc3R1YiBJbnZhbGlkYXRlUmduCi0wMzI5IHN0dWIgSW52ZXJ0UmVjdAorMDMyNiBzdGRjYWxsIEludGVyc2VjdFJlY3QocHRyIHB0ciBwdHIpIEludGVyc2VjdFJlY3QzMgorMDMyNyBzdGRjYWxsIEludmFsaWRhdGVSZWN0KGxvbmcgcHRyIGxvbmcpIEludmFsaWRhdGVSZWN0MzIKKzAzMjggc3RkY2FsbCBJbnZhbGlkYXRlUmduKGxvbmcgbG9uZyBsb25nKSBJbnZhbGlkYXRlUmduCiswMzI5IHN0ZGNhbGwgSW52ZXJ0UmVjdChsb25nIHB0cikgSW52ZXJ0UmVjdDMyCiAwMzMwIHN0dWIgSXNDaGFyQWxwaGFBCiAwMzMxIHN0dWIgSXNDaGFyQWxwaGFOdW1lcmljQQogMDMzMiBzdHViIElzQ2hhckFscGhhTnVtZXJpY1cKQEAgLTM1NSwxMSArMzU1LDExIEBACiAwMzQzIHN0dWIgSXNEbGdCdXR0b25DaGVja2VkCiAwMzQ0IHN0ZGNhbGwgSXNJY29uaWMobG9uZykgSXNJY29uaWMKIDAzNDUgc3R1YiBJc01lbnUKLTAzNDYgc3R1YiBJc1JlY3RFbXB0eQorMDM0NiBzdGRjYWxsIElzUmVjdEVtcHR5KHB0cikgSXNSZWN0RW1wdHkzMgogMDM0NyBzdHViIElzV2luZG93Ci0wMzQ4IHN0dWIgSXNXaW5kb3dFbmFibGVkCi0wMzQ5IHN0dWIgSXNXaW5kb3dVbmljb2RlCi0wMzUwIHN0dWIgSXNXaW5kb3dWaXNpYmxlCiswMzQ4IHN0ZGNhbGwgSXNXaW5kb3dFbmFibGVkKGxvbmcpIElzV2luZG93RW5hYmxlZAorMDM0OSBzdGRjYWxsIElzV2luZG93VW5pY29kZShsb25nKSBJc1dpbmRvd1VuaWNvZGUKKzAzNTAgc3RkY2FsbCBJc1dpbmRvd1Zpc2libGUobG9uZykgSXNXaW5kb3dWaXNpYmxlCiAwMzUxIHN0dWIgSXNab29tZWQKIDAzNTIgc3R1YiBLaWxsU3lzdGVtVGltZXIKIDAzNTMgc3RkY2FsbCBLaWxsVGltZXIobG9uZyBsb25nKSBLaWxsVGltZXIKQEAgLTM5MCwxMSArMzkwLDExIEBACiAwMzc4IHN0dWIgTG9va3VwSWNvbklkRnJvbURpcmVjdG9yeQogMDM3OSBzdHViIExvb2t1cEljb25JZEZyb21EaXJlY3RvcnlFeAogMDM4MCBzdHViIE1CVG9XQ1NFeAotMDM4MSBzdHViIE1hcERpYWxvZ1JlY3QKKzAzODEgc3RkY2FsbCBNYXBEaWFsb2dSZWN0KGxvbmcgcHRyKSBNYXBEaWFsb2dSZWN0MzIKIDAzODIgc3R1YiBNYXBWaXJ0dWFsS2V5QQogMDM4MyBzdHViIE1hcFZpcnR1YWxLZXlFeEEKIDAzODQgc3R1YiBNYXBWaXJ0dWFsS2V5VwotMDM4NSBzdHViIE1hcFdpbmRvd1BvaW50cworMDM4NSBzdGRjYWxsIE1hcFdpbmRvd1BvaW50cyhsb25nIGxvbmcgcHRyIGxvbmcpIE1hcFdpbmRvd1BvaW50czMyCiAwMzg2IHN0dWIgTWVudUl0ZW1Gcm9tUG9pbnQKIDAzODcgc3R1YiBNZW51V2luZG93UHJvY0EKIDAzODggc3R1YiBNZW51V2luZG93UHJvY1cKQEAgLTQwNywxNCArNDA3LDE0IEBACiAwMzk1IHN0dWIgTWVzc2FnZUJveFcKIDAzOTYgc3R1YiBNb2RpZnlNZW51QQogMDM5NyBzdHViIE1vZGlmeU1lbnVXCi0wMzk4IHN0dWIgTW92ZVdpbmRvdworMDM5OCBzdGRjYWxsIE1vdmVXaW5kb3cobG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcpIE1vdmVXaW5kb3cKIDAzOTkgc3R1YiBNc2dXYWl0Rm9yTXVsdGlwbGVPYmplY3RzCiAwNDAwIHN0dWIgT2VtS2V5U2NhbgogMDQwMSBzdHViIE9lbVRvQ2hhckEKIDA0MDIgc3R1YiBPZW1Ub0NoYXJCdWZmQQogMDQwMyBzdHViIE9lbVRvQ2hhckJ1ZmZXCiAwNDA0IHN0dWIgT2VtVG9DaGFyVwotMDQwNSBzdHViIE9mZnNldFJlY3QKKzA0MDUgc3RkY2FsbCBPZmZzZXRSZWN0KHB0ciBsb25nIGxvbmcpIE9mZnNldFJlY3QzMgogMDQwNiBzdHViIE9wZW5DbGlwYm9hcmQKIDA0MDcgc3R1YiBPcGVuRGVza3RvcEEKIDA0MDggc3R1YiBPcGVuRGVza3RvcFcKQEAgLTQzMiwyMSArNDMyLDIxIEBACiAwNDIwIHN0ZGNhbGwgUG9zdFF1aXRNZXNzYWdlKGxvbmcpIFBvc3RRdWl0TWVzc2FnZQogMDQyMSBzdHViIFBvc3RUaHJlYWRNZXNzYWdlQQogMDQyMiBzdHViIFBvc3RUaHJlYWRNZXNzYWdlVwotMDQyMyBzdHViIFB0SW5SZWN0CiswNDIzIHN0ZGNhbGwgUHRJblJlY3QocHRyIGxvbmcgbG9uZykgUHRJblJlY3QzMgogMDQyNCBzdHViIFF1ZXJ5U2VuZE1lc3NhZ2UKLTA0MjUgc3R1YiBSZWRyYXdXaW5kb3cKKzA0MjUgc3RkY2FsbCBSZWRyYXdXaW5kb3cobG9uZyBwdHIgbG9uZyBsb25nKSBSZWRyYXdXaW5kb3czMgogMDQyNiBzdGRjYWxsIFJlZ2lzdGVyQ2xhc3NBKHB0cikgUmVnaXN0ZXJDbGFzczMyQQotMDQyNyBzdHViIFJlZ2lzdGVyQ2xhc3NFeEEKLTA0Mjggc3R1YiBSZWdpc3RlckNsYXNzRXhXCi0wNDI5IHN0dWIgUmVnaXN0ZXJDbGFzc1cKKzA0Mjcgc3RkY2FsbCBSZWdpc3RlckNsYXNzRXhBKHB0cikgUmVnaXN0ZXJDbGFzc0V4MzJBCiswNDI4IHN0ZGNhbGwgUmVnaXN0ZXJDbGFzc0V4VyhwdHIpIFJlZ2lzdGVyQ2xhc3NFeDMyVworMDQyOSBzdGRjYWxsIFJlZ2lzdGVyQ2xhc3NXKHB0cikgUmVnaXN0ZXJDbGFzczMyVwogMDQzMCBzdHViIFJlZ2lzdGVyQ2xpcGJvYXJkRm9ybWF0QQogMDQzMSBzdHViIFJlZ2lzdGVyQ2xpcGJvYXJkRm9ybWF0VwogMDQzMiBzdHViIFJlZ2lzdGVySG90S2V5CiAwNDMzIHN0dWIgUmVnaXN0ZXJMb2dvblByb2Nlc3MKIDA0MzQgc3R1YiBSZWdpc3RlclN5c3RlbVRocmVhZAogMDQzNSBzdHViIFJlZ2lzdGVyVGFza2xpc3QKLTA0MzYgc3R1YiBSZWdpc3RlcldpbmRvd01lc3NhZ2VBCi0wNDM3IHN0dWIgUmVnaXN0ZXJXaW5kb3dNZXNzYWdlVworMDQzNiBzdGRjYWxsIFJlZ2lzdGVyV2luZG93TWVzc2FnZUEocHRyKSBSZWdpc3RlcldpbmRvd01lc3NhZ2UzMkEKKzA0Mzcgc3RkY2FsbCBSZWdpc3RlcldpbmRvd01lc3NhZ2VXKHB0cikgUmVnaXN0ZXJXaW5kb3dNZXNzYWdlMzJXCiAwNDM4IHN0ZGNhbGwgUmVsZWFzZUNhcHR1cmUoKSBSZWxlYXNlQ2FwdHVyZQogMDQzOSBzdGRjYWxsIFJlbGVhc2VEQyhsb25nIGxvbmcpIFJlbGVhc2VEQwogMDQ0MCBzdHViIFJlbW92ZU1lbnUKQEAgLTQ1NSw3ICs0NTUsNyBAQAogMDQ0MyBzdHViIFJlcGx5TWVzc2FnZQogMDQ0NCBzdHViIFJlc2V0RGlzcGxheQogMDQ0NSBzdHViIFJldXNlRERFbFBhcmFtCi0wNDQ2IHN0dWIgU2NyZWVuVG9DbGllbnQKKzA0NDYgc3RkY2FsbCBTY3JlZW5Ub0NsaWVudChsb25nIHB0cikgU2NyZWVuVG9DbGllbnQzMgogMDQ0NyBzdHViIFNjcm9sbENoaWxkcmVuCiAwNDQ4IHN0dWIgU2Nyb2xsREMKIDA0NDkgc3R1YiBTY3JvbGxXaW5kb3cKQEAgLTQ3NSw5ICs0NzUsOSBAQAogMDQ2MyBzdGRjYWxsIFNldENhcHR1cmUobG9uZykgU2V0Q2FwdHVyZQogMDQ2NCBzdHViIFNldENhcmV0QmxpbmtUaW1lCiAwNDY1IHN0dWIgU2V0Q2FyZXRQb3MKLTA0NjYgc3R1YiBTZXRDbGFzc0xvbmdBCi0wNDY3IHN0dWIgU2V0Q2xhc3NMb25nVwotMDQ2OCBzdHViIFNldENsYXNzV29yZAorMDQ2NiBzdGRjYWxsIFNldENsYXNzTG9uZ0EobG9uZyBsb25nIGxvbmcpIFNldENsYXNzTG9uZzMyQQorMDQ2NyBzdGRjYWxsIFNldENsYXNzTG9uZ1cobG9uZyBsb25nIGxvbmcpIFNldENsYXNzTG9uZzMyVworMDQ2OCBzdGRjYWxsIFNldENsYXNzV29yZChsb25nIGxvbmcgbG9uZykgU2V0Q2xhc3NXb3JkCiAwNDY5IHN0dWIgU2V0Q2xpcGJvYXJkRGF0YQogMDQ3MCBzdHViIFNldENsaXBib2FyZFZpZXdlcgogMDQ3MSAJc3RkY2FsbCBTZXRDdXJzb3IobG9uZykgU2V0Q3Vyc29yCkBAIC00OTEsNyArNDkxLDcgQEAKIDA0Nzkgc3R1YiBTZXREb3VibGVDbGlja1RpbWUKIDA0ODAgc3R1YiBTZXRGb2N1cwogMDQ4MSBzdHViIFNldEZvcmVncm91bmRXaW5kb3cKLTA0ODIgc3R1YiBTZXRJbnRlcm5hbFdpbmRvd1BvcworMDQ4MiBzdGRjYWxsIFNldEludGVybmFsV2luZG93UG9zKGxvbmcgbG9uZyBwdHIgcHRyKSBTZXRJbnRlcm5hbFdpbmRvd1BvczMyCiAwNDgzIHN0dWIgU2V0S2V5Ym9hcmRTdGF0ZQogMDQ4NCBzdHViIFNldExhc3RFcnJvckV4CiAwNDg1IHN0dWIgU2V0TG9nb25Ob3RpZnlXaW5kb3cKQEAgLTUwNywxMSArNTA3LDExIEBACiAwNDk1IHN0dWIgU2V0UHJvY2Vzc1dpbmRvd1N0YXRpb24KIDA0OTYgc3R1YiBTZXRQcm9wQQogMDQ5NyBzdHViIFNldFByb3BXCi0wNDk4IHN0dWIgU2V0UmVjdAotMDQ5OSBzdHViIFNldFJlY3RFbXB0eQorMDQ5OCBzdGRjYWxsIFNldFJlY3QocHRyIGxvbmcgbG9uZyBsb25nIGxvbmcpIFNldFJlY3QzMgorMDQ5OSBzdGRjYWxsIFNldFJlY3RFbXB0eShwdHIpIFNldFJlY3RFbXB0eTMyCiAwNTAwIHN0dWIgU2V0U2Nyb2xsSW5mbwotMDUwMSBzdHViIFNldFNjcm9sbFBvcwotMDUwMiBzdHViIFNldFNjcm9sbFJhbmdlCiswNTAxIHN0ZGNhbGwgU2V0U2Nyb2xsUG9zKGxvbmcgbG9uZyBsb25nIGxvbmcpIFNldFNjcm9sbFBvcworMDUwMiBzdGRjYWxsIFNldFNjcm9sbFJhbmdlKGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZykgU2V0U2Nyb2xsUmFuZ2UKIDA1MDMgc3R1YiBTZXRTaGVsbFdpbmRvdwogMDUwNCBzdHViIFNldFN5c0NvbG9ycwogMDUwNSBzdHViIFNldFN5c0NvbG9yc1RlbXAKQEAgLTUyNywxNCArNTI3LDE0IEBACiAwNTE1IHN0dWIgU2V0V2luZG93RnVsbFNjcmVlblN0YXRlCiAwNTE2IHN0dWIgU2V0V2luZG93TG9uZ0EKIDA1MTcgc3R1YiBTZXRXaW5kb3dMb25nVwotMDUxOCBzdHViIFNldFdpbmRvd1BsYWNlbWVudAorMDUxOCBzdGRjYWxsIFNldFdpbmRvd1BsYWNlbWVudChsb25nIHB0cikgU2V0V2luZG93UGxhY2VtZW50MzIKIDA1MTkgc3R1YiBTZXRXaW5kb3dQb3MKIDA1MjAgc3R1YiBTZXRXaW5kb3dTdGF0aW9uVXNlcgogMDUyMSBzdGRjYWxsIFNldFdpbmRvd1RleHRBKGxvbmcgcHRyKQlTZXRXaW5kb3dUZXh0CiAwNTIyIHN0dWIgU2V0V2luZG93VGV4dFcKIDA1MjMgc3R1YiBTZXRXaW5kb3dXb3JkCiAwNTI0IHN0dWIgU2V0V2luZG93c0hvb2tBCi0wNTI1IHN0dWIgU2V0V2luZG93c0hvb2tFeEEKKzA1MjUgc3RkY2FsbCBTZXRXaW5kb3dzSG9va0V4QShsb25nIGxvbmcgbG9uZyBsb25nKSBTZXRXaW5kb3dzSG9va0V4MzJBCiAwNTI2IHN0dWIgU2V0V2luZG93c0hvb2tFeFcKIDA1Mjcgc3R1YiBTZXRXaW5kb3dzSG9va1cKIDA1Mjggc3R1YiBTaG93Q2FyZXQKQEAgLTU0NCw3ICs1NDQsNyBAQAogMDUzMiBzdHViIFNob3dTdGFydEdsYXNzCiAwNTMzIHN0ZGNhbGwgU2hvd1dpbmRvdyhsb25nIGxvbmcpIFNob3dXaW5kb3cKIDA1MzQgc3R1YiBTaG93V2luZG93QXN5bmMKLTA1MzUgc3R1YiBTdWJ0cmFjdFJlY3QKKzA1MzUgc3RkY2FsbCBTdWJ0cmFjdFJlY3QocHRyIHB0ciBwdHIpIFN1YnRyYWN0UmVjdDMyCiAwNTM2IHN0dWIgU3dhcE1vdXNlQnV0dG9uCiAwNTM3IHN0dWIgU3dpdGNoRGVza3RvcAogMDUzOCBzdHViIFN3aXRjaFRvVGhpc1dpbmRvdwpAQCAtNTU3LDcgKzU1Nyw3IEBACiAwNTQ1IHN0dWIgVG9Bc2NpaQogMDU0NiBzdHViIFRvQXNjaWlFeAogMDU0NyBzdHViIFRvVW5pY29kZQotMDU0OCBzdHViIFRyYWNrUG9wdXBNZW51CiswNTQ4IHN0ZGNhbGwgVHJhY2tQb3B1cE1lbnUobG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgcHRyKSBUcmFja1BvcHVwTWVudTMyCiAwNTQ5IHN0dWIgVHJhY2tQb3B1cE1lbnVFeAogMDU1MCBzdHViIFRyYW5zbGF0ZUFjY2VsZXJhdG9yCiAwNTUxIHN0ZGNhbGwgVHJhbnNsYXRlQWNjZWxlcmF0b3JBKGxvbmcgbG9uZyBwdHIpIFRyYW5zbGF0ZUFjY2VsZXJhdG9yCkBAIC01NjcsMjAgKzU2NywyMCBAQAogMDU1NSBzdGRjYWxsIFRyYW5zbGF0ZU1lc3NhZ2UocHRyKSBVU0VSMzJfVHJhbnNsYXRlTWVzc2FnZQogMDU1NiBzdHViIFVuaG9va1dpbmRvd3NIb29rCiAwNTU3IHN0dWIgVW5ob29rV2luZG93c0hvb2tFeAotMDU1OCBzdHViIFVuaW9uUmVjdAorMDU1OCBzdGRjYWxsIFVuaW9uUmVjdChwdHIgcHRyIHB0cikgVW5pb25SZWN0MzIKIDA1NTkgc3R1YiBVbmxvYWRLZXlib2FyZExheW91dAogMDU2MCBzdHViIFVubG9ja1dpbmRvd1N0YXRpb24KIDA1NjEgc3R1YiBVbnBhY2tEREVsUGFyYW0KLTA1NjIgc3R1YiBVbnJlZ2lzdGVyQ2xhc3NBCi0wNTYzIHN0dWIgVW5yZWdpc3RlckNsYXNzVworMDU2MiBzdGRjYWxsIFVucmVnaXN0ZXJDbGFzc0EocHRyIGxvbmcpIFVucmVnaXN0ZXJDbGFzczMyQQorMDU2MyBzdGRjYWxsIFVucmVnaXN0ZXJDbGFzc1cocHRyIGxvbmcpIFVucmVnaXN0ZXJDbGFzczMyVwogMDU2NCBzdHViIFVucmVnaXN0ZXJIb3RLZXkKIDA1NjUgc3R1YiBVcGRhdGVQZXJVc2VyU3lzdGVtUGFyYW1ldGVycwogMDU2NiBzdGRjYWxsIFVwZGF0ZVdpbmRvdyhsb25nKSBVcGRhdGVXaW5kb3cKIDA1Njcgc3R1YiBVc2VyQ2xpZW50RGxsSW5pdGlhbGl6ZQogMDU2OCBzdHViIFVzZXJSZWFsaXplUGFsZXR0ZQogMDU2OSBzdHViIFVzZXJSZWdpc3Rlcldvd0hhbmRsZXJzCi0wNTcwIHN0dWIgVmFsaWRhdGVSZWN0Ci0wNTcxIHN0dWIgVmFsaWRhdGVSZ24KKzA1NzAgc3RkY2FsbCBWYWxpZGF0ZVJlY3QobG9uZyBwdHIpIFZhbGlkYXRlUmVjdDMyCiswNTcxIHN0ZGNhbGwgVmFsaWRhdGVSZ24obG9uZyBsb25nKSBWYWxpZGF0ZVJnbgogMDU3MiBzdHViIFZrS2V5U2NhbkEKIDA1NzMgc3R1YiBWa0tleVNjYW5FeEEKIDA1NzQgc3R1YiBWa0tleVNjYW5FeFcKQEAgLTU5MCw3ICs1OTAsNyBAQAogMDU3OCBzdGRjYWxsIFdpbkhlbHBBKGxvbmcgcHRyIGxvbmcgbG9uZykJV0lOMzJfV2luSGVscEEKIDA1Nzkgc3R1YiBXaW5IZWxwVwogMDU4MCBzdHViIFdpbmRvd0Zyb21EQwotMDU4MSBzdHViIFdpbmRvd0Zyb21Qb2ludAorMDU4MSBzdGRjYWxsIFdpbmRvd0Zyb21Qb2ludChsb25nIGxvbmcpIFdpbmRvd0Zyb21Qb2ludDMyCiAwNTgyIHN0dWIga2V5YmRfZXZlbnQKIDA1ODMgc3R1YiBtb3VzZV9ldmVudAogMDU4NCBzdGRjYWxsIHdzcHJpbnRmQSgpIFVTRVIzMl93c3ByaW50ZkEKQEAgLTYwOCw0ICs2MDgsMyBAQAogMDU4OCBzdHViIFJlZ2lzdGVyU2VydmljZXNQcm9jZXNzCiAwNTg4IHN0dWIgU2V0V2luZG93UmduCiAwNTg4IHN0dWIgVG9Vbmljb2RlRXgKLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9iaXRtYXAuaCBiL2luY2x1ZGUvYml0bWFwLmgKaW5kZXggZmMwNzc2Mi4uNWMzYjc2MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9iaXRtYXAuaAorKysgYi9pbmNsdWRlL2JpdG1hcC5oCkBAIC0xNSw3ICsxNSw3IEBACiAgICAgR0RJT0JKSERSICAgaGVhZGVyOwogICAgIEJJVE1BUCAgICAgIGJpdG1hcDsKICAgICBQaXhtYXAgICAgICBwaXhtYXA7Ci0gICAgU0laRSAgICAgICAgc2l6ZTsgICAvKiBGb3IgU2V0Qml0bWFwRGltZW5zaW9uKCkgKi8KKyAgICBTSVpFMTYgICAgICBzaXplOyAgIC8qIEZvciBTZXRCaXRtYXBEaW1lbnNpb24oKSAqLwogfSBCSVRNQVBPQko7CiAKICAgLyogR0NzIHVzZWQgZm9yIEImVyBhbmQgY29sb3IgYml0bWFwIG9wZXJhdGlvbnMgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2FsbGJhY2suaCBiL2luY2x1ZGUvY2FsbGJhY2suaAppbmRleCAzZWI1MjliLi5mMjUyMDA3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NhbGxiYWNrLmgKKysrIGIvaW5jbHVkZS9jYWxsYmFjay5oCkBAIC02NCw3ICs2NCw3IEBACiAgICAgQ2FsbFRvMTZfbG9uZ193d2woIGZ1bmMsIENVUlJFTlRfRFMsIGNvZGUsIHdQYXJhbSwgbFBhcmFtICkKICNkZWZpbmUgQ2FsbFRpbWVGdW5jUHJvYyggZnVuYywgaWQsIG1zZywgZHdVc2VyLCBkdzEsIGR3MiApIFwKICAgICBDYWxsVG8xNl93b3JkX3d3bGxsKCBmdW5jLCBDVVJSRU5UX0RTLCBpZCwgbXNnLCBkd1VzZXIsIGR3MSwgZHcyICkKLSNkZWZpbmUgQ2FsbFduZFByb2MoIGZ1bmMsIGRzLCBod25kLCBtc2csIHdQYXJhbSwgbFBhcmFtICkgXAorI2RlZmluZSBDYWxsV25kUHJvYzE2KCBmdW5jLCBkcywgaHduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSApIFwKICAgICBDYWxsVG8xNl9sb25nX3d3d2woIGZ1bmMsIGRzLCBod25kLCBtc2csIHdQYXJhbSwgbFBhcmFtICkKICNkZWZpbmUgQ2FsbFdvcmRCcmVha1Byb2MoIGZ1bmMsIGxwY2gsIGljaEN1cnJlbnQsIGNjaCwgY29kZSApIFwKICAgICBDYWxsVG8xNl93b3JkX2x3d3coIGZ1bmMsIENVUlJFTlRfRFMsIGxwY2gsIGljaEN1cnJlbnQsIGNjaCwgY29kZSApCkBAIC03Myw5ICs3Myw5IEBACiAvKiBMaXN0IG9mIHRoZSAzMi1iaXQgY2FsbGJhY2sgZnVuY3Rpb25zLiBUaGlzIGxpc3QgaXMgdXNlZCAgKi8KIC8qIGJ5IHRoZSBidWlsZCBwcm9ncmFtIHRvIGdlbmVyYXRlIHRoZSBmaWxlIGlmMTYzMi9jYWxsdG8zMi5TICovCiAKLWV4dGVybiBMT05HIENhbGxUbzMyXzAoIEZBUlBST0MgKTsKLWV4dGVybiBMT05HIENhbGxUbzMyXzMoIEZBUlBST0MsIERXT1JELCBEV09SRCwgRFdPUkQgKTsKLWV4dGVybiBMT05HIENhbGxUbzMyXzQoIEZBUlBST0MsIERXT1JELCBEV09SRCwgRFdPUkQsIERXT1JEICk7CitleHRlcm4gTE9ORyBDYWxsVG8zMl8wKCBGQVJQUk9DMzIgKTsKK2V4dGVybiBMT05HIENhbGxUbzMyXzMoIEZBUlBST0MzMiwgRFdPUkQsIERXT1JELCBEV09SRCApOworZXh0ZXJuIExPTkcgQ2FsbFRvMzJfNCggRkFSUFJPQzMyLCBEV09SRCwgRFdPUkQsIERXT1JELCBEV09SRCApOwogCiAjZGVmaW5lIENhbGxUYXNrU3RhcnQzMiggZnVuYyApIFwKICAgICBDYWxsVG8zMl8wKCBmdW5jICkKQEAgLTExMSwxMSArMTExLDE0IEBACiAgICAgKCpmdW5jKSggY29kZSwgd1BhcmFtLCBsUGFyYW0gKQogI2RlZmluZSBDYWxsVGltZUZ1bmNQcm9jKCBmdW5jLCBpZCwgbXNnLCBkd1VzZXIsIGR3MSwgZHcyICkgXAogICAgICgqZnVuYykoIGlkLCBtc2csIGR3VXNlciwgZHcxLCBkdzIgKQotI2RlZmluZSBDYWxsV25kUHJvYyggZnVuYywgZHMsIGh3bmQsIG1zZywgd1BhcmFtLCBsUGFyYW0gKSBcCisjZGVmaW5lIENhbGxXbmRQcm9jMTYoIGZ1bmMsIGRzLCBod25kLCBtc2csIHdQYXJhbSwgbFBhcmFtICkgXAorICAgICgqZnVuYykoIGh3bmQsIG1zZywgd1BhcmFtLCBsUGFyYW0gKQorI2RlZmluZSBDYWxsV25kUHJvYzMyKCBmdW5jLCBod25kLCBtc2csIHdQYXJhbSwgbFBhcmFtICkgXAogICAgICgqZnVuYykoIGh3bmQsIG1zZywgd1BhcmFtLCBsUGFyYW0gKQogI2RlZmluZSBDYWxsV29yZEJyZWFrUHJvYyggZnVuYywgbHBjaCwgaWNoQ3VycmVudCwgY2NoLCBjb2RlICkgXAogICAgICgqZnVuYykoIGxwY2gsIGljaEN1cnJlbnQsIGNjaCwgY29kZSApCiAKKwogI2VuZGlmICAvKiBXSU5FTElCICovCiAKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFzcy5oIGIvaW5jbHVkZS9jbGFzcy5oCmluZGV4IGYxMTAwODkuLjU5OWZiMjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhc3MuaAorKysgYi9pbmNsdWRlL2NsYXNzLmgKQEAgLTE3LDIyICsxNywyOSBAQAogICAgIFVJTlQzMiAgICAgICAgICAgbWFnaWM7ICAgICAgICAgLyogTWFnaWMgbnVtYmVyICovCiAgICAgVUlOVDMyICAgICAgICAgICBjV2luZG93czsgICAgICAvKiBDb3VudCBvZiBleGlzdGluZyB3aW5kb3dzICovCiAgICAgVUlOVDMyICAgICAgICAgICBzdHlsZTsgICAgICAgICAvKiBDbGFzcyBzdHlsZSAqLworICAgIFVJTlQzMiAgICAgICAgICAgZmxhZ3M7ICAgICAgICAgLyogQ2xhc3MgZmxhZ3MgKHNlZSBiZWxvdykgKi8KICAgICBXTkRQUk9DMTYgICAgICAgIGxwZm5XbmRQcm9jOyAgIC8qIDE2LWJpdCB3aW5kb3cgcHJvY2VkdXJlICovIAogICAgIElOVDMyICAgICAgICAgICAgY2JDbHNFeHRyYTsgICAgLyogQ2xhc3MgZXh0cmEgYnl0ZXMgKi8KICAgICBJTlQzMiAgICAgICAgICAgIGNiV25kRXh0cmE7ICAgIC8qIFdpbmRvdyBleHRyYSBieXRlcyAqLwotICAgIFNFR1BUUiAgICAgICAgICAgbHBzek1lbnVOYW1lOyAgLyogRGVmYXVsdCBtZW51IG5hbWUgKi8KLSAgICBIQU5ETEUxNiAgICAgICAgIGhJbnN0YW5jZTsgICAgIC8qIE1vZHVsZSB0aGF0IGNyZWF0ZWQgdGhlIHRhc2sgKi8KKyAgICBMUFNUUiAgICAgICAgICAgIG1lbnVOYW1lQTsgICAgIC8qIERlZmF1bHQgbWVudSBuYW1lIChBU0NJSSBzdHJpbmcpICovCisgICAgTFBXU1RSICAgICAgICAgICBtZW51TmFtZVc7ICAgICAvKiBEZWZhdWx0IG1lbnUgbmFtZSAoVW5pY29kZSkgKi8KKyAgICBISU5TVEFOQ0UzMiAgICAgIGhJbnN0YW5jZTsgICAgIC8qIE1vZHVsZSB0aGF0IGNyZWF0ZWQgdGhlIHRhc2sgKi8KICAgICBISUNPTjE2ICAgICAgICAgIGhJY29uOyAgICAgICAgIC8qIERlZmF1bHQgaWNvbiAqLworICAgIEhJQ09OMTYgICAgICAgICAgaEljb25TbTsgICAgICAgLyogRGVmYXVsdCBzbWFsbCBpY29uICovCiAgICAgSENVUlNPUjE2ICAgICAgICBoQ3Vyc29yOyAgICAgICAvKiBEZWZhdWx0IGN1cnNvciAqLwogICAgIEhCUlVTSDE2ICAgICAgICAgaGJyQmFja2dyb3VuZDsgLyogRGVmYXVsdCBiYWNrZ3JvdW5kICovCiAgICAgQVRPTSAgICAgICAgICAgICBhdG9tTmFtZTsgICAgICAvKiBOYW1lIG9mIHRoZSBjbGFzcyAqLwogICAgIEhBTkRMRTE2ICAgICAgICAgaGRjZTsgICAgICAgICAgLyogQ2xhc3MgRENFIChpZiBDU19DTEFTU0RDKSAqLwotICAgIFdPUkQgICAgICAgICAgICAgd0V4dHJhWzFdOyAgICAgLyogQ2xhc3MgZXh0cmEgYnl0ZXMgKi8KKyAgICBMT05HICAgICAgICAgICAgIHdFeHRyYVsxXTsgICAgIC8qIENsYXNzIGV4dHJhIGJ5dGVzICovCiB9IENMQVNTOwogCisvKiBDbGFzcyBmbGFncyAqLworI2RlZmluZSBDTEFTU19GTEFHX1VOSUNPREUgIDB4MDAwMSAgLyogV2luZG93IHByb2NlZHVyZSBleHBlY3RzIFVuaWNvZGUgKi8KKwogZXh0ZXJuIHZvaWQgQ0xBU1NfRHVtcENsYXNzKCBDTEFTUyAqY2xhc3MgKTsKIGV4dGVybiB2b2lkIENMQVNTX1dhbGtDbGFzc2VzKHZvaWQpOwogZXh0ZXJuIHZvaWQgQ0xBU1NfRnJlZU1vZHVsZUNsYXNzZXMoIEhNT0RVTEUgaE1vZHVsZSApOworZXh0ZXJuIENMQVNTICpDTEFTU19GaW5kQ2xhc3NCeUF0b20oIEFUT00gYXRvbSwgSElOU1RBTkNFMTYgaGluc3RhbmNlICk7CiBleHRlcm4gQ0xBU1MgKiBDTEFTU19GaW5kQ2xhc3NCeU5hbWUoIFNFR1BUUiBuYW1lLCBISU5TVEFOQ0UgaGluc3RhbmNlICk7CiAKICNlbmRpZiAgLyogQ0xBU1NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2xvci5oIGIvaW5jbHVkZS9jb2xvci5oCmluZGV4IDU0M2I0ZmYuLjYxNDg2ZDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29sb3IuaAorKysgYi9pbmNsdWRlL2NvbG9yLmgKQEAgLTMsNyArMyw3IEBACiAKICNpbmNsdWRlICJnZGkuaCIKIAotZXh0ZXJuIEhQQUxFVFRFIENPTE9SX0luaXQodm9pZCk7CitleHRlcm4gSFBBTEVUVEUxNiBDT0xPUl9Jbml0KHZvaWQpOwogZXh0ZXJuIGludCBDT0xPUl9Ub1BoeXNpY2FsKCBEQyAqZGMsIENPTE9SUkVGIGNvbG9yICk7CiBleHRlcm4gdm9pZCBDT0xPUl9TZXRNYXBwaW5nKCBEQyAqZGMsIEhBTkRMRSBtYXAsIEhBTkRMRSByZXZNYXAsIFdPUkQgc2l6ZSApOwogZXh0ZXJuIEJPT0wgQ09MT1JfSXNTb2xpZCggQ09MT1JSRUYgY29sb3IgKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29tYm8uaCBiL2luY2x1ZGUvY29tYm8uaAppbmRleCBkODliZDZlLi4wZTE3N2Y2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbWJvLmgKKysrIGIvaW5jbHVkZS9jb21iby5oCkBAIC00LDE2ICs0LDE2IEBACiAKIAogdHlwZWRlZiBzdHJ1Y3QgewotICBEV09SRCBkd1N0eWxlOwotICBEV09SRCBkd1N0YXRlOwotICBIV05EICBoV25kRWRpdDsKLSAgSFdORCAgaFduZExCb3g7Ci0gIFdPUkQgIExCb3hUb3A7Ci0gIEJPT0wgIERyb3BEb3duVmlzaWJsZTsKLSAgc2hvcnQgTGFzdFNlbDsKLSAgUkVDVCAgUmVjdEVkaXQ7Ci0gIFJFQ1QgIFJlY3RCdXR0b247Ci0gIEJPT0wgIGJSZWRyYXdGbGFnOworICBEV09SRCAgIGR3U3R5bGU7CisgIERXT1JEICAgZHdTdGF0ZTsKKyAgSFdORCAgICBoV25kRWRpdDsKKyAgSFdORCAgICBoV25kTEJveDsKKyAgV09SRCAgICBMQm94VG9wOworICBCT09MICAgIERyb3BEb3duVmlzaWJsZTsKKyAgc2hvcnQgICBMYXN0U2VsOworICBSRUNUMTYgIFJlY3RFZGl0OworICBSRUNUMTYgIFJlY3RCdXR0b247CisgIEJPT0wgICAgYlJlZHJhd0ZsYWc7CiB9IEhFQURDT01CTywqTFBIRUFEQ09NQk87CiAKIExSRVNVTFQgQ29tYm9Cb3hXbmRQcm9jKEhXTkQgaHduZCwgVUlOVCBtZXNzYWdlLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZGVza3RvcC5oIGIvaW5jbHVkZS9kZXNrdG9wLmgKaW5kZXggYmE5ODc2Yy4uNWMwNjYzNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kZXNrdG9wLmgKKysrIGIvaW5jbHVkZS9kZXNrdG9wLmgKQEAgLTEzLDcgKzEzLDcgQEAKIHsKICAgICBIQlJVU0ggICBoYnJ1c2hQYXR0ZXJuOwogICAgIEhCSVRNQVAgIGhiaXRtYXBXYWxsUGFwZXI7Ci0gICAgU0laRSAgICAgYml0bWFwU2l6ZTsKKyAgICBTSVpFMTYgICBiaXRtYXBTaXplOwogICAgIEJPT0wgICAgIGZUaWxlV2FsbFBhcGVyOwogfSBERVNLVE9QSU5GTzsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mb250LmggYi9pbmNsdWRlL2ZvbnQuaAppbmRleCA2YjJmOGM4Li44YThkYWU3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2ZvbnQuaAorKysgYi9pbmNsdWRlL2ZvbnQuaApAQCAtMjcsNyArMjcsNyBAQAogewogCVVJTlQJZ21CbGFja0JveFg7CiAJVUlOVAlnbUJsYWNrQm94WTsKLQlQT0lOVAlnbXB0R2x5cGhPcmlnaW47CisJUE9JTlQxNglnbXB0R2x5cGhPcmlnaW47CiAJaW50CWdtQ2VsbEluY1g7CiAJaW50CWdtQ2VsbEluY1k7CiB9IEdMWVBITUVUUklDUywqTFBHTFlQSE1FVFJJQ1M7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2dkaS5oIGIvaW5jbHVkZS9nZGkuaAppbmRleCA5NTgxYmI3Li45Njg0N2I5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2dkaS5oCisrKyBiL2luY2x1ZGUvZ2RpLmgKQEAgLTkwLDEzICs5MCwxMyBAQAogICAgIEhSR04gICAgICAgICAgaENsaXBSZ247ICAgICAvKiBDbGlwIHJlZ2lvbiAobWF5IGJlIDApICovCiAgICAgSFJHTiAgICAgICAgICBoVmlzUmduOyAgICAgIC8qIFZpc2libGUgcmVnaW9uIChtdXN0IG5ldmVyIGJlIDApICovCiAgICAgSFJHTiAgICAgICAgICBoR0NDbGlwUmduOyAgIC8qIEdDIGNsaXAgcmVnaW9uIChDbGlwUmduIEFORCBWaXNSZ24pICovCi0gICAgSFBFTiAgICAgICAgICBoUGVuOworICAgIEhQRU4xNiAgICAgICAgaFBlbjsKICAgICBIQlJVU0ggICAgICAgIGhCcnVzaDsKICAgICBIRk9OVCAgICAgICAgIGhGb250OwogICAgIEhCSVRNQVAgICAgICAgaEJpdG1hcDsKICAgICBIQklUTUFQICAgICAgIGhGaXJzdEJpdG1hcDsgLyogQml0bWFwIHNlbGVjdGVkIGF0IGNyZWF0aW9uIG9mIHRoZSBEQyAqLwogICAgIEhBTkRMRSAgICAgICAgaERldmljZTsKLSAgICBIUEFMRVRURSAgICAgIGhQYWxldHRlOworICAgIEhQQUxFVFRFMTYgICAgaFBhbGV0dGU7CiAKICAgICBXT1JEICAgICAgICAgIFJPUG1vZGU7CiAgICAgV09SRCAgICAgICAgICBwb2x5RmlsbE1vZGU7CkBAIC0yMTQsMTUgKzIxNCwxNSBAQAogI2RlZmluZSBTVE9DS19CTEFDS19CUlVTSCAgICAgICAgICgoSEJSVVNIKShGSVJTVF9TVE9DS19IQU5ETEUrQkxBQ0tfQlJVU0gpKQogI2RlZmluZSBTVE9DS19OVUxMX0JSVVNIICAgICAgICAgICgoSEJSVVNIKShGSVJTVF9TVE9DS19IQU5ETEUrTlVMTF9CUlVTSCkpCiAjZGVmaW5lIFNUT0NLX0hPTExPV19CUlVTSCAgICAgICAgKChIQlJVU0gpKEZJUlNUX1NUT0NLX0hBTkRMRStIT0xMT1dfQlJVU0gpKQotI2RlZmluZSBTVE9DS19XSElURV9QRU4JICAgICAgICAgICgoSFBFTikoRklSU1RfU1RPQ0tfSEFORExFK1dISVRFX1BFTikpCi0jZGVmaW5lIFNUT0NLX0JMQUNLX1BFTgkgICAgICAgICAgKChIUEVOKShGSVJTVF9TVE9DS19IQU5ETEUrQkxBQ0tfUEVOKSkKLSNkZWZpbmUgU1RPQ0tfTlVMTF9QRU4JICAgICAgICAgICgoSFBFTikoRklSU1RfU1RPQ0tfSEFORExFK05VTExfUEVOKSkKKyNkZWZpbmUgU1RPQ0tfV0hJVEVfUEVOCSAgICAgICAgICAoKEhQRU4xNikoRklSU1RfU1RPQ0tfSEFORExFK1dISVRFX1BFTikpCisjZGVmaW5lIFNUT0NLX0JMQUNLX1BFTgkgICAgICAgICAgKChIUEVOMTYpKEZJUlNUX1NUT0NLX0hBTkRMRStCTEFDS19QRU4pKQorI2RlZmluZSBTVE9DS19OVUxMX1BFTgkgICAgICAgICAgKChIUEVOMTYpKEZJUlNUX1NUT0NLX0hBTkRMRStOVUxMX1BFTikpCiAjZGVmaW5lIFNUT0NLX09FTV9GSVhFRF9GT05UICAgICAgKChIRk9OVCkoRklSU1RfU1RPQ0tfSEFORExFK09FTV9GSVhFRF9GT05UKSkKICNkZWZpbmUgU1RPQ0tfQU5TSV9GSVhFRF9GT05UICAgICAoKEhGT05UKShGSVJTVF9TVE9DS19IQU5ETEUrQU5TSV9GSVhFRF9GT05UKSkKICNkZWZpbmUgU1RPQ0tfQU5TSV9WQVJfRk9OVCAgICAgICAoKEhGT05UKShGSVJTVF9TVE9DS19IQU5ETEUrQU5TSV9WQVJfRk9OVCkpCiAjZGVmaW5lIFNUT0NLX1NZU1RFTV9GT05UICAgICAgICAgKChIRk9OVCkoRklSU1RfU1RPQ0tfSEFORExFK1NZU1RFTV9GT05UKSkKICNkZWZpbmUgU1RPQ0tfREVWSUNFX0RFRkFVTFRfRk9OVCAoKEhGT05UKShGSVJTVF9TVE9DS19IQU5ETEUrREVWSUNFX0RFRkFVTFRfRk9OVCkpCi0jZGVmaW5lIFNUT0NLX0RFRkFVTFRfUEFMRVRURSAgICAgKChIUEFMRVRURSkoRklSU1RfU1RPQ0tfSEFORExFK0RFRkFVTFRfUEFMRVRURSkpCisjZGVmaW5lIFNUT0NLX0RFRkFVTFRfUEFMRVRURSAgICAgKChIUEFMRVRURTE2KShGSVJTVF9TVE9DS19IQU5ETEUrREVGQVVMVF9QQUxFVFRFKSkKICNkZWZpbmUgU1RPQ0tfU1lTVEVNX0ZJWEVEX0ZPTlQgICAoKEhGT05UKShGSVJTVF9TVE9DS19IQU5ETEUrU1lTVEVNX0ZJWEVEX0ZPTlQpKQogCiAjZGVmaW5lIEZJUlNUX1NUT0NLX0ZPTlQgICAgICAgICAgU1RPQ0tfT0VNX0ZJWEVEX0ZPTlQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZ3JhcGhpY3MuaCBiL2luY2x1ZGUvZ3JhcGhpY3MuaAppbmRleCAyZmJhNDIyLi5hOWQ0NDIzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2dyYXBoaWNzLmgKKysrIGIvaW5jbHVkZS9ncmFwaGljcy5oCkBAIC04LDcgKzgsNyBAQAogI2lmbmRlZiBfX1dJTkVfR1JBUEhJQ1NfSAogI2RlZmluZSBfX1dJTkVfR1JBUEhJQ1NfSAogCi1leHRlcm4gdm9pZCBHUkFQSF9EcmF3UmVsaWVmUmVjdCggSERDIGhkYywgUkVDVCAqcmVjdCwgaW50IGhpZ2hsaWdodF9zaXplLAorZXh0ZXJuIHZvaWQgR1JBUEhfRHJhd1JlbGllZlJlY3QoIEhEQyBoZGMsIFJFQ1QxNiAqcmVjdCwgaW50IGhpZ2hsaWdodF9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaGFkb3dfc2l6ZSwgQk9PTCBwcmVzc2VkICk7CiBleHRlcm4gQk9PTCBHUkFQSF9EcmF3Qml0bWFwKCBIREMgaGRjLCBIQklUTUFQIGhiaXRtYXAsIGludCB4ZGVzdCwgaW50IHlkZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhzcmMsIGludCB5c3JjLCBpbnQgd2lkdGgsIGludCBoZWlnaHQgKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvaGFuZGxlMzIuaCBiL2luY2x1ZGUvaGFuZGxlMzIuaAppbmRleCA2ZWJiYWEyLi45MzE2MmNkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2hhbmRsZTMyLmgKKysrIGIvaW5jbHVkZS9oYW5kbGUzMi5oCkBAIC0xLDcgKzEsNyBAQAogI2lmbmRlZiBfX1dJTkVfSEFORExFMzJfSAogI2RlZmluZSBfX1dJTkVfSEFORExFMzJfSAogCi0jaW5jbHVkZSA8bWFsbG9jLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSAid2ludHlwZXMuaCIKIAogLyogVGhlIF8qX09CSkVDVCBzdHJ1Y3R1cmVzIGNvbnRhaW4gaW5mb3JtYXRpb24gbmVlZGVkIGFib3V0IGVhY2gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvaGVhcC5oIGIvaW5jbHVkZS9oZWFwLmgKaW5kZXggZTU0MTgxNS4uZWU1NWY5YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9oZWFwLmgKKysrIGIvaW5jbHVkZS9oZWFwLmgKQEAgLTExLDUgKzExLDIzIEBACiAjaW5jbHVkZSAid2lubnQuaCIKIAogZXh0ZXJuIEhBTkRMRTMyIFN5c3RlbUhlYXA7CitleHRlcm4gSEFORExFMzIgU2VncHRySGVhcDsKKworZXh0ZXJuIGludCBIRUFQX0lzSW5zaWRlSGVhcCggSEFORExFMzIgaGVhcCwgRFdPUkQgZmxhZ3MsIExQQ1ZPSUQgcHRyICk7CitleHRlcm4gU0VHUFRSIEhFQVBfR2V0U2VncHRyKCBIQU5ETEUzMiBoZWFwLCBEV09SRCBmbGFncywgTFBDVk9JRCBwdHIgKTsKK2V4dGVybiBMUFNUUiBIRUFQX3N0cmR1cEEoIEhBTkRMRTMyIGhlYXAsIERXT1JEIGZsYWdzLCBMUENTVFIgc3RyICk7CisKKy8qIFNFR1BUUiBoZWxwZXIgbWFjcm9zICovCisKKyNkZWZpbmUgU0VHUFRSX0FMTE9DKHNpemUpIFwKKyAgICAgICAgIChIZWFwQWxsb2MoIFNlZ3B0ckhlYXAsIDAsIChzaXplKSApKQorI2RlZmluZSBTRUdQVFJfTkVXKHR5cGUpIFwKKyAgICAgICAgICgodHlwZSAqKUhlYXBBbGxvYyggU2VncHRySGVhcCwgMCwgc2l6ZW9mKHR5cGUpICkpCisjZGVmaW5lIFNFR1BUUl9TVFJEVVAoc3RyKSBcCisgICAgICAgICAoSElXT1JEKHN0cikgPyBIRUFQX3N0cmR1cEEoIFNlZ3B0ckhlYXAsIDAsIChzdHIpICkgOiAoTFBTVFIpKHN0cikpCisjZGVmaW5lIFNFR1BUUl9HRVQocHRyKSBcCisgICAgICAgICAoSElXT1JEKHB0cikgPyBIRUFQX0dldFNlZ3B0ciggU2VncHRySGVhcCwgMCwgKHB0cikgKSA6IChTRUdQVFIpKHB0cikpCisjZGVmaW5lIFNFR1BUUl9GUkVFKHB0cikgXAorICAgICAgICAgKEhJV09SRChwdHIpID8gSGVhcEZyZWUoIFNlZ3B0ckhlYXAsIDAsIChwdHIpICkgOiAwKQogCiAjZW5kaWYgIC8qIF9fV0lORV9IRUFQX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGlzdGJveC5oIGIvaW5jbHVkZS9saXN0Ym94LmgKaW5kZXggZWJkOWM5ZS4uMTc5YmFkZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saXN0Ym94LmgKKysrIGIvaW5jbHVkZS9saXN0Ym94LmgKQEAgLTUsNyArNSw3IEBACiB0eXBlZGVmIHN0cnVjdCB0YWdMSVNUU1RSVUNUIHsKICAgICAgICAgTUVBU1VSRUlURU1TVFJVQ1QgbWlzOwogICAgICAgICBVSU5UICAgICAgICAgICAgaXRlbVN0YXRlOwotICAgICAgICBSRUNUICAgICAgICAgICAgaXRlbVJlY3Q7CisgICAgICAgIFJFQ1QxNiAgICAgICAgICBpdGVtUmVjdDsKIAlIQU5ETEUJCWhEYXRhOwogCWNoYXIgICAgICAgICAgICAqaXRlbVRleHQ7CiAJc3RydWN0IHRhZ0xJU1RTVFJVQ1QgKmxwTmV4dDsKQEAgLTYwLDEyICs2MCwxMiBAQAogZXh0ZXJuIGludCBMaXN0Qm94U2V0U2VsKExQSEVBRExJU1QgbHBobCwgV09SRCB3SW5kZXgsIFdPUkQgc3RhdGUpOwogZXh0ZXJuIGludCBMaXN0Qm94R2V0U2VsKExQSEVBRExJU1QgbHBobCwgV09SRCB3SW5kZXgpOwogZXh0ZXJuIExPTkcgTGlzdEJveERpcmVjdG9yeShMUEhFQURMSVNUIGxwaGwsIFVJTlQgYXR0cmliLCBMUENTVFIgZmlsZXNwZWMpOwotZXh0ZXJuIGludCBMaXN0Qm94R2V0SXRlbVJlY3QoTFBIRUFETElTVCBscGhsLCBXT1JEIHdJbmRleCwgTFBSRUNUIHJlY3QpOworZXh0ZXJuIGludCBMaXN0Qm94R2V0SXRlbVJlY3QoTFBIRUFETElTVCBscGhsLCBXT1JEIHdJbmRleCwgTFBSRUNUMTYgcmVjdCk7CiBleHRlcm4gaW50IExpc3RCb3hTZXRJdGVtSGVpZ2h0KExQSEVBRExJU1QgbHBobCwgV09SRCB3SW5kZXgsIGxvbmcgaGVpZ2h0KTsKIGV4dGVybiBpbnQgTGlzdEJveEZpbmROZXh0TWF0Y2goTFBIRUFETElTVCBscGhsLCBXT1JEIHdDaGFyKTsKIAogZXh0ZXJuIHZvaWQgTGlzdEJveERyYXdJdGVtIChIV05EIGh3bmQsIExQSEVBRExJU1QgbHBobCwgSERDIGhkYywKLQkJCSAgICAgTFBMSVNUU1RSVUNUIGxwbHMsIFJFQ1QgKnJlY3QsIFdPUkQgaXRlbUFjdGlvbiwKKwkJCSAgICAgTFBMSVNUU1RSVUNUIGxwbHMsIFJFQ1QxNiAqcmVjdCwgV09SRCBpdGVtQWN0aW9uLAogCQkJICAgICBXT1JEIGl0ZW1TdGF0ZSk7CiBleHRlcm4gaW50IExpc3RCb3hGaW5kTW91c2UoTFBIRUFETElTVCBscGhsLCBpbnQgWCwgaW50IFkpOwogZXh0ZXJuIHZvaWQgTGlzdEJveEFza01lYXN1cmUoTFBIRUFETElTVCBscGhsLCBMUExJU1RTVFJVQ1QgbHBscyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21kaS5oIGIvaW5jbHVkZS9tZGkuaAppbmRleCBhZGRlMGIwLi4yZmFjMGQ4IDEwMDY0NAotLS0gYS9pbmNsdWRlL21kaS5oCisrKyBiL2luY2x1ZGUvbWRpLmgKQEAgLTMxLDE3ICszMSwxOCBAQAogCiB0eXBlZGVmIHN0cnVjdCAKIHsKLSAgICBXT1JEICAgbkFjdGl2ZUNoaWxkcmVuOwotICAgIEhXTkQgICBmbGFnQ2hpbGRNYXhpbWl6ZWQ7Ci0gICAgSFdORCAgIGh3bmRBY3RpdmVDaGlsZDsKLSAgICBITUVOVSAgaFdpbmRvd01lbnU7Ci0gICAgV09SRCAgIGlkRmlyc3RDaGlsZDsKLSAgICBIQU5ETEUgaEZyYW1lVGl0bGU7Ci0gICAgV09SRCAgIHNiTmVlZFVwZGF0ZTsKLSAgICBXT1JEICAgc2JSZWNhbGM7Ci0gICAgSEJJVE1BUCBvYm1DbG9zZTsKLSAgICBIQklUTUFQIG9ibVJlc3RvcmU7Ci0gICAgSFdORCAgIHNlbGY7CisgICAgV09SRCAgIAluQWN0aXZlQ2hpbGRyZW47CisgICAgSFdORCAgIAlod25kQ2hpbGRNYXhpbWl6ZWQ7CisgICAgSFdORCAgIAlod25kQWN0aXZlQ2hpbGQ7CisgICAgSE1FTlUgIAloV2luZG93TWVudTsKKyAgICBXT1JEICAgCWlkRmlyc3RDaGlsZDsKKyAgICBXT1JECW5Ub3RhbENyZWF0ZWQ7CisgICAgSEFORExFIAloRnJhbWVUaXRsZTsKKyAgICBXT1JEICAgCXNiTmVlZFVwZGF0ZTsKKyAgICBXT1JEICAgCXNiUmVjYWxjOworICAgIEhCSVRNQVAgCW9ibUNsb3NlOworICAgIEhCSVRNQVAgCW9ibVJlc3RvcmU7CisgICAgSFdORCAgIAlzZWxmOwogfSBNRElDTElFTlRJTkZPOwogCiAjZW5kaWYgLyogTURJX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVudS5oIGIvaW5jbHVkZS9tZW51LmgKaW5kZXggZGFiZGU0NS4uZDJlOTBiZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZW51LmgKKysrIGIvaW5jbHVkZS9tZW51LmgKQEAgLTEyLDkgKzEyLDkgQEAKIGV4dGVybiBITUVOVSBNRU5VX0dldERlZlN5c01lbnUodm9pZCk7CiBleHRlcm4gVUlOVCBNRU5VX0dldE1lbnVCYXJIZWlnaHQoIEhXTkQgaHduZCwgVUlOVCBtZW51YmFyV2lkdGgsCiAJCQkJICAgaW50IG9yZ1gsIGludCBvcmdZICk7Ci1leHRlcm4gdm9pZCBNRU5VX1RyYWNrTW91c2VNZW51QmFyKCBIV05EIGh3bmQsIFBPSU5UIHB0ICk7CitleHRlcm4gdm9pZCBNRU5VX1RyYWNrTW91c2VNZW51QmFyKCBIV05EIGh3bmQsIFBPSU5UMTYgcHQgKTsKIGV4dGVybiB2b2lkIE1FTlVfVHJhY2tLYmRNZW51QmFyKCBXTkQqLCBVSU5UIHdQYXJhbSwgSU5UIHZrZXkpOwotZXh0ZXJuIFVJTlQgTUVOVV9EcmF3TWVudUJhciggSERDIGhEQywgTFBSRUNUIGxwcmVjdCwKK2V4dGVybiBVSU5UIE1FTlVfRHJhd01lbnVCYXIoIEhEQyBoREMsIExQUkVDVDE2IGxwcmVjdCwKIAkJCSAgICAgIEhXTkQgaHduZCwgQk9PTCBzdXBwcmVzc19kcmF3ICk7CiBleHRlcm4gTFJFU1VMVCBQb3B1cE1lbnVXbmRQcm9jKEhXTkQgaHduZCxVSU5UIG1lc3NhZ2UsV1BBUkFNIHdQYXJhbSxMUEFSQU0gbFBhcmFtICk7CiAKQEAgLTIyLDcgKzIyLDcgQEAKIHsKICAgICBXT1JECWl0ZW1fZmxhZ3M7ICAgIC8qIEl0ZW0gZmxhZ3MgKi8KICAgICBVSU5UCWl0ZW1faWQ7ICAgICAgIC8qIEl0ZW0gb3IgcG9wdXAgaWQgKi8KLSAgICBSRUNUCXJlY3Q7ICAgICAgICAgIC8qIEl0ZW0gYXJlYSAocmVsYXRpdmUgdG8gbWVudSB3aW5kb3cpICovCisgICAgUkVDVDE2ICAgICAgcmVjdDsgICAgICAgICAgLyogSXRlbSBhcmVhIChyZWxhdGl2ZSB0byBtZW51IHdpbmRvdykgKi8KICAgICBXT1JEICAgICAgICB4VGFiOyAgICAgICAgICAvKiBYIHBvc2l0aW9uIG9mIHRleHQgYWZ0ZXIgVGFiICovCiAgICAgSEJJVE1BUAloQ2hlY2tCaXQ7ICAgICAvKiBCaXRtYXAgZm9yIGNoZWNrZWQgaXRlbSAqLwogICAgIEhCSVRNQVAJaFVuQ2hlY2tCaXQ7ICAgLyogQml0bWFwIGZvciB1bmNoZWNrZWQgaXRlbSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZXRhZmlsZS5oIGIvaW5jbHVkZS9tZXRhZmlsZS5oCmluZGV4IGM4M2FmY2IuLjc5NTE4MzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWV0YWZpbGUuaAorKysgYi9pbmNsdWRlL21ldGFmaWxlLmgKQEAgLTI4LDEwICsyOCwxMCBAQAogCQkgICBzaG9ydCBwYXJhbTYsIHNob3J0IHBhcmFtNywgc2hvcnQgcGFyYW04KTsKIEJPT0wgTUZfQ3JlYXRlQnJ1c2hJbmRpcmVjdChEQyAqZGMsIEhCUlVTSCBoQnJ1c2gsIExPR0JSVVNIICpsb2dicnVzaCk7CiBCT09MIE1GX0NyZWF0ZVBhdHRlcm5CcnVzaChEQyAqZGMsIEhCUlVTSCBoQnJ1c2gsIExPR0JSVVNIICpsb2dicnVzaCk7Ci1CT09MIE1GX0NyZWF0ZVBlbkluZGlyZWN0KERDICpkYywgSFBFTiBoUGVuLCBMT0dQRU4gKmxvZ3Blbik7CitCT09MIE1GX0NyZWF0ZVBlbkluZGlyZWN0KERDICpkYywgSFBFTjE2IGhQZW4sIExPR1BFTiAqbG9ncGVuKTsKIEJPT0wgTUZfQ3JlYXRlRm9udEluZGlyZWN0KERDICpkYywgSEZPTlQgaEZvbnQsIExPR0ZPTlQgKmxvZ2ZvbnQpOwotQk9PTCBNRl9UZXh0T3V0KERDICpkYywgc2hvcnQgeCwgc2hvcnQgeSwgTFBTVFIgc3RyLCBzaG9ydCBjb3VudCk7Ci1CT09MIE1GX01ldGFQb2x5KERDICpkYywgc2hvcnQgZnVuYywgTFBQT0lOVCBwdCwgc2hvcnQgY291bnQpOworQk9PTCBNRl9UZXh0T3V0KERDICpkYywgc2hvcnQgeCwgc2hvcnQgeSwgTFBDU1RSIHN0ciwgc2hvcnQgY291bnQpOworQk9PTCBNRl9NZXRhUG9seShEQyAqZGMsIHNob3J0IGZ1bmMsIExQUE9JTlQxNiBwdCwgc2hvcnQgY291bnQpOwogQk9PTCBNRl9CaXRCbHQoREMgKmRjRGVzdCwgc2hvcnQgeERlc3QsIHNob3J0IHlEZXN0LCBzaG9ydCB3aWR0aCwKIAkgICAgICAgc2hvcnQgaGVpZ2h0LCBIREMgaGRjU3JjLCBzaG9ydCB4U3JjLCBzaG9ydCB5U3JjLCBEV09SRCByb3ApOwogQk9PTCBNRl9TdHJldGNoQmx0KERDICpkY0Rlc3QsIHNob3J0IHhEZXN0LCBzaG9ydCB5RGVzdCwgc2hvcnQgd2lkdGhEZXN0LApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tbXN5c3RlbS5oIGIvaW5jbHVkZS9tbXN5c3RlbS5oCmluZGV4IGEwOGQxMmIuLjQ1ZmI5MmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbW1zeXN0ZW0uaAorKysgYi9pbmNsdWRlL21tc3lzdGVtLmgKQEAgLTEyNDcsMTYgKzEyNDcsMTYgQEAKIHR5cGVkZWYgc3RydWN0IHsKIAlEV09SRCAgIGR3Q2FsbGJhY2s7CiAjaWZkZWYgTUNJX1VTRV9PRkZFWFQKLQlQT0lOVCAgIHB0T2Zmc2V0OwotCVBPSU5UICAgcHRFeHRlbnQ7CisJUE9JTlQxNiBwdE9mZnNldDsKKwlQT0lOVDE2IHB0RXh0ZW50OwogI2Vsc2UgICAvKiBpZmRlZiBNQ0lfVVNFX09GRkVYVCAqLwotCVJFQ1QgICAgcmM7CisJUkVDVDE2ICByYzsKICNlbmRpZiAgLyogaWZkZWYgTUNJX1VTRV9PRkZFWFQgKi8KIH0gTUNJX0FOSU1fUkVDVF9QQVJNUywgKkxQTUNJX0FOSU1fUkVDVF9QQVJNUzsKIAogdHlwZWRlZiBzdHJ1Y3QgewogCURXT1JEICAgZHdDYWxsYmFjazsKLQlSRUNUICAgIHJjOworCVJFQ1QxNiAgcmM7CiAJSERDICAgICBoREM7CiB9IE1DSV9BTklNX1VQREFURV9QQVJNUywgKkxQTUNJX0FOSU1fVVBEQVRFX1BBUk1TOwogCkBAIC0xMzE1LDIzICsxMzE1LDIzIEBACiB0eXBlZGVmIHN0cnVjdCB7CiAJRFdPUkQgICBkd0NhbGxiYWNrOwogI2lmZGVmIE1DSV9VU0VfT0ZGRVhUCi0JUE9JTlQgICBwdE9mZnNldDsKLQlQT0lOVCAgIHB0RXh0ZW50OworCVBPSU5UMTYgcHRPZmZzZXQ7CisJUE9JTlQxNiBwdEV4dGVudDsKICNlbHNlICAgLyogaWZkZWYgTUNJX1VTRV9PRkZFWFQgKi8KLQlSRUNUICAgIHJjOworCVJFQ1QxNiAgcmM7CiAjZW5kaWYgIC8qIGlmZGVmIE1DSV9VU0VfT0ZGRVhUICovCiB9IE1DSV9PVkxZX1JFQ1RfUEFSTVMsICpMUE1DSV9PVkxZX1JFQ1RfUEFSTVM7CiAKIHR5cGVkZWYgc3RydWN0IHsKIAlEV09SRCAgIGR3Q2FsbGJhY2s7CiAJTFBDU1RSICBscGZpbGVuYW1lOwotCVJFQ1QgICAgcmM7CisJUkVDVDE2ICByYzsKIH0gTUNJX09WTFlfU0FWRV9QQVJNUywgKkxQTUNJX09WTFlfU0FWRV9QQVJNUzsKIAogdHlwZWRlZiBzdHJ1Y3QgewogCURXT1JEICAgZHdDYWxsYmFjazsKIAlMUENTVFIgIGxwZmlsZW5hbWU7Ci0JUkVDVCAgICByYzsKKwlSRUNUMTYgIHJjOwogfSBNQ0lfT1ZMWV9MT0FEX1BBUk1TLCAqTFBNQ0lfT1ZMWV9MT0FEX1BBUk1TOwogCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbW9kdWxlLmggYi9pbmNsdWRlL21vZHVsZS5oCmluZGV4IGU2Y2E3NjMuLmM4NjdmNDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbW9kdWxlLmgKKysrIGIvaW5jbHVkZS9tb2R1bGUuaApAQCAtMTI2LDggKzEyNiw4IEBACiBleHRlcm4gV09SRCBNT0RVTEVfR2V0T3JkaW5hbCggSE1PRFVMRSBoTW9kdWxlLCBjb25zdCBjaGFyICpuYW1lICk7CiBleHRlcm4gU0VHUFRSIE1PRFVMRV9HZXRFbnRyeVBvaW50KCBITU9EVUxFIGhNb2R1bGUsIFdPUkQgb3JkaW5hbCApOwogZXh0ZXJuIEJPT0wgTU9EVUxFX1NldEVudHJ5UG9pbnQoIEhNT0RVTEUgaE1vZHVsZSwgV09SRCBvcmRpbmFsLCBXT1JEIG9mZnNldCApOwotZXh0ZXJuIEZBUlBST0MgTU9EVUxFX0dldFduZFByb2NFbnRyeTE2KCBjb25zdCBjaGFyICpuYW1lICk7Ci1leHRlcm4gRkFSUFJPQyBNT0RVTEVfR2V0V25kUHJvY0VudHJ5MzIoIGNvbnN0IGNoYXIgKm5hbWUgKTsKK2V4dGVybiBGQVJQUk9DMTYgTU9EVUxFX0dldFduZFByb2NFbnRyeTE2KCBjb25zdCBjaGFyICpuYW1lICk7CitleHRlcm4gRkFSUFJPQzMyIE1PRFVMRV9HZXRXbmRQcm9jRW50cnkzMiggY29uc3QgY2hhciAqbmFtZSApOwogCiAvKiBidWlsdGluLmMgKi8KIGV4dGVybiBCT09MIEJVSUxUSU5fSW5pdCh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbm9uY2xpZW50LmggYi9pbmNsdWRlL25vbmNsaWVudC5oCmluZGV4IDQ5ZmEyMDYuLjZiNGJmZjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbm9uY2xpZW50LmgKKysrIGIvaW5jbHVkZS9ub25jbGllbnQuaApAQCAtOSwxNyArOSwxNiBAQAogCiAjaW5jbHVkZSAid2luLmgiCiAKLWV4dGVybiB2b2lkIE5DX0dldEluc2lkZVJlY3QoIEhXTkQgaHduZCwgUkVDVCAqcmVjdCApOwotZXh0ZXJuIHZvaWQgTkNfR2V0TWluTWF4SW5mbyggSFdORCBod25kLCBQT0lOVCAqbWF4U2l6ZSwgUE9JTlQgKm1heFBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBPSU5UICptaW5UcmFjaywgUE9JTlQgKm1heFRyYWNrICk7CitleHRlcm4gdm9pZCBOQ19HZXRNaW5NYXhJbmZvKCBIV05EIGh3bmQsIFBPSU5UMTYgKm1heFNpemUsIFBPSU5UMTYgKm1heFBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBPSU5UMTYgKm1pblRyYWNrLCBQT0lOVDE2ICptYXhUcmFjayApOwogZXh0ZXJuIHZvaWQgTkNfRG9OQ1BhaW50KCBIV05EIGh3bmQsIEhSR04gY2xpcCwgQk9PTCBzdXBwcmVzc19tZW51cGFpbnQgKTsKIGV4dGVybiBMT05HIE5DX0hhbmRsZU5DUGFpbnQoIEhXTkQgaHduZCAsIEhSR04gY2xpcCk7CiBleHRlcm4gTE9ORyBOQ19IYW5kbGVOQ0FjdGl2YXRlKCBIV05EIGh3bmQsIFdQQVJBTSB3UGFyYW0gKTsKLWV4dGVybiBMT05HIE5DX0hhbmRsZU5DQ2FsY1NpemUoIEhXTkQgaHduZCwgTkNDQUxDU0laRV9QQVJBTVMgKnBhcmFtcyApOwotZXh0ZXJuIExPTkcgTkNfSGFuZGxlTkNIaXRUZXN0KCBIV05EIGh3bmQsIFBPSU5UIHB0ICk7CitleHRlcm4gTE9ORyBOQ19IYW5kbGVOQ0NhbGNTaXplKCBIV05EIGh3bmQsIE5DQ0FMQ1NJWkVfUEFSQU1TMTYgKnBhcmFtcyApOworZXh0ZXJuIExPTkcgTkNfSGFuZGxlTkNIaXRUZXN0KCBIV05EIGh3bmQsIFBPSU5UMTYgcHQgKTsKIGV4dGVybiBMT05HIE5DX0hhbmRsZU5DTEJ1dHRvbkRvd24oIEhXTkQgaHduZCwgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSApOwogZXh0ZXJuIExPTkcgTkNfSGFuZGxlTkNMQnV0dG9uRGJsQ2xrKCBXTkQgKnBXbmQsIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOwotZXh0ZXJuIExPTkcgTkNfSGFuZGxlU3lzQ29tbWFuZCggSFdORCBod25kLCBXUEFSQU0gd1BhcmFtLCBQT0lOVCBwdCApOworZXh0ZXJuIExPTkcgTkNfSGFuZGxlU3lzQ29tbWFuZCggSFdORCBod25kLCBXUEFSQU0gd1BhcmFtLCBQT0lOVDE2IHB0ICk7CiBleHRlcm4gTE9ORyBOQ19IYW5kbGVTZXRDdXJzb3IoIEhXTkQgaHduZCwgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSApOwogCiAjZW5kaWYgLyogX19XSU5FX05PTkNMSUVOVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL29sZS5oIGIvaW5jbHVkZS9vbGUuaAppbmRleCBiOTIwNjQwLi45Y2MzMTBhIDEwMDY0NAotLS0gYS9pbmNsdWRlL29sZS5oCisrKyBiL2luY2x1ZGUvb2xlLmgKQEAgLTE1OSw3ICsxNTksNyBAQAogCU9MRVNUQVRVUwkoKlNhdmUpKExQT0xFU0VSVkVSRE9DKTsKIAlPTEVTVEFUVVMJKCpDbG9zZSkoTFBPTEVTRVJWRVJET0MpOwogCU9MRVNUQVRVUwkoKlNldEhvc3ROYW1lcykoTFBPTEVTRVJWRVJET0MsT0xFX0xQQ1NUUixPTEVfTFBDU1RSKTsKLQlPTEVTVEFUVVMJKCpTZXREb2NEaW1lbnNpb25zKShMUE9MRVNFUlZFUkRPQyxMUFJFQ1QpOworCU9MRVNUQVRVUwkoKlNldERvY0RpbWVuc2lvbnMpKExQT0xFU0VSVkVSRE9DLExQUkVDVDE2KTsKIAlPTEVTVEFUVVMJKCpHZXRPYmplY3QpKExQT0xFU0VSVkVSRE9DLE9MRV9MUENTVFIsTFBPTEVPQkpFQ1QqLExQT0xFQ0xJRU5UKTsKIAlPTEVTVEFUVVMJKCpSZWxlYXNlKShMUE9MRVNFUlZFUkRPQyk7CiAJT0xFU1RBVFVTCSgqU2V0Q29sb3JTY2hlbWUpKExQT0xFU0VSVkVSRE9DLExQTE9HUEFMRVRURSk7CkBAIC0yMDQsNyArMjA0LDcgQEAKIAlPTEVTVEFUVVMJKCpHZXREYXRhKShMUE9MRU9CSkVDVCxPTEVDTElQRk9STUFULEhBTkRMRSAqKTsKIAlPTEVTVEFUVVMJKCpTZXREYXRhKShMUE9MRU9CSkVDVCxPTEVDTElQRk9STUFULEhBTkRMRSk7CiAJT0xFU1RBVFVTCSgqU2V0VGFyZ2V0RGV2aWNlKShMUE9MRU9CSkVDVCxIR0xPQkFMKTsKLQlPTEVTVEFUVVMJKCpTZXRCb3VuZHMpKExQT0xFT0JKRUNULExQUkVDVCk7CisJT0xFU1RBVFVTCSgqU2V0Qm91bmRzKShMUE9MRU9CSkVDVCxMUFJFQ1QxNik7CiAJT0xFU1RBVFVTCSgqRW51bUZvcm1hdHMpKExQT0xFT0JKRUNULE9MRUNMSVBGT1JNQVQpOwogCU9MRVNUQVRVUwkoKlNldENvbG9yU2NoZW1lKShMUE9MRU9CSkVDVCxMUExPR1BBTEVUVEUpOwogCU9MRVNUQVRVUwkoKkRlbGV0ZSkoTFBPTEVPQkpFQ1QpOwpAQCAtMjE0LDggKzIxNCw4IEBACiAJT0xFU1RBVFVTCSgqQ29weUZyb21MaW5rKShMUE9MRU9CSkVDVCxMUE9MRUNMSUVOVCxMSENMSUVOVERPQyxPTEVfTFBDU1RSLExQT0xFT0JKRUNUICopOwogCU9MRVNUQVRVUwkoKkVxdWFsKShMUE9MRU9CSkVDVCxMUE9MRU9CSkVDVCk7CiAJT0xFU1RBVFVTCSgqQ29weVRvQ2xpcEJvYXJkKShMUE9MRU9CSkVDVCk7Ci0JT0xFU1RBVFVTCSgqRHJhdykoTFBPTEVPQkpFQ1QsSERDLExQUkVDVCxMUFJFQ1QsSERDKTsKLQlPTEVTVEFUVVMJKCpBY3RpdmF0ZSkoTFBPTEVPQkpFQ1QsVUlOVCxCT09MLEJPT0wsSFdORCxMUFJFQ1QpOworCU9MRVNUQVRVUwkoKkRyYXcpKExQT0xFT0JKRUNULEhEQyxMUFJFQ1QxNixMUFJFQ1QxNixIREMpOworCU9MRVNUQVRVUwkoKkFjdGl2YXRlKShMUE9MRU9CSkVDVCxVSU5ULEJPT0wsQk9PTCxIV05ELExQUkVDVDE2KTsKIAlPTEVTVEFUVVMJKCpFeGVjdXRlKShMUE9MRU9CSkVDVCxIR0xPQkFMLFVJTlQpOwogCU9MRVNUQVRVUwkoKkNsb3NlKShMUE9MRU9CSkVDVCk7CiAJT0xFU1RBVFVTCSgqVXBkYXRlKShMUE9MRU9CSkVDVCk7CkBAIC0yMjYsNyArMjI2LDcgQEAKIAlPTEVTVEFUVVMJKCpSZW5hbWUpKExQT0xFT0JKRUNULE9MRV9MUENTVFIpOwogCU9MRVNUQVRVUwkoKlF1ZXJ5TmFtZSkoTFBPTEVPQkpFQ1QsTFBTVFIsTFBVSU5UMTYpOwogCU9MRVNUQVRVUwkoKlF1ZXJ5VHlwZSkoTFBPTEVPQkpFQ1QsTFBMT05HKTsKLQlPTEVTVEFUVVMJKCpRdWVyeUJvdW5kcykoTFBPTEVPQkpFQ1QsTFBSRUNUKTsKKwlPTEVTVEFUVVMJKCpRdWVyeUJvdW5kcykoTFBPTEVPQkpFQ1QsTFBSRUNUMTYpOwogCU9MRVNUQVRVUwkoKlF1ZXJ5U2l6ZSkoTFBPTEVPQkpFQ1QsTFBEV09SRCk7CiAJT0xFU1RBVFVTCSgqUXVlcnlPcGVuKShMUE9MRU9CSkVDVCk7CiAJT0xFU1RBVFVTCSgqUXVlcnlPdXRPZkRhdGUpKExQT0xFT0JKRUNUKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcGVuLmggYi9pbmNsdWRlL3Blbi5oCmluZGV4IDFmYzE2MGMuLjcwMTZkMjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcGVuLmgKKysrIGIvaW5jbHVkZS9wZW4uaApAQCAtMjUsNiArMjUsNiBAQAogI2VuZGlmCiAKIGV4dGVybiBpbnQgUEVOX0dldE9iamVjdCggUEVOT0JKICogcGVuLCBpbnQgY291bnQsIExQU1RSIGJ1ZmZlciApOwotZXh0ZXJuIEhQRU4gUEVOX1NlbGVjdE9iamVjdCggREMgKiBkYywgSFBFTiBocGVuLCBQRU5PQkogKiBwZW4gKTsKK2V4dGVybiBIUEVOMTYgUEVOX1NlbGVjdE9iamVjdCggREMgKiBkYywgSFBFTjE2IGhwZW4sIFBFTk9CSiAqIHBlbiApOwogCiAjZW5kaWYgIC8qIF9fV0lORV9QRU5fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yZWdmdW5jLmggYi9pbmNsdWRlL3JlZ2Z1bmMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE5MTcwMC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3JlZ2Z1bmMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qICRJZCQKLSAqLwotCi0jaWZuZGVmIFJFR0ZVTkNfSAotI2RlZmluZSBSRUdGVU5DX0gKLQotI2luY2x1ZGUgIndpbmUuaCIKLSNpbmNsdWRlICJzdGFja2ZyYW1lLmgiCi0KLSNkZWZpbmUgX0NPTlRFWFQgKChzdHJ1Y3Qgc2lnY29udGV4dF9zdHJ1Y3QgKikgQ1VSUkVOVF9TVEFDSzE2LT5hcmdzKQotI2RlZmluZSBfQVgJKF9DT05URVhULT5zY19lYXgpCi0jZGVmaW5lIF9CWAkoX0NPTlRFWFQtPnNjX2VieCkKLSNkZWZpbmUgX0NYCShfQ09OVEVYVC0+c2NfZWN4KQotI2RlZmluZSBfRFgJKF9DT05URVhULT5zY19lZHgpCi0jZGVmaW5lIF9TSQkoX0NPTlRFWFQtPnNjX2VzaSkKLSNkZWZpbmUgX0RJCShfQ09OVEVYVC0+c2NfZWRpKQotI2RlZmluZSBfRFMJKF9DT05URVhULT5zY19kcykKLSNkZWZpbmUgX0VTCShfQ09OVEVYVC0+c2NfZXMpCi0KLWV4dGVybiB2b2lkIFJldHVybkZyb21SZWdpc3RlckZ1bmModm9pZCk7Ci0KLSNlbmRpZiAvKiBSRUdGVU5DX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcmVnaW9uLmggYi9pbmNsdWRlL3JlZ2lvbi5oCmluZGV4IGU4ZjYyNjEuLjU1MmY1YzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcmVnaW9uLmgKKysrIGIvaW5jbHVkZS9yZWdpb24uaApAQCAtMTgsNiArMTgsNiBAQAogCiAKIGV4dGVybiBCT09MIFJFR0lPTl9EZWxldGVPYmplY3QoIEhSR04gaHJnbiwgUkdOT0JKICogb2JqICk7Ci1leHRlcm4gQk9PTCBSRUdJT05fRnJhbWVSZ24oSFJHTiBkZXN0LEhSR04gc3JjLGludCB4LGludCB5KTsKK2V4dGVybiBCT09MIFJFR0lPTl9GcmFtZVJnbiggSFJHTiBkZXN0LCBIUkdOIHNyYywgSU5UMzIgeCwgSU5UMzIgeSApOwogCiAjZW5kaWYgIC8qIF9fV0lORV9SRUdJT05fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yZWxheTMyLmggYi9pbmNsdWRlL3JlbGF5MzIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWViMjY5Mi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3JlbGF5MzIuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBSZWxheTMyIGRlZmluaXRpb25zCi0gKgotICogQ29weXJpZ2h0IDE5OTUgTWFydGluIHZvbiBMb2V3aXMKLSAqLwotCi0jaWZuZGVmIF9fV0lORV9SRUxBWTMyX0gKLSNkZWZpbmUgX19XSU5FX1JFTEFZMzJfSAotCi0jaW5jbHVkZSAic3RydWN0MzIuaCIKLQotdHlwZWRlZiBzdHJ1Y3QgdGFnV05EQ0xBU1NBewotCVVJTlQJc3R5bGU7Ci0JV05EUFJPQwlscGZuV25kUHJvYzsKLQlpbnQJCWNiQ2xzRXh0cmE7Ci0JaW50CQljYlduZEV4dHJhOwotCURXT1JECWhJbnN0YW5jZTsKLQlEV09SRAloSWNvbjsKLQlEV09SRAloQ3Vyc29yOwotCURXT1JECWhickJhY2tncm91bmQ7Ci0JY2hhcioJbHBzek1lbnVOYW1lOwotCWNoYXIqCWxwc3pDbGFzc05hbWU7Ci19V05EQ0xBU1NBOwotCi1BVE9NIFVTRVIzMl9SZWdpc3RlckNsYXNzQShXTkRDTEFTU0EgKik7Ci1MUkVTVUxUIFVTRVIzMl9EZWZXaW5kb3dQcm9jQShEV09SRCBod25kLERXT1JEIG1zZyxEV09SRCB3UGFyYW0sRFdPUkQgbFBhcmFtKTsKLUJPT0wgVVNFUjMyX0dldE1lc3NhZ2VBKE1TRzMyKiBscG1zZyxEV09SRCBod25kLERXT1JEIG1pbixEV09SRCBtYXgpOwotSERDIFVTRVIzMl9CZWdpblBhaW50KERXT1JEIGh3bmQsUEFJTlRTVFJVQ1QzMiAqbHBwcyk7Ci1CT09MIFVTRVIzMl9FbmRQYWludChEV09SRCBod25kLFBBSU5UU1RSVUNUMzIgKmxwcHMpOwotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2Nyb2xsLmggYi9pbmNsdWRlL3Njcm9sbC5oCmluZGV4IDY4MWQ0ZDEuLjg0NDVhOTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2Nyb2xsLmgKKysrIGIvaW5jbHVkZS9zY3JvbGwuaApAQCAtMjIsNiArMjIsNiBAQAogZXh0ZXJuIExPTkcgU2Nyb2xsQmFyV25kUHJvYyggSFdORCBod25kLCBXT1JEIHVNc2csIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOwogZXh0ZXJuIHZvaWQgU0NST0xMX0RyYXdTY3JvbGxCYXIoIEhXTkQgaHduZCwgSERDIGhkYywgaW50IG5CYXIgKTsKIGV4dGVybiB2b2lkIFNDUk9MTF9IYW5kbGVTY3JvbGxFdmVudCggSFdORCBod25kLCBpbnQgbkJhciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV09SRCBtc2csIFBPSU5UIHB0KTsgICAgICAgLyogc2Nyb2xsLmMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV09SRCBtc2csIFBPSU5UMTYgcHQgKTsKIAogI2VuZGlmICAvKiBTQ1JPTExfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zaGVsbC5oIGIvaW5jbHVkZS9zaGVsbC5oCmluZGV4IGQyOGNhYmEuLjA0NWQyYTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2hlbGwuaAorKysgYi9pbmNsdWRlL3NoZWxsLmgKQEAgLTI2LDcgKzI2LDcgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgeyAJICAgLyogc3RydWN0dXJlIGZvciBkcm9wcGVkIGZpbGVzICovIAogCVdPUkQJCXdTaXplOwotCVBPSU5UCQlwdE1vdXNlUG9zOyAgIAorCVBPSU5UMTYJCXB0TW91c2VQb3M7ICAgCiAJQk9PTAkJZkluTm9uQ2xpZW50QXJlYTsKIAkvKiBtZW1vcnkgYmxvY2sgd2l0aCBmaWxlbmFtZXMgZm9sbG93cyAqLyAgICAgCiB9IERST1BGSUxFU1RSVUNULCAqTFBEUk9QRklMRVNUUlVDVDsgCmRpZmYgLS1naXQgYS9pbmNsdWRlL3N0cmluZzMyLmggYi9pbmNsdWRlL3N0cmluZzMyLmgKaW5kZXggZWFhZGVmZC4uMTQzMWE1OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zdHJpbmczMi5oCisrKyBiL2luY2x1ZGUvc3RyaW5nMzIuaApAQCAtMTUsNiArMTUsNyBAQAogdm9pZAlTVFJJTkczMl9BbnNpVG9VbmkoTFBXU1RSIGRlc3QsTFBDU1RSIHNyYyk7CiBMUFNUUglTVFJJTkczMl9EdXBVbmlUb0Fuc2koTFBDV1NUUiBzcmMpOwogTFBXU1RSCVNUUklORzMyX0R1cEFuc2lUb1VuaShMUENTVFIgc3JjKTsKK0xQV1NUUiAgU1RSSU5HMzJfbHN0cmNweVcoTFBXU1RSIGRzdCwgTFBDV1NUUiBzcmMpOwogaW50CVNUUklORzMyX2xzdHJjbXBuVyhMUENXU1RSIGEsTFBDV1NUUiBiLERXT1JEIGxlbik7CiBpbnQJU1RSSU5HMzJfbHN0cmNtcG5pVyhMUENXU1RSIGEsTFBDV1NUUiBiLERXT1JEIGxlbik7CiBEV09SRAlTVFJJTkczMl9sc3RybGVuVyhMUENXU1RSKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc3RydWN0MzIuaCBiL2luY2x1ZGUvc3RydWN0MzIuaAppbmRleCBlYTViNzViLi5hMWMxZTM2IDEwMDY0NAotLS0gYS9pbmNsdWRlL3N0cnVjdDMyLmgKKysrIGIvaW5jbHVkZS9zdHJ1Y3QzMi5oCkBAIC03LDQ0ICs3LDIzIEBACiAjcHJhZ21hIHBhY2soMSkKICNlbmRpZgogCi10eXBlZGVmIHN0cnVjdCB0YWdSRUNUMzIKLXsKLQlMT05HIGxlZnQ7Ci0JTE9ORyB0b3A7Ci0JTE9ORyByaWdodDsKLQlMT05HIGJvdHRvbTsKLX0gUkVDVDMyOwordm9pZCBTVFJVQ1QzMl9SRUNUMzJ0bzE2KGNvbnN0IFJFQ1QzMiosUkVDVDE2Kik7Cit2b2lkIFNUUlVDVDMyX1JFQ1QxNnRvMzIoY29uc3QgUkVDVDE2KixSRUNUMzIqKTsKK3ZvaWQgU1RSVUNUMzJfUE9JTlQzMnRvMTYoY29uc3QgUE9JTlQzMiosUE9JTlQxNiopOwordm9pZCBTVFJVQ1QzMl9QT0lOVDE2dG8zMihjb25zdCBQT0lOVDE2KixQT0lOVDMyKik7Cit2b2lkIFNUUlVDVDMyX1NJWkUxNnRvMzIoY29uc3QgU0laRTE2KiwgU0laRTMyKik7CiAKLXZvaWQgU1RSVUNUMzJfUkVDVDMydG8xNihjb25zdCBSRUNUMzIqLFJFQ1QqKTsKLXZvaWQgU1RSVUNUMzJfUkVDVDE2dG8zMihjb25zdCBSRUNUKixSRUNUMzIqKTsKK2V4dGVybiB2b2lkIFNUUlVDVDMyX01JTk1BWElORk8zMnRvMTYoIGNvbnN0IE1JTk1BWElORk8zMiosIE1JTk1BWElORk8xNiogKTsKK2V4dGVybiB2b2lkIFNUUlVDVDMyX01JTk1BWElORk8xNnRvMzIoIGNvbnN0IE1JTk1BWElORk8xNiosIE1JTk1BWElORk8zMiogKTsKK2V4dGVybiB2b2lkIFNUUlVDVDMyX1dJTkRPV1BPUzMydG8xNiggY29uc3QgV0lORE9XUE9TMzIqLCBXSU5ET1dQT1MxNiogKTsKK2V4dGVybiB2b2lkIFNUUlVDVDMyX1dJTkRPV1BPUzE2dG8zMiggY29uc3QgV0lORE9XUE9TMTYqLCBXSU5ET1dQT1MzMiogKTsKK2V4dGVybiB2b2lkIFNUUlVDVDMyX05DQ0FMQ1NJWkUzMnRvMTZGbGF0KCBjb25zdCBOQ0NBTENTSVpFX1BBUkFNUzMyICpmcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5DQ0FMQ1NJWkVfUEFSQU1TMTYgKnRvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2YWxpZFJlY3RzICk7CitleHRlcm4gdm9pZCBTVFJVQ1QzMl9OQ0NBTENTSVpFMTZ0bzMyRmxhdCggY29uc3QgTkNDQUxDU0laRV9QQVJBTVMxNiogZnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQ0NBTENTSVpFX1BBUkFNUzMyKiB0bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmFsaWRSZWN0cyApOwogCi10eXBlZGVmIHN0cnVjdCB0YWdQT0lOVDMyCi17Ci0JTE9ORyB4OwotCUxPTkcgeTsKLX0gUE9JTlQzMjsKLQotdHlwZWRlZiBzdHJ1Y3QgdGFnU0laRTMyCi17Ci0gICAgICAgIExPTkcgY3g7Ci0gICAgICAgIExPTkcgY3k7Ci19IFNJWkUzMjsKLSAgCi12b2lkIFNUUlVDVDMyX1BPSU5UMzJ0bzE2KGNvbnN0IFBPSU5UMzIqLFBPSU5UKik7Ci12b2lkIFNUUlVDVDMyX1BPSU5UMTZ0bzMyKGNvbnN0IFBPSU5UKixQT0lOVDMyKik7Ci12b2lkIFNUUlVDVDMyX1NJWkUxNnRvMzIoY29uc3QgU0laRSogcDE2LCBTSVpFMzIqIHAzMik7Ci0KLXR5cGVkZWYgc3RydWN0IHRhZ01JTk1BWElORk8zMgotewotCVBPSU5UMzIgcHRSZXNlcnZlZDsKLQlQT0lOVDMyIHB0TWF4U2l6ZTsKLQlQT0lOVDMyIHB0TWF4UG9zaXRpb247Ci0JUE9JTlQzMiBwdE1pblRyYWNrU2l6ZTsKLQlQT0lOVDMyIHB0TWF4VHJhY2tTaXplOwotfSBNSU5NQVhJTkZPMzI7Ci0KLXZvaWQgU1RSVUNUMzJfTUlOTUFYSU5GTzMydG8xNihjb25zdCBNSU5NQVhJTkZPMzIqLE1JTk1BWElORk8qKTsKLXZvaWQgU1RSVUNUMzJfTUlOTUFYSU5GTzE2dG8zMihjb25zdCBNSU5NQVhJTkZPKixNSU5NQVhJTkZPMzIqKTsKIAogdHlwZWRlZiBzdHJ1Y3QgewogCURXT1JEIHN0eWxlOwpAQCAtNzksNjAgKzU4LDggQEAKIHZvaWQgU1RSVUNUMzJfTVNHMTZ0bzMyKE1TRyAqbXNnMTYsTVNHMzIgKm1zZzMyKTsKIHZvaWQgU1RSVUNUMzJfTVNHMzJ0bzE2KE1TRzMyICptc2czMixNU0cgKm1zZzE2KTsKIAotdHlwZWRlZiBzdHJ1Y3QgdGFnUEFJTlRTVFJVQ1QzMgotewotCURXT1JEIGhkYzsKLQlEV09SRCBmRXJhc2U7Ci0JUkVDVDMyIHJjUGFpbnQ7Ci0JRFdPUkQgZlJlc3RvcmU7Ci0JRFdPUkQgZkluY1VwZGF0ZTsKLQlCWVRFIHJnYlJlc2VydmVkWzMyXTsKLX0gUEFJTlRTVFJVQ1QzMjsKLQotdHlwZWRlZiBzdHJ1Y3QgdGFnV0lORE9XUE9TMzIKLXsKLQlEV09SRAlod25kOwotCURXT1JECWh3bmRJbnNlcnRBZnRlcjsKLQlMT05HCXg7Ci0JTE9ORwl5OwotCUxPTkcJY3g7Ci0JTE9ORwljeTsKLQlEV09SRAlmbGFnczsKLX0gV0lORE9XUE9TMzI7Ci0KLXZvaWQgU1RSVUNUMzJfV0lORE9XUE9TMzJ0bzE2KGNvbnN0IFdJTkRPV1BPUzMyKixXSU5ET1dQT1MqKTsKLXZvaWQgU1RSVUNUMzJfV0lORE9XUE9TMTZ0bzMyKGNvbnN0IFdJTkRPV1BPUyosV0lORE9XUE9TMzIqKTsKLQotdHlwZWRlZiBzdHJ1Y3QgdGFnTkNDQUxDU0laRV9QQVJBTVMzMgotewotCVJFQ1QzMglyZ3JjWzNdOwotCVdJTkRPV1BPUzMyCSpscHBvczsKLX0gTkNDQUxDU0laRV9QQVJBTVMzMjsKLQotdm9pZCBTVFJVQ1QzMl9OQ0NBTENTSVpFMzJ0bzE2RmxhdChjb25zdCBOQ0NBTENTSVpFX1BBUkFNUzMyKiwKLQlOQ0NBTENTSVpFX1BBUkFNUyopOwotdm9pZCBTVFJVQ1QzMl9OQ0NBTENTSVpFMTZ0bzMyRmxhdChjb25zdCBOQ0NBTENTSVpFX1BBUkFNUyogZnJvbSwKLQlOQ0NBTENTSVpFX1BBUkFNUzMyKiB0byk7Ci0KLXR5cGVkZWYgc3RydWN0IHRhZ0NSRUFURVNUUlVDVDMyCi17Ci0JRFdPUkQJbHBDcmVhdGVQYXJhbXM7Ci0JRFdPUkQJaEluc3RhbmNlOwotCURXT1JECWhNZW51OwotCURXT1JECWh3bmRQYXJlbnQ7Ci0JTE9ORwljeTsKLQlMT05HCWN4OwotCUxPTkcJeTsKLQlMT05HCXg7Ci0JTE9ORwlzdHlsZTsKLQlMUFNUUglscHN6TmFtZTsKLQlMUFNUUglscHN6Q2xhc3M7Ci0JRFdPUkQJZHdFeFN0eWxlOwotfSBDUkVBVEVTVFJVQ1QzMjsKLXR5cGVkZWYgQ1JFQVRFU1RSVUNUMzIJQ1JFQVRFU1RSVUNUQTsKLQotdm9pZCBTVFJVQ1QzMl9DUkVBVEVTVFJVQ1QzMnRvMTYoY29uc3QgQ1JFQVRFU1RSVUNUMzIqLENSRUFURVNUUlVDVCopOwotdm9pZCBTVFJVQ1QzMl9DUkVBVEVTVFJVQ1QxNnRvMzIoY29uc3QgQ1JFQVRFU1RSVUNUKixDUkVBVEVTVFJVQ1QzMiopOwordm9pZCBTVFJVQ1QzMl9DUkVBVEVTVFJVQ1QzMkF0bzE2KGNvbnN0IENSRUFURVNUUlVDVDMyQSosQ1JFQVRFU1RSVUNUMTYqKTsKK3ZvaWQgU1RSVUNUMzJfQ1JFQVRFU1RSVUNUMTZ0bzMyQShjb25zdCBDUkVBVEVTVFJVQ1QxNiosQ1JFQVRFU1RSVUNUMzJBKik7CiAKIHR5cGVkZWYgc3RydWN0IHsKIAlCWVRFICAgYldpZHRoOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zeXNjb2xvci5oIGIvaW5jbHVkZS9zeXNjb2xvci5oCmluZGV4IGU1NDQxY2UuLmMxZjc1YzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc3lzY29sb3IuaAorKysgYi9pbmNsdWRlL3N5c2NvbG9yLmgKQEAgLTE3LDkgKzE3LDkgQEAKICAgICBIQlJVU0ggaGJydXNoSW5hY3RpdmVDYXB0aW9uOyAgLyogQ09MT1JfSU5BQ1RJVkVDQVBUSU9OICAgICAqLwogICAgIEhCUlVTSCBoYnJ1c2hNZW51OyAgICAgICAgICAgICAvKiBDT0xPUl9NRU5VICAgICAgICAgICAgICAgICovCiAgICAgSEJSVVNIIGhicnVzaFdpbmRvdzsgICAgICAgICAgIC8qIENPTE9SX1dJTkRPVyAgICAgICAgICAgICAgKi8KLSAgICBIUEVOIGhwZW5XaW5kb3dGcmFtZTsgICAgICAgICAgLyogQ09MT1JfV0lORE9XRlJBTUUgICAgICAgICAqLworICAgIEhQRU4xNiBocGVuV2luZG93RnJhbWU7ICAgICAgICAvKiBDT0xPUl9XSU5ET1dGUkFNRSAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENPTE9SX01FTlVURVhUICAgICAgICAgICAgKi8KLSAgICBIUEVOIGhwZW5XaW5kb3dUZXh0OyAgICAgICAgICAgLyogQ09MT1JfV0lORE9XVEVYVCAgICAgICAgICAqLworICAgIEhQRU4xNiBocGVuV2luZG93VGV4dDsgICAgICAgICAvKiBDT0xPUl9XSU5ET1dURVhUICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENPTE9SX0NBUFRJT05URVhUICAgICAgICAgKi8KICAgICBIQlJVU0ggaGJydXNoQWN0aXZlQm9yZGVyOyAgICAgLyogQ09MT1JfQUNUSVZFQk9SREVSICAgICAgICAqLwogICAgIEhCUlVTSCBoYnJ1c2hJbmFjdGl2ZUJvcmRlcjsgICAvKiBDT0xPUl9JTkFDVElWRUJPUkRFUiAgICAgICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3dpbi5oIGIvaW5jbHVkZS93aW4uaAppbmRleCA5NzM4ODgwLi42ZTVlYzQ0IDEwMDY0NAotLS0gYS9pbmNsdWRlL3dpbi5oCisrKyBiL2luY2x1ZGUvd2luLmgKQEAgLTIyLDcgKzIyLDcgQEAKICNkZWZpbmUgSUNPTlRJVExFX0NMQVNTX05BTUUgIiMzMjc3MiIgIC8qIEljb25UaXRsZSAqLwogCiAjZGVmaW5lIFBPUFVQTUVOVV9DTEFTU19BVE9NIE1BS0VJTlRBVE9NKDMyNzY4KSAgLyogUG9wdXBNZW51ICovCi0jZGVmaW5lIERFU0tUT1BfQ0xBU1NfQVRPTSAgIE1BS0VJTlRBVE9NKDMyNzY5KSAgLyogRGVza3RvcCAqLworI2RlZmluZSBERVNLVE9QX0NMQVNTX0FUT00gICAoKEFUT00pMzI3NjkpICAgICAgIC8qIERlc2t0b3AgKi8KICNkZWZpbmUgRElBTE9HX0NMQVNTX0FUT00gICAgTUFLRUlOVEFUT00oMzI3NzApICAvKiBEaWFsb2cgKi8KICNkZWZpbmUgV0lOU1dJVENIX0NMQVNTX0FUT00gTUFLRUlOVEFUT00oMzI3NzEpICAvKiBXaW5Td2l0Y2ggKi8KICNkZWZpbmUgSUNPTlRJVExFX0NMQVNTX0FUT00gTUFLRUlOVEFUT00oMzI3NzIpICAvKiBJY29uVGl0bGUgKi8KQEAgLTM1LDEzICszNSwxMyBAQAogICAgIHN0cnVjdCB0YWdXTkQgKm93bmVyOyAgICAgICAgIC8qIFdpbmRvdyBvd25lciAqLwogICAgIENMQVNTICAgICAgICAgKmNsYXNzOyAgICAgICAgIC8qIFdpbmRvdyBjbGFzcyAqLwogICAgIERXT1JEICAgICAgICAgIGR3TWFnaWM7ICAgICAgIC8qIE1hZ2ljIG51bWJlciAobXVzdCBiZSBXTkRfTUFHSUMpICovCi0gICAgSFdORCAgICAgICAgICAgaHduZFNlbGY7ICAgICAgLyogSGFuZGxlIG9mIHRoaXMgd2luZG93ICovCi0gICAgSEFORExFICAgICAgICAgaEluc3RhbmNlOyAgICAgLyogV2luZG93IGhJbnN0YW5jZSAoZnJvbSBDcmVhdGVXaW5kb3cpICovCi0gICAgUkVDVCAgICAgICAgICAgcmVjdENsaWVudDsgICAgLyogQ2xpZW50IGFyZWEgcmVsLiB0byBwYXJlbnQgY2xpZW50IGFyZWEgKi8KLSAgICBSRUNUICAgICAgICAgICByZWN0V2luZG93OyAgICAvKiBXaG9sZSB3aW5kb3cgcmVsLiB0byBwYXJlbnQgY2xpZW50IGFyZWEgKi8KLSAgICBSRUNUICAgICAgICAgICByZWN0Tm9ybWFsOyAgICAvKiBXaW5kb3cgcmVjdC4gd2hlbiBpbiBub3JtYWwgc3RhdGUgKi8KLSAgICBQT0lOVCAgICAgICAgICBwdEljb25Qb3M7ICAgICAvKiBJY29uIHBvc2l0aW9uICovCi0gICAgUE9JTlQgICAgICAgICAgcHRNYXhQb3M7ICAgICAgLyogTWF4aW1pemVkIHdpbmRvdyBwb3NpdGlvbiAqLworICAgIEhXTkQxNiAgICAgICAgIGh3bmRTZWxmOyAgICAgIC8qIEhhbmRsZSBvZiB0aGlzIHdpbmRvdyAqLworICAgIEhJTlNUQU5DRTE2ICAgIGhJbnN0YW5jZTsgICAgIC8qIFdpbmRvdyBoSW5zdGFuY2UgKGZyb20gQ3JlYXRlV2luZG93KSAqLworICAgIFJFQ1QxNiAgICAgICAgIHJlY3RDbGllbnQ7ICAgIC8qIENsaWVudCBhcmVhIHJlbC4gdG8gcGFyZW50IGNsaWVudCBhcmVhICovCisgICAgUkVDVDE2ICAgICAgICAgcmVjdFdpbmRvdzsgICAgLyogV2hvbGUgd2luZG93IHJlbC4gdG8gcGFyZW50IGNsaWVudCBhcmVhICovCisgICAgUkVDVDE2ICAgICAgICAgcmVjdE5vcm1hbDsgICAgLyogV2luZG93IHJlY3QuIHdoZW4gaW4gbm9ybWFsIHN0YXRlICovCisgICAgUE9JTlQxNiAgICAgICAgcHRJY29uUG9zOyAgICAgLyogSWNvbiBwb3NpdGlvbiAqLworICAgIFBPSU5UMTYgICAgICAgIHB0TWF4UG9zOyAgICAgIC8qIE1heGltaXplZCB3aW5kb3cgcG9zaXRpb24gKi8KICAgICBIR0xPQkFMICAgICAgICBobWVtVGFza1E7ICAgICAvKiBUYXNrIHF1ZXVlIGdsb2JhbCBtZW1vcnkgaGFuZGxlICovCiAgICAgSFJHTiAgICAgICAgICAgaHJnblVwZGF0ZTsgICAgLyogVXBkYXRlIHJlZ2lvbiAqLwogICAgIEhXTkQgICAgICAgICAgIGh3bmRMYXN0QWN0aXZlOy8qIExhc3QgYWN0aXZlIHBvcHVwIGh3bmQgKi8KQEAgLTU3LDcgKzU3LDcgQEAKICAgICBXaW5kb3cgICAgICAgICB3aW5kb3c7ICAgICAgICAvKiBYIHdpbmRvdyAob25seSBmb3IgdG9wLWxldmVsIHdpbmRvd3MpICovCiAgICAgSE1FTlUgICAgICAgICAgaFN5c01lbnU7ICAgICAgLyogd2luZG93J3MgY29weSBvZiBTeXN0ZW0gTWVudSAqLwogICAgIEhBTkRMRSAgICAgICAgIGhQcm9wOyAgICAgICAgIC8qIEhhbmRsZSBvZiBQcm9wZXJ0aWVzIExpc3QgKi8KLSAgICBXT1JEICAgICAgICAgICB3RXh0cmFbMV07ICAgICAvKiBXaW5kb3cgZXh0cmEgYnl0ZXMgKi8KKyAgICBEV09SRCAgICAgICAgICB3RXh0cmFbMV07ICAgICAvKiBXaW5kb3cgZXh0cmEgYnl0ZXMgKi8KIH0gV05EOwogCiAgIC8qIFdORCBmbGFncyB2YWx1ZXMgKi8KQEAgLTY3LDkgKzY3LDEwIEBACiAjZGVmaW5lIFdJTl9SRVNUT1JFX01BWCAgICAgICAgMHgwMDA4IC8qIE1heGltaXplIHdoZW4gcmVzdG9yaW5nICovCiAjZGVmaW5lIFdJTl9JTlRFUk5BTF9QQUlOVCAgICAgMHgwMDEwIC8qIEludGVybmFsIFdNX1BBSU5UIG1lc3NhZ2UgcGVuZGluZyAqLwogI2RlZmluZSBXSU5fTk9fUkVEUkFXICAgICAgICAgIDB4MDAyMCAvKiBXTV9TRVRSRURSQVcgY2FsbGVkIGZvciB0aGlzIHdpbmRvdyAqLwotI2RlZmluZSBXSU5fR09UX1NJWkVNU0cgICAgICAgIDB4MDA0MCAvKiBXTV9TSVpFIGhhcyBiZWVuIHNlbnQgdG8gdGhlIHdpbmRvdyAqLworI2RlZmluZSBXSU5fTkVFRF9TSVpFICAgICAgICAgIDB4MDA0MCAvKiBJbnRlcm5hbCBXTV9TSVpFIGlzIG5lZWRlZCAqLwogI2RlZmluZSBXSU5fTkNBQ1RJVkFURUQgICAgICAgIDB4MDA4MCAvKiBsYXN0IFdNX05DQUNUSVZBVEUgd2FzIHBvc2l0aXZlICovCiAjZGVmaW5lIFdJTl9NQU5BR0VEICAgICAgICAgICAgMHgwMTAwIC8qIFdpbmRvdyBtYW5hZ2VkIGJ5IHRoZSBYIHdtICovCisjZGVmaW5lIFdJTl9VTklDT0RFICAgICAgICAgICAgMHgwMjAwIC8qIFdpbmRvdyBwcm9jZWR1cmUgZXhwZWN0cyBVbmljb2RlICovCiAKICAgLyogV2luZG93IGZ1bmN0aW9ucyAqLwogZXh0ZXJuIFdORCAqV0lOX0ZpbmRXbmRQdHIoIEhXTkQgaHduZCApOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS93aW5iYXNlLmggYi9pbmNsdWRlL3dpbmJhc2UuaAppbmRleCAwZWIwNWY1Li40ODdlZWVlIDEwMDY0NAotLS0gYS9pbmNsdWRlL3dpbmJhc2UuaAorKysgYi9pbmNsdWRlL3dpbmJhc2UuaApAQCAtMTE5LDcgKzExOSw3IEBACiAjZGVmaW5lIEdNRU1fRklYRUQgICAgICAgICAgMHgwMDAwCiAjZGVmaW5lIEdNRU1fTU9WRUFCTEUgCSAgICAweDAwMDIKIAotSEFDQ0VMIExvYWRBY2NlbGVyYXRvcnNBKCAgIEhJTlNUQU5DRSwgY29uc3QgY2hhciAqKTsKK0hBQ0NFTDMyIExvYWRBY2NlbGVyYXRvcnNBKCAgIEhJTlNUQU5DRSwgY29uc3QgY2hhciAqKTsKICNkZWZpbmUgRnJlZU1vZHVsZShoTGliTW9kdWxlKSBGcmVlTGlicmFyeSgoaExpYk1vZHVsZSkpCiAjZGVmaW5lIE1ha2VQcm9jSW5zdGFuY2UobHBQcm9jLGhJbnN0YW5jZSkgKGxwUHJvYykKICNkZWZpbmUgRnJlZVByb2NJbnN0YW5jZShscFByb2MpIChscFByb2MpCmRpZmYgLS1naXQgYS9pbmNsdWRlL3dpbmRvd3MuaCBiL2luY2x1ZGUvd2luZG93cy5oCmluZGV4IGQ0OGNkNmIuLmEwNzg3MTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvd2luZG93cy5oCisrKyBiL2luY2x1ZGUvd2luZG93cy5oCkBAIC0xMCwyMCArMTAsODMgQEAKICNwcmFnbWEgcGFjaygxKQogI2VuZGlmCiAKLSNpZm5kZWYgV0lORUxJQjMyCi0jZGVmaW5lIE1BS0VQT0lOVChsKSAoKigoUE9JTlQgKikmKGwpKSkKLSNlbmRpZgotdHlwZWRlZiBzdHJ1Y3QgeyBJTlQgY3gsY3k7IH0gU0laRSwgKkxQU0laRTsKLXR5cGVkZWYgc3RydWN0IHsgSU5UIHgseTsgfSBQT0lOVCwgKlBQT0lOVCwgKk5QUE9JTlQsICpMUFBPSU5UOwotdHlwZWRlZiBzdHJ1Y3QgeyBJTlQgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tOyB9IFJFQ1QsICpMUFJFQ1Q7CisvKiBUaGUgU0laRSBzdHJ1Y3R1cmUgKi8KIAotI2lmZGVmIFdJTkVMSUIzMgotI2RlZmluZSBNQUtFV1BBUkFNKGxvdywgaGlnaCkgKChMT05HKSgoKFdPUkQpKGxvdykpIHwgXAotCQkJICAgICAgKCgoRFdPUkQpKChXT1JEKShoaWdoKSkpIDw8IDE2KSkpCit0eXBlZGVmIHN0cnVjdAoreworICAgIElOVDE2ICBjeDsKKyAgICBJTlQxNiAgY3k7Cit9IFNJWkUxNiwgKkxQU0laRTE2OworCit0eXBlZGVmIHN0cnVjdAoreworICAgIElOVDMyICBjeDsKKyAgICBJTlQzMiAgY3k7Cit9IFNJWkUzMiwgKkxQU0laRTMyOworCitERUNMX1dJTkVMSUJfVFlQRShTSVpFKTsKK0RFQ0xfV0lORUxJQl9UWVBFKExQU0laRSk7CisKKyNkZWZpbmUgQ09OVl9TSVpFMTZUTzMyKHMxNixzMzIpIFwKKyAgICAgICAgICAgICgoczMyKS0+Y3ggPSAoSU5UMzIpKHMxNiktPmN4LCAoczMyKS0+Y3kgPSAoSU5UMzIpKHMxNiktPmN5KQorI2RlZmluZSBDT05WX1NJWkUzMlRPMTYoczMyLHMxNikgXAorICAgICAgICAgICAgKChzMTYpLT5jeCA9IChJTlQxNikoczMyKS0+Y3gsIChzMTYpLT5jeSA9IChJTlQxNikoczMyKS0+Y3kpCisKKy8qIFRoZSBQT0lOVCBzdHJ1Y3R1cmUgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBJTlQxNiAgeDsKKyAgICBJTlQxNiAgeTsKK30gUE9JTlQxNiwgKkxQUE9JTlQxNjsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBJTlQzMiAgeDsKKyAgICBJTlQzMiAgeTsKK30gUE9JTlQzMiwgKkxQUE9JTlQzMjsKKworREVDTF9XSU5FTElCX1RZUEUoUE9JTlQpOworREVDTF9XSU5FTElCX1RZUEUoTFBQT0lOVCk7CisKKyNkZWZpbmUgQ09OVl9QT0lOVDE2VE8zMihwMTYscDMyKSBcCisgICAgICAgICAgICAoKHAzMiktPnggPSAoSU5UMzIpKHAxNiktPngsIChwMzIpLT55ID0gKElOVDMyKShwMTYpLT55KQorI2RlZmluZSBDT05WX1BPSU5UMzJUTzE2KHAzMixwMTYpIFwKKyAgICAgICAgICAgICgocDE2KS0+eCA9IChJTlQxNikocDMyKS0+eCwgKHAxNiktPnkgPSAoSU5UMTYpKHAzMiktPnkpCisKKyNkZWZpbmUgTUFLRVBPSU5UMTYobCkgKCooKFBPSU5UMTYgKikmKGwpKSkKKyNpZmRlZiBXSU5FTElCMTYKKyNkZWZpbmUgTUFLRVBPSU5UKGwpICBNQUtFUE9JTlQxNihsKQogI2VuZGlmCiAKLSNkZWZpbmUgTUFLRUxQQVJBTShsb3csIGhpZ2gpICgoTE9ORykoKChXT1JEKShsb3cpKSB8IFwKLQkJCSAgICAgICgoKERXT1JEKSgoV09SRCkoaGlnaCkpKSA8PCAxNikpKQorLyogVGhlIFJFQ1Qgc3RydWN0dXJlICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgSU5UMTYgIGxlZnQ7CisgICAgSU5UMTYgIHRvcDsKKyAgICBJTlQxNiAgcmlnaHQ7CisgICAgSU5UMTYgIGJvdHRvbTsKK30gUkVDVDE2LCAqTFBSRUNUMTY7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgSU5UMzIgIGxlZnQ7CisgICAgSU5UMzIgIHRvcDsKKyAgICBJTlQzMiAgcmlnaHQ7CisgICAgSU5UMzIgIGJvdHRvbTsKK30gUkVDVDMyLCAqTFBSRUNUMzI7CisKK0RFQ0xfV0lORUxJQl9UWVBFKFJFQ1QpOworREVDTF9XSU5FTElCX1RZUEUoTFBSRUNUKTsKKworI2RlZmluZSBDT05WX1JFQ1QxNlRPMzIocjE2LHIzMikgXAorICAgICgocjMyKS0+bGVmdCAgPSAoSU5UMzIpKHIxNiktPmxlZnQsICAocjMyKS0+dG9wICAgID0gKElOVDMyKShyMTYpLT50b3AsIFwKKyAgICAgKHIzMiktPnJpZ2h0ID0gKElOVDMyKShyMTYpLT5yaWdodCwgKHIzMiktPmJvdHRvbSA9IChJTlQzMikocjE2KS0+Ym90dG9tKQorI2RlZmluZSBDT05WX1JFQ1QzMlRPMTYocjMyLHIxNikgXAorICAgICgocjE2KS0+bGVmdCAgPSAoSU5UMTYpKHIzMiktPmxlZnQsICAocjE2KS0+dG9wICAgID0gKElOVDE2KShyMzIpLT50b3AsIFwKKyAgICAgKHIxNiktPnJpZ2h0ID0gKElOVDE2KShyMzIpLT5yaWdodCwgKHIxNiktPmJvdHRvbSA9IChJTlQxNikocjMyKS0+Ym90dG9tKQorCiAKIHR5cGVkZWYgc3RydWN0IHRhZ0tFUk5JTkdQQUlSIHsKICAgICAgICAgV09SRCB3Rmlyc3Q7CkBAIC0zMSwzNCArOTQsODIgQEAKICAgICAgICAgSU5UICBpS2VybkFtb3VudDsKIH0gS0VSTklOR1BBSVIsICpMUEtFUk5JTkdQQUlSOwogCi10eXBlZGVmIHN0cnVjdCB7Ci0JSERDIGhkYzsKLQlCT09MCWZFcmFzZTsKLQlSRUNUCXJjUGFpbnQ7Ci0JQk9PTAlmUmVzdG9yZSwgZkluY1VwZGF0ZTsKLQlCWVRFCXJnYlJlc2VydmVkWzE2XTsKLX0gUEFJTlRTVFJVQ1Q7Cit0eXBlZGVmIHN0cnVjdAoreworICAgIEhEQzE2ICAgaGRjOworICAgIEJPT0wxNiAgZkVyYXNlOworICAgIFJFQ1QxNiAgcmNQYWludDsKKyAgICBCT09MMTYgIGZSZXN0b3JlOworICAgIEJPT0wxNiAgZkluY1VwZGF0ZTsKKyAgICBCWVRFICAgIHJnYlJlc2VydmVkWzE2XTsKK30gUEFJTlRTVFJVQ1QxNiwgKkxQUEFJTlRTVFJVQ1QxNjsKIAotdHlwZWRlZiBQQUlOVFNUUlVDVCAqUFBBSU5UU1RSVUNUOwotdHlwZWRlZiBQQUlOVFNUUlVDVCAqTlBQQUlOVFNUUlVDVDsKLXR5cGVkZWYgUEFJTlRTVFJVQ1QgKkxQUEFJTlRTVFJVQ1Q7Cit0eXBlZGVmIHN0cnVjdAoreworICAgIEhEQzMyICAgaGRjOworICAgIEJPT0wzMiAgZkVyYXNlOworICAgIFJFQ1QzMiAgcmNQYWludDsKKyAgICBCT09MMzIgIGZSZXN0b3JlOworICAgIEJPT0wzMiAgZkluY1VwZGF0ZTsKKyAgICBCWVRFICAgIHJnYlJlc2VydmVkWzMyXTsKK30gUEFJTlRTVFJVQ1QzMiwgKkxQUEFJTlRTVFJVQ1QzMjsKKworREVDTF9XSU5FTElCX1RZUEUoUEFJTlRTVFJVQ1QpOworREVDTF9XSU5FTElCX1RZUEUoTFBQQUlOVFNUUlVDVCk7CisKIAogICAvKiBXaW5kb3dzICovCiAKLXR5cGVkZWYgc3RydWN0IHsKLSAgICBMUFZPSUQgICAgbHBDcmVhdGVQYXJhbXM7Ci0gICAgSElOU1RBTkNFIGhJbnN0YW5jZTsKLSAgICBITUVOVSAgICAgaE1lbnU7Ci0gICAgSFdORCAgICAgIGh3bmRQYXJlbnQ7Ci0gICAgSU5UCSAgICAgIGN5OwotICAgIElOVCAgICAgICBjeDsKLSAgICBJTlQgICAgICAgeTsKLSAgICBJTlQgICAgICAgeDsKLSAgICBMT05HICAgICAgc3R5bGUgV0lORV9QQUNLRUQ7Ci0gICAgU0VHUFRSICAgIGxwc3pOYW1lIFdJTkVfUEFDS0VEOwotICAgIFNFR1BUUiAgICBscHN6Q2xhc3MgV0lORV9QQUNLRUQ7Ci0gICAgRFdPUkQgICAgIGR3RXhTdHlsZSBXSU5FX1BBQ0tFRDsKLX0gQ1JFQVRFU1RSVUNULCAqTFBDUkVBVEVTVFJVQ1Q7Cit0eXBlZGVmIHN0cnVjdAoreworICAgIExQVk9JRCAgICAgIGxwQ3JlYXRlUGFyYW1zOworICAgIEhJTlNUQU5DRTE2IGhJbnN0YW5jZTsKKyAgICBITUVOVTE2ICAgICBoTWVudTsKKyAgICBIV05EMTYgICAgICBod25kUGFyZW50OworICAgIElOVDE2ICAgICAgIGN5OworICAgIElOVDE2ICAgICAgIGN4OworICAgIElOVDE2ICAgICAgIHk7CisgICAgSU5UMTYgICAgICAgeDsKKyAgICBMT05HICAgICAgICBzdHlsZSBXSU5FX1BBQ0tFRDsKKyAgICBTRUdQVFIgICAgICBscHN6TmFtZSBXSU5FX1BBQ0tFRDsKKyAgICBTRUdQVFIgICAgICBscHN6Q2xhc3MgV0lORV9QQUNLRUQ7CisgICAgRFdPUkQgICAgICAgZHdFeFN0eWxlIFdJTkVfUEFDS0VEOworfSBDUkVBVEVTVFJVQ1QxNiwgKkxQQ1JFQVRFU1RSVUNUMTY7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFBWT0lEICAgICAgbHBDcmVhdGVQYXJhbXM7CisgICAgSElOU1RBTkNFMzIgaEluc3RhbmNlOworICAgIEhNRU5VMzIgICAgIGhNZW51OworICAgIEhXTkQzMiAgICAgIGh3bmRQYXJlbnQ7CisgICAgSU5UMzIgICAgICAgY3k7CisgICAgSU5UMzIgICAgICAgY3g7CisgICAgSU5UMzIgICAgICAgeTsKKyAgICBJTlQzMiAgICAgICB4OworICAgIExPTkcgICAgICAgIHN0eWxlOworICAgIExQQ1NUUiAgICAgIGxwc3pOYW1lOworICAgIExQQ1NUUiAgICAgIGxwc3pDbGFzczsKKyAgICBEV09SRCAgICAgICBkd0V4U3R5bGU7Cit9IENSRUFURVNUUlVDVDMyQSwgKkxQQ1JFQVRFU1RSVUNUMzJBOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIExQVk9JRCAgICAgIGxwQ3JlYXRlUGFyYW1zOworICAgIEhJTlNUQU5DRTMyIGhJbnN0YW5jZTsKKyAgICBITUVOVTMyICAgICBoTWVudTsKKyAgICBIV05EMzIgICAgICBod25kUGFyZW50OworICAgIElOVDMyICAgICAgIGN5OworICAgIElOVDMyICAgICAgIGN4OworICAgIElOVDMyICAgICAgIHk7CisgICAgSU5UMzIgICAgICAgeDsKKyAgICBMT05HICAgICAgICBzdHlsZTsKKyAgICBMUENXU1RSICAgICBscHN6TmFtZTsKKyAgICBMUENXU1RSICAgICBscHN6Q2xhc3M7CisgICAgRFdPUkQgICAgICAgZHdFeFN0eWxlOworfSBDUkVBVEVTVFJVQ1QzMlcsICpMUENSRUFURVNUUlVDVDMyVzsKKworREVDTF9XSU5FTElCX1RZUEVfQVcoQ1JFQVRFU1RSVUNUKTsKK0RFQ0xfV0lORUxJQl9UWVBFX0FXKExQQ1JFQVRFU1RSVUNUKTsKIAogdHlwZWRlZiBzdHJ1Y3QgCiB7CkBAIC0xMDQsMTIgKzIxNSwyMyBAQAogICAvKiBXTV9HRVRNSU5NQVhJTkZPIHN0cnVjdCAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBQT0lOVCAgIHB0UmVzZXJ2ZWQ7Ci0gICAgUE9JTlQgICBwdE1heFNpemU7Ci0gICAgUE9JTlQgICBwdE1heFBvc2l0aW9uOwotICAgIFBPSU5UICAgcHRNaW5UcmFja1NpemU7Ci0gICAgUE9JTlQgICBwdE1heFRyYWNrU2l6ZTsKLX0gTUlOTUFYSU5GTzsKKyAgICBQT0lOVDE2ICAgcHRSZXNlcnZlZDsKKyAgICBQT0lOVDE2ICAgcHRNYXhTaXplOworICAgIFBPSU5UMTYgICBwdE1heFBvc2l0aW9uOworICAgIFBPSU5UMTYgICBwdE1pblRyYWNrU2l6ZTsKKyAgICBQT0lOVDE2ICAgcHRNYXhUcmFja1NpemU7Cit9IE1JTk1BWElORk8xNjsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBQT0lOVDMyICAgcHRSZXNlcnZlZDsKKyAgICBQT0lOVDMyICAgcHRNYXhTaXplOworICAgIFBPSU5UMzIgICBwdE1heFBvc2l0aW9uOworICAgIFBPSU5UMzIgICBwdE1pblRyYWNrU2l6ZTsKKyAgICBQT0lOVDMyICAgcHRNYXhUcmFja1NpemU7Cit9IE1JTk1BWElORk8zMjsKKworREVDTF9XSU5FTElCX1RZUEUoTUlOTUFYSU5GTyk7CiAKICAgLyogUmVkcmF3V2luZG93KCkgZmxhZ3MgKi8KICNkZWZpbmUgUkRXX0lOVkFMSURBVEUgICAgICAgMHgwMDAxCkBAIC0xMjgsMjUgKzI1MCw1MSBAQAogICAvKiBXTV9XSU5ET1dQT1NDSEFOR0lORy9DSEFOR0VEIHN0cnVjdCAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBIV05EICAgIGh3bmQ7Ci0gICAgSFdORCAgICBod25kSW5zZXJ0QWZ0ZXI7Ci0gICAgSU5UICAgICB4OwotICAgIElOVCAgICAgeTsKLSAgICBJTlQgICAgIGN4OwotICAgIElOVCAgICAgY3k7Ci0gICAgVUlOVCAgICBmbGFnczsKLX0gV0lORE9XUE9TOworICAgIEhXTkQxNiAgaHduZDsKKyAgICBIV05EMTYgIGh3bmRJbnNlcnRBZnRlcjsKKyAgICBJTlQxNiAgIHg7CisgICAgSU5UMTYgICB5OworICAgIElOVDE2ICAgY3g7CisgICAgSU5UMTYgICBjeTsKKyAgICBVSU5UMTYgIGZsYWdzOworfSBXSU5ET1dQT1MxNjsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBIV05EMzIgIGh3bmQ7CisgICAgSFdORDMyICBod25kSW5zZXJ0QWZ0ZXI7CisgICAgSU5UMzIgICB4OworICAgIElOVDMyICAgeTsKKyAgICBJTlQzMiAgIGN4OworICAgIElOVDMyICAgY3k7CisgICAgVUlOVDMyICBmbGFnczsKK30gV0lORE9XUE9TMzI7CisKK0RFQ0xfV0lORUxJQl9UWVBFKFdJTkRPV1BPUyk7CiAKICAgLyogU2V0V2luZG93UGxhY2VtZW50KCkgc3RydWN0ICovCiB0eXBlZGVmIHN0cnVjdAogewotICAgIFVJTlQgICBsZW5ndGg7Ci0gICAgVUlOVCAgIGZsYWdzOwotICAgIFVJTlQgICBzaG93Q21kOwotICAgIFBPSU5UICBwdE1pblBvc2l0aW9uIFdJTkVfUEFDS0VEOwotICAgIFBPSU5UICBwdE1heFBvc2l0aW9uIFdJTkVfUEFDS0VEOwotICAgIFJFQ1QgICByY05vcm1hbFBvc2l0aW9uIFdJTkVfUEFDS0VEOwotfSBXSU5ET1dQTEFDRU1FTlQsICpMUFdJTkRPV1BMQUNFTUVOVDsKKyAgICBVSU5UMTYgICBsZW5ndGg7CisgICAgVUlOVDE2ICAgZmxhZ3M7CisgICAgVUlOVDE2ICAgc2hvd0NtZDsKKyAgICBQT0lOVDE2ICBwdE1pblBvc2l0aW9uIFdJTkVfUEFDS0VEOworICAgIFBPSU5UMTYgIHB0TWF4UG9zaXRpb24gV0lORV9QQUNLRUQ7CisgICAgUkVDVDE2ICAgcmNOb3JtYWxQb3NpdGlvbiBXSU5FX1BBQ0tFRDsKK30gV0lORE9XUExBQ0VNRU5UMTYsICpMUFdJTkRPV1BMQUNFTUVOVDE2OworCit0eXBlZGVmIHN0cnVjdAoreworICAgIFVJTlQzMiAgIGxlbmd0aDsKKyAgICBVSU5UMzIgICBmbGFnczsKKyAgICBVSU5UMzIgICBzaG93Q21kOworICAgIFBPSU5UMzIgIHB0TWluUG9zaXRpb24gV0lORV9QQUNLRUQ7CisgICAgUE9JTlQzMiAgcHRNYXhQb3NpdGlvbiBXSU5FX1BBQ0tFRDsKKyAgICBSRUNUMzIgICByY05vcm1hbFBvc2l0aW9uIFdJTkVfUEFDS0VEOworfSBXSU5ET1dQTEFDRU1FTlQzMiwgKkxQV0lORE9XUExBQ0VNRU5UMzI7CisKK0RFQ0xfV0lORUxJQl9UWVBFKFdJTkRPV1BMQUNFTUVOVCk7CitERUNMX1dJTkVMSUJfVFlQRShMUFdJTkRPV1BMQUNFTUVOVCk7CiAKICAgLyogV0lORE9XUExBQ0VNRU5UIGZsYWdzICovCiAjZGVmaW5lIFdQRl9TRVRNSU5QT1NJVElPTiAgICAgIDB4MDAwMQpAQCAtMTY2LDkgKzMxNCwxOCBAQAogICAvKiBXTV9OQ0NBTENTSVpFIHBhcmFtZXRlciBzdHJ1Y3R1cmUgKi8KIHR5cGVkZWYgc3RydWN0CiB7Ci0gICAgUkVDVCAgICByZ3JjWzNdOworICAgIFJFQ1QxNiAgcmdyY1szXTsKICAgICBTRUdQVFIgIGxwcG9zOwotfSBOQ0NBTENTSVpFX1BBUkFNUzsKK30gTkNDQUxDU0laRV9QQVJBTVMxNiwgKkxQTkNDQUxDU0laRV9QQVJBTVMxNjsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBSRUNUMzIgICAgICAgcmdyY1szXTsKKyAgICBXSU5ET1dQT1MzMiAqbHBwb3M7Cit9IE5DQ0FMQ1NJWkVfUEFSQU1TMzIsICpMUE5DQ0FMQ1NJWkVfUEFSQU1TMzI7CisKK0RFQ0xfV0lORUxJQl9UWVBFKE5DQ0FMQ1NJWkVfUEFSQU1TKTsKK0RFQ0xfV0lORUxJQl9UWVBFKExQTkNDQUxDU0laRV9QQVJBTVMpOwogCiAgIC8qIFdNX05DQ0FMQ1NJWkUgcmV0dXJuIGZsYWdzICovCiAjZGVmaW5lIFdWUl9BTElHTlRPUCAgICAgICAgMHgwMDEwCkBAIC0yNzUsOCArNDMyLDggQEAKICAgLyogTW91c2UgaG9vayBzdHJ1Y3R1cmUgKi8KIHR5cGVkZWYgc3RydWN0IHRhZ01PVVNFSE9PS1NUUlVDVAogewotICAgIFBPSU5UICAgcHQ7Ci0gICAgSFdORCAgICBod25kOworICAgIFBPSU5UMTYgcHQ7CisgICAgSFdORDE2ICBod25kOwogICAgIFdPUkQgICAgd0hpdFRlc3RDb2RlOwogICAgIERXT1JEICAgZHdFeHRyYUluZm87CiB9IE1PVVNFSE9PS1NUUlVDVCwgKkxQTU9VU0VIT09LU1RSVUNUOwpAQCAtMzA1LDggKzQ2Miw4IEBACiAgIC8qIENCVCBob29rIHN0cnVjdHVyZXMgKi8KIHR5cGVkZWYgc3RydWN0IHRhZ0NCVF9DUkVBVEVXTkQKIHsKLSAgICBDUkVBVEVTVFJVQ1QgKmxwY3M7Ci0gICAgSFdORCAgICAgICAgICBod25kSW5zZXJ0QWZ0ZXI7CisgICAgQ1JFQVRFU1RSVUNUMTYgKmxwY3M7CisgICAgSFdORCAgICAgICAgICAgIGh3bmRJbnNlcnRBZnRlcjsKIH0gQ0JUX0NSRUFURVdORCwgKkxQQ0JUX0NSRUFURVdORDsKIAogdHlwZWRlZiBzdHJ1Y3QgdGFnQ0JUQUNUSVZBVEVTVFJVQ1QKQEAgLTM3NSwxMiArNTMyLDEyIEBACiAKIHR5cGVkZWYgc3RydWN0IHRhZ01TRwogewotICBIV05EICAgIGh3bmQ7Ci0gIFVJTlQgICAgbWVzc2FnZTsKLSAgV1BBUkFNICB3UGFyYW07Ci0gIExQQVJBTSAgbFBhcmFtIFdJTkVfUEFDS0VEOwotICBEV09SRCAgIHRpbWUgV0lORV9QQUNLRUQ7Ci0gIFBPSU5UCSAgcHQgV0lORV9QQUNLRUQ7CisgIEhXTkQxNiAgICBod25kOworICBVSU5UMTYgICAgbWVzc2FnZTsKKyAgV1BBUkFNMTYgIHdQYXJhbTsKKyAgTFBBUkFNICAgIGxQYXJhbSBXSU5FX1BBQ0tFRDsKKyAgRFdPUkQgICAgIHRpbWUgV0lORV9QQUNLRUQ7CisgIFBPSU5UMTYgICBwdCBXSU5FX1BBQ0tFRDsKIH0gTVNHLCAqTFBNU0c7CiAJCiAjZGVmaW5lIE1BS0VJTlRBVE9NKGkpICAgKChTRUdQVFIpTUFLRUxPTkcoKGkpLDApKQpAQCAtNjgxLDcgKzgzOCw3IEBACiB0eXBlZGVmIHN0cnVjdCB0YWdMT0dQRU4KIHsKICAgICBXT1JEICAgICBsb3BuU3R5bGU7IAotICAgIFBPSU5UICAgIGxvcG5XaWR0aCBXSU5FX1BBQ0tFRDsKKyAgICBQT0lOVDE2ICBsb3BuV2lkdGggV0lORV9QQUNLRUQ7CiAgICAgQ09MT1JSRUYgbG9wbkNvbG9yIFdJTkVfUEFDS0VEOwogfSBMT0dQRU4sICpQTE9HUEVOLCAqTlBMT0dQRU4sICpMUExPR1BFTjsKIApAQCAtOTc5LDcgKzExMzYsNyBAQAogCiB0eXBlZGVmIHN0cnVjdAogewotICAgIFBPSU5UICAgcHRIb3RTcG90OworICAgIFBPSU5UMTYgcHRIb3RTcG90OwogICAgIFdPUkQgICAgbldpZHRoOwogICAgIFdPUkQgICAgbkhlaWdodDsKICAgICBXT1JEICAgIG5XaWR0aEJ5dGVzOwpAQCAtMTM5OCw3ICsxNTU1LDcgQEAKIAlXT1JECXdGbGFnczsKIAlIQU5ETEUgIGhMaXN0OwogCUhBTkRMRSAgaE9mU3RydWN0OwotCVBPSU5UCXB0IFdJTkVfUEFDS0VEOworCVBPSU5UMTYgcHQgV0lORV9QQUNLRUQ7CiAJTE9ORwlsICBXSU5FX1BBQ0tFRDsKIH0gRFJBR0lORk8sICpMUERSQUdJTkZPOwogCkBAIC0xODUzLDEyICsyMDEwLDMzIEBACiAjZGVmaW5lIEJTX09XTkVSRFJBVyAgICAgICAgICAgMHgwMDAwMDAwQkwKICNkZWZpbmUgQlNfTEVGVFRFWFQgICAgICAgICAgICAweDAwMDAwMDIwTAogCi0vKiBCdXR0b24gY29udHJvbCBtZXNzYWdlcyAqLwotI2RlZmluZSBCTV9HRVRDSEVDSyAgICAgICAgICAgIChXTV9VU0VSKzApCi0jZGVmaW5lIEJNX1NFVENIRUNLICAgICAgICAgICAgKFdNX1VTRVIrMSkKLSNkZWZpbmUgQk1fR0VUU1RBVEUgICAgICAgICAgICAoV01fVVNFUisyKQotI2RlZmluZSBCTV9TRVRTVEFURSAgICAgICAgICAgIChXTV9VU0VSKzMpCi0jZGVmaW5lIEJNX1NFVFNUWUxFICAgICAgICAgICAgKFdNX1VTRVIrNCkKKy8qIFdpbjE2IGJ1dHRvbiBjb250cm9sIG1lc3NhZ2VzICovCisjZGVmaW5lIEJNX0dFVENIRUNLMTYgICAgICAgICAgKFdNX1VTRVIrMCkKKyNkZWZpbmUgQk1fU0VUQ0hFQ0sxNiAgICAgICAgICAoV01fVVNFUisxKQorI2RlZmluZSBCTV9HRVRTVEFURTE2ICAgICAgICAgIChXTV9VU0VSKzIpCisjZGVmaW5lIEJNX1NFVFNUQVRFMTYgICAgICAgICAgKFdNX1VTRVIrMykKKyNkZWZpbmUgQk1fU0VUU1RZTEUxNiAgICAgICAgICAoV01fVVNFUis0KQorI2RlZmluZSBCTV9DTElDSzE2ICAgICAgICAgICAgIFdNX05VTEwgIC8qIERvZXMgbm90IGV4aXN0IGluIFdpbjE2ICovCisjZGVmaW5lIEJNX0dFVElNQUdFMTYgICAgICAgICAgV01fTlVMTCAgLyogRG9lcyBub3QgZXhpc3QgaW4gV2luMTYgKi8KKyNkZWZpbmUgQk1fU0VUSU1BR0UxNiAgICAgICAgICBXTV9OVUxMICAvKiBEb2VzIG5vdCBleGlzdCBpbiBXaW4xNiAqLworLyogV2luMzIgYnV0dG9uIGNvbnRyb2wgbWVzc2FnZXMgKi8KKyNkZWZpbmUgQk1fR0VUQ0hFQ0szMiAgICAgICAgICAweDAwZjAKKyNkZWZpbmUgQk1fU0VUQ0hFQ0szMiAgICAgICAgICAweDAwZjEKKyNkZWZpbmUgQk1fR0VUU1RBVEUzMiAgICAgICAgICAweDAwZjIKKyNkZWZpbmUgQk1fU0VUU1RBVEUzMiAgICAgICAgICAweDAwZjMKKyNkZWZpbmUgQk1fU0VUU1RZTEUzMiAgICAgICAgICAweDAwZjQKKyNkZWZpbmUgQk1fQ0xJQ0szMiAgICAgICAgICAgICAweDAwZjUKKyNkZWZpbmUgQk1fR0VUSU1BR0UzMiAgICAgICAgICAweDAwZjYKKyNkZWZpbmUgQk1fU0VUSU1BR0UzMiAgICAgICAgICAweDAwZjcKKy8qIFdpbmVsaWIgYnV0dG9uIGNvbnRyb2wgbWVzc2FnZXMgKi8KKyNkZWZpbmUgQk1fR0VUQ0hFQ0sgICAgICAgICAgICBXSU5FTElCX05BTUUoQk1fR0VUQ0hFQ0spCisjZGVmaW5lIEJNX1NFVENIRUNLICAgICAgICAgICAgV0lORUxJQl9OQU1FKEJNX1NFVENIRUNLKQorI2RlZmluZSBCTV9HRVRTVEFURSAgICAgICAgICAgIFdJTkVMSUJfTkFNRShCTV9HRVRTVEFURSkKKyNkZWZpbmUgQk1fU0VUU1RBVEUgICAgICAgICAgICBXSU5FTElCX05BTUUoQk1fU0VUU1RBVEUpCisjZGVmaW5lIEJNX1NFVFNUWUxFICAgICAgICAgICAgV0lORUxJQl9OQU1FKEJNX1NFVFNUWUxFKQorI2RlZmluZSBCTV9DTElDSyAgICAgICAgICAgICAgIFdJTkVMSUJfTkFNRShCTV9DTElDSykKKyNkZWZpbmUgQk1fR0VUSU1BR0UgICAgICAgICAgICBXSU5FTElCX05BTUUoQk1fR0VUSU1BR0UpCisjZGVmaW5lIEJNX1NFVElNQUdFICAgICAgICAgICAgV0lORUxJQl9OQU1FKEJNX1NFVElNQUdFKQogCiAvKiBCdXR0b24gbm90aWZpY2F0aW9uIGNvZGVzICovCiAjZGVmaW5lIEJOX0NMSUNLRUQgICAgICAgICAgICAgMApAQCAtMjE0MywxNiArMjMyMSwzMyBAQAogCiB0eXBlZGVmIHN0cnVjdAogewotICAgIFVJTlQgICAgICAgIEN0bFR5cGU7Ci0gICAgVUlOVCAgICAgICAgQ3RsSUQ7Ci0gICAgVUlOVCAgICAgICAgaXRlbUlEOwotICAgIFVJTlQgICAgICAgIGl0ZW1BY3Rpb247Ci0gICAgVUlOVCAgICAgICAgaXRlbVN0YXRlOwotICAgIEhXTkQgICAgICAgIGh3bmRJdGVtOwotICAgIEhEQyAgICAgICAgIGhEQzsKLSAgICBSRUNUICAgICAgICByY0l0ZW0gV0lORV9QQUNLRUQ7CisgICAgVUlOVDE2ICAgICAgQ3RsVHlwZTsKKyAgICBVSU5UMTYgICAgICBDdGxJRDsKKyAgICBVSU5UMTYgICAgICBpdGVtSUQ7CisgICAgVUlOVDE2ICAgICAgaXRlbUFjdGlvbjsKKyAgICBVSU5UMTYgICAgICBpdGVtU3RhdGU7CisgICAgSFdORDE2ICAgICAgaHduZEl0ZW07CisgICAgSERDMTYgICAgICAgaERDOworICAgIFJFQ1QxNiAgICAgIHJjSXRlbSBXSU5FX1BBQ0tFRDsKICAgICBEV09SRCAgICAgICBpdGVtRGF0YSBXSU5FX1BBQ0tFRDsKLX0gRFJBV0lURU1TVFJVQ1QsICpQRFJBV0lURU1TVFJVQ1QsICpMUERSQVdJVEVNU1RSVUNUOworfSBEUkFXSVRFTVNUUlVDVDE2LCAqUERSQVdJVEVNU1RSVUNUMTYsICpMUERSQVdJVEVNU1RSVUNUMTY7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgVUlOVDMyICAgICAgQ3RsVHlwZTsKKyAgICBVSU5UMzIgICAgICBDdGxJRDsKKyAgICBVSU5UMzIgICAgICBpdGVtSUQ7CisgICAgVUlOVDMyICAgICAgaXRlbUFjdGlvbjsKKyAgICBVSU5UMzIgICAgICBpdGVtU3RhdGU7CisgICAgSFdORDMyICAgICAgaHduZEl0ZW07CisgICAgSERDMzIgICAgICAgaERDOworICAgIFJFQ1QzMiAgICAgIHJjSXRlbSBXSU5FX1BBQ0tFRDsKKyAgICBEV09SRCAgICAgICBpdGVtRGF0YSBXSU5FX1BBQ0tFRDsKK30gRFJBV0lURU1TVFJVQ1QzMiwgKlBEUkFXSVRFTVNUUlVDVDMyLCAqTFBEUkFXSVRFTVNUUlVDVDMyOworCitERUNMX1dJTkVMSUJfVFlQRShEUkFXSVRFTVNUUlVDVCk7CitERUNMX1dJTkVMSUJfVFlQRShQRFJBV0lURU1TVFJVQ1QpOworREVDTF9XSU5FTElCX1RZUEUoTFBEUkFXSVRFTVNUUlVDVCk7CiAKIHR5cGVkZWYgc3RydWN0CiB7CkBAIC0yNjAwLDE3ICsyNzk1LDE2IEBACiAjcHJhZ21hIHBhY2soNCkKICNlbmRpZgogCisKIElOVCAgICAgICAgQWNjZXNzUmVzb3VyY2UoSElOU1RBTkNFLEhSU1JDKTsKIEFUT00gICAgICAgQWRkQXRvbShTRUdQVFIpOwogSU5UICAgICAgICBBZGRGb250UmVzb3VyY2UoTFBDU1RSKTsKLUJPT0wgICAgICAgQWRqdXN0V2luZG93UmVjdChMUFJFQ1QsRFdPUkQsQk9PTCk7Ci1CT09MICAgICAgIEFkanVzdFdpbmRvd1JlY3RFeChMUFJFQ1QsRFdPUkQsQk9PTCxEV09SRCk7CiBXT1JEICAgICAgIEFsbG9jQ1N0b0RTQWxpYXMoV09SRCk7CiBXT1JEICAgICAgIEFsbG9jRFN0b0NTQWxpYXMoV09SRCk7CiBIR0xPQkFMICAgIEFsbG9jUmVzb3VyY2UoSElOU1RBTkNFLEhSU1JDLERXT1JEKTsKIFdPUkQgICAgICAgQWxsb2NTZWxlY3RvcihXT1JEKTsKIFdPUkQgICAgICAgQWxsb2NTZWxlY3RvckFycmF5KFdPUkQpOwotQk9PTCAgICAgICBBbmltYXRlUGFsZXR0ZShIUEFMRVRURSxVSU5ULFVJTlQsTFBQQUxFVFRFRU5UUlkpOworQk9PTCAgICAgICBBbmltYXRlUGFsZXR0ZShIUEFMRVRURTE2LFVJTlQsVUlOVCxMUFBBTEVUVEVFTlRSWSk7CiBMUFNUUiAgICAgIEFuc2lMb3dlcihMUFNUUik7CiBVSU5UICAgICAgIEFuc2lMb3dlckJ1ZmYoTFBTVFIsVUlOVCk7CiBTRUdQVFIgICAgIEFuc2lOZXh0KFNFR1BUUik7CkBAIC0yNjIzLDE1ICsyODE3LDEzIEBACiBCT09MICAgICAgIEFwcGVuZE1lbnUoSE1FTlUsVUlOVCxVSU5ULFNFR1BUUik7CiBCT09MICAgICAgIEFyYyhIREMsSU5ULElOVCxJTlQsSU5ULElOVCxJTlQsSU5ULElOVCk7CiBVSU5UICAgICAgIEFycmFuZ2VJY29uaWNXaW5kb3dzKEhXTkQpOwotSERXUCAgICAgICBCZWdpbkRlZmVyV2luZG93UG9zKElOVCk7Ci1IREMgICAgICAgIEJlZ2luUGFpbnQoSFdORCxMUFBBSU5UU1RSVUNUKTsKK0hEV1AxNiAgICAgQmVnaW5EZWZlcldpbmRvd1BvcyhJTlQpOwogQk9PTCAgICAgICBCaXRCbHQoSERDLElOVCxJTlQsSU5ULElOVCxIREMsSU5ULElOVCxEV09SRCk7CiBCT09MICAgICAgIEJyaW5nV2luZG93VG9Ub3AoSFdORCk7CiBCT09MICAgICAgIEJ1aWxkQ29tbURDQihMUENTVFIsRENCKik7CiB2b2lkICAgICAgIENhbGNDaGlsZFNjcm9sbChIV05ELFdPUkQpOwogQk9PTCAgICAgICBDYWxsTXNnRmlsdGVyKFNFR1BUUixJTlQpOwogTFJFU1VMVCAgICBDYWxsTmV4dEhvb2tFeChISE9PSyxJTlQsV1BBUkFNLExQQVJBTSk7Ci1MUkVTVUxUICAgIENhbGxXaW5kb3dQcm9jKFdORFBST0MsSFdORCxVSU5ULFdQQVJBTSxMUEFSQU0pOwogSU5UICAgICAgICBDYXRjaChMUENBVENIQlVGKTsKIEJPT0wgICAgICAgQ2hhbmdlQ2xpcGJvYXJkQ2hhaW4oSFdORCxIV05EKTsKIEJPT0wgICAgICAgQ2hhbmdlTWVudShITUVOVSxVSU5ULFNFR1BUUixVSU5ULFVJTlQpOwpAQCAtMjYzOSwxNyArMjgzMSwxNCBAQAogQk9PTCAgICAgICBDaGVja0RsZ0J1dHRvbihIV05ELElOVCxVSU5UKTsKIElOVCAgICAgICAgQ2hlY2tNZW51SXRlbShITUVOVSxVSU5ULFVJTlQpOwogQk9PTCAgICAgICBDaGVja1JhZGlvQnV0dG9uKEhXTkQsVUlOVCxVSU5ULFVJTlQpOwotSFdORCAgICAgICBDaGlsZFdpbmRvd0Zyb21Qb2ludChIV05ELFBPSU5UKTsKIEJPT0wgICAgICAgQ2hvcmQoSERDLElOVCxJTlQsSU5ULElOVCxJTlQsSU5ULElOVCxJTlQpOwogaW50ICAgICAgICBDbGVhckNvbW1CcmVhayhpbnQpOwotQk9PTCAgICAgICBDbGllbnRUb1NjcmVlbihIV05ELExQUE9JTlQpOwotQk9PTCAgICAgICBDbGlwQ3Vyc29yKExQUkVDVCk7CiBCT09MICAgICAgIENsb3NlQ2xpcGJvYXJkKHZvaWQpOwogaW50ICAgICAgICBDbG9zZUNvbW0oaW50KTsKIEhNRVRBRklMRSAgQ2xvc2VNZXRhRmlsZShIREMpOwogdm9pZCAgICAgICBDbG9zZVNvdW5kKHZvaWQpOwogQk9PTCAgICAgICBDbG9zZVdpbmRvdyhIV05EKTsKLUlOVCAgICAgICAgQ29tYmluZVJnbihIUkdOLEhSR04sSFJHTixJTlQpOworSU5UMTYgICAgICBDb21iaW5lUmduKEhSR04zMixIUkdOMzIsSFJHTjMyLElOVDMyKTsKIGludCAgICAgICAgQ29udmVydFJlcXVlc3QoSFdORCxMUEtBTkpJU1RSVUNUKTsKICNpZmRlZiBXSU5FTElCMzIKIEhDVVJTT1IgICAgQ29weUN1cnNvcihIQ1VSU09SKTsgLyogV2luMzIgKi8KQEAgLTI2NTksNyArMjg0OCw2IEBACiBISUNPTiAgICAgIENvcHlJY29uKEhJTlNUQU5DRSxISUNPTik7IC8qIFdpbjE2ICovCiAjZW5kaWYKIEhNRVRBRklMRSAgQ29weU1ldGFGaWxlKEhNRVRBRklMRSxMUENTVFIpOwotQk9PTCAgICAgICBDb3B5UmVjdChMUFJFQ1QsTFBSRUNUKTsKIElOVCAgICAgICAgQ291bnRDbGlwYm9hcmRGb3JtYXRzKHZvaWQpOwogSU5UICAgICAgICBDb3VudFZvaWNlTm90ZXMoSU5UKTsKIEhCSVRNQVAgICAgQ3JlYXRlQml0bWFwKElOVCxJTlQsVUlOVCxVSU5ULExQVk9JRCk7CkBAIC0yNjc4LDggKzI4NjYsNyBAQAogSFdORCAgICAgICBDcmVhdGVEaWFsb2dJbmRpcmVjdFBhcmFtKEhJTlNUQU5DRSxTRUdQVFIsSFdORCxETEdQUk9DLExQQVJBTSk7CiBIV05EICAgICAgIENyZWF0ZURpYWxvZ1BhcmFtKEhJTlNUQU5DRSxTRUdQVFIsSFdORCxETEdQUk9DLExQQVJBTSk7CiBIQklUTUFQICAgIENyZWF0ZURpc2NhcmRhYmxlQml0bWFwKEhEQyxJTlQsSU5UKTsKLUhSR04gICAgICAgQ3JlYXRlRWxsaXB0aWNSZ24oSU5ULElOVCxJTlQsSU5UKTsKLUhSR04gICAgICAgQ3JlYXRlRWxsaXB0aWNSZ25JbmRpcmVjdChMUFJFQ1QpOworSFJHTiAgICAgICBDcmVhdGVFbGxpcHRpY1JnbihJTlQzMixJTlQzMixJTlQzMixJTlQzMik7CiBIRk9OVCAgICAgIENyZWF0ZUZvbnQoSU5ULElOVCxJTlQsSU5ULElOVCxCWVRFLEJZVEUsQllURSxCWVRFLEJZVEUsQllURSxCWVRFLEJZVEUsTFBDU1RSKTsKIEhGT05UICAgICAgQ3JlYXRlRm9udEluZGlyZWN0KGNvbnN0IExPR0ZPTlQqKTsKIEhCUlVTSCAgICAgQ3JlYXRlSGF0Y2hCcnVzaChJTlQsQ09MT1JSRUYpOwpAQCAtMjY4NywzMCArMjg3NCwyNiBAQAogSElDT04gICAgICBDcmVhdGVJY29uKEhJTlNUQU5DRSxJTlQsSU5ULEJZVEUsQllURSxjb25zdCBCWVRFKixjb25zdCBCWVRFKik7CiBITUVOVSAgICAgIENyZWF0ZU1lbnUodm9pZCk7CiBIREMgICAgICAgIENyZWF0ZU1ldGFGaWxlKExQQ1NUUik7Ci1IUEFMRVRURSAgIENyZWF0ZVBhbGV0dGUoY29uc3QgTE9HUEFMRVRURSopOworSFBBTEVUVEUxNiBDcmVhdGVQYWxldHRlKGNvbnN0IExPR1BBTEVUVEUqKTsKIEhCUlVTSCAgICAgQ3JlYXRlUGF0dGVybkJydXNoKEhCSVRNQVApOwotSFBFTiAgICAgICBDcmVhdGVQZW4oSU5ULElOVCxDT0xPUlJFRik7Ci1IUEVOICAgICAgIENyZWF0ZVBlbkluZGlyZWN0KGNvbnN0IExPR1BFTiopOwotSFJHTiAgICAgICBDcmVhdGVQb2x5UG9seWdvblJnbihjb25zdCBQT0lOVCosY29uc3QgSU5UMTYqLElOVCxJTlQpOwotSFJHTiAgICAgICBDcmVhdGVQb2x5Z29uUmduKGNvbnN0IFBPSU5UKixJTlQsSU5UKTsKK0hQRU4xNiAgICAgQ3JlYXRlUGVuKElOVCxJTlQsQ09MT1JSRUYpOworSFBFTjE2ICAgICBDcmVhdGVQZW5JbmRpcmVjdChjb25zdCBMT0dQRU4qKTsKIEhNRU5VICAgICAgQ3JlYXRlUG9wdXBNZW51KHZvaWQpOwotSFJHTiAgICAgICBDcmVhdGVSZWN0UmduKElOVCxJTlQsSU5ULElOVCk7Ci1IUkdOICAgICAgIENyZWF0ZVJlY3RSZ25JbmRpcmVjdChjb25zdCBSRUNUKik7Ci1IUkdOICAgICAgIENyZWF0ZVJvdW5kUmVjdFJnbihJTlQsSU5ULElOVCxJTlQsSU5ULElOVCk7CitIUkdOICAgICAgIENyZWF0ZVJlY3RSZ24oSU5UMzIsSU5UMzIsSU5UMzIsSU5UMzIpOworSFJHTiAgICAgICBDcmVhdGVSb3VuZFJlY3RSZ24oSU5UMzIsSU5UMzIsSU5UMzIsSU5UMzIsSU5UMzIsSU5UMzIpOwogSEJSVVNIICAgICBDcmVhdGVTb2xpZEJydXNoKENPTE9SUkVGKTsKLUJPT0wgICAgICAgRFB0b0xQKEhEQyxMUFBPSU5ULElOVCk7CiB2b2lkICAgICAgIERlYnVnQnJlYWsodm9pZCk7CiBMUkVTVUxUICAgIERlZkRsZ1Byb2MoSFdORCxVSU5ULFdQQVJBTSxMUEFSQU0pOwogTFJFU1VMVCAgICBEZWZGcmFtZVByb2MoSFdORCxIV05ELFVJTlQsV1BBUkFNLExQQVJBTSk7CiBEV09SRCAgICAgIERlZkhvb2tQcm9jKHNob3J0LFdPUkQsRFdPUkQsSEhPT0sqKTsKIExSRVNVTFQgICAgRGVmTURJQ2hpbGRQcm9jKEhXTkQsVUlOVCxXUEFSQU0sTFBBUkFNKTsKIExSRVNVTFQgICAgRGVmV2luZG93UHJvYyhIV05ELFVJTlQsV1BBUkFNLExQQVJBTSk7Ci1IRFdQICAgICAgIERlZmVyV2luZG93UG9zKEhEV1AsSFdORCxIV05ELElOVCxJTlQsSU5ULElOVCxVSU5UKTsKK0hEV1AxNiAgICAgRGVmZXJXaW5kb3dQb3MoSERXUDE2LEhXTkQsSFdORCxJTlQsSU5ULElOVCxJTlQsVUlOVCk7CiBBVE9NICAgICAgIERlbGV0ZUF0b20oQVRPTSk7CiBCT09MICAgICAgIERlbGV0ZURDKEhEQyk7CiBCT09MICAgICAgIERlbGV0ZU1lbnUoSE1FTlUsVUlOVCxVSU5UKTsKIEJPT0wgICAgICAgRGVsZXRlTWV0YUZpbGUoSE1FVEFGSUxFKTsKLUJPT0wgICAgICAgRGVsZXRlT2JqZWN0KEhHRElPQkopOworQk9PTCAgICAgICBEZWxldGVPYmplY3QoSEdESU9CSjE2KTsKIEJPT0wgICAgICAgRGVzdHJveUNhcmV0KHZvaWQpOwogQk9PTCAgICAgICBEZXN0cm95Q3Vyc29yKEhDVVJTT1IpOwogQk9PTCAgICAgICBEZXN0cm95SWNvbihISUNPTik7CkBAIC0yNzI3LDEyICsyOTEwLDEwIEBACiBJTlQgICAgICAgIERsZ0Rpckxpc3RDb21ib0JveChIV05ELFNFR1BUUixJTlQsSU5ULFVJTlQpOwogQk9PTCAgICAgICBEbGdEaXJTZWxlY3QoSFdORCxMUFNUUixJTlQpOwogQk9PTCAgICAgICBEbGdEaXJTZWxlY3RDb21ib0JveChIV05ELExQU1RSLElOVCk7Ci1CT09MICAgICAgIERyYWdEZXRlY3QoSFdORCxQT0lOVCk7CitCT09MMTYgICAgIERyYWdEZXRlY3QoSFdORDE2LFBPSU5UMTYpOwogRFdPUkQgICAgICBEcmFnT2JqZWN0KEhXTkQsIEhXTkQsIFdPUkQsIEhBTkRMRSwgV09SRCwgSENVUlNPUik7Ci12b2lkICAgICAgIERyYXdGb2N1c1JlY3QoSERDLGNvbnN0IFJFQ1QqKTsKIEJPT0wgICAgICAgRHJhd0ljb24oSERDLElOVCxJTlQsSElDT04pOwogdm9pZCAgICAgICBEcmF3TWVudUJhcihIV05EKTsKLUlOVCAgICAgICAgRHJhd1RleHQoSERDLExQQ1NUUixJTlQsTFBSRUNULFVJTlQpOwogRFdPUkQgICAgICBEdW1wSWNvbihTRUdQVFIsV09SRCosU0VHUFRSKixTRUdQVFIqKTsKIEJPT0wgICAgICAgRWxsaXBzZShIREMsSU5ULElOVCxJTlQsSU5UKTsKIEJPT0wgICAgICAgRW1wdHlDbGlwYm9hcmQodm9pZCk7CkBAIC0yNzQwLDkgKzI5MjEsOCBAQAogQk9PTCAgICAgICBFbmFibGVNZW51SXRlbShITUVOVSxVSU5ULFVJTlQpOwogQk9PTCAgICAgICBFbmFibGVTY3JvbGxCYXIoSFdORCxVSU5ULFVJTlQpOwogQk9PTCAgICAgICBFbmFibGVXaW5kb3coSFdORCxCT09MKTsKLUJPT0wgICAgICAgRW5kRGVmZXJXaW5kb3dQb3MoSERXUCk7CitCT09MICAgICAgIEVuZERlZmVyV2luZG93UG9zKEhEV1AxNik7CiBCT09MICAgICAgIEVuZERpYWxvZyhIV05ELElOVCk7Ci1CT09MICAgICAgIEVuZFBhaW50KEhXTkQsY29uc3QgUEFJTlRTVFJVQ1QqKTsKIEJPT0wgICAgICAgRW51bUNoaWxkV2luZG93cyhIV05ELFdOREVOVU1QUk9DLExQQVJBTSk7CiBVSU5UICAgICAgIEVudW1DbGlwYm9hcmRGb3JtYXRzKFVJTlQpOwogSU5UICAgICAgICBFbnVtRm9udEZhbWlsaWVzKEhEQyxMUENTVFIsRk9OVEVOVU1QUk9DLExQQVJBTSk7CkBAIC0yNzUyLDMzICsyOTMyLDI1IEBACiBJTlQgICAgICAgIEVudW1Qcm9wcyhIV05ELFBST1BFTlVNUFJPQyk7CiBCT09MICAgICAgIEVudW1UYXNrV2luZG93cyhIVEFTSyxXTkRFTlVNUFJPQyxMUEFSQU0pOwogQk9PTCAgICAgICBFbnVtV2luZG93cyhXTkRFTlVNUFJPQyxMUEFSQU0pOwotQk9PTCAgICAgICBFcXVhbFJlY3QoY29uc3QgUkVDVCosY29uc3QgUkVDVCopOwotQk9PTCAgICAgICBFcXVhbFJnbihIUkdOLEhSR04pOworQk9PTCAgICAgICBFcXVhbFJnbihIUkdOMzIsSFJHTjMyKTsKIElOVCAgICAgICAgRXNjYXBlKEhEQyxJTlQsSU5ULExQQ1NUUixMUFZPSUQpOwogTE9ORyAgICAgICBFc2NhcGVDb21tRnVuY3Rpb24oaW50LGludCk7CiBpbnQgICAgICAgIEV4Y2x1ZGVDbGlwUmVjdChIREMsc2hvcnQsc2hvcnQsc2hvcnQsc2hvcnQpOwotaW50ICAgICAgICBFeGNsdWRlVXBkYXRlUmduKEhEQyxIV05EKTsKIGludCAgICAgICAgRXhjbHVkZVZpc1JlY3QoSERDLHNob3J0LHNob3J0LHNob3J0LHNob3J0KTsKIEJPT0wgICAgICAgRXhpdFdpbmRvd3MoRFdPUkQsV09SRCk7CiBCT09MICAgICAgIEV4dEZsb29kRmlsbChIREMsSU5ULElOVCxDT0xPUlJFRixXT1JEKTsKLUJPT0wgICAgICAgRXh0VGV4dE91dChIREMsc2hvcnQsc2hvcnQsV09SRCxMUFJFQ1QsTFBTVFIsV09SRCxMUElOVDE2KTsKIEhJQ09OICAgICAgRXh0cmFjdEljb24oSElOU1RBTkNFLExQQ1NUUixXT1JEKTsKIFdPUkQgICAgICAgRmFyR2V0T3duZXIoSEFORExFKTsKIHZvaWQgICAgICAgRmFyU2V0T3duZXIoSEFORExFLEhBTkRMRSk7CiB2b2lkICAgICAgIEZhdGFsQXBwRXhpdChVSU5ULExQQ1NUUik7CiB2b2lkICAgICAgIEZhdGFsRXhpdChpbnQpOwotaW50ICAgICAgICBGaWxsUmVjdChIREMsTFBSRUNULEhCUlVTSCk7CiBCT09MICAgICAgIEZpbGxSZ24oSERDLEhSR04sSEJSVVNIKTsKLXZvaWQgICAgICAgRmlsbFdpbmRvdyhIV05ELEhXTkQsSERDLEhCUlVTSCk7CiBBVE9NICAgICAgIEZpbmRBdG9tKFNFR1BUUik7CiBISU5TVEFOQ0UgIEZpbmRFeGVjdXRhYmxlKExQQ1NUUixMUENTVFIsTFBTVFIpOwogSFJTUkMgICAgICBGaW5kUmVzb3VyY2UoSElOU1RBTkNFLFNFR1BUUixTRUdQVFIpOwotSFdORCAgICAgICBGaW5kV2luZG93KFNFR1BUUixMUFNUUik7Ci1IV05EICAgICAgIEZpbmRXaW5kb3dFeChIV05ELEhXTkQsU0VHUFRSLExQU1RSKTsKIEJPT0wgICAgICAgRmxhc2hXaW5kb3coSFdORCxCT09MKTsKIEJPT0wgICAgICAgRmxvb2RGaWxsKEhEQyxJTlQsSU5ULENPTE9SUkVGKTsKIGludCAgICAgICAgRmx1c2hDb21tKGludCxpbnQpOwotaW50ICAgICAgICBGcmFtZVJlY3QoSERDLExQUkVDVCxIQlJVU0gpOwogQk9PTCAgICAgICBGcmFtZVJnbihIREMsSFJHTixIQlJVU0gsaW50LGludCk7CiB2b2lkICAgICAgIEZyZWVMaWJyYXJ5KEhBTkRMRSk7CiBCT09MICAgICAgIEZyZWVNb2R1bGUoSEFORExFKTsKQEAgLTI3ODYsMjggKzI5NTgsMjEgQEAKIEJPT0wgICAgICAgRnJlZVJlc291cmNlKEhHTE9CQUwpOwogV09SRCAgICAgICBGcmVlU2VsZWN0b3IoV09SRCk7CiBVSU5UICAgICAgIEdESVJlYWxpemVQYWxldHRlKEhEQyk7Ci1IUEFMRVRURSAgIEdESVNlbGVjdFBhbGV0dGUoSERDLEhQQUxFVFRFKTsKK0hQQUxFVFRFMTYgR0RJU2VsZWN0UGFsZXR0ZShIREMsSFBBTEVUVEUxNik7CiBIV05EICAgICAgIEdldEFjdGl2ZVdpbmRvdyh2b2lkKTsKIERXT1JEICAgICAgR2V0QXNwZWN0UmF0aW9GaWx0ZXIoSERDKTsKIGludCAgICAgICAgR2V0QXN5bmNLZXlTdGF0ZShpbnQpOwogSEFORExFICAgICBHZXRBdG9tSGFuZGxlKEFUT00pOwogV09SRCAgICAgICBHZXRBdG9tTmFtZShBVE9NLExQU1RSLHNob3J0KTsKIExPTkcgICAgICAgR2V0Qml0bWFwQml0cyhIQklUTUFQLExPTkcsTFBTVFIpOwotRFdPUkQgICAgICBHZXRCaXRtYXBEaW1lbnNpb24oSEJJVE1BUCk7Ci1CT09MICAgICAgIEdldEJpdG1hcERpbWVuc2lvbkV4KEhCSVRNQVAsTFBTSVpFKTsKIENPTE9SUkVGICAgR2V0QmtDb2xvcihIREMpOwogV09SRCAgICAgICBHZXRCa01vZGUoSERDKTsKIERXT1JEICAgICAgR2V0QnJ1c2hPcmcoSERDKTsKLUJPT0wgICAgICAgR2V0QnJ1c2hPcmdFeChIREMsTFBQT0lOVCk7CiBIV05EICAgICAgIEdldENhcHR1cmUodm9pZCk7CiBXT1JEICAgICAgIEdldENhcmV0QmxpbmtUaW1lKHZvaWQpOwotdm9pZCAgICAgICBHZXRDYXJldFBvcyhMUFBPSU5UKTsKIEJPT0wgICAgICAgR2V0Q2hhckFCQ1dpZHRocyhIREMsVUlOVCxVSU5ULExQQUJDKTsKIEJPT0wgICAgICAgR2V0Q2hhcldpZHRoKEhEQyxXT1JELFdPUkQsTFBJTlQxNik7Ci1XT1JEICAgICAgIEdldENsYXNzV29yZChIV05ELHNob3J0KTsKLXZvaWQgICAgICAgR2V0Q2xpZW50UmVjdChIV05ELExQUkVDVCk7Ci1pbnQgICAgICAgIEdldENsaXBCb3goSERDLExQUkVDVCk7Ci12b2lkICAgICAgIEdldENsaXBDdXJzb3IoTFBSRUNUKTsKK1dPUkQgICAgICAgR2V0Q2xhc3NXb3JkKEhXTkQsSU5UMzIpOwogSFJHTiAgICAgICBHZXRDbGlwUmduKEhEQyk7CiBIQU5ETEUgICAgIEdldENsaXBib2FyZERhdGEoV09SRCk7CiBpbnQgICAgICAgIEdldENsaXBib2FyZEZvcm1hdE5hbWUoV09SRCxMUFNUUixzaG9ydCk7CkBAIC0yODE5LDEzICsyOTg0LDEyIEBACiBVSU5UICAgICAgIEdldENvbW1FdmVudE1hc2soaW50LGludCk7CiBpbnQgICAgICAgIEdldENvbW1TdGF0ZShpbnQsRENCKik7CiBIQlJVU0ggICAgIEdldENvbnRyb2xCcnVzaChIV05ELEhEQyxXT1JEKTsKK1VJTlQzMiAgICAgR2V0Q3VycmVudERpcmVjdG9yeShVSU5UMzIsTFBTVFIpOwogSEFORExFICAgICBHZXRDdXJyZW50UERCKHZvaWQpOwogRFdPUkQgICAgICBHZXRDdXJyZW50UG9zaXRpb24oSERDKTsKLUJPT0wgICAgICAgR2V0Q3VycmVudFBvc2l0aW9uRXgoSERDLExQUE9JTlQpOwogSEFORExFICAgICBHZXRDdXJyZW50VGFzayh2b2lkKTsKIERXT1JEICAgICAgR2V0Q3VycmVudFRpbWUodm9pZCk7CiBIQ1VSU09SICAgIEdldEN1cnNvcih2b2lkKTsKLXZvaWQgICAgICAgR2V0Q3Vyc29yUG9zKExQUE9JTlQpOwogSERDICAgICAgICBHZXREQyhIV05EKTsKIEhEQyAgICAgICAgR2V0RENFeChIV05ELEhSR04sRFdPUkQpOwogRFdPUkQgICAgICBHZXREQ09yZyhIREMpOwpAQCAtMjg0OSw3ICszMDEzLDYgQEAKIERXT1JEICAgICAgR2V0SGVhcFNwYWNlcyhITU9EVUxFKTsKIEJPT0wgICAgICAgR2V0SW5wdXRTdGF0ZSh2b2lkKTsKIGludCAgICAgICAgR2V0SW5zdGFuY2VEYXRhKEhBTkRMRSxXT1JELGludCk7Ci1XT1JEICAgICAgIEdldEludGVybmFsV2luZG93UG9zKEhXTkQsTFBSRUNULExQUE9JTlQpOwogaW50ICAgICAgICBHZXRLQkNvZGVQYWdlKHZvaWQpOwogaW50ICAgICAgICBHZXRLZXJuaW5nUGFpcnMoSERDLGludCxMUEtFUk5JTkdQQUlSKTsKIGludCAgICAgICAgR2V0S2V5TmFtZVRleHQoTE9ORyxMUFNUUixpbnQpOwpAQCAtMjg3NiwxNCArMzAzOSwxNCBAQAogaW50ICAgICAgICBHZXRNb2R1bGVVc2FnZShIQU5ETEUpOwogRkFSUFJPQyAgICBHZXRNb3VzZUV2ZW50UHJvYyh2b2lkKTsKIERXT1JEICAgICAgR2V0TmVhcmVzdENvbG9yKEhEQyxEV09SRCk7Ci1XT1JEICAgICAgIEdldE5lYXJlc3RQYWxldHRlSW5kZXgoSFBBTEVUVEUsRFdPUkQpOworV09SRCAgICAgICBHZXROZWFyZXN0UGFsZXR0ZUluZGV4KEhQQUxFVFRFMTYsRFdPUkQpOwogSFdORCAgICAgICBHZXROZXh0RGxnR3JvdXBJdGVtKEhXTkQsSFdORCxCT09MKTsKIEhXTkQgICAgICAgR2V0TmV4dERsZ1RhYkl0ZW0oSFdORCxIV05ELEJPT0wpOwogSFdORCAgICAgICBHZXROZXh0V2luZG93KEhXTkQsV09SRCk7CiBXT1JEICAgICAgIEdldE51bVRhc2tzKHZvaWQpOwogaW50ICAgICAgICBHZXRPYmplY3QoSEFORExFLGludCxMUFNUUik7CiBIV05EICAgICAgIEdldE9wZW5DbGlwYm9hcmRXaW5kb3codm9pZCk7Ci1XT1JEICAgICAgIEdldFBhbGV0dGVFbnRyaWVzKEhQQUxFVFRFLFdPUkQsV09SRCxMUFBBTEVUVEVFTlRSWSk7CitXT1JEICAgICAgIEdldFBhbGV0dGVFbnRyaWVzKEhQQUxFVFRFMTYsV09SRCxXT1JELExQUEFMRVRURUVOVFJZKTsKIEhXTkQgICAgICAgR2V0UGFyZW50KEhXTkQpOwogRFdPUkQgICAgICBHZXRQaXhlbChIREMsc2hvcnQsc2hvcnQpOwogV09SRCAgICAgICBHZXRQb2x5RmlsbE1vZGUoSERDKTsKQEAgLTI4OTgsNyArMzA2MSw2IEBACiBCT09MICAgICAgIEdldFJhc3Rlcml6ZXJDYXBzKExQUkFTVEVSSVpFUl9TVEFUVVMsVUlOVCk7CiBXT1JEICAgICAgIEdldFJPUDIoSERDKTsKIFdPUkQgICAgICAgR2V0UmVsQWJzKEhEQyk7Ci1pbnQgICAgICAgIEdldFJnbkJveChIUkdOLExQUkVDVCk7CiBpbnQgICAgICAgIEdldFNjcm9sbFBvcyhIV05ELGludCk7CiB2b2lkICAgICAgIEdldFNjcm9sbFJhbmdlKEhXTkQsaW50LExQSU5UMTYsTFBJTlQxNik7CiBEV09SRCAgICAgIEdldFNlbGVjdG9yQmFzZShXT1JEKTsKQEAgLTI5MjMsNDQgKzMwODUsMzIgQEAKIHNob3J0ICAgICAgR2V0VGV4dENoYXJhY3RlckV4dHJhKEhEQyk7CiBDT0xPUlJFRiAgIEdldFRleHRDb2xvcihIREMpOwogRFdPUkQgICAgICBHZXRUZXh0RXh0ZW50KEhEQyxMUENTVFIsc2hvcnQpOwotQk9PTCAgICAgICBHZXRUZXh0RXh0ZW50UG9pbnQoSERDLExQQ1NUUixzaG9ydCxMUFNJWkUpOwogSU5UICAgICAgICBHZXRUZXh0RmFjZShIREMsSU5ULExQU1RSKTsKIEJPT0wgICAgICAgR2V0VGV4dE1ldHJpY3MoSERDLExQVEVYVE1FVFJJQyk7CiBMUElOVDE2ICAgIEdldFRocmVzaG9sZEV2ZW50KHZvaWQpOwogaW50ICAgICAgICBHZXRUaHJlc2hvbGRTdGF0dXModm9pZCk7CiBEV09SRCAgICAgIEdldFRpY2tDb3VudCh2b2lkKTsKIEhXTkQgICAgICAgR2V0VG9wV2luZG93KEhXTkQpOwotQk9PTCAgICAgICBHZXRVcGRhdGVSZWN0KEhXTkQsTFBSRUNULEJPT0wpOwotaW50ICAgICAgICBHZXRVcGRhdGVSZ24oSFdORCxIUkdOLEJPT0wpOwogTE9ORyAgICAgICBHZXRWZXJzaW9uKHZvaWQpOwogRFdPUkQgICAgICBHZXRWaWV3cG9ydEV4dChIREMpOwotQk9PTCAgICAgICBHZXRWaWV3cG9ydEV4dEV4KEhEQyxMUFBPSU5UKTsKIERXT1JEICAgICAgR2V0Vmlld3BvcnRPcmcoSERDKTsKLUJPT0wgICAgICAgR2V0Vmlld3BvcnRPcmdFeChIREMsTFBQT0lOVCk7CiBCT09MICAgICAgIEdldFdpbkRlYnVnSW5mbyhMUFdJTkRFQlVHSU5GTyxVSU5UKTsKIExPTkcgICAgICAgR2V0V2luRmxhZ3Modm9pZCk7CiBIV05EICAgICAgIEdldFdpbmRvdyhIV05ELFdPUkQpOwogSERDICAgICAgICBHZXRXaW5kb3dEQyhIV05EKTsKIERXT1JEICAgICAgR2V0V2luZG93RXh0KEhEQyk7Ci1CT09MICAgICAgIEdldFdpbmRvd0V4dEV4KEhEQyxMUFBPSU5UKTsKIExPTkcgICAgICAgR2V0V2luZG93TG9uZyhIV05ELHNob3J0KTsKIERXT1JEICAgICAgR2V0V2luZG93T3JnKEhEQyk7Ci1CT09MICAgICAgIEdldFdpbmRvd09yZ0V4KEhEQyxMUFBPSU5UKTsKLUJPT0wgICAgICAgR2V0V2luZG93UGxhY2VtZW50KEhXTkQsTFBXSU5ET1dQTEFDRU1FTlQpOwotdm9pZCAgICAgICBHZXRXaW5kb3dSZWN0KEhXTkQsTFBSRUNUKTsKIEhBTkRMRSAgICAgR2V0V2luZG93VGFzayhIV05EKTsKIGludCAgICAgICAgR2V0V2luZG93VGV4dChIV05ELExQU1RSLGludCk7CiBpbnQgICAgICAgIEdldFdpbmRvd1RleHRMZW5ndGgoSFdORCk7CiBXT1JEICAgICAgIEdldFdpbmRvd1dvcmQoSFdORCxzaG9ydCk7CiBVSU5UICAgICAgIEdldFdpbmRvd3NEaXJlY3RvcnkoTFBTVFIsVUlOVCk7Ci1BVE9NICAgICAgIEdsb2JhbEFkZEF0b20oU0VHUFRSKTsKIERXT1JEICAgICAgR2xvYmFsRE9TQWxsb2MoRFdPUkQpOwogV09SRCAgICAgICBHbG9iYWxET1NGcmVlKFdPUkQpOwogQVRPTSAgICAgICBHbG9iYWxEZWxldGVBdG9tKEFUT00pOwotQVRPTSAgICAgICBHbG9iYWxGaW5kQXRvbShTRUdQVFIpOwogdm9pZCAgICAgICBHbG9iYWxGaXgoSEdMT0JBTDE2KTsKIHZvaWQgICAgICAgR2xvYmFsRnJlZUFsbChIR0xPQkFMMTYpOwotV09SRCAgICAgICBHbG9iYWxHZXRBdG9tTmFtZShBVE9NLExQU1RSLHNob3J0KTsKIEhHTE9CQUwxNiAgR2xvYmFsTFJVTmV3ZXN0KEhHTE9CQUwxNik7CiBIR0xPQkFMMTYgIEdsb2JhbExSVU9sZGVzdChIR0xPQkFMMTYpOwogdm9pZCAgICAgICBHbG9iYWxOb3RpZnkoRkFSUFJPQyk7CkBAIC0yOTczLDE2ICszMTIzLDEyIEBACiB2b2lkICAgICAgIEhpZGVDYXJldChIV05EKTsKIEJPT0wgICAgICAgSGlsaXRlTWVudUl0ZW0oSFdORCxITUVOVSxVSU5ULFVJTlQpOwogQk9PTCAgICAgICBJblNlbmRNZXNzYWdlKHZvaWQpOwotdm9pZCAgICAgICBJbmZsYXRlUmVjdChMUFJFQ1Qsc2hvcnQsc2hvcnQpOwogV09SRCAgICAgICBJbml0QXRvbVRhYmxlKFdPUkQpOwogSFJHTiAgICAgICBJbnF1aXJlVmlzUmduKEhEQyk7CiBCT09MICAgICAgIEluc2VydE1lbnUoSE1FTlUsVUlOVCxVSU5ULFVJTlQsU0VHUFRSKTsKIGludCAgICAgICAgSW50ZXJzZWN0Q2xpcFJlY3QoSERDLHNob3J0LHNob3J0LHNob3J0LHNob3J0KTsKLUJPT0wgICAgICAgSW50ZXJzZWN0UmVjdChMUFJFQ1QsTFBSRUNULExQUkVDVCk7CiBpbnQgICAgICAgIEludGVyc2VjdFZpc1JlY3QoSERDLHNob3J0LHNob3J0LHNob3J0LHNob3J0KTsKLXZvaWQgICAgICAgSW52YWxpZGF0ZVJlY3QoSFdORCxMUFJFQ1QsQk9PTCk7Ci12b2lkICAgICAgIEludmFsaWRhdGVSZ24oSFdORCxIUkdOLEJPT0wpOwotdm9pZCAgICAgICBJbnZlcnRSZWN0KEhEQyxMUFJFQ1QpOwordm9pZCAgICAgICBJbnZhbGlkYXRlUmduKEhXTkQzMixIUkdOMzIsQk9PTDMyKTsKIEJPT0wgICAgICAgSW52ZXJ0UmduKEhEQyxIUkdOKTsKIEJPT0wgICAgICAgSXNCYWRDb2RlUHRyKFNFR1BUUik7CiBCT09MICAgICAgIElzQmFkSHVnZVJlYWRQdHIoU0VHUFRSLERXT1JEKTsKQEAgLTMwMDEsMTYgKzMxNDcsMTUgQEAKIEJPT0wgICAgICAgSXNHRElPYmplY3QoSEFORExFKTsKIEJPT0wgICAgICAgSXNJY29uaWMoSFdORCk7CiBCT09MICAgICAgIElzTWVudShITUVOVSk7Ci1CT09MICAgICAgIElzUmVjdEVtcHR5KExQUkVDVCk7CiBCT09MICAgICAgIElzVGFzayhIVEFTSyk7CiBIVEFTSyAgICAgIElzVGFza0xvY2tlZCh2b2lkKTsKIEJPT0wgICAgICAgSXNXaW5kb3coSFdORCk7CiBCT09MICAgICAgIElzV2luZG93RW5hYmxlZChIV05EKTsKK0JPT0wgICAgICAgSXNXaW5kb3dVbmljb2RlKEhXTkQpOwogQk9PTCAgICAgICBJc1dpbmRvd1Zpc2libGUoSFdORCk7CiBCT09MICAgICAgIElzWm9vbWVkKEhXTkQpOwogQk9PTCAgICAgICBLaWxsU3lzdGVtVGltZXIoSFdORCxXT1JEKTsKIEJPT0wgICAgICAgS2lsbFRpbWVyKEhXTkQsV09SRCk7Ci1CT09MICAgICAgIExQdG9EUChIREMsTFBQT0lOVCxpbnQpOwogdm9pZCAgICAgICBMaW1pdEVtc1BhZ2VzKERXT1JEKTsKIHZvaWQgICAgICAgTGluZUREQShzaG9ydCxzaG9ydCxzaG9ydCxzaG9ydCxGQVJQUk9DLGxvbmcpOwogQk9PTCAgICAgICBMaW5lVG8oSERDLHNob3J0LHNob3J0KTsKQEAgLTMwMzAsNDEgKzMxNzUsMjggQEAKIEhHTE9CQUwgICAgTG9ja1NlZ21lbnQoSEdMT0JBTCk7CiBITUVOVSAgICAgIExvb2t1cE1lbnVIYW5kbGUoSE1FTlUsSU5UKTsKIEZBUlBST0MgICAgTWFrZVByb2NJbnN0YW5jZShGQVJQUk9DLEhBTkRMRSk7Ci12b2lkICAgICAgIE1hcERpYWxvZ1JlY3QoSFdORCxMUFJFQ1QpOwogV09SRCAgICAgICBNYXBWaXJ0dWFsS2V5KFdPUkQsV09SRCk7Ci12b2lkICAgICAgIE1hcFdpbmRvd1BvaW50cyhIV05ELEhXTkQsTFBQT0lOVCxXT1JEKTsKIHZvaWQgICAgICAgTWVzc2FnZUJlZXAoV09SRCk7CiBpbnQgICAgICAgIE1lc3NhZ2VCb3goSFdORCxMUENTVFIsTFBDU1RSLFdPUkQpOwogQk9PTCAgICAgICBNb2RpZnlNZW51KEhNRU5VLFVJTlQsVUlOVCxVSU5ULFNFR1BUUik7CiBEV09SRCAgICAgIE1vdmVUbyhIREMsc2hvcnQsc2hvcnQpOwotQk9PTCAgICAgICBNb3ZlVG9FeChIREMsc2hvcnQsc2hvcnQsTFBQT0lOVCk7CiBCT09MICAgICAgIE1vdmVXaW5kb3coSFdORCxzaG9ydCxzaG9ydCxzaG9ydCxzaG9ydCxCT09MKTsKIERXT1JEICAgICAgT2VtS2V5U2NhbihXT1JEKTsKIEJPT0wgICAgICAgT2VtVG9BbnNpKExQU1RSLExQU1RSKTsKIHZvaWQgICAgICAgT2VtVG9BbnNpQnVmZihMUFNUUixMUFNUUixJTlQpOwogaW50ICAgICAgICBPZmZzZXRDbGlwUmduKEhEQyxzaG9ydCxzaG9ydCk7Ci12b2lkICAgICAgIE9mZnNldFJlY3QoTFBSRUNULHNob3J0LHNob3J0KTsKLWludCAgICAgICAgT2Zmc2V0UmduKEhSR04sc2hvcnQsc2hvcnQpOwotRFdPUkQgICAgICBPZmZzZXRWaWV3cG9ydE9yZyhIREMsc2hvcnQsc2hvcnQpOwotQk9PTCAgICAgICBPZmZzZXRWaWV3cG9ydE9yZ0V4KEhEQyxzaG9ydCxzaG9ydCxMUFBPSU5UKTsKLURXT1JEICAgICAgT2Zmc2V0V2luZG93T3JnKEhEQyxzaG9ydCxzaG9ydCk7Ci1CT09MICAgICAgIE9mZnNldFdpbmRvd09yZ0V4KEhEQyxzaG9ydCxzaG9ydCxMUFBPSU5UKTsKIEJPT0wgICAgICAgT3BlbkNsaXBib2FyZChIV05EKTsKIGludCAgICAgICAgT3BlbkNvbW0oTFBDU1RSLFVJTlQsVUlOVCk7CiBIRklMRSAgICAgIE9wZW5GaWxlKExQQ1NUUixPRlNUUlVDVCosVUlOVCk7CiBCT09MICAgICAgIE9wZW5JY29uKEhXTkQpOwogaW50ICAgICAgICBPcGVuU291bmQodm9pZCk7CiB2b2lkICAgICAgIE91dHB1dERlYnVnU3RyaW5nKExQQ1NUUik7Ci12b2lkICAgICAgIFBhaW50UmVjdChIV05ELEhXTkQsSERDLEhCUlVTSCxMUFJFQ1QpOwogQk9PTCAgICAgICBQYWludFJnbihIREMsSFJHTik7CiBCT09MICAgICAgIFBhdEJsdChIREMsc2hvcnQsc2hvcnQsc2hvcnQsc2hvcnQsRFdPUkQpOwogQk9PTCAgICAgICBQZWVrTWVzc2FnZShMUE1TRyxIV05ELFdPUkQsV09SRCxXT1JEKTsKIEJPT0wgICAgICAgUGllKEhEQyxJTlQsSU5ULElOVCxJTlQsSU5ULElOVCxJTlQsSU5UKTsKIEJPT0wgICAgICAgUGxheU1ldGFGaWxlKEhEQyxIQU5ETEUpOwogdm9pZCAgICAgICBQbGF5TWV0YUZpbGVSZWNvcmQoSERDLExQSEFORExFVEFCTEUsTFBNRVRBUkVDT1JELFdPUkQpOwotQk9PTCAgICAgICBQb2x5UG9seWdvbihIREMsTFBQT0lOVCxMUElOVDE2LFdPUkQpOwotQk9PTCAgICAgICBQb2x5Z29uKEhEQyxMUFBPSU5ULGludCk7Ci1CT09MICAgICAgIFBvbHlsaW5lKEhEQyxMUFBPSU5ULGludCk7CiBCT09MICAgICAgIFBvc3RBcHBNZXNzYWdlKEhBTkRMRSxXT1JELFdPUkQsTE9ORyk7CiBCT09MICAgICAgIFBvc3RNZXNzYWdlKEhXTkQsV09SRCxXT1JELExPTkcpOwogdm9pZCAgICAgICBQb3N0UXVpdE1lc3NhZ2UoSU5UKTsKQEAgLTMwNzcsNjcgKzMyMDksMTMgQEAKIHZvaWQgICAgICAgUHJvZlNldHVwKGludCxpbnQpOwogdm9pZCAgICAgICBQcm9mU3RhcnQodm9pZCk7CiB2b2lkICAgICAgIFByb2ZTdG9wKHZvaWQpOwotQk9PTCAgICAgICBQdEluUmVjdChMUFJFQ1QsUE9JTlQpOwotQk9PTCAgICAgICBQdEluUmVnaW9uKEhSR04sc2hvcnQsc2hvcnQpOworQk9PTCAgICAgICBQdEluUmVnaW9uKEhSR04zMixJTlQzMixJTlQzMik7CiBCT09MICAgICAgIFB0VmlzaWJsZShIREMsc2hvcnQsc2hvcnQpOwogaW50ICAgICAgICBSZWFkQ29tbShpbnQsTFBTVFIsaW50KTsKIFdPUkQgICAgICAgUmVhbGl6ZURlZmF1bHRQYWxldHRlKEhEQyk7CiBVSU5UICAgICAgIFJlYWxpemVQYWxldHRlKEhEQyk7Ci1CT09MICAgICAgIFJlY3RJblJlZ2lvbihIUkdOLExQUkVDVCk7Ci1CT09MICAgICAgIFJlY3RWaXNpYmxlKEhEQyxMUFJFQ1QpOwogQk9PTCAgICAgICBSZWN0YW5nbGUoSERDLElOVCxJTlQsSU5ULElOVCk7Ci1CT09MICAgICAgIFJlZHJhd1dpbmRvdyhIV05ELExQUkVDVCxIUkdOLFVJTlQpOwotRFdPUkQJICAgUmVnT3BlbktleUV4VyhIS0VZLExQQ1dTVFIsRFdPUkQsUkVHU0FNLExQSEtFWSk7Ci1EV09SRCAgICAgIFJlZ09wZW5LZXlXKEhLRVksTFBDV1NUUixMUEhLRVkpOwotRFdPUkQgICAgICBSZWdPcGVuS2V5RXhBKEhLRVksTFBDU1RSLERXT1JELFJFR1NBTSxMUEhLRVkpOwotRFdPUkQgICAgICBSZWdPcGVuS2V5QShIS0VZLExQQ1NUUixMUEhLRVkpOwotRFdPUkQgICAgICBSZWdPcGVuS2V5KEhLRVksTFBDU1RSLExQSEtFWSk7Ci1EV09SRCAgICAgIFJlZ0NyZWF0ZUtleUV4VyhIS0VZLExQQ1dTVFIsRFdPUkQsTFBXU1RSLERXT1JELFJFR1NBTSwKLQkJTFBTRUNVUklUWV9BVFRSSUJVVEVTLExQSEtFWSxMUERXT1JEKTsKLURXT1JEICAgICAgUmVnQ3JlYXRlS2V5VyhIS0VZLExQQ1dTVFIsTFBIS0VZKTsKLURXT1JEICAgICAgUmVnQ3JlYXRlS2V5RXhBKEhLRVksTFBDU1RSLERXT1JELExQU1RSLERXT1JELFJFR1NBTSwKLQkJTFBTRUNVUklUWV9BVFRSSUJVVEVTLExQSEtFWSxMUERXT1JEKTsKLURXT1JEICAgICAgUmVnQ3JlYXRlS2V5QShIS0VZLExQQ1NUUixMUEhLRVkpOwotRFdPUkQgICAgICBSZWdDcmVhdGVLZXkoSEtFWSxMUENTVFIsTFBIS0VZKTsKLURXT1JEICAgICAgUmVnUXVlcnlWYWx1ZUV4VyhIS0VZLExQV1NUUixMUERXT1JELExQRFdPUkQsTFBCWVRFLExQRFdPUkQpOwotRFdPUkQgICAgICBSZWdRdWVyeVZhbHVlVyhIS0VZLExQV1NUUixMUFdTVFIsTFBEV09SRCk7Ci1EV09SRCAgICAgIFJlZ1F1ZXJ5VmFsdWVFeEEoSEtFWSxMUFNUUixMUERXT1JELExQRFdPUkQsTFBCWVRFLExQRFdPUkQpOwotRFdPUkQgICAgICBSZWdRdWVyeVZhbHVlRXgoSEtFWSxMUFNUUixMUERXT1JELExQRFdPUkQsTFBCWVRFLExQRFdPUkQpOwotRFdPUkQgICAgICBSZWdRdWVyeVZhbHVlQShIS0VZLExQU1RSLExQU1RSLExQRFdPUkQpOwotRFdPUkQgICAgICBSZWdRdWVyeVZhbHVlKEhLRVksTFBTVFIsTFBTVFIsTFBEV09SRCk7Ci1EV09SRCAgICAgIFJlZ1NldFZhbHVlRXhXKEhLRVksTFBXU1RSLERXT1JELERXT1JELExQQllURSxEV09SRCk7Ci1EV09SRCAgICAgIFJlZ1NldFZhbHVlRXhBKEhLRVksTFBTVFIsRFdPUkQsRFdPUkQsTFBCWVRFLERXT1JEKTsKLURXT1JEICAgICAgUmVnU2V0VmFsdWVFeChIS0VZLExQU1RSLERXT1JELERXT1JELExQQllURSxEV09SRCk7Ci1EV09SRCAgICAgIFJlZ1NldFZhbHVlVyhIS0VZLExQQ1dTVFIsRFdPUkQsTFBDV1NUUixEV09SRCk7Ci1EV09SRCAgICAgIFJlZ1NldFZhbHVlQShIS0VZLExQQ1NUUixEV09SRCxMUENTVFIsRFdPUkQpOwotRFdPUkQgICAgICBSZWdTZXRWYWx1ZShIS0VZLExQQ1NUUixEV09SRCxMUENTVFIsRFdPUkQpOwotRFdPUkQgICAgICBSZWdFbnVtS2V5RXhXKEhLRVksRFdPUkQsTFBXU1RSLExQRFdPUkQsTFBEV09SRCxMUFdTVFIsTFBEV09SRCwKLQkJRklMRVRJTUUqKTsKLURXT1JEICAgICAgUmVnRW51bUtleVcoSEtFWSxEV09SRCxMUFdTVFIsRFdPUkQpOwotRFdPUkQgICAgICBSZWdFbnVtS2V5RXhBKEhLRVksRFdPUkQsTFBTVFIsTFBEV09SRCxMUERXT1JELExQU1RSLExQRFdPUkQsCi0JCUZJTEVUSU1FKik7Ci1EV09SRCAgICAgIFJlZ0VudW1LZXlBKEhLRVksRFdPUkQsTFBTVFIsRFdPUkQpOwotRFdPUkQgICAgICBSZWdFbnVtS2V5KEhLRVksRFdPUkQsTFBTVFIsRFdPUkQpOwotRFdPUkQgICAgICBSZWdFbnVtVmFsdWVXKEhLRVksRFdPUkQsTFBXU1RSLExQRFdPUkQsTFBEV09SRCxMUERXT1JELExQQllURSwKLQkJTFBEV09SRCk7Ci1EV09SRCAgICAgIFJlZ0VudW1WYWx1ZUEoSEtFWSxEV09SRCxMUFNUUixMUERXT1JELExQRFdPUkQsTFBEV09SRCxMUEJZVEUsCi0JCUxQRFdPUkQpOwotRFdPUkQgICAgICBSZWdFbnVtVmFsdWUoSEtFWSxEV09SRCxMUFNUUixMUERXT1JELExQRFdPUkQsTFBEV09SRCxMUEJZVEUsCi0JCUxQRFdPUkQpOwotRFdPUkQgICAgICBSZWdDbG9zZUtleShIS0VZKTsKLURXT1JEICAgICAgUmVnRGVsZXRlS2V5VyhIS0VZLExQV1NUUik7Ci1EV09SRCAgICAgIFJlZ0RlbGV0ZUtleUEoSEtFWSxMUENTVFIpOwotRFdPUkQgICAgICBSZWdEZWxldGVLZXkoSEtFWSxMUENTVFIpOwotRFdPUkQgICAgICBSZWdEZWxldGVWYWx1ZVcoSEtFWSxMUFdTVFIpOwotRFdPUkQgICAgICBSZWdEZWxldGVWYWx1ZUEoSEtFWSxMUFNUUik7Ci1EV09SRCAgICAgIFJlZ0RlbGV0ZVZhbHVlKEhLRVksTFBTVFIpOwotRFdPUkQgICAgICBSZWdGbHVzaEtleShIS0VZKTsKLURXT1JEICAgICAgUmVnUXVlcnlJbmZvS2V5VyhIS0VZLExQV1NUUixMUERXT1JELExQRFdPUkQsTFBEV09SRCxMUERXT1JELAotCQlMUERXT1JELExQRFdPUkQsTFBEV09SRCxMUERXT1JELExQRFdPUkQsRklMRVRJTUUqKTsKLURXT1JEICAgICAgUmVnUXVlcnlJbmZvS2V5QShIS0VZLExQU1RSLExQRFdPUkQsTFBEV09SRCxMUERXT1JELExQRFdPUkQsCi0JCUxQRFdPUkQsTFBEV09SRCxMUERXT1JELExQRFdPUkQsTFBEV09SRCxGSUxFVElNRSopOwogV09SRCAgICAgICBSZWdpc3RlckNsaXBib2FyZEZvcm1hdChMUENTVFIpOwotV09SRCAgICAgICBSZWdpc3RlcldpbmRvd01lc3NhZ2UoU0VHUFRSKTsKIHZvaWQgICAgICAgUmVsZWFzZUNhcHR1cmUodm9pZCk7CiBpbnQgICAgICAgIFJlbGVhc2VEQyhIV05ELEhEQyk7CiBCT09MICAgICAgIFJlbW92ZUZvbnRSZXNvdXJjZShMUFNUUik7CkBAIC0zMTQ1LDM5ICszMjIzLDMyIEBACiBIQU5ETEUgICAgIFJlbW92ZVByb3AoSFdORCxTRUdQVFIpOwogdm9pZCAgICAgICBSZXBseU1lc3NhZ2UoTE9ORyk7CiBIREMgICAgICAgIFJlc2V0REMoSERDLExQVk9JRCk7Ci1CT09MICAgICAgIFJlc2l6ZVBhbGV0dGUoSFBBTEVUVEUsVUlOVCk7CitCT09MICAgICAgIFJlc2l6ZVBhbGV0dGUoSFBBTEVUVEUxNixVSU5UKTsKIEJPT0wgICAgICAgUmVzdG9yZURDKEhEQyxzaG9ydCk7CiBpbnQgICAgICAgIFJlc3RvcmVWaXNSZ24oSERDKTsKIEJPT0wgICAgICAgUm91bmRSZWN0KEhEQyxJTlQsSU5ULElOVCxJTlQsSU5ULElOVCk7CiBpbnQgICAgICAgIFNhdmVEQyhIREMpOwogSFJHTiAgICAgICBTYXZlVmlzUmduKEhEQyk7Ci1EV09SRCAgICAgIFNjYWxlVmlld3BvcnRFeHQoSERDLHNob3J0LHNob3J0LHNob3J0LHNob3J0KTsKLUJPT0wgICAgICAgU2NhbGVWaWV3cG9ydEV4dEV4KEhEQyxzaG9ydCxzaG9ydCxzaG9ydCxzaG9ydCxMUFNJWkUpOwotRFdPUkQgICAgICBTY2FsZVdpbmRvd0V4dChIREMsc2hvcnQsc2hvcnQsc2hvcnQsc2hvcnQpOwotQk9PTCAgICAgICBTY2FsZVdpbmRvd0V4dEV4KEhEQyxzaG9ydCxzaG9ydCxzaG9ydCxzaG9ydCxMUFNJWkUpOwotdm9pZCAgICAgICBTY3JlZW5Ub0NsaWVudChIV05ELExQUE9JTlQpOwogdm9pZCAgICAgICBTY3JvbGxDaGlsZHJlbihIV05ELFVJTlQsV1BBUkFNLExQQVJBTSk7Ci1CT09MICAgICAgIFNjcm9sbERDKEhEQyxzaG9ydCxzaG9ydCxMUFJFQ1QsTFBSRUNULEhSR04sTFBSRUNUKTsKLXZvaWQgICAgICAgU2Nyb2xsV2luZG93KEhXTkQsc2hvcnQsc2hvcnQsTFBSRUNULExQUkVDVCk7Ci1pbnQgICAgICAgIFNjcm9sbFdpbmRvd0V4KEhXTkQsc2hvcnQsc2hvcnQsTFBSRUNULExQUkVDVCxIUkdOLExQUkVDVCxXT1JEKTsKK0JPT0wgICAgICAgU2Nyb2xsREMoSERDLHNob3J0LHNob3J0LExQUkVDVDE2LExQUkVDVDE2LEhSR04sTFBSRUNUMTYpOwordm9pZCAgICAgICBTY3JvbGxXaW5kb3coSFdORCxzaG9ydCxzaG9ydCxMUFJFQ1QxNixMUFJFQ1QxNik7CitpbnQgICAgICAgIFNjcm9sbFdpbmRvd0V4KEhXTkQsc2hvcnQsc2hvcnQsTFBSRUNUMTYsTFBSRUNUMTYsSFJHTixMUFJFQ1QxNixXT1JEKTsKIGludCAgICAgICAgU2VsZWN0Q2xpcFJnbihIREMsSFJHTik7CiBIQU5ETEUgICAgIFNlbGVjdE9iamVjdChIREMsSEFORExFKTsKLUhQQUxFVFRFICAgU2VsZWN0UGFsZXR0ZShIREMsSFBBTEVUVEUsQk9PTCk7CitIUEFMRVRURTE2IFNlbGVjdFBhbGV0dGUoSERDLEhQQUxFVFRFMTYsQk9PTCk7CiBpbnQgICAgICAgIFNlbGVjdFZpc1JnbihIREMsSFJHTik7CiBXT1JEICAgICAgIFNlbGVjdG9yQWNjZXNzUmlnaHRzKFdPUkQsV09SRCxXT1JEKTsKIExPTkcgICAgICAgU2VuZERsZ0l0ZW1NZXNzYWdlKEhXTkQsSU5ULFVJTlQsV1BBUkFNLExQQVJBTSk7CiBMUkVTVUxUICAgIFNlbmRNZXNzYWdlKEhXTkQsVUlOVCxXUEFSQU0sTFBBUkFNKTsKIEhXTkQgICAgICAgU2V0QWN0aXZlV2luZG93KEhXTkQpOwogTE9ORyAgICAgICBTZXRCaXRtYXBCaXRzKEhCSVRNQVAsTE9ORyxMUFNUUik7Ci1EV09SRCAgICAgIFNldEJpdG1hcERpbWVuc2lvbihIQklUTUFQLHNob3J0LHNob3J0KTsKLUJPT0wgICAgICAgU2V0Qml0bWFwRGltZW5zaW9uRXgoSEJJVE1BUCxzaG9ydCxzaG9ydCxMUFNJWkUpOwogRFdPUkQgICAgICBTZXRCa0NvbG9yKEhEQyxDT0xPUlJFRik7CiBXT1JEICAgICAgIFNldEJrTW9kZShIREMsV09SRCk7CiBEV09SRCAgICAgIFNldEJydXNoT3JnKEhEQyxzaG9ydCxzaG9ydCk7CiBIV05EICAgICAgIFNldENhcHR1cmUoSFdORCk7CiB2b2lkICAgICAgIFNldENhcmV0QmxpbmtUaW1lKFdPUkQpOwogdm9pZCAgICAgICBTZXRDYXJldFBvcyhzaG9ydCxzaG9ydCk7Ci1XT1JEICAgICAgIFNldENsYXNzV29yZChIV05ELHNob3J0LFdPUkQpOworV09SRCAgICAgICBTZXRDbGFzc1dvcmQoSFdORCxJTlQzMixXT1JEKTsKIEhBTkRMRSAgICAgU2V0Q2xpcGJvYXJkRGF0YShXT1JELEhBTkRMRSk7CiBIV05EICAgICAgIFNldENsaXBib2FyZFZpZXdlcihIV05EKTsKIGludCAgICAgICAgU2V0Q29tbUJyZWFrKGludCk7CkBAIC0zMTg1LDYgKzMyNTYsNyBAQAogaW50ICAgICAgICBTZXRDb21tU3RhdGUoRENCKik7CiB2b2lkICAgICAgIFNldENvbnZlcnRIb29rKEJPT0wpOwogQk9PTCAgICAgICBTZXRDb252ZXJ0UGFyYW1zKGludCxpbnQpOworQk9PTDMyICAgICBTZXRDdXJyZW50RGlyZWN0b3J5KExQQ1NUUik7CiBIQ1VSU09SICAgIFNldEN1cnNvcihIQ1VSU09SKTsKIHZvaWQgICAgICAgU2V0Q3Vyc29yUG9zKHNob3J0LHNob3J0KTsKIHZvaWQgICAgICAgU2V0RENTdGF0ZShIREMsSERDKTsKQEAgLTMxOTksNyArMzI3MSw2IEBACiBVSU5UICAgICAgIFNldEVycm9yTW9kZShVSU5UKTsKIEhXTkQgICAgICAgU2V0Rm9jdXMoSFdORCk7CiBXT1JEICAgICAgIFNldEhhbmRsZUNvdW50KFdPUkQpOwotdm9pZCAgICAgICBTZXRJbnRlcm5hbFdpbmRvd1BvcyhIV05ELFdPUkQsTFBSRUNULExQUE9JTlQpOwogdm9pZCAgICAgICBTZXRLZXlib2FyZFN0YXRlKEJZVEUqKTsKIFdPUkQgICAgICAgU2V0TWFwTW9kZShIREMsV09SRCk7CiBEV09SRCAgICAgIFNldE1hcHBlckZsYWdzKEhEQyxEV09SRCk7CkBAIC0zMjA3LDE1ICszMjc4LDEzIEBACiBCT09MICAgICAgIFNldE1lbnVJdGVtQml0bWFwcyhITUVOVSxVSU5ULFVJTlQsSEJJVE1BUCxIQklUTUFQKTsKIEJPT0wgICAgICAgU2V0TWVzc2FnZVF1ZXVlKGludCk7CiBIQU5ETEUgICAgIFNldE1ldGFGaWxlQml0cyhIQU5ETEUpOwotV09SRCAgICAgICBTZXRQYWxldHRlRW50cmllcyhIUEFMRVRURSxXT1JELFdPUkQsTFBQQUxFVFRFRU5UUlkpOworV09SRCAgICAgICBTZXRQYWxldHRlRW50cmllcyhIUEFMRVRURTE2LFdPUkQsV09SRCxMUFBBTEVUVEVFTlRSWSk7CiBIV05EICAgICAgIFNldFBhcmVudChIV05ELEhXTkQpOwogQ09MT1JSRUYgICBTZXRQaXhlbChIREMsc2hvcnQsc2hvcnQsQ09MT1JSRUYpOwogV09SRCAgICAgICBTZXRQb2x5RmlsbE1vZGUoSERDLFdPUkQpOwogQk9PTCAgICAgICBTZXRQcm9wKEhXTkQsU0VHUFRSLEhBTkRMRSk7CiBXT1JEICAgICAgIFNldFJPUDIoSERDLFdPUkQpOwotdm9pZCAgICAgICBTZXRSZWN0KExQUkVDVCxzaG9ydCxzaG9ydCxzaG9ydCxzaG9ydCk7Ci12b2lkICAgICAgIFNldFJlY3RFbXB0eShMUFJFQ1QpOwotdm9pZCAgICAgICBTZXRSZWN0UmduKEhSR04sc2hvcnQsc2hvcnQsc2hvcnQsc2hvcnQpOwordm9pZCAgICAgICBTZXRSZWN0UmduKEhSR04zMixJTlQzMixJTlQzMixJTlQzMixJTlQzMik7CiBXT1JEICAgICAgIFNldFJlbEFicyhIREMsV09SRCk7CiBGQVJQUk9DICAgIFNldFJlc291cmNlSGFuZGxlcihIQU5ETEUsTFBTVFIsRkFSUFJPQyk7CiBpbnQgICAgICAgIFNldFNjcm9sbFBvcyhIV05ELGludCxpbnQsQk9PTCk7CkBAIC0zMjM1LDEwICszMzA0LDYgQEAKIERXT1JEICAgICAgU2V0VGV4dENvbG9yKEhEQyxEV09SRCk7CiBzaG9ydCAgICAgIFNldFRleHRKdXN0aWZpY2F0aW9uKEhEQyxzaG9ydCxzaG9ydCk7CiBXT1JEICAgICAgIFNldFRpbWVyKEhXTkQsV09SRCxXT1JELEZBUlBST0MpOwotRFdPUkQgICAgICBTZXRWaWV3cG9ydEV4dChIREMsc2hvcnQsc2hvcnQpOwotQk9PTCAgICAgICBTZXRWaWV3cG9ydEV4dEV4KEhEQyxzaG9ydCxzaG9ydCxMUFNJWkUpOwotRFdPUkQgICAgICBTZXRWaWV3cG9ydE9yZyhIREMsc2hvcnQsc2hvcnQpOwotQk9PTCAgICAgICBTZXRWaWV3cG9ydE9yZ0V4KEhEQyxzaG9ydCxzaG9ydCxMUFBPSU5UKTsKIGludCAgICAgICAgU2V0Vm9pY2VBY2NlbnQoaW50LGludCxpbnQsaW50LGludCk7CiBpbnQgICAgICAgIFNldFZvaWNlRW52ZWxvcGUoaW50LGludCxpbnQpOwogaW50ICAgICAgICBTZXRWb2ljZU5vdGUoaW50LGludCxpbnQsaW50KTsKQEAgLTMyNDYsMTIgKzMzMTEsNyBAQAogaW50ICAgICAgICBTZXRWb2ljZVNvdW5kKGludCxMT05HLGludCk7CiBpbnQgICAgICAgIFNldFZvaWNlVGhyZXNob2xkKGludCxpbnQpOwogQk9PTCAgICAgICBTZXRXaW5EZWJ1Z0luZm8oTFBXSU5ERUJVR0lORk8pOwotRFdPUkQgICAgICBTZXRXaW5kb3dFeHQoSERDLHNob3J0LHNob3J0KTsKLUJPT0wgICAgICAgU2V0V2luZG93RXh0RXgoSERDLHNob3J0LHNob3J0LExQU0laRSk7CiBMT05HICAgICAgIFNldFdpbmRvd0xvbmcoSFdORCxzaG9ydCxMT05HKTsKLURXT1JEICAgICAgU2V0V2luZG93T3JnKEhEQyxzaG9ydCxzaG9ydCk7Ci1CT09MICAgICAgIFNldFdpbmRvd09yZ0V4KEhEQyxzaG9ydCxzaG9ydCxMUFBPSU5UKTsKLUJPT0wgICAgICAgU2V0V2luZG93UGxhY2VtZW50KEhXTkQsTFBXSU5ET1dQTEFDRU1FTlQpOwogQk9PTCAgICAgICBTZXRXaW5kb3dQb3MoSFdORCxIV05ELElOVCxJTlQsSU5ULElOVCxXT1JEKTsKIHZvaWQgICAgICAgU2V0V2luZG93VGV4dChIV05ELExQQ1NUUik7CiBXT1JEICAgICAgIFNldFdpbmRvd1dvcmQoSFdORCxzaG9ydCxXT1JEKTsKQEAgLTMyNjksNyArMzMyOSw2IEBACiBpbnQgICAgICAgIFN0b3BTb3VuZCh2b2lkKTsKIEJPT0wgICAgICAgU3RyZXRjaEJsdChIREMsc2hvcnQsc2hvcnQsc2hvcnQsc2hvcnQsSERDLHNob3J0LHNob3J0LHNob3J0LHNob3J0LERXT1JEKTsKIGludCAgICAgICAgU3RyZXRjaERJQml0cyhIREMsV09SRCxXT1JELFdPUkQsV09SRCxXT1JELFdPUkQsV09SRCxXT1JELExQU1RSLExQQklUTUFQSU5GTyxXT1JELERXT1JEKTsKLUJPT0wgICAgICAgU3VidHJhY3RSZWN0KExQUkVDVCxMUFJFQ1QsTFBSRUNUKTsKIEJPT0wgICAgICAgU3dhcE1vdXNlQnV0dG9uKEJPT0wpOwogdm9pZCAgICAgICBTd2FwUmVjb3JkaW5nKFdPUkQpOwogdm9pZCAgICAgICBTd2l0Y2hTdGFja0JhY2sodm9pZCk7CkBAIC0zMjc3LDEwICszMzM2LDggQEAKIGludCAgICAgICAgU3luY0FsbFZvaWNlcyh2b2lkKTsKIEJPT0wgICAgICAgU3lzdGVtUGFyYW1ldGVyc0luZm8oVUlOVCxVSU5ULExQVk9JRCxVSU5UKTsKIExPTkcgICAgICAgVGFiYmVkVGV4dE91dChIREMsc2hvcnQsc2hvcnQsTFBTVFIsc2hvcnQsc2hvcnQsTFBJTlQxNixzaG9ydCk7Ci1CT09MICAgICAgIFRleHRPdXQoSERDLHNob3J0LHNob3J0LExQU1RSLHNob3J0KTsKIGludCAgICAgICAgVGhyb3coTFBDQVRDSEJVRixpbnQpOwogaW50ICAgICAgICBUb0FzY2lpKFdPUkQsV09SRCxMUFNUUixMUFZPSUQsV09SRCk7Ci1CT09MICAgICAgIFRyYWNrUG9wdXBNZW51KEhNRU5VLFVJTlQsc2hvcnQsc2hvcnQsc2hvcnQsSFdORCxMUFJFQ1QpOwogaW50ICAgICAgICBUcmFuc2xhdGVBY2NlbGVyYXRvcihIV05ELEhBTkRMRSxMUE1TRyk7CiBCT09MICAgICAgIFRyYW5zbGF0ZU1ESVN5c0FjY2VsKEhXTkQsTFBNU0cpOwogQk9PTCAgICAgICBUcmFuc2xhdGVNZXNzYWdlKExQTVNHKTsKQEAgLTMyODgsMTUgKzMzNDUsMTMgQEAKIGludCAgICAgICAgVW5nZXRDb21tQ2hhcihpbnQsY2hhcik7CiBCT09MICAgICAgIFVuaG9va1dpbmRvd3NIb29rKHNob3J0LEZBUlBST0MpOwogQk9PTCAgICAgICBVbmhvb2tXaW5kb3dzSG9va0V4KEhIT09LKTsKLUJPT0wgICAgICAgVW5pb25SZWN0KExQUkVDVCxMUFJFQ1QsTFBSRUNUKTsKIHZvaWQgICAgICAgVW5sb2NrU2VnbWVudChIR0xPQkFMKTsKIEJPT0wgICAgICAgVW5yZWFsaXplT2JqZWN0KEhCUlVTSCk7CiBpbnQgICAgICAgIFVwZGF0ZUNvbG9ycyhIREMpOwotdm9pZCAgICAgICBVcGRhdGVXaW5kb3coSFdORCk7Cit2b2lkICAgICAgIFVwZGF0ZVdpbmRvdyhIV05EMzIpOwogdm9pZCAgICAgICBWYWxpZGF0ZUNvZGVTZWdtZW50cyh2b2lkKTsKIExQU1RSICAgICAgVmFsaWRhdGVGcmVlU3BhY2VzKHZvaWQpOwotdm9pZCAgICAgICBWYWxpZGF0ZVJlY3QoSFdORCxMUFJFQ1QpOwotdm9pZCAgICAgICBWYWxpZGF0ZVJnbihIV05ELEhSR04pOwordm9pZCAgICAgICBWYWxpZGF0ZVJnbihIV05EMzIsSFJHTjMyKTsKIFdPUkQgICAgICAgVmtLZXlTY2FuKFdPUkQpOwogU0VHUFRSICAgICBXSU4xNl9HbG9iYWxMb2NrMTYoSEdMT0JBTDE2KTsKIFNFR1BUUiAgICAgV0lOMTZfTG9ja1Jlc291cmNlKEhBTkRMRSk7CkBAIC0zMzA1LDcgKzMzNjAsNiBAQAogaW50ICAgICAgICBXYWl0U291bmRTdGF0ZShpbnQpOwogSEFORExFICAgICBXaW5FeGVjKExQU1RSLFdPUkQpOwogQk9PTCAgICAgICBXaW5IZWxwKEhXTkQsTFBTVFIsV09SRCxEV09SRCk7Ci1IV05EICAgICAgIFdpbmRvd0Zyb21Qb2ludChQT0lOVCk7CiBpbnQgICAgICAgIFdyaXRlQ29tbShpbnQsTFBTVFIsaW50KTsKIHZvaWQgICAgICAgV3JpdGVPdXRQcm9maWxlcyh2b2lkKTsKIEJPT0wgICAgICAgV3JpdGVQcml2YXRlUHJvZmlsZVN0cmluZyhMUENTVFIsTFBDU1RSLExQQ1NUUixMUENTVFIpOwpAQCAtMzMzMCwxMCArMzM4NCw2NiBAQAogaW50ICAgICAgICB3c3ByaW50ZihMUFNUUixMUFNUUiwuLi4pOwogaW50ICAgICAgICB3dnNwcmludGYoTFBTVFIsTFBDU1RSLExQQ1NUUik7CiAKKy8qIERlY2xhcmF0aW9ucyBmb3IgZnVuY3Rpb25zIHRoYXQgYXJlIHRoZSBzYW1lIGluIFdpbjE2IGFuZCBXaW4zMiAqLwogCi0vKiBEZWNsYXJhdGlvbnMgZm9yIGZ1bmN0aW9ucyB0aGF0IGV4aXN0IGJvdGggaW4gV2luMTYgYW5kIFdpbjMyICovCitJTlQxNiAgICAgIEV4Y2x1ZGVVcGRhdGVSZ24oSERDMzIsSFdORDMyKTsKK3ZvaWQgICAgICAgRmlsbFdpbmRvdyhIV05EMTYsSFdORDE2LEhEQzE2LEhCUlVTSDE2KTsKK0RXT1JEICAgICAgR2V0Qml0bWFwRGltZW5zaW9uKEhCSVRNQVAxNik7CitJTlQxNiAgICAgIEdldFVwZGF0ZVJnbihIV05EMzIsSFJHTjMyLEJPT0wzMik7CitJTlQxNiAgICAgIE9mZnNldFJnbihIUkdOMzIsSU5UMzIsSU5UMzIpOworRFdPUkQgICAgICBPZmZzZXRWaWV3cG9ydE9yZyhIREMxNixJTlQxNixJTlQxNik7CitEV09SRCAgICAgIE9mZnNldFdpbmRvd09yZyhIREMxNixJTlQxNixJTlQxNik7Cit2b2lkICAgICAgIFBhaW50UmVjdChIV05EMTYsSFdORDE2LEhEQzE2LEhCUlVTSDE2LGNvbnN0IFJFQ1QxNiopOworRFdPUkQgICAgICBSZWdDbG9zZUtleShIS0VZKTsKK0RXT1JEICAgICAgUmVnRmx1c2hLZXkoSEtFWSk7CitEV09SRCAgICAgIFNjYWxlVmlld3BvcnRFeHQoSERDMTYsSU5UMTYsSU5UMTYsSU5UMTYsSU5UMTYpOworRFdPUkQgICAgICBTY2FsZVdpbmRvd0V4dChIREMxNixJTlQxNixJTlQxNixJTlQxNixJTlQxNik7CitEV09SRCAgICAgIFNldEJpdG1hcERpbWVuc2lvbihIQklUTUFQMTYsSU5UMTYsSU5UMTYpOworRFdPUkQgICAgICBTZXRWaWV3cG9ydEV4dChIREMxNixJTlQxNixJTlQxNik7CitEV09SRCAgICAgIFNldFZpZXdwb3J0T3JnKEhEQzE2LElOVDE2LElOVDE2KTsKK0RXT1JEICAgICAgU2V0V2luZG93RXh0KEhEQzE2LElOVDE2LElOVDE2KTsKK0RXT1JEICAgICAgU2V0V2luZG93T3JnKEhEQzE2LElOVDE2LElOVDE2KTsKIAotSFdORCAgICAgICBDcmVhdGVXaW5kb3cxNihTRUdQVFIsU0VHUFRSLERXT1JELElOVDE2LElOVDE2LElOVDE2LElOVDE2LEhXTkQsSE1FTlUsSElOU1RBTkNFLFNFR1BUUik7CisvKiBEZWNsYXJhdGlvbnMgZm9yIGZ1bmN0aW9ucyB0aGF0IGNoYW5nZSBiZXR3ZWVuIFdpbjE2IGFuZCBXaW4zMiAqLworCitCT09MMTYgICAgIEFkanVzdFdpbmRvd1JlY3QxNihMUFJFQ1QxNixEV09SRCxCT09MMTYpOworQk9PTDMyICAgICBBZGp1c3RXaW5kb3dSZWN0MzIoTFBSRUNUMzIsRFdPUkQsQk9PTDMyKTsKKyNkZWZpbmUgICAgQWRqdXN0V2luZG93UmVjdCBXSU5FTElCX05BTUUoQWRqdXN0V2luZG93UmVjdCkKK0JPT0wxNiAgICAgQWRqdXN0V2luZG93UmVjdEV4MTYoTFBSRUNUMTYsRFdPUkQsQk9PTDE2LERXT1JEKTsKK0JPT0wzMiAgICAgQWRqdXN0V2luZG93UmVjdEV4MzIoTFBSRUNUMzIsRFdPUkQsQk9PTDMyLERXT1JEKTsKKyNkZWZpbmUgICAgQWRqdXN0V2luZG93UmVjdEV4IFdJTkVMSUJfTkFNRShBZGp1c3RXaW5kb3dSZWN0RXgpCitIREMxNiAgICAgIEJlZ2luUGFpbnQxNihIV05EMTYsTFBQQUlOVFNUUlVDVDE2KTsKK0hEQzMyICAgICAgQmVnaW5QYWludDMyKEhXTkQzMixMUFBBSU5UU1RSVUNUMzIpOworI2RlZmluZSAgICBCZWdpblBhaW50IFdJTkVMSUJfTkFNRShCZWdpblBhaW50KQorTFJFU1VMVCAgICBDYWxsV2luZG93UHJvYzE2KFdORFBST0MxNixIV05EMTYsVUlOVDE2LFdQQVJBTTE2LExQQVJBTSk7CitMUkVTVUxUICAgIENhbGxXaW5kb3dQcm9jMzJBKFdORFBST0MzMixIV05EMzIsVUlOVDMyLFdQQVJBTTMyLExQQVJBTSk7CitMUkVTVUxUICAgIENhbGxXaW5kb3dQcm9jMzJXKFdORFBST0MzMixIV05EMzIsVUlOVDMyLFdQQVJBTTMyLExQQVJBTSk7CisjZGVmaW5lICAgIENhbGxXaW5kb3dQcm9jIFdJTkVMSUJfTkFNRV9BVyhDYWxsV2luZG93UHJvYykKK0hXTkQxNiAgICAgQ2hpbGRXaW5kb3dGcm9tUG9pbnQxNihIV05EMTYsUE9JTlQxNik7CitIV05EMzIgICAgIENoaWxkV2luZG93RnJvbVBvaW50MzIoSFdORDMyLFBPSU5UMzIpOworI2RlZmluZSAgICBDaGlsZFdpbmRvd0Zyb21Qb2ludCBXSU5FTElCX05BTUUoQ2hpbGRXaW5kb3dGcm9tUG9pbnQpCitCT09MMTYgICAgIENsaWVudFRvU2NyZWVuMTYoSFdORDE2LExQUE9JTlQxNik7CitCT09MMzIgICAgIENsaWVudFRvU2NyZWVuMzIoSFdORDMyLExQUE9JTlQzMik7CisjZGVmaW5lICAgIENsaWVudFRvU2NyZWVuIFdJTkVMSUJfTkFNRShDbGllbnRUb1NjcmVlbikKK0JPT0wxNiAgICAgQ2xpcEN1cnNvcjE2KGNvbnN0IFJFQ1QxNiopOworQk9PTDMyICAgICBDbGlwQ3Vyc29yMzIoY29uc3QgUkVDVDMyKik7CisjZGVmaW5lICAgIENsaXBDdXJzb3IgV0lORUxJQl9OQU1FKENsaXBDdXJzb3IpCitCT09MMTYgICAgIENvcHlSZWN0MTYoUkVDVDE2Kixjb25zdCBSRUNUMTYqKTsKK0JPT0wzMiAgICAgQ29weVJlY3QzMihSRUNUMzIqLGNvbnN0IFJFQ1QzMiopOworI2RlZmluZSAgICBDb3B5UmVjdCBXSU5FTElCX05BTUUoQ29weVJlY3QpCitIUkdOMTYgICAgIENyZWF0ZUVsbGlwdGljUmduSW5kaXJlY3QxNihjb25zdCBSRUNUMTYgKik7CitIUkdOMzIgICAgIENyZWF0ZUVsbGlwdGljUmduSW5kaXJlY3QzMihjb25zdCBSRUNUMzIgKik7CisjZGVmaW5lICAgIENyZWF0ZUVsbGlwdGljUmduSW5kaXJlY3QgV0lORUxJQl9OQU1FKENyZWF0ZUVsbGlwdGljUmduSW5kaXJlY3QpCitIUkdOMTYgICAgIENyZWF0ZVBvbHlQb2x5Z29uUmduMTYoY29uc3QgUE9JTlQxNiosY29uc3QgSU5UMTYqLElOVDE2LElOVDE2KTsKK0hSR04zMiAgICAgQ3JlYXRlUG9seVBvbHlnb25SZ24zMihjb25zdCBQT0lOVDMyKixjb25zdCBJTlQzMiosSU5UMzIsSU5UMzIpOworI2RlZmluZSAgICBDcmVhdGVQb2x5UG9seWdvblJnbiBXSU5FTElCX05BTUUoQ3JlYXRlUG9seVBvbHlnb25SZ24pCitIUkdOMTYgICAgIENyZWF0ZVBvbHlnb25SZ24xNihjb25zdCBQT0lOVDE2KixJTlQxNixJTlQxNik7CitIUkdOMzIgICAgIENyZWF0ZVBvbHlnb25SZ24zMihjb25zdCBQT0lOVDMyKixJTlQzMixJTlQzMik7CisjZGVmaW5lICAgIENyZWF0ZVBvbHlnb25SZ24gV0lORUxJQl9OQU1FKENyZWF0ZVBvbHlnb25SZ24pCitIUkdOMTYgICAgIENyZWF0ZVJlY3RSZ25JbmRpcmVjdDE2KGNvbnN0IFJFQ1QxNiopOworSFJHTjMyICAgICBDcmVhdGVSZWN0UmduSW5kaXJlY3QzMihjb25zdCBSRUNUMzIqKTsKKyNkZWZpbmUgICAgQ3JlYXRlUmVjdFJnbkluZGlyZWN0IFdJTkVMSUJfTkFNRShDcmVhdGVSZWN0UmduSW5kaXJlY3QpCitIV05EMTYgICAgIENyZWF0ZVdpbmRvdzE2KFNFR1BUUixTRUdQVFIsRFdPUkQsSU5UMTYsSU5UMTYsSU5UMTYsSU5UMTYsSFdORDE2LEhNRU5VMTYsSElOU1RBTkNFMTYsU0VHUFRSKTsKICNkZWZpbmUgICAgQ3JlYXRlV2luZG93MzJBKGNsYXNzTmFtZSx0aXRsZU5hbWUsc3R5bGUseCx5LHdpZHRoLGhlaWdodCxcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQsbWVudSxpbnN0YW5jZSxwYXJhbSkgXAogICAgICAgICAgICBDcmVhdGVXaW5kb3dFeDMyQSgwLGNsYXNzTmFtZSx0aXRsZU5hbWUsc3R5bGUseCx5LHdpZHRoLGhlaWdodCxcCkBAIC0zMzQzLDEwICszNDUzLDExOSBAQAogICAgICAgICAgICBDcmVhdGVXaW5kb3dFeDMyVygwLGNsYXNzTmFtZSx0aXRsZU5hbWUsc3R5bGUseCx5LHdpZHRoLGhlaWdodCxcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQsbWVudSxpbnN0YW5jZSxwYXJhbSkKICNkZWZpbmUgICAgQ3JlYXRlV2luZG93IFdJTkVMSUJfTkFNRV9BVyhDcmVhdGVXaW5kb3cpCi1IV05EICAgICAgIENyZWF0ZVdpbmRvd0V4MTYoRFdPUkQsU0VHUFRSLFNFR1BUUixEV09SRCxJTlQxNixJTlQxNixJTlQxNixJTlQxNixIV05ELEhNRU5VLEhJTlNUQU5DRSxTRUdQVFIpOworSFdORDE2ICAgICBDcmVhdGVXaW5kb3dFeDE2KERXT1JELFNFR1BUUixTRUdQVFIsRFdPUkQsSU5UMTYsSU5UMTYsSU5UMTYsSU5UMTYsSFdORDE2LEhNRU5VMTYsSElOU1RBTkNFMTYsU0VHUFRSKTsKIEhXTkQzMiAgICAgQ3JlYXRlV2luZG93RXgzMkEoRFdPUkQsTFBDU1RSLExQQ1NUUixEV09SRCxJTlQzMixJTlQzMixJTlQzMixJTlQzMixIV05EMzIsSE1FTlUzMixISU5TVEFOQ0UzMixMUFZPSUQpOwogSFdORDMyICAgICBDcmVhdGVXaW5kb3dFeDMyVyhEV09SRCxMUENXU1RSLExQQ1dTVFIsRFdPUkQsSU5UMzIsSU5UMzIsSU5UMzIsSU5UMzIsSFdORDMyLEhNRU5VMzIsSElOU1RBTkNFMzIsTFBWT0lEKTsKICNkZWZpbmUgICAgQ3JlYXRlV2luZG93RXggV0lORUxJQl9OQU1FX0FXKENyZWF0ZVdpbmRvd0V4KQorQk9PTDE2ICAgICBEUHRvTFAxNihIREMxNixMUFBPSU5UMTYsSU5UMTYpOworQk9PTDMyICAgICBEUHRvTFAzMihIREMzMixMUFBPSU5UMzIsSU5UMzIpOworI2RlZmluZSAgICBEUHRvTFAgV0lORUxJQl9OQU1FKERQdG9MUCkKK3ZvaWQgICAgICAgRHJhd0ZvY3VzUmVjdDE2KEhEQzE2LGNvbnN0IFJFQ1QxNiopOwordm9pZCAgICAgICBEcmF3Rm9jdXNSZWN0MzIoSERDMzIsY29uc3QgUkVDVDMyKik7CisjZGVmaW5lICAgIERyYXdGb2N1c1JlY3QgV0lORUxJQl9OQU1FKERyYXdGb2N1c1JlY3QpCitJTlQxNiAgICAgIERyYXdUZXh0MTYoSERDMTYsTFBDU1RSLElOVDE2LExQUkVDVDE2LFVJTlQxNik7CitJTlQzMiAgICAgIERyYXdUZXh0MzJBKEhEQzMyLExQQ1NUUixJTlQzMixMUFJFQ1QzMixVSU5UMzIpOworSU5UMzIgICAgICBEcmF3VGV4dDMyVyhIREMzMixMUENXU1RSLElOVDMyLExQUkVDVDMyLFVJTlQzMik7CisjZGVmaW5lICAgIERyYXdUZXh0IFdJTkVMSUJfTkFNRV9BVyhEcmF3VGV4dCkKK0JPT0wxNiAgICAgRW5kUGFpbnQxNihIV05EMTYsY29uc3QgUEFJTlRTVFJVQ1QxNiopOworQk9PTDMyICAgICBFbmRQYWludDMyKEhXTkQzMixjb25zdCBQQUlOVFNUUlVDVDMyKik7CisjZGVmaW5lICAgIEVuZFBhaW50IFdJTkVMSUJfTkFNRShFbmRQYWludCkKK0JPT0wxNiAgICAgRXF1YWxSZWN0MTYoY29uc3QgUkVDVDE2Kixjb25zdCBSRUNUMTYqKTsKK0JPT0wzMiAgICAgRXF1YWxSZWN0MzIoY29uc3QgUkVDVDMyKixjb25zdCBSRUNUMzIqKTsKKyNkZWZpbmUgICAgRXF1YWxSZWN0IFdJTkVMSUJfTkFNRShFcXVhbFJlY3QpCitCT09MMTYgICAgIEV4dFRleHRPdXQxNihIREMxNixJTlQxNixJTlQxNixVSU5UMTYsY29uc3QgUkVDVDE2KixMUENTVFIsVUlOVDE2LGNvbnN0IElOVDE2Kik7CitCT09MMzIgICAgIEV4dFRleHRPdXQzMkEoSERDMzIsSU5UMzIsSU5UMzIsVUlOVDMyLGNvbnN0IFJFQ1QzMiosTFBDU1RSLFVJTlQzMixjb25zdCBJTlQzMiopOworQk9PTDMyICAgICBFeHRUZXh0T3V0MzJXKEhEQzMyLElOVDMyLElOVDMyLFVJTlQzMixjb25zdCBSRUNUMzIqLExQQ1dTVFIsVUlOVDMyLGNvbnN0IElOVDMyKik7CisjZGVmaW5lICAgIEV4dFRleHRPdXQgV0lORUxJQl9OQU1FX0FXKEV4dFRleHRPdXQpCitJTlQxNiAgICAgIEZpbGxSZWN0MTYoSERDMTYsY29uc3QgUkVDVDE2KixIQlJVU0gxNik7CitJTlQzMiAgICAgIEZpbGxSZWN0MzIoSERDMzIsY29uc3QgUkVDVDMyKixIQlJVU0gzMik7CisjZGVmaW5lICAgIEZpbGxSZWN0IFdJTkVMSUJfTkFNRShGaWxsUmVjdCkKK0hXTkQgICAgICAgRmluZFdpbmRvdzE2KFNFR1BUUixMUENTVFIpOworSFdORCAgICAgICBGaW5kV2luZG93MzJBKExQQ1NUUixMUENTVFIpOworSFdORCAgICAgICBGaW5kV2luZG93MzJXKExQQ1dTVFIsTFBDV1NUUik7CisjZGVmaW5lICAgIEZpbmRXaW5kb3cgV0lORUxJQl9OQU1FX0FXKEZpbmRXaW5kb3cpCitIV05EICAgICAgIEZpbmRXaW5kb3dFeDE2KEhXTkQsSFdORCxTRUdQVFIsTFBDU1RSKTsKK0hXTkQgICAgICAgRmluZFdpbmRvd0V4MzJBKEhXTkQsSFdORCxMUENTVFIsTFBDU1RSKTsKK0hXTkQgICAgICAgRmluZFdpbmRvd0V4MzJXKEhXTkQsSFdORCxMUENXU1RSLExQQ1dTVFIpOworI2RlZmluZSAgICBGaW5kV2luZG93RXggV0lORUxJQl9OQU1FX0FXKEZpbmRXaW5kb3dFeCkKK0lOVDE2ICAgICAgRnJhbWVSZWN0MTYoSERDMTYsY29uc3QgUkVDVDE2KixIQlJVU0gxNik7CitJTlQzMiAgICAgIEZyYW1lUmVjdDMyKEhEQzMyLGNvbnN0IFJFQ1QzMiosSEJSVVNIMzIpOworI2RlZmluZSAgICBGcmFtZVJlY3QgV0lORUxJQl9OQU1FKEZyYW1lUmVjdCkKK0JPT0wxNiAgICAgR2V0Qml0bWFwRGltZW5zaW9uRXgxNihIQklUTUFQMTYsTFBTSVpFMTYpOworQk9PTDMyICAgICBHZXRCaXRtYXBEaW1lbnNpb25FeDMyKEhCSVRNQVAzMixMUFNJWkUzMik7CisjZGVmaW5lICAgIEdldEJpdG1hcERpbWVuc2lvbkV4IFdJTkVMSUJfTkFNRShHZXRCaXRtYXBEaW1lbnNpb25FeCkKK0JPT0wxNiAgICAgR2V0QnJ1c2hPcmdFeDE2KEhEQzE2LExQUE9JTlQxNik7CitCT09MMzIgICAgIEdldEJydXNoT3JnRXgzMihIREMzMixMUFBPSU5UMzIpOworI2RlZmluZSAgICBHZXRCcnVzaE9yZ0V4IFdJTkVMSUJfTkFNRShHZXRCcnVzaE9yZ0V4KQordm9pZCAgICAgICBHZXRDYXJldFBvczE2KExQUE9JTlQxNik7Cit2b2lkICAgICAgIEdldENhcmV0UG9zMzIoTFBQT0lOVDMyKTsKKyNkZWZpbmUgICAgR2V0Q2FyZXRQb3MgV0lORUxJQl9OQU1FKEdldENhcmV0UG9zKQorQk9PTCAgICAgICBHZXRDbGFzc0luZm8xNihISU5TVEFOQ0UxNixTRUdQVFIsV05EQ0xBU1MxNiAqKTsKK0JPT0wgICAgICAgR2V0Q2xhc3NJbmZvMzJBKEhJTlNUQU5DRTMyLExQQ1NUUixXTkRDTEFTUzMyQSAqKTsKK0JPT0wgICAgICAgR2V0Q2xhc3NJbmZvMzJXKEhJTlNUQU5DRTMyLExQQ1dTVFIsV05EQ0xBU1MzMlcgKik7CisjZGVmaW5lICAgIEdldENsYXNzSW5mbyBXSU5FTElCX05BTUVfQVcoR2V0Q2xhc3NJbmZvKQorQk9PTCAgICAgICBHZXRDbGFzc0luZm9FeDE2KEhJTlNUQU5DRTE2LFNFR1BUUixXTkRDTEFTU0VYMTYgKik7CitCT09MICAgICAgIEdldENsYXNzSW5mb0V4MzJBKEhJTlNUQU5DRTMyLExQQ1NUUixXTkRDTEFTU0VYMzJBICopOworQk9PTCAgICAgICBHZXRDbGFzc0luZm9FeDMyVyhISU5TVEFOQ0UzMixMUENXU1RSLFdORENMQVNTRVgzMlcgKik7CisjZGVmaW5lICAgIEdldENsYXNzSW5mb0V4IFdJTkVMSUJfTkFNRV9BVyhHZXRDbGFzc0luZm9FeCkKK0xPTkcgICAgICAgR2V0Q2xhc3NMb25nMTYoSFdORCxJTlQxNik7CitMT05HICAgICAgIEdldENsYXNzTG9uZzMyQShIV05ELElOVDMyKTsKK0xPTkcgICAgICAgR2V0Q2xhc3NMb25nMzJXKEhXTkQsSU5UMzIpOworI2RlZmluZSAgICBHZXRDbGFzc0xvbmcgV0lORUxJQl9OQU1FX0FXKEdldENsYXNzTG9uZykKK0lOVDE2ICAgICAgR2V0Q2xhc3NOYW1lMTYoSFdORCxMUFNUUixJTlQxNik7CitJTlQzMiAgICAgIEdldENsYXNzTmFtZTMyQShIV05ELExQU1RSLElOVDMyKTsKK0lOVDMyICAgICAgR2V0Q2xhc3NOYW1lMzJXKEhXTkQsTFBXU1RSLElOVDMyKTsKKyNkZWZpbmUgICAgR2V0Q2xhc3NOYW1lIFdJTkVMSUJfTkFNRV9BVyhHZXRDbGFzc05hbWUpCit2b2lkICAgICAgIEdldENsaWVudFJlY3QxNihIV05EMTYsTFBSRUNUMTYpOwordm9pZCAgICAgICBHZXRDbGllbnRSZWN0MzIoSFdORDMyLExQUkVDVDMyKTsKKyNkZWZpbmUgICAgR2V0Q2xpZW50UmVjdCBXSU5FTElCX05BTUUoR2V0Q2xpZW50UmVjdCkKK0lOVDE2ICAgICAgR2V0Q2xpcEJveDE2KEhEQzE2LExQUkVDVDE2KTsKK0lOVDMyICAgICAgR2V0Q2xpcEJveDMyKEhEQzMyLExQUkVDVDMyKTsKKyNkZWZpbmUgICAgR2V0Q2xpcEJveCBXSU5FTElCX05BTUUoR2V0Q2xpcEJveCkKK3ZvaWQgICAgICAgR2V0Q2xpcEN1cnNvcjE2KExQUkVDVDE2KTsKK3ZvaWQgICAgICAgR2V0Q2xpcEN1cnNvcjMyKExQUkVDVDMyKTsKKyNkZWZpbmUgICAgR2V0Q2xpcEN1cnNvciBXSU5FTElCX05BTUUoR2V0Q2xpcEN1cnNvcikKK0JPT0wxNiAgICAgR2V0Q3VycmVudFBvc2l0aW9uRXgxNihIREMxNixMUFBPSU5UMTYpOworQk9PTDMyICAgICBHZXRDdXJyZW50UG9zaXRpb25FeDMyKEhEQzMyLExQUE9JTlQzMik7CisjZGVmaW5lICAgIEdldEN1cnJlbnRQb3NpdGlvbkV4IFdJTkVMSUJfTkFNRShHZXRDdXJyZW50UG9zaXRpb25FeCkKK3ZvaWQgICAgICAgR2V0Q3Vyc29yUG9zMTYoTFBQT0lOVDE2KTsKK3ZvaWQgICAgICAgR2V0Q3Vyc29yUG9zMzIoTFBQT0lOVDMyKTsKKyNkZWZpbmUgICAgR2V0Q3Vyc29yUG9zIFdJTkVMSUJfTkFNRShHZXRDdXJzb3JQb3MpCitVSU5UMTYgICAgIEdldEludGVybmFsV2luZG93UG9zMTYoSFdORDE2LExQUkVDVDE2LExQUE9JTlQxNik7CitVSU5UMzIgICAgIEdldEludGVybmFsV2luZG93UG9zMzIoSFdORDMyLExQUkVDVDMyLExQUE9JTlQzMik7CisjZGVmaW5lICAgIEdldEludGVybmFsV2luZG93UG9zIFdJTkVMSUJfTkFNRShHZXRJbnRlcm5hbFdpbmRvd1BvcykKK0lOVDE2ICAgICAgR2V0UmduQm94MTYoSFJHTjE2LExQUkVDVDE2KTsKK0lOVDMyICAgICAgR2V0UmduQm94MzIoSFJHTjMyLExQUkVDVDMyKTsKKyNkZWZpbmUgICAgR2V0UmduQm94IFdJTkVMSUJfTkFNRShHZXRSZ25Cb3gpCitCT09MMTYgICAgIEdldFRleHRFeHRlbnRQb2ludDE2KEhEQzE2LExQQ1NUUixJTlQxNixMUFNJWkUxNik7CitCT09MMzIgICAgIEdldFRleHRFeHRlbnRQb2ludDMyQShIREMzMixMUENTVFIsSU5UMzIsTFBTSVpFMzIpOworQk9PTDMyICAgICBHZXRUZXh0RXh0ZW50UG9pbnQzMlcoSERDMzIsTFBDV1NUUixJTlQzMixMUFNJWkUzMik7CisjZGVmaW5lICAgIEdldFRleHRFeHRlbnRQb2ludCBXSU5FTElCX05BTUVfQVcoR2V0VGV4dEV4dGVudFBvaW50KQorQk9PTDE2ICAgICBHZXRVcGRhdGVSZWN0MTYoSFdORDE2LExQUkVDVDE2LEJPT0wxNik7CitCT09MMzIgICAgIEdldFVwZGF0ZVJlY3QzMihIV05EMzIsTFBSRUNUMzIsQk9PTDMyKTsKKyNkZWZpbmUgICAgR2V0VXBkYXRlUmVjdCBXSU5FTElCX05BTUUoR2V0VXBkYXRlUmVjdCkKK0JPT0wxNiAgICAgR2V0Vmlld3BvcnRFeHRFeDE2KEhEQzE2LExQUE9JTlQxNik7CitCT09MMzIgICAgIEdldFZpZXdwb3J0RXh0RXgzMihIREMzMixMUFBPSU5UMzIpOworI2RlZmluZSAgICBHZXRWaWV3cG9ydEV4dEV4IFdJTkVMSUJfTkFNRShHZXRWaWV3cG9ydEV4dEV4KQorQk9PTDE2ICAgICBHZXRWaWV3cG9ydE9yZ0V4MTYoSERDMTYsTFBQT0lOVDE2KTsKK0JPT0wzMiAgICAgR2V0Vmlld3BvcnRPcmdFeDMyKEhEQzMyLExQUE9JTlQzMik7CisjZGVmaW5lICAgIEdldFZpZXdwb3J0T3JnRXggV0lORUxJQl9OQU1FKEdldFZpZXdwb3J0T3JnRXgpCitCT09MMTYgICAgIEdldFdpbmRvd0V4dEV4MTYoSERDMTYsTFBQT0lOVDE2KTsKK0JPT0wzMiAgICAgR2V0V2luZG93RXh0RXgzMihIREMzMixMUFBPSU5UMzIpOworI2RlZmluZSAgICBHZXRXaW5kb3dFeHRFeCBXSU5FTElCX05BTUUoR2V0V2luZG93RXh0RXgpCitCT09MMTYgICAgIEdldFdpbmRvd09yZ0V4MTYoSERDMTYsTFBQT0lOVDE2KTsKK0JPT0wzMiAgICAgR2V0V2luZG93T3JnRXgzMihIREMzMixMUFBPSU5UMzIpOworI2RlZmluZSAgICBHZXRXaW5kb3dPcmdFeCBXSU5FTElCX05BTUUoR2V0V2luZG93T3JnRXgpCitCT09MMTYgICAgIEdldFdpbmRvd1BsYWNlbWVudDE2KEhXTkQxNixMUFdJTkRPV1BMQUNFTUVOVDE2KTsKK0JPT0wzMiAgICAgR2V0V2luZG93UGxhY2VtZW50MzIoSFdORDMyLExQV0lORE9XUExBQ0VNRU5UMzIpOworI2RlZmluZSAgICBHZXRXaW5kb3dQbGFjZW1lbnQgV0lORUxJQl9OQU1FKEdldFdpbmRvd1BsYWNlbWVudCkKK3ZvaWQgICAgICAgR2V0V2luZG93UmVjdDE2KEhXTkQxNixMUFJFQ1QxNik7Cit2b2lkICAgICAgIEdldFdpbmRvd1JlY3QzMihIV05EMzIsTFBSRUNUMzIpOworI2RlZmluZSAgICBHZXRXaW5kb3dSZWN0IFdJTkVMSUJfTkFNRShHZXRXaW5kb3dSZWN0KQorQVRPTSAgICAgICBHbG9iYWxBZGRBdG9tMTYoU0VHUFRSKTsKK0FUT00gICAgICAgR2xvYmFsQWRkQXRvbTMyQShMUENTVFIpOworQVRPTSAgICAgICBHbG9iYWxBZGRBdG9tMzJXKExQQ1dTVFIpOworI2RlZmluZSAgICBHbG9iYWxBZGRBdG9tIFdJTkVMSUJfTkFNRV9BVyhHbG9iYWxBZGRBdG9tKQogSEdMT0JBTDE2ICBHbG9iYWxBbGxvYzE2KFVJTlQxNixEV09SRCk7CiBIR0xPQkFMMzIgIEdsb2JhbEFsbG9jMzIoVUlOVDMyLERXT1JEKTsKICNkZWZpbmUgICAgR2xvYmFsQWxsb2MgV0lORUxJQl9OQU1FKEdsb2JhbEFsbG9jKQpAQCAtMzM1Niw5ICszNTc1LDE3IEBACiBVSU5UMTYgICAgIEdsb2JhbEZsYWdzMTYoSEdMT0JBTDE2KTsKIFVJTlQzMiAgICAgR2xvYmFsRmxhZ3MzMihIR0xPQkFMMzIpOwogI2RlZmluZSAgICBHbG9iYWxGbGFncyBXSU5FTElCX05BTUUoR2xvYmFsRmxhZ3MpCitBVE9NICAgICAgIEdsb2JhbEZpbmRBdG9tMTYoU0VHUFRSKTsKK0FUT00gICAgICAgR2xvYmFsRmluZEF0b20zMkEoTFBDU1RSKTsKK0FUT00gICAgICAgR2xvYmFsRmluZEF0b20zMlcoTFBDV1NUUik7CisjZGVmaW5lICAgIEdsb2JhbEZpbmRBdG9tIFdJTkVMSUJfTkFNRV9BVyhHbG9iYWxGaW5kQXRvbSkKIEhHTE9CQUwxNiAgR2xvYmFsRnJlZTE2KEhHTE9CQUwxNik7CiBIR0xPQkFMMzIgIEdsb2JhbEZyZWUzMihIR0xPQkFMMzIpOwogI2RlZmluZSAgICBHbG9iYWxGcmVlIFdJTkVMSUJfTkFNRShHbG9iYWxGcmVlKQorVUlOVDE2ICAgICBHbG9iYWxHZXRBdG9tTmFtZTE2KEFUT00sTFBTVFIsSU5UMTYpOworVUlOVDMyICAgICBHbG9iYWxHZXRBdG9tTmFtZTMyQShBVE9NLExQU1RSLElOVDMyKTsKK1VJTlQzMiAgICAgR2xvYmFsR2V0QXRvbU5hbWUzMlcoQVRPTSxMUFdTVFIsSU5UMzIpOworI2RlZmluZSAgICBHbG9iYWxHZXRBdG9tTmFtZSBXSU5FTElCX05BTUVfQVcoR2xvYmFsR2V0QXRvbU5hbWUpCiBEV09SRCAgICAgIEdsb2JhbEhhbmRsZTE2KFdPUkQpOwogSEdMT0JBTDMyICBHbG9iYWxIYW5kbGUzMihMUENWT0lEKTsKICNkZWZpbmUgICAgR2xvYmFsSGFuZGxlIFdJTkVMSUJfTkFNRShHbG9iYWxIYW5kbGUpCkBAIC0zMzcxLDkgKzM1OTgsMjQgQEAKIERXT1JEICAgICAgR2xvYmFsU2l6ZTE2KEhHTE9CQUwxNik7CiBEV09SRCAgICAgIEdsb2JhbFNpemUzMihIR0xPQkFMMzIpOwogI2RlZmluZSAgICBHbG9iYWxTaXplIFdJTkVMSUJfTkFNRShHbG9iYWxTaXplKQotQk9PTCAgICAgICBHbG9iYWxVbmxvY2sxNihIR0xPQkFMMTYpOwotQk9PTCAgICAgICBHbG9iYWxVbmxvY2szMihIR0xPQkFMMzIpOworQk9PTDE2ICAgICBHbG9iYWxVbmxvY2sxNihIR0xPQkFMMTYpOworQk9PTDMyICAgICBHbG9iYWxVbmxvY2szMihIR0xPQkFMMzIpOwogI2RlZmluZSAgICBHbG9iYWxVbmxvY2sgV0lORUxJQl9OQU1FKEdsb2JhbFVubG9jaykKK3ZvaWQgICAgICAgSW5mbGF0ZVJlY3QxNihMUFJFQ1QxNixJTlQxNixJTlQxNik7Cit2b2lkICAgICAgIEluZmxhdGVSZWN0MzIoTFBSRUNUMzIsSU5UMzIsSU5UMzIpOworI2RlZmluZSAgICBJbmZsYXRlUmVjdCBXSU5FTElCX05BTUUoSW5mbGF0ZVJlY3QpCitCT09MMTYgICAgIEludGVyc2VjdFJlY3QxNihMUFJFQ1QxNixjb25zdCBSRUNUMTYqLGNvbnN0IFJFQ1QxNiopOworQk9PTDMyICAgICBJbnRlcnNlY3RSZWN0MzIoTFBSRUNUMzIsY29uc3QgUkVDVDMyKixjb25zdCBSRUNUMzIqKTsKKyNkZWZpbmUgICAgSW50ZXJzZWN0UmVjdCBXSU5FTElCX05BTUUoSW50ZXJzZWN0UmVjdCkKK3ZvaWQgICAgICAgSW52YWxpZGF0ZVJlY3QxNihIV05EMTYsY29uc3QgUkVDVDE2KixCT09MMTYpOwordm9pZCAgICAgICBJbnZhbGlkYXRlUmVjdDMyKEhXTkQzMixjb25zdCBSRUNUMzIqLEJPT0wzMik7CisjZGVmaW5lICAgIEludmFsaWRhdGVSZWN0IFdJTkVMSUJfTkFNRShJbnZhbGlkYXRlUmVjdCkKK3ZvaWQgICAgICAgSW52ZXJ0UmVjdDE2KEhEQzE2LGNvbnN0IFJFQ1QxNiopOwordm9pZCAgICAgICBJbnZlcnRSZWN0MzIoSERDMzIsY29uc3QgUkVDVDMyKik7CisjZGVmaW5lICAgIEludmVydFJlY3QgV0lORUxJQl9OQU1FKEludmVydFJlY3QpCitCT09MMTYgICAgIElzUmVjdEVtcHR5MTYoY29uc3QgUkVDVDE2Kik7CitCT09MMzIgICAgIElzUmVjdEVtcHR5MzIoY29uc3QgUkVDVDMyKik7CisjZGVmaW5lICAgIElzUmVjdEVtcHR5IFdJTkVMSUJfTkFNRShJc1JlY3RFbXB0eSkKIEhMT0NBTDE2ICAgTG9jYWxBbGxvYzE2KFVJTlQxNixXT1JEKTsKIEhMT0NBTDMyICAgTG9jYWxBbGxvYzMyKFVJTlQzMixEV09SRCk7CiAjZGVmaW5lICAgIExvY2FsQWxsb2MgV0lORUxJQl9OQU1FKExvY2FsQWxsb2MpCkBAIC0zNDAxLDEyICszNjQzLDE4OSBAQAogVUlOVDE2ICAgICBMb2NhbFNpemUxNihITE9DQUwxNik7CiBVSU5UMzIgICAgIExvY2FsU2l6ZTMyKEhMT0NBTDMyKTsKICNkZWZpbmUgICAgTG9jYWxTaXplIFdJTkVMSUJfTkFNRShMb2NhbFNpemUpCi1CT09MICAgICAgIExvY2FsVW5sb2NrMTYoSExPQ0FMMTYpOwotQk9PTCAgICAgICBMb2NhbFVubG9jazMyKEhMT0NBTDMyKTsKK0JPT0wxNiAgICAgTG9jYWxVbmxvY2sxNihITE9DQUwxNik7CitCT09MMzIgICAgIExvY2FsVW5sb2NrMzIoSExPQ0FMMzIpOwogI2RlZmluZSAgICBMb2NhbFVubG9jayBXSU5FTElCX05BTUUoTG9jYWxVbmxvY2spCitCT09MMTYgICAgIExQdG9EUDE2KEhEQzE2LExQUE9JTlQxNixJTlQxNik7CitCT09MMzIgICAgIExQdG9EUDMyKEhEQzMyLExQUE9JTlQzMixJTlQzMik7CisjZGVmaW5lICAgIExQdG9EUCBXSU5FTElCX05BTUUoTFB0b0RQKQordm9pZCAgICAgICBNYXBEaWFsb2dSZWN0MTYoSFdORDE2LExQUkVDVDE2KTsKK3ZvaWQgICAgICAgTWFwRGlhbG9nUmVjdDMyKEhXTkQzMixMUFJFQ1QzMik7CisjZGVmaW5lICAgIE1hcERpYWxvZ1JlY3QgV0lORUxJQl9OQU1FKE1hcERpYWxvZ1JlY3QpCit2b2lkICAgICAgIE1hcFdpbmRvd1BvaW50czE2KEhXTkQxNixIV05EMTYsTFBQT0lOVDE2LFVJTlQxNik7Cit2b2lkICAgICAgIE1hcFdpbmRvd1BvaW50czMyKEhXTkQzMixIV05EMzIsTFBQT0lOVDMyLFVJTlQzMik7CisjZGVmaW5lICAgIE1hcFdpbmRvd1BvaW50cyBXSU5FTElCX05BTUUoTWFwV2luZG93UG9pbnRzKQorQk9PTDE2ICAgICBNb3ZlVG9FeDE2KEhEQzE2LElOVDE2LElOVDE2LExQUE9JTlQxNik7CitCT09MMzIgICAgIE1vdmVUb0V4MzIoSERDMzIsSU5UMzIsSU5UMzIsTFBQT0lOVDMyKTsKKyNkZWZpbmUgICAgTW92ZVRvRXggV0lORUxJQl9OQU1FKE1vdmVUb0V4KQogSU5UMTYgICAgICBNdWxEaXYxNihJTlQxNixJTlQxNixJTlQxNik7CiBJTlQzMiAgICAgIE11bERpdjMyKElOVDMyLElOVDMyLElOVDMyKTsKICNkZWZpbmUgICAgTXVsRGl2IFdJTkVMSUJfTkFNRShNdWxEaXYpCit2b2lkICAgICAgIE9mZnNldFJlY3QxNihMUFJFQ1QxNixJTlQxNixJTlQxNik7Cit2b2lkICAgICAgIE9mZnNldFJlY3QzMihMUFJFQ1QzMixJTlQzMixJTlQzMik7CisjZGVmaW5lICAgIE9mZnNldFJlY3QgV0lORUxJQl9OQU1FKE9mZnNldFJlY3QpCitCT09MMTYgICAgIE9mZnNldFZpZXdwb3J0T3JnRXgxNihIREMxNixJTlQxNixJTlQxNixMUFBPSU5UMTYpOworQk9PTDMyICAgICBPZmZzZXRWaWV3cG9ydE9yZ0V4MzIoSERDMzIsSU5UMzIsSU5UMzIsTFBQT0lOVDMyKTsKKyNkZWZpbmUgICAgT2Zmc2V0Vmlld3BvcnRPcmdFeCBXSU5FTElCX05BTUUoT2Zmc2V0Vmlld3BvcnRPcmdFeCkKK0JPT0wxNiAgICAgT2Zmc2V0V2luZG93T3JnRXgxNihIREMxNixJTlQxNixJTlQxNixMUFBPSU5UMTYpOworQk9PTDMyICAgICBPZmZzZXRXaW5kb3dPcmdFeDMyKEhEQzMyLElOVDMyLElOVDMyLExQUE9JTlQzMik7CisjZGVmaW5lICAgIE9mZnNldFdpbmRvd09yZ0V4IFdJTkVMSUJfTkFNRShPZmZzZXRXaW5kb3dPcmdFeCkKK0JPT0wxNiAgICAgUG9seVBvbHlnb24xNihIREMxNixMUFBPSU5UMTYsTFBJTlQxNixVSU5UMTYpOworQk9PTDMyICAgICBQb2x5UG9seWdvbjMyKEhEQzMyLExQUE9JTlQzMixMUElOVDMyLFVJTlQzMik7CisjZGVmaW5lICAgIFBvbHlQb2x5Z29uIFdJTkVMSUJfTkFNRShQb2x5UG9seWdvbikKK0JPT0wxNiAgICAgUG9seWdvbjE2KEhEQzE2LExQUE9JTlQxNixJTlQxNik7CitCT09MMzIgICAgIFBvbHlnb24zMihIREMzMixMUFBPSU5UMzIsSU5UMzIpOworI2RlZmluZSAgICBQb2x5Z29uIFdJTkVMSUJfTkFNRShQb2x5Z29uKQorQk9PTDE2ICAgICBQb2x5bGluZTE2KEhEQzE2LExQUE9JTlQxNixJTlQxNik7CitCT09MMzIgICAgIFBvbHlsaW5lMzIoSERDMzIsTFBQT0lOVDMyLElOVDMyKTsKKyNkZWZpbmUgICAgUG9seWxpbmUgV0lORUxJQl9OQU1FKFBvbHlsaW5lKQorQk9PTDE2ICAgICBQdEluUmVjdDE2KGNvbnN0IFJFQ1QxNiosUE9JTlQxNik7CitCT09MMzIgICAgIFB0SW5SZWN0MzIoY29uc3QgUkVDVDMyKixQT0lOVDMyKTsKKyNkZWZpbmUgICAgUHRJblJlY3QgV0lORUxJQl9OQU1FKFB0SW5SZWN0KQorQk9PTDE2ICAgICBSZWN0SW5SZWdpb24xNihIUkdOMTYsY29uc3QgUkVDVDE2ICopOworQk9PTDMyICAgICBSZWN0SW5SZWdpb24zMihIUkdOMzIsY29uc3QgUkVDVDMyICopOworI2RlZmluZSAgICBSZWN0SW5SZWdpb24gV0lORUxJQl9OQU1FKFJlY3RJblJlZ2lvbikKK0JPT0wxNiAgICAgUmVjdFZpc2libGUxNihIREMxNixMUFJFQ1QxNik7CitCT09MMzIgICAgIFJlY3RWaXNpYmxlMzIoSERDMzIsTFBSRUNUMzIpOworI2RlZmluZSAgICBSZWN0VmlzaWJsZSBXSU5FTElCX05BTUUoUmVjdFZpc2libGUpCitCT09MMTYgICAgIFJlZHJhd1dpbmRvdzE2KEhXTkQxNixjb25zdCBSRUNUMTYqLEhSR04xNixVSU5UMTYpOworQk9PTDMyICAgICBSZWRyYXdXaW5kb3czMihIV05EMzIsY29uc3QgUkVDVDMyKixIUkdOMzIsVUlOVDMyKTsKKyNkZWZpbmUgICAgUmVkcmF3V2luZG93IFdJTkVMSUJfTkFNRShSZWRyYXdXaW5kb3cpCitEV09SRCAgICAgIFJlZ0NyZWF0ZUtleTE2KEhLRVksTFBDU1RSLExQSEtFWSk7CitEV09SRCAgICAgIFJlZ0NyZWF0ZUtleTMyQShIS0VZLExQQ1NUUixMUEhLRVkpOworRFdPUkQgICAgICBSZWdDcmVhdGVLZXkzMlcoSEtFWSxMUENXU1RSLExQSEtFWSk7CisjZGVmaW5lICAgIFJlZ0NyZWF0ZUtleSBXSU5FTElCX05BTUVfQVcoUmVnQ3JlYXRlS2V5KQorRFdPUkQgICAgICBSZWdDcmVhdGVLZXlFeDMyQShIS0VZLExQQ1NUUixEV09SRCxMUFNUUixEV09SRCxSRUdTQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQU0VDVVJJVFlfQVRUUklCVVRFUyxMUEhLRVksTFBEV09SRCk7CitEV09SRCAgICAgIFJlZ0NyZWF0ZUtleUV4MzJXKEhLRVksTFBDV1NUUixEV09SRCxMUFdTVFIsRFdPUkQsUkVHU0FNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFNFQ1VSSVRZX0FUVFJJQlVURVMsTFBIS0VZLExQRFdPUkQpOworLyogdGhlcmUgaXMgbm8gUmVnQ3JlYXRlS2V5RXgxNiAqLworI2RlZmluZSAgICBSZWdDcmVhdGVLZXlFeCBXSU5FTElCX05BTUVfQVcoUmVnQ3JlYXRlS2V5RXgpCitEV09SRCAgICAgIFJlZ0RlbGV0ZUtleTE2KEhLRVksTFBDU1RSKTsKK0RXT1JEICAgICAgUmVnRGVsZXRlS2V5MzJBKEhLRVksTFBDU1RSKTsKK0RXT1JEICAgICAgUmVnRGVsZXRlS2V5MzJXKEhLRVksTFBXU1RSKTsKKyNkZWZpbmUgICAgUmVnRGVsZXRlS2V5IFdJTkVMSUJfTkFNRV9BVyhSZWdEZWxldGVLZXkpCitEV09SRCAgICAgIFJlZ0RlbGV0ZVZhbHVlMTYoSEtFWSxMUFNUUik7CitEV09SRCAgICAgIFJlZ0RlbGV0ZVZhbHVlMzJBKEhLRVksTFBTVFIpOworRFdPUkQgICAgICBSZWdEZWxldGVWYWx1ZTMyVyhIS0VZLExQV1NUUik7CisjZGVmaW5lICAgIFJlZ0RlbGV0ZVZhbHVlIFdJTkVMSUJfTkFNRV9BVyhSZWdEZWxldGVWYWx1ZSkKK0RXT1JEICAgICAgUmVnRW51bUtleTE2KEhLRVksRFdPUkQsTFBTVFIsRFdPUkQpOworRFdPUkQgICAgICBSZWdFbnVtS2V5MzJBKEhLRVksRFdPUkQsTFBTVFIsRFdPUkQpOworRFdPUkQgICAgICBSZWdFbnVtS2V5MzJXKEhLRVksRFdPUkQsTFBXU1RSLERXT1JEKTsKKyNkZWZpbmUgICAgUmVnRW51bUtleSBXSU5FTElCX05BTUVfQVcoUmVnRW51bUtleSkKK0RXT1JEICAgICAgUmVnRW51bUtleUV4MzJBKEhLRVksRFdPUkQsTFBTVFIsTFBEV09SRCxMUERXT1JELExQU1RSLExQRFdPUkQsRklMRVRJTUUqKTsKK0RXT1JEICAgICAgUmVnRW51bUtleUV4MzJXKEhLRVksRFdPUkQsTFBXU1RSLExQRFdPUkQsTFBEV09SRCxMUFdTVFIsTFBEV09SRCxGSUxFVElNRSopOworLyogdGhlcmUgaXMgbm8gUmVnRW51bUtleUV4MTYgKi8KKyNkZWZpbmUgICAgUmVnRW51bUtleUV4IFdJTkVMSUJfTkFNRV9BVyhSZWdFbnVtS2V5RXgpCitEV09SRCAgICAgIFJlZ0VudW1WYWx1ZTE2KEhLRVksRFdPUkQsTFBTVFIsTFBEV09SRCxMUERXT1JELExQRFdPUkQsTFBCWVRFLExQRFdPUkQpOworRFdPUkQgICAgICBSZWdFbnVtVmFsdWUzMkEoSEtFWSxEV09SRCxMUFNUUixMUERXT1JELExQRFdPUkQsTFBEV09SRCxMUEJZVEUsTFBEV09SRCk7CitEV09SRCAgICAgIFJlZ0VudW1WYWx1ZTMyVyhIS0VZLERXT1JELExQV1NUUixMUERXT1JELExQRFdPUkQsTFBEV09SRCxMUEJZVEUsTFBEV09SRCk7CisjZGVmaW5lICAgIFJlZ0VudW1WYWx1ZSBXSU5FTElCX05BTUVfQVcoUmVnRW51bVZhbHVlKQorQVRPTSAgICAgICBSZWdpc3RlckNsYXNzMTYoY29uc3QgV05EQ0xBU1MxNiopOworQVRPTSAgICAgICBSZWdpc3RlckNsYXNzMzJBKGNvbnN0IFdORENMQVNTMzJBICopOworQVRPTSAgICAgICBSZWdpc3RlckNsYXNzMzJXKGNvbnN0IFdORENMQVNTMzJXICopOworI2RlZmluZSAgICBSZWdpc3RlckNsYXNzIFdJTkVMSUJfTkFNRV9BVyhSZWdpc3RlckNsYXNzKQorQVRPTSAgICAgICBSZWdpc3RlckNsYXNzRXgxNihjb25zdCBXTkRDTEFTU0VYMTYqKTsKK0FUT00gICAgICAgUmVnaXN0ZXJDbGFzc0V4MzJBKGNvbnN0IFdORENMQVNTRVgzMkEgKik7CitBVE9NICAgICAgIFJlZ2lzdGVyQ2xhc3NFeDMyVyhjb25zdCBXTkRDTEFTU0VYMzJXICopOworI2RlZmluZSAgICBSZWdpc3RlckNsYXNzRXggV0lORUxJQl9OQU1FX0FXKFJlZ2lzdGVyQ2xhc3NFeCkKK1dPUkQgICAgICAgUmVnaXN0ZXJXaW5kb3dNZXNzYWdlMTYoU0VHUFRSKTsKK1dPUkQgICAgICAgUmVnaXN0ZXJXaW5kb3dNZXNzYWdlMzJBKExQQ1NUUik7CitXT1JEICAgICAgIFJlZ2lzdGVyV2luZG93TWVzc2FnZTMyVyhMUENXU1RSKTsKKyNkZWZpbmUgICAgUmVnaXN0ZXJXaW5kb3dNZXNzYWdlIFdJTkVMSUJfTkFNRV9BVyhSZWdpc3RlcldpbmRvd01lc3NhZ2UpCitEV09SRCAgICAgIFJlZ09wZW5LZXkxNihIS0VZLExQQ1NUUixMUEhLRVkpOworRFdPUkQgICAgICBSZWdPcGVuS2V5MzJBKEhLRVksTFBDU1RSLExQSEtFWSk7CitEV09SRCAgICAgIFJlZ09wZW5LZXkzMlcoSEtFWSxMUENXU1RSLExQSEtFWSk7CisjZGVmaW5lICAgIFJlZ09wZW5LZXkgV0lORUxJQl9OQU1FX0FXKFJlZ09wZW5LZXkpCitEV09SRCAgICAgIFJlZ09wZW5LZXlFeDMyVyhIS0VZLExQQ1dTVFIsRFdPUkQsUkVHU0FNLExQSEtFWSk7CitEV09SRCAgICAgIFJlZ09wZW5LZXlFeDMyQShIS0VZLExQQ1NUUixEV09SRCxSRUdTQU0sTFBIS0VZKTsKKy8qIHRoZXJlIGlzIG5vIFJlZ09wZW5LZXlFeDE2ICovCisjZGVmaW5lICAgIFJlZ09wZW5LZXlFeCBXSU5FTElCX05BTUVfQVcoUmVnT3BlbktleUV4KQorRFdPUkQgICAgICBSZWdRdWVyeUluZm9LZXkzMlcoSEtFWSxMUFdTVFIsTFBEV09SRCxMUERXT1JELExQRFdPUkQsTFBEV09SRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERXT1JELExQRFdPUkQsTFBEV09SRCxMUERXT1JELExQRFdPUkQsRklMRVRJTUUqKTsKK0RXT1JEICAgICAgUmVnUXVlcnlJbmZvS2V5MzJBKEhLRVksTFBTVFIsTFBEV09SRCxMUERXT1JELExQRFdPUkQsTFBEV09SRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERXT1JELExQRFdPUkQsTFBEV09SRCxMUERXT1JELExQRFdPUkQsRklMRVRJTUUqKTsKKy8qIHRoZXJlIGlzIG5vIFJlZ1F1ZXJ5SW5mb0tleTE2ICovCisjZGVmaW5lICAgIFJlZ1F1ZXJ5SW5mb0tleSBXSU5FTElCX05BTUVfQVcoUmVnUXVlcnlJbmZvS2V5KQorRFdPUkQgICAgICBSZWdRdWVyeVZhbHVlMTYoSEtFWSxMUFNUUixMUFNUUixMUERXT1JEKTsKK0RXT1JEICAgICAgUmVnUXVlcnlWYWx1ZTMyQShIS0VZLExQU1RSLExQU1RSLExQRFdPUkQpOworRFdPUkQgICAgICBSZWdRdWVyeVZhbHVlMzJXKEhLRVksTFBXU1RSLExQV1NUUixMUERXT1JEKTsKKyNkZWZpbmUgICAgUmVnUXVlcnlWYWx1ZSBXSU5FTElCX05BTUVfQVcoUmVnUXVlcnlWYWx1ZSkKK0RXT1JEICAgICAgUmVnUXVlcnlWYWx1ZUV4MTYoSEtFWSxMUFNUUixMUERXT1JELExQRFdPUkQsTFBCWVRFLExQRFdPUkQpOworRFdPUkQgICAgICBSZWdRdWVyeVZhbHVlRXgzMkEoSEtFWSxMUFNUUixMUERXT1JELExQRFdPUkQsTFBCWVRFLExQRFdPUkQpOworRFdPUkQgICAgICBSZWdRdWVyeVZhbHVlRXgzMlcoSEtFWSxMUFdTVFIsTFBEV09SRCxMUERXT1JELExQQllURSxMUERXT1JEKTsKKyNkZWZpbmUgICAgUmVnUXVlcnlWYWx1ZUV4IFdJTkVMSUJfTkFNRV9BVyhSZWdRdWVyeVZhbHVlRXgpCitEV09SRCAgICAgIFJlZ1NldFZhbHVlMTYoSEtFWSxMUENTVFIsRFdPUkQsTFBDU1RSLERXT1JEKTsKK0RXT1JEICAgICAgUmVnU2V0VmFsdWUzMkEoSEtFWSxMUENTVFIsRFdPUkQsTFBDU1RSLERXT1JEKTsKK0RXT1JEICAgICAgUmVnU2V0VmFsdWUzMlcoSEtFWSxMUENXU1RSLERXT1JELExQQ1dTVFIsRFdPUkQpOworI2RlZmluZSAgICBSZWdTZXRWYWx1ZSBXSU5FTElCX05BTUVfQVcoUmVnU2V0VmFsdWUpCitEV09SRCAgICAgIFJlZ1NldFZhbHVlRXgxNihIS0VZLExQU1RSLERXT1JELERXT1JELExQQllURSxEV09SRCk7CitEV09SRCAgICAgIFJlZ1NldFZhbHVlRXgzMkEoSEtFWSxMUFNUUixEV09SRCxEV09SRCxMUEJZVEUsRFdPUkQpOworRFdPUkQgICAgICBSZWdTZXRWYWx1ZUV4MzJXKEhLRVksTFBXU1RSLERXT1JELERXT1JELExQQllURSxEV09SRCk7CisjZGVmaW5lICAgIFJlZ1NldFZhbHVlRXggV0lORUxJQl9OQU1FX0FXKFJlZ1NldFZhbHVlRXgpCitCT09MMTYgICAgIFNjYWxlVmlld3BvcnRFeHRFeDE2KEhEQzE2LElOVDE2LElOVDE2LElOVDE2LElOVDE2LExQU0laRTE2KTsKK0JPT0wzMiAgICAgU2NhbGVWaWV3cG9ydEV4dEV4MzIoSERDMzIsSU5UMzIsSU5UMzIsSU5UMzIsSU5UMzIsTFBTSVpFMzIpOworI2RlZmluZSAgICBTY2FsZVZpZXdwb3J0RXh0RXggV0lORUxJQl9OQU1FKFNjYWxlVmlld3BvcnRFeHRFeCkKK0JPT0wxNiAgICAgU2NhbGVXaW5kb3dFeHRFeDE2KEhEQzE2LElOVDE2LElOVDE2LElOVDE2LElOVDE2LExQU0laRTE2KTsKK0JPT0wzMiAgICAgU2NhbGVXaW5kb3dFeHRFeDMyKEhEQzMyLElOVDMyLElOVDMyLElOVDMyLElOVDMyLExQU0laRTMyKTsKKyNkZWZpbmUgICAgU2NhbGVXaW5kb3dFeHRFeCBXSU5FTElCX05BTUUoU2NhbGVXaW5kb3dFeHRFeCkKK3ZvaWQgICAgICAgU2NyZWVuVG9DbGllbnQxNihIV05EMTYsTFBQT0lOVDE2KTsKK3ZvaWQgICAgICAgU2NyZWVuVG9DbGllbnQzMihIV05EMzIsTFBQT0lOVDMyKTsKKyNkZWZpbmUgICAgU2NyZWVuVG9DbGllbnQgV0lORUxJQl9OQU1FKFNjcmVlblRvQ2xpZW50KQorQk9PTDE2ICAgICBTZXRCaXRtYXBEaW1lbnNpb25FeDE2KEhCSVRNQVAxNixJTlQxNixJTlQxNixMUFNJWkUxNik7CitCT09MMzIgICAgIFNldEJpdG1hcERpbWVuc2lvbkV4MzIoSEJJVE1BUDMyLElOVDMyLElOVDMyLExQU0laRTMyKTsKKyNkZWZpbmUgICAgU2V0Qml0bWFwRGltZW5zaW9uRXggV0lORUxJQl9OQU1FKFNldEJpdG1hcERpbWVuc2lvbkV4KQorTE9ORyAgICAgICBTZXRDbGFzc0xvbmcxNihIV05ELElOVDE2LExPTkcpOworTE9ORyAgICAgICBTZXRDbGFzc0xvbmczMkEoSFdORCxJTlQzMixMT05HKTsKK0xPTkcgICAgICAgU2V0Q2xhc3NMb25nMzJXKEhXTkQsSU5UMzIsTE9ORyk7CisjZGVmaW5lICAgIFNldENsYXNzTG9uZyBXSU5FTElCX05BTUVfQVcoU2V0Q2xhc3NMb25nKQordm9pZCAgICAgICBTZXRJbnRlcm5hbFdpbmRvd1BvczE2KEhXTkQxNixVSU5UMTYsTFBSRUNUMTYsTFBQT0lOVDE2KTsKK3ZvaWQgICAgICAgU2V0SW50ZXJuYWxXaW5kb3dQb3MzMihIV05EMzIsVUlOVDMyLExQUkVDVDMyLExQUE9JTlQzMik7CisjZGVmaW5lICAgIFNldEludGVybmFsV2luZG93UG9zIFdJTkVMSUJfTkFNRShTZXRJbnRlcm5hbFdpbmRvd1BvcykKK3ZvaWQgICAgICAgU2V0UmVjdDE2KExQUkVDVDE2LElOVDE2LElOVDE2LElOVDE2LElOVDE2KTsKK3ZvaWQgICAgICAgU2V0UmVjdDMyKExQUkVDVDMyLElOVDMyLElOVDMyLElOVDMyLElOVDMyKTsKKyNkZWZpbmUgICAgU2V0UmVjdCBXSU5FTElCX05BTUUoU2V0UmVjdCkKK3ZvaWQgICAgICAgU2V0UmVjdEVtcHR5MTYoTFBSRUNUMTYpOwordm9pZCAgICAgICBTZXRSZWN0RW1wdHkzMihMUFJFQ1QzMik7CisjZGVmaW5lICAgIFNldFJlY3RFbXB0eSBXSU5FTElCX05BTUUoU2V0UmVjdEVtcHR5KQorQk9PTDE2ICAgICBTZXRWaWV3cG9ydEV4dEV4MTYoSERDMTYsSU5UMTYsSU5UMTYsTFBTSVpFMTYpOworQk9PTDMyICAgICBTZXRWaWV3cG9ydEV4dEV4MzIoSERDMzIsSU5UMzIsSU5UMzIsTFBTSVpFMzIpOworI2RlZmluZSAgICBTZXRWaWV3cG9ydEV4dEV4IFdJTkVMSUJfTkFNRShTZXRWaWV3cG9ydEV4dEV4KQorQk9PTDE2ICAgICBTZXRWaWV3cG9ydE9yZ0V4MTYoSERDMTYsSU5UMTYsSU5UMTYsTFBQT0lOVDE2KTsKK0JPT0wzMiAgICAgU2V0Vmlld3BvcnRPcmdFeDMyKEhEQzMyLElOVDMyLElOVDMyLExQUE9JTlQzMik7CisjZGVmaW5lICAgIFNldFZpZXdwb3J0T3JnRXggV0lORUxJQl9OQU1FKFNldFZpZXdwb3J0T3JnRXgpCitCT09MMTYgICAgIFNldFdpbmRvd0V4dEV4MTYoSERDMTYsSU5UMTYsSU5UMTYsTFBTSVpFMTYpOworQk9PTDMyICAgICBTZXRXaW5kb3dFeHRFeDMyKEhEQzMyLElOVDMyLElOVDMyLExQU0laRTMyKTsKKyNkZWZpbmUgICAgU2V0V2luZG93RXh0RXggV0lORUxJQl9OQU1FKFNldFdpbmRvd0V4dEV4KQorQk9PTDE2ICAgICBTZXRXaW5kb3dPcmdFeDE2KEhEQzE2LElOVDE2LElOVDE2LExQUE9JTlQxNik7CitCT09MMzIgICAgIFNldFdpbmRvd09yZ0V4MzIoSERDMzIsSU5UMzIsSU5UMzIsTFBQT0lOVDMyKTsKKyNkZWZpbmUgICAgU2V0V2luZG93T3JnRXggV0lORUxJQl9OQU1FKFNldFdpbmRvd09yZ0V4KQorQk9PTDE2ICAgICBTZXRXaW5kb3dQbGFjZW1lbnQxNihIV05EMTYsY29uc3QgV0lORE9XUExBQ0VNRU5UMTYqKTsKK0JPT0wzMiAgICAgU2V0V2luZG93UGxhY2VtZW50MzIoSFdORDMyLGNvbnN0IFdJTkRPV1BMQUNFTUVOVDMyKik7CisjZGVmaW5lICAgIFNldFdpbmRvd1BsYWNlbWVudCBXSU5FTElCX05BTUUoU2V0V2luZG93UGxhY2VtZW50KQorQk9PTDE2ICAgICBTdWJ0cmFjdFJlY3QxNihMUFJFQ1QxNixjb25zdCBSRUNUMTYqLGNvbnN0IFJFQ1QxNiopOworQk9PTDMyICAgICBTdWJ0cmFjdFJlY3QzMihMUFJFQ1QzMixjb25zdCBSRUNUMzIqLGNvbnN0IFJFQ1QzMiopOworI2RlZmluZSAgICBTdWJ0cmFjdFJlY3QgV0lORUxJQl9OQU1FKFN1YnRyYWN0UmVjdCkKK0JPT0wxNiAgICAgVGV4dE91dDE2KEhEQzE2LElOVDE2LElOVDE2LExQQ1NUUixJTlQxNik7CitCT09MMzIgICAgIFRleHRPdXQzMkEoSERDMzIsSU5UMzIsSU5UMzIsTFBDU1RSLElOVDMyKTsKK0JPT0wzMiAgICAgVGV4dE91dDMyVyhIREMzMixJTlQzMixJTlQzMixMUENXU1RSLElOVDMyKTsKKyNkZWZpbmUgICAgVGV4dE91dCBXSU5FTElCX05BTUVfQVcoVGV4dE91dCkKK0JPT0wxNiAgICAgVHJhY2tQb3B1cE1lbnUxNihITUVOVTE2LFVJTlQxNixJTlQxNixJTlQxNixJTlQxNixIV05EMTYsY29uc3QgUkVDVDE2Kik7CitCT09MMzIgICAgIFRyYWNrUG9wdXBNZW51MzIoSE1FTlUzMixVSU5UMzIsSU5UMzIsSU5UMzIsSU5UMzIsSFdORDMyLGNvbnN0IFJFQ1QzMiopOworI2RlZmluZSAgICBUcmFja1BvcHVwTWVudSBXSU5FTElCX05BTUUoVHJhY2tQb3B1cE1lbnUpCitCT09MMTYgICAgIFVuaW9uUmVjdDE2KExQUkVDVDE2LGNvbnN0IFJFQ1QxNiosY29uc3QgUkVDVDE2Kik7CitCT09MMzIgICAgIFVuaW9uUmVjdDMyKExQUkVDVDMyLGNvbnN0IFJFQ1QzMiosY29uc3QgUkVDVDMyKik7CisjZGVmaW5lICAgIFVuaW9uUmVjdCBXSU5FTElCX05BTUUoVW5pb25SZWN0KQorQk9PTDE2ICAgICBVbnJlZ2lzdGVyQ2xhc3MxNihTRUdQVFIsSElOU1RBTkNFMTYpOworQk9PTDMyICAgICBVbnJlZ2lzdGVyQ2xhc3MzMkEoTFBDU1RSLEhJTlNUQU5DRTMyKTsKK0JPT0wzMiAgICAgVW5yZWdpc3RlckNsYXNzMzJXKExQQ1dTVFIsSElOU1RBTkNFMzIpOworI2RlZmluZSAgICBVbnJlZ2lzdGVyQ2xhc3MgV0lORUxJQl9OQU1FX0FXKFVucmVnaXN0ZXJDbGFzcykKK3ZvaWQgICAgICAgVmFsaWRhdGVSZWN0MTYoSFdORDE2LGNvbnN0IFJFQ1QxNiopOwordm9pZCAgICAgICBWYWxpZGF0ZVJlY3QzMihIV05EMzIsY29uc3QgUkVDVDMyKik7CisjZGVmaW5lICAgIFZhbGlkYXRlUmVjdCBXSU5FTElCX05BTUUoVmFsaWRhdGVSZWN0KQorSFdORDE2ICAgICBXaW5kb3dGcm9tUG9pbnQxNihQT0lOVDE2KTsKK0hXTkQzMiAgICAgV2luZG93RnJvbVBvaW50MzIoUE9JTlQzMik7CisjZGVmaW5lICAgIFdpbmRvd0Zyb21Qb2ludCBXSU5FTElCX05BTUUoV2luZG93RnJvbVBvaW50KQogCiAjaWZkZWYgV0lORUxJQgogI2RlZmluZSBXSU5FTElCX1VOSU1QKHgpIGZwcmludGYgKHN0ZGVyciwgIldpbmVMaWI6IFVuaW1wbGVtZW50ZWQgJXNcbiIsIHgpCmRpZmYgLS1naXQgYS9pbmNsdWRlL3dpbm50LmggYi9pbmNsdWRlL3dpbm50LmgKaW5kZXggYjcyYTQ0ZC4uNGE1ZDNiZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS93aW5udC5oCisrKyBiL2luY2x1ZGUvd2lubnQuaApAQCAtMTgsNiArMTgsNyBAQAogI2RlZmluZSBIRUFQX0RJU0FCTEVfQ09BTEVTQ0VfT05fRlJFRSAgIDB4MDAwMDAwODAKICNkZWZpbmUgSEVBUF9DUkVBVEVfQUxJR05fMTYgICAgICAgICAgICAweDAwMDEwMDAwCiAjZGVmaW5lIEhFQVBfQ1JFQVRFX0VOQUJMRV9UUkFDSU5HICAgICAgMHgwMDAyMDAwMAotCisjZGVmaW5lIEhFQVBfV0lORV9TRUdQVFIgICAgICAgICAgICAgICAgMHgwMTAwMDAwMCAgLyogTm90IGEgV2luMzIgZmxhZyAqLworI2RlZmluZSBIRUFQX1dJTkVfQ09ERVNFRyAgICAgICAgICAgICAgIDB4MDIwMDAwMDAgIC8qIE5vdCBhIFdpbjMyIGZsYWcgKi8KIAogI2VuZGlmICAvKiBfX1dJTkVfV0lOTlRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS93aW5wb3MuaCBiL2luY2x1ZGUvd2lucG9zLmgKaW5kZXggOTRkMmRjNS4uNjU0YmYxMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS93aW5wb3MuaAorKysgYi9pbmNsdWRlL3dpbnBvcy5oCkBAIC0yMiw3ICsyMiw3IEBACiAgICAgV09SRCAgICAgICAgdmFsaWQ7CiAgICAgV09SRCAgICAgICAgd01hZ2ljOwogICAgIEhXTkQgICAgICAgIGh3bmRQYXJlbnQ7Ci0gICAgV0lORE9XUE9TICAgd2luUG9zWzFdOworICAgIFdJTkRPV1BPUzE2IHdpblBvc1sxXTsKIH0gRFdQOwogCiB0eXBlZGVmIHN0cnVjdApAQCAtMzYsMTAgKzM2LDEwIEBACiBleHRlcm4gQk9PTCBXSU5QT1NfU2V0QWN0aXZlV2luZG93KCBIV05EIGhXbmQsIEJPT0wgZk1vdXNlLCBCT09MIGZDaGFuZ2VGb2N1cyk7CiBleHRlcm4gQk9PTCBXSU5QT1NfQ2hhbmdlQWN0aXZlV2luZG93KCBIV05EIGh3bmQsIEJPT0wgbW91c2VNc2cgKTsKIGV4dGVybiBMT05HIFdJTlBPU19TZW5kTkNDYWxjU2l6ZSggSFdORCBod25kLCBCT09MIGNhbGNWYWxpZFJlY3QsCi0JCQkJICAgUkVDVCAqbmV3V2luZG93UmVjdCwgUkVDVCAqb2xkV2luZG93UmVjdCwKLQkJCQkgICBSRUNUICpvbGRDbGllbnRSZWN0LCBTRUdQVFIgd2lucG9zLAotCQkJCSAgIFJFQ1QgKm5ld0NsaWVudFJlY3QgKTsKLWV4dGVybiBMT05HIFdJTlBPU19IYW5kbGVXaW5kb3dQb3NDaGFuZ2luZyggV0lORE9XUE9TICp3aW5wb3MgKTsKLWV4dGVybiBJTlQgV0lOUE9TX1dpbmRvd0Zyb21Qb2ludCggUE9JTlQgcHQsIFdORCAqKnBwV25kICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVDVDE2ICpuZXdXaW5kb3dSZWN0LCBSRUNUMTYgKm9sZFdpbmRvd1JlY3QsCisJCQkJICBSRUNUMTYgKm9sZENsaWVudFJlY3QsIFNFR1BUUiB3aW5wb3MsCisJCQkJICBSRUNUMTYgKm5ld0NsaWVudFJlY3QgKTsKK2V4dGVybiBMT05HIFdJTlBPU19IYW5kbGVXaW5kb3dQb3NDaGFuZ2luZyggV0lORE9XUE9TMTYgKndpbnBvcyApOworZXh0ZXJuIElOVDE2IFdJTlBPU19XaW5kb3dGcm9tUG9pbnQoIFBPSU5UMTYgcHQsIFdORCAqKnBwV25kICk7CiAKICNlbmRpZiAgLyogX19XSU5FX1dJTlBPU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3dpbnJlZy5oIGIvaW5jbHVkZS93aW5yZWcuaAppbmRleCBkOGUyM2IwLi42MmM0NTI5IDEwMDY0NAotLS0gYS9pbmNsdWRlL3dpbnJlZy5oCisrKyBiL2luY2x1ZGUvd2lucmVnLmgKQEAgLTU5LDYgKzU5LDcgQEAKICNkZWZpbmUJUkVHX09QVElPTl9OT05fVk9MQVRJTEUJMHgwMDAwMDAwMAogI2RlZmluZQlSRUdfT1BUSU9OX1ZPTEFUSUxFCTB4MDAwMDAwMDEKICNkZWZpbmUJUkVHX09QVElPTl9DUkVBVEVfTElOSwkweDAwMDAwMDAyCisjZGVmaW5lIFJFR19PUFRJT05fVEFJTlRFRAkweDgwMDAwMDAwCiAKICNkZWZpbmUgUkVHX0NSRUFURURfTkVXX0tFWQkweDAwMDAwMDAxCiAjZGVmaW5lIFJFR19PUEVORURfRVhJU1RJTkdfS0VZCTB4MDAwMDAwMDIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvd2ludHlwZXMuaCBiL2luY2x1ZGUvd2ludHlwZXMuaAppbmRleCBhOWJiZTc5Li4wZWQzNWFmIDEwMDY0NAotLS0gYS9pbmNsdWRlL3dpbnR5cGVzLmgKKysrIGIvaW5jbHVkZS93aW50eXBlcy5oCkBAIC00MSw4ICs0MSw4IEBACiAjICBkZWZpbmUgV0lORUxJQl9OQU1FX0FXKGZ1bmMpICBmdW5jIyMxNgogIyBlbmRpZiAgLyogV0lORUxJQjMyICovCiAjZWxzZSAgIC8qIFdJTkVMSUIgKi8KLSMgZGVmaW5lIFdJTkVMSUJfTkFNRShmdW5jKSAgICAgIC8qIG5vdGhpbmcgKi8KLSMgZGVmaW5lIFdJTkVMSUJfTkFNRV9BVyhmdW5jKSAgIC8qIG5vdGhpbmcgKi8KKyMgZGVmaW5lIFdJTkVMSUJfTkFNRShmdW5jKSAgICAgIHRoaXMgaXMgYSBzeW50YXggZXJyb3IKKyMgZGVmaW5lIFdJTkVMSUJfTkFNRV9BVyhmdW5jKSAgIHRoaXMgaXMgYSBzeW50YXggZXJyb3IKICNlbmRpZiAgLyogV0lORUxJQiAqLwogCiAjaWZkZWYgV0lORUxJQgpAQCAtNjIsMTIgKzYyLDEzIEBACiB0eXBlZGVmIHVuc2lnbmVkIGludCAgICBVSU5UMzI7CiB0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICBXT1JEOwogdHlwZWRlZiB1bnNpZ25lZCBsb25nICAgRFdPUkQ7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0ICBCT09MOwogdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgQllURTsKIHR5cGVkZWYgbG9uZyAgICAgICAgICAgIExPTkc7CiB0eXBlZGVmIGNoYXIgICAgICAgICAgICBDSEFSOwogLyogU29tZSBzeXN0ZW1zIG1pZ2h0IGhhdmUgd2NoYXJfdCwgYnV0IHdlIHJlYWxseSBuZWVkIDE2IGJpdCBjaGFyYWN0ZXJzICovCiB0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICBXQ0hBUjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgIEJPT0wxNjsKK3R5cGVkZWYgaW50ICAgICAgICAgICAgIEJPT0wzMjsKIAogLyogSGFuZGxlcyB0eXBlcy4gVGhlc2UgYXJlIHRoZSBzYW1lIGZvciBlbXVsYXRvciBhbmQgbGlicmFyeS4gKi8KIApAQCAtMTg2LDYgKzE4Nyw3IEBACiBERUNMX1dJTkVMSUJfVFlQRShMUElOVCk7CiBERUNMX1dJTkVMSUJfVFlQRShMUFVJTlQpOwogREVDTF9XSU5FTElCX1RZUEUoVUlOVCk7CitERUNMX1dJTkVMSUJfVFlQRShCT09MKTsKIERFQ0xfV0lORUxJQl9UWVBFKFdQQVJBTSk7CiAKIERFQ0xfV0lORUxJQl9UWVBFKEhBQ0NFTCk7CkBAIC0yMzIsMTggKzIzNCwxNSBAQAogI2lmbmRlZiBXSU5FTElCCiB0eXBlZGVmIElOVDE2IElOVDsKIHR5cGVkZWYgVUlOVDE2IFVJTlQ7Cit0eXBlZGVmIEJPT0wxNiBCT09MOwogdHlwZWRlZiBXUEFSQU0xNiBXUEFSQU07Ci10eXBlZGVmIEhBTkRMRTE2IEhBQ0NFTDsKIHR5cGVkZWYgSEFORExFMTYgSEFORExFOwogdHlwZWRlZiBIQU5ETEUxNiBIQklUTUFQOwogdHlwZWRlZiBIQU5ETEUxNiBIQlJVU0g7CiB0eXBlZGVmIEhBTkRMRTE2IEhDVVJTT1I7CiB0eXBlZGVmIEhBTkRMRTE2IEhEQzsKLXR5cGVkZWYgSEFORExFMTYgSERST1A7CiB0eXBlZGVmIEhBTkRMRTE2IEhEUlZSOwotdHlwZWRlZiBIQU5ETEUxNiBIRFdQOwogdHlwZWRlZiBIQU5ETEUxNiBIRk9OVDsKLXR5cGVkZWYgSEFORExFMTYgSEdESU9CSjsKIHR5cGVkZWYgSEFORExFMTYgSEdMT0JBTDsKIHR5cGVkZWYgSEFORExFMTYgSElDT047CiB0eXBlZGVmIEhBTkRMRTE2IEhJTlNUQU5DRTsKQEAgLTI1NCw4ICsyNTMsNiBAQAogdHlwZWRlZiBIQU5ETEUxNiBITUlESU9VVDsKIHR5cGVkZWYgSEFORExFMTYgSE1NSU87CiB0eXBlZGVmIEhBTkRMRTE2IEhNT0RVTEU7Ci10eXBlZGVmIEhBTkRMRTE2IEhQQUxFVFRFOwotdHlwZWRlZiBIQU5ETEUxNiBIUEVOOwogdHlwZWRlZiBIQU5ETEUxNiBIUVVFVUU7CiB0eXBlZGVmIEhBTkRMRTE2IEhSR047CiB0eXBlZGVmIEhBTkRMRTE2IEhSU1JDOwpAQCAtMzM1LDE3ICszMzIsMTkgQEAKIAogLyogTWFjcm9zIHRvIHNwbGl0IHdvcmRzIGFuZCBsb25ncy4gKi8KIAotI2RlZmluZSBMT0JZVEUodykgICAgICAgICAgICgoQllURSkoV09SRCkodykpCi0jZGVmaW5lIEhJQllURSh3KSAgICAgICAgICAgKChCWVRFKSgoV09SRCkodykgPj4gOCkpCisjZGVmaW5lIExPQllURSh3KSAgICAgICAgICAgICAgKChCWVRFKShXT1JEKSh3KSkKKyNkZWZpbmUgSElCWVRFKHcpICAgICAgICAgICAgICAoKEJZVEUpKChXT1JEKSh3KSA+PiA4KSkKIAotI2RlZmluZSBMT1dPUkQobCkgICAgICAgICAgICgoV09SRCkoRFdPUkQpKGwpKQotI2RlZmluZSBISVdPUkQobCkgICAgICAgICAgICgoV09SRCkoKERXT1JEKShsKSA+PiAxNikpCisjZGVmaW5lIExPV09SRChsKSAgICAgICAgICAgICAgKChXT1JEKShEV09SRCkobCkpCisjZGVmaW5lIEhJV09SRChsKSAgICAgICAgICAgICAgKChXT1JEKSgoRFdPUkQpKGwpID4+IDE2KSkKIAotI2RlZmluZSBTTE9XT1JEKGwpICAgICAgICAgICAoKElOVDE2KShMT05HKShsKSkKLSNkZWZpbmUgU0hJV09SRChsKSAgICAgICAgICAgKChJTlQxNikoKExPTkcpKGwpID4+IDE2KSkKKyNkZWZpbmUgU0xPV09SRChsKSAgICAgICAgICAgICAoKElOVDE2KShMT05HKShsKSkKKyNkZWZpbmUgU0hJV09SRChsKSAgICAgICAgICAgICAoKElOVDE2KSgoTE9ORykobCkgPj4gMTYpKQogCi0jZGVmaW5lIE1BS0VMT05HKGxvdywgaGlnaCkgKChMT05HKSgoKFdPUkQpKGxvdykpIHwgXAotCQkJCSAgICAoKChEV09SRCkoKFdPUkQpKGhpZ2gpKSkgPDwgMTYpKSkKKyNkZWZpbmUgTUFLRUxPTkcobG93LGhpZ2gpICAgICAoKExPTkcpKCgoV09SRCkobG93KSkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChEV09SRCkoKFdPUkQpKGhpZ2gpKSkgPDwgMTYpKSkKKyNkZWZpbmUgTUFLRUxQQVJBTShsb3csaGlnaCkgICAoKExQQVJBTSlNQUtFTE9ORyhsb3csaGlnaCkpCisjZGVmaW5lIE1BS0VXUEFSQU0obG93LGhpZ2gpICAgKChXUEFSQU0zMilNQUtFTE9ORyhsb3csaGlnaCkpCiAKICNkZWZpbmUgU0VMRUNUT1JPRihwdHIpICAgICAoSElXT1JEKHB0cikpCiAjZGVmaW5lIE9GRlNFVE9GKHB0cikgICAgICAgKExPV09SRChwdHIpKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS93aW51c2VyLmggYi9pbmNsdWRlL3dpbnVzZXIuaAppbmRleCBiOGRjZGI5Li40Y2JhODc1IDEwMDY0NAotLS0gYS9pbmNsdWRlL3dpbnVzZXIuaAorKysgYi9pbmNsdWRlL3dpbnVzZXIuaApAQCAtODYsNyArODYsMjEgQEAKICAgICBISUNPTjMyICAgICBoSWNvblNtOwogfSBXTkRDTEFTU0VYMzJXLCAqTFBXTkRDTEFTU0VYMzJXOwogCi10eXBlZGVmIHZvaWQgV05EQ0xBU1NFWDE2OyAgLyogVGhlcmUncyBubyBXTkRDTEFTU0VYIGluIFdpbjE2ICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIFVJTlQzMiAgICAgIGNiU2l6ZTsKKyAgICBVSU5UMzIgICAgICBzdHlsZTsKKyAgICBXTkRQUk9DMTYgICBscGZuV25kUHJvYzsKKyAgICBJTlQxNiAgICAgICBjYkNsc0V4dHJhOworICAgIElOVDE2ICAgICAgIGNiV25kRXh0cmE7CisgICAgSEFORExFMTYgICAgaEluc3RhbmNlOworICAgIEhJQ09OMTYgICAgIGhJY29uOworICAgIEhDVVJTT1IxNiAgIGhDdXJzb3I7CisgICAgSEJSVVNIMTYgICAgaGJyQmFja2dyb3VuZDsKKyAgICBTRUdQVFIgICAgICBscHN6TWVudU5hbWU7CisgICAgU0VHUFRSICAgICAgbHBzekNsYXNzTmFtZTsKKyAgICBISUNPTjE2ICAgICBoSWNvblNtOworfSBXTkRDTEFTU0VYMTYsICpMUFdORENMQVNTRVgxNjsKIAogREVDTF9XSU5FTElCX1RZUEVfQVcoV05EQ0xBU1MpOwogREVDTF9XSU5FTElCX1RZUEVfQVcoTFBXTkRDTEFTUyk7CkBAIC0xMjUsMjMgKzEzOSw3IEBACiAjZGVmaW5lIEdDV19TVFlMRSAgICAgICAgICAgKC0yNikKICNkZWZpbmUgR0NMX1NUWUxFICAgICAgICAgICBHQ1dfU1RZTEUKICNkZWZpbmUgR0NXX0FUT00gICAgICAgICAgICAoLTMyKQotI2RlZmluZSBHQ0xfSElDT05TTSAgICAgICAgICgtMzQpCi0KLUFUT00gICAgICAgUmVnaXN0ZXJDbGFzczE2KGNvbnN0IFdORENMQVNTMTYqKTsKLUFUT00gICAgICAgUmVnaXN0ZXJDbGFzczMyQShjb25zdCBXTkRDTEFTUzMyQSAqKTsKLUFUT00gICAgICAgUmVnaXN0ZXJDbGFzczMyVyhjb25zdCBXTkRDTEFTUzMyVyAqKTsKLSNkZWZpbmUgUmVnaXN0ZXJDbGFzcyBXSU5FTElCX05BTUVfQVcoUmVnaXN0ZXJDbGFzcykKLUFUT00gICAgICAgUmVnaXN0ZXJDbGFzc0V4MzJBKGNvbnN0IFdORENMQVNTRVgzMkEgKik7Ci1BVE9NICAgICAgIFJlZ2lzdGVyQ2xhc3NFeDMyVyhjb25zdCBXTkRDTEFTU0VYMzJXICopOwotI2RlZmluZSBSZWdpc3RlckNsYXNzRXggV0lORUxJQl9OQU1FX0FXKFJlZ2lzdGVyQ2xhc3NFeCkKLUJPT0wgICAgICAgVW5yZWdpc3RlckNsYXNzMTYoU0VHUFRSLEhJTlNUQU5DRTE2KTsKLUJPT0wgICAgICAgVW5yZWdpc3RlckNsYXNzMzJBKExQQ1NUUixISU5TVEFOQ0UzMik7Ci1CT09MICAgICAgIFVucmVnaXN0ZXJDbGFzczMyVyhMUENXU1RSLEhJTlNUQU5DRTMyKTsKLSNkZWZpbmUgVW5yZWdpc3RlckNsYXNzIFdJTkVMSUJfTkFNRV9BVyhVbnJlZ2lzdGVyQ2xhc3MpCi0KLUJPT0wgICAgICAgR2V0Q2xhc3NJbmZvKEhBTkRMRSxTRUdQVFIsV05EQ0xBU1MxNiAqKTsKLUxPTkcgICAgICAgR2V0Q2xhc3NMb25nKEhXTkQsc2hvcnQpOwotaW50ICAgICAgICBHZXRDbGFzc05hbWUoSFdORCxMUFNUUixzaG9ydCk7Ci1MT05HICAgICAgIFNldENsYXNzTG9uZyhIV05ELHNob3J0LExPTkcpOworI2RlZmluZSBHQ1dfSElDT05TTSAgICAgICAgICgtMzQpCisjZGVmaW5lIEdDTF9ISUNPTlNNICAgICAgICAgR0NXX0hJQ09OU00KIAogI2VuZGlmICAvKiBfX1dJTkVfV0lOVVNFUl9IICovCmRpZmYgLS1naXQgYS9saWJyYXJ5L01ha2VmaWxlLmluIGIvbGlicmFyeS9NYWtlZmlsZS5pbgppbmRleCA5ZTI3Y2FhLi4yMmU4YTFlIDEwMDY0NAotLS0gYS9saWJyYXJ5L01ha2VmaWxlLmluCisrKyBiL2xpYnJhcnkvTWFrZWZpbGUuaW4KQEAgLTIsOSArMiw3IEBACiBNT0RVTEUgPSBsaWJyYXJ5CiAKIENfU1JDUyA9IFwKLQlhdG9tLmMgXAogCWFyY2guYyBcCi0JaGVhcC5jIFwKIAlsaWJyZXMuYyBcCiAJbWlzY3N0dWJzLmMgXAogCXN1cC5jIFwKZGlmZiAtLWdpdCBhL2xpYnJhcnkvYXRvbS5jIGIvbGlicmFyeS9hdG9tLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4N2Y5MzguLjAwMDAwMDAKLS0tIGEvbGlicmFyeS9hdG9tLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNDEgKzAsMCBAQAotLyoKLSAqIEF0b20gdGFibGUgZnVuY3Rpb25zCi0gKgotICogQ29weXJpZ2h0IDE5OTMsIDE5OTQsIDE5OTUgQWxleGFuZHJlIEp1bGxpYXJkCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgIndpbmRvd3MuaCIKLSNpbmNsdWRlICJ4bWFsbG9jLmgiCi0KLSNpZmRlZiBDT05GSUdfSVBDCi0jaW5jbHVkZSAiZGRlX2F0b20uaCIKLSNpbmNsdWRlICJvcHRpb25zLmgiCi0jZW5kaWYKLQotI2RlZmluZSBNSU5fU1RSX0FUT00gICAgICAgICAgICAgIDB4YzAwMAotCi10eXBlZGVmIHN0cnVjdAotewotICBXT1JEICByZWZDb3VudDsKLSAgQllURSAgbGVuZ3RoOwotICBjaGFyKiBzdHI7Ci19IEFUT01EQVRBOwotCi10eXBlZGVmIHN0cnVjdAotewotICB2b2lkKiBuZXh0OwotICBBVE9NREFUQSBhMmhbMTZdOwotfSBBVE9NdG9IQU5ETEV0YWJsZTsKLQotc3RhdGljIEFUT010b0hBTkRMRXRhYmxlKiBHbG9iYWxBdG9tVGFibGUgPSBOVUxMOwotc3RhdGljIEFUT010b0hBTkRMRXRhYmxlKiAgTG9jYWxBdG9tVGFibGUgPSBOVUxMOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEFUT01fSW5pdAotICoKLSAqIEdsb2JhbCB0YWJsZSBpbml0aWFsaXNhdGlvbi4KLSAqLwotQk9PTCBBVE9NX0luaXQodm9pZCkKLXsKLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgQVRPTV9BZGRBdG9tCi0gKi8KLXN0YXRpYyBBVE9NIEFUT01fQWRkQXRvbSggQVRPTXRvSEFORExFdGFibGUqKiB0YWJsZXB0ciwgU0VHUFRSIG5hbWUgKQotewotICAgIEFUT01EQVRBKiBGaXJzdFVudXNlZDsKLSAgICBBVE9NIEZpcnN0VW51c2VkSW5kZXg7Ci0gICAgQVRPTSBJbmRleDsKLSAgICBBVE9NdG9IQU5ETEV0YWJsZSogdGFibGU7Ci0gICAgaW50IGksbGVuOwotICAgIGNoYXIgKnN0cjsKLQotICAgIC8qIENoZWNrIGZvciBpbnRlZ2VyIGF0b20gKi8KLQotICAgIGlmICghSElXT1JEKG5hbWUpKSByZXR1cm4gKEFUT00pTE9XT1JEKG5hbWUpOwotICAgIHN0ciA9IChjaGFyKiluYW1lOwotICAgIGlmIChzdHJbMF0gPT0gJyMnKSByZXR1cm4gYXRvaSggJnN0clsxXSApOwotCi0gICAgaWYgKChsZW4gPSBzdHJsZW4oIHN0ciApKSA+IDI1NSkgbGVuID0gMjU1OwotICAgIHRhYmxlID0gKnRhYmxlcHRyOwotICAgIEZpcnN0VW51c2VkID0gTlVMTDsKLSAgICBGaXJzdFVudXNlZEluZGV4ID0gMDsKLSAgICBJbmRleCA9IE1JTl9TVFJfQVRPTTsKLSAgICB3aGlsZSAodGFibGUpCi0gICAgewotICAgICAgZm9yKGk9MDsgaTwxNjsgaSsrLCBJbmRleCsrKQotICAgICAgewotCWlmICghdGFibGUtPmEyaFtpXS5yZWZDb3VudCkKLQl7Ci0JICBGaXJzdFVudXNlZD0mdGFibGUtPmEyaFtpXTsKLQkgIEZpcnN0VW51c2VkSW5kZXg9SW5kZXg7Ci0JfQotCWVsc2UgaWYgKCh0YWJsZS0+YTJoW2ldLmxlbmd0aCA9PSBsZW4pICYmIAotCQkgKCFsc3RybmNtcGkoIHRhYmxlLT5hMmhbaV0uc3RyLCBzdHIsIGxlbiApKSkKLQl7Ci0JICAgIHRhYmxlLT5hMmhbaV0ucmVmQ291bnQrKzsKLQkgICAgcmV0dXJuIEluZGV4OwotCX0KLSAgICAgIH0KLSAgICAgIHRhYmxlcHRyID0gKEFUT010b0hBTkRMRXRhYmxlKiopJnRhYmxlLT5uZXh0OwotICAgICAgdGFibGUgPSB0YWJsZS0+bmV4dDsKLSAgICB9Ci0gICAgaWYoIUZpcnN0VW51c2VkKQotICAgIHsKLSAgICAgICp0YWJsZXB0ciA9IHhtYWxsb2Moc2l6ZW9mKEFUT010b0hBTkRMRXRhYmxlKSk7Ci0gICAgICAoKnRhYmxlcHRyKS0+bmV4dCA9IE5VTEw7Ci0gICAgICBmb3IoaT0wOyBpPDE2OyBpKyspCi0gICAgICB7Ci0JKCp0YWJsZXB0ciktPmEyaFtpXS5zdHIgPSBOVUxMOwotCSgqdGFibGVwdHIpLT5hMmhbaV0ucmVmQ291bnQgPSAwOwotICAgICAgfQotICAgICAgRmlyc3RVbnVzZWQgPSAoKnRhYmxlcHRyKS0+YTJoOwotICAgICAgRmlyc3RVbnVzZWRJbmRleCA9IEluZGV4OwotICAgIH0KLSAgICBpZigoRmlyc3RVbnVzZWQtPnN0ciA9IG1hbGxvYyhsZW4rMSkpKQotICAgIHsKLSAgICAgIG1lbWNweSggRmlyc3RVbnVzZWQtPnN0ciwgc3RyLCBsZW4gKTsKLSAgICAgIEZpcnN0VW51c2VkLT5zdHJbbGVuXSA9IDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJldHVybiAwOwotICAgIEZpcnN0VW51c2VkLT5yZWZDb3VudCA9IDE7Ci0gICAgRmlyc3RVbnVzZWQtPmxlbmd0aCA9IGxlbjsKLSAgICByZXR1cm4gRmlyc3RVbnVzZWRJbmRleDsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBBVE9NX0RlbGV0ZUF0b20KLSAqLwotc3RhdGljIEFUT00gQVRPTV9EZWxldGVBdG9tKCBBVE9NdG9IQU5ETEV0YWJsZSoqIHRhYmxlcHRyLCBBVE9NIGF0b20gKQoteyAgICAKLSAgICBBVE9NdG9IQU5ETEV0YWJsZSogdGFibGU7Ci0gICAgaW50IGk7Ci0gICAgQVRPTSBJbmRleDsKLQotICAgIGlmIChhdG9tIDwgTUlOX1NUUl9BVE9NKSByZXR1cm4gMDsgIC8qIEludGVnZXIgYXRvbSAqLwotCi0gICAgSW5kZXggPSBNSU5fU1RSX0FUT007Ci0gICAgdGFibGUgPSAqdGFibGVwdHI7Ci0gICAgd2hpbGUgKHRhYmxlKQotICAgIHsKLSAgICAgIGlmKGF0b20tSW5kZXggPCAxNikKLSAgICAgIHsKLQlpPWF0b20tSW5kZXg7Ci0KLQkvKiBEZWxldGUgYXRvbSAqLwotCWlmICgtLXRhYmxlLT5hMmhbaV0ucmVmQ291bnQgPT0gMCkKLQl7Ci0JICBmcmVlKHRhYmxlLT5hMmhbaV0uc3RyKTsKLQkgIHRhYmxlLT5hMmhbaV0uc3RyPU5VTEw7Ci0JfSAgICAKLQlyZXR1cm4gMDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLQlJbmRleCs9MTY7Ci0JdGFibGUgPSB0YWJsZS0+bmV4dDsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGF0b207Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgQVRPTV9GaW5kQXRvbQotICovCi1zdGF0aWMgQVRPTSBBVE9NX0ZpbmRBdG9tKCBBVE9NdG9IQU5ETEV0YWJsZSoqIHRhYmxlcHRyLCBTRUdQVFIgbmFtZSApCi17Ci0gICAgQVRPTSBJbmRleDsKLSAgICBBVE9NdG9IQU5ETEV0YWJsZSogdGFibGU7Ci0gICAgaW50IGksbGVuOwotICAgIGNoYXIgKnN0cjsKLQotICAgIC8qIENoZWNrIGZvciBpbnRlZ2VyIGF0b20gKi8KLQotICAgIGlmICghSElXT1JEKG5hbWUpKSByZXR1cm4gKEFUT00pTE9XT1JEKG5hbWUpOwotICAgIHN0ciA9IChjaGFyKiluYW1lOwotICAgIGlmIChzdHJbMF0gPT0gJyMnKSByZXR1cm4gYXRvaSggJnN0clsxXSApOwotCi0gICAgaWYgKChsZW4gPSBzdHJsZW4oIHN0ciApKSA+IDI1NSkgbGVuID0gMjU1OwotICAgIHRhYmxlPSp0YWJsZXB0cjsKLSAgICBJbmRleD1NSU5fU1RSX0FUT007Ci0gICAgd2hpbGUgKHRhYmxlKQotICAgIHsKLSAgICAgIGZvcihpPTA7IGk8MTY7IGkrKywgSW5kZXgrKykKLSAgICAgIHsKLQlpZiAoKHRhYmxlLT5hMmhbaV0ucmVmQ291bnQgIT0gMCkgJiYKLQkgICAgKHRhYmxlLT5hMmhbaV0ubGVuZ3RoID09IGxlbikgJiYgCi0JICAgICghbHN0cm5jbXBpKCB0YWJsZS0+YTJoW2ldLnN0ciwgc3RyLCBsZW4gKSkpCi0JICByZXR1cm4gSW5kZXg7Ci0gICAgICB9Ci0gICAgICB0YWJsZT10YWJsZS0+bmV4dDsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgQVRPTV9HZXRBdG9tTmFtZQotICovCi1zdGF0aWMgV09SRCBBVE9NX0dldEF0b21OYW1lKCBBVE9NdG9IQU5ETEV0YWJsZSoqIHRhYmxlcHRyLCBBVE9NIGF0b20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFNUUiBidWZmZXIsIHNob3J0IGNvdW50ICkKLXsKLSAgICBBVE9NdG9IQU5ETEV0YWJsZSogdGFibGU7Ci0gICAgQVRPTSBJbmRleDsKLSAgICBjaGFyICogc3RyUHRyPU5VTEw7Ci0gICAgaW50IGksbGVuPTA7Ci0gICAgY2hhciB0ZXh0WzhdOwotICAgIAotICAgIGlmICghY291bnQpIHJldHVybiAwOwotICAgIGlmIChhdG9tIDwgTUlOX1NUUl9BVE9NKQotICAgIHsKLQlzcHJpbnRmKCB0ZXh0LCAiIyVkIiwgYXRvbSApOwotCWxlbiA9IHN0cmxlbih0ZXh0KTsKLQlzdHJQdHIgPSB0ZXh0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgSW5kZXggPSBNSU5fU1RSX0FUT007Ci0gICAgICB0YWJsZSA9ICp0YWJsZXB0cjsKLSAgICAgIHdoaWxlICh0YWJsZSkKLSAgICAgIHsKLQlpZihhdG9tLUluZGV4IDwgMTYpCi0JewotCSAgaT1hdG9tLUluZGV4OwotCSAgCi0JICBpZiAodGFibGUtPmEyaFtpXS5yZWZDb3VudCA9PSAwKQotCSAgICB0YWJsZT1OVUxMOwotCSAgZWxzZQotCSAgewotCSAgICBsZW4gPSB0YWJsZS0+YTJoW2ldLmxlbmd0aDsKLQkgICAgc3RyUHRyID0gdGFibGUtPmEyaFtpXS5zdHI7Ci0JICB9Ci0JICBicmVhazsKLQl9Ci0JZWxzZQotCXsKLQkgIEluZGV4Kz0xNjsKLQkgIHRhYmxlID0gdGFibGUtPm5leHQ7Ci0JfQotICAgICAgfQotICAgICAgaWYoIXRhYmxlKXJldHVybiAwOwotICAgIH0KLSAgICBpZiAobGVuID49IGNvdW50KSBsZW4gPSBjb3VudC0xOwotICAgIG1lbWNweSggYnVmZmVyLCBzdHJQdHIsIGxlbiApOwotICAgIGJ1ZmZlcltsZW5dID0gJ1wwJzsKLSAgICByZXR1cm4gbGVuOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEluaXRBdG9tVGFibGUgICAoS0VSTkVMLjY4KQotICovCi1XT1JEIEluaXRBdG9tVGFibGUoIFdPUkQgZW50cmllcyApCi17Ci0gICAgcmV0dXJuIGVudHJpZXM7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2V0QXRvbUhhbmRsZSAgIChLRVJORUwuNzMpCi0gKi8KLUhBTkRMRSBHZXRBdG9tSGFuZGxlKCBBVE9NIGF0b20gKQotewotICBmcHJpbnRmKHN0ZGVyciwiSkJQOiBHZXRBdG9tSGFuZGxlKCkgY2FsbGVkIChvYnNvbGV0ZSkuXG4iKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgQWRkQXRvbSAgIChLRVJORUwuNzApCi0gKi8KLUFUT00gQWRkQXRvbSggU0VHUFRSIHN0ciApCi17Ci0gICAgcmV0dXJuIEFUT01fQWRkQXRvbSggJkxvY2FsQXRvbVRhYmxlLCAoU0VHUFRSKXN0ciApOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIERlbGV0ZUF0b20gICAoS0VSTkVMLjcxKQotICovCi1BVE9NIERlbGV0ZUF0b20oIEFUT00gYXRvbSApCi17Ci0gICAgcmV0dXJuIEFUT01fRGVsZXRlQXRvbSggJkxvY2FsQXRvbVRhYmxlLCBhdG9tICk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgRmluZEF0b20gICAoS0VSTkVMLjY5KQotICovCi1BVE9NIEZpbmRBdG9tKCBTRUdQVFIgc3RyICkKLXsKLSAgICByZXR1cm4gQVRPTV9GaW5kQXRvbSggJkxvY2FsQXRvbVRhYmxlLCBzdHIgKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBHZXRBdG9tTmFtZSAgIChLRVJORUwuNzIpCi0gKi8KLVdPUkQgR2V0QXRvbU5hbWUoIEFUT00gYXRvbSwgTFBTVFIgYnVmZmVyLCBzaG9ydCBjb3VudCApCi17Ci0gICAgcmV0dXJuIEFUT01fR2V0QXRvbU5hbWUoICZMb2NhbEF0b21UYWJsZSwgYXRvbSwgYnVmZmVyLCBjb3VudCApOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEdsb2JhbEFkZEF0b20gICAoVVNFUi4yNjgpCi0gKi8KLUFUT00gR2xvYmFsQWRkQXRvbSggU0VHUFRSIHN0ciApCi17Ci0jaWZkZWYgQ09ORklHX0lQQwotICAgIGlmIChPcHRpb25zLmlwYykgcmV0dXJuIERERV9HbG9iYWxBZGRBdG9tKCBzdHIgKTsKLSNlbmRpZgotICAgIHJldHVybiBBVE9NX0FkZEF0b20oICZHbG9iYWxBdG9tVGFibGUsIHN0ciApOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEdsb2JhbERlbGV0ZUF0b20gICAoVVNFUi4yNjkpCi0gKi8KLUFUT00gR2xvYmFsRGVsZXRlQXRvbSggQVRPTSBhdG9tICkKLXsKLSNpZmRlZiBDT05GSUdfSVBDCi0gICAgaWYgKE9wdGlvbnMuaXBjKSByZXR1cm4gRERFX0dsb2JhbERlbGV0ZUF0b20oIGF0b20gKTsKLSNlbmRpZgotICAgIHJldHVybiBBVE9NX0RlbGV0ZUF0b20oICZHbG9iYWxBdG9tVGFibGUsIGF0b20gKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBHbG9iYWxGaW5kQXRvbSAgIChVU0VSLjI3MCkKLSAqLwotQVRPTSBHbG9iYWxGaW5kQXRvbSggU0VHUFRSIHN0ciApCi17Ci0jaWZkZWYgQ09ORklHX0lQQwotICAgIGlmIChPcHRpb25zLmlwYykgcmV0dXJuIERERV9HbG9iYWxGaW5kQXRvbSggc3RyICk7Ci0jZW5kaWYKLSAgICByZXR1cm4gQVRPTV9GaW5kQXRvbSggJkdsb2JhbEF0b21UYWJsZSwgc3RyICk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2xvYmFsR2V0QXRvbU5hbWUgICAoVVNFUi4yNzEpCi0gKi8KLVdPUkQgR2xvYmFsR2V0QXRvbU5hbWUoIEFUT00gYXRvbSwgTFBTVFIgYnVmZmVyLCBzaG9ydCBjb3VudCApCi17Ci0jaWZkZWYgQ09ORklHX0lQQwotICAgIGlmIChPcHRpb25zLmlwYykgcmV0dXJuIERERV9HbG9iYWxHZXRBdG9tTmFtZSggYXRvbSwgYnVmZmVyLCBjb3VudCApOwotI2VuZGlmCi0gICAgcmV0dXJuIEFUT01fR2V0QXRvbU5hbWUoICZHbG9iYWxBdG9tVGFibGUsIGF0b20sIGJ1ZmZlciwgY291bnQgKTsKLX0KZGlmZiAtLWdpdCBhL2xpYnJhcnkvaGVhcC5jIGIvbGlicmFyeS9oZWFwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzYWM4ODEuLjAwMDAwMDAKLS0tIGEvbGlicmFyeS9oZWFwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNDAgKzAsMCBAQAotLyoKLSAqIE1lbW9yeSBhbGxsb2NhdGlvbiBmb3IgdGhlIFdpbmUgTGlicmFyeSB0b29sa2l0Ci0gKgotICogQ29weXJpZ2h0IChDKSAxOTk0IE1pZ3VlbCBkZSBJY2F6YQotICoKLSAqIEFsbCB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgaXMgYmVpbmcgZG9uZSBieSB0aGUgbGliYyBtYWxsb2MgYW5kIGZyaWVuZHMuCi0gKi8KLQotLyogI2lmbmRlZiBfX1NURENfXyAqLwotI2luY2x1ZGUgPG1hbGxvYy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0vKiAjZW5kaWYgKi8KLSNpbmNsdWRlICJ3aW5kb3dzLmgiCi0jaW5jbHVkZSAieG1hbGxvYy5oIgotCi0jaWZkZWYgV0lORUxJQjE2Ci0KLS8qIENvbnRyb2xzIHRoZSBibG9ja3MgcGVyIGhhbmRsZSB0YWJsZSAqLwotI2RlZmluZSBNQVhCTE9DS1MgMTAyNAotCi10eXBlZGVmIHN0cnVjdCBoYW5kbGVfdGFibGUgewotICAgIHN0cnVjdCBoYW5kbGVfdGFibGUgKm5leHQ7Ci0gICAgdm9pZCAqYmxvY2tzIFtNQVhCTE9DS1NdOwotfSBoYW5kbGVfdGFibGVfdDsKLQotc3RhdGljIGhhbmRsZV90YWJsZV90IGhhbmRsZV90YWJsZTsKLQotc3RhdGljIHZvaWQgKipIRUFQX0dldEZyZWVTbG90IChIQU5ETEUgKmhOdW0pCi17Ci0gICAgaGFuZGxlX3RhYmxlX3QgKnRhYmxlLCAqbGFzdDsKLSAgICBpbnQgaSwgajsKLQotICAgIGZvciAodGFibGUgPSAmaGFuZGxlX3RhYmxlLCBqID0gMDsgdGFibGU7IHRhYmxlID0gdGFibGUtPm5leHQsIGorKyl7Ci0JZm9yIChpID0gMDsgaSA8IE1BWEJMT0NLUzsgaSsrKQotCSAgICBpZiAoIXRhYmxlLT5ibG9ja3MgW2ldKQotCQlnb3RvIEFzc2lnbkJsb2NrOwotCWxhc3QgPSB0YWJsZTsKLSAgICB9Ci0KLSAgICAvKiBObyBmcmVlIHNsb3RzICovCi0gICAgbGFzdC0+bmV4dCA9IHhtYWxsb2MgKHNpemVvZiAoaGFuZGxlX3RhYmxlX3QpKTsKLSAgICB0YWJsZSA9IGxhc3QtPm5leHQ7Ci0gICAgbWVtc2V0ICh0YWJsZSwgMCwgc2l6ZW9mIChoYW5kbGVfdGFibGVfdCkpOwotICAgIGkgPSAwOwotICAgIAotIEFzc2lnbkJsb2NrOgotICAgICpoTnVtID0gaipNQVhCTE9DS1MraTsKLSAgICByZXR1cm4gJnRhYmxlLT5ibG9ja3MgW2ldOwotfQotCi1zdGF0aWMgdm9pZCBIRUFQX0hhbmRsZV9pc19aZXJvICgpCi17Ci0gICAgcHJpbnRmICgiV2FybmluZzogSGFuZGxlIGlzIFplcm8sIHNlZ21lbnRhdGlvbiBmYXVsdCBjb21taW5nXG4iKTsKLX0KLQotc3RhdGljIHZvaWQgKipIRUFQX0ZpbmRTbG90IChIQU5ETEUgaE51bSkKLXsKLSAgICBoYW5kbGVfdGFibGVfdCAqdGFibGUgPSAmaGFuZGxlX3RhYmxlOwotICAgIGludCBpLCBqOwotCi0gICAgaWYgKCFoTnVtKQotCUhFQVBfSGFuZGxlX2lzX1plcm8gKCk7Ci0KLSAgICBoTnVtLS07Ci0gICAgZm9yIChqID0gaE51bTsgaiA+IE1BWEJMT0NLUzsgaiAtPSBNQVhCTE9DS1MpewotCXRhYmxlID0gdGFibGUtPm5leHQ7Ci0JaWYgKCF0YWJsZSkgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiAmdGFibGUtPmJsb2NrcyBbaE51bSVNQVhCTE9DS1NdOwotfQotCi1IQU5ETEUgTG9jYWxBbGxvYyAoV09SRCBmbGFncywgV09SRCBieXRlcykKLXsKLSAgICB2b2lkICptOwotICAgIHZvaWQgKipzbG90OwotICAgIEhBTkRMRSBoTWVtOwotCi0gICAgc2xvdCA9IEhFQVBfR2V0RnJlZVNsb3QgKCZoTWVtKTsKLSAgICBpZiAoKG0gPSBtYWxsb2MgKGJ5dGVzKSkpCi0gICAgewotCSpzbG90ID0gbTsKLQlpZiAoZmxhZ3MgJiBMTUVNX1pFUk9JTklUKSBtZW1zZXQoIG0sIDAsIGJ5dGVzICk7Ci0KLSNpZmRlZiBERUJVR19IRUFQCi0JcHJpbnRmICgiSGFuZGxlICVkIFslZF0gPSAlcFxuIiwgaE1lbSsxLCBieXRlcywgbSk7Ci0jZW5kaWYKLQlyZXR1cm4gaE1lbSsxOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotV09SRCBMb2NhbENvbXBhY3QgKFdPUkQgbWluX2ZyZWUpCi17Ci0gICAgcmV0dXJuIG1pbl9mcmVlOwotfQotCi1XT1JEIExvY2FsRmxhZ3MgKEhBTkRMRSBoTWVtKQotewotICAgIHJldHVybiAwOwotfQotCi1IQU5ETEUgTG9jYWxGcmVlIChIQU5ETEUgaE1lbSkKLXsKLSAgICB2b2lkICoqbTsKLSAgaWYoIWhNZW0pCi0gICAgcmV0dXJuIDA7Ci0gIG0gPSBIRUFQX0ZpbmRTbG90IChoTWVtKTsKLQotICAgIGZyZWUgKCptKTsKLSAgICAqbSA9IDA7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLUJPT0wgTG9jYWxJbml0IChXT1JEIHNlZ21lbnQsIFdPUkQgc3RhcnQsIFdPUkQgZW5kKQotewotICAgIHJldHVybiAxOwotfQotCi1XT1JEIExvY2FsTG9jayAoSEFORExFIGhNZW0pCi17Ci0gICAgdm9pZCAqKm0gPSBIRUFQX0ZpbmRTbG90IChoTWVtKTsKLSNpZmRlZiBERUJVR19IRUFQCi0gICAgcHJpbnRmICgiPiVkLT4lcFxuIiwgaE1lbSwgKm0pOwotI2VuZGlmCi0gICAgcmV0dXJuIG0gPyAqbSA6IDA7Ci19Ci0KLUhBTkRMRSBMb2NhbFJlQWxsb2MgKEhBTkRMRSBoTWVtLCBXT1JEIGZsYWdzLCBXT1JEIGJ5dGVzKQotewotICAgIHZvaWQgKiptID0gSEVBUF9GaW5kU2xvdCAoaE1lbSk7Ci0KLSAgICB4cmVhbGxvYyAoKm0sIGJ5dGVzKTsKLX0KLQotV09SRCBMb2NhbFNpemUgKEhBTkRMRSBoTWVtKQotewotICAgIC8qIE5vdCBpbXBsZW1lbnRlZCB5ZXQgKi8KLX0KLQotCi1CT09MIExvY2FsVW5sb2NrIChIQU5ETEUgaE1lbSkKLXsKLSAgICByZXR1cm4gMDsKLX0KLQotSEFORExFIEdsb2JhbEFsbG9jIChXT1JEIGZsYWdzLCBEV09SRCBzaXplKQotewotICAgIHJldHVybiBMb2NhbEFsbG9jIChmbGFncywgc2l6ZSk7Ci19Ci0KLUhBTkRMRSBHbG9iYWxGcmVlIChIQU5ETEUgaE1lbSkKLXsKLSAgICByZXR1cm4gTG9jYWxGcmVlIChoTWVtKTsKLX0KLQotY2hhciAqR2xvYmFsTG9jayAoSEFORExFIGhNZW0pCi17Ci0gICAgcmV0dXJuIExvY2FsTG9jayAoaE1lbSk7Ci19Ci0KLUJPT0wgR2xvYmFsVW5sb2NrIChIQU5ETEUgaE1lbSkKLXsKLSAgICByZXR1cm4gTG9jYWxVbmxvY2sgKGhNZW0pOwotfQotCi1XT1JEIEdsb2JhbEZsYWdzMTYoSEFORExFIGhNZW0pCi17Ci0gICAgcmV0dXJuIExvY2FsRmxhZ3MgKGhNZW0pOwotfQotCi1EV09SRCBHbG9iYWxTaXplMTYoSEFORExFIGhNZW0pCi17Ci0gICAgcmV0dXJuIExvY2FsU2l6ZSAoaE1lbSk7Ci19Ci0KLURXT1JEIEdsb2JhbENvbXBhY3QoRFdPUkQgZGVzaXJlZCkKLXsKLSAgICBpZiAoZGVzaXJlZCkKLQlyZXR1cm4gZGVzaXJlZDsKLSAgICBlbHNlCi0JcmV0dXJuIDB4MDEwMDAwMDA7CS8qIFNob3VsZCBjaGVjayB0aGUgYXZhaWxhYmxlIGNvcmUuICovCi19Ci0KLUhBTkRMRSBHbG9iYWxSZUFsbG9jMTYoSEFORExFIGhNZW0sIERXT1JEIG5ld19zaXplLCBXT1JEIGZsYWdzKQotewotICAgIGlmICghKGZsYWdzICYgR01FTV9NT0RJRlkpKQotCXJldHVybiBMb2NhbFJlQWxsb2MgKGhNZW0sIG5ld19zaXplLCBmbGFncyk7Ci19Ci0KLWludCBIRUFQX0xvY2FsU2l6ZSAoKQotewotICAgIHJldHVybiAwOwotfQotCi1pbnQgSEVBUF9Mb2NhbEZpbmRIZWFwICgpCi17Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLSNpZmRlZiBVTklNUExFTUVOVEVECi0KLURXT1JEIGludCBHbG9iYWxIYW5kbGUoV09SRCBzZWxlY3RvcikKLXsKLX0KLQotI2VuZGlmCi0KLSNlbmRpZiAvKiBXSU5FTElCMTYgKi8KLQotI2lmIDAKLQotdHlwZWRlZiBzdHJ1Y3QgeyBEV09SRCBTaXplOyBEV09SRCBQYWRkaW5nWzNdOyB9IEhlYXBEYXRhOwotCi1IQU5ETEUgSEVBUF9BbGxvYyAoV09SRCBmbGFncywgRFdPUkQgYnl0ZXMpCi17Ci0gICAgSGVhcERhdGEqIG07Ci0KLSAgICBieXRlcys9c2l6ZW9mKEhlYXBEYXRhKTsKLSAgICBpZiAoKG0gPSBtYWxsb2MgKGJ5dGVzKSkpCi0gICAgewotCWlmIChmbGFncyAmIExNRU1fWkVST0lOSVQpIG1lbXNldCggbSwgMCwgYnl0ZXMgKTsKLSAgICB9Ci0gICAgbS0+U2l6ZT1ieXRlcy1zaXplb2YoSGVhcERhdGEpOwotICAgIHJldHVybiAoSEFORExFKShtKzEpOwotfQotCi1IQU5ETEUgSEVBUF9GcmVlIChIQU5ETEUgaE1lbSkKLXsKLSAgSGVhcERhdGEqIG07Ci0gIGlmKCFoTWVtKQotICAgIHJldHVybiAwOwotICBtPShIZWFwRGF0YSopaE1lbTsKLSAgZnJlZShtLTEpOwotICByZXR1cm4gMDsKLX0KLQotRFdPUkQgSEVBUF9TaXplIChIQU5ETEUgaE1lbSkKLXsKLSAgSGVhcERhdGEqIG09KEhlYXBEYXRhKiloTWVtOwotICByZXR1cm4gKG0tMSktPlNpemU7Ci19Ci0KLUhBTkRMRSBIRUFQX1JlQWxsb2MoSEFORExFIGhNZW0sRFdPUkQgYnl0ZXMsVUlOVCBmbGFncykKLXsKLSAgSGVhcERhdGEqIG09KEhlYXBEYXRhKiloTWVtOwotICBpZighYnl0ZXMpCi0gIHsKLSAgICBmcmVlKG0tMSk7Ci0gICAgcmV0dXJuIDA7IC8qIEluYWNjdXJhdGUgYmVoYXZpb3IsIGJ1dCBzaG91bGQgc3VmZmljZSAqLwotICB9Ci0gIG09cmVhbGxvYyAobS0xLCBieXRlcytzaXplb2YoSGVhcERhdGEpKTsKLSAgaWYoZmxhZ3MgJiBMTUVNX1pFUk9JTklUICYmIGJ5dGVzID4gbS0+U2l6ZSkKLSAgICBtZW1zZXQoIChjaGFyKiltK3NpemVvZihIZWFwRGF0YSkrbS0+U2l6ZSwgMCwgYnl0ZXMtbS0+U2l6ZSApOwotICBtLT5TaXplPWJ5dGVzOwotICByZXR1cm4gKEhBTkRMRSkobSsxKTsKLX0KLQotSEFORExFIExvY2FsQWxsb2MgKFdPUkQgZmxhZ3MsIFdPUkQgYnl0ZXMpCi17Ci0gIHJldHVybiBIRUFQX0FsbG9jKGZsYWdzLGJ5dGVzKTsKLX0KLQotVUlOVCBMb2NhbEZsYWdzIChIQU5ETEUgaE1lbSkKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLUhBTkRMRSBMb2NhbEZyZWUgKEhBTkRMRSBoTWVtKQotewotICByZXR1cm4gSEVBUF9GcmVlKGhNZW0pOwotfQotCi1CT09MIExvY2FsSW5pdCAoSEFORExFIHNlZ21lbnQsIFdPUkQgc3RhcnQsIFdPUkQgZW5kKQotewotICByZXR1cm4gVFJVRTsKLX0KLQotTFBWT0lEIExvY2FsTG9jayAoSEFORExFIGhNZW0pCi17Ci0gIHJldHVybiAoTFBWT0lEKWhNZW07Ci19Ci0KLUhBTkRMRSBMb2NhbFJlQWxsb2MgKEhBTkRMRSBoTWVtLCBXT1JEIG5ld19zaXplLCBXT1JEIGZsYWdzKQotewotICBpZiAoIShmbGFncyAmIExNRU1fTU9ESUZZKSkKLSAgICByZXR1cm4gSEVBUF9SZUFsbG9jIChoTWVtLCBuZXdfc2l6ZSwgZmxhZ3MpOwotICBlbHNlCi0gICAgcmV0dXJuIGhNZW07Ci19Ci0KLVVJTlQgTG9jYWxTaXplIChIQU5ETEUgaE1lbSkKLXsKLSAgcmV0dXJuIEhFQVBfU2l6ZShoTWVtKTsKLX0KLQotQk9PTCBMb2NhbFVubG9jayAoSEFORExFIGhNZW0pCi17Ci0gIHJldHVybiAwOwotfQotCi1IQU5ETEUgR2xvYmFsQWxsb2MgKFdPUkQgZmxhZ3MsIERXT1JEIHNpemUpCi17Ci0gIHJldHVybiBIRUFQX0FsbG9jIChmbGFncyxzaXplKTsKLX0KLQotSEFORExFIEdsb2JhbEZyZWUgKEhBTkRMRSBoTWVtKQotewotICByZXR1cm4gSEVBUF9GcmVlIChoTWVtKTsKLX0KLQotTFBWT0lEIEdsb2JhbExvY2sgKEhHTE9CQUwgaE1lbSkKLXsKLSAgcmV0dXJuIChMUFZPSUQpaE1lbTsKLX0KLQotQk9PTCBHbG9iYWxVbmxvY2sgKEhBTkRMRSBoTWVtKQotewotICByZXR1cm4gMDsKLX0KLQotV09SRCBHbG9iYWxGbGFnczMyKEhBTkRMRSBoTWVtKQotewotICByZXR1cm4gTG9jYWxGbGFncyAoaE1lbSk7Ci19Ci0KLURXT1JEIEdsb2JhbFNpemUzMihIQU5ETEUgaE1lbSkKLXsKLSAgcmV0dXJuIEhFQVBfU2l6ZSAoaE1lbSk7Ci19Ci0KLUhBTkRMRSBHbG9iYWxSZUFsbG9jMzIoSEFORExFIGhNZW0sIERXT1JEIG5ld19zaXplLCBXT1JEIGZsYWdzKQotewotICBpZiAoIShmbGFncyAmIEdNRU1fTU9ESUZZKSkKLSAgICByZXR1cm4gSEVBUF9SZUFsbG9jIChoTWVtLCBuZXdfc2l6ZSwgZmxhZ3MpOwotICBlbHNlCi0gICAgcmV0dXJuIGhNZW07Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlicmFyeS9taXNjc3R1YnMuYyBiL2xpYnJhcnkvbWlzY3N0dWJzLmMKaW5kZXggMWNlZTZjZi4uNTM4MmM1YSAxMDA2NDQKLS0tIGEvbGlicmFyeS9taXNjc3R1YnMuYworKysgYi9saWJyYXJ5L21pc2NzdHVicy5jCkBAIC0xMCw3ICsxMCw2IEBACiAjaW5jbHVkZSAiZGRlX21lbS5oIgogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJnbG9iYWwuaCIKLSNpbmNsdWRlICJyZWxheTMyLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJ4bWFsbG9jLmgiCiAKQEAgLTQ0LDkzICs0Myw2IEBACiAKIFdPUkQgQ2FsbFRvMTZfd29yZF8gKCBGQVJQUk9DIGZ1bmMsIFdPUkQgYXJnICkgeyByZXR1cm4gZnVuYyhhcmcpOyB9CiAKLSNpZiAwCi12b2lkIEdsb2JhbEZyZWVBbGwoSEdMT0JBTDE2IG93bmVyKQotewotICBXSU5FTElCX1VOSU1QKCJHbG9iYWxGcmVlQWxsKCkiKTsKLX0KLQotU0VHUFRSIFdJTjE2X0dsb2JhbExvY2sxNihIR0xPQkFMMTYgaCkgCi0gIHsgcmV0dXJuIChTRUdQVFIpaDsgfQotSExPQ0FMIExPQ0FMX0ZyZWUoV09SRCBkcywgSExPQ0FMIGhhbmRsZSkgCi0gIHsgcmV0dXJuIExvY2FsRnJlZShoYW5kbGUpOyB9Ci1ITE9DQUwgTE9DQUxfQWxsb2MoV09SRCBkcywgV09SRCBmbGFncywgV09SRCBzaXplKQotICB7IHJldHVybiBMb2NhbEFsbG9jKGZsYWdzLHNpemUpOyB9Ci1ITE9DQUwgTE9DQUxfUmVBbGxvYyhXT1JEIGRzLCBITE9DQUwgaGFuZGxlLCBXT1JEIHNpemUsIFdPUkQgZmxhZ3MpCi0gIHsgcmV0dXJuIExvY2FsUmVBbGxvYyhoYW5kbGUsc2l6ZSxmbGFncyk7IH0KLUxQU1RSIExPQ0FMX0xvY2soIFdPUkQgZHMsIEhMT0NBTCBoYW5kbGUgKQotICB7IHJldHVybiBMb2NhbExvY2soaGFuZGxlKTsgfQotQk9PTCBMT0NBTF9VbmxvY2soIFdPUkQgZHMsIEhMT0NBTCBoYW5kbGUgKQotICB7IHJldHVybiBMb2NhbFVubG9jayhoYW5kbGUpOyB9Ci1XT1JEIExPQ0FMX1NpemUoIFdPUkQgZHMsIEhMT0NBTCBoYW5kbGUgKQotICB7IHJldHVybiBMb2NhbFNpemUoaGFuZGxlKTsgfQotCi12b2lkIEZhclNldE93bmVyKEhBTkRMRSBhLCBIQU5ETEUgYikKLXsKLSAgV0lORUxJQl9VTklNUCgiRmFyU2V0T3duZXIoKSIpOwotfQotCi0jZGVmaW5lIEdMT0JBTF9NQVhfQUxMT0NfU0laRSAweDAwZmYwMDAwICAvKiBMYXJnZXN0IGFsbG9jYXRpb24gaXMgMTZNIC0gNjRLICovCi0KLUhHTE9CQUwgR0xPQkFMX0FsbG9jKCBXT1JEIGZsYWdzLCBEV09SRCBzaXplLCBIR0xPQkFMIGhPd25lciwKLSAgICAgICAgICAgICAgICAgICAgICBCT09MIGlzQ29kZSwgQk9PTCBpczMyQml0LCBCT09MIGlzUmVhZE9ubHkgKQotewotICAgIHZvaWQgKnB0cjsKLSAgICBIR0xPQkFMIGhhbmRsZTsKLSAgICBTSE1EQVRBIHNobWRhdGE7Ci0KLSAgICBkcHJpbnRmX2dsb2JhbCggc3RkZGViLCAiR0xPQkFMX0FsbG9jOiAlbGQgZmxhZ3M9JTA0eFxuIiwgc2l6ZSwgZmxhZ3MgKTsKLQotICAgICAgLyogRml4dXAgdGhlIHNpemUgKi8KLQotICAgIGlmIChzaXplID49IEdMT0JBTF9NQVhfQUxMT0NfU0laRSAtIDB4MWYpIHJldHVybiAwOwotICAgIGlmIChzaXplID09IDApIHNpemUgPSAweDIwOwotICAgIGVsc2Ugc2l6ZSA9IChzaXplICsgMHgxZikgJiB+MHgxZjsKLQotICAgICAgLyogQWxsb2NhdGUgdGhlIGxpbmVhciBtZW1vcnkgKi8KLQotI2lmZGVmIENPTkZJR19JUEMKLSAgICBpZiAoKGZsYWdzICYgR01FTV9EREVTSEFSRSkgJiYgT3B0aW9ucy5pcGMpCi0gICAgICAgIHB0ciA9IERERV9tYWxsb2MoZmxhZ3MsIHNpemUsICZzaG1kYXRhKTsKLSAgICBlbHNlIAotI2VuZGlmICAvKiBDT05GSUdfSVBDICovCi0JcHRyID0gbWFsbG9jKCBzaXplICk7Ci0gICAgaWYgKCFwdHIpIHJldHVybiAwOwotCi0gICAgICAvKiBBbGxvY2F0ZSB0aGUgc2VsZWN0b3IocykgKi8KLQotICAgIGhhbmRsZSA9IEdMT0JBTF9DcmVhdGVCbG9jayggZmxhZ3MsIHB0ciwgc2l6ZSwgaE93bmVyLAotCQkJCWlzQ29kZSwgaXMzMkJpdCwgaXNSZWFkT25seSwgJnNobWRhdGEpOwotICAgIGlmICghaGFuZGxlKQotICAgIHsKLSAgICAgICAgZnJlZSggcHRyICk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGlmIChmbGFncyAmIEdNRU1fWkVST0lOSVQpIG1lbXNldCggcHRyLCAwLCBzaXplICk7Ci0gICAgcmV0dXJuIGhhbmRsZTsKLX0KLQotSEdMT0JBTCBHTE9CQUxfQ3JlYXRlQmxvY2soIFdPUkQgZmxhZ3MsIGNvbnN0IHZvaWQgKnB0ciwgRFdPUkQgc2l6ZSwKLQkJCSAgICBIR0xPQkFMIGhPd25lciwgQk9PTCBpc0NvZGUsCi0JCQkgICAgQk9PTCBpczMyQml0LCBCT09MIGlzUmVhZE9ubHksCi0JCQkgICAgU0hNREFUQSAqc2htZGF0YSkKLXsKLSAgcmV0dXJuIChIR0xPQkFMKXB0cjsKLX0KLQotQk9PTCBHTE9CQUxfRnJlZUJsb2NrKCBIR0xPQkFMIGhhbmRsZSApCi17Ci0gIHJldHVybiAxOwotfQotCi1IR0xPQkFMIEdsb2JhbEhhbmRsZShMUENWT0lEIGEpCi17Ci0gIGZwcmludGYoc3RkZXJyLCJKQlA6IEdsb2JhbEhhbmRsZSgpIGlnbm9yZWQuXG4iKTsKLSAgcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQogZXh0ZXJuIExSRVNVTFQgQUNUSVZBVEVBUFBfY2FsbGJhY2soSFdORCxVSU5ULFdQQVJBTSxMUEFSQU0pOwogZXh0ZXJuIExSRVNVTFQgQWJvdXREbGdQcm9jKEhXTkQsVUlOVCxXUEFSQU0sTFBBUkFNKTsKIGV4dGVybiBMUkVTVUxUIEJ1dHRvblduZFByb2MoSFdORCxVSU5ULFdQQVJBTSxMUEFSQU0pOwpkaWZmIC0tZ2l0IGEvbGlicmFyeS9zdXAuYyBiL2xpYnJhcnkvc3VwLmMKaW5kZXggNDIxYTA5Ny4uNzk3Yjk2YyAxMDA2NDQKLS0tIGEvbGlicmFyeS9zdXAuYworKysgYi9saWJyYXJ5L3N1cC5jCkBAIC02LDEyICs2LDYgQEAKICNpbmNsdWRlICJhcmNoLmgiCiAjaW5jbHVkZSAibmVleGUuaCIKIAotTFJFU1VMVCBDYWxsV2luZG93UHJvYyAoV05EUFJPQyBmdW5jLCBIV05EIGh3bmQsIFVJTlQgbWVzc2FnZSwKLQkJCVdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCi17Ci0gICAgcmV0dXJuICgqZnVuYykoaHduZCwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOwotfQotCiAvKgogICogSGVhZGVyIGxvYWRpbmcgcm91dGluZXMgZm9yIFdpbmVMaWIuCiAgKi8KZGlmZiAtLWdpdCBhL2xvYWRlci9tYWluLmMgYi9sb2FkZXIvbWFpbi5jCmluZGV4IDBhMmQ3NjQuLjE4ZWNkZmUgMTAwNjQ0Ci0tLSBhL2xvYWRlci9tYWluLmMKKysrIGIvbG9hZGVyL21haW4uYwpAQCAtMTMsNyArMTMsNiBAQAogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJhbGlhcy5oIgogI2luY2x1ZGUgIm1vZHVsZS5oIgotI2luY2x1ZGUgInRhc2suaCIKICNpbmNsdWRlICJzZWxlY3RvcnMuaCIKICNpbmNsdWRlICJjb21tLmgiCiAjaW5jbHVkZSAid2luLmgiCkBAIC0zNywxMiArMzYsMTQgQEAKICNpbmNsdWRlICJ1c2VyLmgiCiAjaW5jbHVkZSAiZGNlLmgiCiAjaW5jbHVkZSAicGVfaW1hZ2UuaCIKKyNpbmNsdWRlICJzaGVsbC5oIgogI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogdm9pZCBpbml0X3dpbmVfc2lnbmFscyh2b2lkKTsKIAogSEFORExFMzIgU3lzdGVtSGVhcCA9IDA7CitIQU5ETEUzMiBTZWdwdHJIZWFwID0gMDsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTWFpbiBpbml0aWFsaXNhdGlvbiByb3V0aW5lCkBAIC01Myw4ICs1NCw5IEBACiAKICAgICBpbnQgcXVldWVTaXplOwogCi0gICAgLyogQ3JlYXRlIHRoZSBzeXN0ZW0gaGVhcCAqLworICAgIC8qIENyZWF0ZSB0aGUgc3lzdGVtIGFuZCBTRUdQVFIgaGVhcHMgKi8KICAgICBpZiAoIShTeXN0ZW1IZWFwID0gSGVhcENyZWF0ZSggSEVBUF9HUk9XQUJMRSwgMHgxMDAwMCwgMCApKSkgcmV0dXJuIDA7CisgICAgaWYgKCEoU2VncHRySGVhcCA9IEhlYXBDcmVhdGUoIEhFQVBfV0lORV9TRUdQVFIsIDAsIDAgKSkpIHJldHVybiAwOwogCiAgICAgLyogTG9hZCB0aGUgY29uZmlndXJhdGlvbiBmaWxlICovCiAgICAgaWYgKCFQUk9GSUxFX0xvYWRXaW5lSW5pKCkpIHJldHVybiAwOwpAQCAtMTAxLDYgKzEwMyw4IEBACiAgICAgICAvKiBJbml0aWFsaXplIHRoZSBET1MgbWVtb3J5ICovCiAgICAgaWYgKCFJTlQyMV9Jbml0KCkpIHJldHVybiAwOwogI2VuZGlmCisgICAgICAvKiByZWdpc3RyeSBpbml0aWFsaXNhdGlvbiAqLworICAgIFNIRUxMX0xvYWRSZWdpc3RyeSgpOwogICAgIAogICAgICAgLyogR2xvYmFsIGF0b20gdGFibGUgaW5pdGlhbGlzYXRpb24gKi8KICAgICBpZiAoIUFUT01fSW5pdCgpKSByZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2xvYWRlci9tb2R1bGUuYyBiL2xvYWRlci9tb2R1bGUuYwppbmRleCA5MjAzMTNmLi5lMDQ3NDE1IDEwMDY0NAotLS0gYS9sb2FkZXIvbW9kdWxlLmMKKysrIGIvbG9hZGVyL21vZHVsZS5jCkBAIC03NTksNyArNzU5LDcgQEAKICAqIFJldHVybiBhbiBlbnRyeSBwb2ludCBmcm9tIHRoZSBXUFJPQ1MgZGxsLgogICovCiAjaWZuZGVmIFdJTkVMSUIKLVdORFBST0MgTU9EVUxFX0dldFduZFByb2NFbnRyeTE2KCBjb25zdCBjaGFyICpuYW1lICkKK0ZBUlBST0MxNiBNT0RVTEVfR2V0V25kUHJvY0VudHJ5MTYoIGNvbnN0IGNoYXIgKm5hbWUgKQogewogICAgIFdPUkQgb3JkaW5hbDsKICAgICBzdGF0aWMgSE1PRFVMRSBoTW9kdWxlID0gMDsKQEAgLTc3Nyw3ICs3NzcsNyBAQAogICogUmV0dXJuIGFuIGVudHJ5IHBvaW50IGZyb20gdGhlIFdQUk9DUzMyIGRsbC4KICAqLwogI2lmbmRlZiBXSU5FTElCCi1XTkRQUk9DIE1PRFVMRV9HZXRXbmRQcm9jRW50cnkzMiggY29uc3QgY2hhciAqbmFtZSApCitGQVJQUk9DMzIgTU9EVUxFX0dldFduZFByb2NFbnRyeTMyKCBjb25zdCBjaGFyICpuYW1lICkKIHsKICAgICBzdGF0aWMgSE1PRFVMRSBoTW9kdWxlID0gMDsKIApkaWZmIC0tZ2l0IGEvbG9hZGVyL3BlX2ltYWdlLmMgYi9sb2FkZXIvcGVfaW1hZ2UuYwppbmRleCA0NjFhMDc0Li4wNGQ1N2JiIDEwMDY0NAotLS0gYS9sb2FkZXIvcGVfaW1hZ2UuYworKysgYi9sb2FkZXIvcGVfaW1hZ2UuYwpAQCAtMjMsNyArMjMsNiBAQAogI2luY2x1ZGUgIm5lZXhlLmgiCiAjaW5jbHVkZSAicGVleGUuaCIKICNpbmNsdWRlICJwZV9pbWFnZS5oIgotI2luY2x1ZGUgInJlbGF5MzIuaCIKICNpbmNsdWRlICJtb2R1bGUuaCIKICNpbmNsdWRlICJhbGlhcy5oIgogI2luY2x1ZGUgImdsb2JhbC5oIgpkaWZmIC0tZ2l0IGEvbG9hZGVyL3NpZ25hbC5jIGIvbG9hZGVyL3NpZ25hbC5jCmluZGV4IGU3ZjllYTIuLmMwZjQyMmYgMTAwNjQ0Ci0tLSBhL2xvYWRlci9zaWduYWwuYworKysgYi9sb2FkZXIvc2lnbmFsLmMKQEAgLTE3MSwxMSArMTcxLDcgQEAKICNpZiBkZWZpbmVkKF9fTmV0QlNEX18pIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCiAgICAgc3RydWN0IHNpZ2FsdHN0YWNrIHNzOwogICAgICAgICAKLSNpZiAhZGVmaW5lZCAoX19GcmVlQlNEX18pIAotICAgIGlmICgoc3Muc3NfYmFzZSA9IG1hbGxvYyhNSU5TSUdTVEtTWikpID09IE5VTEwpIHsKLSNlbHNlCiAgICAgaWYgKChzcy5zc19zcCA9IG1hbGxvYyhNSU5TSUdTVEtTWikpID09IE5VTEwpIHsKLSNlbmRpZgogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBhbGxvY2F0ZSBzaWduYWwgc3RhY2sgKCVkIGJ5dGVzKVxuIiwKICAgICAgICAgICAgICAgICBNSU5TSUdTVEtTWik7CiAgICAgICAgIGV4aXQoMSk7CmRpZmYgLS1naXQgYS9tZW1vcnkvYXRvbS5jIGIvbWVtb3J5L2F0b20uYwppbmRleCBjODcxYThmLi5iZGUwOGJlIDEwMDY0NAotLS0gYS9tZW1vcnkvYXRvbS5jCisrKyBiL21lbW9yeS9hdG9tLmMKQEAgLTExLDggKzExLDYgQEAKICAqIGhhdmUgdG8gYmUgY2hhbmdlZC4KICAqLwogCi0jaWZuZGVmIFdJTkVMSUIKLQogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CkBAIC0yMiw2ICsyMCw3IEBACiAjaW5jbHVkZSAiaW5zdGFuY2UuaCIKICNpbmNsdWRlICJsZHQuaCIKICNpbmNsdWRlICJzdGFja2ZyYW1lLmgiCisjaW5jbHVkZSAic3RyaW5nMzIuaCIKICNpbmNsdWRlICJ1c2VyLmgiCiAKICNpZmRlZiBDT05GSUdfSVBDCkBAIC0zMSw2ICszMCw3IEBACiAKICNkZWZpbmUgREVGQVVMVF9BVE9NVEFCTEVfU0laRSAgICAzNwogI2RlZmluZSBNSU5fU1RSX0FUT00gICAgICAgICAgICAgIDB4YzAwMAorI2RlZmluZSBNQVhfQVRPTV9MRU4gICAgICAgICAgICAgIDI1NQogCiAjZGVmaW5lIEFUT01UT0hBTkRMRShhdG9tKSAgICAgICAgKChIQU5ETEUpKGF0b20pIDw8IDIpCiAjZGVmaW5lIEhBTkRMRVRPQVRPTShoYW5kbGUpICAgICAgKChBVE9NKSgweGMwMDAgfCAoKGhhbmRsZSkgPj4gMikpKQpAQCAtNDUsMTAgKzQ1LDEwIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBBVE9NX0luaXRUYWJsZQogICovCi1zdGF0aWMgV09SRCBBVE9NX0luaXRUYWJsZSggV09SRCBzZWxlY3RvciwgV09SRCBlbnRyaWVzICkKK3N0YXRpYyBIQU5ETEUxNiBBVE9NX0luaXRUYWJsZSggV09SRCBzZWxlY3RvciwgV09SRCBlbnRyaWVzICkKIHsKICAgICBpbnQgaTsKLSAgICBIQU5ETEUgaGFuZGxlOworICAgIEhBTkRMRTE2IGhhbmRsZTsKICAgICBBVE9NVEFCTEUgKnRhYmxlOwogCiAgICAgICAvKiBBbGxvY2F0ZSB0aGUgdGFibGUgKi8KQEAgLTcyLDkgKzcyLDkgQEAKICAqCiAgKiBHbG9iYWwgdGFibGUgaW5pdGlhbGlzYXRpb24uCiAgKi8KLVdPUkQgQVRPTV9Jbml0KCkKK0JPT0wgQVRPTV9Jbml0KHZvaWQpCiB7Ci0gICAgcmV0dXJuIEFUT01fSW5pdFRhYmxlKCBVU0VSX0hlYXBTZWwsIERFRkFVTFRfQVRPTVRBQkxFX1NJWkUgKTsKKyAgICByZXR1cm4gQVRPTV9Jbml0VGFibGUoIFVTRVJfSGVhcFNlbCwgREVGQVVMVF9BVE9NVEFCTEVfU0laRSApICE9IDA7CiB9CiAKIApAQCAtMTI0LDIxICsxMjQsMTUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEFUT01fQWRkQXRvbQogICovCi1zdGF0aWMgQVRPTSBBVE9NX0FkZEF0b20oIFdPUkQgc2VsZWN0b3IsIFNFR1BUUiBuYW1lICkKK3N0YXRpYyBBVE9NIEFUT01fQWRkQXRvbSggV09SRCBzZWxlY3RvciwgTFBDU1RSIHN0ciApCiB7CiAgICAgV09SRCBoYXNoOwogICAgIEhBTkRMRSBlbnRyeTsKICAgICBBVE9NRU5UUlkgKiBlbnRyeVB0cjsKICAgICBBVE9NVEFCTEUgKiB0YWJsZTsKICAgICBpbnQgbGVuOwotICAgIGNoYXIgKnN0cjsKIAotICAgIC8qIENoZWNrIGZvciBpbnRlZ2VyIGF0b20gKi8KLQotICAgIGlmICghSElXT1JEKG5hbWUpKSByZXR1cm4gKEFUT00pTE9XT1JEKG5hbWUpOwotICAgIHN0ciA9IFBUUl9TRUdfVE9fTElOKCBuYW1lICk7Ci0gICAgaWYgKHN0clswXSA9PSAnIycpIHJldHVybiBhdG9pKCAmc3RyWzFdICk7Ci0KKyAgICBpZiAoc3RyWzBdID09ICcjJykgcmV0dXJuIGF0b2koICZzdHJbMV0gKTsgIC8qIENoZWNrIGZvciBpbnRlZ2VyIGF0b20gKi8KICAgICBpZiAoKGxlbiA9IHN0cmxlbiggc3RyICkpID4gMjU1KSBsZW4gPSAyNTU7CiAgICAgaWYgKCEodGFibGUgPSBBVE9NX0dldFRhYmxlKCBzZWxlY3RvciwgVFJVRSApKSkgcmV0dXJuIDA7CiAgICAgaGFzaCA9IEFUT01fSGFzaCggdGFibGUtPnNpemUsIHN0ciwgbGVuICk7CkBAIC0xNTksNyArMTUzLDYgQEAKICAgICBpZiAoIWVudHJ5KSByZXR1cm4gMDsKICAgICAvKiBSZWxvYWQgdGhlIHRhYmxlIHB0ciBpbiBjYXNlIGl0IG1vdmVkIGluIGxpbmVhciBtZW1vcnkgKi8KICAgICB0YWJsZSA9IEFUT01fR2V0VGFibGUoIHNlbGVjdG9yLCBGQUxTRSApOwotICAgIHN0ciA9IFBUUl9TRUdfVE9fTElOKCBuYW1lICk7CiAgICAgZW50cnlQdHIgPSBBVE9NX01ha2VQdHIoIHNlbGVjdG9yLCBlbnRyeSApOwogICAgIGVudHJ5UHRyLT5uZXh0ID0gdGFibGUtPmVudHJpZXNbaGFzaF07CiAgICAgZW50cnlQdHItPnJlZkNvdW50ID0gMTsKQEAgLTIwOSwyMCArMjAyLDE0IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBBVE9NX0ZpbmRBdG9tCiAgKi8KLXN0YXRpYyBBVE9NIEFUT01fRmluZEF0b20oIFdPUkQgc2VsZWN0b3IsIFNFR1BUUiBuYW1lICkKK3N0YXRpYyBBVE9NIEFUT01fRmluZEF0b20oIFdPUkQgc2VsZWN0b3IsIExQQ1NUUiBzdHIgKQogewogICAgIEFUT01UQUJMRSAqIHRhYmxlOwogICAgIFdPUkQgaGFzaDsKICAgICBIQU5ETEUgZW50cnk7CiAgICAgaW50IGxlbjsKLSAgICBjaGFyICpzdHI7CiAKLSAgICAvKiBDaGVjayBmb3IgaW50ZWdlciBhdG9tICovCi0KLSAgICBpZiAoIUhJV09SRChuYW1lKSkgcmV0dXJuIChBVE9NKUxPV09SRChuYW1lKTsKLSAgICBzdHIgPSBQVFJfU0VHX1RPX0xJTiggbmFtZSApOwotICAgIGlmIChzdHJbMF0gPT0gJyMnKSByZXR1cm4gYXRvaSggJnN0clsxXSApOwotCisgICAgaWYgKHN0clswXSA9PSAnIycpIHJldHVybiBhdG9pKCAmc3RyWzFdICk7ICAvKiBDaGVjayBmb3IgaW50ZWdlciBhdG9tICovCiAgICAgaWYgKChsZW4gPSBzdHJsZW4oIHN0ciApKSA+IDI1NSkgbGVuID0gMjU1OwogICAgIGlmICghKHRhYmxlID0gQVRPTV9HZXRUYWJsZSggc2VsZWN0b3IsIEZBTFNFICkpKSByZXR1cm4gMDsKICAgICBoYXNoID0gQVRPTV9IYXNoKCB0YWJsZS0+c2l6ZSwgc3RyLCBsZW4gKTsKQEAgLTI0MiwxNCArMjI5LDE0IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBBVE9NX0dldEF0b21OYW1lCiAgKi8KLXN0YXRpYyBXT1JEIEFUT01fR2V0QXRvbU5hbWUoIFdPUkQgc2VsZWN0b3IsIEFUT00gYXRvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQU1RSIGJ1ZmZlciwgc2hvcnQgY291bnQgKQorc3RhdGljIFVJTlQzMiBBVE9NX0dldEF0b21OYW1lKCBXT1JEIHNlbGVjdG9yLCBBVE9NIGF0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQU1RSIGJ1ZmZlciwgSU5UMzIgY291bnQgKQogewogICAgIEFUT01UQUJMRSAqIHRhYmxlOwogICAgIEFUT01FTlRSWSAqIGVudHJ5UHRyOwogICAgIEhBTkRMRSBlbnRyeTsKICAgICBjaGFyICogc3RyUHRyOwotICAgIGludCBsZW47CisgICAgVUlOVDMyIGxlbjsKICAgICBjaGFyIHRleHRbOF07CiAgICAgCiAgICAgaWYgKCFjb3VudCkgcmV0dXJuIDA7CkBAIC0yOTgsNyArMjg1LDIwIEBACiAgKi8KIEFUT00gQWRkQXRvbSggU0VHUFRSIHN0ciApCiB7Ci0gICAgcmV0dXJuIEFUT01fQWRkQXRvbSggQ1VSUkVOVF9EUywgc3RyICk7CisgICAgQVRPTSBhdG9tOworICAgIEhBTkRMRTE2IGRzID0gQ1VSUkVOVF9EUzsKKworICAgIGlmICghSElXT1JEKHN0cikpIHJldHVybiAoQVRPTSlMT1dPUkQoc3RyKTsgIC8qIEludGVnZXIgYXRvbSAqLworICAgIGlmIChTRUxFQ1RPUl9UT19FTlRSWShMT1dPUkQoc3RyKSkgPT0gU0VMRUNUT1JfVE9fRU5UUlkoZHMpKQorICAgIHsKKyAgICAgICAgLyogSWYgdGhlIHN0cmluZyBpcyBpbiB0aGUgc2FtZSBkYXRhIHNlZ21lbnQgYXMgdGhlIGF0b20gdGFibGUsIG1ha2UgKi8KKyAgICAgICAgLyogYSBjb3B5IG9mIHRoZSBzdHJpbmcgdG8gYmUgc3VyZSBpdCBkb2Vzbid0IG1vdmUgaW4gbGluZWFyIG1lbW9yeS4gKi8KKyAgICAgICAgY2hhciBidWZmZXJbMjU2XTsKKyAgICAgICAgbHN0cmNweW4oIGJ1ZmZlciwgKGNoYXIgKilQVFJfU0VHX1RPX0xJTihzdHIpLCBzaXplb2YoYnVmZmVyKSApOworICAgICAgICBhdG9tID0gQVRPTV9BZGRBdG9tKCBkcywgYnVmZmVyICk7CisgICAgfQorICAgIGVsc2UgYXRvbSA9IEFUT01fQWRkQXRvbSggZHMsIChMUENTVFIpUFRSX1NFR19UT19MSU4oc3RyKSApOworICAgIHJldHVybiBhdG9tOwogfQogCiAKQEAgLTMxNiw3ICszMTYsOCBAQAogICovCiBBVE9NIEZpbmRBdG9tKCBTRUdQVFIgc3RyICkKIHsKLSAgICByZXR1cm4gQVRPTV9GaW5kQXRvbSggQ1VSUkVOVF9EUywgc3RyICk7CisgICAgaWYgKCFISVdPUkQoc3RyKSkgcmV0dXJuIChBVE9NKUxPV09SRChzdHIpOyAgLyogSW50ZWdlciBhdG9tICovCisgICAgcmV0dXJuIEFUT01fRmluZEF0b20oIENVUlJFTlRfRFMsIChMUENTVFIpUFRSX1NFR19UT19MSU4oc3RyKSApOwogfQogCiAKQEAgLTMyNSwyNCArMzI2LDQ3IEBACiAgKi8KIFdPUkQgR2V0QXRvbU5hbWUoIEFUT00gYXRvbSwgTFBTVFIgYnVmZmVyLCBzaG9ydCBjb3VudCApCiB7Ci0gICAgcmV0dXJuIEFUT01fR2V0QXRvbU5hbWUoIENVUlJFTlRfRFMsIGF0b20sIGJ1ZmZlciwgY291bnQgKTsKKyAgICByZXR1cm4gKFdPUkQpQVRPTV9HZXRBdG9tTmFtZSggQ1VSUkVOVF9EUywgYXRvbSwgYnVmZmVyLCBjb3VudCApOwogfQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEdsb2JhbEFkZEF0b20gICAoVVNFUi4yNjgpCisgKiAgICAgICAgICAgR2xvYmFsQWRkQXRvbTE2ICAgKFVTRVIuMjY4KQogICovCi1BVE9NIEdsb2JhbEFkZEF0b20oIFNFR1BUUiBzdHIgKQorQVRPTSBHbG9iYWxBZGRBdG9tMTYoIFNFR1BUUiBzdHIgKQogeworICAgIGlmICghSElXT1JEKHN0cikpIHJldHVybiAoQVRPTSlMT1dPUkQoc3RyKTsgIC8qIEludGVnZXIgYXRvbSAqLwogI2lmZGVmIENPTkZJR19JUEMKICAgICBpZiAoT3B0aW9ucy5pcGMpIHJldHVybiBEREVfR2xvYmFsQWRkQXRvbSggc3RyICk7CiAjZW5kaWYKKyAgICByZXR1cm4gQVRPTV9BZGRBdG9tKCBVU0VSX0hlYXBTZWwsIChMUENTVFIpUFRSX1NFR19UT19MSU4oc3RyKSApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdsb2JhbEFkZEF0b20zMkEgICAoS0VSTkVMMzIuMzEzKQorICovCitBVE9NIEdsb2JhbEFkZEF0b20zMkEoIExQQ1NUUiBzdHIgKQoreworICAgIGlmICghSElXT1JEKHN0cikpIHJldHVybiAoQVRPTSlMT1dPUkQoc3RyKTsgIC8qIEludGVnZXIgYXRvbSAqLwogICAgIHJldHVybiBBVE9NX0FkZEF0b20oIFVTRVJfSGVhcFNlbCwgc3RyICk7CiB9CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2xvYmFsRGVsZXRlQXRvbSAgIChVU0VSLjI2OSkKKyAqICAgICAgICAgICBHbG9iYWxBZGRBdG9tMzJXICAgKEtFUk5FTDMyLjMxNCkKKyAqLworQVRPTSBHbG9iYWxBZGRBdG9tMzJXKCBMUENXU1RSIHN0ciApCit7CisgICAgY2hhciBidWZmZXJbTUFYX0FUT01fTEVOKzFdOworICAgIGlmICghSElXT1JEKHN0cikpIHJldHVybiAoQVRPTSlMT1dPUkQoc3RyKTsgIC8qIEludGVnZXIgYXRvbSAqLworICAgIFNUUklORzMyX1VuaVRvQW5zaSggYnVmZmVyLCBzdHIgKTsgIC8qIEZJWE1FOiAnc3RyJyBsZW5ndGg/ICovCisgICAgcmV0dXJuIEFUT01fQWRkQXRvbSggVVNFUl9IZWFwU2VsLCBidWZmZXIgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBHbG9iYWxEZWxldGVBdG9tICAgKFVTRVIuMjY5KSAoS0VSTkVMMzIuMzE3KQogICovCiBBVE9NIEdsb2JhbERlbGV0ZUF0b20oIEFUT00gYXRvbSApCiB7CkBAIC0zNTQsMjYgKzM3OCw2OSBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEdsb2JhbEZpbmRBdG9tICAgKFVTRVIuMjcwKQorICogICAgICAgICAgIEdsb2JhbEZpbmRBdG9tMTYgICAoVVNFUi4yNzApCiAgKi8KLUFUT00gR2xvYmFsRmluZEF0b20oIFNFR1BUUiBzdHIgKQorQVRPTSBHbG9iYWxGaW5kQXRvbTE2KCBTRUdQVFIgc3RyICkKIHsKKyAgICBpZiAoIUhJV09SRChzdHIpKSByZXR1cm4gKEFUT00pTE9XT1JEKHN0cik7ICAvKiBJbnRlZ2VyIGF0b20gKi8KICNpZmRlZiBDT05GSUdfSVBDCiAgICAgaWYgKE9wdGlvbnMuaXBjKSByZXR1cm4gRERFX0dsb2JhbEZpbmRBdG9tKCBzdHIgKTsKICNlbmRpZgorICAgIHJldHVybiBBVE9NX0ZpbmRBdG9tKCBVU0VSX0hlYXBTZWwsIChMUENTVFIpUFRSX1NFR19UT19MSU4oc3RyKSApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdsb2JhbEZpbmRBdG9tMzJBICAgKEtFUk5FTDMyLjMxOCkKKyAqLworQVRPTSBHbG9iYWxGaW5kQXRvbTMyQSggTFBDU1RSIHN0ciApCit7CisgICAgaWYgKCFISVdPUkQoc3RyKSkgcmV0dXJuIChBVE9NKUxPV09SRChzdHIpOyAgLyogSW50ZWdlciBhdG9tICovCiAgICAgcmV0dXJuIEFUT01fRmluZEF0b20oIFVTRVJfSGVhcFNlbCwgc3RyICk7CiB9CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2xvYmFsR2V0QXRvbU5hbWUgICAoVVNFUi4yNzEpCisgKiAgICAgICAgICAgR2xvYmFsRmluZEF0b20zMlcgICAoS0VSTkVMMzIuMzE5KQogICovCi1XT1JEIEdsb2JhbEdldEF0b21OYW1lKCBBVE9NIGF0b20sIExQU1RSIGJ1ZmZlciwgc2hvcnQgY291bnQgKQorQVRPTSBHbG9iYWxGaW5kQXRvbTMyVyggTFBDV1NUUiBzdHIgKQoreworICAgIGNoYXIgYnVmZmVyW01BWF9BVE9NX0xFTisxXTsKKyAgICBpZiAoIUhJV09SRChzdHIpKSByZXR1cm4gKEFUT00pTE9XT1JEKHN0cik7ICAvKiBJbnRlZ2VyIGF0b20gKi8KKyAgICBTVFJJTkczMl9VbmlUb0Fuc2koIGJ1ZmZlciwgc3RyICk7ICAvKiBGSVhNRTogJ3N0cicgbGVuZ3RoPyAqLworICAgIHJldHVybiBBVE9NX0ZpbmRBdG9tKCBVU0VSX0hlYXBTZWwsIGJ1ZmZlciApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdsb2JhbEdldEF0b21OYW1lMTYgICAoVVNFUi4yNzEpCisgKi8KK1VJTlQxNiBHbG9iYWxHZXRBdG9tTmFtZTE2KCBBVE9NIGF0b20sIExQU1RSIGJ1ZmZlciwgSU5UMTYgY291bnQgKQogewogI2lmZGVmIENPTkZJR19JUEMKICAgICBpZiAoT3B0aW9ucy5pcGMpIHJldHVybiBEREVfR2xvYmFsR2V0QXRvbU5hbWUoIGF0b20sIGJ1ZmZlciwgY291bnQgKTsKICNlbmRpZgorICAgIHJldHVybiAoVUlOVDE2KUFUT01fR2V0QXRvbU5hbWUoIFVTRVJfSGVhcFNlbCwgYXRvbSwgYnVmZmVyLCBjb3VudCApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdsb2JhbEdldEF0b21OYW1lMzJBICAgKEtFUk5FTDMyLjMyMykKKyAqLworVUlOVDMyIEdsb2JhbEdldEF0b21OYW1lMzJBKCBBVE9NIGF0b20sIExQU1RSIGJ1ZmZlciwgSU5UMzIgY291bnQgKQorewogICAgIHJldHVybiBBVE9NX0dldEF0b21OYW1lKCBVU0VSX0hlYXBTZWwsIGF0b20sIGJ1ZmZlciwgY291bnQgKTsKIH0KIAotI2VuZGlmICAvKiBXSU5FTElCICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBHbG9iYWxHZXRBdG9tTmFtZTMyVyAgIChLRVJORUwzMi4zMjQpCisgKi8KK1VJTlQzMiBHbG9iYWxHZXRBdG9tTmFtZTMyVyggQVRPTSBhdG9tLCBMUFdTVFIgYnVmZmVyLCBJTlQzMiBjb3VudCApCit7CisgICAgVUlOVDMyIGxlbjsKKyAgICBjaGFyIHRtcFtNQVhfQVRPTV9MRU4rMV07CisgICAgaWYgKGNvdW50ID4gc2l6ZW9mKHRtcCkpIGNvdW50ID0gc2l6ZW9mKHRtcCk7CisgICAgbGVuID0gQVRPTV9HZXRBdG9tTmFtZSggVVNFUl9IZWFwU2VsLCBhdG9tLCB0bXAsIGNvdW50ICk7CisgICAgU1RSSU5HMzJfQW5zaVRvVW5pKCBidWZmZXIsIHRtcCApOyAgLyogRklYTUU6IGxlbj8gKi8KKyAgICByZXR1cm4gbGVuOworfQpkaWZmIC0tZ2l0IGEvbWVtb3J5L2dsb2JhbC5jIGIvbWVtb3J5L2dsb2JhbC5jCmluZGV4IDc4MDM4NTEuLjAyMmFkNGUgMTAwNjQ0Ci0tLSBhL21lbW9yeS9nbG9iYWwuYworKysgYi9tZW1vcnkvZ2xvYmFsLmMKQEAgLTQ0MSw3ICs0NDEsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgR2xvYmFsVW5sb2NrMTYgICAoS0VSTkVMLjE5KQogICovCi1CT09MIEdsb2JhbFVubG9jazE2KCBIR0xPQkFMMTYgaGFuZGxlICkKK0JPT0wxNiBHbG9iYWxVbmxvY2sxNiggSEdMT0JBTDE2IGhhbmRsZSApCiB7CiAgICAgZHByaW50Zl9nbG9iYWwoIHN0ZGRlYiwgIkdsb2JhbFVubG9jazE2OiAlMDR4XG4iLCBoYW5kbGUgKTsKICAgICByZXR1cm4gMDsKQEAgLTkxMSw3ICs5MTEsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgR2xvYmFsVW5sb2NrMzIgICAoS0VSTkVMMzIuMzMyKQogICovCi1CT09MIEdsb2JhbFVubG9jazMyKCBIR0xPQkFMMzIgaGFuZGxlICkKK0JPT0wzMiBHbG9iYWxVbmxvY2szMiggSEdMT0JBTDMyIGhhbmRsZSApCiB7CiAgICAgcmV0dXJuIFRSVUU7CiB9CmRpZmYgLS1naXQgYS9tZW1vcnkvaGVhcC5jIGIvbWVtb3J5L2hlYXAuYwppbmRleCA3N2ZkZWQwLi44YmE2MGU4IDEwMDY0NAotLS0gYS9tZW1vcnkvaGVhcC5jCisrKyBiL21lbW9yeS9oZWFwLmMKQEAgLTEwLDYgKzEwLDcgQEAKICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAiZGVidWdnZXIuaCIKICNpbmNsdWRlICJrZXJuZWwzMi5oIiAgLyogZm9yIENSSVRJQ0FMX1NFQ1RJT04gKi8KKyNpbmNsdWRlICJzZWxlY3RvcnMuaCIKICNpbmNsdWRlICJ3aW5iYXNlLmgiCiAjaW5jbHVkZSAid2luZXJyb3IuaCIKICNpbmNsdWRlICJ3aW5udC5oIgpAQCAtNzIsNiArNzMsNyBAQAogICAgIHN0cnVjdCB0YWdTVUJIRUFQICAqbmV4dDsgICAgICAgLyogTmV4dCBzdWItaGVhcCAqLwogICAgIHN0cnVjdCB0YWdIRUFQICAgICAqaGVhcDsgICAgICAgLyogTWFpbiBoZWFwIHN0cnVjdHVyZSAqLwogICAgIERXT1JEICAgICAgICAgICAgICAgbWFnaWM7ICAgICAgLyogTWFnaWMgbnVtYmVyICovCisgICAgV09SRCAgICAgICAgICAgICAgICBzZWxlY3RvcjsgICAvKiBTZWxlY3RvciBmb3IgSEVBUF9XSU5FX1NFR1BUUiBoZWFwcyAqLwogfSBTVUJIRUFQOwogCiAjZGVmaW5lIFNVQkhFQVBfTUFHSUMgICAgKChEV09SRCkoJ1MnIHwgKCdVJzw8OCkgfCAoJ0InPDwxNikgfCAoJ0gnPDwyNCkpKQpAQCAtMjE2LDcgKzIxOCw3IEBACiAgKgogICogRmluZCB0aGUgc3ViLWhlYXAgY29udGFpbmluZyBhIGdpdmVuIGFkZHJlc3MuCiAgKi8KLXN0YXRpYyBTVUJIRUFQICpIRUFQX0ZpbmRTdWJIZWFwKCBIRUFQICpoZWFwLCB2b2lkICpwdHIgKQorc3RhdGljIFNVQkhFQVAgKkhFQVBfRmluZFN1YkhlYXAoIEhFQVAgKmhlYXAsIExQQ1ZPSUQgcHRyICkKIHsKICAgICBTVUJIRUFQICpzdWIgPSAmaGVhcC0+c3ViaGVhcDsKICAgICB3aGlsZSAoc3ViKQpAQCAtNDA5LDE2ICs0MTEsMjUgQEAKICAqCiAgKiBDcmVhdGUgYSBzdWItaGVhcCBvZiB0aGUgZ2l2ZW4gc2l6ZS4KICAqLwotc3RhdGljIFNVQkhFQVAgKkhFQVBfQ3JlYXRlU3ViSGVhcCggRFdPUkQgY29tbWl0U2l6ZSwgRFdPUkQgdG90YWxTaXplICkKK3N0YXRpYyBTVUJIRUFQICpIRUFQX0NyZWF0ZVN1YkhlYXAoIERXT1JEIGZsYWdzLCBEV09SRCBjb21taXRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgdG90YWxTaXplICkKIHsKICAgICBTVUJIRUFQICpzdWJoZWFwOworICAgIFdPUkQgc2VsZWN0b3IgPSAwOwogCiAgICAgLyogUm91bmQtdXAgc2l6ZXMgb24gYSA2NEsgYm91bmRhcnkgKi8KIAotICAgIHRvdGFsU2l6ZSAgPSAodG90YWxTaXplICsgMHhmZmZmKSAmIDB4ZmZmZjAwMDA7Ci0gICAgY29tbWl0U2l6ZSA9IChjb21taXRTaXplICsgMHhmZmZmKSAmIDB4ZmZmZjAwMDA7Ci0gICAgaWYgKCFjb21taXRTaXplKSBjb21taXRTaXplID0gMHgxMDAwMDsKLSAgICBpZiAodG90YWxTaXplIDwgY29tbWl0U2l6ZSkgdG90YWxTaXplID0gY29tbWl0U2l6ZTsKKyAgICBpZiAoZmxhZ3MgJiBIRUFQX1dJTkVfU0VHUFRSKQorICAgIHsKKyAgICAgICAgdG90YWxTaXplID0gY29tbWl0U2l6ZSA9IDB4MTAwMDA7ICAvKiBPbmx5IDY0SyBhdCBhIHRpbWUgZm9yIFNFR1BUUnMgKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdG90YWxTaXplICA9ICh0b3RhbFNpemUgKyAweGZmZmYpICYgMHhmZmZmMDAwMDsKKyAgICAgICAgY29tbWl0U2l6ZSA9IChjb21taXRTaXplICsgMHhmZmZmKSAmIDB4ZmZmZjAwMDA7CisgICAgICAgIGlmICghY29tbWl0U2l6ZSkgY29tbWl0U2l6ZSA9IDB4MTAwMDA7CisgICAgICAgIGlmICh0b3RhbFNpemUgPCBjb21taXRTaXplKSB0b3RhbFNpemUgPSBjb21taXRTaXplOworICAgIH0KIAogICAgIC8qIEFsbG9jYXRlIHRoZSBtZW1vcnkgYmxvY2sgKi8KIApAQCAtNDM3LDYgKzQ0OCwyMSBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKKyAgICAvKiBBbGxvY2F0ZSBhIHNlbGVjdG9yIGlmIG5lZWRlZCAqLworCisgICAgaWYgKGZsYWdzICYgSEVBUF9XSU5FX1NFR1BUUikKKyAgICB7CisgICAgICAgIHNlbGVjdG9yID0gU0VMRUNUT1JfQWxsb2NCbG9jayggc3ViaGVhcCwgdG90YWxTaXplLAorICAgICAgICAgICAgICAgICAgICAgKGZsYWdzICYgSEVBUF9XSU5FX0NPREVTRUcpID8gU0VHTUVOVF9DT0RFIDogU0VHTUVOVF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgKGZsYWdzICYgSEVBUF9XSU5FX0NPREVTRUcpICE9IDAsIEZBTFNFICk7CisgICAgICAgIGlmICghc2VsZWN0b3IpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIkhFQVBfQ3JlYXRlU3ViSGVhcDogY291bGQgbm90IGFsbG9jYXRlIHNlbGVjdG9yXG4iICk7CisgICAgICAgICAgICBWaXJ0dWFsRnJlZSggc3ViaGVhcCwgMCwgTUVNX1JFTEVBU0UgKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCiAgICAgLyogRmlsbCB0aGUgc3ViLWhlYXAgc3RydWN0dXJlICovCiAKICAgICBzdWJoZWFwLT5zaXplICAgICAgID0gdG90YWxTaXplOwpAQCAtNDQ1LDYgKzQ3MSw3IEBACiAgICAgc3ViaGVhcC0+bmV4dCAgICAgICA9IE5VTEw7CiAgICAgc3ViaGVhcC0+aGVhcCAgICAgICA9IE5VTEw7CiAgICAgc3ViaGVhcC0+bWFnaWMgICAgICA9IFNVQkhFQVBfTUFHSUM7CisgICAgc3ViaGVhcC0+c2VsZWN0b3IgICA9IHNlbGVjdG9yOwogICAgIHJldHVybiBzdWJoZWFwOwogfQogCkBAIC00OTAsNyArNTE3LDggQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIHNpemUgKz0gc2l6ZW9mKFNVQkhFQVApICsgc2l6ZW9mKEFSRU5BX0ZSRUUpOwotICAgIGlmICghKHN1YmhlYXAgPSBIRUFQX0NyZWF0ZVN1YkhlYXAoIHNpemUsIE1BWCggSEVBUF9ERUZfU0laRSwgc2l6ZSApICkpKQorICAgIGlmICghKHN1YmhlYXAgPSBIRUFQX0NyZWF0ZVN1YkhlYXAoIGhlYXAtPmZsYWdzLCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWCggSEVBUF9ERUZfU0laRSwgc2l6ZSApICkpKQogICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIC8qIEluc2VydCB0aGUgbmV3IHN1Yi1oZWFwIGluIHRoZSBsaXN0ICovCkBAIC02NzUsNiArNzAzLDcyIEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgSEVBUF9Jc0luc2lkZUhlYXAKKyAqCisgKiBDaGVjayB3aGV0aGVyIHRoZSBwb2ludGVyIGlzIHRvIGEgYmxvY2sgaW5zaWRlIGEgZ2l2ZW4gaGVhcC4KKyAqLworaW50IEhFQVBfSXNJbnNpZGVIZWFwKCBIQU5ETEUzMiBoZWFwLCBEV09SRCBmbGFncywgTFBDVk9JRCBwdHIgKQoreworICAgIEhFQVAgKmhlYXBQdHIgPSBIRUFQX0dldFB0ciggaGVhcCApOworICAgIFNVQkhFQVAgKnN1YmhlYXA7CisgICAgaW50IHJldDsKKworICAgIC8qIFZhbGlkYXRlIHRoZSBwYXJhbWV0ZXJzICovCisKKyAgICBpZiAoIWhlYXBQdHIpIHJldHVybiAwOworICAgIGZsYWdzIHw9IGhlYXBQdHItPmZsYWdzOworICAgIGlmICghKGZsYWdzICYgSEVBUF9OT19TRVJJQUxJWkUpKSBIZWFwTG9jayggaGVhcCApOworICAgIHJldCA9ICgoKHN1YmhlYXAgPSBIRUFQX0ZpbmRTdWJIZWFwKCBoZWFwUHRyLCBwdHIgKSkgIT0gTlVMTCkgJiYKKyAgICAgICAgICAgKCgoY2hhciAqKXB0ciA+PSAoY2hhciAqKXN1YmhlYXAgKyBzdWJoZWFwLT5oZWFkZXJTaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNpemVvZihBUkVOQV9JTlVTRSkpKSk7CisgICAgaWYgKCEoZmxhZ3MgJiBIRUFQX05PX1NFUklBTElaRSkpIEhlYXBVbmxvY2soIGhlYXAgKTsKKyAgICByZXR1cm4gcmV0OworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEhFQVBfR2V0U2VncHRyCisgKgorICogVHJhbnNmb3JtIGEgbGluZWFyIHBvaW50ZXIgaW50byBhIFNFR1BUUi4gVGhlIHBvaW50ZXIgbXVzdCBoYXZlIGJlZW4KKyAqIGFsbG9jYXRlZCBmcm9tIGEgSEVBUF9XSU5FX1NFR1BUUiBoZWFwLgorICovCitTRUdQVFIgSEVBUF9HZXRTZWdwdHIoIEhBTkRMRTMyIGhlYXAsIERXT1JEIGZsYWdzLCBMUENWT0lEIHB0ciApCit7CisgICAgSEVBUCAqaGVhcFB0ciA9IEhFQVBfR2V0UHRyKCBoZWFwICk7CisgICAgU1VCSEVBUCAqc3ViaGVhcDsKKyAgICBTRUdQVFIgcmV0OworCisgICAgLyogVmFsaWRhdGUgdGhlIHBhcmFtZXRlcnMgKi8KKworICAgIGlmICghaGVhcFB0cikgcmV0dXJuIDA7CisgICAgZmxhZ3MgfD0gaGVhcFB0ci0+ZmxhZ3M7CisgICAgaWYgKCEoZmxhZ3MgJiBIRUFQX1dJTkVfU0VHUFRSKSkKKyAgICB7CisgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIkhFQVBfR2V0U2VncHRyOiBoZWFwICUwOHggaXMgbm90IGEgU0VHUFRSIGhlYXBcbiIsCisgICAgICAgICAgICAgICAgIGhlYXAgKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICghKGZsYWdzICYgSEVBUF9OT19TRVJJQUxJWkUpKSBIZWFwTG9jayggaGVhcCApOworCisgICAgLyogR2V0IHRoZSBzdWJoZWFwICovCisKKyAgICBpZiAoIShzdWJoZWFwID0gSEVBUF9GaW5kU3ViSGVhcCggaGVhcFB0ciwgcHRyICkpKQorICAgIHsKKyAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiSEVBUF9HZXRTZWdwdHI6ICVwIGlzIG5vdCBpbnNpZGUgaGVhcCAlMDh4XG4iLAorICAgICAgICAgICAgICAgICBwdHIsIGhlYXAgKTsKKyAgICAgICAgaWYgKCEoZmxhZ3MgJiBIRUFQX05PX1NFUklBTElaRSkpIEhlYXBVbmxvY2soIGhlYXAgKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogQnVpbGQgdGhlIFNFR1BUUiAqLworCisgICAgcmV0ID0gUFRSX1NFR19PRkZfVE9fU0VHUFRSKHN1YmhlYXAtPnNlbGVjdG9yLCAoRFdPUkQpcHRyLShEV09SRClzdWJoZWFwKTsKKyAgICBpZiAoIShmbGFncyAmIEhFQVBfTk9fU0VSSUFMSVpFKSkgSGVhcFVubG9jayggaGVhcCApOworICAgIHJldHVybiByZXQ7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgSGVhcENyZWF0ZSAgIChLRVJORUwzMi4zMzYpCiAgKi8KIEhBTkRMRTMyIEhlYXBDcmVhdGUoIERXT1JEIGZsYWdzLCBEV09SRCBpbml0aWFsU2l6ZSwgRFdPUkQgbWF4U2l6ZSApCkBAIC02OTEsNyArNzg1LDcgQEAKICAgICAgICAgbWF4U2l6ZSA9IEhFQVBfREVGX1NJWkU7CiAgICAgICAgIGZsYWdzIHw9IEhFQVBfR1JPV0FCTEU7CiAgICAgfQotICAgIGlmICghKHN1YmhlYXAgPSBIRUFQX0NyZWF0ZVN1YkhlYXAoIGluaXRpYWxTaXplLCBtYXhTaXplICkpKQorICAgIGlmICghKHN1YmhlYXAgPSBIRUFQX0NyZWF0ZVN1YkhlYXAoIGZsYWdzLCBpbml0aWFsU2l6ZSwgbWF4U2l6ZSApKSkKICAgICB7CiAgICAgICAgIFNldExhc3RFcnJvciggRVJST1JfT1VUT0ZNRU1PUlkgKTsKICAgICAgICAgcmV0dXJuIDA7CkBAIC0xMDk1LDUgKzExODksMTggQEAKICAqLwogQk9PTCBIZWFwV2FsayggSEFORExFMzIgaGVhcCwgdm9pZCAqZW50cnkgKQogeworICAgIGZwcmludGYoIHN0ZGVyciwgIkhlYXBXYWxrKCUwOHgpOiBub3QgaW1wbGVtZW50ZWRcbiIsIGhlYXAgKTsKICAgICByZXR1cm4gRkFMU0U7CiB9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgSEVBUF9zdHJkdXBBCisgKi8KK0xQU1RSIEhFQVBfc3RyZHVwQSggSEFORExFMzIgaGVhcCwgRFdPUkQgZmxhZ3MsIExQQ1NUUiBzdHIgKQoreworICAgIElOVDMyIGxlbiA9IGxzdHJsZW4oc3RyKSArIDE7CisgICAgTFBTVFIgcCA9IEhlYXBBbGxvYyggaGVhcCwgZmxhZ3MsIGxlbiApOworICAgIGlmIChwKSBzdHJjcHkoIHAsIHN0ciApOworICAgIHJldHVybiBwOworfQpkaWZmIC0tZ2l0IGEvbWVtb3J5L2xvY2FsLmMgYi9tZW1vcnkvbG9jYWwuYwppbmRleCAzOGNiM2VhLi5kM2FlY2ZhIDEwMDY0NAotLS0gYS9tZW1vcnkvbG9jYWwuYworKysgYi9tZW1vcnkvbG9jYWwuYwpAQCAtNTA1LDYgKzUwNSw2MiBAQAogICAgIHJldHVybiAwOwogfQogCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIExPQ0FMX1Nocmlua0FyZW5hCisgKgorICogU2hyaW5rIGFuIGFyZW5hIGJ5IGNyZWF0aW5nIGEgZnJlZSBibG9jayBhdCBpdHMgZW5kIGlmIHBvc3NpYmxlLgorICogJ3NpemUnIGluY2x1ZGVzIHRoZSBhcmVuYSBoZWFkZXIsIGFuZCBtdXN0IGJlIGFsaWduZWQuCisgKi8KK3N0YXRpYyB2b2lkIExPQ0FMX1Nocmlua0FyZW5hKCBXT1JEIGRzLCBXT1JEIGFyZW5hLCBXT1JEIHNpemUgKQoreworICAgIGNoYXIgKnB0ciA9IFBUUl9TRUdfT0ZGX1RPX0xJTiggZHMsIDAgKTsKKyAgICBMT0NBTEFSRU5BICpwQXJlbmEgPSBBUkVOQV9QVFIoIHB0ciwgYXJlbmEgKTsKKworICAgIGlmIChhcmVuYSArIHNpemUgKyBMQUxJR04oc2l6ZW9mKExPQ0FMQVJFTkEpKSA8IHBBcmVuYS0+bmV4dCkKKyAgICB7CisgICAgICAgIExPQ0FMSEVBUElORk8gKnBJbmZvID0gTE9DQUxfR2V0SGVhcCggZHMgKTsKKyAgICAgICAgaWYgKCFwSW5mbykgcmV0dXJuOworICAgICAgICBMT0NBTF9BZGRCbG9jayggcHRyLCBhcmVuYSwgYXJlbmEgKyBzaXplICk7CisgICAgICAgIHBJbmZvLT5pdGVtcysrOworICAgICAgICBMT0NBTF9GcmVlQXJlbmEoIGRzLCBhcmVuYSArIHNpemUgKTsKKyAgICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgTE9DQUxfR3Jvd0FyZW5hRG93bndhcmQKKyAqCisgKiBHcm93IGFuIGFyZW5hIGRvd253YXJkIGJ5IHVzaW5nIHRoZSBwcmV2aW91cyBhcmVuYSAobXVzdCBiZSBmcmVlKS4KKyAqLworc3RhdGljIHZvaWQgTE9DQUxfR3Jvd0FyZW5hRG93bndhcmQoIFdPUkQgZHMsIFdPUkQgYXJlbmEsIFdPUkQgbmV3c2l6ZSApCit7CisgICAgY2hhciAqcHRyID0gUFRSX1NFR19PRkZfVE9fTElOKCBkcywgMCApOworICAgIExPQ0FMSEVBUElORk8gKnBJbmZvOworICAgIExPQ0FMQVJFTkEgKnBBcmVuYSA9IEFSRU5BX1BUUiggcHRyLCBhcmVuYSApOworICAgIFdPUkQgcHJldkFyZW5hID0gcEFyZW5hLT5wcmV2ICYgfjM7CisgICAgTE9DQUxBUkVOQSAqcFByZXZBcmVuYSA9IEFSRU5BX1BUUiggcHRyLCBwcmV2QXJlbmEgKTsKKyAgICBXT1JEIG9mZnNldCwgc2l6ZTsKKyAgICBjaGFyICpwOworCisgICAgaWYgKCEocEluZm8gPSBMT0NBTF9HZXRIZWFwKCBkcyApKSkgcmV0dXJuOworICAgIG9mZnNldCA9IHBQcmV2QXJlbmEtPnNpemU7CisgICAgc2l6ZSA9IHBBcmVuYS0+bmV4dCAtIGFyZW5hIC0gQVJFTkFfSEVBREVSX1NJWkU7CisgICAgTE9DQUxfUmVtb3ZlRnJlZUJsb2NrKCBwdHIsIHByZXZBcmVuYSApOworICAgIExPQ0FMX1JlbW92ZUJsb2NrKCBwdHIsIGFyZW5hICk7CisgICAgcEluZm8tPml0ZW1zLS07CisgICAgcCA9IChjaGFyICopcFByZXZBcmVuYSArIEFSRU5BX0hFQURFUl9TSVpFOworICAgIHdoaWxlIChvZmZzZXQgPCBzaXplKQorICAgIHsKKyAgICAgICAgbWVtY3B5KCBwLCBwICsgb2Zmc2V0LCBvZmZzZXQgKTsKKyAgICAgICAgcCArPSBvZmZzZXQ7CisgICAgICAgIHNpemUgLT0gb2Zmc2V0OworICAgIH0KKyAgICBpZiAoc2l6ZSkgbWVtY3B5KCBwLCBwICsgb2Zmc2V0LCBzaXplICk7CisgICAgTE9DQUxfU2hyaW5rQXJlbmEoIGRzLCBwcmV2QXJlbmEsIG5ld3NpemUgKTsKK30KKworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBMT0NBTF9HZXRGcmVlU3BhY2UKICAqLwpAQCAtNTQzLDExICs1OTksMTEgQEAKICAqLwogc3RhdGljIFdPUkQgTE9DQUxfQ29tcGFjdCggSEFORExFMTYgZHMsIFdPUkQgbWluZnJlZSwgV09SRCBmbGFncyApCiB7Ci0gICAgY2hhciAqcHRyID0gUFRSX1NFR19PRkZfVE9fTElOKCBkcywgMCApLCAqZmNwLCAqbWNwOworICAgIGNoYXIgKnB0ciA9IFBUUl9TRUdfT0ZGX1RPX0xJTiggZHMsIDAgKTsKICAgICBMT0NBTEhFQVBJTkZPICpwSW5mbzsKICAgICBMT0NBTEFSRU5BICpwQXJlbmEsICpwTW92ZUFyZW5hLCAqcEZpbmFsQXJlbmE7CiAgICAgV09SRCBhcmVuYSwgbW92ZWFyZW5hLCBmaW5hbGFyZW5hLCB0YWJsZTsKLSAgICBXT1JEIGNvdW50LCBtb3Zlc2l6ZSwgc2l6ZSwgaTsKKyAgICBXT1JEIGNvdW50LCBtb3Zlc2l6ZSwgc2l6ZTsKICAgICBXT1JEIGZyZWVzcGFjZTsKICAgICBMT0NBTEhBTkRMRUVOVFJZICpwRW50cnk7CiAKQEAgLTYwNywxNiArNjYzLDEwIEBACiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBkcHJpbnRmX2xvY2FsKHN0ZGRlYiwgIk1vdmluZyBpdCB0byAlMDR4LlxuIiwgZmluYWxhcmVuYSk7CiAgICAgICAgICAgICAgICAgICAgIHBGaW5hbEFyZW5hID0gQVJFTkFfUFRSKHB0ciwgZmluYWxhcmVuYSk7Ci0KLQkgLyogQ2hlY2sgdG8gc2VlIGlmIGl0J3Mgd29ydGggY3JlYXRpbmcgYSBmcmVlIGFyZW5hIGF0IHRoZSBlbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYocEZpbmFsQXJlbmEtPnNpemUgPiBtb3Zlc2l6ZStMQUxJR04oc2l6ZW9mKExPQ0FMQVJFTkEpKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTE9DQUxfQWRkQmxvY2socHRyLCBmaW5hbGFyZW5hLCBmaW5hbGFyZW5hICsgbW92ZXNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgTE9DQUxfTWFrZUJsb2NrRnJlZShwdHIsIGZpbmFsYXJlbmEgKyBtb3Zlc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwSW5mby0+aXRlbXMrKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvKiBDb3B5IHRoZSBhcmVuYSB0byBpdCdzIG5ldyBsb2NhdGlvbiAqLworICAgICAgICAgICAgICAgICAgICBzaXplID0gcEZpbmFsQXJlbmEtPnNpemU7CiAgICAgICAgICAgICAgICAgICAgIExPQ0FMX1JlbW92ZUZyZWVCbG9jayhwdHIsIGZpbmFsYXJlbmEpOworICAgICAgICAgICAgICAgICAgICBMT0NBTF9TaHJpbmtBcmVuYSggZHMsIGZpbmFsYXJlbmEsIG1vdmVzaXplICk7CisgICAgICAgICAgICAgICAgICAgIC8qIENvcHkgdGhlIGFyZW5hIHRvIGl0J3MgbmV3IGxvY2F0aW9uICovCiAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgoY2hhciAqKXBGaW5hbEFyZW5hICsgQVJFTkFfSEVBREVSX1NJWkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKXBNb3ZlQXJlbmEgKyBBUkVOQV9IRUFERVJfU0laRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVzaXplIC0gQVJFTkFfSEVBREVSX1NJWkUgKTsKQEAgLTYzMSwxNyArNjgxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgLyogUHJldmlvdXMgYXJlbmEgaXMgZnJlZSAoYnV0IDwgbW92ZXNpemUpICAqLwogICAgICAgICAgICAgICAgICAgICAvKiBzbyB3ZSBjYW4gJ3NsaWRlJyBtb3ZlYXJlbmEgZG93biBpbnRvIGl0ICovCiAgICAgICAgICAgICAgICAgICAgIGZpbmFsYXJlbmEgPSBwTW92ZUFyZW5hLT5wcmV2ICYgfjM7Ci0gICAgICAgICAgICAgICAgICAgIHBGaW5hbEFyZW5hID0gQVJFTkFfUFRSKHB0ciwgZmluYWxhcmVuYSk7Ci0gICAgICAgICAgICAgICAgICAgIGRwcmludGZfbG9jYWwoc3RkZGViLCAiU2xpZGluZyBhcmVuYSAlMDR4IHRvICUwNHguXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVhcmVuYSwgZmluYWxhcmVuYSk7Ci0gICAgICAgICAgICAgICAgICAgIExPQ0FMX1JlbW92ZUZyZWVCbG9jayhwdHIsIGZpbmFsYXJlbmEpOwotICAgICAgICAgICAgICAgICAgICBMT0NBTF9SZW1vdmVCbG9jayhwdHIsIG1vdmVhcmVuYSk7Ci0gICAgICAgICAgICAgICAgICAgIG1jcCA9IChjaGFyICopcE1vdmVBcmVuYSArIEFSRU5BX0hFQURFUl9TSVpFOwotICAgICAgICAgICAgICAgICAgICBmY3AgPSAoY2hhciAqKXBGaW5hbEFyZW5hICsgQVJFTkFfSEVBREVSX1NJWkU7Ci0gICAgICAgICAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IG1vdmVzaXplIC0gQVJFTkFfSEVBREVSX1NJWkU7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgICAgICooZmNwKyspID0gKihtY3ArKyk7Ci0gICAgICAgICAgICAgICAgICAgIExPQ0FMX0FkZEJsb2NrKHB0ciwgZmluYWxhcmVuYSwgZmluYWxhcmVuYSArIG1vdmVzaXplKTsKLSAgICAgICAgICAgICAgICAgICAgTE9DQUxfTWFrZUJsb2NrRnJlZShwdHIsIGZpbmFsYXJlbmEgKyBtb3Zlc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIExPQ0FMX0dyb3dBcmVuYURvd253YXJkKCBkcywgbW92ZWFyZW5hLCBtb3Zlc2l6ZSApOwogICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgaGFuZGxlIHRhYmxlIGVudHJ5ICovCiAgICAgICAgICAgICAgICAgICAgIHBFbnRyeS0+YWRkciA9IGZpbmFsYXJlbmEgKyBBUkVOQV9IRUFERVJfU0laRTsKICAgICAgICAgICAgICAgICB9CkBAIC03NTMsMjEgKzc5MywxMyBAQAogCiAgICAgICAvKiBNYWtlIGEgYmxvY2sgb3V0IG9mIHRoZSBmcmVlIGFyZW5hICovCiAgICAgcEFyZW5hID0gQVJFTkFfUFRSKCBwdHIsIGFyZW5hICk7Ci0gICAgZHByaW50Zl9sb2NhbCggc3RkZGViLCAiTE9DQUxfR2V0QmxvY2sgc2l6ZSA9ICUwNHgsIGFyZW5hIGF0ICUwNHggc2l6ZSAlMDR4XG4iLCBzaXplLAotCQkgICBhcmVuYSwgcEFyZW5hLT5zaXplICk7Ci0gICAgaWYgKHBBcmVuYS0+c2l6ZSA+IHNpemUgKyBMQUxJR04oc2l6ZW9mKExPQ0FMQVJFTkEpKSkKLSAgICB7Ci0gICAgICAgIExPQ0FMX0FkZEJsb2NrKCBwdHIsIGFyZW5hLCBhcmVuYStzaXplICk7Ci0gICAgICAgIExPQ0FMX01ha2VCbG9ja0ZyZWUoIHB0ciwgYXJlbmErc2l6ZSApOwotICAgICAgICBwSW5mby0+aXRlbXMrKzsKLSAgICB9CisgICAgZHByaW50Zl9sb2NhbChzdGRkZWIsICJMT0NBTF9HZXRCbG9jayBzaXplID0gJTA0eCwgYXJlbmEgJTA0eCBzaXplICUwNHhcbiIsCisgICAgICAgICAgICAgICAgICBzaXplLCBhcmVuYSwgcEFyZW5hLT5zaXplICk7CiAgICAgTE9DQUxfUmVtb3ZlRnJlZUJsb2NrKCBwdHIsIGFyZW5hICk7CisgICAgTE9DQUxfU2hyaW5rQXJlbmEoIGRzLCBhcmVuYSwgc2l6ZSApOwogCi0gICAgaWYgKGZsYWdzICYgTE1FTV9aRVJPSU5JVCkgewotCW1lbXNldCggKGNoYXIgKilwQXJlbmEgKyBBUkVOQV9IRUFERVJfU0laRSwgMCwgc2l6ZSAtIEFSRU5BX0hFQURFUl9TSVpFICk7Ci0gICAgfQotCi0gICAgZHByaW50Zl9sb2NhbCggc3RkZGViLCAiTG9jYWxfR2V0QmxvY2s6IGFyZW5hIGF0ICUwNHhcbiIsIGFyZW5hICk7CisgICAgaWYgKGZsYWdzICYgTE1FTV9aRVJPSU5JVCkgbWVtc2V0KCAoY2hhciAqKXBBcmVuYSArIEFSRU5BX0hFQURFUl9TSVpFLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSAtIEFSRU5BX0hFQURFUl9TSVpFICk7CiAgICAgcmV0dXJuIGFyZW5hICsgQVJFTkFfSEVBREVSX1NJWkU7CiB9CiAKQEAgLTEwMDAsNyArMTAzMiwyNiBAQAogICAgIGlmICghKHBJbmZvID0gTE9DQUxfR2V0SGVhcCggZHMgKSkpIHJldHVybiAwOwogICAgIAogICAgIGlmIChIQU5ETEVfRklYRUQoIGhhbmRsZSApKSBibG9ja2hhbmRsZSA9IGhhbmRsZTsKLSAgICBlbHNlIGJsb2NraGFuZGxlID0gKihXT1JEICopKHB0ciArIGhhbmRsZSk7CisgICAgZWxzZQorICAgIHsKKwlwRW50cnkgPSAoTE9DQUxIQU5ETEVFTlRSWSAqKSAocHRyICsgaGFuZGxlKTsKKwlpZihwRW50cnktPmZsYWdzICYgKExNRU1fRElTQ0FSREVEID4+IDgpKQorICAgICAgICB7CisJICAgIGRwcmludGZfbG9jYWwoc3RkZGViLCAiUmVBbGxvY2F0aW5nIGRpc2NhcmRlZCBibG9ja1xuIik7CisJICAgIGlmICghKHBFbnRyeS0+YWRkciA9IExPQ0FMX0dldEJsb2NrKCBkcywgc2l6ZSwgZmxhZ3MpKSkgcmV0dXJuIDA7CisgICAgICAgICAgICBwdHIgPSBQVFJfU0VHX09GRl9UT19MSU4oIGRzLCAwICk7ICAvKiBSZWxvYWQgcHRyICovCisgICAgICAgICAgICBwRW50cnkgPSAoTE9DQUxIQU5ETEVFTlRSWSAqKSAocHRyICsgaGFuZGxlKTsKKyAgICAgICAgICAgIHBFbnRyeS0+ZmxhZ3MgPSAoQllURSkgKGZsYWdzID4+IDgpOworICAgICAgICAgICAgcEVudHJ5LT5sb2NrID0gMDsKKyAgICAgICAgICAgIHJldHVybiBoYW5kbGU7CisJfSAgICAKKwlpZiAoIShibG9ja2hhbmRsZSA9IHBFbnRyeS0+YWRkcikpCisJeworCSAgICBmcHJpbnRmKCBzdGRlcnIsICJMb2NhbF9SZUFsbG9jKCUwNHgsJTA0eCk6IGludmFsaWQgaGFuZGxlXG4iLAorICAgICAgICAgICAgICAgICAgICAgZHMsIGhhbmRsZSApOworCSAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KIAogICAgIGFyZW5hID0gQVJFTkFfSEVBREVSKCBibG9ja2hhbmRsZSApOwogICAgIGRwcmludGZfbG9jYWwoIHN0ZGRlYiwgIkxvY2FsUmVBbGxvYzogYXJlbmEgaXMgJTA0eFxuIiwgYXJlbmEgKTsKQEAgLTEwNTcsMTUgKzExMDgsMTUgQEAKIAogICAgICAgLyogQ2hlY2sgZm9yIHNpemUgcmVkdWN0aW9uICovCiAKLSAgICBpZiAobmV4dGFyZW5hIDwgcEFyZW5hLT5uZXh0KQorICAgIGlmIChuZXh0YXJlbmEgPD0gcEFyZW5hLT5uZXh0KQogICAgIHsKICAgICAgICAgaWYgKG5leHRhcmVuYSA8IHBBcmVuYS0+bmV4dCAtIExBTElHTihzaXplb2YoTE9DQUxBUkVOQSkpKQogICAgICAgICB7CiAJICAgIGRwcmludGZfbG9jYWwoIHN0ZGRlYiwgInNpemUgcmVkdWN0aW9uLCBtYWtpbmcgbmV3IGZyZWUgYmxvY2tcbiIpOwogICAgICAgICAgICAgICAvKiBJdCBpcyB3b3J0aCBtYWtpbmcgYSBuZXcgZnJlZSBibG9jayAqLwogICAgICAgICAgICAgTE9DQUxfQWRkQmxvY2soIHB0ciwgYXJlbmEsIG5leHRhcmVuYSApOwotICAgICAgICAgICAgTE9DQUxfTWFrZUJsb2NrRnJlZSggcHRyLCBuZXh0YXJlbmEgKTsKICAgICAgICAgICAgIHBJbmZvLT5pdGVtcysrOworICAgICAgICAgICAgTE9DQUxfRnJlZUFyZW5hKCBkcywgbmV4dGFyZW5hICk7CiAgICAgICAgIH0KICAgICAgICAgZHByaW50Zl9sb2NhbCggc3RkZGViLCAiTG9jYWxSZUFsbG9jOiByZXR1cm5pbmcgJTA0eFxuIiwgaGFuZGxlICk7CiAgICAgICAgIHJldHVybiBoYW5kbGU7CkBAIC0xMDgzLDggKzExMzQsOCBAQAogCSAgICBkcHJpbnRmX2xvY2FsKCBzdGRkZWIsICJzaXplIGluY3JlYXNlLCBtYWtpbmcgbmV3IGZyZWUgYmxvY2tcbiIpOwogICAgICAgICAgICAgICAvKiBJdCBpcyB3b3J0aCBtYWtpbmcgYSBuZXcgZnJlZSBibG9jayAqLwogICAgICAgICAgICAgTE9DQUxfQWRkQmxvY2soIHB0ciwgYXJlbmEsIG5leHRhcmVuYSApOwotICAgICAgICAgICAgTE9DQUxfTWFrZUJsb2NrRnJlZSggcHRyLCBuZXh0YXJlbmEgKTsKICAgICAgICAgICAgIHBJbmZvLT5pdGVtcysrOworICAgICAgICAgICAgTE9DQUxfRnJlZUFyZW5hKCBkcywgbmV4dGFyZW5hICk7CiAgICAgICAgIH0KICAgICAgICAgZHByaW50Zl9sb2NhbCggc3RkZGViLCAiTG9jYWxSZUFsbG9jOiByZXR1cm5pbmcgJTA0eFxuIiwgaGFuZGxlICk7CiAgICAgICAgIHJldHVybiBoYW5kbGU7CkBAIC0xMDk5LDE2ICsxMTUwLDMwIEBACiAgICAgICAgIHJldHVybiAwOyAgLyogRklYTUU6IHNob3VsZCB3ZSBmcmVlIGl0IGhlcmU/ICovCiAgICAgfQogCi0gICAgaWYgKCEobmV3aGFuZGxlID0gTE9DQUxfR2V0QmxvY2soIGRzLCBzaXplLCBmbGFncyApKSkgcmV0dXJuIDA7Ci0gICAgcHRyID0gUFRSX1NFR19PRkZfVE9fTElOKCBkcywgMCApOwotICAgIG1lbWNweSggcHRyICsgbmV3aGFuZGxlLCBwdHIgKyAoYXJlbmEgKyBBUkVOQV9IRUFERVJfU0laRSksIHNpemUgKTsKLSAgICBMT0NBTF9GcmVlQXJlbmEoIGRzLCBhcmVuYSApOworICAgIG5ld2hhbmRsZSA9IExPQ0FMX0dldEJsb2NrKCBkcywgc2l6ZSwgZmxhZ3MgKTsKKyAgICBwdHIgPSBQVFJfU0VHX09GRl9UT19MSU4oIGRzLCAwICk7ICAvKiBSZWxvYWQgcHRyICovCisgICAgaWYgKCFuZXdoYW5kbGUpCisgICAgeworICAgICAgICAvKiBDaGVjayBpZiBwcmV2aW91cyBibG9jayBpcyBmcmVlIGFuZCBsYXJnZSBlbm91Z2ggKi8KKyAgICAgICAgTE9DQUxBUkVOQSAqcFByZXYgPSBBUkVOQV9QVFIoIHB0ciwgcEFyZW5hLT5wcmV2ICYgMyApOworICAgICAgICBpZiAoKChwUHJldi0+cHJldiAmIDMpID09IExPQ0FMX0FSRU5BX0ZSRUUpICYmCisgICAgICAgICAgICAocFByZXYtPnNpemUgKyBwQXJlbmEtPm5leHQgPj0gbmV4dGFyZW5hKSkKKyAgICAgICAgeworICAgICAgICAgICAgbmV3aGFuZGxlID0gKHBBcmVuYS0+cHJldiAmIH4zKSArIEFSRU5BX0hFQURFUl9TSVpFOworICAgICAgICAgICAgTE9DQUxfR3Jvd0FyZW5hRG93bndhcmQoIGRzLCBhcmVuYSwgc2l6ZSArIEFSRU5BX0hFQURFUl9TSVpFICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSByZXR1cm4gMDsgIC8qIE5vdGhpbmcgdG8gZG8sIG5vIHNwYWNlIGxlZnQgZm9yIHRoZSBibG9jayAqLworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBtZW1jcHkoIHB0ciArIG5ld2hhbmRsZSwgcHRyICsgKGFyZW5hICsgQVJFTkFfSEVBREVSX1NJWkUpLCBzaXplICk7CisgICAgICAgIExPQ0FMX0ZyZWVBcmVuYSggZHMsIGFyZW5hICk7CisgICAgfQogICAgIGlmIChIQU5ETEVfTU9WRUFCTEUoIGhhbmRsZSApKQogICAgIHsKIAlkcHJpbnRmX2xvY2FsKCBzdGRkZWIsICJMb2NhbFJlQWxsb2M6IGZpeGluZyBoYW5kbGVcbiIpOwogICAgICAgICBwRW50cnkgPSAoTE9DQUxIQU5ETEVFTlRSWSAqKShwdHIgKyBoYW5kbGUpOwogICAgICAgICBwRW50cnktPmFkZHIgPSBuZXdoYW5kbGU7Ci0gICAgICAgIHBFbnRyeS0+ZmxhZ3MgfD0gfihMTUVNX0RJU0NBUkRFRCA+PiA4KTsgLyogY2xlYXIgZGlzY2FyZGVkIGZsYWcgKi8KICAgICAgICAgcEVudHJ5LT5sb2NrID0gMDsKIAluZXdoYW5kbGUgPSBoYW5kbGU7CiAgICAgfQpAQCAtMTMzMSw3ICsxMzk2LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIExvY2FsVW5sb2NrMTYgICAoS0VSTkVMLjkpCiAgKi8KLUJPT0wgTG9jYWxVbmxvY2sxNiggSExPQ0FMMTYgaGFuZGxlICkKK0JPT0wxNiBMb2NhbFVubG9jazE2KCBITE9DQUwxNiBoYW5kbGUgKQogewogICAgIHJldHVybiBMT0NBTF9VbmxvY2soIENVUlJFTlRfRFMsIGhhbmRsZSApOwogfQpAQCAtMTYwOCw3ICsxNjczLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIExvY2FsVW5sb2NrMzIgICAoS0VSTkVMMzIuMzgxKQogICovCi1CT09MIExvY2FsVW5sb2NrMzIoIEhMT0NBTDMyIGhhbmRsZSApCitCT09MMzIgTG9jYWxVbmxvY2szMiggSExPQ0FMMzIgaGFuZGxlICkKIHsKICAgICByZXR1cm4gR2xvYmFsVW5sb2NrMzIoIChIR0xPQkFMMzIpaGFuZGxlICk7CiB9CmRpZmYgLS1naXQgYS9taXNjL2NvbW1kbGcuYyBiL21pc2MvY29tbWRsZy5jCmluZGV4IDA3ODk4NDMuLjg0MTQzYzUgMTAwNjQ0Ci0tLSBhL21pc2MvY29tbWRsZy5jCisrKyBiL21pc2MvY29tbWRsZy5jCkBAIC0yMDcsNyArMjA3LDcgQEAKICAqLwogc3RhdGljIExPTkcgRklMRURMR19XTURyYXdJdGVtKEhXTkQgaFduZCwgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKLSAgICBMUERSQVdJVEVNU1RSVUNUIGxwZGlzID0gKExQRFJBV0lURU1TVFJVQ1QpUFRSX1NFR19UT19MSU4obFBhcmFtKTsKKyAgICBMUERSQVdJVEVNU1RSVUNUMTYgbHBkaXMgPSAoTFBEUkFXSVRFTVNUUlVDVDE2KVBUUl9TRUdfVE9fTElOKGxQYXJhbSk7CiAgICAgY2hhciBzdHJbNTEyXTsKICAgICBIQlJVU0ggaEJydXNoOwogICAgIEhCSVRNQVAgaEJpdG1hcCwgaFByZXZCaXRtYXA7CkBAIC0yMTgsMTMgKzIxOCwxMyBAQAogICAgIGlmIChscGRpcy0+Q3RsVHlwZSA9PSBPRFRfTElTVEJPWCAmJiBscGRpcy0+Q3RsSUQgPT0gbHN0MSkgewogCWhCcnVzaCA9IFNlbGVjdE9iamVjdChscGRpcy0+aERDLCBHZXRTdG9ja09iamVjdChMVEdSQVlfQlJVU0gpKTsKIAlTZWxlY3RPYmplY3QobHBkaXMtPmhEQywgaEJydXNoKTsKLQlGaWxsUmVjdChscGRpcy0+aERDLCAmbHBkaXMtPnJjSXRlbSwgaEJydXNoKTsKKwlGaWxsUmVjdDE2KGxwZGlzLT5oREMsICZscGRpcy0+cmNJdGVtLCBoQnJ1c2gpOwogCVNlbmRNZXNzYWdlKGxwZGlzLT5od25kSXRlbSwgTEJfR0VUVEVYVCwgbHBkaXMtPml0ZW1JRCwgCiAJCSAgICAoTFBBUkFNKU1BS0VfU0VHUFRSKHN0cikpOwotCVRleHRPdXQobHBkaXMtPmhEQywgbHBkaXMtPnJjSXRlbS5sZWZ0LCBscGRpcy0+cmNJdGVtLnRvcCwKLQkJc3RyLCBzdHJsZW4oc3RyKSk7CisJVGV4dE91dDE2KGxwZGlzLT5oREMsIGxwZGlzLT5yY0l0ZW0ubGVmdCwgbHBkaXMtPnJjSXRlbS50b3AsCisgICAgICAgICAgICAgICAgICBzdHIsIHN0cmxlbihzdHIpKTsKIAlpZiAobHBkaXMtPml0ZW1TdGF0ZSAhPSAwKSB7Ci0JICAgIEludmVydFJlY3QobHBkaXMtPmhEQywgJmxwZGlzLT5yY0l0ZW0pOworCSAgICBJbnZlcnRSZWN0MTYobHBkaXMtPmhEQywgJmxwZGlzLT5yY0l0ZW0pOwogCX0KIAlyZXR1cm4gVFJVRTsKICAgICB9CkBAIC0yMzIsMTQgKzIzMiwxNCBAQAogICAgIGlmIChscGRpcy0+Q3RsVHlwZSA9PSBPRFRfTElTVEJPWCAmJiBscGRpcy0+Q3RsSUQgPT0gbHN0MikgewogCWhCcnVzaCA9IFNlbGVjdE9iamVjdChscGRpcy0+aERDLCBHZXRTdG9ja09iamVjdChMVEdSQVlfQlJVU0gpKTsKIAlTZWxlY3RPYmplY3QobHBkaXMtPmhEQywgaEJydXNoKTsKLQlGaWxsUmVjdChscGRpcy0+aERDLCAmbHBkaXMtPnJjSXRlbSwgaEJydXNoKTsKKwlGaWxsUmVjdDE2KGxwZGlzLT5oREMsICZscGRpcy0+cmNJdGVtLCBoQnJ1c2gpOwogCVNlbmRNZXNzYWdlKGxwZGlzLT5od25kSXRlbSwgTEJfR0VUVEVYVCwgbHBkaXMtPml0ZW1JRCwgCiAJCSAgICAoTFBBUkFNKU1BS0VfU0VHUFRSKHN0cikpOwogCiAJaEJpdG1hcCA9IGhGb2xkZXI7CiAJR2V0T2JqZWN0KGhCaXRtYXAsIHNpemVvZihCSVRNQVApLCAoTFBTVFIpJmJtKTsKLQlUZXh0T3V0KGxwZGlzLT5oREMsIGxwZGlzLT5yY0l0ZW0ubGVmdCArIGJtLmJtV2lkdGgsIAotCQlscGRpcy0+cmNJdGVtLnRvcCwgc3RyLCBzdHJsZW4oc3RyKSk7CisJVGV4dE91dDE2KGxwZGlzLT5oREMsIGxwZGlzLT5yY0l0ZW0ubGVmdCArIGJtLmJtV2lkdGgsIAorICAgICAgICAgICAgICAgICAgbHBkaXMtPnJjSXRlbS50b3AsIHN0ciwgc3RybGVuKHN0cikpOwogCWhNZW1EQyA9IENyZWF0ZUNvbXBhdGlibGVEQyhscGRpcy0+aERDKTsKIAloUHJldkJpdG1hcCA9IFNlbGVjdE9iamVjdChoTWVtREMsIGhCaXRtYXApOwogCUJpdEJsdChscGRpcy0+aERDLCBscGRpcy0+cmNJdGVtLmxlZnQsIGxwZGlzLT5yY0l0ZW0udG9wLApAQCAtMjQ3LDE0ICsyNDcsMTQgQEAKIAlTZWxlY3RPYmplY3QoaE1lbURDLCBoUHJldkJpdG1hcCk7CiAJRGVsZXRlREMoaE1lbURDKTsKIAlpZiAobHBkaXMtPml0ZW1TdGF0ZSAhPSAwKSB7Ci0JICAgIEludmVydFJlY3QobHBkaXMtPmhEQywgJmxwZGlzLT5yY0l0ZW0pOworCSAgICBJbnZlcnRSZWN0MTYobHBkaXMtPmhEQywgJmxwZGlzLT5yY0l0ZW0pOwogCX0KIAlyZXR1cm4gVFJVRTsKICAgICB9CiAgICAgaWYgKGxwZGlzLT5DdGxUeXBlID09IE9EVF9DT01CT0JPWCAmJiBscGRpcy0+Q3RsSUQgPT0gY21iMikgewogCWhCcnVzaCA9IFNlbGVjdE9iamVjdChscGRpcy0+aERDLCBHZXRTdG9ja09iamVjdChMVEdSQVlfQlJVU0gpKTsKIAlTZWxlY3RPYmplY3QobHBkaXMtPmhEQywgaEJydXNoKTsKLQlGaWxsUmVjdChscGRpcy0+aERDLCAmbHBkaXMtPnJjSXRlbSwgaEJydXNoKTsKKwlGaWxsUmVjdDE2KGxwZGlzLT5oREMsICZscGRpcy0+cmNJdGVtLCBoQnJ1c2gpOwogCVNlbmRNZXNzYWdlKGxwZGlzLT5od25kSXRlbSwgQ0JfR0VUTEJURVhULCBscGRpcy0+aXRlbUlELCAKIAkJICAgIChMUEFSQU0pTUFLRV9TRUdQVFIoc3RyKSk7CiAgICAgICAgIHN3aXRjaChEUklWRV9HZXRUeXBlKCBzdHJbMl0gLSAnYScgKSkKQEAgLTI2Niw4ICsyNjYsOCBAQAogICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgaEJpdG1hcCA9IGhIRGlzazsgYnJlYWs7CiAgICAgICAgIH0KIAlHZXRPYmplY3QoaEJpdG1hcCwgc2l6ZW9mKEJJVE1BUCksIChMUFNUUikmYm0pOwotCVRleHRPdXQobHBkaXMtPmhEQywgbHBkaXMtPnJjSXRlbS5sZWZ0ICsgYm0uYm1XaWR0aCwgCi0JCWxwZGlzLT5yY0l0ZW0udG9wLCBzdHIsIHN0cmxlbihzdHIpKTsKKwlUZXh0T3V0MTYobHBkaXMtPmhEQywgbHBkaXMtPnJjSXRlbS5sZWZ0ICsgYm0uYm1XaWR0aCwgCisgICAgICAgICAgICAgICAgICBscGRpcy0+cmNJdGVtLnRvcCwgc3RyLCBzdHJsZW4oc3RyKSk7CiAJaE1lbURDID0gQ3JlYXRlQ29tcGF0aWJsZURDKGxwZGlzLT5oREMpOwogCWhQcmV2Qml0bWFwID0gU2VsZWN0T2JqZWN0KGhNZW1EQywgaEJpdG1hcCk7CiAJQml0Qmx0KGxwZGlzLT5oREMsIGxwZGlzLT5yY0l0ZW0ubGVmdCwgbHBkaXMtPnJjSXRlbS50b3AsCkBAIC0yNzUsNyArMjc1LDcgQEAKIAlTZWxlY3RPYmplY3QoaE1lbURDLCBoUHJldkJpdG1hcCk7CiAJRGVsZXRlREMoaE1lbURDKTsKIAlpZiAobHBkaXMtPml0ZW1TdGF0ZSAhPSAwKSB7Ci0JICAgIEludmVydFJlY3QobHBkaXMtPmhEQywgJmxwZGlzLT5yY0l0ZW0pOworCSAgICBJbnZlcnRSZWN0MTYobHBkaXMtPmhEQywgJmxwZGlzLT5yY0l0ZW0pOwogCX0KIAlyZXR1cm4gVFJVRTsKICAgICB9CkBAIC0zODksNyArMzg5LDcgQEAKICAgaWYgKGxwb2ZuLT5GbGFncyAmIE9GTl9ISURFUkVBRE9OTFkpCiAgICAgU2hvd1dpbmRvdyhHZXREbGdJdGVtKGhXbmQsIGNoeDEpLCBTV19ISURFKTsgCiAgIGlmIChGSUxFRExHX0hvb2tDYWxsQ2hrKGxwb2ZuKSkKLSAgICAgcmV0dXJuIChCT09MKUNhbGxXaW5kb3dQcm9jKGxwb2ZuLT5scGZuSG9vaywgCisgICAgIHJldHVybiAoQk9PTClDYWxsV2luZG93UHJvYzE2KGxwb2ZuLT5scGZuSG9vaywgCiAgICAgICAgICAgICAgICBoV25kLCAgV01fSU5JVERJQUxPRywgd1BhcmFtLChMUEFSQU0pTUFLRV9TRUdQVFIobHBvZm4pKTsKICAgZWxzZSAgCiAgICAgIHJldHVybiBUUlVFOwpAQCAtNDMwLDggKzQzMCw4IEBACiAgICAgICBTZW5kRGxnSXRlbU1lc3NhZ2UoaFduZCwgZWR0MSwgV01fU0VUVEVYVCwgMCwgKExQQVJBTSlNQUtFX1NFR1BUUih0bXBzdHIpKTsKIAogICAgICAgaWYgKEZJTEVETEdfSG9va0NhbGxDaGsobHBvZm4pKQotICAgICAgIENhbGxXaW5kb3dQcm9jIChscG9mbi0+bHBmbkhvb2ssIGhXbmQsCi0gICAgICAgICAgICAgICAgICBSZWdpc3RlcldpbmRvd01lc3NhZ2UoTUFLRV9TRUdQVFIoTEJTRUxDSFNUUklORykpLCAKKyAgICAgICBDYWxsV2luZG93UHJvYzE2KGxwb2ZuLT5scGZuSG9vaywgaFduZCwKKyAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyV2luZG93TWVzc2FnZTMyQSggTEJTRUxDSFNUUklORyApLAogICAgICAgICAgICAgICAgICAgY29udHJvbCwgTUFLRUxPTkcobFJldCxDRF9MQlNFTENIQU5HRSkpOyAgICAgICAKICAgICAgIC8qIEZJWE1FOiBmb3IgT0ZOX0FMTE9XTVVMVElTRUxFQ1Qgd2UgbmVlZCBDRF9MQlNFTFNVQiwgQ0RfU0VMQURELCBDRF9MQlNFTE5PSVRFTVMgKi8gICAgICAgICAgICAgICAgICAKICAgICAgIHJldHVybiBUUlVFOwpAQCAtNTY3LDggKzU2Nyw4IEBACiAJfQogICAgICAgaWYgKEZJTEVETEdfSG9va0NhbGxDaGsobHBvZm4pKQogICAgICAgewotICAgICAgIGxSZXQ9IChCT09MKUNhbGxXaW5kb3dQcm9jIChscG9mbi0+bHBmbkhvb2ssCi0gICAgICAgICAgICAgICBoV25kLCBSZWdpc3RlcldpbmRvd01lc3NhZ2UoTUFLRV9TRUdQVFIoRklMRU9LU1RSSU5HKSksIAorICAgICAgIGxSZXQ9IChCT09MKUNhbGxXaW5kb3dQcm9jMTYobHBvZm4tPmxwZm5Ib29rLAorICAgICAgICAgICAgICAgaFduZCwgUmVnaXN0ZXJXaW5kb3dNZXNzYWdlMzJBKCBGSUxFT0tTVFJJTkcgKSwKICAgICAgICAgICAgICAgIDAsIChMUEFSQU0pTUFLRV9TRUdQVFIobHBvZm4pKTsgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICBpZiAobFJldCkgICAgICAgCiAgICAgICAgewpAQCAtNTk5LDcgKzU5OSw3IEBACiAgaWYgKHdNc2chPVdNX0lOSVRESUFMT0cpCiAgIGlmIChGSUxFRExHX0hvb2tDYWxsQ2hrKGxwb2ZuKSkKICAgewotICAgTFJFU1VMVCAgbFJldD0oQk9PTClDYWxsV2luZG93UHJvYyhscG9mbi0+bHBmbkhvb2ssIGhXbmQsIHdNc2csIHdQYXJhbSwgbFBhcmFtKTsKKyAgIExSRVNVTFQgIGxSZXQ9KEJPT0wpQ2FsbFdpbmRvd1Byb2MxNihscG9mbi0+bHBmbkhvb2ssIGhXbmQsIHdNc2csIHdQYXJhbSwgbFBhcmFtKTsKICAgIGlmIChsUmV0KSAgIAogICAgIHJldHVybiBsUmV0OyAgICAgICAgIC8qIGVsc2UgY29udGludWUgbWVzc2FnZSBwcm9jZXNzaW5nICovCiAgIH0gICAgICAgICAgICAgCkBAIC02NDIsNyArNjQyLDcgQEAKICBpZiAod01zZyE9V01fSU5JVERJQUxPRykKICAgaWYgKEZJTEVETEdfSG9va0NhbGxDaGsobHBvZm4pKQogICB7Ci0gICBMUkVTVUxUICBsUmV0PShCT09MKUNhbGxXaW5kb3dQcm9jKGxwb2ZuLT5scGZuSG9vaywgaFduZCwgd01zZywgd1BhcmFtLCBsUGFyYW0pOworICAgTFJFU1VMVCAgbFJldD0oQk9PTClDYWxsV2luZG93UHJvYzE2KGxwb2ZuLT5scGZuSG9vaywgaFduZCwgd01zZywgd1BhcmFtLCBsUGFyYW0pOwogICAgaWYgKGxSZXQpICAgCiAgICAgcmV0dXJuIGxSZXQ7ICAgICAgICAgLyogZWxzZSBjb250aW51ZSBtZXNzYWdlIHByb2Nlc3NpbmcgKi8KICAgfSAgICAgICAgICAgICAKQEAgLTgwNiw4ICs4MDYsOCBAQAogc3RhdGljIExSRVNVTFQgRklORERMR19XTUNvbW1hbmQoSFdORCBoV25kLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewogICAgIExQRklORFJFUExBQ0UgbHBmcjsKLSAgICBpbnQgdUZpbmRSZXBsYWNlTWVzc2FnZSA9IFJlZ2lzdGVyV2luZG93TWVzc2FnZShNQUtFX1NFR1BUUihGSU5ETVNHU1RSSU5HKSk7Ci0gICAgaW50IHVIZWxwTWVzc2FnZSA9IFJlZ2lzdGVyV2luZG93TWVzc2FnZShNQUtFX1NFR1BUUihIRUxQTVNHU1RSSU5HKSk7CisgICAgaW50IHVGaW5kUmVwbGFjZU1lc3NhZ2UgPSBSZWdpc3RlcldpbmRvd01lc3NhZ2UzMkEoIEZJTkRNU0dTVFJJTkcgKTsKKyAgICBpbnQgdUhlbHBNZXNzYWdlID0gUmVnaXN0ZXJXaW5kb3dNZXNzYWdlMzJBKCBIRUxQTVNHU1RSSU5HICk7CiAKICAgICBscGZyID0gKExQRklORFJFUExBQ0UpR2V0V2luZG93TG9uZyhoV25kLCBEV0xfVVNFUik7CiAgICAgc3dpdGNoICh3UGFyYW0pIHsKQEAgLTg5OCw4ICs4OTgsOCBAQAogc3RhdGljIExSRVNVTFQgUkVQTEFDRURMR19XTUNvbW1hbmQoSFdORCBoV25kLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewogICAgIExQRklORFJFUExBQ0UgbHBmcjsKLSAgICBpbnQgdUZpbmRSZXBsYWNlTWVzc2FnZSA9IFJlZ2lzdGVyV2luZG93TWVzc2FnZShNQUtFX1NFR1BUUihGSU5ETVNHU1RSSU5HKSk7Ci0gICAgaW50IHVIZWxwTWVzc2FnZSA9IFJlZ2lzdGVyV2luZG93TWVzc2FnZShNQUtFX1NFR1BUUihIRUxQTVNHU1RSSU5HKSk7CisgICAgaW50IHVGaW5kUmVwbGFjZU1lc3NhZ2UgPSBSZWdpc3RlcldpbmRvd01lc3NhZ2UzMkEoIEZJTkRNU0dTVFJJTkcgKTsKKyAgICBpbnQgdUhlbHBNZXNzYWdlID0gUmVnaXN0ZXJXaW5kb3dNZXNzYWdlMzJBKCBIRUxQTVNHU1RSSU5HICk7CiAKICAgICBscGZyID0gKExQRklORFJFUExBQ0UpR2V0V2luZG93TG9uZyhoV25kLCBEV0xfVVNFUik7CiAgICAgc3dpdGNoICh3UGFyYW0pIHsKQEAgLTExMjQsMTAgKzExMjQsMTAgQEAKICBpbnQgbmV4dHVzZXJkZWY7ICAgICAvKiBuZXh0IGZyZWUgcGxhY2UgaW4gdXNlciBkZWZpbmVkIGNvbG9yIGFycmF5ICovCiAgSERDIGhkY01lbTsgICAgICAgICAgLyogY29sb3IgZ3JhcGggdXNlZCBmb3IgQml0Qmx0KCkgKi8KICBIQklUTUFQIGhibU1lbTsgICAgICAvKiBjb2xvciBncmFwaCBiaXRtYXAgKi8gICAgCi0gUkVDVCBmdWxsc2l6ZTsgICAgICAgLyogb3JpZ2luYWwgZGlhbG9nIHdpbmRvdyBzaXplICovCisgUkVDVDE2IGZ1bGxzaXplOyAgICAgLyogb3JpZ2luYWwgZGlhbG9nIHdpbmRvdyBzaXplICovCiAgVUlOVCBtc2V0cmdiOyAgICAgICAgLyogIyBvZiBTRVRSR0JTVFJJTkcgbWVzc2FnZSAodG9kYXkgbm90IHVzZWQpICAqLwotIFJFQ1Qgb2xkM2FuZ2xlOyAgICAgIC8qIGxhc3QgcG9zaXRpb24gb2YgbC1tYXJrZXIgKi8KLSBSRUNUIG9sZGNyb3NzOyAgICAgICAvKiBsYXN0IHBvc2l0aW9uIG9mIGNvbG9yL3NhdHVhdGlvbiBtYXJrZXIgKi8KKyBSRUNUMTYgb2xkM2FuZ2xlOyAgICAvKiBsYXN0IHBvc2l0aW9uIG9mIGwtbWFya2VyICovCisgUkVDVDE2IG9sZGNyb3NzOyAgICAgLyogbGFzdCBwb3NpdGlvbiBvZiBjb2xvci9zYXR1YXRpb24gbWFya2VyICovCiAgQk9PTCB1cGRhdGluZzsgICAgICAgLyogdG8gcHJldmVudCByZWN1cnNpdmUgV01fQ09NTUFORC9FTl9VUERBVEUgcHJvY2VzaW5nICovCiAgaW50IGg7CiAgaW50IHM7CkBAIC0xMjU1LDIxICsxMjU1LDE4IEBACiAJICAgIExQQVJBTSBsUGFyYW0sQ09MT1JSRUYgKmNyKQogewogIEhXTkQgaHduZDsKLSBQT0lOVCBwb2ludDsKLSBSRUNUIHJlY3Q7CisgUE9JTlQxNiBwb2ludCA9IE1BS0VQT0lOVDE2KGxQYXJhbSk7CisgUkVDVDE2IHJlY3Q7CiAgaW50IGR4LGR5LHgseTsKIAotIHBvaW50Lng9TE9XT1JEKGxQYXJhbSk7Ci0gcG9pbnQueT1ISVdPUkQobFBhcmFtKTsKLSBDbGllbnRUb1NjcmVlbihoRGxnLCZwb2ludCk7Ci0KKyBDbGllbnRUb1NjcmVlbjE2KGhEbGcsJnBvaW50KTsKICBod25kPUdldERsZ0l0ZW0oaERsZyxkbGdpdGVtKTsKLSBHZXRXaW5kb3dSZWN0KGh3bmQsJnJlY3QpOwotIGlmIChQdEluUmVjdCgmcmVjdCxwb2ludCkpCisgR2V0V2luZG93UmVjdDE2KGh3bmQsJnJlY3QpOworIGlmIChQdEluUmVjdDE2KCZyZWN0LHBvaW50KSkKICB7CiAgIGR4PShyZWN0LnJpZ2h0LXJlY3QubGVmdCkvY29sczsKICAgZHk9KHJlY3QuYm90dG9tLXJlY3QudG9wKS9yb3dzOwotICBTY3JlZW5Ub0NsaWVudChod25kLCZwb2ludCk7CisgIFNjcmVlblRvQ2xpZW50MTYoaHduZCwmcG9pbnQpOwogCiAgIGlmIChwb2ludC54ICUgZHggPCAoZHgtRElTVEFOQ0UpICYmIHBvaW50LnkgJSBkeSA8IChkeS1ESVNUQU5DRSkpCiAgIHsKQEAgLTEyOTAsMjEgKzEyODcsMTggQEAKIAkgICAgTFBBUkFNIGxQYXJhbSxDT0xPUlJFRiAqY3IsQ09MT1JSRUYqY3JhcnIpCiB7CiAgSFdORCBod25kOwotIFBPSU5UIHBvaW50OwotIFJFQ1QgcmVjdDsKKyBQT0lOVDE2IHBvaW50ID0gTUFLRVBPSU5UMTYobFBhcmFtKTsKKyBSRUNUMTYgcmVjdDsKICBpbnQgZHgsZHkseCx5OwogCi0gcG9pbnQueD1MT1dPUkQobFBhcmFtKTsKLSBwb2ludC55PUhJV09SRChsUGFyYW0pOwotIENsaWVudFRvU2NyZWVuKGhEbGcsJnBvaW50KTsKLQorIENsaWVudFRvU2NyZWVuMTYoaERsZywmcG9pbnQpOwogIGh3bmQ9R2V0RGxnSXRlbShoRGxnLGRsZ2l0ZW0pOwotIEdldFdpbmRvd1JlY3QoaHduZCwmcmVjdCk7Ci0gaWYgKFB0SW5SZWN0KCZyZWN0LHBvaW50KSkKKyBHZXRXaW5kb3dSZWN0MTYoaHduZCwmcmVjdCk7CisgaWYgKFB0SW5SZWN0MTYoJnJlY3QscG9pbnQpKQogIHsKICAgZHg9KHJlY3QucmlnaHQtcmVjdC5sZWZ0KS9jb2xzOwogICBkeT0ocmVjdC5ib3R0b20tcmVjdC50b3ApL3Jvd3M7Ci0gIFNjcmVlblRvQ2xpZW50KGh3bmQsJnBvaW50KTsKKyAgU2NyZWVuVG9DbGllbnQxNihod25kLCZwb2ludCk7CiAKICAgaWYgKHBvaW50LnggJSBkeCA8IChkeC1ESVNUQU5DRSkgJiYgcG9pbnQueSAlIGR5IDwgKGR5LURJU1RBTkNFKSkKICAgewpAQCAtMTMzNCwxOSArMTMyOCwxNyBAQAogc3RhdGljIGludCBDQ19Nb3VzZUNoZWNrQ29sb3JHcmFwaChIV05EIGhEbGcsaW50IGRsZ2l0ZW0saW50ICpob3JpLGludCAqdmVydCxMUEFSQU0gbFBhcmFtKQogewogIEhXTkQgaHduZDsKLSBQT0lOVCBwb2ludDsKLSBSRUNUIHJlY3Q7CisgUE9JTlQxNiBwb2ludCA9IE1BS0VQT0lOVDE2KGxQYXJhbSk7CisgUkVDVDE2IHJlY3Q7CiAgbG9uZyB4LHk7CiAKLSBwb2ludC54PUxPV09SRChsUGFyYW0pOwotIHBvaW50Lnk9SElXT1JEKGxQYXJhbSk7Ci0gQ2xpZW50VG9TY3JlZW4oaERsZywmcG9pbnQpOworIENsaWVudFRvU2NyZWVuMTYoaERsZywmcG9pbnQpOwogIGh3bmQ9R2V0RGxnSXRlbShoRGxnLGRsZ2l0ZW0pOwotIEdldFdpbmRvd1JlY3QoaHduZCwmcmVjdCk7Ci0gaWYgKFB0SW5SZWN0KCZyZWN0LHBvaW50KSkKKyBHZXRXaW5kb3dSZWN0MTYoaHduZCwmcmVjdCk7CisgaWYgKFB0SW5SZWN0MTYoJnJlY3QscG9pbnQpKQogIHsKLSAgR2V0Q2xpZW50UmVjdChod25kLCZyZWN0KTsKLSAgU2NyZWVuVG9DbGllbnQoaHduZCwmcG9pbnQpOworICBHZXRDbGllbnRSZWN0MTYoaHduZCwmcmVjdCk7CisgIFNjcmVlblRvQ2xpZW50MTYoaHduZCwmcG9pbnQpOwogCiAgIHg9KGxvbmcpcG9pbnQueCpNQVhIT1JJOwogICB4Lz1yZWN0LnJpZ2h0OwpAQCAtMTM2OCwxNCArMTM2MCwxMyBAQAogc3RhdGljIGludCBDQ19Nb3VzZUNoZWNrUmVzdWx0V2luZG93KEhXTkQgaERsZyxMUEFSQU0gbFBhcmFtKQogewogIEhXTkQgaHduZDsKLSBQT0lOVCBwb2ludDsKLSBSRUNUIHJlY3Q7Ci0gcG9pbnQueD1MT1dPUkQobFBhcmFtKTsKLSBwb2ludC55PUhJV09SRChsUGFyYW0pOwotIENsaWVudFRvU2NyZWVuKGhEbGcsJnBvaW50KTsKKyBQT0lOVDE2IHBvaW50ID0gTUFLRVBPSU5UMTYobFBhcmFtKTsKKyBSRUNUMTYgcmVjdDsKKworIENsaWVudFRvU2NyZWVuMTYoaERsZywmcG9pbnQpOwogIGh3bmQ9R2V0RGxnSXRlbShoRGxnLDB4MmM1KTsKLSBHZXRXaW5kb3dSZWN0KGh3bmQsJnJlY3QpOwotIGlmIChQdEluUmVjdCgmcmVjdCxwb2ludCkpCisgR2V0V2luZG93UmVjdDE2KGh3bmQsJnJlY3QpOworIGlmIChQdEluUmVjdDE2KCZyZWN0LHBvaW50KSkKICB7CiAgIFBvc3RNZXNzYWdlKGhEbGcsV01fQ09NTUFORCwweDJjOSwwKTsKICAgcmV0dXJuIDE7CkBAIC0xNDI5LDE0ICsxNDIwLDE0IEBACiAgKi8KIHN0YXRpYyB2b2lkIENDX1BhaW50U2VsZWN0ZWRDb2xvcihIV05EIGhEbGcsQ09MT1JSRUYgY3IpCiB7Ci0gUkVDVCByZWN0OworIFJFQ1QxNiByZWN0OwogIEhEQyAgaGRjOwogIEhCUlVTSCBoQnJ1c2g7CiAgSFdORCBod25kPUdldERsZ0l0ZW0oaERsZywweDJjNSk7CiAgaWYgKElzV2luZG93VmlzaWJsZShHZXREbGdJdGVtKGhEbGcsMHgyYzYpKSkgICAvKiBpZiBmdWxsIHNpemUgKi8KICB7CiAgIGhkYz1HZXREQyhod25kKTsKLSAgR2V0Q2xpZW50UmVjdCAoaHduZCwgJnJlY3QpIDsKKyAgR2V0Q2xpZW50UmVjdDE2IChod25kLCAmcmVjdCkgOwogICBoQnJ1c2ggPSBDcmVhdGVTb2xpZEJydXNoKGNyKTsKICAgaWYgKGhCcnVzaCkKICAgewpAQCAtMTQ2MywyNSArMTQ1NCwyNSBAQAogIEhEQyBoREM7CiAgbG9uZyB0ZW1wOwogIGludCB3PUdldERpYWxvZ0Jhc2VVbml0cygpOwotIFBPSU5UIHBvaW50c1szXTsKKyBQT0lOVDE2IHBvaW50c1szXTsKICBpbnQgaGVpZ2h0OwogIGludCBvYmVuOwotIFJFQ1QgcmVjdDsKKyBSRUNUMTYgcmVjdDsKICBIV05EIGh3bmQ9R2V0RGxnSXRlbShoRGxnLDB4MmJlKTsKICBzdHJ1Y3QgQ0NQUklWQVRFICpscHA9KHN0cnVjdCBDQ1BSSVZBVEUgKilHZXRXaW5kb3dMb25nKGhEbGcsIERXTF9VU0VSKTsgCiAKICBpZiAoSXNXaW5kb3dWaXNpYmxlKEdldERsZ0l0ZW0oaERsZywweDJjNikpKSAgIC8qIGlmIGZ1bGwgc2l6ZSAqLwogIHsKLSAgIEdldENsaWVudFJlY3QoaHduZCwmcmVjdCk7CisgICBHZXRDbGllbnRSZWN0MTYoaHduZCwmcmVjdCk7CiAgICBoZWlnaHQ9cmVjdC5ib3R0b207CiAgICBoREM9R2V0REMoaERsZyk7CiAKICAgIHBvaW50c1swXS55PXJlY3QudG9wOwotICAgcG9pbnRzWzBdLng9cmVjdC5yaWdodDsgICAgICAgICAvKiAgfCAgL3wgICovCi0gICBDbGllbnRUb1NjcmVlbihod25kLHBvaW50cyk7ICAgIC8qICB8IC8gfCAgKi8KLSAgIFNjcmVlblRvQ2xpZW50KGhEbGcscG9pbnRzKTsgICAgLyogIHw8ICB8ICAqLwotICAgb2Jlbj1wb2ludHNbMF0ueTsgICAgICAgICAgICAgICAvKiAgfCBcIHwgICovCi0JCQkJICAgLyogIHwgIFx8ICAqLworICAgcG9pbnRzWzBdLng9cmVjdC5yaWdodDsgICAgICAgICAgIC8qICB8ICAvfCAgKi8KKyAgIENsaWVudFRvU2NyZWVuMTYoaHduZCxwb2ludHMpOyAgICAvKiAgfCAvIHwgICovCisgICBTY3JlZW5Ub0NsaWVudDE2KGhEbGcscG9pbnRzKTsgICAgLyogIHw8ICB8ICAqLworICAgb2Jlbj1wb2ludHNbMF0ueTsgICAgICAgICAgICAgICAgIC8qICB8IFwgfCAgKi8KKwkJCQkgICAgIC8qICB8ICBcfCAgKi8KICAgIHRlbXA9KGxvbmcpaGVpZ2h0Kihsb25nKXk7CiAgICBwb2ludHNbMF0ueT1vYmVuK2hlaWdodCAtdGVtcC8obG9uZylNQVhWRVJUOwogICAgcG9pbnRzWzFdLnk9cG9pbnRzWzBdLnkrdzsKQEAgLTE0ODksMTIgKzE0ODAsMTIgQEAKICAgIHBvaW50c1syXS54PXBvaW50c1sxXS54PXBvaW50c1swXS54ICsgdzsKIAogICAgaWYgKGxwcC0+b2xkM2FuZ2xlLmxlZnQpCi0gICAgRmlsbFJlY3QoaERDLCZscHAtPm9sZDNhbmdsZSxHZXRTdG9ja09iamVjdChXSElURV9CUlVTSCkpOworICAgIEZpbGxSZWN0MTYoaERDLCZscHAtPm9sZDNhbmdsZSxHZXRTdG9ja09iamVjdChXSElURV9CUlVTSCkpOwogICAgbHBwLT5vbGQzYW5nbGUubGVmdCAgPXBvaW50c1swXS54OwogICAgbHBwLT5vbGQzYW5nbGUucmlnaHQgPXBvaW50c1sxXS54KzE7CiAgICBscHAtPm9sZDNhbmdsZS50b3AgICA9cG9pbnRzWzJdLnktMTsKICAgIGxwcC0+b2xkM2FuZ2xlLmJvdHRvbT1wb2ludHNbMV0ueSsxOwotICAgUG9seWdvbihoREMscG9pbnRzLDMpOworICAgUG9seWdvbjE2KGhEQyxwb2ludHMsMyk7CiAgICBSZWxlYXNlREMoaERsZyxoREMpOwogIH0KIH0KQEAgLTE1MDksMTUgKzE1MDAsMTUgQEAKICBpbnQgdz1HZXREaWFsb2dCYXNlVW5pdHMoKTsKICBIV05EIGh3bmQ9R2V0RGxnSXRlbShoRGxnLDB4MmM2KTsKICBzdHJ1Y3QgQ0NQUklWQVRFICogbHBwPShzdHJ1Y3QgQ0NQUklWQVRFICopR2V0V2luZG93TG9uZyhoRGxnLCBEV0xfVVNFUik7IAotIFJFQ1QgcmVjdDsKLSBQT0lOVCBwb2ludDsKLSBIUEVOIGhQZW47CisgUkVDVDE2IHJlY3Q7CisgUE9JTlQxNiBwb2ludDsKKyBIUEVOMTYgaFBlbjsKIAogIGlmIChJc1dpbmRvd1Zpc2libGUoR2V0RGxnSXRlbShoRGxnLDB4MmM2KSkpICAgLyogaWYgZnVsbCBzaXplICovCiAgewotICAgR2V0Q2xpZW50UmVjdChod25kLCZyZWN0KTsKKyAgIEdldENsaWVudFJlY3QxNihod25kLCZyZWN0KTsKICAgIGhEQz1HZXREQyhod25kKTsKLSAgIFNlbGVjdENsaXBSZ24oaERDLENyZWF0ZVJlY3RSZ25JbmRpcmVjdCgmcmVjdCkpOyAgIAorICAgU2VsZWN0Q2xpcFJnbihoREMsQ3JlYXRlUmVjdFJnbkluZGlyZWN0MTYoJnJlY3QpKTsgICAKICAgIGhQZW49Q3JlYXRlUGVuKFBTX1NPTElELDIsMCk7CiAgICBoUGVuPVNlbGVjdE9iamVjdChoREMsaFBlbik7CiAgICBwb2ludC54PSgobG9uZylyZWN0LnJpZ2h0Kihsb25nKXgpLyhsb25nKU1BWEhPUkk7CkBAIC0xNTU2LDEwICsxNTQ3LDEwIEBACiAgc3RydWN0IENDUFJJVkFURSAqIGxwcD0oc3RydWN0IENDUFJJVkFURSAqKUdldFdpbmRvd0xvbmcoaERsZywgRFdMX1VTRVIpOyAgCiAgSEJSVVNIIGhicnVzaDsKICBIREMgaGRjIDsKLSBSRUNUIHJlY3QsY2xpZW50OworIFJFQ1QxNiByZWN0LGNsaWVudDsKICBIQ1VSU09SIGhjdXJzb3I9U2V0Q3Vyc29yKExvYWRDdXJzb3IoMCxJRENfV0FJVCkpOwogCi0gR2V0Q2xpZW50UmVjdChod25kLCZjbGllbnQpOworIEdldENsaWVudFJlY3QxNihod25kLCZjbGllbnQpOwogIGhkYz1HZXREQyhod25kKTsKICBscHAtPmhkY01lbSA9IENyZWF0ZUNvbXBhdGlibGVEQyhoZGMpOwogIGxwcC0+aGJtTWVtID0gQ3JlYXRlQ29tcGF0aWJsZUJpdG1hcChoZGMsY2xpZW50LnJpZ2h0LGNsaWVudC5ib3R0b20pOwpAQCAtMTU4MCw3ICsxNTcxLDcgQEAKICAgIGc9Q0NfSFNMdG9SR0IoJ0cnLGh1ZSxzYXQsMTIwKTsKICAgIGI9Q0NfSFNMdG9SR0IoJ0InLGh1ZSxzYXQsMTIwKTsKICAgIGhicnVzaD1DcmVhdGVTb2xpZEJydXNoKFJHQihyLGcsYikpOwotICAgRmlsbFJlY3QobHBwLT5oZGNNZW0sJnJlY3QsaGJydXNoKTsKKyAgIEZpbGxSZWN0MTYobHBwLT5oZGNNZW0sJnJlY3QsaGJydXNoKTsKICAgIERlbGV0ZU9iamVjdChoYnJ1c2gpOwogICAgcmVjdC5ib3R0b209cmVjdC50b3A7CiAgIH0KQEAgLTE1OTgsMTQgKzE1ODksMTQgQEAKICBIV05EIGh3bmQ9R2V0RGxnSXRlbShoRGxnLDB4MmM2KTsKICBzdHJ1Y3QgQ0NQUklWQVRFICogbHBwPShzdHJ1Y3QgQ0NQUklWQVRFICopR2V0V2luZG93TG9uZyhoRGxnLCBEV0xfVVNFUik7IAogIEhEQyAgaERDOwotIFJFQ1QgcmVjdDsKKyBSRUNUMTYgcmVjdDsKICBpZiAoSXNXaW5kb3dWaXNpYmxlKGh3bmQpKSAgIC8qIGlmIGZ1bGwgc2l6ZSAqLwogIHsKICAgaWYgKCFscHAtPmhkY01lbSkKICAgIENDX1ByZXBhcmVDb2xvckdyYXBoKGhEbGcpOyAgIC8qIHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5ICovCiAKICAgaERDPUdldERDKGh3bmQpOwotICBHZXRDbGllbnRSZWN0KGh3bmQsJnJlY3QpOworICBHZXRDbGllbnRSZWN0MTYoaHduZCwmcmVjdCk7CiAgIGlmIChscHAtPmhkY01lbSkKICAgICBCaXRCbHQoaERDLDAsMCxyZWN0LnJpZ2h0LHJlY3QuYm90dG9tLGxwcC0+aGRjTWVtLDAsMCxTUkNDT1BZKTsKICAgZWxzZQpAQCAtMTYxOSw3ICsxNjEwLDcgQEAKIHN0YXRpYyB2b2lkIENDX1BhaW50THVtQmFyKEhXTkQgaERsZyxpbnQgaHVlLGludCBzYXQpCiB7CiAgSFdORCBod25kPUdldERsZ0l0ZW0oaERsZywweDJiZSk7Ci0gUkVDVCByZWN0LGNsaWVudDsKKyBSRUNUMTYgcmVjdCxjbGllbnQ7CiAgaW50IGx1bSxsZGlmLHlkaWYscixnLGI7CiAgSEJSVVNIIGhicnVzaDsKICBIREMgaERDOwpAQCAtMTYyNyw3ICsxNjE4LDcgQEAKICBpZiAoSXNXaW5kb3dWaXNpYmxlKGh3bmQpKQogIHsKICAgaERDPUdldERDKGh3bmQpOwotICBHZXRDbGllbnRSZWN0KGh3bmQsJmNsaWVudCk7CisgIEdldENsaWVudFJlY3QxNihod25kLCZjbGllbnQpOwogICByZWN0PWNsaWVudDsKIAogICBsZGlmPTI0MC9ZU1RFUFM7CkBAIC0xNjM5LDEyICsxNjMwLDEyIEBACiAgICBnPUNDX0hTTHRvUkdCKCdHJyxodWUsc2F0LGx1bSk7CiAgICBiPUNDX0hTTHRvUkdCKCdCJyxodWUsc2F0LGx1bSk7CiAgICBoYnJ1c2g9Q3JlYXRlU29saWRCcnVzaChSR0IocixnLGIpKTsKLSAgIEZpbGxSZWN0KGhEQywmcmVjdCxoYnJ1c2gpOworICAgRmlsbFJlY3QxNihoREMsJnJlY3QsaGJydXNoKTsKICAgIERlbGV0ZU9iamVjdChoYnJ1c2gpOwogICAgcmVjdC5ib3R0b209cmVjdC50b3A7CiAgIH0KLSAgR2V0Q2xpZW50UmVjdChod25kLCZyZWN0KTsKLSAgRnJhbWVSZWN0KGhEQywmcmVjdCxHZXRTdG9ja09iamVjdChCTEFDS19CUlVTSCkpOworICBHZXRDbGllbnRSZWN0MTYoaHduZCwmcmVjdCk7CisgIEZyYW1lUmVjdDE2KGhEQywmcmVjdCxHZXRTdG9ja09iamVjdChCTEFDS19CUlVTSCkpOwogICBSZWxlYXNlREMoaHduZCxoREMpOwogIH0KIH0KQEAgLTE2OTcsNyArMTY4OCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgICAgICAgICAgICBDQ19Td2l0Y2hUb0Z1bGxTaXplICAgICAgICAgICAgICAgICAgW2ludGVybmFsXQogICovCi1zdGF0aWMgdm9pZCBDQ19Td2l0Y2hUb0Z1bGxTaXplKEhXTkQgaERsZyxDT0xPUlJFRiByZXN1bHQsTFBSRUNUIGxwcmVjdCkKK3N0YXRpYyB2b2lkIENDX1N3aXRjaFRvRnVsbFNpemUoSFdORCBoRGxnLENPTE9SUkVGIHJlc3VsdCxMUFJFQ1QxNiBscHJlY3QpCiB7CiAgaW50IGk7CiAgc3RydWN0IENDUFJJVkFURSAqIGxwcD0oc3RydWN0IENDUFJJVkFURSAqKUdldFdpbmRvd0xvbmcoaERsZywgRFdMX1VTRVIpOyAKQEAgLTE3MjksMTggKzE3MjAsMTggQEAKIHN0YXRpYyB2b2lkIENDX1BhaW50UHJlZGVmQ29sb3JBcnJheShIV05EIGhEbGcsaW50IHJvd3MsaW50IGNvbHMpCiB7CiAgSFdORCBod25kPUdldERsZ0l0ZW0oaERsZywweDJkMCk7Ci0gUkVDVCByZWN0OworIFJFQ1QxNiByZWN0OwogIEhEQyAgaGRjOwogIEhCUlVTSCBoQnJ1c2g7CiAgaW50IGR4LGR5LGksaixrOwogCi0gR2V0Q2xpZW50UmVjdChod25kLCZyZWN0KTsKKyBHZXRDbGllbnRSZWN0MTYoaHduZCwmcmVjdCk7CiAgZHg9cmVjdC5yaWdodC9jb2xzOwogIGR5PXJlY3QuYm90dG9tL3Jvd3M7CiAgaz1yZWN0LmxlZnQ7CiAKICBoZGM9R2V0REMoaHduZCk7Ci0gR2V0Q2xpZW50UmVjdCAoaHduZCwgJnJlY3QpIDsKKyBHZXRDbGllbnRSZWN0MTYgKGh3bmQsICZyZWN0KSA7CiAKICBmb3IgKGo9MDtqPHJvd3M7aisrKQogIHsKQEAgLTE3NjgsMTIgKzE3NTksMTIgQEAKIHN0YXRpYyB2b2lkIENDX1BhaW50VXNlckNvbG9yQXJyYXkoSFdORCBoRGxnLGludCByb3dzLGludCBjb2xzLENPTE9SUkVGKiBscGNyKQogewogIEhXTkQgaHduZD1HZXREbGdJdGVtKGhEbGcsMHgyZDEpOwotIFJFQ1QgcmVjdDsKKyBSRUNUMTYgcmVjdDsKICBIREMgIGhkYzsKICBIQlJVU0ggaEJydXNoOwogIGludCBkeCxkeSxpLGosazsKIAotIEdldENsaWVudFJlY3QoaHduZCwmcmVjdCk7CisgR2V0Q2xpZW50UmVjdDE2KGh3bmQsJnJlY3QpOwogCiAgZHg9cmVjdC5yaWdodC9jb2xzOwogIGR5PXJlY3QuYm90dG9tL3Jvd3M7CkBAIC0xODI1LDggKzE4MTYsOCBAQAogewogICAgaW50IGkscmVzOwogICAgSFdORCBod25kOwotICAgUkVDVCByZWN0OwotICAgUE9JTlQgcG9pbnQ7CisgICBSRUNUMTYgcmVjdDsKKyAgIFBPSU5UMTYgcG9pbnQ7CiAgICBzdHJ1Y3QgQ0NQUklWQVRFICogbHBwOyAKICAgIAogICAgZHByaW50Zl9jb21tZGxnKHN0ZGRlYiwiQ29sb3JEbGdQcm9jIC8vIFdNX0lOSVRESUFMT0cgbFBhcmFtPSUwOGxYXG4iLCBsUGFyYW0pOwpAQCAtMTg0MSw3ICsxODMyLDcgQEAKIAogICAgaWYgKCEobHBwLT5scGNjLT5GbGFncyAmIENDX1NIT1dIRUxQKSkKICAgICAgIFNob3dXaW5kb3coR2V0RGxnSXRlbShoRGxnLDB4NDBlKSxTV19ISURFKTsKLSAgIGxwcC0+bXNldHJnYj1SZWdpc3RlcldpbmRvd01lc3NhZ2UoTUFLRV9TRUdQVFIoU0VUUkdCU1RSSU5HKSk7CisgICBscHAtPm1zZXRyZ2I9UmVnaXN0ZXJXaW5kb3dNZXNzYWdlMzJBKCBTRVRSR0JTVFJJTkcgKTsKICNpZiAwCiAgICBjcG9zPU1BS0VMT05HKDUsNyk7IC8qIGluaXQgKi8KICAgIGlmIChscHAtPmxwY2MtPkZsYWdzICYgQ0NfUkdCSU5JVCkKQEAgLTE4NTcsNyArMTg0OCw3IEBACiAgICBmb3VuZDoKICAgIC8qIEZJWE1FOiBEcmF3X2FfZm9jdXNfcmVjdCAmIHNldF9pbml0X3ZhbHVlcyAqLwogI2VuZGlmCi0gICBHZXRXaW5kb3dSZWN0KGhEbGcsJmxwcC0+ZnVsbHNpemUpOworICAgR2V0V2luZG93UmVjdDE2KGhEbGcsJmxwcC0+ZnVsbHNpemUpOwogICAgaWYgKGxwcC0+bHBjYy0+RmxhZ3MgJiBDQ19GVUxMT1BFTiB8fCBscHAtPmxwY2MtPkZsYWdzICYgQ0NfUFJFVkVOVEZVTExPUEVOKQogICAgewogICAgICAgaHduZD1HZXREbGdJdGVtKGhEbGcsMHgyY2YpOwpAQCAtMTg2OSw5ICsxODYwLDkgQEAKICAgICAgIHJlcz1yZWN0LmJvdHRvbS1yZWN0LnRvcDsKICAgICAgIGh3bmQ9R2V0RGxnSXRlbShoRGxnLDB4MmM2KTsgLyogY3V0IGF0IGxlZnQgYm9yZGVyICovCiAgICAgICBwb2ludC54PXBvaW50Lnk9MDsKLSAgICAgIENsaWVudFRvU2NyZWVuKGh3bmQsJnBvaW50KTsKLSAgICAgIFNjcmVlblRvQ2xpZW50KGhEbGcsJnBvaW50KTsKLSAgICAgIEdldENsaWVudFJlY3QoaERsZywmcmVjdCk7CisgICAgICBDbGllbnRUb1NjcmVlbjE2KGh3bmQsJnBvaW50KTsKKyAgICAgIFNjcmVlblRvQ2xpZW50MTYoaERsZywmcG9pbnQpOworICAgICAgR2V0Q2xpZW50UmVjdDE2KGhEbGcsJnJlY3QpOwogICAgICAgcG9pbnQueCs9R2V0U3lzdGVtTWV0cmljcyhTTV9DWERMR0ZSQU1FKTsKICAgICAgIFNldFdpbmRvd1BvcyhoRGxnLE5VTEwsMCwwLHBvaW50LngscmVzLFNXUF9OT01PVkV8U1dQX05PWk9SREVSKTsKIApAQCAtMTg4NCw3ICsxODc1LDcgQEAKICAgIGZvciAoaT0weDJiZjtpPDB4MmM1O2krKykKICAgICAgU2VuZE1lc3NhZ2UoR2V0RGxnSXRlbShoRGxnLGkpLEVNX0xJTUlUVEVYVCwzLDApOyAgICAgIC8qIG1heCAzIGRpZ2l0czogIHh5eiAgKi8KICAgIGlmIChDQ19Ib29rQ2FsbENoayhscHAtPmxwY2MpKQotICAgICAgcmVzPUNhbGxXaW5kb3dQcm9jKChGQVJQUk9DKWxwcC0+bHBjYy0+bHBmbkhvb2ssaERsZyxXTV9JTklURElBTE9HLHdQYXJhbSxsUGFyYW0pOworICAgICAgcmVzPUNhbGxXaW5kb3dQcm9jMTYoKEZBUlBST0MpbHBwLT5scGNjLT5scGZuSG9vayxoRGxnLFdNX0lOSVRESUFMT0csd1BhcmFtLGxQYXJhbSk7CiAgICByZXR1cm4gcmVzOwogfQogCkBAIC0xOTYwLDcgKzE5NTEsNyBAQAogCSAgICAgICAKICAgICAgICAgICBjYXNlIDB4MmNmOgogICAgICAgICAgICAgICAgQ0NfU3dpdGNoVG9GdWxsU2l6ZShoRGxnLGxwcC0+bHBjYy0+cmdiUmVzdWx0LCZscHAtPmZ1bGxzaXplKTsKLQkgICAgICAgSW52YWxpZGF0ZVJlY3QoaERsZyxOVUxMLE5VTEwpOworCSAgICAgICBJbnZhbGlkYXRlUmVjdDMyKCBoRGxnLCBOVUxMLCBUUlVFICk7CiAJICAgICAgIFNldEZvY3VzKEdldERsZ0l0ZW0oaERsZywweDJiZikpOwogCSAgICAgICBicmVhazsKIApAQCAtMTk5MCwxNiArMTk4MSwxNiBAQAogCSAgICAgICBicmVhazsKIAogCSAgY2FzZSAweDQwZTogICAgICAgICAgIC8qIEhlbHAhICovIC8qIFRoZSBCZWF0bGVzLCAxOTY1ICA7LSkgKi8KLQkgICAgICAgaT1SZWdpc3RlcldpbmRvd01lc3NhZ2UoTUFLRV9TRUdQVFIoSEVMUE1TR1NUUklORykpOworCSAgICAgICBpPVJlZ2lzdGVyV2luZG93TWVzc2FnZTMyQSggSEVMUE1TR1NUUklORyApOwogCSAgICAgICBpZiAobHBwLT5scGNjLT5od25kT3duZXIpCiAJCSAgIFNlbmRNZXNzYWdlKGxwcC0+bHBjYy0+aHduZE93bmVyLGksMCwoTFBBUkFNKWxwcC0+bHBjYyk7CiAJICAgICAgIGlmIChDQ19Ib29rQ2FsbENoayhscHAtPmxwY2MpKQotCQkgICBDYWxsV2luZG93UHJvYygoRkFSUFJPQylscHAtPmxwY2MtPmxwZm5Ib29rLGhEbGcsCisJCSAgIENhbGxXaW5kb3dQcm9jMTYoKEZBUlBST0MpbHBwLT5scGNjLT5scGZuSG9vayxoRGxnLAogCQkgICAgICBXTV9DT01NQU5ELHBzaDE1LChMUEFSQU0pbHBwLT5scGNjKTsKIAkgICAgICAgYnJlYWs7CiAKICAgICAgICAgICBjYXNlIElET0sgOgotCQljb2ttc2c9UmVnaXN0ZXJXaW5kb3dNZXNzYWdlKE1BS0VfU0VHUFRSKENPTE9ST0tTVFJJTkcpKTsKKwkJY29rbXNnPVJlZ2lzdGVyV2luZG93TWVzc2FnZTMyQSggQ09MT1JPS1NUUklORyApOwogCQlpZiAobHBwLT5scGNjLT5od25kT3duZXIpCiAJCQlpZiAoU2VuZE1lc3NhZ2UobHBwLT5scGNjLT5od25kT3duZXIsY29rbXNnLDAsKExQQVJBTSlscHAtPmxwY2MpKQogCQkJICAgYnJlYWs7ICAgIC8qIGRvIE5PVCBjbG9zZSAqLwpAQCAtMjAzMiwxMSArMjAyMywxMSBAQAogICAgIENDX1BhaW50U2VsZWN0ZWRDb2xvcihoRGxnLGxwcC0+bHBjYy0+cmdiUmVzdWx0KTsKIAogICAgIC8qIHNwZWNpYWwgbmVjZXNzYXJ5IGZvciBXaW5lICovCi0gICAgVmFsaWRhdGVSZWN0KEdldERsZ0l0ZW0oaERsZywweDJkMCksTlVMTCk7Ci0gICAgVmFsaWRhdGVSZWN0KEdldERsZ0l0ZW0oaERsZywweDJkMSksTlVMTCk7Ci0gICAgVmFsaWRhdGVSZWN0KEdldERsZ0l0ZW0oaERsZywweDJjNiksTlVMTCk7Ci0gICAgVmFsaWRhdGVSZWN0KEdldERsZ0l0ZW0oaERsZywweDJiZSksTlVMTCk7Ci0gICAgVmFsaWRhdGVSZWN0KEdldERsZ0l0ZW0oaERsZywweDJjNSksTlVMTCk7CisgICAgVmFsaWRhdGVSZWN0MzIoR2V0RGxnSXRlbShoRGxnLDB4MmQwKSxOVUxMKTsKKyAgICBWYWxpZGF0ZVJlY3QzMihHZXREbGdJdGVtKGhEbGcsMHgyZDEpLE5VTEwpOworICAgIFZhbGlkYXRlUmVjdDMyKEdldERsZ0l0ZW0oaERsZywweDJjNiksTlVMTCk7CisgICAgVmFsaWRhdGVSZWN0MzIoR2V0RGxnSXRlbShoRGxnLDB4MmJlKSxOVUxMKTsKKyAgICBWYWxpZGF0ZVJlY3QzMihHZXREbGdJdGVtKGhEbGcsMHgyYzUpLE5VTEwpOwogICAgIC8qIGhvcGUgd2UgY2FuIHJlbW92ZSBpdCBsYXRlciAtLT5GSVhNRSAqLwogIHJldHVybiAwOwogfQpAQCAtMjEwNCw3ICsyMDk1LDcgQEAKICAgICAgcmV0dXJuIEZBTFNFOwogICByZXM9MDsKICAgaWYgKENDX0hvb2tDYWxsQ2hrKGxwcC0+bHBjYykpCi0gICAgIHJlcz1DYWxsV2luZG93UHJvYygoRkFSUFJPQylscHAtPmxwY2MtPmxwZm5Ib29rLGhEbGcsbWVzc2FnZSx3UGFyYW0sbFBhcmFtKTsKKyAgICAgcmVzPUNhbGxXaW5kb3dQcm9jMTYoKEZBUlBST0MpbHBwLT5scGNjLT5scGZuSG9vayxoRGxnLG1lc3NhZ2Usd1BhcmFtLGxQYXJhbSk7CiAgIGlmIChyZXMpCiAgICAgIHJldHVybiByZXM7CiAgfQpAQCAtMjIzOSw5ICsyMjMwLDEwIEBACiAgICAgICBpPTA7CiAgICAgICB3aGlsZSAoc2l6ZXNbaV0pCiAgICAgICB7Ci0gICAgICAgIHNwcmludGYoYnVmZmVyLCIlM2QiLHNpemVzW2krK10pOwotICAgICAgICBqPVNlbmRNZXNzYWdlKGhjbWIzLENCX0FERFNUUklORywwLChMUEFSQU0pTUFLRV9TRUdQVFIoYnVmZmVyKSk7CisgICAgICAgIHNwcmludGYoYnVmZmVyLCIlZCIsc2l6ZXNbaV0pOworICAgICAgICBqPVNlbmRNZXNzYWdlKGhjbWIzLENCX0lOU0VSVFNUUklORywtMSwoTFBBUkFNKU1BS0VfU0VHUFRSKGJ1ZmZlcikpOwogICAgICAgICBTZW5kTWVzc2FnZShoY21iMywgQ0JfU0VUSVRFTURBVEEsIGosIE1BS0VMT05HKHNpemVzW2ldLDApKTsKKyAgICAgICAgaSsrOwogICAgICAgfQogICAgIH0KICAgfQpAQCAtMjM5MSw3ICsyMzgzLDcgQEAKICAgICBSZWxlYXNlREMoaERsZyxoZGMpOwogICByZXM9VFJVRTsKICAgaWYgKENGbl9Ib29rQ2FsbENoayhscGNmKSkKLSAgICByZXM9Q2FsbFdpbmRvd1Byb2MobHBjZi0+bHBmbkhvb2ssaERsZyxXTV9JTklURElBTE9HLHdQYXJhbSxsUGFyYW0pOworICAgIHJlcz1DYWxsV2luZG93UHJvYzE2KGxwY2YtPmxwZm5Ib29rLGhEbGcsV01fSU5JVERJQUxPRyx3UGFyYW0sbFBhcmFtKTsKICAgU2V0Q3Vyc29yKGhjdXJzb3IpOyAgIAogICByZXR1cm4gcmVzOwogfQpAQCAtMjQyMiwyMyArMjQxNCwyMyBAQAogICBjaGFyIGJ1ZmZlcls0MF07CiAgIEJJVE1BUCBibTsKICAgQ09MT1JSRUYgY3I7Ci0gIFJFQ1QgcmVjdDsKKyAgUkVDVDE2IHJlY3Q7CiAjaWYgMCAgCiAgIEhEQyBoTWVtREM7CiAgIGludCBuRm9udFR5cGU7CiAgIEhCSVRNQVAgaEJpdG1hcDsgLyogZm9yIGxhdGVyIFRUIHVzYWdlICovCiAjZW5kaWYgIAotICBMUERSQVdJVEVNU1RSVUNUIGxwZGkgPSAoTFBEUkFXSVRFTVNUUlVDVClQVFJfU0VHX1RPX0xJTihsUGFyYW0pOworICBMUERSQVdJVEVNU1RSVUNUMTYgbHBkaSA9IChMUERSQVdJVEVNU1RSVUNUMTYpUFRSX1NFR19UT19MSU4obFBhcmFtKTsKIAogICBpZiAobHBkaS0+aXRlbUlEID09IDB4RkZGRikgCQkJLyogZ290IG5vIGl0ZW1zICovCi0gICAgRHJhd0ZvY3VzUmVjdChscGRpLT5oREMsICZscGRpLT5yY0l0ZW0pOworICAgIERyYXdGb2N1c1JlY3QxNihscGRpLT5oREMsICZscGRpLT5yY0l0ZW0pOwogICBlbHNlCiAgIHsKICAgIGlmIChscGRpLT5DdGxUeXBlID09IE9EVF9DT01CT0JPWCkKICAgIHsKICAgICAgaEJydXNoID0gU2VsZWN0T2JqZWN0KGxwZGktPmhEQywgR2V0U3RvY2tPYmplY3QoTFRHUkFZX0JSVVNIKSk7CiAgICAgIFNlbGVjdE9iamVjdChscGRpLT5oREMsIGhCcnVzaCk7Ci0gICAgIEZpbGxSZWN0KGxwZGktPmhEQywgJmxwZGktPnJjSXRlbSwgaEJydXNoKTsKKyAgICAgRmlsbFJlY3QxNihscGRpLT5oREMsICZscGRpLT5yY0l0ZW0sIGhCcnVzaCk7CiAgICB9CiAgICBlbHNlCiAgICAgIHJldHVybiBUUlVFOwkvKiB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KQEAgLTI0NTAsOCArMjQ0Miw4IEBACiAJCVNlbmRNZXNzYWdlKGxwZGktPmh3bmRJdGVtLCBDQl9HRVRMQlRFWFQsIGxwZGktPml0ZW1JRCwKIAkJCShMUEFSQU0pTUFLRV9TRUdQVFIoYnVmZmVyKSk7CSAgICAgICAgICAKIAkJR2V0T2JqZWN0KGhCaXRtYXBUVCwgc2l6ZW9mKEJJVE1BUCksIChMUFNUUikmYm0pOwotCQlUZXh0T3V0KGxwZGktPmhEQywgbHBkaS0+cmNJdGVtLmxlZnQgKyBibS5ibVdpZHRoICsgMTAsCi0JCQlscGRpLT5yY0l0ZW0udG9wLCBidWZmZXIsIGxzdHJsZW4oYnVmZmVyKSk7CisJCVRleHRPdXQxNihscGRpLT5oREMsIGxwZGktPnJjSXRlbS5sZWZ0ICsgYm0uYm1XaWR0aCArIDEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBscGRpLT5yY0l0ZW0udG9wLCBidWZmZXIsIGxzdHJsZW4oYnVmZmVyKSk7CiAjaWYgMAogCQluRm9udFR5cGUgPSBTZW5kTWVzc2FnZShscGRpLT5od25kSXRlbSwgQ0JfR0VUSVRFTURBVEEsIGxwZGktPml0ZW1JRCwwTCk7CiAJCSAgLyogRklYTUU6IGRyYXcgYml0bWFwIGlmIHRydWV0eXBlIHVzYWdlICovCkBAIC0yNDcwLDE1ICsyNDYyLDE1IEBACiAgICAgY2FzZSBjbWIzOgkvKiBkcHJpbnRmX2NvbW1kbGcoc3RkZGViLCJXTV9EUkFXSVRFTiBjbWIyLGNtYjNcbiIpOyAqLwogCQlTZW5kTWVzc2FnZShscGRpLT5od25kSXRlbSwgQ0JfR0VUTEJURVhULCBscGRpLT5pdGVtSUQsCiAJCQkoTFBBUkFNKU1BS0VfU0VHUFRSKGJ1ZmZlcikpOwotCQlUZXh0T3V0KGxwZGktPmhEQywgbHBkaS0+cmNJdGVtLmxlZnQsCi0JCQlscGRpLT5yY0l0ZW0udG9wLCBidWZmZXIsIGxzdHJsZW4oYnVmZmVyKSk7CisJCVRleHRPdXQxNihscGRpLT5oREMsIGxwZGktPnJjSXRlbS5sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBscGRpLT5yY0l0ZW0udG9wLCBidWZmZXIsIGxzdHJsZW4oYnVmZmVyKSk7CiAJCWJyZWFrOwogCiAgICAgY2FzZSBjbWI0OgkvKiBkcHJpbnRmX2NvbW1kbGcoc3RkZGViLCJXTV9EUkFXSVRFTSBjbWI0ICg9Q09MT1IpXG4iKTsgKi8KIAkJU2VuZE1lc3NhZ2UobHBkaS0+aHduZEl0ZW0sIENCX0dFVExCVEVYVCwgbHBkaS0+aXRlbUlELAogICAgIAkJICAgIChMUEFSQU0pTUFLRV9TRUdQVFIoYnVmZmVyKSk7Ci0JCVRleHRPdXQobHBkaS0+aERDLCBscGRpLT5yY0l0ZW0ubGVmdCArICAyNSs1LAotCQkJbHBkaS0+cmNJdGVtLnRvcCwgYnVmZmVyLCBsc3RybGVuKGJ1ZmZlcikpOworCQlUZXh0T3V0MTYobHBkaS0+aERDLCBscGRpLT5yY0l0ZW0ubGVmdCArICAyNSs1LAorICAgICAgICAgICAgICAgICAgICAgICAgICBscGRpLT5yY0l0ZW0udG9wLCBidWZmZXIsIGxzdHJsZW4oYnVmZmVyKSk7CiAJCWNyID0gU2VuZE1lc3NhZ2UobHBkaS0+aHduZEl0ZW0sIENCX0dFVElURU1EQVRBLCBscGRpLT5pdGVtSUQsMEwpOwogCQloQnJ1c2ggPSBDcmVhdGVTb2xpZEJydXNoKGNyKTsKIAkJaWYgKGhCcnVzaCkKQEAgLTI0OTgsNyArMjQ5MCw3IEBACiAgICAgZGVmYXVsdDoJcmV0dXJuIFRSVUU7CS8qIHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiAqLwogICAgfQogICAgaWYgKGxwZGktPml0ZW1TdGF0ZSA9PU9EU19TRUxFQ1RFRCkKLSAgICAgSW52ZXJ0UmVjdChscGRpLT5oREMsICZyZWN0KTsKKyAgICAgSW52ZXJ0UmVjdDE2KGxwZGktPmhEQywgJnJlY3QpOwogIH0KICByZXR1cm4gVFJVRTsKIH0KQEAgLTI2MjIsMTUgKzI2MTQsMTUgQEAKIAkJICBpZiAoaSE9Q0JfRVJSKQogCQkgIHsKIAkJICAgbHBjZi0+cmdiQ29sb3JzPXRleHRjb2xvcnNbaV07Ci0JCSAgIEludmFsaWRhdGVSZWN0KEdldERsZ0l0ZW0oaERsZyxzdGM2KSxOVUxMLDApOworCQkgICBJbnZhbGlkYXRlUmVjdDMyKCBHZXREbGdJdGVtKGhEbGcsc3RjNiksIE5VTEwsIDAgKTsKIAkJICB9CiAJCSAgYnJlYWs7CiAJCi0JY2FzZSBwc2gxNTppPVJlZ2lzdGVyV2luZG93TWVzc2FnZShNQUtFX1NFR1BUUihIRUxQTVNHU1RSSU5HKSk7CisJY2FzZSBwc2gxNTppPVJlZ2lzdGVyV2luZG93TWVzc2FnZTMyQSggSEVMUE1TR1NUUklORyApOwogCQkgIGlmIChscGNmLT5od25kT3duZXIpCiAJCSAgICBTZW5kTWVzc2FnZShscGNmLT5od25kT3duZXIsaSwwLChMUEFSQU0pbHBjZik7CiAJCSAgaWYgKENGbl9Ib29rQ2FsbENoayhscGNmKSkKLQkJICAgIENhbGxXaW5kb3dQcm9jKGxwY2YtPmxwZm5Ib29rLGhEbGcsV01fQ09NTUFORCxwc2gxNSwoTFBBUkFNKWxwY2YpOworCQkgICAgQ2FsbFdpbmRvd1Byb2MxNihscGNmLT5scGZuSG9vayxoRGxnLFdNX0NPTU1BTkQscHNoMTUsKExQQVJBTSlscGNmKTsKIAkJICBicmVhazsKIAogCWNhc2UgSURPSzpFbmREaWFsb2coaERsZywgVFJVRSk7CkBAIC0yNjU3LDcgKzI2NDksNyBAQAogICAgaWYgKCFscGNmKQogICAgICAgcmV0dXJuIEZBTFNFOwogICAgaWYgKENGbl9Ib29rQ2FsbENoayhscGNmKSkKLSAgICAgcmVzPUNhbGxXaW5kb3dQcm9jKGxwY2YtPmxwZm5Ib29rLGhEbGcsbWVzc2FnZSx3UGFyYW0sbFBhcmFtKTsKKyAgICAgcmVzPUNhbGxXaW5kb3dQcm9jMTYobHBjZi0+bHBmbkhvb2ssaERsZyxtZXNzYWdlLHdQYXJhbSxsUGFyYW0pOwogICAgaWYgKHJlcykKICAgICByZXR1cm4gcmVzOwogICB9CmRpZmYgLS1naXQgYS9taXNjL2V4ZWMuYyBiL21pc2MvZXhlYy5jCmluZGV4IGFkNTNmNmIuLmExOTgyY2UgMTAwNjQ0Ci0tLSBhL21pc2MvZXhlYy5jCisrKyBiL21pc2MvZXhlYy5jCkBAIC0xMTEsNyArMTExLDYgQEAKIHsKIAlzdGF0aWMgV09SRCBXTV9XSU5IRUxQPTA7CiAJSFdORCBoRGVzdDsKLQljaGFyIHN6QnVmWzIwXTsKIAlMUFdJTkhFTFAgbHB3aDsKIAlIQU5ETEUgaHdoOwogCXZvaWQgKmRhdGE9MDsKQEAgLTEyMiwxMyArMTIxLDExIEBACiAJLyogRklYTUU6IFNob3VsZCBiZSBkaXJlY3RlZCB5aWVsZCwgdG8gbGV0IHdpbmhlbHAgb3BlbiB0aGUgd2luZG93ICovCiAJWWllbGQoKTsKIAlpZighV01fV0lOSEVMUCkgewotCQlzdHJjcHkoc3pCdWYsIldNX1dJTkhFTFAiKTsKLQkJV01fV0lOSEVMUD1SZWdpc3RlcldpbmRvd01lc3NhZ2UoTUFLRV9TRUdQVFIoc3pCdWYpKTsKKwkJV01fV0lOSEVMUD1SZWdpc3RlcldpbmRvd01lc3NhZ2UzMkEoIldNX1dJTkhFTFAiKTsKIAkJaWYoIVdNX1dJTkhFTFApCiAJCQlyZXR1cm4gRkFMU0U7CiAJfQotCXN0cmNweShzekJ1ZiwiTVNfV0lOSEVMUCIpOwotCWhEZXN0ID0gRmluZFdpbmRvdyhNQUtFX1NFR1BUUihzekJ1ZiksMCk7CisJaERlc3QgPSBGaW5kV2luZG93MzJBKCAiTVNfV0lOSEVMUCIsIE5VTEwgKTsKIAlpZighaERlc3QpCiAJCXJldHVybiBGQUxTRTsKIAlzd2l0Y2god0NvbW1hbmQpCmRpZmYgLS1naXQgYS9taXNjL21haW4uYyBiL21pc2MvbWFpbi5jCmluZGV4IDIzM2U3ZWQuLmQxZTIzYWQgMTAwNjQ0Ci0tLSBhL21pc2MvbWFpbi5jCisrKyBiL21pc2MvbWFpbi5jCkBAIC01NjQsOSArNTY0LDYgQEAKICAgICAKICAgICBNQUlOX1BhcnNlT3B0aW9ucyggJmFyZ2MsIGFyZ3YgKTsKIAotICAgIFNIRUxMX0luaXQoKTsKLSAgICBTSEVMTF9Mb2FkUmVnaXN0cnkoKTsKLQogICAgIHNjcmVlbiAgICAgICA9IERlZmF1bHRTY3JlZW5PZkRpc3BsYXkoIGRpc3BsYXkgKTsKICAgICBzY3JlZW5XaWR0aCAgPSBXaWR0aE9mU2NyZWVuKCBzY3JlZW4gKTsKICAgICBzY3JlZW5IZWlnaHQgPSBIZWlnaHRPZlNjcmVlbiggc2NyZWVuICk7CkBAIC04OTIsMzggKzg4OSw0NSBAQAogCQkJYnJlYWs7CiAJCQogCQljYXNlIFNQSV9HRVRCT1JERVI6Ci0JCQkqKElOVCAqKSBscHZQYXJhbSA9IDE7CisJCQkqKElOVCAqKWxwdlBhcmFtID0gR2V0U3lzdGVtTWV0cmljcyggU01fQ1hGUkFNRSApOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBTUElfR0VURkFTVFRBU0tTV0lUQ0g6CiAJCQkqKEJPT0wgKikgbHB2UGFyYW0gPSBGQUxTRTsKKwkJCS8qIEZJWE1FIEdldFByb2ZpbGVJbnQoICJ3aW5kb3dzIiwgIkNvb2xTd2l0Y2giLCAxICkgKi8KIAkJCWJyZWFrOwogCiAJCWNhc2UgU1BJX0dFVEdSSURHUkFOVUxBUklUWToKIAkJCSooSU5UICopIGxwdlBhcmFtID0gMTsKKwkJLyogRklYTUUgR2V0UHJvZmlsZUludCggImRlc2t0b3AiLCAiR3JpZEdyYW51bGFyaXR5IiwgMSApICovCiAJCQlicmVhazsKIAogCQljYXNlIFNQSV9HRVRJQ09OVElUTEVXUkFQOgogCQkJKihCT09MICopIGxwdlBhcmFtID0gRkFMU0U7CisJCQkvKiBGSVhNRSBHZXRQcm9maWxlSW50KCAiZGVza3RvcCIsICI/IiwgVHJ1ZSApICovCiAJCQlicmVhazsKIAogCQljYXNlIFNQSV9HRVRLRVlCT0FSRERFTEFZOgogCQkJKihJTlQgKikgbHB2UGFyYW0gPSAxOworCQkJLyogRklYTUUgKi8KIAkJCWJyZWFrOwogCiAJCWNhc2UgU1BJX0dFVEtFWUJPQVJEU1BFRUQ6CiAJCQkqKFdPUkQgKikgbHB2UGFyYW0gPSAzMDsKKwkJCS8qIEZJWE1FICovCiAJCQlicmVhazsKIAogCQljYXNlIFNQSV9HRVRNRU5VRFJPUEFMSUdOTUVOVDoKLQkJCSooQk9PTCAqKSBscHZQYXJhbSA9IEZBTFNFOworCQkJKihCT09MICopIGxwdlBhcmFtID0gR2V0U3lzdGVtTWV0cmljcyggU01fTUVOVURST1BBTElHTk1FTlQgKTsgLyogWFhYIGNoZWNrIHRoaXMgKi8KIAkJCWJyZWFrOwogCiAJCWNhc2UgU1BJX0dFVFNDUkVFTlNBVkVBQ1RJVkU6CisJCQkvKiBGSVhNRSBHZXRQcm9maWxlSW50KCAid2luZG93cyIsICJTY3JlZW5TYXZlQWN0aXZlIiwgMSApOyAqLwogCQkJKihCT09MICopIGxwdlBhcmFtID0gRkFMU0U7CiAJCQlicmVhazsKIAogCQljYXNlIFNQSV9HRVRTQ1JFRU5TQVZFVElNRU9VVDoKKwkJCS8qIEZJWE1FIEdldFByb2ZpbGVJbnQoICJ3aW5kb3dzIiwgIlNjcmVlblNhdmVUaW1lb3V0IiwgMzAwICk7ICovCiAJCQlYR2V0U2NyZWVuU2F2ZXIoZGlzcGxheSwgJnRpbWVvdXQsICZ0ZW1wLCZ0ZW1wLCZ0ZW1wKTsKIAkJCSooSU5UICopIGxwdlBhcmFtID0gdGltZW91dCAqIDEwMDA7CiAJCQlicmVhazsKQEAgLTkzMiwxNCArOTM2LDE0IEBACiAJCQlpZiAobHB2UGFyYW0gPT0gTlVMTCkKIAkJCQlmcHJpbnRmKHN0ZGVyciwgIlN5c3RlbVBhcmFtZXRlcnNJbmZvOiBIb3Jpem9udGFsIGljb24gc3BhY2luZyBzZXQgdG8gJWRcbi4iLCB1UGFyYW0pOwogCQkJZWxzZQotCQkJCSooSU5UICopIGxwdlBhcmFtID0gNTA7CisJCQkJKihJTlQgKikgbHB2UGFyYW0gPSBHZXRTeXN0ZW1NZXRyaWNzKCBTTV9DWElDT05TUEFDSU5HICk7CiAJCQlicmVhazsKIAogCQljYXNlIFNQSV9JQ09OVkVSVElDQUxTUEFDSU5HOgogCQkJaWYgKGxwdlBhcmFtID09IE5VTEwpCiAJCQkJZnByaW50ZihzdGRlcnIsICJTeXN0ZW1QYXJhbWV0ZXJzSW5mbzogVmVydGljYWwgaWNvbiBzcGFjaW5nIHNldCB0byAlZFxuLiIsIHVQYXJhbSk7CiAJCQllbHNlCi0JCQkJKihJTlQgKikgbHB2UGFyYW0gPSA1MDsKKwkJCQkqKElOVCAqKSBscHZQYXJhbSA9IEdldFN5c3RlbU1ldHJpY3MoIFNNX0NZSUNPTlNQQUNJTkcgKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgU1BJX1NFVEJFRVA6CkBAIC05NzksNiArOTgzLDcgQEAKIAogCSAgICAgICAgY2FzZSBTUElfR0VUSUNPTlRJVExFTE9HRk9OVDogCiAJICAgICAgICB7CisJCSAgICAvKiBGSVhNRSBHZXRQcm9maWxlU3RyaW5nKCAiPyIsICI/IiwgIj8iICkgKi8KIAkJICBMUExPR0ZPTlQgbHBMb2dGb250ID0gKExQTE9HRk9OVClscHZQYXJhbTsKIAkJICBscExvZ0ZvbnQtPmxmSGVpZ2h0ID0gMTA7CiAJCSAgbHBMb2dGb250LT5sZldpZHRoID0gMDsKZGlmZiAtLWdpdCBhL21pc2MvcmVjdC5jIGIvbWlzYy9yZWN0LmMKaW5kZXggNjhlYjQ2Mi4uNjFkNzZjMiAxMDA2NDQKLS0tIGEvbWlzYy9yZWN0LmMKKysrIGIvbWlzYy9yZWN0LmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogUmVjdGFuZ2xlLXJlbGF0ZWQgZnVuY3Rpb25zCiAgKgotICogQ29weXJpZ2h0IDE5OTMgQWxleGFuZHJlIEp1bGxpYXJkCisgKiBDb3B5cmlnaHQgMTk5MywgMTk5NiBBbGV4YW5kcmUgSnVsbGlhcmQKICAqCiAgKi8KIApAQCAtOSw5ICs5LDkgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBTZXRSZWN0ICAgIChVU0VSLjcyKQorICogICAgICAgICAgIFNldFJlY3QxNiAgICAoVVNFUi43MikKICAqLwotdm9pZCBTZXRSZWN0KCBMUFJFQ1QgcmVjdCwgc2hvcnQgbGVmdCwgc2hvcnQgdG9wLCBzaG9ydCByaWdodCwgc2hvcnQgYm90dG9tICkKK3ZvaWQgU2V0UmVjdDE2KExQUkVDVDE2IHJlY3QsIElOVDE2IGxlZnQsIElOVDE2IHRvcCwgSU5UMTYgcmlnaHQsIElOVDE2IGJvdHRvbSkKIHsKICAgICByZWN0LT5sZWZ0ICAgPSBsZWZ0OwogICAgIHJlY3QtPnJpZ2h0ICA9IHJpZ2h0OwpAQCAtMjEsMTggKzIxLDM5IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgU2V0UmVjdEVtcHR5ICAgIChVU0VSLjczKQorICogICAgICAgICAgIFNldFJlY3QzMiAgICAoVVNFUjMyLjQ5OCkKICAqLwotdm9pZCBTZXRSZWN0RW1wdHkoIExQUkVDVCByZWN0ICkKK3ZvaWQgU2V0UmVjdDMyKExQUkVDVDMyIHJlY3QsIElOVDMyIGxlZnQsIElOVDMyIHRvcCwgSU5UMzIgcmlnaHQsIElOVDMyIGJvdHRvbSkKK3sKKyAgICByZWN0LT5sZWZ0ICAgPSBsZWZ0OworICAgIHJlY3QtPnJpZ2h0ICA9IHJpZ2h0OworICAgIHJlY3QtPnRvcCAgICA9IHRvcDsKKyAgICByZWN0LT5ib3R0b20gPSBib3R0b207Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgU2V0UmVjdEVtcHR5MTYgICAgKFVTRVIuNzMpCisgKi8KK3ZvaWQgU2V0UmVjdEVtcHR5MTYoIExQUkVDVDE2IHJlY3QgKQogewogICAgIHJlY3QtPmxlZnQgPSByZWN0LT5yaWdodCA9IHJlY3QtPnRvcCA9IHJlY3QtPmJvdHRvbSA9IDA7CiB9CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgQ29weVJlY3QgICAgKFVTRVIuNzQpCisgKiAgICAgICAgICAgU2V0UmVjdEVtcHR5MzIgICAgKFVTRVIzMi40OTkpCiAgKi8KLUJPT0wgQ29weVJlY3QoIExQUkVDVCBkZXN0LCBMUFJFQ1Qgc3JjICkKK3ZvaWQgU2V0UmVjdEVtcHR5MzIoIExQUkVDVDMyIHJlY3QgKQoreworICAgIHJlY3QtPmxlZnQgPSByZWN0LT5yaWdodCA9IHJlY3QtPnRvcCA9IHJlY3QtPmJvdHRvbSA9IDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ29weVJlY3QxNiAgICAoVVNFUi43NCkKKyAqLworQk9PTDE2IENvcHlSZWN0MTYoIFJFQ1QxNiAqZGVzdCwgY29uc3QgUkVDVDE2ICpzcmMgKQogewogICAgICpkZXN0ID0gKnNyYzsKICAgICByZXR1cm4gVFJVRTsKQEAgLTQwLDE4ICs2MSwzNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIElzUmVjdEVtcHR5ICAgIChVU0VSLjc1KQorICogICAgICAgICAgIENvcHlSZWN0MzIgICAgKFVTRVIzMi42MSkKICAqLwotQk9PTCBJc1JlY3RFbXB0eSggTFBSRUNUIHJlY3QgKQorQk9PTDMyIENvcHlSZWN0MzIoIFJFQ1QzMiAqZGVzdCwgY29uc3QgUkVDVDMyICpzcmMgKQoreworICAgICpkZXN0ID0gKnNyYzsKKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBJc1JlY3RFbXB0eTE2ICAgIChVU0VSLjc1KQorICovCitCT09MMTYgSXNSZWN0RW1wdHkxNiggY29uc3QgUkVDVDE2ICpyZWN0ICkKIHsKICAgICByZXR1cm4gKChyZWN0LT5sZWZ0ID09IHJlY3QtPnJpZ2h0KSB8fCAocmVjdC0+dG9wID09IHJlY3QtPmJvdHRvbSkpOwogfQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFB0SW5SZWN0ICAgIChVU0VSLjc2KQorICogICAgICAgICAgIElzUmVjdEVtcHR5MzIgICAgKFVTRVIzMi4zNDYpCiAgKi8KLUJPT0wgUHRJblJlY3QoIExQUkVDVCByZWN0LCBQT0lOVCBwdCApCitCT09MMzIgSXNSZWN0RW1wdHkzMiggY29uc3QgUkVDVDMyICpyZWN0ICkKK3sKKyAgICByZXR1cm4gKChyZWN0LT5sZWZ0ID09IHJlY3QtPnJpZ2h0KSB8fCAocmVjdC0+dG9wID09IHJlY3QtPmJvdHRvbSkpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFB0SW5SZWN0MTYgICAgKFVTRVIuNzYpCisgKi8KK0JPT0wxNiBQdEluUmVjdDE2KCBjb25zdCBSRUNUMTYgKnJlY3QsIFBPSU5UMTYgcHQgKQogewogICAgIHJldHVybiAoKHB0LnggPj0gcmVjdC0+bGVmdCkgJiYgKHB0LnggPCByZWN0LT5yaWdodCkgJiYKIAkgICAgKHB0LnkgPj0gcmVjdC0+dG9wKSAmJiAocHQueSA8IHJlY3QtPmJvdHRvbSkpOwpAQCAtNTksOSArOTksMTkgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBPZmZzZXRSZWN0ICAgIChVU0VSLjc3KQorICogICAgICAgICAgIFB0SW5SZWN0MzIgICAgKFVTRVIzMi40MjMpCiAgKi8KLXZvaWQgT2Zmc2V0UmVjdCggTFBSRUNUIHJlY3QsIHNob3J0IHgsIHNob3J0IHkgKQorQk9PTDMyIFB0SW5SZWN0MzIoIGNvbnN0IFJFQ1QzMiAqcmVjdCwgUE9JTlQzMiBwdCApCit7CisgICAgcmV0dXJuICgocHQueCA+PSByZWN0LT5sZWZ0KSAmJiAocHQueCA8IHJlY3QtPnJpZ2h0KSAmJgorCSAgICAocHQueSA+PSByZWN0LT50b3ApICYmIChwdC55IDwgcmVjdC0+Ym90dG9tKSk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgT2Zmc2V0UmVjdDE2ICAgIChVU0VSLjc3KQorICovCit2b2lkIE9mZnNldFJlY3QxNiggTFBSRUNUMTYgcmVjdCwgSU5UMTYgeCwgSU5UMTYgeSApCiB7CiAgICAgcmVjdC0+bGVmdCAgICs9IHg7CiAgICAgcmVjdC0+cmlnaHQgICs9IHg7CkBAIC03MSw5ICsxMjEsMjEgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBJbmZsYXRlUmVjdCAgICAoVVNFUi43OCkKKyAqICAgICAgICAgICBPZmZzZXRSZWN0MzIgICAgKFVTRVIzMi40MDUpCiAgKi8KLXZvaWQgSW5mbGF0ZVJlY3QoIExQUkVDVCByZWN0LCBzaG9ydCB4LCBzaG9ydCB5ICkKK3ZvaWQgT2Zmc2V0UmVjdDMyKCBMUFJFQ1QzMiByZWN0LCBJTlQzMiB4LCBJTlQzMiB5ICkKK3sKKyAgICByZWN0LT5sZWZ0ICAgKz0geDsKKyAgICByZWN0LT5yaWdodCAgKz0geDsKKyAgICByZWN0LT50b3AgICAgKz0geTsKKyAgICByZWN0LT5ib3R0b20gKz0geTsgICAgCit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgSW5mbGF0ZVJlY3QxNiAgICAoVVNFUi43OCkKKyAqLwordm9pZCBJbmZsYXRlUmVjdDE2KCBMUFJFQ1QxNiByZWN0LCBJTlQxNiB4LCBJTlQxNiB5ICkKIHsKICAgICByZWN0LT5sZWZ0ICAgLT0geDsKICAgICByZWN0LT50b3AgCSAtPSB5OwpAQCAtODMsMTUgKzE0NSwyNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEludGVyc2VjdFJlY3QgICAgKFVTRVIuNzkpCisgKiAgICAgICAgICAgSW5mbGF0ZVJlY3QzMiAgICAoVVNFUjMyLjMyMCkKICAqLwotQk9PTCBJbnRlcnNlY3RSZWN0KCBMUFJFQ1QgZGVzdCwgTFBSRUNUIHNyYzEsIExQUkVDVCBzcmMyICkKK3ZvaWQgSW5mbGF0ZVJlY3QzMiggTFBSRUNUMzIgcmVjdCwgSU5UMzIgeCwgSU5UMzIgeSApCiB7Ci0gICAgaWYgKElzUmVjdEVtcHR5KHNyYzEpIHx8IElzUmVjdEVtcHR5KHNyYzIpIHx8CisgICAgcmVjdC0+bGVmdCAgIC09IHg7CisgICAgcmVjdC0+dG9wIAkgLT0geTsKKyAgICByZWN0LT5yaWdodCAgKz0geDsKKyAgICByZWN0LT5ib3R0b20gKz0geTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBJbnRlcnNlY3RSZWN0MTYgICAgKFVTRVIuNzkpCisgKi8KK0JPT0wxNiBJbnRlcnNlY3RSZWN0MTYoIExQUkVDVDE2IGRlc3QsIGNvbnN0IFJFQ1QxNiAqc3JjMSwgY29uc3QgUkVDVDE2ICpzcmMyICkKK3sKKyAgICBpZiAoSXNSZWN0RW1wdHkxNihzcmMxKSB8fCBJc1JlY3RFbXB0eTE2KHNyYzIpIHx8CiAJKHNyYzEtPmxlZnQgPj0gc3JjMi0+cmlnaHQpIHx8IChzcmMyLT5sZWZ0ID49IHNyYzEtPnJpZ2h0KSB8fAogCShzcmMxLT50b3AgPj0gc3JjMi0+Ym90dG9tKSB8fCAoc3JjMi0+dG9wID49IHNyYzEtPmJvdHRvbSkpCiAgICAgewotCVNldFJlY3RFbXB0eSggZGVzdCApOworCVNldFJlY3RFbXB0eTE2KCBkZXN0ICk7CiAJcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBkZXN0LT5sZWZ0ICAgPSBNQVgoIHNyYzEtPmxlZnQsIHNyYzItPmxlZnQgKTsKQEAgLTEwMywyMiArMTc3LDQyIEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgVW5pb25SZWN0ICAgIChVU0VSLjgwKQorICogICAgICAgICAgIEludGVyc2VjdFJlY3QzMiAgICAoVVNFUjMyLjMyNikKICAqLwotQk9PTCBVbmlvblJlY3QoIExQUkVDVCBkZXN0LCBMUFJFQ1Qgc3JjMSwgTFBSRUNUIHNyYzIgKQorQk9PTDMyIEludGVyc2VjdFJlY3QzMiggTFBSRUNUMzIgZGVzdCwgY29uc3QgUkVDVDMyICpzcmMxLCBjb25zdCBSRUNUMzIgKnNyYzIgKQogewotICAgIGlmIChJc1JlY3RFbXB0eShzcmMxKSkKKyAgICBpZiAoSXNSZWN0RW1wdHkzMihzcmMxKSB8fCBJc1JlY3RFbXB0eTMyKHNyYzIpIHx8CisJKHNyYzEtPmxlZnQgPj0gc3JjMi0+cmlnaHQpIHx8IChzcmMyLT5sZWZ0ID49IHNyYzEtPnJpZ2h0KSB8fAorCShzcmMxLT50b3AgPj0gc3JjMi0+Ym90dG9tKSB8fCAoc3JjMi0+dG9wID49IHNyYzEtPmJvdHRvbSkpCiAgICAgewotCWlmIChJc1JlY3RFbXB0eShzcmMyKSkKKwlTZXRSZWN0RW1wdHkzMiggZGVzdCApOworCXJldHVybiBGQUxTRTsKKyAgICB9CisgICAgZGVzdC0+bGVmdCAgID0gTUFYKCBzcmMxLT5sZWZ0LCBzcmMyLT5sZWZ0ICk7CisgICAgZGVzdC0+cmlnaHQgID0gTUlOKCBzcmMxLT5yaWdodCwgc3JjMi0+cmlnaHQgKTsKKyAgICBkZXN0LT50b3AgICAgPSBNQVgoIHNyYzEtPnRvcCwgc3JjMi0+dG9wICk7CisgICAgZGVzdC0+Ym90dG9tID0gTUlOKCBzcmMxLT5ib3R0b20sIHNyYzItPmJvdHRvbSApOworICAgIHJldHVybiBUUlVFOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFVuaW9uUmVjdDE2ICAgIChVU0VSLjgwKQorICovCitCT09MMTYgVW5pb25SZWN0MTYoIExQUkVDVDE2IGRlc3QsIGNvbnN0IFJFQ1QxNiAqc3JjMSwgY29uc3QgUkVDVDE2ICpzcmMyICkKK3sKKyAgICBpZiAoSXNSZWN0RW1wdHkxNihzcmMxKSkKKyAgICB7CisJaWYgKElzUmVjdEVtcHR5MTYoc3JjMikpCiAJewotCSAgICBTZXRSZWN0RW1wdHkoIGRlc3QgKTsKKwkgICAgU2V0UmVjdEVtcHR5MTYoIGRlc3QgKTsKIAkgICAgcmV0dXJuIEZBTFNFOwogCX0KIAllbHNlICpkZXN0ID0gKnNyYzI7CiAgICAgfQogICAgIGVsc2UKICAgICB7Ci0JaWYgKElzUmVjdEVtcHR5KHNyYzIpKSAqZGVzdCA9ICpzcmMxOworCWlmIChJc1JlY3RFbXB0eTE2KHNyYzIpKSAqZGVzdCA9ICpzcmMxOwogCWVsc2UKIAl7CiAJICAgIGRlc3QtPmxlZnQgICA9IE1JTiggc3JjMS0+bGVmdCwgc3JjMi0+bGVmdCApOwpAQCAtMTMyLDkgKzIyNiwzOCBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEVxdWFsUmVjdCAgICAoVVNFUi4yNDQpCisgKiAgICAgICAgICAgVW5pb25SZWN0MzIgICAgKFVTRVIzMi41NTgpCiAgKi8KLUJPT0wgRXF1YWxSZWN0KCBjb25zdCBSRUNUKiByZWN0MSwgY29uc3QgUkVDVCogcmVjdDIgKQorQk9PTDMyIFVuaW9uUmVjdDMyKCBMUFJFQ1QzMiBkZXN0LCBjb25zdCBSRUNUMzIgKnNyYzEsIGNvbnN0IFJFQ1QzMiAqc3JjMiApCit7CisgICAgaWYgKElzUmVjdEVtcHR5MzIoc3JjMSkpCisgICAgeworCWlmIChJc1JlY3RFbXB0eTMyKHNyYzIpKQorCXsKKwkgICAgU2V0UmVjdEVtcHR5MzIoIGRlc3QgKTsKKwkgICAgcmV0dXJuIEZBTFNFOworCX0KKwllbHNlICpkZXN0ID0gKnNyYzI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJaWYgKElzUmVjdEVtcHR5MzIoc3JjMikpICpkZXN0ID0gKnNyYzE7CisJZWxzZQorCXsKKwkgICAgZGVzdC0+bGVmdCAgID0gTUlOKCBzcmMxLT5sZWZ0LCBzcmMyLT5sZWZ0ICk7CisJICAgIGRlc3QtPnJpZ2h0ICA9IE1BWCggc3JjMS0+cmlnaHQsIHNyYzItPnJpZ2h0ICk7CisJICAgIGRlc3QtPnRvcCAgICA9IE1JTiggc3JjMS0+dG9wLCBzcmMyLT50b3AgKTsKKwkgICAgZGVzdC0+Ym90dG9tID0gTUFYKCBzcmMxLT5ib3R0b20sIHNyYzItPmJvdHRvbSApOwkgICAgCisJfQorICAgIH0KKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBFcXVhbFJlY3QxNiAgICAoVVNFUi4yNDQpCisgKi8KK0JPT0wxNiBFcXVhbFJlY3QxNiggY29uc3QgUkVDVDE2KiByZWN0MSwgY29uc3QgUkVDVDE2KiByZWN0MiApCiB7CiAgICAgcmV0dXJuICgocmVjdDEtPmxlZnQgPT0gcmVjdDItPmxlZnQpICYmIChyZWN0MS0+cmlnaHQgPT0gcmVjdDItPnJpZ2h0KSAmJgogCSAgICAocmVjdDEtPnRvcCA9PSByZWN0Mi0+dG9wKSAmJiAocmVjdDEtPmJvdHRvbSA9PSByZWN0Mi0+Ym90dG9tKSk7CkBAIC0xNDIsMjMgKzI2NSwzMyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFN1YnRyYWN0UmVjdCAgICAoVVNFUi4zNzMpCisgKiAgICAgICAgICAgRXF1YWxSZWN0MzIgICAgKFVTRVIzMi4xOTMpCiAgKi8KLUJPT0wgU3VidHJhY3RSZWN0KCBMUFJFQ1QgZGVzdCwgTFBSRUNUIHNyYzEsIExQUkVDVCBzcmMyICkKK0JPT0wzMiBFcXVhbFJlY3QzMiggY29uc3QgUkVDVDMyKiByZWN0MSwgY29uc3QgUkVDVDMyKiByZWN0MiApCiB7Ci0gICAgUkVDVCB0bXA7CisgICAgcmV0dXJuICgocmVjdDEtPmxlZnQgPT0gcmVjdDItPmxlZnQpICYmIChyZWN0MS0+cmlnaHQgPT0gcmVjdDItPnJpZ2h0KSAmJgorCSAgICAocmVjdDEtPnRvcCA9PSByZWN0Mi0+dG9wKSAmJiAocmVjdDEtPmJvdHRvbSA9PSByZWN0Mi0+Ym90dG9tKSk7Cit9CiAKLSAgICBpZiAoSXNSZWN0RW1wdHkoIHNyYzEgKSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgU3VidHJhY3RSZWN0MTYgICAgKFVTRVIuMzczKQorICovCitCT09MMTYgU3VidHJhY3RSZWN0MTYoIExQUkVDVDE2IGRlc3QsIGNvbnN0IFJFQ1QxNiAqc3JjMSwgY29uc3QgUkVDVDE2ICpzcmMyICkKK3sKKyAgICBSRUNUMTYgdG1wOworCisgICAgaWYgKElzUmVjdEVtcHR5MTYoIHNyYzEgKSkKICAgICB7Ci0JU2V0UmVjdEVtcHR5KCBkZXN0ICk7CisJU2V0UmVjdEVtcHR5MTYoIGRlc3QgKTsKIAlyZXR1cm4gRkFMU0U7CiAgICAgfQogICAgICpkZXN0ID0gKnNyYzE7Ci0gICAgaWYgKEludGVyc2VjdFJlY3QoICZ0bXAsIHNyYzEsIHNyYzIgKSkKKyAgICBpZiAoSW50ZXJzZWN0UmVjdDE2KCAmdG1wLCBzcmMxLCBzcmMyICkpCiAgICAgewotCWlmIChFcXVhbFJlY3QoICZ0bXAsIGRlc3QgKSkKKwlpZiAoRXF1YWxSZWN0MTYoICZ0bXAsIGRlc3QgKSkKIAl7Ci0JICAgIFNldFJlY3RFbXB0eSggZGVzdCApOworCSAgICBTZXRSZWN0RW1wdHkxNiggZGVzdCApOwogCSAgICByZXR1cm4gRkFMU0U7CiAJfQogCWlmICgodG1wLnRvcCA9PSBkZXN0LT50b3ApICYmICh0bXAuYm90dG9tID09IGRlc3QtPmJvdHRvbSkpCkBAIC0xNzUsMyArMzA4LDM3IEBACiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgU3VidHJhY3RSZWN0MzIgICAgKFVTRVIzMi41MzUpCisgKi8KK0JPT0wzMiBTdWJ0cmFjdFJlY3QzMiggTFBSRUNUMzIgZGVzdCwgY29uc3QgUkVDVDMyICpzcmMxLCBjb25zdCBSRUNUMzIgKnNyYzIgKQoreworICAgIFJFQ1QzMiB0bXA7CisKKyAgICBpZiAoSXNSZWN0RW1wdHkzMiggc3JjMSApKQorICAgIHsKKwlTZXRSZWN0RW1wdHkzMiggZGVzdCApOworCXJldHVybiBGQUxTRTsKKyAgICB9CisgICAgKmRlc3QgPSAqc3JjMTsKKyAgICBpZiAoSW50ZXJzZWN0UmVjdDMyKCAmdG1wLCBzcmMxLCBzcmMyICkpCisgICAgeworCWlmIChFcXVhbFJlY3QzMiggJnRtcCwgZGVzdCApKQorCXsKKwkgICAgU2V0UmVjdEVtcHR5MzIoIGRlc3QgKTsKKwkgICAgcmV0dXJuIEZBTFNFOworCX0KKwlpZiAoKHRtcC50b3AgPT0gZGVzdC0+dG9wKSAmJiAodG1wLmJvdHRvbSA9PSBkZXN0LT5ib3R0b20pKQorCXsKKwkgICAgaWYgKHRtcC5sZWZ0ID09IGRlc3QtPmxlZnQpIGRlc3QtPmxlZnQgPSB0bXAucmlnaHQ7CisJICAgIGVsc2UgaWYgKHRtcC5yaWdodCA9PSBkZXN0LT5yaWdodCkgZGVzdC0+cmlnaHQgPSB0bXAubGVmdDsKKwl9CisJZWxzZSBpZiAoKHRtcC5sZWZ0ID09IGRlc3QtPmxlZnQpICYmICh0bXAucmlnaHQgPT0gZGVzdC0+cmlnaHQpKQorCXsKKwkgICAgaWYgKHRtcC50b3AgPT0gZGVzdC0+dG9wKSBkZXN0LT50b3AgPSB0bXAuYm90dG9tOworCSAgICBlbHNlIGlmICh0bXAuYm90dG9tID09IGRlc3QtPmJvdHRvbSkgZGVzdC0+Ym90dG9tID0gdG1wLnRvcDsKKwl9CisgICAgfQorICAgIHJldHVybiBUUlVFOworfQpkaWZmIC0tZ2l0IGEvbWlzYy9yZWdpc3RyeS5jIGIvbWlzYy9yZWdpc3RyeS5jCmluZGV4IDdkZWU4MTAuLmI5Yzc4MWIgMTAwNjQ0Ci0tLSBhL21pc2MvcmVnaXN0cnkuYworKysgYi9taXNjL3JlZ2lzdHJ5LmMKQEAgLTcsNiArNyw3IEBACiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxtYWxsb2MuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxjdHlwZS5oPgogI2luY2x1ZGUgPGVycm5vLmg+CkBAIC0yNCwxNyArMjUsMjIgQEAKICNpbmNsdWRlICJ4bWFsbG9jLmgiCiAjaW5jbHVkZSAid2lucmVnLmgiCiAKKyNkZWZpbmUgTUFLRV9EV09SRCh4LHkpICgoRFdPUkQpTUFLRUxPTkcoeCx5KSkKKwogLyogRklYTUU6IGZvbGxvd2luZyBkZWZpbmVzIHNob3VsZCBiZSBjb25maWd1cmVkIGdsb2JhbCAuLi4gKi8KIAogLyogTk9URTogZG8gbm90IGFwcGVuZCBhIC8uIGxpbnV4JyBta2RpcigpIFdJTEwgRkFJTCBpZiB5b3UgZG8gdGhhdCAqLwogI2RlZmluZSBXSU5FX1BSRUZJWAkJCSIvLndpbmUiCi0jZGVmaW5lIFNBVkVfQ1VSUkVOVF9VU0VSX0RFRkFVTFQJIi91c3IvbG9jYWwvZXRjL3dpbmUudXNlcnJlZyIKLQkvKiByZWxhdGl2ZSBpbiB+dXNlci8ud2luZS8gKi8KLSNkZWZpbmUgU0FWRV9DVVJSRU5UX1VTRVIJCSJ1c2VyLnJlZyIKKyNkZWZpbmUgU0FWRV9VU0VSU19ERUZBVUxUCQkiL3Vzci9sb2NhbC9ldGMvd2luZS51c2VycmVnIgogI2RlZmluZSBTQVZFX0xPQ0FMX01BQ0hJTkVfREVGQVVMVAkiL3Vzci9sb2NhbC9ldGMvd2luZS5zeXN0ZW1yZWciCi0JLyogcmVsYXRpdmUgaW4gfnVzZXIvLndpbmUvICovCisKKy8qIHJlbGF0aXZlIGluIH51c2VyLy53aW5lLyA6ICovCisjZGVmaW5lIFNBVkVfQ1VSUkVOVF9VU0VSCQkidXNlci5yZWciCiAjZGVmaW5lIFNBVkVfTE9DQUxfTUFDSElORQkJInN5c3RlbS5yZWciCiAKKyNkZWZpbmUgS0VZX1JFR0lTVFJZCSJTb2Z0d2FyZVxcVGhlIFdJTkUgdGVhbVxcV0lORVxcUmVnaXN0cnkiCisjZGVmaW5lIFZBTF9TQVZFVVBEQVRFRAkiU2F2ZU9ubHlVcGRhdGVkS2V5cyIKKwogc3RhdGljIEtFWVNUUlVDVAkqa2V5X2NsYXNzZXNfcm9vdD1OVUxMOwkvKiB3aW5kb3dzIDMuMSBnbG9iYWwgdmFsdWVzICovCiBzdGF0aWMgS0VZU1RSVUNUCSprZXlfY3VycmVudF91c2VyPU5VTEw7CS8qIHVzZXIgc3BlY2lmaWMgdmFsdWVzICovCiBzdGF0aWMgS0VZU1RSVUNUCSprZXlfbG9jYWxfbWFjaGluZT1OVUxMOy8qIG1hY2hpbmUgc3BlY2lmaWMgdmFsdWVzICovCkBAIC0yMDUsNyArMjExLDcgQEAKIAl4eC0+a2V5bmFtZT0gc3RyZHVwQTJXKCI8c2hvdWxkX25vdF9hcHBlYXJfYW55d2hlcmU+Iik7CiAKIAlBRERfUk9PVF9LRVkoa2V5X2xvY2FsX21hY2hpbmUpOwotCWlmIChSZWdDcmVhdGVLZXkoSEtFWV9MT0NBTF9NQUNISU5FLCJcXFNPRlRXQVJFXFxDbGFzc2VzIiwmY2xfcl9oa2V5KSE9RVJST1JfU1VDQ0VTUykgeworCWlmIChSZWdDcmVhdGVLZXkxNihIS0VZX0xPQ0FMX01BQ0hJTkUsIlxcU09GVFdBUkVcXENsYXNzZXMiLCZjbF9yX2hrZXkpIT1FUlJPUl9TVUNDRVNTKSB7CiAJCWZwcmludGYoc3RkZXJyLCJjb3VsZG4ndCBjcmVhdGUgSEtFWV9MT0NBTF9NQUNISU5FXFxTT0ZUV0FSRVxcQ2xhc3Nlcy4gVGhpcyBpcyBpbXBvc3NpYmxlLlxuIik7CiAJCWV4aXQoMSk7CiAJfQpAQCAtMjIwLDEzICsyMjYsMTMgQEAKIAl3aGlsZSAocHdkPWdldHB3ZW50KCkpIHsKIAkJaWYgKHB3ZC0+cHdfbmFtZSA9PSBOVUxMKQogCQkJY29udGludWU7Ci0JCVJlZ0NyZWF0ZUtleShIS0VZX1VTRVJTLHB3ZC0+cHdfbmFtZSwmY191X2hrZXkpOworCQlSZWdDcmVhdGVLZXkxNihIS0VZX1VTRVJTLHB3ZC0+cHdfbmFtZSwmY191X2hrZXkpOwogCQlSZWdDbG9zZUtleShjX3VfaGtleSk7CiAJfQogI2VuZGlmCiAJcHdkPWdldHB3dWlkKGdldHVpZCgpKTsKIAlpZiAocHdkICYmIHB3ZC0+cHdfbmFtZSkgewotCQlSZWdDcmVhdGVLZXkoSEtFWV9VU0VSUyxwd2QtPnB3X25hbWUsJmNfdV9oa2V5KTsKKwkJUmVnQ3JlYXRlS2V5MTYoSEtFWV9VU0VSUyxwd2QtPnB3X25hbWUsJmNfdV9oa2V5KTsKIAkJa2V5X2N1cnJlbnRfdXNlciA9IGxvb2t1cF9oa2V5KGNfdV9oa2V5KTsKIAl9IGVsc2UgewogCQlBRERfUk9PVF9LRVkoa2V5X2N1cnJlbnRfdXNlcik7CkBAIC0yNjIsMTkgKzI2OCwzNyBAQAogICoJaW50CiAgKiAKICAqIEZJWE1FOiBkb2Vzbid0IHNhdmUgJ2NsYXNzJyAod2hhdCBkb2VzIGl0IG1lYW4gYW55d2F5PyksIG5vciBmbGFncy4KKyAqCisgKiBbSEtFWV9DVVJSRU5UX1VTRVJcXFNvZnR3YXJlXFxUaGUgV0lORSB0ZWFtXFxXSU5FXFxSZWdpc3RyeV0KKyAqIFNhdmVPbmx5VXBkYXRlZEtleXM9eWVzCiAgKi8KK3N0YXRpYyBpbnQKK19zYXZlX2NoZWNrX3RhaW50ZWQoTFBLRVlTVFJVQ1QgbHBrZXkpIHsKKwlpbnQJCXRhaW50ZWQ7CisKKwlpZiAoIWxwa2V5KQorCQlyZXR1cm4gMDsKKwlpZiAobHBrZXktPmZsYWdzICYgUkVHX09QVElPTl9UQUlOVEVEKQorCQl0YWludGVkID0gMTsKKwllbHNlCisJCXRhaW50ZWQgPSAwOworCXdoaWxlIChscGtleSkgeworCQlpZiAoX3NhdmVfY2hlY2tfdGFpbnRlZChscGtleS0+bmV4dHN1YikpIHsKKwkJCWxwa2V5LT5mbGFncyB8PSBSRUdfT1BUSU9OX1RBSU5URUQ7CisJCQl0YWludGVkID0gMTsKKwkJfQorCQlscGtleQk9IGxwa2V5LT5uZXh0OworCX0KKwlyZXR1cm4gdGFpbnRlZDsKK30KIAogc3RhdGljIHZvaWQKLV93cml0ZV9VU1RSSU5HKEZJTEUgKkYsTFBXU1RSIHdzdHIsaW50IGVzY2FwZWVxKSB7Citfc2F2ZV9VU1RSSU5HKEZJTEUgKkYsTFBXU1RSIHdzdHIsaW50IGVzY2FwZWVxKSB7CiAJTFBXU1RSCXM7CiAJaW50CWRvZXNjYXBlOwogCi0JaWYgKHdzdHI9PU5VTEwpIHsKLQkJLyogRklYTUU6IE5VTEwgZXF1YWxzIGVtcHR5IHN0cmluZy4uLiBJIGhvcGUKLQkJICogdGhlIGVtcHR5IHN0cmluZyBpc24ndCBhIHZhbGlkIHZhbHVlbmFtZQotCQkgKi8KKwlpZiAod3N0cj09TlVMTCkKIAkJcmV0dXJuOwotCX0KIAlzPXdzdHI7CiAJd2hpbGUgKCpzKSB7CiAJCWRvZXNjYXBlPTA7CkBAIC0yOTUsMzQgKzMxOSwzNiBAQAogfQogCiBzdGF0aWMgaW50Ci1fZG9fc2F2ZV9zdWJrZXkoRklMRSAqRixMUEtFWVNUUlVDVCBscGtleSxpbnQgbGV2ZWwpIHsKK19zYXZlc3Via2V5KEZJTEUgKkYsTFBLRVlTVFJVQ1QgbHBrZXksaW50IGxldmVsLGludCBhbGwpIHsKIAlMUEtFWVNUUlVDVAlscHhrZXk7CiAJaW50CQlpLHRhYnMsajsKIAogCWxweGtleQk9IGxwa2V5OwogCXdoaWxlIChscHhrZXkpIHsKLQkJaWYgKCEobHB4a2V5LT5mbGFncyAmIFJFR19PUFRJT05fVk9MQVRJTEUpKSB7CisJCWlmICgJIShscHhrZXktPmZsYWdzICYgUkVHX09QVElPTl9WT0xBVElMRSkgJiYKKwkJCShhbGwgfHwgKGxweGtleS0+ZmxhZ3MgJiBSRUdfT1BUSU9OX1RBSU5URUQpKQorCQkpIHsKIAkJCWZvciAodGFicz1sZXZlbDt0YWJzLS07KQogCQkJCWZwdXRjKCdcdCcsRik7Ci0JCQlfd3JpdGVfVVNUUklORyhGLGxweGtleS0+a2V5bmFtZSwxKTsKKwkJCV9zYXZlX1VTVFJJTkcoRixscHhrZXktPmtleW5hbWUsMSk7CiAJCQlmcHV0cygiXG4iLEYpOwogCQkJZm9yIChpPTA7aTxscHhrZXktPm5yb2Z2YWx1ZXM7aSsrKSB7CiAJCQkJTFBLRVlWQUxVRQl2YWw9bHB4a2V5LT52YWx1ZXMraTsKIAogCQkJCWZvciAodGFicz1sZXZlbCsxO3RhYnMtLTspCiAJCQkJCWZwdXRjKCdcdCcsRik7Ci0JCQkJX3dyaXRlX1VTVFJJTkcoRix2YWwtPm5hbWUsMCk7CisJCQkJX3NhdmVfVVNUUklORyhGLHZhbC0+bmFtZSwwKTsKIAkJCQlmcHV0YygnPScsRik7CiAJCQkJZnByaW50ZihGLCIlbGQsJWxkLCIsdmFsLT50eXBlLHZhbC0+bGFzdG1vZGlmaWVkKTsKIAkJCQlpZiAoKDE8PHZhbC0+dHlwZSkgJiBVTklDT05WTUFTSykKLQkJCQkJX3dyaXRlX1VTVFJJTkcoRiwoTFBXU1RSKXZhbC0+ZGF0YSwwKTsKKwkJCQkJX3NhdmVfVVNUUklORyhGLChMUFdTVFIpdmFsLT5kYXRhLDApOwogCQkJCWVsc2UKIAkJCQkJZm9yIChqPTA7ajx2YWwtPmxlbjtqKyspCiAJCQkJCQlmcHJpbnRmKEYsIiUwMngiLCooKHVuc2lnbmVkIGNoYXIqKXZhbC0+ZGF0YStqKSk7CiAJCQkJZnB1dHMoIlxuIixGKTsKIAkJCX0KIAkJCS8qIGRlc2NlbmQgcmVjdXJzaXZlbHkgKi8KLQkJCWlmICghX2RvX3NhdmVfc3Via2V5KEYsbHB4a2V5LT5uZXh0c3ViLGxldmVsKzEpKQorCQkJaWYgKCFfc2F2ZXN1YmtleShGLGxweGtleS0+bmV4dHN1YixsZXZlbCsxLGFsbCkpCiAJCQkJcmV0dXJuIDA7CiAJCX0KIAkJbHB4a2V5PWxweGtleS0+bmV4dDsKQEAgLTMzMSwyNiArMzU3LDI3IEBACiB9CiAKIHN0YXRpYyBpbnQKLV9kb19zYXZlc3VicmVnKEZJTEUgKkYsTFBLRVlTVFJVQ1QgbHBrZXkpIHsKK19zYXZlc3VicmVnKEZJTEUgKkYsTFBLRVlTVFJVQ1QgbHBrZXksaW50IGFsbCkgewogCWZwcmludGYoRiwiV0lORSBSRUdJU1RSWSBWZXJzaW9uICVkXG4iLFJFR0lTVFJZX1NBVkVfVkVSU0lPTik7Ci0JcmV0dXJuIF9kb19zYXZlX3N1YmtleShGLGxwa2V5LT5uZXh0c3ViLDApOworCV9zYXZlX2NoZWNrX3RhaW50ZWQobHBrZXktPm5leHRzdWIpOworCXJldHVybiBfc2F2ZXN1YmtleShGLGxwa2V5LT5uZXh0c3ViLDAsYWxsKTsKIH0KIAogc3RhdGljIHZvaWQKLV9TYXZlU3ViUmVnKExQS0VZU1RSVUNUIGxwa2V5LGNoYXIgKmZuKSB7Citfc2F2ZXJlZyhMUEtFWVNUUlVDVCBscGtleSxjaGFyICpmbixpbnQgYWxsKSB7CiAJRklMRQkqRjsKIAogCUY9Zm9wZW4oZm4sInciKTsKIAlpZiAoRj09TlVMTCkgewotCQlmcHJpbnRmKHN0ZGRlYixfX0ZJTEVfXyI6X1NhdmVTdWJSZWc6Q291bGRuJ3Qgb3BlbiAlcyBmb3Igd3JpdGluZzogJXNcbiIsCisJCWZwcmludGYoc3RkZGViLF9fRklMRV9fIjpfc2F2ZXJlZzpDb3VsZG4ndCBvcGVuICVzIGZvciB3cml0aW5nOiAlc1xuIiwKIAkJCWZuLHN0cmVycm9yKGVycm5vKQogCQkpOwogCQlyZXR1cm47CiAJfQotCWlmICghX2RvX3NhdmVzdWJyZWcoRixscGtleSkpIHsKKwlpZiAoIV9zYXZlc3VicmVnKEYsbHBrZXksYWxsKSkgewogCQlmY2xvc2UoRik7CiAJCXVubGluayhmbik7Ci0JCWZwcmludGYoc3RkZGViLF9fRklMRV9fIjpfU2F2ZVN1YlJlZzpGYWlsZWQgdG8gc2F2ZSBrZXlzLCBwZXJoYXBzIG5vIG1vcmUgZGlza3NwYWNlIGZvciAlcz9cbiIsZm4pOworCQlmcHJpbnRmKHN0ZGRlYixfX0ZJTEVfXyI6X3NhdmVyZWc6RmFpbGVkIHRvIHNhdmUga2V5cywgcGVyaGFwcyBubyBtb3JlIGRpc2tzcGFjZSBmb3IgJXM/XG4iLGZuKTsKIAkJcmV0dXJuOwogCX0KIAlmY2xvc2UoRik7CkBAIC0zNjAsMzQgKzM4NywxMjMgQEAKIFNIRUxMX1NhdmVSZWdpc3RyeSgpIHsKIAljaGFyCSpmbjsKIAlzdHJ1Y3QJcGFzc3dkCSpwd2Q7CisJY2hhcglidWZbNF07CisJSEtFWQloa2V5OworCWludAlhbGw7CiAKKwlhbGw9MDsKKwlpZiAoUmVnT3BlbktleTE2KEhLRVlfQ1VSUkVOVF9VU0VSLEtFWV9SRUdJU1RSWSwmaGtleSkhPUVSUk9SX1NVQ0NFU1MpIHsKKwkJc3RyY3B5KGJ1ZiwieWVzIik7CisJfSBlbHNlIHsKKwkJRFdPUkQgbGVuLGp1bmssdHlwZTsKKworCQlsZW49NDsKKwkJaWYgKAkoRVJST1JfU1VDQ0VTUyE9UmVnUXVlcnlWYWx1ZUV4MzJBKAorCQkJCWhrZXksCisJCQkJVkFMX1NBVkVVUERBVEVELAorCQkJCSZqdW5rLAorCQkJCSZ0eXBlLAorCQkJCWJ1ZiwKKwkJCQkmbGVuCisJCQkpKXx8ICh0eXBlIT1SRUdfU1opCisJCSkKKwkJCXN0cmNweShidWYsInllcyIpOworCQlSZWdDbG9zZUtleShoa2V5KTsKKwl9CisJaWYgKHN0cmNhc2VjbXAoYnVmLCJ5ZXMiKSkKKwkJYWxsPTE7CiAJcHdkPWdldHB3dWlkKGdldHVpZCgpKTsKIAlpZiAocHdkIT1OVUxMICYmIHB3ZC0+cHdfZGlyIT1OVUxMKSB7Ci0JCWZuPShjaGFyKil4bWFsbG9jKHN0cmxlbihwd2QtPnB3X2Rpcikrc3RybGVuKFdJTkVfUFJFRklYKStzdHJsZW4oU0FWRV9DVVJSRU5UX1VTRVIpKzIpOworCQlmbj0oY2hhciopeG1hbGxvYyhzdHJsZW4ocHdkLT5wd19kaXIpK3N0cmxlbihXSU5FX1BSRUZJWCkrc3RybGVuKFNBVkVfVVNFUlNfREVGQVVMVCkrMik7CiAJCXN0cmNweShmbixwd2QtPnB3X2Rpcik7CiAJCXN0cmNhdChmbixXSU5FX1BSRUZJWCk7CiAJCS8qIGNyZWF0ZSB0aGUgZGlyZWN0b3J5LiBkb24ndCBjYXJlIGFib3V0IGVycm9yY29kZXMuICovCiAJCW1rZGlyKGZuLDA3NTUpOyAvKiBkcnd4ci14ci14ICovCiAJCXN0cmNhdChmbiwiLyJTQVZFX0NVUlJFTlRfVVNFUik7Ci0JCV9TYXZlU3ViUmVnKGtleV9jdXJyZW50X3VzZXIsZm4pOworCQlfc2F2ZXJlZyhrZXlfY3VycmVudF91c2VyLGZuLGFsbCk7CiAJCWZyZWUoZm4pOwogCQlmbj0oY2hhciopeG1hbGxvYyhzdHJsZW4ocHdkLT5wd19kaXIpK3N0cmxlbihXSU5FX1BSRUZJWCkrc3RybGVuKFNBVkVfTE9DQUxfTUFDSElORSkrMik7CiAJCXN0cmNweShmbixwd2QtPnB3X2Rpcik7CiAJCXN0cmNhdChmbixXSU5FX1BSRUZJWCIvIlNBVkVfTE9DQUxfTUFDSElORSk7Ci0JCV9TYXZlU3ViUmVnKGtleV9sb2NhbF9tYWNoaW5lLGZuKTsKKwkJX3NhdmVyZWcoa2V5X2xvY2FsX21hY2hpbmUsZm4sYWxsKTsKIAkJZnJlZShmbik7Ci0JfSBlbHNlIHsKKwl9IGVsc2UKIAkJZnByaW50ZihzdGRlcnIsIlNIRUxMX1NhdmVSZWdpc3RyeTpmYWlsZWQgdG8gZ2V0IGhvbWVkaXJlY3Rvcnkgb2YgVUlEICVkLlxuIixnZXR1aWQoKSk7Ci0JfQogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqIExPQUQgUmVnaXN0cnkgRnVuY3Rpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorc3RhdGljIExQS0VZU1RSVUNUCitfZmluZF9vcl9hZGRfa2V5KExQS0VZU1RSVUNUIGxwa2V5LExQV1NUUiBrZXluYW1lKSB7CisJTFBLRVlTVFJVQ1QJbHB4a2V5LCpscGxwa2V5OworCisJbHBscGtleT0gJihscGtleS0+bmV4dHN1Yik7CisJbHB4a2V5CT0gKmxwbHBrZXk7CisJd2hpbGUgKGxweGtleSkgeworCQlpZiAoIXN0cmNtcFcobHB4a2V5LT5rZXluYW1lLGtleW5hbWUpKQorCQkJYnJlYWs7CisJCWxwbHBrZXkJPSAmKGxweGtleS0+bmV4dCk7CisJCWxweGtleQk9ICpscGxwa2V5OworCX0KKwlpZiAobHB4a2V5PT1OVUxMKSB7CisJCSpscGxwa2V5ID0gKExQS0VZU1RSVUNUKXhtYWxsb2Moc2l6ZW9mKEtFWVNUUlVDVCkpOworCQlscHhrZXkJPSAqbHBscGtleTsKKwkJbWVtc2V0KGxweGtleSwnXDAnLHNpemVvZihLRVlTVFJVQ1QpKTsKKwkJbHB4a2V5LT5rZXluYW1lCT0ga2V5bmFtZTsKKwl9IGVsc2UKKwkJZnJlZShrZXluYW1lKTsKKwlyZXR1cm4gbHB4a2V5OworfQorCitzdGF0aWMgdm9pZAorX2ZpbmRfb3JfYWRkX3ZhbHVlKAorCUxQS0VZU1RSVUNUIGxwa2V5LExQV1NUUiBuYW1lLERXT1JEIHR5cGUsTFBCWVRFIGRhdGEsRFdPUkQgbGVuLAorCURXT1JEIGxhc3Rtb2RpZmllZAorKSB7CisJTFBLRVlWQUxVRQl2YWw9TlVMTDsKKwlpbnQJCWk7CisKKwlmb3IgKGk9MDtpPGxwa2V5LT5ucm9mdmFsdWVzO2krKykgeworCQl2YWw9bHBrZXktPnZhbHVlcytpOworCQlpZiAobmFtZT09TlVMTCkgeworCQkJaWYgKHZhbC0+bmFtZT09TlVMTCkKKwkJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCWlmICgJdmFsLT5uYW1lIT1OVUxMICYmIAorCQkJCSFzdHJjbXBXKHZhbC0+bmFtZSxuYW1lKQorCQkJKQorCQkJCWJyZWFrOworCQl9CisJfQorCWlmIChpPT1scGtleS0+bnJvZnZhbHVlcykgeworCQlscGtleS0+dmFsdWVzID0geHJlYWxsb2MoCisJCQlscGtleS0+dmFsdWVzLAorCQkJKCsrbHBrZXktPm5yb2Z2YWx1ZXMpKnNpemVvZihLRVlWQUxVRSkKKwkJKTsKKwkJdmFsPWxwa2V5LT52YWx1ZXMraTsKKwkJbWVtc2V0KHZhbCwnXDAnLHNpemVvZihLRVlWQUxVRSkpOworCQl2YWwtPm5hbWUgPSBuYW1lOworCX0gZWxzZSB7CisJCWlmIChuYW1lKQorCQkJZnJlZShuYW1lKTsKKwl9CisJaWYgKHZhbC0+bGFzdG1vZGlmaWVkPGxhc3Rtb2RpZmllZCkgeworCQl2YWwtPmxhc3Rtb2RpZmllZD1sYXN0bW9kaWZpZWQ7CisJCXZhbC0+dHlwZSA9IHR5cGU7CisJCXZhbC0+bGVuICA9IGxlbjsKKwkJaWYgKHZhbC0+ZGF0YSkgCisJCQlmcmVlKHZhbC0+ZGF0YSk7CisJCXZhbC0+ZGF0YSA9IGRhdGE7CisJfSBlbHNlCisJCWZyZWUoZGF0YSk7Cit9CisKKwogLyogcmVhZHMgYSBsaW5lIGluY2x1ZGluZyBkeW5hbWljYWxseSBlbmxhcmdpbmcgdGhlIHJlYWRidWZmZXIgYW5kIHRocm93aW5nCiAgKiBhd2F5IGNvbW1lbnRzCiAgKi8KIHN0YXRpYyBpbnQgCi1fcmVhZF9saW5lKEZJTEUgKkYsY2hhciAqKmJ1ZixpbnQgKmxlbikgeworX3dpbmVfcmVhZF9saW5lKEZJTEUgKkYsY2hhciAqKmJ1ZixpbnQgKmxlbikgewogCWNoYXIJKnMsKmN1cnJlYWQ7CiAJaW50CW15bGVuLGN1cm9mZjsKIApAQCAtNDI5LDcgKzU0NSw3IEBACiAgKiBhbmQgcmV0dXJucyB0aGUgcG9zaXRpb24gZXhhY3RseSBhZnRlciB0aGF0IHN0cmluZwogICovCiBzdGF0aWMgY2hhcioKLV9yZWFkX1VTVFJJTkcoY2hhciAqYnVmLExQV1NUUiAqc3RyKSB7Citfd2luZV9yZWFkX1VTVFJJTkcoY2hhciAqYnVmLExQV1NUUiAqc3RyKSB7CiAJY2hhcgkqczsKIAlMUFdTVFIJd3M7CiAKQEAgLTQ1Myw3ICs1NjksNyBAQAogCQkJCWNvbnRpbnVlOwogCQkJfQogCQkJaWYgKCpzIT0ndScpIHsKLQkJCQlmcHJpbnRmKHN0ZGVyciwiX3JlYWRfVVNUUklORzpOb24gdW5pY29kZSBlc2NhcGUgc2VxdWVuY2UgXFwlYyBmb3VuZCBpbiB8JXN8XG4iLCpzLGJ1Zik7CisJCQkJZnByaW50ZihzdGRlcnIsIl93aW5lX3JlYWRfVVNUUklORzpOb24gdW5pY29kZSBlc2NhcGUgc2VxdWVuY2UgXFwlYyBmb3VuZCBpbiB8JXN8XG4iLCpzLGJ1Zik7CiAJCQkJKndzKys9J1xcJzsKIAkJCQkqd3MrKz0qcysrOwogCQkJfSBlbHNlIHsKQEAgLTQ2Myw3ICs1NzksNyBAQAogCQkJCXMrKzsKIAkJCQltZW1jcHkoeGJ1ZixzLDQpO3hidWZbNF09J1wwJzsKIAkJCQlpZiAoIXNzY2FuZih4YnVmLCIleCIsJndjKSkKLQkJCQkJZnByaW50ZihzdGRlcnIsIl9yZWFkX1VTVFJJTkc6c3RyYW5nZSBlc2NhcGUgc2VxdWVuY2UgJXMgZm91bmQgaW4gfCVzfFxuIix4YnVmLGJ1Zik7CisJCQkJCWZwcmludGYoc3RkZXJyLCJfd2luZV9yZWFkX1VTVFJJTkc6c3RyYW5nZSBlc2NhcGUgc2VxdWVuY2UgJXMgZm91bmQgaW4gfCVzfFxuIix4YnVmLGJ1Zik7CiAJCQkJcys9NDsKIAkJCQkqd3MrKwk9KHVuc2lnbmVkIHNob3J0KXdjOwogCQkJfQpAQCAtNDc3LDEyICs1OTMsMTYgQEAKIH0KIAogc3RhdGljIGludAotX2RvX2xvYWRfc3Via2V5KEZJTEUgKkYsTFBLRVlTVFJVQ1QgbHBrZXksaW50IGxldmVsLGNoYXIgKipidWYsaW50ICpidWZsZW4pIHsKLQlMUEtFWVNUUlVDVAlscHhrZXksKmxwbHBrZXk7Citfd2luZV9sb2Fkc3Via2V5KAorCUZJTEUgKkYsTFBLRVlTVFJVQ1QgbHBrZXksaW50IGxldmVsLGNoYXIgKipidWYsaW50ICpidWZsZW4saW50IG9wdGZsYWcKKykgeworCUxQS0VZU1RSVUNUCWxweGtleTsKIAlpbnQJCWk7CiAJY2hhcgkJKnM7CiAJTFBXU1RSCQluYW1lOwogCisJbHBrZXktPmZsYWdzIHw9IG9wdGZsYWc7CisKIAkvKiBnb29kLiB3ZSBhbHJlYWR5IGdvdCBhIGxpbmUgaGVyZSAuLi4gc28gcGFyc2UgaXQgKi8KIAlscHhrZXkJPSBOVUxMOwogCXdoaWxlICgxKSB7CkBAIC00OTMsOTQgKzYxMyw0MiBAQAogCQl9CiAJCWlmIChpPmxldmVsKSB7CiAJCQlpZiAobHB4a2V5PT1OVUxMKSB7Ci0JCQkJZnByaW50ZihzdGRlcnIsIl9kb19sb2FkX3N1YmtleTpHb3QgYSBzdWJoaWVyYXJjaHkgd2l0aG91dCByZXNwLiBrZXk/XG4iKTsKKwkJCQlmcHJpbnRmKHN0ZGVyciwiX2xvYWRfc3Via2V5OkdvdCBhIHN1YmhpZXJhcmNoeSB3aXRob3V0IHJlc3AuIGtleT9cbiIpOwogCQkJCXJldHVybiAwOwogCQkJfQotCQkJX2RvX2xvYWRfc3Via2V5KEYsbHB4a2V5LGxldmVsKzEsYnVmLGJ1Zmxlbik7CisJCQlfd2luZV9sb2Fkc3Via2V5KEYsbHB4a2V5LGxldmVsKzEsYnVmLGJ1ZmxlbixvcHRmbGFnKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAJCS8qIGxldCB0aGUgY2FsbGVyIGhhbmRsZSB0aGlzIGxpbmUgKi8KIAkJaWYgKGk8bGV2ZWwgfHwgKipidWY9PSdcMCcpCiAJCQlyZXR1cm4gMTsKLQkJLyogZ29vZC4gdGhpcyBpcyBvbmUgbGluZSBmb3IgdXMuCi0JCSAqIGl0IGNhbiBiZTogYSB2YWx1ZSBvciBhIGtleW5hbWUuIFBhcnNlIHRoZSBuYW1lIGZpcnN0Ci0JCSAqLwotCQlzPV9yZWFkX1VTVFJJTkcocywmbmFtZSk7CisKKwkJLyogaXQgY2FuIGJlOiBhIHZhbHVlIG9yIGEga2V5bmFtZS4gUGFyc2UgdGhlIG5hbWUgZmlyc3QgKi8KKwkJcz1fd2luZV9yZWFkX1VTVFJJTkcocywmbmFtZSk7CiAKIAkJLyogc3dpdGNoKCkgZGVmYXVsdDogaGFjayB0byBhdm9pZCBnb3RvcyAqLwogCQlzd2l0Y2ggKDApIHsKIAkJZGVmYXVsdDoKIAkJCWlmICgqcz09J1wwJykgewotCQkJCS8qIHRoaXMgaXMgYSBuZXcga2V5IAotCQkJCSAqIGxvb2sgZm9yIHRoZSBuYW1lIGluIHRoZSBhbHJlYWR5IGV4aXN0aW5nIGtleXMKLQkJCQkgKiBvbiB0aGlzIGxldmVsLgotCQkJCSAqLwotCQkJCSBscGxwa2V5PSAmKGxwa2V5LT5uZXh0c3ViKTsKLQkJCQkgbHB4a2V5CT0gKmxwbHBrZXk7Ci0JCQkJIHdoaWxlIChscHhrZXkpIHsKLQkJCQkJaWYgKCFzdHJjbXBXKGxweGtleS0+a2V5bmFtZSxuYW1lKSkKLQkJCQkJCWJyZWFrOwotCQkJCQlscGxwa2V5CT0gJihscHhrZXktPm5leHQpOwotCQkJCQlscHhrZXkJPSAqbHBscGtleTsKLQkJCQkgfQotCQkJCSBpZiAobHB4a2V5PT1OVUxMKSB7Ci0JCQkJCS8qIHdlIGhhdmUgbm8ga2V5IHdpdGggdGhhdCBuYW1lIHlldC4gYWxsb2NhdGUKLQkJCQkJICogaXQuCi0JCQkJCSAqLwotCQkJCQkqbHBscGtleSA9IChMUEtFWVNUUlVDVCl4bWFsbG9jKHNpemVvZihLRVlTVFJVQ1QpKTsKLQkJCQkJbHB4a2V5CT0gKmxwbHBrZXk7Ci0JCQkJCW1lbXNldChscHhrZXksJ1wwJyxzaXplb2YoS0VZU1RSVUNUKSk7Ci0JCQkJCWxweGtleS0+a2V5bmFtZQk9IG5hbWU7Ci0JCQkJIH0gZWxzZSB7Ci0JCQkJCS8qIGFscmVhZHkgZ290IGl0LiB3ZSBqdXN0IHJlbWVtYmVyIGl0IGluIAotCQkJCQkgKiAnbHB4a2V5JwotCQkJCQkgKi8KLQkJCQkJZnJlZShuYW1lKTsKLQkJCQkgfQorCQkJCWxweGtleT1fZmluZF9vcl9hZGRfa2V5KGxwa2V5LG5hbWUpOwogCQkJfSBlbHNlIHsKLQkJCQlMUEtFWVZBTFVFCXZhbD1OVUxMOwogCQkJCUxQQllURQkJZGF0YTsKIAkJCQlpbnQJCWxlbixsYXN0bW9kaWZpZWQsdHlwZTsKIAogCQkJCWlmICgqcyE9Jz0nKSB7Ci0JCQkJCWZwcmludGYoc3RkZXJyLCJfZG9fbG9hZF9zdWJrZXk6dW5leHBlY3RlZCBjaGFyYWN0ZXI6ICVjXG4iLCpzKTsKKwkJCQkJZnByaW50ZihzdGRlcnIsIl93aW5lX2xvYWRfc3Via2V5OnVuZXhwZWN0ZWQgY2hhcmFjdGVyOiAlY1xuIiwqcyk7CiAJCQkJCWJyZWFrOwogCQkJCX0KLQkJCQkvKiBnb29kLiB0aGlzIGxvb2tzIGxpa2UgYSB2YWx1ZSB0byBtZSAqLwogCQkJCXMrKzsKLQkJCQlmb3IgKGk9MDtpPGxwa2V5LT5ucm9mdmFsdWVzO2krKykgewotCQkJCQl2YWw9bHBrZXktPnZhbHVlcytpOwotCQkJCQlpZiAobmFtZT09TlVMTCkgewotCQkJCQkJaWYgKHZhbC0+bmFtZT09TlVMTCkKLQkJCQkJCQlicmVhazsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWlmICgJdmFsLT5uYW1lIT1OVUxMICYmIAotCQkJCQkJCSFzdHJjbXBXKHZhbC0+bmFtZSxuYW1lKQotCQkJCQkJKQotCQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChpPT1scGtleS0+bnJvZnZhbHVlcykgewotCQkJCQlscGtleS0+dmFsdWVzID0geHJlYWxsb2MoCi0JCQkJCQlscGtleS0+dmFsdWVzLAotCQkJCQkJKCsrbHBrZXktPm5yb2Z2YWx1ZXMpKnNpemVvZihLRVlWQUxVRSkKLQkJCQkJKTsKLQkJCQkJdmFsPWxwa2V5LT52YWx1ZXMraTsKLQkJCQkJbWVtc2V0KHZhbCwnXDAnLHNpemVvZihLRVlWQUxVRSkpOwotCQkJCQl2YWwtPm5hbWUgPSBuYW1lOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8qIHZhbHVlIGFscmVhZHkgZXhpc3RzLCBmcmVlIG5hbWUgKi8KLQkJCQkJZnJlZShuYW1lKTsKLQkJCQl9CiAJCQkJaWYgKDIhPXNzY2FuZihzLCIlZCwlZCwiLCZ0eXBlLCZsYXN0bW9kaWZpZWQpKSB7Ci0JCQkJCWZwcmludGYoc3RkZXJyLCJfZG9fbG9hZF9zdWJrZXk6IGhhdmVuJ3QgdW5kZXJzdG9vZCBwb3NzaWJsZSB2YWx1ZSBpbiB8JXN8LCBza2lwcGluZy5cbiIsKmJ1Zik7CisJCQkJCWZwcmludGYoc3RkZXJyLCJfd2luZV9sb2FkX3N1YmtleTogaGF2ZW4ndCB1bmRlcnN0b29kIHBvc3NpYmxlIHZhbHVlIGluIHwlc3wsIHNraXBwaW5nLlxuIiwqYnVmKTsKIAkJCQkJYnJlYWs7CiAJCQkJfQogCQkJCS8qIHNraXAgdGhlIDIgLCAqLwogCQkJCXM9c3RyY2hyKHMsJywnKTtzKys7CiAJCQkJcz1zdHJjaHIocywnLCcpO3MrKzsKIAkJCQlpZiAoKDE8PHR5cGUpICYgVU5JQ09OVk1BU0spIHsKLQkJCQkJcz1fcmVhZF9VU1RSSU5HKHMsKExQV1NUUiopJmRhdGEpOworCQkJCQlzPV93aW5lX3JlYWRfVVNUUklORyhzLChMUFdTVFIqKSZkYXRhKTsKIAkJCQkJaWYgKGRhdGEpCiAJCQkJCQlsZW4gPSBzdHJsZW5XKChMUFdTVFIpZGF0YSkqMisyOwogCQkJCQllbHNlCQpAQCAtNjA2LDMzICs2NzQsMjQgQEAKIAkJCQkJCXMrKzsKIAkJCQkJfQogCQkJCX0KLQkJCQlpZiAodmFsLT5sYXN0bW9kaWZpZWQ8bGFzdG1vZGlmaWVkKSB7Ci0JCQkJCXZhbC0+bGFzdG1vZGlmaWVkPWxhc3Rtb2RpZmllZDsKLQkJCQkJdmFsLT50eXBlID0gdHlwZTsKLQkJCQkJdmFsLT5sZW4gID0gbGVuOwotCQkJCQlpZiAodmFsLT5kYXRhKSAKLQkJCQkJCWZyZWUodmFsLT5kYXRhKTsKLQkJCQkJdmFsLT5kYXRhID0gZGF0YTsKLQkJCQl9IGVsc2UgewotCQkJCQlmcmVlKGRhdGEpOwotCQkJCX0KKwkJCQlfZmluZF9vcl9hZGRfdmFsdWUobHBrZXksbmFtZSx0eXBlLGRhdGEsbGVuLGxhc3Rtb2RpZmllZCk7CiAJCQl9CiAJCX0KIAkJLyogcmVhZCB0aGUgbmV4dCBsaW5lICovCi0JCWlmICghX3JlYWRfbGluZShGLGJ1ZixidWZsZW4pKQorCQlpZiAoIV93aW5lX3JlYWRfbGluZShGLGJ1ZixidWZsZW4pKQogCQkJcmV0dXJuIDE7CiAJfQogCXJldHVybiAxOwogfQogCiBzdGF0aWMgaW50Ci1fZG9fbG9hZHN1YnJlZyhGSUxFICpGLExQS0VZU1RSVUNUIGxwa2V5KSB7Citfd2luZV9sb2Fkc3VicmVnKEZJTEUgKkYsTFBLRVlTVFJVQ1QgbHBrZXksaW50IG9wdGZsYWcpIHsKIAlpbnQJdmVyOwogCWNoYXIJKmJ1ZjsKIAlpbnQJYnVmbGVuOwogCiAJYnVmPXhtYWxsb2MoMTApO2J1Zmxlbj0xMDsKLQlpZiAoIV9yZWFkX2xpbmUoRiwmYnVmLCZidWZsZW4pKSB7CisJaWYgKCFfd2luZV9yZWFkX2xpbmUoRiwmYnVmLCZidWZsZW4pKSB7CiAJCWZyZWUoYnVmKTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtNjQxLDIwICs3MDAsMTYgQEAKIAkJcmV0dXJuIDA7CiAJfQogCWlmICh2ZXIhPVJFR0lTVFJZX1NBVkVfVkVSU0lPTikgewotCQlkcHJpbnRmX3JlZyhzdGRkZWIsX19GSUxFX18iOl9kb19sb2Fkc3VicmVnOk9sZCBmb3JtYXQgKCVkKSByZWdpc3RyeSBmb3VuZCwgaWdub3JpbmcgaXQuIChidWYgd2FzICVzKS5cbiIsdmVyLGJ1Zik7CisJCWRwcmludGZfcmVnKHN0ZGRlYixfX0ZJTEVfXyI6X3dpbmVfbG9hZHN1YnJlZzpPbGQgZm9ybWF0ICglZCkgcmVnaXN0cnkgZm91bmQsIGlnbm9yaW5nIGl0LiAoYnVmIHdhcyAlcykuXG4iLHZlcixidWYpOwogCQlmcmVlKGJ1Zik7CiAJCXJldHVybiAwOwogCX0KLQlpZiAoIV9yZWFkX2xpbmUoRiwmYnVmLCZidWZsZW4pKSB7CisJaWYgKCFfd2luZV9yZWFkX2xpbmUoRiwmYnVmLCZidWZsZW4pKSB7CiAJCWZyZWUoYnVmKTsKIAkJcmV0dXJuIDA7CiAJfQotCWlmICghX2RvX2xvYWRfc3Via2V5KEYsbHBrZXksMCwmYnVmLCZidWZsZW4pKSB7CisJaWYgKCFfd2luZV9sb2Fkc3Via2V5KEYsbHBrZXksMCwmYnVmLCZidWZsZW4sb3B0ZmxhZykpIHsKIAkJZnJlZShidWYpOwotCQkvKiBGSVhNRTogbWVtb3J5IGxlYWsgb24gZmFpbHVyZSB0byByZWFkIHJlZ2lzdHJ5IC4uLiAKLQkJICogQnV0IHRoaXMgd29uJ3QgaGFwcGVuIHZlcnkgb2Z0ZW4uCi0JCSAqLwotCQlscGtleS0+bmV4dHN1Yj1OVUxMOwogCQlyZXR1cm4gMDsKIAl9CiAJZnJlZShidWYpOwpAQCAtNjYyLDcgKzcxNyw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1fTG9hZFN1YlJlZyhMUEtFWVNUUlVDVCBscGtleSxjaGFyICpmbikgeworX3dpbmVfbG9hZHJlZyhMUEtFWVNUUlVDVCBscGtleSxjaGFyICpmbixpbnQgb3B0ZmxhZykgewogCUZJTEUJKkY7CiAKIAlGPWZvcGVuKGZuLCJyYiIpOwpAQCAtNjcyLDcgKzcyNyw3IEBACiAJCSk7CiAJCXJldHVybjsKIAl9Ci0JaWYgKCFfZG9fbG9hZHN1YnJlZyhGLGxwa2V5KSkgeworCWlmICghX3dpbmVfbG9hZHN1YnJlZyhGLGxwa2V5LG9wdGZsYWcpKSB7CiAJCWZjbG9zZShGKTsKIAkJdW5saW5rKGZuKTsKIAkJcmV0dXJuOwpAQCAtNjgwLDU1ICs3MzUsNTY1IEBACiAJZmNsb3NlKEYpOwogfQogCitzdGF0aWMgdm9pZAorX2NvcHlfcmVnaXN0cnkoTFBLRVlTVFJVQ1QgZnJvbSxMUEtFWVNUUlVDVCB0bykgeworCUxQS0VZU1RSVUNUCWxweGtleTsKKwlpbnQJCWo7CisJTFBLRVlWQUxVRQl2YWxmcm9tOworCisJZnJvbT1mcm9tLT5uZXh0c3ViOworCXdoaWxlIChmcm9tKSB7CisJCWxweGtleSA9IF9maW5kX29yX2FkZF9rZXkodG8sc3RyZHVwVyhmcm9tLT5rZXluYW1lKSk7CisKKwkJZm9yIChqPTA7ajxmcm9tLT5ucm9mdmFsdWVzO2orKykgeworCQkJTFBXU1RSCW5hbWU7CisJCQlMUEJZVEUJZGF0YTsKKworCQkJdmFsZnJvbSA9IGZyb20tPnZhbHVlcytqOworCQkJbmFtZT12YWxmcm9tLT5uYW1lOworCQkJaWYgKG5hbWUpIG5hbWU9c3RyZHVwVyhuYW1lKTsKKwkJCWRhdGE9KExQQllURSltYWxsb2ModmFsZnJvbS0+bGVuKTsKKwkJCW1lbWNweShkYXRhLHZhbGZyb20tPmRhdGEsdmFsZnJvbS0+bGVuKTsKKworCQkJX2ZpbmRfb3JfYWRkX3ZhbHVlKAorCQkJCWxweGtleSwKKwkJCQluYW1lLAorCQkJCXZhbGZyb20tPnR5cGUsCisJCQkJZGF0YSwKKwkJCQl2YWxmcm9tLT5sZW4sCisJCQkJdmFsZnJvbS0+bGFzdG1vZGlmaWVkCisJCQkpOworCQl9CisJCV9jb3B5X3JlZ2lzdHJ5KGZyb20sbHB4a2V5KTsKKwkJZnJvbSA9IGZyb20tPm5leHQ7CisJfQorfQorCisvKiBXSU5ET1dTIDk1IFJFR0lTVFJZIExPQURFUiAqLworLyogCisgKiBTdHJ1Y3R1cmUgb2YgYSB3aW45NSByZWdpc3RyeSBkYXRhYmFzZS4KKyAqIG1haW4gaGVhZGVyOgorICogMCA6CSJDUkVHIgktIG1hZ2ljCisgKiA0IDoJRFdPUkQgdmVyc2lvbgorICogOCA6CURXT1JEIG9mZnNldF9vZl9SR0RCX3BhcnQKKyAqIDBDLi4xRjoJPyAoc29tZW9uZSBmaWxsIGluIHBsZWFzZSkKKyAqCisgKiAyMDogUkdLTl9zZWN0aW9uOgorICogICBoZWFkZXI6CisgKiAJMCA6CQkiUkdLTiIJLSBtYWdpYworICogCTQuLjB4MUI6IAk/IChmaWxsIGluKQorICogICAgICAweDIwIC4uLiBvZmZzZXRfb2ZfUkdEQl9wYXJ0OiBEaXNrIEtleSBFbnRyeSBzdHJ1Y3R1cmVzCisgKgorICogICBEaXNrIEtleSBFbnRyeSBTdHJ1Y3R1cmU6CisgKgkwMDogRFdPUkQJLSB1bmtub3duCisgKgkwNDogRFdPUkQJLSB1bmtub3duCisgKgkwODogRFdPUkQJLSB1bmtub3duLCBidXQgdXN1YWxseSAweEZGRkZGRkZGIG9uIHdpbjk1IHN5c3RlbXMKKyAqCTBDOiBEV09SRAktIGRpc2sgYWRkcmVzcyBvZiBQcmV2aW91c0xldmVsIEtleS4KKyAqCTEwOiBEV09SRAktIGRpc2sgYWRkcmVzcyBvZiBOZXh0IFN1YmxldmVsIEtleS4KKyAqCTE0OiBEV09SRAktIGRpc2sgYWRkcmVzcyBvZiBOZXh0IEtleSAob24gc2FtZSBsZXZlbCkuCisgKiBES0VQPjE4OiBXT1JECS0gTnIsIExvdyBTaWduaWZpY2FudCBwYXJ0LgorICoJMUE6IFdPUkQJLSBOciwgSGlnaCBTaWduaWZpY2FudCBwYXJ0LgorICoKKyAqIFRoZSBkaXNrIGFkZHJlc3MgYWx3YXlzIHBvaW50cyB0byB0aGUgbnIgcGFydCBvZiB0aGUgcHJldmlvdXMga2V5IGVudHJ5IAorICogb2YgdGhlIHJlZmVyZW5jZWQga2V5LiBEb24ndCBhc2sgbWUgd2h5LCBvciBldmVuIGlmIEkgZ290IHRoaXMgY29ycmVjdAorICogZnJvbSBzdGFyaW5nIGF0IDFrZyBvZiBoZXhkdW1wcy4gKERLRVApCisgKgorICogVGhlIG51bWJlciBvZiB0aGUgZW50cnkgaXMgdGhlIGxvdyBieXRlIG9mIHRoZSBMb3cgU2lnbmlmaWNhbnQgUGFydCBvcmVkCisgKiB3aXRoIDB4MTAwICogKGxvdyBieXRlIG9mIHRoZSBIaWdoIFNpZ25pZmljYW50IHBhcnQpCisgKiAoQyBleHByZXNzaW9uIDogbnIgPSAobnJMUyAmIDB4RkYpIHwgKChuckhTICYweEZGKTw8OCkpCisgKgorICogVGhlcmUgYXJlIHR3byBtaW5vciBjb3JyZWN0aW9ucyB0byB0aGUgcG9zaXRpb24gb2YgdGhhdCBzdHJ1Y3R1cmUuCisgKiAxLiBJZiB0aGUgYWRkcmVzcyBpcyB4eHgwMTQgb3IgeHh4MDE4IGl0IHdpbGwgYmUgYWxpZ25lZCB0byB4eHgwMWMgQU5EIAorICogICAgdGhlIERLRSByZXJlYWQgZnJvbSB0aGVyZS4KKyAqIDIuIElmIHRoZSBhZGRyZXNzIGlzIHh4eEZGeCBpdCB3aWxsIGJlIGFsaWduZWQgdG8gKHh4eCsxKTAwMC4KKyAqIChGSVhNRTogc2xpZ2h0bHkgYmV0dGVyIGV4cGxhbmF0aW9uIG5lZWRlZCBoZXJlKQorICoKKyAqIFJHREJfc2VjdGlvbjoKKyAqIAkwMDoJCSJSR0RCIgktIG1hZ2ljCisgKgkwNC4uLjFGOgk/CisgKgkyMC4uLi4uOglkaXNrIGtleXMKKyAqCisgKiBkaXNrIGtleToKKyAqIAkwMDogCURXT1JECW5leHRrZXlvZmZzZXQJLSBvZmZzZXQgdG8gdGhlIG5leHQgZGlzayBrZXkgc3RydWN0dXJlCisgKgkwODogCVdPUkQJbnJMUwkJLSBsb3cgc2lnbmlmaWNhbnQgcGFydCBvZiBOUgorICoJMEE6IAlXT1JECW5ySFMJCS0gaGlnaCBzaWduaWZpY2FudCBwYXJ0IG9mIE5SCisgKgkwQzogCURXT1JECWJ5dGVzdXNlZAktIGJ5dGVzIHVzZWQgaW4gdGhpcyBzdHJ1Y3R1cmUuCisgKgkxMDogCVdPUkQJbmFtZV9sZW4JLSBsZW5ndGggb2YgbmFtZSBpbiBieXRlcy4gd2l0aG91dCBcMAorICoJMTI6IAlXT1JECW5yX29mX3ZhbHVlcwktIG51bWJlciBvZiB2YWx1ZXMuCisgKgkxNDogCWNoYXIJbmFtZVtuYW1lX2xlbl0JLSBuYW1lIHN0cmluZy4gTm8gXDAuCisgKgkxNCtuYW1lX2xlbjogZGlzayB2YWx1ZXMKKyAqCW5leHRrZXlvZmZzZXQ6IC4uLiBuZXh0IGRpc2sga2V5CisgKgorICogZGlzayB2YWx1ZToKKyAqCTAwOglEV09SRAl0eXBlCQktIHZhbHVlIHR5cGUgKGhtbSwgY291bGQgYmUgV09SRCB0b28pCisgKgkwNDoJRFdPUkQJCQktIHVua25vd24sIHVzdWFsbHkgMAorICoJMDg6CVdPUkQJbmFtZWxlbgkJLSBsZW5ndGggb2YgTmFtZS4gMCBtZWFucyBuYW1lPU5VTEwKKyAqCTBDOglXT1JECWRhdGFsZW4JCS0gbGVuZ3RoIG9mIERhdGEuCisgKgkxMDoJY2hhcgluYW1lW25hbWVsZW5dCS0gbmFtZSwgbm8gXDAKKyAqCTEwK25hbWVsZW46IEJZVEUJZGF0YVtkYXRhbGVuXSAtIGRhdGEsIHdpdGhvdXQgXDAgaWYgc3RyaW5nCisgKgkxMCtuYW1lbGVuK2RhdGFsZW46IG5leHQgdmFsdWVzIG9yIGRpc2sga2V5CisgKgorICogRGlzayBrZXlzIGFyZSBsYXllZCBvdXQgZmxhdCAuLi4gQnV0LCBzb21ldGltZXMsIG5yTFMgYW5kIG5ySFMgYXJlIGJvdGgKKyAqIDB4RkZGRiwgd2hpY2ggbWVhbnMgc2tpcHBpbmcgb3ZlciBuZXh0a2V5b2Zmc2V0IGJ5dGVzIChpbmNsdWRpbmcgdGhpcworICogc3RydWN0dXJlKSBhbmQgcmVhZGluZyBhbm90aGVyIFJHREJfc2VjdGlvbi4KKyAqIHJlcGVhdCB1bnRpbCBlbmQgb2YgZmlsZS4KKyAqCisgKiBGSVhNRTogdGhpcyBkZXNjcmlwdGlvbiBuZWVkcyBzb21lIHNlcmlvdXMgaGVscCwgeWVzLgorICovCisKK3N0cnVjdAlfdzk1a2V5dmFsdWUgeworCXVuc2lnbmVkIGxvbmcJCXR5cGU7CisJdW5zaWduZWQgc2hvcnQJCWRhdGFsZW47CisJY2hhcgkJCSpuYW1lOworCXVuc2lnbmVkIGNoYXIJCSpkYXRhOworCXVuc2lnbmVkIGxvbmcJCXgxOworCWludAkJCWxhc3Rtb2RpZmllZDsKK307CisKK3N0cnVjdCAJX3c5NWtleSB7CisJY2hhcgkJCSpuYW1lOworCWludAkJCW5yb2Z2YWxzOworCXN0cnVjdAlfdzk1a2V5dmFsdWUJKnZhbHVlczsKKwl1bnNpZ25lZCBsb25nCQlka2VhZGRyOworCXVuc2lnbmVkIGxvbmcgCQl4MTsKKwl1bnNpZ25lZCBsb25nIAkJeDI7CisJdW5zaWduZWQgbG9uZyAJCXgzOworCXVuc2lnbmVkIGxvbmcgCQl4eDE7CisJc3RydWN0IF93OTVrZXkJCSpwcmV2bHZsOworCXN0cnVjdCBfdzk1a2V5CQkqbmV4dHN1YjsKKwlzdHJ1Y3QgX3c5NWtleQkJKm5leHQ7Cit9OworCisvKiBmYXN0IGxvb2t1cCB0YWJsZSBka2VhZGRyLT5uciAqLworc3RydWN0CV93OTVucjJkYSB7CisJdW5zaWduZWQgbG9uZwkJZGtlYWRkcjsKKwl1bnNpZ25lZCBsb25nCQlucjsKK307CisKKworc3RhdGljIHZvaWQKK193OTVfd2Fsa190cmVlKExQS0VZU1RSVUNUIGxwa2V5LHN0cnVjdCBfdzk1a2V5ICprZXkpIHsKKwlpbnQJCWk7CisJTFBLRVlTVFJVQ1QJbHB4a2V5OworCUxQV1NUUgkJbmFtZTsKKworCXdoaWxlIChrZXkpIHsKKwkJaWYgKGtleS0+bmFtZSA9PSBOVUxMKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwia2V5IHdpdGggZGtlYWRkciAlbHggbm90IGxvYWRlZCwgc2tpcHBpbmcgaGllcmFyY2h5XG4iLAorCQkJCWtleS0+ZGtlYWRkcgorCQkJKTsKKwkJCWtleSA9IGtleS0+bmV4dDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWxweGtleT1fZmluZF9vcl9hZGRfa2V5KGxwa2V5LHN0cmR1cEEyVyhrZXktPm5hbWUpKTsKKworCQlpZiAoa2V5LT5ucm9mdmFsczwwKSB7CisJCQkvKiBzaG91bGRuJ3QgaGFwcGVuICovCisJCQlmcHJpbnRmKHN0ZGVyciwia2V5ICVzIGFscmVhZHkgcHJvY2Vzc2VkIVxuIixrZXktPm5hbWUpOworCQkJa2V5ID0ga2V5LT5uZXh0OworCQkJY29udGludWU7CisJCX0KKwkJZm9yIChpPTA7aTxrZXktPm5yb2Z2YWxzO2krKykgeworCQkJTFBCWVRFCWRhdGE7CisJCQlpbnQJbGVuOworCisJCQluYW1lID0gc3RyZHVwQTJXKGtleS0+dmFsdWVzW2ldLm5hbWUpOworCQkJaWYgKCEqbmFtZSkgbmFtZSA9IE5VTEw7CisJCQlmcmVlKGtleS0+dmFsdWVzW2ldLm5hbWUpOworCisJCQlsZW4JPSBrZXktPnZhbHVlc1tpXS5kYXRhbGVuOworCQkJZGF0YQk9IGtleS0+dmFsdWVzW2ldLmRhdGE7CisJCQlpZiAoKDE8PGtleS0+dmFsdWVzW2ldLnR5cGUpICYgVU5JQ09OVk1BU0spIHsKKwkJCQlkYXRhID0gKEJZVEUqKXN0cmR1cEEyVyhkYXRhKTsKKwkJCQlsZW4gID0gc3RybGVuVygoTFBXU1RSKWRhdGEpKjIrMjsKKwkJCQlmcmVlKGtleS0+dmFsdWVzW2ldLmRhdGEpOworCQkJfQorCQkJX2ZpbmRfb3JfYWRkX3ZhbHVlKAorCQkJCWxweGtleSwKKwkJCQluYW1lLAorCQkJCWtleS0+dmFsdWVzW2ldLnR5cGUsCisJCQkJZGF0YSwKKwkJCQlsZW4sCisJCQkJa2V5LT52YWx1ZXNbaV0ubGFzdG1vZGlmaWVkCisJCQkpOworCQl9CisJCWlmIChrZXktPnZhbHVlcykgeworCQkJZnJlZShrZXktPnZhbHVlcyk7CisJCQlrZXktPnZhbHVlcyA9IE5VTEw7CisJCX0KKwkJa2V5LT5ucm9mdmFscz0ta2V5LT5ucm9mdmFscy0xOworCQlfdzk1X3dhbGtfdHJlZShscHhrZXksa2V5LT5uZXh0c3ViKTsKKwkJa2V5PWtleS0+bmV4dDsKKwl9Cit9CisKKy8qIHNtYWxsIGhlbHBlciBmdW5jdGlvbiB0byBhZGp1c3QgYWRkcmVzcyBvZmZzZXQgKGRrZWFkZHJzKSAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcKK193OTVfYWRqX2RhKHVuc2lnbmVkIGxvbmcgZGtlYWRkcikgeworCWlmICgoZGtlYWRkciYweEZGRik8MHgwMTgpIHsKKwkJaW50CWRpZmY7CisKKwkJZGlmZj0weDFDLShka2VhZGRyJjB4RkZGKTsKKwkJcmV0dXJuIGRrZWFkZHIrZGlmZjsKKwl9CisJaWYgKCgoZGtlYWRkcisweDFDKSYweEZGRik8MHgxQykgeworCQkvKiByZWFkanVzdCB0byAweDAwMCwKKwkJICogYnV0IE9OTFkgaWYgd2UgYXJlID4weDEwMDAgYWxyZWFkeQorCQkgKi8KKwkJaWYgKGRrZWFkZHIgJiB+MHhGRkYpCisJCQlyZXR1cm4gZGtlYWRkciAmIH4weEZGRjsKKwl9CisJcmV0dXJuIGRrZWFkZHI7Cit9CisKK3N0YXRpYyBpbnQKK193OTVka2Vjb21wKHN0cnVjdCBfdzk1bnIyZGEgKmEsc3RydWN0IF93OTVucjJkYSAqYil7cmV0dXJuIGEtPmRrZWFkZHItYi0+ZGtlYWRkcjt9CisKK3N0YXRpYyBzdHJ1Y3QgX3c5NWtleSoKK193OTVka2Vsb29rdXAodW5zaWduZWQgbG9uZyBka2VhZGRyLGludCBuLHN0cnVjdCBfdzk1bnIyZGEgKm5yMmRhLHN0cnVjdCBfdzk1a2V5ICprZXlzKSB7CisJaW50CWksb2ZmOworCisJaWYgKGRrZWFkZHIgPT0gMHhGRkZGRkZGRikKKwkJcmV0dXJuIE5VTEw7CisJaWYgKGRrZWFkZHI8MHgyMCkKKwkJcmV0dXJuIE5VTEw7CisJZGtlYWRkcj1fdzk1X2Fkal9kYShka2VhZGRyKzB4MWMpOworCW9mZiA9IChka2VhZGRyLTB4M2MpLzB4MWM7CisJZm9yIChpPTA7aTxuO2krKykKKwkJaWYgKG5yMmRhWyhpK29mZiklbl0uZGtlYWRkciA9PSBka2VhZGRyKQorCQkJcmV0dXJuIGtleXMrbnIyZGFbKGkrb2ZmKSVuXS5ucjsKKwlmcHJpbnRmKHN0ZGVyciwic2VhcmNoIGRpZG4ndCBmb3VuZCBka2VhZGRyICVseD9cbiIsZGtlYWRkcik7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitfdzk1X2xvYWRyZWcoY2hhciogZm4sTFBLRVlTVFJVQ1QgbHBrZXkpIHsKKwkvKiBEaXNrIEtleSBFbnRyeSBzdHJ1Y3R1cmUgKFJHS04gcGFydCkgKi8KKwlzdHJ1Y3QJZGtlIHsKKwkJdW5zaWduZWQgbG9uZwkJeDE7CisJCXVuc2lnbmVkIGxvbmcJCXgyOworCQl1bnNpZ25lZCBsb25nCQl4MzsvKnVzdWFsbHkgMHhGRkZGRkZGRiAqLworCQl1bnNpZ25lZCBsb25nCQlwcmV2bHZsOworCQl1bnNpZ25lZCBsb25nCQluZXh0c3ViOworCQl1bnNpZ25lZCBsb25nCQluZXh0OworCQl1bnNpZ25lZCBzaG9ydAkJbnJMUzsKKwkJdW5zaWduZWQgc2hvcnQJCW5yTVM7CisJfTsKKwkvKiBEaXNrIEtleSBIZWFkZXIgc3RydWN0dXJlIChSR0RCIHBhcnQpICovCisJc3RydWN0CWRraCB7CisJCXVuc2lnbmVkIGxvbmcJCW5leHRrZXlvZmY7IAorCQl1bnNpZ25lZCBzaG9ydAkJbnJMUzsKKwkJdW5zaWduZWQgc2hvcnQJCW5yTVM7CisJCXVuc2lnbmVkIGxvbmcJCWJ5dGVzdXNlZDsKKwkJdW5zaWduZWQgc2hvcnQJCWtleW5hbWVsZW47CisJCXVuc2lnbmVkIHNob3J0CQl2YWx1ZXM7CisJCXVuc2lnbmVkIGxvbmcJCXh4MTsKKwkJLyoga2V5bmFtZSAqLworCQkvKiBkaXNrIGtleSB2YWx1ZXMgb3Igbm90aGluZyAqLworCX07CisJLyogRGlzayBLZXkgVmFsdWUgc3RydWN0dXJlICovCisJc3RydWN0CWRrdiB7CisJCXVuc2lnbmVkIGxvbmcJCXR5cGU7CisJCXVuc2lnbmVkIGxvbmcJCXgxOworCQl1bnNpZ25lZCBzaG9ydAkJdmFsbmFtZWxlbjsKKwkJdW5zaWduZWQgc2hvcnQJCXZhbGRhdGFsZW47CisJCS8qIHZhbG5hbWUsIHZhbGRhdGEgKi8KKwl9OworCXN0cnVjdAlfdzk1bnIyZGEgCSpucjJkYTsKKworCUhGSUxFCQloZmQ7CisJaW50CQlmZCxsYXN0bW9kaWZpZWQ7CisJY2hhcgkJbWFnaWNbNV07CisJdW5zaWduZWQgbG9uZwlucixwb3MsaSx3aGVyZSx2ZXJzaW9uLHJnZGJzZWN0aW9uLGVuZDsKKwlzdHJ1Y3QJX3c5NWtleQkqa2V5czsKKwlpbnQJCW5yb2Zka2VzOworCXVuc2lnbmVkIGNoYXIJKmRhdGEsKmN1cmRhdGE7CisJT0ZTVFJVQ1QJb2ZzOworCXN0cnVjdAlzdGF0CXN0YnVmOworCisJZHByaW50Zl9yZWcoc3RkZGViLCJMb2FkaW5nIFdpbjk1IHJlZ2lzdHJ5IGRhdGFiYXNlICclcydcbiIsZm4pOworCWhmZD1PcGVuRmlsZShmbiwmb2ZzLE9GX1JFQUQpOworCWlmIChoZmQ9PUhGSUxFX0VSUk9SKQorCQlyZXR1cm47CisJZmQgPSBGSUxFX0dldFVuaXhIYW5kbGUoaGZkKTsKKwltYWdpY1s0XT0wOworCWlmICg0IT1yZWFkKGZkLG1hZ2ljLDQpKQorCQlyZXR1cm47CisJaWYgKHN0cmNtcChtYWdpYywiQ1JFRyIpKSB7CisJCWZwcmludGYoc3RkZGViLCIlcyBpcyBub3QgYSB3OTUgcmVnaXN0cnkuXG4iLGZuKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoNCE9cmVhZChmZCwmdmVyc2lvbiw0KSkKKwkJcmV0dXJuOworCWlmICg0IT1yZWFkKGZkLCZyZ2Ric2VjdGlvbiw0KSkKKwkJcmV0dXJuOworCWlmICgtMT09bHNlZWsoZmQsMHgyMCxTRUVLX1NFVCkpCisJCXJldHVybjsKKwlpZiAoNCE9cmVhZChmZCxtYWdpYyw0KSkKKwkJcmV0dXJuOworCWlmIChzdHJjbXAobWFnaWMsIlJHS04iKSkgeworCQlkcHJpbnRmX3JlZyhzdGRkZWIsInNlY29uZCBJRkYgaGVhZGVyIG5vdCBSR0tOLCBidXQgJXNcbiIsbWFnaWMpOworCQlyZXR1cm47CisJfQorCisJLyogU1RFUCAxOiBLZXlsaW5rIHN0cnVjdHVyZXMgKi8KKwlpZiAoLTE9PWxzZWVrKGZkLDB4NDAsU0VFS19TRVQpKQorCQlyZXR1cm47CisJd2hlcmUJPSAweDQwOworCWVuZAk9IHJnZGJzZWN0aW9uOworCisJbnJvZmRrZXMgPSAoZW5kLXdoZXJlKS9zaXplb2Yoc3RydWN0IGRrZSk7CisJZGF0YSA9IChjaGFyKil4bWFsbG9jKGVuZC13aGVyZSk7CisJaWYgKChlbmQtd2hlcmUpIT1yZWFkKGZkLGRhdGEsZW5kLXdoZXJlKSkKKwkJcmV0dXJuOworCWN1cmRhdGEgPSBkYXRhOworCisJa2V5cyA9IChzdHJ1Y3QgX3c5NWtleSopeG1hbGxvYyhucm9mZGtlcyAqIHNpemVvZihzdHJ1Y3QgX3c5NWtleSkpOworCW1lbXNldChrZXlzLCdcMCcsbnJvZmRrZXMqc2l6ZW9mKHN0cnVjdCBfdzk1a2V5KSk7CisJbnIyZGE9IChzdHJ1Y3QgX3c5NW5yMmRhKil4bWFsbG9jKG5yb2Zka2VzICogc2l6ZW9mKHN0cnVjdCBfdzk1bnIyZGEpKTsKKworCWZvciAoaT0wO2k8bnJvZmRrZXM7aSsrKSB7CisJCXN0cnVjdAlka2UJZGtlOworCQl1bnNpZ25lZCBsb25nIAlka2VhZGRyOworCisJCXBvcz1jdXJkYXRhLWRhdGErMHg0MDsKKwkJbWVtY3B5KCZka2UsY3VyZGF0YSxzaXplb2YoZGtlKSk7CisJCWN1cmRhdGErPXNpemVvZihka2UpOworCQluciA9IGRrZS5uckxTICsgKGRrZS5uck1TPDw4KTsKKwkJZGtlYWRkcj1wb3MtNDsKKwkJaWYgKChka2VhZGRyJjB4RkZGKTwweDAxOCkgeworCQkJaW50CWRpZmY7CisKKwkJCWRpZmY9MHgxQy0oZGtlYWRkciYweEZGRik7CisJCQlka2VhZGRyKz1kaWZmOworCQkJY3VyZGF0YSs9ZGlmZi1zaXplb2YoZGtlKTsKKwkJCW1lbWNweSgmZGtlLGN1cmRhdGEsc2l6ZW9mKGRrZSkpOworCQkJbnIgPSBka2UubnJMUyArIChka2UubnJNUzw8OCk7CisJCQljdXJkYXRhKz1zaXplb2YoZGtlKTsKKwkJfQorCQlpZiAoKChka2VhZGRyKzB4MUMpJjB4RkZGKTwweDFDKSB7CisJCQkvKiByZWFkanVzdCB0byAweDAwMCwKKwkJCSAqIGJ1dCBPTkxZIGlmIHdlIGFyZSA+MHgxMDAwIGFscmVhZHkKKwkJCSAqLworCQkJaWYgKGRrZWFkZHIgJiB+MHhGRkYpCisJCQkJZGtlYWRkciA9IGRrZWFkZHIgJiB+MHhGRkY7CisJCX0KKwkJaWYgKG5yPm5yb2Zka2VzKSB7CisJCQlkcHJpbnRmX3JlZyhzdGRkZWIsIm5yICVsZCBleGNlZWRzIG5yb2Zka2VzICVkLCBza2lwcGluZy5cbiIsbnIsbnJvZmRrZXMpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGtleXNbbnJdLmRrZWFkZHIpIHsKKwkJCWlmIChucikKKwkJCQlkcHJpbnRmX3JlZyhzdGRkZWIsImtleSBkb3VibGVkPyBucj0lbGQsa2V5LT5ka2VhZGRyPSVseCxka2VhZGRyPSVseFxuIixucixrZXlzW2ldLmRrZWFkZHIsZGtlYWRkcik7CisJCQljb250aW51ZTsKKwkJfQorCQlucjJkYVtpXS5ucgkgPSBucjsKKwkJbnIyZGFbaV0uZGtlYWRkciA9IGRrZWFkZHI7CisKKwkJa2V5c1tucl0uZGtlYWRkciA9IGRrZWFkZHI7CisJCWtleXNbbnJdLngxID0gZGtlLngxOworCQlrZXlzW25yXS54MiA9IGRrZS54MjsKKwkJa2V5c1tucl0ueDMgPSBka2UueDM7CisJCWtleXNbbnJdLnByZXZsdmw9IChzdHJ1Y3QgX3c5NWtleSopZGtlLnByZXZsdmw7CisJCWtleXNbbnJdLm5leHRzdWI9IChzdHJ1Y3QgX3c5NWtleSopZGtlLm5leHRzdWI7CisJCWtleXNbbnJdLm5leHQgCT0gKHN0cnVjdCBfdzk1a2V5Kilka2UubmV4dDsKKwl9CisJZnJlZShkYXRhKTsKKworCXFzb3J0KG5yMmRhLG5yb2Zka2VzLHNpemVvZihucjJkYVswXSksX3c5NWRrZWNvbXApOworCisJLyogU1RFUCAyOiBrZXlkYXRhICYgdmFsdWVzICovCisJaWYgKC0xPT1mc3RhdChmZCwmc3RidWYpKQorCQlyZXR1cm47CisJZW5kCQk9IHN0YnVmLnN0X3NpemU7CisJbGFzdG1vZGlmaWVkCT0gc3RidWYuc3RfbXRpbWU7CisKKwlpZiAoLTE9PWxzZWVrKGZkLHJnZGJzZWN0aW9uLFNFRUtfU0VUKSkKKwkJcmV0dXJuOworCWRhdGEgPSAoY2hhciopeG1hbGxvYyhlbmQtcmdkYnNlY3Rpb24pOworCWlmICgoZW5kLXJnZGJzZWN0aW9uKSE9cmVhZChmZCxkYXRhLGVuZC1yZ2Ric2VjdGlvbikpCisJCXJldHVybjsKKwlfbGNsb3NlKGhmZCk7CisJY3VyZGF0YSA9IGRhdGE7CisJbWVtY3B5KG1hZ2ljLGN1cmRhdGEsNCk7CisJY3VyZGF0YSs9NDsKKwlpZiAoc3RyY21wKG1hZ2ljLCJSR0RCIikpIHsKKwkJZHByaW50Zl9yZWcoc3RkZGViLCJ0aGlyZCBJRkYgaGVhZGVyIG5vdCBSR0RCLCBidXQgJXNcbiIsbWFnaWMpOworCQlyZXR1cm47CisJfQorCWN1cmRhdGE9ZGF0YSsweDIwOworCXdoaWxlICgxKSB7CisJCXN0cnVjdAlka2ggZGtoOworCQlpbnQJYnl0ZXNyZWFkOworCQlzdHJ1Y3QJX3c5NWtleQkqa2V5LHhrZXk7CisKKwkJYnl0ZXNyZWFkID0gMDsKKyNkZWZpbmUgWFJFQUQod2hlcmV0byxsZW4pIFwKKwlpZiAoKGN1cmRhdGEtZGF0YStsZW4pPGVuZCkge1wKKwkJbWVtY3B5KHdoZXJldG8sY3VyZGF0YSxsZW4pO1wKKwkJY3VyZGF0YSs9bGVuO1wKKwkJYnl0ZXNyZWFkKz1sZW47XAorCX0KKworCQlYUkVBRCgmZGtoLHNpemVvZihka2gpKTsKKwkJbnIgPSBka2gubnJMUyArIChka2gubnJNUzw8OCk7CisJCWlmIChucj5ucm9mZGtlcykgeworCQkJaWYgKGRraC5uckxTID09IDB4RkZGRikgeworCQkJCWN1cmRhdGErPSBka2gubmV4dGtleW9mZiAtIGJ5dGVzcmVhZDsKKwkJCQlYUkVBRChtYWdpYyw0KTsKKwkJCQlpZiAoc3RyY21wKG1hZ2ljLCJSR0RCIikpIHsKKwkJCQkJaWYgKChjdXJkYXRhLWRhdGEpPGVuZCkKKwkJCQkJCWRwcmludGZfcmVnKHN0ZGRlYiwid2hpbGUgc2tpcHBpbmcgdG8gbmV4dCBSR0RCIGJsb2NrIGZvdW5kIG1hZ2ljICVzXG4iLG1hZ2ljKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWN1cmRhdGErPTB4MWM7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoZGtoLm5yTFMgPT0gMHhGRkZFKSB7CisJCQkJZHByaW50Zl9yZWcoc3RkZGViLCIweEZGRkUgYXQgJWx4XG4iLGxzZWVrKGZkLDAsU0VFS19DVVIpLWJ5dGVzcmVhZCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlkcHJpbnRmX3JlZyhzdGRkZWIsImhhdmVuJ3QgZm91bmQgbnIgJWxkLlxuIixucik7CisJCQlrZXkgPSAmeGtleTsKKwkJCW1lbXNldChrZXksJ1wwJyxzaXplb2YoeGtleSkpOworCQl9IGVsc2UgeworCQkJa2V5ID0ga2V5cytucjsKKwkJCWlmICgha2V5LT5ka2VhZGRyKQorCQkJCWRwcmludGZfcmVnKHN0ZGRlYiwia2V5IHdpdGggbnI9JWxkIGhhcyBubyBka2VhZGRyP1xuIixucik7CisJCX0KKwkJa2V5LT5ucm9mdmFscwk9IGRraC52YWx1ZXM7CisJCWtleS0+bmFtZQk9IChjaGFyKil4bWFsbG9jKGRraC5rZXluYW1lbGVuKzEpOworCQlrZXktPnh4MQk9IGRraC54eDE7CisJCVhSRUFEKGtleS0+bmFtZSxka2gua2V5bmFtZWxlbik7CisJCWtleS0+bmFtZVtka2gua2V5bmFtZWxlbl09MDsKKwkJaWYgKGtleS0+bnJvZnZhbHMpIHsKKwkJCWtleS0+dmFsdWVzID0gKHN0cnVjdCBfdzk1a2V5dmFsdWUqKXhtYWxsb2MoCisJCQkJc2l6ZW9mKHN0cnVjdCBfdzk1a2V5dmFsdWUpKmtleS0+bnJvZnZhbHMKKwkJCSk7CisJCQlmb3IgKGk9MDtpPGtleS0+bnJvZnZhbHM7aSsrKSB7CisJCQkJc3RydWN0CWRrdglka3Y7CisKKwkJCQlYUkVBRCgmZGt2LHNpemVvZihka3YpKTsKKwkJCQlrZXktPnZhbHVlc1tpXS50eXBlID0gZGt2LnR5cGU7CisJCQkJa2V5LT52YWx1ZXNbaV0ubmFtZSA9IChjaGFyKil4bWFsbG9jKAorCQkJCQlka3YudmFsbmFtZWxlbisxCisJCQkJKTsKKwkJCQlrZXktPnZhbHVlc1tpXS5kYXRhbGVuID0gZGt2LnZhbGRhdGFsZW47CisJCQkJa2V5LT52YWx1ZXNbaV0uZGF0YSA9ICh1bnNpZ25lZCBjaGFyKil4bWFsbG9jKAorCQkJCQlka3YudmFsZGF0YWxlbisxCisJCQkJKTsKKwkJCQlrZXktPnZhbHVlc1tpXS54MSAgID0gZGt2LngxOworCQkJCVhSRUFEKGtleS0+dmFsdWVzW2ldLm5hbWUsZGt2LnZhbG5hbWVsZW4pOworCQkJCVhSRUFEKGtleS0+dmFsdWVzW2ldLmRhdGEsZGt2LnZhbGRhdGFsZW4pOworCQkJCWtleS0+dmFsdWVzW2ldLmRhdGFbZGt2LnZhbGRhdGFsZW5dPTA7CisJCQkJa2V5LT52YWx1ZXNbaV0ubmFtZVtka3YudmFsbmFtZWxlbl09MDsKKwkJCQlrZXktPnZhbHVlc1tpXS5sYXN0bW9kaWZpZWQ9bGFzdG1vZGlmaWVkOworCQkJfQorCQl9CisJCWlmIChieXRlc3JlYWQgIT0gZGtoLm5leHRrZXlvZmYpIHsKKwkJCWlmIChka2guYnl0ZXN1c2VkICE9IGJ5dGVzcmVhZCkKKwkJCQlkcHJpbnRmX3JlZyhzdGRkZWIsCisJCQkJCSJyZWFkIGhhcyBkaWZmZXJlbmNlIGluIHJlYWQgYnl0ZXMgKCVkKSBhbmQgbmV4dG9mZnNldCAoJWxkKSAoYnl0ZXN1c2VkPSVsZClcbiIsYnl0ZXNyZWFkLGRraC5uZXh0a2V5b2ZmLAorCQkJCQlka2guYnl0ZXN1c2VkCisJCQkJKTsKKwkJCWN1cmRhdGEgKz0gZGtoLm5leHRrZXlvZmYtYnl0ZXNyZWFkOworCQl9CisJCWtleS0+cHJldmx2bAk9IF93OTVka2Vsb29rdXAoKGxvbmcpa2V5LT5wcmV2bHZsLG5yb2Zka2VzLG5yMmRhLGtleXMpOworCQlrZXktPm5leHRzdWIJPSBfdzk1ZGtlbG9va3VwKChsb25nKWtleS0+bmV4dHN1Yixucm9mZGtlcyxucjJkYSxrZXlzKTsKKwkJa2V5LT5uZXh0CT0gX3c5NWRrZWxvb2t1cCgobG9uZylrZXktPm5leHQsbnJvZmRrZXMsbnIyZGEsa2V5cyk7CisJCWlmICghYnl0ZXNyZWFkKQorCQkJYnJlYWs7CisJfQorCWZyZWUoZGF0YSk7CisJX3c5NV93YWxrX3RyZWUobHBrZXksa2V5cyk7CisJZnJlZShrZXlzKTsKK30KKwogdm9pZAogU0hFTExfTG9hZFJlZ2lzdHJ5KCkgewogCWNoYXIJKmZuOwogCXN0cnVjdAlwYXNzd2QJKnB3ZDsKKwlMUEtFWVNUUlVDVAlscGtleTsKKwlIS0VZCQloa2V5OworCiAKIAlpZiAoa2V5X2NsYXNzZXNfcm9vdD09TlVMTCkKIAkJU0hFTExfSW5pdCgpOwotCS8qIGxvYWQgdGhlIG1hY2hpbmUtd2lkZSBkZWZhdWx0cyBmaXJzdCAqLwotCV9Mb2FkU3ViUmVnKGtleV9jdXJyZW50X3VzZXIsU0FWRV9DVVJSRU5UX1VTRVJfREVGQVVMVCk7Ci0JX0xvYWRTdWJSZWcoa2V5X2xvY2FsX21hY2hpbmUsU0FWRV9MT0NBTF9NQUNISU5FX0RFRkFVTFQpOwogCi0JLyogbG9hZCB0aGUgdXNlciBzYXZlZCByZWdpc3RyeS4gb3ZlcndyaXRpbmcgb25seSBuZXdlciBlbnRyaWVzICovCisJLyogTG9hZCB3aW5kb3dzIDk1IGVudHJpZXMgKi8KKwlfdzk1X2xvYWRyZWcoIkM6XFxzeXN0ZW0uMXN0IiwJa2V5X2xvY2FsX21hY2hpbmUpOworCV93OTVfbG9hZHJlZygic3lzdGVtLmRhdCIsCWtleV9sb2NhbF9tYWNoaW5lKTsKKwlfdzk1X2xvYWRyZWcoInVzZXIuZGF0IiwJa2V5X3VzZXJzKTsKKworCS8qIEZJWE1FOiB3aW4zLjEgcmVnLmRhdCBsb2FkZXIgc3RpbGwgbWlzc2luZyAqLworCisJLyogdGhlIGdsb2JhbCB1c2VyIGRlZmF1bHQgaXMgbG9hZGVkIHVuZGVyIEhLRVlfVVNFUlNcXC5EZWZhdWx0ICovCisJUmVnQ3JlYXRlS2V5MTYoSEtFWV9VU0VSUywiLkRlZmF1bHQiLCZoa2V5KTsKKwlscGtleSA9IGxvb2t1cF9oa2V5KGhrZXkpOworCV93aW5lX2xvYWRyZWcobHBrZXksU0FWRV9VU0VSU19ERUZBVUxULDApOworCisJLyogSEtFWV9VU0VSU1xcLkRlZmF1bHQgaXMgY29waWVkIHRvIEhLRVlfQ1VSUkVOVF9VU0VSICovCisJX2NvcHlfcmVnaXN0cnkobHBrZXksa2V5X2N1cnJlbnRfdXNlcik7CisJUmVnQ2xvc2VLZXkoaGtleSk7CisKKwkvKiB0aGUgZ2xvYmFsIG1hY2hpbmUgZGVmYXVsdHMgKi8KKwlfd2luZV9sb2FkcmVnKGtleV9sb2NhbF9tYWNoaW5lLFNBVkVfTE9DQUxfTUFDSElORV9ERUZBVUxULDApOworCisJLyogbG9hZCB0aGUgdXNlciBzYXZlZCByZWdpc3RyaWVzICovCisKKwkvKiBGSVhNRTogdXNlIGdldGVudigiSE9NRSIpIG9yIGdldHB3dWlkKGdldHVpZCgpKS0+cHdfZGlyID8/ICovCisKIAlwd2Q9Z2V0cHd1aWQoZ2V0dWlkKCkpOwogCWlmIChwd2QhPU5VTEwgJiYgcHdkLT5wd19kaXIhPU5VTEwpIHsKIAkJZm49KGNoYXIqKXhtYWxsb2Moc3RybGVuKHB3ZC0+cHdfZGlyKStzdHJsZW4oV0lORV9QUkVGSVgpK3N0cmxlbihTQVZFX0NVUlJFTlRfVVNFUikrMik7CiAJCXN0cmNweShmbixwd2QtPnB3X2Rpcik7CiAJCXN0cmNhdChmbixXSU5FX1BSRUZJWCIvIlNBVkVfQ1VSUkVOVF9VU0VSKTsKLQkJX0xvYWRTdWJSZWcoa2V5X2N1cnJlbnRfdXNlcixmbik7CisJCV93aW5lX2xvYWRyZWcoa2V5X2N1cnJlbnRfdXNlcixmbixSRUdfT1BUSU9OX1RBSU5URUQpOwogCQlmcmVlKGZuKTsKIAkJZm49KGNoYXIqKXhtYWxsb2Moc3RybGVuKHB3ZC0+cHdfZGlyKStzdHJsZW4oV0lORV9QUkVGSVgpK3N0cmxlbihTQVZFX0xPQ0FMX01BQ0hJTkUpKzIpOwogCQlzdHJjcHkoZm4scHdkLT5wd19kaXIpOwogCQlzdHJjYXQoZm4sV0lORV9QUkVGSVgiLyJTQVZFX0xPQ0FMX01BQ0hJTkUpOwotCQlfTG9hZFN1YlJlZyhrZXlfbG9jYWxfbWFjaGluZSxmbik7CisJCV93aW5lX2xvYWRyZWcoa2V5X2xvY2FsX21hY2hpbmUsZm4sUkVHX09QVElPTl9UQUlOVEVEKTsKIAkJZnJlZShmbik7Ci0JfSBlbHNlIHsKKwl9IGVsc2UKIAkJZnByaW50ZihzdGRlcnIsIlNIRUxMX0xvYWRSZWdpc3RyeTpmYWlsZWQgdG8gZ2V0IGhvbWVkaXJlY3Rvcnkgb2YgVUlEICVkLlxuIixnZXR1aWQoKSk7CisJaWYgKEVSUk9SX1NVQ0NFU1M9PVJlZ0NyZWF0ZUtleTE2KEhLRVlfQ1VSUkVOVF9VU0VSLEtFWV9SRUdJU1RSWSwmaGtleSkpIHsKKwkJRFdPUkQJanVuayx0eXBlLGxlbjsKKwkJY2hhcglkYXRhWzVdOworCisJCWxlbj00OworCQlpZiAoKAlSZWdRdWVyeVZhbHVlRXgzMkEoCisJCQkJaGtleSwKKwkJCQlWQUxfU0FWRVVQREFURUQsCisJCQkJJmp1bmssCisJCQkJJnR5cGUsCisJCQkJZGF0YSwKKwkJCQkmbGVuCisJCQkpIT1FUlJPUl9TVUNDRVNTKSB8fAorCQkJdHlwZSAhPSBSRUdfU1oKKwkJKQorCQkJUmVnU2V0VmFsdWVFeDMyQShoa2V5LFZBTF9TQVZFVVBEQVRFRCwwLFJFR19TWiwieWVzIiw0KTsKKwkJUmVnQ2xvc2VLZXkoaGtleSk7CiAJfQotCS8qIEZJWE1FOiBsb2FkIGFsbCB1c2VycyBhbmQgdGhlaXIgcmVzcC4gcHdkLT5wd19kaXIvLndpbmUvdXNlci5yZWcgCi0JICoJICAobGF0ZXIsIHdoZW4gYSB3aW4zMiByZWdpc3RyeSBlZGl0aW5nIHRvb2wgYmVjb21lcyBhdmFpbC4pCi0JICovCiB9CiAKLS8qKioqKioqKioqKioqKioqKioqKiogQVBJIEZVTkNUSU9OUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKy8qKioqKioqKioqKioqKioqKioqKiogQVBJIEZVTkNUSU9OUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogT3BlbiBLZXlzLgogICoKLSAqIEFsbCBmdW5jdGlvbnMgYXJlIHN0dWJzIHRvIFJlZ09wZW5LZXlFeFcgd2hlcmUgYWxsIHRoZQorICogQWxsIGZ1bmN0aW9ucyBhcmUgc3R1YnMgdG8gUmVnT3BlbktleUV4MzJXIHdoZXJlIGFsbCB0aGUKICAqIG1hZ2ljIGhhcHBlbnMuIAogICoKICAqIEZJWE1FOiBzZWN1cml0eSxvcHRpb25zLGRlc2lyZWRhY2Nlc3MsLi4uCiAgKgogICogQ2FsbHBhdGg6Ci0gKiBSZWdPcGVuS2V5IC0+IFJlZ09wZW5LZXlBIC0+IFJlZ09wZW5LZXlFeEEgXAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdPcGVuS2V5VyAgIC0+IFJlZ09wZW5LZXlFeFcgCisgKiBSZWdPcGVuS2V5MTYgLT4gUmVnT3BlbktleTMyQSAtPiBSZWdPcGVuS2V5RXgzMkEgXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnT3BlbktleTMyVyAgIC0+IFJlZ09wZW5LZXlFeDMyVyAKICAqLwogCiAvKiBSZWdPcGVuS2V5RXhXCQlbQURWQVBJMzIuMTUwXSAqLwotRFdPUkQgUmVnT3BlbktleUV4VygKK0RXT1JEIFJlZ09wZW5LZXlFeDMyVygKIAlIS0VZCWhrZXksCiAJTFBDV1NUUglscHN6U3ViS2V5LAogCURXT1JECWR3UmVzZXJ2ZWQsCkBAIC03MzgsNyArMTMwMyw3IEBACiAJTFBLRVlTVFJVQ1QJbHBOZXh0S2V5LGxweGtleTsKIAlMUFdTVFIJCSp3cHM7CiAJaW50CQl3cGMsaTsKLQlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ09wZW5LZXlFeFcoJWx4LCVzLCVsZCwlbHgsJXApXG4iLAorCWRwcmludGZfcmVnKHN0ZGRlYiwiUmVnT3BlbktleUV4MzJXKCVseCwlcywlbGQsJWx4LCVwKVxuIiwKIAkJKExPTkcpaGtleSxXMkMobHBzelN1YktleSwwKSxkd1Jlc2VydmVkLHNhbURlc2lyZWQscmV0a2V5CiAJKTsKIApAQCAtNzc1LDIwICsxMzQwLDIwIEBACiB9CiAKIC8qIFJlZ09wZW5LZXlXCQkJW0FEVkFQSTMyLjE1MV0gKi8KLURXT1JEIFJlZ09wZW5LZXlXKAorRFdPUkQgUmVnT3BlbktleTMyVygKIAlIS0VZCWhrZXksCiAJTFBDV1NUUglscHN6U3ViS2V5LAogCUxQSEtFWQlyZXRrZXkKICkgewotCWRwcmludGZfcmVnKHN0ZGRlYiwiUmVnT3BlbktleVcoJWx4LCVzLCVwKVxuIiwKKwlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ09wZW5LZXkzMlcoJWx4LCVzLCVwKVxuIiwKIAkJKExPTkcpaGtleSxXMkMobHBzelN1YktleSwwKSxyZXRrZXkKIAkpOwotCXJldHVybiBSZWdPcGVuS2V5RXhXKGhrZXksbHBzelN1YktleSwwLEtFWV9BTExfQUNDRVNTLHJldGtleSk7CisJcmV0dXJuIFJlZ09wZW5LZXlFeDMyVyhoa2V5LGxwc3pTdWJLZXksMCxLRVlfQUxMX0FDQ0VTUyxyZXRrZXkpOwogfQogCiAKIC8qIFJlZ09wZW5LZXlFeEEJCVtBRFZBUEkzMi4xNDldICovCi1EV09SRCBSZWdPcGVuS2V5RXhBKAorRFdPUkQgUmVnT3BlbktleUV4MzJBKAogCUhLRVkJaGtleSwKIAlMUENTVFIJbHBzelN1YktleSwKIAlEV09SRAlkd1Jlc2VydmVkLApAQCAtNzk4LDQxICsxMzYzLDQxIEBACiAJTFBXU1RSCWxwc3pTdWJLZXlXOwogCURXT1JECXJldDsKIAotCWRwcmludGZfcmVnKHN0ZGRlYiwiUmVnT3BlbktleUV4QSglbHgsJXMsJWxkLCVseCwlcClcbiIsCisJZHByaW50Zl9yZWcoc3RkZGViLCJSZWdPcGVuS2V5RXgzMkEoJWx4LCVzLCVsZCwlbHgsJXApXG4iLAogCQkoTE9ORyloa2V5LGxwc3pTdWJLZXksZHdSZXNlcnZlZCxzYW1EZXNpcmVkLHJldGtleQogCSk7CiAJaWYgKGxwc3pTdWJLZXkpCiAJCWxwc3pTdWJLZXlXPXN0cmR1cEEyVyhscHN6U3ViS2V5KTsKIAllbHNlCiAJCWxwc3pTdWJLZXlXPU5VTEw7Ci0JcmV0PVJlZ09wZW5LZXlFeFcoaGtleSxscHN6U3ViS2V5Vyxkd1Jlc2VydmVkLHNhbURlc2lyZWQscmV0a2V5KTsKKwlyZXQ9UmVnT3BlbktleUV4MzJXKGhrZXksbHBzelN1YktleVcsZHdSZXNlcnZlZCxzYW1EZXNpcmVkLHJldGtleSk7CiAJaWYgKGxwc3pTdWJLZXlXKQogCQlmcmVlKGxwc3pTdWJLZXlXKTsKIAlyZXR1cm4gcmV0OwogfQogCiAvKiBSZWdPcGVuS2V5QQkJCVtBRFZBUEkzMi4xNDhdICovCi1EV09SRCBSZWdPcGVuS2V5QSgKK0RXT1JEIFJlZ09wZW5LZXkzMkEoCiAJSEtFWQloa2V5LAogCUxQQ1NUUglscHN6U3ViS2V5LAogCUxQSEtFWQlyZXRrZXkKICkgewotCWRwcmludGZfcmVnKHN0ZGRlYiwiUmVnT3BlbktleUEoJWx4LCVzLCVwKVxuIiwKKwlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ09wZW5LZXkzMkEoJWx4LCVzLCVwKVxuIiwKIAkJKExPTkcpaGtleSxscHN6U3ViS2V5LHJldGtleQogCSk7Ci0JcmV0dXJuCVJlZ09wZW5LZXlFeEEoaGtleSxscHN6U3ViS2V5LDAsS0VZX0FMTF9BQ0NFU1MscmV0a2V5KTsKKwlyZXR1cm4JUmVnT3BlbktleUV4MzJBKGhrZXksbHBzelN1YktleSwwLEtFWV9BTExfQUNDRVNTLHJldGtleSk7CiB9CiAKIC8qIFJlZ09wZW5LZXkJCQlbU0hFTEwuMV0gW0tFUk5FTC4yMTddICovCi1EV09SRCBSZWdPcGVuS2V5KAorRFdPUkQgUmVnT3BlbktleTE2KAogCUhLRVkJaGtleSwKIAlMUENTVFIJbHBzelN1YktleSwKIAlMUEhLRVkJcmV0a2V5CiApIHsKLQlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ09wZW5LZXkoJWx4LCVzLCVwKVxuIiwKKwlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ09wZW5LZXkxNiglbHgsJXMsJXApXG4iLAogCQkoTE9ORyloa2V5LGxwc3pTdWJLZXkscmV0a2V5CiAJKTsKLQlyZXR1cm4gUmVnT3BlbktleUEoaGtleSxscHN6U3ViS2V5LHJldGtleSk7CisJcmV0dXJuIFJlZ09wZW5LZXkzMkEoaGtleSxscHN6U3ViS2V5LHJldGtleSk7CiB9CiAKIC8qIApAQCAtODQ0LDEyICsxNDA5LDEyIEBACiAgKiBGSVhNRTogbm8gc2VjdXJpdHksbm8gYWNjZXNzIGF0dHJpYixubyBvcHRpb25oYW5kbGluZyB5ZXQuCiAgKgogICogQ2FsbHBhdGg6Ci0gKiBSZWdDcmVhdGVLZXkgLT4gUmVnQ3JlYXRlS2V5QSAtPiBSZWdDcmVhdGVLZXlFeEEgXAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnQ3JlYXRlS2V5VyAgIC0+IFJlZ0NyZWF0ZUtleUV4VworICogUmVnQ3JlYXRlS2V5MTYgLT4gUmVnQ3JlYXRlS2V5MzJBIC0+IFJlZ0NyZWF0ZUtleUV4MzJBIFwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdDcmVhdGVLZXkzMlcgICAtPiBSZWdDcmVhdGVLZXlFeDMyVwogICovCiAKIC8qIFJlZ0NyZWF0ZUtleUV4VwkJW0FEVkFQSTMyLjEzMV0gKi8KLURXT1JEIFJlZ0NyZWF0ZUtleUV4VygKK0RXT1JEIFJlZ0NyZWF0ZUtleUV4MzJXKAogCUhLRVkJaGtleSwKIAlMUENXU1RSCWxwc3pTdWJLZXksCiAJRFdPUkQJZHdSZXNlcnZlZCwKQEAgLTg2NSw3ICsxNDMwLDcgQEAKIAlpbnQJCXdwYyxpOwogCiAvKkZJWE1FOiBoYW5kbGUgc2VjdXJpdHkvYWNjZXNzL3doYXRldmVyICovCi0JZHByaW50Zl9yZWcoc3RkZGViLCJSZWdDcmVhdGVLZXlFeFcoJWx4LCVzLCVsZCwlcywlbHgsJWx4LCVwLCVwLCVwKVxuIiwKKwlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ0NyZWF0ZUtleUV4MzJXKCVseCwlcywlbGQsJXMsJWx4LCVseCwlcCwlcCwlcClcbiIsCiAJCShMT05HKWhrZXksCiAJCVcyQyhscHN6U3ViS2V5LDApLAogCQlkd1Jlc2VydmVkLApAQCAtOTQyLDYgKzE1MDcsNyBAQAogCQlscE5leHRLZXktPmNsYXNzID0gc3RyZHVwVyhscHN6Q2xhc3MpOwogCWVsc2UKIAkJbHBOZXh0S2V5LT5jbGFzcyA9IE5VTEw7CisJbHBOZXh0S2V5LT5mbGFnc3w9UkVHX09QVElPTl9UQUlOVEVEOwogCSpyZXRrZXkJCT0gY3VycmVudGhhbmRsZTsKIAkqbHBEaXNwb3MJPSBSRUdfQ1JFQVRFRF9ORVdfS0VZOwogCUZSRUVfS0VZX1BBVEg7CkBAIC05NDksMTcgKzE1MTUsMTcgQEAKIH0KIAogLyogUmVnQ3JlYXRlS2V5VwkJW0FEVkFQSTMyLjEzMl0gKi8KLURXT1JEIFJlZ0NyZWF0ZUtleVcoCitEV09SRCBSZWdDcmVhdGVLZXkzMlcoCiAJSEtFWQloa2V5LAogCUxQQ1dTVFIJbHBzelN1YktleSwKIAlMUEhLRVkJcmV0a2V5CiApIHsKIAlEV09SRAlqdW5rLHJldDsKIAotCWRwcmludGZfcmVnKHN0ZGRlYiwiUmVnQ3JlYXRlS2V5VyglbHgsJXMsJXApXG4iLAorCWRwcmludGZfcmVnKHN0ZGRlYiwiUmVnQ3JlYXRlS2V5MzJXKCVseCwlcywlcClcbiIsCiAJCShMT05HKWhrZXksVzJDKGxwc3pTdWJLZXksMCkscmV0a2V5CiAJKTsKLQlyZXQ9UmVnQ3JlYXRlS2V5RXhXKAorCXJldD1SZWdDcmVhdGVLZXlFeDMyVygKIAkJaGtleSwJCS8qIGtleSBoYW5kbGUgKi8KIAkJbHBzelN1YktleSwJLyogc3Via2V5IG5hbWUgKi8KIAkJMCwJCS8qIHJlc2VydmVkID0gMCAqLwpAQCAtOTc0LDcgKzE1NDAsNyBAQAogfQogCiAvKiBSZWdDcmVhdGVLZXlFeEEJCVtBRFZBUEkzMi4xMzBdICovCi1EV09SRCBSZWdDcmVhdGVLZXlFeEEoCitEV09SRCBSZWdDcmVhdGVLZXlFeDMyQSgKIAlIS0VZCWhrZXksCiAJTFBDU1RSCWxwc3pTdWJLZXksCiAJRFdPUkQJZHdSZXNlcnZlZCwKQEAgLTk4OCw3ICsxNTU0LDcgQEAKIAlMUFdTVFIJbHBzelN1YktleVcsbHBzekNsYXNzVzsKIAlEV09SRAlyZXQ7CiAKLQlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ0NyZWF0ZUtleUV4QSglbHgsJXMsJWxkLCVzLCVseCwlbHgsJXAsJXAsJXApXG4iLAorCWRwcmludGZfcmVnKHN0ZGRlYiwiUmVnQ3JlYXRlS2V5RXgzMkEoJWx4LCVzLCVsZCwlcywlbHgsJWx4LCVwLCVwLCVwKVxuIiwKIAkJKExPTkcpaGtleSwKIAkJbHBzelN1YktleSwKIAkJZHdSZXNlcnZlZCwKQEAgLTEwMDcsNyArMTU3Myw3IEBACiAJCWxwc3pDbGFzc1c9c3RyZHVwQTJXKGxwc3pDbGFzcyk7CiAJZWxzZQogCQlscHN6Q2xhc3NXPU5VTEw7Ci0JcmV0PVJlZ0NyZWF0ZUtleUV4VygKKwlyZXQ9UmVnQ3JlYXRlS2V5RXgzMlcoCiAJCWhrZXksCiAJCWxwc3pTdWJLZXlXLAogCQlkd1Jlc2VydmVkLApAQCAtMTAyNiwxNyArMTU5MiwxNyBAQAogfQogCiAvKiBSZWdDcmVhdGVLZXlBCQlbQURWQVBJMzIuMTI5XSAqLwotRFdPUkQgUmVnQ3JlYXRlS2V5QSgKK0RXT1JEIFJlZ0NyZWF0ZUtleTMyQSgKIAlIS0VZCWhrZXksCiAJTFBDU1RSCWxwc3pTdWJLZXksCiAJTFBIS0VZCXJldGtleQogKSB7CiAJRFdPUkQJanVuazsKIAotCWRwcmludGZfcmVnKHN0ZGRlYiwiUmVnQ3JlYXRlS2V5QSglbHgsJXMsJXApXG4iLAorCWRwcmludGZfcmVnKHN0ZGRlYiwiUmVnQ3JlYXRlS2V5MzJBKCVseCwlcywlcClcbiIsCiAJCShMT05HKWhrZXksbHBzelN1YktleSxyZXRrZXkKIAkpOwotCXJldHVybglSZWdDcmVhdGVLZXlFeEEoCisJcmV0dXJuCVJlZ0NyZWF0ZUtleUV4MzJBKAogCQloa2V5LAkJLyoga2V5IGhhbmRsZSAqLwogCQlscHN6U3ViS2V5LAkvKiBzdWJrZXkgbmFtZSAqLwogCQkwLAkJLyogcmVzZXJ2ZWQgPSAwICovCkBAIC0xMDUwLDE1ICsxNjE2LDE1IEBACiB9CiAKIC8qIFJlZ0NyZWF0ZUtleQkJCVtTSEVMTC4yXSBbS0VSTkVMLjIxOF0gKi8KLURXT1JEIFJlZ0NyZWF0ZUtleSgKK0RXT1JEIFJlZ0NyZWF0ZUtleTE2KAogCUhLRVkJaGtleSwKIAlMUENTVFIJbHBzelN1YktleSwKIAlMUEhLRVkJcmV0a2V5CiApIHsKLQlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ0NyZWF0ZUtleSglbHgsJXMsJXApXG4iLAorCWRwcmludGZfcmVnKHN0ZGRlYiwiUmVnQ3JlYXRlS2V5MTYoJWx4LCVzLCVwKVxuIiwKIAkJKExPTkcpaGtleSxscHN6U3ViS2V5LHJldGtleQogCSk7Ci0JcmV0dXJuIFJlZ0NyZWF0ZUtleUEoaGtleSxscHN6U3ViS2V5LHJldGtleSk7CisJcmV0dXJuIFJlZ0NyZWF0ZUtleTMyQShoa2V5LGxwc3pTdWJLZXkscmV0a2V5KTsKIH0KIAogLyogCkBAIC0xMDY5LDEyICsxNjM1LDEyIEBACiAgKiBjb21wYXQgZnVuY3Rpb25zLgogICoKICAqIENhbGxwYXRoOgotICogUmVnUXVlcnlWYWx1ZSAtPiBSZWdRdWVyeVZhbHVlQSAtPiBSZWdRdWVyeVZhbHVlRXhBIFwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnUXVlcnlWYWx1ZVcgICAtPiBSZWdRdWVyeVZhbHVlRXhXCisgKiBSZWdRdWVyeVZhbHVlMTYgLT4gUmVnUXVlcnlWYWx1ZTMyQSAtPiBSZWdRdWVyeVZhbHVlRXgzMkEgXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdRdWVyeVZhbHVlMzJXIC0+IFJlZ1F1ZXJ5VmFsdWVFeDMyVwogICovCiAKIC8qIFJlZ1F1ZXJ5VmFsdWVFeFcJCVtBRFZBUEkzMi4xNThdICovCi1EV09SRCBSZWdRdWVyeVZhbHVlRXhXKAorRFdPUkQgUmVnUXVlcnlWYWx1ZUV4MzJXKAogCUhLRVkJaGtleSwKIAlMUFdTVFIJbHBzelZhbHVlTmFtZSwKIAlMUERXT1JECWxwZHdSZXNlcnZlZCwKQEAgLTEwODUsNyArMTY1MSw3IEBACiAJTFBLRVlTVFJVQ1QJbHBrZXk7CiAJaW50CQlpOwogCi0JZHByaW50Zl9yZWcoc3RkZGViLCJSZWdRdWVyeVZhbHVlRXhXKCV4LCVzLCVwLCVwLCVwLCVwKVxuIiwKKwlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ1F1ZXJ5VmFsdWVFeDMyVygleCwlcywlcCwlcCwlcCwlcClcbiIsCiAJCWhrZXksVzJDKGxwc3pWYWx1ZU5hbWUsMCksbHBkd1Jlc2VydmVkLGxwZHdUeXBlLGxwYkRhdGEsbHBjYkRhdGEKIAkpOwogCkBAIC0xMTMwLDcgKzE2OTYsNyBAQAogfQogCiAvKiBSZWdRdWVyeVZhbHVlVwkJW0FEVkFQSTMyLjE1OV0gKi8KLURXT1JEIFJlZ1F1ZXJ5VmFsdWVXKAorRFdPUkQgUmVnUXVlcnlWYWx1ZTMyVygKIAlIS0VZCWhrZXksCiAJTFBXU1RSCWxwc3pTdWJLZXksCiAJTFBXU1RSCWxwc3pEYXRhLApAQCAtMTEzOSwyMCArMTcwNSwyMCBAQAogCUhLRVkJeGhrZXk7CiAJRFdPUkQJcmV0LGxwZHdUeXBlOwogCi0JZHByaW50Zl9yZWcoc3RkZGViLCJSZWdRdWVyeVZhbHVlVygleCwlcywlcCwlcClcbi0+IiwKKwlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ1F1ZXJ5VmFsdWUzMlcoJXgsJXMsJXAsJXApXG4tPiIsCiAJCWhrZXksVzJDKGxwc3pTdWJLZXksMCksbHBzekRhdGEsbHBjYkRhdGEKIAkpOwogCiAJLyogb25seSBvcGVuIHN1YmtleSwgaWYgd2UgcmVhbGx5IGRvIGRlc2NlbmQgKi8KIAlpZiAobHBzelN1YktleSAmJiAqbHBzelN1YktleSkgewotCQlyZXQJPSBSZWdPcGVuS2V5Vyhoa2V5LGxwc3pTdWJLZXksJnhoa2V5KTsKKwkJcmV0CT0gUmVnT3BlbktleTMyVyhoa2V5LGxwc3pTdWJLZXksJnhoa2V5KTsKIAkJaWYgKHJldCE9RVJST1JfU1VDQ0VTUykKIAkJCXJldHVybiByZXQ7CiAJfSBlbHNlCiAJCXhoa2V5CT0gaGtleTsKIAogCWxwZHdUeXBlCT0gUkVHX1NaOwotCXJldAk9IFJlZ1F1ZXJ5VmFsdWVFeFcoCisJcmV0CT0gUmVnUXVlcnlWYWx1ZUV4MzJXKAogCQl4aGtleSwKIAkJTlVMTCwJCS8qIHZhcm5hbWUgTlVMTCAtPiBjb21wYXQgKi8KIAkJTlVMTCwJCS8qIGxwZHdSZXNlcnZlZCwgbXVzdCBiZSBOVUxMICovCkBAIC0xMTY2LDcgKzE3MzIsNyBAQAogfQogCiAvKiBSZWdRdWVyeVZhbHVlRXhBCQlbQURWQVBJMzIuMTU3XSAqLwotRFdPUkQgUmVnUXVlcnlWYWx1ZUV4QSgKK0RXT1JEIFJlZ1F1ZXJ5VmFsdWVFeDMyQSgKIAlIS0VZCWhrZXksCiAJTFBTVFIJbHBzelZhbHVlTmFtZSwKIAlMUERXT1JECWxwZHdSZXNlcnZlZCwKQEAgLTExNzksNyArMTc0NSw3IEBACiAJRFdPUkQJcmV0LG15eGxlbjsKIAlEV09SRAkqbXlsZW47CiAKLQlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ1F1ZXJ5VmFsdWVFeEEoJXgsJXMsJXAsJXAsJXAsJXApXG4tPiIsCisJZHByaW50Zl9yZWcoc3RkZGViLCJSZWdRdWVyeVZhbHVlRXgzMkEoJXgsJXMsJXAsJXAsJXAsJXApXG4tPiIsCiAJCWhrZXksbHBzelZhbHVlTmFtZSxscGR3UmVzZXJ2ZWQsbHBkd1R5cGUsbHBiRGF0YSxscGNiRGF0YQogCSk7CiAJaWYgKGxwYkRhdGEpIHsKQEAgLTEyMDAsNyArMTc2Niw3IEBACiAJZWxzZSAKIAkJbHBzelZhbHVlTmFtZVc9TlVMTDsKIAotCXJldD1SZWdRdWVyeVZhbHVlRXhXKAorCXJldD1SZWdRdWVyeVZhbHVlRXgzMlcoCiAJCWhrZXksCiAJCWxwc3pWYWx1ZU5hbWVXLAogCQlscGR3UmVzZXJ2ZWQsCkBAIC0xMjM3LDcgKzE4MDMsNyBAQAogfQogCiAvKiBSZWdRdWVyeVZhbHVlRXgJCVtLRVJORUwuMjI1XSAqLwotRFdPUkQgUmVnUXVlcnlWYWx1ZUV4KAorRFdPUkQgUmVnUXVlcnlWYWx1ZUV4MTYoCiAJSEtFWQloa2V5LAogCUxQU1RSCWxwc3pWYWx1ZU5hbWUsCiAJTFBEV09SRAlscGR3UmVzZXJ2ZWQsCkBAIC0xMjQ1LDEwICsxODExLDEwIEBACiAJTFBCWVRFCWxwYkRhdGEsCiAJTFBEV09SRAlscGNiRGF0YQogKSB7Ci0JZHByaW50Zl9yZWcoc3RkZGViLCJSZWdRdWVyeVZhbHVlRXgoJXgsJXMsJXAsJXAsJXAsJXApXG4iLAorCWRwcmludGZfcmVnKHN0ZGRlYiwiUmVnUXVlcnlWYWx1ZUV4MTYoJXgsJXMsJXAsJXAsJXAsJXApXG4iLAogCQloa2V5LGxwc3pWYWx1ZU5hbWUsbHBkd1Jlc2VydmVkLGxwZHdUeXBlLGxwYkRhdGEsbHBjYkRhdGEKIAkpOwotCXJldHVybiBSZWdRdWVyeVZhbHVlRXhBKAkKKwlyZXR1cm4gUmVnUXVlcnlWYWx1ZUV4MzJBKAogCQloa2V5LAogCQlscHN6VmFsdWVOYW1lLAogCQlscGR3UmVzZXJ2ZWQsCkBAIC0xMjU5LDcgKzE4MjUsNyBAQAogfQogCiAvKiBSZWdRdWVyeVZhbHVlQQkJW0FEVkFQSTMyLjE1Nl0gKi8KLURXT1JEIFJlZ1F1ZXJ5VmFsdWVBKAorRFdPUkQgUmVnUXVlcnlWYWx1ZTMyQSgKIAlIS0VZCWhrZXksCiAJTFBTVFIJbHBzelN1YktleSwKIAlMUFNUUglscHN6RGF0YSwKQEAgLTEyNjgsMjAgKzE4MzQsMjAgQEAKIAlIS0VZCXhoa2V5OwogCURXT1JECXJldCxscGR3VHlwZTsKIAotCWRwcmludGZfcmVnKHN0ZGRlYiwiUmVnUXVlcnlWYWx1ZUEoJXgsJXMsJXAsJXApXG4iLAorCWRwcmludGZfcmVnKHN0ZGRlYiwiUmVnUXVlcnlWYWx1ZTMyQSgleCwlcywlcCwlcClcbiIsCiAJCWhrZXksbHBzelN1YktleSxscHN6RGF0YSxscGNiRGF0YQogCSk7CiAKIAkvKiBvbmx5IG9wZW4gc3Via2V5LCBpZiB3ZSByZWFsbHkgZG8gZGVzY2VuZCAqLwogCWlmIChscHN6U3ViS2V5ICYmICpscHN6U3ViS2V5KSB7Ci0JCXJldAk9IFJlZ09wZW5LZXkoaGtleSxscHN6U3ViS2V5LCZ4aGtleSk7CisJCXJldAk9IFJlZ09wZW5LZXkxNihoa2V5LGxwc3pTdWJLZXksJnhoa2V5KTsKIAkJaWYgKHJldCE9RVJST1JfU1VDQ0VTUykKIAkJCXJldHVybiByZXQ7CiAJfSBlbHNlCiAJCXhoa2V5CT0gaGtleTsKIAogCWxwZHdUeXBlCT0gUkVHX1NaOwotCXJldAk9IFJlZ1F1ZXJ5VmFsdWVFeEEoCisJcmV0CT0gUmVnUXVlcnlWYWx1ZUV4MzJBKAogCQl4aGtleSwKIAkJTlVMTCwJCS8qIGxwc3pWYWx1ZU5hbWUgTlVMTCAtPiBjb21wYXQgKi8KIAkJTlVMTCwJCS8qIGxwZHdSZXNlcnZlZCwgbXVzdCBiZSBOVUxMICovCkBAIC0xMjk1LDI4ICsxODYxLDI4IEBACiB9CiAKIC8qIFJlZ1F1ZXJ5VmFsdWUJCVtTSEVMTC42XSBbS0VSTkVMLjIyNF0gKi8KLURXT1JEIFJlZ1F1ZXJ5VmFsdWUoCitEV09SRCBSZWdRdWVyeVZhbHVlMTYoCiAJSEtFWQloa2V5LAogCUxQU1RSCWxwc3pTdWJLZXksCiAJTFBTVFIJbHBzekRhdGEsCiAJTFBEV09SRAlscGNiRGF0YQogKSB7Ci0JZHByaW50Zl9yZWcoc3RkZGViLCJSZWdRdWVyeVZhbHVlQSgleCwlcywlcCwlcClcbiIsCisJZHByaW50Zl9yZWcoc3RkZGViLCJSZWdRdWVyeVZhbHVlMTYoJXgsJXMsJXAsJXApXG4iLAogCQloa2V5LGxwc3pTdWJLZXksbHBzekRhdGEsbHBjYkRhdGEKIAkpOwotCXJldHVybiBSZWdRdWVyeVZhbHVlQShoa2V5LGxwc3pTdWJLZXksbHBzekRhdGEsbHBjYkRhdGEpOworCXJldHVybiBSZWdRdWVyeVZhbHVlMzJBKGhrZXksbHBzelN1YktleSxscHN6RGF0YSxscGNiRGF0YSk7CiB9CiAKIC8qCiAgKiBTZXR0aW5nIHZhbHVlcyBvZiBSZWdpc3RyeSBrZXlzCiAgKgogICogQ2FsbHBhdGg6Ci0gKiBSZWdTZXRWYWx1ZSAtPiBSZWdTZXRWYWx1ZUEgLT4gUmVnU2V0VmFsdWVFeEEgXAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ1NldFZhbHVlVyAgIC0+IFJlZ1NldFZhbHVlRXhXCisgKiBSZWdTZXRWYWx1ZTE2IC0+IFJlZ1NldFZhbHVlMzJBIC0+IFJlZ1NldFZhbHVlRXgzMkEgXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdTZXRWYWx1ZTMyVyAgIC0+IFJlZ1NldFZhbHVlRXgzMlcKICAqLwogCiAvKiBSZWdTZXRWYWx1ZUV4VwkJW0FEVkFQSTMyLjE3MF0gKi8KLURXT1JEIFJlZ1NldFZhbHVlRXhXKAorRFdPUkQgUmVnU2V0VmFsdWVFeDMyVygKIAlIS0VZCWhrZXksCiAJTFBXU1RSCWxwc3pWYWx1ZU5hbWUsCiAJRFdPUkQJZHdSZXNlcnZlZCwKQEAgLTEzMjcsMTMgKzE4OTMsMTYgQEAKIAlMUEtFWVNUUlVDVAlscGtleTsKIAlpbnQJCWk7CiAKLQlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ1NldFZhbHVlRXhXKCV4LCVzLCVsZCwlbGQsJXAsJWxkKVxuIiwKKwlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ1NldFZhbHVlRXgzMlcoJXgsJXMsJWxkLCVsZCwlcCwlbGQpXG4iLAogCQloa2V5LFcyQyhscHN6VmFsdWVOYW1lLDApLGR3UmVzZXJ2ZWQsZHdUeXBlLGxwYkRhdGEsY2JEYXRhCiAJKTsKLQkvKiB3ZSBubyBsb25nZXIgY2FyZSBhYm91dCB0aGUgbHBiRGF0YSBkd1R5cGUgaGVyZS4uLiAqLworCS8qIHdlIG5vIGxvbmdlciBjYXJlIGFib3V0IHRoZSBscGJEYXRhIHR5cGUgaGVyZS4uLiAqLwogCWxwa2V5CT0gbG9va3VwX2hrZXkoaGtleSk7CiAJaWYgKCFscGtleSkKIAkJcmV0dXJuIFNIRUxMX0VSUk9SX0JBREtFWTsKKworCWxwa2V5LT5mbGFncyB8PSBSRUdfT1BUSU9OX1RBSU5URUQ7CisKIAlpZiAobHBzelZhbHVlTmFtZT09TlVMTCkgewogCQlmb3IgKGk9MDtpPGxwa2V5LT5ucm9mdmFsdWVzO2krKykKIAkJCWlmIChscGtleS0+dmFsdWVzW2ldLm5hbWU9PU5VTEwpCkBAIC0xMzY3LDcgKzE5MzYsNyBAQAogfQogCiAvKiBSZWdTZXRWYWx1ZUV4QQkJW0FEVkFQSTMyLjE2OV0gKi8KLURXT1JEIFJlZ1NldFZhbHVlRXhBKAorRFdPUkQgUmVnU2V0VmFsdWVFeDMyQSgKIAlIS0VZCWhrZXksCiAJTFBTVFIJbHBzelZhbHVlTmFtZSwKIAlEV09SRAlkd1Jlc2VydmVkLApAQCAtMTM3OSw3ICsxOTQ4LDcgQEAKIAlMUFdTVFIJbHBzelZhbHVlTmFtZVc7CiAJRFdPUkQJcmV0OwogCi0JZHByaW50Zl9yZWcoc3RkZGViLCJSZWdTZXRWYWx1ZUV4QSgleCwlcywlbGQsJWxkLCVwLCVsZClcbi0+IiwKKwlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ1NldFZhbHVlRXgzMkEoJXgsJXMsJWxkLCVsZCwlcCwlbGQpXG4tPiIsCiAJCWhrZXksbHBzelZhbHVlTmFtZSxkd1Jlc2VydmVkLGR3VHlwZSxscGJEYXRhLGNiRGF0YQogCSk7CiAJaWYgKCgxPDxkd1R5cGUpICYgVU5JQ09OVk1BU0spIHsKQEAgLTEzOTEsNyArMTk2MCw3IEBACiAJCWxwc3pWYWx1ZU5hbWVXID0gc3RyZHVwQTJXKGxwc3pWYWx1ZU5hbWUpOwogCWVsc2UKIAkJbHBzelZhbHVlTmFtZVcgPSBOVUxMOwotCXJldD1SZWdTZXRWYWx1ZUV4Vyhoa2V5LGxwc3pWYWx1ZU5hbWVXLGR3UmVzZXJ2ZWQsZHdUeXBlLGJ1ZixjYkRhdGEpOworCXJldD1SZWdTZXRWYWx1ZUV4MzJXKGhrZXksbHBzelZhbHVlTmFtZVcsZHdSZXNlcnZlZCxkd1R5cGUsYnVmLGNiRGF0YSk7CiAJaWYgKGxwc3pWYWx1ZU5hbWVXKQogCQlmcmVlKGxwc3pWYWx1ZU5hbWVXKTsKIAlpZiAoYnVmIT1scGJEYXRhKQpAQCAtMTQwMCw3ICsxOTY5LDcgQEAKIH0KIAogLyogUmVnU2V0VmFsdWVFeAkJW0tFUk5FTC4yMjZdICovCi1EV09SRCBSZWdTZXRWYWx1ZUV4KAorRFdPUkQgUmVnU2V0VmFsdWVFeDE2KAogCUhLRVkJaGtleSwKIAlMUFNUUglscHN6VmFsdWVOYW1lLAogCURXT1JECWR3UmVzZXJ2ZWQsCkBAIC0xNDA4LDE0ICsxOTc3LDE0IEBACiAJTFBCWVRFCWxwYkRhdGEsCiAJRFdPUkQJY2JEYXRhCiApIHsKLQlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ1NldFZhbHVlRXgoJXgsJXMsJWxkLCVsZCwlcCwlbGQpXG4tPiIsCisJZHByaW50Zl9yZWcoc3RkZGViLCJSZWdTZXRWYWx1ZUV4MTYoJXgsJXMsJWxkLCVsZCwlcCwlbGQpXG4tPiIsCiAJCWhrZXksbHBzelZhbHVlTmFtZSxkd1Jlc2VydmVkLGR3VHlwZSxscGJEYXRhLGNiRGF0YQogCSk7Ci0JcmV0dXJuIFJlZ1NldFZhbHVlRXhBKGhrZXksbHBzelZhbHVlTmFtZSxkd1Jlc2VydmVkLGR3VHlwZSxscGJEYXRhLGNiRGF0YSk7CisJcmV0dXJuIFJlZ1NldFZhbHVlRXgzMkEoaGtleSxscHN6VmFsdWVOYW1lLGR3UmVzZXJ2ZWQsZHdUeXBlLGxwYkRhdGEsY2JEYXRhKTsKIH0KIAogLyogUmVnU2V0VmFsdWVXCQkJW0FEVkFQSTMyLjE3MV0gKi8KLURXT1JEIFJlZ1NldFZhbHVlVygKK0RXT1JEIFJlZ1NldFZhbHVlMzJXKAogCUhLRVkJaGtleSwKIAlMUENXU1RSCWxwc3pTdWJLZXksCiAJRFdPUkQJZHdUeXBlLApAQCAtMTQyNSwxMSArMTk5NCwxMSBAQAogCUhLRVkJeGhrZXk7CiAJRFdPUkQJcmV0OwogCi0JZHByaW50Zl9yZWcoc3RkZGViLCJSZWdTZXRWYWx1ZVcoJXgsJXMsJWxkLCVzLCVsZClcbi0+IiwKKwlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ1NldFZhbHVlMzJXKCV4LCVzLCVsZCwlcywlbGQpXG4tPiIsCiAJCWhrZXksVzJDKGxwc3pTdWJLZXksMCksZHdUeXBlLFcyQyhscHN6RGF0YSwwKSxjYkRhdGEKIAkpOwogCWlmIChscHN6U3ViS2V5ICYmICpscHN6U3ViS2V5KSB7Ci0JCXJldD1SZWdDcmVhdGVLZXlXKGhrZXksbHBzelN1YktleSwmeGhrZXkpOworCQlyZXQ9UmVnQ3JlYXRlS2V5MzJXKGhrZXksbHBzelN1YktleSwmeGhrZXkpOwogCQlpZiAocmV0IT1FUlJPUl9TVUNDRVNTKQogCQkJcmV0dXJuIHJldDsKIAl9IGVsc2UKQEAgLTE0NDQsMTQgKzIwMTMsMTQgQEAKIAkJKTsKIAkJY2JEYXRhPTIqc3RybGVuVyhscHN6RGF0YSkrMjsKIAl9Ci0JcmV0PVJlZ1NldFZhbHVlRXhXKHhoa2V5LE5VTEwsMCxkd1R5cGUsKExQQllURSlscHN6RGF0YSxjYkRhdGEpOworCXJldD1SZWdTZXRWYWx1ZUV4MzJXKHhoa2V5LE5VTEwsMCxkd1R5cGUsKExQQllURSlscHN6RGF0YSxjYkRhdGEpOwogCWlmIChoa2V5IT14aGtleSkKIAkJUmVnQ2xvc2VLZXkoeGhrZXkpOwogCXJldHVybiByZXQ7CiAKIH0KIC8qIFJlZ1NldFZhbHVlQQkJCVtBRFZBUEkzMi4xNjhdICovCi1EV09SRCBSZWdTZXRWYWx1ZUEoCitEV09SRCBSZWdTZXRWYWx1ZTMyQSgKIAlIS0VZCWhrZXksCiAJTFBDU1RSCWxwc3pTdWJLZXksCiAJRFdPUkQJZHdUeXBlLApAQCAtMTQ2MSwxMSArMjAzMCwxMSBAQAogCURXT1JECXJldDsKIAlIS0VZCXhoa2V5OwogCi0JZHByaW50Zl9yZWcoc3RkZGViLCJSZWdTZXRWYWx1ZUEoJXgsJXMsJWxkLCVzLCVsZClcbi0+IiwKKwlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ1NldFZhbHVlMzJBKCV4LCVzLCVsZCwlcywlbGQpXG4tPiIsCiAJCWhrZXksbHBzelN1YktleSxkd1R5cGUsbHBzekRhdGEsY2JEYXRhCiAJKTsKIAlpZiAobHBzelN1YktleSAmJiAqbHBzelN1YktleSkgewotCQlyZXQ9UmVnQ3JlYXRlS2V5KGhrZXksbHBzelN1YktleSwmeGhrZXkpOworCQlyZXQ9UmVnQ3JlYXRlS2V5MTYoaGtleSxscHN6U3ViS2V5LCZ4aGtleSk7CiAJCWlmIChyZXQhPUVSUk9SX1NVQ0NFU1MpCiAJCQlyZXR1cm4gcmV0OwogCX0gZWxzZQpAQCAtMTQ3NywxNCArMjA0NiwxNCBAQAogCX0KIAlpZiAoY2JEYXRhIT1zdHJsZW4obHBzekRhdGEpKzEpCiAJCWNiRGF0YT1zdHJsZW4obHBzekRhdGEpKzE7Ci0JcmV0PVJlZ1NldFZhbHVlRXhBKHhoa2V5LE5VTEwsMCxkd1R5cGUsKExQQllURSlscHN6RGF0YSxjYkRhdGEpOworCXJldD1SZWdTZXRWYWx1ZUV4MzJBKHhoa2V5LE5VTEwsMCxkd1R5cGUsKExQQllURSlscHN6RGF0YSxjYkRhdGEpOwogCWlmICh4aGtleSE9aGtleSkKIAkJUmVnQ2xvc2VLZXkoeGhrZXkpOwogCXJldHVybiByZXQ7CiB9CiAKIC8qIFJlZ1NldFZhbHVlCQkJW0tFUk5FTC4yMjFdIFtTSEVMTC41XSAqLwotRFdPUkQgUmVnU2V0VmFsdWUoCitEV09SRCBSZWdTZXRWYWx1ZTE2KAogCUhLRVkJaGtleSwKIAlMUENTVFIJbHBzelN1YktleSwKIAlEV09SRAlkd1R5cGUsCkBAIC0xNDkyLDEwICsyMDYxLDEwIEBACiAJRFdPUkQJY2JEYXRhCiApIHsKIAlEV09SRAlyZXQ7Ci0JZHByaW50Zl9yZWcoc3RkZGViLCJSZWdTZXRWYWx1ZSgleCwlcywlbGQsJXMsJWxkKVxuLT4iLAorCWRwcmludGZfcmVnKHN0ZGRlYiwiUmVnU2V0VmFsdWUxNigleCwlcywlbGQsJXMsJWxkKVxuLT4iLAogCQloa2V5LGxwc3pTdWJLZXksZHdUeXBlLGxwc3pEYXRhLGNiRGF0YQogCSk7Ci0JcmV0PVJlZ1NldFZhbHVlQShoa2V5LGxwc3pTdWJLZXksZHdUeXBlLGxwc3pEYXRhLGNiRGF0YSk7CisJcmV0PVJlZ1NldFZhbHVlMzJBKGhrZXksbHBzelN1YktleSxkd1R5cGUsbHBzekRhdGEsY2JEYXRhKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xNTAzLDEyICsyMDcyLDEyIEBACiAgKiBLZXkgRW51bWVyYXRpb24KICAqCiAgKiBDYWxscGF0aDoKLSAqIFJlZ0VudW1LZXkgLT4gUmVnRW51bUtleUEgLT4gUmVnRW51bUtleUV4QSBcCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ0VudW1LZXlXICAgLT4gUmVnRW51bUtleUV4VworICogUmVnRW51bUtleTE2IC0+IFJlZ0VudW1LZXkzMkEgLT4gUmVnRW51bUtleUV4MzJBIFwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnRW51bUtleTMyVyAgIC0+IFJlZ0VudW1LZXlFeDMyVwogICovCiAKIC8qIFJlZ0VudW1LZXlFeFcJCVtBRFZBUEkzMi4xMzldICovCi1EV09SRCBSZWdFbnVtS2V5RXhXKAorRFdPUkQgUmVnRW51bUtleUV4MzJXKAogCUhLRVkJaGtleSwKIAlEV09SRAlpU3Via2V5LAogCUxQV1NUUglscHN6TmFtZSwKQEAgLTE1MjAsNyArMjA4OSw3IEBACiApIHsKIAlMUEtFWVNUUlVDVAlscGtleSxscHhrZXk7CiAKLQlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ0VudW1LZXlFeFcoJXgsJWxkLCVwLCVsZCwlcCwlcCwlcCwlcClcbiIsCisJZHByaW50Zl9yZWcoc3RkZGViLCJSZWdFbnVtS2V5RXgzMlcoJXgsJWxkLCVwLCVsZCwlcCwlcCwlcCwlcClcbiIsCiAJCWhrZXksaVN1YmtleSxscHN6TmFtZSwqbHBjY2hOYW1lLGxwZHdSZXNlcnZlZCxscHN6Q2xhc3MsbHBjY2hDbGFzcyxmdAogCSk7CiAJbHBrZXk9bG9va3VwX2hrZXkoaGtleSk7CkBAIC0xNTQ4LDcgKzIxMTcsNyBAQAogfQogCiAvKiBSZWdFbnVtS2V5VwkJCVtBRFZBUEkzMi4xNDBdICovCi1EV09SRCBSZWdFbnVtS2V5VygKK0RXT1JEIFJlZ0VudW1LZXkzMlcoCiAJSEtFWQloa2V5LAogCURXT1JECWlTdWJrZXksCiAJTFBXU1RSCWxwc3pOYW1lLApAQCAtMTU1NiwxMyArMjEyNSwxMyBAQAogKSB7CiAJRklMRVRJTUUJZnQ7CiAKLQlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ0VudW1LZXlXKCV4LCVsZCwlcCwlbGQpXG4tPiIsCisJZHByaW50Zl9yZWcoc3RkZGViLCJSZWdFbnVtS2V5MzJXKCV4LCVsZCwlcCwlbGQpXG4tPiIsCiAJCWhrZXksaVN1YmtleSxscHN6TmFtZSxscGNjaE5hbWUKIAkpOwotCXJldHVybiBSZWdFbnVtS2V5RXhXKGhrZXksaVN1YmtleSxscHN6TmFtZSwmbHBjY2hOYW1lLE5VTEwsTlVMTCxOVUxMLCZmdCk7CisJcmV0dXJuIFJlZ0VudW1LZXlFeDMyVyhoa2V5LGlTdWJrZXksbHBzek5hbWUsJmxwY2NoTmFtZSxOVUxMLE5VTEwsTlVMTCwmZnQpOwogfQogLyogUmVnRW51bUtleUV4QQkJW0FEVkFQSTMyLjEzOF0gKi8KLURXT1JEIFJlZ0VudW1LZXlFeEEoCitEV09SRCBSZWdFbnVtS2V5RXgzMkEoCiAJSEtFWQloa2V5LAogCURXT1JECWlTdWJrZXksCiAJTFBTVFIJbHBzek5hbWUsCkBAIC0xNTc2LDcgKzIxNDUsNyBAQAogCUxQV1NUUglscHN6TmFtZVcsbHBzekNsYXNzVzsKIAogCi0JZHByaW50Zl9yZWcoc3RkZGViLCJSZWdFbnVtS2V5RXhBKCV4LCVsZCwlcCwlbGQsJXAsJXAsJXAsJXApXG4tPiIsCisJZHByaW50Zl9yZWcoc3RkZGViLCJSZWdFbnVtS2V5RXgzMkEoJXgsJWxkLCVwLCVsZCwlcCwlcCwlcCwlcClcbi0+IiwKIAkJaGtleSxpU3Via2V5LGxwc3pOYW1lLCpscGNjaE5hbWUsbHBkd1Jlc2VydmVkLGxwc3pDbGFzcyxscGNjaENsYXNzLGZ0CiAJKTsKIAlpZiAobHBzek5hbWUpIHsKQEAgLTE1OTMsNyArMjE2Miw3IEBACiAJCWxwc3pDbGFzc1cJPTA7CiAJCWxwY2NoQ2xhc3NXPTA7CiAJfQotCXJldD1SZWdFbnVtS2V5RXhXKAorCXJldD1SZWdFbnVtS2V5RXgzMlcoCiAJCWhrZXksCiAJCWlTdWJrZXksCiAJCWxwc3pOYW1lVywKQEAgLTE2MTksNyArMjE4OCw3IEBACiB9CiAKIC8qIFJlZ0VudW1LZXlBCQkJW0FEVkFQSTMyLjEzN10gKi8KLURXT1JEIFJlZ0VudW1LZXlBKAorRFdPUkQgUmVnRW51bUtleTMyQSgKIAlIS0VZCWhrZXksCiAJRFdPUkQJaVN1YmtleSwKIAlMUFNUUglscHN6TmFtZSwKQEAgLTE2MjcsMTAgKzIxOTYsMTAgQEAKICkgewogCUZJTEVUSU1FCWZ0OwogCi0JZHByaW50Zl9yZWcoc3RkZGViLCJSZWdFbnVtS2V5QSgleCwlbGQsJXAsJWxkKVxuLT4iLAorCWRwcmludGZfcmVnKHN0ZGRlYiwiUmVnRW51bUtleTMyQSgleCwlbGQsJXAsJWxkKVxuLT4iLAogCQloa2V5LGlTdWJrZXksbHBzek5hbWUsbHBjY2hOYW1lCiAJKTsKLQlyZXR1cm4JUmVnRW51bUtleUV4QSgKKwlyZXR1cm4JUmVnRW51bUtleUV4MzJBKAogCQloa2V5LAogCQlpU3Via2V5LAogCQlscHN6TmFtZSwKQEAgLTE2NDMsMjcgKzIyMTIsMjcgQEAKIH0KIAogLyogUmVnRW51bUtleQkJCVtTSEVMTC43XSBbS0VSTkVMLjIxNl0gKi8KLURXT1JEIFJlZ0VudW1LZXkoCitEV09SRCBSZWdFbnVtS2V5MTYoCiAJSEtFWQloa2V5LAogCURXT1JECWlTdWJrZXksCiAJTFBTVFIJbHBzek5hbWUsCiAJRFdPUkQJbHBjY2hOYW1lCiApIHsKLQlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ0VudW1LZXkoJXgsJWxkLCVwLCVsZClcbi0+IiwKKwlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ0VudW1LZXkxNigleCwlbGQsJXAsJWxkKVxuLT4iLAogCQloa2V5LGlTdWJrZXksbHBzek5hbWUsbHBjY2hOYW1lCiAJKTsKLQlyZXR1cm4gUmVnRW51bUtleUEoaGtleSxpU3Via2V5LGxwc3pOYW1lLGxwY2NoTmFtZSk7CisJcmV0dXJuIFJlZ0VudW1LZXkzMkEoaGtleSxpU3Via2V5LGxwc3pOYW1lLGxwY2NoTmFtZSk7CiB9CiAKIC8qIAogICogRW51bWVyYXRlIFJlZ2lzdHJ5IFZhbHVlcwogICoKICAqIENhbGxwYXRoOgotICogUmVnRW51bVZhbHVlIC0+IFJlZ0VudW1WYWx1ZUEgLT4gUmVnRW51bVZhbHVlVworICogUmVnRW51bVZhbHVlMTYgLT4gUmVnRW51bVZhbHVlMzJBIC0+IFJlZ0VudW1WYWx1ZTMyVwogICovCiAKIC8qIFJlZ0VudW1WYWx1ZVcJCVtBRFZBUEkzMi4xNDJdICovCi1EV09SRCBSZWdFbnVtVmFsdWVXKAorRFdPUkQgUmVnRW51bVZhbHVlMzJXKAogCUhLRVkJaGtleSwKIAlEV09SRAlpVmFsdWUsCiAJTFBXU1RSCWxwc3pWYWx1ZSwKQEAgLTE2NzYsNyArMjI0NSw3IEBACiAJTFBLRVlTVFJVQ1QJbHBrZXk7CiAJTFBLRVlWQUxVRQl2YWw7CiAKLQlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ0VudW1WYWx1ZVcoJXgsJWxkLCVwLCVwLCVwLCVwLCVwLCVwKVxuIiwKKwlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ0VudW1WYWx1ZTMyVygleCwlbGQsJXAsJXAsJXAsJXAsJXAsJXApXG4iLAogCQloa2V5LGlWYWx1ZSxscHN6VmFsdWUsbHBjY2hWYWx1ZSxscGRSZXNlcnZlZCxscGR3VHlwZSxscGJEYXRhLGxwY2JEYXRhCiAJKTsKIAlscGtleSA9IGxvb2t1cF9oa2V5KGhrZXkpOwpAQCAtMTcwOSw3ICsyMjc4LDcgQEAKIH0KIAogLyogUmVnRW51bVZhbHVlQQkJW0FEVkFQSTMyLjE0MV0gKi8KLURXT1JEIFJlZ0VudW1WYWx1ZUEoCitEV09SRCBSZWdFbnVtVmFsdWUzMkEoCiAJSEtFWQloa2V5LAogCURXT1JECWlWYWx1ZSwKIAlMUFNUUglscHN6VmFsdWUsCkBAIC0xNzIzLDcgKzIyOTIsNyBAQAogCUxQQllURQlscGJEYXRhVzsKIAlEV09SRAlyZXQsbHBjYkRhdGFXOwogCi0JZHByaW50Zl9yZWcoc3RkZGViLCJSZWdFbnVtVmFsdWVBKCV4LCVsZCwlcCwlcCwlcCwlcCwlcCwlcClcbiIsCisJZHByaW50Zl9yZWcoc3RkZGViLCJSZWdFbnVtVmFsdWUzMkEoJXgsJWxkLCVwLCVwLCVwLCVwLCVwLCVwKVxuIiwKIAkJaGtleSxpVmFsdWUsbHBzelZhbHVlLGxwY2NoVmFsdWUsbHBkUmVzZXJ2ZWQsbHBkd1R5cGUsbHBiRGF0YSxscGNiRGF0YQogCSk7CiAKQEAgLTE3MzMsNyArMjMwMiw3IEBACiAJCWxwY2JEYXRhVyA9ICpscGNiRGF0YSoyOwogCX0gZWxzZQogCQlscGJEYXRhVyA9IE5VTEw7Ci0JcmV0PVJlZ0VudW1WYWx1ZVcoCisJcmV0PVJlZ0VudW1WYWx1ZTMyVygKIAkJaGtleSwKIAkJaVZhbHVlLAogCQlscHN6VmFsdWVXLApAQCAtMTc2Niw3ICsyMzM1LDcgQEAKIH0KIAogLyogUmVnRW51bVZhbHVlCQkJW0tFUk5FTC4yMjNdICovCi1EV09SRCBSZWdFbnVtVmFsdWUoCitEV09SRCBSZWdFbnVtVmFsdWUxNigKIAlIS0VZCWhrZXksCiAJRFdPUkQJaVZhbHVlLAogCUxQU1RSCWxwc3pWYWx1ZSwKQEAgLTE3NzksNyArMjM0OCw3IEBACiAJZHByaW50Zl9yZWcoc3RkZGViLCJSZWdFbnVtVmFsdWUoJXgsJWxkLCVwLCVwLCVwLCVwLCVwLCVwKVxuIiwKIAkJaGtleSxpVmFsdWUsbHBzelZhbHVlLGxwY2NoVmFsdWUsbHBkUmVzZXJ2ZWQsbHBkd1R5cGUsbHBiRGF0YSxscGNiRGF0YQogCSk7Ci0JcmV0dXJuIFJlZ0VudW1WYWx1ZUEoCisJcmV0dXJuIFJlZ0VudW1WYWx1ZTMyQSgKIAkJaGtleSwKIAkJaVZhbHVlLAogCQlscHN6VmFsdWUsCkBAIC0xODA0LDE1ICsyMzczLDE1IEBACiAgKiBEZWxldGUgcmVnaXN0cnkga2V5CiAgKgogICogQ2FsbHBhdGg6Ci0gKiBSZWdEZWxldGVLZXkgLT4gUmVnRGVsZXRlS2V5QSAtPiBSZWdEZWxldGVLZXlXCisgKiBSZWdEZWxldGVLZXkxNiAtPiBSZWdEZWxldGVLZXkzMkEgLT4gUmVnRGVsZXRlS2V5MzJXCiAgKi8KIC8qIFJlZ0RlbGV0ZUtleVcJCVtBRFZBUEkzMi4xMzRdICovCi1EV09SRCBSZWdEZWxldGVLZXlXKEhLRVkgaGtleSxMUFdTVFIgbHBzelN1YktleSkgeworRFdPUkQgUmVnRGVsZXRlS2V5MzJXKEhLRVkgaGtleSxMUFdTVFIgbHBzelN1YktleSkgewogCUxQS0VZU1RSVUNUCSpscGxwUHJldktleSxscE5leHRLZXksbHB4a2V5OwogCUxQV1NUUgkJKndwczsKIAlpbnQJCXdwYyxpOwogCi0JZHByaW50Zl9yZWcoc3RkZGViLCJSZWdEZWxldGVLZXlXKCV4LCVzKVxuIiwKKwlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ0RlbGV0ZUtleTMyVygleCwlcylcbiIsCiAJCWhrZXksVzJDKGxwc3pTdWJLZXksMCkKIAkpOwogCWxwTmV4dEtleQk9IGxvb2t1cF9oa2V5KGhrZXkpOwpAQCAtMTg2Myw0MCArMjQzMiw0MCBAQAogfQogCiAvKiBSZWdEZWxldGVLZXlBCQlbQURWQVBJMzIuMTMzXSAqLwotRFdPUkQgUmVnRGVsZXRlS2V5QShIS0VZIGhrZXksTFBDU1RSIGxwc3pTdWJLZXkpIHsKK0RXT1JEIFJlZ0RlbGV0ZUtleTMyQShIS0VZIGhrZXksTFBDU1RSIGxwc3pTdWJLZXkpIHsKIAlMUFdTVFIJbHBzelN1YktleVc7CiAJRFdPUkQJcmV0OwogCi0JZHByaW50Zl9yZWcoc3RkZGViLCJSZWdEZWxldGVLZXlBKCV4LCVzKVxuIiwKKwlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ0RlbGV0ZUtleTMyQSgleCwlcylcbiIsCiAJCWhrZXksbHBzelN1YktleQogCSk7CiAJbHBzelN1YktleVc9c3RyZHVwQTJXKGxwc3pTdWJLZXkpOwotCXJldD1SZWdEZWxldGVLZXlXKGhrZXksbHBzelN1YktleVcpOworCXJldD1SZWdEZWxldGVLZXkzMlcoaGtleSxscHN6U3ViS2V5Vyk7CiAJZnJlZShscHN6U3ViS2V5Vyk7CiAJcmV0dXJuIHJldDsKIH0KIAogLyogUmVnRGVsZXRlS2V5CQkJW1NIRUxMLjRdIFtLRVJORUwuMjE5XSAqLwotRFdPUkQgUmVnRGVsZXRlS2V5KEhLRVkgaGtleSxMUENTVFIgbHBzelN1YktleSkgewotCWRwcmludGZfcmVnKHN0ZGRlYiwiUmVnRGVsZXRlS2V5KCV4LCVzKVxuIiwKK0RXT1JEIFJlZ0RlbGV0ZUtleTE2KEhLRVkgaGtleSxMUENTVFIgbHBzelN1YktleSkgeworCWRwcmludGZfcmVnKHN0ZGRlYiwiUmVnRGVsZXRlS2V5MTYoJXgsJXMpXG4iLAogCQloa2V5LGxwc3pTdWJLZXkKIAkpOwotCXJldHVybiBSZWdEZWxldGVLZXlBKGhrZXksbHBzelN1YktleSk7CisJcmV0dXJuIFJlZ0RlbGV0ZUtleTMyQShoa2V5LGxwc3pTdWJLZXkpOwogfQogCiAvKiAKICAqIERlbGV0ZSByZWdpc3RyeSB2YWx1ZQogICoKICAqIENhbGxwYXRoOgotICogUmVnRGVsZXRlVmFsdWUgLT4gUmVnRGVsZXRlVmFsdWVBIC0+IFJlZ0RlbGV0ZVZhbHVlVworICogUmVnRGVsZXRlVmFsdWUxNiAtPiBSZWdEZWxldGVWYWx1ZTMyQSAtPiBSZWdEZWxldGVWYWx1ZTMyVwogICovCiAvKiBSZWdEZWxldGVWYWx1ZVcJCVtBRFZBUEkzMi4xMzZdICovCi1EV09SRCBSZWdEZWxldGVWYWx1ZVcoSEtFWSBoa2V5LExQV1NUUiBscHN6VmFsdWUpIHsKK0RXT1JEIFJlZ0RlbGV0ZVZhbHVlMzJXKEhLRVkgaGtleSxMUFdTVFIgbHBzelZhbHVlKSB7CiAJRFdPUkQJCWk7CiAJTFBLRVlTVFJVQ1QJbHBrZXk7CiAJTFBLRVlWQUxVRQl2YWw7CiAKLQlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ0RlbGV0ZVZhbHVlVygleCwlcylcbiIsCisJZHByaW50Zl9yZWcoc3RkZGViLCJSZWdEZWxldGVWYWx1ZTMyVygleCwlcylcbiIsCiAJCWhrZXksVzJDKGxwc3pWYWx1ZSwwKQogCSk7CiAJbHBrZXk9bG9va3VwX2hrZXkoaGtleSk7CkBAIC0xOTMwLDI1ICsyNDk5LDI1IEBACiB9CiAKIC8qIFJlZ0RlbGV0ZVZhbHVlQQkJW0FEVkFQSTMyLjEzNV0gKi8KLURXT1JEIFJlZ0RlbGV0ZVZhbHVlQShIS0VZIGhrZXksTFBTVFIgbHBzelZhbHVlKSB7CitEV09SRCBSZWdEZWxldGVWYWx1ZTMyQShIS0VZIGhrZXksTFBTVFIgbHBzelZhbHVlKSB7CiAJTFBXU1RSCWxwc3pWYWx1ZVc7CiAJRFdPUkQJcmV0OwogCi0JZHByaW50Zl9yZWcoIHN0ZGRlYiwgIlJlZ0RlbGV0ZVZhbHVlQSgleCwlcylcbiIsIGhrZXksbHBzelZhbHVlICk7CisJZHByaW50Zl9yZWcoIHN0ZGRlYiwgIlJlZ0RlbGV0ZVZhbHVlMzJBKCV4LCVzKVxuIiwgaGtleSxscHN6VmFsdWUgKTsKIAlpZiAobHBzelZhbHVlKQogCQlscHN6VmFsdWVXPXN0cmR1cEEyVyhscHN6VmFsdWUpOwogCWVsc2UKIAkJbHBzelZhbHVlVz1OVUxMOwotCXJldD1SZWdEZWxldGVWYWx1ZVcoaGtleSxscHN6VmFsdWVXKTsKKwlyZXQ9UmVnRGVsZXRlVmFsdWUzMlcoaGtleSxscHN6VmFsdWVXKTsKIAlpZiAobHBzelZhbHVlVykKIAkJZnJlZShscHN6VmFsdWVXKTsKIAlyZXR1cm4gcmV0OwogfQogCiAvKiBSZWdEZWxldGVWYWx1ZQkJW0tFUk5FTC4yMjJdICovCi1EV09SRCBSZWdEZWxldGVWYWx1ZShIS0VZIGhrZXksTFBTVFIgbHBzelZhbHVlKSB7Ci0JZHByaW50Zl9yZWcoIHN0ZGRlYiwiUmVnRGVsZXRlVmFsdWUoJXgsJXMpXG4iLCBoa2V5LGxwc3pWYWx1ZSApOwotCXJldHVybiBSZWdEZWxldGVWYWx1ZUEoaGtleSxscHN6VmFsdWUpOworRFdPUkQgUmVnRGVsZXRlVmFsdWUxNihIS0VZIGhrZXksTFBTVFIgbHBzelZhbHVlKSB7CisJZHByaW50Zl9yZWcoIHN0ZGRlYiwiUmVnRGVsZXRlVmFsdWUxNigleCwlcylcbiIsIGhrZXksbHBzelZhbHVlICk7CisJcmV0dXJuIFJlZ0RlbGV0ZVZhbHVlMzJBKGhrZXksbHBzelZhbHVlKTsKIH0KIAogLyogUmVnRmx1c2hLZXkJCQlbQURWQVBJMzIuMTQzXSBbS0VSTkVMLjIyN10gKi8KQEAgLTE5NjAsNyArMjUyOSw3IEBACiAvKiBGSVhNRTogbHBjY2hYWFhYIC4uLiBpcyB0aGlzIGNvdW50aW5nIGluIFdDSEFSUyBvciBpbiBCWVRFcyA/PyAqLwogCiAvKiBSZWdRdWVyeUluZm9LZXlXCQlbQURWQVBJMzIuMTUzXSAqLwotRFdPUkQgUmVnUXVlcnlJbmZvS2V5VygKK0RXT1JEIFJlZ1F1ZXJ5SW5mb0tleTMyVygKIAlIS0VZCWhrZXksCiAJTFBXU1RSCWxwc3pDbGFzcywKIAlMUERXT1JECWxwY2NoQ2xhc3MsCkBAIC0xOTc4LDcgKzI1NDcsNyBAQAogCWludAkJbnJvZmtleXMsbWF4c3Via2V5LG1heGNsYXNzLG1heHZhbHVlcyxtYXh2bmFtZSxtYXh2ZGF0YTsKIAlpbnQJCWk7CiAKLQlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ1F1ZXJ5SW5mb0tleVcoJXgsLi4uLi4uKVxuIixoa2V5KTsKKwlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ1F1ZXJ5SW5mb0tleTMyVygleCwuLi4uLi4pXG4iLGhrZXkpOwogCWxwa2V5PWxvb2t1cF9oa2V5KGhrZXkpOwogCWlmICghbHBrZXkpCiAJCXJldHVybiBTSEVMTF9FUlJPUl9CQURLRVk7CkBAIC0yMDM2LDcgKzI2MDUsNyBAQAogfQogCiAvKiBSZWdRdWVyeUluZm9LZXlBCQlbQURWQVBJMzIuMTUyXSAqLwotRFdPUkQgUmVnUXVlcnlJbmZvS2V5QSgKK0RXT1JEIFJlZ1F1ZXJ5SW5mb0tleTMyQSgKIAlIS0VZCWhrZXksCiAJTFBTVFIJbHBzekNsYXNzLAogCUxQRFdPUkQJbHBjY2hDbGFzcywKQEAgLTIwNTMsMTQgKzI2MjIsMTQgQEAKIAlMUFdTVFIJCWxwc3pDbGFzc1c7CiAJRFdPUkQJCXJldDsKIAotCWRwcmludGZfcmVnKHN0ZGRlYiwiUmVnUXVlcnlJbmZvS2V5QSgleCwuLi4uLi4pXG4iLGhrZXkpOworCWRwcmludGZfcmVnKHN0ZGRlYiwiUmVnUXVlcnlJbmZvS2V5MzJBKCV4LC4uLi4uLilcbiIsaGtleSk7CiAJaWYgKGxwc3pDbGFzcykgewogCQkqbHBjY2hDbGFzcyo9IDI7CiAJCWxwc3pDbGFzc1cgID0gKExQV1NUUil4bWFsbG9jKCpscGNjaENsYXNzKTsKIAogCX0gZWxzZQogCQlscHN6Q2xhc3NXICA9IE5VTEw7Ci0JcmV0PVJlZ1F1ZXJ5SW5mb0tleVcoCisJcmV0PVJlZ1F1ZXJ5SW5mb0tleTMyVygKIAkJaGtleSwKIAkJbHBzekNsYXNzVywKIAkJbHBjY2hDbGFzcywKZGlmZiAtLWdpdCBhL21pc2Mvc2hlbGwuYyBiL21pc2Mvc2hlbGwuYwppbmRleCBkZDJkNTkxLi5mZjYzNjUzIDEwMDY0NAotLS0gYS9taXNjL3NoZWxsLmMKKysrIGIvbWlzYy9zaGVsbC5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgInhtYWxsb2MuaCIKKyNpbmNsdWRlICJ3aW5yZWcuaCIKIAogZXh0ZXJuIEhBTkRMRSAJQ1VSU09SSUNPTl9Mb2FkSGFuZGxlciggSEFORExFLCBISU5TVEFOQ0UsIEJPT0wpOwogZXh0ZXJuIFdPUkQgCUdldEljb25JRCggSEFORExFIGhSZXNvdXJjZSwgRFdPUkQgcmVzVHlwZSApOwpAQCAtMzcsNyArMzgsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCQkJCURyYWdRdWVyeUZpbGUJCVtTSEVMTC4xMV0KICAqLwotVUlOVCBEcmFnUXVlcnlGaWxlKEhEUk9QIGhEcm9wLCBXT1JEIHdGaWxlLCBMUFNUUiBscHN6RmlsZSwgV09SRCB3TGVuZ3RoKQorVUlOVCBEcmFnUXVlcnlGaWxlKEhEUk9QMTYgaERyb3AsIFdPUkQgd0ZpbGUsIExQU1RSIGxwc3pGaWxlLCBXT1JEIHdMZW5ndGgpCiB7CiAgICAgLyogaERyb3AgaXMgYSBnbG9iYWwgbWVtb3J5IGJsb2NrIGFsbG9jYXRlZCB3aXRoIEdNRU1fU0hBUkUgCiAgICAgICogd2l0aCBEUk9QRklMRVNUUlVDVCBhcyBhIGhlYWRlciBhbmQgZmlsZW5hbWVzIGZvbGxvd2luZwpAQCAtODEsNyArODIsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCQkJCURyYWdGaW5pc2gJCVtTSEVMTC4xMl0KICAqLwotdm9pZCBEcmFnRmluaXNoKEhEUk9QIGgpCit2b2lkIERyYWdGaW5pc2goSERST1AxNiBoKQogewogICAgIEdsb2JhbEZyZWUxNigoSEdMT0JBTDE2KWgpOwogfQpAQCAtOTAsMTQgKzkxLDE0IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCQkJRHJhZ1F1ZXJ5UG9pbnQJCVtTSEVMTC4xM10KICAqLwotQk9PTCBEcmFnUXVlcnlQb2ludChIRFJPUCBoRHJvcCwgUE9JTlQgKnApCitCT09MIERyYWdRdWVyeVBvaW50KEhEUk9QMTYgaERyb3AsIFBPSU5UMTYgKnApCiB7CiAgICAgTFBEUk9QRklMRVNUUlVDVCBscERyb3BGaWxlU3RydWN0OyAgCiAgICAgQk9PTCAgICAgICAgICAgICBiUmV0OwogCiAgICAgbHBEcm9wRmlsZVN0cnVjdCA9IChMUERST1BGSUxFU1RSVUNUKSBHbG9iYWxMb2NrMTYoaERyb3ApOwogCi0gICAgbWVtY3B5KHAsJmxwRHJvcEZpbGVTdHJ1Y3QtPnB0TW91c2VQb3Msc2l6ZW9mKFBPSU5UKSk7CisgICAgbWVtY3B5KHAsJmxwRHJvcEZpbGVTdHJ1Y3QtPnB0TW91c2VQb3Msc2l6ZW9mKFBPSU5UMTYpKTsKICAgICBiUmV0ID0gbHBEcm9wRmlsZVN0cnVjdC0+ZkluTm9uQ2xpZW50QXJlYTsKIAogICAgIEdsb2JhbFVubG9jazE2KGhEcm9wKTsKQEAgLTE0NSw3ICsxNDYsNyBAQAogICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICBsZW49MjAwOwotICAgICAgaWYgKFJlZ1F1ZXJ5VmFsdWUoKEhLRVkpSEtFWV9DTEFTU0VTX1JPT1QscCxzdWJjbGFzcywmbGVuKT09U0hFTExfRVJST1JfU1VDQ0VTUykgeworICAgICAgaWYgKFJlZ1F1ZXJ5VmFsdWUxNigoSEtFWSlIS0VZX0NMQVNTRVNfUk9PVCxwLHN1YmNsYXNzLCZsZW4pPT1TSEVMTF9FUlJPUl9TVUNDRVNTKSB7CiAJaWYgKGxlbj4yMCkKIAkgIGZwcmludGYoc3RkZGViLCJTaGVsbEV4ZWN1dGU6c3ViY2xhc3Mgd2l0aCBsZW4gJWxkPyAoJXMpLCBwbGVhc2UgcmVwb3J0LlxuIixsZW4sc3ViY2xhc3MpOwogCXN1YmNsYXNzW2xlbl09J1wwJzsKQEAgLTE1NCw3ICsxNTUsNyBAQAogCXN0cmNhdChzdWJjbGFzcywiXFxjb21tYW5kIik7CiAJZHByaW50Zl9leGVjKHN0ZGRlYiwiU2hlbGxFeGVjdXRlOmxvb2tpbmcgZm9yICVzLlxuIixzdWJjbGFzcyk7CiAJbGVuPTQwMDsKLQlpZiAoUmVnUXVlcnlWYWx1ZSgoSEtFWSlIS0VZX0NMQVNTRVNfUk9PVCxzdWJjbGFzcyxjbWQsJmxlbik9PVNIRUxMX0VSUk9SX1NVQ0NFU1MpIHsKKwlpZiAoUmVnUXVlcnlWYWx1ZTE2KChIS0VZKUhLRVlfQ0xBU1NFU19ST09ULHN1YmNsYXNzLGNtZCwmbGVuKT09U0hFTExfRVJST1JfU1VDQ0VTUykgewogCSAgY2hhciAqdDsKIAkgIGRwcmludGZfZXhlYyhzdGRkZWIsIlNoZWxsRXhlY3V0ZTouLi5nb3QgJXNcbiIsY21kKTsKIAkgIGNtZFtsZW5dPSdcMCc7CkBAIC0xOTYsMTAgKzE5NywxMzEgQEAKICAqLwogSElOU1RBTkNFIEZpbmRFeGVjdXRhYmxlKExQQ1NUUiBscEZpbGUsIExQQ1NUUiBscERpcmVjdG9yeSwgTFBTVFIgbHBSZXN1bHQpCiB7Ci0JZnByaW50ZihzdGRuaW1wLCAiRmluZEV4ZWN1dGFibGU6IHNvbWVvbmUgaGFzIHRvIGZpeCBtZSBhbmQgdGhpcyBpcyBZT1VSIHR1cm4hIDotKVxuIik7CisgICAgY2hhciAqZXh0ZW5zaW9uID0gTlVMTDsgLyogcG9pbnRlciB0byBmaWxlIGV4dGVuc2lvbiAqLworICAgIGNoYXIgdG1wZXh0WzVdOyAgICAgICAgIC8qIGxvY2FsIGNvcHkgdG8gbXVuZyBhcyB3ZSBwbGVhc2UgKi8KKyAgICBjaGFyIGZpbGV0eXBlWzI1Nl07ICAgICAvKiByZWdpc3RyeSBuYW1lIGZvciB0aGlzIGZpbGV0eXBlICovCisgICAgTE9ORyBmaWxldHlwZWxlbj0yNTY7ICAgLyogbGVuZ3RoIG9mIGFib3ZlICovCisgICAgY2hhciBjb21tYW5kWzI1Nl07ICAgICAgLyogY29tbWFuZCBmcm9tIHJlZ2lzdHJ5ICovCisgICAgTE9ORyBjb21tYW5kbGVuPTI1NjsgICAgLyogVGhpcyBpcyB0aGUgbW9zdCBET1MgY2FuIGhhbmRsZSA6KSAqLworICAgIGNoYXIgYnVmZmVyWzI1Nl07ICAgICAgIC8qIFVzZWQgdG8gR2V0UHJvZmlsZVN0cmluZyAqLworICAgIEhJTlNUQU5DRSByZXR2YWw9MzE7ICAgIC8qIGRlZmF1bHQgLSAnTm8gYXNzb2NpYXRpb24gd2FzIGZvdW5kJyAqLworICAgIGNoYXIgKnRvazsgICAgICAgICAgICAgIC8qIHRva2VuIHBvaW50ZXIgKi8KKyAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAvKiByYW5kb20gY291bnRlciAqLwogCi0JbHBSZXN1bHRbMF09J1wwJzsKLSAgICAgICAgcmV0dXJuIDMxOwkJLyogbm8gYXNzb2NpYXRpb24gKi8KKyAgICBkcHJpbnRmX2V4ZWMoc3RkZGViLCAiRmluZEV4ZWN1dGFibGU6IEZpbGUgJXMsIERpciAlc1xuIiwgCisJCSAobHBGaWxlICE9IE5VTEw/bHBGaWxlOiItIiksIAorCQkgKGxwRGlyZWN0b3J5ICE9IE5VTEw/bHBEaXJlY3Rvcnk6Ii0iKSk7CisKKyAgICBscFJlc3VsdFswXT0nXDAnOyAvKiBTdGFydCBvZmYgd2l0aCBhbiBlbXB0eSByZXR1cm4gc3RyaW5nICovCisKKyAgICAvKiB0cmFwIE5VTEwgcGFyYW1ldGVycyBvbiBlbnRyeSAqLworICAgIGlmICgoIGxwRmlsZSA9PSBOVUxMICkgfHwgKCBscERpcmVjdG9yeSA9PSBOVUxMICkgfHwgCisJKCBscFJlc3VsdCA9PSBOVUxMICkpCisgICAgeworCS8qIEZJWE1FIC0gc2hvdWxkIHRocm93IGEgd2FybmluZywgcGVyaGFwcyEgKi8KKwlyZXR1cm4gMjsgLyogRmlsZSBub3QgZm91bmQuIENsb3NlIGVub3VnaCwgSSBndWVzcy4gKi8KKyAgICB9CisKKyAgICAvKiBGaXJzdCB0aGluZyB3ZSBuZWVkIGlzIHRoZSBmaWxlJ3MgZXh0ZW5zaW9uICovCisgICAgZXh0ZW5zaW9uID0gc3RyY2hyKCBscEZpbGUsICcuJyApOyAvKiBBc3N1bWVzIGZpcnN0ICIuIiBpcyB0aGUgb25lLi4uICovCisgICAgaWYgKChleHRlbnNpb24gPT0gTlVMTCkgfHwgKGV4dGVuc2lvbiA9PSAmbHBGaWxlW3N0cmxlbihscEZpbGUpXSkpCisgICAgeworCXJldHVybiAzMTsgLyogbm8gYXNzb2NpYXRpb24gKi8KKyAgICB9CisKKyAgICAvKiBNYWtlIGxvY2FsIGNvcHkgJiBsb3dlcmNhc2UgaXQgZm9yIHJlZyAmICdwcm9ncmFtcz0nIGxvb2t1cCAqLworICAgIHN0cm5jcHkoIHRtcGV4dCwgZXh0ZW5zaW9uLCA1ICk7CisgICAgaWYgKHN0cmxlbihleHRlbnNpb24pPD00KQorCXRtcGV4dFtzdHJsZW4oZXh0ZW5zaW9uKV09J1wwJzsKKyAgICBlbHNlCisJdG1wZXh0WzRdPSdcMCc7CisgICAgZm9yIChpPTA7aTxzdHJsZW4odG1wZXh0KTtpKyspIHRtcGV4dFtpXT10b2xvd2VyKHRtcGV4dFtpXSk7CisgICAgZHByaW50Zl9leGVjKHN0ZGRlYiwgIkZpbmRFeGVjdXRhYmxlOiAlcyBmaWxlXG4iLCB0bXBleHQpOworICAgIAorICAgIC8qIFRocmVlIHBsYWNlcyB0byBjaGVjazogKi8KKyAgICAvKiAxLiB3aW4uaW5pLCBbd2luZG93c10sIHByb2dyYW1zIChOQiBubyBsZWFkaW5nICcuJykgKi8KKyAgICAvKiAyLiBSZWdpc3RyeSwgSEtFWV9DTEFTU19ST09UXDxmaWxldHlwZT5cc2hlbGxcb3Blblxjb21tYW5kICovCisgICAgLyogMy4gd2luLmluaSwgW2V4dGVuc2lvbnNdLCBleHRlbnNpb24gKE5CIG5vIGxlYWRpbmcgJy4nICovCisgICAgLyogQWxsIEkga25vdyBvZiB0aGUgb3JkZXIgaXMgdGhhdCByZWdpc3RyeSBpcyBjaGVja2VkIGJlZm9yZSAqLworICAgIC8qIGV4dGVuc2lvbnM7IGhvd2V2ZXIsIGl0J2QgbWFrZSBzZW5zZSB0byBjaGVjayB0aGUgcHJvZ3JhbXMgKi8KKyAgICAvKiBzZWN0aW9uIGZpcnN0LCBzbyB0aGF0J3Mgd2hhdCBoYXBwZW5zIGhlcmUuICovCisKKyAgICAvKiBTZWUgaWYgaXQncyBhIHByb2dyYW0gKi8KKyAgICBHZXRQcm9maWxlU3RyaW5nKCJ3aW5kb3dzIiwgInByb2dyYW1zIiwgImV4ZSBwaWYgYmF0IGNvbSIsCisJCSAgICAgIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOyAvKiBGSVhNRSBjaGVjayByZXR1cm4gY29kZSEgKi8KKworICAgIGZvciAoaT0wO2k8c3RybGVuKGJ1ZmZlcik7IGkrKykgYnVmZmVyW2ldPXRvbG93ZXIoYnVmZmVyW2ldKTsKKworICAgIHRvayA9IHN0cnRvayhidWZmZXIsICIgXHQiKTsgLyogPyAqLworICAgIHdoaWxlKCB0b2shPSBOVUxMKQorICAgIHsKKwlpZiAoc3RyY21wKHRvaywgJnRtcGV4dFsxXSk9PTApIC8qIGhhdmUgdG8gc2tpcCB0aGUgbGVhZGluZyAiLiIgKi8KKwl7CisJICAgIHN0cmNweShscFJlc3VsdCwgbHBGaWxlKTsgLyogTmVlZCB0byBwZXJoYXBzIGNoZWNrIHRoYXQgKi8KKwkJCQkgICAgICAvKiB0aGUgZmlsZSBoYXMgYSBwYXRoIGF0dGFjaGVkICovCisJICAgIGRwcmludGZfZXhlYyhzdGRkZWIsICJGaW5kRXhlY3V0YWJsZTogZm91bmQgJXNcbiIsIGxwUmVzdWx0KTsKKwkgICAgcmV0dXJuIDMzOyAvKiBHcmVhdGVyIHRoYW4gMzIgdG8gaW5kaWNhdGUgc3VjY2VzcyBGSVhNRSAqLworCQkgICAgICAgLyogd2hhdCBhcmUgdGhlIGNvcnJlY3QgdmFsdWVzIGhlcmU/ICovCisJfQorCXRvaz1zdHJ0b2soTlVMTCwgIiBcdCIpOworICAgIH0KKworICAgIC8qIENoZWNrIHJlZ2lzdHJ5ICovCisgICAgaWYgKFJlZ1F1ZXJ5VmFsdWUxNiggKEhLRVkpSEtFWV9DTEFTU0VTX1JPT1QsIHRtcGV4dCwgZmlsZXR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbGV0eXBlbGVuICkgPT0gU0hFTExfRVJST1JfU1VDQ0VTUyApCisgICAgeworCWZpbGV0eXBlW2ZpbGV0eXBlbGVuXT0nXDAnOworCWRwcmludGZfZXhlYyhzdGRkZWIsICJGaWxlIHR5cGU6ICVzXG4iLCBmaWxldHlwZSk7CisKKwkvKiBMb29raW5nIGZvciAuLi5idWZmZXJcc2hlbGxcb3Blblxjb21tYW5kICovCisJc3RyY2F0KCBmaWxldHlwZSwgIlxcc2hlbGxcXG9wZW5cXGNvbW1hbmQiICk7CisJCisJaWYgKFJlZ1F1ZXJ5VmFsdWUxNiggKEhLRVkpSEtFWV9DTEFTU0VTX1JPT1QsIGZpbGV0eXBlLCBjb21tYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tbWFuZGxlbiApID09IFNIRUxMX0VSUk9SX1NVQ0NFU1MgKQorCXsKKwkgICAgLyogSXMgdGhlcmUgYSByZXBsYWNlKCkgZnVuY3Rpb24gYW55d2hlcmU/ICovCisJICAgIGNvbW1hbmRbY29tbWFuZGxlbl09J1wwJzsKKwkgICAgc3RyY3B5KCBscFJlc3VsdCwgY29tbWFuZCApOworCSAgICB0b2s9c3Ryc3RyKCBscFJlc3VsdCwgIiUxIiApOworCSAgICBpZiAodG9rICE9IE5VTEwpCisJICAgIHsKKwkJdG9rWzBdPSdcMCc7IC8qIHRydW5jYXRlIHN0cmluZyBhdCB0aGUgcGVyY2VudCAqLworCQlzdHJjYXQoIGxwUmVzdWx0LCBscEZpbGUgKTsgLyogd2hhdCBpZiBubyBkaXIgaW4gbHBGaWxlPyAqLworCQl0b2s9c3Ryc3RyKCBjb21tYW5kLCAiJTEiICk7CisJCWlmICgodG9rIT1OVUxMKSAmJiAoc3RybGVuKHRvayk+MikpCisJCXsKKwkJICAgIHN0cmNhdCggbHBSZXN1bHQsICZ0b2tbMl0gKTsKKwkJfQorCSAgICB9CisJICAgIHJldHZhbD0zMzsKKwl9CisgICAgfQorICAgIGVsc2UgLyogQ2hlY2sgd2luLmluaSAqLworICAgIHsKKwkvKiBUb3NzIHRoZSBsZWFkaW5nIGRvdCAqLworCWV4dGVuc2lvbisrOworCUdldFByb2ZpbGVTdHJpbmcoICJleHRlbnNpb25zIiwgZXh0ZW5zaW9uLCAiIiwgY29tbWFuZCwKKwkJCSBzaXplb2YoY29tbWFuZCkpOworCWlmIChzdHJsZW4oY29tbWFuZCkhPTApCisJeworCSAgICBzdHJjcHkoIGxwUmVzdWx0LCBjb21tYW5kICk7CisJICAgIHRvaz1zdHJzdHIoIGxwUmVzdWx0LCAiXiIgKTsgLyogc2hvdWxkIGJlIF4uZXh0ZW5zaW9uPyAqLworCSAgICBpZiAodG9rICE9IE5VTEwpCisJICAgIHsKKwkJdG9rWzBdPSdcMCc7CisJCXN0cmNhdCggbHBSZXN1bHQsIGxwRmlsZSApOyAvKiB3aGF0IGlmIG5vIGRpciBpbiBscEZpbGU/ICovCisJCXRvaz1zdHJzdHIoIGNvbW1hbmQsICJeIiApOyAvKiBzZWUgYWJvdmUgKi8KKwkJaWYgKCh0b2sgIT0gTlVMTCkgJiYgKHN0cmxlbih0b2spPjUpKQorCQl7CisJCSAgICBzdHJjYXQoIGxwUmVzdWx0LCAmdG9rWzVdKTsKKwkJfQorCSAgICB9CisJICAgIHJldHZhbD0zMzsKKwl9CisgICAgfQorCisgICAgZHByaW50Zl9leGVjKHN0ZGRlYiwgIkZpbmRFeGVjdXRhYmxlOiByZXR1cm5pbmcgJXNcbiIsIGxwUmVzdWx0KTsKKyAgICByZXR1cm4gcmV0dmFsOwogfQogCiBzdGF0aWMgY2hhciBBcHBOYW1lWzEyOF0sIEFwcE1pc2NbMTUzNl07CkBAIC00NjYsNyArNTg4LDcgQEAKICAgVUlOVCAJbCA9IHN0cmxlbihlbnRyeSk7IAogICBmb3IoIDsgKmxwRW52IDsgbHBFbnYrPXN0cmxlbihscEVudikrMSApCiAgICAgIHsKLSAgICAgICBpZiggc3RybmNhc2VjbXAobHBFbnYsIGVudHJ5LCBsKSApIGNvbnRpbnVlOworICAgICAgIGlmKCBsc3RybmNtcGkobHBFbnYsIGVudHJ5LCBsKSApIGNvbnRpbnVlOwogICAgICAgIAogICAgICAgIGlmKCAhKihscEVuditsKSApCiAgICAgICAgICByZXR1cm4gKGxwRW52ICsgbCk7IAkJLyogZW1wdHkgZW50cnkgKi8KZGlmZiAtLWdpdCBhL21pc2Mvc3B5LmMgYi9taXNjL3NweS5jCmluZGV4IGY0Mjc5MWQuLjc5MTMyNmIgMTAwNjQ0Ci0tLSBhL21pc2Mvc3B5LmMKKysrIGIvbWlzYy9zcHkuYwpAQCAtMTQ5LDcgKzE0OSwxNCBAQAogICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCiAKICAgICAvKiAweDAwRjAgLSBXaW4zMiBCdXR0b25zICovCi0gICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKyAgICAiQk1fR0VUQ0hFQ0szMiIsICAgICAgICAgICAgLyogMHgwMGYwICovCisgICAgIkJNX1NFVENIRUNLMzIiLCAgICAgICAgICAgIC8qIDB4MDBmMSAqLworICAgICJCTV9HRVRTVEFURTMyIiwgICAgICAgICAgICAvKiAweDAwZjIgKi8KKyAgICAiQk1fU0VUU1RBVEUzMiIsICAgICAgICAgICAgLyogMHgwMGYzICovCisgICAgIkJNX1NFVFNUWUxFMzIiLCAgICAgICAgICAgIC8qIDB4MDBmNCAqLworICAgICJCTV9DTElDSzMyIiwgICAgICAgICAgICAgICAvKiAweDAwZjUgKi8KKyAgICAiQk1fR0VUSU1BR0UzMiIsICAgICAgICAgICAgLyogMHgwMGY2ICovCisgICAgIkJNX1NFVElNQUdFMzIiLCAgICAgICAgICAgIC8qIDB4MDBmNyAqLwogICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCiAKICAgICAiV01fS0VZRE9XTiIsCQkvKiAweDAxMDAgKi8KZGlmZiAtLWdpdCBhL21pc2MvdXNlci5jIGIvbWlzYy91c2VyLmMKaW5kZXggZmJhYTg5Ny4uNDQ4ZDUzNiAxMDA2NDQKLS0tIGEvbWlzYy91c2VyLmMKKysrIGIvbWlzYy91c2VyLmMKQEAgLTIxLDggKzIxLDkgQEAKIAogI2lmbmRlZiBXSU5FTElCCiAKLWV4dGVybiB2b2lkIAlUSU1FUl9OdWtlVGltZXJzKEhXTkQsIEhRVUVVRSApOworZXh0ZXJuIHZvaWQgCVRJTUVSX051a2VUaW1lcnMoSFdORCwgSFFVRVVFKTsKIGV4dGVybiBIVEFTSwlUQVNLX0dldE5leHRUYXNrKEhUQVNLKTsKK2V4dGVybiB2b2lkCVFVRVVFX1NldERvb21lZFF1ZXVlKEhRVUVVRSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEdldEZyZWVTeXN0ZW1SZXNvdXJjZXMgICAoVVNFUi4yODQpCkBAIC0xMzAsMTAgKzEzMSwxNCBAQAogCiAgICAgSE9PS19GcmVlUXVldWVIb29rcyggaFF1ZXVlICk7CiAKKyAgICBRVUVVRV9TZXREb29tZWRRdWV1ZSggaFF1ZXVlICk7CisKICAgICAvKiBOdWtlIG9ycGhhbmVkIHdpbmRvd3MgKi8KIAogICAgIFdJTl9EZXN0cm95UXVldWVXaW5kb3dzKCBkZXNrdG9wLT5jaGlsZCwgaFF1ZXVlICk7CiAKKyAgICBRVUVVRV9TZXREb29tZWRRdWV1ZSggMCApOworCiAgICAgLyogRnJlZSB0aGUgbWVzc2FnZSBxdWV1ZSAqLwogCiAgICAgUVVFVUVfRGVsZXRlTXNnUXVldWUoIGhRdWV1ZSApOwpkaWZmIC0tZ2l0IGEvbWlzYy92ZXIuYyBiL21pc2MvdmVyLmMKaW5kZXggYjM5MGZkOS4uNDAzMDhjMSAxMDA2NDQKLS0tIGEvbWlzYy92ZXIuYworKysgYi9taXNjL3Zlci5jCkBAIC01OSw4ICs1OSw4IEBACiAJZHByaW50Zl9yZXNvdXJjZShzdGRlcnIsInNoaWZ0Y291bnQgaXMgJWRcbiIsc2hpZnRjb3VudCk7CiAJZHByaW50Zl9yZXNvdXJjZShzdGRlcnIsInJlYWRpbmcgcmVzb3VyY2UgdHlwZWluZm8gZGlyLlxuIik7CiAKLQlpZiAoIUhJV09SRCh0eXBlaWQpKSB0eXBlaWQgPSAoU0VHUFRSKSgoV09SRCl0eXBlaWQgfCAweDgwMDApOwotCWlmICghSElXT1JEKHJlc2lkKSkgIHJlc2lkICA9IChTRUdQVFIpKChXT1JEKXJlc2lkIHwgMHg4MDAwKTsKKwlpZiAoIUhJV09SRCh0eXBlaWQpKSB0eXBlaWQgPSAoU0VHUFRSKShMT1dPUkQodHlwZWlkKSB8IDB4ODAwMCk7CisJaWYgKCFISVdPUkQocmVzaWQpKSAgcmVzaWQgID0gKFNFR1BUUikoTE9XT1JEKHJlc2lkKSB8IDB4ODAwMCk7CiAJd2hpbGUgKDEpIHsKIAkJaW50CXNraXBmbGFnOwogCmRpZmYgLS1naXQgYS9taXNjL3dpbnNvY2tldC5jIGIvbWlzYy93aW5zb2NrZXQuYwppbmRleCAwZWJmYWNhLi5kZmE1ZmUwIDEwMDY0NAotLS0gYS9taXNjL3dpbnNvY2tldC5jCisrKyBiL21pc2Mvd2luc29ja2V0LmMKQEAgLTI1LDcgKzI1LDcgQEAKICNpbmNsdWRlIDx1bmlzdGQuaD4KIAogI2luY2x1ZGUgIndpbnNvY2suaCIKLSNpbmNsdWRlICJ0b29saGVscC5oIgorI2luY2x1ZGUgImdsb2JhbC5oIgogI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIApkaWZmIC0tZ2l0IGEvbXVsdGltZWRpYS9tbXN5c3RlbS5jIGIvbXVsdGltZWRpYS9tbXN5c3RlbS5jCmluZGV4IGE0NDk5MDkuLjQ2NWY4YzEgMTAwNjQ0Ci0tLSBhL211bHRpbWVkaWEvbW1zeXN0ZW0uYworKysgYi9tdWx0aW1lZGlhL21tc3lzdGVtLmMKQEAgLTE5NiwxNCArMTk2LDYgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIAkJCQlPdXRwdXREZWJ1Z1N0cgkJW01NU1lTVEVNLjMwXQotKi8KLXZvaWQgT3V0cHV0RGVidWdTdHIoTFBDU1RSIHN0cikKLXsKLQlmcHJpbnRmKHN0ZG5pbXAsICJFTVBUWSBTVFVCICEhISBPdXRwdXREZWJ1Z1N0cignJXMnKTtcbiIsIHN0cik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJRHJpdmVyQ2FsbGJhY2sJW01NU1lTVEVNLjMxXQogKi8KIEJPT0wgRHJpdmVyQ2FsbGJhY2soRFdPUkQgZHdDYWxsQmFjaywgVUlOVCB1RmxhZ3MsIEhBTkRMRSBoRGV2LCAKZGlmZiAtLWdpdCBhL29iamVjdHMvYml0Ymx0LmMgYi9vYmplY3RzL2JpdGJsdC5jCmluZGV4IGI5YjJiNzguLjI4MDVhMTAgMTAwNjQ0Ci0tLSBhL29iamVjdHMvYml0Ymx0LmMKKysrIGIvb2JqZWN0cy9iaXRibHQuYwpAQCAtNjI5LDcgKzYyOSw3IEBACiBzdGF0aWMgdm9pZCBCSVRCTFRfU3RyZXRjaEltYWdlKCBYSW1hZ2UgKnNyY0ltYWdlLCBYSW1hZ2UgKmRzdEltYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgd2lkdGhTcmMsIHNob3J0IGhlaWdodFNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IHdpZHRoRHN0LCBzaG9ydCBoZWlnaHREc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUNUICp2aXNSZWN0U3JjLCBSRUNUICp2aXNSZWN0RHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVDVDE2ICp2aXNSZWN0U3JjLCBSRUNUMTYgKnZpc1JlY3REc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9yZWdyb3VuZCwgaW50IGJhY2tncm91bmQsIFdPUkQgbW9kZSApCiB7CiAgICAgaW50ICpyb3dTcmMsICpyb3dEc3QsICpwaXhlbDsKQEAgLTc3NSwxNCArNzc1LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IHdpZHRoU3JjLCBzaG9ydCBoZWlnaHRTcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IHhEc3QsIHNob3J0IHlEc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IHdpZHRoRHN0LCBzaG9ydCBoZWlnaHREc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQ1QgKnZpc1JlY3RTcmMsIFJFQ1QgKnZpc1JlY3REc3QgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUNUMTYgKnZpc1JlY3RTcmMsIFJFQ1QxNiAqdmlzUmVjdERzdCApCiB7CiAgICAgWEltYWdlICppbWFnZVNyYywgKmltYWdlRHN0OwogCi0gICAgUkVDVCByZWN0U3JjID0gKnZpc1JlY3RTcmM7Ci0gICAgUkVDVCByZWN0RHN0ID0gKnZpc1JlY3REc3Q7Ci0gICAgT2Zmc2V0UmVjdCggJnJlY3RTcmMsIC14U3JjLCAteVNyYyApOwotICAgIE9mZnNldFJlY3QoICZyZWN0RHN0LCAteERzdCwgLXlEc3QgKTsKKyAgICBSRUNUMTYgcmVjdFNyYyA9ICp2aXNSZWN0U3JjOworICAgIFJFQ1QxNiByZWN0RHN0ID0gKnZpc1JlY3REc3Q7CisgICAgT2Zmc2V0UmVjdDE2KCAmcmVjdFNyYywgLXhTcmMsIC15U3JjICk7CisgICAgT2Zmc2V0UmVjdDE2KCAmcmVjdERzdCwgLXhEc3QsIC15RHN0ICk7CiAgICAgaW1hZ2VTcmMgPSBYR2V0SW1hZ2UoIGRpc3BsYXksIGRjU3JjLT51LnguZHJhd2FibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc1JlY3RTcmMtPmxlZnQsIHZpc1JlY3RTcmMtPnRvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlzUmVjdFNyYy0+cmlnaHQgLSB2aXNSZWN0U3JjLT5sZWZ0LApAQCAtODEwLDcgKzgxMCw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIEJJVEJMVF9HZXRTcmNBcmVhKCBEQyAqZGNTcmMsIERDICpkY0RzdCwgUGl4bWFwIHBpeG1hcCwgR0MgZ2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgeFNyYywgc2hvcnQgeVNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUNUICp2aXNSZWN0U3JjICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUNUMTYgKnZpc1JlY3RTcmMgKQogewogICAgIFhJbWFnZSAqaW1hZ2VTcmMsICppbWFnZURzdDsKICAgICByZWdpc3RlciBzaG9ydCB4LCB5OwpAQCAtODg0LDcgKzg4NCw3IEBACiAgKiBSZXRyaWV2ZSBhbiBhcmVhIGZyb20gdGhlIGRlc3RpbmF0aW9uIERDLCBtYXBwaW5nIGFsbCB0aGUKICAqIHBpeGVscyB0byBXaW5kb3dzIGNvbG9ycy4KICAqLwotc3RhdGljIHZvaWQgQklUQkxUX0dldERzdEFyZWEoIERDICpkYywgUGl4bWFwIHBpeG1hcCwgR0MgZ2MsIFJFQ1QgKnZpc1JlY3REc3QgKQorc3RhdGljIHZvaWQgQklUQkxUX0dldERzdEFyZWEoREMgKmRjLCBQaXhtYXAgcGl4bWFwLCBHQyBnYywgUkVDVDE2ICp2aXNSZWN0RHN0KQogewogICAgIHNob3J0IHdpZHRoICA9IHZpc1JlY3REc3QtPnJpZ2h0IC0gdmlzUmVjdERzdC0+bGVmdDsKICAgICBzaG9ydCBoZWlnaHQgPSB2aXNSZWN0RHN0LT5ib3R0b20gLSB2aXNSZWN0RHN0LT50b3A7CkBAIC05MTUsNyArOTE1LDcgQEAKICAqIFB1dCBhbiBhcmVhIGJhY2sgaW50byB0aGUgZGVzdGluYXRpb24gREMsIG1hcHBpbmcgdGhlIHBpeGVsCiAgKiBjb2xvcnMgdG8gWCBwaXhlbHMuCiAgKi8KLXN0YXRpYyB2b2lkIEJJVEJMVF9QdXREc3RBcmVhKCBEQyAqZGMsIFBpeG1hcCBwaXhtYXAsIEdDIGdjLCBSRUNUICp2aXNSZWN0RHN0ICkKK3N0YXRpYyB2b2lkIEJJVEJMVF9QdXREc3RBcmVhKERDICpkYywgUGl4bWFwIHBpeG1hcCwgR0MgZ2MsIFJFQ1QxNiAqdmlzUmVjdERzdCkKIHsKICAgICBzaG9ydCB3aWR0aCAgPSB2aXNSZWN0RHN0LT5yaWdodCAtIHZpc1JlY3REc3QtPmxlZnQ7CiAgICAgc2hvcnQgaGVpZ2h0ID0gdmlzUmVjdERzdC0+Ym90dG9tIC0gdmlzUmVjdERzdC0+dG9wOwpAQCAtOTUzLDkgKzk1Myw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgd2lkdGhEc3QsIHNob3J0IGhlaWdodERzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQyAqZGNTcmMsIHNob3J0IHhTcmMsIHNob3J0IHlTcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgd2lkdGhTcmMsIHNob3J0IGhlaWdodFNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUNUICp2aXNSZWN0U3JjLCBSRUNUICp2aXNSZWN0RHN0ICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUNUMTYgKnZpc1JlY3RTcmMsIFJFQ1QxNiAqdmlzUmVjdERzdCApCiB7Ci0gICAgUkVDVCB0bXBSZWN0LCBjbGlwUmVjdDsKKyAgICBSRUNUMTYgdG1wUmVjdCwgY2xpcFJlY3Q7CiAKICAgICBpZiAod2lkdGhTcmMgPCAwKSAgeyB3aWR0aFNyYyA9IC13aWR0aFNyYzsgeFNyYyAtPSB3aWR0aFNyYzsgfQogICAgIGlmICh3aWR0aERzdCA8IDApICB7IHdpZHRoRHN0ID0gLXdpZHRoRHN0OyB4RHN0IC09IHdpZHRoRHN0OyB9CkBAIC05NjQsMjggKzk2NCwyOCBAQAogCiAgICAgICAvKiBHZXQgdGhlIGRlc3RpbmF0aW9uIHZpc2libGUgcmVjdGFuZ2xlICovCiAKLSAgICBTZXRSZWN0KCAmdG1wUmVjdCwgeERzdCwgeURzdCwgeERzdCArIHdpZHRoRHN0LCB5RHN0ICsgaGVpZ2h0RHN0ICk7Ci0gICAgR2V0UmduQm94KCBkY0RzdC0+dy5oR0NDbGlwUmduLCAmY2xpcFJlY3QgKTsKLSAgICBPZmZzZXRSZWN0KCAmY2xpcFJlY3QsIGRjRHN0LT53LkRDT3JnWCwgZGNEc3QtPncuRENPcmdZICk7Ci0gICAgaWYgKCFJbnRlcnNlY3RSZWN0KCB2aXNSZWN0RHN0LCAmdG1wUmVjdCwgJmNsaXBSZWN0ICkpIHJldHVybiBGQUxTRTsKKyAgICBTZXRSZWN0MTYoICZ0bXBSZWN0LCB4RHN0LCB5RHN0LCB4RHN0ICsgd2lkdGhEc3QsIHlEc3QgKyBoZWlnaHREc3QgKTsKKyAgICBHZXRSZ25Cb3gxNiggZGNEc3QtPncuaEdDQ2xpcFJnbiwgJmNsaXBSZWN0ICk7CisgICAgT2Zmc2V0UmVjdDE2KCAmY2xpcFJlY3QsIGRjRHN0LT53LkRDT3JnWCwgZGNEc3QtPncuRENPcmdZICk7CisgICAgaWYgKCFJbnRlcnNlY3RSZWN0MTYoIHZpc1JlY3REc3QsICZ0bXBSZWN0LCAmY2xpcFJlY3QgKSkgcmV0dXJuIEZBTFNFOwogCiAgICAgICAvKiBHZXQgdGhlIHNvdXJjZSB2aXNpYmxlIHJlY3RhbmdsZSAqLwogCiAgICAgaWYgKCFkY1NyYykgcmV0dXJuIFRSVUU7Ci0gICAgU2V0UmVjdCggJnRtcFJlY3QsIHhTcmMsIHlTcmMsIHhTcmMgKyB3aWR0aFNyYywgeVNyYyArIGhlaWdodFNyYyApOworICAgIFNldFJlY3QxNiggJnRtcFJlY3QsIHhTcmMsIHlTcmMsIHhTcmMgKyB3aWR0aFNyYywgeVNyYyArIGhlaWdodFNyYyApOwogICAgIC8qIEFwcGFyZW50bHkgdGhlIGNsaXAgcmVnaW9uIGlzIG9ubHkgZm9yIG91dHB1dCwgc28gdXNlIGhWaXNSZ24gaGVyZSAqLwotICAgIEdldFJnbkJveCggZGNTcmMtPncuaFZpc1JnbiwgJmNsaXBSZWN0ICk7Ci0gICAgT2Zmc2V0UmVjdCggJmNsaXBSZWN0LCBkY1NyYy0+dy5EQ09yZ1gsIGRjU3JjLT53LkRDT3JnWSApOwotICAgIGlmICghSW50ZXJzZWN0UmVjdCggdmlzUmVjdFNyYywgJnRtcFJlY3QsICZjbGlwUmVjdCApKSByZXR1cm4gRkFMU0U7CisgICAgR2V0UmduQm94MTYoIGRjU3JjLT53LmhWaXNSZ24sICZjbGlwUmVjdCApOworICAgIE9mZnNldFJlY3QxNiggJmNsaXBSZWN0LCBkY1NyYy0+dy5EQ09yZ1gsIGRjU3JjLT53LkRDT3JnWSApOworICAgIGlmICghSW50ZXJzZWN0UmVjdDE2KCB2aXNSZWN0U3JjLCAmdG1wUmVjdCwgJmNsaXBSZWN0ICkpIHJldHVybiBGQUxTRTsKIAogICAgICAgLyogSW50ZXJzZWN0IHRoZSByZWN0YW5nbGVzICovCiAKICAgICBpZiAoKHdpZHRoU3JjID09IHdpZHRoRHN0KSAmJiAoaGVpZ2h0U3JjID09IGhlaWdodERzdCkpIC8qIG5vIHN0cmV0Y2hpbmcgKi8KICAgICB7Ci0gICAgICAgIE9mZnNldFJlY3QoIHZpc1JlY3RTcmMsIHhEc3QgLSB4U3JjLCB5RHN0IC0geVNyYyApOwotICAgICAgICBpZiAoIUludGVyc2VjdFJlY3QoICZ0bXBSZWN0LCB2aXNSZWN0U3JjLCB2aXNSZWN0RHN0ICkpIHJldHVybiBGQUxTRTsKKyAgICAgICAgT2Zmc2V0UmVjdDE2KCB2aXNSZWN0U3JjLCB4RHN0IC0geFNyYywgeURzdCAtIHlTcmMgKTsKKyAgICAgICAgaWYgKCFJbnRlcnNlY3RSZWN0MTYoICZ0bXBSZWN0LCB2aXNSZWN0U3JjLCB2aXNSZWN0RHN0ICkpIHJldHVybiBGQUxTRTsKICAgICAgICAgKnZpc1JlY3RTcmMgPSAqdmlzUmVjdERzdCA9IHRtcFJlY3Q7Ci0gICAgICAgIE9mZnNldFJlY3QoIHZpc1JlY3RTcmMsIHhTcmMgLSB4RHN0LCB5U3JjIC0geURzdCApOworICAgICAgICBPZmZzZXRSZWN0MTYoIHZpc1JlY3RTcmMsIHhTcmMgLSB4RHN0LCB5U3JjIC0geURzdCApOwogICAgIH0KICAgICBlbHNlICAvKiBzdHJldGNoaW5nICovCiAgICAgewpAQCAtOTk1LDcgKzk5NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh2aXNSZWN0U3JjLT5yaWdodC14U3JjKSAqIHdpZHRoRHN0KSAvIHdpZHRoU3JjOwogICAgICAgICB2aXNSZWN0U3JjLT5ib3R0b20gPSB5RHN0ICsKICAgICAgICAgICAgICAgICAgICAgICAgICAoKHZpc1JlY3RTcmMtPmJvdHRvbS15U3JjKSAqIGhlaWdodERzdCkgLyBoZWlnaHRTcmM7Ci0gICAgICAgIGlmICghSW50ZXJzZWN0UmVjdCggJnRtcFJlY3QsIHZpc1JlY3RTcmMsIHZpc1JlY3REc3QgKSkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIUludGVyc2VjdFJlY3QxNiggJnRtcFJlY3QsIHZpc1JlY3RTcmMsIHZpc1JlY3REc3QgKSkgcmV0dXJuIEZBTFNFOwogICAgICAgICAqdmlzUmVjdFNyYyA9ICp2aXNSZWN0RHN0ID0gdG1wUmVjdDsKICAgICAgICAgdmlzUmVjdFNyYy0+bGVmdCA9IHhTcmMgKyAodmlzUmVjdFNyYy0+bGVmdC14RHN0KSp3aWR0aFNyYy93aWR0aERzdDsKICAgICAgICAgdmlzUmVjdFNyYy0+dG9wID0geVNyYyArICh2aXNSZWN0U3JjLT50b3AteURzdCkqaGVpZ2h0U3JjL2hlaWdodERzdDsKQEAgLTEwMDMsNyArMTAwMyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh2aXNSZWN0U3JjLT5yaWdodC14RHN0KSAqIHdpZHRoU3JjKSAvIHdpZHRoRHN0OwogICAgICAgICB2aXNSZWN0U3JjLT5ib3R0b20gPSB5U3JjICsKICAgICAgICAgICAgICAgICAgICAgICAgICAoKHZpc1JlY3RTcmMtPmJvdHRvbS15RHN0KSAqIGhlaWdodFNyYykgLyBoZWlnaHREc3Q7Ci0gICAgICAgIGlmIChJc1JlY3RFbXB0eSggdmlzUmVjdFNyYyApKSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmIChJc1JlY3RFbXB0eTE2KCB2aXNSZWN0U3JjICkpIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgcmV0dXJuIFRSVUU7CiB9CkBAIC0xMDIwLDcgKzEwMjAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCB3aWR0aFNyYywgc2hvcnQgaGVpZ2h0U3JjLCBEV09SRCByb3AgKQogewogICAgIEJPT0wgdXNlUGF0LCB1c2VTcmMsIHVzZURzdCwgZGVzdFVzZWQsIGZTdHJldGNoLCBmTnVsbEJydXNoOwotICAgIFJFQ1QgdmlzUmVjdERzdCwgdmlzUmVjdFNyYzsKKyAgICBSRUNUMTYgdmlzUmVjdERzdCwgdmlzUmVjdFNyYzsKICAgICBzaG9ydCB3aWR0aCwgaGVpZ2h0OwogICAgIGNvbnN0IEJZVEUgKm9wY29kZTsKICAgICBQaXhtYXAgcGl4bWFwc1szXSA9IHsgMCwgMCwgMCB9OyAgLyogcGl4bWFwcyBmb3IgRFNULCBTUkMsIFRNUCAqLwpAQCAtMTExMywxMSArMTExMywxMyBAQAogICAgIGNhc2UgU1JDQ09QWTogIC8qIDB4Y2MgKi8KICAgICAgICAgaWYgKGRjU3JjLT53LmJpdHNQZXJQaXhlbCA9PSBkY0RzdC0+dy5iaXRzUGVyUGl4ZWwpCiAgICAgICAgIHsKKyAgICAgICAgICAgIFhTZXRHcmFwaGljc0V4cG9zdXJlcyggZGlzcGxheSwgZGNEc3QtPnUueC5nYywgVHJ1ZSApOwogICAgICAgICAgICAgWFNldEZ1bmN0aW9uKCBkaXNwbGF5LCBkY0RzdC0+dS54LmdjLCBHWGNvcHkgKTsKIAkgICAgWENvcHlBcmVhKCBkaXNwbGF5LCBkY1NyYy0+dS54LmRyYXdhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICBkY0RzdC0+dS54LmRyYXdhYmxlLCBkY0RzdC0+dS54LmdjLAogICAgICAgICAgICAgICAgICAgICAgICB2aXNSZWN0U3JjLmxlZnQsIHZpc1JlY3RTcmMudG9wLAogICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCB2aXNSZWN0RHN0LmxlZnQsIHZpc1JlY3REc3QudG9wICk7CisgICAgICAgICAgICBYU2V0R3JhcGhpY3NFeHBvc3VyZXMoIGRpc3BsYXksIGRjRHN0LT51LnguZ2MsIEZhbHNlICk7CiAgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQogICAgICAgICBpZiAoZGNTcmMtPncuYml0c1BlclBpeGVsID09IDEpCkBAIC0xMTI1LDEwICsxMTI3LDEyIEBACiAgICAgICAgICAgICBYU2V0QmFja2dyb3VuZCggZGlzcGxheSwgZGNEc3QtPnUueC5nYywgZGNEc3QtPncudGV4dFBpeGVsICk7CiAgICAgICAgICAgICBYU2V0Rm9yZWdyb3VuZCggZGlzcGxheSwgZGNEc3QtPnUueC5nYywgZGNEc3QtPncuYmFja2dyb3VuZFBpeGVsICk7CiAgICAgICAgICAgICBYU2V0RnVuY3Rpb24oIGRpc3BsYXksIGRjRHN0LT51LnguZ2MsIEdYY29weSApOworICAgICAgICAgICAgWFNldEdyYXBoaWNzRXhwb3N1cmVzKCBkaXNwbGF5LCBkY0RzdC0+dS54LmdjLCBUcnVlICk7CiAJICAgIFhDb3B5UGxhbmUoIGRpc3BsYXksIGRjU3JjLT51LnguZHJhd2FibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICBkY0RzdC0+dS54LmRyYXdhYmxlLCBkY0RzdC0+dS54LmdjLAogICAgICAgICAgICAgICAgICAgICAgICAgdmlzUmVjdFNyYy5sZWZ0LCB2aXNSZWN0U3JjLnRvcCwKICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIHZpc1JlY3REc3QubGVmdCwgdmlzUmVjdERzdC50b3AsIDEgKTsKKyAgICAgICAgICAgIFhTZXRHcmFwaGljc0V4cG9zdXJlcyggZGlzcGxheSwgZGNEc3QtPnUueC5nYywgRmFsc2UgKTsKICAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvb2JqZWN0cy9iaXRtYXAuYyBiL29iamVjdHMvYml0bWFwLmMKaW5kZXggYjk5MjEyNC4uOWVmZWQxMiAxMDA2NDQKLS0tIGEvb2JqZWN0cy9iaXRtYXAuYworKysgYi9vYmplY3RzL2JpdG1hcC5jCkBAIC0zMTcsMTAgKzMxNywxMSBAQAogICAgIHJldHVybiBDcmVhdGVDb21wYXRpYmxlQml0bWFwKGhkYywgd2lkdGgsIGhlaWdodCk7CiB9CiAKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2V0Qml0bWFwRGltZW5zaW9uRXggICAgKEdESS40NjgpCisgKiAgICAgICAgICAgR2V0Qml0bWFwRGltZW5zaW9uRXgxNiAgICAoR0RJLjQ2OCkKICAqLwotQk9PTCBHZXRCaXRtYXBEaW1lbnNpb25FeCggSEJJVE1BUCBoYml0bWFwLCBMUFNJWkUgc2l6ZSApCitCT09MMTYgR2V0Qml0bWFwRGltZW5zaW9uRXgxNiggSEJJVE1BUDE2IGhiaXRtYXAsIExQU0laRTE2IHNpemUgKQogewogICAgIEJJVE1BUE9CSiAqIGJtcCA9IChCSVRNQVBPQkogKikgR0RJX0dldE9ialB0ciggaGJpdG1hcCwgQklUTUFQX01BR0lDICk7CiAgICAgaWYgKCFibXApIHJldHVybiBGQUxTRTsKQEAgLTMzMCwxOSArMzMxLDM0IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2V0Qml0bWFwRGltZW5zaW9uICAgIChHREkuMTYyKQorICogICAgICAgICAgIEdldEJpdG1hcERpbWVuc2lvbkV4MzIgICAgKEdESS40NjgpCiAgKi8KLURXT1JEIEdldEJpdG1hcERpbWVuc2lvbiggSEJJVE1BUCBoYml0bWFwICkKK0JPT0wzMiBHZXRCaXRtYXBEaW1lbnNpb25FeDMyKCBIQklUTUFQMzIgaGJpdG1hcCwgTFBTSVpFMzIgc2l6ZSApCiB7Ci0gICAgU0laRSBzaXplOwotICAgIGlmICghR2V0Qml0bWFwRGltZW5zaW9uRXgoIGhiaXRtYXAsICZzaXplICkpIHJldHVybiAwOwotICAgIHJldHVybiBzaXplLmN4IHwgKHNpemUuY3kgPDwgMTYpOworICAgIEJJVE1BUE9CSiAqIGJtcCA9IChCSVRNQVBPQkogKikgR0RJX0dldE9ialB0ciggaGJpdG1hcCwgQklUTUFQX01BR0lDICk7CisgICAgaWYgKCFibXApIHJldHVybiBGQUxTRTsKKyAgICBzaXplLT5jeCA9IChJTlQzMilibXAtPnNpemUuY3g7CisgICAgc2l6ZS0+Y3kgPSAoSU5UMzIpYm1wLT5zaXplLmN5OworICAgIHJldHVybiBUUlVFOwogfQogCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFNldEJpdG1hcERpbWVuc2lvbkV4ICAgIChHREkuNDc4KQorICogICAgICAgICAgIEdldEJpdG1hcERpbWVuc2lvbiAgICAoR0RJLjE2MikKICAqLwotQk9PTCBTZXRCaXRtYXBEaW1lbnNpb25FeCggSEJJVE1BUCBoYml0bWFwLCBzaG9ydCB4LCBzaG9ydCB5LCBMUFNJWkUgcHJldlNpemUgKQorRFdPUkQgR2V0Qml0bWFwRGltZW5zaW9uKCBIQklUTUFQMTYgaGJpdG1hcCApCit7CisgICAgU0laRTE2IHNpemU7CisgICAgaWYgKCFHZXRCaXRtYXBEaW1lbnNpb25FeDE2KCBoYml0bWFwLCAmc2l6ZSApKSByZXR1cm4gMDsKKyAgICByZXR1cm4gTUFLRUxPTkcoIHNpemUuY3gsIHNpemUuY3kgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBTZXRCaXRtYXBEaW1lbnNpb25FeDE2ICAgIChHREkuNDc4KQorICovCitCT09MMTYgU2V0Qml0bWFwRGltZW5zaW9uRXgxNiggSEJJVE1BUDE2IGhiaXRtYXAsIElOVDE2IHgsIElOVDE2IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBTSVpFMTYgcHJldlNpemUgKQogewogICAgIEJJVE1BUE9CSiAqIGJtcCA9IChCSVRNQVBPQkogKikgR0RJX0dldE9ialB0ciggaGJpdG1hcCwgQklUTUFQX01BR0lDICk7CiAgICAgaWYgKCFibXApIHJldHVybiBGQUxTRTsKQEAgLTM1NCwxMSArMzcwLDI2IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgU2V0Qml0bWFwRGltZW5zaW9uRXgzMiAgICAoR0RJLjQ3OCkKKyAqLworQk9PTDMyIFNldEJpdG1hcERpbWVuc2lvbkV4MzIoIEhCSVRNQVAzMiBoYml0bWFwLCBJTlQzMiB4LCBJTlQzMiB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQU0laRTMyIHByZXZTaXplICkKK3sKKyAgICBCSVRNQVBPQkogKiBibXAgPSAoQklUTUFQT0JKICopIEdESV9HZXRPYmpQdHIoIGhiaXRtYXAsIEJJVE1BUF9NQUdJQyApOworICAgIGlmICghYm1wKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKHByZXZTaXplKSBDT05WX1NJWkUxNlRPMzIoICZibXAtPnNpemUsIHByZXZTaXplICk7CisgICAgYm1wLT5zaXplLmN4ID0gKElOVDE2KXg7CisgICAgYm1wLT5zaXplLmN5ID0gKElOVDE2KXk7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgU2V0Qml0bWFwRGltZW5zaW9uICAgIChHREkuMTYzKQogICovCi1EV09SRCBTZXRCaXRtYXBEaW1lbnNpb24oIEhCSVRNQVAgaGJpdG1hcCwgc2hvcnQgeCwgc2hvcnQgeSApCitEV09SRCBTZXRCaXRtYXBEaW1lbnNpb24oIEhCSVRNQVAxNiBoYml0bWFwLCBJTlQxNiB4LCBJTlQxNiB5ICkKIHsKLSAgICBTSVpFIHNpemU7Ci0gICAgaWYgKCFTZXRCaXRtYXBEaW1lbnNpb25FeCggaGJpdG1hcCwgeCwgeSwgJnNpemUgKSkgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIHNpemUuY3ggfCAoc2l6ZS5jeSA8PCAxNik7ICAgIAorICAgIFNJWkUxNiBzaXplOworICAgIGlmICghU2V0Qml0bWFwRGltZW5zaW9uRXgxNiggaGJpdG1hcCwgeCwgeSwgJnNpemUgKSkgcmV0dXJuIDA7CisgICAgcmV0dXJuIE1BS0VMT05HKCBzaXplLmN4LCBzaXplLmN5ICk7CiB9CmRpZmYgLS1naXQgYS9vYmplY3RzL2NsaXBwaW5nLmMgYi9vYmplY3RzL2NsaXBwaW5nLmMKaW5kZXggZmM5NjAxNy4uNzA2NGQwMyAxMDA2NDQKLS0tIGEvb2JqZWN0cy9jbGlwcGluZy5jCisrKyBiL29iamVjdHMvY2xpcHBpbmcuYwpAQCAtMzA0LDExICszMDQsMTEgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBSZWN0VmlzaWJsZSAgICAoR0RJLjEwNCkKKyAqICAgICAgICAgICBSZWN0VmlzaWJsZTE2ICAgIChHREkuMTA0KQogICovCi1CT09MIFJlY3RWaXNpYmxlKCBIREMgaGRjLCBMUFJFQ1QgcmVjdCApCitCT09MMTYgUmVjdFZpc2libGUxNiggSERDMTYgaGRjLCBMUFJFQ1QxNiByZWN0ICkKIHsKLSAgICBSRUNUIHRtcFJlY3Q7CisgICAgUkVDVDE2IHRtcFJlY3Q7CiAgICAgREMgKiBkYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKCBoZGMsIERDX01BR0lDICk7CiAgICAgaWYgKCFkYykgcmV0dXJuIEZBTFNFOwogICAgIGRwcmludGZfY2xpcHBpbmcoc3RkZGViLCJSZWN0VmlzaWJsZTogJTA0eCAlZCwlZHglZCwlZFxuIiwKQEAgLTMxNiwyMiArMzE2LDQ2IEBACiAgICAgaWYgKCFkYy0+dy5oR0NDbGlwUmduKSByZXR1cm4gRkFMU0U7CiAgICAgLyogY29weSByZWN0YW5nbGUgdG8gYXZvaWQgb3ZlcndyaXRpbmcgYnkgTFB0b0RQICovCiAgICAgdG1wUmVjdCA9ICpyZWN0OwotICAgIExQdG9EUCggaGRjLCAoTFBQT0lOVCkmdG1wUmVjdCwgMiApOwotICAgIHJldHVybiBSZWN0SW5SZWdpb24oIGRjLT53LmhHQ0NsaXBSZ24sICZ0bXBSZWN0ICk7CisgICAgTFB0b0RQMTYoIGhkYywgKExQUE9JTlQxNikmdG1wUmVjdCwgMiApOworICAgIHJldHVybiBSZWN0SW5SZWdpb24xNiggZGMtPncuaEdDQ2xpcFJnbiwgJnRtcFJlY3QgKTsKIH0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBHZXRDbGlwQm94ICAgIChHREkuNzcpCisgKiAgICAgICAgICAgUmVjdFZpc2libGUzMiAgICAoR0RJMzIuMjgyKQogICovCi1pbnQgR2V0Q2xpcEJveCggSERDIGhkYywgTFBSRUNUIHJlY3QgKQorQk9PTDMyIFJlY3RWaXNpYmxlMzIoIEhEQzMyIGhkYywgTFBSRUNUMzIgcmVjdCApCit7CisgICAgUkVDVDE2IHJlY3QxNjsKKyAgICBDT05WX1JFQ1QzMlRPMTYoIHJlY3QsICZyZWN0MTYgKTsKKyAgICByZXR1cm4gUmVjdFZpc2libGUxNiggKEhEQzE2KWhkYywgJnJlY3QxNiApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdldENsaXBCb3gxNiAgICAoR0RJLjc3KQorICovCitJTlQxNiBHZXRDbGlwQm94MTYoIEhEQzE2IGhkYywgTFBSRUNUMTYgcmVjdCApCiB7CiAgICAgaW50IHJldDsKICAgICBEQyAqIGRjID0gKERDICopIEdESV9HZXRPYmpQdHIoIGhkYywgRENfTUFHSUMgKTsKICAgICBpZiAoIWRjKSByZXR1cm4gRVJST1I7ICAgIAotICAgIGRwcmludGZfY2xpcHBpbmcoc3RkZGViLCAiR2V0Q2xpcEJveDogJTA0eCAlcFxuIiwgaGRjLCByZWN0ICk7Ci0gICAgcmV0ID0gR2V0UmduQm94KCBkYy0+dy5oR0NDbGlwUmduLCByZWN0ICk7Ci0gICAgRFB0b0xQKCBoZGMsIChMUFBPSU5UKXJlY3QsIDIgKTsKKyAgICByZXQgPSBHZXRSZ25Cb3gxNiggZGMtPncuaEdDQ2xpcFJnbiwgcmVjdCApOworICAgIERQdG9MUDE2KCBoZGMsIChMUFBPSU5UMTYpcmVjdCwgMiApOworICAgIHJldHVybiByZXQ7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgR2V0Q2xpcEJveDMyICAgIChHREkzMi4xNjIpCisgKi8KK0lOVDMyIEdldENsaXBCb3gzMiggSERDMzIgaGRjLCBMUFJFQ1QzMiByZWN0ICkKK3sKKyAgICBJTlQzMiByZXQ7CisgICAgREMgKiBkYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKCBoZGMsIERDX01BR0lDICk7CisgICAgaWYgKCFkYykgcmV0dXJuIEVSUk9SOyAgICAKKyAgICByZXQgPSBHZXRSZ25Cb3gzMiggZGMtPncuaEdDQ2xpcFJnbiwgcmVjdCApOworICAgIERQdG9MUDMyKCBoZGMsIChMUFBPSU5UMzIpcmVjdCwgMiApOwogICAgIHJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL29iamVjdHMvY29sb3IuYyBiL29iamVjdHMvY29sb3IuYwppbmRleCA5ZDc4ZTU0Li40MWU2MTJhIDEwMDY0NAotLS0gYS9vYmplY3RzL2NvbG9yLmMKKysrIGIvb2JqZWN0cy9jb2xvci5jCkBAIC0xMDYsMTEgKzEwNiwxMSBAQAogICoKICAqIENyZWF0ZSB0aGUgc3lzdGVtIHBhbGV0dGUuCiAgKi8KLXN0YXRpYyBIUEFMRVRURSBDT0xPUl9Jbml0UGFsZXR0ZSh2b2lkKQorc3RhdGljIEhQQUxFVFRFMTYgQ09MT1JfSW5pdFBhbGV0dGUodm9pZCkKIHsKICAgICBpbnQgaSwgc2l6ZSwgcGl4ZWw7CiAgICAgWENvbG9yIGNvbG9yOwotICAgIEhQQUxFVFRFIGhwYWxldHRlOworICAgIEhQQUxFVFRFMTYgaHBhbGV0dGU7CiAgICAgTE9HUEFMRVRURSAqIHBhbFB0cjsKICAgICBXT1JEICpjb2xvclRyYW5zbGF0aW9uLCAqcmV2VHJhbnNsYXRpb247CiAKQEAgLTIxNSw3ICsyMTUsNyBAQAogICoKICAqIEluaXRpYWxpemUgY29sb3IgbWFwIGFuZCBzeXN0ZW0gcGFsZXR0ZS4KICAqLwotSFBBTEVUVEUgQ09MT1JfSW5pdCh2b2lkKQorSFBBTEVUVEUxNiBDT0xPUl9Jbml0KHZvaWQpCiB7CiAgICAgVmlzdWFsICogdmlzdWFsID0gRGVmYXVsdFZpc3VhbCggZGlzcGxheSwgRGVmYXVsdFNjcmVlbihkaXNwbGF5KSApOwogCmRpZmYgLS1naXQgYS9vYmplY3RzL2N1cnNvcmljb24uYyBiL29iamVjdHMvY3Vyc29yaWNvbi5jCmluZGV4IDc2Njg5NjcuLjcwMGI1M2IgMTAwNjQ0Ci0tLSBhL29iamVjdHMvY3Vyc29yaWNvbi5jCisrKyBiL29iamVjdHMvY3Vyc29yaWNvbi5jCkBAIC0zOSw3ICszOSw3IEBACiBDdXJzb3IgQ1VSU09SSUNPTl9YQ3Vyc29yID0gTm9uZTsgIC8qIEN1cnJlbnQgWCBjdXJzb3IgKi8KIHN0YXRpYyBIQ1VSU09SIGhBY3RpdmVDdXJzb3IgPSAwOyAgLyogQWN0aXZlIGN1cnNvciAqLwogc3RhdGljIGludCBDVVJTT1JfU2hvd0NvdW50ID0gMDsgICAvKiBDdXJzb3IgZGlzcGxheSBjb3VudCAqLwotc3RhdGljIFJFQ1QgQ1VSU09SX0NsaXBSZWN0OyAgICAgICAvKiBDdXJzb3IgY2xpcHBpbmcgcmVjdCAqLworc3RhdGljIFJFQ1QzMiBDVVJTT1JfQ2xpcFJlY3Q7ICAgICAgIC8qIEN1cnNvciBjbGlwcGluZyByZWN0ICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkgICAgQ1VSU09SSUNPTl9GaW5kQmVzdEljb24KQEAgLTIzNyw3ICsyMzcsNyBAQAogICAgIEhBTkRMRSBoQW5kQml0cywgaFhvckJpdHM7CiAgICAgSERDIGhkYzsKICAgICBpbnQgc2l6ZSwgc2l6ZUFuZCwgc2l6ZVhvcjsKLSAgICBQT0lOVCBob3RzcG90ID0geyAwICwwIH07CisgICAgUE9JTlQxNiBob3RzcG90ID0geyAwICwwIH07CiAgICAgQklUTUFQT0JKICpibXBYb3IsICpibXBBbmQ7CiAgICAgQklUTUFQSU5GTyAqYm1pLCAqcEluZm87CiAgICAgQ1VSU09SSUNPTklORk8gKmluZm87CkBAIC0yNDUsNyArMjQ1LDcgQEAKIAogICAgIGlmIChmQ3Vyc29yKSAgLyogSWYgY3Vyc29yLCBnZXQgdGhlIGhvdHNwb3QgKi8KICAgICB7Ci0gICAgICAgIFBPSU5UICpwdCA9IChQT0lOVCAqKUxvY2tSZXNvdXJjZSggaGFuZGxlICk7CisgICAgICAgIFBPSU5UMTYgKnB0ID0gKFBPSU5UMTYgKilMb2NrUmVzb3VyY2UoIGhhbmRsZSApOwogICAgICAgICBob3RzcG90ID0gKnB0OwogICAgICAgICBibWkgPSAoQklUTUFQSU5GTyAqKShwdCArIDEpOwogICAgIH0KQEAgLTg2NCwyMCArODY0LDMxIEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgQ2xpcEN1cnNvciAgICAoVVNFUi4xNikKKyAqICAgICAgICAgICBDbGlwQ3Vyc29yMTYgICAgKFVTRVIuMTYpCiAgKi8KLUJPT0wgQ2xpcEN1cnNvciggUkVDVCAqcmVjdCApCitCT09MMTYgQ2xpcEN1cnNvcjE2KCBjb25zdCBSRUNUMTYgKnJlY3QgKQogewotICAgIGlmICghcmVjdCkgU2V0UmVjdEVtcHR5KCAmQ1VSU09SX0NsaXBSZWN0ICk7Ci0gICAgZWxzZSBDb3B5UmVjdCggJkNVUlNPUl9DbGlwUmVjdCwgcmVjdCApOworICAgIGlmICghcmVjdCkgU2V0UmVjdEVtcHR5MzIoICZDVVJTT1JfQ2xpcFJlY3QgKTsKKyAgICBlbHNlIENPTlZfUkVDVDE2VE8zMiggcmVjdCwgJkNVUlNPUl9DbGlwUmVjdCApOwogICAgIHJldHVybiBUUlVFOwogfQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEdldEN1cnNvclBvcyAgICAoVVNFUi4xNykKKyAqICAgICAgICAgICBDbGlwQ3Vyc29yMzIgICAgKFVTRVIzMi41MikKICAqLwotdm9pZCBHZXRDdXJzb3JQb3MoIFBPSU5UICpwdCApCitCT09MMzIgQ2xpcEN1cnNvcjMyKCBjb25zdCBSRUNUMzIgKnJlY3QgKQoreworICAgIGlmICghcmVjdCkgU2V0UmVjdEVtcHR5MzIoICZDVVJTT1JfQ2xpcFJlY3QgKTsKKyAgICBlbHNlIENvcHlSZWN0MzIoICZDVVJTT1JfQ2xpcFJlY3QsIHJlY3QgKTsKKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBHZXRDdXJzb3JQb3MxNiAgICAoVVNFUi4xNykKKyAqLwordm9pZCBHZXRDdXJzb3JQb3MxNiggUE9JTlQxNiAqcHQgKQogewogICAgIFdpbmRvdyByb290LCBjaGlsZDsKICAgICBpbnQgcm9vdFgsIHJvb3RZLCBjaGlsZFgsIGNoaWxkWTsKQEAgLTg5NywxMSArOTA4LDMxIEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2V0Q2xpcEN1cnNvciAgICAoVVNFUi4zMDkpCisgKiAgICAgICAgICAgR2V0Q3Vyc29yUG9zMzIgICAgKFVTRVIzMi4yMjgpCiAgKi8KLXZvaWQgR2V0Q2xpcEN1cnNvciggUkVDVCAqcmVjdCApCit2b2lkIEdldEN1cnNvclBvczMyKCBQT0lOVDMyICpwdCApCiB7Ci0gICAgaWYgKHJlY3QpIENvcHlSZWN0KCByZWN0LCAmQ1VSU09SX0NsaXBSZWN0ICk7CisgICAgUE9JTlQxNiBwdDE2OworICAgIEdldEN1cnNvclBvczE2KCAmcHQxNiApOworICAgIGlmIChwdCkgQ09OVl9QT0lOVDE2VE8zMiggJnB0MTYsIHB0ICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgR2V0Q2xpcEN1cnNvcjE2ICAgIChVU0VSLjMwOSkKKyAqLwordm9pZCBHZXRDbGlwQ3Vyc29yMTYoIFJFQ1QxNiAqcmVjdCApCit7CisgICAgaWYgKHJlY3QpIENPTlZfUkVDVDMyVE8xNiggJkNVUlNPUl9DbGlwUmVjdCwgcmVjdCApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdldENsaXBDdXJzb3IzMiAgICAoVVNFUjMyLjIyMCkKKyAqLwordm9pZCBHZXRDbGlwQ3Vyc29yMzIoIFJFQ1QzMiAqcmVjdCApCit7CisgICAgaWYgKHJlY3QpIENvcHlSZWN0MzIoIHJlY3QsICZDVVJTT1JfQ2xpcFJlY3QgKTsKIH0KIAogCmRpZmYgLS1naXQgYS9vYmplY3RzL2RjdmFsdWVzLmMgYi9vYmplY3RzL2RjdmFsdWVzLmMKaW5kZXggY2Y2N2RlNy4uYjFiOTU5YiAxMDA2NDQKLS0tIGEvb2JqZWN0cy9kY3ZhbHVlcy5jCisrKyBiL29iamVjdHMvZGN2YWx1ZXMuYwpAQCAtMjYsMTMgKzI2LDIyIEBACiB9CiAKICNkZWZpbmUgRENfR0VUX1ZBTF9FWCggZnVuY19uYW1lLCByZXRfeCwgcmV0X3kgKSBcCi1CT09MIGZ1bmNfbmFtZSggSERDIGhkYywgTFBQT0lOVCBwdCApIFwKK0JPT0wxNiBmdW5jX25hbWUjIzE2KCBIREMxNiBoZGMsIExQUE9JTlQxNiBwdCApIFwKIHsgXAogICAgIERDICogZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBEQ19NQUdJQyApOyBcCiAgICAgaWYgKCFkYykgcmV0dXJuIEZBTFNFOyBcCiAgICAgcHQtPnggPSBkYy0+dy5yZXRfeDsgXAogICAgIHB0LT55ID0gZGMtPncucmV0X3k7IFwKICAgICByZXR1cm4gVFJVRTsgXAorfSBcCisgXAorQk9PTDMyIGZ1bmNfbmFtZSMjMzIoIEhEQzMyIGhkYywgTFBQT0lOVDMyIHB0ICkgXAoreyBcCisgICAgREMgKiBkYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKCAoSERDMTYpaGRjLCBEQ19NQUdJQyApOyBcCisgICAgaWYgKCFkYykgcmV0dXJuIEZBTFNFOyBcCisgICAgcHQtPnggPSBkYy0+dy5yZXRfeDsgXAorICAgIHB0LT55ID0gZGMtPncucmV0X3k7IFwKKyAgICByZXR1cm4gVFJVRTsgXAogfQogCiAjZGVmaW5lIERDX1NFVF9NT0RFKCBmdW5jX25hbWUsIGRjX2ZpZWxkLCBtaW5fdmFsLCBtYXhfdmFsLCBtZXRhX2Z1bmMgKSBcCmRpZmYgLS1naXQgYS9vYmplY3RzL2ZvbnQuYyBiL29iamVjdHMvZm9udC5jCmluZGV4IDc5MTdhNTMuLmFiNTdhYjIgMTAwNjQ0Ci0tLSBhL29iamVjdHMvZm9udC5jCisrKyBiL29iamVjdHMvZm9udC5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSAibWV0YWZpbGUuaCIKICNpbmNsdWRlICJjYWxsYmFjay5oIgogI2luY2x1ZGUgIm9wdGlvbnMuaCIKKyNpbmNsdWRlICJzdHJpbmczMi5oIgogI2luY2x1ZGUgInhtYWxsb2MuaCIKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCkBAIC02MTYsMTYgKzYxNywyOSBAQAogICovCiBEV09SRCBHZXRUZXh0RXh0ZW50KCBIREMgaGRjLCBMUENTVFIgc3RyLCBzaG9ydCBjb3VudCApCiB7Ci0gICAgU0laRSBzaXplOwotICAgIGlmICghR2V0VGV4dEV4dGVudFBvaW50KCBoZGMsIHN0ciwgY291bnQsICZzaXplICkpIHJldHVybiAwOworICAgIFNJWkUxNiBzaXplOworICAgIGlmICghR2V0VGV4dEV4dGVudFBvaW50MTYoIGhkYywgc3RyLCBjb3VudCwgJnNpemUgKSkgcmV0dXJuIDA7CiAgICAgcmV0dXJuIE1BS0VMT05HKCBzaXplLmN4LCBzaXplLmN5ICk7CiB9CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2V0VGV4dEV4dGVudFBvaW50ICAgIChHREkuNDcxKQorICogICAgICAgICAgIEdldFRleHRFeHRlbnRQb2ludDE2ICAgIChHREkuNDcxKQogICovCi1CT09MIEdldFRleHRFeHRlbnRQb2ludCggSERDIGhkYywgTFBDU1RSIHN0ciwgc2hvcnQgY291bnQsIExQU0laRSBzaXplICkKK0JPT0wxNiBHZXRUZXh0RXh0ZW50UG9pbnQxNiggSERDMTYgaGRjLCBMUENTVFIgc3RyLCBJTlQxNiBjb3VudCwgTFBTSVpFMTYgc2l6ZSkKK3sKKyAgICBTSVpFMzIgc2l6ZTMyOworICAgIEJPT0wzMiByZXQgPSBHZXRUZXh0RXh0ZW50UG9pbnQzMkEoIGhkYywgc3RyLCBjb3VudCwgJnNpemUzMiApOworICAgIENPTlZfU0laRTMyVE8xNiggJnNpemUzMiwgc2l6ZSApOworICAgIHJldHVybiAoQk9PTDE2KXJldDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBHZXRUZXh0RXh0ZW50UG9pbnQzMkEgICAgKEdESTMyLjIzMikKKyAqLworQk9PTDMyIEdldFRleHRFeHRlbnRQb2ludDMyQSggSERDMzIgaGRjLCBMUENTVFIgc3RyLCBJTlQzMiBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQU0laRTMyIHNpemUgKQogewogICAgIGludCBkaXIsIGFzY2VudCwgZGVzY2VudDsKICAgICBYQ2hhclN0cnVjdCBpbmZvOwpAQCAtNjM5LDEzICs2NTMsMjYgQEAKICAgICBzaXplLT5jeSA9IGFicygoZGMtPnUueC5mb250LmZzdHJ1Y3QtPmFzY2VudCtkYy0+dS54LmZvbnQuZnN0cnVjdC0+ZGVzY2VudCkKIAkJICAgICogZGMtPncuV25kRXh0WSAvIGRjLT53LlZwb3J0RXh0WSk7CiAKLSAgICBkcHJpbnRmX2ZvbnQoc3RkZGViLCJHZXRUZXh0RXh0ZW50UG9pbnQoJTA0eCAnJSouKnMnICVkICVwKTogcmV0dXJuaW5nICVkLCVkXG4iLAorICAgIGRwcmludGZfZm9udChzdGRkZWIsIkdldFRleHRFeHRlbnRQb2ludCglMDh4ICclKi4qcycgJWQgJXApOiByZXR1cm5pbmcgJWQsJWRcbiIsCiAJCSBoZGMsIGNvdW50LCBjb3VudCwgc3RyLCBjb3VudCwgc2l6ZSwgc2l6ZS0+Y3gsIHNpemUtPmN5ICk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgR2V0VGV4dEV4dGVudFBvaW50MzJXICAgIChHREkzMi4yMzMpCisgKi8KK0JPT0wzMiBHZXRUZXh0RXh0ZW50UG9pbnQzMlcoIEhEQzMyIGhkYywgTFBDV1NUUiBzdHIsIElOVDMyIGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBTSVpFMzIgc2l6ZSApCit7CisgICAgY2hhciAqcCA9IFNUUklORzMyX0R1cFVuaVRvQW5zaSggc3RyICk7CisgICAgQk9PTDMyIHJldCA9IEdldFRleHRFeHRlbnRQb2ludDMyQSggaGRjLCBwLCBjb3VudCwgc2l6ZSApOworICAgIGZyZWUoIHAgKTsKKyAgICByZXR1cm4gcmV0OworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEdldFRleHRNZXRyaWNzICAgIChHREkuOTMpCiAgKi8KIEJPT0wgR2V0VGV4dE1ldHJpY3MoIEhEQyBoZGMsIExQVEVYVE1FVFJJQyBtZXRyaWNzICkKQEAgLTY2Nyw2ICs2OTQsNDkgQEAKIAkJCQkgICAgICAqIGRjLT53LlduZEV4dFggLyBkYy0+dy5WcG9ydEV4dFggKTsKICAgICBtZXRyaWNzLT50bUF2ZUNoYXJXaWR0aCAgICA9IGFicyggbWV0cmljcy0+dG1BdmVDaGFyV2lkdGgKIAkJCQkgICAgICAqIGRjLT53LlduZEV4dFggLyBkYy0+dy5WcG9ydEV4dFggKTsKKworICAgIGRwcmludGZfZm9udChzdGRuaW1wLCJ0ZXh0IG1ldHJpY3M6XG4KKwlJbnRlcm5hbExlYWRpbmcgPSAlaQorCUV4dGVybmFsTGVhZGluZyA9ICVpCisJTWF4Q2hhcldpZHRoID0gJWkKKwlXZWlnaHQgPSAlaQorCUl0YWxpYyA9ICVpCisJVW5kZXJsaW5lZCA9ICVpCisJU3RydWNrT3V0ID0gJWkKKwlGaXJzdENoYXIgPSAlaQorCUxhc3RDaGFyID0gJWkKKwlEZWZhdWx0Q2hhciA9ICVpCisJQnJlYWtDaGFyID0gJWkKKwlDaGFyU2V0ID0gJWkKKwlPdmVyaGFuZyA9ICVpCisJRGlnaXRpemVkQXNwZWN0WCA9ICVpCisJRGlnaXRpemVkQXNwZWN0WSA9ICVpCisJQXZlQ2hhcldpZHRoID0gJWkKKwlNYXhDaGFyV2lkdGggPSAlaQorCUFzY2VudCA9ICVpCisJRGVzY2VudCA9ICVpCisJSGVpZ2h0ID0gJWlcbiIsCisgICAgbWV0cmljcy0+dG1JbnRlcm5hbExlYWRpbmcsCisgICAgbWV0cmljcy0+dG1FeHRlcm5hbExlYWRpbmcsCisgICAgbWV0cmljcy0+dG1NYXhDaGFyV2lkdGgsCisgICAgbWV0cmljcy0+dG1XZWlnaHQsCisgICAgbWV0cmljcy0+dG1JdGFsaWMsCisgICAgbWV0cmljcy0+dG1VbmRlcmxpbmVkLAorICAgIG1ldHJpY3MtPnRtU3RydWNrT3V0LAorICAgIG1ldHJpY3MtPnRtRmlyc3RDaGFyLAorICAgIG1ldHJpY3MtPnRtTGFzdENoYXIsCisgICAgbWV0cmljcy0+dG1EZWZhdWx0Q2hhciwKKyAgICBtZXRyaWNzLT50bUJyZWFrQ2hhciwKKyAgICBtZXRyaWNzLT50bUNoYXJTZXQsCisgICAgbWV0cmljcy0+dG1PdmVyaGFuZywKKyAgICBtZXRyaWNzLT50bURpZ2l0aXplZEFzcGVjdFgsCisgICAgbWV0cmljcy0+dG1EaWdpdGl6ZWRBc3BlY3RZLAorICAgIG1ldHJpY3MtPnRtQXZlQ2hhcldpZHRoLAorICAgIG1ldHJpY3MtPnRtTWF4Q2hhcldpZHRoLAorICAgIG1ldHJpY3MtPnRtQXNjZW50LAorICAgIG1ldHJpY3MtPnRtRGVzY2VudCwKKyAgICBtZXRyaWNzLT50bUhlaWdodCk7CisKICAgICByZXR1cm4gVFJVRTsKIH0KIApkaWZmIC0tZ2l0IGEvb2JqZWN0cy9nZGlvYmouYyBiL29iamVjdHMvZ2Rpb2JqLmMKaW5kZXggZTk1N2Y3ZS4uNmFmNGQ5NCAxMDA2NDQKLS0tIGEvb2JqZWN0cy9nZGlvYmouYworKysgYi9vYmplY3RzL2dkaW9iai5jCkBAIC0xMSwxMiArMTEsMTIgQEAKICNpbmNsdWRlICJiaXRtYXAuaCIKICNpbmNsdWRlICJicnVzaC5oIgogI2luY2x1ZGUgImZvbnQuaCIKKyNpbmNsdWRlICJoZWFwLmgiCiAjaW5jbHVkZSAicGFsZXR0ZS5oIgogI2luY2x1ZGUgInBlbi5oIgogI2luY2x1ZGUgInJlZ2lvbi5oIgogI2luY2x1ZGUgImNhbGxiYWNrLmgiCiAjaW5jbHVkZSAic3RkZGVidWcuaCIKLS8qICNkZWZpbmUgREVCVUdfR0RJICovCiAjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJ4bWFsbG9jLmgiCiAKQEAgLTE2MCw3ICsxNjAsNyBAQAogICovCiBCT09MIEdESV9Jbml0KHZvaWQpCiB7Ci0gICAgSFBBTEVUVEUgaHBhbGV0dGU7CisgICAgSFBBTEVUVEUxNiBocGFsZXR0ZTsKIAogICAgICAgLyogQ3JlYXRlIGRlZmF1bHQgcGFsZXR0ZSAqLwogCkBAIC0yNDQsNyArMjQ0LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIERlbGV0ZU9iamVjdCAgICAoR0RJLjY5KQogICovCi1CT09MIERlbGV0ZU9iamVjdCggSEdESU9CSiBvYmogKQorQk9PTCBEZWxldGVPYmplY3QoIEhHRElPQkoxNiBvYmogKQogewogICAgICAgLyogQ2hlY2sgaWYgb2JqZWN0IGlzIHZhbGlkICovCiAKQEAgLTM4MCw2ICszODAsOCBAQAogICAgIH07CiAgICAgCiAgICAgaW50IGksIHJldHZhbCA9IDA7CisgICAgTE9HUEVOICpwZW47CisgICAgTE9HQlJVU0ggKmJydXNoID0gTlVMTDsKIAogICAgIGRwcmludGZfZ2RpKCBzdGRkZWIsICJFbnVtT2JqZWN0czogJTA0eCAlZCAlMDhseCAlMDhseFxuIiwKICAgICAgICAgICAgICAgICAgaGRjLCBuT2JqVHlwZSwgKERXT1JEKWxwRW51bUZ1bmMsIGxQYXJhbSApOwpAQCAtMzg3LDQwICszODksNTAgQEAKICAgICB7CiAgICAgY2FzZSBPQkpfUEVOOgogICAgICAgICAvKiBFbnVtZXJhdGUgc29saWQgcGVucyAqLworICAgICAgICBpZiAoIShwZW4gPSBTRUdQVFJfTkVXKExPR1BFTikpKSBicmVhazsKICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZihzb2xpZF9jb2xvcnMpL3NpemVvZihzb2xpZF9jb2xvcnNbMF0pOyBpKyspCiAgICAgICAgIHsKLSAgICAgICAgICAgIExPR1BFTiBwZW4gPSB7IFBTX1NPTElELCB7IDEsIDAgfSwgc29saWRfY29sb3JzW2ldIH07Ci0gICAgICAgICAgICByZXR2YWwgPSBDYWxsRW51bU9iamVjdHNQcm9jKCBscEVudW1GdW5jLCBNQUtFX1NFR1BUUigmcGVuKSwKKyAgICAgICAgICAgIHBlbi0+bG9wblN0eWxlICAgPSBQU19TT0xJRDsKKyAgICAgICAgICAgIHBlbi0+bG9wbldpZHRoLnggPSAxOworICAgICAgICAgICAgcGVuLT5sb3BuV2lkdGgueSA9IDA7CisgICAgICAgICAgICBwZW4tPmxvcG5Db2xvciAgID0gc29saWRfY29sb3JzW2ldOworICAgICAgICAgICAgcmV0dmFsID0gQ2FsbEVudW1PYmplY3RzUHJvYyggbHBFbnVtRnVuYywgU0VHUFRSX0dFVChwZW4pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbFBhcmFtICk7CiAgICAgICAgICAgICBkcHJpbnRmX2dkaSggc3RkZGViLCAiRW51bU9iamVjdDogc29saWQgcGVuICUwOGx4LCByZXQ9JWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc29saWRfY29sb3JzW2ldLCByZXR2YWwpOwogICAgICAgICAgICAgaWYgKCFyZXR2YWwpIGJyZWFrOwogICAgICAgICB9CisgICAgICAgIFNFR1BUUl9GUkVFKHBlbik7CiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBPQkpfQlJVU0g6CiAgICAgICAgIC8qIEVudW1lcmF0ZSBzb2xpZCBicnVzaGVzICovCisgICAgICAgIGlmICghKGJydXNoID0gU0VHUFRSX05FVyhMT0dCUlVTSCkpKSBicmVhazsKICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZihzb2xpZF9jb2xvcnMpL3NpemVvZihzb2xpZF9jb2xvcnNbMF0pOyBpKyspCiAgICAgICAgIHsKLSAgICAgICAgICAgIExPR0JSVVNIIGJydXNoID0geyBCU19TT0xJRCwgc29saWRfY29sb3JzW2ldLCAwIH07Ci0gICAgICAgICAgICByZXR2YWwgPSBDYWxsRW51bU9iamVjdHNQcm9jKCBscEVudW1GdW5jLCBNQUtFX1NFR1BUUigmYnJ1c2gpLAorICAgICAgICAgICAgYnJ1c2gtPmxiU3R5bGUgPSBCU19TT0xJRDsKKyAgICAgICAgICAgIGJydXNoLT5sYkNvbG9yID0gc29saWRfY29sb3JzW2ldOworICAgICAgICAgICAgYnJ1c2gtPmxiSGF0Y2ggPSAwOworICAgICAgICAgICAgcmV0dmFsID0gQ2FsbEVudW1PYmplY3RzUHJvYyggbHBFbnVtRnVuYywgU0VHUFRSX0dFVChicnVzaCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsUGFyYW0gKTsKICAgICAgICAgICAgIGRwcmludGZfZ2RpKCBzdGRkZWIsICJFbnVtT2JqZWN0OiBzb2xpZCBicnVzaCAlMDhseCwgcmV0PSVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgIHNvbGlkX2NvbG9yc1tpXSwgcmV0dmFsKTsKICAgICAgICAgICAgIGlmICghcmV0dmFsKSBicmVhazsKICAgICAgICAgfQotICAgICAgICBpZiAoIXJldHZhbCkgYnJlYWs7CiAKICAgICAgICAgLyogTm93IGVudW1lcmF0ZSBoYXRjaGVkIGJydXNoZXMgKi8KLSAgICAgICAgZm9yIChpID0gSFNfSE9SSVpPTlRBTDsgaSA8PSBIU19ESUFHQ1JPU1M7IGkrKykKKyAgICAgICAgaWYgKHJldHZhbCkgZm9yIChpID0gSFNfSE9SSVpPTlRBTDsgaSA8PSBIU19ESUFHQ1JPU1M7IGkrKykKICAgICAgICAgewotICAgICAgICAgICAgTE9HQlJVU0ggYnJ1c2ggPSB7IEJTX0hBVENIRUQsIFJHQigwLDAsMCksIGkgfTsKLSAgICAgICAgICAgIHJldHZhbCA9IENhbGxFbnVtT2JqZWN0c1Byb2MoIGxwRW51bUZ1bmMsIE1BS0VfU0VHUFRSKCZicnVzaCksCisgICAgICAgICAgICBicnVzaC0+bGJTdHlsZSA9IEJTX0hBVENIRUQ7CisgICAgICAgICAgICBicnVzaC0+bGJDb2xvciA9IFJHQigwLDAsMCk7CisgICAgICAgICAgICBicnVzaC0+bGJIYXRjaCA9IGk7CisgICAgICAgICAgICByZXR2YWwgPSBDYWxsRW51bU9iamVjdHNQcm9jKCBscEVudW1GdW5jLCBTRUdQVFJfR0VUKGJydXNoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxQYXJhbSApOwogICAgICAgICAgICAgZHByaW50Zl9nZGkoIHN0ZGRlYiwgIkVudW1PYmplY3Q6IGhhdGNoZWQgYnJ1c2ggJWQsIHJldD0lZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBpLCByZXR2YWwpOwogICAgICAgICAgICAgaWYgKCFyZXR2YWwpIGJyZWFrOwogICAgICAgICB9CisgICAgICAgIFNFR1BUUl9GUkVFKGJydXNoKTsKICAgICAgICAgYnJlYWs7CiAKICAgICBkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvb2JqZWN0cy9tZXRhZmlsZS5jIGIvb2JqZWN0cy9tZXRhZmlsZS5jCmluZGV4IDZjYTgxNGEuLjk4M2I0MTkgMTAwNjQ0Ci0tLSBhL29iamVjdHMvbWV0YWZpbGUuYworKysgYi9vYmplY3RzL21ldGFmaWxlLmMKQEAgLTMwNyw3ICszMDcsNyBAQAogewogICAgIE1FVEFIRUFERVIgKm1oID0gKE1FVEFIRUFERVIgKilHbG9iYWxMb2NrMTYoaG1mKTsKICAgICBNRVRBUkVDT1JEICptcjsKLSAgICBIQU5ETEVUQUJMRSAqaHQ7CisgICAgU0VHUFRSIGh0OwogICAgIGludCBvZmZzZXQgPSAwOwogICAKICAgICBkcHJpbnRmX21ldGFmaWxlKHN0ZGRlYiwiRW51bU1ldGFGaWxlKCUwNHgsICUwNHgsICUwOGx4LCAlMDhseClcbiIsCkBAIC0zMTcsNyArMzE3LDcgQEAKICAgICAKICAgICBoSFQgPSBHbG9iYWxBbGxvYzE2KEdNRU1fTU9WRUFCTEUgfCBHTUVNX1pFUk9JTklULAogCQkgICAgIHNpemVvZihIQU5ETEVUQUJMRSkgKiBtaC0+bXROb09iamVjdHMpOwotICAgIGh0ID0gKEhBTkRMRVRBQkxFICopR2xvYmFsTG9jazE2KGhIVCk7CisgICAgaHQgPSBXSU4xNl9HbG9iYWxMb2NrMTYoaEhUKTsKICAgIAogICAgIG9mZnNldCA9IG1oLT5tdEhlYWRlclNpemUgKiAyOwogICAgIApAQCAtMzI2LDkgKzMyNiw4IEBACiAgICAgd2hpbGUgKG9mZnNldCA8IChtaC0+bXRTaXplICogMikpCiAgICAgewogCW1yID0gKE1FVEFSRUNPUkQgKikoKGNoYXIgKiltaCArIG9mZnNldCk7Ci0gICAgICAgIGlmICghQ2FsbEVudW1NZXRhZmlsZVByb2MobHBFbnVtRnVuYywgaGRjLCBNQUtFX1NFR1BUUihodCksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBNQUtFX1NFR1BUUihtciksIG1oLT5tdE5vT2JqZWN0cywKLQkJCQkgIChMT05HKWxwRGF0YSkpCisgICAgICAgIGlmICghQ2FsbEVudW1NZXRhZmlsZVByb2MobHBFbnVtRnVuYywgaGRjLCBodCwgTUFLRV9TRUdQVFIobXIpLCAgLyogRklYTUUhISAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1oLT5tdE5vT2JqZWN0cywgKExPTkcpbHBEYXRhKSkKIAkgICAgYnJlYWs7CiAKIAlvZmZzZXQgKz0gKG1yLT5yZFNpemUgKiAyKTsKQEAgLTUwNCwyMiArNTAzLDIyIEBACiAKICAgICBjYXNlIE1FVEFfVEVYVE9VVDoKIAlzMSA9ICoobXItPnJkUGFyYW0pOwotCVRleHRPdXQoaGRjLCAqKG1yLT5yZFBhcmFtICsgKChzMSArIDEpID4+IDEpICsgMiksCi0JCSoobXItPnJkUGFyYW0gKyAoKHMxICsgMSkgPj4gMSkgKyAxKSwgCi0JCShjaGFyICopKG1yLT5yZFBhcmFtICsgMSksIHMxKTsKKwlUZXh0T3V0MTYoaGRjLCAqKG1yLT5yZFBhcmFtICsgKChzMSArIDEpID4+IDEpICsgMiksCisgICAgICAgICAgICAgICAgICAqKG1yLT5yZFBhcmFtICsgKChzMSArIDEpID4+IDEpICsgMSksIAorICAgICAgICAgICAgICAgICAgKGNoYXIgKikobXItPnJkUGFyYW0gKyAxKSwgczEpOwogCWJyZWFrOwogCiAgICAgY2FzZSBNRVRBX1BPTFlHT046Ci0JUG9seWdvbihoZGMsIChMUFBPSU5UKShtci0+cmRQYXJhbSArIDEpLCAqKG1yLT5yZFBhcmFtKSk7CisJUG9seWdvbjE2KGhkYywgKExQUE9JTlQxNikobXItPnJkUGFyYW0gKyAxKSwgKihtci0+cmRQYXJhbSkpOwogCWJyZWFrOwogCiAgICAgY2FzZSBNRVRBX1BPTFlQT0xZR09OOgotICAgICAgUG9seVBvbHlnb24oaGRjLCAoTFBQT0lOVCkobXItPnJkUGFyYW0gKyAqKG1yLT5yZFBhcmFtKSArIDEpLAotCQkgIChMUElOVDE2KShtci0+cmRQYXJhbSArIDEpLCAqKG1yLT5yZFBhcmFtKSk7IAorICAgICAgUG9seVBvbHlnb24xNihoZGMsIChMUFBPSU5UMTYpKG1yLT5yZFBhcmFtICsgKihtci0+cmRQYXJhbSkgKyAxKSwKKyAgICAgICAgICAgICAgICAgICAgKExQSU5UMTYpKG1yLT5yZFBhcmFtICsgMSksICoobXItPnJkUGFyYW0pKTsgCiAgICAgICBicmVhazsKIAogICAgIGNhc2UgTUVUQV9QT0xZTElORToKLQlQb2x5bGluZShoZGMsIChMUFBPSU5UKShtci0+cmRQYXJhbSArIDEpLCAqKG1yLT5yZFBhcmFtKSk7CisJUG9seWxpbmUxNihoZGMsIChMUFBPSU5UMTYpKG1yLT5yZFBhcmFtICsgMSksICoobXItPnJkUGFyYW0pKTsKIAlicmVhazsKIAogICAgIGNhc2UgTUVUQV9SRVNUT1JFREM6CkBAIC02MTQsNyArNjEzLDggQEAKICAgICAgICAgeDY9bXItPnJkUGFyYW1bKHMxKzEpLzIrNV07IC8qIHVua25vd24gbWVhbmluZyAqLwogICAgICAgICB4Nz1tci0+cmRQYXJhbVsoczErMSkvMis2XTsgLyogdW5rbm93biBtZWFuaW5nICovCiAgICAgICAgIHg4PW1yLT5yZFBhcmFtWyhzMSsxKS8yKzddOyAvKiB1bmtub3duIG1lYW5pbmcgKi8KLQlFeHRUZXh0T3V0KGhkYywgeCwgeSwgb3B0aW9ucywgKExQUkVDVCkgJm1yLT5yZFBhcmFtWyhzMSsxKS8yKzRdLCAoY2hhciAqKShtci0+cmRQYXJhbSArIDQpLCBzMSwgTlVMTCk7CisJRXh0VGV4dE91dDE2KCBoZGMsIHgsIHksIG9wdGlvbnMsIChMUFJFQ1QxNikgJm1yLT5yZFBhcmFtWyhzMSsxKS8yKzRdLAorICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopKG1yLT5yZFBhcmFtICsgNCksIHMxLCBOVUxMICk7CiAJLyogZnByaW50ZihzdGRlcnIsIkVYVFRFWFRPVVQgKGxlbjogJWQpICVoZCA6ICVoZCAlaGQgJWhkICVoZCBbJXNdLlxuIiwKICAgICAgICAgICAgIChtci0+cmRTaXplLXMxKSxvcHRpb25zLHg1LHg2LHg3LHg4LChjaGFyKikgJihtci0+cmRQYXJhbVs0XSkgKTsqLwogICAgICAgICB9CkBAIC0xMDU4LDcgKzEwNTgsNyBAQAogICogICAgICAgICBNRl9DcmVhdGVQZW5JbmRpcmVjdAogICovCiAKLUJPT0wgTUZfQ3JlYXRlUGVuSW5kaXJlY3QoREMgKmRjLCBIUEVOIGhQZW4sIExPR1BFTiAqbG9ncGVuKQorQk9PTCBNRl9DcmVhdGVQZW5JbmRpcmVjdChEQyAqZGMsIEhQRU4xNiBoUGVuLCBMT0dQRU4gKmxvZ3BlbikKIHsKICAgICBpbnQgaW5kZXg7CiAgICAgSE1FVEFGSUxFIGhhbmRsZTsKQEAgLTExMzEsNyArMTEzMSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgIE1GX1RleHRPdXQKICAqLwotQk9PTCBNRl9UZXh0T3V0KERDICpkYywgc2hvcnQgeCwgc2hvcnQgeSwgTFBTVFIgc3RyLCBzaG9ydCBjb3VudCkKK0JPT0wgTUZfVGV4dE91dChEQyAqZGMsIHNob3J0IHgsIHNob3J0IHksIExQQ1NUUiBzdHIsIHNob3J0IGNvdW50KQogewogICAgIEhNRVRBRklMRSBoYW5kbGU7CiAgICAgRFdPUkQgbGVuOwpAQCAtMTE2MCw3ICsxMTYwLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgTUZfTWV0YVBvbHkgLSBpbXBsZW1lbnRzIFBvbHlnb24gYW5kIFBvbHlsaW5lCiAgKi8KLUJPT0wgTUZfTWV0YVBvbHkoREMgKmRjLCBzaG9ydCBmdW5jLCBMUFBPSU5UIHB0LCBzaG9ydCBjb3VudCkKK0JPT0wgTUZfTWV0YVBvbHkoREMgKmRjLCBzaG9ydCBmdW5jLCBMUFBPSU5UMTYgcHQsIHNob3J0IGNvdW50KQogewogICAgIEhNRVRBRklMRSBoYW5kbGU7CiAgICAgRFdPUkQgbGVuOwpkaWZmIC0tZ2l0IGEvb2JqZWN0cy9vZW1iaXRtYXAuYyBiL29iamVjdHMvb2VtYml0bWFwLmMKaW5kZXggY2EzMzBjZS4uYmRiNmRlOSAxMDA2NDQKLS0tIGEvb2JqZWN0cy9vZW1iaXRtYXAuYworKysgYi9vYmplY3RzL29lbWJpdG1hcC5jCkBAIC0zMzEsNyArMzMxLDcgQEAKICAqIENyZWF0ZSB0aGUgMiBiaXRtYXBzIGZyb20gWFBNIGRhdGEuCiAgKi8KIHN0YXRpYyBCT09MIE9CTV9DcmVhdGVCaXRtYXBzKCBjaGFyICoqZGF0YSwgQk9PTCBjb2xvciwgSEJJVE1BUCAqaEJpdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQklUTUFQICpoQml0bWFwTWFzaywgUE9JTlQgKmhvdHNwb3QgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhCSVRNQVAgKmhCaXRtYXBNYXNrLCBQT0lOVDE2ICpob3RzcG90ICkKIHsKICAgICBQaXhtYXAgcGl4bWFwLCBwaXhtYXNrOwogICAgIFhwbUF0dHJpYnV0ZXMgKmF0dHJzOwpAQCAtNDA3LDcgKzQwNyw3IEBACiAgICAgQ1VSU09SSUNPTklORk8gKnBJbmZvOwogICAgIEJJVE1BUE9CSiAqYm1wWG9yLCAqYm1wQW5kOwogICAgIEhCSVRNQVAgaFhvckJpdHMsIGhBbmRCaXRzOwotICAgIFBPSU5UIGhvdHNwb3Q7CisgICAgUE9JTlQxNiBob3RzcG90OwogICAgIGludCBzaXplWG9yLCBzaXplQW5kOwogCiAgICAgaWYgKGZDdXJzb3IpCmRpZmYgLS1naXQgYS9vYmplY3RzL3BhbGV0dGUuYyBiL29iamVjdHMvcGFsZXR0ZS5jCmluZGV4IDI1MDAxZTEuLjFlNzZkY2UgMTAwNjQ0Ci0tLSBhL29iamVjdHMvcGFsZXR0ZS5jCisrKyBiL29iamVjdHMvcGFsZXR0ZS5jCkBAIC0yMCw3ICsyMCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBQQUxFVFRFX0dldE5lYXJlc3RJbmRleEFuZENvbG9yCiAgKi8KLXN0YXRpYyBXT1JEIFBBTEVUVEVfR2V0TmVhcmVzdEluZGV4QW5kQ29sb3IoSFBBTEVUVEUgaHBhbGV0dGUsIENPTE9SUkVGICpjb2xvcikKK3N0YXRpYyBXT1JEIFBBTEVUVEVfR2V0TmVhcmVzdEluZGV4QW5kQ29sb3IoSFBBTEVUVEUxNiBocGFsZXR0ZSwgQ09MT1JSRUYgKmNvbG9yKQogewogICAgIGludCBpLCBtaW5EaXN0LCBkaXN0OwogICAgIFdPUkQgaW5kZXggPSAwOwpAQCAtNjksMTAgKzY5LDEwIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBDcmVhdGVQYWxldHRlICAgIChHREkuMzYwKQogICovCi1IUEFMRVRURSBDcmVhdGVQYWxldHRlKCBjb25zdCBMT0dQQUxFVFRFKiBwYWxldHRlICkKK0hQQUxFVFRFMTYgQ3JlYXRlUGFsZXR0ZSggY29uc3QgTE9HUEFMRVRURSogcGFsZXR0ZSApCiB7CiAgICAgUEFMRVRURU9CSiAqIHBhbGV0dGVQdHI7Ci0gICAgSFBBTEVUVEUgaHBhbGV0dGU7CisgICAgSFBBTEVUVEUxNiBocGFsZXR0ZTsKICAgICBpbnQgc2l6ZTsKIAogICAgIHNpemUgPSBzaXplb2YoTE9HUEFMRVRURSkgKyAocGFsZXR0ZS0+cGFsTnVtRW50cmllcyAtIDEpICogc2l6ZW9mKFBBTEVUVEVFTlRSWSk7CkBAIC04Nyw3ICs4Nyw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBHZXRQYWxldHRlRW50cmllcyAgICAoR0RJLjM2MykKICAqLwotV09SRCBHZXRQYWxldHRlRW50cmllcyggSFBBTEVUVEUgaHBhbGV0dGUsIFdPUkQgc3RhcnQsIFdPUkQgY291bnQsCitXT1JEIEdldFBhbGV0dGVFbnRyaWVzKCBIUEFMRVRURTE2IGhwYWxldHRlLCBXT1JEIHN0YXJ0LCBXT1JEIGNvdW50LAogCQkgICAgICAgIExQUEFMRVRURUVOVFJZIGVudHJpZXMgKQogewogICAgIFBBTEVUVEVPQkogKiBwYWxQdHI7CkBAIC0xMDcsNyArMTA3LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFNldFBhbGV0dGVFbnRyaWVzICAgIChHREkuMzY0KQogICovCi1XT1JEIFNldFBhbGV0dGVFbnRyaWVzKCBIUEFMRVRURSBocGFsZXR0ZSwgV09SRCBzdGFydCwgV09SRCBjb3VudCwKK1dPUkQgU2V0UGFsZXR0ZUVudHJpZXMoIEhQQUxFVFRFMTYgaHBhbGV0dGUsIFdPUkQgc3RhcnQsIFdPUkQgY291bnQsCiAJCSAgICAgICAgTFBQQUxFVFRFRU5UUlkgZW50cmllcyApCiB7CiAgICAgUEFMRVRURU9CSiAqIHBhbFB0cjsKQEAgLTEyNiw3ICsxMjYsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgUmVzaXplUGFsZXR0ZSAgICAgICAgICAoR0RJLjM2OCkKICAqLwotQk9PTCBSZXNpemVQYWxldHRlKEhQQUxFVFRFIGhQYWwsIFVJTlQgY0VudHJpZXMpCitCT09MIFJlc2l6ZVBhbGV0dGUoSFBBTEVUVEUxNiBoUGFsLCBVSU5UIGNFbnRyaWVzKQogewogICAgIGZwcmludGYoc3RkbmltcCwiUmVzaXplUGFsZXR0ZTogZW1wdHkgc3R1YiEgXG4iKTsKICAgICByZXR1cm4gRkFMU0U7CkBAIC0xMzUsNyArMTM1LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEFuaW1hdGVQYWxldHRlICAgICAgICAgIChHREkuMzY3KQogICovCi1CT09MIEFuaW1hdGVQYWxldHRlKEhQQUxFVFRFIGhQYWwsIFVJTlQgU3RhcnRJbmRleCwgVUlOVCBOdW1FbnRyaWVzLAorQk9PTCBBbmltYXRlUGFsZXR0ZShIUEFMRVRURTE2IGhQYWwsIFVJTlQgU3RhcnRJbmRleCwgVUlOVCBOdW1FbnRyaWVzLAogCQkgICAgTFBQQUxFVFRFRU5UUlkgUGFsZXR0ZUNvbG9ycykKIHsKICAgICBmcHJpbnRmKHN0ZG5pbXAsIkFuaW1hdGVQYWxldHRlOiBlbXB0eSBzdHViISBcbiIpOwpAQCAtMTk2LDcgKzE5Niw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBHZXROZWFyZXN0UGFsZXR0ZUluZGV4ICAgIChHREkuMzcwKQogICovCi1XT1JEIEdldE5lYXJlc3RQYWxldHRlSW5kZXgoIEhQQUxFVFRFIGhwYWxldHRlLCBDT0xPUlJFRiBjb2xvciApCitXT1JEIEdldE5lYXJlc3RQYWxldHRlSW5kZXgoIEhQQUxFVFRFMTYgaHBhbGV0dGUsIENPTE9SUkVGIGNvbG9yICkKIHsKICAgICBXT1JEIGluZGV4ID0gUEFMRVRURV9HZXROZWFyZXN0SW5kZXhBbmRDb2xvciggaHBhbGV0dGUsICZjb2xvciApOwogICAgIGRwcmludGZfcGFsZXR0ZShzdGRkZWIsIkdldE5lYXJlc3RQYWxldHRlSW5kZXgoJTA0eCwlMDZseCk6IHJldHVybmluZyAlZFxuIiwgCkBAIC0yMzUsOSArMjM1LDkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEdESVNlbGVjdFBhbGV0dGUgICAgKEdESS4zNjEpCiAgKi8KLUhQQUxFVFRFIEdESVNlbGVjdFBhbGV0dGUoIEhEQyBoZGMsIEhQQUxFVFRFIGhwYWwgKQorSFBBTEVUVEUxNiBHRElTZWxlY3RQYWxldHRlKCBIREMgaGRjLCBIUEFMRVRURTE2IGhwYWwgKQogewotICAgIEhQQUxFVFRFIHByZXY7CisgICAgSFBBTEVUVEUxNiBwcmV2OwogICAgIERDICpkYzsKIAogICAgIGRwcmludGZfcGFsZXR0ZShzdGRkZWIsICJHRElTZWxlY3RQYWxldHRlOiAlMDR4ICUwNHhcbiIsIGhkYywgaHBhbCApOwpAQCAtMjU1LDE1ICsyNTUsNDkgQEAKICAqLwogVUlOVCBHRElSZWFsaXplUGFsZXR0ZSggSERDIGhkYyApCiB7Ci0gICAgZHByaW50Zl9wYWxldHRlKHN0ZG5pbXAsICJHRElSZWFsaXplUGFsZXR0ZTogJTA0eFxuIiwgaGRjICk7Ci0gICAgcmV0dXJuIDA7CisgICAgVUlOVCAgICAgICAgcmVhbGl6ZWQgPSAwOworICAgIENPTE9SUkVGICAgIGNvbG9yOworICAgIERDKiAgICAgICAgIGRjID0gKERDICopIEdESV9HZXRPYmpQdHIoIGhkYywgRENfTUFHSUMgKSA7CisgICAgUEFMRVRURU9CSiogcGFsUHRyOworCisgICAgZHByaW50Zl9wYWxldHRlKHN0ZG5pbXAsICJHRElSZWFsaXplUGFsZXR0ZTogJTA0eC4uLiIsIGhkYyApOworCisgICAgaWYoIGRjICkKKyAgICAgIHsKKyAgICAgICAgcGFsUHRyID0gKFBBTEVUVEVPQkogKikgR0RJX0dldE9ialB0ciggZGMtPncuaFBhbGV0dGUsIFBBTEVUVEVfTUFHSUMgKTsKKworICAgICAgICBpZiggcGFsUHRyICkKKyAgICAgICAgICB7CisgICAgICAgICAgICBXT1JEICAgICAgICBpbmRleCwgaTsKKyAgICAgICAgICAgIEhBTkRMRSAgICAgIGhNYXA7CisgICAgICAgICAgICBXT1JEKiAgICAgICBwTWFwOworCisgICAgICAgICAgICBoTWFwID0gR0RJX0hFQVBfQUxMT0Moc2l6ZW9mKFdPUkQpKnBhbFB0ci0+bG9ncGFsZXR0ZS5wYWxOdW1FbnRyaWVzKTsKKyAgICAgICAgICAgIHBNYXAgPSAoV09SRCopR0RJX0hFQVBfTElOX0FERFIoIGhNYXAgKTsKKworICAgICAgICAgICAgaWYoIHBNYXAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGFsUHRyLT5sb2dwYWxldHRlLnBhbE51bUVudHJpZXMgOyBpKyspCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb2xvciA9ICooQ09MT1JSRUYqKShwYWxQdHItPmxvZ3BhbGV0dGUucGFsUGFsRW50cnkgKyBpKTsKKyAgICAgICAgICAgICAgICBpbmRleCA9IFBBTEVUVEVfR2V0TmVhcmVzdEluZGV4QW5kQ29sb3IoIFNUT0NLX0RFRkFVTFRfUEFMRVRURSwgJmNvbG9yKTsKKyAgICAgICAgICAgICAgICBpZiggaW5kZXggIT0gaSApIHJlYWxpemVkKys7CisgICAgICAgICAgICAgICAgcE1hcFtpXSA9IGluZGV4OworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIENPTE9SX1NldE1hcHBpbmcoZGMsIGhNYXAsIDAsIGkpOworICAgICAgICAgICAgICBHRElfSEVBUF9GUkVFKGhNYXApOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgIH0KKyAgICBkcHJpbnRmX3BhbGV0dGUoc3RkbmltcCwgIiByZWFsaXplZCAlaSBjb2xvcnNcbiIsIHJlYWxpemVkICk7CisgICAgcmV0dXJuIHJlYWxpemVkOwogfQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFNlbGVjdFBhbGV0dGUgICAgKFVTRVIuMjgyKQogICovCi1IUEFMRVRURSBTZWxlY3RQYWxldHRlKEhEQyBoREMsIEhQQUxFVFRFIGhQYWwsIEJPT0wgYkZvcmNlQmFja2dyb3VuZCkKK0hQQUxFVFRFMTYgU2VsZWN0UGFsZXR0ZShIREMgaERDLCBIUEFMRVRURTE2IGhQYWwsIEJPT0wgYkZvcmNlQmFja2dyb3VuZCkKIHsKICAgICByZXR1cm4gR0RJU2VsZWN0UGFsZXR0ZSggaERDLCBoUGFsICk7CiB9CmRpZmYgLS1naXQgYS9vYmplY3RzL3Blbi5jIGIvb2JqZWN0cy9wZW4uYwppbmRleCBiYzVhOTg2Li5mMjhjZTA0IDEwMDY0NAotLS0gYS9vYmplY3RzL3Blbi5jCisrKyBiL29iamVjdHMvcGVuLmMKQEAgLTEzLDcgKzEzLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIENyZWF0ZVBlbiAgICAoR0RJLjYxKQogICovCi1IUEVOIENyZWF0ZVBlbiggSU5UIHN0eWxlLCBJTlQgd2lkdGgsIENPTE9SUkVGIGNvbG9yICkKK0hQRU4xNiBDcmVhdGVQZW4oIElOVCBzdHlsZSwgSU5UIHdpZHRoLCBDT0xPUlJFRiBjb2xvciApCiB7CiAgICAgTE9HUEVOIGxvZ3BlbiA9IHsgc3R5bGUsIHsgd2lkdGgsIDAgfSwgY29sb3IgfTsKICAgICBkcHJpbnRmX2dkaShzdGRkZWIsICJDcmVhdGVQZW46ICVkICVkICUwNmx4XG4iLCBzdHlsZSwgd2lkdGgsIGNvbG9yICk7CkBAIC0yNCwxMCArMjQsMTAgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIENyZWF0ZVBlbkluZGlyZWN0ICAgIChHREkuNjIpCiAgKi8KLUhQRU4gQ3JlYXRlUGVuSW5kaXJlY3QoIGNvbnN0IExPR1BFTiAqIHBlbiApCitIUEVOMTYgQ3JlYXRlUGVuSW5kaXJlY3QoIGNvbnN0IExPR1BFTiAqIHBlbiApCiB7CiAgICAgUEVOT0JKICogcGVuUHRyOwotICAgIEhQRU4gaHBlbjsKKyAgICBIUEVOMTYgaHBlbjsKIAogICAgIGlmIChwZW4tPmxvcG5TdHlsZSA+IFBTX0lOU0lERUZSQU1FKSByZXR1cm4gMDsKICAgICBocGVuID0gR0RJX0FsbG9jT2JqZWN0KCBzaXplb2YoUEVOT0JKKSwgUEVOX01BR0lDICk7CkBAIC01MiwxMyArNTIsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFBFTl9TZWxlY3RPYmplY3QKICAqLwotSFBFTiBQRU5fU2VsZWN0T2JqZWN0KCBEQyAqIGRjLCBIUEVOIGhwZW4sIFBFTk9CSiAqIHBlbiApCitIUEVOMTYgUEVOX1NlbGVjdE9iamVjdCggREMgKiBkYywgSFBFTjE2IGhwZW4sIFBFTk9CSiAqIHBlbiApCiB7CiAgICAgc3RhdGljIGNoYXIgZGFzaF9kYXNoW10gICAgICAgPSB7IDUsIDMgfTsgICAgICAvKiAtLS0tLSAgIC0tLS0tICAgLS0tLS0gICovCiAgICAgc3RhdGljIGNoYXIgZGFzaF9kb3RbXSAgICAgICAgPSB7IDIsIDIgfTsgICAgICAvKiAtLSAgLS0gIC0tICAtLSAgLS0gIC0tICovCiAgICAgc3RhdGljIGNoYXIgZGFzaF9kYXNoZG90W10gICAgPSB7IDQsMywyLDMgfTsgICAvKiAtLS0tICAgLS0gICAtLS0tICAgLS0gICovCiAgICAgc3RhdGljIGNoYXIgZGFzaF9kYXNoZG90ZG90W10gPSB7IDQsMiwyLDIsMiwyIH07ICAvKiAtLS0tICAtLSAgLS0gIC0tLS0gICovCi0gICAgSFBFTiBwcmV2SGFuZGxlID0gZGMtPncuaFBlbjsKKyAgICBIUEVOMTYgcHJldkhhbmRsZSA9IGRjLT53LmhQZW47CiAKICAgICBpZiAoZGMtPmhlYWRlci53TWFnaWMgPT0gTUVUQUZJTEVfRENfTUFHSUMpCiAgICAgICBpZiAoTUZfQ3JlYXRlUGVuSW5kaXJlY3QoZGMsIGhwZW4sICYocGVuLT5sb2dwZW4pKSkKZGlmZiAtLWdpdCBhL29iamVjdHMvcmVnaW9uLmMgYi9vYmplY3RzL3JlZ2lvbi5jCmluZGV4IDkzNWI5OTYuLjI5YmNiYzEgMTAwNjQ0Ci0tLSBhL29iamVjdHMvcmVnaW9uLmMKKysrIGIvb2JqZWN0cy9yZWdpb24uYwpAQCAtNywxMCArNyw4IEBACiAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdGRpby5oPgotCiAjaW5jbHVkZSAicmVnaW9uLmgiCiAjaW5jbHVkZSAic3RkZGVidWcuaCIKLS8qICNkZWZpbmUgREVCVUdfUkVHSU9OICovCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogCkBAIC0yNiw5ICsyNCw5IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgT2Zmc2V0UmduICAgIChHREkuMTAxKQorICogICAgICAgICAgIE9mZnNldFJnbiAgICAoR0RJLjEwMSkgKEdESTMyLjI1NikKICAqLwotaW50IE9mZnNldFJnbiggSFJHTiBocmduLCBzaG9ydCB4LCBzaG9ydCB5ICkKK0lOVDE2IE9mZnNldFJnbiggSFJHTjMyIGhyZ24sIElOVDMyIHgsIElOVDMyIHkgKQogewogICAgIFJHTk9CSiAqIG9iaiA9IChSR05PQkogKikgR0RJX0dldE9ialB0ciggaHJnbiwgUkVHSU9OX01BR0lDICk7CiAgICAgaWYgKCFvYmopIHJldHVybiBFUlJPUjsKQEAgLTQwLDMzICszOCw0NSBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEdldFJnbkJveCAgICAoR0RJLjEzNCkKKyAqICAgICAgICAgICBHZXRSZ25Cb3gxNiAgICAoR0RJLjEzNCkKICAqLwotaW50IEdldFJnbkJveCggSFJHTiBocmduLCBMUFJFQ1QgcmVjdCApCitJTlQxNiBHZXRSZ25Cb3gxNiggSFJHTjE2IGhyZ24sIExQUkVDVDE2IHJlY3QgKQogewogICAgIFJHTk9CSiAqIG9iaiA9IChSR05PQkogKikgR0RJX0dldE9ialB0ciggaHJnbiwgUkVHSU9OX01BR0lDICk7CiAgICAgaWYgKCFvYmopIHJldHVybiBFUlJPUjsKICAgICBkcHJpbnRmX3JlZ2lvbihzdGRkZWIsICJHZXRSZ25Cb3g6ICUwNHhcbiIsIGhyZ24gKTsKICAgICBpZiAoIW9iai0+eHJnbikKICAgICB7Ci0gICAgICAgIFNldFJlY3RFbXB0eSggcmVjdCApOworICAgICAgICBTZXRSZWN0RW1wdHkxNiggcmVjdCApOwogICAgICAgICByZXR1cm4gTlVMTFJFR0lPTjsKICAgICB9CiAgICAgZWxzZQogICAgIHsKICAgICAgICAgWFJlY3RhbmdsZSB4cmVjdDsKICAgICAgICAgWENsaXBCb3goIG9iai0+eHJnbiwgJnhyZWN0ICk7Ci0gICAgICAgIFNldFJlY3QoIHJlY3QsIHhyZWN0LngsIHhyZWN0LnksCi0gICAgICAgICAgICAgICAgIHhyZWN0LnggKyB4cmVjdC53aWR0aCwgeHJlY3QueSArIHhyZWN0LmhlaWdodCk7CisgICAgICAgIFNldFJlY3QxNiggcmVjdCwgeHJlY3QueCwgeHJlY3QueSwKKyAgICAgICAgICAgICAgICAgICB4cmVjdC54ICsgeHJlY3Qud2lkdGgsIHhyZWN0LnkgKyB4cmVjdC5oZWlnaHQpOwogICAgICAgICByZXR1cm4gQ09NUExFWFJFR0lPTjsKICAgICB9CiB9CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgQ3JlYXRlUmVjdFJnbiAgICAoR0RJLjY0KQorICogICAgICAgICAgIEdldFJnbkJveDMyICAgIChHREkzMi4yMTkpCiAgKi8KLUhSR04gQ3JlYXRlUmVjdFJnbiggSU5UIGxlZnQsIElOVCB0b3AsIElOVCByaWdodCwgSU5UIGJvdHRvbSApCitJTlQzMiBHZXRSZ25Cb3gzMiggSFJHTjMyIGhyZ24sIExQUkVDVDMyIHJlY3QgKQoreworICAgIFJFQ1QxNiByOworICAgIElOVDE2IHJldCA9IEdldFJnbkJveDE2KCBocmduLCAmciApOworICAgIENPTlZfUkVDVDE2VE8zMiggJnIsIHJlY3QgKTsKKyAgICByZXR1cm4gcmV0OworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENyZWF0ZVJlY3RSZ24gICAgKEdESS42NCkgKEdESTMyLjU5KQorICovCitIUkdOIENyZWF0ZVJlY3RSZ24oIElOVDMyIGxlZnQsIElOVDMyIHRvcCwgSU5UMzIgcmlnaHQsIElOVDMyIGJvdHRvbSApCiB7CiAgICAgSFJHTiBocmduOwogICAgIFJHTk9CSiAqb2JqOwpAQCAtOTEsMTggKzEwMSwyNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIENyZWF0ZVJlY3RSZ25JbmRpcmVjdCAgICAoR0RJLjY1KQorICogICAgICAgICAgIENyZWF0ZVJlY3RSZ25JbmRpcmVjdDE2ICAgIChHREkuNjUpCiAgKi8KLUhSR04gQ3JlYXRlUmVjdFJnbkluZGlyZWN0KCBjb25zdCBSRUNUKiByZWN0ICkKK0hSR04xNiBDcmVhdGVSZWN0UmduSW5kaXJlY3QxNiggY29uc3QgUkVDVDE2KiByZWN0ICkKIHsKICAgICByZXR1cm4gQ3JlYXRlUmVjdFJnbiggcmVjdC0+bGVmdCwgcmVjdC0+dG9wLCByZWN0LT5yaWdodCwgcmVjdC0+Ym90dG9tICk7CiB9CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgU2V0UmVjdFJnbiAgICAoR0RJLjE3MikKKyAqICAgICAgICAgICBDcmVhdGVSZWN0UmduSW5kaXJlY3QzMiAgICAoR0RJMzIuNjApCiAgKi8KLXZvaWQgU2V0UmVjdFJnbiggSFJHTiBocmduLCBzaG9ydCBsZWZ0LCBzaG9ydCB0b3AsIHNob3J0IHJpZ2h0LCBzaG9ydCBib3R0b20gKQorSFJHTjMyIENyZWF0ZVJlY3RSZ25JbmRpcmVjdDMyKCBjb25zdCBSRUNUMzIqIHJlY3QgKQoreworICAgIHJldHVybiBDcmVhdGVSZWN0UmduKCByZWN0LT5sZWZ0LCByZWN0LT50b3AsIHJlY3QtPnJpZ2h0LCByZWN0LT5ib3R0b20gKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBTZXRSZWN0UmduICAgIChHREkuMTcyKSAoR0RJMzIuMzMyKQorICovCit2b2lkIFNldFJlY3RSZ24oIEhSR04zMiBocmduLCBJTlQzMiBsZWZ0LCBJTlQzMiB0b3AsIElOVDMyIHJpZ2h0LCBJTlQzMiBib3R0b20pCiB7CiAgICAgUkdOT0JKICogb2JqOwogCkBAIC0xMjIsMTAgKzE0MSwxMCBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIENyZWF0ZVJvdW5kUmVjdFJnbiAgICAoR0RJLjQ0NCkKKyAqICAgICAgICAgICBDcmVhdGVSb3VuZFJlY3RSZ24gICAgKEdESS40NDQpIChHREkzMi42MSkKICAqLwotSFJHTiBDcmVhdGVSb3VuZFJlY3RSZ24oIElOVCBsZWZ0LCBJTlQgdG9wLCBJTlQgcmlnaHQsIElOVCBib3R0b20sCi0JCQkgSU5UIGVsbGlwc2Vfd2lkdGgsIElOVCBlbGxpcHNlX2hlaWdodCApCitIUkdOIENyZWF0ZVJvdW5kUmVjdFJnbiggSU5UMzIgbGVmdCwgSU5UMzIgdG9wLCBJTlQzMiByaWdodCwgSU5UMzIgYm90dG9tLAorCQkJIElOVDMyIGVsbGlwc2Vfd2lkdGgsIElOVDMyIGVsbGlwc2VfaGVpZ2h0ICkKIHsKICAgICBSR05PQkogKiBvYmo7CiAgICAgSFJHTiBocmduOwpAQCAtMjE4LDkgKzIzNyw5IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgQ3JlYXRlRWxsaXB0aWNSZ24gICAgKEdESS41NCkKKyAqICAgICAgICAgICBDcmVhdGVFbGxpcHRpY1JnbiAgICAoR0RJLjU0KSAoR0RJMzIuMzkpCiAgKi8KLUhSR04gQ3JlYXRlRWxsaXB0aWNSZ24oIElOVCBsZWZ0LCBJTlQgdG9wLCBJTlQgcmlnaHQsIElOVCBib3R0b20gKQorSFJHTiBDcmVhdGVFbGxpcHRpY1JnbiggSU5UMzIgbGVmdCwgSU5UMzIgdG9wLCBJTlQzMiByaWdodCwgSU5UMzIgYm90dG9tICkKIHsKICAgICByZXR1cm4gQ3JlYXRlUm91bmRSZWN0UmduKCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQtbGVmdCwgYm90dG9tLXRvcCApOwpAQCAtMjI4LDkgKzI0Nyw5IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgQ3JlYXRlRWxsaXB0aWNSZ25JbmRpcmVjdCAgICAoR0RJLjU1KQorICogICAgICAgICAgIENyZWF0ZUVsbGlwdGljUmduSW5kaXJlY3QxNiAgICAoR0RJLjU1KQogICovCi1IUkdOIENyZWF0ZUVsbGlwdGljUmduSW5kaXJlY3QoIExQUkVDVCByZWN0ICkKK0hSR04xNiBDcmVhdGVFbGxpcHRpY1JnbkluZGlyZWN0MTYoIGNvbnN0IFJFQ1QxNiAqcmVjdCApCiB7CiAgICAgcmV0dXJuIENyZWF0ZVJvdW5kUmVjdFJnbihyZWN0LT5sZWZ0LCByZWN0LT50b3AsIHJlY3QtPnJpZ2h0LCByZWN0LT5ib3R0b20sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LT5yaWdodC1yZWN0LT5sZWZ0LCByZWN0LT5ib3R0b20tcmVjdC0+dG9wICk7CkBAIC0yMzgsMTkgKzI1NywyOSBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIENyZWF0ZVBvbHlnb25SZ24gICAgKEdESS42MykKKyAqICAgICAgICAgICBDcmVhdGVFbGxpcHRpY1JnbkluZGlyZWN0MzIgICAgKEdESTMyLjQwKQogICovCi1IUkdOIENyZWF0ZVBvbHlnb25SZ24oIGNvbnN0IFBPSU5UICogcG9pbnRzLCBJTlQgY291bnQsIElOVCBtb2RlICkKK0hSR04zMiBDcmVhdGVFbGxpcHRpY1JnbkluZGlyZWN0MzIoIGNvbnN0IFJFQ1QzMiAqcmVjdCApCiB7Ci0gICAgcmV0dXJuIENyZWF0ZVBvbHlQb2x5Z29uUmduKCBwb2ludHMsICZjb3VudCwgMSwgbW9kZSApOworICAgIHJldHVybiBDcmVhdGVSb3VuZFJlY3RSZ24ocmVjdC0+bGVmdCwgcmVjdC0+dG9wLCByZWN0LT5yaWdodCwgcmVjdC0+Ym90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC0+cmlnaHQtcmVjdC0+bGVmdCwgcmVjdC0+Ym90dG9tLXJlY3QtPnRvcCApOwogfQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIENyZWF0ZVBvbHlQb2x5Z29uUmduICAgIChHREkuNDUxKQorICogICAgICAgICAgIENyZWF0ZVBvbHlnb25SZ24xNiAgICAoR0RJLjYzKQogICovCi1IUkdOIENyZWF0ZVBvbHlQb2x5Z29uUmduKCBjb25zdCBQT0lOVCAqIHBvaW50cywgY29uc3QgSU5UMTYgKiBjb3VudCwKLQkJCSAgIElOVCBuYnBvbHlnb25zLCBJTlQgbW9kZSApCitIUkdOMTYgQ3JlYXRlUG9seWdvblJnbjE2KCBjb25zdCBQT0lOVDE2ICogcG9pbnRzLCBJTlQxNiBjb3VudCwgSU5UMTYgbW9kZSApCit7CisgICAgcmV0dXJuIENyZWF0ZVBvbHlQb2x5Z29uUmduMTYoIHBvaW50cywgJmNvdW50LCAxLCBtb2RlICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ3JlYXRlUG9seVBvbHlnb25SZ24xNiAgICAoR0RJLjQ1MSkKKyAqLworSFJHTjE2IENyZWF0ZVBvbHlQb2x5Z29uUmduMTYoIGNvbnN0IFBPSU5UMTYgKiBwb2ludHMsIGNvbnN0IElOVDE2ICogY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMTYgbmJwb2x5Z29ucywgSU5UMTYgbW9kZSApCiB7CiAgICAgUkdOT0JKICogb2JqOwogICAgIEhSR04gaHJnbjsKQEAgLTMxNCw5ICszNDMsOSBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFB0SW5SZWdpb24gICAgKEdESS4xNjEpCisgKiAgICAgICAgICAgUHRJblJlZ2lvbiAgICAoR0RJLjE2MSkgKEdESTMyLjI3OCkKICAqLwotQk9PTCBQdEluUmVnaW9uKCBIUkdOIGhyZ24sIHNob3J0IHgsIHNob3J0IHkgKQorQk9PTCBQdEluUmVnaW9uKCBIUkdOMzIgaHJnbiwgSU5UMzIgeCwgSU5UMzIgeSApCiB7CiAgICAgUkdOT0JKICogb2JqOwogICAgIApAQCAtMzI3LDkgKzM1Niw5IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgUmVjdEluUmVnaW9uICAgIChHREkuMTgxKQorICogICAgICAgICAgIFJlY3RJblJlZ2lvbjE2ICAgIChHREkuMTgxKQogICovCi1CT09MIFJlY3RJblJlZ2lvbiggSFJHTiBocmduLCBMUFJFQ1QgcmVjdCApCitCT09MMTYgUmVjdEluUmVnaW9uMTYoIEhSR04xNiBocmduLCBjb25zdCBSRUNUMTYgKnJlY3QgKQogewogICAgIFJHTk9CSiAqIG9iajsKICAgICAKQEAgLTM0Miw5ICszNzEsMjQgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBFcXVhbFJnbiAgICAoR0RJLjcyKQorICogICAgICAgICAgIFJlY3RJblJlZ2lvbjMyICAgIChHREkzMi4yODEpCiAgKi8KLUJPT0wgRXF1YWxSZ24oIEhSR04gcmduMSwgSFJHTiByZ24yICkKK0JPT0wzMiBSZWN0SW5SZWdpb24zMiggSFJHTjMyIGhyZ24sIGNvbnN0IFJFQ1QzMiAqcmVjdCApCit7CisgICAgUkdOT0JKICogb2JqOworICAgIAorICAgIGlmICghKG9iaiA9IChSR05PQkogKikgR0RJX0dldE9ialB0ciggaHJnbiwgUkVHSU9OX01BR0lDICkpKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKCFvYmotPnhyZ24pIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gKFhSZWN0SW5SZWdpb24oIG9iai0+eHJnbiwgcmVjdC0+bGVmdCwgcmVjdC0+dG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC0+cmlnaHQtcmVjdC0+bGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QtPmJvdHRvbS1yZWN0LT50b3AgKSAhPSBSZWN0YW5nbGVPdXQpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEVxdWFsUmduICAgIChHREkuNzIpIChHREkzMi45MCkKKyAqLworQk9PTCBFcXVhbFJnbiggSFJHTjMyIHJnbjEsIEhSR04zMiByZ24yICkKIHsKICAgICBSR05PQkogKm9iajEsICpvYmoyOwogICAgIGlmICghKG9iajEgPSAoUkdOT0JKICopIEdESV9HZXRPYmpQdHIoIHJnbjEsIFJFR0lPTl9NQUdJQyApKSkgcmV0dXJuIEZBTFNFOwpAQCAtMzg0LDcgKzQyOCw3IEBACiAgKgogICogQ3JlYXRlIGEgcmVnaW9uIHRoYXQgaXMgYSBmcmFtZSBhcm91bmQgYW5vdGhlciByZWdpb24KICAqLwotQk9PTCBSRUdJT05fRnJhbWVSZ24oIEhSR04gaERlc3QsIEhSR04gaFNyYywgaW50IHgsIGludCB5ICkKK0JPT0wgUkVHSU9OX0ZyYW1lUmduKCBIUkdOIGhEZXN0LCBIUkdOIGhTcmMsIElOVDMyIHgsIElOVDMyIHkgKQogewogICAgIFJHTk9CSiAqZGVzdE9iaiwqc3JjT2JqOwogICAgIFJlZ2lvbiByZXN1bHQ7CkBAIC00MDIsMTEgKzQ0NiwxMSBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBDb21iaW5lUmduICAgIChHREkuNDUxKQorICogICAgICAgICAgIENvbWJpbmVSZ24gICAgKEdESS40NTEpIChHREkzMi4xOSkKICAqCiAgKiBUaGUgYmVoYXZpb3IgaXMgY29ycmVjdCBldmVuIGlmIHNyYyBhbmQgZGVzdCByZWdpb25zIGFyZSB0aGUgc2FtZS4KICAqLwotSU5UIENvbWJpbmVSZ24oIEhSR04gaERlc3QsIEhSR04gaFNyYzEsIEhSR04gaFNyYzIsIElOVCBtb2RlICkKK0lOVDE2IENvbWJpbmVSZ24oIEhSR04zMiBoRGVzdCwgSFJHTjMyIGhTcmMxLCBIUkdOMzIgaFNyYzIsIElOVDMyIG1vZGUgKQogewogICAgIFJHTk9CSiAqZGVzdE9iaiwgKnNyYzFPYmosICpzcmMyT2JqOwogICAgIFJlZ2lvbiBkZXN0cmduOwpkaWZmIC0tZ2l0IGEvb2JqZWN0cy90ZXh0LmMgYi9vYmplY3RzL3RleHQuYwppbmRleCAzZTYyYzg0Li5jZDM2NzZlIDEwMDY0NAotLS0gYS9vYmplY3RzL3RleHQuYworKysgYi9vYmplY3RzL3RleHQuYwpAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgImdkaS5oIgogI2luY2x1ZGUgImNhbGxiYWNrLmgiCiAjaW5jbHVkZSAibWV0YWZpbGUuaCIKKyNpbmNsdWRlICJzdHJpbmczMi5oIgogI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAvKiAjZGVmaW5lIERFQlVHX1RFWFQgKi8KICNpbmNsdWRlICJkZWJ1Zy5oIgpAQCAtNTEsNyArNTIsNyBAQAogICAgIGludCBpID0gMCwgaiA9IDAsIGs7CiAgICAgaW50IHBsZW4gPSAwOwogICAgIGludCBudW1zcGFjZXM7Ci0gICAgU0laRSBzaXplOworICAgIFNJWkUxNiBzaXplOwogICAgIGludCBsYXN0dGFiID0gMDsKICAgICBpbnQgd2JfaSA9IDAsIHdiX2ogPSAwLCB3Yl9jb3VudCA9IDA7CiAKQEAgLTc0LDcgKzc1LDcgQEAKIAkgICAgaWYgKCEoZm9ybWF0ICYgRFRfTk9DTElQKSB8fCAhKGZvcm1hdCAmIERUX05PUFJFRklYKSB8fAogCQkoZm9ybWF0ICYgRFRfV09SREJSRUFLKSkKIAkgICAgewotCQlpZiAoIUdldFRleHRFeHRlbnRQb2ludChoZGMsICZkZXN0W2otMV0sIDEsICZzaXplKSkKKwkJaWYgKCFHZXRUZXh0RXh0ZW50UG9pbnQxNihoZGMsICZkZXN0W2otMV0sIDEsICZzaXplKSkKIAkJICAgIHJldHVybiBOVUxMOwogCQlwbGVuICs9IHNpemUuY3g7CiAJICAgIH0KQEAgLTkxLDcgKzkyLDcgQEAKIAkJZGVzdFtqKytdID0gc3RyW2krK107CiAJCWlmICghKGZvcm1hdCAmIERUX05PQ0xJUCkgfHwgKGZvcm1hdCAmIERUX1dPUkRCUkVBSykpCiAJCXsKLQkJICAgIGlmICghR2V0VGV4dEV4dGVudFBvaW50KGhkYywgJmRlc3Rbai0xXSwgMSwgJnNpemUpKQorCQkgICAgaWYgKCFHZXRUZXh0RXh0ZW50UG9pbnQxNihoZGMsICZkZXN0W2otMV0sIDEsICZzaXplKSkKIAkJCXJldHVybiBOVUxMOwogCQkgICAgcGxlbiArPSBzaXplLmN4OwogCQl9CkBAIC0xMDUsNyArMTA2LDcgQEAKIAkJd2JfaiA9IGo7CiAJCXdiX2NvdW50ID0gKmNvdW50OwogCi0JCWlmICghR2V0VGV4dEV4dGVudFBvaW50KGhkYywgJmRlc3RbbGFzdHRhYl0sIGogLSBsYXN0dGFiLAorCQlpZiAoIUdldFRleHRFeHRlbnRQb2ludDE2KGhkYywgJmRlc3RbbGFzdHRhYl0sIGogLSBsYXN0dGFiLAogCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUpKQogCQkgICAgcmV0dXJuIE5VTEw7CiAKQEAgLTEyMSw3ICsxMjIsNyBAQAogCQlpZiAoIShmb3JtYXQgJiBEVF9OT0NMSVApIHx8ICEoZm9ybWF0ICYgRFRfTk9QUkVGSVgpIHx8CiAJCSAgICAoZm9ybWF0ICYgRFRfV09SREJSRUFLKSkKIAkJewotCQkgICAgaWYgKCFHZXRUZXh0RXh0ZW50UG9pbnQoaGRjLCAmZGVzdFtqLTFdLCAxLCAmc2l6ZSkpCisJCSAgICBpZiAoIUdldFRleHRFeHRlbnRQb2ludDE2KGhkYywgJmRlc3Rbai0xXSwgMSwgJnNpemUpKQogCQkJcmV0dXJuIE5VTEw7CiAJCSAgICBwbGVuICs9IHNpemUuY3g7CiAJCX0KQEAgLTEzNiw3ICsxMzcsNyBAQAogCQl3Yl9pID0gaTsKIAkJd2JfaiA9IGogLSAxOwogCQl3Yl9jb3VudCA9ICpjb3VudDsKLQkJaWYgKCFHZXRUZXh0RXh0ZW50UG9pbnQoaGRjLCAmZGVzdFtqLTFdLCAxLCAmc2l6ZSkpCisJCWlmICghR2V0VGV4dEV4dGVudFBvaW50MTYoaGRjLCAmZGVzdFtqLTFdLCAxLCAmc2l6ZSkpCiAJCSAgICByZXR1cm4gTlVMTDsKIAkJcGxlbiArPSBzaXplLmN4OwogCSAgICB9CkBAIC0xNDcsNyArMTQ4LDcgQEAKIAkgICAgaWYgKCEoZm9ybWF0ICYgRFRfTk9DTElQKSB8fCAhKGZvcm1hdCAmIERUX05PUFJFRklYKSB8fAogCQkoZm9ybWF0ICYgRFRfV09SREJSRUFLKSkKIAkgICAgewotCQlpZiAoIUdldFRleHRFeHRlbnRQb2ludChoZGMsICZkZXN0W2otMV0sIDEsICZzaXplKSkKKwkJaWYgKCFHZXRUZXh0RXh0ZW50UG9pbnQxNihoZGMsICZkZXN0W2otMV0sIDEsICZzaXplKSkKIAkJICAgIHJldHVybiBOVUxMOwogCQlwbGVuICs9IHNpemUuY3g7CiAJICAgIH0KQEAgLTE4MiwxMSArMTgzLDEyIEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgRHJhd1RleHQgICAgKFVTRVIuODUpCisgKiAgICAgICAgICAgRHJhd1RleHQxNiAgICAoVVNFUi44NSkKICAqLwotSU5UIERyYXdUZXh0KCBIREMgaGRjLCBMUENTVFIgc3RyLCBJTlQgaV9jb3VudCwgTFBSRUNUIHJlY3QsIFVJTlQgZmxhZ3MgKQorSU5UMTYgRHJhd1RleHQxNiggSERDMTYgaGRjLCBMUENTVFIgc3RyLCBJTlQxNiBpX2NvdW50LAorICAgICAgICAgICAgICAgICAgTFBSRUNUMTYgcmVjdCwgVUlOVDE2IGZsYWdzICkKIHsKLSAgICBTSVpFIHNpemU7CisgICAgU0laRTE2IHNpemU7CiAgICAgY29uc3QgY2hhciAqc3RyUHRyOwogICAgIHN0YXRpYyBjaGFyIGxpbmVbMTAyNF07CiAgICAgaW50IGxlbiwgbGgsIGNvdW50PWlfY291bnQ7CkBAIC0yMTQsOSArMjE2LDkgQEAKIAogICAgIGlmIChmbGFncyAmIERUX0VYUEFORFRBQlMpCiAgICAgewotCUdldFRleHRFeHRlbnRQb2ludChoZGMsICIgIiwgMSwgJnNpemUpOworCUdldFRleHRFeHRlbnRQb2ludDE2KGhkYywgIiAiLCAxLCAmc2l6ZSk7CiAJc3BhY2V3aWR0aCA9IHNpemUuY3g7Ci0JR2V0VGV4dEV4dGVudFBvaW50KGhkYywgIm8iLCAxLCAmc2l6ZSk7CisJR2V0VGV4dEV4dGVudFBvaW50MTYoaGRjLCAibyIsIDEsICZzaXplKTsKIAl0YWJ3aWR0aCA9IHNpemUuY3ggKiB0YWJzdG9wOwogICAgIH0KIApAQCAtMjI3LDEzICsyMjksMTMgQEAKIAogCWlmIChwcmVmaXhfb2Zmc2V0ICE9IC0xKQogCXsKLQkgICAgR2V0VGV4dEV4dGVudFBvaW50KGhkYywgbGluZSwgcHJlZml4X29mZnNldCwgJnNpemUpOworCSAgICBHZXRUZXh0RXh0ZW50UG9pbnQxNihoZGMsIGxpbmUsIHByZWZpeF9vZmZzZXQsICZzaXplKTsKIAkgICAgcHJlZml4X3ggPSBzaXplLmN4OwotCSAgICBHZXRUZXh0RXh0ZW50UG9pbnQoaGRjLCBsaW5lLCBwcmVmaXhfb2Zmc2V0ICsgMSwgJnNpemUpOworCSAgICBHZXRUZXh0RXh0ZW50UG9pbnQxNihoZGMsIGxpbmUsIHByZWZpeF9vZmZzZXQgKyAxLCAmc2l6ZSk7CiAJICAgIHByZWZpeF9lbmQgPSBzaXplLmN4IC0gMTsKIAl9CiAKLQlpZiAoIUdldFRleHRFeHRlbnRQb2ludChoZGMsIGxpbmUsIGxlbiwgJnNpemUpKSByZXR1cm4gMDsKKwlpZiAoIUdldFRleHRFeHRlbnRQb2ludDE2KGhkYywgbGluZSwgbGVuLCAmc2l6ZSkpIHJldHVybiAwOwogCWlmIChmbGFncyAmIERUX0NFTlRFUikgeCA9IChyZWN0LT5sZWZ0ICsgcmVjdC0+cmlnaHQgLQogCQkJCSAgICBzaXplLmN4KSAvIDI7CiAJZWxzZSBpZiAoZmxhZ3MgJiBEVF9SSUdIVCkgeCA9IHJlY3QtPnJpZ2h0IC0gc2l6ZS5jeDsKQEAgLTI0NiwxNiArMjQ4LDE2IEBACiAJfQogCWlmICghKGZsYWdzICYgRFRfQ0FMQ1JFQ1QpKQogCXsKLQkgICAgaWYgKCFFeHRUZXh0T3V0KCBoZGMsIHgsIHksIChmbGFncyAmIERUX05PQ0xJUCkgPyAwIDogRVRPX0NMSVBQRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QsIGxpbmUsIGxlbiwgTlVMTCApKSByZXR1cm4gMDsKKwkgICAgaWYgKCFFeHRUZXh0T3V0MTYoaGRjLCB4LCB5LCAoZmxhZ3MgJiBEVF9OT0NMSVApID8gMCA6IEVUT19DTElQUEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdCwgbGluZSwgbGVuLCBOVUxMICkpIHJldHVybiAwOwogCX0KIAllbHNlIGlmIChzaXplLmN4ID4gbWF4X3dpZHRoKQogCSAgICBtYXhfd2lkdGggPSBzaXplLmN4OwogCiAJaWYgKHByZWZpeF9vZmZzZXQgIT0gLTEpCiAJewotCSAgICBIUEVOIGhwZW4gPSBDcmVhdGVQZW4oIFBTX1NPTElELCAxLCBHZXRUZXh0Q29sb3IoaGRjKSApOwotCSAgICBIUEVOIG9sZFBlbiA9IFNlbGVjdE9iamVjdCggaGRjLCBocGVuICk7CisJICAgIEhQRU4xNiBocGVuID0gQ3JlYXRlUGVuKCBQU19TT0xJRCwgMSwgR2V0VGV4dENvbG9yKGhkYykgKTsKKwkgICAgSFBFTjE2IG9sZFBlbiA9IFNlbGVjdE9iamVjdCggaGRjLCBocGVuICk7CiAJICAgIE1vdmVUbyhoZGMsIHggKyBwcmVmaXhfeCwgeSArIHRtLnRtQXNjZW50ICsgMSApOwogCSAgICBMaW5lVG8oaGRjLCB4ICsgcHJlZml4X2VuZCwgeSArIHRtLnRtQXNjZW50ICsgMSApOwogCSAgICBTZWxlY3RPYmplY3QoIGhkYywgb2xkUGVuICk7CkBAIC0yODMsMTUgKzI4NSw0NyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEV4dFRleHRPdXQgICAgKEdESS4zNTEpCisgKiAgICAgICAgICAgRHJhd1RleHQzMkEgICAgKFVTRVIzMi4xNjMpCiAgKi8KLUJPT0wgRXh0VGV4dE91dCggSERDIGhkYywgc2hvcnQgeCwgc2hvcnQgeSwgV09SRCBmbGFncywgTFBSRUNUIGxwcmVjdCwKLSAgICAgICAgICAgICAgICAgTFBTVFIgc3RyLCBXT1JEIGNvdW50LCBMUElOVDE2IGxwRHggKQorSU5UMzIgRHJhd1RleHQzMkEoIEhEQzMyIGhkYywgTFBDU1RSIHN0ciwgSU5UMzIgY291bnQsCisgICAgICAgICAgICAgICAgICAgTFBSRUNUMzIgcmVjdCwgVUlOVDMyIGZsYWdzICkKK3sKKyAgICBSRUNUMTYgcmVjdDE2OworICAgIElOVDE2IHJldDsKKworICAgIGlmICghcmVjdCkKKyAgICAgICAgcmV0dXJuIERyYXdUZXh0MTYoIChIREMxNiloZGMsIHN0ciwgKElOVDE2KWNvdW50LCBOVUxMLCAoVUlOVDE2KWZsYWdzKTsKKyAgICBDT05WX1JFQ1QzMlRPMTYoIHJlY3QsICZyZWN0MTYgKTsKKyAgICByZXQgPSBEcmF3VGV4dDE2KCAoSERDMTYpaGRjLCBzdHIsIChJTlQxNiljb3VudCwgJnJlY3QxNiwgKFVJTlQxNilmbGFncyApOworICAgIENPTlZfUkVDVDE2VE8zMiggJnJlY3QxNiwgcmVjdCApOworICAgIHJldHVybiByZXQ7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgRHJhd1RleHQzMlcgICAgKFVTRVIzMi4xNjYpCisgKi8KK0lOVDMyIERyYXdUZXh0MzJXKCBIREMzMiBoZGMsIExQQ1dTVFIgc3RyLCBJTlQzMiBjb3VudCwKKyAgICAgICAgICAgICAgICAgICBMUFJFQ1QzMiByZWN0LCBVSU5UMzIgZmxhZ3MgKQoreworICAgIGNoYXIgKnAgPSBTVFJJTkczMl9EdXBVbmlUb0Fuc2koIHN0ciApOworICAgIElOVDMyIHJldCA9IERyYXdUZXh0MzJBKCBoZGMsIHAsIGNvdW50LCByZWN0LCBmbGFncyApOworICAgIGZyZWUocCk7CisgICAgcmV0dXJuIHJldDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBFeHRUZXh0T3V0MTYgICAgKEdESS4zNTEpCisgKi8KK0JPT0wxNiBFeHRUZXh0T3V0MTYoIEhEQzE2IGhkYywgSU5UMTYgeCwgSU5UMTYgeSwgVUlOVDE2IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgUkVDVDE2ICpscHJlY3QsIExQQ1NUUiBzdHIsIFVJTlQxNiBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVDE2ICpscER4ICkKIHsKICAgICBpbnQgZGlyLCBhc2NlbnQsIGRlc2NlbnQsIGk7CiAgICAgWENoYXJTdHJ1Y3QgaW5mbzsKICAgICBYRm9udFN0cnVjdCAqZm9udDsKLSAgICBSRUNUIHJlY3Q7CisgICAgUkVDVDE2IHJlY3Q7CiAKICAgICBEQyAqIGRjID0gKERDICopIEdESV9HZXRPYmpQdHIoIGhkYywgRENfTUFHSUMgKTsKICAgICBpZiAoIWRjKSAKQEAgLTQyMSw3ICs0NTUsNyBAQAogICAgICAgICBpdGVtcyA9IHhtYWxsb2MoIGNvdW50ICogc2l6ZW9mKFhUZXh0SXRlbSkgKTsKICAgICAgICAgZm9yIChpID0gMCwgcGl0ZW0gPSBpdGVtczsgaSA8IGNvdW50OyBpKyssIHBpdGVtKyspCiAgICAgICAgIHsKLSAgICAgICAgICAgIHBpdGVtLT5jaGFycyAgPSBzdHIgKyBpOworICAgICAgICAgICAgcGl0ZW0tPmNoYXJzICA9IChjaGFyICopc3RyICsgaTsKICAgICAgICAgICAgIHBpdGVtLT5uY2hhcnMgPSAxOwogICAgICAgICAgICAgcGl0ZW0tPmZvbnQgICA9IE5vbmU7CiAgICAgICAgICAgICBpZiAoaSA9PSAwKQpAQCAtNDM0LDcgKzQ2OCw3IEBACiAgICAgICAgICAgICAgICAgcGl0ZW0tPmRlbHRhICs9IGRjLT53LmJyZWFrRXh0cmE7CiAgICAgICAgICAgICBpZiAobHBEeCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBJTlQgd2lkdGg7CisgICAgICAgICAgICAgICAgSU5UMTYgd2lkdGg7CiAgICAgICAgICAgICAgICAgR2V0Q2hhcldpZHRoKCBoZGMsIHN0cltpXSwgc3RyW2ldLCAmd2lkdGggKTsKICAgICAgICAgICAgICAgICBwaXRlbS0+ZGVsdGEgKz0gbHBEeFtpLTFdIC0gd2lkdGg7CiAgICAgICAgICAgICB9CkBAIC00NzksMTEgKzUxMyw2MiBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFRleHRPdXQgICAgKEdESS4zMykKKyAqICAgICAgICAgICBFeHRUZXh0T3V0MzJBICAgIChHREkzMi45OCkKICAqLwotQk9PTCBUZXh0T3V0KCBIREMgaGRjLCBzaG9ydCB4LCBzaG9ydCB5LCBMUFNUUiBzdHIsIHNob3J0IGNvdW50ICkKK0JPT0wzMiBFeHRUZXh0T3V0MzJBKCBIREMzMiBoZGMsIElOVDMyIHgsIElOVDMyIHksIFVJTlQzMiBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSRUNUMzIgKmxwcmVjdCwgTFBDU1RSIHN0ciwgVUlOVDMyIGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVDMyICpscER4ICkKIHsKLSAgICByZXR1cm4gRXh0VGV4dE91dCggaGRjLCB4LCB5LCAwLCBOVUxMLCBzdHIsIGNvdW50LCBOVUxMICk7CisgICAgUkVDVDE2IHJlY3QxNjsKKworICAgIGlmIChscER4KSBmcHJpbnRmKCBzdGRlcnIsICJFeHRUZXh0T3V0MzJBOiBscER4IG5vdCBpbXBsZW1lbnRlZFxuIiApOworICAgIGlmICghbHByZWN0KQorICAgICAgICByZXR1cm4gRXh0VGV4dE91dDE2KCAoSERDMTYpaGRjLCAoSU5UMTYpeCwgKElOVDE2KXksIChVSU5UMTYpZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIHN0ciwgKFVJTlQxNiljb3VudCwgTlVMTCApOworICAgIENPTlZfUkVDVDMyVE8xNiggbHByZWN0LCAmcmVjdDE2ICk7CisgICAgcmV0dXJuIEV4dFRleHRPdXQxNiggKEhEQzE2KWhkYywgKElOVDE2KXgsIChJTlQxNil5LCAoVUlOVDE2KWZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICZyZWN0MTYsIHN0ciwgKFVJTlQxNiljb3VudCwgTlVMTCApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEV4dFRleHRPdXQzMlcgICAgKEdESTMyLjk5KQorICovCitCT09MMzIgRXh0VGV4dE91dDMyVyggSERDMzIgaGRjLCBJTlQzMiB4LCBJTlQzMiB5LCBVSU5UMzIgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUkVDVDMyICpscHJlY3QsIExQQ1dTVFIgc3RyLCBVSU5UMzIgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UMzIgKmxwRHggKQoreworICAgIGNoYXIgKnAgPSBTVFJJTkczMl9EdXBVbmlUb0Fuc2koIHN0ciApOworICAgIElOVDMyIHJldCA9IEV4dFRleHRPdXQzMkEoIGhkYywgeCwgeSwgZmxhZ3MsIGxwcmVjdCwgcCwgY291bnQsIGxwRHggKTsKKyAgICBmcmVlKHApOworICAgIHJldHVybiByZXQ7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgVGV4dE91dDE2ICAgIChHREkuMzMpCisgKi8KK0JPT0wxNiBUZXh0T3V0MTYoIEhEQzE2IGhkYywgSU5UMTYgeCwgSU5UMTYgeSwgTFBDU1RSIHN0ciwgSU5UMTYgY291bnQgKQoreworICAgIHJldHVybiBFeHRUZXh0T3V0MTYoIGhkYywgeCwgeSwgMCwgTlVMTCwgc3RyLCBjb3VudCwgTlVMTCApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFRleHRPdXQzMkEgICAgKEdESTMyLjM1NSkKKyAqLworQk9PTDMyIFRleHRPdXQzMkEoIEhEQzMyIGhkYywgSU5UMzIgeCwgSU5UMzIgeSwgTFBDU1RSIHN0ciwgSU5UMzIgY291bnQgKQoreworICAgIHJldHVybiBFeHRUZXh0T3V0MzJBKCBoZGMsIHgsIHksIDAsIE5VTEwsIHN0ciwgY291bnQsIE5VTEwgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBUZXh0T3V0MzJXICAgIChHREkzMi4zNTYpCisgKi8KK0JPT0wzMiBUZXh0T3V0MzJXKCBIREMzMiBoZGMsIElOVDMyIHgsIElOVDMyIHksIExQQ1dTVFIgc3RyLCBJTlQzMiBjb3VudCApCit7CisgICAgcmV0dXJuIEV4dFRleHRPdXQzMlcoIGhkYywgeCwgeSwgMCwgTlVMTCwgc3RyLCBjb3VudCwgTlVMTCApOwogfQogCiAKQEAgLTUwMSw4ICs1ODYsOCBAQAogCX0gZWxzZSB7CiAJCWN1cnJlbnRfY29sb3IgPSBHZXRUZXh0Q29sb3IoaGRjKTsKIAkJU2V0VGV4dENvbG9yKGhkYywgR2V0U3lzQ29sb3IoQ09MT1JfR1JBWVRFWFQpICk7Ci0JCXMgPSBUZXh0T3V0KGhkYywgeCwgeSwgKExQU1RSKSBsUGFyYW0sIAotCQkJCWNjaCA/IGNjaCA6IGxzdHJsZW4oKExQQ1NUUikgbFBhcmFtKSApOworCQlzID0gVGV4dE91dDE2KGhkYywgeCwgeSwgKExQU1RSKSBsUGFyYW0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2NoID8gY2NoIDogbHN0cmxlbigoTFBDU1RSKSBsUGFyYW0pICk7CiAJCVNldFRleHRDb2xvcihoZGMsIGN1cnJlbnRfY29sb3IpOwogCQkKIAkJcmV0dXJuIHM7CkBAIC01NTYsMTEgKzY0MSwxMSBAQAogICAgICAgICAgICAgdGFiUG9zID0gblRhYk9yZyArICgoeCArIExPV09SRChleHRlbnQpIC0gblRhYk9yZykgLyBkZWZXaWR0aCArIDEpICogZGVmV2lkdGg7CiAgICAgICAgIGlmIChmRGlzcGxheVRleHQpCiAgICAgICAgIHsKLSAgICAgICAgICAgIFJFQ1QgcjsKLSAgICAgICAgICAgIFNldFJlY3QoICZyLCB4LCB5LCB0YWJQb3MsIHkrSElXT1JEKGV4dGVudCkgKTsKLSAgICAgICAgICAgIEV4dFRleHRPdXQoIGhkYywgeCwgeSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEdldEJrTW9kZShoZGMpID09IE9QQVFVRSA/IEVUT19PUEFRVUUgOiAwLAotICAgICAgICAgICAgICAgICAgICAgICAgJnIsIGxwc3RyLCBpLCBOVUxMICk7CisgICAgICAgICAgICBSRUNUMTYgcjsKKyAgICAgICAgICAgIFNldFJlY3QxNiggJnIsIHgsIHksIHRhYlBvcywgeStISVdPUkQoZXh0ZW50KSApOworICAgICAgICAgICAgRXh0VGV4dE91dDE2KCBoZGMsIHgsIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEJrTW9kZShoZGMpID09IE9QQVFVRSA/IEVUT19PUEFRVUUgOiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmciwgbHBzdHIsIGksIE5VTEwgKTsKICAgICAgICAgfQogICAgICAgICB4ID0gdGFiUG9zOwogICAgICAgICBjb3VudCAtPSBpKzE7CmRpZmYgLS1naXQgYS9yZXNvdXJjZXMvc3lzcmVzX0ZpLnJjIGIvcmVzb3VyY2VzL3N5c3Jlc19GaS5yYwppbmRleCA4YjVkZGMwLi4yZGMzYWZmIDEwMDY0NAotLS0gYS9yZXNvdXJjZXMvc3lzcmVzX0ZpLnJjCisrKyBiL3Jlc291cmNlcy9zeXNyZXNfRmkucmMKQEAgLTIxLDcgKzIxLDcgQEAKICAgICAgICAgUFVTSEJVVFRPTiAiJk9LIiwgMSwgMTYsIDU2LCA0MCwgMTQsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AKICAgICAgICAgUFVTSEJVVFRPTiAiJlBlcnV1dGEiLCAyLCA2NCwgNTYsIDQwLCAxNCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUAogICAgICAgICBQVVNIQlVUVE9OICImS2Vza2V5dOQiLCAzLCAxMTIsIDU2LCA0MCwgMTQsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AKLSAgICAgICAgUFVTSEJVVFRPTiAiJllyaXTkIHV1ZGVsbGVlbiIsIDQsIDE2MCwgNTYsIDQwLCAxNCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUAorICAgICAgICBQVVNIQlVUVE9OICImVXVkZWxsZWVuIiwgNCwgMTYwLCA1NiwgNDAsIDE0LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QCiAgICAgICAgIFBVU0hCVVRUT04gIiZIeWxr5OQiLCA1LCAyMDgsIDU2LCA0MCwgMTQsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AKICAgICAgICAgUFVTSEJVVFRPTiAiJkt5bGzkIiwgNiwgMjU2LCA1NiwgNDAsIDE0LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QCiAgICAgICAgIFBVU0hCVVRUT04gIiZFaSIsIDcsIDMwNCwgNTYsIDQwLCAxNCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUApAQCAtMTMyLDM2ICsxMzIsNjYgQEAKIH0KIAogCi1DSE9PU0VfRk9OVCBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSAzNiwgMjQsIDI2NCwgMTM0CitDSE9PU0VfRk9OVCBESUFMT0cgRElTQ0FSREFCTEUgIDEzLCA1NCwgMjY0LCAxNDcKIFNUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCiBDQVBUSU9OICJGb250aXQiCiBGT05UIDgsICJIZWx2IgogewotIExURVhUICJGb250dGk6IiwgMTA4OCwgNiwgNiwgNDAsIDkKLSBMVEVYVCAiIiwgMTA4OSwgNjAsIDYsIDE1MCwgOQotIERFRlBVU0hCVVRUT04gIk9LIiwgMSwgMjA2LCA2LCA1NiwgMTQsIEJTX0RFRlBVU0hCVVRUT04gfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKLSBQVVNIQlVUVE9OICJQZXJ1dXRhIiwgMiwgMjA2LCAyNCwgNTYsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyAgICBMVEVYVCAgICAgICAgICAgIiZGb250dGk6IiwxMDg4ICw2LDMsNDAsOQorICAgIENPTUJPQk9YICAgICAgICAxMTM2ICw2LDEzLDk0LDU0LCAgQ0JTX09XTkVSRFJBV0ZJWEVEIHwgQ0JTX0hBU1NUUklOR1MgfCBDQlNfRElTQUJMRU5PU0NST0xMIHwKKyAgICAgICAgICAgICAgICAgICAgQ0JTX0FVVE9IU0NST0xMIHwgQ0JTX1NPUlQgfCBXU19WU0NST0xMIHwgV1NfVEFCU1RPUCB8IENCU19TSU1QTEUKKyAgICBMVEVYVCAgICAgICAgICAgIkZvbnR0aXQmeXlsaToiLDEwODkgLDEwOCwzLDQ0LDkKKyAgICBDT01CT0JPWCAgICAgICAgMTEzNywxMDgsMTMsNjQsNTQsIENCU19PV05FUkRSQVdGSVhFRCB8IENCU19IQVNTVFJJTkdTIHwgQ0JTX0RJU0FCTEVOT1NDUk9MTCB8CisgICAgICAgICAgICAgICAgICAgIFdTX1ZTQ1JPTEwgfCBXU19UQUJTVE9QIHwgQ0JTX1NJTVBMRQorICAgIExURVhUICAgICAgICAgICAiJktva286IiwxMDkwLDE3OSwzLDMwLDkKKyAgICBDT01CT0JPWCAgICAgICAgMTEzOCwxNzksMTMsMzIsNTQsIENCU19PV05FUkRSQVdGSVhFRCB8IENCU19IQVNTVFJJTkdTIHwgQ0JTX0RJU0FCTEVOT1NDUk9MTCB8CisgICAgICAgICAgICAgICAgICAgIFdTX1ZTQ1JPTEwgfCBXU19UQUJTVE9QIHwgQ0JTX1NJTVBMRSB8IENCU19TT1JUCisgICAgREVGUFVTSEJVVFRPTiAgICJPSyIsSURPSywyMTgsNiw0MCwxNCxXU19HUk9VUAorICAgIFBVU0hCVVRUT04gICAgICAiUGVydXV0YSIsSURDQU5DRUwsMjE4LDIzLDQwLDE0LFdTX0dST1VQCisgICAgUFVTSEJVVFRPTiAgICAgICImU292ZWxsYSIsIDEwMjYsMjE4LDQwLDQwLDE0LFdTX0dST1VQCisgICAgUFVTSEJVVFRPTiAgICAgICImT2hqZSIgLCAxMDM4LDIxOCw1Nyw0MCwxNCxXU19HUk9VUAorICAgIEdST1VQQk9YICAgICAgICAiRWZla3RpdCIsMTA3Miw2LDcyLDg0LDM0LFdTX0dST1VQCisgICAgQ0hFQ0tCT1gJICAgICJZbGkmdmlpdmF0dHUiLCAxMDQwLCAxMCw4Miw1MCwxMCwgQlNfQVVUT0NIRUNLQk9YIHwgV1NfVEFCU1RPUAorICAgIENIRUNLQk9YIAkgICAgIkEmbGxldmlpdmF0dHUiLCAxMDQxLCAxMCw5NCw1MCwxMCwgQlNfQVVUT0NIRUNLQk9YIAorICAgIExURVhUICAgICAgICAgICAiVibkcmk6IiwgMTA5MSAsNiwxMTAsMzAsOQorICAgIENPTUJPQk9YICAgICAgICAxMTM5LDYsMTIwLDg0LDEwMCxDQlNfRFJPUERPV05MSVNUIHwgQ0JTX09XTkVSRFJBV0ZJWEVEIHwgQ0JTX0hBU1NUUklOR1MgfAorCQkgICAgQ0JTX0FVVE9IU0NST0xMIHwgIFdTX0JPUkRFUiB8IFdTX1ZTQ1JPTEwgfCBXU19UQUJTVE9QCisgICAgR1JPVVBCT1ggICAgICAgICJO5Hl0ZSIsMTA3Myw5OCw3MiwxNjAsNDksV1NfR1JPVVAKKyAgICBDVEVYVCAgICAgICAgICAgIkFhQmJZeVp6IiwxMDkzLDEwNCw4MSwxNDksMzcsU1NfTk9QUkVGSVggfCBXU19WSVNJQkxFCiB9CiAKIAotQ0hPT1NFX0NPTE9SIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDM2LCAyNCwgMjY0LCAyMDAKK0NIT09TRV9DT0xPUiBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSAzNiwgMjQsIDMwMCwgMjAwCiBTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQogQ0FQVElPTiAiVuRyaSIKIEZPTlQgOCwgIkhlbHYiCiB7Ci0gTFRFWFQgIlBlJnJ1c3bkcml0OiIsIDEwODgsIDYsIDYsIDQwLCA5Ci0gTFRFWFQgIiZNdW9rYXR1dCB25HJpdDoiLCAxMDg5LCA2LCAxMjYsIDQwLCA5Ci0gTFRFWFQgIlbkcml8JlRhc2FpbmVuIiwgMTA5MCwgMTAwLCAxNDYsIDQwLCA5Ci0gTFRFWFQgIiZT5HZ5OiIsIDEwOTEsIDE1MCwgMTI2LCA0MCwgOQotIExURVhUICImS3lsbDoiLCAxMDkyLCAxNTAsIDE0NiwgNDAsIDkKLSBMVEVYVCAiSyZpcmtrOiIsIDEwOTMsIDE1MCwgMTY2LCA0MCwgOQotIExURVhUICImUHVuOiIsIDEwOTQsIDE1MCwgMTI2LCA0MCwgOQotIExURVhUICImVmlocjoiLCAxMDk1LCAxNTAsIDE0NiwgNDAsIDkKLSBMVEVYVCAiU2kmbjoiLCAxMDk2LCAxNTAsIDE2NiwgNDAsIDkKLSBERUZQVVNIQlVUVE9OICJPSyIsIDEsIDYsIDE4MiwgNTYsIDE0LCBCU19ERUZQVVNIQlVUVE9OIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCi0gUFVTSEJVVFRPTiAiJkxpc+TkIHbkcmkiLCAxMDI0LCAxMjAsIDE4MiwgMTAwLCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCi0gUFVTSEJVVFRPTiAiUG9pcyZ0YSB25HJpIiwgMTAyNSwgNiwgMTY0LCA1NiwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAotIFBVU0hCVVRUT04gIlMmdWxqZSIsIDIsIDc2LCAxODIsIDU2LCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgTFRFWFQgIlBlJnJ1c3bkcml0OiIsICAgMTA4OCwgNCwgICAgNCwgIDE0MCwgMTAKKyBMVEVYVCAiJk11b2thdHV0IHbkcml0OiIsICAxMDg5LCA0LCAgIDEwNiwgMTQwLCAxMAorIExURVhUICJW5HJpfCZUYXNhaW5lbiIsICAxMDkwLCAxNTAsIDE1MSwgIDQ4LCAxMAorIExURVhUICAgIiZQdW46IiwgNzI2IC8qMTA5NCovLDI0OSwxMjYsMjQsMTAKKyBFRElUVEVYVCA3MDYsIDI3NSwxMjQsMTgsMTIsIFdTX0JPUkRFUiB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIExURVhUICAgIiZWaWhyOiIsNzI3LyoxMDk1Ki8sMjQ5LDE0MCwyNCwxMAorIEVESVRURVhUIDcwNywgMjc1LDEzOCwxOCwxMiwgV1NfQk9SREVSIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgTFRFWFQgICAiU2kmbjoiLDcyOCAvKjEwOTYqLywyNDksMTU0LDI0LDEwCisgRURJVFRFWFQgNzA4LCAyNzUsMTUyLDE4LDEyLCBXU19CT1JERVIgfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBMVEVYVCAgIiZT5HZ5OiIgLDcyMyAvKjEwOTEqLywyMDIsMTI2LDIyLDEwCisgRURJVFRFWFQgNzAzLCAyMjYsMTI0LDE4LDEyLCBXU19CT1JERVIgfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBMVEVYVCAgIiZLeWxsOiIgLDcyNCAvKjEwOTIqLywyMDIsMTQwLDIyLDEwCisgRURJVFRFWFQgNzA0LCAyMjYsMTM4LDE4LDEyLCBXU19CT1JERVIgfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBMVEVYVCAgIksmaXJrazoiICw3MjUgLyoxMDkzKi8sMjAyLDE1NCwyMiwxMAorIEVESVRURVhUIDcwNSwgMjI2LDE1MiwxOCwxMiwgV1NfQk9SREVSIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgQ09OVFJPTCAiIiAsNzIwLCJTVEFUSUMiLFNTX1NJTVBMRXxXU19UQUJTVE9QfFdTX0dST1VQLDQsMTQsMTQwLDg2CisgQ09OVFJPTCAiIiAsNzIxLCJTVEFUSUMiLFNTX1NJTVBMRXxXU19UQUJTVE9QfFdTX0dST1VQLDQsMTE2LDE0MCwyOAorIENPTlRST0wgIiIgLDcxMCwiU1RBVElDIixXU19CT1JERVJ8U1NfU0lNUExFfFdTX1RBQlNUT1B8V1NfR1JPVVAsIDE1Miw0LDExOCwxMTYKKyBDT05UUk9MICIiICw3MDIsIlNUQVRJQyIsU1NfU0lNUExFfFdTX1RBQlNUT1B8V1NfR1JPVVAsIDI3OCw0LDgsMTE2CisgQ09OVFJPTCAiIiAsNzA5LCJTVEFUSUMiLFNTX1NJTVBMRXxXU19UQUJTVE9QfFdTX0dST1VQLCAxNTIsMTI0LDQwLDI2CisgREVGUFVTSEJVVFRPTiAiT2siLCAgMSwgIDQsIDE2NiwgNDQsIDE0LCBCU19ERUZQVVNIQlVUVE9OIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgUFVTSEJVVFRPTiAiUyZ1bGplIiwgMiwgNTIsIDE2NiwgNDQsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICJPJmhqZSIsIDEwMzgsMTAwLDE2NiwgNDQsIDE0CisgUFVTSEJVVFRPTiAiJkxpc+TkIHbkcmkiLCAgICA3MTIvKjEwMjQqLywgMTUyLCAxNjYsIDE0MiwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIFBVU0hCVVRUT04gIk0m5ORyaXR0ZWxlIHbkcmkgPj4iLCA3MTkvKjEwMjUqLywgICA0LCAxNTAsIDE0MiwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIFBVU0hCVVRUT04gICImaSIsNzEzLDMwMCwyMDAsNCwxNCAgIC8qIGp1c3QgYSBkdW1teTogICdpJyBpcyAgbGlrZSAgJmkgIGluICJzb2wmaWQiICAqLwogfQogCiAKZGlmZiAtLWdpdCBhL3Rvb2xzL2J1aWxkLmMgYi90b29scy9idWlsZC5jCmluZGV4IDhkZTg1NDUuLjYyOTQ0ZDUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2J1aWxkLmMKKysrIGIvdG9vbHMvYnVpbGQuYwpAQCAtMTA2Myw3ICsxMDYzLDggQEAKICAgICAgICAgICAgICAgICAgICAgKG9kcC0+dHlwZSA9PSBUWVBFX1JFR0lTVEVSKSA/ICJyZWdzIiA6CiAgICAgICAgICAgICAgICAgICAgIChvZHAtPnR5cGUgPT0gVFlQRV9QQVNDQUwpID8gImxvbmciIDogIndvcmQiLAogICAgICAgICAgICAgICAgICAgICBmZHAtPmFyZ190eXBlcyApOwotICAgICAgICAgICAgcHJpbnRmKCAiXHQud29yZCAweCUwNHhcbiIsIFdJTkVfQ09ERV9TRUxFQ1RPUiApOworICAgICAgICAgICAgcHJpbnRmKCAiXHQuYnl0ZSAweCUwMngsMHglMDJ4XG4iLCAvKiBTb21lIGFzbXMgZG9uJ3QgaGF2ZSAud29yZCAqLworICAgICAgICAgICAgICAgICAgICBMT0JZVEUoV0lORV9DT0RFX1NFTEVDVE9SKSwgSElCWVRFKFdJTkVfQ09ERV9TRUxFQ1RPUikgKTsKICAgICAgICAgICAgIHByaW50ZiggIlx0bm9wXG4iICk7CiAgICAgICAgICAgICBwcmludGYoICJcdG5vcFxuXG4iICk7CiAgICAgICAgICAgICBvZHAtPm9mZnNldCA9IGNvZGVfb2Zmc2V0OwpkaWZmIC0tZ2l0IGEvd2luMzIvTWFrZWZpbGUuaW4gYi93aW4zMi9NYWtlZmlsZS5pbgppbmRleCBiNTYzZTdlLi43MmQxMjc3IDEwMDY0NAotLS0gYS93aW4zMi9NYWtlZmlsZS5pbgorKysgYi93aW4zMi9NYWtlZmlsZS5pbgpAQCAtMTUsNyArMTUsNiBAQAogCW1lbW9yeS5jIFwKIAluZXdmbnMuYyBcCiAJb2JqZWN0X21ndC5jIFwKLQlwYXJhbTMyLmMgXAogCXByb2Nlc3MuYyBcCiAJcmVzb3VyY2UuYyBcCiAJc3RyaW5nMzIuYyBcCmRpZmYgLS1naXQgYS93aW4zMi9jdXJzb3JpY29uMzIuYyBiL3dpbjMyL2N1cnNvcmljb24zMi5jCmluZGV4IGY1ZDgyNjIuLjcwOWY4ZTcgMTAwNjQ0Ci0tLSBhL3dpbjMyL2N1cnNvcmljb24zMi5jCisrKyBiL3dpbjMyL2N1cnNvcmljb24zMi5jCkBAIC0yNzMsNyArMjczLDcgQEAKICAgICBIQU5ETEUgaEFuZEJpdHMsIGhYb3JCaXRzLCBoUmVzOwogICAgIEhEQyBoZGM7CiAgICAgaW50IHNpemUsIHNpemVBbmQsIHNpemVYb3I7Ci0gICAgUE9JTlQgaG90c3BvdCA9IHsgMCAsMCB9OworICAgIFBPSU5UMTYgaG90c3BvdCA9IHsgMCAsMCB9OwogICAgIEJJVE1BUE9CSiAqYm1wWG9yLCAqYm1wQW5kOwogICAgIEJJVE1BUElORk8gKmJtaSwgKnBJbmZvOwogICAgIENVUlNPUklDT05JTkZPICppbmZvOwpAQCAtMjgyLDcgKzI4Miw3IEBACiAJaFJlcz0wOwogICAgIGlmIChmQ3Vyc29yKSAgLyogSWYgY3Vyc29yLCBnZXQgdGhlIGhvdHNwb3QgKi8KICAgICB7Ci0gICAgICAgIFBPSU5UICpwdCA9IChQT0lOVCAqKUxvY2tSZXNvdXJjZTMyKCBoYW5kbGUgKTsKKyAgICAgICAgUE9JTlQxNiAqcHQgPSAoUE9JTlQxNiAqKUxvY2tSZXNvdXJjZTMyKCBoYW5kbGUgKTsKICAgICAgICAgaG90c3BvdCA9ICpwdDsKICAgICAgICAgYm1pID0gKEJJVE1BUElORk8gKikocHQgKyAxKTsKICAgICB9CmRpZmYgLS1naXQgYS93aW4zMi9tZW1vcnkuYyBiL3dpbjMyL21lbW9yeS5jCmluZGV4IDM0OWEzNjguLmM1MGE0NWMgMTAwNjQ0Ci0tLSBhL3dpbjMyL21lbW9yeS5jCisrKyBiL3dpbjMyL21lbW9yeS5jCkBAIC00LDYgKzQsNyBAQAogICogQ29weXJpZ2h0IDE5OTUgTWFydGluIHZvbiBMb2V3aXMgYW5kIENhbWVyb24gSGVpZGUKICAqLwogCisjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxtYWxsb2MuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgpAQCAtMjMsOSArMjQsNiBAQAogI2lmbmRlZiBQUk9UX05PTkUgIC8qIEZyZWVCU0QgZG9lc24ndCBkZWZpbmUgUFJPVF9OT05FICovCiAjZGVmaW5lIFBST1RfTk9ORSAwCiAjZW5kaWYKLSNpZm5kZWYgTUFQX0FOT04KLSNkZWZpbmUgTUFQX0FOT04gMAotI2VuZGlmCiAKIHR5cGVkZWYgc3RydWN0IHsKICAgICBjYWRkcl90CXB0cjsKQEAgLTE3MiwxMiArMTcwLDIyIEBACiAgICAgaW50CWk7CiAgICAgdmlydHVhbF9tZW1fdCAqdG1wX21lbTsKICAgICBpbnQJcHJvdDsKKyAgICBzdGF0aWMgaW50IGZkemVybyA9IC0xOworCisgICAgaWYgKGZkemVybyA9PSAtMSkKKyAgICB7CisgICAgICAgIGlmICgoZmR6ZXJvID0gb3BlbiggIi9kZXYvemVybyIsIE9fUkRPTkxZICkpID09IC0xKQorICAgICAgICB7CisgICAgICAgICAgICBwZXJyb3IoICIvZGV2L3plcm86IG9wZW4iICk7CisgICAgICAgICAgICByZXR1cm4gKExQVk9JRClOVUxMOworICAgICAgICB9CisgICAgfQogCiAgICAgZHByaW50Zl93aW4zMihzdGRkZWIsICJWaXJ0dWFsQWxsb2M6IHNpemUgPSAlbGQsIGFkZHJlc3M9JXBcbiIsIGNiU2l6ZSwgbHB2QWRkcmVzcyk7CiAgICAgaWYgKGZkd0FsbG9jYXRpb25UeXBlICYgTUVNX1JFU0VSVkUgfHwgIWxwdkFkZHJlc3MpIHsKICAgICAgICAgcHRyID0gbW1hcCgodm9pZCAqKSgoKCh1bnNpZ25lZCBsb25nKWxwdkFkZHJlc3MtMSkgJiAweEZGRkYwMDAwTCkgCiAJICAgICAgICAgICAgICAgICsgMHgwMDAxMDAwMEwpLAotCQkgICBjYlNpemUsIFBST1RfTk9ORSwgTUFQX0FOT058TUFQX1BSSVZBVEUsLTEsMCk7CisJCSAgIGNiU2l6ZSwgUFJPVF9OT05FLCBNQVBfUFJJVkFURSwgZmR6ZXJvLCAwICk7CiAJaWYgKHB0ciA9PSAoY2FkZHJfdCkgLTEpIHsKIAkgICAgZHByaW50Zl93aW4zMihzdGRkZWIsICJWaXJ0dWFsQWxsb2M6IHJldHVybmluZyBOVUxMIik7CiAJICAgIHJldHVybiAoTFBWT0lEKSBOVUxMOwpAQCAtMTg2LDcgKzE5NCw3IEBACiAJICAgIG11bm1hcChwdHIsIGNiU2l6ZSk7CiAJICAgIGNiU2l6ZSArPSA2NTUzNTsKIAkgICAgcHRyID0gIG1tYXAobHB2QWRkcmVzcywgY2JTaXplLCAKLQkgICAgICAgICAgICAgICAgUFJPVF9OT05FLCBNQVBfQU5PTnxNQVBfUFJJVkFURSwtMSwwKTsKKwkgICAgICAgICAgICAgICAgUFJPVF9OT05FLCBNQVBfUFJJVkFURSwgZmR6ZXJvLCAwICk7CiAJICAgIGlmIChwdHIgPT0gKGNhZGRyX3QpIC0xKSB7CiAJCWRwcmludGZfd2luMzIoc3RkZGViLCAiVmlydHVhbEFsbG9jOiByZXR1cm5pbmcgTlVMTCIpOwogCQlyZXR1cm4gKExQVk9JRCkgTlVMTDsKZGlmZiAtLWdpdCBhL3dpbjMyL25ld2Zucy5jIGIvd2luMzIvbmV3Zm5zLmMKaW5kZXggMzFiYjE3OS4uYTIyNmUxNiAxMDA2NDQKLS0tIGEvd2luMzIvbmV3Zm5zLmMKKysrIGIvd2luMzIvbmV3Zm5zLmMKQEAgLTIzLDMgKzIzLDEzIEBACiAJICAgYW55d2F5cyAqLwogCXJldHVybiBXaW5IZWxwKGhXbmQsbHBzekhlbHAsdUNvbW1hbmQsZHdEYXRhKTsKIH0KKworSEhPT0sgU2V0V2luZG93c0hvb2tFeDMyQShpbnQgSG9va0lkLCBIT09LUFJPQyBob29rZm4sIEhJTlNUQU5DRSBoTW9kdWxlLAorCQkJCURXT1JEIFRocmVhZElkKQorCit7CisJLyogU3R1YiBmb3Igbm93ICovCisJZnByaW50ZihzdGRuaW1wLCAiV0lOMzJfU2V0V2luZG93c0hvb2tFeCBTdHViIGNhbGxlZCFcbiIpOworCQorCXJldHVybiAoSEhPT0spIE5VTEw7Cit9CmRpZmYgLS1naXQgYS93aW4zMi9wYXJhbTMyLmMgYi93aW4zMi9wYXJhbTMyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5Njk2NDguLjAwMDAwMDAKLS0tIGEvd2luMzIvcGFyYW0zMi5jCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIFdpbjMyIHJlbGF5IGZ1bmN0aW9ucwotICogVGhlIGltcGxlbWVudGF0aW9ucyBoZXJlIHBlcmZvcm0gb25seSBwYXJhbWV0ZXIgY29udmVyc2lvbnMsIGFuZAotICogY2FsbCB0aGUgV2luMTYgY291bnRlcnBhcnRzCi0gKgotICogQ29weXJpZ2h0IDE5OTYgTWFydGluIHZvbiBMb2V3aXMKLSAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJ3aW5kb3dzLmgiCi0jaW5jbHVkZSAid2luZXJyb3IuaCIKLSNpbmNsdWRlICJzdHJ1Y3QzMi5oIgotI2luY2x1ZGUgInN0YWNrZnJhbWUuaCIKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgotI2luY2x1ZGUgImRlYnVnLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgTW92ZVRvRXggICAgICAgICAgKEdESTMyLjI1NCkKLSAqLwotQk9PTCBXSU4zMl9Nb3ZlVG9FeChIREMgaGRjLGludCB4LGludCB5LFBPSU5UMzIqIHAzMikKLXsKLQlQT0lOVCBwOwotCWlmIChwMzIgPT0gTlVMTCkKLQkJcmV0dXJuIE1vdmVUb0V4KGhkYyx4LHksKFBPSU5UICopTlVMTCk7Ci0JZWxzZSB7Ci0JCVNUUlVDVDMyX1BPSU5UMzJ0bzE2KHAzMiwmcCk7Ci0JCXJldHVybiBNb3ZlVG9FeChoZGMseCx5LCZwKTsKLQl9Ci19Ci0KLUJPT0wgV0lOMzJfR2V0VGV4dEV4dGVudFBvaW50QShIREMgaGRjLCBMUENTVFIgc3RyLCBpbnQgbGVuZ3RoLCBTSVpFMzIqIGxwc2l6ZSkKLQotewotICAgICAgICBTSVpFIHM7Ci0gICAgICAgIEJPT0wgcmV0dmFsOwotCi0gICAgICAgIHJldHZhbCA9IEdldFRleHRFeHRlbnRQb2ludChoZGMsIHN0ciwgbGVuZ3RoLCAmcyk7Ci0gICAgICAgIFNUUlVDVDMyX1NJWkUxNnRvMzIoJnMsIGxwc2l6ZSk7Ci0KLSAgICAgICAgcmV0dXJuIHJldHZhbDsKLX0KLQotQVRPTSBXSU4zMl9HbG9iYWxBZGRBdG9tQShMUENTVFIgc3RyKQotewotICAgIGNoYXIgYnVmZmVyWzI1Nl07ICAvKiAxNi1iaXQgYXRvbXMgYXJlIGxpbWl0ZWQgdG8gMjU1IGFueXdheSAqLwotICAgIGxzdHJjcHluKCBidWZmZXIsIHN0ciwgc2l6ZW9mKGJ1ZmZlcikgKTsKLSAgICByZXR1cm4gR2xvYmFsQWRkQXRvbShNQUtFX1NFR1BUUihidWZmZXIpKTsKLX0KZGlmZiAtLWdpdCBhL3dpbjMyL3N0cmluZzMyLmMgYi93aW4zMi9zdHJpbmczMi5jCmluZGV4IDY2ZTI0M2UuLmM4ODhkMTEgMTAwNjQ0Ci0tLSBhL3dpbjMyL3N0cmluZzMyLmMKKysrIGIvd2luMzIvc3RyaW5nMzIuYwpAQCAtNjcsNiArNjcsMTQgQEAKIAlyZXR1cm4gZGVzdDsKIH0KIAorTFBXU1RSIFNUUklORzMyX2xzdHJjcHlXKExQV1NUUiBkc3QsIExQQ1dTVFIgc3JjKQoreworICAgIHJlZ2lzdGVyIExQV1NUUiBwID0gZHN0OworICAgIHdoaWxlICgoKnArKyA9ICpzcmMrKykpOworICAgIHJldHVybiBkc3Q7Cit9CisKKwogRFdPUkQgU1RSSU5HMzJfbHN0cmxlblcoTFBDV1NUUiBzdHIpCiB7CiAJaW50IGxlbjsKZGlmZiAtLWdpdCBhL3dpbjMyL3N0cnVjdDMyLmMgYi93aW4zMi9zdHJ1Y3QzMi5jCmluZGV4IDRhNzBjMTcuLjJkNzZkOGYgMTAwNjQ0Ci0tLSBhL3dpbjMyL3N0cnVjdDMyLmMKKysrIGIvd2luMzIvc3RydWN0MzIuYwpAQCAtMTEsMTkgKzExLDE5IEBACiAjaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCi12b2lkIFNUUlVDVDMyX1BPSU5UMzJ0bzE2KGNvbnN0IFBPSU5UMzIqIHAzMixQT0lOVCogcDE2KQordm9pZCBTVFJVQ1QzMl9QT0lOVDMydG8xNihjb25zdCBQT0lOVDMyKiBwMzIsIFBPSU5UMTYqIHAxNikKIHsKIAlwMTYtPnggPSBwMzItPng7CiAJcDE2LT55ID0gcDMyLT55OwogfQogCi12b2lkIFNUUlVDVDMyX1BPSU5UMTZ0bzMyKGNvbnN0IFBPSU5UKiBwMTYsUE9JTlQzMiogcDMyKQordm9pZCBTVFJVQ1QzMl9QT0lOVDE2dG8zMihjb25zdCBQT0lOVDE2KiBwMTYsIFBPSU5UMzIqIHAzMikKIHsKIAlwMzItPnggPSBwMTYtPng7CiAJcDMyLT55ID0gcDE2LT55OwogfQogCi12b2lkIFNUUlVDVDMyX1NJWkUxNnRvMzIoY29uc3QgU0laRSogcDE2LCBTSVpFMzIqIHAzMikgCit2b2lkIFNUUlVDVDMyX1NJWkUxNnRvMzIoY29uc3QgU0laRTE2KiBwMTYsIFNJWkUzMiogcDMyKSAKICAgCiB7CiAgICAgICAgIHAzMi0+Y3ggPSBwMTYtPmN4OwpAQCAtNTIsNyArNTIsNyBAQAogCW1zZzE2LT5wdC55PW1zZzMyLT5wdC55OwogfQogCi12b2lkIFNUUlVDVDMyX1JFQ1QzMnRvMTYoY29uc3QgUkVDVDMyKiByMzIsUkVDVCAqcjE2KQordm9pZCBTVFJVQ1QzMl9SRUNUMzJ0bzE2KGNvbnN0IFJFQ1QzMiogcjMyLCBSRUNUMTYgKnIxNikKIHsKIAlyMTYtPmxlZnQgPSByMzItPmxlZnQ7CiAJcjE2LT5yaWdodCA9IHIzMi0+cmlnaHQ7CkBAIC02MCw3ICs2MCw3IEBACiAJcjE2LT5ib3R0b20gPSByMzItPmJvdHRvbTsKIH0KIAotdm9pZCBTVFJVQ1QzMl9SRUNUMTZ0bzMyKGNvbnN0IFJFQ1QqIHIxNixSRUNUMzIgKnIzMikKK3ZvaWQgU1RSVUNUMzJfUkVDVDE2dG8zMihjb25zdCBSRUNUMTYqIHIxNiwgUkVDVDMyICpyMzIpCiB7CiAJcjMyLT5sZWZ0ID0gcjE2LT5sZWZ0OwogCXIzMi0+cmlnaHQgPSByMTYtPnJpZ2h0OwpAQCAtNjgsODMgKzY4LDk1IEBACiAJcjMyLT5ib3R0b20gPSByMTYtPmJvdHRvbTsKIH0KIAotdm9pZCBTVFJVQ1QzMl9NSU5NQVhJTkZPMzJ0bzE2KGNvbnN0IE1JTk1BWElORk8zMiAqZnJvbSxNSU5NQVhJTkZPICp0bykKK3ZvaWQgU1RSVUNUMzJfTUlOTUFYSU5GTzMydG8xNiggY29uc3QgTUlOTUFYSU5GTzMyICpmcm9tLCBNSU5NQVhJTkZPMTYgKnRvICkKIHsKLQlTVFJVQ1QzMl9QT0lOVDMydG8xNigmZnJvbS0+cHRSZXNlcnZlZCwmdG8tPnB0UmVzZXJ2ZWQpOwotCVNUUlVDVDMyX1BPSU5UMzJ0bzE2KCZmcm9tLT5wdE1heFNpemUsJnRvLT5wdE1heFNpemUpOwotCVNUUlVDVDMyX1BPSU5UMzJ0bzE2KCZmcm9tLT5wdE1heFBvc2l0aW9uLCZ0by0+cHRNYXhQb3NpdGlvbik7Ci0JU1RSVUNUMzJfUE9JTlQzMnRvMTYoJmZyb20tPnB0TWluVHJhY2tTaXplLCZ0by0+cHRNaW5UcmFja1NpemUpOwotCVNUUlVDVDMyX1BPSU5UMzJ0bzE2KCZmcm9tLT5wdE1heFRyYWNrU2l6ZSwmdG8tPnB0TWF4VHJhY2tTaXplKTsKKyAgICBDT05WX1BPSU5UMzJUTzE2KCAmZnJvbS0+cHRSZXNlcnZlZCwgICAgICZ0by0+cHRSZXNlcnZlZCApOworICAgIENPTlZfUE9JTlQzMlRPMTYoICZmcm9tLT5wdE1heFNpemUsICAgICAgJnRvLT5wdE1heFNpemUgKTsKKyAgICBDT05WX1BPSU5UMzJUTzE2KCAmZnJvbS0+cHRNYXhQb3NpdGlvbiwgICZ0by0+cHRNYXhQb3NpdGlvbiApOworICAgIENPTlZfUE9JTlQzMlRPMTYoICZmcm9tLT5wdE1pblRyYWNrU2l6ZSwgJnRvLT5wdE1pblRyYWNrU2l6ZSApOworICAgIENPTlZfUE9JTlQzMlRPMTYoICZmcm9tLT5wdE1heFRyYWNrU2l6ZSwgJnRvLT5wdE1heFRyYWNrU2l6ZSApOwogfQogCi12b2lkIFNUUlVDVDMyX01JTk1BWElORk8xNnRvMzIoY29uc3QgTUlOTUFYSU5GTyAqZnJvbSxNSU5NQVhJTkZPMzIgKnRvKQordm9pZCBTVFJVQ1QzMl9NSU5NQVhJTkZPMTZ0bzMyKCBjb25zdCBNSU5NQVhJTkZPMTYgKmZyb20sIE1JTk1BWElORk8zMiAqdG8gKQogewotCVNUUlVDVDMyX1BPSU5UMTZ0bzMyKCZmcm9tLT5wdFJlc2VydmVkLCZ0by0+cHRSZXNlcnZlZCk7Ci0JU1RSVUNUMzJfUE9JTlQxNnRvMzIoJmZyb20tPnB0TWF4U2l6ZSwmdG8tPnB0TWF4U2l6ZSk7Ci0JU1RSVUNUMzJfUE9JTlQxNnRvMzIoJmZyb20tPnB0TWF4UG9zaXRpb24sJnRvLT5wdE1heFBvc2l0aW9uKTsKLQlTVFJVQ1QzMl9QT0lOVDE2dG8zMigmZnJvbS0+cHRNaW5UcmFja1NpemUsJnRvLT5wdE1pblRyYWNrU2l6ZSk7Ci0JU1RSVUNUMzJfUE9JTlQxNnRvMzIoJmZyb20tPnB0TWF4VHJhY2tTaXplLCZ0by0+cHRNYXhUcmFja1NpemUpOworICAgIENPTlZfUE9JTlQxNlRPMzIoICZmcm9tLT5wdFJlc2VydmVkLCAgICAgJnRvLT5wdFJlc2VydmVkICk7CisgICAgQ09OVl9QT0lOVDE2VE8zMiggJmZyb20tPnB0TWF4U2l6ZSwgICAgICAmdG8tPnB0TWF4U2l6ZSApOworICAgIENPTlZfUE9JTlQxNlRPMzIoICZmcm9tLT5wdE1heFBvc2l0aW9uLCAgJnRvLT5wdE1heFBvc2l0aW9uICk7CisgICAgQ09OVl9QT0lOVDE2VE8zMiggJmZyb20tPnB0TWluVHJhY2tTaXplLCAmdG8tPnB0TWluVHJhY2tTaXplICk7CisgICAgQ09OVl9QT0lOVDE2VE8zMiggJmZyb20tPnB0TWF4VHJhY2tTaXplLCAmdG8tPnB0TWF4VHJhY2tTaXplICk7CiB9CiAKLXZvaWQgU1RSVUNUMzJfV0lORE9XUE9TMzJ0bzE2KGNvbnN0IFdJTkRPV1BPUzMyKiBmcm9tLFdJTkRPV1BPUyogdG8pCit2b2lkIFNUUlVDVDMyX1dJTkRPV1BPUzMydG8xNiggY29uc3QgV0lORE9XUE9TMzIqIGZyb20sIFdJTkRPV1BPUzE2KiB0byApCiB7Ci0JdG8tPmh3bmQ9ZnJvbS0+aHduZDsKLQl0by0+aHduZEluc2VydEFmdGVyPWZyb20tPmh3bmRJbnNlcnRBZnRlcjsKLQl0by0+eD1mcm9tLT54OwotCXRvLT55PWZyb20tPnk7Ci0JdG8tPmN4PWZyb20tPmN4OwotCXRvLT5mbGFncz1mcm9tLT5mbGFnczsKKyAgICB0by0+aHduZCAgICAgICAgICAgID0gKEhXTkQxNilmcm9tLT5od25kOworICAgIHRvLT5od25kSW5zZXJ0QWZ0ZXIgPSAoSFdORDE2KWZyb20tPmh3bmRJbnNlcnRBZnRlcjsKKyAgICB0by0+eCAgICAgICAgICAgICAgID0gKElOVDE2KWZyb20tPng7CisgICAgdG8tPnkgICAgICAgICAgICAgICA9IChJTlQxNilmcm9tLT55OworICAgIHRvLT5jeCAgICAgICAgICAgICAgPSAoSU5UMTYpZnJvbS0+Y3g7CisgICAgdG8tPmN5ICAgICAgICAgICAgICA9IChJTlQxNilmcm9tLT5jeTsKKyAgICB0by0+ZmxhZ3MgICAgICAgICAgID0gKFVJTlQxNilmcm9tLT5mbGFnczsKIH0KIAotdm9pZCBTVFJVQ1QzMl9XSU5ET1dQT1MxNnRvMzIoY29uc3QgV0lORE9XUE9TKiBmcm9tLFdJTkRPV1BPUzMyKiB0bykKK3ZvaWQgU1RSVUNUMzJfV0lORE9XUE9TMTZ0bzMyKCBjb25zdCBXSU5ET1dQT1MxNiogZnJvbSwgV0lORE9XUE9TMzIqIHRvICkKIHsKLQl0by0+aHduZD1mcm9tLT5od25kOwotCXRvLT5od25kSW5zZXJ0QWZ0ZXI9ZnJvbS0+aHduZEluc2VydEFmdGVyOwotCXRvLT54PWZyb20tPng7Ci0JdG8tPnk9ZnJvbS0+eTsKLQl0by0+Y3g9ZnJvbS0+Y3g7Ci0JdG8tPmZsYWdzPWZyb20tPmZsYWdzOworICAgIHRvLT5od25kICAgICAgICAgICAgPSAoSFdORDMyKWZyb20tPmh3bmQ7CisgICAgdG8tPmh3bmRJbnNlcnRBZnRlciA9IChIV05EMzIpZnJvbS0+aHduZEluc2VydEFmdGVyOworICAgIHRvLT54ICAgICAgICAgICAgICAgPSAoSU5UMzIpZnJvbS0+eDsKKyAgICB0by0+eSAgICAgICAgICAgICAgID0gKElOVDMyKWZyb20tPnk7CisgICAgdG8tPmN4ICAgICAgICAgICAgICA9IChJTlQzMilmcm9tLT5jeDsKKyAgICB0by0+Y3kgICAgICAgICAgICAgID0gKElOVDMyKWZyb20tPmN5OworICAgIHRvLT5mbGFncyAgICAgICAgICAgPSAoVUlOVDMyKWZyb20tPmZsYWdzOwogfQogCi12b2lkIFNUUlVDVDMyX05DQ0FMQ1NJWkUzMnRvMTZGbGF0KGNvbnN0IE5DQ0FMQ1NJWkVfUEFSQU1TMzIqIGZyb20sCi0JTkNDQUxDU0laRV9QQVJBTVMqIHRvKQordm9pZCBTVFJVQ1QzMl9OQ0NBTENTSVpFMzJ0bzE2RmxhdCggY29uc3QgTkNDQUxDU0laRV9QQVJBTVMzMiogZnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5DQ0FMQ1NJWkVfUEFSQU1TMTYqIHRvLCBpbnQgdmFsaWRSZWN0cyApCiB7Ci0JU1RSVUNUMzJfUkVDVDMydG8xNihmcm9tLT5yZ3JjLHRvLT5yZ3JjKTsKLQlTVFJVQ1QzMl9SRUNUMzJ0bzE2KGZyb20tPnJncmMrMSx0by0+cmdyYysxKTsKLQlTVFJVQ1QzMl9SRUNUMzJ0bzE2KGZyb20tPnJncmMrMix0by0+cmdyYysyKTsKKyAgICBDT05WX1JFQ1QzMlRPMTYoICZmcm9tLT5yZ3JjWzBdLCAmdG8tPnJncmNbMF0gKTsKKyAgICBpZiAodmFsaWRSZWN0cykKKyAgICB7CisgICAgICAgIENPTlZfUkVDVDMyVE8xNiggJmZyb20tPnJncmNbMV0sICZ0by0+cmdyY1sxXSApOworICAgICAgICBDT05WX1JFQ1QzMlRPMTYoICZmcm9tLT5yZ3JjWzJdLCAmdG8tPnJncmNbMl0gKTsKKyAgICB9CiB9CiAKLXZvaWQgU1RSVUNUMzJfTkNDQUxDU0laRTE2dG8zMkZsYXQoY29uc3QgTkNDQUxDU0laRV9QQVJBTVMqIGZyb20sCi0JTkNDQUxDU0laRV9QQVJBTVMzMiogdG8pCit2b2lkIFNUUlVDVDMyX05DQ0FMQ1NJWkUxNnRvMzJGbGF0KCBjb25zdCBOQ0NBTENTSVpFX1BBUkFNUzE2KiBmcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkNDQUxDU0laRV9QQVJBTVMzMiogdG8sIGludCB2YWxpZFJlY3RzICkKIHsKLQlTVFJVQ1QzMl9SRUNUMTZ0bzMyKGZyb20tPnJncmMsdG8tPnJncmMpOwotCVNUUlVDVDMyX1JFQ1QxNnRvMzIoZnJvbS0+cmdyYysxLHRvLT5yZ3JjKzEpOwotCVNUUlVDVDMyX1JFQ1QxNnRvMzIoZnJvbS0+cmdyYysyLHRvLT5yZ3JjKzIpOworICAgIENPTlZfUkVDVDE2VE8zMiggJmZyb20tPnJncmNbMF0sICZ0by0+cmdyY1swXSApOworICAgIGlmICh2YWxpZFJlY3RzKQorICAgIHsKKyAgICAgICAgQ09OVl9SRUNUMzJUTzE2KCAmZnJvbS0+cmdyY1sxXSwgJnRvLT5yZ3JjWzFdICk7CisgICAgICAgIENPTlZfUkVDVDMyVE8xNiggJmZyb20tPnJncmNbMl0sICZ0by0+cmdyY1syXSApOworICAgIH0KIH0KIAogLyogVGhlIHN0cmluZ3MgYXJlIG5vdCBjb3BpZWQgKi8KLXZvaWQgU1RSVUNUMzJfQ1JFQVRFU1RSVUNUMzJ0bzE2KGNvbnN0IENSRUFURVNUUlVDVDMyKiBmcm9tLENSRUFURVNUUlVDVCogdG8pCit2b2lkIFNUUlVDVDMyX0NSRUFURVNUUlVDVDMyQXRvMTYoIGNvbnN0IENSRUFURVNUUlVDVDMyQSogZnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JFQVRFU1RSVUNUMTYqIHRvICkKIHsKLQl0by0+bHBDcmVhdGVQYXJhbXMgPSAoTFBWT0lEKWZyb20tPmxwQ3JlYXRlUGFyYW1zOwotCXRvLT5oSW5zdGFuY2UgPSBmcm9tLT5oSW5zdGFuY2U7Ci0JdG8tPmhNZW51ID0gZnJvbS0+aE1lbnU7Ci0JdG8tPmh3bmRQYXJlbnQgPSBmcm9tLT5od25kUGFyZW50OwotCXRvLT5jeSA9IGZyb20tPmN5OwotCXRvLT5jeCA9IGZyb20tPmN4OwotCXRvLT55ID0gZnJvbS0+eTsKLQl0by0+c3R5bGUgPSBmcm9tLT5zdHlsZTsKLQl0by0+ZHdFeFN0eWxlID0gZnJvbS0+ZHdFeFN0eWxlOworICAgIHRvLT5scENyZWF0ZVBhcmFtcyA9IGZyb20tPmxwQ3JlYXRlUGFyYW1zOworICAgIHRvLT5oSW5zdGFuY2UgICAgICA9IChISU5TVEFOQ0UxNilmcm9tLT5oSW5zdGFuY2U7CisgICAgdG8tPmhNZW51ICAgICAgICAgID0gKEhNRU5VMTYpZnJvbS0+aE1lbnU7CisgICAgdG8tPmh3bmRQYXJlbnQgICAgID0gKEhXTkQxNilmcm9tLT5od25kUGFyZW50OworICAgIHRvLT5jeSAgICAgICAgICAgICA9IChJTlQxNilmcm9tLT5jeTsKKyAgICB0by0+Y3ggICAgICAgICAgICAgPSAoSU5UMTYpZnJvbS0+Y3g7CisgICAgdG8tPnkgICAgICAgICAgICAgID0gKElOVDE2KWZyb20tPnk7CisgICAgdG8tPnggICAgICAgICAgICAgID0gKElOVDE2KWZyb20tPng7CisgICAgdG8tPnN0eWxlICAgICAgICAgID0gZnJvbS0+c3R5bGU7CisgICAgdG8tPmR3RXhTdHlsZSAgICAgID0gZnJvbS0+ZHdFeFN0eWxlOwogfQogCi12b2lkIFNUUlVDVDMyX0NSRUFURVNUUlVDVDE2dG8zMihjb25zdCBDUkVBVEVTVFJVQ1QqIGZyb20sQ1JFQVRFU1RSVUNUMzIgKnRvKQordm9pZCBTVFJVQ1QzMl9DUkVBVEVTVFJVQ1QxNnRvMzJBKCBjb25zdCBDUkVBVEVTVFJVQ1QxNiogZnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JFQVRFU1RSVUNUMzJBICp0byApCiB7Ci0JdG8tPmxwQ3JlYXRlUGFyYW1zID0gKERXT1JEKWZyb20tPmxwQ3JlYXRlUGFyYW1zOwotCXRvLT5oSW5zdGFuY2UgPSBmcm9tLT5oSW5zdGFuY2U7Ci0JdG8tPmhNZW51ID0gZnJvbS0+aE1lbnU7Ci0JdG8tPmh3bmRQYXJlbnQgPSBmcm9tLT5od25kUGFyZW50OwotCXRvLT5jeSA9IGZyb20tPmN5OwotCXRvLT5jeCA9IGZyb20tPmN4OwotCXRvLT55ID0gZnJvbS0+eTsKLQl0by0+c3R5bGUgPSBmcm9tLT5zdHlsZTsKLQl0by0+ZHdFeFN0eWxlID0gZnJvbS0+ZHdFeFN0eWxlOworICAgIHRvLT5scENyZWF0ZVBhcmFtcyA9IGZyb20tPmxwQ3JlYXRlUGFyYW1zOworICAgIHRvLT5oSW5zdGFuY2UgICAgICA9IChISU5TVEFOQ0UzMilmcm9tLT5oSW5zdGFuY2U7CisgICAgdG8tPmhNZW51ICAgICAgICAgID0gKEhNRU5VMzIpZnJvbS0+aE1lbnU7CisgICAgdG8tPmh3bmRQYXJlbnQgICAgID0gKEhXTkQzMilmcm9tLT5od25kUGFyZW50OworICAgIHRvLT5jeSAgICAgICAgICAgICA9IChJTlQzMilmcm9tLT5jeTsKKyAgICB0by0+Y3ggICAgICAgICAgICAgPSAoSU5UMzIpZnJvbS0+Y3g7CisgICAgdG8tPnkgICAgICAgICAgICAgID0gKElOVDMyKWZyb20tPnk7CisgICAgdG8tPnggICAgICAgICAgICAgID0gKElOVDMyKWZyb20tPng7CisgICAgdG8tPnN0eWxlICAgICAgICAgID0gZnJvbS0+c3R5bGU7CisgICAgdG8tPmR3RXhTdHlsZSAgICAgID0gZnJvbS0+ZHdFeFN0eWxlOwogfQpkaWZmIC0tZ2l0IGEvd2luMzIvdXNlcjMyLmMgYi93aW4zMi91c2VyMzIuYwppbmRleCAxYTZmYTkyLi4wMTY4MDQwIDEwMDY0NAotLS0gYS93aW4zMi91c2VyMzIuYworKysgYi93aW4zMi91c2VyMzIuYwpAQCAtMTIsNyArMTIsNiBAQAogI2luY2x1ZGUgPHN0ZGFyZy5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJ3aW5lcnJvci5oIgotI2luY2x1ZGUgInJlbGF5MzIuaCIKICNpbmNsdWRlICJhbGlhcy5oIgogI2luY2x1ZGUgInN0YWNrZnJhbWUuaCIKICNpbmNsdWRlICJ4bWFsbG9jLmgiCkBAIC0zOCw0MyArMzcsNiBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgIEJlZ2luUGFpbnQgICAgICAgICAgIChVU0VSMzIuOSkKLSAqLwotSERDIFVTRVIzMl9CZWdpblBhaW50KERXT1JEIGh3bmQsUEFJTlRTVFJVQ1QzMiAqbHBwcykKLXsKLQlQQUlOVFNUUlVDVCBwczsKLQlIREMgcmV0OwotCXJldD1CZWdpblBhaW50KChIV05EKWh3bmQsJnBzKTsKLQlscHBzLT5oZGM9KERXT1JEKXBzLmhkYzsKLQlscHBzLT5mRXJhc2U9cHMuZkVyYXNlOwotCWxwcHMtPnJjUGFpbnQudG9wPXBzLnJjUGFpbnQudG9wOwotCWxwcHMtPnJjUGFpbnQubGVmdD1wcy5yY1BhaW50LmxlZnQ7Ci0JbHBwcy0+cmNQYWludC5yaWdodD1wcy5yY1BhaW50LnJpZ2h0OwotCWxwcHMtPnJjUGFpbnQuYm90dG9tPXBzLnJjUGFpbnQuYm90dG9tOwotCWxwcHMtPmZSZXN0b3JlPXBzLmZSZXN0b3JlOwotCWxwcHMtPmZJbmNVcGRhdGU9cHMuZkluY1VwZGF0ZTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgIEVuZFBhaW50ICAgICAgICAgICAgIChVU0VSMzIuMTc1KQotICovCi1CT09MIFVTRVIzMl9FbmRQYWludChEV09SRCBod25kLFBBSU5UU1RSVUNUMzIgKmxwcHMpCi17Ci0JUEFJTlRTVFJVQ1QgcHM7Ci0JcHMuaGRjPShIREMpbHBwcy0+aGRjOwotCXBzLmZFcmFzZT1scHBzLT5mRXJhc2U7Ci0JcHMucmNQYWludC50b3A9bHBwcy0+cmNQYWludC50b3A7Ci0JcHMucmNQYWludC5sZWZ0PWxwcHMtPnJjUGFpbnQubGVmdDsKLQlwcy5yY1BhaW50LnJpZ2h0PWxwcHMtPnJjUGFpbnQucmlnaHQ7Ci0JcHMucmNQYWludC5ib3R0b209bHBwcy0+cmNQYWludC5ib3R0b207Ci0JcHMuZlJlc3RvcmU9bHBwcy0+ZlJlc3RvcmU7Ci0JcHMuZkluY1VwZGF0ZT1scHBzLT5mSW5jVXBkYXRlOwotCUVuZFBhaW50KChIV05EKWh3bmQsJnBzKTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgIERpc3BhdGNoTWVzc2FnZUEgICAgICAgKFVTRVIzMi4xNDApCiAgKi8KIExPTkcgVVNFUjMyX0Rpc3BhdGNoTWVzc2FnZUEoTVNHMzIqIGxwbXNnKQpAQCAtOTcsNiArNTksNyBAQAogCXJldHVybiBUcmFuc2xhdGVNZXNzYWdlKCZtc2cpOwogfQogCisjaWYgMAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgIENyZWF0ZVdpbmRvd0V4MzJBICAgICAgICAoVVNFUjMyLjgyKQogICovCkBAIC0xNDQsNiArMTA3LDcgQEAKICAgICByZXR1cm4gcmV0dmFsOwogfQogCisjZW5kaWYKIEhXTkQzMiBDcmVhdGVXaW5kb3dFeDMyVyggRFdPUkQgZmxhZ3MsIExQQ1dTVFIgY2xhc3MsIExQQ1dTVFIgdGl0bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIHN0eWxlLCBJTlQzMiB4LCBJTlQzMiB5LCBJTlQzMiB3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMzIgaGVpZ2h0LCBIV05EMzIgcGFyZW50LCBITUVOVTMyIG1lbnUsCkBAIC0xNjMsNDUgKzEyNyw2IEBACiAJcmV0dXJuIGh3bmQ7CiB9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICBJbnZhbGlkYXRlUmVjdCAgICAgICAgICAgKFVTRVIzMi4zMjcpCi0gKi8KLUJPT0wgVVNFUjMyX0ludmFsaWRhdGVSZWN0KEhXTkQgaFduZCxjb25zdCBSRUNUMzIgKmxwUmVjdCxCT09MIGJFcmFzZSkKLXsKLQlSRUNUIHI7Ci0KLQlpZiAobHBSZWN0ID09IE5VTEwpCi0JCUludmFsaWRhdGVSZWN0KGhXbmQsIChSRUNUICopTlVMTCwgYkVyYXNlKTsKLQllbHNlIHsKLQkJU1RSVUNUMzJfUkVDVDMydG8xNihscFJlY3QsJnIpOwotCQlJbnZhbGlkYXRlUmVjdChoV25kLCZyLGJFcmFzZSk7Ci0JfQotCS8qIEZJWE1FOiBSZXR1cm4gbWVhbmluZ2Z1bCB2YWx1ZSAqLwotCXJldHVybiBUUlVFOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgIERyYXdUZXh0QSAgICAgICAgICAgICAgICAoVVNFUjMyLjE2MykKLSAqLwotaW50IFVTRVIzMl9EcmF3VGV4dEEoSERDIGhkYyxMUENTVFIgbHBTdHIsaW50IGNvdW50LFJFQ1QzMiogcjMyLFVJTlQgdUZvcm1hdCkKLXsKLQlSRUNUIHI7Ci0JU1RSVUNUMzJfUkVDVDMydG8xNihyMzIsJnIpOwotCXJldHVybiBEcmF3VGV4dChoZGMsbHBTdHIsY291bnQsJnIsdUZvcm1hdCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgR2V0Q2xpZW50UmVjdCAgICAgICAgICAgIChVU0VSMzIuMjE5KQotICovCi1CT09MIFVTRVIzMl9HZXRDbGllbnRSZWN0KEhXTkQgaHduZCxSRUNUMzIgKnIzMikKLXsKLQlSRUNUIHI7Ci0JR2V0Q2xpZW50UmVjdChod25kLCZyKTsKLQlTVFJVQ1QzMl9SRUNUMTZ0bzMyKCZyLHIzMik7Ci0JLyogRklYTUU6IHJldHVybiB2YWx1ZSAqLwotCXJldHVybiAwOwotfQotCiBVSU5UIFVTRVIzMl9TZXRUaW1lcihIV05EIGh3bmQsIFVJTlQgaWQsIFVJTlQgdGltZW91dCwgdm9pZCAqcHJvYykKIAogewpAQCAtMjI3LDcgKzE1Miw3IEBACiAJSE1FTlUgaE1lbnU9MDsKIAlEV09SRCBleFN0eWxlOwogCURXT1JEIHN6Q2FwdGlvbjsKLQlSRUNUIHJlY3Q7CisJUkVDVDE2IHJlY3Q7CiAJRElBTE9HSU5GTyAqZGxnSW5mbzsKIAlXTkQgKnduZFB0cjsKIAlXT1JEIHhVbml0ID0geEJhc2VVbml0OwpAQCAtMjc4LDggKzIwMyw4IEBACiAJLyogRklYTUU6IHByb3BlciBtb2RhbGZyYW1lIGhhbmRsaW5nID8/Ki8KIAlpZiAoZGxnVGVtcGwtPnN0eWxlICYgRFNfTU9EQUxGUkFNRSkgZXhTdHlsZSB8PSBXU19FWF9ETEdNT0RBTEZSQU1FOwogCi0gICAgICAgIEFkanVzdFdpbmRvd1JlY3RFeCggJnJlY3QsIGRsZ1RlbXBsLT5zdHlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoTWVudSA/IFRSVUUgOiBGQUxTRSAsIGV4U3R5bGUgKTsKKyAgICAgICAgQWRqdXN0V2luZG93UmVjdEV4MTYoICZyZWN0LCBkbGdUZW1wbC0+c3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoTWVudSA/IFRSVUUgOiBGQUxTRSAsIGV4U3R5bGUgKTsKIAlyZWN0LnJpZ2h0IC09IHJlY3QubGVmdDsKIAlyZWN0LmJvdHRvbSAtPSByZWN0LnRvcDsKIApAQCAtMjg5LDcgKzIxNCw3IEBACiAJCXJlY3QubGVmdCArPSBkbGdUZW1wbC0+eCAqIHhVbml0IC8gNDsKIAkJcmVjdC50b3AgKz0gZGxnVGVtcGwtPnkgKiB5VW5pdCAvIDg7CiAJCWlmICghKGRsZ1RlbXBsLT5zdHlsZSAmIERTX0FCU0FMSUdOKSkKLQkJCUNsaWVudFRvU2NyZWVuKGhXbmRQYXJlbnQsIChQT0lOVCAqKSZyZWN0ICk7CisJCQlDbGllbnRUb1NjcmVlbjE2KGhXbmRQYXJlbnQsIChQT0lOVDE2ICopJnJlY3QgKTsKIAl9CiAKIAkvKiBGSVhNRTogSGVyZSBpcyB0aGUgcGxhY2UgdG8gY29uc2lkZXIgQSAqLwpAQCAtMzE5LDEwICsyNDQsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBkbGdUZW1wbC0+bm9PZkl0ZW1zOyBpKyspCiAJewogCQlpZigoaW50KXB0ciYzKQotCQl7Ci0JCQlmcHJpbnRmKHN0ZGRlYiwiRFdPUkQgYWxpZ25pbmdcbiIpOwogCQkJcHRyKys7Ci0JCX0KIAkJZGxnaXRlbSA9IChETEdJVEVNVEVNUExBVEUzMiopcHRyOwogCQlwdHIgPSAoV09SRCopKGRsZ2l0ZW0rMSk7CiAJCWlmKCpwdHIgPT0gMHhGRkZGKSB7CkBAIC0zODAsNyArMzAyLDcgQEAKIAkJCS8qIElmIHRoZXJlJ3MgYWxyZWFkeSBhIGRlZmF1bHQgcHVzaC1idXR0b24sIHNldCBpdCBiYWNrICovCiAJCQkvKiB0byBub3JtYWwgYW5kIHVzZSB0aGlzIG9uZSBpbnN0ZWFkLiAqLwogCQkJaWYgKGh3bmREZWZCdXR0b24pCi0JCQkJU2VuZE1lc3NhZ2UoIGh3bmREZWZCdXR0b24sIEJNX1NFVFNUWUxFLCBCU19QVVNIQlVUVE9OLCBGQUxTRSk7CisJCQkJU2VuZE1lc3NhZ2UoIGh3bmREZWZCdXR0b24sIEJNX1NFVFNUWUxFMzIsIEJTX1BVU0hCVVRUT04sIEZBTFNFKTsKIAkJCWh3bmREZWZCdXR0b24gPSBod25kQ3RybDsKIAkJCWRsZ0luZm8tPm1zZ1Jlc3VsdCA9IEdldFdpbmRvd1dvcmQoIGh3bmRDdHJsLCBHV1dfSUQgKTsKIAkJfQpkaWZmIC0tZ2l0IGEvd2luMzIvd2lucHJvY3MuYyBiL3dpbjMyL3dpbnByb2NzLmMKaW5kZXggOTYzNDUxYy4uNGQ2MTA1ZiAxMDA2NDQKLS0tIGEvd2luMzIvd2lucHJvY3MuYworKysgYi93aW4zMi93aW5wcm9jcy5jCkBAIC00MCwxNCArNDAsMTQgQEAKIEJPT0wgV0lOMzJfQ2FsbFdpbmRvd1Byb2NUbzE2KExSRVNVTFQoKmZ1bmMpKEhXTkQsVUlOVCxXUEFSQU0sTFBBUkFNKSwKIAlIV05EIGh3bmQsVUlOVCBtc2csV1BBUkFNIHdQYXJhbSxMUEFSQU0gbFBhcmFtKQogewotCVdJTkRPV1BPUyB3cDsKKwlXSU5ET1dQT1MxNiB3cDsKIAl1bmlvbnsKLQkJTUlOTUFYSU5GTyBtbWk7Ci0JCU5DQ0FMQ1NJWkVfUEFSQU1TIG5jY3M7Ci0JCUNSRUFURVNUUlVDVCBjczsKKwkJTUlOTUFYSU5GTzE2IG1taTsKKwkJTkNDQUxDU0laRV9QQVJBTVMxNiBuY2NzOworCQlDUkVBVEVTVFJVQ1QxNiBjczsKIAl9IHN0OwogCVdJTkRPV1BPUzMyICpwd3A7Ci0JQ1JFQVRFU1RSVUNUMzIgKnBjczsKKwlDUkVBVEVTVFJVQ1QzMkEgKnBjczsKIAlMT05HIHJlc3VsdDsKIAlpZighbFBhcmFtIHx8ICFVc2VzTFBhcmFtUHRyKG1zZykpCiAJCXJldHVybiBmdW5jKGh3bmQsbXNnLHdQYXJhbSxsUGFyYW0pOwpAQCAtNjYsMjYgKzY2LDI2IEBACiAJCQlyZXR1cm4gcmVzdWx0OwogCQkgY2FzZSBXTV9OQ0NBTENTSVpFOgogCQkgCXB3cD0oKE5DQ0FMQ1NJWkVfUEFSQU1TMzIqKWxQYXJhbSktPmxwcG9zOwotCQkgCVNUUlVDVDMyX05DQ0FMQ1NJWkUzMnRvMTZGbGF0KCh2b2lkKilsUGFyYW0sJnN0Lm5jY3MpOwotCQkJaWYocHdwKSB7CisJCSAJU1RSVUNUMzJfTkNDQUxDU0laRTMydG8xNkZsYXQoKHZvaWQqKWxQYXJhbSwmc3QubmNjcyx3UGFyYW0pOworCQkJaWYgKHdQYXJhbSAmJiBwd3ApIHsKIAkJCQlTVFJVQ1QzMl9XSU5ET1dQT1MzMnRvMTYocHdwLCZ3cCk7CiAJCQkJc3QubmNjcy5scHBvcyA9ICZ3cDsKIAkJCX1lbHNlCiAJCQkJc3QubmNjcy5scHBvcyA9IDA7CiAJCQlyZXN1bHQ9ZnVuYyhod25kLG1zZyx3UGFyYW0sTUFLRV9TRUdQVFIoJnN0Lm5jY3MpKTsKLQkJCVNUUlVDVDMyX05DQ0FMQ1NJWkUxNnRvMzJGbGF0KCZzdC5uY2NzLCh2b2lkKilsUGFyYW0pOwotCQkJaWYocHdwKQorCQkJU1RSVUNUMzJfTkNDQUxDU0laRTE2dG8zMkZsYXQoJnN0Lm5jY3MsKHZvaWQqKWxQYXJhbSx3UGFyYW0pOworCQkJaWYgKHdQYXJhbSAmJiBwd3ApCiAJCQkJU1RSVUNUMzJfV0lORE9XUE9TMTZ0bzMyKCZ3cCxwd3ApOwogCQkJcmV0dXJuIHJlc3VsdDsKIAkJY2FzZSBXTV9OQ0NSRUFURToKLQkJCXBjcyA9IChDUkVBVEVTVFJVQ1QzMiopbFBhcmFtOwotCQkJU1RSVUNUMzJfQ1JFQVRFU1RSVUNUMzJ0bzE2KCh2b2lkKilsUGFyYW0sJnN0LmNzKTsKKwkJCXBjcyA9IChDUkVBVEVTVFJVQ1QzMkEqKWxQYXJhbTsKKwkJCVNUUlVDVDMyX0NSRUFURVNUUlVDVDMyQXRvMTYoKHZvaWQqKWxQYXJhbSwmc3QuY3MpOwogCQkJc3QuY3MubHBzek5hbWUgPSBISVdPUkQocGNzLT5scHN6TmFtZSkgPyAKIAkJCQlNQUtFX1NFR1BUUihwY3MtPmxwc3pOYW1lKSA6IHBjcy0+bHBzek5hbWU7CiAJCQlzdC5jcy5scHN6Q2xhc3MgPSBISVdPUkQocGNzLT5scHN6Q2xhc3MpID8gCiAJCQkJTUFLRV9TRUdQVFIocGNzLT5scHN6Q2xhc3MpIDogcGNzLT5scHN6Q2xhc3M7CiAJCQlyZXN1bHQ9ZnVuYyhod25kLG1zZyx3UGFyYW0sTUFLRV9TRUdQVFIoJnN0LmNzKSk7Ci0JCQlTVFJVQ1QzMl9DUkVBVEVTVFJVQ1QxNnRvMzIoJnN0LmNzLCh2b2lkKilsUGFyYW0pOworCQkJU1RSVUNUMzJfQ1JFQVRFU1RSVUNUMTZ0bzMyQSgmc3QuY3MsKHZvaWQqKWxQYXJhbSk7CiAJCQlwY3MtPmxwc3pOYW1lID0gSElXT1JEKHBjcy0+bHBzek5hbWUpID8gCiAJCQkJUFRSX1NFR19UT19MSU4oc3QuY3MubHBzek5hbWUpIDogcGNzLT5scHN6TmFtZTsKIAkJCXBjcy0+bHBzekNsYXNzID0gSElXT1JEKHBjcy0+IGxwc3pDbGFzcykgPyAKZGlmZiAtLWdpdCBhL3dpbmRvd3MvTWFrZWZpbGUuaW4gYi93aW5kb3dzL01ha2VmaWxlLmluCmluZGV4IDEwZDYyMDYuLjQyODRjZGYgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvTWFrZWZpbGUuaW4KKysrIGIvd2luZG93cy9NYWtlZmlsZS5pbgpAQCAtMjcsNyArMjcsOCBAQAogCXN5c21ldHJpY3MuYyBcCiAJdGltZXIuYyBcCiAJd2luLmMgXAotCXdpbnBvcy5jCisJd2lucG9zLmMgXAorCXdpbnByb2MuYwogCiBhbGw6ICQoTU9EVUxFKS5vCiAKZGlmZiAtLWdpdCBhL3dpbmRvd3MvY2FyZXQuYyBiL3dpbmRvd3MvY2FyZXQuYwppbmRleCAyOTRmYWM1Li41MjZhYzliIDEwMDY0NAotLS0gYS93aW5kb3dzL2NhcmV0LmMKKysrIGIvd2luZG93cy9jYXJldC5jCkBAIC0yNzMsMTAgKzI3Myw5IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgIEdldENhcmV0UG9zICAgICAgICAgIChVU0VSLjE4MykKKyAqICAgICAgICAgICAgICAgR2V0Q2FyZXRQb3MxNiAgICAgICAgICAoVVNFUi4xODMpCiAgKi8KLQotdm9pZCBHZXRDYXJldFBvcyhMUFBPSU5UIHB0KQordm9pZCBHZXRDYXJldFBvczE2KCBMUFBPSU5UMTYgcHQgKQogewogICAgIGlmICghQ2FyZXQuaHduZCB8fCAhcHQpIHJldHVybjsKIApAQCAtMjg2LDMgKzI4NSwxNCBAQAogICAgIHB0LT54ID0gQ2FyZXQueDsKICAgICBwdC0+eSA9IENhcmV0Lnk7CiB9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgIEdldENhcmV0UG9zMzIgICAgICAgICAgKFVTRVIzMi4yMDkpCisgKi8KK3ZvaWQgR2V0Q2FyZXRQb3MzMiggTFBQT0lOVDMyIHB0ICkKK3sKKyAgICBpZiAoIUNhcmV0Lmh3bmQgfHwgIXB0KSByZXR1cm47CisgICAgcHQtPnggPSBDYXJldC54OworICAgIHB0LT55ID0gQ2FyZXQueTsKK30KZGlmZiAtLWdpdCBhL3dpbmRvd3MvY2xhc3MuYyBiL3dpbmRvd3MvY2xhc3MuYwppbmRleCBjMDVlYjM5Li40ZGI3Nzk3IDEwMDY0NAotLS0gYS93aW5kb3dzL2NsYXNzLmMKKysrIGIvd2luZG93cy9jbGFzcy5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIFdpbmRvdyBjbGFzc2VzIGZ1bmN0aW9ucwogICoKLSAqIENvcHlyaWdodCAxOTkzIEFsZXhhbmRyZSBKdWxsaWFyZAorICogQ29weXJpZ2h0IDE5OTMsIDE5OTYgQWxleGFuZHJlIEp1bGxpYXJkCiAgKi8KIAogI2luY2x1ZGUgPHN0ZGxpYi5oPgpAQCAtOSwxMSArOSwxMSBAQAogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgImNsYXNzLmgiCiAjaW5jbHVkZSAiaGVhcC5oIgotI2luY2x1ZGUgInVzZXIuaCIKICNpbmNsdWRlICJ3aW4uaCIKICNpbmNsdWRlICJkY2UuaCIKICNpbmNsdWRlICJhdG9tLmgiCiAjaW5jbHVkZSAibGR0LmgiCisjaW5jbHVkZSAic3RyaW5nMzIuaCIKICNpbmNsdWRlICJ0b29saGVscC5oIgogI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKQEAgLTM4LDcgKzM4LDcgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIEdsb2JhbEdldEF0b21OYW1lKCBwdHItPmF0b21OYW1lLCBjbGFzc05hbWUsIHNpemVvZihjbGFzc05hbWUpICk7CisgICAgR2xvYmFsR2V0QXRvbU5hbWUzMkEoIHB0ci0+YXRvbU5hbWUsIGNsYXNzTmFtZSwgc2l6ZW9mKGNsYXNzTmFtZSkgKTsKIAogICAgIGZwcmludGYoIHN0ZGVyciwgIkNsYXNzICVwOlxuIiwgcHRyICk7CiAgICAgZnByaW50Ziggc3RkZXJyLApAQCAtNzAsMjYgKzcwLDEwMyBAQAogICAgIENMQVNTICpwdHI7CiAgICAgY2hhciBjbGFzc05hbWVbODBdOwogCi0gICAgZnByaW50Ziggc3RkZXJyLCAiIENsYXNzICAgTmFtZSAgICAgICAgICAgICAgICAgU3R5bGUgICBXbmRQcm9jXG4iICk7CisgICAgZnByaW50Ziggc3RkZXJyLCAiIENsYXNzICAgTmFtZSAgICAgICAgICAgICAgICAgIFN0eWxlICAgV25kUHJvY1xuIiApOwogICAgIGZvciAocHRyID0gZmlyc3RDbGFzczsgcHRyOyBwdHIgPSBwdHItPm5leHQpCiAgICAgewotICAgICAgICBHbG9iYWxHZXRBdG9tTmFtZSggcHRyLT5hdG9tTmFtZSwgY2xhc3NOYW1lLCBzaXplb2YoY2xhc3NOYW1lKSApOwotICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICIlMDhseCAlLTIwLjIwcyAlMDh4ICUwOGx4XG4iLCAoRFdPUkQpcHRyLCBjbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgIHB0ci0+c3R5bGUsIChEV09SRClwdHItPmxwZm5XbmRQcm9jICk7CisgICAgICAgIEdsb2JhbEdldEF0b21OYW1lMzJBKCBwdHItPmF0b21OYW1lLCBjbGFzc05hbWUsIHNpemVvZihjbGFzc05hbWUpICk7CisgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIiUwOHggJS0yMC4yMHMgJTA4eCAlMDh4XG4iLCAoVUlOVDMyKXB0ciwgY2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICBwdHItPnN0eWxlLCAoVUlOVDMyKXB0ci0+bHBmblduZFByb2MgKTsKICAgICB9CiAgICAgZnByaW50Ziggc3RkZXJyLCAiXG4iICk7CiB9CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ0xBU1NfR2V0TWVudU5hbWVBCisgKgorICogR2V0IHRoZSBtZW51IG5hbWUgYXMgYSBBU0NJSSBzdHJpbmcuCisgKi8KK3N0YXRpYyBMUFNUUiBDTEFTU19HZXRNZW51TmFtZUEoIENMQVNTICpjbGFzc1B0ciApCit7CisgICAgaWYgKCFjbGFzc1B0ci0+bWVudU5hbWVBICYmIGNsYXNzUHRyLT5tZW51TmFtZVcpCisgICAgeworICAgICAgICAvKiBXZSBuZWVkIHRvIGNvcHkgdGhlIFVuaWNvZGUgc3RyaW5nICovCisgICAgICAgIGlmICgoY2xhc3NQdHItPm1lbnVOYW1lQSA9IFNFR1BUUl9BTExPQygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUUklORzMyX2xzdHJsZW5XKGNsYXNzUHRyLT5tZW51TmFtZVcpICsgMSApKSkKKyAgICAgICAgICAgIFNUUklORzMyX1VuaVRvQW5zaSggY2xhc3NQdHItPm1lbnVOYW1lQSwgY2xhc3NQdHItPm1lbnVOYW1lVyApOworICAgIH0KKyAgICByZXR1cm4gY2xhc3NQdHItPm1lbnVOYW1lQTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBDTEFTU19HZXRNZW51TmFtZVcKKyAqCisgKiBHZXQgdGhlIG1lbnUgbmFtZSBhcyBhIFVuaWNvZGUgc3RyaW5nLgorICovCitzdGF0aWMgTFBXU1RSIENMQVNTX0dldE1lbnVOYW1lVyggQ0xBU1MgKmNsYXNzUHRyICkKK3sKKyAgICBpZiAoIWNsYXNzUHRyLT5tZW51TmFtZVcgJiYgY2xhc3NQdHItPm1lbnVOYW1lQSkKKyAgICB7CisgICAgICAgIGlmICghSElXT1JEKGNsYXNzUHRyLT5tZW51TmFtZUEpKQorICAgICAgICAgICAgcmV0dXJuIChMUFdTVFIpY2xhc3NQdHItPm1lbnVOYW1lQTsKKyAgICAgICAgLyogTm93IHdlIG5lZWQgdG8gY29weSB0aGUgQVNDSUkgc3RyaW5nICovCisgICAgICAgIGlmICgoY2xhc3NQdHItPm1lbnVOYW1lVyA9IEhlYXBBbGxvYyggU3lzdGVtSGVhcCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJsZW4oY2xhc3NQdHItPm1lbnVOYW1lQSkrMSkqc2l6ZW9mKFdDSEFSKSApKSkKKyAgICAgICAgICAgIFNUUklORzMyX0Fuc2lUb1VuaSggY2xhc3NQdHItPm1lbnVOYW1lVywgY2xhc3NQdHItPm1lbnVOYW1lQSApOworICAgIH0KKyAgICByZXR1cm4gY2xhc3NQdHItPm1lbnVOYW1lVzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBDTEFTU19TZXRNZW51TmFtZUEKKyAqCisgKiBTZXQgdGhlIG1lbnUgbmFtZSBpbiBhIGNsYXNzIHN0cnVjdHVyZSBieSBjb3B5aW5nIHRoZSBzdHJpbmcuCisgKi8KK3N0YXRpYyB2b2lkIENMQVNTX1NldE1lbnVOYW1lQSggQ0xBU1MgKmNsYXNzUHRyLCBMUENTVFIgbmFtZSApCit7CisgICAgaWYgKEhJV09SRChjbGFzc1B0ci0+bWVudU5hbWVBKSkgU0VHUFRSX0ZSRUUoIGNsYXNzUHRyLT5tZW51TmFtZUEgKTsKKyAgICBpZiAoY2xhc3NQdHItPm1lbnVOYW1lVykgSGVhcEZyZWUoIFN5c3RlbUhlYXAsIDAsIGNsYXNzUHRyLT5tZW51TmFtZVcgKTsKKyAgICBjbGFzc1B0ci0+bWVudU5hbWVBID0gU0VHUFRSX1NUUkRVUCggbmFtZSApOworICAgIGNsYXNzUHRyLT5tZW51TmFtZVcgPSAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENMQVNTX1NldE1lbnVOYW1lVworICoKKyAqIFNldCB0aGUgbWVudSBuYW1lIGluIGEgY2xhc3Mgc3RydWN0dXJlIGJ5IGNvcHlpbmcgdGhlIHN0cmluZy4KKyAqLworc3RhdGljIHZvaWQgQ0xBU1NfU2V0TWVudU5hbWVXKCBDTEFTUyAqY2xhc3NQdHIsIExQQ1dTVFIgbmFtZSApCit7CisgICAgaWYgKCFISVdPUkQobmFtZSkpCisgICAgeworICAgICAgICBDTEFTU19TZXRNZW51TmFtZUEoIGNsYXNzUHRyLCAoTFBDU1RSKW5hbWUgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoSElXT1JEKGNsYXNzUHRyLT5tZW51TmFtZUEpKSBTRUdQVFJfRlJFRSggY2xhc3NQdHItPm1lbnVOYW1lQSApOworICAgIGlmIChjbGFzc1B0ci0+bWVudU5hbWVXKSBIZWFwRnJlZSggU3lzdGVtSGVhcCwgMCwgY2xhc3NQdHItPm1lbnVOYW1lVyApOworICAgIGlmICgoY2xhc3NQdHItPm1lbnVOYW1lVyA9IEhlYXBBbGxvYyggU3lzdGVtSGVhcCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTVFJJTkczMl9sc3RybGVuVyhuYW1lKSsxKSpzaXplb2YoV0NIQVIpICkpKQorICAgICAgICBTVFJJTkczMl9sc3RyY3B5VyggY2xhc3NQdHItPm1lbnVOYW1lVywgbmFtZSApOworICAgIGNsYXNzUHRyLT5tZW51TmFtZUEgPSAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIENMQVNTX0ZyZWVDbGFzcwogICoKICAqIEZyZWUgYSBjbGFzcyBzdHJ1Y3R1cmUuCiAgKi8KLXN0YXRpYyB2b2lkIENMQVNTX0ZyZWVDbGFzcyggQ0xBU1MgKmNsYXNzUHRyICkKK3N0YXRpYyBCT09MIENMQVNTX0ZyZWVDbGFzcyggQ0xBU1MgKmNsYXNzUHRyICkKIHsKICAgICBDTEFTUyAqKnBwQ2xhc3M7CiAKKyAgICAvKiBDaGVjayBpZiB3ZSBjYW4gcmVtb3ZlIHRoaXMgY2xhc3MgKi8KKworICAgIGlmIChjbGFzc1B0ci0+Y1dpbmRvd3MgPiAwKSByZXR1cm4gRkFMU0U7CisKICAgICAvKiBSZW1vdmUgdGhlIGNsYXNzIGZyb20gdGhlIGxpbmtlZCBsaXN0ICovCiAKICAgICBmb3IgKHBwQ2xhc3MgPSAmZmlyc3RDbGFzczsgKnBwQ2xhc3M7IHBwQ2xhc3MgPSAmKCpwcENsYXNzKS0+bmV4dCkKQEAgLTk3LDcgKzE3NCw3IEBACiAgICAgaWYgKCEqcHBDbGFzcykKICAgICB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IENsYXNzIGxpc3QgY29ycnVwdGVkXG4iICk7Ci0gICAgICAgIHJldHVybjsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICAqcHBDbGFzcyA9IGNsYXNzUHRyLT5uZXh0OwogCkBAIC0xMDYsOSArMTgzLDkgQEAKICAgICBpZiAoY2xhc3NQdHItPmhkY2UpIERDRV9GcmVlRENFKCBjbGFzc1B0ci0+aGRjZSApOwogICAgIGlmIChjbGFzc1B0ci0+aGJyQmFja2dyb3VuZCkgRGVsZXRlT2JqZWN0KCBjbGFzc1B0ci0+aGJyQmFja2dyb3VuZCApOwogICAgIEdsb2JhbERlbGV0ZUF0b20oIGNsYXNzUHRyLT5hdG9tTmFtZSApOwotICAgIGlmIChISVdPUkQoY2xhc3NQdHItPmxwc3pNZW51TmFtZSkpCi0JVVNFUl9IRUFQX0ZSRUUoIChIQU5ETEUpY2xhc3NQdHItPmxwc3pNZW51TmFtZSApOworICAgIENMQVNTX1NldE1lbnVOYW1lQSggY2xhc3NQdHIsIE5VTEwgKTsKICAgICBIZWFwRnJlZSggU3lzdGVtSGVhcCwgMCwgY2xhc3NQdHIgKTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAogCkBAIC0xNjcsODIgKzI0NCwxMDAgQEAKIHsKICAgICBBVE9NIGF0b207CiAKLSAgICBpZiAoIShhdG9tID0gR2xvYmFsRmluZEF0b20oIG5hbWUgKSkpIHJldHVybiAwOworICAgIGlmICghKGF0b20gPSBHbG9iYWxGaW5kQXRvbTE2KCBuYW1lICkpKSByZXR1cm4gMDsKICAgICByZXR1cm4gQ0xBU1NfRmluZENsYXNzQnlBdG9tKCBhdG9tLCBoaW5zdGFuY2UgKTsKIH0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBDTEFTU19SZWdpc3RlckNsYXNzCisgKgorICogVGhlIHJlYWwgUmVnaXN0ZXJDbGFzcygpIGZ1bmN0aW9uYWxpdHkuCisgKi8KK3N0YXRpYyBDTEFTUyAqQ0xBU1NfUmVnaXN0ZXJDbGFzcyggQVRPTSBhdG9tLCBISU5TVEFOQ0UzMiBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIHN0eWxlLCBJTlQzMiBjbGFzc0V4dHJhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQzMiB3aW5FeHRyYSApCit7CisgICAgQ0xBU1MgKmNsYXNzUHRyOworCisgICAgLyogQ2hlY2sgaWYgYSBjbGFzcyB3aXRoIHRoaXMgbmFtZSBhbHJlYWR5IGV4aXN0cyAqLworCisgICAgY2xhc3NQdHIgPSBDTEFTU19GaW5kQ2xhc3NCeUF0b20oIGF0b20sIGhJbnN0YW5jZSApOworICAgIGlmIChjbGFzc1B0cikKKyAgICB7CisgICAgICAgIC8qIENsYXNzIGNhbiBiZSBjcmVhdGVkIG9ubHkgaWYgaXQgaXMgbG9jYWwgYW5kICovCisgICAgICAgIC8qIGlmIHRoZSBjbGFzcyB3aXRoIHRoZSBzYW1lIG5hbWUgaXMgZ2xvYmFsLiAgICovCisKKwlpZiAoc3R5bGUgJiBDU19HTE9CQUxDTEFTUykgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmICghKGNsYXNzUHRyLT5zdHlsZSAmIENTX0dMT0JBTENMQVNTKSkgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLyogRml4IHRoZSBleHRyYSBieXRlcyB2YWx1ZSAqLworCisgICAgaWYgKGNsYXNzRXh0cmEgPCAwKSBjbGFzc0V4dHJhID0gMDsKKyAgICBlbHNlIGlmIChjbGFzc0V4dHJhID4gNDApICAvKiBFeHRyYSBieXRlcyBhcmUgbGltaXRlZCB0byA0MCBpbiBXaW4zMiAqLworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmc6IGNsYXNzIGV4dHJhIGJ5dGVzICVkIGlzID4gNDBcbiIsIGNsYXNzRXh0cmEpOworICAgIGlmICh3aW5FeHRyYSA8IDApIHdpbkV4dHJhID0gMDsKKyAgICBlbHNlIGlmICh3aW5FeHRyYSA+IDQwKSAgICAvKiBFeHRyYSBieXRlcyBhcmUgbGltaXRlZCB0byA0MCBpbiBXaW4zMiAqLworICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJXYXJuaW5nOiB3aW4gZXh0cmEgYnl0ZXMgJWQgaXMgPiA0MFxuIiwgd2luRXh0cmEgKTsKKworICAgIC8qIENyZWF0ZSB0aGUgY2xhc3MgKi8KKworICAgIGNsYXNzUHRyID0gKENMQVNTICopSGVhcEFsbG9jKCBTeXN0ZW1IZWFwLCAwLCBzaXplb2YoQ0xBU1MpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzRXh0cmEgLSBzaXplb2YoY2xhc3NQdHItPndFeHRyYSkgKTsKKyAgICBpZiAoIWNsYXNzUHRyKSByZXR1cm4gTlVMTDsKKyAgICBjbGFzc1B0ci0+bmV4dCAgICAgICA9IGZpcnN0Q2xhc3M7CisgICAgY2xhc3NQdHItPm1hZ2ljICAgICAgPSBDTEFTU19NQUdJQzsKKyAgICBjbGFzc1B0ci0+Y1dpbmRvd3MgICA9IDA7ICAKKyAgICBjbGFzc1B0ci0+c3R5bGUgICAgICA9IHN0eWxlOworICAgIGNsYXNzUHRyLT5jYlduZEV4dHJhID0gd2luRXh0cmE7CisgICAgY2xhc3NQdHItPmNiQ2xzRXh0cmEgPSBjbGFzc0V4dHJhOworICAgIGNsYXNzUHRyLT5oSW5zdGFuY2UgID0gaEluc3RhbmNlOworICAgIGNsYXNzUHRyLT5hdG9tTmFtZSAgID0gYXRvbTsKKyAgICBjbGFzc1B0ci0+bWVudU5hbWVBICA9IDA7CisgICAgY2xhc3NQdHItPm1lbnVOYW1lVyAgPSAwOworICAgIGNsYXNzUHRyLT5oZGNlICAgICAgID0gKHN0eWxlJkNTX0NMQVNTREMpID8gRENFX0FsbG9jRENFKERDRV9DTEFTU19EQykgOiAwOworICAgIC8qIE90aGVyIHZhbHVlcyBtdXN0IGJlIHNldCBieSBjYWxsZXIgKi8KKworICAgIGlmIChjbGFzc0V4dHJhKSBtZW1zZXQoIGNsYXNzUHRyLT53RXh0cmEsIDAsIGNsYXNzRXh0cmEgKTsKKyAgICBmaXJzdENsYXNzID0gY2xhc3NQdHI7CisgICAgcmV0dXJuIGNsYXNzUHRyOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFJlZ2lzdGVyQ2xhc3MxNiAgICAoVVNFUi41NykKICAqLwogQVRPTSBSZWdpc3RlckNsYXNzMTYoIGNvbnN0IFdORENMQVNTMTYgKndjICkKIHsKLSAgICBDTEFTUyAqIG5ld0NsYXNzLCAqIHByZXZDbGFzczsKLSAgICBIQU5ETEUxNiBoSW5zdGFuY2U7Ci0gICAgaW50IGNsYXNzRXh0cmE7CisgICAgQVRPTSBhdG9tOworICAgIENMQVNTICpjbGFzc1B0cjsKIAotICAgIGRwcmludGZfY2xhc3MoIHN0ZGRlYiwgIlJlZ2lzdGVyQ2xhc3M6IHduZHByb2M9JTA4bHggaGluc3Q9JTA0eCBuYW1lPSclcycgYmFja2dyb3VuZCAlMDR4XG4iLAotICAgICAgICAgICAgICAgICAoRFdPUkQpd2MtPmxwZm5XbmRQcm9jLCB3Yy0+aEluc3RhbmNlLAotICAgICAgICAgICAgICAgICBISVdPUkQod2MtPmxwc3pDbGFzc05hbWUpID8KLSAgICAgICAgICAgICAgICAgIChjaGFyICopUFRSX1NFR19UT19MSU4od2MtPmxwc3pDbGFzc05hbWUpIDogIihpbnQpIiwKLSAgICAgICAgICAgICAgICAgd2MtPmhickJhY2tncm91bmQgKTsKLSAgICBkcHJpbnRmX2NsYXNzKHN0ZGRlYiwiICAgICAgICAgICAgICAgc3R5bGU9JTA0eCBjbHNFeHRyYT0lZCB3aW5FeHRyYT0lZFxuIiwKLSAgICAgICAgICAgICAgICAgIHdjLT5zdHlsZSwgd2MtPmNiQ2xzRXh0cmEsIHdjLT5jYlduZEV4dHJhICk7Ci0gICAgCi0gICAgICAvKiBXaW5kb3cgY2xhc3NlcyBhcmUgb3duZWQgYnkgbW9kdWxlcywgbm90IGluc3RhbmNlcyAqLwotICAgIGhJbnN0YW5jZSA9IEdldEV4ZVB0ciggd2MtPmhJbnN0YW5jZSApOwotICAgIAotICAgICAgLyogQ2hlY2sgaWYgYSBjbGFzcyB3aXRoIHRoaXMgbmFtZSBhbHJlYWR5IGV4aXN0cyAqLwotICAgIHByZXZDbGFzcyA9IENMQVNTX0ZpbmRDbGFzc0J5TmFtZSggd2MtPmxwc3pDbGFzc05hbWUsIGhJbnN0YW5jZSApOwotICAgIGlmIChwcmV2Q2xhc3MpCisgICAgSElOU1RBTkNFMzIgaEluc3RhbmNlID0gKEhJTlNUQU5DRTMyKUdldEV4ZVB0ciggd2MtPmhJbnN0YW5jZSApOworCisgICAgaWYgKCEoYXRvbSA9IEdsb2JhbEFkZEF0b20xNiggd2MtPmxwc3pDbGFzc05hbWUgKSkpIHJldHVybiAwOworICAgIGlmICghKGNsYXNzUHRyID0gQ0xBU1NfUmVnaXN0ZXJDbGFzcyggYXRvbSwgaEluc3RhbmNlLCB3Yy0+c3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Yy0+Y2JDbHNFeHRyYSwgd2MtPmNiV25kRXh0cmEgKSkpCiAgICAgewotCSAgLyogQ2xhc3MgY2FuIGJlIGNyZWF0ZWQgb25seSBpZiBpdCBpcyBsb2NhbCBhbmQgKi8KLQkgIC8qIGlmIHRoZSBjbGFzcyB3aXRoIHRoZSBzYW1lIG5hbWUgaXMgZ2xvYmFsLiAgICovCi0KLQlpZiAod2MtPnN0eWxlICYgQ1NfR0xPQkFMQ0xBU1MpIHJldHVybiAwOwotCWlmICghKHByZXZDbGFzcy0+c3R5bGUgJiBDU19HTE9CQUxDTEFTUykpIHJldHVybiAwOworICAgICAgICBHbG9iYWxEZWxldGVBdG9tKCBhdG9tICk7CisgICAgICAgIHJldHVybiAwOwogICAgIH0KIAotICAgICAgLyogQ3JlYXRlIGNsYXNzICovCisgICAgZHByaW50Zl9jbGFzcyggc3RkZGViLCAiUmVnaXN0ZXJDbGFzczE2OiBhdG9tPSUwNHggd25kcHJvYz0lMDhseCBoaW5zdD0lMDR4IGJnPSUwNHggc3R5bGU9JTA4eCBjbHNFeHQ9JWQgd2luRXh0PSVkIGNsYXNzPSVwXG4iLAorICAgICAgICAgICAgICAgICAgIGF0b20sIChEV09SRCl3Yy0+bHBmblduZFByb2MsIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICB3Yy0+aGJyQmFja2dyb3VuZCwgd2MtPnN0eWxlLCB3Yy0+Y2JDbHNFeHRyYSwKKyAgICAgICAgICAgICAgICAgICB3Yy0+Y2JXbmRFeHRyYSwgY2xhc3NQdHIgKTsKIAotICAgIGNsYXNzRXh0cmEgPSAod2MtPmNiQ2xzRXh0cmEgPCAwKSA/IDAgOiB3Yy0+Y2JDbHNFeHRyYTsKLSAgICBuZXdDbGFzcyA9IChDTEFTUyAqKUhlYXBBbGxvYyggU3lzdGVtSGVhcCwgMCwgc2l6ZW9mKENMQVNTKSArIGNsYXNzRXh0cmEgKTsKLSAgICBpZiAoIW5ld0NsYXNzKSByZXR1cm4gMDsKLSAgICBuZXdDbGFzcy0+bmV4dCAgICAgICAgICA9IGZpcnN0Q2xhc3M7Ci0gICAgbmV3Q2xhc3MtPm1hZ2ljICAgICAgICAgPSBDTEFTU19NQUdJQzsKLSAgICBuZXdDbGFzcy0+Y1dpbmRvd3MgICAgICA9IDA7ICAKLSAgICBuZXdDbGFzcy0+c3R5bGUgICAgICAgICA9IHdjLT5zdHlsZTsKLSAgICBuZXdDbGFzcy0+bHBmblduZFByb2MgICA9IHdjLT5scGZuV25kUHJvYzsKLSAgICBuZXdDbGFzcy0+Y2JXbmRFeHRyYSAgICA9ICh3Yy0+Y2JXbmRFeHRyYSA8IDApID8gMCA6IHdjLT5jYlduZEV4dHJhOwotICAgIG5ld0NsYXNzLT5jYkNsc0V4dHJhICAgID0gY2xhc3NFeHRyYTsKLSAgICBuZXdDbGFzcy0+bHBzek1lbnVOYW1lICA9IHdjLT5scHN6TWVudU5hbWU7Ci0gICAgbmV3Q2xhc3MtPmhJbnN0YW5jZSAgICAgPSBoSW5zdGFuY2U7Ci0gICAgbmV3Q2xhc3MtPmhJY29uICAgICAgICAgPSB3Yy0+aEljb247Ci0gICAgbmV3Q2xhc3MtPmhDdXJzb3IgICAgICAgPSB3Yy0+aEN1cnNvcjsKLSAgICBuZXdDbGFzcy0+aGJyQmFja2dyb3VuZCA9IHdjLT5oYnJCYWNrZ3JvdW5kOworICAgIGNsYXNzUHRyLT5mbGFncyAgICAgICAgID0gMDsKKyAgICBjbGFzc1B0ci0+bHBmblduZFByb2MgICA9IHdjLT5scGZuV25kUHJvYzsKKyAgICBjbGFzc1B0ci0+aEljb24gICAgICAgICA9IHdjLT5oSWNvbjsKKyAgICBjbGFzc1B0ci0+aEljb25TbSAgICAgICA9IDA7CisgICAgY2xhc3NQdHItPmhDdXJzb3IgICAgICAgPSB3Yy0+aEN1cnNvcjsKKyAgICBjbGFzc1B0ci0+aGJyQmFja2dyb3VuZCA9IHdjLT5oYnJCYWNrZ3JvdW5kOwogCi0gICAgbmV3Q2xhc3MtPmF0b21OYW1lID0gR2xvYmFsQWRkQXRvbSggd2MtPmxwc3pDbGFzc05hbWUgKTsKLQotICAgIGlmIChuZXdDbGFzcy0+c3R5bGUgJiBDU19DTEFTU0RDKQotCW5ld0NsYXNzLT5oZGNlID0gRENFX0FsbG9jRENFKCBEQ0VfQ0xBU1NfREMgKTsKLSAgICBlbHNlIG5ld0NsYXNzLT5oZGNlID0gMDsKLQotICAgICAgLyogTWFrZSBhIGNvcHkgb2YgdGhlIG1lbnUgbmFtZSAob25seSBpZiBpdCBpcyBhIHN0cmluZykgKi8KLQotICAgIGlmIChISVdPUkQod2MtPmxwc3pNZW51TmFtZSkpCi0gICAgewotICAgICAgICBjaGFyICptZW51bmFtZSA9IFBUUl9TRUdfVE9fTElOKCB3Yy0+bHBzek1lbnVOYW1lICk7Ci0JSEFORExFIGhuYW1lID0gVVNFUl9IRUFQX0FMTE9DKCBzdHJsZW4obWVudW5hbWUpKzEgKTsKLQlpZiAoaG5hbWUpCi0JewotCSAgICBuZXdDbGFzcy0+bHBzek1lbnVOYW1lID0gKFNFR1BUUilVU0VSX0hFQVBfU0VHX0FERFIoIGhuYW1lICk7Ci0JICAgIHN0cmNweSggVVNFUl9IRUFQX0xJTl9BRERSKCBobmFtZSApLCBtZW51bmFtZSApOwotCX0KLSAgICB9Ci0KLSAgICBpZiAoY2xhc3NFeHRyYSkgbWVtc2V0KCBuZXdDbGFzcy0+d0V4dHJhLCAwLCBjbGFzc0V4dHJhICk7Ci0gICAgZmlyc3RDbGFzcyA9IG5ld0NsYXNzOwotICAgIHJldHVybiBuZXdDbGFzcy0+YXRvbU5hbWU7CisgICAgQ0xBU1NfU2V0TWVudU5hbWVBKCBjbGFzc1B0ciwgSElXT1JEKHdjLT5scHN6TWVudU5hbWUpID8KKyAgICAgICAgICAgICAgICAgUFRSX1NFR19UT19MSU4od2MtPmxwc3pNZW51TmFtZSkgOiAoTFBDU1RSKXdjLT5scHN6TWVudU5hbWUgKTsKKyAgICByZXR1cm4gYXRvbTsKIH0KIAogCkBAIC0yNTEsODkgKzM0NiwyNTQgQEAKICAqLwogQVRPTSBSZWdpc3RlckNsYXNzMzJBKCBjb25zdCBXTkRDTEFTUzMyQSogd2MgKQogewotICAgIFdORENMQVNTMTYgY29weTsKLSAgICBIQU5ETEUgY2xhc3NoID0gMCwgbWVudWggPSAwOwotICAgIFNFR1BUUiBjbGFzc3NlZ3AsIG1lbnVzZWdwOwotICAgIGNoYXIgKmNsYXNzYnVmLCAqbWVudWJ1ZjsKKyAgICBBVE9NIGF0b207CisgICAgQ0xBU1MgKmNsYXNzUHRyOwogCi0gICAgQVRPTSByZXR2YWw7Ci0gICAgY29weS5zdHlsZT13Yy0+c3R5bGU7Ci0gICAgQUxJQVNfUmVnaXN0ZXJBbGlhcygwLDAsKERXT1JEKXdjLT5scGZuV25kUHJvYyk7Ci0gICAgY29weS5scGZuV25kUHJvYz13Yy0+bHBmblduZFByb2M7Ci0gICAgY29weS5jYkNsc0V4dHJhPXdjLT5jYkNsc0V4dHJhOwotICAgIGNvcHkuY2JXbmRFeHRyYT13Yy0+Y2JXbmRFeHRyYTsKLSAgICBjb3B5LmhJbnN0YW5jZT0oSElOU1RBTkNFKXdjLT5oSW5zdGFuY2U7Ci0gICAgY29weS5oSWNvbj0oSElDT04pd2MtPmhJY29uOwotICAgIGNvcHkuaEN1cnNvcj0oSENVUlNPUil3Yy0+aEN1cnNvcjsKLSAgICBjb3B5LmhickJhY2tncm91bmQ9KEhCUlVTSCl3Yy0+aGJyQmFja2dyb3VuZDsKLSAgICAKLSAgICAvKiBGSVhNRTogVGhlcmUgaGFzIHRvIGJlIGEgYmV0dGVyIHdheSBvZiBkb2luZyB0aGlzIC0gYnV0IG5laXRoZXIKLSAgICAgICBtYWxsb2Mgbm9yIGFsbG9jYSB3aWxsIHdvcmsgKi8KKyAgICAvKiBGSVhNRTogdGhpcyBzaG91bGQgbm90IGJlIG5lY2Vzc2FyeSBmb3IgV2luMzIgKi8KKyAgICBISU5TVEFOQ0UzMiBoSW5zdGFuY2UgPSAoSElOU1RBTkNFMzIpR2V0RXhlUHRyKCB3Yy0+aEluc3RhbmNlICk7CiAKLSAgICBpZih3Yy0+bHBzek1lbnVOYW1lKQorICAgIGlmICghKGF0b20gPSBHbG9iYWxBZGRBdG9tMzJBKCB3Yy0+bHBzekNsYXNzTmFtZSApKSkgcmV0dXJuIDA7CisgICAgaWYgKCEoY2xhc3NQdHIgPSBDTEFTU19SZWdpc3RlckNsYXNzKCBhdG9tLCBoSW5zdGFuY2UsIHdjLT5zdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdjLT5jYkNsc0V4dHJhLCB3Yy0+Y2JXbmRFeHRyYSApKSkKICAgICB7Ci0gICAgICAgIG1lbnVoID0gR2xvYmFsQWxsb2MxNigwLCBzdHJsZW4od2MtPmxwc3pNZW51TmFtZSkrMSk7Ci0gICAgICAgIG1lbnVzZWdwID0gV0lOMTZfR2xvYmFsTG9jazE2KG1lbnVoKTsKLSAgICAgICAgbWVudWJ1ZiA9IFBUUl9TRUdfVE9fTElOKG1lbnVzZWdwKTsKLSAgICAgICAgc3RyY3B5KCBtZW51YnVmLCB3Yy0+bHBzek1lbnVOYW1lKTsKLSAgICAgICAgY29weS5scHN6TWVudU5hbWU9bWVudXNlZ3A7Ci0gICAgfWVsc2UKLSAgICAgICAgY29weS5scHN6TWVudU5hbWU9MDsKLSAgICBpZih3Yy0+bHBzekNsYXNzTmFtZSkKLSAgICB7Ci0gICAgICAgIGNsYXNzaCA9IEdsb2JhbEFsbG9jMTYoMCwgc3RybGVuKHdjLT5scHN6Q2xhc3NOYW1lKSsxKTsKLSAgICAgICAgY2xhc3NzZWdwID0gV0lOMTZfR2xvYmFsTG9jazE2KGNsYXNzaCk7Ci0gICAgICAgIGNsYXNzYnVmID0gUFRSX1NFR19UT19MSU4oY2xhc3NzZWdwKTsKLSAgICAgICAgc3RyY3B5KCBjbGFzc2J1Ziwgd2MtPmxwc3pDbGFzc05hbWUpOwotICAgICAgICBjb3B5Lmxwc3pDbGFzc05hbWU9Y2xhc3NzZWdwOworICAgICAgICBHbG9iYWxEZWxldGVBdG9tKCBhdG9tICk7CisgICAgICAgIHJldHVybiAwOwogICAgIH0KLSAgICByZXR2YWwgPSBSZWdpc3RlckNsYXNzMTYoJmNvcHkpOwotICAgIEdsb2JhbEZyZWUxNihtZW51aCk7Ci0gICAgR2xvYmFsRnJlZTE2KGNsYXNzaCk7Ci0gICAgcmV0dXJuIHJldHZhbDsKKworICAgIGRwcmludGZfY2xhc3MoIHN0ZGRlYiwgIlJlZ2lzdGVyQ2xhc3MzMkE6IGF0b209JTA0eCB3bmRwcm9jPSUwOGx4IGhpbnN0PSUwNHggYmc9JTA0eCBzdHlsZT0lMDh4IGNsc0V4dD0lZCB3aW5FeHQ9JWQgY2xhc3M9JXBcbiIsCisgICAgICAgICAgICAgICAgICAgYXRvbSwgKERXT1JEKXdjLT5scGZuV25kUHJvYywgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgIHdjLT5oYnJCYWNrZ3JvdW5kLCB3Yy0+c3R5bGUsIHdjLT5jYkNsc0V4dHJhLAorICAgICAgICAgICAgICAgICAgIHdjLT5jYlduZEV4dHJhLCBjbGFzc1B0ciApOworICAgIAorICAgIGNsYXNzUHRyLT5mbGFncyAgICAgICAgID0gMDsKKyAgICBjbGFzc1B0ci0+bHBmblduZFByb2MgICA9IChXTkRQUk9DMTYpd2MtPmxwZm5XbmRQcm9jOworICAgIGNsYXNzUHRyLT5oSWNvbiAgICAgICAgID0gKEhJQ09OMTYpd2MtPmhJY29uOworICAgIGNsYXNzUHRyLT5oSWNvblNtICAgICAgID0gMDsKKyAgICBjbGFzc1B0ci0+aEN1cnNvciAgICAgICA9IChIQ1VSU09SMTYpd2MtPmhDdXJzb3I7CisgICAgY2xhc3NQdHItPmhickJhY2tncm91bmQgPSAoSEJSVVNIMTYpd2MtPmhickJhY2tncm91bmQ7CisgICAgQUxJQVNfUmVnaXN0ZXJBbGlhcyggMCwgMCwgKERXT1JEKXdjLT5scGZuV25kUHJvYyApOworICAgIENMQVNTX1NldE1lbnVOYW1lQSggY2xhc3NQdHIsIHdjLT5scHN6TWVudU5hbWUgKTsKKyAgICByZXR1cm4gYXRvbTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBSZWdpc3RlckNsYXNzMzJXICAgICAgKFVTRVIzMi40MjkpCisgKi8KK0FUT00gUmVnaXN0ZXJDbGFzczMyVyggY29uc3QgV05EQ0xBU1MzMlcqIHdjICkKK3sKKyAgICBBVE9NIGF0b207CisgICAgQ0xBU1MgKmNsYXNzUHRyOworCisgICAgLyogRklYTUU6IHRoaXMgc2hvdWxkIG5vdCBiZSBuZWNlc3NhcnkgZm9yIFdpbjMyICovCisgICAgSElOU1RBTkNFMzIgaEluc3RhbmNlID0gKEhJTlNUQU5DRTMyKUdldEV4ZVB0ciggd2MtPmhJbnN0YW5jZSApOworCisgICAgaWYgKCEoYXRvbSA9IEdsb2JhbEFkZEF0b20zMlcoIHdjLT5scHN6Q2xhc3NOYW1lICkpKSByZXR1cm4gMDsKKyAgICBpZiAoIShjbGFzc1B0ciA9IENMQVNTX1JlZ2lzdGVyQ2xhc3MoIGF0b20sIGhJbnN0YW5jZSwgd2MtPnN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2MtPmNiQ2xzRXh0cmEsIHdjLT5jYlduZEV4dHJhICkpKQorICAgIHsKKyAgICAgICAgR2xvYmFsRGVsZXRlQXRvbSggYXRvbSApOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBkcHJpbnRmX2NsYXNzKCBzdGRkZWIsICJSZWdpc3RlckNsYXNzMzJXOiBhdG9tPSUwNHggd25kcHJvYz0lMDhseCBoaW5zdD0lMDR4IGJnPSUwNHggc3R5bGU9JTA4eCBjbHNFeHQ9JWQgd2luRXh0PSVkIGNsYXNzPSVwXG4iLAorICAgICAgICAgICAgICAgICAgIGF0b20sIChEV09SRCl3Yy0+bHBmblduZFByb2MsIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICB3Yy0+aGJyQmFja2dyb3VuZCwgd2MtPnN0eWxlLCB3Yy0+Y2JDbHNFeHRyYSwKKyAgICAgICAgICAgICAgICAgICB3Yy0+Y2JXbmRFeHRyYSwgY2xhc3NQdHIgKTsKKyAgICAKKyAgICBjbGFzc1B0ci0+ZmxhZ3MgICAgICAgICA9IENMQVNTX0ZMQUdfVU5JQ09ERTsKKyAgICBjbGFzc1B0ci0+bHBmblduZFByb2MgICA9IChXTkRQUk9DMTYpd2MtPmxwZm5XbmRQcm9jOworICAgIGNsYXNzUHRyLT5oSWNvbiAgICAgICAgID0gKEhJQ09OMTYpd2MtPmhJY29uOworICAgIGNsYXNzUHRyLT5oSWNvblNtICAgICAgID0gMDsKKyAgICBjbGFzc1B0ci0+aEN1cnNvciAgICAgICA9IChIQ1VSU09SMTYpd2MtPmhDdXJzb3I7CisgICAgY2xhc3NQdHItPmhickJhY2tncm91bmQgPSAoSEJSVVNIMTYpd2MtPmhickJhY2tncm91bmQ7CisKKyAgICBBTElBU19SZWdpc3RlckFsaWFzKCAwLCAwLCAoRFdPUkQpd2MtPmxwZm5XbmRQcm9jICk7CisgICAgQ0xBU1NfU2V0TWVudU5hbWVXKCBjbGFzc1B0ciwgd2MtPmxwc3pNZW51TmFtZSApOworICAgIHJldHVybiBhdG9tOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFJlZ2lzdGVyQ2xhc3NFeDE2ICAgIChVU0VSLjM5NykKKyAqLworQVRPTSBSZWdpc3RlckNsYXNzRXgxNiggY29uc3QgV05EQ0xBU1NFWDE2ICp3YyApCit7CisgICAgQVRPTSBhdG9tOworICAgIENMQVNTICpjbGFzc1B0cjsKKworICAgIEhJTlNUQU5DRTMyIGhJbnN0YW5jZSA9IChISU5TVEFOQ0UzMilHZXRFeGVQdHIoIHdjLT5oSW5zdGFuY2UgKTsKKworICAgIGlmICghKGF0b20gPSBHbG9iYWxBZGRBdG9tMTYoIHdjLT5scHN6Q2xhc3NOYW1lICkpKSByZXR1cm4gMDsKKyAgICBpZiAoIShjbGFzc1B0ciA9IENMQVNTX1JlZ2lzdGVyQ2xhc3MoIGF0b20sIGhJbnN0YW5jZSwgd2MtPnN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2MtPmNiQ2xzRXh0cmEsIHdjLT5jYlduZEV4dHJhICkpKQorICAgIHsKKyAgICAgICAgR2xvYmFsRGVsZXRlQXRvbSggYXRvbSApOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBkcHJpbnRmX2NsYXNzKCBzdGRkZWIsICJSZWdpc3RlckNsYXNzRXgxNjogYXRvbT0lMDR4IHduZHByb2M9JTA4bHggaGluc3Q9JTA0eCBiZz0lMDR4IHN0eWxlPSUwOHggY2xzRXh0PSVkIHdpbkV4dD0lZCBjbGFzcz0lcFxuIiwKKyAgICAgICAgICAgICAgICAgICBhdG9tLCAoRFdPUkQpd2MtPmxwZm5XbmRQcm9jLCBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgd2MtPmhickJhY2tncm91bmQsIHdjLT5zdHlsZSwgd2MtPmNiQ2xzRXh0cmEsCisgICAgICAgICAgICAgICAgICAgd2MtPmNiV25kRXh0cmEsIGNsYXNzUHRyICk7CisgICAgCisgICAgY2xhc3NQdHItPmxwZm5XbmRQcm9jICAgPSB3Yy0+bHBmblduZFByb2M7CisgICAgY2xhc3NQdHItPmhJY29uICAgICAgICAgPSB3Yy0+aEljb247CisgICAgY2xhc3NQdHItPmhJY29uU20gICAgICAgPSB3Yy0+aEljb25TbTsKKyAgICBjbGFzc1B0ci0+aEN1cnNvciAgICAgICA9IHdjLT5oQ3Vyc29yOworICAgIGNsYXNzUHRyLT5oYnJCYWNrZ3JvdW5kID0gd2MtPmhickJhY2tncm91bmQ7CisKKyAgICBDTEFTU19TZXRNZW51TmFtZUEoIGNsYXNzUHRyLCBISVdPUkQod2MtPmxwc3pNZW51TmFtZSkgPworICAgICAgICAgICAgICAgICBQVFJfU0VHX1RPX0xJTih3Yy0+bHBzek1lbnVOYW1lKSA6IChMUENTVFIpd2MtPmxwc3pNZW51TmFtZSApOworICAgIHJldHVybiBhdG9tOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFJlZ2lzdGVyQ2xhc3NFeDMyQSAgICAgIChVU0VSMzIuNDI3KQorICovCitBVE9NIFJlZ2lzdGVyQ2xhc3NFeDMyQSggY29uc3QgV05EQ0xBU1NFWDMyQSogd2MgKQoreworICAgIEFUT00gYXRvbTsKKyAgICBDTEFTUyAqY2xhc3NQdHI7CisKKyAgICAvKiBGSVhNRTogdGhpcyBzaG91bGQgbm90IGJlIG5lY2Vzc2FyeSBmb3IgV2luMzIgKi8KKyAgICBISU5TVEFOQ0UzMiBoSW5zdGFuY2UgPSAoSElOU1RBTkNFMzIpR2V0RXhlUHRyKCB3Yy0+aEluc3RhbmNlICk7CisKKyAgICBpZiAoIShhdG9tID0gR2xvYmFsQWRkQXRvbTMyQSggd2MtPmxwc3pDbGFzc05hbWUgKSkpIHJldHVybiAwOworICAgIGlmICghKGNsYXNzUHRyID0gQ0xBU1NfUmVnaXN0ZXJDbGFzcyggYXRvbSwgaEluc3RhbmNlLCB3Yy0+c3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Yy0+Y2JDbHNFeHRyYSwgd2MtPmNiV25kRXh0cmEgKSkpCisgICAgeworICAgICAgICBHbG9iYWxEZWxldGVBdG9tKCBhdG9tICk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGRwcmludGZfY2xhc3MoIHN0ZGRlYiwgIlJlZ2lzdGVyQ2xhc3NFeDMyQTogYXRvbT0lMDR4IHduZHByb2M9JTA4bHggaGluc3Q9JTA0eCBiZz0lMDR4IHN0eWxlPSUwOHggY2xzRXh0PSVkIHdpbkV4dD0lZCBjbGFzcz0lcFxuIiwKKyAgICAgICAgICAgICAgICAgICBhdG9tLCAoRFdPUkQpd2MtPmxwZm5XbmRQcm9jLCBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgd2MtPmhickJhY2tncm91bmQsIHdjLT5zdHlsZSwgd2MtPmNiQ2xzRXh0cmEsCisgICAgICAgICAgICAgICAgICAgd2MtPmNiV25kRXh0cmEsIGNsYXNzUHRyICk7CisgICAgCisgICAgY2xhc3NQdHItPmxwZm5XbmRQcm9jICAgPSAoV05EUFJPQzE2KXdjLT5scGZuV25kUHJvYzsKKyAgICBjbGFzc1B0ci0+aEljb24gICAgICAgICA9IChISUNPTjE2KXdjLT5oSWNvbjsKKyAgICBjbGFzc1B0ci0+aEljb25TbSAgICAgICA9IChISUNPTjE2KXdjLT5oSWNvblNtOworICAgIGNsYXNzUHRyLT5oQ3Vyc29yICAgICAgID0gKEhDVVJTT1IxNil3Yy0+aEN1cnNvcjsKKyAgICBjbGFzc1B0ci0+aGJyQmFja2dyb3VuZCA9IChIQlJVU0gxNil3Yy0+aGJyQmFja2dyb3VuZDsKKworICAgIEFMSUFTX1JlZ2lzdGVyQWxpYXMoIDAsIDAsIChEV09SRCl3Yy0+bHBmblduZFByb2MgKTsKKyAgICBDTEFTU19TZXRNZW51TmFtZUEoIGNsYXNzUHRyLCB3Yy0+bHBzek1lbnVOYW1lICk7CisgICAgcmV0dXJuIGF0b207Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgUmVnaXN0ZXJDbGFzc0V4MzJXICAgICAgKFVTRVIzMi40MjgpCisgKi8KK0FUT00gUmVnaXN0ZXJDbGFzc0V4MzJXKCBjb25zdCBXTkRDTEFTU0VYMzJXKiB3YyApCit7CisgICAgQVRPTSBhdG9tOworICAgIENMQVNTICpjbGFzc1B0cjsKKworICAgIC8qIEZJWE1FOiB0aGlzIHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5IGZvciBXaW4zMiAqLworICAgIEhJTlNUQU5DRTMyIGhJbnN0YW5jZSA9IChISU5TVEFOQ0UzMilHZXRFeGVQdHIoIHdjLT5oSW5zdGFuY2UgKTsKKworICAgIGlmICghKGF0b20gPSBHbG9iYWxBZGRBdG9tMzJXKCB3Yy0+bHBzekNsYXNzTmFtZSApKSkgcmV0dXJuIDA7CisgICAgaWYgKCEoY2xhc3NQdHIgPSBDTEFTU19SZWdpc3RlckNsYXNzKCBhdG9tLCBoSW5zdGFuY2UsIHdjLT5zdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdjLT5jYkNsc0V4dHJhLCB3Yy0+Y2JXbmRFeHRyYSApKSkKKyAgICB7CisgICAgICAgIEdsb2JhbERlbGV0ZUF0b20oIGF0b20gKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgZHByaW50Zl9jbGFzcyggc3RkZGViLCAiUmVnaXN0ZXJDbGFzc0V4MzJXOiBhdG9tPSUwNHggd25kcHJvYz0lMDhseCBoaW5zdD0lMDR4IGJnPSUwNHggc3R5bGU9JTA4eCBjbHNFeHQ9JWQgd2luRXh0PSVkIGNsYXNzPSVwXG4iLAorICAgICAgICAgICAgICAgICAgIGF0b20sIChEV09SRCl3Yy0+bHBmblduZFByb2MsIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICB3Yy0+aGJyQmFja2dyb3VuZCwgd2MtPnN0eWxlLCB3Yy0+Y2JDbHNFeHRyYSwKKyAgICAgICAgICAgICAgICAgICB3Yy0+Y2JXbmRFeHRyYSwgY2xhc3NQdHIgKTsKKyAgICAKKyAgICBjbGFzc1B0ci0+bHBmblduZFByb2MgICA9IChXTkRQUk9DMTYpd2MtPmxwZm5XbmRQcm9jOworICAgIGNsYXNzUHRyLT5oSWNvbiAgICAgICAgID0gKEhJQ09OMTYpd2MtPmhJY29uOworICAgIGNsYXNzUHRyLT5oSWNvblNtICAgICAgID0gKEhJQ09OMTYpd2MtPmhJY29uU207CisgICAgY2xhc3NQdHItPmhDdXJzb3IgICAgICAgPSAoSENVUlNPUjE2KXdjLT5oQ3Vyc29yOworICAgIGNsYXNzUHRyLT5oYnJCYWNrZ3JvdW5kID0gKEhCUlVTSDE2KXdjLT5oYnJCYWNrZ3JvdW5kOworCisgICAgQUxJQVNfUmVnaXN0ZXJBbGlhcyggMCwgMCwgKERXT1JEKXdjLT5scGZuV25kUHJvYyApOworICAgIENMQVNTX1NldE1lbnVOYW1lVyggY2xhc3NQdHIsIHdjLT5scHN6TWVudU5hbWUgKTsKKyAgICByZXR1cm4gYXRvbTsKIH0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBVbnJlZ2lzdGVyQ2xhc3MxNiAgICAoVVNFUi40MDMpCiAgKi8KLUJPT0wgVW5yZWdpc3RlckNsYXNzMTYoIFNFR1BUUiBjbGFzc05hbWUsIEhJTlNUQU5DRTE2IGhpbnN0YW5jZSApCitCT09MMTYgVW5yZWdpc3RlckNsYXNzMTYoIFNFR1BUUiBjbGFzc05hbWUsIEhJTlNUQU5DRTE2IGhJbnN0YW5jZSApCiB7CiAgICAgQ0xBU1MgKmNsYXNzUHRyOworICAgIEFUT00gYXRvbTsKIAotICAgIGhpbnN0YW5jZSA9IEdldEV4ZVB0ciggaGluc3RhbmNlICk7Ci0KLSAgICAgIC8qIENoZWNrIGlmIHdlIGNhbiByZW1vdmUgdGhpcyBjbGFzcyAqLwotICAgIGlmICghKGNsYXNzUHRyID0gQ0xBU1NfRmluZENsYXNzQnlOYW1lKCBjbGFzc05hbWUsIGhpbnN0YW5jZSApKSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIGlmICgoY2xhc3NQdHItPmhJbnN0YW5jZSAhPSBoaW5zdGFuY2UpIHx8IChjbGFzc1B0ci0+Y1dpbmRvd3MgPiAwKSkKLQlyZXR1cm4gRkFMU0U7Ci0gICAgQ0xBU1NfRnJlZUNsYXNzKCBjbGFzc1B0ciApOwotICAgIHJldHVybiBUUlVFOworICAgIGhJbnN0YW5jZSA9IEdldEV4ZVB0ciggaEluc3RhbmNlICk7CisgICAgaWYgKCEoYXRvbSA9IEdsb2JhbEZpbmRBdG9tMTYoIGNsYXNzTmFtZSApKSkgcmV0dXJuIEZBTFNFOworICAgIGlmICghKGNsYXNzUHRyID0gQ0xBU1NfRmluZENsYXNzQnlBdG9tKCBhdG9tLCBoSW5zdGFuY2UgKSkgfHwKKyAgICAgICAgKGNsYXNzUHRyLT5oSW5zdGFuY2UgIT0gaEluc3RhbmNlKSkgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBDTEFTU19GcmVlQ2xhc3MoIGNsYXNzUHRyICk7CiB9CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2V0Q2xhc3NXb3JkICAgIChVU0VSLjEyOSkKKyAqICAgICAgICAgICBVbnJlZ2lzdGVyQ2xhc3MzMkEgICAgKFVTRVIzMi41NjIpCiAgKi8KLVdPUkQgR2V0Q2xhc3NXb3JkKCBIV05EIGh3bmQsIHNob3J0IG9mZnNldCApCitCT09MMzIgVW5yZWdpc3RlckNsYXNzMzJBKCBMUENTVFIgY2xhc3NOYW1lLCBISU5TVEFOQ0UzMiBoSW5zdGFuY2UgKQoreworICAgIENMQVNTICpjbGFzc1B0cjsKKyAgICBBVE9NIGF0b207CisKKyAgICBoSW5zdGFuY2UgPSBHZXRFeGVQdHIoIGhJbnN0YW5jZSApOyAgLyogRklYTUU6IG5vdCBuZWVkZWQgaW4gV2luMzIgKi8KKyAgICBpZiAoIShhdG9tID0gR2xvYmFsRmluZEF0b20zMkEoIGNsYXNzTmFtZSApKSkgcmV0dXJuIEZBTFNFOworICAgIGlmICghKGNsYXNzUHRyID0gQ0xBU1NfRmluZENsYXNzQnlBdG9tKCBhdG9tLCBoSW5zdGFuY2UgKSkgfHwKKyAgICAgICAgKGNsYXNzUHRyLT5oSW5zdGFuY2UgIT0gaEluc3RhbmNlKSkgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBDTEFTU19GcmVlQ2xhc3MoIGNsYXNzUHRyICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgVW5yZWdpc3RlckNsYXNzMzJXICAgIChVU0VSMzIuNTYzKQorICovCitCT09MMzIgVW5yZWdpc3RlckNsYXNzMzJXKCBMUENXU1RSIGNsYXNzTmFtZSwgSElOU1RBTkNFMzIgaEluc3RhbmNlICkKK3sKKyAgICBDTEFTUyAqY2xhc3NQdHI7CisgICAgQVRPTSBhdG9tOworCisgICAgaEluc3RhbmNlID0gR2V0RXhlUHRyKCBoSW5zdGFuY2UgKTsgIC8qIEZJWE1FOiBub3QgbmVlZGVkIGluIFdpbjMyICovCisgICAgaWYgKCEoYXRvbSA9IEdsb2JhbEZpbmRBdG9tMzJXKCBjbGFzc05hbWUgKSkpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIShjbGFzc1B0ciA9IENMQVNTX0ZpbmRDbGFzc0J5QXRvbSggYXRvbSwgaEluc3RhbmNlICkpIHx8CisgICAgICAgIChjbGFzc1B0ci0+aEluc3RhbmNlICE9IGhJbnN0YW5jZSkpIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gQ0xBU1NfRnJlZUNsYXNzKCBjbGFzc1B0ciApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdldENsYXNzV29yZCAgICAoVVNFUi4xMjkpIChVU0VSMzIuMjE4KQorICovCitXT1JEIEdldENsYXNzV29yZCggSFdORCBod25kLCBJTlQzMiBvZmZzZXQgKQogewogICAgIFdORCAqIHduZFB0cjsKICAgICAKICAgICBpZiAoISh3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApKSkgcmV0dXJuIDA7CiAgICAgaWYgKG9mZnNldCA+PSAwKQotICAgICAgICByZXR1cm4gKihXT1JEICopKCgoY2hhciAqKXduZFB0ci0+Y2xhc3MtPndFeHRyYSkgKyBvZmZzZXQpOwotICAgIHN3aXRjaChvZmZzZXQpCisgICAgeworICAgICAgICBpZiAob2Zmc2V0IDw9IHduZFB0ci0+Y2xhc3MtPmNiQ2xzRXh0cmEgLSBzaXplb2YoV09SRCkpCisgICAgICAgICAgICByZXR1cm4gR0VUX1dPUkQoKChjaGFyICopd25kUHRyLT5jbGFzcy0+d0V4dHJhKSArIG9mZnNldCk7CisgICAgfQorICAgIGVsc2Ugc3dpdGNoKG9mZnNldCkKICAgICB7CiAgICAgICAgIGNhc2UgR0NXX0hCUkJBQ0tHUk9VTkQ6IHJldHVybiB3bmRQdHItPmNsYXNzLT5oYnJCYWNrZ3JvdW5kOwogICAgICAgICBjYXNlIEdDV19IQ1VSU09SOiAgICAgICByZXR1cm4gd25kUHRyLT5jbGFzcy0+aEN1cnNvcjsKICAgICAgICAgY2FzZSBHQ1dfSElDT046ICAgICAgICAgcmV0dXJuIHduZFB0ci0+Y2xhc3MtPmhJY29uOwotICAgICAgICBjYXNlIEdDV19ITU9EVUxFOiAgICAgICByZXR1cm4gd25kUHRyLT5jbGFzcy0+aEluc3RhbmNlOworICAgICAgICBjYXNlIEdDV19ISUNPTlNNOiAgICAgICByZXR1cm4gd25kUHRyLT5jbGFzcy0+aEljb25TbTsKICAgICAgICAgY2FzZSBHQ1dfQVRPTTogICAgICAgICAgcmV0dXJuIHduZFB0ci0+Y2xhc3MtPmF0b21OYW1lOwogICAgICAgICBjYXNlIEdDV19TVFlMRToKICAgICAgICAgY2FzZSBHQ1dfQ0JXTkRFWFRSQToKICAgICAgICAgY2FzZSBHQ1dfQ0JDTFNFWFRSQToKLSAgICAgICAgICAgIHJldHVybiAoV09SRClHZXRDbGFzc0xvbmcoIGh3bmQsIG9mZnNldCApOworICAgICAgICBjYXNlIEdDV19ITU9EVUxFOgorICAgICAgICAgICAgcmV0dXJuIChXT1JEKUdldENsYXNzTG9uZzMyQSggaHduZCwgb2Zmc2V0ICk7CiAgICAgfQogICAgIGZwcmludGYoc3RkZXJyLCAiV2FybmluZzogaW52YWxpZCBvZmZzZXQgJWQgZm9yIEdldENsYXNzV29yZCgpXG4iLCBvZmZzZXQpOwogICAgIHJldHVybiAwOwpAQCAtMzQxLDU0ICs2MDEsNDQgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBTZXRDbGFzc1dvcmQgICAgKFVTRVIuMTMwKQorICogICAgICAgICAgIEdldENsYXNzTG9uZzE2ICAgIChVU0VSLjEzMSkKICAqLwotV09SRCBTZXRDbGFzc1dvcmQoIEhXTkQgaHduZCwgc2hvcnQgb2Zmc2V0LCBXT1JEIG5ld3ZhbCApCitMT05HIEdldENsYXNzTG9uZzE2KCBIV05EIGh3bmQsIElOVDE2IG9mZnNldCApCiB7Ci0gICAgV05EICogd25kUHRyOwotICAgIFdPUkQgKnB0ciwgcmV0dmFsID0gMDsKLSAgICAKLSAgICBpZiAoISh3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApKSkgcmV0dXJuIDA7Ci0gICAgaWYgKG9mZnNldCA+PSAwKSBwdHIgPSAoV09SRCAqKSgoKGNoYXIgKil3bmRQdHItPmNsYXNzLT53RXh0cmEpICsgb2Zmc2V0KTsKLSAgICBlbHNlIHN3aXRjaChvZmZzZXQpCi0gICAgewotICAgICAgICBjYXNlIEdDV19IQlJCQUNLR1JPVU5EOiBwdHIgPSAmd25kUHRyLT5jbGFzcy0+aGJyQmFja2dyb3VuZDsgYnJlYWs7Ci0gICAgICAgIGNhc2UgR0NXX0hDVVJTT1I6ICAgICAgIHB0ciA9ICZ3bmRQdHItPmNsYXNzLT5oQ3Vyc29yOyBicmVhazsKLSAgICAgICAgY2FzZSBHQ1dfSElDT046ICAgICAgICAgcHRyID0gJnduZFB0ci0+Y2xhc3MtPmhJY29uOyBicmVhazsKLSAgICAgICAgY2FzZSBHQ1dfSE1PRFVMRTogICAgICAgcHRyID0gJnduZFB0ci0+Y2xhc3MtPmhJbnN0YW5jZTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgR0NXX0FUT006ICAgICAgICAgIHB0ciA9ICZ3bmRQdHItPmNsYXNzLT5hdG9tTmFtZTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgR0NXX1NUWUxFOgotICAgICAgICBjYXNlIEdDV19DQldOREVYVFJBOgotICAgICAgICBjYXNlIEdDV19DQkNMU0VYVFJBOgotICAgICAgICAgICAgcmV0dXJuIChXT1JEKVNldENsYXNzTG9uZyggaHduZCwgb2Zmc2V0LCAoTE9ORyluZXd2YWwgKTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIldhcm5pbmc6IGludmFsaWQgb2Zmc2V0ICVkIGZvciBTZXRDbGFzc1dvcmQoKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgIG9mZnNldCk7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dmFsID0gKnB0cjsKLSAgICAqcHRyID0gbmV3dmFsOwotICAgIHJldHVybiByZXR2YWw7CisgICAgRFdPUkQgcmV0ID0gR2V0Q2xhc3NMb25nMzJBKCBod25kLCBvZmZzZXQgKTsKKyAgICBpZiAoKG9mZnNldCA9PSBHQ0xfTUVOVU5BTUUpICYmIEhJV09SRChyZXQpKQorICAgICAgICByZXR1cm4gKExPTkcpU0VHUFRSX0dFVCgodm9pZCAqKXJldCk7ICAvKiBOYW1lIG5lZWRzIHRvIGJlIGEgU0VHUFRSICovCisgICAgcmV0dXJuIChMT05HKXJldDsKIH0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBHZXRDbGFzc0xvbmcgICAgKFVTRVIuMTMxKQorICogICAgICAgICAgIEdldENsYXNzTG9uZzMyQSAgICAoVVNFUjMyLjIxNCkKICAqLwotTE9ORyBHZXRDbGFzc0xvbmcoIEhXTkQgaHduZCwgc2hvcnQgb2Zmc2V0ICkKK0xPTkcgR2V0Q2xhc3NMb25nMzJBKCBIV05EIGh3bmQsIElOVDMyIG9mZnNldCApCiB7CiAgICAgV05EICogd25kUHRyOwogICAgIAogICAgIGlmICghKHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICkpKSByZXR1cm4gMDsKICAgICBpZiAob2Zmc2V0ID49IDApCi0gICAgICAgIHJldHVybiAqKFdPUkQgKikoKChjaGFyICopd25kUHRyLT5jbGFzcy0+d0V4dHJhKSArIG9mZnNldCk7CisgICAgeworICAgICAgICBpZiAob2Zmc2V0IDw9IHduZFB0ci0+Y2xhc3MtPmNiQ2xzRXh0cmEgLSBzaXplb2YoTE9ORykpCisgICAgICAgICAgICByZXR1cm4gR0VUX0RXT1JEKCgoY2hhciAqKXduZFB0ci0+Y2xhc3MtPndFeHRyYSkgKyBvZmZzZXQpOworICAgIH0KICAgICBzd2l0Y2gob2Zmc2V0KQogICAgIHsKICAgICAgICAgY2FzZSBHQ0xfU1RZTEU6ICAgICAgcmV0dXJuIChMT05HKXduZFB0ci0+Y2xhc3MtPnN0eWxlOwogICAgICAgICBjYXNlIEdDTF9DQldOREVYVFJBOiByZXR1cm4gKExPTkcpd25kUHRyLT5jbGFzcy0+Y2JXbmRFeHRyYTsKICAgICAgICAgY2FzZSBHQ0xfQ0JDTFNFWFRSQTogcmV0dXJuIChMT05HKXduZFB0ci0+Y2xhc3MtPmNiQ2xzRXh0cmE7Ci0gICAgICAgIGNhc2UgR0NMX01FTlVOQU1FOiAgIHJldHVybiAoTE9ORyl3bmRQdHItPmNsYXNzLT5scHN6TWVudU5hbWU7CiAgICAgICAgIGNhc2UgR0NMX1dORFBST0M6ICAgIHJldHVybiAoTE9ORyl3bmRQdHItPmNsYXNzLT5scGZuV25kUHJvYzsKKyAgICAgICAgY2FzZSBHQ0xfSE1PRFVMRTogICAgcmV0dXJuIChMT05HKXduZFB0ci0+Y2xhc3MtPmhJbnN0YW5jZTsKKyAgICAgICAgY2FzZSBHQ0xfTUVOVU5BTUU6CisgICAgICAgICAgICByZXR1cm4gKExPTkcpQ0xBU1NfR2V0TWVudU5hbWVBKCB3bmRQdHItPmNsYXNzICk7CisgICAgICAgIGNhc2UgR0NMX0hCUkJBQ0tHUk9VTkQ6CisgICAgICAgIGNhc2UgR0NMX0hDVVJTT1I6CisgICAgICAgIGNhc2UgR0NMX0hJQ09OOgorICAgICAgICBjYXNlIEdDTF9ISUNPTlNNOgorICAgICAgICAgICAgcmV0dXJuIEdldENsYXNzV29yZCggaHduZCwgb2Zmc2V0ICk7CiAgICAgfQogICAgIGZwcmludGYoc3RkZXJyLCAiV2FybmluZzogaW52YWxpZCBvZmZzZXQgJWQgZm9yIEdldENsYXNzTG9uZygpXG4iLCBvZmZzZXQpOwogICAgIHJldHVybiAwOwpAQCAtMzk2LDc1ICs2NDYsMzI3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgU2V0Q2xhc3NMb25nICAgIChVU0VSLjEzMikKKyAqICAgICAgICAgICBHZXRDbGFzc0xvbmczMlcgICAgKFVTRVIzMi4yMTUpCiAgKi8KLUxPTkcgU2V0Q2xhc3NMb25nKCBIV05EIGh3bmQsIHNob3J0IG9mZnNldCwgTE9ORyBuZXd2YWwgKQorTE9ORyBHZXRDbGFzc0xvbmczMlcoIEhXTkQgaHduZCwgSU5UMzIgb2Zmc2V0ICkKIHsKICAgICBXTkQgKiB3bmRQdHI7Ci0gICAgTE9ORyAqcHRyLCByZXR2YWwgPSAwOworICAgIAorICAgIGlmIChvZmZzZXQgIT0gR0NMX01FTlVOQU1FKSByZXR1cm4gR2V0Q2xhc3NMb25nMzJBKCBod25kLCBvZmZzZXQgKTsKKyAgICBpZiAoISh3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApKSkgcmV0dXJuIDA7CisgICAgcmV0dXJuIChMT05HKUNMQVNTX0dldE1lbnVOYW1lVyggd25kUHRyLT5jbGFzcyApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFNldENsYXNzV29yZCAgICAoVVNFUi4xMzApIChVU0VSMzIuNDY4KQorICovCitXT1JEIFNldENsYXNzV29yZCggSFdORCBod25kLCBJTlQzMiBvZmZzZXQsIFdPUkQgbmV3dmFsICkKK3sKKyAgICBXTkQgKiB3bmRQdHI7CisgICAgV09SRCByZXR2YWwgPSAwOworICAgIHZvaWQgKnB0cjsKICAgICAKICAgICBpZiAoISh3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApKSkgcmV0dXJuIDA7Ci0gICAgaWYgKG9mZnNldCA+PSAwKSBwdHIgPSAoTE9ORyAqKSgoKGNoYXIgKil3bmRQdHItPmNsYXNzLT53RXh0cmEpICsgb2Zmc2V0KTsKKyAgICBpZiAob2Zmc2V0ID49IDApCisgICAgeworICAgICAgICBpZiAob2Zmc2V0IDw9IHduZFB0ci0+Y2xhc3MtPmNiQ2xzRXh0cmEgLSBzaXplb2YoV09SRCkpCisgICAgICAgICAgICBwdHIgPSAoKGNoYXIgKil3bmRQdHItPmNsYXNzLT53RXh0cmEpICsgb2Zmc2V0OworICAgICAgICB7CisgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJXYXJuaW5nOiBpbnZhbGlkIG9mZnNldCAlZCBmb3IgU2V0Q2xhc3NXb3JkKClcbiIsCisgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQogICAgIGVsc2Ugc3dpdGNoKG9mZnNldCkKICAgICB7Ci0gICAgICAgIGNhc2UgR0NMX1NUWUxFOiAgICAgIHB0ciA9IChMT05HKikmd25kUHRyLT5jbGFzcy0+c3R5bGU7IGJyZWFrOwotICAgICAgICBjYXNlIEdDTF9DQldOREVYVFJBOiBwdHIgPSAoTE9ORyopJnduZFB0ci0+Y2xhc3MtPmNiV25kRXh0cmE7IGJyZWFrOwotICAgICAgICBjYXNlIEdDTF9DQkNMU0VYVFJBOiBwdHIgPSAoTE9ORyopJnduZFB0ci0+Y2xhc3MtPmNiQ2xzRXh0cmE7IGJyZWFrOwotICAgICAgICBjYXNlIEdDTF9NRU5VTkFNRTogICBwdHIgPSAoTE9ORyopJnduZFB0ci0+Y2xhc3MtPmxwc3pNZW51TmFtZTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgR0NMX1dORFBST0M6ICAgIHB0ciA9IChMT05HKikmd25kUHRyLT5jbGFzcy0+bHBmblduZFByb2M7IGJyZWFrOworICAgICAgICBjYXNlIEdDV19TVFlMRToKKyAgICAgICAgY2FzZSBHQ1dfQ0JXTkRFWFRSQToKKyAgICAgICAgY2FzZSBHQ1dfQ0JDTFNFWFRSQToKKyAgICAgICAgY2FzZSBHQ1dfSE1PRFVMRToKKyAgICAgICAgICAgIHJldHVybiAoV09SRClTZXRDbGFzc0xvbmczMkEoIGh3bmQsIG9mZnNldCwgKExPTkcpbmV3dmFsICk7CisgICAgICAgIGNhc2UgR0NXX0hCUkJBQ0tHUk9VTkQ6IHB0ciA9ICZ3bmRQdHItPmNsYXNzLT5oYnJCYWNrZ3JvdW5kOyBicmVhazsKKyAgICAgICAgY2FzZSBHQ1dfSENVUlNPUjogICAgICAgcHRyID0gJnduZFB0ci0+Y2xhc3MtPmhDdXJzb3I7IGJyZWFrOworICAgICAgICBjYXNlIEdDV19ISUNPTjogICAgICAgICBwdHIgPSAmd25kUHRyLT5jbGFzcy0+aEljb247IGJyZWFrOworICAgICAgICBjYXNlIEdDV19ISUNPTlNNOiAgICAgICBwdHIgPSAmd25kUHRyLT5jbGFzcy0+aEljb25TbTsgYnJlYWs7CisgICAgICAgIGNhc2UgR0NXX0FUT006ICAgICAgICAgIHB0ciA9ICZ3bmRQdHItPmNsYXNzLT5hdG9tTmFtZTsgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJXYXJuaW5nOiBpbnZhbGlkIG9mZnNldCAlZCBmb3IgU2V0Q2xhc3NMb25nKClcbiIsCisgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJXYXJuaW5nOiBpbnZhbGlkIG9mZnNldCAlZCBmb3IgU2V0Q2xhc3NXb3JkKClcbiIsCiAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQpOwogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIHJldHZhbCA9ICpwdHI7Ci0gICAgKnB0ciA9IG5ld3ZhbDsKKyAgICByZXR2YWwgPSBHRVRfV09SRChwdHIpOworICAgIFBVVF9XT1JEKCBwdHIsIG5ld3ZhbCApOwogICAgIHJldHVybiByZXR2YWw7CiB9CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2V0Q2xhc3NOYW1lICAgICAgKFVTRVIuNTgpCisgKiAgICAgICAgICAgU2V0Q2xhc3NMb25nMTYgICAgKFVTRVIuMTMyKQogICovCi1pbnQgR2V0Q2xhc3NOYW1lKEhXTkQgaHduZCwgTFBTVFIgbHBDbGFzc05hbWUsIHNob3J0IG1heENvdW50KQorTE9ORyBTZXRDbGFzc0xvbmcxNiggSFdORCBod25kLCBJTlQxNiBvZmZzZXQsIExPTkcgbmV3dmFsICkKIHsKLSAgICBXTkQgKnduZFB0cjsKLQotICAgIC8qIEZJWE1FOiBXZSBoYXZlIHRoZSBmaW5kIHRoZSBjb3JyZWN0IGhJbnN0YW5jZSAqLwotICAgIGRwcmludGZfY2xhc3Moc3RkZGViLCJHZXRDbGFzc05hbWUoJTA0eCwlcCwlZClcbiIsaHduZCxscENsYXNzTmFtZSxtYXhDb3VudCk7Ci0gICAgaWYgKCEod25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoaHduZCkpKSByZXR1cm4gMDsKLSAgICAKLSAgICByZXR1cm4gR2xvYmFsR2V0QXRvbU5hbWUoIHduZFB0ci0+Y2xhc3MtPmF0b21OYW1lLCBscENsYXNzTmFtZSwgbWF4Q291bnQgKTsKKyAgICBpZiAoKG9mZnNldCA9PSBHQ0xfTUVOVU5BTUUpICYmIEhJV09SRChuZXd2YWwpKQorICAgICAgICBuZXd2YWwgPSAoTE9ORylQVFJfU0VHX1RPX0xJTihuZXd2YWwpOworICAgIHJldHVybiBTZXRDbGFzc0xvbmczMkEoIGh3bmQsIG9mZnNldCwgbmV3dmFsICk7CiB9CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2V0Q2xhc3NJbmZvICAgICAgKFVTRVIuNDA0KQorICogICAgICAgICAgIFNldENsYXNzTG9uZzMyQSAgICAoVVNFUjMyLjQ2NikKICAqLwotQk9PTCBHZXRDbGFzc0luZm8oIEhBTkRMRSBoSW5zdGFuY2UsIFNFR1BUUiBuYW1lLCBXTkRDTEFTUzE2ICpscFduZENsYXNzICkKK0xPTkcgU2V0Q2xhc3NMb25nMzJBKCBIV05EIGh3bmQsIElOVDMyIG9mZnNldCwgTE9ORyBuZXd2YWwgKQogeworICAgIFdORCAqIHduZFB0cjsKKyAgICBMT05HIHJldHZhbCA9IDA7CisgICAgdm9pZCAqcHRyOworICAgIAorICAgIGlmICghKHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICkpKSByZXR1cm4gMDsKKyAgICBpZiAob2Zmc2V0ID49IDApCisgICAgeworICAgICAgICBpZiAob2Zmc2V0IDw9IHduZFB0ci0+Y2xhc3MtPmNiQ2xzRXh0cmEgLSBzaXplb2YoTE9ORykpCisgICAgICAgICAgICBwdHIgPSAoKGNoYXIgKil3bmRQdHItPmNsYXNzLT53RXh0cmEpICsgb2Zmc2V0OworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIldhcm5pbmc6IGludmFsaWQgb2Zmc2V0ICVkIGZvciBTZXRDbGFzc0xvbmcoKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgIG9mZnNldCApOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBzd2l0Y2gob2Zmc2V0KQorICAgIHsKKyAgICAgICAgY2FzZSBHQ0xfTUVOVU5BTUU6CisgICAgICAgICAgICBDTEFTU19TZXRNZW51TmFtZUEoIHduZFB0ci0+Y2xhc3MsIChMUENTVFIpbmV3dmFsICk7CisgICAgICAgICAgICByZXR1cm4gMDsgIC8qIE9sZCB2YWx1ZSBpcyBub3cgbWVhbmluZ2xlc3MgYW55d2F5ICovCisgICAgICAgIGNhc2UgR0NMX0hCUkJBQ0tHUk9VTkQ6CisgICAgICAgIGNhc2UgR0NMX0hDVVJTT1I6CisgICAgICAgIGNhc2UgR0NMX0hJQ09OOgorICAgICAgICBjYXNlIEdDTF9ISUNPTlNNOgorICAgICAgICAgICAgcmV0dXJuIFNldENsYXNzV29yZCggaHduZCwgb2Zmc2V0LCAoV09SRCluZXd2YWwgKTsKKyAgICAgICAgY2FzZSBHQ0xfU1RZTEU6ICAgICAgcHRyID0gJnduZFB0ci0+Y2xhc3MtPnN0eWxlOyBicmVhazsKKyAgICAgICAgY2FzZSBHQ0xfQ0JXTkRFWFRSQTogcHRyID0gJnduZFB0ci0+Y2xhc3MtPmNiV25kRXh0cmE7IGJyZWFrOworICAgICAgICBjYXNlIEdDTF9DQkNMU0VYVFJBOiBwdHIgPSAmd25kUHRyLT5jbGFzcy0+Y2JDbHNFeHRyYTsgYnJlYWs7CisgICAgICAgIGNhc2UgR0NMX1dORFBST0M6ICAgIHB0ciA9ICZ3bmRQdHItPmNsYXNzLT5scGZuV25kUHJvYzsgYnJlYWs7CisgICAgICAgIGNhc2UgR0NMX0hNT0RVTEU6ICAgIHB0ciA9ICZ3bmRQdHItPmNsYXNzLT5oSW5zdGFuY2U7IGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiV2FybmluZzogaW52YWxpZCBvZmZzZXQgJWQgZm9yIFNldENsYXNzTG9uZygpXG4iLAorICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0KTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR2YWwgPSBHRVRfRFdPUkQocHRyKTsKKyAgICBQVVRfRFdPUkQoIHB0ciwgbmV3dmFsICk7CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBTZXRDbGFzc0xvbmczMlcgICAgKFVTRVIzMi40NjcpCisgKi8KK0xPTkcgU2V0Q2xhc3NMb25nMzJXKCBIV05EIGh3bmQsIElOVDMyIG9mZnNldCwgTE9ORyBuZXd2YWwgKQoreworICAgIFdORCAqd25kUHRyOworICAgIGlmIChvZmZzZXQgIT0gR0NMX01FTlVOQU1FKSByZXR1cm4gU2V0Q2xhc3NMb25nMzJBKCBod25kLCBvZmZzZXQsIG5ld3ZhbCApOworICAgIGlmICghKHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGh3bmQpKSkgcmV0dXJuIDA7CisgICAgQ0xBU1NfU2V0TWVudU5hbWVXKCB3bmRQdHItPmNsYXNzLCAoTFBDV1NUUiluZXd2YWwgKTsKKyAgICByZXR1cm4gMDsgIC8qIE9sZCB2YWx1ZSBpcyBub3cgbWVhbmluZ2xlc3MgYW55d2F5ICovCit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgR2V0Q2xhc3NOYW1lMTYgICAgICAoVVNFUi41OCkKKyAqLworSU5UMTYgR2V0Q2xhc3NOYW1lMTYoIEhXTkQgaHduZCwgTFBTVFIgYnVmZmVyLCBJTlQxNiBjb3VudCApCit7CisgICAgV05EICp3bmRQdHI7CisgICAgaWYgKCEod25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoaHduZCkpKSByZXR1cm4gMDsKKyAgICByZXR1cm4gR2xvYmFsR2V0QXRvbU5hbWUxNiggd25kUHRyLT5jbGFzcy0+YXRvbU5hbWUsIGJ1ZmZlciwgY291bnQgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBHZXRDbGFzc05hbWUzMkEgICAgICAoVVNFUjMyLjIxNikKKyAqLworSU5UMzIgR2V0Q2xhc3NOYW1lMzJBKCBIV05EIGh3bmQsIExQU1RSIGJ1ZmZlciwgSU5UMzIgY291bnQgKQoreworICAgIFdORCAqd25kUHRyOworICAgIGlmICghKHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGh3bmQpKSkgcmV0dXJuIDA7CisgICAgcmV0dXJuIEdsb2JhbEdldEF0b21OYW1lMzJBKCB3bmRQdHItPmNsYXNzLT5hdG9tTmFtZSwgYnVmZmVyLCBjb3VudCApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdldENsYXNzTmFtZTMyVyAgICAgIChVU0VSMzIuMjE3KQorICovCitJTlQzMiBHZXRDbGFzc05hbWUzMlcoIEhXTkQgaHduZCwgTFBXU1RSIGJ1ZmZlciwgSU5UMzIgY291bnQgKQoreworICAgIFdORCAqd25kUHRyOworICAgIGlmICghKHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGh3bmQpKSkgcmV0dXJuIDA7CisgICAgcmV0dXJuIEdsb2JhbEdldEF0b21OYW1lMzJXKCB3bmRQdHItPmNsYXNzLT5hdG9tTmFtZSwgYnVmZmVyLCBjb3VudCApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdldENsYXNzSW5mbzE2ICAgICAgKFVTRVIuNDA0KQorICovCitCT09MIEdldENsYXNzSW5mbzE2KCBISU5TVEFOQ0UxNiBoSW5zdGFuY2UsIFNFR1BUUiBuYW1lLCBXTkRDTEFTUzE2ICp3YyApCit7CisgICAgQVRPTSBhdG9tOwogICAgIENMQVNTICpjbGFzc1B0cjsKIAotICAgIGRwcmludGZfY2xhc3MoIHN0ZGRlYiwgIkdldENsYXNzSW5mbzogaEluc3RhbmNlPSUwNHggY2xhc3NOYW1lPSVzXG4iLAotCQkgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgSElXT1JEKG5hbWUpID8gKGNoYXIgKilQVFJfU0VHX1RPX0xJTihuYW1lKSA6ICIoaW50KSIgKTsKKyAgICBoSW5zdGFuY2UgPSBHZXRFeGVQdHIoIGhJbnN0YW5jZSApOworICAgIGlmICghKGF0b20gPSBHbG9iYWxGaW5kQXRvbTE2KCBuYW1lICkpIHx8CisgICAgICAgICEoY2xhc3NQdHIgPSBDTEFTU19GaW5kQ2xhc3NCeUF0b20oIGF0b20sIGhJbnN0YW5jZSApKSB8fAorICAgICAgICAoaEluc3RhbmNlICE9IGNsYXNzUHRyLT5oSW5zdGFuY2UpKSByZXR1cm4gRkFMU0U7CisgICAgd2MtPnN0eWxlICAgICAgICAgPSAoVUlOVDE2KWNsYXNzUHRyLT5zdHlsZTsKKyAgICB3Yy0+bHBmblduZFByb2MgICA9IGNsYXNzUHRyLT5scGZuV25kUHJvYzsKKyAgICB3Yy0+Y2JDbHNFeHRyYSAgICA9IChJTlQxNiljbGFzc1B0ci0+Y2JDbHNFeHRyYTsKKyAgICB3Yy0+Y2JXbmRFeHRyYSAgICA9IChJTlQxNiljbGFzc1B0ci0+Y2JXbmRFeHRyYTsKKyAgICB3Yy0+aEluc3RhbmNlICAgICA9IChISU5TVEFOQ0UxNiljbGFzc1B0ci0+aEluc3RhbmNlOworICAgIHdjLT5oSWNvbiAgICAgICAgID0gY2xhc3NQdHItPmhJY29uOworICAgIHdjLT5oQ3Vyc29yICAgICAgID0gY2xhc3NQdHItPmhDdXJzb3I7CisgICAgd2MtPmhickJhY2tncm91bmQgPSBjbGFzc1B0ci0+aGJyQmFja2dyb3VuZDsKKyAgICB3Yy0+bHBzekNsYXNzTmFtZSA9IChTRUdQVFIpMDsKKyAgICB3Yy0+bHBzek1lbnVOYW1lICA9IChTRUdQVFIpQ0xBU1NfR2V0TWVudU5hbWVBKCBjbGFzc1B0ciApOworICAgIGlmIChISVdPUkQod2MtPmxwc3pNZW51TmFtZSkpICAvKiBNYWtlIGl0IGEgU0VHUFRSICovCisgICAgICAgIHdjLT5scHN6TWVudU5hbWUgPSBTRUdQVFJfR0VUKCAoTFBTVFIpd2MtPmxwc3pNZW51TmFtZSApOworICAgIHJldHVybiBUUlVFOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdldENsYXNzSW5mbzMyQSAgICAgIChVU0VSMzIuMjEwKQorICovCitCT09MIEdldENsYXNzSW5mbzMyQSggSElOU1RBTkNFMzIgaEluc3RhbmNlLCBMUENTVFIgbmFtZSwgV05EQ0xBU1MzMkEgKndjICkKK3sKKyAgICBBVE9NIGF0b207CisgICAgQ0xBU1MgKmNsYXNzUHRyOworCisgICAgaEluc3RhbmNlID0gR2V0RXhlUHRyKCBoSW5zdGFuY2UgKTsgIC8qIEZJWE1FOiBub3QgbmVlZGVkIGluIFdpbjMyICovCisgICAgaWYgKCEoYXRvbSA9IEdsb2JhbEZpbmRBdG9tMzJBKCBuYW1lICkpIHx8CisgICAgICAgICEoY2xhc3NQdHIgPSBDTEFTU19GaW5kQ2xhc3NCeUF0b20oIGF0b20sIGhJbnN0YW5jZSApKSB8fAorICAgICAgICAoaEluc3RhbmNlICE9IGNsYXNzUHRyLT5oSW5zdGFuY2UpKSByZXR1cm4gRkFMU0U7CisgICAgd2MtPnN0eWxlICAgICAgICAgPSBjbGFzc1B0ci0+c3R5bGU7CisgICAgd2MtPmxwZm5XbmRQcm9jICAgPSAoV05EUFJPQzMyKWNsYXNzUHRyLT5scGZuV25kUHJvYzsKKyAgICB3Yy0+Y2JDbHNFeHRyYSAgICA9IGNsYXNzUHRyLT5jYkNsc0V4dHJhOworICAgIHdjLT5jYlduZEV4dHJhICAgID0gY2xhc3NQdHItPmNiV25kRXh0cmE7CisgICAgd2MtPmhJbnN0YW5jZSAgICAgPSBjbGFzc1B0ci0+aEluc3RhbmNlOworICAgIHdjLT5oSWNvbiAgICAgICAgID0gKEhJQ09OMzIpY2xhc3NQdHItPmhJY29uOworICAgIHdjLT5oQ3Vyc29yICAgICAgID0gKEhDVVJTT1IzMiljbGFzc1B0ci0+aEN1cnNvcjsKKyAgICB3Yy0+aGJyQmFja2dyb3VuZCA9IChIQlJVU0gzMiljbGFzc1B0ci0+aGJyQmFja2dyb3VuZDsKKyAgICB3Yy0+bHBzek1lbnVOYW1lICA9IENMQVNTX0dldE1lbnVOYW1lQSggY2xhc3NQdHIgKTsKKyAgICB3Yy0+bHBzekNsYXNzTmFtZSA9IE5VTEw7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgR2V0Q2xhc3NJbmZvMzJXICAgICAgKFVTRVIzMi4yMTMpCisgKi8KK0JPT0wgR2V0Q2xhc3NJbmZvMzJXKCBISU5TVEFOQ0UzMiBoSW5zdGFuY2UsIExQQ1dTVFIgbmFtZSwgV05EQ0xBU1MzMlcgKndjICkKK3sKKyAgICBBVE9NIGF0b207CisgICAgQ0xBU1MgKmNsYXNzUHRyOworCisgICAgaEluc3RhbmNlID0gR2V0RXhlUHRyKCBoSW5zdGFuY2UgKTsgIC8qIEZJWE1FOiBub3QgbmVlZGVkIGluIFdpbjMyICovCisgICAgaWYgKCEoYXRvbSA9IEdsb2JhbEZpbmRBdG9tMzJXKCBuYW1lICkpIHx8CisgICAgICAgICEoY2xhc3NQdHIgPSBDTEFTU19GaW5kQ2xhc3NCeUF0b20oIGF0b20sIGhJbnN0YW5jZSApKSB8fAorICAgICAgICAoaEluc3RhbmNlICE9IGNsYXNzUHRyLT5oSW5zdGFuY2UpKSByZXR1cm4gRkFMU0U7CisgICAgd2MtPnN0eWxlICAgICAgICAgPSBjbGFzc1B0ci0+c3R5bGU7CisgICAgd2MtPmxwZm5XbmRQcm9jICAgPSAoV05EUFJPQzMyKWNsYXNzUHRyLT5scGZuV25kUHJvYzsKKyAgICB3Yy0+Y2JDbHNFeHRyYSAgICA9IGNsYXNzUHRyLT5jYkNsc0V4dHJhOworICAgIHdjLT5jYlduZEV4dHJhICAgID0gY2xhc3NQdHItPmNiV25kRXh0cmE7CisgICAgd2MtPmhJbnN0YW5jZSAgICAgPSBjbGFzc1B0ci0+aEluc3RhbmNlOworICAgIHdjLT5oSWNvbiAgICAgICAgID0gKEhJQ09OMzIpY2xhc3NQdHItPmhJY29uOworICAgIHdjLT5oQ3Vyc29yICAgICAgID0gKEhDVVJTT1IzMiljbGFzc1B0ci0+aEN1cnNvcjsKKyAgICB3Yy0+aGJyQmFja2dyb3VuZCA9IChIQlJVU0gzMiljbGFzc1B0ci0+aGJyQmFja2dyb3VuZDsKKyAgICB3Yy0+bHBzek1lbnVOYW1lICA9IENMQVNTX0dldE1lbnVOYW1lVyggY2xhc3NQdHIgKTsKKyAgICB3Yy0+bHBzekNsYXNzTmFtZSA9IE5VTEw7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgR2V0Q2xhc3NJbmZvRXgxNiAgICAgIChVU0VSLjM5OCkKKyAqCisgKiBGSVhNRTogdGhpcyBpcyBqdXN0IGEgZ3Vlc3MsIEkgaGF2ZSBubyBpZGVhIGlmIEdldENsYXNzSW5mb0V4KCkgaXMgdGhlCisgKiBzYW1lIGluIFdpbjE2IGFzIGluIFdpbjMyLiAtLUFKCisgKi8KK0JPT0wgR2V0Q2xhc3NJbmZvRXgxNiggSElOU1RBTkNFMTYgaEluc3RhbmNlLCBTRUdQVFIgbmFtZSwgV05EQ0xBU1NFWDE2ICp3YyApCit7CisgICAgQVRPTSBhdG9tOworICAgIENMQVNTICpjbGFzc1B0cjsKIAogICAgIGhJbnN0YW5jZSA9IEdldEV4ZVB0ciggaEluc3RhbmNlICk7Ci0gICAgCi0gICAgaWYgKCEoY2xhc3NQdHIgPSBDTEFTU19GaW5kQ2xhc3NCeU5hbWUoIG5hbWUsIGhJbnN0YW5jZSApKSkgcmV0dXJuIEZBTFNFOwotICAgIGlmIChoSW5zdGFuY2UgJiYgKGhJbnN0YW5jZSAhPSBjbGFzc1B0ci0+aEluc3RhbmNlKSkgcmV0dXJuIEZBTFNFOworICAgIGlmICghKGF0b20gPSBHbG9iYWxGaW5kQXRvbTE2KCBuYW1lICkpIHx8CisgICAgICAgICEoY2xhc3NQdHIgPSBDTEFTU19GaW5kQ2xhc3NCeUF0b20oIGF0b20sIGhJbnN0YW5jZSApKSB8fAorICAgICAgICAoaEluc3RhbmNlICE9IGNsYXNzUHRyLT5oSW5zdGFuY2UpKSByZXR1cm4gRkFMU0U7CisgICAgd2MtPnN0eWxlICAgICAgICAgPSBjbGFzc1B0ci0+c3R5bGU7CisgICAgd2MtPmxwZm5XbmRQcm9jICAgPSBjbGFzc1B0ci0+bHBmblduZFByb2M7CisgICAgd2MtPmNiQ2xzRXh0cmEgICAgPSAoSU5UMTYpY2xhc3NQdHItPmNiQ2xzRXh0cmE7CisgICAgd2MtPmNiV25kRXh0cmEgICAgPSAoSU5UMTYpY2xhc3NQdHItPmNiV25kRXh0cmE7CisgICAgd2MtPmhJbnN0YW5jZSAgICAgPSAoSElOU1RBTkNFMTYpY2xhc3NQdHItPmhJbnN0YW5jZTsKKyAgICB3Yy0+aEljb24gICAgICAgICA9IGNsYXNzUHRyLT5oSWNvbjsKKyAgICB3Yy0+aEljb25TbSAgICAgICA9IGNsYXNzUHRyLT5oSWNvblNtOworICAgIHdjLT5oQ3Vyc29yICAgICAgID0gY2xhc3NQdHItPmhDdXJzb3I7CisgICAgd2MtPmhickJhY2tncm91bmQgPSBjbGFzc1B0ci0+aGJyQmFja2dyb3VuZDsKKyAgICB3Yy0+bHBzekNsYXNzTmFtZSA9IChTRUdQVFIpMDsKKyAgICB3Yy0+bHBzek1lbnVOYW1lICA9IChTRUdQVFIpQ0xBU1NfR2V0TWVudU5hbWVBKCBjbGFzc1B0ciApOworICAgIGlmIChISVdPUkQod2MtPmxwc3pNZW51TmFtZSkpICAvKiBNYWtlIGl0IGEgU0VHUFRSICovCisgICAgICAgIHdjLT5scHN6TWVudU5hbWUgPSBTRUdQVFJfR0VUKCAoTFBTVFIpd2MtPmxwc3pNZW51TmFtZSApOworICAgIHJldHVybiBUUlVFOworfQogCi0gICAgbHBXbmRDbGFzcy0+c3R5bGUgICAgICAgICA9IChVSU5UMTYpY2xhc3NQdHItPnN0eWxlOwotICAgIGxwV25kQ2xhc3MtPmxwZm5XbmRQcm9jICAgPSBjbGFzc1B0ci0+bHBmblduZFByb2M7Ci0gICAgbHBXbmRDbGFzcy0+Y2JDbHNFeHRyYSAgICA9IChJTlQxNiljbGFzc1B0ci0+Y2JDbHNFeHRyYTsKLSAgICBscFduZENsYXNzLT5jYlduZEV4dHJhICAgID0gKElOVDE2KWNsYXNzUHRyLT5jYlduZEV4dHJhOwotICAgIGxwV25kQ2xhc3MtPmhJbnN0YW5jZSAgICAgPSBjbGFzc1B0ci0+aEluc3RhbmNlOwotICAgIGxwV25kQ2xhc3MtPmhJY29uICAgICAgICAgPSBjbGFzc1B0ci0+aEljb247Ci0gICAgbHBXbmRDbGFzcy0+aEN1cnNvciAgICAgICA9IGNsYXNzUHRyLT5oQ3Vyc29yOwotICAgIGxwV25kQ2xhc3MtPmhickJhY2tncm91bmQgPSBjbGFzc1B0ci0+aGJyQmFja2dyb3VuZDsKLSAgICBscFduZENsYXNzLT5scHN6TWVudU5hbWUgID0gY2xhc3NQdHItPmxwc3pNZW51TmFtZTsKLSAgICBscFduZENsYXNzLT5scHN6Q2xhc3NOYW1lID0gMDsKIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgR2V0Q2xhc3NJbmZvRXgzMkEgICAgICAoVVNFUjMyLjIxMSkKKyAqLworQk9PTCBHZXRDbGFzc0luZm9FeDMyQSggSElOU1RBTkNFMzIgaEluc3RhbmNlLCBMUENTVFIgbmFtZSwgV05EQ0xBU1NFWDMyQSAqd2MgKQoreworICAgIEFUT00gYXRvbTsKKyAgICBDTEFTUyAqY2xhc3NQdHI7CisKKyAgICBoSW5zdGFuY2UgPSBHZXRFeGVQdHIoIGhJbnN0YW5jZSApOyAgLyogRklYTUU6IG5vdCBuZWVkZWQgaW4gV2luMzIgKi8KKyAgICBpZiAoIShhdG9tID0gR2xvYmFsRmluZEF0b20zMkEoIG5hbWUgKSkgfHwKKyAgICAgICAgIShjbGFzc1B0ciA9IENMQVNTX0ZpbmRDbGFzc0J5QXRvbSggYXRvbSwgaEluc3RhbmNlICkpIHx8CisgICAgICAgIChoSW5zdGFuY2UgIT0gY2xhc3NQdHItPmhJbnN0YW5jZSkpIHJldHVybiBGQUxTRTsKKyAgICB3Yy0+c3R5bGUgICAgICAgICA9IGNsYXNzUHRyLT5zdHlsZTsKKyAgICB3Yy0+bHBmblduZFByb2MgICA9IChXTkRQUk9DMzIpY2xhc3NQdHItPmxwZm5XbmRQcm9jOworICAgIHdjLT5jYkNsc0V4dHJhICAgID0gY2xhc3NQdHItPmNiQ2xzRXh0cmE7CisgICAgd2MtPmNiV25kRXh0cmEgICAgPSBjbGFzc1B0ci0+Y2JXbmRFeHRyYTsKKyAgICB3Yy0+aEluc3RhbmNlICAgICA9IGNsYXNzUHRyLT5oSW5zdGFuY2U7CisgICAgd2MtPmhJY29uICAgICAgICAgPSAoSElDT04zMiljbGFzc1B0ci0+aEljb247CisgICAgd2MtPmhJY29uU20gICAgICAgPSAoSElDT04zMiljbGFzc1B0ci0+aEljb25TbTsKKyAgICB3Yy0+aEN1cnNvciAgICAgICA9IChIQ1VSU09SMzIpY2xhc3NQdHItPmhDdXJzb3I7CisgICAgd2MtPmhickJhY2tncm91bmQgPSAoSEJSVVNIMzIpY2xhc3NQdHItPmhickJhY2tncm91bmQ7CisgICAgd2MtPmxwc3pNZW51TmFtZSAgPSBDTEFTU19HZXRNZW51TmFtZUEoIGNsYXNzUHRyICk7CisgICAgd2MtPmxwc3pDbGFzc05hbWUgPSBOVUxMOworICAgIHJldHVybiBUUlVFOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdldENsYXNzSW5mb0V4MzJXICAgICAgKFVTRVIzMi4yMTIpCisgKi8KK0JPT0wgR2V0Q2xhc3NJbmZvRXgzMlcoIEhJTlNUQU5DRTMyIGhJbnN0YW5jZSwgTFBDV1NUUiBuYW1lLCBXTkRDTEFTU0VYMzJXICp3YykKK3sKKyAgICBBVE9NIGF0b207CisgICAgQ0xBU1MgKmNsYXNzUHRyOworCisgICAgaEluc3RhbmNlID0gR2V0RXhlUHRyKCBoSW5zdGFuY2UgKTsgIC8qIEZJWE1FOiBub3QgbmVlZGVkIGluIFdpbjMyICovCisgICAgaWYgKCEoYXRvbSA9IEdsb2JhbEZpbmRBdG9tMzJXKCBuYW1lICkpIHx8CisgICAgICAgICEoY2xhc3NQdHIgPSBDTEFTU19GaW5kQ2xhc3NCeUF0b20oIGF0b20sIGhJbnN0YW5jZSApKSB8fAorICAgICAgICAoaEluc3RhbmNlICE9IGNsYXNzUHRyLT5oSW5zdGFuY2UpKSByZXR1cm4gRkFMU0U7CisgICAgd2MtPnN0eWxlICAgICAgICAgPSBjbGFzc1B0ci0+c3R5bGU7CisgICAgd2MtPmxwZm5XbmRQcm9jICAgPSAoV05EUFJPQzMyKWNsYXNzUHRyLT5scGZuV25kUHJvYzsKKyAgICB3Yy0+Y2JDbHNFeHRyYSAgICA9IGNsYXNzUHRyLT5jYkNsc0V4dHJhOworICAgIHdjLT5jYlduZEV4dHJhICAgID0gY2xhc3NQdHItPmNiV25kRXh0cmE7CisgICAgd2MtPmhJbnN0YW5jZSAgICAgPSBjbGFzc1B0ci0+aEluc3RhbmNlOworICAgIHdjLT5oSWNvbiAgICAgICAgID0gKEhJQ09OMzIpY2xhc3NQdHItPmhJY29uOworICAgIHdjLT5oSWNvblNtICAgICAgID0gKEhJQ09OMzIpY2xhc3NQdHItPmhJY29uU207CisgICAgd2MtPmhDdXJzb3IgICAgICAgPSAoSENVUlNPUjMyKWNsYXNzUHRyLT5oQ3Vyc29yOworICAgIHdjLT5oYnJCYWNrZ3JvdW5kID0gKEhCUlVTSDMyKWNsYXNzUHRyLT5oYnJCYWNrZ3JvdW5kOworICAgIHdjLT5scHN6TWVudU5hbWUgID0gQ0xBU1NfR2V0TWVudU5hbWVXKCBjbGFzc1B0ciApOworICAgIHdjLT5scHN6Q2xhc3NOYW1lID0gTlVMTDsKICAgICByZXR1cm4gVFJVRTsKIH0KIApAQCAtNDk2LDcgKzk5OCw3IEBACiAgICAgfQogICAgIHBDbGFzc0VudHJ5LT5oSW5zdCA9IGNsYXNzLT5oSW5zdGFuY2U7CiAgICAgcENsYXNzRW50cnktPndOZXh0Kys7Ci0gICAgR2xvYmFsR2V0QXRvbU5hbWUoIGNsYXNzLT5hdG9tTmFtZSwgcENsYXNzRW50cnktPnN6Q2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocENsYXNzRW50cnktPnN6Q2xhc3NOYW1lKSApOworICAgIEdsb2JhbEdldEF0b21OYW1lMzJBKCBjbGFzcy0+YXRvbU5hbWUsIHBDbGFzc0VudHJ5LT5zekNsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHBDbGFzc0VudHJ5LT5zekNsYXNzTmFtZSkgKTsKICAgICByZXR1cm4gVFJVRTsKIH0KZGlmZiAtLWdpdCBhL3dpbmRvd3MvZGNlLmMgYi93aW5kb3dzL2RjZS5jCmluZGV4IDM1OWNlOWIuLjU3Mjg0MzQgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvZGNlLmMKKysrIGIvd2luZG93cy9kY2UuYwpAQCAtOTQsNyArOTQsNyBAQAogICogd2luZG93IGFyZWEgY2xpcHBlZCBieSB0aGUgY2xpZW50IGFyZWEgb2YgYWxsIGFuY2VzdG9ycy4KICAqIFJldHVybiBGQUxTRSBpZiB0aGUgdmlzaWJsZSByZWdpb24gaXMgZW1wdHkuCiAgKi8KLXN0YXRpYyBCT09MIERDRV9HZXRWaXNSZWN0KCBXTkQgKnduZFB0ciwgQk9PTCBjbGllbnRBcmVhLCBSRUNUICpscHJlY3QgKQorc3RhdGljIEJPT0wgRENFX0dldFZpc1JlY3QoIFdORCAqd25kUHRyLCBCT09MIGNsaWVudEFyZWEsIFJFQ1QxNiAqbHByZWN0ICkKIHsKICAgICBpbnQgeG9mZnNldCwgeW9mZnNldDsKIApAQCAtMTA0LDcgKzEwNCw3IEBACiAKICAgICBpZiAoISh3bmRQdHItPmR3U3R5bGUgJiBXU19WSVNJQkxFKSB8fCAod25kUHRyLT5mbGFncyAmIFdJTl9OT19SRURSQVcpKQogICAgIHsKLSAgICAgICAgU2V0UmVjdEVtcHR5KCBscHJlY3QgKTsgIC8qIENsaXAgZXZlcnl0aGluZyAqLworICAgICAgICBTZXRSZWN0RW1wdHkxNiggbHByZWN0ICk7ICAvKiBDbGlwIGV2ZXJ5dGhpbmcgKi8KICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KIApAQCAtMTE1LDIwICsxMTUsMjAgQEAKICAgICAgICAgICAgICh3bmRQdHItPmZsYWdzICYgV0lOX05PX1JFRFJBVykgfHwKICAgICAgICAgICAgICh3bmRQdHItPmR3U3R5bGUgJiBXU19JQ09OSUMpKQogICAgICAgICB7Ci0gICAgICAgICAgICBTZXRSZWN0RW1wdHkoIGxwcmVjdCApOyAgLyogQ2xpcCBldmVyeXRoaW5nICovCisgICAgICAgICAgICBTZXRSZWN0RW1wdHkxNiggbHByZWN0ICk7ICAvKiBDbGlwIGV2ZXJ5dGhpbmcgKi8KICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogCXhvZmZzZXQgKz0gd25kUHRyLT5yZWN0Q2xpZW50LmxlZnQ7CiAJeW9mZnNldCArPSB3bmRQdHItPnJlY3RDbGllbnQudG9wOwotCU9mZnNldFJlY3QoIGxwcmVjdCwgd25kUHRyLT5yZWN0Q2xpZW50LmxlZnQsCi0JCSAgICB3bmRQdHItPnJlY3RDbGllbnQudG9wICk7CisJT2Zmc2V0UmVjdDE2KCBscHJlY3QsIHduZFB0ci0+cmVjdENsaWVudC5sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgIHduZFB0ci0+cmVjdENsaWVudC50b3AgKTsKIAogCSAgLyogV2FybmluZyEhIHdlIGFzc3VtZSB0aGF0IEludGVyc2VjdFJlY3QoKSBoYW5kbGVzIHRoZSBjYXNlICovCiAJICAvKiB3aGVyZSB0aGUgZGVzdGluYXRpb24gaXMgdGhlIHNhbWUgYXMgb25lIG9mIHRoZSBzb3VyY2VzLiAgKi8KLQlpZiAoIUludGVyc2VjdFJlY3QoIGxwcmVjdCwgbHByZWN0LCAmd25kUHRyLT5yZWN0Q2xpZW50ICkpCisJaWYgKCFJbnRlcnNlY3RSZWN0MTYoIGxwcmVjdCwgbHByZWN0LCAmd25kUHRyLT5yZWN0Q2xpZW50ICkpCiAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvKiBWaXNpYmxlIHJlY3RhbmdsZSBpcyBlbXB0eSAqLwogICAgIH0KLSAgICBPZmZzZXRSZWN0KCBscHJlY3QsIC14b2Zmc2V0LCAteW9mZnNldCApOworICAgIE9mZnNldFJlY3QxNiggbHByZWN0LCAteG9mZnNldCwgLXlvZmZzZXQgKTsKICAgICByZXR1cm4gVFJVRTsKIH0KIApAQCAtMTgxLDcgKzE4MSw3IEBACiAgKi8KIEhSR04gRENFX0dldFZpc1JnbiggSFdORCBod25kLCBXT1JEIGZsYWdzICkKIHsKLSAgICBSRUNUIHJlY3Q7CisgICAgUkVDVDE2IHJlY3Q7CiAgICAgSFJHTiBocmduOwogICAgIGludCB4b2Zmc2V0LCB5b2Zmc2V0OwogICAgIFdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKQEAgLTE5Miw3ICsxOTIsNyBAQAogICAgIHsKICAgICAgICAgcmV0dXJuIENyZWF0ZVJlY3RSZ24oIDAsIDAsIDAsIDAgKTsgIC8qIFZpc2libGUgcmVnaW9uIGlzIGVtcHR5ICovCiAgICAgfQotICAgIGlmICghKGhyZ24gPSBDcmVhdGVSZWN0UmduSW5kaXJlY3QoICZyZWN0ICkpKSByZXR1cm4gMDsKKyAgICBpZiAoIShocmduID0gQ3JlYXRlUmVjdFJnbkluZGlyZWN0MTYoICZyZWN0ICkpKSByZXR1cm4gMDsKIAogICAgICAgLyogQ2xpcCBhbGwgY2hpbGRyZW4gZnJvbSB0aGUgdmlzaWJsZSByZWdpb24gKi8KIApkaWZmIC0tZ2l0IGEvd2luZG93cy9kZWZkbGcuYyBiL3dpbmRvd3MvZGVmZGxnLmMKaW5kZXggZmE2ZjI3NS4uNmZjZmUzOSAxMDA2NDQKLS0tIGEvd2luZG93cy9kZWZkbGcuYworKysgYi93aW5kb3dzL2RlZmRsZy5jCkBAIC05NywxMSArOTcsMTEgQEAKICAgICB7CiAgICAgICAgIEhXTkQgaHduZE9sZCA9IEdldERsZ0l0ZW0oIGh3bmREbGcsIGRsZ0luZm8tPm1zZ1Jlc3VsdCApOwogICAgICAgICBpZiAoU2VuZE1lc3NhZ2UoIGh3bmRPbGQsIFdNX0dFVERMR0NPREUsIDAsIDAgKSAmIERMR0NfREVGUFVTSEJVVFRPTikKLSAgICAgICAgICAgIFNlbmRNZXNzYWdlKCBod25kT2xkLCBCTV9TRVRTVFlMRSwgQlNfUFVTSEJVVFRPTiwgVFJVRSApOworICAgICAgICAgICAgU2VuZE1lc3NhZ2UoIGh3bmRPbGQsIEJNX1NFVFNUWUxFMTYsIEJTX1BVU0hCVVRUT04sIFRSVUUgKTsKICAgICB9CiAgICAgaWYgKGh3bmROZXcpCiAgICAgewotICAgICAgICBTZW5kTWVzc2FnZSggaHduZE5ldywgQk1fU0VUU1RZTEUsIEJTX0RFRlBVU0hCVVRUT04sIFRSVUUgKTsKKyAgICAgICAgU2VuZE1lc3NhZ2UoIGh3bmROZXcsIEJNX1NFVFNUWUxFMTYsIEJTX0RFRlBVU0hCVVRUT04sIFRSVUUgKTsKICAgICAgICAgZGxnSW5mby0+bXNnUmVzdWx0ID0gR2V0RGxnQ3RybElEKCBod25kTmV3ICk7CiAgICAgfQogICAgIGVsc2UgZGxnSW5mby0+bXNnUmVzdWx0ID0gMDsKQEAgLTEyNSw4ICsxMjUsOCBAQAogICAgIGlmIChkbGdJbmZvLT5kbGdQcm9jKQogICAgIHsKIAkgIC8qIENhbGwgZGlhbG9nIHByb2NlZHVyZSAqLwotCXJlc3VsdCA9IChCT09MKUNhbGxXaW5kb3dQcm9jKCBkbGdJbmZvLT5kbGdQcm9jLCBod25kLCAKLQkJCQkgICAgICAgbXNnLCB3UGFyYW0sIGxQYXJhbSApOworCXJlc3VsdCA9IChCT09MKUNhbGxXaW5kb3dQcm9jMTYoIGRsZ0luZm8tPmRsZ1Byb2MsIGh3bmQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2csIHdQYXJhbSwgbFBhcmFtICk7CiAKIAkgIC8qIENoZWNrIGlmIHdpbmRvdyBkZXN0cm95ZWQgYnkgZGlhbG9nIHByb2NlZHVyZSAqLwogCXduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICk7CmRpZmYgLS1naXQgYS93aW5kb3dzL2RlZnduZC5jIGIvd2luZG93cy9kZWZ3bmQuYwppbmRleCBkZmE2NDc4Li45ZWM4MTA0IDEwMDY0NAotLS0gYS93aW5kb3dzL2RlZnduZC5jCisrKyBiL3dpbmRvd3MvZGVmd25kLmMKQEAgLTg1LDI2ICs4NSwyMiBAQAogICAgIHsKICAgICBjYXNlIFdNX05DQ1JFQVRFOgogCXsKLQkgICAgQ1JFQVRFU1RSVUNUICpjcmVhdGVTdHJ1Y3QgPSAoQ1JFQVRFU1RSVUNUKilQVFJfU0VHX1RPX0xJTihsUGFyYW0pOwotCSAgICBpZiAoY3JlYXRlU3RydWN0LT5scHN6TmFtZSkKLQkJREVGV05EX1NldFRleHQoIHduZFB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBTVFIpUFRSX1NFR19UT19MSU4oY3JlYXRlU3RydWN0LT5scHN6TmFtZSkgKTsKKwkgICAgQ1JFQVRFU1RSVUNUMTYgKmNzID0gKENSRUFURVNUUlVDVDE2ICopUFRSX1NFR19UT19MSU4obFBhcmFtKTsKKwkgICAgaWYgKGNzLT5scHN6TmFtZSkKKwkJREVGV05EX1NldFRleHQoIHduZFB0ciwgKExQU1RSKVBUUl9TRUdfVE9fTElOKGNzLT5scHN6TmFtZSkgKTsKIAkgICAgcmV0dXJuIDE7CiAJfQogCiAgICAgY2FzZSBXTV9OQ0NBTENTSVpFOgogCXJldHVybiBOQ19IYW5kbGVOQ0NhbGNTaXplKCBod25kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE5DQ0FMQ1NJWkVfUEFSQU1TICopUFRSX1NFR19UT19MSU4obFBhcmFtKSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChOQ0NBTENTSVpFX1BBUkFNUzE2ICopUFRSX1NFR19UT19MSU4obFBhcmFtKSApOwogCiAgICAgY2FzZSBXTV9QQUlOVElDT046IAogICAgIGNhc2UgV01fTkNQQUlOVDoKIAlyZXR1cm4gTkNfSGFuZGxlTkNQYWludCggaHduZCwgKEhSR04pd1BhcmFtICk7CiAKICAgICBjYXNlIFdNX05DSElUVEVTVDoKLSAgICAgICAgewotICAgICAgICAgICAgUE9JTlQgcHQgPSB7IExPV09SRChsUGFyYW0pLCBISVdPUkQobFBhcmFtKSB9OwotICAgICAgICAgICAgcmV0dXJuIE5DX0hhbmRsZU5DSGl0VGVzdCggaHduZCwgcHQgKTsKLSAgICAgICAgfQorICAgICAgICByZXR1cm4gTkNfSGFuZGxlTkNIaXRUZXN0KCBod25kLCBNQUtFUE9JTlQxNihsUGFyYW0pICk7CiAKICAgICBjYXNlIFdNX05DTEJVVFRPTkRPV046CiAJcmV0dXJuIE5DX0hhbmRsZU5DTEJ1dHRvbkRvd24oIGh3bmQsIHdQYXJhbSwgbFBhcmFtICk7CkBAIC0xMjUsMTYgKzEyMSwxNiBAQAogCQogICAgIGNhc2UgV01fUEFJTlQ6CiAJewotCSAgICBQQUlOVFNUUlVDVCBwYWludHN0cnVjdDsKLQkgICAgQmVnaW5QYWludCggaHduZCwgJnBhaW50c3RydWN0ICk7Ci0JICAgIEVuZFBhaW50KCBod25kLCAmcGFpbnRzdHJ1Y3QgKTsKKwkgICAgUEFJTlRTVFJVQ1QxNiBwYWludHN0cnVjdDsKKwkgICAgQmVnaW5QYWludDE2KCBod25kLCAmcGFpbnRzdHJ1Y3QgKTsKKwkgICAgRW5kUGFpbnQxNiggaHduZCwgJnBhaW50c3RydWN0ICk7CiAJICAgIHJldHVybiAwOwogCX0KIAogICAgIGNhc2UgV01fU0VUUkVEUkFXOgogICAgICAgICBpZiAoIXdQYXJhbSkKICAgICAgICAgewotICAgICAgICAgICAgVmFsaWRhdGVSZWN0KCBod25kLCBOVUxMICk7CisgICAgICAgICAgICBWYWxpZGF0ZVJlY3QzMiggaHduZCwgTlVMTCApOwogICAgICAgICAgICAgd25kUHRyLT5mbGFncyB8PSBXSU5fTk9fUkVEUkFXOwogICAgICAgICB9CiAgICAgICAgIGVsc2Ugd25kUHRyLT5mbGFncyAmPSB+V0lOX05PX1JFRFJBVzsKQEAgLTE1OSwxMiArMTU1LDEyIEBACiAJYnJlYWs7CiAKICAgICBjYXNlIFdNX1dJTkRPV1BPU0NIQU5HSU5HOgotCXJldHVybiBXSU5QT1NfSGFuZGxlV2luZG93UG9zQ2hhbmdpbmcoIChXSU5ET1dQT1MgKilQVFJfU0VHX1RPX0xJTihsUGFyYW0pICk7CisJcmV0dXJuIFdJTlBPU19IYW5kbGVXaW5kb3dQb3NDaGFuZ2luZyggKFdJTkRPV1BPUzE2ICopUFRSX1NFR19UT19MSU4obFBhcmFtKSApOwogCiAgICAgY2FzZSBXTV9XSU5ET1dQT1NDSEFOR0VEOgogCXsKLQkgICAgV0lORE9XUE9TICogd2luUG9zID0gKFdJTkRPV1BPUyAqKVBUUl9TRUdfVE9fTElOKGxQYXJhbSk7Ci0JICAgIFdQQVJBTQl3cCAgICAgPSBTSVpFX1JFU1RPUkVEOworCSAgICBXSU5ET1dQT1MxNiAqIHdpblBvcyA9IChXSU5ET1dQT1MxNiAqKVBUUl9TRUdfVE9fTElOKGxQYXJhbSk7CisJICAgIFdQQVJBTTE2IHdwID0gU0laRV9SRVNUT1JFRDsKIAogCSAgICBpZiAoISh3aW5Qb3MtPmZsYWdzICYgU1dQX05PQ0xJRU5UTU9WRSkpCiAJCVNlbmRNZXNzYWdlKCBod25kLCBXTV9NT1ZFLCAwLApAQCAtMjc3LDEwICsyNzMsOCBAQAogCXJldHVybiBOQ19IYW5kbGVTZXRDdXJzb3IoIGh3bmQsIHdQYXJhbSwgbFBhcmFtICk7CiAKICAgICBjYXNlIFdNX1NZU0NPTU1BTkQ6Ci0JewotICAgICAgICAgIFBPSU5UIHB0ID0geyBMT1dPUkQobFBhcmFtKSwgSElXT1JEKGxQYXJhbSkgfTsKLSAgICAgICAgICByZXR1cm4gTkNfSGFuZGxlU3lzQ29tbWFuZCggaHduZCwgd1BhcmFtLCBwdCApOwotCX0KKyAgICAgICAgcmV0dXJuIE5DX0hhbmRsZVN5c0NvbW1hbmQoIGh3bmQsIHdQYXJhbSwgTUFLRVBPSU5UMTYobFBhcmFtKSApOworCiAgICAgY2FzZSBXTV9LRVlET1dOOgogCiAJaWYod1BhcmFtID09IFZLX0YxMCkgaUYxMEtleSA9IFZLX0YxMDsKZGlmZiAtLWdpdCBhL3dpbmRvd3MvZGlhbG9nLmMgYi93aW5kb3dzL2RpYWxvZy5jCmluZGV4IDMzYTkzYjQuLmY4OTEzYjAgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvZGlhbG9nLmMKKysrIGIvd2luZG93cy9kaWFsb2cuYwpAQCAtMTAsNiArMTAsNyBAQAogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJkaWFsb2cuaCIKKyNpbmNsdWRlICJoZWFwLmgiCiAjaW5jbHVkZSAid2luLmgiCiAjaW5jbHVkZSAibGR0LmgiCiAjaW5jbHVkZSAic3RhY2tmcmFtZS5oIgpAQCAtMjUyLDcgKzI1Myw3IEBACiAgICAgSE1FTlUgaE1lbnUgPSAwOwogICAgIEhGT05UIGhGb250ID0gMDsKICAgICBIV05EIGh3bmQsIGh3bmRDdHJsOwotICAgIFJFQ1QgcmVjdDsKKyAgICBSRUNUMTYgcmVjdDsKICAgICBXTkQgKiB3bmRQdHI7CiAgICAgaW50IGk7CiAgICAgRExHVEVNUExBVEUgdGVtcGxhdGU7CkBAIC0zMDYsOCArMzA3LDggQEAKICAgICByZWN0LnJpZ2h0ID0gdGVtcGxhdGUuY3ggKiB4VW5pdCAvIDQ7CiAgICAgcmVjdC5ib3R0b20gPSB0ZW1wbGF0ZS5jeSAqIHlVbml0IC8gODsKICAgICBpZiAodGVtcGxhdGUuc3R5bGUgJiBEU19NT0RBTEZSQU1FKSBleFN0eWxlIHw9IFdTX0VYX0RMR01PREFMRlJBTUU7Ci0gICAgQWRqdXN0V2luZG93UmVjdEV4KCAmcmVjdCwgdGVtcGxhdGUuc3R5bGUsIAotCQkJaE1lbnUgPyBUUlVFIDogRkFMU0UgLCBleFN0eWxlICk7CisgICAgQWRqdXN0V2luZG93UmVjdEV4MTYoICZyZWN0LCB0ZW1wbGF0ZS5zdHlsZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhNZW51ID8gVFJVRSA6IEZBTFNFICwgZXhTdHlsZSApOwogICAgIHJlY3QucmlnaHQgLT0gcmVjdC5sZWZ0OwogICAgIHJlY3QuYm90dG9tIC09IHJlY3QudG9wOwogCkBAIC0zMTgsNyArMzE5LDcgQEAKICAgICAgICAgcmVjdC5sZWZ0ICs9IHRlbXBsYXRlLnggKiB4VW5pdCAvIDQ7CiAgICAgICAgIHJlY3QudG9wICs9IHRlbXBsYXRlLnkgKiB5VW5pdCAvIDg7CiAgICAgICAgIGlmICghKHRlbXBsYXRlLnN0eWxlICYgRFNfQUJTQUxJR04pKQotICAgICAgICAgICAgQ2xpZW50VG9TY3JlZW4oIG93bmVyLCAoUE9JTlQgKikmcmVjdCApOworICAgICAgICAgICAgQ2xpZW50VG9TY3JlZW4xNiggb3duZXIsIChQT0lOVDE2ICopJnJlY3QgKTsKICAgICB9CiAKICAgICBod25kID0gQ3JlYXRlV2luZG93RXgxNiggZXhTdHlsZSwgdGVtcGxhdGUuY2xhc3NOYW1lLCB0ZW1wbGF0ZS5jYXB0aW9uLCAKQEAgLTQyNSw3ICs0MjYsNyBAQAogICAgICAgICAgICAgICAvKiBJZiB0aGVyZSdzIGFscmVhZHkgYSBkZWZhdWx0IHB1c2gtYnV0dG9uLCBzZXQgaXQgYmFjayAqLwogICAgICAgICAgICAgICAvKiB0byBub3JtYWwgYW5kIHVzZSB0aGlzIG9uZSBpbnN0ZWFkLiAqLwogICAgICAgICAgICAgaWYgKGh3bmREZWZCdXR0b24pCi0gICAgICAgICAgICAgICAgU2VuZE1lc3NhZ2UoIGh3bmREZWZCdXR0b24sIEJNX1NFVFNUWUxFLCBCU19QVVNIQlVUVE9OLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgU2VuZE1lc3NhZ2UoaHduZERlZkJ1dHRvbiwgQk1fU0VUU1RZTEUxNiwgQlNfUFVTSEJVVFRPTixGQUxTRSk7CiAgICAgICAgICAgICBod25kRGVmQnV0dG9uID0gaHduZEN0cmw7CiAgICAgICAgICAgICBkbGdJbmZvLT5tc2dSZXN1bHQgPSBHZXRXaW5kb3dXb3JkKCBod25kQ3RybCwgR1dXX0lEICk7CiAgICAgICAgIH0KQEAgLTczMSwxMSArNzMyLDEzIEBACiAgKi8KIHZvaWQgU2V0RGxnSXRlbUludCggSFdORCBod25kLCBXT1JEIGlkLCBXT1JEIHZhbHVlLCBCT09MIGZTaWduZWQgKQogewotICAgIGNoYXIgc3RyWzIwXTsKKyAgICBjaGFyICpzdHIgPSAoY2hhciAqKVNFR1BUUl9BTExPQyggMjAgKiBzaXplb2YoY2hhcikgKTsKIAorICAgIGlmICghc3RyKSByZXR1cm47CiAgICAgaWYgKGZTaWduZWQpIHNwcmludGYoIHN0ciwgIiVkIiwgKGludCl2YWx1ZSApOwogICAgIGVsc2Ugc3ByaW50Ziggc3RyLCAiJXUiLCB2YWx1ZSApOwotICAgIFNlbmREbGdJdGVtTWVzc2FnZSggaHduZCwgaWQsIFdNX1NFVFRFWFQsIDAsIChMUEFSQU0pTUFLRV9TRUdQVFIoc3RyKSApOworICAgIFNlbmREbGdJdGVtTWVzc2FnZSggaHduZCwgaWQsIFdNX1NFVFRFWFQsIDAsIChMUEFSQU0pU0VHUFRSX0dFVChzdHIpICk7CisgICAgU0VHUFRSX0ZSRUUoc3RyKTsKIH0KIAogCkBAIC03NDQsMTEgKzc0NywxMiBAQAogICovCiBXT1JEIEdldERsZ0l0ZW1JbnQoIEhXTkQgaHduZCwgV09SRCBpZCwgQk9PTCAqIHRyYW5zbGF0ZWQsIEJPT0wgZlNpZ25lZCApCiB7Ci0gICAgY2hhciBzdHJbMzBdOworICAgIGNoYXIgKnN0cjsKICAgICBsb25nIHJlc3VsdCA9IDA7CiAgICAgCiAgICAgaWYgKHRyYW5zbGF0ZWQpICp0cmFuc2xhdGVkID0gRkFMU0U7Ci0gICAgaWYgKFNlbmREbGdJdGVtTWVzc2FnZSggaHduZCwgaWQsIFdNX0dFVFRFWFQsIDMwLCAoTFBBUkFNKU1BS0VfU0VHUFRSKHN0cikgKSkKKyAgICBpZiAoIShzdHIgPSAoY2hhciAqKVNFR1BUUl9BTExPQyggMzAgKiBzaXplb2YoY2hhcikgKSkpIHJldHVybiAwOworICAgIGlmIChTZW5kRGxnSXRlbU1lc3NhZ2UoIGh3bmQsIGlkLCBXTV9HRVRURVhULCAzMCwgKExQQVJBTSlTRUdQVFJfR0VUKHN0cikpKQogICAgIHsKIAljaGFyICogZW5kcHRyOwogCXJlc3VsdCA9IHN0cnRvbCggc3RyLCAmZW5kcHRyLCAxMCApOwpAQCAtNzY2LDYgKzc3MCw3IEBACiAJICAgIH0KIAl9CiAgICAgfQorICAgIFNFR1BUUl9GUkVFKHN0cik7CiAgICAgcmV0dXJuIChXT1JEKXJlc3VsdDsKIH0KIApAQCAtNzc1LDcgKzc4MCw3IEBACiAgKi8KIEJPT0wgQ2hlY2tEbGdCdXR0b24oIEhXTkQgaHduZCwgSU5UIGlkLCBVSU5UIGNoZWNrICkKIHsKLSAgICBTZW5kRGxnSXRlbU1lc3NhZ2UoIGh3bmQsIGlkLCBCTV9TRVRDSEVDSywgY2hlY2ssIDAgKTsKKyAgICBTZW5kRGxnSXRlbU1lc3NhZ2UoIGh3bmQsIGlkLCBCTV9TRVRDSEVDSzE2LCBjaGVjaywgMCApOwogICAgIHJldHVybiBUUlVFOwogfQogCkBAIC03ODUsNyArNzkwLDcgQEAKICAqLwogV09SRCBJc0RsZ0J1dHRvbkNoZWNrZWQoIEhXTkQgaHduZCwgV09SRCBpZCApCiB7Ci0gICAgcmV0dXJuIChXT1JEKVNlbmREbGdJdGVtTWVzc2FnZSggaHduZCwgaWQsIEJNX0dFVENIRUNLLCAwLCAwICk7CisgICAgcmV0dXJuIChXT1JEKVNlbmREbGdJdGVtTWVzc2FnZSggaHduZCwgaWQsIEJNX0dFVENIRUNLMTYsIDAsIDAgKTsKIH0KIAogCkBAIC04MDUsNyArODEwLDcgQEAKICAgICAgICAgbGFzdElEID0gZmlyc3RJRDsgIC8qIEJ1dHRvbnMgYXJlIGluIHJldmVyc2Ugb3JkZXIgKi8KICAgICB3aGlsZSAocFduZCkKICAgICB7Ci0JU2VuZE1lc3NhZ2UocFduZC0+aHduZFNlbGYsIEJNX1NFVENIRUNLLCAocFduZC0+d0lEbWVudSA9PSBjaGVja0lEKSwwKTsKKwlTZW5kTWVzc2FnZShwV25kLT5od25kU2VsZixCTV9TRVRDSEVDSzE2LChwV25kLT53SURtZW51ID09IGNoZWNrSUQpLDApOwogICAgICAgICBpZiAocFduZC0+d0lEbWVudSA9PSBsYXN0SUQpIGJyZWFrOwogCXBXbmQgPSBwV25kLT5uZXh0OwogICAgIH0KQEAgLTgyMyw5ICs4MjgsMjUgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBNYXBEaWFsb2dSZWN0ICAgKFVTRVIuMTAzKQorICogICAgICAgICAgIE1hcERpYWxvZ1JlY3QxNiAgIChVU0VSLjEwMykKICAqLwotdm9pZCBNYXBEaWFsb2dSZWN0KCBIV05EIGh3bmQsIExQUkVDVCByZWN0ICkKK3ZvaWQgTWFwRGlhbG9nUmVjdDE2KCBIV05EMTYgaHduZCwgTFBSRUNUMTYgcmVjdCApCit7CisgICAgRElBTE9HSU5GTyAqIGRsZ0luZm87CisgICAgV05EICogd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKKyAgICBpZiAoIXduZFB0cikgcmV0dXJuOworICAgIGRsZ0luZm8gPSAoRElBTE9HSU5GTyAqKXduZFB0ci0+d0V4dHJhOworICAgIHJlY3QtPmxlZnQgICA9IChyZWN0LT5sZWZ0ICogZGxnSW5mby0+eEJhc2VVbml0KSAvIDQ7CisgICAgcmVjdC0+cmlnaHQgID0gKHJlY3QtPnJpZ2h0ICogZGxnSW5mby0+eEJhc2VVbml0KSAvIDQ7CisgICAgcmVjdC0+dG9wICAgID0gKHJlY3QtPnRvcCAqIGRsZ0luZm8tPnlCYXNlVW5pdCkgLyA4OworICAgIHJlY3QtPmJvdHRvbSA9IChyZWN0LT5ib3R0b20gKiBkbGdJbmZvLT55QmFzZVVuaXQpIC8gODsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBNYXBEaWFsb2dSZWN0MzIgICAoVVNFUjMyLjM4MSkKKyAqLwordm9pZCBNYXBEaWFsb2dSZWN0MzIoIEhXTkQzMiBod25kLCBMUFJFQ1QzMiByZWN0ICkKIHsKICAgICBESUFMT0dJTkZPICogZGxnSW5mbzsKICAgICBXTkQgKiB3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApOwpkaWZmIC0tZ2l0IGEvd2luZG93cy9ldmVudC5jIGIvd2luZG93cy9ldmVudC5jCmluZGV4IDI5MjRmZmMuLmNlNWQ0MWUgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvZXZlbnQuYworKysgYi93aW5kb3dzL2V2ZW50LmMKQEAgLTE0LDIwICsxNCwxOSBAQAogI2luY2x1ZGUgPFgxMS9YcmVzb3VyY2UuaD4KICNpbmNsdWRlIDxYMTEvWHV0aWwuaD4KICNpbmNsdWRlIDxYMTEvWGF0b20uaD4KLSNpbmNsdWRlICJnZGkuaCIKICNpbmNsdWRlICJ3aW5kb3dzLmgiCisjaW5jbHVkZSAiZ2RpLmgiCisjaW5jbHVkZSAiaGVhcC5oIgogI2luY2x1ZGUgIndpbi5oIgogI2luY2x1ZGUgImNsYXNzLmgiCiAjaW5jbHVkZSAiY2xpcGJvYXJkLmgiCiAjaW5jbHVkZSAiZGVidWdnZXIuaCIKKyNpbmNsdWRlICJtb2R1bGUuaCIKICNpbmNsdWRlICJvcHRpb25zLmgiCiAjaW5jbHVkZSAicXVldWUuaCIKICNpbmNsdWRlICJ3aW5wb3MuaCIKICNpbmNsdWRlICJyZWdpc3RlcnMuaCIKLSNpbmNsdWRlICJzdGFja2ZyYW1lLmgiCiAjaW5jbHVkZSAic3RkZGVidWcuaCIKLS8qICNkZWZpbmUgREVCVUdfRVZFTlQgKi8KLS8qICNkZWZpbmUgREVCVUdfS0VZICAgKi8KICNpbmNsdWRlICJkZWJ1Zy5oIgogCiAKQEAgLTE0OSw2ICsxNDgsNyBAQAogc3RhdGljIHZvaWQgRVZFTlRfRm9jdXNJbiggSFdORCBod25kLCBYRm9jdXNDaGFuZ2VFdmVudCAqZXZlbnQgKTsKIHN0YXRpYyB2b2lkIEVWRU5UX0ZvY3VzT3V0KCBIV05EIGh3bmQsIFhGb2N1c0NoYW5nZUV2ZW50ICpldmVudCApOwogc3RhdGljIHZvaWQgRVZFTlRfRXhwb3NlKCBIV05EIGh3bmQsIFhFeHBvc2VFdmVudCAqZXZlbnQgKTsKK3N0YXRpYyB2b2lkIEVWRU5UX0dyYXBoaWNzRXhwb3NlKCBIV05EIGh3bmQsIFhHcmFwaGljc0V4cG9zZUV2ZW50ICpldmVudCApOwogc3RhdGljIHZvaWQgRVZFTlRfQ29uZmlndXJlTm90aWZ5KCBIV05EIGh3bmQsIFhDb25maWd1cmVFdmVudCAqZXZlbnQgKTsKIHN0YXRpYyB2b2lkIEVWRU5UX1NlbGVjdGlvblJlcXVlc3QoIEhXTkQgaHduZCwgWFNlbGVjdGlvblJlcXVlc3RFdmVudCAqZXZlbnQpOwogc3RhdGljIHZvaWQgRVZFTlRfU2VsZWN0aW9uTm90aWZ5KCBIV05EIGh3bmQsIFhTZWxlY3Rpb25FdmVudCAqZXZlbnQpOwpAQCAtMjMzLDYgKzIzMywxMiBAQAogCUVWRU5UX0NsaWVudE1lc3NhZ2UoIGh3bmQsIChYQ2xpZW50TWVzc2FnZUV2ZW50ICopIGV2ZW50ICk7CiAJYnJlYWs7CiAKKyAgICBjYXNlIEdyYXBoaWNzRXhwb3NlOgorCUVWRU5UX0dyYXBoaWNzRXhwb3NlKCBod25kLCAoWEdyYXBoaWNzRXhwb3NlRXZlbnQgKikgZXZlbnQgKTsKKworICAgIGNhc2UgTm9FeHBvc2U6CisJYnJlYWs7ICAgCisKICAgICBkZWZhdWx0OiAgICAKIAlkcHJpbnRmX2V2ZW50KHN0ZGRlYiwgIlVucHJvY2Vzc2VkIGV2ZW50ICVzIGZvciBod25kICUwNHhcbiIsCiAJICAgICAgICBldmVudF9uYW1lc1tldmVudC0+dHlwZV0sIGh3bmQgKTsKQEAgLTI3Nyw3ICsyODMsNyBAQAogICovCiBzdGF0aWMgdm9pZCBFVkVOVF9FeHBvc2UoIEhXTkQgaHduZCwgWEV4cG9zZUV2ZW50ICpldmVudCApCiB7Ci0gICAgUkVDVCByZWN0OworICAgIFJFQ1QzMiByZWN0OwogICAgIFdORCAqIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICk7CiAgICAgaWYgKCF3bmRQdHIpIHJldHVybjsKIApAQCAtMjg3LDkgKzI5MywzMiBAQAogICAgIHJlY3QucmlnaHQgID0gcmVjdC5sZWZ0ICsgZXZlbnQtPndpZHRoOwogICAgIHJlY3QuYm90dG9tID0gcmVjdC50b3AgKyBldmVudC0+aGVpZ2h0OwogCi0gICAgUmVkcmF3V2luZG93KCBod25kLCAmcmVjdCwgMCwKLSAgICAgICAgICAgICAgICAgIFJEV19JTlZBTElEQVRFIHwgUkRXX0ZSQU1FIHwgUkRXX0FMTENISUxEUkVOIHwgUkRXX0VSQVNFIHwKLSAgICAgICAgICAgICAgICAgIChldmVudC0+Y291bnQgPyAwIDogUkRXX0VSQVNFTk9XKSApOworICAgIFJlZHJhd1dpbmRvdzMyKCBod25kLCAmcmVjdCwgMCwKKyAgICAgICAgICAgICAgICAgICAgUkRXX0lOVkFMSURBVEUgfCBSRFdfRlJBTUUgfCBSRFdfQUxMQ0hJTERSRU4gfCBSRFdfRVJBU0UgfAorICAgICAgICAgICAgICAgICAgICAoZXZlbnQtPmNvdW50ID8gMCA6IFJEV19FUkFTRU5PVykgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBFVkVOVF9HcmFwaGljc0V4cG9zZQorICogVGhpcyBpcyBuZWVkZWQgd2hlbiBzY3JvbGxpbmcgYXJlYSBpcyBwYXJ0aWFsbHkgb2JzY3VyZWQKKyAqIGJ5IG5vbi1XaW5lIFggd2luZG93LgorICovCitzdGF0aWMgdm9pZCBFVkVOVF9HcmFwaGljc0V4cG9zZSggSFdORCBod25kLCBYR3JhcGhpY3NFeHBvc2VFdmVudCAqZXZlbnQgKQoreworICAgIFJFQ1QxNiByZWN0OworICAgIFdORCAqIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICk7CisgICAgaWYgKCF3bmRQdHIpIHJldHVybjsKKworICAgICAgLyogTWFrZSBwb3NpdGlvbiByZWxhdGl2ZSB0byBjbGllbnQgYXJlYSBpbnN0ZWFkIG9mIHdpbmRvdyAqLworICAgIHJlY3QubGVmdCA9IGV2ZW50LT54IC0gKHduZFB0ci0+cmVjdENsaWVudC5sZWZ0IC0gd25kUHRyLT5yZWN0V2luZG93LmxlZnQpOworICAgIHJlY3QudG9wICA9IGV2ZW50LT55IC0gKHduZFB0ci0+cmVjdENsaWVudC50b3AgLSB3bmRQdHItPnJlY3RXaW5kb3cudG9wKTsKKyAgICByZWN0LnJpZ2h0ICA9IHJlY3QubGVmdCArIGV2ZW50LT53aWR0aDsKKyAgICByZWN0LmJvdHRvbSA9IHJlY3QudG9wICsgZXZlbnQtPmhlaWdodDsKKworICAgIFJlZHJhd1dpbmRvdzE2KCBod25kLCAmcmVjdCwgMCwKKyAgICAgICAgICAgICAgICAgICAgUkRXX0lOVkFMSURBVEUgfCBSRFdfQUxMQ0hJTERSRU4gfCBSRFdfRVJBU0UgfAorICAgICAgICAgICAgICAgICAgICAoZXZlbnQtPmNvdW50ID8gMCA6IFJEV19FUkFTRU5PVykgKTsKIH0KIAogCkBAIC00ODUsNyArNTE0LDcgQEAKIHsKICAgICBpZiAoZXZlbnQtPmRldGFpbCA9PSBOb3RpZnlQb2ludGVyKSByZXR1cm47CiAgICAgaWYgKGh3bmQgIT0gR2V0QWN0aXZlV2luZG93KCkpIFdJTlBPU19DaGFuZ2VBY3RpdmVXaW5kb3coIGh3bmQsIEZBTFNFICk7Ci0gICAgaWYgKChod25kICE9IEdldEZvY3VzKCkpICYmICEgSXNDaGlsZCggaHduZCwgR2V0Rm9jdXMoKSkpIFNldEZvY3VzKCBod25kICk7CisgICAgaWYgKChod25kICE9IEdldEZvY3VzKCkpICYmICFJc0NoaWxkKCBod25kLCBHZXRGb2N1cygpKSkgU2V0Rm9jdXMoIGh3bmQgKTsKIH0KIAogCkBAIC01MTgsMTIgKzU0NywxMyBAQAogICAgIGVsc2UKICAgICB7CiAgICAgICAvKiBBIG1hbmFnZWQgd2luZG93OyBtb3N0IG9mIHRoaXMgY29kZSBpcyBzaGFtZWxlc3NseQotICAgICAgICogc3RvbGVuIGZyb20gU2V0V2luZG93UG9zCisgICAgICAgKiBzdG9sZW4gZnJvbSBTZXRXaW5kb3dQb3MgLSBGSVhNRTogb3V0ZGF0ZWQKICAgICAgICAqLwogICAgICAgCiAgICAgICAgIFdORCAqd25kUHRyOwotCVdJTkRPV1BPUyB3aW5wb3M7Ci0JUkVDVCBuZXdXaW5kb3dSZWN0LCBuZXdDbGllbnRSZWN0OworCVdJTkRPV1BPUzE2ICp3aW5wb3M7CisJUkVDVDE2IG5ld1dpbmRvd1JlY3QsIG5ld0NsaWVudFJlY3Q7CisgICAgICAgIEhSR04gaHJnbk9sZFBvcywgaHJnbk5ld1BvczsKIAogCWlmICghKHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICkpKQogCXsKQEAgLTUzMSwyOCArNTYxLDMwIEBACiAJICAgIHJldHVybjsKIAl9CiAJCi0JLyogQXJ0aWZpY2lhbCBtZXNzYWdlcyAqLworICAgICAgICBpZiAoISh3aW5wb3MgPSBTRUdQVFJfTkVXKFdJTkRPV1BPUzE2KSkpIHJldHVybjsKKworICAgICAgICAvKiBBcnRpZmljaWFsIG1lc3NhZ2VzIC0gd2hhdCBpcyB0aGlzIGZvcj8gKi8KIAlTZW5kTWVzc2FnZShod25kLCBXTV9FTlRFUlNJWkVNT1ZFLCAwLCAwKTsKIAlTZW5kTWVzc2FnZShod25kLCBXTV9FWElUU0laRU1PVkUsIDAsIDApOwogCiAJLyogRmlsbCBXSU5ET1dQT1Mgc3RydWN0ICovCi0Jd2lucG9zLmZsYWdzID0gU1dQX05PQUNUSVZBVEUgfCBTV1BfTk9aT1JERVI7Ci0Jd2lucG9zLmh3bmQgPSBod25kOwotCXdpbnBvcy54ID0gZXZlbnQtPng7Ci0Jd2lucG9zLnkgPSBldmVudC0+eTsKLQl3aW5wb3MuY3ggPSBldmVudC0+d2lkdGg7Ci0Jd2lucG9zLmN5ID0gZXZlbnQtPmhlaWdodDsKKwl3aW5wb3MtPmZsYWdzID0gU1dQX05PQUNUSVZBVEUgfCBTV1BfTk9aT1JERVI7CisJd2lucG9zLT5od25kID0gaHduZDsKKwl3aW5wb3MtPnggPSBldmVudC0+eDsKKwl3aW5wb3MtPnkgPSBldmVudC0+eTsKKwl3aW5wb3MtPmN4ID0gZXZlbnQtPndpZHRoOworCXdpbnBvcy0+Y3kgPSBldmVudC0+aGVpZ2h0OwogCiAJLyogQ2hlY2sgZm9yIHVuY2hhbmdlZCBhdHRyaWJ1dGVzICovCi0JaWYod2lucG9zLnggPT0gd25kUHRyLT5yZWN0V2luZG93LmxlZnQgJiYKLQkgICB3aW5wb3MueSA9PSB3bmRQdHItPnJlY3RXaW5kb3cudG9wKQotCSAgICB3aW5wb3MuZmxhZ3MgfD0gU1dQX05PTU9WRTsKLQlpZih3aW5wb3MuY3ggPT0gd25kUHRyLT5yZWN0V2luZG93LnJpZ2h0IC0gd25kUHRyLT5yZWN0V2luZG93LmxlZnQgJiYKLQkgICB3aW5wb3MuY3kgPT0gd25kUHRyLT5yZWN0V2luZG93LmJvdHRvbSAtIHduZFB0ci0+cmVjdFdpbmRvdy50b3ApCi0JICAgIHdpbnBvcy5mbGFncyB8PSBTV1BfTk9TSVpFOworCWlmKHdpbnBvcy0+eCA9PSB3bmRQdHItPnJlY3RXaW5kb3cubGVmdCAmJgorCSAgIHdpbnBvcy0+eSA9PSB3bmRQdHItPnJlY3RXaW5kb3cudG9wKQorCSAgICB3aW5wb3MtPmZsYWdzIHw9IFNXUF9OT01PVkU7CisJaWYod2lucG9zLT5jeCA9PSB3bmRQdHItPnJlY3RXaW5kb3cucmlnaHQgLSB3bmRQdHItPnJlY3RXaW5kb3cubGVmdCAmJgorCSAgIHdpbnBvcy0+Y3kgPT0gd25kUHRyLT5yZWN0V2luZG93LmJvdHRvbSAtIHduZFB0ci0+cmVjdFdpbmRvdy50b3ApCisJICAgIHdpbnBvcy0+ZmxhZ3MgfD0gU1dQX05PU0laRTsKIAogCS8qIFNlbmQgV01fV0lORE9XUE9TQ0hBTkdJTkcgKi8KLQlTZW5kTWVzc2FnZShod25kLCBXTV9XSU5ET1dQT1NDSEFOR0lORywgMCwgKExQQVJBTSlNQUtFX1NFR1BUUigmd2lucG9zKSk7CisJU2VuZE1lc3NhZ2UoaHduZCwgV01fV0lORE9XUE9TQ0hBTkdJTkcsIDAsIChMUEFSQU0pU0VHUFRSX0dFVCh3aW5wb3MpKTsKIAogCS8qIENhbGN1bGF0ZSBuZXcgcG9zaXRpb24gYW5kIHNpemUgKi8KIAluZXdXaW5kb3dSZWN0LmxlZnQgPSBldmVudC0+eDsKQEAgLTU2MCwxNCArNTkyLDI1IEBACiAJbmV3V2luZG93UmVjdC50b3AgPSBldmVudC0+eTsKIAluZXdXaW5kb3dSZWN0LmJvdHRvbSA9IGV2ZW50LT55ICsgZXZlbnQtPmhlaWdodDsKIAotCVdJTlBPU19TZW5kTkNDYWxjU2l6ZSggd2lucG9zLmh3bmQsIFRSVUUsICZuZXdXaW5kb3dSZWN0LAorCVdJTlBPU19TZW5kTkNDYWxjU2l6ZSggd2lucG9zLT5od25kLCBUUlVFLCAmbmV3V2luZG93UmVjdCwKIAkJCSAgICAgICAmd25kUHRyLT5yZWN0V2luZG93LCAmd25kUHRyLT5yZWN0Q2xpZW50LAotCQkJICAgICAgIE1BS0VfU0VHUFRSKCZ3aW5wb3MpLCAmbmV3Q2xpZW50UmVjdCApOworCQkJICAgICAgIFNFR1BUUl9HRVQod2lucG9zKSwgJm5ld0NsaWVudFJlY3QgKTsKIAorICAgICAgICBocmduT2xkUG9zID0gQ3JlYXRlUmVjdFJnbkluZGlyZWN0MTYoICZ3bmRQdHItPnJlY3RXaW5kb3cgKTsKKyAgICAgICAgaHJnbk5ld1BvcyA9IENyZWF0ZVJlY3RSZ25JbmRpcmVjdDE2KCAmbmV3V2luZG93UmVjdCApOworICAgICAgICBDb21iaW5lUmduKCBocmduT2xkUG9zLCBocmduT2xkUG9zLCBocmduTmV3UG9zLCBSR05fRElGRiApOworIAogCS8qIFNldCBuZXcgc2l6ZSBhbmQgcG9zaXRpb24gKi8KIAl3bmRQdHItPnJlY3RXaW5kb3cgPSBuZXdXaW5kb3dSZWN0OwogCXduZFB0ci0+cmVjdENsaWVudCA9IG5ld0NsaWVudFJlY3Q7Ci0JU2VuZE1lc3NhZ2UoaHduZCwgV01fV0lORE9XUE9TQ0hBTkdFRCwgMCwgKExQQVJBTSlNQUtFX1NFR1BUUigmd2lucG9zKSk7CisJU2VuZE1lc3NhZ2UoIGh3bmQsIFdNX1dJTkRPV1BPU0NIQU5HRUQsIDAsIChMUEFSQU0pU0VHUFRSX0dFVCh3aW5wb3MpKTsKKyAgICAgICAgU0VHUFRSX0ZSRUUod2lucG9zKTsKKworICAgICAgICAvKiBmdWxsIHdpbmRvdyBkcmFnIGxlYXZlcyB1bnJlcGFpbnRlZCBnYXJiYWdlIHdpdGhvdXQgdGhpcyAqLworICAgICAgICBSZWRyYXdXaW5kb3czMiggMCwgTlVMTCwgaHJnbk9sZFBvcywgUkRXX0lOVkFMSURBVEUgfAorICAgICAgICAgICAgICAgICAgICAgICAgUkRXX0FMTENISUxEUkVOIHwgUkRXX0VSQVNFIHwgUkRXX0VSQVNFTk9XICk7CisgICAgICAgIERlbGV0ZU9iamVjdChocmduT2xkUG9zKTsKKyAgICAgICAgRGVsZXRlT2JqZWN0KGhyZ25OZXdQb3MpOwogICAgIH0KIH0KIApAQCAtNzEwLDggKzc1Myw5IEBACiAgKi8KIEZBUlBST0MgR2V0TW91c2VFdmVudFByb2Modm9pZCkKIHsKLSAgICBjaGFyIG5hbWVbXSA9ICJNb3VzZV9FdmVudCI7Ci0gICAgcmV0dXJuIEdldFByb2NBZGRyZXNzKCBHZXRNb2R1bGVIYW5kbGUoIlVTRVIiKSwgTUFLRV9TRUdQVFIobmFtZSkgKTsKKyAgICBITU9EVUxFIGhtb2R1bGUgPSBHZXRNb2R1bGVIYW5kbGUoIlVTRVIiKTsKKyAgICByZXR1cm4gTU9EVUxFX0dldEVudHJ5UG9pbnQoIGhtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNT0RVTEVfR2V0T3JkaW5hbCggaG1vZHVsZSwgIk1vdXNlX0V2ZW50IiApICk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvd2luZG93cy9ncmFwaGljcy5jIGIvd2luZG93cy9ncmFwaGljcy5jCmluZGV4IGJiMjkxOWEuLjAwNzcwYzcgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvZ3JhcGhpY3MuYworKysgYi93aW5kb3dzL2dyYXBoaWNzLmMKQEAgLTczLDkgKzczLDkgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBNb3ZlVG9FeCAgICAoR0RJLjQ4MykKKyAqICAgICAgICAgICBNb3ZlVG9FeDE2ICAgIChHREkuNDgzKQogICovCi1CT09MIE1vdmVUb0V4KCBIREMgaGRjLCBzaG9ydCB4LCBzaG9ydCB5LCBMUFBPSU5UIHB0ICkKK0JPT0wxNiBNb3ZlVG9FeDE2KCBIREMxNiBoZGMsIElOVDE2IHgsIElOVDE2IHksIExQUE9JTlQxNiBwdCApCiB7CiAgICAgREMgKiBkYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKCBoZGMsIERDX01BR0lDICk7CiAgICAgaWYgKCFkYykgcmV0dXJuIEZBTFNFOwpAQCAtOTEsNiArOTEsMTggQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBNb3ZlVG9FeDMyICAgIChHREkzMi4yNTQpCisgKi8KK0JPT0wzMiBNb3ZlVG9FeDMyKCBIREMzMiBoZGMsIElOVDMyIHgsIElOVDMyIHksIExQUE9JTlQzMiBwdCApCit7CisgICAgUE9JTlQxNiBwdDE2OworICAgIGlmICghTW92ZVRvRXgxNiggKEhEQzE2KWhkYywgKElOVDE2KXgsIChJTlQxNil5LCAmcHQxNiApKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKHB0KSBDT05WX1BPSU5UMTZUTzMyKCAmcHQxNiwgcHQgKTsKKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBHUkFQSF9EcmF3QXJjCiAgKgogICogSGVscGVyIGZ1bmN0aW9ucyBmb3IgQXJjKCksIENob3JkKCkgYW5kIFBpZSgpLgpAQCAtNDM0LDkgKzQ0Niw5IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgRmlsbFJlY3QgICAgKFVTRVIuODEpCisgKiAgICAgICAgICAgRmlsbFJlY3QxNiAgICAoVVNFUi44MSkKICAqLwotaW50IEZpbGxSZWN0KCBIREMgaGRjLCBMUFJFQ1QgcmVjdCwgSEJSVVNIIGhicnVzaCApCitJTlQxNiBGaWxsUmVjdDE2KCBIREMxNiBoZGMsIGNvbnN0IFJFQ1QxNiAqcmVjdCwgSEJSVVNIMTYgaGJydXNoICkKIHsKICAgICBIQlJVU0ggcHJldkJydXNoOwogCkBAIC00NTAsOSArNDYyLDI1IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgSW52ZXJ0UmVjdCAgICAoVVNFUi44MikKKyAqICAgICAgICAgICBGaWxsUmVjdDMyICAgIChVU0VSMzIuMTk2KQogICovCi12b2lkIEludmVydFJlY3QoIEhEQyBoZGMsIExQUkVDVCByZWN0ICkKK0lOVDMyIEZpbGxSZWN0MzIoIEhEQzMyIGhkYywgY29uc3QgUkVDVDMyICpyZWN0LCBIQlJVU0gzMiBoYnJ1c2ggKQoreworICAgIEhCUlVTSCBwcmV2QnJ1c2g7CisKKyAgICBpZiAoKHJlY3QtPnJpZ2h0IDw9IHJlY3QtPmxlZnQpIHx8IChyZWN0LT5ib3R0b20gPD0gcmVjdC0+dG9wKSkgcmV0dXJuIDA7CisgICAgaWYgKCEocHJldkJydXNoID0gU2VsZWN0T2JqZWN0KCBoZGMsIChIQlJVU0gxNiloYnJ1c2ggKSkpIHJldHVybiAwOworICAgIFBhdEJsdCggaGRjLCByZWN0LT5sZWZ0LCByZWN0LT50b3AsCisJICAgIHJlY3QtPnJpZ2h0IC0gcmVjdC0+bGVmdCwgcmVjdC0+Ym90dG9tIC0gcmVjdC0+dG9wLCBQQVRDT1BZICk7CisgICAgU2VsZWN0T2JqZWN0KCBoZGMsIHByZXZCcnVzaCApOworICAgIHJldHVybiAxOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEludmVydFJlY3QxNiAgICAoVVNFUi44MikKKyAqLwordm9pZCBJbnZlcnRSZWN0MTYoIEhEQzE2IGhkYywgY29uc3QgUkVDVDE2ICpyZWN0ICkKIHsKICAgICBpZiAoKHJlY3QtPnJpZ2h0IDw9IHJlY3QtPmxlZnQpIHx8IChyZWN0LT5ib3R0b20gPD0gcmVjdC0+dG9wKSkgcmV0dXJuOwogICAgIFBhdEJsdCggaGRjLCByZWN0LT5sZWZ0LCByZWN0LT50b3AsCkBAIC00NjEsOSArNDg5LDIwIEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgRnJhbWVSZWN0ICAgIChVU0VSLjgzKQorICogICAgICAgICAgIEludmVydFJlY3QzMiAgICAoVVNFUjMyLjMyOSkKICAqLwotaW50IEZyYW1lUmVjdCggSERDIGhkYywgTFBSRUNUIHJlY3QsIEhCUlVTSCBoYnJ1c2ggKQordm9pZCBJbnZlcnRSZWN0MzIoIEhEQzMyIGhkYywgY29uc3QgUkVDVDMyICpyZWN0ICkKK3sKKyAgICBpZiAoKHJlY3QtPnJpZ2h0IDw9IHJlY3QtPmxlZnQpIHx8IChyZWN0LT5ib3R0b20gPD0gcmVjdC0+dG9wKSkgcmV0dXJuOworICAgIFBhdEJsdCggaGRjLCByZWN0LT5sZWZ0LCByZWN0LT50b3AsCisJICAgIHJlY3QtPnJpZ2h0IC0gcmVjdC0+bGVmdCwgcmVjdC0+Ym90dG9tIC0gcmVjdC0+dG9wLCBEU1RJTlZFUlQgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBGcmFtZVJlY3QxNiAgICAoVVNFUi44MykKKyAqLworSU5UMTYgRnJhbWVSZWN0MTYoIEhEQzE2IGhkYywgY29uc3QgUkVDVDE2ICpyZWN0LCBIQlJVU0gxNiBoYnJ1c2ggKQogewogICAgIEhCUlVTSCBwcmV2QnJ1c2g7CiAgICAgaW50IGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbTsKQEAgLTQ5Niw2ICs1MzUsMTcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBGcmFtZVJlY3QzMiAgICAoVVNFUjMyLjIwMikKKyAqLworSU5UMzIgRnJhbWVSZWN0MzIoIEhEQzMyIGhkYywgY29uc3QgUkVDVDMyICpyZWN0LCBIQlJVU0gzMiBoYnJ1c2ggKQoreworICAgIFJFQ1QxNiByZWN0MTY7CisgICAgQ09OVl9SRUNUMzJUTzE2KCByZWN0LCAmcmVjdDE2ICk7CisgICAgcmV0dXJuIEZyYW1lUmVjdDE2KCAoSERDMTYpaGRjLCAmcmVjdDE2LCAoSEJSVVNIMTYpaGJydXNoICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgU2V0UGl4ZWwgICAgKEdESS4zMSkKICAqLwogQ09MT1JSRUYgU2V0UGl4ZWwoIEhEQyBoZGMsIHNob3J0IHgsIHNob3J0IHksIENPTE9SUkVGIGNvbG9yICkKQEAgLTU2OCw3ICs2MTgsNyBAQAogICovCiBCT09MIFBhaW50UmduKCBIREMgaGRjLCBIUkdOIGhyZ24gKQogewotICAgIFJFQ1QgYm94OworICAgIFJFQ1QxNiBib3g7CiAgICAgSFJHTiB0bXBWaXNSZ24sIHByZXZWaXNSZ247CiAgICAgREMgKiBkYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKCBoZGMsIERDX01BR0lDICk7CiAgICAgaWYgKCFkYykgcmV0dXJuIEZBTFNFOwpAQCAtNTg3LDcgKzYzNyw3IEBACiAKICAgICAgIC8qIEZpbGwgdGhlIHJlZ2lvbiAqLwogCi0gICAgR2V0UmduQm94KCBkYy0+dy5oR0NDbGlwUmduLCAmYm94ICk7CisgICAgR2V0UmduQm94MTYoIGRjLT53LmhHQ0NsaXBSZ24sICZib3ggKTsKICAgICBpZiAoRENfU2V0dXBHQ0ZvckJydXNoKCBkYyApKQogCVhGaWxsUmVjdGFuZ2xlKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAogCQkgICAgICAgIGRjLT53LkRDT3JnWCArIGJveC5sZWZ0LCBkYy0+dy5EQ09yZ1kgKyBib3gudG9wLApAQCAtNjQwLDExICs2OTAsMTEgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBEcmF3Rm9jdXNSZWN0ICAgIChVU0VSLjQ2NikKKyAqICAgICAgICAgICBEcmF3Rm9jdXNSZWN0MTYgICAgKFVTRVIuNDY2KQogICovCi12b2lkIERyYXdGb2N1c1JlY3QoIEhEQyBoZGMsIGNvbnN0IFJFQ1QqIHJjICkKK3ZvaWQgRHJhd0ZvY3VzUmVjdDE2KCBIREMxNiBoZGMsIGNvbnN0IFJFQ1QxNiogcmMgKQogewotICAgIEhQRU4gaE9sZFBlbjsKKyAgICBIUEVOMTYgaE9sZFBlbjsKICAgICBpbnQgb2xkRHJhd01vZGUsIG9sZEJrTW9kZTsKICAgICBpbnQgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tOwogICAgIERDICogZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBEQ19NQUdJQyApOwpAQCAtNjU1LDcgKzcwNSw3IEBACiAgICAgcmlnaHQgID0gWExQVE9EUCggZGMsIHJjLT5yaWdodCApOwogICAgIGJvdHRvbSA9IFlMUFRPRFAoIGRjLCByYy0+Ym90dG9tICk7CiAgICAgCi0gICAgaE9sZFBlbiA9IChIUEVOKVNlbGVjdE9iamVjdChoZGMsIHN5c0NvbG9yT2JqZWN0cy5ocGVuV2luZG93VGV4dCApOworICAgIGhPbGRQZW4gPSAoSFBFTjE2KVNlbGVjdE9iamVjdChoZGMsIHN5c0NvbG9yT2JqZWN0cy5ocGVuV2luZG93VGV4dCApOwogICAgIG9sZERyYXdNb2RlID0gU2V0Uk9QMihoZGMsIFIyX1hPUlBFTik7CiAgICAgb2xkQmtNb2RlID0gU2V0QmtNb2RlKGhkYywgVFJBTlNQQVJFTlQpOwogCkBAIC02NzMsNiArNzIzLDE3IEBACiB9CiAKIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgRHJhd0ZvY3VzUmVjdDMyICAgIChVU0VSMzIuMTU1KQorICovCit2b2lkIERyYXdGb2N1c1JlY3QzMiggSERDMzIgaGRjLCBjb25zdCBSRUNUMzIqIHJlY3QgKQoreworICAgIFJFQ1QxNiByZWN0MTY7CisgICAgQ09OVl9SRUNUMzJUTzE2KCByZWN0LCAmcmVjdDE2ICk7CisgICAgcmV0dXJuIERyYXdGb2N1c1JlY3QxNiggKEhEQzE2KWhkYywgJnJlY3QxNiApOworfQorCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICBHUkFQSF9EcmF3Qml0bWFwCiAgKgpAQCAtNzEyLDcgKzc3Myw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgR1JBUEhfRHJhd1JlbGllZlJlY3QgIChOb3QgYSBNU1dpbiBDYWxsKQogICovCi12b2lkIEdSQVBIX0RyYXdSZWxpZWZSZWN0KCBIREMgaGRjLCBSRUNUICpyZWN0LCBpbnQgaGlnaGxpZ2h0X3NpemUsCit2b2lkIEdSQVBIX0RyYXdSZWxpZWZSZWN0KCBIREMgaGRjLCBSRUNUMTYgKnJlY3QsIGludCBoaWdobGlnaHRfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaGFkb3dfc2l6ZSwgQk9PTCBwcmVzc2VkICkKIHsKICAgICBIQlJVU0ggaGJydXNoT2xkOwpAQCAtNzQzLDkgKzgwNCw5IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgIFBvbHlsaW5lICAoR0RJLjM3KQorICogICAgICAgICAgUG9seWxpbmUxNiAgKEdESS4zNykKICAqLwotQk9PTCBQb2x5bGluZSAoSERDIGhkYywgTFBQT0lOVCBwdCwgaW50IGNvdW50KQorQk9PTDE2IFBvbHlsaW5lMTYoIEhEQzE2IGhkYywgTFBQT0lOVDE2IHB0LCBJTlQxNiBjb3VudCApCiB7CiAgICAgcmVnaXN0ZXIgaW50IGk7CiAgICAgREMgKiBkYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKCBoZGMsIERDX01BR0lDICk7CkBAIC03NjksOSArODMwLDkgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgUG9seWdvbiAgKEdESS4zNikKKyAqICAgICAgICAgIFBvbHlnb24xNiAgKEdESS4zNikKICAqLwotQk9PTCBQb2x5Z29uIChIREMgaGRjLCBMUFBPSU5UIHB0LCBpbnQgY291bnQpCitCT09MMTYgUG9seWdvbjE2KCBIREMxNiBoZGMsIExQUE9JTlQxNiBwdCwgSU5UMTYgY291bnQgKQogewogICAgIHJlZ2lzdGVyIGludCBpOwogICAgIERDICogZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBEQ19NQUdJQyApOwpAQCAtODA2LDkgKzg2Nyw5IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgIFBvbHlQb2x5Z29uICAoR0RJLjQ1MCkKKyAqICAgICAgICAgIFBvbHlQb2x5Z29uMTYgIChHREkuNDUwKQogICovCi1CT09MIFBvbHlQb2x5Z29uKCBIREMgaGRjLCBMUFBPSU5UIHB0LCBMUElOVDE2IGNvdW50cywgV09SRCBwb2x5Z29ucyApCitCT09MMTYgUG9seVBvbHlnb24xNiggSERDMTYgaGRjLCBMUFBPSU5UMTYgcHQsIExQSU5UMTYgY291bnRzLCBVSU5UMTYgcG9seWdvbnMpCiB7CiAgICAgSFJHTiBocmduOwogICAgIERDICogZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBEQ19NQUdJQyApOwpAQCAtODI0LDcgKzg4NSw3IEBACiAgICAgICAvKiBjcmVhdGluZyB0aGUgcmVnaW9uLiBCdXQgYXMgQ3JlYXRlUG9seVBvbHlnb25SZ24gaXMgbm90ICovCiAgICAgICAvKiByZWFsbHkgY29ycmVjdCBlaXRoZXIsIGl0IGRvZXNuJ3QgbWF0dGVyIG11Y2guLi4gKi8KICAgICAgIC8qIEF0IGxlYXN0IHRoZSBvdXRsaW5lIHdpbGwgYmUgY29ycmVjdCA6LSkgKi8KLSAgICBocmduID0gQ3JlYXRlUG9seVBvbHlnb25SZ24oIHB0LCBjb3VudHMsIHBvbHlnb25zLCBkYy0+dy5wb2x5RmlsbE1vZGUgKTsKKyAgICBocmduID0gQ3JlYXRlUG9seVBvbHlnb25SZ24xNiggcHQsIGNvdW50cywgcG9seWdvbnMsIGRjLT53LnBvbHlGaWxsTW9kZSApOwogICAgIFBhaW50UmduKCBoZGMsIGhyZ24gKTsKICAgICBEZWxldGVPYmplY3QoIGhyZ24gKTsKIApAQCAtOTMwLDcgKzk5MSw3IEBACiAgKgogICogTWFpbiBmbG9vZC1maWxsIHJvdXRpbmUuCiAgKi8KLXN0YXRpYyBCT09MIEdSQVBIX0RvRmxvb2RGaWxsKCBEQyAqZGMsIFJFQ1QgKnJlY3QsIElOVCB4LCBJTlQgeSwKK3N0YXRpYyBCT09MIEdSQVBIX0RvRmxvb2RGaWxsKCBEQyAqZGMsIFJFQ1QxNiAqcmVjdCwgSU5UMTYgeCwgSU5UMTYgeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0xPUlJFRiBjb2xvciwgV09SRCBmaWxsVHlwZSApCiB7CiAgICAgWEltYWdlICppbWFnZTsKQEAgLTk2NCw3ICsxMDI1LDcgQEAKICAqLwogQk9PTCBFeHRGbG9vZEZpbGwoIEhEQyBoZGMsIElOVCB4LCBJTlQgeSwgQ09MT1JSRUYgY29sb3IsIFdPUkQgZmlsbFR5cGUgKQogewotICAgIFJFQ1QgcmVjdDsKKyAgICBSRUNUMTYgcmVjdDsKICAgICBEQyAqZGM7CiAKICAgICBkcHJpbnRmX2dyYXBoaWNzKCBzdGRkZWIsICJFeHRGbG9vZEZpbGwgJTA0eCAlZCwlZCAlMDZseCAlZFxuIiwKQEAgLTk4MCw3ICsxMDQxLDcgQEAKICAgICB9CiAKICAgICBpZiAoIVB0VmlzaWJsZSggaGRjLCB4LCB5ICkpIHJldHVybiBGQUxTRTsKLSAgICBpZiAoR2V0UmduQm94KCBkYy0+dy5oR0NDbGlwUmduLCAmcmVjdCApID09IEVSUk9SKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKEdldFJnbkJveDE2KCBkYy0+dy5oR0NDbGlwUmduLCAmcmVjdCApID09IEVSUk9SKSByZXR1cm4gRkFMU0U7CiAKICAgICByZXR1cm4gQ2FsbFRvMzJfTGFyZ2VTdGFjayggKGludCgqKSgpKUdSQVBIX0RvRmxvb2RGaWxsLCA2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYywgJnJlY3QsIHgsIHksIGNvbG9yLCBmaWxsVHlwZSApOwpAQCAtOTk5LDcgKzEwNjAsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgIERyYXdFZGdlICAoVVNFUi42NTkpCiAgKi8KLUJPT0wgRHJhd0VkZ2UoSERDIGhkYywgTFBSRUNUIHFyYywgVUlOVCBlZGdlLCBVSU5UIGZsYWdzKQorQk9PTCBEcmF3RWRnZShIREMgaGRjLCBMUFJFQ1QxNiBxcmMsIFVJTlQgZWRnZSwgVUlOVCBmbGFncykKIHsKIAlmcHJpbnRmKHN0ZG5pbXAsIkRyYXdFZGdlKCV4LCVwLCVkLCV4KSwgZW1wdHkgc3R1YiFcbiIsCiAJCWhkYyxxcmMsZWRnZSxmbGFncwpAQCAtMTAxMCw3ICsxMDcxLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICBEcmF3RnJhbWVDb250cm9sICAoVVNFUi42NTYpCiAgKi8KLUJPT0wgRHJhd0ZyYW1lQ29udHJvbChIREMgaGRjLCBMUFJFQ1QgcXJjLCBVSU5UIGVkZ2UsIFVJTlQgZmxhZ3MpCitCT09MIERyYXdGcmFtZUNvbnRyb2woSERDIGhkYywgTFBSRUNUMTYgcXJjLCBVSU5UIGVkZ2UsIFVJTlQgZmxhZ3MpCiB7CiAJZnByaW50ZihzdGRuaW1wLCJEcmF3RnJhbWVDb250cm9sKCV4LCVwLCVkLCV4KSwgZW1wdHkgc3R1YiFcbiIsCiAJCWhkYyxxcmMsZWRnZSxmbGFncwpkaWZmIC0tZ2l0IGEvd2luZG93cy9tYXBwaW5nLmMgYi93aW5kb3dzL21hcHBpbmcuYwppbmRleCA4ZmI5NTYzLi45YWUyYjY5IDEwMDY0NAotLS0gYS93aW5kb3dzL21hcHBpbmcuYworKysgYi93aW5kb3dzL21hcHBpbmcuYwpAQCAtMzUsMzcgKzM1LDcwIEBACiAgICAgfQkKIH0KIAorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBEUHRvTFAgICAgKEdESS42NykKKyAqICAgICAgICAgICBEUHRvTFAxNiAgICAoR0RJLjY3KQogICovCi1CT09MIERQdG9MUCggSERDIGhkYywgTFBQT0lOVCBwb2ludHMsIElOVCBjb3VudCApCitCT09MMTYgRFB0b0xQMTYoIEhEQzE2IGhkYywgTFBQT0lOVDE2IHBvaW50cywgSU5UMTYgY291bnQgKQogewotICAgIFBPSU5UICogcHQ7CiAgICAgREMgKiBkYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKCBoZGMsIERDX01BR0lDICk7CiAgICAgaWYgKCFkYykgcmV0dXJuIEZBTFNFOwotICAgIAotICAgIGZvciAocHQgPSBwb2ludHM7IGNvdW50ID4gMDsgcHQrKywgY291bnQtLSkKKworICAgIHdoaWxlIChjb3VudC0tKQogICAgIHsKLQlwdC0+eCA9IFhEUFRPTFAoIGRjLCBwdC0+eCApOwotCXB0LT55ID0gWURQVE9MUCggZGMsIHB0LT55ICk7CisJcG9pbnRzLT54ID0gWERQVE9MUCggZGMsIHBvaW50cy0+eCApOworCXBvaW50cy0+eSA9IFlEUFRPTFAoIGRjLCBwb2ludHMtPnkgKTsKICAgICB9CiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgTFB0b0RQICAgIChHREkuOTkpCisgKiAgICAgICAgICAgRFB0b0xQMzIgICAgKEdESTMyLjY1KQogICovCi1CT09MIExQdG9EUCggSERDIGhkYywgTFBQT0lOVCBwb2ludHMsIGludCBjb3VudCApCitCT09MMzIgRFB0b0xQMzIoIEhEQzMyIGhkYywgTFBQT0lOVDMyIHBvaW50cywgSU5UMzIgY291bnQgKQogewotICAgIFBPSU5UICogcHQ7CiAgICAgREMgKiBkYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKCBoZGMsIERDX01BR0lDICk7CiAgICAgaWYgKCFkYykgcmV0dXJuIEZBTFNFOwotICAgIAotICAgIGZvciAocHQgPSBwb2ludHM7IGNvdW50ID4gMDsgcHQrKywgY291bnQtLSkKKworICAgIHdoaWxlIChjb3VudC0tKQogICAgIHsKLQlwdC0+eCA9IFhMUFRPRFAoIGRjLCBwdC0+eCApOwotCXB0LT55ID0gWUxQVE9EUCggZGMsIHB0LT55ICk7CisJcG9pbnRzLT54ID0gWERQVE9MUCggZGMsIHBvaW50cy0+eCApOworCXBvaW50cy0+eSA9IFlEUFRPTFAoIGRjLCBwb2ludHMtPnkgKTsKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgTFB0b0RQMTYgICAgKEdESS45OSkKKyAqLworQk9PTDE2IExQdG9EUDE2KCBIREMxNiBoZGMsIExQUE9JTlQxNiBwb2ludHMsIElOVDE2IGNvdW50ICkKK3sKKyAgICBEQyAqIGRjID0gKERDICopIEdESV9HZXRPYmpQdHIoIGhkYywgRENfTUFHSUMgKTsKKyAgICBpZiAoIWRjKSByZXR1cm4gRkFMU0U7CisKKyAgICB3aGlsZSAoY291bnQtLSkKKyAgICB7CisJcG9pbnRzLT54ID0gWExQVE9EUCggZGMsIHBvaW50cy0+eCApOworCXBvaW50cy0+eSA9IFlMUFRPRFAoIGRjLCBwb2ludHMtPnkgKTsKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgTFB0b0RQMzIgICAgKEdESTMyLjI0NykKKyAqLworQk9PTDMyIExQdG9EUDMyKCBIREMzMiBoZGMsIExQUE9JTlQzMiBwb2ludHMsIElOVDMyIGNvdW50ICkKK3sKKyAgICBEQyAqIGRjID0gKERDICopIEdESV9HZXRPYmpQdHIoIGhkYywgRENfTUFHSUMgKTsKKyAgICBpZiAoIWRjKSByZXR1cm4gRkFMU0U7CisKKyAgICB3aGlsZSAoY291bnQtLSkKKyAgICB7CisJcG9pbnRzLT54ID0gWExQVE9EUCggZGMsIHBvaW50cy0+eCApOworCXBvaW50cy0+eSA9IFlMUFRPRFAoIGRjLCBwb2ludHMtPnkgKTsKICAgICB9CiAgICAgcmV0dXJuIFRSVUU7CiB9CkBAIC0xNjAsOSArMTkzLDkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFNldFZpZXdwb3J0RXh0ICAgIChHREkuMTQpCiAgKi8KLURXT1JEIFNldFZpZXdwb3J0RXh0KCBIREMgaGRjLCBzaG9ydCB4LCBzaG9ydCB5ICkKK0RXT1JEIFNldFZpZXdwb3J0RXh0KCBIREMxNiBoZGMsIElOVDE2IHgsIElOVDE2IHkgKQogewotICAgIFNJWkUgc2l6ZTsKKyAgICBTSVpFMTYgc2l6ZTsKICAgICBEQyAqIGRjID0gKERDICopIEdESV9HZXRPYmpQdHIoIGhkYywgRENfTUFHSUMgKTsKICAgICBpZiAoIWRjKSAKICAgICB7CkBAIC0xNzUsMTkgKzIwOCwxOSBAQAogICAgIHNpemUuY3ggPSBkYy0+dy5WcG9ydEV4dFg7CiAgICAgc2l6ZS5jeSA9IGRjLT53LlZwb3J0RXh0WTsKICAgICBpZiAoKGRjLT53Lk1hcE1vZGUgIT0gTU1fSVNPVFJPUElDKSAmJiAoZGMtPncuTWFwTW9kZSAhPSBNTV9BTklTT1RST1BJQykpCi0JcmV0dXJuIHNpemUuY3ggfCAoc2l6ZS5jeSA8PCAxNik7CisJcmV0dXJuIE1BS0VMT05HKCBzaXplLmN4LCBzaXplLmN5ICk7CiAgICAgaWYgKCF4IHx8ICF5KSByZXR1cm4gMDsKICAgICBkYy0+dy5WcG9ydEV4dFggPSB4OwogICAgIGRjLT53LlZwb3J0RXh0WSA9IHk7CiAgICAgaWYgKGRjLT53Lk1hcE1vZGUgPT0gTU1fSVNPVFJPUElDKSBNQVBQSU5HX0ZpeElzb3Ryb3BpYyggZGMgKTsKLSAgICByZXR1cm4gc2l6ZS5jeCB8IChzaXplLmN5IDw8IDE2KTsKKyAgICByZXR1cm4gTUFLRUxPTkcoIHNpemUuY3gsIHNpemUuY3kgKTsKIH0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBTZXRWaWV3cG9ydEV4dEV4ICAgIChHREkuNDc5KQorICogICAgICAgICAgIFNldFZpZXdwb3J0RXh0RXgxNiAgICAoR0RJLjQ3OSkKICAqLwotQk9PTCBTZXRWaWV3cG9ydEV4dEV4KCBIREMgaGRjLCBzaG9ydCB4LCBzaG9ydCB5LCBMUFNJWkUgc2l6ZSApCitCT09MMTYgU2V0Vmlld3BvcnRFeHRFeDE2KCBIREMxNiBoZGMsIElOVDE2IHgsIElOVDE2IHksIExQU0laRTE2IHNpemUgKQogewogICAgIERDICogZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBEQ19NQUdJQyApOwogICAgIGlmICghZGMpIHJldHVybiBGQUxTRTsKQEAgLTIwNywxMSArMjQwLDIzIEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgU2V0Vmlld3BvcnRFeHRFeDMyICAgIChHREkzMi4zNDApCisgKi8KK0JPT0wzMiBTZXRWaWV3cG9ydEV4dEV4MzIoIEhEQzMyIGhkYywgSU5UMzIgeCwgSU5UMzIgeSwgTFBTSVpFMzIgc2l6ZSApCit7CisgICAgU0laRTE2IHNpemUxNjsKKyAgICBCT09MMTYgcmV0ID0gU2V0Vmlld3BvcnRFeHRFeDE2KCAoSERDMTYpaGRjLCAoSU5UMTYpeCwgKElOVDE2KXksICZzaXplMTYgKTsKKyAgICBpZiAoc2l6ZSkgQ09OVl9TSVpFMTZUTzMyKCAmc2l6ZTE2LCBzaXplICk7CisgICAgcmV0dXJuIHJldDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBTZXRWaWV3cG9ydE9yZyAgICAoR0RJLjEzKQogICovCi1EV09SRCBTZXRWaWV3cG9ydE9yZyggSERDIGhkYywgc2hvcnQgeCwgc2hvcnQgeSApCitEV09SRCBTZXRWaWV3cG9ydE9yZyggSERDMTYgaGRjLCBJTlQxNiB4LCBJTlQxNiB5ICkKIHsKLSAgICBQT0lOVCBwdDsKKyAgICBQT0lOVDE2IHB0OwogICAgIERDICogZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBEQ19NQUdJQyApOwogICAgIGlmICghZGMpIAogICAgIHsKQEAgLTIzMCw5ICsyNzUsOSBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFNldFZpZXdwb3J0T3JnRXggICAgKEdESS40ODApCisgKiAgICAgICAgICAgU2V0Vmlld3BvcnRPcmdFeDE2ICAgIChHREkuNDgwKQogICovCi1CT09MIFNldFZpZXdwb3J0T3JnRXgoIEhEQyBoZGMsIHNob3J0IHgsIHNob3J0IHksIExQUE9JTlQgcHQgKQorQk9PTDE2IFNldFZpZXdwb3J0T3JnRXgxNiggSERDMTYgaGRjLCBJTlQxNiB4LCBJTlQxNiB5LCBMUFBPSU5UMTYgcHQgKQogewogICAgIERDICogZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBEQ19NQUdJQyApOwogICAgIGlmICghZGMpIHJldHVybiBGQUxTRTsKQEAgLTI0OCwxMSArMjkzLDIzIEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgU2V0Vmlld3BvcnRPcmdFeDMyICAgIChHREkzMi4zNDEpCisgKi8KK0JPT0wzMiBTZXRWaWV3cG9ydE9yZ0V4MzIoIEhEQzMyIGhkYywgSU5UMzIgeCwgSU5UMzIgeSwgTFBQT0lOVDMyIHB0ICkKK3sKKyAgICBQT0lOVDE2IHB0MTY7CisgICAgQk9PTDE2IHJldCA9IFNldFZpZXdwb3J0T3JnRXgxNiggKEhEQzE2KWhkYywgKElOVDE2KXgsIChJTlQxNil5LCAmcHQxNiApOworICAgIGlmIChwdCkgQ09OVl9QT0lOVDE2VE8zMiggJnB0MTYsIHB0ICk7CisgICAgcmV0dXJuIHJldDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBTZXRXaW5kb3dFeHQgICAgKEdESS4xMikKICAqLwotRFdPUkQgU2V0V2luZG93RXh0KCBIREMgaGRjLCBzaG9ydCB4LCBzaG9ydCB5ICkKK0RXT1JEIFNldFdpbmRvd0V4dCggSERDMTYgaGRjLCBJTlQxNiB4LCBJTlQxNiB5ICkKIHsKLSAgICBTSVpFIHNpemU7CisgICAgU0laRTE2IHNpemU7CiAgICAgREMgKiBkYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKCBoZGMsIERDX01BR0lDICk7CiAgICAgaWYgKCFkYykgCiAgICAgewpAQCAtMjY1LDE5ICszMjIsMTkgQEAKICAgICBzaXplLmN4ID0gZGMtPncuV25kRXh0WDsKICAgICBzaXplLmN5ID0gZGMtPncuV25kRXh0WTsKICAgICBpZiAoKGRjLT53Lk1hcE1vZGUgIT0gTU1fSVNPVFJPUElDKSAmJiAoZGMtPncuTWFwTW9kZSAhPSBNTV9BTklTT1RST1BJQykpCi0JcmV0dXJuIHNpemUuY3ggfCAoc2l6ZS5jeSA8PCAxNik7CisJcmV0dXJuIE1BS0VMT05HKCBzaXplLmN4LCBzaXplLmN5ICk7CiAgICAgaWYgKCF4IHx8ICF5KSByZXR1cm4gMDsKICAgICBkYy0+dy5XbmRFeHRYID0geDsKICAgICBkYy0+dy5XbmRFeHRZID0geTsKICAgICBpZiAoZGMtPncuTWFwTW9kZSA9PSBNTV9JU09UUk9QSUMpIE1BUFBJTkdfRml4SXNvdHJvcGljKCBkYyApOwotICAgIHJldHVybiBzaXplLmN4IHwgKHNpemUuY3kgPDwgMTYpOworICAgIHJldHVybiBNQUtFTE9ORyggc2l6ZS5jeCwgc2l6ZS5jeSApOwogfQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFNldFdpbmRvd0V4dEV4ICAgIChHREkuNDgxKQorICogICAgICAgICAgIFNldFdpbmRvd0V4dEV4MTYgICAgKEdESS40ODEpCiAgKi8KLUJPT0wgU2V0V2luZG93RXh0RXgoIEhEQyBoZGMsIHNob3J0IHgsIHNob3J0IHksIExQU0laRSBzaXplICkKK0JPT0wxNiBTZXRXaW5kb3dFeHRFeDE2KCBIREMxNiBoZGMsIElOVDE2IHgsIElOVDE2IHksIExQU0laRTE2IHNpemUgKQogewogICAgIERDICogZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBEQ19NQUdJQyApOwogICAgIGlmICghZGMpIHJldHVybiBGQUxTRTsKQEAgLTI5NywxMSArMzU0LDIzIEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgU2V0V2luZG93RXh0RXgzMiAgICAoR0RJMzIuMzQ0KQorICovCitCT09MMzIgU2V0V2luZG93RXh0RXgzMiggSERDMzIgaGRjLCBJTlQzMiB4LCBJTlQzMiB5LCBMUFNJWkUzMiBzaXplICkKK3sKKyAgICBTSVpFMTYgc2l6ZTE2OworICAgIEJPT0wxNiByZXQgPSBTZXRXaW5kb3dFeHRFeDE2KCAoSERDMTYpaGRjLCAoSU5UMTYpeCwgKElOVDE2KXksICZzaXplMTYgKTsKKyAgICBpZiAoc2l6ZSkgQ09OVl9TSVpFMTZUTzMyKCAmc2l6ZTE2LCBzaXplICk7CisgICAgcmV0dXJuIHJldDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBTZXRXaW5kb3dPcmcgICAgKEdESS4xMSkKICAqLwotRFdPUkQgU2V0V2luZG93T3JnKCBIREMgaGRjLCBzaG9ydCB4LCBzaG9ydCB5ICkKK0RXT1JEIFNldFdpbmRvd09yZyggSERDMTYgaGRjLCBJTlQxNiB4LCBJTlQxNiB5ICkKIHsKLSAgICBQT0lOVCBwdDsKKyAgICBQT0lOVDE2IHB0OwogICAgIERDICogZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBEQ19NQUdJQyApOwogICAgIGlmICghZGMpIAogICAgIHsKQEAgLTMxNSwxNCArMzg0LDE0IEBACiAgICAgcHQueSA9IGRjLT53LlduZE9yZ1k7CiAgICAgZGMtPncuV25kT3JnWCA9IHg7CiAgICAgZGMtPncuV25kT3JnWSA9IHk7Ci0gICAgcmV0dXJuIHB0LnggfCAocHQueSA8PCAxNik7CisgICAgcmV0dXJuIE1BS0VMT05HKCBwdC54LCBwdC55ICk7CiB9CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgU2V0V2luZG93T3JnRXggICAgKEdESS40ODIpCisgKiAgICAgICAgICAgU2V0V2luZG93T3JnRXgxNiAgICAoR0RJLjQ4MikKICAqLwotQk9PTCBTZXRXaW5kb3dPcmdFeCggSERDIGhkYywgc2hvcnQgeCwgc2hvcnQgeSwgTFBQT0lOVCBwdCApCitCT09MMTYgU2V0V2luZG93T3JnRXgxNiggSERDMTYgaGRjLCBJTlQxNiB4LCBJTlQxNiB5LCBMUFBPSU5UMTYgcHQgKQogewogICAgIERDICogZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBEQ19NQUdJQyApOwogICAgIGlmICghZGMpIHJldHVybiBGQUxTRTsKQEAgLTMzOCwxMSArNDA3LDIzIEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgU2V0V2luZG93T3JnRXgzMiAgICAoR0RJMzIuMzQ1KQorICovCitCT09MMzIgU2V0V2luZG93T3JnRXgzMiggSERDMzIgaGRjLCBJTlQzMiB4LCBJTlQzMiB5LCBMUFBPSU5UMzIgcHQgKQoreworICAgIFBPSU5UMTYgcHQxNjsKKyAgICBCT09MMTYgcmV0ID0gU2V0V2luZG93T3JnRXgxNiggKEhEQzE2KWhkYywgKElOVDE2KXgsIChJTlQxNil5LCAmcHQxNiApOworICAgIGlmIChwdCkgQ09OVl9QT0lOVDE2VE8zMiggJnB0MTYsIHB0ICk7CisgICAgcmV0dXJuIHJldDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBPZmZzZXRWaWV3cG9ydE9yZyAgICAoR0RJLjE3KQogICovCi1EV09SRCBPZmZzZXRWaWV3cG9ydE9yZyggSERDIGhkYywgc2hvcnQgeCwgc2hvcnQgeSApCitEV09SRCBPZmZzZXRWaWV3cG9ydE9yZyggSERDMTYgaGRjLCBJTlQxNiB4LCBJTlQxNiB5ICkKIHsKLSAgICBQT0lOVCBwdDsKKyAgICBQT0lOVDE2IHB0OwogICAgIERDICogZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBEQ19NQUdJQyApOwogICAgIGlmICghZGMpIAogICAgIHsKQEAgLTM2MSw5ICs0NDIsOSBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIE9mZnNldFZpZXdwb3J0T3JnRXggICAgKEdESS40NzYpCisgKiAgICAgICAgICAgT2Zmc2V0Vmlld3BvcnRPcmdFeDE2ICAgIChHREkuNDc2KQogICovCi1CT09MIE9mZnNldFZpZXdwb3J0T3JnRXgoIEhEQyBoZGMsIHNob3J0IHgsIHNob3J0IHksIExQUE9JTlQgcHQgKQorQk9PTDE2IE9mZnNldFZpZXdwb3J0T3JnRXgxNiggSERDMTYgaGRjLCBJTlQxNiB4LCBJTlQxNiB5LCBMUFBPSU5UMTYgcHQgKQogewogICAgIERDICogZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBEQ19NQUdJQyApOwogICAgIGlmICghZGMpIHJldHVybiBGQUxTRTsKQEAgLTM3OSwxMSArNDYwLDIzIEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgT2Zmc2V0Vmlld3BvcnRPcmdFeDMyICAgIChHREkzMi4yNTcpCisgKi8KK0JPT0wzMiBPZmZzZXRWaWV3cG9ydE9yZ0V4MzIoIEhEQzMyIGhkYywgSU5UMzIgeCwgSU5UMzIgeSwgTFBQT0lOVDMyIHB0ICkKK3sKKyAgICBQT0lOVDE2IHB0MTY7CisgICAgQk9PTDE2IHJldCA9IE9mZnNldFZpZXdwb3J0T3JnRXgxNiggKEhEQzE2KWhkYywgKElOVDE2KXgsIChJTlQxNil5LCAmcHQxNik7CisgICAgaWYgKHB0KSBDT05WX1BPSU5UMTZUTzMyKCAmcHQxNiwgcHQgKTsKKyAgICByZXR1cm4gcmV0OworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIE9mZnNldFdpbmRvd09yZyAgICAoR0RJLjE1KQogICovCi1EV09SRCBPZmZzZXRXaW5kb3dPcmcoIEhEQyBoZGMsIHNob3J0IHgsIHNob3J0IHkgKQorRFdPUkQgT2Zmc2V0V2luZG93T3JnKCBIREMxNiBoZGMsIElOVDE2IHgsIElOVDE2IHkgKQogewotICAgIFBPSU5UIHB0OworICAgIFBPSU5UMTYgcHQ7CiAgICAgREMgKiBkYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKCBoZGMsIERDX01BR0lDICk7CiAgICAgaWYgKCFkYykgCiAgICAgewpAQCAtNDAyLDkgKzQ5NSw5IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgT2Zmc2V0V2luZG93T3JnRXggICAgKEdESS40NzcpCisgKiAgICAgICAgICAgT2Zmc2V0V2luZG93T3JnRXgxNiAgICAoR0RJLjQ3NykKICAqLwotQk9PTCBPZmZzZXRXaW5kb3dPcmdFeCggSERDIGhkYywgc2hvcnQgeCwgc2hvcnQgeSwgTFBQT0lOVCBwdCApCitCT09MMTYgT2Zmc2V0V2luZG93T3JnRXgxNiggSERDMTYgaGRjLCBJTlQxNiB4LCBJTlQxNiB5LCBMUFBPSU5UMTYgcHQgKQogewogICAgIERDICogZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBEQ19NQUdJQyApOwogICAgIGlmICghZGMpIHJldHVybiBGQUxTRTsKQEAgLTQyMCwxMiArNTEzLDI0IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgT2Zmc2V0V2luZG93T3JnRXgzMiAgICAoR0RJMzIuMjU4KQorICovCitCT09MMzIgT2Zmc2V0V2luZG93T3JnRXgzMiggSERDMzIgaGRjLCBJTlQzMiB4LCBJTlQzMiB5LCBMUFBPSU5UMzIgcHQgKQoreworICAgIFBPSU5UMTYgcHQxNjsKKyAgICBCT09MMTYgcmV0ID0gT2Zmc2V0V2luZG93T3JnRXgxNiggKEhEQzE2KWhkYywgKElOVDE2KXgsIChJTlQxNil5LCAmcHQxNiApOworICAgIGlmIChwdCkgQ09OVl9QT0lOVDE2VE8zMiggJnB0MTYsIHB0ICk7CisgICAgcmV0dXJuIHJldDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBTY2FsZVZpZXdwb3J0RXh0ICAgIChHREkuMTgpCiAgKi8KLURXT1JEIFNjYWxlVmlld3BvcnRFeHQoIEhEQyBoZGMsIHNob3J0IHhOdW0sIHNob3J0IHhEZW5vbSwKLQkJICAgICAgc2hvcnQgeU51bSwgc2hvcnQgeURlbm9tICkKK0RXT1JEIFNjYWxlVmlld3BvcnRFeHQoIEhEQzE2IGhkYywgSU5UMTYgeE51bSwgSU5UMTYgeERlbm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgSU5UMTYgeU51bSwgSU5UMTYgeURlbm9tICkKIHsKLSAgICBTSVpFIHNpemU7CisgICAgU0laRTE2IHNpemU7CiAgICAgREMgKiBkYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKCBoZGMsIERDX01BR0lDICk7CiAgICAgaWYgKCFkYykgCiAgICAgewpAQCAtNDUwLDEwICs1NTUsMTAgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBTY2FsZVZpZXdwb3J0RXh0RXggICAgKEdESS40ODQpCisgKiAgICAgICAgICAgU2NhbGVWaWV3cG9ydEV4dEV4MTYgICAgKEdESS40ODQpCiAgKi8KLUJPT0wgU2NhbGVWaWV3cG9ydEV4dEV4KCBIREMgaGRjLCBzaG9ydCB4TnVtLCBzaG9ydCB4RGVub20sCi0JCQkgc2hvcnQgeU51bSwgc2hvcnQgeURlbm9tLCBMUFNJWkUgc2l6ZSApCitCT09MMTYgU2NhbGVWaWV3cG9ydEV4dEV4MTYoIEhEQzE2IGhkYywgSU5UMTYgeE51bSwgSU5UMTYgeERlbm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQxNiB5TnVtLCBJTlQxNiB5RGVub20sIExQU0laRTE2IHNpemUgKQogewogICAgIERDICogZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBEQ19NQUdJQyApOwogICAgIGlmICghZGMpIHJldHVybiBGQUxTRTsKQEAgLTQ3NSwxMiArNTgwLDI2IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgU2NhbGVWaWV3cG9ydEV4dEV4MzIgICAgKEdESTMyLjI5MykKKyAqLworQk9PTDMyIFNjYWxlVmlld3BvcnRFeHRFeDMyKCBIREMzMiBoZGMsIElOVDMyIHhOdW0sIElOVDMyIHhEZW5vbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMzIgeU51bSwgSU5UMzIgeURlbm9tLCBMUFNJWkUzMiBzaXplICkKK3sKKyAgICBTSVpFMTYgc2l6ZTE2OworICAgIEJPT0wxNiByZXQgPSBTY2FsZVZpZXdwb3J0RXh0RXgxNiggKEhEQzE2KWhkYywgKElOVDE2KXhOdW0sIChJTlQxNil4RGVub20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSU5UMTYpeU51bSwgKElOVDE2KXlEZW5vbSwgJnNpemUxNiApOworICAgIGlmIChzaXplKSBDT05WX1NJWkUxNlRPMzIoICZzaXplMTYsIHNpemUgKTsKKyAgICByZXR1cm4gcmV0OworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFNjYWxlV2luZG93RXh0ICAgIChHREkuMTYpCiAgKi8KLURXT1JEIFNjYWxlV2luZG93RXh0KCBIREMgaGRjLCBzaG9ydCB4TnVtLCBzaG9ydCB4RGVub20sCi0JCSAgICAgIHNob3J0IHlOdW0sIHNob3J0IHlEZW5vbSApCitEV09SRCBTY2FsZVdpbmRvd0V4dCggSERDMTYgaGRjLCBJTlQxNiB4TnVtLCBJTlQxNiB4RGVub20sCisJCSAgICAgIElOVDE2IHlOdW0sIElOVDE2IHlEZW5vbSApCiB7Ci0gICAgU0laRSBzaXplOworICAgIFNJWkUxNiBzaXplOwogICAgIERDICogZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBEQ19NQUdJQyApOwogICAgIGlmICghZGMpIAogICAgIHsKQEAgLTUwNSwxMCArNjI0LDEwIEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgU2NhbGVXaW5kb3dFeHRFeCAgICAoR0RJLjQ4NSkKKyAqICAgICAgICAgICBTY2FsZVdpbmRvd0V4dEV4MTYgICAgKEdESS40ODUpCiAgKi8KLUJPT0wgU2NhbGVXaW5kb3dFeHRFeCggSERDIGhkYywgc2hvcnQgeE51bSwgc2hvcnQgeERlbm9tLAotCQkgICAgICAgc2hvcnQgeU51bSwgc2hvcnQgeURlbm9tLCBMUFNJWkUgc2l6ZSApCitCT09MMTYgU2NhbGVXaW5kb3dFeHRFeDE2KCBIREMxNiBoZGMsIElOVDE2IHhOdW0sIElOVDE2IHhEZW5vbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDE2IHlOdW0sIElOVDE2IHlEZW5vbSwgTFBTSVpFMTYgc2l6ZSApCiB7CiAgICAgREMgKiBkYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKCBoZGMsIERDX01BR0lDICk7CiAgICAgaWYgKCFkYykgcmV0dXJuIEZBTFNFOwpAQCAtNTI3LDMgKzY0NiwxNyBAQAogICAgIGlmIChkYy0+dy5NYXBNb2RlID09IE1NX0lTT1RST1BJQykgTUFQUElOR19GaXhJc290cm9waWMoIGRjICk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgU2NhbGVXaW5kb3dFeHRFeDMyICAgIChHREkzMi4yOTQpCisgKi8KK0JPT0wzMiBTY2FsZVdpbmRvd0V4dEV4MzIoIEhEQzMyIGhkYywgSU5UMzIgeE51bSwgSU5UMzIgeERlbm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMzIgeU51bSwgSU5UMzIgeURlbm9tLCBMUFNJWkUzMiBzaXplICkKK3sKKyAgICBTSVpFMTYgc2l6ZTE2OworICAgIEJPT0wxNiByZXQgPSBTY2FsZVdpbmRvd0V4dEV4MTYoIChIREMxNiloZGMsIChJTlQxNil4TnVtLCAoSU5UMTYpeERlbm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJTlQxNil5TnVtLCAoSU5UMTYpeURlbm9tLCAmc2l6ZTE2ICk7CisgICAgaWYgKHNpemUpIENPTlZfU0laRTE2VE8zMiggJnNpemUxNiwgc2l6ZSApOworICAgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS93aW5kb3dzL21kaS5jIGIvd2luZG93cy9tZGkuYwppbmRleCBhOTdjZmNmLi5kNjQ4OGViIDEwMDY0NAotLS0gYS93aW5kb3dzL21kaS5jCisrKyBiL3dpbmRvd3MvbWRpLmMKQEAgLTUsMTIgKzUsOCBAQAogICoKICAqIFRoaXMgZmlsZSBjb250YWlucyByb3V0aW5lcyB0byBzdXBwb3J0IE1ESSBmZWF0dXJlcy4KICAqCi0gKiBOb3RlczogV2luZG93cyBrZWVwcyBJRCBvZiBNREkgbWVudSBpdGVtIGluIHRoZSB3SURlbnUgZmllbGQKLSAqICAgICAgICBvZiBjb3JyZXNwb25kaW5nIE1ESSBjaGlsZC4KLSAqCi0gKgkgIEJhc2ljIGNoaWxkIGFjdGl2YXRpb24gcm91dGluZSBpcyBNRElfQ2hpbGRBY3RpdmF0ZSBhbmQgCi0gKiAgICAgICAgU2V0V2luZG93UG9zKGNoaWxkSHduZCwuLi4pIGltcGxpY2l0bHkgY2FsbHMgaXQgaWYgU1dQX05PQUNUSVZBVEUKLSAqICAgICAgICBpcyBub3QgdXNlZC4KKyAqIE5vdGVzOiBGYWlybHkgY29tcGxldGUgaW1wbGVtZW50YXRpb24uIEFueSB2b2x1bnRlZXJzIGZvciAKKyAqCSAgIk1vcmUgd2luZG93cy4uLiIgc3R1ZmY/CiAgKgogICogICAgICAgIEFsc28sIEV4Y2VsIGFuZCBXaW5Xb3JkIGRvIF9ub3RfIHVzZSBNREkgc28gaWYgeW91J3JlIHRyeWluZwogICoJICB0byBmaXggdGhlbSBsb29rIGVsc2V3aGVyZS4gCkBAIC0zMiw3ICsyOCw5IEBACiAjaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCisjZGVmaW5lIE1ESVNfQUxMQ0hJTERTVFlMRVMJMHgxCiAKK0hNRU5VIE1FTlVfQ29weVN5c01lbnUoKTsKIERXT1JEIFNDUk9MTF9TZXROQ1NiU3RhdGUoV05EKixpbnQsaW50LGludCxpbnQsaW50LGludCk7CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tIGRlY2xhcmF0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMTk5LDYgKzE5NywyNSBAQAogICAgIHJldHVybiBwV25kTGFzdCA/IHBXbmRMYXN0LT5od25kU2VsZiA6IDA7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJCU1ESV9DYWxjRGVmYXVsdENoaWxkUG9zCisgKgorICogIEl0IHNlZW1zIHRoYXQgZGVmYXVsdCBoZWlnaHQgaXMgMi8zIG9mIGNsaWVudCByZWN0CisgKi8KK3ZvaWQgTURJX0NhbGNEZWZhdWx0Q2hpbGRQb3MoV05EKiB3LCBXT1JEIG4sIExQUE9JTlQxNiBscFBvcywgSU5UIGRlbHRhKQoreworIFJFQ1QxNiByZWN0ID0gdy0+cmVjdENsaWVudDsKKyBJTlQgIHNwYWNpbmcgPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZQ0FQVElPTikgKyBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZRlJBTUUpIC0gMTsgCisgSU5UICBuc3RhZ2dlcjsKKworIGlmKCByZWN0LmJvdHRvbSAtIHJlY3QudG9wIC0gZGVsdGEgPj0gc3BhY2luZyApIAorICAgICByZWN0LmJvdHRvbSAtPSBkZWx0YTsKKworIG5zdGFnZ2VyID0gKHJlY3QuYm90dG9tIC0gcmVjdC50b3ApLygzKnNwYWNpbmcpOworIGxwUG9zWzFdLnggPSAocmVjdC5yaWdodCAtIHJlY3QubGVmdCAtIG5zdGFnZ2VyKnNwYWNpbmcpOworIGxwUG9zWzFdLnkgPSAocmVjdC5ib3R0b20gLSByZWN0LnRvcCAtIG5zdGFnZ2VyKnNwYWNpbmcpOworIGxwUG9zWzBdLnggPSBscFBvc1swXS55ID0gc3BhY2luZyoobiUobnN0YWdnZXIrMSkpOworfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCQkJCU1ESVNldE1lbnUKQEAgLTIxOCw4ICsyMzUsOCBAQAogCUhXTkQgaHduZEZyYW1lID0gR2V0UGFyZW50KGh3bmQpOwogCUhNRU5VIG9sZEZyYW1lTWVudSA9IEdldE1lbnUoaHduZEZyYW1lKTsKICAgICAgICAgCi0JaWYoIGNpLT5mbGFnQ2hpbGRNYXhpbWl6ZWQgJiYgaG1lbnVGcmFtZSAmJiBobWVudUZyYW1lIT1vbGRGcmFtZU1lbnUgKQotCSAgICBNRElfUmVzdG9yZUZyYW1lTWVudSh3LT5wYXJlbnQsIGNpLT5mbGFnQ2hpbGRNYXhpbWl6ZWQgKTsKKwlpZiggY2ktPmh3bmRDaGlsZE1heGltaXplZCAmJiBobWVudUZyYW1lICYmIGhtZW51RnJhbWUhPW9sZEZyYW1lTWVudSApCisJICAgIE1ESV9SZXN0b3JlRnJhbWVNZW51KHctPnBhcmVudCwgY2ktPmh3bmRDaGlsZE1heGltaXplZCApOwogCiAJaWYoIGhtZW51V2luZG93ICYmIGhtZW51V2luZG93IT1jaS0+aFdpbmRvd01lbnUgKQogCSAgewpAQCAtMjYwLDggKzI3Nyw4IEBACiAJaWYoIGhtZW51RnJhbWUgJiYgaG1lbnVGcmFtZSE9b2xkRnJhbWVNZW51KQogCSAgewogCSAgICBTZXRNZW51KGh3bmRGcmFtZSwgaG1lbnVGcmFtZSk7Ci0JICAgIGlmKCBjaS0+ZmxhZ0NoaWxkTWF4aW1pemVkICkKLQkgICAgICAgIE1ESV9BdWdtZW50RnJhbWVNZW51KGNpLCB3LT5wYXJlbnQsIGNpLT5mbGFnQ2hpbGRNYXhpbWl6ZWQgKTsKKwkgICAgaWYoIGNpLT5od25kQ2hpbGRNYXhpbWl6ZWQgKQorCSAgICAgICAgTURJX0F1Z21lbnRGcmFtZU1lbnUoY2ksIHctPnBhcmVudCwgY2ktPmh3bmRDaGlsZE1heGltaXplZCApOwogCSAgICByZXR1cm4gb2xkRnJhbWVNZW51OwogCSAgfQogCkBAIC0yODksMzMgKzMwNiw1OSBAQAogICovCiBIV05EIE1ESUNyZWF0ZUNoaWxkKFdORCAqdywgTURJQ0xJRU5USU5GTyAqY2ksIEhXTkQgcGFyZW50LCBMUEFSQU0gbFBhcmFtICkKIHsKKyAgICBQT0lOVDE2ICAgICAgICAgIHBvc1syXTsgCiAgICAgTURJQ1JFQVRFU1RSVUNUICpjcyA9IChNRElDUkVBVEVTVFJVQ1QgKilQVFJfU0VHX1RPX0xJTihsUGFyYW0pOwotICAgIEhXTkQgaHduZDsKKyAgICBEV09SRAkgICAgIHN0eWxlID0gY3MtPnN0eWxlIHwgKFdTX0NISUxEIHwgV1NfQ0xJUFNJQkxJTkdTKTsKKyAgICBIV05EIAkgICAgIGh3bmQsIGh3bmRNYXggPSAwOwogICAgIFdPUkQJICAgICB3SURtZW51ID0gY2ktPmlkRmlyc3RDaGlsZCArIGNpLT5uQWN0aXZlQ2hpbGRyZW47Ci0gICAgaW50IHNwYWNpbmc7CiAgICAgY2hhcioJICAgICBscHN0ckRlZj0ianVuayEiOwogCiAgICAgLyoKICAgICAgKiBDcmVhdGUgY2hpbGQgd2luZG93CisgICAgICoKICAgICAgKi8KIAotICAgIGNzLT5zdHlsZSAmPSAoV1NfTUlOSU1JWkUgfCBXU19NQVhJTUlaRSB8IFdTX0hTQ1JPTEwgfCBXU19WU0NST0xMKTsKKyAgICBkcHJpbnRmX21kaShzdGRuaW1wLCJNRElDcmVhdGVDaGlsZDogb3JpZ2luICVpLCVpIC0gZGltICVpLCVpLCBzdHlsZSAlMDh4XG4iLCAKKwkJCQkJIGNzLT54LCBjcy0+eSwgY3MtPmN4LCBjcy0+Y3ksICh1bnNpZ25lZCljcy0+c3R5bGUpOyAgICAKKyAgICAvKiBjYWxjdWxhdGUgcGxhY2VtZW50ICovCisgICAgTURJX0NhbGNEZWZhdWx0Q2hpbGRQb3ModywgY2ktPm5Ub3RhbENyZWF0ZWQrKywgcG9zLCAwKTsKIAotCQkJCS8qIFRoZSBjaGlsZCB3aW5kb3dzIHNob3VsZCBwcm9iYWJseSAgKi8KLQkJCQkvKiBzdGFnZ2VyLCBzaG91bGRuJ3QgdGhleT8gLURSUCAgICAgICovCi0gICAgc3BhY2luZyA9IEdldFN5c3RlbU1ldHJpY3MoU01fQ1lDQVBUSU9OKSArIEdldFN5c3RlbU1ldHJpY3MoU01fQ1lGUkFNRSk7Ci0gICAgY3MtPnggPSBjaS0+bkFjdGl2ZUNoaWxkcmVuICogc3BhY2luZzsgIAotICAgIGNzLT55ID0gY2ktPm5BY3RpdmVDaGlsZHJlbiAqIHNwYWNpbmc7CisgICAgaWYoIGNzLT5jeCA9PSBDV19VU0VERUZBVUxUMTYgfHwgIWNzLT5jeCApCisgICAgICAgIGNzLT5jeCA9IHBvc1sxXS54OworICAgIGlmKCBjcy0+Y3kgPT0gQ1dfVVNFREVGQVVMVDE2IHx8ICFjcy0+Y3kgKQorICAgICAgICBjcy0+Y3kgPSBwb3NbMV0ueTsKKworICAgIGlmKCBjcy0+eCA9PSBDV19VU0VERUZBVUxUMTYgKQorICAgICAgeworIAljcy0+eCA9IHBvc1swXS54OworCWNzLT55ID0gcG9zWzBdLnk7CisgICAgICB9CisKKyAgICAvKiByZXN0b3JlIGN1cnJlbnQgbWF4aW1pemVkIGNoaWxkICovCisgICAgaWYoIHN0eWxlICYgV1NfVklTSUJMRSAmJiBjaS0+aHduZENoaWxkTWF4aW1pemVkICkKKyAgICAgIHsKKwlpZiggc3R5bGUgJiBXU19NQVhJTUlaRSApCisJICBTZW5kTWVzc2FnZSh3LT5od25kU2VsZiwgV01fU0VUUkVEUkFXLCBGQUxTRSwgMEwgKTsKKwlod25kTWF4ID0gY2ktPmh3bmRDaGlsZE1heGltaXplZDsKKwlTaG93V2luZG93KCBod25kTWF4LCBTV19TSE9XTk9BQ1RJVkFURSApOworCWlmKCBzdHlsZSAmIFdTX01BWElNSVpFICkKKwkgIFNlbmRNZXNzYWdlKHctPmh3bmRTZWxmLCBXTV9TRVRSRURSQVcsIFRSVUUsIDBMICk7CisgICAgICB9CiAKICAgICAvKiB0aGlzIG1lbnUgaXMgbmVlZGVkIHRvIHNldCBhIGNoZWNrIG1hcmsgaW4gTURJX0NoaWxkQWN0aXZhdGUgKi8KICAgICBBcHBlbmRNZW51KGNpLT5oV2luZG93TWVudSAsTUZfU1RSSU5HICx3SURtZW51LCBNQUtFX1NFR1BUUihscHN0ckRlZikgKTsKIAogICAgIGNpLT5uQWN0aXZlQ2hpbGRyZW4rKzsKKworICAgIC8qIGZpeCB3aW5kb3cgc3R5bGUgKi8KKyAgICBpZiggISh3LT5kd1N0eWxlICYgTURJU19BTExDSElMRFNUWUxFUykgKQorICAgICAgeworICAgICAgICBzdHlsZSAmPSAoV1NfQ0hJTEQgfCBXU19DTElQU0lCTElOR1MgfCBXU19NSU5JTUlaRSB8IFdTX01BWElNSVpFIHwKKyAgICAgICAgICAgICAgICAgIFdTX0NMSVBDSElMRFJFTiB8IFdTX0RJU0FCTEVEIHwgV1NfVlNDUk9MTCB8IFdTX0hTQ1JPTEwgKTsKKyAgICAgICAgc3R5bGUgfD0gKFdTX1ZJU0lCTEUgfCBXU19PVkVSTEFQUEVEV0lORE9XKTsKKyAgICAgIH0KICAKLSAgICBod25kID0gQ3JlYXRlV2luZG93MTYoIGNzLT5zekNsYXNzLCBjcy0+c3pUaXRsZSwKLQkJCSAgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBXU19DQVBUSU9OIHwgV1NfQ0xJUFNJQkxJTkdTIHwKLQkJCSAgV1NfTUFYSU1JWkVCT1ggfCBXU19NSU5JTUlaRUJPWCB8IFdTX1NZU01FTlUgfAotCQkJICBXU19USElDS0ZSQU1FIHwgV1NfVklTSUJMRSB8IGNzLT5zdHlsZSwKKyAgICBod25kID0gQ3JlYXRlV2luZG93MTYoIGNzLT5zekNsYXNzLCBjcy0+c3pUaXRsZSwgc3R5bGUsIAogCQkJICBjcy0+eCwgY3MtPnksIGNzLT5jeCwgY3MtPmN5LCBwYXJlbnQsIAogICAgICAgICAgICAgICAgICAgICAgICAgIChITUVOVSkoRFdPUkQpKFdPUkQpd0lEbWVudSwgdy0+aEluc3RhbmNlLCAKIAkJCSAoU0VHUFRSKWxQYXJhbSk7CkBAIC0zMjcsOCArMzcwLDEwIEBACiAgICAgfQogICAgIGVsc2UKICAgICB7Ci0gICAgICAgY2ktPm5BY3RpdmVDaGlsZHJlbi0tOworCWNpLT5uQWN0aXZlQ2hpbGRyZW4tLTsKIAlEZWxldGVNZW51KGNpLT5oV2luZG93TWVudSx3SURtZW51LE1GX0JZQ09NTUFORCk7CisJaWYoIElzV2luZG93KGh3bmRNYXgpICkKKwkgICAgU2hvd1dpbmRvdyhod25kTWF4LCBTV19TSE9XTUFYSU1JWkVEKTsKICAgICB9CiAJCiAgICAgcmV0dXJuIGh3bmQ7CkBAIC0zMzYsMTYgKzM4MSwxNSBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCQlNRElfQ2hpbGRHZXRNaW5NYXhJbmZvCi0gKgogICovCi12b2lkIE1ESV9DaGlsZEdldE1pbk1heEluZm8oV05EKiBjbGllbnRXbmQsIEhXTkQgaHduZCwgTUlOTUFYSU5GTyogbHBNaW5NYXggKQordm9pZCBNRElfQ2hpbGRHZXRNaW5NYXhJbmZvKFdORCogY2xpZW50V25kLCBIV05EIGh3bmQsIE1JTk1BWElORk8xNiogbHBNaW5NYXggKQogewogIFdORCoJY2hpbGRXbmQgPSBXSU5fRmluZFduZFB0cihod25kKTsKLSBSRUNUIAlyZWN0IAkgPSBjbGllbnRXbmQtPnJlY3RDbGllbnQ7CisgUkVDVDE2CXJlY3QgCSA9IGNsaWVudFduZC0+cmVjdENsaWVudDsKIAotIE1hcFdpbmRvd1BvaW50cyhjbGllbnRXbmQtPnBhcmVudC0+aHduZFNlbGYsIAotCSAgICAgICAoKE1ESUNMSUVOVElORk8qKWNsaWVudFduZC0+d0V4dHJhKS0+c2VsZiwgKExQUE9JTlQpJnJlY3QsIDIpOwotIEFkanVzdFdpbmRvd1JlY3RFeCgmcmVjdCwgY2hpbGRXbmQtPmR3U3R5bGUsIDAsIGNoaWxkV25kLT5kd0V4U3R5bGUpOworIE1hcFdpbmRvd1BvaW50czE2KGNsaWVudFduZC0+cGFyZW50LT5od25kU2VsZiwgCisJICAgICAgICgoTURJQ0xJRU5USU5GTyopY2xpZW50V25kLT53RXh0cmEpLT5zZWxmLCAoTFBQT0lOVDE2KSZyZWN0LCAyKTsKKyBBZGp1c3RXaW5kb3dSZWN0RXgxNiggJnJlY3QsIGNoaWxkV25kLT5kd1N0eWxlLCAwLCBjaGlsZFduZC0+ZHdFeFN0eWxlICk7CiAKICBscE1pbk1heC0+cHRNYXhTaXplLnggPSByZWN0LnJpZ2h0IC09IHJlY3QubGVmdDsKICBscE1pbk1heC0+cHRNYXhTaXplLnkgPSByZWN0LmJvdHRvbSAtPSByZWN0LnRvcDsKQEAgLTM4MiwxMSArNDI2LDExIEBACiAKICAgICBpZiAoIGh3bmRUbyAhPSBod25kUHJldiApCiAJewotCSAgQk9PTCBiU0EgPSAwOworCSAgQk9PTCBiT3B0aW1pemUgPSAwOwogCi0JICBpZiggY2ktPmZsYWdDaGlsZE1heGltaXplZCApCisJICBpZiggY2ktPmh3bmRDaGlsZE1heGltaXplZCApCiAJICAgIHsKLQkgICAgICBiU0EgPSAxOyAKKwkgICAgICBiT3B0aW1pemUgPSAxOyAKIAkgICAgICB3LT5kd1N0eWxlICY9IH5XU19WSVNJQkxFOwogCSAgICB9CiAKQEAgLTM5OCw3ICs0NDIsNyBAQAogCQkgIAkgICAgIFNXUF9OT01PVkUgfCBTV1BfTk9TSVpFIHwgU1dQX05PQUNUSVZBVEUpOwogCSAgICB9CiAKLQkgIGlmKCBiU0EgKQorCSAgaWYoIGJPcHRpbWl6ZSApCiAJICAgICAgIFNob3dXaW5kb3coIGNsaWVudEh3bmQsIFNXX1NIT1cgKTsKIAl9CiB9CkBAIC00MjEsMTAgKzQ2NSwxMCBAQAogCSAgICBpZiggY2hpbGQgPT0gY2ktPmh3bmRBY3RpdmVDaGlsZCApCiAJICAgICAgewogCQlTaG93V2luZG93KCBjaGlsZCwgU1dfSElERSk7Ci0JCWlmKCBjaGlsZCA9PSBjaS0+ZmxhZ0NoaWxkTWF4aW1pemVkICkKKwkJaWYoIGNoaWxkID09IGNpLT5od25kQ2hpbGRNYXhpbWl6ZWQgKQogCQkgIHsKIAkJICAgIE1ESV9SZXN0b3JlRnJhbWVNZW51KHdfcGFyZW50LT5wYXJlbnQsIGNoaWxkKTsKLQkJICAgIGNpLT5mbGFnQ2hpbGRNYXhpbWl6ZWQgPSAwOworCQkgICAgY2ktPmh3bmRDaGlsZE1heGltaXplZCA9IDA7CiAJCSAgICBNRElfVXBkYXRlRnJhbWVUZXh0KHdfcGFyZW50LT5wYXJlbnQscGFyZW50LFRSVUUsTlVMTCk7CiAJCSAgfQogCkBAIC00ODksOCArNTMzLDggQEAKICAgICAgIH0KIAogICAgIC8qIHNldCBhcHBlYXJhbmNlICovCi0gICAgaWYoIGNsaWVudEluZm8tPmZsYWdDaGlsZE1heGltaXplZCApCi0gICAgICBpZiggY2xpZW50SW5mby0+ZmxhZ0NoaWxkTWF4aW1pemVkICE9IGhXbmRDaGlsZCApCisgICAgaWYoIGNsaWVudEluZm8tPmh3bmRDaGlsZE1heGltaXplZCApCisgICAgICBpZiggY2xpZW50SW5mby0+aHduZENoaWxkTWF4aW1pemVkICE9IGhXbmRDaGlsZCApCiAgICAgICAgIGlmKCBoV25kQ2hpbGQgKQogCSAgICAgICAgewogCQkgIGNsaWVudEluZm8tPmh3bmRBY3RpdmVDaGlsZCA9IGhXbmRDaGlsZDsKQEAgLTU0NCw3ICs1ODgsNyBAQAogICoKICAqICBpVG90YWwgcmV0dXJucyBudW1iZXIgb2YgY2hpbGRyZW4gYXZhaWxhYmxlIGZvciB0aWxpbmcgb3IgY2FzY2FkaW5nCiAgKi8KLU1ESVdDTCogTURJX0J1aWxkV0NMKFdORCogY2xpZW50V25kLCBpbnQqIGlUb3RhbCkKK01ESVdDTCogTURJX0J1aWxkV0NMKFdORCogY2xpZW50V25kLCBJTlQqIGlUb3RhbCkKIHsKICAgICBNRElXQ0wgKmxpc3RUb3AsKmxpc3ROZXh0OwogICAgIFdORCAgICAqY2hpbGRXbmQ7CkBAIC02MjMsNTkgKzY2Nyw0MiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCQkJCU1ESUNhc2NhZGUKICAqLwotTE9ORyBNRElDYXNjYWRlKEhXTkQgcGFyZW50LCBNRElDTElFTlRJTkZPICpjaSkKK0xPTkcgTURJQ2FzY2FkZShXTkQqIGNsaWVudFduZCwgTURJQ0xJRU5USU5GTyAqY2kpCiB7Ci0gICAgV05ECQkgKmNsaWVudFduZDsKICAgICBNRElXQ0wJICpsaXN0VG9wLCpsaXN0UHJldjsKLSAgICBSRUNUICAgICAgICAgIHJlY3Q7Ci0gICAgaW50ICAgICAgICAgICBzcGFjaW5nLCB4c2l6ZSwgeXNpemU7Ci0gICAgaW50CQkgIHgsIHk7Ci0gICAgaW50CQkgIGlUb1Bvc2l0aW9uID0gMDsKLQotICAgIGlmIChjaS0+ZmxhZ0NoaWxkTWF4aW1pemVkKQotCVNob3dXaW5kb3coIGNpLT5mbGFnQ2hpbGRNYXhpbWl6ZWQsIFNXX05PUk1BTCk7CisgICAgSU5UMTYJICBkZWx0YSA9IDAsaVRvUG9zaXRpb24gPSAwLCBuID0gMDsKKyAgICBQT0lOVDE2ICAgICAgIHBvc1syXTsKKyAgCisgICAgaWYgKGNpLT5od25kQ2hpbGRNYXhpbWl6ZWQpCisgICAgICAgIFNob3dXaW5kb3coIGNpLT5od25kQ2hpbGRNYXhpbWl6ZWQsIFNXX05PUk1BTCk7CiAKICAgICBpZiAoY2ktPm5BY3RpdmVDaGlsZHJlbiA9PSAwKSByZXR1cm4gMDsKIAotICAgIEdldENsaWVudFJlY3QocGFyZW50LCAmcmVjdCk7Ci0gICAgc3BhY2luZyA9IEdldFN5c3RlbU1ldHJpY3MoU01fQ1lDQVBUSU9OKSArIEdldFN5c3RlbU1ldHJpY3MoU01fQ1lGUkFNRSk7Ci0gICAgeXNpemUgICA9IHJlY3QuYm90dG9tIC0gOCAqIHNwYWNpbmc7Ci0gICAgeHNpemUgICA9IHJlY3QucmlnaHQgIC0gOCAqIHNwYWNpbmc7Ci0gICAgCi0gICAgZHByaW50Zl9tZGkoc3RkZGViLCAiTURJQ2FzY2FkZTogQ2xpZW50IHduZCBhdCAoJWQsJWQpIC0gKCVkLCVkKSwgc3BhY2luZyAlZFxuIiwgCi0gICAgICAgICAgICAgICAgcmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC5yaWdodCwgcmVjdC5ib3R0b20sIHNwYWNpbmcpOwotICAgIAotICAgIGNsaWVudFduZCA9ICBXSU5fRmluZFduZFB0ciggcGFyZW50ICk7CisgICAgaWYgKCEobGlzdFRvcCA9IE1ESV9CdWlsZFdDTChjbGllbnRXbmQsJmlUb1Bvc2l0aW9uKSkpIHJldHVybiAwOwogCi0gICAgbGlzdFRvcCAgID0gIE1ESV9CdWlsZFdDTChjbGllbnRXbmQsJmlUb1Bvc2l0aW9uKTsgCi0KLSAgICBpZiggIWxpc3RUb3AgKSByZXR1cm4gMDsKLQotICAgIHggPSAwOwotICAgIHkgPSAwOworICAgIGlmKCBpVG9Qb3NpdGlvbiA8IGNpLT5uQWN0aXZlQ2hpbGRyZW4gKSAKKyAgICAgICAgZGVsdGEgPSAyICogU1lTTUVUUklDU19DWUlDT05TUEFDSU5HICsgU1lTTUVUUklDU19DWUlDT047CiAKICAgICAvKiB3YWxrIGxpc3QgYW5kIG1vdmUgd2luZG93cyAqLwogICAgIHdoaWxlICggbGlzdFRvcCApCiAgICAgewogCWRwcmludGZfbWRpKHN0ZGRlYiwgIk1ESUNhc2NhZGU6IG1vdmUgJTA0eCB0byAoJWQsJWQpIHNpemUgWyVkLCVkXVxuIiwgCi0JCWxpc3RUb3AtPmhDaGlsZCwgeCwgeSwgeHNpemUsIHlzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgbGlzdFRvcC0+aENoaWxkLCBwb3NbMF0ueCwgcG9zWzBdLnksIHBvc1sxXS54LCBwb3NbMV0ueSk7CiAKIAlpZiggbGlzdFRvcC0+aENoaWxkICkKLSAgICAgICAgICB7Ci0JICAgU2V0V2luZG93UG9zKGxpc3RUb3AtPmhDaGlsZCwgMCwgeCwgeSwgeHNpemUsIHlzaXplLCAKLQkJICAgICBTV1BfRFJBV0ZSQU1FIHwgU1dQX05PQUNUSVZBVEUgfCBTV1BfTk9aT1JERVIpOworICAgICAgICB7CisgICAgICAgICAgICBNRElfQ2FsY0RlZmF1bHRDaGlsZFBvcyhjbGllbnRXbmQsIG4rKywgcG9zLCBkZWx0YSk7CisgICAgICAgICAgICBTZXRXaW5kb3dQb3MobGlzdFRvcC0+aENoaWxkLCAwLCBwb3NbMF0ueCwgcG9zWzBdLnksIHBvc1sxXS54LCBwb3NbMV0ueSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTV1BfRFJBV0ZSQU1FIHwgU1dQX05PQUNUSVZBVEUgfCBTV1BfTk9aT1JERVIpOworICAgICAgICB9CiAKLQl4ICs9IHNwYWNpbmc7Ci0JeSArPSBzcGFjaW5nOwotCSAgfQotCQogCWxpc3RQcmV2ID0gbGlzdFRvcC0+cHJldjsKIAlmcmVlKGxpc3RUb3ApOwogCWxpc3RUb3AgPSBsaXN0UHJldjsKICAgICB9CiAKICAgICBpZiggaVRvUG9zaXRpb24gPCBjaS0+bkFjdGl2ZUNoaWxkcmVuICkKLQlBcnJhbmdlSWNvbmljV2luZG93cyggcGFyZW50ICk7CisgICAgICAgIEFycmFuZ2VJY29uaWNXaW5kb3dzKCBjbGllbnRXbmQtPmh3bmRTZWxmICk7CiAKICAgICByZXR1cm4gMDsKIH0KQEAgLTY4NCwyMCArNzExLDE5IEBACiAgKgkJCQkJTURJVGlsZQogICoKICAqLwotTE9ORyBNRElUaWxlKEhXTkQgcGFyZW50LCBNRElDTElFTlRJTkZPICpjaSxXT1JEIHdQYXJhbSkKK0xPTkcgTURJVGlsZShXTkQqIHduZENsaWVudCwgTURJQ0xJRU5USU5GTyAqY2ksV09SRCB3UGFyYW0pCiB7Ci0gICAgV05ECQkgKnduZENsaWVudCA9IFdJTl9GaW5kV25kUHRyKHBhcmVudCk7CiAgICAgTURJV0NMICAgICAgICpsaXN0VG9wLCpsaXN0UHJldjsKLSAgICBSRUNUICAgICAgICAgIHJlY3Q7CisgICAgUkVDVDE2ICAgICAgICByZWN0OwogICAgIGludCAgICAgICAgICAgeHNpemUsIHlzaXplOwogICAgIGludAkJICB4LCB5OwogICAgIGludAkJICByb3dzLCBjb2x1bW5zOwogICAgIGludCAgICAgICAgICAgciwgYzsKICAgICBpbnQgICAgICAgICAgIGk7Ci0gICAgaW50CQkgIGlUb1Bvc2l0aW9uID0gMDsKKyAgICBJTlQJCSAgaVRvUG9zaXRpb24gPSAwOwogCi0gICAgaWYgKGNpLT5mbGFnQ2hpbGRNYXhpbWl6ZWQpCi0JU2hvd1dpbmRvdyhjaS0+ZmxhZ0NoaWxkTWF4aW1pemVkLCBTV19OT1JNQUwpOworICAgIGlmIChjaS0+aHduZENoaWxkTWF4aW1pemVkKQorCVNob3dXaW5kb3coY2ktPmh3bmRDaGlsZE1heGltaXplZCwgU1dfTk9STUFMKTsKIAogICAgIGlmIChjaS0+bkFjdGl2ZUNoaWxkcmVuID09IDApIHJldHVybiAwOwogCkBAIC03MTAsOSArNzM2LDcgQEAKICAgICAvKiB0aWxlIGNoaWxkcmVuICovCiAgICAgaWYgKCBpVG9Qb3NpdGlvbiApCiAgICAgewotCi0gICAgCUdldENsaWVudFJlY3QocGFyZW50LCAmcmVjdCk7Ci0KKyAgICAgICAgcmVjdCA9IHduZENsaWVudC0+cmVjdENsaWVudDsKICAgICAJcm93cyAgICA9IChpbnQpIHNxcnQoKGRvdWJsZSkgaVRvUG9zaXRpb24pOwogICAgIAljb2x1bW5zID0gaVRvUG9zaXRpb24gLyByb3dzOwogCkBAIC03NzQsNyArNzk4LDcgQEAKICAgICB9CiAgICAgCiAgICAgaWYgKGlUb1Bvc2l0aW9uIDwgY2ktPm5BY3RpdmVDaGlsZHJlbiApCi0gICAgICAgIEFycmFuZ2VJY29uaWNXaW5kb3dzKCBwYXJlbnQgKTsKKyAgICAgICAgQXJyYW5nZUljb25pY1dpbmRvd3MoIHduZENsaWVudC0+aHduZFNlbGYgKTsKIAogICAgIHJldHVybiAwOwogfQpAQCAtNzg3LDIwICs4MTEsMjUgQEAKICAqLwogQk9PTCBNRElfQXVnbWVudEZyYW1lTWVudShNRElDTElFTlRJTkZPKiBjaSwgV05EICpmcmFtZSwgSFdORCBoQ2hpbGQpCiB7Ci0gV05EKgljaGlsZCA9IFdJTl9GaW5kV25kUHRyKGhDaGlsZCk7Ci0gSE1FTlUgIGhTeXNQb3B1cCA9IDA7CisgV05EKgkJY2hpbGQgPSBXSU5fRmluZFduZFB0cihoQ2hpbGQpOworIFBPUFVQTUVOVSoJcG1lbnUgPSBOVUxMOworIEhNRU5VICAJaFN5c1BvcHVwID0gMDsKIAogIGRwcmludGZfbWRpKHN0ZGRlYiwiTURJX0F1Z21lbnRGcmFtZU1lbnU6IGZyYW1lICVwLGNoaWxkICUwNHhcbiIsZnJhbWUsaENoaWxkKTsKIAogIGlmKCAhZnJhbWUtPndJRG1lbnUgfHwgIWNoaWxkLT5oU3lzTWVudSApIHJldHVybiAwOyAKKworIC8qIGNyZWF0ZSBhIGNvcHkgb2Ygc3lzbWVudSBwb3B1cCBhbmQgaW5zZXJ0IGl0IGludG8gZnJhbWUgbWVudSBiYXIgKi8KICAKLSBoU3lzUG9wdXAgPSBHZXRTeXN0ZW1NZW51KGhDaGlsZCxGQUxTRSk7CisgaFN5c1BvcHVwID0gTUVOVV9Db3B5U3lzTWVudSgpOworIHBtZW51ID0gKFBPUFVQTUVOVSopIFVTRVJfSEVBUF9MSU5fQUREUihoU3lzUG9wdXApOworIHBtZW51LT53RmxhZ3MgJj0gfk1GX1NZU01FTlU7CiAKICBkcHJpbnRmX21kaShzdGRkZWIsIlx0XHRnb3QgcG9wdXAgJTA0eFxuIGluIHN5c21lbnUgJTA0eCIsaFN5c1BvcHVwLGNoaWxkLT5oU3lzTWVudSk7CiAgCiAgaWYoICFJbnNlcnRNZW51KGZyYW1lLT53SURtZW51LDAsTUZfQllQT1NJVElPTiB8IE1GX0JJVE1BUCB8IE1GX1BPUFVQLAogICAgICAgICAgICAgICAgICBoU3lzUG9wdXAsIChTRUdQVFIpKERXT1JEKWNpLT5vYm1DbG9zZSkgKQotICAgICAgcmV0dXJuIDA7CisgICB7ICBEZXN0cm95TWVudShoU3lzUG9wdXApOyByZXR1cm4gMDsgfQogCiAgaWYoICFBcHBlbmRNZW51KGZyYW1lLT53SURtZW51LE1GX0hFTFAgfCBNRl9CSVRNQVAsCiAgICAgICAgICAgICAgICAgIFNDX1JFU1RPUkUsIChTRUdQVFIpKERXT1JEKWNpLT5vYm1SZXN0b3JlKSApCkBAIC04MDksMTAgKzgzOCw2IEBACiAgICAgICByZXR1cm4gMDsKICAgIH0KIAotIC8qIEZJWE1FOiBhZGQgYSBjYWxsIHRvIGZ1bmN0aW9uIHRoYXQgc2V0cyBzeXNtZW51IGl0ZW1zIGFjY29yZGluZwotICAqICAgICAgICB0byB0aGUgd2luZG93IHN0YXRlLiBXU19NQVhJTUlaRSAtPiBubyBTQ19TSVpFLCBldGMuLi4KLSAgKi8KLQogIEVuYWJsZU1lbnVJdGVtKGhTeXNQb3B1cCwgU0NfU0laRSwgTUZfQllDT01NQU5EIHwgTUZfR1JBWUVEKTsKICBFbmFibGVNZW51SXRlbShoU3lzUG9wdXAsIFNDX01PVkUsIE1GX0JZQ09NTUFORCB8IE1GX0dSQVlFRCk7CiAgRW5hYmxlTWVudUl0ZW0oaFN5c1BvcHVwLCBTQ19NQVhJTUlaRSwgTUZfQllDT01NQU5EIHwgTUZfR1JBWUVEKTsKQEAgLTg0MCwxMCArODY1LDYgQEAKIAogIGNoaWxkLT5kd1N0eWxlIHw9IFdTX1NZU01FTlU7CiAKLSAgLyogRklYTUU6IGFkZCBhIGNhbGwgdG8gZnVuY3Rpb24gdGhhdCBzZXRzIHN5c21lbnUgaXRlbXMgYWNjb3JkaW5nCi0gICogICAgICAgIHRvIHRoZSB3aW5kb3cgc3RhdGUuIFdTX01BWElNSVpFIC0+IG5vIFNDX1NJWkUsIGV0Yy4uLgotICAqLwotCiAgUmVtb3ZlTWVudShmcmFtZVduZC0+d0lEbWVudSwwLE1GX0JZUE9TSVRJT04pOwogIERlbGV0ZU1lbnUoZnJhbWVXbmQtPndJRG1lbnUsbkl0ZW1zLTEsTUZfQllQT1NJVElPTik7CiAKQEAgLTg4Myw3ICs5MDQsNyBAQAogCiAgaWYoIGNpLT5oRnJhbWVUaXRsZSApCiAgICB7Ci0gICAgIFdORCogY2hpbGRXbmQgPSBXSU5fRmluZFduZFB0ciggY2ktPmZsYWdDaGlsZE1heGltaXplZCApOyAgICAgCisgICAgIFdORCogY2hpbGRXbmQgPSBXSU5fRmluZFduZFB0ciggY2ktPmh3bmRDaGlsZE1heGltaXplZCApOyAgICAgCiAKICAgICAgaWYoIGNoaWxkV25kICYmIGNoaWxkV25kLT5oVGV4dCApCiAgICAgICAgewpAQCAtOTUxLDEwICs5NzIsMTAgQEAKICAqLwogTFJFU1VMVCBNRElDbGllbnRXbmRQcm9jKEhXTkQgaHduZCwgVUlOVCBtZXNzYWdlLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewotICAgIExQQ1JFQVRFU1RSVUNUICAgICAgIGNzOworICAgIExQQ1JFQVRFU1RSVUNUMTYgICAgIGNzOwogICAgIExQQ0xJRU5UQ1JFQVRFU1RSVUNUIGNjczsKICAgICBNRElDTElFTlRJTkZPICAgICAgICpjaTsKLSAgICBSRUNUCQkgcmVjdDsKKyAgICBSRUNUMTYJCSByZWN0OwogICAgIFdORCAgICAgICAgICAgICAgICAgKncgCSAgPSBXSU5fRmluZFduZFB0cihod25kKTsKICAgICBXTkQJCQkqZnJhbWVXbmQgPSB3LT5wYXJlbnQ7CiAKQEAgLTk2MywxMyArOTg0LDE0IEBACiAgICAgc3dpdGNoIChtZXNzYWdlKQogICAgIHsKICAgICAgIGNhc2UgV01fQ1JFQVRFOgotCWNzICAgICAgICAgICAgICAgICAgICAgID0gKExQQ1JFQVRFU1RSVUNUKSBQVFJfU0VHX1RPX0xJTihsUGFyYW0pOworCWNzICAgICAgICAgICAgICAgICAgICAgID0gKExQQ1JFQVRFU1RSVUNUMTYpIFBUUl9TRUdfVE9fTElOKGxQYXJhbSk7CiAJY2NzICAgICAgICAgICAgICAgICAgICAgPSAoTFBDTElFTlRDUkVBVEVTVFJVQ1QpIFBUUl9TRUdfVE9fTElOKGNzLT5scENyZWF0ZVBhcmFtcyk7CiAKIAljaS0+aFdpbmRvd01lbnUgICAgICAgICA9IGNjcy0+aFdpbmRvd01lbnU7CiAJY2ktPmlkRmlyc3RDaGlsZCAgICAgICAgPSBjY3MtPmlkRmlyc3RDaGlsZDsKLQljaS0+ZmxhZ0NoaWxkTWF4aW1pemVkICA9IDA7CisJY2ktPmh3bmRDaGlsZE1heGltaXplZCAgPSAwOwogCWNpLT5uQWN0aXZlQ2hpbGRyZW4JPSAwOworCWNpLT5uVG90YWxDcmVhdGVkCT0gMDsKIAljaS0+aEZyYW1lVGl0bGUJCT0gZnJhbWVXbmQtPmhUZXh0OwogCWNpLT5zYk5lZWRVcGRhdGUJPSAwOwogCWNpLT5zZWxmCQk9IGh3bmQ7CkBAIC05ODIsOCArMTAwNCw4IEBACiAKIAlBcHBlbmRNZW51KGNjcy0+aFdpbmRvd01lbnUsTUZfU0VQQVJBVE9SLDAsKFNFR1BUUikwKTsKIAotCUdldENsaWVudFJlY3QoZnJhbWVXbmQtPmh3bmRTZWxmLCAmcmVjdCk7Ci0JTkNfSGFuZGxlTkNDYWxjU2l6ZShod25kLCAoTkNDQUxDU0laRV9QQVJBTVMqKSAmcmVjdCk7CisJR2V0Q2xpZW50UmVjdDE2KGZyYW1lV25kLT5od25kU2VsZiwgJnJlY3QpOworCU5DX0hhbmRsZU5DQ2FsY1NpemUoaHduZCwgKE5DQ0FMQ1NJWkVfUEFSQU1TMTYqKSAmcmVjdCk7CiAJdy0+cmVjdENsaWVudCA9IHJlY3Q7CiAKIAlkcHJpbnRmX21kaShzdGRkZWIsIk1ESTogQ2xpZW50IGNyZWF0ZWQgLSBod25kID0gJTA0eCwgaWRGaXJzdCA9ICV1XG4iLGh3bmQsY2ktPmlkRmlyc3RDaGlsZCk7CkBAIC05OTEsNyArMTAxMyw3IEBACiAJcmV0dXJuIDA7CiAgICAgICAKICAgICAgIGNhc2UgV01fREVTVFJPWToKLQlpZiggY2ktPmZsYWdDaGlsZE1heGltaXplZCApIE1ESV9SZXN0b3JlRnJhbWVNZW51KHcsIGZyYW1lV25kLT5od25kU2VsZik7CisJaWYoIGNpLT5od25kQ2hpbGRNYXhpbWl6ZWQgKSBNRElfUmVzdG9yZUZyYW1lTWVudSh3LCBmcmFtZVduZC0+aHduZFNlbGYpOwogCiAJaWYoY2ktPm9ibUNsb3NlKSAgIERlbGV0ZU9iamVjdChjaS0+b2JtQ2xvc2UpOwogCWlmKGNpLT5vYm1SZXN0b3JlKSBEZWxldGVPYmplY3QoY2ktPm9ibVJlc3RvcmUpOwpAQCAtMTAxMCw3ICsxMDMyLDcgQEAKIAlyZXR1cm4gMDsKIAogICAgICAgY2FzZSBXTV9NRElDQVNDQURFOgotCXJldHVybiBNRElDYXNjYWRlKGh3bmQsIGNpKTsKKwlyZXR1cm4gTURJQ2FzY2FkZSh3LCBjaSk7CiAKICAgICAgIGNhc2UgV01fTURJQ1JFQVRFOgogCXJldHVybiAoTE9ORylNRElDcmVhdGVDaGlsZCh3LCBjaSwgaHduZCwgbFBhcmFtICk7CkBAIC0xMDIwLDcgKzEwNDIsNyBAQAogCiAgICAgICBjYXNlIFdNX01ESUdFVEFDVElWRToKIAlyZXR1cm4gKChMT05HKSBjaS0+aHduZEFjdGl2ZUNoaWxkIHwgCi0JCSgoTE9ORykgKGNpLT5mbGFnQ2hpbGRNYXhpbWl6ZWQ+MCkgPDwgMTYpKTsKKwkJKChMT05HKSAoY2ktPmh3bmRDaGlsZE1heGltaXplZD4wKSA8PCAxNikpOwogCiAgICAgICBjYXNlIFdNX01ESUlDT05BUlJBTkdFOgogCWNpLT5zYk5lZWRVcGRhdGUgPSBUUlVFOwpAQCAtMTA1MSw3ICsxMDczLDcgQEAKICAgICAgIGNhc2UgV01fTURJVElMRToKIAljaS0+c2JOZWVkVXBkYXRlID0gVFJVRTsKIAlTaG93U2Nyb2xsQmFyKGh3bmQsU0JfQk9USCxGQUxTRSk7Ci0JTURJVGlsZShod25kLCBjaSx3UGFyYW0pOworCU1ESVRpbGUodywgY2ksd1BhcmFtKTsKICAgICAgICAgY2ktPnNiTmVlZFVwZGF0ZSA9IEZBTFNFOwogICAgICAgICByZXR1cm4gMDsKIApAQCAtMTA3OCwxMSArMTEwMCwxMSBAQAogCQogICAgICAgY2FzZSBXTV9QQVJFTlROT1RJRlk6CiAgICAgICAgIGlmKCB3UGFyYW0gPT0gV01fTEJVVFRPTkRPV04gKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIExQUE9JTlQgIGxwcHQgPSAoTFBQT0lOVCkodm9pZCopKCZsUGFyYW0pOwotICAgICAgICAgICAgSFdORCAgICAgY2hpbGQgPSBDaGlsZFdpbmRvd0Zyb21Qb2ludChod25kLCAqbHBwdCk7CisgICAgICAgIHsKKyAgICAgICAgICAgIFBPSU5UMTYgIHB0ID0gTUFLRVBPSU5UMTYobFBhcmFtKTsKKyAgICAgICAgICAgIEhXTkQgICAgIGNoaWxkID0gQ2hpbGRXaW5kb3dGcm9tUG9pbnQxNihod25kLCBwdCk7CiAKLQkgICAgZHByaW50Zl9tZGkoc3RkZGViLCJNRElDbGllbnQ6IG5vdGlmaWNhdGlvbiBmcm9tICUwNHggKCVpLCVpKVxuIixjaGlsZCxscHB0LT54LGxwcHQtPnkpOworCSAgICBkcHJpbnRmX21kaShzdGRkZWIsIk1ESUNsaWVudDogbm90aWZpY2F0aW9uIGZyb20gJTA0eCAoJWksJWkpXG4iLGNoaWxkLHB0LngscHQueSk7CiAKICAgICAgICAgICAgIGlmKCBjaGlsZCAmJiBjaGlsZCAhPSBod25kICkKICAgICAgICAgICAgICAgewpAQCAtMTA5OCwxMyArMTEyMCwxMyBAQAogICAgICAgICByZXR1cm4gMDsKIAogICAgICAgY2FzZSBXTV9TSVpFOgotCWlmKCBjaS0+ZmxhZ0NoaWxkTWF4aW1pemVkICkKKyAgICAgICAgICBpZiggY2ktPmh3bmRDaGlsZE1heGltaXplZCApCiAJICB7Ci0JICAgICBXTkQqCWNoaWxkID0gV0lOX0ZpbmRXbmRQdHIoY2ktPmZsYWdDaGlsZE1heGltaXplZCk7Ci0JICAgICBSRUNUCXJlY3QgID0geyAwLCAwLCBMT1dPUkQobFBhcmFtKSwgSElXT1JEKGxQYXJhbSkgfTsKKwkgICAgIFdORCoJY2hpbGQgPSBXSU5fRmluZFduZFB0cihjaS0+aHduZENoaWxkTWF4aW1pemVkKTsKKwkgICAgIFJFQ1QxNglyZWN0ICA9IHsgMCwgMCwgTE9XT1JEKGxQYXJhbSksIEhJV09SRChsUGFyYW0pIH07CiAKLQkgICAgIEFkanVzdFdpbmRvd1JlY3RFeCgmcmVjdCwgY2hpbGQtPmR3U3R5bGUsIDAsIGNoaWxkLT5kd0V4U3R5bGUpOwotCSAgICAgTW92ZVdpbmRvdyhjaS0+ZmxhZ0NoaWxkTWF4aW1pemVkLCByZWN0LmxlZnQsIHJlY3QudG9wLAorCSAgICAgQWRqdXN0V2luZG93UmVjdEV4MTYoJnJlY3QsIGNoaWxkLT5kd1N0eWxlLCAwLCBjaGlsZC0+ZHdFeFN0eWxlKTsKKwkgICAgIE1vdmVXaW5kb3coY2ktPmh3bmRDaGlsZE1heGltaXplZCwgcmVjdC5sZWZ0LCByZWN0LnRvcCwKIAkJCXJlY3QucmlnaHQgLSByZWN0LmxlZnQsIHJlY3QuYm90dG9tIC0gcmVjdC50b3AsIDEpOwogCSAgfQogCWVsc2UKQEAgLTExNDQsNyArMTE2Niw3IEBACiAJICAgIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGh3bmRNRElDbGllbnQpOwogCSAgICBjaSAgICAgPSAoTURJQ0xJRU5USU5GTyopd25kUHRyLT53RXh0cmE7CiAKLQkgICAgLyogY2hlY2sgZm9yIHBvc3NpYmxlIHN5c3RlbSBjb21tYW5kIGNvZGVzICovCisJICAgIC8qIGNoZWNrIGZvciBwb3NzaWJsZSBzeXNjb21tYW5kcyBmb3IgbWF4aW1pemVkIE1ESSBjaGlsZCAqLwogCiAJICAgIGlmKCB3UGFyYW0gPCAgY2ktPmlkRmlyc3RDaGlsZCB8fCAKIAkJd1BhcmFtID49IGNpLT5pZEZpcnN0Q2hpbGQgKyBjaS0+bkFjdGl2ZUNoaWxkcmVuICkKQEAgLTExNjAsOCArMTE4Miw4IEBACiAJCSAgICBjYXNlIFNDX1BSRVZXSU5ET1c6CiAJCSAgICBjYXNlIFNDX0NMT1NFOgogCQkgICAgY2FzZSBTQ19SRVNUT1JFOgotCQkgICAgICAgaWYoIGNpLT5mbGFnQ2hpbGRNYXhpbWl6ZWQgKQotCQkJICAgcmV0dXJuIFNlbmRNZXNzYWdlKCBjaS0+ZmxhZ0NoaWxkTWF4aW1pemVkLCBXTV9TWVNDT01NQU5ELAorCQkgICAgICAgaWYoIGNpLT5od25kQ2hpbGRNYXhpbWl6ZWQgKQorCQkJICAgcmV0dXJuIFNlbmRNZXNzYWdlKCBjaS0+aHduZENoaWxkTWF4aW1pemVkLCBXTV9TWVNDT01NQU5ELAogCQkJCQkgICAgICAgd1BhcmFtLCBsUGFyYW0pOwogCQkgIH0KIAkgICAgICB9CkBAIC0xMjE1LDcgKzEyMzcsNyBAQAogICAgICAgY2FzZSBXTV9TRVRURVhUOgogCURlZldpbmRvd1Byb2MoaHduZCwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOwogCU1ESV9NZW51TW9kaWZ5SXRlbShjbGllbnRXbmQsaHduZCk7Ci0JaWYoIGNpLT5mbGFnQ2hpbGRNYXhpbWl6ZWQgPT0gaHduZCApCisJaWYoIGNpLT5od25kQ2hpbGRNYXhpbWl6ZWQgPT0gaHduZCApCiAJICAgIE1ESV9VcGRhdGVGcmFtZVRleHQoIGNsaWVudFduZC0+cGFyZW50LCBjaS0+c2VsZiwKIAkJCQkgTURJX1JFUEFJTlRGUkFNRSwgTlVMTCApOwogICAgICAgICByZXR1cm4gMDsKQEAgLTEyNDIsMTAgKzEyNjQsMTAgQEAKIAlzd2l0Y2goIHdQYXJhbSApCiAJICB7CiAJCWNhc2UgU0NfTU9WRToKLQkJICAgICBpZiggY2ktPmZsYWdDaGlsZE1heGltaXplZCA9PSBod25kKSByZXR1cm4gMDsKKwkJICAgICBpZiggY2ktPmh3bmRDaGlsZE1heGltaXplZCA9PSBod25kKSByZXR1cm4gMDsKIAkJICAgICBicmVhazsKIAkJY2FzZSBTQ19NQVhJTUlaRToKLQkJICAgICBpZiggY2ktPmZsYWdDaGlsZE1heGltaXplZCA9PSBod25kKSAKKwkJICAgICBpZiggY2ktPmh3bmRDaGlsZE1heGltaXplZCA9PSBod25kKSAKIAkJCSByZXR1cm4gU2VuZE1lc3NhZ2UoIGNsaWVudFduZC0+cGFyZW50LT5od25kU2VsZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtKTsKIAkJICAgICBicmVhazsKQEAgLTEyNTksMTEgKzEyODEsMTEgQEAKIAlicmVhazsKIAkKICAgICAgIGNhc2UgV01fR0VUTUlOTUFYSU5GTzoKLQlNRElfQ2hpbGRHZXRNaW5NYXhJbmZvKGNsaWVudFduZCwgaHduZCwgKE1JTk1BWElORk8qKSBQVFJfU0VHX1RPX0xJTihsUGFyYW0pKTsKKwlNRElfQ2hpbGRHZXRNaW5NYXhJbmZvKGNsaWVudFduZCwgaHduZCwgKE1JTk1BWElORk8xNiopIFBUUl9TRUdfVE9fTElOKGxQYXJhbSkpOwogCXJldHVybiAwOwogCiAgICAgICBjYXNlIFdNX1NFVFZJU0lCTEU6Ci0gICAgICAgICBpZiggY2ktPmZsYWdDaGlsZE1heGltaXplZCkKKyAgICAgICAgIGlmKCBjaS0+aHduZENoaWxkTWF4aW1pemVkKQogICAgICAgICAgICAgIGNpLT5zYk5lZWRVcGRhdGUgPSAwOwogCSBlbHNlCiAgICAgICAgICAgICBNRElfUG9zdFVwZGF0ZShjbGllbnRXbmQtPmh3bmRTZWxmLCBjaSwgU0JfQk9USCsxKTsKQEAgLTEyNzQsNyArMTI5Niw3IEBACiAKIAlpZiggY2ktPmh3bmRBY3RpdmVDaGlsZCA9PSBod25kICYmIHdQYXJhbSAhPSBTSVpFX01BWElNSVpFRCApCiAJICB7Ci0gIAkgICAgY2ktPmZsYWdDaGlsZE1heGltaXplZCA9IDA7CisgIAkgICAgY2ktPmh3bmRDaGlsZE1heGltaXplZCA9IDA7CiAJICAgIAogCSAgICBNRElfUmVzdG9yZUZyYW1lTWVudSggY2xpZW50V25kLT5wYXJlbnQsIGh3bmQpOwogICAgICAgICAgICAgTURJX1VwZGF0ZUZyYW1lVGV4dCggY2xpZW50V25kLT5wYXJlbnQsIGNpLT5zZWxmLApAQCAtMTI4Myw3ICsxMzA1LDcgQEAKIAogCWlmKCB3UGFyYW0gPT0gU0laRV9NQVhJTUlaRUQgKQogCSAgewotCSAgICBIV05EIGhNYXhDaGlsZCA9IGNpLT5mbGFnQ2hpbGRNYXhpbWl6ZWQ7CisJICAgIEhXTkQgaE1heENoaWxkID0gY2ktPmh3bmRDaGlsZE1heGltaXplZDsKIAogCSAgICBpZiggaE1heENoaWxkID09IGh3bmQgKSBicmVhazsKIApAQCAtMTI5Nyw3ICsxMzE5LDcgQEAKIAkgICAgICAgU2VuZE1lc3NhZ2UoIGhNYXhDaGlsZCwgV01fU0VUUkVEUkFXLCBUUlVFLCAwTCApOwogCSAgICAgIH0KIAotCSAgICBjaS0+ZmxhZ0NoaWxkTWF4aW1pemVkID0gaHduZDsgLyogISEhICovCisJICAgIGNpLT5od25kQ2hpbGRNYXhpbWl6ZWQgPSBod25kOyAvKiAhISEgKi8KIAogCSAgICBNRElfQXVnbWVudEZyYW1lTWVudSggY2ksIGNsaWVudFduZC0+cGFyZW50LCBod25kKTsKIAkgICAgTURJX1VwZGF0ZUZyYW1lVGV4dCggY2xpZW50V25kLT5wYXJlbnQsIGNpLT5zZWxmLApAQCAtMTM4MCwyMiArMTQwMiwyMiBAQAogICovCiB2b2lkIENhbGNDaGlsZFNjcm9sbCggSFdORCBod25kLCBXT1JEIHNjcm9sbCApCiB7Ci0gICAgUkVDVCBjaGlsZFJlY3QsIGNsaWVudFJlY3Q7CisgICAgUkVDVDE2IGNoaWxkUmVjdCwgY2xpZW50UmVjdDsKICAgICBJTlQgIHZtaW4sIHZtYXgsIGhtaW4sIGhtYXgsIHZwb3MsIGhwb3M7CiAgICAgQk9PTCBub3Njcm9sbCA9IEZBTFNFOwogICAgIFdORCAqcFduZCwgKlduZDsKIAogICAgIGlmICghKFduZCA9IHBXbmQgPSBXSU5fRmluZFduZFB0ciggaHduZCApKSkgcmV0dXJuOwotICAgIEdldENsaWVudFJlY3QoIGh3bmQsICZjbGllbnRSZWN0ICk7Ci0gICAgU2V0UmVjdEVtcHR5KCAmY2hpbGRSZWN0ICk7CisgICAgR2V0Q2xpZW50UmVjdDE2KCBod25kLCAmY2xpZW50UmVjdCApOworICAgIFNldFJlY3RFbXB0eTE2KCAmY2hpbGRSZWN0ICk7CiAKICAgICBmb3IgKCBwV25kID0gcFduZC0+Y2hpbGQ7IHBXbmQ7IHBXbmQgPSBwV25kLT5uZXh0ICkKIAl7Ci0gICAgICAgICAgVW5pb25SZWN0KCAmY2hpbGRSZWN0LCAmcFduZC0+cmVjdFdpbmRvdywgJmNoaWxkUmVjdCApOworICAgICAgICAgIFVuaW9uUmVjdDE2KCAmY2hpbGRSZWN0LCAmcFduZC0+cmVjdFdpbmRvdywgJmNoaWxkUmVjdCApOwogCSAgaWYoIHBXbmQtPmR3U3R5bGUgJiBXU19NQVhJTUlaRSApCiAJICAgICAgbm9zY3JvbGwgPSBUUlVFOwogCX0gCi0gICAgVW5pb25SZWN0KCAmY2hpbGRSZWN0LCAmY2xpZW50UmVjdCwgJmNoaWxkUmVjdCApOworICAgIFVuaW9uUmVjdDE2KCAmY2hpbGRSZWN0LCAmY2xpZW50UmVjdCwgJmNoaWxkUmVjdCApOwogCiAgICAgLyoganVtcCB0aHJvdWdoIHRoZSBob29wcyB0byBwcmV2ZW50IGV4Y2Vzc2l2ZSBmbGFzaGluZyAKICAgICAgKi8KZGlmZiAtLWdpdCBhL3dpbmRvd3MvbWVzc2FnZS5jIGIvd2luZG93cy9tZXNzYWdlLmMKaW5kZXggYzMzYWQxZi4uZjg2ZDU4NSAxMDA2NDQKLS0tIGEvd2luZG93cy9tZXNzYWdlLmMKKysrIGIvd2luZG93cy9tZXNzYWdlLmMKQEAgLTUsNiArNSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHN5cy90aW1lLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KQEAgLTU1LDExICs1NiwxMSBAQAogewogICAgIFdORCAqcFduZDsKICAgICBCT09MIGVhdE1zZyA9IEZBTFNFOwotICAgIElOVCBoaXR0ZXN0OworICAgIElOVDE2IGhpdHRlc3Q7CiAgICAgc3RhdGljIERXT1JEIGxhc3RDbGlja1RpbWUgPSAwOwogICAgIHN0YXRpYyBXT1JEICBsYXN0Q2xpY2tNc2cgPSAwOwotICAgIHN0YXRpYyBQT0lOVCBsYXN0Q2xpY2tQb3MgPSB7IDAsIDAgfTsKLSAgICBQT0lOVCBwdCA9IG1zZy0+cHQ7CisgICAgc3RhdGljIFBPSU5UMTYgbGFzdENsaWNrUG9zID0geyAwLCAwIH07CisgICAgUE9JTlQxNiBwdCA9IG1zZy0+cHQ7CiAgICAgTU9VU0VIT09LU1RSVUNUIGhvb2sgPSB7IG1zZy0+cHQsIDAsIEhUQ0xJRU5ULCAwIH07CiAKICAgICBCT09MIG1vdXNlQ2xpY2sgPSAoKG1zZy0+bWVzc2FnZSA9PSBXTV9MQlVUVE9ORE9XTikgfHwKQEAgLTcxLDcgKzcyLDcgQEAKICAgICBpZiAoR2V0Q2FwdHVyZSgpKQogICAgIHsKIAltc2ctPmh3bmQgPSBHZXRDYXB0dXJlKCk7Ci0JU2NyZWVuVG9DbGllbnQoIG1zZy0+aHduZCwgJnB0ICk7CisJU2NyZWVuVG9DbGllbnQxNiggbXNnLT5od25kLCAmcHQgKTsKIAltc2ctPmxQYXJhbSA9IE1BS0VMT05HKCBwdC54LCBwdC55ICk7CiAgICAgICAgIC8qIE5vIG5lZWQgdG8gZnVydGhlciBwcm9jZXNzIHRoZSBtZXNzYWdlICovCiAgICAgICAgIGhvb2suaHduZCA9IG1zZy0+aHduZDsKQEAgLTEwMiw3ICsxMDMsNyBAQAogCiAgICAgICAgICAgICBpZiAoKChyZXQgPT0gTUFfQUNUSVZBVEUpIHx8IChyZXQgPT0gTUFfQUNUSVZBVEVBTkRFQVQpKSAKICAgICAgICAgICAgICAgICAmJiBod25kVG9wICE9IEdldEFjdGl2ZVdpbmRvdygpICkKLSAgICAgICAgICAgICAgICBXSU5QT1NfQ2hhbmdlQWN0aXZlV2luZG93KCBod25kVG9wLCBUUlVFICk7CisgICAgICAgICAgICAgICAgV0lOUE9TX1NldEFjdGl2ZVdpbmRvdyggaHduZFRvcCwgVFJVRSAsIFRSVUUgKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTQ4LDcgKzE0OSw3IEBACiAgICAgICAvKiBCdWlsZCB0aGUgdHJhbnNsYXRlZCBtZXNzYWdlICovCiAKICAgICBpZiAoaGl0dGVzdCA9PSBIVENMSUVOVCkKLSAgICAgICAgU2NyZWVuVG9DbGllbnQoIG1zZy0+aHduZCwgJnB0ICk7CisgICAgICAgIFNjcmVlblRvQ2xpZW50MTYoIG1zZy0+aHduZCwgJnB0ICk7CiAgICAgZWxzZQogICAgIHsKIAltc2ctPndQYXJhbSA9IGhpdHRlc3Q7CkBAIC02ODYsOCArNjg3LDggQEAKICAgICAgICAgU1BZX0V4aXRNZXNzYWdlKCBTUFlfUkVTVUxUX0lOVkFMSURIV05ELCBod25kLCBtc2csIDAgKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIHJldCA9IENhbGxXaW5kb3dQcm9jKCB3bmRQdHItPmxwZm5XbmRQcm9jLCBtc2dzdHJ1Y3QuaFduZCwgbXNnc3RydWN0LndNc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1zZ3N0cnVjdC53UGFyYW0sIG1zZ3N0cnVjdC5sUGFyYW0gKTsKKyAgICByZXQgPSBDYWxsV2luZG93UHJvYzE2KHduZFB0ci0+bHBmblduZFByb2MsIG1zZ3N0cnVjdC5oV25kLCBtc2dzdHJ1Y3Qud01zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZ3N0cnVjdC53UGFyYW0sIG1zZ3N0cnVjdC5sUGFyYW0gKTsKICAgICBTUFlfRXhpdE1lc3NhZ2UoIFNQWV9SRVNVTFRfT0ssIGh3bmQsIG1zZywgcmV0ICk7CiAgICAgcmV0dXJuIHJldDsKIH0KQEAgLTc3MiwxMyArNzczLDkgQEAKICAgICB7CiAJaWYgKG1zZy0+bFBhcmFtKQogICAgICAgICB7Ci0jaWZuZGVmIFdJTkVMSUIKLSAgICAgICAgICAgIEhJTlNUQU5DRSBkcyA9IG1zZy0+aHduZCA/IFdJTl9HZXRXaW5kb3dJbnN0YW5jZSggbXNnLT5od25kICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChISU5TVEFOQ0UpQ1VSUkVOVF9EUzsKLSNlbmRpZgogLyogICAgICAgICAgICBIT09LX0NhbGxIb29rcyggV0hfQ0FMTFdORFBST0MsIEhDX0FDVElPTiwgMCwgRklYTUUgKTsgKi8KLQkgICAgcmV0dXJuIENhbGxXbmRQcm9jKCAoV05EUFJPQyltc2ctPmxQYXJhbSwgZHMsIG1zZy0+aHduZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLT5tZXNzYWdlLCBtc2ctPndQYXJhbSwgR2V0VGlja0NvdW50KCkgKTsKKwkgICAgcmV0dXJuIENhbGxXaW5kb3dQcm9jMTYoIChXTkRQUk9DKW1zZy0+bFBhcmFtLCBtc2ctPmh3bmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy0+bWVzc2FnZSwgbXNnLT53UGFyYW0sIEdldFRpY2tDb3VudCgpICk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTc4OCw4ICs3ODUsOCBAQAogICAgIHBhaW50aW5nID0gKG1zZy0+bWVzc2FnZSA9PSBXTV9QQUlOVCk7CiAgICAgaWYgKHBhaW50aW5nKSB3bmRQdHItPmZsYWdzIHw9IFdJTl9ORUVEU19CRUdJTlBBSU5UOwogLyogICAgSE9PS19DYWxsSG9va3MoIFdIX0NBTExXTkRQUk9DLCBIQ19BQ1RJT04sIDAsIEZJWE1FICk7ICovCi0gICAgcmV0dmFsID0gQ2FsbFdpbmRvd1Byb2MoIHduZFB0ci0+bHBmblduZFByb2MsIG1zZy0+aHduZCwgbXNnLT5tZXNzYWdlLAotCQkJICAgICBtc2ctPndQYXJhbSwgbXNnLT5sUGFyYW0gKTsKKyAgICByZXR2YWwgPSBDYWxsV2luZG93UHJvYzE2KCB3bmRQdHItPmxwZm5XbmRQcm9jLCBtc2ctPmh3bmQsIG1zZy0+bWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2ctPndQYXJhbSwgbXNnLT5sUGFyYW0gKTsKICAgICBpZiAocGFpbnRpbmcgJiYgKHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBtc2ctPmh3bmQgKSkgJiYKICAgICAgICAgKHduZFB0ci0+ZmxhZ3MgJiBXSU5fTkVFRFNfQkVHSU5QQUlOVCkgJiYgd25kUHRyLT5ocmduVXBkYXRlKQogICAgIHsKQEAgLTc5NywyOCArNzk0LDQyIEBACiAJCW1zZy0+aHduZCk7CiAJd25kUHRyLT5mbGFncyAmPSB+V0lOX05FRURTX0JFR0lOUEFJTlQ7CiAgICAgICAgIC8qIFZhbGlkYXRlIHRoZSB1cGRhdGUgcmVnaW9uIHRvIGF2b2lkIGluZmluaXRlIFdNX1BBSU5UIGxvb3AgKi8KLSAgICAgICAgVmFsaWRhdGVSZWN0KCBtc2ctPmh3bmQsIE5VTEwgKTsKKyAgICAgICAgVmFsaWRhdGVSZWN0MzIoIG1zZy0+aHduZCwgTlVMTCApOwogICAgIH0KICAgICByZXR1cm4gcmV0dmFsOwogfQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFJlZ2lzdGVyV2luZG93TWVzc2FnZSAgIChVU0VSLjExOCkKKyAqICAgICAgICAgICBSZWdpc3RlcldpbmRvd01lc3NhZ2UxNiAgIChVU0VSLjExOCkKICAqLwotV09SRCBSZWdpc3RlcldpbmRvd01lc3NhZ2UoIFNFR1BUUiBzdHIgKQorV09SRCBSZWdpc3RlcldpbmRvd01lc3NhZ2UxNiggU0VHUFRSIHN0ciApCiB7Ci0gICAgZHByaW50Zl9tc2coc3RkZGViLCAiUmVnaXN0ZXJXaW5kb3dNZXNzYWdlOiAlMDhseFxuIiwgKERXT1JEKXN0ciApOwotICAgIHJldHVybiBHbG9iYWxBZGRBdG9tKCBzdHIgKTsKKyAgICBkcHJpbnRmX21zZyhzdGRkZWIsICJSZWdpc3RlcldpbmRvd01lc3NhZ2UxNjogJTA4bHhcbiIsIChEV09SRClzdHIgKTsKKyAgICByZXR1cm4gR2xvYmFsQWRkQXRvbTE2KCBzdHIgKTsKIH0KIAotV09SRCBSZWdpc3RlcldpbmRvd01lc3NhZ2VBKCBMUFNUUiBzdHIgKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBSZWdpc3RlcldpbmRvd01lc3NhZ2UzMkEgICAoVVNFUjMyLjQzNikKKyAqLworV09SRCBSZWdpc3RlcldpbmRvd01lc3NhZ2UzMkEoIExQQ1NUUiBzdHIgKQogewotICAgIGNoYXIgYnVmZmVyWzI1Nl07Ci0gICAgbHN0cmNweW4oIGJ1ZmZlciwgc3RyLCBzaXplb2YoYnVmZmVyKSApOwotICAgIHJldHVybiBSZWdpc3RlcldpbmRvd01lc3NhZ2UoTUFLRV9TRUdQVFIoYnVmZmVyKSk7CisgICAgZHByaW50Zl9tc2coc3RkZGViLCAiUmVnaXN0ZXJXaW5kb3dNZXNzYWdlMzJBOiAlc1xuIiwgc3RyICk7CisgICAgcmV0dXJuIEdsb2JhbEFkZEF0b20zMkEoIHN0ciApOwogfQogCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFJlZ2lzdGVyV2luZG93TWVzc2FnZTMyVyAgIChVU0VSMzIuNDM3KQorICovCitXT1JEIFJlZ2lzdGVyV2luZG93TWVzc2FnZTMyVyggTFBDV1NUUiBzdHIgKQoreworICAgIGRwcmludGZfbXNnKHN0ZGRlYiwgIlJlZ2lzdGVyV2luZG93TWVzc2FnZTMyVzogJXBcbiIsIHN0ciApOworICAgIHJldHVybiBHbG9iYWxBZGRBdG9tMzJXKCBzdHIgKTsKK30KKworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBHZXRUaWNrQ291bnQgICAgKFVTRVIuMTMpIChLRVJORUwzMi4yOTkpCiAgKi8KZGlmZiAtLWdpdCBhL3dpbmRvd3MvbXNnYm94LmMgYi93aW5kb3dzL21zZ2JveC5jCmluZGV4IGViYWNmMTIuLmQxYmJhZTQgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvbXNnYm94LmMKKysrIGIvd2luZG93cy9tc2dib3guYwpAQCAtMjEsNyArMjEsNyBAQAogTFJFU1VMVCBTeXN0ZW1NZXNzYWdlQm94UHJvYyhIV05EIGh3bmQsVUlOVCBtZXNzYWdlLFdQQVJBTSB3UGFyYW0sTFBBUkFNIGxQYXJhbSkKIHsKICAgTFBNU0dCT1ggbHBtYjsKLSAgUkVDVCByZWN0LCB0ZXh0cmVjdDsKKyAgUkVDVDE2IHJlY3QsIHRleHRyZWN0OwogICBIV05EIGhJdGVtOwogICBIREMgaGRjOwogICBMT05HIGxSZXQ7CkBAIC04NSwyMSArODUsMjEgQEAKICAgICB9CiAgICAgCiAgICAgLyogUG9zaXRpb24gZXZlcnl0aGluZyAqLwotICAgIEdldFdpbmRvd1JlY3QoaHduZCwgJnJlY3QpOworICAgIEdldFdpbmRvd1JlY3QxNihod25kLCAmcmVjdCk7CiAgICAgYm9yaGVpZ2h0ID0gcmVjdC5ib3R0b20gLSByZWN0LnRvcDsKICAgICB3d2lkdGggPSByZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0OwotICAgIEdldENsaWVudFJlY3QoaHduZCwgJnJlY3QpOworICAgIEdldENsaWVudFJlY3QxNihod25kLCAmcmVjdCk7CiAgICAgYm9yaGVpZ2h0IC09IHJlY3QuYm90dG9tIC0gcmVjdC50b3A7CiAKICAgICAvKiBHZXQgdGhlIGljb24gaGVpZ2h0ICovCi0gICAgR2V0V2luZG93UmVjdChHZXREbGdJdGVtKGh3bmQsIDEwODgpLCAmcmVjdCk7CisgICAgR2V0V2luZG93UmVjdDE2KEdldERsZ0l0ZW0oaHduZCwgMTA4OCksICZyZWN0KTsKICAgICBpaGVpZ2h0ID0gcmVjdC5ib3R0b20gLSByZWN0LnRvcDsKICAgICAKICAgICAvKiBHZXQgdGhlIG51bWJlciBvZiB2aXNpYmxlIGJ1dHRvbnMgYW5kIHRoZWlyIHdpZHRoICovCi0gICAgR2V0V2luZG93UmVjdChHZXREbGdJdGVtKGh3bmQsIDIpLCAmcmVjdCk7CisgICAgR2V0V2luZG93UmVjdDE2KEdldERsZ0l0ZW0oaHduZCwgMiksICZyZWN0KTsKICAgICBiaGVpZ2h0ID0gcmVjdC5ib3R0b20gLSByZWN0LnRvcDsKICAgICBid2lkdGggPSByZWN0LmxlZnQ7Ci0gICAgR2V0V2luZG93UmVjdChHZXREbGdJdGVtKGh3bmQsIDEpLCAmcmVjdCk7CisgICAgR2V0V2luZG93UmVjdDE2KEdldERsZ0l0ZW0oaHduZCwgMSksICZyZWN0KTsKICAgICBid2lkdGggLT0gcmVjdC5sZWZ0OwogICAgIGZvciAoYnV0dG9ucyA9IDAsIGkgPSAxOyBpIDwgODsgaSsrKSB7CiAgICAgICBoSXRlbSA9IEdldERsZ0l0ZW0oaHduZCwgaSk7CkBAIC0xMTAsMTMgKzExMCwxMyBAQAogICAgIAogICAgIC8qIEdldCB0aGUgdGV4dCBzaXplICovCiAgICAgaEl0ZW0gPSBHZXREbGdJdGVtKGh3bmQsIDEwMCk7Ci0gICAgR2V0V2luZG93UmVjdChoSXRlbSwgJnRleHRyZWN0KTsKLSAgICBNYXBXaW5kb3dQb2ludHMoMCwgaHduZCwgKExQUE9JTlQpJnRleHRyZWN0LCAyKTsKKyAgICBHZXRXaW5kb3dSZWN0MTYoaEl0ZW0sICZ0ZXh0cmVjdCk7CisgICAgTWFwV2luZG93UG9pbnRzMTYoMCwgaHduZCwgKExQUE9JTlQxNikmdGV4dHJlY3QsIDIpOwogICAgIAotICAgIEdldENsaWVudFJlY3QoaEl0ZW0sICZyZWN0KTsKKyAgICBHZXRDbGllbnRSZWN0MTYoaEl0ZW0sICZyZWN0KTsKICAgICBoZGMgPSBHZXREQyhoSXRlbSk7Ci0gICAgbFJldCA9IERyYXdUZXh0KGhkYywgbHBtYi0+dGV4dCwgLTEsICZyZWN0LAotCQkgICAgRFRfTEVGVCB8IERUX0VYUEFORFRBQlMgfCBEVF9XT1JEQlJFQUsgfCBEVF9DQUxDUkVDVCk7CisgICAgbFJldCA9IERyYXdUZXh0MTYoIGhkYywgbHBtYi0+dGV4dCwgLTEsICZyZWN0LAorICAgICAgICAgICAgICAgICAgICAgICBEVF9MRUZUIHwgRFRfRVhQQU5EVEFCUyB8IERUX1dPUkRCUkVBSyB8IERUX0NBTENSRUNUKTsKICAgICB0aGVpZ2h0ID0gcmVjdC5ib3R0b20gIC0gcmVjdC50b3A7CiAgICAgdGloZWlnaHQgPSAxNiArIE1BWChpaGVpZ2h0LCB0aGVpZ2h0KTsKICAgICBSZWxlYXNlREMoaEl0ZW0sIGhkYyk7CkBAIC0xMjgsOCArMTI4LDggQEAKICAgICAKICAgICAvKiBQb3NpdGlvbiB0aGUgaWNvbiAqLwogICAgIGhJdGVtID0gR2V0RGxnSXRlbShod25kLCAxMDg4KTsKLSAgICBHZXRXaW5kb3dSZWN0KGhJdGVtLCAmcmVjdCk7Ci0gICAgTWFwV2luZG93UG9pbnRzKDAsIGh3bmQsIChMUFBPSU5UKSZyZWN0LCAyKTsKKyAgICBHZXRXaW5kb3dSZWN0MTYoaEl0ZW0sICZyZWN0KTsKKyAgICBNYXBXaW5kb3dQb2ludHMxNigwLCBod25kLCAoTFBQT0lOVDE2KSZyZWN0LCAyKTsKICAgICBTZXRXaW5kb3dQb3MoaEl0ZW0sIDAsIHJlY3QubGVmdCwgKHRpaGVpZ2h0IC0gaWhlaWdodCkgLyAyLCAwLCAwLAogCQkgU1dQX05PU0laRSB8IFNXUF9OT1pPUkRFUiB8IFNXUF9OT0FDVElWQVRFIHwgU1dQX05PUkVEUkFXKTsKICAgICAKQEAgLTEzOSwxNCArMTM5LDE0IEBACiAgICAgCiAgICAgLyogUG9zaXRpb24gdGhlIGJ1dHRvbnMgKi8KICAgICBicG9zID0gKHd3aWR0aCAtIGJ3aWR0aCAqIGJ1dHRvbnMpIC8gMjsKLSAgICBHZXRXaW5kb3dSZWN0KEdldERsZ0l0ZW0oaHduZCwgMSksICZyZWN0KTsKKyAgICBHZXRXaW5kb3dSZWN0MTYoR2V0RGxnSXRlbShod25kLCAxKSwgJnJlY3QpOwogICAgIGZvciAoYnV0dG9ucyA9IGkgPSAwOyBpIDwgNzsgaSsrKSB7CiAgICAgICAvKiBzb21lIGFyaXRobWV0aWMgdG8gZ2V0IHRoZSByaWdodCBvcmRlciBmb3IgWWVzTm9DYW5jZWwgd2luZG93cyAqLwogICAgICAgaEl0ZW0gPSBHZXREbGdJdGVtKGh3bmQsIChpICsgNSkgJSA3ICsgMSk7CiAgICAgICBpZiAoR2V0V2luZG93TG9uZyhoSXRlbSwgR1dMX1NUWUxFKSAmIFdTX1ZJU0lCTEUpIHsKIAlpZiAoYnV0dG9ucysrID09ICgobHBtYi0+dHlwZSAmIE1CX0RFRk1BU0spID4+IDgpKSB7CiAJICBTZXRGb2N1cyhoSXRlbSk7Ci0JICBTZW5kTWVzc2FnZShoSXRlbSwgQk1fU0VUU1RZTEUsIEJTX0RFRlBVU0hCVVRUT04sIFRSVUUpOworCSAgU2VuZE1lc3NhZ2UoaEl0ZW0sIEJNX1NFVFNUWUxFMTYsIEJTX0RFRlBVU0hCVVRUT04sIFRSVUUpOwogCX0KIAlTZXRXaW5kb3dQb3MoaEl0ZW0sIDAsIGJwb3MsIHRpaGVpZ2h0LCAwLCAwLAogCQkgICAgIFNXUF9OT1NJWkUgfCBTV1BfTk9aT1JERVIgfCBTV1BfTk9BQ1RJVkFURSB8IFNXUF9OT1JFRFJBVyk7CmRpZmYgLS1naXQgYS93aW5kb3dzL25vbmNsaWVudC5jIGIvd2luZG93cy9ub25jbGllbnQuYwppbmRleCAyNTM4ZWIxLi4wYmUxM2E4IDEwMDY0NAotLS0gYS93aW5kb3dzL25vbmNsaWVudC5jCisrKyBiL3dpbmRvd3Mvbm9uY2xpZW50LmMKQEAgLTksNiArOSw3IEBACiAjaW5jbHVkZSAibWVzc2FnZS5oIgogI2luY2x1ZGUgInN5c21ldHJpY3MuaCIKICNpbmNsdWRlICJ1c2VyLmgiCisjaW5jbHVkZSAiaGVhcC5oIgogI2luY2x1ZGUgInNoZWxsLmgiCiAjaW5jbHVkZSAiZGlhbG9nLmgiCiAjaW5jbHVkZSAic3lzY29sb3IuaCIKQEAgLTE5LDkgKzIwLDcgQEAKICNpbmNsdWRlICJncmFwaGljcy5oIgogI2luY2x1ZGUgInF1ZXVlLmgiCiAjaW5jbHVkZSAic2VsZWN0b3JzLmgiCi0jaW5jbHVkZSAic3RhY2tmcmFtZS5oIgogI2luY2x1ZGUgInN0ZGRlYnVnLmgiCi0vKiAjZGVmaW5lIERFQlVHX05PTkNMSUVOVCAqLwogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAib3B0aW9ucy5oIgogCkBAIC02MiwyMiArNjEsMjMgQEAKICAqIENvbXB1dGUgdGhlIHNpemUgb2YgdGhlIHdpbmRvdyByZWN0YW5nbGUgZnJvbSB0aGUgc2l6ZSBvZiB0aGUKICAqIGNsaWVudCByZWN0YW5nbGUuCiAgKi8KLXN0YXRpYyB2b2lkIE5DX0FkanVzdFJlY3QoIExQUkVDVCByZWN0LCBEV09SRCBzdHlsZSwgQk9PTCBtZW51LCBEV09SRCBleFN0eWxlICkKK3N0YXRpYyB2b2lkIE5DX0FkanVzdFJlY3QoTFBSRUNUMTYgcmVjdCwgRFdPUkQgc3R5bGUsIEJPT0wgbWVudSwgRFdPUkQgZXhTdHlsZSkKIHsKICAgICBpZiAoc3R5bGUgJiBXU19JQ09OSUMpIHJldHVybjsgIC8qIE5vdGhpbmcgdG8gY2hhbmdlIGZvciBhbiBpY29uICovCiAKICAgICAvKiBEZWNpZGUgaWYgdGhlIHdpbmRvdyB3aWxsIGJlIG1hbmFnZWQgKHNlZSBDcmVhdGVXaW5kb3dFeCkgKi8KLSAgICBpZiAoIShPcHRpb25zLm1hbmFnZWQgJiYgKChzdHlsZSAmIChXU19ETEdGUkFNRSB8IFdTX1RISUNLRlJBTUUpKSB8fAotICAgICAgICAgIChleFN0eWxlICYgV1NfRVhfRExHTU9EQUxGUkFNRSkpKSkKKyAgICBpZiAoIShPcHRpb25zLm1hbmFnZWQgJiYgIShzdHlsZSAmIFdTX0NISUxEKSAmJgorICAgICAgICAgICgoc3R5bGUgJiAoV1NfRExHRlJBTUUgfCBXU19USElDS0ZSQU1FKSkgfHwKKyAgICAgICAgICAgKGV4U3R5bGUgJiBXU19FWF9ETEdNT0RBTEZSQU1FKSkpKQogICAgIHsKICAgICAgICAgaWYgKEhBU19ETEdGUkFNRSggc3R5bGUsIGV4U3R5bGUgKSkKLSAgICAgICAgICAgIEluZmxhdGVSZWN0KCByZWN0LCBTWVNNRVRSSUNTX0NYRExHRlJBTUUsIFNZU01FVFJJQ1NfQ1lETEdGUkFNRSApOworICAgICAgICAgICAgSW5mbGF0ZVJlY3QxNihyZWN0LCBTWVNNRVRSSUNTX0NYRExHRlJBTUUsIFNZU01FVFJJQ1NfQ1lETEdGUkFNRSApOwogICAgICAgICBlbHNlCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChIQVNfVEhJQ0tGUkFNRShzdHlsZSkpCi0gICAgICAgICAgICAgICAgSW5mbGF0ZVJlY3QoIHJlY3QsIFNZU01FVFJJQ1NfQ1hGUkFNRSwgU1lTTUVUUklDU19DWUZSQU1FICk7CisgICAgICAgICAgICAgICAgSW5mbGF0ZVJlY3QxNiggcmVjdCwgU1lTTUVUUklDU19DWEZSQU1FLCBTWVNNRVRSSUNTX0NZRlJBTUUgKTsKICAgICAgICAgICAgIGlmIChzdHlsZSAmIFdTX0JPUkRFUikKLSAgICAgICAgICAgICAgICBJbmZsYXRlUmVjdCggcmVjdCwgU1lTTUVUUklDU19DWEJPUkRFUiwgU1lTTUVUUklDU19DWUJPUkRFUiApOworICAgICAgICAgICAgICAgIEluZmxhdGVSZWN0MTYoIHJlY3QsIFNZU01FVFJJQ1NfQ1hCT1JERVIsIFNZU01FVFJJQ1NfQ1lCT1JERVIpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKChzdHlsZSAmIFdTX0NBUFRJT04pID09IFdTX0NBUFRJT04pCkBAIC05MSwxOCArOTEsMjggQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBBZGp1c3RXaW5kb3dSZWN0ICAgIChVU0VSLjEwMikKKyAqICAgICAgICAgICBBZGp1c3RXaW5kb3dSZWN0MTYgICAgKFVTRVIuMTAyKQogICovCi1CT09MIEFkanVzdFdpbmRvd1JlY3QoIExQUkVDVCByZWN0LCBEV09SRCBzdHlsZSwgQk9PTCBtZW51ICkKK0JPT0wxNiBBZGp1c3RXaW5kb3dSZWN0MTYoIExQUkVDVDE2IHJlY3QsIERXT1JEIHN0eWxlLCBCT09MMTYgbWVudSApCiB7Ci0gICAgcmV0dXJuIEFkanVzdFdpbmRvd1JlY3RFeCggcmVjdCwgc3R5bGUsIG1lbnUsIDAgKTsKKyAgICByZXR1cm4gQWRqdXN0V2luZG93UmVjdEV4MTYoIHJlY3QsIHN0eWxlLCBtZW51LCAwICk7CiB9CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgQWRqdXN0V2luZG93UmVjdEV4ICAgIChVU0VSLjQ1NCkKKyAqICAgICAgICAgICBBZGp1c3RXaW5kb3dSZWN0MzIgICAgKFVTRVIzMi4pCiAgKi8KLUJPT0wgQWRqdXN0V2luZG93UmVjdEV4KCBMUFJFQ1QgcmVjdCwgRFdPUkQgc3R5bGUsIEJPT0wgbWVudSwgRFdPUkQgZXhTdHlsZSApCitCT09MMzIgQWRqdXN0V2luZG93UmVjdDMyKCBMUFJFQ1QzMiByZWN0LCBEV09SRCBzdHlsZSwgQk9PTDMyIG1lbnUgKQoreworICAgIHJldHVybiBBZGp1c3RXaW5kb3dSZWN0RXgzMiggcmVjdCwgc3R5bGUsIG1lbnUsIDAgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBBZGp1c3RXaW5kb3dSZWN0RXgxNiAgICAoVVNFUi40NTQpCisgKi8KK0JPT0wxNiBBZGp1c3RXaW5kb3dSZWN0RXgxNiggTFBSRUNUMTYgcmVjdCwgRFdPUkQgc3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wxNiBtZW51LCBEV09SRCBleFN0eWxlICkKIHsKICAgICAgIC8qIENvcnJlY3QgdGhlIHdpbmRvdyBzdHlsZSAqLwogCkBAIC0xMTksMjYgKzEyOSw0NCBAQAogfQogCiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEFkanVzdFdpbmRvd1JlY3RFeDMyICAgIChVU0VSMzIuKQorICovCitCT09MMzIgQWRqdXN0V2luZG93UmVjdEV4MzIoIExQUkVDVDMyIHJlY3QsIERXT1JEIHN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MMzIgbWVudSwgRFdPUkQgZXhTdHlsZSApCit7CisgICAgUkVDVDE2IHJlY3QxNjsKKyAgICBCT09MMzIgcmV0OworCisgICAgQ09OVl9SRUNUMzJUTzE2KCByZWN0LCAmcmVjdDE2ICk7CisgICAgcmV0ID0gQWRqdXN0V2luZG93UmVjdEV4MTYoICZyZWN0MTYsIHN0eWxlLCAoQk9PTDE2KW1lbnUsIGV4U3R5bGUgKTsKKyAgICBDT05WX1JFQ1QxNlRPMzIoICZyZWN0MTYsIHJlY3QgKTsKKyAgICByZXR1cm4gcmV0OworfQorCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgIE5DX0dldE1pbk1heEluZm8KICAqCiAgKiBHZXQgdGhlIG1pbmltaXplZCBhbmQgbWF4aW1pemVkIGluZm9ybWF0aW9uIGZvciBhIHdpbmRvdy4KICAqLwotdm9pZCBOQ19HZXRNaW5NYXhJbmZvKCBIV05EIGh3bmQsIFBPSU5UICptYXhTaXplLCBQT0lOVCAqbWF4UG9zLAotICAgICAgICAgICAgICAgICAgICAgICBQT0lOVCAqbWluVHJhY2ssIFBPSU5UICptYXhUcmFjayApCit2b2lkIE5DX0dldE1pbk1heEluZm8oIEhXTkQgaHduZCwgUE9JTlQxNiAqbWF4U2l6ZSwgUE9JTlQxNiAqbWF4UG9zLAorICAgICAgICAgICAgICAgICAgICAgICBQT0lOVDE2ICptaW5UcmFjaywgUE9JTlQxNiAqbWF4VHJhY2sgKQogewotICAgIE1JTk1BWElORk8gTWluTWF4OworICAgIE1JTk1BWElORk8xNiAqTWluTWF4OwogICAgIHNob3J0IHhpbmMsIHlpbmM7CiAgICAgV05EICp3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApOwogCisgICAgaWYgKCEoTWluTWF4ID0gU0VHUFRSX05FVyhNSU5NQVhJTkZPMTYpKSkgcmV0dXJuOworCiAgICAgICAvKiBDb21wdXRlIGRlZmF1bHQgdmFsdWVzICovCiAKLSAgICBNaW5NYXgucHRNYXhTaXplLnggPSBTWVNNRVRSSUNTX0NYU0NSRUVOOwotICAgIE1pbk1heC5wdE1heFNpemUueSA9IFNZU01FVFJJQ1NfQ1lTQ1JFRU47Ci0gICAgTWluTWF4LnB0TWluVHJhY2tTaXplLnggPSBTWVNNRVRSSUNTX0NYTUlOVFJBQ0s7Ci0gICAgTWluTWF4LnB0TWluVHJhY2tTaXplLnkgPSBTWVNNRVRSSUNTX0NZTUlOVFJBQ0s7Ci0gICAgTWluTWF4LnB0TWF4VHJhY2tTaXplLnggPSBTWVNNRVRSSUNTX0NYU0NSRUVOOwotICAgIE1pbk1heC5wdE1heFRyYWNrU2l6ZS55ID0gU1lTTUVUUklDU19DWVNDUkVFTjsKKyAgICBNaW5NYXgtPnB0TWF4U2l6ZS54ID0gU1lTTUVUUklDU19DWFNDUkVFTjsKKyAgICBNaW5NYXgtPnB0TWF4U2l6ZS55ID0gU1lTTUVUUklDU19DWVNDUkVFTjsKKyAgICBNaW5NYXgtPnB0TWluVHJhY2tTaXplLnggPSBTWVNNRVRSSUNTX0NYTUlOVFJBQ0s7CisgICAgTWluTWF4LT5wdE1pblRyYWNrU2l6ZS55ID0gU1lTTUVUUklDU19DWU1JTlRSQUNLOworICAgIE1pbk1heC0+cHRNYXhUcmFja1NpemUueCA9IFNZU01FVFJJQ1NfQ1hTQ1JFRU47CisgICAgTWluTWF4LT5wdE1heFRyYWNrU2l6ZS55ID0gU1lTTUVUUklDU19DWVNDUkVFTjsKIAogICAgIGlmICh3bmRQdHItPmZsYWdzICYgV0lOX01BTkFHRUQpIHhpbmMgPSB5aW5jID0gMDsKICAgICBlbHNlIGlmIChIQVNfRExHRlJBTUUoIHduZFB0ci0+ZHdTdHlsZSwgd25kUHRyLT5kd0V4U3R5bGUgKSkKQEAgLTE2MCwzOSArMTg4LDQwIEBACiAgICAgICAgICAgICB5aW5jICs9IFNZU01FVFJJQ1NfQ1lCT1JERVI7CiAgICAgICAgIH0KICAgICB9Ci0gICAgTWluTWF4LnB0TWF4U2l6ZS54ICs9IDIgKiB4aW5jOwotICAgIE1pbk1heC5wdE1heFNpemUueSArPSAyICogeWluYzsKKyAgICBNaW5NYXgtPnB0TWF4U2l6ZS54ICs9IDIgKiB4aW5jOworICAgIE1pbk1heC0+cHRNYXhTaXplLnkgKz0gMiAqIHlpbmM7CiAKICAgICAvKiBOb3RlOiBUaGUgJysnIGluIHRoZSBmb2xsb3dpbmcgdGVzdCBzaG91bGQgcmVhbGx5IGJlIGEgfHwsIGJ1dAogICAgICAqIHRoYXQgd291bGQgY2F1c2UgZ2NjLTIuNy4wIHRvIGdlbmVyYXRlIGluY29ycmVjdCBjb2RlLgogICAgICAqLwogICAgIGlmICgod25kUHRyLT5wdE1heFBvcy54ICE9IC0xKSArICh3bmRQdHItPnB0TWF4UG9zLnkgIT0gLTEpKQotICAgICAgICBNaW5NYXgucHRNYXhQb3NpdGlvbiA9IHduZFB0ci0+cHRNYXhQb3M7CisgICAgICAgIE1pbk1heC0+cHRNYXhQb3NpdGlvbiA9IHduZFB0ci0+cHRNYXhQb3M7CiAgICAgZWxzZQogICAgIHsKLSAgICAgICAgTWluTWF4LnB0TWF4UG9zaXRpb24ueCA9IC14aW5jOwotICAgICAgICBNaW5NYXgucHRNYXhQb3NpdGlvbi55ID0gLXlpbmM7CisgICAgICAgIE1pbk1heC0+cHRNYXhQb3NpdGlvbi54ID0gLXhpbmM7CisgICAgICAgIE1pbk1heC0+cHRNYXhQb3NpdGlvbi55ID0gLXlpbmM7CiAgICAgfQogCi0gICAgU2VuZE1lc3NhZ2UoIGh3bmQsIFdNX0dFVE1JTk1BWElORk8sIDAsIChMUEFSQU0pTUFLRV9TRUdQVFIoJk1pbk1heCkgKTsKKyAgICBTZW5kTWVzc2FnZSggaHduZCwgV01fR0VUTUlOTUFYSU5GTywgMCwgKExQQVJBTSlTRUdQVFJfR0VUKE1pbk1heCkgKTsKIAogICAgICAgLyogU29tZSBzYW5pdHkgY2hlY2tzICovCiAKICAgICBkcHJpbnRmX25vbmNsaWVudChzdGRkZWIsIAogCQkgICAgICAiTkNfR2V0TWluTWF4SW5mbzogJWQgJWQgLyAlZCAlZCAvICVkICVkIC8gJWQgJWRcbiIsCi0JCSAgICAgIChpbnQpTWluTWF4LnB0TWF4U2l6ZS54LChpbnQpTWluTWF4LnB0TWF4U2l6ZS55LAotCQkgICAgICAoaW50KU1pbk1heC5wdE1heFBvc2l0aW9uLngsKGludClNaW5NYXgucHRNYXhQb3NpdGlvbi55LAotCQkgICAgICAoaW50KU1pbk1heC5wdE1heFRyYWNrU2l6ZS54LChpbnQpTWluTWF4LnB0TWF4VHJhY2tTaXplLnksCi0JCSAgICAgIChpbnQpTWluTWF4LnB0TWluVHJhY2tTaXplLngsKGludClNaW5NYXgucHRNaW5UcmFja1NpemUueSk7Ci0gICAgTWluTWF4LnB0TWF4VHJhY2tTaXplLnggPSBNQVgoIE1pbk1heC5wdE1heFRyYWNrU2l6ZS54LAotCQkJCSAgIE1pbk1heC5wdE1pblRyYWNrU2l6ZS54ICk7Ci0gICAgTWluTWF4LnB0TWF4VHJhY2tTaXplLnkgPSBNQVgoIE1pbk1heC5wdE1heFRyYWNrU2l6ZS55LAotCQkJCSAgIE1pbk1heC5wdE1pblRyYWNrU2l6ZS55ICk7CisJCSAgICAgIE1pbk1heC0+cHRNYXhTaXplLngsIE1pbk1heC0+cHRNYXhTaXplLnksCisgICAgICAgICAgICAgICAgICAgICAgTWluTWF4LT5wdE1heFBvc2l0aW9uLngsIE1pbk1heC0+cHRNYXhQb3NpdGlvbi55LAorCQkgICAgICBNaW5NYXgtPnB0TWF4VHJhY2tTaXplLngsIE1pbk1heC0+cHRNYXhUcmFja1NpemUueSwKKwkJICAgICAgTWluTWF4LT5wdE1pblRyYWNrU2l6ZS54LCBNaW5NYXgtPnB0TWluVHJhY2tTaXplLnkpOworICAgIE1pbk1heC0+cHRNYXhUcmFja1NpemUueCA9IE1BWCggTWluTWF4LT5wdE1heFRyYWNrU2l6ZS54LAorCQkJCSAgIE1pbk1heC0+cHRNaW5UcmFja1NpemUueCApOworICAgIE1pbk1heC0+cHRNYXhUcmFja1NpemUueSA9IE1BWCggTWluTWF4LT5wdE1heFRyYWNrU2l6ZS55LAorCQkJCSAgIE1pbk1heC0+cHRNaW5UcmFja1NpemUueSApOwogICAgIAotICAgIGlmIChtYXhTaXplKSAqbWF4U2l6ZSA9IE1pbk1heC5wdE1heFNpemU7Ci0gICAgaWYgKG1heFBvcykgKm1heFBvcyA9IE1pbk1heC5wdE1heFBvc2l0aW9uOwotICAgIGlmIChtaW5UcmFjaykgKm1pblRyYWNrID0gTWluTWF4LnB0TWluVHJhY2tTaXplOwotICAgIGlmIChtYXhUcmFjaykgKm1heFRyYWNrID0gTWluTWF4LnB0TWF4VHJhY2tTaXplOworICAgIGlmIChtYXhTaXplKSAqbWF4U2l6ZSA9IE1pbk1heC0+cHRNYXhTaXplOworICAgIGlmIChtYXhQb3MpICptYXhQb3MgPSBNaW5NYXgtPnB0TWF4UG9zaXRpb247CisgICAgaWYgKG1pblRyYWNrKSAqbWluVHJhY2sgPSBNaW5NYXgtPnB0TWluVHJhY2tTaXplOworICAgIGlmIChtYXhUcmFjaykgKm1heFRyYWNrID0gTWluTWF4LT5wdE1heFRyYWNrU2l6ZTsKKyAgICBTRUdQVFJfRlJFRShNaW5NYXgpOwogfQogCiAKQEAgLTIwMSw5ICsyMzAsOSBAQAogICoKICAqIEhhbmRsZSBhIFdNX05DQ0FMQ1NJWkUgbWVzc2FnZS4gQ2FsbGVkIGZyb20gRGVmV2luZG93UHJvYygpLgogICovCi1MT05HIE5DX0hhbmRsZU5DQ2FsY1NpemUoIEhXTkQgaHduZCwgTkNDQUxDU0laRV9QQVJBTVMgKnBhcmFtcyApCitMT05HIE5DX0hhbmRsZU5DQ2FsY1NpemUoIEhXTkQgaHduZCwgTkNDQUxDU0laRV9QQVJBTVMxNiAqcGFyYW1zICkKIHsKLSAgICBSRUNUIHRtcFJlY3QgPSB7IDAsIDAsIDAsIDAgfTsKKyAgICBSRUNUMTYgdG1wUmVjdCA9IHsgMCwgMCwgMCwgMCB9OwogICAgIFdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsgICAgCiAKICAgICBpZiAoIXduZFB0cikgcmV0dXJuIDA7CkBAIC0yMzAsNyArMjU5LDcgQEAKICAqIGJ1dCB3aXRob3V0IHRoZSBib3JkZXJzIChpZiBhbnkpLgogICogVGhlIHJlY3RhbmdsZSBpcyBpbiB3aW5kb3cgY29vcmRpbmF0ZXMgKGZvciBkcmF3aW5nIHdpdGggR2V0V2luZG93REMoKSkuCiAgKi8KLXZvaWQgTkNfR2V0SW5zaWRlUmVjdCggSFdORCBod25kLCBSRUNUICpyZWN0ICkKK3N0YXRpYyB2b2lkIE5DX0dldEluc2lkZVJlY3QoIEhXTkQgaHduZCwgUkVDVDE2ICpyZWN0ICkKIHsKICAgICBXTkQgKiB3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApOwogCkBAIC0yNDQsMTUgKzI3MywxNiBAQAogICAgICAgLyogUmVtb3ZlIGZyYW1lIGZyb20gcmVjdGFuZ2xlICovCiAgICAgaWYgKEhBU19ETEdGUkFNRSggd25kUHRyLT5kd1N0eWxlLCB3bmRQdHItPmR3RXhTdHlsZSApKQogICAgIHsKLQlJbmZsYXRlUmVjdCggcmVjdCwgLVNZU01FVFJJQ1NfQ1hETEdGUkFNRSwgLVNZU01FVFJJQ1NfQ1lETEdGUkFNRSk7Ci0JaWYgKHduZFB0ci0+ZHdFeFN0eWxlICYgV1NfRVhfRExHTU9EQUxGUkFNRSkgSW5mbGF0ZVJlY3QoIHJlY3QsIC0xLCAwKTsKKwlJbmZsYXRlUmVjdDE2KCByZWN0LCAtU1lTTUVUUklDU19DWERMR0ZSQU1FLCAtU1lTTUVUUklDU19DWURMR0ZSQU1FKTsKKwlpZiAod25kUHRyLT5kd0V4U3R5bGUgJiBXU19FWF9ETEdNT0RBTEZSQU1FKQorICAgICAgICAgICAgSW5mbGF0ZVJlY3QxNiggcmVjdCwgLTEsIDAgKTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKIAlpZiAoSEFTX1RISUNLRlJBTUUoIHduZFB0ci0+ZHdTdHlsZSApKQotCSAgICBJbmZsYXRlUmVjdCggcmVjdCwgLVNZU01FVFJJQ1NfQ1hGUkFNRSwgLVNZU01FVFJJQ1NfQ1lGUkFNRSApOworCSAgICBJbmZsYXRlUmVjdDE2KCByZWN0LCAtU1lTTUVUUklDU19DWEZSQU1FLCAtU1lTTUVUUklDU19DWUZSQU1FICk7CiAJaWYgKHduZFB0ci0+ZHdTdHlsZSAmIFdTX0JPUkRFUikKLQkgICAgSW5mbGF0ZVJlY3QoIHJlY3QsIC1TWVNNRVRSSUNTX0NYQk9SREVSLCAtU1lTTUVUUklDU19DWUJPUkRFUiApOworCSAgICBJbmZsYXRlUmVjdDE2KCByZWN0LCAtU1lTTUVUUklDU19DWEJPUkRFUiwgLVNZU01FVFJJQ1NfQ1lCT1JERVIgKTsKICAgICB9CiB9CiAKQEAgLTI2MiwxNyArMjkyLDE3IEBACiAgKgogICogSGFuZGxlIGEgV01fTkNISVRURVNUIG1lc3NhZ2UuIENhbGxlZCBmcm9tIERlZldpbmRvd1Byb2MoKS4KICAqLwotTE9ORyBOQ19IYW5kbGVOQ0hpdFRlc3QoIEhXTkQgaHduZCwgUE9JTlQgcHQgKQorTE9ORyBOQ19IYW5kbGVOQ0hpdFRlc3QoIEhXTkQgaHduZCwgUE9JTlQxNiBwdCApCiB7Ci0gICAgUkVDVCByZWN0OworICAgIFJFQ1QxNiByZWN0OwogICAgIFdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKICAgICBpZiAoIXduZFB0cikgcmV0dXJuIEhURVJST1I7CiAKICAgICBkcHJpbnRmX25vbmNsaWVudChzdGRkZWIsICJOQ19IYW5kbGVOQ0hpdFRlc3Q6IGh3bmQ9JTA0eCBwdD0lZCwlZFxuIiwKIAkJICAgICAgaHduZCwgcHQueCwgcHQueSApOwogCi0gICAgR2V0V2luZG93UmVjdCggaHduZCwgJnJlY3QgKTsKLSAgICBpZiAoIVB0SW5SZWN0KCAmcmVjdCwgcHQgKSkgcmV0dXJuIEhUTk9XSEVSRTsKKyAgICBHZXRXaW5kb3dSZWN0MTYoIGh3bmQsICZyZWN0ICk7CisgICAgaWYgKCFQdEluUmVjdDE2KCAmcmVjdCwgcHQgKSkgcmV0dXJuIEhUTk9XSEVSRTsKIAogICAgIGlmICh3bmRQdHItPmR3U3R5bGUgJiBXU19NSU5JTUlaRSkgcmV0dXJuIEhUQ0FQVElPTjsKIApAQCAtMjgxLDEwICszMTEsMTAgQEAKICAgICAgICAgLyogQ2hlY2sgYm9yZGVycyAqLwogICAgICAgICBpZiAoSEFTX1RISUNLRlJBTUUoIHduZFB0ci0+ZHdTdHlsZSApKQogICAgICAgICB7Ci0gICAgICAgICAgICBJbmZsYXRlUmVjdCggJnJlY3QsIC1TWVNNRVRSSUNTX0NYRlJBTUUsIC1TWVNNRVRSSUNTX0NZRlJBTUUgKTsKKyAgICAgICAgICAgIEluZmxhdGVSZWN0MTYoICZyZWN0LCAtU1lTTUVUUklDU19DWEZSQU1FLCAtU1lTTUVUUklDU19DWUZSQU1FICk7CiAgICAgICAgICAgICBpZiAod25kUHRyLT5kd1N0eWxlICYgV1NfQk9SREVSKQotICAgICAgICAgICAgICAgIEluZmxhdGVSZWN0KCZyZWN0LCAtU1lTTUVUUklDU19DWEJPUkRFUiwgLVNZU01FVFJJQ1NfQ1lCT1JERVIpOwotICAgICAgICAgICAgaWYgKCFQdEluUmVjdCggJnJlY3QsIHB0ICkpCisgICAgICAgICAgICAgICAgSW5mbGF0ZVJlY3QxNigmcmVjdCwtU1lTTUVUUklDU19DWEJPUkRFUiwtU1lTTUVUUklDU19DWUJPUkRFUik7CisgICAgICAgICAgICBpZiAoIVB0SW5SZWN0MTYoICZyZWN0LCBwdCApKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIC8qIENoZWNrIHRvcCBzaXppbmcgYm9yZGVyICovCiAgICAgICAgICAgICAgICAgaWYgKHB0LnkgPCByZWN0LnRvcCkKQEAgLTMxOSwxMCArMzQ5LDEwIEBACiAgICAgICAgIGVsc2UgIC8qIE5vIHRoaWNrIGZyYW1lICovCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChIQVNfRExHRlJBTUUoIHduZFB0ci0+ZHdTdHlsZSwgd25kUHRyLT5kd0V4U3R5bGUgKSkKLSAgICAgICAgICAgICAgICBJbmZsYXRlUmVjdCgmcmVjdCwgLVNZU01FVFJJQ1NfQ1hETEdGUkFNRSwgLVNZU01FVFJJQ1NfQ1lETEdGUkFNRSk7CisgICAgICAgICAgICAgICAgSW5mbGF0ZVJlY3QxNigmcmVjdCwgLVNZU01FVFJJQ1NfQ1hETEdGUkFNRSwgLVNZU01FVFJJQ1NfQ1lETEdGUkFNRSk7CiAgICAgICAgICAgICBlbHNlIGlmICh3bmRQdHItPmR3U3R5bGUgJiBXU19CT1JERVIpCi0gICAgICAgICAgICAgICAgSW5mbGF0ZVJlY3QoJnJlY3QsIC1TWVNNRVRSSUNTX0NYQk9SREVSLCAtU1lTTUVUUklDU19DWUJPUkRFUik7Ci0gICAgICAgICAgICBpZiAoIVB0SW5SZWN0KCAmcmVjdCwgcHQgKSkgcmV0dXJuIEhUQk9SREVSOworICAgICAgICAgICAgICAgIEluZmxhdGVSZWN0MTYoJnJlY3QsIC1TWVNNRVRSSUNTX0NYQk9SREVSLCAtU1lTTUVUUklDU19DWUJPUkRFUik7CisgICAgICAgICAgICBpZiAoIVB0SW5SZWN0MTYoICZyZWN0LCBwdCApKSByZXR1cm4gSFRCT1JERVI7CiAgICAgICAgIH0KIAogICAgICAgICAvKiBDaGVjayBjYXB0aW9uICovCkBAIC0zMzAsNyArMzYwLDcgQEAKICAgICAgICAgaWYgKCh3bmRQdHItPmR3U3R5bGUgJiBXU19DQVBUSU9OKSA9PSBXU19DQVBUSU9OKQogICAgICAgICB7CiAgICAgICAgICAgICByZWN0LnRvcCArPSBTWVNNRVRSSUNTX0NZQ0FQVElPTiAtIDE7Ci0gICAgICAgICAgICBpZiAoIVB0SW5SZWN0KCAmcmVjdCwgcHQgKSkKKyAgICAgICAgICAgIGlmICghUHRJblJlY3QxNiggJnJlY3QsIHB0ICkpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgLyogQ2hlY2sgc3lzdGVtIG1lbnUgKi8KICAgICAgICAgICAgICAgICBpZiAod25kUHRyLT5kd1N0eWxlICYgV1NfU1lTTUVOVSkKQEAgLTM1MSwxNiArMzgxLDE2IEBACiAKICAgICAgIC8qIENoZWNrIGNsaWVudCBhcmVhICovCiAKLSAgICBTY3JlZW5Ub0NsaWVudCggaHduZCwgJnB0ICk7Ci0gICAgR2V0Q2xpZW50UmVjdCggaHduZCwgJnJlY3QgKTsKLSAgICBpZiAoUHRJblJlY3QoICZyZWN0LCBwdCApKSByZXR1cm4gSFRDTElFTlQ7CisgICAgU2NyZWVuVG9DbGllbnQxNiggaHduZCwgJnB0ICk7CisgICAgR2V0Q2xpZW50UmVjdDE2KCBod25kLCAmcmVjdCApOworICAgIGlmIChQdEluUmVjdDE2KCAmcmVjdCwgcHQgKSkgcmV0dXJuIEhUQ0xJRU5UOwogCiAgICAgICAvKiBDaGVjayB2ZXJ0aWNhbCBzY3JvbGwgYmFyICovCiAKICAgICBpZiAod25kUHRyLT5kd1N0eWxlICYgV1NfVlNDUk9MTCkKICAgICB7CiAJcmVjdC5yaWdodCArPSBTWVNNRVRSSUNTX0NYVlNDUk9MTDsKLQlpZiAoUHRJblJlY3QoICZyZWN0LCBwdCApKSByZXR1cm4gSFRWU0NST0xMOworCWlmIChQdEluUmVjdDE2KCAmcmVjdCwgcHQgKSkgcmV0dXJuIEhUVlNDUk9MTDsKICAgICB9CiAKICAgICAgIC8qIENoZWNrIGhvcml6b250YWwgc2Nyb2xsIGJhciAqLwpAQCAtMzY4LDcgKzM5OCw3IEBACiAgICAgaWYgKHduZFB0ci0+ZHdTdHlsZSAmIFdTX0hTQ1JPTEwpCiAgICAgewogCXJlY3QuYm90dG9tICs9IFNZU01FVFJJQ1NfQ1lIU0NST0xMOwotCWlmIChQdEluUmVjdCggJnJlY3QsIHB0ICkpCisJaWYgKFB0SW5SZWN0MTYoICZyZWN0LCBwdCApKQogCXsKIAkgICAgICAvKiBDaGVjayBzaXplIGJveCAqLwogCSAgICBpZiAoKHduZFB0ci0+ZHdTdHlsZSAmIFdTX1ZTQ1JPTEwpICYmCkBAIC0zOTYsNyArNDI2LDcgQEAKICAqLwogdm9pZCBOQ19EcmF3U3lzQnV0dG9uKCBIV05EIGh3bmQsIEhEQyBoZGMsIEJPT0wgZG93biApCiB7Ci0gICAgUkVDVCByZWN0OworICAgIFJFQ1QxNiByZWN0OwogICAgIEhEQyBoZGNNZW07CiAgICAgSEJJVE1BUCBoYml0bWFwOwogICAgIFdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKQEAgLTQxNyw3ICs0NDcsNyBAQAogICovCiBzdGF0aWMgdm9pZCBOQ19EcmF3TWF4QnV0dG9uKCBIV05EIGh3bmQsIEhEQyBoZGMsIEJPT0wgZG93biApCiB7Ci0gICAgUkVDVCByZWN0OworICAgIFJFQ1QxNiByZWN0OwogICAgIE5DX0dldEluc2lkZVJlY3QoIGh3bmQsICZyZWN0ICk7CiAgICAgR1JBUEhfRHJhd0JpdG1hcCggaGRjLCAoSXNab29tZWQoaHduZCkgPwogCQkJICAgIChkb3duID8gaGJpdG1hcFJlc3RvcmVEIDogaGJpdG1hcFJlc3RvcmUpIDoKQEAgLTQzMiw3ICs0NjIsNyBAQAogICovCiBzdGF0aWMgdm9pZCBOQ19EcmF3TWluQnV0dG9uKCBIV05EIGh3bmQsIEhEQyBoZGMsIEJPT0wgZG93biApCiB7Ci0gICAgUkVDVCByZWN0OworICAgIFJFQ1QxNiByZWN0OwogICAgIFdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKICAgICBOQ19HZXRJbnNpZGVSZWN0KCBod25kLCAmcmVjdCApOwogICAgIGlmICh3bmRQdHItPmR3U3R5bGUgJiBXU19NQVhJTUlaRUJPWCkgcmVjdC5yaWdodCAtPSBTWVNNRVRSSUNTX0NYU0laRSArIDE7CkBAIC00NDgsNyArNDc4LDcgQEAKICAqIERyYXcgYSB3aW5kb3cgZnJhbWUgaW5zaWRlIHRoZSBnaXZlbiByZWN0YW5nbGUsIGFuZCB1cGRhdGUgdGhlIHJlY3RhbmdsZS4KICAqIFRoZSBjb3JyZWN0IHBlbiBmb3IgdGhlIGZyYW1lIG11c3QgYmUgc2VsZWN0ZWQgaW4gdGhlIERDLgogICovCi1zdGF0aWMgdm9pZCBOQ19EcmF3RnJhbWUoIEhEQyBoZGMsIFJFQ1QgKnJlY3QsIEJPT0wgZGxnRnJhbWUsIEJPT0wgYWN0aXZlICkKK3N0YXRpYyB2b2lkIE5DX0RyYXdGcmFtZSggSERDIGhkYywgUkVDVDE2ICpyZWN0LCBCT09MIGRsZ0ZyYW1lLCBCT09MIGFjdGl2ZSApCiB7CiAgICAgc2hvcnQgd2lkdGgsIGhlaWdodCwgdG1wOwogCkBAIC00NzksNyArNTA5LDcgQEAKIAogICAgIGlmIChkbGdGcmFtZSkKICAgICB7Ci0JSW5mbGF0ZVJlY3QoIHJlY3QsIC13aWR0aCwgLWhlaWdodCApOworCUluZmxhdGVSZWN0MTYoIHJlY3QsIC13aWR0aCwgLWhlaWdodCApOwogCXJldHVybjsKICAgICB9CiAgICAgCkBAIC01MTUsNyArNTQ1LDcgQEAKICAgICBNb3ZlVG8oIGhkYywgdG1wLCByZWN0LT5ib3R0b20taGVpZ2h0LTEgKTsKICAgICBMaW5lVG8oIGhkYywgdG1wLCByZWN0LT5ib3R0b20tMSApOwogCi0gICAgSW5mbGF0ZVJlY3QoIHJlY3QsIC13aWR0aC0xLCAtaGVpZ2h0LTEgKTsKKyAgICBJbmZsYXRlUmVjdDE2KCByZWN0LCAtd2lkdGgtMSwgLWhlaWdodC0xICk7CiB9CiAKIApAQCAtNTI0LDcgKzU1NCw3IEBACiAgKgogICogRHJhdyB0aGUgZnJhbWUgdXNlZCB3aGVuIG1vdmluZyBvciByZXNpemluZyB3aW5kb3cuCiAgKi8KLXN0YXRpYyB2b2lkIE5DX0RyYXdNb3ZpbmdGcmFtZSggSERDIGhkYywgUkVDVCAqcmVjdCwgQk9PTCB0aGlja2ZyYW1lICkKK3N0YXRpYyB2b2lkIE5DX0RyYXdNb3ZpbmdGcmFtZSggSERDIGhkYywgUkVDVDE2ICpyZWN0LCBCT09MIHRoaWNrZnJhbWUgKQogewogICAgIGlmICh0aGlja2ZyYW1lKQogICAgIHsKQEAgLTU0MSw3ICs1NzEsNyBAQAogCVBhdEJsdCggaGRjLCByZWN0LT5yaWdodCwgcmVjdC0+dG9wLCAtU1lTTUVUUklDU19DWEZSQU1FLCAKIAkgICAgICAgIHJlY3QtPmJvdHRvbSAtIHJlY3QtPnRvcCAtIFNZU01FVFJJQ1NfQ1lGUkFNRSwgUEFUSU5WRVJUICk7CiAgICAgfQotICAgIGVsc2UgRHJhd0ZvY3VzUmVjdCggaGRjLCByZWN0ICk7CisgICAgZWxzZSBEcmF3Rm9jdXNSZWN0MTYoIGhkYywgcmVjdCApOwogfQogCiAKQEAgLTU1MSwxMCArNTgxLDEwIEBACiAgKiBEcmF3IHRoZSB3aW5kb3cgY2FwdGlvbi4KICAqIFRoZSBjb3JyZWN0IHBlbiBmb3IgdGhlIHdpbmRvdyBmcmFtZSBtdXN0IGJlIHNlbGVjdGVkIGluIHRoZSBEQy4KICAqLwotc3RhdGljIHZvaWQgTkNfRHJhd0NhcHRpb24oIEhEQyBoZGMsIFJFQ1QgKnJlY3QsIEhXTkQgaHduZCwKK3N0YXRpYyB2b2lkIE5DX0RyYXdDYXB0aW9uKCBIREMgaGRjLCBSRUNUMTYgKnJlY3QsIEhXTkQgaHduZCwKIAkJCSAgICBEV09SRCBzdHlsZSwgQk9PTCBhY3RpdmUgKQogewotICAgIFJFQ1QgciA9ICpyZWN0OworICAgIFJFQ1QxNiByID0gKnJlY3Q7CiAgICAgV05EICogd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKICAgICBjaGFyIGJ1ZmZlclsyNTZdOwogCkBAIC02MDIsMTUgKzYzMiwxNiBAQAogCXIucmlnaHQgLT0gU1lTTUVUUklDU19DWFNJWkUgKyAxOwogICAgIH0KIAotICAgIEZpbGxSZWN0KCBoZGMsICZyLCBhY3RpdmUgPyBzeXNDb2xvck9iamVjdHMuaGJydXNoQWN0aXZlQ2FwdGlvbiA6IAotCSAgICAgICAgICAgICAgICAgICAgICAgIHN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hJbmFjdGl2ZUNhcHRpb24gKTsKKyAgICBGaWxsUmVjdDE2KCBoZGMsICZyLCBhY3RpdmUgPyBzeXNDb2xvck9iamVjdHMuaGJydXNoQWN0aXZlQ2FwdGlvbiA6IAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzQ29sb3JPYmplY3RzLmhicnVzaEluYWN0aXZlQ2FwdGlvbiApOwogCiAgICAgaWYgKEdldFdpbmRvd1RleHQoIGh3bmQsIGJ1ZmZlciwgMjU2ICkpCiAgICAgewogCWlmIChhY3RpdmUpIFNldFRleHRDb2xvciggaGRjLCBHZXRTeXNDb2xvciggQ09MT1JfQ0FQVElPTlRFWFQgKSApOwogCWVsc2UgU2V0VGV4dENvbG9yKCBoZGMsIEdldFN5c0NvbG9yKCBDT0xPUl9JTkFDVElWRUNBUFRJT05URVhUICkgKTsKIAlTZXRCa01vZGUoIGhkYywgVFJBTlNQQVJFTlQgKTsKLQlEcmF3VGV4dCggaGRjLCBidWZmZXIsIC0xLCAmciwgRFRfU0lOR0xFTElORSB8IERUX0NFTlRFUiB8IERUX1ZDRU5URVIpOworCURyYXdUZXh0MTYoIGhkYywgYnVmZmVyLCAtMSwgJnIsCisgICAgICAgICAgICAgICAgICAgIERUX1NJTkdMRUxJTkUgfCBEVF9DRU5URVIgfCBEVF9WQ0VOVEVSICk7CiAgICAgfQogfQogCkBAIC02MjMsNyArNjU0LDcgQEAKIHZvaWQgTkNfRG9OQ1BhaW50KCBIV05EIGh3bmQsIEhSR04gY2xpcCwgQk9PTCBzdXBwcmVzc19tZW51cGFpbnQgKQogewogICAgIEhEQyAJaGRjOwotICAgIFJFQ1QgCXJlY3Q7CisgICAgUkVDVDE2IHJlY3Q7CiAgICAgQk9PTAlhY3RpdmU7CiAKICAgICBXTkQgKnduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICk7CkBAIC02ODUsNyArNzE2LDcgQEAKICAgICAgICAgICAgIExpbmVUbyggaGRjLCByZWN0LnJpZ2h0LTEsIHJlY3QuYm90dG9tLTEgKTsKICAgICAgICAgICAgIExpbmVUbyggaGRjLCAwLCByZWN0LmJvdHRvbS0xICk7CiAgICAgICAgICAgICBMaW5lVG8oIGhkYywgMCwgMCApOwotICAgICAgICAgICAgSW5mbGF0ZVJlY3QoICZyZWN0LCAtMSwgLTEgKTsKKyAgICAgICAgICAgIEluZmxhdGVSZWN0MTYoICZyZWN0LCAtMSwgLTEgKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChIQVNfRExHRlJBTUUoIHduZFB0ci0+ZHdTdHlsZSwgd25kUHRyLT5kd0V4U3R5bGUgKSkgCkBAIC02OTUsNyArNzI2LDcgQEAKIAogICAgICAgICBpZiAoKHduZFB0ci0+ZHdTdHlsZSAmIFdTX0NBUFRJT04pID09IFdTX0NBUFRJT04pCiAgICAgICAgIHsKLSAgICAgICAgICAgIFJFQ1QgciA9IHJlY3Q7CisgICAgICAgICAgICBSRUNUMTYgciA9IHJlY3Q7CiAgICAgICAgICAgICByLmJvdHRvbSA9IHJlY3QudG9wICsgU1lTTUVUUklDU19DWVNJWkU7CiAgICAgICAgICAgICByZWN0LnRvcCArPSBTWVNNRVRSSUNTX0NZU0laRSArIFNZU01FVFJJQ1NfQ1lCT1JERVI7CiAgICAgICAgICAgICBOQ19EcmF3Q2FwdGlvbiggaGRjLCAmciwgaHduZCwgd25kUHRyLT5kd1N0eWxlLCBhY3RpdmUgKTsKQEAgLTcwNCw3ICs3MzUsNyBAQAogCiAgICAgaWYgKEhBU19NRU5VKHduZFB0cikpCiAgICAgewotCVJFQ1QgciA9IHJlY3Q7CisJUkVDVDE2IHIgPSByZWN0OwogCXIuYm90dG9tID0gcmVjdC50b3AgKyBTWVNNRVRSSUNTX0NZTUVOVTsgIC8qIGRlZmF1bHQgaGVpZ2h0ICovCiAJcmVjdC50b3AgKz0gTUVOVV9EcmF3TWVudUJhciggaGRjLCAmciwgaHduZCwgc3VwcHJlc3NfbWVudXBhaW50ICk7CiAgICAgfQpAQCAtNzE4LDEwICs3NDksMTAgQEAKIAogICAgIGlmICgod25kUHRyLT5kd1N0eWxlICYgV1NfVlNDUk9MTCkgJiYgKHduZFB0ci0+ZHdTdHlsZSAmIFdTX0hTQ1JPTEwpKQogICAgIHsKLSAgICAgICAgUkVDVCByID0gcmVjdDsKKyAgICAgICAgUkVDVDE2IHIgPSByZWN0OwogICAgICAgICByLmxlZnQgPSByLnJpZ2h0IC0gU1lTTUVUUklDU19DWFZTQ1JPTEwgKyAxOwogICAgICAgICByLnRvcCAgPSByLmJvdHRvbSAtIFNZU01FVFJJQ1NfQ1lIU0NST0xMICsgMTsKLSAgICAgICAgRmlsbFJlY3QoIGhkYywgJnIsIHN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hTY3JvbGxiYXIgKTsKKyAgICAgICAgRmlsbFJlY3QxNiggaGRjLCAmciwgc3lzQ29sb3JPYmplY3RzLmhicnVzaFNjcm9sbGJhciApOwogICAgIH0gICAgCiAKICAgICBSZWxlYXNlREMoIGh3bmQsIGhkYyApOwpAQCAtODE3LDkgKzg0OCw5IEBACiAgKgogICogVHJhY2sgYSBtb3VzZSBidXR0b24gcHJlc3Mgb24gdGhlIHN5c3RlbSBtZW51LgogICovCi1zdGF0aWMgdm9pZCBOQ19UcmFja1N5c01lbnUoIEhXTkQgaHduZCwgSERDIGhkYywgUE9JTlQgcHQgKQorc3RhdGljIHZvaWQgTkNfVHJhY2tTeXNNZW51KCBIV05EIGh3bmQsIEhEQyBoZGMsIFBPSU5UMTYgcHQgKQogewotICAgIFJFQ1QgcmVjdDsKKyAgICBSRUNUMTYgcmVjdDsKICAgICBXTkQgKnduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICk7CiAgICAgaW50IGljb25pYyA9IHduZFB0ci0+ZHdTdHlsZSAmIFdTX01JTklNSVpFOwogCkBAIC04MzAsMTQgKzg2MSwxNCBAQAogICAgIHsKIAkgIC8qIE90aGVyd2lzZSB0cmFjayB0aGUgc3lzdGVtIG1lbnUgbGlrZSBhIG5vcm1hbCBwb3B1cCBtZW51ICovCiAJTkNfR2V0SW5zaWRlUmVjdCggaHduZCwgJnJlY3QgKTsKLQlPZmZzZXRSZWN0KCAmcmVjdCwgd25kUHRyLT5yZWN0V2luZG93LmxlZnQsIHduZFB0ci0+cmVjdFdpbmRvdy50b3AgKTsKKwlPZmZzZXRSZWN0MTYoICZyZWN0LCB3bmRQdHItPnJlY3RXaW5kb3cubGVmdCwgd25kUHRyLT5yZWN0V2luZG93LnRvcCApOwogCWlmICh3bmRQdHItPmR3U3R5bGUgJiBXU19DSElMRCkKLQkgICAgQ2xpZW50VG9TY3JlZW4oIHduZFB0ci0+cGFyZW50LT5od25kU2VsZiwgKFBPSU5UICopJnJlY3QgKTsKKwkgICAgQ2xpZW50VG9TY3JlZW4xNiggd25kUHRyLT5wYXJlbnQtPmh3bmRTZWxmLCAoUE9JTlQxNiAqKSZyZWN0ICk7CiAJcmVjdC5yaWdodCA9IHJlY3QubGVmdCArIFNZU01FVFJJQ1NfQ1hTSVpFOwogCXJlY3QuYm90dG9tID0gcmVjdC50b3AgKyBTWVNNRVRSSUNTX0NZU0laRTsKIAlpZiAoIWljb25pYykgTkNfRHJhd1N5c0J1dHRvbiggaHduZCwgaGRjLCBUUlVFICk7Ci0JVHJhY2tQb3B1cE1lbnUoIHduZFB0ci0+aFN5c01lbnUsIFRQTV9MRUZUQUxJR04gfCBUUE1fTEVGVEJVVFRPTiwKLQkJICAgICAgICByZWN0LmxlZnQsIHJlY3QuYm90dG9tLCAwLCBod25kLCAmcmVjdCApOworCVRyYWNrUG9wdXBNZW51MTYoIHduZFB0ci0+aFN5c01lbnUsIFRQTV9MRUZUQUxJR04gfCBUUE1fTEVGVEJVVFRPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5sZWZ0LCByZWN0LmJvdHRvbSwgMCwgaHduZCwgJnJlY3QgKTsKIAlpZiAoIWljb25pYykgTkNfRHJhd1N5c0J1dHRvbiggaHduZCwgaGRjLCBGQUxTRSApOwogICAgIH0KIH0KQEAgLTg0OSwxNyArODgwLDE3IEBACiAgKiBJbml0aWFsaXNhdGlvbiBvZiBhIG1vdmUgb3IgcmVzaXplLCB3aGVuIGluaXRpYXRpZWQgZnJvbSBhIG1lbnUgY2hvaWNlLgogICogUmV0dXJuIGhpdCB0ZXN0IGNvZGUgZm9yIGNhcHRpb24gb3Igc2l6aW5nIGJvcmRlci4KICAqLwotc3RhdGljIExPTkcgTkNfU3RhcnRTaXplTW92ZSggSFdORCBod25kLCBXUEFSQU0gd1BhcmFtLCBQT0lOVCAqY2FwdHVyZVBvaW50ICkKK3N0YXRpYyBMT05HIE5DX1N0YXJ0U2l6ZU1vdmUoIEhXTkQgaHduZCwgV1BBUkFNIHdQYXJhbSwgUE9JTlQxNiAqY2FwdHVyZVBvaW50ICkKIHsKICAgICBMT05HIGhpdHRlc3QgPSAwOwotICAgIFBPSU5UIHB0OworICAgIFBPSU5UMTYgcHQ7CiAgICAgTVNHIG1zZzsKICAgICBXTkQgKiB3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApOwogCiAgICAgaWYgKCh3UGFyYW0gJiAweGZmZjApID09IFNDX01PVkUpCiAgICAgewogCSAgLyogTW92ZSBwb2ludGVyIGF0IHRoZSBjZW50ZXIgb2YgdGhlIGNhcHRpb24gKi8KLQlSRUNUIHJlY3Q7CisJUkVDVDE2IHJlY3Q7CiAJTkNfR2V0SW5zaWRlUmVjdCggaHduZCwgJnJlY3QgKTsKIAlpZiAod25kUHRyLT5kd1N0eWxlICYgV1NfU1lTTUVOVSkKIAkgICAgcmVjdC5sZWZ0ICs9IFNZU01FVFJJQ1NfQ1hTSVpFICsgMTsKQEAgLTg3MCw3ICs5MDEsNyBAQAogCXB0LnggPSB3bmRQdHItPnJlY3RXaW5kb3cubGVmdCArIChyZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0KSAvIDI7CiAJcHQueSA9IHduZFB0ci0+cmVjdFdpbmRvdy50b3AgKyByZWN0LnRvcCArIFNZU01FVFJJQ1NfQ1lTSVpFLzI7CiAJaWYgKHduZFB0ci0+ZHdTdHlsZSAmIFdTX0NISUxEKQotCSAgICBDbGllbnRUb1NjcmVlbiggd25kUHRyLT5wYXJlbnQtPmh3bmRTZWxmLCAmcHQgKTsKKwkgICAgQ2xpZW50VG9TY3JlZW4xNiggd25kUHRyLT5wYXJlbnQtPmh3bmRTZWxmLCAmcHQgKTsKIAloaXR0ZXN0ID0gSFRDQVBUSU9OOwogICAgIH0KICAgICBlbHNlICAvKiBTQ19TSVpFICovCkBAIC05MzIsMTQgKzk2MywxNCBAQAogICoKICAqIFBlcmZvcm0gU0NfTU9WRSBhbmQgU0NfU0laRSBjb21tYW5kcy4KICAqLwotc3RhdGljIHZvaWQgTkNfRG9TaXplTW92ZSggSFdORCBod25kLCBXT1JEIHdQYXJhbSwgUE9JTlQgcHQgKQorc3RhdGljIHZvaWQgTkNfRG9TaXplTW92ZSggSFdORCBod25kLCBXT1JEIHdQYXJhbSwgUE9JTlQxNiBwdCApCiB7CiAgICAgTVNHIG1zZzsKICAgICBMT05HIGhpdHRlc3Q7Ci0gICAgUkVDVCBzaXppbmdSZWN0LCBtb3VzZVJlY3Q7CisgICAgUkVDVDE2IHNpemluZ1JlY3QsIG1vdXNlUmVjdDsKICAgICBIREMgaGRjOwogICAgIEJPT0wgdGhpY2tmcmFtZTsKLSAgICBQT0lOVCBtaW5UcmFjaywgbWF4VHJhY2ssIGNhcHR1cmVQb2ludCA9IHB0OworICAgIFBPSU5UMTYgbWluVHJhY2ssIG1heFRyYWNrLCBjYXB0dXJlUG9pbnQgPSBwdDsKICAgICBXTkQgKiB3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApOwogICAgIGludCBtb3ZlZCA9IDA7CiAKQEAgLTk3NSw4ICsxMDA2LDggQEAKICAgICBOQ19HZXRNaW5NYXhJbmZvKCBod25kLCBOVUxMLCBOVUxMLCAmbWluVHJhY2ssICZtYXhUcmFjayApOwogICAgIHNpemluZ1JlY3QgPSB3bmRQdHItPnJlY3RXaW5kb3c7CiAgICAgaWYgKHduZFB0ci0+ZHdTdHlsZSAmIFdTX0NISUxEKQotCUdldENsaWVudFJlY3QoIHduZFB0ci0+cGFyZW50LT5od25kU2VsZiwgJm1vdXNlUmVjdCApOwotICAgIGVsc2UgU2V0UmVjdCggJm1vdXNlUmVjdCwgMCwgMCwgU1lTTUVUUklDU19DWFNDUkVFTiwgU1lTTUVUUklDU19DWVNDUkVFTiApOworCUdldENsaWVudFJlY3QxNiggd25kUHRyLT5wYXJlbnQtPmh3bmRTZWxmLCAmbW91c2VSZWN0ICk7CisgICAgZWxzZSBTZXRSZWN0MTYoJm1vdXNlUmVjdCwgMCwgMCwgU1lTTUVUUklDU19DWFNDUkVFTiwgU1lTTUVUUklDU19DWVNDUkVFTik7CiAgICAgaWYgKE9OX0xFRlRfQk9SREVSKGhpdHRlc3QpKQogICAgIHsKIAltb3VzZVJlY3QubGVmdCAgPSBNQVgoIG1vdXNlUmVjdC5sZWZ0LCBzaXppbmdSZWN0LnJpZ2h0LW1heFRyYWNrLnggKTsKQEAgLTEwMjksOCArMTA2MCw3IEBACiAKIAlwdCA9IG1zZy5wdDsKIAlpZiAod25kUHRyLT5kd1N0eWxlICYgV1NfQ0hJTEQpCi0JICAgIFNjcmVlblRvQ2xpZW50KCB3bmRQdHItPnBhcmVudC0+aHduZFNlbGYsICZwdCApOwotCisJICAgIFNjcmVlblRvQ2xpZW50MTYoIHduZFB0ci0+cGFyZW50LT5od25kU2VsZiwgJnB0ICk7CiAJCiAJaWYgKG1zZy5tZXNzYWdlID09IFdNX0tFWURPV04pIHN3aXRjaChtc2cud1BhcmFtKQogCXsKQEAgLTEwNTQsOSArMTA4NCw5IEBACiAJICAgIGlmIChtc2cubWVzc2FnZSA9PSBXTV9LRVlET1dOKSBTZXRDdXJzb3JQb3MoIHB0LngsIHB0LnkgKTsKIAkgICAgZWxzZQogCSAgICB7Ci0JCVJFQ1QgbmV3UmVjdCA9IHNpemluZ1JlY3Q7CisJCVJFQ1QxNiBuZXdSZWN0ID0gc2l6aW5nUmVjdDsKIAotCQlpZiAoaGl0dGVzdCA9PSBIVENBUFRJT04pIE9mZnNldFJlY3QoICZuZXdSZWN0LCBkeCwgZHkgKTsKKwkJaWYgKGhpdHRlc3QgPT0gSFRDQVBUSU9OKSBPZmZzZXRSZWN0MTYoICZuZXdSZWN0LCBkeCwgZHkgKTsKIAkJaWYgKE9OX0xFRlRfQk9SREVSKGhpdHRlc3QpKSBuZXdSZWN0LmxlZnQgKz0gZHg7CiAJCWVsc2UgaWYgKE9OX1JJR0hUX0JPUkRFUihoaXR0ZXN0KSkgbmV3UmVjdC5yaWdodCArPSBkeDsKIAkJaWYgKE9OX1RPUF9CT1JERVIoaGl0dGVzdCkpIG5ld1JlY3QudG9wICs9IGR5OwpAQCAtMTE1MCw5ICsxMTgwLDkgQEAKICAqCiAgKiBUcmFjayBhIG1vdXNlIGJ1dHRvbiBwcmVzcyBvbiB0aGUgaG9yaXpvbnRhbCBvciB2ZXJ0aWNhbCBzY3JvbGwtYmFyLgogICovCi1zdGF0aWMgdm9pZCBOQ19UcmFja1Njcm9sbEJhciggSFdORCBod25kLCBXT1JEIHdQYXJhbSwgUE9JTlQgcHQgKQorc3RhdGljIHZvaWQgTkNfVHJhY2tTY3JvbGxCYXIoIEhXTkQgaHduZCwgV09SRCB3UGFyYW0sIFBPSU5UMTYgcHQgKQogewotICAgIE1TRyBtc2c7CisgICAgTVNHICptc2c7CiAgICAgV09SRCBzY3JvbGxiYXI7CiAgICAgV05EICp3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApOwogCkBAIC0xMTY3LDYgKzExOTcsNyBAQAogCXNjcm9sbGJhciA9IFNCX1ZFUlQ7CiAgICAgfQogCisgICAgaWYgKCEobXNnID0gU0VHUFRSX05FVyhNU0cpKSkgcmV0dXJuOwogICAgIHB0LnggLT0gd25kUHRyLT5yZWN0V2luZG93LmxlZnQ7CiAgICAgcHQueSAtPSB3bmRQdHItPnJlY3RXaW5kb3cudG9wOwogICAgIFNldENhcHR1cmUoIGh3bmQgKTsKQEAgLTExNzQsMjEgKzEyMDUsMjEgQEAKIAogICAgIGRvCiAgICAgewotICAgICAgICBHZXRNZXNzYWdlKCBNQUtFX1NFR1BUUigmbXNnKSwgMCwgMCwgMCApOwotCXN3aXRjaChtc2cubWVzc2FnZSkKKyAgICAgICAgR2V0TWVzc2FnZSggU0VHUFRSX0dFVChtc2cpLCAwLCAwLCAwICk7CisJc3dpdGNoKG1zZy0+bWVzc2FnZSkKIAl7CiAJY2FzZSBXTV9MQlVUVE9OVVA6CiAJY2FzZSBXTV9NT1VTRU1PVkU6CiAgICAgICAgIGNhc2UgV01fU1lTVElNRVI6Ci0gICAgICAgICAgICBwdC54ID0gTE9XT1JEKG1zZy5sUGFyYW0pICsgd25kUHRyLT5yZWN0Q2xpZW50LmxlZnQgLSAKKyAgICAgICAgICAgIHB0LnggPSBMT1dPUkQobXNnLT5sUGFyYW0pICsgd25kUHRyLT5yZWN0Q2xpZW50LmxlZnQgLSAKIAkgICAgICB3bmRQdHItPnJlY3RXaW5kb3cubGVmdDsKLSAgICAgICAgICAgIHB0LnkgPSBISVdPUkQobXNnLmxQYXJhbSkgKyB3bmRQdHItPnJlY3RDbGllbnQudG9wIC0gCisgICAgICAgICAgICBwdC55ID0gSElXT1JEKG1zZy0+bFBhcmFtKSArIHduZFB0ci0+cmVjdENsaWVudC50b3AgLSAKIAkgICAgICB3bmRQdHItPnJlY3RXaW5kb3cudG9wOwotICAgICAgICAgICAgU0NST0xMX0hhbmRsZVNjcm9sbEV2ZW50KCBod25kLCBzY3JvbGxiYXIsIG1zZy5tZXNzYWdlLCBwdCApOworICAgICAgICAgICAgU0NST0xMX0hhbmRsZVNjcm9sbEV2ZW50KCBod25kLCBzY3JvbGxiYXIsIG1zZy0+bWVzc2FnZSwgcHQgKTsKIAkgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBUcmFuc2xhdGVNZXNzYWdlKCAmbXNnICk7Ci0gICAgICAgICAgICBEaXNwYXRjaE1lc3NhZ2UoICZtc2cgKTsKKyAgICAgICAgICAgIFRyYW5zbGF0ZU1lc3NhZ2UoIG1zZyApOworICAgICAgICAgICAgRGlzcGF0Y2hNZXNzYWdlKCBtc2cgKTsKICAgICAgICAgICAgIGJyZWFrOwogCX0KICAgICAgICAgaWYgKCFJc1dpbmRvdyggaHduZCApKQpAQCAtMTE5Niw3ICsxMjI3LDggQEAKICAgICAgICAgICAgIFJlbGVhc2VDYXB0dXJlKCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgIH0gd2hpbGUgKG1zZy5tZXNzYWdlICE9IFdNX0xCVVRUT05VUCk7CisgICAgfSB3aGlsZSAobXNnLT5tZXNzYWdlICE9IFdNX0xCVVRUT05VUCk7CisgICAgU0VHUFRSX0ZSRUUobXNnKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMjA3LDcgKzEyMzksNiBAQAogTE9ORyBOQ19IYW5kbGVOQ0xCdXR0b25Eb3duKCBIV05EIGh3bmQsIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0gKQogewogICAgIEhEQyBoZGMgPSBHZXRXaW5kb3dEQyggaHduZCApOwotICAgIFBPSU5UIHB0ID0geyBMT1dPUkQobFBhcmFtKSwgSElXT1JEKGxQYXJhbSkgfTsKIAogICAgIHN3aXRjaCh3UGFyYW0pICAvKiBIaXQgdGVzdCAqLwogICAgIHsKQEAgLTEyMTYsNyArMTI0Nyw3IEBACiAJYnJlYWs7CiAKICAgICBjYXNlIEhUU1lTTUVOVToKLQlOQ19UcmFja1N5c01lbnUoIGh3bmQsIGhkYywgcHQgKTsKKwlOQ19UcmFja1N5c01lbnUoIGh3bmQsIGhkYywgTUFLRVBPSU5UMTYobFBhcmFtKSApOwogCWJyZWFrOwogCiAgICAgY2FzZSBIVE1FTlU6CkBAIC0xMjk3LDcgKzEzMjgsNyBAQAogICoKICAqIEhhbmRsZSBhIFdNX1NZU0NPTU1BTkQgbWVzc2FnZS4gQ2FsbGVkIGZyb20gRGVmV2luZG93UHJvYygpLgogICovCi1MT05HIE5DX0hhbmRsZVN5c0NvbW1hbmQoIEhXTkQgaHduZCwgV1BBUkFNIHdQYXJhbSwgUE9JTlQgcHQgKQorTE9ORyBOQ19IYW5kbGVTeXNDb21tYW5kKCBIV05EIGh3bmQsIFdQQVJBTSB3UGFyYW0sIFBPSU5UMTYgcHQgKQogewogICAgIFdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKIApAQCAtMTMwNSw3ICsxMzM2LDcgQEAKIAkJICAgICAgd1BhcmFtLCBwdC54LCBwdC55ICk7CiAKICAgICBpZiAod25kUHRyLT5kd1N0eWxlICYgV1NfQ0hJTEQgJiYgd1BhcmFtICE9IFNDX0tFWU1FTlUgKQotICAgICAgICBTY3JlZW5Ub0NsaWVudCggd25kUHRyLT5wYXJlbnQtPmh3bmRTZWxmLCAmcHQgKTsKKyAgICAgICAgU2NyZWVuVG9DbGllbnQxNiggd25kUHRyLT5wYXJlbnQtPmh3bmRTZWxmLCAmcHQgKTsKIAogICAgIHN3aXRjaCAod1BhcmFtICYgMHhmZmYwKQogICAgIHsKZGlmZiAtLWdpdCBhL3dpbmRvd3MvcGFpbnRpbmcuYyBiL3dpbmRvd3MvcGFpbnRpbmcuYwppbmRleCA5MzU2NTIzLi4xNWViOGFkIDEwMDY0NAotLS0gYS93aW5kb3dzL3BhaW50aW5nLmMKKysrIGIvd2luZG93cy9wYWludGluZy5jCkBAIC0yMyw3ICsyMyw3IEBACiAgKi8KIHZvaWQgV0lOX1VwZGF0ZU5DQXJlYShXTkQqIHduZCwgQk9PTCBiVXBkYXRlKQogewotICAgIFBPSU5UIHB0ID0gezAsIDB9OyAKKyAgICBQT0lOVDE2IHB0ID0gezAsIDB9OyAKICAgICBIUkdOIGhDbGlwID0gMTsKIAogICAgIGRwcmludGZfbm9uY2xpZW50KHN0ZGRlYiwiTkNVcGRhdGU6IGh3bmQgJTA0eCwgaHJnblVwZGF0ZSAlMDR4XG4iLCAKQEAgLTM4LDcgKzM4LDcgQEAKIAogICAgIGlmKCB3bmQtPmhyZ25VcGRhdGUgPiAxICkKICAgICB7Ci0JQ2xpZW50VG9TY3JlZW4od25kLT5od25kU2VsZiwgJnB0KTsKKwlDbGllbnRUb1NjcmVlbjE2KHduZC0+aHduZFNlbGYsICZwdCk7CiAKICAgICAgICAgaENsaXAgPSBDcmVhdGVSZWN0UmduKCAwLCAwLCAwLCAwICk7CiAgICAgICAgIGlmICghQ29tYmluZVJnbihoQ2xpcCwgd25kLT5ocmduVXBkYXRlLCAwLCBSR05fQ09QWSkgKQpAQCAtODMsOSArODMsOSBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEJlZ2luUGFpbnQgICAgKFVTRVIuMzkpCisgKiAgICAgICAgICAgQmVnaW5QYWludDE2ICAgIChVU0VSLjM5KQogICovCi1IREMgQmVnaW5QYWludCggSFdORCBod25kLCBMUFBBSU5UU1RSVUNUIGxwcyApIAorSERDMTYgQmVnaW5QYWludDE2KCBIV05EMTYgaHduZCwgTFBQQUlOVFNUUlVDVDE2IGxwcyApIAogewogICAgIEhSR04gaHJnblVwZGF0ZTsKICAgICBXTkQgKiB3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApOwpAQCAtMTEzLDggKzExMyw4IEBACiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAotICAgIEdldFJnbkJveCggSW5xdWlyZVZpc1JnbihscHMtPmhkYyksICZscHMtPnJjUGFpbnQgKTsKLSAgICBEUHRvTFAoIGxwcy0+aGRjLCAoTFBQT0lOVCkmbHBzLT5yY1BhaW50LCAyICk7CisgICAgR2V0UmduQm94MTYoIElucXVpcmVWaXNSZ24obHBzLT5oZGMpLCAmbHBzLT5yY1BhaW50ICk7CisgICAgRFB0b0xQMTYoIGxwcy0+aGRjLCAoTFBQT0lOVDE2KSZscHMtPnJjUGFpbnQsIDIgKTsKIAogICAgIGlmICh3bmRQdHItPmZsYWdzICYgV0lOX05FRURTX0VSQVNFQktHTkQpCiAgICAgewpAQCAtMTI4LDkgKzEyOCwyOSBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEVuZFBhaW50ICAgIChVU0VSLjQwKQorICogICAgICAgICAgIEJlZ2luUGFpbnQzMiAgICAoVVNFUjMyLjkpCiAgKi8KLUJPT0wgRW5kUGFpbnQoIEhXTkQgaHduZCwgY29uc3QgUEFJTlRTVFJVQ1QqIGxwcyApCitIREMzMiBCZWdpblBhaW50MzIoIEhXTkQzMiBod25kLCBQQUlOVFNUUlVDVDMyICpscHMgKQoreworICAgIFBBSU5UU1RSVUNUMTYgcHM7CisKKyAgICBCZWdpblBhaW50MTYoIGh3bmQsICZwcyApOworICAgIGxwcy0+aGRjICAgICAgICAgICAgPSAoSERDMzIpcHMuaGRjOworICAgIGxwcy0+ZkVyYXNlICAgICAgICAgPSBwcy5mRXJhc2U7CisgICAgbHBzLT5yY1BhaW50LnRvcCAgICA9IHBzLnJjUGFpbnQudG9wOworICAgIGxwcy0+cmNQYWludC5sZWZ0ICAgPSBwcy5yY1BhaW50LmxlZnQ7CisgICAgbHBzLT5yY1BhaW50LnJpZ2h0ICA9IHBzLnJjUGFpbnQucmlnaHQ7CisgICAgbHBzLT5yY1BhaW50LmJvdHRvbSA9IHBzLnJjUGFpbnQuYm90dG9tOworICAgIGxwcy0+ZlJlc3RvcmUgICAgICAgPSBwcy5mUmVzdG9yZTsKKyAgICBscHMtPmZJbmNVcGRhdGUgICAgID0gcHMuZkluY1VwZGF0ZTsKKyAgICByZXR1cm4gbHBzLT5oZGM7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgRW5kUGFpbnQxNiAgICAoVVNFUi40MCkKKyAqLworQk9PTDE2IEVuZFBhaW50MTYoIEhXTkQxNiBod25kLCBjb25zdCBQQUlOVFNUUlVDVDE2KiBscHMgKQogewogICAgIFJlbGVhc2VEQyggaHduZCwgbHBzLT5oZGMgKTsKICAgICBTaG93Q2FyZXQoIGh3bmQgKTsKQEAgLTEzOSwxMyArMTU5LDI0IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgRW5kUGFpbnQzMiAgICAoVVNFUjMyLjE3NSkKKyAqLworQk9PTDMyIEVuZFBhaW50MzIoIEhXTkQzMiBod25kLCBjb25zdCBQQUlOVFNUUlVDVDMyICpscHMgKQoreworICAgIFJlbGVhc2VEQyggaHduZCwgKEhEQzE2KWxwcy0+aGRjICk7CisgICAgU2hvd0NhcmV0KCBod25kICk7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgRmlsbFdpbmRvdyAgICAoVVNFUi4zMjQpCiAgKi8KLXZvaWQgRmlsbFdpbmRvdyggSFdORCBod25kUGFyZW50LCBIV05EIGh3bmQsIEhEQyBoZGMsIEhCUlVTSCBoYnJ1c2ggKQordm9pZCBGaWxsV2luZG93KCBIV05EMTYgaHduZFBhcmVudCwgSFdORDE2IGh3bmQsIEhEQzE2IGhkYywgSEJSVVNIMTYgaGJydXNoICkKIHsKLSAgICBSRUNUIHJlY3Q7Ci0gICAgR2V0Q2xpZW50UmVjdCggaHduZCwgJnJlY3QgKTsKLSAgICBEUHRvTFAoIGhkYywgKExQUE9JTlQpJnJlY3QsIDIgKTsKKyAgICBSRUNUMTYgcmVjdDsKKyAgICBHZXRDbGllbnRSZWN0MTYoIGh3bmQsICZyZWN0ICk7CisgICAgRFB0b0xQMTYoIGhkYywgKExQUE9JTlQxNikmcmVjdCwgMiApOwogICAgIFBhaW50UmVjdCggaHduZFBhcmVudCwgaHduZCwgaGRjLCBoYnJ1c2gsICZyZWN0ICk7CiB9CiAKQEAgLTE1Myw3ICsxODQsOCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgUGFpbnRSZWN0ICAgIChVU0VSLjMyNSkKICAqLwotdm9pZCBQYWludFJlY3QoSFdORCBod25kUGFyZW50LCBIV05EIGh3bmQsIEhEQyBoZGMsIEhCUlVTSCBoYnJ1c2gsIExQUkVDVCByZWN0KQordm9pZCBQYWludFJlY3QoIEhXTkQxNiBod25kUGFyZW50LCBIV05EMTYgaHduZCwgSERDMTYgaGRjLAorICAgICAgICAgICAgICAgIEhCUlVTSDE2IGhicnVzaCwgY29uc3QgUkVDVDE2ICpyZWN0KQogewogICAgICAgLyogU2VuZCBXTV9DVExDT0xPUiBtZXNzYWdlIGlmIG5lZWRlZCAqLwogCkBAIC0xNjksNyArMjAxLDcgQEAKIAkJCQkgICAgICBoZGMsIE1BS0VMT05HKCBod25kLCBoYnJ1c2ggKSApOwogI2VuZGlmCiAgICAgfQotICAgIGlmIChoYnJ1c2gpIEZpbGxSZWN0KCBoZGMsIHJlY3QsIGhicnVzaCApOworICAgIGlmIChoYnJ1c2gpIEZpbGxSZWN0MTYoIGhkYywgcmVjdCwgaGJydXNoICk7CiB9CiAKIApAQCAtMTg5LDEyICsyMjEsMTMgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBSZWRyYXdXaW5kb3cgICAgKFVTRVIuMjkwKQorICogICAgICAgICAgIFJlZHJhd1dpbmRvdzMyICAgIChVU0VSMzIuNDI1KQogICovCi1CT09MIFJlZHJhd1dpbmRvdyggSFdORCBod25kLCBMUFJFQ1QgcmVjdFVwZGF0ZSwgSFJHTiBocmduVXBkYXRlLCBVSU5UIGZsYWdzICkKK0JPT0wzMiBSZWRyYXdXaW5kb3czMiggSFdORDMyIGh3bmQsIGNvbnN0IFJFQ1QzMiAqcmVjdFVwZGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgSFJHTjMyIGhyZ25VcGRhdGUsIFVJTlQzMiBmbGFncyApCiB7CiAgICAgSFJHTiBocmduOwotICAgIFJFQ1QgcmVjdENsaWVudDsKKyAgICBSRUNUMzIgcmVjdENsaWVudDsKICAgICBXTkQgKiB3bmRQdHI7CiAKICAgICBpZiAoIWh3bmQpIGh3bmQgPSBHZXREZXNrdG9wV2luZG93KCk7CkBAIC0yMTMsNyArMjQ2LDcgQEAKICAgICAgICAgZHByaW50Zl93aW4oc3RkZGViLCAiUmVkcmF3V2luZG93OiAlMDR4IE5VTEwgJTA0eCBmbGFncz0lMDR4XG4iLAogICAgICAgICAgICAgICAgICAgICAgaHduZCwgaHJnblVwZGF0ZSwgZmxhZ3MpOwogICAgIH0KLSAgICBHZXRDbGllbnRSZWN0KCBod25kLCAmcmVjdENsaWVudCApOworICAgIEdldENsaWVudFJlY3QzMiggaHduZCwgJnJlY3RDbGllbnQgKTsKIAogICAgIGlmIChmbGFncyAmIFJEV19JTlZBTElEQVRFKSAgLyogSW52YWxpZGF0ZSAqLwogICAgIHsKQEAgLTIyMiw4ICsyNTUsOCBAQAogICAgICAgICBpZiAod25kUHRyLT5ocmduVXBkYXRlID4gMSkgIC8qIElzIHRoZXJlIGFscmVhZHkgYW4gdXBkYXRlIHJlZ2lvbj8gKi8KICAgICAgICAgewogICAgICAgICAgICAgaWYgKChocmduID0gaHJnblVwZGF0ZSkgPT0gMCkKLSAgICAgICAgICAgICAgICBocmduID0gQ3JlYXRlUmVjdFJnbkluZGlyZWN0KCByZWN0VXBkYXRlID8gcmVjdFVwZGF0ZSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlY3RDbGllbnQgKTsKKyAgICAgICAgICAgICAgICBocmduID0gQ3JlYXRlUmVjdFJnbkluZGlyZWN0MzIoIHJlY3RVcGRhdGUgPyByZWN0VXBkYXRlIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWN0Q2xpZW50ICk7CiAgICAgICAgICAgICByZ25Ob3RFbXB0eSA9IENvbWJpbmVSZ24oIHduZFB0ci0+aHJnblVwZGF0ZSwgd25kUHRyLT5ocmduVXBkYXRlLCBocmduLCBSR05fT1IgKTsKICAgICAgICAgICAgIGlmICghaHJnblVwZGF0ZSkgRGVsZXRlT2JqZWN0KCBocmduICk7CiAgICAgICAgIH0KQEAgLTIzNiw3ICsyNjksNyBAQAogICAgICAgICAgICAgICAgIHduZFB0ci0+aHJnblVwZGF0ZSA9IENyZWF0ZVJlY3RSZ24oIDAsIDAsIDAsIDAgKTsKICAgICAgICAgICAgICAgICByZ25Ob3RFbXB0eSA9IENvbWJpbmVSZ24oIHduZFB0ci0+aHJnblVwZGF0ZSwgaHJnblVwZGF0ZSwgMCwgUkdOX0NPUFkgKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2Ugd25kUHRyLT5ocmduVXBkYXRlID0gQ3JlYXRlUmVjdFJnbkluZGlyZWN0KCByZWN0VXBkYXRlID8KKyAgICAgICAgICAgIGVsc2Ugd25kUHRyLT5ocmduVXBkYXRlID0gQ3JlYXRlUmVjdFJnbkluZGlyZWN0MzIoIHJlY3RVcGRhdGUgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3RVcGRhdGUgOiAmcmVjdENsaWVudCApOwogICAgICAgICB9CiAJCkBAIC0yNjksNyArMzAyLDcgQEAKICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZiAoKGhyZ24gPSBocmduVXBkYXRlKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICBocmduID0gQ3JlYXRlUmVjdFJnbkluZGlyZWN0KCByZWN0VXBkYXRlICk7CisgICAgICAgICAgICAgICAgICAgIGhyZ24gPSBDcmVhdGVSZWN0UmduSW5kaXJlY3QzMiggcmVjdFVwZGF0ZSApOwogICAgICAgICAgICAgICAgIGlmIChDb21iaW5lUmduKCB3bmRQdHItPmhyZ25VcGRhdGUsIHduZFB0ci0+aHJnblVwZGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHJnbiwgUkdOX0RJRkYgKSA9PSBOVUxMUkVHSU9OKQogICAgICAgICAgICAgICAgIHsKQEAgLTM0NSwyMyArMzc4LDIzIEBACiAJCUNvbWJpbmVSZ24oIGhyZ24sIGhyZ25VcGRhdGUsIDAsIFJHTl9DT1BZICk7CiAJCU9mZnNldFJnbiggaHJnbiwgLXduZFB0ci0+cmVjdENsaWVudC5sZWZ0LAogCQkJICAgICAgICAgLXduZFB0ci0+cmVjdENsaWVudC50b3AgKTsKLQkJUmVkcmF3V2luZG93KCB3bmRQdHItPmh3bmRTZWxmLCBOVUxMLCBocmduLCBmbGFncyApOworCQlSZWRyYXdXaW5kb3czMiggd25kUHRyLT5od25kU2VsZiwgTlVMTCwgaHJnbiwgZmxhZ3MgKTsKIAkgICAgfQogCSAgICBEZWxldGVPYmplY3QoIGhyZ24gKTsKIAl9CiAJZWxzZQogCXsKLQkgICAgUkVDVCByZWN0OwkJCisJICAgIFJFQ1QzMiByZWN0OwogCSAgICBmb3IgKHduZFB0ciA9IHduZFB0ci0+Y2hpbGQ7IHduZFB0cjsgd25kUHRyID0gd25kUHRyLT5uZXh0KQogCSAgICB7CiAJCWlmIChyZWN0VXBkYXRlKQogCQl7CiAJCSAgICByZWN0ID0gKnJlY3RVcGRhdGU7Ci0JCSAgICBPZmZzZXRSZWN0KCAmcmVjdCwgLXduZFB0ci0+cmVjdENsaWVudC5sZWZ0LAotCQkJICAgICAgICAgICAgICAgLXduZFB0ci0+cmVjdENsaWVudC50b3AgKTsKLQkJICAgIFJlZHJhd1dpbmRvdyggd25kUHRyLT5od25kU2VsZiwgJnJlY3QsIDAsIGZsYWdzICk7CisJCSAgICBPZmZzZXRSZWN0MzIoICZyZWN0LCAtd25kUHRyLT5yZWN0Q2xpZW50LmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC13bmRQdHItPnJlY3RDbGllbnQudG9wICk7CisJCSAgICBSZWRyYXdXaW5kb3czMiggd25kUHRyLT5od25kU2VsZiwgJnJlY3QsIDAsIGZsYWdzICk7CiAJCX0KLQkJZWxzZSBSZWRyYXdXaW5kb3coIHduZFB0ci0+aHduZFNlbGYsIE5VTEwsIDAsIGZsYWdzICk7CisJCWVsc2UgUmVkcmF3V2luZG93MzIoIHduZFB0ci0+aHduZFNlbGYsIE5VTEwsIDAsIGZsYWdzICk7CiAJICAgIH0KIAl9CiAgICAgfQpAQCAtMzcwLDU0ICs0MDMsMTAzIEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgVXBkYXRlV2luZG93ICAgKFVTRVIuMTI0KQorICogICAgICAgICAgIFJlZHJhd1dpbmRvdzE2ICAgIChVU0VSLjI5MCkKICAqLwotdm9pZCBVcGRhdGVXaW5kb3coIEhXTkQgaHduZCApCitCT09MMTYgUmVkcmF3V2luZG93MTYoIEhXTkQxNiBod25kLCBjb25zdCBSRUNUMTYgKnJlY3RVcGRhdGUsCisgICAgICAgICAgICAgICAgICAgICAgIEhSR04xNiBocmduVXBkYXRlLCBVSU5UMTYgZmxhZ3MgKQogewotICAgIFJlZHJhd1dpbmRvdyggaHduZCwgTlVMTCwgMCwgUkRXX1VQREFURU5PVyB8IFJEV19OT0NISUxEUkVOICk7CisgICAgaWYgKHJlY3RVcGRhdGUpCisgICAgeworICAgICAgICBSRUNUMzIgcjsKKyAgICAgICAgQ09OVl9SRUNUMTZUTzMyKCByZWN0VXBkYXRlLCAmciApOworICAgICAgICByZXR1cm4gKEJPT0wxNilSZWRyYXdXaW5kb3czMiggKEhXTkQzMilod25kLCAmciwgaHJnblVwZGF0ZSwgZmxhZ3MgKTsKKyAgICB9CisgICAgcmV0dXJuIChCT09MMTYpUmVkcmF3V2luZG93MzIoIChIV05EMzIpaHduZCwgTlVMTCwgaHJnblVwZGF0ZSwgZmxhZ3MgKTsKIH0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBJbnZhbGlkYXRlUmduICAgKFVTRVIuMTI2KQorICogICAgICAgICAgIFVwZGF0ZVdpbmRvdyAgIChVU0VSLjEyNCkgKFVTRVIzMi41NjYpCiAgKi8KLXZvaWQgSW52YWxpZGF0ZVJnbiggSFdORCBod25kLCBIUkdOIGhyZ24sIEJPT0wgZXJhc2UgKQordm9pZCBVcGRhdGVXaW5kb3coIEhXTkQzMiBod25kICkKIHsKLSAgICBSZWRyYXdXaW5kb3coIGh3bmQsIE5VTEwsIGhyZ24sIFJEV19JTlZBTElEQVRFIHwgKGVyYXNlID8gUkRXX0VSQVNFIDogMCkgKTsKKyAgICBSZWRyYXdXaW5kb3czMiggaHduZCwgTlVMTCwgMCwgUkRXX1VQREFURU5PVyB8IFJEV19OT0NISUxEUkVOICk7CiB9CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgSW52YWxpZGF0ZVJlY3QgICAoVVNFUi4xMjUpCisgKiAgICAgICAgICAgSW52YWxpZGF0ZVJnbiAgIChVU0VSLjEyNikgKFVTRVIzMi4zMjgpCiAgKi8KLXZvaWQgSW52YWxpZGF0ZVJlY3QoIEhXTkQgaHduZCwgTFBSRUNUIHJlY3QsIEJPT0wgZXJhc2UgKQordm9pZCBJbnZhbGlkYXRlUmduKCBIV05EMzIgaHduZCwgSFJHTjMyIGhyZ24sIEJPT0wzMiBlcmFzZSApCiB7Ci0gICAgUmVkcmF3V2luZG93KCBod25kLCByZWN0LCAwLCBSRFdfSU5WQUxJREFURSB8IChlcmFzZSA/IFJEV19FUkFTRSA6IDApICk7CisgICAgUmVkcmF3V2luZG93MzIoaHduZCwgTlVMTCwgaHJnbiwgUkRXX0lOVkFMSURBVEUgfCAoZXJhc2UgPyBSRFdfRVJBU0UgOiAwKSk7CiB9CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgVmFsaWRhdGVSZ24gICAoVVNFUi4xMjgpCisgKiAgICAgICAgICAgSW52YWxpZGF0ZVJlY3QxNiAgIChVU0VSLjEyNSkKICAqLwotdm9pZCBWYWxpZGF0ZVJnbiggSFdORCBod25kLCBIUkdOIGhyZ24gKQordm9pZCBJbnZhbGlkYXRlUmVjdDE2KCBIV05EMTYgaHduZCwgY29uc3QgUkVDVDE2ICpyZWN0LCBCT09MMTYgZXJhc2UgKQogewotICAgIFJlZHJhd1dpbmRvdyggaHduZCwgTlVMTCwgaHJnbiwgUkRXX1ZBTElEQVRFIHwgUkRXX05PQ0hJTERSRU4gKTsKKyAgICBSZWRyYXdXaW5kb3cxNiggaHduZCwgcmVjdCwgMCwgUkRXX0lOVkFMSURBVEUgfCAoZXJhc2UgPyBSRFdfRVJBU0UgOiAwKSApOwogfQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFZhbGlkYXRlUmVjdCAgIChVU0VSLjEyNykKKyAqICAgICAgICAgICBJbnZhbGlkYXRlUmVjdDMyICAgKFVTRVIzMi4zMjcpCiAgKi8KLXZvaWQgVmFsaWRhdGVSZWN0KCBIV05EIGh3bmQsIExQUkVDVCByZWN0ICkKK3ZvaWQgSW52YWxpZGF0ZVJlY3QzMiggSFdORDMyIGh3bmQsIGNvbnN0IFJFQ1QzMiAqcmVjdCwgQk9PTDMyIGVyYXNlICkKIHsKLSAgICBSZWRyYXdXaW5kb3coIGh3bmQsIHJlY3QsIDAsIFJEV19WQUxJREFURSB8IFJEV19OT0NISUxEUkVOICk7CisgICAgUmVkcmF3V2luZG93MzIoIGh3bmQsIHJlY3QsIDAsIFJEV19JTlZBTElEQVRFIHwgKGVyYXNlID8gUkRXX0VSQVNFIDogMCkgKTsKIH0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBHZXRVcGRhdGVSZWN0ICAgKFVTRVIuMTkwKQorICogICAgICAgICAgIFZhbGlkYXRlUmduICAgKFVTRVIuMTI4KSAoVVNFUjMyLjU3MSkKICAqLwotQk9PTCBHZXRVcGRhdGVSZWN0KCBIV05EIGh3bmQsIExQUkVDVCByZWN0LCBCT09MIGVyYXNlICkKK3ZvaWQgVmFsaWRhdGVSZ24oIEhXTkQzMiBod25kLCBIUkdOMzIgaHJnbiApCit7CisgICAgUmVkcmF3V2luZG93MzIoIGh3bmQsIE5VTEwsIGhyZ24sIFJEV19WQUxJREFURSB8IFJEV19OT0NISUxEUkVOICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgVmFsaWRhdGVSZWN0MTYgICAoVVNFUi4xMjcpCisgKi8KK3ZvaWQgVmFsaWRhdGVSZWN0MTYoIEhXTkQxNiBod25kLCBjb25zdCBSRUNUMTYgKnJlY3QgKQoreworICAgIFJlZHJhd1dpbmRvdzE2KCBod25kLCByZWN0LCAwLCBSRFdfVkFMSURBVEUgfCBSRFdfTk9DSElMRFJFTiApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFZhbGlkYXRlUmVjdDMyICAgKFVTRVIzMi41NzApCisgKi8KK3ZvaWQgVmFsaWRhdGVSZWN0MzIoIEhXTkQzMiBod25kLCBjb25zdCBSRUNUMzIgKnJlY3QgKQoreworICAgIFJlZHJhd1dpbmRvdzMyKCBod25kLCByZWN0LCAwLCBSRFdfVkFMSURBVEUgfCBSRFdfTk9DSElMRFJFTiApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdldFVwZGF0ZVJlY3QxNiAgIChVU0VSLjE5MCkKKyAqLworQk9PTDE2IEdldFVwZGF0ZVJlY3QxNiggSFdORDE2IGh3bmQsIExQUkVDVDE2IHJlY3QsIEJPT0wxNiBlcmFzZSApCit7CisgICAgUkVDVDMyIHI7CisgICAgQk9PTDE2IHJldDsKKworICAgIGlmICghcmVjdCkgcmV0dXJuIEdldFVwZGF0ZVJlY3QzMiggaHduZCwgTlVMTCwgZXJhc2UgKTsKKyAgICByZXQgPSBHZXRVcGRhdGVSZWN0MzIoIGh3bmQsICZyLCBlcmFzZSApOworICAgIENPTlZfUkVDVDMyVE8xNiggJnIsIHJlY3QgKTsKKyAgICByZXR1cm4gcmV0OworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdldFVwZGF0ZVJlY3QzMiAgIChVU0VSMzIuMjk2KQorICovCitCT09MMzIgR2V0VXBkYXRlUmVjdDMyKCBIV05EMzIgaHduZCwgTFBSRUNUMzIgcmVjdCwgQk9PTDMyIGVyYXNlICkKIHsKICAgICBXTkQgKiB3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApOwogICAgIGlmICghd25kUHRyKSByZXR1cm4gRkFMU0U7CkBAIC00MjgsMjEgKzUxMCwyMSBAQAogCXsKIAkgICAgSFJHTiBocmduID0gQ3JlYXRlUmVjdFJnbiggMCwgMCwgMCwgMCApOwogCSAgICBpZiAoR2V0VXBkYXRlUmduKCBod25kLCBocmduLCBlcmFzZSApID09IEVSUk9SKSByZXR1cm4gRkFMU0U7Ci0JICAgIEdldFJnbkJveCggaHJnbiwgcmVjdCApOworCSAgICBHZXRSZ25Cb3gzMiggaHJnbiwgcmVjdCApOwogCSAgICBEZWxldGVPYmplY3QoIGhyZ24gKTsKIAl9Ci0JZWxzZSBTZXRSZWN0RW1wdHkoIHJlY3QgKTsKKwllbHNlIFNldFJlY3RFbXB0eTMyKCByZWN0ICk7CiAgICAgfQogICAgIHJldHVybiAod25kUHRyLT5ocmduVXBkYXRlID4gMSk7CiB9CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2V0VXBkYXRlUmduICAgKFVTRVIuMjM3KQorICogICAgICAgICAgIEdldFVwZGF0ZVJnbiAgIChVU0VSLjIzNykgKFVTRVIzMi4yOTcpCiAgKi8KLWludCBHZXRVcGRhdGVSZ24oIEhXTkQgaHduZCwgSFJHTiBocmduLCBCT09MIGVyYXNlICkKK0lOVDE2IEdldFVwZGF0ZVJnbiggSFdORDMyIGh3bmQsIEhSR04zMiBocmduLCBCT09MMzIgZXJhc2UgKQogewotICAgIGludCByZXR2YWw7CisgICAgSU5UMTYgcmV0dmFsOwogICAgIFdORCAqIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICk7CiAgICAgaWYgKCF3bmRQdHIpIHJldHVybiBFUlJPUjsKIApAQCAtNDUyLDE3ICs1MzQsMTcgQEAKICAgICAgICAgcmV0dXJuIE5VTExSRUdJT047CiAgICAgfQogICAgIHJldHZhbCA9IENvbWJpbmVSZ24oIGhyZ24sIHduZFB0ci0+aHJnblVwZGF0ZSwgMCwgUkdOX0NPUFkgKTsKLSAgICBpZiAoZXJhc2UpIFJlZHJhd1dpbmRvdyggaHduZCwgTlVMTCwgMCwgUkRXX0VSQVNFTk9XIHwgUkRXX05PQ0hJTERSRU4gKTsKKyAgICBpZiAoZXJhc2UpIFJlZHJhd1dpbmRvdzMyKCBod25kLCBOVUxMLCAwLCBSRFdfRVJBU0VOT1cgfCBSRFdfTk9DSElMRFJFTiApOwogICAgIHJldHVybiByZXR2YWw7CiB9CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgRXhjbHVkZVVwZGF0ZVJnbiAgIChVU0VSLjIzOCkKKyAqICAgICAgICAgICBFeGNsdWRlVXBkYXRlUmduICAgKFVTRVIuMjM4KSAoVVNFUjMyLjE5NCkKICAqLwotaW50IEV4Y2x1ZGVVcGRhdGVSZ24oIEhEQyBoZGMsIEhXTkQgaHduZCApCitJTlQxNiBFeGNsdWRlVXBkYXRlUmduKCBIREMzMiBoZGMsIEhXTkQzMiBod25kICkKIHsKLSAgICBpbnQgcmV0dmFsID0gRVJST1I7CisgICAgSU5UMTYgcmV0dmFsID0gRVJST1I7CiAgICAgSFJHTiBocmduOwogICAgIFdORCAqIHduZFB0cjsKIApkaWZmIC0tZ2l0IGEvd2luZG93cy9xdWV1ZS5jIGIvd2luZG93cy9xdWV1ZS5jCmluZGV4IGM4NzRmMzkuLjU5MzViYWMgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvcXVldWUuYworKysgYi93aW5kb3dzL3F1ZXVlLmMKQEAgLTE1LDggKzE1LDIwIEBACiAKIHN0YXRpYyBIUVVFVUUgaEZpcnN0UXVldWUgPSAwOwogc3RhdGljIEhRVUVVRSBobWVtU3lzTXNnUXVldWUgPSAwOworc3RhdGljIEhRVUVVRSBoRG9vbWVkUXVldWUgPSAwOwogc3RhdGljIE1FU1NBR0VRVUVVRSAqc3lzTXNnUXVldWUgPSBOVUxMOwogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCSAgICAgUVVFVUVfR2V0RG9vbWVkUXVldWUvUVVFVUVfU2V0RG9vbWVkUXVldWUKKyAqLworSFFVRVVFIFFVRVVFX0dldERvb21lZFF1ZXVlKCkKK3sKKyAgcmV0dXJuIGhEb29tZWRRdWV1ZTsKK30KK3ZvaWQgUVVFVUVfU2V0RG9vbWVkUXVldWUoSFFVRVVFIGhRdWV1ZSkKK3sKKyAgaERvb21lZFF1ZXVlID0gaFF1ZXVlOworfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCSAgICAgUVVFVUVfRHVtcFF1ZXVlCkBAIC0yMDIsNyArMjE0LDcgQEAKIHsKICAgICBpbnQgaSwgcG9zID0gbXNnUXVldWUtPm5leHRNZXNzYWdlOwogCi0gICAgZHByaW50Zl9tc2coc3RkZGViLCJNU0dfRmluZE1zZzogaHduZD0lMDR4XG5cbiIsIGh3bmQgKTsKKyAgICBkcHJpbnRmX21zZyhzdGRkZWIsIlFVRVVFX0ZpbmRNc2c6IGh3bmQ9JTA0eCBwb3M9JWRcbiIsIGh3bmQsIHBvcyApOwogCiAgICAgaWYgKCFtc2dRdWV1ZS0+bXNnQ291bnQpIHJldHVybiAtMTsKICAgICBpZiAoIWh3bmQgJiYgIWZpcnN0ICYmICFsYXN0KSByZXR1cm4gcG9zOwpkaWZmIC0tZ2l0IGEvd2luZG93cy9zY3JvbGwuYyBiL3dpbmRvd3Mvc2Nyb2xsLmMKaW5kZXggNDI1OWRiZi4uNTU2OTA5MyAxMDA2NDQKLS0tIGEvd2luZG93cy9zY3JvbGwuYworKysgYi93aW5kb3dzL3Njcm9sbC5jCkBAIC00MywxMyArNDMsMTMgQEAKICBpZiggIXduZFNjcm9sbCB8fCAoICFkeCAmJiAhZHkpICkgcmV0dXJuIDA7CiAKICBpZiggZGN4ICYgRENYX1dJTkRPVyApCi0JIGhSZ25XbmQgICA9IENyZWF0ZVJlY3RSZ25JbmRpcmVjdCgmd25kU2Nyb2xsLT5yZWN0V2luZG93KTsKKwkgaFJnblduZCAgID0gQ3JlYXRlUmVjdFJnbkluZGlyZWN0MTYoJnduZFNjcm9sbC0+cmVjdFdpbmRvdyk7CiAgZWxzZQogCXsKLQkgUkVDVCByZWN0OworCSBSRUNUMzIgcmVjdDsKIAotCSBHZXRDbGllbnRSZWN0KGhTY3JvbGwsJnJlY3QpOwotIAkgaFJnblduZCAgID0gQ3JlYXRlUmVjdFJnbkluZGlyZWN0KCZyZWN0KTsKKwkgR2V0Q2xpZW50UmVjdDMyKGhTY3JvbGwsJnJlY3QpOworIAkgaFJnblduZCAgID0gQ3JlYXRlUmVjdFJnbkluZGlyZWN0MzIoJnJlY3QpOwogCX0KIAogIGhVcGRhdGVSZ24gID0gRENFX0dldFZpc1JnbiggaFNjcm9sbCwgZGN4ICk7CkBAIC0xMDEsNyArMTAxLDcgQEAKICAgfSAKIAogIC8qIGludmFsaWRhdGUgdW5jb3ZlcmVkIHJlZ2lvbiBhbmQgcGFpbnQgZnJhbWVzICovCi0gYiA9IFJlZHJhd1dpbmRvdyggaFNjcm9sbCwgTlVMTCwgaFVwZGF0ZVJnbiwgUkRXX0lOVkFMSURBVEUgfCBSRFdfRlJBTUUgfCBSRFdfRVJBU0UgfAorIGIgPSBSZWRyYXdXaW5kb3czMiggaFNjcm9sbCwgTlVMTCwgaFVwZGF0ZVJnbiwgUkRXX0lOVkFMSURBVEUgfCBSRFdfRlJBTUUgfCBSRFdfRVJBU0UgfAogCQkJCSAgICAgICAgICAgICAgUkRXX0VSQVNFTk9XIHwgUkRXX0FMTENISUxEUkVOICk7IAogCiAgRGVsZXRlT2JqZWN0KCBoVXBkYXRlUmduKTsKQEAgLTExNSwxMSArMTE1LDExIEBACiAgKiBGSVhNRTogYSBiaXQgYnJva2VuCiAgKi8KIAotdm9pZCBTY3JvbGxXaW5kb3coSFdORCBod25kLCBzaG9ydCBkeCwgc2hvcnQgZHksIExQUkVDVCByZWN0LCBMUFJFQ1QgY2xpcFJlY3QpCit2b2lkIFNjcm9sbFdpbmRvdyhIV05EIGh3bmQsIHNob3J0IGR4LCBzaG9ydCBkeSwgTFBSRUNUMTYgcmVjdCwgTFBSRUNUMTYgY2xpcFJlY3QpCiB7CiAgICAgSERDICBoZGM7CiAgICAgSFJHTiBocmduVXBkYXRlLGhyZ25DbGlwOwotICAgIFJFQ1QgcmMsIGNsaXByYzsKKyAgICBSRUNUMTYgcmMsIGNsaXByYzsKICAgICBIV05EIGhDYXJldFduZCA9IENBUkVUX0dldEh3bmQoKTsKIAogICAgIGRwcmludGZfc2Nyb2xsKHN0ZGRlYiwiU2Nyb2xsV2luZG93OiBkeD0lZCwgZHk9JWQsIGxwUmVjdCA9JTA4bHggY2xpcFJlY3Q9JWksJWksJWksJWlcbiIsIApAQCAtMTMxLDggKzEzMSw4IEBACiAgICAgLyogaWYgcmVjdCBpcyBOVUxMIGNoaWxkcmVuIGhhdmUgdG8gYmUgbW92ZWQgKi8KICAgICBpZiAoICFyZWN0ICkKICAgICAgICB7Ci0JR2V0Q2xpZW50UmVjdChod25kLCAmcmMpOwotCSAgaHJnbkNsaXAgPSBDcmVhdGVSZWN0UmduSW5kaXJlY3QoICZyYyApOworCUdldENsaWVudFJlY3QxNihod25kLCAmcmMpOworCSAgaHJnbkNsaXAgPSBDcmVhdGVSZWN0UmduSW5kaXJlY3QxNiggJnJjICk7CiAKICAgICAgICAgICBpZiAoKGhDYXJldFduZCA9PSBod25kKSB8fCBJc0NoaWxkKGh3bmQsaENhcmV0V25kKSkKICAgICAgICAgICAgICAgSGlkZUNhcmV0KGhDYXJldFduZCk7CkBAIC0xNDQsNyArMTQ0LDcgQEAKICAgICAgICB9CiAgICAgZWxzZQogICAgICAgIHsKLQkgIEdldENsaWVudFJlY3QoaHduZCwmcmMpOworCSAgR2V0Q2xpZW50UmVjdDE2KGh3bmQsJnJjKTsKIAkgIGRwcmludGZfc2Nyb2xsKHN0ZGRlYiwiXHRyZWN0PSVpICVpICVpICVpIGNsaWVudD0laSAlaSAlaSAlaVxuIiwKIAkJCSAoaW50KXJlY3QtPmxlZnQsKGludClyZWN0LT50b3AsKGludClyZWN0LT5yaWdodCwKIAkJCSAoaW50KXJlY3QtPmJvdHRvbSwoaW50KXJjLmxlZnQsKGludClyYy50b3AsCkBAIC0xNTIsMTQgKzE1MiwxNCBAQAogCiAgICAgICAgICAgaWYgKGhDYXJldFduZCA9PSBod25kKSBIaWRlQ2FyZXQoaENhcmV0V25kKTsKICAgICAgICAgICBlbHNlIGhDYXJldFduZCA9IDA7Ci0gICAgICAgICAgQ29weVJlY3QoJnJjLCByZWN0KTsKKyAgICAgICAgICBDb3B5UmVjdDE2KCZyYywgcmVjdCk7CiAJICBoZGMgPSBHZXREQyhod25kKTsKICAgICAgICB9CiAKICAgICBpZiAoY2xpcFJlY3QgPT0gTlVMTCkKLQlHZXRDbGllbnRSZWN0KGh3bmQsICZjbGlwcmMpOworCUdldENsaWVudFJlY3QxNihod25kLCAmY2xpcHJjKTsKICAgICBlbHNlCi0JQ29weVJlY3QoJmNsaXByYywgY2xpcFJlY3QpOworCUNvcHlSZWN0MTYoJmNsaXByYywgY2xpcFJlY3QpOwogCiAgICAgaHJnblVwZGF0ZSA9IENyZWF0ZVJlY3RSZ24oMCwgMCwgMCwgMCk7CiAgICAgU2Nyb2xsREMoaGRjLCBkeCwgZHksICZyYywgJmNsaXByYywgaHJnblVwZGF0ZSwgTlVMTCk7CkBAIC0xODEsNyArMTgxLDcgQEAKICAgICAgICAgICAgIERlbGV0ZU9iamVjdChocmduSW52KTsKICAgICAgICAgfQogCi0gICAgICAgIFJlZHJhd1dpbmRvdyggaHduZCwgTlVMTCwgaHJnblVwZGF0ZSwgUkRXX0lOVkFMSURBVEUgfCBSRFdfRVJBU0UgfCBSRFdfRVJBU0VOT1cpOworICAgICAgICBSZWRyYXdXaW5kb3czMiggaHduZCwgTlVMTCwgaHJnblVwZGF0ZSwgUkRXX0lOVkFMSURBVEUgfCBSRFdfRVJBU0UgfCBSRFdfRVJBU0VOT1cpOwogICAgICAgfQogCiAgICAgRGVsZXRlT2JqZWN0KGhyZ25VcGRhdGUpOwpAQCAtMTk1LDI0ICsxOTUsMzAgQEAKICAqIEZJWE1FOiBoYWxmLWJyb2tlbgogICovCiAKLUJPT0wgU2Nyb2xsREMoSERDIGhkYywgc2hvcnQgZHgsIHNob3J0IGR5LCBMUFJFQ1QgcmMsIExQUkVDVCBjbGlwcmMsCi0JICAgICAgSFJHTiBocmduVXBkYXRlLCBMUFJFQ1QgcmNVcGRhdGUpCitCT09MIFNjcm9sbERDKEhEQyBoZGMsIHNob3J0IGR4LCBzaG9ydCBkeSwgTFBSRUNUMTYgcmMsIExQUkVDVDE2IGNsaXByYywKKwkgICAgICBIUkdOIGhyZ25VcGRhdGUsIExQUkVDVDE2IHJjVXBkYXRlKQogewotICAgIEhSR04gaHJnbkNsaXAsIGhyZ24xLCBocmduMjsKLSAgICBQT0lOVCBzcmMsIGRlc3Q7CisgICAgSFJHTiBocmduQ2xpcDsKKyAgICBQT0lOVDE2IHNyYywgZGVzdDsKICAgICBzaG9ydCB3aWR0aCwgaGVpZ2h0OwogICAgIERDICpkYyA9IChEQyAqKUdESV9HZXRPYmpQdHIoaGRjLCBEQ19NQUdJQyk7CiAKLSAgICBkcHJpbnRmX3Njcm9sbChzdGRkZWIsIlNjcm9sbERDOiBkeD0lZCBkeT0lZCwgaHJnblVwZGF0ZT0lMDR4IHJjPSVkICVkICVkICVkXG4iLAotICAgICAgICAgICAgICAgICAgIGR4LGR5LGhyZ25VcGRhdGUsKChyYyk/cmMtPmxlZnQ6MCksICgocmMpP3JjLT50b3A6MCksCi0gICAgICAgICAgICAgICAgICAgKChyYyk/cmMtPnJpZ2h0OjApLCAoKHJjKT9yYy0+Ym90dG9tOjApKTsgCisgICAgZHByaW50Zl9zY3JvbGwoc3RkZGViLCJTY3JvbGxEQzogZHg9JWQgZHk9JWQsIGhyZ25VcGRhdGU9JTA0eCByY1VwZGF0ZSA9ICVwIGNsaXByYyA9ICVwLCByYz0lZCAlZCAlZCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBkeCwgZHksIGhyZ25VcGRhdGUsIHJjVXBkYXRlLCBjbGlwcmMsIHJjID8gcmMtPmxlZnQgOiAwLAorICAgICAgICAgICAgICAgICAgIHJjID8gcmMtPnRvcCA6IDAsIHJjID8gcmMtPnJpZ2h0IDogMCwgcmMgPyByYy0+Ym90dG9tIDogMCApOwogCiAgICAgaWYgKHJjID09IE5VTEwpCiAJcmV0dXJuIEZBTFNFOwogCisgICAgaWYgKCFkYykgCisgICAgeyAKKyAgICAgICAgZnByaW50ZihzdGRuaW1wLCJTY3JvbGxEQzogSW52YWxpZCBIRENcbiIpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCiAgICAgaWYgKGNsaXByYykKICAgICB7Ci0JaHJnbkNsaXAgPSBDcmVhdGVSZWN0UmduSW5kaXJlY3QoY2xpcHJjKTsKKwlocmduQ2xpcCA9IENyZWF0ZVJlY3RSZ25JbmRpcmVjdDE2KGNsaXByYyk7CiAJU2VsZWN0Q2xpcFJnbihoZGMsIGhyZ25DbGlwKTsKICAgICB9CiAKQEAgLTI0Niw2ICsyNTIsOCBAQAogCiAgICAgaWYgKGhyZ25VcGRhdGUpCiAgICAgeworCUhSR04gaHJnbjEsaHJnbjI7CisKIAlpZiAoZHggPiAwKQogCSAgICBocmduMSA9IENyZWF0ZVJlY3RSZ24ocmMtPmxlZnQsIHJjLT50b3AsIHJjLT5sZWZ0K2R4LCByYy0+Ym90dG9tKTsKIAllbHNlIGlmIChkeCA8IDApCkBAIC0yNjUsOSArMjczLDI0IEBACiAJUmduVHlwZSA9IENvbWJpbmVSZ24oaHJnblVwZGF0ZSwgaHJnbjEsIGhyZ24yLCBSR05fT1IpOwogCURlbGV0ZU9iamVjdChocmduMSk7CiAJRGVsZXRlT2JqZWN0KGhyZ24yKTsKKyAgICAgICAgaWYgKHJjVXBkYXRlKSBHZXRSZ25Cb3gxNiggaHJnblVwZGF0ZSwgcmNVcGRhdGUgKTsKKyAgICB9CisgICAgZWxzZSBpZiAocmNVcGRhdGUpCisgICAgeworCVJFQ1QxNiByeCxyeTsKKworCXJ4ID0gcnkgPSAqcmM7CisJaWYoIGR4ID4gMCApICAJICByeC5yaWdodCA9IHJjLT5sZWZ0K2R4OyAKKwllbHNlIGlmIChkeCA8IDApICByeC5sZWZ0ID0gcmMtPnJpZ2h0K2R4OyAKKwllbHNlIFNldFJlY3RFbXB0eTE2KCAmcnggKTsKKworICAgICAgICBpZiggZHkgPiAwICkgICAgICByeS5ib3R0b20gPSByYy0+dG9wK2R5OworICAgICAgICBlbHNlIGlmIChkeSA8IDApICByeS50b3AgPSByYy0+Ym90dG9tK2R5OworICAgICAgICBlbHNlIFNldFJlY3RFbXB0eTE2KCAmcnkgKTsKKworCVVuaW9uUmVjdDE2KCByY1VwZGF0ZSwgJnJ4LCAmcnkgKTsKICAgICB9CiAKLSAgICBpZiAocmNVcGRhdGUpIEdldFJnbkJveCggaHJnblVwZGF0ZSwgcmNVcGRhdGUgKTsKICAgICByZXR1cm4gVFJVRTsKIH0KIApAQCAtMjgwLDMxICszMDMsMzEgQEAKICAqIFNDUk9MTF9UcmFjZUNoaWxkcmVuIGNhbiBoZWxwCiAgKi8KIAotaW50IFNjcm9sbFdpbmRvd0V4KEhXTkQgaHduZCwgc2hvcnQgZHgsIHNob3J0IGR5LCBMUFJFQ1QgcmVjdCwgTFBSRUNUIGNsaXBSZWN0LAotCQkgICBIUkdOIGhyZ25VcGRhdGUsIExQUkVDVCByY1VwZGF0ZSwgV09SRCBmbGFncykKK2ludCBTY3JvbGxXaW5kb3dFeChIV05EIGh3bmQsIHNob3J0IGR4LCBzaG9ydCBkeSwgTFBSRUNUMTYgcmVjdCwgTFBSRUNUMTYgY2xpcFJlY3QsCisJCSAgIEhSR04gaHJnblVwZGF0ZSwgTFBSRUNUMTYgcmNVcGRhdGUsIFdPUkQgZmxhZ3MpCiB7CiAgICAgSERDIGhkYzsKLSAgICBSRUNUIHJjLCBjbGlwcmM7CisgICAgUkVDVDE2IHJjLCBjbGlwcmM7CiAKICAgICBkcHJpbnRmX3Njcm9sbChzdGRkZWIsIlNjcm9sbFdpbmRvd0V4OiBkeD0lZCwgZHk9JWQsIHdGbGFncz0lMDR4XG4iLGR4LCBkeSwgZmxhZ3MpOwogCiAgICAgaGRjID0gR2V0REMoaHduZCk7CiAKICAgICBpZiAocmVjdCA9PSBOVUxMKQotCUdldENsaWVudFJlY3QoaHduZCwgJnJjKTsKKwlHZXRDbGllbnRSZWN0MTYoaHduZCwgJnJjKTsKICAgICBlbHNlCi0JQ29weVJlY3QoJnJjLCByZWN0KTsKKwlDb3B5UmVjdDE2KCZyYywgcmVjdCk7CiAgICAgaWYgKGNsaXBSZWN0ID09IE5VTEwpCi0JR2V0Q2xpZW50UmVjdChod25kLCAmY2xpcHJjKTsKKwlHZXRDbGllbnRSZWN0MTYoaHduZCwgJmNsaXByYyk7CiAgICAgZWxzZQotCUNvcHlSZWN0KCZjbGlwcmMsIGNsaXBSZWN0KTsKKwlDb3B5UmVjdDE2KCZjbGlwcmMsIGNsaXBSZWN0KTsKIAogICAgIFNjcm9sbERDKGhkYywgZHgsIGR5LCAmcmMsICZjbGlwcmMsIGhyZ25VcGRhdGUsIHJjVXBkYXRlKTsKIAogICAgIGlmIChmbGFncyB8IFNXX0lOVkFMSURBVEUpCiAgICAgewotCVJlZHJhd1dpbmRvdyggaHduZCwgTlVMTCwgaHJnblVwZGF0ZSwgUkRXX0lOVkFMSURBVEUgfCBSRFdfRVJBU0UgfAotICAgICAgICAgICAgICAgICAgICAgICgoZmxhZ3MgJiBTV19FUkFTRSkgPyBSRFdfRVJBU0VOT1cgOiAwKSk7CisJUmVkcmF3V2luZG93MzIoIGh3bmQsIE5VTEwsIGhyZ25VcGRhdGUsIFJEV19JTlZBTElEQVRFIHwgUkRXX0VSQVNFIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICgoZmxhZ3MgJiBTV19FUkFTRSkgPyBSRFdfRVJBU0VOT1cgOiAwKSk7CiAgICAgfQogCiAgICAgUmVsZWFzZURDKGh3bmQsIGhkYyk7CmRpZmYgLS1naXQgYS93aW5kb3dzL3dpbi5jIGIvd2luZG93cy93aW4uYwppbmRleCBlOWZiYWEwLi41ZGZiMTA1IDEwMDY0NAotLS0gYS93aW5kb3dzL3dpbi5jCisrKyBiL3dpbmRvd3Mvd2luLmMKQEAgLTEwLDEzICsxMCwxNyBAQAogI2luY2x1ZGUgIm9wdGlvbnMuaCIKICNpbmNsdWRlICJjbGFzcy5oIgogI2luY2x1ZGUgIndpbi5oIgorI2luY2x1ZGUgImhlYXAuaCIKICNpbmNsdWRlICJ1c2VyLmgiCiAjaW5jbHVkZSAiZGNlLmgiCiAjaW5jbHVkZSAic3lzbWV0cmljcy5oIgogI2luY2x1ZGUgImN1cnNvcmljb24uaCIKICNpbmNsdWRlICJldmVudC5oIgorI2luY2x1ZGUgImhlYXAuaCIKKyNpbmNsdWRlICJob29rLmgiCiAjaW5jbHVkZSAibWVudS5oIgogI2luY2x1ZGUgIm5vbmNsaWVudC5oIgorI2luY2x1ZGUgInN0cmluZzMyLmgiCiAjaW5jbHVkZSAicXVldWUuaCIKICNpbmNsdWRlICJ3aW5wb3MuaCIKICNpbmNsdWRlICJjb2xvci5oIgpAQCAtMzcsNiArNDEsNyBAQAogc3RhdGljIFdPUkQgd0RyYWdIZWlnaHQ9IDM7CiAKIGV4dGVybiBIQ1VSU09SIENVUlNPUklDT05fSWNvblRvQ3Vyc29yKEhJQ09OKTsKK2V4dGVybiBIUVVFVUUgIFFVRVVFX0dldERvb21lZFF1ZXVlKCk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFdJTl9GaW5kV25kUHRyCkBAIC03Nyw3ICs4Miw3IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBpZiAoIUdldENsYXNzTmFtZSggaHduZCwgY2xhc3NOYW1lLCBzaXplb2YoY2xhc3NOYW1lICkgKSkKKyAgICBpZiAoIUdldENsYXNzTmFtZTMyQSggaHduZCwgY2xhc3NOYW1lLCBzaXplb2YoY2xhc3NOYW1lICkgKSkKICAgICAgICAgc3RyY3B5KCBjbGFzc05hbWUsICIjTlVMTCMiICk7CiAKICAgICBmcHJpbnRmKCBzdGRlcnIsICJXaW5kb3cgJTA0eCAoJXApOlxuIiwgaHduZCwgcHRyICk7CkBAIC0xMzQsNyArMTM5LDcgQEAKICAgICB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJSpzJTA0eCUqcyIsIGluZGVudCwgIiIsIHB0ci0+aHduZFNlbGYsIDEzLWluZGVudCwiIik7CiAKLSAgICAgICAgR2xvYmFsR2V0QXRvbU5hbWUoIHB0ci0+Y2xhc3MtPmF0b21OYW1lLCBjbGFzc05hbWUsIHNpemVvZihjbGFzc05hbWUpKTsKKyAgICAgICAgR2xvYmFsR2V0QXRvbU5hbWUxNihwdHItPmNsYXNzLT5hdG9tTmFtZSxjbGFzc05hbWUsc2l6ZW9mKGNsYXNzTmFtZSkpOwogICAgICAgICAKICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiJTA4bHggJS02LjR4ICUtMTcuMTdzICUwOHggJTA0eDolMDR4XG4iLAogICAgICAgICAgICAgICAgICAoRFdPUkQpcHRyLCBwdHItPmhtZW1UYXNrUSwgY2xhc3NOYW1lLApAQCAtMjYyLDE0ICsyNjcsMTQgQEAKICAqLwogdm9pZCBXSU5fU2VuZFBhcmVudE5vdGlmeSggSFdORCBod25kLCBXT1JEIGV2ZW50LCBXT1JEIGlkQ2hpbGQsIExPTkcgbFZhbHVlICkKIHsKLSAgICBMUFBPSU5UICBscHB0ID0gKExQUE9JTlQpKHZvaWQqKSgmbFZhbHVlKTsKKyAgICBMUFBPSU5UMTYgbHBwdCA9IChMUFBPSU5UMTYpJmxWYWx1ZTsKICAgICBXTkQgICAgICp3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApOwogICAgIEJPT0wgICAgIGJNb3VzZSA9ICgoZXZlbnQgPD0gV01fTU9VU0VMQVNUKSAmJiAoZXZlbnQgPj0gV01fTU9VU0VGSVJTVCkpOwogCiAgICAgLyogaWYgbFZhbHVlIGNvbnRhaW5zIGN1cnNvciBjb29yZGluYXRlcyB0aGV5IGhhdmUgdG8gYmUKICAgICAgKiBtYXBwZWQgdG8gdGhlIGNsaWVudCBhcmVhIG9mIHBhcmVudCB3aW5kb3cgKi8KIAotICAgIGlmIChiTW91c2UpIE1hcFdpbmRvd1BvaW50cygwLCBod25kLCBscHB0LCAxKTsKKyAgICBpZiAoYk1vdXNlKSBNYXBXaW5kb3dQb2ludHMxNigwLCBod25kLCBscHB0LCAxKTsKICNpZm5kZWYgV0lORUxJQjMyCiAgICAgZWxzZSBsVmFsdWUgPSBNQUtFTE9ORyggTE9XT1JEKGxWYWx1ZSksIGlkQ2hpbGQgKTsKICNlbmRpZgpAQCAtMzU5LDcgKzM2NCw3IEBACiAgICAgSERDIGhkYzsKICAgICBIV05EIGh3bmREZXNrdG9wOwogCi0gICAgaWYgKCEoY2xhc3MgPSBDTEFTU19GaW5kQ2xhc3NCeU5hbWUoIERFU0tUT1BfQ0xBU1NfQVRPTSwgMCApKSkKKyAgICBpZiAoIShjbGFzcyA9IENMQVNTX0ZpbmRDbGFzc0J5QXRvbSggREVTS1RPUF9DTEFTU19BVE9NLCAwICkpKQogCXJldHVybiBGQUxTRTsKIAogICAgIGh3bmREZXNrdG9wID0gVVNFUl9IRUFQX0FMTE9DKCBzaXplb2YoV05EKStjbGFzcy0+Y2JXbmRFeHRyYSApOwpAQCAtNDEyLDk2ICs0MTcsNzEgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBDcmVhdGVXaW5kb3cxNiAgIChVU0VSLjQxKQorICogICAgICAgICAgIFdJTl9DcmVhdGVXaW5kb3dFeAorICoKKyAqIEltcGxlbWVudGF0aW9uIG9mIENyZWF0ZVdpbmRvd0V4KCkuCiAgKi8KLUhXTkQgQ3JlYXRlV2luZG93MTYoIFNFR1BUUiBjbGFzc05hbWUsIFNFR1BUUiB3aW5kb3dOYW1lLAotICAgICAgICAgICAgICAgICAgICAgRFdPUkQgc3R5bGUsIElOVDE2IHgsIElOVDE2IHksIElOVDE2IHdpZHRoLCBJTlQxNiBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICBIV05EIHBhcmVudCwgSE1FTlUgbWVudSwgSEFORExFIGluc3RhbmNlLCBTRUdQVFIgZGF0YSApIAorc3RhdGljIEhXTkQgV0lOX0NyZWF0ZVdpbmRvd0V4KCBEV09SRCBleFN0eWxlLCBBVE9NIGNsYXNzQXRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VHUFRSIHdpbmRvd05hbWUsIERXT1JEIHN0eWxlLCBJTlQxNiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQxNiB5LCBJTlQxNiB3aWR0aCwgSU5UMTYgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIV05EIHBhcmVudCwgSE1FTlUgbWVudSwgSElOU1RBTkNFMTYgaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFR1BUUiBkYXRhICkgCiB7Ci0gICAgcmV0dXJuIENyZWF0ZVdpbmRvd0V4MTYoIDAsIGNsYXNzTmFtZSwgd2luZG93TmFtZSwgc3R5bGUsCi0JCQkgICB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBwYXJlbnQsIG1lbnUsIGluc3RhbmNlLCBkYXRhICk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgQ3JlYXRlV2luZG93RXgxNiAgIChVU0VSLjQ1MikKLSAqLwotSFdORCBDcmVhdGVXaW5kb3dFeDE2KERXT1JEIGV4U3R5bGUsIFNFR1BUUiBjbGFzc05hbWUsIFNFR1BUUiB3aW5kb3dOYW1lLAotICAgICAgICAgICAgICAgICAgICAgIERXT1JEIHN0eWxlLCBJTlQxNiB4LCBJTlQxNiB5LCBJTlQxNiB3aWR0aCwgSU5UMTYgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgIEhXTkQgcGFyZW50LCBITUVOVSBtZW51LCBIQU5ETEUgaW5zdGFuY2UsIFNFR1BUUiBkYXRhICkgCi17Ci0gICAgSEFORExFIGh3bmQ7CiAgICAgQ0xBU1MgKmNsYXNzUHRyOwogICAgIFdORCAqd25kUHRyOwotICAgIFBPSU5UIG1heFNpemUsIG1heFBvcywgbWluVHJhY2ssIG1heFRyYWNrOwotICAgIENSRUFURVNUUlVDVCBjcmVhdGVTdHJ1Y3Q7Ci0gICAgaW50IHdtY3JlYXRlOwotICAgIFhTZXRXaW5kb3dBdHRyaWJ1dGVzIHdpbl9hdHRyOwotICAgIEF0b20gWEFfV01fREVMRVRFX1dJTkRPVzsKKyAgICBIV05EMTYgaHduZDsKKyAgICBQT0lOVDE2IG1heFNpemUsIG1heFBvcywgbWluVHJhY2ssIG1heFRyYWNrOwogCi0gICAgZHByaW50Zl93aW4oIHN0ZGRlYiwgIkNyZWF0ZVdpbmRvd0V4OiAiICk7Ci0gICAgaWYgKEhJV09SRCh3aW5kb3dOYW1lKSkKLQlkcHJpbnRmX3dpbiggc3RkZGViLCAiJyVzJyAiLCAoY2hhciAqKVBUUl9TRUdfVE9fTElOKHdpbmRvd05hbWUpICk7Ci0gICAgZWxzZQotCWRwcmludGZfd2luKCBzdGRkZWIsICIlMDR4ICIsIExPV09SRCh3aW5kb3dOYW1lKSApOwotICAgIGlmIChISVdPUkQoY2xhc3NOYW1lKSkKLSAgICAgICAgZHByaW50Zl93aW4oIHN0ZGRlYiwgIiclcycgIiwgKGNoYXIgKilQVFJfU0VHX1RPX0xJTihjbGFzc05hbWUpICk7Ci0gICAgZWxzZQotICAgICAgICBkcHJpbnRmX3dpbiggc3RkZGViLCAiJTA0eCAiLCBMT1dPUkQoY2xhc3NOYW1lKSApOwotCi0gICAgZHByaW50Zl93aW4oc3RkZGViLCAiJTA4bHggJTA4bHggJWQsJWQgJWR4JWQgJTA0eCAlMDR4ICUwNHggJTA4bHhcbiIsCi0JCWV4U3R5bGUsIHN0eWxlLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LAotCQlwYXJlbnQsIG1lbnUsIGluc3RhbmNlLCAoRFdPUkQpZGF0YSk7Ci0KLSAgICBpZiAoeCA9PSBDV19VU0VERUZBVUxUMTYpIHggPSB5ID0gMDsKLSAgICBpZiAod2lkdGggPT0gQ1dfVVNFREVGQVVMVDE2KQotICAgIHsKLQl3aWR0aCA9IDYwMDsKLQloZWlnaHQgPSA0MDA7Ci0gICAgfQotCi0gICAgICAvKiBGaW5kIHRoZSBwYXJlbnQgYW5kIGNsYXNzICovCisgICAgLyogRmluZCB0aGUgcGFyZW50IHdpbmRvdyAqLwogCiAgICAgaWYgKHBhcmVudCkKICAgICB7CiAJLyogTWFrZSBzdXJlIHBhcmVudCBpcyB2YWxpZCAqLwotICAgICAgICBpZiAoIUlzV2luZG93KCBwYXJlbnQgKSkgewotCSAgICBkcHJpbnRmX3dpbihzdGRkZWIsIkNyZWF0ZVdpbmRvd0V4OiBQYXJlbnQgJTA0eCBpcyBub3QgYSB3aW5kb3dcbiIsIHBhcmVudCk7CisgICAgICAgIGlmICghSXNXaW5kb3coIHBhcmVudCApKQorICAgICAgICB7CisgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJDcmVhdGVXaW5kb3dFeDogYmFkIHBhcmVudCAlMDR4XG4iLCBwYXJlbnQgKTsKIAkgICAgcmV0dXJuIDA7CiAJfQogICAgIH0KLSAgICBlbHNlIAorICAgIGVsc2UgaWYgKHN0eWxlICYgV1NfQ0hJTEQpCiAgICAgewotCWlmIChzdHlsZSAmIFdTX0NISUxEKSB7Ci0JICAgIGRwcmludGZfd2luKHN0ZGRlYiwiQ3JlYXRlV2luZG93RXg6IG5vIHBhcmVudFxuIik7Ci0JICAgIHJldHVybiAwOyAgLyogV1NfQ0hJTEQgbmVlZHMgYSBwYXJlbnQgKi8KLQl9CisgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIkNyZWF0ZVdpbmRvd0V4OiBubyBwYXJlbnQgZm9yIGNoaWxkIHdpbmRvd1xuIiApOworICAgICAgICByZXR1cm4gMDsgIC8qIFdTX0NISUxEIG5lZWRzIGEgcGFyZW50ICovCiAgICAgfQogCi0gICAgaWYgKCEoY2xhc3NQdHIgPSBDTEFTU19GaW5kQ2xhc3NCeU5hbWUoIGNsYXNzTmFtZSwgR2V0RXhlUHRyKGluc3RhbmNlKSApKSkKKyAgICAvKiBGaW5kIHRoZSB3aW5kb3cgY2xhc3MgKi8KKworICAgIGlmICghKGNsYXNzUHRyID0gQ0xBU1NfRmluZENsYXNzQnlBdG9tKCBjbGFzc0F0b20sIEdldEV4ZVB0cihpbnN0YW5jZSkgKSkpCiAgICAgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwiQ3JlYXRlV2luZG93IEJBRCBDTEFTU05BTUUgIiApOwotICAgICAgICBpZiAoSElXT1JEKGNsYXNzTmFtZSkpIGZwcmludGYoIHN0ZGVyciwgIiclcydcbiIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopUFRSX1NFR19UT19MSU4oY2xhc3NOYW1lKSApOwotICAgICAgICBlbHNlIGZwcmludGYoIHN0ZGVyciwgIiUwNHhcbiIsIExPV09SRChjbGFzc05hbWUpICk7CisgICAgICAgIGNoYXIgYnVmZmVyWzI1Nl07CisgICAgICAgIEdsb2JhbEdldEF0b21OYW1lMzJBKCBjbGFzc0F0b20sIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikgKTsKKyAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiQ3JlYXRlV2luZG93RXg6IGJhZCBjbGFzcyAnJXMnXG4iLCBidWZmZXIgKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0gICAgICAvKiBDb3JyZWN0IHRoZSB3aW5kb3cgc3R5bGUgKi8KKyAgICAvKiBGaXggdGhlIGNvb3JkaW5hdGVzICovCiAKLSAgICBpZiAoIShzdHlsZSAmIChXU19QT1BVUCB8IFdTX0NISUxEKSkpICAvKiBPdmVybGFwcGVkIHdpbmRvdyAqLwotCXN0eWxlIHw9IFdTX0NBUFRJT04gfCBXU19DTElQU0lCTElOR1M7Ci0gICAgaWYgKGV4U3R5bGUgJiBXU19FWF9ETEdNT0RBTEZSQU1FKSBzdHlsZSAmPSB+V1NfVEhJQ0tGUkFNRTsKKyAgICBpZiAoeCA9PSBDV19VU0VERUZBVUxUMTYpIHggPSB5ID0gMDsKKyAgICBpZiAod2lkdGggPT0gQ1dfVVNFREVGQVVMVDE2KQorICAgIHsKKy8qICAgICAgICBpZiAoIShzdHlsZSAmIChXU19DSElMRCB8IFdTX1BPUFVQKSkpIHdpZHRoID0gaGVpZ2h0ID0gMDsKKyAgICAgICAgZWxzZSAqLworICAgICAgICB7CisgICAgICAgICAgICB3aWR0aCA9IDYwMDsKKyAgICAgICAgICAgIGhlaWdodCA9IDQwMDsKKyAgICAgICAgfQorICAgIH0KIAotICAgICAgLyogQ3JlYXRlIHRoZSB3aW5kb3cgc3RydWN0dXJlICovCisgICAgLyogQ3JlYXRlIHRoZSB3aW5kb3cgc3RydWN0dXJlICovCiAKLSAgICBod25kID0gVVNFUl9IRUFQX0FMTE9DKCBzaXplb2YoV05EKStjbGFzc1B0ci0+Y2JXbmRFeHRyYSApOwotICAgIGlmICghaHduZCkgewotCWRwcmludGZfd2luKHN0ZGRlYiwiQ3JlYXRlV2luZG93RXg6IE91dCBvZiBtZW1vcnlcbiIpOworICAgIGlmICghKGh3bmQgPSBVU0VSX0hFQVBfQUxMT0MoIHNpemVvZigqd25kUHRyKSArIGNsYXNzUHRyLT5jYlduZEV4dHJhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBzaXplb2Yod25kUHRyLT53RXh0cmEpICkpKQorICAgIHsKKwlkcHJpbnRmX3dpbiggc3RkZGViLCAiQ3JlYXRlV2luZG93RXg6IG91dCBvZiBtZW1vcnlcbiIgKTsKIAlyZXR1cm4gMDsKICAgICB9CiAKLSAgICAgIC8qIEZpbGwgdGhlIHN0cnVjdHVyZSAqLworICAgIC8qIEZpbGwgdGhlIHdpbmRvdyBzdHJ1Y3R1cmUgKi8KIAogICAgIHduZFB0ciA9IChXTkQgKikgVVNFUl9IRUFQX0xJTl9BRERSKCBod25kICk7CiAgICAgd25kUHRyLT5uZXh0ICAgICAgICAgICA9IE5VTEw7CkBAIC01MzEsMjYgKzUxMSwzNyBAQAogICAgIHduZFB0ci0+aFN5c01lbnUgICAgICAgPSBNRU5VX0dldERlZlN5c01lbnUoKTsKICAgICB3bmRQdHItPmhQcm9wICAgICAgICAgID0gMDsKIAotICAgIGlmIChjbGFzc1B0ci0+Y2JXbmRFeHRyYSkKLQltZW1zZXQoIHduZFB0ci0+d0V4dHJhLCAwLCBjbGFzc1B0ci0+Y2JXbmRFeHRyYSApOworICAgIGlmIChjbGFzc1B0ci0+Y2JXbmRFeHRyYSkgbWVtc2V0KCB3bmRQdHItPndFeHRyYSwgMCwgY2xhc3NQdHItPmNiV25kRXh0cmEpOworICAgIGlmIChjbGFzc1B0ci0+ZmxhZ3MgJiBDTEFTU19GTEFHX1VOSUNPREUpIHduZFB0ci0+ZmxhZ3MgfD0gV0lOX1VOSUNPREU7CiAgICAgY2xhc3NQdHItPmNXaW5kb3dzKys7CiAKLSAgICAgIC8qIEdldCBjbGFzcyBvciB3aW5kb3cgREMgaWYgbmVlZGVkICovCisgICAgLyogQ29ycmVjdCB0aGUgd2luZG93IHN0eWxlICovCisKKyAgICBpZiAoIShzdHlsZSAmIChXU19QT1BVUCB8IFdTX0NISUxEKSkpICAvKiBPdmVybGFwcGVkIHdpbmRvdyAqLworICAgIHsKKyAgICAgICAgd25kUHRyLT5kd1N0eWxlIHw9IFdTX0NBUFRJT04gfCBXU19DTElQU0lCTElOR1M7CisgICAgICAgIHduZFB0ci0+ZmxhZ3MgfD0gV0lOX05FRURfU0laRTsKKyAgICB9CisgICAgaWYgKGV4U3R5bGUgJiBXU19FWF9ETEdNT0RBTEZSQU1FKSB3bmRQdHItPmR3U3R5bGUgJj0gfldTX1RISUNLRlJBTUU7CisKKyAgICAvKiBHZXQgY2xhc3Mgb3Igd2luZG93IERDIGlmIG5lZWRlZCAqLwogCiAgICAgaWYgKGNsYXNzUHRyLT5zdHlsZSAmIENTX09XTkRDKSB3bmRQdHItPmhkY2UgPSBEQ0VfQWxsb2NEQ0UoRENFX1dJTkRPV19EQyk7CiAgICAgZWxzZSBpZiAoY2xhc3NQdHItPnN0eWxlICYgQ1NfQ0xBU1NEQykgd25kUHRyLT5oZGNlID0gY2xhc3NQdHItPmhkY2U7CiAgICAgZWxzZSB3bmRQdHItPmhkY2UgPSAwOwogCi0gICAgICAvKiBJbnNlcnQgdGhlIHdpbmRvdyBpbiB0aGUgbGlua2VkIGxpc3QgKi8KKyAgICAvKiBJbnNlcnQgdGhlIHdpbmRvdyBpbiB0aGUgbGlua2VkIGxpc3QgKi8KIAogICAgIFdJTl9MaW5rV2luZG93KCBod25kLCBIV05EX1RPUCApOwogCi0gICAgICAvKiBTZW5kIHRoZSBXTV9HRVRNSU5NQVhJTkZPIG1lc3NhZ2UgYW5kIGZpeCB0aGUgc2l6ZSBpZiBuZWVkZWQgKi8KKyAgICAvKiBTZW5kIHRoZSBXTV9HRVRNSU5NQVhJTkZPIG1lc3NhZ2UgYW5kIGZpeCB0aGUgc2l6ZSBpZiBuZWVkZWQgKi8KIAotICAgIE5DX0dldE1pbk1heEluZm8oIGh3bmQsICZtYXhTaXplLCAmbWF4UG9zLCAmbWluVHJhY2ssICZtYXhUcmFjayApOwotCi0gICAgaWYgKG1heFNpemUueCA8IHdpZHRoKSB3aWR0aCA9IG1heFNpemUueDsKLSAgICBpZiAobWF4U2l6ZS55IDwgaGVpZ2h0KSBoZWlnaHQgPSBtYXhTaXplLnk7CisgICAgaWYgKChzdHlsZSAmIFdTX1RISUNLRlJBTUUpIHx8ICEoc3R5bGUgJiAoV1NfUE9QVVAgfCBXU19DSElMRCkpKQorICAgIHsKKyAgICAgICAgTkNfR2V0TWluTWF4SW5mbyggaHduZCwgJm1heFNpemUsICZtYXhQb3MsICZtaW5UcmFjaywgJm1heFRyYWNrICk7CisgICAgICAgIGlmIChtYXhTaXplLnggPCB3aWR0aCkgd2lkdGggPSBtYXhTaXplLng7CisgICAgICAgIGlmIChtYXhTaXplLnkgPCBoZWlnaHQpIGhlaWdodCA9IG1heFNpemUueTsKKyAgICB9CiAgICAgaWYgKHdpZHRoIDw9IDApIHdpZHRoID0gMTsKICAgICBpZiAoaGVpZ2h0IDw9IDApIGhlaWdodCA9IDE7CiAKQEAgLTU2MSwxMSArNTUyLDE0IEBACiAgICAgd25kUHRyLT5yZWN0Q2xpZW50ICAgICAgICA9IHduZFB0ci0+cmVjdFdpbmRvdzsKICAgICB3bmRQdHItPnJlY3ROb3JtYWwgICAgICAgID0gd25kUHRyLT5yZWN0V2luZG93OwogCi0gICAgICAvKiBDcmVhdGUgdGhlIFggd2luZG93IChvbmx5IGZvciB0b3AtbGV2ZWwgd2luZG93cywgYW5kIHRoZW4gb25seSAqLwotICAgICAgLyogd2hlbiB0aGVyZSdzIG5vIGRlc2t0b3Agd2luZG93KSAqLworICAgIC8qIENyZWF0ZSB0aGUgWCB3aW5kb3cgKG9ubHkgZm9yIHRvcC1sZXZlbCB3aW5kb3dzLCBhbmQgdGhlbiBvbmx5ICovCisgICAgLyogd2hlbiB0aGVyZSdzIG5vIGRlc2t0b3Agd2luZG93KSAqLwogCiAgICAgaWYgKCEoc3R5bGUgJiBXU19DSElMRCkgJiYgKHJvb3RXaW5kb3cgPT0gRGVmYXVsdFJvb3RXaW5kb3coZGlzcGxheSkpKQogICAgIHsKKyAgICAgICAgWFNldFdpbmRvd0F0dHJpYnV0ZXMgd2luX2F0dHI7CisgICAgICAgIEF0b20gWEFfV01fREVMRVRFX1dJTkRPVzsKKwogCWlmIChPcHRpb25zLm1hbmFnZWQgJiYgKChzdHlsZSAmIChXU19ETEdGUkFNRSB8IFdTX1RISUNLRlJBTUUpKSB8fAogICAgICAgICAgICAgKGV4U3R5bGUgJiBXU19FWF9ETEdNT0RBTEZSQU1FKSkpCiAgICAgICAgIHsKQEAgLTU5NCw3ICs1ODgsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENXRXZlbnRNYXNrIHwgQ1dPdmVycmlkZVJlZGlyZWN0IHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDV0NvbG9ybWFwIHwgQ1dDdXJzb3IgfCBDV1NhdmVVbmRlciB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1dCYWNraW5nU3RvcmUsICZ3aW5fYXR0ciApOwotICAgICAgICBYU3RvcmVOYW1lKCBkaXNwbGF5LCB3bmRQdHItPndpbmRvdywgUFRSX1NFR19UT19MSU4od2luZG93TmFtZSkgKTsKIAlYQV9XTV9ERUxFVEVfV0lORE9XID0gWEludGVybkF0b20oIGRpc3BsYXksICJXTV9ERUxFVEVfV0lORE9XIiwKIAkJCQkJICAgRmFsc2UgKTsKIAlYU2V0V01Qcm90b2NvbHMoIGRpc3BsYXksIHduZFB0ci0+d2luZG93LCAmWEFfV01fREVMRVRFX1dJTkRPVywgMSApOwpAQCAtNjAzLDQ1ICs1OTYsMTMyIEBACiAgICAgICAgICAgICBXaW5kb3cgd2luID0gV0lOX0dldFhXaW5kb3coIHBhcmVudCApOwogICAgICAgICAgICAgaWYgKHdpbikgWFNldFRyYW5zaWVudEZvckhpbnQoIGRpc3BsYXksIHduZFB0ci0+d2luZG93LCB3aW4gKTsKIAl9Ci0JICAgIAogICAgICAgICBFVkVOVF9SZWdpc3RlcldpbmRvdyggd25kUHRyLT53aW5kb3csIGh3bmQgKTsKICAgICB9Ci0gICAgCisKKyAgICAvKiBTZXQgdGhlIHdpbmRvdyBtZW51ICovCisKICAgICBpZiAoKHN0eWxlICYgV1NfQ0FQVElPTikgJiYgIShzdHlsZSAmIFdTX0NISUxEKSkKICAgICB7CiAgICAgICAgIGlmIChtZW51KSBTZXRNZW51KGh3bmQsIG1lbnUpOwotICAgICAgICBlbHNlIGlmIChjbGFzc1B0ci0+bHBzek1lbnVOYW1lKQotICAgICAgICAgICAgU2V0TWVudSggaHduZCwgTG9hZE1lbnUoIGluc3RhbmNlLCBjbGFzc1B0ci0+bHBzek1lbnVOYW1lICkgKTsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisjaWYgMCAgLyogRklYTUU6IHNob3VsZCBjaGVjayBpZiBjbGFzc1B0ci0+bWVudU5hbWVXIGNhbiBiZSB1c2VkIGFzIGlzICovCisgICAgICAgICAgICBpZiAoY2xhc3NQdHItPm1lbnVOYW1lQSkKKyAgICAgICAgICAgICAgICBtZW51ID0gSElXT1JEKGNsYXNzUHRyLT5tZW51TmFtZUEpID8KKyAgICAgICAgICAgICAgICAgICAgICAgTG9hZE1lbnUoIGluc3RhbmNlLCBTRUdQVFJfR0VUKGNsYXNzUHRyLT5tZW51TmFtZUEpICkgOgorICAgICAgICAgICAgICAgICAgICAgICBMb2FkTWVudSggaW5zdGFuY2UsIChTRUdQVFIpY2xhc3NQdHItPm1lbnVOYW1lQSApOworI2Vsc2UKKyAgICAgICAgICAgIFNFR1BUUiBtZW51TmFtZSA9IChTRUdQVFIpR2V0Q2xhc3NMb25nMTYoIGh3bmQsIEdDTF9NRU5VTkFNRSApOworICAgICAgICAgICAgaWYgKG1lbnVOYW1lKSBtZW51ID0gTG9hZE1lbnUoIGluc3RhbmNlLCBtZW51TmFtZSApOworI2VuZGlmCisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lbnUpIFNldE1lbnUoIGh3bmQsIG1lbnUgKTsKICAgICB9CiAgICAgZWxzZSB3bmRQdHItPndJRG1lbnUgPSAoVUlOVCltZW51OwogCisgICAgcmV0dXJuIGh3bmQ7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ3JlYXRlV2luZG93MTYgICAoVVNFUi40MSkKKyAqLworSFdORDE2IENyZWF0ZVdpbmRvdzE2KCBTRUdQVFIgY2xhc3NOYW1lLCBTRUdQVFIgd2luZG93TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgc3R5bGUsIElOVDE2IHgsIElOVDE2IHksIElOVDE2IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICBJTlQxNiBoZWlnaHQsIEhXTkQxNiBwYXJlbnQsIEhNRU5VMTYgbWVudSwKKyAgICAgICAgICAgICAgICAgICAgICAgSElOU1RBTkNFMTYgaW5zdGFuY2UsIFNFR1BUUiBkYXRhICkgCit7CisgICAgcmV0dXJuIENyZWF0ZVdpbmRvd0V4MTYoIDAsIGNsYXNzTmFtZSwgd2luZG93TmFtZSwgc3R5bGUsCisJCQkgICB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBwYXJlbnQsIG1lbnUsIGluc3RhbmNlLCBkYXRhICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ3JlYXRlV2luZG93RXgxNiAgIChVU0VSLjQ1MikKKyAqLworSFdORDE2IENyZWF0ZVdpbmRvd0V4MTYoIERXT1JEIGV4U3R5bGUsIFNFR1BUUiBjbGFzc05hbWUsIFNFR1BUUiB3aW5kb3dOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIHN0eWxlLCBJTlQxNiB4LCBJTlQxNiB5LCBJTlQxNiB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJTlQxNiBoZWlnaHQsIEhXTkQxNiBwYXJlbnQsIEhNRU5VMTYgbWVudSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBISU5TVEFOQ0UxNiBpbnN0YW5jZSwgU0VHUFRSIGRhdGEgKSAKK3sKKyAgICBBVE9NIGNsYXNzQXRvbTsKKyAgICBIV05EMTYgaHduZDsKKyAgICBXTkQgKnduZFB0cjsKKyAgICBMUkVTVUxUIHdtY3JlYXRlOworICAgIENSRUFURVNUUlVDVDE2ICpjczsKKworICAgIGRwcmludGZfd2luKCBzdGRkZWIsICJDcmVhdGVXaW5kb3dFeDogIiApOworICAgIGlmIChISVdPUkQod2luZG93TmFtZSkpCisJZHByaW50Zl93aW4oIHN0ZGRlYiwgIiclcycgIiwgKGNoYXIgKilQVFJfU0VHX1RPX0xJTih3aW5kb3dOYW1lKSApOworICAgIGVsc2UKKwlkcHJpbnRmX3dpbiggc3RkZGViLCAiJTA0eCAiLCBMT1dPUkQod2luZG93TmFtZSkgKTsKKyAgICBpZiAoSElXT1JEKGNsYXNzTmFtZSkpCisgICAgICAgIGRwcmludGZfd2luKCBzdGRkZWIsICInJXMnICIsIChjaGFyICopUFRSX1NFR19UT19MSU4oY2xhc3NOYW1lKSApOworICAgIGVsc2UKKyAgICAgICAgZHByaW50Zl93aW4oIHN0ZGRlYiwgIiUwNHggIiwgTE9XT1JEKGNsYXNzTmFtZSkgKTsKKworICAgIGRwcmludGZfd2luKHN0ZGRlYiwgIiUwOGx4ICUwOGx4ICVkLCVkICVkeCVkICUwNHggJTA0eCAlMDR4ICUwOGx4XG4iLAorCQlleFN0eWxlLCBzdHlsZSwgeCwgeSwgd2lkdGgsIGhlaWdodCwKKwkJcGFyZW50LCBtZW51LCBpbnN0YW5jZSwgKERXT1JEKWRhdGEpOworCisgICAgLyogRmluZCB0aGUgY2xhc3MgYXRvbSAqLworCisgICAgaWYgKCEoY2xhc3NBdG9tID0gR2xvYmFsRmluZEF0b20xNiggY2xhc3NOYW1lICkpKQorICAgIHsKKyAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiQ3JlYXRlV2luZG93RXgxNjogYmFkIGNsYXNzIG5hbWUgIiApOworICAgICAgICBpZiAoIUhJV09SRChjbGFzc05hbWUpKSBmcHJpbnRmKCBzdGRlcnIsICIlMDR4XG4iLCBMT1dPUkQoY2xhc3NOYW1lKSApOworICAgICAgICBlbHNlIGZwcmludGYoIHN0ZGVyciwgIiclcydcbiIsIChjaGFyICopUFRSX1NFR19UT19MSU4oY2xhc3NOYW1lKSApOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBod25kID0gV0lOX0NyZWF0ZVdpbmRvd0V4KCBleFN0eWxlLCBjbGFzc0F0b20sIHdpbmRvd05hbWUsIHN0eWxlLCB4LCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIHBhcmVudCwgbWVudSwgaW5zdGFuY2UsIGRhdGEgKTsKKyAgICBpZiAoIWh3bmQpIHJldHVybiAwOworICAgIHduZFB0ciA9IChXTkQgKikgVVNFUl9IRUFQX0xJTl9BRERSKCBod25kICk7CisKICAgICAgIC8qIFNlbmQgdGhlIFdNX0NSRUFURSBtZXNzYWdlICovCiAKLSAgICBjcmVhdGVTdHJ1Y3QubHBDcmVhdGVQYXJhbXMgPSAoTFBTVFIpZGF0YTsKLSAgICBjcmVhdGVTdHJ1Y3QuaEluc3RhbmNlICAgICAgPSBpbnN0YW5jZTsKLSAgICBjcmVhdGVTdHJ1Y3QuaE1lbnUgICAgICAgICAgPSBtZW51OwotICAgIGNyZWF0ZVN0cnVjdC5od25kUGFyZW50ICAgICA9IHBhcmVudDsKLSAgICBjcmVhdGVTdHJ1Y3QuY3ggICAgICAgICAgICAgPSB3aWR0aDsKLSAgICBjcmVhdGVTdHJ1Y3QuY3kgICAgICAgICAgICAgPSBoZWlnaHQ7Ci0gICAgY3JlYXRlU3RydWN0LnggICAgICAgICAgICAgID0geDsKLSAgICBjcmVhdGVTdHJ1Y3QueSAgICAgICAgICAgICAgPSB5OwotICAgIGNyZWF0ZVN0cnVjdC5zdHlsZSAgICAgICAgICA9IHN0eWxlOwotICAgIGNyZWF0ZVN0cnVjdC5scHN6TmFtZSAgICAgICA9IHdpbmRvd05hbWU7Ci0gICAgY3JlYXRlU3RydWN0Lmxwc3pDbGFzcyAgICAgID0gY2xhc3NOYW1lOwotICAgIGNyZWF0ZVN0cnVjdC5kd0V4U3R5bGUgICAgICA9IDA7Ci0KLSAgICB3bWNyZWF0ZSA9IFNlbmRNZXNzYWdlKCBod25kLCBXTV9OQ0NSRUFURSwgMCwgKExQQVJBTSlNQUtFX1NFR1BUUigmY3JlYXRlU3RydWN0KSApOwotICAgIGlmICghd21jcmVhdGUpCi0gICAgewotCWRwcmludGZfd2luKHN0ZGRlYiwiQ3JlYXRlV2luZG93RXg6IFdNX05DQ1JFQVRFIHJldHVybiAwXG4iKTsKLQl3bWNyZWF0ZSA9IC0xOwotICAgIH0KKyAgICBpZiAoIShjcyA9IFNFR1BUUl9ORVcoQ1JFQVRFU1RSVUNUMTYpKSkgd21jcmVhdGUgPSAtMTsgIC8qIGFib3J0ICovCiAgICAgZWxzZQogICAgIHsKLQlXSU5QT1NfU2VuZE5DQ2FsY1NpemUoIGh3bmQsIEZBTFNFLCAmd25kUHRyLT5yZWN0V2luZG93LAotCQkJICAgICAgIE5VTEwsIE5VTEwsIDAsICZ3bmRQdHItPnJlY3RDbGllbnQgKTsKLQl3bWNyZWF0ZSA9IFNlbmRNZXNzYWdlKGh3bmQsIFdNX0NSRUFURSwgMCwgKExQQVJBTSlNQUtFX1NFR1BUUigmY3JlYXRlU3RydWN0KSk7CisgICAgICAgIGNzLT5scENyZWF0ZVBhcmFtcyA9IChMUFNUUilkYXRhOworICAgICAgICBjcy0+aEluc3RhbmNlICAgICAgPSB3bmRQdHItPmhJbnN0YW5jZTsKKyAgICAgICAgY3MtPmhNZW51ICAgICAgICAgID0gd25kUHRyLT53SURtZW51OworICAgICAgICBjcy0+aHduZFBhcmVudCAgICAgPSBwYXJlbnQ7CisgICAgICAgIGNzLT5jeCAgICAgICAgICAgICA9IHduZFB0ci0+cmVjdFdpbmRvdy5yaWdodC13bmRQdHItPnJlY3RXaW5kb3cubGVmdDsKKyAgICAgICAgY3MtPmN5ICAgICAgICAgICAgID0gd25kUHRyLT5yZWN0V2luZG93LmJvdHRvbS13bmRQdHItPnJlY3RXaW5kb3cudG9wOworICAgICAgICBjcy0+eCAgICAgICAgICAgICAgPSB3bmRQdHItPnJlY3RXaW5kb3cubGVmdDsKKyAgICAgICAgY3MtPnkgICAgICAgICAgICAgID0gd25kUHRyLT5yZWN0V2luZG93LnRvcDsKKyAgICAgICAgY3MtPnN0eWxlICAgICAgICAgID0gd25kUHRyLT5kd1N0eWxlIHwgKHN0eWxlICYgV1NfVklTSUJMRSk7CisgICAgICAgIGNzLT5scHN6TmFtZSAgICAgICA9IHdpbmRvd05hbWU7CisgICAgICAgIGNzLT5scHN6Q2xhc3MgICAgICA9IGNsYXNzTmFtZTsKKyAgICAgICAgY3MtPmR3RXhTdHlsZSAgICAgID0gd25kUHRyLT5kd0V4U3R5bGU7CisKKyAgICAgICAgd21jcmVhdGUgPSBTZW5kTWVzc2FnZSggaHduZCwgV01fTkNDUkVBVEUsIDAsIChMUEFSQU0pU0VHUFRSX0dFVChjcykgKTsKKyAgICAgICAgaWYgKCF3bWNyZWF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgZHByaW50Zl93aW4oc3RkZGViLCJDcmVhdGVXaW5kb3dFeDogV01fTkNDUkVBVEUgcmV0dXJuIDBcbiIpOworICAgICAgICAgICAgd21jcmVhdGUgPSAtMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFdJTlBPU19TZW5kTkNDYWxjU2l6ZSggaHduZCwgRkFMU0UsICZ3bmRQdHItPnJlY3RXaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIDAsICZ3bmRQdHItPnJlY3RDbGllbnQgKTsKKyAgICAgICAgICAgIHdtY3JlYXRlID0gU2VuZE1lc3NhZ2UoaHduZCwgV01fQ1JFQVRFLCAwLCAoTFBBUkFNKVNFR1BUUl9HRVQoY3MpKTsKKyAgICAgICAgfQorICAgICAgICBTRUdQVFJfRlJFRShjcyk7CiAgICAgfQorICAgIAorICAgIGlmICghKHduZFB0ci0+ZmxhZ3MgJiBXSU5fTkVFRF9TSVpFKSkKKyAgICB7CisJLyogc2VuZCBpdCBhbnl3YXkgKi8KKwlTZW5kTWVzc2FnZSggaHduZCwgV01fU0laRSwgU0laRV9SRVNUT1JFRCwgICAgICAgICAgICAgICAgICAgICAgCisJCSAgICAgTUFLRUxPTkcod25kUHRyLT5yZWN0Q2xpZW50LnJpZ2h0LXduZFB0ci0+cmVjdENsaWVudC5sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHduZFB0ci0+cmVjdENsaWVudC5ib3R0b20td25kUHRyLT5yZWN0Q2xpZW50LnRvcCkpOworICAgICAgICBTZW5kTWVzc2FnZSggaHduZCwgV01fTU9WRSwgMCwKKyAgICAgICAgICAgICAgICAgICBNQUtFTE9ORyh3bmRQdHItPnJlY3RDbGllbnQubGVmdCwgd25kUHRyLT5yZWN0Q2xpZW50LnRvcCkgKTsKKyAgICB9IAogCiAgICAgaWYgKHdtY3JlYXRlID09IC0xKQogICAgIHsKQEAgLTY1Miw2ICs3MzIsNyBAQAogICAgIH0KIAogICAgIFdJTl9TZW5kUGFyZW50Tm90aWZ5KCBod25kLCBXTV9DUkVBVEUsIHduZFB0ci0+d0lEbWVudSwgKExPTkcpaHduZCApOworICAgIGlmICghSXNXaW5kb3coaHduZCkpIHJldHVybiAwOwogCiAgICAgLyogU2hvdyB0aGUgd2luZG93LCBtYXhpbWl6aW5nIG9yIG1pbmltaXppbmcgaWYgbmVlZGVkICovCiAKQEAgLTY2NiwxMiArNzQ3LDE0NiBAQAogICAgIH0KICAgICBlbHNlIGlmICh3bmRQdHItPmR3U3R5bGUgJiBXU19NQVhJTUlaRSkKICAgICB7CisgICAgICAgIFBPSU5UMTYgbWF4U2l6ZSwgbWF4UG9zLCBtaW5UcmFjaywgbWF4VHJhY2s7CisgICAgICAgIE5DX0dldE1pbk1heEluZm8oIGh3bmQsICZtYXhTaXplLCAmbWF4UG9zLCAmbWluVHJhY2ssICZtYXhUcmFjayApOwogICAgICAgICBTZXRXaW5kb3dQb3MoIGh3bmQsIDAsIG1heFBvcy54LCBtYXhQb3MueSwgbWF4U2l6ZS54LCBtYXhTaXplLnksCiAgICAgICAgICAgICAgICAgICAgICAgU1dQX0ZSQU1FQ0hBTkdFRCB8CiAgICAgICAgICAgICAgICAgICAgICAgKHN0eWxlICYgV1NfVklTSUJMRSkgPyBTV1BfU0hPV1dJTkRPVyA6IDAgKTsKICAgICB9CiAgICAgZWxzZSBpZiAoc3R5bGUgJiBXU19WSVNJQkxFKSBTaG93V2luZG93KCBod25kLCBTV19TSE9XICk7CiAKKyAgICAvKiBDYWxsIFdIX1NIRUxMIGhvb2sgKi8KKworICAgIGlmICghKHduZFB0ci0+ZHdTdHlsZSAmIFdTX0NISUxEKSAmJiAhd25kUHRyLT5vd25lcikKKyAgICAgICAgSE9PS19DYWxsSG9va3MoIFdIX1NIRUxMLCBIU0hFTExfV0lORE9XQ1JFQVRFRCwgaHduZCwgMCApOworCisgICAgZHByaW50Zl93aW4oc3RkZGViLCAiQ3JlYXRlV2luZG93RXg6IHJldHVybiAlMDR4XG4iLCBod25kKTsKKyAgICByZXR1cm4gaHduZDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBDcmVhdGVXaW5kb3dFeDMyQSAgIChVU0VSLjQ1MikKKyAqLworSFdORDMyIENyZWF0ZVdpbmRvd0V4MzJBKCBEV09SRCBleFN0eWxlLCBMUENTVFIgY2xhc3NOYW1lLCBMUENTVFIgd2luZG93TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgc3R5bGUsIElOVDMyIHgsIElOVDMyIHksIElOVDMyIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQzMiBoZWlnaHQsIEhXTkQzMiBwYXJlbnQsIEhNRU5VMzIgbWVudSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSElOU1RBTkNFMzIgaW5zdGFuY2UsIExQVk9JRCBkYXRhICkKK3sKKyAgICBBVE9NIGNsYXNzQXRvbTsKKyAgICBIV05EMTYgaHduZDsKKyAgICBXTkQgKnduZFB0cjsKKyAgICBMUkVTVUxUIHdtY3JlYXRlOworICAgIENSRUFURVNUUlVDVDE2ICpjczsKKyAgICBjaGFyICpjbHNOYW1lLCAqd2luTmFtZTsKKworICAgIC8qIEZpbmQgdGhlIGNsYXNzIGF0b20gKi8KKworICAgIGlmICghKGNsYXNzQXRvbSA9IEdsb2JhbEZpbmRBdG9tMzJBKCBjbGFzc05hbWUgKSkpCisgICAgeworICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJDcmVhdGVXaW5kb3dFeDMyQTogYmFkIGNsYXNzIG5hbWUgIiApOworICAgICAgICBpZiAoIUhJV09SRChjbGFzc05hbWUpKSBmcHJpbnRmKCBzdGRlcnIsICIlMDR4XG4iLCBMT1dPUkQoY2xhc3NOYW1lKSApOworICAgICAgICBlbHNlIGZwcmludGYoIHN0ZGVyciwgIiclcydcbiIsIChjaGFyICopUFRSX1NFR19UT19MSU4oY2xhc3NOYW1lKSApOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBGaXggdGhlIGNvb3JkaW5hdGVzICovCisKKyAgICBpZiAoeCA9PSBDV19VU0VERUZBVUxUMzIpIHggPSB5ID0gKFVJTlQzMilDV19VU0VERUZBVUxUMTY7CisgICAgaWYgKHdpZHRoID09IENXX1VTRURFRkFVTFQzMikgd2lkdGggPSBoZWlnaHQgPSAoVUlOVDMyKUNXX1VTRURFRkFVTFQxNjsKKworICAgIGNsc05hbWUgPSBTRUdQVFJfU1RSRFVQKCBjbGFzc05hbWUgKTsKKyAgICB3aW5OYW1lID0gU0VHUFRSX1NUUkRVUCggd2luZG93TmFtZSApOworCisgICAgLyogQ3JlYXRlIHRoZSB3aW5kb3cgc3RydWN0dXJlICovCisKKyAgICBod25kID0gV0lOX0NyZWF0ZVdpbmRvd0V4KCBleFN0eWxlLCBjbGFzc0F0b20sIFNFR1BUUl9HRVQod2luTmFtZSksIHN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeCwgeSwgd2lkdGgsIGhlaWdodCwgcGFyZW50LCBtZW51LCBpbnN0YW5jZSwgZGF0YSApOworICAgIGlmICghaHduZCkgcmV0dXJuIDA7CisgICAgd25kUHRyID0gKFdORCAqKSBVU0VSX0hFQVBfTElOX0FERFIoIGh3bmQgKTsKKworICAgICAgLyogU2VuZCB0aGUgV01fQ1JFQVRFIG1lc3NhZ2UgKi8KKworICAgIGlmICghKGNzID0gU0VHUFRSX05FVyhDUkVBVEVTVFJVQ1QxNikpKSB3bWNyZWF0ZSA9IC0xOyAgLyogYWJvcnQgKi8KKyAgICBlbHNlCisgICAgeworICAgICAgICBjcy0+bHBDcmVhdGVQYXJhbXMgPSAoTFBTVFIpZGF0YTsKKyAgICAgICAgY3MtPmhJbnN0YW5jZSAgICAgID0gd25kUHRyLT5oSW5zdGFuY2U7CisgICAgICAgIGNzLT5oTWVudSAgICAgICAgICA9IHduZFB0ci0+d0lEbWVudTsKKyAgICAgICAgY3MtPmh3bmRQYXJlbnQgICAgID0gcGFyZW50OworICAgICAgICBjcy0+Y3ggICAgICAgICAgICAgPSB3bmRQdHItPnJlY3RXaW5kb3cucmlnaHQtd25kUHRyLT5yZWN0V2luZG93LmxlZnQ7CisgICAgICAgIGNzLT5jeSAgICAgICAgICAgICA9IHduZFB0ci0+cmVjdFdpbmRvdy5ib3R0b20td25kUHRyLT5yZWN0V2luZG93LnRvcDsKKyAgICAgICAgY3MtPnggICAgICAgICAgICAgID0gd25kUHRyLT5yZWN0V2luZG93LmxlZnQ7CisgICAgICAgIGNzLT55ICAgICAgICAgICAgICA9IHduZFB0ci0+cmVjdFdpbmRvdy50b3A7CisgICAgICAgIGNzLT5zdHlsZSAgICAgICAgICA9IHduZFB0ci0+ZHdTdHlsZSB8IChzdHlsZSAmIFdTX1ZJU0lCTEUpOworICAgICAgICBjcy0+bHBzek5hbWUgICAgICAgPSBTRUdQVFJfR0VUKHdpbk5hbWUpOworICAgICAgICBjcy0+bHBzekNsYXNzICAgICAgPSBTRUdQVFJfR0VUKGNsc05hbWUpOworICAgICAgICBjcy0+ZHdFeFN0eWxlICAgICAgPSB3bmRQdHItPmR3RXhTdHlsZTsKKworICAgICAgICB3bWNyZWF0ZSA9IFNlbmRNZXNzYWdlKCBod25kLCBXTV9OQ0NSRUFURSwgMCwgKExQQVJBTSlTRUdQVFJfR0VUKGNzKSApOworICAgICAgICBpZiAoIXdtY3JlYXRlKQorICAgICAgICB7CisgICAgICAgICAgICBkcHJpbnRmX3dpbihzdGRkZWIsIkNyZWF0ZVdpbmRvd0V4OiBXTV9OQ0NSRUFURSByZXR1cm4gMFxuIik7CisgICAgICAgICAgICB3bWNyZWF0ZSA9IC0xOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgV0lOUE9TX1NlbmROQ0NhbGNTaXplKCBod25kLCBGQUxTRSwgJnduZFB0ci0+cmVjdFdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgMCwgJnduZFB0ci0+cmVjdENsaWVudCApOworICAgICAgICAgICAgd21jcmVhdGUgPSBTZW5kTWVzc2FnZShod25kLCBXTV9DUkVBVEUsIDAsIChMUEFSQU0pU0VHUFRSX0dFVChjcykpOworICAgICAgICB9CisgICAgICAgIFNFR1BUUl9GUkVFKGNzKTsKKyAgICAgICAgU0VHUFRSX0ZSRUUoY2xzTmFtZSk7CisgICAgICAgIFNFR1BUUl9GUkVFKHdpbk5hbWUpOworICAgIH0KKworICAgIGlmICghKHduZFB0ci0+ZmxhZ3MgJiBXSU5fTkVFRF9TSVpFKSkKKyAgICB7CisJLyogc2VuZCBpdCBhbnl3YXkgKi8KKwlTZW5kTWVzc2FnZSggaHduZCwgV01fU0laRSwgU0laRV9SRVNUT1JFRCwgICAgICAgICAgICAgICAgICAgICAgCisJCSAgICAgTUFLRUxPTkcod25kUHRyLT5yZWN0Q2xpZW50LnJpZ2h0LXduZFB0ci0+cmVjdENsaWVudC5sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHduZFB0ci0+cmVjdENsaWVudC5ib3R0b20td25kUHRyLT5yZWN0Q2xpZW50LnRvcCkpOworICAgICAgICBTZW5kTWVzc2FnZSggaHduZCwgV01fTU9WRSwgMCwKKyAgICAgICAgICAgICAgICAgICBNQUtFTE9ORyh3bmRQdHItPnJlY3RDbGllbnQubGVmdCwgd25kUHRyLT5yZWN0Q2xpZW50LnRvcCkgKTsKKyAgICB9IAorCisgICAgaWYgKHdtY3JlYXRlID09IC0xKQorICAgIHsKKwkgIC8qIEFib3J0IHdpbmRvdyBjcmVhdGlvbiAqLworCWRwcmludGZfd2luKHN0ZGRlYiwiQ3JlYXRlV2luZG93RXg6IHdtY3JlYXRlPT0tMSwgYWJvcnRpbmdcbiIpOworICAgICAgICBXSU5fRGVzdHJveVdpbmRvdyggaHduZCApOworCXJldHVybiAwOworICAgIH0KKworICAgIFdJTl9TZW5kUGFyZW50Tm90aWZ5KCBod25kLCBXTV9DUkVBVEUsIHduZFB0ci0+d0lEbWVudSwgKExPTkcpaHduZCApOworICAgIGlmICghSXNXaW5kb3coaHduZCkpIHJldHVybiAwOworCisgICAgLyogU2hvdyB0aGUgd2luZG93LCBtYXhpbWl6aW5nIG9yIG1pbmltaXppbmcgaWYgbmVlZGVkICovCisKKyAgICBpZiAod25kUHRyLT5kd1N0eWxlICYgV1NfTUlOSU1JWkUpCisgICAgeworICAgICAgICB3bmRQdHItPmR3U3R5bGUgJj0gfldTX01BWElNSVpFOworICAgICAgICBXSU5QT1NfRmluZEljb25Qb3MoIGh3bmQgKTsKKyAgICAgICAgU2V0V2luZG93UG9zKCBod25kLCAwLCB3bmRQdHItPnB0SWNvblBvcy54LCB3bmRQdHItPnB0SWNvblBvcy55LAorICAgICAgICAgICAgICAgICAgICAgIFNZU01FVFJJQ1NfQ1hJQ09OLCBTWVNNRVRSSUNTX0NZSUNPTiwKKyAgICAgICAgICAgICAgICAgICAgICBTV1BfRlJBTUVDSEFOR0VEIHwKKyAgICAgICAgICAgICAgICAgICAgICAoc3R5bGUgJiBXU19WSVNJQkxFKSA/IFNXUF9TSE9XV0lORE9XIDogMCApOworICAgIH0KKyAgICBlbHNlIGlmICh3bmRQdHItPmR3U3R5bGUgJiBXU19NQVhJTUlaRSkKKyAgICB7CisgICAgICAgIFBPSU5UMTYgbWF4U2l6ZSwgbWF4UG9zLCBtaW5UcmFjaywgbWF4VHJhY2s7CisgICAgICAgIE5DX0dldE1pbk1heEluZm8oIGh3bmQsICZtYXhTaXplLCAmbWF4UG9zLCAmbWluVHJhY2ssICZtYXhUcmFjayApOworICAgICAgICBTZXRXaW5kb3dQb3MoIGh3bmQsIDAsIG1heFBvcy54LCBtYXhQb3MueSwgbWF4U2l6ZS54LCBtYXhTaXplLnksCisgICAgICAgICAgICAgICAgICAgICAgU1dQX0ZSQU1FQ0hBTkdFRCB8CisgICAgICAgICAgICAgICAgICAgICAgKHN0eWxlICYgV1NfVklTSUJMRSkgPyBTV1BfU0hPV1dJTkRPVyA6IDAgKTsKKyAgICB9CisgICAgZWxzZSBpZiAoc3R5bGUgJiBXU19WSVNJQkxFKSBTaG93V2luZG93KCBod25kLCBTV19TSE9XICk7CisKKyAgICAvKiBDYWxsIFdIX1NIRUxMIGhvb2sgKi8KKworICAgIGlmICghKHduZFB0ci0+ZHdTdHlsZSAmIFdTX0NISUxEKSAmJiAhd25kUHRyLT5vd25lcikKKyAgICAgICAgSE9PS19DYWxsSG9va3MoIFdIX1NIRUxMLCBIU0hFTExfV0lORE9XQ1JFQVRFRCwgaHduZCwgMCApOworCiAgICAgZHByaW50Zl93aW4oc3RkZGViLCAiQ3JlYXRlV2luZG93RXg6IHJldHVybiAlMDR4XG4iLCBod25kKTsKICAgICByZXR1cm4gaHduZDsKIH0KQEAgLTY4NiwxMSArOTAxLDE5IEBACiAKICAgICBkcHJpbnRmX3dpbihzdGRkZWIsICJEZXN0cm95V2luZG93KCUwNHgpXG4iLCBod25kKTsKICAgICAKLSAgICAgIC8qIEluaXRpYWxpc2F0aW9uICovCisgICAgICAvKiBJbml0aWFsaXphdGlvbiAqLwogCiAgICAgaWYgKGh3bmQgPT0gcFduZERlc2t0b3AtPmh3bmRTZWxmKSByZXR1cm4gRkFMU0U7IC8qIENhbid0IGRlc3Ryb3kgZGVza3RvcCovCiAgICAgaWYgKCEod25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKSkpIHJldHVybiBGQUxTRTsKIAorICAgICAgLyogVG9wLWxldmVsIHdpbmRvdyAqLworCisgICAgaWYgKCEod25kUHRyLT5kd1N0eWxlICYgV1NfQ0hJTEQpICYmICF3bmRQdHItPm93bmVyKQorICAgIHsKKyAgICAgICAgSE9PS19DYWxsSG9va3MoIFdIX1NIRUxMLCBIU0hFTExfV0lORE9XREVTVFJPWUVELCBod25kLCAwTCApOworICAgICAgICAvKiBGSVhNRTogY2xlYW4gdXAgcGFsZXR0ZSAtIHNlZSAiSW50ZXJuYWxzIiBwLjM1MiAqLworICAgIH0KKwogICAgICAgLyogSGlkZSB0aGUgd2luZG93ICovCiAKICAgICBpZiAod25kUHRyLT5kd1N0eWxlICYgV1NfVklTSUJMRSkKQEAgLTY5OCw3ICs5MjEsOCBAQAogCQkgICAgICBTV1BfTk9aT1JERVIgfCBTV1BfTk9NT1ZFIHwgU1dQX05PU0laRSApOwogICAgIGlmICgoaHduZCA9PSBHZXRDYXB0dXJlKCkpIHx8IElzQ2hpbGQoIGh3bmQsIEdldENhcHR1cmUoKSApKQogCVJlbGVhc2VDYXB0dXJlKCk7Ci0gICAgV0lOX1NlbmRQYXJlbnROb3RpZnkoIGh3bmQsIFdNX0RFU1RST1ksIHduZFB0ci0+d0lEbWVudSwgKExPTkcpaHduZCApOworICAgaWYgKCFRVUVVRV9HZXREb29tZWRRdWV1ZSgpKQorICAgICAgIFdJTl9TZW5kUGFyZW50Tm90aWZ5KCBod25kLCBXTV9ERVNUUk9ZLCB3bmRQdHItPndJRG1lbnUsIChMT05HKWh3bmQgKTsKIAogICAgICAgLyogUmVjdXJzaXZlbHkgZGVzdHJveSBvd25lZCB3aW5kb3dzICovCiAKQEAgLTc1MCw2MyArOTc0LDEzNSBAQAogICAgIHJldHVybihUUlVFKTsKIH0KIAotIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgRmluZFdpbmRvdyAgIChVU0VSLjUwKQotICovCi1IV05EIEZpbmRXaW5kb3coIFNFR1BUUiBDbGFzc01hdGNoLCBMUFNUUiBUaXRsZU1hdGNoICkgewotICAgIHJldHVybiBGaW5kV2luZG93RXgoKEhXTkQpMCwoSFdORCkwLENsYXNzTWF0Y2gsVGl0bGVNYXRjaCk7Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBGaW5kV2luZG93RXggICAoVVNFUi40MjcpCi0gKi8KLUhXTkQgCi1GaW5kV2luZG93RXgoSFdORCBwYXJlbnQsSFdORCBjaGlsZGFmdGVyLFNFR1BUUiBDbGFzc01hdGNoLExQU1RSIFRpdGxlTWF0Y2ggKQotewotICAgIFdORCAqd25kUHRyOwotICAgIENMQVNTICpjbGFzcyA9IE5VTEw7CiAKLSAgICBpZiAoQ2xhc3NNYXRjaCkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFdJTl9GaW5kV2luZG93CisgKgorICogSW1wbGVtZW50YXRpb24gb2YgRmluZFdpbmRvdygpIGFuZCBGaW5kV2luZG93RXgoKS4KKyAqLworc3RhdGljIEhXTkQgV0lOX0ZpbmRXaW5kb3coIEhXTkQgcGFyZW50LCBIV05EIGNoaWxkLCBBVE9NIGNsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgdGl0bGUgKQoreworICAgIFdORCAqcFduZDsKKyAgICBDTEFTUyAqcENsYXNzID0gTlVMTDsKKworICAgIGlmIChjaGlsZCkKICAgICB7Ci0JaWYgKCEoY2xhc3MgPSBDTEFTU19GaW5kQ2xhc3NCeU5hbWUoIENsYXNzTWF0Y2gsIChISU5TVEFOQ0UpMHhmZmZmICkpKQorICAgICAgICBpZiAoIShwV25kID0gV0lOX0ZpbmRXbmRQdHIoIGNoaWxkICkpKSByZXR1cm4gMDsKKyAgICAgICAgaWYgKHBhcmVudCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFwV25kLT5wYXJlbnQgfHwgKHBXbmQtPnBhcmVudC0+aHduZFNlbGYgIT0gcGFyZW50KSkgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAocFduZC0+cGFyZW50ICE9IHBXbmREZXNrdG9wKSByZXR1cm4gMDsKKyAgICAgICAgcFduZCA9IHBXbmQtPm5leHQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmICghKHBXbmQgPSBwYXJlbnQgPyBXSU5fRmluZFduZFB0cihwYXJlbnQpIDogcFduZERlc2t0b3ApKSByZXR1cm4gMDsKKyAgICAgICAgcFduZCA9IHBXbmQtPmNoaWxkOworICAgIH0KKworICAgIC8qIEZvciBhIGNoaWxkIHdpbmRvdywgYWxsIHNpYmxpbmdzIHdpbGwgaGF2ZSB0aGUgc2FtZSBoSW5zdGFuY2UsICovCisgICAgLyogc28gd2UgY2FuIGxvb2sgZm9yIHRoZSBjbGFzcyBvbmNlIGFuZCBmb3IgYWxsLiAqLworCisgICAgaWYgKGNsYXNzTmFtZSAmJiAocFduZC0+ZHdTdHlsZSAmIFdTX0NISUxEKSkKKyAgICB7CisgICAgICAgIGlmICghKHBDbGFzcyA9IENMQVNTX0ZpbmRDbGFzc0J5QXRvbSggY2xhc3NOYW1lLCBwV25kLT5oSW5zdGFuY2UgKSkpCiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKLSAgICBpZiAocGFyZW50KSB7Ci0gICAgCXduZFB0ciA9IFdJTl9GaW5kV25kUHRyKHBhcmVudCk7Ci0gICAgCWlmICh3bmRQdHIgPT0gTlVMTCkKLSAgICAJCXduZFB0ciA9IHBXbmREZXNrdG9wOwotICAgIAl3bmRQdHIgPSB3bmRQdHItPmNoaWxkOwotICAgIH0gZWxzZQotCXduZFB0ciA9IHBXbmREZXNrdG9wLT5jaGlsZDsKLSAgICBpZiAoY2hpbGRhZnRlcikgewotCXdoaWxlICh3bmRQdHIpCi0JewotCSAgICBpZiAoY2hpbGRhZnRlciA9PSB3bmRQdHItPmh3bmRTZWxmKSB7Ci0JICAgIAl3bmRQdHIgPSB3bmRQdHItPm5leHQ7Ci0JICAgIAlicmVhazsKLQkgICAgfQotCSAgICB3bmRQdHIgPSB3bmRQdHItPm5leHQ7Ci0JfQotICAgIH0KLSAgICB3aGlsZSAod25kUHRyKQorICAgIGZvciAoIDsgcFduZDsgcFduZCA9IHBXbmQtPm5leHQpCiAgICAgewotCWlmICghY2xhc3MgfHwgKHduZFB0ci0+Y2xhc3MgPT0gY2xhc3MpKQotCXsKLQkgICAgICAvKiBGb3VuZCBtYXRjaGluZyBjbGFzcyAqLwotCSAgICBpZiAoIVRpdGxlTWF0Y2gpIHJldHVybiB3bmRQdHItPmh3bmRTZWxmOwotCSAgICBpZiAod25kUHRyLT5oVGV4dCkKLQkgICAgewotCQljaGFyICp0ZXh0UHRyID0gKGNoYXIgKikgVVNFUl9IRUFQX0xJTl9BRERSKCB3bmRQdHItPmhUZXh0ICk7Ci0JCWlmICghc3RyY21wKCB0ZXh0UHRyLCBUaXRsZU1hdGNoICkpIHJldHVybiB3bmRQdHItPmh3bmRTZWxmOwotCSAgICB9Ci0JfQotICAgICAgICB3bmRQdHIgPSB3bmRQdHItPm5leHQ7CisgICAgICAgIGlmIChjbGFzc05hbWUgJiYgIShwV25kLT5kd1N0eWxlICYgV1NfQ0hJTEQpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIShwQ2xhc3MgPSBDTEFTU19GaW5kQ2xhc3NCeUF0b20oIGNsYXNzTmFtZSwgcFduZC0+aEluc3RhbmNlKSkpCisgICAgICAgICAgICAgICAgY29udGludWU7ICAvKiBTa2lwIHRoaXMgd2luZG93ICovCisgICAgICAgIH0KKyAgICAgICAgaWYgKHBDbGFzcyAmJiAocFduZC0+Y2xhc3MgIT0gcENsYXNzKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOyAgLyogTm90IHRoZSByaWdodCBjbGFzcyAqLworCisgICAgICAgIC8qIE5vdyBjaGVjayB0aGUgdGl0bGUgKi8KKworICAgICAgICBpZiAoIXRpdGxlKSByZXR1cm4gcFduZC0+aHduZFNlbGY7CisgICAgICAgIGlmIChwV25kLT5oVGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgY2hhciAqdGV4dFB0ciA9IChjaGFyICopIFVTRVJfSEVBUF9MSU5fQUREUiggcFduZC0+aFRleHQgKTsKKyAgICAgICAgICAgIGlmICghc3RyY21wKCB0ZXh0UHRyLCB0aXRsZSApKSByZXR1cm4gcFduZC0+aHduZFNlbGY7CisgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIDA7CiB9Ci0gCi0gCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBGaW5kV2luZG93MTYgICAoVVNFUi41MCkKKyAqLworSFdORCBGaW5kV2luZG93MTYoIFNFR1BUUiBjbGFzc05hbWUsIExQQ1NUUiB0aXRsZSApCit7CisgICAgcmV0dXJuIEZpbmRXaW5kb3dFeDE2KCAwLCAwLCBjbGFzc05hbWUsIHRpdGxlICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgRmluZFdpbmRvd0V4MTYgICAoVVNFUi40MjcpCisgKi8KK0hXTkQgRmluZFdpbmRvd0V4MTYoIEhXTkQgcGFyZW50LCBIV05EIGNoaWxkLCBTRUdQVFIgY2xhc3NOYW1lLCBMUENTVFIgdGl0bGUgKQoreworICAgIEFUT00gYXRvbTsKKworICAgIGF0b20gPSBjbGFzc05hbWUgPyBHbG9iYWxGaW5kQXRvbTE2KCBjbGFzc05hbWUgKSA6IDA7CisgICAgcmV0dXJuIFdJTl9GaW5kV2luZG93KCBwYXJlbnQsIGNoaWxkLCBhdG9tLCB0aXRsZSApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEZpbmRXaW5kb3czMkEgICAoVVNFUjMyLjE5NykKKyAqLworSFdORCBGaW5kV2luZG93MzJBKCBMUENTVFIgY2xhc3NOYW1lLCBMUENTVFIgdGl0bGUgKQoreworICAgIHJldHVybiBGaW5kV2luZG93RXgzMkEoIDAsIDAsIGNsYXNzTmFtZSwgdGl0bGUgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBGaW5kV2luZG93RXgzMkEgICAoVVNFUjMyLjE5OCkKKyAqLworSFdORCBGaW5kV2luZG93RXgzMkEoIEhXTkQgcGFyZW50LCBIV05EIGNoaWxkLCBMUENTVFIgY2xhc3NOYW1lLCBMUENTVFIgdGl0bGUgKQoreworICAgIEFUT00gYXRvbTsKKworICAgIGF0b20gPSBjbGFzc05hbWUgPyBHbG9iYWxGaW5kQXRvbTMyQSggY2xhc3NOYW1lICkgOiAwOworICAgIHJldHVybiBXSU5fRmluZFdpbmRvdyggMCwgMCwgYXRvbSwgdGl0bGUgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBGaW5kV2luZG93RXgzMlcgICAoVVNFUjMyLjE5OSkKKyAqLworSFdORCBGaW5kV2luZG93RXgzMlcoSFdORCBwYXJlbnQsIEhXTkQgY2hpbGQsIExQQ1dTVFIgY2xhc3NOYW1lLCBMUENXU1RSIHRpdGxlKQoreworICAgIEFUT00gYXRvbTsKKyAgICBjaGFyICpidWZmZXI7CisgICAgSFdORCBod25kOworCisgICAgYXRvbSA9IGNsYXNzTmFtZSA/IEdsb2JhbEZpbmRBdG9tMzJXKCBjbGFzc05hbWUgKSA6IDA7CisgICAgYnVmZmVyID0gU1RSSU5HMzJfRHVwVW5pVG9BbnNpKCB0aXRsZSApOworICAgIGh3bmQgPSBXSU5fRmluZFdpbmRvdyggMCwgMCwgYXRvbSwgYnVmZmVyICk7CisgICAgZnJlZSggYnVmZmVyICk7CisgICAgcmV0dXJuIGh3bmQ7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgRmluZFdpbmRvdzMyVyAgIChVU0VSMzIuMjAwKQorICovCitIV05EIEZpbmRXaW5kb3czMlcoIExQQ1dTVFIgY2xhc3NOYW1lLCBMUENXU1RSIHRpdGxlICkKK3sKKyAgICByZXR1cm4gRmluZFdpbmRvd0V4MzJXKCAwLCAwLCBjbGFzc05hbWUsIHRpdGxlICk7Cit9CisKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBXSU5fR2V0RGVza3RvcAogICovCkBAIC04NjgsNyArMTE2NCw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgSXNXaW5kb3dFbmFibGVkICAgKFVTRVIuMzUpCisgKiAgICAgICAgICAgSXNXaW5kb3dFbmFibGVkICAgKFVTRVIuMzUpIChVU0VSMzIuMzQ4KQogICovIAogQk9PTCBJc1dpbmRvd0VuYWJsZWQoSFdORCBoV25kKQogewpAQCAtODc5LDYgKzExNzUsMTggQEAKIH0KIAogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBJc1dpbmRvd1VuaWNvZGUgICAoVVNFUjMyLjM0OSkKKyAqLworQk9PTCBJc1dpbmRvd1VuaWNvZGUoIEhXTkQgaHduZCApCit7CisgICAgV05EICogd25kUHRyOyAKKworICAgIGlmICghKHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGh3bmQpKSkgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiAod25kUHRyLT5mbGFncyAmIFdJTl9VTklDT0RFKSAhPSAwOworfQorCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkgICAgIEdldFdpbmRvd1dvcmQgICAgKFVTRVIuMTMzKQogICovCkBAIC0xMTE2LDcgKzE0MjQsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIElzV2luZG93VmlzaWJsZSAgIChVU0VSLjQ5KQorICogICAgICAgICAgIElzV2luZG93VmlzaWJsZSAgIChVU0VSLjQ5KSAoVVNFUjMyLjM1MCkKICAqLwogQk9PTCBJc1dpbmRvd1Zpc2libGUoIEhXTkQgaHduZCApCiB7CkBAIC0xMzgyLDggKzE2OTAsOCBAQAogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewotICAgICAgICAgICAgUmVkcmF3V2luZG93KCBoV25kLCAwLCAwLCBSRFdfSU5WQUxJREFURSB8IFJEV19FUkFTRSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIFJEV19VUERBVEVOT1cgfCBSRFdfRlJBTUUgKTsKKyAgICAgICAgICAgIFJlZHJhd1dpbmRvdzMyKCBoV25kLCAwLCAwLCBSRFdfSU5WQUxJREFURSB8IFJEV19FUkFTRSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkRXX1VQREFURU5PVyB8IFJEV19GUkFNRSApOwogICAgICAgICAgICAgd25kUHRyLT5mbGFncyAmPSB+V0lOX05DQUNUSVZBVEVEOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBUUlVFOwpAQCAtMTQyOSwxOCArMTczNywxOCBAQAogQk9PTCBEUkFHX1F1ZXJ5VXBkYXRlKCBIV05EIGhRdWVyeVduZCwgU0VHUFRSIHNwRHJhZ0luZm8gKQogewogIEJPT0wJCXdQYXJhbSxiUmVzdWx0ID0gMDsKLSBQT0lOVAkJcHQ7CisgUE9JTlQxNiAgICAgICAgcHQ7CiAgTFBEUkFHSU5GTwlwdHJEcmFnSW5mbyA9IChMUERSQUdJTkZPKSBQVFJfU0VHX1RPX0xJTihzcERyYWdJbmZvKTsKICBXTkQgCSAgICAgICAqcHRyUXVlcnlXbmQgPSBXSU5fRmluZFduZFB0cihoUXVlcnlXbmQpLCpwdHJXbmQ7Ci0gUkVDVAkJdGVtcFJlY3Q7CS8qIHRoaXMgc3Vja3MgKi8KKyBSRUNUMTYJCXRlbXBSZWN0OwkvKiB0aGlzIHN1Y2tzICovCiAKICBpZiggIXB0clF1ZXJ5V25kIHx8ICFwdHJEcmFnSW5mbyApIHJldHVybiAwOwogCiAgcHQgCQk9IHB0ckRyYWdJbmZvLT5wdDsKIAotIEdldFdpbmRvd1JlY3QoaFF1ZXJ5V25kLCZ0ZW1wUmVjdCk7IAorIEdldFdpbmRvd1JlY3QxNihoUXVlcnlXbmQsJnRlbXBSZWN0KTsgCiAKLSBpZiggIVB0SW5SZWN0KCZ0ZW1wUmVjdCxwdCkgfHwKKyBpZiggIVB0SW5SZWN0MTYoJnRlbXBSZWN0LHB0KSB8fAogICAgICAocHRyUXVlcnlXbmQtPmR3U3R5bGUgJiBXU19ESVNBQkxFRCkgKQogCXJldHVybiAwOwogCkBAIC0xNDQ4LDE4ICsxNzU2LDE4IEBACiAgICB7CiAgICAgIHRlbXBSZWN0ID0gcHRyUXVlcnlXbmQtPnJlY3RDbGllbnQ7CiAgICAgIGlmKHB0clF1ZXJ5V25kLT5kd1N0eWxlICYgV1NfQ0hJTEQpCi0gICAgICAgIE1hcFdpbmRvd1BvaW50cyhwdHJRdWVyeVduZC0+cGFyZW50LT5od25kU2VsZiwwLChMUFBPSU5UKSZ0ZW1wUmVjdCwyKTsKKyAgICAgICAgTWFwV2luZG93UG9pbnRzMTYocHRyUXVlcnlXbmQtPnBhcmVudC0+aHduZFNlbGYsMCwoTFBQT0lOVDE2KSZ0ZW1wUmVjdCwyKTsKIAotICAgICBpZiggUHRJblJlY3QoJnRlbXBSZWN0LHB0KSApCisgICAgIGlmKCBQdEluUmVjdDE2KCZ0ZW1wUmVjdCxwdCkgKQogCXsKIAkgd1BhcmFtID0gMDsKICAgICAgICAgIAogCSBmb3IgKHB0clduZCA9IHB0clF1ZXJ5V25kLT5jaGlsZDsgcHRyV25kIDtwdHJXbmQgPSBwdHJXbmQtPm5leHQpCiAgICAgICAgICAgICAgaWYoIHB0clduZC0+ZHdTdHlsZSAmIFdTX1ZJU0lCTEUgKQogCSAgICAgewotICAgICAgICAgICAgICAgICBHZXRXaW5kb3dSZWN0KHB0clduZC0+aHduZFNlbGYsJnRlbXBSZWN0KTsKKyAgICAgICAgICAgICAgICAgR2V0V2luZG93UmVjdDE2KHB0clduZC0+aHduZFNlbGYsJnRlbXBSZWN0KTsKIAotICAgICAgICAgICAgICAgICBpZiggUHRJblJlY3QoJnRlbXBSZWN0LHB0KSApIAorICAgICAgICAgICAgICAgICBpZiggUHRJblJlY3QxNigmdGVtcFJlY3QscHQpICkgCiAgICAgICAgICAgICAgICAgICAgICBicmVhazsKIAkgICAgIH0KIApAQCAtMTQ3OCw3ICsxNzg2LDcgQEAKICAgIH0KICBlbHNlIHdQYXJhbSA9IDE7CiAKLSBTY3JlZW5Ub0NsaWVudChoUXVlcnlXbmQsJnB0ckRyYWdJbmZvLT5wdCk7CisgU2NyZWVuVG9DbGllbnQxNihoUXVlcnlXbmQsJnB0ckRyYWdJbmZvLT5wdCk7CiAKICBwdHJEcmFnSW5mby0+aFNjb3BlID0gaFF1ZXJ5V25kOwogCkBAIC0xNDk0LDEwICsxODAyLDEwIEBACiAgKiAgICAgICAgICAgICAgICAgICAgICBEcmFnRGV0ZWN0ICggVVNFUi40NjUgKQogICoKICAqLwotQk9PTCBEcmFnRGV0ZWN0KEhXTkQgaFduZCwgUE9JTlQgcHQpCitCT09MMTYgRHJhZ0RldGVjdChIV05EMTYgaFduZCwgUE9JTlQxNiBwdCkKIHsKICAgTVNHICAgbXNnOwotICBSRUNUICByZWN0OworICBSRUNUMTYgIHJlY3Q7CiAKICAgcmVjdC5sZWZ0ID0gcHQueCAtIHdEcmFnV2lkdGg7CiAgIHJlY3QucmlnaHQgPSBwdC54ICsgd0RyYWdXaWR0aDsKQEAgLTE1MTgsOCArMTgyNiw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICBpZiggbXNnLm1lc3NhZ2UgPT0gV01fTU9VU0VNT1ZFICkKIAkJewotCQkgIFBPSU5UIHB0ID0geyBMT1dPUkQobXNnLmxQYXJhbSksIEhJV09SRChtc2cubFBhcmFtKSB9OwotICAgICAgICAgICAgICAgICAgaWYoICFQdEluUmVjdCggJnJlY3QsIHB0ICkgKQorICAgICAgICAgICAgICAgICAgaWYoICFQdEluUmVjdDE2KCAmcmVjdCwgTUFLRVBPSU5UMTYobXNnLmxQYXJhbSkgKSApCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICBSZWxlYXNlQ2FwdHVyZSgpOwogICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwpkaWZmIC0tZ2l0IGEvd2luZG93cy93aW5wb3MuYyBiL3dpbmRvd3Mvd2lucG9zLmMKaW5kZXggZTA1OWVmMC4uMzlhMThkNiAxMDA2NDQKLS0tIGEvd2luZG93cy93aW5wb3MuYworKysgYi93aW5kb3dzL3dpbnBvcy5jCkBAIC02LDYgKzYsNyBAQAogICovCiAKICNpbmNsdWRlICJzeXNtZXRyaWNzLmgiCisjaW5jbHVkZSAiaGVhcC5oIgogI2luY2x1ZGUgIm1vZHVsZS5oIgogI2luY2x1ZGUgInVzZXIuaCIKICNpbmNsdWRlICJ3aW4uaCIKQEAgLTI0LDggKzI1LDkgQEAKIAogLyogLS0tLS0gZXh0ZXJuYWwgZnVuY3Rpb25zIC0tLS0tICovCiAKLXZvaWQgCUZPQ1VTX1N3aXRjaEZvY3VzKCBIV05EICwgSFdORCApOwotSFJHTiAJRENFX0dldFZpc1JnbiggSFdORCwgV09SRCApOworZXh0ZXJuIHZvaWQgCUZPQ1VTX1N3aXRjaEZvY3VzKCBIV05EICwgSFdORCApOworZXh0ZXJuIEhSR04gCURDRV9HZXRWaXNSZ24oIEhXTkQsIFdPUkQgKTsKK2V4dGVybiBIV05ECUNBUkVUX0dldEh3bmQoKTsKIAogLyogLS0tLS0gaW50ZXJuYWwgdmFyaWFibGVzIC0tLS0tICovCiAKQEAgLTQwLDEyICs0MiwxMiBAQAogICovCiB2b2lkIFdJTlBPU19GaW5kSWNvblBvcyggSFdORCBod25kICkKIHsKLSAgICBSRUNUIHJlY3RQYXJlbnQ7CisgICAgUkVDVDE2IHJlY3RQYXJlbnQ7CiAgICAgc2hvcnQgeCwgeSwgeHNwYWNpbmcsIHlzcGFjaW5nOwogICAgIFdORCAqIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICk7CiAKICAgICBpZiAoIXduZFB0ciB8fCAhd25kUHRyLT5wYXJlbnQpIHJldHVybjsKLSAgICBHZXRDbGllbnRSZWN0KCB3bmRQdHItPnBhcmVudC0+aHduZFNlbGYsICZyZWN0UGFyZW50ICk7CisgICAgR2V0Q2xpZW50UmVjdDE2KCB3bmRQdHItPnBhcmVudC0+aHduZFNlbGYsICZyZWN0UGFyZW50ICk7CiAgICAgaWYgKCh3bmRQdHItPnB0SWNvblBvcy54ID49IHJlY3RQYXJlbnQubGVmdCkgJiYKICAgICAgICAgKHduZFB0ci0+cHRJY29uUG9zLnggKyBTWVNNRVRSSUNTX0NYSUNPTiA8IHJlY3RQYXJlbnQucmlnaHQpICYmCiAgICAgICAgICh3bmRQdHItPnB0SWNvblBvcy55ID49IHJlY3RQYXJlbnQudG9wKSAmJgpAQCAtOTAsMTEgKzkyLDExIEBACiAgKi8KIFVJTlQgQXJyYW5nZUljb25pY1dpbmRvd3MoIEhXTkQgcGFyZW50ICkKIHsKLSAgICBSRUNUIHJlY3RQYXJlbnQ7CisgICAgUkVDVDE2IHJlY3RQYXJlbnQ7CiAgICAgSFdORCBod25kQ2hpbGQ7CiAgICAgSU5UIHgsIHksIHhzcGFjaW5nLCB5c3BhY2luZzsKIAotICAgIEdldENsaWVudFJlY3QoIHBhcmVudCwgJnJlY3RQYXJlbnQgKTsKKyAgICBHZXRDbGllbnRSZWN0MTYoIHBhcmVudCwgJnJlY3RQYXJlbnQgKTsKICAgICB4ID0gcmVjdFBhcmVudC5sZWZ0OwogICAgIHkgPSByZWN0UGFyZW50LmJvdHRvbTsKICAgICB4c3BhY2luZyA9IHlzcGFjaW5nID0gNzA7ICAvKiBGSVhNRTogVGhpcyBzaG91bGQgY29tZSBmcm9tIFdJTi5JTkkgKi8KQEAgLTEyMCwyMyArMTIyLDUzIEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2V0V2luZG93UmVjdCAgIChVU0VSLjMyKQorICogICAgICAgICAgIEdldFdpbmRvd1JlY3QxNiAgIChVU0VSLjMyKQogICovCi12b2lkIEdldFdpbmRvd1JlY3QoIEhXTkQgaHduZCwgTFBSRUNUIHJlY3QgKSAKK3ZvaWQgR2V0V2luZG93UmVjdDE2KCBIV05EMTYgaHduZCwgTFBSRUNUMTYgcmVjdCApIAogewogICAgIFdORCAqIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICk7IAogICAgIGlmICghd25kUHRyKSByZXR1cm47CiAgICAgCiAgICAgKnJlY3QgPSB3bmRQdHItPnJlY3RXaW5kb3c7CiAgICAgaWYgKHduZFB0ci0+ZHdTdHlsZSAmIFdTX0NISUxEKQotCU1hcFdpbmRvd1BvaW50cyggd25kUHRyLT5wYXJlbnQtPmh3bmRTZWxmLCAwLCAoUE9JTlQgKilyZWN0LCAyICk7CisJTWFwV2luZG93UG9pbnRzMTYoIHduZFB0ci0+cGFyZW50LT5od25kU2VsZiwgMCwgKFBPSU5UMTYgKilyZWN0LCAyICk7CiB9CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2V0Q2xpZW50UmVjdCAgIChVU0VSLjMzKQorICogICAgICAgICAgIEdldFdpbmRvd1JlY3QzMiAgIChVU0VSLjMyKQogICovCi12b2lkIEdldENsaWVudFJlY3QoIEhXTkQgaHduZCwgTFBSRUNUIHJlY3QgKSAKK3ZvaWQgR2V0V2luZG93UmVjdDMyKCBIV05EMzIgaHduZCwgTFBSRUNUMzIgcmVjdCApIAoreworICAgIFdORCAqIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICk7IAorICAgIGlmICghd25kUHRyKSByZXR1cm47CisgICAgCisgICAgQ09OVl9SRUNUMTZUTzMyKCAmd25kUHRyLT5yZWN0V2luZG93LCByZWN0ICk7CisgICAgaWYgKHduZFB0ci0+ZHdTdHlsZSAmIFdTX0NISUxEKQorCU1hcFdpbmRvd1BvaW50czMyKCB3bmRQdHItPnBhcmVudC0+aHduZFNlbGYsIDAsIChQT0lOVDMyICopcmVjdCwgMiApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdldENsaWVudFJlY3QxNiAgIChVU0VSLjMzKQorICovCit2b2lkIEdldENsaWVudFJlY3QxNiggSFdORDE2IGh3bmQsIExQUkVDVDE2IHJlY3QgKSAKK3sKKyAgICBXTkQgKiB3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApOworCisgICAgcmVjdC0+bGVmdCA9IHJlY3QtPnRvcCA9IHJlY3QtPnJpZ2h0ID0gcmVjdC0+Ym90dG9tID0gMDsKKyAgICBpZiAod25kUHRyKSAKKyAgICB7CisJcmVjdC0+cmlnaHQgID0gd25kUHRyLT5yZWN0Q2xpZW50LnJpZ2h0IC0gd25kUHRyLT5yZWN0Q2xpZW50LmxlZnQ7CisJcmVjdC0+Ym90dG9tID0gd25kUHRyLT5yZWN0Q2xpZW50LmJvdHRvbSAtIHduZFB0ci0+cmVjdENsaWVudC50b3A7CisgICAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdldENsaWVudFJlY3QzMiAgIChVU0VSMzIuMjE5KQorICovCit2b2lkIEdldENsaWVudFJlY3QzMiggSFdORDMyIGh3bmQsIExQUkVDVDMyIHJlY3QgKSAKIHsKICAgICBXTkQgKiB3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApOwogCkBAIC0xNTAsMjEgKzE4Miw0MCBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgIENsaWVudFRvU2NyZWVuICAgKFVTRVIuMjgpCisgKiAgICAgICAgIENsaWVudFRvU2NyZWVuMTYgICAoVVNFUi4yOCkKICAqLwotQk9PTCBDbGllbnRUb1NjcmVlbiggSFdORCBod25kLCBMUFBPSU5UIGxwcG50ICkKK0JPT0wxNiBDbGllbnRUb1NjcmVlbjE2KCBIV05EMTYgaHduZCwgTFBQT0lOVDE2IGxwcG50ICkKIHsKLSAgICBNYXBXaW5kb3dQb2ludHMoIGh3bmQsIDAsIGxwcG50LCAxICk7CisgICAgTWFwV2luZG93UG9pbnRzMTYoIGh3bmQsIDAsIGxwcG50LCAxICk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgU2NyZWVuVG9DbGllbnQgICAoVVNFUi4yOSkKKyAqICAgICAgICAgQ2xpZW50VG9TY3JlZW4zMiAgIChVU0VSMzIuNTEpCiAgKi8KLXZvaWQgU2NyZWVuVG9DbGllbnQoIEhXTkQgaHduZCwgTFBQT0lOVCBscHBudCApCitCT09MMzIgQ2xpZW50VG9TY3JlZW4zMiggSFdORDMyIGh3bmQsIExQUE9JTlQzMiBscHBudCApCiB7Ci0gICAgTWFwV2luZG93UG9pbnRzKCAwLCBod25kLCBscHBudCwgMSApOworICAgIE1hcFdpbmRvd1BvaW50czMyKCBod25kLCAwLCBscHBudCwgMSApOworICAgIHJldHVybiBUUlVFOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgIFNjcmVlblRvQ2xpZW50MTYgICAoVVNFUi4yOSkKKyAqLwordm9pZCBTY3JlZW5Ub0NsaWVudDE2KCBIV05EMTYgaHduZCwgTFBQT0lOVDE2IGxwcG50ICkKK3sKKyAgICBNYXBXaW5kb3dQb2ludHMxNiggMCwgaHduZCwgbHBwbnQsIDEgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICBTY3JlZW5Ub0NsaWVudDMyICAgKFVTRVIzMi40NDYpCisgKi8KK3ZvaWQgU2NyZWVuVG9DbGllbnQzMiggSFdORDMyIGh3bmQsIExQUE9JTlQzMiBscHBudCApCit7CisgICAgTWFwV2luZG93UG9pbnRzMzIoIDAsIGh3bmQsIGxwcG50LCAxICk7CiB9CiAKIApAQCAtMTczLDExICsyMjQsMTEgQEAKICAqCiAgKiBGaW5kIHRoZSB3aW5kb3cgYW5kIGhpdHRlc3QgZm9yIGEgZ2l2ZW4gcG9pbnQuCiAgKi8KLUlOVCBXSU5QT1NfV2luZG93RnJvbVBvaW50KCBQT0lOVCBwdCwgV05EICoqcHBXbmQgKQorSU5UMTYgV0lOUE9TX1dpbmRvd0Zyb21Qb2ludCggUE9JTlQxNiBwdCwgV05EICoqcHBXbmQgKQogewogICAgIFdORCAqd25kUHRyOwotICAgIElOVCBoaXR0ZXN0ID0gSFRFUlJPUjsKLSAgICBJTlQgeCwgeTsKKyAgICBJTlQxNiBoaXR0ZXN0ID0gSFRFUlJPUjsKKyAgICBJTlQxNiB4LCB5OwogCiAgICAgKnBwV25kID0gTlVMTDsKICAgICB4ID0gcHQueDsKQEAgLTI0Niw5ICsyOTcsOSBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgIFdpbmRvd0Zyb21Qb2ludCAgIChVU0VSLjMwKQorICogICAgICAgICBXaW5kb3dGcm9tUG9pbnQxNiAgIChVU0VSLjMwKQogICovCi1IV05EIFdpbmRvd0Zyb21Qb2ludCggUE9JTlQgcHQgKQorSFdORDE2ICBXaW5kb3dGcm9tUG9pbnQxNiggUE9JTlQxNiBwdCApCiB7CiAgICAgV05EICpwV25kOwogICAgIFdJTlBPU19XaW5kb3dGcm9tUG9pbnQoIHB0LCAmcFduZCApOwpAQCAtMjU3LDE0ICszMDgsMjcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICBDaGlsZFdpbmRvd0Zyb21Qb2ludCAgIChVU0VSLjE5MSkKKyAqICAgICAgICAgV2luZG93RnJvbVBvaW50MzIgICAoVVNFUjMyLjU4MSkKICAqLwotSFdORCBDaGlsZFdpbmRvd0Zyb21Qb2ludCggSFdORCBod25kUGFyZW50LCBQT0lOVCBwdCApCitIV05EMzIgV2luZG93RnJvbVBvaW50MzIoIFBPSU5UMzIgcHQgKQoreworICAgIFdORCAqcFduZDsKKyAgICBQT0lOVDE2IHB0MTY7CisgICAgQ09OVl9QT0lOVDMyVE8xNiggJnB0LCAmcHQxNiApOworICAgIFdJTlBPU19XaW5kb3dGcm9tUG9pbnQoIHB0MTYsICZwV25kICk7CisgICAgcmV0dXJuIChIV05EMzIpcFduZC0+aHduZFNlbGY7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgQ2hpbGRXaW5kb3dGcm9tUG9pbnQxNiAgIChVU0VSLjE5MSkKKyAqLworSFdORDE2IENoaWxkV2luZG93RnJvbVBvaW50MTYoIEhXTkQxNiBod25kUGFyZW50LCBQT0lOVDE2IHB0ICkKIHsKICAgICAvKiBwdCBpcyBpbiB0aGUgY2xpZW50IGNvb3JkaW5hdGVzICovCiAKICAgICBXTkQqIHduZCA9IFdJTl9GaW5kV25kUHRyKGh3bmRQYXJlbnQpOwotICAgIFJFQ1QgcmVjdDsKKyAgICBSRUNUMTYgcmVjdDsKIAogICAgIGlmKCAhd25kICkgcmV0dXJuIDA7CiAKQEAgLTI3MywyOCArMzM3LDQyIEBACiAgICAgcmVjdC5yaWdodCA9IHduZC0+cmVjdENsaWVudC5yaWdodCAtIHduZC0+cmVjdENsaWVudC5sZWZ0OwogICAgIHJlY3QuYm90dG9tID0gd25kLT5yZWN0Q2xpZW50LmJvdHRvbSAtIHduZC0+cmVjdENsaWVudC50b3A7CiAKLSAgICBpZiAoIVB0SW5SZWN0KCAmcmVjdCwgcHQgKSkgcmV0dXJuIDA7CisgICAgaWYgKCFQdEluUmVjdDE2KCAmcmVjdCwgcHQgKSkgcmV0dXJuIDA7CiAKICAgICB3bmQgPSB3bmQtPmNoaWxkOwogICAgIHdoaWxlICggd25kICkKICAgICB7Ci0gICAgICAgIGlmIChQdEluUmVjdCggJnduZC0+cmVjdFdpbmRvdywgcHQgKSkgcmV0dXJuIHduZC0+aHduZFNlbGY7CisgICAgICAgIGlmIChQdEluUmVjdDE2KCAmd25kLT5yZWN0V2luZG93LCBwdCApKSByZXR1cm4gd25kLT5od25kU2VsZjsKICAgICAgICAgd25kID0gd25kLT5uZXh0OwogICAgIH0KICAgICByZXR1cm4gaHduZFBhcmVudDsKIH0KIAorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICBNYXBXaW5kb3dQb2ludHMgICAoVVNFUi4yNTgpCisgKiAgICAgICAgIENoaWxkV2luZG93RnJvbVBvaW50MzIgICAoVVNFUjMyLikKICAqLwotdm9pZCBNYXBXaW5kb3dQb2ludHMoIEhXTkQgaHduZEZyb20sIEhXTkQgaHduZFRvLCBMUFBPSU5UIGxwcHQsIFdPUkQgY291bnQgKQorSFdORDMyIENoaWxkV2luZG93RnJvbVBvaW50MzIoIEhXTkQzMiBod25kUGFyZW50LCBQT0lOVDMyIHB0ICkKK3sKKyAgICBQT0lOVDE2IHB0MTY7CisgICAgQ09OVl9QT0lOVDMyVE8xNiggJnB0LCAmcHQxNiApOworICAgIHJldHVybiAoSFdORDMyKUNoaWxkV2luZG93RnJvbVBvaW50MTYoIGh3bmRQYXJlbnQsIHB0MTYgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICBXSU5QT1NfR2V0V2luT2Zmc2V0CisgKgorICogQ2FsY3VsYXRlIHRoZSBvZmZzZXQgYmV0d2VlbiB0aGUgb3JpZ2luIG9mIHRoZSB0d28gd2luZG93cy4gVXNlZAorICogdG8gaW1wbGVtZW50IE1hcFdpbmRvd1BvaW50cy4KKyAqLworc3RhdGljIHZvaWQgV0lOUE9TX0dldFdpbk9mZnNldCggSFdORDMyIGh3bmRGcm9tLCBIV05EMzIgaHduZFRvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE9JTlQzMiAqb2Zmc2V0ICkKIHsKICAgICBXTkQgKiB3bmRQdHI7Ci0gICAgUE9JTlQgKiBjdXJwdDsKLSAgICBQT0lOVCBvcmlnaW4gPSB7IDAsIDAgfTsKLSAgICBXT1JEIGk7CiAKLSAgICBpZiggaHduZEZyb20gPT0gaHduZFRvICkgcmV0dXJuOworICAgIG9mZnNldC0+eCA9IG9mZnNldC0+eSA9IDA7CisgICAgaWYgKGh3bmRGcm9tID09IGh3bmRUbyApIHJldHVybjsKIAogICAgICAgLyogVHJhbnNsYXRlIHNvdXJjZSB3aW5kb3cgb3JpZ2luIHRvIHNjcmVlbiBjb29yZHMgKi8KICAgICBpZiAoaHduZEZyb20pCkBAIC0zMDYsOCArMzg0LDggQEAKICAgICAgICAgfQogICAgICAgICB3aGlsZSAod25kUHRyLT5wYXJlbnQpCiAgICAgICAgIHsKLSAgICAgICAgICAgIG9yaWdpbi54ICs9IHduZFB0ci0+cmVjdENsaWVudC5sZWZ0OwotICAgICAgICAgICAgb3JpZ2luLnkgKz0gd25kUHRyLT5yZWN0Q2xpZW50LnRvcDsKKyAgICAgICAgICAgIG9mZnNldC0+eCArPSB3bmRQdHItPnJlY3RDbGllbnQubGVmdDsKKyAgICAgICAgICAgIG9mZnNldC0+eSArPSB3bmRQdHItPnJlY3RDbGllbnQudG9wOwogICAgICAgICAgICAgd25kUHRyID0gd25kUHRyLT5wYXJlbnQ7CiAgICAgICAgIH0KICAgICB9CkBAIC0zMjIsMTcgKzQwMCw0NiBAQAogICAgICAgICB9CiAgICAgICAgIHdoaWxlICh3bmRQdHItPnBhcmVudCkKICAgICAgICAgewotICAgICAgICAgICAgb3JpZ2luLnggLT0gd25kUHRyLT5yZWN0Q2xpZW50LmxlZnQ7Ci0gICAgICAgICAgICBvcmlnaW4ueSAtPSB3bmRQdHItPnJlY3RDbGllbnQudG9wOworICAgICAgICAgICAgb2Zmc2V0LT54IC09IHduZFB0ci0+cmVjdENsaWVudC5sZWZ0OworICAgICAgICAgICAgb2Zmc2V0LT55IC09IHduZFB0ci0+cmVjdENsaWVudC50b3A7CiAgICAgICAgICAgICB3bmRQdHIgPSB3bmRQdHItPnBhcmVudDsKICAgICAgICAgfSAgICAKICAgICB9Cit9CiAKLSAgICAgIC8qIFRyYW5zbGF0ZSBwb2ludHMgKi8KLSAgICBmb3IgKGkgPSAwLCBjdXJwdCA9IGxwcHQ7IGkgPCBjb3VudDsgaSsrLCBjdXJwdCsrKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICBNYXBXaW5kb3dQb2ludHMxNiAgIChVU0VSLjI1OCkKKyAqLwordm9pZCBNYXBXaW5kb3dQb2ludHMxNiggSFdORDE2IGh3bmRGcm9tLCBIV05EMTYgaHduZFRvLAorICAgICAgICAgICAgICAgICAgICAgICAgTFBQT0lOVDE2IGxwcHQsIFVJTlQxNiBjb3VudCApCit7CisgICAgUE9JTlQzMiBvZmZzZXQ7CisKKyAgICBXSU5QT1NfR2V0V2luT2Zmc2V0KCBod25kRnJvbSwgaHduZFRvLCAmb2Zmc2V0ICk7CisgICAgd2hpbGUgKGNvdW50LS0pCiAgICAgewotCWN1cnB0LT54ICs9IG9yaWdpbi54OwotCWN1cnB0LT55ICs9IG9yaWdpbi55OworCWxwcHQtPnggKz0gb2Zmc2V0Lng7CisJbHBwdC0+eSArPSBvZmZzZXQueTsKKyAgICAgICAgbHBwdCsrOworICAgIH0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICBNYXBXaW5kb3dQb2ludHMzMiAgIChVU0VSMzIuMzg1KQorICovCit2b2lkIE1hcFdpbmRvd1BvaW50czMyKCBIV05EMzIgaHduZEZyb20sIEhXTkQzMiBod25kVG8sCisgICAgICAgICAgICAgICAgICAgICAgICBMUFBPSU5UMzIgbHBwdCwgVUlOVDMyIGNvdW50ICkKK3sKKyAgICBQT0lOVDMyIG9mZnNldDsKKworICAgIFdJTlBPU19HZXRXaW5PZmZzZXQoIGh3bmRGcm9tLCBod25kVG8sICZvZmZzZXQgKTsKKyAgICB3aGlsZSAoY291bnQtLSkKKyAgICB7CisJbHBwdC0+eCArPSBvZmZzZXQueDsKKwlscHB0LT55ICs9IG9mZnNldC55OworICAgICAgICBscHB0Kys7CiAgICAgfQogfQogCkBAIC00MTMsNyArNTIwLDcgQEAKIHsgICAgCiAgICAgV05EICogd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKICAgICBCT09MIHdhc1Zpc2libGU7Ci0gICAgUE9JTlQgbWF4U2l6ZTsKKyAgICBQT0lOVDE2IG1heFNpemU7CiAgICAgaW50IHN3cGZsYWdzID0gMDsKICAgICBzaG9ydCB4ID0gMCwgeSA9IDAsIGN4ID0gMCwgY3kgPSAwOwogCkBAIC01NTEsMTMgKzY1OCwxMyBAQAogICAgIFNlbmRNZXNzYWdlKCBod25kLCBXTV9TSE9XV0lORE9XLCAoY21kICE9IFNXX0hJREUpLCAwICk7CiAgICAgU2V0V2luZG93UG9zKCBod25kLCBIV05EX1RPUCwgeCwgeSwgY3gsIGN5LCBzd3BmbGFncyApOwogCi0gICAgICAvKiBTZW5kIFdNX1NJWkUgYW5kIFdNX01PVkUgbWVzc2FnZXMgaWYgbm90IGFscmVhZHkgZG9uZSAqLwotICAgIGlmICghKHduZFB0ci0+ZmxhZ3MgJiBXSU5fR09UX1NJWkVNU0cpKQorICAgIGlmICh3bmRQdHItPmZsYWdzICYgV0lOX05FRURfU0laRSkKICAgICB7CiAJaW50IHdQYXJhbSA9IFNJWkVfUkVTVE9SRUQ7CisKKwl3bmRQdHItPmZsYWdzICY9IH5XSU5fTkVFRF9TSVpFOwogCWlmICh3bmRQdHItPmR3U3R5bGUgJiBXU19NQVhJTUlaRSkgd1BhcmFtID0gU0laRV9NQVhJTUlaRUQ7CiAJZWxzZSBpZiAod25kUHRyLT5kd1N0eWxlICYgV1NfTUlOSU1JWkUpIHdQYXJhbSA9IFNJWkVfTUlOSU1JWkVEOwotCXduZFB0ci0+ZmxhZ3MgfD0gV0lOX0dPVF9TSVpFTVNHOwogCVNlbmRNZXNzYWdlKCBod25kLCBXTV9TSVpFLCB3UGFyYW0sCiAJCSAgICAgTUFLRUxPTkcod25kUHRyLT5yZWN0Q2xpZW50LnJpZ2h0LXduZFB0ci0+cmVjdENsaWVudC5sZWZ0LAogCQkJICAgIHduZFB0ci0+cmVjdENsaWVudC5ib3R0b20td25kUHRyLT5yZWN0Q2xpZW50LnRvcCkpOwpAQCAtNTY1LDE3ICs2NzIsMjMgQEAKIAkJICAgTUFLRUxPTkcod25kUHRyLT5yZWN0Q2xpZW50LmxlZnQsIHduZFB0ci0+cmVjdENsaWVudC50b3ApICk7CiAgICAgfQogCisgICAgaWYgKGh3bmQgPT0gR2V0Rm9jdXMoKSkKKyAgICB7IAorCVNldEZvY3VzKCAod25kUHRyLT5kd1N0eWxlICYgV1NfQ0hJTEQpPyB3bmRQdHItPnBhcmVudC0+aHduZFNlbGY6IDAgKTsKKwlpZiAoaHduZCA9PSBDQVJFVF9HZXRId25kKCkpIERlc3Ryb3lDYXJldCgpOworICAgIH0KKwogICAgIHJldHVybiB3YXNWaXNpYmxlOwogfQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEdldEludGVybmFsV2luZG93UG9zICAgKFVTRVIuNDYwKQorICogICAgICAgICAgIEdldEludGVybmFsV2luZG93UG9zMTYgICAoVVNFUi40NjApCiAgKi8KLVdPUkQgR2V0SW50ZXJuYWxXaW5kb3dQb3MoIEhXTkQgaHduZCwgTFBSRUNUIHJlY3RXbmQsIExQUE9JTlQgcHRJY29uICkKK1VJTlQxNiBHZXRJbnRlcm5hbFdpbmRvd1BvczE2KCBIV05EMTYgaHduZCwgTFBSRUNUMTYgcmVjdFduZCwgTFBQT0lOVDE2IHB0SWNvbikKIHsKLSAgICBXSU5ET1dQTEFDRU1FTlQgd25kcGw7Ci0gICAgaWYgKCFHZXRXaW5kb3dQbGFjZW1lbnQoIGh3bmQsICZ3bmRwbCApKSByZXR1cm4gMDsKKyAgICBXSU5ET1dQTEFDRU1FTlQxNiB3bmRwbDsKKyAgICBpZiAoIUdldFdpbmRvd1BsYWNlbWVudDE2KCBod25kLCAmd25kcGwgKSkgcmV0dXJuIDA7CiAgICAgaWYgKHJlY3RXbmQpICpyZWN0V25kID0gd25kcGwucmNOb3JtYWxQb3NpdGlvbjsKICAgICBpZiAocHRJY29uKSAgKnB0SWNvbiA9IHduZHBsLnB0TWluUG9zaXRpb247CiAgICAgcmV0dXJuIHduZHBsLnNob3dDbWQ7CkBAIC01ODMsMTEgKzY5NiwyNSBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFNldEludGVybmFsV2luZG93UG9zICAgKFVTRVIuNDYxKQorICogICAgICAgICAgIEdldEludGVybmFsV2luZG93UG9zMzIgICAoVVNFUjMyLjI0NCkKICAqLwotdm9pZCBTZXRJbnRlcm5hbFdpbmRvd1BvcyggSFdORCBod25kLCBXT1JEIHNob3dDbWQsIExQUkVDVCByZWN0LCBMUFBPSU5UIHB0ICkKK1VJTlQzMiBHZXRJbnRlcm5hbFdpbmRvd1BvczMyKCBIV05EMzIgaHduZCwgTFBSRUNUMzIgcmVjdFduZCwgTFBQT0lOVDMyIHB0SWNvbikKIHsKLSAgICBXSU5ET1dQTEFDRU1FTlQgd25kcGw7CisgICAgV0lORE9XUExBQ0VNRU5UMzIgd25kcGw7CisgICAgaWYgKCFHZXRXaW5kb3dQbGFjZW1lbnQzMiggaHduZCwgJnduZHBsICkpIHJldHVybiAwOworICAgIGlmIChyZWN0V25kKSAqcmVjdFduZCA9IHduZHBsLnJjTm9ybWFsUG9zaXRpb247CisgICAgaWYgKHB0SWNvbikgICpwdEljb24gPSB3bmRwbC5wdE1pblBvc2l0aW9uOworICAgIHJldHVybiB3bmRwbC5zaG93Q21kOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFNldEludGVybmFsV2luZG93UG9zMTYgICAoVVNFUi40NjEpCisgKi8KK3ZvaWQgU2V0SW50ZXJuYWxXaW5kb3dQb3MxNiggSFdORDE2IGh3bmQsIFVJTlQxNiBzaG93Q21kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFJFQ1QxNiByZWN0LCBMUFBPSU5UMTYgcHQgKQoreworICAgIFdJTkRPV1BMQUNFTUVOVDE2IHduZHBsOwogICAgIFdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKIAogICAgIHduZHBsLmxlbmd0aCAgPSBzaXplb2Yod25kcGwpOwpAQCAtNTk2LDE0ICs3MjMsMzQgQEAKICAgICBpZiAocHQpIHduZHBsLnB0TWluUG9zaXRpb24gPSAqcHQ7CiAgICAgd25kcGwucmNOb3JtYWxQb3NpdGlvbiA9IChyZWN0ICE9IE5VTEwpID8gKnJlY3QgOiB3bmRQdHItPnJlY3ROb3JtYWw7CiAgICAgd25kcGwucHRNYXhQb3NpdGlvbiA9IHduZFB0ci0+cHRNYXhQb3M7Ci0gICAgU2V0V2luZG93UGxhY2VtZW50KCBod25kLCAmd25kcGwgKTsKKyAgICBTZXRXaW5kb3dQbGFjZW1lbnQxNiggaHduZCwgJnduZHBsICk7CiB9CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2V0V2luZG93UGxhY2VtZW50ICAgKFVTRVIuMzcwKQorICogICAgICAgICAgIFNldEludGVybmFsV2luZG93UG9zMzIgICAoVVNFUjMyLjQ4MikKICAqLwotQk9PTCBHZXRXaW5kb3dQbGFjZW1lbnQoIEhXTkQgaHduZCwgV0lORE9XUExBQ0VNRU5UICp3bmRwbCApCit2b2lkIFNldEludGVybmFsV2luZG93UG9zMzIoIEhXTkQzMiBod25kLCBVSU5UMzIgc2hvd0NtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBSRUNUMzIgcmVjdCwgTFBQT0lOVDMyIHB0ICkKK3sKKyAgICBXSU5ET1dQTEFDRU1FTlQzMiB3bmRwbDsKKyAgICBXTkQgKnduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICk7CisKKyAgICB3bmRwbC5sZW5ndGggID0gc2l6ZW9mKHduZHBsKTsKKyAgICB3bmRwbC5mbGFncyAgID0gKHB0ICE9IE5VTEwpID8gV1BGX1NFVE1JTlBPU0lUSU9OIDogMDsKKyAgICB3bmRwbC5zaG93Q21kID0gc2hvd0NtZDsKKyAgICBpZiAocHQpIHduZHBsLnB0TWluUG9zaXRpb24gPSAqcHQ7CisgICAgaWYgKHJlY3QpIHduZHBsLnJjTm9ybWFsUG9zaXRpb24gPSAqcmVjdDsKKyAgICBlbHNlIENPTlZfUkVDVDE2VE8zMiggJnduZFB0ci0+cmVjdE5vcm1hbCwgJnduZHBsLnJjTm9ybWFsUG9zaXRpb24gKTsKKyAgICBDT05WX1BPSU5UMTZUTzMyKCAmd25kUHRyLT5wdE1heFBvcywgJnduZHBsLnB0TWF4UG9zaXRpb24gKTsKKyAgICBTZXRXaW5kb3dQbGFjZW1lbnQzMiggaHduZCwgJnduZHBsICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgR2V0V2luZG93UGxhY2VtZW50MTYgICAoVVNFUi4zNzApCisgKi8KK0JPT0wxNiBHZXRXaW5kb3dQbGFjZW1lbnQxNiggSFdORDE2IGh3bmQsIFdJTkRPV1BMQUNFTUVOVDE2ICp3bmRwbCApCiB7CiAgICAgV05EICp3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApOwogICAgIGlmICghd25kUHRyKSByZXR1cm4gRkFMU0U7CkBAIC02MjAsOSArNzY3LDI4IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgU2V0V2luZG93UGxhY2VtZW50ICAgKFVTRVIuMzcxKQorICogICAgICAgICAgIEdldFdpbmRvd1BsYWNlbWVudDMyICAgKFVTRVIzMi4zMDYpCiAgKi8KLUJPT0wgU2V0V2luZG93UGxhY2VtZW50KCBIV05EIGh3bmQsIFdJTkRPV1BMQUNFTUVOVCAqd25kcGwgKQorQk9PTDMyIEdldFdpbmRvd1BsYWNlbWVudDMyKCBIV05EMzIgaHduZCwgV0lORE9XUExBQ0VNRU5UMzIgKnduZHBsICkKK3sKKyAgICBXTkQgKnduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICk7CisgICAgaWYgKCF3bmRQdHIpIHJldHVybiBGQUxTRTsKKworICAgIHduZHBsLT5sZW5ndGggID0gc2l6ZW9mKCp3bmRwbCk7CisgICAgd25kcGwtPmZsYWdzICAgPSAwOworICAgIHduZHBsLT5zaG93Q21kID0gSXNab29tZWQoaHduZCkgPyBTV19TSE9XTUFYSU1JWkVEIDogCisJICAgICAgICAgICAgIChJc0ljb25pYyhod25kKSA/IFNXX1NIT1dNSU5JTUlaRUQgOiBTV19TSE9XTk9STUFMKTsKKyAgICBDT05WX1BPSU5UMTZUTzMyKCAmd25kUHRyLT5wdEljb25Qb3MsICZ3bmRwbC0+cHRNaW5Qb3NpdGlvbiApOworICAgIENPTlZfUE9JTlQxNlRPMzIoICZ3bmRQdHItPnB0TWF4UG9zLCAmd25kcGwtPnB0TWF4UG9zaXRpb24gKTsKKyAgICBDT05WX1JFQ1QxNlRPMzIoICZ3bmRQdHItPnJlY3ROb3JtYWwsICZ3bmRwbC0+cmNOb3JtYWxQb3NpdGlvbiApOworICAgIHJldHVybiBUUlVFOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFNldFdpbmRvd1BsYWNlbWVudDE2ICAgKFVTRVIuMzcxKQorICovCitCT09MMTYgU2V0V2luZG93UGxhY2VtZW50MTYoIEhXTkQxNiBod25kLCBjb25zdCBXSU5ET1dQTEFDRU1FTlQxNiAqd25kcGwgKQogewogICAgIFdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKICAgICBpZiAoIXduZFB0cikgcmV0dXJuIEZBTFNFOwpAQCAtNjM3LDYgKzgwMywyNiBAQAogICAgIHJldHVybiBUUlVFOwogfQogCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFNldFdpbmRvd1BsYWNlbWVudDMyICAgKFVTRVIzMi41MTgpCisgKi8KK0JPT0wzMiBTZXRXaW5kb3dQbGFjZW1lbnQzMiggSFdORDMyIGh3bmQsIGNvbnN0IFdJTkRPV1BMQUNFTUVOVDMyICp3bmRwbCApCit7CisgICAgV05EICp3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApOworICAgIGlmICghd25kUHRyKSByZXR1cm4gRkFMU0U7CisKKyAgICBpZiAod25kcGwtPmZsYWdzICYgV1BGX1NFVE1JTlBPU0lUSU9OKQorCUNPTlZfUE9JTlQzMlRPMTYoICZ3bmRwbC0+cHRNaW5Qb3NpdGlvbiwgJnduZFB0ci0+cHRJY29uUG9zICk7CisgICAgaWYgKCh3bmRwbC0+ZmxhZ3MgJiBXUEZfUkVTVE9SRVRPTUFYSU1JWkVEKSAmJgorCSh3bmRwbC0+c2hvd0NtZCA9PSBTV19TSE9XTUlOSU1JWkVEKSkgd25kUHRyLT5mbGFncyB8PSBXSU5fUkVTVE9SRV9NQVg7CisgICAgQ09OVl9QT0lOVDMyVE8xNiggJnduZHBsLT5wdE1heFBvc2l0aW9uLCAmd25kUHRyLT5wdE1heFBvcyApOworICAgIENPTlZfUkVDVDMyVE8xNiggJnduZHBsLT5yY05vcm1hbFBvc2l0aW9uLCAmd25kUHRyLT5yZWN0Tm9ybWFsICk7CisgICAgU2hvd1dpbmRvdyggaHduZCwgd25kcGwtPnNob3dDbWQgKTsKKyAgICByZXR1cm4gVFJVRTsKK30KKworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJICAgQUNUSVZBVEVBUFBfY2FsbGJhY2sKICAqLwpAQCAtNjYxLDEwICs4NDcsMTAgQEAKIHsKICAgICBXTkQgICAgICAgICAgICAgICAgICAgKnduZFB0ciAgICAgICAgICA9IFdJTl9GaW5kV25kUHRyKGhXbmQpOwogICAgIFdORCAgICAgICAgICAgICAgICAgICAqd25kVGVtcCAgICAgICAgID0gV0lOX0ZpbmRXbmRQdHIoaHduZEFjdGl2ZSk7Ci0gICAgQ0JUQUNUSVZBVEVTVFJVQ1QgICAgICBjYnRTdHJ1Y3QgICAgICAgPSB7IGZNb3VzZSAsIGh3bmRBY3RpdmUgfTsKKyAgICBDQlRBQ1RJVkFURVNUUlVDVCAgICAgKmNidFN0cnVjdDsKICAgICBGQVJQUk9DICAgICAgICAgICAgICAgIGVudW1DYWxsYmFjayAgICA9IE1PRFVMRV9HZXRXbmRQcm9jRW50cnkxNigiQWN0aXZhdGVBcHBQcm9jIik7CiAgICAgQUNUSVZBVEVTVFJVQ1QgICAgICAgICBhY3RTdHJ1Y3Q7Ci0gICAgV09SRCAgICAgICAgICAgICAgICAgICB3SWNvbml6ZWQ9MCx3UmV0PSAwOworICAgIFdPUkQgICAgICAgICAgICAgICAgICAgd0ljb25pemVkPTA7CiAKICAgICAvKiBGSVhNRTogV2hlbiBwcm9wZXIgc3VwcG9ydCBmb3IgY29vcGVyYXRpdmUgbXVsdGl0YXNraW5nIGlzIGluIHBsYWNlIAogICAgICAqICAgICAgICBoQWN0aXZlUSB3aWxsIGJlIGdsb2JhbCAKQEAgLTY4NSwxMCArODcxLDE2IEBACiAJZHByaW50Zl93aW4oc3RkZGViLCJXSU5QT1NfQWN0aXZhdGVXaW5kb3c6IG5vIGN1cnJlbnQgYWN0aXZlIHdpbmRvdy5cbiIpOwogCiAgICAgLyogY2FsbCBDQlQgaG9vayBjaGFpbiAqLwotICAgIHdSZXQgPSBIT09LX0NhbGxIb29rcyhXSF9DQlQsIEhDQlRfQUNUSVZBVEUsIChXUEFSQU0paFduZCwKLQkJCSAgKExQQVJBTSlNQUtFX1NFR1BUUigmY2J0U3RydWN0KSk7Ci0KLSAgICBpZiggd1JldCApIHJldHVybiB3UmV0OworICAgIGlmICgoY2J0U3RydWN0ID0gU0VHUFRSX05FVyhDQlRBQ1RJVkFURVNUUlVDVCkpKQorICAgIHsKKyAgICAgICAgTFJFU1VMVCB3UmV0OworICAgICAgICBjYnRTdHJ1Y3QtPmZNb3VzZSAgICAgPSBmTW91c2U7CisgICAgICAgIGNidFN0cnVjdC0+aFduZEFjdGl2ZSA9IGh3bmRBY3RpdmU7CisgICAgICAgIHdSZXQgPSBIT09LX0NhbGxIb29rcyggV0hfQ0JULCBIQ0JUX0FDVElWQVRFLCAoV1BBUkFNKWhXbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQQVJBTSlTRUdQVFJfR0VUKGNidFN0cnVjdCkgKTsKKyAgICAgICAgU0VHUFRSX0ZSRUUoY2J0U3RydWN0KTsKKyAgICAgICAgaWYgKHdSZXQpIHJldHVybiB3UmV0OworICAgIH0KIAogICAgIC8qIHNldCBwcmV2IGFjdGl2ZSB3bmQgdG8gY3VycmVudCBhY3RpdmUgd25kIGFuZCBzZW5kIG5vdGlmaWNhdGlvbiAqLwogICAgIGlmKCAoaHduZFByZXZBY3RpdmUgPSBod25kQWN0aXZlKSApCkBAIC03MjksNyArOTIxLDkgQEAKICAgICAgICAgICAgIFJlZHJhd0ljb25UaXRsZShod25kUHJldkFjdGl2ZSk7IAogICAgICAgfSAKICAgKi8KLSAgICBpZiAoISh3bmRQdHItPmR3U3R5bGUgJiBXU19DSElMRCkpCisKKyAgICAvKiBtYW5hZ2VkIHdpbmRvd3Mgd2lsbCBnZXQgQ29uZmlndXJlTm90aWZ5IGV2ZW50ICovICAKKyAgICBpZiAoISh3bmRQdHItPmR3U3R5bGUgJiBXU19DSElMRCkgJiYgISh3bmRQdHItPmZsYWdzICYgV0lOX01BTkFHRUQpKQogICAgIHsKIAkvKiBjaGVjayBaLW9yZGVyIGFuZCBicmluZyBoV25kIHRvIHRoZSB0b3AgKi8KIAlmb3IgKHduZFRlbXAgPSBXSU5fR2V0RGVza3RvcCgpLT5jaGlsZDsgd25kVGVtcDsgd25kVGVtcCA9IHduZFRlbXAtPm5leHQpCkBAIC04MjEsMTYgKzEwMTUsMTYgQEAKICAgICBpZiggIXduZFB0ciApIHJldHVybiBGQUxTRTsKIAogICAgIC8qIGNoaWxkIHdpbmRvd3MgZ2V0IFdNX0NISUxEQUNUSVZBVEUgbWVzc2FnZSAqLwotICAgIGlmKCAod25kUHRyLT5kd1N0eWxlICYgV1NfQ0hJTEQpICYmICEoIHduZFB0ci0+ZHdTdHlsZSAmIFdTX1BPUFVQKSkKKyAgICBpZiggKHduZFB0ci0+ZHdTdHlsZSAmIChXU19DSElMRCB8IFdTX1BPUFVQKSkgPT0gV1NfQ0hJTEQgKQogCXJldHVybiBTZW5kTWVzc2FnZShoV25kLCBXTV9DSElMREFDVElWQVRFLCAwLCAwTCk7CiAKLSAgICAgICAgLyogb3duZWQgcG9wdXBzIGltcGx5IG93bmVyIGFjdGl2YXRpb24gKi8KLSAgICBpZiggd25kUHRyLT5kd1N0eWxlICYgV1NfUE9QVVAgJiYgd25kUHRyLT5vd25lciApCi0gICAgICB7Ci0gICAgICAgIHduZFB0ciA9IHduZFB0ci0+b3duZXI7Ci0gICAgICAgIGlmKCAhd25kUHRyICkgcmV0dXJuIEZBTFNFOworICAgICAgICAvKiBvd25lZCBwb3B1cHMgaW1wbHkgb3duZXIgYWN0aXZhdGlvbiAtIG5vdCBzdXJlICovCisgICAgaWYgKCh3bmRQdHItPmR3U3R5bGUgJiBXU19QT1BVUCkgJiYgd25kUHRyLT5vd25lciAmJgorICAgICAgICAhKHduZFB0ci0+b3duZXItPmR3U3R5bGUgJiBXU19ESVNBQkxFRCApKQorICAgIHsKKyAgICAgICAgaWYgKCEod25kUHRyID0gd25kUHRyLT5vd25lcikpIHJldHVybiBGQUxTRTsKIAloV25kID0gd25kUHRyLT5od25kU2VsZjsKLSAgICAgIH0KKyAgICB9CiAKICAgICBpZiggaFduZCA9PSBod25kQWN0aXZlICkgcmV0dXJuIEZBTFNFOwogCkBAIC04NTMsMjYgKzEwNDcsMjkgQEAKICAqIG9sZFdpbmRvd1JlY3QsIG9sZENsaWVudFJlY3QgYW5kIHdpbnBvcyBtdXN0IGJlIG5vbi1OVUxMIG9ubHkKICAqIHdoZW4gY2FsY1ZhbGlkUmVjdCBpcyBUUlVFLgogICovCi1MT05HIFdJTlBPU19TZW5kTkNDYWxjU2l6ZSggSFdORCBod25kLCBCT09MIGNhbGNWYWxpZFJlY3QsIFJFQ1QgKm5ld1dpbmRvd1JlY3QsCi0JCQkgICAgUkVDVCAqb2xkV2luZG93UmVjdCwgUkVDVCAqb2xkQ2xpZW50UmVjdCwKLQkJCSAgICBTRUdQVFIgd2lucG9zLCBSRUNUICpuZXdDbGllbnRSZWN0ICkKK0xPTkcgV0lOUE9TX1NlbmROQ0NhbGNTaXplKCBIV05EIGh3bmQsIEJPT0wgY2FsY1ZhbGlkUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUNUMTYgKm5ld1dpbmRvd1JlY3QsIFJFQ1QxNiAqb2xkV2luZG93UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUNUMTYgKm9sZENsaWVudFJlY3QsIFNFR1BUUiB3aW5wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVDVDE2ICpuZXdDbGllbnRSZWN0ICkKIHsKLSAgICBOQ0NBTENTSVpFX1BBUkFNUyBwYXJhbXM7CisgICAgTkNDQUxDU0laRV9QQVJBTVMxNiAqcGFyYW1zOwogICAgIExPTkcgcmVzdWx0OwogCi0gICAgcGFyYW1zLnJncmNbMF0gPSAqbmV3V2luZG93UmVjdDsKKyAgICBpZiAoIShwYXJhbXMgPSBTRUdQVFJfTkVXKE5DQ0FMQ1NJWkVfUEFSQU1TMTYpKSkgcmV0dXJuIDA7CisgICAgcGFyYW1zLT5yZ3JjWzBdID0gKm5ld1dpbmRvd1JlY3Q7CiAgICAgaWYgKGNhbGNWYWxpZFJlY3QpCiAgICAgewotCXBhcmFtcy5yZ3JjWzFdID0gKm9sZFdpbmRvd1JlY3Q7Ci0JcGFyYW1zLnJncmNbMl0gPSAqb2xkQ2xpZW50UmVjdDsKLQlwYXJhbXMubHBwb3MgPSB3aW5wb3M7CisJcGFyYW1zLT5yZ3JjWzFdID0gKm9sZFdpbmRvd1JlY3Q7CisJcGFyYW1zLT5yZ3JjWzJdID0gKm9sZENsaWVudFJlY3Q7CisJcGFyYW1zLT5scHBvcyA9IHdpbnBvczsKICAgICB9CiAgICAgcmVzdWx0ID0gU2VuZE1lc3NhZ2UoIGh3bmQsIFdNX05DQ0FMQ1NJWkUsIGNhbGNWYWxpZFJlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChMUEFSQU0pTUFLRV9TRUdQVFIoICZwYXJhbXMgKSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBBUkFNKVNFR1BUUl9HRVQoIHBhcmFtcyApICk7CiAgICAgZHByaW50Zl93aW4oc3RkZGViLCAiV0lOUE9TX1NlbmROQ0NhbGNTaXplOiAlZCAlZCAlZCAlZFxuIiwKLQkJKGludClwYXJhbXMucmdyY1swXS50b3AsICAgIChpbnQpcGFyYW1zLnJncmNbMF0ubGVmdCwKLQkJKGludClwYXJhbXMucmdyY1swXS5ib3R0b20sIChpbnQpcGFyYW1zLnJncmNbMF0ucmlnaHQpOwotICAgICpuZXdDbGllbnRSZWN0ID0gcGFyYW1zLnJncmNbMF07CisJCShpbnQpcGFyYW1zLT5yZ3JjWzBdLnRvcCwgICAgKGludClwYXJhbXMtPnJncmNbMF0ubGVmdCwKKwkJKGludClwYXJhbXMtPnJncmNbMF0uYm90dG9tLCAoaW50KXBhcmFtcy0+cmdyY1swXS5yaWdodCk7CisgICAgKm5ld0NsaWVudFJlY3QgPSBwYXJhbXMtPnJncmNbMF07CisgICAgU0VHUFRSX0ZSRUUocGFyYW1zKTsKICAgICByZXR1cm4gcmVzdWx0OwogfQogCkBAIC04ODIsOSArMTA3OSw5IEBACiAgKgogICogRGVmYXVsdCBoYW5kbGluZyBmb3IgYSBXTV9XSU5ET1dQT1NDSEFOR0lORy4gQ2FsbGVkIGZyb20gRGVmV2luZG93UHJvYygpLgogICovCi1MT05HIFdJTlBPU19IYW5kbGVXaW5kb3dQb3NDaGFuZ2luZyggV0lORE9XUE9TICp3aW5wb3MgKQorTE9ORyBXSU5QT1NfSGFuZGxlV2luZG93UG9zQ2hhbmdpbmcoIFdJTkRPV1BPUzE2ICp3aW5wb3MgKQogewotICAgIFBPSU5UIG1heFNpemU7CisgICAgUE9JTlQxNiBtYXhTaXplOwogICAgIFdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIHdpbnBvcy0+aHduZCApOwogICAgIGlmICghd25kUHRyIHx8ICh3aW5wb3MtPmZsYWdzICYgU1dQX05PU0laRSkpIHJldHVybiAwOwogICAgIGlmICgod25kUHRyLT5kd1N0eWxlICYgV1NfVEhJQ0tGUkFNRSkgfHwKQEAgLTk0NSwxMSArMTE0MiwxMSBAQAogICAgICAgICBwV25kQ3VyID0gd25kUHRyLT5uZXh0OwogICAgICAgICB3aGlsZSAocFduZEN1ciAhPSBwV25kUHJldkFmdGVyKQogICAgICAgICB7Ci0gICAgICAgICAgICBSRUNUIHJlY3QgPSBwV25kQ3VyLT5yZWN0V2luZG93OwotICAgICAgICAgICAgT2Zmc2V0UmVjdCggJnJlY3QsIC13bmRQdHItPnJlY3RDbGllbnQubGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC13bmRQdHItPnJlY3RDbGllbnQudG9wICk7Ci0gICAgICAgICAgICBSZWRyYXdXaW5kb3coIGh3bmQsICZyZWN0LCAwLCBSRFdfSU5WQUxJREFURSB8IFJEV19BTExDSElMRFJFTiB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIFJEV19GUkFNRSB8IFJEV19FUkFTRSApOworICAgICAgICAgICAgUkVDVDE2IHJlY3QgPSBwV25kQ3VyLT5yZWN0V2luZG93OworICAgICAgICAgICAgT2Zmc2V0UmVjdDE2KCAmcmVjdCwgLXduZFB0ci0+cmVjdENsaWVudC5sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAtd25kUHRyLT5yZWN0Q2xpZW50LnRvcCApOworICAgICAgICAgICAgUmVkcmF3V2luZG93MTYoIGh3bmQsICZyZWN0LCAwLCBSRFdfSU5WQUxJREFURSB8IFJEV19BTExDSElMRFJFTiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkRXX0ZSQU1FIHwgUkRXX0VSQVNFICk7CiAgICAgICAgICAgICBwV25kQ3VyID0gcFduZEN1ci0+bmV4dDsKICAgICAgICAgfQogICAgIH0KQEAgLTk2MCwxMSArMTE1NywxMSBAQAogICAgICAgICBXSU5fTGlua1dpbmRvdyggaHduZCwgaHduZEFmdGVyICk7CiAgICAgICAgIHdoaWxlIChwV25kQ3VyICE9IHduZFB0cikKICAgICAgICAgewotICAgICAgICAgICAgUkVDVCByZWN0ID0gd25kUHRyLT5yZWN0V2luZG93OwotICAgICAgICAgICAgT2Zmc2V0UmVjdCggJnJlY3QsIC1wV25kQ3VyLT5yZWN0Q2xpZW50LmxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAtcFduZEN1ci0+cmVjdENsaWVudC50b3AgKTsKLSAgICAgICAgICAgIFJlZHJhd1dpbmRvdyggcFduZEN1ci0+aHduZFNlbGYsICZyZWN0LCAwLCBSRFdfSU5WQUxJREFURSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIFJEV19BTExDSElMRFJFTiB8IFJEV19GUkFNRSB8IFJEV19FUkFTRSApOworICAgICAgICAgICAgUkVDVDE2IHJlY3QgPSB3bmRQdHItPnJlY3RXaW5kb3c7CisgICAgICAgICAgICBPZmZzZXRSZWN0MTYoICZyZWN0LCAtcFduZEN1ci0+cmVjdENsaWVudC5sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAtcFduZEN1ci0+cmVjdENsaWVudC50b3AgKTsKKyAgICAgICAgICAgIFJlZHJhd1dpbmRvdzE2KCBwV25kQ3VyLT5od25kU2VsZiwgJnJlY3QsIDAsIFJEV19JTlZBTElEQVRFIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRFdfQUxMQ0hJTERSRU4gfCBSRFdfRlJBTUUgfCBSRFdfRVJBU0UgKTsKICAgICAgICAgICAgIHBXbmRDdXIgPSBwV25kQ3VyLT5uZXh0OwogICAgICAgICB9CiAgICAgfQpAQCAtMTA1NCw3ICsxMjUxLDcgQEAKICAqIHVwZGF0ZSByZWdpb25zIGFyZSBpbiB3aW5kb3cgY2xpZW50IGNvb3JkaW5hdGVzCiAgKiBjbGllbnQgYW5kIHdpbmRvdyByZWN0YW5nbGVzIGFyZSBpbiBwYXJlbnQgY2xpZW50IGNvb3JkaW5hdGVzCiAgKi8KLXN0YXRpYyB2b2lkIFdJTlBPU19TaXplTW92ZUNsZWFuKFdORCogV25kLCBIUkdOIG9sZFZpc1JnbiwgTFBSRUNUIGxwT2xkV25kUmVjdCwgTFBSRUNUIGxwT2xkQ2xpZW50UmVjdCwgQk9PTCBiTm9Db3B5ICkKK3N0YXRpYyB2b2lkIFdJTlBPU19TaXplTW92ZUNsZWFuKFdORCogV25kLCBIUkdOIG9sZFZpc1JnbiwgTFBSRUNUMTYgbHBPbGRXbmRSZWN0LCBMUFJFQ1QxNiBscE9sZENsaWVudFJlY3QsIEJPT0wgYk5vQ29weSApCiB7CiAgSFJHTiBuZXdWaXNSZ24gICAgPSBEQ0VfR2V0VmlzUmduKFduZC0+aHduZFNlbGYsIERDWF9XSU5ET1cgfCBEQ1hfQ0xJUFNJQkxJTkdTICk7CiAgSFJHTiBkaXJ0eVJnbiAgICAgPSBDcmVhdGVSZWN0UmduKDAsMCwwLDApOwpAQCAtMTA5OSw3ICsxMjk2LDcgQEAKIAogIGlmKCBiTm9Db3B5ICkJCS8qIGludmFsaWRhdGUgV25kIHZpc2libGUgcmVnaW9uICovCiAgICB7Ci0gICAgIGlmIChteSAhPSBOVUxMUkVHSU9OKSAgUmVkcmF3V2luZG93KCBXbmQtPmh3bmRTZWxmLCBOVUxMLCBuZXdWaXNSZ24sIFJEV19JTlZBTElEQVRFIHwKKyAgICAgaWYgKG15ICE9IE5VTExSRUdJT04pICBSZWRyYXdXaW5kb3czMiggV25kLT5od25kU2VsZiwgTlVMTCwgbmV3VmlzUmduLCBSRFdfSU5WQUxJREFURSB8CiAJCSAgICAgICAgICAgIFJEV19GUkFNRSB8IFJEV19BTExDSElMRFJFTiB8IFJEV19FUkFTRSApOwogICAgfSAKICBlbHNlCQkJLyogYml0Ymx0IG9sZCBjbGllbnQgYXJlYSAqLwpAQCAtMTE1MCwxNiArMTM0NywxNiBAQAogICAgICAgIH0KIAogICAgICBpZiggdXBkYXRlICE9IE5VTExSRUdJT04gKQotICAgICAgICAgUmVkcmF3V2luZG93KCBXbmQtPmh3bmRTZWxmLCBOVUxMLCB1cGRhdGVSZ24sIFJEV19JTlZBTElEQVRFIHwKLSAJCQkJICAgICAgUkRXX0ZSQU1FIHwgUkRXX0FMTENISUxEUkVOIHwgUkRXX0VSQVNFICk7CisgICAgICAgICBSZWRyYXdXaW5kb3czMiggV25kLT5od25kU2VsZiwgTlVMTCwgdXBkYXRlUmduLCBSRFdfSU5WQUxJREFURSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgUkRXX0ZSQU1FIHwgUkRXX0FMTENISUxEUkVOIHwgUkRXX0VSQVNFICk7CiAgICAgIERlbGV0ZU9iamVjdCggdXBkYXRlUmduICk7CiAgICB9CiAKICAvKiBlcmFzZSB1bmNvdmVyZWQgYXJlYXMgKi8KIAogIGlmKCBvdGhlciAhPSBOVUxMUkVHSU9OICkKLSAgICAgUmVkcmF3V2luZG93KCBXbmQtPnBhcmVudC0+aHduZFNlbGYsIE5VTEwsIGRpcnR5UmduLAotCQkgICBSRFdfSU5WQUxJREFURSB8IFJEV19BTExDSElMRFJFTiB8IFJEV19FUkFTRSApOworICAgICBSZWRyYXdXaW5kb3czMiggV25kLT5wYXJlbnQtPmh3bmRTZWxmLCBOVUxMLCBkaXJ0eVJnbiwKKyAgICAgICAgICAgICAgICAgICAgIFJEV19JTlZBTElEQVRFIHwgUkRXX0FMTENISUxEUkVOIHwgUkRXX0VSQVNFICk7CiAKICBEZWxldGVPYmplY3QoZGlydHlSZ24pOwogIERlbGV0ZU9iamVjdChuZXdWaXNSZ24pOwpAQCAtMTE3MCw3ICsxMzY3LDcgQEAKICAqCiAgKiBTZXRXaW5kb3dQb3MoKSBmb3IgYW4gWCB3aW5kb3cuIFVzZWQgYnkgdGhlIHJlYWwgU2V0V2luZG93UG9zKCkuCiAgKi8KLXN0YXRpYyB2b2lkIFdJTlBPU19TZXRYV2luZG93UG9zKCBXSU5ET1dQT1MgKndpbnBvcyApCitzdGF0aWMgdm9pZCBXSU5QT1NfU2V0WFdpbmRvd1BvcyggV0lORE9XUE9TMTYgKndpbnBvcyApCiB7CiAgICAgWFdpbmRvd0NoYW5nZXMgd2luQ2hhbmdlczsKICAgICBpbnQgY2hhbmdlTWFzayA9IDA7CkBAIC0xMjEyLDkgKzE0MDksOSBAQAogQk9PTCBTZXRXaW5kb3dQb3MoIEhXTkQgaHduZCwgSFdORCBod25kSW5zZXJ0QWZ0ZXIsIElOVCB4LCBJTlQgeSwKIAkJICAgSU5UIGN4LCBJTlQgY3ksIFdPUkQgZmxhZ3MgKQogewotICAgIFdJTkRPV1BPUyAJd2lucG9zOworICAgIFdJTkRPV1BPUzE2IHdpbnBvczsKICAgICBXTkQgKgl3bmRQdHI7Ci0gICAgUkVDVCAJbmV3V2luZG93UmVjdCwgbmV3Q2xpZW50UmVjdDsKKyAgICBSRUNUMTYgCW5ld1dpbmRvd1JlY3QsIG5ld0NsaWVudFJlY3Q7CiAgICAgSFJHTgl2aXNSZ24gPSAwOwogICAgIGludCAJcmVzdWx0ID0gMDsKIApAQCAtMTMwMyw4ICsxNTAwLDggQEAKICAgICAgICAgbmV3V2luZG93UmVjdC5yaWdodCAgKz0gd2lucG9zLnggLSB3bmRQdHItPnJlY3RXaW5kb3cubGVmdDsKICAgICAgICAgbmV3V2luZG93UmVjdC5ib3R0b20gKz0gd2lucG9zLnkgLSB3bmRQdHItPnJlY3RXaW5kb3cudG9wOwogCi0JT2Zmc2V0UmVjdCgmbmV3Q2xpZW50UmVjdCwgd2lucG9zLnggLSB3bmRQdHItPnJlY3RXaW5kb3cubGVmdCwgCi0JCQkJICAgd2lucG9zLnkgLSB3bmRQdHItPnJlY3RXaW5kb3cudG9wICk7CisJT2Zmc2V0UmVjdDE2KCAmbmV3Q2xpZW50UmVjdCwgd2lucG9zLnggLSB3bmRQdHItPnJlY3RXaW5kb3cubGVmdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbnBvcy55IC0gd25kUHRyLT5yZWN0V2luZG93LnRvcCApOwogICAgIH0KIAogICAgIHdpbnBvcy5mbGFncyB8PSBTV1BfTk9DTElFTlRNT1ZFIHwgU1dQX05PQ0xJRU5UU0laRTsKQEAgLTEzNjAsOCArMTU1Nyw4IEBACiAKICAgICBpZiAod25kUHRyLT53aW5kb3cpCiAgICAgewotICAgICAgICBSRUNUIG9sZFdpbmRvd1JlY3QgPSB3bmRQdHItPnJlY3RXaW5kb3c7Ci0gICAgICAgIFJFQ1Qgb2xkQ2xpZW50UmVjdCA9IHduZFB0ci0+cmVjdENsaWVudDsKKyAgICAgICAgUkVDVDE2IG9sZFdpbmRvd1JlY3QgPSB3bmRQdHItPnJlY3RXaW5kb3c7CisgICAgICAgIFJFQ1QxNiBvbGRDbGllbnRSZWN0ID0gd25kUHRyLT5yZWN0Q2xpZW50OwogCiAgICAgICAgIEhXTkQgYm9ndXNJbnNlcnRBZnRlciA9IHdpbnBvcy5od25kSW5zZXJ0QWZ0ZXI7CiAKQEAgLTEzNzksMzYgKzE1NzYsMzggQEAKIAkgICAgKG9sZENsaWVudFJlY3QudG9wIC0gb2xkV2luZG93UmVjdC50b3AgIT0KIAkgICAgIG5ld0NsaWVudFJlY3QudG9wIC0gbmV3V2luZG93UmVjdC50b3ApICkKIAotCSAgICBSZWRyYXdXaW5kb3cod25kUHRyLT5od25kU2VsZiwgTlVMTCwgMCwgUkRXX0FMTENISUxEUkVOIHwgUkRXX0ZSQU1FIHwgUkRXX0VSQVNFKTsKKwkgICAgUmVkcmF3V2luZG93MzIoIHduZFB0ci0+aHduZFNlbGYsIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkRXX0FMTENISUxEUkVOIHwgUkRXX0ZSQU1FIHwgUkRXX0VSQVNFICk7CiAJZWxzZQogCSAgICBpZiggd2lucG9zLmZsYWdzICYgU1dQX0ZSQU1FQ0hBTkdFRCApCiAJICAgICAgewogCQlXT1JEIHdFcmFzZSA9IDA7Ci0JCVJFQ1QgcmVjdDsKKwkJUkVDVDMyIHJlY3Q7CiAKIAkgICAgICAgIGlmKCBvbGRDbGllbnRSZWN0LnJpZ2h0ID4gbmV3Q2xpZW50UmVjdC5yaWdodCApIAotCQkgIHsKKyAgICAgICAgICAgICAgICB7CiAJCSAgICByZWN0LmxlZnQgPSBuZXdDbGllbnRSZWN0LnJpZ2h0OyByZWN0LnRvcCA9IG5ld0NsaWVudFJlY3QudG9wOwogCQkgICAgcmVjdC5yaWdodCA9IG9sZENsaWVudFJlY3QucmlnaHQ7IHJlY3QuYm90dG9tID0gbmV3Q2xpZW50UmVjdC5ib3R0b207CiAJCSAgICB3RXJhc2UgPSAxOwotCQkgICAgUmVkcmF3V2luZG93KHduZFB0ci0+aHduZFNlbGYsICZyZWN0LCAwLCBSRFdfSU5WQUxJREFURSB8IFJEV19GUkFNRSB8IFJEV19BTExDSElMRFJFTik7Ci0JCSAgfQorCQkgICAgUmVkcmF3V2luZG93MzIoIHduZFB0ci0+aHduZFNlbGYsICZyZWN0LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRFdfSU5WQUxJREFURSB8IFJEV19GUkFNRSB8IFJEV19BTExDSElMRFJFTiApOworICAgICAgICAgICAgICAgIH0KIAkJaWYoIG9sZENsaWVudFJlY3QuYm90dG9tID4gbmV3Q2xpZW50UmVjdC5ib3R0b20gKQotCQkgIHsKKyAgICAgICAgICAgICAgICB7CiAJCSAgICByZWN0LmxlZnQgPSBuZXdDbGllbnRSZWN0LmxlZnQ7IHJlY3QudG9wID0gbmV3Q2xpZW50UmVjdC5ib3R0b207CiAJCSAgICByZWN0LnJpZ2h0ID0gKHdFcmFzZSk/b2xkQ2xpZW50UmVjdC5yaWdodDpuZXdDbGllbnRSZWN0LnJpZ2h0OwogCQkgICAgcmVjdC5ib3R0b20gPSBvbGRDbGllbnRSZWN0LmJvdHRvbTsKIAkJICAgIHdFcmFzZSA9IDE7Ci0JCSAgICBSZWRyYXdXaW5kb3cod25kUHRyLT5od25kU2VsZiwgJnJlY3QsIDAsIFJEV19JTlZBTElEQVRFIHwgUkRXX0ZSQU1FIHwgUkRXX0FMTENISUxEUkVOKTsKLQkJICB9Ci0KKwkJICAgIFJlZHJhd1dpbmRvdzMyKCB3bmRQdHItPmh3bmRTZWxmLCAmcmVjdCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkRXX0lOVkFMSURBVEUgfCBSRFdfRlJBTUUgfCBSRFdfQUxMQ0hJTERSRU4gKTsKKyAgICAgICAgICAgICAgICB9CiAJCWlmKCAhd0VyYXNlICkgd25kUHRyLT5mbGFncyB8PSBXSU5fTkVFRFNfTkNQQUlOVDsKIAkgICAgICB9CiAgICAgfQogICAgIGVsc2UKICAgICB7Ci0gICAgICAgIFJFQ1Qgb2xkV2luZG93UmVjdCA9IHduZFB0ci0+cmVjdFdpbmRvdzsKLQlSRUNUIG9sZENsaWVudFJlY3QgPSB3bmRQdHItPnJlY3RDbGllbnQ7CisgICAgICAgIFJFQ1QxNiBvbGRXaW5kb3dSZWN0ID0gd25kUHRyLT5yZWN0V2luZG93OworCVJFQ1QxNiBvbGRDbGllbnRSZWN0ID0gd25kUHRyLT5yZWN0Q2xpZW50OwogCiAgICAgICAgIHduZFB0ci0+cmVjdFdpbmRvdyA9IG5ld1dpbmRvd1JlY3Q7CiAgICAgICAgIHduZFB0ci0+cmVjdENsaWVudCA9IG5ld0NsaWVudFJlY3Q7CkBAIC0xNDI3LDcgKzE2MjYsNyBAQAogCSAgICAgIH0KIAkgICAgZWxzZQogCSAgICAgICBpZiggd2lucG9zLmZsYWdzICYgU1dQX0ZSQU1FQ0hBTkdFRCApCi0gICAgICAgIAkgIFJlZHJhd1dpbmRvdyggd2lucG9zLmh3bmQsIE5VTEwsIDAsIFJEV19OT0NISUxEUkVOIHwgUkRXX0ZSQU1FICk7IAorICAgICAgICAJICBSZWRyYXdXaW5kb3czMiggd2lucG9zLmh3bmQsIE5VTEwsIDAsIFJEV19OT0NISUxEUkVOIHwgUkRXX0ZSQU1FICk7IAogCiAJICB9CiAgICAgICAgIERlbGV0ZU9iamVjdCh2aXNSZ24pOwpAQCAtMTQ0Myw5ICsxNjQyLDkgQEAKICAgICAgICAgZWxzZQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIShmbGFncyAmIFNXUF9OT1JFRFJBVykpCi0gICAgICAgICAgICAgICAgUmVkcmF3V2luZG93KCB3aW5wb3MuaHduZCwgTlVMTCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJEV19JTlZBTElEQVRFIHwgUkRXX0FMTENISUxEUkVOIHwKLQkJCSAgICAgIFJEV19GUkFNRSB8IFJEV19FUkFTRSApOworICAgICAgICAgICAgICAgIFJlZHJhd1dpbmRvdzMyKCB3aW5wb3MuaHduZCwgTlVMTCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkRXX0lOVkFMSURBVEUgfCBSRFdfQUxMQ0hJTERSRU4gfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRFdfRlJBTUUgfCBSRFdfRVJBU0UgKTsKICAgICAgICAgfQogICAgIH0KICAgICBlbHNlIGlmIChmbGFncyAmIFNXUF9ISURFV0lORE9XKQpAQCAtMTQ1OCw4ICsxNjU3LDggQEAKICAgICAgICAgZWxzZQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIShmbGFncyAmIFNXUF9OT1JFRFJBVykpCi0gICAgICAgICAgICAgICAgUmVkcmF3V2luZG93KCB3bmRQdHItPnBhcmVudC0+aHduZFNlbGYsICZ3bmRQdHItPnJlY3RXaW5kb3csIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRFdfSU5WQUxJREFURSB8IFJEV19BTExDSElMRFJFTiB8IFJEV19FUkFTRSApOworICAgICAgICAgICAgICAgIFJlZHJhd1dpbmRvdzE2KCB3bmRQdHItPnBhcmVudC0+aHduZFNlbGYsICZ3bmRQdHItPnJlY3RXaW5kb3csIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJEV19JTlZBTElEQVRFIHwgUkRXX0FMTENISUxEUkVOIHwgUkRXX0VSQVNFICk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoKHdpbnBvcy5od25kID09IEdldEZvY3VzKCkpIHx8IElzQ2hpbGQod2lucG9zLmh3bmQsIEdldEZvY3VzKCkpKQpAQCAtMTQ5MSw4ICsxNjkwLDggQEAKICAgICBFVkVOVF9EdW1teU1vdGlvbk5vdGlmeSgpOyAvKiBTaW11bGF0ZSBhIG1vdXNlIGV2ZW50IHRvIHNldCB0aGUgY3Vyc29yICovCiAKICAgICBpZiAoIShmbGFncyAmIFNXUF9ERUZFUkVSQVNFKSkKLSAgICAgICAgUmVkcmF3V2luZG93KCB3bmRQdHItPnBhcmVudC0+aHduZFNlbGYsIE5VTEwsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgUkRXX0FMTENISUxEUkVOIHwgUkRXX0VSQVNFTk9XICk7CisgICAgICAgIFJlZHJhd1dpbmRvdzMyKCB3bmRQdHItPnBhcmVudC0+aHduZFNlbGYsIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBSRFdfQUxMQ0hJTERSRU4gfCBSRFdfRVJBU0VOT1cgKTsKIAogICAgICAgLyogQW5kIGxhc3QsIHNlbmQgdGhlIFdNX1dJTkRPV1BPU0NIQU5HRUQgbWVzc2FnZSAqLwogCkBAIC0xNTA3LDEzICsxNzA2LDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBCZWdpbkRlZmVyV2luZG93UG9zICAgKFVTRVIuMjU5KQogICovCi1IRFdQIEJlZ2luRGVmZXJXaW5kb3dQb3MoIElOVCBjb3VudCApCitIRFdQMTYgQmVnaW5EZWZlcldpbmRvd1BvcyggSU5UIGNvdW50ICkKIHsKLSAgICBIRFdQIGhhbmRsZTsKKyAgICBIRFdQMTYgaGFuZGxlOwogICAgIERXUCAqcERXUDsKIAogICAgIGlmIChjb3VudCA8PSAwKSByZXR1cm4gMDsKLSAgICBoYW5kbGUgPSBVU0VSX0hFQVBfQUxMT0MoIHNpemVvZihEV1ApICsgKGNvdW50LTEpKnNpemVvZihXSU5ET1dQT1MpICk7CisgICAgaGFuZGxlID0gVVNFUl9IRUFQX0FMTE9DKCBzaXplb2YoRFdQKSArIChjb3VudC0xKSpzaXplb2YoV0lORE9XUE9TMTYpICk7CiAgICAgaWYgKCFoYW5kbGUpIHJldHVybiAwOwogICAgIHBEV1AgPSAoRFdQICopIFVTRVJfSEVBUF9MSU5fQUREUiggaGFuZGxlICk7CiAgICAgcERXUC0+YWN0dWFsQ291bnQgICAgPSAwOwpAQCAtMTUyOCwxMiArMTcyNywxMiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgRGVmZXJXaW5kb3dQb3MgICAoVVNFUi4yNjApCiAgKi8KLUhEV1AgRGVmZXJXaW5kb3dQb3MoIEhEV1AgaGR3cCwgSFdORCBod25kLCBIV05EIGh3bmRBZnRlciwgSU5UIHgsIElOVCB5LAotICAgICAgICAgICAgICAgICAgICAgSU5UIGN4LCBJTlQgY3ksIFVJTlQgZmxhZ3MgKQorSERXUDE2IERlZmVyV2luZG93UG9zKCBIRFdQMTYgaGR3cCwgSFdORCBod25kLCBIV05EIGh3bmRBZnRlciwgSU5UIHgsIElOVCB5LAorICAgICAgICAgICAgICAgICAgICAgICBJTlQgY3gsIElOVCBjeSwgVUlOVCBmbGFncyApCiB7CiAgICAgRFdQICpwRFdQOwogICAgIGludCBpOwotICAgIEhEV1AgbmV3aGR3cCA9IGhkd3A7CisgICAgSERXUDE2IG5ld2hkd3AgPSBoZHdwOwogICAgIEhXTkQgcGFyZW50OwogCiAgICAgcERXUCA9IChEV1AgKikgVVNFUl9IRUFQX0xJTl9BRERSKCBoZHdwICk7CkBAIC0xNTgxLDcgKzE3ODAsNyBAQAogICAgIGlmIChwRFdQLT5hY3R1YWxDb3VudCA+PSBwRFdQLT5zdWdnZXN0ZWRDb3VudCkKICAgICB7CiAgICAgICAgIG5ld2hkd3AgPSBVU0VSX0hFQVBfUkVBTExPQyggaGR3cCwKLSAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoRFdQKSArIHBEV1AtPnN1Z2dlc3RlZENvdW50KnNpemVvZihXSU5ET1dQT1MpICk7CisgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKERXUCkgKyBwRFdQLT5zdWdnZXN0ZWRDb3VudCpzaXplb2YoV0lORE9XUE9TMTYpICk7CiAgICAgICAgIGlmICghbmV3aGR3cCkgcmV0dXJuIDA7CiAgICAgICAgIHBEV1AgPSAoRFdQICopIFVTRVJfSEVBUF9MSU5fQUREUiggbmV3aGR3cCApOwogICAgICAgICBwRFdQLT5zdWdnZXN0ZWRDb3VudCsrOwpAQCAtMTYwMSwxMCArMTgwMCwxMCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgRW5kRGVmZXJXaW5kb3dQb3MgICAoVVNFUi4yNjEpCiAgKi8KLUJPT0wgRW5kRGVmZXJXaW5kb3dQb3MoIEhEV1AgaGR3cCApCitCT09MIEVuZERlZmVyV2luZG93UG9zKCBIRFdQMTYgaGR3cCApCiB7CiAgICAgRFdQICpwRFdQOwotICAgIFdJTkRPV1BPUyAqd2lucG9zOworICAgIFdJTkRPV1BPUzE2ICp3aW5wb3M7CiAgICAgQk9PTCByZXMgPSBUUlVFOwogICAgIGludCBpOwogCmRpZmYgLS1naXQgYS93aW5kb3dzL3dpbnByb2MuYyBiL3dpbmRvd3Mvd2lucHJvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMjViMjAKLS0tIC9kZXYvbnVsbAorKysgYi93aW5kb3dzL3dpbnByb2MuYwpAQCAtMCwwICsxLDQwNSBAQAorLyoKKyAqIFdpbmRvdyBwcm9jZWR1cmUgY2FsbGJhY2tzCisgKgorICogQ29weXJpZ2h0IDE5OTUgTWFydGluIHZvbiBMb2V3aXMKKyAqIENvcHlyaWdodCAxOTk2IEFsZXhhbmRyZSBKdWxsaWFyZAorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIndpbmRvd3MuaCIKKyNpbmNsdWRlICJhbGlhcy5oIgorI2luY2x1ZGUgImNhbGxiYWNrLmgiCisjaW5jbHVkZSAiaGVhcC5oIgorI2luY2x1ZGUgImxkdC5oIgorI2luY2x1ZGUgInN0YWNrZnJhbWUuaCIKKyNpbmNsdWRlICJzdHJ1Y3QzMi5oIgorI2luY2x1ZGUgIndpbi5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkgICAgIFdJTlBST0NfQ2FsbFByb2MxNlRvMzIKKyAqCisgKiBDYWxsIGEgMzItYml0IHdpbmRvdyBwcm9jZWR1cmUsIHRyYW5zbGF0aW5nIHRoZSAxNi1iaXQgYXJncy4KKyAqLworc3RhdGljIExSRVNVTFQgV0lOUFJPQ19DYWxsUHJvYzE2VG8zMiggV05EUFJPQzMyIGZ1bmMsIEhXTkQxNiBod25kLCBVSU5UMTYgbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1BBUkFNMTYgd1BhcmFtLCBMUEFSQU0gbFBhcmFtICkKK3sKKyAgICBMUkVTVUxUIHJlc3VsdDsKKworICAgIHN3aXRjaChtc2cpCisgICAgeworICAgIGNhc2UgV01fQUNUSVZBVEU6CisgICAgY2FzZSBXTV9DSEFSVE9JVEVNOgorICAgIGNhc2UgV01fQ09NTUFORDoKKyAgICBjYXNlIFdNX0hTQ1JPTEw6CisgICAgY2FzZSBXTV9WS0VZVE9JVEVNOgorICAgIGNhc2UgV01fVlNDUk9MTDoKKyAgICAgICAgcmV0dXJuIENhbGxXbmRQcm9jMzIoIGZ1bmMsIGh3bmQsIG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BS0VXUEFSQU0oIHdQYXJhbSwgSElXT1JEKGxQYXJhbSkgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMUEFSQU0pKEhXTkQzMilMT1dPUkQobFBhcmFtKSApOworICAgIGNhc2UgV01fQ1RMQ09MT1I6CisgICAgICAgIHJldHVybiBDYWxsV25kUHJvYzMyKCBmdW5jLCBod25kLCBXTV9DVExDT0xPUk1TR0JPWCArIEhJV09SRChsUGFyYW0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdQQVJBTTMyKShIREMzMil3UGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBBUkFNKShIV05EMzIpTE9XT1JEKGxQYXJhbSkgKTsKKyAgICBjYXNlIFdNX0dFVE1JTk1BWElORk86CisgICAgICAgIHsKKyAgICAgICAgICAgIE1JTk1BWElORk8zMiBtbWk7CisgICAgICAgICAgICBTVFJVQ1QzMl9NSU5NQVhJTkZPMTZ0bzMyKCAoTUlOTUFYSU5GTzE2ICopUFRSX1NFR19UT19MSU4obFBhcmFtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtbWkgKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IENhbGxXbmRQcm9jMzIoIGZ1bmMsIGh3bmQsIG1zZywgd1BhcmFtLCAoTFBBUkFNKSZtbWkpOworICAgICAgICAgICAgU1RSVUNUMzJfTUlOTUFYSU5GTzMydG8xNiggJm1taSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNSU5NQVhJTkZPMTYgKilQVFJfU0VHX1RPX0xJTihsUGFyYW0pKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworCisgICAgY2FzZSBXTV9HRVRURVhUOgorICAgICAgICAvKiBGSVhNRTogVW5pY29kZSAqLworICAgICAgICByZXR1cm4gQ2FsbFduZFByb2MzMiggZnVuYywgaHduZCwgbXNnLCB3UGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBBUkFNKVBUUl9TRUdfVE9fTElOKGxQYXJhbSkgKTsKKyAgICBjYXNlIFdNX01ESVNFVE1FTlU6CisgICAgICAgIHJldHVybiBDYWxsV25kUHJvYzMyKCBmdW5jLCBod25kLCBtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV1BBUkFNMzIpKEhNRU5VMzIpTE9XT1JEKGxQYXJhbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBBUkFNKShITUVOVTMyKUhJV09SRChsUGFyYW0pICk7CisgICAgY2FzZSBXTV9NRU5VQ0hBUjoKKyAgICBjYXNlIFdNX01FTlVTRUxFQ1Q6CisgICAgICAgIHJldHVybiBDYWxsV25kUHJvYzMyKCBmdW5jLCBod25kLCBtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQUtFV1BBUkFNKCB3UGFyYW0sIExPV09SRChsUGFyYW0pICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBBUkFNKShITUVOVTMyKUhJV09SRChsUGFyYW0pICk7CisgICAgY2FzZSBXTV9OQ0NBTENTSVpFOgorICAgICAgICB7CisgICAgICAgICAgICBOQ0NBTENTSVpFX1BBUkFNUzE2ICpwbmMxNjsKKyAgICAgICAgICAgIE5DQ0FMQ1NJWkVfUEFSQU1TMzIgbmM7CisgICAgICAgICAgICBXSU5ET1dQT1MzMiB3cDsKKworICAgICAgICAgICAgcG5jMTYgPSAoTkNDQUxDU0laRV9QQVJBTVMxNiAqKVBUUl9TRUdfVE9fTElOKGxQYXJhbSk7CisgICAgICAgICAgICBDT05WX1JFQ1QxNlRPMzIoICZwbmMxNi0+cmdyY1swXSwgJm5jLnJncmNbMF0gKTsKKyAgICAgICAgICAgIGlmICh3UGFyYW0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ09OVl9SRUNUMTZUTzMyKCAmcG5jMTYtPnJncmNbMV0sICZuYy5yZ3JjWzFdICk7CisgICAgICAgICAgICAgICAgQ09OVl9SRUNUMTZUTzMyKCAmcG5jMTYtPnJncmNbMl0sICZuYy5yZ3JjWzJdICk7CisgICAgICAgICAgICAgICAgU1RSVUNUMzJfV0lORE9XUE9TMTZ0bzMyKCAoV0lORE9XUE9TMTYgKilQVFJfU0VHX1RPX0xJTihwbmMxNi0+bHBwb3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndwICk7CisgICAgICAgICAgICAgICAgbmMubHBwb3MgPSAmd3A7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJlc3VsdCA9IENhbGxXbmRQcm9jMzIoIGZ1bmMsIGh3bmQsIG1zZywgd1BhcmFtLCAoTFBBUkFNKSZuYyApOworCisgICAgICAgICAgICBwbmMxNiA9IChOQ0NBTENTSVpFX1BBUkFNUzE2ICopUFRSX1NFR19UT19MSU4obFBhcmFtKTsKKyAgICAgICAgICAgIENPTlZfUkVDVDMyVE8xNiggJm5jLnJncmNbMF0sICZwbmMxNi0+cmdyY1swXSApOworICAgICAgICAgICAgaWYgKHdQYXJhbSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDT05WX1JFQ1QzMlRPMTYoICZuYy5yZ3JjWzFdLCAmcG5jMTYtPnJncmNbMV0gKTsKKyAgICAgICAgICAgICAgICBDT05WX1JFQ1QzMlRPMTYoICZuYy5yZ3JjWzJdLCAmcG5jMTYtPnJncmNbMl0gKTsKKyAgICAgICAgICAgICAgICBTVFJVQ1QzMl9XSU5ET1dQT1MzMnRvMTYoIG5jLmxwcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXSU5ET1dQT1MxNiAqKVBUUl9TRUdfVE9fTElOKHBuYzE2LT5scHBvcykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisJCisgICAgY2FzZSBXTV9OQ0NSRUFURToKKyAgICBjYXNlIFdNX0NSRUFURToKKyAgICAgICAgeworICAgICAgICAgICAgQ1JFQVRFU1RSVUNUMTYgKnBjczE2ID0gKENSRUFURVNUUlVDVDE2ICopUFRSX1NFR19UT19MSU4obFBhcmFtKTsKKyAgICAgICAgICAgIENSRUFURVNUUlVDVDMyQSBjczsKKworICAgICAgICAgICAgU1RSVUNUMzJfQ1JFQVRFU1RSVUNUMTZ0bzMyQSggcGNzMTYsICZjcyApOworICAgICAgICAgICAgLyogRklYTUU6IFVuaWNvZGUgKi8KKyAgICAgICAgICAgIGNzLmxwc3pOYW1lICAgICAgID0gKExQQ1NUUilQVFJfU0VHX1RPX0xJTihwY3MxNi0+bHBzek5hbWUpOworICAgICAgICAgICAgY3MubHBzekNsYXNzICAgICAgPSAoTFBDU1RSKVBUUl9TRUdfVE9fTElOKHBjczE2LT5scHN6Q2xhc3MpOworICAgICAgICAgICAgcmVzdWx0ID0gQ2FsbFduZFByb2MzMiggZnVuYywgaHduZCwgbXNnLCB3UGFyYW0sIChMUEFSQU0pJmNzICk7CisgICAgICAgICAgICBwY3MxNiA9IChDUkVBVEVTVFJVQ1QxNiAqKVBUUl9TRUdfVE9fTElOKGxQYXJhbSk7CisgICAgICAgICAgICBTVFJVQ1QzMl9DUkVBVEVTVFJVQ1QzMkF0bzE2KCAmY3MsIHBjczE2ICk7CisKKyAgICAgICAgICAgIGlmIChjcy5scHN6TmFtZSAhPSAoTFBDU1RSKVBUUl9TRUdfVE9fTElOKHBjczE2LT5scHN6TmFtZSkpCisgICAgICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiQ2FsbFdpbmRvd1Byb2MxNjogV01fTkNDUkVBVEUoJTA0eCkgY2hhbmdlZCBscHN6TmFtZSAoJXAtPiVwKSwgcGxlYXNlIHJlcG9ydC5cbiIsCisgICAgICAgICAgICAgICAgICAgIG1zZywgKExQQ1NUUilQVFJfU0VHX1RPX0xJTihwY3MxNi0+bHBzek5hbWUpLCBjcy5scHN6TmFtZSk7CisgICAgICAgICAgICBpZiAoY3MubHBzekNsYXNzICE9IChMUENTVFIpUFRSX1NFR19UT19MSU4ocGNzMTYtPmxwc3pDbGFzcykpCisgICAgICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiQ2FsbFdpbmRvd1Byb2MxNjogV01fTkNDUkVBVEUoJTA0eCkgY2hhbmdlZCBscHN6Q2xhc3MgKCVwLT4lcCksIHBsZWFzZSByZXBvcnQuXG4iLAorICAgICAgICAgICAgICAgICAgbXNnLCAoTFBDU1RSKVBUUl9TRUdfVE9fTElOKHBjczE2LT5scHN6Q2xhc3MpLCBjcy5scHN6Q2xhc3MpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisKKyAgICBjYXNlIFdNX1BBUkVOVE5PVElGWToKKyAgICAgICAgaWYgKCh3UGFyYW0gPT0gV01fQ1JFQVRFKSB8fCAod1BhcmFtID09IFdNX0RFU1RST1kpKQorICAgICAgICAgICAgcmV0dXJuIENhbGxXbmRQcm9jMzIoIGZ1bmMsIGh3bmQsIG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQUtFV1BBUkFNKCB3UGFyYW0sIEhJV09SRChsUGFyYW0pICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQQVJBTSkoSFdORDMyKUxPV09SRChsUGFyYW0pICk7CisgICAgICAgIGVsc2UgcmV0dXJuIENhbGxXbmRQcm9jMzIoIGZ1bmMsIGh3bmQsIG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFLRVdQQVJBTSggd1BhcmFtLCAwICAvKiBGSVhNRT8gKi8gKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbFBhcmFtICk7CisgICAgY2FzZSBXTV9TRVRURVhUOgorICAgICAgICAvKiBGSVhNRTogVW5pY29kZSAqLworICAgICAgICByZXR1cm4gQ2FsbFduZFByb2MzMiggZnVuYywgaHduZCwgbXNnLCB3UGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBBUkFNKVBUUl9TRUdfVE9fTElOKGxQYXJhbSkgKTsKKworICAgIGNhc2UgV01fV0lORE9XUE9TQ0hBTkdJTkc6CisgICAgY2FzZSBXTV9XSU5ET1dQT1NDSEFOR0VEOgorICAgICAgICB7CisgICAgICAgICAgICBXSU5ET1dQT1MzMiB3cDsKKyAgICAgICAgICAgIFNUUlVDVDMyX1dJTkRPV1BPUzE2dG8zMiggKFdJTkRPV1BPUzE2ICopUFRSX1NFR19UT19MSU4obFBhcmFtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndwICk7CisgICAgICAgICAgICByZXN1bHQgPSBDYWxsV25kUHJvYzMyKCBmdW5jLCBod25kLCBtc2csIHdQYXJhbSwgKExQQVJBTSkmd3AgKTsKKyAgICAgICAgICAgIFNUUlVDVDMyX1dJTkRPV1BPUzMydG8xNiggJndwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV0lORE9XUE9TMTYgKilQVFJfU0VHX1RPX0xJTihsUGFyYW0pICk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKworICAgIGNhc2UgV01fQVNLQ0JGT1JNQVROQU1FOgorICAgIGNhc2UgV01fQ09NUEFSRUlURU06CisgICAgY2FzZSBXTV9ERUxFVEVJVEVNOgorICAgIGNhc2UgV01fREVWTU9ERUNIQU5HRToKKyAgICBjYXNlIFdNX0RSQVdJVEVNOgorICAgIGNhc2UgV01fTURJQUNUSVZBVEU6CisgICAgY2FzZSBXTV9NRElDUkVBVEU6CisgICAgY2FzZSBXTV9NRUFTVVJFSVRFTToKKyAgICBjYXNlIFdNX1BBSU5UQ0xJUEJPQVJEOgorICAgIGNhc2UgV01fU0laRUNMSVBCT0FSRDoKKyAgICBjYXNlIFdNX1dJTklOSUNIQU5HRToKKyAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiQ2FsbFdpbmRvd1Byb2MxNlRvMzI6IG1lc3NhZ2UgJTA0eCBuZWVkcyB0cmFuc2xhdGlvblxuIiwgbXNnICk7CisKKyAgICBkZWZhdWx0OiAgLyogTm8gdHJhbnNsYXRpb24gbmVlZGVkICovCisgICAgICAgIHJldHVybiBDYWxsV25kUHJvYzMyKCBmdW5jLCBod25kLCBtc2csIChXUEFSQU0zMil3UGFyYW0sIGxQYXJhbSApOworICAgIH0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJICAgICBXSU5QUk9DX0NhbGxQcm9jMzJUbzE2CisgKgorICogQ2FsbCBhIDE2LWJpdCB3aW5kb3cgcHJvY2VkdXJlLCB0cmFuc2xhdGluZyB0aGUgMzItYml0IGFyZ3MuCisgKi8KK3N0YXRpYyBMUkVTVUxUIFdJTlBST0NfQ2FsbFByb2MzMlRvMTYoIFdORFBST0MxNiBmdW5jLCBXT1JEIGRzLCBIV05EMzIgaHduZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiBtc2csIFdQQVJBTTMyIHdQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQVJBTSBsUGFyYW0gKQoreworICAgIExSRVNVTFQgcmVzdWx0OworCisgICAgc3dpdGNoKG1zZykKKyAgICB7CisgICAgY2FzZSBXTV9BQ1RJVkFURToKKyAgICBjYXNlIFdNX0NIQVJUT0lURU06CisgICAgY2FzZSBXTV9DT01NQU5EOgorICAgIGNhc2UgV01fSFNDUk9MTDoKKyAgICBjYXNlIFdNX1ZLRVlUT0lURU06CisgICAgY2FzZSBXTV9WU0NST0xMOgorICAgICAgICByZXR1cm4gQ2FsbFduZFByb2MxNiggZnVuYywgZHMsIGh3bmQsIG1zZywgKFdQQVJBTTE2KXdQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BS0VMUEFSQU0oIChIV05EMTYpbFBhcmFtLCBISVdPUkQod1BhcmFtKSApICk7CisgICAgICAgIAorICAgIGNhc2UgV01fQ1RMQ09MT1JNU0dCT1g6CisgICAgY2FzZSBXTV9DVExDT0xPUkVESVQ6CisgICAgY2FzZSBXTV9DVExDT0xPUkxJU1RCT1g6CisgICAgY2FzZSBXTV9DVExDT0xPUkJUTjoKKyAgICBjYXNlIFdNX0NUTENPTE9SRExHOgorICAgIGNhc2UgV01fQ1RMQ09MT1JTQ1JPTExCQVI6CisgICAgY2FzZSBXTV9DVExDT0xPUlNUQVRJQzoKKyAgICAgICAgcmV0dXJuIENhbGxXbmRQcm9jMTYoIGZ1bmMsIGRzLCBod25kLCBXTV9DVExDT0xPUiwgKFdQQVJBTTE2KXdQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BS0VMUEFSQU0oIChIV05EMTYpbFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdPUkQpbXNnIC0gV01fQ1RMQ09MT1JNU0dCT1ggKSApOworICAgIGNhc2UgV01fR0VUTUlOTUFYSU5GTzoKKyAgICAgICAgeworICAgICAgICAgICAgTUlOTUFYSU5GTzE2ICptbWkgPSBTRUdQVFJfTkVXKE1JTk1BWElORk8xNik7CisgICAgICAgICAgICBpZiAoIW1taSkgcmV0dXJuIDA7CisgICAgICAgICAgICBTVFJVQ1QzMl9NSU5NQVhJTkZPMzJ0bzE2KCAoTUlOTUFYSU5GTzMyICopbFBhcmFtLCBtbWkgKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IENhbGxXbmRQcm9jMTYoIGZ1bmMsIGRzLCBod25kLCBtc2csIChXUEFSQU0xNil3UGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBBUkFNKVNFR1BUUl9HRVQobW1pKSApOworICAgICAgICAgICAgU1RSVUNUMzJfTUlOTUFYSU5GTzE2dG8zMiggbW1pLCAoTUlOTUFYSU5GTzMyICopbFBhcmFtICk7CisgICAgICAgICAgICBTRUdQVFJfRlJFRShtbWkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisKKyAgICBjYXNlIFdNX0dFVFRFWFQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIExQU1RSIHN0cjsKKyAgICAgICAgICAgIHdQYXJhbSA9IE1JTiggd1BhcmFtLCAweGZmODAgKTsgIC8qIFNpemUgbXVzdCBiZSA8IDY0SyAqLworICAgICAgICAgICAgaWYgKCEoc3RyID0gU0VHUFRSX0FMTE9DKCB3UGFyYW0gKSkpIHJldHVybiAwOworICAgICAgICAgICAgcmVzdWx0ID0gQ2FsbFduZFByb2MxNiggZnVuYywgZHMsIGh3bmQsIG1zZywgKFdQQVJBTTE2KXdQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMUEFSQU0pU0VHUFRSX0dFVChzdHIpICk7CisgICAgICAgICAgICBpZiAocmVzdWx0ID4gMCkgbWVtY3B5KCAoTFBTVFIpbFBhcmFtLCBzdHIsIHJlc3VsdCApOworICAgICAgICAgICAgU0VHUFRSX0ZSRUUoc3RyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworCisgICAgY2FzZSBXTV9NRElTRVRNRU5VOgorICAgICAgICByZXR1cm4gQ2FsbFduZFByb2MxNiggZnVuYywgZHMsIGh3bmQsIG1zZywgVFJVRSAvKiBGSVhNRT8gKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQUtFTFBBUkFNKCAoSE1FTlUxNilMT1dPUkQobFBhcmFtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChITUVOVTE2KUhJV09SRChsUGFyYW0pICkgKTsKKyAgICBjYXNlIFdNX01FTlVDSEFSOgorICAgIGNhc2UgV01fTUVOVVNFTEVDVDoKKyAgICAgICAgcmV0dXJuIENhbGxXbmRQcm9jMTYoIGZ1bmMsIGRzLCBod25kLCBtc2csIChXUEFSQU0xNilMT1dPUkQod1BhcmFtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BS0VMUEFSQU0oIEhJV09SRCh3UGFyYW0pLCAoSE1FTlUxNilsUGFyYW0gKSApOworICAgIGNhc2UgV01fTkNDQUxDU0laRToKKyAgICAgICAgeworICAgICAgICAgICAgTkNDQUxDU0laRV9QQVJBTVMzMiAqbmMzMiA9IChOQ0NBTENTSVpFX1BBUkFNUzMyICopbFBhcmFtOworICAgICAgICAgICAgTkNDQUxDU0laRV9QQVJBTVMxNiAqbmM7CisgICAgICAgICAgICBXSU5ET1dQT1MxNiAqd3AgPSBOVUxMOworCisgICAgICAgICAgICBpZiAoIShuYyA9IFNFR1BUUl9ORVcoTkNDQUxDU0laRV9QQVJBTVMxNikpKSByZXR1cm4gMDsKKyAgICAgICAgICAgIENPTlZfUkVDVDMyVE8xNiggJm5jMzItPnJncmNbMF0sICZuYy0+cmdyY1swXSApOworICAgICAgICAgICAgaWYgKHdQYXJhbSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDT05WX1JFQ1QzMlRPMTYoICZuYzMyLT5yZ3JjWzFdLCAmbmMtPnJncmNbMV0gKTsKKyAgICAgICAgICAgICAgICBDT05WX1JFQ1QzMlRPMTYoICZuYzMyLT5yZ3JjWzJdLCAmbmMtPnJncmNbMl0gKTsKKyAgICAgICAgICAgICAgICBpZiAoISh3cCA9IFNFR1BUUl9ORVcoV0lORE9XUE9TMTYpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFNFR1BUUl9GUkVFKG5jKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFNUUlVDVDMyX1dJTkRPV1BPUzMydG8xNiggbmMzMi0+bHBwb3MsIHdwICk7CisgICAgICAgICAgICAgICAgbmMtPmxwcG9zID0gU0VHUFRSX0dFVCh3cCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHQgPSBDYWxsV25kUHJvYzE2KCBmdW5jLCBkcywgaHduZCwgbXNnLCAoV1BBUkFNMTYpd1BhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQQVJBTSlTRUdQVFJfR0VUKG5jKSApOworICAgICAgICAgICAgQ09OVl9SRUNUMTZUTzMyKCAmbmMtPnJncmNbMF0sICZuYzMyLT5yZ3JjWzBdICk7CisgICAgICAgICAgICBpZiAod1BhcmFtKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENPTlZfUkVDVDE2VE8zMiggJm5jLT5yZ3JjWzFdLCAmbmMzMi0+cmdyY1sxXSApOworICAgICAgICAgICAgICAgIENPTlZfUkVDVDE2VE8zMiggJm5jLT5yZ3JjWzJdLCAmbmMzMi0+cmdyY1syXSApOworICAgICAgICAgICAgICAgIFNUUlVDVDMyX1dJTkRPV1BPUzE2dG8zMiggKFdJTkRPV1BPUzE2ICopUFRSX1NFR19UT19MSU4obmMtPmxwcG9zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jMzItPmxwcG9zICk7CisgICAgICAgICAgICAgICAgU0VHUFRSX0ZSRUUod3ApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU0VHUFRSX0ZSRUUobmMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisKKyAgICBjYXNlIFdNX05DQ1JFQVRFOgorICAgIGNhc2UgV01fQ1JFQVRFOgorICAgICAgICB7CisgICAgICAgICAgICBDUkVBVEVTVFJVQ1QxNiAqY3M7CisgICAgICAgICAgICBDUkVBVEVTVFJVQ1QzMkEgKmNzMzIgPSAoQ1JFQVRFU1RSVUNUMzJBICopbFBhcmFtOworICAgICAgICAgICAgTFBTVFIgbmFtZSwgY2xzOworCisgICAgICAgICAgICBpZiAoIShjcyA9IFNFR1BUUl9ORVcoQ1JFQVRFU1RSVUNUMTYpKSkgcmV0dXJuIDA7CisgICAgICAgICAgICBTVFJVQ1QzMl9DUkVBVEVTVFJVQ1QzMkF0bzE2KCBjczMyLCBjcyApOworICAgICAgICAgICAgbmFtZSA9IFNFR1BUUl9TVFJEVVAoIGNzMzItPmxwc3pOYW1lICk7CisgICAgICAgICAgICBjbHMgID0gU0VHUFRSX1NUUkRVUCggY3MzMi0+bHBzekNsYXNzICk7CisgICAgICAgICAgICBjcy0+bHBzek5hbWUgID0gU0VHUFRSX0dFVChuYW1lKTsKKyAgICAgICAgICAgIGNzLT5scHN6Q2xhc3MgPSBTRUdQVFJfR0VUKGNscyk7CisgICAgICAgICAgICByZXN1bHQgPSBDYWxsV25kUHJvYzE2KCBmdW5jLCBkcywgaHduZCwgbXNnLCAoV1BBUkFNMTYpd1BhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQQVJBTSlTRUdQVFJfR0VUKGNzKSApOworICAgICAgICAgICAgU1RSVUNUMzJfQ1JFQVRFU1RSVUNUMTZ0bzMyQSggY3MsIGNzMzIgKTsKKyAgICAgICAgICAgIGlmIChQVFJfU0VHX1RPX0xJTihjcy0+bHBzek5hbWUpICE9IG5hbWUpCisgICAgICAgICAgICAgICAgY3MzMi0+bHBzek5hbWUgID0gKExQQ1NUUilQVFJfU0VHX1RPX0xJTiggY3MtPmxwc3pOYW1lICk7CisgICAgICAgICAgICBpZiAoUFRSX1NFR19UT19MSU4oY3MtPmxwc3pDbGFzcykgIT0gY2xzKQorICAgICAgICAgICAgICAgIGNzMzItPmxwc3pDbGFzcyA9IChMUENTVFIpUFRSX1NFR19UT19MSU4oIGNzLT5scHN6Q2xhc3MgKTsKKyAgICAgICAgICAgIFNFR1BUUl9GUkVFKG5hbWUpOworICAgICAgICAgICAgU0VHUFRSX0ZSRUUoY2xzKTsKKyAgICAgICAgICAgIFNFR1BUUl9GUkVFKGNzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworCQorICAgIGNhc2UgV01fUEFSRU5UTk9USUZZOgorICAgICAgICBpZiAoKHdQYXJhbSA9PSBXTV9DUkVBVEUpIHx8ICh3UGFyYW0gPT0gV01fREVTVFJPWSkpCisgICAgICAgICAgICByZXR1cm4gQ2FsbFduZFByb2MxNiggZnVuYywgZHMsIGh3bmQsIG1zZywgKFdQQVJBTTE2KXdQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQUtFTFBBUkFNKCAoSFdORDE2KWxQYXJhbSwgTE9XT1JEKHdQYXJhbSkpKTsKKyAgICBjYXNlIFdNX1NFVFRFWFQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIExQU1RSIHN0ciA9IFNFR1BUUl9TVFJEVVAoIChMUFNUUilsUGFyYW0gKTsKKyAgICAgICAgICAgIGlmICghc3RyKSByZXR1cm4gMDsKKyAgICAgICAgICAgIHJlc3VsdCA9IENhbGxXbmRQcm9jMTYoIGZ1bmMsIGRzLCBod25kLCBtc2csIChXUEFSQU0xNil3UGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBBUkFNKVNFR1BUUl9HRVQoc3RyKSApOworICAgICAgICAgICAgU0VHUFRSX0ZSRUUoc3RyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworCisgICAgY2FzZSBXTV9XSU5ET1dQT1NDSEFOR0lORzoKKyAgICBjYXNlIFdNX1dJTkRPV1BPU0NIQU5HRUQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIFdJTkRPV1BPUzE2ICp3cDsKKyAgICAgICAgICAgIGlmICghKHdwID0gU0VHUFRSX05FVyhXSU5ET1dQT1MxNikpKSByZXR1cm4gMDsKKyAgICAgICAgICAgIFNUUlVDVDMyX1dJTkRPV1BPUzMydG8xNiggKFdJTkRPV1BPUzMyICopbFBhcmFtLCB3cCApOworICAgICAgICAgICAgcmVzdWx0ID0gQ2FsbFduZFByb2MxNiggZnVuYywgZHMsIGh3bmQsIG1zZywgKFdQQVJBTTE2KXdQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMUEFSQU0pU0VHUFRSX0dFVCh3cCkgKTsKKyAgICAgICAgICAgIFNUUlVDVDMyX1dJTkRPV1BPUzE2dG8zMiggd3AsIChXSU5ET1dQT1MzMiAqKWxQYXJhbSApOworICAgICAgICAgICAgU0VHUFRSX0ZSRUUod3ApOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisKKyAgICBjYXNlIFdNX0FTS0NCRk9STUFUTkFNRToKKyAgICBjYXNlIFdNX0NPTVBBUkVJVEVNOgorICAgIGNhc2UgV01fREVMRVRFSVRFTToKKyAgICBjYXNlIFdNX0RFVk1PREVDSEFOR0U6CisgICAgY2FzZSBXTV9EUkFXSVRFTToKKyAgICBjYXNlIFdNX01ESUFDVElWQVRFOgorICAgIGNhc2UgV01fTURJQ1JFQVRFOgorICAgIGNhc2UgV01fTUVBU1VSRUlURU06CisgICAgY2FzZSBXTV9QQUlOVENMSVBCT0FSRDoKKyAgICBjYXNlIFdNX1NJWkVDTElQQk9BUkQ6CisgICAgY2FzZSBXTV9XSU5JTklDSEFOR0U6CisgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIkNhbGxXaW5kb3dQcm9jMzJUbzE2OiBtZXNzYWdlICUwNHggbmVlZHMgdHJhbnNsYXRpb25cbiIsIG1zZyApOworCisgICAgZGVmYXVsdDogIC8qIE5vIHRyYW5zbGF0aW9uIG5lZWRlZCAqLworICAgICAgICByZXR1cm4gQ2FsbFduZFByb2MxNiggZnVuYywgZHMsIGh3bmQsIG1zZywgKFdQQVJBTTE2KXdQYXJhbSwgbFBhcmFtICk7CisgICAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkgICAgIENhbGxXaW5kb3dQcm9jMTYgICAgKFVTRVIuMTIyKQorICovCitMUkVTVUxUIENhbGxXaW5kb3dQcm9jMTYoIFdORFBST0MxNiBmdW5jLCBIV05EMTYgaHduZCwgVUlOVDE2IG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV1BBUkFNMTYgd1BhcmFtLCBMUEFSQU0gbFBhcmFtICkKK3sKKyAgICBGVU5DVElPTkFMSUFTICphOworCisgICAgLyogY2hlY2sgaWYgd2UgaGF2ZSBzb21ldGhpbmcgYmV0dGVyIHRoYW4gMTYgYml0IHJlbGF5cyAqLworICAgIGlmICghQUxJQVNfVXNlQWxpYXNlcyB8fCAhKGE9QUxJQVNfTG9va3VwQWxpYXMoKERXT1JEKWZ1bmMpKSB8fAorICAgICAgICAoIWEtPndpbmUgJiYgIWEtPndpbjMyKSkKKyAgICB7CisgICAgICAgIFdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKKyAgICAgICAgcmV0dXJuIENhbGxXbmRQcm9jMTYoIChGQVJQUk9DKWZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3bmRQdHIgPyB3bmRQdHItPmhJbnN0YW5jZSA6IENVUlJFTlRfRFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBod25kLCBtc2csIHdQYXJhbSwgbFBhcmFtICk7CisgICAgfQorCisgICAgaWYoYS0+d2luZSkKKyAgICAgICAgcmV0dXJuICgoTE9ORygqKShXT1JELFdPUkQsV09SRCxMT05HKSkoYS0+d2luZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGh3bmQsbXNnLHdQYXJhbSxsUGFyYW0pOworCisgICAgcmV0dXJuIFdJTlBST0NfQ2FsbFByb2MxNlRvMzIoIChXTkRQUk9DMzIpYS0+d2luMzIsIGh3bmQsIG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd1BhcmFtLCBsUGFyYW0gKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJICAgICBDYWxsV2luZG93UHJvYzMyQSAgICAoVVNFUjMyLjE3KQorICovCitMUkVTVUxUIENhbGxXaW5kb3dQcm9jMzJBKCBXTkRQUk9DMzIgZnVuYywgSFdORDMyIGh3bmQsIFVJTlQzMiBtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0gKQoreworICAgIEZVTkNUSU9OQUxJQVMgKmEgPSBOVUxMOworICAgIFdORCAqd25kUHRyOworICAgIFdPUkQgZHM7CisKKyAgICAvKiBjaGVjayBpZiB3ZSBoYXZlIHNvbWV0aGluZyBiZXR0ZXIgdGhhbiAxNiBiaXQgcmVsYXlzICovCisgICAgaWYgKEFMSUFTX1VzZUFsaWFzZXMgJiYgKGE9QUxJQVNfTG9va3VwQWxpYXMoKERXT1JEKWZ1bmMpKSAmJgorICAgICAgICAoYS0+d2luZSB8fCBhLT53aW4zMikpCisgICAgeworICAgICAgICAvKiBGSVhNRTogVW5pY29kZSAqLworICAgICAgICBpZiAoYS0+d2luZSkKKyAgICAgICAgICAgIHJldHVybiAoKFdORFBST0MzMilhLT53aW5lKShod25kLG1zZyx3UGFyYW0sbFBhcmFtKTsKKyAgICAgICAgZWxzZSByZXR1cm4gQ2FsbFduZFByb2MzMiggZnVuYywgaHduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSApOworICAgIH0KKyAgICB3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApOworICAgIGRzID0gd25kUHRyID8gd25kUHRyLT5oSW5zdGFuY2UgOiBDVVJSRU5UX0RTOworCisgICAgaWYgKCFhKQorICAgIHsKKyAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiQ2FsbFdpbmRvd1Byb2MzMkE6IG5vIGFsaWFzIGZvciAlcFxuIiwgZnVuYyApOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gV0lOUFJPQ19DYWxsUHJvYzMyVG8xNiggKFdORFBST0MxNilhLT53aW4xNiwgZHMsIGh3bmQsIG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd1BhcmFtLCBsUGFyYW0gKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJICAgICBDYWxsV2luZG93UHJvYzMyVyAgICAoVVNFUjMyLjE4KQorICovCitMUkVTVUxUIENhbGxXaW5kb3dQcm9jMzJXKCBXTkRQUk9DMzIgZnVuYywgSFdORDMyIGh3bmQsIFVJTlQzMiBtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0gKQoreworICAgIC8qIEZJWE1FOiBVbmljb2RlIHRyYW5zbGF0aW9uICovCisgICAgcmV0dXJuIENhbGxXaW5kb3dQcm9jMzJBKCBmdW5jLCBod25kLCBtc2csIHdQYXJhbSwgbFBhcmFtICk7Cit9Cg==